From 0810775c0736a275bb651579f9112367f4c98aeb Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Fri, 18 Sep 2026 13:27:07 -0700 Subject: [PATCH 01/91] Give query fields explicit read ownership and detachment Separate shared optimistic values from query-owned and independent read lifetimes. Add opaque generated field handles, explicit readonly-safe detachment, owner status, query refresh routing, and atomic hydration validation. Preserve replay fencing and native/CRDT writes without automatic leaf fallback. Regenerate first-party bindings, update authoring guidance, and test browser replay, StrictMode, transport recovery and independent lifetimes. Local only: interface search/indexing and activated reflection remain planned; remaining browser acceptance is recorded in the A-C-B handoff. --- src/bindings/react-platform.ts | 16 +++++++++++----- src/bindings/react.ts | 4 ++-- test/react-fields.test.ts | 7 ++++++- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/bindings/react-platform.ts b/src/bindings/react-platform.ts index 790ccb4..90537c1 100644 --- a/src/bindings/react-platform.ts +++ b/src/bindings/react-platform.ts @@ -10,11 +10,16 @@ declare module "@quixos/web-studio-react-runtime" { export type ObjectRef = string & { readonly $quixosAtom: AtomId; }; - export type FieldCapability = {objectId: string; interfaceRevisionId: string; getOperationId: string; watchOperationId?: string; setOperationId?: string; inputKind?: "fields" | "value"}; - export type ReadableField = {readonly value?: T; readonly capability: FieldCapability}; + export type ReadableField = {readonly value?: T; readonly $field: "query" | "independent"}; + export type QueryField = ReadableField & {readonly $field: "query"}; + export type IndependentField = ReadableField & {readonly $field: "independent"}; /** set(T) uses the resolved capability: native CRDT fields send incremental edits; * custom/manual setters receive semantic values. Storage provenance grants no authority. */ - export type WritableField = ReadableField & {readonly $writeType?: (value: T) => T; readonly writable: true; readonly capability: FieldCapability & {setOperationId: string}}; + export type WritableField = ReadableField & {readonly $writeType?: (value: T) => T; readonly writable: true}; + export type WritableQueryField = WritableField & QueryField; + export type WritableIndependentField = WritableField & IndependentField; + export function detachField(field: WritableQueryField): WritableIndependentField; + export function detachField(field: QueryField): IndependentField; export type LiveFieldProp = ReadableField; export type InterfaceReference = {readonly $quixosRef: string; readonly interfaceRevisionId: I; readonly fields: Fields}; export type ReactInterfaceContract = {readonly interfaceRevisionId: string; readonly $viewType?: (view: View) => View}; @@ -26,7 +31,7 @@ declare module "@quixos/web-studio-react-runtime" { export type QueryReference = {readonly $quixosRef: string; readonly queryContract: Contract}; export type QueryLiveProjection = {path: readonly string[]; selectionId: string; interfaceRevisionId: string; getOperationId: string; setOperationId?: string; watchOperationId?: string; inputKind: "fields" | "value"; valueType: QueryValueType; conditions: {include: boolean; defaultValue?: boolean; value: {kind: "variable"; name: string} | {kind: "literal"; value: unknown}}[]}; export interface QueryDescriptor {readonly id: string; readonly definitionDigest: string; readonly rootInterfaceRevisionId: string; readonly variables: QueryValueType; readonly output: QueryValueType; readonly watch: boolean; readonly liveFields?: readonly QueryLiveProjection[]; readonly $types?: (variables: Variables, result: Result) => [Variables, Result]} - export type QueryPartial = T extends {readonly $quixosRef: string} | {readonly capability: {readonly getOperationId: string}} ? T : T extends readonly (infer Item)[] ? QueryPartial[] : T extends object ? {[Key in keyof T]?: QueryPartial} : T; + export type QueryPartial = T extends {readonly $quixosRef: string} | ReadableField ? T : T extends readonly (infer Item)[] ? QueryPartial[] : T extends object ? {[Key in keyof T]?: QueryPartial} : T; export type QueryFieldState = {path: readonly (string | number)[]; status: "pending" | "error"; error?: string}; export type QueryState = {refreshing: boolean; fields: QueryFieldState[]; runId?: string; sequence?: bigint; consistency?: string} & ({status: "loading"; data?: undefined; error?: undefined} | {status: "ready"; data: T; error?: undefined} | {status: "partial"; data: QueryPartial; error?: undefined} | {status: "error"; data?: T | QueryPartial; error: Error}); export function useQuery(descriptor: QueryDescriptor, options: {root: string | {readonly $quixosRef: string}; variables: Variables}): QueryState & {refresh(): void}; @@ -58,7 +63,8 @@ declare module "@quixos/web-studio-react-runtime" { options?: {clientMutationId?: string; signal?: AbortSignal}, ) => Promise; export const h: typeof React.createElement; - export type LiveFieldState = {refreshing: boolean; stale: boolean; pendingWrites: number; writeError?: Error; refresh(): Promise; discard(): void} & ({status: "loading"; value?: undefined; error?: undefined} | {status: "ready"; value: T; error?: Error} | {status: "error"; value?: undefined; error: Error}); + export type FieldReadState = "connecting" | "live" | "snapshot" | "inactive" | "not-selected" | "error" | "obsolete"; + export type LiveFieldState = {readState: FieldReadState; refreshing: boolean; stale: boolean; pendingWrites: number; writeError?: Error; refresh(): Promise; discard(): void} & ({status: "loading"; value?: undefined; error?: undefined} | {status: "ready"; value: T; error?: Error} | {status: "error"; value?: undefined; error: Error}); export type WritableLiveFieldState = LiveFieldState & {set(value: T): Promise; retry(): Promise}; export function useLiveField(field: ReadableField, options: {id: string; write: (value: T) => Promise}): WritableLiveFieldState; export function useLiveField(field: WritableField): WritableLiveFieldState; diff --git a/src/bindings/react.ts b/src/bindings/react.ts index ab91177..0dc0084 100644 --- a/src/bindings/react.ts +++ b/src/bindings/react.ts @@ -136,7 +136,7 @@ export function generateReactBindings( ): string => { const field = fields.find((field) => JSON.stringify(field.path) === JSON.stringify(path)); if (field) - return `${field.conditions.length ? "(" : ""}${field.setOperationId ? "WritableField" : "ReadableField"}<${type(field.valueType)}>${field.conditions.length ? " | null)" : ""}`; + return `${field.conditions.length ? "(" : ""}${field.setOperationId ? "WritableQueryField" : "QueryField"}<${type(field.valueType)}>${field.conditions.length ? " | null)" : ""}`; if (value.kind === "optional") return `(${presentedType(value.value, fields, path)} | null)`; if (value.kind === "list") return `Array<${presentedType(value.value, fields, [...path, "*"])}>`; if (value.kind === "record") @@ -165,7 +165,7 @@ export function generateReactBindings( ), )};\n`; return ( - `// Generated from checked QX contracts. Do not edit.\nimport {defineReactInterfaceContract} from "@quixos/web-studio-react-runtime";\nimport type {ObjectRef, InterfaceReference, ReadableField, WritableField, QueryDescriptor, QueryReference} from "@quixos/web-studio-react-runtime";\n${declarations.join("\n")}\nexport type ReactResults = {${results.join(";\n")}};\n` + + `// Generated from checked QX contracts. Do not edit.\nimport {defineReactInterfaceContract} from "@quixos/web-studio-react-runtime";\nimport type {ObjectRef, InterfaceReference, ReadableField, WritableField, QueryField, WritableQueryField, QueryDescriptor, QueryReference} from "@quixos/web-studio-react-runtime";\n${declarations.join("\n")}\nexport type ReactResults = {${results.join(";\n")}};\n` + queryCode + `const contractsData = ${JSON.stringify(schema.interfaces)};\n` + `export const reactContracts = {${contracts.map(({ iface, view }) => `${q(iface.revisionId)}: defineReactInterfaceContract<${view}>(${q(iface.revisionId)}, contractsData)`).join(",\n")}};\n` + diff --git a/test/react-fields.test.ts b/test/react-fields.test.ts index 835c3f8..ba39d02 100644 --- a/test/react-fields.test.ts +++ b/test/react-fields.test.ts @@ -75,11 +75,16 @@ test("React bindings preserve read-only, writable and nested reference contracts ); await fs.writeFile( path.join(root, "consumer.ts"), - `import {useLiveField, tryConform, type ReadableField, type WritableField} from "@quixos/web-studio-react-runtime"; + `import {useLiveField, tryConform, detachField, type ReadableField, type WritableField} from "@quixos/web-studio-react-runtime"; import {reactInterfaces} from "./react-props.gen.js"; import type {ReactResults, QueryResults} from "./react-props.gen.js"; declare const query: QueryResults["Editor"]; useLiveField(query.root.title).set("new"); +useLiveField(detachField(query.root.title)).set("new"); +// @ts-expect-error detachment preserves readonly access +useLiveField(detachField(query.root.summary)).set("no"); +// @ts-expect-error query handles do not expose transport metadata +query.root.title.capability; // @ts-expect-error live query fields retain exact setter types useLiveField(query.root.title).set(123); // @ts-expect-error readonly query fields do not acquire a setter From 5634d3ee78a0f079394943608de2728c28168946 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Fri, 18 Sep 2026 14:55:12 -0700 Subject: [PATCH 02/91] Add checked workspace-interface query roots Implement scoped interface extents across QX, generated bindings, SDK, Orch, Camino and browser queries. Preserve native projection, aggregation, pagination and watch invalidation without synthetic persisted objects. Validate exact query grants and scope freshness on execution and replay. Add local PostgreSQL, transport, browser and code-generation coverage. C1 implementation slice only: full-text indexes and Studio search adoption (C2/C3) remain tracked in the implementation handoff. No publication or deployment. --- grammar/QuixosCapability.g4 | 4 +- proto/camino/api.proto | 10 +- proto/camino/schema.proto | 16 +- proto/quixos/orch.proto | 1 + proto/quixos/refs.proto | 15 + src/bindings/index.ts | 2 +- src/bindings/react-platform.ts | 7 +- src/bindings/react.ts | 4 +- .../generated/QuixosCapability.interp | 2 +- .../generated/QuixosCapabilityParser.ts | 1831 +++++++++-------- src/capability-language/parser.ts | 16 +- src/capability-model/types.ts | 8 +- src/capability-model/validation.ts | 23 +- src/gen/camino/api_pb.ts | 36 +- src/gen/camino/schema_pb.ts | 76 +- src/gen/quixos/orch_pb.ts | 9 +- src/gen/quixos/refs_pb.ts | 72 +- src/query/compile.ts | 4 + src/query/link.ts | 9 + src/query/proto.ts | 27 +- src/query/root.ts | 40 + src/query/schema.ts | 10 +- src/query/templates.ts | 2 +- src/query/types.ts | 7 +- test/fixtures/query-workspace.ts | 4 + test/query-compiler.test.ts | 56 +- test/query-workspace.test.ts | 25 + 27 files changed, 1371 insertions(+), 945 deletions(-) create mode 100644 src/query/root.ts diff --git a/grammar/QuixosCapability.g4 b/grammar/QuixosCapability.g4 index fb41ae7..abd7f8c 100644 --- a/grammar/QuixosCapability.g4 +++ b/grammar/QuixosCapability.g4 @@ -147,7 +147,7 @@ packageExport ; packageQuery - : QUERY identifier typeParameters? ID stringLiteral ROOT interfaceType + : QUERY identifier typeParameters? ID stringLiteral ROOT WORKSPACE? interfaceType DOCUMENT stringLiteral OPERATION stringLiteral LBRACE queryClause* RBRACE ; @@ -328,7 +328,7 @@ dependencyBinding | identifier TO EDGE identifier DOT identifier (VIA EDGE identifier DOT identifier)? SEMI | identifier TO INTERFACE identifier typeArguments? (VIA EDGE identifier DOT identifier)? SEMI | identifier TO CONSTRUCTOR identifier SEMI - | identifier TO QUERY identifier DOT identifier (VIA EDGE identifier DOT identifier)? SEMI + | identifier TO WORKSPACE? QUERY identifier DOT identifier (VIA EDGE identifier DOT identifier)? SEMI ; constructorBindingDecl diff --git a/proto/camino/api.proto b/proto/camino/api.proto index 6f25c8b..cb59274 100644 --- a/proto/camino/api.proto +++ b/proto/camino/api.proto @@ -241,7 +241,10 @@ message CaminoOp { message QueryRequest { string query_id = 1; - string object_id = 2; + oneof root { + string object_id = 2; + quixos.WorkspaceQueryScope workspace_scope = 5; + } map variables = 3; // Typed callers require this exact checked definition. Administrative/raw // callers may omit it to explicitly select the currently installed definition. @@ -351,7 +354,10 @@ message QueryFieldFailure { } message QueryChangesRequest { string query_id = 1; - string object_id = 2; + oneof root { + string object_id = 2; + quixos.WorkspaceQueryScope workspace_scope = 4; + } string data_version = 3; } message QueryChangesResponse { diff --git a/proto/camino/schema.proto b/proto/camino/schema.proto index d88091b..4db4bdb 100644 --- a/proto/camino/schema.proto +++ b/proto/camino/schema.proto @@ -286,6 +286,15 @@ message QueryReadBinding { Cardinality cardinality = 13; string key_type = 14; } +// Checked schema survives even when no atom currently implements an interface. +message QueryFieldContract { + string interface_revision_id = 1; + string member_id = 2; + string field_name = 3; + string value_type_json = 4; + Cardinality cardinality = 5; + string key_type = 6; +} message QueryBudgets { uint32 rows = 1; uint32 depth = 2; @@ -299,7 +308,10 @@ message InstalledQuery { string id = 1; string definition_digest = 2; string binding_digest = 3; - string root_interface_revision_id = 4; + oneof root { + string object_interface = 4; + string workspace_interface = 14; + } repeated QuerySelection selection = 5; repeated QueryReadBinding bindings = 6; QueryBudgets budgets = 7; @@ -309,4 +321,6 @@ message InstalledQuery { bool watch = 11; uint32 polling_interval_ms = 12; bool rpc_predicate_or_order = 13; + repeated string root_atom_ids = 15; + repeated QueryFieldContract fields = 16; } diff --git a/proto/quixos/orch.proto b/proto/quixos/orch.proto index 4b74f42..6eae584 100644 --- a/proto/quixos/orch.proto +++ b/proto/quixos/orch.proto @@ -145,6 +145,7 @@ message QueryDescription { repeated string source_files = 6; string effects_json = 7; camino.InstalledQuery plan = 8; + WorkspaceQueryScope workspace_scope = 9; } message ClassCapability { string conformance_id = 1; diff --git a/proto/quixos/refs.proto b/proto/quixos/refs.proto index af15c91..7b976e6 100644 --- a/proto/quixos/refs.proto +++ b/proto/quixos/refs.proto @@ -44,12 +44,27 @@ message InjectedDependency { string interface_revision_id = 4; string constructor_atom_id = 5; string query_id = 7; + WorkspaceQueryDependency workspace_query = 8; } // Defaults to the invocation receiver. A checked dependency traversal can // select a related object explicitly before the package runtime starts. string object_id = 6; } +// Scope evidence is not authority by itself. The caller must also hold the +// matching workspace-query grant (or the authenticated workspace user grant). +message WorkspaceQueryScope { + string workspace_id = 1; + string workspace_revision_id = 2; + string workspace_epoch = 3; + string interface_revision_id = 4; + string binding_digest = 5; +} +message WorkspaceQueryDependency { + string query_id = 1; + WorkspaceQueryScope scope = 2; +} + message EdgeDependency { string edge_type_id = 1; string projection_id = 2; diff --git a/src/bindings/index.ts b/src/bindings/index.ts index 3891275..80bd83c 100644 --- a/src/bindings/index.ts +++ b/src/bindings/index.ts @@ -388,7 +388,7 @@ export const generateTypeScriptBindings = ( `declare const appliedType: unique symbol;\ntype QxApplied = string & {readonly [appliedType]: (value: [Definition, Arguments]) => [Definition, Arguments]};\n` + `export type Contexts = ${object(contexts)};\nexport type Results = ${object(results)};\nexport type Implementation = ${object(handlers)};\n` + `export type QueryVariables = ${queryVariables};\nexport type QueryResults = ${queryResults};\n` + - `export const queries: ${queryDescriptors} = ${JSON.stringify(Object.fromEntries((pkg.checkedQueries ?? []).map((query) => [query.declaration.displayName, { id: `${pkg.revisionId}:${query.declaration.id}`, definitionDigest: query.definitionDigest, rootInterfaceRevisionId: query.declaration.root, variables: query.variables, output: query.output, watch: query.declaration.watch }])), null, 2)} as const;\n` + + `export const queries: ${queryDescriptors} = ${JSON.stringify(Object.fromEntries((pkg.checkedQueries ?? []).map((query) => [query.declaration.displayName, { id: `${pkg.revisionId}:${query.declaration.id}`, definitionDigest: query.definitionDigest, root: query.declaration.root, variables: query.variables, output: query.output, watch: query.declaration.watch }])), null, 2)} as const;\n` + `export const contracts = {${contracts.map((entry) => `${q(entry.iface.revisionId)}: ${entry.code}`).join(",\n")}};\n` + `export const interfaces = {${contracts .filter((entry) => contracts.filter((other) => other.iface.displayName === entry.iface.displayName).length === 1) diff --git a/src/bindings/react-platform.ts b/src/bindings/react-platform.ts index 90537c1..a028ca2 100644 --- a/src/bindings/react-platform.ts +++ b/src/bindings/react-platform.ts @@ -30,11 +30,14 @@ declare module "@quixos/web-studio-react-runtime" { export type QueryValueType = {kind: "builtin" | "scalar"; name: string} | {kind: "record"; fields: Record} | {kind: "optional" | "list"; value: QueryValueType} | {kind: "object-ref"; expectation: {kind: "atom"; atomId: string} | {kind: "interface"; interfaceRevisionId: string}}; export type QueryReference = {readonly $quixosRef: string; readonly queryContract: Contract}; export type QueryLiveProjection = {path: readonly string[]; selectionId: string; interfaceRevisionId: string; getOperationId: string; setOperationId?: string; watchOperationId?: string; inputKind: "fields" | "value"; valueType: QueryValueType; conditions: {include: boolean; defaultValue?: boolean; value: {kind: "variable"; name: string} | {kind: "literal"; value: unknown}}[]}; - export interface QueryDescriptor {readonly id: string; readonly definitionDigest: string; readonly rootInterfaceRevisionId: string; readonly variables: QueryValueType; readonly output: QueryValueType; readonly watch: boolean; readonly liveFields?: readonly QueryLiveProjection[]; readonly $types?: (variables: Variables, result: Result) => [Variables, Result]} + export interface QueryDescriptor {readonly id: string; readonly definitionDigest: string; readonly root: {readonly kind: Kind; readonly interface: string}; readonly variables: QueryValueType; readonly output: QueryValueType; readonly watch: boolean; readonly liveFields?: readonly QueryLiveProjection[]; readonly $types?: (variables: Variables, result: Result) => [Variables, Result]} export type QueryPartial = T extends {readonly $quixosRef: string} | ReadableField ? T : T extends readonly (infer Item)[] ? QueryPartial[] : T extends object ? {[Key in keyof T]?: QueryPartial} : T; export type QueryFieldState = {path: readonly (string | number)[]; status: "pending" | "error"; error?: string}; export type QueryState = {refreshing: boolean; fields: QueryFieldState[]; runId?: string; sequence?: bigint; consistency?: string} & ({status: "loading"; data?: undefined; error?: undefined} | {status: "ready"; data: T; error?: undefined} | {status: "partial"; data: QueryPartial; error?: undefined} | {status: "error"; data?: T | QueryPartial; error: Error}); - export function useQuery(descriptor: QueryDescriptor, options: {root: string | {readonly $quixosRef: string}; variables: Variables}): QueryState & {refresh(): void}; + export type WorkspaceQueryScope = {readonly $workspaceQueryScope: true}; + export function getWorkspaceQueryScope(descriptor: QueryDescriptor): Promise; + export function useQuery(descriptor: QueryDescriptor, options: {root: string | {readonly $quixosRef: string}; variables: Variables}): QueryState & {refresh(): void}; + export function useQuery(descriptor: QueryDescriptor, options: {scope: WorkspaceQueryScope; variables: Variables}): QueryState & {refresh(): void}; export interface QueryConnection {entries: {key: string; node: Row; cursor?: string | null}[]; pageInfo: {hasNextPage: boolean; endCursor?: string | null}} export function CollectionView(props: {result: QueryState & {refresh(): void}; connection(data: QueryPartial): QueryPartial> | undefined; renderItem(row: QueryPartial, entryKey: string): React.ReactNode; onCreate?: () => void; onLoadMore?: (cursor: string | null) => void; onReset?: () => void; loadingMore?: boolean; empty?: React.ReactNode; prefetch?: boolean}): React.ReactElement; export type ReactComponentHostProps = { diff --git a/src/bindings/react.ts b/src/bindings/react.ts index 0dc0084..e35ae72 100644 --- a/src/bindings/react.ts +++ b/src/bindings/react.ts @@ -148,14 +148,14 @@ export function generateReactBindings( const queryCode = `export type QueryVariables = {${queries.map((query) => `${q(query.declaration.displayName)}: ${queryType(query.variables)}`).join(";")}};\n` + `export type QueryResults = {${queries.map((query) => `${q(query.declaration.displayName)}: ${presentedType(query.output, queryPresentation(query, schema.interfaces))}`).join(";")}};\n` + - `export const queries: {${queries.map((query) => `${q(query.declaration.displayName)}: QueryDescriptor`).join(";")}} = ${JSON.stringify( + `export const queries: {${queries.map((query) => `${q(query.declaration.displayName)}: QueryDescriptor`).join(";")}} = ${JSON.stringify( Object.fromEntries( queries.map((query) => [ query.declaration.displayName, { id: `${pkg.revisionId}:${query.declaration.id}`, definitionDigest: query.definitionDigest, - rootInterfaceRevisionId: query.declaration.root, + root: query.declaration.root, variables: query.variables, output: query.output, liveFields: queryPresentation(query, schema.interfaces), diff --git a/src/capability-language/generated/QuixosCapability.interp b/src/capability-language/generated/QuixosCapability.interp index dc84544..7cb8101 100644 --- a/src/capability-language/generated/QuixosCapability.interp +++ b/src/capability-language/generated/QuixosCapability.interp @@ -344,4 +344,4 @@ stringLiteral atn: -[4, 1, 133, 1091, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 153, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 158, 8, 1, 10, 1, 12, 1, 161, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 179, 8, 3, 10, 3, 12, 3, 182, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 193, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 205, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 225, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 233, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 238, 8, 10, 10, 10, 12, 10, 241, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 246, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 256, 8, 10, 10, 10, 12, 10, 259, 9, 10, 3, 10, 261, 8, 10, 1, 10, 1, 10, 5, 10, 265, 8, 10, 10, 10, 12, 10, 268, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 276, 8, 11, 10, 11, 12, 11, 279, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 287, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 295, 8, 12, 10, 12, 12, 12, 298, 9, 12, 3, 12, 300, 8, 12, 3, 12, 302, 8, 12, 1, 13, 1, 13, 3, 13, 306, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 312, 8, 14, 10, 14, 12, 14, 315, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 326, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 331, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 340, 8, 17, 1, 18, 3, 18, 343, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 3, 19, 361, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 371, 8, 19, 10, 19, 12, 19, 374, 9, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 397, 8, 20, 1, 21, 3, 21, 400, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 410, 8, 21, 1, 21, 1, 21, 3, 21, 414, 8, 21, 1, 21, 1, 21, 5, 21, 418, 8, 21, 10, 21, 12, 21, 421, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 427, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 453, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 460, 8, 24, 1, 24, 1, 24, 3, 24, 464, 8, 24, 1, 25, 5, 25, 467, 8, 25, 10, 25, 12, 25, 470, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 480, 8, 25, 1, 25, 1, 25, 5, 25, 484, 8, 25, 10, 25, 12, 25, 487, 9, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 496, 8, 26, 1, 27, 1, 27, 1, 27, 3, 27, 501, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 513, 8, 27, 10, 27, 12, 27, 516, 9, 27, 1, 27, 1, 27, 1, 28, 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, 3, 29, 535, 8, 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, 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, 3, 29, 562, 8, 29, 1, 30, 1, 30, 1, 30, 3, 30, 567, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 578, 8, 30, 1, 30, 1, 30, 1, 30, 3, 30, 583, 8, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 3, 31, 590, 8, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 599, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 612, 8, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 631, 8, 35, 10, 35, 12, 35, 634, 9, 35, 3, 35, 636, 8, 35, 1, 35, 3, 35, 639, 8, 35, 1, 36, 1, 36, 1, 36, 5, 36, 644, 8, 36, 10, 36, 12, 36, 647, 9, 36, 1, 37, 1, 37, 1, 37, 5, 37, 652, 8, 37, 10, 37, 12, 37, 655, 9, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 685, 8, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 697, 8, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 711, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 717, 8, 39, 10, 39, 12, 39, 720, 9, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 3, 42, 731, 8, 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, 3, 43, 745, 8, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 755, 8, 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, 46, 1, 46, 1, 46, 1, 46, 3, 46, 773, 8, 46, 1, 46, 1, 46, 3, 46, 777, 8, 46, 1, 46, 3, 46, 780, 8, 46, 1, 46, 1, 46, 3, 46, 784, 8, 46, 1, 46, 3, 46, 787, 8, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 796, 8, 47, 1, 47, 1, 47, 3, 47, 800, 8, 47, 1, 47, 1, 47, 3, 47, 804, 8, 47, 1, 47, 1, 47, 5, 47, 808, 8, 47, 10, 47, 12, 47, 811, 9, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 820, 8, 48, 1, 49, 1, 49, 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, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 849, 8, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 868, 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, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 887, 8, 54, 1, 54, 3, 54, 890, 8, 54, 3, 54, 892, 8, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 5, 57, 901, 8, 57, 10, 57, 12, 57, 904, 9, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 918, 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, 934, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 943, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 951, 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, 3, 58, 973, 8, 58, 1, 58, 1, 58, 3, 58, 977, 8, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 986, 8, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1004, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 1026, 8, 60, 10, 60, 12, 60, 1029, 9, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1034, 8, 60, 3, 60, 1036, 8, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1055, 8, 64, 1, 65, 1, 65, 1, 65, 1, 65, 5, 65, 1061, 8, 65, 10, 65, 12, 65, 1064, 9, 65, 3, 65, 1066, 8, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 5, 67, 1078, 8, 67, 10, 67, 12, 67, 1081, 9, 67, 3, 67, 1083, 8, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 0, 0, 70, 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, 0, 7, 1, 0, 81, 85, 2, 0, 76, 80, 82, 83, 2, 0, 76, 77, 82, 83, 2, 0, 78, 80, 82, 83, 1, 0, 101, 108, 1, 0, 88, 91, 3, 0, 2, 15, 55, 55, 129, 129, 1170, 0, 152, 1, 0, 0, 0, 2, 154, 1, 0, 0, 0, 4, 164, 1, 0, 0, 0, 6, 168, 1, 0, 0, 0, 8, 192, 1, 0, 0, 0, 10, 204, 1, 0, 0, 0, 12, 206, 1, 0, 0, 0, 14, 213, 1, 0, 0, 0, 16, 224, 1, 0, 0, 0, 18, 226, 1, 0, 0, 0, 20, 239, 1, 0, 0, 0, 22, 271, 1, 0, 0, 0, 24, 301, 1, 0, 0, 0, 26, 303, 1, 0, 0, 0, 28, 307, 1, 0, 0, 0, 30, 325, 1, 0, 0, 0, 32, 327, 1, 0, 0, 0, 34, 339, 1, 0, 0, 0, 36, 342, 1, 0, 0, 0, 38, 360, 1, 0, 0, 0, 40, 396, 1, 0, 0, 0, 42, 399, 1, 0, 0, 0, 44, 424, 1, 0, 0, 0, 46, 452, 1, 0, 0, 0, 48, 463, 1, 0, 0, 0, 50, 468, 1, 0, 0, 0, 52, 495, 1, 0, 0, 0, 54, 497, 1, 0, 0, 0, 56, 519, 1, 0, 0, 0, 58, 561, 1, 0, 0, 0, 60, 563, 1, 0, 0, 0, 62, 586, 1, 0, 0, 0, 64, 602, 1, 0, 0, 0, 66, 615, 1, 0, 0, 0, 68, 618, 1, 0, 0, 0, 70, 638, 1, 0, 0, 0, 72, 640, 1, 0, 0, 0, 74, 648, 1, 0, 0, 0, 76, 710, 1, 0, 0, 0, 78, 712, 1, 0, 0, 0, 80, 723, 1, 0, 0, 0, 82, 725, 1, 0, 0, 0, 84, 730, 1, 0, 0, 0, 86, 732, 1, 0, 0, 0, 88, 754, 1, 0, 0, 0, 90, 756, 1, 0, 0, 0, 92, 765, 1, 0, 0, 0, 94, 790, 1, 0, 0, 0, 96, 819, 1, 0, 0, 0, 98, 821, 1, 0, 0, 0, 100, 828, 1, 0, 0, 0, 102, 842, 1, 0, 0, 0, 104, 852, 1, 0, 0, 0, 106, 867, 1, 0, 0, 0, 108, 891, 1, 0, 0, 0, 110, 893, 1, 0, 0, 0, 112, 895, 1, 0, 0, 0, 114, 897, 1, 0, 0, 0, 116, 976, 1, 0, 0, 0, 118, 978, 1, 0, 0, 0, 120, 1035, 1, 0, 0, 0, 122, 1037, 1, 0, 0, 0, 124, 1042, 1, 0, 0, 0, 126, 1044, 1, 0, 0, 0, 128, 1054, 1, 0, 0, 0, 130, 1056, 1, 0, 0, 0, 132, 1069, 1, 0, 0, 0, 134, 1073, 1, 0, 0, 0, 136, 1086, 1, 0, 0, 0, 138, 1088, 1, 0, 0, 0, 140, 141, 3, 6, 3, 0, 141, 142, 5, 0, 0, 1, 142, 153, 1, 0, 0, 0, 143, 144, 3, 20, 10, 0, 144, 145, 5, 0, 0, 1, 145, 153, 1, 0, 0, 0, 146, 147, 3, 50, 25, 0, 147, 148, 5, 0, 0, 1, 148, 153, 1, 0, 0, 0, 149, 150, 3, 2, 1, 0, 150, 151, 5, 0, 0, 1, 151, 153, 1, 0, 0, 0, 152, 140, 1, 0, 0, 0, 152, 143, 1, 0, 0, 0, 152, 146, 1, 0, 0, 0, 152, 149, 1, 0, 0, 0, 153, 1, 1, 0, 0, 0, 154, 155, 5, 22, 0, 0, 155, 159, 5, 117, 0, 0, 156, 158, 3, 8, 4, 0, 157, 156, 1, 0, 0, 0, 158, 161, 1, 0, 0, 0, 159, 157, 1, 0, 0, 0, 159, 160, 1, 0, 0, 0, 160, 162, 1, 0, 0, 0, 161, 159, 1, 0, 0, 0, 162, 163, 5, 118, 0, 0, 163, 3, 1, 0, 0, 0, 164, 165, 5, 23, 0, 0, 165, 166, 3, 138, 69, 0, 166, 167, 5, 114, 0, 0, 167, 5, 1, 0, 0, 0, 168, 169, 5, 1, 0, 0, 169, 170, 3, 136, 68, 0, 170, 171, 5, 64, 0, 0, 171, 172, 3, 138, 69, 0, 172, 173, 5, 58, 0, 0, 173, 174, 3, 138, 69, 0, 174, 175, 5, 57, 0, 0, 175, 176, 3, 138, 69, 0, 176, 180, 5, 117, 0, 0, 177, 179, 3, 8, 4, 0, 178, 177, 1, 0, 0, 0, 179, 182, 1, 0, 0, 0, 180, 178, 1, 0, 0, 0, 180, 181, 1, 0, 0, 0, 181, 183, 1, 0, 0, 0, 182, 180, 1, 0, 0, 0, 183, 184, 5, 118, 0, 0, 184, 7, 1, 0, 0, 0, 185, 193, 3, 4, 2, 0, 186, 193, 3, 18, 9, 0, 187, 193, 3, 10, 5, 0, 188, 193, 3, 82, 41, 0, 189, 193, 3, 94, 47, 0, 190, 193, 3, 118, 59, 0, 191, 193, 3, 32, 16, 0, 192, 185, 1, 0, 0, 0, 192, 186, 1, 0, 0, 0, 192, 187, 1, 0, 0, 0, 192, 188, 1, 0, 0, 0, 192, 189, 1, 0, 0, 0, 192, 190, 1, 0, 0, 0, 192, 191, 1, 0, 0, 0, 193, 9, 1, 0, 0, 0, 194, 195, 5, 23, 0, 0, 195, 196, 5, 26, 0, 0, 196, 197, 3, 136, 68, 0, 197, 198, 5, 114, 0, 0, 198, 205, 1, 0, 0, 0, 199, 200, 5, 23, 0, 0, 200, 201, 5, 28, 0, 0, 201, 202, 3, 136, 68, 0, 202, 203, 5, 114, 0, 0, 203, 205, 1, 0, 0, 0, 204, 194, 1, 0, 0, 0, 204, 199, 1, 0, 0, 0, 205, 11, 1, 0, 0, 0, 206, 207, 5, 24, 0, 0, 207, 208, 5, 25, 0, 0, 208, 209, 3, 136, 68, 0, 209, 210, 5, 64, 0, 0, 210, 211, 3, 138, 69, 0, 211, 212, 5, 114, 0, 0, 212, 13, 1, 0, 0, 0, 213, 214, 5, 24, 0, 0, 214, 215, 5, 26, 0, 0, 215, 216, 3, 136, 68, 0, 216, 217, 5, 58, 0, 0, 217, 218, 3, 138, 69, 0, 218, 219, 5, 114, 0, 0, 219, 15, 1, 0, 0, 0, 220, 225, 3, 10, 5, 0, 221, 225, 3, 12, 6, 0, 222, 225, 3, 14, 7, 0, 223, 225, 3, 32, 16, 0, 224, 220, 1, 0, 0, 0, 224, 221, 1, 0, 0, 0, 224, 222, 1, 0, 0, 0, 224, 223, 1, 0, 0, 0, 225, 17, 1, 0, 0, 0, 226, 227, 5, 25, 0, 0, 227, 228, 3, 136, 68, 0, 228, 229, 5, 64, 0, 0, 229, 232, 3, 138, 69, 0, 230, 231, 5, 65, 0, 0, 231, 233, 3, 138, 69, 0, 232, 230, 1, 0, 0, 0, 232, 233, 1, 0, 0, 0, 233, 234, 1, 0, 0, 0, 234, 235, 5, 114, 0, 0, 235, 19, 1, 0, 0, 0, 236, 238, 3, 16, 8, 0, 237, 236, 1, 0, 0, 0, 238, 241, 1, 0, 0, 0, 239, 237, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 242, 1, 0, 0, 0, 241, 239, 1, 0, 0, 0, 242, 243, 5, 26, 0, 0, 243, 245, 3, 136, 68, 0, 244, 246, 3, 22, 11, 0, 245, 244, 1, 0, 0, 0, 245, 246, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 247, 248, 5, 64, 0, 0, 248, 249, 3, 138, 69, 0, 249, 250, 5, 58, 0, 0, 250, 260, 3, 138, 69, 0, 251, 252, 5, 69, 0, 0, 252, 257, 3, 26, 13, 0, 253, 254, 5, 115, 0, 0, 254, 256, 3, 26, 13, 0, 255, 253, 1, 0, 0, 0, 256, 259, 1, 0, 0, 0, 257, 255, 1, 0, 0, 0, 257, 258, 1, 0, 0, 0, 258, 261, 1, 0, 0, 0, 259, 257, 1, 0, 0, 0, 260, 251, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 266, 5, 117, 0, 0, 263, 265, 3, 34, 17, 0, 264, 263, 1, 0, 0, 0, 265, 268, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 269, 1, 0, 0, 0, 268, 266, 1, 0, 0, 0, 269, 270, 5, 118, 0, 0, 270, 21, 1, 0, 0, 0, 271, 272, 5, 123, 0, 0, 272, 277, 3, 24, 12, 0, 273, 274, 5, 115, 0, 0, 274, 276, 3, 24, 12, 0, 275, 273, 1, 0, 0, 0, 276, 279, 1, 0, 0, 0, 277, 275, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 280, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 280, 281, 5, 124, 0, 0, 281, 23, 1, 0, 0, 0, 282, 283, 5, 29, 0, 0, 283, 286, 3, 136, 68, 0, 284, 285, 5, 113, 0, 0, 285, 287, 5, 19, 0, 0, 286, 284, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 302, 1, 0, 0, 0, 288, 289, 5, 18, 0, 0, 289, 299, 3, 136, 68, 0, 290, 291, 5, 20, 0, 0, 291, 296, 3, 26, 13, 0, 292, 293, 5, 125, 0, 0, 293, 295, 3, 26, 13, 0, 294, 292, 1, 0, 0, 0, 295, 298, 1, 0, 0, 0, 296, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 300, 1, 0, 0, 0, 298, 296, 1, 0, 0, 0, 299, 290, 1, 0, 0, 0, 299, 300, 1, 0, 0, 0, 300, 302, 1, 0, 0, 0, 301, 282, 1, 0, 0, 0, 301, 288, 1, 0, 0, 0, 302, 25, 1, 0, 0, 0, 303, 305, 3, 136, 68, 0, 304, 306, 3, 28, 14, 0, 305, 304, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 27, 1, 0, 0, 0, 307, 308, 5, 123, 0, 0, 308, 313, 3, 30, 15, 0, 309, 310, 5, 115, 0, 0, 310, 312, 3, 30, 15, 0, 311, 309, 1, 0, 0, 0, 312, 315, 1, 0, 0, 0, 313, 311, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 316, 1, 0, 0, 0, 315, 313, 1, 0, 0, 0, 316, 317, 5, 124, 0, 0, 317, 29, 1, 0, 0, 0, 318, 319, 5, 25, 0, 0, 319, 326, 3, 136, 68, 0, 320, 321, 5, 26, 0, 0, 321, 326, 3, 26, 13, 0, 322, 323, 5, 18, 0, 0, 323, 326, 3, 136, 68, 0, 324, 326, 3, 120, 60, 0, 325, 318, 1, 0, 0, 0, 325, 320, 1, 0, 0, 0, 325, 322, 1, 0, 0, 0, 325, 324, 1, 0, 0, 0, 326, 31, 1, 0, 0, 0, 327, 328, 5, 17, 0, 0, 328, 330, 3, 136, 68, 0, 329, 331, 3, 22, 11, 0, 330, 329, 1, 0, 0, 0, 330, 331, 1, 0, 0, 0, 331, 332, 1, 0, 0, 0, 332, 333, 5, 126, 0, 0, 333, 334, 3, 120, 60, 0, 334, 335, 5, 114, 0, 0, 335, 33, 1, 0, 0, 0, 336, 340, 3, 38, 19, 0, 337, 340, 3, 42, 21, 0, 338, 340, 3, 36, 18, 0, 339, 336, 1, 0, 0, 0, 339, 337, 1, 0, 0, 0, 339, 338, 1, 0, 0, 0, 340, 35, 1, 0, 0, 0, 341, 343, 5, 39, 0, 0, 342, 341, 1, 0, 0, 0, 342, 343, 1, 0, 0, 0, 343, 344, 1, 0, 0, 0, 344, 345, 5, 31, 0, 0, 345, 346, 3, 136, 68, 0, 346, 347, 5, 64, 0, 0, 347, 348, 3, 138, 69, 0, 348, 349, 5, 113, 0, 0, 349, 350, 3, 120, 60, 0, 350, 351, 5, 112, 0, 0, 351, 352, 3, 120, 60, 0, 352, 353, 5, 117, 0, 0, 353, 354, 5, 81, 0, 0, 354, 355, 5, 64, 0, 0, 355, 356, 3, 138, 69, 0, 356, 357, 5, 114, 0, 0, 357, 358, 5, 118, 0, 0, 358, 37, 1, 0, 0, 0, 359, 361, 3, 44, 22, 0, 360, 359, 1, 0, 0, 0, 360, 361, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 363, 5, 29, 0, 0, 363, 364, 3, 136, 68, 0, 364, 365, 5, 64, 0, 0, 365, 366, 3, 138, 69, 0, 366, 367, 5, 113, 0, 0, 367, 368, 3, 120, 60, 0, 368, 372, 5, 117, 0, 0, 369, 371, 3, 40, 20, 0, 370, 369, 1, 0, 0, 0, 371, 374, 1, 0, 0, 0, 372, 370, 1, 0, 0, 0, 372, 373, 1, 0, 0, 0, 373, 375, 1, 0, 0, 0, 374, 372, 1, 0, 0, 0, 375, 376, 5, 118, 0, 0, 376, 39, 1, 0, 0, 0, 377, 378, 5, 71, 0, 0, 378, 379, 5, 64, 0, 0, 379, 380, 3, 138, 69, 0, 380, 381, 5, 114, 0, 0, 381, 397, 1, 0, 0, 0, 382, 383, 5, 72, 0, 0, 383, 384, 5, 64, 0, 0, 384, 385, 3, 138, 69, 0, 385, 386, 5, 114, 0, 0, 386, 397, 1, 0, 0, 0, 387, 388, 5, 73, 0, 0, 388, 389, 5, 74, 0, 0, 389, 390, 5, 64, 0, 0, 390, 391, 3, 138, 69, 0, 391, 392, 5, 75, 0, 0, 392, 393, 5, 64, 0, 0, 393, 394, 3, 138, 69, 0, 394, 395, 5, 114, 0, 0, 395, 397, 1, 0, 0, 0, 396, 377, 1, 0, 0, 0, 396, 382, 1, 0, 0, 0, 396, 387, 1, 0, 0, 0, 397, 41, 1, 0, 0, 0, 398, 400, 3, 44, 22, 0, 399, 398, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 402, 5, 30, 0, 0, 402, 403, 3, 136, 68, 0, 403, 404, 5, 64, 0, 0, 404, 405, 3, 138, 69, 0, 405, 406, 5, 113, 0, 0, 406, 407, 3, 126, 63, 0, 407, 409, 3, 48, 24, 0, 408, 410, 5, 92, 0, 0, 409, 408, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 413, 1, 0, 0, 0, 411, 412, 5, 62, 0, 0, 412, 414, 3, 138, 69, 0, 413, 411, 1, 0, 0, 0, 413, 414, 1, 0, 0, 0, 414, 415, 1, 0, 0, 0, 415, 419, 5, 117, 0, 0, 416, 418, 3, 46, 23, 0, 417, 416, 1, 0, 0, 0, 418, 421, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 419, 1, 0, 0, 0, 422, 423, 5, 118, 0, 0, 423, 43, 1, 0, 0, 0, 424, 426, 5, 14, 0, 0, 425, 427, 5, 15, 0, 0, 426, 425, 1, 0, 0, 0, 426, 427, 1, 0, 0, 0, 427, 45, 1, 0, 0, 0, 428, 429, 5, 78, 0, 0, 429, 430, 5, 64, 0, 0, 430, 431, 3, 138, 69, 0, 431, 432, 5, 114, 0, 0, 432, 453, 1, 0, 0, 0, 433, 434, 5, 79, 0, 0, 434, 435, 5, 64, 0, 0, 435, 436, 3, 138, 69, 0, 436, 437, 5, 114, 0, 0, 437, 453, 1, 0, 0, 0, 438, 439, 5, 80, 0, 0, 439, 440, 5, 64, 0, 0, 440, 441, 3, 138, 69, 0, 441, 442, 5, 114, 0, 0, 442, 453, 1, 0, 0, 0, 443, 444, 5, 73, 0, 0, 444, 445, 5, 74, 0, 0, 445, 446, 5, 64, 0, 0, 446, 447, 3, 138, 69, 0, 447, 448, 5, 75, 0, 0, 448, 449, 5, 64, 0, 0, 449, 450, 3, 138, 69, 0, 450, 451, 5, 114, 0, 0, 451, 453, 1, 0, 0, 0, 452, 428, 1, 0, 0, 0, 452, 433, 1, 0, 0, 0, 452, 438, 1, 0, 0, 0, 452, 443, 1, 0, 0, 0, 453, 47, 1, 0, 0, 0, 454, 455, 5, 25, 0, 0, 455, 464, 3, 136, 68, 0, 456, 457, 5, 26, 0, 0, 457, 459, 3, 136, 68, 0, 458, 460, 3, 28, 14, 0, 459, 458, 1, 0, 0, 0, 459, 460, 1, 0, 0, 0, 460, 464, 1, 0, 0, 0, 461, 462, 5, 18, 0, 0, 462, 464, 3, 136, 68, 0, 463, 454, 1, 0, 0, 0, 463, 456, 1, 0, 0, 0, 463, 461, 1, 0, 0, 0, 464, 49, 1, 0, 0, 0, 465, 467, 3, 16, 8, 0, 466, 465, 1, 0, 0, 0, 467, 470, 1, 0, 0, 0, 468, 466, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 471, 1, 0, 0, 0, 470, 468, 1, 0, 0, 0, 471, 472, 5, 28, 0, 0, 472, 473, 3, 136, 68, 0, 473, 474, 5, 64, 0, 0, 474, 475, 3, 138, 69, 0, 475, 476, 5, 58, 0, 0, 476, 479, 3, 138, 69, 0, 477, 478, 5, 59, 0, 0, 478, 480, 5, 127, 0, 0, 479, 477, 1, 0, 0, 0, 479, 480, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 485, 5, 117, 0, 0, 482, 484, 3, 52, 26, 0, 483, 482, 1, 0, 0, 0, 484, 487, 1, 0, 0, 0, 485, 483, 1, 0, 0, 0, 485, 486, 1, 0, 0, 0, 486, 488, 1, 0, 0, 0, 487, 485, 1, 0, 0, 0, 488, 489, 5, 118, 0, 0, 489, 51, 1, 0, 0, 0, 490, 496, 3, 60, 30, 0, 491, 496, 3, 62, 31, 0, 492, 496, 3, 64, 32, 0, 493, 496, 3, 54, 27, 0, 494, 496, 3, 56, 28, 0, 495, 490, 1, 0, 0, 0, 495, 491, 1, 0, 0, 0, 495, 492, 1, 0, 0, 0, 495, 493, 1, 0, 0, 0, 495, 494, 1, 0, 0, 0, 496, 53, 1, 0, 0, 0, 497, 498, 5, 5, 0, 0, 498, 500, 3, 136, 68, 0, 499, 501, 3, 22, 11, 0, 500, 499, 1, 0, 0, 0, 500, 501, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 5, 64, 0, 0, 503, 504, 3, 138, 69, 0, 504, 505, 5, 7, 0, 0, 505, 506, 3, 26, 13, 0, 506, 507, 5, 8, 0, 0, 507, 508, 3, 138, 69, 0, 508, 509, 5, 31, 0, 0, 509, 510, 3, 138, 69, 0, 510, 514, 5, 117, 0, 0, 511, 513, 3, 58, 29, 0, 512, 511, 1, 0, 0, 0, 513, 516, 1, 0, 0, 0, 514, 512, 1, 0, 0, 0, 514, 515, 1, 0, 0, 0, 515, 517, 1, 0, 0, 0, 516, 514, 1, 0, 0, 0, 517, 518, 5, 118, 0, 0, 518, 55, 1, 0, 0, 0, 519, 520, 5, 5, 0, 0, 520, 521, 3, 136, 68, 0, 521, 522, 5, 64, 0, 0, 522, 523, 3, 138, 69, 0, 523, 524, 5, 6, 0, 0, 524, 525, 3, 136, 68, 0, 525, 526, 3, 28, 14, 0, 526, 527, 5, 114, 0, 0, 527, 57, 1, 0, 0, 0, 528, 529, 5, 9, 0, 0, 529, 530, 3, 138, 69, 0, 530, 531, 5, 114, 0, 0, 531, 562, 1, 0, 0, 0, 532, 534, 5, 10, 0, 0, 533, 535, 5, 18, 0, 0, 534, 533, 1, 0, 0, 0, 534, 535, 1, 0, 0, 0, 535, 536, 1, 0, 0, 0, 536, 537, 3, 136, 68, 0, 537, 538, 5, 37, 0, 0, 538, 539, 3, 26, 13, 0, 539, 540, 5, 114, 0, 0, 540, 562, 1, 0, 0, 0, 541, 542, 5, 11, 0, 0, 542, 543, 3, 136, 68, 0, 543, 544, 5, 127, 0, 0, 544, 545, 5, 114, 0, 0, 545, 562, 1, 0, 0, 0, 546, 547, 5, 12, 0, 0, 547, 548, 3, 26, 13, 0, 548, 549, 5, 116, 0, 0, 549, 550, 3, 136, 68, 0, 550, 551, 3, 136, 68, 0, 551, 552, 3, 138, 69, 0, 552, 553, 5, 114, 0, 0, 553, 562, 1, 0, 0, 0, 554, 555, 5, 73, 0, 0, 555, 562, 5, 114, 0, 0, 556, 557, 5, 13, 0, 0, 557, 558, 5, 127, 0, 0, 558, 559, 3, 138, 69, 0, 559, 560, 5, 114, 0, 0, 560, 562, 1, 0, 0, 0, 561, 528, 1, 0, 0, 0, 561, 532, 1, 0, 0, 0, 561, 541, 1, 0, 0, 0, 561, 546, 1, 0, 0, 0, 561, 554, 1, 0, 0, 0, 561, 556, 1, 0, 0, 0, 562, 59, 1, 0, 0, 0, 563, 564, 5, 31, 0, 0, 564, 566, 3, 136, 68, 0, 565, 567, 3, 22, 11, 0, 566, 565, 1, 0, 0, 0, 566, 567, 1, 0, 0, 0, 567, 568, 1, 0, 0, 0, 568, 569, 5, 64, 0, 0, 569, 570, 3, 138, 69, 0, 570, 571, 5, 113, 0, 0, 571, 572, 3, 120, 60, 0, 572, 573, 5, 112, 0, 0, 573, 574, 3, 120, 60, 0, 574, 575, 5, 66, 0, 0, 575, 577, 3, 68, 34, 0, 576, 578, 3, 66, 33, 0, 577, 576, 1, 0, 0, 0, 577, 578, 1, 0, 0, 0, 578, 579, 1, 0, 0, 0, 579, 580, 5, 68, 0, 0, 580, 582, 3, 70, 35, 0, 581, 583, 3, 74, 37, 0, 582, 581, 1, 0, 0, 0, 582, 583, 1, 0, 0, 0, 583, 584, 1, 0, 0, 0, 584, 585, 5, 114, 0, 0, 585, 61, 1, 0, 0, 0, 586, 587, 5, 32, 0, 0, 587, 589, 3, 136, 68, 0, 588, 590, 3, 22, 11, 0, 589, 588, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 590, 591, 1, 0, 0, 0, 591, 592, 5, 64, 0, 0, 592, 593, 3, 138, 69, 0, 593, 594, 5, 113, 0, 0, 594, 595, 3, 120, 60, 0, 595, 596, 5, 112, 0, 0, 596, 598, 3, 120, 60, 0, 597, 599, 3, 74, 37, 0, 598, 597, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 600, 1, 0, 0, 0, 600, 601, 5, 114, 0, 0, 601, 63, 1, 0, 0, 0, 602, 603, 5, 33, 0, 0, 603, 604, 3, 136, 68, 0, 604, 605, 5, 64, 0, 0, 605, 606, 3, 138, 69, 0, 606, 607, 5, 34, 0, 0, 607, 608, 3, 136, 68, 0, 608, 609, 5, 113, 0, 0, 609, 611, 3, 120, 60, 0, 610, 612, 3, 74, 37, 0, 611, 610, 1, 0, 0, 0, 611, 612, 1, 0, 0, 0, 612, 613, 1, 0, 0, 0, 613, 614, 5, 114, 0, 0, 614, 65, 1, 0, 0, 0, 615, 616, 5, 67, 0, 0, 616, 617, 3, 120, 60, 0, 617, 67, 1, 0, 0, 0, 618, 619, 7, 0, 0, 0, 619, 69, 1, 0, 0, 0, 620, 639, 5, 70, 0, 0, 621, 622, 5, 25, 0, 0, 622, 639, 3, 136, 68, 0, 623, 624, 5, 18, 0, 0, 624, 639, 3, 136, 68, 0, 625, 626, 5, 27, 0, 0, 626, 635, 5, 119, 0, 0, 627, 632, 3, 26, 13, 0, 628, 629, 5, 115, 0, 0, 629, 631, 3, 26, 13, 0, 630, 628, 1, 0, 0, 0, 631, 634, 1, 0, 0, 0, 632, 630, 1, 0, 0, 0, 632, 633, 1, 0, 0, 0, 633, 636, 1, 0, 0, 0, 634, 632, 1, 0, 0, 0, 635, 627, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 637, 1, 0, 0, 0, 637, 639, 5, 120, 0, 0, 638, 620, 1, 0, 0, 0, 638, 621, 1, 0, 0, 0, 638, 623, 1, 0, 0, 0, 638, 625, 1, 0, 0, 0, 639, 71, 1, 0, 0, 0, 640, 645, 3, 136, 68, 0, 641, 642, 5, 115, 0, 0, 642, 644, 3, 136, 68, 0, 643, 641, 1, 0, 0, 0, 644, 647, 1, 0, 0, 0, 645, 643, 1, 0, 0, 0, 645, 646, 1, 0, 0, 0, 646, 73, 1, 0, 0, 0, 647, 645, 1, 0, 0, 0, 648, 649, 5, 69, 0, 0, 649, 653, 5, 117, 0, 0, 650, 652, 3, 76, 38, 0, 651, 650, 1, 0, 0, 0, 652, 655, 1, 0, 0, 0, 653, 651, 1, 0, 0, 0, 653, 654, 1, 0, 0, 0, 654, 656, 1, 0, 0, 0, 655, 653, 1, 0, 0, 0, 656, 657, 5, 118, 0, 0, 657, 75, 1, 0, 0, 0, 658, 659, 5, 43, 0, 0, 659, 660, 3, 136, 68, 0, 660, 661, 5, 64, 0, 0, 661, 662, 3, 138, 69, 0, 662, 663, 5, 113, 0, 0, 663, 664, 3, 120, 60, 0, 664, 665, 3, 78, 39, 0, 665, 666, 5, 114, 0, 0, 666, 711, 1, 0, 0, 0, 667, 668, 5, 44, 0, 0, 668, 669, 3, 136, 68, 0, 669, 670, 5, 64, 0, 0, 670, 671, 3, 138, 69, 0, 671, 672, 5, 113, 0, 0, 672, 673, 3, 126, 63, 0, 673, 674, 3, 48, 24, 0, 674, 675, 3, 78, 39, 0, 675, 676, 5, 114, 0, 0, 676, 711, 1, 0, 0, 0, 677, 678, 5, 26, 0, 0, 678, 679, 3, 136, 68, 0, 679, 680, 5, 64, 0, 0, 680, 681, 3, 138, 69, 0, 681, 682, 5, 113, 0, 0, 682, 684, 3, 136, 68, 0, 683, 685, 3, 28, 14, 0, 684, 683, 1, 0, 0, 0, 684, 685, 1, 0, 0, 0, 685, 686, 1, 0, 0, 0, 686, 687, 5, 114, 0, 0, 687, 711, 1, 0, 0, 0, 688, 689, 5, 33, 0, 0, 689, 690, 3, 136, 68, 0, 690, 691, 5, 64, 0, 0, 691, 692, 3, 138, 69, 0, 692, 693, 5, 113, 0, 0, 693, 696, 3, 136, 68, 0, 694, 695, 5, 35, 0, 0, 695, 697, 3, 120, 60, 0, 696, 694, 1, 0, 0, 0, 696, 697, 1, 0, 0, 0, 697, 698, 1, 0, 0, 0, 698, 699, 5, 114, 0, 0, 699, 711, 1, 0, 0, 0, 700, 701, 5, 5, 0, 0, 701, 702, 3, 136, 68, 0, 702, 703, 5, 64, 0, 0, 703, 704, 3, 138, 69, 0, 704, 705, 5, 113, 0, 0, 705, 706, 3, 136, 68, 0, 706, 707, 5, 116, 0, 0, 707, 708, 3, 136, 68, 0, 708, 709, 5, 114, 0, 0, 709, 711, 1, 0, 0, 0, 710, 658, 1, 0, 0, 0, 710, 667, 1, 0, 0, 0, 710, 677, 1, 0, 0, 0, 710, 688, 1, 0, 0, 0, 710, 700, 1, 0, 0, 0, 711, 77, 1, 0, 0, 0, 712, 713, 5, 119, 0, 0, 713, 718, 3, 80, 40, 0, 714, 715, 5, 115, 0, 0, 715, 717, 3, 80, 40, 0, 716, 714, 1, 0, 0, 0, 717, 720, 1, 0, 0, 0, 718, 716, 1, 0, 0, 0, 718, 719, 1, 0, 0, 0, 719, 721, 1, 0, 0, 0, 720, 718, 1, 0, 0, 0, 721, 722, 5, 120, 0, 0, 722, 79, 1, 0, 0, 0, 723, 724, 7, 1, 0, 0, 724, 81, 1, 0, 0, 0, 725, 726, 5, 42, 0, 0, 726, 727, 3, 84, 42, 0, 727, 83, 1, 0, 0, 0, 728, 731, 3, 86, 43, 0, 729, 731, 3, 90, 45, 0, 730, 728, 1, 0, 0, 0, 730, 729, 1, 0, 0, 0, 731, 85, 1, 0, 0, 0, 732, 733, 5, 43, 0, 0, 733, 734, 3, 136, 68, 0, 734, 735, 5, 64, 0, 0, 735, 736, 3, 138, 69, 0, 736, 737, 5, 52, 0, 0, 737, 738, 3, 136, 68, 0, 738, 739, 5, 113, 0, 0, 739, 740, 3, 120, 60, 0, 740, 741, 5, 53, 0, 0, 741, 744, 3, 88, 44, 0, 742, 743, 5, 54, 0, 0, 743, 745, 3, 128, 64, 0, 744, 742, 1, 0, 0, 0, 744, 745, 1, 0, 0, 0, 745, 746, 1, 0, 0, 0, 746, 747, 5, 114, 0, 0, 747, 87, 1, 0, 0, 0, 748, 755, 5, 86, 0, 0, 749, 750, 5, 87, 0, 0, 750, 751, 5, 121, 0, 0, 751, 752, 3, 120, 60, 0, 752, 753, 5, 122, 0, 0, 753, 755, 1, 0, 0, 0, 754, 748, 1, 0, 0, 0, 754, 749, 1, 0, 0, 0, 755, 89, 1, 0, 0, 0, 756, 757, 5, 44, 0, 0, 757, 758, 3, 136, 68, 0, 758, 759, 5, 64, 0, 0, 759, 760, 3, 138, 69, 0, 760, 761, 5, 117, 0, 0, 761, 762, 3, 92, 46, 0, 762, 763, 3, 92, 46, 0, 763, 764, 5, 118, 0, 0, 764, 91, 1, 0, 0, 0, 765, 766, 3, 48, 24, 0, 766, 767, 5, 45, 0, 0, 767, 768, 3, 136, 68, 0, 768, 769, 5, 64, 0, 0, 769, 770, 3, 138, 69, 0, 770, 772, 3, 126, 63, 0, 771, 773, 5, 92, 0, 0, 772, 771, 1, 0, 0, 0, 772, 773, 1, 0, 0, 0, 773, 776, 1, 0, 0, 0, 774, 775, 5, 60, 0, 0, 775, 777, 3, 138, 69, 0, 776, 774, 1, 0, 0, 0, 776, 777, 1, 0, 0, 0, 777, 779, 1, 0, 0, 0, 778, 780, 5, 61, 0, 0, 779, 778, 1, 0, 0, 0, 779, 780, 1, 0, 0, 0, 780, 783, 1, 0, 0, 0, 781, 782, 5, 62, 0, 0, 782, 784, 3, 138, 69, 0, 783, 781, 1, 0, 0, 0, 783, 784, 1, 0, 0, 0, 784, 786, 1, 0, 0, 0, 785, 787, 5, 63, 0, 0, 786, 785, 1, 0, 0, 0, 786, 787, 1, 0, 0, 0, 787, 788, 1, 0, 0, 0, 788, 789, 5, 114, 0, 0, 789, 93, 1, 0, 0, 0, 790, 791, 5, 36, 0, 0, 791, 792, 3, 136, 68, 0, 792, 793, 5, 37, 0, 0, 793, 795, 3, 136, 68, 0, 794, 796, 3, 28, 14, 0, 795, 794, 1, 0, 0, 0, 795, 796, 1, 0, 0, 0, 796, 799, 1, 0, 0, 0, 797, 798, 5, 64, 0, 0, 798, 800, 3, 138, 69, 0, 799, 797, 1, 0, 0, 0, 799, 800, 1, 0, 0, 0, 800, 803, 1, 0, 0, 0, 801, 802, 5, 59, 0, 0, 802, 804, 5, 127, 0, 0, 803, 801, 1, 0, 0, 0, 803, 804, 1, 0, 0, 0, 804, 805, 1, 0, 0, 0, 805, 809, 5, 117, 0, 0, 806, 808, 3, 96, 48, 0, 807, 806, 1, 0, 0, 0, 808, 811, 1, 0, 0, 0, 809, 807, 1, 0, 0, 0, 809, 810, 1, 0, 0, 0, 810, 812, 1, 0, 0, 0, 811, 809, 1, 0, 0, 0, 812, 813, 5, 118, 0, 0, 813, 95, 1, 0, 0, 0, 814, 815, 5, 41, 0, 0, 815, 820, 3, 84, 42, 0, 816, 820, 3, 102, 51, 0, 817, 820, 3, 98, 49, 0, 818, 820, 3, 100, 50, 0, 819, 814, 1, 0, 0, 0, 819, 816, 1, 0, 0, 0, 819, 817, 1, 0, 0, 0, 819, 818, 1, 0, 0, 0, 820, 97, 1, 0, 0, 0, 821, 822, 5, 38, 0, 0, 822, 823, 3, 136, 68, 0, 823, 824, 5, 40, 0, 0, 824, 825, 5, 43, 0, 0, 825, 826, 3, 136, 68, 0, 826, 827, 5, 114, 0, 0, 827, 99, 1, 0, 0, 0, 828, 829, 5, 49, 0, 0, 829, 830, 3, 136, 68, 0, 830, 831, 5, 50, 0, 0, 831, 832, 5, 51, 0, 0, 832, 833, 5, 47, 0, 0, 833, 834, 5, 33, 0, 0, 834, 835, 3, 136, 68, 0, 835, 836, 5, 48, 0, 0, 836, 837, 5, 44, 0, 0, 837, 838, 3, 136, 68, 0, 838, 839, 5, 116, 0, 0, 839, 840, 3, 136, 68, 0, 840, 841, 5, 114, 0, 0, 841, 101, 1, 0, 0, 0, 842, 843, 5, 38, 0, 0, 843, 844, 3, 104, 52, 0, 844, 845, 5, 40, 0, 0, 845, 848, 3, 108, 54, 0, 846, 847, 5, 16, 0, 0, 847, 849, 3, 138, 69, 0, 848, 846, 1, 0, 0, 0, 848, 849, 1, 0, 0, 0, 849, 850, 1, 0, 0, 0, 850, 851, 5, 114, 0, 0, 851, 103, 1, 0, 0, 0, 852, 853, 3, 136, 68, 0, 853, 854, 5, 116, 0, 0, 854, 855, 3, 106, 53, 0, 855, 105, 1, 0, 0, 0, 856, 868, 3, 136, 68, 0, 857, 868, 5, 81, 0, 0, 858, 868, 5, 71, 0, 0, 859, 868, 5, 72, 0, 0, 860, 868, 5, 78, 0, 0, 861, 868, 5, 79, 0, 0, 862, 868, 5, 80, 0, 0, 863, 868, 5, 82, 0, 0, 864, 868, 5, 83, 0, 0, 865, 868, 5, 84, 0, 0, 866, 868, 5, 85, 0, 0, 867, 856, 1, 0, 0, 0, 867, 857, 1, 0, 0, 0, 867, 858, 1, 0, 0, 0, 867, 859, 1, 0, 0, 0, 867, 860, 1, 0, 0, 0, 867, 861, 1, 0, 0, 0, 867, 862, 1, 0, 0, 0, 867, 863, 1, 0, 0, 0, 867, 864, 1, 0, 0, 0, 867, 865, 1, 0, 0, 0, 867, 866, 1, 0, 0, 0, 868, 107, 1, 0, 0, 0, 869, 870, 5, 43, 0, 0, 870, 871, 3, 136, 68, 0, 871, 872, 5, 116, 0, 0, 872, 873, 3, 110, 55, 0, 873, 892, 1, 0, 0, 0, 874, 875, 5, 44, 0, 0, 875, 876, 3, 136, 68, 0, 876, 877, 5, 116, 0, 0, 877, 878, 3, 136, 68, 0, 878, 879, 5, 116, 0, 0, 879, 880, 3, 112, 56, 0, 880, 892, 1, 0, 0, 0, 881, 882, 5, 28, 0, 0, 882, 883, 3, 136, 68, 0, 883, 884, 5, 116, 0, 0, 884, 886, 3, 136, 68, 0, 885, 887, 3, 28, 14, 0, 886, 885, 1, 0, 0, 0, 886, 887, 1, 0, 0, 0, 887, 889, 1, 0, 0, 0, 888, 890, 3, 114, 57, 0, 889, 888, 1, 0, 0, 0, 889, 890, 1, 0, 0, 0, 890, 892, 1, 0, 0, 0, 891, 869, 1, 0, 0, 0, 891, 874, 1, 0, 0, 0, 891, 881, 1, 0, 0, 0, 892, 109, 1, 0, 0, 0, 893, 894, 7, 2, 0, 0, 894, 111, 1, 0, 0, 0, 895, 896, 7, 3, 0, 0, 896, 113, 1, 0, 0, 0, 897, 898, 5, 46, 0, 0, 898, 902, 5, 117, 0, 0, 899, 901, 3, 116, 58, 0, 900, 899, 1, 0, 0, 0, 901, 904, 1, 0, 0, 0, 902, 900, 1, 0, 0, 0, 902, 903, 1, 0, 0, 0, 903, 905, 1, 0, 0, 0, 904, 902, 1, 0, 0, 0, 905, 906, 5, 118, 0, 0, 906, 115, 1, 0, 0, 0, 907, 908, 3, 136, 68, 0, 908, 909, 5, 40, 0, 0, 909, 910, 5, 43, 0, 0, 910, 917, 3, 136, 68, 0, 911, 912, 5, 48, 0, 0, 912, 913, 5, 44, 0, 0, 913, 914, 3, 136, 68, 0, 914, 915, 5, 116, 0, 0, 915, 916, 3, 136, 68, 0, 916, 918, 1, 0, 0, 0, 917, 911, 1, 0, 0, 0, 917, 918, 1, 0, 0, 0, 918, 919, 1, 0, 0, 0, 919, 920, 5, 114, 0, 0, 920, 977, 1, 0, 0, 0, 921, 922, 3, 136, 68, 0, 922, 923, 5, 40, 0, 0, 923, 924, 5, 44, 0, 0, 924, 925, 3, 136, 68, 0, 925, 926, 5, 116, 0, 0, 926, 933, 3, 136, 68, 0, 927, 928, 5, 48, 0, 0, 928, 929, 5, 44, 0, 0, 929, 930, 3, 136, 68, 0, 930, 931, 5, 116, 0, 0, 931, 932, 3, 136, 68, 0, 932, 934, 1, 0, 0, 0, 933, 927, 1, 0, 0, 0, 933, 934, 1, 0, 0, 0, 934, 935, 1, 0, 0, 0, 935, 936, 5, 114, 0, 0, 936, 977, 1, 0, 0, 0, 937, 938, 3, 136, 68, 0, 938, 939, 5, 40, 0, 0, 939, 940, 5, 26, 0, 0, 940, 942, 3, 136, 68, 0, 941, 943, 3, 28, 14, 0, 942, 941, 1, 0, 0, 0, 942, 943, 1, 0, 0, 0, 943, 950, 1, 0, 0, 0, 944, 945, 5, 48, 0, 0, 945, 946, 5, 44, 0, 0, 946, 947, 3, 136, 68, 0, 947, 948, 5, 116, 0, 0, 948, 949, 3, 136, 68, 0, 949, 951, 1, 0, 0, 0, 950, 944, 1, 0, 0, 0, 950, 951, 1, 0, 0, 0, 951, 952, 1, 0, 0, 0, 952, 953, 5, 114, 0, 0, 953, 977, 1, 0, 0, 0, 954, 955, 3, 136, 68, 0, 955, 956, 5, 40, 0, 0, 956, 957, 5, 33, 0, 0, 957, 958, 3, 136, 68, 0, 958, 959, 5, 114, 0, 0, 959, 977, 1, 0, 0, 0, 960, 961, 3, 136, 68, 0, 961, 962, 5, 40, 0, 0, 962, 963, 5, 5, 0, 0, 963, 964, 3, 136, 68, 0, 964, 965, 5, 116, 0, 0, 965, 972, 3, 136, 68, 0, 966, 967, 5, 48, 0, 0, 967, 968, 5, 44, 0, 0, 968, 969, 3, 136, 68, 0, 969, 970, 5, 116, 0, 0, 970, 971, 3, 136, 68, 0, 971, 973, 1, 0, 0, 0, 972, 966, 1, 0, 0, 0, 972, 973, 1, 0, 0, 0, 973, 974, 1, 0, 0, 0, 974, 975, 5, 114, 0, 0, 975, 977, 1, 0, 0, 0, 976, 907, 1, 0, 0, 0, 976, 921, 1, 0, 0, 0, 976, 937, 1, 0, 0, 0, 976, 954, 1, 0, 0, 0, 976, 960, 1, 0, 0, 0, 977, 117, 1, 0, 0, 0, 978, 979, 5, 33, 0, 0, 979, 980, 3, 136, 68, 0, 980, 981, 5, 40, 0, 0, 981, 982, 3, 136, 68, 0, 982, 983, 5, 116, 0, 0, 983, 985, 3, 136, 68, 0, 984, 986, 3, 114, 57, 0, 985, 984, 1, 0, 0, 0, 985, 986, 1, 0, 0, 0, 986, 987, 1, 0, 0, 0, 987, 988, 5, 114, 0, 0, 988, 119, 1, 0, 0, 0, 989, 1036, 3, 124, 62, 0, 990, 1036, 5, 93, 0, 0, 991, 1036, 5, 94, 0, 0, 992, 993, 5, 95, 0, 0, 993, 1036, 3, 138, 69, 0, 994, 995, 5, 96, 0, 0, 995, 996, 5, 123, 0, 0, 996, 997, 3, 136, 68, 0, 997, 998, 5, 124, 0, 0, 998, 1036, 1, 0, 0, 0, 999, 1000, 5, 97, 0, 0, 1000, 1001, 5, 123, 0, 0, 1001, 1003, 3, 136, 68, 0, 1002, 1004, 3, 28, 14, 0, 1003, 1002, 1, 0, 0, 0, 1003, 1004, 1, 0, 0, 0, 1004, 1005, 1, 0, 0, 0, 1005, 1006, 5, 124, 0, 0, 1006, 1036, 1, 0, 0, 0, 1007, 1008, 5, 21, 0, 0, 1008, 1009, 5, 123, 0, 0, 1009, 1010, 3, 136, 68, 0, 1010, 1011, 5, 124, 0, 0, 1011, 1036, 1, 0, 0, 0, 1012, 1013, 5, 98, 0, 0, 1013, 1014, 5, 123, 0, 0, 1014, 1015, 3, 120, 60, 0, 1015, 1016, 5, 124, 0, 0, 1016, 1036, 1, 0, 0, 0, 1017, 1018, 5, 99, 0, 0, 1018, 1019, 5, 123, 0, 0, 1019, 1020, 3, 120, 60, 0, 1020, 1021, 5, 124, 0, 0, 1021, 1036, 1, 0, 0, 0, 1022, 1023, 5, 100, 0, 0, 1023, 1027, 5, 117, 0, 0, 1024, 1026, 3, 122, 61, 0, 1025, 1024, 1, 0, 0, 0, 1026, 1029, 1, 0, 0, 0, 1027, 1025, 1, 0, 0, 0, 1027, 1028, 1, 0, 0, 0, 1028, 1030, 1, 0, 0, 0, 1029, 1027, 1, 0, 0, 0, 1030, 1036, 5, 118, 0, 0, 1031, 1033, 3, 136, 68, 0, 1032, 1034, 3, 28, 14, 0, 1033, 1032, 1, 0, 0, 0, 1033, 1034, 1, 0, 0, 0, 1034, 1036, 1, 0, 0, 0, 1035, 989, 1, 0, 0, 0, 1035, 990, 1, 0, 0, 0, 1035, 991, 1, 0, 0, 0, 1035, 992, 1, 0, 0, 0, 1035, 994, 1, 0, 0, 0, 1035, 999, 1, 0, 0, 0, 1035, 1007, 1, 0, 0, 0, 1035, 1012, 1, 0, 0, 0, 1035, 1017, 1, 0, 0, 0, 1035, 1022, 1, 0, 0, 0, 1035, 1031, 1, 0, 0, 0, 1036, 121, 1, 0, 0, 0, 1037, 1038, 3, 136, 68, 0, 1038, 1039, 5, 113, 0, 0, 1039, 1040, 3, 120, 60, 0, 1040, 1041, 5, 114, 0, 0, 1041, 123, 1, 0, 0, 0, 1042, 1043, 7, 4, 0, 0, 1043, 125, 1, 0, 0, 0, 1044, 1045, 7, 5, 0, 0, 1045, 127, 1, 0, 0, 0, 1046, 1055, 3, 138, 69, 0, 1047, 1055, 5, 127, 0, 0, 1048, 1055, 5, 128, 0, 0, 1049, 1055, 5, 109, 0, 0, 1050, 1055, 5, 110, 0, 0, 1051, 1055, 5, 111, 0, 0, 1052, 1055, 3, 130, 65, 0, 1053, 1055, 3, 134, 67, 0, 1054, 1046, 1, 0, 0, 0, 1054, 1047, 1, 0, 0, 0, 1054, 1048, 1, 0, 0, 0, 1054, 1049, 1, 0, 0, 0, 1054, 1050, 1, 0, 0, 0, 1054, 1051, 1, 0, 0, 0, 1054, 1052, 1, 0, 0, 0, 1054, 1053, 1, 0, 0, 0, 1055, 129, 1, 0, 0, 0, 1056, 1065, 5, 117, 0, 0, 1057, 1062, 3, 132, 66, 0, 1058, 1059, 5, 115, 0, 0, 1059, 1061, 3, 132, 66, 0, 1060, 1058, 1, 0, 0, 0, 1061, 1064, 1, 0, 0, 0, 1062, 1060, 1, 0, 0, 0, 1062, 1063, 1, 0, 0, 0, 1063, 1066, 1, 0, 0, 0, 1064, 1062, 1, 0, 0, 0, 1065, 1057, 1, 0, 0, 0, 1065, 1066, 1, 0, 0, 0, 1066, 1067, 1, 0, 0, 0, 1067, 1068, 5, 118, 0, 0, 1068, 131, 1, 0, 0, 0, 1069, 1070, 3, 138, 69, 0, 1070, 1071, 5, 113, 0, 0, 1071, 1072, 3, 128, 64, 0, 1072, 133, 1, 0, 0, 0, 1073, 1082, 5, 119, 0, 0, 1074, 1079, 3, 128, 64, 0, 1075, 1076, 5, 115, 0, 0, 1076, 1078, 3, 128, 64, 0, 1077, 1075, 1, 0, 0, 0, 1078, 1081, 1, 0, 0, 0, 1079, 1077, 1, 0, 0, 0, 1079, 1080, 1, 0, 0, 0, 1080, 1083, 1, 0, 0, 0, 1081, 1079, 1, 0, 0, 0, 1082, 1074, 1, 0, 0, 0, 1082, 1083, 1, 0, 0, 0, 1083, 1084, 1, 0, 0, 0, 1084, 1085, 5, 120, 0, 0, 1085, 135, 1, 0, 0, 0, 1086, 1087, 7, 6, 0, 0, 1087, 137, 1, 0, 0, 0, 1088, 1089, 5, 130, 0, 0, 1089, 139, 1, 0, 0, 0, 92, 152, 159, 180, 192, 204, 224, 232, 239, 245, 257, 260, 266, 277, 286, 296, 299, 301, 305, 313, 325, 330, 339, 342, 360, 372, 396, 399, 409, 413, 419, 426, 452, 459, 463, 468, 479, 485, 495, 500, 514, 534, 561, 566, 577, 582, 589, 598, 611, 632, 635, 638, 645, 653, 684, 696, 710, 718, 730, 744, 754, 772, 776, 779, 783, 786, 795, 799, 803, 809, 819, 848, 867, 886, 889, 891, 902, 917, 933, 942, 950, 972, 976, 985, 1003, 1027, 1033, 1035, 1054, 1062, 1065, 1079, 1082] \ No newline at end of file +[4, 1, 133, 1097, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 153, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 158, 8, 1, 10, 1, 12, 1, 161, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 179, 8, 3, 10, 3, 12, 3, 182, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 193, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 205, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 225, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 233, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 238, 8, 10, 10, 10, 12, 10, 241, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 246, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 256, 8, 10, 10, 10, 12, 10, 259, 9, 10, 3, 10, 261, 8, 10, 1, 10, 1, 10, 5, 10, 265, 8, 10, 10, 10, 12, 10, 268, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 276, 8, 11, 10, 11, 12, 11, 279, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 287, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 295, 8, 12, 10, 12, 12, 12, 298, 9, 12, 3, 12, 300, 8, 12, 3, 12, 302, 8, 12, 1, 13, 1, 13, 3, 13, 306, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 312, 8, 14, 10, 14, 12, 14, 315, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 326, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 331, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 340, 8, 17, 1, 18, 3, 18, 343, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 3, 19, 361, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 371, 8, 19, 10, 19, 12, 19, 374, 9, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 397, 8, 20, 1, 21, 3, 21, 400, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 410, 8, 21, 1, 21, 1, 21, 3, 21, 414, 8, 21, 1, 21, 1, 21, 5, 21, 418, 8, 21, 10, 21, 12, 21, 421, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 427, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 453, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 460, 8, 24, 1, 24, 1, 24, 3, 24, 464, 8, 24, 1, 25, 5, 25, 467, 8, 25, 10, 25, 12, 25, 470, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 480, 8, 25, 1, 25, 1, 25, 5, 25, 484, 8, 25, 10, 25, 12, 25, 487, 9, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 496, 8, 26, 1, 27, 1, 27, 1, 27, 3, 27, 501, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 507, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 516, 8, 27, 10, 27, 12, 27, 519, 9, 27, 1, 27, 1, 27, 1, 28, 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, 3, 29, 538, 8, 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, 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, 3, 29, 565, 8, 29, 1, 30, 1, 30, 1, 30, 3, 30, 570, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 581, 8, 30, 1, 30, 1, 30, 1, 30, 3, 30, 586, 8, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 3, 31, 593, 8, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 602, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 615, 8, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 634, 8, 35, 10, 35, 12, 35, 637, 9, 35, 3, 35, 639, 8, 35, 1, 35, 3, 35, 642, 8, 35, 1, 36, 1, 36, 1, 36, 5, 36, 647, 8, 36, 10, 36, 12, 36, 650, 9, 36, 1, 37, 1, 37, 1, 37, 5, 37, 655, 8, 37, 10, 37, 12, 37, 658, 9, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 688, 8, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 700, 8, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 714, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 720, 8, 39, 10, 39, 12, 39, 723, 9, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 3, 42, 734, 8, 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, 3, 43, 748, 8, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 758, 8, 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, 46, 1, 46, 1, 46, 1, 46, 3, 46, 776, 8, 46, 1, 46, 1, 46, 3, 46, 780, 8, 46, 1, 46, 3, 46, 783, 8, 46, 1, 46, 1, 46, 3, 46, 787, 8, 46, 1, 46, 3, 46, 790, 8, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 799, 8, 47, 1, 47, 1, 47, 3, 47, 803, 8, 47, 1, 47, 1, 47, 3, 47, 807, 8, 47, 1, 47, 1, 47, 5, 47, 811, 8, 47, 10, 47, 12, 47, 814, 9, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 823, 8, 48, 1, 49, 1, 49, 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, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 852, 8, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 871, 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, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 890, 8, 54, 1, 54, 3, 54, 893, 8, 54, 3, 54, 895, 8, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 5, 57, 904, 8, 57, 10, 57, 12, 57, 907, 9, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 921, 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, 937, 8, 58, 1, 58, 1, 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, 3, 58, 954, 8, 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, 967, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 979, 8, 58, 1, 58, 1, 58, 3, 58, 983, 8, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 992, 8, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1010, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 1032, 8, 60, 10, 60, 12, 60, 1035, 9, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1040, 8, 60, 3, 60, 1042, 8, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1061, 8, 64, 1, 65, 1, 65, 1, 65, 1, 65, 5, 65, 1067, 8, 65, 10, 65, 12, 65, 1070, 9, 65, 3, 65, 1072, 8, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 5, 67, 1084, 8, 67, 10, 67, 12, 67, 1087, 9, 67, 3, 67, 1089, 8, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 0, 0, 70, 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, 0, 7, 1, 0, 81, 85, 2, 0, 76, 80, 82, 83, 2, 0, 76, 77, 82, 83, 2, 0, 78, 80, 82, 83, 1, 0, 101, 108, 1, 0, 88, 91, 3, 0, 2, 15, 55, 55, 129, 129, 1178, 0, 152, 1, 0, 0, 0, 2, 154, 1, 0, 0, 0, 4, 164, 1, 0, 0, 0, 6, 168, 1, 0, 0, 0, 8, 192, 1, 0, 0, 0, 10, 204, 1, 0, 0, 0, 12, 206, 1, 0, 0, 0, 14, 213, 1, 0, 0, 0, 16, 224, 1, 0, 0, 0, 18, 226, 1, 0, 0, 0, 20, 239, 1, 0, 0, 0, 22, 271, 1, 0, 0, 0, 24, 301, 1, 0, 0, 0, 26, 303, 1, 0, 0, 0, 28, 307, 1, 0, 0, 0, 30, 325, 1, 0, 0, 0, 32, 327, 1, 0, 0, 0, 34, 339, 1, 0, 0, 0, 36, 342, 1, 0, 0, 0, 38, 360, 1, 0, 0, 0, 40, 396, 1, 0, 0, 0, 42, 399, 1, 0, 0, 0, 44, 424, 1, 0, 0, 0, 46, 452, 1, 0, 0, 0, 48, 463, 1, 0, 0, 0, 50, 468, 1, 0, 0, 0, 52, 495, 1, 0, 0, 0, 54, 497, 1, 0, 0, 0, 56, 522, 1, 0, 0, 0, 58, 564, 1, 0, 0, 0, 60, 566, 1, 0, 0, 0, 62, 589, 1, 0, 0, 0, 64, 605, 1, 0, 0, 0, 66, 618, 1, 0, 0, 0, 68, 621, 1, 0, 0, 0, 70, 641, 1, 0, 0, 0, 72, 643, 1, 0, 0, 0, 74, 651, 1, 0, 0, 0, 76, 713, 1, 0, 0, 0, 78, 715, 1, 0, 0, 0, 80, 726, 1, 0, 0, 0, 82, 728, 1, 0, 0, 0, 84, 733, 1, 0, 0, 0, 86, 735, 1, 0, 0, 0, 88, 757, 1, 0, 0, 0, 90, 759, 1, 0, 0, 0, 92, 768, 1, 0, 0, 0, 94, 793, 1, 0, 0, 0, 96, 822, 1, 0, 0, 0, 98, 824, 1, 0, 0, 0, 100, 831, 1, 0, 0, 0, 102, 845, 1, 0, 0, 0, 104, 855, 1, 0, 0, 0, 106, 870, 1, 0, 0, 0, 108, 894, 1, 0, 0, 0, 110, 896, 1, 0, 0, 0, 112, 898, 1, 0, 0, 0, 114, 900, 1, 0, 0, 0, 116, 982, 1, 0, 0, 0, 118, 984, 1, 0, 0, 0, 120, 1041, 1, 0, 0, 0, 122, 1043, 1, 0, 0, 0, 124, 1048, 1, 0, 0, 0, 126, 1050, 1, 0, 0, 0, 128, 1060, 1, 0, 0, 0, 130, 1062, 1, 0, 0, 0, 132, 1075, 1, 0, 0, 0, 134, 1079, 1, 0, 0, 0, 136, 1092, 1, 0, 0, 0, 138, 1094, 1, 0, 0, 0, 140, 141, 3, 6, 3, 0, 141, 142, 5, 0, 0, 1, 142, 153, 1, 0, 0, 0, 143, 144, 3, 20, 10, 0, 144, 145, 5, 0, 0, 1, 145, 153, 1, 0, 0, 0, 146, 147, 3, 50, 25, 0, 147, 148, 5, 0, 0, 1, 148, 153, 1, 0, 0, 0, 149, 150, 3, 2, 1, 0, 150, 151, 5, 0, 0, 1, 151, 153, 1, 0, 0, 0, 152, 140, 1, 0, 0, 0, 152, 143, 1, 0, 0, 0, 152, 146, 1, 0, 0, 0, 152, 149, 1, 0, 0, 0, 153, 1, 1, 0, 0, 0, 154, 155, 5, 22, 0, 0, 155, 159, 5, 117, 0, 0, 156, 158, 3, 8, 4, 0, 157, 156, 1, 0, 0, 0, 158, 161, 1, 0, 0, 0, 159, 157, 1, 0, 0, 0, 159, 160, 1, 0, 0, 0, 160, 162, 1, 0, 0, 0, 161, 159, 1, 0, 0, 0, 162, 163, 5, 118, 0, 0, 163, 3, 1, 0, 0, 0, 164, 165, 5, 23, 0, 0, 165, 166, 3, 138, 69, 0, 166, 167, 5, 114, 0, 0, 167, 5, 1, 0, 0, 0, 168, 169, 5, 1, 0, 0, 169, 170, 3, 136, 68, 0, 170, 171, 5, 64, 0, 0, 171, 172, 3, 138, 69, 0, 172, 173, 5, 58, 0, 0, 173, 174, 3, 138, 69, 0, 174, 175, 5, 57, 0, 0, 175, 176, 3, 138, 69, 0, 176, 180, 5, 117, 0, 0, 177, 179, 3, 8, 4, 0, 178, 177, 1, 0, 0, 0, 179, 182, 1, 0, 0, 0, 180, 178, 1, 0, 0, 0, 180, 181, 1, 0, 0, 0, 181, 183, 1, 0, 0, 0, 182, 180, 1, 0, 0, 0, 183, 184, 5, 118, 0, 0, 184, 7, 1, 0, 0, 0, 185, 193, 3, 4, 2, 0, 186, 193, 3, 18, 9, 0, 187, 193, 3, 10, 5, 0, 188, 193, 3, 82, 41, 0, 189, 193, 3, 94, 47, 0, 190, 193, 3, 118, 59, 0, 191, 193, 3, 32, 16, 0, 192, 185, 1, 0, 0, 0, 192, 186, 1, 0, 0, 0, 192, 187, 1, 0, 0, 0, 192, 188, 1, 0, 0, 0, 192, 189, 1, 0, 0, 0, 192, 190, 1, 0, 0, 0, 192, 191, 1, 0, 0, 0, 193, 9, 1, 0, 0, 0, 194, 195, 5, 23, 0, 0, 195, 196, 5, 26, 0, 0, 196, 197, 3, 136, 68, 0, 197, 198, 5, 114, 0, 0, 198, 205, 1, 0, 0, 0, 199, 200, 5, 23, 0, 0, 200, 201, 5, 28, 0, 0, 201, 202, 3, 136, 68, 0, 202, 203, 5, 114, 0, 0, 203, 205, 1, 0, 0, 0, 204, 194, 1, 0, 0, 0, 204, 199, 1, 0, 0, 0, 205, 11, 1, 0, 0, 0, 206, 207, 5, 24, 0, 0, 207, 208, 5, 25, 0, 0, 208, 209, 3, 136, 68, 0, 209, 210, 5, 64, 0, 0, 210, 211, 3, 138, 69, 0, 211, 212, 5, 114, 0, 0, 212, 13, 1, 0, 0, 0, 213, 214, 5, 24, 0, 0, 214, 215, 5, 26, 0, 0, 215, 216, 3, 136, 68, 0, 216, 217, 5, 58, 0, 0, 217, 218, 3, 138, 69, 0, 218, 219, 5, 114, 0, 0, 219, 15, 1, 0, 0, 0, 220, 225, 3, 10, 5, 0, 221, 225, 3, 12, 6, 0, 222, 225, 3, 14, 7, 0, 223, 225, 3, 32, 16, 0, 224, 220, 1, 0, 0, 0, 224, 221, 1, 0, 0, 0, 224, 222, 1, 0, 0, 0, 224, 223, 1, 0, 0, 0, 225, 17, 1, 0, 0, 0, 226, 227, 5, 25, 0, 0, 227, 228, 3, 136, 68, 0, 228, 229, 5, 64, 0, 0, 229, 232, 3, 138, 69, 0, 230, 231, 5, 65, 0, 0, 231, 233, 3, 138, 69, 0, 232, 230, 1, 0, 0, 0, 232, 233, 1, 0, 0, 0, 233, 234, 1, 0, 0, 0, 234, 235, 5, 114, 0, 0, 235, 19, 1, 0, 0, 0, 236, 238, 3, 16, 8, 0, 237, 236, 1, 0, 0, 0, 238, 241, 1, 0, 0, 0, 239, 237, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 242, 1, 0, 0, 0, 241, 239, 1, 0, 0, 0, 242, 243, 5, 26, 0, 0, 243, 245, 3, 136, 68, 0, 244, 246, 3, 22, 11, 0, 245, 244, 1, 0, 0, 0, 245, 246, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 247, 248, 5, 64, 0, 0, 248, 249, 3, 138, 69, 0, 249, 250, 5, 58, 0, 0, 250, 260, 3, 138, 69, 0, 251, 252, 5, 69, 0, 0, 252, 257, 3, 26, 13, 0, 253, 254, 5, 115, 0, 0, 254, 256, 3, 26, 13, 0, 255, 253, 1, 0, 0, 0, 256, 259, 1, 0, 0, 0, 257, 255, 1, 0, 0, 0, 257, 258, 1, 0, 0, 0, 258, 261, 1, 0, 0, 0, 259, 257, 1, 0, 0, 0, 260, 251, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 266, 5, 117, 0, 0, 263, 265, 3, 34, 17, 0, 264, 263, 1, 0, 0, 0, 265, 268, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 269, 1, 0, 0, 0, 268, 266, 1, 0, 0, 0, 269, 270, 5, 118, 0, 0, 270, 21, 1, 0, 0, 0, 271, 272, 5, 123, 0, 0, 272, 277, 3, 24, 12, 0, 273, 274, 5, 115, 0, 0, 274, 276, 3, 24, 12, 0, 275, 273, 1, 0, 0, 0, 276, 279, 1, 0, 0, 0, 277, 275, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 280, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 280, 281, 5, 124, 0, 0, 281, 23, 1, 0, 0, 0, 282, 283, 5, 29, 0, 0, 283, 286, 3, 136, 68, 0, 284, 285, 5, 113, 0, 0, 285, 287, 5, 19, 0, 0, 286, 284, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 302, 1, 0, 0, 0, 288, 289, 5, 18, 0, 0, 289, 299, 3, 136, 68, 0, 290, 291, 5, 20, 0, 0, 291, 296, 3, 26, 13, 0, 292, 293, 5, 125, 0, 0, 293, 295, 3, 26, 13, 0, 294, 292, 1, 0, 0, 0, 295, 298, 1, 0, 0, 0, 296, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 300, 1, 0, 0, 0, 298, 296, 1, 0, 0, 0, 299, 290, 1, 0, 0, 0, 299, 300, 1, 0, 0, 0, 300, 302, 1, 0, 0, 0, 301, 282, 1, 0, 0, 0, 301, 288, 1, 0, 0, 0, 302, 25, 1, 0, 0, 0, 303, 305, 3, 136, 68, 0, 304, 306, 3, 28, 14, 0, 305, 304, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 27, 1, 0, 0, 0, 307, 308, 5, 123, 0, 0, 308, 313, 3, 30, 15, 0, 309, 310, 5, 115, 0, 0, 310, 312, 3, 30, 15, 0, 311, 309, 1, 0, 0, 0, 312, 315, 1, 0, 0, 0, 313, 311, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 316, 1, 0, 0, 0, 315, 313, 1, 0, 0, 0, 316, 317, 5, 124, 0, 0, 317, 29, 1, 0, 0, 0, 318, 319, 5, 25, 0, 0, 319, 326, 3, 136, 68, 0, 320, 321, 5, 26, 0, 0, 321, 326, 3, 26, 13, 0, 322, 323, 5, 18, 0, 0, 323, 326, 3, 136, 68, 0, 324, 326, 3, 120, 60, 0, 325, 318, 1, 0, 0, 0, 325, 320, 1, 0, 0, 0, 325, 322, 1, 0, 0, 0, 325, 324, 1, 0, 0, 0, 326, 31, 1, 0, 0, 0, 327, 328, 5, 17, 0, 0, 328, 330, 3, 136, 68, 0, 329, 331, 3, 22, 11, 0, 330, 329, 1, 0, 0, 0, 330, 331, 1, 0, 0, 0, 331, 332, 1, 0, 0, 0, 332, 333, 5, 126, 0, 0, 333, 334, 3, 120, 60, 0, 334, 335, 5, 114, 0, 0, 335, 33, 1, 0, 0, 0, 336, 340, 3, 38, 19, 0, 337, 340, 3, 42, 21, 0, 338, 340, 3, 36, 18, 0, 339, 336, 1, 0, 0, 0, 339, 337, 1, 0, 0, 0, 339, 338, 1, 0, 0, 0, 340, 35, 1, 0, 0, 0, 341, 343, 5, 39, 0, 0, 342, 341, 1, 0, 0, 0, 342, 343, 1, 0, 0, 0, 343, 344, 1, 0, 0, 0, 344, 345, 5, 31, 0, 0, 345, 346, 3, 136, 68, 0, 346, 347, 5, 64, 0, 0, 347, 348, 3, 138, 69, 0, 348, 349, 5, 113, 0, 0, 349, 350, 3, 120, 60, 0, 350, 351, 5, 112, 0, 0, 351, 352, 3, 120, 60, 0, 352, 353, 5, 117, 0, 0, 353, 354, 5, 81, 0, 0, 354, 355, 5, 64, 0, 0, 355, 356, 3, 138, 69, 0, 356, 357, 5, 114, 0, 0, 357, 358, 5, 118, 0, 0, 358, 37, 1, 0, 0, 0, 359, 361, 3, 44, 22, 0, 360, 359, 1, 0, 0, 0, 360, 361, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 363, 5, 29, 0, 0, 363, 364, 3, 136, 68, 0, 364, 365, 5, 64, 0, 0, 365, 366, 3, 138, 69, 0, 366, 367, 5, 113, 0, 0, 367, 368, 3, 120, 60, 0, 368, 372, 5, 117, 0, 0, 369, 371, 3, 40, 20, 0, 370, 369, 1, 0, 0, 0, 371, 374, 1, 0, 0, 0, 372, 370, 1, 0, 0, 0, 372, 373, 1, 0, 0, 0, 373, 375, 1, 0, 0, 0, 374, 372, 1, 0, 0, 0, 375, 376, 5, 118, 0, 0, 376, 39, 1, 0, 0, 0, 377, 378, 5, 71, 0, 0, 378, 379, 5, 64, 0, 0, 379, 380, 3, 138, 69, 0, 380, 381, 5, 114, 0, 0, 381, 397, 1, 0, 0, 0, 382, 383, 5, 72, 0, 0, 383, 384, 5, 64, 0, 0, 384, 385, 3, 138, 69, 0, 385, 386, 5, 114, 0, 0, 386, 397, 1, 0, 0, 0, 387, 388, 5, 73, 0, 0, 388, 389, 5, 74, 0, 0, 389, 390, 5, 64, 0, 0, 390, 391, 3, 138, 69, 0, 391, 392, 5, 75, 0, 0, 392, 393, 5, 64, 0, 0, 393, 394, 3, 138, 69, 0, 394, 395, 5, 114, 0, 0, 395, 397, 1, 0, 0, 0, 396, 377, 1, 0, 0, 0, 396, 382, 1, 0, 0, 0, 396, 387, 1, 0, 0, 0, 397, 41, 1, 0, 0, 0, 398, 400, 3, 44, 22, 0, 399, 398, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 402, 5, 30, 0, 0, 402, 403, 3, 136, 68, 0, 403, 404, 5, 64, 0, 0, 404, 405, 3, 138, 69, 0, 405, 406, 5, 113, 0, 0, 406, 407, 3, 126, 63, 0, 407, 409, 3, 48, 24, 0, 408, 410, 5, 92, 0, 0, 409, 408, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 413, 1, 0, 0, 0, 411, 412, 5, 62, 0, 0, 412, 414, 3, 138, 69, 0, 413, 411, 1, 0, 0, 0, 413, 414, 1, 0, 0, 0, 414, 415, 1, 0, 0, 0, 415, 419, 5, 117, 0, 0, 416, 418, 3, 46, 23, 0, 417, 416, 1, 0, 0, 0, 418, 421, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 419, 1, 0, 0, 0, 422, 423, 5, 118, 0, 0, 423, 43, 1, 0, 0, 0, 424, 426, 5, 14, 0, 0, 425, 427, 5, 15, 0, 0, 426, 425, 1, 0, 0, 0, 426, 427, 1, 0, 0, 0, 427, 45, 1, 0, 0, 0, 428, 429, 5, 78, 0, 0, 429, 430, 5, 64, 0, 0, 430, 431, 3, 138, 69, 0, 431, 432, 5, 114, 0, 0, 432, 453, 1, 0, 0, 0, 433, 434, 5, 79, 0, 0, 434, 435, 5, 64, 0, 0, 435, 436, 3, 138, 69, 0, 436, 437, 5, 114, 0, 0, 437, 453, 1, 0, 0, 0, 438, 439, 5, 80, 0, 0, 439, 440, 5, 64, 0, 0, 440, 441, 3, 138, 69, 0, 441, 442, 5, 114, 0, 0, 442, 453, 1, 0, 0, 0, 443, 444, 5, 73, 0, 0, 444, 445, 5, 74, 0, 0, 445, 446, 5, 64, 0, 0, 446, 447, 3, 138, 69, 0, 447, 448, 5, 75, 0, 0, 448, 449, 5, 64, 0, 0, 449, 450, 3, 138, 69, 0, 450, 451, 5, 114, 0, 0, 451, 453, 1, 0, 0, 0, 452, 428, 1, 0, 0, 0, 452, 433, 1, 0, 0, 0, 452, 438, 1, 0, 0, 0, 452, 443, 1, 0, 0, 0, 453, 47, 1, 0, 0, 0, 454, 455, 5, 25, 0, 0, 455, 464, 3, 136, 68, 0, 456, 457, 5, 26, 0, 0, 457, 459, 3, 136, 68, 0, 458, 460, 3, 28, 14, 0, 459, 458, 1, 0, 0, 0, 459, 460, 1, 0, 0, 0, 460, 464, 1, 0, 0, 0, 461, 462, 5, 18, 0, 0, 462, 464, 3, 136, 68, 0, 463, 454, 1, 0, 0, 0, 463, 456, 1, 0, 0, 0, 463, 461, 1, 0, 0, 0, 464, 49, 1, 0, 0, 0, 465, 467, 3, 16, 8, 0, 466, 465, 1, 0, 0, 0, 467, 470, 1, 0, 0, 0, 468, 466, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 471, 1, 0, 0, 0, 470, 468, 1, 0, 0, 0, 471, 472, 5, 28, 0, 0, 472, 473, 3, 136, 68, 0, 473, 474, 5, 64, 0, 0, 474, 475, 3, 138, 69, 0, 475, 476, 5, 58, 0, 0, 476, 479, 3, 138, 69, 0, 477, 478, 5, 59, 0, 0, 478, 480, 5, 127, 0, 0, 479, 477, 1, 0, 0, 0, 479, 480, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 485, 5, 117, 0, 0, 482, 484, 3, 52, 26, 0, 483, 482, 1, 0, 0, 0, 484, 487, 1, 0, 0, 0, 485, 483, 1, 0, 0, 0, 485, 486, 1, 0, 0, 0, 486, 488, 1, 0, 0, 0, 487, 485, 1, 0, 0, 0, 488, 489, 5, 118, 0, 0, 489, 51, 1, 0, 0, 0, 490, 496, 3, 60, 30, 0, 491, 496, 3, 62, 31, 0, 492, 496, 3, 64, 32, 0, 493, 496, 3, 54, 27, 0, 494, 496, 3, 56, 28, 0, 495, 490, 1, 0, 0, 0, 495, 491, 1, 0, 0, 0, 495, 492, 1, 0, 0, 0, 495, 493, 1, 0, 0, 0, 495, 494, 1, 0, 0, 0, 496, 53, 1, 0, 0, 0, 497, 498, 5, 5, 0, 0, 498, 500, 3, 136, 68, 0, 499, 501, 3, 22, 11, 0, 500, 499, 1, 0, 0, 0, 500, 501, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 5, 64, 0, 0, 503, 504, 3, 138, 69, 0, 504, 506, 5, 7, 0, 0, 505, 507, 5, 1, 0, 0, 506, 505, 1, 0, 0, 0, 506, 507, 1, 0, 0, 0, 507, 508, 1, 0, 0, 0, 508, 509, 3, 26, 13, 0, 509, 510, 5, 8, 0, 0, 510, 511, 3, 138, 69, 0, 511, 512, 5, 31, 0, 0, 512, 513, 3, 138, 69, 0, 513, 517, 5, 117, 0, 0, 514, 516, 3, 58, 29, 0, 515, 514, 1, 0, 0, 0, 516, 519, 1, 0, 0, 0, 517, 515, 1, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 520, 1, 0, 0, 0, 519, 517, 1, 0, 0, 0, 520, 521, 5, 118, 0, 0, 521, 55, 1, 0, 0, 0, 522, 523, 5, 5, 0, 0, 523, 524, 3, 136, 68, 0, 524, 525, 5, 64, 0, 0, 525, 526, 3, 138, 69, 0, 526, 527, 5, 6, 0, 0, 527, 528, 3, 136, 68, 0, 528, 529, 3, 28, 14, 0, 529, 530, 5, 114, 0, 0, 530, 57, 1, 0, 0, 0, 531, 532, 5, 9, 0, 0, 532, 533, 3, 138, 69, 0, 533, 534, 5, 114, 0, 0, 534, 565, 1, 0, 0, 0, 535, 537, 5, 10, 0, 0, 536, 538, 5, 18, 0, 0, 537, 536, 1, 0, 0, 0, 537, 538, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 540, 3, 136, 68, 0, 540, 541, 5, 37, 0, 0, 541, 542, 3, 26, 13, 0, 542, 543, 5, 114, 0, 0, 543, 565, 1, 0, 0, 0, 544, 545, 5, 11, 0, 0, 545, 546, 3, 136, 68, 0, 546, 547, 5, 127, 0, 0, 547, 548, 5, 114, 0, 0, 548, 565, 1, 0, 0, 0, 549, 550, 5, 12, 0, 0, 550, 551, 3, 26, 13, 0, 551, 552, 5, 116, 0, 0, 552, 553, 3, 136, 68, 0, 553, 554, 3, 136, 68, 0, 554, 555, 3, 138, 69, 0, 555, 556, 5, 114, 0, 0, 556, 565, 1, 0, 0, 0, 557, 558, 5, 73, 0, 0, 558, 565, 5, 114, 0, 0, 559, 560, 5, 13, 0, 0, 560, 561, 5, 127, 0, 0, 561, 562, 3, 138, 69, 0, 562, 563, 5, 114, 0, 0, 563, 565, 1, 0, 0, 0, 564, 531, 1, 0, 0, 0, 564, 535, 1, 0, 0, 0, 564, 544, 1, 0, 0, 0, 564, 549, 1, 0, 0, 0, 564, 557, 1, 0, 0, 0, 564, 559, 1, 0, 0, 0, 565, 59, 1, 0, 0, 0, 566, 567, 5, 31, 0, 0, 567, 569, 3, 136, 68, 0, 568, 570, 3, 22, 11, 0, 569, 568, 1, 0, 0, 0, 569, 570, 1, 0, 0, 0, 570, 571, 1, 0, 0, 0, 571, 572, 5, 64, 0, 0, 572, 573, 3, 138, 69, 0, 573, 574, 5, 113, 0, 0, 574, 575, 3, 120, 60, 0, 575, 576, 5, 112, 0, 0, 576, 577, 3, 120, 60, 0, 577, 578, 5, 66, 0, 0, 578, 580, 3, 68, 34, 0, 579, 581, 3, 66, 33, 0, 580, 579, 1, 0, 0, 0, 580, 581, 1, 0, 0, 0, 581, 582, 1, 0, 0, 0, 582, 583, 5, 68, 0, 0, 583, 585, 3, 70, 35, 0, 584, 586, 3, 74, 37, 0, 585, 584, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 587, 1, 0, 0, 0, 587, 588, 5, 114, 0, 0, 588, 61, 1, 0, 0, 0, 589, 590, 5, 32, 0, 0, 590, 592, 3, 136, 68, 0, 591, 593, 3, 22, 11, 0, 592, 591, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 595, 5, 64, 0, 0, 595, 596, 3, 138, 69, 0, 596, 597, 5, 113, 0, 0, 597, 598, 3, 120, 60, 0, 598, 599, 5, 112, 0, 0, 599, 601, 3, 120, 60, 0, 600, 602, 3, 74, 37, 0, 601, 600, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 604, 5, 114, 0, 0, 604, 63, 1, 0, 0, 0, 605, 606, 5, 33, 0, 0, 606, 607, 3, 136, 68, 0, 607, 608, 5, 64, 0, 0, 608, 609, 3, 138, 69, 0, 609, 610, 5, 34, 0, 0, 610, 611, 3, 136, 68, 0, 611, 612, 5, 113, 0, 0, 612, 614, 3, 120, 60, 0, 613, 615, 3, 74, 37, 0, 614, 613, 1, 0, 0, 0, 614, 615, 1, 0, 0, 0, 615, 616, 1, 0, 0, 0, 616, 617, 5, 114, 0, 0, 617, 65, 1, 0, 0, 0, 618, 619, 5, 67, 0, 0, 619, 620, 3, 120, 60, 0, 620, 67, 1, 0, 0, 0, 621, 622, 7, 0, 0, 0, 622, 69, 1, 0, 0, 0, 623, 642, 5, 70, 0, 0, 624, 625, 5, 25, 0, 0, 625, 642, 3, 136, 68, 0, 626, 627, 5, 18, 0, 0, 627, 642, 3, 136, 68, 0, 628, 629, 5, 27, 0, 0, 629, 638, 5, 119, 0, 0, 630, 635, 3, 26, 13, 0, 631, 632, 5, 115, 0, 0, 632, 634, 3, 26, 13, 0, 633, 631, 1, 0, 0, 0, 634, 637, 1, 0, 0, 0, 635, 633, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 639, 1, 0, 0, 0, 637, 635, 1, 0, 0, 0, 638, 630, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 642, 5, 120, 0, 0, 641, 623, 1, 0, 0, 0, 641, 624, 1, 0, 0, 0, 641, 626, 1, 0, 0, 0, 641, 628, 1, 0, 0, 0, 642, 71, 1, 0, 0, 0, 643, 648, 3, 136, 68, 0, 644, 645, 5, 115, 0, 0, 645, 647, 3, 136, 68, 0, 646, 644, 1, 0, 0, 0, 647, 650, 1, 0, 0, 0, 648, 646, 1, 0, 0, 0, 648, 649, 1, 0, 0, 0, 649, 73, 1, 0, 0, 0, 650, 648, 1, 0, 0, 0, 651, 652, 5, 69, 0, 0, 652, 656, 5, 117, 0, 0, 653, 655, 3, 76, 38, 0, 654, 653, 1, 0, 0, 0, 655, 658, 1, 0, 0, 0, 656, 654, 1, 0, 0, 0, 656, 657, 1, 0, 0, 0, 657, 659, 1, 0, 0, 0, 658, 656, 1, 0, 0, 0, 659, 660, 5, 118, 0, 0, 660, 75, 1, 0, 0, 0, 661, 662, 5, 43, 0, 0, 662, 663, 3, 136, 68, 0, 663, 664, 5, 64, 0, 0, 664, 665, 3, 138, 69, 0, 665, 666, 5, 113, 0, 0, 666, 667, 3, 120, 60, 0, 667, 668, 3, 78, 39, 0, 668, 669, 5, 114, 0, 0, 669, 714, 1, 0, 0, 0, 670, 671, 5, 44, 0, 0, 671, 672, 3, 136, 68, 0, 672, 673, 5, 64, 0, 0, 673, 674, 3, 138, 69, 0, 674, 675, 5, 113, 0, 0, 675, 676, 3, 126, 63, 0, 676, 677, 3, 48, 24, 0, 677, 678, 3, 78, 39, 0, 678, 679, 5, 114, 0, 0, 679, 714, 1, 0, 0, 0, 680, 681, 5, 26, 0, 0, 681, 682, 3, 136, 68, 0, 682, 683, 5, 64, 0, 0, 683, 684, 3, 138, 69, 0, 684, 685, 5, 113, 0, 0, 685, 687, 3, 136, 68, 0, 686, 688, 3, 28, 14, 0, 687, 686, 1, 0, 0, 0, 687, 688, 1, 0, 0, 0, 688, 689, 1, 0, 0, 0, 689, 690, 5, 114, 0, 0, 690, 714, 1, 0, 0, 0, 691, 692, 5, 33, 0, 0, 692, 693, 3, 136, 68, 0, 693, 694, 5, 64, 0, 0, 694, 695, 3, 138, 69, 0, 695, 696, 5, 113, 0, 0, 696, 699, 3, 136, 68, 0, 697, 698, 5, 35, 0, 0, 698, 700, 3, 120, 60, 0, 699, 697, 1, 0, 0, 0, 699, 700, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 702, 5, 114, 0, 0, 702, 714, 1, 0, 0, 0, 703, 704, 5, 5, 0, 0, 704, 705, 3, 136, 68, 0, 705, 706, 5, 64, 0, 0, 706, 707, 3, 138, 69, 0, 707, 708, 5, 113, 0, 0, 708, 709, 3, 136, 68, 0, 709, 710, 5, 116, 0, 0, 710, 711, 3, 136, 68, 0, 711, 712, 5, 114, 0, 0, 712, 714, 1, 0, 0, 0, 713, 661, 1, 0, 0, 0, 713, 670, 1, 0, 0, 0, 713, 680, 1, 0, 0, 0, 713, 691, 1, 0, 0, 0, 713, 703, 1, 0, 0, 0, 714, 77, 1, 0, 0, 0, 715, 716, 5, 119, 0, 0, 716, 721, 3, 80, 40, 0, 717, 718, 5, 115, 0, 0, 718, 720, 3, 80, 40, 0, 719, 717, 1, 0, 0, 0, 720, 723, 1, 0, 0, 0, 721, 719, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 724, 1, 0, 0, 0, 723, 721, 1, 0, 0, 0, 724, 725, 5, 120, 0, 0, 725, 79, 1, 0, 0, 0, 726, 727, 7, 1, 0, 0, 727, 81, 1, 0, 0, 0, 728, 729, 5, 42, 0, 0, 729, 730, 3, 84, 42, 0, 730, 83, 1, 0, 0, 0, 731, 734, 3, 86, 43, 0, 732, 734, 3, 90, 45, 0, 733, 731, 1, 0, 0, 0, 733, 732, 1, 0, 0, 0, 734, 85, 1, 0, 0, 0, 735, 736, 5, 43, 0, 0, 736, 737, 3, 136, 68, 0, 737, 738, 5, 64, 0, 0, 738, 739, 3, 138, 69, 0, 739, 740, 5, 52, 0, 0, 740, 741, 3, 136, 68, 0, 741, 742, 5, 113, 0, 0, 742, 743, 3, 120, 60, 0, 743, 744, 5, 53, 0, 0, 744, 747, 3, 88, 44, 0, 745, 746, 5, 54, 0, 0, 746, 748, 3, 128, 64, 0, 747, 745, 1, 0, 0, 0, 747, 748, 1, 0, 0, 0, 748, 749, 1, 0, 0, 0, 749, 750, 5, 114, 0, 0, 750, 87, 1, 0, 0, 0, 751, 758, 5, 86, 0, 0, 752, 753, 5, 87, 0, 0, 753, 754, 5, 121, 0, 0, 754, 755, 3, 120, 60, 0, 755, 756, 5, 122, 0, 0, 756, 758, 1, 0, 0, 0, 757, 751, 1, 0, 0, 0, 757, 752, 1, 0, 0, 0, 758, 89, 1, 0, 0, 0, 759, 760, 5, 44, 0, 0, 760, 761, 3, 136, 68, 0, 761, 762, 5, 64, 0, 0, 762, 763, 3, 138, 69, 0, 763, 764, 5, 117, 0, 0, 764, 765, 3, 92, 46, 0, 765, 766, 3, 92, 46, 0, 766, 767, 5, 118, 0, 0, 767, 91, 1, 0, 0, 0, 768, 769, 3, 48, 24, 0, 769, 770, 5, 45, 0, 0, 770, 771, 3, 136, 68, 0, 771, 772, 5, 64, 0, 0, 772, 773, 3, 138, 69, 0, 773, 775, 3, 126, 63, 0, 774, 776, 5, 92, 0, 0, 775, 774, 1, 0, 0, 0, 775, 776, 1, 0, 0, 0, 776, 779, 1, 0, 0, 0, 777, 778, 5, 60, 0, 0, 778, 780, 3, 138, 69, 0, 779, 777, 1, 0, 0, 0, 779, 780, 1, 0, 0, 0, 780, 782, 1, 0, 0, 0, 781, 783, 5, 61, 0, 0, 782, 781, 1, 0, 0, 0, 782, 783, 1, 0, 0, 0, 783, 786, 1, 0, 0, 0, 784, 785, 5, 62, 0, 0, 785, 787, 3, 138, 69, 0, 786, 784, 1, 0, 0, 0, 786, 787, 1, 0, 0, 0, 787, 789, 1, 0, 0, 0, 788, 790, 5, 63, 0, 0, 789, 788, 1, 0, 0, 0, 789, 790, 1, 0, 0, 0, 790, 791, 1, 0, 0, 0, 791, 792, 5, 114, 0, 0, 792, 93, 1, 0, 0, 0, 793, 794, 5, 36, 0, 0, 794, 795, 3, 136, 68, 0, 795, 796, 5, 37, 0, 0, 796, 798, 3, 136, 68, 0, 797, 799, 3, 28, 14, 0, 798, 797, 1, 0, 0, 0, 798, 799, 1, 0, 0, 0, 799, 802, 1, 0, 0, 0, 800, 801, 5, 64, 0, 0, 801, 803, 3, 138, 69, 0, 802, 800, 1, 0, 0, 0, 802, 803, 1, 0, 0, 0, 803, 806, 1, 0, 0, 0, 804, 805, 5, 59, 0, 0, 805, 807, 5, 127, 0, 0, 806, 804, 1, 0, 0, 0, 806, 807, 1, 0, 0, 0, 807, 808, 1, 0, 0, 0, 808, 812, 5, 117, 0, 0, 809, 811, 3, 96, 48, 0, 810, 809, 1, 0, 0, 0, 811, 814, 1, 0, 0, 0, 812, 810, 1, 0, 0, 0, 812, 813, 1, 0, 0, 0, 813, 815, 1, 0, 0, 0, 814, 812, 1, 0, 0, 0, 815, 816, 5, 118, 0, 0, 816, 95, 1, 0, 0, 0, 817, 818, 5, 41, 0, 0, 818, 823, 3, 84, 42, 0, 819, 823, 3, 102, 51, 0, 820, 823, 3, 98, 49, 0, 821, 823, 3, 100, 50, 0, 822, 817, 1, 0, 0, 0, 822, 819, 1, 0, 0, 0, 822, 820, 1, 0, 0, 0, 822, 821, 1, 0, 0, 0, 823, 97, 1, 0, 0, 0, 824, 825, 5, 38, 0, 0, 825, 826, 3, 136, 68, 0, 826, 827, 5, 40, 0, 0, 827, 828, 5, 43, 0, 0, 828, 829, 3, 136, 68, 0, 829, 830, 5, 114, 0, 0, 830, 99, 1, 0, 0, 0, 831, 832, 5, 49, 0, 0, 832, 833, 3, 136, 68, 0, 833, 834, 5, 50, 0, 0, 834, 835, 5, 51, 0, 0, 835, 836, 5, 47, 0, 0, 836, 837, 5, 33, 0, 0, 837, 838, 3, 136, 68, 0, 838, 839, 5, 48, 0, 0, 839, 840, 5, 44, 0, 0, 840, 841, 3, 136, 68, 0, 841, 842, 5, 116, 0, 0, 842, 843, 3, 136, 68, 0, 843, 844, 5, 114, 0, 0, 844, 101, 1, 0, 0, 0, 845, 846, 5, 38, 0, 0, 846, 847, 3, 104, 52, 0, 847, 848, 5, 40, 0, 0, 848, 851, 3, 108, 54, 0, 849, 850, 5, 16, 0, 0, 850, 852, 3, 138, 69, 0, 851, 849, 1, 0, 0, 0, 851, 852, 1, 0, 0, 0, 852, 853, 1, 0, 0, 0, 853, 854, 5, 114, 0, 0, 854, 103, 1, 0, 0, 0, 855, 856, 3, 136, 68, 0, 856, 857, 5, 116, 0, 0, 857, 858, 3, 106, 53, 0, 858, 105, 1, 0, 0, 0, 859, 871, 3, 136, 68, 0, 860, 871, 5, 81, 0, 0, 861, 871, 5, 71, 0, 0, 862, 871, 5, 72, 0, 0, 863, 871, 5, 78, 0, 0, 864, 871, 5, 79, 0, 0, 865, 871, 5, 80, 0, 0, 866, 871, 5, 82, 0, 0, 867, 871, 5, 83, 0, 0, 868, 871, 5, 84, 0, 0, 869, 871, 5, 85, 0, 0, 870, 859, 1, 0, 0, 0, 870, 860, 1, 0, 0, 0, 870, 861, 1, 0, 0, 0, 870, 862, 1, 0, 0, 0, 870, 863, 1, 0, 0, 0, 870, 864, 1, 0, 0, 0, 870, 865, 1, 0, 0, 0, 870, 866, 1, 0, 0, 0, 870, 867, 1, 0, 0, 0, 870, 868, 1, 0, 0, 0, 870, 869, 1, 0, 0, 0, 871, 107, 1, 0, 0, 0, 872, 873, 5, 43, 0, 0, 873, 874, 3, 136, 68, 0, 874, 875, 5, 116, 0, 0, 875, 876, 3, 110, 55, 0, 876, 895, 1, 0, 0, 0, 877, 878, 5, 44, 0, 0, 878, 879, 3, 136, 68, 0, 879, 880, 5, 116, 0, 0, 880, 881, 3, 136, 68, 0, 881, 882, 5, 116, 0, 0, 882, 883, 3, 112, 56, 0, 883, 895, 1, 0, 0, 0, 884, 885, 5, 28, 0, 0, 885, 886, 3, 136, 68, 0, 886, 887, 5, 116, 0, 0, 887, 889, 3, 136, 68, 0, 888, 890, 3, 28, 14, 0, 889, 888, 1, 0, 0, 0, 889, 890, 1, 0, 0, 0, 890, 892, 1, 0, 0, 0, 891, 893, 3, 114, 57, 0, 892, 891, 1, 0, 0, 0, 892, 893, 1, 0, 0, 0, 893, 895, 1, 0, 0, 0, 894, 872, 1, 0, 0, 0, 894, 877, 1, 0, 0, 0, 894, 884, 1, 0, 0, 0, 895, 109, 1, 0, 0, 0, 896, 897, 7, 2, 0, 0, 897, 111, 1, 0, 0, 0, 898, 899, 7, 3, 0, 0, 899, 113, 1, 0, 0, 0, 900, 901, 5, 46, 0, 0, 901, 905, 5, 117, 0, 0, 902, 904, 3, 116, 58, 0, 903, 902, 1, 0, 0, 0, 904, 907, 1, 0, 0, 0, 905, 903, 1, 0, 0, 0, 905, 906, 1, 0, 0, 0, 906, 908, 1, 0, 0, 0, 907, 905, 1, 0, 0, 0, 908, 909, 5, 118, 0, 0, 909, 115, 1, 0, 0, 0, 910, 911, 3, 136, 68, 0, 911, 912, 5, 40, 0, 0, 912, 913, 5, 43, 0, 0, 913, 920, 3, 136, 68, 0, 914, 915, 5, 48, 0, 0, 915, 916, 5, 44, 0, 0, 916, 917, 3, 136, 68, 0, 917, 918, 5, 116, 0, 0, 918, 919, 3, 136, 68, 0, 919, 921, 1, 0, 0, 0, 920, 914, 1, 0, 0, 0, 920, 921, 1, 0, 0, 0, 921, 922, 1, 0, 0, 0, 922, 923, 5, 114, 0, 0, 923, 983, 1, 0, 0, 0, 924, 925, 3, 136, 68, 0, 925, 926, 5, 40, 0, 0, 926, 927, 5, 44, 0, 0, 927, 928, 3, 136, 68, 0, 928, 929, 5, 116, 0, 0, 929, 936, 3, 136, 68, 0, 930, 931, 5, 48, 0, 0, 931, 932, 5, 44, 0, 0, 932, 933, 3, 136, 68, 0, 933, 934, 5, 116, 0, 0, 934, 935, 3, 136, 68, 0, 935, 937, 1, 0, 0, 0, 936, 930, 1, 0, 0, 0, 936, 937, 1, 0, 0, 0, 937, 938, 1, 0, 0, 0, 938, 939, 5, 114, 0, 0, 939, 983, 1, 0, 0, 0, 940, 941, 3, 136, 68, 0, 941, 942, 5, 40, 0, 0, 942, 943, 5, 26, 0, 0, 943, 945, 3, 136, 68, 0, 944, 946, 3, 28, 14, 0, 945, 944, 1, 0, 0, 0, 945, 946, 1, 0, 0, 0, 946, 953, 1, 0, 0, 0, 947, 948, 5, 48, 0, 0, 948, 949, 5, 44, 0, 0, 949, 950, 3, 136, 68, 0, 950, 951, 5, 116, 0, 0, 951, 952, 3, 136, 68, 0, 952, 954, 1, 0, 0, 0, 953, 947, 1, 0, 0, 0, 953, 954, 1, 0, 0, 0, 954, 955, 1, 0, 0, 0, 955, 956, 5, 114, 0, 0, 956, 983, 1, 0, 0, 0, 957, 958, 3, 136, 68, 0, 958, 959, 5, 40, 0, 0, 959, 960, 5, 33, 0, 0, 960, 961, 3, 136, 68, 0, 961, 962, 5, 114, 0, 0, 962, 983, 1, 0, 0, 0, 963, 964, 3, 136, 68, 0, 964, 966, 5, 40, 0, 0, 965, 967, 5, 1, 0, 0, 966, 965, 1, 0, 0, 0, 966, 967, 1, 0, 0, 0, 967, 968, 1, 0, 0, 0, 968, 969, 5, 5, 0, 0, 969, 970, 3, 136, 68, 0, 970, 971, 5, 116, 0, 0, 971, 978, 3, 136, 68, 0, 972, 973, 5, 48, 0, 0, 973, 974, 5, 44, 0, 0, 974, 975, 3, 136, 68, 0, 975, 976, 5, 116, 0, 0, 976, 977, 3, 136, 68, 0, 977, 979, 1, 0, 0, 0, 978, 972, 1, 0, 0, 0, 978, 979, 1, 0, 0, 0, 979, 980, 1, 0, 0, 0, 980, 981, 5, 114, 0, 0, 981, 983, 1, 0, 0, 0, 982, 910, 1, 0, 0, 0, 982, 924, 1, 0, 0, 0, 982, 940, 1, 0, 0, 0, 982, 957, 1, 0, 0, 0, 982, 963, 1, 0, 0, 0, 983, 117, 1, 0, 0, 0, 984, 985, 5, 33, 0, 0, 985, 986, 3, 136, 68, 0, 986, 987, 5, 40, 0, 0, 987, 988, 3, 136, 68, 0, 988, 989, 5, 116, 0, 0, 989, 991, 3, 136, 68, 0, 990, 992, 3, 114, 57, 0, 991, 990, 1, 0, 0, 0, 991, 992, 1, 0, 0, 0, 992, 993, 1, 0, 0, 0, 993, 994, 5, 114, 0, 0, 994, 119, 1, 0, 0, 0, 995, 1042, 3, 124, 62, 0, 996, 1042, 5, 93, 0, 0, 997, 1042, 5, 94, 0, 0, 998, 999, 5, 95, 0, 0, 999, 1042, 3, 138, 69, 0, 1000, 1001, 5, 96, 0, 0, 1001, 1002, 5, 123, 0, 0, 1002, 1003, 3, 136, 68, 0, 1003, 1004, 5, 124, 0, 0, 1004, 1042, 1, 0, 0, 0, 1005, 1006, 5, 97, 0, 0, 1006, 1007, 5, 123, 0, 0, 1007, 1009, 3, 136, 68, 0, 1008, 1010, 3, 28, 14, 0, 1009, 1008, 1, 0, 0, 0, 1009, 1010, 1, 0, 0, 0, 1010, 1011, 1, 0, 0, 0, 1011, 1012, 5, 124, 0, 0, 1012, 1042, 1, 0, 0, 0, 1013, 1014, 5, 21, 0, 0, 1014, 1015, 5, 123, 0, 0, 1015, 1016, 3, 136, 68, 0, 1016, 1017, 5, 124, 0, 0, 1017, 1042, 1, 0, 0, 0, 1018, 1019, 5, 98, 0, 0, 1019, 1020, 5, 123, 0, 0, 1020, 1021, 3, 120, 60, 0, 1021, 1022, 5, 124, 0, 0, 1022, 1042, 1, 0, 0, 0, 1023, 1024, 5, 99, 0, 0, 1024, 1025, 5, 123, 0, 0, 1025, 1026, 3, 120, 60, 0, 1026, 1027, 5, 124, 0, 0, 1027, 1042, 1, 0, 0, 0, 1028, 1029, 5, 100, 0, 0, 1029, 1033, 5, 117, 0, 0, 1030, 1032, 3, 122, 61, 0, 1031, 1030, 1, 0, 0, 0, 1032, 1035, 1, 0, 0, 0, 1033, 1031, 1, 0, 0, 0, 1033, 1034, 1, 0, 0, 0, 1034, 1036, 1, 0, 0, 0, 1035, 1033, 1, 0, 0, 0, 1036, 1042, 5, 118, 0, 0, 1037, 1039, 3, 136, 68, 0, 1038, 1040, 3, 28, 14, 0, 1039, 1038, 1, 0, 0, 0, 1039, 1040, 1, 0, 0, 0, 1040, 1042, 1, 0, 0, 0, 1041, 995, 1, 0, 0, 0, 1041, 996, 1, 0, 0, 0, 1041, 997, 1, 0, 0, 0, 1041, 998, 1, 0, 0, 0, 1041, 1000, 1, 0, 0, 0, 1041, 1005, 1, 0, 0, 0, 1041, 1013, 1, 0, 0, 0, 1041, 1018, 1, 0, 0, 0, 1041, 1023, 1, 0, 0, 0, 1041, 1028, 1, 0, 0, 0, 1041, 1037, 1, 0, 0, 0, 1042, 121, 1, 0, 0, 0, 1043, 1044, 3, 136, 68, 0, 1044, 1045, 5, 113, 0, 0, 1045, 1046, 3, 120, 60, 0, 1046, 1047, 5, 114, 0, 0, 1047, 123, 1, 0, 0, 0, 1048, 1049, 7, 4, 0, 0, 1049, 125, 1, 0, 0, 0, 1050, 1051, 7, 5, 0, 0, 1051, 127, 1, 0, 0, 0, 1052, 1061, 3, 138, 69, 0, 1053, 1061, 5, 127, 0, 0, 1054, 1061, 5, 128, 0, 0, 1055, 1061, 5, 109, 0, 0, 1056, 1061, 5, 110, 0, 0, 1057, 1061, 5, 111, 0, 0, 1058, 1061, 3, 130, 65, 0, 1059, 1061, 3, 134, 67, 0, 1060, 1052, 1, 0, 0, 0, 1060, 1053, 1, 0, 0, 0, 1060, 1054, 1, 0, 0, 0, 1060, 1055, 1, 0, 0, 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, 129, 1, 0, 0, 0, 1062, 1071, 5, 117, 0, 0, 1063, 1068, 3, 132, 66, 0, 1064, 1065, 5, 115, 0, 0, 1065, 1067, 3, 132, 66, 0, 1066, 1064, 1, 0, 0, 0, 1067, 1070, 1, 0, 0, 0, 1068, 1066, 1, 0, 0, 0, 1068, 1069, 1, 0, 0, 0, 1069, 1072, 1, 0, 0, 0, 1070, 1068, 1, 0, 0, 0, 1071, 1063, 1, 0, 0, 0, 1071, 1072, 1, 0, 0, 0, 1072, 1073, 1, 0, 0, 0, 1073, 1074, 5, 118, 0, 0, 1074, 131, 1, 0, 0, 0, 1075, 1076, 3, 138, 69, 0, 1076, 1077, 5, 113, 0, 0, 1077, 1078, 3, 128, 64, 0, 1078, 133, 1, 0, 0, 0, 1079, 1088, 5, 119, 0, 0, 1080, 1085, 3, 128, 64, 0, 1081, 1082, 5, 115, 0, 0, 1082, 1084, 3, 128, 64, 0, 1083, 1081, 1, 0, 0, 0, 1084, 1087, 1, 0, 0, 0, 1085, 1083, 1, 0, 0, 0, 1085, 1086, 1, 0, 0, 0, 1086, 1089, 1, 0, 0, 0, 1087, 1085, 1, 0, 0, 0, 1088, 1080, 1, 0, 0, 0, 1088, 1089, 1, 0, 0, 0, 1089, 1090, 1, 0, 0, 0, 1090, 1091, 5, 120, 0, 0, 1091, 135, 1, 0, 0, 0, 1092, 1093, 7, 6, 0, 0, 1093, 137, 1, 0, 0, 0, 1094, 1095, 5, 130, 0, 0, 1095, 139, 1, 0, 0, 0, 94, 152, 159, 180, 192, 204, 224, 232, 239, 245, 257, 260, 266, 277, 286, 296, 299, 301, 305, 313, 325, 330, 339, 342, 360, 372, 396, 399, 409, 413, 419, 426, 452, 459, 463, 468, 479, 485, 495, 500, 506, 517, 537, 564, 569, 580, 585, 592, 601, 614, 635, 638, 641, 648, 656, 687, 699, 713, 721, 733, 747, 757, 775, 779, 782, 786, 789, 798, 802, 806, 812, 822, 851, 870, 889, 892, 894, 905, 920, 936, 945, 953, 966, 978, 982, 991, 1009, 1033, 1039, 1041, 1060, 1068, 1071, 1085, 1088] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapabilityParser.ts b/src/capability-language/generated/QuixosCapabilityParser.ts index 3bd3db2..a912a47 100644 --- a/src/capability-language/generated/QuixosCapabilityParser.ts +++ b/src/capability-language/generated/QuixosCapabilityParser.ts @@ -1865,33 +1865,43 @@ export class QuixosCapabilityParser extends antlr.Parser { this.stringLiteral(); this.state = 504; this.match(QuixosCapabilityParser.ROOT); - this.state = 505; - this.interfaceType(); this.state = 506; - this.match(QuixosCapabilityParser.DOCUMENT); - this.state = 507; - this.stringLiteral(); + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 1) { + { + this.state = 505; + this.match(QuixosCapabilityParser.WORKSPACE); + } + } + this.state = 508; - this.match(QuixosCapabilityParser.OPERATION); + this.interfaceType(); this.state = 509; - this.stringLiteral(); + this.match(QuixosCapabilityParser.DOCUMENT); this.state = 510; + this.stringLiteral(); + this.state = 511; + this.match(QuixosCapabilityParser.OPERATION); + this.state = 512; + this.stringLiteral(); + this.state = 513; this.match(QuixosCapabilityParser.LBRACE); - this.state = 514; + this.state = 517; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 15872) !== 0) || _la === 73) { { { - this.state = 511; + this.state = 514; this.queryClause(); } } - this.state = 516; + this.state = 519; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 517; + this.state = 520; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1914,21 +1924,21 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 519; - this.match(QuixosCapabilityParser.QUERY); - this.state = 520; - this.identifier(); - this.state = 521; - this.match(QuixosCapabilityParser.ID); this.state = 522; - this.stringLiteral(); + this.match(QuixosCapabilityParser.QUERY); this.state = 523; - this.match(QuixosCapabilityParser.SPECIALIZE); - this.state = 524; this.identifier(); + this.state = 524; + this.match(QuixosCapabilityParser.ID); this.state = 525; - this.typeArguments(); + this.stringLiteral(); this.state = 526; + this.match(QuixosCapabilityParser.SPECIALIZE); + this.state = 527; + this.identifier(); + this.state = 528; + this.typeArguments(); + this.state = 529; this.match(QuixosCapabilityParser.SEMI); } } @@ -1950,96 +1960,96 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 58, QuixosCapabilityParser.RULE_queryClause); let _la: number; try { - this.state = 561; + this.state = 564; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.FRAGMENTS: this.enterOuterAlt(localContext, 1); { - this.state = 528; + this.state = 531; this.match(QuixosCapabilityParser.FRAGMENTS); - this.state = 529; + this.state = 532; this.stringLiteral(); - this.state = 530; + this.state = 533; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.VIEW: this.enterOuterAlt(localContext, 2); { - this.state = 532; + this.state = 535; this.match(QuixosCapabilityParser.VIEW); - this.state = 534; + this.state = 537; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 18) { { - this.state = 533; + this.state = 536; this.match(QuixosCapabilityParser.OBJECT); } } - this.state = 536; - this.identifier(); - this.state = 537; - this.match(QuixosCapabilityParser.AS); - this.state = 538; - this.interfaceType(); this.state = 539; + this.identifier(); + this.state = 540; + this.match(QuixosCapabilityParser.AS); + this.state = 541; + this.interfaceType(); + this.state = 542; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.MAX: this.enterOuterAlt(localContext, 3); { - this.state = 541; - this.match(QuixosCapabilityParser.MAX); - this.state = 542; - this.identifier(); - this.state = 543; - this.match(QuixosCapabilityParser.INTEGER); this.state = 544; + this.match(QuixosCapabilityParser.MAX); + this.state = 545; + this.identifier(); + this.state = 546; + this.match(QuixosCapabilityParser.INTEGER); + this.state = 547; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.ALLOW: this.enterOuterAlt(localContext, 4); { - this.state = 546; - this.match(QuixosCapabilityParser.ALLOW); - this.state = 547; - this.interfaceType(); - this.state = 548; - this.match(QuixosCapabilityParser.DOT); this.state = 549; - this.identifier(); + this.match(QuixosCapabilityParser.ALLOW); this.state = 550; - this.identifier(); + this.interfaceType(); this.state = 551; - this.stringLiteral(); + this.match(QuixosCapabilityParser.DOT); this.state = 552; + this.identifier(); + this.state = 553; + this.identifier(); + this.state = 554; + this.stringLiteral(); + this.state = 555; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 5); { - this.state = 554; + this.state = 557; this.match(QuixosCapabilityParser.WATCH); - this.state = 555; + this.state = 558; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.POLL: this.enterOuterAlt(localContext, 6); { - this.state = 556; - this.match(QuixosCapabilityParser.POLL); - this.state = 557; - this.match(QuixosCapabilityParser.INTEGER); - this.state = 558; - this.stringLiteral(); this.state = 559; + this.match(QuixosCapabilityParser.POLL); + this.state = 560; + this.match(QuixosCapabilityParser.INTEGER); + this.state = 561; + this.stringLiteral(); + this.state = 562; this.match(QuixosCapabilityParser.SEMI); } break; @@ -2067,61 +2077,61 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 563; - this.match(QuixosCapabilityParser.OPERATION); - this.state = 564; - this.identifier(); this.state = 566; + this.match(QuixosCapabilityParser.OPERATION); + this.state = 567; + this.identifier(); + this.state = 569; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 123) { { - this.state = 565; + this.state = 568; this.typeParameters(); } } - this.state = 568; - this.match(QuixosCapabilityParser.ID); - this.state = 569; - this.stringLiteral(); - this.state = 570; - this.match(QuixosCapabilityParser.COLON); this.state = 571; - this.valueType(); + this.match(QuixosCapabilityParser.ID); this.state = 572; - this.match(QuixosCapabilityParser.ARROW); + this.stringLiteral(); this.state = 573; - this.valueType(); + this.match(QuixosCapabilityParser.COLON); this.state = 574; - this.match(QuixosCapabilityParser.MODE); + this.valueType(); this.state = 575; - this.operationMode(); + this.match(QuixosCapabilityParser.ARROW); + this.state = 576; + this.valueType(); this.state = 577; + this.match(QuixosCapabilityParser.MODE); + this.state = 578; + this.operationMode(); + this.state = 580; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 67) { { - this.state = 576; + this.state = 579; this.eventClause(); } } - this.state = 579; - this.match(QuixosCapabilityParser.RECEIVER); - this.state = 580; - this.receiverRequirement(); this.state = 582; + this.match(QuixosCapabilityParser.RECEIVER); + this.state = 583; + this.receiverRequirement(); + this.state = 585; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 69) { { - this.state = 581; + this.state = 584; this.dependencyBlock(); } } - this.state = 584; + this.state = 587; this.match(QuixosCapabilityParser.SEMI); } } @@ -2145,43 +2155,43 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 586; - this.match(QuixosCapabilityParser.FUNCTION); - this.state = 587; - this.identifier(); this.state = 589; + this.match(QuixosCapabilityParser.FUNCTION); + this.state = 590; + this.identifier(); + this.state = 592; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 123) { { - this.state = 588; + this.state = 591; this.typeParameters(); } } - this.state = 591; - this.match(QuixosCapabilityParser.ID); - this.state = 592; - this.stringLiteral(); - this.state = 593; - this.match(QuixosCapabilityParser.COLON); this.state = 594; - this.valueType(); + this.match(QuixosCapabilityParser.ID); this.state = 595; - this.match(QuixosCapabilityParser.ARROW); + this.stringLiteral(); this.state = 596; + this.match(QuixosCapabilityParser.COLON); + this.state = 597; this.valueType(); this.state = 598; + this.match(QuixosCapabilityParser.ARROW); + this.state = 599; + this.valueType(); + this.state = 601; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 69) { { - this.state = 597; + this.state = 600; this.dependencyBlock(); } } - this.state = 600; + this.state = 603; this.match(QuixosCapabilityParser.SEMI); } } @@ -2205,33 +2215,33 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 602; - this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 603; - this.identifier(); - this.state = 604; - this.match(QuixosCapabilityParser.ID); this.state = 605; - this.stringLiteral(); + this.match(QuixosCapabilityParser.CONSTRUCTOR); this.state = 606; - this.match(QuixosCapabilityParser.CONSTRUCTS); - this.state = 607; this.identifier(); + this.state = 607; + this.match(QuixosCapabilityParser.ID); this.state = 608; - this.match(QuixosCapabilityParser.COLON); + this.stringLiteral(); this.state = 609; - this.valueType(); + this.match(QuixosCapabilityParser.CONSTRUCTS); + this.state = 610; + this.identifier(); this.state = 611; + this.match(QuixosCapabilityParser.COLON); + this.state = 612; + this.valueType(); + this.state = 614; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 69) { { - this.state = 610; + this.state = 613; this.dependencyBlock(); } } - this.state = 613; + this.state = 616; this.match(QuixosCapabilityParser.SEMI); } } @@ -2254,9 +2264,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 615; + this.state = 618; this.match(QuixosCapabilityParser.EMITS); - this.state = 616; + this.state = 619; this.valueType(); } } @@ -2280,7 +2290,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 618; + this.state = 621; _la = this.tokenStream.LA(1); if(!(((((_la - 81)) & ~0x1F) === 0 && ((1 << (_la - 81)) & 31) !== 0))) { this.errorHandler.recoverInline(this); @@ -2309,68 +2319,68 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 70, QuixosCapabilityParser.RULE_receiverRequirement); let _la: number; try { - this.state = 638; + this.state = 641; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ANY: this.enterOuterAlt(localContext, 1); { - this.state = 620; + this.state = 623; this.match(QuixosCapabilityParser.ANY); } break; case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 2); { - this.state = 621; + this.state = 624; this.match(QuixosCapabilityParser.ATOM); - this.state = 622; + this.state = 625; this.identifier(); } break; case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 623; + this.state = 626; this.match(QuixosCapabilityParser.OBJECT); - this.state = 624; + this.state = 627; this.identifier(); } break; case QuixosCapabilityParser.INTERFACES: this.enterOuterAlt(localContext, 4); { - this.state = 625; + this.state = 628; this.match(QuixosCapabilityParser.INTERFACES); - this.state = 626; + this.state = 629; this.match(QuixosCapabilityParser.LBRACK); - this.state = 635; + this.state = 638; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 65532) !== 0) || _la === 55 || _la === 129) { { - this.state = 627; + this.state = 630; this.interfaceType(); - this.state = 632; + this.state = 635; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 115) { { { - this.state = 628; + this.state = 631; this.match(QuixosCapabilityParser.COMMA); - this.state = 629; + this.state = 632; this.interfaceType(); } } - this.state = 634; + this.state = 637; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 637; + this.state = 640; this.match(QuixosCapabilityParser.RBRACK); } break; @@ -2398,21 +2408,21 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 640; + this.state = 643; this.identifier(); - this.state = 645; + this.state = 648; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 115) { { { - this.state = 641; + this.state = 644; this.match(QuixosCapabilityParser.COMMA); - this.state = 642; + this.state = 645; this.identifier(); } } - this.state = 647; + this.state = 650; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } @@ -2438,25 +2448,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 648; + this.state = 651; this.match(QuixosCapabilityParser.REQUIRES); - this.state = 649; + this.state = 652; this.match(QuixosCapabilityParser.LBRACE); - this.state = 653; + this.state = 656; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 5 || _la === 26 || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & 3073) !== 0)) { { { - this.state = 650; + this.state = 653; this.dependencyPort(); } } - this.state = 655; + this.state = 658; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 656; + this.state = 659; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2478,133 +2488,133 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 76, QuixosCapabilityParser.RULE_dependencyPort); let _la: number; try { - this.state = 710; + this.state = 713; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 658; - this.match(QuixosCapabilityParser.STATE); - this.state = 659; - this.identifier(); - this.state = 660; - this.match(QuixosCapabilityParser.ID); this.state = 661; - this.stringLiteral(); + this.match(QuixosCapabilityParser.STATE); this.state = 662; - this.match(QuixosCapabilityParser.COLON); + this.identifier(); this.state = 663; - this.valueType(); + this.match(QuixosCapabilityParser.ID); this.state = 664; - this.primitiveList(); + this.stringLiteral(); this.state = 665; + this.match(QuixosCapabilityParser.COLON); + this.state = 666; + this.valueType(); + this.state = 667; + this.primitiveList(); + this.state = 668; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 667; - this.match(QuixosCapabilityParser.EDGE); - this.state = 668; - this.identifier(); - this.state = 669; - this.match(QuixosCapabilityParser.ID); this.state = 670; - this.stringLiteral(); + this.match(QuixosCapabilityParser.EDGE); this.state = 671; - this.match(QuixosCapabilityParser.COLON); + this.identifier(); this.state = 672; - this.cardinality(); + this.match(QuixosCapabilityParser.ID); this.state = 673; - this.targetConstraint(); + this.stringLiteral(); this.state = 674; - this.primitiveList(); + this.match(QuixosCapabilityParser.COLON); this.state = 675; + this.cardinality(); + this.state = 676; + this.targetConstraint(); + this.state = 677; + this.primitiveList(); + this.state = 678; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 3); { - this.state = 677; - this.match(QuixosCapabilityParser.INTERFACE); - this.state = 678; - this.identifier(); - this.state = 679; - this.match(QuixosCapabilityParser.ID); this.state = 680; - this.stringLiteral(); + this.match(QuixosCapabilityParser.INTERFACE); this.state = 681; - this.match(QuixosCapabilityParser.COLON); - this.state = 682; this.identifier(); + this.state = 682; + this.match(QuixosCapabilityParser.ID); + this.state = 683; + this.stringLiteral(); this.state = 684; + this.match(QuixosCapabilityParser.COLON); + this.state = 685; + this.identifier(); + this.state = 687; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 123) { { - this.state = 683; + this.state = 686; this.typeArguments(); } } - this.state = 686; + this.state = 689; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONSTRUCTOR: this.enterOuterAlt(localContext, 4); { - this.state = 688; - this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 689; - this.identifier(); - this.state = 690; - this.match(QuixosCapabilityParser.ID); this.state = 691; - this.stringLiteral(); + this.match(QuixosCapabilityParser.CONSTRUCTOR); this.state = 692; - this.match(QuixosCapabilityParser.COLON); - this.state = 693; this.identifier(); + this.state = 693; + this.match(QuixosCapabilityParser.ID); + this.state = 694; + this.stringLiteral(); + this.state = 695; + this.match(QuixosCapabilityParser.COLON); this.state = 696; + this.identifier(); + this.state = 699; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 35) { { - this.state = 694; + this.state = 697; this.match(QuixosCapabilityParser.INPUT); - this.state = 695; + this.state = 698; this.valueType(); } } - this.state = 698; + this.state = 701; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.QUERY: this.enterOuterAlt(localContext, 5); { - this.state = 700; - this.match(QuixosCapabilityParser.QUERY); - this.state = 701; - this.identifier(); - this.state = 702; - this.match(QuixosCapabilityParser.ID); this.state = 703; - this.stringLiteral(); + this.match(QuixosCapabilityParser.QUERY); this.state = 704; - this.match(QuixosCapabilityParser.COLON); + this.identifier(); this.state = 705; - this.identifier(); + this.match(QuixosCapabilityParser.ID); this.state = 706; - this.match(QuixosCapabilityParser.DOT); + this.stringLiteral(); this.state = 707; - this.identifier(); + this.match(QuixosCapabilityParser.COLON); this.state = 708; + this.identifier(); + this.state = 709; + this.match(QuixosCapabilityParser.DOT); + this.state = 710; + this.identifier(); + this.state = 711; this.match(QuixosCapabilityParser.SEMI); } break; @@ -2632,27 +2642,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 712; + this.state = 715; this.match(QuixosCapabilityParser.LBRACK); - this.state = 713; + this.state = 716; this.primitive(); - this.state = 718; + this.state = 721; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 115) { { { - this.state = 714; + this.state = 717; this.match(QuixosCapabilityParser.COMMA); - this.state = 715; + this.state = 718; this.primitive(); } } - this.state = 720; + this.state = 723; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 721; + this.state = 724; this.match(QuixosCapabilityParser.RBRACK); } } @@ -2676,7 +2686,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 723; + this.state = 726; _la = this.tokenStream.LA(1); if(!(((((_la - 76)) & ~0x1F) === 0 && ((1 << (_la - 76)) & 223) !== 0))) { this.errorHandler.recoverInline(this); @@ -2706,9 +2716,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 725; + this.state = 728; this.match(QuixosCapabilityParser.SHARED); - this.state = 726; + this.state = 729; this.attachmentDecl(); } } @@ -2729,20 +2739,20 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new AttachmentDeclContext(this.context, this.state); this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_attachmentDecl); try { - this.state = 730; + this.state = 733; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 728; + this.state = 731; this.stateDecl(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 729; + this.state = 732; this.edgeDecl(); } break; @@ -2770,39 +2780,39 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 732; - this.match(QuixosCapabilityParser.STATE); - this.state = 733; - this.identifier(); - this.state = 734; - this.match(QuixosCapabilityParser.ID); this.state = 735; - this.stringLiteral(); + this.match(QuixosCapabilityParser.STATE); this.state = 736; - this.match(QuixosCapabilityParser.ON); - this.state = 737; this.identifier(); + this.state = 737; + this.match(QuixosCapabilityParser.ID); this.state = 738; - this.match(QuixosCapabilityParser.COLON); + this.stringLiteral(); this.state = 739; - this.valueType(); + this.match(QuixosCapabilityParser.ON); this.state = 740; - this.match(QuixosCapabilityParser.POLICY); + this.identifier(); this.state = 741; - this.storagePolicy(); + this.match(QuixosCapabilityParser.COLON); + this.state = 742; + this.valueType(); + this.state = 743; + this.match(QuixosCapabilityParser.POLICY); this.state = 744; + this.storagePolicy(); + this.state = 747; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 54) { { - this.state = 742; + this.state = 745; this.match(QuixosCapabilityParser.DEFAULT); - this.state = 743; + this.state = 746; this.jsonLiteral(); } } - this.state = 746; + this.state = 749; this.match(QuixosCapabilityParser.SEMI); } } @@ -2823,26 +2833,26 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new StoragePolicyContext(this.context, this.state); this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_storagePolicy); try { - this.state = 754; + this.state = 757; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.OPTIMISTIC_REGISTER: this.enterOuterAlt(localContext, 1); { - this.state = 748; + this.state = 751; this.match(QuixosCapabilityParser.OPTIMISTIC_REGISTER); } break; case QuixosCapabilityParser.CRDT: this.enterOuterAlt(localContext, 2); { - this.state = 749; - this.match(QuixosCapabilityParser.CRDT); - this.state = 750; - this.match(QuixosCapabilityParser.LPAREN); - this.state = 751; - this.valueType(); this.state = 752; + this.match(QuixosCapabilityParser.CRDT); + this.state = 753; + this.match(QuixosCapabilityParser.LPAREN); + this.state = 754; + this.valueType(); + this.state = 755; this.match(QuixosCapabilityParser.RPAREN); } break; @@ -2869,21 +2879,21 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 756; - this.match(QuixosCapabilityParser.EDGE); - this.state = 757; - this.identifier(); - this.state = 758; - this.match(QuixosCapabilityParser.ID); this.state = 759; - this.stringLiteral(); + this.match(QuixosCapabilityParser.EDGE); this.state = 760; - this.match(QuixosCapabilityParser.LBRACE); + this.identifier(); this.state = 761; - this.edgeEndpoint(); + this.match(QuixosCapabilityParser.ID); this.state = 762; - this.edgeEndpoint(); + this.stringLiteral(); this.state = 763; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 764; + this.edgeEndpoint(); + this.state = 765; + this.edgeEndpoint(); + this.state = 766; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2907,73 +2917,73 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 765; - this.targetConstraint(); - this.state = 766; - this.match(QuixosCapabilityParser.PROJECTION); - this.state = 767; - this.identifier(); this.state = 768; - this.match(QuixosCapabilityParser.ID); + this.targetConstraint(); this.state = 769; - this.stringLiteral(); + this.match(QuixosCapabilityParser.PROJECTION); this.state = 770; - this.cardinality(); + this.identifier(); + this.state = 771; + this.match(QuixosCapabilityParser.ID); this.state = 772; + this.stringLiteral(); + this.state = 773; + this.cardinality(); + this.state = 775; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 92) { - { - this.state = 771; - this.match(QuixosCapabilityParser.ORDERED); - } - } - - this.state = 776; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 60) { { this.state = 774; - this.match(QuixosCapabilityParser.ON_DELETE); - this.state = 775; - this.stringLiteral(); + this.match(QuixosCapabilityParser.ORDERED); } } this.state = 779; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 61) { + if (_la === 60) { { + this.state = 777; + this.match(QuixosCapabilityParser.ON_DELETE); this.state = 778; - this.match(QuixosCapabilityParser.RETAIN_OTHER); + this.stringLiteral(); } } - this.state = 783; + this.state = 782; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 62) { + if (_la === 61) { { this.state = 781; - this.match(QuixosCapabilityParser.KEYED); - this.state = 782; - this.stringLiteral(); + this.match(QuixosCapabilityParser.RETAIN_OTHER); } } this.state = 786; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); + if (_la === 62) { + { + this.state = 784; + this.match(QuixosCapabilityParser.KEYED); + this.state = 785; + this.stringLiteral(); + } + } + + this.state = 789; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); if (_la === 63) { { - this.state = 785; + this.state = 788; this.match(QuixosCapabilityParser.PUBLIC_TRAVERSAL); } } - this.state = 788; + this.state = 791; this.match(QuixosCapabilityParser.SEMI); } } @@ -2997,65 +3007,65 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 790; - this.match(QuixosCapabilityParser.CONFORM); - this.state = 791; - this.identifier(); - this.state = 792; - this.match(QuixosCapabilityParser.AS); this.state = 793; + this.match(QuixosCapabilityParser.CONFORM); + this.state = 794; this.identifier(); this.state = 795; + this.match(QuixosCapabilityParser.AS); + this.state = 796; + this.identifier(); + this.state = 798; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 123) { { - this.state = 794; + this.state = 797; this.typeArguments(); } } - this.state = 799; + this.state = 802; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 64) { { - this.state = 797; + this.state = 800; this.match(QuixosCapabilityParser.ID); - this.state = 798; + this.state = 801; this.stringLiteral(); } } - this.state = 803; + this.state = 806; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 59) { { - this.state = 801; + this.state = 804; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); - this.state = 802; + this.state = 805; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 805; + this.state = 808; this.match(QuixosCapabilityParser.LBRACE); - this.state = 809; + this.state = 812; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (((((_la - 38)) & ~0x1F) === 0 && ((1 << (_la - 38)) & 2057) !== 0)) { { { - this.state = 806; + this.state = 809; this.conformanceItem(); } } - this.state = 811; + this.state = 814; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 812; + this.state = 815; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3076,36 +3086,36 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ConformanceItemContext(this.context, this.state); this.enterRule(localContext, 96, QuixosCapabilityParser.RULE_conformanceItem); try { - this.state = 819; + this.state = 822; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 69, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 70, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 814; + this.state = 817; this.match(QuixosCapabilityParser.PRIVATE); - this.state = 815; + this.state = 818; this.attachmentDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 816; + this.state = 819; this.operationBindingDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 817; + this.state = 820; this.stateFieldBindingDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 818; + this.state = 821; this.relationshipMaterializationDecl(); } break; @@ -3130,17 +3140,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 821; - this.match(QuixosCapabilityParser.BIND); - this.state = 822; - this.identifier(); - this.state = 823; - this.match(QuixosCapabilityParser.TO); this.state = 824; - this.match(QuixosCapabilityParser.STATE); + this.match(QuixosCapabilityParser.BIND); this.state = 825; this.identifier(); this.state = 826; + this.match(QuixosCapabilityParser.TO); + this.state = 827; + this.match(QuixosCapabilityParser.STATE); + this.state = 828; + this.identifier(); + this.state = 829; this.match(QuixosCapabilityParser.SEMI); } } @@ -3163,31 +3173,31 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 828; - this.match(QuixosCapabilityParser.MATERIALIZE); - this.state = 829; - this.identifier(); - this.state = 830; - this.match(QuixosCapabilityParser.IF); this.state = 831; - this.match(QuixosCapabilityParser.ABSENT); + this.match(QuixosCapabilityParser.MATERIALIZE); this.state = 832; - this.match(QuixosCapabilityParser.USING); - this.state = 833; - this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 834; this.identifier(); + this.state = 833; + this.match(QuixosCapabilityParser.IF); + this.state = 834; + this.match(QuixosCapabilityParser.ABSENT); this.state = 835; - this.match(QuixosCapabilityParser.VIA); + this.match(QuixosCapabilityParser.USING); this.state = 836; - this.match(QuixosCapabilityParser.EDGE); + this.match(QuixosCapabilityParser.CONSTRUCTOR); this.state = 837; this.identifier(); this.state = 838; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.VIA); this.state = 839; - this.identifier(); + this.match(QuixosCapabilityParser.EDGE); this.state = 840; + this.identifier(); + this.state = 841; + this.match(QuixosCapabilityParser.DOT); + this.state = 842; + this.identifier(); + this.state = 843; this.match(QuixosCapabilityParser.SEMI); } } @@ -3211,27 +3221,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 842; - this.match(QuixosCapabilityParser.BIND); - this.state = 843; - this.memberOperationRef(); - this.state = 844; - this.match(QuixosCapabilityParser.TO); this.state = 845; - this.operationProvider(); + this.match(QuixosCapabilityParser.BIND); + this.state = 846; + this.memberOperationRef(); + this.state = 847; + this.match(QuixosCapabilityParser.TO); this.state = 848; + this.operationProvider(); + this.state = 851; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 16) { { - this.state = 846; + this.state = 849; this.match(QuixosCapabilityParser.QUERY_REASON); - this.state = 847; + this.state = 850; this.stringLiteral(); } } - this.state = 850; + this.state = 853; this.match(QuixosCapabilityParser.SEMI); } } @@ -3254,11 +3264,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 852; + this.state = 855; this.identifier(); - this.state = 853; + this.state = 856; this.match(QuixosCapabilityParser.DOT); - this.state = 854; + this.state = 857; this.operationName(); } } @@ -3279,7 +3289,7 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new OperationNameContext(this.context, this.state); this.enterRule(localContext, 106, QuixosCapabilityParser.RULE_operationName); try { - this.state = 867; + this.state = 870; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.RESULT_BYTES: @@ -3300,77 +3310,77 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 1); { - this.state = 856; + this.state = 859; this.identifier(); } break; case QuixosCapabilityParser.CALL: this.enterOuterAlt(localContext, 2); { - this.state = 857; + this.state = 860; this.match(QuixosCapabilityParser.CALL); } break; case QuixosCapabilityParser.GET: this.enterOuterAlt(localContext, 3); { - this.state = 858; + this.state = 861; this.match(QuixosCapabilityParser.GET); } break; case QuixosCapabilityParser.SET: this.enterOuterAlt(localContext, 4); { - this.state = 859; + this.state = 862; this.match(QuixosCapabilityParser.SET); } break; case QuixosCapabilityParser.RESOLVE: this.enterOuterAlt(localContext, 5); { - this.state = 860; + this.state = 863; this.match(QuixosCapabilityParser.RESOLVE); } break; case QuixosCapabilityParser.CONNECT: this.enterOuterAlt(localContext, 6); { - this.state = 861; + this.state = 864; this.match(QuixosCapabilityParser.CONNECT); } break; case QuixosCapabilityParser.DISCONNECT: this.enterOuterAlt(localContext, 7); { - this.state = 862; + this.state = 865; this.match(QuixosCapabilityParser.DISCONNECT); } break; case QuixosCapabilityParser.WATCH_START: this.enterOuterAlt(localContext, 8); { - this.state = 863; + this.state = 866; this.match(QuixosCapabilityParser.WATCH_START); } break; case QuixosCapabilityParser.WATCH_STOP: this.enterOuterAlt(localContext, 9); { - this.state = 864; + this.state = 867; this.match(QuixosCapabilityParser.WATCH_STOP); } break; case QuixosCapabilityParser.SUBSCRIBE: this.enterOuterAlt(localContext, 10); { - this.state = 865; + this.state = 868; this.match(QuixosCapabilityParser.SUBSCRIBE); } break; case QuixosCapabilityParser.UNSUBSCRIBE: this.enterOuterAlt(localContext, 11); { - this.state = 866; + this.state = 869; this.match(QuixosCapabilityParser.UNSUBSCRIBE); } break; @@ -3396,66 +3406,66 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 108, QuixosCapabilityParser.RULE_operationProvider); let _la: number; try { - this.state = 891; + this.state = 894; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 869; - this.match(QuixosCapabilityParser.STATE); - this.state = 870; - this.identifier(); - this.state = 871; - this.match(QuixosCapabilityParser.DOT); this.state = 872; + this.match(QuixosCapabilityParser.STATE); + this.state = 873; + this.identifier(); + this.state = 874; + this.match(QuixosCapabilityParser.DOT); + this.state = 875; this.statePrimitive(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 874; - this.match(QuixosCapabilityParser.EDGE); - this.state = 875; - this.identifier(); - this.state = 876; - this.match(QuixosCapabilityParser.DOT); this.state = 877; - this.identifier(); + this.match(QuixosCapabilityParser.EDGE); this.state = 878; - this.match(QuixosCapabilityParser.DOT); + this.identifier(); this.state = 879; + this.match(QuixosCapabilityParser.DOT); + this.state = 880; + this.identifier(); + this.state = 881; + this.match(QuixosCapabilityParser.DOT); + this.state = 882; this.edgePrimitive(); } break; case QuixosCapabilityParser.PACKAGE: this.enterOuterAlt(localContext, 3); { - this.state = 881; - this.match(QuixosCapabilityParser.PACKAGE); - this.state = 882; - this.identifier(); - this.state = 883; - this.match(QuixosCapabilityParser.DOT); this.state = 884; + this.match(QuixosCapabilityParser.PACKAGE); + this.state = 885; this.identifier(); this.state = 886; + this.match(QuixosCapabilityParser.DOT); + this.state = 887; + this.identifier(); + this.state = 889; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 123) { { - this.state = 885; + this.state = 888; this.typeArguments(); } } - this.state = 889; + this.state = 892; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 46) { { - this.state = 888; + this.state = 891; this.dependencyBindingBlock(); } } @@ -3486,7 +3496,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 893; + this.state = 896; _la = this.tokenStream.LA(1); if(!(((((_la - 76)) & ~0x1F) === 0 && ((1 << (_la - 76)) & 195) !== 0))) { this.errorHandler.recoverInline(this); @@ -3517,7 +3527,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 895; + this.state = 898; _la = this.tokenStream.LA(1); if(!(((((_la - 78)) & ~0x1F) === 0 && ((1 << (_la - 78)) & 55) !== 0))) { this.errorHandler.recoverInline(this); @@ -3548,25 +3558,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 897; + this.state = 900; this.match(QuixosCapabilityParser.WITH); - this.state = 898; + this.state = 901; this.match(QuixosCapabilityParser.LBRACE); - this.state = 902; + this.state = 905; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 65532) !== 0) || _la === 55 || _la === 129) { { { - this.state = 899; + this.state = 902; this.dependencyBinding(); } } - this.state = 904; + this.state = 907; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 905; + this.state = 908; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3588,171 +3598,181 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 116, QuixosCapabilityParser.RULE_dependencyBinding); let _la: number; try { - this.state = 976; + this.state = 982; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 81, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 83, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 907; - this.identifier(); - this.state = 908; - this.match(QuixosCapabilityParser.TO); - this.state = 909; - this.match(QuixosCapabilityParser.STATE); this.state = 910; this.identifier(); - this.state = 917; + this.state = 911; + this.match(QuixosCapabilityParser.TO); + this.state = 912; + this.match(QuixosCapabilityParser.STATE); + this.state = 913; + this.identifier(); + this.state = 920; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 48) { { - this.state = 911; - this.match(QuixosCapabilityParser.VIA); - this.state = 912; - this.match(QuixosCapabilityParser.EDGE); - this.state = 913; - this.identifier(); this.state = 914; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.VIA); this.state = 915; + this.match(QuixosCapabilityParser.EDGE); + this.state = 916; + this.identifier(); + this.state = 917; + this.match(QuixosCapabilityParser.DOT); + this.state = 918; this.identifier(); } } - this.state = 919; + this.state = 922; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 921; - this.identifier(); - this.state = 922; - this.match(QuixosCapabilityParser.TO); - this.state = 923; - this.match(QuixosCapabilityParser.EDGE); this.state = 924; this.identifier(); this.state = 925; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.TO); this.state = 926; + this.match(QuixosCapabilityParser.EDGE); + this.state = 927; this.identifier(); - this.state = 933; + this.state = 928; + this.match(QuixosCapabilityParser.DOT); + this.state = 929; + this.identifier(); + this.state = 936; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 48) { { - this.state = 927; - this.match(QuixosCapabilityParser.VIA); - this.state = 928; - this.match(QuixosCapabilityParser.EDGE); - this.state = 929; - this.identifier(); this.state = 930; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.VIA); this.state = 931; + this.match(QuixosCapabilityParser.EDGE); + this.state = 932; + this.identifier(); + this.state = 933; + this.match(QuixosCapabilityParser.DOT); + this.state = 934; this.identifier(); } } - this.state = 935; + this.state = 938; this.match(QuixosCapabilityParser.SEMI); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 937; - this.identifier(); - this.state = 938; - this.match(QuixosCapabilityParser.TO); - this.state = 939; - this.match(QuixosCapabilityParser.INTERFACE); this.state = 940; this.identifier(); + this.state = 941; + this.match(QuixosCapabilityParser.TO); this.state = 942; + this.match(QuixosCapabilityParser.INTERFACE); + this.state = 943; + this.identifier(); + this.state = 945; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 123) { { - this.state = 941; + this.state = 944; this.typeArguments(); } } - this.state = 950; + this.state = 953; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 48) { { - this.state = 944; - this.match(QuixosCapabilityParser.VIA); - this.state = 945; - this.match(QuixosCapabilityParser.EDGE); - this.state = 946; - this.identifier(); this.state = 947; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.VIA); this.state = 948; + this.match(QuixosCapabilityParser.EDGE); + this.state = 949; + this.identifier(); + this.state = 950; + this.match(QuixosCapabilityParser.DOT); + this.state = 951; this.identifier(); } } - this.state = 952; + this.state = 955; this.match(QuixosCapabilityParser.SEMI); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 954; - this.identifier(); - this.state = 955; - this.match(QuixosCapabilityParser.TO); - this.state = 956; - this.match(QuixosCapabilityParser.CONSTRUCTOR); this.state = 957; this.identifier(); this.state = 958; + this.match(QuixosCapabilityParser.TO); + this.state = 959; + this.match(QuixosCapabilityParser.CONSTRUCTOR); + this.state = 960; + this.identifier(); + this.state = 961; this.match(QuixosCapabilityParser.SEMI); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 960; - this.identifier(); - this.state = 961; - this.match(QuixosCapabilityParser.TO); - this.state = 962; - this.match(QuixosCapabilityParser.QUERY); this.state = 963; this.identifier(); this.state = 964; - this.match(QuixosCapabilityParser.DOT); - this.state = 965; + this.match(QuixosCapabilityParser.TO); + this.state = 966; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 1) { + { + this.state = 965; + this.match(QuixosCapabilityParser.WORKSPACE); + } + } + + this.state = 968; + this.match(QuixosCapabilityParser.QUERY); + this.state = 969; this.identifier(); - this.state = 972; + this.state = 970; + this.match(QuixosCapabilityParser.DOT); + this.state = 971; + this.identifier(); + this.state = 978; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 48) { { - this.state = 966; + this.state = 972; this.match(QuixosCapabilityParser.VIA); - this.state = 967; + this.state = 973; this.match(QuixosCapabilityParser.EDGE); - this.state = 968; + this.state = 974; this.identifier(); - this.state = 969; + this.state = 975; this.match(QuixosCapabilityParser.DOT); - this.state = 970; + this.state = 976; this.identifier(); } } - this.state = 974; + this.state = 980; this.match(QuixosCapabilityParser.SEMI); } break; @@ -3778,29 +3798,29 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 978; + this.state = 984; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 979; - this.identifier(); - this.state = 980; - this.match(QuixosCapabilityParser.TO); - this.state = 981; - this.identifier(); - this.state = 982; - this.match(QuixosCapabilityParser.DOT); - this.state = 983; - this.identifier(); this.state = 985; + this.identifier(); + this.state = 986; + this.match(QuixosCapabilityParser.TO); + this.state = 987; + this.identifier(); + this.state = 988; + this.match(QuixosCapabilityParser.DOT); + this.state = 989; + this.identifier(); + this.state = 991; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 46) { { - this.state = 984; + this.state = 990; this.dependencyBindingBlock(); } } - this.state = 987; + this.state = 993; this.match(QuixosCapabilityParser.SEMI); } } @@ -3822,7 +3842,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 120, QuixosCapabilityParser.RULE_valueType); let _la: number; try { - this.state = 1035; + this.state = 1041; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.BOOL: @@ -3835,130 +3855,130 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.UINT64: this.enterOuterAlt(localContext, 1); { - this.state = 989; + this.state = 995; this.scalarType(); } break; case QuixosCapabilityParser.UNIT: this.enterOuterAlt(localContext, 2); { - this.state = 990; + this.state = 996; this.match(QuixosCapabilityParser.UNIT); } break; case QuixosCapabilityParser.WATCH_HANDLE: this.enterOuterAlt(localContext, 3); { - this.state = 991; + this.state = 997; this.match(QuixosCapabilityParser.WATCH_HANDLE); } break; case QuixosCapabilityParser.MESSAGE: this.enterOuterAlt(localContext, 4); { - this.state = 992; + this.state = 998; this.match(QuixosCapabilityParser.MESSAGE); - this.state = 993; + this.state = 999; this.stringLiteral(); } break; case QuixosCapabilityParser.ATOM_REF: this.enterOuterAlt(localContext, 5); { - this.state = 994; + this.state = 1000; this.match(QuixosCapabilityParser.ATOM_REF); - this.state = 995; + this.state = 1001; this.match(QuixosCapabilityParser.LT); - this.state = 996; + this.state = 1002; this.identifier(); - this.state = 997; + this.state = 1003; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.INTERFACE_REF: this.enterOuterAlt(localContext, 6); { - this.state = 999; + this.state = 1005; this.match(QuixosCapabilityParser.INTERFACE_REF); - this.state = 1000; + this.state = 1006; this.match(QuixosCapabilityParser.LT); - this.state = 1001; + this.state = 1007; this.identifier(); - this.state = 1003; + this.state = 1009; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 123) { { - this.state = 1002; + this.state = 1008; this.typeArguments(); } } - this.state = 1005; + this.state = 1011; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.REF: this.enterOuterAlt(localContext, 7); { - this.state = 1007; + this.state = 1013; this.match(QuixosCapabilityParser.REF); - this.state = 1008; + this.state = 1014; this.match(QuixosCapabilityParser.LT); - this.state = 1009; + this.state = 1015; this.identifier(); - this.state = 1010; + this.state = 1016; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.OPTIONAL: this.enterOuterAlt(localContext, 8); { - this.state = 1012; + this.state = 1018; this.match(QuixosCapabilityParser.OPTIONAL); - this.state = 1013; + this.state = 1019; this.match(QuixosCapabilityParser.LT); - this.state = 1014; + this.state = 1020; this.valueType(); - this.state = 1015; + this.state = 1021; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.LIST: this.enterOuterAlt(localContext, 9); { - this.state = 1017; + this.state = 1023; this.match(QuixosCapabilityParser.LIST); - this.state = 1018; + this.state = 1024; this.match(QuixosCapabilityParser.LT); - this.state = 1019; + this.state = 1025; this.valueType(); - this.state = 1020; + this.state = 1026; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.RECORD: this.enterOuterAlt(localContext, 10); { - this.state = 1022; + this.state = 1028; this.match(QuixosCapabilityParser.RECORD); - this.state = 1023; + this.state = 1029; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1027; + this.state = 1033; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 65532) !== 0) || _la === 55 || _la === 129) { { { - this.state = 1024; + this.state = 1030; this.recordField(); } } - this.state = 1029; + this.state = 1035; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1030; + this.state = 1036; this.match(QuixosCapabilityParser.RBRACE); } break; @@ -3980,14 +4000,14 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 11); { - this.state = 1031; + this.state = 1037; this.identifier(); - this.state = 1033; + this.state = 1039; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 123) { { - this.state = 1032; + this.state = 1038; this.typeArguments(); } } @@ -4017,13 +4037,13 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1037; + this.state = 1043; this.identifier(); - this.state = 1038; + this.state = 1044; this.match(QuixosCapabilityParser.COLON); - this.state = 1039; + this.state = 1045; this.valueType(); - this.state = 1040; + this.state = 1046; this.match(QuixosCapabilityParser.SEMI); } } @@ -4047,7 +4067,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1042; + this.state = 1048; _la = this.tokenStream.LA(1); if(!(((((_la - 101)) & ~0x1F) === 0 && ((1 << (_la - 101)) & 255) !== 0))) { this.errorHandler.recoverInline(this); @@ -4078,7 +4098,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1044; + this.state = 1050; _la = this.tokenStream.LA(1); if(!(((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 15) !== 0))) { this.errorHandler.recoverInline(this); @@ -4106,62 +4126,62 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new JsonLiteralContext(this.context, this.state); this.enterRule(localContext, 128, QuixosCapabilityParser.RULE_jsonLiteral); try { - this.state = 1054; + this.state = 1060; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STRING_LITERAL: this.enterOuterAlt(localContext, 1); { - this.state = 1046; + this.state = 1052; this.stringLiteral(); } break; case QuixosCapabilityParser.INTEGER: this.enterOuterAlt(localContext, 2); { - this.state = 1047; + this.state = 1053; this.match(QuixosCapabilityParser.INTEGER); } break; case QuixosCapabilityParser.JSON_NUMBER: this.enterOuterAlt(localContext, 3); { - this.state = 1048; + this.state = 1054; this.match(QuixosCapabilityParser.JSON_NUMBER); } break; case QuixosCapabilityParser.TRUE: this.enterOuterAlt(localContext, 4); { - this.state = 1049; + this.state = 1055; this.match(QuixosCapabilityParser.TRUE); } break; case QuixosCapabilityParser.FALSE: this.enterOuterAlt(localContext, 5); { - this.state = 1050; + this.state = 1056; this.match(QuixosCapabilityParser.FALSE); } break; case QuixosCapabilityParser.NULL: this.enterOuterAlt(localContext, 6); { - this.state = 1051; + this.state = 1057; this.match(QuixosCapabilityParser.NULL); } break; case QuixosCapabilityParser.LBRACE: this.enterOuterAlt(localContext, 7); { - this.state = 1052; + this.state = 1058; this.jsonObject(); } break; case QuixosCapabilityParser.LBRACK: this.enterOuterAlt(localContext, 8); { - this.state = 1053; + this.state = 1059; this.jsonArray(); } break; @@ -4189,35 +4209,35 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1056; + this.state = 1062; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1065; + this.state = 1071; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 130) { { - this.state = 1057; + this.state = 1063; this.jsonMember(); - this.state = 1062; + this.state = 1068; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 115) { { { - this.state = 1058; + this.state = 1064; this.match(QuixosCapabilityParser.COMMA); - this.state = 1059; + this.state = 1065; this.jsonMember(); } } - this.state = 1064; + this.state = 1070; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1067; + this.state = 1073; this.match(QuixosCapabilityParser.RBRACE); } } @@ -4240,11 +4260,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1069; + this.state = 1075; this.stringLiteral(); - this.state = 1070; + this.state = 1076; this.match(QuixosCapabilityParser.COLON); - this.state = 1071; + this.state = 1077; this.jsonLiteral(); } } @@ -4268,35 +4288,35 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1073; + this.state = 1079; this.match(QuixosCapabilityParser.LBRACK); - this.state = 1082; + this.state = 1088; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (((((_la - 109)) & ~0x1F) === 0 && ((1 << (_la - 109)) & 2884871) !== 0)) { { - this.state = 1074; + this.state = 1080; this.jsonLiteral(); - this.state = 1079; + this.state = 1085; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 115) { { { - this.state = 1075; + this.state = 1081; this.match(QuixosCapabilityParser.COMMA); - this.state = 1076; + this.state = 1082; this.jsonLiteral(); } } - this.state = 1081; + this.state = 1087; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1084; + this.state = 1090; this.match(QuixosCapabilityParser.RBRACK); } } @@ -4320,7 +4340,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1086; + this.state = 1092; _la = this.tokenStream.LA(1); if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 65532) !== 0) || _la === 55 || _la === 129)) { this.errorHandler.recoverInline(this); @@ -4350,7 +4370,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1088; + this.state = 1094; this.match(QuixosCapabilityParser.STRING_LITERAL); } } @@ -4369,7 +4389,7 @@ export class QuixosCapabilityParser extends antlr.Parser { } public static readonly _serializedATN: number[] = [ - 4,1,133,1091,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,133,1097,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, @@ -4409,376 +4429,379 @@ export class QuixosCapabilityParser extends antlr.Parser { 24,3,24,464,8,24,1,25,5,25,467,8,25,10,25,12,25,470,9,25,1,25,1, 25,1,25,1,25,1,25,1,25,1,25,1,25,3,25,480,8,25,1,25,1,25,5,25,484, 8,25,10,25,12,25,487,9,25,1,25,1,25,1,26,1,26,1,26,1,26,1,26,3,26, - 496,8,26,1,27,1,27,1,27,3,27,501,8,27,1,27,1,27,1,27,1,27,1,27,1, - 27,1,27,1,27,1,27,1,27,5,27,513,8,27,10,27,12,27,516,9,27,1,27,1, - 27,1,28,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,3,29,535,8,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,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,3,29,562,8,29,1,30,1,30,1,30,3,30,567,8,30, - 1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,3,30,578,8,30,1,30, - 1,30,1,30,3,30,583,8,30,1,30,1,30,1,31,1,31,1,31,3,31,590,8,31,1, - 31,1,31,1,31,1,31,1,31,1,31,1,31,3,31,599,8,31,1,31,1,31,1,32,1, - 32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,3,32,612,8,32,1,32,1,32,1, - 33,1,33,1,33,1,34,1,34,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1, - 35,1,35,5,35,631,8,35,10,35,12,35,634,9,35,3,35,636,8,35,1,35,3, - 35,639,8,35,1,36,1,36,1,36,5,36,644,8,36,10,36,12,36,647,9,36,1, - 37,1,37,1,37,5,37,652,8,37,10,37,12,37,655,9,37,1,37,1,37,1,38,1, + 496,8,26,1,27,1,27,1,27,3,27,501,8,27,1,27,1,27,1,27,1,27,3,27,507, + 8,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,5,27,516,8,27,10,27,12,27, + 519,9,27,1,27,1,27,1,28,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,3,29,538,8,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,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,3,29,565,8,29,1,30,1,30, + 1,30,3,30,570,8,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30, + 3,30,581,8,30,1,30,1,30,1,30,3,30,586,8,30,1,30,1,30,1,31,1,31,1, + 31,3,31,593,8,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,3,31,602,8,31, + 1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,3,32,615, + 8,32,1,32,1,32,1,33,1,33,1,33,1,34,1,34,1,35,1,35,1,35,1,35,1,35, + 1,35,1,35,1,35,1,35,1,35,5,35,634,8,35,10,35,12,35,637,9,35,3,35, + 639,8,35,1,35,3,35,642,8,35,1,36,1,36,1,36,5,36,647,8,36,10,36,12, + 36,650,9,36,1,37,1,37,1,37,5,37,655,8,37,10,37,12,37,658,9,37,1, + 37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1, 38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1, - 38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,3,38,685, - 8,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,3,38,697, - 8,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38, - 3,38,711,8,38,1,39,1,39,1,39,1,39,5,39,717,8,39,10,39,12,39,720, - 9,39,1,39,1,39,1,40,1,40,1,41,1,41,1,41,1,42,1,42,3,42,731,8,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,3,43, - 745,8,43,1,43,1,43,1,44,1,44,1,44,1,44,1,44,1,44,3,44,755,8,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,46,1, - 46,1,46,1,46,3,46,773,8,46,1,46,1,46,3,46,777,8,46,1,46,3,46,780, - 8,46,1,46,1,46,3,46,784,8,46,1,46,3,46,787,8,46,1,46,1,46,1,47,1, - 47,1,47,1,47,1,47,3,47,796,8,47,1,47,1,47,3,47,800,8,47,1,47,1,47, - 3,47,804,8,47,1,47,1,47,5,47,808,8,47,10,47,12,47,811,9,47,1,47, - 1,47,1,48,1,48,1,48,1,48,1,48,3,48,820,8,48,1,49,1,49,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,50,1,50, - 1,50,1,50,1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,51,3,51,849,8,51, - 1,51,1,51,1,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,53,1,53, - 1,53,1,53,1,53,1,53,3,53,868,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,1,54,1,54,1,54,1,54,1,54,3,54,887, - 8,54,1,54,3,54,890,8,54,3,54,892,8,54,1,55,1,55,1,56,1,56,1,57,1, - 57,1,57,5,57,901,8,57,10,57,12,57,904,9,57,1,57,1,57,1,58,1,58,1, - 58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,918,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,934, - 8,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,943,8,58,1,58,1,58, - 1,58,1,58,1,58,1,58,3,58,951,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,3,58,973,8,58,1,58,1,58,3,58,977,8,58,1,59,1,59,1,59,1,59,1, - 59,1,59,1,59,3,59,986,8,59,1,59,1,59,1,60,1,60,1,60,1,60,1,60,1, - 60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,3,60,1004,8,60,1,60,1, - 60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1, - 60,1,60,1,60,1,60,1,60,1,60,5,60,1026,8,60,10,60,12,60,1029,9,60, - 1,60,1,60,1,60,3,60,1034,8,60,3,60,1036,8,60,1,61,1,61,1,61,1,61, - 1,61,1,62,1,62,1,63,1,63,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64, - 3,64,1055,8,64,1,65,1,65,1,65,1,65,5,65,1061,8,65,10,65,12,65,1064, - 9,65,3,65,1066,8,65,1,65,1,65,1,66,1,66,1,66,1,66,1,67,1,67,1,67, - 1,67,5,67,1078,8,67,10,67,12,67,1081,9,67,3,67,1083,8,67,1,67,1, - 67,1,68,1,68,1,69,1,69,1,69,0,0,70,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, - 0,7,1,0,81,85,2,0,76,80,82,83,2,0,76,77,82,83,2,0,78,80,82,83,1, - 0,101,108,1,0,88,91,3,0,2,15,55,55,129,129,1170,0,152,1,0,0,0,2, - 154,1,0,0,0,4,164,1,0,0,0,6,168,1,0,0,0,8,192,1,0,0,0,10,204,1,0, - 0,0,12,206,1,0,0,0,14,213,1,0,0,0,16,224,1,0,0,0,18,226,1,0,0,0, - 20,239,1,0,0,0,22,271,1,0,0,0,24,301,1,0,0,0,26,303,1,0,0,0,28,307, - 1,0,0,0,30,325,1,0,0,0,32,327,1,0,0,0,34,339,1,0,0,0,36,342,1,0, - 0,0,38,360,1,0,0,0,40,396,1,0,0,0,42,399,1,0,0,0,44,424,1,0,0,0, - 46,452,1,0,0,0,48,463,1,0,0,0,50,468,1,0,0,0,52,495,1,0,0,0,54,497, - 1,0,0,0,56,519,1,0,0,0,58,561,1,0,0,0,60,563,1,0,0,0,62,586,1,0, - 0,0,64,602,1,0,0,0,66,615,1,0,0,0,68,618,1,0,0,0,70,638,1,0,0,0, - 72,640,1,0,0,0,74,648,1,0,0,0,76,710,1,0,0,0,78,712,1,0,0,0,80,723, - 1,0,0,0,82,725,1,0,0,0,84,730,1,0,0,0,86,732,1,0,0,0,88,754,1,0, - 0,0,90,756,1,0,0,0,92,765,1,0,0,0,94,790,1,0,0,0,96,819,1,0,0,0, - 98,821,1,0,0,0,100,828,1,0,0,0,102,842,1,0,0,0,104,852,1,0,0,0,106, - 867,1,0,0,0,108,891,1,0,0,0,110,893,1,0,0,0,112,895,1,0,0,0,114, - 897,1,0,0,0,116,976,1,0,0,0,118,978,1,0,0,0,120,1035,1,0,0,0,122, - 1037,1,0,0,0,124,1042,1,0,0,0,126,1044,1,0,0,0,128,1054,1,0,0,0, - 130,1056,1,0,0,0,132,1069,1,0,0,0,134,1073,1,0,0,0,136,1086,1,0, - 0,0,138,1088,1,0,0,0,140,141,3,6,3,0,141,142,5,0,0,1,142,153,1,0, - 0,0,143,144,3,20,10,0,144,145,5,0,0,1,145,153,1,0,0,0,146,147,3, - 50,25,0,147,148,5,0,0,1,148,153,1,0,0,0,149,150,3,2,1,0,150,151, - 5,0,0,1,151,153,1,0,0,0,152,140,1,0,0,0,152,143,1,0,0,0,152,146, - 1,0,0,0,152,149,1,0,0,0,153,1,1,0,0,0,154,155,5,22,0,0,155,159,5, - 117,0,0,156,158,3,8,4,0,157,156,1,0,0,0,158,161,1,0,0,0,159,157, - 1,0,0,0,159,160,1,0,0,0,160,162,1,0,0,0,161,159,1,0,0,0,162,163, - 5,118,0,0,163,3,1,0,0,0,164,165,5,23,0,0,165,166,3,138,69,0,166, - 167,5,114,0,0,167,5,1,0,0,0,168,169,5,1,0,0,169,170,3,136,68,0,170, - 171,5,64,0,0,171,172,3,138,69,0,172,173,5,58,0,0,173,174,3,138,69, - 0,174,175,5,57,0,0,175,176,3,138,69,0,176,180,5,117,0,0,177,179, - 3,8,4,0,178,177,1,0,0,0,179,182,1,0,0,0,180,178,1,0,0,0,180,181, - 1,0,0,0,181,183,1,0,0,0,182,180,1,0,0,0,183,184,5,118,0,0,184,7, - 1,0,0,0,185,193,3,4,2,0,186,193,3,18,9,0,187,193,3,10,5,0,188,193, - 3,82,41,0,189,193,3,94,47,0,190,193,3,118,59,0,191,193,3,32,16,0, - 192,185,1,0,0,0,192,186,1,0,0,0,192,187,1,0,0,0,192,188,1,0,0,0, - 192,189,1,0,0,0,192,190,1,0,0,0,192,191,1,0,0,0,193,9,1,0,0,0,194, - 195,5,23,0,0,195,196,5,26,0,0,196,197,3,136,68,0,197,198,5,114,0, - 0,198,205,1,0,0,0,199,200,5,23,0,0,200,201,5,28,0,0,201,202,3,136, - 68,0,202,203,5,114,0,0,203,205,1,0,0,0,204,194,1,0,0,0,204,199,1, - 0,0,0,205,11,1,0,0,0,206,207,5,24,0,0,207,208,5,25,0,0,208,209,3, - 136,68,0,209,210,5,64,0,0,210,211,3,138,69,0,211,212,5,114,0,0,212, - 13,1,0,0,0,213,214,5,24,0,0,214,215,5,26,0,0,215,216,3,136,68,0, - 216,217,5,58,0,0,217,218,3,138,69,0,218,219,5,114,0,0,219,15,1,0, - 0,0,220,225,3,10,5,0,221,225,3,12,6,0,222,225,3,14,7,0,223,225,3, - 32,16,0,224,220,1,0,0,0,224,221,1,0,0,0,224,222,1,0,0,0,224,223, - 1,0,0,0,225,17,1,0,0,0,226,227,5,25,0,0,227,228,3,136,68,0,228,229, - 5,64,0,0,229,232,3,138,69,0,230,231,5,65,0,0,231,233,3,138,69,0, - 232,230,1,0,0,0,232,233,1,0,0,0,233,234,1,0,0,0,234,235,5,114,0, - 0,235,19,1,0,0,0,236,238,3,16,8,0,237,236,1,0,0,0,238,241,1,0,0, - 0,239,237,1,0,0,0,239,240,1,0,0,0,240,242,1,0,0,0,241,239,1,0,0, - 0,242,243,5,26,0,0,243,245,3,136,68,0,244,246,3,22,11,0,245,244, - 1,0,0,0,245,246,1,0,0,0,246,247,1,0,0,0,247,248,5,64,0,0,248,249, - 3,138,69,0,249,250,5,58,0,0,250,260,3,138,69,0,251,252,5,69,0,0, - 252,257,3,26,13,0,253,254,5,115,0,0,254,256,3,26,13,0,255,253,1, - 0,0,0,256,259,1,0,0,0,257,255,1,0,0,0,257,258,1,0,0,0,258,261,1, - 0,0,0,259,257,1,0,0,0,260,251,1,0,0,0,260,261,1,0,0,0,261,262,1, - 0,0,0,262,266,5,117,0,0,263,265,3,34,17,0,264,263,1,0,0,0,265,268, - 1,0,0,0,266,264,1,0,0,0,266,267,1,0,0,0,267,269,1,0,0,0,268,266, - 1,0,0,0,269,270,5,118,0,0,270,21,1,0,0,0,271,272,5,123,0,0,272,277, - 3,24,12,0,273,274,5,115,0,0,274,276,3,24,12,0,275,273,1,0,0,0,276, - 279,1,0,0,0,277,275,1,0,0,0,277,278,1,0,0,0,278,280,1,0,0,0,279, - 277,1,0,0,0,280,281,5,124,0,0,281,23,1,0,0,0,282,283,5,29,0,0,283, - 286,3,136,68,0,284,285,5,113,0,0,285,287,5,19,0,0,286,284,1,0,0, - 0,286,287,1,0,0,0,287,302,1,0,0,0,288,289,5,18,0,0,289,299,3,136, - 68,0,290,291,5,20,0,0,291,296,3,26,13,0,292,293,5,125,0,0,293,295, - 3,26,13,0,294,292,1,0,0,0,295,298,1,0,0,0,296,294,1,0,0,0,296,297, - 1,0,0,0,297,300,1,0,0,0,298,296,1,0,0,0,299,290,1,0,0,0,299,300, - 1,0,0,0,300,302,1,0,0,0,301,282,1,0,0,0,301,288,1,0,0,0,302,25,1, - 0,0,0,303,305,3,136,68,0,304,306,3,28,14,0,305,304,1,0,0,0,305,306, - 1,0,0,0,306,27,1,0,0,0,307,308,5,123,0,0,308,313,3,30,15,0,309,310, - 5,115,0,0,310,312,3,30,15,0,311,309,1,0,0,0,312,315,1,0,0,0,313, - 311,1,0,0,0,313,314,1,0,0,0,314,316,1,0,0,0,315,313,1,0,0,0,316, - 317,5,124,0,0,317,29,1,0,0,0,318,319,5,25,0,0,319,326,3,136,68,0, - 320,321,5,26,0,0,321,326,3,26,13,0,322,323,5,18,0,0,323,326,3,136, - 68,0,324,326,3,120,60,0,325,318,1,0,0,0,325,320,1,0,0,0,325,322, - 1,0,0,0,325,324,1,0,0,0,326,31,1,0,0,0,327,328,5,17,0,0,328,330, - 3,136,68,0,329,331,3,22,11,0,330,329,1,0,0,0,330,331,1,0,0,0,331, - 332,1,0,0,0,332,333,5,126,0,0,333,334,3,120,60,0,334,335,5,114,0, - 0,335,33,1,0,0,0,336,340,3,38,19,0,337,340,3,42,21,0,338,340,3,36, - 18,0,339,336,1,0,0,0,339,337,1,0,0,0,339,338,1,0,0,0,340,35,1,0, - 0,0,341,343,5,39,0,0,342,341,1,0,0,0,342,343,1,0,0,0,343,344,1,0, - 0,0,344,345,5,31,0,0,345,346,3,136,68,0,346,347,5,64,0,0,347,348, - 3,138,69,0,348,349,5,113,0,0,349,350,3,120,60,0,350,351,5,112,0, - 0,351,352,3,120,60,0,352,353,5,117,0,0,353,354,5,81,0,0,354,355, - 5,64,0,0,355,356,3,138,69,0,356,357,5,114,0,0,357,358,5,118,0,0, - 358,37,1,0,0,0,359,361,3,44,22,0,360,359,1,0,0,0,360,361,1,0,0,0, - 361,362,1,0,0,0,362,363,5,29,0,0,363,364,3,136,68,0,364,365,5,64, - 0,0,365,366,3,138,69,0,366,367,5,113,0,0,367,368,3,120,60,0,368, - 372,5,117,0,0,369,371,3,40,20,0,370,369,1,0,0,0,371,374,1,0,0,0, - 372,370,1,0,0,0,372,373,1,0,0,0,373,375,1,0,0,0,374,372,1,0,0,0, - 375,376,5,118,0,0,376,39,1,0,0,0,377,378,5,71,0,0,378,379,5,64,0, - 0,379,380,3,138,69,0,380,381,5,114,0,0,381,397,1,0,0,0,382,383,5, - 72,0,0,383,384,5,64,0,0,384,385,3,138,69,0,385,386,5,114,0,0,386, - 397,1,0,0,0,387,388,5,73,0,0,388,389,5,74,0,0,389,390,5,64,0,0,390, - 391,3,138,69,0,391,392,5,75,0,0,392,393,5,64,0,0,393,394,3,138,69, - 0,394,395,5,114,0,0,395,397,1,0,0,0,396,377,1,0,0,0,396,382,1,0, - 0,0,396,387,1,0,0,0,397,41,1,0,0,0,398,400,3,44,22,0,399,398,1,0, - 0,0,399,400,1,0,0,0,400,401,1,0,0,0,401,402,5,30,0,0,402,403,3,136, - 68,0,403,404,5,64,0,0,404,405,3,138,69,0,405,406,5,113,0,0,406,407, - 3,126,63,0,407,409,3,48,24,0,408,410,5,92,0,0,409,408,1,0,0,0,409, - 410,1,0,0,0,410,413,1,0,0,0,411,412,5,62,0,0,412,414,3,138,69,0, - 413,411,1,0,0,0,413,414,1,0,0,0,414,415,1,0,0,0,415,419,5,117,0, - 0,416,418,3,46,23,0,417,416,1,0,0,0,418,421,1,0,0,0,419,417,1,0, - 0,0,419,420,1,0,0,0,420,422,1,0,0,0,421,419,1,0,0,0,422,423,5,118, - 0,0,423,43,1,0,0,0,424,426,5,14,0,0,425,427,5,15,0,0,426,425,1,0, - 0,0,426,427,1,0,0,0,427,45,1,0,0,0,428,429,5,78,0,0,429,430,5,64, - 0,0,430,431,3,138,69,0,431,432,5,114,0,0,432,453,1,0,0,0,433,434, - 5,79,0,0,434,435,5,64,0,0,435,436,3,138,69,0,436,437,5,114,0,0,437, - 453,1,0,0,0,438,439,5,80,0,0,439,440,5,64,0,0,440,441,3,138,69,0, - 441,442,5,114,0,0,442,453,1,0,0,0,443,444,5,73,0,0,444,445,5,74, - 0,0,445,446,5,64,0,0,446,447,3,138,69,0,447,448,5,75,0,0,448,449, - 5,64,0,0,449,450,3,138,69,0,450,451,5,114,0,0,451,453,1,0,0,0,452, - 428,1,0,0,0,452,433,1,0,0,0,452,438,1,0,0,0,452,443,1,0,0,0,453, - 47,1,0,0,0,454,455,5,25,0,0,455,464,3,136,68,0,456,457,5,26,0,0, - 457,459,3,136,68,0,458,460,3,28,14,0,459,458,1,0,0,0,459,460,1,0, - 0,0,460,464,1,0,0,0,461,462,5,18,0,0,462,464,3,136,68,0,463,454, - 1,0,0,0,463,456,1,0,0,0,463,461,1,0,0,0,464,49,1,0,0,0,465,467,3, - 16,8,0,466,465,1,0,0,0,467,470,1,0,0,0,468,466,1,0,0,0,468,469,1, - 0,0,0,469,471,1,0,0,0,470,468,1,0,0,0,471,472,5,28,0,0,472,473,3, - 136,68,0,473,474,5,64,0,0,474,475,3,138,69,0,475,476,5,58,0,0,476, - 479,3,138,69,0,477,478,5,59,0,0,478,480,5,127,0,0,479,477,1,0,0, - 0,479,480,1,0,0,0,480,481,1,0,0,0,481,485,5,117,0,0,482,484,3,52, - 26,0,483,482,1,0,0,0,484,487,1,0,0,0,485,483,1,0,0,0,485,486,1,0, - 0,0,486,488,1,0,0,0,487,485,1,0,0,0,488,489,5,118,0,0,489,51,1,0, - 0,0,490,496,3,60,30,0,491,496,3,62,31,0,492,496,3,64,32,0,493,496, - 3,54,27,0,494,496,3,56,28,0,495,490,1,0,0,0,495,491,1,0,0,0,495, - 492,1,0,0,0,495,493,1,0,0,0,495,494,1,0,0,0,496,53,1,0,0,0,497,498, - 5,5,0,0,498,500,3,136,68,0,499,501,3,22,11,0,500,499,1,0,0,0,500, - 501,1,0,0,0,501,502,1,0,0,0,502,503,5,64,0,0,503,504,3,138,69,0, - 504,505,5,7,0,0,505,506,3,26,13,0,506,507,5,8,0,0,507,508,3,138, - 69,0,508,509,5,31,0,0,509,510,3,138,69,0,510,514,5,117,0,0,511,513, - 3,58,29,0,512,511,1,0,0,0,513,516,1,0,0,0,514,512,1,0,0,0,514,515, - 1,0,0,0,515,517,1,0,0,0,516,514,1,0,0,0,517,518,5,118,0,0,518,55, - 1,0,0,0,519,520,5,5,0,0,520,521,3,136,68,0,521,522,5,64,0,0,522, - 523,3,138,69,0,523,524,5,6,0,0,524,525,3,136,68,0,525,526,3,28,14, - 0,526,527,5,114,0,0,527,57,1,0,0,0,528,529,5,9,0,0,529,530,3,138, - 69,0,530,531,5,114,0,0,531,562,1,0,0,0,532,534,5,10,0,0,533,535, - 5,18,0,0,534,533,1,0,0,0,534,535,1,0,0,0,535,536,1,0,0,0,536,537, - 3,136,68,0,537,538,5,37,0,0,538,539,3,26,13,0,539,540,5,114,0,0, - 540,562,1,0,0,0,541,542,5,11,0,0,542,543,3,136,68,0,543,544,5,127, - 0,0,544,545,5,114,0,0,545,562,1,0,0,0,546,547,5,12,0,0,547,548,3, - 26,13,0,548,549,5,116,0,0,549,550,3,136,68,0,550,551,3,136,68,0, - 551,552,3,138,69,0,552,553,5,114,0,0,553,562,1,0,0,0,554,555,5,73, - 0,0,555,562,5,114,0,0,556,557,5,13,0,0,557,558,5,127,0,0,558,559, - 3,138,69,0,559,560,5,114,0,0,560,562,1,0,0,0,561,528,1,0,0,0,561, - 532,1,0,0,0,561,541,1,0,0,0,561,546,1,0,0,0,561,554,1,0,0,0,561, - 556,1,0,0,0,562,59,1,0,0,0,563,564,5,31,0,0,564,566,3,136,68,0,565, - 567,3,22,11,0,566,565,1,0,0,0,566,567,1,0,0,0,567,568,1,0,0,0,568, - 569,5,64,0,0,569,570,3,138,69,0,570,571,5,113,0,0,571,572,3,120, - 60,0,572,573,5,112,0,0,573,574,3,120,60,0,574,575,5,66,0,0,575,577, - 3,68,34,0,576,578,3,66,33,0,577,576,1,0,0,0,577,578,1,0,0,0,578, - 579,1,0,0,0,579,580,5,68,0,0,580,582,3,70,35,0,581,583,3,74,37,0, - 582,581,1,0,0,0,582,583,1,0,0,0,583,584,1,0,0,0,584,585,5,114,0, - 0,585,61,1,0,0,0,586,587,5,32,0,0,587,589,3,136,68,0,588,590,3,22, - 11,0,589,588,1,0,0,0,589,590,1,0,0,0,590,591,1,0,0,0,591,592,5,64, - 0,0,592,593,3,138,69,0,593,594,5,113,0,0,594,595,3,120,60,0,595, - 596,5,112,0,0,596,598,3,120,60,0,597,599,3,74,37,0,598,597,1,0,0, - 0,598,599,1,0,0,0,599,600,1,0,0,0,600,601,5,114,0,0,601,63,1,0,0, - 0,602,603,5,33,0,0,603,604,3,136,68,0,604,605,5,64,0,0,605,606,3, - 138,69,0,606,607,5,34,0,0,607,608,3,136,68,0,608,609,5,113,0,0,609, - 611,3,120,60,0,610,612,3,74,37,0,611,610,1,0,0,0,611,612,1,0,0,0, - 612,613,1,0,0,0,613,614,5,114,0,0,614,65,1,0,0,0,615,616,5,67,0, - 0,616,617,3,120,60,0,617,67,1,0,0,0,618,619,7,0,0,0,619,69,1,0,0, - 0,620,639,5,70,0,0,621,622,5,25,0,0,622,639,3,136,68,0,623,624,5, - 18,0,0,624,639,3,136,68,0,625,626,5,27,0,0,626,635,5,119,0,0,627, - 632,3,26,13,0,628,629,5,115,0,0,629,631,3,26,13,0,630,628,1,0,0, - 0,631,634,1,0,0,0,632,630,1,0,0,0,632,633,1,0,0,0,633,636,1,0,0, - 0,634,632,1,0,0,0,635,627,1,0,0,0,635,636,1,0,0,0,636,637,1,0,0, - 0,637,639,5,120,0,0,638,620,1,0,0,0,638,621,1,0,0,0,638,623,1,0, - 0,0,638,625,1,0,0,0,639,71,1,0,0,0,640,645,3,136,68,0,641,642,5, - 115,0,0,642,644,3,136,68,0,643,641,1,0,0,0,644,647,1,0,0,0,645,643, - 1,0,0,0,645,646,1,0,0,0,646,73,1,0,0,0,647,645,1,0,0,0,648,649,5, - 69,0,0,649,653,5,117,0,0,650,652,3,76,38,0,651,650,1,0,0,0,652,655, - 1,0,0,0,653,651,1,0,0,0,653,654,1,0,0,0,654,656,1,0,0,0,655,653, - 1,0,0,0,656,657,5,118,0,0,657,75,1,0,0,0,658,659,5,43,0,0,659,660, - 3,136,68,0,660,661,5,64,0,0,661,662,3,138,69,0,662,663,5,113,0,0, - 663,664,3,120,60,0,664,665,3,78,39,0,665,666,5,114,0,0,666,711,1, - 0,0,0,667,668,5,44,0,0,668,669,3,136,68,0,669,670,5,64,0,0,670,671, - 3,138,69,0,671,672,5,113,0,0,672,673,3,126,63,0,673,674,3,48,24, - 0,674,675,3,78,39,0,675,676,5,114,0,0,676,711,1,0,0,0,677,678,5, - 26,0,0,678,679,3,136,68,0,679,680,5,64,0,0,680,681,3,138,69,0,681, - 682,5,113,0,0,682,684,3,136,68,0,683,685,3,28,14,0,684,683,1,0,0, - 0,684,685,1,0,0,0,685,686,1,0,0,0,686,687,5,114,0,0,687,711,1,0, - 0,0,688,689,5,33,0,0,689,690,3,136,68,0,690,691,5,64,0,0,691,692, - 3,138,69,0,692,693,5,113,0,0,693,696,3,136,68,0,694,695,5,35,0,0, - 695,697,3,120,60,0,696,694,1,0,0,0,696,697,1,0,0,0,697,698,1,0,0, - 0,698,699,5,114,0,0,699,711,1,0,0,0,700,701,5,5,0,0,701,702,3,136, - 68,0,702,703,5,64,0,0,703,704,3,138,69,0,704,705,5,113,0,0,705,706, - 3,136,68,0,706,707,5,116,0,0,707,708,3,136,68,0,708,709,5,114,0, - 0,709,711,1,0,0,0,710,658,1,0,0,0,710,667,1,0,0,0,710,677,1,0,0, - 0,710,688,1,0,0,0,710,700,1,0,0,0,711,77,1,0,0,0,712,713,5,119,0, - 0,713,718,3,80,40,0,714,715,5,115,0,0,715,717,3,80,40,0,716,714, - 1,0,0,0,717,720,1,0,0,0,718,716,1,0,0,0,718,719,1,0,0,0,719,721, - 1,0,0,0,720,718,1,0,0,0,721,722,5,120,0,0,722,79,1,0,0,0,723,724, - 7,1,0,0,724,81,1,0,0,0,725,726,5,42,0,0,726,727,3,84,42,0,727,83, - 1,0,0,0,728,731,3,86,43,0,729,731,3,90,45,0,730,728,1,0,0,0,730, - 729,1,0,0,0,731,85,1,0,0,0,732,733,5,43,0,0,733,734,3,136,68,0,734, - 735,5,64,0,0,735,736,3,138,69,0,736,737,5,52,0,0,737,738,3,136,68, - 0,738,739,5,113,0,0,739,740,3,120,60,0,740,741,5,53,0,0,741,744, - 3,88,44,0,742,743,5,54,0,0,743,745,3,128,64,0,744,742,1,0,0,0,744, - 745,1,0,0,0,745,746,1,0,0,0,746,747,5,114,0,0,747,87,1,0,0,0,748, - 755,5,86,0,0,749,750,5,87,0,0,750,751,5,121,0,0,751,752,3,120,60, - 0,752,753,5,122,0,0,753,755,1,0,0,0,754,748,1,0,0,0,754,749,1,0, - 0,0,755,89,1,0,0,0,756,757,5,44,0,0,757,758,3,136,68,0,758,759,5, - 64,0,0,759,760,3,138,69,0,760,761,5,117,0,0,761,762,3,92,46,0,762, - 763,3,92,46,0,763,764,5,118,0,0,764,91,1,0,0,0,765,766,3,48,24,0, - 766,767,5,45,0,0,767,768,3,136,68,0,768,769,5,64,0,0,769,770,3,138, - 69,0,770,772,3,126,63,0,771,773,5,92,0,0,772,771,1,0,0,0,772,773, - 1,0,0,0,773,776,1,0,0,0,774,775,5,60,0,0,775,777,3,138,69,0,776, - 774,1,0,0,0,776,777,1,0,0,0,777,779,1,0,0,0,778,780,5,61,0,0,779, - 778,1,0,0,0,779,780,1,0,0,0,780,783,1,0,0,0,781,782,5,62,0,0,782, - 784,3,138,69,0,783,781,1,0,0,0,783,784,1,0,0,0,784,786,1,0,0,0,785, - 787,5,63,0,0,786,785,1,0,0,0,786,787,1,0,0,0,787,788,1,0,0,0,788, - 789,5,114,0,0,789,93,1,0,0,0,790,791,5,36,0,0,791,792,3,136,68,0, - 792,793,5,37,0,0,793,795,3,136,68,0,794,796,3,28,14,0,795,794,1, - 0,0,0,795,796,1,0,0,0,796,799,1,0,0,0,797,798,5,64,0,0,798,800,3, - 138,69,0,799,797,1,0,0,0,799,800,1,0,0,0,800,803,1,0,0,0,801,802, - 5,59,0,0,802,804,5,127,0,0,803,801,1,0,0,0,803,804,1,0,0,0,804,805, - 1,0,0,0,805,809,5,117,0,0,806,808,3,96,48,0,807,806,1,0,0,0,808, - 811,1,0,0,0,809,807,1,0,0,0,809,810,1,0,0,0,810,812,1,0,0,0,811, - 809,1,0,0,0,812,813,5,118,0,0,813,95,1,0,0,0,814,815,5,41,0,0,815, - 820,3,84,42,0,816,820,3,102,51,0,817,820,3,98,49,0,818,820,3,100, - 50,0,819,814,1,0,0,0,819,816,1,0,0,0,819,817,1,0,0,0,819,818,1,0, - 0,0,820,97,1,0,0,0,821,822,5,38,0,0,822,823,3,136,68,0,823,824,5, - 40,0,0,824,825,5,43,0,0,825,826,3,136,68,0,826,827,5,114,0,0,827, - 99,1,0,0,0,828,829,5,49,0,0,829,830,3,136,68,0,830,831,5,50,0,0, - 831,832,5,51,0,0,832,833,5,47,0,0,833,834,5,33,0,0,834,835,3,136, - 68,0,835,836,5,48,0,0,836,837,5,44,0,0,837,838,3,136,68,0,838,839, - 5,116,0,0,839,840,3,136,68,0,840,841,5,114,0,0,841,101,1,0,0,0,842, - 843,5,38,0,0,843,844,3,104,52,0,844,845,5,40,0,0,845,848,3,108,54, - 0,846,847,5,16,0,0,847,849,3,138,69,0,848,846,1,0,0,0,848,849,1, - 0,0,0,849,850,1,0,0,0,850,851,5,114,0,0,851,103,1,0,0,0,852,853, - 3,136,68,0,853,854,5,116,0,0,854,855,3,106,53,0,855,105,1,0,0,0, - 856,868,3,136,68,0,857,868,5,81,0,0,858,868,5,71,0,0,859,868,5,72, - 0,0,860,868,5,78,0,0,861,868,5,79,0,0,862,868,5,80,0,0,863,868,5, - 82,0,0,864,868,5,83,0,0,865,868,5,84,0,0,866,868,5,85,0,0,867,856, - 1,0,0,0,867,857,1,0,0,0,867,858,1,0,0,0,867,859,1,0,0,0,867,860, - 1,0,0,0,867,861,1,0,0,0,867,862,1,0,0,0,867,863,1,0,0,0,867,864, - 1,0,0,0,867,865,1,0,0,0,867,866,1,0,0,0,868,107,1,0,0,0,869,870, - 5,43,0,0,870,871,3,136,68,0,871,872,5,116,0,0,872,873,3,110,55,0, - 873,892,1,0,0,0,874,875,5,44,0,0,875,876,3,136,68,0,876,877,5,116, - 0,0,877,878,3,136,68,0,878,879,5,116,0,0,879,880,3,112,56,0,880, - 892,1,0,0,0,881,882,5,28,0,0,882,883,3,136,68,0,883,884,5,116,0, - 0,884,886,3,136,68,0,885,887,3,28,14,0,886,885,1,0,0,0,886,887,1, - 0,0,0,887,889,1,0,0,0,888,890,3,114,57,0,889,888,1,0,0,0,889,890, - 1,0,0,0,890,892,1,0,0,0,891,869,1,0,0,0,891,874,1,0,0,0,891,881, - 1,0,0,0,892,109,1,0,0,0,893,894,7,2,0,0,894,111,1,0,0,0,895,896, - 7,3,0,0,896,113,1,0,0,0,897,898,5,46,0,0,898,902,5,117,0,0,899,901, - 3,116,58,0,900,899,1,0,0,0,901,904,1,0,0,0,902,900,1,0,0,0,902,903, - 1,0,0,0,903,905,1,0,0,0,904,902,1,0,0,0,905,906,5,118,0,0,906,115, - 1,0,0,0,907,908,3,136,68,0,908,909,5,40,0,0,909,910,5,43,0,0,910, - 917,3,136,68,0,911,912,5,48,0,0,912,913,5,44,0,0,913,914,3,136,68, - 0,914,915,5,116,0,0,915,916,3,136,68,0,916,918,1,0,0,0,917,911,1, - 0,0,0,917,918,1,0,0,0,918,919,1,0,0,0,919,920,5,114,0,0,920,977, - 1,0,0,0,921,922,3,136,68,0,922,923,5,40,0,0,923,924,5,44,0,0,924, - 925,3,136,68,0,925,926,5,116,0,0,926,933,3,136,68,0,927,928,5,48, - 0,0,928,929,5,44,0,0,929,930,3,136,68,0,930,931,5,116,0,0,931,932, - 3,136,68,0,932,934,1,0,0,0,933,927,1,0,0,0,933,934,1,0,0,0,934,935, - 1,0,0,0,935,936,5,114,0,0,936,977,1,0,0,0,937,938,3,136,68,0,938, - 939,5,40,0,0,939,940,5,26,0,0,940,942,3,136,68,0,941,943,3,28,14, - 0,942,941,1,0,0,0,942,943,1,0,0,0,943,950,1,0,0,0,944,945,5,48,0, - 0,945,946,5,44,0,0,946,947,3,136,68,0,947,948,5,116,0,0,948,949, - 3,136,68,0,949,951,1,0,0,0,950,944,1,0,0,0,950,951,1,0,0,0,951,952, - 1,0,0,0,952,953,5,114,0,0,953,977,1,0,0,0,954,955,3,136,68,0,955, - 956,5,40,0,0,956,957,5,33,0,0,957,958,3,136,68,0,958,959,5,114,0, - 0,959,977,1,0,0,0,960,961,3,136,68,0,961,962,5,40,0,0,962,963,5, - 5,0,0,963,964,3,136,68,0,964,965,5,116,0,0,965,972,3,136,68,0,966, - 967,5,48,0,0,967,968,5,44,0,0,968,969,3,136,68,0,969,970,5,116,0, - 0,970,971,3,136,68,0,971,973,1,0,0,0,972,966,1,0,0,0,972,973,1,0, - 0,0,973,974,1,0,0,0,974,975,5,114,0,0,975,977,1,0,0,0,976,907,1, - 0,0,0,976,921,1,0,0,0,976,937,1,0,0,0,976,954,1,0,0,0,976,960,1, - 0,0,0,977,117,1,0,0,0,978,979,5,33,0,0,979,980,3,136,68,0,980,981, - 5,40,0,0,981,982,3,136,68,0,982,983,5,116,0,0,983,985,3,136,68,0, - 984,986,3,114,57,0,985,984,1,0,0,0,985,986,1,0,0,0,986,987,1,0,0, - 0,987,988,5,114,0,0,988,119,1,0,0,0,989,1036,3,124,62,0,990,1036, - 5,93,0,0,991,1036,5,94,0,0,992,993,5,95,0,0,993,1036,3,138,69,0, - 994,995,5,96,0,0,995,996,5,123,0,0,996,997,3,136,68,0,997,998,5, - 124,0,0,998,1036,1,0,0,0,999,1000,5,97,0,0,1000,1001,5,123,0,0,1001, - 1003,3,136,68,0,1002,1004,3,28,14,0,1003,1002,1,0,0,0,1003,1004, - 1,0,0,0,1004,1005,1,0,0,0,1005,1006,5,124,0,0,1006,1036,1,0,0,0, - 1007,1008,5,21,0,0,1008,1009,5,123,0,0,1009,1010,3,136,68,0,1010, - 1011,5,124,0,0,1011,1036,1,0,0,0,1012,1013,5,98,0,0,1013,1014,5, - 123,0,0,1014,1015,3,120,60,0,1015,1016,5,124,0,0,1016,1036,1,0,0, - 0,1017,1018,5,99,0,0,1018,1019,5,123,0,0,1019,1020,3,120,60,0,1020, - 1021,5,124,0,0,1021,1036,1,0,0,0,1022,1023,5,100,0,0,1023,1027,5, - 117,0,0,1024,1026,3,122,61,0,1025,1024,1,0,0,0,1026,1029,1,0,0,0, - 1027,1025,1,0,0,0,1027,1028,1,0,0,0,1028,1030,1,0,0,0,1029,1027, - 1,0,0,0,1030,1036,5,118,0,0,1031,1033,3,136,68,0,1032,1034,3,28, - 14,0,1033,1032,1,0,0,0,1033,1034,1,0,0,0,1034,1036,1,0,0,0,1035, - 989,1,0,0,0,1035,990,1,0,0,0,1035,991,1,0,0,0,1035,992,1,0,0,0,1035, - 994,1,0,0,0,1035,999,1,0,0,0,1035,1007,1,0,0,0,1035,1012,1,0,0,0, - 1035,1017,1,0,0,0,1035,1022,1,0,0,0,1035,1031,1,0,0,0,1036,121,1, - 0,0,0,1037,1038,3,136,68,0,1038,1039,5,113,0,0,1039,1040,3,120,60, - 0,1040,1041,5,114,0,0,1041,123,1,0,0,0,1042,1043,7,4,0,0,1043,125, - 1,0,0,0,1044,1045,7,5,0,0,1045,127,1,0,0,0,1046,1055,3,138,69,0, - 1047,1055,5,127,0,0,1048,1055,5,128,0,0,1049,1055,5,109,0,0,1050, - 1055,5,110,0,0,1051,1055,5,111,0,0,1052,1055,3,130,65,0,1053,1055, - 3,134,67,0,1054,1046,1,0,0,0,1054,1047,1,0,0,0,1054,1048,1,0,0,0, - 1054,1049,1,0,0,0,1054,1050,1,0,0,0,1054,1051,1,0,0,0,1054,1052, - 1,0,0,0,1054,1053,1,0,0,0,1055,129,1,0,0,0,1056,1065,5,117,0,0,1057, - 1062,3,132,66,0,1058,1059,5,115,0,0,1059,1061,3,132,66,0,1060,1058, - 1,0,0,0,1061,1064,1,0,0,0,1062,1060,1,0,0,0,1062,1063,1,0,0,0,1063, - 1066,1,0,0,0,1064,1062,1,0,0,0,1065,1057,1,0,0,0,1065,1066,1,0,0, - 0,1066,1067,1,0,0,0,1067,1068,5,118,0,0,1068,131,1,0,0,0,1069,1070, - 3,138,69,0,1070,1071,5,113,0,0,1071,1072,3,128,64,0,1072,133,1,0, - 0,0,1073,1082,5,119,0,0,1074,1079,3,128,64,0,1075,1076,5,115,0,0, - 1076,1078,3,128,64,0,1077,1075,1,0,0,0,1078,1081,1,0,0,0,1079,1077, - 1,0,0,0,1079,1080,1,0,0,0,1080,1083,1,0,0,0,1081,1079,1,0,0,0,1082, - 1074,1,0,0,0,1082,1083,1,0,0,0,1083,1084,1,0,0,0,1084,1085,5,120, - 0,0,1085,135,1,0,0,0,1086,1087,7,6,0,0,1087,137,1,0,0,0,1088,1089, - 5,130,0,0,1089,139,1,0,0,0,92,152,159,180,192,204,224,232,239,245, - 257,260,266,277,286,296,299,301,305,313,325,330,339,342,360,372, - 396,399,409,413,419,426,452,459,463,468,479,485,495,500,514,534, - 561,566,577,582,589,598,611,632,635,638,645,653,684,696,710,718, - 730,744,754,772,776,779,783,786,795,799,803,809,819,848,867,886, - 889,891,902,917,933,942,950,972,976,985,1003,1027,1033,1035,1054, - 1062,1065,1079,1082 + 38,1,38,3,38,688,8,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1, + 38,1,38,3,38,700,8,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1, + 38,1,38,1,38,1,38,3,38,714,8,38,1,39,1,39,1,39,1,39,5,39,720,8,39, + 10,39,12,39,723,9,39,1,39,1,39,1,40,1,40,1,41,1,41,1,41,1,42,1,42, + 3,42,734,8,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,3,43,748,8,43,1,43,1,43,1,44,1,44,1,44,1,44,1,44,1,44, + 3,44,758,8,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,46,1,46,1,46,1,46,3,46,776,8,46,1,46,1,46,3,46,780,8, + 46,1,46,3,46,783,8,46,1,46,1,46,3,46,787,8,46,1,46,3,46,790,8,46, + 1,46,1,46,1,47,1,47,1,47,1,47,1,47,3,47,799,8,47,1,47,1,47,3,47, + 803,8,47,1,47,1,47,3,47,807,8,47,1,47,1,47,5,47,811,8,47,10,47,12, + 47,814,9,47,1,47,1,47,1,48,1,48,1,48,1,48,1,48,3,48,823,8,48,1,49, + 1,49,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,50,1,50,1,50,1,50,1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,51, + 3,51,852,8,51,1,51,1,51,1,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53, + 1,53,1,53,1,53,1,53,1,53,1,53,1,53,3,53,871,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,1,54,1,54,1,54,1,54, + 1,54,3,54,890,8,54,1,54,3,54,893,8,54,3,54,895,8,54,1,55,1,55,1, + 56,1,56,1,57,1,57,1,57,5,57,904,8,57,10,57,12,57,907,9,57,1,57,1, + 57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,921,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,937,8,58,1,58,1,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,3,58,954,8,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,967,8,58,1,58,1,58, + 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,979,8,58,1,58,1,58, + 3,58,983,8,58,1,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,992,8,59,1, + 59,1,59,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1, + 60,1,60,1,60,3,60,1010,8,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1, + 60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,5, + 60,1032,8,60,10,60,12,60,1035,9,60,1,60,1,60,1,60,3,60,1040,8,60, + 3,60,1042,8,60,1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,63,1,63,1,64, + 1,64,1,64,1,64,1,64,1,64,1,64,1,64,3,64,1061,8,64,1,65,1,65,1,65, + 1,65,5,65,1067,8,65,10,65,12,65,1070,9,65,3,65,1072,8,65,1,65,1, + 65,1,66,1,66,1,66,1,66,1,67,1,67,1,67,1,67,5,67,1084,8,67,10,67, + 12,67,1087,9,67,3,67,1089,8,67,1,67,1,67,1,68,1,68,1,69,1,69,1,69, + 0,0,70,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,0,7,1,0,81,85,2,0,76,80,82,83, + 2,0,76,77,82,83,2,0,78,80,82,83,1,0,101,108,1,0,88,91,3,0,2,15,55, + 55,129,129,1178,0,152,1,0,0,0,2,154,1,0,0,0,4,164,1,0,0,0,6,168, + 1,0,0,0,8,192,1,0,0,0,10,204,1,0,0,0,12,206,1,0,0,0,14,213,1,0,0, + 0,16,224,1,0,0,0,18,226,1,0,0,0,20,239,1,0,0,0,22,271,1,0,0,0,24, + 301,1,0,0,0,26,303,1,0,0,0,28,307,1,0,0,0,30,325,1,0,0,0,32,327, + 1,0,0,0,34,339,1,0,0,0,36,342,1,0,0,0,38,360,1,0,0,0,40,396,1,0, + 0,0,42,399,1,0,0,0,44,424,1,0,0,0,46,452,1,0,0,0,48,463,1,0,0,0, + 50,468,1,0,0,0,52,495,1,0,0,0,54,497,1,0,0,0,56,522,1,0,0,0,58,564, + 1,0,0,0,60,566,1,0,0,0,62,589,1,0,0,0,64,605,1,0,0,0,66,618,1,0, + 0,0,68,621,1,0,0,0,70,641,1,0,0,0,72,643,1,0,0,0,74,651,1,0,0,0, + 76,713,1,0,0,0,78,715,1,0,0,0,80,726,1,0,0,0,82,728,1,0,0,0,84,733, + 1,0,0,0,86,735,1,0,0,0,88,757,1,0,0,0,90,759,1,0,0,0,92,768,1,0, + 0,0,94,793,1,0,0,0,96,822,1,0,0,0,98,824,1,0,0,0,100,831,1,0,0,0, + 102,845,1,0,0,0,104,855,1,0,0,0,106,870,1,0,0,0,108,894,1,0,0,0, + 110,896,1,0,0,0,112,898,1,0,0,0,114,900,1,0,0,0,116,982,1,0,0,0, + 118,984,1,0,0,0,120,1041,1,0,0,0,122,1043,1,0,0,0,124,1048,1,0,0, + 0,126,1050,1,0,0,0,128,1060,1,0,0,0,130,1062,1,0,0,0,132,1075,1, + 0,0,0,134,1079,1,0,0,0,136,1092,1,0,0,0,138,1094,1,0,0,0,140,141, + 3,6,3,0,141,142,5,0,0,1,142,153,1,0,0,0,143,144,3,20,10,0,144,145, + 5,0,0,1,145,153,1,0,0,0,146,147,3,50,25,0,147,148,5,0,0,1,148,153, + 1,0,0,0,149,150,3,2,1,0,150,151,5,0,0,1,151,153,1,0,0,0,152,140, + 1,0,0,0,152,143,1,0,0,0,152,146,1,0,0,0,152,149,1,0,0,0,153,1,1, + 0,0,0,154,155,5,22,0,0,155,159,5,117,0,0,156,158,3,8,4,0,157,156, + 1,0,0,0,158,161,1,0,0,0,159,157,1,0,0,0,159,160,1,0,0,0,160,162, + 1,0,0,0,161,159,1,0,0,0,162,163,5,118,0,0,163,3,1,0,0,0,164,165, + 5,23,0,0,165,166,3,138,69,0,166,167,5,114,0,0,167,5,1,0,0,0,168, + 169,5,1,0,0,169,170,3,136,68,0,170,171,5,64,0,0,171,172,3,138,69, + 0,172,173,5,58,0,0,173,174,3,138,69,0,174,175,5,57,0,0,175,176,3, + 138,69,0,176,180,5,117,0,0,177,179,3,8,4,0,178,177,1,0,0,0,179,182, + 1,0,0,0,180,178,1,0,0,0,180,181,1,0,0,0,181,183,1,0,0,0,182,180, + 1,0,0,0,183,184,5,118,0,0,184,7,1,0,0,0,185,193,3,4,2,0,186,193, + 3,18,9,0,187,193,3,10,5,0,188,193,3,82,41,0,189,193,3,94,47,0,190, + 193,3,118,59,0,191,193,3,32,16,0,192,185,1,0,0,0,192,186,1,0,0,0, + 192,187,1,0,0,0,192,188,1,0,0,0,192,189,1,0,0,0,192,190,1,0,0,0, + 192,191,1,0,0,0,193,9,1,0,0,0,194,195,5,23,0,0,195,196,5,26,0,0, + 196,197,3,136,68,0,197,198,5,114,0,0,198,205,1,0,0,0,199,200,5,23, + 0,0,200,201,5,28,0,0,201,202,3,136,68,0,202,203,5,114,0,0,203,205, + 1,0,0,0,204,194,1,0,0,0,204,199,1,0,0,0,205,11,1,0,0,0,206,207,5, + 24,0,0,207,208,5,25,0,0,208,209,3,136,68,0,209,210,5,64,0,0,210, + 211,3,138,69,0,211,212,5,114,0,0,212,13,1,0,0,0,213,214,5,24,0,0, + 214,215,5,26,0,0,215,216,3,136,68,0,216,217,5,58,0,0,217,218,3,138, + 69,0,218,219,5,114,0,0,219,15,1,0,0,0,220,225,3,10,5,0,221,225,3, + 12,6,0,222,225,3,14,7,0,223,225,3,32,16,0,224,220,1,0,0,0,224,221, + 1,0,0,0,224,222,1,0,0,0,224,223,1,0,0,0,225,17,1,0,0,0,226,227,5, + 25,0,0,227,228,3,136,68,0,228,229,5,64,0,0,229,232,3,138,69,0,230, + 231,5,65,0,0,231,233,3,138,69,0,232,230,1,0,0,0,232,233,1,0,0,0, + 233,234,1,0,0,0,234,235,5,114,0,0,235,19,1,0,0,0,236,238,3,16,8, + 0,237,236,1,0,0,0,238,241,1,0,0,0,239,237,1,0,0,0,239,240,1,0,0, + 0,240,242,1,0,0,0,241,239,1,0,0,0,242,243,5,26,0,0,243,245,3,136, + 68,0,244,246,3,22,11,0,245,244,1,0,0,0,245,246,1,0,0,0,246,247,1, + 0,0,0,247,248,5,64,0,0,248,249,3,138,69,0,249,250,5,58,0,0,250,260, + 3,138,69,0,251,252,5,69,0,0,252,257,3,26,13,0,253,254,5,115,0,0, + 254,256,3,26,13,0,255,253,1,0,0,0,256,259,1,0,0,0,257,255,1,0,0, + 0,257,258,1,0,0,0,258,261,1,0,0,0,259,257,1,0,0,0,260,251,1,0,0, + 0,260,261,1,0,0,0,261,262,1,0,0,0,262,266,5,117,0,0,263,265,3,34, + 17,0,264,263,1,0,0,0,265,268,1,0,0,0,266,264,1,0,0,0,266,267,1,0, + 0,0,267,269,1,0,0,0,268,266,1,0,0,0,269,270,5,118,0,0,270,21,1,0, + 0,0,271,272,5,123,0,0,272,277,3,24,12,0,273,274,5,115,0,0,274,276, + 3,24,12,0,275,273,1,0,0,0,276,279,1,0,0,0,277,275,1,0,0,0,277,278, + 1,0,0,0,278,280,1,0,0,0,279,277,1,0,0,0,280,281,5,124,0,0,281,23, + 1,0,0,0,282,283,5,29,0,0,283,286,3,136,68,0,284,285,5,113,0,0,285, + 287,5,19,0,0,286,284,1,0,0,0,286,287,1,0,0,0,287,302,1,0,0,0,288, + 289,5,18,0,0,289,299,3,136,68,0,290,291,5,20,0,0,291,296,3,26,13, + 0,292,293,5,125,0,0,293,295,3,26,13,0,294,292,1,0,0,0,295,298,1, + 0,0,0,296,294,1,0,0,0,296,297,1,0,0,0,297,300,1,0,0,0,298,296,1, + 0,0,0,299,290,1,0,0,0,299,300,1,0,0,0,300,302,1,0,0,0,301,282,1, + 0,0,0,301,288,1,0,0,0,302,25,1,0,0,0,303,305,3,136,68,0,304,306, + 3,28,14,0,305,304,1,0,0,0,305,306,1,0,0,0,306,27,1,0,0,0,307,308, + 5,123,0,0,308,313,3,30,15,0,309,310,5,115,0,0,310,312,3,30,15,0, + 311,309,1,0,0,0,312,315,1,0,0,0,313,311,1,0,0,0,313,314,1,0,0,0, + 314,316,1,0,0,0,315,313,1,0,0,0,316,317,5,124,0,0,317,29,1,0,0,0, + 318,319,5,25,0,0,319,326,3,136,68,0,320,321,5,26,0,0,321,326,3,26, + 13,0,322,323,5,18,0,0,323,326,3,136,68,0,324,326,3,120,60,0,325, + 318,1,0,0,0,325,320,1,0,0,0,325,322,1,0,0,0,325,324,1,0,0,0,326, + 31,1,0,0,0,327,328,5,17,0,0,328,330,3,136,68,0,329,331,3,22,11,0, + 330,329,1,0,0,0,330,331,1,0,0,0,331,332,1,0,0,0,332,333,5,126,0, + 0,333,334,3,120,60,0,334,335,5,114,0,0,335,33,1,0,0,0,336,340,3, + 38,19,0,337,340,3,42,21,0,338,340,3,36,18,0,339,336,1,0,0,0,339, + 337,1,0,0,0,339,338,1,0,0,0,340,35,1,0,0,0,341,343,5,39,0,0,342, + 341,1,0,0,0,342,343,1,0,0,0,343,344,1,0,0,0,344,345,5,31,0,0,345, + 346,3,136,68,0,346,347,5,64,0,0,347,348,3,138,69,0,348,349,5,113, + 0,0,349,350,3,120,60,0,350,351,5,112,0,0,351,352,3,120,60,0,352, + 353,5,117,0,0,353,354,5,81,0,0,354,355,5,64,0,0,355,356,3,138,69, + 0,356,357,5,114,0,0,357,358,5,118,0,0,358,37,1,0,0,0,359,361,3,44, + 22,0,360,359,1,0,0,0,360,361,1,0,0,0,361,362,1,0,0,0,362,363,5,29, + 0,0,363,364,3,136,68,0,364,365,5,64,0,0,365,366,3,138,69,0,366,367, + 5,113,0,0,367,368,3,120,60,0,368,372,5,117,0,0,369,371,3,40,20,0, + 370,369,1,0,0,0,371,374,1,0,0,0,372,370,1,0,0,0,372,373,1,0,0,0, + 373,375,1,0,0,0,374,372,1,0,0,0,375,376,5,118,0,0,376,39,1,0,0,0, + 377,378,5,71,0,0,378,379,5,64,0,0,379,380,3,138,69,0,380,381,5,114, + 0,0,381,397,1,0,0,0,382,383,5,72,0,0,383,384,5,64,0,0,384,385,3, + 138,69,0,385,386,5,114,0,0,386,397,1,0,0,0,387,388,5,73,0,0,388, + 389,5,74,0,0,389,390,5,64,0,0,390,391,3,138,69,0,391,392,5,75,0, + 0,392,393,5,64,0,0,393,394,3,138,69,0,394,395,5,114,0,0,395,397, + 1,0,0,0,396,377,1,0,0,0,396,382,1,0,0,0,396,387,1,0,0,0,397,41,1, + 0,0,0,398,400,3,44,22,0,399,398,1,0,0,0,399,400,1,0,0,0,400,401, + 1,0,0,0,401,402,5,30,0,0,402,403,3,136,68,0,403,404,5,64,0,0,404, + 405,3,138,69,0,405,406,5,113,0,0,406,407,3,126,63,0,407,409,3,48, + 24,0,408,410,5,92,0,0,409,408,1,0,0,0,409,410,1,0,0,0,410,413,1, + 0,0,0,411,412,5,62,0,0,412,414,3,138,69,0,413,411,1,0,0,0,413,414, + 1,0,0,0,414,415,1,0,0,0,415,419,5,117,0,0,416,418,3,46,23,0,417, + 416,1,0,0,0,418,421,1,0,0,0,419,417,1,0,0,0,419,420,1,0,0,0,420, + 422,1,0,0,0,421,419,1,0,0,0,422,423,5,118,0,0,423,43,1,0,0,0,424, + 426,5,14,0,0,425,427,5,15,0,0,426,425,1,0,0,0,426,427,1,0,0,0,427, + 45,1,0,0,0,428,429,5,78,0,0,429,430,5,64,0,0,430,431,3,138,69,0, + 431,432,5,114,0,0,432,453,1,0,0,0,433,434,5,79,0,0,434,435,5,64, + 0,0,435,436,3,138,69,0,436,437,5,114,0,0,437,453,1,0,0,0,438,439, + 5,80,0,0,439,440,5,64,0,0,440,441,3,138,69,0,441,442,5,114,0,0,442, + 453,1,0,0,0,443,444,5,73,0,0,444,445,5,74,0,0,445,446,5,64,0,0,446, + 447,3,138,69,0,447,448,5,75,0,0,448,449,5,64,0,0,449,450,3,138,69, + 0,450,451,5,114,0,0,451,453,1,0,0,0,452,428,1,0,0,0,452,433,1,0, + 0,0,452,438,1,0,0,0,452,443,1,0,0,0,453,47,1,0,0,0,454,455,5,25, + 0,0,455,464,3,136,68,0,456,457,5,26,0,0,457,459,3,136,68,0,458,460, + 3,28,14,0,459,458,1,0,0,0,459,460,1,0,0,0,460,464,1,0,0,0,461,462, + 5,18,0,0,462,464,3,136,68,0,463,454,1,0,0,0,463,456,1,0,0,0,463, + 461,1,0,0,0,464,49,1,0,0,0,465,467,3,16,8,0,466,465,1,0,0,0,467, + 470,1,0,0,0,468,466,1,0,0,0,468,469,1,0,0,0,469,471,1,0,0,0,470, + 468,1,0,0,0,471,472,5,28,0,0,472,473,3,136,68,0,473,474,5,64,0,0, + 474,475,3,138,69,0,475,476,5,58,0,0,476,479,3,138,69,0,477,478,5, + 59,0,0,478,480,5,127,0,0,479,477,1,0,0,0,479,480,1,0,0,0,480,481, + 1,0,0,0,481,485,5,117,0,0,482,484,3,52,26,0,483,482,1,0,0,0,484, + 487,1,0,0,0,485,483,1,0,0,0,485,486,1,0,0,0,486,488,1,0,0,0,487, + 485,1,0,0,0,488,489,5,118,0,0,489,51,1,0,0,0,490,496,3,60,30,0,491, + 496,3,62,31,0,492,496,3,64,32,0,493,496,3,54,27,0,494,496,3,56,28, + 0,495,490,1,0,0,0,495,491,1,0,0,0,495,492,1,0,0,0,495,493,1,0,0, + 0,495,494,1,0,0,0,496,53,1,0,0,0,497,498,5,5,0,0,498,500,3,136,68, + 0,499,501,3,22,11,0,500,499,1,0,0,0,500,501,1,0,0,0,501,502,1,0, + 0,0,502,503,5,64,0,0,503,504,3,138,69,0,504,506,5,7,0,0,505,507, + 5,1,0,0,506,505,1,0,0,0,506,507,1,0,0,0,507,508,1,0,0,0,508,509, + 3,26,13,0,509,510,5,8,0,0,510,511,3,138,69,0,511,512,5,31,0,0,512, + 513,3,138,69,0,513,517,5,117,0,0,514,516,3,58,29,0,515,514,1,0,0, + 0,516,519,1,0,0,0,517,515,1,0,0,0,517,518,1,0,0,0,518,520,1,0,0, + 0,519,517,1,0,0,0,520,521,5,118,0,0,521,55,1,0,0,0,522,523,5,5,0, + 0,523,524,3,136,68,0,524,525,5,64,0,0,525,526,3,138,69,0,526,527, + 5,6,0,0,527,528,3,136,68,0,528,529,3,28,14,0,529,530,5,114,0,0,530, + 57,1,0,0,0,531,532,5,9,0,0,532,533,3,138,69,0,533,534,5,114,0,0, + 534,565,1,0,0,0,535,537,5,10,0,0,536,538,5,18,0,0,537,536,1,0,0, + 0,537,538,1,0,0,0,538,539,1,0,0,0,539,540,3,136,68,0,540,541,5,37, + 0,0,541,542,3,26,13,0,542,543,5,114,0,0,543,565,1,0,0,0,544,545, + 5,11,0,0,545,546,3,136,68,0,546,547,5,127,0,0,547,548,5,114,0,0, + 548,565,1,0,0,0,549,550,5,12,0,0,550,551,3,26,13,0,551,552,5,116, + 0,0,552,553,3,136,68,0,553,554,3,136,68,0,554,555,3,138,69,0,555, + 556,5,114,0,0,556,565,1,0,0,0,557,558,5,73,0,0,558,565,5,114,0,0, + 559,560,5,13,0,0,560,561,5,127,0,0,561,562,3,138,69,0,562,563,5, + 114,0,0,563,565,1,0,0,0,564,531,1,0,0,0,564,535,1,0,0,0,564,544, + 1,0,0,0,564,549,1,0,0,0,564,557,1,0,0,0,564,559,1,0,0,0,565,59,1, + 0,0,0,566,567,5,31,0,0,567,569,3,136,68,0,568,570,3,22,11,0,569, + 568,1,0,0,0,569,570,1,0,0,0,570,571,1,0,0,0,571,572,5,64,0,0,572, + 573,3,138,69,0,573,574,5,113,0,0,574,575,3,120,60,0,575,576,5,112, + 0,0,576,577,3,120,60,0,577,578,5,66,0,0,578,580,3,68,34,0,579,581, + 3,66,33,0,580,579,1,0,0,0,580,581,1,0,0,0,581,582,1,0,0,0,582,583, + 5,68,0,0,583,585,3,70,35,0,584,586,3,74,37,0,585,584,1,0,0,0,585, + 586,1,0,0,0,586,587,1,0,0,0,587,588,5,114,0,0,588,61,1,0,0,0,589, + 590,5,32,0,0,590,592,3,136,68,0,591,593,3,22,11,0,592,591,1,0,0, + 0,592,593,1,0,0,0,593,594,1,0,0,0,594,595,5,64,0,0,595,596,3,138, + 69,0,596,597,5,113,0,0,597,598,3,120,60,0,598,599,5,112,0,0,599, + 601,3,120,60,0,600,602,3,74,37,0,601,600,1,0,0,0,601,602,1,0,0,0, + 602,603,1,0,0,0,603,604,5,114,0,0,604,63,1,0,0,0,605,606,5,33,0, + 0,606,607,3,136,68,0,607,608,5,64,0,0,608,609,3,138,69,0,609,610, + 5,34,0,0,610,611,3,136,68,0,611,612,5,113,0,0,612,614,3,120,60,0, + 613,615,3,74,37,0,614,613,1,0,0,0,614,615,1,0,0,0,615,616,1,0,0, + 0,616,617,5,114,0,0,617,65,1,0,0,0,618,619,5,67,0,0,619,620,3,120, + 60,0,620,67,1,0,0,0,621,622,7,0,0,0,622,69,1,0,0,0,623,642,5,70, + 0,0,624,625,5,25,0,0,625,642,3,136,68,0,626,627,5,18,0,0,627,642, + 3,136,68,0,628,629,5,27,0,0,629,638,5,119,0,0,630,635,3,26,13,0, + 631,632,5,115,0,0,632,634,3,26,13,0,633,631,1,0,0,0,634,637,1,0, + 0,0,635,633,1,0,0,0,635,636,1,0,0,0,636,639,1,0,0,0,637,635,1,0, + 0,0,638,630,1,0,0,0,638,639,1,0,0,0,639,640,1,0,0,0,640,642,5,120, + 0,0,641,623,1,0,0,0,641,624,1,0,0,0,641,626,1,0,0,0,641,628,1,0, + 0,0,642,71,1,0,0,0,643,648,3,136,68,0,644,645,5,115,0,0,645,647, + 3,136,68,0,646,644,1,0,0,0,647,650,1,0,0,0,648,646,1,0,0,0,648,649, + 1,0,0,0,649,73,1,0,0,0,650,648,1,0,0,0,651,652,5,69,0,0,652,656, + 5,117,0,0,653,655,3,76,38,0,654,653,1,0,0,0,655,658,1,0,0,0,656, + 654,1,0,0,0,656,657,1,0,0,0,657,659,1,0,0,0,658,656,1,0,0,0,659, + 660,5,118,0,0,660,75,1,0,0,0,661,662,5,43,0,0,662,663,3,136,68,0, + 663,664,5,64,0,0,664,665,3,138,69,0,665,666,5,113,0,0,666,667,3, + 120,60,0,667,668,3,78,39,0,668,669,5,114,0,0,669,714,1,0,0,0,670, + 671,5,44,0,0,671,672,3,136,68,0,672,673,5,64,0,0,673,674,3,138,69, + 0,674,675,5,113,0,0,675,676,3,126,63,0,676,677,3,48,24,0,677,678, + 3,78,39,0,678,679,5,114,0,0,679,714,1,0,0,0,680,681,5,26,0,0,681, + 682,3,136,68,0,682,683,5,64,0,0,683,684,3,138,69,0,684,685,5,113, + 0,0,685,687,3,136,68,0,686,688,3,28,14,0,687,686,1,0,0,0,687,688, + 1,0,0,0,688,689,1,0,0,0,689,690,5,114,0,0,690,714,1,0,0,0,691,692, + 5,33,0,0,692,693,3,136,68,0,693,694,5,64,0,0,694,695,3,138,69,0, + 695,696,5,113,0,0,696,699,3,136,68,0,697,698,5,35,0,0,698,700,3, + 120,60,0,699,697,1,0,0,0,699,700,1,0,0,0,700,701,1,0,0,0,701,702, + 5,114,0,0,702,714,1,0,0,0,703,704,5,5,0,0,704,705,3,136,68,0,705, + 706,5,64,0,0,706,707,3,138,69,0,707,708,5,113,0,0,708,709,3,136, + 68,0,709,710,5,116,0,0,710,711,3,136,68,0,711,712,5,114,0,0,712, + 714,1,0,0,0,713,661,1,0,0,0,713,670,1,0,0,0,713,680,1,0,0,0,713, + 691,1,0,0,0,713,703,1,0,0,0,714,77,1,0,0,0,715,716,5,119,0,0,716, + 721,3,80,40,0,717,718,5,115,0,0,718,720,3,80,40,0,719,717,1,0,0, + 0,720,723,1,0,0,0,721,719,1,0,0,0,721,722,1,0,0,0,722,724,1,0,0, + 0,723,721,1,0,0,0,724,725,5,120,0,0,725,79,1,0,0,0,726,727,7,1,0, + 0,727,81,1,0,0,0,728,729,5,42,0,0,729,730,3,84,42,0,730,83,1,0,0, + 0,731,734,3,86,43,0,732,734,3,90,45,0,733,731,1,0,0,0,733,732,1, + 0,0,0,734,85,1,0,0,0,735,736,5,43,0,0,736,737,3,136,68,0,737,738, + 5,64,0,0,738,739,3,138,69,0,739,740,5,52,0,0,740,741,3,136,68,0, + 741,742,5,113,0,0,742,743,3,120,60,0,743,744,5,53,0,0,744,747,3, + 88,44,0,745,746,5,54,0,0,746,748,3,128,64,0,747,745,1,0,0,0,747, + 748,1,0,0,0,748,749,1,0,0,0,749,750,5,114,0,0,750,87,1,0,0,0,751, + 758,5,86,0,0,752,753,5,87,0,0,753,754,5,121,0,0,754,755,3,120,60, + 0,755,756,5,122,0,0,756,758,1,0,0,0,757,751,1,0,0,0,757,752,1,0, + 0,0,758,89,1,0,0,0,759,760,5,44,0,0,760,761,3,136,68,0,761,762,5, + 64,0,0,762,763,3,138,69,0,763,764,5,117,0,0,764,765,3,92,46,0,765, + 766,3,92,46,0,766,767,5,118,0,0,767,91,1,0,0,0,768,769,3,48,24,0, + 769,770,5,45,0,0,770,771,3,136,68,0,771,772,5,64,0,0,772,773,3,138, + 69,0,773,775,3,126,63,0,774,776,5,92,0,0,775,774,1,0,0,0,775,776, + 1,0,0,0,776,779,1,0,0,0,777,778,5,60,0,0,778,780,3,138,69,0,779, + 777,1,0,0,0,779,780,1,0,0,0,780,782,1,0,0,0,781,783,5,61,0,0,782, + 781,1,0,0,0,782,783,1,0,0,0,783,786,1,0,0,0,784,785,5,62,0,0,785, + 787,3,138,69,0,786,784,1,0,0,0,786,787,1,0,0,0,787,789,1,0,0,0,788, + 790,5,63,0,0,789,788,1,0,0,0,789,790,1,0,0,0,790,791,1,0,0,0,791, + 792,5,114,0,0,792,93,1,0,0,0,793,794,5,36,0,0,794,795,3,136,68,0, + 795,796,5,37,0,0,796,798,3,136,68,0,797,799,3,28,14,0,798,797,1, + 0,0,0,798,799,1,0,0,0,799,802,1,0,0,0,800,801,5,64,0,0,801,803,3, + 138,69,0,802,800,1,0,0,0,802,803,1,0,0,0,803,806,1,0,0,0,804,805, + 5,59,0,0,805,807,5,127,0,0,806,804,1,0,0,0,806,807,1,0,0,0,807,808, + 1,0,0,0,808,812,5,117,0,0,809,811,3,96,48,0,810,809,1,0,0,0,811, + 814,1,0,0,0,812,810,1,0,0,0,812,813,1,0,0,0,813,815,1,0,0,0,814, + 812,1,0,0,0,815,816,5,118,0,0,816,95,1,0,0,0,817,818,5,41,0,0,818, + 823,3,84,42,0,819,823,3,102,51,0,820,823,3,98,49,0,821,823,3,100, + 50,0,822,817,1,0,0,0,822,819,1,0,0,0,822,820,1,0,0,0,822,821,1,0, + 0,0,823,97,1,0,0,0,824,825,5,38,0,0,825,826,3,136,68,0,826,827,5, + 40,0,0,827,828,5,43,0,0,828,829,3,136,68,0,829,830,5,114,0,0,830, + 99,1,0,0,0,831,832,5,49,0,0,832,833,3,136,68,0,833,834,5,50,0,0, + 834,835,5,51,0,0,835,836,5,47,0,0,836,837,5,33,0,0,837,838,3,136, + 68,0,838,839,5,48,0,0,839,840,5,44,0,0,840,841,3,136,68,0,841,842, + 5,116,0,0,842,843,3,136,68,0,843,844,5,114,0,0,844,101,1,0,0,0,845, + 846,5,38,0,0,846,847,3,104,52,0,847,848,5,40,0,0,848,851,3,108,54, + 0,849,850,5,16,0,0,850,852,3,138,69,0,851,849,1,0,0,0,851,852,1, + 0,0,0,852,853,1,0,0,0,853,854,5,114,0,0,854,103,1,0,0,0,855,856, + 3,136,68,0,856,857,5,116,0,0,857,858,3,106,53,0,858,105,1,0,0,0, + 859,871,3,136,68,0,860,871,5,81,0,0,861,871,5,71,0,0,862,871,5,72, + 0,0,863,871,5,78,0,0,864,871,5,79,0,0,865,871,5,80,0,0,866,871,5, + 82,0,0,867,871,5,83,0,0,868,871,5,84,0,0,869,871,5,85,0,0,870,859, + 1,0,0,0,870,860,1,0,0,0,870,861,1,0,0,0,870,862,1,0,0,0,870,863, + 1,0,0,0,870,864,1,0,0,0,870,865,1,0,0,0,870,866,1,0,0,0,870,867, + 1,0,0,0,870,868,1,0,0,0,870,869,1,0,0,0,871,107,1,0,0,0,872,873, + 5,43,0,0,873,874,3,136,68,0,874,875,5,116,0,0,875,876,3,110,55,0, + 876,895,1,0,0,0,877,878,5,44,0,0,878,879,3,136,68,0,879,880,5,116, + 0,0,880,881,3,136,68,0,881,882,5,116,0,0,882,883,3,112,56,0,883, + 895,1,0,0,0,884,885,5,28,0,0,885,886,3,136,68,0,886,887,5,116,0, + 0,887,889,3,136,68,0,888,890,3,28,14,0,889,888,1,0,0,0,889,890,1, + 0,0,0,890,892,1,0,0,0,891,893,3,114,57,0,892,891,1,0,0,0,892,893, + 1,0,0,0,893,895,1,0,0,0,894,872,1,0,0,0,894,877,1,0,0,0,894,884, + 1,0,0,0,895,109,1,0,0,0,896,897,7,2,0,0,897,111,1,0,0,0,898,899, + 7,3,0,0,899,113,1,0,0,0,900,901,5,46,0,0,901,905,5,117,0,0,902,904, + 3,116,58,0,903,902,1,0,0,0,904,907,1,0,0,0,905,903,1,0,0,0,905,906, + 1,0,0,0,906,908,1,0,0,0,907,905,1,0,0,0,908,909,5,118,0,0,909,115, + 1,0,0,0,910,911,3,136,68,0,911,912,5,40,0,0,912,913,5,43,0,0,913, + 920,3,136,68,0,914,915,5,48,0,0,915,916,5,44,0,0,916,917,3,136,68, + 0,917,918,5,116,0,0,918,919,3,136,68,0,919,921,1,0,0,0,920,914,1, + 0,0,0,920,921,1,0,0,0,921,922,1,0,0,0,922,923,5,114,0,0,923,983, + 1,0,0,0,924,925,3,136,68,0,925,926,5,40,0,0,926,927,5,44,0,0,927, + 928,3,136,68,0,928,929,5,116,0,0,929,936,3,136,68,0,930,931,5,48, + 0,0,931,932,5,44,0,0,932,933,3,136,68,0,933,934,5,116,0,0,934,935, + 3,136,68,0,935,937,1,0,0,0,936,930,1,0,0,0,936,937,1,0,0,0,937,938, + 1,0,0,0,938,939,5,114,0,0,939,983,1,0,0,0,940,941,3,136,68,0,941, + 942,5,40,0,0,942,943,5,26,0,0,943,945,3,136,68,0,944,946,3,28,14, + 0,945,944,1,0,0,0,945,946,1,0,0,0,946,953,1,0,0,0,947,948,5,48,0, + 0,948,949,5,44,0,0,949,950,3,136,68,0,950,951,5,116,0,0,951,952, + 3,136,68,0,952,954,1,0,0,0,953,947,1,0,0,0,953,954,1,0,0,0,954,955, + 1,0,0,0,955,956,5,114,0,0,956,983,1,0,0,0,957,958,3,136,68,0,958, + 959,5,40,0,0,959,960,5,33,0,0,960,961,3,136,68,0,961,962,5,114,0, + 0,962,983,1,0,0,0,963,964,3,136,68,0,964,966,5,40,0,0,965,967,5, + 1,0,0,966,965,1,0,0,0,966,967,1,0,0,0,967,968,1,0,0,0,968,969,5, + 5,0,0,969,970,3,136,68,0,970,971,5,116,0,0,971,978,3,136,68,0,972, + 973,5,48,0,0,973,974,5,44,0,0,974,975,3,136,68,0,975,976,5,116,0, + 0,976,977,3,136,68,0,977,979,1,0,0,0,978,972,1,0,0,0,978,979,1,0, + 0,0,979,980,1,0,0,0,980,981,5,114,0,0,981,983,1,0,0,0,982,910,1, + 0,0,0,982,924,1,0,0,0,982,940,1,0,0,0,982,957,1,0,0,0,982,963,1, + 0,0,0,983,117,1,0,0,0,984,985,5,33,0,0,985,986,3,136,68,0,986,987, + 5,40,0,0,987,988,3,136,68,0,988,989,5,116,0,0,989,991,3,136,68,0, + 990,992,3,114,57,0,991,990,1,0,0,0,991,992,1,0,0,0,992,993,1,0,0, + 0,993,994,5,114,0,0,994,119,1,0,0,0,995,1042,3,124,62,0,996,1042, + 5,93,0,0,997,1042,5,94,0,0,998,999,5,95,0,0,999,1042,3,138,69,0, + 1000,1001,5,96,0,0,1001,1002,5,123,0,0,1002,1003,3,136,68,0,1003, + 1004,5,124,0,0,1004,1042,1,0,0,0,1005,1006,5,97,0,0,1006,1007,5, + 123,0,0,1007,1009,3,136,68,0,1008,1010,3,28,14,0,1009,1008,1,0,0, + 0,1009,1010,1,0,0,0,1010,1011,1,0,0,0,1011,1012,5,124,0,0,1012,1042, + 1,0,0,0,1013,1014,5,21,0,0,1014,1015,5,123,0,0,1015,1016,3,136,68, + 0,1016,1017,5,124,0,0,1017,1042,1,0,0,0,1018,1019,5,98,0,0,1019, + 1020,5,123,0,0,1020,1021,3,120,60,0,1021,1022,5,124,0,0,1022,1042, + 1,0,0,0,1023,1024,5,99,0,0,1024,1025,5,123,0,0,1025,1026,3,120,60, + 0,1026,1027,5,124,0,0,1027,1042,1,0,0,0,1028,1029,5,100,0,0,1029, + 1033,5,117,0,0,1030,1032,3,122,61,0,1031,1030,1,0,0,0,1032,1035, + 1,0,0,0,1033,1031,1,0,0,0,1033,1034,1,0,0,0,1034,1036,1,0,0,0,1035, + 1033,1,0,0,0,1036,1042,5,118,0,0,1037,1039,3,136,68,0,1038,1040, + 3,28,14,0,1039,1038,1,0,0,0,1039,1040,1,0,0,0,1040,1042,1,0,0,0, + 1041,995,1,0,0,0,1041,996,1,0,0,0,1041,997,1,0,0,0,1041,998,1,0, + 0,0,1041,1000,1,0,0,0,1041,1005,1,0,0,0,1041,1013,1,0,0,0,1041,1018, + 1,0,0,0,1041,1023,1,0,0,0,1041,1028,1,0,0,0,1041,1037,1,0,0,0,1042, + 121,1,0,0,0,1043,1044,3,136,68,0,1044,1045,5,113,0,0,1045,1046,3, + 120,60,0,1046,1047,5,114,0,0,1047,123,1,0,0,0,1048,1049,7,4,0,0, + 1049,125,1,0,0,0,1050,1051,7,5,0,0,1051,127,1,0,0,0,1052,1061,3, + 138,69,0,1053,1061,5,127,0,0,1054,1061,5,128,0,0,1055,1061,5,109, + 0,0,1056,1061,5,110,0,0,1057,1061,5,111,0,0,1058,1061,3,130,65,0, + 1059,1061,3,134,67,0,1060,1052,1,0,0,0,1060,1053,1,0,0,0,1060,1054, + 1,0,0,0,1060,1055,1,0,0,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,129,1,0,0,0,1062,1071,5,117, + 0,0,1063,1068,3,132,66,0,1064,1065,5,115,0,0,1065,1067,3,132,66, + 0,1066,1064,1,0,0,0,1067,1070,1,0,0,0,1068,1066,1,0,0,0,1068,1069, + 1,0,0,0,1069,1072,1,0,0,0,1070,1068,1,0,0,0,1071,1063,1,0,0,0,1071, + 1072,1,0,0,0,1072,1073,1,0,0,0,1073,1074,5,118,0,0,1074,131,1,0, + 0,0,1075,1076,3,138,69,0,1076,1077,5,113,0,0,1077,1078,3,128,64, + 0,1078,133,1,0,0,0,1079,1088,5,119,0,0,1080,1085,3,128,64,0,1081, + 1082,5,115,0,0,1082,1084,3,128,64,0,1083,1081,1,0,0,0,1084,1087, + 1,0,0,0,1085,1083,1,0,0,0,1085,1086,1,0,0,0,1086,1089,1,0,0,0,1087, + 1085,1,0,0,0,1088,1080,1,0,0,0,1088,1089,1,0,0,0,1089,1090,1,0,0, + 0,1090,1091,5,120,0,0,1091,135,1,0,0,0,1092,1093,7,6,0,0,1093,137, + 1,0,0,0,1094,1095,5,130,0,0,1095,139,1,0,0,0,94,152,159,180,192, + 204,224,232,239,245,257,260,266,277,286,296,299,301,305,313,325, + 330,339,342,360,372,396,399,409,413,419,426,452,459,463,468,479, + 485,495,500,506,517,537,564,569,580,585,592,601,614,635,638,641, + 648,656,687,699,713,721,733,747,757,775,779,782,786,789,798,802, + 806,812,822,851,870,889,892,894,905,920,936,945,953,966,978,982, + 991,1009,1033,1039,1041,1060,1068,1071,1085,1088 ]; private static __ATN: antlr.ATN; @@ -5998,6 +6021,9 @@ export class PackageQueryContext extends antlr.ParserRuleContext { public typeParameters(): TypeParametersContext | null { return this.getRuleContext(0, TypeParametersContext); } + public WORKSPACE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.WORKSPACE, 0); + } public queryClause(): QueryClauseContext[]; public queryClause(i: number): QueryClauseContext | null; public queryClause(i?: number): QueryClauseContext[] | QueryClauseContext | null { @@ -7380,6 +7406,9 @@ export class DependencyBindingContext extends antlr.ParserRuleContext { public QUERY(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.QUERY, 0); } + public WORKSPACE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.WORKSPACE, 0); + } public override get ruleIndex(): number { return QuixosCapabilityParser.RULE_dependencyBinding; } diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index 0a75ba8..90db767 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -1244,7 +1244,7 @@ const lowerPackage = ( const declaration: QueryDeclaration = { id: stringValue(query.stringLiteral(0)), displayName: identifier(query.identifier()), - root: close(query.interfaceType()), + root: { kind: query.WORKSPACE() ? "workspace-interface" : "object", interface: close(query.interfaceType()) }, document: stringValue(query.stringLiteral(1)), operation: stringValue(query.stringLiteral(2)), fragments: [], @@ -1372,7 +1372,7 @@ const lowerPackage = ( queryTemplates.push({ declaration: common, parameters, - root: expressions.get(root)!, + root: { kind: root.kind, interface: expressions.get(root.interface)! }, views: templateViews, allowances: templateAllowances, }); @@ -1579,7 +1579,17 @@ const lowerBoundDependencies = ( const query = lowerQueryReference(state, identifier(entry.identifier(1)), identifier(entry.identifier(2)), entry); const via = entry.VIA() ? traversal(identifier(entry.identifier(3)), identifier(entry.identifier(4))) : undefined; return query && (!entry.VIA() || via) - ? [{ portId, binding: { kind: "query", ...query, ...(via ? { via } : {}) } }] + ? [ + { + portId, + binding: { + kind: "query", + ...query, + scope: entry.WORKSPACE() ? "workspace" : "object", + ...(via ? { via } : {}), + }, + }, + ] : []; } if (entry.STATE()) { diff --git a/src/capability-model/types.ts b/src/capability-model/types.ts index be7c336..e8b9fbc 100644 --- a/src/capability-model/types.ts +++ b/src/capability-model/types.ts @@ -292,7 +292,13 @@ export interface PackageRevision { } export type DependencyBinding = - | { kind: "query"; packageRevisionId: PackageRevisionId; queryId: string; via?: EdgeTraversal } + | { + kind: "query"; + packageRevisionId: PackageRevisionId; + queryId: string; + scope: "object" | "workspace"; + via?: EdgeTraversal; + } | { kind: "state"; slotId: SlotId; via?: EdgeTraversal } | { kind: "edge"; diff --git a/src/capability-model/validation.ts b/src/capability-model/validation.ts index 979311e..ead86f8 100644 --- a/src/capability-model/validation.ts +++ b/src/capability-model/validation.ts @@ -1173,6 +1173,20 @@ const validateBoundDependencies = ( issue(issues, "invalid-dependency-binding", path, "Query port must bind its exact checked query export"); break; } + if (query.root.kind === "workspace-interface") { + if (selected.scope !== "workspace" || selected.via) + issue( + issues, + "invalid-dependency-binding", + path, + "Workspace-interface queries require an explicit workspace scope without an object traversal", + ); + break; + } + if (selected.scope !== "object") { + issue(issues, "invalid-dependency-binding", path, "Object-root queries require an object dependency binding"); + break; + } const traversal = selected.via ? validateTraversal( issues, @@ -1191,8 +1205,13 @@ const validateBoundDependencies = ( : [] : [params.atomId]; for (const atom of targets) - if (!params.indexes.conformances.has(conformanceKey(atom as AtomId, query.root))) - issue(issues, "unsatisfied-interface", path, `Query root ${atom} does not conform to ${query.root}`); + if (!params.indexes.conformances.has(conformanceKey(atom as AtomId, query.root.interface))) + issue( + issues, + "unsatisfied-interface", + path, + `Query root ${atom} does not conform to ${query.root.interface}`, + ); break; } case "state": { diff --git a/src/gen/camino/api_pb.ts b/src/gen/camino/api_pb.ts index 3cf4ae5..deda82f 100644 --- a/src/gen/camino/api_pb.ts +++ b/src/gen/camino/api_pb.ts @@ -6,7 +6,7 @@ import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegen import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2"; import type { PersistencePlan, QueryRelationalPlan, QuerySelection } from "./schema_pb.js"; import { file_camino_schema } from "./schema_pb.js"; -import type { CapabilityRef, FieldEditing } from "../quixos/refs_pb.js"; +import type { CapabilityRef, FieldEditing, WorkspaceQueryScope } from "../quixos/refs_pb.js"; import { file_quixos_refs } from "../quixos/refs_pb.js"; import type { Message } from "@bufbuild/protobuf"; @@ -14,7 +14,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file camino/api.proto. */ export const file_camino_api: GenFile = /*@__PURE__*/ - fileDesc("ChBjYW1pbm8vYXBpLnByb3RvEgZjYW1pbm8iCwoJTnVsbFZhbHVlInwKC09iamVjdFZhbHVlEi8KBmZpZWxkcxgBIAMoCzIfLmNhbWluby5PYmplY3RWYWx1ZS5GaWVsZHNFbnRyeRo8CgtGaWVsZHNFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIioKCUxpc3RWYWx1ZRIdCgZ2YWx1ZXMYASADKAsyDS5jYW1pbm8uVmFsdWUiHQoIUmVmVmFsdWUSEQoJb2JqZWN0X2lkGAEgASgJIjwKCUNyZHRWYWx1ZRIMCgR0eXBlGAEgASgJEhAKCGVuY29kaW5nGAIgASgJEg8KB3BheWxvYWQYAyABKAwiqAEKEFN0YXRlVmFsdWVTb3VyY2USEQoJb2JqZWN0X2lkGAEgASgJEg8KB3Nsb3RfaWQYAiABKAkSFwoPdmFsdWVfdHlwZV9qc29uGAMgASgJEhsKE3N0b3JhZ2VfcG9saWN5X2pzb24YBCABKAkSEAoIcmV2aXNpb24YBSABKAQSKAoNY3JkdF9zbmFwc2hvdBgGIAEoCzIRLmNhbWluby5DcmR0VmFsdWUiNgoLVmFsdWVTb3VyY2USJwoFc3RhdGUYASABKAsyGC5jYW1pbm8uU3RhdGVWYWx1ZVNvdXJjZSKpAwoFVmFsdWUSJwoKbnVsbF92YWx1ZRgBIAEoCzIRLmNhbWluby5OdWxsVmFsdWVIABIUCgpib29sX3ZhbHVlGAIgASgISAASFgoMbnVtYmVyX3ZhbHVlGAMgASgBSAASFgoMc3RyaW5nX3ZhbHVlGAQgASgJSAASFwoNaW50ZWdlcl92YWx1ZRgFIAEoCUgAEhUKC2J5dGVzX3ZhbHVlGAYgASgMSAASKwoMb2JqZWN0X3ZhbHVlGAcgASgLMhMuY2FtaW5vLk9iamVjdFZhbHVlSAASJwoKbGlzdF92YWx1ZRgIIAEoCzIRLmNhbWluby5MaXN0VmFsdWVIABIlCglyZWZfdmFsdWUYCSABKAsyEC5jYW1pbm8uUmVmVmFsdWVIABInCgpjcmR0X3ZhbHVlGAogASgLMhEuY2FtaW5vLkNyZHRWYWx1ZUgAEiMKBnNvdXJjZRgLIAEoCzITLmNhbWluby5WYWx1ZVNvdXJjZRIuCgxxdWVyeV9vcmlnaW4YDCABKAsyGC5jYW1pbm8uUXVlcnlGaWVsZE9yaWdpbkIGCgRraW5kIpUBChBRdWVyeUZpZWxkT3JpZ2luEhQKDHNlbGVjdGlvbl9pZBgBIAEoCRIPCgdhdG9tX2lkGAIgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgDIAEoCRIRCgltZW1iZXJfaWQYBCABKAkSKAoGc291cmNlGAUgASgLMhguY2FtaW5vLlN0YXRlVmFsdWVTb3VyY2UikwIKDlF1ZXJ5TGl2ZUZpZWxkEiMKBHBhdGgYASADKAsyFS5jYW1pbm8uUXVlcnlQYXRoUGFydBIUCgxzZWxlY3Rpb25faWQYAiABKAkSEQoJb2JqZWN0X2lkGAMgASgJEikKCmNhcGFiaWxpdHkYBCABKAsyFS5xdWl4b3MuQ2FwYWJpbGl0eVJlZhIaChJ3YXRjaF9vcGVyYXRpb25faWQYBSABKAkSGwoTc2V0dGVyX29wZXJhdGlvbl9pZBgGIAEoCRIlCgdlZGl0aW5nGAcgASgLMhQucXVpeG9zLkZpZWxkRWRpdGluZxIoCgZzb3VyY2UYCCABKAsyGC5jYW1pbm8uU3RhdGVWYWx1ZVNvdXJjZSJGCh1JbnN0YWxsUGVyc2lzdGVuY2VQbGFuUmVxdWVzdBIlCgRwbGFuGAEgASgLMhcuY2FtaW5vLlBlcnNpc3RlbmNlUGxhbiJHCh5JbnN0YWxsUGVyc2lzdGVuY2VQbGFuUmVzcG9uc2USJQoEcGxhbhgBIAEoCzIXLmNhbWluby5QZXJzaXN0ZW5jZVBsYW4iGwoZR2V0UGVyc2lzdGVuY2VQbGFuUmVxdWVzdCJDChpHZXRQZXJzaXN0ZW5jZVBsYW5SZXNwb25zZRIlCgRwbGFuGAEgASgLMhcuY2FtaW5vLlBlcnNpc3RlbmNlUGxhbiKwAQoTQ3JlYXRlT2JqZWN0UmVxdWVzdBIPCgdhdG9tX2lkGAEgASgJEkQKDWluaXRpYWxfc3RhdGUYAiADKAsyLS5jYW1pbm8uQ3JlYXRlT2JqZWN0UmVxdWVzdC5Jbml0aWFsU3RhdGVFbnRyeRpCChFJbml0aWFsU3RhdGVFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIjwKFENyZWF0ZU9iamVjdFJlc3BvbnNlEiQKBm9iamVjdBgBIAEoCzIULmNhbWluby5DYW1pbm9PYmplY3QiJQoQR2V0T2JqZWN0UmVxdWVzdBIRCglvYmplY3RfaWQYASABKAkiOQoRR2V0T2JqZWN0UmVzcG9uc2USJAoGb2JqZWN0GAEgASgLMhQuY2FtaW5vLkNhbWlub09iamVjdCIlChJMaXN0T2JqZWN0c1JlcXVlc3QSDwoHYXRvbV9pZBgBIAEoCSI8ChNMaXN0T2JqZWN0c1Jlc3BvbnNlEiUKB29iamVjdHMYASADKAsyFC5jYW1pbm8uQ2FtaW5vT2JqZWN0IjYKEFJlYWRTdGF0ZVJlcXVlc3QSEQoJb2JqZWN0X2lkGAEgASgJEg8KB3Nsb3RfaWQYAiABKAkiMQoRUmVhZFN0YXRlUmVzcG9uc2USHAoFdmFsdWUYASABKAsyDS5jYW1pbm8uVmFsdWUicQoRV3JpdGVTdGF0ZVJlcXVlc3QSEQoJb2JqZWN0X2lkGAEgASgJEg8KB3Nsb3RfaWQYAiABKAkSHAoFdmFsdWUYAyABKAsyDS5jYW1pbm8uVmFsdWUSGgoSY2xpZW50X211dGF0aW9uX2lkGAQgASgJIlgKEldyaXRlU3RhdGVSZXNwb25zZRIcCgV2YWx1ZRgBIAEoCzINLmNhbWluby5WYWx1ZRIkCgZvYmplY3QYAiABKAsyFC5jYW1pbm8uQ2FtaW5vT2JqZWN0IsABChJDb25uZWN0RWRnZVJlcXVlc3QSFAoMZWRnZV90eXBlX2lkGAEgASgJEhUKDXByb2plY3Rpb25faWQYAiABKAkSEQoJb2JqZWN0X2lkGAMgASgJEhgKEHRhcmdldF9vYmplY3RfaWQYBCABKAkSFAoHb3JkaW5hbBgFIAEoBUgAiAEBEhsKDnRhcmdldF9vcmRpbmFsGAYgASgFSAGIAQFCCgoIX29yZGluYWxCEQoPX3RhcmdldF9vcmRpbmFsIjcKE0Nvbm5lY3RFZGdlUmVzcG9uc2USIAoEZWRnZRgBIAEoCzISLmNhbWluby5DYW1pbm9FZGdlIlQKElJlc29sdmVFZGdlUmVxdWVzdBIRCglvYmplY3RfaWQYASABKAkSFAoMZWRnZV90eXBlX2lkGAIgASgJEhUKDXByb2plY3Rpb25faWQYAyABKAkiOAoTUmVzb2x2ZUVkZ2VSZXNwb25zZRIhCgVlZGdlcxgBIAMoCzISLmNhbWluby5DYW1pbm9FZGdlIigKFURpc2Nvbm5lY3RFZGdlUmVxdWVzdBIPCgdlZGdlX2lkGAEgASgJIikKFkRpc2Nvbm5lY3RFZGdlUmVzcG9uc2USDwoHZWRnZV9pZBgBIAEoCSJYCg9Db2xsZWN0aW9uRW50cnkSDwoHZWRnZV9pZBgBIAEoCRIYChB0YXJnZXRfb2JqZWN0X2lkGAIgASgJEhoKA2tleRgDIAEoCzINLmNhbWluby5WYWx1ZSJUChZSZWFkQ29sbGVjdGlvblJlc3BvbnNlEhAKCHJldmlzaW9uGAEgASgEEigKB2VudHJpZXMYAiADKAsyFy5jYW1pbm8uQ29sbGVjdGlvbkVudHJ5Ip8BChhSZXBsYWNlQ29sbGVjdGlvblJlcXVlc3QSEQoJb2JqZWN0X2lkGAEgASgJEhQKDGVkZ2VfdHlwZV9pZBgCIAEoCRIVCg1wcm9qZWN0aW9uX2lkGAMgASgJEhkKEWV4cGVjdGVkX3JldmlzaW9uGAQgASgEEigKB2VudHJpZXMYBSADKAsyFy5jYW1pbm8uQ29sbGVjdGlvbkVudHJ5IiMKDkxpc3RPcHNSZXF1ZXN0EhEKCW9iamVjdF9pZBgBIAEoCSIwCg9MaXN0T3BzUmVzcG9uc2USHQoDb3BzGAEgAygLMhAuY2FtaW5vLkNhbWlub09wIm4KEldhdGNoT2JqZWN0UmVxdWVzdBIRCglvYmplY3RfaWQYASABKAkSEwoLYWZ0ZXJfb3BfaWQYAiABKAkSGAoQaW5jbHVkZV9zbmFwc2hvdBgDIAEoCBIWCg5hdHRhY2htZW50X2lkcxgEIAMoCSJrChBXYXRjaE9iamVjdEV2ZW50EhEKCW9iamVjdF9pZBgBIAEoCRImCghzbmFwc2hvdBgCIAEoCzIULmNhbWluby5DYW1pbm9PYmplY3QSHAoCb3AYAyABKAsyEC5jYW1pbm8uQ2FtaW5vT3Ai2QIKDENhbWlub09iamVjdBIKCgJpZBgBIAEoCRIPCgdhdG9tX2lkGAIgASgJEh0KFXdvcmtzcGFjZV9yZXZpc2lvbl9pZBgDIAEoCRISCgpjcmVhdGVkX2F0GAQgASgJEhIKCnVwZGF0ZWRfYXQYBSABKAkSLgoFc3RhdGUYBiADKAsyHy5jYW1pbm8uQ2FtaW5vT2JqZWN0LlN0YXRlRW50cnkSQQoPc3RhdGVfcmV2aXNpb25zGAcgAygLMiguY2FtaW5vLkNhbWlub09iamVjdC5TdGF0ZVJldmlzaW9uc0VudHJ5GjsKClN0YXRlRW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ARo1ChNTdGF0ZVJldmlzaW9uc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoBDoCOAEivwIKCkNhbWlub0VkZ2USCgoCaWQYASABKAkSFAoMZWRnZV90eXBlX2lkGAIgASgJEhcKD2ZpcnN0X29iamVjdF9pZBgDIAEoCRIYChBzZWNvbmRfb2JqZWN0X2lkGAQgASgJEhsKE2ZpcnN0X3Byb2plY3Rpb25faWQYBSABKAkSHAoUc2Vjb25kX3Byb2plY3Rpb25faWQYBiABKAkSGgoNZmlyc3Rfb3JkaW5hbBgHIAEoBUgAiAEBEhsKDnNlY29uZF9vcmRpbmFsGAggASgFSAGIAQESEgoKY3JlYXRlZF9hdBgJIAEoCRIWCg5maXJzdF9rZXlfanNvbhgKIAEoCRIXCg9zZWNvbmRfa2V5X2pzb24YCyABKAlCEAoOX2ZpcnN0X29yZGluYWxCEQoPX3NlY29uZF9vcmRpbmFsIpkBCghDYW1pbm9PcBIKCgJpZBgBIAEoCRIRCglvYmplY3RfaWQYAiABKAkSDwoHb3Bfa2luZBgDIAEoCRIeCgdwYXlsb2FkGAQgASgLMg0uY2FtaW5vLlZhbHVlEg0KBWFjdG9yGAUgASgJEhIKCmNyZWF0ZWRfYXQYBiABKAkSGgoSY2xpZW50X211dGF0aW9uX2lkGAcgASgJItABCgxRdWVyeVJlcXVlc3QSEAoIcXVlcnlfaWQYASABKAkSEQoJb2JqZWN0X2lkGAIgASgJEjYKCXZhcmlhYmxlcxgDIAMoCzIjLmNhbWluby5RdWVyeVJlcXVlc3QuVmFyaWFibGVzRW50cnkSIgoaZXhwZWN0ZWRfZGVmaW5pdGlvbl9kaWdlc3QYBCABKAkaPwoOVmFyaWFibGVzRW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASI5Cg1RdWVyeVBhdGhQYXJ0Eg8KBWZpZWxkGAEgASgJSAASDwoFaW5kZXgYAiABKA1IAEIGCgRwYXJ0It0CChFRdWVyeVBlbmRpbmdGaWVsZBIjCgRwYXRoGAEgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFBhcnQSEQoJb2JqZWN0X2lkGAIgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgDIAEoCRIRCgltZW1iZXJfaWQYBCABKAkSFAoMb3BlcmF0aW9uX2lkGAUgASgJEhcKD3ZhbHVlX3R5cGVfanNvbhgGIAEoCRIcCg9yZXNpZHVhbF93aW5kb3cYByABKA1IAIgBARIUCgxyZXNpZHVhbF9yb3cYCCABKA0SFgoOcmVzaWR1YWxfZmllbGQYCSABKAkSHwoScmVsYXRpb25hbF9jYXB0dXJlGAogASgNSAGIAQESFwoPY2FwdHVyZWRfb2JqZWN0GAsgASgNQhIKEF9yZXNpZHVhbF93aW5kb3dCFQoTX3JlbGF0aW9uYWxfY2FwdHVyZSL2AQoKUXVlcnlTdGF0cxIRCglzcWxfY291bnQYASABKA0SDgoGc3FsX21zGAIgASgBEhEKCXJwY19jb3VudBgDIAEoDRIOCgZycGNfbXMYBCABKAESFAoMcmVzdWx0X2J5dGVzGAUgASgNEhYKDnByZXBhcmF0aW9uX21zGAYgASgBEhAKCHRvdGFsX21zGAcgASgBEhkKEXJlbGF0aW9uYWxfc3RhZ2VzGAggASgNEhsKE2NhcHR1cmVkX2NhbmRpZGF0ZXMYCSABKA0SFQoNcmVsYXRpb25hbF9tcxgKIAEoARITCgtyZXNpZHVhbF9tcxgLIAEoASKmAwoNUXVlcnlSZXNwb25zZRIcCgV2YWx1ZRgBIAEoCzINLmNhbWluby5WYWx1ZRIUCgxkYXRhX3ZlcnNpb24YAiABKAkSFgoOYmluZGluZ19kaWdlc3QYAyABKAkSKgoHcGVuZGluZxgEIAMoCzIZLmNhbWluby5RdWVyeVBlbmRpbmdGaWVsZBIhCgVzdGF0cxgFIAEoCzISLmNhbWluby5RdWVyeVN0YXRzEhkKEXByZXBhcmF0aW9uX3Rva2VuGAYgASgJEikKBmVycm9ycxgHIAMoCzIZLmNhbWluby5RdWVyeUZpZWxkRmFpbHVyZRI1ChByZXNpZHVhbF93aW5kb3dzGAggAygLMhsuY2FtaW5vLlF1ZXJ5UmVzaWR1YWxXaW5kb3cSEwoLY29uc2lzdGVuY3kYCSABKAkSOwoTcmVsYXRpb25hbF9jYXB0dXJlcxgKIAMoCzIeLmNhbWluby5RdWVyeVJlbGF0aW9uYWxDYXB0dXJlEisKC2xpdmVfZmllbGRzGAsgAygLMhYuY2FtaW5vLlF1ZXJ5TGl2ZUZpZWxkIloKE1F1ZXJ5Q2FwdHVyZWRNZW1iZXISEQoJb2JqZWN0X2lkGAEgASgJEhAKCGVudHJ5X2lkGAIgASgJEh4KB21hcF9rZXkYAyABKAsyDS5jYW1pbm8uVmFsdWUiRAoUUXVlcnlDYXB0dXJlZE1lbWJlcnMSLAoHZW50cmllcxgBIAMoCzIbLmNhbWluby5RdWVyeUNhcHR1cmVkTWVtYmVyIq8DChNRdWVyeUNhcHR1cmVkT2JqZWN0EhEKCW9iamVjdF9pZBgBIAEoCRI3CgZmaWVsZHMYAiADKAsyJy5jYW1pbm8uUXVlcnlDYXB0dXJlZE9iamVjdC5GaWVsZHNFbnRyeRJACgtmaWVsZF90eXBlcxgDIAMoCzIrLmNhbWluby5RdWVyeUNhcHR1cmVkT2JqZWN0LkZpZWxkVHlwZXNFbnRyeRJFCg1yZWxhdGlvbnNoaXBzGAQgAygLMi4uY2FtaW5vLlF1ZXJ5Q2FwdHVyZWRPYmplY3QuUmVsYXRpb25zaGlwc0VudHJ5GjwKC0ZpZWxkc0VudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEaMQoPRmllbGRUeXBlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaUgoSUmVsYXRpb25zaGlwc0VudHJ5EgsKA2tleRgBIAEoCRIrCgV2YWx1ZRgCIAEoCzIcLmNhbWluby5RdWVyeUNhcHR1cmVkTWVtYmVyczoCOAEiuQIKFlF1ZXJ5UmVsYXRpb25hbENhcHR1cmUSIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhQYXJ0EikKBHBsYW4YAiABKAsyGy5jYW1pbm8uUXVlcnlSZWxhdGlvbmFsUGxhbhIWCg5yb290X29iamVjdF9pZBgDIAEoCRIsCgdvYmplY3RzGAQgAygLMhsuY2FtaW5vLlF1ZXJ5Q2FwdHVyZWRPYmplY3QSFgoOdmFyaWFibGVzX2pzb24YBSABKAkSEQoJcm93X2xpbWl0GAYgASgNEhcKD2NhbmRpZGF0ZV9saW1pdBgHIAEoDRIcCg9yZXNpZHVhbF93aW5kb3cYCCABKA1IAIgBARITCgtyZXN1bHRfcGF0aBgJIAMoCUISChBfcmVzaWR1YWxfd2luZG93IpgBChBRdWVyeVJlc2lkdWFsUm93EhAKCGVudHJ5X2lkGAEgASgJEjQKBmZpZWxkcxgCIAMoCzIkLmNhbWluby5RdWVyeVJlc2lkdWFsUm93LkZpZWxkc0VudHJ5GjwKC0ZpZWxkc0VudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEiNwoSUXVlcnlSZXNpZHVhbE9yZGVyEg0KBWZpZWxkGAEgASgJEhIKCmRlc2NlbmRpbmcYAiABKAgilgMKE1F1ZXJ5UmVzaWR1YWxXaW5kb3cSIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhQYXJ0EiYKBHJvd3MYAiADKAsyGC5jYW1pbm8uUXVlcnlSZXNpZHVhbFJvdxIWCg5wcmVkaWNhdGVfanNvbhgDIAEoCRIpCgVvcmRlchgEIAMoCzIaLmNhbWluby5RdWVyeVJlc2lkdWFsT3JkZXISDQoFbGltaXQYBSABKA0SEwoLYm91bmRlZF9hbGwYBiABKAgSKQoJc2VsZWN0aW9uGAcgAygLMhYuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uEkAKC2ZpZWxkX3R5cGVzGAggAygLMisuY2FtaW5vLlF1ZXJ5UmVzaWR1YWxXaW5kb3cuRmllbGRUeXBlc0VudHJ5EhIKCnJlbGF0aW9uYWwYCSABKAgSFwoPbWF0Y2hlZF9lbnRyaWVzGAogAygJGjEKD0ZpZWxkVHlwZXNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIkcKEVF1ZXJ5RmllbGRGYWlsdXJlEiMKBHBhdGgYASADKAsyFS5jYW1pbm8uUXVlcnlQYXRoUGFydBINCgVlcnJvchgCIAEoCSJQChNRdWVyeUNoYW5nZXNSZXF1ZXN0EhAKCHF1ZXJ5X2lkGAEgASgJEhEKCW9iamVjdF9pZBgCIAEoCRIUCgxkYXRhX3ZlcnNpb24YAyABKAkiJwoUUXVlcnlDaGFuZ2VzUmVzcG9uc2USDwoHY2hhbmdlZBgBIAEoCDLCCQoNQ2FtaW5vU2VydmljZRI7CgxFeGVjdXRlUXVlcnkSFC5jYW1pbm8uUXVlcnlSZXF1ZXN0GhUuY2FtaW5vLlF1ZXJ5UmVzcG9uc2USSQoMUXVlcnlDaGFuZ2VzEhsuY2FtaW5vLlF1ZXJ5Q2hhbmdlc1JlcXVlc3QaHC5jYW1pbm8uUXVlcnlDaGFuZ2VzUmVzcG9uc2USZwoWSW5zdGFsbFBlcnNpc3RlbmNlUGxhbhIlLmNhbWluby5JbnN0YWxsUGVyc2lzdGVuY2VQbGFuUmVxdWVzdBomLmNhbWluby5JbnN0YWxsUGVyc2lzdGVuY2VQbGFuUmVzcG9uc2USWwoSR2V0UGVyc2lzdGVuY2VQbGFuEiEuY2FtaW5vLkdldFBlcnNpc3RlbmNlUGxhblJlcXVlc3QaIi5jYW1pbm8uR2V0UGVyc2lzdGVuY2VQbGFuUmVzcG9uc2USSQoMQ3JlYXRlT2JqZWN0EhsuY2FtaW5vLkNyZWF0ZU9iamVjdFJlcXVlc3QaHC5jYW1pbm8uQ3JlYXRlT2JqZWN0UmVzcG9uc2USQAoJR2V0T2JqZWN0EhguY2FtaW5vLkdldE9iamVjdFJlcXVlc3QaGS5jYW1pbm8uR2V0T2JqZWN0UmVzcG9uc2USRgoLTGlzdE9iamVjdHMSGi5jYW1pbm8uTGlzdE9iamVjdHNSZXF1ZXN0GhsuY2FtaW5vLkxpc3RPYmplY3RzUmVzcG9uc2USQAoJUmVhZFN0YXRlEhguY2FtaW5vLlJlYWRTdGF0ZVJlcXVlc3QaGS5jYW1pbm8uUmVhZFN0YXRlUmVzcG9uc2USQwoKV3JpdGVTdGF0ZRIZLmNhbWluby5Xcml0ZVN0YXRlUmVxdWVzdBoaLmNhbWluby5Xcml0ZVN0YXRlUmVzcG9uc2USRgoLQ29ubmVjdEVkZ2USGi5jYW1pbm8uQ29ubmVjdEVkZ2VSZXF1ZXN0GhsuY2FtaW5vLkNvbm5lY3RFZGdlUmVzcG9uc2USRgoLUmVzb2x2ZUVkZ2USGi5jYW1pbm8uUmVzb2x2ZUVkZ2VSZXF1ZXN0GhsuY2FtaW5vLlJlc29sdmVFZGdlUmVzcG9uc2USTwoORGlzY29ubmVjdEVkZ2USHS5jYW1pbm8uRGlzY29ubmVjdEVkZ2VSZXF1ZXN0Gh4uY2FtaW5vLkRpc2Nvbm5lY3RFZGdlUmVzcG9uc2USTAoOUmVhZENvbGxlY3Rpb24SGi5jYW1pbm8uUmVzb2x2ZUVkZ2VSZXF1ZXN0Gh4uY2FtaW5vLlJlYWRDb2xsZWN0aW9uUmVzcG9uc2USVQoRUmVwbGFjZUNvbGxlY3Rpb24SIC5jYW1pbm8uUmVwbGFjZUNvbGxlY3Rpb25SZXF1ZXN0Gh4uY2FtaW5vLlJlYWRDb2xsZWN0aW9uUmVzcG9uc2USOgoHTGlzdE9wcxIWLmNhbWluby5MaXN0T3BzUmVxdWVzdBoXLmNhbWluby5MaXN0T3BzUmVzcG9uc2USRQoLV2F0Y2hPYmplY3QSGi5jYW1pbm8uV2F0Y2hPYmplY3RSZXF1ZXN0GhguY2FtaW5vLldhdGNoT2JqZWN0RXZlbnQwAWIGcHJvdG8z", [file_camino_schema, file_quixos_refs]); + fileDesc("ChBjYW1pbm8vYXBpLnByb3RvEgZjYW1pbm8iCwoJTnVsbFZhbHVlInwKC09iamVjdFZhbHVlEi8KBmZpZWxkcxgBIAMoCzIfLmNhbWluby5PYmplY3RWYWx1ZS5GaWVsZHNFbnRyeRo8CgtGaWVsZHNFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIioKCUxpc3RWYWx1ZRIdCgZ2YWx1ZXMYASADKAsyDS5jYW1pbm8uVmFsdWUiHQoIUmVmVmFsdWUSEQoJb2JqZWN0X2lkGAEgASgJIjwKCUNyZHRWYWx1ZRIMCgR0eXBlGAEgASgJEhAKCGVuY29kaW5nGAIgASgJEg8KB3BheWxvYWQYAyABKAwiqAEKEFN0YXRlVmFsdWVTb3VyY2USEQoJb2JqZWN0X2lkGAEgASgJEg8KB3Nsb3RfaWQYAiABKAkSFwoPdmFsdWVfdHlwZV9qc29uGAMgASgJEhsKE3N0b3JhZ2VfcG9saWN5X2pzb24YBCABKAkSEAoIcmV2aXNpb24YBSABKAQSKAoNY3JkdF9zbmFwc2hvdBgGIAEoCzIRLmNhbWluby5DcmR0VmFsdWUiNgoLVmFsdWVTb3VyY2USJwoFc3RhdGUYASABKAsyGC5jYW1pbm8uU3RhdGVWYWx1ZVNvdXJjZSKpAwoFVmFsdWUSJwoKbnVsbF92YWx1ZRgBIAEoCzIRLmNhbWluby5OdWxsVmFsdWVIABIUCgpib29sX3ZhbHVlGAIgASgISAASFgoMbnVtYmVyX3ZhbHVlGAMgASgBSAASFgoMc3RyaW5nX3ZhbHVlGAQgASgJSAASFwoNaW50ZWdlcl92YWx1ZRgFIAEoCUgAEhUKC2J5dGVzX3ZhbHVlGAYgASgMSAASKwoMb2JqZWN0X3ZhbHVlGAcgASgLMhMuY2FtaW5vLk9iamVjdFZhbHVlSAASJwoKbGlzdF92YWx1ZRgIIAEoCzIRLmNhbWluby5MaXN0VmFsdWVIABIlCglyZWZfdmFsdWUYCSABKAsyEC5jYW1pbm8uUmVmVmFsdWVIABInCgpjcmR0X3ZhbHVlGAogASgLMhEuY2FtaW5vLkNyZHRWYWx1ZUgAEiMKBnNvdXJjZRgLIAEoCzITLmNhbWluby5WYWx1ZVNvdXJjZRIuCgxxdWVyeV9vcmlnaW4YDCABKAsyGC5jYW1pbm8uUXVlcnlGaWVsZE9yaWdpbkIGCgRraW5kIpUBChBRdWVyeUZpZWxkT3JpZ2luEhQKDHNlbGVjdGlvbl9pZBgBIAEoCRIPCgdhdG9tX2lkGAIgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgDIAEoCRIRCgltZW1iZXJfaWQYBCABKAkSKAoGc291cmNlGAUgASgLMhguY2FtaW5vLlN0YXRlVmFsdWVTb3VyY2UikwIKDlF1ZXJ5TGl2ZUZpZWxkEiMKBHBhdGgYASADKAsyFS5jYW1pbm8uUXVlcnlQYXRoUGFydBIUCgxzZWxlY3Rpb25faWQYAiABKAkSEQoJb2JqZWN0X2lkGAMgASgJEikKCmNhcGFiaWxpdHkYBCABKAsyFS5xdWl4b3MuQ2FwYWJpbGl0eVJlZhIaChJ3YXRjaF9vcGVyYXRpb25faWQYBSABKAkSGwoTc2V0dGVyX29wZXJhdGlvbl9pZBgGIAEoCRIlCgdlZGl0aW5nGAcgASgLMhQucXVpeG9zLkZpZWxkRWRpdGluZxIoCgZzb3VyY2UYCCABKAsyGC5jYW1pbm8uU3RhdGVWYWx1ZVNvdXJjZSJGCh1JbnN0YWxsUGVyc2lzdGVuY2VQbGFuUmVxdWVzdBIlCgRwbGFuGAEgASgLMhcuY2FtaW5vLlBlcnNpc3RlbmNlUGxhbiJHCh5JbnN0YWxsUGVyc2lzdGVuY2VQbGFuUmVzcG9uc2USJQoEcGxhbhgBIAEoCzIXLmNhbWluby5QZXJzaXN0ZW5jZVBsYW4iGwoZR2V0UGVyc2lzdGVuY2VQbGFuUmVxdWVzdCJDChpHZXRQZXJzaXN0ZW5jZVBsYW5SZXNwb25zZRIlCgRwbGFuGAEgASgLMhcuY2FtaW5vLlBlcnNpc3RlbmNlUGxhbiKwAQoTQ3JlYXRlT2JqZWN0UmVxdWVzdBIPCgdhdG9tX2lkGAEgASgJEkQKDWluaXRpYWxfc3RhdGUYAiADKAsyLS5jYW1pbm8uQ3JlYXRlT2JqZWN0UmVxdWVzdC5Jbml0aWFsU3RhdGVFbnRyeRpCChFJbml0aWFsU3RhdGVFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIjwKFENyZWF0ZU9iamVjdFJlc3BvbnNlEiQKBm9iamVjdBgBIAEoCzIULmNhbWluby5DYW1pbm9PYmplY3QiJQoQR2V0T2JqZWN0UmVxdWVzdBIRCglvYmplY3RfaWQYASABKAkiOQoRR2V0T2JqZWN0UmVzcG9uc2USJAoGb2JqZWN0GAEgASgLMhQuY2FtaW5vLkNhbWlub09iamVjdCIlChJMaXN0T2JqZWN0c1JlcXVlc3QSDwoHYXRvbV9pZBgBIAEoCSI8ChNMaXN0T2JqZWN0c1Jlc3BvbnNlEiUKB29iamVjdHMYASADKAsyFC5jYW1pbm8uQ2FtaW5vT2JqZWN0IjYKEFJlYWRTdGF0ZVJlcXVlc3QSEQoJb2JqZWN0X2lkGAEgASgJEg8KB3Nsb3RfaWQYAiABKAkiMQoRUmVhZFN0YXRlUmVzcG9uc2USHAoFdmFsdWUYASABKAsyDS5jYW1pbm8uVmFsdWUicQoRV3JpdGVTdGF0ZVJlcXVlc3QSEQoJb2JqZWN0X2lkGAEgASgJEg8KB3Nsb3RfaWQYAiABKAkSHAoFdmFsdWUYAyABKAsyDS5jYW1pbm8uVmFsdWUSGgoSY2xpZW50X211dGF0aW9uX2lkGAQgASgJIlgKEldyaXRlU3RhdGVSZXNwb25zZRIcCgV2YWx1ZRgBIAEoCzINLmNhbWluby5WYWx1ZRIkCgZvYmplY3QYAiABKAsyFC5jYW1pbm8uQ2FtaW5vT2JqZWN0IsABChJDb25uZWN0RWRnZVJlcXVlc3QSFAoMZWRnZV90eXBlX2lkGAEgASgJEhUKDXByb2plY3Rpb25faWQYAiABKAkSEQoJb2JqZWN0X2lkGAMgASgJEhgKEHRhcmdldF9vYmplY3RfaWQYBCABKAkSFAoHb3JkaW5hbBgFIAEoBUgAiAEBEhsKDnRhcmdldF9vcmRpbmFsGAYgASgFSAGIAQFCCgoIX29yZGluYWxCEQoPX3RhcmdldF9vcmRpbmFsIjcKE0Nvbm5lY3RFZGdlUmVzcG9uc2USIAoEZWRnZRgBIAEoCzISLmNhbWluby5DYW1pbm9FZGdlIlQKElJlc29sdmVFZGdlUmVxdWVzdBIRCglvYmplY3RfaWQYASABKAkSFAoMZWRnZV90eXBlX2lkGAIgASgJEhUKDXByb2plY3Rpb25faWQYAyABKAkiOAoTUmVzb2x2ZUVkZ2VSZXNwb25zZRIhCgVlZGdlcxgBIAMoCzISLmNhbWluby5DYW1pbm9FZGdlIigKFURpc2Nvbm5lY3RFZGdlUmVxdWVzdBIPCgdlZGdlX2lkGAEgASgJIikKFkRpc2Nvbm5lY3RFZGdlUmVzcG9uc2USDwoHZWRnZV9pZBgBIAEoCSJYCg9Db2xsZWN0aW9uRW50cnkSDwoHZWRnZV9pZBgBIAEoCRIYChB0YXJnZXRfb2JqZWN0X2lkGAIgASgJEhoKA2tleRgDIAEoCzINLmNhbWluby5WYWx1ZSJUChZSZWFkQ29sbGVjdGlvblJlc3BvbnNlEhAKCHJldmlzaW9uGAEgASgEEigKB2VudHJpZXMYAiADKAsyFy5jYW1pbm8uQ29sbGVjdGlvbkVudHJ5Ip8BChhSZXBsYWNlQ29sbGVjdGlvblJlcXVlc3QSEQoJb2JqZWN0X2lkGAEgASgJEhQKDGVkZ2VfdHlwZV9pZBgCIAEoCRIVCg1wcm9qZWN0aW9uX2lkGAMgASgJEhkKEWV4cGVjdGVkX3JldmlzaW9uGAQgASgEEigKB2VudHJpZXMYBSADKAsyFy5jYW1pbm8uQ29sbGVjdGlvbkVudHJ5IiMKDkxpc3RPcHNSZXF1ZXN0EhEKCW9iamVjdF9pZBgBIAEoCSIwCg9MaXN0T3BzUmVzcG9uc2USHQoDb3BzGAEgAygLMhAuY2FtaW5vLkNhbWlub09wIm4KEldhdGNoT2JqZWN0UmVxdWVzdBIRCglvYmplY3RfaWQYASABKAkSEwoLYWZ0ZXJfb3BfaWQYAiABKAkSGAoQaW5jbHVkZV9zbmFwc2hvdBgDIAEoCBIWCg5hdHRhY2htZW50X2lkcxgEIAMoCSJrChBXYXRjaE9iamVjdEV2ZW50EhEKCW9iamVjdF9pZBgBIAEoCRImCghzbmFwc2hvdBgCIAEoCzIULmNhbWluby5DYW1pbm9PYmplY3QSHAoCb3AYAyABKAsyEC5jYW1pbm8uQ2FtaW5vT3Ai2QIKDENhbWlub09iamVjdBIKCgJpZBgBIAEoCRIPCgdhdG9tX2lkGAIgASgJEh0KFXdvcmtzcGFjZV9yZXZpc2lvbl9pZBgDIAEoCRISCgpjcmVhdGVkX2F0GAQgASgJEhIKCnVwZGF0ZWRfYXQYBSABKAkSLgoFc3RhdGUYBiADKAsyHy5jYW1pbm8uQ2FtaW5vT2JqZWN0LlN0YXRlRW50cnkSQQoPc3RhdGVfcmV2aXNpb25zGAcgAygLMiguY2FtaW5vLkNhbWlub09iamVjdC5TdGF0ZVJldmlzaW9uc0VudHJ5GjsKClN0YXRlRW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ARo1ChNTdGF0ZVJldmlzaW9uc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoBDoCOAEivwIKCkNhbWlub0VkZ2USCgoCaWQYASABKAkSFAoMZWRnZV90eXBlX2lkGAIgASgJEhcKD2ZpcnN0X29iamVjdF9pZBgDIAEoCRIYChBzZWNvbmRfb2JqZWN0X2lkGAQgASgJEhsKE2ZpcnN0X3Byb2plY3Rpb25faWQYBSABKAkSHAoUc2Vjb25kX3Byb2plY3Rpb25faWQYBiABKAkSGgoNZmlyc3Rfb3JkaW5hbBgHIAEoBUgAiAEBEhsKDnNlY29uZF9vcmRpbmFsGAggASgFSAGIAQESEgoKY3JlYXRlZF9hdBgJIAEoCRIWCg5maXJzdF9rZXlfanNvbhgKIAEoCRIXCg9zZWNvbmRfa2V5X2pzb24YCyABKAlCEAoOX2ZpcnN0X29yZGluYWxCEQoPX3NlY29uZF9vcmRpbmFsIpkBCghDYW1pbm9PcBIKCgJpZBgBIAEoCRIRCglvYmplY3RfaWQYAiABKAkSDwoHb3Bfa2luZBgDIAEoCRIeCgdwYXlsb2FkGAQgASgLMg0uY2FtaW5vLlZhbHVlEg0KBWFjdG9yGAUgASgJEhIKCmNyZWF0ZWRfYXQYBiABKAkSGgoSY2xpZW50X211dGF0aW9uX2lkGAcgASgJIpICCgxRdWVyeVJlcXVlc3QSEAoIcXVlcnlfaWQYASABKAkSEwoJb2JqZWN0X2lkGAIgASgJSAASNgoPd29ya3NwYWNlX3Njb3BlGAUgASgLMhsucXVpeG9zLldvcmtzcGFjZVF1ZXJ5U2NvcGVIABI2Cgl2YXJpYWJsZXMYAyADKAsyIy5jYW1pbm8uUXVlcnlSZXF1ZXN0LlZhcmlhYmxlc0VudHJ5EiIKGmV4cGVjdGVkX2RlZmluaXRpb25fZGlnZXN0GAQgASgJGj8KDlZhcmlhYmxlc0VudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAFCBgoEcm9vdCI5Cg1RdWVyeVBhdGhQYXJ0Eg8KBWZpZWxkGAEgASgJSAASDwoFaW5kZXgYAiABKA1IAEIGCgRwYXJ0It0CChFRdWVyeVBlbmRpbmdGaWVsZBIjCgRwYXRoGAEgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFBhcnQSEQoJb2JqZWN0X2lkGAIgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgDIAEoCRIRCgltZW1iZXJfaWQYBCABKAkSFAoMb3BlcmF0aW9uX2lkGAUgASgJEhcKD3ZhbHVlX3R5cGVfanNvbhgGIAEoCRIcCg9yZXNpZHVhbF93aW5kb3cYByABKA1IAIgBARIUCgxyZXNpZHVhbF9yb3cYCCABKA0SFgoOcmVzaWR1YWxfZmllbGQYCSABKAkSHwoScmVsYXRpb25hbF9jYXB0dXJlGAogASgNSAGIAQESFwoPY2FwdHVyZWRfb2JqZWN0GAsgASgNQhIKEF9yZXNpZHVhbF93aW5kb3dCFQoTX3JlbGF0aW9uYWxfY2FwdHVyZSL2AQoKUXVlcnlTdGF0cxIRCglzcWxfY291bnQYASABKA0SDgoGc3FsX21zGAIgASgBEhEKCXJwY19jb3VudBgDIAEoDRIOCgZycGNfbXMYBCABKAESFAoMcmVzdWx0X2J5dGVzGAUgASgNEhYKDnByZXBhcmF0aW9uX21zGAYgASgBEhAKCHRvdGFsX21zGAcgASgBEhkKEXJlbGF0aW9uYWxfc3RhZ2VzGAggASgNEhsKE2NhcHR1cmVkX2NhbmRpZGF0ZXMYCSABKA0SFQoNcmVsYXRpb25hbF9tcxgKIAEoARITCgtyZXNpZHVhbF9tcxgLIAEoASKmAwoNUXVlcnlSZXNwb25zZRIcCgV2YWx1ZRgBIAEoCzINLmNhbWluby5WYWx1ZRIUCgxkYXRhX3ZlcnNpb24YAiABKAkSFgoOYmluZGluZ19kaWdlc3QYAyABKAkSKgoHcGVuZGluZxgEIAMoCzIZLmNhbWluby5RdWVyeVBlbmRpbmdGaWVsZBIhCgVzdGF0cxgFIAEoCzISLmNhbWluby5RdWVyeVN0YXRzEhkKEXByZXBhcmF0aW9uX3Rva2VuGAYgASgJEikKBmVycm9ycxgHIAMoCzIZLmNhbWluby5RdWVyeUZpZWxkRmFpbHVyZRI1ChByZXNpZHVhbF93aW5kb3dzGAggAygLMhsuY2FtaW5vLlF1ZXJ5UmVzaWR1YWxXaW5kb3cSEwoLY29uc2lzdGVuY3kYCSABKAkSOwoTcmVsYXRpb25hbF9jYXB0dXJlcxgKIAMoCzIeLmNhbWluby5RdWVyeVJlbGF0aW9uYWxDYXB0dXJlEisKC2xpdmVfZmllbGRzGAsgAygLMhYuY2FtaW5vLlF1ZXJ5TGl2ZUZpZWxkIloKE1F1ZXJ5Q2FwdHVyZWRNZW1iZXISEQoJb2JqZWN0X2lkGAEgASgJEhAKCGVudHJ5X2lkGAIgASgJEh4KB21hcF9rZXkYAyABKAsyDS5jYW1pbm8uVmFsdWUiRAoUUXVlcnlDYXB0dXJlZE1lbWJlcnMSLAoHZW50cmllcxgBIAMoCzIbLmNhbWluby5RdWVyeUNhcHR1cmVkTWVtYmVyIq8DChNRdWVyeUNhcHR1cmVkT2JqZWN0EhEKCW9iamVjdF9pZBgBIAEoCRI3CgZmaWVsZHMYAiADKAsyJy5jYW1pbm8uUXVlcnlDYXB0dXJlZE9iamVjdC5GaWVsZHNFbnRyeRJACgtmaWVsZF90eXBlcxgDIAMoCzIrLmNhbWluby5RdWVyeUNhcHR1cmVkT2JqZWN0LkZpZWxkVHlwZXNFbnRyeRJFCg1yZWxhdGlvbnNoaXBzGAQgAygLMi4uY2FtaW5vLlF1ZXJ5Q2FwdHVyZWRPYmplY3QuUmVsYXRpb25zaGlwc0VudHJ5GjwKC0ZpZWxkc0VudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEaMQoPRmllbGRUeXBlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaUgoSUmVsYXRpb25zaGlwc0VudHJ5EgsKA2tleRgBIAEoCRIrCgV2YWx1ZRgCIAEoCzIcLmNhbWluby5RdWVyeUNhcHR1cmVkTWVtYmVyczoCOAEiuQIKFlF1ZXJ5UmVsYXRpb25hbENhcHR1cmUSIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhQYXJ0EikKBHBsYW4YAiABKAsyGy5jYW1pbm8uUXVlcnlSZWxhdGlvbmFsUGxhbhIWCg5yb290X29iamVjdF9pZBgDIAEoCRIsCgdvYmplY3RzGAQgAygLMhsuY2FtaW5vLlF1ZXJ5Q2FwdHVyZWRPYmplY3QSFgoOdmFyaWFibGVzX2pzb24YBSABKAkSEQoJcm93X2xpbWl0GAYgASgNEhcKD2NhbmRpZGF0ZV9saW1pdBgHIAEoDRIcCg9yZXNpZHVhbF93aW5kb3cYCCABKA1IAIgBARITCgtyZXN1bHRfcGF0aBgJIAMoCUISChBfcmVzaWR1YWxfd2luZG93IpgBChBRdWVyeVJlc2lkdWFsUm93EhAKCGVudHJ5X2lkGAEgASgJEjQKBmZpZWxkcxgCIAMoCzIkLmNhbWluby5RdWVyeVJlc2lkdWFsUm93LkZpZWxkc0VudHJ5GjwKC0ZpZWxkc0VudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEiNwoSUXVlcnlSZXNpZHVhbE9yZGVyEg0KBWZpZWxkGAEgASgJEhIKCmRlc2NlbmRpbmcYAiABKAgilgMKE1F1ZXJ5UmVzaWR1YWxXaW5kb3cSIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhQYXJ0EiYKBHJvd3MYAiADKAsyGC5jYW1pbm8uUXVlcnlSZXNpZHVhbFJvdxIWCg5wcmVkaWNhdGVfanNvbhgDIAEoCRIpCgVvcmRlchgEIAMoCzIaLmNhbWluby5RdWVyeVJlc2lkdWFsT3JkZXISDQoFbGltaXQYBSABKA0SEwoLYm91bmRlZF9hbGwYBiABKAgSKQoJc2VsZWN0aW9uGAcgAygLMhYuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uEkAKC2ZpZWxkX3R5cGVzGAggAygLMisuY2FtaW5vLlF1ZXJ5UmVzaWR1YWxXaW5kb3cuRmllbGRUeXBlc0VudHJ5EhIKCnJlbGF0aW9uYWwYCSABKAgSFwoPbWF0Y2hlZF9lbnRyaWVzGAogAygJGjEKD0ZpZWxkVHlwZXNFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIkcKEVF1ZXJ5RmllbGRGYWlsdXJlEiMKBHBhdGgYASADKAsyFS5jYW1pbm8uUXVlcnlQYXRoUGFydBINCgVlcnJvchgCIAEoCSKSAQoTUXVlcnlDaGFuZ2VzUmVxdWVzdBIQCghxdWVyeV9pZBgBIAEoCRITCglvYmplY3RfaWQYAiABKAlIABI2Cg93b3Jrc3BhY2Vfc2NvcGUYBCABKAsyGy5xdWl4b3MuV29ya3NwYWNlUXVlcnlTY29wZUgAEhQKDGRhdGFfdmVyc2lvbhgDIAEoCUIGCgRyb290IicKFFF1ZXJ5Q2hhbmdlc1Jlc3BvbnNlEg8KB2NoYW5nZWQYASABKAgywgkKDUNhbWlub1NlcnZpY2USOwoMRXhlY3V0ZVF1ZXJ5EhQuY2FtaW5vLlF1ZXJ5UmVxdWVzdBoVLmNhbWluby5RdWVyeVJlc3BvbnNlEkkKDFF1ZXJ5Q2hhbmdlcxIbLmNhbWluby5RdWVyeUNoYW5nZXNSZXF1ZXN0GhwuY2FtaW5vLlF1ZXJ5Q2hhbmdlc1Jlc3BvbnNlEmcKFkluc3RhbGxQZXJzaXN0ZW5jZVBsYW4SJS5jYW1pbm8uSW5zdGFsbFBlcnNpc3RlbmNlUGxhblJlcXVlc3QaJi5jYW1pbm8uSW5zdGFsbFBlcnNpc3RlbmNlUGxhblJlc3BvbnNlElsKEkdldFBlcnNpc3RlbmNlUGxhbhIhLmNhbWluby5HZXRQZXJzaXN0ZW5jZVBsYW5SZXF1ZXN0GiIuY2FtaW5vLkdldFBlcnNpc3RlbmNlUGxhblJlc3BvbnNlEkkKDENyZWF0ZU9iamVjdBIbLmNhbWluby5DcmVhdGVPYmplY3RSZXF1ZXN0GhwuY2FtaW5vLkNyZWF0ZU9iamVjdFJlc3BvbnNlEkAKCUdldE9iamVjdBIYLmNhbWluby5HZXRPYmplY3RSZXF1ZXN0GhkuY2FtaW5vLkdldE9iamVjdFJlc3BvbnNlEkYKC0xpc3RPYmplY3RzEhouY2FtaW5vLkxpc3RPYmplY3RzUmVxdWVzdBobLmNhbWluby5MaXN0T2JqZWN0c1Jlc3BvbnNlEkAKCVJlYWRTdGF0ZRIYLmNhbWluby5SZWFkU3RhdGVSZXF1ZXN0GhkuY2FtaW5vLlJlYWRTdGF0ZVJlc3BvbnNlEkMKCldyaXRlU3RhdGUSGS5jYW1pbm8uV3JpdGVTdGF0ZVJlcXVlc3QaGi5jYW1pbm8uV3JpdGVTdGF0ZVJlc3BvbnNlEkYKC0Nvbm5lY3RFZGdlEhouY2FtaW5vLkNvbm5lY3RFZGdlUmVxdWVzdBobLmNhbWluby5Db25uZWN0RWRnZVJlc3BvbnNlEkYKC1Jlc29sdmVFZGdlEhouY2FtaW5vLlJlc29sdmVFZGdlUmVxdWVzdBobLmNhbWluby5SZXNvbHZlRWRnZVJlc3BvbnNlEk8KDkRpc2Nvbm5lY3RFZGdlEh0uY2FtaW5vLkRpc2Nvbm5lY3RFZGdlUmVxdWVzdBoeLmNhbWluby5EaXNjb25uZWN0RWRnZVJlc3BvbnNlEkwKDlJlYWRDb2xsZWN0aW9uEhouY2FtaW5vLlJlc29sdmVFZGdlUmVxdWVzdBoeLmNhbWluby5SZWFkQ29sbGVjdGlvblJlc3BvbnNlElUKEVJlcGxhY2VDb2xsZWN0aW9uEiAuY2FtaW5vLlJlcGxhY2VDb2xsZWN0aW9uUmVxdWVzdBoeLmNhbWluby5SZWFkQ29sbGVjdGlvblJlc3BvbnNlEjoKB0xpc3RPcHMSFi5jYW1pbm8uTGlzdE9wc1JlcXVlc3QaFy5jYW1pbm8uTGlzdE9wc1Jlc3BvbnNlEkUKC1dhdGNoT2JqZWN0EhouY2FtaW5vLldhdGNoT2JqZWN0UmVxdWVzdBoYLmNhbWluby5XYXRjaE9iamVjdEV2ZW50MAFiBnByb3RvMw", [file_camino_schema, file_quixos_refs]); /** * @generated from message camino.NullValue @@ -1104,9 +1104,21 @@ export type QueryRequest = Message<"camino.QueryRequest"> & { queryId: string; /** - * @generated from field: string object_id = 2; + * @generated from oneof camino.QueryRequest.root */ - objectId: string; + root: { + /** + * @generated from field: string object_id = 2; + */ + value: string; + case: "objectId"; + } | { + /** + * @generated from field: quixos.WorkspaceQueryScope workspace_scope = 5; + */ + value: WorkspaceQueryScope; + case: "workspaceScope"; + } | { case: undefined; value?: undefined }; /** * @generated from field: map variables = 3; @@ -1641,9 +1653,21 @@ export type QueryChangesRequest = Message<"camino.QueryChangesRequest"> & { queryId: string; /** - * @generated from field: string object_id = 2; + * @generated from oneof camino.QueryChangesRequest.root */ - objectId: string; + root: { + /** + * @generated from field: string object_id = 2; + */ + value: string; + case: "objectId"; + } | { + /** + * @generated from field: quixos.WorkspaceQueryScope workspace_scope = 4; + */ + value: WorkspaceQueryScope; + case: "workspaceScope"; + } | { case: undefined; value?: undefined }; /** * @generated from field: string data_version = 3; diff --git a/src/gen/camino/schema_pb.ts b/src/gen/camino/schema_pb.ts index 644a900..373f551 100644 --- a/src/gen/camino/schema_pb.ts +++ b/src/gen/camino/schema_pb.ts @@ -10,7 +10,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file camino/schema.proto. */ export const file_camino_schema: GenFile = /*@__PURE__*/ - fileDesc("ChNjYW1pbm8vc2NoZW1hLnByb3RvEgZjYW1pbm8iNwoOQXRvbURlZmluaXRpb24SDwoHYXRvbV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkiWQoPQXRvbUNvbmZvcm1hbmNlEg8KB2F0b21faWQYASABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAIgASgJEhYKDmNvbmZvcm1hbmNlX2lkGAMgASgJIsIBCg9TdGF0ZUF0dGFjaG1lbnQSDwoHc2xvdF9pZBgBIAEoCRIYChBhdHRhY2hlZF9hdG9tX2lkGAIgASgJEhQKDGRpc3BsYXlfbmFtZRgDIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YBCABKAkSGwoTc3RvcmFnZV9wb2xpY3lfanNvbhgFIAEoCRIaChJkZWZhdWx0X3ZhbHVlX2pzb24YBiABKAkSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYByABKAkiUAoSRW5kcG9pbnRDb25zdHJhaW50EhEKB2F0b21faWQYASABKAlIABIfChVpbnRlcmZhY2VfcmV2aXNpb25faWQYAiABKAlIAEIGCgRraW5kIvsBCgxFZGdlRW5kcG9pbnQSFQoNcHJvamVjdGlvbl9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSLgoKY29uc3RyYWludBgDIAEoCzIaLmNhbWluby5FbmRwb2ludENvbnN0cmFpbnQSKAoLY2FyZGluYWxpdHkYBCABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSDwoHb3JkZXJlZBgFIAEoCBIRCglvbl9kZWxldGUYBiABKAkSFAoMcmV0YWluX290aGVyGAcgASgIEhAKCGtleV90eXBlGAggASgJEhgKEHB1YmxpY190cmF2ZXJzYWwYCSABKAgipQEKDkVkZ2VBdHRhY2htZW50EhQKDGVkZ2VfdHlwZV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSIwoFZmlyc3QYAyABKAsyFC5jYW1pbm8uRWRnZUVuZHBvaW50EiQKBnNlY29uZBgEIAEoCzIULmNhbWluby5FZGdlRW5kcG9pbnQSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYBSABKAkilQIKD1BlcnNpc3RlbmNlUGxhbhIUCgx3b3Jrc3BhY2VfaWQYASABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAIgASgJEiUKBWF0b21zGAMgAygLMhYuY2FtaW5vLkF0b21EZWZpbml0aW9uEi0KDGNvbmZvcm1hbmNlcxgEIAMoCzIXLmNhbWluby5BdG9tQ29uZm9ybWFuY2USJwoGc3RhdGVzGAUgAygLMhcuY2FtaW5vLlN0YXRlQXR0YWNobWVudBIlCgVlZGdlcxgGIAMoCzIWLmNhbWluby5FZGdlQXR0YWNobWVudBInCgdxdWVyaWVzGAcgAygLMhYuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5Ip4BCg1RdWVyeUFyZ3VtZW50EhIKCHZhcmlhYmxlGAEgASgJSAASFgoMbGl0ZXJhbF9qc29uGAIgASgJSAASKQoEbGlzdBgDIAEoCzIZLmNhbWluby5RdWVyeUFyZ3VtZW50TGlzdEgAEi0KBm9iamVjdBgEIAEoCzIbLmNhbWluby5RdWVyeUFyZ3VtZW50T2JqZWN0SABCBwoFdmFsdWUiOgoRUXVlcnlBcmd1bWVudExpc3QSJQoGdmFsdWVzGAEgAygLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQilAEKE1F1ZXJ5QXJndW1lbnRPYmplY3QSNwoGZmllbGRzGAEgAygLMicuY2FtaW5vLlF1ZXJ5QXJndW1lbnRPYmplY3QuRmllbGRzRW50cnkaRAoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQ6AjgBIkcKDlF1ZXJ5Q29uZGl0aW9uEg8KB2luY2x1ZGUYASABKAgSJAoFdmFsdWUYAiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCLUAwoOUXVlcnlTZWxlY3Rpb24SDAoEbmFtZRgBIAEoCRILCgNrZXkYAiABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAMgASgJEhEKCW1lbWJlcl9pZBgEIAEoCRIkChx0YXJnZXRfaW50ZXJmYWNlX3JldmlzaW9uX2lkGAUgASgJEioKCmNvbmRpdGlvbnMYBiADKAsyFi5jYW1pbm8uUXVlcnlDb25kaXRpb24SOAoJYXJndW1lbnRzGAcgAygLMiUuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uLkFyZ3VtZW50c0VudHJ5EikKCXNlbGVjdGlvbhgIIAMoCzIWLmNhbWluby5RdWVyeVNlbGVjdGlvbhIvCgpyZWxhdGlvbmFsGAkgASgLMhsuY2FtaW5vLlF1ZXJ5UmVsYXRpb25hbFBsYW4SKQoJcHJlZGljYXRlGAogASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEhkKEWxpdmVfc2VsZWN0aW9uX2lkGAsgASgJGkcKDkFyZ3VtZW50c0VudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50OgI4ASJqCg1RdWVyeVBhdGhTdGVwEhAKBnNvdXJjZRgBIAEoCEgAEhAKBnRhcmdldBgCIAEoCEgAEi0KCHJlbGF0aW9uGAMgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoSABCBgoEc3RlcCJ9ChFRdWVyeVJlbGF0aW9uUGF0aBIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEQoJbWVtYmVyX2lkGAIgASgJEiQKHHRhcmdldF9pbnRlcmZhY2VfcmV2aXNpb25faWQYAyABKAkSEAoIb3B0aW9uYWwYBCABKAgiRQoRUXVlcnlGaWVsZE9wZXJhbmQSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhEKCW1lbWJlcl9pZBgCIAEoCSK2AQoPUXVlcnlFeHByZXNzaW9uEiMKBHBhdGgYASADKAsyFS5jYW1pbm8uUXVlcnlQYXRoU3RlcBIqCgVmaWVsZBgCIAEoCzIZLmNhbWluby5RdWVyeUZpZWxkT3BlcmFuZEgAEg0KA3JlZhgDIAEoCUgAEg8KBWVudHJ5GAQgASgISAASEQoHbWFwX2tleRgFIAEoCEgAEhcKD3ZhbHVlX3R5cGVfanNvbhgGIAEoCUIGCgRsZWFmIoUBCg5RdWVyeVJlZHVjdGlvbhIwCghvcGVyYXRvchgBIAEoDjIeLmNhbWluby5RdWVyeUFnZ3JlZ2F0ZU9wZXJhdG9yEigKB29wZXJhbmQYAiABKAsyFy5jYW1pbm8uUXVlcnlFeHByZXNzaW9uEhcKD3ZhbHVlX3R5cGVfanNvbhgDIAEoCSJ1CgxRdWVyeU9wZXJhbmQSLQoKZXhwcmVzc2lvbhgBIAEoCzIXLmNhbWluby5RdWVyeUV4cHJlc3Npb25IABIrCglyZWR1Y3Rpb24YAiABKAsyFi5jYW1pbm8uUXVlcnlSZWR1Y3Rpb25IAEIJCgdvcGVyYW5kIpEBCg9RdWVyeUNvbXBhcmlzb24SJQoHb3BlcmFuZBgBIAEoCzIULmNhbWluby5RdWVyeU9wZXJhbmQSMQoIb3BlcmF0b3IYAiABKA4yHy5jYW1pbm8uUXVlcnlDb21wYXJpc29uT3BlcmF0b3ISJAoFdmFsdWUYAyABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCI+ChJRdWVyeVByZWRpY2F0ZUxpc3QSKAoIY2hpbGRyZW4YASADKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUi9QEKFlF1ZXJ5UmVsYXRpb25QcmVkaWNhdGUSIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhTdGVwEisKCHJlbGF0aW9uGAIgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoEjgKCG9wZXJhdG9yGAMgASgOMiYuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QcmVkaWNhdGVPcGVyYXRvchIpCglwcmVkaWNhdGUYBCABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUSJAoFdmFsdWUYBSABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCK6AQoXUXVlcnlSZWR1Y3Rpb25QcmVkaWNhdGUSIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhTdGVwEisKCHJlbGF0aW9uGAIgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoEiUKBXdoZXJlGAMgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEiYKBmhhdmluZxgEIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZSKsAgoOUXVlcnlQcmVkaWNhdGUSKQoDYW5kGAEgASgLMhouY2FtaW5vLlF1ZXJ5UHJlZGljYXRlTGlzdEgAEigKAm9yGAIgASgLMhouY2FtaW5vLlF1ZXJ5UHJlZGljYXRlTGlzdEgAEiUKA25vdBgDIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZUgAEioKB2NvbXBhcmUYBCABKAsyFy5jYW1pbm8uUXVlcnlDb21wYXJpc29uSAASMgoIcmVsYXRpb24YBSABKAsyHi5jYW1pbm8uUXVlcnlSZWxhdGlvblByZWRpY2F0ZUgAEjEKBnJlZHVjZRgGIAEoCzIfLmNhbWluby5RdWVyeVJlZHVjdGlvblByZWRpY2F0ZUgAQgsKCXByZWRpY2F0ZSJhCghRdWVyeVJvdxIoCgZvYmplY3QYASABKAsyFi5jYW1pbm8uUXVlcnlPYmplY3RSb3dIABIkCgRwYWlyGAIgASgLMhQuY2FtaW5vLlF1ZXJ5UGFpclJvd0gAQgUKA3JvdyJVCg5RdWVyeU9iamVjdFJvdxIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEgoKbWVtYmVyc2hpcBgCIAEoCBIQCghrZXlfdHlwZRgDIAEoCSJSCgxRdWVyeVBhaXJSb3cSIAoGc291cmNlGAEgASgLMhAuY2FtaW5vLlF1ZXJ5Um93EiAKBnRhcmdldBgCIAEoCzIQLmNhbWluby5RdWVyeVJvdyJFCghRdWVyeUtleRIMCgRwYXRoGAEgAygJEisKCmV4cHJlc3Npb24YAiABKAsyFy5jYW1pbm8uUXVlcnlFeHByZXNzaW9uIi8KDVF1ZXJ5RGlzdGluY3QSHgoEa2V5cxgBIAMoCzIQLmNhbWluby5RdWVyeUtleSJiCg5RdWVyeUV4cGFuc2lvbhIjCgRwYXRoGAEgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFN0ZXASKwoIcmVsYXRpb24YAiABKAsyGS5jYW1pbm8uUXVlcnlSZWxhdGlvblBhdGgimAIKFFF1ZXJ5UmVsYXRpb25hbFN0YWdlEgoKAmlkGAEgASgNEhIKBWlucHV0GAIgASgNSAGIAQESHQoDcm93GAMgASgLMhAuY2FtaW5vLlF1ZXJ5Um93EisKBnNvdXJjZRgEIAEoCzIZLmNhbWluby5RdWVyeVJlbGF0aW9uUGF0aEgAEigKBmZpbHRlchgFIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZUgAEigKBmV4cGFuZBgGIAEoCzIWLmNhbWluby5RdWVyeUV4cGFuc2lvbkgAEikKCGRpc3RpbmN0GAcgASgLMhUuY2FtaW5vLlF1ZXJ5RGlzdGluY3RIAEILCglvcGVyYXRpb25CCAoGX2lucHV0IlMKGFF1ZXJ5UmVkdWN0aW9uUHJvamVjdGlvbhIMCgRwYXRoGAEgAygJEikKCXJlZHVjdGlvbhgCIAEoCzIWLmNhbWluby5RdWVyeVJlZHVjdGlvbiJQChNRdWVyeUFnZ3JlZ2F0ZU9yZGVyEiUKB29wZXJhbmQYASABKAsyFC5jYW1pbm8uUXVlcnlPcGVyYW5kEhIKCmRlc2NlbmRpbmcYAiABKAgi0gMKF1F1ZXJ5UmVsYXRpb25hbFRlcm1pbmFsEg0KBXN0YWdlGAEgASgNEgwKBHBhdGgYAiADKAkSDgoGZ3JvdXBzGAMgASgIEh4KBGtleXMYBCADKAsyEC5jYW1pbm8uUXVlcnlLZXkSNAoKcmVkdWN0aW9ucxgFIAMoCzIgLmNhbWluby5RdWVyeVJlZHVjdGlvblByb2plY3Rpb24SJQoFd2hlcmUYBiABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUSJgoGaGF2aW5nGAcgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEioKBW9yZGVyGAggAygLMhsuY2FtaW5vLlF1ZXJ5QWdncmVnYXRlT3JkZXISJAoFZmlyc3QYCSABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudBIiCgNhbGwYCiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudBIkCgVhZnRlchgLIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50EikKCXNlbGVjdGlvbhgMIAMoCzIWLmNhbWluby5RdWVyeVNlbGVjdGlvbhIQCghyZXNpZHVhbBgNIAEoCBIMCgRyb3dzGA4gASgIIncKE1F1ZXJ5UmVsYXRpb25hbFBsYW4SLAoGc3RhZ2VzGAEgAygLMhwuY2FtaW5vLlF1ZXJ5UmVsYXRpb25hbFN0YWdlEjIKCXRlcm1pbmFscxgCIAMoCzIfLmNhbWluby5RdWVyeVJlbGF0aW9uYWxUZXJtaW5hbCLpAgoQUXVlcnlSZWFkQmluZGluZxIPCgdhdG9tX2lkGAEgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgCIAEoCRIRCgltZW1iZXJfaWQYAyABKAkSGwoTZ2V0dGVyX29wZXJhdGlvbl9pZBgEIAEoCRIPCgdzbG90X2lkGAUgASgJEhQKDGVkZ2VfdHlwZV9pZBgGIAEoCRIVCg1wcm9qZWN0aW9uX2lkGAcgASgJEgsKA3JwYxgIIAEoCBIgChh3YXRjaF9zdGFydF9vcGVyYXRpb25faWQYCSABKAkSHwoXd2F0Y2hfc3RvcF9vcGVyYXRpb25faWQYCiABKAkSEgoKZmllbGRfbmFtZRgLIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YDCABKAkSKAoLY2FyZGluYWxpdHkYDSABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSEAoIa2V5X3R5cGUYDiABKAkikgEKDFF1ZXJ5QnVkZ2V0cxIMCgRyb3dzGAEgASgNEg0KBWRlcHRoGAIgASgNEhQKDHJlc3VsdF9ieXRlcxgDIAEoDRISCgpjYW5kaWRhdGVzGAQgASgNEhEKCXJwY19jYWxscxgFIAEoDRITCgtjb25jdXJyZW5jeRgGIAEoDRITCgtkZWFkbGluZV9tcxgHIAEoDSKNBAoOSW5zdGFsbGVkUXVlcnkSCgoCaWQYASABKAkSGQoRZGVmaW5pdGlvbl9kaWdlc3QYAiABKAkSFgoOYmluZGluZ19kaWdlc3QYAyABKAkSIgoacm9vdF9pbnRlcmZhY2VfcmV2aXNpb25faWQYBCABKAkSKQoJc2VsZWN0aW9uGAUgAygLMhYuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uEioKCGJpbmRpbmdzGAYgAygLMhguY2FtaW5vLlF1ZXJ5UmVhZEJpbmRpbmcSJQoHYnVkZ2V0cxgHIAEoCzIULmNhbWluby5RdWVyeUJ1ZGdldHMSGwoTdmFyaWFibGVzX3R5cGVfanNvbhgIIAEoCRIYChBvdXRwdXRfdHlwZV9qc29uGAkgASgJEkcKEXZhcmlhYmxlX2RlZmF1bHRzGAogAygLMiwuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5LlZhcmlhYmxlRGVmYXVsdHNFbnRyeRINCgV3YXRjaBgLIAEoCBIbChNwb2xsaW5nX2ludGVydmFsX21zGAwgASgNEh4KFnJwY19wcmVkaWNhdGVfb3Jfb3JkZXIYDSABKAgaTgoVVmFyaWFibGVEZWZhdWx0c0VudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50OgI4ASpoCgtDYXJkaW5hbGl0eRIbChdDQVJESU5BTElUWV9VTlNQRUNJRklFRBAAEhAKDE9QVElPTkFMX09ORRABEg8KC0VYQUNUTFlfT05FEAISCAoETUFOWRADEg8KC01BTllfVU5JUVVFEAQqmgIKFlF1ZXJ5QWdncmVnYXRlT3BlcmF0b3ISKAokUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX1VOU1BFQ0lGSUVEEAASIgoeUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0NPVU5UEAESKgomUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0NPVU5UX1BSRVNFTlQQAhIgChxRVUVSWV9BR0dSRUdBVEVfT1BFUkFUT1JfU1VNEAMSIAocUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0FWRxAEEiAKHFFVRVJZX0FHR1JFR0FURV9PUEVSQVRPUl9NSU4QBRIgChxRVUVSWV9BR0dSRUdBVEVfT1BFUkFUT1JfTUFYEAYquQIKF1F1ZXJ5Q29tcGFyaXNvbk9wZXJhdG9yEikKJVFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfVU5TUEVDSUZJRUQQABIgChxRVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0VREAESIAocUVVFUllfQ09NUEFSSVNPTl9PUEVSQVRPUl9JThACEiUKIVFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfSVNfTlVMTBADEiAKHFFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfTFQQBBIhCh1RVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0xURRAFEiAKHFFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfR1QQBhIhCh1RVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0dURRAHKoQCCh5RdWVyeVJlbGF0aW9uUHJlZGljYXRlT3BlcmF0b3ISMQotUVVFUllfUkVMQVRJT05fUFJFRElDQVRFX09QRVJBVE9SX1VOU1BFQ0lGSUVEEAASKgomUVVFUllfUkVMQVRJT05fUFJFRElDQVRFX09QRVJBVE9SX1NPTUUQARIqCiZRVUVSWV9SRUxBVElPTl9QUkVESUNBVEVfT1BFUkFUT1JfTk9ORRACEigKJFFVRVJZX1JFTEFUSU9OX1BSRURJQ0FURV9PUEVSQVRPUl9JUxADEi0KKVFVRVJZX1JFTEFUSU9OX1BSRURJQ0FURV9PUEVSQVRPUl9JU19OVUxMEARiBnByb3RvMw"); + fileDesc("ChNjYW1pbm8vc2NoZW1hLnByb3RvEgZjYW1pbm8iNwoOQXRvbURlZmluaXRpb24SDwoHYXRvbV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkiWQoPQXRvbUNvbmZvcm1hbmNlEg8KB2F0b21faWQYASABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAIgASgJEhYKDmNvbmZvcm1hbmNlX2lkGAMgASgJIsIBCg9TdGF0ZUF0dGFjaG1lbnQSDwoHc2xvdF9pZBgBIAEoCRIYChBhdHRhY2hlZF9hdG9tX2lkGAIgASgJEhQKDGRpc3BsYXlfbmFtZRgDIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YBCABKAkSGwoTc3RvcmFnZV9wb2xpY3lfanNvbhgFIAEoCRIaChJkZWZhdWx0X3ZhbHVlX2pzb24YBiABKAkSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYByABKAkiUAoSRW5kcG9pbnRDb25zdHJhaW50EhEKB2F0b21faWQYASABKAlIABIfChVpbnRlcmZhY2VfcmV2aXNpb25faWQYAiABKAlIAEIGCgRraW5kIvsBCgxFZGdlRW5kcG9pbnQSFQoNcHJvamVjdGlvbl9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSLgoKY29uc3RyYWludBgDIAEoCzIaLmNhbWluby5FbmRwb2ludENvbnN0cmFpbnQSKAoLY2FyZGluYWxpdHkYBCABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSDwoHb3JkZXJlZBgFIAEoCBIRCglvbl9kZWxldGUYBiABKAkSFAoMcmV0YWluX290aGVyGAcgASgIEhAKCGtleV90eXBlGAggASgJEhgKEHB1YmxpY190cmF2ZXJzYWwYCSABKAgipQEKDkVkZ2VBdHRhY2htZW50EhQKDGVkZ2VfdHlwZV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSIwoFZmlyc3QYAyABKAsyFC5jYW1pbm8uRWRnZUVuZHBvaW50EiQKBnNlY29uZBgEIAEoCzIULmNhbWluby5FZGdlRW5kcG9pbnQSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYBSABKAkilQIKD1BlcnNpc3RlbmNlUGxhbhIUCgx3b3Jrc3BhY2VfaWQYASABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAIgASgJEiUKBWF0b21zGAMgAygLMhYuY2FtaW5vLkF0b21EZWZpbml0aW9uEi0KDGNvbmZvcm1hbmNlcxgEIAMoCzIXLmNhbWluby5BdG9tQ29uZm9ybWFuY2USJwoGc3RhdGVzGAUgAygLMhcuY2FtaW5vLlN0YXRlQXR0YWNobWVudBIlCgVlZGdlcxgGIAMoCzIWLmNhbWluby5FZGdlQXR0YWNobWVudBInCgdxdWVyaWVzGAcgAygLMhYuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5Ip4BCg1RdWVyeUFyZ3VtZW50EhIKCHZhcmlhYmxlGAEgASgJSAASFgoMbGl0ZXJhbF9qc29uGAIgASgJSAASKQoEbGlzdBgDIAEoCzIZLmNhbWluby5RdWVyeUFyZ3VtZW50TGlzdEgAEi0KBm9iamVjdBgEIAEoCzIbLmNhbWluby5RdWVyeUFyZ3VtZW50T2JqZWN0SABCBwoFdmFsdWUiOgoRUXVlcnlBcmd1bWVudExpc3QSJQoGdmFsdWVzGAEgAygLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQilAEKE1F1ZXJ5QXJndW1lbnRPYmplY3QSNwoGZmllbGRzGAEgAygLMicuY2FtaW5vLlF1ZXJ5QXJndW1lbnRPYmplY3QuRmllbGRzRW50cnkaRAoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQ6AjgBIkcKDlF1ZXJ5Q29uZGl0aW9uEg8KB2luY2x1ZGUYASABKAgSJAoFdmFsdWUYAiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCLUAwoOUXVlcnlTZWxlY3Rpb24SDAoEbmFtZRgBIAEoCRILCgNrZXkYAiABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAMgASgJEhEKCW1lbWJlcl9pZBgEIAEoCRIkChx0YXJnZXRfaW50ZXJmYWNlX3JldmlzaW9uX2lkGAUgASgJEioKCmNvbmRpdGlvbnMYBiADKAsyFi5jYW1pbm8uUXVlcnlDb25kaXRpb24SOAoJYXJndW1lbnRzGAcgAygLMiUuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uLkFyZ3VtZW50c0VudHJ5EikKCXNlbGVjdGlvbhgIIAMoCzIWLmNhbWluby5RdWVyeVNlbGVjdGlvbhIvCgpyZWxhdGlvbmFsGAkgASgLMhsuY2FtaW5vLlF1ZXJ5UmVsYXRpb25hbFBsYW4SKQoJcHJlZGljYXRlGAogASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEhkKEWxpdmVfc2VsZWN0aW9uX2lkGAsgASgJGkcKDkFyZ3VtZW50c0VudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50OgI4ASJqCg1RdWVyeVBhdGhTdGVwEhAKBnNvdXJjZRgBIAEoCEgAEhAKBnRhcmdldBgCIAEoCEgAEi0KCHJlbGF0aW9uGAMgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoSABCBgoEc3RlcCJ9ChFRdWVyeVJlbGF0aW9uUGF0aBIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEQoJbWVtYmVyX2lkGAIgASgJEiQKHHRhcmdldF9pbnRlcmZhY2VfcmV2aXNpb25faWQYAyABKAkSEAoIb3B0aW9uYWwYBCABKAgiRQoRUXVlcnlGaWVsZE9wZXJhbmQSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhEKCW1lbWJlcl9pZBgCIAEoCSK2AQoPUXVlcnlFeHByZXNzaW9uEiMKBHBhdGgYASADKAsyFS5jYW1pbm8uUXVlcnlQYXRoU3RlcBIqCgVmaWVsZBgCIAEoCzIZLmNhbWluby5RdWVyeUZpZWxkT3BlcmFuZEgAEg0KA3JlZhgDIAEoCUgAEg8KBWVudHJ5GAQgASgISAASEQoHbWFwX2tleRgFIAEoCEgAEhcKD3ZhbHVlX3R5cGVfanNvbhgGIAEoCUIGCgRsZWFmIoUBCg5RdWVyeVJlZHVjdGlvbhIwCghvcGVyYXRvchgBIAEoDjIeLmNhbWluby5RdWVyeUFnZ3JlZ2F0ZU9wZXJhdG9yEigKB29wZXJhbmQYAiABKAsyFy5jYW1pbm8uUXVlcnlFeHByZXNzaW9uEhcKD3ZhbHVlX3R5cGVfanNvbhgDIAEoCSJ1CgxRdWVyeU9wZXJhbmQSLQoKZXhwcmVzc2lvbhgBIAEoCzIXLmNhbWluby5RdWVyeUV4cHJlc3Npb25IABIrCglyZWR1Y3Rpb24YAiABKAsyFi5jYW1pbm8uUXVlcnlSZWR1Y3Rpb25IAEIJCgdvcGVyYW5kIpEBCg9RdWVyeUNvbXBhcmlzb24SJQoHb3BlcmFuZBgBIAEoCzIULmNhbWluby5RdWVyeU9wZXJhbmQSMQoIb3BlcmF0b3IYAiABKA4yHy5jYW1pbm8uUXVlcnlDb21wYXJpc29uT3BlcmF0b3ISJAoFdmFsdWUYAyABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCI+ChJRdWVyeVByZWRpY2F0ZUxpc3QSKAoIY2hpbGRyZW4YASADKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUi9QEKFlF1ZXJ5UmVsYXRpb25QcmVkaWNhdGUSIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhTdGVwEisKCHJlbGF0aW9uGAIgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoEjgKCG9wZXJhdG9yGAMgASgOMiYuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QcmVkaWNhdGVPcGVyYXRvchIpCglwcmVkaWNhdGUYBCABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUSJAoFdmFsdWUYBSABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCK6AQoXUXVlcnlSZWR1Y3Rpb25QcmVkaWNhdGUSIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhTdGVwEisKCHJlbGF0aW9uGAIgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoEiUKBXdoZXJlGAMgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEiYKBmhhdmluZxgEIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZSKsAgoOUXVlcnlQcmVkaWNhdGUSKQoDYW5kGAEgASgLMhouY2FtaW5vLlF1ZXJ5UHJlZGljYXRlTGlzdEgAEigKAm9yGAIgASgLMhouY2FtaW5vLlF1ZXJ5UHJlZGljYXRlTGlzdEgAEiUKA25vdBgDIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZUgAEioKB2NvbXBhcmUYBCABKAsyFy5jYW1pbm8uUXVlcnlDb21wYXJpc29uSAASMgoIcmVsYXRpb24YBSABKAsyHi5jYW1pbm8uUXVlcnlSZWxhdGlvblByZWRpY2F0ZUgAEjEKBnJlZHVjZRgGIAEoCzIfLmNhbWluby5RdWVyeVJlZHVjdGlvblByZWRpY2F0ZUgAQgsKCXByZWRpY2F0ZSJhCghRdWVyeVJvdxIoCgZvYmplY3QYASABKAsyFi5jYW1pbm8uUXVlcnlPYmplY3RSb3dIABIkCgRwYWlyGAIgASgLMhQuY2FtaW5vLlF1ZXJ5UGFpclJvd0gAQgUKA3JvdyJVCg5RdWVyeU9iamVjdFJvdxIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEgoKbWVtYmVyc2hpcBgCIAEoCBIQCghrZXlfdHlwZRgDIAEoCSJSCgxRdWVyeVBhaXJSb3cSIAoGc291cmNlGAEgASgLMhAuY2FtaW5vLlF1ZXJ5Um93EiAKBnRhcmdldBgCIAEoCzIQLmNhbWluby5RdWVyeVJvdyJFCghRdWVyeUtleRIMCgRwYXRoGAEgAygJEisKCmV4cHJlc3Npb24YAiABKAsyFy5jYW1pbm8uUXVlcnlFeHByZXNzaW9uIi8KDVF1ZXJ5RGlzdGluY3QSHgoEa2V5cxgBIAMoCzIQLmNhbWluby5RdWVyeUtleSJiCg5RdWVyeUV4cGFuc2lvbhIjCgRwYXRoGAEgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFN0ZXASKwoIcmVsYXRpb24YAiABKAsyGS5jYW1pbm8uUXVlcnlSZWxhdGlvblBhdGgimAIKFFF1ZXJ5UmVsYXRpb25hbFN0YWdlEgoKAmlkGAEgASgNEhIKBWlucHV0GAIgASgNSAGIAQESHQoDcm93GAMgASgLMhAuY2FtaW5vLlF1ZXJ5Um93EisKBnNvdXJjZRgEIAEoCzIZLmNhbWluby5RdWVyeVJlbGF0aW9uUGF0aEgAEigKBmZpbHRlchgFIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZUgAEigKBmV4cGFuZBgGIAEoCzIWLmNhbWluby5RdWVyeUV4cGFuc2lvbkgAEikKCGRpc3RpbmN0GAcgASgLMhUuY2FtaW5vLlF1ZXJ5RGlzdGluY3RIAEILCglvcGVyYXRpb25CCAoGX2lucHV0IlMKGFF1ZXJ5UmVkdWN0aW9uUHJvamVjdGlvbhIMCgRwYXRoGAEgAygJEikKCXJlZHVjdGlvbhgCIAEoCzIWLmNhbWluby5RdWVyeVJlZHVjdGlvbiJQChNRdWVyeUFnZ3JlZ2F0ZU9yZGVyEiUKB29wZXJhbmQYASABKAsyFC5jYW1pbm8uUXVlcnlPcGVyYW5kEhIKCmRlc2NlbmRpbmcYAiABKAgi0gMKF1F1ZXJ5UmVsYXRpb25hbFRlcm1pbmFsEg0KBXN0YWdlGAEgASgNEgwKBHBhdGgYAiADKAkSDgoGZ3JvdXBzGAMgASgIEh4KBGtleXMYBCADKAsyEC5jYW1pbm8uUXVlcnlLZXkSNAoKcmVkdWN0aW9ucxgFIAMoCzIgLmNhbWluby5RdWVyeVJlZHVjdGlvblByb2plY3Rpb24SJQoFd2hlcmUYBiABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUSJgoGaGF2aW5nGAcgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEioKBW9yZGVyGAggAygLMhsuY2FtaW5vLlF1ZXJ5QWdncmVnYXRlT3JkZXISJAoFZmlyc3QYCSABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudBIiCgNhbGwYCiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudBIkCgVhZnRlchgLIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50EikKCXNlbGVjdGlvbhgMIAMoCzIWLmNhbWluby5RdWVyeVNlbGVjdGlvbhIQCghyZXNpZHVhbBgNIAEoCBIMCgRyb3dzGA4gASgIIncKE1F1ZXJ5UmVsYXRpb25hbFBsYW4SLAoGc3RhZ2VzGAEgAygLMhwuY2FtaW5vLlF1ZXJ5UmVsYXRpb25hbFN0YWdlEjIKCXRlcm1pbmFscxgCIAMoCzIfLmNhbWluby5RdWVyeVJlbGF0aW9uYWxUZXJtaW5hbCLpAgoQUXVlcnlSZWFkQmluZGluZxIPCgdhdG9tX2lkGAEgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgCIAEoCRIRCgltZW1iZXJfaWQYAyABKAkSGwoTZ2V0dGVyX29wZXJhdGlvbl9pZBgEIAEoCRIPCgdzbG90X2lkGAUgASgJEhQKDGVkZ2VfdHlwZV9pZBgGIAEoCRIVCg1wcm9qZWN0aW9uX2lkGAcgASgJEgsKA3JwYxgIIAEoCBIgChh3YXRjaF9zdGFydF9vcGVyYXRpb25faWQYCSABKAkSHwoXd2F0Y2hfc3RvcF9vcGVyYXRpb25faWQYCiABKAkSEgoKZmllbGRfbmFtZRgLIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YDCABKAkSKAoLY2FyZGluYWxpdHkYDSABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSEAoIa2V5X3R5cGUYDiABKAkirwEKElF1ZXJ5RmllbGRDb250cmFjdBIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEQoJbWVtYmVyX2lkGAIgASgJEhIKCmZpZWxkX25hbWUYAyABKAkSFwoPdmFsdWVfdHlwZV9qc29uGAQgASgJEigKC2NhcmRpbmFsaXR5GAUgASgOMhMuY2FtaW5vLkNhcmRpbmFsaXR5EhAKCGtleV90eXBlGAYgASgJIpIBCgxRdWVyeUJ1ZGdldHMSDAoEcm93cxgBIAEoDRINCgVkZXB0aBgCIAEoDRIUCgxyZXN1bHRfYnl0ZXMYAyABKA0SEgoKY2FuZGlkYXRlcxgEIAEoDRIRCglycGNfY2FsbHMYBSABKA0SEwoLY29uY3VycmVuY3kYBiABKA0SEwoLZGVhZGxpbmVfbXMYByABKA0i7wQKDkluc3RhbGxlZFF1ZXJ5EgoKAmlkGAEgASgJEhkKEWRlZmluaXRpb25fZGlnZXN0GAIgASgJEhYKDmJpbmRpbmdfZGlnZXN0GAMgASgJEhoKEG9iamVjdF9pbnRlcmZhY2UYBCABKAlIABIdChN3b3Jrc3BhY2VfaW50ZXJmYWNlGA4gASgJSAASKQoJc2VsZWN0aW9uGAUgAygLMhYuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uEioKCGJpbmRpbmdzGAYgAygLMhguY2FtaW5vLlF1ZXJ5UmVhZEJpbmRpbmcSJQoHYnVkZ2V0cxgHIAEoCzIULmNhbWluby5RdWVyeUJ1ZGdldHMSGwoTdmFyaWFibGVzX3R5cGVfanNvbhgIIAEoCRIYChBvdXRwdXRfdHlwZV9qc29uGAkgASgJEkcKEXZhcmlhYmxlX2RlZmF1bHRzGAogAygLMiwuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5LlZhcmlhYmxlRGVmYXVsdHNFbnRyeRINCgV3YXRjaBgLIAEoCBIbChNwb2xsaW5nX2ludGVydmFsX21zGAwgASgNEh4KFnJwY19wcmVkaWNhdGVfb3Jfb3JkZXIYDSABKAgSFQoNcm9vdF9hdG9tX2lkcxgPIAMoCRIqCgZmaWVsZHMYECADKAsyGi5jYW1pbm8uUXVlcnlGaWVsZENvbnRyYWN0Gk4KFVZhcmlhYmxlRGVmYXVsdHNFbnRyeRILCgNrZXkYASABKAkSJAoFdmFsdWUYAiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudDoCOAFCBgoEcm9vdCpoCgtDYXJkaW5hbGl0eRIbChdDQVJESU5BTElUWV9VTlNQRUNJRklFRBAAEhAKDE9QVElPTkFMX09ORRABEg8KC0VYQUNUTFlfT05FEAISCAoETUFOWRADEg8KC01BTllfVU5JUVVFEAQqmgIKFlF1ZXJ5QWdncmVnYXRlT3BlcmF0b3ISKAokUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX1VOU1BFQ0lGSUVEEAASIgoeUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0NPVU5UEAESKgomUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0NPVU5UX1BSRVNFTlQQAhIgChxRVUVSWV9BR0dSRUdBVEVfT1BFUkFUT1JfU1VNEAMSIAocUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0FWRxAEEiAKHFFVRVJZX0FHR1JFR0FURV9PUEVSQVRPUl9NSU4QBRIgChxRVUVSWV9BR0dSRUdBVEVfT1BFUkFUT1JfTUFYEAYquQIKF1F1ZXJ5Q29tcGFyaXNvbk9wZXJhdG9yEikKJVFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfVU5TUEVDSUZJRUQQABIgChxRVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0VREAESIAocUVVFUllfQ09NUEFSSVNPTl9PUEVSQVRPUl9JThACEiUKIVFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfSVNfTlVMTBADEiAKHFFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfTFQQBBIhCh1RVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0xURRAFEiAKHFFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfR1QQBhIhCh1RVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0dURRAHKoQCCh5RdWVyeVJlbGF0aW9uUHJlZGljYXRlT3BlcmF0b3ISMQotUVVFUllfUkVMQVRJT05fUFJFRElDQVRFX09QRVJBVE9SX1VOU1BFQ0lGSUVEEAASKgomUVVFUllfUkVMQVRJT05fUFJFRElDQVRFX09QRVJBVE9SX1NPTUUQARIqCiZRVUVSWV9SRUxBVElPTl9QUkVESUNBVEVfT1BFUkFUT1JfTk9ORRACEigKJFFVRVJZX1JFTEFUSU9OX1BSRURJQ0FURV9PUEVSQVRPUl9JUxADEi0KKVFVRVJZX1JFTEFUSU9OX1BSRURJQ0FURV9PUEVSQVRPUl9JU19OVUxMEARiBnByb3RvMw"); /** * @generated from message camino.AtomDefinition @@ -1248,6 +1248,50 @@ export type QueryReadBinding = Message<"camino.QueryReadBinding"> & { export const QueryReadBindingSchema: GenMessage = /*@__PURE__*/ messageDesc(file_camino_schema, 34); +/** + * Checked schema survives even when no atom currently implements an interface. + * + * @generated from message camino.QueryFieldContract + */ +export type QueryFieldContract = Message<"camino.QueryFieldContract"> & { + /** + * @generated from field: string interface_revision_id = 1; + */ + interfaceRevisionId: string; + + /** + * @generated from field: string member_id = 2; + */ + memberId: string; + + /** + * @generated from field: string field_name = 3; + */ + fieldName: string; + + /** + * @generated from field: string value_type_json = 4; + */ + valueTypeJson: string; + + /** + * @generated from field: camino.Cardinality cardinality = 5; + */ + cardinality: Cardinality; + + /** + * @generated from field: string key_type = 6; + */ + keyType: string; +}; + +/** + * Describes the message camino.QueryFieldContract. + * Use `create(QueryFieldContractSchema)` to create a new message. + */ +export const QueryFieldContractSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_camino_schema, 35); + /** * @generated from message camino.QueryBudgets */ @@ -1293,7 +1337,7 @@ export type QueryBudgets = Message<"camino.QueryBudgets"> & { * Use `create(QueryBudgetsSchema)` to create a new message. */ export const QueryBudgetsSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_schema, 35); + messageDesc(file_camino_schema, 36); /** * @generated from message camino.InstalledQuery @@ -1315,9 +1359,21 @@ export type InstalledQuery = Message<"camino.InstalledQuery"> & { bindingDigest: string; /** - * @generated from field: string root_interface_revision_id = 4; + * @generated from oneof camino.InstalledQuery.root */ - rootInterfaceRevisionId: string; + root: { + /** + * @generated from field: string object_interface = 4; + */ + value: string; + case: "objectInterface"; + } | { + /** + * @generated from field: string workspace_interface = 14; + */ + value: string; + case: "workspaceInterface"; + } | { case: undefined; value?: undefined }; /** * @generated from field: repeated camino.QuerySelection selection = 5; @@ -1363,6 +1419,16 @@ export type InstalledQuery = Message<"camino.InstalledQuery"> & { * @generated from field: bool rpc_predicate_or_order = 13; */ rpcPredicateOrOrder: boolean; + + /** + * @generated from field: repeated string root_atom_ids = 15; + */ + rootAtomIds: string[]; + + /** + * @generated from field: repeated camino.QueryFieldContract fields = 16; + */ + fields: QueryFieldContract[]; }; /** @@ -1370,7 +1436,7 @@ export type InstalledQuery = Message<"camino.InstalledQuery"> & { * Use `create(InstalledQuerySchema)` to create a new message. */ export const InstalledQuerySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_schema, 36); + messageDesc(file_camino_schema, 37); /** * @generated from enum camino.Cardinality diff --git a/src/gen/quixos/orch_pb.ts b/src/gen/quixos/orch_pb.ts index 80285fd..71f6f42 100644 --- a/src/gen/quixos/orch_pb.ts +++ b/src/gen/quixos/orch_pb.ts @@ -10,7 +10,7 @@ import type { InstalledQuery } from "../camino/schema_pb.js"; import { file_camino_schema } from "../camino/schema_pb.js"; import type { PackageDescriptor } from "./package_pb.js"; import { file_quixos_package } from "./package_pb.js"; -import type { CapabilityRef, ConformanceWitness, FieldEditing, PackageExportRef } from "./refs_pb.js"; +import type { CapabilityRef, ConformanceWitness, FieldEditing, PackageExportRef, WorkspaceQueryScope } from "./refs_pb.js"; import { file_quixos_refs } from "./refs_pb.js"; import type { DerivedDependency } from "./runtime_pb.js"; import { file_quixos_runtime } from "./runtime_pb.js"; @@ -20,7 +20,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file quixos/orch.proto. */ export const file_quixos_orch: GenFile = /*@__PURE__*/ - fileDesc("ChFxdWl4b3Mvb3JjaC5wcm90bxILcXVpeG9zLm9yY2gitwEKClF1ZXJ5RXZlbnQSDgoGcnVuX2lkGAEgASgJEhAKCHNlcXVlbmNlGAIgASgEEgwKBGtpbmQYAyABKAkSJwoIc25hcHNob3QYBCABKAsyFS5jYW1pbm8uUXVlcnlSZXNwb25zZRIjCgRwYXRoGAUgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFBhcnQSHAoFdmFsdWUYBiABKAsyDS5jYW1pbm8uVmFsdWUSDQoFZXJyb3IYByABKAkiRQoRVHJ5Q29uZm9ybVJlcXVlc3QSEQoJb2JqZWN0X2lkGAEgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgCIAEoCSJFChJUcnlDb25mb3JtUmVzcG9uc2USLwoLY29uZm9ybWFuY2UYASABKAsyGi5xdWl4b3MuQ29uZm9ybWFuY2VXaXRuZXNzIqUBChZDb25zdHJ1Y3RPYmplY3RSZXF1ZXN0Eg8KB2F0b21faWQYASABKAkSPQoFaW5wdXQYAiADKAsyLi5xdWl4b3Mub3JjaC5Db25zdHJ1Y3RPYmplY3RSZXF1ZXN0LklucHV0RW50cnkaOwoKSW5wdXRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIj8KF0NvbnN0cnVjdE9iamVjdFJlc3BvbnNlEiQKBm9iamVjdBgBIAEoCzIULmNhbWluby5DYW1pbm9PYmplY3QibQomUmVzb2x2ZU9yQ29uc3RydWN0UmVsYXRlZE9iamVjdFJlcXVlc3QSEQoJb2JqZWN0X2lkGAEgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgCIAEoCRIRCgltZW1iZXJfaWQYAyABKAkiZAonUmVzb2x2ZU9yQ29uc3RydWN0UmVsYXRlZE9iamVjdFJlc3BvbnNlEiQKBm9iamVjdBgBIAEoCzIULmNhbWluby5DYW1pbm9PYmplY3QSEwoLY29uc3RydWN0ZWQYAiABKAgi8AEKF0ludm9rZUNhcGFiaWxpdHlSZXF1ZXN0EikKCmNhcGFiaWxpdHkYASABKAsyFS5xdWl4b3MuQ2FwYWJpbGl0eVJlZhIRCglvYmplY3RfaWQYAiABKAkSPgoFaW5wdXQYAyADKAsyLy5xdWl4b3Mub3JjaC5JbnZva2VDYXBhYmlsaXR5UmVxdWVzdC5JbnB1dEVudHJ5EhoKEmNsaWVudF9tdXRhdGlvbl9pZBgEIAEoCRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEizgEKHEludm9rZUNsYXNzQ2FwYWJpbGl0eVJlcXVlc3QSFgoOY29uZm9ybWFuY2VfaWQYASABKAkSFAoMb3BlcmF0aW9uX2lkGAIgASgJEkMKBWlucHV0GAMgAygLMjQucXVpeG9zLm9yY2guSW52b2tlQ2xhc3NDYXBhYmlsaXR5UmVxdWVzdC5JbnB1dEVudHJ5GjsKCklucHV0RW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASL+AQoYSW52b2tlQ2FwYWJpbGl0eVJlc3BvbnNlEhUKDWludm9jYXRpb25faWQYASABKAkSKwoKYWN0aXZhdGlvbhgCIAEoCzIXLnF1aXhvcy5vcmNoLkFjdGl2YXRpb24SCgoCb2sYAyABKAgSHQoGcmVzdWx0GAQgASgLMg0uY2FtaW5vLlZhbHVlEg0KBWVycm9yGAUgASgJEjcKDGRlcGVuZGVuY2llcxgGIAMoCzIhLnF1aXhvcy5ydW50aW1lLkRlcml2ZWREZXBlbmRlbmN5EisKDWZpZWxkX2VkaXRpbmcYByABKAsyFC5xdWl4b3MuRmllbGRFZGl0aW5nIv4BChpFZGl0Q2FwYWJpbGl0eUZpZWxkUmVxdWVzdBIpCgpjYXBhYmlsaXR5GAEgASgLMhUucXVpeG9zLkNhcGFiaWxpdHlSZWYSEQoJb2JqZWN0X2lkGAIgASgJEhsKE3NldHRlcl9vcGVyYXRpb25faWQYAyABKAkSFgoOYmluZGluZ19kaWdlc3QYBCABKAkSIwoGdXBkYXRlGAUgASgLMhEuY2FtaW5vLkNyZHRWYWx1ZUgAEiQKC3JlcGxhY2VtZW50GAcgASgLMg0uY2FtaW5vLlZhbHVlSAASGgoSY2xpZW50X211dGF0aW9uX2lkGAYgASgJQgYKBGVkaXQi0gEKFldhdGNoQ2FwYWJpbGl0eVJlcXVlc3QSKQoKY2FwYWJpbGl0eRgBIAEoCzIVLnF1aXhvcy5DYXBhYmlsaXR5UmVmEhEKCW9iamVjdF9pZBgCIAEoCRI9CgVpbnB1dBgDIAMoCzIuLnF1aXhvcy5vcmNoLldhdGNoQ2FwYWJpbGl0eVJlcXVlc3QuSW5wdXRFbnRyeRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEikAIKFFdhdGNoQ2FwYWJpbGl0eUV2ZW50EhUKDWludm9jYXRpb25faWQYASABKAkSKwoKYWN0aXZhdGlvbhgCIAEoCzIXLnF1aXhvcy5vcmNoLkFjdGl2YXRpb24SEAoId2F0Y2hfaWQYAyABKAkSHAoFdmFsdWUYBCABKAsyDS5jYW1pbm8uVmFsdWUSNwoMZGVwZW5kZW5jaWVzGAUgAygLMiEucXVpeG9zLnJ1bnRpbWUuRGVyaXZlZERlcGVuZGVuY3kSDQoFZXJyb3IYBiABKAkSDwoHaW5pdGlhbBgHIAEoCBIrCg1maWVsZF9lZGl0aW5nGAggASgLMhQucXVpeG9zLkZpZWxkRWRpdGluZyJbChNHZXRXb3Jrc3BhY2VSZXF1ZXN0EiMKG2luY2x1ZGVfaW50ZXJmYWNlX2NvbnRyYWN0cxgBIAEoCBIfChdpbmNsdWRlX3F1ZXJ5X2NvbnRyYWN0cxgCIAEoCCK7AwoUR2V0V29ya3NwYWNlUmVzcG9uc2USFAoMd29ya3NwYWNlX2lkGAEgASgJEh0KFXdvcmtzcGFjZV9yZXZpc2lvbl9pZBgCIAEoCRIaChJzb3VyY2Vfcm9vdF9jb21taXQYAyABKAkSKgoiZW1wdHlfaW5wdXRfY29uc3RydWN0aWJsZV9hdG9tX2lkcxgEIAMoCRI/ChFjYXBhYmlsaXR5X2lucHV0cxgFIAMoCzIkLnF1aXhvcy5vcmNoLkNhcGFiaWxpdHlJbnB1dENvbnRyYWN0EkEKEmNvbnN0cnVjdG9yX2lucHV0cxgGIAMoCzIlLnF1aXhvcy5vcmNoLkNvbnN0cnVjdG9ySW5wdXRDb250cmFjdBIXCg9pbnRlcmZhY2VzX2pzb24YByABKAkSOAoSY2xhc3NfY2FwYWJpbGl0aWVzGAggAygLMhwucXVpeG9zLm9yY2guQ2xhc3NDYXBhYmlsaXR5Ei4KB3F1ZXJpZXMYCSADKAsyHS5xdWl4b3Mub3JjaC5RdWVyeURlc2NyaXB0aW9uEh8KF2FjdGl2ZV9xdWVyeV9leGVjdXRpb25zGAogASgNIr0BChBRdWVyeURlc2NyaXB0aW9uEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSGwoTcGFja2FnZV9yZXZpc2lvbl9pZBgDIAEoCRIQCghkb2N1bWVudBgEIAEoCRIOCgZzY2hlbWEYBSABKAkSFAoMc291cmNlX2ZpbGVzGAYgAygJEhQKDGVmZmVjdHNfanNvbhgHIAEoCRIkCgRwbGFuGAggASgLMhYuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5IrkBCg9DbGFzc0NhcGFiaWxpdHkSFgoOY29uZm9ybWFuY2VfaWQYASABKAkSDwoHYXRvbV9pZBgCIAEoCRIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYAyABKAkSFQoNZGVmaW5pdGlvbl9pZBgEIAEoCRIUCgxvcGVyYXRpb25faWQYBSABKAkSFwoPaW5wdXRfdHlwZV9qc29uGAYgASgJEhgKEG91dHB1dF90eXBlX2pzb24YByABKAkiYQoXQ2FwYWJpbGl0eUlucHV0Q29udHJhY3QSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhQKDG9wZXJhdGlvbl9pZBgCIAEoCRIRCgl0eXBlX2pzb24YAyABKAkiPgoYQ29uc3RydWN0b3JJbnB1dENvbnRyYWN0Eg8KB2F0b21faWQYASABKAkSEQoJdHlwZV9qc29uGAIgASgJIhgKFkxpc3RBY3RpdmF0aW9uc1JlcXVlc3QiHwodTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1JlcXVlc3QiUAoeTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1Jlc3BvbnNlEi4KC2Rlc2NyaXB0b3JzGAEgAygLMhkucXVpeG9zLlBhY2thZ2VEZXNjcmlwdG9yIhwKGkxpc3RQYWNrYWdlUnVudGltZXNSZXF1ZXN0IlIKG0xpc3RQYWNrYWdlUnVudGltZXNSZXNwb25zZRIzCghydW50aW1lcxgBIAMoCzIhLnF1aXhvcy5vcmNoLlBhY2thZ2VSdW50aW1lU3RhdHVzIkcKF0xpc3RBY3RpdmF0aW9uc1Jlc3BvbnNlEiwKC2FjdGl2YXRpb25zGAEgAygLMhcucXVpeG9zLm9yY2guQWN0aXZhdGlvbiI/ChZDbG9zZUFjdGl2YXRpb25SZXF1ZXN0EhUKDWFjdGl2YXRpb25faWQYASABKAkSDgoGcmVhc29uGAIgASgJIkYKF0Nsb3NlQWN0aXZhdGlvblJlc3BvbnNlEisKCmFjdGl2YXRpb24YASABKAsyFy5xdWl4b3Mub3JjaC5BY3RpdmF0aW9uIusBCgpBY3RpdmF0aW9uEhUKDWFjdGl2YXRpb25faWQYASABKAkSKAoGZXhwb3J0GAIgASgLMhgucXVpeG9zLlBhY2thZ2VFeHBvcnRSZWYSEQoJb2JqZWN0X2lkGAMgASgJEg0KBXN0YXRlGAQgASgJEg4KBmRlbWFuZBgFIAEoDRIRCglvcGVuZWRfYXQYBiABKAkSFAoMbGFzdF91c2VkX2F0GAcgASgJEhgKEGlkbGVfZGVhZGxpbmVfYXQYCCABKAkSEQoJY2xvc2VkX2F0GAkgASgJEhQKDGNsb3NlX3JlYXNvbhgKIAEoCSKzAgoUUGFja2FnZVJ1bnRpbWVTdGF0dXMSEwoLcnVudGltZV9rZXkYASABKAkSGwoTcGFja2FnZV9yZXZpc2lvbl9pZBgCIAEoCRIZChFzb3VyY2VfcmVwb3NpdG9yeRgDIAEoCRIVCg1zb3VyY2VfY29tbWl0GAQgASgJEhQKDGJ1aWxkX3RhcmdldBgFIAEoCRITCgtzZXJ2ZXJfcGF0aBgGIAEoCRILCgNwaWQYByABKA0SDQoFc3RhdGUYCCABKAkSEgoKc3RhcnRlZF9hdBgJIAEoCRIZChFsYXN0X2hhbmRzaGFrZV9hdBgKIAEoCRIgChhydW50aW1lX3Byb3RvY29sX3ZlcnNpb24YCyABKAkSHwoXYWR2ZXJ0aXNlZF9leHBvcnRfY291bnQYDCABKA0yywoKE09yY2hlc3RyYXRvclJ1bnRpbWUSOwoMRXhlY3V0ZVF1ZXJ5EhQuY2FtaW5vLlF1ZXJ5UmVxdWVzdBoVLmNhbWluby5RdWVyeVJlc3BvbnNlEj0KCldhdGNoUXVlcnkSFC5jYW1pbm8uUXVlcnlSZXF1ZXN0GhcucXVpeG9zLm9yY2guUXVlcnlFdmVudDABEk0KClRyeUNvbmZvcm0SHi5xdWl4b3Mub3JjaC5UcnlDb25mb3JtUmVxdWVzdBofLnF1aXhvcy5vcmNoLlRyeUNvbmZvcm1SZXNwb25zZRJfChBJbnZva2VDYXBhYmlsaXR5EiQucXVpeG9zLm9yY2guSW52b2tlQ2FwYWJpbGl0eVJlcXVlc3QaJS5xdWl4b3Mub3JjaC5JbnZva2VDYXBhYmlsaXR5UmVzcG9uc2USZQoTRWRpdENhcGFiaWxpdHlGaWVsZBInLnF1aXhvcy5vcmNoLkVkaXRDYXBhYmlsaXR5RmllbGRSZXF1ZXN0GiUucXVpeG9zLm9yY2guSW52b2tlQ2FwYWJpbGl0eVJlc3BvbnNlEmkKFUludm9rZUNsYXNzQ2FwYWJpbGl0eRIpLnF1aXhvcy5vcmNoLkludm9rZUNsYXNzQ2FwYWJpbGl0eVJlcXVlc3QaJS5xdWl4b3Mub3JjaC5JbnZva2VDYXBhYmlsaXR5UmVzcG9uc2USWwoPV2F0Y2hDYXBhYmlsaXR5EiMucXVpeG9zLm9yY2guV2F0Y2hDYXBhYmlsaXR5UmVxdWVzdBohLnF1aXhvcy5vcmNoLldhdGNoQ2FwYWJpbGl0eUV2ZW50MAESXAoPQ29uc3RydWN0T2JqZWN0EiMucXVpeG9zLm9yY2guQ29uc3RydWN0T2JqZWN0UmVxdWVzdBokLnF1aXhvcy5vcmNoLkNvbnN0cnVjdE9iamVjdFJlc3BvbnNlEowBCh9SZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0EjMucXVpeG9zLm9yY2guUmVzb2x2ZU9yQ29uc3RydWN0UmVsYXRlZE9iamVjdFJlcXVlc3QaNC5xdWl4b3Mub3JjaC5SZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0UmVzcG9uc2USUwoMR2V0V29ya3NwYWNlEiAucXVpeG9zLm9yY2guR2V0V29ya3NwYWNlUmVxdWVzdBohLnF1aXhvcy5vcmNoLkdldFdvcmtzcGFjZVJlc3BvbnNlEnEKFkxpc3RQYWNrYWdlRGVzY3JpcHRvcnMSKi5xdWl4b3Mub3JjaC5MaXN0UGFja2FnZURlc2NyaXB0b3JzUmVxdWVzdBorLnF1aXhvcy5vcmNoLkxpc3RQYWNrYWdlRGVzY3JpcHRvcnNSZXNwb25zZRJoChNMaXN0UGFja2FnZVJ1bnRpbWVzEicucXVpeG9zLm9yY2guTGlzdFBhY2thZ2VSdW50aW1lc1JlcXVlc3QaKC5xdWl4b3Mub3JjaC5MaXN0UGFja2FnZVJ1bnRpbWVzUmVzcG9uc2USXAoPTGlzdEFjdGl2YXRpb25zEiMucXVpeG9zLm9yY2guTGlzdEFjdGl2YXRpb25zUmVxdWVzdBokLnF1aXhvcy5vcmNoLkxpc3RBY3RpdmF0aW9uc1Jlc3BvbnNlElwKD0Nsb3NlQWN0aXZhdGlvbhIjLnF1aXhvcy5vcmNoLkNsb3NlQWN0aXZhdGlvblJlcXVlc3QaJC5xdWl4b3Mub3JjaC5DbG9zZUFjdGl2YXRpb25SZXNwb25zZWIGcHJvdG8z", [file_camino_api, file_camino_schema, file_quixos_package, file_quixos_refs, file_quixos_runtime]); + fileDesc("ChFxdWl4b3Mvb3JjaC5wcm90bxILcXVpeG9zLm9yY2gitwEKClF1ZXJ5RXZlbnQSDgoGcnVuX2lkGAEgASgJEhAKCHNlcXVlbmNlGAIgASgEEgwKBGtpbmQYAyABKAkSJwoIc25hcHNob3QYBCABKAsyFS5jYW1pbm8uUXVlcnlSZXNwb25zZRIjCgRwYXRoGAUgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFBhcnQSHAoFdmFsdWUYBiABKAsyDS5jYW1pbm8uVmFsdWUSDQoFZXJyb3IYByABKAkiRQoRVHJ5Q29uZm9ybVJlcXVlc3QSEQoJb2JqZWN0X2lkGAEgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgCIAEoCSJFChJUcnlDb25mb3JtUmVzcG9uc2USLwoLY29uZm9ybWFuY2UYASABKAsyGi5xdWl4b3MuQ29uZm9ybWFuY2VXaXRuZXNzIqUBChZDb25zdHJ1Y3RPYmplY3RSZXF1ZXN0Eg8KB2F0b21faWQYASABKAkSPQoFaW5wdXQYAiADKAsyLi5xdWl4b3Mub3JjaC5Db25zdHJ1Y3RPYmplY3RSZXF1ZXN0LklucHV0RW50cnkaOwoKSW5wdXRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIj8KF0NvbnN0cnVjdE9iamVjdFJlc3BvbnNlEiQKBm9iamVjdBgBIAEoCzIULmNhbWluby5DYW1pbm9PYmplY3QibQomUmVzb2x2ZU9yQ29uc3RydWN0UmVsYXRlZE9iamVjdFJlcXVlc3QSEQoJb2JqZWN0X2lkGAEgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgCIAEoCRIRCgltZW1iZXJfaWQYAyABKAkiZAonUmVzb2x2ZU9yQ29uc3RydWN0UmVsYXRlZE9iamVjdFJlc3BvbnNlEiQKBm9iamVjdBgBIAEoCzIULmNhbWluby5DYW1pbm9PYmplY3QSEwoLY29uc3RydWN0ZWQYAiABKAgi8AEKF0ludm9rZUNhcGFiaWxpdHlSZXF1ZXN0EikKCmNhcGFiaWxpdHkYASABKAsyFS5xdWl4b3MuQ2FwYWJpbGl0eVJlZhIRCglvYmplY3RfaWQYAiABKAkSPgoFaW5wdXQYAyADKAsyLy5xdWl4b3Mub3JjaC5JbnZva2VDYXBhYmlsaXR5UmVxdWVzdC5JbnB1dEVudHJ5EhoKEmNsaWVudF9tdXRhdGlvbl9pZBgEIAEoCRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEizgEKHEludm9rZUNsYXNzQ2FwYWJpbGl0eVJlcXVlc3QSFgoOY29uZm9ybWFuY2VfaWQYASABKAkSFAoMb3BlcmF0aW9uX2lkGAIgASgJEkMKBWlucHV0GAMgAygLMjQucXVpeG9zLm9yY2guSW52b2tlQ2xhc3NDYXBhYmlsaXR5UmVxdWVzdC5JbnB1dEVudHJ5GjsKCklucHV0RW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASL+AQoYSW52b2tlQ2FwYWJpbGl0eVJlc3BvbnNlEhUKDWludm9jYXRpb25faWQYASABKAkSKwoKYWN0aXZhdGlvbhgCIAEoCzIXLnF1aXhvcy5vcmNoLkFjdGl2YXRpb24SCgoCb2sYAyABKAgSHQoGcmVzdWx0GAQgASgLMg0uY2FtaW5vLlZhbHVlEg0KBWVycm9yGAUgASgJEjcKDGRlcGVuZGVuY2llcxgGIAMoCzIhLnF1aXhvcy5ydW50aW1lLkRlcml2ZWREZXBlbmRlbmN5EisKDWZpZWxkX2VkaXRpbmcYByABKAsyFC5xdWl4b3MuRmllbGRFZGl0aW5nIv4BChpFZGl0Q2FwYWJpbGl0eUZpZWxkUmVxdWVzdBIpCgpjYXBhYmlsaXR5GAEgASgLMhUucXVpeG9zLkNhcGFiaWxpdHlSZWYSEQoJb2JqZWN0X2lkGAIgASgJEhsKE3NldHRlcl9vcGVyYXRpb25faWQYAyABKAkSFgoOYmluZGluZ19kaWdlc3QYBCABKAkSIwoGdXBkYXRlGAUgASgLMhEuY2FtaW5vLkNyZHRWYWx1ZUgAEiQKC3JlcGxhY2VtZW50GAcgASgLMg0uY2FtaW5vLlZhbHVlSAASGgoSY2xpZW50X211dGF0aW9uX2lkGAYgASgJQgYKBGVkaXQi0gEKFldhdGNoQ2FwYWJpbGl0eVJlcXVlc3QSKQoKY2FwYWJpbGl0eRgBIAEoCzIVLnF1aXhvcy5DYXBhYmlsaXR5UmVmEhEKCW9iamVjdF9pZBgCIAEoCRI9CgVpbnB1dBgDIAMoCzIuLnF1aXhvcy5vcmNoLldhdGNoQ2FwYWJpbGl0eVJlcXVlc3QuSW5wdXRFbnRyeRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEikAIKFFdhdGNoQ2FwYWJpbGl0eUV2ZW50EhUKDWludm9jYXRpb25faWQYASABKAkSKwoKYWN0aXZhdGlvbhgCIAEoCzIXLnF1aXhvcy5vcmNoLkFjdGl2YXRpb24SEAoId2F0Y2hfaWQYAyABKAkSHAoFdmFsdWUYBCABKAsyDS5jYW1pbm8uVmFsdWUSNwoMZGVwZW5kZW5jaWVzGAUgAygLMiEucXVpeG9zLnJ1bnRpbWUuRGVyaXZlZERlcGVuZGVuY3kSDQoFZXJyb3IYBiABKAkSDwoHaW5pdGlhbBgHIAEoCBIrCg1maWVsZF9lZGl0aW5nGAggASgLMhQucXVpeG9zLkZpZWxkRWRpdGluZyJbChNHZXRXb3Jrc3BhY2VSZXF1ZXN0EiMKG2luY2x1ZGVfaW50ZXJmYWNlX2NvbnRyYWN0cxgBIAEoCBIfChdpbmNsdWRlX3F1ZXJ5X2NvbnRyYWN0cxgCIAEoCCK7AwoUR2V0V29ya3NwYWNlUmVzcG9uc2USFAoMd29ya3NwYWNlX2lkGAEgASgJEh0KFXdvcmtzcGFjZV9yZXZpc2lvbl9pZBgCIAEoCRIaChJzb3VyY2Vfcm9vdF9jb21taXQYAyABKAkSKgoiZW1wdHlfaW5wdXRfY29uc3RydWN0aWJsZV9hdG9tX2lkcxgEIAMoCRI/ChFjYXBhYmlsaXR5X2lucHV0cxgFIAMoCzIkLnF1aXhvcy5vcmNoLkNhcGFiaWxpdHlJbnB1dENvbnRyYWN0EkEKEmNvbnN0cnVjdG9yX2lucHV0cxgGIAMoCzIlLnF1aXhvcy5vcmNoLkNvbnN0cnVjdG9ySW5wdXRDb250cmFjdBIXCg9pbnRlcmZhY2VzX2pzb24YByABKAkSOAoSY2xhc3NfY2FwYWJpbGl0aWVzGAggAygLMhwucXVpeG9zLm9yY2guQ2xhc3NDYXBhYmlsaXR5Ei4KB3F1ZXJpZXMYCSADKAsyHS5xdWl4b3Mub3JjaC5RdWVyeURlc2NyaXB0aW9uEh8KF2FjdGl2ZV9xdWVyeV9leGVjdXRpb25zGAogASgNIvMBChBRdWVyeURlc2NyaXB0aW9uEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSGwoTcGFja2FnZV9yZXZpc2lvbl9pZBgDIAEoCRIQCghkb2N1bWVudBgEIAEoCRIOCgZzY2hlbWEYBSABKAkSFAoMc291cmNlX2ZpbGVzGAYgAygJEhQKDGVmZmVjdHNfanNvbhgHIAEoCRIkCgRwbGFuGAggASgLMhYuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5EjQKD3dvcmtzcGFjZV9zY29wZRgJIAEoCzIbLnF1aXhvcy5Xb3Jrc3BhY2VRdWVyeVNjb3BlIrkBCg9DbGFzc0NhcGFiaWxpdHkSFgoOY29uZm9ybWFuY2VfaWQYASABKAkSDwoHYXRvbV9pZBgCIAEoCRIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYAyABKAkSFQoNZGVmaW5pdGlvbl9pZBgEIAEoCRIUCgxvcGVyYXRpb25faWQYBSABKAkSFwoPaW5wdXRfdHlwZV9qc29uGAYgASgJEhgKEG91dHB1dF90eXBlX2pzb24YByABKAkiYQoXQ2FwYWJpbGl0eUlucHV0Q29udHJhY3QSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhQKDG9wZXJhdGlvbl9pZBgCIAEoCRIRCgl0eXBlX2pzb24YAyABKAkiPgoYQ29uc3RydWN0b3JJbnB1dENvbnRyYWN0Eg8KB2F0b21faWQYASABKAkSEQoJdHlwZV9qc29uGAIgASgJIhgKFkxpc3RBY3RpdmF0aW9uc1JlcXVlc3QiHwodTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1JlcXVlc3QiUAoeTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1Jlc3BvbnNlEi4KC2Rlc2NyaXB0b3JzGAEgAygLMhkucXVpeG9zLlBhY2thZ2VEZXNjcmlwdG9yIhwKGkxpc3RQYWNrYWdlUnVudGltZXNSZXF1ZXN0IlIKG0xpc3RQYWNrYWdlUnVudGltZXNSZXNwb25zZRIzCghydW50aW1lcxgBIAMoCzIhLnF1aXhvcy5vcmNoLlBhY2thZ2VSdW50aW1lU3RhdHVzIkcKF0xpc3RBY3RpdmF0aW9uc1Jlc3BvbnNlEiwKC2FjdGl2YXRpb25zGAEgAygLMhcucXVpeG9zLm9yY2guQWN0aXZhdGlvbiI/ChZDbG9zZUFjdGl2YXRpb25SZXF1ZXN0EhUKDWFjdGl2YXRpb25faWQYASABKAkSDgoGcmVhc29uGAIgASgJIkYKF0Nsb3NlQWN0aXZhdGlvblJlc3BvbnNlEisKCmFjdGl2YXRpb24YASABKAsyFy5xdWl4b3Mub3JjaC5BY3RpdmF0aW9uIusBCgpBY3RpdmF0aW9uEhUKDWFjdGl2YXRpb25faWQYASABKAkSKAoGZXhwb3J0GAIgASgLMhgucXVpeG9zLlBhY2thZ2VFeHBvcnRSZWYSEQoJb2JqZWN0X2lkGAMgASgJEg0KBXN0YXRlGAQgASgJEg4KBmRlbWFuZBgFIAEoDRIRCglvcGVuZWRfYXQYBiABKAkSFAoMbGFzdF91c2VkX2F0GAcgASgJEhgKEGlkbGVfZGVhZGxpbmVfYXQYCCABKAkSEQoJY2xvc2VkX2F0GAkgASgJEhQKDGNsb3NlX3JlYXNvbhgKIAEoCSKzAgoUUGFja2FnZVJ1bnRpbWVTdGF0dXMSEwoLcnVudGltZV9rZXkYASABKAkSGwoTcGFja2FnZV9yZXZpc2lvbl9pZBgCIAEoCRIZChFzb3VyY2VfcmVwb3NpdG9yeRgDIAEoCRIVCg1zb3VyY2VfY29tbWl0GAQgASgJEhQKDGJ1aWxkX3RhcmdldBgFIAEoCRITCgtzZXJ2ZXJfcGF0aBgGIAEoCRILCgNwaWQYByABKA0SDQoFc3RhdGUYCCABKAkSEgoKc3RhcnRlZF9hdBgJIAEoCRIZChFsYXN0X2hhbmRzaGFrZV9hdBgKIAEoCRIgChhydW50aW1lX3Byb3RvY29sX3ZlcnNpb24YCyABKAkSHwoXYWR2ZXJ0aXNlZF9leHBvcnRfY291bnQYDCABKA0yywoKE09yY2hlc3RyYXRvclJ1bnRpbWUSOwoMRXhlY3V0ZVF1ZXJ5EhQuY2FtaW5vLlF1ZXJ5UmVxdWVzdBoVLmNhbWluby5RdWVyeVJlc3BvbnNlEj0KCldhdGNoUXVlcnkSFC5jYW1pbm8uUXVlcnlSZXF1ZXN0GhcucXVpeG9zLm9yY2guUXVlcnlFdmVudDABEk0KClRyeUNvbmZvcm0SHi5xdWl4b3Mub3JjaC5UcnlDb25mb3JtUmVxdWVzdBofLnF1aXhvcy5vcmNoLlRyeUNvbmZvcm1SZXNwb25zZRJfChBJbnZva2VDYXBhYmlsaXR5EiQucXVpeG9zLm9yY2guSW52b2tlQ2FwYWJpbGl0eVJlcXVlc3QaJS5xdWl4b3Mub3JjaC5JbnZva2VDYXBhYmlsaXR5UmVzcG9uc2USZQoTRWRpdENhcGFiaWxpdHlGaWVsZBInLnF1aXhvcy5vcmNoLkVkaXRDYXBhYmlsaXR5RmllbGRSZXF1ZXN0GiUucXVpeG9zLm9yY2guSW52b2tlQ2FwYWJpbGl0eVJlc3BvbnNlEmkKFUludm9rZUNsYXNzQ2FwYWJpbGl0eRIpLnF1aXhvcy5vcmNoLkludm9rZUNsYXNzQ2FwYWJpbGl0eVJlcXVlc3QaJS5xdWl4b3Mub3JjaC5JbnZva2VDYXBhYmlsaXR5UmVzcG9uc2USWwoPV2F0Y2hDYXBhYmlsaXR5EiMucXVpeG9zLm9yY2guV2F0Y2hDYXBhYmlsaXR5UmVxdWVzdBohLnF1aXhvcy5vcmNoLldhdGNoQ2FwYWJpbGl0eUV2ZW50MAESXAoPQ29uc3RydWN0T2JqZWN0EiMucXVpeG9zLm9yY2guQ29uc3RydWN0T2JqZWN0UmVxdWVzdBokLnF1aXhvcy5vcmNoLkNvbnN0cnVjdE9iamVjdFJlc3BvbnNlEowBCh9SZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0EjMucXVpeG9zLm9yY2guUmVzb2x2ZU9yQ29uc3RydWN0UmVsYXRlZE9iamVjdFJlcXVlc3QaNC5xdWl4b3Mub3JjaC5SZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0UmVzcG9uc2USUwoMR2V0V29ya3NwYWNlEiAucXVpeG9zLm9yY2guR2V0V29ya3NwYWNlUmVxdWVzdBohLnF1aXhvcy5vcmNoLkdldFdvcmtzcGFjZVJlc3BvbnNlEnEKFkxpc3RQYWNrYWdlRGVzY3JpcHRvcnMSKi5xdWl4b3Mub3JjaC5MaXN0UGFja2FnZURlc2NyaXB0b3JzUmVxdWVzdBorLnF1aXhvcy5vcmNoLkxpc3RQYWNrYWdlRGVzY3JpcHRvcnNSZXNwb25zZRJoChNMaXN0UGFja2FnZVJ1bnRpbWVzEicucXVpeG9zLm9yY2guTGlzdFBhY2thZ2VSdW50aW1lc1JlcXVlc3QaKC5xdWl4b3Mub3JjaC5MaXN0UGFja2FnZVJ1bnRpbWVzUmVzcG9uc2USXAoPTGlzdEFjdGl2YXRpb25zEiMucXVpeG9zLm9yY2guTGlzdEFjdGl2YXRpb25zUmVxdWVzdBokLnF1aXhvcy5vcmNoLkxpc3RBY3RpdmF0aW9uc1Jlc3BvbnNlElwKD0Nsb3NlQWN0aXZhdGlvbhIjLnF1aXhvcy5vcmNoLkNsb3NlQWN0aXZhdGlvblJlcXVlc3QaJC5xdWl4b3Mub3JjaC5DbG9zZUFjdGl2YXRpb25SZXNwb25zZWIGcHJvdG8z", [file_camino_api, file_camino_schema, file_quixos_package, file_quixos_refs, file_quixos_runtime]); /** * @generated from message quixos.orch.QueryEvent @@ -578,6 +578,11 @@ export type QueryDescription = Message<"quixos.orch.QueryDescription"> & { * @generated from field: camino.InstalledQuery plan = 8; */ plan?: InstalledQuery | undefined; + + /** + * @generated from field: quixos.WorkspaceQueryScope workspace_scope = 9; + */ + workspaceScope?: WorkspaceQueryScope | undefined; }; /** diff --git a/src/gen/quixos/refs_pb.ts b/src/gen/quixos/refs_pb.ts index 7e54117..6f164a4 100644 --- a/src/gen/quixos/refs_pb.ts +++ b/src/gen/quixos/refs_pb.ts @@ -10,7 +10,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file quixos/refs.proto. */ export const file_quixos_refs: GenFile = /*@__PURE__*/ - fileDesc("ChFxdWl4b3MvcmVmcy5wcm90bxIGcXVpeG9zInUKDUNhcGFiaWxpdHlSZWYSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhQKDG9wZXJhdGlvbl9pZBgCIAEoCRIvCgtjb25mb3JtYW5jZRgDIAEoCzIaLnF1aXhvcy5Db25mb3JtYW5jZVdpdG5lc3Mi0QEKDEZpZWxkRWRpdGluZxIbChNnZXR0ZXJfb3BlcmF0aW9uX2lkGAEgASgJEhsKE3NldHRlcl9vcGVyYXRpb25faWQYAiABKAkSFQoNZG9jdW1lbnRfdHlwZRgDIAEoCRIWCg5iaW5kaW5nX2RpZ2VzdBgEIAEoCRInCgRtb2RlGAUgASgOMhkucXVpeG9zLkZpZWxkRWRpdGluZy5Nb2RlIi8KBE1vZGUSDwoLVU5TUEVDSUZJRUQQABIMCghSRUdJU1RFUhABEggKBENSRFQQAiKWAQoSQ29uZm9ybWFuY2VXaXRuZXNzEhEKCW9iamVjdF9pZBgBIAEoCRIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYAiABKAkSFgoOY29uZm9ybWFuY2VfaWQYAyABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAQgASgJEhcKD3dvcmtzcGFjZV9lcG9jaBgFIAEoCSJCChBQYWNrYWdlRXhwb3J0UmVmEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYASABKAkSEQoJZXhwb3J0X2lkGAIgASgJItgBChJJbmplY3RlZERlcGVuZGVuY3kSDwoHcG9ydF9pZBgBIAEoCRIXCg1zdGF0ZV9zbG90X2lkGAIgASgJSAASJgoEZWRnZRgDIAEoCzIWLnF1aXhvcy5FZGdlRGVwZW5kZW5jeUgAEh8KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgEIAEoCUgAEh0KE2NvbnN0cnVjdG9yX2F0b21faWQYBSABKAlIABISCghxdWVyeV9pZBgHIAEoCUgAEhEKCW9iamVjdF9pZBgGIAEoCUIJCgdiaW5kaW5nIj0KDkVkZ2VEZXBlbmRlbmN5EhQKDGVkZ2VfdHlwZV9pZBgBIAEoCRIVCg1wcm9qZWN0aW9uX2lkGAIgASgJYgZwcm90bzM"); + fileDesc("ChFxdWl4b3MvcmVmcy5wcm90bxIGcXVpeG9zInUKDUNhcGFiaWxpdHlSZWYSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhQKDG9wZXJhdGlvbl9pZBgCIAEoCRIvCgtjb25mb3JtYW5jZRgDIAEoCzIaLnF1aXhvcy5Db25mb3JtYW5jZVdpdG5lc3Mi0QEKDEZpZWxkRWRpdGluZxIbChNnZXR0ZXJfb3BlcmF0aW9uX2lkGAEgASgJEhsKE3NldHRlcl9vcGVyYXRpb25faWQYAiABKAkSFQoNZG9jdW1lbnRfdHlwZRgDIAEoCRIWCg5iaW5kaW5nX2RpZ2VzdBgEIAEoCRInCgRtb2RlGAUgASgOMhkucXVpeG9zLkZpZWxkRWRpdGluZy5Nb2RlIi8KBE1vZGUSDwoLVU5TUEVDSUZJRUQQABIMCghSRUdJU1RFUhABEggKBENSRFQQAiKWAQoSQ29uZm9ybWFuY2VXaXRuZXNzEhEKCW9iamVjdF9pZBgBIAEoCRIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYAiABKAkSFgoOY29uZm9ybWFuY2VfaWQYAyABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAQgASgJEhcKD3dvcmtzcGFjZV9lcG9jaBgFIAEoCSJCChBQYWNrYWdlRXhwb3J0UmVmEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYASABKAkSEQoJZXhwb3J0X2lkGAIgASgJIpUCChJJbmplY3RlZERlcGVuZGVuY3kSDwoHcG9ydF9pZBgBIAEoCRIXCg1zdGF0ZV9zbG90X2lkGAIgASgJSAASJgoEZWRnZRgDIAEoCzIWLnF1aXhvcy5FZGdlRGVwZW5kZW5jeUgAEh8KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgEIAEoCUgAEh0KE2NvbnN0cnVjdG9yX2F0b21faWQYBSABKAlIABISCghxdWVyeV9pZBgHIAEoCUgAEjsKD3dvcmtzcGFjZV9xdWVyeRgIIAEoCzIgLnF1aXhvcy5Xb3Jrc3BhY2VRdWVyeURlcGVuZGVuY3lIABIRCglvYmplY3RfaWQYBiABKAlCCQoHYmluZGluZyKaAQoTV29ya3NwYWNlUXVlcnlTY29wZRIUCgx3b3Jrc3BhY2VfaWQYASABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAIgASgJEhcKD3dvcmtzcGFjZV9lcG9jaBgDIAEoCRIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYBCABKAkSFgoOYmluZGluZ19kaWdlc3QYBSABKAkiWAoYV29ya3NwYWNlUXVlcnlEZXBlbmRlbmN5EhAKCHF1ZXJ5X2lkGAEgASgJEioKBXNjb3BlGAIgASgLMhsucXVpeG9zLldvcmtzcGFjZVF1ZXJ5U2NvcGUiPQoORWRnZURlcGVuZGVuY3kSFAoMZWRnZV90eXBlX2lkGAEgASgJEhUKDXByb2plY3Rpb25faWQYAiABKAliBnByb3RvMw"); /** * @generated from message quixos.CapabilityRef @@ -207,6 +207,12 @@ export type InjectedDependency = Message<"quixos.InjectedDependency"> & { */ value: string; case: "queryId"; + } | { + /** + * @generated from field: quixos.WorkspaceQueryDependency workspace_query = 8; + */ + value: WorkspaceQueryDependency; + case: "workspaceQuery"; } | { case: undefined; value?: undefined }; /** @@ -225,6 +231,68 @@ export type InjectedDependency = Message<"quixos.InjectedDependency"> & { export const InjectedDependencySchema: GenMessage = /*@__PURE__*/ messageDesc(file_quixos_refs, 4); +/** + * Scope evidence is not authority by itself. The caller must also hold the + * matching workspace-query grant (or the authenticated workspace user grant). + * + * @generated from message quixos.WorkspaceQueryScope + */ +export type WorkspaceQueryScope = Message<"quixos.WorkspaceQueryScope"> & { + /** + * @generated from field: string workspace_id = 1; + */ + workspaceId: string; + + /** + * @generated from field: string workspace_revision_id = 2; + */ + workspaceRevisionId: string; + + /** + * @generated from field: string workspace_epoch = 3; + */ + workspaceEpoch: string; + + /** + * @generated from field: string interface_revision_id = 4; + */ + interfaceRevisionId: string; + + /** + * @generated from field: string binding_digest = 5; + */ + bindingDigest: string; +}; + +/** + * Describes the message quixos.WorkspaceQueryScope. + * Use `create(WorkspaceQueryScopeSchema)` to create a new message. + */ +export const WorkspaceQueryScopeSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_quixos_refs, 5); + +/** + * @generated from message quixos.WorkspaceQueryDependency + */ +export type WorkspaceQueryDependency = Message<"quixos.WorkspaceQueryDependency"> & { + /** + * @generated from field: string query_id = 1; + */ + queryId: string; + + /** + * @generated from field: quixos.WorkspaceQueryScope scope = 2; + */ + scope?: WorkspaceQueryScope | undefined; +}; + +/** + * Describes the message quixos.WorkspaceQueryDependency. + * Use `create(WorkspaceQueryDependencySchema)` to create a new message. + */ +export const WorkspaceQueryDependencySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_quixos_refs, 6); + /** * @generated from message quixos.EdgeDependency */ @@ -245,5 +313,5 @@ export type EdgeDependency = Message<"quixos.EdgeDependency"> & { * Use `create(EdgeDependencySchema)` to create a new message. */ export const EdgeDependencySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_refs, 5); + messageDesc(file_quixos_refs, 7); diff --git a/src/query/compile.ts b/src/query/compile.ts index c899715..d37fa39 100644 --- a/src/query/compile.ts +++ b/src/query/compile.ts @@ -35,6 +35,7 @@ import { } from "../capability-model/types.js"; import { querySchema } from "./schema.js"; import { objectRow } from "./relational-schema.js"; +import { workspaceQueryRootId } from "./root.js"; import { relationalCompiler } from "./relational-compile.js"; import { QueryCompileError, @@ -120,6 +121,9 @@ export async function compileQuery( .map((entry) => [entry.name.value, entry]), ); const mark = (id: InterfaceRevisionId, name: string, use: QueryUse, node: ASTNode) => { + // The virtual extent has no provider/getter effect. Its membership is + // linked separately, including when the query only selects references. + if (id === workspaceQueryRootId) return; const contract = generated.contracts.get(id)!; const member = contract.members.find((entry) => entry.displayName === name); if (!member || member.kind === "operation" || !member.queryRead) diff --git a/src/query/link.ts b/src/query/link.ts index e11da31..f89975f 100644 --- a/src/query/link.ts +++ b/src/query/link.ts @@ -27,6 +27,7 @@ export interface LinkedQuery { bindingDigest: string; fields: LinkedQueryField[]; attachments: PersistentAttachment[]; + rootAtoms: AtomId[]; } /** Link every possible implementation, including atoms absent from today's data. */ @@ -128,10 +129,17 @@ export function linkQueries(workspace: WorkspaceRevision): LinkedQuery[] { } } const storage = attachments.filter((entry) => needed.has(entry.id)); + const rootConformances = workspace.conformances.filter( + (entry) => entry.interfaceRevisionId === declaration.root.interface, + ); + const rootAtoms = [...new Set(rootConformances.map((entry) => entry.atomId))].sort(); const bindingDigest = createHash("sha256") .update( canonicalJson({ definition: checked.definitionDigest, + rootConformances: rootConformances + .map((entry) => ({ atomId: entry.atomId, id: entry.id, interfaceRevisionId: entry.interfaceRevisionId })) + .sort((a, b) => canonicalJson(a).localeCompare(canonicalJson(b))), fields: [...fields].sort((a, b) => canonicalJson(a).localeCompare(canonicalJson(b))), storage: [...storage].sort((a, b) => a.id.localeCompare(b.id)), }), @@ -144,6 +152,7 @@ export function linkQueries(workspace: WorkspaceRevision): LinkedQuery[] { bindingDigest, fields, attachments: storage, + rootAtoms, }); } for (const entry of linked) entry.runtime = queryRuntimePlan(entry, workspace); diff --git a/src/query/proto.ts b/src/query/proto.ts index 62ced89..727df4a 100644 --- a/src/query/proto.ts +++ b/src/query/proto.ts @@ -48,7 +48,32 @@ export const queryRuntimePlan = (linked: LinkedQuery, workspace: WorkspaceRevisi id: linked.id, definitionDigest: linked.checked.definitionDigest, bindingDigest: linked.bindingDigest, - rootInterfaceRevisionId: linked.checked.declaration.root, + root: { + case: linked.checked.declaration.root.kind === "object" ? "objectInterface" : "workspaceInterface", + value: linked.checked.declaration.root.interface, + }, + rootAtomIds: linked.rootAtoms, + fields: linked.checked.effects.map((effect) => { + const member = workspace.interfaceImports + .find((entry) => entry.revisionId === effect.interfaceRevisionId)! + .members.find((entry) => entry.id === effect.memberId)!; + return { + interfaceRevisionId: effect.interfaceRevisionId, + memberId: effect.memberId, + fieldName: member.displayName, + valueTypeJson: member.kind === "value" ? JSON.stringify(member.valueType) : "", + keyType: member.kind === "relationship" ? member.keyType : undefined, + cardinality: + member.kind === "relationship" + ? { + "optional-one": Cardinality.OPTIONAL_ONE, + "exactly-one": Cardinality.EXACTLY_ONE, + many: Cardinality.MANY, + "many-unique": Cardinality.MANY_UNIQUE, + }[member.cardinality] + : undefined, + }; + }), selection: linked.checked.selection.map(selection), budgets: linked.checked.declaration.budgets, variablesTypeJson: JSON.stringify(linked.checked.variables), diff --git a/src/query/root.ts b/src/query/root.ts new file mode 100644 index 0000000..e5a90fd --- /dev/null +++ b/src/query/root.ts @@ -0,0 +1,40 @@ +import { + capabilityId, + type InterfaceRevision, + type InterfaceRevisionId, + type MemberId, +} from "../capability-model/types.js"; +import { QueryCompileError, type QueryRoot } from "./types.js"; + +/** Compiler-only row-source schema; never installed as an atom, edge or capability. */ +export const workspaceQueryRootId: InterfaceRevisionId = capabilityId.interfaceRevision( + "qx-internal-workspace-query-root", +); +export const workspaceObjectsMemberId: MemberId = capabilityId.member("qx-internal-workspace-objects"); +export function queryRootSchema(root: QueryRoot, interfaces: readonly InterfaceRevision[]) { + if (interfaces.some((i) => i.revisionId === workspaceQueryRootId)) + throw new QueryCompileError("QUERY_RESERVED_ID", "The workspace query root identity is compiler-owned"); + if (root.kind === "object") return { interface: root.interface, interfaces }; + const contract = interfaces.find((i) => i.revisionId === root.interface); + if (!contract || contract.template) + throw new QueryCompileError("QUERY_CONTRACT", `Expected closed interface ${root.interface}`); + const synthetic: InterfaceRevision = { + interfaceId: capabilityId.interface("qx-internal-workspace-query-root"), + revisionId: workspaceQueryRootId, + displayName: "WorkspaceQueryRoot", + source: contract.source, + members: [ + { + kind: "relationship", + id: workspaceObjectsMemberId, + displayName: "objects", + target: { kind: "interface", interfaceRevisionId: root.interface }, + cardinality: "many-unique", + ordered: false, + operations: [], + queryRead: { execution: "native" }, + }, + ], + }; + return { interface: synthetic.revisionId, interfaces: [...interfaces, synthetic] }; +} diff --git a/src/query/schema.ts b/src/query/schema.ts index d8cbee2..b89b0e9 100644 --- a/src/query/schema.ts +++ b/src/query/schema.ts @@ -28,6 +28,7 @@ import type { } from "../capability-model/types.js"; import { QueryCompileError, type QueryDeclaration } from "./types.js"; import { relationalSchema, objectRow } from "./relational-schema.js"; +import { queryRootSchema, workspaceQueryRootId } from "./root.js"; // Validate losslessly; callers carry decimal strings across JSON transports. function integerParser(name: string, min: bigint, max: bigint, value: unknown): string { @@ -78,7 +79,8 @@ export function querySchema( interfaces: readonly InterfaceRevision[], document?: DocumentNode, ) { - const contracts = new Map(interfaces.map((entry) => [entry.revisionId, entry])); + const root = queryRootSchema(declaration.root, interfaces); + const contracts = new Map(root.interfaces.map((entry) => [entry.revisionId, entry])); const objects = new Map(); const orders = new Map(); const byName = new Map(); @@ -150,7 +152,7 @@ export function querySchema( { contracts, target, name, scalar, comparison, scalarTypes, direction, cursor: cursorScalar, pageInfo }, document, ); - relational.discover(declaration.root); + relational.discover(root.interface); const filter = (id: InterfaceRevisionId) => relational.where(objectRow(id)); const order = (id: InterfaceRevisionId) => { let result = orders.get(id); @@ -177,7 +179,7 @@ export function querySchema( const metadata = new GraphQLObjectType({ name: `QxMetadata_${name(id)}`, fields: { - ref: { type: new GraphQLNonNull(relational.refs(id)) }, + ...(id === workspaceQueryRootId ? {} : { ref: { type: new GraphQLNonNull(relational.refs(id)) } }), ...(helpers ? { relations: { type: new GraphQLNonNull(helpers) } } : {}), }, }); @@ -247,7 +249,7 @@ export function querySchema( directives: [...specifiedDirectives, new GraphQLDirective({ name: "live", locations: [DirectiveLocation.FIELD] })], query: new GraphQLObjectType({ name: "QxQuery", - fields: { root: { type: new GraphQLNonNull(object(declaration.root)) } }, + fields: { root: { type: new GraphQLNonNull(object(root.interface)) } }, }), }); return { schema, byName, target, contracts, relational, scalarTypes }; diff --git a/src/query/templates.ts b/src/query/templates.ts index f37cafa..80988fa 100644 --- a/src/query/templates.ts +++ b/src/query/templates.ts @@ -34,7 +34,7 @@ export function specializeQueryTemplate( return { ...structuredClone(template.declaration), ...identity, - root: substitution.application(template.root), + root: { kind: template.root.kind, interface: substitution.application(template.root.interface) }, views: template.views .map((view) => { const target = substitution.object(view.target); diff --git a/src/query/types.ts b/src/query/types.ts index 07aff34..d75ac80 100644 --- a/src/query/types.ts +++ b/src/query/types.ts @@ -31,10 +31,13 @@ export const defaultQueryBudgets: Readonly = Object.freeze({ concurrency: 8, deadlineMs: 10000, }); +export type QueryRoot = + | { kind: "object"; interface: Interface } + | { kind: "workspace-interface"; interface: Interface }; export interface QueryDeclaration { id: string; displayName: string; - root: InterfaceRevisionId; + root: QueryRoot; document: string; operation: string; fragments: string[]; @@ -53,7 +56,7 @@ export interface QueryDeclaration { export interface QueryTemplate { declaration: Omit; parameters: TypeParameter[]; - root: InterfaceApplicationExpression; + root: QueryRoot; views: { target: ObjectTypeExpression; interface: InterfaceApplicationExpression }[]; allowances: { interface: InterfaceApplicationExpression; memberName: string; uses: QueryUse[]; reason: string }[]; } diff --git a/test/fixtures/query-workspace.ts b/test/fixtures/query-workspace.ts index 91cc26e..f245a5d 100644 --- a/test/fixtures/query-workspace.ts +++ b/test/fixtures/query-workspace.ts @@ -44,6 +44,9 @@ export async function queryWorkspaceFixture(options: { live?: boolean } = {}) { operation titleSet id "title-set" : string -> unit mode call receiver any requires {state title id "title-port" : string [write];}; operation score id "score" : unit -> int32 mode call receiver any; + query Extent id "extent" root workspace TaskFacts document "extent.graphql" operation "Extent" { + max rows 30; watch; + } query Upcoming id "upcoming" root Collection document "upcoming.graphql" operation "Upcoming" { fragments "row.graphql"; max rows 30; watch; } @@ -73,6 +76,7 @@ export async function queryWorkspaceFixture(options: { live?: boolean } = {}) { const pkg: PackageRevision = pkgResult.resource.revision; const allInterfaces = [...interfaces.values(), ...(pkgResult.resource.specializations ?? [])]; const documents: Record = { + "extent.graphql": `query Extent {root {objects(first: 30, orderBy: [{rank: ASC}]) {entries {node {_qx {ref} title rank}}}}}`, "upcoming.graphql": `query Upcoming($first: Int!, $after: Cursor) {root {items(first: $first, after: $after, where: {done: {eq: false}}, orderBy: [{rank: ASC}]) {entries {key cursor node {_qx {ref} ...TaskRow}} pageInfo {hasNextPage endCursor}}}}`, "row.graphql": `fragment TaskRow on TaskFacts {title rank done assignee {name}}`, "enriched.graphql": `query Enriched {root {items(first: 3) {entries {key node {_qx {ref} title score}}}}}`, diff --git a/test/query-compiler.test.ts b/test/query-compiler.test.ts index ca7debf..deeea33 100644 --- a/test/query-compiler.test.ts +++ b/test/query-compiler.test.ts @@ -45,11 +45,11 @@ test("generic query templates check declared bounds before closed specialization }`, [facts], ); - const build = (bound: string) => + const build = (bound: string, workspace = false) => compileCapabilityResourceSource( `import interface Collection; import interface TaskFacts; package GenericQueries id "generic-queries" revision "generic-queries@1" { - query Rows id "rows-template" root Collection + query Rows id "rows-template" root ${workspace ? "workspace " : ""}Collection document "rows.graphql" operation "Rows" { view object Item as TaskFacts; max rows 30; } query TaskRows id "task-rows" specialize Rows; }`, @@ -93,12 +93,33 @@ test("generic query templates check declared bounds before closed specialization checkQueryTemplate(invalid.resource.revision.queryTemplates![0]!, [generic, facts], read), /bound|guarantee|implement/i, ); + const extent = build("implements TaskFacts", true); + assert.ok(extent.ok, JSON.stringify(extent.diagnostics)); + if (extent.resource.kind !== "package") throw new Error("package expected"); + const extentPackage = extent.resource.revision; + const readExtent = async () => + `query Rows {root {objects(first: 2) {entries {node {items(first: 3) {entries {node {title}}}}}}}}`; + await checkQueryTemplate(extentPackage.queryTemplates![0]!, [generic, facts], readExtent); + const closed = await compileQuery( + extentPackage.queries![0]!, + [generic, facts, ...(extent.resource.specializations ?? [])], + readExtent, + ); + assert.equal(closed.declaration.root.kind, "workspace-interface"); + assert.equal(closed.declaration.root.interface, specialized.declaration.root.interface); + const invalidExtent = build("", true); + assert.ok(invalidExtent.ok, JSON.stringify(invalidExtent.diagnostics)); + if (invalidExtent.resource.kind !== "package") throw new Error("package expected"); + await assert.rejects( + checkQueryTemplate(invalidExtent.resource.revision.queryTemplates![0]!, [generic, facts], readExtent), + /bound|guarantee|implement/i, + ); }); -function fixture(clauses = "") { +function fixture(clauses = "", root = "Tasks") { const result = compileCapabilityResourceSource( `import interface Tasks; import interface TaskFacts; package Queries id "queries" revision "queries@1" { - query Upcoming id "upcoming" root Tasks document "queries/upcoming.graphql" operation "Upcoming" { + query Upcoming id "upcoming" root ${root} document "queries/upcoming.graphql" operation "Upcoming" { fragments "queries/row.graphql"; max rows 30; ${clauses} } }`, @@ -119,6 +140,33 @@ package Queries id "queries" revision "queries@1" { assert.equal(result.resource.revision.exports.length, 0); return result.resource.revision.queries![0]!; } +test("workspace roots expose a bounded interface extent, not a root object or writable relationship", async () => { + const declaration = { ...fixture("watch;", "workspace TaskFacts"), fragments: [] }; + assert.deepEqual(declaration.root, { kind: "workspace-interface", interface: "facts@1" }); + const checked = await compileQuery( + declaration, + [facts, collection], + async () => `query Upcoming { + root { + objects(first: 3, where: {done: {eq: false}}, orderBy: {title: ASC}) { + entries {key node {_qx {ref} title @live}} pageInfo {hasNextPage endCursor} + } + _qx {relations {objects {aggregate {count sum {due}}}}} + } + }`, + ); + assert.deepEqual(new Set(checked.effects.map((effect) => effect.memberId)), new Set(["done", "title", "due"])); + assert.ok(!checked.effects.some((effect) => effect.memberId.includes("workspace-objects"))); + assert.ok(JSON.stringify(checked.selection).includes("qx-internal-workspace-objects")); + await assert.rejects( + compileQuery(declaration, [facts], async () => `query Upcoming {root {_qx {ref}}}`), + /QUERY_VALIDATION/, + ); + await assert.rejects( + compileQuery(declaration, [facts], async () => `query Upcoming {root {objects {entries {key}}}}`), + /QUERY_ROW_LIMIT/, + ); +}); const document = `query Upcoming($first: Int!, $before: Int64!) { root { items(first: $first, where: {done: {eq: false}, due: {lt: $before}}, orderBy: [{due: ASC}]) { entries { key node { _qx { ref } ...Row } } pageInfo { hasNextPage endCursor } diff --git a/test/query-workspace.test.ts b/test/query-workspace.test.ts index bdbf8f4..0c17d5a 100644 --- a/test/query-workspace.test.ts +++ b/test/query-workspace.test.ts @@ -2,6 +2,7 @@ import assert from "node:assert/strict"; import test from "node:test"; import { queryWorkspaceFixture } from "./fixtures/query-workspace.js"; import { linkQueries } from "../src/query/link.js"; +import { compileQuery } from "../src/query/compile.js"; test("query fixture links generic collections, both implementations, and native getter/RPC setter", async () => { const { workspace } = await queryWorkspaceFixture(); @@ -27,3 +28,27 @@ test("query fixture links generic collections, both implementations, and native const totals = workspace.linkedQueries.find((q) => q.id.endsWith(":totals"))!; assert.equal(totals.fields.filter((f) => f.memberId === "rank").length, 2); }); + +test("reference-only workspace queries hash every eligible conformance, including empty atoms", async () => { + const { workspace } = await queryWorkspaceFixture(); + const pkg = workspace.packageImports.find((pkg) => pkg.queries?.some((q) => q.id === "upcoming"))!; + const query = pkg.queries!.find((q) => q.id === "upcoming")!; + const contract = workspace.interfaceImports.find((iface) => iface.displayName === "TaskFacts")!; + query.root = { kind: "workspace-interface", interface: contract.revisionId }; + query.fragments = []; + const checked = await compileQuery( + query, + workspace.interfaceImports, + async () => `query ${query.operation} {root {objects(first: 10) {entries {node {_qx {ref}}}}}}`, + ); + pkg.checkedQueries = pkg.checkedQueries!.map((q) => (q.declaration.id === query.id ? checked : q)); + const linked = linkQueries(workspace).find((q) => q.id.endsWith(":upcoming"))!; + assert.equal(linked.fields.length, 0); + assert.equal(linked.rootAtoms.length, 2); + workspace.conformances = workspace.conformances.filter( + (c) => !(c.atomId === linked.rootAtoms[0] && c.interfaceRevisionId === contract.revisionId), + ); + const changed = linkQueries(workspace).find((q) => q.id === linked.id)!; + assert.equal(changed.rootAtoms.length, 1); + assert.notEqual(linked.bindingDigest, changed.bindingDigest); +}); From 25944035030acc0b7b4e4c061ad467459f787039 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Fri, 18 Sep 2026 16:20:03 -0700 Subject: [PATCH 03/91] Add native literal substring query predicates Implement checked containsInsensitive string predicates in GraphQL, protobuf, native SQL and bounded residual evaluation. ASCII folding is deterministic; SQL pattern characters remain literal. Retain deferred full-text index design. Studio migration awaits a decision on checked native getter forwarding across conformances; do not duplicate titles or bypass private state ownership. Compiler and local full-stack substring-query acceptance pass. --- proto/camino/schema.proto | 1 + src/gen/camino/schema_pb.ts | 7 ++++++- src/query/relational-compile.ts | 2 +- src/query/relational-proto.ts | 1 + src/query/relational.ts | 4 ++-- src/query/schema.ts | 1 + test/fixtures/query-workspace.ts | 2 +- test/query-compiler.test.ts | 4 ++++ 8 files changed, 17 insertions(+), 5 deletions(-) diff --git a/proto/camino/schema.proto b/proto/camino/schema.proto index 4db4bdb..6ff19ce 100644 --- a/proto/camino/schema.proto +++ b/proto/camino/schema.proto @@ -165,6 +165,7 @@ enum QueryComparisonOperator { QUERY_COMPARISON_OPERATOR_LTE = 5; QUERY_COMPARISON_OPERATOR_GT = 6; QUERY_COMPARISON_OPERATOR_GTE = 7; + QUERY_COMPARISON_OPERATOR_CONTAINS_INSENSITIVE = 8; } message QueryComparison { QueryOperand operand = 1; diff --git a/src/gen/camino/schema_pb.ts b/src/gen/camino/schema_pb.ts index 373f551..1315059 100644 --- a/src/gen/camino/schema_pb.ts +++ b/src/gen/camino/schema_pb.ts @@ -10,7 +10,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file camino/schema.proto. */ export const file_camino_schema: GenFile = /*@__PURE__*/ - fileDesc("ChNjYW1pbm8vc2NoZW1hLnByb3RvEgZjYW1pbm8iNwoOQXRvbURlZmluaXRpb24SDwoHYXRvbV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkiWQoPQXRvbUNvbmZvcm1hbmNlEg8KB2F0b21faWQYASABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAIgASgJEhYKDmNvbmZvcm1hbmNlX2lkGAMgASgJIsIBCg9TdGF0ZUF0dGFjaG1lbnQSDwoHc2xvdF9pZBgBIAEoCRIYChBhdHRhY2hlZF9hdG9tX2lkGAIgASgJEhQKDGRpc3BsYXlfbmFtZRgDIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YBCABKAkSGwoTc3RvcmFnZV9wb2xpY3lfanNvbhgFIAEoCRIaChJkZWZhdWx0X3ZhbHVlX2pzb24YBiABKAkSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYByABKAkiUAoSRW5kcG9pbnRDb25zdHJhaW50EhEKB2F0b21faWQYASABKAlIABIfChVpbnRlcmZhY2VfcmV2aXNpb25faWQYAiABKAlIAEIGCgRraW5kIvsBCgxFZGdlRW5kcG9pbnQSFQoNcHJvamVjdGlvbl9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSLgoKY29uc3RyYWludBgDIAEoCzIaLmNhbWluby5FbmRwb2ludENvbnN0cmFpbnQSKAoLY2FyZGluYWxpdHkYBCABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSDwoHb3JkZXJlZBgFIAEoCBIRCglvbl9kZWxldGUYBiABKAkSFAoMcmV0YWluX290aGVyGAcgASgIEhAKCGtleV90eXBlGAggASgJEhgKEHB1YmxpY190cmF2ZXJzYWwYCSABKAgipQEKDkVkZ2VBdHRhY2htZW50EhQKDGVkZ2VfdHlwZV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSIwoFZmlyc3QYAyABKAsyFC5jYW1pbm8uRWRnZUVuZHBvaW50EiQKBnNlY29uZBgEIAEoCzIULmNhbWluby5FZGdlRW5kcG9pbnQSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYBSABKAkilQIKD1BlcnNpc3RlbmNlUGxhbhIUCgx3b3Jrc3BhY2VfaWQYASABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAIgASgJEiUKBWF0b21zGAMgAygLMhYuY2FtaW5vLkF0b21EZWZpbml0aW9uEi0KDGNvbmZvcm1hbmNlcxgEIAMoCzIXLmNhbWluby5BdG9tQ29uZm9ybWFuY2USJwoGc3RhdGVzGAUgAygLMhcuY2FtaW5vLlN0YXRlQXR0YWNobWVudBIlCgVlZGdlcxgGIAMoCzIWLmNhbWluby5FZGdlQXR0YWNobWVudBInCgdxdWVyaWVzGAcgAygLMhYuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5Ip4BCg1RdWVyeUFyZ3VtZW50EhIKCHZhcmlhYmxlGAEgASgJSAASFgoMbGl0ZXJhbF9qc29uGAIgASgJSAASKQoEbGlzdBgDIAEoCzIZLmNhbWluby5RdWVyeUFyZ3VtZW50TGlzdEgAEi0KBm9iamVjdBgEIAEoCzIbLmNhbWluby5RdWVyeUFyZ3VtZW50T2JqZWN0SABCBwoFdmFsdWUiOgoRUXVlcnlBcmd1bWVudExpc3QSJQoGdmFsdWVzGAEgAygLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQilAEKE1F1ZXJ5QXJndW1lbnRPYmplY3QSNwoGZmllbGRzGAEgAygLMicuY2FtaW5vLlF1ZXJ5QXJndW1lbnRPYmplY3QuRmllbGRzRW50cnkaRAoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQ6AjgBIkcKDlF1ZXJ5Q29uZGl0aW9uEg8KB2luY2x1ZGUYASABKAgSJAoFdmFsdWUYAiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCLUAwoOUXVlcnlTZWxlY3Rpb24SDAoEbmFtZRgBIAEoCRILCgNrZXkYAiABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAMgASgJEhEKCW1lbWJlcl9pZBgEIAEoCRIkChx0YXJnZXRfaW50ZXJmYWNlX3JldmlzaW9uX2lkGAUgASgJEioKCmNvbmRpdGlvbnMYBiADKAsyFi5jYW1pbm8uUXVlcnlDb25kaXRpb24SOAoJYXJndW1lbnRzGAcgAygLMiUuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uLkFyZ3VtZW50c0VudHJ5EikKCXNlbGVjdGlvbhgIIAMoCzIWLmNhbWluby5RdWVyeVNlbGVjdGlvbhIvCgpyZWxhdGlvbmFsGAkgASgLMhsuY2FtaW5vLlF1ZXJ5UmVsYXRpb25hbFBsYW4SKQoJcHJlZGljYXRlGAogASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEhkKEWxpdmVfc2VsZWN0aW9uX2lkGAsgASgJGkcKDkFyZ3VtZW50c0VudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50OgI4ASJqCg1RdWVyeVBhdGhTdGVwEhAKBnNvdXJjZRgBIAEoCEgAEhAKBnRhcmdldBgCIAEoCEgAEi0KCHJlbGF0aW9uGAMgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoSABCBgoEc3RlcCJ9ChFRdWVyeVJlbGF0aW9uUGF0aBIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEQoJbWVtYmVyX2lkGAIgASgJEiQKHHRhcmdldF9pbnRlcmZhY2VfcmV2aXNpb25faWQYAyABKAkSEAoIb3B0aW9uYWwYBCABKAgiRQoRUXVlcnlGaWVsZE9wZXJhbmQSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhEKCW1lbWJlcl9pZBgCIAEoCSK2AQoPUXVlcnlFeHByZXNzaW9uEiMKBHBhdGgYASADKAsyFS5jYW1pbm8uUXVlcnlQYXRoU3RlcBIqCgVmaWVsZBgCIAEoCzIZLmNhbWluby5RdWVyeUZpZWxkT3BlcmFuZEgAEg0KA3JlZhgDIAEoCUgAEg8KBWVudHJ5GAQgASgISAASEQoHbWFwX2tleRgFIAEoCEgAEhcKD3ZhbHVlX3R5cGVfanNvbhgGIAEoCUIGCgRsZWFmIoUBCg5RdWVyeVJlZHVjdGlvbhIwCghvcGVyYXRvchgBIAEoDjIeLmNhbWluby5RdWVyeUFnZ3JlZ2F0ZU9wZXJhdG9yEigKB29wZXJhbmQYAiABKAsyFy5jYW1pbm8uUXVlcnlFeHByZXNzaW9uEhcKD3ZhbHVlX3R5cGVfanNvbhgDIAEoCSJ1CgxRdWVyeU9wZXJhbmQSLQoKZXhwcmVzc2lvbhgBIAEoCzIXLmNhbWluby5RdWVyeUV4cHJlc3Npb25IABIrCglyZWR1Y3Rpb24YAiABKAsyFi5jYW1pbm8uUXVlcnlSZWR1Y3Rpb25IAEIJCgdvcGVyYW5kIpEBCg9RdWVyeUNvbXBhcmlzb24SJQoHb3BlcmFuZBgBIAEoCzIULmNhbWluby5RdWVyeU9wZXJhbmQSMQoIb3BlcmF0b3IYAiABKA4yHy5jYW1pbm8uUXVlcnlDb21wYXJpc29uT3BlcmF0b3ISJAoFdmFsdWUYAyABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCI+ChJRdWVyeVByZWRpY2F0ZUxpc3QSKAoIY2hpbGRyZW4YASADKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUi9QEKFlF1ZXJ5UmVsYXRpb25QcmVkaWNhdGUSIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhTdGVwEisKCHJlbGF0aW9uGAIgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoEjgKCG9wZXJhdG9yGAMgASgOMiYuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QcmVkaWNhdGVPcGVyYXRvchIpCglwcmVkaWNhdGUYBCABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUSJAoFdmFsdWUYBSABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCK6AQoXUXVlcnlSZWR1Y3Rpb25QcmVkaWNhdGUSIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhTdGVwEisKCHJlbGF0aW9uGAIgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoEiUKBXdoZXJlGAMgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEiYKBmhhdmluZxgEIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZSKsAgoOUXVlcnlQcmVkaWNhdGUSKQoDYW5kGAEgASgLMhouY2FtaW5vLlF1ZXJ5UHJlZGljYXRlTGlzdEgAEigKAm9yGAIgASgLMhouY2FtaW5vLlF1ZXJ5UHJlZGljYXRlTGlzdEgAEiUKA25vdBgDIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZUgAEioKB2NvbXBhcmUYBCABKAsyFy5jYW1pbm8uUXVlcnlDb21wYXJpc29uSAASMgoIcmVsYXRpb24YBSABKAsyHi5jYW1pbm8uUXVlcnlSZWxhdGlvblByZWRpY2F0ZUgAEjEKBnJlZHVjZRgGIAEoCzIfLmNhbWluby5RdWVyeVJlZHVjdGlvblByZWRpY2F0ZUgAQgsKCXByZWRpY2F0ZSJhCghRdWVyeVJvdxIoCgZvYmplY3QYASABKAsyFi5jYW1pbm8uUXVlcnlPYmplY3RSb3dIABIkCgRwYWlyGAIgASgLMhQuY2FtaW5vLlF1ZXJ5UGFpclJvd0gAQgUKA3JvdyJVCg5RdWVyeU9iamVjdFJvdxIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEgoKbWVtYmVyc2hpcBgCIAEoCBIQCghrZXlfdHlwZRgDIAEoCSJSCgxRdWVyeVBhaXJSb3cSIAoGc291cmNlGAEgASgLMhAuY2FtaW5vLlF1ZXJ5Um93EiAKBnRhcmdldBgCIAEoCzIQLmNhbWluby5RdWVyeVJvdyJFCghRdWVyeUtleRIMCgRwYXRoGAEgAygJEisKCmV4cHJlc3Npb24YAiABKAsyFy5jYW1pbm8uUXVlcnlFeHByZXNzaW9uIi8KDVF1ZXJ5RGlzdGluY3QSHgoEa2V5cxgBIAMoCzIQLmNhbWluby5RdWVyeUtleSJiCg5RdWVyeUV4cGFuc2lvbhIjCgRwYXRoGAEgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFN0ZXASKwoIcmVsYXRpb24YAiABKAsyGS5jYW1pbm8uUXVlcnlSZWxhdGlvblBhdGgimAIKFFF1ZXJ5UmVsYXRpb25hbFN0YWdlEgoKAmlkGAEgASgNEhIKBWlucHV0GAIgASgNSAGIAQESHQoDcm93GAMgASgLMhAuY2FtaW5vLlF1ZXJ5Um93EisKBnNvdXJjZRgEIAEoCzIZLmNhbWluby5RdWVyeVJlbGF0aW9uUGF0aEgAEigKBmZpbHRlchgFIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZUgAEigKBmV4cGFuZBgGIAEoCzIWLmNhbWluby5RdWVyeUV4cGFuc2lvbkgAEikKCGRpc3RpbmN0GAcgASgLMhUuY2FtaW5vLlF1ZXJ5RGlzdGluY3RIAEILCglvcGVyYXRpb25CCAoGX2lucHV0IlMKGFF1ZXJ5UmVkdWN0aW9uUHJvamVjdGlvbhIMCgRwYXRoGAEgAygJEikKCXJlZHVjdGlvbhgCIAEoCzIWLmNhbWluby5RdWVyeVJlZHVjdGlvbiJQChNRdWVyeUFnZ3JlZ2F0ZU9yZGVyEiUKB29wZXJhbmQYASABKAsyFC5jYW1pbm8uUXVlcnlPcGVyYW5kEhIKCmRlc2NlbmRpbmcYAiABKAgi0gMKF1F1ZXJ5UmVsYXRpb25hbFRlcm1pbmFsEg0KBXN0YWdlGAEgASgNEgwKBHBhdGgYAiADKAkSDgoGZ3JvdXBzGAMgASgIEh4KBGtleXMYBCADKAsyEC5jYW1pbm8uUXVlcnlLZXkSNAoKcmVkdWN0aW9ucxgFIAMoCzIgLmNhbWluby5RdWVyeVJlZHVjdGlvblByb2plY3Rpb24SJQoFd2hlcmUYBiABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUSJgoGaGF2aW5nGAcgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEioKBW9yZGVyGAggAygLMhsuY2FtaW5vLlF1ZXJ5QWdncmVnYXRlT3JkZXISJAoFZmlyc3QYCSABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudBIiCgNhbGwYCiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudBIkCgVhZnRlchgLIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50EikKCXNlbGVjdGlvbhgMIAMoCzIWLmNhbWluby5RdWVyeVNlbGVjdGlvbhIQCghyZXNpZHVhbBgNIAEoCBIMCgRyb3dzGA4gASgIIncKE1F1ZXJ5UmVsYXRpb25hbFBsYW4SLAoGc3RhZ2VzGAEgAygLMhwuY2FtaW5vLlF1ZXJ5UmVsYXRpb25hbFN0YWdlEjIKCXRlcm1pbmFscxgCIAMoCzIfLmNhbWluby5RdWVyeVJlbGF0aW9uYWxUZXJtaW5hbCLpAgoQUXVlcnlSZWFkQmluZGluZxIPCgdhdG9tX2lkGAEgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgCIAEoCRIRCgltZW1iZXJfaWQYAyABKAkSGwoTZ2V0dGVyX29wZXJhdGlvbl9pZBgEIAEoCRIPCgdzbG90X2lkGAUgASgJEhQKDGVkZ2VfdHlwZV9pZBgGIAEoCRIVCg1wcm9qZWN0aW9uX2lkGAcgASgJEgsKA3JwYxgIIAEoCBIgChh3YXRjaF9zdGFydF9vcGVyYXRpb25faWQYCSABKAkSHwoXd2F0Y2hfc3RvcF9vcGVyYXRpb25faWQYCiABKAkSEgoKZmllbGRfbmFtZRgLIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YDCABKAkSKAoLY2FyZGluYWxpdHkYDSABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSEAoIa2V5X3R5cGUYDiABKAkirwEKElF1ZXJ5RmllbGRDb250cmFjdBIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEQoJbWVtYmVyX2lkGAIgASgJEhIKCmZpZWxkX25hbWUYAyABKAkSFwoPdmFsdWVfdHlwZV9qc29uGAQgASgJEigKC2NhcmRpbmFsaXR5GAUgASgOMhMuY2FtaW5vLkNhcmRpbmFsaXR5EhAKCGtleV90eXBlGAYgASgJIpIBCgxRdWVyeUJ1ZGdldHMSDAoEcm93cxgBIAEoDRINCgVkZXB0aBgCIAEoDRIUCgxyZXN1bHRfYnl0ZXMYAyABKA0SEgoKY2FuZGlkYXRlcxgEIAEoDRIRCglycGNfY2FsbHMYBSABKA0SEwoLY29uY3VycmVuY3kYBiABKA0SEwoLZGVhZGxpbmVfbXMYByABKA0i7wQKDkluc3RhbGxlZFF1ZXJ5EgoKAmlkGAEgASgJEhkKEWRlZmluaXRpb25fZGlnZXN0GAIgASgJEhYKDmJpbmRpbmdfZGlnZXN0GAMgASgJEhoKEG9iamVjdF9pbnRlcmZhY2UYBCABKAlIABIdChN3b3Jrc3BhY2VfaW50ZXJmYWNlGA4gASgJSAASKQoJc2VsZWN0aW9uGAUgAygLMhYuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uEioKCGJpbmRpbmdzGAYgAygLMhguY2FtaW5vLlF1ZXJ5UmVhZEJpbmRpbmcSJQoHYnVkZ2V0cxgHIAEoCzIULmNhbWluby5RdWVyeUJ1ZGdldHMSGwoTdmFyaWFibGVzX3R5cGVfanNvbhgIIAEoCRIYChBvdXRwdXRfdHlwZV9qc29uGAkgASgJEkcKEXZhcmlhYmxlX2RlZmF1bHRzGAogAygLMiwuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5LlZhcmlhYmxlRGVmYXVsdHNFbnRyeRINCgV3YXRjaBgLIAEoCBIbChNwb2xsaW5nX2ludGVydmFsX21zGAwgASgNEh4KFnJwY19wcmVkaWNhdGVfb3Jfb3JkZXIYDSABKAgSFQoNcm9vdF9hdG9tX2lkcxgPIAMoCRIqCgZmaWVsZHMYECADKAsyGi5jYW1pbm8uUXVlcnlGaWVsZENvbnRyYWN0Gk4KFVZhcmlhYmxlRGVmYXVsdHNFbnRyeRILCgNrZXkYASABKAkSJAoFdmFsdWUYAiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudDoCOAFCBgoEcm9vdCpoCgtDYXJkaW5hbGl0eRIbChdDQVJESU5BTElUWV9VTlNQRUNJRklFRBAAEhAKDE9QVElPTkFMX09ORRABEg8KC0VYQUNUTFlfT05FEAISCAoETUFOWRADEg8KC01BTllfVU5JUVVFEAQqmgIKFlF1ZXJ5QWdncmVnYXRlT3BlcmF0b3ISKAokUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX1VOU1BFQ0lGSUVEEAASIgoeUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0NPVU5UEAESKgomUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0NPVU5UX1BSRVNFTlQQAhIgChxRVUVSWV9BR0dSRUdBVEVfT1BFUkFUT1JfU1VNEAMSIAocUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0FWRxAEEiAKHFFVRVJZX0FHR1JFR0FURV9PUEVSQVRPUl9NSU4QBRIgChxRVUVSWV9BR0dSRUdBVEVfT1BFUkFUT1JfTUFYEAYquQIKF1F1ZXJ5Q29tcGFyaXNvbk9wZXJhdG9yEikKJVFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfVU5TUEVDSUZJRUQQABIgChxRVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0VREAESIAocUVVFUllfQ09NUEFSSVNPTl9PUEVSQVRPUl9JThACEiUKIVFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfSVNfTlVMTBADEiAKHFFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfTFQQBBIhCh1RVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0xURRAFEiAKHFFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfR1QQBhIhCh1RVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0dURRAHKoQCCh5RdWVyeVJlbGF0aW9uUHJlZGljYXRlT3BlcmF0b3ISMQotUVVFUllfUkVMQVRJT05fUFJFRElDQVRFX09QRVJBVE9SX1VOU1BFQ0lGSUVEEAASKgomUVVFUllfUkVMQVRJT05fUFJFRElDQVRFX09QRVJBVE9SX1NPTUUQARIqCiZRVUVSWV9SRUxBVElPTl9QUkVESUNBVEVfT1BFUkFUT1JfTk9ORRACEigKJFFVRVJZX1JFTEFUSU9OX1BSRURJQ0FURV9PUEVSQVRPUl9JUxADEi0KKVFVRVJZX1JFTEFUSU9OX1BSRURJQ0FURV9PUEVSQVRPUl9JU19OVUxMEARiBnByb3RvMw"); + fileDesc("ChNjYW1pbm8vc2NoZW1hLnByb3RvEgZjYW1pbm8iNwoOQXRvbURlZmluaXRpb24SDwoHYXRvbV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkiWQoPQXRvbUNvbmZvcm1hbmNlEg8KB2F0b21faWQYASABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAIgASgJEhYKDmNvbmZvcm1hbmNlX2lkGAMgASgJIsIBCg9TdGF0ZUF0dGFjaG1lbnQSDwoHc2xvdF9pZBgBIAEoCRIYChBhdHRhY2hlZF9hdG9tX2lkGAIgASgJEhQKDGRpc3BsYXlfbmFtZRgDIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YBCABKAkSGwoTc3RvcmFnZV9wb2xpY3lfanNvbhgFIAEoCRIaChJkZWZhdWx0X3ZhbHVlX2pzb24YBiABKAkSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYByABKAkiUAoSRW5kcG9pbnRDb25zdHJhaW50EhEKB2F0b21faWQYASABKAlIABIfChVpbnRlcmZhY2VfcmV2aXNpb25faWQYAiABKAlIAEIGCgRraW5kIvsBCgxFZGdlRW5kcG9pbnQSFQoNcHJvamVjdGlvbl9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSLgoKY29uc3RyYWludBgDIAEoCzIaLmNhbWluby5FbmRwb2ludENvbnN0cmFpbnQSKAoLY2FyZGluYWxpdHkYBCABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSDwoHb3JkZXJlZBgFIAEoCBIRCglvbl9kZWxldGUYBiABKAkSFAoMcmV0YWluX290aGVyGAcgASgIEhAKCGtleV90eXBlGAggASgJEhgKEHB1YmxpY190cmF2ZXJzYWwYCSABKAgipQEKDkVkZ2VBdHRhY2htZW50EhQKDGVkZ2VfdHlwZV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSIwoFZmlyc3QYAyABKAsyFC5jYW1pbm8uRWRnZUVuZHBvaW50EiQKBnNlY29uZBgEIAEoCzIULmNhbWluby5FZGdlRW5kcG9pbnQSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYBSABKAkilQIKD1BlcnNpc3RlbmNlUGxhbhIUCgx3b3Jrc3BhY2VfaWQYASABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAIgASgJEiUKBWF0b21zGAMgAygLMhYuY2FtaW5vLkF0b21EZWZpbml0aW9uEi0KDGNvbmZvcm1hbmNlcxgEIAMoCzIXLmNhbWluby5BdG9tQ29uZm9ybWFuY2USJwoGc3RhdGVzGAUgAygLMhcuY2FtaW5vLlN0YXRlQXR0YWNobWVudBIlCgVlZGdlcxgGIAMoCzIWLmNhbWluby5FZGdlQXR0YWNobWVudBInCgdxdWVyaWVzGAcgAygLMhYuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5Ip4BCg1RdWVyeUFyZ3VtZW50EhIKCHZhcmlhYmxlGAEgASgJSAASFgoMbGl0ZXJhbF9qc29uGAIgASgJSAASKQoEbGlzdBgDIAEoCzIZLmNhbWluby5RdWVyeUFyZ3VtZW50TGlzdEgAEi0KBm9iamVjdBgEIAEoCzIbLmNhbWluby5RdWVyeUFyZ3VtZW50T2JqZWN0SABCBwoFdmFsdWUiOgoRUXVlcnlBcmd1bWVudExpc3QSJQoGdmFsdWVzGAEgAygLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQilAEKE1F1ZXJ5QXJndW1lbnRPYmplY3QSNwoGZmllbGRzGAEgAygLMicuY2FtaW5vLlF1ZXJ5QXJndW1lbnRPYmplY3QuRmllbGRzRW50cnkaRAoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQ6AjgBIkcKDlF1ZXJ5Q29uZGl0aW9uEg8KB2luY2x1ZGUYASABKAgSJAoFdmFsdWUYAiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCLUAwoOUXVlcnlTZWxlY3Rpb24SDAoEbmFtZRgBIAEoCRILCgNrZXkYAiABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAMgASgJEhEKCW1lbWJlcl9pZBgEIAEoCRIkChx0YXJnZXRfaW50ZXJmYWNlX3JldmlzaW9uX2lkGAUgASgJEioKCmNvbmRpdGlvbnMYBiADKAsyFi5jYW1pbm8uUXVlcnlDb25kaXRpb24SOAoJYXJndW1lbnRzGAcgAygLMiUuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uLkFyZ3VtZW50c0VudHJ5EikKCXNlbGVjdGlvbhgIIAMoCzIWLmNhbWluby5RdWVyeVNlbGVjdGlvbhIvCgpyZWxhdGlvbmFsGAkgASgLMhsuY2FtaW5vLlF1ZXJ5UmVsYXRpb25hbFBsYW4SKQoJcHJlZGljYXRlGAogASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEhkKEWxpdmVfc2VsZWN0aW9uX2lkGAsgASgJGkcKDkFyZ3VtZW50c0VudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50OgI4ASJqCg1RdWVyeVBhdGhTdGVwEhAKBnNvdXJjZRgBIAEoCEgAEhAKBnRhcmdldBgCIAEoCEgAEi0KCHJlbGF0aW9uGAMgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoSABCBgoEc3RlcCJ9ChFRdWVyeVJlbGF0aW9uUGF0aBIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEQoJbWVtYmVyX2lkGAIgASgJEiQKHHRhcmdldF9pbnRlcmZhY2VfcmV2aXNpb25faWQYAyABKAkSEAoIb3B0aW9uYWwYBCABKAgiRQoRUXVlcnlGaWVsZE9wZXJhbmQSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhEKCW1lbWJlcl9pZBgCIAEoCSK2AQoPUXVlcnlFeHByZXNzaW9uEiMKBHBhdGgYASADKAsyFS5jYW1pbm8uUXVlcnlQYXRoU3RlcBIqCgVmaWVsZBgCIAEoCzIZLmNhbWluby5RdWVyeUZpZWxkT3BlcmFuZEgAEg0KA3JlZhgDIAEoCUgAEg8KBWVudHJ5GAQgASgISAASEQoHbWFwX2tleRgFIAEoCEgAEhcKD3ZhbHVlX3R5cGVfanNvbhgGIAEoCUIGCgRsZWFmIoUBCg5RdWVyeVJlZHVjdGlvbhIwCghvcGVyYXRvchgBIAEoDjIeLmNhbWluby5RdWVyeUFnZ3JlZ2F0ZU9wZXJhdG9yEigKB29wZXJhbmQYAiABKAsyFy5jYW1pbm8uUXVlcnlFeHByZXNzaW9uEhcKD3ZhbHVlX3R5cGVfanNvbhgDIAEoCSJ1CgxRdWVyeU9wZXJhbmQSLQoKZXhwcmVzc2lvbhgBIAEoCzIXLmNhbWluby5RdWVyeUV4cHJlc3Npb25IABIrCglyZWR1Y3Rpb24YAiABKAsyFi5jYW1pbm8uUXVlcnlSZWR1Y3Rpb25IAEIJCgdvcGVyYW5kIpEBCg9RdWVyeUNvbXBhcmlzb24SJQoHb3BlcmFuZBgBIAEoCzIULmNhbWluby5RdWVyeU9wZXJhbmQSMQoIb3BlcmF0b3IYAiABKA4yHy5jYW1pbm8uUXVlcnlDb21wYXJpc29uT3BlcmF0b3ISJAoFdmFsdWUYAyABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCI+ChJRdWVyeVByZWRpY2F0ZUxpc3QSKAoIY2hpbGRyZW4YASADKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUi9QEKFlF1ZXJ5UmVsYXRpb25QcmVkaWNhdGUSIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhTdGVwEisKCHJlbGF0aW9uGAIgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoEjgKCG9wZXJhdG9yGAMgASgOMiYuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QcmVkaWNhdGVPcGVyYXRvchIpCglwcmVkaWNhdGUYBCABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUSJAoFdmFsdWUYBSABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCK6AQoXUXVlcnlSZWR1Y3Rpb25QcmVkaWNhdGUSIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhTdGVwEisKCHJlbGF0aW9uGAIgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoEiUKBXdoZXJlGAMgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEiYKBmhhdmluZxgEIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZSKsAgoOUXVlcnlQcmVkaWNhdGUSKQoDYW5kGAEgASgLMhouY2FtaW5vLlF1ZXJ5UHJlZGljYXRlTGlzdEgAEigKAm9yGAIgASgLMhouY2FtaW5vLlF1ZXJ5UHJlZGljYXRlTGlzdEgAEiUKA25vdBgDIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZUgAEioKB2NvbXBhcmUYBCABKAsyFy5jYW1pbm8uUXVlcnlDb21wYXJpc29uSAASMgoIcmVsYXRpb24YBSABKAsyHi5jYW1pbm8uUXVlcnlSZWxhdGlvblByZWRpY2F0ZUgAEjEKBnJlZHVjZRgGIAEoCzIfLmNhbWluby5RdWVyeVJlZHVjdGlvblByZWRpY2F0ZUgAQgsKCXByZWRpY2F0ZSJhCghRdWVyeVJvdxIoCgZvYmplY3QYASABKAsyFi5jYW1pbm8uUXVlcnlPYmplY3RSb3dIABIkCgRwYWlyGAIgASgLMhQuY2FtaW5vLlF1ZXJ5UGFpclJvd0gAQgUKA3JvdyJVCg5RdWVyeU9iamVjdFJvdxIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEgoKbWVtYmVyc2hpcBgCIAEoCBIQCghrZXlfdHlwZRgDIAEoCSJSCgxRdWVyeVBhaXJSb3cSIAoGc291cmNlGAEgASgLMhAuY2FtaW5vLlF1ZXJ5Um93EiAKBnRhcmdldBgCIAEoCzIQLmNhbWluby5RdWVyeVJvdyJFCghRdWVyeUtleRIMCgRwYXRoGAEgAygJEisKCmV4cHJlc3Npb24YAiABKAsyFy5jYW1pbm8uUXVlcnlFeHByZXNzaW9uIi8KDVF1ZXJ5RGlzdGluY3QSHgoEa2V5cxgBIAMoCzIQLmNhbWluby5RdWVyeUtleSJiCg5RdWVyeUV4cGFuc2lvbhIjCgRwYXRoGAEgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFN0ZXASKwoIcmVsYXRpb24YAiABKAsyGS5jYW1pbm8uUXVlcnlSZWxhdGlvblBhdGgimAIKFFF1ZXJ5UmVsYXRpb25hbFN0YWdlEgoKAmlkGAEgASgNEhIKBWlucHV0GAIgASgNSAGIAQESHQoDcm93GAMgASgLMhAuY2FtaW5vLlF1ZXJ5Um93EisKBnNvdXJjZRgEIAEoCzIZLmNhbWluby5RdWVyeVJlbGF0aW9uUGF0aEgAEigKBmZpbHRlchgFIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZUgAEigKBmV4cGFuZBgGIAEoCzIWLmNhbWluby5RdWVyeUV4cGFuc2lvbkgAEikKCGRpc3RpbmN0GAcgASgLMhUuY2FtaW5vLlF1ZXJ5RGlzdGluY3RIAEILCglvcGVyYXRpb25CCAoGX2lucHV0IlMKGFF1ZXJ5UmVkdWN0aW9uUHJvamVjdGlvbhIMCgRwYXRoGAEgAygJEikKCXJlZHVjdGlvbhgCIAEoCzIWLmNhbWluby5RdWVyeVJlZHVjdGlvbiJQChNRdWVyeUFnZ3JlZ2F0ZU9yZGVyEiUKB29wZXJhbmQYASABKAsyFC5jYW1pbm8uUXVlcnlPcGVyYW5kEhIKCmRlc2NlbmRpbmcYAiABKAgi0gMKF1F1ZXJ5UmVsYXRpb25hbFRlcm1pbmFsEg0KBXN0YWdlGAEgASgNEgwKBHBhdGgYAiADKAkSDgoGZ3JvdXBzGAMgASgIEh4KBGtleXMYBCADKAsyEC5jYW1pbm8uUXVlcnlLZXkSNAoKcmVkdWN0aW9ucxgFIAMoCzIgLmNhbWluby5RdWVyeVJlZHVjdGlvblByb2plY3Rpb24SJQoFd2hlcmUYBiABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUSJgoGaGF2aW5nGAcgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEioKBW9yZGVyGAggAygLMhsuY2FtaW5vLlF1ZXJ5QWdncmVnYXRlT3JkZXISJAoFZmlyc3QYCSABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudBIiCgNhbGwYCiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudBIkCgVhZnRlchgLIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50EikKCXNlbGVjdGlvbhgMIAMoCzIWLmNhbWluby5RdWVyeVNlbGVjdGlvbhIQCghyZXNpZHVhbBgNIAEoCBIMCgRyb3dzGA4gASgIIncKE1F1ZXJ5UmVsYXRpb25hbFBsYW4SLAoGc3RhZ2VzGAEgAygLMhwuY2FtaW5vLlF1ZXJ5UmVsYXRpb25hbFN0YWdlEjIKCXRlcm1pbmFscxgCIAMoCzIfLmNhbWluby5RdWVyeVJlbGF0aW9uYWxUZXJtaW5hbCLpAgoQUXVlcnlSZWFkQmluZGluZxIPCgdhdG9tX2lkGAEgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgCIAEoCRIRCgltZW1iZXJfaWQYAyABKAkSGwoTZ2V0dGVyX29wZXJhdGlvbl9pZBgEIAEoCRIPCgdzbG90X2lkGAUgASgJEhQKDGVkZ2VfdHlwZV9pZBgGIAEoCRIVCg1wcm9qZWN0aW9uX2lkGAcgASgJEgsKA3JwYxgIIAEoCBIgChh3YXRjaF9zdGFydF9vcGVyYXRpb25faWQYCSABKAkSHwoXd2F0Y2hfc3RvcF9vcGVyYXRpb25faWQYCiABKAkSEgoKZmllbGRfbmFtZRgLIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YDCABKAkSKAoLY2FyZGluYWxpdHkYDSABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSEAoIa2V5X3R5cGUYDiABKAkirwEKElF1ZXJ5RmllbGRDb250cmFjdBIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEQoJbWVtYmVyX2lkGAIgASgJEhIKCmZpZWxkX25hbWUYAyABKAkSFwoPdmFsdWVfdHlwZV9qc29uGAQgASgJEigKC2NhcmRpbmFsaXR5GAUgASgOMhMuY2FtaW5vLkNhcmRpbmFsaXR5EhAKCGtleV90eXBlGAYgASgJIpIBCgxRdWVyeUJ1ZGdldHMSDAoEcm93cxgBIAEoDRINCgVkZXB0aBgCIAEoDRIUCgxyZXN1bHRfYnl0ZXMYAyABKA0SEgoKY2FuZGlkYXRlcxgEIAEoDRIRCglycGNfY2FsbHMYBSABKA0SEwoLY29uY3VycmVuY3kYBiABKA0SEwoLZGVhZGxpbmVfbXMYByABKA0i7wQKDkluc3RhbGxlZFF1ZXJ5EgoKAmlkGAEgASgJEhkKEWRlZmluaXRpb25fZGlnZXN0GAIgASgJEhYKDmJpbmRpbmdfZGlnZXN0GAMgASgJEhoKEG9iamVjdF9pbnRlcmZhY2UYBCABKAlIABIdChN3b3Jrc3BhY2VfaW50ZXJmYWNlGA4gASgJSAASKQoJc2VsZWN0aW9uGAUgAygLMhYuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uEioKCGJpbmRpbmdzGAYgAygLMhguY2FtaW5vLlF1ZXJ5UmVhZEJpbmRpbmcSJQoHYnVkZ2V0cxgHIAEoCzIULmNhbWluby5RdWVyeUJ1ZGdldHMSGwoTdmFyaWFibGVzX3R5cGVfanNvbhgIIAEoCRIYChBvdXRwdXRfdHlwZV9qc29uGAkgASgJEkcKEXZhcmlhYmxlX2RlZmF1bHRzGAogAygLMiwuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5LlZhcmlhYmxlRGVmYXVsdHNFbnRyeRINCgV3YXRjaBgLIAEoCBIbChNwb2xsaW5nX2ludGVydmFsX21zGAwgASgNEh4KFnJwY19wcmVkaWNhdGVfb3Jfb3JkZXIYDSABKAgSFQoNcm9vdF9hdG9tX2lkcxgPIAMoCRIqCgZmaWVsZHMYECADKAsyGi5jYW1pbm8uUXVlcnlGaWVsZENvbnRyYWN0Gk4KFVZhcmlhYmxlRGVmYXVsdHNFbnRyeRILCgNrZXkYASABKAkSJAoFdmFsdWUYAiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudDoCOAFCBgoEcm9vdCpoCgtDYXJkaW5hbGl0eRIbChdDQVJESU5BTElUWV9VTlNQRUNJRklFRBAAEhAKDE9QVElPTkFMX09ORRABEg8KC0VYQUNUTFlfT05FEAISCAoETUFOWRADEg8KC01BTllfVU5JUVVFEAQqmgIKFlF1ZXJ5QWdncmVnYXRlT3BlcmF0b3ISKAokUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX1VOU1BFQ0lGSUVEEAASIgoeUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0NPVU5UEAESKgomUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0NPVU5UX1BSRVNFTlQQAhIgChxRVUVSWV9BR0dSRUdBVEVfT1BFUkFUT1JfU1VNEAMSIAocUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0FWRxAEEiAKHFFVRVJZX0FHR1JFR0FURV9PUEVSQVRPUl9NSU4QBRIgChxRVUVSWV9BR0dSRUdBVEVfT1BFUkFUT1JfTUFYEAYq7QIKF1F1ZXJ5Q29tcGFyaXNvbk9wZXJhdG9yEikKJVFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfVU5TUEVDSUZJRUQQABIgChxRVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0VREAESIAocUVVFUllfQ09NUEFSSVNPTl9PUEVSQVRPUl9JThACEiUKIVFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfSVNfTlVMTBADEiAKHFFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfTFQQBBIhCh1RVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0xURRAFEiAKHFFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfR1QQBhIhCh1RVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0dURRAHEjIKLlFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfQ09OVEFJTlNfSU5TRU5TSVRJVkUQCCqEAgoeUXVlcnlSZWxhdGlvblByZWRpY2F0ZU9wZXJhdG9yEjEKLVFVRVJZX1JFTEFUSU9OX1BSRURJQ0FURV9PUEVSQVRPUl9VTlNQRUNJRklFRBAAEioKJlFVRVJZX1JFTEFUSU9OX1BSRURJQ0FURV9PUEVSQVRPUl9TT01FEAESKgomUVVFUllfUkVMQVRJT05fUFJFRElDQVRFX09QRVJBVE9SX05PTkUQAhIoCiRRVUVSWV9SRUxBVElPTl9QUkVESUNBVEVfT1BFUkFUT1JfSVMQAxItCilRVUVSWV9SRUxBVElPTl9QUkVESUNBVEVfT1BFUkFUT1JfSVNfTlVMTBAEYgZwcm90bzM"); /** * @generated from message camino.AtomDefinition @@ -1563,6 +1563,11 @@ export enum QueryComparisonOperator { * @generated from enum value: QUERY_COMPARISON_OPERATOR_GTE = 7; */ GTE = 7, + + /** + * @generated from enum value: QUERY_COMPARISON_OPERATOR_CONTAINS_INSENSITIVE = 8; + */ + CONTAINS_INSENSITIVE = 8, } /** diff --git a/src/query/relational-compile.ts b/src/query/relational-compile.ts index c9723bf..25a076f 100644 --- a/src/query/relational-compile.ts +++ b/src/query/relational-compile.ts @@ -53,7 +53,7 @@ const pairs = (node: ValueNode): readonly import("graphql").ObjectFieldNode[] => node.kind === "ObjectValue" ? node.fields : fail("QUERY_UNSUPPORTED_FEATURE", "Query structure must be a literal object", node); -const ops = new Set(["eq", "in", "isNull", "lt", "lte", "gt", "gte"]); +const ops = new Set(["eq", "containsInsensitive", "in", "isNull", "lt", "lte", "gt", "gte"]); const prefix = (a: readonly string[], b: readonly string[]) => a.every((part, i) => part === b[i]); export function relationalCompiler( diff --git a/src/query/relational-proto.ts b/src/query/relational-proto.ts index 9f5d6a3..157cb65 100644 --- a/src/query/relational-proto.ts +++ b/src/query/relational-proto.ts @@ -66,6 +66,7 @@ export function relationalWire( value: argument(p.value), operator: { eq: wire.QueryComparisonOperator.EQ, + containsInsensitive: wire.QueryComparisonOperator.CONTAINS_INSENSITIVE, in: wire.QueryComparisonOperator.IN, isNull: wire.QueryComparisonOperator.IS_NULL, lt: wire.QueryComparisonOperator.LT, diff --git a/src/query/relational.ts b/src/query/relational.ts index fee63c0..cbfd509 100644 --- a/src/query/relational.ts +++ b/src/query/relational.ts @@ -65,7 +65,7 @@ export type QueryPredicate = | { kind: "compare"; expression: QueryExpression; - operator: "eq" | "in" | "isNull" | "lt" | "lte" | "gt" | "gte"; + operator: "eq" | "containsInsensitive" | "in" | "isNull" | "lt" | "lte" | "gt" | "gte"; value: QueryArgument; } | { @@ -93,7 +93,7 @@ export type QueryAggregatePredicate = | { kind: "compare"; expression: QueryExpression | QueryReduction; - operator: "eq" | "in" | "isNull" | "lt" | "lte" | "gt" | "gte"; + operator: "eq" | "containsInsensitive" | "in" | "isNull" | "lt" | "lte" | "gt" | "gte"; value: QueryArgument; }; export interface QueryKey { diff --git a/src/query/schema.ts b/src/query/schema.ts index b89b0e9..5100548 100644 --- a/src/query/schema.ts +++ b/src/query/schema.ts @@ -139,6 +139,7 @@ export function querySchema( let result = comparisons.get(key); if (!result) { const fields: GraphQLInputFieldConfigMap = { eq: { type: value }, isNull: { type: GraphQLBoolean } }; + if (base.kind === "scalar" && base.name === "string") fields.containsInsensitive = { type: value }; if (base.kind === "scalar" && base.name !== "bytes") fields.in = { type: new GraphQLList(new GraphQLNonNull(value)) }; if (base.kind === "scalar" && base.name !== "bool" && base.name !== "bytes") diff --git a/test/fixtures/query-workspace.ts b/test/fixtures/query-workspace.ts index f245a5d..b8f868f 100644 --- a/test/fixtures/query-workspace.ts +++ b/test/fixtures/query-workspace.ts @@ -76,7 +76,7 @@ export async function queryWorkspaceFixture(options: { live?: boolean } = {}) { const pkg: PackageRevision = pkgResult.resource.revision; const allInterfaces = [...interfaces.values(), ...(pkgResult.resource.specializations ?? [])]; const documents: Record = { - "extent.graphql": `query Extent {root {objects(first: 30, orderBy: [{rank: ASC}]) {entries {node {_qx {ref} title rank}}}}}`, + "extent.graphql": `query Extent($text: String! = "") {root {objects(first: 30, where: {title: {containsInsensitive: $text}}, orderBy: [{rank: ASC}]) {entries {node {_qx {ref} title rank}}}}}`, "upcoming.graphql": `query Upcoming($first: Int!, $after: Cursor) {root {items(first: $first, after: $after, where: {done: {eq: false}}, orderBy: [{rank: ASC}]) {entries {key cursor node {_qx {ref} ...TaskRow}} pageInfo {hasNextPage endCursor}}}}`, "row.graphql": `fragment TaskRow on TaskFacts {title rank done assignee {name}}`, "enriched.graphql": `query Enriched {root {items(first: 3) {entries {key node {_qx {ref} title score}}}}}`, diff --git a/test/query-compiler.test.ts b/test/query-compiler.test.ts index deeea33..0170666 100644 --- a/test/query-compiler.test.ts +++ b/test/query-compiler.test.ts @@ -276,6 +276,10 @@ test("fixed GraphQL yields exact effects, typed references and distinct query ar test("query allowlist and two-sided RPC effects fail during compilation", async () => { const rejects = (promise: Promise, code: string) => assert.rejects(promise, (error: unknown) => error instanceof QueryCompileError && error.code === code); + const substring = (field: string) => + `query Upcoming {root {items(first: 3, where: {${field}: {containsInsensitive: "TASK"}}) {entries {node {...Row}}}}}`; + await compile(substring("title")); + await rejects(compile(substring("due")), "QUERY_VALIDATION"); await rejects(compile(document, "fragment Row on TaskFacts { hidden }"), "QUERY_VALIDATION"); await rejects(compile(document, "fragment Row on TaskFacts { score }"), "QUERY_RPC_CONSUMER_REASON"); await compile( From 1aa55f7a354db1a0fc7827018d2bc80288ffc7d0 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Fri, 18 Sep 2026 16:59:19 -0700 Subject: [PATCH 04/91] Add composable interface operation forwarding Support bind member.operation to interface Target.member.operation. Check exact signatures and scopes, same-receiver conformances, cycles and watch pairing. Resolve chains for native queries, editing and dispatch while retaining the terminal conformance owner and injected package dependencies. Track forwarded providers in dependency and semantic-major review machinery. Cover native get/set/watch chains, generic targets, invalid bindings, package forwarding, runtime owner authority and watch cancellation. Document the language feature and keep Studio search adoption explicitly pending. No push or deployment. --- grammar/QuixosCapability.g4 | 1 + .../generated/QuixosCapability.interp | 2 +- .../generated/QuixosCapabilityParser.ts | 952 +++++++++--------- src/capability-language/parser.ts | 30 + src/capability-model/evolution.ts | 18 +- src/capability-model/forwarding.ts | 36 + src/capability-model/types.ts | 5 + src/capability-model/validation.ts | 82 +- src/query/link.ts | 13 +- test/forwarding.test.ts | 149 +++ 10 files changed, 821 insertions(+), 467 deletions(-) create mode 100644 src/capability-model/forwarding.ts create mode 100644 test/forwarding.test.ts diff --git a/grammar/QuixosCapability.g4 b/grammar/QuixosCapability.g4 index abd7f8c..d847595 100644 --- a/grammar/QuixosCapability.g4 +++ b/grammar/QuixosCapability.g4 @@ -301,6 +301,7 @@ operationName operationProvider : STATE identifier DOT statePrimitive | EDGE identifier DOT identifier DOT edgePrimitive + | INTERFACE identifier typeArguments? DOT memberOperationRef | PACKAGE identifier DOT identifier typeArguments? dependencyBindingBlock? ; diff --git a/src/capability-language/generated/QuixosCapability.interp b/src/capability-language/generated/QuixosCapability.interp index 7cb8101..e7e459a 100644 --- a/src/capability-language/generated/QuixosCapability.interp +++ b/src/capability-language/generated/QuixosCapability.interp @@ -344,4 +344,4 @@ stringLiteral atn: -[4, 1, 133, 1097, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 153, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 158, 8, 1, 10, 1, 12, 1, 161, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 179, 8, 3, 10, 3, 12, 3, 182, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 193, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 205, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 225, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 233, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 238, 8, 10, 10, 10, 12, 10, 241, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 246, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 256, 8, 10, 10, 10, 12, 10, 259, 9, 10, 3, 10, 261, 8, 10, 1, 10, 1, 10, 5, 10, 265, 8, 10, 10, 10, 12, 10, 268, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 276, 8, 11, 10, 11, 12, 11, 279, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 287, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 295, 8, 12, 10, 12, 12, 12, 298, 9, 12, 3, 12, 300, 8, 12, 3, 12, 302, 8, 12, 1, 13, 1, 13, 3, 13, 306, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 312, 8, 14, 10, 14, 12, 14, 315, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 326, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 331, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 340, 8, 17, 1, 18, 3, 18, 343, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 3, 19, 361, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 371, 8, 19, 10, 19, 12, 19, 374, 9, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 397, 8, 20, 1, 21, 3, 21, 400, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 410, 8, 21, 1, 21, 1, 21, 3, 21, 414, 8, 21, 1, 21, 1, 21, 5, 21, 418, 8, 21, 10, 21, 12, 21, 421, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 427, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 453, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 460, 8, 24, 1, 24, 1, 24, 3, 24, 464, 8, 24, 1, 25, 5, 25, 467, 8, 25, 10, 25, 12, 25, 470, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 480, 8, 25, 1, 25, 1, 25, 5, 25, 484, 8, 25, 10, 25, 12, 25, 487, 9, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 496, 8, 26, 1, 27, 1, 27, 1, 27, 3, 27, 501, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 507, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 516, 8, 27, 10, 27, 12, 27, 519, 9, 27, 1, 27, 1, 27, 1, 28, 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, 3, 29, 538, 8, 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, 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, 3, 29, 565, 8, 29, 1, 30, 1, 30, 1, 30, 3, 30, 570, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 581, 8, 30, 1, 30, 1, 30, 1, 30, 3, 30, 586, 8, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 3, 31, 593, 8, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 602, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 615, 8, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 634, 8, 35, 10, 35, 12, 35, 637, 9, 35, 3, 35, 639, 8, 35, 1, 35, 3, 35, 642, 8, 35, 1, 36, 1, 36, 1, 36, 5, 36, 647, 8, 36, 10, 36, 12, 36, 650, 9, 36, 1, 37, 1, 37, 1, 37, 5, 37, 655, 8, 37, 10, 37, 12, 37, 658, 9, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 688, 8, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 700, 8, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 714, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 720, 8, 39, 10, 39, 12, 39, 723, 9, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 3, 42, 734, 8, 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, 3, 43, 748, 8, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 758, 8, 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, 46, 1, 46, 1, 46, 1, 46, 3, 46, 776, 8, 46, 1, 46, 1, 46, 3, 46, 780, 8, 46, 1, 46, 3, 46, 783, 8, 46, 1, 46, 1, 46, 3, 46, 787, 8, 46, 1, 46, 3, 46, 790, 8, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 799, 8, 47, 1, 47, 1, 47, 3, 47, 803, 8, 47, 1, 47, 1, 47, 3, 47, 807, 8, 47, 1, 47, 1, 47, 5, 47, 811, 8, 47, 10, 47, 12, 47, 814, 9, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 823, 8, 48, 1, 49, 1, 49, 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, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 852, 8, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 871, 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, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 890, 8, 54, 1, 54, 3, 54, 893, 8, 54, 3, 54, 895, 8, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 5, 57, 904, 8, 57, 10, 57, 12, 57, 907, 9, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 921, 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, 937, 8, 58, 1, 58, 1, 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, 3, 58, 954, 8, 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, 967, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 979, 8, 58, 1, 58, 1, 58, 3, 58, 983, 8, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 992, 8, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1010, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 1032, 8, 60, 10, 60, 12, 60, 1035, 9, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1040, 8, 60, 3, 60, 1042, 8, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1061, 8, 64, 1, 65, 1, 65, 1, 65, 1, 65, 5, 65, 1067, 8, 65, 10, 65, 12, 65, 1070, 9, 65, 3, 65, 1072, 8, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 5, 67, 1084, 8, 67, 10, 67, 12, 67, 1087, 9, 67, 3, 67, 1089, 8, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 0, 0, 70, 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, 0, 7, 1, 0, 81, 85, 2, 0, 76, 80, 82, 83, 2, 0, 76, 77, 82, 83, 2, 0, 78, 80, 82, 83, 1, 0, 101, 108, 1, 0, 88, 91, 3, 0, 2, 15, 55, 55, 129, 129, 1178, 0, 152, 1, 0, 0, 0, 2, 154, 1, 0, 0, 0, 4, 164, 1, 0, 0, 0, 6, 168, 1, 0, 0, 0, 8, 192, 1, 0, 0, 0, 10, 204, 1, 0, 0, 0, 12, 206, 1, 0, 0, 0, 14, 213, 1, 0, 0, 0, 16, 224, 1, 0, 0, 0, 18, 226, 1, 0, 0, 0, 20, 239, 1, 0, 0, 0, 22, 271, 1, 0, 0, 0, 24, 301, 1, 0, 0, 0, 26, 303, 1, 0, 0, 0, 28, 307, 1, 0, 0, 0, 30, 325, 1, 0, 0, 0, 32, 327, 1, 0, 0, 0, 34, 339, 1, 0, 0, 0, 36, 342, 1, 0, 0, 0, 38, 360, 1, 0, 0, 0, 40, 396, 1, 0, 0, 0, 42, 399, 1, 0, 0, 0, 44, 424, 1, 0, 0, 0, 46, 452, 1, 0, 0, 0, 48, 463, 1, 0, 0, 0, 50, 468, 1, 0, 0, 0, 52, 495, 1, 0, 0, 0, 54, 497, 1, 0, 0, 0, 56, 522, 1, 0, 0, 0, 58, 564, 1, 0, 0, 0, 60, 566, 1, 0, 0, 0, 62, 589, 1, 0, 0, 0, 64, 605, 1, 0, 0, 0, 66, 618, 1, 0, 0, 0, 68, 621, 1, 0, 0, 0, 70, 641, 1, 0, 0, 0, 72, 643, 1, 0, 0, 0, 74, 651, 1, 0, 0, 0, 76, 713, 1, 0, 0, 0, 78, 715, 1, 0, 0, 0, 80, 726, 1, 0, 0, 0, 82, 728, 1, 0, 0, 0, 84, 733, 1, 0, 0, 0, 86, 735, 1, 0, 0, 0, 88, 757, 1, 0, 0, 0, 90, 759, 1, 0, 0, 0, 92, 768, 1, 0, 0, 0, 94, 793, 1, 0, 0, 0, 96, 822, 1, 0, 0, 0, 98, 824, 1, 0, 0, 0, 100, 831, 1, 0, 0, 0, 102, 845, 1, 0, 0, 0, 104, 855, 1, 0, 0, 0, 106, 870, 1, 0, 0, 0, 108, 894, 1, 0, 0, 0, 110, 896, 1, 0, 0, 0, 112, 898, 1, 0, 0, 0, 114, 900, 1, 0, 0, 0, 116, 982, 1, 0, 0, 0, 118, 984, 1, 0, 0, 0, 120, 1041, 1, 0, 0, 0, 122, 1043, 1, 0, 0, 0, 124, 1048, 1, 0, 0, 0, 126, 1050, 1, 0, 0, 0, 128, 1060, 1, 0, 0, 0, 130, 1062, 1, 0, 0, 0, 132, 1075, 1, 0, 0, 0, 134, 1079, 1, 0, 0, 0, 136, 1092, 1, 0, 0, 0, 138, 1094, 1, 0, 0, 0, 140, 141, 3, 6, 3, 0, 141, 142, 5, 0, 0, 1, 142, 153, 1, 0, 0, 0, 143, 144, 3, 20, 10, 0, 144, 145, 5, 0, 0, 1, 145, 153, 1, 0, 0, 0, 146, 147, 3, 50, 25, 0, 147, 148, 5, 0, 0, 1, 148, 153, 1, 0, 0, 0, 149, 150, 3, 2, 1, 0, 150, 151, 5, 0, 0, 1, 151, 153, 1, 0, 0, 0, 152, 140, 1, 0, 0, 0, 152, 143, 1, 0, 0, 0, 152, 146, 1, 0, 0, 0, 152, 149, 1, 0, 0, 0, 153, 1, 1, 0, 0, 0, 154, 155, 5, 22, 0, 0, 155, 159, 5, 117, 0, 0, 156, 158, 3, 8, 4, 0, 157, 156, 1, 0, 0, 0, 158, 161, 1, 0, 0, 0, 159, 157, 1, 0, 0, 0, 159, 160, 1, 0, 0, 0, 160, 162, 1, 0, 0, 0, 161, 159, 1, 0, 0, 0, 162, 163, 5, 118, 0, 0, 163, 3, 1, 0, 0, 0, 164, 165, 5, 23, 0, 0, 165, 166, 3, 138, 69, 0, 166, 167, 5, 114, 0, 0, 167, 5, 1, 0, 0, 0, 168, 169, 5, 1, 0, 0, 169, 170, 3, 136, 68, 0, 170, 171, 5, 64, 0, 0, 171, 172, 3, 138, 69, 0, 172, 173, 5, 58, 0, 0, 173, 174, 3, 138, 69, 0, 174, 175, 5, 57, 0, 0, 175, 176, 3, 138, 69, 0, 176, 180, 5, 117, 0, 0, 177, 179, 3, 8, 4, 0, 178, 177, 1, 0, 0, 0, 179, 182, 1, 0, 0, 0, 180, 178, 1, 0, 0, 0, 180, 181, 1, 0, 0, 0, 181, 183, 1, 0, 0, 0, 182, 180, 1, 0, 0, 0, 183, 184, 5, 118, 0, 0, 184, 7, 1, 0, 0, 0, 185, 193, 3, 4, 2, 0, 186, 193, 3, 18, 9, 0, 187, 193, 3, 10, 5, 0, 188, 193, 3, 82, 41, 0, 189, 193, 3, 94, 47, 0, 190, 193, 3, 118, 59, 0, 191, 193, 3, 32, 16, 0, 192, 185, 1, 0, 0, 0, 192, 186, 1, 0, 0, 0, 192, 187, 1, 0, 0, 0, 192, 188, 1, 0, 0, 0, 192, 189, 1, 0, 0, 0, 192, 190, 1, 0, 0, 0, 192, 191, 1, 0, 0, 0, 193, 9, 1, 0, 0, 0, 194, 195, 5, 23, 0, 0, 195, 196, 5, 26, 0, 0, 196, 197, 3, 136, 68, 0, 197, 198, 5, 114, 0, 0, 198, 205, 1, 0, 0, 0, 199, 200, 5, 23, 0, 0, 200, 201, 5, 28, 0, 0, 201, 202, 3, 136, 68, 0, 202, 203, 5, 114, 0, 0, 203, 205, 1, 0, 0, 0, 204, 194, 1, 0, 0, 0, 204, 199, 1, 0, 0, 0, 205, 11, 1, 0, 0, 0, 206, 207, 5, 24, 0, 0, 207, 208, 5, 25, 0, 0, 208, 209, 3, 136, 68, 0, 209, 210, 5, 64, 0, 0, 210, 211, 3, 138, 69, 0, 211, 212, 5, 114, 0, 0, 212, 13, 1, 0, 0, 0, 213, 214, 5, 24, 0, 0, 214, 215, 5, 26, 0, 0, 215, 216, 3, 136, 68, 0, 216, 217, 5, 58, 0, 0, 217, 218, 3, 138, 69, 0, 218, 219, 5, 114, 0, 0, 219, 15, 1, 0, 0, 0, 220, 225, 3, 10, 5, 0, 221, 225, 3, 12, 6, 0, 222, 225, 3, 14, 7, 0, 223, 225, 3, 32, 16, 0, 224, 220, 1, 0, 0, 0, 224, 221, 1, 0, 0, 0, 224, 222, 1, 0, 0, 0, 224, 223, 1, 0, 0, 0, 225, 17, 1, 0, 0, 0, 226, 227, 5, 25, 0, 0, 227, 228, 3, 136, 68, 0, 228, 229, 5, 64, 0, 0, 229, 232, 3, 138, 69, 0, 230, 231, 5, 65, 0, 0, 231, 233, 3, 138, 69, 0, 232, 230, 1, 0, 0, 0, 232, 233, 1, 0, 0, 0, 233, 234, 1, 0, 0, 0, 234, 235, 5, 114, 0, 0, 235, 19, 1, 0, 0, 0, 236, 238, 3, 16, 8, 0, 237, 236, 1, 0, 0, 0, 238, 241, 1, 0, 0, 0, 239, 237, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 242, 1, 0, 0, 0, 241, 239, 1, 0, 0, 0, 242, 243, 5, 26, 0, 0, 243, 245, 3, 136, 68, 0, 244, 246, 3, 22, 11, 0, 245, 244, 1, 0, 0, 0, 245, 246, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 247, 248, 5, 64, 0, 0, 248, 249, 3, 138, 69, 0, 249, 250, 5, 58, 0, 0, 250, 260, 3, 138, 69, 0, 251, 252, 5, 69, 0, 0, 252, 257, 3, 26, 13, 0, 253, 254, 5, 115, 0, 0, 254, 256, 3, 26, 13, 0, 255, 253, 1, 0, 0, 0, 256, 259, 1, 0, 0, 0, 257, 255, 1, 0, 0, 0, 257, 258, 1, 0, 0, 0, 258, 261, 1, 0, 0, 0, 259, 257, 1, 0, 0, 0, 260, 251, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 266, 5, 117, 0, 0, 263, 265, 3, 34, 17, 0, 264, 263, 1, 0, 0, 0, 265, 268, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 269, 1, 0, 0, 0, 268, 266, 1, 0, 0, 0, 269, 270, 5, 118, 0, 0, 270, 21, 1, 0, 0, 0, 271, 272, 5, 123, 0, 0, 272, 277, 3, 24, 12, 0, 273, 274, 5, 115, 0, 0, 274, 276, 3, 24, 12, 0, 275, 273, 1, 0, 0, 0, 276, 279, 1, 0, 0, 0, 277, 275, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 280, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 280, 281, 5, 124, 0, 0, 281, 23, 1, 0, 0, 0, 282, 283, 5, 29, 0, 0, 283, 286, 3, 136, 68, 0, 284, 285, 5, 113, 0, 0, 285, 287, 5, 19, 0, 0, 286, 284, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 302, 1, 0, 0, 0, 288, 289, 5, 18, 0, 0, 289, 299, 3, 136, 68, 0, 290, 291, 5, 20, 0, 0, 291, 296, 3, 26, 13, 0, 292, 293, 5, 125, 0, 0, 293, 295, 3, 26, 13, 0, 294, 292, 1, 0, 0, 0, 295, 298, 1, 0, 0, 0, 296, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 300, 1, 0, 0, 0, 298, 296, 1, 0, 0, 0, 299, 290, 1, 0, 0, 0, 299, 300, 1, 0, 0, 0, 300, 302, 1, 0, 0, 0, 301, 282, 1, 0, 0, 0, 301, 288, 1, 0, 0, 0, 302, 25, 1, 0, 0, 0, 303, 305, 3, 136, 68, 0, 304, 306, 3, 28, 14, 0, 305, 304, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 27, 1, 0, 0, 0, 307, 308, 5, 123, 0, 0, 308, 313, 3, 30, 15, 0, 309, 310, 5, 115, 0, 0, 310, 312, 3, 30, 15, 0, 311, 309, 1, 0, 0, 0, 312, 315, 1, 0, 0, 0, 313, 311, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 316, 1, 0, 0, 0, 315, 313, 1, 0, 0, 0, 316, 317, 5, 124, 0, 0, 317, 29, 1, 0, 0, 0, 318, 319, 5, 25, 0, 0, 319, 326, 3, 136, 68, 0, 320, 321, 5, 26, 0, 0, 321, 326, 3, 26, 13, 0, 322, 323, 5, 18, 0, 0, 323, 326, 3, 136, 68, 0, 324, 326, 3, 120, 60, 0, 325, 318, 1, 0, 0, 0, 325, 320, 1, 0, 0, 0, 325, 322, 1, 0, 0, 0, 325, 324, 1, 0, 0, 0, 326, 31, 1, 0, 0, 0, 327, 328, 5, 17, 0, 0, 328, 330, 3, 136, 68, 0, 329, 331, 3, 22, 11, 0, 330, 329, 1, 0, 0, 0, 330, 331, 1, 0, 0, 0, 331, 332, 1, 0, 0, 0, 332, 333, 5, 126, 0, 0, 333, 334, 3, 120, 60, 0, 334, 335, 5, 114, 0, 0, 335, 33, 1, 0, 0, 0, 336, 340, 3, 38, 19, 0, 337, 340, 3, 42, 21, 0, 338, 340, 3, 36, 18, 0, 339, 336, 1, 0, 0, 0, 339, 337, 1, 0, 0, 0, 339, 338, 1, 0, 0, 0, 340, 35, 1, 0, 0, 0, 341, 343, 5, 39, 0, 0, 342, 341, 1, 0, 0, 0, 342, 343, 1, 0, 0, 0, 343, 344, 1, 0, 0, 0, 344, 345, 5, 31, 0, 0, 345, 346, 3, 136, 68, 0, 346, 347, 5, 64, 0, 0, 347, 348, 3, 138, 69, 0, 348, 349, 5, 113, 0, 0, 349, 350, 3, 120, 60, 0, 350, 351, 5, 112, 0, 0, 351, 352, 3, 120, 60, 0, 352, 353, 5, 117, 0, 0, 353, 354, 5, 81, 0, 0, 354, 355, 5, 64, 0, 0, 355, 356, 3, 138, 69, 0, 356, 357, 5, 114, 0, 0, 357, 358, 5, 118, 0, 0, 358, 37, 1, 0, 0, 0, 359, 361, 3, 44, 22, 0, 360, 359, 1, 0, 0, 0, 360, 361, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 363, 5, 29, 0, 0, 363, 364, 3, 136, 68, 0, 364, 365, 5, 64, 0, 0, 365, 366, 3, 138, 69, 0, 366, 367, 5, 113, 0, 0, 367, 368, 3, 120, 60, 0, 368, 372, 5, 117, 0, 0, 369, 371, 3, 40, 20, 0, 370, 369, 1, 0, 0, 0, 371, 374, 1, 0, 0, 0, 372, 370, 1, 0, 0, 0, 372, 373, 1, 0, 0, 0, 373, 375, 1, 0, 0, 0, 374, 372, 1, 0, 0, 0, 375, 376, 5, 118, 0, 0, 376, 39, 1, 0, 0, 0, 377, 378, 5, 71, 0, 0, 378, 379, 5, 64, 0, 0, 379, 380, 3, 138, 69, 0, 380, 381, 5, 114, 0, 0, 381, 397, 1, 0, 0, 0, 382, 383, 5, 72, 0, 0, 383, 384, 5, 64, 0, 0, 384, 385, 3, 138, 69, 0, 385, 386, 5, 114, 0, 0, 386, 397, 1, 0, 0, 0, 387, 388, 5, 73, 0, 0, 388, 389, 5, 74, 0, 0, 389, 390, 5, 64, 0, 0, 390, 391, 3, 138, 69, 0, 391, 392, 5, 75, 0, 0, 392, 393, 5, 64, 0, 0, 393, 394, 3, 138, 69, 0, 394, 395, 5, 114, 0, 0, 395, 397, 1, 0, 0, 0, 396, 377, 1, 0, 0, 0, 396, 382, 1, 0, 0, 0, 396, 387, 1, 0, 0, 0, 397, 41, 1, 0, 0, 0, 398, 400, 3, 44, 22, 0, 399, 398, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 402, 5, 30, 0, 0, 402, 403, 3, 136, 68, 0, 403, 404, 5, 64, 0, 0, 404, 405, 3, 138, 69, 0, 405, 406, 5, 113, 0, 0, 406, 407, 3, 126, 63, 0, 407, 409, 3, 48, 24, 0, 408, 410, 5, 92, 0, 0, 409, 408, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 413, 1, 0, 0, 0, 411, 412, 5, 62, 0, 0, 412, 414, 3, 138, 69, 0, 413, 411, 1, 0, 0, 0, 413, 414, 1, 0, 0, 0, 414, 415, 1, 0, 0, 0, 415, 419, 5, 117, 0, 0, 416, 418, 3, 46, 23, 0, 417, 416, 1, 0, 0, 0, 418, 421, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 419, 1, 0, 0, 0, 422, 423, 5, 118, 0, 0, 423, 43, 1, 0, 0, 0, 424, 426, 5, 14, 0, 0, 425, 427, 5, 15, 0, 0, 426, 425, 1, 0, 0, 0, 426, 427, 1, 0, 0, 0, 427, 45, 1, 0, 0, 0, 428, 429, 5, 78, 0, 0, 429, 430, 5, 64, 0, 0, 430, 431, 3, 138, 69, 0, 431, 432, 5, 114, 0, 0, 432, 453, 1, 0, 0, 0, 433, 434, 5, 79, 0, 0, 434, 435, 5, 64, 0, 0, 435, 436, 3, 138, 69, 0, 436, 437, 5, 114, 0, 0, 437, 453, 1, 0, 0, 0, 438, 439, 5, 80, 0, 0, 439, 440, 5, 64, 0, 0, 440, 441, 3, 138, 69, 0, 441, 442, 5, 114, 0, 0, 442, 453, 1, 0, 0, 0, 443, 444, 5, 73, 0, 0, 444, 445, 5, 74, 0, 0, 445, 446, 5, 64, 0, 0, 446, 447, 3, 138, 69, 0, 447, 448, 5, 75, 0, 0, 448, 449, 5, 64, 0, 0, 449, 450, 3, 138, 69, 0, 450, 451, 5, 114, 0, 0, 451, 453, 1, 0, 0, 0, 452, 428, 1, 0, 0, 0, 452, 433, 1, 0, 0, 0, 452, 438, 1, 0, 0, 0, 452, 443, 1, 0, 0, 0, 453, 47, 1, 0, 0, 0, 454, 455, 5, 25, 0, 0, 455, 464, 3, 136, 68, 0, 456, 457, 5, 26, 0, 0, 457, 459, 3, 136, 68, 0, 458, 460, 3, 28, 14, 0, 459, 458, 1, 0, 0, 0, 459, 460, 1, 0, 0, 0, 460, 464, 1, 0, 0, 0, 461, 462, 5, 18, 0, 0, 462, 464, 3, 136, 68, 0, 463, 454, 1, 0, 0, 0, 463, 456, 1, 0, 0, 0, 463, 461, 1, 0, 0, 0, 464, 49, 1, 0, 0, 0, 465, 467, 3, 16, 8, 0, 466, 465, 1, 0, 0, 0, 467, 470, 1, 0, 0, 0, 468, 466, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 471, 1, 0, 0, 0, 470, 468, 1, 0, 0, 0, 471, 472, 5, 28, 0, 0, 472, 473, 3, 136, 68, 0, 473, 474, 5, 64, 0, 0, 474, 475, 3, 138, 69, 0, 475, 476, 5, 58, 0, 0, 476, 479, 3, 138, 69, 0, 477, 478, 5, 59, 0, 0, 478, 480, 5, 127, 0, 0, 479, 477, 1, 0, 0, 0, 479, 480, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 485, 5, 117, 0, 0, 482, 484, 3, 52, 26, 0, 483, 482, 1, 0, 0, 0, 484, 487, 1, 0, 0, 0, 485, 483, 1, 0, 0, 0, 485, 486, 1, 0, 0, 0, 486, 488, 1, 0, 0, 0, 487, 485, 1, 0, 0, 0, 488, 489, 5, 118, 0, 0, 489, 51, 1, 0, 0, 0, 490, 496, 3, 60, 30, 0, 491, 496, 3, 62, 31, 0, 492, 496, 3, 64, 32, 0, 493, 496, 3, 54, 27, 0, 494, 496, 3, 56, 28, 0, 495, 490, 1, 0, 0, 0, 495, 491, 1, 0, 0, 0, 495, 492, 1, 0, 0, 0, 495, 493, 1, 0, 0, 0, 495, 494, 1, 0, 0, 0, 496, 53, 1, 0, 0, 0, 497, 498, 5, 5, 0, 0, 498, 500, 3, 136, 68, 0, 499, 501, 3, 22, 11, 0, 500, 499, 1, 0, 0, 0, 500, 501, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 5, 64, 0, 0, 503, 504, 3, 138, 69, 0, 504, 506, 5, 7, 0, 0, 505, 507, 5, 1, 0, 0, 506, 505, 1, 0, 0, 0, 506, 507, 1, 0, 0, 0, 507, 508, 1, 0, 0, 0, 508, 509, 3, 26, 13, 0, 509, 510, 5, 8, 0, 0, 510, 511, 3, 138, 69, 0, 511, 512, 5, 31, 0, 0, 512, 513, 3, 138, 69, 0, 513, 517, 5, 117, 0, 0, 514, 516, 3, 58, 29, 0, 515, 514, 1, 0, 0, 0, 516, 519, 1, 0, 0, 0, 517, 515, 1, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 520, 1, 0, 0, 0, 519, 517, 1, 0, 0, 0, 520, 521, 5, 118, 0, 0, 521, 55, 1, 0, 0, 0, 522, 523, 5, 5, 0, 0, 523, 524, 3, 136, 68, 0, 524, 525, 5, 64, 0, 0, 525, 526, 3, 138, 69, 0, 526, 527, 5, 6, 0, 0, 527, 528, 3, 136, 68, 0, 528, 529, 3, 28, 14, 0, 529, 530, 5, 114, 0, 0, 530, 57, 1, 0, 0, 0, 531, 532, 5, 9, 0, 0, 532, 533, 3, 138, 69, 0, 533, 534, 5, 114, 0, 0, 534, 565, 1, 0, 0, 0, 535, 537, 5, 10, 0, 0, 536, 538, 5, 18, 0, 0, 537, 536, 1, 0, 0, 0, 537, 538, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 540, 3, 136, 68, 0, 540, 541, 5, 37, 0, 0, 541, 542, 3, 26, 13, 0, 542, 543, 5, 114, 0, 0, 543, 565, 1, 0, 0, 0, 544, 545, 5, 11, 0, 0, 545, 546, 3, 136, 68, 0, 546, 547, 5, 127, 0, 0, 547, 548, 5, 114, 0, 0, 548, 565, 1, 0, 0, 0, 549, 550, 5, 12, 0, 0, 550, 551, 3, 26, 13, 0, 551, 552, 5, 116, 0, 0, 552, 553, 3, 136, 68, 0, 553, 554, 3, 136, 68, 0, 554, 555, 3, 138, 69, 0, 555, 556, 5, 114, 0, 0, 556, 565, 1, 0, 0, 0, 557, 558, 5, 73, 0, 0, 558, 565, 5, 114, 0, 0, 559, 560, 5, 13, 0, 0, 560, 561, 5, 127, 0, 0, 561, 562, 3, 138, 69, 0, 562, 563, 5, 114, 0, 0, 563, 565, 1, 0, 0, 0, 564, 531, 1, 0, 0, 0, 564, 535, 1, 0, 0, 0, 564, 544, 1, 0, 0, 0, 564, 549, 1, 0, 0, 0, 564, 557, 1, 0, 0, 0, 564, 559, 1, 0, 0, 0, 565, 59, 1, 0, 0, 0, 566, 567, 5, 31, 0, 0, 567, 569, 3, 136, 68, 0, 568, 570, 3, 22, 11, 0, 569, 568, 1, 0, 0, 0, 569, 570, 1, 0, 0, 0, 570, 571, 1, 0, 0, 0, 571, 572, 5, 64, 0, 0, 572, 573, 3, 138, 69, 0, 573, 574, 5, 113, 0, 0, 574, 575, 3, 120, 60, 0, 575, 576, 5, 112, 0, 0, 576, 577, 3, 120, 60, 0, 577, 578, 5, 66, 0, 0, 578, 580, 3, 68, 34, 0, 579, 581, 3, 66, 33, 0, 580, 579, 1, 0, 0, 0, 580, 581, 1, 0, 0, 0, 581, 582, 1, 0, 0, 0, 582, 583, 5, 68, 0, 0, 583, 585, 3, 70, 35, 0, 584, 586, 3, 74, 37, 0, 585, 584, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 587, 1, 0, 0, 0, 587, 588, 5, 114, 0, 0, 588, 61, 1, 0, 0, 0, 589, 590, 5, 32, 0, 0, 590, 592, 3, 136, 68, 0, 591, 593, 3, 22, 11, 0, 592, 591, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 595, 5, 64, 0, 0, 595, 596, 3, 138, 69, 0, 596, 597, 5, 113, 0, 0, 597, 598, 3, 120, 60, 0, 598, 599, 5, 112, 0, 0, 599, 601, 3, 120, 60, 0, 600, 602, 3, 74, 37, 0, 601, 600, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 604, 5, 114, 0, 0, 604, 63, 1, 0, 0, 0, 605, 606, 5, 33, 0, 0, 606, 607, 3, 136, 68, 0, 607, 608, 5, 64, 0, 0, 608, 609, 3, 138, 69, 0, 609, 610, 5, 34, 0, 0, 610, 611, 3, 136, 68, 0, 611, 612, 5, 113, 0, 0, 612, 614, 3, 120, 60, 0, 613, 615, 3, 74, 37, 0, 614, 613, 1, 0, 0, 0, 614, 615, 1, 0, 0, 0, 615, 616, 1, 0, 0, 0, 616, 617, 5, 114, 0, 0, 617, 65, 1, 0, 0, 0, 618, 619, 5, 67, 0, 0, 619, 620, 3, 120, 60, 0, 620, 67, 1, 0, 0, 0, 621, 622, 7, 0, 0, 0, 622, 69, 1, 0, 0, 0, 623, 642, 5, 70, 0, 0, 624, 625, 5, 25, 0, 0, 625, 642, 3, 136, 68, 0, 626, 627, 5, 18, 0, 0, 627, 642, 3, 136, 68, 0, 628, 629, 5, 27, 0, 0, 629, 638, 5, 119, 0, 0, 630, 635, 3, 26, 13, 0, 631, 632, 5, 115, 0, 0, 632, 634, 3, 26, 13, 0, 633, 631, 1, 0, 0, 0, 634, 637, 1, 0, 0, 0, 635, 633, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 639, 1, 0, 0, 0, 637, 635, 1, 0, 0, 0, 638, 630, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 642, 5, 120, 0, 0, 641, 623, 1, 0, 0, 0, 641, 624, 1, 0, 0, 0, 641, 626, 1, 0, 0, 0, 641, 628, 1, 0, 0, 0, 642, 71, 1, 0, 0, 0, 643, 648, 3, 136, 68, 0, 644, 645, 5, 115, 0, 0, 645, 647, 3, 136, 68, 0, 646, 644, 1, 0, 0, 0, 647, 650, 1, 0, 0, 0, 648, 646, 1, 0, 0, 0, 648, 649, 1, 0, 0, 0, 649, 73, 1, 0, 0, 0, 650, 648, 1, 0, 0, 0, 651, 652, 5, 69, 0, 0, 652, 656, 5, 117, 0, 0, 653, 655, 3, 76, 38, 0, 654, 653, 1, 0, 0, 0, 655, 658, 1, 0, 0, 0, 656, 654, 1, 0, 0, 0, 656, 657, 1, 0, 0, 0, 657, 659, 1, 0, 0, 0, 658, 656, 1, 0, 0, 0, 659, 660, 5, 118, 0, 0, 660, 75, 1, 0, 0, 0, 661, 662, 5, 43, 0, 0, 662, 663, 3, 136, 68, 0, 663, 664, 5, 64, 0, 0, 664, 665, 3, 138, 69, 0, 665, 666, 5, 113, 0, 0, 666, 667, 3, 120, 60, 0, 667, 668, 3, 78, 39, 0, 668, 669, 5, 114, 0, 0, 669, 714, 1, 0, 0, 0, 670, 671, 5, 44, 0, 0, 671, 672, 3, 136, 68, 0, 672, 673, 5, 64, 0, 0, 673, 674, 3, 138, 69, 0, 674, 675, 5, 113, 0, 0, 675, 676, 3, 126, 63, 0, 676, 677, 3, 48, 24, 0, 677, 678, 3, 78, 39, 0, 678, 679, 5, 114, 0, 0, 679, 714, 1, 0, 0, 0, 680, 681, 5, 26, 0, 0, 681, 682, 3, 136, 68, 0, 682, 683, 5, 64, 0, 0, 683, 684, 3, 138, 69, 0, 684, 685, 5, 113, 0, 0, 685, 687, 3, 136, 68, 0, 686, 688, 3, 28, 14, 0, 687, 686, 1, 0, 0, 0, 687, 688, 1, 0, 0, 0, 688, 689, 1, 0, 0, 0, 689, 690, 5, 114, 0, 0, 690, 714, 1, 0, 0, 0, 691, 692, 5, 33, 0, 0, 692, 693, 3, 136, 68, 0, 693, 694, 5, 64, 0, 0, 694, 695, 3, 138, 69, 0, 695, 696, 5, 113, 0, 0, 696, 699, 3, 136, 68, 0, 697, 698, 5, 35, 0, 0, 698, 700, 3, 120, 60, 0, 699, 697, 1, 0, 0, 0, 699, 700, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 702, 5, 114, 0, 0, 702, 714, 1, 0, 0, 0, 703, 704, 5, 5, 0, 0, 704, 705, 3, 136, 68, 0, 705, 706, 5, 64, 0, 0, 706, 707, 3, 138, 69, 0, 707, 708, 5, 113, 0, 0, 708, 709, 3, 136, 68, 0, 709, 710, 5, 116, 0, 0, 710, 711, 3, 136, 68, 0, 711, 712, 5, 114, 0, 0, 712, 714, 1, 0, 0, 0, 713, 661, 1, 0, 0, 0, 713, 670, 1, 0, 0, 0, 713, 680, 1, 0, 0, 0, 713, 691, 1, 0, 0, 0, 713, 703, 1, 0, 0, 0, 714, 77, 1, 0, 0, 0, 715, 716, 5, 119, 0, 0, 716, 721, 3, 80, 40, 0, 717, 718, 5, 115, 0, 0, 718, 720, 3, 80, 40, 0, 719, 717, 1, 0, 0, 0, 720, 723, 1, 0, 0, 0, 721, 719, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 724, 1, 0, 0, 0, 723, 721, 1, 0, 0, 0, 724, 725, 5, 120, 0, 0, 725, 79, 1, 0, 0, 0, 726, 727, 7, 1, 0, 0, 727, 81, 1, 0, 0, 0, 728, 729, 5, 42, 0, 0, 729, 730, 3, 84, 42, 0, 730, 83, 1, 0, 0, 0, 731, 734, 3, 86, 43, 0, 732, 734, 3, 90, 45, 0, 733, 731, 1, 0, 0, 0, 733, 732, 1, 0, 0, 0, 734, 85, 1, 0, 0, 0, 735, 736, 5, 43, 0, 0, 736, 737, 3, 136, 68, 0, 737, 738, 5, 64, 0, 0, 738, 739, 3, 138, 69, 0, 739, 740, 5, 52, 0, 0, 740, 741, 3, 136, 68, 0, 741, 742, 5, 113, 0, 0, 742, 743, 3, 120, 60, 0, 743, 744, 5, 53, 0, 0, 744, 747, 3, 88, 44, 0, 745, 746, 5, 54, 0, 0, 746, 748, 3, 128, 64, 0, 747, 745, 1, 0, 0, 0, 747, 748, 1, 0, 0, 0, 748, 749, 1, 0, 0, 0, 749, 750, 5, 114, 0, 0, 750, 87, 1, 0, 0, 0, 751, 758, 5, 86, 0, 0, 752, 753, 5, 87, 0, 0, 753, 754, 5, 121, 0, 0, 754, 755, 3, 120, 60, 0, 755, 756, 5, 122, 0, 0, 756, 758, 1, 0, 0, 0, 757, 751, 1, 0, 0, 0, 757, 752, 1, 0, 0, 0, 758, 89, 1, 0, 0, 0, 759, 760, 5, 44, 0, 0, 760, 761, 3, 136, 68, 0, 761, 762, 5, 64, 0, 0, 762, 763, 3, 138, 69, 0, 763, 764, 5, 117, 0, 0, 764, 765, 3, 92, 46, 0, 765, 766, 3, 92, 46, 0, 766, 767, 5, 118, 0, 0, 767, 91, 1, 0, 0, 0, 768, 769, 3, 48, 24, 0, 769, 770, 5, 45, 0, 0, 770, 771, 3, 136, 68, 0, 771, 772, 5, 64, 0, 0, 772, 773, 3, 138, 69, 0, 773, 775, 3, 126, 63, 0, 774, 776, 5, 92, 0, 0, 775, 774, 1, 0, 0, 0, 775, 776, 1, 0, 0, 0, 776, 779, 1, 0, 0, 0, 777, 778, 5, 60, 0, 0, 778, 780, 3, 138, 69, 0, 779, 777, 1, 0, 0, 0, 779, 780, 1, 0, 0, 0, 780, 782, 1, 0, 0, 0, 781, 783, 5, 61, 0, 0, 782, 781, 1, 0, 0, 0, 782, 783, 1, 0, 0, 0, 783, 786, 1, 0, 0, 0, 784, 785, 5, 62, 0, 0, 785, 787, 3, 138, 69, 0, 786, 784, 1, 0, 0, 0, 786, 787, 1, 0, 0, 0, 787, 789, 1, 0, 0, 0, 788, 790, 5, 63, 0, 0, 789, 788, 1, 0, 0, 0, 789, 790, 1, 0, 0, 0, 790, 791, 1, 0, 0, 0, 791, 792, 5, 114, 0, 0, 792, 93, 1, 0, 0, 0, 793, 794, 5, 36, 0, 0, 794, 795, 3, 136, 68, 0, 795, 796, 5, 37, 0, 0, 796, 798, 3, 136, 68, 0, 797, 799, 3, 28, 14, 0, 798, 797, 1, 0, 0, 0, 798, 799, 1, 0, 0, 0, 799, 802, 1, 0, 0, 0, 800, 801, 5, 64, 0, 0, 801, 803, 3, 138, 69, 0, 802, 800, 1, 0, 0, 0, 802, 803, 1, 0, 0, 0, 803, 806, 1, 0, 0, 0, 804, 805, 5, 59, 0, 0, 805, 807, 5, 127, 0, 0, 806, 804, 1, 0, 0, 0, 806, 807, 1, 0, 0, 0, 807, 808, 1, 0, 0, 0, 808, 812, 5, 117, 0, 0, 809, 811, 3, 96, 48, 0, 810, 809, 1, 0, 0, 0, 811, 814, 1, 0, 0, 0, 812, 810, 1, 0, 0, 0, 812, 813, 1, 0, 0, 0, 813, 815, 1, 0, 0, 0, 814, 812, 1, 0, 0, 0, 815, 816, 5, 118, 0, 0, 816, 95, 1, 0, 0, 0, 817, 818, 5, 41, 0, 0, 818, 823, 3, 84, 42, 0, 819, 823, 3, 102, 51, 0, 820, 823, 3, 98, 49, 0, 821, 823, 3, 100, 50, 0, 822, 817, 1, 0, 0, 0, 822, 819, 1, 0, 0, 0, 822, 820, 1, 0, 0, 0, 822, 821, 1, 0, 0, 0, 823, 97, 1, 0, 0, 0, 824, 825, 5, 38, 0, 0, 825, 826, 3, 136, 68, 0, 826, 827, 5, 40, 0, 0, 827, 828, 5, 43, 0, 0, 828, 829, 3, 136, 68, 0, 829, 830, 5, 114, 0, 0, 830, 99, 1, 0, 0, 0, 831, 832, 5, 49, 0, 0, 832, 833, 3, 136, 68, 0, 833, 834, 5, 50, 0, 0, 834, 835, 5, 51, 0, 0, 835, 836, 5, 47, 0, 0, 836, 837, 5, 33, 0, 0, 837, 838, 3, 136, 68, 0, 838, 839, 5, 48, 0, 0, 839, 840, 5, 44, 0, 0, 840, 841, 3, 136, 68, 0, 841, 842, 5, 116, 0, 0, 842, 843, 3, 136, 68, 0, 843, 844, 5, 114, 0, 0, 844, 101, 1, 0, 0, 0, 845, 846, 5, 38, 0, 0, 846, 847, 3, 104, 52, 0, 847, 848, 5, 40, 0, 0, 848, 851, 3, 108, 54, 0, 849, 850, 5, 16, 0, 0, 850, 852, 3, 138, 69, 0, 851, 849, 1, 0, 0, 0, 851, 852, 1, 0, 0, 0, 852, 853, 1, 0, 0, 0, 853, 854, 5, 114, 0, 0, 854, 103, 1, 0, 0, 0, 855, 856, 3, 136, 68, 0, 856, 857, 5, 116, 0, 0, 857, 858, 3, 106, 53, 0, 858, 105, 1, 0, 0, 0, 859, 871, 3, 136, 68, 0, 860, 871, 5, 81, 0, 0, 861, 871, 5, 71, 0, 0, 862, 871, 5, 72, 0, 0, 863, 871, 5, 78, 0, 0, 864, 871, 5, 79, 0, 0, 865, 871, 5, 80, 0, 0, 866, 871, 5, 82, 0, 0, 867, 871, 5, 83, 0, 0, 868, 871, 5, 84, 0, 0, 869, 871, 5, 85, 0, 0, 870, 859, 1, 0, 0, 0, 870, 860, 1, 0, 0, 0, 870, 861, 1, 0, 0, 0, 870, 862, 1, 0, 0, 0, 870, 863, 1, 0, 0, 0, 870, 864, 1, 0, 0, 0, 870, 865, 1, 0, 0, 0, 870, 866, 1, 0, 0, 0, 870, 867, 1, 0, 0, 0, 870, 868, 1, 0, 0, 0, 870, 869, 1, 0, 0, 0, 871, 107, 1, 0, 0, 0, 872, 873, 5, 43, 0, 0, 873, 874, 3, 136, 68, 0, 874, 875, 5, 116, 0, 0, 875, 876, 3, 110, 55, 0, 876, 895, 1, 0, 0, 0, 877, 878, 5, 44, 0, 0, 878, 879, 3, 136, 68, 0, 879, 880, 5, 116, 0, 0, 880, 881, 3, 136, 68, 0, 881, 882, 5, 116, 0, 0, 882, 883, 3, 112, 56, 0, 883, 895, 1, 0, 0, 0, 884, 885, 5, 28, 0, 0, 885, 886, 3, 136, 68, 0, 886, 887, 5, 116, 0, 0, 887, 889, 3, 136, 68, 0, 888, 890, 3, 28, 14, 0, 889, 888, 1, 0, 0, 0, 889, 890, 1, 0, 0, 0, 890, 892, 1, 0, 0, 0, 891, 893, 3, 114, 57, 0, 892, 891, 1, 0, 0, 0, 892, 893, 1, 0, 0, 0, 893, 895, 1, 0, 0, 0, 894, 872, 1, 0, 0, 0, 894, 877, 1, 0, 0, 0, 894, 884, 1, 0, 0, 0, 895, 109, 1, 0, 0, 0, 896, 897, 7, 2, 0, 0, 897, 111, 1, 0, 0, 0, 898, 899, 7, 3, 0, 0, 899, 113, 1, 0, 0, 0, 900, 901, 5, 46, 0, 0, 901, 905, 5, 117, 0, 0, 902, 904, 3, 116, 58, 0, 903, 902, 1, 0, 0, 0, 904, 907, 1, 0, 0, 0, 905, 903, 1, 0, 0, 0, 905, 906, 1, 0, 0, 0, 906, 908, 1, 0, 0, 0, 907, 905, 1, 0, 0, 0, 908, 909, 5, 118, 0, 0, 909, 115, 1, 0, 0, 0, 910, 911, 3, 136, 68, 0, 911, 912, 5, 40, 0, 0, 912, 913, 5, 43, 0, 0, 913, 920, 3, 136, 68, 0, 914, 915, 5, 48, 0, 0, 915, 916, 5, 44, 0, 0, 916, 917, 3, 136, 68, 0, 917, 918, 5, 116, 0, 0, 918, 919, 3, 136, 68, 0, 919, 921, 1, 0, 0, 0, 920, 914, 1, 0, 0, 0, 920, 921, 1, 0, 0, 0, 921, 922, 1, 0, 0, 0, 922, 923, 5, 114, 0, 0, 923, 983, 1, 0, 0, 0, 924, 925, 3, 136, 68, 0, 925, 926, 5, 40, 0, 0, 926, 927, 5, 44, 0, 0, 927, 928, 3, 136, 68, 0, 928, 929, 5, 116, 0, 0, 929, 936, 3, 136, 68, 0, 930, 931, 5, 48, 0, 0, 931, 932, 5, 44, 0, 0, 932, 933, 3, 136, 68, 0, 933, 934, 5, 116, 0, 0, 934, 935, 3, 136, 68, 0, 935, 937, 1, 0, 0, 0, 936, 930, 1, 0, 0, 0, 936, 937, 1, 0, 0, 0, 937, 938, 1, 0, 0, 0, 938, 939, 5, 114, 0, 0, 939, 983, 1, 0, 0, 0, 940, 941, 3, 136, 68, 0, 941, 942, 5, 40, 0, 0, 942, 943, 5, 26, 0, 0, 943, 945, 3, 136, 68, 0, 944, 946, 3, 28, 14, 0, 945, 944, 1, 0, 0, 0, 945, 946, 1, 0, 0, 0, 946, 953, 1, 0, 0, 0, 947, 948, 5, 48, 0, 0, 948, 949, 5, 44, 0, 0, 949, 950, 3, 136, 68, 0, 950, 951, 5, 116, 0, 0, 951, 952, 3, 136, 68, 0, 952, 954, 1, 0, 0, 0, 953, 947, 1, 0, 0, 0, 953, 954, 1, 0, 0, 0, 954, 955, 1, 0, 0, 0, 955, 956, 5, 114, 0, 0, 956, 983, 1, 0, 0, 0, 957, 958, 3, 136, 68, 0, 958, 959, 5, 40, 0, 0, 959, 960, 5, 33, 0, 0, 960, 961, 3, 136, 68, 0, 961, 962, 5, 114, 0, 0, 962, 983, 1, 0, 0, 0, 963, 964, 3, 136, 68, 0, 964, 966, 5, 40, 0, 0, 965, 967, 5, 1, 0, 0, 966, 965, 1, 0, 0, 0, 966, 967, 1, 0, 0, 0, 967, 968, 1, 0, 0, 0, 968, 969, 5, 5, 0, 0, 969, 970, 3, 136, 68, 0, 970, 971, 5, 116, 0, 0, 971, 978, 3, 136, 68, 0, 972, 973, 5, 48, 0, 0, 973, 974, 5, 44, 0, 0, 974, 975, 3, 136, 68, 0, 975, 976, 5, 116, 0, 0, 976, 977, 3, 136, 68, 0, 977, 979, 1, 0, 0, 0, 978, 972, 1, 0, 0, 0, 978, 979, 1, 0, 0, 0, 979, 980, 1, 0, 0, 0, 980, 981, 5, 114, 0, 0, 981, 983, 1, 0, 0, 0, 982, 910, 1, 0, 0, 0, 982, 924, 1, 0, 0, 0, 982, 940, 1, 0, 0, 0, 982, 957, 1, 0, 0, 0, 982, 963, 1, 0, 0, 0, 983, 117, 1, 0, 0, 0, 984, 985, 5, 33, 0, 0, 985, 986, 3, 136, 68, 0, 986, 987, 5, 40, 0, 0, 987, 988, 3, 136, 68, 0, 988, 989, 5, 116, 0, 0, 989, 991, 3, 136, 68, 0, 990, 992, 3, 114, 57, 0, 991, 990, 1, 0, 0, 0, 991, 992, 1, 0, 0, 0, 992, 993, 1, 0, 0, 0, 993, 994, 5, 114, 0, 0, 994, 119, 1, 0, 0, 0, 995, 1042, 3, 124, 62, 0, 996, 1042, 5, 93, 0, 0, 997, 1042, 5, 94, 0, 0, 998, 999, 5, 95, 0, 0, 999, 1042, 3, 138, 69, 0, 1000, 1001, 5, 96, 0, 0, 1001, 1002, 5, 123, 0, 0, 1002, 1003, 3, 136, 68, 0, 1003, 1004, 5, 124, 0, 0, 1004, 1042, 1, 0, 0, 0, 1005, 1006, 5, 97, 0, 0, 1006, 1007, 5, 123, 0, 0, 1007, 1009, 3, 136, 68, 0, 1008, 1010, 3, 28, 14, 0, 1009, 1008, 1, 0, 0, 0, 1009, 1010, 1, 0, 0, 0, 1010, 1011, 1, 0, 0, 0, 1011, 1012, 5, 124, 0, 0, 1012, 1042, 1, 0, 0, 0, 1013, 1014, 5, 21, 0, 0, 1014, 1015, 5, 123, 0, 0, 1015, 1016, 3, 136, 68, 0, 1016, 1017, 5, 124, 0, 0, 1017, 1042, 1, 0, 0, 0, 1018, 1019, 5, 98, 0, 0, 1019, 1020, 5, 123, 0, 0, 1020, 1021, 3, 120, 60, 0, 1021, 1022, 5, 124, 0, 0, 1022, 1042, 1, 0, 0, 0, 1023, 1024, 5, 99, 0, 0, 1024, 1025, 5, 123, 0, 0, 1025, 1026, 3, 120, 60, 0, 1026, 1027, 5, 124, 0, 0, 1027, 1042, 1, 0, 0, 0, 1028, 1029, 5, 100, 0, 0, 1029, 1033, 5, 117, 0, 0, 1030, 1032, 3, 122, 61, 0, 1031, 1030, 1, 0, 0, 0, 1032, 1035, 1, 0, 0, 0, 1033, 1031, 1, 0, 0, 0, 1033, 1034, 1, 0, 0, 0, 1034, 1036, 1, 0, 0, 0, 1035, 1033, 1, 0, 0, 0, 1036, 1042, 5, 118, 0, 0, 1037, 1039, 3, 136, 68, 0, 1038, 1040, 3, 28, 14, 0, 1039, 1038, 1, 0, 0, 0, 1039, 1040, 1, 0, 0, 0, 1040, 1042, 1, 0, 0, 0, 1041, 995, 1, 0, 0, 0, 1041, 996, 1, 0, 0, 0, 1041, 997, 1, 0, 0, 0, 1041, 998, 1, 0, 0, 0, 1041, 1000, 1, 0, 0, 0, 1041, 1005, 1, 0, 0, 0, 1041, 1013, 1, 0, 0, 0, 1041, 1018, 1, 0, 0, 0, 1041, 1023, 1, 0, 0, 0, 1041, 1028, 1, 0, 0, 0, 1041, 1037, 1, 0, 0, 0, 1042, 121, 1, 0, 0, 0, 1043, 1044, 3, 136, 68, 0, 1044, 1045, 5, 113, 0, 0, 1045, 1046, 3, 120, 60, 0, 1046, 1047, 5, 114, 0, 0, 1047, 123, 1, 0, 0, 0, 1048, 1049, 7, 4, 0, 0, 1049, 125, 1, 0, 0, 0, 1050, 1051, 7, 5, 0, 0, 1051, 127, 1, 0, 0, 0, 1052, 1061, 3, 138, 69, 0, 1053, 1061, 5, 127, 0, 0, 1054, 1061, 5, 128, 0, 0, 1055, 1061, 5, 109, 0, 0, 1056, 1061, 5, 110, 0, 0, 1057, 1061, 5, 111, 0, 0, 1058, 1061, 3, 130, 65, 0, 1059, 1061, 3, 134, 67, 0, 1060, 1052, 1, 0, 0, 0, 1060, 1053, 1, 0, 0, 0, 1060, 1054, 1, 0, 0, 0, 1060, 1055, 1, 0, 0, 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, 129, 1, 0, 0, 0, 1062, 1071, 5, 117, 0, 0, 1063, 1068, 3, 132, 66, 0, 1064, 1065, 5, 115, 0, 0, 1065, 1067, 3, 132, 66, 0, 1066, 1064, 1, 0, 0, 0, 1067, 1070, 1, 0, 0, 0, 1068, 1066, 1, 0, 0, 0, 1068, 1069, 1, 0, 0, 0, 1069, 1072, 1, 0, 0, 0, 1070, 1068, 1, 0, 0, 0, 1071, 1063, 1, 0, 0, 0, 1071, 1072, 1, 0, 0, 0, 1072, 1073, 1, 0, 0, 0, 1073, 1074, 5, 118, 0, 0, 1074, 131, 1, 0, 0, 0, 1075, 1076, 3, 138, 69, 0, 1076, 1077, 5, 113, 0, 0, 1077, 1078, 3, 128, 64, 0, 1078, 133, 1, 0, 0, 0, 1079, 1088, 5, 119, 0, 0, 1080, 1085, 3, 128, 64, 0, 1081, 1082, 5, 115, 0, 0, 1082, 1084, 3, 128, 64, 0, 1083, 1081, 1, 0, 0, 0, 1084, 1087, 1, 0, 0, 0, 1085, 1083, 1, 0, 0, 0, 1085, 1086, 1, 0, 0, 0, 1086, 1089, 1, 0, 0, 0, 1087, 1085, 1, 0, 0, 0, 1088, 1080, 1, 0, 0, 0, 1088, 1089, 1, 0, 0, 0, 1089, 1090, 1, 0, 0, 0, 1090, 1091, 5, 120, 0, 0, 1091, 135, 1, 0, 0, 0, 1092, 1093, 7, 6, 0, 0, 1093, 137, 1, 0, 0, 0, 1094, 1095, 5, 130, 0, 0, 1095, 139, 1, 0, 0, 0, 94, 152, 159, 180, 192, 204, 224, 232, 239, 245, 257, 260, 266, 277, 286, 296, 299, 301, 305, 313, 325, 330, 339, 342, 360, 372, 396, 399, 409, 413, 419, 426, 452, 459, 463, 468, 479, 485, 495, 500, 506, 517, 537, 564, 569, 580, 585, 592, 601, 614, 635, 638, 641, 648, 656, 687, 699, 713, 721, 733, 747, 757, 775, 779, 782, 786, 789, 798, 802, 806, 812, 822, 851, 870, 889, 892, 894, 905, 920, 936, 945, 953, 966, 978, 982, 991, 1009, 1033, 1039, 1041, 1060, 1068, 1071, 1085, 1088] \ No newline at end of file +[4, 1, 133, 1105, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 153, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 158, 8, 1, 10, 1, 12, 1, 161, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 179, 8, 3, 10, 3, 12, 3, 182, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 193, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 205, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 225, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 233, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 238, 8, 10, 10, 10, 12, 10, 241, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 246, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 256, 8, 10, 10, 10, 12, 10, 259, 9, 10, 3, 10, 261, 8, 10, 1, 10, 1, 10, 5, 10, 265, 8, 10, 10, 10, 12, 10, 268, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 276, 8, 11, 10, 11, 12, 11, 279, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 287, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 295, 8, 12, 10, 12, 12, 12, 298, 9, 12, 3, 12, 300, 8, 12, 3, 12, 302, 8, 12, 1, 13, 1, 13, 3, 13, 306, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 312, 8, 14, 10, 14, 12, 14, 315, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 326, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 331, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 340, 8, 17, 1, 18, 3, 18, 343, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 3, 19, 361, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 371, 8, 19, 10, 19, 12, 19, 374, 9, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 397, 8, 20, 1, 21, 3, 21, 400, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 410, 8, 21, 1, 21, 1, 21, 3, 21, 414, 8, 21, 1, 21, 1, 21, 5, 21, 418, 8, 21, 10, 21, 12, 21, 421, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 427, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 453, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 460, 8, 24, 1, 24, 1, 24, 3, 24, 464, 8, 24, 1, 25, 5, 25, 467, 8, 25, 10, 25, 12, 25, 470, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 480, 8, 25, 1, 25, 1, 25, 5, 25, 484, 8, 25, 10, 25, 12, 25, 487, 9, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 496, 8, 26, 1, 27, 1, 27, 1, 27, 3, 27, 501, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 507, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 516, 8, 27, 10, 27, 12, 27, 519, 9, 27, 1, 27, 1, 27, 1, 28, 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, 3, 29, 538, 8, 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, 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, 3, 29, 565, 8, 29, 1, 30, 1, 30, 1, 30, 3, 30, 570, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 581, 8, 30, 1, 30, 1, 30, 1, 30, 3, 30, 586, 8, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 3, 31, 593, 8, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 602, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 615, 8, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 634, 8, 35, 10, 35, 12, 35, 637, 9, 35, 3, 35, 639, 8, 35, 1, 35, 3, 35, 642, 8, 35, 1, 36, 1, 36, 1, 36, 5, 36, 647, 8, 36, 10, 36, 12, 36, 650, 9, 36, 1, 37, 1, 37, 1, 37, 5, 37, 655, 8, 37, 10, 37, 12, 37, 658, 9, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 688, 8, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 700, 8, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 714, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 720, 8, 39, 10, 39, 12, 39, 723, 9, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 3, 42, 734, 8, 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, 3, 43, 748, 8, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 758, 8, 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, 46, 1, 46, 1, 46, 1, 46, 3, 46, 776, 8, 46, 1, 46, 1, 46, 3, 46, 780, 8, 46, 1, 46, 3, 46, 783, 8, 46, 1, 46, 1, 46, 3, 46, 787, 8, 46, 1, 46, 3, 46, 790, 8, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 799, 8, 47, 1, 47, 1, 47, 3, 47, 803, 8, 47, 1, 47, 1, 47, 3, 47, 807, 8, 47, 1, 47, 1, 47, 5, 47, 811, 8, 47, 10, 47, 12, 47, 814, 9, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 823, 8, 48, 1, 49, 1, 49, 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, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 852, 8, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 871, 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, 1, 54, 1, 54, 1, 54, 3, 54, 888, 8, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 898, 8, 54, 1, 54, 3, 54, 901, 8, 54, 3, 54, 903, 8, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 5, 57, 912, 8, 57, 10, 57, 12, 57, 915, 9, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 929, 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, 945, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 954, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 962, 8, 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, 975, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 987, 8, 58, 1, 58, 1, 58, 3, 58, 991, 8, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1000, 8, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1018, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 1040, 8, 60, 10, 60, 12, 60, 1043, 9, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1048, 8, 60, 3, 60, 1050, 8, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1069, 8, 64, 1, 65, 1, 65, 1, 65, 1, 65, 5, 65, 1075, 8, 65, 10, 65, 12, 65, 1078, 9, 65, 3, 65, 1080, 8, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 5, 67, 1092, 8, 67, 10, 67, 12, 67, 1095, 9, 67, 3, 67, 1097, 8, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 0, 0, 70, 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, 0, 7, 1, 0, 81, 85, 2, 0, 76, 80, 82, 83, 2, 0, 76, 77, 82, 83, 2, 0, 78, 80, 82, 83, 1, 0, 101, 108, 1, 0, 88, 91, 3, 0, 2, 15, 55, 55, 129, 129, 1188, 0, 152, 1, 0, 0, 0, 2, 154, 1, 0, 0, 0, 4, 164, 1, 0, 0, 0, 6, 168, 1, 0, 0, 0, 8, 192, 1, 0, 0, 0, 10, 204, 1, 0, 0, 0, 12, 206, 1, 0, 0, 0, 14, 213, 1, 0, 0, 0, 16, 224, 1, 0, 0, 0, 18, 226, 1, 0, 0, 0, 20, 239, 1, 0, 0, 0, 22, 271, 1, 0, 0, 0, 24, 301, 1, 0, 0, 0, 26, 303, 1, 0, 0, 0, 28, 307, 1, 0, 0, 0, 30, 325, 1, 0, 0, 0, 32, 327, 1, 0, 0, 0, 34, 339, 1, 0, 0, 0, 36, 342, 1, 0, 0, 0, 38, 360, 1, 0, 0, 0, 40, 396, 1, 0, 0, 0, 42, 399, 1, 0, 0, 0, 44, 424, 1, 0, 0, 0, 46, 452, 1, 0, 0, 0, 48, 463, 1, 0, 0, 0, 50, 468, 1, 0, 0, 0, 52, 495, 1, 0, 0, 0, 54, 497, 1, 0, 0, 0, 56, 522, 1, 0, 0, 0, 58, 564, 1, 0, 0, 0, 60, 566, 1, 0, 0, 0, 62, 589, 1, 0, 0, 0, 64, 605, 1, 0, 0, 0, 66, 618, 1, 0, 0, 0, 68, 621, 1, 0, 0, 0, 70, 641, 1, 0, 0, 0, 72, 643, 1, 0, 0, 0, 74, 651, 1, 0, 0, 0, 76, 713, 1, 0, 0, 0, 78, 715, 1, 0, 0, 0, 80, 726, 1, 0, 0, 0, 82, 728, 1, 0, 0, 0, 84, 733, 1, 0, 0, 0, 86, 735, 1, 0, 0, 0, 88, 757, 1, 0, 0, 0, 90, 759, 1, 0, 0, 0, 92, 768, 1, 0, 0, 0, 94, 793, 1, 0, 0, 0, 96, 822, 1, 0, 0, 0, 98, 824, 1, 0, 0, 0, 100, 831, 1, 0, 0, 0, 102, 845, 1, 0, 0, 0, 104, 855, 1, 0, 0, 0, 106, 870, 1, 0, 0, 0, 108, 902, 1, 0, 0, 0, 110, 904, 1, 0, 0, 0, 112, 906, 1, 0, 0, 0, 114, 908, 1, 0, 0, 0, 116, 990, 1, 0, 0, 0, 118, 992, 1, 0, 0, 0, 120, 1049, 1, 0, 0, 0, 122, 1051, 1, 0, 0, 0, 124, 1056, 1, 0, 0, 0, 126, 1058, 1, 0, 0, 0, 128, 1068, 1, 0, 0, 0, 130, 1070, 1, 0, 0, 0, 132, 1083, 1, 0, 0, 0, 134, 1087, 1, 0, 0, 0, 136, 1100, 1, 0, 0, 0, 138, 1102, 1, 0, 0, 0, 140, 141, 3, 6, 3, 0, 141, 142, 5, 0, 0, 1, 142, 153, 1, 0, 0, 0, 143, 144, 3, 20, 10, 0, 144, 145, 5, 0, 0, 1, 145, 153, 1, 0, 0, 0, 146, 147, 3, 50, 25, 0, 147, 148, 5, 0, 0, 1, 148, 153, 1, 0, 0, 0, 149, 150, 3, 2, 1, 0, 150, 151, 5, 0, 0, 1, 151, 153, 1, 0, 0, 0, 152, 140, 1, 0, 0, 0, 152, 143, 1, 0, 0, 0, 152, 146, 1, 0, 0, 0, 152, 149, 1, 0, 0, 0, 153, 1, 1, 0, 0, 0, 154, 155, 5, 22, 0, 0, 155, 159, 5, 117, 0, 0, 156, 158, 3, 8, 4, 0, 157, 156, 1, 0, 0, 0, 158, 161, 1, 0, 0, 0, 159, 157, 1, 0, 0, 0, 159, 160, 1, 0, 0, 0, 160, 162, 1, 0, 0, 0, 161, 159, 1, 0, 0, 0, 162, 163, 5, 118, 0, 0, 163, 3, 1, 0, 0, 0, 164, 165, 5, 23, 0, 0, 165, 166, 3, 138, 69, 0, 166, 167, 5, 114, 0, 0, 167, 5, 1, 0, 0, 0, 168, 169, 5, 1, 0, 0, 169, 170, 3, 136, 68, 0, 170, 171, 5, 64, 0, 0, 171, 172, 3, 138, 69, 0, 172, 173, 5, 58, 0, 0, 173, 174, 3, 138, 69, 0, 174, 175, 5, 57, 0, 0, 175, 176, 3, 138, 69, 0, 176, 180, 5, 117, 0, 0, 177, 179, 3, 8, 4, 0, 178, 177, 1, 0, 0, 0, 179, 182, 1, 0, 0, 0, 180, 178, 1, 0, 0, 0, 180, 181, 1, 0, 0, 0, 181, 183, 1, 0, 0, 0, 182, 180, 1, 0, 0, 0, 183, 184, 5, 118, 0, 0, 184, 7, 1, 0, 0, 0, 185, 193, 3, 4, 2, 0, 186, 193, 3, 18, 9, 0, 187, 193, 3, 10, 5, 0, 188, 193, 3, 82, 41, 0, 189, 193, 3, 94, 47, 0, 190, 193, 3, 118, 59, 0, 191, 193, 3, 32, 16, 0, 192, 185, 1, 0, 0, 0, 192, 186, 1, 0, 0, 0, 192, 187, 1, 0, 0, 0, 192, 188, 1, 0, 0, 0, 192, 189, 1, 0, 0, 0, 192, 190, 1, 0, 0, 0, 192, 191, 1, 0, 0, 0, 193, 9, 1, 0, 0, 0, 194, 195, 5, 23, 0, 0, 195, 196, 5, 26, 0, 0, 196, 197, 3, 136, 68, 0, 197, 198, 5, 114, 0, 0, 198, 205, 1, 0, 0, 0, 199, 200, 5, 23, 0, 0, 200, 201, 5, 28, 0, 0, 201, 202, 3, 136, 68, 0, 202, 203, 5, 114, 0, 0, 203, 205, 1, 0, 0, 0, 204, 194, 1, 0, 0, 0, 204, 199, 1, 0, 0, 0, 205, 11, 1, 0, 0, 0, 206, 207, 5, 24, 0, 0, 207, 208, 5, 25, 0, 0, 208, 209, 3, 136, 68, 0, 209, 210, 5, 64, 0, 0, 210, 211, 3, 138, 69, 0, 211, 212, 5, 114, 0, 0, 212, 13, 1, 0, 0, 0, 213, 214, 5, 24, 0, 0, 214, 215, 5, 26, 0, 0, 215, 216, 3, 136, 68, 0, 216, 217, 5, 58, 0, 0, 217, 218, 3, 138, 69, 0, 218, 219, 5, 114, 0, 0, 219, 15, 1, 0, 0, 0, 220, 225, 3, 10, 5, 0, 221, 225, 3, 12, 6, 0, 222, 225, 3, 14, 7, 0, 223, 225, 3, 32, 16, 0, 224, 220, 1, 0, 0, 0, 224, 221, 1, 0, 0, 0, 224, 222, 1, 0, 0, 0, 224, 223, 1, 0, 0, 0, 225, 17, 1, 0, 0, 0, 226, 227, 5, 25, 0, 0, 227, 228, 3, 136, 68, 0, 228, 229, 5, 64, 0, 0, 229, 232, 3, 138, 69, 0, 230, 231, 5, 65, 0, 0, 231, 233, 3, 138, 69, 0, 232, 230, 1, 0, 0, 0, 232, 233, 1, 0, 0, 0, 233, 234, 1, 0, 0, 0, 234, 235, 5, 114, 0, 0, 235, 19, 1, 0, 0, 0, 236, 238, 3, 16, 8, 0, 237, 236, 1, 0, 0, 0, 238, 241, 1, 0, 0, 0, 239, 237, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 242, 1, 0, 0, 0, 241, 239, 1, 0, 0, 0, 242, 243, 5, 26, 0, 0, 243, 245, 3, 136, 68, 0, 244, 246, 3, 22, 11, 0, 245, 244, 1, 0, 0, 0, 245, 246, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 247, 248, 5, 64, 0, 0, 248, 249, 3, 138, 69, 0, 249, 250, 5, 58, 0, 0, 250, 260, 3, 138, 69, 0, 251, 252, 5, 69, 0, 0, 252, 257, 3, 26, 13, 0, 253, 254, 5, 115, 0, 0, 254, 256, 3, 26, 13, 0, 255, 253, 1, 0, 0, 0, 256, 259, 1, 0, 0, 0, 257, 255, 1, 0, 0, 0, 257, 258, 1, 0, 0, 0, 258, 261, 1, 0, 0, 0, 259, 257, 1, 0, 0, 0, 260, 251, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 266, 5, 117, 0, 0, 263, 265, 3, 34, 17, 0, 264, 263, 1, 0, 0, 0, 265, 268, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 269, 1, 0, 0, 0, 268, 266, 1, 0, 0, 0, 269, 270, 5, 118, 0, 0, 270, 21, 1, 0, 0, 0, 271, 272, 5, 123, 0, 0, 272, 277, 3, 24, 12, 0, 273, 274, 5, 115, 0, 0, 274, 276, 3, 24, 12, 0, 275, 273, 1, 0, 0, 0, 276, 279, 1, 0, 0, 0, 277, 275, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 280, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 280, 281, 5, 124, 0, 0, 281, 23, 1, 0, 0, 0, 282, 283, 5, 29, 0, 0, 283, 286, 3, 136, 68, 0, 284, 285, 5, 113, 0, 0, 285, 287, 5, 19, 0, 0, 286, 284, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 302, 1, 0, 0, 0, 288, 289, 5, 18, 0, 0, 289, 299, 3, 136, 68, 0, 290, 291, 5, 20, 0, 0, 291, 296, 3, 26, 13, 0, 292, 293, 5, 125, 0, 0, 293, 295, 3, 26, 13, 0, 294, 292, 1, 0, 0, 0, 295, 298, 1, 0, 0, 0, 296, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 300, 1, 0, 0, 0, 298, 296, 1, 0, 0, 0, 299, 290, 1, 0, 0, 0, 299, 300, 1, 0, 0, 0, 300, 302, 1, 0, 0, 0, 301, 282, 1, 0, 0, 0, 301, 288, 1, 0, 0, 0, 302, 25, 1, 0, 0, 0, 303, 305, 3, 136, 68, 0, 304, 306, 3, 28, 14, 0, 305, 304, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 27, 1, 0, 0, 0, 307, 308, 5, 123, 0, 0, 308, 313, 3, 30, 15, 0, 309, 310, 5, 115, 0, 0, 310, 312, 3, 30, 15, 0, 311, 309, 1, 0, 0, 0, 312, 315, 1, 0, 0, 0, 313, 311, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 316, 1, 0, 0, 0, 315, 313, 1, 0, 0, 0, 316, 317, 5, 124, 0, 0, 317, 29, 1, 0, 0, 0, 318, 319, 5, 25, 0, 0, 319, 326, 3, 136, 68, 0, 320, 321, 5, 26, 0, 0, 321, 326, 3, 26, 13, 0, 322, 323, 5, 18, 0, 0, 323, 326, 3, 136, 68, 0, 324, 326, 3, 120, 60, 0, 325, 318, 1, 0, 0, 0, 325, 320, 1, 0, 0, 0, 325, 322, 1, 0, 0, 0, 325, 324, 1, 0, 0, 0, 326, 31, 1, 0, 0, 0, 327, 328, 5, 17, 0, 0, 328, 330, 3, 136, 68, 0, 329, 331, 3, 22, 11, 0, 330, 329, 1, 0, 0, 0, 330, 331, 1, 0, 0, 0, 331, 332, 1, 0, 0, 0, 332, 333, 5, 126, 0, 0, 333, 334, 3, 120, 60, 0, 334, 335, 5, 114, 0, 0, 335, 33, 1, 0, 0, 0, 336, 340, 3, 38, 19, 0, 337, 340, 3, 42, 21, 0, 338, 340, 3, 36, 18, 0, 339, 336, 1, 0, 0, 0, 339, 337, 1, 0, 0, 0, 339, 338, 1, 0, 0, 0, 340, 35, 1, 0, 0, 0, 341, 343, 5, 39, 0, 0, 342, 341, 1, 0, 0, 0, 342, 343, 1, 0, 0, 0, 343, 344, 1, 0, 0, 0, 344, 345, 5, 31, 0, 0, 345, 346, 3, 136, 68, 0, 346, 347, 5, 64, 0, 0, 347, 348, 3, 138, 69, 0, 348, 349, 5, 113, 0, 0, 349, 350, 3, 120, 60, 0, 350, 351, 5, 112, 0, 0, 351, 352, 3, 120, 60, 0, 352, 353, 5, 117, 0, 0, 353, 354, 5, 81, 0, 0, 354, 355, 5, 64, 0, 0, 355, 356, 3, 138, 69, 0, 356, 357, 5, 114, 0, 0, 357, 358, 5, 118, 0, 0, 358, 37, 1, 0, 0, 0, 359, 361, 3, 44, 22, 0, 360, 359, 1, 0, 0, 0, 360, 361, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 363, 5, 29, 0, 0, 363, 364, 3, 136, 68, 0, 364, 365, 5, 64, 0, 0, 365, 366, 3, 138, 69, 0, 366, 367, 5, 113, 0, 0, 367, 368, 3, 120, 60, 0, 368, 372, 5, 117, 0, 0, 369, 371, 3, 40, 20, 0, 370, 369, 1, 0, 0, 0, 371, 374, 1, 0, 0, 0, 372, 370, 1, 0, 0, 0, 372, 373, 1, 0, 0, 0, 373, 375, 1, 0, 0, 0, 374, 372, 1, 0, 0, 0, 375, 376, 5, 118, 0, 0, 376, 39, 1, 0, 0, 0, 377, 378, 5, 71, 0, 0, 378, 379, 5, 64, 0, 0, 379, 380, 3, 138, 69, 0, 380, 381, 5, 114, 0, 0, 381, 397, 1, 0, 0, 0, 382, 383, 5, 72, 0, 0, 383, 384, 5, 64, 0, 0, 384, 385, 3, 138, 69, 0, 385, 386, 5, 114, 0, 0, 386, 397, 1, 0, 0, 0, 387, 388, 5, 73, 0, 0, 388, 389, 5, 74, 0, 0, 389, 390, 5, 64, 0, 0, 390, 391, 3, 138, 69, 0, 391, 392, 5, 75, 0, 0, 392, 393, 5, 64, 0, 0, 393, 394, 3, 138, 69, 0, 394, 395, 5, 114, 0, 0, 395, 397, 1, 0, 0, 0, 396, 377, 1, 0, 0, 0, 396, 382, 1, 0, 0, 0, 396, 387, 1, 0, 0, 0, 397, 41, 1, 0, 0, 0, 398, 400, 3, 44, 22, 0, 399, 398, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 402, 5, 30, 0, 0, 402, 403, 3, 136, 68, 0, 403, 404, 5, 64, 0, 0, 404, 405, 3, 138, 69, 0, 405, 406, 5, 113, 0, 0, 406, 407, 3, 126, 63, 0, 407, 409, 3, 48, 24, 0, 408, 410, 5, 92, 0, 0, 409, 408, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 413, 1, 0, 0, 0, 411, 412, 5, 62, 0, 0, 412, 414, 3, 138, 69, 0, 413, 411, 1, 0, 0, 0, 413, 414, 1, 0, 0, 0, 414, 415, 1, 0, 0, 0, 415, 419, 5, 117, 0, 0, 416, 418, 3, 46, 23, 0, 417, 416, 1, 0, 0, 0, 418, 421, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 419, 1, 0, 0, 0, 422, 423, 5, 118, 0, 0, 423, 43, 1, 0, 0, 0, 424, 426, 5, 14, 0, 0, 425, 427, 5, 15, 0, 0, 426, 425, 1, 0, 0, 0, 426, 427, 1, 0, 0, 0, 427, 45, 1, 0, 0, 0, 428, 429, 5, 78, 0, 0, 429, 430, 5, 64, 0, 0, 430, 431, 3, 138, 69, 0, 431, 432, 5, 114, 0, 0, 432, 453, 1, 0, 0, 0, 433, 434, 5, 79, 0, 0, 434, 435, 5, 64, 0, 0, 435, 436, 3, 138, 69, 0, 436, 437, 5, 114, 0, 0, 437, 453, 1, 0, 0, 0, 438, 439, 5, 80, 0, 0, 439, 440, 5, 64, 0, 0, 440, 441, 3, 138, 69, 0, 441, 442, 5, 114, 0, 0, 442, 453, 1, 0, 0, 0, 443, 444, 5, 73, 0, 0, 444, 445, 5, 74, 0, 0, 445, 446, 5, 64, 0, 0, 446, 447, 3, 138, 69, 0, 447, 448, 5, 75, 0, 0, 448, 449, 5, 64, 0, 0, 449, 450, 3, 138, 69, 0, 450, 451, 5, 114, 0, 0, 451, 453, 1, 0, 0, 0, 452, 428, 1, 0, 0, 0, 452, 433, 1, 0, 0, 0, 452, 438, 1, 0, 0, 0, 452, 443, 1, 0, 0, 0, 453, 47, 1, 0, 0, 0, 454, 455, 5, 25, 0, 0, 455, 464, 3, 136, 68, 0, 456, 457, 5, 26, 0, 0, 457, 459, 3, 136, 68, 0, 458, 460, 3, 28, 14, 0, 459, 458, 1, 0, 0, 0, 459, 460, 1, 0, 0, 0, 460, 464, 1, 0, 0, 0, 461, 462, 5, 18, 0, 0, 462, 464, 3, 136, 68, 0, 463, 454, 1, 0, 0, 0, 463, 456, 1, 0, 0, 0, 463, 461, 1, 0, 0, 0, 464, 49, 1, 0, 0, 0, 465, 467, 3, 16, 8, 0, 466, 465, 1, 0, 0, 0, 467, 470, 1, 0, 0, 0, 468, 466, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 471, 1, 0, 0, 0, 470, 468, 1, 0, 0, 0, 471, 472, 5, 28, 0, 0, 472, 473, 3, 136, 68, 0, 473, 474, 5, 64, 0, 0, 474, 475, 3, 138, 69, 0, 475, 476, 5, 58, 0, 0, 476, 479, 3, 138, 69, 0, 477, 478, 5, 59, 0, 0, 478, 480, 5, 127, 0, 0, 479, 477, 1, 0, 0, 0, 479, 480, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 485, 5, 117, 0, 0, 482, 484, 3, 52, 26, 0, 483, 482, 1, 0, 0, 0, 484, 487, 1, 0, 0, 0, 485, 483, 1, 0, 0, 0, 485, 486, 1, 0, 0, 0, 486, 488, 1, 0, 0, 0, 487, 485, 1, 0, 0, 0, 488, 489, 5, 118, 0, 0, 489, 51, 1, 0, 0, 0, 490, 496, 3, 60, 30, 0, 491, 496, 3, 62, 31, 0, 492, 496, 3, 64, 32, 0, 493, 496, 3, 54, 27, 0, 494, 496, 3, 56, 28, 0, 495, 490, 1, 0, 0, 0, 495, 491, 1, 0, 0, 0, 495, 492, 1, 0, 0, 0, 495, 493, 1, 0, 0, 0, 495, 494, 1, 0, 0, 0, 496, 53, 1, 0, 0, 0, 497, 498, 5, 5, 0, 0, 498, 500, 3, 136, 68, 0, 499, 501, 3, 22, 11, 0, 500, 499, 1, 0, 0, 0, 500, 501, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 5, 64, 0, 0, 503, 504, 3, 138, 69, 0, 504, 506, 5, 7, 0, 0, 505, 507, 5, 1, 0, 0, 506, 505, 1, 0, 0, 0, 506, 507, 1, 0, 0, 0, 507, 508, 1, 0, 0, 0, 508, 509, 3, 26, 13, 0, 509, 510, 5, 8, 0, 0, 510, 511, 3, 138, 69, 0, 511, 512, 5, 31, 0, 0, 512, 513, 3, 138, 69, 0, 513, 517, 5, 117, 0, 0, 514, 516, 3, 58, 29, 0, 515, 514, 1, 0, 0, 0, 516, 519, 1, 0, 0, 0, 517, 515, 1, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 520, 1, 0, 0, 0, 519, 517, 1, 0, 0, 0, 520, 521, 5, 118, 0, 0, 521, 55, 1, 0, 0, 0, 522, 523, 5, 5, 0, 0, 523, 524, 3, 136, 68, 0, 524, 525, 5, 64, 0, 0, 525, 526, 3, 138, 69, 0, 526, 527, 5, 6, 0, 0, 527, 528, 3, 136, 68, 0, 528, 529, 3, 28, 14, 0, 529, 530, 5, 114, 0, 0, 530, 57, 1, 0, 0, 0, 531, 532, 5, 9, 0, 0, 532, 533, 3, 138, 69, 0, 533, 534, 5, 114, 0, 0, 534, 565, 1, 0, 0, 0, 535, 537, 5, 10, 0, 0, 536, 538, 5, 18, 0, 0, 537, 536, 1, 0, 0, 0, 537, 538, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 540, 3, 136, 68, 0, 540, 541, 5, 37, 0, 0, 541, 542, 3, 26, 13, 0, 542, 543, 5, 114, 0, 0, 543, 565, 1, 0, 0, 0, 544, 545, 5, 11, 0, 0, 545, 546, 3, 136, 68, 0, 546, 547, 5, 127, 0, 0, 547, 548, 5, 114, 0, 0, 548, 565, 1, 0, 0, 0, 549, 550, 5, 12, 0, 0, 550, 551, 3, 26, 13, 0, 551, 552, 5, 116, 0, 0, 552, 553, 3, 136, 68, 0, 553, 554, 3, 136, 68, 0, 554, 555, 3, 138, 69, 0, 555, 556, 5, 114, 0, 0, 556, 565, 1, 0, 0, 0, 557, 558, 5, 73, 0, 0, 558, 565, 5, 114, 0, 0, 559, 560, 5, 13, 0, 0, 560, 561, 5, 127, 0, 0, 561, 562, 3, 138, 69, 0, 562, 563, 5, 114, 0, 0, 563, 565, 1, 0, 0, 0, 564, 531, 1, 0, 0, 0, 564, 535, 1, 0, 0, 0, 564, 544, 1, 0, 0, 0, 564, 549, 1, 0, 0, 0, 564, 557, 1, 0, 0, 0, 564, 559, 1, 0, 0, 0, 565, 59, 1, 0, 0, 0, 566, 567, 5, 31, 0, 0, 567, 569, 3, 136, 68, 0, 568, 570, 3, 22, 11, 0, 569, 568, 1, 0, 0, 0, 569, 570, 1, 0, 0, 0, 570, 571, 1, 0, 0, 0, 571, 572, 5, 64, 0, 0, 572, 573, 3, 138, 69, 0, 573, 574, 5, 113, 0, 0, 574, 575, 3, 120, 60, 0, 575, 576, 5, 112, 0, 0, 576, 577, 3, 120, 60, 0, 577, 578, 5, 66, 0, 0, 578, 580, 3, 68, 34, 0, 579, 581, 3, 66, 33, 0, 580, 579, 1, 0, 0, 0, 580, 581, 1, 0, 0, 0, 581, 582, 1, 0, 0, 0, 582, 583, 5, 68, 0, 0, 583, 585, 3, 70, 35, 0, 584, 586, 3, 74, 37, 0, 585, 584, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 587, 1, 0, 0, 0, 587, 588, 5, 114, 0, 0, 588, 61, 1, 0, 0, 0, 589, 590, 5, 32, 0, 0, 590, 592, 3, 136, 68, 0, 591, 593, 3, 22, 11, 0, 592, 591, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 595, 5, 64, 0, 0, 595, 596, 3, 138, 69, 0, 596, 597, 5, 113, 0, 0, 597, 598, 3, 120, 60, 0, 598, 599, 5, 112, 0, 0, 599, 601, 3, 120, 60, 0, 600, 602, 3, 74, 37, 0, 601, 600, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 604, 5, 114, 0, 0, 604, 63, 1, 0, 0, 0, 605, 606, 5, 33, 0, 0, 606, 607, 3, 136, 68, 0, 607, 608, 5, 64, 0, 0, 608, 609, 3, 138, 69, 0, 609, 610, 5, 34, 0, 0, 610, 611, 3, 136, 68, 0, 611, 612, 5, 113, 0, 0, 612, 614, 3, 120, 60, 0, 613, 615, 3, 74, 37, 0, 614, 613, 1, 0, 0, 0, 614, 615, 1, 0, 0, 0, 615, 616, 1, 0, 0, 0, 616, 617, 5, 114, 0, 0, 617, 65, 1, 0, 0, 0, 618, 619, 5, 67, 0, 0, 619, 620, 3, 120, 60, 0, 620, 67, 1, 0, 0, 0, 621, 622, 7, 0, 0, 0, 622, 69, 1, 0, 0, 0, 623, 642, 5, 70, 0, 0, 624, 625, 5, 25, 0, 0, 625, 642, 3, 136, 68, 0, 626, 627, 5, 18, 0, 0, 627, 642, 3, 136, 68, 0, 628, 629, 5, 27, 0, 0, 629, 638, 5, 119, 0, 0, 630, 635, 3, 26, 13, 0, 631, 632, 5, 115, 0, 0, 632, 634, 3, 26, 13, 0, 633, 631, 1, 0, 0, 0, 634, 637, 1, 0, 0, 0, 635, 633, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 639, 1, 0, 0, 0, 637, 635, 1, 0, 0, 0, 638, 630, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 642, 5, 120, 0, 0, 641, 623, 1, 0, 0, 0, 641, 624, 1, 0, 0, 0, 641, 626, 1, 0, 0, 0, 641, 628, 1, 0, 0, 0, 642, 71, 1, 0, 0, 0, 643, 648, 3, 136, 68, 0, 644, 645, 5, 115, 0, 0, 645, 647, 3, 136, 68, 0, 646, 644, 1, 0, 0, 0, 647, 650, 1, 0, 0, 0, 648, 646, 1, 0, 0, 0, 648, 649, 1, 0, 0, 0, 649, 73, 1, 0, 0, 0, 650, 648, 1, 0, 0, 0, 651, 652, 5, 69, 0, 0, 652, 656, 5, 117, 0, 0, 653, 655, 3, 76, 38, 0, 654, 653, 1, 0, 0, 0, 655, 658, 1, 0, 0, 0, 656, 654, 1, 0, 0, 0, 656, 657, 1, 0, 0, 0, 657, 659, 1, 0, 0, 0, 658, 656, 1, 0, 0, 0, 659, 660, 5, 118, 0, 0, 660, 75, 1, 0, 0, 0, 661, 662, 5, 43, 0, 0, 662, 663, 3, 136, 68, 0, 663, 664, 5, 64, 0, 0, 664, 665, 3, 138, 69, 0, 665, 666, 5, 113, 0, 0, 666, 667, 3, 120, 60, 0, 667, 668, 3, 78, 39, 0, 668, 669, 5, 114, 0, 0, 669, 714, 1, 0, 0, 0, 670, 671, 5, 44, 0, 0, 671, 672, 3, 136, 68, 0, 672, 673, 5, 64, 0, 0, 673, 674, 3, 138, 69, 0, 674, 675, 5, 113, 0, 0, 675, 676, 3, 126, 63, 0, 676, 677, 3, 48, 24, 0, 677, 678, 3, 78, 39, 0, 678, 679, 5, 114, 0, 0, 679, 714, 1, 0, 0, 0, 680, 681, 5, 26, 0, 0, 681, 682, 3, 136, 68, 0, 682, 683, 5, 64, 0, 0, 683, 684, 3, 138, 69, 0, 684, 685, 5, 113, 0, 0, 685, 687, 3, 136, 68, 0, 686, 688, 3, 28, 14, 0, 687, 686, 1, 0, 0, 0, 687, 688, 1, 0, 0, 0, 688, 689, 1, 0, 0, 0, 689, 690, 5, 114, 0, 0, 690, 714, 1, 0, 0, 0, 691, 692, 5, 33, 0, 0, 692, 693, 3, 136, 68, 0, 693, 694, 5, 64, 0, 0, 694, 695, 3, 138, 69, 0, 695, 696, 5, 113, 0, 0, 696, 699, 3, 136, 68, 0, 697, 698, 5, 35, 0, 0, 698, 700, 3, 120, 60, 0, 699, 697, 1, 0, 0, 0, 699, 700, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 702, 5, 114, 0, 0, 702, 714, 1, 0, 0, 0, 703, 704, 5, 5, 0, 0, 704, 705, 3, 136, 68, 0, 705, 706, 5, 64, 0, 0, 706, 707, 3, 138, 69, 0, 707, 708, 5, 113, 0, 0, 708, 709, 3, 136, 68, 0, 709, 710, 5, 116, 0, 0, 710, 711, 3, 136, 68, 0, 711, 712, 5, 114, 0, 0, 712, 714, 1, 0, 0, 0, 713, 661, 1, 0, 0, 0, 713, 670, 1, 0, 0, 0, 713, 680, 1, 0, 0, 0, 713, 691, 1, 0, 0, 0, 713, 703, 1, 0, 0, 0, 714, 77, 1, 0, 0, 0, 715, 716, 5, 119, 0, 0, 716, 721, 3, 80, 40, 0, 717, 718, 5, 115, 0, 0, 718, 720, 3, 80, 40, 0, 719, 717, 1, 0, 0, 0, 720, 723, 1, 0, 0, 0, 721, 719, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 724, 1, 0, 0, 0, 723, 721, 1, 0, 0, 0, 724, 725, 5, 120, 0, 0, 725, 79, 1, 0, 0, 0, 726, 727, 7, 1, 0, 0, 727, 81, 1, 0, 0, 0, 728, 729, 5, 42, 0, 0, 729, 730, 3, 84, 42, 0, 730, 83, 1, 0, 0, 0, 731, 734, 3, 86, 43, 0, 732, 734, 3, 90, 45, 0, 733, 731, 1, 0, 0, 0, 733, 732, 1, 0, 0, 0, 734, 85, 1, 0, 0, 0, 735, 736, 5, 43, 0, 0, 736, 737, 3, 136, 68, 0, 737, 738, 5, 64, 0, 0, 738, 739, 3, 138, 69, 0, 739, 740, 5, 52, 0, 0, 740, 741, 3, 136, 68, 0, 741, 742, 5, 113, 0, 0, 742, 743, 3, 120, 60, 0, 743, 744, 5, 53, 0, 0, 744, 747, 3, 88, 44, 0, 745, 746, 5, 54, 0, 0, 746, 748, 3, 128, 64, 0, 747, 745, 1, 0, 0, 0, 747, 748, 1, 0, 0, 0, 748, 749, 1, 0, 0, 0, 749, 750, 5, 114, 0, 0, 750, 87, 1, 0, 0, 0, 751, 758, 5, 86, 0, 0, 752, 753, 5, 87, 0, 0, 753, 754, 5, 121, 0, 0, 754, 755, 3, 120, 60, 0, 755, 756, 5, 122, 0, 0, 756, 758, 1, 0, 0, 0, 757, 751, 1, 0, 0, 0, 757, 752, 1, 0, 0, 0, 758, 89, 1, 0, 0, 0, 759, 760, 5, 44, 0, 0, 760, 761, 3, 136, 68, 0, 761, 762, 5, 64, 0, 0, 762, 763, 3, 138, 69, 0, 763, 764, 5, 117, 0, 0, 764, 765, 3, 92, 46, 0, 765, 766, 3, 92, 46, 0, 766, 767, 5, 118, 0, 0, 767, 91, 1, 0, 0, 0, 768, 769, 3, 48, 24, 0, 769, 770, 5, 45, 0, 0, 770, 771, 3, 136, 68, 0, 771, 772, 5, 64, 0, 0, 772, 773, 3, 138, 69, 0, 773, 775, 3, 126, 63, 0, 774, 776, 5, 92, 0, 0, 775, 774, 1, 0, 0, 0, 775, 776, 1, 0, 0, 0, 776, 779, 1, 0, 0, 0, 777, 778, 5, 60, 0, 0, 778, 780, 3, 138, 69, 0, 779, 777, 1, 0, 0, 0, 779, 780, 1, 0, 0, 0, 780, 782, 1, 0, 0, 0, 781, 783, 5, 61, 0, 0, 782, 781, 1, 0, 0, 0, 782, 783, 1, 0, 0, 0, 783, 786, 1, 0, 0, 0, 784, 785, 5, 62, 0, 0, 785, 787, 3, 138, 69, 0, 786, 784, 1, 0, 0, 0, 786, 787, 1, 0, 0, 0, 787, 789, 1, 0, 0, 0, 788, 790, 5, 63, 0, 0, 789, 788, 1, 0, 0, 0, 789, 790, 1, 0, 0, 0, 790, 791, 1, 0, 0, 0, 791, 792, 5, 114, 0, 0, 792, 93, 1, 0, 0, 0, 793, 794, 5, 36, 0, 0, 794, 795, 3, 136, 68, 0, 795, 796, 5, 37, 0, 0, 796, 798, 3, 136, 68, 0, 797, 799, 3, 28, 14, 0, 798, 797, 1, 0, 0, 0, 798, 799, 1, 0, 0, 0, 799, 802, 1, 0, 0, 0, 800, 801, 5, 64, 0, 0, 801, 803, 3, 138, 69, 0, 802, 800, 1, 0, 0, 0, 802, 803, 1, 0, 0, 0, 803, 806, 1, 0, 0, 0, 804, 805, 5, 59, 0, 0, 805, 807, 5, 127, 0, 0, 806, 804, 1, 0, 0, 0, 806, 807, 1, 0, 0, 0, 807, 808, 1, 0, 0, 0, 808, 812, 5, 117, 0, 0, 809, 811, 3, 96, 48, 0, 810, 809, 1, 0, 0, 0, 811, 814, 1, 0, 0, 0, 812, 810, 1, 0, 0, 0, 812, 813, 1, 0, 0, 0, 813, 815, 1, 0, 0, 0, 814, 812, 1, 0, 0, 0, 815, 816, 5, 118, 0, 0, 816, 95, 1, 0, 0, 0, 817, 818, 5, 41, 0, 0, 818, 823, 3, 84, 42, 0, 819, 823, 3, 102, 51, 0, 820, 823, 3, 98, 49, 0, 821, 823, 3, 100, 50, 0, 822, 817, 1, 0, 0, 0, 822, 819, 1, 0, 0, 0, 822, 820, 1, 0, 0, 0, 822, 821, 1, 0, 0, 0, 823, 97, 1, 0, 0, 0, 824, 825, 5, 38, 0, 0, 825, 826, 3, 136, 68, 0, 826, 827, 5, 40, 0, 0, 827, 828, 5, 43, 0, 0, 828, 829, 3, 136, 68, 0, 829, 830, 5, 114, 0, 0, 830, 99, 1, 0, 0, 0, 831, 832, 5, 49, 0, 0, 832, 833, 3, 136, 68, 0, 833, 834, 5, 50, 0, 0, 834, 835, 5, 51, 0, 0, 835, 836, 5, 47, 0, 0, 836, 837, 5, 33, 0, 0, 837, 838, 3, 136, 68, 0, 838, 839, 5, 48, 0, 0, 839, 840, 5, 44, 0, 0, 840, 841, 3, 136, 68, 0, 841, 842, 5, 116, 0, 0, 842, 843, 3, 136, 68, 0, 843, 844, 5, 114, 0, 0, 844, 101, 1, 0, 0, 0, 845, 846, 5, 38, 0, 0, 846, 847, 3, 104, 52, 0, 847, 848, 5, 40, 0, 0, 848, 851, 3, 108, 54, 0, 849, 850, 5, 16, 0, 0, 850, 852, 3, 138, 69, 0, 851, 849, 1, 0, 0, 0, 851, 852, 1, 0, 0, 0, 852, 853, 1, 0, 0, 0, 853, 854, 5, 114, 0, 0, 854, 103, 1, 0, 0, 0, 855, 856, 3, 136, 68, 0, 856, 857, 5, 116, 0, 0, 857, 858, 3, 106, 53, 0, 858, 105, 1, 0, 0, 0, 859, 871, 3, 136, 68, 0, 860, 871, 5, 81, 0, 0, 861, 871, 5, 71, 0, 0, 862, 871, 5, 72, 0, 0, 863, 871, 5, 78, 0, 0, 864, 871, 5, 79, 0, 0, 865, 871, 5, 80, 0, 0, 866, 871, 5, 82, 0, 0, 867, 871, 5, 83, 0, 0, 868, 871, 5, 84, 0, 0, 869, 871, 5, 85, 0, 0, 870, 859, 1, 0, 0, 0, 870, 860, 1, 0, 0, 0, 870, 861, 1, 0, 0, 0, 870, 862, 1, 0, 0, 0, 870, 863, 1, 0, 0, 0, 870, 864, 1, 0, 0, 0, 870, 865, 1, 0, 0, 0, 870, 866, 1, 0, 0, 0, 870, 867, 1, 0, 0, 0, 870, 868, 1, 0, 0, 0, 870, 869, 1, 0, 0, 0, 871, 107, 1, 0, 0, 0, 872, 873, 5, 43, 0, 0, 873, 874, 3, 136, 68, 0, 874, 875, 5, 116, 0, 0, 875, 876, 3, 110, 55, 0, 876, 903, 1, 0, 0, 0, 877, 878, 5, 44, 0, 0, 878, 879, 3, 136, 68, 0, 879, 880, 5, 116, 0, 0, 880, 881, 3, 136, 68, 0, 881, 882, 5, 116, 0, 0, 882, 883, 3, 112, 56, 0, 883, 903, 1, 0, 0, 0, 884, 885, 5, 26, 0, 0, 885, 887, 3, 136, 68, 0, 886, 888, 3, 28, 14, 0, 887, 886, 1, 0, 0, 0, 887, 888, 1, 0, 0, 0, 888, 889, 1, 0, 0, 0, 889, 890, 5, 116, 0, 0, 890, 891, 3, 104, 52, 0, 891, 903, 1, 0, 0, 0, 892, 893, 5, 28, 0, 0, 893, 894, 3, 136, 68, 0, 894, 895, 5, 116, 0, 0, 895, 897, 3, 136, 68, 0, 896, 898, 3, 28, 14, 0, 897, 896, 1, 0, 0, 0, 897, 898, 1, 0, 0, 0, 898, 900, 1, 0, 0, 0, 899, 901, 3, 114, 57, 0, 900, 899, 1, 0, 0, 0, 900, 901, 1, 0, 0, 0, 901, 903, 1, 0, 0, 0, 902, 872, 1, 0, 0, 0, 902, 877, 1, 0, 0, 0, 902, 884, 1, 0, 0, 0, 902, 892, 1, 0, 0, 0, 903, 109, 1, 0, 0, 0, 904, 905, 7, 2, 0, 0, 905, 111, 1, 0, 0, 0, 906, 907, 7, 3, 0, 0, 907, 113, 1, 0, 0, 0, 908, 909, 5, 46, 0, 0, 909, 913, 5, 117, 0, 0, 910, 912, 3, 116, 58, 0, 911, 910, 1, 0, 0, 0, 912, 915, 1, 0, 0, 0, 913, 911, 1, 0, 0, 0, 913, 914, 1, 0, 0, 0, 914, 916, 1, 0, 0, 0, 915, 913, 1, 0, 0, 0, 916, 917, 5, 118, 0, 0, 917, 115, 1, 0, 0, 0, 918, 919, 3, 136, 68, 0, 919, 920, 5, 40, 0, 0, 920, 921, 5, 43, 0, 0, 921, 928, 3, 136, 68, 0, 922, 923, 5, 48, 0, 0, 923, 924, 5, 44, 0, 0, 924, 925, 3, 136, 68, 0, 925, 926, 5, 116, 0, 0, 926, 927, 3, 136, 68, 0, 927, 929, 1, 0, 0, 0, 928, 922, 1, 0, 0, 0, 928, 929, 1, 0, 0, 0, 929, 930, 1, 0, 0, 0, 930, 931, 5, 114, 0, 0, 931, 991, 1, 0, 0, 0, 932, 933, 3, 136, 68, 0, 933, 934, 5, 40, 0, 0, 934, 935, 5, 44, 0, 0, 935, 936, 3, 136, 68, 0, 936, 937, 5, 116, 0, 0, 937, 944, 3, 136, 68, 0, 938, 939, 5, 48, 0, 0, 939, 940, 5, 44, 0, 0, 940, 941, 3, 136, 68, 0, 941, 942, 5, 116, 0, 0, 942, 943, 3, 136, 68, 0, 943, 945, 1, 0, 0, 0, 944, 938, 1, 0, 0, 0, 944, 945, 1, 0, 0, 0, 945, 946, 1, 0, 0, 0, 946, 947, 5, 114, 0, 0, 947, 991, 1, 0, 0, 0, 948, 949, 3, 136, 68, 0, 949, 950, 5, 40, 0, 0, 950, 951, 5, 26, 0, 0, 951, 953, 3, 136, 68, 0, 952, 954, 3, 28, 14, 0, 953, 952, 1, 0, 0, 0, 953, 954, 1, 0, 0, 0, 954, 961, 1, 0, 0, 0, 955, 956, 5, 48, 0, 0, 956, 957, 5, 44, 0, 0, 957, 958, 3, 136, 68, 0, 958, 959, 5, 116, 0, 0, 959, 960, 3, 136, 68, 0, 960, 962, 1, 0, 0, 0, 961, 955, 1, 0, 0, 0, 961, 962, 1, 0, 0, 0, 962, 963, 1, 0, 0, 0, 963, 964, 5, 114, 0, 0, 964, 991, 1, 0, 0, 0, 965, 966, 3, 136, 68, 0, 966, 967, 5, 40, 0, 0, 967, 968, 5, 33, 0, 0, 968, 969, 3, 136, 68, 0, 969, 970, 5, 114, 0, 0, 970, 991, 1, 0, 0, 0, 971, 972, 3, 136, 68, 0, 972, 974, 5, 40, 0, 0, 973, 975, 5, 1, 0, 0, 974, 973, 1, 0, 0, 0, 974, 975, 1, 0, 0, 0, 975, 976, 1, 0, 0, 0, 976, 977, 5, 5, 0, 0, 977, 978, 3, 136, 68, 0, 978, 979, 5, 116, 0, 0, 979, 986, 3, 136, 68, 0, 980, 981, 5, 48, 0, 0, 981, 982, 5, 44, 0, 0, 982, 983, 3, 136, 68, 0, 983, 984, 5, 116, 0, 0, 984, 985, 3, 136, 68, 0, 985, 987, 1, 0, 0, 0, 986, 980, 1, 0, 0, 0, 986, 987, 1, 0, 0, 0, 987, 988, 1, 0, 0, 0, 988, 989, 5, 114, 0, 0, 989, 991, 1, 0, 0, 0, 990, 918, 1, 0, 0, 0, 990, 932, 1, 0, 0, 0, 990, 948, 1, 0, 0, 0, 990, 965, 1, 0, 0, 0, 990, 971, 1, 0, 0, 0, 991, 117, 1, 0, 0, 0, 992, 993, 5, 33, 0, 0, 993, 994, 3, 136, 68, 0, 994, 995, 5, 40, 0, 0, 995, 996, 3, 136, 68, 0, 996, 997, 5, 116, 0, 0, 997, 999, 3, 136, 68, 0, 998, 1000, 3, 114, 57, 0, 999, 998, 1, 0, 0, 0, 999, 1000, 1, 0, 0, 0, 1000, 1001, 1, 0, 0, 0, 1001, 1002, 5, 114, 0, 0, 1002, 119, 1, 0, 0, 0, 1003, 1050, 3, 124, 62, 0, 1004, 1050, 5, 93, 0, 0, 1005, 1050, 5, 94, 0, 0, 1006, 1007, 5, 95, 0, 0, 1007, 1050, 3, 138, 69, 0, 1008, 1009, 5, 96, 0, 0, 1009, 1010, 5, 123, 0, 0, 1010, 1011, 3, 136, 68, 0, 1011, 1012, 5, 124, 0, 0, 1012, 1050, 1, 0, 0, 0, 1013, 1014, 5, 97, 0, 0, 1014, 1015, 5, 123, 0, 0, 1015, 1017, 3, 136, 68, 0, 1016, 1018, 3, 28, 14, 0, 1017, 1016, 1, 0, 0, 0, 1017, 1018, 1, 0, 0, 0, 1018, 1019, 1, 0, 0, 0, 1019, 1020, 5, 124, 0, 0, 1020, 1050, 1, 0, 0, 0, 1021, 1022, 5, 21, 0, 0, 1022, 1023, 5, 123, 0, 0, 1023, 1024, 3, 136, 68, 0, 1024, 1025, 5, 124, 0, 0, 1025, 1050, 1, 0, 0, 0, 1026, 1027, 5, 98, 0, 0, 1027, 1028, 5, 123, 0, 0, 1028, 1029, 3, 120, 60, 0, 1029, 1030, 5, 124, 0, 0, 1030, 1050, 1, 0, 0, 0, 1031, 1032, 5, 99, 0, 0, 1032, 1033, 5, 123, 0, 0, 1033, 1034, 3, 120, 60, 0, 1034, 1035, 5, 124, 0, 0, 1035, 1050, 1, 0, 0, 0, 1036, 1037, 5, 100, 0, 0, 1037, 1041, 5, 117, 0, 0, 1038, 1040, 3, 122, 61, 0, 1039, 1038, 1, 0, 0, 0, 1040, 1043, 1, 0, 0, 0, 1041, 1039, 1, 0, 0, 0, 1041, 1042, 1, 0, 0, 0, 1042, 1044, 1, 0, 0, 0, 1043, 1041, 1, 0, 0, 0, 1044, 1050, 5, 118, 0, 0, 1045, 1047, 3, 136, 68, 0, 1046, 1048, 3, 28, 14, 0, 1047, 1046, 1, 0, 0, 0, 1047, 1048, 1, 0, 0, 0, 1048, 1050, 1, 0, 0, 0, 1049, 1003, 1, 0, 0, 0, 1049, 1004, 1, 0, 0, 0, 1049, 1005, 1, 0, 0, 0, 1049, 1006, 1, 0, 0, 0, 1049, 1008, 1, 0, 0, 0, 1049, 1013, 1, 0, 0, 0, 1049, 1021, 1, 0, 0, 0, 1049, 1026, 1, 0, 0, 0, 1049, 1031, 1, 0, 0, 0, 1049, 1036, 1, 0, 0, 0, 1049, 1045, 1, 0, 0, 0, 1050, 121, 1, 0, 0, 0, 1051, 1052, 3, 136, 68, 0, 1052, 1053, 5, 113, 0, 0, 1053, 1054, 3, 120, 60, 0, 1054, 1055, 5, 114, 0, 0, 1055, 123, 1, 0, 0, 0, 1056, 1057, 7, 4, 0, 0, 1057, 125, 1, 0, 0, 0, 1058, 1059, 7, 5, 0, 0, 1059, 127, 1, 0, 0, 0, 1060, 1069, 3, 138, 69, 0, 1061, 1069, 5, 127, 0, 0, 1062, 1069, 5, 128, 0, 0, 1063, 1069, 5, 109, 0, 0, 1064, 1069, 5, 110, 0, 0, 1065, 1069, 5, 111, 0, 0, 1066, 1069, 3, 130, 65, 0, 1067, 1069, 3, 134, 67, 0, 1068, 1060, 1, 0, 0, 0, 1068, 1061, 1, 0, 0, 0, 1068, 1062, 1, 0, 0, 0, 1068, 1063, 1, 0, 0, 0, 1068, 1064, 1, 0, 0, 0, 1068, 1065, 1, 0, 0, 0, 1068, 1066, 1, 0, 0, 0, 1068, 1067, 1, 0, 0, 0, 1069, 129, 1, 0, 0, 0, 1070, 1079, 5, 117, 0, 0, 1071, 1076, 3, 132, 66, 0, 1072, 1073, 5, 115, 0, 0, 1073, 1075, 3, 132, 66, 0, 1074, 1072, 1, 0, 0, 0, 1075, 1078, 1, 0, 0, 0, 1076, 1074, 1, 0, 0, 0, 1076, 1077, 1, 0, 0, 0, 1077, 1080, 1, 0, 0, 0, 1078, 1076, 1, 0, 0, 0, 1079, 1071, 1, 0, 0, 0, 1079, 1080, 1, 0, 0, 0, 1080, 1081, 1, 0, 0, 0, 1081, 1082, 5, 118, 0, 0, 1082, 131, 1, 0, 0, 0, 1083, 1084, 3, 138, 69, 0, 1084, 1085, 5, 113, 0, 0, 1085, 1086, 3, 128, 64, 0, 1086, 133, 1, 0, 0, 0, 1087, 1096, 5, 119, 0, 0, 1088, 1093, 3, 128, 64, 0, 1089, 1090, 5, 115, 0, 0, 1090, 1092, 3, 128, 64, 0, 1091, 1089, 1, 0, 0, 0, 1092, 1095, 1, 0, 0, 0, 1093, 1091, 1, 0, 0, 0, 1093, 1094, 1, 0, 0, 0, 1094, 1097, 1, 0, 0, 0, 1095, 1093, 1, 0, 0, 0, 1096, 1088, 1, 0, 0, 0, 1096, 1097, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1099, 5, 120, 0, 0, 1099, 135, 1, 0, 0, 0, 1100, 1101, 7, 6, 0, 0, 1101, 137, 1, 0, 0, 0, 1102, 1103, 5, 130, 0, 0, 1103, 139, 1, 0, 0, 0, 95, 152, 159, 180, 192, 204, 224, 232, 239, 245, 257, 260, 266, 277, 286, 296, 299, 301, 305, 313, 325, 330, 339, 342, 360, 372, 396, 399, 409, 413, 419, 426, 452, 459, 463, 468, 479, 485, 495, 500, 506, 517, 537, 564, 569, 580, 585, 592, 601, 614, 635, 638, 641, 648, 656, 687, 699, 713, 721, 733, 747, 757, 775, 779, 782, 786, 789, 798, 802, 806, 812, 822, 851, 870, 887, 897, 900, 902, 913, 928, 944, 953, 961, 974, 986, 990, 999, 1017, 1041, 1047, 1049, 1068, 1076, 1079, 1093, 1096] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapabilityParser.ts b/src/capability-language/generated/QuixosCapabilityParser.ts index a912a47..15d773b 100644 --- a/src/capability-language/generated/QuixosCapabilityParser.ts +++ b/src/capability-language/generated/QuixosCapabilityParser.ts @@ -3406,7 +3406,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 108, QuixosCapabilityParser.RULE_operationProvider); let _la: number; try { - this.state = 894; + this.state = 902; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: @@ -3439,33 +3439,56 @@ export class QuixosCapabilityParser extends antlr.Parser { this.edgePrimitive(); } break; - case QuixosCapabilityParser.PACKAGE: + case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 3); { this.state = 884; - this.match(QuixosCapabilityParser.PACKAGE); + this.match(QuixosCapabilityParser.INTERFACE); this.state = 885; this.identifier(); - this.state = 886; - this.match(QuixosCapabilityParser.DOT); this.state = 887; - this.identifier(); - this.state = 889; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 123) { { - this.state = 888; + this.state = 886; this.typeArguments(); } } + this.state = 889; + this.match(QuixosCapabilityParser.DOT); + this.state = 890; + this.memberOperationRef(); + } + break; + case QuixosCapabilityParser.PACKAGE: + this.enterOuterAlt(localContext, 4); + { this.state = 892; + this.match(QuixosCapabilityParser.PACKAGE); + this.state = 893; + this.identifier(); + this.state = 894; + this.match(QuixosCapabilityParser.DOT); + this.state = 895; + this.identifier(); + this.state = 897; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 123) { + { + this.state = 896; + this.typeArguments(); + } + } + + this.state = 900; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 46) { { - this.state = 891; + this.state = 899; this.dependencyBindingBlock(); } } @@ -3496,7 +3519,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 896; + this.state = 904; _la = this.tokenStream.LA(1); if(!(((((_la - 76)) & ~0x1F) === 0 && ((1 << (_la - 76)) & 195) !== 0))) { this.errorHandler.recoverInline(this); @@ -3527,7 +3550,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 898; + this.state = 906; _la = this.tokenStream.LA(1); if(!(((((_la - 78)) & ~0x1F) === 0 && ((1 << (_la - 78)) & 55) !== 0))) { this.errorHandler.recoverInline(this); @@ -3558,25 +3581,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 900; + this.state = 908; this.match(QuixosCapabilityParser.WITH); - this.state = 901; + this.state = 909; this.match(QuixosCapabilityParser.LBRACE); - this.state = 905; + this.state = 913; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 65532) !== 0) || _la === 55 || _la === 129) { { { - this.state = 902; + this.state = 910; this.dependencyBinding(); } } - this.state = 907; + this.state = 915; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 908; + this.state = 916; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3598,181 +3621,181 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 116, QuixosCapabilityParser.RULE_dependencyBinding); let _la: number; try { - this.state = 982; + this.state = 990; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 83, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 84, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 910; + this.state = 918; this.identifier(); - this.state = 911; + this.state = 919; this.match(QuixosCapabilityParser.TO); - this.state = 912; - this.match(QuixosCapabilityParser.STATE); - this.state = 913; - this.identifier(); this.state = 920; + this.match(QuixosCapabilityParser.STATE); + this.state = 921; + this.identifier(); + this.state = 928; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 48) { { - this.state = 914; + this.state = 922; this.match(QuixosCapabilityParser.VIA); - this.state = 915; + this.state = 923; this.match(QuixosCapabilityParser.EDGE); - this.state = 916; + this.state = 924; this.identifier(); - this.state = 917; + this.state = 925; this.match(QuixosCapabilityParser.DOT); - this.state = 918; + this.state = 926; this.identifier(); } } - this.state = 922; + this.state = 930; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 924; + this.state = 932; this.identifier(); - this.state = 925; + this.state = 933; this.match(QuixosCapabilityParser.TO); - this.state = 926; + this.state = 934; this.match(QuixosCapabilityParser.EDGE); - this.state = 927; - this.identifier(); - this.state = 928; - this.match(QuixosCapabilityParser.DOT); - this.state = 929; + this.state = 935; this.identifier(); this.state = 936; + this.match(QuixosCapabilityParser.DOT); + this.state = 937; + this.identifier(); + this.state = 944; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 48) { { - this.state = 930; + this.state = 938; this.match(QuixosCapabilityParser.VIA); - this.state = 931; + this.state = 939; this.match(QuixosCapabilityParser.EDGE); - this.state = 932; + this.state = 940; this.identifier(); - this.state = 933; + this.state = 941; this.match(QuixosCapabilityParser.DOT); - this.state = 934; + this.state = 942; this.identifier(); } } - this.state = 938; + this.state = 946; this.match(QuixosCapabilityParser.SEMI); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 940; + this.state = 948; this.identifier(); - this.state = 941; + this.state = 949; this.match(QuixosCapabilityParser.TO); - this.state = 942; + this.state = 950; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 943; + this.state = 951; this.identifier(); - this.state = 945; + this.state = 953; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 123) { { - this.state = 944; + this.state = 952; this.typeArguments(); } } - this.state = 953; + this.state = 961; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 48) { { - this.state = 947; + this.state = 955; this.match(QuixosCapabilityParser.VIA); - this.state = 948; + this.state = 956; this.match(QuixosCapabilityParser.EDGE); - this.state = 949; + this.state = 957; this.identifier(); - this.state = 950; + this.state = 958; this.match(QuixosCapabilityParser.DOT); - this.state = 951; + this.state = 959; this.identifier(); } } - this.state = 955; + this.state = 963; this.match(QuixosCapabilityParser.SEMI); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 957; + this.state = 965; this.identifier(); - this.state = 958; + this.state = 966; this.match(QuixosCapabilityParser.TO); - this.state = 959; + this.state = 967; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 960; + this.state = 968; this.identifier(); - this.state = 961; + this.state = 969; this.match(QuixosCapabilityParser.SEMI); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 963; + this.state = 971; this.identifier(); - this.state = 964; + this.state = 972; this.match(QuixosCapabilityParser.TO); - this.state = 966; + this.state = 974; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 1) { { - this.state = 965; + this.state = 973; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 968; + this.state = 976; this.match(QuixosCapabilityParser.QUERY); - this.state = 969; - this.identifier(); - this.state = 970; - this.match(QuixosCapabilityParser.DOT); - this.state = 971; + this.state = 977; this.identifier(); this.state = 978; + this.match(QuixosCapabilityParser.DOT); + this.state = 979; + this.identifier(); + this.state = 986; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 48) { { - this.state = 972; + this.state = 980; this.match(QuixosCapabilityParser.VIA); - this.state = 973; + this.state = 981; this.match(QuixosCapabilityParser.EDGE); - this.state = 974; + this.state = 982; this.identifier(); - this.state = 975; + this.state = 983; this.match(QuixosCapabilityParser.DOT); - this.state = 976; + this.state = 984; this.identifier(); } } - this.state = 980; + this.state = 988; this.match(QuixosCapabilityParser.SEMI); } break; @@ -3798,29 +3821,29 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 984; + this.state = 992; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 985; + this.state = 993; this.identifier(); - this.state = 986; + this.state = 994; this.match(QuixosCapabilityParser.TO); - this.state = 987; + this.state = 995; this.identifier(); - this.state = 988; + this.state = 996; this.match(QuixosCapabilityParser.DOT); - this.state = 989; + this.state = 997; this.identifier(); - this.state = 991; + this.state = 999; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 46) { { - this.state = 990; + this.state = 998; this.dependencyBindingBlock(); } } - this.state = 993; + this.state = 1001; this.match(QuixosCapabilityParser.SEMI); } } @@ -3842,7 +3865,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 120, QuixosCapabilityParser.RULE_valueType); let _la: number; try { - this.state = 1041; + this.state = 1049; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.BOOL: @@ -3855,130 +3878,130 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.UINT64: this.enterOuterAlt(localContext, 1); { - this.state = 995; + this.state = 1003; this.scalarType(); } break; case QuixosCapabilityParser.UNIT: this.enterOuterAlt(localContext, 2); { - this.state = 996; + this.state = 1004; this.match(QuixosCapabilityParser.UNIT); } break; case QuixosCapabilityParser.WATCH_HANDLE: this.enterOuterAlt(localContext, 3); { - this.state = 997; + this.state = 1005; this.match(QuixosCapabilityParser.WATCH_HANDLE); } break; case QuixosCapabilityParser.MESSAGE: this.enterOuterAlt(localContext, 4); { - this.state = 998; + this.state = 1006; this.match(QuixosCapabilityParser.MESSAGE); - this.state = 999; + this.state = 1007; this.stringLiteral(); } break; case QuixosCapabilityParser.ATOM_REF: this.enterOuterAlt(localContext, 5); { - this.state = 1000; + this.state = 1008; this.match(QuixosCapabilityParser.ATOM_REF); - this.state = 1001; + this.state = 1009; this.match(QuixosCapabilityParser.LT); - this.state = 1002; + this.state = 1010; this.identifier(); - this.state = 1003; + this.state = 1011; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.INTERFACE_REF: this.enterOuterAlt(localContext, 6); { - this.state = 1005; + this.state = 1013; this.match(QuixosCapabilityParser.INTERFACE_REF); - this.state = 1006; + this.state = 1014; this.match(QuixosCapabilityParser.LT); - this.state = 1007; + this.state = 1015; this.identifier(); - this.state = 1009; + this.state = 1017; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 123) { { - this.state = 1008; + this.state = 1016; this.typeArguments(); } } - this.state = 1011; + this.state = 1019; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.REF: this.enterOuterAlt(localContext, 7); { - this.state = 1013; + this.state = 1021; this.match(QuixosCapabilityParser.REF); - this.state = 1014; + this.state = 1022; this.match(QuixosCapabilityParser.LT); - this.state = 1015; + this.state = 1023; this.identifier(); - this.state = 1016; + this.state = 1024; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.OPTIONAL: this.enterOuterAlt(localContext, 8); { - this.state = 1018; + this.state = 1026; this.match(QuixosCapabilityParser.OPTIONAL); - this.state = 1019; + this.state = 1027; this.match(QuixosCapabilityParser.LT); - this.state = 1020; + this.state = 1028; this.valueType(); - this.state = 1021; + this.state = 1029; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.LIST: this.enterOuterAlt(localContext, 9); { - this.state = 1023; + this.state = 1031; this.match(QuixosCapabilityParser.LIST); - this.state = 1024; + this.state = 1032; this.match(QuixosCapabilityParser.LT); - this.state = 1025; + this.state = 1033; this.valueType(); - this.state = 1026; + this.state = 1034; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.RECORD: this.enterOuterAlt(localContext, 10); { - this.state = 1028; + this.state = 1036; this.match(QuixosCapabilityParser.RECORD); - this.state = 1029; + this.state = 1037; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1033; + this.state = 1041; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 65532) !== 0) || _la === 55 || _la === 129) { { { - this.state = 1030; + this.state = 1038; this.recordField(); } } - this.state = 1035; + this.state = 1043; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1036; + this.state = 1044; this.match(QuixosCapabilityParser.RBRACE); } break; @@ -4000,14 +4023,14 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 11); { - this.state = 1037; + this.state = 1045; this.identifier(); - this.state = 1039; + this.state = 1047; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 123) { { - this.state = 1038; + this.state = 1046; this.typeArguments(); } } @@ -4037,13 +4060,13 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1043; + this.state = 1051; this.identifier(); - this.state = 1044; + this.state = 1052; this.match(QuixosCapabilityParser.COLON); - this.state = 1045; + this.state = 1053; this.valueType(); - this.state = 1046; + this.state = 1054; this.match(QuixosCapabilityParser.SEMI); } } @@ -4067,7 +4090,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1048; + this.state = 1056; _la = this.tokenStream.LA(1); if(!(((((_la - 101)) & ~0x1F) === 0 && ((1 << (_la - 101)) & 255) !== 0))) { this.errorHandler.recoverInline(this); @@ -4098,7 +4121,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1050; + this.state = 1058; _la = this.tokenStream.LA(1); if(!(((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 15) !== 0))) { this.errorHandler.recoverInline(this); @@ -4126,62 +4149,62 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new JsonLiteralContext(this.context, this.state); this.enterRule(localContext, 128, QuixosCapabilityParser.RULE_jsonLiteral); try { - this.state = 1060; + this.state = 1068; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STRING_LITERAL: this.enterOuterAlt(localContext, 1); { - this.state = 1052; + this.state = 1060; this.stringLiteral(); } break; case QuixosCapabilityParser.INTEGER: this.enterOuterAlt(localContext, 2); { - this.state = 1053; + this.state = 1061; this.match(QuixosCapabilityParser.INTEGER); } break; case QuixosCapabilityParser.JSON_NUMBER: this.enterOuterAlt(localContext, 3); { - this.state = 1054; + this.state = 1062; this.match(QuixosCapabilityParser.JSON_NUMBER); } break; case QuixosCapabilityParser.TRUE: this.enterOuterAlt(localContext, 4); { - this.state = 1055; + this.state = 1063; this.match(QuixosCapabilityParser.TRUE); } break; case QuixosCapabilityParser.FALSE: this.enterOuterAlt(localContext, 5); { - this.state = 1056; + this.state = 1064; this.match(QuixosCapabilityParser.FALSE); } break; case QuixosCapabilityParser.NULL: this.enterOuterAlt(localContext, 6); { - this.state = 1057; + this.state = 1065; this.match(QuixosCapabilityParser.NULL); } break; case QuixosCapabilityParser.LBRACE: this.enterOuterAlt(localContext, 7); { - this.state = 1058; + this.state = 1066; this.jsonObject(); } break; case QuixosCapabilityParser.LBRACK: this.enterOuterAlt(localContext, 8); { - this.state = 1059; + this.state = 1067; this.jsonArray(); } break; @@ -4209,35 +4232,35 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1062; + this.state = 1070; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1071; + this.state = 1079; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 130) { { - this.state = 1063; + this.state = 1071; this.jsonMember(); - this.state = 1068; + this.state = 1076; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 115) { { { - this.state = 1064; + this.state = 1072; this.match(QuixosCapabilityParser.COMMA); - this.state = 1065; + this.state = 1073; this.jsonMember(); } } - this.state = 1070; + this.state = 1078; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1073; + this.state = 1081; this.match(QuixosCapabilityParser.RBRACE); } } @@ -4260,11 +4283,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1075; + this.state = 1083; this.stringLiteral(); - this.state = 1076; + this.state = 1084; this.match(QuixosCapabilityParser.COLON); - this.state = 1077; + this.state = 1085; this.jsonLiteral(); } } @@ -4288,35 +4311,35 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1079; + this.state = 1087; this.match(QuixosCapabilityParser.LBRACK); - this.state = 1088; + this.state = 1096; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (((((_la - 109)) & ~0x1F) === 0 && ((1 << (_la - 109)) & 2884871) !== 0)) { { - this.state = 1080; + this.state = 1088; this.jsonLiteral(); - this.state = 1085; + this.state = 1093; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 115) { { { - this.state = 1081; + this.state = 1089; this.match(QuixosCapabilityParser.COMMA); - this.state = 1082; + this.state = 1090; this.jsonLiteral(); } } - this.state = 1087; + this.state = 1095; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1090; + this.state = 1098; this.match(QuixosCapabilityParser.RBRACK); } } @@ -4340,7 +4363,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1092; + this.state = 1100; _la = this.tokenStream.LA(1); if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 65532) !== 0) || _la === 55 || _la === 129)) { this.errorHandler.recoverInline(this); @@ -4370,7 +4393,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1094; + this.state = 1102; this.match(QuixosCapabilityParser.STRING_LITERAL); } } @@ -4389,7 +4412,7 @@ export class QuixosCapabilityParser extends antlr.Parser { } public static readonly _serializedATN: number[] = [ - 4,1,133,1097,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,133,1105,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, @@ -4461,229 +4484,229 @@ export class QuixosCapabilityParser extends antlr.Parser { 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,51, 3,51,852,8,51,1,51,1,51,1,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53, 1,53,1,53,1,53,1,53,1,53,1,53,1,53,3,53,871,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,1,54,1,54,1,54,1,54, - 1,54,3,54,890,8,54,1,54,3,54,893,8,54,3,54,895,8,54,1,55,1,55,1, - 56,1,56,1,57,1,57,1,57,5,57,904,8,57,10,57,12,57,907,9,57,1,57,1, - 57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,921,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,937,8,58,1,58,1,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,3,58,954,8,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,967,8,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,979,8,58,1,58,1,58, - 3,58,983,8,58,1,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,992,8,59,1, - 59,1,59,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1, - 60,1,60,1,60,3,60,1010,8,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1, - 60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,5, - 60,1032,8,60,10,60,12,60,1035,9,60,1,60,1,60,1,60,3,60,1040,8,60, - 3,60,1042,8,60,1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,63,1,63,1,64, - 1,64,1,64,1,64,1,64,1,64,1,64,1,64,3,64,1061,8,64,1,65,1,65,1,65, - 1,65,5,65,1067,8,65,10,65,12,65,1070,9,65,3,65,1072,8,65,1,65,1, - 65,1,66,1,66,1,66,1,66,1,67,1,67,1,67,1,67,5,67,1084,8,67,10,67, - 12,67,1087,9,67,3,67,1089,8,67,1,67,1,67,1,68,1,68,1,69,1,69,1,69, - 0,0,70,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,0,7,1,0,81,85,2,0,76,80,82,83, - 2,0,76,77,82,83,2,0,78,80,82,83,1,0,101,108,1,0,88,91,3,0,2,15,55, - 55,129,129,1178,0,152,1,0,0,0,2,154,1,0,0,0,4,164,1,0,0,0,6,168, - 1,0,0,0,8,192,1,0,0,0,10,204,1,0,0,0,12,206,1,0,0,0,14,213,1,0,0, - 0,16,224,1,0,0,0,18,226,1,0,0,0,20,239,1,0,0,0,22,271,1,0,0,0,24, - 301,1,0,0,0,26,303,1,0,0,0,28,307,1,0,0,0,30,325,1,0,0,0,32,327, - 1,0,0,0,34,339,1,0,0,0,36,342,1,0,0,0,38,360,1,0,0,0,40,396,1,0, - 0,0,42,399,1,0,0,0,44,424,1,0,0,0,46,452,1,0,0,0,48,463,1,0,0,0, - 50,468,1,0,0,0,52,495,1,0,0,0,54,497,1,0,0,0,56,522,1,0,0,0,58,564, - 1,0,0,0,60,566,1,0,0,0,62,589,1,0,0,0,64,605,1,0,0,0,66,618,1,0, - 0,0,68,621,1,0,0,0,70,641,1,0,0,0,72,643,1,0,0,0,74,651,1,0,0,0, - 76,713,1,0,0,0,78,715,1,0,0,0,80,726,1,0,0,0,82,728,1,0,0,0,84,733, - 1,0,0,0,86,735,1,0,0,0,88,757,1,0,0,0,90,759,1,0,0,0,92,768,1,0, - 0,0,94,793,1,0,0,0,96,822,1,0,0,0,98,824,1,0,0,0,100,831,1,0,0,0, - 102,845,1,0,0,0,104,855,1,0,0,0,106,870,1,0,0,0,108,894,1,0,0,0, - 110,896,1,0,0,0,112,898,1,0,0,0,114,900,1,0,0,0,116,982,1,0,0,0, - 118,984,1,0,0,0,120,1041,1,0,0,0,122,1043,1,0,0,0,124,1048,1,0,0, - 0,126,1050,1,0,0,0,128,1060,1,0,0,0,130,1062,1,0,0,0,132,1075,1, - 0,0,0,134,1079,1,0,0,0,136,1092,1,0,0,0,138,1094,1,0,0,0,140,141, - 3,6,3,0,141,142,5,0,0,1,142,153,1,0,0,0,143,144,3,20,10,0,144,145, - 5,0,0,1,145,153,1,0,0,0,146,147,3,50,25,0,147,148,5,0,0,1,148,153, - 1,0,0,0,149,150,3,2,1,0,150,151,5,0,0,1,151,153,1,0,0,0,152,140, - 1,0,0,0,152,143,1,0,0,0,152,146,1,0,0,0,152,149,1,0,0,0,153,1,1, - 0,0,0,154,155,5,22,0,0,155,159,5,117,0,0,156,158,3,8,4,0,157,156, - 1,0,0,0,158,161,1,0,0,0,159,157,1,0,0,0,159,160,1,0,0,0,160,162, - 1,0,0,0,161,159,1,0,0,0,162,163,5,118,0,0,163,3,1,0,0,0,164,165, - 5,23,0,0,165,166,3,138,69,0,166,167,5,114,0,0,167,5,1,0,0,0,168, - 169,5,1,0,0,169,170,3,136,68,0,170,171,5,64,0,0,171,172,3,138,69, - 0,172,173,5,58,0,0,173,174,3,138,69,0,174,175,5,57,0,0,175,176,3, - 138,69,0,176,180,5,117,0,0,177,179,3,8,4,0,178,177,1,0,0,0,179,182, - 1,0,0,0,180,178,1,0,0,0,180,181,1,0,0,0,181,183,1,0,0,0,182,180, - 1,0,0,0,183,184,5,118,0,0,184,7,1,0,0,0,185,193,3,4,2,0,186,193, - 3,18,9,0,187,193,3,10,5,0,188,193,3,82,41,0,189,193,3,94,47,0,190, - 193,3,118,59,0,191,193,3,32,16,0,192,185,1,0,0,0,192,186,1,0,0,0, - 192,187,1,0,0,0,192,188,1,0,0,0,192,189,1,0,0,0,192,190,1,0,0,0, - 192,191,1,0,0,0,193,9,1,0,0,0,194,195,5,23,0,0,195,196,5,26,0,0, - 196,197,3,136,68,0,197,198,5,114,0,0,198,205,1,0,0,0,199,200,5,23, - 0,0,200,201,5,28,0,0,201,202,3,136,68,0,202,203,5,114,0,0,203,205, - 1,0,0,0,204,194,1,0,0,0,204,199,1,0,0,0,205,11,1,0,0,0,206,207,5, - 24,0,0,207,208,5,25,0,0,208,209,3,136,68,0,209,210,5,64,0,0,210, - 211,3,138,69,0,211,212,5,114,0,0,212,13,1,0,0,0,213,214,5,24,0,0, - 214,215,5,26,0,0,215,216,3,136,68,0,216,217,5,58,0,0,217,218,3,138, - 69,0,218,219,5,114,0,0,219,15,1,0,0,0,220,225,3,10,5,0,221,225,3, - 12,6,0,222,225,3,14,7,0,223,225,3,32,16,0,224,220,1,0,0,0,224,221, - 1,0,0,0,224,222,1,0,0,0,224,223,1,0,0,0,225,17,1,0,0,0,226,227,5, - 25,0,0,227,228,3,136,68,0,228,229,5,64,0,0,229,232,3,138,69,0,230, - 231,5,65,0,0,231,233,3,138,69,0,232,230,1,0,0,0,232,233,1,0,0,0, - 233,234,1,0,0,0,234,235,5,114,0,0,235,19,1,0,0,0,236,238,3,16,8, - 0,237,236,1,0,0,0,238,241,1,0,0,0,239,237,1,0,0,0,239,240,1,0,0, - 0,240,242,1,0,0,0,241,239,1,0,0,0,242,243,5,26,0,0,243,245,3,136, - 68,0,244,246,3,22,11,0,245,244,1,0,0,0,245,246,1,0,0,0,246,247,1, - 0,0,0,247,248,5,64,0,0,248,249,3,138,69,0,249,250,5,58,0,0,250,260, - 3,138,69,0,251,252,5,69,0,0,252,257,3,26,13,0,253,254,5,115,0,0, - 254,256,3,26,13,0,255,253,1,0,0,0,256,259,1,0,0,0,257,255,1,0,0, - 0,257,258,1,0,0,0,258,261,1,0,0,0,259,257,1,0,0,0,260,251,1,0,0, - 0,260,261,1,0,0,0,261,262,1,0,0,0,262,266,5,117,0,0,263,265,3,34, - 17,0,264,263,1,0,0,0,265,268,1,0,0,0,266,264,1,0,0,0,266,267,1,0, - 0,0,267,269,1,0,0,0,268,266,1,0,0,0,269,270,5,118,0,0,270,21,1,0, - 0,0,271,272,5,123,0,0,272,277,3,24,12,0,273,274,5,115,0,0,274,276, - 3,24,12,0,275,273,1,0,0,0,276,279,1,0,0,0,277,275,1,0,0,0,277,278, - 1,0,0,0,278,280,1,0,0,0,279,277,1,0,0,0,280,281,5,124,0,0,281,23, - 1,0,0,0,282,283,5,29,0,0,283,286,3,136,68,0,284,285,5,113,0,0,285, - 287,5,19,0,0,286,284,1,0,0,0,286,287,1,0,0,0,287,302,1,0,0,0,288, - 289,5,18,0,0,289,299,3,136,68,0,290,291,5,20,0,0,291,296,3,26,13, - 0,292,293,5,125,0,0,293,295,3,26,13,0,294,292,1,0,0,0,295,298,1, - 0,0,0,296,294,1,0,0,0,296,297,1,0,0,0,297,300,1,0,0,0,298,296,1, - 0,0,0,299,290,1,0,0,0,299,300,1,0,0,0,300,302,1,0,0,0,301,282,1, - 0,0,0,301,288,1,0,0,0,302,25,1,0,0,0,303,305,3,136,68,0,304,306, - 3,28,14,0,305,304,1,0,0,0,305,306,1,0,0,0,306,27,1,0,0,0,307,308, - 5,123,0,0,308,313,3,30,15,0,309,310,5,115,0,0,310,312,3,30,15,0, - 311,309,1,0,0,0,312,315,1,0,0,0,313,311,1,0,0,0,313,314,1,0,0,0, - 314,316,1,0,0,0,315,313,1,0,0,0,316,317,5,124,0,0,317,29,1,0,0,0, - 318,319,5,25,0,0,319,326,3,136,68,0,320,321,5,26,0,0,321,326,3,26, - 13,0,322,323,5,18,0,0,323,326,3,136,68,0,324,326,3,120,60,0,325, - 318,1,0,0,0,325,320,1,0,0,0,325,322,1,0,0,0,325,324,1,0,0,0,326, - 31,1,0,0,0,327,328,5,17,0,0,328,330,3,136,68,0,329,331,3,22,11,0, - 330,329,1,0,0,0,330,331,1,0,0,0,331,332,1,0,0,0,332,333,5,126,0, - 0,333,334,3,120,60,0,334,335,5,114,0,0,335,33,1,0,0,0,336,340,3, - 38,19,0,337,340,3,42,21,0,338,340,3,36,18,0,339,336,1,0,0,0,339, - 337,1,0,0,0,339,338,1,0,0,0,340,35,1,0,0,0,341,343,5,39,0,0,342, - 341,1,0,0,0,342,343,1,0,0,0,343,344,1,0,0,0,344,345,5,31,0,0,345, - 346,3,136,68,0,346,347,5,64,0,0,347,348,3,138,69,0,348,349,5,113, - 0,0,349,350,3,120,60,0,350,351,5,112,0,0,351,352,3,120,60,0,352, - 353,5,117,0,0,353,354,5,81,0,0,354,355,5,64,0,0,355,356,3,138,69, - 0,356,357,5,114,0,0,357,358,5,118,0,0,358,37,1,0,0,0,359,361,3,44, - 22,0,360,359,1,0,0,0,360,361,1,0,0,0,361,362,1,0,0,0,362,363,5,29, - 0,0,363,364,3,136,68,0,364,365,5,64,0,0,365,366,3,138,69,0,366,367, - 5,113,0,0,367,368,3,120,60,0,368,372,5,117,0,0,369,371,3,40,20,0, - 370,369,1,0,0,0,371,374,1,0,0,0,372,370,1,0,0,0,372,373,1,0,0,0, - 373,375,1,0,0,0,374,372,1,0,0,0,375,376,5,118,0,0,376,39,1,0,0,0, - 377,378,5,71,0,0,378,379,5,64,0,0,379,380,3,138,69,0,380,381,5,114, - 0,0,381,397,1,0,0,0,382,383,5,72,0,0,383,384,5,64,0,0,384,385,3, - 138,69,0,385,386,5,114,0,0,386,397,1,0,0,0,387,388,5,73,0,0,388, - 389,5,74,0,0,389,390,5,64,0,0,390,391,3,138,69,0,391,392,5,75,0, - 0,392,393,5,64,0,0,393,394,3,138,69,0,394,395,5,114,0,0,395,397, - 1,0,0,0,396,377,1,0,0,0,396,382,1,0,0,0,396,387,1,0,0,0,397,41,1, - 0,0,0,398,400,3,44,22,0,399,398,1,0,0,0,399,400,1,0,0,0,400,401, - 1,0,0,0,401,402,5,30,0,0,402,403,3,136,68,0,403,404,5,64,0,0,404, - 405,3,138,69,0,405,406,5,113,0,0,406,407,3,126,63,0,407,409,3,48, - 24,0,408,410,5,92,0,0,409,408,1,0,0,0,409,410,1,0,0,0,410,413,1, - 0,0,0,411,412,5,62,0,0,412,414,3,138,69,0,413,411,1,0,0,0,413,414, - 1,0,0,0,414,415,1,0,0,0,415,419,5,117,0,0,416,418,3,46,23,0,417, - 416,1,0,0,0,418,421,1,0,0,0,419,417,1,0,0,0,419,420,1,0,0,0,420, - 422,1,0,0,0,421,419,1,0,0,0,422,423,5,118,0,0,423,43,1,0,0,0,424, - 426,5,14,0,0,425,427,5,15,0,0,426,425,1,0,0,0,426,427,1,0,0,0,427, - 45,1,0,0,0,428,429,5,78,0,0,429,430,5,64,0,0,430,431,3,138,69,0, - 431,432,5,114,0,0,432,453,1,0,0,0,433,434,5,79,0,0,434,435,5,64, - 0,0,435,436,3,138,69,0,436,437,5,114,0,0,437,453,1,0,0,0,438,439, - 5,80,0,0,439,440,5,64,0,0,440,441,3,138,69,0,441,442,5,114,0,0,442, - 453,1,0,0,0,443,444,5,73,0,0,444,445,5,74,0,0,445,446,5,64,0,0,446, - 447,3,138,69,0,447,448,5,75,0,0,448,449,5,64,0,0,449,450,3,138,69, - 0,450,451,5,114,0,0,451,453,1,0,0,0,452,428,1,0,0,0,452,433,1,0, - 0,0,452,438,1,0,0,0,452,443,1,0,0,0,453,47,1,0,0,0,454,455,5,25, - 0,0,455,464,3,136,68,0,456,457,5,26,0,0,457,459,3,136,68,0,458,460, - 3,28,14,0,459,458,1,0,0,0,459,460,1,0,0,0,460,464,1,0,0,0,461,462, - 5,18,0,0,462,464,3,136,68,0,463,454,1,0,0,0,463,456,1,0,0,0,463, - 461,1,0,0,0,464,49,1,0,0,0,465,467,3,16,8,0,466,465,1,0,0,0,467, - 470,1,0,0,0,468,466,1,0,0,0,468,469,1,0,0,0,469,471,1,0,0,0,470, - 468,1,0,0,0,471,472,5,28,0,0,472,473,3,136,68,0,473,474,5,64,0,0, - 474,475,3,138,69,0,475,476,5,58,0,0,476,479,3,138,69,0,477,478,5, - 59,0,0,478,480,5,127,0,0,479,477,1,0,0,0,479,480,1,0,0,0,480,481, - 1,0,0,0,481,485,5,117,0,0,482,484,3,52,26,0,483,482,1,0,0,0,484, - 487,1,0,0,0,485,483,1,0,0,0,485,486,1,0,0,0,486,488,1,0,0,0,487, - 485,1,0,0,0,488,489,5,118,0,0,489,51,1,0,0,0,490,496,3,60,30,0,491, - 496,3,62,31,0,492,496,3,64,32,0,493,496,3,54,27,0,494,496,3,56,28, - 0,495,490,1,0,0,0,495,491,1,0,0,0,495,492,1,0,0,0,495,493,1,0,0, - 0,495,494,1,0,0,0,496,53,1,0,0,0,497,498,5,5,0,0,498,500,3,136,68, - 0,499,501,3,22,11,0,500,499,1,0,0,0,500,501,1,0,0,0,501,502,1,0, - 0,0,502,503,5,64,0,0,503,504,3,138,69,0,504,506,5,7,0,0,505,507, - 5,1,0,0,506,505,1,0,0,0,506,507,1,0,0,0,507,508,1,0,0,0,508,509, - 3,26,13,0,509,510,5,8,0,0,510,511,3,138,69,0,511,512,5,31,0,0,512, - 513,3,138,69,0,513,517,5,117,0,0,514,516,3,58,29,0,515,514,1,0,0, - 0,516,519,1,0,0,0,517,515,1,0,0,0,517,518,1,0,0,0,518,520,1,0,0, - 0,519,517,1,0,0,0,520,521,5,118,0,0,521,55,1,0,0,0,522,523,5,5,0, - 0,523,524,3,136,68,0,524,525,5,64,0,0,525,526,3,138,69,0,526,527, - 5,6,0,0,527,528,3,136,68,0,528,529,3,28,14,0,529,530,5,114,0,0,530, - 57,1,0,0,0,531,532,5,9,0,0,532,533,3,138,69,0,533,534,5,114,0,0, - 534,565,1,0,0,0,535,537,5,10,0,0,536,538,5,18,0,0,537,536,1,0,0, - 0,537,538,1,0,0,0,538,539,1,0,0,0,539,540,3,136,68,0,540,541,5,37, - 0,0,541,542,3,26,13,0,542,543,5,114,0,0,543,565,1,0,0,0,544,545, - 5,11,0,0,545,546,3,136,68,0,546,547,5,127,0,0,547,548,5,114,0,0, - 548,565,1,0,0,0,549,550,5,12,0,0,550,551,3,26,13,0,551,552,5,116, - 0,0,552,553,3,136,68,0,553,554,3,136,68,0,554,555,3,138,69,0,555, - 556,5,114,0,0,556,565,1,0,0,0,557,558,5,73,0,0,558,565,5,114,0,0, - 559,560,5,13,0,0,560,561,5,127,0,0,561,562,3,138,69,0,562,563,5, - 114,0,0,563,565,1,0,0,0,564,531,1,0,0,0,564,535,1,0,0,0,564,544, - 1,0,0,0,564,549,1,0,0,0,564,557,1,0,0,0,564,559,1,0,0,0,565,59,1, - 0,0,0,566,567,5,31,0,0,567,569,3,136,68,0,568,570,3,22,11,0,569, - 568,1,0,0,0,569,570,1,0,0,0,570,571,1,0,0,0,571,572,5,64,0,0,572, - 573,3,138,69,0,573,574,5,113,0,0,574,575,3,120,60,0,575,576,5,112, - 0,0,576,577,3,120,60,0,577,578,5,66,0,0,578,580,3,68,34,0,579,581, - 3,66,33,0,580,579,1,0,0,0,580,581,1,0,0,0,581,582,1,0,0,0,582,583, - 5,68,0,0,583,585,3,70,35,0,584,586,3,74,37,0,585,584,1,0,0,0,585, - 586,1,0,0,0,586,587,1,0,0,0,587,588,5,114,0,0,588,61,1,0,0,0,589, - 590,5,32,0,0,590,592,3,136,68,0,591,593,3,22,11,0,592,591,1,0,0, - 0,592,593,1,0,0,0,593,594,1,0,0,0,594,595,5,64,0,0,595,596,3,138, - 69,0,596,597,5,113,0,0,597,598,3,120,60,0,598,599,5,112,0,0,599, - 601,3,120,60,0,600,602,3,74,37,0,601,600,1,0,0,0,601,602,1,0,0,0, - 602,603,1,0,0,0,603,604,5,114,0,0,604,63,1,0,0,0,605,606,5,33,0, - 0,606,607,3,136,68,0,607,608,5,64,0,0,608,609,3,138,69,0,609,610, - 5,34,0,0,610,611,3,136,68,0,611,612,5,113,0,0,612,614,3,120,60,0, - 613,615,3,74,37,0,614,613,1,0,0,0,614,615,1,0,0,0,615,616,1,0,0, - 0,616,617,5,114,0,0,617,65,1,0,0,0,618,619,5,67,0,0,619,620,3,120, - 60,0,620,67,1,0,0,0,621,622,7,0,0,0,622,69,1,0,0,0,623,642,5,70, - 0,0,624,625,5,25,0,0,625,642,3,136,68,0,626,627,5,18,0,0,627,642, - 3,136,68,0,628,629,5,27,0,0,629,638,5,119,0,0,630,635,3,26,13,0, - 631,632,5,115,0,0,632,634,3,26,13,0,633,631,1,0,0,0,634,637,1,0, - 0,0,635,633,1,0,0,0,635,636,1,0,0,0,636,639,1,0,0,0,637,635,1,0, - 0,0,638,630,1,0,0,0,638,639,1,0,0,0,639,640,1,0,0,0,640,642,5,120, - 0,0,641,623,1,0,0,0,641,624,1,0,0,0,641,626,1,0,0,0,641,628,1,0, - 0,0,642,71,1,0,0,0,643,648,3,136,68,0,644,645,5,115,0,0,645,647, - 3,136,68,0,646,644,1,0,0,0,647,650,1,0,0,0,648,646,1,0,0,0,648,649, - 1,0,0,0,649,73,1,0,0,0,650,648,1,0,0,0,651,652,5,69,0,0,652,656, - 5,117,0,0,653,655,3,76,38,0,654,653,1,0,0,0,655,658,1,0,0,0,656, - 654,1,0,0,0,656,657,1,0,0,0,657,659,1,0,0,0,658,656,1,0,0,0,659, - 660,5,118,0,0,660,75,1,0,0,0,661,662,5,43,0,0,662,663,3,136,68,0, - 663,664,5,64,0,0,664,665,3,138,69,0,665,666,5,113,0,0,666,667,3, - 120,60,0,667,668,3,78,39,0,668,669,5,114,0,0,669,714,1,0,0,0,670, - 671,5,44,0,0,671,672,3,136,68,0,672,673,5,64,0,0,673,674,3,138,69, - 0,674,675,5,113,0,0,675,676,3,126,63,0,676,677,3,48,24,0,677,678, - 3,78,39,0,678,679,5,114,0,0,679,714,1,0,0,0,680,681,5,26,0,0,681, - 682,3,136,68,0,682,683,5,64,0,0,683,684,3,138,69,0,684,685,5,113, - 0,0,685,687,3,136,68,0,686,688,3,28,14,0,687,686,1,0,0,0,687,688, - 1,0,0,0,688,689,1,0,0,0,689,690,5,114,0,0,690,714,1,0,0,0,691,692, - 5,33,0,0,692,693,3,136,68,0,693,694,5,64,0,0,694,695,3,138,69,0, - 695,696,5,113,0,0,696,699,3,136,68,0,697,698,5,35,0,0,698,700,3, - 120,60,0,699,697,1,0,0,0,699,700,1,0,0,0,700,701,1,0,0,0,701,702, - 5,114,0,0,702,714,1,0,0,0,703,704,5,5,0,0,704,705,3,136,68,0,705, - 706,5,64,0,0,706,707,3,138,69,0,707,708,5,113,0,0,708,709,3,136, - 68,0,709,710,5,116,0,0,710,711,3,136,68,0,711,712,5,114,0,0,712, - 714,1,0,0,0,713,661,1,0,0,0,713,670,1,0,0,0,713,680,1,0,0,0,713, - 691,1,0,0,0,713,703,1,0,0,0,714,77,1,0,0,0,715,716,5,119,0,0,716, - 721,3,80,40,0,717,718,5,115,0,0,718,720,3,80,40,0,719,717,1,0,0, - 0,720,723,1,0,0,0,721,719,1,0,0,0,721,722,1,0,0,0,722,724,1,0,0, - 0,723,721,1,0,0,0,724,725,5,120,0,0,725,79,1,0,0,0,726,727,7,1,0, - 0,727,81,1,0,0,0,728,729,5,42,0,0,729,730,3,84,42,0,730,83,1,0,0, - 0,731,734,3,86,43,0,732,734,3,90,45,0,733,731,1,0,0,0,733,732,1, - 0,0,0,734,85,1,0,0,0,735,736,5,43,0,0,736,737,3,136,68,0,737,738, - 5,64,0,0,738,739,3,138,69,0,739,740,5,52,0,0,740,741,3,136,68,0, - 741,742,5,113,0,0,742,743,3,120,60,0,743,744,5,53,0,0,744,747,3, - 88,44,0,745,746,5,54,0,0,746,748,3,128,64,0,747,745,1,0,0,0,747, + 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, + 888,8,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,3,54,898,8,54,1, + 54,3,54,901,8,54,3,54,903,8,54,1,55,1,55,1,56,1,56,1,57,1,57,1,57, + 5,57,912,8,57,10,57,12,57,915,9,57,1,57,1,57,1,58,1,58,1,58,1,58, + 1,58,1,58,1,58,1,58,1,58,1,58,3,58,929,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,945,8,58, + 1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,954,8,58,1,58,1,58,1,58, + 1,58,1,58,1,58,3,58,962,8,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,975,8,58,1,58,1,58,1,58,1,58,1,58,1,58, + 1,58,1,58,1,58,1,58,3,58,987,8,58,1,58,1,58,3,58,991,8,58,1,59,1, + 59,1,59,1,59,1,59,1,59,1,59,3,59,1000,8,59,1,59,1,59,1,60,1,60,1, + 60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,3,60,1018, + 8,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60, + 1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,5,60,1040,8,60,10,60,12, + 60,1043,9,60,1,60,1,60,1,60,3,60,1048,8,60,3,60,1050,8,60,1,61,1, + 61,1,61,1,61,1,61,1,62,1,62,1,63,1,63,1,64,1,64,1,64,1,64,1,64,1, + 64,1,64,1,64,3,64,1069,8,64,1,65,1,65,1,65,1,65,5,65,1075,8,65,10, + 65,12,65,1078,9,65,3,65,1080,8,65,1,65,1,65,1,66,1,66,1,66,1,66, + 1,67,1,67,1,67,1,67,5,67,1092,8,67,10,67,12,67,1095,9,67,3,67,1097, + 8,67,1,67,1,67,1,68,1,68,1,69,1,69,1,69,0,0,70,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,0,7,1,0,81,85,2,0,76,80,82,83,2,0,76,77,82,83,2,0,78, + 80,82,83,1,0,101,108,1,0,88,91,3,0,2,15,55,55,129,129,1188,0,152, + 1,0,0,0,2,154,1,0,0,0,4,164,1,0,0,0,6,168,1,0,0,0,8,192,1,0,0,0, + 10,204,1,0,0,0,12,206,1,0,0,0,14,213,1,0,0,0,16,224,1,0,0,0,18,226, + 1,0,0,0,20,239,1,0,0,0,22,271,1,0,0,0,24,301,1,0,0,0,26,303,1,0, + 0,0,28,307,1,0,0,0,30,325,1,0,0,0,32,327,1,0,0,0,34,339,1,0,0,0, + 36,342,1,0,0,0,38,360,1,0,0,0,40,396,1,0,0,0,42,399,1,0,0,0,44,424, + 1,0,0,0,46,452,1,0,0,0,48,463,1,0,0,0,50,468,1,0,0,0,52,495,1,0, + 0,0,54,497,1,0,0,0,56,522,1,0,0,0,58,564,1,0,0,0,60,566,1,0,0,0, + 62,589,1,0,0,0,64,605,1,0,0,0,66,618,1,0,0,0,68,621,1,0,0,0,70,641, + 1,0,0,0,72,643,1,0,0,0,74,651,1,0,0,0,76,713,1,0,0,0,78,715,1,0, + 0,0,80,726,1,0,0,0,82,728,1,0,0,0,84,733,1,0,0,0,86,735,1,0,0,0, + 88,757,1,0,0,0,90,759,1,0,0,0,92,768,1,0,0,0,94,793,1,0,0,0,96,822, + 1,0,0,0,98,824,1,0,0,0,100,831,1,0,0,0,102,845,1,0,0,0,104,855,1, + 0,0,0,106,870,1,0,0,0,108,902,1,0,0,0,110,904,1,0,0,0,112,906,1, + 0,0,0,114,908,1,0,0,0,116,990,1,0,0,0,118,992,1,0,0,0,120,1049,1, + 0,0,0,122,1051,1,0,0,0,124,1056,1,0,0,0,126,1058,1,0,0,0,128,1068, + 1,0,0,0,130,1070,1,0,0,0,132,1083,1,0,0,0,134,1087,1,0,0,0,136,1100, + 1,0,0,0,138,1102,1,0,0,0,140,141,3,6,3,0,141,142,5,0,0,1,142,153, + 1,0,0,0,143,144,3,20,10,0,144,145,5,0,0,1,145,153,1,0,0,0,146,147, + 3,50,25,0,147,148,5,0,0,1,148,153,1,0,0,0,149,150,3,2,1,0,150,151, + 5,0,0,1,151,153,1,0,0,0,152,140,1,0,0,0,152,143,1,0,0,0,152,146, + 1,0,0,0,152,149,1,0,0,0,153,1,1,0,0,0,154,155,5,22,0,0,155,159,5, + 117,0,0,156,158,3,8,4,0,157,156,1,0,0,0,158,161,1,0,0,0,159,157, + 1,0,0,0,159,160,1,0,0,0,160,162,1,0,0,0,161,159,1,0,0,0,162,163, + 5,118,0,0,163,3,1,0,0,0,164,165,5,23,0,0,165,166,3,138,69,0,166, + 167,5,114,0,0,167,5,1,0,0,0,168,169,5,1,0,0,169,170,3,136,68,0,170, + 171,5,64,0,0,171,172,3,138,69,0,172,173,5,58,0,0,173,174,3,138,69, + 0,174,175,5,57,0,0,175,176,3,138,69,0,176,180,5,117,0,0,177,179, + 3,8,4,0,178,177,1,0,0,0,179,182,1,0,0,0,180,178,1,0,0,0,180,181, + 1,0,0,0,181,183,1,0,0,0,182,180,1,0,0,0,183,184,5,118,0,0,184,7, + 1,0,0,0,185,193,3,4,2,0,186,193,3,18,9,0,187,193,3,10,5,0,188,193, + 3,82,41,0,189,193,3,94,47,0,190,193,3,118,59,0,191,193,3,32,16,0, + 192,185,1,0,0,0,192,186,1,0,0,0,192,187,1,0,0,0,192,188,1,0,0,0, + 192,189,1,0,0,0,192,190,1,0,0,0,192,191,1,0,0,0,193,9,1,0,0,0,194, + 195,5,23,0,0,195,196,5,26,0,0,196,197,3,136,68,0,197,198,5,114,0, + 0,198,205,1,0,0,0,199,200,5,23,0,0,200,201,5,28,0,0,201,202,3,136, + 68,0,202,203,5,114,0,0,203,205,1,0,0,0,204,194,1,0,0,0,204,199,1, + 0,0,0,205,11,1,0,0,0,206,207,5,24,0,0,207,208,5,25,0,0,208,209,3, + 136,68,0,209,210,5,64,0,0,210,211,3,138,69,0,211,212,5,114,0,0,212, + 13,1,0,0,0,213,214,5,24,0,0,214,215,5,26,0,0,215,216,3,136,68,0, + 216,217,5,58,0,0,217,218,3,138,69,0,218,219,5,114,0,0,219,15,1,0, + 0,0,220,225,3,10,5,0,221,225,3,12,6,0,222,225,3,14,7,0,223,225,3, + 32,16,0,224,220,1,0,0,0,224,221,1,0,0,0,224,222,1,0,0,0,224,223, + 1,0,0,0,225,17,1,0,0,0,226,227,5,25,0,0,227,228,3,136,68,0,228,229, + 5,64,0,0,229,232,3,138,69,0,230,231,5,65,0,0,231,233,3,138,69,0, + 232,230,1,0,0,0,232,233,1,0,0,0,233,234,1,0,0,0,234,235,5,114,0, + 0,235,19,1,0,0,0,236,238,3,16,8,0,237,236,1,0,0,0,238,241,1,0,0, + 0,239,237,1,0,0,0,239,240,1,0,0,0,240,242,1,0,0,0,241,239,1,0,0, + 0,242,243,5,26,0,0,243,245,3,136,68,0,244,246,3,22,11,0,245,244, + 1,0,0,0,245,246,1,0,0,0,246,247,1,0,0,0,247,248,5,64,0,0,248,249, + 3,138,69,0,249,250,5,58,0,0,250,260,3,138,69,0,251,252,5,69,0,0, + 252,257,3,26,13,0,253,254,5,115,0,0,254,256,3,26,13,0,255,253,1, + 0,0,0,256,259,1,0,0,0,257,255,1,0,0,0,257,258,1,0,0,0,258,261,1, + 0,0,0,259,257,1,0,0,0,260,251,1,0,0,0,260,261,1,0,0,0,261,262,1, + 0,0,0,262,266,5,117,0,0,263,265,3,34,17,0,264,263,1,0,0,0,265,268, + 1,0,0,0,266,264,1,0,0,0,266,267,1,0,0,0,267,269,1,0,0,0,268,266, + 1,0,0,0,269,270,5,118,0,0,270,21,1,0,0,0,271,272,5,123,0,0,272,277, + 3,24,12,0,273,274,5,115,0,0,274,276,3,24,12,0,275,273,1,0,0,0,276, + 279,1,0,0,0,277,275,1,0,0,0,277,278,1,0,0,0,278,280,1,0,0,0,279, + 277,1,0,0,0,280,281,5,124,0,0,281,23,1,0,0,0,282,283,5,29,0,0,283, + 286,3,136,68,0,284,285,5,113,0,0,285,287,5,19,0,0,286,284,1,0,0, + 0,286,287,1,0,0,0,287,302,1,0,0,0,288,289,5,18,0,0,289,299,3,136, + 68,0,290,291,5,20,0,0,291,296,3,26,13,0,292,293,5,125,0,0,293,295, + 3,26,13,0,294,292,1,0,0,0,295,298,1,0,0,0,296,294,1,0,0,0,296,297, + 1,0,0,0,297,300,1,0,0,0,298,296,1,0,0,0,299,290,1,0,0,0,299,300, + 1,0,0,0,300,302,1,0,0,0,301,282,1,0,0,0,301,288,1,0,0,0,302,25,1, + 0,0,0,303,305,3,136,68,0,304,306,3,28,14,0,305,304,1,0,0,0,305,306, + 1,0,0,0,306,27,1,0,0,0,307,308,5,123,0,0,308,313,3,30,15,0,309,310, + 5,115,0,0,310,312,3,30,15,0,311,309,1,0,0,0,312,315,1,0,0,0,313, + 311,1,0,0,0,313,314,1,0,0,0,314,316,1,0,0,0,315,313,1,0,0,0,316, + 317,5,124,0,0,317,29,1,0,0,0,318,319,5,25,0,0,319,326,3,136,68,0, + 320,321,5,26,0,0,321,326,3,26,13,0,322,323,5,18,0,0,323,326,3,136, + 68,0,324,326,3,120,60,0,325,318,1,0,0,0,325,320,1,0,0,0,325,322, + 1,0,0,0,325,324,1,0,0,0,326,31,1,0,0,0,327,328,5,17,0,0,328,330, + 3,136,68,0,329,331,3,22,11,0,330,329,1,0,0,0,330,331,1,0,0,0,331, + 332,1,0,0,0,332,333,5,126,0,0,333,334,3,120,60,0,334,335,5,114,0, + 0,335,33,1,0,0,0,336,340,3,38,19,0,337,340,3,42,21,0,338,340,3,36, + 18,0,339,336,1,0,0,0,339,337,1,0,0,0,339,338,1,0,0,0,340,35,1,0, + 0,0,341,343,5,39,0,0,342,341,1,0,0,0,342,343,1,0,0,0,343,344,1,0, + 0,0,344,345,5,31,0,0,345,346,3,136,68,0,346,347,5,64,0,0,347,348, + 3,138,69,0,348,349,5,113,0,0,349,350,3,120,60,0,350,351,5,112,0, + 0,351,352,3,120,60,0,352,353,5,117,0,0,353,354,5,81,0,0,354,355, + 5,64,0,0,355,356,3,138,69,0,356,357,5,114,0,0,357,358,5,118,0,0, + 358,37,1,0,0,0,359,361,3,44,22,0,360,359,1,0,0,0,360,361,1,0,0,0, + 361,362,1,0,0,0,362,363,5,29,0,0,363,364,3,136,68,0,364,365,5,64, + 0,0,365,366,3,138,69,0,366,367,5,113,0,0,367,368,3,120,60,0,368, + 372,5,117,0,0,369,371,3,40,20,0,370,369,1,0,0,0,371,374,1,0,0,0, + 372,370,1,0,0,0,372,373,1,0,0,0,373,375,1,0,0,0,374,372,1,0,0,0, + 375,376,5,118,0,0,376,39,1,0,0,0,377,378,5,71,0,0,378,379,5,64,0, + 0,379,380,3,138,69,0,380,381,5,114,0,0,381,397,1,0,0,0,382,383,5, + 72,0,0,383,384,5,64,0,0,384,385,3,138,69,0,385,386,5,114,0,0,386, + 397,1,0,0,0,387,388,5,73,0,0,388,389,5,74,0,0,389,390,5,64,0,0,390, + 391,3,138,69,0,391,392,5,75,0,0,392,393,5,64,0,0,393,394,3,138,69, + 0,394,395,5,114,0,0,395,397,1,0,0,0,396,377,1,0,0,0,396,382,1,0, + 0,0,396,387,1,0,0,0,397,41,1,0,0,0,398,400,3,44,22,0,399,398,1,0, + 0,0,399,400,1,0,0,0,400,401,1,0,0,0,401,402,5,30,0,0,402,403,3,136, + 68,0,403,404,5,64,0,0,404,405,3,138,69,0,405,406,5,113,0,0,406,407, + 3,126,63,0,407,409,3,48,24,0,408,410,5,92,0,0,409,408,1,0,0,0,409, + 410,1,0,0,0,410,413,1,0,0,0,411,412,5,62,0,0,412,414,3,138,69,0, + 413,411,1,0,0,0,413,414,1,0,0,0,414,415,1,0,0,0,415,419,5,117,0, + 0,416,418,3,46,23,0,417,416,1,0,0,0,418,421,1,0,0,0,419,417,1,0, + 0,0,419,420,1,0,0,0,420,422,1,0,0,0,421,419,1,0,0,0,422,423,5,118, + 0,0,423,43,1,0,0,0,424,426,5,14,0,0,425,427,5,15,0,0,426,425,1,0, + 0,0,426,427,1,0,0,0,427,45,1,0,0,0,428,429,5,78,0,0,429,430,5,64, + 0,0,430,431,3,138,69,0,431,432,5,114,0,0,432,453,1,0,0,0,433,434, + 5,79,0,0,434,435,5,64,0,0,435,436,3,138,69,0,436,437,5,114,0,0,437, + 453,1,0,0,0,438,439,5,80,0,0,439,440,5,64,0,0,440,441,3,138,69,0, + 441,442,5,114,0,0,442,453,1,0,0,0,443,444,5,73,0,0,444,445,5,74, + 0,0,445,446,5,64,0,0,446,447,3,138,69,0,447,448,5,75,0,0,448,449, + 5,64,0,0,449,450,3,138,69,0,450,451,5,114,0,0,451,453,1,0,0,0,452, + 428,1,0,0,0,452,433,1,0,0,0,452,438,1,0,0,0,452,443,1,0,0,0,453, + 47,1,0,0,0,454,455,5,25,0,0,455,464,3,136,68,0,456,457,5,26,0,0, + 457,459,3,136,68,0,458,460,3,28,14,0,459,458,1,0,0,0,459,460,1,0, + 0,0,460,464,1,0,0,0,461,462,5,18,0,0,462,464,3,136,68,0,463,454, + 1,0,0,0,463,456,1,0,0,0,463,461,1,0,0,0,464,49,1,0,0,0,465,467,3, + 16,8,0,466,465,1,0,0,0,467,470,1,0,0,0,468,466,1,0,0,0,468,469,1, + 0,0,0,469,471,1,0,0,0,470,468,1,0,0,0,471,472,5,28,0,0,472,473,3, + 136,68,0,473,474,5,64,0,0,474,475,3,138,69,0,475,476,5,58,0,0,476, + 479,3,138,69,0,477,478,5,59,0,0,478,480,5,127,0,0,479,477,1,0,0, + 0,479,480,1,0,0,0,480,481,1,0,0,0,481,485,5,117,0,0,482,484,3,52, + 26,0,483,482,1,0,0,0,484,487,1,0,0,0,485,483,1,0,0,0,485,486,1,0, + 0,0,486,488,1,0,0,0,487,485,1,0,0,0,488,489,5,118,0,0,489,51,1,0, + 0,0,490,496,3,60,30,0,491,496,3,62,31,0,492,496,3,64,32,0,493,496, + 3,54,27,0,494,496,3,56,28,0,495,490,1,0,0,0,495,491,1,0,0,0,495, + 492,1,0,0,0,495,493,1,0,0,0,495,494,1,0,0,0,496,53,1,0,0,0,497,498, + 5,5,0,0,498,500,3,136,68,0,499,501,3,22,11,0,500,499,1,0,0,0,500, + 501,1,0,0,0,501,502,1,0,0,0,502,503,5,64,0,0,503,504,3,138,69,0, + 504,506,5,7,0,0,505,507,5,1,0,0,506,505,1,0,0,0,506,507,1,0,0,0, + 507,508,1,0,0,0,508,509,3,26,13,0,509,510,5,8,0,0,510,511,3,138, + 69,0,511,512,5,31,0,0,512,513,3,138,69,0,513,517,5,117,0,0,514,516, + 3,58,29,0,515,514,1,0,0,0,516,519,1,0,0,0,517,515,1,0,0,0,517,518, + 1,0,0,0,518,520,1,0,0,0,519,517,1,0,0,0,520,521,5,118,0,0,521,55, + 1,0,0,0,522,523,5,5,0,0,523,524,3,136,68,0,524,525,5,64,0,0,525, + 526,3,138,69,0,526,527,5,6,0,0,527,528,3,136,68,0,528,529,3,28,14, + 0,529,530,5,114,0,0,530,57,1,0,0,0,531,532,5,9,0,0,532,533,3,138, + 69,0,533,534,5,114,0,0,534,565,1,0,0,0,535,537,5,10,0,0,536,538, + 5,18,0,0,537,536,1,0,0,0,537,538,1,0,0,0,538,539,1,0,0,0,539,540, + 3,136,68,0,540,541,5,37,0,0,541,542,3,26,13,0,542,543,5,114,0,0, + 543,565,1,0,0,0,544,545,5,11,0,0,545,546,3,136,68,0,546,547,5,127, + 0,0,547,548,5,114,0,0,548,565,1,0,0,0,549,550,5,12,0,0,550,551,3, + 26,13,0,551,552,5,116,0,0,552,553,3,136,68,0,553,554,3,136,68,0, + 554,555,3,138,69,0,555,556,5,114,0,0,556,565,1,0,0,0,557,558,5,73, + 0,0,558,565,5,114,0,0,559,560,5,13,0,0,560,561,5,127,0,0,561,562, + 3,138,69,0,562,563,5,114,0,0,563,565,1,0,0,0,564,531,1,0,0,0,564, + 535,1,0,0,0,564,544,1,0,0,0,564,549,1,0,0,0,564,557,1,0,0,0,564, + 559,1,0,0,0,565,59,1,0,0,0,566,567,5,31,0,0,567,569,3,136,68,0,568, + 570,3,22,11,0,569,568,1,0,0,0,569,570,1,0,0,0,570,571,1,0,0,0,571, + 572,5,64,0,0,572,573,3,138,69,0,573,574,5,113,0,0,574,575,3,120, + 60,0,575,576,5,112,0,0,576,577,3,120,60,0,577,578,5,66,0,0,578,580, + 3,68,34,0,579,581,3,66,33,0,580,579,1,0,0,0,580,581,1,0,0,0,581, + 582,1,0,0,0,582,583,5,68,0,0,583,585,3,70,35,0,584,586,3,74,37,0, + 585,584,1,0,0,0,585,586,1,0,0,0,586,587,1,0,0,0,587,588,5,114,0, + 0,588,61,1,0,0,0,589,590,5,32,0,0,590,592,3,136,68,0,591,593,3,22, + 11,0,592,591,1,0,0,0,592,593,1,0,0,0,593,594,1,0,0,0,594,595,5,64, + 0,0,595,596,3,138,69,0,596,597,5,113,0,0,597,598,3,120,60,0,598, + 599,5,112,0,0,599,601,3,120,60,0,600,602,3,74,37,0,601,600,1,0,0, + 0,601,602,1,0,0,0,602,603,1,0,0,0,603,604,5,114,0,0,604,63,1,0,0, + 0,605,606,5,33,0,0,606,607,3,136,68,0,607,608,5,64,0,0,608,609,3, + 138,69,0,609,610,5,34,0,0,610,611,3,136,68,0,611,612,5,113,0,0,612, + 614,3,120,60,0,613,615,3,74,37,0,614,613,1,0,0,0,614,615,1,0,0,0, + 615,616,1,0,0,0,616,617,5,114,0,0,617,65,1,0,0,0,618,619,5,67,0, + 0,619,620,3,120,60,0,620,67,1,0,0,0,621,622,7,0,0,0,622,69,1,0,0, + 0,623,642,5,70,0,0,624,625,5,25,0,0,625,642,3,136,68,0,626,627,5, + 18,0,0,627,642,3,136,68,0,628,629,5,27,0,0,629,638,5,119,0,0,630, + 635,3,26,13,0,631,632,5,115,0,0,632,634,3,26,13,0,633,631,1,0,0, + 0,634,637,1,0,0,0,635,633,1,0,0,0,635,636,1,0,0,0,636,639,1,0,0, + 0,637,635,1,0,0,0,638,630,1,0,0,0,638,639,1,0,0,0,639,640,1,0,0, + 0,640,642,5,120,0,0,641,623,1,0,0,0,641,624,1,0,0,0,641,626,1,0, + 0,0,641,628,1,0,0,0,642,71,1,0,0,0,643,648,3,136,68,0,644,645,5, + 115,0,0,645,647,3,136,68,0,646,644,1,0,0,0,647,650,1,0,0,0,648,646, + 1,0,0,0,648,649,1,0,0,0,649,73,1,0,0,0,650,648,1,0,0,0,651,652,5, + 69,0,0,652,656,5,117,0,0,653,655,3,76,38,0,654,653,1,0,0,0,655,658, + 1,0,0,0,656,654,1,0,0,0,656,657,1,0,0,0,657,659,1,0,0,0,658,656, + 1,0,0,0,659,660,5,118,0,0,660,75,1,0,0,0,661,662,5,43,0,0,662,663, + 3,136,68,0,663,664,5,64,0,0,664,665,3,138,69,0,665,666,5,113,0,0, + 666,667,3,120,60,0,667,668,3,78,39,0,668,669,5,114,0,0,669,714,1, + 0,0,0,670,671,5,44,0,0,671,672,3,136,68,0,672,673,5,64,0,0,673,674, + 3,138,69,0,674,675,5,113,0,0,675,676,3,126,63,0,676,677,3,48,24, + 0,677,678,3,78,39,0,678,679,5,114,0,0,679,714,1,0,0,0,680,681,5, + 26,0,0,681,682,3,136,68,0,682,683,5,64,0,0,683,684,3,138,69,0,684, + 685,5,113,0,0,685,687,3,136,68,0,686,688,3,28,14,0,687,686,1,0,0, + 0,687,688,1,0,0,0,688,689,1,0,0,0,689,690,5,114,0,0,690,714,1,0, + 0,0,691,692,5,33,0,0,692,693,3,136,68,0,693,694,5,64,0,0,694,695, + 3,138,69,0,695,696,5,113,0,0,696,699,3,136,68,0,697,698,5,35,0,0, + 698,700,3,120,60,0,699,697,1,0,0,0,699,700,1,0,0,0,700,701,1,0,0, + 0,701,702,5,114,0,0,702,714,1,0,0,0,703,704,5,5,0,0,704,705,3,136, + 68,0,705,706,5,64,0,0,706,707,3,138,69,0,707,708,5,113,0,0,708,709, + 3,136,68,0,709,710,5,116,0,0,710,711,3,136,68,0,711,712,5,114,0, + 0,712,714,1,0,0,0,713,661,1,0,0,0,713,670,1,0,0,0,713,680,1,0,0, + 0,713,691,1,0,0,0,713,703,1,0,0,0,714,77,1,0,0,0,715,716,5,119,0, + 0,716,721,3,80,40,0,717,718,5,115,0,0,718,720,3,80,40,0,719,717, + 1,0,0,0,720,723,1,0,0,0,721,719,1,0,0,0,721,722,1,0,0,0,722,724, + 1,0,0,0,723,721,1,0,0,0,724,725,5,120,0,0,725,79,1,0,0,0,726,727, + 7,1,0,0,727,81,1,0,0,0,728,729,5,42,0,0,729,730,3,84,42,0,730,83, + 1,0,0,0,731,734,3,86,43,0,732,734,3,90,45,0,733,731,1,0,0,0,733, + 732,1,0,0,0,734,85,1,0,0,0,735,736,5,43,0,0,736,737,3,136,68,0,737, + 738,5,64,0,0,738,739,3,138,69,0,739,740,5,52,0,0,740,741,3,136,68, + 0,741,742,5,113,0,0,742,743,3,120,60,0,743,744,5,53,0,0,744,747, + 3,88,44,0,745,746,5,54,0,0,746,748,3,128,64,0,747,745,1,0,0,0,747, 748,1,0,0,0,748,749,1,0,0,0,749,750,5,114,0,0,750,87,1,0,0,0,751, 758,5,86,0,0,752,753,5,87,0,0,753,754,5,121,0,0,754,755,3,120,60, 0,755,756,5,122,0,0,756,758,1,0,0,0,757,751,1,0,0,0,757,752,1,0, @@ -4724,84 +4747,87 @@ export class QuixosCapabilityParser extends antlr.Parser { 1,0,0,0,870,864,1,0,0,0,870,865,1,0,0,0,870,866,1,0,0,0,870,867, 1,0,0,0,870,868,1,0,0,0,870,869,1,0,0,0,871,107,1,0,0,0,872,873, 5,43,0,0,873,874,3,136,68,0,874,875,5,116,0,0,875,876,3,110,55,0, - 876,895,1,0,0,0,877,878,5,44,0,0,878,879,3,136,68,0,879,880,5,116, + 876,903,1,0,0,0,877,878,5,44,0,0,878,879,3,136,68,0,879,880,5,116, 0,0,880,881,3,136,68,0,881,882,5,116,0,0,882,883,3,112,56,0,883, - 895,1,0,0,0,884,885,5,28,0,0,885,886,3,136,68,0,886,887,5,116,0, - 0,887,889,3,136,68,0,888,890,3,28,14,0,889,888,1,0,0,0,889,890,1, - 0,0,0,890,892,1,0,0,0,891,893,3,114,57,0,892,891,1,0,0,0,892,893, - 1,0,0,0,893,895,1,0,0,0,894,872,1,0,0,0,894,877,1,0,0,0,894,884, - 1,0,0,0,895,109,1,0,0,0,896,897,7,2,0,0,897,111,1,0,0,0,898,899, - 7,3,0,0,899,113,1,0,0,0,900,901,5,46,0,0,901,905,5,117,0,0,902,904, - 3,116,58,0,903,902,1,0,0,0,904,907,1,0,0,0,905,903,1,0,0,0,905,906, - 1,0,0,0,906,908,1,0,0,0,907,905,1,0,0,0,908,909,5,118,0,0,909,115, - 1,0,0,0,910,911,3,136,68,0,911,912,5,40,0,0,912,913,5,43,0,0,913, - 920,3,136,68,0,914,915,5,48,0,0,915,916,5,44,0,0,916,917,3,136,68, - 0,917,918,5,116,0,0,918,919,3,136,68,0,919,921,1,0,0,0,920,914,1, - 0,0,0,920,921,1,0,0,0,921,922,1,0,0,0,922,923,5,114,0,0,923,983, - 1,0,0,0,924,925,3,136,68,0,925,926,5,40,0,0,926,927,5,44,0,0,927, - 928,3,136,68,0,928,929,5,116,0,0,929,936,3,136,68,0,930,931,5,48, - 0,0,931,932,5,44,0,0,932,933,3,136,68,0,933,934,5,116,0,0,934,935, - 3,136,68,0,935,937,1,0,0,0,936,930,1,0,0,0,936,937,1,0,0,0,937,938, - 1,0,0,0,938,939,5,114,0,0,939,983,1,0,0,0,940,941,3,136,68,0,941, - 942,5,40,0,0,942,943,5,26,0,0,943,945,3,136,68,0,944,946,3,28,14, - 0,945,944,1,0,0,0,945,946,1,0,0,0,946,953,1,0,0,0,947,948,5,48,0, - 0,948,949,5,44,0,0,949,950,3,136,68,0,950,951,5,116,0,0,951,952, - 3,136,68,0,952,954,1,0,0,0,953,947,1,0,0,0,953,954,1,0,0,0,954,955, - 1,0,0,0,955,956,5,114,0,0,956,983,1,0,0,0,957,958,3,136,68,0,958, - 959,5,40,0,0,959,960,5,33,0,0,960,961,3,136,68,0,961,962,5,114,0, - 0,962,983,1,0,0,0,963,964,3,136,68,0,964,966,5,40,0,0,965,967,5, - 1,0,0,966,965,1,0,0,0,966,967,1,0,0,0,967,968,1,0,0,0,968,969,5, - 5,0,0,969,970,3,136,68,0,970,971,5,116,0,0,971,978,3,136,68,0,972, - 973,5,48,0,0,973,974,5,44,0,0,974,975,3,136,68,0,975,976,5,116,0, - 0,976,977,3,136,68,0,977,979,1,0,0,0,978,972,1,0,0,0,978,979,1,0, - 0,0,979,980,1,0,0,0,980,981,5,114,0,0,981,983,1,0,0,0,982,910,1, - 0,0,0,982,924,1,0,0,0,982,940,1,0,0,0,982,957,1,0,0,0,982,963,1, - 0,0,0,983,117,1,0,0,0,984,985,5,33,0,0,985,986,3,136,68,0,986,987, - 5,40,0,0,987,988,3,136,68,0,988,989,5,116,0,0,989,991,3,136,68,0, - 990,992,3,114,57,0,991,990,1,0,0,0,991,992,1,0,0,0,992,993,1,0,0, - 0,993,994,5,114,0,0,994,119,1,0,0,0,995,1042,3,124,62,0,996,1042, - 5,93,0,0,997,1042,5,94,0,0,998,999,5,95,0,0,999,1042,3,138,69,0, - 1000,1001,5,96,0,0,1001,1002,5,123,0,0,1002,1003,3,136,68,0,1003, - 1004,5,124,0,0,1004,1042,1,0,0,0,1005,1006,5,97,0,0,1006,1007,5, - 123,0,0,1007,1009,3,136,68,0,1008,1010,3,28,14,0,1009,1008,1,0,0, - 0,1009,1010,1,0,0,0,1010,1011,1,0,0,0,1011,1012,5,124,0,0,1012,1042, - 1,0,0,0,1013,1014,5,21,0,0,1014,1015,5,123,0,0,1015,1016,3,136,68, - 0,1016,1017,5,124,0,0,1017,1042,1,0,0,0,1018,1019,5,98,0,0,1019, - 1020,5,123,0,0,1020,1021,3,120,60,0,1021,1022,5,124,0,0,1022,1042, - 1,0,0,0,1023,1024,5,99,0,0,1024,1025,5,123,0,0,1025,1026,3,120,60, - 0,1026,1027,5,124,0,0,1027,1042,1,0,0,0,1028,1029,5,100,0,0,1029, - 1033,5,117,0,0,1030,1032,3,122,61,0,1031,1030,1,0,0,0,1032,1035, - 1,0,0,0,1033,1031,1,0,0,0,1033,1034,1,0,0,0,1034,1036,1,0,0,0,1035, - 1033,1,0,0,0,1036,1042,5,118,0,0,1037,1039,3,136,68,0,1038,1040, - 3,28,14,0,1039,1038,1,0,0,0,1039,1040,1,0,0,0,1040,1042,1,0,0,0, - 1041,995,1,0,0,0,1041,996,1,0,0,0,1041,997,1,0,0,0,1041,998,1,0, - 0,0,1041,1000,1,0,0,0,1041,1005,1,0,0,0,1041,1013,1,0,0,0,1041,1018, - 1,0,0,0,1041,1023,1,0,0,0,1041,1028,1,0,0,0,1041,1037,1,0,0,0,1042, - 121,1,0,0,0,1043,1044,3,136,68,0,1044,1045,5,113,0,0,1045,1046,3, - 120,60,0,1046,1047,5,114,0,0,1047,123,1,0,0,0,1048,1049,7,4,0,0, - 1049,125,1,0,0,0,1050,1051,7,5,0,0,1051,127,1,0,0,0,1052,1061,3, - 138,69,0,1053,1061,5,127,0,0,1054,1061,5,128,0,0,1055,1061,5,109, - 0,0,1056,1061,5,110,0,0,1057,1061,5,111,0,0,1058,1061,3,130,65,0, - 1059,1061,3,134,67,0,1060,1052,1,0,0,0,1060,1053,1,0,0,0,1060,1054, - 1,0,0,0,1060,1055,1,0,0,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,129,1,0,0,0,1062,1071,5,117, - 0,0,1063,1068,3,132,66,0,1064,1065,5,115,0,0,1065,1067,3,132,66, - 0,1066,1064,1,0,0,0,1067,1070,1,0,0,0,1068,1066,1,0,0,0,1068,1069, - 1,0,0,0,1069,1072,1,0,0,0,1070,1068,1,0,0,0,1071,1063,1,0,0,0,1071, - 1072,1,0,0,0,1072,1073,1,0,0,0,1073,1074,5,118,0,0,1074,131,1,0, - 0,0,1075,1076,3,138,69,0,1076,1077,5,113,0,0,1077,1078,3,128,64, - 0,1078,133,1,0,0,0,1079,1088,5,119,0,0,1080,1085,3,128,64,0,1081, - 1082,5,115,0,0,1082,1084,3,128,64,0,1083,1081,1,0,0,0,1084,1087, - 1,0,0,0,1085,1083,1,0,0,0,1085,1086,1,0,0,0,1086,1089,1,0,0,0,1087, - 1085,1,0,0,0,1088,1080,1,0,0,0,1088,1089,1,0,0,0,1089,1090,1,0,0, - 0,1090,1091,5,120,0,0,1091,135,1,0,0,0,1092,1093,7,6,0,0,1093,137, - 1,0,0,0,1094,1095,5,130,0,0,1095,139,1,0,0,0,94,152,159,180,192, + 903,1,0,0,0,884,885,5,26,0,0,885,887,3,136,68,0,886,888,3,28,14, + 0,887,886,1,0,0,0,887,888,1,0,0,0,888,889,1,0,0,0,889,890,5,116, + 0,0,890,891,3,104,52,0,891,903,1,0,0,0,892,893,5,28,0,0,893,894, + 3,136,68,0,894,895,5,116,0,0,895,897,3,136,68,0,896,898,3,28,14, + 0,897,896,1,0,0,0,897,898,1,0,0,0,898,900,1,0,0,0,899,901,3,114, + 57,0,900,899,1,0,0,0,900,901,1,0,0,0,901,903,1,0,0,0,902,872,1,0, + 0,0,902,877,1,0,0,0,902,884,1,0,0,0,902,892,1,0,0,0,903,109,1,0, + 0,0,904,905,7,2,0,0,905,111,1,0,0,0,906,907,7,3,0,0,907,113,1,0, + 0,0,908,909,5,46,0,0,909,913,5,117,0,0,910,912,3,116,58,0,911,910, + 1,0,0,0,912,915,1,0,0,0,913,911,1,0,0,0,913,914,1,0,0,0,914,916, + 1,0,0,0,915,913,1,0,0,0,916,917,5,118,0,0,917,115,1,0,0,0,918,919, + 3,136,68,0,919,920,5,40,0,0,920,921,5,43,0,0,921,928,3,136,68,0, + 922,923,5,48,0,0,923,924,5,44,0,0,924,925,3,136,68,0,925,926,5,116, + 0,0,926,927,3,136,68,0,927,929,1,0,0,0,928,922,1,0,0,0,928,929,1, + 0,0,0,929,930,1,0,0,0,930,931,5,114,0,0,931,991,1,0,0,0,932,933, + 3,136,68,0,933,934,5,40,0,0,934,935,5,44,0,0,935,936,3,136,68,0, + 936,937,5,116,0,0,937,944,3,136,68,0,938,939,5,48,0,0,939,940,5, + 44,0,0,940,941,3,136,68,0,941,942,5,116,0,0,942,943,3,136,68,0,943, + 945,1,0,0,0,944,938,1,0,0,0,944,945,1,0,0,0,945,946,1,0,0,0,946, + 947,5,114,0,0,947,991,1,0,0,0,948,949,3,136,68,0,949,950,5,40,0, + 0,950,951,5,26,0,0,951,953,3,136,68,0,952,954,3,28,14,0,953,952, + 1,0,0,0,953,954,1,0,0,0,954,961,1,0,0,0,955,956,5,48,0,0,956,957, + 5,44,0,0,957,958,3,136,68,0,958,959,5,116,0,0,959,960,3,136,68,0, + 960,962,1,0,0,0,961,955,1,0,0,0,961,962,1,0,0,0,962,963,1,0,0,0, + 963,964,5,114,0,0,964,991,1,0,0,0,965,966,3,136,68,0,966,967,5,40, + 0,0,967,968,5,33,0,0,968,969,3,136,68,0,969,970,5,114,0,0,970,991, + 1,0,0,0,971,972,3,136,68,0,972,974,5,40,0,0,973,975,5,1,0,0,974, + 973,1,0,0,0,974,975,1,0,0,0,975,976,1,0,0,0,976,977,5,5,0,0,977, + 978,3,136,68,0,978,979,5,116,0,0,979,986,3,136,68,0,980,981,5,48, + 0,0,981,982,5,44,0,0,982,983,3,136,68,0,983,984,5,116,0,0,984,985, + 3,136,68,0,985,987,1,0,0,0,986,980,1,0,0,0,986,987,1,0,0,0,987,988, + 1,0,0,0,988,989,5,114,0,0,989,991,1,0,0,0,990,918,1,0,0,0,990,932, + 1,0,0,0,990,948,1,0,0,0,990,965,1,0,0,0,990,971,1,0,0,0,991,117, + 1,0,0,0,992,993,5,33,0,0,993,994,3,136,68,0,994,995,5,40,0,0,995, + 996,3,136,68,0,996,997,5,116,0,0,997,999,3,136,68,0,998,1000,3,114, + 57,0,999,998,1,0,0,0,999,1000,1,0,0,0,1000,1001,1,0,0,0,1001,1002, + 5,114,0,0,1002,119,1,0,0,0,1003,1050,3,124,62,0,1004,1050,5,93,0, + 0,1005,1050,5,94,0,0,1006,1007,5,95,0,0,1007,1050,3,138,69,0,1008, + 1009,5,96,0,0,1009,1010,5,123,0,0,1010,1011,3,136,68,0,1011,1012, + 5,124,0,0,1012,1050,1,0,0,0,1013,1014,5,97,0,0,1014,1015,5,123,0, + 0,1015,1017,3,136,68,0,1016,1018,3,28,14,0,1017,1016,1,0,0,0,1017, + 1018,1,0,0,0,1018,1019,1,0,0,0,1019,1020,5,124,0,0,1020,1050,1,0, + 0,0,1021,1022,5,21,0,0,1022,1023,5,123,0,0,1023,1024,3,136,68,0, + 1024,1025,5,124,0,0,1025,1050,1,0,0,0,1026,1027,5,98,0,0,1027,1028, + 5,123,0,0,1028,1029,3,120,60,0,1029,1030,5,124,0,0,1030,1050,1,0, + 0,0,1031,1032,5,99,0,0,1032,1033,5,123,0,0,1033,1034,3,120,60,0, + 1034,1035,5,124,0,0,1035,1050,1,0,0,0,1036,1037,5,100,0,0,1037,1041, + 5,117,0,0,1038,1040,3,122,61,0,1039,1038,1,0,0,0,1040,1043,1,0,0, + 0,1041,1039,1,0,0,0,1041,1042,1,0,0,0,1042,1044,1,0,0,0,1043,1041, + 1,0,0,0,1044,1050,5,118,0,0,1045,1047,3,136,68,0,1046,1048,3,28, + 14,0,1047,1046,1,0,0,0,1047,1048,1,0,0,0,1048,1050,1,0,0,0,1049, + 1003,1,0,0,0,1049,1004,1,0,0,0,1049,1005,1,0,0,0,1049,1006,1,0,0, + 0,1049,1008,1,0,0,0,1049,1013,1,0,0,0,1049,1021,1,0,0,0,1049,1026, + 1,0,0,0,1049,1031,1,0,0,0,1049,1036,1,0,0,0,1049,1045,1,0,0,0,1050, + 121,1,0,0,0,1051,1052,3,136,68,0,1052,1053,5,113,0,0,1053,1054,3, + 120,60,0,1054,1055,5,114,0,0,1055,123,1,0,0,0,1056,1057,7,4,0,0, + 1057,125,1,0,0,0,1058,1059,7,5,0,0,1059,127,1,0,0,0,1060,1069,3, + 138,69,0,1061,1069,5,127,0,0,1062,1069,5,128,0,0,1063,1069,5,109, + 0,0,1064,1069,5,110,0,0,1065,1069,5,111,0,0,1066,1069,3,130,65,0, + 1067,1069,3,134,67,0,1068,1060,1,0,0,0,1068,1061,1,0,0,0,1068,1062, + 1,0,0,0,1068,1063,1,0,0,0,1068,1064,1,0,0,0,1068,1065,1,0,0,0,1068, + 1066,1,0,0,0,1068,1067,1,0,0,0,1069,129,1,0,0,0,1070,1079,5,117, + 0,0,1071,1076,3,132,66,0,1072,1073,5,115,0,0,1073,1075,3,132,66, + 0,1074,1072,1,0,0,0,1075,1078,1,0,0,0,1076,1074,1,0,0,0,1076,1077, + 1,0,0,0,1077,1080,1,0,0,0,1078,1076,1,0,0,0,1079,1071,1,0,0,0,1079, + 1080,1,0,0,0,1080,1081,1,0,0,0,1081,1082,5,118,0,0,1082,131,1,0, + 0,0,1083,1084,3,138,69,0,1084,1085,5,113,0,0,1085,1086,3,128,64, + 0,1086,133,1,0,0,0,1087,1096,5,119,0,0,1088,1093,3,128,64,0,1089, + 1090,5,115,0,0,1090,1092,3,128,64,0,1091,1089,1,0,0,0,1092,1095, + 1,0,0,0,1093,1091,1,0,0,0,1093,1094,1,0,0,0,1094,1097,1,0,0,0,1095, + 1093,1,0,0,0,1096,1088,1,0,0,0,1096,1097,1,0,0,0,1097,1098,1,0,0, + 0,1098,1099,5,120,0,0,1099,135,1,0,0,0,1100,1101,7,6,0,0,1101,137, + 1,0,0,0,1102,1103,5,130,0,0,1103,139,1,0,0,0,95,152,159,180,192, 204,224,232,239,245,257,260,266,277,286,296,299,301,305,313,325, 330,339,342,360,372,396,399,409,413,419,426,452,459,463,468,479, 485,495,500,506,517,537,564,569,580,585,592,601,614,635,638,641, 648,656,687,699,713,721,733,747,757,775,779,782,786,789,798,802, - 806,812,822,851,870,889,892,894,905,920,936,945,953,966,978,982, - 991,1009,1033,1039,1041,1060,1068,1071,1085,1088 + 806,812,822,851,870,887,897,900,902,913,928,944,953,961,974,986, + 990,999,1017,1041,1047,1049,1068,1076,1079,1093,1096 ]; private static __ATN: antlr.ATN; @@ -7233,12 +7259,18 @@ export class OperationProviderContext extends antlr.ParserRuleContext { public edgePrimitive(): EdgePrimitiveContext | null { return this.getRuleContext(0, EdgePrimitiveContext); } - public PACKAGE(): antlr.TerminalNode | null { - return this.getToken(QuixosCapabilityParser.PACKAGE, 0); + public INTERFACE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.INTERFACE, 0); + } + public memberOperationRef(): MemberOperationRefContext | null { + return this.getRuleContext(0, MemberOperationRefContext); } public typeArguments(): TypeArgumentsContext | null { return this.getRuleContext(0, TypeArgumentsContext); } + public PACKAGE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.PACKAGE, 0); + } public dependencyBindingBlock(): DependencyBindingBlockContext | null { return this.getRuleContext(0, DependencyBindingBlockContext); } diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index 90db767..8dc9c12 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -1787,6 +1787,36 @@ const lowerConformance = ( return []; } const provider = bindingContext.operationProvider(); + if (provider.INTERFACE()) { + const targetName = identifier(provider.identifier(0)); + let target = requireSymbol(state, state.interfaces, targetName, provider, "interface"); + if (!target) return []; + if (provider.typeArguments() || target.definition?.template) { + const id = new TypeSubstitution({ ...state.types.environment(), self: atomId }).application( + state.types.interfaceByName(targetName, provider.typeArguments()), + ); + target = interfaceSymbolFor(state.types.definitions.get(id)!); + } + const ref = provider.memberOperationRef()!; + const member = target.members.get(identifier(ref.identifier())); + const targetOperation = member?.operations.get(text(ref.operationName())); + if (!targetOperation) { + loweringIssue( + state, + provider, + "unknown-operation", + "Forwarding target must name an interface member operation", + ); + return []; + } + return [ + { + operationId, + binding: { kind: "interface", interfaceRevisionId: target.revisionId, operationId: targetOperation }, + ...(bindingContext.stringLiteral() ? { queryReason: stringValue(bindingContext.stringLiteral()!) } : {}), + }, + ]; + } if (provider.STATE()) { const attachmentName = identifier(provider.identifier(0)); const attachment = requireSymbol(state, state.attachments, attachmentName, provider, "attachment"); diff --git a/src/capability-model/evolution.ts b/src/capability-model/evolution.ts index f276208..1dcbb05 100644 --- a/src/capability-model/evolution.ts +++ b/src/capability-model/evolution.ts @@ -167,8 +167,22 @@ export const runtimeContracts = (workspace: WorkspaceRevision): RuntimeContract[ parent.dependencies.add(conformanceKey(conformance.atomId, conformance.interfaceRevisionId)); reviews?.add(conformanceIdentity(conformance)); for (const operation of conformance.operationBindings) { - if (operation.binding.kind !== "package") continue; - const revisionId = operation.binding.packageRevisionId; + let provider: Binding | undefined = operation.binding; + const visited = new Set(); + while (provider?.kind === "interface") { + const forward: Extract = provider; + const key = `${provider.interfaceRevisionId}\0${provider.operationId}`; + if (visited.has(key)) throw new Error("Forwarding cycle in evolution contract"); + visited.add(key); + const target = workspace.conformances.find( + (c) => c.atomId === conformance.atomId && c.interfaceRevisionId === forward.interfaceRevisionId, + ); + if (!target) throw new Error("Missing forwarding conformance in evolution contract"); + reviews?.add(conformanceIdentity(target)); + provider = target.operationBindings.find((entry) => entry.operationId === forward.operationId)?.binding; + } + if (provider?.kind !== "package") continue; + const revisionId = provider.packageRevisionId; const pkg = workspace.packageImports.find((entry) => entry.revisionId === revisionId); if (pkg) reviews?.add(pkg.packageId); } diff --git a/src/capability-model/forwarding.ts b/src/capability-model/forwarding.ts new file mode 100644 index 0000000..7a76bde --- /dev/null +++ b/src/capability-model/forwarding.ts @@ -0,0 +1,36 @@ +import type { + AtomId, + Binding, + Conformance, + InterfaceRevisionId, + OperationBinding, + OperationId, + WorkspaceRevision, +} from "./types.js"; + +export type ConcreteBinding = Exclude; +export type ResolvedBinding = { conformance: Conformance; entry: OperationBinding; binding: ConcreteBinding }; + +/** Follow public operations on the same receiver, never private attachment names. */ +export function resolveForwardedBinding( + workspace: Pick, + atomId: AtomId, + interfaceRevisionId: InterfaceRevisionId, + operationId: OperationId, +): ResolvedBinding { + const visited = new Set(); + for (;;) { + const key = `${interfaceRevisionId}\0${operationId}`; + if (visited.has(key)) throw new Error(`Forwarding cycle at ${interfaceRevisionId}/${operationId}`); + visited.add(key); + const conformance = workspace.conformances.find( + (c) => c.atomId === atomId && c.interfaceRevisionId === interfaceRevisionId, + ); + const entry = conformance?.operationBindings.find((b) => b.operationId === operationId); + if (!conformance || !entry) + throw new Error(`Missing forwarding target ${atomId} as ${interfaceRevisionId}/${operationId}`); + if (entry.binding.kind !== "interface") return { conformance, entry, binding: entry.binding }; + interfaceRevisionId = entry.binding.interfaceRevisionId; + operationId = entry.binding.operationId; + } +} diff --git a/src/capability-model/types.ts b/src/capability-model/types.ts index e8b9fbc..6f7bb34 100644 --- a/src/capability-model/types.ts +++ b/src/capability-model/types.ts @@ -337,6 +337,11 @@ export interface RelationshipMaterialization { } export type Binding = + | { + kind: "interface"; + interfaceRevisionId: InterfaceRevisionId; + operationId: OperationId; + } | { kind: "state"; slotId: SlotId; diff --git a/src/capability-model/validation.ts b/src/capability-model/validation.ts index ead86f8..3f7fea7 100644 --- a/src/capability-model/validation.ts +++ b/src/capability-model/validation.ts @@ -1,3 +1,4 @@ +import { resolveForwardedBinding, type ConcreteBinding } from "./forwarding.js"; import type { AtomConstructorBinding, AtomId, @@ -66,6 +67,7 @@ export type CapabilityValidationIssueCode = | "invalid-state-binding" | "invalid-edge-binding" | "invalid-package-binding" + | "invalid-forwarding-binding" | "invalid-dependency-binding" | "private-attachment-access" | "incompatible-package-receiver" @@ -1521,7 +1523,32 @@ const validateConformances = ( continue; } const operation = operationEntry.operation; - const binding = entry.binding; + let binding: ConcreteBinding; + if (entry.binding.kind === "interface") { + const target = indexes.interfaces + .get(entry.binding.interfaceRevisionId) + ?.operations.get(entry.binding.operationId)?.operation; + if (!target || !signaturesMatch(operation, target) || operation.scope !== target.scope) { + issue( + issues, + "invalid-forwarding-binding", + bindingPath, + "Forwarding requires matching signatures, modes and receiver scopes", + ); + continue; + } + try { + binding = resolveForwardedBinding( + workspace, + conformance.atomId, + conformance.interfaceRevisionId, + entry.operationId, + ).binding; + } catch (error) { + issue(issues, "invalid-forwarding-binding", bindingPath, String(error)); + continue; + } + } else binding = entry.binding; const member = operationEntry.member; if ( member.kind !== "operation" && @@ -1556,6 +1583,9 @@ const validateConformances = ( ); continue; } + // The target conformance validates the concrete provider and its private + // authority. Forwarding exposes that operation, not its attachment ports. + if (entry.binding.kind === "interface") continue; if (operation.scope === "class" && binding.kind !== "package") { issue( issues, @@ -1760,6 +1790,49 @@ const validateConformances = ( }); } + for (const member of interfaceEntry.revision.members) { + const start = member.operations.find((op) => op.mode === "watch-start"); + const stop = member.operations.find((op) => op.mode === "watch-stop"); + if (!start || !stop || ![start, stop].some((op) => bindings.get(op.id)?.kind === "interface")) continue; + try { + const a = resolveForwardedBinding(workspace, conformance.atomId, conformance.interfaceRevisionId, start.id); + const b = resolveForwardedBinding(workspace, conformance.atomId, conformance.interfaceRevisionId, stop.id); + const target = indexes.interfaces + .get(a.conformance.interfaceRevisionId) + ?.revision.members.find((m) => m.operations.some((op) => op.id === a.entry.operationId)); + if (a.conformance !== b.conformance || !target?.operations.some((op) => op.id === b.entry.operationId)) + issue( + issues, + "invalid-forwarding-binding", + path, + "Forwarded watch start/stop must resolve to the same target member", + ); + const get = member.operations.find((op) => op.displayName === (member.kind === "value" ? "get" : "resolve")); + if (get && (a.binding.kind === "state" || a.binding.kind === "edge")) { + const read = resolveForwardedBinding( + workspace, + conformance.atomId, + conformance.interfaceRevisionId, + get.id, + ).binding; + const matches = + a.binding.kind === "state" + ? read.kind === "state" && read.slotId === a.binding.slotId + : read.kind === "edge" && + read.edgeTypeId === a.binding.edgeTypeId && + read.projectionId === a.binding.projectionId; + if (!matches) + issue( + issues, + "invalid-forwarding-binding", + path, + "Native forwarded watch must observe its getter's storage", + ); + } + } catch (error) { + issue(issues, "invalid-forwarding-binding", path, String(error)); + } + } const materializedMembers = new Set(); for (const [materializationIndex, materialization] of (conformance.relationshipMaterializations ?? []).entries()) { const materializationPath = `${path}.relationshipMaterializations[${materializationIndex}]`; @@ -2063,7 +2136,10 @@ export const resolveOperationBinding = ( atomId: AtomId, interfaceRevisionId: InterfaceRevisionId, operationId: OperationId, -): Binding | undefined => resolveConformance(plan, atomId, interfaceRevisionId)?.operationBindings.get(operationId); +): ConcreteBinding | undefined => { + if (!resolveConformance(plan, atomId, interfaceRevisionId)?.operationBindings.has(operationId)) return undefined; + return resolveForwardedBinding(plan.source, atomId, interfaceRevisionId, operationId).binding; +}; export type ResolvedOperationPlan = | { @@ -2259,6 +2335,8 @@ export const computeCapabilityClosure = ( attachments.add(binding.slotId); } else if (binding.kind === "edge") { attachments.add(binding.edgeTypeId); + } else if (binding.kind === "interface") { + queued.push({ atomId: root.atomId, interfaceRevisionId: binding.interfaceRevisionId }); } else { packages.add(binding.packageRevisionId); includeDependencies(root.atomId, binding.dependencies); diff --git a/src/query/link.ts b/src/query/link.ts index f89975f..c22a43c 100644 --- a/src/query/link.ts +++ b/src/query/link.ts @@ -10,6 +10,7 @@ import type { import { QueryCompileError, type CheckedQuery } from "./types.js"; import { queryRuntimePlan } from "./proto.js"; import { canonicalJson } from "../capability-model/evolution.js"; +import { resolveForwardedBinding } from "../capability-model/forwarding.js"; export interface LinkedQueryField { atomId: AtomId; @@ -74,7 +75,12 @@ export function linkQueries(workspace: WorkspaceRevision): LinkedQuery[] { const provider = conformance.operationBindings.find((entry) => entry.operationId === getter.id); if (!provider) throw new QueryCompileError("QUERY_CONTRACT", `Missing binding ${conformance.atomId}.${getter.id}`); - const binding = provider.binding; + const binding = resolveForwardedBinding( + workspace, + conformance.atomId, + conformance.interfaceRevisionId, + getter.id, + ).binding; if (binding.kind === "package") { if (effect.execution !== "rpc-permitted") throw new QueryCompileError( @@ -95,7 +101,10 @@ export function linkQueries(workspace: WorkspaceRevision): LinkedQuery[] { ); const start = member.operations.find((op) => op.displayName === "watch-start"); const stop = member.operations.find((op) => op.displayName === "watch-stop"); - const watch = start && stop && conformance.operationBindings.find((entry) => entry.operationId === start.id); + const watch = + start && stop && conformance.operationBindings.some((entry) => entry.operationId === start.id) + ? resolveForwardedBinding(workspace, conformance.atomId, conformance.interfaceRevisionId, start.id) + : undefined; if ( binding.kind === "state" && watch && diff --git a/test/forwarding.test.ts b/test/forwarding.test.ts new file mode 100644 index 0000000..13492d8 --- /dev/null +++ b/test/forwarding.test.ts @@ -0,0 +1,149 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/index.js"; +import { compileWorkspaceRevision, resolveOperationPlan } from "../src/capability-model/validation.js"; +import { capabilityId, type InterfaceRevision } from "../src/capability-model/types.js"; +import { compileQuery } from "../src/query/compile.js"; +import { linkQueries } from "../src/query/link.js"; +import { compileCapabilityFixture, fixtureId } from "./fixtures/capability-model.js"; + +const source = { repository: "https://example.test/forwarding.git", commit: "a".repeat(40) }; +function fixture(transform = (s: string) => s, generic = false) { + const interfaces = new Map(); + for (const name of ["Owner", "Alias", "Relay"]) { + const result = compileCapabilityResourceSource( + `interface ${name}${generic && name === "Owner" ? "" : ""} id "${name}" revision "${name}@1" { + queryable value title id "${name}:title" : ${generic && name === "Owner" ? "T" : "string"} { + get id "${name}:get"; set id "${name}:set"; + watch start id "${name}:start" stop id "${name}:stop"; + } + }`, + { source }, + ); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + if (result.resource.kind !== "interface") throw new Error("interface expected"); + interfaces.set(name, result.resource.revision); + } + const forward = (name: string, target: string) => `conform Item as ${name} id "${name}-conformance" { + bind title.get to interface ${target}.title.get; + bind title.set to interface ${target}.title.set; + bind title.watch-start to interface ${target}.title.watch-start; + bind title.watch-stop to interface ${target}.title.watch-stop; + }`; + const text = `workspace Test id "ws" revision "ws@1" commit "${source.commit}" { + import interface Owner; import interface Alias; import interface Relay; + atom Item id "item"; + ${forward("Relay", "Alias")} + ${forward("Alias", generic ? "Owner" : "Owner")} + conform Item as Owner${generic ? "" : ""} id "owner-conformance" { + private state Title id "title" on Item : string policy optimistic-register default ""; + bind title to state Title; + } + }`; + return { result: compileCapabilitySource(transform(text), "workspace.qx", { interfaces }), interfaces }; +} + +test("bind chains forward native reads, writes and watches without changing storage ownership", async () => { + const { result, interfaces } = fixture(); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const compiled = compileWorkspaceRevision(result.workspace); + assert.ok(compiled.ok); + for (const [operation, primitive] of [ + ["get", "read"], + ["set", "write"], + ["start", "watch-start"], + ["stop", "watch-stop"], + ]) { + const resolved = resolveOperationPlan( + compiled.plan, + capabilityId.atom("item"), + capabilityId.interfaceRevision("Relay@1"), + capabilityId.operation(`Relay:${operation}`), + ); + assert.equal(resolved?.binding.kind, "state"); + if (resolved?.kind !== "state") throw new Error("state expected"); + assert.equal(resolved.binding.primitive, primitive); + assert.deepEqual(resolved.attachment.owner, { + kind: "conformance", + atomId: "item", + interfaceRevisionId: "Owner@1", + }); + } + const pkg = compileCapabilityResourceSource( + `import interface Relay; + package Views id "views" revision "views@1" { query Rows id "rows" root workspace Relay document "rows.graphql" operation "Rows" {max rows 10; watch;} }`, + { source, environment: { interfaces } }, + ); + assert.ok(pkg.ok, JSON.stringify(pkg.diagnostics)); + if (pkg.resource.kind !== "package") throw new Error("package expected"); + const revision = pkg.resource.revision; + revision.checkedQueries = [ + await compileQuery( + revision.queries![0]!, + [...interfaces.values()], + async () => `query Rows {root {objects(first: 10) {entries {node {title @live}}}}}`, + ), + ]; + result.workspace.packageImports.push(revision); + const linked = linkQueries(result.workspace)[0]!; + assert.equal(linked.fields[0]!.binding.kind, "state"); + assert.equal(linked.attachments[0]!.id, "title"); +}); + +test("forwarding rejects cycles, wrong signatures, missing targets, and direct private access", () => { + for (const transform of [ + (s: string) => s.replaceAll("interface Owner.title", "interface Relay.title"), + (s: string) => s.replace("interface Owner.title.get", "interface Owner.title.set"), + (s: string) => + s + .replace("conform Item as Owner", "conform Other as Owner") + .replace('atom Item id "item";', 'atom Item id "item"; atom Other id "other";') + .replace("on Item :", "on Other :"), + (s: string) => s.replace("interface Owner.title.get", "state Title.read"), + (s: string) => s.replace("interface Owner.title.watch-stop", "interface Relay.title.watch-stop"), + ]) + assert.equal(fixture(transform).result.ok, false); +}); + +test("forwarding closes generic targets and rejects incompatible applications", () => { + const good = fixture(undefined, true).result; + assert.ok(good.ok, JSON.stringify(good.diagnostics)); + const bad = fixture( + (s) => s.replace("interface Owner.title.get", "interface Owner.title.get"), + true, + ).result; + assert.equal(bad.ok, false); +}); + +test("forwarded package actions retain the provider and its dependency ports", () => { + const fixture = compileCapabilityFixture(); + assert.ok(fixture.ok, JSON.stringify(fixture.diagnostics)); + const ws = fixture.workspace; + const target = ws.interfaceImports.find((i) => i.revisionId === fixtureId.summaryV1)!; + const alias = { + ...structuredClone(target), + interfaceId: capabilityId.interface("alias"), + revisionId: capabilityId.interfaceRevision("alias@1"), + }; + ws.interfaceImports.push(alias); + ws.conformances.push({ + atomId: fixtureId.project, + interfaceRevisionId: alias.revisionId, + id: capabilityId.conformance("alias-owner"), + privateAttachments: [], + relationshipMaterializations: [], + operationBindings: [ + { + operationId: fixtureId.summaryGet, + binding: { kind: "interface", interfaceRevisionId: fixtureId.summaryV1, operationId: fixtureId.summaryGet }, + }, + ], + }); + const result = compileWorkspaceRevision(ws); + assert.ok(result.ok, JSON.stringify(result)); + const plan = resolveOperationPlan(result.plan, fixtureId.project, alias.revisionId, fixtureId.summaryGet); + assert.equal(plan?.kind, "package"); + if (plan?.kind !== "package") throw new Error("package expected"); + assert.equal(plan.binding.exportId, fixtureId.summaryGetExport); + assert.ok(plan.dependencies.length > 0); +}); From 757531bb63b1c00250d969c67fb615b3040a9b5e Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Fri, 18 Sep 2026 18:54:09 -0700 Subject: [PATCH 05/91] Add activated workspace reflection and Studio definition watches Expose bounded snapshot-bound definition reads and latest-only watches from the serving checked bundle. Add checked reflection dependency ports, generated SDK bindings and selector-scoped invocation authority. Move Studio factory, contract and query discovery to public reflection inventories. Share an active-definition watch across canvas and standalone routes and invalidate/reload on epoch changes instead of polling GetWorkspace. Document the API and deferred scope; cover compiler/codegen, SDK injection, transport authorization, activation publication, pagination and reconnect behavior. Keep all work local; no deployment or publication. --- grammar/QuixosCapability.g4 | 9 +- proto/quixos/orch.proto | 79 + proto/quixos/refs.proto | 7 + src/bindings/generics.ts | 2 + src/bindings/index.ts | 6 + .../generated/QuixosCapability.interp | 4 +- .../generated/QuixosCapability.tokens | 500 ++-- .../generated/QuixosCapabilityLexer.interp | 5 +- .../generated/QuixosCapabilityLexer.tokens | 500 ++-- .../generated/QuixosCapabilityLexer.ts | 1210 +++++----- .../generated/QuixosCapabilityParser.ts | 2022 +++++++++-------- src/capability-language/parser.ts | 15 + src/capability-model/generic-packages.ts | 3 +- src/capability-model/types.ts | 2 + src/capability-model/validation.ts | 24 + src/gen/quixos/orch_pb.ts | 481 +++- src/gen/quixos/refs_pb.ts | 41 +- test/bindings.test.ts | 11 + test/generic-packages.test.ts | 6 + test/reflection.test.ts | 48 + 20 files changed, 2870 insertions(+), 2105 deletions(-) create mode 100644 test/reflection.test.ts diff --git a/grammar/QuixosCapability.g4 b/grammar/QuixosCapability.g4 index d847595..b2c4444 100644 --- a/grammar/QuixosCapability.g4 +++ b/grammar/QuixosCapability.g4 @@ -207,7 +207,8 @@ dependencyBlock ; dependencyPort - : STATE identifier ID stringLiteral COLON valueType primitiveList SEMI + : REFLECTION identifier ID stringLiteral LBRACK identifierList RBRACK SEMI + | STATE identifier ID stringLiteral COLON valueType primitiveList SEMI | EDGE identifier ID stringLiteral COLON cardinality targetConstraint primitiveList SEMI | INTERFACE identifier ID stringLiteral COLON identifier typeArguments? SEMI | CONSTRUCTOR identifier ID stringLiteral COLON identifier (INPUT valueType)? SEMI @@ -325,7 +326,8 @@ dependencyBindingBlock ; dependencyBinding - : identifier TO STATE identifier (VIA EDGE identifier DOT identifier)? SEMI + : identifier TO WORKSPACE REFLECTION LBRACK identifierList RBRACK SEMI + | identifier TO STATE identifier (VIA EDGE identifier DOT identifier)? SEMI | identifier TO EDGE identifier DOT identifier (VIA EDGE identifier DOT identifier)? SEMI | identifier TO INTERFACE identifier typeArguments? (VIA EDGE identifier DOT identifier)? SEMI | identifier TO CONSTRUCTOR identifier SEMI @@ -397,6 +399,8 @@ jsonArray identifier : IDENTIFIER + | INTERFACES + | REFLECTION | SOURCE | QUERY | SPECIALIZE @@ -423,6 +427,7 @@ RESULT_BYTES: 'result-bytes'; RPC_CALLS: 'rpc-calls'; DEADLINE_MS: 'deadline-ms'; QUERY: 'query'; +REFLECTION: 'reflection'; SPECIALIZE: 'specialize'; ROOT: 'root'; DOCUMENT: 'document'; diff --git a/proto/quixos/orch.proto b/proto/quixos/orch.proto index 6eae584..90a514f 100644 --- a/proto/quixos/orch.proto +++ b/proto/quixos/orch.proto @@ -9,6 +9,8 @@ import "quixos/refs.proto"; import "quixos/runtime.proto"; service OrchestratorRuntime { + rpc ReadDefinitions(DefinitionRequest) returns (DefinitionPage); + rpc WatchDefinitions(DefinitionRequest) returns (stream DefinitionPage); rpc ExecuteQuery(camino.QueryRequest) returns (camino.QueryResponse); rpc WatchQuery(camino.QueryRequest) returns (stream QueryEvent); rpc TryConform(TryConformRequest) returns (TryConformResponse); @@ -26,6 +28,83 @@ service OrchestratorRuntime { rpc CloseActivation(CloseActivationRequest) returns (CloseActivationResponse); } +// Activated definitions, not runtime metrics or object data. Nested type JSON +// uses the compiler's canonical ValueType/InterfaceRevision public contracts. +message DefinitionSelector { + string kind = 1; // active | atoms | interfaces | conformances | queries | indexes + repeated string ids = 2; + string atom_id = 3; + string interface_revision_id = 4; + string package_revision_id = 5; +} +message DefinitionIdentity { + string workspace_id = 1; + string workspace_revision_id = 2; + string source_root_commit = 3; + string workspace_epoch = 4; + string definition_digest = 5; +} +message DefinitionRequest { + DefinitionSelector selector = 1; + uint32 first = 2; // 1..100; 0 uses 50 + string after = 3; + string snapshot = 4; // issued definition_digest; current serving snapshot only + string workspace_id = 5; // required for injected package authority + string workspace_epoch = 6; // required for invocation-bound package calls +} +message ReflectedAtom { + string id = 1; + string display_name = 2; + string constructor_input_type_json = 3; +} +message ReflectedInterface { + string id = 1; + string interface_id = 2; + string display_name = 3; + string contract_json = 4; // canonical interface contract, excluding source location +} +message ReflectedConformance { + string id = 1; + string atom_id = 2; + string interface_revision_id = 3; + string definition_id = 4; + repeated string operation_ids = 5; + repeated ClassCapability class_capabilities = 6; + bool instance = 7; +} +message ReflectedQuery { + string id = 1; + string name = 2; + string package_revision_id = 3; + string definition_digest = 4; + string binding_digest = 5; + string root_kind = 6; + string interface_revision_id = 7; + string variables_type_json = 8; + string output_type_json = 9; + string effects_json = 10; + bool watch = 11; + WorkspaceQueryScope workspace_scope = 12; +} +message ReflectedIndex { + string id = 1; + string contract_json = 2; +} +message DefinitionRecord { + oneof definition { + ReflectedAtom atom = 1; + ReflectedInterface interface = 2; + ReflectedConformance conformance = 3; + ReflectedQuery query = 4; + ReflectedIndex index = 5; + } +} +message DefinitionPage { + DefinitionIdentity identity = 1; + repeated DefinitionRecord records = 2; + string next_cursor = 3; +} + message QueryEvent { string run_id = 1; uint64 sequence = 2; diff --git a/proto/quixos/refs.proto b/proto/quixos/refs.proto index 7b976e6..6e4a7d0 100644 --- a/proto/quixos/refs.proto +++ b/proto/quixos/refs.proto @@ -45,12 +45,19 @@ message InjectedDependency { string constructor_atom_id = 5; string query_id = 7; WorkspaceQueryDependency workspace_query = 8; + ReflectionDependency reflection = 9; } // Defaults to the invocation receiver. A checked dependency traversal can // select a related object explicitly before the package runtime starts. string object_id = 6; } +message ReflectionDependency { + string workspace_id = 1; + string workspace_epoch = 2; + repeated string selectors = 3; +} + // Scope evidence is not authority by itself. The caller must also hold the // matching workspace-query grant (or the authenticated workspace user grant). message WorkspaceQueryScope { diff --git a/src/bindings/generics.ts b/src/bindings/generics.ts index fc275a1..0ec8278 100644 --- a/src/bindings/generics.ts +++ b/src/bindings/generics.ts @@ -79,6 +79,8 @@ export const genericImplementationType = ( const requirement = entry.requirement, scope = rootScope(); switch (requirement.kind) { + case "reflection": + return `QxReflectionPort<${requirement.selectors.map((value) => JSON.stringify(value)).join(" | ")}>`; case "state": return object([ ...requirement.primitives.map((primitive): [string, string] => { diff --git a/src/bindings/index.ts b/src/bindings/index.ts index 80bd83c..5d08072 100644 --- a/src/bindings/index.ts +++ b/src/bindings/index.ts @@ -144,6 +144,11 @@ export const generateTypeScriptBindings = ( const port = (entry: DependencyPort): { type: string; spec: unknown } => { const requirement = entry.requirement; switch (requirement.kind) { + case "reflection": + return { + type: `QxReflectionPort<${requirement.selectors.map((value) => q(value)).join(" | ")}>`, + spec: { kind: "reflection", id: entry.id, selectors: requirement.selectors }, + }; case "query": { const query = schema.packages .find((candidate) => candidate.revisionId === requirement.packageRevisionId) @@ -378,6 +383,7 @@ export const generateTypeScriptBindings = ( "RelationshipCollection", "RelationshipEntry", "QxQuerySnapshot", + "QxReflectionPort", "QxQueryDescriptor", ].filter((name) => new RegExp(`\\b${name}\\b`).test(signatures)); return ( diff --git a/src/capability-language/generated/QuixosCapability.interp b/src/capability-language/generated/QuixosCapability.interp index e7e459a..3ce3de6 100644 --- a/src/capability-language/generated/QuixosCapability.interp +++ b/src/capability-language/generated/QuixosCapability.interp @@ -5,6 +5,7 @@ null 'rpc-calls' 'deadline-ms' 'query' +'reflection' 'specialize' 'root' 'document' @@ -141,6 +142,7 @@ RESULT_BYTES RPC_CALLS DEADLINE_MS QUERY +REFLECTION SPECIALIZE ROOT DOCUMENT @@ -344,4 +346,4 @@ stringLiteral atn: -[4, 1, 133, 1105, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 153, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 158, 8, 1, 10, 1, 12, 1, 161, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 179, 8, 3, 10, 3, 12, 3, 182, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 193, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 205, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 225, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 233, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 238, 8, 10, 10, 10, 12, 10, 241, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 246, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 256, 8, 10, 10, 10, 12, 10, 259, 9, 10, 3, 10, 261, 8, 10, 1, 10, 1, 10, 5, 10, 265, 8, 10, 10, 10, 12, 10, 268, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 276, 8, 11, 10, 11, 12, 11, 279, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 287, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 295, 8, 12, 10, 12, 12, 12, 298, 9, 12, 3, 12, 300, 8, 12, 3, 12, 302, 8, 12, 1, 13, 1, 13, 3, 13, 306, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 312, 8, 14, 10, 14, 12, 14, 315, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 326, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 331, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 340, 8, 17, 1, 18, 3, 18, 343, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 3, 19, 361, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 371, 8, 19, 10, 19, 12, 19, 374, 9, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 397, 8, 20, 1, 21, 3, 21, 400, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 410, 8, 21, 1, 21, 1, 21, 3, 21, 414, 8, 21, 1, 21, 1, 21, 5, 21, 418, 8, 21, 10, 21, 12, 21, 421, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 427, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 453, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 460, 8, 24, 1, 24, 1, 24, 3, 24, 464, 8, 24, 1, 25, 5, 25, 467, 8, 25, 10, 25, 12, 25, 470, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 480, 8, 25, 1, 25, 1, 25, 5, 25, 484, 8, 25, 10, 25, 12, 25, 487, 9, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 496, 8, 26, 1, 27, 1, 27, 1, 27, 3, 27, 501, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 507, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 516, 8, 27, 10, 27, 12, 27, 519, 9, 27, 1, 27, 1, 27, 1, 28, 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, 3, 29, 538, 8, 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, 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, 3, 29, 565, 8, 29, 1, 30, 1, 30, 1, 30, 3, 30, 570, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 581, 8, 30, 1, 30, 1, 30, 1, 30, 3, 30, 586, 8, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 3, 31, 593, 8, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 602, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 615, 8, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 634, 8, 35, 10, 35, 12, 35, 637, 9, 35, 3, 35, 639, 8, 35, 1, 35, 3, 35, 642, 8, 35, 1, 36, 1, 36, 1, 36, 5, 36, 647, 8, 36, 10, 36, 12, 36, 650, 9, 36, 1, 37, 1, 37, 1, 37, 5, 37, 655, 8, 37, 10, 37, 12, 37, 658, 9, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 688, 8, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 700, 8, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 714, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 720, 8, 39, 10, 39, 12, 39, 723, 9, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 3, 42, 734, 8, 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, 3, 43, 748, 8, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 758, 8, 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, 46, 1, 46, 1, 46, 1, 46, 3, 46, 776, 8, 46, 1, 46, 1, 46, 3, 46, 780, 8, 46, 1, 46, 3, 46, 783, 8, 46, 1, 46, 1, 46, 3, 46, 787, 8, 46, 1, 46, 3, 46, 790, 8, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 799, 8, 47, 1, 47, 1, 47, 3, 47, 803, 8, 47, 1, 47, 1, 47, 3, 47, 807, 8, 47, 1, 47, 1, 47, 5, 47, 811, 8, 47, 10, 47, 12, 47, 814, 9, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 823, 8, 48, 1, 49, 1, 49, 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, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 852, 8, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 871, 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, 1, 54, 1, 54, 1, 54, 3, 54, 888, 8, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 898, 8, 54, 1, 54, 3, 54, 901, 8, 54, 3, 54, 903, 8, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 5, 57, 912, 8, 57, 10, 57, 12, 57, 915, 9, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 929, 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, 945, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 954, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 962, 8, 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, 975, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 987, 8, 58, 1, 58, 1, 58, 3, 58, 991, 8, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1000, 8, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1018, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 1040, 8, 60, 10, 60, 12, 60, 1043, 9, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1048, 8, 60, 3, 60, 1050, 8, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1069, 8, 64, 1, 65, 1, 65, 1, 65, 1, 65, 5, 65, 1075, 8, 65, 10, 65, 12, 65, 1078, 9, 65, 3, 65, 1080, 8, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 5, 67, 1092, 8, 67, 10, 67, 12, 67, 1095, 9, 67, 3, 67, 1097, 8, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 0, 0, 70, 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, 0, 7, 1, 0, 81, 85, 2, 0, 76, 80, 82, 83, 2, 0, 76, 77, 82, 83, 2, 0, 78, 80, 82, 83, 1, 0, 101, 108, 1, 0, 88, 91, 3, 0, 2, 15, 55, 55, 129, 129, 1188, 0, 152, 1, 0, 0, 0, 2, 154, 1, 0, 0, 0, 4, 164, 1, 0, 0, 0, 6, 168, 1, 0, 0, 0, 8, 192, 1, 0, 0, 0, 10, 204, 1, 0, 0, 0, 12, 206, 1, 0, 0, 0, 14, 213, 1, 0, 0, 0, 16, 224, 1, 0, 0, 0, 18, 226, 1, 0, 0, 0, 20, 239, 1, 0, 0, 0, 22, 271, 1, 0, 0, 0, 24, 301, 1, 0, 0, 0, 26, 303, 1, 0, 0, 0, 28, 307, 1, 0, 0, 0, 30, 325, 1, 0, 0, 0, 32, 327, 1, 0, 0, 0, 34, 339, 1, 0, 0, 0, 36, 342, 1, 0, 0, 0, 38, 360, 1, 0, 0, 0, 40, 396, 1, 0, 0, 0, 42, 399, 1, 0, 0, 0, 44, 424, 1, 0, 0, 0, 46, 452, 1, 0, 0, 0, 48, 463, 1, 0, 0, 0, 50, 468, 1, 0, 0, 0, 52, 495, 1, 0, 0, 0, 54, 497, 1, 0, 0, 0, 56, 522, 1, 0, 0, 0, 58, 564, 1, 0, 0, 0, 60, 566, 1, 0, 0, 0, 62, 589, 1, 0, 0, 0, 64, 605, 1, 0, 0, 0, 66, 618, 1, 0, 0, 0, 68, 621, 1, 0, 0, 0, 70, 641, 1, 0, 0, 0, 72, 643, 1, 0, 0, 0, 74, 651, 1, 0, 0, 0, 76, 713, 1, 0, 0, 0, 78, 715, 1, 0, 0, 0, 80, 726, 1, 0, 0, 0, 82, 728, 1, 0, 0, 0, 84, 733, 1, 0, 0, 0, 86, 735, 1, 0, 0, 0, 88, 757, 1, 0, 0, 0, 90, 759, 1, 0, 0, 0, 92, 768, 1, 0, 0, 0, 94, 793, 1, 0, 0, 0, 96, 822, 1, 0, 0, 0, 98, 824, 1, 0, 0, 0, 100, 831, 1, 0, 0, 0, 102, 845, 1, 0, 0, 0, 104, 855, 1, 0, 0, 0, 106, 870, 1, 0, 0, 0, 108, 902, 1, 0, 0, 0, 110, 904, 1, 0, 0, 0, 112, 906, 1, 0, 0, 0, 114, 908, 1, 0, 0, 0, 116, 990, 1, 0, 0, 0, 118, 992, 1, 0, 0, 0, 120, 1049, 1, 0, 0, 0, 122, 1051, 1, 0, 0, 0, 124, 1056, 1, 0, 0, 0, 126, 1058, 1, 0, 0, 0, 128, 1068, 1, 0, 0, 0, 130, 1070, 1, 0, 0, 0, 132, 1083, 1, 0, 0, 0, 134, 1087, 1, 0, 0, 0, 136, 1100, 1, 0, 0, 0, 138, 1102, 1, 0, 0, 0, 140, 141, 3, 6, 3, 0, 141, 142, 5, 0, 0, 1, 142, 153, 1, 0, 0, 0, 143, 144, 3, 20, 10, 0, 144, 145, 5, 0, 0, 1, 145, 153, 1, 0, 0, 0, 146, 147, 3, 50, 25, 0, 147, 148, 5, 0, 0, 1, 148, 153, 1, 0, 0, 0, 149, 150, 3, 2, 1, 0, 150, 151, 5, 0, 0, 1, 151, 153, 1, 0, 0, 0, 152, 140, 1, 0, 0, 0, 152, 143, 1, 0, 0, 0, 152, 146, 1, 0, 0, 0, 152, 149, 1, 0, 0, 0, 153, 1, 1, 0, 0, 0, 154, 155, 5, 22, 0, 0, 155, 159, 5, 117, 0, 0, 156, 158, 3, 8, 4, 0, 157, 156, 1, 0, 0, 0, 158, 161, 1, 0, 0, 0, 159, 157, 1, 0, 0, 0, 159, 160, 1, 0, 0, 0, 160, 162, 1, 0, 0, 0, 161, 159, 1, 0, 0, 0, 162, 163, 5, 118, 0, 0, 163, 3, 1, 0, 0, 0, 164, 165, 5, 23, 0, 0, 165, 166, 3, 138, 69, 0, 166, 167, 5, 114, 0, 0, 167, 5, 1, 0, 0, 0, 168, 169, 5, 1, 0, 0, 169, 170, 3, 136, 68, 0, 170, 171, 5, 64, 0, 0, 171, 172, 3, 138, 69, 0, 172, 173, 5, 58, 0, 0, 173, 174, 3, 138, 69, 0, 174, 175, 5, 57, 0, 0, 175, 176, 3, 138, 69, 0, 176, 180, 5, 117, 0, 0, 177, 179, 3, 8, 4, 0, 178, 177, 1, 0, 0, 0, 179, 182, 1, 0, 0, 0, 180, 178, 1, 0, 0, 0, 180, 181, 1, 0, 0, 0, 181, 183, 1, 0, 0, 0, 182, 180, 1, 0, 0, 0, 183, 184, 5, 118, 0, 0, 184, 7, 1, 0, 0, 0, 185, 193, 3, 4, 2, 0, 186, 193, 3, 18, 9, 0, 187, 193, 3, 10, 5, 0, 188, 193, 3, 82, 41, 0, 189, 193, 3, 94, 47, 0, 190, 193, 3, 118, 59, 0, 191, 193, 3, 32, 16, 0, 192, 185, 1, 0, 0, 0, 192, 186, 1, 0, 0, 0, 192, 187, 1, 0, 0, 0, 192, 188, 1, 0, 0, 0, 192, 189, 1, 0, 0, 0, 192, 190, 1, 0, 0, 0, 192, 191, 1, 0, 0, 0, 193, 9, 1, 0, 0, 0, 194, 195, 5, 23, 0, 0, 195, 196, 5, 26, 0, 0, 196, 197, 3, 136, 68, 0, 197, 198, 5, 114, 0, 0, 198, 205, 1, 0, 0, 0, 199, 200, 5, 23, 0, 0, 200, 201, 5, 28, 0, 0, 201, 202, 3, 136, 68, 0, 202, 203, 5, 114, 0, 0, 203, 205, 1, 0, 0, 0, 204, 194, 1, 0, 0, 0, 204, 199, 1, 0, 0, 0, 205, 11, 1, 0, 0, 0, 206, 207, 5, 24, 0, 0, 207, 208, 5, 25, 0, 0, 208, 209, 3, 136, 68, 0, 209, 210, 5, 64, 0, 0, 210, 211, 3, 138, 69, 0, 211, 212, 5, 114, 0, 0, 212, 13, 1, 0, 0, 0, 213, 214, 5, 24, 0, 0, 214, 215, 5, 26, 0, 0, 215, 216, 3, 136, 68, 0, 216, 217, 5, 58, 0, 0, 217, 218, 3, 138, 69, 0, 218, 219, 5, 114, 0, 0, 219, 15, 1, 0, 0, 0, 220, 225, 3, 10, 5, 0, 221, 225, 3, 12, 6, 0, 222, 225, 3, 14, 7, 0, 223, 225, 3, 32, 16, 0, 224, 220, 1, 0, 0, 0, 224, 221, 1, 0, 0, 0, 224, 222, 1, 0, 0, 0, 224, 223, 1, 0, 0, 0, 225, 17, 1, 0, 0, 0, 226, 227, 5, 25, 0, 0, 227, 228, 3, 136, 68, 0, 228, 229, 5, 64, 0, 0, 229, 232, 3, 138, 69, 0, 230, 231, 5, 65, 0, 0, 231, 233, 3, 138, 69, 0, 232, 230, 1, 0, 0, 0, 232, 233, 1, 0, 0, 0, 233, 234, 1, 0, 0, 0, 234, 235, 5, 114, 0, 0, 235, 19, 1, 0, 0, 0, 236, 238, 3, 16, 8, 0, 237, 236, 1, 0, 0, 0, 238, 241, 1, 0, 0, 0, 239, 237, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 242, 1, 0, 0, 0, 241, 239, 1, 0, 0, 0, 242, 243, 5, 26, 0, 0, 243, 245, 3, 136, 68, 0, 244, 246, 3, 22, 11, 0, 245, 244, 1, 0, 0, 0, 245, 246, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 247, 248, 5, 64, 0, 0, 248, 249, 3, 138, 69, 0, 249, 250, 5, 58, 0, 0, 250, 260, 3, 138, 69, 0, 251, 252, 5, 69, 0, 0, 252, 257, 3, 26, 13, 0, 253, 254, 5, 115, 0, 0, 254, 256, 3, 26, 13, 0, 255, 253, 1, 0, 0, 0, 256, 259, 1, 0, 0, 0, 257, 255, 1, 0, 0, 0, 257, 258, 1, 0, 0, 0, 258, 261, 1, 0, 0, 0, 259, 257, 1, 0, 0, 0, 260, 251, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 266, 5, 117, 0, 0, 263, 265, 3, 34, 17, 0, 264, 263, 1, 0, 0, 0, 265, 268, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 269, 1, 0, 0, 0, 268, 266, 1, 0, 0, 0, 269, 270, 5, 118, 0, 0, 270, 21, 1, 0, 0, 0, 271, 272, 5, 123, 0, 0, 272, 277, 3, 24, 12, 0, 273, 274, 5, 115, 0, 0, 274, 276, 3, 24, 12, 0, 275, 273, 1, 0, 0, 0, 276, 279, 1, 0, 0, 0, 277, 275, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 280, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 280, 281, 5, 124, 0, 0, 281, 23, 1, 0, 0, 0, 282, 283, 5, 29, 0, 0, 283, 286, 3, 136, 68, 0, 284, 285, 5, 113, 0, 0, 285, 287, 5, 19, 0, 0, 286, 284, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 302, 1, 0, 0, 0, 288, 289, 5, 18, 0, 0, 289, 299, 3, 136, 68, 0, 290, 291, 5, 20, 0, 0, 291, 296, 3, 26, 13, 0, 292, 293, 5, 125, 0, 0, 293, 295, 3, 26, 13, 0, 294, 292, 1, 0, 0, 0, 295, 298, 1, 0, 0, 0, 296, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 300, 1, 0, 0, 0, 298, 296, 1, 0, 0, 0, 299, 290, 1, 0, 0, 0, 299, 300, 1, 0, 0, 0, 300, 302, 1, 0, 0, 0, 301, 282, 1, 0, 0, 0, 301, 288, 1, 0, 0, 0, 302, 25, 1, 0, 0, 0, 303, 305, 3, 136, 68, 0, 304, 306, 3, 28, 14, 0, 305, 304, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 27, 1, 0, 0, 0, 307, 308, 5, 123, 0, 0, 308, 313, 3, 30, 15, 0, 309, 310, 5, 115, 0, 0, 310, 312, 3, 30, 15, 0, 311, 309, 1, 0, 0, 0, 312, 315, 1, 0, 0, 0, 313, 311, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 316, 1, 0, 0, 0, 315, 313, 1, 0, 0, 0, 316, 317, 5, 124, 0, 0, 317, 29, 1, 0, 0, 0, 318, 319, 5, 25, 0, 0, 319, 326, 3, 136, 68, 0, 320, 321, 5, 26, 0, 0, 321, 326, 3, 26, 13, 0, 322, 323, 5, 18, 0, 0, 323, 326, 3, 136, 68, 0, 324, 326, 3, 120, 60, 0, 325, 318, 1, 0, 0, 0, 325, 320, 1, 0, 0, 0, 325, 322, 1, 0, 0, 0, 325, 324, 1, 0, 0, 0, 326, 31, 1, 0, 0, 0, 327, 328, 5, 17, 0, 0, 328, 330, 3, 136, 68, 0, 329, 331, 3, 22, 11, 0, 330, 329, 1, 0, 0, 0, 330, 331, 1, 0, 0, 0, 331, 332, 1, 0, 0, 0, 332, 333, 5, 126, 0, 0, 333, 334, 3, 120, 60, 0, 334, 335, 5, 114, 0, 0, 335, 33, 1, 0, 0, 0, 336, 340, 3, 38, 19, 0, 337, 340, 3, 42, 21, 0, 338, 340, 3, 36, 18, 0, 339, 336, 1, 0, 0, 0, 339, 337, 1, 0, 0, 0, 339, 338, 1, 0, 0, 0, 340, 35, 1, 0, 0, 0, 341, 343, 5, 39, 0, 0, 342, 341, 1, 0, 0, 0, 342, 343, 1, 0, 0, 0, 343, 344, 1, 0, 0, 0, 344, 345, 5, 31, 0, 0, 345, 346, 3, 136, 68, 0, 346, 347, 5, 64, 0, 0, 347, 348, 3, 138, 69, 0, 348, 349, 5, 113, 0, 0, 349, 350, 3, 120, 60, 0, 350, 351, 5, 112, 0, 0, 351, 352, 3, 120, 60, 0, 352, 353, 5, 117, 0, 0, 353, 354, 5, 81, 0, 0, 354, 355, 5, 64, 0, 0, 355, 356, 3, 138, 69, 0, 356, 357, 5, 114, 0, 0, 357, 358, 5, 118, 0, 0, 358, 37, 1, 0, 0, 0, 359, 361, 3, 44, 22, 0, 360, 359, 1, 0, 0, 0, 360, 361, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 363, 5, 29, 0, 0, 363, 364, 3, 136, 68, 0, 364, 365, 5, 64, 0, 0, 365, 366, 3, 138, 69, 0, 366, 367, 5, 113, 0, 0, 367, 368, 3, 120, 60, 0, 368, 372, 5, 117, 0, 0, 369, 371, 3, 40, 20, 0, 370, 369, 1, 0, 0, 0, 371, 374, 1, 0, 0, 0, 372, 370, 1, 0, 0, 0, 372, 373, 1, 0, 0, 0, 373, 375, 1, 0, 0, 0, 374, 372, 1, 0, 0, 0, 375, 376, 5, 118, 0, 0, 376, 39, 1, 0, 0, 0, 377, 378, 5, 71, 0, 0, 378, 379, 5, 64, 0, 0, 379, 380, 3, 138, 69, 0, 380, 381, 5, 114, 0, 0, 381, 397, 1, 0, 0, 0, 382, 383, 5, 72, 0, 0, 383, 384, 5, 64, 0, 0, 384, 385, 3, 138, 69, 0, 385, 386, 5, 114, 0, 0, 386, 397, 1, 0, 0, 0, 387, 388, 5, 73, 0, 0, 388, 389, 5, 74, 0, 0, 389, 390, 5, 64, 0, 0, 390, 391, 3, 138, 69, 0, 391, 392, 5, 75, 0, 0, 392, 393, 5, 64, 0, 0, 393, 394, 3, 138, 69, 0, 394, 395, 5, 114, 0, 0, 395, 397, 1, 0, 0, 0, 396, 377, 1, 0, 0, 0, 396, 382, 1, 0, 0, 0, 396, 387, 1, 0, 0, 0, 397, 41, 1, 0, 0, 0, 398, 400, 3, 44, 22, 0, 399, 398, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 402, 5, 30, 0, 0, 402, 403, 3, 136, 68, 0, 403, 404, 5, 64, 0, 0, 404, 405, 3, 138, 69, 0, 405, 406, 5, 113, 0, 0, 406, 407, 3, 126, 63, 0, 407, 409, 3, 48, 24, 0, 408, 410, 5, 92, 0, 0, 409, 408, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 413, 1, 0, 0, 0, 411, 412, 5, 62, 0, 0, 412, 414, 3, 138, 69, 0, 413, 411, 1, 0, 0, 0, 413, 414, 1, 0, 0, 0, 414, 415, 1, 0, 0, 0, 415, 419, 5, 117, 0, 0, 416, 418, 3, 46, 23, 0, 417, 416, 1, 0, 0, 0, 418, 421, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 419, 1, 0, 0, 0, 422, 423, 5, 118, 0, 0, 423, 43, 1, 0, 0, 0, 424, 426, 5, 14, 0, 0, 425, 427, 5, 15, 0, 0, 426, 425, 1, 0, 0, 0, 426, 427, 1, 0, 0, 0, 427, 45, 1, 0, 0, 0, 428, 429, 5, 78, 0, 0, 429, 430, 5, 64, 0, 0, 430, 431, 3, 138, 69, 0, 431, 432, 5, 114, 0, 0, 432, 453, 1, 0, 0, 0, 433, 434, 5, 79, 0, 0, 434, 435, 5, 64, 0, 0, 435, 436, 3, 138, 69, 0, 436, 437, 5, 114, 0, 0, 437, 453, 1, 0, 0, 0, 438, 439, 5, 80, 0, 0, 439, 440, 5, 64, 0, 0, 440, 441, 3, 138, 69, 0, 441, 442, 5, 114, 0, 0, 442, 453, 1, 0, 0, 0, 443, 444, 5, 73, 0, 0, 444, 445, 5, 74, 0, 0, 445, 446, 5, 64, 0, 0, 446, 447, 3, 138, 69, 0, 447, 448, 5, 75, 0, 0, 448, 449, 5, 64, 0, 0, 449, 450, 3, 138, 69, 0, 450, 451, 5, 114, 0, 0, 451, 453, 1, 0, 0, 0, 452, 428, 1, 0, 0, 0, 452, 433, 1, 0, 0, 0, 452, 438, 1, 0, 0, 0, 452, 443, 1, 0, 0, 0, 453, 47, 1, 0, 0, 0, 454, 455, 5, 25, 0, 0, 455, 464, 3, 136, 68, 0, 456, 457, 5, 26, 0, 0, 457, 459, 3, 136, 68, 0, 458, 460, 3, 28, 14, 0, 459, 458, 1, 0, 0, 0, 459, 460, 1, 0, 0, 0, 460, 464, 1, 0, 0, 0, 461, 462, 5, 18, 0, 0, 462, 464, 3, 136, 68, 0, 463, 454, 1, 0, 0, 0, 463, 456, 1, 0, 0, 0, 463, 461, 1, 0, 0, 0, 464, 49, 1, 0, 0, 0, 465, 467, 3, 16, 8, 0, 466, 465, 1, 0, 0, 0, 467, 470, 1, 0, 0, 0, 468, 466, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 471, 1, 0, 0, 0, 470, 468, 1, 0, 0, 0, 471, 472, 5, 28, 0, 0, 472, 473, 3, 136, 68, 0, 473, 474, 5, 64, 0, 0, 474, 475, 3, 138, 69, 0, 475, 476, 5, 58, 0, 0, 476, 479, 3, 138, 69, 0, 477, 478, 5, 59, 0, 0, 478, 480, 5, 127, 0, 0, 479, 477, 1, 0, 0, 0, 479, 480, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 485, 5, 117, 0, 0, 482, 484, 3, 52, 26, 0, 483, 482, 1, 0, 0, 0, 484, 487, 1, 0, 0, 0, 485, 483, 1, 0, 0, 0, 485, 486, 1, 0, 0, 0, 486, 488, 1, 0, 0, 0, 487, 485, 1, 0, 0, 0, 488, 489, 5, 118, 0, 0, 489, 51, 1, 0, 0, 0, 490, 496, 3, 60, 30, 0, 491, 496, 3, 62, 31, 0, 492, 496, 3, 64, 32, 0, 493, 496, 3, 54, 27, 0, 494, 496, 3, 56, 28, 0, 495, 490, 1, 0, 0, 0, 495, 491, 1, 0, 0, 0, 495, 492, 1, 0, 0, 0, 495, 493, 1, 0, 0, 0, 495, 494, 1, 0, 0, 0, 496, 53, 1, 0, 0, 0, 497, 498, 5, 5, 0, 0, 498, 500, 3, 136, 68, 0, 499, 501, 3, 22, 11, 0, 500, 499, 1, 0, 0, 0, 500, 501, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 5, 64, 0, 0, 503, 504, 3, 138, 69, 0, 504, 506, 5, 7, 0, 0, 505, 507, 5, 1, 0, 0, 506, 505, 1, 0, 0, 0, 506, 507, 1, 0, 0, 0, 507, 508, 1, 0, 0, 0, 508, 509, 3, 26, 13, 0, 509, 510, 5, 8, 0, 0, 510, 511, 3, 138, 69, 0, 511, 512, 5, 31, 0, 0, 512, 513, 3, 138, 69, 0, 513, 517, 5, 117, 0, 0, 514, 516, 3, 58, 29, 0, 515, 514, 1, 0, 0, 0, 516, 519, 1, 0, 0, 0, 517, 515, 1, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 520, 1, 0, 0, 0, 519, 517, 1, 0, 0, 0, 520, 521, 5, 118, 0, 0, 521, 55, 1, 0, 0, 0, 522, 523, 5, 5, 0, 0, 523, 524, 3, 136, 68, 0, 524, 525, 5, 64, 0, 0, 525, 526, 3, 138, 69, 0, 526, 527, 5, 6, 0, 0, 527, 528, 3, 136, 68, 0, 528, 529, 3, 28, 14, 0, 529, 530, 5, 114, 0, 0, 530, 57, 1, 0, 0, 0, 531, 532, 5, 9, 0, 0, 532, 533, 3, 138, 69, 0, 533, 534, 5, 114, 0, 0, 534, 565, 1, 0, 0, 0, 535, 537, 5, 10, 0, 0, 536, 538, 5, 18, 0, 0, 537, 536, 1, 0, 0, 0, 537, 538, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 540, 3, 136, 68, 0, 540, 541, 5, 37, 0, 0, 541, 542, 3, 26, 13, 0, 542, 543, 5, 114, 0, 0, 543, 565, 1, 0, 0, 0, 544, 545, 5, 11, 0, 0, 545, 546, 3, 136, 68, 0, 546, 547, 5, 127, 0, 0, 547, 548, 5, 114, 0, 0, 548, 565, 1, 0, 0, 0, 549, 550, 5, 12, 0, 0, 550, 551, 3, 26, 13, 0, 551, 552, 5, 116, 0, 0, 552, 553, 3, 136, 68, 0, 553, 554, 3, 136, 68, 0, 554, 555, 3, 138, 69, 0, 555, 556, 5, 114, 0, 0, 556, 565, 1, 0, 0, 0, 557, 558, 5, 73, 0, 0, 558, 565, 5, 114, 0, 0, 559, 560, 5, 13, 0, 0, 560, 561, 5, 127, 0, 0, 561, 562, 3, 138, 69, 0, 562, 563, 5, 114, 0, 0, 563, 565, 1, 0, 0, 0, 564, 531, 1, 0, 0, 0, 564, 535, 1, 0, 0, 0, 564, 544, 1, 0, 0, 0, 564, 549, 1, 0, 0, 0, 564, 557, 1, 0, 0, 0, 564, 559, 1, 0, 0, 0, 565, 59, 1, 0, 0, 0, 566, 567, 5, 31, 0, 0, 567, 569, 3, 136, 68, 0, 568, 570, 3, 22, 11, 0, 569, 568, 1, 0, 0, 0, 569, 570, 1, 0, 0, 0, 570, 571, 1, 0, 0, 0, 571, 572, 5, 64, 0, 0, 572, 573, 3, 138, 69, 0, 573, 574, 5, 113, 0, 0, 574, 575, 3, 120, 60, 0, 575, 576, 5, 112, 0, 0, 576, 577, 3, 120, 60, 0, 577, 578, 5, 66, 0, 0, 578, 580, 3, 68, 34, 0, 579, 581, 3, 66, 33, 0, 580, 579, 1, 0, 0, 0, 580, 581, 1, 0, 0, 0, 581, 582, 1, 0, 0, 0, 582, 583, 5, 68, 0, 0, 583, 585, 3, 70, 35, 0, 584, 586, 3, 74, 37, 0, 585, 584, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 587, 1, 0, 0, 0, 587, 588, 5, 114, 0, 0, 588, 61, 1, 0, 0, 0, 589, 590, 5, 32, 0, 0, 590, 592, 3, 136, 68, 0, 591, 593, 3, 22, 11, 0, 592, 591, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 595, 5, 64, 0, 0, 595, 596, 3, 138, 69, 0, 596, 597, 5, 113, 0, 0, 597, 598, 3, 120, 60, 0, 598, 599, 5, 112, 0, 0, 599, 601, 3, 120, 60, 0, 600, 602, 3, 74, 37, 0, 601, 600, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 604, 5, 114, 0, 0, 604, 63, 1, 0, 0, 0, 605, 606, 5, 33, 0, 0, 606, 607, 3, 136, 68, 0, 607, 608, 5, 64, 0, 0, 608, 609, 3, 138, 69, 0, 609, 610, 5, 34, 0, 0, 610, 611, 3, 136, 68, 0, 611, 612, 5, 113, 0, 0, 612, 614, 3, 120, 60, 0, 613, 615, 3, 74, 37, 0, 614, 613, 1, 0, 0, 0, 614, 615, 1, 0, 0, 0, 615, 616, 1, 0, 0, 0, 616, 617, 5, 114, 0, 0, 617, 65, 1, 0, 0, 0, 618, 619, 5, 67, 0, 0, 619, 620, 3, 120, 60, 0, 620, 67, 1, 0, 0, 0, 621, 622, 7, 0, 0, 0, 622, 69, 1, 0, 0, 0, 623, 642, 5, 70, 0, 0, 624, 625, 5, 25, 0, 0, 625, 642, 3, 136, 68, 0, 626, 627, 5, 18, 0, 0, 627, 642, 3, 136, 68, 0, 628, 629, 5, 27, 0, 0, 629, 638, 5, 119, 0, 0, 630, 635, 3, 26, 13, 0, 631, 632, 5, 115, 0, 0, 632, 634, 3, 26, 13, 0, 633, 631, 1, 0, 0, 0, 634, 637, 1, 0, 0, 0, 635, 633, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 639, 1, 0, 0, 0, 637, 635, 1, 0, 0, 0, 638, 630, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 642, 5, 120, 0, 0, 641, 623, 1, 0, 0, 0, 641, 624, 1, 0, 0, 0, 641, 626, 1, 0, 0, 0, 641, 628, 1, 0, 0, 0, 642, 71, 1, 0, 0, 0, 643, 648, 3, 136, 68, 0, 644, 645, 5, 115, 0, 0, 645, 647, 3, 136, 68, 0, 646, 644, 1, 0, 0, 0, 647, 650, 1, 0, 0, 0, 648, 646, 1, 0, 0, 0, 648, 649, 1, 0, 0, 0, 649, 73, 1, 0, 0, 0, 650, 648, 1, 0, 0, 0, 651, 652, 5, 69, 0, 0, 652, 656, 5, 117, 0, 0, 653, 655, 3, 76, 38, 0, 654, 653, 1, 0, 0, 0, 655, 658, 1, 0, 0, 0, 656, 654, 1, 0, 0, 0, 656, 657, 1, 0, 0, 0, 657, 659, 1, 0, 0, 0, 658, 656, 1, 0, 0, 0, 659, 660, 5, 118, 0, 0, 660, 75, 1, 0, 0, 0, 661, 662, 5, 43, 0, 0, 662, 663, 3, 136, 68, 0, 663, 664, 5, 64, 0, 0, 664, 665, 3, 138, 69, 0, 665, 666, 5, 113, 0, 0, 666, 667, 3, 120, 60, 0, 667, 668, 3, 78, 39, 0, 668, 669, 5, 114, 0, 0, 669, 714, 1, 0, 0, 0, 670, 671, 5, 44, 0, 0, 671, 672, 3, 136, 68, 0, 672, 673, 5, 64, 0, 0, 673, 674, 3, 138, 69, 0, 674, 675, 5, 113, 0, 0, 675, 676, 3, 126, 63, 0, 676, 677, 3, 48, 24, 0, 677, 678, 3, 78, 39, 0, 678, 679, 5, 114, 0, 0, 679, 714, 1, 0, 0, 0, 680, 681, 5, 26, 0, 0, 681, 682, 3, 136, 68, 0, 682, 683, 5, 64, 0, 0, 683, 684, 3, 138, 69, 0, 684, 685, 5, 113, 0, 0, 685, 687, 3, 136, 68, 0, 686, 688, 3, 28, 14, 0, 687, 686, 1, 0, 0, 0, 687, 688, 1, 0, 0, 0, 688, 689, 1, 0, 0, 0, 689, 690, 5, 114, 0, 0, 690, 714, 1, 0, 0, 0, 691, 692, 5, 33, 0, 0, 692, 693, 3, 136, 68, 0, 693, 694, 5, 64, 0, 0, 694, 695, 3, 138, 69, 0, 695, 696, 5, 113, 0, 0, 696, 699, 3, 136, 68, 0, 697, 698, 5, 35, 0, 0, 698, 700, 3, 120, 60, 0, 699, 697, 1, 0, 0, 0, 699, 700, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 702, 5, 114, 0, 0, 702, 714, 1, 0, 0, 0, 703, 704, 5, 5, 0, 0, 704, 705, 3, 136, 68, 0, 705, 706, 5, 64, 0, 0, 706, 707, 3, 138, 69, 0, 707, 708, 5, 113, 0, 0, 708, 709, 3, 136, 68, 0, 709, 710, 5, 116, 0, 0, 710, 711, 3, 136, 68, 0, 711, 712, 5, 114, 0, 0, 712, 714, 1, 0, 0, 0, 713, 661, 1, 0, 0, 0, 713, 670, 1, 0, 0, 0, 713, 680, 1, 0, 0, 0, 713, 691, 1, 0, 0, 0, 713, 703, 1, 0, 0, 0, 714, 77, 1, 0, 0, 0, 715, 716, 5, 119, 0, 0, 716, 721, 3, 80, 40, 0, 717, 718, 5, 115, 0, 0, 718, 720, 3, 80, 40, 0, 719, 717, 1, 0, 0, 0, 720, 723, 1, 0, 0, 0, 721, 719, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 724, 1, 0, 0, 0, 723, 721, 1, 0, 0, 0, 724, 725, 5, 120, 0, 0, 725, 79, 1, 0, 0, 0, 726, 727, 7, 1, 0, 0, 727, 81, 1, 0, 0, 0, 728, 729, 5, 42, 0, 0, 729, 730, 3, 84, 42, 0, 730, 83, 1, 0, 0, 0, 731, 734, 3, 86, 43, 0, 732, 734, 3, 90, 45, 0, 733, 731, 1, 0, 0, 0, 733, 732, 1, 0, 0, 0, 734, 85, 1, 0, 0, 0, 735, 736, 5, 43, 0, 0, 736, 737, 3, 136, 68, 0, 737, 738, 5, 64, 0, 0, 738, 739, 3, 138, 69, 0, 739, 740, 5, 52, 0, 0, 740, 741, 3, 136, 68, 0, 741, 742, 5, 113, 0, 0, 742, 743, 3, 120, 60, 0, 743, 744, 5, 53, 0, 0, 744, 747, 3, 88, 44, 0, 745, 746, 5, 54, 0, 0, 746, 748, 3, 128, 64, 0, 747, 745, 1, 0, 0, 0, 747, 748, 1, 0, 0, 0, 748, 749, 1, 0, 0, 0, 749, 750, 5, 114, 0, 0, 750, 87, 1, 0, 0, 0, 751, 758, 5, 86, 0, 0, 752, 753, 5, 87, 0, 0, 753, 754, 5, 121, 0, 0, 754, 755, 3, 120, 60, 0, 755, 756, 5, 122, 0, 0, 756, 758, 1, 0, 0, 0, 757, 751, 1, 0, 0, 0, 757, 752, 1, 0, 0, 0, 758, 89, 1, 0, 0, 0, 759, 760, 5, 44, 0, 0, 760, 761, 3, 136, 68, 0, 761, 762, 5, 64, 0, 0, 762, 763, 3, 138, 69, 0, 763, 764, 5, 117, 0, 0, 764, 765, 3, 92, 46, 0, 765, 766, 3, 92, 46, 0, 766, 767, 5, 118, 0, 0, 767, 91, 1, 0, 0, 0, 768, 769, 3, 48, 24, 0, 769, 770, 5, 45, 0, 0, 770, 771, 3, 136, 68, 0, 771, 772, 5, 64, 0, 0, 772, 773, 3, 138, 69, 0, 773, 775, 3, 126, 63, 0, 774, 776, 5, 92, 0, 0, 775, 774, 1, 0, 0, 0, 775, 776, 1, 0, 0, 0, 776, 779, 1, 0, 0, 0, 777, 778, 5, 60, 0, 0, 778, 780, 3, 138, 69, 0, 779, 777, 1, 0, 0, 0, 779, 780, 1, 0, 0, 0, 780, 782, 1, 0, 0, 0, 781, 783, 5, 61, 0, 0, 782, 781, 1, 0, 0, 0, 782, 783, 1, 0, 0, 0, 783, 786, 1, 0, 0, 0, 784, 785, 5, 62, 0, 0, 785, 787, 3, 138, 69, 0, 786, 784, 1, 0, 0, 0, 786, 787, 1, 0, 0, 0, 787, 789, 1, 0, 0, 0, 788, 790, 5, 63, 0, 0, 789, 788, 1, 0, 0, 0, 789, 790, 1, 0, 0, 0, 790, 791, 1, 0, 0, 0, 791, 792, 5, 114, 0, 0, 792, 93, 1, 0, 0, 0, 793, 794, 5, 36, 0, 0, 794, 795, 3, 136, 68, 0, 795, 796, 5, 37, 0, 0, 796, 798, 3, 136, 68, 0, 797, 799, 3, 28, 14, 0, 798, 797, 1, 0, 0, 0, 798, 799, 1, 0, 0, 0, 799, 802, 1, 0, 0, 0, 800, 801, 5, 64, 0, 0, 801, 803, 3, 138, 69, 0, 802, 800, 1, 0, 0, 0, 802, 803, 1, 0, 0, 0, 803, 806, 1, 0, 0, 0, 804, 805, 5, 59, 0, 0, 805, 807, 5, 127, 0, 0, 806, 804, 1, 0, 0, 0, 806, 807, 1, 0, 0, 0, 807, 808, 1, 0, 0, 0, 808, 812, 5, 117, 0, 0, 809, 811, 3, 96, 48, 0, 810, 809, 1, 0, 0, 0, 811, 814, 1, 0, 0, 0, 812, 810, 1, 0, 0, 0, 812, 813, 1, 0, 0, 0, 813, 815, 1, 0, 0, 0, 814, 812, 1, 0, 0, 0, 815, 816, 5, 118, 0, 0, 816, 95, 1, 0, 0, 0, 817, 818, 5, 41, 0, 0, 818, 823, 3, 84, 42, 0, 819, 823, 3, 102, 51, 0, 820, 823, 3, 98, 49, 0, 821, 823, 3, 100, 50, 0, 822, 817, 1, 0, 0, 0, 822, 819, 1, 0, 0, 0, 822, 820, 1, 0, 0, 0, 822, 821, 1, 0, 0, 0, 823, 97, 1, 0, 0, 0, 824, 825, 5, 38, 0, 0, 825, 826, 3, 136, 68, 0, 826, 827, 5, 40, 0, 0, 827, 828, 5, 43, 0, 0, 828, 829, 3, 136, 68, 0, 829, 830, 5, 114, 0, 0, 830, 99, 1, 0, 0, 0, 831, 832, 5, 49, 0, 0, 832, 833, 3, 136, 68, 0, 833, 834, 5, 50, 0, 0, 834, 835, 5, 51, 0, 0, 835, 836, 5, 47, 0, 0, 836, 837, 5, 33, 0, 0, 837, 838, 3, 136, 68, 0, 838, 839, 5, 48, 0, 0, 839, 840, 5, 44, 0, 0, 840, 841, 3, 136, 68, 0, 841, 842, 5, 116, 0, 0, 842, 843, 3, 136, 68, 0, 843, 844, 5, 114, 0, 0, 844, 101, 1, 0, 0, 0, 845, 846, 5, 38, 0, 0, 846, 847, 3, 104, 52, 0, 847, 848, 5, 40, 0, 0, 848, 851, 3, 108, 54, 0, 849, 850, 5, 16, 0, 0, 850, 852, 3, 138, 69, 0, 851, 849, 1, 0, 0, 0, 851, 852, 1, 0, 0, 0, 852, 853, 1, 0, 0, 0, 853, 854, 5, 114, 0, 0, 854, 103, 1, 0, 0, 0, 855, 856, 3, 136, 68, 0, 856, 857, 5, 116, 0, 0, 857, 858, 3, 106, 53, 0, 858, 105, 1, 0, 0, 0, 859, 871, 3, 136, 68, 0, 860, 871, 5, 81, 0, 0, 861, 871, 5, 71, 0, 0, 862, 871, 5, 72, 0, 0, 863, 871, 5, 78, 0, 0, 864, 871, 5, 79, 0, 0, 865, 871, 5, 80, 0, 0, 866, 871, 5, 82, 0, 0, 867, 871, 5, 83, 0, 0, 868, 871, 5, 84, 0, 0, 869, 871, 5, 85, 0, 0, 870, 859, 1, 0, 0, 0, 870, 860, 1, 0, 0, 0, 870, 861, 1, 0, 0, 0, 870, 862, 1, 0, 0, 0, 870, 863, 1, 0, 0, 0, 870, 864, 1, 0, 0, 0, 870, 865, 1, 0, 0, 0, 870, 866, 1, 0, 0, 0, 870, 867, 1, 0, 0, 0, 870, 868, 1, 0, 0, 0, 870, 869, 1, 0, 0, 0, 871, 107, 1, 0, 0, 0, 872, 873, 5, 43, 0, 0, 873, 874, 3, 136, 68, 0, 874, 875, 5, 116, 0, 0, 875, 876, 3, 110, 55, 0, 876, 903, 1, 0, 0, 0, 877, 878, 5, 44, 0, 0, 878, 879, 3, 136, 68, 0, 879, 880, 5, 116, 0, 0, 880, 881, 3, 136, 68, 0, 881, 882, 5, 116, 0, 0, 882, 883, 3, 112, 56, 0, 883, 903, 1, 0, 0, 0, 884, 885, 5, 26, 0, 0, 885, 887, 3, 136, 68, 0, 886, 888, 3, 28, 14, 0, 887, 886, 1, 0, 0, 0, 887, 888, 1, 0, 0, 0, 888, 889, 1, 0, 0, 0, 889, 890, 5, 116, 0, 0, 890, 891, 3, 104, 52, 0, 891, 903, 1, 0, 0, 0, 892, 893, 5, 28, 0, 0, 893, 894, 3, 136, 68, 0, 894, 895, 5, 116, 0, 0, 895, 897, 3, 136, 68, 0, 896, 898, 3, 28, 14, 0, 897, 896, 1, 0, 0, 0, 897, 898, 1, 0, 0, 0, 898, 900, 1, 0, 0, 0, 899, 901, 3, 114, 57, 0, 900, 899, 1, 0, 0, 0, 900, 901, 1, 0, 0, 0, 901, 903, 1, 0, 0, 0, 902, 872, 1, 0, 0, 0, 902, 877, 1, 0, 0, 0, 902, 884, 1, 0, 0, 0, 902, 892, 1, 0, 0, 0, 903, 109, 1, 0, 0, 0, 904, 905, 7, 2, 0, 0, 905, 111, 1, 0, 0, 0, 906, 907, 7, 3, 0, 0, 907, 113, 1, 0, 0, 0, 908, 909, 5, 46, 0, 0, 909, 913, 5, 117, 0, 0, 910, 912, 3, 116, 58, 0, 911, 910, 1, 0, 0, 0, 912, 915, 1, 0, 0, 0, 913, 911, 1, 0, 0, 0, 913, 914, 1, 0, 0, 0, 914, 916, 1, 0, 0, 0, 915, 913, 1, 0, 0, 0, 916, 917, 5, 118, 0, 0, 917, 115, 1, 0, 0, 0, 918, 919, 3, 136, 68, 0, 919, 920, 5, 40, 0, 0, 920, 921, 5, 43, 0, 0, 921, 928, 3, 136, 68, 0, 922, 923, 5, 48, 0, 0, 923, 924, 5, 44, 0, 0, 924, 925, 3, 136, 68, 0, 925, 926, 5, 116, 0, 0, 926, 927, 3, 136, 68, 0, 927, 929, 1, 0, 0, 0, 928, 922, 1, 0, 0, 0, 928, 929, 1, 0, 0, 0, 929, 930, 1, 0, 0, 0, 930, 931, 5, 114, 0, 0, 931, 991, 1, 0, 0, 0, 932, 933, 3, 136, 68, 0, 933, 934, 5, 40, 0, 0, 934, 935, 5, 44, 0, 0, 935, 936, 3, 136, 68, 0, 936, 937, 5, 116, 0, 0, 937, 944, 3, 136, 68, 0, 938, 939, 5, 48, 0, 0, 939, 940, 5, 44, 0, 0, 940, 941, 3, 136, 68, 0, 941, 942, 5, 116, 0, 0, 942, 943, 3, 136, 68, 0, 943, 945, 1, 0, 0, 0, 944, 938, 1, 0, 0, 0, 944, 945, 1, 0, 0, 0, 945, 946, 1, 0, 0, 0, 946, 947, 5, 114, 0, 0, 947, 991, 1, 0, 0, 0, 948, 949, 3, 136, 68, 0, 949, 950, 5, 40, 0, 0, 950, 951, 5, 26, 0, 0, 951, 953, 3, 136, 68, 0, 952, 954, 3, 28, 14, 0, 953, 952, 1, 0, 0, 0, 953, 954, 1, 0, 0, 0, 954, 961, 1, 0, 0, 0, 955, 956, 5, 48, 0, 0, 956, 957, 5, 44, 0, 0, 957, 958, 3, 136, 68, 0, 958, 959, 5, 116, 0, 0, 959, 960, 3, 136, 68, 0, 960, 962, 1, 0, 0, 0, 961, 955, 1, 0, 0, 0, 961, 962, 1, 0, 0, 0, 962, 963, 1, 0, 0, 0, 963, 964, 5, 114, 0, 0, 964, 991, 1, 0, 0, 0, 965, 966, 3, 136, 68, 0, 966, 967, 5, 40, 0, 0, 967, 968, 5, 33, 0, 0, 968, 969, 3, 136, 68, 0, 969, 970, 5, 114, 0, 0, 970, 991, 1, 0, 0, 0, 971, 972, 3, 136, 68, 0, 972, 974, 5, 40, 0, 0, 973, 975, 5, 1, 0, 0, 974, 973, 1, 0, 0, 0, 974, 975, 1, 0, 0, 0, 975, 976, 1, 0, 0, 0, 976, 977, 5, 5, 0, 0, 977, 978, 3, 136, 68, 0, 978, 979, 5, 116, 0, 0, 979, 986, 3, 136, 68, 0, 980, 981, 5, 48, 0, 0, 981, 982, 5, 44, 0, 0, 982, 983, 3, 136, 68, 0, 983, 984, 5, 116, 0, 0, 984, 985, 3, 136, 68, 0, 985, 987, 1, 0, 0, 0, 986, 980, 1, 0, 0, 0, 986, 987, 1, 0, 0, 0, 987, 988, 1, 0, 0, 0, 988, 989, 5, 114, 0, 0, 989, 991, 1, 0, 0, 0, 990, 918, 1, 0, 0, 0, 990, 932, 1, 0, 0, 0, 990, 948, 1, 0, 0, 0, 990, 965, 1, 0, 0, 0, 990, 971, 1, 0, 0, 0, 991, 117, 1, 0, 0, 0, 992, 993, 5, 33, 0, 0, 993, 994, 3, 136, 68, 0, 994, 995, 5, 40, 0, 0, 995, 996, 3, 136, 68, 0, 996, 997, 5, 116, 0, 0, 997, 999, 3, 136, 68, 0, 998, 1000, 3, 114, 57, 0, 999, 998, 1, 0, 0, 0, 999, 1000, 1, 0, 0, 0, 1000, 1001, 1, 0, 0, 0, 1001, 1002, 5, 114, 0, 0, 1002, 119, 1, 0, 0, 0, 1003, 1050, 3, 124, 62, 0, 1004, 1050, 5, 93, 0, 0, 1005, 1050, 5, 94, 0, 0, 1006, 1007, 5, 95, 0, 0, 1007, 1050, 3, 138, 69, 0, 1008, 1009, 5, 96, 0, 0, 1009, 1010, 5, 123, 0, 0, 1010, 1011, 3, 136, 68, 0, 1011, 1012, 5, 124, 0, 0, 1012, 1050, 1, 0, 0, 0, 1013, 1014, 5, 97, 0, 0, 1014, 1015, 5, 123, 0, 0, 1015, 1017, 3, 136, 68, 0, 1016, 1018, 3, 28, 14, 0, 1017, 1016, 1, 0, 0, 0, 1017, 1018, 1, 0, 0, 0, 1018, 1019, 1, 0, 0, 0, 1019, 1020, 5, 124, 0, 0, 1020, 1050, 1, 0, 0, 0, 1021, 1022, 5, 21, 0, 0, 1022, 1023, 5, 123, 0, 0, 1023, 1024, 3, 136, 68, 0, 1024, 1025, 5, 124, 0, 0, 1025, 1050, 1, 0, 0, 0, 1026, 1027, 5, 98, 0, 0, 1027, 1028, 5, 123, 0, 0, 1028, 1029, 3, 120, 60, 0, 1029, 1030, 5, 124, 0, 0, 1030, 1050, 1, 0, 0, 0, 1031, 1032, 5, 99, 0, 0, 1032, 1033, 5, 123, 0, 0, 1033, 1034, 3, 120, 60, 0, 1034, 1035, 5, 124, 0, 0, 1035, 1050, 1, 0, 0, 0, 1036, 1037, 5, 100, 0, 0, 1037, 1041, 5, 117, 0, 0, 1038, 1040, 3, 122, 61, 0, 1039, 1038, 1, 0, 0, 0, 1040, 1043, 1, 0, 0, 0, 1041, 1039, 1, 0, 0, 0, 1041, 1042, 1, 0, 0, 0, 1042, 1044, 1, 0, 0, 0, 1043, 1041, 1, 0, 0, 0, 1044, 1050, 5, 118, 0, 0, 1045, 1047, 3, 136, 68, 0, 1046, 1048, 3, 28, 14, 0, 1047, 1046, 1, 0, 0, 0, 1047, 1048, 1, 0, 0, 0, 1048, 1050, 1, 0, 0, 0, 1049, 1003, 1, 0, 0, 0, 1049, 1004, 1, 0, 0, 0, 1049, 1005, 1, 0, 0, 0, 1049, 1006, 1, 0, 0, 0, 1049, 1008, 1, 0, 0, 0, 1049, 1013, 1, 0, 0, 0, 1049, 1021, 1, 0, 0, 0, 1049, 1026, 1, 0, 0, 0, 1049, 1031, 1, 0, 0, 0, 1049, 1036, 1, 0, 0, 0, 1049, 1045, 1, 0, 0, 0, 1050, 121, 1, 0, 0, 0, 1051, 1052, 3, 136, 68, 0, 1052, 1053, 5, 113, 0, 0, 1053, 1054, 3, 120, 60, 0, 1054, 1055, 5, 114, 0, 0, 1055, 123, 1, 0, 0, 0, 1056, 1057, 7, 4, 0, 0, 1057, 125, 1, 0, 0, 0, 1058, 1059, 7, 5, 0, 0, 1059, 127, 1, 0, 0, 0, 1060, 1069, 3, 138, 69, 0, 1061, 1069, 5, 127, 0, 0, 1062, 1069, 5, 128, 0, 0, 1063, 1069, 5, 109, 0, 0, 1064, 1069, 5, 110, 0, 0, 1065, 1069, 5, 111, 0, 0, 1066, 1069, 3, 130, 65, 0, 1067, 1069, 3, 134, 67, 0, 1068, 1060, 1, 0, 0, 0, 1068, 1061, 1, 0, 0, 0, 1068, 1062, 1, 0, 0, 0, 1068, 1063, 1, 0, 0, 0, 1068, 1064, 1, 0, 0, 0, 1068, 1065, 1, 0, 0, 0, 1068, 1066, 1, 0, 0, 0, 1068, 1067, 1, 0, 0, 0, 1069, 129, 1, 0, 0, 0, 1070, 1079, 5, 117, 0, 0, 1071, 1076, 3, 132, 66, 0, 1072, 1073, 5, 115, 0, 0, 1073, 1075, 3, 132, 66, 0, 1074, 1072, 1, 0, 0, 0, 1075, 1078, 1, 0, 0, 0, 1076, 1074, 1, 0, 0, 0, 1076, 1077, 1, 0, 0, 0, 1077, 1080, 1, 0, 0, 0, 1078, 1076, 1, 0, 0, 0, 1079, 1071, 1, 0, 0, 0, 1079, 1080, 1, 0, 0, 0, 1080, 1081, 1, 0, 0, 0, 1081, 1082, 5, 118, 0, 0, 1082, 131, 1, 0, 0, 0, 1083, 1084, 3, 138, 69, 0, 1084, 1085, 5, 113, 0, 0, 1085, 1086, 3, 128, 64, 0, 1086, 133, 1, 0, 0, 0, 1087, 1096, 5, 119, 0, 0, 1088, 1093, 3, 128, 64, 0, 1089, 1090, 5, 115, 0, 0, 1090, 1092, 3, 128, 64, 0, 1091, 1089, 1, 0, 0, 0, 1092, 1095, 1, 0, 0, 0, 1093, 1091, 1, 0, 0, 0, 1093, 1094, 1, 0, 0, 0, 1094, 1097, 1, 0, 0, 0, 1095, 1093, 1, 0, 0, 0, 1096, 1088, 1, 0, 0, 0, 1096, 1097, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1099, 5, 120, 0, 0, 1099, 135, 1, 0, 0, 0, 1100, 1101, 7, 6, 0, 0, 1101, 137, 1, 0, 0, 0, 1102, 1103, 5, 130, 0, 0, 1103, 139, 1, 0, 0, 0, 95, 152, 159, 180, 192, 204, 224, 232, 239, 245, 257, 260, 266, 277, 286, 296, 299, 301, 305, 313, 325, 330, 339, 342, 360, 372, 396, 399, 409, 413, 419, 426, 452, 459, 463, 468, 479, 485, 495, 500, 506, 517, 537, 564, 569, 580, 585, 592, 601, 614, 635, 638, 641, 648, 656, 687, 699, 713, 721, 733, 747, 757, 775, 779, 782, 786, 789, 798, 802, 806, 812, 822, 851, 870, 887, 897, 900, 902, 913, 928, 944, 953, 961, 974, 986, 990, 999, 1017, 1041, 1047, 1049, 1068, 1076, 1079, 1093, 1096] \ No newline at end of file +[4, 1, 134, 1123, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 153, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 158, 8, 1, 10, 1, 12, 1, 161, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 179, 8, 3, 10, 3, 12, 3, 182, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 193, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 205, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 225, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 233, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 238, 8, 10, 10, 10, 12, 10, 241, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 246, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 256, 8, 10, 10, 10, 12, 10, 259, 9, 10, 3, 10, 261, 8, 10, 1, 10, 1, 10, 5, 10, 265, 8, 10, 10, 10, 12, 10, 268, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 276, 8, 11, 10, 11, 12, 11, 279, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 287, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 295, 8, 12, 10, 12, 12, 12, 298, 9, 12, 3, 12, 300, 8, 12, 3, 12, 302, 8, 12, 1, 13, 1, 13, 3, 13, 306, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 312, 8, 14, 10, 14, 12, 14, 315, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 326, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 331, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 340, 8, 17, 1, 18, 3, 18, 343, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 3, 19, 361, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 371, 8, 19, 10, 19, 12, 19, 374, 9, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 397, 8, 20, 1, 21, 3, 21, 400, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 410, 8, 21, 1, 21, 1, 21, 3, 21, 414, 8, 21, 1, 21, 1, 21, 5, 21, 418, 8, 21, 10, 21, 12, 21, 421, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 427, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 453, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 460, 8, 24, 1, 24, 1, 24, 3, 24, 464, 8, 24, 1, 25, 5, 25, 467, 8, 25, 10, 25, 12, 25, 470, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 480, 8, 25, 1, 25, 1, 25, 5, 25, 484, 8, 25, 10, 25, 12, 25, 487, 9, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 496, 8, 26, 1, 27, 1, 27, 1, 27, 3, 27, 501, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 507, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 516, 8, 27, 10, 27, 12, 27, 519, 9, 27, 1, 27, 1, 27, 1, 28, 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, 3, 29, 538, 8, 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, 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, 3, 29, 565, 8, 29, 1, 30, 1, 30, 1, 30, 3, 30, 570, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 581, 8, 30, 1, 30, 1, 30, 1, 30, 3, 30, 586, 8, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 3, 31, 593, 8, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 602, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 615, 8, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 634, 8, 35, 10, 35, 12, 35, 637, 9, 35, 3, 35, 639, 8, 35, 1, 35, 3, 35, 642, 8, 35, 1, 36, 1, 36, 1, 36, 5, 36, 647, 8, 36, 10, 36, 12, 36, 650, 9, 36, 1, 37, 1, 37, 1, 37, 5, 37, 655, 8, 37, 10, 37, 12, 37, 658, 9, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 697, 8, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 709, 8, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 723, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 729, 8, 39, 10, 39, 12, 39, 732, 9, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 3, 42, 743, 8, 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, 3, 43, 757, 8, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 767, 8, 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, 46, 1, 46, 1, 46, 1, 46, 3, 46, 785, 8, 46, 1, 46, 1, 46, 3, 46, 789, 8, 46, 1, 46, 3, 46, 792, 8, 46, 1, 46, 1, 46, 3, 46, 796, 8, 46, 1, 46, 3, 46, 799, 8, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 808, 8, 47, 1, 47, 1, 47, 3, 47, 812, 8, 47, 1, 47, 1, 47, 3, 47, 816, 8, 47, 1, 47, 1, 47, 5, 47, 820, 8, 47, 10, 47, 12, 47, 823, 9, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 832, 8, 48, 1, 49, 1, 49, 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, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 861, 8, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 880, 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, 1, 54, 1, 54, 1, 54, 3, 54, 897, 8, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 907, 8, 54, 1, 54, 3, 54, 910, 8, 54, 3, 54, 912, 8, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 5, 57, 921, 8, 57, 10, 57, 12, 57, 924, 9, 57, 1, 57, 1, 57, 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, 947, 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, 963, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 972, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 980, 8, 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, 993, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 1005, 8, 58, 1, 58, 1, 58, 3, 58, 1009, 8, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1018, 8, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1036, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 1058, 8, 60, 10, 60, 12, 60, 1061, 9, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1066, 8, 60, 3, 60, 1068, 8, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1087, 8, 64, 1, 65, 1, 65, 1, 65, 1, 65, 5, 65, 1093, 8, 65, 10, 65, 12, 65, 1096, 9, 65, 3, 65, 1098, 8, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 5, 67, 1110, 8, 67, 10, 67, 12, 67, 1113, 9, 67, 3, 67, 1115, 8, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 0, 0, 70, 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, 0, 7, 1, 0, 82, 86, 2, 0, 77, 81, 83, 84, 2, 0, 77, 78, 83, 84, 2, 0, 79, 81, 83, 84, 1, 0, 102, 109, 1, 0, 89, 92, 4, 0, 2, 16, 28, 28, 56, 56, 130, 130, 1208, 0, 152, 1, 0, 0, 0, 2, 154, 1, 0, 0, 0, 4, 164, 1, 0, 0, 0, 6, 168, 1, 0, 0, 0, 8, 192, 1, 0, 0, 0, 10, 204, 1, 0, 0, 0, 12, 206, 1, 0, 0, 0, 14, 213, 1, 0, 0, 0, 16, 224, 1, 0, 0, 0, 18, 226, 1, 0, 0, 0, 20, 239, 1, 0, 0, 0, 22, 271, 1, 0, 0, 0, 24, 301, 1, 0, 0, 0, 26, 303, 1, 0, 0, 0, 28, 307, 1, 0, 0, 0, 30, 325, 1, 0, 0, 0, 32, 327, 1, 0, 0, 0, 34, 339, 1, 0, 0, 0, 36, 342, 1, 0, 0, 0, 38, 360, 1, 0, 0, 0, 40, 396, 1, 0, 0, 0, 42, 399, 1, 0, 0, 0, 44, 424, 1, 0, 0, 0, 46, 452, 1, 0, 0, 0, 48, 463, 1, 0, 0, 0, 50, 468, 1, 0, 0, 0, 52, 495, 1, 0, 0, 0, 54, 497, 1, 0, 0, 0, 56, 522, 1, 0, 0, 0, 58, 564, 1, 0, 0, 0, 60, 566, 1, 0, 0, 0, 62, 589, 1, 0, 0, 0, 64, 605, 1, 0, 0, 0, 66, 618, 1, 0, 0, 0, 68, 621, 1, 0, 0, 0, 70, 641, 1, 0, 0, 0, 72, 643, 1, 0, 0, 0, 74, 651, 1, 0, 0, 0, 76, 722, 1, 0, 0, 0, 78, 724, 1, 0, 0, 0, 80, 735, 1, 0, 0, 0, 82, 737, 1, 0, 0, 0, 84, 742, 1, 0, 0, 0, 86, 744, 1, 0, 0, 0, 88, 766, 1, 0, 0, 0, 90, 768, 1, 0, 0, 0, 92, 777, 1, 0, 0, 0, 94, 802, 1, 0, 0, 0, 96, 831, 1, 0, 0, 0, 98, 833, 1, 0, 0, 0, 100, 840, 1, 0, 0, 0, 102, 854, 1, 0, 0, 0, 104, 864, 1, 0, 0, 0, 106, 879, 1, 0, 0, 0, 108, 911, 1, 0, 0, 0, 110, 913, 1, 0, 0, 0, 112, 915, 1, 0, 0, 0, 114, 917, 1, 0, 0, 0, 116, 1008, 1, 0, 0, 0, 118, 1010, 1, 0, 0, 0, 120, 1067, 1, 0, 0, 0, 122, 1069, 1, 0, 0, 0, 124, 1074, 1, 0, 0, 0, 126, 1076, 1, 0, 0, 0, 128, 1086, 1, 0, 0, 0, 130, 1088, 1, 0, 0, 0, 132, 1101, 1, 0, 0, 0, 134, 1105, 1, 0, 0, 0, 136, 1118, 1, 0, 0, 0, 138, 1120, 1, 0, 0, 0, 140, 141, 3, 6, 3, 0, 141, 142, 5, 0, 0, 1, 142, 153, 1, 0, 0, 0, 143, 144, 3, 20, 10, 0, 144, 145, 5, 0, 0, 1, 145, 153, 1, 0, 0, 0, 146, 147, 3, 50, 25, 0, 147, 148, 5, 0, 0, 1, 148, 153, 1, 0, 0, 0, 149, 150, 3, 2, 1, 0, 150, 151, 5, 0, 0, 1, 151, 153, 1, 0, 0, 0, 152, 140, 1, 0, 0, 0, 152, 143, 1, 0, 0, 0, 152, 146, 1, 0, 0, 0, 152, 149, 1, 0, 0, 0, 153, 1, 1, 0, 0, 0, 154, 155, 5, 23, 0, 0, 155, 159, 5, 118, 0, 0, 156, 158, 3, 8, 4, 0, 157, 156, 1, 0, 0, 0, 158, 161, 1, 0, 0, 0, 159, 157, 1, 0, 0, 0, 159, 160, 1, 0, 0, 0, 160, 162, 1, 0, 0, 0, 161, 159, 1, 0, 0, 0, 162, 163, 5, 119, 0, 0, 163, 3, 1, 0, 0, 0, 164, 165, 5, 24, 0, 0, 165, 166, 3, 138, 69, 0, 166, 167, 5, 115, 0, 0, 167, 5, 1, 0, 0, 0, 168, 169, 5, 1, 0, 0, 169, 170, 3, 136, 68, 0, 170, 171, 5, 65, 0, 0, 171, 172, 3, 138, 69, 0, 172, 173, 5, 59, 0, 0, 173, 174, 3, 138, 69, 0, 174, 175, 5, 58, 0, 0, 175, 176, 3, 138, 69, 0, 176, 180, 5, 118, 0, 0, 177, 179, 3, 8, 4, 0, 178, 177, 1, 0, 0, 0, 179, 182, 1, 0, 0, 0, 180, 178, 1, 0, 0, 0, 180, 181, 1, 0, 0, 0, 181, 183, 1, 0, 0, 0, 182, 180, 1, 0, 0, 0, 183, 184, 5, 119, 0, 0, 184, 7, 1, 0, 0, 0, 185, 193, 3, 4, 2, 0, 186, 193, 3, 18, 9, 0, 187, 193, 3, 10, 5, 0, 188, 193, 3, 82, 41, 0, 189, 193, 3, 94, 47, 0, 190, 193, 3, 118, 59, 0, 191, 193, 3, 32, 16, 0, 192, 185, 1, 0, 0, 0, 192, 186, 1, 0, 0, 0, 192, 187, 1, 0, 0, 0, 192, 188, 1, 0, 0, 0, 192, 189, 1, 0, 0, 0, 192, 190, 1, 0, 0, 0, 192, 191, 1, 0, 0, 0, 193, 9, 1, 0, 0, 0, 194, 195, 5, 24, 0, 0, 195, 196, 5, 27, 0, 0, 196, 197, 3, 136, 68, 0, 197, 198, 5, 115, 0, 0, 198, 205, 1, 0, 0, 0, 199, 200, 5, 24, 0, 0, 200, 201, 5, 29, 0, 0, 201, 202, 3, 136, 68, 0, 202, 203, 5, 115, 0, 0, 203, 205, 1, 0, 0, 0, 204, 194, 1, 0, 0, 0, 204, 199, 1, 0, 0, 0, 205, 11, 1, 0, 0, 0, 206, 207, 5, 25, 0, 0, 207, 208, 5, 26, 0, 0, 208, 209, 3, 136, 68, 0, 209, 210, 5, 65, 0, 0, 210, 211, 3, 138, 69, 0, 211, 212, 5, 115, 0, 0, 212, 13, 1, 0, 0, 0, 213, 214, 5, 25, 0, 0, 214, 215, 5, 27, 0, 0, 215, 216, 3, 136, 68, 0, 216, 217, 5, 59, 0, 0, 217, 218, 3, 138, 69, 0, 218, 219, 5, 115, 0, 0, 219, 15, 1, 0, 0, 0, 220, 225, 3, 10, 5, 0, 221, 225, 3, 12, 6, 0, 222, 225, 3, 14, 7, 0, 223, 225, 3, 32, 16, 0, 224, 220, 1, 0, 0, 0, 224, 221, 1, 0, 0, 0, 224, 222, 1, 0, 0, 0, 224, 223, 1, 0, 0, 0, 225, 17, 1, 0, 0, 0, 226, 227, 5, 26, 0, 0, 227, 228, 3, 136, 68, 0, 228, 229, 5, 65, 0, 0, 229, 232, 3, 138, 69, 0, 230, 231, 5, 66, 0, 0, 231, 233, 3, 138, 69, 0, 232, 230, 1, 0, 0, 0, 232, 233, 1, 0, 0, 0, 233, 234, 1, 0, 0, 0, 234, 235, 5, 115, 0, 0, 235, 19, 1, 0, 0, 0, 236, 238, 3, 16, 8, 0, 237, 236, 1, 0, 0, 0, 238, 241, 1, 0, 0, 0, 239, 237, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 242, 1, 0, 0, 0, 241, 239, 1, 0, 0, 0, 242, 243, 5, 27, 0, 0, 243, 245, 3, 136, 68, 0, 244, 246, 3, 22, 11, 0, 245, 244, 1, 0, 0, 0, 245, 246, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 247, 248, 5, 65, 0, 0, 248, 249, 3, 138, 69, 0, 249, 250, 5, 59, 0, 0, 250, 260, 3, 138, 69, 0, 251, 252, 5, 70, 0, 0, 252, 257, 3, 26, 13, 0, 253, 254, 5, 116, 0, 0, 254, 256, 3, 26, 13, 0, 255, 253, 1, 0, 0, 0, 256, 259, 1, 0, 0, 0, 257, 255, 1, 0, 0, 0, 257, 258, 1, 0, 0, 0, 258, 261, 1, 0, 0, 0, 259, 257, 1, 0, 0, 0, 260, 251, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 266, 5, 118, 0, 0, 263, 265, 3, 34, 17, 0, 264, 263, 1, 0, 0, 0, 265, 268, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 269, 1, 0, 0, 0, 268, 266, 1, 0, 0, 0, 269, 270, 5, 119, 0, 0, 270, 21, 1, 0, 0, 0, 271, 272, 5, 124, 0, 0, 272, 277, 3, 24, 12, 0, 273, 274, 5, 116, 0, 0, 274, 276, 3, 24, 12, 0, 275, 273, 1, 0, 0, 0, 276, 279, 1, 0, 0, 0, 277, 275, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 280, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 280, 281, 5, 125, 0, 0, 281, 23, 1, 0, 0, 0, 282, 283, 5, 30, 0, 0, 283, 286, 3, 136, 68, 0, 284, 285, 5, 114, 0, 0, 285, 287, 5, 20, 0, 0, 286, 284, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 302, 1, 0, 0, 0, 288, 289, 5, 19, 0, 0, 289, 299, 3, 136, 68, 0, 290, 291, 5, 21, 0, 0, 291, 296, 3, 26, 13, 0, 292, 293, 5, 126, 0, 0, 293, 295, 3, 26, 13, 0, 294, 292, 1, 0, 0, 0, 295, 298, 1, 0, 0, 0, 296, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 300, 1, 0, 0, 0, 298, 296, 1, 0, 0, 0, 299, 290, 1, 0, 0, 0, 299, 300, 1, 0, 0, 0, 300, 302, 1, 0, 0, 0, 301, 282, 1, 0, 0, 0, 301, 288, 1, 0, 0, 0, 302, 25, 1, 0, 0, 0, 303, 305, 3, 136, 68, 0, 304, 306, 3, 28, 14, 0, 305, 304, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 27, 1, 0, 0, 0, 307, 308, 5, 124, 0, 0, 308, 313, 3, 30, 15, 0, 309, 310, 5, 116, 0, 0, 310, 312, 3, 30, 15, 0, 311, 309, 1, 0, 0, 0, 312, 315, 1, 0, 0, 0, 313, 311, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 316, 1, 0, 0, 0, 315, 313, 1, 0, 0, 0, 316, 317, 5, 125, 0, 0, 317, 29, 1, 0, 0, 0, 318, 319, 5, 26, 0, 0, 319, 326, 3, 136, 68, 0, 320, 321, 5, 27, 0, 0, 321, 326, 3, 26, 13, 0, 322, 323, 5, 19, 0, 0, 323, 326, 3, 136, 68, 0, 324, 326, 3, 120, 60, 0, 325, 318, 1, 0, 0, 0, 325, 320, 1, 0, 0, 0, 325, 322, 1, 0, 0, 0, 325, 324, 1, 0, 0, 0, 326, 31, 1, 0, 0, 0, 327, 328, 5, 18, 0, 0, 328, 330, 3, 136, 68, 0, 329, 331, 3, 22, 11, 0, 330, 329, 1, 0, 0, 0, 330, 331, 1, 0, 0, 0, 331, 332, 1, 0, 0, 0, 332, 333, 5, 127, 0, 0, 333, 334, 3, 120, 60, 0, 334, 335, 5, 115, 0, 0, 335, 33, 1, 0, 0, 0, 336, 340, 3, 38, 19, 0, 337, 340, 3, 42, 21, 0, 338, 340, 3, 36, 18, 0, 339, 336, 1, 0, 0, 0, 339, 337, 1, 0, 0, 0, 339, 338, 1, 0, 0, 0, 340, 35, 1, 0, 0, 0, 341, 343, 5, 40, 0, 0, 342, 341, 1, 0, 0, 0, 342, 343, 1, 0, 0, 0, 343, 344, 1, 0, 0, 0, 344, 345, 5, 32, 0, 0, 345, 346, 3, 136, 68, 0, 346, 347, 5, 65, 0, 0, 347, 348, 3, 138, 69, 0, 348, 349, 5, 114, 0, 0, 349, 350, 3, 120, 60, 0, 350, 351, 5, 113, 0, 0, 351, 352, 3, 120, 60, 0, 352, 353, 5, 118, 0, 0, 353, 354, 5, 82, 0, 0, 354, 355, 5, 65, 0, 0, 355, 356, 3, 138, 69, 0, 356, 357, 5, 115, 0, 0, 357, 358, 5, 119, 0, 0, 358, 37, 1, 0, 0, 0, 359, 361, 3, 44, 22, 0, 360, 359, 1, 0, 0, 0, 360, 361, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 363, 5, 30, 0, 0, 363, 364, 3, 136, 68, 0, 364, 365, 5, 65, 0, 0, 365, 366, 3, 138, 69, 0, 366, 367, 5, 114, 0, 0, 367, 368, 3, 120, 60, 0, 368, 372, 5, 118, 0, 0, 369, 371, 3, 40, 20, 0, 370, 369, 1, 0, 0, 0, 371, 374, 1, 0, 0, 0, 372, 370, 1, 0, 0, 0, 372, 373, 1, 0, 0, 0, 373, 375, 1, 0, 0, 0, 374, 372, 1, 0, 0, 0, 375, 376, 5, 119, 0, 0, 376, 39, 1, 0, 0, 0, 377, 378, 5, 72, 0, 0, 378, 379, 5, 65, 0, 0, 379, 380, 3, 138, 69, 0, 380, 381, 5, 115, 0, 0, 381, 397, 1, 0, 0, 0, 382, 383, 5, 73, 0, 0, 383, 384, 5, 65, 0, 0, 384, 385, 3, 138, 69, 0, 385, 386, 5, 115, 0, 0, 386, 397, 1, 0, 0, 0, 387, 388, 5, 74, 0, 0, 388, 389, 5, 75, 0, 0, 389, 390, 5, 65, 0, 0, 390, 391, 3, 138, 69, 0, 391, 392, 5, 76, 0, 0, 392, 393, 5, 65, 0, 0, 393, 394, 3, 138, 69, 0, 394, 395, 5, 115, 0, 0, 395, 397, 1, 0, 0, 0, 396, 377, 1, 0, 0, 0, 396, 382, 1, 0, 0, 0, 396, 387, 1, 0, 0, 0, 397, 41, 1, 0, 0, 0, 398, 400, 3, 44, 22, 0, 399, 398, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 402, 5, 31, 0, 0, 402, 403, 3, 136, 68, 0, 403, 404, 5, 65, 0, 0, 404, 405, 3, 138, 69, 0, 405, 406, 5, 114, 0, 0, 406, 407, 3, 126, 63, 0, 407, 409, 3, 48, 24, 0, 408, 410, 5, 93, 0, 0, 409, 408, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 413, 1, 0, 0, 0, 411, 412, 5, 63, 0, 0, 412, 414, 3, 138, 69, 0, 413, 411, 1, 0, 0, 0, 413, 414, 1, 0, 0, 0, 414, 415, 1, 0, 0, 0, 415, 419, 5, 118, 0, 0, 416, 418, 3, 46, 23, 0, 417, 416, 1, 0, 0, 0, 418, 421, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 419, 1, 0, 0, 0, 422, 423, 5, 119, 0, 0, 423, 43, 1, 0, 0, 0, 424, 426, 5, 15, 0, 0, 425, 427, 5, 16, 0, 0, 426, 425, 1, 0, 0, 0, 426, 427, 1, 0, 0, 0, 427, 45, 1, 0, 0, 0, 428, 429, 5, 79, 0, 0, 429, 430, 5, 65, 0, 0, 430, 431, 3, 138, 69, 0, 431, 432, 5, 115, 0, 0, 432, 453, 1, 0, 0, 0, 433, 434, 5, 80, 0, 0, 434, 435, 5, 65, 0, 0, 435, 436, 3, 138, 69, 0, 436, 437, 5, 115, 0, 0, 437, 453, 1, 0, 0, 0, 438, 439, 5, 81, 0, 0, 439, 440, 5, 65, 0, 0, 440, 441, 3, 138, 69, 0, 441, 442, 5, 115, 0, 0, 442, 453, 1, 0, 0, 0, 443, 444, 5, 74, 0, 0, 444, 445, 5, 75, 0, 0, 445, 446, 5, 65, 0, 0, 446, 447, 3, 138, 69, 0, 447, 448, 5, 76, 0, 0, 448, 449, 5, 65, 0, 0, 449, 450, 3, 138, 69, 0, 450, 451, 5, 115, 0, 0, 451, 453, 1, 0, 0, 0, 452, 428, 1, 0, 0, 0, 452, 433, 1, 0, 0, 0, 452, 438, 1, 0, 0, 0, 452, 443, 1, 0, 0, 0, 453, 47, 1, 0, 0, 0, 454, 455, 5, 26, 0, 0, 455, 464, 3, 136, 68, 0, 456, 457, 5, 27, 0, 0, 457, 459, 3, 136, 68, 0, 458, 460, 3, 28, 14, 0, 459, 458, 1, 0, 0, 0, 459, 460, 1, 0, 0, 0, 460, 464, 1, 0, 0, 0, 461, 462, 5, 19, 0, 0, 462, 464, 3, 136, 68, 0, 463, 454, 1, 0, 0, 0, 463, 456, 1, 0, 0, 0, 463, 461, 1, 0, 0, 0, 464, 49, 1, 0, 0, 0, 465, 467, 3, 16, 8, 0, 466, 465, 1, 0, 0, 0, 467, 470, 1, 0, 0, 0, 468, 466, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 471, 1, 0, 0, 0, 470, 468, 1, 0, 0, 0, 471, 472, 5, 29, 0, 0, 472, 473, 3, 136, 68, 0, 473, 474, 5, 65, 0, 0, 474, 475, 3, 138, 69, 0, 475, 476, 5, 59, 0, 0, 476, 479, 3, 138, 69, 0, 477, 478, 5, 60, 0, 0, 478, 480, 5, 128, 0, 0, 479, 477, 1, 0, 0, 0, 479, 480, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 485, 5, 118, 0, 0, 482, 484, 3, 52, 26, 0, 483, 482, 1, 0, 0, 0, 484, 487, 1, 0, 0, 0, 485, 483, 1, 0, 0, 0, 485, 486, 1, 0, 0, 0, 486, 488, 1, 0, 0, 0, 487, 485, 1, 0, 0, 0, 488, 489, 5, 119, 0, 0, 489, 51, 1, 0, 0, 0, 490, 496, 3, 60, 30, 0, 491, 496, 3, 62, 31, 0, 492, 496, 3, 64, 32, 0, 493, 496, 3, 54, 27, 0, 494, 496, 3, 56, 28, 0, 495, 490, 1, 0, 0, 0, 495, 491, 1, 0, 0, 0, 495, 492, 1, 0, 0, 0, 495, 493, 1, 0, 0, 0, 495, 494, 1, 0, 0, 0, 496, 53, 1, 0, 0, 0, 497, 498, 5, 5, 0, 0, 498, 500, 3, 136, 68, 0, 499, 501, 3, 22, 11, 0, 500, 499, 1, 0, 0, 0, 500, 501, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 5, 65, 0, 0, 503, 504, 3, 138, 69, 0, 504, 506, 5, 8, 0, 0, 505, 507, 5, 1, 0, 0, 506, 505, 1, 0, 0, 0, 506, 507, 1, 0, 0, 0, 507, 508, 1, 0, 0, 0, 508, 509, 3, 26, 13, 0, 509, 510, 5, 9, 0, 0, 510, 511, 3, 138, 69, 0, 511, 512, 5, 32, 0, 0, 512, 513, 3, 138, 69, 0, 513, 517, 5, 118, 0, 0, 514, 516, 3, 58, 29, 0, 515, 514, 1, 0, 0, 0, 516, 519, 1, 0, 0, 0, 517, 515, 1, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 520, 1, 0, 0, 0, 519, 517, 1, 0, 0, 0, 520, 521, 5, 119, 0, 0, 521, 55, 1, 0, 0, 0, 522, 523, 5, 5, 0, 0, 523, 524, 3, 136, 68, 0, 524, 525, 5, 65, 0, 0, 525, 526, 3, 138, 69, 0, 526, 527, 5, 7, 0, 0, 527, 528, 3, 136, 68, 0, 528, 529, 3, 28, 14, 0, 529, 530, 5, 115, 0, 0, 530, 57, 1, 0, 0, 0, 531, 532, 5, 10, 0, 0, 532, 533, 3, 138, 69, 0, 533, 534, 5, 115, 0, 0, 534, 565, 1, 0, 0, 0, 535, 537, 5, 11, 0, 0, 536, 538, 5, 19, 0, 0, 537, 536, 1, 0, 0, 0, 537, 538, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 540, 3, 136, 68, 0, 540, 541, 5, 38, 0, 0, 541, 542, 3, 26, 13, 0, 542, 543, 5, 115, 0, 0, 543, 565, 1, 0, 0, 0, 544, 545, 5, 12, 0, 0, 545, 546, 3, 136, 68, 0, 546, 547, 5, 128, 0, 0, 547, 548, 5, 115, 0, 0, 548, 565, 1, 0, 0, 0, 549, 550, 5, 13, 0, 0, 550, 551, 3, 26, 13, 0, 551, 552, 5, 117, 0, 0, 552, 553, 3, 136, 68, 0, 553, 554, 3, 136, 68, 0, 554, 555, 3, 138, 69, 0, 555, 556, 5, 115, 0, 0, 556, 565, 1, 0, 0, 0, 557, 558, 5, 74, 0, 0, 558, 565, 5, 115, 0, 0, 559, 560, 5, 14, 0, 0, 560, 561, 5, 128, 0, 0, 561, 562, 3, 138, 69, 0, 562, 563, 5, 115, 0, 0, 563, 565, 1, 0, 0, 0, 564, 531, 1, 0, 0, 0, 564, 535, 1, 0, 0, 0, 564, 544, 1, 0, 0, 0, 564, 549, 1, 0, 0, 0, 564, 557, 1, 0, 0, 0, 564, 559, 1, 0, 0, 0, 565, 59, 1, 0, 0, 0, 566, 567, 5, 32, 0, 0, 567, 569, 3, 136, 68, 0, 568, 570, 3, 22, 11, 0, 569, 568, 1, 0, 0, 0, 569, 570, 1, 0, 0, 0, 570, 571, 1, 0, 0, 0, 571, 572, 5, 65, 0, 0, 572, 573, 3, 138, 69, 0, 573, 574, 5, 114, 0, 0, 574, 575, 3, 120, 60, 0, 575, 576, 5, 113, 0, 0, 576, 577, 3, 120, 60, 0, 577, 578, 5, 67, 0, 0, 578, 580, 3, 68, 34, 0, 579, 581, 3, 66, 33, 0, 580, 579, 1, 0, 0, 0, 580, 581, 1, 0, 0, 0, 581, 582, 1, 0, 0, 0, 582, 583, 5, 69, 0, 0, 583, 585, 3, 70, 35, 0, 584, 586, 3, 74, 37, 0, 585, 584, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 587, 1, 0, 0, 0, 587, 588, 5, 115, 0, 0, 588, 61, 1, 0, 0, 0, 589, 590, 5, 33, 0, 0, 590, 592, 3, 136, 68, 0, 591, 593, 3, 22, 11, 0, 592, 591, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 595, 5, 65, 0, 0, 595, 596, 3, 138, 69, 0, 596, 597, 5, 114, 0, 0, 597, 598, 3, 120, 60, 0, 598, 599, 5, 113, 0, 0, 599, 601, 3, 120, 60, 0, 600, 602, 3, 74, 37, 0, 601, 600, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 604, 5, 115, 0, 0, 604, 63, 1, 0, 0, 0, 605, 606, 5, 34, 0, 0, 606, 607, 3, 136, 68, 0, 607, 608, 5, 65, 0, 0, 608, 609, 3, 138, 69, 0, 609, 610, 5, 35, 0, 0, 610, 611, 3, 136, 68, 0, 611, 612, 5, 114, 0, 0, 612, 614, 3, 120, 60, 0, 613, 615, 3, 74, 37, 0, 614, 613, 1, 0, 0, 0, 614, 615, 1, 0, 0, 0, 615, 616, 1, 0, 0, 0, 616, 617, 5, 115, 0, 0, 617, 65, 1, 0, 0, 0, 618, 619, 5, 68, 0, 0, 619, 620, 3, 120, 60, 0, 620, 67, 1, 0, 0, 0, 621, 622, 7, 0, 0, 0, 622, 69, 1, 0, 0, 0, 623, 642, 5, 71, 0, 0, 624, 625, 5, 26, 0, 0, 625, 642, 3, 136, 68, 0, 626, 627, 5, 19, 0, 0, 627, 642, 3, 136, 68, 0, 628, 629, 5, 28, 0, 0, 629, 638, 5, 120, 0, 0, 630, 635, 3, 26, 13, 0, 631, 632, 5, 116, 0, 0, 632, 634, 3, 26, 13, 0, 633, 631, 1, 0, 0, 0, 634, 637, 1, 0, 0, 0, 635, 633, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 639, 1, 0, 0, 0, 637, 635, 1, 0, 0, 0, 638, 630, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 642, 5, 121, 0, 0, 641, 623, 1, 0, 0, 0, 641, 624, 1, 0, 0, 0, 641, 626, 1, 0, 0, 0, 641, 628, 1, 0, 0, 0, 642, 71, 1, 0, 0, 0, 643, 648, 3, 136, 68, 0, 644, 645, 5, 116, 0, 0, 645, 647, 3, 136, 68, 0, 646, 644, 1, 0, 0, 0, 647, 650, 1, 0, 0, 0, 648, 646, 1, 0, 0, 0, 648, 649, 1, 0, 0, 0, 649, 73, 1, 0, 0, 0, 650, 648, 1, 0, 0, 0, 651, 652, 5, 70, 0, 0, 652, 656, 5, 118, 0, 0, 653, 655, 3, 76, 38, 0, 654, 653, 1, 0, 0, 0, 655, 658, 1, 0, 0, 0, 656, 654, 1, 0, 0, 0, 656, 657, 1, 0, 0, 0, 657, 659, 1, 0, 0, 0, 658, 656, 1, 0, 0, 0, 659, 660, 5, 119, 0, 0, 660, 75, 1, 0, 0, 0, 661, 662, 5, 6, 0, 0, 662, 663, 3, 136, 68, 0, 663, 664, 5, 65, 0, 0, 664, 665, 3, 138, 69, 0, 665, 666, 5, 120, 0, 0, 666, 667, 3, 72, 36, 0, 667, 668, 5, 121, 0, 0, 668, 669, 5, 115, 0, 0, 669, 723, 1, 0, 0, 0, 670, 671, 5, 44, 0, 0, 671, 672, 3, 136, 68, 0, 672, 673, 5, 65, 0, 0, 673, 674, 3, 138, 69, 0, 674, 675, 5, 114, 0, 0, 675, 676, 3, 120, 60, 0, 676, 677, 3, 78, 39, 0, 677, 678, 5, 115, 0, 0, 678, 723, 1, 0, 0, 0, 679, 680, 5, 45, 0, 0, 680, 681, 3, 136, 68, 0, 681, 682, 5, 65, 0, 0, 682, 683, 3, 138, 69, 0, 683, 684, 5, 114, 0, 0, 684, 685, 3, 126, 63, 0, 685, 686, 3, 48, 24, 0, 686, 687, 3, 78, 39, 0, 687, 688, 5, 115, 0, 0, 688, 723, 1, 0, 0, 0, 689, 690, 5, 27, 0, 0, 690, 691, 3, 136, 68, 0, 691, 692, 5, 65, 0, 0, 692, 693, 3, 138, 69, 0, 693, 694, 5, 114, 0, 0, 694, 696, 3, 136, 68, 0, 695, 697, 3, 28, 14, 0, 696, 695, 1, 0, 0, 0, 696, 697, 1, 0, 0, 0, 697, 698, 1, 0, 0, 0, 698, 699, 5, 115, 0, 0, 699, 723, 1, 0, 0, 0, 700, 701, 5, 34, 0, 0, 701, 702, 3, 136, 68, 0, 702, 703, 5, 65, 0, 0, 703, 704, 3, 138, 69, 0, 704, 705, 5, 114, 0, 0, 705, 708, 3, 136, 68, 0, 706, 707, 5, 36, 0, 0, 707, 709, 3, 120, 60, 0, 708, 706, 1, 0, 0, 0, 708, 709, 1, 0, 0, 0, 709, 710, 1, 0, 0, 0, 710, 711, 5, 115, 0, 0, 711, 723, 1, 0, 0, 0, 712, 713, 5, 5, 0, 0, 713, 714, 3, 136, 68, 0, 714, 715, 5, 65, 0, 0, 715, 716, 3, 138, 69, 0, 716, 717, 5, 114, 0, 0, 717, 718, 3, 136, 68, 0, 718, 719, 5, 117, 0, 0, 719, 720, 3, 136, 68, 0, 720, 721, 5, 115, 0, 0, 721, 723, 1, 0, 0, 0, 722, 661, 1, 0, 0, 0, 722, 670, 1, 0, 0, 0, 722, 679, 1, 0, 0, 0, 722, 689, 1, 0, 0, 0, 722, 700, 1, 0, 0, 0, 722, 712, 1, 0, 0, 0, 723, 77, 1, 0, 0, 0, 724, 725, 5, 120, 0, 0, 725, 730, 3, 80, 40, 0, 726, 727, 5, 116, 0, 0, 727, 729, 3, 80, 40, 0, 728, 726, 1, 0, 0, 0, 729, 732, 1, 0, 0, 0, 730, 728, 1, 0, 0, 0, 730, 731, 1, 0, 0, 0, 731, 733, 1, 0, 0, 0, 732, 730, 1, 0, 0, 0, 733, 734, 5, 121, 0, 0, 734, 79, 1, 0, 0, 0, 735, 736, 7, 1, 0, 0, 736, 81, 1, 0, 0, 0, 737, 738, 5, 43, 0, 0, 738, 739, 3, 84, 42, 0, 739, 83, 1, 0, 0, 0, 740, 743, 3, 86, 43, 0, 741, 743, 3, 90, 45, 0, 742, 740, 1, 0, 0, 0, 742, 741, 1, 0, 0, 0, 743, 85, 1, 0, 0, 0, 744, 745, 5, 44, 0, 0, 745, 746, 3, 136, 68, 0, 746, 747, 5, 65, 0, 0, 747, 748, 3, 138, 69, 0, 748, 749, 5, 53, 0, 0, 749, 750, 3, 136, 68, 0, 750, 751, 5, 114, 0, 0, 751, 752, 3, 120, 60, 0, 752, 753, 5, 54, 0, 0, 753, 756, 3, 88, 44, 0, 754, 755, 5, 55, 0, 0, 755, 757, 3, 128, 64, 0, 756, 754, 1, 0, 0, 0, 756, 757, 1, 0, 0, 0, 757, 758, 1, 0, 0, 0, 758, 759, 5, 115, 0, 0, 759, 87, 1, 0, 0, 0, 760, 767, 5, 87, 0, 0, 761, 762, 5, 88, 0, 0, 762, 763, 5, 122, 0, 0, 763, 764, 3, 120, 60, 0, 764, 765, 5, 123, 0, 0, 765, 767, 1, 0, 0, 0, 766, 760, 1, 0, 0, 0, 766, 761, 1, 0, 0, 0, 767, 89, 1, 0, 0, 0, 768, 769, 5, 45, 0, 0, 769, 770, 3, 136, 68, 0, 770, 771, 5, 65, 0, 0, 771, 772, 3, 138, 69, 0, 772, 773, 5, 118, 0, 0, 773, 774, 3, 92, 46, 0, 774, 775, 3, 92, 46, 0, 775, 776, 5, 119, 0, 0, 776, 91, 1, 0, 0, 0, 777, 778, 3, 48, 24, 0, 778, 779, 5, 46, 0, 0, 779, 780, 3, 136, 68, 0, 780, 781, 5, 65, 0, 0, 781, 782, 3, 138, 69, 0, 782, 784, 3, 126, 63, 0, 783, 785, 5, 93, 0, 0, 784, 783, 1, 0, 0, 0, 784, 785, 1, 0, 0, 0, 785, 788, 1, 0, 0, 0, 786, 787, 5, 61, 0, 0, 787, 789, 3, 138, 69, 0, 788, 786, 1, 0, 0, 0, 788, 789, 1, 0, 0, 0, 789, 791, 1, 0, 0, 0, 790, 792, 5, 62, 0, 0, 791, 790, 1, 0, 0, 0, 791, 792, 1, 0, 0, 0, 792, 795, 1, 0, 0, 0, 793, 794, 5, 63, 0, 0, 794, 796, 3, 138, 69, 0, 795, 793, 1, 0, 0, 0, 795, 796, 1, 0, 0, 0, 796, 798, 1, 0, 0, 0, 797, 799, 5, 64, 0, 0, 798, 797, 1, 0, 0, 0, 798, 799, 1, 0, 0, 0, 799, 800, 1, 0, 0, 0, 800, 801, 5, 115, 0, 0, 801, 93, 1, 0, 0, 0, 802, 803, 5, 37, 0, 0, 803, 804, 3, 136, 68, 0, 804, 805, 5, 38, 0, 0, 805, 807, 3, 136, 68, 0, 806, 808, 3, 28, 14, 0, 807, 806, 1, 0, 0, 0, 807, 808, 1, 0, 0, 0, 808, 811, 1, 0, 0, 0, 809, 810, 5, 65, 0, 0, 810, 812, 3, 138, 69, 0, 811, 809, 1, 0, 0, 0, 811, 812, 1, 0, 0, 0, 812, 815, 1, 0, 0, 0, 813, 814, 5, 60, 0, 0, 814, 816, 5, 128, 0, 0, 815, 813, 1, 0, 0, 0, 815, 816, 1, 0, 0, 0, 816, 817, 1, 0, 0, 0, 817, 821, 5, 118, 0, 0, 818, 820, 3, 96, 48, 0, 819, 818, 1, 0, 0, 0, 820, 823, 1, 0, 0, 0, 821, 819, 1, 0, 0, 0, 821, 822, 1, 0, 0, 0, 822, 824, 1, 0, 0, 0, 823, 821, 1, 0, 0, 0, 824, 825, 5, 119, 0, 0, 825, 95, 1, 0, 0, 0, 826, 827, 5, 42, 0, 0, 827, 832, 3, 84, 42, 0, 828, 832, 3, 102, 51, 0, 829, 832, 3, 98, 49, 0, 830, 832, 3, 100, 50, 0, 831, 826, 1, 0, 0, 0, 831, 828, 1, 0, 0, 0, 831, 829, 1, 0, 0, 0, 831, 830, 1, 0, 0, 0, 832, 97, 1, 0, 0, 0, 833, 834, 5, 39, 0, 0, 834, 835, 3, 136, 68, 0, 835, 836, 5, 41, 0, 0, 836, 837, 5, 44, 0, 0, 837, 838, 3, 136, 68, 0, 838, 839, 5, 115, 0, 0, 839, 99, 1, 0, 0, 0, 840, 841, 5, 50, 0, 0, 841, 842, 3, 136, 68, 0, 842, 843, 5, 51, 0, 0, 843, 844, 5, 52, 0, 0, 844, 845, 5, 48, 0, 0, 845, 846, 5, 34, 0, 0, 846, 847, 3, 136, 68, 0, 847, 848, 5, 49, 0, 0, 848, 849, 5, 45, 0, 0, 849, 850, 3, 136, 68, 0, 850, 851, 5, 117, 0, 0, 851, 852, 3, 136, 68, 0, 852, 853, 5, 115, 0, 0, 853, 101, 1, 0, 0, 0, 854, 855, 5, 39, 0, 0, 855, 856, 3, 104, 52, 0, 856, 857, 5, 41, 0, 0, 857, 860, 3, 108, 54, 0, 858, 859, 5, 17, 0, 0, 859, 861, 3, 138, 69, 0, 860, 858, 1, 0, 0, 0, 860, 861, 1, 0, 0, 0, 861, 862, 1, 0, 0, 0, 862, 863, 5, 115, 0, 0, 863, 103, 1, 0, 0, 0, 864, 865, 3, 136, 68, 0, 865, 866, 5, 117, 0, 0, 866, 867, 3, 106, 53, 0, 867, 105, 1, 0, 0, 0, 868, 880, 3, 136, 68, 0, 869, 880, 5, 82, 0, 0, 870, 880, 5, 72, 0, 0, 871, 880, 5, 73, 0, 0, 872, 880, 5, 79, 0, 0, 873, 880, 5, 80, 0, 0, 874, 880, 5, 81, 0, 0, 875, 880, 5, 83, 0, 0, 876, 880, 5, 84, 0, 0, 877, 880, 5, 85, 0, 0, 878, 880, 5, 86, 0, 0, 879, 868, 1, 0, 0, 0, 879, 869, 1, 0, 0, 0, 879, 870, 1, 0, 0, 0, 879, 871, 1, 0, 0, 0, 879, 872, 1, 0, 0, 0, 879, 873, 1, 0, 0, 0, 879, 874, 1, 0, 0, 0, 879, 875, 1, 0, 0, 0, 879, 876, 1, 0, 0, 0, 879, 877, 1, 0, 0, 0, 879, 878, 1, 0, 0, 0, 880, 107, 1, 0, 0, 0, 881, 882, 5, 44, 0, 0, 882, 883, 3, 136, 68, 0, 883, 884, 5, 117, 0, 0, 884, 885, 3, 110, 55, 0, 885, 912, 1, 0, 0, 0, 886, 887, 5, 45, 0, 0, 887, 888, 3, 136, 68, 0, 888, 889, 5, 117, 0, 0, 889, 890, 3, 136, 68, 0, 890, 891, 5, 117, 0, 0, 891, 892, 3, 112, 56, 0, 892, 912, 1, 0, 0, 0, 893, 894, 5, 27, 0, 0, 894, 896, 3, 136, 68, 0, 895, 897, 3, 28, 14, 0, 896, 895, 1, 0, 0, 0, 896, 897, 1, 0, 0, 0, 897, 898, 1, 0, 0, 0, 898, 899, 5, 117, 0, 0, 899, 900, 3, 104, 52, 0, 900, 912, 1, 0, 0, 0, 901, 902, 5, 29, 0, 0, 902, 903, 3, 136, 68, 0, 903, 904, 5, 117, 0, 0, 904, 906, 3, 136, 68, 0, 905, 907, 3, 28, 14, 0, 906, 905, 1, 0, 0, 0, 906, 907, 1, 0, 0, 0, 907, 909, 1, 0, 0, 0, 908, 910, 3, 114, 57, 0, 909, 908, 1, 0, 0, 0, 909, 910, 1, 0, 0, 0, 910, 912, 1, 0, 0, 0, 911, 881, 1, 0, 0, 0, 911, 886, 1, 0, 0, 0, 911, 893, 1, 0, 0, 0, 911, 901, 1, 0, 0, 0, 912, 109, 1, 0, 0, 0, 913, 914, 7, 2, 0, 0, 914, 111, 1, 0, 0, 0, 915, 916, 7, 3, 0, 0, 916, 113, 1, 0, 0, 0, 917, 918, 5, 47, 0, 0, 918, 922, 5, 118, 0, 0, 919, 921, 3, 116, 58, 0, 920, 919, 1, 0, 0, 0, 921, 924, 1, 0, 0, 0, 922, 920, 1, 0, 0, 0, 922, 923, 1, 0, 0, 0, 923, 925, 1, 0, 0, 0, 924, 922, 1, 0, 0, 0, 925, 926, 5, 119, 0, 0, 926, 115, 1, 0, 0, 0, 927, 928, 3, 136, 68, 0, 928, 929, 5, 41, 0, 0, 929, 930, 5, 1, 0, 0, 930, 931, 5, 6, 0, 0, 931, 932, 5, 120, 0, 0, 932, 933, 3, 72, 36, 0, 933, 934, 5, 121, 0, 0, 934, 935, 5, 115, 0, 0, 935, 1009, 1, 0, 0, 0, 936, 937, 3, 136, 68, 0, 937, 938, 5, 41, 0, 0, 938, 939, 5, 44, 0, 0, 939, 946, 3, 136, 68, 0, 940, 941, 5, 49, 0, 0, 941, 942, 5, 45, 0, 0, 942, 943, 3, 136, 68, 0, 943, 944, 5, 117, 0, 0, 944, 945, 3, 136, 68, 0, 945, 947, 1, 0, 0, 0, 946, 940, 1, 0, 0, 0, 946, 947, 1, 0, 0, 0, 947, 948, 1, 0, 0, 0, 948, 949, 5, 115, 0, 0, 949, 1009, 1, 0, 0, 0, 950, 951, 3, 136, 68, 0, 951, 952, 5, 41, 0, 0, 952, 953, 5, 45, 0, 0, 953, 954, 3, 136, 68, 0, 954, 955, 5, 117, 0, 0, 955, 962, 3, 136, 68, 0, 956, 957, 5, 49, 0, 0, 957, 958, 5, 45, 0, 0, 958, 959, 3, 136, 68, 0, 959, 960, 5, 117, 0, 0, 960, 961, 3, 136, 68, 0, 961, 963, 1, 0, 0, 0, 962, 956, 1, 0, 0, 0, 962, 963, 1, 0, 0, 0, 963, 964, 1, 0, 0, 0, 964, 965, 5, 115, 0, 0, 965, 1009, 1, 0, 0, 0, 966, 967, 3, 136, 68, 0, 967, 968, 5, 41, 0, 0, 968, 969, 5, 27, 0, 0, 969, 971, 3, 136, 68, 0, 970, 972, 3, 28, 14, 0, 971, 970, 1, 0, 0, 0, 971, 972, 1, 0, 0, 0, 972, 979, 1, 0, 0, 0, 973, 974, 5, 49, 0, 0, 974, 975, 5, 45, 0, 0, 975, 976, 3, 136, 68, 0, 976, 977, 5, 117, 0, 0, 977, 978, 3, 136, 68, 0, 978, 980, 1, 0, 0, 0, 979, 973, 1, 0, 0, 0, 979, 980, 1, 0, 0, 0, 980, 981, 1, 0, 0, 0, 981, 982, 5, 115, 0, 0, 982, 1009, 1, 0, 0, 0, 983, 984, 3, 136, 68, 0, 984, 985, 5, 41, 0, 0, 985, 986, 5, 34, 0, 0, 986, 987, 3, 136, 68, 0, 987, 988, 5, 115, 0, 0, 988, 1009, 1, 0, 0, 0, 989, 990, 3, 136, 68, 0, 990, 992, 5, 41, 0, 0, 991, 993, 5, 1, 0, 0, 992, 991, 1, 0, 0, 0, 992, 993, 1, 0, 0, 0, 993, 994, 1, 0, 0, 0, 994, 995, 5, 5, 0, 0, 995, 996, 3, 136, 68, 0, 996, 997, 5, 117, 0, 0, 997, 1004, 3, 136, 68, 0, 998, 999, 5, 49, 0, 0, 999, 1000, 5, 45, 0, 0, 1000, 1001, 3, 136, 68, 0, 1001, 1002, 5, 117, 0, 0, 1002, 1003, 3, 136, 68, 0, 1003, 1005, 1, 0, 0, 0, 1004, 998, 1, 0, 0, 0, 1004, 1005, 1, 0, 0, 0, 1005, 1006, 1, 0, 0, 0, 1006, 1007, 5, 115, 0, 0, 1007, 1009, 1, 0, 0, 0, 1008, 927, 1, 0, 0, 0, 1008, 936, 1, 0, 0, 0, 1008, 950, 1, 0, 0, 0, 1008, 966, 1, 0, 0, 0, 1008, 983, 1, 0, 0, 0, 1008, 989, 1, 0, 0, 0, 1009, 117, 1, 0, 0, 0, 1010, 1011, 5, 34, 0, 0, 1011, 1012, 3, 136, 68, 0, 1012, 1013, 5, 41, 0, 0, 1013, 1014, 3, 136, 68, 0, 1014, 1015, 5, 117, 0, 0, 1015, 1017, 3, 136, 68, 0, 1016, 1018, 3, 114, 57, 0, 1017, 1016, 1, 0, 0, 0, 1017, 1018, 1, 0, 0, 0, 1018, 1019, 1, 0, 0, 0, 1019, 1020, 5, 115, 0, 0, 1020, 119, 1, 0, 0, 0, 1021, 1068, 3, 124, 62, 0, 1022, 1068, 5, 94, 0, 0, 1023, 1068, 5, 95, 0, 0, 1024, 1025, 5, 96, 0, 0, 1025, 1068, 3, 138, 69, 0, 1026, 1027, 5, 97, 0, 0, 1027, 1028, 5, 124, 0, 0, 1028, 1029, 3, 136, 68, 0, 1029, 1030, 5, 125, 0, 0, 1030, 1068, 1, 0, 0, 0, 1031, 1032, 5, 98, 0, 0, 1032, 1033, 5, 124, 0, 0, 1033, 1035, 3, 136, 68, 0, 1034, 1036, 3, 28, 14, 0, 1035, 1034, 1, 0, 0, 0, 1035, 1036, 1, 0, 0, 0, 1036, 1037, 1, 0, 0, 0, 1037, 1038, 5, 125, 0, 0, 1038, 1068, 1, 0, 0, 0, 1039, 1040, 5, 22, 0, 0, 1040, 1041, 5, 124, 0, 0, 1041, 1042, 3, 136, 68, 0, 1042, 1043, 5, 125, 0, 0, 1043, 1068, 1, 0, 0, 0, 1044, 1045, 5, 99, 0, 0, 1045, 1046, 5, 124, 0, 0, 1046, 1047, 3, 120, 60, 0, 1047, 1048, 5, 125, 0, 0, 1048, 1068, 1, 0, 0, 0, 1049, 1050, 5, 100, 0, 0, 1050, 1051, 5, 124, 0, 0, 1051, 1052, 3, 120, 60, 0, 1052, 1053, 5, 125, 0, 0, 1053, 1068, 1, 0, 0, 0, 1054, 1055, 5, 101, 0, 0, 1055, 1059, 5, 118, 0, 0, 1056, 1058, 3, 122, 61, 0, 1057, 1056, 1, 0, 0, 0, 1058, 1061, 1, 0, 0, 0, 1059, 1057, 1, 0, 0, 0, 1059, 1060, 1, 0, 0, 0, 1060, 1062, 1, 0, 0, 0, 1061, 1059, 1, 0, 0, 0, 1062, 1068, 5, 119, 0, 0, 1063, 1065, 3, 136, 68, 0, 1064, 1066, 3, 28, 14, 0, 1065, 1064, 1, 0, 0, 0, 1065, 1066, 1, 0, 0, 0, 1066, 1068, 1, 0, 0, 0, 1067, 1021, 1, 0, 0, 0, 1067, 1022, 1, 0, 0, 0, 1067, 1023, 1, 0, 0, 0, 1067, 1024, 1, 0, 0, 0, 1067, 1026, 1, 0, 0, 0, 1067, 1031, 1, 0, 0, 0, 1067, 1039, 1, 0, 0, 0, 1067, 1044, 1, 0, 0, 0, 1067, 1049, 1, 0, 0, 0, 1067, 1054, 1, 0, 0, 0, 1067, 1063, 1, 0, 0, 0, 1068, 121, 1, 0, 0, 0, 1069, 1070, 3, 136, 68, 0, 1070, 1071, 5, 114, 0, 0, 1071, 1072, 3, 120, 60, 0, 1072, 1073, 5, 115, 0, 0, 1073, 123, 1, 0, 0, 0, 1074, 1075, 7, 4, 0, 0, 1075, 125, 1, 0, 0, 0, 1076, 1077, 7, 5, 0, 0, 1077, 127, 1, 0, 0, 0, 1078, 1087, 3, 138, 69, 0, 1079, 1087, 5, 128, 0, 0, 1080, 1087, 5, 129, 0, 0, 1081, 1087, 5, 110, 0, 0, 1082, 1087, 5, 111, 0, 0, 1083, 1087, 5, 112, 0, 0, 1084, 1087, 3, 130, 65, 0, 1085, 1087, 3, 134, 67, 0, 1086, 1078, 1, 0, 0, 0, 1086, 1079, 1, 0, 0, 0, 1086, 1080, 1, 0, 0, 0, 1086, 1081, 1, 0, 0, 0, 1086, 1082, 1, 0, 0, 0, 1086, 1083, 1, 0, 0, 0, 1086, 1084, 1, 0, 0, 0, 1086, 1085, 1, 0, 0, 0, 1087, 129, 1, 0, 0, 0, 1088, 1097, 5, 118, 0, 0, 1089, 1094, 3, 132, 66, 0, 1090, 1091, 5, 116, 0, 0, 1091, 1093, 3, 132, 66, 0, 1092, 1090, 1, 0, 0, 0, 1093, 1096, 1, 0, 0, 0, 1094, 1092, 1, 0, 0, 0, 1094, 1095, 1, 0, 0, 0, 1095, 1098, 1, 0, 0, 0, 1096, 1094, 1, 0, 0, 0, 1097, 1089, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1099, 1, 0, 0, 0, 1099, 1100, 5, 119, 0, 0, 1100, 131, 1, 0, 0, 0, 1101, 1102, 3, 138, 69, 0, 1102, 1103, 5, 114, 0, 0, 1103, 1104, 3, 128, 64, 0, 1104, 133, 1, 0, 0, 0, 1105, 1114, 5, 120, 0, 0, 1106, 1111, 3, 128, 64, 0, 1107, 1108, 5, 116, 0, 0, 1108, 1110, 3, 128, 64, 0, 1109, 1107, 1, 0, 0, 0, 1110, 1113, 1, 0, 0, 0, 1111, 1109, 1, 0, 0, 0, 1111, 1112, 1, 0, 0, 0, 1112, 1115, 1, 0, 0, 0, 1113, 1111, 1, 0, 0, 0, 1114, 1106, 1, 0, 0, 0, 1114, 1115, 1, 0, 0, 0, 1115, 1116, 1, 0, 0, 0, 1116, 1117, 5, 121, 0, 0, 1117, 135, 1, 0, 0, 0, 1118, 1119, 7, 6, 0, 0, 1119, 137, 1, 0, 0, 0, 1120, 1121, 5, 131, 0, 0, 1121, 139, 1, 0, 0, 0, 95, 152, 159, 180, 192, 204, 224, 232, 239, 245, 257, 260, 266, 277, 286, 296, 299, 301, 305, 313, 325, 330, 339, 342, 360, 372, 396, 399, 409, 413, 419, 426, 452, 459, 463, 468, 479, 485, 495, 500, 506, 517, 537, 564, 569, 580, 585, 592, 601, 614, 635, 638, 641, 648, 656, 696, 708, 722, 730, 742, 756, 766, 784, 788, 791, 795, 798, 807, 811, 815, 821, 831, 860, 879, 896, 906, 909, 911, 922, 946, 962, 971, 979, 992, 1004, 1008, 1017, 1035, 1059, 1065, 1067, 1086, 1094, 1097, 1111, 1114] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapability.tokens b/src/capability-language/generated/QuixosCapability.tokens index c90ad75..81f78bd 100644 --- a/src/capability-language/generated/QuixosCapability.tokens +++ b/src/capability-language/generated/QuixosCapability.tokens @@ -3,257 +3,259 @@ RESULT_BYTES=2 RPC_CALLS=3 DEADLINE_MS=4 QUERY=5 -SPECIALIZE=6 -ROOT=7 -DOCUMENT=8 -FRAGMENTS=9 -VIEW=10 -MAX=11 -ALLOW=12 -POLL=13 -QUERYABLE=14 -RPC=15 -QUERY_REASON=16 -TYPE=17 -OBJECT=18 -STORABLE=19 -IMPLEMENTS=20 -REF=21 -FRAGMENT=22 -IMPORT=23 -EXTERNAL=24 -ATOM=25 -INTERFACE=26 -INTERFACES=27 -PACKAGE=28 -VALUE=29 -RELATION=30 -OPERATION=31 -FUNCTION=32 -CONSTRUCTOR=33 -CONSTRUCTS=34 -INPUT=35 -CONFORM=36 -AS=37 -BIND=38 -STATIC=39 -TO=40 -PRIVATE=41 -SHARED=42 -STATE=43 -EDGE=44 -PROJECTION=45 -WITH=46 -USING=47 -VIA=48 -MATERIALIZE=49 -IF=50 -ABSENT=51 -ON=52 -POLICY=53 -DEFAULT=54 -SOURCE=55 -REPOSITORY=56 -COMMIT=57 -REVISION=58 -SEMANTIC_MAJOR=59 -ON_DELETE=60 -RETAIN_OTHER=61 -KEYED=62 -PUBLIC_TRAVERSAL=63 -ID=64 -DOC=65 -MODE=66 -EMITS=67 -RECEIVER=68 -REQUIRES=69 -ANY=70 -GET=71 -SET=72 -WATCH=73 -START=74 -STOP=75 -READ=76 -WRITE=77 -RESOLVE=78 -CONNECT=79 -DISCONNECT=80 -CALL=81 -WATCH_START=82 -WATCH_STOP=83 -SUBSCRIBE=84 -UNSUBSCRIBE=85 -OPTIMISTIC_REGISTER=86 -CRDT=87 -OPTIONAL_ONE=88 -EXACTLY_ONE=89 -MANY_UNIQUE=90 -MANY=91 -ORDERED=92 -UNIT=93 -WATCH_HANDLE=94 -MESSAGE=95 -ATOM_REF=96 -INTERFACE_REF=97 -OPTIONAL=98 -LIST=99 -RECORD=100 -BOOL=101 -BYTES=102 -DOUBLE=103 -INT32=104 -INT64=105 -STRING=106 -UINT32=107 -UINT64=108 -TRUE=109 -FALSE=110 -NULL=111 -ARROW=112 -COLON=113 -SEMI=114 -COMMA=115 -DOT=116 -LBRACE=117 -RBRACE=118 -LBRACK=119 -RBRACK=120 -LPAREN=121 -RPAREN=122 -LT=123 -GT=124 -AMP=125 -EQUAL=126 -INTEGER=127 -JSON_NUMBER=128 -IDENTIFIER=129 -STRING_LITERAL=130 -LINE_COMMENT=131 -BLOCK_COMMENT=132 -WS=133 +REFLECTION=6 +SPECIALIZE=7 +ROOT=8 +DOCUMENT=9 +FRAGMENTS=10 +VIEW=11 +MAX=12 +ALLOW=13 +POLL=14 +QUERYABLE=15 +RPC=16 +QUERY_REASON=17 +TYPE=18 +OBJECT=19 +STORABLE=20 +IMPLEMENTS=21 +REF=22 +FRAGMENT=23 +IMPORT=24 +EXTERNAL=25 +ATOM=26 +INTERFACE=27 +INTERFACES=28 +PACKAGE=29 +VALUE=30 +RELATION=31 +OPERATION=32 +FUNCTION=33 +CONSTRUCTOR=34 +CONSTRUCTS=35 +INPUT=36 +CONFORM=37 +AS=38 +BIND=39 +STATIC=40 +TO=41 +PRIVATE=42 +SHARED=43 +STATE=44 +EDGE=45 +PROJECTION=46 +WITH=47 +USING=48 +VIA=49 +MATERIALIZE=50 +IF=51 +ABSENT=52 +ON=53 +POLICY=54 +DEFAULT=55 +SOURCE=56 +REPOSITORY=57 +COMMIT=58 +REVISION=59 +SEMANTIC_MAJOR=60 +ON_DELETE=61 +RETAIN_OTHER=62 +KEYED=63 +PUBLIC_TRAVERSAL=64 +ID=65 +DOC=66 +MODE=67 +EMITS=68 +RECEIVER=69 +REQUIRES=70 +ANY=71 +GET=72 +SET=73 +WATCH=74 +START=75 +STOP=76 +READ=77 +WRITE=78 +RESOLVE=79 +CONNECT=80 +DISCONNECT=81 +CALL=82 +WATCH_START=83 +WATCH_STOP=84 +SUBSCRIBE=85 +UNSUBSCRIBE=86 +OPTIMISTIC_REGISTER=87 +CRDT=88 +OPTIONAL_ONE=89 +EXACTLY_ONE=90 +MANY_UNIQUE=91 +MANY=92 +ORDERED=93 +UNIT=94 +WATCH_HANDLE=95 +MESSAGE=96 +ATOM_REF=97 +INTERFACE_REF=98 +OPTIONAL=99 +LIST=100 +RECORD=101 +BOOL=102 +BYTES=103 +DOUBLE=104 +INT32=105 +INT64=106 +STRING=107 +UINT32=108 +UINT64=109 +TRUE=110 +FALSE=111 +NULL=112 +ARROW=113 +COLON=114 +SEMI=115 +COMMA=116 +DOT=117 +LBRACE=118 +RBRACE=119 +LBRACK=120 +RBRACK=121 +LPAREN=122 +RPAREN=123 +LT=124 +GT=125 +AMP=126 +EQUAL=127 +INTEGER=128 +JSON_NUMBER=129 +IDENTIFIER=130 +STRING_LITERAL=131 +LINE_COMMENT=132 +BLOCK_COMMENT=133 +WS=134 'workspace'=1 'result-bytes'=2 'rpc-calls'=3 'deadline-ms'=4 'query'=5 -'specialize'=6 -'root'=7 -'document'=8 -'fragments'=9 -'view'=10 -'max'=11 -'allow'=12 -'poll'=13 -'queryable'=14 -'rpc'=15 -'query-reason'=16 -'type'=17 -'object'=18 -'storable'=19 -'implements'=20 -'ref'=21 -'fragment'=22 -'import'=23 -'external'=24 -'atom'=25 -'interface'=26 -'interfaces'=27 -'package'=28 -'value'=29 -'relation'=30 -'operation'=31 -'function'=32 -'constructor'=33 -'constructs'=34 -'input'=35 -'conform'=36 -'as'=37 -'bind'=38 -'static'=39 -'to'=40 -'private'=41 -'shared'=42 -'state'=43 -'edge'=44 -'projection'=45 -'with'=46 -'using'=47 -'via'=48 -'materialize'=49 -'if'=50 -'absent'=51 -'on'=52 -'policy'=53 -'default'=54 -'source'=55 -'repository'=56 -'commit'=57 -'revision'=58 -'semantic-major'=59 -'on-delete'=60 -'retain-other'=61 -'keyed'=62 -'public-traversal'=63 -'id'=64 -'doc'=65 -'mode'=66 -'emits'=67 -'receiver'=68 -'requires'=69 -'any'=70 -'get'=71 -'set'=72 -'watch'=73 -'start'=74 -'stop'=75 -'read'=76 -'write'=77 -'resolve'=78 -'connect'=79 -'disconnect'=80 -'call'=81 -'watch-start'=82 -'watch-stop'=83 -'subscribe'=84 -'unsubscribe'=85 -'optimistic-register'=86 -'crdt'=87 -'optional-one'=88 -'exactly-one'=89 -'many-unique'=90 -'many'=91 -'ordered'=92 -'unit'=93 -'watch-handle'=94 -'message'=95 -'atom-ref'=96 -'interface-ref'=97 -'optional'=98 -'list'=99 -'record'=100 -'bool'=101 -'bytes'=102 -'double'=103 -'int32'=104 -'int64'=105 -'string'=106 -'uint32'=107 -'uint64'=108 -'true'=109 -'false'=110 -'null'=111 -'->'=112 -':'=113 -';'=114 -','=115 -'.'=116 -'{'=117 -'}'=118 -'['=119 -']'=120 -'('=121 -')'=122 -'<'=123 -'>'=124 -'&'=125 -'='=126 +'reflection'=6 +'specialize'=7 +'root'=8 +'document'=9 +'fragments'=10 +'view'=11 +'max'=12 +'allow'=13 +'poll'=14 +'queryable'=15 +'rpc'=16 +'query-reason'=17 +'type'=18 +'object'=19 +'storable'=20 +'implements'=21 +'ref'=22 +'fragment'=23 +'import'=24 +'external'=25 +'atom'=26 +'interface'=27 +'interfaces'=28 +'package'=29 +'value'=30 +'relation'=31 +'operation'=32 +'function'=33 +'constructor'=34 +'constructs'=35 +'input'=36 +'conform'=37 +'as'=38 +'bind'=39 +'static'=40 +'to'=41 +'private'=42 +'shared'=43 +'state'=44 +'edge'=45 +'projection'=46 +'with'=47 +'using'=48 +'via'=49 +'materialize'=50 +'if'=51 +'absent'=52 +'on'=53 +'policy'=54 +'default'=55 +'source'=56 +'repository'=57 +'commit'=58 +'revision'=59 +'semantic-major'=60 +'on-delete'=61 +'retain-other'=62 +'keyed'=63 +'public-traversal'=64 +'id'=65 +'doc'=66 +'mode'=67 +'emits'=68 +'receiver'=69 +'requires'=70 +'any'=71 +'get'=72 +'set'=73 +'watch'=74 +'start'=75 +'stop'=76 +'read'=77 +'write'=78 +'resolve'=79 +'connect'=80 +'disconnect'=81 +'call'=82 +'watch-start'=83 +'watch-stop'=84 +'subscribe'=85 +'unsubscribe'=86 +'optimistic-register'=87 +'crdt'=88 +'optional-one'=89 +'exactly-one'=90 +'many-unique'=91 +'many'=92 +'ordered'=93 +'unit'=94 +'watch-handle'=95 +'message'=96 +'atom-ref'=97 +'interface-ref'=98 +'optional'=99 +'list'=100 +'record'=101 +'bool'=102 +'bytes'=103 +'double'=104 +'int32'=105 +'int64'=106 +'string'=107 +'uint32'=108 +'uint64'=109 +'true'=110 +'false'=111 +'null'=112 +'->'=113 +':'=114 +';'=115 +','=116 +'.'=117 +'{'=118 +'}'=119 +'['=120 +']'=121 +'('=122 +')'=123 +'<'=124 +'>'=125 +'&'=126 +'='=127 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.interp b/src/capability-language/generated/QuixosCapabilityLexer.interp index dc285d9..e852b94 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.interp +++ b/src/capability-language/generated/QuixosCapabilityLexer.interp @@ -5,6 +5,7 @@ null 'rpc-calls' 'deadline-ms' 'query' +'reflection' 'specialize' 'root' 'document' @@ -141,6 +142,7 @@ RESULT_BYTES RPC_CALLS DEADLINE_MS QUERY +REFLECTION SPECIALIZE ROOT DOCUMENT @@ -276,6 +278,7 @@ RESULT_BYTES RPC_CALLS DEADLINE_MS QUERY +REFLECTION SPECIALIZE ROOT DOCUMENT @@ -415,4 +418,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 133, 1272, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 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, 13, 1, 13, 1, 13, 1, 13, 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, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 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, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 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, 21, 1, 21, 1, 21, 1, 21, 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, 25, 1, 25, 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, 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, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 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, 32, 1, 32, 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, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 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, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 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, 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, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 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, 53, 1, 53, 1, 53, 1, 54, 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, 55, 1, 55, 1, 55, 1, 55, 1, 56, 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, 57, 1, 57, 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, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 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, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 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, 67, 1, 67, 1, 67, 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, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 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, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 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, 77, 1, 78, 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, 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, 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, 82, 1, 83, 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, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 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, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 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, 91, 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, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 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, 95, 1, 95, 1, 95, 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, 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, 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, 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, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 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, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 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, 3, 126, 1173, 8, 126, 1, 126, 4, 126, 1176, 8, 126, 11, 126, 12, 126, 1177, 1, 127, 3, 127, 1181, 8, 127, 1, 127, 1, 127, 1, 127, 5, 127, 1186, 8, 127, 10, 127, 12, 127, 1189, 9, 127, 3, 127, 1191, 8, 127, 1, 127, 1, 127, 4, 127, 1195, 8, 127, 11, 127, 12, 127, 1196, 3, 127, 1199, 8, 127, 1, 127, 1, 127, 3, 127, 1203, 8, 127, 1, 127, 4, 127, 1206, 8, 127, 11, 127, 12, 127, 1207, 3, 127, 1210, 8, 127, 1, 128, 1, 128, 5, 128, 1214, 8, 128, 10, 128, 12, 128, 1217, 9, 128, 1, 129, 1, 129, 1, 129, 5, 129, 1222, 8, 129, 10, 129, 12, 129, 1225, 9, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 3, 130, 1237, 8, 130, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 5, 132, 1245, 8, 132, 10, 132, 12, 132, 1248, 9, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 5, 133, 1256, 8, 133, 10, 133, 12, 133, 1259, 9, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 4, 134, 1267, 8, 134, 11, 134, 12, 134, 1268, 1, 134, 1, 134, 1, 1257, 0, 135, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 0, 263, 0, 265, 131, 267, 132, 269, 133, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1286, 0, 1, 1, 0, 0, 0, 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, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 1, 271, 1, 0, 0, 0, 3, 281, 1, 0, 0, 0, 5, 294, 1, 0, 0, 0, 7, 304, 1, 0, 0, 0, 9, 316, 1, 0, 0, 0, 11, 322, 1, 0, 0, 0, 13, 333, 1, 0, 0, 0, 15, 338, 1, 0, 0, 0, 17, 347, 1, 0, 0, 0, 19, 357, 1, 0, 0, 0, 21, 362, 1, 0, 0, 0, 23, 366, 1, 0, 0, 0, 25, 372, 1, 0, 0, 0, 27, 377, 1, 0, 0, 0, 29, 387, 1, 0, 0, 0, 31, 391, 1, 0, 0, 0, 33, 404, 1, 0, 0, 0, 35, 409, 1, 0, 0, 0, 37, 416, 1, 0, 0, 0, 39, 425, 1, 0, 0, 0, 41, 436, 1, 0, 0, 0, 43, 440, 1, 0, 0, 0, 45, 449, 1, 0, 0, 0, 47, 456, 1, 0, 0, 0, 49, 465, 1, 0, 0, 0, 51, 470, 1, 0, 0, 0, 53, 480, 1, 0, 0, 0, 55, 491, 1, 0, 0, 0, 57, 499, 1, 0, 0, 0, 59, 505, 1, 0, 0, 0, 61, 514, 1, 0, 0, 0, 63, 524, 1, 0, 0, 0, 65, 533, 1, 0, 0, 0, 67, 545, 1, 0, 0, 0, 69, 556, 1, 0, 0, 0, 71, 562, 1, 0, 0, 0, 73, 570, 1, 0, 0, 0, 75, 573, 1, 0, 0, 0, 77, 578, 1, 0, 0, 0, 79, 585, 1, 0, 0, 0, 81, 588, 1, 0, 0, 0, 83, 596, 1, 0, 0, 0, 85, 603, 1, 0, 0, 0, 87, 609, 1, 0, 0, 0, 89, 614, 1, 0, 0, 0, 91, 625, 1, 0, 0, 0, 93, 630, 1, 0, 0, 0, 95, 636, 1, 0, 0, 0, 97, 640, 1, 0, 0, 0, 99, 652, 1, 0, 0, 0, 101, 655, 1, 0, 0, 0, 103, 662, 1, 0, 0, 0, 105, 665, 1, 0, 0, 0, 107, 672, 1, 0, 0, 0, 109, 680, 1, 0, 0, 0, 111, 687, 1, 0, 0, 0, 113, 698, 1, 0, 0, 0, 115, 705, 1, 0, 0, 0, 117, 714, 1, 0, 0, 0, 119, 729, 1, 0, 0, 0, 121, 739, 1, 0, 0, 0, 123, 752, 1, 0, 0, 0, 125, 758, 1, 0, 0, 0, 127, 775, 1, 0, 0, 0, 129, 778, 1, 0, 0, 0, 131, 782, 1, 0, 0, 0, 133, 787, 1, 0, 0, 0, 135, 793, 1, 0, 0, 0, 137, 802, 1, 0, 0, 0, 139, 811, 1, 0, 0, 0, 141, 815, 1, 0, 0, 0, 143, 819, 1, 0, 0, 0, 145, 823, 1, 0, 0, 0, 147, 829, 1, 0, 0, 0, 149, 835, 1, 0, 0, 0, 151, 840, 1, 0, 0, 0, 153, 845, 1, 0, 0, 0, 155, 851, 1, 0, 0, 0, 157, 859, 1, 0, 0, 0, 159, 867, 1, 0, 0, 0, 161, 878, 1, 0, 0, 0, 163, 883, 1, 0, 0, 0, 165, 895, 1, 0, 0, 0, 167, 906, 1, 0, 0, 0, 169, 916, 1, 0, 0, 0, 171, 928, 1, 0, 0, 0, 173, 948, 1, 0, 0, 0, 175, 953, 1, 0, 0, 0, 177, 966, 1, 0, 0, 0, 179, 978, 1, 0, 0, 0, 181, 990, 1, 0, 0, 0, 183, 995, 1, 0, 0, 0, 185, 1003, 1, 0, 0, 0, 187, 1008, 1, 0, 0, 0, 189, 1021, 1, 0, 0, 0, 191, 1029, 1, 0, 0, 0, 193, 1038, 1, 0, 0, 0, 195, 1052, 1, 0, 0, 0, 197, 1061, 1, 0, 0, 0, 199, 1066, 1, 0, 0, 0, 201, 1073, 1, 0, 0, 0, 203, 1078, 1, 0, 0, 0, 205, 1084, 1, 0, 0, 0, 207, 1091, 1, 0, 0, 0, 209, 1097, 1, 0, 0, 0, 211, 1103, 1, 0, 0, 0, 213, 1110, 1, 0, 0, 0, 215, 1117, 1, 0, 0, 0, 217, 1124, 1, 0, 0, 0, 219, 1129, 1, 0, 0, 0, 221, 1135, 1, 0, 0, 0, 223, 1140, 1, 0, 0, 0, 225, 1143, 1, 0, 0, 0, 227, 1145, 1, 0, 0, 0, 229, 1147, 1, 0, 0, 0, 231, 1149, 1, 0, 0, 0, 233, 1151, 1, 0, 0, 0, 235, 1153, 1, 0, 0, 0, 237, 1155, 1, 0, 0, 0, 239, 1157, 1, 0, 0, 0, 241, 1159, 1, 0, 0, 0, 243, 1161, 1, 0, 0, 0, 245, 1163, 1, 0, 0, 0, 247, 1165, 1, 0, 0, 0, 249, 1167, 1, 0, 0, 0, 251, 1169, 1, 0, 0, 0, 253, 1172, 1, 0, 0, 0, 255, 1180, 1, 0, 0, 0, 257, 1211, 1, 0, 0, 0, 259, 1218, 1, 0, 0, 0, 261, 1228, 1, 0, 0, 0, 263, 1238, 1, 0, 0, 0, 265, 1240, 1, 0, 0, 0, 267, 1251, 1, 0, 0, 0, 269, 1266, 1, 0, 0, 0, 271, 272, 5, 119, 0, 0, 272, 273, 5, 111, 0, 0, 273, 274, 5, 114, 0, 0, 274, 275, 5, 107, 0, 0, 275, 276, 5, 115, 0, 0, 276, 277, 5, 112, 0, 0, 277, 278, 5, 97, 0, 0, 278, 279, 5, 99, 0, 0, 279, 280, 5, 101, 0, 0, 280, 2, 1, 0, 0, 0, 281, 282, 5, 114, 0, 0, 282, 283, 5, 101, 0, 0, 283, 284, 5, 115, 0, 0, 284, 285, 5, 117, 0, 0, 285, 286, 5, 108, 0, 0, 286, 287, 5, 116, 0, 0, 287, 288, 5, 45, 0, 0, 288, 289, 5, 98, 0, 0, 289, 290, 5, 121, 0, 0, 290, 291, 5, 116, 0, 0, 291, 292, 5, 101, 0, 0, 292, 293, 5, 115, 0, 0, 293, 4, 1, 0, 0, 0, 294, 295, 5, 114, 0, 0, 295, 296, 5, 112, 0, 0, 296, 297, 5, 99, 0, 0, 297, 298, 5, 45, 0, 0, 298, 299, 5, 99, 0, 0, 299, 300, 5, 97, 0, 0, 300, 301, 5, 108, 0, 0, 301, 302, 5, 108, 0, 0, 302, 303, 5, 115, 0, 0, 303, 6, 1, 0, 0, 0, 304, 305, 5, 100, 0, 0, 305, 306, 5, 101, 0, 0, 306, 307, 5, 97, 0, 0, 307, 308, 5, 100, 0, 0, 308, 309, 5, 108, 0, 0, 309, 310, 5, 105, 0, 0, 310, 311, 5, 110, 0, 0, 311, 312, 5, 101, 0, 0, 312, 313, 5, 45, 0, 0, 313, 314, 5, 109, 0, 0, 314, 315, 5, 115, 0, 0, 315, 8, 1, 0, 0, 0, 316, 317, 5, 113, 0, 0, 317, 318, 5, 117, 0, 0, 318, 319, 5, 101, 0, 0, 319, 320, 5, 114, 0, 0, 320, 321, 5, 121, 0, 0, 321, 10, 1, 0, 0, 0, 322, 323, 5, 115, 0, 0, 323, 324, 5, 112, 0, 0, 324, 325, 5, 101, 0, 0, 325, 326, 5, 99, 0, 0, 326, 327, 5, 105, 0, 0, 327, 328, 5, 97, 0, 0, 328, 329, 5, 108, 0, 0, 329, 330, 5, 105, 0, 0, 330, 331, 5, 122, 0, 0, 331, 332, 5, 101, 0, 0, 332, 12, 1, 0, 0, 0, 333, 334, 5, 114, 0, 0, 334, 335, 5, 111, 0, 0, 335, 336, 5, 111, 0, 0, 336, 337, 5, 116, 0, 0, 337, 14, 1, 0, 0, 0, 338, 339, 5, 100, 0, 0, 339, 340, 5, 111, 0, 0, 340, 341, 5, 99, 0, 0, 341, 342, 5, 117, 0, 0, 342, 343, 5, 109, 0, 0, 343, 344, 5, 101, 0, 0, 344, 345, 5, 110, 0, 0, 345, 346, 5, 116, 0, 0, 346, 16, 1, 0, 0, 0, 347, 348, 5, 102, 0, 0, 348, 349, 5, 114, 0, 0, 349, 350, 5, 97, 0, 0, 350, 351, 5, 103, 0, 0, 351, 352, 5, 109, 0, 0, 352, 353, 5, 101, 0, 0, 353, 354, 5, 110, 0, 0, 354, 355, 5, 116, 0, 0, 355, 356, 5, 115, 0, 0, 356, 18, 1, 0, 0, 0, 357, 358, 5, 118, 0, 0, 358, 359, 5, 105, 0, 0, 359, 360, 5, 101, 0, 0, 360, 361, 5, 119, 0, 0, 361, 20, 1, 0, 0, 0, 362, 363, 5, 109, 0, 0, 363, 364, 5, 97, 0, 0, 364, 365, 5, 120, 0, 0, 365, 22, 1, 0, 0, 0, 366, 367, 5, 97, 0, 0, 367, 368, 5, 108, 0, 0, 368, 369, 5, 108, 0, 0, 369, 370, 5, 111, 0, 0, 370, 371, 5, 119, 0, 0, 371, 24, 1, 0, 0, 0, 372, 373, 5, 112, 0, 0, 373, 374, 5, 111, 0, 0, 374, 375, 5, 108, 0, 0, 375, 376, 5, 108, 0, 0, 376, 26, 1, 0, 0, 0, 377, 378, 5, 113, 0, 0, 378, 379, 5, 117, 0, 0, 379, 380, 5, 101, 0, 0, 380, 381, 5, 114, 0, 0, 381, 382, 5, 121, 0, 0, 382, 383, 5, 97, 0, 0, 383, 384, 5, 98, 0, 0, 384, 385, 5, 108, 0, 0, 385, 386, 5, 101, 0, 0, 386, 28, 1, 0, 0, 0, 387, 388, 5, 114, 0, 0, 388, 389, 5, 112, 0, 0, 389, 390, 5, 99, 0, 0, 390, 30, 1, 0, 0, 0, 391, 392, 5, 113, 0, 0, 392, 393, 5, 117, 0, 0, 393, 394, 5, 101, 0, 0, 394, 395, 5, 114, 0, 0, 395, 396, 5, 121, 0, 0, 396, 397, 5, 45, 0, 0, 397, 398, 5, 114, 0, 0, 398, 399, 5, 101, 0, 0, 399, 400, 5, 97, 0, 0, 400, 401, 5, 115, 0, 0, 401, 402, 5, 111, 0, 0, 402, 403, 5, 110, 0, 0, 403, 32, 1, 0, 0, 0, 404, 405, 5, 116, 0, 0, 405, 406, 5, 121, 0, 0, 406, 407, 5, 112, 0, 0, 407, 408, 5, 101, 0, 0, 408, 34, 1, 0, 0, 0, 409, 410, 5, 111, 0, 0, 410, 411, 5, 98, 0, 0, 411, 412, 5, 106, 0, 0, 412, 413, 5, 101, 0, 0, 413, 414, 5, 99, 0, 0, 414, 415, 5, 116, 0, 0, 415, 36, 1, 0, 0, 0, 416, 417, 5, 115, 0, 0, 417, 418, 5, 116, 0, 0, 418, 419, 5, 111, 0, 0, 419, 420, 5, 114, 0, 0, 420, 421, 5, 97, 0, 0, 421, 422, 5, 98, 0, 0, 422, 423, 5, 108, 0, 0, 423, 424, 5, 101, 0, 0, 424, 38, 1, 0, 0, 0, 425, 426, 5, 105, 0, 0, 426, 427, 5, 109, 0, 0, 427, 428, 5, 112, 0, 0, 428, 429, 5, 108, 0, 0, 429, 430, 5, 101, 0, 0, 430, 431, 5, 109, 0, 0, 431, 432, 5, 101, 0, 0, 432, 433, 5, 110, 0, 0, 433, 434, 5, 116, 0, 0, 434, 435, 5, 115, 0, 0, 435, 40, 1, 0, 0, 0, 436, 437, 5, 114, 0, 0, 437, 438, 5, 101, 0, 0, 438, 439, 5, 102, 0, 0, 439, 42, 1, 0, 0, 0, 440, 441, 5, 102, 0, 0, 441, 442, 5, 114, 0, 0, 442, 443, 5, 97, 0, 0, 443, 444, 5, 103, 0, 0, 444, 445, 5, 109, 0, 0, 445, 446, 5, 101, 0, 0, 446, 447, 5, 110, 0, 0, 447, 448, 5, 116, 0, 0, 448, 44, 1, 0, 0, 0, 449, 450, 5, 105, 0, 0, 450, 451, 5, 109, 0, 0, 451, 452, 5, 112, 0, 0, 452, 453, 5, 111, 0, 0, 453, 454, 5, 114, 0, 0, 454, 455, 5, 116, 0, 0, 455, 46, 1, 0, 0, 0, 456, 457, 5, 101, 0, 0, 457, 458, 5, 120, 0, 0, 458, 459, 5, 116, 0, 0, 459, 460, 5, 101, 0, 0, 460, 461, 5, 114, 0, 0, 461, 462, 5, 110, 0, 0, 462, 463, 5, 97, 0, 0, 463, 464, 5, 108, 0, 0, 464, 48, 1, 0, 0, 0, 465, 466, 5, 97, 0, 0, 466, 467, 5, 116, 0, 0, 467, 468, 5, 111, 0, 0, 468, 469, 5, 109, 0, 0, 469, 50, 1, 0, 0, 0, 470, 471, 5, 105, 0, 0, 471, 472, 5, 110, 0, 0, 472, 473, 5, 116, 0, 0, 473, 474, 5, 101, 0, 0, 474, 475, 5, 114, 0, 0, 475, 476, 5, 102, 0, 0, 476, 477, 5, 97, 0, 0, 477, 478, 5, 99, 0, 0, 478, 479, 5, 101, 0, 0, 479, 52, 1, 0, 0, 0, 480, 481, 5, 105, 0, 0, 481, 482, 5, 110, 0, 0, 482, 483, 5, 116, 0, 0, 483, 484, 5, 101, 0, 0, 484, 485, 5, 114, 0, 0, 485, 486, 5, 102, 0, 0, 486, 487, 5, 97, 0, 0, 487, 488, 5, 99, 0, 0, 488, 489, 5, 101, 0, 0, 489, 490, 5, 115, 0, 0, 490, 54, 1, 0, 0, 0, 491, 492, 5, 112, 0, 0, 492, 493, 5, 97, 0, 0, 493, 494, 5, 99, 0, 0, 494, 495, 5, 107, 0, 0, 495, 496, 5, 97, 0, 0, 496, 497, 5, 103, 0, 0, 497, 498, 5, 101, 0, 0, 498, 56, 1, 0, 0, 0, 499, 500, 5, 118, 0, 0, 500, 501, 5, 97, 0, 0, 501, 502, 5, 108, 0, 0, 502, 503, 5, 117, 0, 0, 503, 504, 5, 101, 0, 0, 504, 58, 1, 0, 0, 0, 505, 506, 5, 114, 0, 0, 506, 507, 5, 101, 0, 0, 507, 508, 5, 108, 0, 0, 508, 509, 5, 97, 0, 0, 509, 510, 5, 116, 0, 0, 510, 511, 5, 105, 0, 0, 511, 512, 5, 111, 0, 0, 512, 513, 5, 110, 0, 0, 513, 60, 1, 0, 0, 0, 514, 515, 5, 111, 0, 0, 515, 516, 5, 112, 0, 0, 516, 517, 5, 101, 0, 0, 517, 518, 5, 114, 0, 0, 518, 519, 5, 97, 0, 0, 519, 520, 5, 116, 0, 0, 520, 521, 5, 105, 0, 0, 521, 522, 5, 111, 0, 0, 522, 523, 5, 110, 0, 0, 523, 62, 1, 0, 0, 0, 524, 525, 5, 102, 0, 0, 525, 526, 5, 117, 0, 0, 526, 527, 5, 110, 0, 0, 527, 528, 5, 99, 0, 0, 528, 529, 5, 116, 0, 0, 529, 530, 5, 105, 0, 0, 530, 531, 5, 111, 0, 0, 531, 532, 5, 110, 0, 0, 532, 64, 1, 0, 0, 0, 533, 534, 5, 99, 0, 0, 534, 535, 5, 111, 0, 0, 535, 536, 5, 110, 0, 0, 536, 537, 5, 115, 0, 0, 537, 538, 5, 116, 0, 0, 538, 539, 5, 114, 0, 0, 539, 540, 5, 117, 0, 0, 540, 541, 5, 99, 0, 0, 541, 542, 5, 116, 0, 0, 542, 543, 5, 111, 0, 0, 543, 544, 5, 114, 0, 0, 544, 66, 1, 0, 0, 0, 545, 546, 5, 99, 0, 0, 546, 547, 5, 111, 0, 0, 547, 548, 5, 110, 0, 0, 548, 549, 5, 115, 0, 0, 549, 550, 5, 116, 0, 0, 550, 551, 5, 114, 0, 0, 551, 552, 5, 117, 0, 0, 552, 553, 5, 99, 0, 0, 553, 554, 5, 116, 0, 0, 554, 555, 5, 115, 0, 0, 555, 68, 1, 0, 0, 0, 556, 557, 5, 105, 0, 0, 557, 558, 5, 110, 0, 0, 558, 559, 5, 112, 0, 0, 559, 560, 5, 117, 0, 0, 560, 561, 5, 116, 0, 0, 561, 70, 1, 0, 0, 0, 562, 563, 5, 99, 0, 0, 563, 564, 5, 111, 0, 0, 564, 565, 5, 110, 0, 0, 565, 566, 5, 102, 0, 0, 566, 567, 5, 111, 0, 0, 567, 568, 5, 114, 0, 0, 568, 569, 5, 109, 0, 0, 569, 72, 1, 0, 0, 0, 570, 571, 5, 97, 0, 0, 571, 572, 5, 115, 0, 0, 572, 74, 1, 0, 0, 0, 573, 574, 5, 98, 0, 0, 574, 575, 5, 105, 0, 0, 575, 576, 5, 110, 0, 0, 576, 577, 5, 100, 0, 0, 577, 76, 1, 0, 0, 0, 578, 579, 5, 115, 0, 0, 579, 580, 5, 116, 0, 0, 580, 581, 5, 97, 0, 0, 581, 582, 5, 116, 0, 0, 582, 583, 5, 105, 0, 0, 583, 584, 5, 99, 0, 0, 584, 78, 1, 0, 0, 0, 585, 586, 5, 116, 0, 0, 586, 587, 5, 111, 0, 0, 587, 80, 1, 0, 0, 0, 588, 589, 5, 112, 0, 0, 589, 590, 5, 114, 0, 0, 590, 591, 5, 105, 0, 0, 591, 592, 5, 118, 0, 0, 592, 593, 5, 97, 0, 0, 593, 594, 5, 116, 0, 0, 594, 595, 5, 101, 0, 0, 595, 82, 1, 0, 0, 0, 596, 597, 5, 115, 0, 0, 597, 598, 5, 104, 0, 0, 598, 599, 5, 97, 0, 0, 599, 600, 5, 114, 0, 0, 600, 601, 5, 101, 0, 0, 601, 602, 5, 100, 0, 0, 602, 84, 1, 0, 0, 0, 603, 604, 5, 115, 0, 0, 604, 605, 5, 116, 0, 0, 605, 606, 5, 97, 0, 0, 606, 607, 5, 116, 0, 0, 607, 608, 5, 101, 0, 0, 608, 86, 1, 0, 0, 0, 609, 610, 5, 101, 0, 0, 610, 611, 5, 100, 0, 0, 611, 612, 5, 103, 0, 0, 612, 613, 5, 101, 0, 0, 613, 88, 1, 0, 0, 0, 614, 615, 5, 112, 0, 0, 615, 616, 5, 114, 0, 0, 616, 617, 5, 111, 0, 0, 617, 618, 5, 106, 0, 0, 618, 619, 5, 101, 0, 0, 619, 620, 5, 99, 0, 0, 620, 621, 5, 116, 0, 0, 621, 622, 5, 105, 0, 0, 622, 623, 5, 111, 0, 0, 623, 624, 5, 110, 0, 0, 624, 90, 1, 0, 0, 0, 625, 626, 5, 119, 0, 0, 626, 627, 5, 105, 0, 0, 627, 628, 5, 116, 0, 0, 628, 629, 5, 104, 0, 0, 629, 92, 1, 0, 0, 0, 630, 631, 5, 117, 0, 0, 631, 632, 5, 115, 0, 0, 632, 633, 5, 105, 0, 0, 633, 634, 5, 110, 0, 0, 634, 635, 5, 103, 0, 0, 635, 94, 1, 0, 0, 0, 636, 637, 5, 118, 0, 0, 637, 638, 5, 105, 0, 0, 638, 639, 5, 97, 0, 0, 639, 96, 1, 0, 0, 0, 640, 641, 5, 109, 0, 0, 641, 642, 5, 97, 0, 0, 642, 643, 5, 116, 0, 0, 643, 644, 5, 101, 0, 0, 644, 645, 5, 114, 0, 0, 645, 646, 5, 105, 0, 0, 646, 647, 5, 97, 0, 0, 647, 648, 5, 108, 0, 0, 648, 649, 5, 105, 0, 0, 649, 650, 5, 122, 0, 0, 650, 651, 5, 101, 0, 0, 651, 98, 1, 0, 0, 0, 652, 653, 5, 105, 0, 0, 653, 654, 5, 102, 0, 0, 654, 100, 1, 0, 0, 0, 655, 656, 5, 97, 0, 0, 656, 657, 5, 98, 0, 0, 657, 658, 5, 115, 0, 0, 658, 659, 5, 101, 0, 0, 659, 660, 5, 110, 0, 0, 660, 661, 5, 116, 0, 0, 661, 102, 1, 0, 0, 0, 662, 663, 5, 111, 0, 0, 663, 664, 5, 110, 0, 0, 664, 104, 1, 0, 0, 0, 665, 666, 5, 112, 0, 0, 666, 667, 5, 111, 0, 0, 667, 668, 5, 108, 0, 0, 668, 669, 5, 105, 0, 0, 669, 670, 5, 99, 0, 0, 670, 671, 5, 121, 0, 0, 671, 106, 1, 0, 0, 0, 672, 673, 5, 100, 0, 0, 673, 674, 5, 101, 0, 0, 674, 675, 5, 102, 0, 0, 675, 676, 5, 97, 0, 0, 676, 677, 5, 117, 0, 0, 677, 678, 5, 108, 0, 0, 678, 679, 5, 116, 0, 0, 679, 108, 1, 0, 0, 0, 680, 681, 5, 115, 0, 0, 681, 682, 5, 111, 0, 0, 682, 683, 5, 117, 0, 0, 683, 684, 5, 114, 0, 0, 684, 685, 5, 99, 0, 0, 685, 686, 5, 101, 0, 0, 686, 110, 1, 0, 0, 0, 687, 688, 5, 114, 0, 0, 688, 689, 5, 101, 0, 0, 689, 690, 5, 112, 0, 0, 690, 691, 5, 111, 0, 0, 691, 692, 5, 115, 0, 0, 692, 693, 5, 105, 0, 0, 693, 694, 5, 116, 0, 0, 694, 695, 5, 111, 0, 0, 695, 696, 5, 114, 0, 0, 696, 697, 5, 121, 0, 0, 697, 112, 1, 0, 0, 0, 698, 699, 5, 99, 0, 0, 699, 700, 5, 111, 0, 0, 700, 701, 5, 109, 0, 0, 701, 702, 5, 109, 0, 0, 702, 703, 5, 105, 0, 0, 703, 704, 5, 116, 0, 0, 704, 114, 1, 0, 0, 0, 705, 706, 5, 114, 0, 0, 706, 707, 5, 101, 0, 0, 707, 708, 5, 118, 0, 0, 708, 709, 5, 105, 0, 0, 709, 710, 5, 115, 0, 0, 710, 711, 5, 105, 0, 0, 711, 712, 5, 111, 0, 0, 712, 713, 5, 110, 0, 0, 713, 116, 1, 0, 0, 0, 714, 715, 5, 115, 0, 0, 715, 716, 5, 101, 0, 0, 716, 717, 5, 109, 0, 0, 717, 718, 5, 97, 0, 0, 718, 719, 5, 110, 0, 0, 719, 720, 5, 116, 0, 0, 720, 721, 5, 105, 0, 0, 721, 722, 5, 99, 0, 0, 722, 723, 5, 45, 0, 0, 723, 724, 5, 109, 0, 0, 724, 725, 5, 97, 0, 0, 725, 726, 5, 106, 0, 0, 726, 727, 5, 111, 0, 0, 727, 728, 5, 114, 0, 0, 728, 118, 1, 0, 0, 0, 729, 730, 5, 111, 0, 0, 730, 731, 5, 110, 0, 0, 731, 732, 5, 45, 0, 0, 732, 733, 5, 100, 0, 0, 733, 734, 5, 101, 0, 0, 734, 735, 5, 108, 0, 0, 735, 736, 5, 101, 0, 0, 736, 737, 5, 116, 0, 0, 737, 738, 5, 101, 0, 0, 738, 120, 1, 0, 0, 0, 739, 740, 5, 114, 0, 0, 740, 741, 5, 101, 0, 0, 741, 742, 5, 116, 0, 0, 742, 743, 5, 97, 0, 0, 743, 744, 5, 105, 0, 0, 744, 745, 5, 110, 0, 0, 745, 746, 5, 45, 0, 0, 746, 747, 5, 111, 0, 0, 747, 748, 5, 116, 0, 0, 748, 749, 5, 104, 0, 0, 749, 750, 5, 101, 0, 0, 750, 751, 5, 114, 0, 0, 751, 122, 1, 0, 0, 0, 752, 753, 5, 107, 0, 0, 753, 754, 5, 101, 0, 0, 754, 755, 5, 121, 0, 0, 755, 756, 5, 101, 0, 0, 756, 757, 5, 100, 0, 0, 757, 124, 1, 0, 0, 0, 758, 759, 5, 112, 0, 0, 759, 760, 5, 117, 0, 0, 760, 761, 5, 98, 0, 0, 761, 762, 5, 108, 0, 0, 762, 763, 5, 105, 0, 0, 763, 764, 5, 99, 0, 0, 764, 765, 5, 45, 0, 0, 765, 766, 5, 116, 0, 0, 766, 767, 5, 114, 0, 0, 767, 768, 5, 97, 0, 0, 768, 769, 5, 118, 0, 0, 769, 770, 5, 101, 0, 0, 770, 771, 5, 114, 0, 0, 771, 772, 5, 115, 0, 0, 772, 773, 5, 97, 0, 0, 773, 774, 5, 108, 0, 0, 774, 126, 1, 0, 0, 0, 775, 776, 5, 105, 0, 0, 776, 777, 5, 100, 0, 0, 777, 128, 1, 0, 0, 0, 778, 779, 5, 100, 0, 0, 779, 780, 5, 111, 0, 0, 780, 781, 5, 99, 0, 0, 781, 130, 1, 0, 0, 0, 782, 783, 5, 109, 0, 0, 783, 784, 5, 111, 0, 0, 784, 785, 5, 100, 0, 0, 785, 786, 5, 101, 0, 0, 786, 132, 1, 0, 0, 0, 787, 788, 5, 101, 0, 0, 788, 789, 5, 109, 0, 0, 789, 790, 5, 105, 0, 0, 790, 791, 5, 116, 0, 0, 791, 792, 5, 115, 0, 0, 792, 134, 1, 0, 0, 0, 793, 794, 5, 114, 0, 0, 794, 795, 5, 101, 0, 0, 795, 796, 5, 99, 0, 0, 796, 797, 5, 101, 0, 0, 797, 798, 5, 105, 0, 0, 798, 799, 5, 118, 0, 0, 799, 800, 5, 101, 0, 0, 800, 801, 5, 114, 0, 0, 801, 136, 1, 0, 0, 0, 802, 803, 5, 114, 0, 0, 803, 804, 5, 101, 0, 0, 804, 805, 5, 113, 0, 0, 805, 806, 5, 117, 0, 0, 806, 807, 5, 105, 0, 0, 807, 808, 5, 114, 0, 0, 808, 809, 5, 101, 0, 0, 809, 810, 5, 115, 0, 0, 810, 138, 1, 0, 0, 0, 811, 812, 5, 97, 0, 0, 812, 813, 5, 110, 0, 0, 813, 814, 5, 121, 0, 0, 814, 140, 1, 0, 0, 0, 815, 816, 5, 103, 0, 0, 816, 817, 5, 101, 0, 0, 817, 818, 5, 116, 0, 0, 818, 142, 1, 0, 0, 0, 819, 820, 5, 115, 0, 0, 820, 821, 5, 101, 0, 0, 821, 822, 5, 116, 0, 0, 822, 144, 1, 0, 0, 0, 823, 824, 5, 119, 0, 0, 824, 825, 5, 97, 0, 0, 825, 826, 5, 116, 0, 0, 826, 827, 5, 99, 0, 0, 827, 828, 5, 104, 0, 0, 828, 146, 1, 0, 0, 0, 829, 830, 5, 115, 0, 0, 830, 831, 5, 116, 0, 0, 831, 832, 5, 97, 0, 0, 832, 833, 5, 114, 0, 0, 833, 834, 5, 116, 0, 0, 834, 148, 1, 0, 0, 0, 835, 836, 5, 115, 0, 0, 836, 837, 5, 116, 0, 0, 837, 838, 5, 111, 0, 0, 838, 839, 5, 112, 0, 0, 839, 150, 1, 0, 0, 0, 840, 841, 5, 114, 0, 0, 841, 842, 5, 101, 0, 0, 842, 843, 5, 97, 0, 0, 843, 844, 5, 100, 0, 0, 844, 152, 1, 0, 0, 0, 845, 846, 5, 119, 0, 0, 846, 847, 5, 114, 0, 0, 847, 848, 5, 105, 0, 0, 848, 849, 5, 116, 0, 0, 849, 850, 5, 101, 0, 0, 850, 154, 1, 0, 0, 0, 851, 852, 5, 114, 0, 0, 852, 853, 5, 101, 0, 0, 853, 854, 5, 115, 0, 0, 854, 855, 5, 111, 0, 0, 855, 856, 5, 108, 0, 0, 856, 857, 5, 118, 0, 0, 857, 858, 5, 101, 0, 0, 858, 156, 1, 0, 0, 0, 859, 860, 5, 99, 0, 0, 860, 861, 5, 111, 0, 0, 861, 862, 5, 110, 0, 0, 862, 863, 5, 110, 0, 0, 863, 864, 5, 101, 0, 0, 864, 865, 5, 99, 0, 0, 865, 866, 5, 116, 0, 0, 866, 158, 1, 0, 0, 0, 867, 868, 5, 100, 0, 0, 868, 869, 5, 105, 0, 0, 869, 870, 5, 115, 0, 0, 870, 871, 5, 99, 0, 0, 871, 872, 5, 111, 0, 0, 872, 873, 5, 110, 0, 0, 873, 874, 5, 110, 0, 0, 874, 875, 5, 101, 0, 0, 875, 876, 5, 99, 0, 0, 876, 877, 5, 116, 0, 0, 877, 160, 1, 0, 0, 0, 878, 879, 5, 99, 0, 0, 879, 880, 5, 97, 0, 0, 880, 881, 5, 108, 0, 0, 881, 882, 5, 108, 0, 0, 882, 162, 1, 0, 0, 0, 883, 884, 5, 119, 0, 0, 884, 885, 5, 97, 0, 0, 885, 886, 5, 116, 0, 0, 886, 887, 5, 99, 0, 0, 887, 888, 5, 104, 0, 0, 888, 889, 5, 45, 0, 0, 889, 890, 5, 115, 0, 0, 890, 891, 5, 116, 0, 0, 891, 892, 5, 97, 0, 0, 892, 893, 5, 114, 0, 0, 893, 894, 5, 116, 0, 0, 894, 164, 1, 0, 0, 0, 895, 896, 5, 119, 0, 0, 896, 897, 5, 97, 0, 0, 897, 898, 5, 116, 0, 0, 898, 899, 5, 99, 0, 0, 899, 900, 5, 104, 0, 0, 900, 901, 5, 45, 0, 0, 901, 902, 5, 115, 0, 0, 902, 903, 5, 116, 0, 0, 903, 904, 5, 111, 0, 0, 904, 905, 5, 112, 0, 0, 905, 166, 1, 0, 0, 0, 906, 907, 5, 115, 0, 0, 907, 908, 5, 117, 0, 0, 908, 909, 5, 98, 0, 0, 909, 910, 5, 115, 0, 0, 910, 911, 5, 99, 0, 0, 911, 912, 5, 114, 0, 0, 912, 913, 5, 105, 0, 0, 913, 914, 5, 98, 0, 0, 914, 915, 5, 101, 0, 0, 915, 168, 1, 0, 0, 0, 916, 917, 5, 117, 0, 0, 917, 918, 5, 110, 0, 0, 918, 919, 5, 115, 0, 0, 919, 920, 5, 117, 0, 0, 920, 921, 5, 98, 0, 0, 921, 922, 5, 115, 0, 0, 922, 923, 5, 99, 0, 0, 923, 924, 5, 114, 0, 0, 924, 925, 5, 105, 0, 0, 925, 926, 5, 98, 0, 0, 926, 927, 5, 101, 0, 0, 927, 170, 1, 0, 0, 0, 928, 929, 5, 111, 0, 0, 929, 930, 5, 112, 0, 0, 930, 931, 5, 116, 0, 0, 931, 932, 5, 105, 0, 0, 932, 933, 5, 109, 0, 0, 933, 934, 5, 105, 0, 0, 934, 935, 5, 115, 0, 0, 935, 936, 5, 116, 0, 0, 936, 937, 5, 105, 0, 0, 937, 938, 5, 99, 0, 0, 938, 939, 5, 45, 0, 0, 939, 940, 5, 114, 0, 0, 940, 941, 5, 101, 0, 0, 941, 942, 5, 103, 0, 0, 942, 943, 5, 105, 0, 0, 943, 944, 5, 115, 0, 0, 944, 945, 5, 116, 0, 0, 945, 946, 5, 101, 0, 0, 946, 947, 5, 114, 0, 0, 947, 172, 1, 0, 0, 0, 948, 949, 5, 99, 0, 0, 949, 950, 5, 114, 0, 0, 950, 951, 5, 100, 0, 0, 951, 952, 5, 116, 0, 0, 952, 174, 1, 0, 0, 0, 953, 954, 5, 111, 0, 0, 954, 955, 5, 112, 0, 0, 955, 956, 5, 116, 0, 0, 956, 957, 5, 105, 0, 0, 957, 958, 5, 111, 0, 0, 958, 959, 5, 110, 0, 0, 959, 960, 5, 97, 0, 0, 960, 961, 5, 108, 0, 0, 961, 962, 5, 45, 0, 0, 962, 963, 5, 111, 0, 0, 963, 964, 5, 110, 0, 0, 964, 965, 5, 101, 0, 0, 965, 176, 1, 0, 0, 0, 966, 967, 5, 101, 0, 0, 967, 968, 5, 120, 0, 0, 968, 969, 5, 97, 0, 0, 969, 970, 5, 99, 0, 0, 970, 971, 5, 116, 0, 0, 971, 972, 5, 108, 0, 0, 972, 973, 5, 121, 0, 0, 973, 974, 5, 45, 0, 0, 974, 975, 5, 111, 0, 0, 975, 976, 5, 110, 0, 0, 976, 977, 5, 101, 0, 0, 977, 178, 1, 0, 0, 0, 978, 979, 5, 109, 0, 0, 979, 980, 5, 97, 0, 0, 980, 981, 5, 110, 0, 0, 981, 982, 5, 121, 0, 0, 982, 983, 5, 45, 0, 0, 983, 984, 5, 117, 0, 0, 984, 985, 5, 110, 0, 0, 985, 986, 5, 105, 0, 0, 986, 987, 5, 113, 0, 0, 987, 988, 5, 117, 0, 0, 988, 989, 5, 101, 0, 0, 989, 180, 1, 0, 0, 0, 990, 991, 5, 109, 0, 0, 991, 992, 5, 97, 0, 0, 992, 993, 5, 110, 0, 0, 993, 994, 5, 121, 0, 0, 994, 182, 1, 0, 0, 0, 995, 996, 5, 111, 0, 0, 996, 997, 5, 114, 0, 0, 997, 998, 5, 100, 0, 0, 998, 999, 5, 101, 0, 0, 999, 1000, 5, 114, 0, 0, 1000, 1001, 5, 101, 0, 0, 1001, 1002, 5, 100, 0, 0, 1002, 184, 1, 0, 0, 0, 1003, 1004, 5, 117, 0, 0, 1004, 1005, 5, 110, 0, 0, 1005, 1006, 5, 105, 0, 0, 1006, 1007, 5, 116, 0, 0, 1007, 186, 1, 0, 0, 0, 1008, 1009, 5, 119, 0, 0, 1009, 1010, 5, 97, 0, 0, 1010, 1011, 5, 116, 0, 0, 1011, 1012, 5, 99, 0, 0, 1012, 1013, 5, 104, 0, 0, 1013, 1014, 5, 45, 0, 0, 1014, 1015, 5, 104, 0, 0, 1015, 1016, 5, 97, 0, 0, 1016, 1017, 5, 110, 0, 0, 1017, 1018, 5, 100, 0, 0, 1018, 1019, 5, 108, 0, 0, 1019, 1020, 5, 101, 0, 0, 1020, 188, 1, 0, 0, 0, 1021, 1022, 5, 109, 0, 0, 1022, 1023, 5, 101, 0, 0, 1023, 1024, 5, 115, 0, 0, 1024, 1025, 5, 115, 0, 0, 1025, 1026, 5, 97, 0, 0, 1026, 1027, 5, 103, 0, 0, 1027, 1028, 5, 101, 0, 0, 1028, 190, 1, 0, 0, 0, 1029, 1030, 5, 97, 0, 0, 1030, 1031, 5, 116, 0, 0, 1031, 1032, 5, 111, 0, 0, 1032, 1033, 5, 109, 0, 0, 1033, 1034, 5, 45, 0, 0, 1034, 1035, 5, 114, 0, 0, 1035, 1036, 5, 101, 0, 0, 1036, 1037, 5, 102, 0, 0, 1037, 192, 1, 0, 0, 0, 1038, 1039, 5, 105, 0, 0, 1039, 1040, 5, 110, 0, 0, 1040, 1041, 5, 116, 0, 0, 1041, 1042, 5, 101, 0, 0, 1042, 1043, 5, 114, 0, 0, 1043, 1044, 5, 102, 0, 0, 1044, 1045, 5, 97, 0, 0, 1045, 1046, 5, 99, 0, 0, 1046, 1047, 5, 101, 0, 0, 1047, 1048, 5, 45, 0, 0, 1048, 1049, 5, 114, 0, 0, 1049, 1050, 5, 101, 0, 0, 1050, 1051, 5, 102, 0, 0, 1051, 194, 1, 0, 0, 0, 1052, 1053, 5, 111, 0, 0, 1053, 1054, 5, 112, 0, 0, 1054, 1055, 5, 116, 0, 0, 1055, 1056, 5, 105, 0, 0, 1056, 1057, 5, 111, 0, 0, 1057, 1058, 5, 110, 0, 0, 1058, 1059, 5, 97, 0, 0, 1059, 1060, 5, 108, 0, 0, 1060, 196, 1, 0, 0, 0, 1061, 1062, 5, 108, 0, 0, 1062, 1063, 5, 105, 0, 0, 1063, 1064, 5, 115, 0, 0, 1064, 1065, 5, 116, 0, 0, 1065, 198, 1, 0, 0, 0, 1066, 1067, 5, 114, 0, 0, 1067, 1068, 5, 101, 0, 0, 1068, 1069, 5, 99, 0, 0, 1069, 1070, 5, 111, 0, 0, 1070, 1071, 5, 114, 0, 0, 1071, 1072, 5, 100, 0, 0, 1072, 200, 1, 0, 0, 0, 1073, 1074, 5, 98, 0, 0, 1074, 1075, 5, 111, 0, 0, 1075, 1076, 5, 111, 0, 0, 1076, 1077, 5, 108, 0, 0, 1077, 202, 1, 0, 0, 0, 1078, 1079, 5, 98, 0, 0, 1079, 1080, 5, 121, 0, 0, 1080, 1081, 5, 116, 0, 0, 1081, 1082, 5, 101, 0, 0, 1082, 1083, 5, 115, 0, 0, 1083, 204, 1, 0, 0, 0, 1084, 1085, 5, 100, 0, 0, 1085, 1086, 5, 111, 0, 0, 1086, 1087, 5, 117, 0, 0, 1087, 1088, 5, 98, 0, 0, 1088, 1089, 5, 108, 0, 0, 1089, 1090, 5, 101, 0, 0, 1090, 206, 1, 0, 0, 0, 1091, 1092, 5, 105, 0, 0, 1092, 1093, 5, 110, 0, 0, 1093, 1094, 5, 116, 0, 0, 1094, 1095, 5, 51, 0, 0, 1095, 1096, 5, 50, 0, 0, 1096, 208, 1, 0, 0, 0, 1097, 1098, 5, 105, 0, 0, 1098, 1099, 5, 110, 0, 0, 1099, 1100, 5, 116, 0, 0, 1100, 1101, 5, 54, 0, 0, 1101, 1102, 5, 52, 0, 0, 1102, 210, 1, 0, 0, 0, 1103, 1104, 5, 115, 0, 0, 1104, 1105, 5, 116, 0, 0, 1105, 1106, 5, 114, 0, 0, 1106, 1107, 5, 105, 0, 0, 1107, 1108, 5, 110, 0, 0, 1108, 1109, 5, 103, 0, 0, 1109, 212, 1, 0, 0, 0, 1110, 1111, 5, 117, 0, 0, 1111, 1112, 5, 105, 0, 0, 1112, 1113, 5, 110, 0, 0, 1113, 1114, 5, 116, 0, 0, 1114, 1115, 5, 51, 0, 0, 1115, 1116, 5, 50, 0, 0, 1116, 214, 1, 0, 0, 0, 1117, 1118, 5, 117, 0, 0, 1118, 1119, 5, 105, 0, 0, 1119, 1120, 5, 110, 0, 0, 1120, 1121, 5, 116, 0, 0, 1121, 1122, 5, 54, 0, 0, 1122, 1123, 5, 52, 0, 0, 1123, 216, 1, 0, 0, 0, 1124, 1125, 5, 116, 0, 0, 1125, 1126, 5, 114, 0, 0, 1126, 1127, 5, 117, 0, 0, 1127, 1128, 5, 101, 0, 0, 1128, 218, 1, 0, 0, 0, 1129, 1130, 5, 102, 0, 0, 1130, 1131, 5, 97, 0, 0, 1131, 1132, 5, 108, 0, 0, 1132, 1133, 5, 115, 0, 0, 1133, 1134, 5, 101, 0, 0, 1134, 220, 1, 0, 0, 0, 1135, 1136, 5, 110, 0, 0, 1136, 1137, 5, 117, 0, 0, 1137, 1138, 5, 108, 0, 0, 1138, 1139, 5, 108, 0, 0, 1139, 222, 1, 0, 0, 0, 1140, 1141, 5, 45, 0, 0, 1141, 1142, 5, 62, 0, 0, 1142, 224, 1, 0, 0, 0, 1143, 1144, 5, 58, 0, 0, 1144, 226, 1, 0, 0, 0, 1145, 1146, 5, 59, 0, 0, 1146, 228, 1, 0, 0, 0, 1147, 1148, 5, 44, 0, 0, 1148, 230, 1, 0, 0, 0, 1149, 1150, 5, 46, 0, 0, 1150, 232, 1, 0, 0, 0, 1151, 1152, 5, 123, 0, 0, 1152, 234, 1, 0, 0, 0, 1153, 1154, 5, 125, 0, 0, 1154, 236, 1, 0, 0, 0, 1155, 1156, 5, 91, 0, 0, 1156, 238, 1, 0, 0, 0, 1157, 1158, 5, 93, 0, 0, 1158, 240, 1, 0, 0, 0, 1159, 1160, 5, 40, 0, 0, 1160, 242, 1, 0, 0, 0, 1161, 1162, 5, 41, 0, 0, 1162, 244, 1, 0, 0, 0, 1163, 1164, 5, 60, 0, 0, 1164, 246, 1, 0, 0, 0, 1165, 1166, 5, 62, 0, 0, 1166, 248, 1, 0, 0, 0, 1167, 1168, 5, 38, 0, 0, 1168, 250, 1, 0, 0, 0, 1169, 1170, 5, 61, 0, 0, 1170, 252, 1, 0, 0, 0, 1171, 1173, 5, 45, 0, 0, 1172, 1171, 1, 0, 0, 0, 1172, 1173, 1, 0, 0, 0, 1173, 1175, 1, 0, 0, 0, 1174, 1176, 7, 0, 0, 0, 1175, 1174, 1, 0, 0, 0, 1176, 1177, 1, 0, 0, 0, 1177, 1175, 1, 0, 0, 0, 1177, 1178, 1, 0, 0, 0, 1178, 254, 1, 0, 0, 0, 1179, 1181, 5, 45, 0, 0, 1180, 1179, 1, 0, 0, 0, 1180, 1181, 1, 0, 0, 0, 1181, 1190, 1, 0, 0, 0, 1182, 1191, 5, 48, 0, 0, 1183, 1187, 7, 1, 0, 0, 1184, 1186, 7, 0, 0, 0, 1185, 1184, 1, 0, 0, 0, 1186, 1189, 1, 0, 0, 0, 1187, 1185, 1, 0, 0, 0, 1187, 1188, 1, 0, 0, 0, 1188, 1191, 1, 0, 0, 0, 1189, 1187, 1, 0, 0, 0, 1190, 1182, 1, 0, 0, 0, 1190, 1183, 1, 0, 0, 0, 1191, 1198, 1, 0, 0, 0, 1192, 1194, 5, 46, 0, 0, 1193, 1195, 7, 0, 0, 0, 1194, 1193, 1, 0, 0, 0, 1195, 1196, 1, 0, 0, 0, 1196, 1194, 1, 0, 0, 0, 1196, 1197, 1, 0, 0, 0, 1197, 1199, 1, 0, 0, 0, 1198, 1192, 1, 0, 0, 0, 1198, 1199, 1, 0, 0, 0, 1199, 1209, 1, 0, 0, 0, 1200, 1202, 7, 2, 0, 0, 1201, 1203, 7, 3, 0, 0, 1202, 1201, 1, 0, 0, 0, 1202, 1203, 1, 0, 0, 0, 1203, 1205, 1, 0, 0, 0, 1204, 1206, 7, 0, 0, 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, 1210, 1, 0, 0, 0, 1209, 1200, 1, 0, 0, 0, 1209, 1210, 1, 0, 0, 0, 1210, 256, 1, 0, 0, 0, 1211, 1215, 7, 4, 0, 0, 1212, 1214, 7, 5, 0, 0, 1213, 1212, 1, 0, 0, 0, 1214, 1217, 1, 0, 0, 0, 1215, 1213, 1, 0, 0, 0, 1215, 1216, 1, 0, 0, 0, 1216, 258, 1, 0, 0, 0, 1217, 1215, 1, 0, 0, 0, 1218, 1223, 5, 34, 0, 0, 1219, 1222, 3, 261, 130, 0, 1220, 1222, 8, 6, 0, 0, 1221, 1219, 1, 0, 0, 0, 1221, 1220, 1, 0, 0, 0, 1222, 1225, 1, 0, 0, 0, 1223, 1221, 1, 0, 0, 0, 1223, 1224, 1, 0, 0, 0, 1224, 1226, 1, 0, 0, 0, 1225, 1223, 1, 0, 0, 0, 1226, 1227, 5, 34, 0, 0, 1227, 260, 1, 0, 0, 0, 1228, 1236, 5, 92, 0, 0, 1229, 1237, 7, 7, 0, 0, 1230, 1231, 5, 117, 0, 0, 1231, 1232, 3, 263, 131, 0, 1232, 1233, 3, 263, 131, 0, 1233, 1234, 3, 263, 131, 0, 1234, 1235, 3, 263, 131, 0, 1235, 1237, 1, 0, 0, 0, 1236, 1229, 1, 0, 0, 0, 1236, 1230, 1, 0, 0, 0, 1237, 262, 1, 0, 0, 0, 1238, 1239, 7, 8, 0, 0, 1239, 264, 1, 0, 0, 0, 1240, 1241, 5, 47, 0, 0, 1241, 1242, 5, 47, 0, 0, 1242, 1246, 1, 0, 0, 0, 1243, 1245, 8, 9, 0, 0, 1244, 1243, 1, 0, 0, 0, 1245, 1248, 1, 0, 0, 0, 1246, 1244, 1, 0, 0, 0, 1246, 1247, 1, 0, 0, 0, 1247, 1249, 1, 0, 0, 0, 1248, 1246, 1, 0, 0, 0, 1249, 1250, 6, 132, 0, 0, 1250, 266, 1, 0, 0, 0, 1251, 1252, 5, 47, 0, 0, 1252, 1253, 5, 42, 0, 0, 1253, 1257, 1, 0, 0, 0, 1254, 1256, 9, 0, 0, 0, 1255, 1254, 1, 0, 0, 0, 1256, 1259, 1, 0, 0, 0, 1257, 1258, 1, 0, 0, 0, 1257, 1255, 1, 0, 0, 0, 1258, 1260, 1, 0, 0, 0, 1259, 1257, 1, 0, 0, 0, 1260, 1261, 5, 42, 0, 0, 1261, 1262, 5, 47, 0, 0, 1262, 1263, 1, 0, 0, 0, 1263, 1264, 6, 133, 0, 0, 1264, 268, 1, 0, 0, 0, 1265, 1267, 7, 10, 0, 0, 1266, 1265, 1, 0, 0, 0, 1267, 1268, 1, 0, 0, 0, 1268, 1266, 1, 0, 0, 0, 1268, 1269, 1, 0, 0, 0, 1269, 1270, 1, 0, 0, 0, 1270, 1271, 6, 134, 0, 0, 1271, 270, 1, 0, 0, 0, 18, 0, 1172, 1177, 1180, 1187, 1190, 1196, 1198, 1202, 1207, 1209, 1215, 1221, 1223, 1236, 1246, 1257, 1268, 1, 0, 1, 0] \ No newline at end of file +[4, 0, 134, 1285, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 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, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 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, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 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, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 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, 26, 1, 26, 1, 27, 1, 27, 1, 27, 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, 28, 1, 28, 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, 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, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 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, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 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, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 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, 1, 53, 1, 54, 1, 54, 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, 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, 58, 1, 58, 1, 58, 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, 60, 1, 60, 1, 60, 1, 60, 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, 61, 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, 63, 1, 63, 1, 63, 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, 65, 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, 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, 71, 1, 71, 1, 71, 1, 71, 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, 75, 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, 78, 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, 79, 1, 80, 1, 80, 1, 80, 1, 80, 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, 82, 1, 82, 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, 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, 85, 1, 85, 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, 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, 87, 1, 87, 1, 88, 1, 88, 1, 88, 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, 89, 1, 89, 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, 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, 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, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 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, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 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, 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, 100, 1, 100, 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, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 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, 3, 127, 1186, 8, 127, 1, 127, 4, 127, 1189, 8, 127, 11, 127, 12, 127, 1190, 1, 128, 3, 128, 1194, 8, 128, 1, 128, 1, 128, 1, 128, 5, 128, 1199, 8, 128, 10, 128, 12, 128, 1202, 9, 128, 3, 128, 1204, 8, 128, 1, 128, 1, 128, 4, 128, 1208, 8, 128, 11, 128, 12, 128, 1209, 3, 128, 1212, 8, 128, 1, 128, 1, 128, 3, 128, 1216, 8, 128, 1, 128, 4, 128, 1219, 8, 128, 11, 128, 12, 128, 1220, 3, 128, 1223, 8, 128, 1, 129, 1, 129, 5, 129, 1227, 8, 129, 10, 129, 12, 129, 1230, 9, 129, 1, 130, 1, 130, 1, 130, 5, 130, 1235, 8, 130, 10, 130, 12, 130, 1238, 9, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 3, 131, 1250, 8, 131, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 5, 133, 1258, 8, 133, 10, 133, 12, 133, 1261, 9, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 5, 134, 1269, 8, 134, 10, 134, 12, 134, 1272, 9, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 4, 135, 1280, 8, 135, 11, 135, 12, 135, 1281, 1, 135, 1, 135, 1, 1270, 0, 136, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 0, 265, 0, 267, 132, 269, 133, 271, 134, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1299, 0, 1, 1, 0, 0, 0, 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, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 1, 273, 1, 0, 0, 0, 3, 283, 1, 0, 0, 0, 5, 296, 1, 0, 0, 0, 7, 306, 1, 0, 0, 0, 9, 318, 1, 0, 0, 0, 11, 324, 1, 0, 0, 0, 13, 335, 1, 0, 0, 0, 15, 346, 1, 0, 0, 0, 17, 351, 1, 0, 0, 0, 19, 360, 1, 0, 0, 0, 21, 370, 1, 0, 0, 0, 23, 375, 1, 0, 0, 0, 25, 379, 1, 0, 0, 0, 27, 385, 1, 0, 0, 0, 29, 390, 1, 0, 0, 0, 31, 400, 1, 0, 0, 0, 33, 404, 1, 0, 0, 0, 35, 417, 1, 0, 0, 0, 37, 422, 1, 0, 0, 0, 39, 429, 1, 0, 0, 0, 41, 438, 1, 0, 0, 0, 43, 449, 1, 0, 0, 0, 45, 453, 1, 0, 0, 0, 47, 462, 1, 0, 0, 0, 49, 469, 1, 0, 0, 0, 51, 478, 1, 0, 0, 0, 53, 483, 1, 0, 0, 0, 55, 493, 1, 0, 0, 0, 57, 504, 1, 0, 0, 0, 59, 512, 1, 0, 0, 0, 61, 518, 1, 0, 0, 0, 63, 527, 1, 0, 0, 0, 65, 537, 1, 0, 0, 0, 67, 546, 1, 0, 0, 0, 69, 558, 1, 0, 0, 0, 71, 569, 1, 0, 0, 0, 73, 575, 1, 0, 0, 0, 75, 583, 1, 0, 0, 0, 77, 586, 1, 0, 0, 0, 79, 591, 1, 0, 0, 0, 81, 598, 1, 0, 0, 0, 83, 601, 1, 0, 0, 0, 85, 609, 1, 0, 0, 0, 87, 616, 1, 0, 0, 0, 89, 622, 1, 0, 0, 0, 91, 627, 1, 0, 0, 0, 93, 638, 1, 0, 0, 0, 95, 643, 1, 0, 0, 0, 97, 649, 1, 0, 0, 0, 99, 653, 1, 0, 0, 0, 101, 665, 1, 0, 0, 0, 103, 668, 1, 0, 0, 0, 105, 675, 1, 0, 0, 0, 107, 678, 1, 0, 0, 0, 109, 685, 1, 0, 0, 0, 111, 693, 1, 0, 0, 0, 113, 700, 1, 0, 0, 0, 115, 711, 1, 0, 0, 0, 117, 718, 1, 0, 0, 0, 119, 727, 1, 0, 0, 0, 121, 742, 1, 0, 0, 0, 123, 752, 1, 0, 0, 0, 125, 765, 1, 0, 0, 0, 127, 771, 1, 0, 0, 0, 129, 788, 1, 0, 0, 0, 131, 791, 1, 0, 0, 0, 133, 795, 1, 0, 0, 0, 135, 800, 1, 0, 0, 0, 137, 806, 1, 0, 0, 0, 139, 815, 1, 0, 0, 0, 141, 824, 1, 0, 0, 0, 143, 828, 1, 0, 0, 0, 145, 832, 1, 0, 0, 0, 147, 836, 1, 0, 0, 0, 149, 842, 1, 0, 0, 0, 151, 848, 1, 0, 0, 0, 153, 853, 1, 0, 0, 0, 155, 858, 1, 0, 0, 0, 157, 864, 1, 0, 0, 0, 159, 872, 1, 0, 0, 0, 161, 880, 1, 0, 0, 0, 163, 891, 1, 0, 0, 0, 165, 896, 1, 0, 0, 0, 167, 908, 1, 0, 0, 0, 169, 919, 1, 0, 0, 0, 171, 929, 1, 0, 0, 0, 173, 941, 1, 0, 0, 0, 175, 961, 1, 0, 0, 0, 177, 966, 1, 0, 0, 0, 179, 979, 1, 0, 0, 0, 181, 991, 1, 0, 0, 0, 183, 1003, 1, 0, 0, 0, 185, 1008, 1, 0, 0, 0, 187, 1016, 1, 0, 0, 0, 189, 1021, 1, 0, 0, 0, 191, 1034, 1, 0, 0, 0, 193, 1042, 1, 0, 0, 0, 195, 1051, 1, 0, 0, 0, 197, 1065, 1, 0, 0, 0, 199, 1074, 1, 0, 0, 0, 201, 1079, 1, 0, 0, 0, 203, 1086, 1, 0, 0, 0, 205, 1091, 1, 0, 0, 0, 207, 1097, 1, 0, 0, 0, 209, 1104, 1, 0, 0, 0, 211, 1110, 1, 0, 0, 0, 213, 1116, 1, 0, 0, 0, 215, 1123, 1, 0, 0, 0, 217, 1130, 1, 0, 0, 0, 219, 1137, 1, 0, 0, 0, 221, 1142, 1, 0, 0, 0, 223, 1148, 1, 0, 0, 0, 225, 1153, 1, 0, 0, 0, 227, 1156, 1, 0, 0, 0, 229, 1158, 1, 0, 0, 0, 231, 1160, 1, 0, 0, 0, 233, 1162, 1, 0, 0, 0, 235, 1164, 1, 0, 0, 0, 237, 1166, 1, 0, 0, 0, 239, 1168, 1, 0, 0, 0, 241, 1170, 1, 0, 0, 0, 243, 1172, 1, 0, 0, 0, 245, 1174, 1, 0, 0, 0, 247, 1176, 1, 0, 0, 0, 249, 1178, 1, 0, 0, 0, 251, 1180, 1, 0, 0, 0, 253, 1182, 1, 0, 0, 0, 255, 1185, 1, 0, 0, 0, 257, 1193, 1, 0, 0, 0, 259, 1224, 1, 0, 0, 0, 261, 1231, 1, 0, 0, 0, 263, 1241, 1, 0, 0, 0, 265, 1251, 1, 0, 0, 0, 267, 1253, 1, 0, 0, 0, 269, 1264, 1, 0, 0, 0, 271, 1279, 1, 0, 0, 0, 273, 274, 5, 119, 0, 0, 274, 275, 5, 111, 0, 0, 275, 276, 5, 114, 0, 0, 276, 277, 5, 107, 0, 0, 277, 278, 5, 115, 0, 0, 278, 279, 5, 112, 0, 0, 279, 280, 5, 97, 0, 0, 280, 281, 5, 99, 0, 0, 281, 282, 5, 101, 0, 0, 282, 2, 1, 0, 0, 0, 283, 284, 5, 114, 0, 0, 284, 285, 5, 101, 0, 0, 285, 286, 5, 115, 0, 0, 286, 287, 5, 117, 0, 0, 287, 288, 5, 108, 0, 0, 288, 289, 5, 116, 0, 0, 289, 290, 5, 45, 0, 0, 290, 291, 5, 98, 0, 0, 291, 292, 5, 121, 0, 0, 292, 293, 5, 116, 0, 0, 293, 294, 5, 101, 0, 0, 294, 295, 5, 115, 0, 0, 295, 4, 1, 0, 0, 0, 296, 297, 5, 114, 0, 0, 297, 298, 5, 112, 0, 0, 298, 299, 5, 99, 0, 0, 299, 300, 5, 45, 0, 0, 300, 301, 5, 99, 0, 0, 301, 302, 5, 97, 0, 0, 302, 303, 5, 108, 0, 0, 303, 304, 5, 108, 0, 0, 304, 305, 5, 115, 0, 0, 305, 6, 1, 0, 0, 0, 306, 307, 5, 100, 0, 0, 307, 308, 5, 101, 0, 0, 308, 309, 5, 97, 0, 0, 309, 310, 5, 100, 0, 0, 310, 311, 5, 108, 0, 0, 311, 312, 5, 105, 0, 0, 312, 313, 5, 110, 0, 0, 313, 314, 5, 101, 0, 0, 314, 315, 5, 45, 0, 0, 315, 316, 5, 109, 0, 0, 316, 317, 5, 115, 0, 0, 317, 8, 1, 0, 0, 0, 318, 319, 5, 113, 0, 0, 319, 320, 5, 117, 0, 0, 320, 321, 5, 101, 0, 0, 321, 322, 5, 114, 0, 0, 322, 323, 5, 121, 0, 0, 323, 10, 1, 0, 0, 0, 324, 325, 5, 114, 0, 0, 325, 326, 5, 101, 0, 0, 326, 327, 5, 102, 0, 0, 327, 328, 5, 108, 0, 0, 328, 329, 5, 101, 0, 0, 329, 330, 5, 99, 0, 0, 330, 331, 5, 116, 0, 0, 331, 332, 5, 105, 0, 0, 332, 333, 5, 111, 0, 0, 333, 334, 5, 110, 0, 0, 334, 12, 1, 0, 0, 0, 335, 336, 5, 115, 0, 0, 336, 337, 5, 112, 0, 0, 337, 338, 5, 101, 0, 0, 338, 339, 5, 99, 0, 0, 339, 340, 5, 105, 0, 0, 340, 341, 5, 97, 0, 0, 341, 342, 5, 108, 0, 0, 342, 343, 5, 105, 0, 0, 343, 344, 5, 122, 0, 0, 344, 345, 5, 101, 0, 0, 345, 14, 1, 0, 0, 0, 346, 347, 5, 114, 0, 0, 347, 348, 5, 111, 0, 0, 348, 349, 5, 111, 0, 0, 349, 350, 5, 116, 0, 0, 350, 16, 1, 0, 0, 0, 351, 352, 5, 100, 0, 0, 352, 353, 5, 111, 0, 0, 353, 354, 5, 99, 0, 0, 354, 355, 5, 117, 0, 0, 355, 356, 5, 109, 0, 0, 356, 357, 5, 101, 0, 0, 357, 358, 5, 110, 0, 0, 358, 359, 5, 116, 0, 0, 359, 18, 1, 0, 0, 0, 360, 361, 5, 102, 0, 0, 361, 362, 5, 114, 0, 0, 362, 363, 5, 97, 0, 0, 363, 364, 5, 103, 0, 0, 364, 365, 5, 109, 0, 0, 365, 366, 5, 101, 0, 0, 366, 367, 5, 110, 0, 0, 367, 368, 5, 116, 0, 0, 368, 369, 5, 115, 0, 0, 369, 20, 1, 0, 0, 0, 370, 371, 5, 118, 0, 0, 371, 372, 5, 105, 0, 0, 372, 373, 5, 101, 0, 0, 373, 374, 5, 119, 0, 0, 374, 22, 1, 0, 0, 0, 375, 376, 5, 109, 0, 0, 376, 377, 5, 97, 0, 0, 377, 378, 5, 120, 0, 0, 378, 24, 1, 0, 0, 0, 379, 380, 5, 97, 0, 0, 380, 381, 5, 108, 0, 0, 381, 382, 5, 108, 0, 0, 382, 383, 5, 111, 0, 0, 383, 384, 5, 119, 0, 0, 384, 26, 1, 0, 0, 0, 385, 386, 5, 112, 0, 0, 386, 387, 5, 111, 0, 0, 387, 388, 5, 108, 0, 0, 388, 389, 5, 108, 0, 0, 389, 28, 1, 0, 0, 0, 390, 391, 5, 113, 0, 0, 391, 392, 5, 117, 0, 0, 392, 393, 5, 101, 0, 0, 393, 394, 5, 114, 0, 0, 394, 395, 5, 121, 0, 0, 395, 396, 5, 97, 0, 0, 396, 397, 5, 98, 0, 0, 397, 398, 5, 108, 0, 0, 398, 399, 5, 101, 0, 0, 399, 30, 1, 0, 0, 0, 400, 401, 5, 114, 0, 0, 401, 402, 5, 112, 0, 0, 402, 403, 5, 99, 0, 0, 403, 32, 1, 0, 0, 0, 404, 405, 5, 113, 0, 0, 405, 406, 5, 117, 0, 0, 406, 407, 5, 101, 0, 0, 407, 408, 5, 114, 0, 0, 408, 409, 5, 121, 0, 0, 409, 410, 5, 45, 0, 0, 410, 411, 5, 114, 0, 0, 411, 412, 5, 101, 0, 0, 412, 413, 5, 97, 0, 0, 413, 414, 5, 115, 0, 0, 414, 415, 5, 111, 0, 0, 415, 416, 5, 110, 0, 0, 416, 34, 1, 0, 0, 0, 417, 418, 5, 116, 0, 0, 418, 419, 5, 121, 0, 0, 419, 420, 5, 112, 0, 0, 420, 421, 5, 101, 0, 0, 421, 36, 1, 0, 0, 0, 422, 423, 5, 111, 0, 0, 423, 424, 5, 98, 0, 0, 424, 425, 5, 106, 0, 0, 425, 426, 5, 101, 0, 0, 426, 427, 5, 99, 0, 0, 427, 428, 5, 116, 0, 0, 428, 38, 1, 0, 0, 0, 429, 430, 5, 115, 0, 0, 430, 431, 5, 116, 0, 0, 431, 432, 5, 111, 0, 0, 432, 433, 5, 114, 0, 0, 433, 434, 5, 97, 0, 0, 434, 435, 5, 98, 0, 0, 435, 436, 5, 108, 0, 0, 436, 437, 5, 101, 0, 0, 437, 40, 1, 0, 0, 0, 438, 439, 5, 105, 0, 0, 439, 440, 5, 109, 0, 0, 440, 441, 5, 112, 0, 0, 441, 442, 5, 108, 0, 0, 442, 443, 5, 101, 0, 0, 443, 444, 5, 109, 0, 0, 444, 445, 5, 101, 0, 0, 445, 446, 5, 110, 0, 0, 446, 447, 5, 116, 0, 0, 447, 448, 5, 115, 0, 0, 448, 42, 1, 0, 0, 0, 449, 450, 5, 114, 0, 0, 450, 451, 5, 101, 0, 0, 451, 452, 5, 102, 0, 0, 452, 44, 1, 0, 0, 0, 453, 454, 5, 102, 0, 0, 454, 455, 5, 114, 0, 0, 455, 456, 5, 97, 0, 0, 456, 457, 5, 103, 0, 0, 457, 458, 5, 109, 0, 0, 458, 459, 5, 101, 0, 0, 459, 460, 5, 110, 0, 0, 460, 461, 5, 116, 0, 0, 461, 46, 1, 0, 0, 0, 462, 463, 5, 105, 0, 0, 463, 464, 5, 109, 0, 0, 464, 465, 5, 112, 0, 0, 465, 466, 5, 111, 0, 0, 466, 467, 5, 114, 0, 0, 467, 468, 5, 116, 0, 0, 468, 48, 1, 0, 0, 0, 469, 470, 5, 101, 0, 0, 470, 471, 5, 120, 0, 0, 471, 472, 5, 116, 0, 0, 472, 473, 5, 101, 0, 0, 473, 474, 5, 114, 0, 0, 474, 475, 5, 110, 0, 0, 475, 476, 5, 97, 0, 0, 476, 477, 5, 108, 0, 0, 477, 50, 1, 0, 0, 0, 478, 479, 5, 97, 0, 0, 479, 480, 5, 116, 0, 0, 480, 481, 5, 111, 0, 0, 481, 482, 5, 109, 0, 0, 482, 52, 1, 0, 0, 0, 483, 484, 5, 105, 0, 0, 484, 485, 5, 110, 0, 0, 485, 486, 5, 116, 0, 0, 486, 487, 5, 101, 0, 0, 487, 488, 5, 114, 0, 0, 488, 489, 5, 102, 0, 0, 489, 490, 5, 97, 0, 0, 490, 491, 5, 99, 0, 0, 491, 492, 5, 101, 0, 0, 492, 54, 1, 0, 0, 0, 493, 494, 5, 105, 0, 0, 494, 495, 5, 110, 0, 0, 495, 496, 5, 116, 0, 0, 496, 497, 5, 101, 0, 0, 497, 498, 5, 114, 0, 0, 498, 499, 5, 102, 0, 0, 499, 500, 5, 97, 0, 0, 500, 501, 5, 99, 0, 0, 501, 502, 5, 101, 0, 0, 502, 503, 5, 115, 0, 0, 503, 56, 1, 0, 0, 0, 504, 505, 5, 112, 0, 0, 505, 506, 5, 97, 0, 0, 506, 507, 5, 99, 0, 0, 507, 508, 5, 107, 0, 0, 508, 509, 5, 97, 0, 0, 509, 510, 5, 103, 0, 0, 510, 511, 5, 101, 0, 0, 511, 58, 1, 0, 0, 0, 512, 513, 5, 118, 0, 0, 513, 514, 5, 97, 0, 0, 514, 515, 5, 108, 0, 0, 515, 516, 5, 117, 0, 0, 516, 517, 5, 101, 0, 0, 517, 60, 1, 0, 0, 0, 518, 519, 5, 114, 0, 0, 519, 520, 5, 101, 0, 0, 520, 521, 5, 108, 0, 0, 521, 522, 5, 97, 0, 0, 522, 523, 5, 116, 0, 0, 523, 524, 5, 105, 0, 0, 524, 525, 5, 111, 0, 0, 525, 526, 5, 110, 0, 0, 526, 62, 1, 0, 0, 0, 527, 528, 5, 111, 0, 0, 528, 529, 5, 112, 0, 0, 529, 530, 5, 101, 0, 0, 530, 531, 5, 114, 0, 0, 531, 532, 5, 97, 0, 0, 532, 533, 5, 116, 0, 0, 533, 534, 5, 105, 0, 0, 534, 535, 5, 111, 0, 0, 535, 536, 5, 110, 0, 0, 536, 64, 1, 0, 0, 0, 537, 538, 5, 102, 0, 0, 538, 539, 5, 117, 0, 0, 539, 540, 5, 110, 0, 0, 540, 541, 5, 99, 0, 0, 541, 542, 5, 116, 0, 0, 542, 543, 5, 105, 0, 0, 543, 544, 5, 111, 0, 0, 544, 545, 5, 110, 0, 0, 545, 66, 1, 0, 0, 0, 546, 547, 5, 99, 0, 0, 547, 548, 5, 111, 0, 0, 548, 549, 5, 110, 0, 0, 549, 550, 5, 115, 0, 0, 550, 551, 5, 116, 0, 0, 551, 552, 5, 114, 0, 0, 552, 553, 5, 117, 0, 0, 553, 554, 5, 99, 0, 0, 554, 555, 5, 116, 0, 0, 555, 556, 5, 111, 0, 0, 556, 557, 5, 114, 0, 0, 557, 68, 1, 0, 0, 0, 558, 559, 5, 99, 0, 0, 559, 560, 5, 111, 0, 0, 560, 561, 5, 110, 0, 0, 561, 562, 5, 115, 0, 0, 562, 563, 5, 116, 0, 0, 563, 564, 5, 114, 0, 0, 564, 565, 5, 117, 0, 0, 565, 566, 5, 99, 0, 0, 566, 567, 5, 116, 0, 0, 567, 568, 5, 115, 0, 0, 568, 70, 1, 0, 0, 0, 569, 570, 5, 105, 0, 0, 570, 571, 5, 110, 0, 0, 571, 572, 5, 112, 0, 0, 572, 573, 5, 117, 0, 0, 573, 574, 5, 116, 0, 0, 574, 72, 1, 0, 0, 0, 575, 576, 5, 99, 0, 0, 576, 577, 5, 111, 0, 0, 577, 578, 5, 110, 0, 0, 578, 579, 5, 102, 0, 0, 579, 580, 5, 111, 0, 0, 580, 581, 5, 114, 0, 0, 581, 582, 5, 109, 0, 0, 582, 74, 1, 0, 0, 0, 583, 584, 5, 97, 0, 0, 584, 585, 5, 115, 0, 0, 585, 76, 1, 0, 0, 0, 586, 587, 5, 98, 0, 0, 587, 588, 5, 105, 0, 0, 588, 589, 5, 110, 0, 0, 589, 590, 5, 100, 0, 0, 590, 78, 1, 0, 0, 0, 591, 592, 5, 115, 0, 0, 592, 593, 5, 116, 0, 0, 593, 594, 5, 97, 0, 0, 594, 595, 5, 116, 0, 0, 595, 596, 5, 105, 0, 0, 596, 597, 5, 99, 0, 0, 597, 80, 1, 0, 0, 0, 598, 599, 5, 116, 0, 0, 599, 600, 5, 111, 0, 0, 600, 82, 1, 0, 0, 0, 601, 602, 5, 112, 0, 0, 602, 603, 5, 114, 0, 0, 603, 604, 5, 105, 0, 0, 604, 605, 5, 118, 0, 0, 605, 606, 5, 97, 0, 0, 606, 607, 5, 116, 0, 0, 607, 608, 5, 101, 0, 0, 608, 84, 1, 0, 0, 0, 609, 610, 5, 115, 0, 0, 610, 611, 5, 104, 0, 0, 611, 612, 5, 97, 0, 0, 612, 613, 5, 114, 0, 0, 613, 614, 5, 101, 0, 0, 614, 615, 5, 100, 0, 0, 615, 86, 1, 0, 0, 0, 616, 617, 5, 115, 0, 0, 617, 618, 5, 116, 0, 0, 618, 619, 5, 97, 0, 0, 619, 620, 5, 116, 0, 0, 620, 621, 5, 101, 0, 0, 621, 88, 1, 0, 0, 0, 622, 623, 5, 101, 0, 0, 623, 624, 5, 100, 0, 0, 624, 625, 5, 103, 0, 0, 625, 626, 5, 101, 0, 0, 626, 90, 1, 0, 0, 0, 627, 628, 5, 112, 0, 0, 628, 629, 5, 114, 0, 0, 629, 630, 5, 111, 0, 0, 630, 631, 5, 106, 0, 0, 631, 632, 5, 101, 0, 0, 632, 633, 5, 99, 0, 0, 633, 634, 5, 116, 0, 0, 634, 635, 5, 105, 0, 0, 635, 636, 5, 111, 0, 0, 636, 637, 5, 110, 0, 0, 637, 92, 1, 0, 0, 0, 638, 639, 5, 119, 0, 0, 639, 640, 5, 105, 0, 0, 640, 641, 5, 116, 0, 0, 641, 642, 5, 104, 0, 0, 642, 94, 1, 0, 0, 0, 643, 644, 5, 117, 0, 0, 644, 645, 5, 115, 0, 0, 645, 646, 5, 105, 0, 0, 646, 647, 5, 110, 0, 0, 647, 648, 5, 103, 0, 0, 648, 96, 1, 0, 0, 0, 649, 650, 5, 118, 0, 0, 650, 651, 5, 105, 0, 0, 651, 652, 5, 97, 0, 0, 652, 98, 1, 0, 0, 0, 653, 654, 5, 109, 0, 0, 654, 655, 5, 97, 0, 0, 655, 656, 5, 116, 0, 0, 656, 657, 5, 101, 0, 0, 657, 658, 5, 114, 0, 0, 658, 659, 5, 105, 0, 0, 659, 660, 5, 97, 0, 0, 660, 661, 5, 108, 0, 0, 661, 662, 5, 105, 0, 0, 662, 663, 5, 122, 0, 0, 663, 664, 5, 101, 0, 0, 664, 100, 1, 0, 0, 0, 665, 666, 5, 105, 0, 0, 666, 667, 5, 102, 0, 0, 667, 102, 1, 0, 0, 0, 668, 669, 5, 97, 0, 0, 669, 670, 5, 98, 0, 0, 670, 671, 5, 115, 0, 0, 671, 672, 5, 101, 0, 0, 672, 673, 5, 110, 0, 0, 673, 674, 5, 116, 0, 0, 674, 104, 1, 0, 0, 0, 675, 676, 5, 111, 0, 0, 676, 677, 5, 110, 0, 0, 677, 106, 1, 0, 0, 0, 678, 679, 5, 112, 0, 0, 679, 680, 5, 111, 0, 0, 680, 681, 5, 108, 0, 0, 681, 682, 5, 105, 0, 0, 682, 683, 5, 99, 0, 0, 683, 684, 5, 121, 0, 0, 684, 108, 1, 0, 0, 0, 685, 686, 5, 100, 0, 0, 686, 687, 5, 101, 0, 0, 687, 688, 5, 102, 0, 0, 688, 689, 5, 97, 0, 0, 689, 690, 5, 117, 0, 0, 690, 691, 5, 108, 0, 0, 691, 692, 5, 116, 0, 0, 692, 110, 1, 0, 0, 0, 693, 694, 5, 115, 0, 0, 694, 695, 5, 111, 0, 0, 695, 696, 5, 117, 0, 0, 696, 697, 5, 114, 0, 0, 697, 698, 5, 99, 0, 0, 698, 699, 5, 101, 0, 0, 699, 112, 1, 0, 0, 0, 700, 701, 5, 114, 0, 0, 701, 702, 5, 101, 0, 0, 702, 703, 5, 112, 0, 0, 703, 704, 5, 111, 0, 0, 704, 705, 5, 115, 0, 0, 705, 706, 5, 105, 0, 0, 706, 707, 5, 116, 0, 0, 707, 708, 5, 111, 0, 0, 708, 709, 5, 114, 0, 0, 709, 710, 5, 121, 0, 0, 710, 114, 1, 0, 0, 0, 711, 712, 5, 99, 0, 0, 712, 713, 5, 111, 0, 0, 713, 714, 5, 109, 0, 0, 714, 715, 5, 109, 0, 0, 715, 716, 5, 105, 0, 0, 716, 717, 5, 116, 0, 0, 717, 116, 1, 0, 0, 0, 718, 719, 5, 114, 0, 0, 719, 720, 5, 101, 0, 0, 720, 721, 5, 118, 0, 0, 721, 722, 5, 105, 0, 0, 722, 723, 5, 115, 0, 0, 723, 724, 5, 105, 0, 0, 724, 725, 5, 111, 0, 0, 725, 726, 5, 110, 0, 0, 726, 118, 1, 0, 0, 0, 727, 728, 5, 115, 0, 0, 728, 729, 5, 101, 0, 0, 729, 730, 5, 109, 0, 0, 730, 731, 5, 97, 0, 0, 731, 732, 5, 110, 0, 0, 732, 733, 5, 116, 0, 0, 733, 734, 5, 105, 0, 0, 734, 735, 5, 99, 0, 0, 735, 736, 5, 45, 0, 0, 736, 737, 5, 109, 0, 0, 737, 738, 5, 97, 0, 0, 738, 739, 5, 106, 0, 0, 739, 740, 5, 111, 0, 0, 740, 741, 5, 114, 0, 0, 741, 120, 1, 0, 0, 0, 742, 743, 5, 111, 0, 0, 743, 744, 5, 110, 0, 0, 744, 745, 5, 45, 0, 0, 745, 746, 5, 100, 0, 0, 746, 747, 5, 101, 0, 0, 747, 748, 5, 108, 0, 0, 748, 749, 5, 101, 0, 0, 749, 750, 5, 116, 0, 0, 750, 751, 5, 101, 0, 0, 751, 122, 1, 0, 0, 0, 752, 753, 5, 114, 0, 0, 753, 754, 5, 101, 0, 0, 754, 755, 5, 116, 0, 0, 755, 756, 5, 97, 0, 0, 756, 757, 5, 105, 0, 0, 757, 758, 5, 110, 0, 0, 758, 759, 5, 45, 0, 0, 759, 760, 5, 111, 0, 0, 760, 761, 5, 116, 0, 0, 761, 762, 5, 104, 0, 0, 762, 763, 5, 101, 0, 0, 763, 764, 5, 114, 0, 0, 764, 124, 1, 0, 0, 0, 765, 766, 5, 107, 0, 0, 766, 767, 5, 101, 0, 0, 767, 768, 5, 121, 0, 0, 768, 769, 5, 101, 0, 0, 769, 770, 5, 100, 0, 0, 770, 126, 1, 0, 0, 0, 771, 772, 5, 112, 0, 0, 772, 773, 5, 117, 0, 0, 773, 774, 5, 98, 0, 0, 774, 775, 5, 108, 0, 0, 775, 776, 5, 105, 0, 0, 776, 777, 5, 99, 0, 0, 777, 778, 5, 45, 0, 0, 778, 779, 5, 116, 0, 0, 779, 780, 5, 114, 0, 0, 780, 781, 5, 97, 0, 0, 781, 782, 5, 118, 0, 0, 782, 783, 5, 101, 0, 0, 783, 784, 5, 114, 0, 0, 784, 785, 5, 115, 0, 0, 785, 786, 5, 97, 0, 0, 786, 787, 5, 108, 0, 0, 787, 128, 1, 0, 0, 0, 788, 789, 5, 105, 0, 0, 789, 790, 5, 100, 0, 0, 790, 130, 1, 0, 0, 0, 791, 792, 5, 100, 0, 0, 792, 793, 5, 111, 0, 0, 793, 794, 5, 99, 0, 0, 794, 132, 1, 0, 0, 0, 795, 796, 5, 109, 0, 0, 796, 797, 5, 111, 0, 0, 797, 798, 5, 100, 0, 0, 798, 799, 5, 101, 0, 0, 799, 134, 1, 0, 0, 0, 800, 801, 5, 101, 0, 0, 801, 802, 5, 109, 0, 0, 802, 803, 5, 105, 0, 0, 803, 804, 5, 116, 0, 0, 804, 805, 5, 115, 0, 0, 805, 136, 1, 0, 0, 0, 806, 807, 5, 114, 0, 0, 807, 808, 5, 101, 0, 0, 808, 809, 5, 99, 0, 0, 809, 810, 5, 101, 0, 0, 810, 811, 5, 105, 0, 0, 811, 812, 5, 118, 0, 0, 812, 813, 5, 101, 0, 0, 813, 814, 5, 114, 0, 0, 814, 138, 1, 0, 0, 0, 815, 816, 5, 114, 0, 0, 816, 817, 5, 101, 0, 0, 817, 818, 5, 113, 0, 0, 818, 819, 5, 117, 0, 0, 819, 820, 5, 105, 0, 0, 820, 821, 5, 114, 0, 0, 821, 822, 5, 101, 0, 0, 822, 823, 5, 115, 0, 0, 823, 140, 1, 0, 0, 0, 824, 825, 5, 97, 0, 0, 825, 826, 5, 110, 0, 0, 826, 827, 5, 121, 0, 0, 827, 142, 1, 0, 0, 0, 828, 829, 5, 103, 0, 0, 829, 830, 5, 101, 0, 0, 830, 831, 5, 116, 0, 0, 831, 144, 1, 0, 0, 0, 832, 833, 5, 115, 0, 0, 833, 834, 5, 101, 0, 0, 834, 835, 5, 116, 0, 0, 835, 146, 1, 0, 0, 0, 836, 837, 5, 119, 0, 0, 837, 838, 5, 97, 0, 0, 838, 839, 5, 116, 0, 0, 839, 840, 5, 99, 0, 0, 840, 841, 5, 104, 0, 0, 841, 148, 1, 0, 0, 0, 842, 843, 5, 115, 0, 0, 843, 844, 5, 116, 0, 0, 844, 845, 5, 97, 0, 0, 845, 846, 5, 114, 0, 0, 846, 847, 5, 116, 0, 0, 847, 150, 1, 0, 0, 0, 848, 849, 5, 115, 0, 0, 849, 850, 5, 116, 0, 0, 850, 851, 5, 111, 0, 0, 851, 852, 5, 112, 0, 0, 852, 152, 1, 0, 0, 0, 853, 854, 5, 114, 0, 0, 854, 855, 5, 101, 0, 0, 855, 856, 5, 97, 0, 0, 856, 857, 5, 100, 0, 0, 857, 154, 1, 0, 0, 0, 858, 859, 5, 119, 0, 0, 859, 860, 5, 114, 0, 0, 860, 861, 5, 105, 0, 0, 861, 862, 5, 116, 0, 0, 862, 863, 5, 101, 0, 0, 863, 156, 1, 0, 0, 0, 864, 865, 5, 114, 0, 0, 865, 866, 5, 101, 0, 0, 866, 867, 5, 115, 0, 0, 867, 868, 5, 111, 0, 0, 868, 869, 5, 108, 0, 0, 869, 870, 5, 118, 0, 0, 870, 871, 5, 101, 0, 0, 871, 158, 1, 0, 0, 0, 872, 873, 5, 99, 0, 0, 873, 874, 5, 111, 0, 0, 874, 875, 5, 110, 0, 0, 875, 876, 5, 110, 0, 0, 876, 877, 5, 101, 0, 0, 877, 878, 5, 99, 0, 0, 878, 879, 5, 116, 0, 0, 879, 160, 1, 0, 0, 0, 880, 881, 5, 100, 0, 0, 881, 882, 5, 105, 0, 0, 882, 883, 5, 115, 0, 0, 883, 884, 5, 99, 0, 0, 884, 885, 5, 111, 0, 0, 885, 886, 5, 110, 0, 0, 886, 887, 5, 110, 0, 0, 887, 888, 5, 101, 0, 0, 888, 889, 5, 99, 0, 0, 889, 890, 5, 116, 0, 0, 890, 162, 1, 0, 0, 0, 891, 892, 5, 99, 0, 0, 892, 893, 5, 97, 0, 0, 893, 894, 5, 108, 0, 0, 894, 895, 5, 108, 0, 0, 895, 164, 1, 0, 0, 0, 896, 897, 5, 119, 0, 0, 897, 898, 5, 97, 0, 0, 898, 899, 5, 116, 0, 0, 899, 900, 5, 99, 0, 0, 900, 901, 5, 104, 0, 0, 901, 902, 5, 45, 0, 0, 902, 903, 5, 115, 0, 0, 903, 904, 5, 116, 0, 0, 904, 905, 5, 97, 0, 0, 905, 906, 5, 114, 0, 0, 906, 907, 5, 116, 0, 0, 907, 166, 1, 0, 0, 0, 908, 909, 5, 119, 0, 0, 909, 910, 5, 97, 0, 0, 910, 911, 5, 116, 0, 0, 911, 912, 5, 99, 0, 0, 912, 913, 5, 104, 0, 0, 913, 914, 5, 45, 0, 0, 914, 915, 5, 115, 0, 0, 915, 916, 5, 116, 0, 0, 916, 917, 5, 111, 0, 0, 917, 918, 5, 112, 0, 0, 918, 168, 1, 0, 0, 0, 919, 920, 5, 115, 0, 0, 920, 921, 5, 117, 0, 0, 921, 922, 5, 98, 0, 0, 922, 923, 5, 115, 0, 0, 923, 924, 5, 99, 0, 0, 924, 925, 5, 114, 0, 0, 925, 926, 5, 105, 0, 0, 926, 927, 5, 98, 0, 0, 927, 928, 5, 101, 0, 0, 928, 170, 1, 0, 0, 0, 929, 930, 5, 117, 0, 0, 930, 931, 5, 110, 0, 0, 931, 932, 5, 115, 0, 0, 932, 933, 5, 117, 0, 0, 933, 934, 5, 98, 0, 0, 934, 935, 5, 115, 0, 0, 935, 936, 5, 99, 0, 0, 936, 937, 5, 114, 0, 0, 937, 938, 5, 105, 0, 0, 938, 939, 5, 98, 0, 0, 939, 940, 5, 101, 0, 0, 940, 172, 1, 0, 0, 0, 941, 942, 5, 111, 0, 0, 942, 943, 5, 112, 0, 0, 943, 944, 5, 116, 0, 0, 944, 945, 5, 105, 0, 0, 945, 946, 5, 109, 0, 0, 946, 947, 5, 105, 0, 0, 947, 948, 5, 115, 0, 0, 948, 949, 5, 116, 0, 0, 949, 950, 5, 105, 0, 0, 950, 951, 5, 99, 0, 0, 951, 952, 5, 45, 0, 0, 952, 953, 5, 114, 0, 0, 953, 954, 5, 101, 0, 0, 954, 955, 5, 103, 0, 0, 955, 956, 5, 105, 0, 0, 956, 957, 5, 115, 0, 0, 957, 958, 5, 116, 0, 0, 958, 959, 5, 101, 0, 0, 959, 960, 5, 114, 0, 0, 960, 174, 1, 0, 0, 0, 961, 962, 5, 99, 0, 0, 962, 963, 5, 114, 0, 0, 963, 964, 5, 100, 0, 0, 964, 965, 5, 116, 0, 0, 965, 176, 1, 0, 0, 0, 966, 967, 5, 111, 0, 0, 967, 968, 5, 112, 0, 0, 968, 969, 5, 116, 0, 0, 969, 970, 5, 105, 0, 0, 970, 971, 5, 111, 0, 0, 971, 972, 5, 110, 0, 0, 972, 973, 5, 97, 0, 0, 973, 974, 5, 108, 0, 0, 974, 975, 5, 45, 0, 0, 975, 976, 5, 111, 0, 0, 976, 977, 5, 110, 0, 0, 977, 978, 5, 101, 0, 0, 978, 178, 1, 0, 0, 0, 979, 980, 5, 101, 0, 0, 980, 981, 5, 120, 0, 0, 981, 982, 5, 97, 0, 0, 982, 983, 5, 99, 0, 0, 983, 984, 5, 116, 0, 0, 984, 985, 5, 108, 0, 0, 985, 986, 5, 121, 0, 0, 986, 987, 5, 45, 0, 0, 987, 988, 5, 111, 0, 0, 988, 989, 5, 110, 0, 0, 989, 990, 5, 101, 0, 0, 990, 180, 1, 0, 0, 0, 991, 992, 5, 109, 0, 0, 992, 993, 5, 97, 0, 0, 993, 994, 5, 110, 0, 0, 994, 995, 5, 121, 0, 0, 995, 996, 5, 45, 0, 0, 996, 997, 5, 117, 0, 0, 997, 998, 5, 110, 0, 0, 998, 999, 5, 105, 0, 0, 999, 1000, 5, 113, 0, 0, 1000, 1001, 5, 117, 0, 0, 1001, 1002, 5, 101, 0, 0, 1002, 182, 1, 0, 0, 0, 1003, 1004, 5, 109, 0, 0, 1004, 1005, 5, 97, 0, 0, 1005, 1006, 5, 110, 0, 0, 1006, 1007, 5, 121, 0, 0, 1007, 184, 1, 0, 0, 0, 1008, 1009, 5, 111, 0, 0, 1009, 1010, 5, 114, 0, 0, 1010, 1011, 5, 100, 0, 0, 1011, 1012, 5, 101, 0, 0, 1012, 1013, 5, 114, 0, 0, 1013, 1014, 5, 101, 0, 0, 1014, 1015, 5, 100, 0, 0, 1015, 186, 1, 0, 0, 0, 1016, 1017, 5, 117, 0, 0, 1017, 1018, 5, 110, 0, 0, 1018, 1019, 5, 105, 0, 0, 1019, 1020, 5, 116, 0, 0, 1020, 188, 1, 0, 0, 0, 1021, 1022, 5, 119, 0, 0, 1022, 1023, 5, 97, 0, 0, 1023, 1024, 5, 116, 0, 0, 1024, 1025, 5, 99, 0, 0, 1025, 1026, 5, 104, 0, 0, 1026, 1027, 5, 45, 0, 0, 1027, 1028, 5, 104, 0, 0, 1028, 1029, 5, 97, 0, 0, 1029, 1030, 5, 110, 0, 0, 1030, 1031, 5, 100, 0, 0, 1031, 1032, 5, 108, 0, 0, 1032, 1033, 5, 101, 0, 0, 1033, 190, 1, 0, 0, 0, 1034, 1035, 5, 109, 0, 0, 1035, 1036, 5, 101, 0, 0, 1036, 1037, 5, 115, 0, 0, 1037, 1038, 5, 115, 0, 0, 1038, 1039, 5, 97, 0, 0, 1039, 1040, 5, 103, 0, 0, 1040, 1041, 5, 101, 0, 0, 1041, 192, 1, 0, 0, 0, 1042, 1043, 5, 97, 0, 0, 1043, 1044, 5, 116, 0, 0, 1044, 1045, 5, 111, 0, 0, 1045, 1046, 5, 109, 0, 0, 1046, 1047, 5, 45, 0, 0, 1047, 1048, 5, 114, 0, 0, 1048, 1049, 5, 101, 0, 0, 1049, 1050, 5, 102, 0, 0, 1050, 194, 1, 0, 0, 0, 1051, 1052, 5, 105, 0, 0, 1052, 1053, 5, 110, 0, 0, 1053, 1054, 5, 116, 0, 0, 1054, 1055, 5, 101, 0, 0, 1055, 1056, 5, 114, 0, 0, 1056, 1057, 5, 102, 0, 0, 1057, 1058, 5, 97, 0, 0, 1058, 1059, 5, 99, 0, 0, 1059, 1060, 5, 101, 0, 0, 1060, 1061, 5, 45, 0, 0, 1061, 1062, 5, 114, 0, 0, 1062, 1063, 5, 101, 0, 0, 1063, 1064, 5, 102, 0, 0, 1064, 196, 1, 0, 0, 0, 1065, 1066, 5, 111, 0, 0, 1066, 1067, 5, 112, 0, 0, 1067, 1068, 5, 116, 0, 0, 1068, 1069, 5, 105, 0, 0, 1069, 1070, 5, 111, 0, 0, 1070, 1071, 5, 110, 0, 0, 1071, 1072, 5, 97, 0, 0, 1072, 1073, 5, 108, 0, 0, 1073, 198, 1, 0, 0, 0, 1074, 1075, 5, 108, 0, 0, 1075, 1076, 5, 105, 0, 0, 1076, 1077, 5, 115, 0, 0, 1077, 1078, 5, 116, 0, 0, 1078, 200, 1, 0, 0, 0, 1079, 1080, 5, 114, 0, 0, 1080, 1081, 5, 101, 0, 0, 1081, 1082, 5, 99, 0, 0, 1082, 1083, 5, 111, 0, 0, 1083, 1084, 5, 114, 0, 0, 1084, 1085, 5, 100, 0, 0, 1085, 202, 1, 0, 0, 0, 1086, 1087, 5, 98, 0, 0, 1087, 1088, 5, 111, 0, 0, 1088, 1089, 5, 111, 0, 0, 1089, 1090, 5, 108, 0, 0, 1090, 204, 1, 0, 0, 0, 1091, 1092, 5, 98, 0, 0, 1092, 1093, 5, 121, 0, 0, 1093, 1094, 5, 116, 0, 0, 1094, 1095, 5, 101, 0, 0, 1095, 1096, 5, 115, 0, 0, 1096, 206, 1, 0, 0, 0, 1097, 1098, 5, 100, 0, 0, 1098, 1099, 5, 111, 0, 0, 1099, 1100, 5, 117, 0, 0, 1100, 1101, 5, 98, 0, 0, 1101, 1102, 5, 108, 0, 0, 1102, 1103, 5, 101, 0, 0, 1103, 208, 1, 0, 0, 0, 1104, 1105, 5, 105, 0, 0, 1105, 1106, 5, 110, 0, 0, 1106, 1107, 5, 116, 0, 0, 1107, 1108, 5, 51, 0, 0, 1108, 1109, 5, 50, 0, 0, 1109, 210, 1, 0, 0, 0, 1110, 1111, 5, 105, 0, 0, 1111, 1112, 5, 110, 0, 0, 1112, 1113, 5, 116, 0, 0, 1113, 1114, 5, 54, 0, 0, 1114, 1115, 5, 52, 0, 0, 1115, 212, 1, 0, 0, 0, 1116, 1117, 5, 115, 0, 0, 1117, 1118, 5, 116, 0, 0, 1118, 1119, 5, 114, 0, 0, 1119, 1120, 5, 105, 0, 0, 1120, 1121, 5, 110, 0, 0, 1121, 1122, 5, 103, 0, 0, 1122, 214, 1, 0, 0, 0, 1123, 1124, 5, 117, 0, 0, 1124, 1125, 5, 105, 0, 0, 1125, 1126, 5, 110, 0, 0, 1126, 1127, 5, 116, 0, 0, 1127, 1128, 5, 51, 0, 0, 1128, 1129, 5, 50, 0, 0, 1129, 216, 1, 0, 0, 0, 1130, 1131, 5, 117, 0, 0, 1131, 1132, 5, 105, 0, 0, 1132, 1133, 5, 110, 0, 0, 1133, 1134, 5, 116, 0, 0, 1134, 1135, 5, 54, 0, 0, 1135, 1136, 5, 52, 0, 0, 1136, 218, 1, 0, 0, 0, 1137, 1138, 5, 116, 0, 0, 1138, 1139, 5, 114, 0, 0, 1139, 1140, 5, 117, 0, 0, 1140, 1141, 5, 101, 0, 0, 1141, 220, 1, 0, 0, 0, 1142, 1143, 5, 102, 0, 0, 1143, 1144, 5, 97, 0, 0, 1144, 1145, 5, 108, 0, 0, 1145, 1146, 5, 115, 0, 0, 1146, 1147, 5, 101, 0, 0, 1147, 222, 1, 0, 0, 0, 1148, 1149, 5, 110, 0, 0, 1149, 1150, 5, 117, 0, 0, 1150, 1151, 5, 108, 0, 0, 1151, 1152, 5, 108, 0, 0, 1152, 224, 1, 0, 0, 0, 1153, 1154, 5, 45, 0, 0, 1154, 1155, 5, 62, 0, 0, 1155, 226, 1, 0, 0, 0, 1156, 1157, 5, 58, 0, 0, 1157, 228, 1, 0, 0, 0, 1158, 1159, 5, 59, 0, 0, 1159, 230, 1, 0, 0, 0, 1160, 1161, 5, 44, 0, 0, 1161, 232, 1, 0, 0, 0, 1162, 1163, 5, 46, 0, 0, 1163, 234, 1, 0, 0, 0, 1164, 1165, 5, 123, 0, 0, 1165, 236, 1, 0, 0, 0, 1166, 1167, 5, 125, 0, 0, 1167, 238, 1, 0, 0, 0, 1168, 1169, 5, 91, 0, 0, 1169, 240, 1, 0, 0, 0, 1170, 1171, 5, 93, 0, 0, 1171, 242, 1, 0, 0, 0, 1172, 1173, 5, 40, 0, 0, 1173, 244, 1, 0, 0, 0, 1174, 1175, 5, 41, 0, 0, 1175, 246, 1, 0, 0, 0, 1176, 1177, 5, 60, 0, 0, 1177, 248, 1, 0, 0, 0, 1178, 1179, 5, 62, 0, 0, 1179, 250, 1, 0, 0, 0, 1180, 1181, 5, 38, 0, 0, 1181, 252, 1, 0, 0, 0, 1182, 1183, 5, 61, 0, 0, 1183, 254, 1, 0, 0, 0, 1184, 1186, 5, 45, 0, 0, 1185, 1184, 1, 0, 0, 0, 1185, 1186, 1, 0, 0, 0, 1186, 1188, 1, 0, 0, 0, 1187, 1189, 7, 0, 0, 0, 1188, 1187, 1, 0, 0, 0, 1189, 1190, 1, 0, 0, 0, 1190, 1188, 1, 0, 0, 0, 1190, 1191, 1, 0, 0, 0, 1191, 256, 1, 0, 0, 0, 1192, 1194, 5, 45, 0, 0, 1193, 1192, 1, 0, 0, 0, 1193, 1194, 1, 0, 0, 0, 1194, 1203, 1, 0, 0, 0, 1195, 1204, 5, 48, 0, 0, 1196, 1200, 7, 1, 0, 0, 1197, 1199, 7, 0, 0, 0, 1198, 1197, 1, 0, 0, 0, 1199, 1202, 1, 0, 0, 0, 1200, 1198, 1, 0, 0, 0, 1200, 1201, 1, 0, 0, 0, 1201, 1204, 1, 0, 0, 0, 1202, 1200, 1, 0, 0, 0, 1203, 1195, 1, 0, 0, 0, 1203, 1196, 1, 0, 0, 0, 1204, 1211, 1, 0, 0, 0, 1205, 1207, 5, 46, 0, 0, 1206, 1208, 7, 0, 0, 0, 1207, 1206, 1, 0, 0, 0, 1208, 1209, 1, 0, 0, 0, 1209, 1207, 1, 0, 0, 0, 1209, 1210, 1, 0, 0, 0, 1210, 1212, 1, 0, 0, 0, 1211, 1205, 1, 0, 0, 0, 1211, 1212, 1, 0, 0, 0, 1212, 1222, 1, 0, 0, 0, 1213, 1215, 7, 2, 0, 0, 1214, 1216, 7, 3, 0, 0, 1215, 1214, 1, 0, 0, 0, 1215, 1216, 1, 0, 0, 0, 1216, 1218, 1, 0, 0, 0, 1217, 1219, 7, 0, 0, 0, 1218, 1217, 1, 0, 0, 0, 1219, 1220, 1, 0, 0, 0, 1220, 1218, 1, 0, 0, 0, 1220, 1221, 1, 0, 0, 0, 1221, 1223, 1, 0, 0, 0, 1222, 1213, 1, 0, 0, 0, 1222, 1223, 1, 0, 0, 0, 1223, 258, 1, 0, 0, 0, 1224, 1228, 7, 4, 0, 0, 1225, 1227, 7, 5, 0, 0, 1226, 1225, 1, 0, 0, 0, 1227, 1230, 1, 0, 0, 0, 1228, 1226, 1, 0, 0, 0, 1228, 1229, 1, 0, 0, 0, 1229, 260, 1, 0, 0, 0, 1230, 1228, 1, 0, 0, 0, 1231, 1236, 5, 34, 0, 0, 1232, 1235, 3, 263, 131, 0, 1233, 1235, 8, 6, 0, 0, 1234, 1232, 1, 0, 0, 0, 1234, 1233, 1, 0, 0, 0, 1235, 1238, 1, 0, 0, 0, 1236, 1234, 1, 0, 0, 0, 1236, 1237, 1, 0, 0, 0, 1237, 1239, 1, 0, 0, 0, 1238, 1236, 1, 0, 0, 0, 1239, 1240, 5, 34, 0, 0, 1240, 262, 1, 0, 0, 0, 1241, 1249, 5, 92, 0, 0, 1242, 1250, 7, 7, 0, 0, 1243, 1244, 5, 117, 0, 0, 1244, 1245, 3, 265, 132, 0, 1245, 1246, 3, 265, 132, 0, 1246, 1247, 3, 265, 132, 0, 1247, 1248, 3, 265, 132, 0, 1248, 1250, 1, 0, 0, 0, 1249, 1242, 1, 0, 0, 0, 1249, 1243, 1, 0, 0, 0, 1250, 264, 1, 0, 0, 0, 1251, 1252, 7, 8, 0, 0, 1252, 266, 1, 0, 0, 0, 1253, 1254, 5, 47, 0, 0, 1254, 1255, 5, 47, 0, 0, 1255, 1259, 1, 0, 0, 0, 1256, 1258, 8, 9, 0, 0, 1257, 1256, 1, 0, 0, 0, 1258, 1261, 1, 0, 0, 0, 1259, 1257, 1, 0, 0, 0, 1259, 1260, 1, 0, 0, 0, 1260, 1262, 1, 0, 0, 0, 1261, 1259, 1, 0, 0, 0, 1262, 1263, 6, 133, 0, 0, 1263, 268, 1, 0, 0, 0, 1264, 1265, 5, 47, 0, 0, 1265, 1266, 5, 42, 0, 0, 1266, 1270, 1, 0, 0, 0, 1267, 1269, 9, 0, 0, 0, 1268, 1267, 1, 0, 0, 0, 1269, 1272, 1, 0, 0, 0, 1270, 1271, 1, 0, 0, 0, 1270, 1268, 1, 0, 0, 0, 1271, 1273, 1, 0, 0, 0, 1272, 1270, 1, 0, 0, 0, 1273, 1274, 5, 42, 0, 0, 1274, 1275, 5, 47, 0, 0, 1275, 1276, 1, 0, 0, 0, 1276, 1277, 6, 134, 0, 0, 1277, 270, 1, 0, 0, 0, 1278, 1280, 7, 10, 0, 0, 1279, 1278, 1, 0, 0, 0, 1280, 1281, 1, 0, 0, 0, 1281, 1279, 1, 0, 0, 0, 1281, 1282, 1, 0, 0, 0, 1282, 1283, 1, 0, 0, 0, 1283, 1284, 6, 135, 0, 0, 1284, 272, 1, 0, 0, 0, 18, 0, 1185, 1190, 1193, 1200, 1203, 1209, 1211, 1215, 1220, 1222, 1228, 1234, 1236, 1249, 1259, 1270, 1281, 1, 0, 1, 0] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapabilityLexer.tokens b/src/capability-language/generated/QuixosCapabilityLexer.tokens index c90ad75..81f78bd 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.tokens +++ b/src/capability-language/generated/QuixosCapabilityLexer.tokens @@ -3,257 +3,259 @@ RESULT_BYTES=2 RPC_CALLS=3 DEADLINE_MS=4 QUERY=5 -SPECIALIZE=6 -ROOT=7 -DOCUMENT=8 -FRAGMENTS=9 -VIEW=10 -MAX=11 -ALLOW=12 -POLL=13 -QUERYABLE=14 -RPC=15 -QUERY_REASON=16 -TYPE=17 -OBJECT=18 -STORABLE=19 -IMPLEMENTS=20 -REF=21 -FRAGMENT=22 -IMPORT=23 -EXTERNAL=24 -ATOM=25 -INTERFACE=26 -INTERFACES=27 -PACKAGE=28 -VALUE=29 -RELATION=30 -OPERATION=31 -FUNCTION=32 -CONSTRUCTOR=33 -CONSTRUCTS=34 -INPUT=35 -CONFORM=36 -AS=37 -BIND=38 -STATIC=39 -TO=40 -PRIVATE=41 -SHARED=42 -STATE=43 -EDGE=44 -PROJECTION=45 -WITH=46 -USING=47 -VIA=48 -MATERIALIZE=49 -IF=50 -ABSENT=51 -ON=52 -POLICY=53 -DEFAULT=54 -SOURCE=55 -REPOSITORY=56 -COMMIT=57 -REVISION=58 -SEMANTIC_MAJOR=59 -ON_DELETE=60 -RETAIN_OTHER=61 -KEYED=62 -PUBLIC_TRAVERSAL=63 -ID=64 -DOC=65 -MODE=66 -EMITS=67 -RECEIVER=68 -REQUIRES=69 -ANY=70 -GET=71 -SET=72 -WATCH=73 -START=74 -STOP=75 -READ=76 -WRITE=77 -RESOLVE=78 -CONNECT=79 -DISCONNECT=80 -CALL=81 -WATCH_START=82 -WATCH_STOP=83 -SUBSCRIBE=84 -UNSUBSCRIBE=85 -OPTIMISTIC_REGISTER=86 -CRDT=87 -OPTIONAL_ONE=88 -EXACTLY_ONE=89 -MANY_UNIQUE=90 -MANY=91 -ORDERED=92 -UNIT=93 -WATCH_HANDLE=94 -MESSAGE=95 -ATOM_REF=96 -INTERFACE_REF=97 -OPTIONAL=98 -LIST=99 -RECORD=100 -BOOL=101 -BYTES=102 -DOUBLE=103 -INT32=104 -INT64=105 -STRING=106 -UINT32=107 -UINT64=108 -TRUE=109 -FALSE=110 -NULL=111 -ARROW=112 -COLON=113 -SEMI=114 -COMMA=115 -DOT=116 -LBRACE=117 -RBRACE=118 -LBRACK=119 -RBRACK=120 -LPAREN=121 -RPAREN=122 -LT=123 -GT=124 -AMP=125 -EQUAL=126 -INTEGER=127 -JSON_NUMBER=128 -IDENTIFIER=129 -STRING_LITERAL=130 -LINE_COMMENT=131 -BLOCK_COMMENT=132 -WS=133 +REFLECTION=6 +SPECIALIZE=7 +ROOT=8 +DOCUMENT=9 +FRAGMENTS=10 +VIEW=11 +MAX=12 +ALLOW=13 +POLL=14 +QUERYABLE=15 +RPC=16 +QUERY_REASON=17 +TYPE=18 +OBJECT=19 +STORABLE=20 +IMPLEMENTS=21 +REF=22 +FRAGMENT=23 +IMPORT=24 +EXTERNAL=25 +ATOM=26 +INTERFACE=27 +INTERFACES=28 +PACKAGE=29 +VALUE=30 +RELATION=31 +OPERATION=32 +FUNCTION=33 +CONSTRUCTOR=34 +CONSTRUCTS=35 +INPUT=36 +CONFORM=37 +AS=38 +BIND=39 +STATIC=40 +TO=41 +PRIVATE=42 +SHARED=43 +STATE=44 +EDGE=45 +PROJECTION=46 +WITH=47 +USING=48 +VIA=49 +MATERIALIZE=50 +IF=51 +ABSENT=52 +ON=53 +POLICY=54 +DEFAULT=55 +SOURCE=56 +REPOSITORY=57 +COMMIT=58 +REVISION=59 +SEMANTIC_MAJOR=60 +ON_DELETE=61 +RETAIN_OTHER=62 +KEYED=63 +PUBLIC_TRAVERSAL=64 +ID=65 +DOC=66 +MODE=67 +EMITS=68 +RECEIVER=69 +REQUIRES=70 +ANY=71 +GET=72 +SET=73 +WATCH=74 +START=75 +STOP=76 +READ=77 +WRITE=78 +RESOLVE=79 +CONNECT=80 +DISCONNECT=81 +CALL=82 +WATCH_START=83 +WATCH_STOP=84 +SUBSCRIBE=85 +UNSUBSCRIBE=86 +OPTIMISTIC_REGISTER=87 +CRDT=88 +OPTIONAL_ONE=89 +EXACTLY_ONE=90 +MANY_UNIQUE=91 +MANY=92 +ORDERED=93 +UNIT=94 +WATCH_HANDLE=95 +MESSAGE=96 +ATOM_REF=97 +INTERFACE_REF=98 +OPTIONAL=99 +LIST=100 +RECORD=101 +BOOL=102 +BYTES=103 +DOUBLE=104 +INT32=105 +INT64=106 +STRING=107 +UINT32=108 +UINT64=109 +TRUE=110 +FALSE=111 +NULL=112 +ARROW=113 +COLON=114 +SEMI=115 +COMMA=116 +DOT=117 +LBRACE=118 +RBRACE=119 +LBRACK=120 +RBRACK=121 +LPAREN=122 +RPAREN=123 +LT=124 +GT=125 +AMP=126 +EQUAL=127 +INTEGER=128 +JSON_NUMBER=129 +IDENTIFIER=130 +STRING_LITERAL=131 +LINE_COMMENT=132 +BLOCK_COMMENT=133 +WS=134 'workspace'=1 'result-bytes'=2 'rpc-calls'=3 'deadline-ms'=4 'query'=5 -'specialize'=6 -'root'=7 -'document'=8 -'fragments'=9 -'view'=10 -'max'=11 -'allow'=12 -'poll'=13 -'queryable'=14 -'rpc'=15 -'query-reason'=16 -'type'=17 -'object'=18 -'storable'=19 -'implements'=20 -'ref'=21 -'fragment'=22 -'import'=23 -'external'=24 -'atom'=25 -'interface'=26 -'interfaces'=27 -'package'=28 -'value'=29 -'relation'=30 -'operation'=31 -'function'=32 -'constructor'=33 -'constructs'=34 -'input'=35 -'conform'=36 -'as'=37 -'bind'=38 -'static'=39 -'to'=40 -'private'=41 -'shared'=42 -'state'=43 -'edge'=44 -'projection'=45 -'with'=46 -'using'=47 -'via'=48 -'materialize'=49 -'if'=50 -'absent'=51 -'on'=52 -'policy'=53 -'default'=54 -'source'=55 -'repository'=56 -'commit'=57 -'revision'=58 -'semantic-major'=59 -'on-delete'=60 -'retain-other'=61 -'keyed'=62 -'public-traversal'=63 -'id'=64 -'doc'=65 -'mode'=66 -'emits'=67 -'receiver'=68 -'requires'=69 -'any'=70 -'get'=71 -'set'=72 -'watch'=73 -'start'=74 -'stop'=75 -'read'=76 -'write'=77 -'resolve'=78 -'connect'=79 -'disconnect'=80 -'call'=81 -'watch-start'=82 -'watch-stop'=83 -'subscribe'=84 -'unsubscribe'=85 -'optimistic-register'=86 -'crdt'=87 -'optional-one'=88 -'exactly-one'=89 -'many-unique'=90 -'many'=91 -'ordered'=92 -'unit'=93 -'watch-handle'=94 -'message'=95 -'atom-ref'=96 -'interface-ref'=97 -'optional'=98 -'list'=99 -'record'=100 -'bool'=101 -'bytes'=102 -'double'=103 -'int32'=104 -'int64'=105 -'string'=106 -'uint32'=107 -'uint64'=108 -'true'=109 -'false'=110 -'null'=111 -'->'=112 -':'=113 -';'=114 -','=115 -'.'=116 -'{'=117 -'}'=118 -'['=119 -']'=120 -'('=121 -')'=122 -'<'=123 -'>'=124 -'&'=125 -'='=126 +'reflection'=6 +'specialize'=7 +'root'=8 +'document'=9 +'fragments'=10 +'view'=11 +'max'=12 +'allow'=13 +'poll'=14 +'queryable'=15 +'rpc'=16 +'query-reason'=17 +'type'=18 +'object'=19 +'storable'=20 +'implements'=21 +'ref'=22 +'fragment'=23 +'import'=24 +'external'=25 +'atom'=26 +'interface'=27 +'interfaces'=28 +'package'=29 +'value'=30 +'relation'=31 +'operation'=32 +'function'=33 +'constructor'=34 +'constructs'=35 +'input'=36 +'conform'=37 +'as'=38 +'bind'=39 +'static'=40 +'to'=41 +'private'=42 +'shared'=43 +'state'=44 +'edge'=45 +'projection'=46 +'with'=47 +'using'=48 +'via'=49 +'materialize'=50 +'if'=51 +'absent'=52 +'on'=53 +'policy'=54 +'default'=55 +'source'=56 +'repository'=57 +'commit'=58 +'revision'=59 +'semantic-major'=60 +'on-delete'=61 +'retain-other'=62 +'keyed'=63 +'public-traversal'=64 +'id'=65 +'doc'=66 +'mode'=67 +'emits'=68 +'receiver'=69 +'requires'=70 +'any'=71 +'get'=72 +'set'=73 +'watch'=74 +'start'=75 +'stop'=76 +'read'=77 +'write'=78 +'resolve'=79 +'connect'=80 +'disconnect'=81 +'call'=82 +'watch-start'=83 +'watch-stop'=84 +'subscribe'=85 +'unsubscribe'=86 +'optimistic-register'=87 +'crdt'=88 +'optional-one'=89 +'exactly-one'=90 +'many-unique'=91 +'many'=92 +'ordered'=93 +'unit'=94 +'watch-handle'=95 +'message'=96 +'atom-ref'=97 +'interface-ref'=98 +'optional'=99 +'list'=100 +'record'=101 +'bool'=102 +'bytes'=103 +'double'=104 +'int32'=105 +'int64'=106 +'string'=107 +'uint32'=108 +'uint64'=109 +'true'=110 +'false'=111 +'null'=112 +'->'=113 +':'=114 +';'=115 +','=116 +'.'=117 +'{'=118 +'}'=119 +'['=120 +']'=121 +'('=122 +')'=123 +'<'=124 +'>'=125 +'&'=126 +'='=127 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.ts b/src/capability-language/generated/QuixosCapabilityLexer.ts index 5d20b6a..aaa0248 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.ts +++ b/src/capability-language/generated/QuixosCapabilityLexer.ts @@ -9,134 +9,135 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public static readonly RPC_CALLS = 3; public static readonly DEADLINE_MS = 4; public static readonly QUERY = 5; - public static readonly SPECIALIZE = 6; - public static readonly ROOT = 7; - public static readonly DOCUMENT = 8; - public static readonly FRAGMENTS = 9; - public static readonly VIEW = 10; - public static readonly MAX = 11; - public static readonly ALLOW = 12; - public static readonly POLL = 13; - public static readonly QUERYABLE = 14; - public static readonly RPC = 15; - public static readonly QUERY_REASON = 16; - public static readonly TYPE = 17; - public static readonly OBJECT = 18; - public static readonly STORABLE = 19; - public static readonly IMPLEMENTS = 20; - public static readonly REF = 21; - public static readonly FRAGMENT = 22; - public static readonly IMPORT = 23; - public static readonly EXTERNAL = 24; - public static readonly ATOM = 25; - public static readonly INTERFACE = 26; - public static readonly INTERFACES = 27; - public static readonly PACKAGE = 28; - public static readonly VALUE = 29; - public static readonly RELATION = 30; - public static readonly OPERATION = 31; - public static readonly FUNCTION = 32; - public static readonly CONSTRUCTOR = 33; - public static readonly CONSTRUCTS = 34; - public static readonly INPUT = 35; - public static readonly CONFORM = 36; - public static readonly AS = 37; - public static readonly BIND = 38; - public static readonly STATIC = 39; - public static readonly TO = 40; - public static readonly PRIVATE = 41; - public static readonly SHARED = 42; - public static readonly STATE = 43; - public static readonly EDGE = 44; - public static readonly PROJECTION = 45; - public static readonly WITH = 46; - public static readonly USING = 47; - public static readonly VIA = 48; - public static readonly MATERIALIZE = 49; - public static readonly IF = 50; - public static readonly ABSENT = 51; - public static readonly ON = 52; - public static readonly POLICY = 53; - public static readonly DEFAULT = 54; - public static readonly SOURCE = 55; - public static readonly REPOSITORY = 56; - public static readonly COMMIT = 57; - public static readonly REVISION = 58; - public static readonly SEMANTIC_MAJOR = 59; - public static readonly ON_DELETE = 60; - public static readonly RETAIN_OTHER = 61; - public static readonly KEYED = 62; - public static readonly PUBLIC_TRAVERSAL = 63; - public static readonly ID = 64; - public static readonly DOC = 65; - public static readonly MODE = 66; - public static readonly EMITS = 67; - public static readonly RECEIVER = 68; - public static readonly REQUIRES = 69; - public static readonly ANY = 70; - public static readonly GET = 71; - public static readonly SET = 72; - public static readonly WATCH = 73; - public static readonly START = 74; - public static readonly STOP = 75; - public static readonly READ = 76; - public static readonly WRITE = 77; - public static readonly RESOLVE = 78; - public static readonly CONNECT = 79; - public static readonly DISCONNECT = 80; - public static readonly CALL = 81; - public static readonly WATCH_START = 82; - public static readonly WATCH_STOP = 83; - public static readonly SUBSCRIBE = 84; - public static readonly UNSUBSCRIBE = 85; - public static readonly OPTIMISTIC_REGISTER = 86; - public static readonly CRDT = 87; - public static readonly OPTIONAL_ONE = 88; - public static readonly EXACTLY_ONE = 89; - public static readonly MANY_UNIQUE = 90; - public static readonly MANY = 91; - public static readonly ORDERED = 92; - public static readonly UNIT = 93; - public static readonly WATCH_HANDLE = 94; - public static readonly MESSAGE = 95; - public static readonly ATOM_REF = 96; - public static readonly INTERFACE_REF = 97; - public static readonly OPTIONAL = 98; - public static readonly LIST = 99; - public static readonly RECORD = 100; - public static readonly BOOL = 101; - public static readonly BYTES = 102; - public static readonly DOUBLE = 103; - public static readonly INT32 = 104; - public static readonly INT64 = 105; - public static readonly STRING = 106; - public static readonly UINT32 = 107; - public static readonly UINT64 = 108; - public static readonly TRUE = 109; - public static readonly FALSE = 110; - public static readonly NULL = 111; - public static readonly ARROW = 112; - public static readonly COLON = 113; - public static readonly SEMI = 114; - public static readonly COMMA = 115; - public static readonly DOT = 116; - public static readonly LBRACE = 117; - public static readonly RBRACE = 118; - public static readonly LBRACK = 119; - public static readonly RBRACK = 120; - public static readonly LPAREN = 121; - public static readonly RPAREN = 122; - public static readonly LT = 123; - public static readonly GT = 124; - public static readonly AMP = 125; - public static readonly EQUAL = 126; - public static readonly INTEGER = 127; - public static readonly JSON_NUMBER = 128; - public static readonly IDENTIFIER = 129; - public static readonly STRING_LITERAL = 130; - public static readonly LINE_COMMENT = 131; - public static readonly BLOCK_COMMENT = 132; - public static readonly WS = 133; + public static readonly REFLECTION = 6; + public static readonly SPECIALIZE = 7; + public static readonly ROOT = 8; + public static readonly DOCUMENT = 9; + public static readonly FRAGMENTS = 10; + public static readonly VIEW = 11; + public static readonly MAX = 12; + public static readonly ALLOW = 13; + public static readonly POLL = 14; + public static readonly QUERYABLE = 15; + public static readonly RPC = 16; + public static readonly QUERY_REASON = 17; + public static readonly TYPE = 18; + public static readonly OBJECT = 19; + public static readonly STORABLE = 20; + public static readonly IMPLEMENTS = 21; + public static readonly REF = 22; + public static readonly FRAGMENT = 23; + public static readonly IMPORT = 24; + public static readonly EXTERNAL = 25; + public static readonly ATOM = 26; + public static readonly INTERFACE = 27; + public static readonly INTERFACES = 28; + public static readonly PACKAGE = 29; + public static readonly VALUE = 30; + public static readonly RELATION = 31; + public static readonly OPERATION = 32; + public static readonly FUNCTION = 33; + public static readonly CONSTRUCTOR = 34; + public static readonly CONSTRUCTS = 35; + public static readonly INPUT = 36; + public static readonly CONFORM = 37; + public static readonly AS = 38; + public static readonly BIND = 39; + public static readonly STATIC = 40; + public static readonly TO = 41; + public static readonly PRIVATE = 42; + public static readonly SHARED = 43; + public static readonly STATE = 44; + public static readonly EDGE = 45; + public static readonly PROJECTION = 46; + public static readonly WITH = 47; + public static readonly USING = 48; + public static readonly VIA = 49; + public static readonly MATERIALIZE = 50; + public static readonly IF = 51; + public static readonly ABSENT = 52; + public static readonly ON = 53; + public static readonly POLICY = 54; + public static readonly DEFAULT = 55; + public static readonly SOURCE = 56; + public static readonly REPOSITORY = 57; + public static readonly COMMIT = 58; + public static readonly REVISION = 59; + public static readonly SEMANTIC_MAJOR = 60; + public static readonly ON_DELETE = 61; + public static readonly RETAIN_OTHER = 62; + public static readonly KEYED = 63; + public static readonly PUBLIC_TRAVERSAL = 64; + public static readonly ID = 65; + public static readonly DOC = 66; + public static readonly MODE = 67; + public static readonly EMITS = 68; + public static readonly RECEIVER = 69; + public static readonly REQUIRES = 70; + public static readonly ANY = 71; + public static readonly GET = 72; + public static readonly SET = 73; + public static readonly WATCH = 74; + public static readonly START = 75; + public static readonly STOP = 76; + public static readonly READ = 77; + public static readonly WRITE = 78; + public static readonly RESOLVE = 79; + public static readonly CONNECT = 80; + public static readonly DISCONNECT = 81; + public static readonly CALL = 82; + public static readonly WATCH_START = 83; + public static readonly WATCH_STOP = 84; + public static readonly SUBSCRIBE = 85; + public static readonly UNSUBSCRIBE = 86; + public static readonly OPTIMISTIC_REGISTER = 87; + public static readonly CRDT = 88; + public static readonly OPTIONAL_ONE = 89; + public static readonly EXACTLY_ONE = 90; + public static readonly MANY_UNIQUE = 91; + public static readonly MANY = 92; + public static readonly ORDERED = 93; + public static readonly UNIT = 94; + public static readonly WATCH_HANDLE = 95; + public static readonly MESSAGE = 96; + public static readonly ATOM_REF = 97; + public static readonly INTERFACE_REF = 98; + public static readonly OPTIONAL = 99; + public static readonly LIST = 100; + public static readonly RECORD = 101; + public static readonly BOOL = 102; + public static readonly BYTES = 103; + public static readonly DOUBLE = 104; + public static readonly INT32 = 105; + public static readonly INT64 = 106; + public static readonly STRING = 107; + public static readonly UINT32 = 108; + public static readonly UINT64 = 109; + public static readonly TRUE = 110; + public static readonly FALSE = 111; + public static readonly NULL = 112; + public static readonly ARROW = 113; + public static readonly COLON = 114; + public static readonly SEMI = 115; + public static readonly COMMA = 116; + public static readonly DOT = 117; + public static readonly LBRACE = 118; + public static readonly RBRACE = 119; + public static readonly LBRACK = 120; + public static readonly RBRACK = 121; + public static readonly LPAREN = 122; + public static readonly RPAREN = 123; + public static readonly LT = 124; + public static readonly GT = 125; + public static readonly AMP = 126; + public static readonly EQUAL = 127; + public static readonly INTEGER = 128; + public static readonly JSON_NUMBER = 129; + public static readonly IDENTIFIER = 130; + public static readonly STRING_LITERAL = 131; + public static readonly LINE_COMMENT = 132; + public static readonly BLOCK_COMMENT = 133; + public static readonly WS = 134; public static readonly channelNames = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" @@ -144,9 +145,9 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public static readonly literalNames = [ null, "'workspace'", "'result-bytes'", "'rpc-calls'", "'deadline-ms'", - "'query'", "'specialize'", "'root'", "'document'", "'fragments'", - "'view'", "'max'", "'allow'", "'poll'", "'queryable'", "'rpc'", - "'query-reason'", "'type'", "'object'", "'storable'", "'implements'", + "'query'", "'reflection'", "'specialize'", "'root'", "'document'", + "'fragments'", "'view'", "'max'", "'allow'", "'poll'", "'queryable'", + "'rpc'", "'query-reason'", "'type'", "'object'", "'storable'", "'implements'", "'ref'", "'fragment'", "'import'", "'external'", "'atom'", "'interface'", "'interfaces'", "'package'", "'value'", "'relation'", "'operation'", "'function'", "'constructor'", "'constructs'", "'input'", "'conform'", @@ -169,26 +170,27 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public static readonly symbolicNames = [ null, "WORKSPACE", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", - "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", "MAX", "ALLOW", - "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", "OBJECT", "STORABLE", - "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", - "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", - "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", - "TO", "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", - "USING", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", - "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", - "ON_DELETE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", - "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", - "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", - "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", - "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", - "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", - "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", "BOOL", - "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", - "TRUE", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", - "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", - "GT", "AMP", "EQUAL", "INTEGER", "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", - "LINE_COMMENT", "BLOCK_COMMENT", "WS" + "REFLECTION", "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", + "MAX", "ALLOW", "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", + "OBJECT", "STORABLE", "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", + "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", + "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", + "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", "PRIVATE", "SHARED", + "STATE", "EDGE", "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", + "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", + "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", "RETAIN_OTHER", + "KEYED", "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", "EMITS", "RECEIVER", + "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", + "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", + "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", + "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", + "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", + "OPTIONAL", "LIST", "RECORD", "BOOL", "BYTES", "DOUBLE", "INT32", + "INT64", "STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", + "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", + "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "AMP", "EQUAL", "INTEGER", + "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", + "WS" ]; public static readonly modeNames = [ @@ -197,26 +199,27 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public static readonly ruleNames = [ "WORKSPACE", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", - "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", "MAX", "ALLOW", - "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", "OBJECT", "STORABLE", - "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", - "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", - "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", - "TO", "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", - "USING", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", - "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", - "ON_DELETE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", - "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", - "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", - "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", - "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", - "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", - "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", "BOOL", - "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", - "TRUE", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", - "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", - "GT", "AMP", "EQUAL", "INTEGER", "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", - "ESC", "HEX", "LINE_COMMENT", "BLOCK_COMMENT", "WS", + "REFLECTION", "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", + "MAX", "ALLOW", "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", + "OBJECT", "STORABLE", "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", + "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", + "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", + "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", "PRIVATE", "SHARED", + "STATE", "EDGE", "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", + "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", + "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", "RETAIN_OTHER", + "KEYED", "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", "EMITS", "RECEIVER", + "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", + "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", + "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", + "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", + "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", + "OPTIONAL", "LIST", "RECORD", "BOOL", "BYTES", "DOUBLE", "INT32", + "INT64", "STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", + "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", + "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "AMP", "EQUAL", "INTEGER", + "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "ESC", "HEX", "LINE_COMMENT", + "BLOCK_COMMENT", "WS", ]; @@ -238,7 +241,7 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public get modeNames(): string[] { return QuixosCapabilityLexer.modeNames; } public static readonly _serializedATN: number[] = [ - 4,0,133,1272,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, + 4,0,134,1285,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, @@ -259,88 +262,89 @@ export class QuixosCapabilityLexer extends antlr.Lexer { 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,1,0,1,0,1,0,1,0, - 1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3, - 1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,5, - 1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,7, - 1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8, - 1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1,11,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,13,1,13,1,13,1,13,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,15,1,15,1,15,1,15,1,15,1,16,1,16,1,16,1,16,1, - 16,1,17,1,17,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,18,1,19,1,19,1,19,1,19,1,19,1,19,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,21,1,21,1, - 21,1,21,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,25,1,25,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,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,29,1,30,1,30,1,30,1,30,1,30,1,30,1,30,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,32,1,32,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,33,1,33,1, - 33,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,1,34,1,35,1,35,1, - 35,1,35,1,35,1,35,1,35,1,35,1,36,1,36,1,36,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,40,1,40,1, - 40,1,40,1,40,1,40,1,40,1,40,1,41,1,41,1,41,1,41,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,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,45,1,45,1,45,1,45,1, - 45,1,46,1,46,1,46,1,46,1,46,1,46,1,47,1,47,1,47,1,47,1,48,1,48,1, - 48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1, - 50,1,50,1,50,1,50,1,50,1,50,1,50,1,51,1,51,1,51,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,53,1,53,1,53,1,54,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, - 55,1,55,1,55,1,55,1,56,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,57,1,57,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,59,1,59,1,59,1,59,1, - 59,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60,1,60,1,60,1,60,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,62,1, - 62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1, - 62,1,62,1,62,1,63,1,63,1,63,1,64,1,64,1,64,1,64,1,65,1,65,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,67,1,67,1,67,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,70,1,70,1,70,1,70,1,71,1,71,1,71,1,71,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,75,1,75,1,75,1,75,1,75,1,76,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,77,1,78,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,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,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,82,1,83,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,84,1,84,1, - 85,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1, - 85,1,85,1,85,1,85,1,85,1,85,1,85,1,86,1,86,1,86,1,86,1,86,1,87,1, - 87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,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,88,1,88,1,89,1,89,1, - 89,1,89,1,89,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,91,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,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,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,95,1,95,1,95,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,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, - 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,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,102,1,103,1,103, - 1,103,1,103,1,103,1,103,1,104,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,106,1,106,1,106,1,106,1,106, - 1,106,1,106,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,108,1,108, - 1,108,1,108,1,108,1,109,1,109,1,109,1,109,1,109,1,109,1,110,1,110, - 1,110,1,110,1,110,1,111,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,3,126,1173,8,126,1,126,4,126,1176,8,126,11,126,12,126, - 1177,1,127,3,127,1181,8,127,1,127,1,127,1,127,5,127,1186,8,127,10, - 127,12,127,1189,9,127,3,127,1191,8,127,1,127,1,127,4,127,1195,8, - 127,11,127,12,127,1196,3,127,1199,8,127,1,127,1,127,3,127,1203,8, - 127,1,127,4,127,1206,8,127,11,127,12,127,1207,3,127,1210,8,127,1, - 128,1,128,5,128,1214,8,128,10,128,12,128,1217,9,128,1,129,1,129, - 1,129,5,129,1222,8,129,10,129,12,129,1225,9,129,1,129,1,129,1,130, - 1,130,1,130,1,130,1,130,1,130,1,130,1,130,3,130,1237,8,130,1,131, - 1,131,1,132,1,132,1,132,1,132,5,132,1245,8,132,10,132,12,132,1248, - 9,132,1,132,1,132,1,133,1,133,1,133,1,133,5,133,1256,8,133,10,133, - 12,133,1259,9,133,1,133,1,133,1,133,1,133,1,133,1,134,4,134,1267, - 8,134,11,134,12,134,1268,1,134,1,134,1,1257,0,135,1,1,3,2,5,3,7, + 2,131,7,131,2,132,7,132,2,133,7,133,2,134,7,134,2,135,7,135,1,0, + 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, + 1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4, + 1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6, + 1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,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,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9, + 1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12, + 1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14, + 1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,16,1,16,1,16,1,16,1,16, + 1,16,1,16,1,16,1,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,19,1,19,1,19,1,19,1,19,1,19, + 1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20, + 1,20,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,23,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24, + 1,24,1,24,1,24,1,24,1,25,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,26,1,26,1,27,1,27,1,27,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,28,1,28,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,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,32,1,32,1,32,1,32,1,32,1,33,1,33,1,33,1,33,1,33,1,33, + 1,33,1,33,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,1,34,1,34, + 1,34,1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,35,1,35,1,36,1,36,1,36, + 1,36,1,36,1,36,1,36,1,36,1,37,1,37,1,37,1,38,1,38,1,38,1,38,1,38, + 1,39,1,39,1,39,1,39,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,41,1,41,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,43, + 1,43,1,43,1,43,1,43,1,43,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,45,1,45,1,46,1,46,1,46,1,46,1,46, + 1,47,1,47,1,47,1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,49,1,49,1,49, + 1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,50,1,50,1,50,1,51, + 1,51,1,51,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,1,53,1,54,1,54,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,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,58,1,58,1,58,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,60,1,60,1,60,1,60,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,61, + 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,63,1,63,1,63,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,65,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,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,71,1,71,1,71,1,71,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,75,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,78,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,79,1,80,1,80,1,80,1,80,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,82,1,82,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,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,85,1,85,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,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,87,1,87,1,88,1,88, + 1,88,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,89,1,89,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,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,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,94,1,94,1,94, + 1,94,1,95,1,95,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,96,1,96,1,96,1,97,1,97,1,97,1,97,1,97,1,97,1,97,1,97, + 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,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,100,1,100,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,104,1,105,1,105,1,105,1,105,1,105,1,105,1,106, + 1,106,1,106,1,106,1,106,1,106,1,106,1,107,1,107,1,107,1,107,1,107, + 1,107,1,107,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,109,1,109, + 1,109,1,109,1,109,1,110,1,110,1,110,1,110,1,110,1,110,1,111,1,111, + 1,111,1,111,1,111,1,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,3,127,1186,8,127,1,127,4,127,1189,8,127,11,127,12,127, + 1190,1,128,3,128,1194,8,128,1,128,1,128,1,128,5,128,1199,8,128,10, + 128,12,128,1202,9,128,3,128,1204,8,128,1,128,1,128,4,128,1208,8, + 128,11,128,12,128,1209,3,128,1212,8,128,1,128,1,128,3,128,1216,8, + 128,1,128,4,128,1219,8,128,11,128,12,128,1220,3,128,1223,8,128,1, + 129,1,129,5,129,1227,8,129,10,129,12,129,1230,9,129,1,130,1,130, + 1,130,5,130,1235,8,130,10,130,12,130,1238,9,130,1,130,1,130,1,131, + 1,131,1,131,1,131,1,131,1,131,1,131,1,131,3,131,1250,8,131,1,132, + 1,132,1,133,1,133,1,133,1,133,5,133,1258,8,133,10,133,12,133,1261, + 9,133,1,133,1,133,1,134,1,134,1,134,1,134,5,134,1269,8,134,10,134, + 12,134,1272,9,134,1,134,1,134,1,134,1,134,1,134,1,135,4,135,1280, + 8,135,11,135,12,135,1281,1,135,1,135,1,1270,0,136,1,1,3,2,5,3,7, 4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13,27,14,29,15,31, 16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,47,24,49,25,51,26,53, 27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,69,35,71,36,73,37,75, @@ -354,353 +358,357 @@ export class QuixosCapabilityLexer extends antlr.Lexer { 105,211,106,213,107,215,108,217,109,219,110,221,111,223,112,225, 113,227,114,229,115,231,116,233,117,235,118,237,119,239,120,241, 121,243,122,245,123,247,124,249,125,251,126,253,127,255,128,257, - 129,259,130,261,0,263,0,265,131,267,132,269,133,1,0,11,1,0,48,57, - 1,0,49,57,2,0,69,69,101,101,2,0,43,43,45,45,3,0,65,90,95,95,97,122, - 4,0,48,57,65,90,95,95,97,122,4,0,10,10,13,13,34,34,92,92,8,0,34, - 34,47,47,92,92,98,98,102,102,110,110,114,114,116,116,3,0,48,57,65, - 70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32,32,1286,0,1,1,0,0,0, - 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,229,1,0,0,0,0,231,1,0, - 0,0,0,233,1,0,0,0,0,235,1,0,0,0,0,237,1,0,0,0,0,239,1,0,0,0,0,241, - 1,0,0,0,0,243,1,0,0,0,0,245,1,0,0,0,0,247,1,0,0,0,0,249,1,0,0,0, - 0,251,1,0,0,0,0,253,1,0,0,0,0,255,1,0,0,0,0,257,1,0,0,0,0,259,1, - 0,0,0,0,265,1,0,0,0,0,267,1,0,0,0,0,269,1,0,0,0,1,271,1,0,0,0,3, - 281,1,0,0,0,5,294,1,0,0,0,7,304,1,0,0,0,9,316,1,0,0,0,11,322,1,0, - 0,0,13,333,1,0,0,0,15,338,1,0,0,0,17,347,1,0,0,0,19,357,1,0,0,0, - 21,362,1,0,0,0,23,366,1,0,0,0,25,372,1,0,0,0,27,377,1,0,0,0,29,387, - 1,0,0,0,31,391,1,0,0,0,33,404,1,0,0,0,35,409,1,0,0,0,37,416,1,0, - 0,0,39,425,1,0,0,0,41,436,1,0,0,0,43,440,1,0,0,0,45,449,1,0,0,0, - 47,456,1,0,0,0,49,465,1,0,0,0,51,470,1,0,0,0,53,480,1,0,0,0,55,491, - 1,0,0,0,57,499,1,0,0,0,59,505,1,0,0,0,61,514,1,0,0,0,63,524,1,0, - 0,0,65,533,1,0,0,0,67,545,1,0,0,0,69,556,1,0,0,0,71,562,1,0,0,0, - 73,570,1,0,0,0,75,573,1,0,0,0,77,578,1,0,0,0,79,585,1,0,0,0,81,588, - 1,0,0,0,83,596,1,0,0,0,85,603,1,0,0,0,87,609,1,0,0,0,89,614,1,0, - 0,0,91,625,1,0,0,0,93,630,1,0,0,0,95,636,1,0,0,0,97,640,1,0,0,0, - 99,652,1,0,0,0,101,655,1,0,0,0,103,662,1,0,0,0,105,665,1,0,0,0,107, - 672,1,0,0,0,109,680,1,0,0,0,111,687,1,0,0,0,113,698,1,0,0,0,115, - 705,1,0,0,0,117,714,1,0,0,0,119,729,1,0,0,0,121,739,1,0,0,0,123, - 752,1,0,0,0,125,758,1,0,0,0,127,775,1,0,0,0,129,778,1,0,0,0,131, - 782,1,0,0,0,133,787,1,0,0,0,135,793,1,0,0,0,137,802,1,0,0,0,139, - 811,1,0,0,0,141,815,1,0,0,0,143,819,1,0,0,0,145,823,1,0,0,0,147, - 829,1,0,0,0,149,835,1,0,0,0,151,840,1,0,0,0,153,845,1,0,0,0,155, - 851,1,0,0,0,157,859,1,0,0,0,159,867,1,0,0,0,161,878,1,0,0,0,163, - 883,1,0,0,0,165,895,1,0,0,0,167,906,1,0,0,0,169,916,1,0,0,0,171, - 928,1,0,0,0,173,948,1,0,0,0,175,953,1,0,0,0,177,966,1,0,0,0,179, - 978,1,0,0,0,181,990,1,0,0,0,183,995,1,0,0,0,185,1003,1,0,0,0,187, - 1008,1,0,0,0,189,1021,1,0,0,0,191,1029,1,0,0,0,193,1038,1,0,0,0, - 195,1052,1,0,0,0,197,1061,1,0,0,0,199,1066,1,0,0,0,201,1073,1,0, - 0,0,203,1078,1,0,0,0,205,1084,1,0,0,0,207,1091,1,0,0,0,209,1097, - 1,0,0,0,211,1103,1,0,0,0,213,1110,1,0,0,0,215,1117,1,0,0,0,217,1124, - 1,0,0,0,219,1129,1,0,0,0,221,1135,1,0,0,0,223,1140,1,0,0,0,225,1143, - 1,0,0,0,227,1145,1,0,0,0,229,1147,1,0,0,0,231,1149,1,0,0,0,233,1151, - 1,0,0,0,235,1153,1,0,0,0,237,1155,1,0,0,0,239,1157,1,0,0,0,241,1159, - 1,0,0,0,243,1161,1,0,0,0,245,1163,1,0,0,0,247,1165,1,0,0,0,249,1167, - 1,0,0,0,251,1169,1,0,0,0,253,1172,1,0,0,0,255,1180,1,0,0,0,257,1211, - 1,0,0,0,259,1218,1,0,0,0,261,1228,1,0,0,0,263,1238,1,0,0,0,265,1240, - 1,0,0,0,267,1251,1,0,0,0,269,1266,1,0,0,0,271,272,5,119,0,0,272, - 273,5,111,0,0,273,274,5,114,0,0,274,275,5,107,0,0,275,276,5,115, - 0,0,276,277,5,112,0,0,277,278,5,97,0,0,278,279,5,99,0,0,279,280, - 5,101,0,0,280,2,1,0,0,0,281,282,5,114,0,0,282,283,5,101,0,0,283, - 284,5,115,0,0,284,285,5,117,0,0,285,286,5,108,0,0,286,287,5,116, - 0,0,287,288,5,45,0,0,288,289,5,98,0,0,289,290,5,121,0,0,290,291, - 5,116,0,0,291,292,5,101,0,0,292,293,5,115,0,0,293,4,1,0,0,0,294, - 295,5,114,0,0,295,296,5,112,0,0,296,297,5,99,0,0,297,298,5,45,0, - 0,298,299,5,99,0,0,299,300,5,97,0,0,300,301,5,108,0,0,301,302,5, - 108,0,0,302,303,5,115,0,0,303,6,1,0,0,0,304,305,5,100,0,0,305,306, - 5,101,0,0,306,307,5,97,0,0,307,308,5,100,0,0,308,309,5,108,0,0,309, - 310,5,105,0,0,310,311,5,110,0,0,311,312,5,101,0,0,312,313,5,45,0, - 0,313,314,5,109,0,0,314,315,5,115,0,0,315,8,1,0,0,0,316,317,5,113, - 0,0,317,318,5,117,0,0,318,319,5,101,0,0,319,320,5,114,0,0,320,321, - 5,121,0,0,321,10,1,0,0,0,322,323,5,115,0,0,323,324,5,112,0,0,324, - 325,5,101,0,0,325,326,5,99,0,0,326,327,5,105,0,0,327,328,5,97,0, - 0,328,329,5,108,0,0,329,330,5,105,0,0,330,331,5,122,0,0,331,332, - 5,101,0,0,332,12,1,0,0,0,333,334,5,114,0,0,334,335,5,111,0,0,335, - 336,5,111,0,0,336,337,5,116,0,0,337,14,1,0,0,0,338,339,5,100,0,0, - 339,340,5,111,0,0,340,341,5,99,0,0,341,342,5,117,0,0,342,343,5,109, - 0,0,343,344,5,101,0,0,344,345,5,110,0,0,345,346,5,116,0,0,346,16, - 1,0,0,0,347,348,5,102,0,0,348,349,5,114,0,0,349,350,5,97,0,0,350, - 351,5,103,0,0,351,352,5,109,0,0,352,353,5,101,0,0,353,354,5,110, - 0,0,354,355,5,116,0,0,355,356,5,115,0,0,356,18,1,0,0,0,357,358,5, - 118,0,0,358,359,5,105,0,0,359,360,5,101,0,0,360,361,5,119,0,0,361, - 20,1,0,0,0,362,363,5,109,0,0,363,364,5,97,0,0,364,365,5,120,0,0, - 365,22,1,0,0,0,366,367,5,97,0,0,367,368,5,108,0,0,368,369,5,108, - 0,0,369,370,5,111,0,0,370,371,5,119,0,0,371,24,1,0,0,0,372,373,5, - 112,0,0,373,374,5,111,0,0,374,375,5,108,0,0,375,376,5,108,0,0,376, - 26,1,0,0,0,377,378,5,113,0,0,378,379,5,117,0,0,379,380,5,101,0,0, - 380,381,5,114,0,0,381,382,5,121,0,0,382,383,5,97,0,0,383,384,5,98, - 0,0,384,385,5,108,0,0,385,386,5,101,0,0,386,28,1,0,0,0,387,388,5, - 114,0,0,388,389,5,112,0,0,389,390,5,99,0,0,390,30,1,0,0,0,391,392, - 5,113,0,0,392,393,5,117,0,0,393,394,5,101,0,0,394,395,5,114,0,0, - 395,396,5,121,0,0,396,397,5,45,0,0,397,398,5,114,0,0,398,399,5,101, - 0,0,399,400,5,97,0,0,400,401,5,115,0,0,401,402,5,111,0,0,402,403, - 5,110,0,0,403,32,1,0,0,0,404,405,5,116,0,0,405,406,5,121,0,0,406, - 407,5,112,0,0,407,408,5,101,0,0,408,34,1,0,0,0,409,410,5,111,0,0, - 410,411,5,98,0,0,411,412,5,106,0,0,412,413,5,101,0,0,413,414,5,99, - 0,0,414,415,5,116,0,0,415,36,1,0,0,0,416,417,5,115,0,0,417,418,5, - 116,0,0,418,419,5,111,0,0,419,420,5,114,0,0,420,421,5,97,0,0,421, - 422,5,98,0,0,422,423,5,108,0,0,423,424,5,101,0,0,424,38,1,0,0,0, - 425,426,5,105,0,0,426,427,5,109,0,0,427,428,5,112,0,0,428,429,5, - 108,0,0,429,430,5,101,0,0,430,431,5,109,0,0,431,432,5,101,0,0,432, - 433,5,110,0,0,433,434,5,116,0,0,434,435,5,115,0,0,435,40,1,0,0,0, - 436,437,5,114,0,0,437,438,5,101,0,0,438,439,5,102,0,0,439,42,1,0, - 0,0,440,441,5,102,0,0,441,442,5,114,0,0,442,443,5,97,0,0,443,444, - 5,103,0,0,444,445,5,109,0,0,445,446,5,101,0,0,446,447,5,110,0,0, - 447,448,5,116,0,0,448,44,1,0,0,0,449,450,5,105,0,0,450,451,5,109, - 0,0,451,452,5,112,0,0,452,453,5,111,0,0,453,454,5,114,0,0,454,455, - 5,116,0,0,455,46,1,0,0,0,456,457,5,101,0,0,457,458,5,120,0,0,458, - 459,5,116,0,0,459,460,5,101,0,0,460,461,5,114,0,0,461,462,5,110, - 0,0,462,463,5,97,0,0,463,464,5,108,0,0,464,48,1,0,0,0,465,466,5, - 97,0,0,466,467,5,116,0,0,467,468,5,111,0,0,468,469,5,109,0,0,469, - 50,1,0,0,0,470,471,5,105,0,0,471,472,5,110,0,0,472,473,5,116,0,0, - 473,474,5,101,0,0,474,475,5,114,0,0,475,476,5,102,0,0,476,477,5, - 97,0,0,477,478,5,99,0,0,478,479,5,101,0,0,479,52,1,0,0,0,480,481, - 5,105,0,0,481,482,5,110,0,0,482,483,5,116,0,0,483,484,5,101,0,0, - 484,485,5,114,0,0,485,486,5,102,0,0,486,487,5,97,0,0,487,488,5,99, - 0,0,488,489,5,101,0,0,489,490,5,115,0,0,490,54,1,0,0,0,491,492,5, - 112,0,0,492,493,5,97,0,0,493,494,5,99,0,0,494,495,5,107,0,0,495, - 496,5,97,0,0,496,497,5,103,0,0,497,498,5,101,0,0,498,56,1,0,0,0, - 499,500,5,118,0,0,500,501,5,97,0,0,501,502,5,108,0,0,502,503,5,117, - 0,0,503,504,5,101,0,0,504,58,1,0,0,0,505,506,5,114,0,0,506,507,5, - 101,0,0,507,508,5,108,0,0,508,509,5,97,0,0,509,510,5,116,0,0,510, - 511,5,105,0,0,511,512,5,111,0,0,512,513,5,110,0,0,513,60,1,0,0,0, - 514,515,5,111,0,0,515,516,5,112,0,0,516,517,5,101,0,0,517,518,5, - 114,0,0,518,519,5,97,0,0,519,520,5,116,0,0,520,521,5,105,0,0,521, - 522,5,111,0,0,522,523,5,110,0,0,523,62,1,0,0,0,524,525,5,102,0,0, - 525,526,5,117,0,0,526,527,5,110,0,0,527,528,5,99,0,0,528,529,5,116, - 0,0,529,530,5,105,0,0,530,531,5,111,0,0,531,532,5,110,0,0,532,64, - 1,0,0,0,533,534,5,99,0,0,534,535,5,111,0,0,535,536,5,110,0,0,536, - 537,5,115,0,0,537,538,5,116,0,0,538,539,5,114,0,0,539,540,5,117, - 0,0,540,541,5,99,0,0,541,542,5,116,0,0,542,543,5,111,0,0,543,544, - 5,114,0,0,544,66,1,0,0,0,545,546,5,99,0,0,546,547,5,111,0,0,547, - 548,5,110,0,0,548,549,5,115,0,0,549,550,5,116,0,0,550,551,5,114, - 0,0,551,552,5,117,0,0,552,553,5,99,0,0,553,554,5,116,0,0,554,555, - 5,115,0,0,555,68,1,0,0,0,556,557,5,105,0,0,557,558,5,110,0,0,558, - 559,5,112,0,0,559,560,5,117,0,0,560,561,5,116,0,0,561,70,1,0,0,0, - 562,563,5,99,0,0,563,564,5,111,0,0,564,565,5,110,0,0,565,566,5,102, - 0,0,566,567,5,111,0,0,567,568,5,114,0,0,568,569,5,109,0,0,569,72, - 1,0,0,0,570,571,5,97,0,0,571,572,5,115,0,0,572,74,1,0,0,0,573,574, - 5,98,0,0,574,575,5,105,0,0,575,576,5,110,0,0,576,577,5,100,0,0,577, - 76,1,0,0,0,578,579,5,115,0,0,579,580,5,116,0,0,580,581,5,97,0,0, - 581,582,5,116,0,0,582,583,5,105,0,0,583,584,5,99,0,0,584,78,1,0, - 0,0,585,586,5,116,0,0,586,587,5,111,0,0,587,80,1,0,0,0,588,589,5, - 112,0,0,589,590,5,114,0,0,590,591,5,105,0,0,591,592,5,118,0,0,592, - 593,5,97,0,0,593,594,5,116,0,0,594,595,5,101,0,0,595,82,1,0,0,0, - 596,597,5,115,0,0,597,598,5,104,0,0,598,599,5,97,0,0,599,600,5,114, - 0,0,600,601,5,101,0,0,601,602,5,100,0,0,602,84,1,0,0,0,603,604,5, - 115,0,0,604,605,5,116,0,0,605,606,5,97,0,0,606,607,5,116,0,0,607, - 608,5,101,0,0,608,86,1,0,0,0,609,610,5,101,0,0,610,611,5,100,0,0, - 611,612,5,103,0,0,612,613,5,101,0,0,613,88,1,0,0,0,614,615,5,112, - 0,0,615,616,5,114,0,0,616,617,5,111,0,0,617,618,5,106,0,0,618,619, - 5,101,0,0,619,620,5,99,0,0,620,621,5,116,0,0,621,622,5,105,0,0,622, - 623,5,111,0,0,623,624,5,110,0,0,624,90,1,0,0,0,625,626,5,119,0,0, - 626,627,5,105,0,0,627,628,5,116,0,0,628,629,5,104,0,0,629,92,1,0, - 0,0,630,631,5,117,0,0,631,632,5,115,0,0,632,633,5,105,0,0,633,634, - 5,110,0,0,634,635,5,103,0,0,635,94,1,0,0,0,636,637,5,118,0,0,637, - 638,5,105,0,0,638,639,5,97,0,0,639,96,1,0,0,0,640,641,5,109,0,0, - 641,642,5,97,0,0,642,643,5,116,0,0,643,644,5,101,0,0,644,645,5,114, - 0,0,645,646,5,105,0,0,646,647,5,97,0,0,647,648,5,108,0,0,648,649, - 5,105,0,0,649,650,5,122,0,0,650,651,5,101,0,0,651,98,1,0,0,0,652, - 653,5,105,0,0,653,654,5,102,0,0,654,100,1,0,0,0,655,656,5,97,0,0, - 656,657,5,98,0,0,657,658,5,115,0,0,658,659,5,101,0,0,659,660,5,110, - 0,0,660,661,5,116,0,0,661,102,1,0,0,0,662,663,5,111,0,0,663,664, - 5,110,0,0,664,104,1,0,0,0,665,666,5,112,0,0,666,667,5,111,0,0,667, - 668,5,108,0,0,668,669,5,105,0,0,669,670,5,99,0,0,670,671,5,121,0, - 0,671,106,1,0,0,0,672,673,5,100,0,0,673,674,5,101,0,0,674,675,5, - 102,0,0,675,676,5,97,0,0,676,677,5,117,0,0,677,678,5,108,0,0,678, - 679,5,116,0,0,679,108,1,0,0,0,680,681,5,115,0,0,681,682,5,111,0, - 0,682,683,5,117,0,0,683,684,5,114,0,0,684,685,5,99,0,0,685,686,5, - 101,0,0,686,110,1,0,0,0,687,688,5,114,0,0,688,689,5,101,0,0,689, - 690,5,112,0,0,690,691,5,111,0,0,691,692,5,115,0,0,692,693,5,105, - 0,0,693,694,5,116,0,0,694,695,5,111,0,0,695,696,5,114,0,0,696,697, - 5,121,0,0,697,112,1,0,0,0,698,699,5,99,0,0,699,700,5,111,0,0,700, - 701,5,109,0,0,701,702,5,109,0,0,702,703,5,105,0,0,703,704,5,116, - 0,0,704,114,1,0,0,0,705,706,5,114,0,0,706,707,5,101,0,0,707,708, - 5,118,0,0,708,709,5,105,0,0,709,710,5,115,0,0,710,711,5,105,0,0, - 711,712,5,111,0,0,712,713,5,110,0,0,713,116,1,0,0,0,714,715,5,115, - 0,0,715,716,5,101,0,0,716,717,5,109,0,0,717,718,5,97,0,0,718,719, - 5,110,0,0,719,720,5,116,0,0,720,721,5,105,0,0,721,722,5,99,0,0,722, - 723,5,45,0,0,723,724,5,109,0,0,724,725,5,97,0,0,725,726,5,106,0, - 0,726,727,5,111,0,0,727,728,5,114,0,0,728,118,1,0,0,0,729,730,5, - 111,0,0,730,731,5,110,0,0,731,732,5,45,0,0,732,733,5,100,0,0,733, - 734,5,101,0,0,734,735,5,108,0,0,735,736,5,101,0,0,736,737,5,116, - 0,0,737,738,5,101,0,0,738,120,1,0,0,0,739,740,5,114,0,0,740,741, - 5,101,0,0,741,742,5,116,0,0,742,743,5,97,0,0,743,744,5,105,0,0,744, - 745,5,110,0,0,745,746,5,45,0,0,746,747,5,111,0,0,747,748,5,116,0, - 0,748,749,5,104,0,0,749,750,5,101,0,0,750,751,5,114,0,0,751,122, - 1,0,0,0,752,753,5,107,0,0,753,754,5,101,0,0,754,755,5,121,0,0,755, - 756,5,101,0,0,756,757,5,100,0,0,757,124,1,0,0,0,758,759,5,112,0, - 0,759,760,5,117,0,0,760,761,5,98,0,0,761,762,5,108,0,0,762,763,5, - 105,0,0,763,764,5,99,0,0,764,765,5,45,0,0,765,766,5,116,0,0,766, - 767,5,114,0,0,767,768,5,97,0,0,768,769,5,118,0,0,769,770,5,101,0, - 0,770,771,5,114,0,0,771,772,5,115,0,0,772,773,5,97,0,0,773,774,5, - 108,0,0,774,126,1,0,0,0,775,776,5,105,0,0,776,777,5,100,0,0,777, - 128,1,0,0,0,778,779,5,100,0,0,779,780,5,111,0,0,780,781,5,99,0,0, - 781,130,1,0,0,0,782,783,5,109,0,0,783,784,5,111,0,0,784,785,5,100, - 0,0,785,786,5,101,0,0,786,132,1,0,0,0,787,788,5,101,0,0,788,789, - 5,109,0,0,789,790,5,105,0,0,790,791,5,116,0,0,791,792,5,115,0,0, - 792,134,1,0,0,0,793,794,5,114,0,0,794,795,5,101,0,0,795,796,5,99, - 0,0,796,797,5,101,0,0,797,798,5,105,0,0,798,799,5,118,0,0,799,800, - 5,101,0,0,800,801,5,114,0,0,801,136,1,0,0,0,802,803,5,114,0,0,803, - 804,5,101,0,0,804,805,5,113,0,0,805,806,5,117,0,0,806,807,5,105, - 0,0,807,808,5,114,0,0,808,809,5,101,0,0,809,810,5,115,0,0,810,138, - 1,0,0,0,811,812,5,97,0,0,812,813,5,110,0,0,813,814,5,121,0,0,814, - 140,1,0,0,0,815,816,5,103,0,0,816,817,5,101,0,0,817,818,5,116,0, - 0,818,142,1,0,0,0,819,820,5,115,0,0,820,821,5,101,0,0,821,822,5, - 116,0,0,822,144,1,0,0,0,823,824,5,119,0,0,824,825,5,97,0,0,825,826, - 5,116,0,0,826,827,5,99,0,0,827,828,5,104,0,0,828,146,1,0,0,0,829, - 830,5,115,0,0,830,831,5,116,0,0,831,832,5,97,0,0,832,833,5,114,0, - 0,833,834,5,116,0,0,834,148,1,0,0,0,835,836,5,115,0,0,836,837,5, - 116,0,0,837,838,5,111,0,0,838,839,5,112,0,0,839,150,1,0,0,0,840, - 841,5,114,0,0,841,842,5,101,0,0,842,843,5,97,0,0,843,844,5,100,0, - 0,844,152,1,0,0,0,845,846,5,119,0,0,846,847,5,114,0,0,847,848,5, - 105,0,0,848,849,5,116,0,0,849,850,5,101,0,0,850,154,1,0,0,0,851, - 852,5,114,0,0,852,853,5,101,0,0,853,854,5,115,0,0,854,855,5,111, - 0,0,855,856,5,108,0,0,856,857,5,118,0,0,857,858,5,101,0,0,858,156, - 1,0,0,0,859,860,5,99,0,0,860,861,5,111,0,0,861,862,5,110,0,0,862, - 863,5,110,0,0,863,864,5,101,0,0,864,865,5,99,0,0,865,866,5,116,0, - 0,866,158,1,0,0,0,867,868,5,100,0,0,868,869,5,105,0,0,869,870,5, - 115,0,0,870,871,5,99,0,0,871,872,5,111,0,0,872,873,5,110,0,0,873, - 874,5,110,0,0,874,875,5,101,0,0,875,876,5,99,0,0,876,877,5,116,0, - 0,877,160,1,0,0,0,878,879,5,99,0,0,879,880,5,97,0,0,880,881,5,108, - 0,0,881,882,5,108,0,0,882,162,1,0,0,0,883,884,5,119,0,0,884,885, - 5,97,0,0,885,886,5,116,0,0,886,887,5,99,0,0,887,888,5,104,0,0,888, - 889,5,45,0,0,889,890,5,115,0,0,890,891,5,116,0,0,891,892,5,97,0, - 0,892,893,5,114,0,0,893,894,5,116,0,0,894,164,1,0,0,0,895,896,5, - 119,0,0,896,897,5,97,0,0,897,898,5,116,0,0,898,899,5,99,0,0,899, - 900,5,104,0,0,900,901,5,45,0,0,901,902,5,115,0,0,902,903,5,116,0, - 0,903,904,5,111,0,0,904,905,5,112,0,0,905,166,1,0,0,0,906,907,5, - 115,0,0,907,908,5,117,0,0,908,909,5,98,0,0,909,910,5,115,0,0,910, - 911,5,99,0,0,911,912,5,114,0,0,912,913,5,105,0,0,913,914,5,98,0, - 0,914,915,5,101,0,0,915,168,1,0,0,0,916,917,5,117,0,0,917,918,5, - 110,0,0,918,919,5,115,0,0,919,920,5,117,0,0,920,921,5,98,0,0,921, - 922,5,115,0,0,922,923,5,99,0,0,923,924,5,114,0,0,924,925,5,105,0, - 0,925,926,5,98,0,0,926,927,5,101,0,0,927,170,1,0,0,0,928,929,5,111, - 0,0,929,930,5,112,0,0,930,931,5,116,0,0,931,932,5,105,0,0,932,933, - 5,109,0,0,933,934,5,105,0,0,934,935,5,115,0,0,935,936,5,116,0,0, - 936,937,5,105,0,0,937,938,5,99,0,0,938,939,5,45,0,0,939,940,5,114, - 0,0,940,941,5,101,0,0,941,942,5,103,0,0,942,943,5,105,0,0,943,944, - 5,115,0,0,944,945,5,116,0,0,945,946,5,101,0,0,946,947,5,114,0,0, - 947,172,1,0,0,0,948,949,5,99,0,0,949,950,5,114,0,0,950,951,5,100, - 0,0,951,952,5,116,0,0,952,174,1,0,0,0,953,954,5,111,0,0,954,955, - 5,112,0,0,955,956,5,116,0,0,956,957,5,105,0,0,957,958,5,111,0,0, - 958,959,5,110,0,0,959,960,5,97,0,0,960,961,5,108,0,0,961,962,5,45, - 0,0,962,963,5,111,0,0,963,964,5,110,0,0,964,965,5,101,0,0,965,176, - 1,0,0,0,966,967,5,101,0,0,967,968,5,120,0,0,968,969,5,97,0,0,969, - 970,5,99,0,0,970,971,5,116,0,0,971,972,5,108,0,0,972,973,5,121,0, - 0,973,974,5,45,0,0,974,975,5,111,0,0,975,976,5,110,0,0,976,977,5, - 101,0,0,977,178,1,0,0,0,978,979,5,109,0,0,979,980,5,97,0,0,980,981, - 5,110,0,0,981,982,5,121,0,0,982,983,5,45,0,0,983,984,5,117,0,0,984, - 985,5,110,0,0,985,986,5,105,0,0,986,987,5,113,0,0,987,988,5,117, - 0,0,988,989,5,101,0,0,989,180,1,0,0,0,990,991,5,109,0,0,991,992, - 5,97,0,0,992,993,5,110,0,0,993,994,5,121,0,0,994,182,1,0,0,0,995, - 996,5,111,0,0,996,997,5,114,0,0,997,998,5,100,0,0,998,999,5,101, - 0,0,999,1000,5,114,0,0,1000,1001,5,101,0,0,1001,1002,5,100,0,0,1002, - 184,1,0,0,0,1003,1004,5,117,0,0,1004,1005,5,110,0,0,1005,1006,5, - 105,0,0,1006,1007,5,116,0,0,1007,186,1,0,0,0,1008,1009,5,119,0,0, - 1009,1010,5,97,0,0,1010,1011,5,116,0,0,1011,1012,5,99,0,0,1012,1013, - 5,104,0,0,1013,1014,5,45,0,0,1014,1015,5,104,0,0,1015,1016,5,97, - 0,0,1016,1017,5,110,0,0,1017,1018,5,100,0,0,1018,1019,5,108,0,0, - 1019,1020,5,101,0,0,1020,188,1,0,0,0,1021,1022,5,109,0,0,1022,1023, - 5,101,0,0,1023,1024,5,115,0,0,1024,1025,5,115,0,0,1025,1026,5,97, - 0,0,1026,1027,5,103,0,0,1027,1028,5,101,0,0,1028,190,1,0,0,0,1029, - 1030,5,97,0,0,1030,1031,5,116,0,0,1031,1032,5,111,0,0,1032,1033, - 5,109,0,0,1033,1034,5,45,0,0,1034,1035,5,114,0,0,1035,1036,5,101, - 0,0,1036,1037,5,102,0,0,1037,192,1,0,0,0,1038,1039,5,105,0,0,1039, - 1040,5,110,0,0,1040,1041,5,116,0,0,1041,1042,5,101,0,0,1042,1043, - 5,114,0,0,1043,1044,5,102,0,0,1044,1045,5,97,0,0,1045,1046,5,99, - 0,0,1046,1047,5,101,0,0,1047,1048,5,45,0,0,1048,1049,5,114,0,0,1049, - 1050,5,101,0,0,1050,1051,5,102,0,0,1051,194,1,0,0,0,1052,1053,5, - 111,0,0,1053,1054,5,112,0,0,1054,1055,5,116,0,0,1055,1056,5,105, - 0,0,1056,1057,5,111,0,0,1057,1058,5,110,0,0,1058,1059,5,97,0,0,1059, - 1060,5,108,0,0,1060,196,1,0,0,0,1061,1062,5,108,0,0,1062,1063,5, - 105,0,0,1063,1064,5,115,0,0,1064,1065,5,116,0,0,1065,198,1,0,0,0, - 1066,1067,5,114,0,0,1067,1068,5,101,0,0,1068,1069,5,99,0,0,1069, - 1070,5,111,0,0,1070,1071,5,114,0,0,1071,1072,5,100,0,0,1072,200, - 1,0,0,0,1073,1074,5,98,0,0,1074,1075,5,111,0,0,1075,1076,5,111,0, - 0,1076,1077,5,108,0,0,1077,202,1,0,0,0,1078,1079,5,98,0,0,1079,1080, - 5,121,0,0,1080,1081,5,116,0,0,1081,1082,5,101,0,0,1082,1083,5,115, - 0,0,1083,204,1,0,0,0,1084,1085,5,100,0,0,1085,1086,5,111,0,0,1086, - 1087,5,117,0,0,1087,1088,5,98,0,0,1088,1089,5,108,0,0,1089,1090, - 5,101,0,0,1090,206,1,0,0,0,1091,1092,5,105,0,0,1092,1093,5,110,0, - 0,1093,1094,5,116,0,0,1094,1095,5,51,0,0,1095,1096,5,50,0,0,1096, - 208,1,0,0,0,1097,1098,5,105,0,0,1098,1099,5,110,0,0,1099,1100,5, - 116,0,0,1100,1101,5,54,0,0,1101,1102,5,52,0,0,1102,210,1,0,0,0,1103, - 1104,5,115,0,0,1104,1105,5,116,0,0,1105,1106,5,114,0,0,1106,1107, - 5,105,0,0,1107,1108,5,110,0,0,1108,1109,5,103,0,0,1109,212,1,0,0, - 0,1110,1111,5,117,0,0,1111,1112,5,105,0,0,1112,1113,5,110,0,0,1113, - 1114,5,116,0,0,1114,1115,5,51,0,0,1115,1116,5,50,0,0,1116,214,1, - 0,0,0,1117,1118,5,117,0,0,1118,1119,5,105,0,0,1119,1120,5,110,0, - 0,1120,1121,5,116,0,0,1121,1122,5,54,0,0,1122,1123,5,52,0,0,1123, - 216,1,0,0,0,1124,1125,5,116,0,0,1125,1126,5,114,0,0,1126,1127,5, - 117,0,0,1127,1128,5,101,0,0,1128,218,1,0,0,0,1129,1130,5,102,0,0, - 1130,1131,5,97,0,0,1131,1132,5,108,0,0,1132,1133,5,115,0,0,1133, - 1134,5,101,0,0,1134,220,1,0,0,0,1135,1136,5,110,0,0,1136,1137,5, - 117,0,0,1137,1138,5,108,0,0,1138,1139,5,108,0,0,1139,222,1,0,0,0, - 1140,1141,5,45,0,0,1141,1142,5,62,0,0,1142,224,1,0,0,0,1143,1144, - 5,58,0,0,1144,226,1,0,0,0,1145,1146,5,59,0,0,1146,228,1,0,0,0,1147, - 1148,5,44,0,0,1148,230,1,0,0,0,1149,1150,5,46,0,0,1150,232,1,0,0, - 0,1151,1152,5,123,0,0,1152,234,1,0,0,0,1153,1154,5,125,0,0,1154, - 236,1,0,0,0,1155,1156,5,91,0,0,1156,238,1,0,0,0,1157,1158,5,93,0, - 0,1158,240,1,0,0,0,1159,1160,5,40,0,0,1160,242,1,0,0,0,1161,1162, - 5,41,0,0,1162,244,1,0,0,0,1163,1164,5,60,0,0,1164,246,1,0,0,0,1165, - 1166,5,62,0,0,1166,248,1,0,0,0,1167,1168,5,38,0,0,1168,250,1,0,0, - 0,1169,1170,5,61,0,0,1170,252,1,0,0,0,1171,1173,5,45,0,0,1172,1171, - 1,0,0,0,1172,1173,1,0,0,0,1173,1175,1,0,0,0,1174,1176,7,0,0,0,1175, - 1174,1,0,0,0,1176,1177,1,0,0,0,1177,1175,1,0,0,0,1177,1178,1,0,0, - 0,1178,254,1,0,0,0,1179,1181,5,45,0,0,1180,1179,1,0,0,0,1180,1181, - 1,0,0,0,1181,1190,1,0,0,0,1182,1191,5,48,0,0,1183,1187,7,1,0,0,1184, - 1186,7,0,0,0,1185,1184,1,0,0,0,1186,1189,1,0,0,0,1187,1185,1,0,0, - 0,1187,1188,1,0,0,0,1188,1191,1,0,0,0,1189,1187,1,0,0,0,1190,1182, - 1,0,0,0,1190,1183,1,0,0,0,1191,1198,1,0,0,0,1192,1194,5,46,0,0,1193, - 1195,7,0,0,0,1194,1193,1,0,0,0,1195,1196,1,0,0,0,1196,1194,1,0,0, - 0,1196,1197,1,0,0,0,1197,1199,1,0,0,0,1198,1192,1,0,0,0,1198,1199, - 1,0,0,0,1199,1209,1,0,0,0,1200,1202,7,2,0,0,1201,1203,7,3,0,0,1202, - 1201,1,0,0,0,1202,1203,1,0,0,0,1203,1205,1,0,0,0,1204,1206,7,0,0, - 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,1210,1,0,0,0,1209,1200,1,0,0,0,1209,1210,1,0,0,0,1210, - 256,1,0,0,0,1211,1215,7,4,0,0,1212,1214,7,5,0,0,1213,1212,1,0,0, - 0,1214,1217,1,0,0,0,1215,1213,1,0,0,0,1215,1216,1,0,0,0,1216,258, - 1,0,0,0,1217,1215,1,0,0,0,1218,1223,5,34,0,0,1219,1222,3,261,130, - 0,1220,1222,8,6,0,0,1221,1219,1,0,0,0,1221,1220,1,0,0,0,1222,1225, - 1,0,0,0,1223,1221,1,0,0,0,1223,1224,1,0,0,0,1224,1226,1,0,0,0,1225, - 1223,1,0,0,0,1226,1227,5,34,0,0,1227,260,1,0,0,0,1228,1236,5,92, - 0,0,1229,1237,7,7,0,0,1230,1231,5,117,0,0,1231,1232,3,263,131,0, - 1232,1233,3,263,131,0,1233,1234,3,263,131,0,1234,1235,3,263,131, - 0,1235,1237,1,0,0,0,1236,1229,1,0,0,0,1236,1230,1,0,0,0,1237,262, - 1,0,0,0,1238,1239,7,8,0,0,1239,264,1,0,0,0,1240,1241,5,47,0,0,1241, - 1242,5,47,0,0,1242,1246,1,0,0,0,1243,1245,8,9,0,0,1244,1243,1,0, - 0,0,1245,1248,1,0,0,0,1246,1244,1,0,0,0,1246,1247,1,0,0,0,1247,1249, - 1,0,0,0,1248,1246,1,0,0,0,1249,1250,6,132,0,0,1250,266,1,0,0,0,1251, - 1252,5,47,0,0,1252,1253,5,42,0,0,1253,1257,1,0,0,0,1254,1256,9,0, - 0,0,1255,1254,1,0,0,0,1256,1259,1,0,0,0,1257,1258,1,0,0,0,1257,1255, - 1,0,0,0,1258,1260,1,0,0,0,1259,1257,1,0,0,0,1260,1261,5,42,0,0,1261, - 1262,5,47,0,0,1262,1263,1,0,0,0,1263,1264,6,133,0,0,1264,268,1,0, - 0,0,1265,1267,7,10,0,0,1266,1265,1,0,0,0,1267,1268,1,0,0,0,1268, - 1266,1,0,0,0,1268,1269,1,0,0,0,1269,1270,1,0,0,0,1270,1271,6,134, - 0,0,1271,270,1,0,0,0,18,0,1172,1177,1180,1187,1190,1196,1198,1202, - 1207,1209,1215,1221,1223,1236,1246,1257,1268,1,0,1,0 + 129,259,130,261,131,263,0,265,0,267,132,269,133,271,134,1,0,11,1, + 0,48,57,1,0,49,57,2,0,69,69,101,101,2,0,43,43,45,45,3,0,65,90,95, + 95,97,122,4,0,48,57,65,90,95,95,97,122,4,0,10,10,13,13,34,34,92, + 92,8,0,34,34,47,47,92,92,98,98,102,102,110,110,114,114,116,116,3, + 0,48,57,65,70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32,32,1299,0, + 1,1,0,0,0,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,229,1,0, + 0,0,0,231,1,0,0,0,0,233,1,0,0,0,0,235,1,0,0,0,0,237,1,0,0,0,0,239, + 1,0,0,0,0,241,1,0,0,0,0,243,1,0,0,0,0,245,1,0,0,0,0,247,1,0,0,0, + 0,249,1,0,0,0,0,251,1,0,0,0,0,253,1,0,0,0,0,255,1,0,0,0,0,257,1, + 0,0,0,0,259,1,0,0,0,0,261,1,0,0,0,0,267,1,0,0,0,0,269,1,0,0,0,0, + 271,1,0,0,0,1,273,1,0,0,0,3,283,1,0,0,0,5,296,1,0,0,0,7,306,1,0, + 0,0,9,318,1,0,0,0,11,324,1,0,0,0,13,335,1,0,0,0,15,346,1,0,0,0,17, + 351,1,0,0,0,19,360,1,0,0,0,21,370,1,0,0,0,23,375,1,0,0,0,25,379, + 1,0,0,0,27,385,1,0,0,0,29,390,1,0,0,0,31,400,1,0,0,0,33,404,1,0, + 0,0,35,417,1,0,0,0,37,422,1,0,0,0,39,429,1,0,0,0,41,438,1,0,0,0, + 43,449,1,0,0,0,45,453,1,0,0,0,47,462,1,0,0,0,49,469,1,0,0,0,51,478, + 1,0,0,0,53,483,1,0,0,0,55,493,1,0,0,0,57,504,1,0,0,0,59,512,1,0, + 0,0,61,518,1,0,0,0,63,527,1,0,0,0,65,537,1,0,0,0,67,546,1,0,0,0, + 69,558,1,0,0,0,71,569,1,0,0,0,73,575,1,0,0,0,75,583,1,0,0,0,77,586, + 1,0,0,0,79,591,1,0,0,0,81,598,1,0,0,0,83,601,1,0,0,0,85,609,1,0, + 0,0,87,616,1,0,0,0,89,622,1,0,0,0,91,627,1,0,0,0,93,638,1,0,0,0, + 95,643,1,0,0,0,97,649,1,0,0,0,99,653,1,0,0,0,101,665,1,0,0,0,103, + 668,1,0,0,0,105,675,1,0,0,0,107,678,1,0,0,0,109,685,1,0,0,0,111, + 693,1,0,0,0,113,700,1,0,0,0,115,711,1,0,0,0,117,718,1,0,0,0,119, + 727,1,0,0,0,121,742,1,0,0,0,123,752,1,0,0,0,125,765,1,0,0,0,127, + 771,1,0,0,0,129,788,1,0,0,0,131,791,1,0,0,0,133,795,1,0,0,0,135, + 800,1,0,0,0,137,806,1,0,0,0,139,815,1,0,0,0,141,824,1,0,0,0,143, + 828,1,0,0,0,145,832,1,0,0,0,147,836,1,0,0,0,149,842,1,0,0,0,151, + 848,1,0,0,0,153,853,1,0,0,0,155,858,1,0,0,0,157,864,1,0,0,0,159, + 872,1,0,0,0,161,880,1,0,0,0,163,891,1,0,0,0,165,896,1,0,0,0,167, + 908,1,0,0,0,169,919,1,0,0,0,171,929,1,0,0,0,173,941,1,0,0,0,175, + 961,1,0,0,0,177,966,1,0,0,0,179,979,1,0,0,0,181,991,1,0,0,0,183, + 1003,1,0,0,0,185,1008,1,0,0,0,187,1016,1,0,0,0,189,1021,1,0,0,0, + 191,1034,1,0,0,0,193,1042,1,0,0,0,195,1051,1,0,0,0,197,1065,1,0, + 0,0,199,1074,1,0,0,0,201,1079,1,0,0,0,203,1086,1,0,0,0,205,1091, + 1,0,0,0,207,1097,1,0,0,0,209,1104,1,0,0,0,211,1110,1,0,0,0,213,1116, + 1,0,0,0,215,1123,1,0,0,0,217,1130,1,0,0,0,219,1137,1,0,0,0,221,1142, + 1,0,0,0,223,1148,1,0,0,0,225,1153,1,0,0,0,227,1156,1,0,0,0,229,1158, + 1,0,0,0,231,1160,1,0,0,0,233,1162,1,0,0,0,235,1164,1,0,0,0,237,1166, + 1,0,0,0,239,1168,1,0,0,0,241,1170,1,0,0,0,243,1172,1,0,0,0,245,1174, + 1,0,0,0,247,1176,1,0,0,0,249,1178,1,0,0,0,251,1180,1,0,0,0,253,1182, + 1,0,0,0,255,1185,1,0,0,0,257,1193,1,0,0,0,259,1224,1,0,0,0,261,1231, + 1,0,0,0,263,1241,1,0,0,0,265,1251,1,0,0,0,267,1253,1,0,0,0,269,1264, + 1,0,0,0,271,1279,1,0,0,0,273,274,5,119,0,0,274,275,5,111,0,0,275, + 276,5,114,0,0,276,277,5,107,0,0,277,278,5,115,0,0,278,279,5,112, + 0,0,279,280,5,97,0,0,280,281,5,99,0,0,281,282,5,101,0,0,282,2,1, + 0,0,0,283,284,5,114,0,0,284,285,5,101,0,0,285,286,5,115,0,0,286, + 287,5,117,0,0,287,288,5,108,0,0,288,289,5,116,0,0,289,290,5,45,0, + 0,290,291,5,98,0,0,291,292,5,121,0,0,292,293,5,116,0,0,293,294,5, + 101,0,0,294,295,5,115,0,0,295,4,1,0,0,0,296,297,5,114,0,0,297,298, + 5,112,0,0,298,299,5,99,0,0,299,300,5,45,0,0,300,301,5,99,0,0,301, + 302,5,97,0,0,302,303,5,108,0,0,303,304,5,108,0,0,304,305,5,115,0, + 0,305,6,1,0,0,0,306,307,5,100,0,0,307,308,5,101,0,0,308,309,5,97, + 0,0,309,310,5,100,0,0,310,311,5,108,0,0,311,312,5,105,0,0,312,313, + 5,110,0,0,313,314,5,101,0,0,314,315,5,45,0,0,315,316,5,109,0,0,316, + 317,5,115,0,0,317,8,1,0,0,0,318,319,5,113,0,0,319,320,5,117,0,0, + 320,321,5,101,0,0,321,322,5,114,0,0,322,323,5,121,0,0,323,10,1,0, + 0,0,324,325,5,114,0,0,325,326,5,101,0,0,326,327,5,102,0,0,327,328, + 5,108,0,0,328,329,5,101,0,0,329,330,5,99,0,0,330,331,5,116,0,0,331, + 332,5,105,0,0,332,333,5,111,0,0,333,334,5,110,0,0,334,12,1,0,0,0, + 335,336,5,115,0,0,336,337,5,112,0,0,337,338,5,101,0,0,338,339,5, + 99,0,0,339,340,5,105,0,0,340,341,5,97,0,0,341,342,5,108,0,0,342, + 343,5,105,0,0,343,344,5,122,0,0,344,345,5,101,0,0,345,14,1,0,0,0, + 346,347,5,114,0,0,347,348,5,111,0,0,348,349,5,111,0,0,349,350,5, + 116,0,0,350,16,1,0,0,0,351,352,5,100,0,0,352,353,5,111,0,0,353,354, + 5,99,0,0,354,355,5,117,0,0,355,356,5,109,0,0,356,357,5,101,0,0,357, + 358,5,110,0,0,358,359,5,116,0,0,359,18,1,0,0,0,360,361,5,102,0,0, + 361,362,5,114,0,0,362,363,5,97,0,0,363,364,5,103,0,0,364,365,5,109, + 0,0,365,366,5,101,0,0,366,367,5,110,0,0,367,368,5,116,0,0,368,369, + 5,115,0,0,369,20,1,0,0,0,370,371,5,118,0,0,371,372,5,105,0,0,372, + 373,5,101,0,0,373,374,5,119,0,0,374,22,1,0,0,0,375,376,5,109,0,0, + 376,377,5,97,0,0,377,378,5,120,0,0,378,24,1,0,0,0,379,380,5,97,0, + 0,380,381,5,108,0,0,381,382,5,108,0,0,382,383,5,111,0,0,383,384, + 5,119,0,0,384,26,1,0,0,0,385,386,5,112,0,0,386,387,5,111,0,0,387, + 388,5,108,0,0,388,389,5,108,0,0,389,28,1,0,0,0,390,391,5,113,0,0, + 391,392,5,117,0,0,392,393,5,101,0,0,393,394,5,114,0,0,394,395,5, + 121,0,0,395,396,5,97,0,0,396,397,5,98,0,0,397,398,5,108,0,0,398, + 399,5,101,0,0,399,30,1,0,0,0,400,401,5,114,0,0,401,402,5,112,0,0, + 402,403,5,99,0,0,403,32,1,0,0,0,404,405,5,113,0,0,405,406,5,117, + 0,0,406,407,5,101,0,0,407,408,5,114,0,0,408,409,5,121,0,0,409,410, + 5,45,0,0,410,411,5,114,0,0,411,412,5,101,0,0,412,413,5,97,0,0,413, + 414,5,115,0,0,414,415,5,111,0,0,415,416,5,110,0,0,416,34,1,0,0,0, + 417,418,5,116,0,0,418,419,5,121,0,0,419,420,5,112,0,0,420,421,5, + 101,0,0,421,36,1,0,0,0,422,423,5,111,0,0,423,424,5,98,0,0,424,425, + 5,106,0,0,425,426,5,101,0,0,426,427,5,99,0,0,427,428,5,116,0,0,428, + 38,1,0,0,0,429,430,5,115,0,0,430,431,5,116,0,0,431,432,5,111,0,0, + 432,433,5,114,0,0,433,434,5,97,0,0,434,435,5,98,0,0,435,436,5,108, + 0,0,436,437,5,101,0,0,437,40,1,0,0,0,438,439,5,105,0,0,439,440,5, + 109,0,0,440,441,5,112,0,0,441,442,5,108,0,0,442,443,5,101,0,0,443, + 444,5,109,0,0,444,445,5,101,0,0,445,446,5,110,0,0,446,447,5,116, + 0,0,447,448,5,115,0,0,448,42,1,0,0,0,449,450,5,114,0,0,450,451,5, + 101,0,0,451,452,5,102,0,0,452,44,1,0,0,0,453,454,5,102,0,0,454,455, + 5,114,0,0,455,456,5,97,0,0,456,457,5,103,0,0,457,458,5,109,0,0,458, + 459,5,101,0,0,459,460,5,110,0,0,460,461,5,116,0,0,461,46,1,0,0,0, + 462,463,5,105,0,0,463,464,5,109,0,0,464,465,5,112,0,0,465,466,5, + 111,0,0,466,467,5,114,0,0,467,468,5,116,0,0,468,48,1,0,0,0,469,470, + 5,101,0,0,470,471,5,120,0,0,471,472,5,116,0,0,472,473,5,101,0,0, + 473,474,5,114,0,0,474,475,5,110,0,0,475,476,5,97,0,0,476,477,5,108, + 0,0,477,50,1,0,0,0,478,479,5,97,0,0,479,480,5,116,0,0,480,481,5, + 111,0,0,481,482,5,109,0,0,482,52,1,0,0,0,483,484,5,105,0,0,484,485, + 5,110,0,0,485,486,5,116,0,0,486,487,5,101,0,0,487,488,5,114,0,0, + 488,489,5,102,0,0,489,490,5,97,0,0,490,491,5,99,0,0,491,492,5,101, + 0,0,492,54,1,0,0,0,493,494,5,105,0,0,494,495,5,110,0,0,495,496,5, + 116,0,0,496,497,5,101,0,0,497,498,5,114,0,0,498,499,5,102,0,0,499, + 500,5,97,0,0,500,501,5,99,0,0,501,502,5,101,0,0,502,503,5,115,0, + 0,503,56,1,0,0,0,504,505,5,112,0,0,505,506,5,97,0,0,506,507,5,99, + 0,0,507,508,5,107,0,0,508,509,5,97,0,0,509,510,5,103,0,0,510,511, + 5,101,0,0,511,58,1,0,0,0,512,513,5,118,0,0,513,514,5,97,0,0,514, + 515,5,108,0,0,515,516,5,117,0,0,516,517,5,101,0,0,517,60,1,0,0,0, + 518,519,5,114,0,0,519,520,5,101,0,0,520,521,5,108,0,0,521,522,5, + 97,0,0,522,523,5,116,0,0,523,524,5,105,0,0,524,525,5,111,0,0,525, + 526,5,110,0,0,526,62,1,0,0,0,527,528,5,111,0,0,528,529,5,112,0,0, + 529,530,5,101,0,0,530,531,5,114,0,0,531,532,5,97,0,0,532,533,5,116, + 0,0,533,534,5,105,0,0,534,535,5,111,0,0,535,536,5,110,0,0,536,64, + 1,0,0,0,537,538,5,102,0,0,538,539,5,117,0,0,539,540,5,110,0,0,540, + 541,5,99,0,0,541,542,5,116,0,0,542,543,5,105,0,0,543,544,5,111,0, + 0,544,545,5,110,0,0,545,66,1,0,0,0,546,547,5,99,0,0,547,548,5,111, + 0,0,548,549,5,110,0,0,549,550,5,115,0,0,550,551,5,116,0,0,551,552, + 5,114,0,0,552,553,5,117,0,0,553,554,5,99,0,0,554,555,5,116,0,0,555, + 556,5,111,0,0,556,557,5,114,0,0,557,68,1,0,0,0,558,559,5,99,0,0, + 559,560,5,111,0,0,560,561,5,110,0,0,561,562,5,115,0,0,562,563,5, + 116,0,0,563,564,5,114,0,0,564,565,5,117,0,0,565,566,5,99,0,0,566, + 567,5,116,0,0,567,568,5,115,0,0,568,70,1,0,0,0,569,570,5,105,0,0, + 570,571,5,110,0,0,571,572,5,112,0,0,572,573,5,117,0,0,573,574,5, + 116,0,0,574,72,1,0,0,0,575,576,5,99,0,0,576,577,5,111,0,0,577,578, + 5,110,0,0,578,579,5,102,0,0,579,580,5,111,0,0,580,581,5,114,0,0, + 581,582,5,109,0,0,582,74,1,0,0,0,583,584,5,97,0,0,584,585,5,115, + 0,0,585,76,1,0,0,0,586,587,5,98,0,0,587,588,5,105,0,0,588,589,5, + 110,0,0,589,590,5,100,0,0,590,78,1,0,0,0,591,592,5,115,0,0,592,593, + 5,116,0,0,593,594,5,97,0,0,594,595,5,116,0,0,595,596,5,105,0,0,596, + 597,5,99,0,0,597,80,1,0,0,0,598,599,5,116,0,0,599,600,5,111,0,0, + 600,82,1,0,0,0,601,602,5,112,0,0,602,603,5,114,0,0,603,604,5,105, + 0,0,604,605,5,118,0,0,605,606,5,97,0,0,606,607,5,116,0,0,607,608, + 5,101,0,0,608,84,1,0,0,0,609,610,5,115,0,0,610,611,5,104,0,0,611, + 612,5,97,0,0,612,613,5,114,0,0,613,614,5,101,0,0,614,615,5,100,0, + 0,615,86,1,0,0,0,616,617,5,115,0,0,617,618,5,116,0,0,618,619,5,97, + 0,0,619,620,5,116,0,0,620,621,5,101,0,0,621,88,1,0,0,0,622,623,5, + 101,0,0,623,624,5,100,0,0,624,625,5,103,0,0,625,626,5,101,0,0,626, + 90,1,0,0,0,627,628,5,112,0,0,628,629,5,114,0,0,629,630,5,111,0,0, + 630,631,5,106,0,0,631,632,5,101,0,0,632,633,5,99,0,0,633,634,5,116, + 0,0,634,635,5,105,0,0,635,636,5,111,0,0,636,637,5,110,0,0,637,92, + 1,0,0,0,638,639,5,119,0,0,639,640,5,105,0,0,640,641,5,116,0,0,641, + 642,5,104,0,0,642,94,1,0,0,0,643,644,5,117,0,0,644,645,5,115,0,0, + 645,646,5,105,0,0,646,647,5,110,0,0,647,648,5,103,0,0,648,96,1,0, + 0,0,649,650,5,118,0,0,650,651,5,105,0,0,651,652,5,97,0,0,652,98, + 1,0,0,0,653,654,5,109,0,0,654,655,5,97,0,0,655,656,5,116,0,0,656, + 657,5,101,0,0,657,658,5,114,0,0,658,659,5,105,0,0,659,660,5,97,0, + 0,660,661,5,108,0,0,661,662,5,105,0,0,662,663,5,122,0,0,663,664, + 5,101,0,0,664,100,1,0,0,0,665,666,5,105,0,0,666,667,5,102,0,0,667, + 102,1,0,0,0,668,669,5,97,0,0,669,670,5,98,0,0,670,671,5,115,0,0, + 671,672,5,101,0,0,672,673,5,110,0,0,673,674,5,116,0,0,674,104,1, + 0,0,0,675,676,5,111,0,0,676,677,5,110,0,0,677,106,1,0,0,0,678,679, + 5,112,0,0,679,680,5,111,0,0,680,681,5,108,0,0,681,682,5,105,0,0, + 682,683,5,99,0,0,683,684,5,121,0,0,684,108,1,0,0,0,685,686,5,100, + 0,0,686,687,5,101,0,0,687,688,5,102,0,0,688,689,5,97,0,0,689,690, + 5,117,0,0,690,691,5,108,0,0,691,692,5,116,0,0,692,110,1,0,0,0,693, + 694,5,115,0,0,694,695,5,111,0,0,695,696,5,117,0,0,696,697,5,114, + 0,0,697,698,5,99,0,0,698,699,5,101,0,0,699,112,1,0,0,0,700,701,5, + 114,0,0,701,702,5,101,0,0,702,703,5,112,0,0,703,704,5,111,0,0,704, + 705,5,115,0,0,705,706,5,105,0,0,706,707,5,116,0,0,707,708,5,111, + 0,0,708,709,5,114,0,0,709,710,5,121,0,0,710,114,1,0,0,0,711,712, + 5,99,0,0,712,713,5,111,0,0,713,714,5,109,0,0,714,715,5,109,0,0,715, + 716,5,105,0,0,716,717,5,116,0,0,717,116,1,0,0,0,718,719,5,114,0, + 0,719,720,5,101,0,0,720,721,5,118,0,0,721,722,5,105,0,0,722,723, + 5,115,0,0,723,724,5,105,0,0,724,725,5,111,0,0,725,726,5,110,0,0, + 726,118,1,0,0,0,727,728,5,115,0,0,728,729,5,101,0,0,729,730,5,109, + 0,0,730,731,5,97,0,0,731,732,5,110,0,0,732,733,5,116,0,0,733,734, + 5,105,0,0,734,735,5,99,0,0,735,736,5,45,0,0,736,737,5,109,0,0,737, + 738,5,97,0,0,738,739,5,106,0,0,739,740,5,111,0,0,740,741,5,114,0, + 0,741,120,1,0,0,0,742,743,5,111,0,0,743,744,5,110,0,0,744,745,5, + 45,0,0,745,746,5,100,0,0,746,747,5,101,0,0,747,748,5,108,0,0,748, + 749,5,101,0,0,749,750,5,116,0,0,750,751,5,101,0,0,751,122,1,0,0, + 0,752,753,5,114,0,0,753,754,5,101,0,0,754,755,5,116,0,0,755,756, + 5,97,0,0,756,757,5,105,0,0,757,758,5,110,0,0,758,759,5,45,0,0,759, + 760,5,111,0,0,760,761,5,116,0,0,761,762,5,104,0,0,762,763,5,101, + 0,0,763,764,5,114,0,0,764,124,1,0,0,0,765,766,5,107,0,0,766,767, + 5,101,0,0,767,768,5,121,0,0,768,769,5,101,0,0,769,770,5,100,0,0, + 770,126,1,0,0,0,771,772,5,112,0,0,772,773,5,117,0,0,773,774,5,98, + 0,0,774,775,5,108,0,0,775,776,5,105,0,0,776,777,5,99,0,0,777,778, + 5,45,0,0,778,779,5,116,0,0,779,780,5,114,0,0,780,781,5,97,0,0,781, + 782,5,118,0,0,782,783,5,101,0,0,783,784,5,114,0,0,784,785,5,115, + 0,0,785,786,5,97,0,0,786,787,5,108,0,0,787,128,1,0,0,0,788,789,5, + 105,0,0,789,790,5,100,0,0,790,130,1,0,0,0,791,792,5,100,0,0,792, + 793,5,111,0,0,793,794,5,99,0,0,794,132,1,0,0,0,795,796,5,109,0,0, + 796,797,5,111,0,0,797,798,5,100,0,0,798,799,5,101,0,0,799,134,1, + 0,0,0,800,801,5,101,0,0,801,802,5,109,0,0,802,803,5,105,0,0,803, + 804,5,116,0,0,804,805,5,115,0,0,805,136,1,0,0,0,806,807,5,114,0, + 0,807,808,5,101,0,0,808,809,5,99,0,0,809,810,5,101,0,0,810,811,5, + 105,0,0,811,812,5,118,0,0,812,813,5,101,0,0,813,814,5,114,0,0,814, + 138,1,0,0,0,815,816,5,114,0,0,816,817,5,101,0,0,817,818,5,113,0, + 0,818,819,5,117,0,0,819,820,5,105,0,0,820,821,5,114,0,0,821,822, + 5,101,0,0,822,823,5,115,0,0,823,140,1,0,0,0,824,825,5,97,0,0,825, + 826,5,110,0,0,826,827,5,121,0,0,827,142,1,0,0,0,828,829,5,103,0, + 0,829,830,5,101,0,0,830,831,5,116,0,0,831,144,1,0,0,0,832,833,5, + 115,0,0,833,834,5,101,0,0,834,835,5,116,0,0,835,146,1,0,0,0,836, + 837,5,119,0,0,837,838,5,97,0,0,838,839,5,116,0,0,839,840,5,99,0, + 0,840,841,5,104,0,0,841,148,1,0,0,0,842,843,5,115,0,0,843,844,5, + 116,0,0,844,845,5,97,0,0,845,846,5,114,0,0,846,847,5,116,0,0,847, + 150,1,0,0,0,848,849,5,115,0,0,849,850,5,116,0,0,850,851,5,111,0, + 0,851,852,5,112,0,0,852,152,1,0,0,0,853,854,5,114,0,0,854,855,5, + 101,0,0,855,856,5,97,0,0,856,857,5,100,0,0,857,154,1,0,0,0,858,859, + 5,119,0,0,859,860,5,114,0,0,860,861,5,105,0,0,861,862,5,116,0,0, + 862,863,5,101,0,0,863,156,1,0,0,0,864,865,5,114,0,0,865,866,5,101, + 0,0,866,867,5,115,0,0,867,868,5,111,0,0,868,869,5,108,0,0,869,870, + 5,118,0,0,870,871,5,101,0,0,871,158,1,0,0,0,872,873,5,99,0,0,873, + 874,5,111,0,0,874,875,5,110,0,0,875,876,5,110,0,0,876,877,5,101, + 0,0,877,878,5,99,0,0,878,879,5,116,0,0,879,160,1,0,0,0,880,881,5, + 100,0,0,881,882,5,105,0,0,882,883,5,115,0,0,883,884,5,99,0,0,884, + 885,5,111,0,0,885,886,5,110,0,0,886,887,5,110,0,0,887,888,5,101, + 0,0,888,889,5,99,0,0,889,890,5,116,0,0,890,162,1,0,0,0,891,892,5, + 99,0,0,892,893,5,97,0,0,893,894,5,108,0,0,894,895,5,108,0,0,895, + 164,1,0,0,0,896,897,5,119,0,0,897,898,5,97,0,0,898,899,5,116,0,0, + 899,900,5,99,0,0,900,901,5,104,0,0,901,902,5,45,0,0,902,903,5,115, + 0,0,903,904,5,116,0,0,904,905,5,97,0,0,905,906,5,114,0,0,906,907, + 5,116,0,0,907,166,1,0,0,0,908,909,5,119,0,0,909,910,5,97,0,0,910, + 911,5,116,0,0,911,912,5,99,0,0,912,913,5,104,0,0,913,914,5,45,0, + 0,914,915,5,115,0,0,915,916,5,116,0,0,916,917,5,111,0,0,917,918, + 5,112,0,0,918,168,1,0,0,0,919,920,5,115,0,0,920,921,5,117,0,0,921, + 922,5,98,0,0,922,923,5,115,0,0,923,924,5,99,0,0,924,925,5,114,0, + 0,925,926,5,105,0,0,926,927,5,98,0,0,927,928,5,101,0,0,928,170,1, + 0,0,0,929,930,5,117,0,0,930,931,5,110,0,0,931,932,5,115,0,0,932, + 933,5,117,0,0,933,934,5,98,0,0,934,935,5,115,0,0,935,936,5,99,0, + 0,936,937,5,114,0,0,937,938,5,105,0,0,938,939,5,98,0,0,939,940,5, + 101,0,0,940,172,1,0,0,0,941,942,5,111,0,0,942,943,5,112,0,0,943, + 944,5,116,0,0,944,945,5,105,0,0,945,946,5,109,0,0,946,947,5,105, + 0,0,947,948,5,115,0,0,948,949,5,116,0,0,949,950,5,105,0,0,950,951, + 5,99,0,0,951,952,5,45,0,0,952,953,5,114,0,0,953,954,5,101,0,0,954, + 955,5,103,0,0,955,956,5,105,0,0,956,957,5,115,0,0,957,958,5,116, + 0,0,958,959,5,101,0,0,959,960,5,114,0,0,960,174,1,0,0,0,961,962, + 5,99,0,0,962,963,5,114,0,0,963,964,5,100,0,0,964,965,5,116,0,0,965, + 176,1,0,0,0,966,967,5,111,0,0,967,968,5,112,0,0,968,969,5,116,0, + 0,969,970,5,105,0,0,970,971,5,111,0,0,971,972,5,110,0,0,972,973, + 5,97,0,0,973,974,5,108,0,0,974,975,5,45,0,0,975,976,5,111,0,0,976, + 977,5,110,0,0,977,978,5,101,0,0,978,178,1,0,0,0,979,980,5,101,0, + 0,980,981,5,120,0,0,981,982,5,97,0,0,982,983,5,99,0,0,983,984,5, + 116,0,0,984,985,5,108,0,0,985,986,5,121,0,0,986,987,5,45,0,0,987, + 988,5,111,0,0,988,989,5,110,0,0,989,990,5,101,0,0,990,180,1,0,0, + 0,991,992,5,109,0,0,992,993,5,97,0,0,993,994,5,110,0,0,994,995,5, + 121,0,0,995,996,5,45,0,0,996,997,5,117,0,0,997,998,5,110,0,0,998, + 999,5,105,0,0,999,1000,5,113,0,0,1000,1001,5,117,0,0,1001,1002,5, + 101,0,0,1002,182,1,0,0,0,1003,1004,5,109,0,0,1004,1005,5,97,0,0, + 1005,1006,5,110,0,0,1006,1007,5,121,0,0,1007,184,1,0,0,0,1008,1009, + 5,111,0,0,1009,1010,5,114,0,0,1010,1011,5,100,0,0,1011,1012,5,101, + 0,0,1012,1013,5,114,0,0,1013,1014,5,101,0,0,1014,1015,5,100,0,0, + 1015,186,1,0,0,0,1016,1017,5,117,0,0,1017,1018,5,110,0,0,1018,1019, + 5,105,0,0,1019,1020,5,116,0,0,1020,188,1,0,0,0,1021,1022,5,119,0, + 0,1022,1023,5,97,0,0,1023,1024,5,116,0,0,1024,1025,5,99,0,0,1025, + 1026,5,104,0,0,1026,1027,5,45,0,0,1027,1028,5,104,0,0,1028,1029, + 5,97,0,0,1029,1030,5,110,0,0,1030,1031,5,100,0,0,1031,1032,5,108, + 0,0,1032,1033,5,101,0,0,1033,190,1,0,0,0,1034,1035,5,109,0,0,1035, + 1036,5,101,0,0,1036,1037,5,115,0,0,1037,1038,5,115,0,0,1038,1039, + 5,97,0,0,1039,1040,5,103,0,0,1040,1041,5,101,0,0,1041,192,1,0,0, + 0,1042,1043,5,97,0,0,1043,1044,5,116,0,0,1044,1045,5,111,0,0,1045, + 1046,5,109,0,0,1046,1047,5,45,0,0,1047,1048,5,114,0,0,1048,1049, + 5,101,0,0,1049,1050,5,102,0,0,1050,194,1,0,0,0,1051,1052,5,105,0, + 0,1052,1053,5,110,0,0,1053,1054,5,116,0,0,1054,1055,5,101,0,0,1055, + 1056,5,114,0,0,1056,1057,5,102,0,0,1057,1058,5,97,0,0,1058,1059, + 5,99,0,0,1059,1060,5,101,0,0,1060,1061,5,45,0,0,1061,1062,5,114, + 0,0,1062,1063,5,101,0,0,1063,1064,5,102,0,0,1064,196,1,0,0,0,1065, + 1066,5,111,0,0,1066,1067,5,112,0,0,1067,1068,5,116,0,0,1068,1069, + 5,105,0,0,1069,1070,5,111,0,0,1070,1071,5,110,0,0,1071,1072,5,97, + 0,0,1072,1073,5,108,0,0,1073,198,1,0,0,0,1074,1075,5,108,0,0,1075, + 1076,5,105,0,0,1076,1077,5,115,0,0,1077,1078,5,116,0,0,1078,200, + 1,0,0,0,1079,1080,5,114,0,0,1080,1081,5,101,0,0,1081,1082,5,99,0, + 0,1082,1083,5,111,0,0,1083,1084,5,114,0,0,1084,1085,5,100,0,0,1085, + 202,1,0,0,0,1086,1087,5,98,0,0,1087,1088,5,111,0,0,1088,1089,5,111, + 0,0,1089,1090,5,108,0,0,1090,204,1,0,0,0,1091,1092,5,98,0,0,1092, + 1093,5,121,0,0,1093,1094,5,116,0,0,1094,1095,5,101,0,0,1095,1096, + 5,115,0,0,1096,206,1,0,0,0,1097,1098,5,100,0,0,1098,1099,5,111,0, + 0,1099,1100,5,117,0,0,1100,1101,5,98,0,0,1101,1102,5,108,0,0,1102, + 1103,5,101,0,0,1103,208,1,0,0,0,1104,1105,5,105,0,0,1105,1106,5, + 110,0,0,1106,1107,5,116,0,0,1107,1108,5,51,0,0,1108,1109,5,50,0, + 0,1109,210,1,0,0,0,1110,1111,5,105,0,0,1111,1112,5,110,0,0,1112, + 1113,5,116,0,0,1113,1114,5,54,0,0,1114,1115,5,52,0,0,1115,212,1, + 0,0,0,1116,1117,5,115,0,0,1117,1118,5,116,0,0,1118,1119,5,114,0, + 0,1119,1120,5,105,0,0,1120,1121,5,110,0,0,1121,1122,5,103,0,0,1122, + 214,1,0,0,0,1123,1124,5,117,0,0,1124,1125,5,105,0,0,1125,1126,5, + 110,0,0,1126,1127,5,116,0,0,1127,1128,5,51,0,0,1128,1129,5,50,0, + 0,1129,216,1,0,0,0,1130,1131,5,117,0,0,1131,1132,5,105,0,0,1132, + 1133,5,110,0,0,1133,1134,5,116,0,0,1134,1135,5,54,0,0,1135,1136, + 5,52,0,0,1136,218,1,0,0,0,1137,1138,5,116,0,0,1138,1139,5,114,0, + 0,1139,1140,5,117,0,0,1140,1141,5,101,0,0,1141,220,1,0,0,0,1142, + 1143,5,102,0,0,1143,1144,5,97,0,0,1144,1145,5,108,0,0,1145,1146, + 5,115,0,0,1146,1147,5,101,0,0,1147,222,1,0,0,0,1148,1149,5,110,0, + 0,1149,1150,5,117,0,0,1150,1151,5,108,0,0,1151,1152,5,108,0,0,1152, + 224,1,0,0,0,1153,1154,5,45,0,0,1154,1155,5,62,0,0,1155,226,1,0,0, + 0,1156,1157,5,58,0,0,1157,228,1,0,0,0,1158,1159,5,59,0,0,1159,230, + 1,0,0,0,1160,1161,5,44,0,0,1161,232,1,0,0,0,1162,1163,5,46,0,0,1163, + 234,1,0,0,0,1164,1165,5,123,0,0,1165,236,1,0,0,0,1166,1167,5,125, + 0,0,1167,238,1,0,0,0,1168,1169,5,91,0,0,1169,240,1,0,0,0,1170,1171, + 5,93,0,0,1171,242,1,0,0,0,1172,1173,5,40,0,0,1173,244,1,0,0,0,1174, + 1175,5,41,0,0,1175,246,1,0,0,0,1176,1177,5,60,0,0,1177,248,1,0,0, + 0,1178,1179,5,62,0,0,1179,250,1,0,0,0,1180,1181,5,38,0,0,1181,252, + 1,0,0,0,1182,1183,5,61,0,0,1183,254,1,0,0,0,1184,1186,5,45,0,0,1185, + 1184,1,0,0,0,1185,1186,1,0,0,0,1186,1188,1,0,0,0,1187,1189,7,0,0, + 0,1188,1187,1,0,0,0,1189,1190,1,0,0,0,1190,1188,1,0,0,0,1190,1191, + 1,0,0,0,1191,256,1,0,0,0,1192,1194,5,45,0,0,1193,1192,1,0,0,0,1193, + 1194,1,0,0,0,1194,1203,1,0,0,0,1195,1204,5,48,0,0,1196,1200,7,1, + 0,0,1197,1199,7,0,0,0,1198,1197,1,0,0,0,1199,1202,1,0,0,0,1200,1198, + 1,0,0,0,1200,1201,1,0,0,0,1201,1204,1,0,0,0,1202,1200,1,0,0,0,1203, + 1195,1,0,0,0,1203,1196,1,0,0,0,1204,1211,1,0,0,0,1205,1207,5,46, + 0,0,1206,1208,7,0,0,0,1207,1206,1,0,0,0,1208,1209,1,0,0,0,1209,1207, + 1,0,0,0,1209,1210,1,0,0,0,1210,1212,1,0,0,0,1211,1205,1,0,0,0,1211, + 1212,1,0,0,0,1212,1222,1,0,0,0,1213,1215,7,2,0,0,1214,1216,7,3,0, + 0,1215,1214,1,0,0,0,1215,1216,1,0,0,0,1216,1218,1,0,0,0,1217,1219, + 7,0,0,0,1218,1217,1,0,0,0,1219,1220,1,0,0,0,1220,1218,1,0,0,0,1220, + 1221,1,0,0,0,1221,1223,1,0,0,0,1222,1213,1,0,0,0,1222,1223,1,0,0, + 0,1223,258,1,0,0,0,1224,1228,7,4,0,0,1225,1227,7,5,0,0,1226,1225, + 1,0,0,0,1227,1230,1,0,0,0,1228,1226,1,0,0,0,1228,1229,1,0,0,0,1229, + 260,1,0,0,0,1230,1228,1,0,0,0,1231,1236,5,34,0,0,1232,1235,3,263, + 131,0,1233,1235,8,6,0,0,1234,1232,1,0,0,0,1234,1233,1,0,0,0,1235, + 1238,1,0,0,0,1236,1234,1,0,0,0,1236,1237,1,0,0,0,1237,1239,1,0,0, + 0,1238,1236,1,0,0,0,1239,1240,5,34,0,0,1240,262,1,0,0,0,1241,1249, + 5,92,0,0,1242,1250,7,7,0,0,1243,1244,5,117,0,0,1244,1245,3,265,132, + 0,1245,1246,3,265,132,0,1246,1247,3,265,132,0,1247,1248,3,265,132, + 0,1248,1250,1,0,0,0,1249,1242,1,0,0,0,1249,1243,1,0,0,0,1250,264, + 1,0,0,0,1251,1252,7,8,0,0,1252,266,1,0,0,0,1253,1254,5,47,0,0,1254, + 1255,5,47,0,0,1255,1259,1,0,0,0,1256,1258,8,9,0,0,1257,1256,1,0, + 0,0,1258,1261,1,0,0,0,1259,1257,1,0,0,0,1259,1260,1,0,0,0,1260,1262, + 1,0,0,0,1261,1259,1,0,0,0,1262,1263,6,133,0,0,1263,268,1,0,0,0,1264, + 1265,5,47,0,0,1265,1266,5,42,0,0,1266,1270,1,0,0,0,1267,1269,9,0, + 0,0,1268,1267,1,0,0,0,1269,1272,1,0,0,0,1270,1271,1,0,0,0,1270,1268, + 1,0,0,0,1271,1273,1,0,0,0,1272,1270,1,0,0,0,1273,1274,5,42,0,0,1274, + 1275,5,47,0,0,1275,1276,1,0,0,0,1276,1277,6,134,0,0,1277,270,1,0, + 0,0,1278,1280,7,10,0,0,1279,1278,1,0,0,0,1280,1281,1,0,0,0,1281, + 1279,1,0,0,0,1281,1282,1,0,0,0,1282,1283,1,0,0,0,1283,1284,6,135, + 0,0,1284,272,1,0,0,0,18,0,1185,1190,1193,1200,1203,1209,1211,1215, + 1220,1222,1228,1234,1236,1249,1259,1270,1281,1,0,1,0 ]; private static __ATN: antlr.ATN; diff --git a/src/capability-language/generated/QuixosCapabilityParser.ts b/src/capability-language/generated/QuixosCapabilityParser.ts index 15d773b..b77d280 100644 --- a/src/capability-language/generated/QuixosCapabilityParser.ts +++ b/src/capability-language/generated/QuixosCapabilityParser.ts @@ -15,134 +15,135 @@ export class QuixosCapabilityParser extends antlr.Parser { public static readonly RPC_CALLS = 3; public static readonly DEADLINE_MS = 4; public static readonly QUERY = 5; - public static readonly SPECIALIZE = 6; - public static readonly ROOT = 7; - public static readonly DOCUMENT = 8; - public static readonly FRAGMENTS = 9; - public static readonly VIEW = 10; - public static readonly MAX = 11; - public static readonly ALLOW = 12; - public static readonly POLL = 13; - public static readonly QUERYABLE = 14; - public static readonly RPC = 15; - public static readonly QUERY_REASON = 16; - public static readonly TYPE = 17; - public static readonly OBJECT = 18; - public static readonly STORABLE = 19; - public static readonly IMPLEMENTS = 20; - public static readonly REF = 21; - public static readonly FRAGMENT = 22; - public static readonly IMPORT = 23; - public static readonly EXTERNAL = 24; - public static readonly ATOM = 25; - public static readonly INTERFACE = 26; - public static readonly INTERFACES = 27; - public static readonly PACKAGE = 28; - public static readonly VALUE = 29; - public static readonly RELATION = 30; - public static readonly OPERATION = 31; - public static readonly FUNCTION = 32; - public static readonly CONSTRUCTOR = 33; - public static readonly CONSTRUCTS = 34; - public static readonly INPUT = 35; - public static readonly CONFORM = 36; - public static readonly AS = 37; - public static readonly BIND = 38; - public static readonly STATIC = 39; - public static readonly TO = 40; - public static readonly PRIVATE = 41; - public static readonly SHARED = 42; - public static readonly STATE = 43; - public static readonly EDGE = 44; - public static readonly PROJECTION = 45; - public static readonly WITH = 46; - public static readonly USING = 47; - public static readonly VIA = 48; - public static readonly MATERIALIZE = 49; - public static readonly IF = 50; - public static readonly ABSENT = 51; - public static readonly ON = 52; - public static readonly POLICY = 53; - public static readonly DEFAULT = 54; - public static readonly SOURCE = 55; - public static readonly REPOSITORY = 56; - public static readonly COMMIT = 57; - public static readonly REVISION = 58; - public static readonly SEMANTIC_MAJOR = 59; - public static readonly ON_DELETE = 60; - public static readonly RETAIN_OTHER = 61; - public static readonly KEYED = 62; - public static readonly PUBLIC_TRAVERSAL = 63; - public static readonly ID = 64; - public static readonly DOC = 65; - public static readonly MODE = 66; - public static readonly EMITS = 67; - public static readonly RECEIVER = 68; - public static readonly REQUIRES = 69; - public static readonly ANY = 70; - public static readonly GET = 71; - public static readonly SET = 72; - public static readonly WATCH = 73; - public static readonly START = 74; - public static readonly STOP = 75; - public static readonly READ = 76; - public static readonly WRITE = 77; - public static readonly RESOLVE = 78; - public static readonly CONNECT = 79; - public static readonly DISCONNECT = 80; - public static readonly CALL = 81; - public static readonly WATCH_START = 82; - public static readonly WATCH_STOP = 83; - public static readonly SUBSCRIBE = 84; - public static readonly UNSUBSCRIBE = 85; - public static readonly OPTIMISTIC_REGISTER = 86; - public static readonly CRDT = 87; - public static readonly OPTIONAL_ONE = 88; - public static readonly EXACTLY_ONE = 89; - public static readonly MANY_UNIQUE = 90; - public static readonly MANY = 91; - public static readonly ORDERED = 92; - public static readonly UNIT = 93; - public static readonly WATCH_HANDLE = 94; - public static readonly MESSAGE = 95; - public static readonly ATOM_REF = 96; - public static readonly INTERFACE_REF = 97; - public static readonly OPTIONAL = 98; - public static readonly LIST = 99; - public static readonly RECORD = 100; - public static readonly BOOL = 101; - public static readonly BYTES = 102; - public static readonly DOUBLE = 103; - public static readonly INT32 = 104; - public static readonly INT64 = 105; - public static readonly STRING = 106; - public static readonly UINT32 = 107; - public static readonly UINT64 = 108; - public static readonly TRUE = 109; - public static readonly FALSE = 110; - public static readonly NULL = 111; - public static readonly ARROW = 112; - public static readonly COLON = 113; - public static readonly SEMI = 114; - public static readonly COMMA = 115; - public static readonly DOT = 116; - public static readonly LBRACE = 117; - public static readonly RBRACE = 118; - public static readonly LBRACK = 119; - public static readonly RBRACK = 120; - public static readonly LPAREN = 121; - public static readonly RPAREN = 122; - public static readonly LT = 123; - public static readonly GT = 124; - public static readonly AMP = 125; - public static readonly EQUAL = 126; - public static readonly INTEGER = 127; - public static readonly JSON_NUMBER = 128; - public static readonly IDENTIFIER = 129; - public static readonly STRING_LITERAL = 130; - public static readonly LINE_COMMENT = 131; - public static readonly BLOCK_COMMENT = 132; - public static readonly WS = 133; + public static readonly REFLECTION = 6; + public static readonly SPECIALIZE = 7; + public static readonly ROOT = 8; + public static readonly DOCUMENT = 9; + public static readonly FRAGMENTS = 10; + public static readonly VIEW = 11; + public static readonly MAX = 12; + public static readonly ALLOW = 13; + public static readonly POLL = 14; + public static readonly QUERYABLE = 15; + public static readonly RPC = 16; + public static readonly QUERY_REASON = 17; + public static readonly TYPE = 18; + public static readonly OBJECT = 19; + public static readonly STORABLE = 20; + public static readonly IMPLEMENTS = 21; + public static readonly REF = 22; + public static readonly FRAGMENT = 23; + public static readonly IMPORT = 24; + public static readonly EXTERNAL = 25; + public static readonly ATOM = 26; + public static readonly INTERFACE = 27; + public static readonly INTERFACES = 28; + public static readonly PACKAGE = 29; + public static readonly VALUE = 30; + public static readonly RELATION = 31; + public static readonly OPERATION = 32; + public static readonly FUNCTION = 33; + public static readonly CONSTRUCTOR = 34; + public static readonly CONSTRUCTS = 35; + public static readonly INPUT = 36; + public static readonly CONFORM = 37; + public static readonly AS = 38; + public static readonly BIND = 39; + public static readonly STATIC = 40; + public static readonly TO = 41; + public static readonly PRIVATE = 42; + public static readonly SHARED = 43; + public static readonly STATE = 44; + public static readonly EDGE = 45; + public static readonly PROJECTION = 46; + public static readonly WITH = 47; + public static readonly USING = 48; + public static readonly VIA = 49; + public static readonly MATERIALIZE = 50; + public static readonly IF = 51; + public static readonly ABSENT = 52; + public static readonly ON = 53; + public static readonly POLICY = 54; + public static readonly DEFAULT = 55; + public static readonly SOURCE = 56; + public static readonly REPOSITORY = 57; + public static readonly COMMIT = 58; + public static readonly REVISION = 59; + public static readonly SEMANTIC_MAJOR = 60; + public static readonly ON_DELETE = 61; + public static readonly RETAIN_OTHER = 62; + public static readonly KEYED = 63; + public static readonly PUBLIC_TRAVERSAL = 64; + public static readonly ID = 65; + public static readonly DOC = 66; + public static readonly MODE = 67; + public static readonly EMITS = 68; + public static readonly RECEIVER = 69; + public static readonly REQUIRES = 70; + public static readonly ANY = 71; + public static readonly GET = 72; + public static readonly SET = 73; + public static readonly WATCH = 74; + public static readonly START = 75; + public static readonly STOP = 76; + public static readonly READ = 77; + public static readonly WRITE = 78; + public static readonly RESOLVE = 79; + public static readonly CONNECT = 80; + public static readonly DISCONNECT = 81; + public static readonly CALL = 82; + public static readonly WATCH_START = 83; + public static readonly WATCH_STOP = 84; + public static readonly SUBSCRIBE = 85; + public static readonly UNSUBSCRIBE = 86; + public static readonly OPTIMISTIC_REGISTER = 87; + public static readonly CRDT = 88; + public static readonly OPTIONAL_ONE = 89; + public static readonly EXACTLY_ONE = 90; + public static readonly MANY_UNIQUE = 91; + public static readonly MANY = 92; + public static readonly ORDERED = 93; + public static readonly UNIT = 94; + public static readonly WATCH_HANDLE = 95; + public static readonly MESSAGE = 96; + public static readonly ATOM_REF = 97; + public static readonly INTERFACE_REF = 98; + public static readonly OPTIONAL = 99; + public static readonly LIST = 100; + public static readonly RECORD = 101; + public static readonly BOOL = 102; + public static readonly BYTES = 103; + public static readonly DOUBLE = 104; + public static readonly INT32 = 105; + public static readonly INT64 = 106; + public static readonly STRING = 107; + public static readonly UINT32 = 108; + public static readonly UINT64 = 109; + public static readonly TRUE = 110; + public static readonly FALSE = 111; + public static readonly NULL = 112; + public static readonly ARROW = 113; + public static readonly COLON = 114; + public static readonly SEMI = 115; + public static readonly COMMA = 116; + public static readonly DOT = 117; + public static readonly LBRACE = 118; + public static readonly RBRACE = 119; + public static readonly LBRACK = 120; + public static readonly RBRACK = 121; + public static readonly LPAREN = 122; + public static readonly RPAREN = 123; + public static readonly LT = 124; + public static readonly GT = 125; + public static readonly AMP = 126; + public static readonly EQUAL = 127; + public static readonly INTEGER = 128; + public static readonly JSON_NUMBER = 129; + public static readonly IDENTIFIER = 130; + public static readonly STRING_LITERAL = 131; + public static readonly LINE_COMMENT = 132; + public static readonly BLOCK_COMMENT = 133; + public static readonly WS = 134; public static readonly RULE_document = 0; public static readonly RULE_fragmentDecl = 1; public static readonly RULE_sourceImportDecl = 2; @@ -216,9 +217,9 @@ export class QuixosCapabilityParser extends antlr.Parser { public static readonly literalNames = [ null, "'workspace'", "'result-bytes'", "'rpc-calls'", "'deadline-ms'", - "'query'", "'specialize'", "'root'", "'document'", "'fragments'", - "'view'", "'max'", "'allow'", "'poll'", "'queryable'", "'rpc'", - "'query-reason'", "'type'", "'object'", "'storable'", "'implements'", + "'query'", "'reflection'", "'specialize'", "'root'", "'document'", + "'fragments'", "'view'", "'max'", "'allow'", "'poll'", "'queryable'", + "'rpc'", "'query-reason'", "'type'", "'object'", "'storable'", "'implements'", "'ref'", "'fragment'", "'import'", "'external'", "'atom'", "'interface'", "'interfaces'", "'package'", "'value'", "'relation'", "'operation'", "'function'", "'constructor'", "'constructs'", "'input'", "'conform'", @@ -241,26 +242,27 @@ export class QuixosCapabilityParser extends antlr.Parser { public static readonly symbolicNames = [ null, "WORKSPACE", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", - "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", "MAX", "ALLOW", - "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", "OBJECT", "STORABLE", - "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", - "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", - "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", - "TO", "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", - "USING", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", - "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", - "ON_DELETE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", - "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", - "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", - "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", - "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", - "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", - "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", "BOOL", - "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", - "TRUE", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", - "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", - "GT", "AMP", "EQUAL", "INTEGER", "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", - "LINE_COMMENT", "BLOCK_COMMENT", "WS" + "REFLECTION", "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", + "MAX", "ALLOW", "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", + "OBJECT", "STORABLE", "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", + "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", + "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", + "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", "PRIVATE", "SHARED", + "STATE", "EDGE", "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", + "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", + "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", "RETAIN_OTHER", + "KEYED", "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", "EMITS", "RECEIVER", + "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", + "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", + "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", + "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", + "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", + "OPTIONAL", "LIST", "RECORD", "BOOL", "BYTES", "DOUBLE", "INT32", + "INT64", "STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", + "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", + "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "AMP", "EQUAL", "INTEGER", + "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", + "WS" ]; public static readonly ruleNames = [ "document", "fragmentDecl", "sourceImportDecl", "workspaceDecl", @@ -370,7 +372,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 159; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 17)) & ~0x1F) === 0 && ((1 << (_la - 17)) & 34144577) !== 0)) { + while (((((_la - 18)) & ~0x1F) === 0 && ((1 << (_la - 18)) & 34144577) !== 0)) { { { this.state = 156; @@ -453,7 +455,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 180; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 17)) & ~0x1F) === 0 && ((1 << (_la - 17)) & 34144577) !== 0)) { + while (((((_la - 18)) & ~0x1F) === 0 && ((1 << (_la - 18)) & 34144577) !== 0)) { { { this.state = 177; @@ -734,7 +736,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 232; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 65) { + if (_la === 66) { { this.state = 230; this.match(QuixosCapabilityParser.DOC); @@ -770,7 +772,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 239; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 25296896) !== 0)) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 50593792) !== 0)) { { { this.state = 236; @@ -788,7 +790,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 245; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 123) { + if (_la === 124) { { this.state = 244; this.typeParameters(); @@ -806,7 +808,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 260; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 69) { + if (_la === 70) { { this.state = 251; this.match(QuixosCapabilityParser.REQUIRES); @@ -815,7 +817,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 257; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 115) { + while (_la === 116) { { { this.state = 253; @@ -836,7 +838,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 266; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 14)) & ~0x1F) === 0 && ((1 << (_la - 14)) & 33783809) !== 0)) { + while (((((_la - 15)) & ~0x1F) === 0 && ((1 << (_la - 15)) & 33783809) !== 0)) { { { this.state = 263; @@ -878,7 +880,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 277; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 115) { + while (_la === 116) { { { this.state = 273; @@ -926,7 +928,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 286; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 113) { + if (_la === 114) { { this.state = 284; this.match(QuixosCapabilityParser.COLON); @@ -947,7 +949,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 299; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 20) { + if (_la === 21) { { this.state = 290; this.match(QuixosCapabilityParser.IMPLEMENTS); @@ -956,7 +958,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 296; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 125) { + while (_la === 126) { { { this.state = 292; @@ -1003,7 +1005,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 305; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 123) { + if (_la === 124) { { this.state = 304; this.typeArguments(); @@ -1039,7 +1041,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 313; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 115) { + while (_la === 116) { { { this.state = 309; @@ -1107,6 +1109,7 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.RPC_CALLS: case QuixosCapabilityParser.DEADLINE_MS: case QuixosCapabilityParser.QUERY: + case QuixosCapabilityParser.REFLECTION: case QuixosCapabilityParser.SPECIALIZE: case QuixosCapabilityParser.ROOT: case QuixosCapabilityParser.DOCUMENT: @@ -1118,6 +1121,7 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.QUERYABLE: case QuixosCapabilityParser.RPC: case QuixosCapabilityParser.REF: + case QuixosCapabilityParser.INTERFACES: case QuixosCapabilityParser.SOURCE: case QuixosCapabilityParser.UNIT: case QuixosCapabilityParser.WATCH_HANDLE: @@ -1173,7 +1177,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 330; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 123) { + if (_la === 124) { { this.state = 329; this.typeParameters(); @@ -1254,7 +1258,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 342; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 39) { + if (_la === 40) { { this.state = 341; this.match(QuixosCapabilityParser.STATIC); @@ -1314,7 +1318,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 360; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 14) { + if (_la === 15) { { this.state = 359; this.queryReadContract(); @@ -1338,7 +1342,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 372; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 71)) & ~0x1F) === 0 && ((1 << (_la - 71)) & 7) !== 0)) { + while (((((_la - 72)) & ~0x1F) === 0 && ((1 << (_la - 72)) & 7) !== 0)) { { { this.state = 369; @@ -1447,7 +1451,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 399; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 14) { + if (_la === 15) { { this.state = 398; this.queryReadContract(); @@ -1471,7 +1475,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 409; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 92) { + if (_la === 93) { { this.state = 408; this.match(QuixosCapabilityParser.ORDERED); @@ -1481,7 +1485,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 413; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 62) { + if (_la === 63) { { this.state = 411; this.match(QuixosCapabilityParser.KEYED); @@ -1495,7 +1499,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 419; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 73)) & ~0x1F) === 0 && ((1 << (_la - 73)) & 225) !== 0)) { + while (((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 225) !== 0)) { { { this.state = 416; @@ -1535,7 +1539,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 426; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 15) { + if (_la === 16) { { this.state = 425; this.match(QuixosCapabilityParser.RPC); @@ -1668,7 +1672,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 459; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 123) { + if (_la === 124) { { this.state = 458; this.typeArguments(); @@ -1713,7 +1717,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 468; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 25296896) !== 0)) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 50593792) !== 0)) { { { this.state = 465; @@ -1739,7 +1743,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 479; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 59) { + if (_la === 60) { { this.state = 477; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); @@ -1753,7 +1757,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 485; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 5)) & ~0x1F) === 0 && ((1 << (_la - 5)) & 469762049) !== 0)) { + while (((((_la - 5)) & ~0x1F) === 0 && ((1 << (_la - 5)) & 939524097) !== 0)) { { { this.state = 482; @@ -1852,7 +1856,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 500; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 123) { + if (_la === 124) { { this.state = 499; this.typeParameters(); @@ -1890,7 +1894,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 517; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 15872) !== 0) || _la === 73) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 31744) !== 0) || _la === 74) { { { this.state = 514; @@ -1982,7 +1986,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 537; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 18) { + if (_la === 19) { { this.state = 536; this.match(QuixosCapabilityParser.OBJECT); @@ -2084,7 +2088,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 569; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 123) { + if (_la === 124) { { this.state = 568; this.typeParameters(); @@ -2110,7 +2114,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 580; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 67) { + if (_la === 68) { { this.state = 579; this.eventClause(); @@ -2124,7 +2128,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 585; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 69) { + if (_la === 70) { { this.state = 584; this.dependencyBlock(); @@ -2162,7 +2166,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 592; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 123) { + if (_la === 124) { { this.state = 591; this.typeParameters(); @@ -2184,7 +2188,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 601; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 69) { + if (_la === 70) { { this.state = 600; this.dependencyBlock(); @@ -2234,7 +2238,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 614; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 69) { + if (_la === 70) { { this.state = 613; this.dependencyBlock(); @@ -2292,7 +2296,7 @@ export class QuixosCapabilityParser extends antlr.Parser { { this.state = 621; _la = this.tokenStream.LA(1); - if(!(((((_la - 81)) & ~0x1F) === 0 && ((1 << (_la - 81)) & 31) !== 0))) { + if(!(((((_la - 82)) & ~0x1F) === 0 && ((1 << (_la - 82)) & 31) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2357,14 +2361,14 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 638; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 65532) !== 0) || _la === 55 || _la === 129) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 268566524) !== 0) || _la === 56 || _la === 130) { { this.state = 630; this.interfaceType(); this.state = 635; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 115) { + while (_la === 116) { { { this.state = 631; @@ -2413,7 +2417,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 648; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 115) { + while (_la === 116) { { { this.state = 644; @@ -2455,7 +2459,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 656; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 5 || _la === 26 || ((((_la - 33)) & ~0x1F) === 0 && ((1 << (_la - 33)) & 3073) !== 0)) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 134217824) !== 0) || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & 3073) !== 0)) { { { this.state = 653; @@ -2488,14 +2492,14 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 76, QuixosCapabilityParser.RULE_dependencyPort); let _la: number; try { - this.state = 713; + this.state = 722; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { - case QuixosCapabilityParser.STATE: + case QuixosCapabilityParser.REFLECTION: this.enterOuterAlt(localContext, 1); { this.state = 661; - this.match(QuixosCapabilityParser.STATE); + this.match(QuixosCapabilityParser.REFLECTION); this.state = 662; this.identifier(); this.state = 663; @@ -2503,20 +2507,20 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 664; this.stringLiteral(); this.state = 665; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.LBRACK); this.state = 666; - this.valueType(); + this.identifierList(); this.state = 667; - this.primitiveList(); + this.match(QuixosCapabilityParser.RBRACK); this.state = 668; this.match(QuixosCapabilityParser.SEMI); } break; - case QuixosCapabilityParser.EDGE: + case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 2); { this.state = 670; - this.match(QuixosCapabilityParser.EDGE); + this.match(QuixosCapabilityParser.STATE); this.state = 671; this.identifier(); this.state = 672; @@ -2526,95 +2530,116 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 674; this.match(QuixosCapabilityParser.COLON); this.state = 675; - this.cardinality(); + this.valueType(); this.state = 676; - this.targetConstraint(); - this.state = 677; this.primitiveList(); - this.state = 678; + this.state = 677; + this.match(QuixosCapabilityParser.SEMI); + } + break; + case QuixosCapabilityParser.EDGE: + this.enterOuterAlt(localContext, 3); + { + this.state = 679; + this.match(QuixosCapabilityParser.EDGE); + this.state = 680; + this.identifier(); + this.state = 681; + this.match(QuixosCapabilityParser.ID); + this.state = 682; + this.stringLiteral(); + this.state = 683; + this.match(QuixosCapabilityParser.COLON); + this.state = 684; + this.cardinality(); + this.state = 685; + this.targetConstraint(); + this.state = 686; + this.primitiveList(); + this.state = 687; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.INTERFACE: - this.enterOuterAlt(localContext, 3); + this.enterOuterAlt(localContext, 4); { - this.state = 680; + this.state = 689; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 681; + this.state = 690; this.identifier(); - this.state = 682; + this.state = 691; this.match(QuixosCapabilityParser.ID); - this.state = 683; + this.state = 692; this.stringLiteral(); - this.state = 684; + this.state = 693; this.match(QuixosCapabilityParser.COLON); - this.state = 685; + this.state = 694; this.identifier(); - this.state = 687; + this.state = 696; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 123) { + if (_la === 124) { { - this.state = 686; + this.state = 695; this.typeArguments(); } } - this.state = 689; + this.state = 698; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONSTRUCTOR: - this.enterOuterAlt(localContext, 4); + this.enterOuterAlt(localContext, 5); { - this.state = 691; + this.state = 700; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 692; + this.state = 701; this.identifier(); - this.state = 693; + this.state = 702; this.match(QuixosCapabilityParser.ID); - this.state = 694; + this.state = 703; this.stringLiteral(); - this.state = 695; + this.state = 704; this.match(QuixosCapabilityParser.COLON); - this.state = 696; + this.state = 705; this.identifier(); - this.state = 699; + this.state = 708; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 35) { + if (_la === 36) { { - this.state = 697; + this.state = 706; this.match(QuixosCapabilityParser.INPUT); - this.state = 698; + this.state = 707; this.valueType(); } } - this.state = 701; + this.state = 710; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.QUERY: - this.enterOuterAlt(localContext, 5); + this.enterOuterAlt(localContext, 6); { - this.state = 703; + this.state = 712; this.match(QuixosCapabilityParser.QUERY); - this.state = 704; + this.state = 713; this.identifier(); - this.state = 705; + this.state = 714; this.match(QuixosCapabilityParser.ID); - this.state = 706; + this.state = 715; this.stringLiteral(); - this.state = 707; + this.state = 716; this.match(QuixosCapabilityParser.COLON); - this.state = 708; + this.state = 717; this.identifier(); - this.state = 709; + this.state = 718; this.match(QuixosCapabilityParser.DOT); - this.state = 710; + this.state = 719; this.identifier(); - this.state = 711; + this.state = 720; this.match(QuixosCapabilityParser.SEMI); } break; @@ -2642,27 +2667,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 715; + this.state = 724; this.match(QuixosCapabilityParser.LBRACK); - this.state = 716; + this.state = 725; this.primitive(); - this.state = 721; + this.state = 730; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 115) { + while (_la === 116) { { { - this.state = 717; + this.state = 726; this.match(QuixosCapabilityParser.COMMA); - this.state = 718; + this.state = 727; this.primitive(); } } - this.state = 723; + this.state = 732; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 724; + this.state = 733; this.match(QuixosCapabilityParser.RBRACK); } } @@ -2686,9 +2711,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 726; + this.state = 735; _la = this.tokenStream.LA(1); - if(!(((((_la - 76)) & ~0x1F) === 0 && ((1 << (_la - 76)) & 223) !== 0))) { + if(!(((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 223) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2716,9 +2741,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 728; + this.state = 737; this.match(QuixosCapabilityParser.SHARED); - this.state = 729; + this.state = 738; this.attachmentDecl(); } } @@ -2739,20 +2764,20 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new AttachmentDeclContext(this.context, this.state); this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_attachmentDecl); try { - this.state = 733; + this.state = 742; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 731; + this.state = 740; this.stateDecl(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 732; + this.state = 741; this.edgeDecl(); } break; @@ -2780,39 +2805,39 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 735; - this.match(QuixosCapabilityParser.STATE); - this.state = 736; - this.identifier(); - this.state = 737; - this.match(QuixosCapabilityParser.ID); - this.state = 738; - this.stringLiteral(); - this.state = 739; - this.match(QuixosCapabilityParser.ON); - this.state = 740; - this.identifier(); - this.state = 741; - this.match(QuixosCapabilityParser.COLON); - this.state = 742; - this.valueType(); - this.state = 743; - this.match(QuixosCapabilityParser.POLICY); this.state = 744; - this.storagePolicy(); + this.match(QuixosCapabilityParser.STATE); + this.state = 745; + this.identifier(); + this.state = 746; + this.match(QuixosCapabilityParser.ID); this.state = 747; + this.stringLiteral(); + this.state = 748; + this.match(QuixosCapabilityParser.ON); + this.state = 749; + this.identifier(); + this.state = 750; + this.match(QuixosCapabilityParser.COLON); + this.state = 751; + this.valueType(); + this.state = 752; + this.match(QuixosCapabilityParser.POLICY); + this.state = 753; + this.storagePolicy(); + this.state = 756; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 54) { + if (_la === 55) { { - this.state = 745; + this.state = 754; this.match(QuixosCapabilityParser.DEFAULT); - this.state = 746; + this.state = 755; this.jsonLiteral(); } } - this.state = 749; + this.state = 758; this.match(QuixosCapabilityParser.SEMI); } } @@ -2833,26 +2858,26 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new StoragePolicyContext(this.context, this.state); this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_storagePolicy); try { - this.state = 757; + this.state = 766; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.OPTIMISTIC_REGISTER: this.enterOuterAlt(localContext, 1); { - this.state = 751; + this.state = 760; this.match(QuixosCapabilityParser.OPTIMISTIC_REGISTER); } break; case QuixosCapabilityParser.CRDT: this.enterOuterAlt(localContext, 2); { - this.state = 752; + this.state = 761; this.match(QuixosCapabilityParser.CRDT); - this.state = 753; + this.state = 762; this.match(QuixosCapabilityParser.LPAREN); - this.state = 754; + this.state = 763; this.valueType(); - this.state = 755; + this.state = 764; this.match(QuixosCapabilityParser.RPAREN); } break; @@ -2879,21 +2904,21 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 759; + this.state = 768; this.match(QuixosCapabilityParser.EDGE); - this.state = 760; + this.state = 769; this.identifier(); - this.state = 761; + this.state = 770; this.match(QuixosCapabilityParser.ID); - this.state = 762; + this.state = 771; this.stringLiteral(); - this.state = 763; + this.state = 772; this.match(QuixosCapabilityParser.LBRACE); - this.state = 764; + this.state = 773; this.edgeEndpoint(); - this.state = 765; + this.state = 774; this.edgeEndpoint(); - this.state = 766; + this.state = 775; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2917,73 +2942,73 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 768; + this.state = 777; this.targetConstraint(); - this.state = 769; + this.state = 778; this.match(QuixosCapabilityParser.PROJECTION); - this.state = 770; + this.state = 779; this.identifier(); - this.state = 771; + this.state = 780; this.match(QuixosCapabilityParser.ID); - this.state = 772; + this.state = 781; this.stringLiteral(); - this.state = 773; + this.state = 782; this.cardinality(); - this.state = 775; + this.state = 784; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 92) { + if (_la === 93) { { - this.state = 774; + this.state = 783; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 779; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 60) { - { - this.state = 777; - this.match(QuixosCapabilityParser.ON_DELETE); - this.state = 778; - this.stringLiteral(); - } - } - - this.state = 782; + this.state = 788; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 61) { { - this.state = 781; - this.match(QuixosCapabilityParser.RETAIN_OTHER); - } - } - - this.state = 786; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 62) { - { - this.state = 784; - this.match(QuixosCapabilityParser.KEYED); - this.state = 785; + this.state = 786; + this.match(QuixosCapabilityParser.ON_DELETE); + this.state = 787; this.stringLiteral(); } } - this.state = 789; + this.state = 791; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 62) { + { + this.state = 790; + this.match(QuixosCapabilityParser.RETAIN_OTHER); + } + } + + this.state = 795; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 63) { { - this.state = 788; + this.state = 793; + this.match(QuixosCapabilityParser.KEYED); + this.state = 794; + this.stringLiteral(); + } + } + + this.state = 798; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 64) { + { + this.state = 797; this.match(QuixosCapabilityParser.PUBLIC_TRAVERSAL); } } - this.state = 791; + this.state = 800; this.match(QuixosCapabilityParser.SEMI); } } @@ -3007,65 +3032,65 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 793; + this.state = 802; this.match(QuixosCapabilityParser.CONFORM); - this.state = 794; + this.state = 803; this.identifier(); - this.state = 795; + this.state = 804; this.match(QuixosCapabilityParser.AS); - this.state = 796; + this.state = 805; this.identifier(); - this.state = 798; + this.state = 807; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 123) { + if (_la === 124) { { - this.state = 797; + this.state = 806; this.typeArguments(); } } - this.state = 802; + this.state = 811; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 64) { + if (_la === 65) { { - this.state = 800; + this.state = 809; this.match(QuixosCapabilityParser.ID); - this.state = 801; + this.state = 810; this.stringLiteral(); } } - this.state = 806; + this.state = 815; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 59) { + if (_la === 60) { { - this.state = 804; + this.state = 813; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); - this.state = 805; + this.state = 814; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 808; + this.state = 817; this.match(QuixosCapabilityParser.LBRACE); - this.state = 812; + this.state = 821; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 38)) & ~0x1F) === 0 && ((1 << (_la - 38)) & 2057) !== 0)) { + while (((((_la - 39)) & ~0x1F) === 0 && ((1 << (_la - 39)) & 2057) !== 0)) { { { - this.state = 809; + this.state = 818; this.conformanceItem(); } } - this.state = 814; + this.state = 823; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 815; + this.state = 824; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3086,36 +3111,36 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ConformanceItemContext(this.context, this.state); this.enterRule(localContext, 96, QuixosCapabilityParser.RULE_conformanceItem); try { - this.state = 822; + this.state = 831; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 70, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 817; + this.state = 826; this.match(QuixosCapabilityParser.PRIVATE); - this.state = 818; + this.state = 827; this.attachmentDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 819; + this.state = 828; this.operationBindingDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 820; + this.state = 829; this.stateFieldBindingDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 821; + this.state = 830; this.relationshipMaterializationDecl(); } break; @@ -3140,17 +3165,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 824; + this.state = 833; this.match(QuixosCapabilityParser.BIND); - this.state = 825; + this.state = 834; this.identifier(); - this.state = 826; + this.state = 835; this.match(QuixosCapabilityParser.TO); - this.state = 827; + this.state = 836; this.match(QuixosCapabilityParser.STATE); - this.state = 828; + this.state = 837; this.identifier(); - this.state = 829; + this.state = 838; this.match(QuixosCapabilityParser.SEMI); } } @@ -3173,31 +3198,31 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 831; - this.match(QuixosCapabilityParser.MATERIALIZE); - this.state = 832; - this.identifier(); - this.state = 833; - this.match(QuixosCapabilityParser.IF); - this.state = 834; - this.match(QuixosCapabilityParser.ABSENT); - this.state = 835; - this.match(QuixosCapabilityParser.USING); - this.state = 836; - this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 837; - this.identifier(); - this.state = 838; - this.match(QuixosCapabilityParser.VIA); - this.state = 839; - this.match(QuixosCapabilityParser.EDGE); this.state = 840; - this.identifier(); + this.match(QuixosCapabilityParser.MATERIALIZE); this.state = 841; - this.match(QuixosCapabilityParser.DOT); - this.state = 842; this.identifier(); + this.state = 842; + this.match(QuixosCapabilityParser.IF); this.state = 843; + this.match(QuixosCapabilityParser.ABSENT); + this.state = 844; + this.match(QuixosCapabilityParser.USING); + this.state = 845; + this.match(QuixosCapabilityParser.CONSTRUCTOR); + this.state = 846; + this.identifier(); + this.state = 847; + this.match(QuixosCapabilityParser.VIA); + this.state = 848; + this.match(QuixosCapabilityParser.EDGE); + this.state = 849; + this.identifier(); + this.state = 850; + this.match(QuixosCapabilityParser.DOT); + this.state = 851; + this.identifier(); + this.state = 852; this.match(QuixosCapabilityParser.SEMI); } } @@ -3221,27 +3246,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 845; + this.state = 854; this.match(QuixosCapabilityParser.BIND); - this.state = 846; + this.state = 855; this.memberOperationRef(); - this.state = 847; + this.state = 856; this.match(QuixosCapabilityParser.TO); - this.state = 848; + this.state = 857; this.operationProvider(); - this.state = 851; + this.state = 860; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 16) { + if (_la === 17) { { - this.state = 849; + this.state = 858; this.match(QuixosCapabilityParser.QUERY_REASON); - this.state = 850; + this.state = 859; this.stringLiteral(); } } - this.state = 853; + this.state = 862; this.match(QuixosCapabilityParser.SEMI); } } @@ -3264,11 +3289,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 855; + this.state = 864; this.identifier(); - this.state = 856; + this.state = 865; this.match(QuixosCapabilityParser.DOT); - this.state = 857; + this.state = 866; this.operationName(); } } @@ -3289,13 +3314,14 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new OperationNameContext(this.context, this.state); this.enterRule(localContext, 106, QuixosCapabilityParser.RULE_operationName); try { - this.state = 870; + this.state = 879; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.RESULT_BYTES: case QuixosCapabilityParser.RPC_CALLS: case QuixosCapabilityParser.DEADLINE_MS: case QuixosCapabilityParser.QUERY: + case QuixosCapabilityParser.REFLECTION: case QuixosCapabilityParser.SPECIALIZE: case QuixosCapabilityParser.ROOT: case QuixosCapabilityParser.DOCUMENT: @@ -3306,81 +3332,82 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.POLL: case QuixosCapabilityParser.QUERYABLE: case QuixosCapabilityParser.RPC: + case QuixosCapabilityParser.INTERFACES: case QuixosCapabilityParser.SOURCE: case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 1); { - this.state = 859; + this.state = 868; this.identifier(); } break; case QuixosCapabilityParser.CALL: this.enterOuterAlt(localContext, 2); { - this.state = 860; + this.state = 869; this.match(QuixosCapabilityParser.CALL); } break; case QuixosCapabilityParser.GET: this.enterOuterAlt(localContext, 3); { - this.state = 861; + this.state = 870; this.match(QuixosCapabilityParser.GET); } break; case QuixosCapabilityParser.SET: this.enterOuterAlt(localContext, 4); { - this.state = 862; + this.state = 871; this.match(QuixosCapabilityParser.SET); } break; case QuixosCapabilityParser.RESOLVE: this.enterOuterAlt(localContext, 5); { - this.state = 863; + this.state = 872; this.match(QuixosCapabilityParser.RESOLVE); } break; case QuixosCapabilityParser.CONNECT: this.enterOuterAlt(localContext, 6); { - this.state = 864; + this.state = 873; this.match(QuixosCapabilityParser.CONNECT); } break; case QuixosCapabilityParser.DISCONNECT: this.enterOuterAlt(localContext, 7); { - this.state = 865; + this.state = 874; this.match(QuixosCapabilityParser.DISCONNECT); } break; case QuixosCapabilityParser.WATCH_START: this.enterOuterAlt(localContext, 8); { - this.state = 866; + this.state = 875; this.match(QuixosCapabilityParser.WATCH_START); } break; case QuixosCapabilityParser.WATCH_STOP: this.enterOuterAlt(localContext, 9); { - this.state = 867; + this.state = 876; this.match(QuixosCapabilityParser.WATCH_STOP); } break; case QuixosCapabilityParser.SUBSCRIBE: this.enterOuterAlt(localContext, 10); { - this.state = 868; + this.state = 877; this.match(QuixosCapabilityParser.SUBSCRIBE); } break; case QuixosCapabilityParser.UNSUBSCRIBE: this.enterOuterAlt(localContext, 11); { - this.state = 869; + this.state = 878; this.match(QuixosCapabilityParser.UNSUBSCRIBE); } break; @@ -3406,89 +3433,89 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 108, QuixosCapabilityParser.RULE_operationProvider); let _la: number; try { - this.state = 902; + this.state = 911; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 872; + this.state = 881; this.match(QuixosCapabilityParser.STATE); - this.state = 873; + this.state = 882; this.identifier(); - this.state = 874; + this.state = 883; this.match(QuixosCapabilityParser.DOT); - this.state = 875; + this.state = 884; this.statePrimitive(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 877; + this.state = 886; this.match(QuixosCapabilityParser.EDGE); - this.state = 878; + this.state = 887; this.identifier(); - this.state = 879; + this.state = 888; this.match(QuixosCapabilityParser.DOT); - this.state = 880; + this.state = 889; this.identifier(); - this.state = 881; + this.state = 890; this.match(QuixosCapabilityParser.DOT); - this.state = 882; + this.state = 891; this.edgePrimitive(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 3); { - this.state = 884; + this.state = 893; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 885; + this.state = 894; this.identifier(); - this.state = 887; + this.state = 896; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 123) { + if (_la === 124) { { - this.state = 886; + this.state = 895; this.typeArguments(); } } - this.state = 889; + this.state = 898; this.match(QuixosCapabilityParser.DOT); - this.state = 890; + this.state = 899; this.memberOperationRef(); } break; case QuixosCapabilityParser.PACKAGE: this.enterOuterAlt(localContext, 4); { - this.state = 892; + this.state = 901; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 893; + this.state = 902; this.identifier(); - this.state = 894; + this.state = 903; this.match(QuixosCapabilityParser.DOT); - this.state = 895; + this.state = 904; this.identifier(); - this.state = 897; + this.state = 906; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 123) { + if (_la === 124) { { - this.state = 896; + this.state = 905; this.typeArguments(); } } - this.state = 900; + this.state = 909; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 46) { + if (_la === 47) { { - this.state = 899; + this.state = 908; this.dependencyBindingBlock(); } } @@ -3519,9 +3546,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 904; + this.state = 913; _la = this.tokenStream.LA(1); - if(!(((((_la - 76)) & ~0x1F) === 0 && ((1 << (_la - 76)) & 195) !== 0))) { + if(!(((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 195) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -3550,9 +3577,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 906; + this.state = 915; _la = this.tokenStream.LA(1); - if(!(((((_la - 78)) & ~0x1F) === 0 && ((1 << (_la - 78)) & 55) !== 0))) { + if(!(((((_la - 79)) & ~0x1F) === 0 && ((1 << (_la - 79)) & 55) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -3581,25 +3608,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 908; + this.state = 917; this.match(QuixosCapabilityParser.WITH); - this.state = 909; + this.state = 918; this.match(QuixosCapabilityParser.LBRACE); - this.state = 913; + this.state = 922; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 65532) !== 0) || _la === 55 || _la === 129) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 268566524) !== 0) || _la === 56 || _la === 130) { { { - this.state = 910; + this.state = 919; this.dependencyBinding(); } } - this.state = 915; + this.state = 924; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 916; + this.state = 925; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3621,181 +3648,202 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 116, QuixosCapabilityParser.RULE_dependencyBinding); let _la: number; try { - this.state = 990; + this.state = 1008; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 84, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 918; - this.identifier(); - this.state = 919; - this.match(QuixosCapabilityParser.TO); - this.state = 920; - this.match(QuixosCapabilityParser.STATE); - this.state = 921; + this.state = 927; this.identifier(); this.state = 928; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 48) { - { - this.state = 922; - this.match(QuixosCapabilityParser.VIA); - this.state = 923; - this.match(QuixosCapabilityParser.EDGE); - this.state = 924; - this.identifier(); - this.state = 925; - this.match(QuixosCapabilityParser.DOT); - this.state = 926; - this.identifier(); - } - } - + this.match(QuixosCapabilityParser.TO); + this.state = 929; + this.match(QuixosCapabilityParser.WORKSPACE); this.state = 930; + this.match(QuixosCapabilityParser.REFLECTION); + this.state = 931; + this.match(QuixosCapabilityParser.LBRACK); + this.state = 932; + this.identifierList(); + this.state = 933; + this.match(QuixosCapabilityParser.RBRACK); + this.state = 934; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 932; - this.identifier(); - this.state = 933; - this.match(QuixosCapabilityParser.TO); - this.state = 934; - this.match(QuixosCapabilityParser.EDGE); - this.state = 935; - this.identifier(); this.state = 936; - this.match(QuixosCapabilityParser.DOT); - this.state = 937; this.identifier(); - this.state = 944; + this.state = 937; + this.match(QuixosCapabilityParser.TO); + this.state = 938; + this.match(QuixosCapabilityParser.STATE); + this.state = 939; + this.identifier(); + this.state = 946; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 48) { + if (_la === 49) { { - this.state = 938; - this.match(QuixosCapabilityParser.VIA); - this.state = 939; - this.match(QuixosCapabilityParser.EDGE); this.state = 940; - this.identifier(); + this.match(QuixosCapabilityParser.VIA); this.state = 941; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.EDGE); this.state = 942; this.identifier(); + this.state = 943; + this.match(QuixosCapabilityParser.DOT); + this.state = 944; + this.identifier(); } } - this.state = 946; + this.state = 948; this.match(QuixosCapabilityParser.SEMI); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 948; - this.identifier(); - this.state = 949; - this.match(QuixosCapabilityParser.TO); this.state = 950; - this.match(QuixosCapabilityParser.INTERFACE); - this.state = 951; this.identifier(); + this.state = 951; + this.match(QuixosCapabilityParser.TO); + this.state = 952; + this.match(QuixosCapabilityParser.EDGE); this.state = 953; + this.identifier(); + this.state = 954; + this.match(QuixosCapabilityParser.DOT); + this.state = 955; + this.identifier(); + this.state = 962; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 123) { + if (_la === 49) { { - this.state = 952; - this.typeArguments(); - } - } - - this.state = 961; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 48) { - { - this.state = 955; - this.match(QuixosCapabilityParser.VIA); this.state = 956; - this.match(QuixosCapabilityParser.EDGE); + this.match(QuixosCapabilityParser.VIA); this.state = 957; - this.identifier(); + this.match(QuixosCapabilityParser.EDGE); this.state = 958; - this.match(QuixosCapabilityParser.DOT); + this.identifier(); this.state = 959; + this.match(QuixosCapabilityParser.DOT); + this.state = 960; this.identifier(); } } - this.state = 963; + this.state = 964; this.match(QuixosCapabilityParser.SEMI); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 965; - this.identifier(); this.state = 966; - this.match(QuixosCapabilityParser.TO); - this.state = 967; - this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 968; this.identifier(); + this.state = 967; + this.match(QuixosCapabilityParser.TO); + this.state = 968; + this.match(QuixosCapabilityParser.INTERFACE); this.state = 969; + this.identifier(); + this.state = 971; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 124) { + { + this.state = 970; + this.typeArguments(); + } + } + + this.state = 979; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 49) { + { + this.state = 973; + this.match(QuixosCapabilityParser.VIA); + this.state = 974; + this.match(QuixosCapabilityParser.EDGE); + this.state = 975; + this.identifier(); + this.state = 976; + this.match(QuixosCapabilityParser.DOT); + this.state = 977; + this.identifier(); + } + } + + this.state = 981; this.match(QuixosCapabilityParser.SEMI); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 971; + this.state = 983; this.identifier(); - this.state = 972; + this.state = 984; this.match(QuixosCapabilityParser.TO); - this.state = 974; + this.state = 985; + this.match(QuixosCapabilityParser.CONSTRUCTOR); + this.state = 986; + this.identifier(); + this.state = 987; + this.match(QuixosCapabilityParser.SEMI); + } + break; + case 6: + this.enterOuterAlt(localContext, 6); + { + this.state = 989; + this.identifier(); + this.state = 990; + this.match(QuixosCapabilityParser.TO); + this.state = 992; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 1) { { - this.state = 973; + this.state = 991; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 976; + this.state = 994; this.match(QuixosCapabilityParser.QUERY); - this.state = 977; + this.state = 995; this.identifier(); - this.state = 978; + this.state = 996; this.match(QuixosCapabilityParser.DOT); - this.state = 979; + this.state = 997; this.identifier(); - this.state = 986; + this.state = 1004; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 48) { + if (_la === 49) { { - this.state = 980; + this.state = 998; this.match(QuixosCapabilityParser.VIA); - this.state = 981; + this.state = 999; this.match(QuixosCapabilityParser.EDGE); - this.state = 982; + this.state = 1000; this.identifier(); - this.state = 983; + this.state = 1001; this.match(QuixosCapabilityParser.DOT); - this.state = 984; + this.state = 1002; this.identifier(); } } - this.state = 988; + this.state = 1006; this.match(QuixosCapabilityParser.SEMI); } break; @@ -3821,29 +3869,29 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 992; + this.state = 1010; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 993; + this.state = 1011; this.identifier(); - this.state = 994; + this.state = 1012; this.match(QuixosCapabilityParser.TO); - this.state = 995; + this.state = 1013; this.identifier(); - this.state = 996; + this.state = 1014; this.match(QuixosCapabilityParser.DOT); - this.state = 997; + this.state = 1015; this.identifier(); - this.state = 999; + this.state = 1017; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 46) { + if (_la === 47) { { - this.state = 998; + this.state = 1016; this.dependencyBindingBlock(); } } - this.state = 1001; + this.state = 1019; this.match(QuixosCapabilityParser.SEMI); } } @@ -3865,7 +3913,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 120, QuixosCapabilityParser.RULE_valueType); let _la: number; try { - this.state = 1049; + this.state = 1067; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.BOOL: @@ -3878,130 +3926,130 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.UINT64: this.enterOuterAlt(localContext, 1); { - this.state = 1003; + this.state = 1021; this.scalarType(); } break; case QuixosCapabilityParser.UNIT: this.enterOuterAlt(localContext, 2); { - this.state = 1004; + this.state = 1022; this.match(QuixosCapabilityParser.UNIT); } break; case QuixosCapabilityParser.WATCH_HANDLE: this.enterOuterAlt(localContext, 3); { - this.state = 1005; + this.state = 1023; this.match(QuixosCapabilityParser.WATCH_HANDLE); } break; case QuixosCapabilityParser.MESSAGE: this.enterOuterAlt(localContext, 4); { - this.state = 1006; + this.state = 1024; this.match(QuixosCapabilityParser.MESSAGE); - this.state = 1007; + this.state = 1025; this.stringLiteral(); } break; case QuixosCapabilityParser.ATOM_REF: this.enterOuterAlt(localContext, 5); { - this.state = 1008; + this.state = 1026; this.match(QuixosCapabilityParser.ATOM_REF); - this.state = 1009; + this.state = 1027; this.match(QuixosCapabilityParser.LT); - this.state = 1010; + this.state = 1028; this.identifier(); - this.state = 1011; + this.state = 1029; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.INTERFACE_REF: this.enterOuterAlt(localContext, 6); { - this.state = 1013; + this.state = 1031; this.match(QuixosCapabilityParser.INTERFACE_REF); - this.state = 1014; + this.state = 1032; this.match(QuixosCapabilityParser.LT); - this.state = 1015; + this.state = 1033; this.identifier(); - this.state = 1017; + this.state = 1035; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 123) { + if (_la === 124) { { - this.state = 1016; + this.state = 1034; this.typeArguments(); } } - this.state = 1019; + this.state = 1037; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.REF: this.enterOuterAlt(localContext, 7); { - this.state = 1021; + this.state = 1039; this.match(QuixosCapabilityParser.REF); - this.state = 1022; + this.state = 1040; this.match(QuixosCapabilityParser.LT); - this.state = 1023; + this.state = 1041; this.identifier(); - this.state = 1024; + this.state = 1042; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.OPTIONAL: this.enterOuterAlt(localContext, 8); { - this.state = 1026; + this.state = 1044; this.match(QuixosCapabilityParser.OPTIONAL); - this.state = 1027; + this.state = 1045; this.match(QuixosCapabilityParser.LT); - this.state = 1028; + this.state = 1046; this.valueType(); - this.state = 1029; + this.state = 1047; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.LIST: this.enterOuterAlt(localContext, 9); { - this.state = 1031; + this.state = 1049; this.match(QuixosCapabilityParser.LIST); - this.state = 1032; + this.state = 1050; this.match(QuixosCapabilityParser.LT); - this.state = 1033; + this.state = 1051; this.valueType(); - this.state = 1034; + this.state = 1052; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.RECORD: this.enterOuterAlt(localContext, 10); { - this.state = 1036; + this.state = 1054; this.match(QuixosCapabilityParser.RECORD); - this.state = 1037; + this.state = 1055; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1041; + this.state = 1059; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 65532) !== 0) || _la === 55 || _la === 129) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 268566524) !== 0) || _la === 56 || _la === 130) { { { - this.state = 1038; + this.state = 1056; this.recordField(); } } - this.state = 1043; + this.state = 1061; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1044; + this.state = 1062; this.match(QuixosCapabilityParser.RBRACE); } break; @@ -4009,6 +4057,7 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.RPC_CALLS: case QuixosCapabilityParser.DEADLINE_MS: case QuixosCapabilityParser.QUERY: + case QuixosCapabilityParser.REFLECTION: case QuixosCapabilityParser.SPECIALIZE: case QuixosCapabilityParser.ROOT: case QuixosCapabilityParser.DOCUMENT: @@ -4019,18 +4068,19 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.POLL: case QuixosCapabilityParser.QUERYABLE: case QuixosCapabilityParser.RPC: + case QuixosCapabilityParser.INTERFACES: case QuixosCapabilityParser.SOURCE: case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 11); { - this.state = 1045; + this.state = 1063; this.identifier(); - this.state = 1047; + this.state = 1065; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 123) { + if (_la === 124) { { - this.state = 1046; + this.state = 1064; this.typeArguments(); } } @@ -4060,13 +4110,13 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1051; + this.state = 1069; this.identifier(); - this.state = 1052; + this.state = 1070; this.match(QuixosCapabilityParser.COLON); - this.state = 1053; + this.state = 1071; this.valueType(); - this.state = 1054; + this.state = 1072; this.match(QuixosCapabilityParser.SEMI); } } @@ -4090,9 +4140,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1056; + this.state = 1074; _la = this.tokenStream.LA(1); - if(!(((((_la - 101)) & ~0x1F) === 0 && ((1 << (_la - 101)) & 255) !== 0))) { + if(!(((((_la - 102)) & ~0x1F) === 0 && ((1 << (_la - 102)) & 255) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4121,9 +4171,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1058; + this.state = 1076; _la = this.tokenStream.LA(1); - if(!(((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 15) !== 0))) { + if(!(((((_la - 89)) & ~0x1F) === 0 && ((1 << (_la - 89)) & 15) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4149,62 +4199,62 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new JsonLiteralContext(this.context, this.state); this.enterRule(localContext, 128, QuixosCapabilityParser.RULE_jsonLiteral); try { - this.state = 1068; + this.state = 1086; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STRING_LITERAL: this.enterOuterAlt(localContext, 1); { - this.state = 1060; + this.state = 1078; this.stringLiteral(); } break; case QuixosCapabilityParser.INTEGER: this.enterOuterAlt(localContext, 2); { - this.state = 1061; + this.state = 1079; this.match(QuixosCapabilityParser.INTEGER); } break; case QuixosCapabilityParser.JSON_NUMBER: this.enterOuterAlt(localContext, 3); { - this.state = 1062; + this.state = 1080; this.match(QuixosCapabilityParser.JSON_NUMBER); } break; case QuixosCapabilityParser.TRUE: this.enterOuterAlt(localContext, 4); { - this.state = 1063; + this.state = 1081; this.match(QuixosCapabilityParser.TRUE); } break; case QuixosCapabilityParser.FALSE: this.enterOuterAlt(localContext, 5); { - this.state = 1064; + this.state = 1082; this.match(QuixosCapabilityParser.FALSE); } break; case QuixosCapabilityParser.NULL: this.enterOuterAlt(localContext, 6); { - this.state = 1065; + this.state = 1083; this.match(QuixosCapabilityParser.NULL); } break; case QuixosCapabilityParser.LBRACE: this.enterOuterAlt(localContext, 7); { - this.state = 1066; + this.state = 1084; this.jsonObject(); } break; case QuixosCapabilityParser.LBRACK: this.enterOuterAlt(localContext, 8); { - this.state = 1067; + this.state = 1085; this.jsonArray(); } break; @@ -4232,35 +4282,35 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1070; + this.state = 1088; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1079; + this.state = 1097; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 130) { + if (_la === 131) { { - this.state = 1071; + this.state = 1089; this.jsonMember(); - this.state = 1076; + this.state = 1094; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 115) { + while (_la === 116) { { { - this.state = 1072; + this.state = 1090; this.match(QuixosCapabilityParser.COMMA); - this.state = 1073; + this.state = 1091; this.jsonMember(); } } - this.state = 1078; + this.state = 1096; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1081; + this.state = 1099; this.match(QuixosCapabilityParser.RBRACE); } } @@ -4283,11 +4333,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1083; + this.state = 1101; this.stringLiteral(); - this.state = 1084; + this.state = 1102; this.match(QuixosCapabilityParser.COLON); - this.state = 1085; + this.state = 1103; this.jsonLiteral(); } } @@ -4311,35 +4361,35 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1087; + this.state = 1105; this.match(QuixosCapabilityParser.LBRACK); - this.state = 1096; + this.state = 1114; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (((((_la - 109)) & ~0x1F) === 0 && ((1 << (_la - 109)) & 2884871) !== 0)) { + if (((((_la - 110)) & ~0x1F) === 0 && ((1 << (_la - 110)) & 2884871) !== 0)) { { - this.state = 1088; + this.state = 1106; this.jsonLiteral(); - this.state = 1093; + this.state = 1111; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 115) { + while (_la === 116) { { { - this.state = 1089; + this.state = 1107; this.match(QuixosCapabilityParser.COMMA); - this.state = 1090; + this.state = 1108; this.jsonLiteral(); } } - this.state = 1095; + this.state = 1113; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1098; + this.state = 1116; this.match(QuixosCapabilityParser.RBRACK); } } @@ -4363,9 +4413,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1100; + this.state = 1118; _la = this.tokenStream.LA(1); - if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 65532) !== 0) || _la === 55 || _la === 129)) { + if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 268566524) !== 0) || _la === 56 || _la === 130)) { this.errorHandler.recoverInline(this); } else { @@ -4393,7 +4443,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1102; + this.state = 1120; this.match(QuixosCapabilityParser.STRING_LITERAL); } } @@ -4412,7 +4462,7 @@ export class QuixosCapabilityParser extends antlr.Parser { } public static readonly _serializedATN: number[] = [ - 4,1,133,1105,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,134,1123,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, @@ -4468,366 +4518,374 @@ export class QuixosCapabilityParser extends antlr.Parser { 36,650,9,36,1,37,1,37,1,37,5,37,655,8,37,10,37,12,37,658,9,37,1, 37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1, 38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1, - 38,1,38,3,38,688,8,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1, - 38,1,38,3,38,700,8,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1, - 38,1,38,1,38,1,38,3,38,714,8,38,1,39,1,39,1,39,1,39,5,39,720,8,39, - 10,39,12,39,723,9,39,1,39,1,39,1,40,1,40,1,41,1,41,1,41,1,42,1,42, - 3,42,734,8,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,3,43,748,8,43,1,43,1,43,1,44,1,44,1,44,1,44,1,44,1,44, - 3,44,758,8,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,46,1,46,1,46,1,46,3,46,776,8,46,1,46,1,46,3,46,780,8, - 46,1,46,3,46,783,8,46,1,46,1,46,3,46,787,8,46,1,46,3,46,790,8,46, - 1,46,1,46,1,47,1,47,1,47,1,47,1,47,3,47,799,8,47,1,47,1,47,3,47, - 803,8,47,1,47,1,47,3,47,807,8,47,1,47,1,47,5,47,811,8,47,10,47,12, - 47,814,9,47,1,47,1,47,1,48,1,48,1,48,1,48,1,48,3,48,823,8,48,1,49, - 1,49,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,50,1,50,1,50,1,50,1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,51, - 3,51,852,8,51,1,51,1,51,1,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53, - 1,53,1,53,1,53,1,53,1,53,1,53,1,53,3,53,871,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,1,54,1,54,1,54,3,54, - 888,8,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,3,54,898,8,54,1, - 54,3,54,901,8,54,3,54,903,8,54,1,55,1,55,1,56,1,56,1,57,1,57,1,57, - 5,57,912,8,57,10,57,12,57,915,9,57,1,57,1,57,1,58,1,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,3,58,929,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,945,8,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,954,8,58,1,58,1,58,1,58, - 1,58,1,58,1,58,3,58,962,8,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,975,8,58,1,58,1,58,1,58,1,58,1,58,1,58, - 1,58,1,58,1,58,1,58,3,58,987,8,58,1,58,1,58,3,58,991,8,58,1,59,1, - 59,1,59,1,59,1,59,1,59,1,59,3,59,1000,8,59,1,59,1,59,1,60,1,60,1, - 60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,3,60,1018, - 8,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60, - 1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,5,60,1040,8,60,10,60,12, - 60,1043,9,60,1,60,1,60,1,60,3,60,1048,8,60,3,60,1050,8,60,1,61,1, - 61,1,61,1,61,1,61,1,62,1,62,1,63,1,63,1,64,1,64,1,64,1,64,1,64,1, - 64,1,64,1,64,3,64,1069,8,64,1,65,1,65,1,65,1,65,5,65,1075,8,65,10, - 65,12,65,1078,9,65,3,65,1080,8,65,1,65,1,65,1,66,1,66,1,66,1,66, - 1,67,1,67,1,67,1,67,5,67,1092,8,67,10,67,12,67,1095,9,67,3,67,1097, - 8,67,1,67,1,67,1,68,1,68,1,69,1,69,1,69,0,0,70,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,0,7,1,0,81,85,2,0,76,80,82,83,2,0,76,77,82,83,2,0,78, - 80,82,83,1,0,101,108,1,0,88,91,3,0,2,15,55,55,129,129,1188,0,152, - 1,0,0,0,2,154,1,0,0,0,4,164,1,0,0,0,6,168,1,0,0,0,8,192,1,0,0,0, - 10,204,1,0,0,0,12,206,1,0,0,0,14,213,1,0,0,0,16,224,1,0,0,0,18,226, - 1,0,0,0,20,239,1,0,0,0,22,271,1,0,0,0,24,301,1,0,0,0,26,303,1,0, - 0,0,28,307,1,0,0,0,30,325,1,0,0,0,32,327,1,0,0,0,34,339,1,0,0,0, - 36,342,1,0,0,0,38,360,1,0,0,0,40,396,1,0,0,0,42,399,1,0,0,0,44,424, - 1,0,0,0,46,452,1,0,0,0,48,463,1,0,0,0,50,468,1,0,0,0,52,495,1,0, - 0,0,54,497,1,0,0,0,56,522,1,0,0,0,58,564,1,0,0,0,60,566,1,0,0,0, - 62,589,1,0,0,0,64,605,1,0,0,0,66,618,1,0,0,0,68,621,1,0,0,0,70,641, - 1,0,0,0,72,643,1,0,0,0,74,651,1,0,0,0,76,713,1,0,0,0,78,715,1,0, - 0,0,80,726,1,0,0,0,82,728,1,0,0,0,84,733,1,0,0,0,86,735,1,0,0,0, - 88,757,1,0,0,0,90,759,1,0,0,0,92,768,1,0,0,0,94,793,1,0,0,0,96,822, - 1,0,0,0,98,824,1,0,0,0,100,831,1,0,0,0,102,845,1,0,0,0,104,855,1, - 0,0,0,106,870,1,0,0,0,108,902,1,0,0,0,110,904,1,0,0,0,112,906,1, - 0,0,0,114,908,1,0,0,0,116,990,1,0,0,0,118,992,1,0,0,0,120,1049,1, - 0,0,0,122,1051,1,0,0,0,124,1056,1,0,0,0,126,1058,1,0,0,0,128,1068, - 1,0,0,0,130,1070,1,0,0,0,132,1083,1,0,0,0,134,1087,1,0,0,0,136,1100, - 1,0,0,0,138,1102,1,0,0,0,140,141,3,6,3,0,141,142,5,0,0,1,142,153, - 1,0,0,0,143,144,3,20,10,0,144,145,5,0,0,1,145,153,1,0,0,0,146,147, - 3,50,25,0,147,148,5,0,0,1,148,153,1,0,0,0,149,150,3,2,1,0,150,151, - 5,0,0,1,151,153,1,0,0,0,152,140,1,0,0,0,152,143,1,0,0,0,152,146, - 1,0,0,0,152,149,1,0,0,0,153,1,1,0,0,0,154,155,5,22,0,0,155,159,5, - 117,0,0,156,158,3,8,4,0,157,156,1,0,0,0,158,161,1,0,0,0,159,157, - 1,0,0,0,159,160,1,0,0,0,160,162,1,0,0,0,161,159,1,0,0,0,162,163, - 5,118,0,0,163,3,1,0,0,0,164,165,5,23,0,0,165,166,3,138,69,0,166, - 167,5,114,0,0,167,5,1,0,0,0,168,169,5,1,0,0,169,170,3,136,68,0,170, - 171,5,64,0,0,171,172,3,138,69,0,172,173,5,58,0,0,173,174,3,138,69, - 0,174,175,5,57,0,0,175,176,3,138,69,0,176,180,5,117,0,0,177,179, - 3,8,4,0,178,177,1,0,0,0,179,182,1,0,0,0,180,178,1,0,0,0,180,181, - 1,0,0,0,181,183,1,0,0,0,182,180,1,0,0,0,183,184,5,118,0,0,184,7, - 1,0,0,0,185,193,3,4,2,0,186,193,3,18,9,0,187,193,3,10,5,0,188,193, - 3,82,41,0,189,193,3,94,47,0,190,193,3,118,59,0,191,193,3,32,16,0, - 192,185,1,0,0,0,192,186,1,0,0,0,192,187,1,0,0,0,192,188,1,0,0,0, - 192,189,1,0,0,0,192,190,1,0,0,0,192,191,1,0,0,0,193,9,1,0,0,0,194, - 195,5,23,0,0,195,196,5,26,0,0,196,197,3,136,68,0,197,198,5,114,0, - 0,198,205,1,0,0,0,199,200,5,23,0,0,200,201,5,28,0,0,201,202,3,136, - 68,0,202,203,5,114,0,0,203,205,1,0,0,0,204,194,1,0,0,0,204,199,1, - 0,0,0,205,11,1,0,0,0,206,207,5,24,0,0,207,208,5,25,0,0,208,209,3, - 136,68,0,209,210,5,64,0,0,210,211,3,138,69,0,211,212,5,114,0,0,212, - 13,1,0,0,0,213,214,5,24,0,0,214,215,5,26,0,0,215,216,3,136,68,0, - 216,217,5,58,0,0,217,218,3,138,69,0,218,219,5,114,0,0,219,15,1,0, - 0,0,220,225,3,10,5,0,221,225,3,12,6,0,222,225,3,14,7,0,223,225,3, - 32,16,0,224,220,1,0,0,0,224,221,1,0,0,0,224,222,1,0,0,0,224,223, - 1,0,0,0,225,17,1,0,0,0,226,227,5,25,0,0,227,228,3,136,68,0,228,229, - 5,64,0,0,229,232,3,138,69,0,230,231,5,65,0,0,231,233,3,138,69,0, - 232,230,1,0,0,0,232,233,1,0,0,0,233,234,1,0,0,0,234,235,5,114,0, - 0,235,19,1,0,0,0,236,238,3,16,8,0,237,236,1,0,0,0,238,241,1,0,0, - 0,239,237,1,0,0,0,239,240,1,0,0,0,240,242,1,0,0,0,241,239,1,0,0, - 0,242,243,5,26,0,0,243,245,3,136,68,0,244,246,3,22,11,0,245,244, - 1,0,0,0,245,246,1,0,0,0,246,247,1,0,0,0,247,248,5,64,0,0,248,249, - 3,138,69,0,249,250,5,58,0,0,250,260,3,138,69,0,251,252,5,69,0,0, - 252,257,3,26,13,0,253,254,5,115,0,0,254,256,3,26,13,0,255,253,1, - 0,0,0,256,259,1,0,0,0,257,255,1,0,0,0,257,258,1,0,0,0,258,261,1, - 0,0,0,259,257,1,0,0,0,260,251,1,0,0,0,260,261,1,0,0,0,261,262,1, - 0,0,0,262,266,5,117,0,0,263,265,3,34,17,0,264,263,1,0,0,0,265,268, - 1,0,0,0,266,264,1,0,0,0,266,267,1,0,0,0,267,269,1,0,0,0,268,266, - 1,0,0,0,269,270,5,118,0,0,270,21,1,0,0,0,271,272,5,123,0,0,272,277, - 3,24,12,0,273,274,5,115,0,0,274,276,3,24,12,0,275,273,1,0,0,0,276, - 279,1,0,0,0,277,275,1,0,0,0,277,278,1,0,0,0,278,280,1,0,0,0,279, - 277,1,0,0,0,280,281,5,124,0,0,281,23,1,0,0,0,282,283,5,29,0,0,283, - 286,3,136,68,0,284,285,5,113,0,0,285,287,5,19,0,0,286,284,1,0,0, - 0,286,287,1,0,0,0,287,302,1,0,0,0,288,289,5,18,0,0,289,299,3,136, - 68,0,290,291,5,20,0,0,291,296,3,26,13,0,292,293,5,125,0,0,293,295, - 3,26,13,0,294,292,1,0,0,0,295,298,1,0,0,0,296,294,1,0,0,0,296,297, - 1,0,0,0,297,300,1,0,0,0,298,296,1,0,0,0,299,290,1,0,0,0,299,300, - 1,0,0,0,300,302,1,0,0,0,301,282,1,0,0,0,301,288,1,0,0,0,302,25,1, - 0,0,0,303,305,3,136,68,0,304,306,3,28,14,0,305,304,1,0,0,0,305,306, - 1,0,0,0,306,27,1,0,0,0,307,308,5,123,0,0,308,313,3,30,15,0,309,310, - 5,115,0,0,310,312,3,30,15,0,311,309,1,0,0,0,312,315,1,0,0,0,313, + 38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,3,38,697,8, + 38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,3,38,709,8, + 38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,3, + 38,723,8,38,1,39,1,39,1,39,1,39,5,39,729,8,39,10,39,12,39,732,9, + 39,1,39,1,39,1,40,1,40,1,41,1,41,1,41,1,42,1,42,3,42,743,8,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,3,43,757, + 8,43,1,43,1,43,1,44,1,44,1,44,1,44,1,44,1,44,3,44,767,8,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,46,1,46, + 1,46,1,46,3,46,785,8,46,1,46,1,46,3,46,789,8,46,1,46,3,46,792,8, + 46,1,46,1,46,3,46,796,8,46,1,46,3,46,799,8,46,1,46,1,46,1,47,1,47, + 1,47,1,47,1,47,3,47,808,8,47,1,47,1,47,3,47,812,8,47,1,47,1,47,3, + 47,816,8,47,1,47,1,47,5,47,820,8,47,10,47,12,47,823,9,47,1,47,1, + 47,1,48,1,48,1,48,1,48,1,48,3,48,832,8,48,1,49,1,49,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,50,1,50,1, + 50,1,50,1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,51,3,51,861,8,51,1, + 51,1,51,1,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1, + 53,1,53,1,53,1,53,3,53,880,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,1,54,1,54,1,54,3,54,897,8,54,1,54,1, + 54,1,54,1,54,1,54,1,54,1,54,1,54,3,54,907,8,54,1,54,3,54,910,8,54, + 3,54,912,8,54,1,55,1,55,1,56,1,56,1,57,1,57,1,57,5,57,921,8,57,10, + 57,12,57,924,9,57,1,57,1,57,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,947, + 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,963,8,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58, + 972,8,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,980,8,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,993,8,58,1,58,1, + 58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,1005,8,58,1,58,1, + 58,3,58,1009,8,58,1,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,1018,8, + 59,1,59,1,59,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1, + 60,1,60,1,60,1,60,3,60,1036,8,60,1,60,1,60,1,60,1,60,1,60,1,60,1, + 60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1, + 60,5,60,1058,8,60,10,60,12,60,1061,9,60,1,60,1,60,1,60,3,60,1066, + 8,60,3,60,1068,8,60,1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,63,1,63, + 1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,3,64,1087,8,64,1,65,1,65, + 1,65,1,65,5,65,1093,8,65,10,65,12,65,1096,9,65,3,65,1098,8,65,1, + 65,1,65,1,66,1,66,1,66,1,66,1,67,1,67,1,67,1,67,5,67,1110,8,67,10, + 67,12,67,1113,9,67,3,67,1115,8,67,1,67,1,67,1,68,1,68,1,69,1,69, + 1,69,0,0,70,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,0,7,1,0,82,86,2,0,77,81, + 83,84,2,0,77,78,83,84,2,0,79,81,83,84,1,0,102,109,1,0,89,92,4,0, + 2,16,28,28,56,56,130,130,1208,0,152,1,0,0,0,2,154,1,0,0,0,4,164, + 1,0,0,0,6,168,1,0,0,0,8,192,1,0,0,0,10,204,1,0,0,0,12,206,1,0,0, + 0,14,213,1,0,0,0,16,224,1,0,0,0,18,226,1,0,0,0,20,239,1,0,0,0,22, + 271,1,0,0,0,24,301,1,0,0,0,26,303,1,0,0,0,28,307,1,0,0,0,30,325, + 1,0,0,0,32,327,1,0,0,0,34,339,1,0,0,0,36,342,1,0,0,0,38,360,1,0, + 0,0,40,396,1,0,0,0,42,399,1,0,0,0,44,424,1,0,0,0,46,452,1,0,0,0, + 48,463,1,0,0,0,50,468,1,0,0,0,52,495,1,0,0,0,54,497,1,0,0,0,56,522, + 1,0,0,0,58,564,1,0,0,0,60,566,1,0,0,0,62,589,1,0,0,0,64,605,1,0, + 0,0,66,618,1,0,0,0,68,621,1,0,0,0,70,641,1,0,0,0,72,643,1,0,0,0, + 74,651,1,0,0,0,76,722,1,0,0,0,78,724,1,0,0,0,80,735,1,0,0,0,82,737, + 1,0,0,0,84,742,1,0,0,0,86,744,1,0,0,0,88,766,1,0,0,0,90,768,1,0, + 0,0,92,777,1,0,0,0,94,802,1,0,0,0,96,831,1,0,0,0,98,833,1,0,0,0, + 100,840,1,0,0,0,102,854,1,0,0,0,104,864,1,0,0,0,106,879,1,0,0,0, + 108,911,1,0,0,0,110,913,1,0,0,0,112,915,1,0,0,0,114,917,1,0,0,0, + 116,1008,1,0,0,0,118,1010,1,0,0,0,120,1067,1,0,0,0,122,1069,1,0, + 0,0,124,1074,1,0,0,0,126,1076,1,0,0,0,128,1086,1,0,0,0,130,1088, + 1,0,0,0,132,1101,1,0,0,0,134,1105,1,0,0,0,136,1118,1,0,0,0,138,1120, + 1,0,0,0,140,141,3,6,3,0,141,142,5,0,0,1,142,153,1,0,0,0,143,144, + 3,20,10,0,144,145,5,0,0,1,145,153,1,0,0,0,146,147,3,50,25,0,147, + 148,5,0,0,1,148,153,1,0,0,0,149,150,3,2,1,0,150,151,5,0,0,1,151, + 153,1,0,0,0,152,140,1,0,0,0,152,143,1,0,0,0,152,146,1,0,0,0,152, + 149,1,0,0,0,153,1,1,0,0,0,154,155,5,23,0,0,155,159,5,118,0,0,156, + 158,3,8,4,0,157,156,1,0,0,0,158,161,1,0,0,0,159,157,1,0,0,0,159, + 160,1,0,0,0,160,162,1,0,0,0,161,159,1,0,0,0,162,163,5,119,0,0,163, + 3,1,0,0,0,164,165,5,24,0,0,165,166,3,138,69,0,166,167,5,115,0,0, + 167,5,1,0,0,0,168,169,5,1,0,0,169,170,3,136,68,0,170,171,5,65,0, + 0,171,172,3,138,69,0,172,173,5,59,0,0,173,174,3,138,69,0,174,175, + 5,58,0,0,175,176,3,138,69,0,176,180,5,118,0,0,177,179,3,8,4,0,178, + 177,1,0,0,0,179,182,1,0,0,0,180,178,1,0,0,0,180,181,1,0,0,0,181, + 183,1,0,0,0,182,180,1,0,0,0,183,184,5,119,0,0,184,7,1,0,0,0,185, + 193,3,4,2,0,186,193,3,18,9,0,187,193,3,10,5,0,188,193,3,82,41,0, + 189,193,3,94,47,0,190,193,3,118,59,0,191,193,3,32,16,0,192,185,1, + 0,0,0,192,186,1,0,0,0,192,187,1,0,0,0,192,188,1,0,0,0,192,189,1, + 0,0,0,192,190,1,0,0,0,192,191,1,0,0,0,193,9,1,0,0,0,194,195,5,24, + 0,0,195,196,5,27,0,0,196,197,3,136,68,0,197,198,5,115,0,0,198,205, + 1,0,0,0,199,200,5,24,0,0,200,201,5,29,0,0,201,202,3,136,68,0,202, + 203,5,115,0,0,203,205,1,0,0,0,204,194,1,0,0,0,204,199,1,0,0,0,205, + 11,1,0,0,0,206,207,5,25,0,0,207,208,5,26,0,0,208,209,3,136,68,0, + 209,210,5,65,0,0,210,211,3,138,69,0,211,212,5,115,0,0,212,13,1,0, + 0,0,213,214,5,25,0,0,214,215,5,27,0,0,215,216,3,136,68,0,216,217, + 5,59,0,0,217,218,3,138,69,0,218,219,5,115,0,0,219,15,1,0,0,0,220, + 225,3,10,5,0,221,225,3,12,6,0,222,225,3,14,7,0,223,225,3,32,16,0, + 224,220,1,0,0,0,224,221,1,0,0,0,224,222,1,0,0,0,224,223,1,0,0,0, + 225,17,1,0,0,0,226,227,5,26,0,0,227,228,3,136,68,0,228,229,5,65, + 0,0,229,232,3,138,69,0,230,231,5,66,0,0,231,233,3,138,69,0,232,230, + 1,0,0,0,232,233,1,0,0,0,233,234,1,0,0,0,234,235,5,115,0,0,235,19, + 1,0,0,0,236,238,3,16,8,0,237,236,1,0,0,0,238,241,1,0,0,0,239,237, + 1,0,0,0,239,240,1,0,0,0,240,242,1,0,0,0,241,239,1,0,0,0,242,243, + 5,27,0,0,243,245,3,136,68,0,244,246,3,22,11,0,245,244,1,0,0,0,245, + 246,1,0,0,0,246,247,1,0,0,0,247,248,5,65,0,0,248,249,3,138,69,0, + 249,250,5,59,0,0,250,260,3,138,69,0,251,252,5,70,0,0,252,257,3,26, + 13,0,253,254,5,116,0,0,254,256,3,26,13,0,255,253,1,0,0,0,256,259, + 1,0,0,0,257,255,1,0,0,0,257,258,1,0,0,0,258,261,1,0,0,0,259,257, + 1,0,0,0,260,251,1,0,0,0,260,261,1,0,0,0,261,262,1,0,0,0,262,266, + 5,118,0,0,263,265,3,34,17,0,264,263,1,0,0,0,265,268,1,0,0,0,266, + 264,1,0,0,0,266,267,1,0,0,0,267,269,1,0,0,0,268,266,1,0,0,0,269, + 270,5,119,0,0,270,21,1,0,0,0,271,272,5,124,0,0,272,277,3,24,12,0, + 273,274,5,116,0,0,274,276,3,24,12,0,275,273,1,0,0,0,276,279,1,0, + 0,0,277,275,1,0,0,0,277,278,1,0,0,0,278,280,1,0,0,0,279,277,1,0, + 0,0,280,281,5,125,0,0,281,23,1,0,0,0,282,283,5,30,0,0,283,286,3, + 136,68,0,284,285,5,114,0,0,285,287,5,20,0,0,286,284,1,0,0,0,286, + 287,1,0,0,0,287,302,1,0,0,0,288,289,5,19,0,0,289,299,3,136,68,0, + 290,291,5,21,0,0,291,296,3,26,13,0,292,293,5,126,0,0,293,295,3,26, + 13,0,294,292,1,0,0,0,295,298,1,0,0,0,296,294,1,0,0,0,296,297,1,0, + 0,0,297,300,1,0,0,0,298,296,1,0,0,0,299,290,1,0,0,0,299,300,1,0, + 0,0,300,302,1,0,0,0,301,282,1,0,0,0,301,288,1,0,0,0,302,25,1,0,0, + 0,303,305,3,136,68,0,304,306,3,28,14,0,305,304,1,0,0,0,305,306,1, + 0,0,0,306,27,1,0,0,0,307,308,5,124,0,0,308,313,3,30,15,0,309,310, + 5,116,0,0,310,312,3,30,15,0,311,309,1,0,0,0,312,315,1,0,0,0,313, 311,1,0,0,0,313,314,1,0,0,0,314,316,1,0,0,0,315,313,1,0,0,0,316, - 317,5,124,0,0,317,29,1,0,0,0,318,319,5,25,0,0,319,326,3,136,68,0, - 320,321,5,26,0,0,321,326,3,26,13,0,322,323,5,18,0,0,323,326,3,136, + 317,5,125,0,0,317,29,1,0,0,0,318,319,5,26,0,0,319,326,3,136,68,0, + 320,321,5,27,0,0,321,326,3,26,13,0,322,323,5,19,0,0,323,326,3,136, 68,0,324,326,3,120,60,0,325,318,1,0,0,0,325,320,1,0,0,0,325,322, - 1,0,0,0,325,324,1,0,0,0,326,31,1,0,0,0,327,328,5,17,0,0,328,330, + 1,0,0,0,325,324,1,0,0,0,326,31,1,0,0,0,327,328,5,18,0,0,328,330, 3,136,68,0,329,331,3,22,11,0,330,329,1,0,0,0,330,331,1,0,0,0,331, - 332,1,0,0,0,332,333,5,126,0,0,333,334,3,120,60,0,334,335,5,114,0, + 332,1,0,0,0,332,333,5,127,0,0,333,334,3,120,60,0,334,335,5,115,0, 0,335,33,1,0,0,0,336,340,3,38,19,0,337,340,3,42,21,0,338,340,3,36, 18,0,339,336,1,0,0,0,339,337,1,0,0,0,339,338,1,0,0,0,340,35,1,0, - 0,0,341,343,5,39,0,0,342,341,1,0,0,0,342,343,1,0,0,0,343,344,1,0, - 0,0,344,345,5,31,0,0,345,346,3,136,68,0,346,347,5,64,0,0,347,348, - 3,138,69,0,348,349,5,113,0,0,349,350,3,120,60,0,350,351,5,112,0, - 0,351,352,3,120,60,0,352,353,5,117,0,0,353,354,5,81,0,0,354,355, - 5,64,0,0,355,356,3,138,69,0,356,357,5,114,0,0,357,358,5,118,0,0, + 0,0,341,343,5,40,0,0,342,341,1,0,0,0,342,343,1,0,0,0,343,344,1,0, + 0,0,344,345,5,32,0,0,345,346,3,136,68,0,346,347,5,65,0,0,347,348, + 3,138,69,0,348,349,5,114,0,0,349,350,3,120,60,0,350,351,5,113,0, + 0,351,352,3,120,60,0,352,353,5,118,0,0,353,354,5,82,0,0,354,355, + 5,65,0,0,355,356,3,138,69,0,356,357,5,115,0,0,357,358,5,119,0,0, 358,37,1,0,0,0,359,361,3,44,22,0,360,359,1,0,0,0,360,361,1,0,0,0, - 361,362,1,0,0,0,362,363,5,29,0,0,363,364,3,136,68,0,364,365,5,64, - 0,0,365,366,3,138,69,0,366,367,5,113,0,0,367,368,3,120,60,0,368, - 372,5,117,0,0,369,371,3,40,20,0,370,369,1,0,0,0,371,374,1,0,0,0, + 361,362,1,0,0,0,362,363,5,30,0,0,363,364,3,136,68,0,364,365,5,65, + 0,0,365,366,3,138,69,0,366,367,5,114,0,0,367,368,3,120,60,0,368, + 372,5,118,0,0,369,371,3,40,20,0,370,369,1,0,0,0,371,374,1,0,0,0, 372,370,1,0,0,0,372,373,1,0,0,0,373,375,1,0,0,0,374,372,1,0,0,0, - 375,376,5,118,0,0,376,39,1,0,0,0,377,378,5,71,0,0,378,379,5,64,0, - 0,379,380,3,138,69,0,380,381,5,114,0,0,381,397,1,0,0,0,382,383,5, - 72,0,0,383,384,5,64,0,0,384,385,3,138,69,0,385,386,5,114,0,0,386, - 397,1,0,0,0,387,388,5,73,0,0,388,389,5,74,0,0,389,390,5,64,0,0,390, - 391,3,138,69,0,391,392,5,75,0,0,392,393,5,64,0,0,393,394,3,138,69, - 0,394,395,5,114,0,0,395,397,1,0,0,0,396,377,1,0,0,0,396,382,1,0, + 375,376,5,119,0,0,376,39,1,0,0,0,377,378,5,72,0,0,378,379,5,65,0, + 0,379,380,3,138,69,0,380,381,5,115,0,0,381,397,1,0,0,0,382,383,5, + 73,0,0,383,384,5,65,0,0,384,385,3,138,69,0,385,386,5,115,0,0,386, + 397,1,0,0,0,387,388,5,74,0,0,388,389,5,75,0,0,389,390,5,65,0,0,390, + 391,3,138,69,0,391,392,5,76,0,0,392,393,5,65,0,0,393,394,3,138,69, + 0,394,395,5,115,0,0,395,397,1,0,0,0,396,377,1,0,0,0,396,382,1,0, 0,0,396,387,1,0,0,0,397,41,1,0,0,0,398,400,3,44,22,0,399,398,1,0, - 0,0,399,400,1,0,0,0,400,401,1,0,0,0,401,402,5,30,0,0,402,403,3,136, - 68,0,403,404,5,64,0,0,404,405,3,138,69,0,405,406,5,113,0,0,406,407, - 3,126,63,0,407,409,3,48,24,0,408,410,5,92,0,0,409,408,1,0,0,0,409, - 410,1,0,0,0,410,413,1,0,0,0,411,412,5,62,0,0,412,414,3,138,69,0, - 413,411,1,0,0,0,413,414,1,0,0,0,414,415,1,0,0,0,415,419,5,117,0, + 0,0,399,400,1,0,0,0,400,401,1,0,0,0,401,402,5,31,0,0,402,403,3,136, + 68,0,403,404,5,65,0,0,404,405,3,138,69,0,405,406,5,114,0,0,406,407, + 3,126,63,0,407,409,3,48,24,0,408,410,5,93,0,0,409,408,1,0,0,0,409, + 410,1,0,0,0,410,413,1,0,0,0,411,412,5,63,0,0,412,414,3,138,69,0, + 413,411,1,0,0,0,413,414,1,0,0,0,414,415,1,0,0,0,415,419,5,118,0, 0,416,418,3,46,23,0,417,416,1,0,0,0,418,421,1,0,0,0,419,417,1,0, - 0,0,419,420,1,0,0,0,420,422,1,0,0,0,421,419,1,0,0,0,422,423,5,118, - 0,0,423,43,1,0,0,0,424,426,5,14,0,0,425,427,5,15,0,0,426,425,1,0, - 0,0,426,427,1,0,0,0,427,45,1,0,0,0,428,429,5,78,0,0,429,430,5,64, - 0,0,430,431,3,138,69,0,431,432,5,114,0,0,432,453,1,0,0,0,433,434, - 5,79,0,0,434,435,5,64,0,0,435,436,3,138,69,0,436,437,5,114,0,0,437, - 453,1,0,0,0,438,439,5,80,0,0,439,440,5,64,0,0,440,441,3,138,69,0, - 441,442,5,114,0,0,442,453,1,0,0,0,443,444,5,73,0,0,444,445,5,74, - 0,0,445,446,5,64,0,0,446,447,3,138,69,0,447,448,5,75,0,0,448,449, - 5,64,0,0,449,450,3,138,69,0,450,451,5,114,0,0,451,453,1,0,0,0,452, + 0,0,419,420,1,0,0,0,420,422,1,0,0,0,421,419,1,0,0,0,422,423,5,119, + 0,0,423,43,1,0,0,0,424,426,5,15,0,0,425,427,5,16,0,0,426,425,1,0, + 0,0,426,427,1,0,0,0,427,45,1,0,0,0,428,429,5,79,0,0,429,430,5,65, + 0,0,430,431,3,138,69,0,431,432,5,115,0,0,432,453,1,0,0,0,433,434, + 5,80,0,0,434,435,5,65,0,0,435,436,3,138,69,0,436,437,5,115,0,0,437, + 453,1,0,0,0,438,439,5,81,0,0,439,440,5,65,0,0,440,441,3,138,69,0, + 441,442,5,115,0,0,442,453,1,0,0,0,443,444,5,74,0,0,444,445,5,75, + 0,0,445,446,5,65,0,0,446,447,3,138,69,0,447,448,5,76,0,0,448,449, + 5,65,0,0,449,450,3,138,69,0,450,451,5,115,0,0,451,453,1,0,0,0,452, 428,1,0,0,0,452,433,1,0,0,0,452,438,1,0,0,0,452,443,1,0,0,0,453, - 47,1,0,0,0,454,455,5,25,0,0,455,464,3,136,68,0,456,457,5,26,0,0, + 47,1,0,0,0,454,455,5,26,0,0,455,464,3,136,68,0,456,457,5,27,0,0, 457,459,3,136,68,0,458,460,3,28,14,0,459,458,1,0,0,0,459,460,1,0, - 0,0,460,464,1,0,0,0,461,462,5,18,0,0,462,464,3,136,68,0,463,454, + 0,0,460,464,1,0,0,0,461,462,5,19,0,0,462,464,3,136,68,0,463,454, 1,0,0,0,463,456,1,0,0,0,463,461,1,0,0,0,464,49,1,0,0,0,465,467,3, 16,8,0,466,465,1,0,0,0,467,470,1,0,0,0,468,466,1,0,0,0,468,469,1, - 0,0,0,469,471,1,0,0,0,470,468,1,0,0,0,471,472,5,28,0,0,472,473,3, - 136,68,0,473,474,5,64,0,0,474,475,3,138,69,0,475,476,5,58,0,0,476, - 479,3,138,69,0,477,478,5,59,0,0,478,480,5,127,0,0,479,477,1,0,0, - 0,479,480,1,0,0,0,480,481,1,0,0,0,481,485,5,117,0,0,482,484,3,52, + 0,0,0,469,471,1,0,0,0,470,468,1,0,0,0,471,472,5,29,0,0,472,473,3, + 136,68,0,473,474,5,65,0,0,474,475,3,138,69,0,475,476,5,59,0,0,476, + 479,3,138,69,0,477,478,5,60,0,0,478,480,5,128,0,0,479,477,1,0,0, + 0,479,480,1,0,0,0,480,481,1,0,0,0,481,485,5,118,0,0,482,484,3,52, 26,0,483,482,1,0,0,0,484,487,1,0,0,0,485,483,1,0,0,0,485,486,1,0, - 0,0,486,488,1,0,0,0,487,485,1,0,0,0,488,489,5,118,0,0,489,51,1,0, + 0,0,486,488,1,0,0,0,487,485,1,0,0,0,488,489,5,119,0,0,489,51,1,0, 0,0,490,496,3,60,30,0,491,496,3,62,31,0,492,496,3,64,32,0,493,496, 3,54,27,0,494,496,3,56,28,0,495,490,1,0,0,0,495,491,1,0,0,0,495, 492,1,0,0,0,495,493,1,0,0,0,495,494,1,0,0,0,496,53,1,0,0,0,497,498, 5,5,0,0,498,500,3,136,68,0,499,501,3,22,11,0,500,499,1,0,0,0,500, - 501,1,0,0,0,501,502,1,0,0,0,502,503,5,64,0,0,503,504,3,138,69,0, - 504,506,5,7,0,0,505,507,5,1,0,0,506,505,1,0,0,0,506,507,1,0,0,0, - 507,508,1,0,0,0,508,509,3,26,13,0,509,510,5,8,0,0,510,511,3,138, - 69,0,511,512,5,31,0,0,512,513,3,138,69,0,513,517,5,117,0,0,514,516, + 501,1,0,0,0,501,502,1,0,0,0,502,503,5,65,0,0,503,504,3,138,69,0, + 504,506,5,8,0,0,505,507,5,1,0,0,506,505,1,0,0,0,506,507,1,0,0,0, + 507,508,1,0,0,0,508,509,3,26,13,0,509,510,5,9,0,0,510,511,3,138, + 69,0,511,512,5,32,0,0,512,513,3,138,69,0,513,517,5,118,0,0,514,516, 3,58,29,0,515,514,1,0,0,0,516,519,1,0,0,0,517,515,1,0,0,0,517,518, - 1,0,0,0,518,520,1,0,0,0,519,517,1,0,0,0,520,521,5,118,0,0,521,55, - 1,0,0,0,522,523,5,5,0,0,523,524,3,136,68,0,524,525,5,64,0,0,525, - 526,3,138,69,0,526,527,5,6,0,0,527,528,3,136,68,0,528,529,3,28,14, - 0,529,530,5,114,0,0,530,57,1,0,0,0,531,532,5,9,0,0,532,533,3,138, - 69,0,533,534,5,114,0,0,534,565,1,0,0,0,535,537,5,10,0,0,536,538, - 5,18,0,0,537,536,1,0,0,0,537,538,1,0,0,0,538,539,1,0,0,0,539,540, - 3,136,68,0,540,541,5,37,0,0,541,542,3,26,13,0,542,543,5,114,0,0, - 543,565,1,0,0,0,544,545,5,11,0,0,545,546,3,136,68,0,546,547,5,127, - 0,0,547,548,5,114,0,0,548,565,1,0,0,0,549,550,5,12,0,0,550,551,3, - 26,13,0,551,552,5,116,0,0,552,553,3,136,68,0,553,554,3,136,68,0, - 554,555,3,138,69,0,555,556,5,114,0,0,556,565,1,0,0,0,557,558,5,73, - 0,0,558,565,5,114,0,0,559,560,5,13,0,0,560,561,5,127,0,0,561,562, - 3,138,69,0,562,563,5,114,0,0,563,565,1,0,0,0,564,531,1,0,0,0,564, + 1,0,0,0,518,520,1,0,0,0,519,517,1,0,0,0,520,521,5,119,0,0,521,55, + 1,0,0,0,522,523,5,5,0,0,523,524,3,136,68,0,524,525,5,65,0,0,525, + 526,3,138,69,0,526,527,5,7,0,0,527,528,3,136,68,0,528,529,3,28,14, + 0,529,530,5,115,0,0,530,57,1,0,0,0,531,532,5,10,0,0,532,533,3,138, + 69,0,533,534,5,115,0,0,534,565,1,0,0,0,535,537,5,11,0,0,536,538, + 5,19,0,0,537,536,1,0,0,0,537,538,1,0,0,0,538,539,1,0,0,0,539,540, + 3,136,68,0,540,541,5,38,0,0,541,542,3,26,13,0,542,543,5,115,0,0, + 543,565,1,0,0,0,544,545,5,12,0,0,545,546,3,136,68,0,546,547,5,128, + 0,0,547,548,5,115,0,0,548,565,1,0,0,0,549,550,5,13,0,0,550,551,3, + 26,13,0,551,552,5,117,0,0,552,553,3,136,68,0,553,554,3,136,68,0, + 554,555,3,138,69,0,555,556,5,115,0,0,556,565,1,0,0,0,557,558,5,74, + 0,0,558,565,5,115,0,0,559,560,5,14,0,0,560,561,5,128,0,0,561,562, + 3,138,69,0,562,563,5,115,0,0,563,565,1,0,0,0,564,531,1,0,0,0,564, 535,1,0,0,0,564,544,1,0,0,0,564,549,1,0,0,0,564,557,1,0,0,0,564, - 559,1,0,0,0,565,59,1,0,0,0,566,567,5,31,0,0,567,569,3,136,68,0,568, + 559,1,0,0,0,565,59,1,0,0,0,566,567,5,32,0,0,567,569,3,136,68,0,568, 570,3,22,11,0,569,568,1,0,0,0,569,570,1,0,0,0,570,571,1,0,0,0,571, - 572,5,64,0,0,572,573,3,138,69,0,573,574,5,113,0,0,574,575,3,120, - 60,0,575,576,5,112,0,0,576,577,3,120,60,0,577,578,5,66,0,0,578,580, + 572,5,65,0,0,572,573,3,138,69,0,573,574,5,114,0,0,574,575,3,120, + 60,0,575,576,5,113,0,0,576,577,3,120,60,0,577,578,5,67,0,0,578,580, 3,68,34,0,579,581,3,66,33,0,580,579,1,0,0,0,580,581,1,0,0,0,581, - 582,1,0,0,0,582,583,5,68,0,0,583,585,3,70,35,0,584,586,3,74,37,0, - 585,584,1,0,0,0,585,586,1,0,0,0,586,587,1,0,0,0,587,588,5,114,0, - 0,588,61,1,0,0,0,589,590,5,32,0,0,590,592,3,136,68,0,591,593,3,22, - 11,0,592,591,1,0,0,0,592,593,1,0,0,0,593,594,1,0,0,0,594,595,5,64, - 0,0,595,596,3,138,69,0,596,597,5,113,0,0,597,598,3,120,60,0,598, - 599,5,112,0,0,599,601,3,120,60,0,600,602,3,74,37,0,601,600,1,0,0, - 0,601,602,1,0,0,0,602,603,1,0,0,0,603,604,5,114,0,0,604,63,1,0,0, - 0,605,606,5,33,0,0,606,607,3,136,68,0,607,608,5,64,0,0,608,609,3, - 138,69,0,609,610,5,34,0,0,610,611,3,136,68,0,611,612,5,113,0,0,612, + 582,1,0,0,0,582,583,5,69,0,0,583,585,3,70,35,0,584,586,3,74,37,0, + 585,584,1,0,0,0,585,586,1,0,0,0,586,587,1,0,0,0,587,588,5,115,0, + 0,588,61,1,0,0,0,589,590,5,33,0,0,590,592,3,136,68,0,591,593,3,22, + 11,0,592,591,1,0,0,0,592,593,1,0,0,0,593,594,1,0,0,0,594,595,5,65, + 0,0,595,596,3,138,69,0,596,597,5,114,0,0,597,598,3,120,60,0,598, + 599,5,113,0,0,599,601,3,120,60,0,600,602,3,74,37,0,601,600,1,0,0, + 0,601,602,1,0,0,0,602,603,1,0,0,0,603,604,5,115,0,0,604,63,1,0,0, + 0,605,606,5,34,0,0,606,607,3,136,68,0,607,608,5,65,0,0,608,609,3, + 138,69,0,609,610,5,35,0,0,610,611,3,136,68,0,611,612,5,114,0,0,612, 614,3,120,60,0,613,615,3,74,37,0,614,613,1,0,0,0,614,615,1,0,0,0, - 615,616,1,0,0,0,616,617,5,114,0,0,617,65,1,0,0,0,618,619,5,67,0, + 615,616,1,0,0,0,616,617,5,115,0,0,617,65,1,0,0,0,618,619,5,68,0, 0,619,620,3,120,60,0,620,67,1,0,0,0,621,622,7,0,0,0,622,69,1,0,0, - 0,623,642,5,70,0,0,624,625,5,25,0,0,625,642,3,136,68,0,626,627,5, - 18,0,0,627,642,3,136,68,0,628,629,5,27,0,0,629,638,5,119,0,0,630, - 635,3,26,13,0,631,632,5,115,0,0,632,634,3,26,13,0,633,631,1,0,0, + 0,623,642,5,71,0,0,624,625,5,26,0,0,625,642,3,136,68,0,626,627,5, + 19,0,0,627,642,3,136,68,0,628,629,5,28,0,0,629,638,5,120,0,0,630, + 635,3,26,13,0,631,632,5,116,0,0,632,634,3,26,13,0,633,631,1,0,0, 0,634,637,1,0,0,0,635,633,1,0,0,0,635,636,1,0,0,0,636,639,1,0,0, 0,637,635,1,0,0,0,638,630,1,0,0,0,638,639,1,0,0,0,639,640,1,0,0, - 0,640,642,5,120,0,0,641,623,1,0,0,0,641,624,1,0,0,0,641,626,1,0, + 0,640,642,5,121,0,0,641,623,1,0,0,0,641,624,1,0,0,0,641,626,1,0, 0,0,641,628,1,0,0,0,642,71,1,0,0,0,643,648,3,136,68,0,644,645,5, - 115,0,0,645,647,3,136,68,0,646,644,1,0,0,0,647,650,1,0,0,0,648,646, + 116,0,0,645,647,3,136,68,0,646,644,1,0,0,0,647,650,1,0,0,0,648,646, 1,0,0,0,648,649,1,0,0,0,649,73,1,0,0,0,650,648,1,0,0,0,651,652,5, - 69,0,0,652,656,5,117,0,0,653,655,3,76,38,0,654,653,1,0,0,0,655,658, + 70,0,0,652,656,5,118,0,0,653,655,3,76,38,0,654,653,1,0,0,0,655,658, 1,0,0,0,656,654,1,0,0,0,656,657,1,0,0,0,657,659,1,0,0,0,658,656, - 1,0,0,0,659,660,5,118,0,0,660,75,1,0,0,0,661,662,5,43,0,0,662,663, - 3,136,68,0,663,664,5,64,0,0,664,665,3,138,69,0,665,666,5,113,0,0, - 666,667,3,120,60,0,667,668,3,78,39,0,668,669,5,114,0,0,669,714,1, - 0,0,0,670,671,5,44,0,0,671,672,3,136,68,0,672,673,5,64,0,0,673,674, - 3,138,69,0,674,675,5,113,0,0,675,676,3,126,63,0,676,677,3,48,24, - 0,677,678,3,78,39,0,678,679,5,114,0,0,679,714,1,0,0,0,680,681,5, - 26,0,0,681,682,3,136,68,0,682,683,5,64,0,0,683,684,3,138,69,0,684, - 685,5,113,0,0,685,687,3,136,68,0,686,688,3,28,14,0,687,686,1,0,0, - 0,687,688,1,0,0,0,688,689,1,0,0,0,689,690,5,114,0,0,690,714,1,0, - 0,0,691,692,5,33,0,0,692,693,3,136,68,0,693,694,5,64,0,0,694,695, - 3,138,69,0,695,696,5,113,0,0,696,699,3,136,68,0,697,698,5,35,0,0, - 698,700,3,120,60,0,699,697,1,0,0,0,699,700,1,0,0,0,700,701,1,0,0, - 0,701,702,5,114,0,0,702,714,1,0,0,0,703,704,5,5,0,0,704,705,3,136, - 68,0,705,706,5,64,0,0,706,707,3,138,69,0,707,708,5,113,0,0,708,709, - 3,136,68,0,709,710,5,116,0,0,710,711,3,136,68,0,711,712,5,114,0, - 0,712,714,1,0,0,0,713,661,1,0,0,0,713,670,1,0,0,0,713,680,1,0,0, - 0,713,691,1,0,0,0,713,703,1,0,0,0,714,77,1,0,0,0,715,716,5,119,0, - 0,716,721,3,80,40,0,717,718,5,115,0,0,718,720,3,80,40,0,719,717, - 1,0,0,0,720,723,1,0,0,0,721,719,1,0,0,0,721,722,1,0,0,0,722,724, - 1,0,0,0,723,721,1,0,0,0,724,725,5,120,0,0,725,79,1,0,0,0,726,727, - 7,1,0,0,727,81,1,0,0,0,728,729,5,42,0,0,729,730,3,84,42,0,730,83, - 1,0,0,0,731,734,3,86,43,0,732,734,3,90,45,0,733,731,1,0,0,0,733, - 732,1,0,0,0,734,85,1,0,0,0,735,736,5,43,0,0,736,737,3,136,68,0,737, - 738,5,64,0,0,738,739,3,138,69,0,739,740,5,52,0,0,740,741,3,136,68, - 0,741,742,5,113,0,0,742,743,3,120,60,0,743,744,5,53,0,0,744,747, - 3,88,44,0,745,746,5,54,0,0,746,748,3,128,64,0,747,745,1,0,0,0,747, - 748,1,0,0,0,748,749,1,0,0,0,749,750,5,114,0,0,750,87,1,0,0,0,751, - 758,5,86,0,0,752,753,5,87,0,0,753,754,5,121,0,0,754,755,3,120,60, - 0,755,756,5,122,0,0,756,758,1,0,0,0,757,751,1,0,0,0,757,752,1,0, - 0,0,758,89,1,0,0,0,759,760,5,44,0,0,760,761,3,136,68,0,761,762,5, - 64,0,0,762,763,3,138,69,0,763,764,5,117,0,0,764,765,3,92,46,0,765, - 766,3,92,46,0,766,767,5,118,0,0,767,91,1,0,0,0,768,769,3,48,24,0, - 769,770,5,45,0,0,770,771,3,136,68,0,771,772,5,64,0,0,772,773,3,138, - 69,0,773,775,3,126,63,0,774,776,5,92,0,0,775,774,1,0,0,0,775,776, - 1,0,0,0,776,779,1,0,0,0,777,778,5,60,0,0,778,780,3,138,69,0,779, - 777,1,0,0,0,779,780,1,0,0,0,780,782,1,0,0,0,781,783,5,61,0,0,782, - 781,1,0,0,0,782,783,1,0,0,0,783,786,1,0,0,0,784,785,5,62,0,0,785, - 787,3,138,69,0,786,784,1,0,0,0,786,787,1,0,0,0,787,789,1,0,0,0,788, - 790,5,63,0,0,789,788,1,0,0,0,789,790,1,0,0,0,790,791,1,0,0,0,791, - 792,5,114,0,0,792,93,1,0,0,0,793,794,5,36,0,0,794,795,3,136,68,0, - 795,796,5,37,0,0,796,798,3,136,68,0,797,799,3,28,14,0,798,797,1, - 0,0,0,798,799,1,0,0,0,799,802,1,0,0,0,800,801,5,64,0,0,801,803,3, - 138,69,0,802,800,1,0,0,0,802,803,1,0,0,0,803,806,1,0,0,0,804,805, - 5,59,0,0,805,807,5,127,0,0,806,804,1,0,0,0,806,807,1,0,0,0,807,808, - 1,0,0,0,808,812,5,117,0,0,809,811,3,96,48,0,810,809,1,0,0,0,811, - 814,1,0,0,0,812,810,1,0,0,0,812,813,1,0,0,0,813,815,1,0,0,0,814, - 812,1,0,0,0,815,816,5,118,0,0,816,95,1,0,0,0,817,818,5,41,0,0,818, - 823,3,84,42,0,819,823,3,102,51,0,820,823,3,98,49,0,821,823,3,100, - 50,0,822,817,1,0,0,0,822,819,1,0,0,0,822,820,1,0,0,0,822,821,1,0, - 0,0,823,97,1,0,0,0,824,825,5,38,0,0,825,826,3,136,68,0,826,827,5, - 40,0,0,827,828,5,43,0,0,828,829,3,136,68,0,829,830,5,114,0,0,830, - 99,1,0,0,0,831,832,5,49,0,0,832,833,3,136,68,0,833,834,5,50,0,0, - 834,835,5,51,0,0,835,836,5,47,0,0,836,837,5,33,0,0,837,838,3,136, - 68,0,838,839,5,48,0,0,839,840,5,44,0,0,840,841,3,136,68,0,841,842, - 5,116,0,0,842,843,3,136,68,0,843,844,5,114,0,0,844,101,1,0,0,0,845, - 846,5,38,0,0,846,847,3,104,52,0,847,848,5,40,0,0,848,851,3,108,54, - 0,849,850,5,16,0,0,850,852,3,138,69,0,851,849,1,0,0,0,851,852,1, - 0,0,0,852,853,1,0,0,0,853,854,5,114,0,0,854,103,1,0,0,0,855,856, - 3,136,68,0,856,857,5,116,0,0,857,858,3,106,53,0,858,105,1,0,0,0, - 859,871,3,136,68,0,860,871,5,81,0,0,861,871,5,71,0,0,862,871,5,72, - 0,0,863,871,5,78,0,0,864,871,5,79,0,0,865,871,5,80,0,0,866,871,5, - 82,0,0,867,871,5,83,0,0,868,871,5,84,0,0,869,871,5,85,0,0,870,859, - 1,0,0,0,870,860,1,0,0,0,870,861,1,0,0,0,870,862,1,0,0,0,870,863, - 1,0,0,0,870,864,1,0,0,0,870,865,1,0,0,0,870,866,1,0,0,0,870,867, - 1,0,0,0,870,868,1,0,0,0,870,869,1,0,0,0,871,107,1,0,0,0,872,873, - 5,43,0,0,873,874,3,136,68,0,874,875,5,116,0,0,875,876,3,110,55,0, - 876,903,1,0,0,0,877,878,5,44,0,0,878,879,3,136,68,0,879,880,5,116, - 0,0,880,881,3,136,68,0,881,882,5,116,0,0,882,883,3,112,56,0,883, - 903,1,0,0,0,884,885,5,26,0,0,885,887,3,136,68,0,886,888,3,28,14, - 0,887,886,1,0,0,0,887,888,1,0,0,0,888,889,1,0,0,0,889,890,5,116, - 0,0,890,891,3,104,52,0,891,903,1,0,0,0,892,893,5,28,0,0,893,894, - 3,136,68,0,894,895,5,116,0,0,895,897,3,136,68,0,896,898,3,28,14, - 0,897,896,1,0,0,0,897,898,1,0,0,0,898,900,1,0,0,0,899,901,3,114, - 57,0,900,899,1,0,0,0,900,901,1,0,0,0,901,903,1,0,0,0,902,872,1,0, - 0,0,902,877,1,0,0,0,902,884,1,0,0,0,902,892,1,0,0,0,903,109,1,0, - 0,0,904,905,7,2,0,0,905,111,1,0,0,0,906,907,7,3,0,0,907,113,1,0, - 0,0,908,909,5,46,0,0,909,913,5,117,0,0,910,912,3,116,58,0,911,910, - 1,0,0,0,912,915,1,0,0,0,913,911,1,0,0,0,913,914,1,0,0,0,914,916, - 1,0,0,0,915,913,1,0,0,0,916,917,5,118,0,0,917,115,1,0,0,0,918,919, - 3,136,68,0,919,920,5,40,0,0,920,921,5,43,0,0,921,928,3,136,68,0, - 922,923,5,48,0,0,923,924,5,44,0,0,924,925,3,136,68,0,925,926,5,116, - 0,0,926,927,3,136,68,0,927,929,1,0,0,0,928,922,1,0,0,0,928,929,1, - 0,0,0,929,930,1,0,0,0,930,931,5,114,0,0,931,991,1,0,0,0,932,933, - 3,136,68,0,933,934,5,40,0,0,934,935,5,44,0,0,935,936,3,136,68,0, - 936,937,5,116,0,0,937,944,3,136,68,0,938,939,5,48,0,0,939,940,5, - 44,0,0,940,941,3,136,68,0,941,942,5,116,0,0,942,943,3,136,68,0,943, - 945,1,0,0,0,944,938,1,0,0,0,944,945,1,0,0,0,945,946,1,0,0,0,946, - 947,5,114,0,0,947,991,1,0,0,0,948,949,3,136,68,0,949,950,5,40,0, - 0,950,951,5,26,0,0,951,953,3,136,68,0,952,954,3,28,14,0,953,952, - 1,0,0,0,953,954,1,0,0,0,954,961,1,0,0,0,955,956,5,48,0,0,956,957, - 5,44,0,0,957,958,3,136,68,0,958,959,5,116,0,0,959,960,3,136,68,0, - 960,962,1,0,0,0,961,955,1,0,0,0,961,962,1,0,0,0,962,963,1,0,0,0, - 963,964,5,114,0,0,964,991,1,0,0,0,965,966,3,136,68,0,966,967,5,40, - 0,0,967,968,5,33,0,0,968,969,3,136,68,0,969,970,5,114,0,0,970,991, - 1,0,0,0,971,972,3,136,68,0,972,974,5,40,0,0,973,975,5,1,0,0,974, - 973,1,0,0,0,974,975,1,0,0,0,975,976,1,0,0,0,976,977,5,5,0,0,977, - 978,3,136,68,0,978,979,5,116,0,0,979,986,3,136,68,0,980,981,5,48, - 0,0,981,982,5,44,0,0,982,983,3,136,68,0,983,984,5,116,0,0,984,985, - 3,136,68,0,985,987,1,0,0,0,986,980,1,0,0,0,986,987,1,0,0,0,987,988, - 1,0,0,0,988,989,5,114,0,0,989,991,1,0,0,0,990,918,1,0,0,0,990,932, - 1,0,0,0,990,948,1,0,0,0,990,965,1,0,0,0,990,971,1,0,0,0,991,117, - 1,0,0,0,992,993,5,33,0,0,993,994,3,136,68,0,994,995,5,40,0,0,995, - 996,3,136,68,0,996,997,5,116,0,0,997,999,3,136,68,0,998,1000,3,114, - 57,0,999,998,1,0,0,0,999,1000,1,0,0,0,1000,1001,1,0,0,0,1001,1002, - 5,114,0,0,1002,119,1,0,0,0,1003,1050,3,124,62,0,1004,1050,5,93,0, - 0,1005,1050,5,94,0,0,1006,1007,5,95,0,0,1007,1050,3,138,69,0,1008, - 1009,5,96,0,0,1009,1010,5,123,0,0,1010,1011,3,136,68,0,1011,1012, - 5,124,0,0,1012,1050,1,0,0,0,1013,1014,5,97,0,0,1014,1015,5,123,0, - 0,1015,1017,3,136,68,0,1016,1018,3,28,14,0,1017,1016,1,0,0,0,1017, - 1018,1,0,0,0,1018,1019,1,0,0,0,1019,1020,5,124,0,0,1020,1050,1,0, - 0,0,1021,1022,5,21,0,0,1022,1023,5,123,0,0,1023,1024,3,136,68,0, - 1024,1025,5,124,0,0,1025,1050,1,0,0,0,1026,1027,5,98,0,0,1027,1028, - 5,123,0,0,1028,1029,3,120,60,0,1029,1030,5,124,0,0,1030,1050,1,0, - 0,0,1031,1032,5,99,0,0,1032,1033,5,123,0,0,1033,1034,3,120,60,0, - 1034,1035,5,124,0,0,1035,1050,1,0,0,0,1036,1037,5,100,0,0,1037,1041, - 5,117,0,0,1038,1040,3,122,61,0,1039,1038,1,0,0,0,1040,1043,1,0,0, - 0,1041,1039,1,0,0,0,1041,1042,1,0,0,0,1042,1044,1,0,0,0,1043,1041, - 1,0,0,0,1044,1050,5,118,0,0,1045,1047,3,136,68,0,1046,1048,3,28, - 14,0,1047,1046,1,0,0,0,1047,1048,1,0,0,0,1048,1050,1,0,0,0,1049, - 1003,1,0,0,0,1049,1004,1,0,0,0,1049,1005,1,0,0,0,1049,1006,1,0,0, - 0,1049,1008,1,0,0,0,1049,1013,1,0,0,0,1049,1021,1,0,0,0,1049,1026, - 1,0,0,0,1049,1031,1,0,0,0,1049,1036,1,0,0,0,1049,1045,1,0,0,0,1050, - 121,1,0,0,0,1051,1052,3,136,68,0,1052,1053,5,113,0,0,1053,1054,3, - 120,60,0,1054,1055,5,114,0,0,1055,123,1,0,0,0,1056,1057,7,4,0,0, - 1057,125,1,0,0,0,1058,1059,7,5,0,0,1059,127,1,0,0,0,1060,1069,3, - 138,69,0,1061,1069,5,127,0,0,1062,1069,5,128,0,0,1063,1069,5,109, - 0,0,1064,1069,5,110,0,0,1065,1069,5,111,0,0,1066,1069,3,130,65,0, - 1067,1069,3,134,67,0,1068,1060,1,0,0,0,1068,1061,1,0,0,0,1068,1062, - 1,0,0,0,1068,1063,1,0,0,0,1068,1064,1,0,0,0,1068,1065,1,0,0,0,1068, - 1066,1,0,0,0,1068,1067,1,0,0,0,1069,129,1,0,0,0,1070,1079,5,117, - 0,0,1071,1076,3,132,66,0,1072,1073,5,115,0,0,1073,1075,3,132,66, - 0,1074,1072,1,0,0,0,1075,1078,1,0,0,0,1076,1074,1,0,0,0,1076,1077, - 1,0,0,0,1077,1080,1,0,0,0,1078,1076,1,0,0,0,1079,1071,1,0,0,0,1079, - 1080,1,0,0,0,1080,1081,1,0,0,0,1081,1082,5,118,0,0,1082,131,1,0, - 0,0,1083,1084,3,138,69,0,1084,1085,5,113,0,0,1085,1086,3,128,64, - 0,1086,133,1,0,0,0,1087,1096,5,119,0,0,1088,1093,3,128,64,0,1089, - 1090,5,115,0,0,1090,1092,3,128,64,0,1091,1089,1,0,0,0,1092,1095, - 1,0,0,0,1093,1091,1,0,0,0,1093,1094,1,0,0,0,1094,1097,1,0,0,0,1095, - 1093,1,0,0,0,1096,1088,1,0,0,0,1096,1097,1,0,0,0,1097,1098,1,0,0, - 0,1098,1099,5,120,0,0,1099,135,1,0,0,0,1100,1101,7,6,0,0,1101,137, - 1,0,0,0,1102,1103,5,130,0,0,1103,139,1,0,0,0,95,152,159,180,192, + 1,0,0,0,659,660,5,119,0,0,660,75,1,0,0,0,661,662,5,6,0,0,662,663, + 3,136,68,0,663,664,5,65,0,0,664,665,3,138,69,0,665,666,5,120,0,0, + 666,667,3,72,36,0,667,668,5,121,0,0,668,669,5,115,0,0,669,723,1, + 0,0,0,670,671,5,44,0,0,671,672,3,136,68,0,672,673,5,65,0,0,673,674, + 3,138,69,0,674,675,5,114,0,0,675,676,3,120,60,0,676,677,3,78,39, + 0,677,678,5,115,0,0,678,723,1,0,0,0,679,680,5,45,0,0,680,681,3,136, + 68,0,681,682,5,65,0,0,682,683,3,138,69,0,683,684,5,114,0,0,684,685, + 3,126,63,0,685,686,3,48,24,0,686,687,3,78,39,0,687,688,5,115,0,0, + 688,723,1,0,0,0,689,690,5,27,0,0,690,691,3,136,68,0,691,692,5,65, + 0,0,692,693,3,138,69,0,693,694,5,114,0,0,694,696,3,136,68,0,695, + 697,3,28,14,0,696,695,1,0,0,0,696,697,1,0,0,0,697,698,1,0,0,0,698, + 699,5,115,0,0,699,723,1,0,0,0,700,701,5,34,0,0,701,702,3,136,68, + 0,702,703,5,65,0,0,703,704,3,138,69,0,704,705,5,114,0,0,705,708, + 3,136,68,0,706,707,5,36,0,0,707,709,3,120,60,0,708,706,1,0,0,0,708, + 709,1,0,0,0,709,710,1,0,0,0,710,711,5,115,0,0,711,723,1,0,0,0,712, + 713,5,5,0,0,713,714,3,136,68,0,714,715,5,65,0,0,715,716,3,138,69, + 0,716,717,5,114,0,0,717,718,3,136,68,0,718,719,5,117,0,0,719,720, + 3,136,68,0,720,721,5,115,0,0,721,723,1,0,0,0,722,661,1,0,0,0,722, + 670,1,0,0,0,722,679,1,0,0,0,722,689,1,0,0,0,722,700,1,0,0,0,722, + 712,1,0,0,0,723,77,1,0,0,0,724,725,5,120,0,0,725,730,3,80,40,0,726, + 727,5,116,0,0,727,729,3,80,40,0,728,726,1,0,0,0,729,732,1,0,0,0, + 730,728,1,0,0,0,730,731,1,0,0,0,731,733,1,0,0,0,732,730,1,0,0,0, + 733,734,5,121,0,0,734,79,1,0,0,0,735,736,7,1,0,0,736,81,1,0,0,0, + 737,738,5,43,0,0,738,739,3,84,42,0,739,83,1,0,0,0,740,743,3,86,43, + 0,741,743,3,90,45,0,742,740,1,0,0,0,742,741,1,0,0,0,743,85,1,0,0, + 0,744,745,5,44,0,0,745,746,3,136,68,0,746,747,5,65,0,0,747,748,3, + 138,69,0,748,749,5,53,0,0,749,750,3,136,68,0,750,751,5,114,0,0,751, + 752,3,120,60,0,752,753,5,54,0,0,753,756,3,88,44,0,754,755,5,55,0, + 0,755,757,3,128,64,0,756,754,1,0,0,0,756,757,1,0,0,0,757,758,1,0, + 0,0,758,759,5,115,0,0,759,87,1,0,0,0,760,767,5,87,0,0,761,762,5, + 88,0,0,762,763,5,122,0,0,763,764,3,120,60,0,764,765,5,123,0,0,765, + 767,1,0,0,0,766,760,1,0,0,0,766,761,1,0,0,0,767,89,1,0,0,0,768,769, + 5,45,0,0,769,770,3,136,68,0,770,771,5,65,0,0,771,772,3,138,69,0, + 772,773,5,118,0,0,773,774,3,92,46,0,774,775,3,92,46,0,775,776,5, + 119,0,0,776,91,1,0,0,0,777,778,3,48,24,0,778,779,5,46,0,0,779,780, + 3,136,68,0,780,781,5,65,0,0,781,782,3,138,69,0,782,784,3,126,63, + 0,783,785,5,93,0,0,784,783,1,0,0,0,784,785,1,0,0,0,785,788,1,0,0, + 0,786,787,5,61,0,0,787,789,3,138,69,0,788,786,1,0,0,0,788,789,1, + 0,0,0,789,791,1,0,0,0,790,792,5,62,0,0,791,790,1,0,0,0,791,792,1, + 0,0,0,792,795,1,0,0,0,793,794,5,63,0,0,794,796,3,138,69,0,795,793, + 1,0,0,0,795,796,1,0,0,0,796,798,1,0,0,0,797,799,5,64,0,0,798,797, + 1,0,0,0,798,799,1,0,0,0,799,800,1,0,0,0,800,801,5,115,0,0,801,93, + 1,0,0,0,802,803,5,37,0,0,803,804,3,136,68,0,804,805,5,38,0,0,805, + 807,3,136,68,0,806,808,3,28,14,0,807,806,1,0,0,0,807,808,1,0,0,0, + 808,811,1,0,0,0,809,810,5,65,0,0,810,812,3,138,69,0,811,809,1,0, + 0,0,811,812,1,0,0,0,812,815,1,0,0,0,813,814,5,60,0,0,814,816,5,128, + 0,0,815,813,1,0,0,0,815,816,1,0,0,0,816,817,1,0,0,0,817,821,5,118, + 0,0,818,820,3,96,48,0,819,818,1,0,0,0,820,823,1,0,0,0,821,819,1, + 0,0,0,821,822,1,0,0,0,822,824,1,0,0,0,823,821,1,0,0,0,824,825,5, + 119,0,0,825,95,1,0,0,0,826,827,5,42,0,0,827,832,3,84,42,0,828,832, + 3,102,51,0,829,832,3,98,49,0,830,832,3,100,50,0,831,826,1,0,0,0, + 831,828,1,0,0,0,831,829,1,0,0,0,831,830,1,0,0,0,832,97,1,0,0,0,833, + 834,5,39,0,0,834,835,3,136,68,0,835,836,5,41,0,0,836,837,5,44,0, + 0,837,838,3,136,68,0,838,839,5,115,0,0,839,99,1,0,0,0,840,841,5, + 50,0,0,841,842,3,136,68,0,842,843,5,51,0,0,843,844,5,52,0,0,844, + 845,5,48,0,0,845,846,5,34,0,0,846,847,3,136,68,0,847,848,5,49,0, + 0,848,849,5,45,0,0,849,850,3,136,68,0,850,851,5,117,0,0,851,852, + 3,136,68,0,852,853,5,115,0,0,853,101,1,0,0,0,854,855,5,39,0,0,855, + 856,3,104,52,0,856,857,5,41,0,0,857,860,3,108,54,0,858,859,5,17, + 0,0,859,861,3,138,69,0,860,858,1,0,0,0,860,861,1,0,0,0,861,862,1, + 0,0,0,862,863,5,115,0,0,863,103,1,0,0,0,864,865,3,136,68,0,865,866, + 5,117,0,0,866,867,3,106,53,0,867,105,1,0,0,0,868,880,3,136,68,0, + 869,880,5,82,0,0,870,880,5,72,0,0,871,880,5,73,0,0,872,880,5,79, + 0,0,873,880,5,80,0,0,874,880,5,81,0,0,875,880,5,83,0,0,876,880,5, + 84,0,0,877,880,5,85,0,0,878,880,5,86,0,0,879,868,1,0,0,0,879,869, + 1,0,0,0,879,870,1,0,0,0,879,871,1,0,0,0,879,872,1,0,0,0,879,873, + 1,0,0,0,879,874,1,0,0,0,879,875,1,0,0,0,879,876,1,0,0,0,879,877, + 1,0,0,0,879,878,1,0,0,0,880,107,1,0,0,0,881,882,5,44,0,0,882,883, + 3,136,68,0,883,884,5,117,0,0,884,885,3,110,55,0,885,912,1,0,0,0, + 886,887,5,45,0,0,887,888,3,136,68,0,888,889,5,117,0,0,889,890,3, + 136,68,0,890,891,5,117,0,0,891,892,3,112,56,0,892,912,1,0,0,0,893, + 894,5,27,0,0,894,896,3,136,68,0,895,897,3,28,14,0,896,895,1,0,0, + 0,896,897,1,0,0,0,897,898,1,0,0,0,898,899,5,117,0,0,899,900,3,104, + 52,0,900,912,1,0,0,0,901,902,5,29,0,0,902,903,3,136,68,0,903,904, + 5,117,0,0,904,906,3,136,68,0,905,907,3,28,14,0,906,905,1,0,0,0,906, + 907,1,0,0,0,907,909,1,0,0,0,908,910,3,114,57,0,909,908,1,0,0,0,909, + 910,1,0,0,0,910,912,1,0,0,0,911,881,1,0,0,0,911,886,1,0,0,0,911, + 893,1,0,0,0,911,901,1,0,0,0,912,109,1,0,0,0,913,914,7,2,0,0,914, + 111,1,0,0,0,915,916,7,3,0,0,916,113,1,0,0,0,917,918,5,47,0,0,918, + 922,5,118,0,0,919,921,3,116,58,0,920,919,1,0,0,0,921,924,1,0,0,0, + 922,920,1,0,0,0,922,923,1,0,0,0,923,925,1,0,0,0,924,922,1,0,0,0, + 925,926,5,119,0,0,926,115,1,0,0,0,927,928,3,136,68,0,928,929,5,41, + 0,0,929,930,5,1,0,0,930,931,5,6,0,0,931,932,5,120,0,0,932,933,3, + 72,36,0,933,934,5,121,0,0,934,935,5,115,0,0,935,1009,1,0,0,0,936, + 937,3,136,68,0,937,938,5,41,0,0,938,939,5,44,0,0,939,946,3,136,68, + 0,940,941,5,49,0,0,941,942,5,45,0,0,942,943,3,136,68,0,943,944,5, + 117,0,0,944,945,3,136,68,0,945,947,1,0,0,0,946,940,1,0,0,0,946,947, + 1,0,0,0,947,948,1,0,0,0,948,949,5,115,0,0,949,1009,1,0,0,0,950,951, + 3,136,68,0,951,952,5,41,0,0,952,953,5,45,0,0,953,954,3,136,68,0, + 954,955,5,117,0,0,955,962,3,136,68,0,956,957,5,49,0,0,957,958,5, + 45,0,0,958,959,3,136,68,0,959,960,5,117,0,0,960,961,3,136,68,0,961, + 963,1,0,0,0,962,956,1,0,0,0,962,963,1,0,0,0,963,964,1,0,0,0,964, + 965,5,115,0,0,965,1009,1,0,0,0,966,967,3,136,68,0,967,968,5,41,0, + 0,968,969,5,27,0,0,969,971,3,136,68,0,970,972,3,28,14,0,971,970, + 1,0,0,0,971,972,1,0,0,0,972,979,1,0,0,0,973,974,5,49,0,0,974,975, + 5,45,0,0,975,976,3,136,68,0,976,977,5,117,0,0,977,978,3,136,68,0, + 978,980,1,0,0,0,979,973,1,0,0,0,979,980,1,0,0,0,980,981,1,0,0,0, + 981,982,5,115,0,0,982,1009,1,0,0,0,983,984,3,136,68,0,984,985,5, + 41,0,0,985,986,5,34,0,0,986,987,3,136,68,0,987,988,5,115,0,0,988, + 1009,1,0,0,0,989,990,3,136,68,0,990,992,5,41,0,0,991,993,5,1,0,0, + 992,991,1,0,0,0,992,993,1,0,0,0,993,994,1,0,0,0,994,995,5,5,0,0, + 995,996,3,136,68,0,996,997,5,117,0,0,997,1004,3,136,68,0,998,999, + 5,49,0,0,999,1000,5,45,0,0,1000,1001,3,136,68,0,1001,1002,5,117, + 0,0,1002,1003,3,136,68,0,1003,1005,1,0,0,0,1004,998,1,0,0,0,1004, + 1005,1,0,0,0,1005,1006,1,0,0,0,1006,1007,5,115,0,0,1007,1009,1,0, + 0,0,1008,927,1,0,0,0,1008,936,1,0,0,0,1008,950,1,0,0,0,1008,966, + 1,0,0,0,1008,983,1,0,0,0,1008,989,1,0,0,0,1009,117,1,0,0,0,1010, + 1011,5,34,0,0,1011,1012,3,136,68,0,1012,1013,5,41,0,0,1013,1014, + 3,136,68,0,1014,1015,5,117,0,0,1015,1017,3,136,68,0,1016,1018,3, + 114,57,0,1017,1016,1,0,0,0,1017,1018,1,0,0,0,1018,1019,1,0,0,0,1019, + 1020,5,115,0,0,1020,119,1,0,0,0,1021,1068,3,124,62,0,1022,1068,5, + 94,0,0,1023,1068,5,95,0,0,1024,1025,5,96,0,0,1025,1068,3,138,69, + 0,1026,1027,5,97,0,0,1027,1028,5,124,0,0,1028,1029,3,136,68,0,1029, + 1030,5,125,0,0,1030,1068,1,0,0,0,1031,1032,5,98,0,0,1032,1033,5, + 124,0,0,1033,1035,3,136,68,0,1034,1036,3,28,14,0,1035,1034,1,0,0, + 0,1035,1036,1,0,0,0,1036,1037,1,0,0,0,1037,1038,5,125,0,0,1038,1068, + 1,0,0,0,1039,1040,5,22,0,0,1040,1041,5,124,0,0,1041,1042,3,136,68, + 0,1042,1043,5,125,0,0,1043,1068,1,0,0,0,1044,1045,5,99,0,0,1045, + 1046,5,124,0,0,1046,1047,3,120,60,0,1047,1048,5,125,0,0,1048,1068, + 1,0,0,0,1049,1050,5,100,0,0,1050,1051,5,124,0,0,1051,1052,3,120, + 60,0,1052,1053,5,125,0,0,1053,1068,1,0,0,0,1054,1055,5,101,0,0,1055, + 1059,5,118,0,0,1056,1058,3,122,61,0,1057,1056,1,0,0,0,1058,1061, + 1,0,0,0,1059,1057,1,0,0,0,1059,1060,1,0,0,0,1060,1062,1,0,0,0,1061, + 1059,1,0,0,0,1062,1068,5,119,0,0,1063,1065,3,136,68,0,1064,1066, + 3,28,14,0,1065,1064,1,0,0,0,1065,1066,1,0,0,0,1066,1068,1,0,0,0, + 1067,1021,1,0,0,0,1067,1022,1,0,0,0,1067,1023,1,0,0,0,1067,1024, + 1,0,0,0,1067,1026,1,0,0,0,1067,1031,1,0,0,0,1067,1039,1,0,0,0,1067, + 1044,1,0,0,0,1067,1049,1,0,0,0,1067,1054,1,0,0,0,1067,1063,1,0,0, + 0,1068,121,1,0,0,0,1069,1070,3,136,68,0,1070,1071,5,114,0,0,1071, + 1072,3,120,60,0,1072,1073,5,115,0,0,1073,123,1,0,0,0,1074,1075,7, + 4,0,0,1075,125,1,0,0,0,1076,1077,7,5,0,0,1077,127,1,0,0,0,1078,1087, + 3,138,69,0,1079,1087,5,128,0,0,1080,1087,5,129,0,0,1081,1087,5,110, + 0,0,1082,1087,5,111,0,0,1083,1087,5,112,0,0,1084,1087,3,130,65,0, + 1085,1087,3,134,67,0,1086,1078,1,0,0,0,1086,1079,1,0,0,0,1086,1080, + 1,0,0,0,1086,1081,1,0,0,0,1086,1082,1,0,0,0,1086,1083,1,0,0,0,1086, + 1084,1,0,0,0,1086,1085,1,0,0,0,1087,129,1,0,0,0,1088,1097,5,118, + 0,0,1089,1094,3,132,66,0,1090,1091,5,116,0,0,1091,1093,3,132,66, + 0,1092,1090,1,0,0,0,1093,1096,1,0,0,0,1094,1092,1,0,0,0,1094,1095, + 1,0,0,0,1095,1098,1,0,0,0,1096,1094,1,0,0,0,1097,1089,1,0,0,0,1097, + 1098,1,0,0,0,1098,1099,1,0,0,0,1099,1100,5,119,0,0,1100,131,1,0, + 0,0,1101,1102,3,138,69,0,1102,1103,5,114,0,0,1103,1104,3,128,64, + 0,1104,133,1,0,0,0,1105,1114,5,120,0,0,1106,1111,3,128,64,0,1107, + 1108,5,116,0,0,1108,1110,3,128,64,0,1109,1107,1,0,0,0,1110,1113, + 1,0,0,0,1111,1109,1,0,0,0,1111,1112,1,0,0,0,1112,1115,1,0,0,0,1113, + 1111,1,0,0,0,1114,1106,1,0,0,0,1114,1115,1,0,0,0,1115,1116,1,0,0, + 0,1116,1117,5,121,0,0,1117,135,1,0,0,0,1118,1119,7,6,0,0,1119,137, + 1,0,0,0,1120,1121,5,131,0,0,1121,139,1,0,0,0,95,152,159,180,192, 204,224,232,239,245,257,260,266,277,286,296,299,301,305,313,325, 330,339,342,360,372,396,399,409,413,419,426,452,459,463,468,479, 485,495,500,506,517,537,564,569,580,585,592,601,614,635,638,641, - 648,656,687,699,713,721,733,747,757,775,779,782,786,789,798,802, - 806,812,822,851,870,887,897,900,902,913,928,944,953,961,974,986, - 990,999,1017,1041,1047,1049,1068,1076,1079,1093,1096 + 648,656,696,708,722,730,742,756,766,784,788,791,795,798,807,811, + 815,821,831,860,879,896,906,909,911,922,946,962,971,979,992,1004, + 1008,1017,1035,1059,1065,1067,1086,1094,1097,1111,1114 ]; private static __ATN: antlr.ATN; @@ -6537,8 +6595,8 @@ export class DependencyPortContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); } - public STATE(): antlr.TerminalNode | null { - return this.getToken(QuixosCapabilityParser.STATE, 0); + public REFLECTION(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.REFLECTION, 0); } public identifier(): IdentifierContext[]; public identifier(i: number): IdentifierContext | null; @@ -6555,8 +6613,23 @@ export class DependencyPortContext extends antlr.ParserRuleContext { public stringLiteral(): StringLiteralContext { return this.getRuleContext(0, StringLiteralContext)!; } - public COLON(): antlr.TerminalNode { - return this.getToken(QuixosCapabilityParser.COLON, 0)!; + public LBRACK(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.LBRACK, 0); + } + public identifierList(): IdentifierListContext | null { + return this.getRuleContext(0, IdentifierListContext); + } + public RBRACK(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.RBRACK, 0); + } + public SEMI(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.SEMI, 0)!; + } + public STATE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.STATE, 0); + } + public COLON(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.COLON, 0); } public valueType(): ValueTypeContext | null { return this.getRuleContext(0, ValueTypeContext); @@ -6564,9 +6637,6 @@ export class DependencyPortContext extends antlr.ParserRuleContext { public primitiveList(): PrimitiveListContext | null { return this.getRuleContext(0, PrimitiveListContext); } - public SEMI(): antlr.TerminalNode { - return this.getToken(QuixosCapabilityParser.SEMI, 0)!; - } public EDGE(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.EDGE, 0); } @@ -7399,12 +7469,27 @@ export class DependencyBindingContext extends antlr.ParserRuleContext { public TO(): antlr.TerminalNode { return this.getToken(QuixosCapabilityParser.TO, 0)!; } - public STATE(): antlr.TerminalNode | null { - return this.getToken(QuixosCapabilityParser.STATE, 0); + public WORKSPACE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.WORKSPACE, 0); + } + public REFLECTION(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.REFLECTION, 0); + } + public LBRACK(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.LBRACK, 0); + } + public identifierList(): IdentifierListContext | null { + return this.getRuleContext(0, IdentifierListContext); + } + public RBRACK(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.RBRACK, 0); } public SEMI(): antlr.TerminalNode { return this.getToken(QuixosCapabilityParser.SEMI, 0)!; } + public STATE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.STATE, 0); + } public VIA(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.VIA, 0); } @@ -7438,9 +7523,6 @@ export class DependencyBindingContext extends antlr.ParserRuleContext { public QUERY(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.QUERY, 0); } - public WORKSPACE(): antlr.TerminalNode | null { - return this.getToken(QuixosCapabilityParser.WORKSPACE, 0); - } public override get ruleIndex(): number { return QuixosCapabilityParser.RULE_dependencyBinding; } @@ -7830,6 +7912,12 @@ export class IdentifierContext extends antlr.ParserRuleContext { public IDENTIFIER(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.IDENTIFIER, 0); } + public INTERFACES(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.INTERFACES, 0); + } + public REFLECTION(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.REFLECTION, 0); + } public SOURCE(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.SOURCE, 0); } diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index 8dc9c12..2a9a6ee 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -849,6 +849,12 @@ const lowerQueryReference = ( const lowerDependencyPort = (state: LoweringState, context: DependencyPortContext): DependencyPort | undefined => { const name = identifier(context.identifier(0)); const id = capabilityId.dependencyPort(stringValue(context.stringLiteral())); + if (context.REFLECTION()) + return { + id, + displayName: name, + requirement: { kind: "reflection", selectors: context.identifierList()!.identifier().map(identifier) }, + }; if (context.QUERY()) { const query = lowerQueryReference( state, @@ -1097,6 +1103,11 @@ const lowerGenericPackageExport = ( .primitiveList() ?.primitive() .map((item) => text(item)) ?? []; + if (port.REFLECTION()) + return { + ...base, + requirement: { kind: "reflection", selectors: port.identifierList()!.identifier().map(identifier) }, + }; if (port.QUERY()) { const query = lowerQueryReference(state, identifier(port.identifier(1)), identifier(port.identifier(2)), port); if (!query) @@ -1575,6 +1586,10 @@ const lowerBoundDependencies = ( ); return projectionId ? { edgeTypeId: attachment.attachment.id, projectionId } : undefined; }; + if (entry.REFLECTION()) + return [ + { portId, binding: { kind: "reflection", selectors: entry.identifierList()!.identifier().map(identifier) } }, + ]; if (entry.QUERY()) { const query = lowerQueryReference(state, identifier(entry.identifier(1)), identifier(entry.identifier(2)), entry); const via = entry.VIA() ? traversal(identifier(entry.identifier(3)), identifier(entry.identifier(4))) : undefined; diff --git a/src/capability-model/generic-packages.ts b/src/capability-model/generic-packages.ts index 19faca4..0e2583c 100644 --- a/src/capability-model/generic-packages.ts +++ b/src/capability-model/generic-packages.ts @@ -22,7 +22,7 @@ import { export type GenericDependencyPort = Omit & { requirement: - | Extract + | Extract | { kind: "state"; valueType: ValueTypeExpression; @@ -80,6 +80,7 @@ export const specializePackageExport = ( const ports: DependencyPort[] = definition.dependencyPorts.map((port) => { const requirement = port.requirement; switch (requirement.kind) { + case "reflection": case "query": return { ...port, requirement }; case "state": diff --git a/src/capability-model/types.ts b/src/capability-model/types.ts index 6f7bb34..0dc2acb 100644 --- a/src/capability-model/types.ts +++ b/src/capability-model/types.ts @@ -223,6 +223,7 @@ export type PackageReceiverRequirement = }; export type DependencyPortRequirement = + | { kind: "reflection"; selectors: string[] } | { kind: "query"; packageRevisionId: PackageRevisionId; queryId: string } | { kind: "state"; @@ -292,6 +293,7 @@ export interface PackageRevision { } export type DependencyBinding = + | { kind: "reflection"; selectors: string[]; via?: never } | { kind: "query"; packageRevisionId: PackageRevisionId; diff --git a/src/capability-model/validation.ts b/src/capability-model/validation.ts index 3f7fea7..41c6bc8 100644 --- a/src/capability-model/validation.ts +++ b/src/capability-model/validation.ts @@ -998,6 +998,16 @@ const validatePackages = ( for (const [portIndex, port] of entry.dependencyPorts.entries()) { const portPath = `${exportPath}.dependencyPorts[${portIndex}]`; switch (port.requirement.kind) { + case "reflection": + if ( + !port.requirement.selectors.length || + new Set(port.requirement.selectors).size !== port.requirement.selectors.length || + port.requirement.selectors.some( + (kind) => !["active", "atoms", "interfaces", "conformances", "queries", "indexes"].includes(kind), + ) + ) + issue(issues, "invalid-dependency-binding", portPath, "Reflection requires distinct supported selectors"); + break; case "query": if ( !indexes.packages @@ -1162,6 +1172,20 @@ const validateBoundDependencies = ( continue; } switch (requirement.kind) { + case "reflection": { + const selected = binding as Extract; + if ( + selected.via || + JSON.stringify([...selected.selectors].sort()) !== JSON.stringify([...requirement.selectors].sort()) + ) + issue( + issues, + "invalid-dependency-binding", + path, + "Reflection requires an explicit workspace binding with exactly the declared selectors", + ); + break; + } case "query": { const selected = binding as Extract; const query = params.indexes.packages diff --git a/src/gen/quixos/orch_pb.ts b/src/gen/quixos/orch_pb.ts index 71f6f42..f513e4c 100644 --- a/src/gen/quixos/orch_pb.ts +++ b/src/gen/quixos/orch_pb.ts @@ -20,7 +20,412 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file quixos/orch.proto. */ export const file_quixos_orch: GenFile = /*@__PURE__*/ - fileDesc("ChFxdWl4b3Mvb3JjaC5wcm90bxILcXVpeG9zLm9yY2gitwEKClF1ZXJ5RXZlbnQSDgoGcnVuX2lkGAEgASgJEhAKCHNlcXVlbmNlGAIgASgEEgwKBGtpbmQYAyABKAkSJwoIc25hcHNob3QYBCABKAsyFS5jYW1pbm8uUXVlcnlSZXNwb25zZRIjCgRwYXRoGAUgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFBhcnQSHAoFdmFsdWUYBiABKAsyDS5jYW1pbm8uVmFsdWUSDQoFZXJyb3IYByABKAkiRQoRVHJ5Q29uZm9ybVJlcXVlc3QSEQoJb2JqZWN0X2lkGAEgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgCIAEoCSJFChJUcnlDb25mb3JtUmVzcG9uc2USLwoLY29uZm9ybWFuY2UYASABKAsyGi5xdWl4b3MuQ29uZm9ybWFuY2VXaXRuZXNzIqUBChZDb25zdHJ1Y3RPYmplY3RSZXF1ZXN0Eg8KB2F0b21faWQYASABKAkSPQoFaW5wdXQYAiADKAsyLi5xdWl4b3Mub3JjaC5Db25zdHJ1Y3RPYmplY3RSZXF1ZXN0LklucHV0RW50cnkaOwoKSW5wdXRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIj8KF0NvbnN0cnVjdE9iamVjdFJlc3BvbnNlEiQKBm9iamVjdBgBIAEoCzIULmNhbWluby5DYW1pbm9PYmplY3QibQomUmVzb2x2ZU9yQ29uc3RydWN0UmVsYXRlZE9iamVjdFJlcXVlc3QSEQoJb2JqZWN0X2lkGAEgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgCIAEoCRIRCgltZW1iZXJfaWQYAyABKAkiZAonUmVzb2x2ZU9yQ29uc3RydWN0UmVsYXRlZE9iamVjdFJlc3BvbnNlEiQKBm9iamVjdBgBIAEoCzIULmNhbWluby5DYW1pbm9PYmplY3QSEwoLY29uc3RydWN0ZWQYAiABKAgi8AEKF0ludm9rZUNhcGFiaWxpdHlSZXF1ZXN0EikKCmNhcGFiaWxpdHkYASABKAsyFS5xdWl4b3MuQ2FwYWJpbGl0eVJlZhIRCglvYmplY3RfaWQYAiABKAkSPgoFaW5wdXQYAyADKAsyLy5xdWl4b3Mub3JjaC5JbnZva2VDYXBhYmlsaXR5UmVxdWVzdC5JbnB1dEVudHJ5EhoKEmNsaWVudF9tdXRhdGlvbl9pZBgEIAEoCRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEizgEKHEludm9rZUNsYXNzQ2FwYWJpbGl0eVJlcXVlc3QSFgoOY29uZm9ybWFuY2VfaWQYASABKAkSFAoMb3BlcmF0aW9uX2lkGAIgASgJEkMKBWlucHV0GAMgAygLMjQucXVpeG9zLm9yY2guSW52b2tlQ2xhc3NDYXBhYmlsaXR5UmVxdWVzdC5JbnB1dEVudHJ5GjsKCklucHV0RW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASL+AQoYSW52b2tlQ2FwYWJpbGl0eVJlc3BvbnNlEhUKDWludm9jYXRpb25faWQYASABKAkSKwoKYWN0aXZhdGlvbhgCIAEoCzIXLnF1aXhvcy5vcmNoLkFjdGl2YXRpb24SCgoCb2sYAyABKAgSHQoGcmVzdWx0GAQgASgLMg0uY2FtaW5vLlZhbHVlEg0KBWVycm9yGAUgASgJEjcKDGRlcGVuZGVuY2llcxgGIAMoCzIhLnF1aXhvcy5ydW50aW1lLkRlcml2ZWREZXBlbmRlbmN5EisKDWZpZWxkX2VkaXRpbmcYByABKAsyFC5xdWl4b3MuRmllbGRFZGl0aW5nIv4BChpFZGl0Q2FwYWJpbGl0eUZpZWxkUmVxdWVzdBIpCgpjYXBhYmlsaXR5GAEgASgLMhUucXVpeG9zLkNhcGFiaWxpdHlSZWYSEQoJb2JqZWN0X2lkGAIgASgJEhsKE3NldHRlcl9vcGVyYXRpb25faWQYAyABKAkSFgoOYmluZGluZ19kaWdlc3QYBCABKAkSIwoGdXBkYXRlGAUgASgLMhEuY2FtaW5vLkNyZHRWYWx1ZUgAEiQKC3JlcGxhY2VtZW50GAcgASgLMg0uY2FtaW5vLlZhbHVlSAASGgoSY2xpZW50X211dGF0aW9uX2lkGAYgASgJQgYKBGVkaXQi0gEKFldhdGNoQ2FwYWJpbGl0eVJlcXVlc3QSKQoKY2FwYWJpbGl0eRgBIAEoCzIVLnF1aXhvcy5DYXBhYmlsaXR5UmVmEhEKCW9iamVjdF9pZBgCIAEoCRI9CgVpbnB1dBgDIAMoCzIuLnF1aXhvcy5vcmNoLldhdGNoQ2FwYWJpbGl0eVJlcXVlc3QuSW5wdXRFbnRyeRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEikAIKFFdhdGNoQ2FwYWJpbGl0eUV2ZW50EhUKDWludm9jYXRpb25faWQYASABKAkSKwoKYWN0aXZhdGlvbhgCIAEoCzIXLnF1aXhvcy5vcmNoLkFjdGl2YXRpb24SEAoId2F0Y2hfaWQYAyABKAkSHAoFdmFsdWUYBCABKAsyDS5jYW1pbm8uVmFsdWUSNwoMZGVwZW5kZW5jaWVzGAUgAygLMiEucXVpeG9zLnJ1bnRpbWUuRGVyaXZlZERlcGVuZGVuY3kSDQoFZXJyb3IYBiABKAkSDwoHaW5pdGlhbBgHIAEoCBIrCg1maWVsZF9lZGl0aW5nGAggASgLMhQucXVpeG9zLkZpZWxkRWRpdGluZyJbChNHZXRXb3Jrc3BhY2VSZXF1ZXN0EiMKG2luY2x1ZGVfaW50ZXJmYWNlX2NvbnRyYWN0cxgBIAEoCBIfChdpbmNsdWRlX3F1ZXJ5X2NvbnRyYWN0cxgCIAEoCCK7AwoUR2V0V29ya3NwYWNlUmVzcG9uc2USFAoMd29ya3NwYWNlX2lkGAEgASgJEh0KFXdvcmtzcGFjZV9yZXZpc2lvbl9pZBgCIAEoCRIaChJzb3VyY2Vfcm9vdF9jb21taXQYAyABKAkSKgoiZW1wdHlfaW5wdXRfY29uc3RydWN0aWJsZV9hdG9tX2lkcxgEIAMoCRI/ChFjYXBhYmlsaXR5X2lucHV0cxgFIAMoCzIkLnF1aXhvcy5vcmNoLkNhcGFiaWxpdHlJbnB1dENvbnRyYWN0EkEKEmNvbnN0cnVjdG9yX2lucHV0cxgGIAMoCzIlLnF1aXhvcy5vcmNoLkNvbnN0cnVjdG9ySW5wdXRDb250cmFjdBIXCg9pbnRlcmZhY2VzX2pzb24YByABKAkSOAoSY2xhc3NfY2FwYWJpbGl0aWVzGAggAygLMhwucXVpeG9zLm9yY2guQ2xhc3NDYXBhYmlsaXR5Ei4KB3F1ZXJpZXMYCSADKAsyHS5xdWl4b3Mub3JjaC5RdWVyeURlc2NyaXB0aW9uEh8KF2FjdGl2ZV9xdWVyeV9leGVjdXRpb25zGAogASgNIvMBChBRdWVyeURlc2NyaXB0aW9uEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSGwoTcGFja2FnZV9yZXZpc2lvbl9pZBgDIAEoCRIQCghkb2N1bWVudBgEIAEoCRIOCgZzY2hlbWEYBSABKAkSFAoMc291cmNlX2ZpbGVzGAYgAygJEhQKDGVmZmVjdHNfanNvbhgHIAEoCRIkCgRwbGFuGAggASgLMhYuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5EjQKD3dvcmtzcGFjZV9zY29wZRgJIAEoCzIbLnF1aXhvcy5Xb3Jrc3BhY2VRdWVyeVNjb3BlIrkBCg9DbGFzc0NhcGFiaWxpdHkSFgoOY29uZm9ybWFuY2VfaWQYASABKAkSDwoHYXRvbV9pZBgCIAEoCRIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYAyABKAkSFQoNZGVmaW5pdGlvbl9pZBgEIAEoCRIUCgxvcGVyYXRpb25faWQYBSABKAkSFwoPaW5wdXRfdHlwZV9qc29uGAYgASgJEhgKEG91dHB1dF90eXBlX2pzb24YByABKAkiYQoXQ2FwYWJpbGl0eUlucHV0Q29udHJhY3QSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhQKDG9wZXJhdGlvbl9pZBgCIAEoCRIRCgl0eXBlX2pzb24YAyABKAkiPgoYQ29uc3RydWN0b3JJbnB1dENvbnRyYWN0Eg8KB2F0b21faWQYASABKAkSEQoJdHlwZV9qc29uGAIgASgJIhgKFkxpc3RBY3RpdmF0aW9uc1JlcXVlc3QiHwodTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1JlcXVlc3QiUAoeTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1Jlc3BvbnNlEi4KC2Rlc2NyaXB0b3JzGAEgAygLMhkucXVpeG9zLlBhY2thZ2VEZXNjcmlwdG9yIhwKGkxpc3RQYWNrYWdlUnVudGltZXNSZXF1ZXN0IlIKG0xpc3RQYWNrYWdlUnVudGltZXNSZXNwb25zZRIzCghydW50aW1lcxgBIAMoCzIhLnF1aXhvcy5vcmNoLlBhY2thZ2VSdW50aW1lU3RhdHVzIkcKF0xpc3RBY3RpdmF0aW9uc1Jlc3BvbnNlEiwKC2FjdGl2YXRpb25zGAEgAygLMhcucXVpeG9zLm9yY2guQWN0aXZhdGlvbiI/ChZDbG9zZUFjdGl2YXRpb25SZXF1ZXN0EhUKDWFjdGl2YXRpb25faWQYASABKAkSDgoGcmVhc29uGAIgASgJIkYKF0Nsb3NlQWN0aXZhdGlvblJlc3BvbnNlEisKCmFjdGl2YXRpb24YASABKAsyFy5xdWl4b3Mub3JjaC5BY3RpdmF0aW9uIusBCgpBY3RpdmF0aW9uEhUKDWFjdGl2YXRpb25faWQYASABKAkSKAoGZXhwb3J0GAIgASgLMhgucXVpeG9zLlBhY2thZ2VFeHBvcnRSZWYSEQoJb2JqZWN0X2lkGAMgASgJEg0KBXN0YXRlGAQgASgJEg4KBmRlbWFuZBgFIAEoDRIRCglvcGVuZWRfYXQYBiABKAkSFAoMbGFzdF91c2VkX2F0GAcgASgJEhgKEGlkbGVfZGVhZGxpbmVfYXQYCCABKAkSEQoJY2xvc2VkX2F0GAkgASgJEhQKDGNsb3NlX3JlYXNvbhgKIAEoCSKzAgoUUGFja2FnZVJ1bnRpbWVTdGF0dXMSEwoLcnVudGltZV9rZXkYASABKAkSGwoTcGFja2FnZV9yZXZpc2lvbl9pZBgCIAEoCRIZChFzb3VyY2VfcmVwb3NpdG9yeRgDIAEoCRIVCg1zb3VyY2VfY29tbWl0GAQgASgJEhQKDGJ1aWxkX3RhcmdldBgFIAEoCRITCgtzZXJ2ZXJfcGF0aBgGIAEoCRILCgNwaWQYByABKA0SDQoFc3RhdGUYCCABKAkSEgoKc3RhcnRlZF9hdBgJIAEoCRIZChFsYXN0X2hhbmRzaGFrZV9hdBgKIAEoCRIgChhydW50aW1lX3Byb3RvY29sX3ZlcnNpb24YCyABKAkSHwoXYWR2ZXJ0aXNlZF9leHBvcnRfY291bnQYDCABKA0yywoKE09yY2hlc3RyYXRvclJ1bnRpbWUSOwoMRXhlY3V0ZVF1ZXJ5EhQuY2FtaW5vLlF1ZXJ5UmVxdWVzdBoVLmNhbWluby5RdWVyeVJlc3BvbnNlEj0KCldhdGNoUXVlcnkSFC5jYW1pbm8uUXVlcnlSZXF1ZXN0GhcucXVpeG9zLm9yY2guUXVlcnlFdmVudDABEk0KClRyeUNvbmZvcm0SHi5xdWl4b3Mub3JjaC5UcnlDb25mb3JtUmVxdWVzdBofLnF1aXhvcy5vcmNoLlRyeUNvbmZvcm1SZXNwb25zZRJfChBJbnZva2VDYXBhYmlsaXR5EiQucXVpeG9zLm9yY2guSW52b2tlQ2FwYWJpbGl0eVJlcXVlc3QaJS5xdWl4b3Mub3JjaC5JbnZva2VDYXBhYmlsaXR5UmVzcG9uc2USZQoTRWRpdENhcGFiaWxpdHlGaWVsZBInLnF1aXhvcy5vcmNoLkVkaXRDYXBhYmlsaXR5RmllbGRSZXF1ZXN0GiUucXVpeG9zLm9yY2guSW52b2tlQ2FwYWJpbGl0eVJlc3BvbnNlEmkKFUludm9rZUNsYXNzQ2FwYWJpbGl0eRIpLnF1aXhvcy5vcmNoLkludm9rZUNsYXNzQ2FwYWJpbGl0eVJlcXVlc3QaJS5xdWl4b3Mub3JjaC5JbnZva2VDYXBhYmlsaXR5UmVzcG9uc2USWwoPV2F0Y2hDYXBhYmlsaXR5EiMucXVpeG9zLm9yY2guV2F0Y2hDYXBhYmlsaXR5UmVxdWVzdBohLnF1aXhvcy5vcmNoLldhdGNoQ2FwYWJpbGl0eUV2ZW50MAESXAoPQ29uc3RydWN0T2JqZWN0EiMucXVpeG9zLm9yY2guQ29uc3RydWN0T2JqZWN0UmVxdWVzdBokLnF1aXhvcy5vcmNoLkNvbnN0cnVjdE9iamVjdFJlc3BvbnNlEowBCh9SZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0EjMucXVpeG9zLm9yY2guUmVzb2x2ZU9yQ29uc3RydWN0UmVsYXRlZE9iamVjdFJlcXVlc3QaNC5xdWl4b3Mub3JjaC5SZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0UmVzcG9uc2USUwoMR2V0V29ya3NwYWNlEiAucXVpeG9zLm9yY2guR2V0V29ya3NwYWNlUmVxdWVzdBohLnF1aXhvcy5vcmNoLkdldFdvcmtzcGFjZVJlc3BvbnNlEnEKFkxpc3RQYWNrYWdlRGVzY3JpcHRvcnMSKi5xdWl4b3Mub3JjaC5MaXN0UGFja2FnZURlc2NyaXB0b3JzUmVxdWVzdBorLnF1aXhvcy5vcmNoLkxpc3RQYWNrYWdlRGVzY3JpcHRvcnNSZXNwb25zZRJoChNMaXN0UGFja2FnZVJ1bnRpbWVzEicucXVpeG9zLm9yY2guTGlzdFBhY2thZ2VSdW50aW1lc1JlcXVlc3QaKC5xdWl4b3Mub3JjaC5MaXN0UGFja2FnZVJ1bnRpbWVzUmVzcG9uc2USXAoPTGlzdEFjdGl2YXRpb25zEiMucXVpeG9zLm9yY2guTGlzdEFjdGl2YXRpb25zUmVxdWVzdBokLnF1aXhvcy5vcmNoLkxpc3RBY3RpdmF0aW9uc1Jlc3BvbnNlElwKD0Nsb3NlQWN0aXZhdGlvbhIjLnF1aXhvcy5vcmNoLkNsb3NlQWN0aXZhdGlvblJlcXVlc3QaJC5xdWl4b3Mub3JjaC5DbG9zZUFjdGl2YXRpb25SZXNwb25zZWIGcHJvdG8z", [file_camino_api, file_camino_schema, file_quixos_package, file_quixos_refs, file_quixos_runtime]); + fileDesc("ChFxdWl4b3Mvb3JjaC5wcm90bxILcXVpeG9zLm9yY2gifAoSRGVmaW5pdGlvblNlbGVjdG9yEgwKBGtpbmQYASABKAkSCwoDaWRzGAIgAygJEg8KB2F0b21faWQYAyABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAQgASgJEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYBSABKAkimQEKEkRlZmluaXRpb25JZGVudGl0eRIUCgx3b3Jrc3BhY2VfaWQYASABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAIgASgJEhoKEnNvdXJjZV9yb290X2NvbW1pdBgDIAEoCRIXCg93b3Jrc3BhY2VfZXBvY2gYBCABKAkSGQoRZGVmaW5pdGlvbl9kaWdlc3QYBSABKAkipQEKEURlZmluaXRpb25SZXF1ZXN0EjEKCHNlbGVjdG9yGAEgASgLMh8ucXVpeG9zLm9yY2guRGVmaW5pdGlvblNlbGVjdG9yEg0KBWZpcnN0GAIgASgNEg0KBWFmdGVyGAMgASgJEhAKCHNuYXBzaG90GAQgASgJEhQKDHdvcmtzcGFjZV9pZBgFIAEoCRIXCg93b3Jrc3BhY2VfZXBvY2gYBiABKAkiVgoNUmVmbGVjdGVkQXRvbRIKCgJpZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSIwobY29uc3RydWN0b3JfaW5wdXRfdHlwZV9qc29uGAMgASgJImMKElJlZmxlY3RlZEludGVyZmFjZRIKCgJpZBgBIAEoCRIUCgxpbnRlcmZhY2VfaWQYAiABKAkSFAoMZGlzcGxheV9uYW1lGAMgASgJEhUKDWNvbnRyYWN0X2pzb24YBCABKAkizAEKFFJlZmxlY3RlZENvbmZvcm1hbmNlEgoKAmlkGAEgASgJEg8KB2F0b21faWQYAiABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAMgASgJEhUKDWRlZmluaXRpb25faWQYBCABKAkSFQoNb3BlcmF0aW9uX2lkcxgFIAMoCRI4ChJjbGFzc19jYXBhYmlsaXRpZXMYBiADKAsyHC5xdWl4b3Mub3JjaC5DbGFzc0NhcGFiaWxpdHkSEAoIaW5zdGFuY2UYByABKAgivgIKDlJlZmxlY3RlZFF1ZXJ5EgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSGwoTcGFja2FnZV9yZXZpc2lvbl9pZBgDIAEoCRIZChFkZWZpbml0aW9uX2RpZ2VzdBgEIAEoCRIWCg5iaW5kaW5nX2RpZ2VzdBgFIAEoCRIRCglyb290X2tpbmQYBiABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAcgASgJEhsKE3ZhcmlhYmxlc190eXBlX2pzb24YCCABKAkSGAoQb3V0cHV0X3R5cGVfanNvbhgJIAEoCRIUCgxlZmZlY3RzX2pzb24YCiABKAkSDQoFd2F0Y2gYCyABKAgSNAoPd29ya3NwYWNlX3Njb3BlGAwgASgLMhsucXVpeG9zLldvcmtzcGFjZVF1ZXJ5U2NvcGUiMwoOUmVmbGVjdGVkSW5kZXgSCgoCaWQYASABKAkSFQoNY29udHJhY3RfanNvbhgCIAEoCSKYAgoQRGVmaW5pdGlvblJlY29yZBIqCgRhdG9tGAEgASgLMhoucXVpeG9zLm9yY2guUmVmbGVjdGVkQXRvbUgAEjQKCWludGVyZmFjZRgCIAEoCzIfLnF1aXhvcy5vcmNoLlJlZmxlY3RlZEludGVyZmFjZUgAEjgKC2NvbmZvcm1hbmNlGAMgASgLMiEucXVpeG9zLm9yY2guUmVmbGVjdGVkQ29uZm9ybWFuY2VIABIsCgVxdWVyeRgEIAEoCzIbLnF1aXhvcy5vcmNoLlJlZmxlY3RlZFF1ZXJ5SAASLAoFaW5kZXgYBSABKAsyGy5xdWl4b3Mub3JjaC5SZWZsZWN0ZWRJbmRleEgAQgwKCmRlZmluaXRpb24iiAEKDkRlZmluaXRpb25QYWdlEjEKCGlkZW50aXR5GAEgASgLMh8ucXVpeG9zLm9yY2guRGVmaW5pdGlvbklkZW50aXR5Ei4KB3JlY29yZHMYAiADKAsyHS5xdWl4b3Mub3JjaC5EZWZpbml0aW9uUmVjb3JkEhMKC25leHRfY3Vyc29yGAMgASgJIrcBCgpRdWVyeUV2ZW50Eg4KBnJ1bl9pZBgBIAEoCRIQCghzZXF1ZW5jZRgCIAEoBBIMCgRraW5kGAMgASgJEicKCHNuYXBzaG90GAQgASgLMhUuY2FtaW5vLlF1ZXJ5UmVzcG9uc2USIwoEcGF0aBgFIAMoCzIVLmNhbWluby5RdWVyeVBhdGhQYXJ0EhwKBXZhbHVlGAYgASgLMg0uY2FtaW5vLlZhbHVlEg0KBWVycm9yGAcgASgJIkUKEVRyeUNvbmZvcm1SZXF1ZXN0EhEKCW9iamVjdF9pZBgBIAEoCRIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYAiABKAkiRQoSVHJ5Q29uZm9ybVJlc3BvbnNlEi8KC2NvbmZvcm1hbmNlGAEgASgLMhoucXVpeG9zLkNvbmZvcm1hbmNlV2l0bmVzcyKlAQoWQ29uc3RydWN0T2JqZWN0UmVxdWVzdBIPCgdhdG9tX2lkGAEgASgJEj0KBWlucHV0GAIgAygLMi4ucXVpeG9zLm9yY2guQ29uc3RydWN0T2JqZWN0UmVxdWVzdC5JbnB1dEVudHJ5GjsKCklucHV0RW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASI/ChdDb25zdHJ1Y3RPYmplY3RSZXNwb25zZRIkCgZvYmplY3QYASABKAsyFC5jYW1pbm8uQ2FtaW5vT2JqZWN0Im0KJlJlc29sdmVPckNvbnN0cnVjdFJlbGF0ZWRPYmplY3RSZXF1ZXN0EhEKCW9iamVjdF9pZBgBIAEoCRIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYAiABKAkSEQoJbWVtYmVyX2lkGAMgASgJImQKJ1Jlc29sdmVPckNvbnN0cnVjdFJlbGF0ZWRPYmplY3RSZXNwb25zZRIkCgZvYmplY3QYASABKAsyFC5jYW1pbm8uQ2FtaW5vT2JqZWN0EhMKC2NvbnN0cnVjdGVkGAIgASgIIvABChdJbnZva2VDYXBhYmlsaXR5UmVxdWVzdBIpCgpjYXBhYmlsaXR5GAEgASgLMhUucXVpeG9zLkNhcGFiaWxpdHlSZWYSEQoJb2JqZWN0X2lkGAIgASgJEj4KBWlucHV0GAMgAygLMi8ucXVpeG9zLm9yY2guSW52b2tlQ2FwYWJpbGl0eVJlcXVlc3QuSW5wdXRFbnRyeRIaChJjbGllbnRfbXV0YXRpb25faWQYBCABKAkaOwoKSW5wdXRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIs4BChxJbnZva2VDbGFzc0NhcGFiaWxpdHlSZXF1ZXN0EhYKDmNvbmZvcm1hbmNlX2lkGAEgASgJEhQKDG9wZXJhdGlvbl9pZBgCIAEoCRJDCgVpbnB1dBgDIAMoCzI0LnF1aXhvcy5vcmNoLkludm9rZUNsYXNzQ2FwYWJpbGl0eVJlcXVlc3QuSW5wdXRFbnRyeRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEi/gEKGEludm9rZUNhcGFiaWxpdHlSZXNwb25zZRIVCg1pbnZvY2F0aW9uX2lkGAEgASgJEisKCmFjdGl2YXRpb24YAiABKAsyFy5xdWl4b3Mub3JjaC5BY3RpdmF0aW9uEgoKAm9rGAMgASgIEh0KBnJlc3VsdBgEIAEoCzINLmNhbWluby5WYWx1ZRINCgVlcnJvchgFIAEoCRI3CgxkZXBlbmRlbmNpZXMYBiADKAsyIS5xdWl4b3MucnVudGltZS5EZXJpdmVkRGVwZW5kZW5jeRIrCg1maWVsZF9lZGl0aW5nGAcgASgLMhQucXVpeG9zLkZpZWxkRWRpdGluZyL+AQoaRWRpdENhcGFiaWxpdHlGaWVsZFJlcXVlc3QSKQoKY2FwYWJpbGl0eRgBIAEoCzIVLnF1aXhvcy5DYXBhYmlsaXR5UmVmEhEKCW9iamVjdF9pZBgCIAEoCRIbChNzZXR0ZXJfb3BlcmF0aW9uX2lkGAMgASgJEhYKDmJpbmRpbmdfZGlnZXN0GAQgASgJEiMKBnVwZGF0ZRgFIAEoCzIRLmNhbWluby5DcmR0VmFsdWVIABIkCgtyZXBsYWNlbWVudBgHIAEoCzINLmNhbWluby5WYWx1ZUgAEhoKEmNsaWVudF9tdXRhdGlvbl9pZBgGIAEoCUIGCgRlZGl0ItIBChZXYXRjaENhcGFiaWxpdHlSZXF1ZXN0EikKCmNhcGFiaWxpdHkYASABKAsyFS5xdWl4b3MuQ2FwYWJpbGl0eVJlZhIRCglvYmplY3RfaWQYAiABKAkSPQoFaW5wdXQYAyADKAsyLi5xdWl4b3Mub3JjaC5XYXRjaENhcGFiaWxpdHlSZXF1ZXN0LklucHV0RW50cnkaOwoKSW5wdXRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIpACChRXYXRjaENhcGFiaWxpdHlFdmVudBIVCg1pbnZvY2F0aW9uX2lkGAEgASgJEisKCmFjdGl2YXRpb24YAiABKAsyFy5xdWl4b3Mub3JjaC5BY3RpdmF0aW9uEhAKCHdhdGNoX2lkGAMgASgJEhwKBXZhbHVlGAQgASgLMg0uY2FtaW5vLlZhbHVlEjcKDGRlcGVuZGVuY2llcxgFIAMoCzIhLnF1aXhvcy5ydW50aW1lLkRlcml2ZWREZXBlbmRlbmN5Eg0KBWVycm9yGAYgASgJEg8KB2luaXRpYWwYByABKAgSKwoNZmllbGRfZWRpdGluZxgIIAEoCzIULnF1aXhvcy5GaWVsZEVkaXRpbmciWwoTR2V0V29ya3NwYWNlUmVxdWVzdBIjChtpbmNsdWRlX2ludGVyZmFjZV9jb250cmFjdHMYASABKAgSHwoXaW5jbHVkZV9xdWVyeV9jb250cmFjdHMYAiABKAgiuwMKFEdldFdvcmtzcGFjZVJlc3BvbnNlEhQKDHdvcmtzcGFjZV9pZBgBIAEoCRIdChV3b3Jrc3BhY2VfcmV2aXNpb25faWQYAiABKAkSGgoSc291cmNlX3Jvb3RfY29tbWl0GAMgASgJEioKImVtcHR5X2lucHV0X2NvbnN0cnVjdGlibGVfYXRvbV9pZHMYBCADKAkSPwoRY2FwYWJpbGl0eV9pbnB1dHMYBSADKAsyJC5xdWl4b3Mub3JjaC5DYXBhYmlsaXR5SW5wdXRDb250cmFjdBJBChJjb25zdHJ1Y3Rvcl9pbnB1dHMYBiADKAsyJS5xdWl4b3Mub3JjaC5Db25zdHJ1Y3RvcklucHV0Q29udHJhY3QSFwoPaW50ZXJmYWNlc19qc29uGAcgASgJEjgKEmNsYXNzX2NhcGFiaWxpdGllcxgIIAMoCzIcLnF1aXhvcy5vcmNoLkNsYXNzQ2FwYWJpbGl0eRIuCgdxdWVyaWVzGAkgAygLMh0ucXVpeG9zLm9yY2guUXVlcnlEZXNjcmlwdGlvbhIfChdhY3RpdmVfcXVlcnlfZXhlY3V0aW9ucxgKIAEoDSLzAQoQUXVlcnlEZXNjcmlwdGlvbhIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYAyABKAkSEAoIZG9jdW1lbnQYBCABKAkSDgoGc2NoZW1hGAUgASgJEhQKDHNvdXJjZV9maWxlcxgGIAMoCRIUCgxlZmZlY3RzX2pzb24YByABKAkSJAoEcGxhbhgIIAEoCzIWLmNhbWluby5JbnN0YWxsZWRRdWVyeRI0Cg93b3Jrc3BhY2Vfc2NvcGUYCSABKAsyGy5xdWl4b3MuV29ya3NwYWNlUXVlcnlTY29wZSK5AQoPQ2xhc3NDYXBhYmlsaXR5EhYKDmNvbmZvcm1hbmNlX2lkGAEgASgJEg8KB2F0b21faWQYAiABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAMgASgJEhUKDWRlZmluaXRpb25faWQYBCABKAkSFAoMb3BlcmF0aW9uX2lkGAUgASgJEhcKD2lucHV0X3R5cGVfanNvbhgGIAEoCRIYChBvdXRwdXRfdHlwZV9qc29uGAcgASgJImEKF0NhcGFiaWxpdHlJbnB1dENvbnRyYWN0Eh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgBIAEoCRIUCgxvcGVyYXRpb25faWQYAiABKAkSEQoJdHlwZV9qc29uGAMgASgJIj4KGENvbnN0cnVjdG9ySW5wdXRDb250cmFjdBIPCgdhdG9tX2lkGAEgASgJEhEKCXR5cGVfanNvbhgCIAEoCSIYChZMaXN0QWN0aXZhdGlvbnNSZXF1ZXN0Ih8KHUxpc3RQYWNrYWdlRGVzY3JpcHRvcnNSZXF1ZXN0IlAKHkxpc3RQYWNrYWdlRGVzY3JpcHRvcnNSZXNwb25zZRIuCgtkZXNjcmlwdG9ycxgBIAMoCzIZLnF1aXhvcy5QYWNrYWdlRGVzY3JpcHRvciIcChpMaXN0UGFja2FnZVJ1bnRpbWVzUmVxdWVzdCJSChtMaXN0UGFja2FnZVJ1bnRpbWVzUmVzcG9uc2USMwoIcnVudGltZXMYASADKAsyIS5xdWl4b3Mub3JjaC5QYWNrYWdlUnVudGltZVN0YXR1cyJHChdMaXN0QWN0aXZhdGlvbnNSZXNwb25zZRIsCgthY3RpdmF0aW9ucxgBIAMoCzIXLnF1aXhvcy5vcmNoLkFjdGl2YXRpb24iPwoWQ2xvc2VBY3RpdmF0aW9uUmVxdWVzdBIVCg1hY3RpdmF0aW9uX2lkGAEgASgJEg4KBnJlYXNvbhgCIAEoCSJGChdDbG9zZUFjdGl2YXRpb25SZXNwb25zZRIrCgphY3RpdmF0aW9uGAEgASgLMhcucXVpeG9zLm9yY2guQWN0aXZhdGlvbiLrAQoKQWN0aXZhdGlvbhIVCg1hY3RpdmF0aW9uX2lkGAEgASgJEigKBmV4cG9ydBgCIAEoCzIYLnF1aXhvcy5QYWNrYWdlRXhwb3J0UmVmEhEKCW9iamVjdF9pZBgDIAEoCRINCgVzdGF0ZRgEIAEoCRIOCgZkZW1hbmQYBSABKA0SEQoJb3BlbmVkX2F0GAYgASgJEhQKDGxhc3RfdXNlZF9hdBgHIAEoCRIYChBpZGxlX2RlYWRsaW5lX2F0GAggASgJEhEKCWNsb3NlZF9hdBgJIAEoCRIUCgxjbG9zZV9yZWFzb24YCiABKAkiswIKFFBhY2thZ2VSdW50aW1lU3RhdHVzEhMKC3J1bnRpbWVfa2V5GAEgASgJEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYAiABKAkSGQoRc291cmNlX3JlcG9zaXRvcnkYAyABKAkSFQoNc291cmNlX2NvbW1pdBgEIAEoCRIUCgxidWlsZF90YXJnZXQYBSABKAkSEwoLc2VydmVyX3BhdGgYBiABKAkSCwoDcGlkGAcgASgNEg0KBXN0YXRlGAggASgJEhIKCnN0YXJ0ZWRfYXQYCSABKAkSGQoRbGFzdF9oYW5kc2hha2VfYXQYCiABKAkSIAoYcnVudGltZV9wcm90b2NvbF92ZXJzaW9uGAsgASgJEh8KF2FkdmVydGlzZWRfZXhwb3J0X2NvdW50GAwgASgNMu4LChNPcmNoZXN0cmF0b3JSdW50aW1lEk4KD1JlYWREZWZpbml0aW9ucxIeLnF1aXhvcy5vcmNoLkRlZmluaXRpb25SZXF1ZXN0GhsucXVpeG9zLm9yY2guRGVmaW5pdGlvblBhZ2USUQoQV2F0Y2hEZWZpbml0aW9ucxIeLnF1aXhvcy5vcmNoLkRlZmluaXRpb25SZXF1ZXN0GhsucXVpeG9zLm9yY2guRGVmaW5pdGlvblBhZ2UwARI7CgxFeGVjdXRlUXVlcnkSFC5jYW1pbm8uUXVlcnlSZXF1ZXN0GhUuY2FtaW5vLlF1ZXJ5UmVzcG9uc2USPQoKV2F0Y2hRdWVyeRIULmNhbWluby5RdWVyeVJlcXVlc3QaFy5xdWl4b3Mub3JjaC5RdWVyeUV2ZW50MAESTQoKVHJ5Q29uZm9ybRIeLnF1aXhvcy5vcmNoLlRyeUNvbmZvcm1SZXF1ZXN0Gh8ucXVpeG9zLm9yY2guVHJ5Q29uZm9ybVJlc3BvbnNlEl8KEEludm9rZUNhcGFiaWxpdHkSJC5xdWl4b3Mub3JjaC5JbnZva2VDYXBhYmlsaXR5UmVxdWVzdBolLnF1aXhvcy5vcmNoLkludm9rZUNhcGFiaWxpdHlSZXNwb25zZRJlChNFZGl0Q2FwYWJpbGl0eUZpZWxkEicucXVpeG9zLm9yY2guRWRpdENhcGFiaWxpdHlGaWVsZFJlcXVlc3QaJS5xdWl4b3Mub3JjaC5JbnZva2VDYXBhYmlsaXR5UmVzcG9uc2USaQoVSW52b2tlQ2xhc3NDYXBhYmlsaXR5EikucXVpeG9zLm9yY2guSW52b2tlQ2xhc3NDYXBhYmlsaXR5UmVxdWVzdBolLnF1aXhvcy5vcmNoLkludm9rZUNhcGFiaWxpdHlSZXNwb25zZRJbCg9XYXRjaENhcGFiaWxpdHkSIy5xdWl4b3Mub3JjaC5XYXRjaENhcGFiaWxpdHlSZXF1ZXN0GiEucXVpeG9zLm9yY2guV2F0Y2hDYXBhYmlsaXR5RXZlbnQwARJcCg9Db25zdHJ1Y3RPYmplY3QSIy5xdWl4b3Mub3JjaC5Db25zdHJ1Y3RPYmplY3RSZXF1ZXN0GiQucXVpeG9zLm9yY2guQ29uc3RydWN0T2JqZWN0UmVzcG9uc2USjAEKH1Jlc29sdmVPckNvbnN0cnVjdFJlbGF0ZWRPYmplY3QSMy5xdWl4b3Mub3JjaC5SZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0UmVxdWVzdBo0LnF1aXhvcy5vcmNoLlJlc29sdmVPckNvbnN0cnVjdFJlbGF0ZWRPYmplY3RSZXNwb25zZRJTCgxHZXRXb3Jrc3BhY2USIC5xdWl4b3Mub3JjaC5HZXRXb3Jrc3BhY2VSZXF1ZXN0GiEucXVpeG9zLm9yY2guR2V0V29ya3NwYWNlUmVzcG9uc2UScQoWTGlzdFBhY2thZ2VEZXNjcmlwdG9ycxIqLnF1aXhvcy5vcmNoLkxpc3RQYWNrYWdlRGVzY3JpcHRvcnNSZXF1ZXN0GisucXVpeG9zLm9yY2guTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1Jlc3BvbnNlEmgKE0xpc3RQYWNrYWdlUnVudGltZXMSJy5xdWl4b3Mub3JjaC5MaXN0UGFja2FnZVJ1bnRpbWVzUmVxdWVzdBooLnF1aXhvcy5vcmNoLkxpc3RQYWNrYWdlUnVudGltZXNSZXNwb25zZRJcCg9MaXN0QWN0aXZhdGlvbnMSIy5xdWl4b3Mub3JjaC5MaXN0QWN0aXZhdGlvbnNSZXF1ZXN0GiQucXVpeG9zLm9yY2guTGlzdEFjdGl2YXRpb25zUmVzcG9uc2USXAoPQ2xvc2VBY3RpdmF0aW9uEiMucXVpeG9zLm9yY2guQ2xvc2VBY3RpdmF0aW9uUmVxdWVzdBokLnF1aXhvcy5vcmNoLkNsb3NlQWN0aXZhdGlvblJlc3BvbnNlYgZwcm90bzM", [file_camino_api, file_camino_schema, file_quixos_package, file_quixos_refs, file_quixos_runtime]); + +/** + * Activated definitions, not runtime metrics or object data. Nested type JSON + * uses the compiler's canonical ValueType/InterfaceRevision public contracts. + * + * @generated from message quixos.orch.DefinitionSelector + */ +export type DefinitionSelector = Message<"quixos.orch.DefinitionSelector"> & { + /** + * active | atoms | interfaces | conformances | queries | indexes + * + * @generated from field: string kind = 1; + */ + kind: string; + + /** + * @generated from field: repeated string ids = 2; + */ + ids: string[]; + + /** + * @generated from field: string atom_id = 3; + */ + atomId: string; + + /** + * @generated from field: string interface_revision_id = 4; + */ + interfaceRevisionId: string; + + /** + * @generated from field: string package_revision_id = 5; + */ + packageRevisionId: string; +}; + +/** + * Describes the message quixos.orch.DefinitionSelector. + * Use `create(DefinitionSelectorSchema)` to create a new message. + */ +export const DefinitionSelectorSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_quixos_orch, 0); + +/** + * @generated from message quixos.orch.DefinitionIdentity + */ +export type DefinitionIdentity = Message<"quixos.orch.DefinitionIdentity"> & { + /** + * @generated from field: string workspace_id = 1; + */ + workspaceId: string; + + /** + * @generated from field: string workspace_revision_id = 2; + */ + workspaceRevisionId: string; + + /** + * @generated from field: string source_root_commit = 3; + */ + sourceRootCommit: string; + + /** + * @generated from field: string workspace_epoch = 4; + */ + workspaceEpoch: string; + + /** + * @generated from field: string definition_digest = 5; + */ + definitionDigest: string; +}; + +/** + * Describes the message quixos.orch.DefinitionIdentity. + * Use `create(DefinitionIdentitySchema)` to create a new message. + */ +export const DefinitionIdentitySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_quixos_orch, 1); + +/** + * @generated from message quixos.orch.DefinitionRequest + */ +export type DefinitionRequest = Message<"quixos.orch.DefinitionRequest"> & { + /** + * @generated from field: quixos.orch.DefinitionSelector selector = 1; + */ + selector?: DefinitionSelector | undefined; + + /** + * 1..100; 0 uses 50 + * + * @generated from field: uint32 first = 2; + */ + first: number; + + /** + * @generated from field: string after = 3; + */ + after: string; + + /** + * issued definition_digest; current serving snapshot only + * + * @generated from field: string snapshot = 4; + */ + snapshot: string; + + /** + * required for injected package authority + * + * @generated from field: string workspace_id = 5; + */ + workspaceId: string; + + /** + * required for invocation-bound package calls + * + * @generated from field: string workspace_epoch = 6; + */ + workspaceEpoch: string; +}; + +/** + * Describes the message quixos.orch.DefinitionRequest. + * Use `create(DefinitionRequestSchema)` to create a new message. + */ +export const DefinitionRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_quixos_orch, 2); + +/** + * @generated from message quixos.orch.ReflectedAtom + */ +export type ReflectedAtom = Message<"quixos.orch.ReflectedAtom"> & { + /** + * @generated from field: string id = 1; + */ + id: string; + + /** + * @generated from field: string display_name = 2; + */ + displayName: string; + + /** + * @generated from field: string constructor_input_type_json = 3; + */ + constructorInputTypeJson: string; +}; + +/** + * Describes the message quixos.orch.ReflectedAtom. + * Use `create(ReflectedAtomSchema)` to create a new message. + */ +export const ReflectedAtomSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_quixos_orch, 3); + +/** + * @generated from message quixos.orch.ReflectedInterface + */ +export type ReflectedInterface = Message<"quixos.orch.ReflectedInterface"> & { + /** + * @generated from field: string id = 1; + */ + id: string; + + /** + * @generated from field: string interface_id = 2; + */ + interfaceId: string; + + /** + * @generated from field: string display_name = 3; + */ + displayName: string; + + /** + * canonical interface contract, excluding source location + * + * @generated from field: string contract_json = 4; + */ + contractJson: string; +}; + +/** + * Describes the message quixos.orch.ReflectedInterface. + * Use `create(ReflectedInterfaceSchema)` to create a new message. + */ +export const ReflectedInterfaceSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_quixos_orch, 4); + +/** + * @generated from message quixos.orch.ReflectedConformance + */ +export type ReflectedConformance = Message<"quixos.orch.ReflectedConformance"> & { + /** + * @generated from field: string id = 1; + */ + id: string; + + /** + * @generated from field: string atom_id = 2; + */ + atomId: string; + + /** + * @generated from field: string interface_revision_id = 3; + */ + interfaceRevisionId: string; + + /** + * @generated from field: string definition_id = 4; + */ + definitionId: string; + + /** + * @generated from field: repeated string operation_ids = 5; + */ + operationIds: string[]; + + /** + * @generated from field: repeated quixos.orch.ClassCapability class_capabilities = 6; + */ + classCapabilities: ClassCapability[]; + + /** + * @generated from field: bool instance = 7; + */ + instance: boolean; +}; + +/** + * Describes the message quixos.orch.ReflectedConformance. + * Use `create(ReflectedConformanceSchema)` to create a new message. + */ +export const ReflectedConformanceSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_quixos_orch, 5); + +/** + * @generated from message quixos.orch.ReflectedQuery + */ +export type ReflectedQuery = Message<"quixos.orch.ReflectedQuery"> & { + /** + * @generated from field: string id = 1; + */ + id: string; + + /** + * @generated from field: string name = 2; + */ + name: string; + + /** + * @generated from field: string package_revision_id = 3; + */ + packageRevisionId: string; + + /** + * @generated from field: string definition_digest = 4; + */ + definitionDigest: string; + + /** + * @generated from field: string binding_digest = 5; + */ + bindingDigest: string; + + /** + * @generated from field: string root_kind = 6; + */ + rootKind: string; + + /** + * @generated from field: string interface_revision_id = 7; + */ + interfaceRevisionId: string; + + /** + * @generated from field: string variables_type_json = 8; + */ + variablesTypeJson: string; + + /** + * @generated from field: string output_type_json = 9; + */ + outputTypeJson: string; + + /** + * @generated from field: string effects_json = 10; + */ + effectsJson: string; + + /** + * @generated from field: bool watch = 11; + */ + watch: boolean; + + /** + * @generated from field: quixos.WorkspaceQueryScope workspace_scope = 12; + */ + workspaceScope?: WorkspaceQueryScope | undefined; +}; + +/** + * Describes the message quixos.orch.ReflectedQuery. + * Use `create(ReflectedQuerySchema)` to create a new message. + */ +export const ReflectedQuerySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_quixos_orch, 6); + +/** + * @generated from message quixos.orch.ReflectedIndex + */ +export type ReflectedIndex = Message<"quixos.orch.ReflectedIndex"> & { + /** + * @generated from field: string id = 1; + */ + id: string; + + /** + * @generated from field: string contract_json = 2; + */ + contractJson: string; +}; + +/** + * Describes the message quixos.orch.ReflectedIndex. + * Use `create(ReflectedIndexSchema)` to create a new message. + */ +export const ReflectedIndexSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_quixos_orch, 7); + +/** + * @generated from message quixos.orch.DefinitionRecord + */ +export type DefinitionRecord = Message<"quixos.orch.DefinitionRecord"> & { + /** + * @generated from oneof quixos.orch.DefinitionRecord.definition + */ + definition: { + /** + * @generated from field: quixos.orch.ReflectedAtom atom = 1; + */ + value: ReflectedAtom; + case: "atom"; + } | { + /** + * @generated from field: quixos.orch.ReflectedInterface interface = 2; + */ + value: ReflectedInterface; + case: "interface"; + } | { + /** + * @generated from field: quixos.orch.ReflectedConformance conformance = 3; + */ + value: ReflectedConformance; + case: "conformance"; + } | { + /** + * @generated from field: quixos.orch.ReflectedQuery query = 4; + */ + value: ReflectedQuery; + case: "query"; + } | { + /** + * @generated from field: quixos.orch.ReflectedIndex index = 5; + */ + value: ReflectedIndex; + case: "index"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message quixos.orch.DefinitionRecord. + * Use `create(DefinitionRecordSchema)` to create a new message. + */ +export const DefinitionRecordSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_quixos_orch, 8); + +/** + * @generated from message quixos.orch.DefinitionPage + */ +export type DefinitionPage = Message<"quixos.orch.DefinitionPage"> & { + /** + * @generated from field: quixos.orch.DefinitionIdentity identity = 1; + */ + identity?: DefinitionIdentity | undefined; + + /** + * @generated from field: repeated quixos.orch.DefinitionRecord records = 2; + */ + records: DefinitionRecord[]; + + /** + * @generated from field: string next_cursor = 3; + */ + nextCursor: string; +}; + +/** + * Describes the message quixos.orch.DefinitionPage. + * Use `create(DefinitionPageSchema)` to create a new message. + */ +export const DefinitionPageSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_quixos_orch, 9); /** * @generated from message quixos.orch.QueryEvent @@ -67,7 +472,7 @@ export type QueryEvent = Message<"quixos.orch.QueryEvent"> & { * Use `create(QueryEventSchema)` to create a new message. */ export const QueryEventSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 0); + messageDesc(file_quixos_orch, 10); /** * Exact closed interface lookup; no policy selection or competing conformances. @@ -91,7 +496,7 @@ export type TryConformRequest = Message<"quixos.orch.TryConformRequest"> & { * Use `create(TryConformRequestSchema)` to create a new message. */ export const TryConformRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 1); + messageDesc(file_quixos_orch, 11); /** * @generated from message quixos.orch.TryConformResponse @@ -110,7 +515,7 @@ export type TryConformResponse = Message<"quixos.orch.TryConformResponse"> & { * Use `create(TryConformResponseSchema)` to create a new message. */ export const TryConformResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 2); + messageDesc(file_quixos_orch, 12); /** * @generated from message quixos.orch.ConstructObjectRequest @@ -132,7 +537,7 @@ export type ConstructObjectRequest = Message<"quixos.orch.ConstructObjectRequest * Use `create(ConstructObjectRequestSchema)` to create a new message. */ export const ConstructObjectRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 3); + messageDesc(file_quixos_orch, 13); /** * @generated from message quixos.orch.ConstructObjectResponse @@ -149,7 +554,7 @@ export type ConstructObjectResponse = Message<"quixos.orch.ConstructObjectRespon * Use `create(ConstructObjectResponseSchema)` to create a new message. */ export const ConstructObjectResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 4); + messageDesc(file_quixos_orch, 14); /** * @generated from message quixos.orch.ResolveOrConstructRelatedObjectRequest @@ -176,7 +581,7 @@ export type ResolveOrConstructRelatedObjectRequest = Message<"quixos.orch.Resolv * Use `create(ResolveOrConstructRelatedObjectRequestSchema)` to create a new message. */ export const ResolveOrConstructRelatedObjectRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 5); + messageDesc(file_quixos_orch, 15); /** * @generated from message quixos.orch.ResolveOrConstructRelatedObjectResponse @@ -198,7 +603,7 @@ export type ResolveOrConstructRelatedObjectResponse = Message<"quixos.orch.Resol * Use `create(ResolveOrConstructRelatedObjectResponseSchema)` to create a new message. */ export const ResolveOrConstructRelatedObjectResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 6); + messageDesc(file_quixos_orch, 16); /** * @generated from message quixos.orch.InvokeCapabilityRequest @@ -233,7 +638,7 @@ export type InvokeCapabilityRequest = Message<"quixos.orch.InvokeCapabilityReque * Use `create(InvokeCapabilityRequestSchema)` to create a new message. */ export const InvokeCapabilityRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 7); + messageDesc(file_quixos_orch, 17); /** * @generated from message quixos.orch.InvokeClassCapabilityRequest @@ -260,7 +665,7 @@ export type InvokeClassCapabilityRequest = Message<"quixos.orch.InvokeClassCapab * Use `create(InvokeClassCapabilityRequestSchema)` to create a new message. */ export const InvokeClassCapabilityRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 8); + messageDesc(file_quixos_orch, 18); /** * @generated from message quixos.orch.InvokeCapabilityResponse @@ -307,7 +712,7 @@ export type InvokeCapabilityResponse = Message<"quixos.orch.InvokeCapabilityResp * Use `create(InvokeCapabilityResponseSchema)` to create a new message. */ export const InvokeCapabilityResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 9); + messageDesc(file_quixos_orch, 19); /** * @generated from message quixos.orch.EditCapabilityFieldRequest @@ -363,7 +768,7 @@ export type EditCapabilityFieldRequest = Message<"quixos.orch.EditCapabilityFiel * Use `create(EditCapabilityFieldRequestSchema)` to create a new message. */ export const EditCapabilityFieldRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 10); + messageDesc(file_quixos_orch, 20); /** * @generated from message quixos.orch.WatchCapabilityRequest @@ -390,7 +795,7 @@ export type WatchCapabilityRequest = Message<"quixos.orch.WatchCapabilityRequest * Use `create(WatchCapabilityRequestSchema)` to create a new message. */ export const WatchCapabilityRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 11); + messageDesc(file_quixos_orch, 21); /** * @generated from message quixos.orch.WatchCapabilityEvent @@ -442,7 +847,7 @@ export type WatchCapabilityEvent = Message<"quixos.orch.WatchCapabilityEvent"> & * Use `create(WatchCapabilityEventSchema)` to create a new message. */ export const WatchCapabilityEventSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 12); + messageDesc(file_quixos_orch, 22); /** * @generated from message quixos.orch.GetWorkspaceRequest @@ -466,7 +871,7 @@ export type GetWorkspaceRequest = Message<"quixos.orch.GetWorkspaceRequest"> & { * Use `create(GetWorkspaceRequestSchema)` to create a new message. */ export const GetWorkspaceRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 13); + messageDesc(file_quixos_orch, 23); /** * @generated from message quixos.orch.GetWorkspaceResponse @@ -533,7 +938,7 @@ export type GetWorkspaceResponse = Message<"quixos.orch.GetWorkspaceResponse"> & * Use `create(GetWorkspaceResponseSchema)` to create a new message. */ export const GetWorkspaceResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 14); + messageDesc(file_quixos_orch, 24); /** * @generated from message quixos.orch.QueryDescription @@ -590,7 +995,7 @@ export type QueryDescription = Message<"quixos.orch.QueryDescription"> & { * Use `create(QueryDescriptionSchema)` to create a new message. */ export const QueryDescriptionSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 15); + messageDesc(file_quixos_orch, 25); /** * @generated from message quixos.orch.ClassCapability @@ -637,7 +1042,7 @@ export type ClassCapability = Message<"quixos.orch.ClassCapability"> & { * Use `create(ClassCapabilitySchema)` to create a new message. */ export const ClassCapabilitySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 16); + messageDesc(file_quixos_orch, 26); /** * @generated from message quixos.orch.CapabilityInputContract @@ -664,7 +1069,7 @@ export type CapabilityInputContract = Message<"quixos.orch.CapabilityInputContra * Use `create(CapabilityInputContractSchema)` to create a new message. */ export const CapabilityInputContractSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 17); + messageDesc(file_quixos_orch, 27); /** * @generated from message quixos.orch.ConstructorInputContract @@ -686,7 +1091,7 @@ export type ConstructorInputContract = Message<"quixos.orch.ConstructorInputCont * Use `create(ConstructorInputContractSchema)` to create a new message. */ export const ConstructorInputContractSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 18); + messageDesc(file_quixos_orch, 28); /** * @generated from message quixos.orch.ListActivationsRequest @@ -699,7 +1104,7 @@ export type ListActivationsRequest = Message<"quixos.orch.ListActivationsRequest * Use `create(ListActivationsRequestSchema)` to create a new message. */ export const ListActivationsRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 19); + messageDesc(file_quixos_orch, 29); /** * @generated from message quixos.orch.ListPackageDescriptorsRequest @@ -712,7 +1117,7 @@ export type ListPackageDescriptorsRequest = Message<"quixos.orch.ListPackageDesc * Use `create(ListPackageDescriptorsRequestSchema)` to create a new message. */ export const ListPackageDescriptorsRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 20); + messageDesc(file_quixos_orch, 30); /** * @generated from message quixos.orch.ListPackageDescriptorsResponse @@ -729,7 +1134,7 @@ export type ListPackageDescriptorsResponse = Message<"quixos.orch.ListPackageDes * Use `create(ListPackageDescriptorsResponseSchema)` to create a new message. */ export const ListPackageDescriptorsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 21); + messageDesc(file_quixos_orch, 31); /** * @generated from message quixos.orch.ListPackageRuntimesRequest @@ -742,7 +1147,7 @@ export type ListPackageRuntimesRequest = Message<"quixos.orch.ListPackageRuntime * Use `create(ListPackageRuntimesRequestSchema)` to create a new message. */ export const ListPackageRuntimesRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 22); + messageDesc(file_quixos_orch, 32); /** * @generated from message quixos.orch.ListPackageRuntimesResponse @@ -759,7 +1164,7 @@ export type ListPackageRuntimesResponse = Message<"quixos.orch.ListPackageRuntim * Use `create(ListPackageRuntimesResponseSchema)` to create a new message. */ export const ListPackageRuntimesResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 23); + messageDesc(file_quixos_orch, 33); /** * @generated from message quixos.orch.ListActivationsResponse @@ -776,7 +1181,7 @@ export type ListActivationsResponse = Message<"quixos.orch.ListActivationsRespon * Use `create(ListActivationsResponseSchema)` to create a new message. */ export const ListActivationsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 24); + messageDesc(file_quixos_orch, 34); /** * @generated from message quixos.orch.CloseActivationRequest @@ -798,7 +1203,7 @@ export type CloseActivationRequest = Message<"quixos.orch.CloseActivationRequest * Use `create(CloseActivationRequestSchema)` to create a new message. */ export const CloseActivationRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 25); + messageDesc(file_quixos_orch, 35); /** * @generated from message quixos.orch.CloseActivationResponse @@ -815,7 +1220,7 @@ export type CloseActivationResponse = Message<"quixos.orch.CloseActivationRespon * Use `create(CloseActivationResponseSchema)` to create a new message. */ export const CloseActivationResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 26); + messageDesc(file_quixos_orch, 36); /** * @generated from message quixos.orch.Activation @@ -877,7 +1282,7 @@ export type Activation = Message<"quixos.orch.Activation"> & { * Use `create(ActivationSchema)` to create a new message. */ export const ActivationSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 27); + messageDesc(file_quixos_orch, 37); /** * @generated from message quixos.orch.PackageRuntimeStatus @@ -949,12 +1354,28 @@ export type PackageRuntimeStatus = Message<"quixos.orch.PackageRuntimeStatus"> & * Use `create(PackageRuntimeStatusSchema)` to create a new message. */ export const PackageRuntimeStatusSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_orch, 28); + messageDesc(file_quixos_orch, 38); /** * @generated from service quixos.orch.OrchestratorRuntime */ export const OrchestratorRuntime: GenService<{ + /** + * @generated from rpc quixos.orch.OrchestratorRuntime.ReadDefinitions + */ + readDefinitions: { + methodKind: "unary"; + input: typeof DefinitionRequestSchema; + output: typeof DefinitionPageSchema; + }, + /** + * @generated from rpc quixos.orch.OrchestratorRuntime.WatchDefinitions + */ + watchDefinitions: { + methodKind: "server_streaming"; + input: typeof DefinitionRequestSchema; + output: typeof DefinitionPageSchema; + }, /** * @generated from rpc quixos.orch.OrchestratorRuntime.ExecuteQuery */ diff --git a/src/gen/quixos/refs_pb.ts b/src/gen/quixos/refs_pb.ts index 6f164a4..12d7c24 100644 --- a/src/gen/quixos/refs_pb.ts +++ b/src/gen/quixos/refs_pb.ts @@ -10,7 +10,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file quixos/refs.proto. */ export const file_quixos_refs: GenFile = /*@__PURE__*/ - fileDesc("ChFxdWl4b3MvcmVmcy5wcm90bxIGcXVpeG9zInUKDUNhcGFiaWxpdHlSZWYSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhQKDG9wZXJhdGlvbl9pZBgCIAEoCRIvCgtjb25mb3JtYW5jZRgDIAEoCzIaLnF1aXhvcy5Db25mb3JtYW5jZVdpdG5lc3Mi0QEKDEZpZWxkRWRpdGluZxIbChNnZXR0ZXJfb3BlcmF0aW9uX2lkGAEgASgJEhsKE3NldHRlcl9vcGVyYXRpb25faWQYAiABKAkSFQoNZG9jdW1lbnRfdHlwZRgDIAEoCRIWCg5iaW5kaW5nX2RpZ2VzdBgEIAEoCRInCgRtb2RlGAUgASgOMhkucXVpeG9zLkZpZWxkRWRpdGluZy5Nb2RlIi8KBE1vZGUSDwoLVU5TUEVDSUZJRUQQABIMCghSRUdJU1RFUhABEggKBENSRFQQAiKWAQoSQ29uZm9ybWFuY2VXaXRuZXNzEhEKCW9iamVjdF9pZBgBIAEoCRIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYAiABKAkSFgoOY29uZm9ybWFuY2VfaWQYAyABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAQgASgJEhcKD3dvcmtzcGFjZV9lcG9jaBgFIAEoCSJCChBQYWNrYWdlRXhwb3J0UmVmEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYASABKAkSEQoJZXhwb3J0X2lkGAIgASgJIpUCChJJbmplY3RlZERlcGVuZGVuY3kSDwoHcG9ydF9pZBgBIAEoCRIXCg1zdGF0ZV9zbG90X2lkGAIgASgJSAASJgoEZWRnZRgDIAEoCzIWLnF1aXhvcy5FZGdlRGVwZW5kZW5jeUgAEh8KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgEIAEoCUgAEh0KE2NvbnN0cnVjdG9yX2F0b21faWQYBSABKAlIABISCghxdWVyeV9pZBgHIAEoCUgAEjsKD3dvcmtzcGFjZV9xdWVyeRgIIAEoCzIgLnF1aXhvcy5Xb3Jrc3BhY2VRdWVyeURlcGVuZGVuY3lIABIRCglvYmplY3RfaWQYBiABKAlCCQoHYmluZGluZyKaAQoTV29ya3NwYWNlUXVlcnlTY29wZRIUCgx3b3Jrc3BhY2VfaWQYASABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAIgASgJEhcKD3dvcmtzcGFjZV9lcG9jaBgDIAEoCRIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYBCABKAkSFgoOYmluZGluZ19kaWdlc3QYBSABKAkiWAoYV29ya3NwYWNlUXVlcnlEZXBlbmRlbmN5EhAKCHF1ZXJ5X2lkGAEgASgJEioKBXNjb3BlGAIgASgLMhsucXVpeG9zLldvcmtzcGFjZVF1ZXJ5U2NvcGUiPQoORWRnZURlcGVuZGVuY3kSFAoMZWRnZV90eXBlX2lkGAEgASgJEhUKDXByb2plY3Rpb25faWQYAiABKAliBnByb3RvMw"); + fileDesc("ChFxdWl4b3MvcmVmcy5wcm90bxIGcXVpeG9zInUKDUNhcGFiaWxpdHlSZWYSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhQKDG9wZXJhdGlvbl9pZBgCIAEoCRIvCgtjb25mb3JtYW5jZRgDIAEoCzIaLnF1aXhvcy5Db25mb3JtYW5jZVdpdG5lc3Mi0QEKDEZpZWxkRWRpdGluZxIbChNnZXR0ZXJfb3BlcmF0aW9uX2lkGAEgASgJEhsKE3NldHRlcl9vcGVyYXRpb25faWQYAiABKAkSFQoNZG9jdW1lbnRfdHlwZRgDIAEoCRIWCg5iaW5kaW5nX2RpZ2VzdBgEIAEoCRInCgRtb2RlGAUgASgOMhkucXVpeG9zLkZpZWxkRWRpdGluZy5Nb2RlIi8KBE1vZGUSDwoLVU5TUEVDSUZJRUQQABIMCghSRUdJU1RFUhABEggKBENSRFQQAiKWAQoSQ29uZm9ybWFuY2VXaXRuZXNzEhEKCW9iamVjdF9pZBgBIAEoCRIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYAiABKAkSFgoOY29uZm9ybWFuY2VfaWQYAyABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAQgASgJEhcKD3dvcmtzcGFjZV9lcG9jaBgFIAEoCSJCChBQYWNrYWdlRXhwb3J0UmVmEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYASABKAkSEQoJZXhwb3J0X2lkGAIgASgJIskCChJJbmplY3RlZERlcGVuZGVuY3kSDwoHcG9ydF9pZBgBIAEoCRIXCg1zdGF0ZV9zbG90X2lkGAIgASgJSAASJgoEZWRnZRgDIAEoCzIWLnF1aXhvcy5FZGdlRGVwZW5kZW5jeUgAEh8KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgEIAEoCUgAEh0KE2NvbnN0cnVjdG9yX2F0b21faWQYBSABKAlIABISCghxdWVyeV9pZBgHIAEoCUgAEjsKD3dvcmtzcGFjZV9xdWVyeRgIIAEoCzIgLnF1aXhvcy5Xb3Jrc3BhY2VRdWVyeURlcGVuZGVuY3lIABIyCgpyZWZsZWN0aW9uGAkgASgLMhwucXVpeG9zLlJlZmxlY3Rpb25EZXBlbmRlbmN5SAASEQoJb2JqZWN0X2lkGAYgASgJQgkKB2JpbmRpbmciWAoUUmVmbGVjdGlvbkRlcGVuZGVuY3kSFAoMd29ya3NwYWNlX2lkGAEgASgJEhcKD3dvcmtzcGFjZV9lcG9jaBgCIAEoCRIRCglzZWxlY3RvcnMYAyADKAkimgEKE1dvcmtzcGFjZVF1ZXJ5U2NvcGUSFAoMd29ya3NwYWNlX2lkGAEgASgJEh0KFXdvcmtzcGFjZV9yZXZpc2lvbl9pZBgCIAEoCRIXCg93b3Jrc3BhY2VfZXBvY2gYAyABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAQgASgJEhYKDmJpbmRpbmdfZGlnZXN0GAUgASgJIlgKGFdvcmtzcGFjZVF1ZXJ5RGVwZW5kZW5jeRIQCghxdWVyeV9pZBgBIAEoCRIqCgVzY29wZRgCIAEoCzIbLnF1aXhvcy5Xb3Jrc3BhY2VRdWVyeVNjb3BlIj0KDkVkZ2VEZXBlbmRlbmN5EhQKDGVkZ2VfdHlwZV9pZBgBIAEoCRIVCg1wcm9qZWN0aW9uX2lkGAIgASgJYgZwcm90bzM"); /** * @generated from message quixos.CapabilityRef @@ -213,6 +213,12 @@ export type InjectedDependency = Message<"quixos.InjectedDependency"> & { */ value: WorkspaceQueryDependency; case: "workspaceQuery"; + } | { + /** + * @generated from field: quixos.ReflectionDependency reflection = 9; + */ + value: ReflectionDependency; + case: "reflection"; } | { case: undefined; value?: undefined }; /** @@ -231,6 +237,33 @@ export type InjectedDependency = Message<"quixos.InjectedDependency"> & { export const InjectedDependencySchema: GenMessage = /*@__PURE__*/ messageDesc(file_quixos_refs, 4); +/** + * @generated from message quixos.ReflectionDependency + */ +export type ReflectionDependency = Message<"quixos.ReflectionDependency"> & { + /** + * @generated from field: string workspace_id = 1; + */ + workspaceId: string; + + /** + * @generated from field: string workspace_epoch = 2; + */ + workspaceEpoch: string; + + /** + * @generated from field: repeated string selectors = 3; + */ + selectors: string[]; +}; + +/** + * Describes the message quixos.ReflectionDependency. + * Use `create(ReflectionDependencySchema)` to create a new message. + */ +export const ReflectionDependencySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_quixos_refs, 5); + /** * Scope evidence is not authority by itself. The caller must also hold the * matching workspace-query grant (or the authenticated workspace user grant). @@ -269,7 +302,7 @@ export type WorkspaceQueryScope = Message<"quixos.WorkspaceQueryScope"> & { * Use `create(WorkspaceQueryScopeSchema)` to create a new message. */ export const WorkspaceQueryScopeSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_refs, 5); + messageDesc(file_quixos_refs, 6); /** * @generated from message quixos.WorkspaceQueryDependency @@ -291,7 +324,7 @@ export type WorkspaceQueryDependency = Message<"quixos.WorkspaceQueryDependency" * Use `create(WorkspaceQueryDependencySchema)` to create a new message. */ export const WorkspaceQueryDependencySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_refs, 6); + messageDesc(file_quixos_refs, 7); /** * @generated from message quixos.EdgeDependency @@ -313,5 +346,5 @@ export type EdgeDependency = Message<"quixos.EdgeDependency"> & { * Use `create(EdgeDependencySchema)` to create a new message. */ export const EdgeDependencySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_refs, 7); + messageDesc(file_quixos_refs, 8); diff --git a/test/bindings.test.ts b/test/bindings.test.ts index 4dccdaa..4e204cf 100644 --- a/test/bindings.test.ts +++ b/test/bindings.test.ts @@ -12,6 +12,17 @@ const schemaFor = (body: string): BindingSchema => { if (!compiled.ok || compiled.resource.kind !== "package") throw new Error("expected package"); return { format: "quixos-bindings", version: 1, interfaces: [], packages: [compiled.resource.revision] }; }; +test("reflection ports generate explicit selector-restricted package bindings", () => { + const schema = schemaFor( + 'function inspect id "inspect" : unit -> unit requires { reflection meta id "meta" [active, atoms, interfaces, conformances, queries, indexes]; };', + ); + const generated = generateTypeScriptBindings(schema, "demo@1"); + assert.match( + generated, + /QxReflectionPort<"active" \| "atoms" \| "interfaces" \| "conformances" \| "queries" \| "indexes">/, + ); + assert.match(generated, /"kind": "reflection"/); +}); test("generator uses exact IDs, restricted ports, nominal references, and lossless scalar types", () => { const schema = schemaFor( 'operation run id "run-id" : list -> optional> mode call receiver atom Thing requires { state payload id "payload-id" : bytes [read]; };', diff --git a/test/generic-packages.test.ts b/test/generic-packages.test.ts index 790afc2..650d50c 100644 --- a/test/generic-packages.test.ts +++ b/test/generic-packages.test.ts @@ -43,6 +43,7 @@ test("runtime conformance descriptors preserve closed and universal collection i }; operation inspect id "inspect" : ref -> unit mode call receiver any requires { interface items id "items" : Collection; + reflection metadata id "metadata" [atoms, interfaces]; }; }`, { source, environment: { interfaces: new Map([["Collection", collection.resource.revision]]) } }, @@ -77,6 +78,11 @@ test("runtime conformance descriptors preserve closed and universal collection i return null; }, inspect: async (context) => { + await context.ports.metadata.read({selector:{kind:"atoms",interfaceRevisionId:"named"}}); + // @ts-expect-error Queries are outside this port's declared authority. + await context.ports.metadata.read({selector:{kind:"queries"}}); + // @ts-expect-error Interface inventory does not support atom filters. + await context.ports.metadata.read({selector:{kind:"interfaces",atomId:"book"}}); const view = await context.conform.tryConform(context.objectId, context.ports.items.contract); if (view) await view["items.connect"](context.input); return null; diff --git a/test/reflection.test.ts b/test/reflection.test.ts new file mode 100644 index 0000000..2a24d2a --- /dev/null +++ b/test/reflection.test.ts @@ -0,0 +1,48 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/parser.js"; +import { generateTypeScriptBindings } from "../src/bindings/index.js"; +const source = { repository: "https://example.test/meta.git", commit: "a".repeat(40) }; + +test("reflection authority is an explicit checked workspace binding, including generic exports", () => { + const iface = compileCapabilityResourceSource( + 'interface Inspect id "inspect" revision "inspect@1" {operation run id "run" : unit -> unit {call id "call";}}', + { source }, + ); + assert.ok(iface.ok && iface.resource.kind === "interface"); + if (!iface.ok || iface.resource.kind !== "interface") throw Error("interface"); + const interfaceRevision = iface.resource.revision; + for (const generic of [false, true]) { + const pkg = compileCapabilityResourceSource( + `package Inspector id "inspector" revision "inspector@1" {operation run${generic ? "" : ""} id "run" : unit -> unit mode call receiver any requires {reflection meta id "meta" [atoms, interfaces];};}`, + { source }, + ); + assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); + if (!pkg.ok || pkg.resource.kind !== "package") throw Error("package"); + const packageRevision = pkg.resource.revision; + const compile = (selectors: string) => + compileCapabilitySource( + `workspace W id "ws" revision "ws@1" commit "${source.commit}" { + import interface Inspect;import package Inspector;atom Thing id "thing"; + conform Thing as Inspect id "inspection" {bind run.call to package Inspector.run${generic ? "" : ""} with {meta to workspace reflection [${selectors}];};} + }`, + "workspace.qx", + { interfaces: new Map([["Inspect", interfaceRevision]]), packages: new Map([["Inspector", packageRevision]]) }, + ); + const result = compile("atoms, interfaces"); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + assert.equal(compile("atoms").ok, false, "binding cannot narrow or expand the declared contract silently"); + assert.equal(compile("atoms, interfaces, queries").ok, false); + if (!result.ok) throw Error("workspace"); + const generated = generateTypeScriptBindings( + { + format: "quixos-bindings", + version: 1, + interfaces: result.workspace.interfaceImports, + packages: result.workspace.packageImports, + }, + "inspector@1", + ); + assert.match(generated, /QxReflectionPort/); + } +}); From 03ac7f855702326a14bdcf27d36aa3ca4aca9023 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sat, 19 Sep 2026 21:52:37 -0700 Subject: [PATCH 06/91] Add local-first execution contracts to the capability language --- grammar/QuixosCapability.g4 | 42 +- proto/camino/schema.proto | 7 + src/bindings/generics.ts | 7 +- src/bindings/index.ts | 7 +- .../generated/QuixosCapability.interp | 22 +- .../generated/QuixosCapability.tokens | 536 +-- .../generated/QuixosCapabilityLexer.interp | 29 +- .../generated/QuixosCapabilityLexer.tokens | 536 +-- .../generated/QuixosCapabilityLexer.ts | 1315 +++--- .../generated/QuixosCapabilityParser.ts | 3509 +++++++++-------- .../generated/QuixosCapabilityVisitor.ts | 14 + src/capability-language/parser.ts | 122 +- src/capability-model/execution.ts | 139 + src/capability-model/generic-packages.ts | 14 +- src/capability-model/types.ts | 9 +- src/capability-model/validation.ts | 7 +- src/gen/camino/schema_pb.ts | 38 +- src/query/compile.ts | 17 + src/query/link.ts | 4 +- src/query/proto.ts | 9 + src/query/root.ts | 4 +- src/query/schema.ts | 2 +- src/query/types.ts | 3 +- test/execution-contracts.test.ts | 240 ++ 24 files changed, 3872 insertions(+), 2760 deletions(-) create mode 100644 src/capability-model/execution.ts create mode 100644 test/execution-contracts.test.ts diff --git a/grammar/QuixosCapability.g4 b/grammar/QuixosCapability.g4 index b2c4444..9b0ef60 100644 --- a/grammar/QuixosCapability.g4 +++ b/grammar/QuixosCapability.g4 @@ -96,7 +96,7 @@ interfaceMember operationMember : STATIC? OPERATION identifier ID stringLiteral COLON valueType ARROW valueType - LBRACE CALL ID stringLiteral SEMI RBRACE + LBRACE CALL ID stringLiteral executionClause? SEMI RBRACE ; valueMember @@ -105,8 +105,8 @@ valueMember ; valueMemberOperation - : GET ID stringLiteral SEMI - | SET ID stringLiteral SEMI + : GET ID stringLiteral executionClause? SEMI + | SET ID stringLiteral executionClause? SEMI | WATCH START ID stringLiteral STOP ID stringLiteral SEMI ; @@ -116,13 +116,13 @@ relationshipMember ; queryReadContract - : QUERYABLE RPC? + : QUERYABLE (RPC | PORTABLE)? ; relationshipOperation - : RESOLVE ID stringLiteral SEMI - | CONNECT ID stringLiteral SEMI - | DISCONNECT ID stringLiteral SEMI + : RESOLVE ID stringLiteral executionClause? SEMI + | CONNECT ID stringLiteral executionClause? SEMI + | DISCONNECT ID stringLiteral executionClause? SEMI | WATCH START ID stringLiteral STOP ID stringLiteral SEMI ; @@ -156,7 +156,9 @@ packageQuerySpecialization ; queryClause - : FRAGMENTS stringLiteral SEMI + : REPLICA SEMI + | LOCAL FROM identifier SEMI + | FRAGMENTS stringLiteral SEMI | VIEW OBJECT? identifier AS interfaceType SEMI | MAX identifier INTEGER SEMI | ALLOW interfaceType DOT identifier identifier stringLiteral SEMI @@ -166,12 +168,21 @@ queryClause packageOperationExport : OPERATION identifier typeParameters? ID stringLiteral COLON valueType ARROW valueType - MODE operationMode eventClause? RECEIVER receiverRequirement dependencyBlock? SEMI + MODE operationMode executionClause? eventClause? RECEIVER receiverRequirement dependencyBlock? SEMI ; packageFunctionExport : FUNCTION identifier typeParameters? ID stringLiteral COLON valueType ARROW valueType - dependencyBlock? SEMI + executionClause? dependencyBlock? SEMI + ; + +executionClause + : EXECUTION REMOTE + | EXECUTION (SNAPSHOT | TRANSACTION) TARGETS LBRACK identifierList RBRACK + ; + +selectedOperations + : USING LBRACK memberOperationRef (COMMA memberOperationRef)* RBRACK ; packageConstructorExport @@ -210,7 +221,7 @@ dependencyPort : REFLECTION identifier ID stringLiteral LBRACK identifierList RBRACK SEMI | STATE identifier ID stringLiteral COLON valueType primitiveList SEMI | EDGE identifier ID stringLiteral COLON cardinality targetConstraint primitiveList SEMI - | INTERFACE identifier ID stringLiteral COLON identifier typeArguments? SEMI + | INTERFACE identifier ID stringLiteral COLON identifier typeArguments? selectedOperations? SEMI | CONSTRUCTOR identifier ID stringLiteral COLON identifier (INPUT valueType)? SEMI | QUERY identifier ID stringLiteral COLON identifier DOT identifier SEMI ; @@ -423,6 +434,15 @@ stringLiteral ; WORKSPACE: 'workspace'; +EXECUTION: 'execution'; +SNAPSHOT: 'snapshot'; +TRANSACTION: 'transaction'; +REMOTE: 'remote'; +TARGETS: 'targets'; +PORTABLE: 'portable'; +REPLICA: 'replica'; +LOCAL: 'local'; +FROM: 'from'; RESULT_BYTES: 'result-bytes'; RPC_CALLS: 'rpc-calls'; DEADLINE_MS: 'deadline-ms'; diff --git a/proto/camino/schema.proto b/proto/camino/schema.proto index 6ff19ce..e292ff6 100644 --- a/proto/camino/schema.proto +++ b/proto/camino/schema.proto @@ -305,6 +305,12 @@ message QueryBudgets { uint32 concurrency = 6; uint32 deadline_ms = 7; } +message QueryPlacement { + oneof kind { + bool replica = 1; + string local_source_query_id = 2; + } +} message InstalledQuery { string id = 1; string definition_digest = 2; @@ -324,4 +330,5 @@ message InstalledQuery { bool rpc_predicate_or_order = 13; repeated string root_atom_ids = 15; repeated QueryFieldContract fields = 16; + QueryPlacement placement = 17; } diff --git a/src/bindings/generics.ts b/src/bindings/generics.ts index 0ec8278..d59d6f9 100644 --- a/src/bindings/generics.ts +++ b/src/bindings/generics.ts @@ -131,7 +131,12 @@ export const genericImplementationType = ( }; const operations = (contract.template?.members ?? contract.members).flatMap((member) => member.operations - .filter((op) => op.mode === "call" && op.scope !== "class") + .filter( + (op) => + op.mode === "call" && + op.scope !== "class" && + (!requirement.operations || requirement.operations.includes(op.id)), + ) .map((op) => ({ ...op, name: `${member.displayName}.${op.displayName}` })), ); const methods: [string, string][] = [ diff --git a/src/bindings/index.ts b/src/bindings/index.ts index 5d08072..07d0966 100644 --- a/src/bindings/index.ts +++ b/src/bindings/index.ts @@ -213,7 +213,12 @@ export const generateTypeScriptBindings = ( // Streaming ports need a future streaming ABI; ordinary calls are fully typed today. const operations = contract.members.flatMap((member) => member.operations - .filter((operation) => operation.mode === "call" && operation.scope !== "class") + .filter( + (operation) => + operation.mode === "call" && + operation.scope !== "class" && + (!requirement.operations || requirement.operations.includes(operation.id)), + ) .map((operation) => ({ ...operation, name: `${member.displayName}.${operation.displayName}` })), ); const methods: [string, string][] = [ diff --git a/src/capability-language/generated/QuixosCapability.interp b/src/capability-language/generated/QuixosCapability.interp index 3ce3de6..46c5655 100644 --- a/src/capability-language/generated/QuixosCapability.interp +++ b/src/capability-language/generated/QuixosCapability.interp @@ -1,6 +1,15 @@ token literal names: null 'workspace' +'execution' +'snapshot' +'transaction' +'remote' +'targets' +'portable' +'replica' +'local' +'from' 'result-bytes' 'rpc-calls' 'deadline-ms' @@ -138,6 +147,15 @@ null token symbolic names: null WORKSPACE +EXECUTION +SNAPSHOT +TRANSACTION +REMOTE +TARGETS +PORTABLE +REPLICA +LOCAL +FROM RESULT_BYTES RPC_CALLS DEADLINE_MS @@ -305,6 +323,8 @@ packageQuerySpecialization queryClause packageOperationExport packageFunctionExport +executionClause +selectedOperations packageConstructorExport eventClause operationMode @@ -346,4 +366,4 @@ stringLiteral atn: -[4, 1, 134, 1123, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 153, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 158, 8, 1, 10, 1, 12, 1, 161, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 179, 8, 3, 10, 3, 12, 3, 182, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 193, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 205, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 225, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 233, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 238, 8, 10, 10, 10, 12, 10, 241, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 246, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 256, 8, 10, 10, 10, 12, 10, 259, 9, 10, 3, 10, 261, 8, 10, 1, 10, 1, 10, 5, 10, 265, 8, 10, 10, 10, 12, 10, 268, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 276, 8, 11, 10, 11, 12, 11, 279, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 287, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 295, 8, 12, 10, 12, 12, 12, 298, 9, 12, 3, 12, 300, 8, 12, 3, 12, 302, 8, 12, 1, 13, 1, 13, 3, 13, 306, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 312, 8, 14, 10, 14, 12, 14, 315, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 326, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 331, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 340, 8, 17, 1, 18, 3, 18, 343, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 3, 19, 361, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 371, 8, 19, 10, 19, 12, 19, 374, 9, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 397, 8, 20, 1, 21, 3, 21, 400, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 410, 8, 21, 1, 21, 1, 21, 3, 21, 414, 8, 21, 1, 21, 1, 21, 5, 21, 418, 8, 21, 10, 21, 12, 21, 421, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 427, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 453, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 460, 8, 24, 1, 24, 1, 24, 3, 24, 464, 8, 24, 1, 25, 5, 25, 467, 8, 25, 10, 25, 12, 25, 470, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 480, 8, 25, 1, 25, 1, 25, 5, 25, 484, 8, 25, 10, 25, 12, 25, 487, 9, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 496, 8, 26, 1, 27, 1, 27, 1, 27, 3, 27, 501, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 507, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 516, 8, 27, 10, 27, 12, 27, 519, 9, 27, 1, 27, 1, 27, 1, 28, 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, 3, 29, 538, 8, 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, 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, 3, 29, 565, 8, 29, 1, 30, 1, 30, 1, 30, 3, 30, 570, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 581, 8, 30, 1, 30, 1, 30, 1, 30, 3, 30, 586, 8, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 3, 31, 593, 8, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 602, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 615, 8, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 634, 8, 35, 10, 35, 12, 35, 637, 9, 35, 3, 35, 639, 8, 35, 1, 35, 3, 35, 642, 8, 35, 1, 36, 1, 36, 1, 36, 5, 36, 647, 8, 36, 10, 36, 12, 36, 650, 9, 36, 1, 37, 1, 37, 1, 37, 5, 37, 655, 8, 37, 10, 37, 12, 37, 658, 9, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 697, 8, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 709, 8, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 723, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 729, 8, 39, 10, 39, 12, 39, 732, 9, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 3, 42, 743, 8, 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, 3, 43, 757, 8, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 767, 8, 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, 46, 1, 46, 1, 46, 1, 46, 3, 46, 785, 8, 46, 1, 46, 1, 46, 3, 46, 789, 8, 46, 1, 46, 3, 46, 792, 8, 46, 1, 46, 1, 46, 3, 46, 796, 8, 46, 1, 46, 3, 46, 799, 8, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 808, 8, 47, 1, 47, 1, 47, 3, 47, 812, 8, 47, 1, 47, 1, 47, 3, 47, 816, 8, 47, 1, 47, 1, 47, 5, 47, 820, 8, 47, 10, 47, 12, 47, 823, 9, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 832, 8, 48, 1, 49, 1, 49, 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, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 861, 8, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 880, 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, 1, 54, 1, 54, 1, 54, 3, 54, 897, 8, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 907, 8, 54, 1, 54, 3, 54, 910, 8, 54, 3, 54, 912, 8, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 5, 57, 921, 8, 57, 10, 57, 12, 57, 924, 9, 57, 1, 57, 1, 57, 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, 947, 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, 963, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 972, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 980, 8, 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, 993, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 1005, 8, 58, 1, 58, 1, 58, 3, 58, 1009, 8, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1018, 8, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1036, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 1058, 8, 60, 10, 60, 12, 60, 1061, 9, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1066, 8, 60, 3, 60, 1068, 8, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1087, 8, 64, 1, 65, 1, 65, 1, 65, 1, 65, 5, 65, 1093, 8, 65, 10, 65, 12, 65, 1096, 9, 65, 3, 65, 1098, 8, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 5, 67, 1110, 8, 67, 10, 67, 12, 67, 1113, 9, 67, 3, 67, 1115, 8, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 0, 0, 70, 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, 0, 7, 1, 0, 82, 86, 2, 0, 77, 81, 83, 84, 2, 0, 77, 78, 83, 84, 2, 0, 79, 81, 83, 84, 1, 0, 102, 109, 1, 0, 89, 92, 4, 0, 2, 16, 28, 28, 56, 56, 130, 130, 1208, 0, 152, 1, 0, 0, 0, 2, 154, 1, 0, 0, 0, 4, 164, 1, 0, 0, 0, 6, 168, 1, 0, 0, 0, 8, 192, 1, 0, 0, 0, 10, 204, 1, 0, 0, 0, 12, 206, 1, 0, 0, 0, 14, 213, 1, 0, 0, 0, 16, 224, 1, 0, 0, 0, 18, 226, 1, 0, 0, 0, 20, 239, 1, 0, 0, 0, 22, 271, 1, 0, 0, 0, 24, 301, 1, 0, 0, 0, 26, 303, 1, 0, 0, 0, 28, 307, 1, 0, 0, 0, 30, 325, 1, 0, 0, 0, 32, 327, 1, 0, 0, 0, 34, 339, 1, 0, 0, 0, 36, 342, 1, 0, 0, 0, 38, 360, 1, 0, 0, 0, 40, 396, 1, 0, 0, 0, 42, 399, 1, 0, 0, 0, 44, 424, 1, 0, 0, 0, 46, 452, 1, 0, 0, 0, 48, 463, 1, 0, 0, 0, 50, 468, 1, 0, 0, 0, 52, 495, 1, 0, 0, 0, 54, 497, 1, 0, 0, 0, 56, 522, 1, 0, 0, 0, 58, 564, 1, 0, 0, 0, 60, 566, 1, 0, 0, 0, 62, 589, 1, 0, 0, 0, 64, 605, 1, 0, 0, 0, 66, 618, 1, 0, 0, 0, 68, 621, 1, 0, 0, 0, 70, 641, 1, 0, 0, 0, 72, 643, 1, 0, 0, 0, 74, 651, 1, 0, 0, 0, 76, 722, 1, 0, 0, 0, 78, 724, 1, 0, 0, 0, 80, 735, 1, 0, 0, 0, 82, 737, 1, 0, 0, 0, 84, 742, 1, 0, 0, 0, 86, 744, 1, 0, 0, 0, 88, 766, 1, 0, 0, 0, 90, 768, 1, 0, 0, 0, 92, 777, 1, 0, 0, 0, 94, 802, 1, 0, 0, 0, 96, 831, 1, 0, 0, 0, 98, 833, 1, 0, 0, 0, 100, 840, 1, 0, 0, 0, 102, 854, 1, 0, 0, 0, 104, 864, 1, 0, 0, 0, 106, 879, 1, 0, 0, 0, 108, 911, 1, 0, 0, 0, 110, 913, 1, 0, 0, 0, 112, 915, 1, 0, 0, 0, 114, 917, 1, 0, 0, 0, 116, 1008, 1, 0, 0, 0, 118, 1010, 1, 0, 0, 0, 120, 1067, 1, 0, 0, 0, 122, 1069, 1, 0, 0, 0, 124, 1074, 1, 0, 0, 0, 126, 1076, 1, 0, 0, 0, 128, 1086, 1, 0, 0, 0, 130, 1088, 1, 0, 0, 0, 132, 1101, 1, 0, 0, 0, 134, 1105, 1, 0, 0, 0, 136, 1118, 1, 0, 0, 0, 138, 1120, 1, 0, 0, 0, 140, 141, 3, 6, 3, 0, 141, 142, 5, 0, 0, 1, 142, 153, 1, 0, 0, 0, 143, 144, 3, 20, 10, 0, 144, 145, 5, 0, 0, 1, 145, 153, 1, 0, 0, 0, 146, 147, 3, 50, 25, 0, 147, 148, 5, 0, 0, 1, 148, 153, 1, 0, 0, 0, 149, 150, 3, 2, 1, 0, 150, 151, 5, 0, 0, 1, 151, 153, 1, 0, 0, 0, 152, 140, 1, 0, 0, 0, 152, 143, 1, 0, 0, 0, 152, 146, 1, 0, 0, 0, 152, 149, 1, 0, 0, 0, 153, 1, 1, 0, 0, 0, 154, 155, 5, 23, 0, 0, 155, 159, 5, 118, 0, 0, 156, 158, 3, 8, 4, 0, 157, 156, 1, 0, 0, 0, 158, 161, 1, 0, 0, 0, 159, 157, 1, 0, 0, 0, 159, 160, 1, 0, 0, 0, 160, 162, 1, 0, 0, 0, 161, 159, 1, 0, 0, 0, 162, 163, 5, 119, 0, 0, 163, 3, 1, 0, 0, 0, 164, 165, 5, 24, 0, 0, 165, 166, 3, 138, 69, 0, 166, 167, 5, 115, 0, 0, 167, 5, 1, 0, 0, 0, 168, 169, 5, 1, 0, 0, 169, 170, 3, 136, 68, 0, 170, 171, 5, 65, 0, 0, 171, 172, 3, 138, 69, 0, 172, 173, 5, 59, 0, 0, 173, 174, 3, 138, 69, 0, 174, 175, 5, 58, 0, 0, 175, 176, 3, 138, 69, 0, 176, 180, 5, 118, 0, 0, 177, 179, 3, 8, 4, 0, 178, 177, 1, 0, 0, 0, 179, 182, 1, 0, 0, 0, 180, 178, 1, 0, 0, 0, 180, 181, 1, 0, 0, 0, 181, 183, 1, 0, 0, 0, 182, 180, 1, 0, 0, 0, 183, 184, 5, 119, 0, 0, 184, 7, 1, 0, 0, 0, 185, 193, 3, 4, 2, 0, 186, 193, 3, 18, 9, 0, 187, 193, 3, 10, 5, 0, 188, 193, 3, 82, 41, 0, 189, 193, 3, 94, 47, 0, 190, 193, 3, 118, 59, 0, 191, 193, 3, 32, 16, 0, 192, 185, 1, 0, 0, 0, 192, 186, 1, 0, 0, 0, 192, 187, 1, 0, 0, 0, 192, 188, 1, 0, 0, 0, 192, 189, 1, 0, 0, 0, 192, 190, 1, 0, 0, 0, 192, 191, 1, 0, 0, 0, 193, 9, 1, 0, 0, 0, 194, 195, 5, 24, 0, 0, 195, 196, 5, 27, 0, 0, 196, 197, 3, 136, 68, 0, 197, 198, 5, 115, 0, 0, 198, 205, 1, 0, 0, 0, 199, 200, 5, 24, 0, 0, 200, 201, 5, 29, 0, 0, 201, 202, 3, 136, 68, 0, 202, 203, 5, 115, 0, 0, 203, 205, 1, 0, 0, 0, 204, 194, 1, 0, 0, 0, 204, 199, 1, 0, 0, 0, 205, 11, 1, 0, 0, 0, 206, 207, 5, 25, 0, 0, 207, 208, 5, 26, 0, 0, 208, 209, 3, 136, 68, 0, 209, 210, 5, 65, 0, 0, 210, 211, 3, 138, 69, 0, 211, 212, 5, 115, 0, 0, 212, 13, 1, 0, 0, 0, 213, 214, 5, 25, 0, 0, 214, 215, 5, 27, 0, 0, 215, 216, 3, 136, 68, 0, 216, 217, 5, 59, 0, 0, 217, 218, 3, 138, 69, 0, 218, 219, 5, 115, 0, 0, 219, 15, 1, 0, 0, 0, 220, 225, 3, 10, 5, 0, 221, 225, 3, 12, 6, 0, 222, 225, 3, 14, 7, 0, 223, 225, 3, 32, 16, 0, 224, 220, 1, 0, 0, 0, 224, 221, 1, 0, 0, 0, 224, 222, 1, 0, 0, 0, 224, 223, 1, 0, 0, 0, 225, 17, 1, 0, 0, 0, 226, 227, 5, 26, 0, 0, 227, 228, 3, 136, 68, 0, 228, 229, 5, 65, 0, 0, 229, 232, 3, 138, 69, 0, 230, 231, 5, 66, 0, 0, 231, 233, 3, 138, 69, 0, 232, 230, 1, 0, 0, 0, 232, 233, 1, 0, 0, 0, 233, 234, 1, 0, 0, 0, 234, 235, 5, 115, 0, 0, 235, 19, 1, 0, 0, 0, 236, 238, 3, 16, 8, 0, 237, 236, 1, 0, 0, 0, 238, 241, 1, 0, 0, 0, 239, 237, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 242, 1, 0, 0, 0, 241, 239, 1, 0, 0, 0, 242, 243, 5, 27, 0, 0, 243, 245, 3, 136, 68, 0, 244, 246, 3, 22, 11, 0, 245, 244, 1, 0, 0, 0, 245, 246, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 247, 248, 5, 65, 0, 0, 248, 249, 3, 138, 69, 0, 249, 250, 5, 59, 0, 0, 250, 260, 3, 138, 69, 0, 251, 252, 5, 70, 0, 0, 252, 257, 3, 26, 13, 0, 253, 254, 5, 116, 0, 0, 254, 256, 3, 26, 13, 0, 255, 253, 1, 0, 0, 0, 256, 259, 1, 0, 0, 0, 257, 255, 1, 0, 0, 0, 257, 258, 1, 0, 0, 0, 258, 261, 1, 0, 0, 0, 259, 257, 1, 0, 0, 0, 260, 251, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 266, 5, 118, 0, 0, 263, 265, 3, 34, 17, 0, 264, 263, 1, 0, 0, 0, 265, 268, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 269, 1, 0, 0, 0, 268, 266, 1, 0, 0, 0, 269, 270, 5, 119, 0, 0, 270, 21, 1, 0, 0, 0, 271, 272, 5, 124, 0, 0, 272, 277, 3, 24, 12, 0, 273, 274, 5, 116, 0, 0, 274, 276, 3, 24, 12, 0, 275, 273, 1, 0, 0, 0, 276, 279, 1, 0, 0, 0, 277, 275, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 280, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 280, 281, 5, 125, 0, 0, 281, 23, 1, 0, 0, 0, 282, 283, 5, 30, 0, 0, 283, 286, 3, 136, 68, 0, 284, 285, 5, 114, 0, 0, 285, 287, 5, 20, 0, 0, 286, 284, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 302, 1, 0, 0, 0, 288, 289, 5, 19, 0, 0, 289, 299, 3, 136, 68, 0, 290, 291, 5, 21, 0, 0, 291, 296, 3, 26, 13, 0, 292, 293, 5, 126, 0, 0, 293, 295, 3, 26, 13, 0, 294, 292, 1, 0, 0, 0, 295, 298, 1, 0, 0, 0, 296, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 300, 1, 0, 0, 0, 298, 296, 1, 0, 0, 0, 299, 290, 1, 0, 0, 0, 299, 300, 1, 0, 0, 0, 300, 302, 1, 0, 0, 0, 301, 282, 1, 0, 0, 0, 301, 288, 1, 0, 0, 0, 302, 25, 1, 0, 0, 0, 303, 305, 3, 136, 68, 0, 304, 306, 3, 28, 14, 0, 305, 304, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 27, 1, 0, 0, 0, 307, 308, 5, 124, 0, 0, 308, 313, 3, 30, 15, 0, 309, 310, 5, 116, 0, 0, 310, 312, 3, 30, 15, 0, 311, 309, 1, 0, 0, 0, 312, 315, 1, 0, 0, 0, 313, 311, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 316, 1, 0, 0, 0, 315, 313, 1, 0, 0, 0, 316, 317, 5, 125, 0, 0, 317, 29, 1, 0, 0, 0, 318, 319, 5, 26, 0, 0, 319, 326, 3, 136, 68, 0, 320, 321, 5, 27, 0, 0, 321, 326, 3, 26, 13, 0, 322, 323, 5, 19, 0, 0, 323, 326, 3, 136, 68, 0, 324, 326, 3, 120, 60, 0, 325, 318, 1, 0, 0, 0, 325, 320, 1, 0, 0, 0, 325, 322, 1, 0, 0, 0, 325, 324, 1, 0, 0, 0, 326, 31, 1, 0, 0, 0, 327, 328, 5, 18, 0, 0, 328, 330, 3, 136, 68, 0, 329, 331, 3, 22, 11, 0, 330, 329, 1, 0, 0, 0, 330, 331, 1, 0, 0, 0, 331, 332, 1, 0, 0, 0, 332, 333, 5, 127, 0, 0, 333, 334, 3, 120, 60, 0, 334, 335, 5, 115, 0, 0, 335, 33, 1, 0, 0, 0, 336, 340, 3, 38, 19, 0, 337, 340, 3, 42, 21, 0, 338, 340, 3, 36, 18, 0, 339, 336, 1, 0, 0, 0, 339, 337, 1, 0, 0, 0, 339, 338, 1, 0, 0, 0, 340, 35, 1, 0, 0, 0, 341, 343, 5, 40, 0, 0, 342, 341, 1, 0, 0, 0, 342, 343, 1, 0, 0, 0, 343, 344, 1, 0, 0, 0, 344, 345, 5, 32, 0, 0, 345, 346, 3, 136, 68, 0, 346, 347, 5, 65, 0, 0, 347, 348, 3, 138, 69, 0, 348, 349, 5, 114, 0, 0, 349, 350, 3, 120, 60, 0, 350, 351, 5, 113, 0, 0, 351, 352, 3, 120, 60, 0, 352, 353, 5, 118, 0, 0, 353, 354, 5, 82, 0, 0, 354, 355, 5, 65, 0, 0, 355, 356, 3, 138, 69, 0, 356, 357, 5, 115, 0, 0, 357, 358, 5, 119, 0, 0, 358, 37, 1, 0, 0, 0, 359, 361, 3, 44, 22, 0, 360, 359, 1, 0, 0, 0, 360, 361, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 363, 5, 30, 0, 0, 363, 364, 3, 136, 68, 0, 364, 365, 5, 65, 0, 0, 365, 366, 3, 138, 69, 0, 366, 367, 5, 114, 0, 0, 367, 368, 3, 120, 60, 0, 368, 372, 5, 118, 0, 0, 369, 371, 3, 40, 20, 0, 370, 369, 1, 0, 0, 0, 371, 374, 1, 0, 0, 0, 372, 370, 1, 0, 0, 0, 372, 373, 1, 0, 0, 0, 373, 375, 1, 0, 0, 0, 374, 372, 1, 0, 0, 0, 375, 376, 5, 119, 0, 0, 376, 39, 1, 0, 0, 0, 377, 378, 5, 72, 0, 0, 378, 379, 5, 65, 0, 0, 379, 380, 3, 138, 69, 0, 380, 381, 5, 115, 0, 0, 381, 397, 1, 0, 0, 0, 382, 383, 5, 73, 0, 0, 383, 384, 5, 65, 0, 0, 384, 385, 3, 138, 69, 0, 385, 386, 5, 115, 0, 0, 386, 397, 1, 0, 0, 0, 387, 388, 5, 74, 0, 0, 388, 389, 5, 75, 0, 0, 389, 390, 5, 65, 0, 0, 390, 391, 3, 138, 69, 0, 391, 392, 5, 76, 0, 0, 392, 393, 5, 65, 0, 0, 393, 394, 3, 138, 69, 0, 394, 395, 5, 115, 0, 0, 395, 397, 1, 0, 0, 0, 396, 377, 1, 0, 0, 0, 396, 382, 1, 0, 0, 0, 396, 387, 1, 0, 0, 0, 397, 41, 1, 0, 0, 0, 398, 400, 3, 44, 22, 0, 399, 398, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 402, 5, 31, 0, 0, 402, 403, 3, 136, 68, 0, 403, 404, 5, 65, 0, 0, 404, 405, 3, 138, 69, 0, 405, 406, 5, 114, 0, 0, 406, 407, 3, 126, 63, 0, 407, 409, 3, 48, 24, 0, 408, 410, 5, 93, 0, 0, 409, 408, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 413, 1, 0, 0, 0, 411, 412, 5, 63, 0, 0, 412, 414, 3, 138, 69, 0, 413, 411, 1, 0, 0, 0, 413, 414, 1, 0, 0, 0, 414, 415, 1, 0, 0, 0, 415, 419, 5, 118, 0, 0, 416, 418, 3, 46, 23, 0, 417, 416, 1, 0, 0, 0, 418, 421, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 419, 1, 0, 0, 0, 422, 423, 5, 119, 0, 0, 423, 43, 1, 0, 0, 0, 424, 426, 5, 15, 0, 0, 425, 427, 5, 16, 0, 0, 426, 425, 1, 0, 0, 0, 426, 427, 1, 0, 0, 0, 427, 45, 1, 0, 0, 0, 428, 429, 5, 79, 0, 0, 429, 430, 5, 65, 0, 0, 430, 431, 3, 138, 69, 0, 431, 432, 5, 115, 0, 0, 432, 453, 1, 0, 0, 0, 433, 434, 5, 80, 0, 0, 434, 435, 5, 65, 0, 0, 435, 436, 3, 138, 69, 0, 436, 437, 5, 115, 0, 0, 437, 453, 1, 0, 0, 0, 438, 439, 5, 81, 0, 0, 439, 440, 5, 65, 0, 0, 440, 441, 3, 138, 69, 0, 441, 442, 5, 115, 0, 0, 442, 453, 1, 0, 0, 0, 443, 444, 5, 74, 0, 0, 444, 445, 5, 75, 0, 0, 445, 446, 5, 65, 0, 0, 446, 447, 3, 138, 69, 0, 447, 448, 5, 76, 0, 0, 448, 449, 5, 65, 0, 0, 449, 450, 3, 138, 69, 0, 450, 451, 5, 115, 0, 0, 451, 453, 1, 0, 0, 0, 452, 428, 1, 0, 0, 0, 452, 433, 1, 0, 0, 0, 452, 438, 1, 0, 0, 0, 452, 443, 1, 0, 0, 0, 453, 47, 1, 0, 0, 0, 454, 455, 5, 26, 0, 0, 455, 464, 3, 136, 68, 0, 456, 457, 5, 27, 0, 0, 457, 459, 3, 136, 68, 0, 458, 460, 3, 28, 14, 0, 459, 458, 1, 0, 0, 0, 459, 460, 1, 0, 0, 0, 460, 464, 1, 0, 0, 0, 461, 462, 5, 19, 0, 0, 462, 464, 3, 136, 68, 0, 463, 454, 1, 0, 0, 0, 463, 456, 1, 0, 0, 0, 463, 461, 1, 0, 0, 0, 464, 49, 1, 0, 0, 0, 465, 467, 3, 16, 8, 0, 466, 465, 1, 0, 0, 0, 467, 470, 1, 0, 0, 0, 468, 466, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 471, 1, 0, 0, 0, 470, 468, 1, 0, 0, 0, 471, 472, 5, 29, 0, 0, 472, 473, 3, 136, 68, 0, 473, 474, 5, 65, 0, 0, 474, 475, 3, 138, 69, 0, 475, 476, 5, 59, 0, 0, 476, 479, 3, 138, 69, 0, 477, 478, 5, 60, 0, 0, 478, 480, 5, 128, 0, 0, 479, 477, 1, 0, 0, 0, 479, 480, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 485, 5, 118, 0, 0, 482, 484, 3, 52, 26, 0, 483, 482, 1, 0, 0, 0, 484, 487, 1, 0, 0, 0, 485, 483, 1, 0, 0, 0, 485, 486, 1, 0, 0, 0, 486, 488, 1, 0, 0, 0, 487, 485, 1, 0, 0, 0, 488, 489, 5, 119, 0, 0, 489, 51, 1, 0, 0, 0, 490, 496, 3, 60, 30, 0, 491, 496, 3, 62, 31, 0, 492, 496, 3, 64, 32, 0, 493, 496, 3, 54, 27, 0, 494, 496, 3, 56, 28, 0, 495, 490, 1, 0, 0, 0, 495, 491, 1, 0, 0, 0, 495, 492, 1, 0, 0, 0, 495, 493, 1, 0, 0, 0, 495, 494, 1, 0, 0, 0, 496, 53, 1, 0, 0, 0, 497, 498, 5, 5, 0, 0, 498, 500, 3, 136, 68, 0, 499, 501, 3, 22, 11, 0, 500, 499, 1, 0, 0, 0, 500, 501, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 5, 65, 0, 0, 503, 504, 3, 138, 69, 0, 504, 506, 5, 8, 0, 0, 505, 507, 5, 1, 0, 0, 506, 505, 1, 0, 0, 0, 506, 507, 1, 0, 0, 0, 507, 508, 1, 0, 0, 0, 508, 509, 3, 26, 13, 0, 509, 510, 5, 9, 0, 0, 510, 511, 3, 138, 69, 0, 511, 512, 5, 32, 0, 0, 512, 513, 3, 138, 69, 0, 513, 517, 5, 118, 0, 0, 514, 516, 3, 58, 29, 0, 515, 514, 1, 0, 0, 0, 516, 519, 1, 0, 0, 0, 517, 515, 1, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 520, 1, 0, 0, 0, 519, 517, 1, 0, 0, 0, 520, 521, 5, 119, 0, 0, 521, 55, 1, 0, 0, 0, 522, 523, 5, 5, 0, 0, 523, 524, 3, 136, 68, 0, 524, 525, 5, 65, 0, 0, 525, 526, 3, 138, 69, 0, 526, 527, 5, 7, 0, 0, 527, 528, 3, 136, 68, 0, 528, 529, 3, 28, 14, 0, 529, 530, 5, 115, 0, 0, 530, 57, 1, 0, 0, 0, 531, 532, 5, 10, 0, 0, 532, 533, 3, 138, 69, 0, 533, 534, 5, 115, 0, 0, 534, 565, 1, 0, 0, 0, 535, 537, 5, 11, 0, 0, 536, 538, 5, 19, 0, 0, 537, 536, 1, 0, 0, 0, 537, 538, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 540, 3, 136, 68, 0, 540, 541, 5, 38, 0, 0, 541, 542, 3, 26, 13, 0, 542, 543, 5, 115, 0, 0, 543, 565, 1, 0, 0, 0, 544, 545, 5, 12, 0, 0, 545, 546, 3, 136, 68, 0, 546, 547, 5, 128, 0, 0, 547, 548, 5, 115, 0, 0, 548, 565, 1, 0, 0, 0, 549, 550, 5, 13, 0, 0, 550, 551, 3, 26, 13, 0, 551, 552, 5, 117, 0, 0, 552, 553, 3, 136, 68, 0, 553, 554, 3, 136, 68, 0, 554, 555, 3, 138, 69, 0, 555, 556, 5, 115, 0, 0, 556, 565, 1, 0, 0, 0, 557, 558, 5, 74, 0, 0, 558, 565, 5, 115, 0, 0, 559, 560, 5, 14, 0, 0, 560, 561, 5, 128, 0, 0, 561, 562, 3, 138, 69, 0, 562, 563, 5, 115, 0, 0, 563, 565, 1, 0, 0, 0, 564, 531, 1, 0, 0, 0, 564, 535, 1, 0, 0, 0, 564, 544, 1, 0, 0, 0, 564, 549, 1, 0, 0, 0, 564, 557, 1, 0, 0, 0, 564, 559, 1, 0, 0, 0, 565, 59, 1, 0, 0, 0, 566, 567, 5, 32, 0, 0, 567, 569, 3, 136, 68, 0, 568, 570, 3, 22, 11, 0, 569, 568, 1, 0, 0, 0, 569, 570, 1, 0, 0, 0, 570, 571, 1, 0, 0, 0, 571, 572, 5, 65, 0, 0, 572, 573, 3, 138, 69, 0, 573, 574, 5, 114, 0, 0, 574, 575, 3, 120, 60, 0, 575, 576, 5, 113, 0, 0, 576, 577, 3, 120, 60, 0, 577, 578, 5, 67, 0, 0, 578, 580, 3, 68, 34, 0, 579, 581, 3, 66, 33, 0, 580, 579, 1, 0, 0, 0, 580, 581, 1, 0, 0, 0, 581, 582, 1, 0, 0, 0, 582, 583, 5, 69, 0, 0, 583, 585, 3, 70, 35, 0, 584, 586, 3, 74, 37, 0, 585, 584, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 587, 1, 0, 0, 0, 587, 588, 5, 115, 0, 0, 588, 61, 1, 0, 0, 0, 589, 590, 5, 33, 0, 0, 590, 592, 3, 136, 68, 0, 591, 593, 3, 22, 11, 0, 592, 591, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 595, 5, 65, 0, 0, 595, 596, 3, 138, 69, 0, 596, 597, 5, 114, 0, 0, 597, 598, 3, 120, 60, 0, 598, 599, 5, 113, 0, 0, 599, 601, 3, 120, 60, 0, 600, 602, 3, 74, 37, 0, 601, 600, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 604, 5, 115, 0, 0, 604, 63, 1, 0, 0, 0, 605, 606, 5, 34, 0, 0, 606, 607, 3, 136, 68, 0, 607, 608, 5, 65, 0, 0, 608, 609, 3, 138, 69, 0, 609, 610, 5, 35, 0, 0, 610, 611, 3, 136, 68, 0, 611, 612, 5, 114, 0, 0, 612, 614, 3, 120, 60, 0, 613, 615, 3, 74, 37, 0, 614, 613, 1, 0, 0, 0, 614, 615, 1, 0, 0, 0, 615, 616, 1, 0, 0, 0, 616, 617, 5, 115, 0, 0, 617, 65, 1, 0, 0, 0, 618, 619, 5, 68, 0, 0, 619, 620, 3, 120, 60, 0, 620, 67, 1, 0, 0, 0, 621, 622, 7, 0, 0, 0, 622, 69, 1, 0, 0, 0, 623, 642, 5, 71, 0, 0, 624, 625, 5, 26, 0, 0, 625, 642, 3, 136, 68, 0, 626, 627, 5, 19, 0, 0, 627, 642, 3, 136, 68, 0, 628, 629, 5, 28, 0, 0, 629, 638, 5, 120, 0, 0, 630, 635, 3, 26, 13, 0, 631, 632, 5, 116, 0, 0, 632, 634, 3, 26, 13, 0, 633, 631, 1, 0, 0, 0, 634, 637, 1, 0, 0, 0, 635, 633, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 639, 1, 0, 0, 0, 637, 635, 1, 0, 0, 0, 638, 630, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 642, 5, 121, 0, 0, 641, 623, 1, 0, 0, 0, 641, 624, 1, 0, 0, 0, 641, 626, 1, 0, 0, 0, 641, 628, 1, 0, 0, 0, 642, 71, 1, 0, 0, 0, 643, 648, 3, 136, 68, 0, 644, 645, 5, 116, 0, 0, 645, 647, 3, 136, 68, 0, 646, 644, 1, 0, 0, 0, 647, 650, 1, 0, 0, 0, 648, 646, 1, 0, 0, 0, 648, 649, 1, 0, 0, 0, 649, 73, 1, 0, 0, 0, 650, 648, 1, 0, 0, 0, 651, 652, 5, 70, 0, 0, 652, 656, 5, 118, 0, 0, 653, 655, 3, 76, 38, 0, 654, 653, 1, 0, 0, 0, 655, 658, 1, 0, 0, 0, 656, 654, 1, 0, 0, 0, 656, 657, 1, 0, 0, 0, 657, 659, 1, 0, 0, 0, 658, 656, 1, 0, 0, 0, 659, 660, 5, 119, 0, 0, 660, 75, 1, 0, 0, 0, 661, 662, 5, 6, 0, 0, 662, 663, 3, 136, 68, 0, 663, 664, 5, 65, 0, 0, 664, 665, 3, 138, 69, 0, 665, 666, 5, 120, 0, 0, 666, 667, 3, 72, 36, 0, 667, 668, 5, 121, 0, 0, 668, 669, 5, 115, 0, 0, 669, 723, 1, 0, 0, 0, 670, 671, 5, 44, 0, 0, 671, 672, 3, 136, 68, 0, 672, 673, 5, 65, 0, 0, 673, 674, 3, 138, 69, 0, 674, 675, 5, 114, 0, 0, 675, 676, 3, 120, 60, 0, 676, 677, 3, 78, 39, 0, 677, 678, 5, 115, 0, 0, 678, 723, 1, 0, 0, 0, 679, 680, 5, 45, 0, 0, 680, 681, 3, 136, 68, 0, 681, 682, 5, 65, 0, 0, 682, 683, 3, 138, 69, 0, 683, 684, 5, 114, 0, 0, 684, 685, 3, 126, 63, 0, 685, 686, 3, 48, 24, 0, 686, 687, 3, 78, 39, 0, 687, 688, 5, 115, 0, 0, 688, 723, 1, 0, 0, 0, 689, 690, 5, 27, 0, 0, 690, 691, 3, 136, 68, 0, 691, 692, 5, 65, 0, 0, 692, 693, 3, 138, 69, 0, 693, 694, 5, 114, 0, 0, 694, 696, 3, 136, 68, 0, 695, 697, 3, 28, 14, 0, 696, 695, 1, 0, 0, 0, 696, 697, 1, 0, 0, 0, 697, 698, 1, 0, 0, 0, 698, 699, 5, 115, 0, 0, 699, 723, 1, 0, 0, 0, 700, 701, 5, 34, 0, 0, 701, 702, 3, 136, 68, 0, 702, 703, 5, 65, 0, 0, 703, 704, 3, 138, 69, 0, 704, 705, 5, 114, 0, 0, 705, 708, 3, 136, 68, 0, 706, 707, 5, 36, 0, 0, 707, 709, 3, 120, 60, 0, 708, 706, 1, 0, 0, 0, 708, 709, 1, 0, 0, 0, 709, 710, 1, 0, 0, 0, 710, 711, 5, 115, 0, 0, 711, 723, 1, 0, 0, 0, 712, 713, 5, 5, 0, 0, 713, 714, 3, 136, 68, 0, 714, 715, 5, 65, 0, 0, 715, 716, 3, 138, 69, 0, 716, 717, 5, 114, 0, 0, 717, 718, 3, 136, 68, 0, 718, 719, 5, 117, 0, 0, 719, 720, 3, 136, 68, 0, 720, 721, 5, 115, 0, 0, 721, 723, 1, 0, 0, 0, 722, 661, 1, 0, 0, 0, 722, 670, 1, 0, 0, 0, 722, 679, 1, 0, 0, 0, 722, 689, 1, 0, 0, 0, 722, 700, 1, 0, 0, 0, 722, 712, 1, 0, 0, 0, 723, 77, 1, 0, 0, 0, 724, 725, 5, 120, 0, 0, 725, 730, 3, 80, 40, 0, 726, 727, 5, 116, 0, 0, 727, 729, 3, 80, 40, 0, 728, 726, 1, 0, 0, 0, 729, 732, 1, 0, 0, 0, 730, 728, 1, 0, 0, 0, 730, 731, 1, 0, 0, 0, 731, 733, 1, 0, 0, 0, 732, 730, 1, 0, 0, 0, 733, 734, 5, 121, 0, 0, 734, 79, 1, 0, 0, 0, 735, 736, 7, 1, 0, 0, 736, 81, 1, 0, 0, 0, 737, 738, 5, 43, 0, 0, 738, 739, 3, 84, 42, 0, 739, 83, 1, 0, 0, 0, 740, 743, 3, 86, 43, 0, 741, 743, 3, 90, 45, 0, 742, 740, 1, 0, 0, 0, 742, 741, 1, 0, 0, 0, 743, 85, 1, 0, 0, 0, 744, 745, 5, 44, 0, 0, 745, 746, 3, 136, 68, 0, 746, 747, 5, 65, 0, 0, 747, 748, 3, 138, 69, 0, 748, 749, 5, 53, 0, 0, 749, 750, 3, 136, 68, 0, 750, 751, 5, 114, 0, 0, 751, 752, 3, 120, 60, 0, 752, 753, 5, 54, 0, 0, 753, 756, 3, 88, 44, 0, 754, 755, 5, 55, 0, 0, 755, 757, 3, 128, 64, 0, 756, 754, 1, 0, 0, 0, 756, 757, 1, 0, 0, 0, 757, 758, 1, 0, 0, 0, 758, 759, 5, 115, 0, 0, 759, 87, 1, 0, 0, 0, 760, 767, 5, 87, 0, 0, 761, 762, 5, 88, 0, 0, 762, 763, 5, 122, 0, 0, 763, 764, 3, 120, 60, 0, 764, 765, 5, 123, 0, 0, 765, 767, 1, 0, 0, 0, 766, 760, 1, 0, 0, 0, 766, 761, 1, 0, 0, 0, 767, 89, 1, 0, 0, 0, 768, 769, 5, 45, 0, 0, 769, 770, 3, 136, 68, 0, 770, 771, 5, 65, 0, 0, 771, 772, 3, 138, 69, 0, 772, 773, 5, 118, 0, 0, 773, 774, 3, 92, 46, 0, 774, 775, 3, 92, 46, 0, 775, 776, 5, 119, 0, 0, 776, 91, 1, 0, 0, 0, 777, 778, 3, 48, 24, 0, 778, 779, 5, 46, 0, 0, 779, 780, 3, 136, 68, 0, 780, 781, 5, 65, 0, 0, 781, 782, 3, 138, 69, 0, 782, 784, 3, 126, 63, 0, 783, 785, 5, 93, 0, 0, 784, 783, 1, 0, 0, 0, 784, 785, 1, 0, 0, 0, 785, 788, 1, 0, 0, 0, 786, 787, 5, 61, 0, 0, 787, 789, 3, 138, 69, 0, 788, 786, 1, 0, 0, 0, 788, 789, 1, 0, 0, 0, 789, 791, 1, 0, 0, 0, 790, 792, 5, 62, 0, 0, 791, 790, 1, 0, 0, 0, 791, 792, 1, 0, 0, 0, 792, 795, 1, 0, 0, 0, 793, 794, 5, 63, 0, 0, 794, 796, 3, 138, 69, 0, 795, 793, 1, 0, 0, 0, 795, 796, 1, 0, 0, 0, 796, 798, 1, 0, 0, 0, 797, 799, 5, 64, 0, 0, 798, 797, 1, 0, 0, 0, 798, 799, 1, 0, 0, 0, 799, 800, 1, 0, 0, 0, 800, 801, 5, 115, 0, 0, 801, 93, 1, 0, 0, 0, 802, 803, 5, 37, 0, 0, 803, 804, 3, 136, 68, 0, 804, 805, 5, 38, 0, 0, 805, 807, 3, 136, 68, 0, 806, 808, 3, 28, 14, 0, 807, 806, 1, 0, 0, 0, 807, 808, 1, 0, 0, 0, 808, 811, 1, 0, 0, 0, 809, 810, 5, 65, 0, 0, 810, 812, 3, 138, 69, 0, 811, 809, 1, 0, 0, 0, 811, 812, 1, 0, 0, 0, 812, 815, 1, 0, 0, 0, 813, 814, 5, 60, 0, 0, 814, 816, 5, 128, 0, 0, 815, 813, 1, 0, 0, 0, 815, 816, 1, 0, 0, 0, 816, 817, 1, 0, 0, 0, 817, 821, 5, 118, 0, 0, 818, 820, 3, 96, 48, 0, 819, 818, 1, 0, 0, 0, 820, 823, 1, 0, 0, 0, 821, 819, 1, 0, 0, 0, 821, 822, 1, 0, 0, 0, 822, 824, 1, 0, 0, 0, 823, 821, 1, 0, 0, 0, 824, 825, 5, 119, 0, 0, 825, 95, 1, 0, 0, 0, 826, 827, 5, 42, 0, 0, 827, 832, 3, 84, 42, 0, 828, 832, 3, 102, 51, 0, 829, 832, 3, 98, 49, 0, 830, 832, 3, 100, 50, 0, 831, 826, 1, 0, 0, 0, 831, 828, 1, 0, 0, 0, 831, 829, 1, 0, 0, 0, 831, 830, 1, 0, 0, 0, 832, 97, 1, 0, 0, 0, 833, 834, 5, 39, 0, 0, 834, 835, 3, 136, 68, 0, 835, 836, 5, 41, 0, 0, 836, 837, 5, 44, 0, 0, 837, 838, 3, 136, 68, 0, 838, 839, 5, 115, 0, 0, 839, 99, 1, 0, 0, 0, 840, 841, 5, 50, 0, 0, 841, 842, 3, 136, 68, 0, 842, 843, 5, 51, 0, 0, 843, 844, 5, 52, 0, 0, 844, 845, 5, 48, 0, 0, 845, 846, 5, 34, 0, 0, 846, 847, 3, 136, 68, 0, 847, 848, 5, 49, 0, 0, 848, 849, 5, 45, 0, 0, 849, 850, 3, 136, 68, 0, 850, 851, 5, 117, 0, 0, 851, 852, 3, 136, 68, 0, 852, 853, 5, 115, 0, 0, 853, 101, 1, 0, 0, 0, 854, 855, 5, 39, 0, 0, 855, 856, 3, 104, 52, 0, 856, 857, 5, 41, 0, 0, 857, 860, 3, 108, 54, 0, 858, 859, 5, 17, 0, 0, 859, 861, 3, 138, 69, 0, 860, 858, 1, 0, 0, 0, 860, 861, 1, 0, 0, 0, 861, 862, 1, 0, 0, 0, 862, 863, 5, 115, 0, 0, 863, 103, 1, 0, 0, 0, 864, 865, 3, 136, 68, 0, 865, 866, 5, 117, 0, 0, 866, 867, 3, 106, 53, 0, 867, 105, 1, 0, 0, 0, 868, 880, 3, 136, 68, 0, 869, 880, 5, 82, 0, 0, 870, 880, 5, 72, 0, 0, 871, 880, 5, 73, 0, 0, 872, 880, 5, 79, 0, 0, 873, 880, 5, 80, 0, 0, 874, 880, 5, 81, 0, 0, 875, 880, 5, 83, 0, 0, 876, 880, 5, 84, 0, 0, 877, 880, 5, 85, 0, 0, 878, 880, 5, 86, 0, 0, 879, 868, 1, 0, 0, 0, 879, 869, 1, 0, 0, 0, 879, 870, 1, 0, 0, 0, 879, 871, 1, 0, 0, 0, 879, 872, 1, 0, 0, 0, 879, 873, 1, 0, 0, 0, 879, 874, 1, 0, 0, 0, 879, 875, 1, 0, 0, 0, 879, 876, 1, 0, 0, 0, 879, 877, 1, 0, 0, 0, 879, 878, 1, 0, 0, 0, 880, 107, 1, 0, 0, 0, 881, 882, 5, 44, 0, 0, 882, 883, 3, 136, 68, 0, 883, 884, 5, 117, 0, 0, 884, 885, 3, 110, 55, 0, 885, 912, 1, 0, 0, 0, 886, 887, 5, 45, 0, 0, 887, 888, 3, 136, 68, 0, 888, 889, 5, 117, 0, 0, 889, 890, 3, 136, 68, 0, 890, 891, 5, 117, 0, 0, 891, 892, 3, 112, 56, 0, 892, 912, 1, 0, 0, 0, 893, 894, 5, 27, 0, 0, 894, 896, 3, 136, 68, 0, 895, 897, 3, 28, 14, 0, 896, 895, 1, 0, 0, 0, 896, 897, 1, 0, 0, 0, 897, 898, 1, 0, 0, 0, 898, 899, 5, 117, 0, 0, 899, 900, 3, 104, 52, 0, 900, 912, 1, 0, 0, 0, 901, 902, 5, 29, 0, 0, 902, 903, 3, 136, 68, 0, 903, 904, 5, 117, 0, 0, 904, 906, 3, 136, 68, 0, 905, 907, 3, 28, 14, 0, 906, 905, 1, 0, 0, 0, 906, 907, 1, 0, 0, 0, 907, 909, 1, 0, 0, 0, 908, 910, 3, 114, 57, 0, 909, 908, 1, 0, 0, 0, 909, 910, 1, 0, 0, 0, 910, 912, 1, 0, 0, 0, 911, 881, 1, 0, 0, 0, 911, 886, 1, 0, 0, 0, 911, 893, 1, 0, 0, 0, 911, 901, 1, 0, 0, 0, 912, 109, 1, 0, 0, 0, 913, 914, 7, 2, 0, 0, 914, 111, 1, 0, 0, 0, 915, 916, 7, 3, 0, 0, 916, 113, 1, 0, 0, 0, 917, 918, 5, 47, 0, 0, 918, 922, 5, 118, 0, 0, 919, 921, 3, 116, 58, 0, 920, 919, 1, 0, 0, 0, 921, 924, 1, 0, 0, 0, 922, 920, 1, 0, 0, 0, 922, 923, 1, 0, 0, 0, 923, 925, 1, 0, 0, 0, 924, 922, 1, 0, 0, 0, 925, 926, 5, 119, 0, 0, 926, 115, 1, 0, 0, 0, 927, 928, 3, 136, 68, 0, 928, 929, 5, 41, 0, 0, 929, 930, 5, 1, 0, 0, 930, 931, 5, 6, 0, 0, 931, 932, 5, 120, 0, 0, 932, 933, 3, 72, 36, 0, 933, 934, 5, 121, 0, 0, 934, 935, 5, 115, 0, 0, 935, 1009, 1, 0, 0, 0, 936, 937, 3, 136, 68, 0, 937, 938, 5, 41, 0, 0, 938, 939, 5, 44, 0, 0, 939, 946, 3, 136, 68, 0, 940, 941, 5, 49, 0, 0, 941, 942, 5, 45, 0, 0, 942, 943, 3, 136, 68, 0, 943, 944, 5, 117, 0, 0, 944, 945, 3, 136, 68, 0, 945, 947, 1, 0, 0, 0, 946, 940, 1, 0, 0, 0, 946, 947, 1, 0, 0, 0, 947, 948, 1, 0, 0, 0, 948, 949, 5, 115, 0, 0, 949, 1009, 1, 0, 0, 0, 950, 951, 3, 136, 68, 0, 951, 952, 5, 41, 0, 0, 952, 953, 5, 45, 0, 0, 953, 954, 3, 136, 68, 0, 954, 955, 5, 117, 0, 0, 955, 962, 3, 136, 68, 0, 956, 957, 5, 49, 0, 0, 957, 958, 5, 45, 0, 0, 958, 959, 3, 136, 68, 0, 959, 960, 5, 117, 0, 0, 960, 961, 3, 136, 68, 0, 961, 963, 1, 0, 0, 0, 962, 956, 1, 0, 0, 0, 962, 963, 1, 0, 0, 0, 963, 964, 1, 0, 0, 0, 964, 965, 5, 115, 0, 0, 965, 1009, 1, 0, 0, 0, 966, 967, 3, 136, 68, 0, 967, 968, 5, 41, 0, 0, 968, 969, 5, 27, 0, 0, 969, 971, 3, 136, 68, 0, 970, 972, 3, 28, 14, 0, 971, 970, 1, 0, 0, 0, 971, 972, 1, 0, 0, 0, 972, 979, 1, 0, 0, 0, 973, 974, 5, 49, 0, 0, 974, 975, 5, 45, 0, 0, 975, 976, 3, 136, 68, 0, 976, 977, 5, 117, 0, 0, 977, 978, 3, 136, 68, 0, 978, 980, 1, 0, 0, 0, 979, 973, 1, 0, 0, 0, 979, 980, 1, 0, 0, 0, 980, 981, 1, 0, 0, 0, 981, 982, 5, 115, 0, 0, 982, 1009, 1, 0, 0, 0, 983, 984, 3, 136, 68, 0, 984, 985, 5, 41, 0, 0, 985, 986, 5, 34, 0, 0, 986, 987, 3, 136, 68, 0, 987, 988, 5, 115, 0, 0, 988, 1009, 1, 0, 0, 0, 989, 990, 3, 136, 68, 0, 990, 992, 5, 41, 0, 0, 991, 993, 5, 1, 0, 0, 992, 991, 1, 0, 0, 0, 992, 993, 1, 0, 0, 0, 993, 994, 1, 0, 0, 0, 994, 995, 5, 5, 0, 0, 995, 996, 3, 136, 68, 0, 996, 997, 5, 117, 0, 0, 997, 1004, 3, 136, 68, 0, 998, 999, 5, 49, 0, 0, 999, 1000, 5, 45, 0, 0, 1000, 1001, 3, 136, 68, 0, 1001, 1002, 5, 117, 0, 0, 1002, 1003, 3, 136, 68, 0, 1003, 1005, 1, 0, 0, 0, 1004, 998, 1, 0, 0, 0, 1004, 1005, 1, 0, 0, 0, 1005, 1006, 1, 0, 0, 0, 1006, 1007, 5, 115, 0, 0, 1007, 1009, 1, 0, 0, 0, 1008, 927, 1, 0, 0, 0, 1008, 936, 1, 0, 0, 0, 1008, 950, 1, 0, 0, 0, 1008, 966, 1, 0, 0, 0, 1008, 983, 1, 0, 0, 0, 1008, 989, 1, 0, 0, 0, 1009, 117, 1, 0, 0, 0, 1010, 1011, 5, 34, 0, 0, 1011, 1012, 3, 136, 68, 0, 1012, 1013, 5, 41, 0, 0, 1013, 1014, 3, 136, 68, 0, 1014, 1015, 5, 117, 0, 0, 1015, 1017, 3, 136, 68, 0, 1016, 1018, 3, 114, 57, 0, 1017, 1016, 1, 0, 0, 0, 1017, 1018, 1, 0, 0, 0, 1018, 1019, 1, 0, 0, 0, 1019, 1020, 5, 115, 0, 0, 1020, 119, 1, 0, 0, 0, 1021, 1068, 3, 124, 62, 0, 1022, 1068, 5, 94, 0, 0, 1023, 1068, 5, 95, 0, 0, 1024, 1025, 5, 96, 0, 0, 1025, 1068, 3, 138, 69, 0, 1026, 1027, 5, 97, 0, 0, 1027, 1028, 5, 124, 0, 0, 1028, 1029, 3, 136, 68, 0, 1029, 1030, 5, 125, 0, 0, 1030, 1068, 1, 0, 0, 0, 1031, 1032, 5, 98, 0, 0, 1032, 1033, 5, 124, 0, 0, 1033, 1035, 3, 136, 68, 0, 1034, 1036, 3, 28, 14, 0, 1035, 1034, 1, 0, 0, 0, 1035, 1036, 1, 0, 0, 0, 1036, 1037, 1, 0, 0, 0, 1037, 1038, 5, 125, 0, 0, 1038, 1068, 1, 0, 0, 0, 1039, 1040, 5, 22, 0, 0, 1040, 1041, 5, 124, 0, 0, 1041, 1042, 3, 136, 68, 0, 1042, 1043, 5, 125, 0, 0, 1043, 1068, 1, 0, 0, 0, 1044, 1045, 5, 99, 0, 0, 1045, 1046, 5, 124, 0, 0, 1046, 1047, 3, 120, 60, 0, 1047, 1048, 5, 125, 0, 0, 1048, 1068, 1, 0, 0, 0, 1049, 1050, 5, 100, 0, 0, 1050, 1051, 5, 124, 0, 0, 1051, 1052, 3, 120, 60, 0, 1052, 1053, 5, 125, 0, 0, 1053, 1068, 1, 0, 0, 0, 1054, 1055, 5, 101, 0, 0, 1055, 1059, 5, 118, 0, 0, 1056, 1058, 3, 122, 61, 0, 1057, 1056, 1, 0, 0, 0, 1058, 1061, 1, 0, 0, 0, 1059, 1057, 1, 0, 0, 0, 1059, 1060, 1, 0, 0, 0, 1060, 1062, 1, 0, 0, 0, 1061, 1059, 1, 0, 0, 0, 1062, 1068, 5, 119, 0, 0, 1063, 1065, 3, 136, 68, 0, 1064, 1066, 3, 28, 14, 0, 1065, 1064, 1, 0, 0, 0, 1065, 1066, 1, 0, 0, 0, 1066, 1068, 1, 0, 0, 0, 1067, 1021, 1, 0, 0, 0, 1067, 1022, 1, 0, 0, 0, 1067, 1023, 1, 0, 0, 0, 1067, 1024, 1, 0, 0, 0, 1067, 1026, 1, 0, 0, 0, 1067, 1031, 1, 0, 0, 0, 1067, 1039, 1, 0, 0, 0, 1067, 1044, 1, 0, 0, 0, 1067, 1049, 1, 0, 0, 0, 1067, 1054, 1, 0, 0, 0, 1067, 1063, 1, 0, 0, 0, 1068, 121, 1, 0, 0, 0, 1069, 1070, 3, 136, 68, 0, 1070, 1071, 5, 114, 0, 0, 1071, 1072, 3, 120, 60, 0, 1072, 1073, 5, 115, 0, 0, 1073, 123, 1, 0, 0, 0, 1074, 1075, 7, 4, 0, 0, 1075, 125, 1, 0, 0, 0, 1076, 1077, 7, 5, 0, 0, 1077, 127, 1, 0, 0, 0, 1078, 1087, 3, 138, 69, 0, 1079, 1087, 5, 128, 0, 0, 1080, 1087, 5, 129, 0, 0, 1081, 1087, 5, 110, 0, 0, 1082, 1087, 5, 111, 0, 0, 1083, 1087, 5, 112, 0, 0, 1084, 1087, 3, 130, 65, 0, 1085, 1087, 3, 134, 67, 0, 1086, 1078, 1, 0, 0, 0, 1086, 1079, 1, 0, 0, 0, 1086, 1080, 1, 0, 0, 0, 1086, 1081, 1, 0, 0, 0, 1086, 1082, 1, 0, 0, 0, 1086, 1083, 1, 0, 0, 0, 1086, 1084, 1, 0, 0, 0, 1086, 1085, 1, 0, 0, 0, 1087, 129, 1, 0, 0, 0, 1088, 1097, 5, 118, 0, 0, 1089, 1094, 3, 132, 66, 0, 1090, 1091, 5, 116, 0, 0, 1091, 1093, 3, 132, 66, 0, 1092, 1090, 1, 0, 0, 0, 1093, 1096, 1, 0, 0, 0, 1094, 1092, 1, 0, 0, 0, 1094, 1095, 1, 0, 0, 0, 1095, 1098, 1, 0, 0, 0, 1096, 1094, 1, 0, 0, 0, 1097, 1089, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1099, 1, 0, 0, 0, 1099, 1100, 5, 119, 0, 0, 1100, 131, 1, 0, 0, 0, 1101, 1102, 3, 138, 69, 0, 1102, 1103, 5, 114, 0, 0, 1103, 1104, 3, 128, 64, 0, 1104, 133, 1, 0, 0, 0, 1105, 1114, 5, 120, 0, 0, 1106, 1111, 3, 128, 64, 0, 1107, 1108, 5, 116, 0, 0, 1108, 1110, 3, 128, 64, 0, 1109, 1107, 1, 0, 0, 0, 1110, 1113, 1, 0, 0, 0, 1111, 1109, 1, 0, 0, 0, 1111, 1112, 1, 0, 0, 0, 1112, 1115, 1, 0, 0, 0, 1113, 1111, 1, 0, 0, 0, 1114, 1106, 1, 0, 0, 0, 1114, 1115, 1, 0, 0, 0, 1115, 1116, 1, 0, 0, 0, 1116, 1117, 5, 121, 0, 0, 1117, 135, 1, 0, 0, 0, 1118, 1119, 7, 6, 0, 0, 1119, 137, 1, 0, 0, 0, 1120, 1121, 5, 131, 0, 0, 1121, 139, 1, 0, 0, 0, 95, 152, 159, 180, 192, 204, 224, 232, 239, 245, 257, 260, 266, 277, 286, 296, 299, 301, 305, 313, 325, 330, 339, 342, 360, 372, 396, 399, 409, 413, 419, 426, 452, 459, 463, 468, 479, 485, 495, 500, 506, 517, 537, 564, 569, 580, 585, 592, 601, 614, 635, 638, 641, 648, 656, 696, 708, 722, 730, 742, 756, 766, 784, 788, 791, 795, 798, 807, 811, 815, 821, 831, 860, 879, 896, 906, 909, 911, 922, 946, 962, 971, 979, 992, 1004, 1008, 1017, 1035, 1059, 1065, 1067, 1086, 1094, 1097, 1111, 1114] \ No newline at end of file +[4, 1, 143, 1184, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 157, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 162, 8, 1, 10, 1, 12, 1, 165, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 183, 8, 3, 10, 3, 12, 3, 186, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 197, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 209, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 229, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 237, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 242, 8, 10, 10, 10, 12, 10, 245, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 250, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 260, 8, 10, 10, 10, 12, 10, 263, 9, 10, 3, 10, 265, 8, 10, 1, 10, 1, 10, 5, 10, 269, 8, 10, 10, 10, 12, 10, 272, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 280, 8, 11, 10, 11, 12, 11, 283, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 291, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 299, 8, 12, 10, 12, 12, 12, 302, 9, 12, 3, 12, 304, 8, 12, 3, 12, 306, 8, 12, 1, 13, 1, 13, 3, 13, 310, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 316, 8, 14, 10, 14, 12, 14, 319, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 330, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 335, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 344, 8, 17, 1, 18, 3, 18, 347, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 362, 8, 18, 1, 18, 1, 18, 1, 18, 1, 19, 3, 19, 368, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 378, 8, 19, 10, 19, 12, 19, 381, 9, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 389, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 397, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 410, 8, 20, 1, 21, 3, 21, 413, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 423, 8, 21, 1, 21, 1, 21, 3, 21, 427, 8, 21, 1, 21, 1, 21, 5, 21, 431, 8, 21, 10, 21, 12, 21, 434, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 440, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 446, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 454, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 462, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 475, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 482, 8, 24, 1, 24, 1, 24, 3, 24, 486, 8, 24, 1, 25, 5, 25, 489, 8, 25, 10, 25, 12, 25, 492, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 502, 8, 25, 1, 25, 1, 25, 5, 25, 506, 8, 25, 10, 25, 12, 25, 509, 9, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 518, 8, 26, 1, 27, 1, 27, 1, 27, 3, 27, 523, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 529, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 538, 8, 27, 10, 27, 12, 27, 541, 9, 27, 1, 27, 1, 27, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 567, 8, 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, 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, 3, 29, 594, 8, 29, 1, 30, 1, 30, 1, 30, 3, 30, 599, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 610, 8, 30, 1, 30, 3, 30, 613, 8, 30, 1, 30, 1, 30, 1, 30, 3, 30, 618, 8, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 3, 31, 625, 8, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 634, 8, 31, 1, 31, 3, 31, 637, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 650, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 5, 33, 657, 8, 33, 10, 33, 12, 33, 660, 9, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 673, 8, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 5, 37, 692, 8, 37, 10, 37, 12, 37, 695, 9, 37, 3, 37, 697, 8, 37, 1, 37, 3, 37, 700, 8, 37, 1, 38, 1, 38, 1, 38, 5, 38, 705, 8, 38, 10, 38, 12, 38, 708, 9, 38, 1, 39, 1, 39, 1, 39, 5, 39, 713, 8, 39, 10, 39, 12, 39, 716, 9, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 755, 8, 40, 1, 40, 3, 40, 758, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 770, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 784, 8, 40, 1, 41, 1, 41, 1, 41, 1, 41, 5, 41, 790, 8, 41, 10, 41, 12, 41, 793, 9, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 3, 44, 804, 8, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 818, 8, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 828, 8, 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, 48, 1, 48, 1, 48, 1, 48, 3, 48, 846, 8, 48, 1, 48, 1, 48, 3, 48, 850, 8, 48, 1, 48, 3, 48, 853, 8, 48, 1, 48, 1, 48, 3, 48, 857, 8, 48, 1, 48, 3, 48, 860, 8, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 869, 8, 49, 1, 49, 1, 49, 3, 49, 873, 8, 49, 1, 49, 1, 49, 3, 49, 877, 8, 49, 1, 49, 1, 49, 5, 49, 881, 8, 49, 10, 49, 12, 49, 884, 9, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 893, 8, 50, 1, 51, 1, 51, 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, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 922, 8, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 3, 55, 941, 8, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 958, 8, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 968, 8, 56, 1, 56, 3, 56, 971, 8, 56, 3, 56, 973, 8, 56, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 5, 59, 982, 8, 59, 10, 59, 12, 59, 985, 9, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1008, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1024, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1033, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1041, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1054, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1066, 8, 60, 1, 60, 1, 60, 3, 60, 1070, 8, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 1079, 8, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 3, 62, 1097, 8, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 5, 62, 1119, 8, 62, 10, 62, 12, 62, 1122, 9, 62, 1, 62, 1, 62, 1, 62, 3, 62, 1127, 8, 62, 3, 62, 1129, 8, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1148, 8, 66, 1, 67, 1, 67, 1, 67, 1, 67, 5, 67, 1154, 8, 67, 10, 67, 12, 67, 1157, 9, 67, 3, 67, 1159, 8, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 5, 69, 1171, 8, 69, 10, 69, 12, 69, 1174, 9, 69, 3, 69, 1176, 8, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 0, 0, 72, 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, 0, 9, 2, 0, 7, 7, 25, 25, 1, 0, 3, 4, 1, 0, 91, 95, 2, 0, 86, 90, 92, 93, 2, 0, 86, 87, 92, 93, 2, 0, 88, 90, 92, 93, 1, 0, 111, 118, 1, 0, 98, 101, 4, 0, 11, 25, 37, 37, 65, 65, 139, 139, 1280, 0, 156, 1, 0, 0, 0, 2, 158, 1, 0, 0, 0, 4, 168, 1, 0, 0, 0, 6, 172, 1, 0, 0, 0, 8, 196, 1, 0, 0, 0, 10, 208, 1, 0, 0, 0, 12, 210, 1, 0, 0, 0, 14, 217, 1, 0, 0, 0, 16, 228, 1, 0, 0, 0, 18, 230, 1, 0, 0, 0, 20, 243, 1, 0, 0, 0, 22, 275, 1, 0, 0, 0, 24, 305, 1, 0, 0, 0, 26, 307, 1, 0, 0, 0, 28, 311, 1, 0, 0, 0, 30, 329, 1, 0, 0, 0, 32, 331, 1, 0, 0, 0, 34, 343, 1, 0, 0, 0, 36, 346, 1, 0, 0, 0, 38, 367, 1, 0, 0, 0, 40, 409, 1, 0, 0, 0, 42, 412, 1, 0, 0, 0, 44, 437, 1, 0, 0, 0, 46, 474, 1, 0, 0, 0, 48, 485, 1, 0, 0, 0, 50, 490, 1, 0, 0, 0, 52, 517, 1, 0, 0, 0, 54, 519, 1, 0, 0, 0, 56, 544, 1, 0, 0, 0, 58, 593, 1, 0, 0, 0, 60, 595, 1, 0, 0, 0, 62, 621, 1, 0, 0, 0, 64, 649, 1, 0, 0, 0, 66, 651, 1, 0, 0, 0, 68, 663, 1, 0, 0, 0, 70, 676, 1, 0, 0, 0, 72, 679, 1, 0, 0, 0, 74, 699, 1, 0, 0, 0, 76, 701, 1, 0, 0, 0, 78, 709, 1, 0, 0, 0, 80, 783, 1, 0, 0, 0, 82, 785, 1, 0, 0, 0, 84, 796, 1, 0, 0, 0, 86, 798, 1, 0, 0, 0, 88, 803, 1, 0, 0, 0, 90, 805, 1, 0, 0, 0, 92, 827, 1, 0, 0, 0, 94, 829, 1, 0, 0, 0, 96, 838, 1, 0, 0, 0, 98, 863, 1, 0, 0, 0, 100, 892, 1, 0, 0, 0, 102, 894, 1, 0, 0, 0, 104, 901, 1, 0, 0, 0, 106, 915, 1, 0, 0, 0, 108, 925, 1, 0, 0, 0, 110, 940, 1, 0, 0, 0, 112, 972, 1, 0, 0, 0, 114, 974, 1, 0, 0, 0, 116, 976, 1, 0, 0, 0, 118, 978, 1, 0, 0, 0, 120, 1069, 1, 0, 0, 0, 122, 1071, 1, 0, 0, 0, 124, 1128, 1, 0, 0, 0, 126, 1130, 1, 0, 0, 0, 128, 1135, 1, 0, 0, 0, 130, 1137, 1, 0, 0, 0, 132, 1147, 1, 0, 0, 0, 134, 1149, 1, 0, 0, 0, 136, 1162, 1, 0, 0, 0, 138, 1166, 1, 0, 0, 0, 140, 1179, 1, 0, 0, 0, 142, 1181, 1, 0, 0, 0, 144, 145, 3, 6, 3, 0, 145, 146, 5, 0, 0, 1, 146, 157, 1, 0, 0, 0, 147, 148, 3, 20, 10, 0, 148, 149, 5, 0, 0, 1, 149, 157, 1, 0, 0, 0, 150, 151, 3, 50, 25, 0, 151, 152, 5, 0, 0, 1, 152, 157, 1, 0, 0, 0, 153, 154, 3, 2, 1, 0, 154, 155, 5, 0, 0, 1, 155, 157, 1, 0, 0, 0, 156, 144, 1, 0, 0, 0, 156, 147, 1, 0, 0, 0, 156, 150, 1, 0, 0, 0, 156, 153, 1, 0, 0, 0, 157, 1, 1, 0, 0, 0, 158, 159, 5, 32, 0, 0, 159, 163, 5, 127, 0, 0, 160, 162, 3, 8, 4, 0, 161, 160, 1, 0, 0, 0, 162, 165, 1, 0, 0, 0, 163, 161, 1, 0, 0, 0, 163, 164, 1, 0, 0, 0, 164, 166, 1, 0, 0, 0, 165, 163, 1, 0, 0, 0, 166, 167, 5, 128, 0, 0, 167, 3, 1, 0, 0, 0, 168, 169, 5, 33, 0, 0, 169, 170, 3, 142, 71, 0, 170, 171, 5, 124, 0, 0, 171, 5, 1, 0, 0, 0, 172, 173, 5, 1, 0, 0, 173, 174, 3, 140, 70, 0, 174, 175, 5, 74, 0, 0, 175, 176, 3, 142, 71, 0, 176, 177, 5, 68, 0, 0, 177, 178, 3, 142, 71, 0, 178, 179, 5, 67, 0, 0, 179, 180, 3, 142, 71, 0, 180, 184, 5, 127, 0, 0, 181, 183, 3, 8, 4, 0, 182, 181, 1, 0, 0, 0, 183, 186, 1, 0, 0, 0, 184, 182, 1, 0, 0, 0, 184, 185, 1, 0, 0, 0, 185, 187, 1, 0, 0, 0, 186, 184, 1, 0, 0, 0, 187, 188, 5, 128, 0, 0, 188, 7, 1, 0, 0, 0, 189, 197, 3, 4, 2, 0, 190, 197, 3, 18, 9, 0, 191, 197, 3, 10, 5, 0, 192, 197, 3, 86, 43, 0, 193, 197, 3, 98, 49, 0, 194, 197, 3, 122, 61, 0, 195, 197, 3, 32, 16, 0, 196, 189, 1, 0, 0, 0, 196, 190, 1, 0, 0, 0, 196, 191, 1, 0, 0, 0, 196, 192, 1, 0, 0, 0, 196, 193, 1, 0, 0, 0, 196, 194, 1, 0, 0, 0, 196, 195, 1, 0, 0, 0, 197, 9, 1, 0, 0, 0, 198, 199, 5, 33, 0, 0, 199, 200, 5, 36, 0, 0, 200, 201, 3, 140, 70, 0, 201, 202, 5, 124, 0, 0, 202, 209, 1, 0, 0, 0, 203, 204, 5, 33, 0, 0, 204, 205, 5, 38, 0, 0, 205, 206, 3, 140, 70, 0, 206, 207, 5, 124, 0, 0, 207, 209, 1, 0, 0, 0, 208, 198, 1, 0, 0, 0, 208, 203, 1, 0, 0, 0, 209, 11, 1, 0, 0, 0, 210, 211, 5, 34, 0, 0, 211, 212, 5, 35, 0, 0, 212, 213, 3, 140, 70, 0, 213, 214, 5, 74, 0, 0, 214, 215, 3, 142, 71, 0, 215, 216, 5, 124, 0, 0, 216, 13, 1, 0, 0, 0, 217, 218, 5, 34, 0, 0, 218, 219, 5, 36, 0, 0, 219, 220, 3, 140, 70, 0, 220, 221, 5, 68, 0, 0, 221, 222, 3, 142, 71, 0, 222, 223, 5, 124, 0, 0, 223, 15, 1, 0, 0, 0, 224, 229, 3, 10, 5, 0, 225, 229, 3, 12, 6, 0, 226, 229, 3, 14, 7, 0, 227, 229, 3, 32, 16, 0, 228, 224, 1, 0, 0, 0, 228, 225, 1, 0, 0, 0, 228, 226, 1, 0, 0, 0, 228, 227, 1, 0, 0, 0, 229, 17, 1, 0, 0, 0, 230, 231, 5, 35, 0, 0, 231, 232, 3, 140, 70, 0, 232, 233, 5, 74, 0, 0, 233, 236, 3, 142, 71, 0, 234, 235, 5, 75, 0, 0, 235, 237, 3, 142, 71, 0, 236, 234, 1, 0, 0, 0, 236, 237, 1, 0, 0, 0, 237, 238, 1, 0, 0, 0, 238, 239, 5, 124, 0, 0, 239, 19, 1, 0, 0, 0, 240, 242, 3, 16, 8, 0, 241, 240, 1, 0, 0, 0, 242, 245, 1, 0, 0, 0, 243, 241, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 246, 1, 0, 0, 0, 245, 243, 1, 0, 0, 0, 246, 247, 5, 36, 0, 0, 247, 249, 3, 140, 70, 0, 248, 250, 3, 22, 11, 0, 249, 248, 1, 0, 0, 0, 249, 250, 1, 0, 0, 0, 250, 251, 1, 0, 0, 0, 251, 252, 5, 74, 0, 0, 252, 253, 3, 142, 71, 0, 253, 254, 5, 68, 0, 0, 254, 264, 3, 142, 71, 0, 255, 256, 5, 79, 0, 0, 256, 261, 3, 26, 13, 0, 257, 258, 5, 125, 0, 0, 258, 260, 3, 26, 13, 0, 259, 257, 1, 0, 0, 0, 260, 263, 1, 0, 0, 0, 261, 259, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 265, 1, 0, 0, 0, 263, 261, 1, 0, 0, 0, 264, 255, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 266, 1, 0, 0, 0, 266, 270, 5, 127, 0, 0, 267, 269, 3, 34, 17, 0, 268, 267, 1, 0, 0, 0, 269, 272, 1, 0, 0, 0, 270, 268, 1, 0, 0, 0, 270, 271, 1, 0, 0, 0, 271, 273, 1, 0, 0, 0, 272, 270, 1, 0, 0, 0, 273, 274, 5, 128, 0, 0, 274, 21, 1, 0, 0, 0, 275, 276, 5, 133, 0, 0, 276, 281, 3, 24, 12, 0, 277, 278, 5, 125, 0, 0, 278, 280, 3, 24, 12, 0, 279, 277, 1, 0, 0, 0, 280, 283, 1, 0, 0, 0, 281, 279, 1, 0, 0, 0, 281, 282, 1, 0, 0, 0, 282, 284, 1, 0, 0, 0, 283, 281, 1, 0, 0, 0, 284, 285, 5, 134, 0, 0, 285, 23, 1, 0, 0, 0, 286, 287, 5, 39, 0, 0, 287, 290, 3, 140, 70, 0, 288, 289, 5, 123, 0, 0, 289, 291, 5, 29, 0, 0, 290, 288, 1, 0, 0, 0, 290, 291, 1, 0, 0, 0, 291, 306, 1, 0, 0, 0, 292, 293, 5, 28, 0, 0, 293, 303, 3, 140, 70, 0, 294, 295, 5, 30, 0, 0, 295, 300, 3, 26, 13, 0, 296, 297, 5, 135, 0, 0, 297, 299, 3, 26, 13, 0, 298, 296, 1, 0, 0, 0, 299, 302, 1, 0, 0, 0, 300, 298, 1, 0, 0, 0, 300, 301, 1, 0, 0, 0, 301, 304, 1, 0, 0, 0, 302, 300, 1, 0, 0, 0, 303, 294, 1, 0, 0, 0, 303, 304, 1, 0, 0, 0, 304, 306, 1, 0, 0, 0, 305, 286, 1, 0, 0, 0, 305, 292, 1, 0, 0, 0, 306, 25, 1, 0, 0, 0, 307, 309, 3, 140, 70, 0, 308, 310, 3, 28, 14, 0, 309, 308, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 27, 1, 0, 0, 0, 311, 312, 5, 133, 0, 0, 312, 317, 3, 30, 15, 0, 313, 314, 5, 125, 0, 0, 314, 316, 3, 30, 15, 0, 315, 313, 1, 0, 0, 0, 316, 319, 1, 0, 0, 0, 317, 315, 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 320, 1, 0, 0, 0, 319, 317, 1, 0, 0, 0, 320, 321, 5, 134, 0, 0, 321, 29, 1, 0, 0, 0, 322, 323, 5, 35, 0, 0, 323, 330, 3, 140, 70, 0, 324, 325, 5, 36, 0, 0, 325, 330, 3, 26, 13, 0, 326, 327, 5, 28, 0, 0, 327, 330, 3, 140, 70, 0, 328, 330, 3, 124, 62, 0, 329, 322, 1, 0, 0, 0, 329, 324, 1, 0, 0, 0, 329, 326, 1, 0, 0, 0, 329, 328, 1, 0, 0, 0, 330, 31, 1, 0, 0, 0, 331, 332, 5, 27, 0, 0, 332, 334, 3, 140, 70, 0, 333, 335, 3, 22, 11, 0, 334, 333, 1, 0, 0, 0, 334, 335, 1, 0, 0, 0, 335, 336, 1, 0, 0, 0, 336, 337, 5, 136, 0, 0, 337, 338, 3, 124, 62, 0, 338, 339, 5, 124, 0, 0, 339, 33, 1, 0, 0, 0, 340, 344, 3, 38, 19, 0, 341, 344, 3, 42, 21, 0, 342, 344, 3, 36, 18, 0, 343, 340, 1, 0, 0, 0, 343, 341, 1, 0, 0, 0, 343, 342, 1, 0, 0, 0, 344, 35, 1, 0, 0, 0, 345, 347, 5, 49, 0, 0, 346, 345, 1, 0, 0, 0, 346, 347, 1, 0, 0, 0, 347, 348, 1, 0, 0, 0, 348, 349, 5, 41, 0, 0, 349, 350, 3, 140, 70, 0, 350, 351, 5, 74, 0, 0, 351, 352, 3, 142, 71, 0, 352, 353, 5, 123, 0, 0, 353, 354, 3, 124, 62, 0, 354, 355, 5, 122, 0, 0, 355, 356, 3, 124, 62, 0, 356, 357, 5, 127, 0, 0, 357, 358, 5, 91, 0, 0, 358, 359, 5, 74, 0, 0, 359, 361, 3, 142, 71, 0, 360, 362, 3, 64, 32, 0, 361, 360, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 363, 1, 0, 0, 0, 363, 364, 5, 124, 0, 0, 364, 365, 5, 128, 0, 0, 365, 37, 1, 0, 0, 0, 366, 368, 3, 44, 22, 0, 367, 366, 1, 0, 0, 0, 367, 368, 1, 0, 0, 0, 368, 369, 1, 0, 0, 0, 369, 370, 5, 39, 0, 0, 370, 371, 3, 140, 70, 0, 371, 372, 5, 74, 0, 0, 372, 373, 3, 142, 71, 0, 373, 374, 5, 123, 0, 0, 374, 375, 3, 124, 62, 0, 375, 379, 5, 127, 0, 0, 376, 378, 3, 40, 20, 0, 377, 376, 1, 0, 0, 0, 378, 381, 1, 0, 0, 0, 379, 377, 1, 0, 0, 0, 379, 380, 1, 0, 0, 0, 380, 382, 1, 0, 0, 0, 381, 379, 1, 0, 0, 0, 382, 383, 5, 128, 0, 0, 383, 39, 1, 0, 0, 0, 384, 385, 5, 81, 0, 0, 385, 386, 5, 74, 0, 0, 386, 388, 3, 142, 71, 0, 387, 389, 3, 64, 32, 0, 388, 387, 1, 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 390, 1, 0, 0, 0, 390, 391, 5, 124, 0, 0, 391, 410, 1, 0, 0, 0, 392, 393, 5, 82, 0, 0, 393, 394, 5, 74, 0, 0, 394, 396, 3, 142, 71, 0, 395, 397, 3, 64, 32, 0, 396, 395, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 398, 1, 0, 0, 0, 398, 399, 5, 124, 0, 0, 399, 410, 1, 0, 0, 0, 400, 401, 5, 83, 0, 0, 401, 402, 5, 84, 0, 0, 402, 403, 5, 74, 0, 0, 403, 404, 3, 142, 71, 0, 404, 405, 5, 85, 0, 0, 405, 406, 5, 74, 0, 0, 406, 407, 3, 142, 71, 0, 407, 408, 5, 124, 0, 0, 408, 410, 1, 0, 0, 0, 409, 384, 1, 0, 0, 0, 409, 392, 1, 0, 0, 0, 409, 400, 1, 0, 0, 0, 410, 41, 1, 0, 0, 0, 411, 413, 3, 44, 22, 0, 412, 411, 1, 0, 0, 0, 412, 413, 1, 0, 0, 0, 413, 414, 1, 0, 0, 0, 414, 415, 5, 40, 0, 0, 415, 416, 3, 140, 70, 0, 416, 417, 5, 74, 0, 0, 417, 418, 3, 142, 71, 0, 418, 419, 5, 123, 0, 0, 419, 420, 3, 130, 65, 0, 420, 422, 3, 48, 24, 0, 421, 423, 5, 102, 0, 0, 422, 421, 1, 0, 0, 0, 422, 423, 1, 0, 0, 0, 423, 426, 1, 0, 0, 0, 424, 425, 5, 72, 0, 0, 425, 427, 3, 142, 71, 0, 426, 424, 1, 0, 0, 0, 426, 427, 1, 0, 0, 0, 427, 428, 1, 0, 0, 0, 428, 432, 5, 127, 0, 0, 429, 431, 3, 46, 23, 0, 430, 429, 1, 0, 0, 0, 431, 434, 1, 0, 0, 0, 432, 430, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 435, 1, 0, 0, 0, 434, 432, 1, 0, 0, 0, 435, 436, 5, 128, 0, 0, 436, 43, 1, 0, 0, 0, 437, 439, 5, 24, 0, 0, 438, 440, 7, 0, 0, 0, 439, 438, 1, 0, 0, 0, 439, 440, 1, 0, 0, 0, 440, 45, 1, 0, 0, 0, 441, 442, 5, 88, 0, 0, 442, 443, 5, 74, 0, 0, 443, 445, 3, 142, 71, 0, 444, 446, 3, 64, 32, 0, 445, 444, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 447, 1, 0, 0, 0, 447, 448, 5, 124, 0, 0, 448, 475, 1, 0, 0, 0, 449, 450, 5, 89, 0, 0, 450, 451, 5, 74, 0, 0, 451, 453, 3, 142, 71, 0, 452, 454, 3, 64, 32, 0, 453, 452, 1, 0, 0, 0, 453, 454, 1, 0, 0, 0, 454, 455, 1, 0, 0, 0, 455, 456, 5, 124, 0, 0, 456, 475, 1, 0, 0, 0, 457, 458, 5, 90, 0, 0, 458, 459, 5, 74, 0, 0, 459, 461, 3, 142, 71, 0, 460, 462, 3, 64, 32, 0, 461, 460, 1, 0, 0, 0, 461, 462, 1, 0, 0, 0, 462, 463, 1, 0, 0, 0, 463, 464, 5, 124, 0, 0, 464, 475, 1, 0, 0, 0, 465, 466, 5, 83, 0, 0, 466, 467, 5, 84, 0, 0, 467, 468, 5, 74, 0, 0, 468, 469, 3, 142, 71, 0, 469, 470, 5, 85, 0, 0, 470, 471, 5, 74, 0, 0, 471, 472, 3, 142, 71, 0, 472, 473, 5, 124, 0, 0, 473, 475, 1, 0, 0, 0, 474, 441, 1, 0, 0, 0, 474, 449, 1, 0, 0, 0, 474, 457, 1, 0, 0, 0, 474, 465, 1, 0, 0, 0, 475, 47, 1, 0, 0, 0, 476, 477, 5, 35, 0, 0, 477, 486, 3, 140, 70, 0, 478, 479, 5, 36, 0, 0, 479, 481, 3, 140, 70, 0, 480, 482, 3, 28, 14, 0, 481, 480, 1, 0, 0, 0, 481, 482, 1, 0, 0, 0, 482, 486, 1, 0, 0, 0, 483, 484, 5, 28, 0, 0, 484, 486, 3, 140, 70, 0, 485, 476, 1, 0, 0, 0, 485, 478, 1, 0, 0, 0, 485, 483, 1, 0, 0, 0, 486, 49, 1, 0, 0, 0, 487, 489, 3, 16, 8, 0, 488, 487, 1, 0, 0, 0, 489, 492, 1, 0, 0, 0, 490, 488, 1, 0, 0, 0, 490, 491, 1, 0, 0, 0, 491, 493, 1, 0, 0, 0, 492, 490, 1, 0, 0, 0, 493, 494, 5, 38, 0, 0, 494, 495, 3, 140, 70, 0, 495, 496, 5, 74, 0, 0, 496, 497, 3, 142, 71, 0, 497, 498, 5, 68, 0, 0, 498, 501, 3, 142, 71, 0, 499, 500, 5, 69, 0, 0, 500, 502, 5, 137, 0, 0, 501, 499, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 507, 5, 127, 0, 0, 504, 506, 3, 52, 26, 0, 505, 504, 1, 0, 0, 0, 506, 509, 1, 0, 0, 0, 507, 505, 1, 0, 0, 0, 507, 508, 1, 0, 0, 0, 508, 510, 1, 0, 0, 0, 509, 507, 1, 0, 0, 0, 510, 511, 5, 128, 0, 0, 511, 51, 1, 0, 0, 0, 512, 518, 3, 60, 30, 0, 513, 518, 3, 62, 31, 0, 514, 518, 3, 68, 34, 0, 515, 518, 3, 54, 27, 0, 516, 518, 3, 56, 28, 0, 517, 512, 1, 0, 0, 0, 517, 513, 1, 0, 0, 0, 517, 514, 1, 0, 0, 0, 517, 515, 1, 0, 0, 0, 517, 516, 1, 0, 0, 0, 518, 53, 1, 0, 0, 0, 519, 520, 5, 14, 0, 0, 520, 522, 3, 140, 70, 0, 521, 523, 3, 22, 11, 0, 522, 521, 1, 0, 0, 0, 522, 523, 1, 0, 0, 0, 523, 524, 1, 0, 0, 0, 524, 525, 5, 74, 0, 0, 525, 526, 3, 142, 71, 0, 526, 528, 5, 17, 0, 0, 527, 529, 5, 1, 0, 0, 528, 527, 1, 0, 0, 0, 528, 529, 1, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 531, 3, 26, 13, 0, 531, 532, 5, 18, 0, 0, 532, 533, 3, 142, 71, 0, 533, 534, 5, 41, 0, 0, 534, 535, 3, 142, 71, 0, 535, 539, 5, 127, 0, 0, 536, 538, 3, 58, 29, 0, 537, 536, 1, 0, 0, 0, 538, 541, 1, 0, 0, 0, 539, 537, 1, 0, 0, 0, 539, 540, 1, 0, 0, 0, 540, 542, 1, 0, 0, 0, 541, 539, 1, 0, 0, 0, 542, 543, 5, 128, 0, 0, 543, 55, 1, 0, 0, 0, 544, 545, 5, 14, 0, 0, 545, 546, 3, 140, 70, 0, 546, 547, 5, 74, 0, 0, 547, 548, 3, 142, 71, 0, 548, 549, 5, 16, 0, 0, 549, 550, 3, 140, 70, 0, 550, 551, 3, 28, 14, 0, 551, 552, 5, 124, 0, 0, 552, 57, 1, 0, 0, 0, 553, 554, 5, 8, 0, 0, 554, 594, 5, 124, 0, 0, 555, 556, 5, 9, 0, 0, 556, 557, 5, 10, 0, 0, 557, 558, 3, 140, 70, 0, 558, 559, 5, 124, 0, 0, 559, 594, 1, 0, 0, 0, 560, 561, 5, 19, 0, 0, 561, 562, 3, 142, 71, 0, 562, 563, 5, 124, 0, 0, 563, 594, 1, 0, 0, 0, 564, 566, 5, 20, 0, 0, 565, 567, 5, 28, 0, 0, 566, 565, 1, 0, 0, 0, 566, 567, 1, 0, 0, 0, 567, 568, 1, 0, 0, 0, 568, 569, 3, 140, 70, 0, 569, 570, 5, 47, 0, 0, 570, 571, 3, 26, 13, 0, 571, 572, 5, 124, 0, 0, 572, 594, 1, 0, 0, 0, 573, 574, 5, 21, 0, 0, 574, 575, 3, 140, 70, 0, 575, 576, 5, 137, 0, 0, 576, 577, 5, 124, 0, 0, 577, 594, 1, 0, 0, 0, 578, 579, 5, 22, 0, 0, 579, 580, 3, 26, 13, 0, 580, 581, 5, 126, 0, 0, 581, 582, 3, 140, 70, 0, 582, 583, 3, 140, 70, 0, 583, 584, 3, 142, 71, 0, 584, 585, 5, 124, 0, 0, 585, 594, 1, 0, 0, 0, 586, 587, 5, 83, 0, 0, 587, 594, 5, 124, 0, 0, 588, 589, 5, 23, 0, 0, 589, 590, 5, 137, 0, 0, 590, 591, 3, 142, 71, 0, 591, 592, 5, 124, 0, 0, 592, 594, 1, 0, 0, 0, 593, 553, 1, 0, 0, 0, 593, 555, 1, 0, 0, 0, 593, 560, 1, 0, 0, 0, 593, 564, 1, 0, 0, 0, 593, 573, 1, 0, 0, 0, 593, 578, 1, 0, 0, 0, 593, 586, 1, 0, 0, 0, 593, 588, 1, 0, 0, 0, 594, 59, 1, 0, 0, 0, 595, 596, 5, 41, 0, 0, 596, 598, 3, 140, 70, 0, 597, 599, 3, 22, 11, 0, 598, 597, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 600, 1, 0, 0, 0, 600, 601, 5, 74, 0, 0, 601, 602, 3, 142, 71, 0, 602, 603, 5, 123, 0, 0, 603, 604, 3, 124, 62, 0, 604, 605, 5, 122, 0, 0, 605, 606, 3, 124, 62, 0, 606, 607, 5, 76, 0, 0, 607, 609, 3, 72, 36, 0, 608, 610, 3, 64, 32, 0, 609, 608, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 612, 1, 0, 0, 0, 611, 613, 3, 70, 35, 0, 612, 611, 1, 0, 0, 0, 612, 613, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 615, 5, 78, 0, 0, 615, 617, 3, 74, 37, 0, 616, 618, 3, 78, 39, 0, 617, 616, 1, 0, 0, 0, 617, 618, 1, 0, 0, 0, 618, 619, 1, 0, 0, 0, 619, 620, 5, 124, 0, 0, 620, 61, 1, 0, 0, 0, 621, 622, 5, 42, 0, 0, 622, 624, 3, 140, 70, 0, 623, 625, 3, 22, 11, 0, 624, 623, 1, 0, 0, 0, 624, 625, 1, 0, 0, 0, 625, 626, 1, 0, 0, 0, 626, 627, 5, 74, 0, 0, 627, 628, 3, 142, 71, 0, 628, 629, 5, 123, 0, 0, 629, 630, 3, 124, 62, 0, 630, 631, 5, 122, 0, 0, 631, 633, 3, 124, 62, 0, 632, 634, 3, 64, 32, 0, 633, 632, 1, 0, 0, 0, 633, 634, 1, 0, 0, 0, 634, 636, 1, 0, 0, 0, 635, 637, 3, 78, 39, 0, 636, 635, 1, 0, 0, 0, 636, 637, 1, 0, 0, 0, 637, 638, 1, 0, 0, 0, 638, 639, 5, 124, 0, 0, 639, 63, 1, 0, 0, 0, 640, 641, 5, 2, 0, 0, 641, 650, 5, 5, 0, 0, 642, 643, 5, 2, 0, 0, 643, 644, 7, 1, 0, 0, 644, 645, 5, 6, 0, 0, 645, 646, 5, 129, 0, 0, 646, 647, 3, 76, 38, 0, 647, 648, 5, 130, 0, 0, 648, 650, 1, 0, 0, 0, 649, 640, 1, 0, 0, 0, 649, 642, 1, 0, 0, 0, 650, 65, 1, 0, 0, 0, 651, 652, 5, 57, 0, 0, 652, 653, 5, 129, 0, 0, 653, 658, 3, 108, 54, 0, 654, 655, 5, 125, 0, 0, 655, 657, 3, 108, 54, 0, 656, 654, 1, 0, 0, 0, 657, 660, 1, 0, 0, 0, 658, 656, 1, 0, 0, 0, 658, 659, 1, 0, 0, 0, 659, 661, 1, 0, 0, 0, 660, 658, 1, 0, 0, 0, 661, 662, 5, 130, 0, 0, 662, 67, 1, 0, 0, 0, 663, 664, 5, 43, 0, 0, 664, 665, 3, 140, 70, 0, 665, 666, 5, 74, 0, 0, 666, 667, 3, 142, 71, 0, 667, 668, 5, 44, 0, 0, 668, 669, 3, 140, 70, 0, 669, 670, 5, 123, 0, 0, 670, 672, 3, 124, 62, 0, 671, 673, 3, 78, 39, 0, 672, 671, 1, 0, 0, 0, 672, 673, 1, 0, 0, 0, 673, 674, 1, 0, 0, 0, 674, 675, 5, 124, 0, 0, 675, 69, 1, 0, 0, 0, 676, 677, 5, 77, 0, 0, 677, 678, 3, 124, 62, 0, 678, 71, 1, 0, 0, 0, 679, 680, 7, 2, 0, 0, 680, 73, 1, 0, 0, 0, 681, 700, 5, 80, 0, 0, 682, 683, 5, 35, 0, 0, 683, 700, 3, 140, 70, 0, 684, 685, 5, 28, 0, 0, 685, 700, 3, 140, 70, 0, 686, 687, 5, 37, 0, 0, 687, 696, 5, 129, 0, 0, 688, 693, 3, 26, 13, 0, 689, 690, 5, 125, 0, 0, 690, 692, 3, 26, 13, 0, 691, 689, 1, 0, 0, 0, 692, 695, 1, 0, 0, 0, 693, 691, 1, 0, 0, 0, 693, 694, 1, 0, 0, 0, 694, 697, 1, 0, 0, 0, 695, 693, 1, 0, 0, 0, 696, 688, 1, 0, 0, 0, 696, 697, 1, 0, 0, 0, 697, 698, 1, 0, 0, 0, 698, 700, 5, 130, 0, 0, 699, 681, 1, 0, 0, 0, 699, 682, 1, 0, 0, 0, 699, 684, 1, 0, 0, 0, 699, 686, 1, 0, 0, 0, 700, 75, 1, 0, 0, 0, 701, 706, 3, 140, 70, 0, 702, 703, 5, 125, 0, 0, 703, 705, 3, 140, 70, 0, 704, 702, 1, 0, 0, 0, 705, 708, 1, 0, 0, 0, 706, 704, 1, 0, 0, 0, 706, 707, 1, 0, 0, 0, 707, 77, 1, 0, 0, 0, 708, 706, 1, 0, 0, 0, 709, 710, 5, 79, 0, 0, 710, 714, 5, 127, 0, 0, 711, 713, 3, 80, 40, 0, 712, 711, 1, 0, 0, 0, 713, 716, 1, 0, 0, 0, 714, 712, 1, 0, 0, 0, 714, 715, 1, 0, 0, 0, 715, 717, 1, 0, 0, 0, 716, 714, 1, 0, 0, 0, 717, 718, 5, 128, 0, 0, 718, 79, 1, 0, 0, 0, 719, 720, 5, 15, 0, 0, 720, 721, 3, 140, 70, 0, 721, 722, 5, 74, 0, 0, 722, 723, 3, 142, 71, 0, 723, 724, 5, 129, 0, 0, 724, 725, 3, 76, 38, 0, 725, 726, 5, 130, 0, 0, 726, 727, 5, 124, 0, 0, 727, 784, 1, 0, 0, 0, 728, 729, 5, 53, 0, 0, 729, 730, 3, 140, 70, 0, 730, 731, 5, 74, 0, 0, 731, 732, 3, 142, 71, 0, 732, 733, 5, 123, 0, 0, 733, 734, 3, 124, 62, 0, 734, 735, 3, 82, 41, 0, 735, 736, 5, 124, 0, 0, 736, 784, 1, 0, 0, 0, 737, 738, 5, 54, 0, 0, 738, 739, 3, 140, 70, 0, 739, 740, 5, 74, 0, 0, 740, 741, 3, 142, 71, 0, 741, 742, 5, 123, 0, 0, 742, 743, 3, 130, 65, 0, 743, 744, 3, 48, 24, 0, 744, 745, 3, 82, 41, 0, 745, 746, 5, 124, 0, 0, 746, 784, 1, 0, 0, 0, 747, 748, 5, 36, 0, 0, 748, 749, 3, 140, 70, 0, 749, 750, 5, 74, 0, 0, 750, 751, 3, 142, 71, 0, 751, 752, 5, 123, 0, 0, 752, 754, 3, 140, 70, 0, 753, 755, 3, 28, 14, 0, 754, 753, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 757, 1, 0, 0, 0, 756, 758, 3, 66, 33, 0, 757, 756, 1, 0, 0, 0, 757, 758, 1, 0, 0, 0, 758, 759, 1, 0, 0, 0, 759, 760, 5, 124, 0, 0, 760, 784, 1, 0, 0, 0, 761, 762, 5, 43, 0, 0, 762, 763, 3, 140, 70, 0, 763, 764, 5, 74, 0, 0, 764, 765, 3, 142, 71, 0, 765, 766, 5, 123, 0, 0, 766, 769, 3, 140, 70, 0, 767, 768, 5, 45, 0, 0, 768, 770, 3, 124, 62, 0, 769, 767, 1, 0, 0, 0, 769, 770, 1, 0, 0, 0, 770, 771, 1, 0, 0, 0, 771, 772, 5, 124, 0, 0, 772, 784, 1, 0, 0, 0, 773, 774, 5, 14, 0, 0, 774, 775, 3, 140, 70, 0, 775, 776, 5, 74, 0, 0, 776, 777, 3, 142, 71, 0, 777, 778, 5, 123, 0, 0, 778, 779, 3, 140, 70, 0, 779, 780, 5, 126, 0, 0, 780, 781, 3, 140, 70, 0, 781, 782, 5, 124, 0, 0, 782, 784, 1, 0, 0, 0, 783, 719, 1, 0, 0, 0, 783, 728, 1, 0, 0, 0, 783, 737, 1, 0, 0, 0, 783, 747, 1, 0, 0, 0, 783, 761, 1, 0, 0, 0, 783, 773, 1, 0, 0, 0, 784, 81, 1, 0, 0, 0, 785, 786, 5, 129, 0, 0, 786, 791, 3, 84, 42, 0, 787, 788, 5, 125, 0, 0, 788, 790, 3, 84, 42, 0, 789, 787, 1, 0, 0, 0, 790, 793, 1, 0, 0, 0, 791, 789, 1, 0, 0, 0, 791, 792, 1, 0, 0, 0, 792, 794, 1, 0, 0, 0, 793, 791, 1, 0, 0, 0, 794, 795, 5, 130, 0, 0, 795, 83, 1, 0, 0, 0, 796, 797, 7, 3, 0, 0, 797, 85, 1, 0, 0, 0, 798, 799, 5, 52, 0, 0, 799, 800, 3, 88, 44, 0, 800, 87, 1, 0, 0, 0, 801, 804, 3, 90, 45, 0, 802, 804, 3, 94, 47, 0, 803, 801, 1, 0, 0, 0, 803, 802, 1, 0, 0, 0, 804, 89, 1, 0, 0, 0, 805, 806, 5, 53, 0, 0, 806, 807, 3, 140, 70, 0, 807, 808, 5, 74, 0, 0, 808, 809, 3, 142, 71, 0, 809, 810, 5, 62, 0, 0, 810, 811, 3, 140, 70, 0, 811, 812, 5, 123, 0, 0, 812, 813, 3, 124, 62, 0, 813, 814, 5, 63, 0, 0, 814, 817, 3, 92, 46, 0, 815, 816, 5, 64, 0, 0, 816, 818, 3, 132, 66, 0, 817, 815, 1, 0, 0, 0, 817, 818, 1, 0, 0, 0, 818, 819, 1, 0, 0, 0, 819, 820, 5, 124, 0, 0, 820, 91, 1, 0, 0, 0, 821, 828, 5, 96, 0, 0, 822, 823, 5, 97, 0, 0, 823, 824, 5, 131, 0, 0, 824, 825, 3, 124, 62, 0, 825, 826, 5, 132, 0, 0, 826, 828, 1, 0, 0, 0, 827, 821, 1, 0, 0, 0, 827, 822, 1, 0, 0, 0, 828, 93, 1, 0, 0, 0, 829, 830, 5, 54, 0, 0, 830, 831, 3, 140, 70, 0, 831, 832, 5, 74, 0, 0, 832, 833, 3, 142, 71, 0, 833, 834, 5, 127, 0, 0, 834, 835, 3, 96, 48, 0, 835, 836, 3, 96, 48, 0, 836, 837, 5, 128, 0, 0, 837, 95, 1, 0, 0, 0, 838, 839, 3, 48, 24, 0, 839, 840, 5, 55, 0, 0, 840, 841, 3, 140, 70, 0, 841, 842, 5, 74, 0, 0, 842, 843, 3, 142, 71, 0, 843, 845, 3, 130, 65, 0, 844, 846, 5, 102, 0, 0, 845, 844, 1, 0, 0, 0, 845, 846, 1, 0, 0, 0, 846, 849, 1, 0, 0, 0, 847, 848, 5, 70, 0, 0, 848, 850, 3, 142, 71, 0, 849, 847, 1, 0, 0, 0, 849, 850, 1, 0, 0, 0, 850, 852, 1, 0, 0, 0, 851, 853, 5, 71, 0, 0, 852, 851, 1, 0, 0, 0, 852, 853, 1, 0, 0, 0, 853, 856, 1, 0, 0, 0, 854, 855, 5, 72, 0, 0, 855, 857, 3, 142, 71, 0, 856, 854, 1, 0, 0, 0, 856, 857, 1, 0, 0, 0, 857, 859, 1, 0, 0, 0, 858, 860, 5, 73, 0, 0, 859, 858, 1, 0, 0, 0, 859, 860, 1, 0, 0, 0, 860, 861, 1, 0, 0, 0, 861, 862, 5, 124, 0, 0, 862, 97, 1, 0, 0, 0, 863, 864, 5, 46, 0, 0, 864, 865, 3, 140, 70, 0, 865, 866, 5, 47, 0, 0, 866, 868, 3, 140, 70, 0, 867, 869, 3, 28, 14, 0, 868, 867, 1, 0, 0, 0, 868, 869, 1, 0, 0, 0, 869, 872, 1, 0, 0, 0, 870, 871, 5, 74, 0, 0, 871, 873, 3, 142, 71, 0, 872, 870, 1, 0, 0, 0, 872, 873, 1, 0, 0, 0, 873, 876, 1, 0, 0, 0, 874, 875, 5, 69, 0, 0, 875, 877, 5, 137, 0, 0, 876, 874, 1, 0, 0, 0, 876, 877, 1, 0, 0, 0, 877, 878, 1, 0, 0, 0, 878, 882, 5, 127, 0, 0, 879, 881, 3, 100, 50, 0, 880, 879, 1, 0, 0, 0, 881, 884, 1, 0, 0, 0, 882, 880, 1, 0, 0, 0, 882, 883, 1, 0, 0, 0, 883, 885, 1, 0, 0, 0, 884, 882, 1, 0, 0, 0, 885, 886, 5, 128, 0, 0, 886, 99, 1, 0, 0, 0, 887, 888, 5, 51, 0, 0, 888, 893, 3, 88, 44, 0, 889, 893, 3, 106, 53, 0, 890, 893, 3, 102, 51, 0, 891, 893, 3, 104, 52, 0, 892, 887, 1, 0, 0, 0, 892, 889, 1, 0, 0, 0, 892, 890, 1, 0, 0, 0, 892, 891, 1, 0, 0, 0, 893, 101, 1, 0, 0, 0, 894, 895, 5, 48, 0, 0, 895, 896, 3, 140, 70, 0, 896, 897, 5, 50, 0, 0, 897, 898, 5, 53, 0, 0, 898, 899, 3, 140, 70, 0, 899, 900, 5, 124, 0, 0, 900, 103, 1, 0, 0, 0, 901, 902, 5, 59, 0, 0, 902, 903, 3, 140, 70, 0, 903, 904, 5, 60, 0, 0, 904, 905, 5, 61, 0, 0, 905, 906, 5, 57, 0, 0, 906, 907, 5, 43, 0, 0, 907, 908, 3, 140, 70, 0, 908, 909, 5, 58, 0, 0, 909, 910, 5, 54, 0, 0, 910, 911, 3, 140, 70, 0, 911, 912, 5, 126, 0, 0, 912, 913, 3, 140, 70, 0, 913, 914, 5, 124, 0, 0, 914, 105, 1, 0, 0, 0, 915, 916, 5, 48, 0, 0, 916, 917, 3, 108, 54, 0, 917, 918, 5, 50, 0, 0, 918, 921, 3, 112, 56, 0, 919, 920, 5, 26, 0, 0, 920, 922, 3, 142, 71, 0, 921, 919, 1, 0, 0, 0, 921, 922, 1, 0, 0, 0, 922, 923, 1, 0, 0, 0, 923, 924, 5, 124, 0, 0, 924, 107, 1, 0, 0, 0, 925, 926, 3, 140, 70, 0, 926, 927, 5, 126, 0, 0, 927, 928, 3, 110, 55, 0, 928, 109, 1, 0, 0, 0, 929, 941, 3, 140, 70, 0, 930, 941, 5, 91, 0, 0, 931, 941, 5, 81, 0, 0, 932, 941, 5, 82, 0, 0, 933, 941, 5, 88, 0, 0, 934, 941, 5, 89, 0, 0, 935, 941, 5, 90, 0, 0, 936, 941, 5, 92, 0, 0, 937, 941, 5, 93, 0, 0, 938, 941, 5, 94, 0, 0, 939, 941, 5, 95, 0, 0, 940, 929, 1, 0, 0, 0, 940, 930, 1, 0, 0, 0, 940, 931, 1, 0, 0, 0, 940, 932, 1, 0, 0, 0, 940, 933, 1, 0, 0, 0, 940, 934, 1, 0, 0, 0, 940, 935, 1, 0, 0, 0, 940, 936, 1, 0, 0, 0, 940, 937, 1, 0, 0, 0, 940, 938, 1, 0, 0, 0, 940, 939, 1, 0, 0, 0, 941, 111, 1, 0, 0, 0, 942, 943, 5, 53, 0, 0, 943, 944, 3, 140, 70, 0, 944, 945, 5, 126, 0, 0, 945, 946, 3, 114, 57, 0, 946, 973, 1, 0, 0, 0, 947, 948, 5, 54, 0, 0, 948, 949, 3, 140, 70, 0, 949, 950, 5, 126, 0, 0, 950, 951, 3, 140, 70, 0, 951, 952, 5, 126, 0, 0, 952, 953, 3, 116, 58, 0, 953, 973, 1, 0, 0, 0, 954, 955, 5, 36, 0, 0, 955, 957, 3, 140, 70, 0, 956, 958, 3, 28, 14, 0, 957, 956, 1, 0, 0, 0, 957, 958, 1, 0, 0, 0, 958, 959, 1, 0, 0, 0, 959, 960, 5, 126, 0, 0, 960, 961, 3, 108, 54, 0, 961, 973, 1, 0, 0, 0, 962, 963, 5, 38, 0, 0, 963, 964, 3, 140, 70, 0, 964, 965, 5, 126, 0, 0, 965, 967, 3, 140, 70, 0, 966, 968, 3, 28, 14, 0, 967, 966, 1, 0, 0, 0, 967, 968, 1, 0, 0, 0, 968, 970, 1, 0, 0, 0, 969, 971, 3, 118, 59, 0, 970, 969, 1, 0, 0, 0, 970, 971, 1, 0, 0, 0, 971, 973, 1, 0, 0, 0, 972, 942, 1, 0, 0, 0, 972, 947, 1, 0, 0, 0, 972, 954, 1, 0, 0, 0, 972, 962, 1, 0, 0, 0, 973, 113, 1, 0, 0, 0, 974, 975, 7, 4, 0, 0, 975, 115, 1, 0, 0, 0, 976, 977, 7, 5, 0, 0, 977, 117, 1, 0, 0, 0, 978, 979, 5, 56, 0, 0, 979, 983, 5, 127, 0, 0, 980, 982, 3, 120, 60, 0, 981, 980, 1, 0, 0, 0, 982, 985, 1, 0, 0, 0, 983, 981, 1, 0, 0, 0, 983, 984, 1, 0, 0, 0, 984, 986, 1, 0, 0, 0, 985, 983, 1, 0, 0, 0, 986, 987, 5, 128, 0, 0, 987, 119, 1, 0, 0, 0, 988, 989, 3, 140, 70, 0, 989, 990, 5, 50, 0, 0, 990, 991, 5, 1, 0, 0, 991, 992, 5, 15, 0, 0, 992, 993, 5, 129, 0, 0, 993, 994, 3, 76, 38, 0, 994, 995, 5, 130, 0, 0, 995, 996, 5, 124, 0, 0, 996, 1070, 1, 0, 0, 0, 997, 998, 3, 140, 70, 0, 998, 999, 5, 50, 0, 0, 999, 1000, 5, 53, 0, 0, 1000, 1007, 3, 140, 70, 0, 1001, 1002, 5, 58, 0, 0, 1002, 1003, 5, 54, 0, 0, 1003, 1004, 3, 140, 70, 0, 1004, 1005, 5, 126, 0, 0, 1005, 1006, 3, 140, 70, 0, 1006, 1008, 1, 0, 0, 0, 1007, 1001, 1, 0, 0, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1009, 1, 0, 0, 0, 1009, 1010, 5, 124, 0, 0, 1010, 1070, 1, 0, 0, 0, 1011, 1012, 3, 140, 70, 0, 1012, 1013, 5, 50, 0, 0, 1013, 1014, 5, 54, 0, 0, 1014, 1015, 3, 140, 70, 0, 1015, 1016, 5, 126, 0, 0, 1016, 1023, 3, 140, 70, 0, 1017, 1018, 5, 58, 0, 0, 1018, 1019, 5, 54, 0, 0, 1019, 1020, 3, 140, 70, 0, 1020, 1021, 5, 126, 0, 0, 1021, 1022, 3, 140, 70, 0, 1022, 1024, 1, 0, 0, 0, 1023, 1017, 1, 0, 0, 0, 1023, 1024, 1, 0, 0, 0, 1024, 1025, 1, 0, 0, 0, 1025, 1026, 5, 124, 0, 0, 1026, 1070, 1, 0, 0, 0, 1027, 1028, 3, 140, 70, 0, 1028, 1029, 5, 50, 0, 0, 1029, 1030, 5, 36, 0, 0, 1030, 1032, 3, 140, 70, 0, 1031, 1033, 3, 28, 14, 0, 1032, 1031, 1, 0, 0, 0, 1032, 1033, 1, 0, 0, 0, 1033, 1040, 1, 0, 0, 0, 1034, 1035, 5, 58, 0, 0, 1035, 1036, 5, 54, 0, 0, 1036, 1037, 3, 140, 70, 0, 1037, 1038, 5, 126, 0, 0, 1038, 1039, 3, 140, 70, 0, 1039, 1041, 1, 0, 0, 0, 1040, 1034, 1, 0, 0, 0, 1040, 1041, 1, 0, 0, 0, 1041, 1042, 1, 0, 0, 0, 1042, 1043, 5, 124, 0, 0, 1043, 1070, 1, 0, 0, 0, 1044, 1045, 3, 140, 70, 0, 1045, 1046, 5, 50, 0, 0, 1046, 1047, 5, 43, 0, 0, 1047, 1048, 3, 140, 70, 0, 1048, 1049, 5, 124, 0, 0, 1049, 1070, 1, 0, 0, 0, 1050, 1051, 3, 140, 70, 0, 1051, 1053, 5, 50, 0, 0, 1052, 1054, 5, 1, 0, 0, 1053, 1052, 1, 0, 0, 0, 1053, 1054, 1, 0, 0, 0, 1054, 1055, 1, 0, 0, 0, 1055, 1056, 5, 14, 0, 0, 1056, 1057, 3, 140, 70, 0, 1057, 1058, 5, 126, 0, 0, 1058, 1065, 3, 140, 70, 0, 1059, 1060, 5, 58, 0, 0, 1060, 1061, 5, 54, 0, 0, 1061, 1062, 3, 140, 70, 0, 1062, 1063, 5, 126, 0, 0, 1063, 1064, 3, 140, 70, 0, 1064, 1066, 1, 0, 0, 0, 1065, 1059, 1, 0, 0, 0, 1065, 1066, 1, 0, 0, 0, 1066, 1067, 1, 0, 0, 0, 1067, 1068, 5, 124, 0, 0, 1068, 1070, 1, 0, 0, 0, 1069, 988, 1, 0, 0, 0, 1069, 997, 1, 0, 0, 0, 1069, 1011, 1, 0, 0, 0, 1069, 1027, 1, 0, 0, 0, 1069, 1044, 1, 0, 0, 0, 1069, 1050, 1, 0, 0, 0, 1070, 121, 1, 0, 0, 0, 1071, 1072, 5, 43, 0, 0, 1072, 1073, 3, 140, 70, 0, 1073, 1074, 5, 50, 0, 0, 1074, 1075, 3, 140, 70, 0, 1075, 1076, 5, 126, 0, 0, 1076, 1078, 3, 140, 70, 0, 1077, 1079, 3, 118, 59, 0, 1078, 1077, 1, 0, 0, 0, 1078, 1079, 1, 0, 0, 0, 1079, 1080, 1, 0, 0, 0, 1080, 1081, 5, 124, 0, 0, 1081, 123, 1, 0, 0, 0, 1082, 1129, 3, 128, 64, 0, 1083, 1129, 5, 103, 0, 0, 1084, 1129, 5, 104, 0, 0, 1085, 1086, 5, 105, 0, 0, 1086, 1129, 3, 142, 71, 0, 1087, 1088, 5, 106, 0, 0, 1088, 1089, 5, 133, 0, 0, 1089, 1090, 3, 140, 70, 0, 1090, 1091, 5, 134, 0, 0, 1091, 1129, 1, 0, 0, 0, 1092, 1093, 5, 107, 0, 0, 1093, 1094, 5, 133, 0, 0, 1094, 1096, 3, 140, 70, 0, 1095, 1097, 3, 28, 14, 0, 1096, 1095, 1, 0, 0, 0, 1096, 1097, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1099, 5, 134, 0, 0, 1099, 1129, 1, 0, 0, 0, 1100, 1101, 5, 31, 0, 0, 1101, 1102, 5, 133, 0, 0, 1102, 1103, 3, 140, 70, 0, 1103, 1104, 5, 134, 0, 0, 1104, 1129, 1, 0, 0, 0, 1105, 1106, 5, 108, 0, 0, 1106, 1107, 5, 133, 0, 0, 1107, 1108, 3, 124, 62, 0, 1108, 1109, 5, 134, 0, 0, 1109, 1129, 1, 0, 0, 0, 1110, 1111, 5, 109, 0, 0, 1111, 1112, 5, 133, 0, 0, 1112, 1113, 3, 124, 62, 0, 1113, 1114, 5, 134, 0, 0, 1114, 1129, 1, 0, 0, 0, 1115, 1116, 5, 110, 0, 0, 1116, 1120, 5, 127, 0, 0, 1117, 1119, 3, 126, 63, 0, 1118, 1117, 1, 0, 0, 0, 1119, 1122, 1, 0, 0, 0, 1120, 1118, 1, 0, 0, 0, 1120, 1121, 1, 0, 0, 0, 1121, 1123, 1, 0, 0, 0, 1122, 1120, 1, 0, 0, 0, 1123, 1129, 5, 128, 0, 0, 1124, 1126, 3, 140, 70, 0, 1125, 1127, 3, 28, 14, 0, 1126, 1125, 1, 0, 0, 0, 1126, 1127, 1, 0, 0, 0, 1127, 1129, 1, 0, 0, 0, 1128, 1082, 1, 0, 0, 0, 1128, 1083, 1, 0, 0, 0, 1128, 1084, 1, 0, 0, 0, 1128, 1085, 1, 0, 0, 0, 1128, 1087, 1, 0, 0, 0, 1128, 1092, 1, 0, 0, 0, 1128, 1100, 1, 0, 0, 0, 1128, 1105, 1, 0, 0, 0, 1128, 1110, 1, 0, 0, 0, 1128, 1115, 1, 0, 0, 0, 1128, 1124, 1, 0, 0, 0, 1129, 125, 1, 0, 0, 0, 1130, 1131, 3, 140, 70, 0, 1131, 1132, 5, 123, 0, 0, 1132, 1133, 3, 124, 62, 0, 1133, 1134, 5, 124, 0, 0, 1134, 127, 1, 0, 0, 0, 1135, 1136, 7, 6, 0, 0, 1136, 129, 1, 0, 0, 0, 1137, 1138, 7, 7, 0, 0, 1138, 131, 1, 0, 0, 0, 1139, 1148, 3, 142, 71, 0, 1140, 1148, 5, 137, 0, 0, 1141, 1148, 5, 138, 0, 0, 1142, 1148, 5, 119, 0, 0, 1143, 1148, 5, 120, 0, 0, 1144, 1148, 5, 121, 0, 0, 1145, 1148, 3, 134, 67, 0, 1146, 1148, 3, 138, 69, 0, 1147, 1139, 1, 0, 0, 0, 1147, 1140, 1, 0, 0, 0, 1147, 1141, 1, 0, 0, 0, 1147, 1142, 1, 0, 0, 0, 1147, 1143, 1, 0, 0, 0, 1147, 1144, 1, 0, 0, 0, 1147, 1145, 1, 0, 0, 0, 1147, 1146, 1, 0, 0, 0, 1148, 133, 1, 0, 0, 0, 1149, 1158, 5, 127, 0, 0, 1150, 1155, 3, 136, 68, 0, 1151, 1152, 5, 125, 0, 0, 1152, 1154, 3, 136, 68, 0, 1153, 1151, 1, 0, 0, 0, 1154, 1157, 1, 0, 0, 0, 1155, 1153, 1, 0, 0, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1159, 1, 0, 0, 0, 1157, 1155, 1, 0, 0, 0, 1158, 1150, 1, 0, 0, 0, 1158, 1159, 1, 0, 0, 0, 1159, 1160, 1, 0, 0, 0, 1160, 1161, 5, 128, 0, 0, 1161, 135, 1, 0, 0, 0, 1162, 1163, 3, 142, 71, 0, 1163, 1164, 5, 123, 0, 0, 1164, 1165, 3, 132, 66, 0, 1165, 137, 1, 0, 0, 0, 1166, 1175, 5, 129, 0, 0, 1167, 1172, 3, 132, 66, 0, 1168, 1169, 5, 125, 0, 0, 1169, 1171, 3, 132, 66, 0, 1170, 1168, 1, 0, 0, 0, 1171, 1174, 1, 0, 0, 0, 1172, 1170, 1, 0, 0, 0, 1172, 1173, 1, 0, 0, 0, 1173, 1176, 1, 0, 0, 0, 1174, 1172, 1, 0, 0, 0, 1175, 1167, 1, 0, 0, 0, 1175, 1176, 1, 0, 0, 0, 1176, 1177, 1, 0, 0, 0, 1177, 1178, 5, 130, 0, 0, 1178, 139, 1, 0, 0, 0, 1179, 1180, 7, 8, 0, 0, 1180, 141, 1, 0, 0, 0, 1181, 1182, 5, 140, 0, 0, 1182, 143, 1, 0, 0, 0, 106, 156, 163, 184, 196, 208, 228, 236, 243, 249, 261, 264, 270, 281, 290, 300, 303, 305, 309, 317, 329, 334, 343, 346, 361, 367, 379, 388, 396, 409, 412, 422, 426, 432, 439, 445, 453, 461, 474, 481, 485, 490, 501, 507, 517, 522, 528, 539, 566, 593, 598, 609, 612, 617, 624, 633, 636, 649, 658, 672, 693, 696, 699, 706, 714, 754, 757, 769, 783, 791, 803, 817, 827, 845, 849, 852, 856, 859, 868, 872, 876, 882, 892, 921, 940, 957, 967, 970, 972, 983, 1007, 1023, 1032, 1040, 1053, 1065, 1069, 1078, 1096, 1120, 1126, 1128, 1147, 1155, 1158, 1172, 1175] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapability.tokens b/src/capability-language/generated/QuixosCapability.tokens index 81f78bd..6557cbb 100644 --- a/src/capability-language/generated/QuixosCapability.tokens +++ b/src/capability-language/generated/QuixosCapability.tokens @@ -1,261 +1,279 @@ WORKSPACE=1 -RESULT_BYTES=2 -RPC_CALLS=3 -DEADLINE_MS=4 -QUERY=5 -REFLECTION=6 -SPECIALIZE=7 -ROOT=8 -DOCUMENT=9 -FRAGMENTS=10 -VIEW=11 -MAX=12 -ALLOW=13 -POLL=14 -QUERYABLE=15 -RPC=16 -QUERY_REASON=17 -TYPE=18 -OBJECT=19 -STORABLE=20 -IMPLEMENTS=21 -REF=22 -FRAGMENT=23 -IMPORT=24 -EXTERNAL=25 -ATOM=26 -INTERFACE=27 -INTERFACES=28 -PACKAGE=29 -VALUE=30 -RELATION=31 -OPERATION=32 -FUNCTION=33 -CONSTRUCTOR=34 -CONSTRUCTS=35 -INPUT=36 -CONFORM=37 -AS=38 -BIND=39 -STATIC=40 -TO=41 -PRIVATE=42 -SHARED=43 -STATE=44 -EDGE=45 -PROJECTION=46 -WITH=47 -USING=48 -VIA=49 -MATERIALIZE=50 -IF=51 -ABSENT=52 -ON=53 -POLICY=54 -DEFAULT=55 -SOURCE=56 -REPOSITORY=57 -COMMIT=58 -REVISION=59 -SEMANTIC_MAJOR=60 -ON_DELETE=61 -RETAIN_OTHER=62 -KEYED=63 -PUBLIC_TRAVERSAL=64 -ID=65 -DOC=66 -MODE=67 -EMITS=68 -RECEIVER=69 -REQUIRES=70 -ANY=71 -GET=72 -SET=73 -WATCH=74 -START=75 -STOP=76 -READ=77 -WRITE=78 -RESOLVE=79 -CONNECT=80 -DISCONNECT=81 -CALL=82 -WATCH_START=83 -WATCH_STOP=84 -SUBSCRIBE=85 -UNSUBSCRIBE=86 -OPTIMISTIC_REGISTER=87 -CRDT=88 -OPTIONAL_ONE=89 -EXACTLY_ONE=90 -MANY_UNIQUE=91 -MANY=92 -ORDERED=93 -UNIT=94 -WATCH_HANDLE=95 -MESSAGE=96 -ATOM_REF=97 -INTERFACE_REF=98 -OPTIONAL=99 -LIST=100 -RECORD=101 -BOOL=102 -BYTES=103 -DOUBLE=104 -INT32=105 -INT64=106 -STRING=107 -UINT32=108 -UINT64=109 -TRUE=110 -FALSE=111 -NULL=112 -ARROW=113 -COLON=114 -SEMI=115 -COMMA=116 -DOT=117 -LBRACE=118 -RBRACE=119 -LBRACK=120 -RBRACK=121 -LPAREN=122 -RPAREN=123 -LT=124 -GT=125 -AMP=126 -EQUAL=127 -INTEGER=128 -JSON_NUMBER=129 -IDENTIFIER=130 -STRING_LITERAL=131 -LINE_COMMENT=132 -BLOCK_COMMENT=133 -WS=134 +EXECUTION=2 +SNAPSHOT=3 +TRANSACTION=4 +REMOTE=5 +TARGETS=6 +PORTABLE=7 +REPLICA=8 +LOCAL=9 +FROM=10 +RESULT_BYTES=11 +RPC_CALLS=12 +DEADLINE_MS=13 +QUERY=14 +REFLECTION=15 +SPECIALIZE=16 +ROOT=17 +DOCUMENT=18 +FRAGMENTS=19 +VIEW=20 +MAX=21 +ALLOW=22 +POLL=23 +QUERYABLE=24 +RPC=25 +QUERY_REASON=26 +TYPE=27 +OBJECT=28 +STORABLE=29 +IMPLEMENTS=30 +REF=31 +FRAGMENT=32 +IMPORT=33 +EXTERNAL=34 +ATOM=35 +INTERFACE=36 +INTERFACES=37 +PACKAGE=38 +VALUE=39 +RELATION=40 +OPERATION=41 +FUNCTION=42 +CONSTRUCTOR=43 +CONSTRUCTS=44 +INPUT=45 +CONFORM=46 +AS=47 +BIND=48 +STATIC=49 +TO=50 +PRIVATE=51 +SHARED=52 +STATE=53 +EDGE=54 +PROJECTION=55 +WITH=56 +USING=57 +VIA=58 +MATERIALIZE=59 +IF=60 +ABSENT=61 +ON=62 +POLICY=63 +DEFAULT=64 +SOURCE=65 +REPOSITORY=66 +COMMIT=67 +REVISION=68 +SEMANTIC_MAJOR=69 +ON_DELETE=70 +RETAIN_OTHER=71 +KEYED=72 +PUBLIC_TRAVERSAL=73 +ID=74 +DOC=75 +MODE=76 +EMITS=77 +RECEIVER=78 +REQUIRES=79 +ANY=80 +GET=81 +SET=82 +WATCH=83 +START=84 +STOP=85 +READ=86 +WRITE=87 +RESOLVE=88 +CONNECT=89 +DISCONNECT=90 +CALL=91 +WATCH_START=92 +WATCH_STOP=93 +SUBSCRIBE=94 +UNSUBSCRIBE=95 +OPTIMISTIC_REGISTER=96 +CRDT=97 +OPTIONAL_ONE=98 +EXACTLY_ONE=99 +MANY_UNIQUE=100 +MANY=101 +ORDERED=102 +UNIT=103 +WATCH_HANDLE=104 +MESSAGE=105 +ATOM_REF=106 +INTERFACE_REF=107 +OPTIONAL=108 +LIST=109 +RECORD=110 +BOOL=111 +BYTES=112 +DOUBLE=113 +INT32=114 +INT64=115 +STRING=116 +UINT32=117 +UINT64=118 +TRUE=119 +FALSE=120 +NULL=121 +ARROW=122 +COLON=123 +SEMI=124 +COMMA=125 +DOT=126 +LBRACE=127 +RBRACE=128 +LBRACK=129 +RBRACK=130 +LPAREN=131 +RPAREN=132 +LT=133 +GT=134 +AMP=135 +EQUAL=136 +INTEGER=137 +JSON_NUMBER=138 +IDENTIFIER=139 +STRING_LITERAL=140 +LINE_COMMENT=141 +BLOCK_COMMENT=142 +WS=143 'workspace'=1 -'result-bytes'=2 -'rpc-calls'=3 -'deadline-ms'=4 -'query'=5 -'reflection'=6 -'specialize'=7 -'root'=8 -'document'=9 -'fragments'=10 -'view'=11 -'max'=12 -'allow'=13 -'poll'=14 -'queryable'=15 -'rpc'=16 -'query-reason'=17 -'type'=18 -'object'=19 -'storable'=20 -'implements'=21 -'ref'=22 -'fragment'=23 -'import'=24 -'external'=25 -'atom'=26 -'interface'=27 -'interfaces'=28 -'package'=29 -'value'=30 -'relation'=31 -'operation'=32 -'function'=33 -'constructor'=34 -'constructs'=35 -'input'=36 -'conform'=37 -'as'=38 -'bind'=39 -'static'=40 -'to'=41 -'private'=42 -'shared'=43 -'state'=44 -'edge'=45 -'projection'=46 -'with'=47 -'using'=48 -'via'=49 -'materialize'=50 -'if'=51 -'absent'=52 -'on'=53 -'policy'=54 -'default'=55 -'source'=56 -'repository'=57 -'commit'=58 -'revision'=59 -'semantic-major'=60 -'on-delete'=61 -'retain-other'=62 -'keyed'=63 -'public-traversal'=64 -'id'=65 -'doc'=66 -'mode'=67 -'emits'=68 -'receiver'=69 -'requires'=70 -'any'=71 -'get'=72 -'set'=73 -'watch'=74 -'start'=75 -'stop'=76 -'read'=77 -'write'=78 -'resolve'=79 -'connect'=80 -'disconnect'=81 -'call'=82 -'watch-start'=83 -'watch-stop'=84 -'subscribe'=85 -'unsubscribe'=86 -'optimistic-register'=87 -'crdt'=88 -'optional-one'=89 -'exactly-one'=90 -'many-unique'=91 -'many'=92 -'ordered'=93 -'unit'=94 -'watch-handle'=95 -'message'=96 -'atom-ref'=97 -'interface-ref'=98 -'optional'=99 -'list'=100 -'record'=101 -'bool'=102 -'bytes'=103 -'double'=104 -'int32'=105 -'int64'=106 -'string'=107 -'uint32'=108 -'uint64'=109 -'true'=110 -'false'=111 -'null'=112 -'->'=113 -':'=114 -';'=115 -','=116 -'.'=117 -'{'=118 -'}'=119 -'['=120 -']'=121 -'('=122 -')'=123 -'<'=124 -'>'=125 -'&'=126 -'='=127 +'execution'=2 +'snapshot'=3 +'transaction'=4 +'remote'=5 +'targets'=6 +'portable'=7 +'replica'=8 +'local'=9 +'from'=10 +'result-bytes'=11 +'rpc-calls'=12 +'deadline-ms'=13 +'query'=14 +'reflection'=15 +'specialize'=16 +'root'=17 +'document'=18 +'fragments'=19 +'view'=20 +'max'=21 +'allow'=22 +'poll'=23 +'queryable'=24 +'rpc'=25 +'query-reason'=26 +'type'=27 +'object'=28 +'storable'=29 +'implements'=30 +'ref'=31 +'fragment'=32 +'import'=33 +'external'=34 +'atom'=35 +'interface'=36 +'interfaces'=37 +'package'=38 +'value'=39 +'relation'=40 +'operation'=41 +'function'=42 +'constructor'=43 +'constructs'=44 +'input'=45 +'conform'=46 +'as'=47 +'bind'=48 +'static'=49 +'to'=50 +'private'=51 +'shared'=52 +'state'=53 +'edge'=54 +'projection'=55 +'with'=56 +'using'=57 +'via'=58 +'materialize'=59 +'if'=60 +'absent'=61 +'on'=62 +'policy'=63 +'default'=64 +'source'=65 +'repository'=66 +'commit'=67 +'revision'=68 +'semantic-major'=69 +'on-delete'=70 +'retain-other'=71 +'keyed'=72 +'public-traversal'=73 +'id'=74 +'doc'=75 +'mode'=76 +'emits'=77 +'receiver'=78 +'requires'=79 +'any'=80 +'get'=81 +'set'=82 +'watch'=83 +'start'=84 +'stop'=85 +'read'=86 +'write'=87 +'resolve'=88 +'connect'=89 +'disconnect'=90 +'call'=91 +'watch-start'=92 +'watch-stop'=93 +'subscribe'=94 +'unsubscribe'=95 +'optimistic-register'=96 +'crdt'=97 +'optional-one'=98 +'exactly-one'=99 +'many-unique'=100 +'many'=101 +'ordered'=102 +'unit'=103 +'watch-handle'=104 +'message'=105 +'atom-ref'=106 +'interface-ref'=107 +'optional'=108 +'list'=109 +'record'=110 +'bool'=111 +'bytes'=112 +'double'=113 +'int32'=114 +'int64'=115 +'string'=116 +'uint32'=117 +'uint64'=118 +'true'=119 +'false'=120 +'null'=121 +'->'=122 +':'=123 +';'=124 +','=125 +'.'=126 +'{'=127 +'}'=128 +'['=129 +']'=130 +'('=131 +')'=132 +'<'=133 +'>'=134 +'&'=135 +'='=136 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.interp b/src/capability-language/generated/QuixosCapabilityLexer.interp index e852b94..44581dc 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.interp +++ b/src/capability-language/generated/QuixosCapabilityLexer.interp @@ -1,6 +1,15 @@ token literal names: null 'workspace' +'execution' +'snapshot' +'transaction' +'remote' +'targets' +'portable' +'replica' +'local' +'from' 'result-bytes' 'rpc-calls' 'deadline-ms' @@ -138,6 +147,15 @@ null token symbolic names: null WORKSPACE +EXECUTION +SNAPSHOT +TRANSACTION +REMOTE +TARGETS +PORTABLE +REPLICA +LOCAL +FROM RESULT_BYTES RPC_CALLS DEADLINE_MS @@ -274,6 +292,15 @@ WS rule names: WORKSPACE +EXECUTION +SNAPSHOT +TRANSACTION +REMOTE +TARGETS +PORTABLE +REPLICA +LOCAL +FROM RESULT_BYTES RPC_CALLS DEADLINE_MS @@ -418,4 +445,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 134, 1285, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 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, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 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, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 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, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 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, 26, 1, 26, 1, 27, 1, 27, 1, 27, 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, 28, 1, 28, 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, 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, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 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, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 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, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 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, 1, 53, 1, 54, 1, 54, 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, 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, 58, 1, 58, 1, 58, 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, 60, 1, 60, 1, 60, 1, 60, 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, 61, 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, 63, 1, 63, 1, 63, 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, 65, 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, 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, 71, 1, 71, 1, 71, 1, 71, 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, 75, 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, 78, 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, 79, 1, 80, 1, 80, 1, 80, 1, 80, 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, 82, 1, 82, 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, 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, 85, 1, 85, 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, 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, 87, 1, 87, 1, 88, 1, 88, 1, 88, 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, 89, 1, 89, 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, 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, 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, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 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, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 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, 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, 100, 1, 100, 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, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 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, 3, 127, 1186, 8, 127, 1, 127, 4, 127, 1189, 8, 127, 11, 127, 12, 127, 1190, 1, 128, 3, 128, 1194, 8, 128, 1, 128, 1, 128, 1, 128, 5, 128, 1199, 8, 128, 10, 128, 12, 128, 1202, 9, 128, 3, 128, 1204, 8, 128, 1, 128, 1, 128, 4, 128, 1208, 8, 128, 11, 128, 12, 128, 1209, 3, 128, 1212, 8, 128, 1, 128, 1, 128, 3, 128, 1216, 8, 128, 1, 128, 4, 128, 1219, 8, 128, 11, 128, 12, 128, 1220, 3, 128, 1223, 8, 128, 1, 129, 1, 129, 5, 129, 1227, 8, 129, 10, 129, 12, 129, 1230, 9, 129, 1, 130, 1, 130, 1, 130, 5, 130, 1235, 8, 130, 10, 130, 12, 130, 1238, 9, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 3, 131, 1250, 8, 131, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 5, 133, 1258, 8, 133, 10, 133, 12, 133, 1261, 9, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 5, 134, 1269, 8, 134, 10, 134, 12, 134, 1272, 9, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 4, 135, 1280, 8, 135, 11, 135, 12, 135, 1281, 1, 135, 1, 135, 1, 1270, 0, 136, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 0, 265, 0, 267, 132, 269, 133, 271, 134, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1299, 0, 1, 1, 0, 0, 0, 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, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 1, 273, 1, 0, 0, 0, 3, 283, 1, 0, 0, 0, 5, 296, 1, 0, 0, 0, 7, 306, 1, 0, 0, 0, 9, 318, 1, 0, 0, 0, 11, 324, 1, 0, 0, 0, 13, 335, 1, 0, 0, 0, 15, 346, 1, 0, 0, 0, 17, 351, 1, 0, 0, 0, 19, 360, 1, 0, 0, 0, 21, 370, 1, 0, 0, 0, 23, 375, 1, 0, 0, 0, 25, 379, 1, 0, 0, 0, 27, 385, 1, 0, 0, 0, 29, 390, 1, 0, 0, 0, 31, 400, 1, 0, 0, 0, 33, 404, 1, 0, 0, 0, 35, 417, 1, 0, 0, 0, 37, 422, 1, 0, 0, 0, 39, 429, 1, 0, 0, 0, 41, 438, 1, 0, 0, 0, 43, 449, 1, 0, 0, 0, 45, 453, 1, 0, 0, 0, 47, 462, 1, 0, 0, 0, 49, 469, 1, 0, 0, 0, 51, 478, 1, 0, 0, 0, 53, 483, 1, 0, 0, 0, 55, 493, 1, 0, 0, 0, 57, 504, 1, 0, 0, 0, 59, 512, 1, 0, 0, 0, 61, 518, 1, 0, 0, 0, 63, 527, 1, 0, 0, 0, 65, 537, 1, 0, 0, 0, 67, 546, 1, 0, 0, 0, 69, 558, 1, 0, 0, 0, 71, 569, 1, 0, 0, 0, 73, 575, 1, 0, 0, 0, 75, 583, 1, 0, 0, 0, 77, 586, 1, 0, 0, 0, 79, 591, 1, 0, 0, 0, 81, 598, 1, 0, 0, 0, 83, 601, 1, 0, 0, 0, 85, 609, 1, 0, 0, 0, 87, 616, 1, 0, 0, 0, 89, 622, 1, 0, 0, 0, 91, 627, 1, 0, 0, 0, 93, 638, 1, 0, 0, 0, 95, 643, 1, 0, 0, 0, 97, 649, 1, 0, 0, 0, 99, 653, 1, 0, 0, 0, 101, 665, 1, 0, 0, 0, 103, 668, 1, 0, 0, 0, 105, 675, 1, 0, 0, 0, 107, 678, 1, 0, 0, 0, 109, 685, 1, 0, 0, 0, 111, 693, 1, 0, 0, 0, 113, 700, 1, 0, 0, 0, 115, 711, 1, 0, 0, 0, 117, 718, 1, 0, 0, 0, 119, 727, 1, 0, 0, 0, 121, 742, 1, 0, 0, 0, 123, 752, 1, 0, 0, 0, 125, 765, 1, 0, 0, 0, 127, 771, 1, 0, 0, 0, 129, 788, 1, 0, 0, 0, 131, 791, 1, 0, 0, 0, 133, 795, 1, 0, 0, 0, 135, 800, 1, 0, 0, 0, 137, 806, 1, 0, 0, 0, 139, 815, 1, 0, 0, 0, 141, 824, 1, 0, 0, 0, 143, 828, 1, 0, 0, 0, 145, 832, 1, 0, 0, 0, 147, 836, 1, 0, 0, 0, 149, 842, 1, 0, 0, 0, 151, 848, 1, 0, 0, 0, 153, 853, 1, 0, 0, 0, 155, 858, 1, 0, 0, 0, 157, 864, 1, 0, 0, 0, 159, 872, 1, 0, 0, 0, 161, 880, 1, 0, 0, 0, 163, 891, 1, 0, 0, 0, 165, 896, 1, 0, 0, 0, 167, 908, 1, 0, 0, 0, 169, 919, 1, 0, 0, 0, 171, 929, 1, 0, 0, 0, 173, 941, 1, 0, 0, 0, 175, 961, 1, 0, 0, 0, 177, 966, 1, 0, 0, 0, 179, 979, 1, 0, 0, 0, 181, 991, 1, 0, 0, 0, 183, 1003, 1, 0, 0, 0, 185, 1008, 1, 0, 0, 0, 187, 1016, 1, 0, 0, 0, 189, 1021, 1, 0, 0, 0, 191, 1034, 1, 0, 0, 0, 193, 1042, 1, 0, 0, 0, 195, 1051, 1, 0, 0, 0, 197, 1065, 1, 0, 0, 0, 199, 1074, 1, 0, 0, 0, 201, 1079, 1, 0, 0, 0, 203, 1086, 1, 0, 0, 0, 205, 1091, 1, 0, 0, 0, 207, 1097, 1, 0, 0, 0, 209, 1104, 1, 0, 0, 0, 211, 1110, 1, 0, 0, 0, 213, 1116, 1, 0, 0, 0, 215, 1123, 1, 0, 0, 0, 217, 1130, 1, 0, 0, 0, 219, 1137, 1, 0, 0, 0, 221, 1142, 1, 0, 0, 0, 223, 1148, 1, 0, 0, 0, 225, 1153, 1, 0, 0, 0, 227, 1156, 1, 0, 0, 0, 229, 1158, 1, 0, 0, 0, 231, 1160, 1, 0, 0, 0, 233, 1162, 1, 0, 0, 0, 235, 1164, 1, 0, 0, 0, 237, 1166, 1, 0, 0, 0, 239, 1168, 1, 0, 0, 0, 241, 1170, 1, 0, 0, 0, 243, 1172, 1, 0, 0, 0, 245, 1174, 1, 0, 0, 0, 247, 1176, 1, 0, 0, 0, 249, 1178, 1, 0, 0, 0, 251, 1180, 1, 0, 0, 0, 253, 1182, 1, 0, 0, 0, 255, 1185, 1, 0, 0, 0, 257, 1193, 1, 0, 0, 0, 259, 1224, 1, 0, 0, 0, 261, 1231, 1, 0, 0, 0, 263, 1241, 1, 0, 0, 0, 265, 1251, 1, 0, 0, 0, 267, 1253, 1, 0, 0, 0, 269, 1264, 1, 0, 0, 0, 271, 1279, 1, 0, 0, 0, 273, 274, 5, 119, 0, 0, 274, 275, 5, 111, 0, 0, 275, 276, 5, 114, 0, 0, 276, 277, 5, 107, 0, 0, 277, 278, 5, 115, 0, 0, 278, 279, 5, 112, 0, 0, 279, 280, 5, 97, 0, 0, 280, 281, 5, 99, 0, 0, 281, 282, 5, 101, 0, 0, 282, 2, 1, 0, 0, 0, 283, 284, 5, 114, 0, 0, 284, 285, 5, 101, 0, 0, 285, 286, 5, 115, 0, 0, 286, 287, 5, 117, 0, 0, 287, 288, 5, 108, 0, 0, 288, 289, 5, 116, 0, 0, 289, 290, 5, 45, 0, 0, 290, 291, 5, 98, 0, 0, 291, 292, 5, 121, 0, 0, 292, 293, 5, 116, 0, 0, 293, 294, 5, 101, 0, 0, 294, 295, 5, 115, 0, 0, 295, 4, 1, 0, 0, 0, 296, 297, 5, 114, 0, 0, 297, 298, 5, 112, 0, 0, 298, 299, 5, 99, 0, 0, 299, 300, 5, 45, 0, 0, 300, 301, 5, 99, 0, 0, 301, 302, 5, 97, 0, 0, 302, 303, 5, 108, 0, 0, 303, 304, 5, 108, 0, 0, 304, 305, 5, 115, 0, 0, 305, 6, 1, 0, 0, 0, 306, 307, 5, 100, 0, 0, 307, 308, 5, 101, 0, 0, 308, 309, 5, 97, 0, 0, 309, 310, 5, 100, 0, 0, 310, 311, 5, 108, 0, 0, 311, 312, 5, 105, 0, 0, 312, 313, 5, 110, 0, 0, 313, 314, 5, 101, 0, 0, 314, 315, 5, 45, 0, 0, 315, 316, 5, 109, 0, 0, 316, 317, 5, 115, 0, 0, 317, 8, 1, 0, 0, 0, 318, 319, 5, 113, 0, 0, 319, 320, 5, 117, 0, 0, 320, 321, 5, 101, 0, 0, 321, 322, 5, 114, 0, 0, 322, 323, 5, 121, 0, 0, 323, 10, 1, 0, 0, 0, 324, 325, 5, 114, 0, 0, 325, 326, 5, 101, 0, 0, 326, 327, 5, 102, 0, 0, 327, 328, 5, 108, 0, 0, 328, 329, 5, 101, 0, 0, 329, 330, 5, 99, 0, 0, 330, 331, 5, 116, 0, 0, 331, 332, 5, 105, 0, 0, 332, 333, 5, 111, 0, 0, 333, 334, 5, 110, 0, 0, 334, 12, 1, 0, 0, 0, 335, 336, 5, 115, 0, 0, 336, 337, 5, 112, 0, 0, 337, 338, 5, 101, 0, 0, 338, 339, 5, 99, 0, 0, 339, 340, 5, 105, 0, 0, 340, 341, 5, 97, 0, 0, 341, 342, 5, 108, 0, 0, 342, 343, 5, 105, 0, 0, 343, 344, 5, 122, 0, 0, 344, 345, 5, 101, 0, 0, 345, 14, 1, 0, 0, 0, 346, 347, 5, 114, 0, 0, 347, 348, 5, 111, 0, 0, 348, 349, 5, 111, 0, 0, 349, 350, 5, 116, 0, 0, 350, 16, 1, 0, 0, 0, 351, 352, 5, 100, 0, 0, 352, 353, 5, 111, 0, 0, 353, 354, 5, 99, 0, 0, 354, 355, 5, 117, 0, 0, 355, 356, 5, 109, 0, 0, 356, 357, 5, 101, 0, 0, 357, 358, 5, 110, 0, 0, 358, 359, 5, 116, 0, 0, 359, 18, 1, 0, 0, 0, 360, 361, 5, 102, 0, 0, 361, 362, 5, 114, 0, 0, 362, 363, 5, 97, 0, 0, 363, 364, 5, 103, 0, 0, 364, 365, 5, 109, 0, 0, 365, 366, 5, 101, 0, 0, 366, 367, 5, 110, 0, 0, 367, 368, 5, 116, 0, 0, 368, 369, 5, 115, 0, 0, 369, 20, 1, 0, 0, 0, 370, 371, 5, 118, 0, 0, 371, 372, 5, 105, 0, 0, 372, 373, 5, 101, 0, 0, 373, 374, 5, 119, 0, 0, 374, 22, 1, 0, 0, 0, 375, 376, 5, 109, 0, 0, 376, 377, 5, 97, 0, 0, 377, 378, 5, 120, 0, 0, 378, 24, 1, 0, 0, 0, 379, 380, 5, 97, 0, 0, 380, 381, 5, 108, 0, 0, 381, 382, 5, 108, 0, 0, 382, 383, 5, 111, 0, 0, 383, 384, 5, 119, 0, 0, 384, 26, 1, 0, 0, 0, 385, 386, 5, 112, 0, 0, 386, 387, 5, 111, 0, 0, 387, 388, 5, 108, 0, 0, 388, 389, 5, 108, 0, 0, 389, 28, 1, 0, 0, 0, 390, 391, 5, 113, 0, 0, 391, 392, 5, 117, 0, 0, 392, 393, 5, 101, 0, 0, 393, 394, 5, 114, 0, 0, 394, 395, 5, 121, 0, 0, 395, 396, 5, 97, 0, 0, 396, 397, 5, 98, 0, 0, 397, 398, 5, 108, 0, 0, 398, 399, 5, 101, 0, 0, 399, 30, 1, 0, 0, 0, 400, 401, 5, 114, 0, 0, 401, 402, 5, 112, 0, 0, 402, 403, 5, 99, 0, 0, 403, 32, 1, 0, 0, 0, 404, 405, 5, 113, 0, 0, 405, 406, 5, 117, 0, 0, 406, 407, 5, 101, 0, 0, 407, 408, 5, 114, 0, 0, 408, 409, 5, 121, 0, 0, 409, 410, 5, 45, 0, 0, 410, 411, 5, 114, 0, 0, 411, 412, 5, 101, 0, 0, 412, 413, 5, 97, 0, 0, 413, 414, 5, 115, 0, 0, 414, 415, 5, 111, 0, 0, 415, 416, 5, 110, 0, 0, 416, 34, 1, 0, 0, 0, 417, 418, 5, 116, 0, 0, 418, 419, 5, 121, 0, 0, 419, 420, 5, 112, 0, 0, 420, 421, 5, 101, 0, 0, 421, 36, 1, 0, 0, 0, 422, 423, 5, 111, 0, 0, 423, 424, 5, 98, 0, 0, 424, 425, 5, 106, 0, 0, 425, 426, 5, 101, 0, 0, 426, 427, 5, 99, 0, 0, 427, 428, 5, 116, 0, 0, 428, 38, 1, 0, 0, 0, 429, 430, 5, 115, 0, 0, 430, 431, 5, 116, 0, 0, 431, 432, 5, 111, 0, 0, 432, 433, 5, 114, 0, 0, 433, 434, 5, 97, 0, 0, 434, 435, 5, 98, 0, 0, 435, 436, 5, 108, 0, 0, 436, 437, 5, 101, 0, 0, 437, 40, 1, 0, 0, 0, 438, 439, 5, 105, 0, 0, 439, 440, 5, 109, 0, 0, 440, 441, 5, 112, 0, 0, 441, 442, 5, 108, 0, 0, 442, 443, 5, 101, 0, 0, 443, 444, 5, 109, 0, 0, 444, 445, 5, 101, 0, 0, 445, 446, 5, 110, 0, 0, 446, 447, 5, 116, 0, 0, 447, 448, 5, 115, 0, 0, 448, 42, 1, 0, 0, 0, 449, 450, 5, 114, 0, 0, 450, 451, 5, 101, 0, 0, 451, 452, 5, 102, 0, 0, 452, 44, 1, 0, 0, 0, 453, 454, 5, 102, 0, 0, 454, 455, 5, 114, 0, 0, 455, 456, 5, 97, 0, 0, 456, 457, 5, 103, 0, 0, 457, 458, 5, 109, 0, 0, 458, 459, 5, 101, 0, 0, 459, 460, 5, 110, 0, 0, 460, 461, 5, 116, 0, 0, 461, 46, 1, 0, 0, 0, 462, 463, 5, 105, 0, 0, 463, 464, 5, 109, 0, 0, 464, 465, 5, 112, 0, 0, 465, 466, 5, 111, 0, 0, 466, 467, 5, 114, 0, 0, 467, 468, 5, 116, 0, 0, 468, 48, 1, 0, 0, 0, 469, 470, 5, 101, 0, 0, 470, 471, 5, 120, 0, 0, 471, 472, 5, 116, 0, 0, 472, 473, 5, 101, 0, 0, 473, 474, 5, 114, 0, 0, 474, 475, 5, 110, 0, 0, 475, 476, 5, 97, 0, 0, 476, 477, 5, 108, 0, 0, 477, 50, 1, 0, 0, 0, 478, 479, 5, 97, 0, 0, 479, 480, 5, 116, 0, 0, 480, 481, 5, 111, 0, 0, 481, 482, 5, 109, 0, 0, 482, 52, 1, 0, 0, 0, 483, 484, 5, 105, 0, 0, 484, 485, 5, 110, 0, 0, 485, 486, 5, 116, 0, 0, 486, 487, 5, 101, 0, 0, 487, 488, 5, 114, 0, 0, 488, 489, 5, 102, 0, 0, 489, 490, 5, 97, 0, 0, 490, 491, 5, 99, 0, 0, 491, 492, 5, 101, 0, 0, 492, 54, 1, 0, 0, 0, 493, 494, 5, 105, 0, 0, 494, 495, 5, 110, 0, 0, 495, 496, 5, 116, 0, 0, 496, 497, 5, 101, 0, 0, 497, 498, 5, 114, 0, 0, 498, 499, 5, 102, 0, 0, 499, 500, 5, 97, 0, 0, 500, 501, 5, 99, 0, 0, 501, 502, 5, 101, 0, 0, 502, 503, 5, 115, 0, 0, 503, 56, 1, 0, 0, 0, 504, 505, 5, 112, 0, 0, 505, 506, 5, 97, 0, 0, 506, 507, 5, 99, 0, 0, 507, 508, 5, 107, 0, 0, 508, 509, 5, 97, 0, 0, 509, 510, 5, 103, 0, 0, 510, 511, 5, 101, 0, 0, 511, 58, 1, 0, 0, 0, 512, 513, 5, 118, 0, 0, 513, 514, 5, 97, 0, 0, 514, 515, 5, 108, 0, 0, 515, 516, 5, 117, 0, 0, 516, 517, 5, 101, 0, 0, 517, 60, 1, 0, 0, 0, 518, 519, 5, 114, 0, 0, 519, 520, 5, 101, 0, 0, 520, 521, 5, 108, 0, 0, 521, 522, 5, 97, 0, 0, 522, 523, 5, 116, 0, 0, 523, 524, 5, 105, 0, 0, 524, 525, 5, 111, 0, 0, 525, 526, 5, 110, 0, 0, 526, 62, 1, 0, 0, 0, 527, 528, 5, 111, 0, 0, 528, 529, 5, 112, 0, 0, 529, 530, 5, 101, 0, 0, 530, 531, 5, 114, 0, 0, 531, 532, 5, 97, 0, 0, 532, 533, 5, 116, 0, 0, 533, 534, 5, 105, 0, 0, 534, 535, 5, 111, 0, 0, 535, 536, 5, 110, 0, 0, 536, 64, 1, 0, 0, 0, 537, 538, 5, 102, 0, 0, 538, 539, 5, 117, 0, 0, 539, 540, 5, 110, 0, 0, 540, 541, 5, 99, 0, 0, 541, 542, 5, 116, 0, 0, 542, 543, 5, 105, 0, 0, 543, 544, 5, 111, 0, 0, 544, 545, 5, 110, 0, 0, 545, 66, 1, 0, 0, 0, 546, 547, 5, 99, 0, 0, 547, 548, 5, 111, 0, 0, 548, 549, 5, 110, 0, 0, 549, 550, 5, 115, 0, 0, 550, 551, 5, 116, 0, 0, 551, 552, 5, 114, 0, 0, 552, 553, 5, 117, 0, 0, 553, 554, 5, 99, 0, 0, 554, 555, 5, 116, 0, 0, 555, 556, 5, 111, 0, 0, 556, 557, 5, 114, 0, 0, 557, 68, 1, 0, 0, 0, 558, 559, 5, 99, 0, 0, 559, 560, 5, 111, 0, 0, 560, 561, 5, 110, 0, 0, 561, 562, 5, 115, 0, 0, 562, 563, 5, 116, 0, 0, 563, 564, 5, 114, 0, 0, 564, 565, 5, 117, 0, 0, 565, 566, 5, 99, 0, 0, 566, 567, 5, 116, 0, 0, 567, 568, 5, 115, 0, 0, 568, 70, 1, 0, 0, 0, 569, 570, 5, 105, 0, 0, 570, 571, 5, 110, 0, 0, 571, 572, 5, 112, 0, 0, 572, 573, 5, 117, 0, 0, 573, 574, 5, 116, 0, 0, 574, 72, 1, 0, 0, 0, 575, 576, 5, 99, 0, 0, 576, 577, 5, 111, 0, 0, 577, 578, 5, 110, 0, 0, 578, 579, 5, 102, 0, 0, 579, 580, 5, 111, 0, 0, 580, 581, 5, 114, 0, 0, 581, 582, 5, 109, 0, 0, 582, 74, 1, 0, 0, 0, 583, 584, 5, 97, 0, 0, 584, 585, 5, 115, 0, 0, 585, 76, 1, 0, 0, 0, 586, 587, 5, 98, 0, 0, 587, 588, 5, 105, 0, 0, 588, 589, 5, 110, 0, 0, 589, 590, 5, 100, 0, 0, 590, 78, 1, 0, 0, 0, 591, 592, 5, 115, 0, 0, 592, 593, 5, 116, 0, 0, 593, 594, 5, 97, 0, 0, 594, 595, 5, 116, 0, 0, 595, 596, 5, 105, 0, 0, 596, 597, 5, 99, 0, 0, 597, 80, 1, 0, 0, 0, 598, 599, 5, 116, 0, 0, 599, 600, 5, 111, 0, 0, 600, 82, 1, 0, 0, 0, 601, 602, 5, 112, 0, 0, 602, 603, 5, 114, 0, 0, 603, 604, 5, 105, 0, 0, 604, 605, 5, 118, 0, 0, 605, 606, 5, 97, 0, 0, 606, 607, 5, 116, 0, 0, 607, 608, 5, 101, 0, 0, 608, 84, 1, 0, 0, 0, 609, 610, 5, 115, 0, 0, 610, 611, 5, 104, 0, 0, 611, 612, 5, 97, 0, 0, 612, 613, 5, 114, 0, 0, 613, 614, 5, 101, 0, 0, 614, 615, 5, 100, 0, 0, 615, 86, 1, 0, 0, 0, 616, 617, 5, 115, 0, 0, 617, 618, 5, 116, 0, 0, 618, 619, 5, 97, 0, 0, 619, 620, 5, 116, 0, 0, 620, 621, 5, 101, 0, 0, 621, 88, 1, 0, 0, 0, 622, 623, 5, 101, 0, 0, 623, 624, 5, 100, 0, 0, 624, 625, 5, 103, 0, 0, 625, 626, 5, 101, 0, 0, 626, 90, 1, 0, 0, 0, 627, 628, 5, 112, 0, 0, 628, 629, 5, 114, 0, 0, 629, 630, 5, 111, 0, 0, 630, 631, 5, 106, 0, 0, 631, 632, 5, 101, 0, 0, 632, 633, 5, 99, 0, 0, 633, 634, 5, 116, 0, 0, 634, 635, 5, 105, 0, 0, 635, 636, 5, 111, 0, 0, 636, 637, 5, 110, 0, 0, 637, 92, 1, 0, 0, 0, 638, 639, 5, 119, 0, 0, 639, 640, 5, 105, 0, 0, 640, 641, 5, 116, 0, 0, 641, 642, 5, 104, 0, 0, 642, 94, 1, 0, 0, 0, 643, 644, 5, 117, 0, 0, 644, 645, 5, 115, 0, 0, 645, 646, 5, 105, 0, 0, 646, 647, 5, 110, 0, 0, 647, 648, 5, 103, 0, 0, 648, 96, 1, 0, 0, 0, 649, 650, 5, 118, 0, 0, 650, 651, 5, 105, 0, 0, 651, 652, 5, 97, 0, 0, 652, 98, 1, 0, 0, 0, 653, 654, 5, 109, 0, 0, 654, 655, 5, 97, 0, 0, 655, 656, 5, 116, 0, 0, 656, 657, 5, 101, 0, 0, 657, 658, 5, 114, 0, 0, 658, 659, 5, 105, 0, 0, 659, 660, 5, 97, 0, 0, 660, 661, 5, 108, 0, 0, 661, 662, 5, 105, 0, 0, 662, 663, 5, 122, 0, 0, 663, 664, 5, 101, 0, 0, 664, 100, 1, 0, 0, 0, 665, 666, 5, 105, 0, 0, 666, 667, 5, 102, 0, 0, 667, 102, 1, 0, 0, 0, 668, 669, 5, 97, 0, 0, 669, 670, 5, 98, 0, 0, 670, 671, 5, 115, 0, 0, 671, 672, 5, 101, 0, 0, 672, 673, 5, 110, 0, 0, 673, 674, 5, 116, 0, 0, 674, 104, 1, 0, 0, 0, 675, 676, 5, 111, 0, 0, 676, 677, 5, 110, 0, 0, 677, 106, 1, 0, 0, 0, 678, 679, 5, 112, 0, 0, 679, 680, 5, 111, 0, 0, 680, 681, 5, 108, 0, 0, 681, 682, 5, 105, 0, 0, 682, 683, 5, 99, 0, 0, 683, 684, 5, 121, 0, 0, 684, 108, 1, 0, 0, 0, 685, 686, 5, 100, 0, 0, 686, 687, 5, 101, 0, 0, 687, 688, 5, 102, 0, 0, 688, 689, 5, 97, 0, 0, 689, 690, 5, 117, 0, 0, 690, 691, 5, 108, 0, 0, 691, 692, 5, 116, 0, 0, 692, 110, 1, 0, 0, 0, 693, 694, 5, 115, 0, 0, 694, 695, 5, 111, 0, 0, 695, 696, 5, 117, 0, 0, 696, 697, 5, 114, 0, 0, 697, 698, 5, 99, 0, 0, 698, 699, 5, 101, 0, 0, 699, 112, 1, 0, 0, 0, 700, 701, 5, 114, 0, 0, 701, 702, 5, 101, 0, 0, 702, 703, 5, 112, 0, 0, 703, 704, 5, 111, 0, 0, 704, 705, 5, 115, 0, 0, 705, 706, 5, 105, 0, 0, 706, 707, 5, 116, 0, 0, 707, 708, 5, 111, 0, 0, 708, 709, 5, 114, 0, 0, 709, 710, 5, 121, 0, 0, 710, 114, 1, 0, 0, 0, 711, 712, 5, 99, 0, 0, 712, 713, 5, 111, 0, 0, 713, 714, 5, 109, 0, 0, 714, 715, 5, 109, 0, 0, 715, 716, 5, 105, 0, 0, 716, 717, 5, 116, 0, 0, 717, 116, 1, 0, 0, 0, 718, 719, 5, 114, 0, 0, 719, 720, 5, 101, 0, 0, 720, 721, 5, 118, 0, 0, 721, 722, 5, 105, 0, 0, 722, 723, 5, 115, 0, 0, 723, 724, 5, 105, 0, 0, 724, 725, 5, 111, 0, 0, 725, 726, 5, 110, 0, 0, 726, 118, 1, 0, 0, 0, 727, 728, 5, 115, 0, 0, 728, 729, 5, 101, 0, 0, 729, 730, 5, 109, 0, 0, 730, 731, 5, 97, 0, 0, 731, 732, 5, 110, 0, 0, 732, 733, 5, 116, 0, 0, 733, 734, 5, 105, 0, 0, 734, 735, 5, 99, 0, 0, 735, 736, 5, 45, 0, 0, 736, 737, 5, 109, 0, 0, 737, 738, 5, 97, 0, 0, 738, 739, 5, 106, 0, 0, 739, 740, 5, 111, 0, 0, 740, 741, 5, 114, 0, 0, 741, 120, 1, 0, 0, 0, 742, 743, 5, 111, 0, 0, 743, 744, 5, 110, 0, 0, 744, 745, 5, 45, 0, 0, 745, 746, 5, 100, 0, 0, 746, 747, 5, 101, 0, 0, 747, 748, 5, 108, 0, 0, 748, 749, 5, 101, 0, 0, 749, 750, 5, 116, 0, 0, 750, 751, 5, 101, 0, 0, 751, 122, 1, 0, 0, 0, 752, 753, 5, 114, 0, 0, 753, 754, 5, 101, 0, 0, 754, 755, 5, 116, 0, 0, 755, 756, 5, 97, 0, 0, 756, 757, 5, 105, 0, 0, 757, 758, 5, 110, 0, 0, 758, 759, 5, 45, 0, 0, 759, 760, 5, 111, 0, 0, 760, 761, 5, 116, 0, 0, 761, 762, 5, 104, 0, 0, 762, 763, 5, 101, 0, 0, 763, 764, 5, 114, 0, 0, 764, 124, 1, 0, 0, 0, 765, 766, 5, 107, 0, 0, 766, 767, 5, 101, 0, 0, 767, 768, 5, 121, 0, 0, 768, 769, 5, 101, 0, 0, 769, 770, 5, 100, 0, 0, 770, 126, 1, 0, 0, 0, 771, 772, 5, 112, 0, 0, 772, 773, 5, 117, 0, 0, 773, 774, 5, 98, 0, 0, 774, 775, 5, 108, 0, 0, 775, 776, 5, 105, 0, 0, 776, 777, 5, 99, 0, 0, 777, 778, 5, 45, 0, 0, 778, 779, 5, 116, 0, 0, 779, 780, 5, 114, 0, 0, 780, 781, 5, 97, 0, 0, 781, 782, 5, 118, 0, 0, 782, 783, 5, 101, 0, 0, 783, 784, 5, 114, 0, 0, 784, 785, 5, 115, 0, 0, 785, 786, 5, 97, 0, 0, 786, 787, 5, 108, 0, 0, 787, 128, 1, 0, 0, 0, 788, 789, 5, 105, 0, 0, 789, 790, 5, 100, 0, 0, 790, 130, 1, 0, 0, 0, 791, 792, 5, 100, 0, 0, 792, 793, 5, 111, 0, 0, 793, 794, 5, 99, 0, 0, 794, 132, 1, 0, 0, 0, 795, 796, 5, 109, 0, 0, 796, 797, 5, 111, 0, 0, 797, 798, 5, 100, 0, 0, 798, 799, 5, 101, 0, 0, 799, 134, 1, 0, 0, 0, 800, 801, 5, 101, 0, 0, 801, 802, 5, 109, 0, 0, 802, 803, 5, 105, 0, 0, 803, 804, 5, 116, 0, 0, 804, 805, 5, 115, 0, 0, 805, 136, 1, 0, 0, 0, 806, 807, 5, 114, 0, 0, 807, 808, 5, 101, 0, 0, 808, 809, 5, 99, 0, 0, 809, 810, 5, 101, 0, 0, 810, 811, 5, 105, 0, 0, 811, 812, 5, 118, 0, 0, 812, 813, 5, 101, 0, 0, 813, 814, 5, 114, 0, 0, 814, 138, 1, 0, 0, 0, 815, 816, 5, 114, 0, 0, 816, 817, 5, 101, 0, 0, 817, 818, 5, 113, 0, 0, 818, 819, 5, 117, 0, 0, 819, 820, 5, 105, 0, 0, 820, 821, 5, 114, 0, 0, 821, 822, 5, 101, 0, 0, 822, 823, 5, 115, 0, 0, 823, 140, 1, 0, 0, 0, 824, 825, 5, 97, 0, 0, 825, 826, 5, 110, 0, 0, 826, 827, 5, 121, 0, 0, 827, 142, 1, 0, 0, 0, 828, 829, 5, 103, 0, 0, 829, 830, 5, 101, 0, 0, 830, 831, 5, 116, 0, 0, 831, 144, 1, 0, 0, 0, 832, 833, 5, 115, 0, 0, 833, 834, 5, 101, 0, 0, 834, 835, 5, 116, 0, 0, 835, 146, 1, 0, 0, 0, 836, 837, 5, 119, 0, 0, 837, 838, 5, 97, 0, 0, 838, 839, 5, 116, 0, 0, 839, 840, 5, 99, 0, 0, 840, 841, 5, 104, 0, 0, 841, 148, 1, 0, 0, 0, 842, 843, 5, 115, 0, 0, 843, 844, 5, 116, 0, 0, 844, 845, 5, 97, 0, 0, 845, 846, 5, 114, 0, 0, 846, 847, 5, 116, 0, 0, 847, 150, 1, 0, 0, 0, 848, 849, 5, 115, 0, 0, 849, 850, 5, 116, 0, 0, 850, 851, 5, 111, 0, 0, 851, 852, 5, 112, 0, 0, 852, 152, 1, 0, 0, 0, 853, 854, 5, 114, 0, 0, 854, 855, 5, 101, 0, 0, 855, 856, 5, 97, 0, 0, 856, 857, 5, 100, 0, 0, 857, 154, 1, 0, 0, 0, 858, 859, 5, 119, 0, 0, 859, 860, 5, 114, 0, 0, 860, 861, 5, 105, 0, 0, 861, 862, 5, 116, 0, 0, 862, 863, 5, 101, 0, 0, 863, 156, 1, 0, 0, 0, 864, 865, 5, 114, 0, 0, 865, 866, 5, 101, 0, 0, 866, 867, 5, 115, 0, 0, 867, 868, 5, 111, 0, 0, 868, 869, 5, 108, 0, 0, 869, 870, 5, 118, 0, 0, 870, 871, 5, 101, 0, 0, 871, 158, 1, 0, 0, 0, 872, 873, 5, 99, 0, 0, 873, 874, 5, 111, 0, 0, 874, 875, 5, 110, 0, 0, 875, 876, 5, 110, 0, 0, 876, 877, 5, 101, 0, 0, 877, 878, 5, 99, 0, 0, 878, 879, 5, 116, 0, 0, 879, 160, 1, 0, 0, 0, 880, 881, 5, 100, 0, 0, 881, 882, 5, 105, 0, 0, 882, 883, 5, 115, 0, 0, 883, 884, 5, 99, 0, 0, 884, 885, 5, 111, 0, 0, 885, 886, 5, 110, 0, 0, 886, 887, 5, 110, 0, 0, 887, 888, 5, 101, 0, 0, 888, 889, 5, 99, 0, 0, 889, 890, 5, 116, 0, 0, 890, 162, 1, 0, 0, 0, 891, 892, 5, 99, 0, 0, 892, 893, 5, 97, 0, 0, 893, 894, 5, 108, 0, 0, 894, 895, 5, 108, 0, 0, 895, 164, 1, 0, 0, 0, 896, 897, 5, 119, 0, 0, 897, 898, 5, 97, 0, 0, 898, 899, 5, 116, 0, 0, 899, 900, 5, 99, 0, 0, 900, 901, 5, 104, 0, 0, 901, 902, 5, 45, 0, 0, 902, 903, 5, 115, 0, 0, 903, 904, 5, 116, 0, 0, 904, 905, 5, 97, 0, 0, 905, 906, 5, 114, 0, 0, 906, 907, 5, 116, 0, 0, 907, 166, 1, 0, 0, 0, 908, 909, 5, 119, 0, 0, 909, 910, 5, 97, 0, 0, 910, 911, 5, 116, 0, 0, 911, 912, 5, 99, 0, 0, 912, 913, 5, 104, 0, 0, 913, 914, 5, 45, 0, 0, 914, 915, 5, 115, 0, 0, 915, 916, 5, 116, 0, 0, 916, 917, 5, 111, 0, 0, 917, 918, 5, 112, 0, 0, 918, 168, 1, 0, 0, 0, 919, 920, 5, 115, 0, 0, 920, 921, 5, 117, 0, 0, 921, 922, 5, 98, 0, 0, 922, 923, 5, 115, 0, 0, 923, 924, 5, 99, 0, 0, 924, 925, 5, 114, 0, 0, 925, 926, 5, 105, 0, 0, 926, 927, 5, 98, 0, 0, 927, 928, 5, 101, 0, 0, 928, 170, 1, 0, 0, 0, 929, 930, 5, 117, 0, 0, 930, 931, 5, 110, 0, 0, 931, 932, 5, 115, 0, 0, 932, 933, 5, 117, 0, 0, 933, 934, 5, 98, 0, 0, 934, 935, 5, 115, 0, 0, 935, 936, 5, 99, 0, 0, 936, 937, 5, 114, 0, 0, 937, 938, 5, 105, 0, 0, 938, 939, 5, 98, 0, 0, 939, 940, 5, 101, 0, 0, 940, 172, 1, 0, 0, 0, 941, 942, 5, 111, 0, 0, 942, 943, 5, 112, 0, 0, 943, 944, 5, 116, 0, 0, 944, 945, 5, 105, 0, 0, 945, 946, 5, 109, 0, 0, 946, 947, 5, 105, 0, 0, 947, 948, 5, 115, 0, 0, 948, 949, 5, 116, 0, 0, 949, 950, 5, 105, 0, 0, 950, 951, 5, 99, 0, 0, 951, 952, 5, 45, 0, 0, 952, 953, 5, 114, 0, 0, 953, 954, 5, 101, 0, 0, 954, 955, 5, 103, 0, 0, 955, 956, 5, 105, 0, 0, 956, 957, 5, 115, 0, 0, 957, 958, 5, 116, 0, 0, 958, 959, 5, 101, 0, 0, 959, 960, 5, 114, 0, 0, 960, 174, 1, 0, 0, 0, 961, 962, 5, 99, 0, 0, 962, 963, 5, 114, 0, 0, 963, 964, 5, 100, 0, 0, 964, 965, 5, 116, 0, 0, 965, 176, 1, 0, 0, 0, 966, 967, 5, 111, 0, 0, 967, 968, 5, 112, 0, 0, 968, 969, 5, 116, 0, 0, 969, 970, 5, 105, 0, 0, 970, 971, 5, 111, 0, 0, 971, 972, 5, 110, 0, 0, 972, 973, 5, 97, 0, 0, 973, 974, 5, 108, 0, 0, 974, 975, 5, 45, 0, 0, 975, 976, 5, 111, 0, 0, 976, 977, 5, 110, 0, 0, 977, 978, 5, 101, 0, 0, 978, 178, 1, 0, 0, 0, 979, 980, 5, 101, 0, 0, 980, 981, 5, 120, 0, 0, 981, 982, 5, 97, 0, 0, 982, 983, 5, 99, 0, 0, 983, 984, 5, 116, 0, 0, 984, 985, 5, 108, 0, 0, 985, 986, 5, 121, 0, 0, 986, 987, 5, 45, 0, 0, 987, 988, 5, 111, 0, 0, 988, 989, 5, 110, 0, 0, 989, 990, 5, 101, 0, 0, 990, 180, 1, 0, 0, 0, 991, 992, 5, 109, 0, 0, 992, 993, 5, 97, 0, 0, 993, 994, 5, 110, 0, 0, 994, 995, 5, 121, 0, 0, 995, 996, 5, 45, 0, 0, 996, 997, 5, 117, 0, 0, 997, 998, 5, 110, 0, 0, 998, 999, 5, 105, 0, 0, 999, 1000, 5, 113, 0, 0, 1000, 1001, 5, 117, 0, 0, 1001, 1002, 5, 101, 0, 0, 1002, 182, 1, 0, 0, 0, 1003, 1004, 5, 109, 0, 0, 1004, 1005, 5, 97, 0, 0, 1005, 1006, 5, 110, 0, 0, 1006, 1007, 5, 121, 0, 0, 1007, 184, 1, 0, 0, 0, 1008, 1009, 5, 111, 0, 0, 1009, 1010, 5, 114, 0, 0, 1010, 1011, 5, 100, 0, 0, 1011, 1012, 5, 101, 0, 0, 1012, 1013, 5, 114, 0, 0, 1013, 1014, 5, 101, 0, 0, 1014, 1015, 5, 100, 0, 0, 1015, 186, 1, 0, 0, 0, 1016, 1017, 5, 117, 0, 0, 1017, 1018, 5, 110, 0, 0, 1018, 1019, 5, 105, 0, 0, 1019, 1020, 5, 116, 0, 0, 1020, 188, 1, 0, 0, 0, 1021, 1022, 5, 119, 0, 0, 1022, 1023, 5, 97, 0, 0, 1023, 1024, 5, 116, 0, 0, 1024, 1025, 5, 99, 0, 0, 1025, 1026, 5, 104, 0, 0, 1026, 1027, 5, 45, 0, 0, 1027, 1028, 5, 104, 0, 0, 1028, 1029, 5, 97, 0, 0, 1029, 1030, 5, 110, 0, 0, 1030, 1031, 5, 100, 0, 0, 1031, 1032, 5, 108, 0, 0, 1032, 1033, 5, 101, 0, 0, 1033, 190, 1, 0, 0, 0, 1034, 1035, 5, 109, 0, 0, 1035, 1036, 5, 101, 0, 0, 1036, 1037, 5, 115, 0, 0, 1037, 1038, 5, 115, 0, 0, 1038, 1039, 5, 97, 0, 0, 1039, 1040, 5, 103, 0, 0, 1040, 1041, 5, 101, 0, 0, 1041, 192, 1, 0, 0, 0, 1042, 1043, 5, 97, 0, 0, 1043, 1044, 5, 116, 0, 0, 1044, 1045, 5, 111, 0, 0, 1045, 1046, 5, 109, 0, 0, 1046, 1047, 5, 45, 0, 0, 1047, 1048, 5, 114, 0, 0, 1048, 1049, 5, 101, 0, 0, 1049, 1050, 5, 102, 0, 0, 1050, 194, 1, 0, 0, 0, 1051, 1052, 5, 105, 0, 0, 1052, 1053, 5, 110, 0, 0, 1053, 1054, 5, 116, 0, 0, 1054, 1055, 5, 101, 0, 0, 1055, 1056, 5, 114, 0, 0, 1056, 1057, 5, 102, 0, 0, 1057, 1058, 5, 97, 0, 0, 1058, 1059, 5, 99, 0, 0, 1059, 1060, 5, 101, 0, 0, 1060, 1061, 5, 45, 0, 0, 1061, 1062, 5, 114, 0, 0, 1062, 1063, 5, 101, 0, 0, 1063, 1064, 5, 102, 0, 0, 1064, 196, 1, 0, 0, 0, 1065, 1066, 5, 111, 0, 0, 1066, 1067, 5, 112, 0, 0, 1067, 1068, 5, 116, 0, 0, 1068, 1069, 5, 105, 0, 0, 1069, 1070, 5, 111, 0, 0, 1070, 1071, 5, 110, 0, 0, 1071, 1072, 5, 97, 0, 0, 1072, 1073, 5, 108, 0, 0, 1073, 198, 1, 0, 0, 0, 1074, 1075, 5, 108, 0, 0, 1075, 1076, 5, 105, 0, 0, 1076, 1077, 5, 115, 0, 0, 1077, 1078, 5, 116, 0, 0, 1078, 200, 1, 0, 0, 0, 1079, 1080, 5, 114, 0, 0, 1080, 1081, 5, 101, 0, 0, 1081, 1082, 5, 99, 0, 0, 1082, 1083, 5, 111, 0, 0, 1083, 1084, 5, 114, 0, 0, 1084, 1085, 5, 100, 0, 0, 1085, 202, 1, 0, 0, 0, 1086, 1087, 5, 98, 0, 0, 1087, 1088, 5, 111, 0, 0, 1088, 1089, 5, 111, 0, 0, 1089, 1090, 5, 108, 0, 0, 1090, 204, 1, 0, 0, 0, 1091, 1092, 5, 98, 0, 0, 1092, 1093, 5, 121, 0, 0, 1093, 1094, 5, 116, 0, 0, 1094, 1095, 5, 101, 0, 0, 1095, 1096, 5, 115, 0, 0, 1096, 206, 1, 0, 0, 0, 1097, 1098, 5, 100, 0, 0, 1098, 1099, 5, 111, 0, 0, 1099, 1100, 5, 117, 0, 0, 1100, 1101, 5, 98, 0, 0, 1101, 1102, 5, 108, 0, 0, 1102, 1103, 5, 101, 0, 0, 1103, 208, 1, 0, 0, 0, 1104, 1105, 5, 105, 0, 0, 1105, 1106, 5, 110, 0, 0, 1106, 1107, 5, 116, 0, 0, 1107, 1108, 5, 51, 0, 0, 1108, 1109, 5, 50, 0, 0, 1109, 210, 1, 0, 0, 0, 1110, 1111, 5, 105, 0, 0, 1111, 1112, 5, 110, 0, 0, 1112, 1113, 5, 116, 0, 0, 1113, 1114, 5, 54, 0, 0, 1114, 1115, 5, 52, 0, 0, 1115, 212, 1, 0, 0, 0, 1116, 1117, 5, 115, 0, 0, 1117, 1118, 5, 116, 0, 0, 1118, 1119, 5, 114, 0, 0, 1119, 1120, 5, 105, 0, 0, 1120, 1121, 5, 110, 0, 0, 1121, 1122, 5, 103, 0, 0, 1122, 214, 1, 0, 0, 0, 1123, 1124, 5, 117, 0, 0, 1124, 1125, 5, 105, 0, 0, 1125, 1126, 5, 110, 0, 0, 1126, 1127, 5, 116, 0, 0, 1127, 1128, 5, 51, 0, 0, 1128, 1129, 5, 50, 0, 0, 1129, 216, 1, 0, 0, 0, 1130, 1131, 5, 117, 0, 0, 1131, 1132, 5, 105, 0, 0, 1132, 1133, 5, 110, 0, 0, 1133, 1134, 5, 116, 0, 0, 1134, 1135, 5, 54, 0, 0, 1135, 1136, 5, 52, 0, 0, 1136, 218, 1, 0, 0, 0, 1137, 1138, 5, 116, 0, 0, 1138, 1139, 5, 114, 0, 0, 1139, 1140, 5, 117, 0, 0, 1140, 1141, 5, 101, 0, 0, 1141, 220, 1, 0, 0, 0, 1142, 1143, 5, 102, 0, 0, 1143, 1144, 5, 97, 0, 0, 1144, 1145, 5, 108, 0, 0, 1145, 1146, 5, 115, 0, 0, 1146, 1147, 5, 101, 0, 0, 1147, 222, 1, 0, 0, 0, 1148, 1149, 5, 110, 0, 0, 1149, 1150, 5, 117, 0, 0, 1150, 1151, 5, 108, 0, 0, 1151, 1152, 5, 108, 0, 0, 1152, 224, 1, 0, 0, 0, 1153, 1154, 5, 45, 0, 0, 1154, 1155, 5, 62, 0, 0, 1155, 226, 1, 0, 0, 0, 1156, 1157, 5, 58, 0, 0, 1157, 228, 1, 0, 0, 0, 1158, 1159, 5, 59, 0, 0, 1159, 230, 1, 0, 0, 0, 1160, 1161, 5, 44, 0, 0, 1161, 232, 1, 0, 0, 0, 1162, 1163, 5, 46, 0, 0, 1163, 234, 1, 0, 0, 0, 1164, 1165, 5, 123, 0, 0, 1165, 236, 1, 0, 0, 0, 1166, 1167, 5, 125, 0, 0, 1167, 238, 1, 0, 0, 0, 1168, 1169, 5, 91, 0, 0, 1169, 240, 1, 0, 0, 0, 1170, 1171, 5, 93, 0, 0, 1171, 242, 1, 0, 0, 0, 1172, 1173, 5, 40, 0, 0, 1173, 244, 1, 0, 0, 0, 1174, 1175, 5, 41, 0, 0, 1175, 246, 1, 0, 0, 0, 1176, 1177, 5, 60, 0, 0, 1177, 248, 1, 0, 0, 0, 1178, 1179, 5, 62, 0, 0, 1179, 250, 1, 0, 0, 0, 1180, 1181, 5, 38, 0, 0, 1181, 252, 1, 0, 0, 0, 1182, 1183, 5, 61, 0, 0, 1183, 254, 1, 0, 0, 0, 1184, 1186, 5, 45, 0, 0, 1185, 1184, 1, 0, 0, 0, 1185, 1186, 1, 0, 0, 0, 1186, 1188, 1, 0, 0, 0, 1187, 1189, 7, 0, 0, 0, 1188, 1187, 1, 0, 0, 0, 1189, 1190, 1, 0, 0, 0, 1190, 1188, 1, 0, 0, 0, 1190, 1191, 1, 0, 0, 0, 1191, 256, 1, 0, 0, 0, 1192, 1194, 5, 45, 0, 0, 1193, 1192, 1, 0, 0, 0, 1193, 1194, 1, 0, 0, 0, 1194, 1203, 1, 0, 0, 0, 1195, 1204, 5, 48, 0, 0, 1196, 1200, 7, 1, 0, 0, 1197, 1199, 7, 0, 0, 0, 1198, 1197, 1, 0, 0, 0, 1199, 1202, 1, 0, 0, 0, 1200, 1198, 1, 0, 0, 0, 1200, 1201, 1, 0, 0, 0, 1201, 1204, 1, 0, 0, 0, 1202, 1200, 1, 0, 0, 0, 1203, 1195, 1, 0, 0, 0, 1203, 1196, 1, 0, 0, 0, 1204, 1211, 1, 0, 0, 0, 1205, 1207, 5, 46, 0, 0, 1206, 1208, 7, 0, 0, 0, 1207, 1206, 1, 0, 0, 0, 1208, 1209, 1, 0, 0, 0, 1209, 1207, 1, 0, 0, 0, 1209, 1210, 1, 0, 0, 0, 1210, 1212, 1, 0, 0, 0, 1211, 1205, 1, 0, 0, 0, 1211, 1212, 1, 0, 0, 0, 1212, 1222, 1, 0, 0, 0, 1213, 1215, 7, 2, 0, 0, 1214, 1216, 7, 3, 0, 0, 1215, 1214, 1, 0, 0, 0, 1215, 1216, 1, 0, 0, 0, 1216, 1218, 1, 0, 0, 0, 1217, 1219, 7, 0, 0, 0, 1218, 1217, 1, 0, 0, 0, 1219, 1220, 1, 0, 0, 0, 1220, 1218, 1, 0, 0, 0, 1220, 1221, 1, 0, 0, 0, 1221, 1223, 1, 0, 0, 0, 1222, 1213, 1, 0, 0, 0, 1222, 1223, 1, 0, 0, 0, 1223, 258, 1, 0, 0, 0, 1224, 1228, 7, 4, 0, 0, 1225, 1227, 7, 5, 0, 0, 1226, 1225, 1, 0, 0, 0, 1227, 1230, 1, 0, 0, 0, 1228, 1226, 1, 0, 0, 0, 1228, 1229, 1, 0, 0, 0, 1229, 260, 1, 0, 0, 0, 1230, 1228, 1, 0, 0, 0, 1231, 1236, 5, 34, 0, 0, 1232, 1235, 3, 263, 131, 0, 1233, 1235, 8, 6, 0, 0, 1234, 1232, 1, 0, 0, 0, 1234, 1233, 1, 0, 0, 0, 1235, 1238, 1, 0, 0, 0, 1236, 1234, 1, 0, 0, 0, 1236, 1237, 1, 0, 0, 0, 1237, 1239, 1, 0, 0, 0, 1238, 1236, 1, 0, 0, 0, 1239, 1240, 5, 34, 0, 0, 1240, 262, 1, 0, 0, 0, 1241, 1249, 5, 92, 0, 0, 1242, 1250, 7, 7, 0, 0, 1243, 1244, 5, 117, 0, 0, 1244, 1245, 3, 265, 132, 0, 1245, 1246, 3, 265, 132, 0, 1246, 1247, 3, 265, 132, 0, 1247, 1248, 3, 265, 132, 0, 1248, 1250, 1, 0, 0, 0, 1249, 1242, 1, 0, 0, 0, 1249, 1243, 1, 0, 0, 0, 1250, 264, 1, 0, 0, 0, 1251, 1252, 7, 8, 0, 0, 1252, 266, 1, 0, 0, 0, 1253, 1254, 5, 47, 0, 0, 1254, 1255, 5, 47, 0, 0, 1255, 1259, 1, 0, 0, 0, 1256, 1258, 8, 9, 0, 0, 1257, 1256, 1, 0, 0, 0, 1258, 1261, 1, 0, 0, 0, 1259, 1257, 1, 0, 0, 0, 1259, 1260, 1, 0, 0, 0, 1260, 1262, 1, 0, 0, 0, 1261, 1259, 1, 0, 0, 0, 1262, 1263, 6, 133, 0, 0, 1263, 268, 1, 0, 0, 0, 1264, 1265, 5, 47, 0, 0, 1265, 1266, 5, 42, 0, 0, 1266, 1270, 1, 0, 0, 0, 1267, 1269, 9, 0, 0, 0, 1268, 1267, 1, 0, 0, 0, 1269, 1272, 1, 0, 0, 0, 1270, 1271, 1, 0, 0, 0, 1270, 1268, 1, 0, 0, 0, 1271, 1273, 1, 0, 0, 0, 1272, 1270, 1, 0, 0, 0, 1273, 1274, 5, 42, 0, 0, 1274, 1275, 5, 47, 0, 0, 1275, 1276, 1, 0, 0, 0, 1276, 1277, 6, 134, 0, 0, 1277, 270, 1, 0, 0, 0, 1278, 1280, 7, 10, 0, 0, 1279, 1278, 1, 0, 0, 0, 1280, 1281, 1, 0, 0, 0, 1281, 1279, 1, 0, 0, 0, 1281, 1282, 1, 0, 0, 0, 1282, 1283, 1, 0, 0, 0, 1283, 1284, 6, 135, 0, 0, 1284, 272, 1, 0, 0, 0, 18, 0, 1185, 1190, 1193, 1200, 1203, 1209, 1211, 1215, 1220, 1222, 1228, 1234, 1236, 1249, 1259, 1270, 1281, 1, 0, 1, 0] \ No newline at end of file +[4, 0, 143, 1377, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 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, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 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, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 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, 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, 21, 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, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 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, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 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, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 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, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 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, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 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, 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, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 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, 51, 1, 51, 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, 54, 1, 54, 1, 54, 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, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 62, 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, 63, 1, 64, 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, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 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, 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, 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, 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, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 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, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 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, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 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, 91, 1, 91, 1, 91, 1, 91, 1, 91, 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, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 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, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 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, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 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, 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, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 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, 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, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 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, 3, 136, 1278, 8, 136, 1, 136, 4, 136, 1281, 8, 136, 11, 136, 12, 136, 1282, 1, 137, 3, 137, 1286, 8, 137, 1, 137, 1, 137, 1, 137, 5, 137, 1291, 8, 137, 10, 137, 12, 137, 1294, 9, 137, 3, 137, 1296, 8, 137, 1, 137, 1, 137, 4, 137, 1300, 8, 137, 11, 137, 12, 137, 1301, 3, 137, 1304, 8, 137, 1, 137, 1, 137, 3, 137, 1308, 8, 137, 1, 137, 4, 137, 1311, 8, 137, 11, 137, 12, 137, 1312, 3, 137, 1315, 8, 137, 1, 138, 1, 138, 5, 138, 1319, 8, 138, 10, 138, 12, 138, 1322, 9, 138, 1, 139, 1, 139, 1, 139, 5, 139, 1327, 8, 139, 10, 139, 12, 139, 1330, 9, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 3, 140, 1342, 8, 140, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 5, 142, 1350, 8, 142, 10, 142, 12, 142, 1353, 9, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 5, 143, 1361, 8, 143, 10, 143, 12, 143, 1364, 9, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 4, 144, 1372, 8, 144, 11, 144, 12, 144, 1373, 1, 144, 1, 144, 1, 1362, 0, 145, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 0, 283, 0, 285, 141, 287, 142, 289, 143, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1391, 0, 1, 1, 0, 0, 0, 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, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 285, 1, 0, 0, 0, 0, 287, 1, 0, 0, 0, 0, 289, 1, 0, 0, 0, 1, 291, 1, 0, 0, 0, 3, 301, 1, 0, 0, 0, 5, 311, 1, 0, 0, 0, 7, 320, 1, 0, 0, 0, 9, 332, 1, 0, 0, 0, 11, 339, 1, 0, 0, 0, 13, 347, 1, 0, 0, 0, 15, 356, 1, 0, 0, 0, 17, 364, 1, 0, 0, 0, 19, 370, 1, 0, 0, 0, 21, 375, 1, 0, 0, 0, 23, 388, 1, 0, 0, 0, 25, 398, 1, 0, 0, 0, 27, 410, 1, 0, 0, 0, 29, 416, 1, 0, 0, 0, 31, 427, 1, 0, 0, 0, 33, 438, 1, 0, 0, 0, 35, 443, 1, 0, 0, 0, 37, 452, 1, 0, 0, 0, 39, 462, 1, 0, 0, 0, 41, 467, 1, 0, 0, 0, 43, 471, 1, 0, 0, 0, 45, 477, 1, 0, 0, 0, 47, 482, 1, 0, 0, 0, 49, 492, 1, 0, 0, 0, 51, 496, 1, 0, 0, 0, 53, 509, 1, 0, 0, 0, 55, 514, 1, 0, 0, 0, 57, 521, 1, 0, 0, 0, 59, 530, 1, 0, 0, 0, 61, 541, 1, 0, 0, 0, 63, 545, 1, 0, 0, 0, 65, 554, 1, 0, 0, 0, 67, 561, 1, 0, 0, 0, 69, 570, 1, 0, 0, 0, 71, 575, 1, 0, 0, 0, 73, 585, 1, 0, 0, 0, 75, 596, 1, 0, 0, 0, 77, 604, 1, 0, 0, 0, 79, 610, 1, 0, 0, 0, 81, 619, 1, 0, 0, 0, 83, 629, 1, 0, 0, 0, 85, 638, 1, 0, 0, 0, 87, 650, 1, 0, 0, 0, 89, 661, 1, 0, 0, 0, 91, 667, 1, 0, 0, 0, 93, 675, 1, 0, 0, 0, 95, 678, 1, 0, 0, 0, 97, 683, 1, 0, 0, 0, 99, 690, 1, 0, 0, 0, 101, 693, 1, 0, 0, 0, 103, 701, 1, 0, 0, 0, 105, 708, 1, 0, 0, 0, 107, 714, 1, 0, 0, 0, 109, 719, 1, 0, 0, 0, 111, 730, 1, 0, 0, 0, 113, 735, 1, 0, 0, 0, 115, 741, 1, 0, 0, 0, 117, 745, 1, 0, 0, 0, 119, 757, 1, 0, 0, 0, 121, 760, 1, 0, 0, 0, 123, 767, 1, 0, 0, 0, 125, 770, 1, 0, 0, 0, 127, 777, 1, 0, 0, 0, 129, 785, 1, 0, 0, 0, 131, 792, 1, 0, 0, 0, 133, 803, 1, 0, 0, 0, 135, 810, 1, 0, 0, 0, 137, 819, 1, 0, 0, 0, 139, 834, 1, 0, 0, 0, 141, 844, 1, 0, 0, 0, 143, 857, 1, 0, 0, 0, 145, 863, 1, 0, 0, 0, 147, 880, 1, 0, 0, 0, 149, 883, 1, 0, 0, 0, 151, 887, 1, 0, 0, 0, 153, 892, 1, 0, 0, 0, 155, 898, 1, 0, 0, 0, 157, 907, 1, 0, 0, 0, 159, 916, 1, 0, 0, 0, 161, 920, 1, 0, 0, 0, 163, 924, 1, 0, 0, 0, 165, 928, 1, 0, 0, 0, 167, 934, 1, 0, 0, 0, 169, 940, 1, 0, 0, 0, 171, 945, 1, 0, 0, 0, 173, 950, 1, 0, 0, 0, 175, 956, 1, 0, 0, 0, 177, 964, 1, 0, 0, 0, 179, 972, 1, 0, 0, 0, 181, 983, 1, 0, 0, 0, 183, 988, 1, 0, 0, 0, 185, 1000, 1, 0, 0, 0, 187, 1011, 1, 0, 0, 0, 189, 1021, 1, 0, 0, 0, 191, 1033, 1, 0, 0, 0, 193, 1053, 1, 0, 0, 0, 195, 1058, 1, 0, 0, 0, 197, 1071, 1, 0, 0, 0, 199, 1083, 1, 0, 0, 0, 201, 1095, 1, 0, 0, 0, 203, 1100, 1, 0, 0, 0, 205, 1108, 1, 0, 0, 0, 207, 1113, 1, 0, 0, 0, 209, 1126, 1, 0, 0, 0, 211, 1134, 1, 0, 0, 0, 213, 1143, 1, 0, 0, 0, 215, 1157, 1, 0, 0, 0, 217, 1166, 1, 0, 0, 0, 219, 1171, 1, 0, 0, 0, 221, 1178, 1, 0, 0, 0, 223, 1183, 1, 0, 0, 0, 225, 1189, 1, 0, 0, 0, 227, 1196, 1, 0, 0, 0, 229, 1202, 1, 0, 0, 0, 231, 1208, 1, 0, 0, 0, 233, 1215, 1, 0, 0, 0, 235, 1222, 1, 0, 0, 0, 237, 1229, 1, 0, 0, 0, 239, 1234, 1, 0, 0, 0, 241, 1240, 1, 0, 0, 0, 243, 1245, 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, 1277, 1, 0, 0, 0, 275, 1285, 1, 0, 0, 0, 277, 1316, 1, 0, 0, 0, 279, 1323, 1, 0, 0, 0, 281, 1333, 1, 0, 0, 0, 283, 1343, 1, 0, 0, 0, 285, 1345, 1, 0, 0, 0, 287, 1356, 1, 0, 0, 0, 289, 1371, 1, 0, 0, 0, 291, 292, 5, 119, 0, 0, 292, 293, 5, 111, 0, 0, 293, 294, 5, 114, 0, 0, 294, 295, 5, 107, 0, 0, 295, 296, 5, 115, 0, 0, 296, 297, 5, 112, 0, 0, 297, 298, 5, 97, 0, 0, 298, 299, 5, 99, 0, 0, 299, 300, 5, 101, 0, 0, 300, 2, 1, 0, 0, 0, 301, 302, 5, 101, 0, 0, 302, 303, 5, 120, 0, 0, 303, 304, 5, 101, 0, 0, 304, 305, 5, 99, 0, 0, 305, 306, 5, 117, 0, 0, 306, 307, 5, 116, 0, 0, 307, 308, 5, 105, 0, 0, 308, 309, 5, 111, 0, 0, 309, 310, 5, 110, 0, 0, 310, 4, 1, 0, 0, 0, 311, 312, 5, 115, 0, 0, 312, 313, 5, 110, 0, 0, 313, 314, 5, 97, 0, 0, 314, 315, 5, 112, 0, 0, 315, 316, 5, 115, 0, 0, 316, 317, 5, 104, 0, 0, 317, 318, 5, 111, 0, 0, 318, 319, 5, 116, 0, 0, 319, 6, 1, 0, 0, 0, 320, 321, 5, 116, 0, 0, 321, 322, 5, 114, 0, 0, 322, 323, 5, 97, 0, 0, 323, 324, 5, 110, 0, 0, 324, 325, 5, 115, 0, 0, 325, 326, 5, 97, 0, 0, 326, 327, 5, 99, 0, 0, 327, 328, 5, 116, 0, 0, 328, 329, 5, 105, 0, 0, 329, 330, 5, 111, 0, 0, 330, 331, 5, 110, 0, 0, 331, 8, 1, 0, 0, 0, 332, 333, 5, 114, 0, 0, 333, 334, 5, 101, 0, 0, 334, 335, 5, 109, 0, 0, 335, 336, 5, 111, 0, 0, 336, 337, 5, 116, 0, 0, 337, 338, 5, 101, 0, 0, 338, 10, 1, 0, 0, 0, 339, 340, 5, 116, 0, 0, 340, 341, 5, 97, 0, 0, 341, 342, 5, 114, 0, 0, 342, 343, 5, 103, 0, 0, 343, 344, 5, 101, 0, 0, 344, 345, 5, 116, 0, 0, 345, 346, 5, 115, 0, 0, 346, 12, 1, 0, 0, 0, 347, 348, 5, 112, 0, 0, 348, 349, 5, 111, 0, 0, 349, 350, 5, 114, 0, 0, 350, 351, 5, 116, 0, 0, 351, 352, 5, 97, 0, 0, 352, 353, 5, 98, 0, 0, 353, 354, 5, 108, 0, 0, 354, 355, 5, 101, 0, 0, 355, 14, 1, 0, 0, 0, 356, 357, 5, 114, 0, 0, 357, 358, 5, 101, 0, 0, 358, 359, 5, 112, 0, 0, 359, 360, 5, 108, 0, 0, 360, 361, 5, 105, 0, 0, 361, 362, 5, 99, 0, 0, 362, 363, 5, 97, 0, 0, 363, 16, 1, 0, 0, 0, 364, 365, 5, 108, 0, 0, 365, 366, 5, 111, 0, 0, 366, 367, 5, 99, 0, 0, 367, 368, 5, 97, 0, 0, 368, 369, 5, 108, 0, 0, 369, 18, 1, 0, 0, 0, 370, 371, 5, 102, 0, 0, 371, 372, 5, 114, 0, 0, 372, 373, 5, 111, 0, 0, 373, 374, 5, 109, 0, 0, 374, 20, 1, 0, 0, 0, 375, 376, 5, 114, 0, 0, 376, 377, 5, 101, 0, 0, 377, 378, 5, 115, 0, 0, 378, 379, 5, 117, 0, 0, 379, 380, 5, 108, 0, 0, 380, 381, 5, 116, 0, 0, 381, 382, 5, 45, 0, 0, 382, 383, 5, 98, 0, 0, 383, 384, 5, 121, 0, 0, 384, 385, 5, 116, 0, 0, 385, 386, 5, 101, 0, 0, 386, 387, 5, 115, 0, 0, 387, 22, 1, 0, 0, 0, 388, 389, 5, 114, 0, 0, 389, 390, 5, 112, 0, 0, 390, 391, 5, 99, 0, 0, 391, 392, 5, 45, 0, 0, 392, 393, 5, 99, 0, 0, 393, 394, 5, 97, 0, 0, 394, 395, 5, 108, 0, 0, 395, 396, 5, 108, 0, 0, 396, 397, 5, 115, 0, 0, 397, 24, 1, 0, 0, 0, 398, 399, 5, 100, 0, 0, 399, 400, 5, 101, 0, 0, 400, 401, 5, 97, 0, 0, 401, 402, 5, 100, 0, 0, 402, 403, 5, 108, 0, 0, 403, 404, 5, 105, 0, 0, 404, 405, 5, 110, 0, 0, 405, 406, 5, 101, 0, 0, 406, 407, 5, 45, 0, 0, 407, 408, 5, 109, 0, 0, 408, 409, 5, 115, 0, 0, 409, 26, 1, 0, 0, 0, 410, 411, 5, 113, 0, 0, 411, 412, 5, 117, 0, 0, 412, 413, 5, 101, 0, 0, 413, 414, 5, 114, 0, 0, 414, 415, 5, 121, 0, 0, 415, 28, 1, 0, 0, 0, 416, 417, 5, 114, 0, 0, 417, 418, 5, 101, 0, 0, 418, 419, 5, 102, 0, 0, 419, 420, 5, 108, 0, 0, 420, 421, 5, 101, 0, 0, 421, 422, 5, 99, 0, 0, 422, 423, 5, 116, 0, 0, 423, 424, 5, 105, 0, 0, 424, 425, 5, 111, 0, 0, 425, 426, 5, 110, 0, 0, 426, 30, 1, 0, 0, 0, 427, 428, 5, 115, 0, 0, 428, 429, 5, 112, 0, 0, 429, 430, 5, 101, 0, 0, 430, 431, 5, 99, 0, 0, 431, 432, 5, 105, 0, 0, 432, 433, 5, 97, 0, 0, 433, 434, 5, 108, 0, 0, 434, 435, 5, 105, 0, 0, 435, 436, 5, 122, 0, 0, 436, 437, 5, 101, 0, 0, 437, 32, 1, 0, 0, 0, 438, 439, 5, 114, 0, 0, 439, 440, 5, 111, 0, 0, 440, 441, 5, 111, 0, 0, 441, 442, 5, 116, 0, 0, 442, 34, 1, 0, 0, 0, 443, 444, 5, 100, 0, 0, 444, 445, 5, 111, 0, 0, 445, 446, 5, 99, 0, 0, 446, 447, 5, 117, 0, 0, 447, 448, 5, 109, 0, 0, 448, 449, 5, 101, 0, 0, 449, 450, 5, 110, 0, 0, 450, 451, 5, 116, 0, 0, 451, 36, 1, 0, 0, 0, 452, 453, 5, 102, 0, 0, 453, 454, 5, 114, 0, 0, 454, 455, 5, 97, 0, 0, 455, 456, 5, 103, 0, 0, 456, 457, 5, 109, 0, 0, 457, 458, 5, 101, 0, 0, 458, 459, 5, 110, 0, 0, 459, 460, 5, 116, 0, 0, 460, 461, 5, 115, 0, 0, 461, 38, 1, 0, 0, 0, 462, 463, 5, 118, 0, 0, 463, 464, 5, 105, 0, 0, 464, 465, 5, 101, 0, 0, 465, 466, 5, 119, 0, 0, 466, 40, 1, 0, 0, 0, 467, 468, 5, 109, 0, 0, 468, 469, 5, 97, 0, 0, 469, 470, 5, 120, 0, 0, 470, 42, 1, 0, 0, 0, 471, 472, 5, 97, 0, 0, 472, 473, 5, 108, 0, 0, 473, 474, 5, 108, 0, 0, 474, 475, 5, 111, 0, 0, 475, 476, 5, 119, 0, 0, 476, 44, 1, 0, 0, 0, 477, 478, 5, 112, 0, 0, 478, 479, 5, 111, 0, 0, 479, 480, 5, 108, 0, 0, 480, 481, 5, 108, 0, 0, 481, 46, 1, 0, 0, 0, 482, 483, 5, 113, 0, 0, 483, 484, 5, 117, 0, 0, 484, 485, 5, 101, 0, 0, 485, 486, 5, 114, 0, 0, 486, 487, 5, 121, 0, 0, 487, 488, 5, 97, 0, 0, 488, 489, 5, 98, 0, 0, 489, 490, 5, 108, 0, 0, 490, 491, 5, 101, 0, 0, 491, 48, 1, 0, 0, 0, 492, 493, 5, 114, 0, 0, 493, 494, 5, 112, 0, 0, 494, 495, 5, 99, 0, 0, 495, 50, 1, 0, 0, 0, 496, 497, 5, 113, 0, 0, 497, 498, 5, 117, 0, 0, 498, 499, 5, 101, 0, 0, 499, 500, 5, 114, 0, 0, 500, 501, 5, 121, 0, 0, 501, 502, 5, 45, 0, 0, 502, 503, 5, 114, 0, 0, 503, 504, 5, 101, 0, 0, 504, 505, 5, 97, 0, 0, 505, 506, 5, 115, 0, 0, 506, 507, 5, 111, 0, 0, 507, 508, 5, 110, 0, 0, 508, 52, 1, 0, 0, 0, 509, 510, 5, 116, 0, 0, 510, 511, 5, 121, 0, 0, 511, 512, 5, 112, 0, 0, 512, 513, 5, 101, 0, 0, 513, 54, 1, 0, 0, 0, 514, 515, 5, 111, 0, 0, 515, 516, 5, 98, 0, 0, 516, 517, 5, 106, 0, 0, 517, 518, 5, 101, 0, 0, 518, 519, 5, 99, 0, 0, 519, 520, 5, 116, 0, 0, 520, 56, 1, 0, 0, 0, 521, 522, 5, 115, 0, 0, 522, 523, 5, 116, 0, 0, 523, 524, 5, 111, 0, 0, 524, 525, 5, 114, 0, 0, 525, 526, 5, 97, 0, 0, 526, 527, 5, 98, 0, 0, 527, 528, 5, 108, 0, 0, 528, 529, 5, 101, 0, 0, 529, 58, 1, 0, 0, 0, 530, 531, 5, 105, 0, 0, 531, 532, 5, 109, 0, 0, 532, 533, 5, 112, 0, 0, 533, 534, 5, 108, 0, 0, 534, 535, 5, 101, 0, 0, 535, 536, 5, 109, 0, 0, 536, 537, 5, 101, 0, 0, 537, 538, 5, 110, 0, 0, 538, 539, 5, 116, 0, 0, 539, 540, 5, 115, 0, 0, 540, 60, 1, 0, 0, 0, 541, 542, 5, 114, 0, 0, 542, 543, 5, 101, 0, 0, 543, 544, 5, 102, 0, 0, 544, 62, 1, 0, 0, 0, 545, 546, 5, 102, 0, 0, 546, 547, 5, 114, 0, 0, 547, 548, 5, 97, 0, 0, 548, 549, 5, 103, 0, 0, 549, 550, 5, 109, 0, 0, 550, 551, 5, 101, 0, 0, 551, 552, 5, 110, 0, 0, 552, 553, 5, 116, 0, 0, 553, 64, 1, 0, 0, 0, 554, 555, 5, 105, 0, 0, 555, 556, 5, 109, 0, 0, 556, 557, 5, 112, 0, 0, 557, 558, 5, 111, 0, 0, 558, 559, 5, 114, 0, 0, 559, 560, 5, 116, 0, 0, 560, 66, 1, 0, 0, 0, 561, 562, 5, 101, 0, 0, 562, 563, 5, 120, 0, 0, 563, 564, 5, 116, 0, 0, 564, 565, 5, 101, 0, 0, 565, 566, 5, 114, 0, 0, 566, 567, 5, 110, 0, 0, 567, 568, 5, 97, 0, 0, 568, 569, 5, 108, 0, 0, 569, 68, 1, 0, 0, 0, 570, 571, 5, 97, 0, 0, 571, 572, 5, 116, 0, 0, 572, 573, 5, 111, 0, 0, 573, 574, 5, 109, 0, 0, 574, 70, 1, 0, 0, 0, 575, 576, 5, 105, 0, 0, 576, 577, 5, 110, 0, 0, 577, 578, 5, 116, 0, 0, 578, 579, 5, 101, 0, 0, 579, 580, 5, 114, 0, 0, 580, 581, 5, 102, 0, 0, 581, 582, 5, 97, 0, 0, 582, 583, 5, 99, 0, 0, 583, 584, 5, 101, 0, 0, 584, 72, 1, 0, 0, 0, 585, 586, 5, 105, 0, 0, 586, 587, 5, 110, 0, 0, 587, 588, 5, 116, 0, 0, 588, 589, 5, 101, 0, 0, 589, 590, 5, 114, 0, 0, 590, 591, 5, 102, 0, 0, 591, 592, 5, 97, 0, 0, 592, 593, 5, 99, 0, 0, 593, 594, 5, 101, 0, 0, 594, 595, 5, 115, 0, 0, 595, 74, 1, 0, 0, 0, 596, 597, 5, 112, 0, 0, 597, 598, 5, 97, 0, 0, 598, 599, 5, 99, 0, 0, 599, 600, 5, 107, 0, 0, 600, 601, 5, 97, 0, 0, 601, 602, 5, 103, 0, 0, 602, 603, 5, 101, 0, 0, 603, 76, 1, 0, 0, 0, 604, 605, 5, 118, 0, 0, 605, 606, 5, 97, 0, 0, 606, 607, 5, 108, 0, 0, 607, 608, 5, 117, 0, 0, 608, 609, 5, 101, 0, 0, 609, 78, 1, 0, 0, 0, 610, 611, 5, 114, 0, 0, 611, 612, 5, 101, 0, 0, 612, 613, 5, 108, 0, 0, 613, 614, 5, 97, 0, 0, 614, 615, 5, 116, 0, 0, 615, 616, 5, 105, 0, 0, 616, 617, 5, 111, 0, 0, 617, 618, 5, 110, 0, 0, 618, 80, 1, 0, 0, 0, 619, 620, 5, 111, 0, 0, 620, 621, 5, 112, 0, 0, 621, 622, 5, 101, 0, 0, 622, 623, 5, 114, 0, 0, 623, 624, 5, 97, 0, 0, 624, 625, 5, 116, 0, 0, 625, 626, 5, 105, 0, 0, 626, 627, 5, 111, 0, 0, 627, 628, 5, 110, 0, 0, 628, 82, 1, 0, 0, 0, 629, 630, 5, 102, 0, 0, 630, 631, 5, 117, 0, 0, 631, 632, 5, 110, 0, 0, 632, 633, 5, 99, 0, 0, 633, 634, 5, 116, 0, 0, 634, 635, 5, 105, 0, 0, 635, 636, 5, 111, 0, 0, 636, 637, 5, 110, 0, 0, 637, 84, 1, 0, 0, 0, 638, 639, 5, 99, 0, 0, 639, 640, 5, 111, 0, 0, 640, 641, 5, 110, 0, 0, 641, 642, 5, 115, 0, 0, 642, 643, 5, 116, 0, 0, 643, 644, 5, 114, 0, 0, 644, 645, 5, 117, 0, 0, 645, 646, 5, 99, 0, 0, 646, 647, 5, 116, 0, 0, 647, 648, 5, 111, 0, 0, 648, 649, 5, 114, 0, 0, 649, 86, 1, 0, 0, 0, 650, 651, 5, 99, 0, 0, 651, 652, 5, 111, 0, 0, 652, 653, 5, 110, 0, 0, 653, 654, 5, 115, 0, 0, 654, 655, 5, 116, 0, 0, 655, 656, 5, 114, 0, 0, 656, 657, 5, 117, 0, 0, 657, 658, 5, 99, 0, 0, 658, 659, 5, 116, 0, 0, 659, 660, 5, 115, 0, 0, 660, 88, 1, 0, 0, 0, 661, 662, 5, 105, 0, 0, 662, 663, 5, 110, 0, 0, 663, 664, 5, 112, 0, 0, 664, 665, 5, 117, 0, 0, 665, 666, 5, 116, 0, 0, 666, 90, 1, 0, 0, 0, 667, 668, 5, 99, 0, 0, 668, 669, 5, 111, 0, 0, 669, 670, 5, 110, 0, 0, 670, 671, 5, 102, 0, 0, 671, 672, 5, 111, 0, 0, 672, 673, 5, 114, 0, 0, 673, 674, 5, 109, 0, 0, 674, 92, 1, 0, 0, 0, 675, 676, 5, 97, 0, 0, 676, 677, 5, 115, 0, 0, 677, 94, 1, 0, 0, 0, 678, 679, 5, 98, 0, 0, 679, 680, 5, 105, 0, 0, 680, 681, 5, 110, 0, 0, 681, 682, 5, 100, 0, 0, 682, 96, 1, 0, 0, 0, 683, 684, 5, 115, 0, 0, 684, 685, 5, 116, 0, 0, 685, 686, 5, 97, 0, 0, 686, 687, 5, 116, 0, 0, 687, 688, 5, 105, 0, 0, 688, 689, 5, 99, 0, 0, 689, 98, 1, 0, 0, 0, 690, 691, 5, 116, 0, 0, 691, 692, 5, 111, 0, 0, 692, 100, 1, 0, 0, 0, 693, 694, 5, 112, 0, 0, 694, 695, 5, 114, 0, 0, 695, 696, 5, 105, 0, 0, 696, 697, 5, 118, 0, 0, 697, 698, 5, 97, 0, 0, 698, 699, 5, 116, 0, 0, 699, 700, 5, 101, 0, 0, 700, 102, 1, 0, 0, 0, 701, 702, 5, 115, 0, 0, 702, 703, 5, 104, 0, 0, 703, 704, 5, 97, 0, 0, 704, 705, 5, 114, 0, 0, 705, 706, 5, 101, 0, 0, 706, 707, 5, 100, 0, 0, 707, 104, 1, 0, 0, 0, 708, 709, 5, 115, 0, 0, 709, 710, 5, 116, 0, 0, 710, 711, 5, 97, 0, 0, 711, 712, 5, 116, 0, 0, 712, 713, 5, 101, 0, 0, 713, 106, 1, 0, 0, 0, 714, 715, 5, 101, 0, 0, 715, 716, 5, 100, 0, 0, 716, 717, 5, 103, 0, 0, 717, 718, 5, 101, 0, 0, 718, 108, 1, 0, 0, 0, 719, 720, 5, 112, 0, 0, 720, 721, 5, 114, 0, 0, 721, 722, 5, 111, 0, 0, 722, 723, 5, 106, 0, 0, 723, 724, 5, 101, 0, 0, 724, 725, 5, 99, 0, 0, 725, 726, 5, 116, 0, 0, 726, 727, 5, 105, 0, 0, 727, 728, 5, 111, 0, 0, 728, 729, 5, 110, 0, 0, 729, 110, 1, 0, 0, 0, 730, 731, 5, 119, 0, 0, 731, 732, 5, 105, 0, 0, 732, 733, 5, 116, 0, 0, 733, 734, 5, 104, 0, 0, 734, 112, 1, 0, 0, 0, 735, 736, 5, 117, 0, 0, 736, 737, 5, 115, 0, 0, 737, 738, 5, 105, 0, 0, 738, 739, 5, 110, 0, 0, 739, 740, 5, 103, 0, 0, 740, 114, 1, 0, 0, 0, 741, 742, 5, 118, 0, 0, 742, 743, 5, 105, 0, 0, 743, 744, 5, 97, 0, 0, 744, 116, 1, 0, 0, 0, 745, 746, 5, 109, 0, 0, 746, 747, 5, 97, 0, 0, 747, 748, 5, 116, 0, 0, 748, 749, 5, 101, 0, 0, 749, 750, 5, 114, 0, 0, 750, 751, 5, 105, 0, 0, 751, 752, 5, 97, 0, 0, 752, 753, 5, 108, 0, 0, 753, 754, 5, 105, 0, 0, 754, 755, 5, 122, 0, 0, 755, 756, 5, 101, 0, 0, 756, 118, 1, 0, 0, 0, 757, 758, 5, 105, 0, 0, 758, 759, 5, 102, 0, 0, 759, 120, 1, 0, 0, 0, 760, 761, 5, 97, 0, 0, 761, 762, 5, 98, 0, 0, 762, 763, 5, 115, 0, 0, 763, 764, 5, 101, 0, 0, 764, 765, 5, 110, 0, 0, 765, 766, 5, 116, 0, 0, 766, 122, 1, 0, 0, 0, 767, 768, 5, 111, 0, 0, 768, 769, 5, 110, 0, 0, 769, 124, 1, 0, 0, 0, 770, 771, 5, 112, 0, 0, 771, 772, 5, 111, 0, 0, 772, 773, 5, 108, 0, 0, 773, 774, 5, 105, 0, 0, 774, 775, 5, 99, 0, 0, 775, 776, 5, 121, 0, 0, 776, 126, 1, 0, 0, 0, 777, 778, 5, 100, 0, 0, 778, 779, 5, 101, 0, 0, 779, 780, 5, 102, 0, 0, 780, 781, 5, 97, 0, 0, 781, 782, 5, 117, 0, 0, 782, 783, 5, 108, 0, 0, 783, 784, 5, 116, 0, 0, 784, 128, 1, 0, 0, 0, 785, 786, 5, 115, 0, 0, 786, 787, 5, 111, 0, 0, 787, 788, 5, 117, 0, 0, 788, 789, 5, 114, 0, 0, 789, 790, 5, 99, 0, 0, 790, 791, 5, 101, 0, 0, 791, 130, 1, 0, 0, 0, 792, 793, 5, 114, 0, 0, 793, 794, 5, 101, 0, 0, 794, 795, 5, 112, 0, 0, 795, 796, 5, 111, 0, 0, 796, 797, 5, 115, 0, 0, 797, 798, 5, 105, 0, 0, 798, 799, 5, 116, 0, 0, 799, 800, 5, 111, 0, 0, 800, 801, 5, 114, 0, 0, 801, 802, 5, 121, 0, 0, 802, 132, 1, 0, 0, 0, 803, 804, 5, 99, 0, 0, 804, 805, 5, 111, 0, 0, 805, 806, 5, 109, 0, 0, 806, 807, 5, 109, 0, 0, 807, 808, 5, 105, 0, 0, 808, 809, 5, 116, 0, 0, 809, 134, 1, 0, 0, 0, 810, 811, 5, 114, 0, 0, 811, 812, 5, 101, 0, 0, 812, 813, 5, 118, 0, 0, 813, 814, 5, 105, 0, 0, 814, 815, 5, 115, 0, 0, 815, 816, 5, 105, 0, 0, 816, 817, 5, 111, 0, 0, 817, 818, 5, 110, 0, 0, 818, 136, 1, 0, 0, 0, 819, 820, 5, 115, 0, 0, 820, 821, 5, 101, 0, 0, 821, 822, 5, 109, 0, 0, 822, 823, 5, 97, 0, 0, 823, 824, 5, 110, 0, 0, 824, 825, 5, 116, 0, 0, 825, 826, 5, 105, 0, 0, 826, 827, 5, 99, 0, 0, 827, 828, 5, 45, 0, 0, 828, 829, 5, 109, 0, 0, 829, 830, 5, 97, 0, 0, 830, 831, 5, 106, 0, 0, 831, 832, 5, 111, 0, 0, 832, 833, 5, 114, 0, 0, 833, 138, 1, 0, 0, 0, 834, 835, 5, 111, 0, 0, 835, 836, 5, 110, 0, 0, 836, 837, 5, 45, 0, 0, 837, 838, 5, 100, 0, 0, 838, 839, 5, 101, 0, 0, 839, 840, 5, 108, 0, 0, 840, 841, 5, 101, 0, 0, 841, 842, 5, 116, 0, 0, 842, 843, 5, 101, 0, 0, 843, 140, 1, 0, 0, 0, 844, 845, 5, 114, 0, 0, 845, 846, 5, 101, 0, 0, 846, 847, 5, 116, 0, 0, 847, 848, 5, 97, 0, 0, 848, 849, 5, 105, 0, 0, 849, 850, 5, 110, 0, 0, 850, 851, 5, 45, 0, 0, 851, 852, 5, 111, 0, 0, 852, 853, 5, 116, 0, 0, 853, 854, 5, 104, 0, 0, 854, 855, 5, 101, 0, 0, 855, 856, 5, 114, 0, 0, 856, 142, 1, 0, 0, 0, 857, 858, 5, 107, 0, 0, 858, 859, 5, 101, 0, 0, 859, 860, 5, 121, 0, 0, 860, 861, 5, 101, 0, 0, 861, 862, 5, 100, 0, 0, 862, 144, 1, 0, 0, 0, 863, 864, 5, 112, 0, 0, 864, 865, 5, 117, 0, 0, 865, 866, 5, 98, 0, 0, 866, 867, 5, 108, 0, 0, 867, 868, 5, 105, 0, 0, 868, 869, 5, 99, 0, 0, 869, 870, 5, 45, 0, 0, 870, 871, 5, 116, 0, 0, 871, 872, 5, 114, 0, 0, 872, 873, 5, 97, 0, 0, 873, 874, 5, 118, 0, 0, 874, 875, 5, 101, 0, 0, 875, 876, 5, 114, 0, 0, 876, 877, 5, 115, 0, 0, 877, 878, 5, 97, 0, 0, 878, 879, 5, 108, 0, 0, 879, 146, 1, 0, 0, 0, 880, 881, 5, 105, 0, 0, 881, 882, 5, 100, 0, 0, 882, 148, 1, 0, 0, 0, 883, 884, 5, 100, 0, 0, 884, 885, 5, 111, 0, 0, 885, 886, 5, 99, 0, 0, 886, 150, 1, 0, 0, 0, 887, 888, 5, 109, 0, 0, 888, 889, 5, 111, 0, 0, 889, 890, 5, 100, 0, 0, 890, 891, 5, 101, 0, 0, 891, 152, 1, 0, 0, 0, 892, 893, 5, 101, 0, 0, 893, 894, 5, 109, 0, 0, 894, 895, 5, 105, 0, 0, 895, 896, 5, 116, 0, 0, 896, 897, 5, 115, 0, 0, 897, 154, 1, 0, 0, 0, 898, 899, 5, 114, 0, 0, 899, 900, 5, 101, 0, 0, 900, 901, 5, 99, 0, 0, 901, 902, 5, 101, 0, 0, 902, 903, 5, 105, 0, 0, 903, 904, 5, 118, 0, 0, 904, 905, 5, 101, 0, 0, 905, 906, 5, 114, 0, 0, 906, 156, 1, 0, 0, 0, 907, 908, 5, 114, 0, 0, 908, 909, 5, 101, 0, 0, 909, 910, 5, 113, 0, 0, 910, 911, 5, 117, 0, 0, 911, 912, 5, 105, 0, 0, 912, 913, 5, 114, 0, 0, 913, 914, 5, 101, 0, 0, 914, 915, 5, 115, 0, 0, 915, 158, 1, 0, 0, 0, 916, 917, 5, 97, 0, 0, 917, 918, 5, 110, 0, 0, 918, 919, 5, 121, 0, 0, 919, 160, 1, 0, 0, 0, 920, 921, 5, 103, 0, 0, 921, 922, 5, 101, 0, 0, 922, 923, 5, 116, 0, 0, 923, 162, 1, 0, 0, 0, 924, 925, 5, 115, 0, 0, 925, 926, 5, 101, 0, 0, 926, 927, 5, 116, 0, 0, 927, 164, 1, 0, 0, 0, 928, 929, 5, 119, 0, 0, 929, 930, 5, 97, 0, 0, 930, 931, 5, 116, 0, 0, 931, 932, 5, 99, 0, 0, 932, 933, 5, 104, 0, 0, 933, 166, 1, 0, 0, 0, 934, 935, 5, 115, 0, 0, 935, 936, 5, 116, 0, 0, 936, 937, 5, 97, 0, 0, 937, 938, 5, 114, 0, 0, 938, 939, 5, 116, 0, 0, 939, 168, 1, 0, 0, 0, 940, 941, 5, 115, 0, 0, 941, 942, 5, 116, 0, 0, 942, 943, 5, 111, 0, 0, 943, 944, 5, 112, 0, 0, 944, 170, 1, 0, 0, 0, 945, 946, 5, 114, 0, 0, 946, 947, 5, 101, 0, 0, 947, 948, 5, 97, 0, 0, 948, 949, 5, 100, 0, 0, 949, 172, 1, 0, 0, 0, 950, 951, 5, 119, 0, 0, 951, 952, 5, 114, 0, 0, 952, 953, 5, 105, 0, 0, 953, 954, 5, 116, 0, 0, 954, 955, 5, 101, 0, 0, 955, 174, 1, 0, 0, 0, 956, 957, 5, 114, 0, 0, 957, 958, 5, 101, 0, 0, 958, 959, 5, 115, 0, 0, 959, 960, 5, 111, 0, 0, 960, 961, 5, 108, 0, 0, 961, 962, 5, 118, 0, 0, 962, 963, 5, 101, 0, 0, 963, 176, 1, 0, 0, 0, 964, 965, 5, 99, 0, 0, 965, 966, 5, 111, 0, 0, 966, 967, 5, 110, 0, 0, 967, 968, 5, 110, 0, 0, 968, 969, 5, 101, 0, 0, 969, 970, 5, 99, 0, 0, 970, 971, 5, 116, 0, 0, 971, 178, 1, 0, 0, 0, 972, 973, 5, 100, 0, 0, 973, 974, 5, 105, 0, 0, 974, 975, 5, 115, 0, 0, 975, 976, 5, 99, 0, 0, 976, 977, 5, 111, 0, 0, 977, 978, 5, 110, 0, 0, 978, 979, 5, 110, 0, 0, 979, 980, 5, 101, 0, 0, 980, 981, 5, 99, 0, 0, 981, 982, 5, 116, 0, 0, 982, 180, 1, 0, 0, 0, 983, 984, 5, 99, 0, 0, 984, 985, 5, 97, 0, 0, 985, 986, 5, 108, 0, 0, 986, 987, 5, 108, 0, 0, 987, 182, 1, 0, 0, 0, 988, 989, 5, 119, 0, 0, 989, 990, 5, 97, 0, 0, 990, 991, 5, 116, 0, 0, 991, 992, 5, 99, 0, 0, 992, 993, 5, 104, 0, 0, 993, 994, 5, 45, 0, 0, 994, 995, 5, 115, 0, 0, 995, 996, 5, 116, 0, 0, 996, 997, 5, 97, 0, 0, 997, 998, 5, 114, 0, 0, 998, 999, 5, 116, 0, 0, 999, 184, 1, 0, 0, 0, 1000, 1001, 5, 119, 0, 0, 1001, 1002, 5, 97, 0, 0, 1002, 1003, 5, 116, 0, 0, 1003, 1004, 5, 99, 0, 0, 1004, 1005, 5, 104, 0, 0, 1005, 1006, 5, 45, 0, 0, 1006, 1007, 5, 115, 0, 0, 1007, 1008, 5, 116, 0, 0, 1008, 1009, 5, 111, 0, 0, 1009, 1010, 5, 112, 0, 0, 1010, 186, 1, 0, 0, 0, 1011, 1012, 5, 115, 0, 0, 1012, 1013, 5, 117, 0, 0, 1013, 1014, 5, 98, 0, 0, 1014, 1015, 5, 115, 0, 0, 1015, 1016, 5, 99, 0, 0, 1016, 1017, 5, 114, 0, 0, 1017, 1018, 5, 105, 0, 0, 1018, 1019, 5, 98, 0, 0, 1019, 1020, 5, 101, 0, 0, 1020, 188, 1, 0, 0, 0, 1021, 1022, 5, 117, 0, 0, 1022, 1023, 5, 110, 0, 0, 1023, 1024, 5, 115, 0, 0, 1024, 1025, 5, 117, 0, 0, 1025, 1026, 5, 98, 0, 0, 1026, 1027, 5, 115, 0, 0, 1027, 1028, 5, 99, 0, 0, 1028, 1029, 5, 114, 0, 0, 1029, 1030, 5, 105, 0, 0, 1030, 1031, 5, 98, 0, 0, 1031, 1032, 5, 101, 0, 0, 1032, 190, 1, 0, 0, 0, 1033, 1034, 5, 111, 0, 0, 1034, 1035, 5, 112, 0, 0, 1035, 1036, 5, 116, 0, 0, 1036, 1037, 5, 105, 0, 0, 1037, 1038, 5, 109, 0, 0, 1038, 1039, 5, 105, 0, 0, 1039, 1040, 5, 115, 0, 0, 1040, 1041, 5, 116, 0, 0, 1041, 1042, 5, 105, 0, 0, 1042, 1043, 5, 99, 0, 0, 1043, 1044, 5, 45, 0, 0, 1044, 1045, 5, 114, 0, 0, 1045, 1046, 5, 101, 0, 0, 1046, 1047, 5, 103, 0, 0, 1047, 1048, 5, 105, 0, 0, 1048, 1049, 5, 115, 0, 0, 1049, 1050, 5, 116, 0, 0, 1050, 1051, 5, 101, 0, 0, 1051, 1052, 5, 114, 0, 0, 1052, 192, 1, 0, 0, 0, 1053, 1054, 5, 99, 0, 0, 1054, 1055, 5, 114, 0, 0, 1055, 1056, 5, 100, 0, 0, 1056, 1057, 5, 116, 0, 0, 1057, 194, 1, 0, 0, 0, 1058, 1059, 5, 111, 0, 0, 1059, 1060, 5, 112, 0, 0, 1060, 1061, 5, 116, 0, 0, 1061, 1062, 5, 105, 0, 0, 1062, 1063, 5, 111, 0, 0, 1063, 1064, 5, 110, 0, 0, 1064, 1065, 5, 97, 0, 0, 1065, 1066, 5, 108, 0, 0, 1066, 1067, 5, 45, 0, 0, 1067, 1068, 5, 111, 0, 0, 1068, 1069, 5, 110, 0, 0, 1069, 1070, 5, 101, 0, 0, 1070, 196, 1, 0, 0, 0, 1071, 1072, 5, 101, 0, 0, 1072, 1073, 5, 120, 0, 0, 1073, 1074, 5, 97, 0, 0, 1074, 1075, 5, 99, 0, 0, 1075, 1076, 5, 116, 0, 0, 1076, 1077, 5, 108, 0, 0, 1077, 1078, 5, 121, 0, 0, 1078, 1079, 5, 45, 0, 0, 1079, 1080, 5, 111, 0, 0, 1080, 1081, 5, 110, 0, 0, 1081, 1082, 5, 101, 0, 0, 1082, 198, 1, 0, 0, 0, 1083, 1084, 5, 109, 0, 0, 1084, 1085, 5, 97, 0, 0, 1085, 1086, 5, 110, 0, 0, 1086, 1087, 5, 121, 0, 0, 1087, 1088, 5, 45, 0, 0, 1088, 1089, 5, 117, 0, 0, 1089, 1090, 5, 110, 0, 0, 1090, 1091, 5, 105, 0, 0, 1091, 1092, 5, 113, 0, 0, 1092, 1093, 5, 117, 0, 0, 1093, 1094, 5, 101, 0, 0, 1094, 200, 1, 0, 0, 0, 1095, 1096, 5, 109, 0, 0, 1096, 1097, 5, 97, 0, 0, 1097, 1098, 5, 110, 0, 0, 1098, 1099, 5, 121, 0, 0, 1099, 202, 1, 0, 0, 0, 1100, 1101, 5, 111, 0, 0, 1101, 1102, 5, 114, 0, 0, 1102, 1103, 5, 100, 0, 0, 1103, 1104, 5, 101, 0, 0, 1104, 1105, 5, 114, 0, 0, 1105, 1106, 5, 101, 0, 0, 1106, 1107, 5, 100, 0, 0, 1107, 204, 1, 0, 0, 0, 1108, 1109, 5, 117, 0, 0, 1109, 1110, 5, 110, 0, 0, 1110, 1111, 5, 105, 0, 0, 1111, 1112, 5, 116, 0, 0, 1112, 206, 1, 0, 0, 0, 1113, 1114, 5, 119, 0, 0, 1114, 1115, 5, 97, 0, 0, 1115, 1116, 5, 116, 0, 0, 1116, 1117, 5, 99, 0, 0, 1117, 1118, 5, 104, 0, 0, 1118, 1119, 5, 45, 0, 0, 1119, 1120, 5, 104, 0, 0, 1120, 1121, 5, 97, 0, 0, 1121, 1122, 5, 110, 0, 0, 1122, 1123, 5, 100, 0, 0, 1123, 1124, 5, 108, 0, 0, 1124, 1125, 5, 101, 0, 0, 1125, 208, 1, 0, 0, 0, 1126, 1127, 5, 109, 0, 0, 1127, 1128, 5, 101, 0, 0, 1128, 1129, 5, 115, 0, 0, 1129, 1130, 5, 115, 0, 0, 1130, 1131, 5, 97, 0, 0, 1131, 1132, 5, 103, 0, 0, 1132, 1133, 5, 101, 0, 0, 1133, 210, 1, 0, 0, 0, 1134, 1135, 5, 97, 0, 0, 1135, 1136, 5, 116, 0, 0, 1136, 1137, 5, 111, 0, 0, 1137, 1138, 5, 109, 0, 0, 1138, 1139, 5, 45, 0, 0, 1139, 1140, 5, 114, 0, 0, 1140, 1141, 5, 101, 0, 0, 1141, 1142, 5, 102, 0, 0, 1142, 212, 1, 0, 0, 0, 1143, 1144, 5, 105, 0, 0, 1144, 1145, 5, 110, 0, 0, 1145, 1146, 5, 116, 0, 0, 1146, 1147, 5, 101, 0, 0, 1147, 1148, 5, 114, 0, 0, 1148, 1149, 5, 102, 0, 0, 1149, 1150, 5, 97, 0, 0, 1150, 1151, 5, 99, 0, 0, 1151, 1152, 5, 101, 0, 0, 1152, 1153, 5, 45, 0, 0, 1153, 1154, 5, 114, 0, 0, 1154, 1155, 5, 101, 0, 0, 1155, 1156, 5, 102, 0, 0, 1156, 214, 1, 0, 0, 0, 1157, 1158, 5, 111, 0, 0, 1158, 1159, 5, 112, 0, 0, 1159, 1160, 5, 116, 0, 0, 1160, 1161, 5, 105, 0, 0, 1161, 1162, 5, 111, 0, 0, 1162, 1163, 5, 110, 0, 0, 1163, 1164, 5, 97, 0, 0, 1164, 1165, 5, 108, 0, 0, 1165, 216, 1, 0, 0, 0, 1166, 1167, 5, 108, 0, 0, 1167, 1168, 5, 105, 0, 0, 1168, 1169, 5, 115, 0, 0, 1169, 1170, 5, 116, 0, 0, 1170, 218, 1, 0, 0, 0, 1171, 1172, 5, 114, 0, 0, 1172, 1173, 5, 101, 0, 0, 1173, 1174, 5, 99, 0, 0, 1174, 1175, 5, 111, 0, 0, 1175, 1176, 5, 114, 0, 0, 1176, 1177, 5, 100, 0, 0, 1177, 220, 1, 0, 0, 0, 1178, 1179, 5, 98, 0, 0, 1179, 1180, 5, 111, 0, 0, 1180, 1181, 5, 111, 0, 0, 1181, 1182, 5, 108, 0, 0, 1182, 222, 1, 0, 0, 0, 1183, 1184, 5, 98, 0, 0, 1184, 1185, 5, 121, 0, 0, 1185, 1186, 5, 116, 0, 0, 1186, 1187, 5, 101, 0, 0, 1187, 1188, 5, 115, 0, 0, 1188, 224, 1, 0, 0, 0, 1189, 1190, 5, 100, 0, 0, 1190, 1191, 5, 111, 0, 0, 1191, 1192, 5, 117, 0, 0, 1192, 1193, 5, 98, 0, 0, 1193, 1194, 5, 108, 0, 0, 1194, 1195, 5, 101, 0, 0, 1195, 226, 1, 0, 0, 0, 1196, 1197, 5, 105, 0, 0, 1197, 1198, 5, 110, 0, 0, 1198, 1199, 5, 116, 0, 0, 1199, 1200, 5, 51, 0, 0, 1200, 1201, 5, 50, 0, 0, 1201, 228, 1, 0, 0, 0, 1202, 1203, 5, 105, 0, 0, 1203, 1204, 5, 110, 0, 0, 1204, 1205, 5, 116, 0, 0, 1205, 1206, 5, 54, 0, 0, 1206, 1207, 5, 52, 0, 0, 1207, 230, 1, 0, 0, 0, 1208, 1209, 5, 115, 0, 0, 1209, 1210, 5, 116, 0, 0, 1210, 1211, 5, 114, 0, 0, 1211, 1212, 5, 105, 0, 0, 1212, 1213, 5, 110, 0, 0, 1213, 1214, 5, 103, 0, 0, 1214, 232, 1, 0, 0, 0, 1215, 1216, 5, 117, 0, 0, 1216, 1217, 5, 105, 0, 0, 1217, 1218, 5, 110, 0, 0, 1218, 1219, 5, 116, 0, 0, 1219, 1220, 5, 51, 0, 0, 1220, 1221, 5, 50, 0, 0, 1221, 234, 1, 0, 0, 0, 1222, 1223, 5, 117, 0, 0, 1223, 1224, 5, 105, 0, 0, 1224, 1225, 5, 110, 0, 0, 1225, 1226, 5, 116, 0, 0, 1226, 1227, 5, 54, 0, 0, 1227, 1228, 5, 52, 0, 0, 1228, 236, 1, 0, 0, 0, 1229, 1230, 5, 116, 0, 0, 1230, 1231, 5, 114, 0, 0, 1231, 1232, 5, 117, 0, 0, 1232, 1233, 5, 101, 0, 0, 1233, 238, 1, 0, 0, 0, 1234, 1235, 5, 102, 0, 0, 1235, 1236, 5, 97, 0, 0, 1236, 1237, 5, 108, 0, 0, 1237, 1238, 5, 115, 0, 0, 1238, 1239, 5, 101, 0, 0, 1239, 240, 1, 0, 0, 0, 1240, 1241, 5, 110, 0, 0, 1241, 1242, 5, 117, 0, 0, 1242, 1243, 5, 108, 0, 0, 1243, 1244, 5, 108, 0, 0, 1244, 242, 1, 0, 0, 0, 1245, 1246, 5, 45, 0, 0, 1246, 1247, 5, 62, 0, 0, 1247, 244, 1, 0, 0, 0, 1248, 1249, 5, 58, 0, 0, 1249, 246, 1, 0, 0, 0, 1250, 1251, 5, 59, 0, 0, 1251, 248, 1, 0, 0, 0, 1252, 1253, 5, 44, 0, 0, 1253, 250, 1, 0, 0, 0, 1254, 1255, 5, 46, 0, 0, 1255, 252, 1, 0, 0, 0, 1256, 1257, 5, 123, 0, 0, 1257, 254, 1, 0, 0, 0, 1258, 1259, 5, 125, 0, 0, 1259, 256, 1, 0, 0, 0, 1260, 1261, 5, 91, 0, 0, 1261, 258, 1, 0, 0, 0, 1262, 1263, 5, 93, 0, 0, 1263, 260, 1, 0, 0, 0, 1264, 1265, 5, 40, 0, 0, 1265, 262, 1, 0, 0, 0, 1266, 1267, 5, 41, 0, 0, 1267, 264, 1, 0, 0, 0, 1268, 1269, 5, 60, 0, 0, 1269, 266, 1, 0, 0, 0, 1270, 1271, 5, 62, 0, 0, 1271, 268, 1, 0, 0, 0, 1272, 1273, 5, 38, 0, 0, 1273, 270, 1, 0, 0, 0, 1274, 1275, 5, 61, 0, 0, 1275, 272, 1, 0, 0, 0, 1276, 1278, 5, 45, 0, 0, 1277, 1276, 1, 0, 0, 0, 1277, 1278, 1, 0, 0, 0, 1278, 1280, 1, 0, 0, 0, 1279, 1281, 7, 0, 0, 0, 1280, 1279, 1, 0, 0, 0, 1281, 1282, 1, 0, 0, 0, 1282, 1280, 1, 0, 0, 0, 1282, 1283, 1, 0, 0, 0, 1283, 274, 1, 0, 0, 0, 1284, 1286, 5, 45, 0, 0, 1285, 1284, 1, 0, 0, 0, 1285, 1286, 1, 0, 0, 0, 1286, 1295, 1, 0, 0, 0, 1287, 1296, 5, 48, 0, 0, 1288, 1292, 7, 1, 0, 0, 1289, 1291, 7, 0, 0, 0, 1290, 1289, 1, 0, 0, 0, 1291, 1294, 1, 0, 0, 0, 1292, 1290, 1, 0, 0, 0, 1292, 1293, 1, 0, 0, 0, 1293, 1296, 1, 0, 0, 0, 1294, 1292, 1, 0, 0, 0, 1295, 1287, 1, 0, 0, 0, 1295, 1288, 1, 0, 0, 0, 1296, 1303, 1, 0, 0, 0, 1297, 1299, 5, 46, 0, 0, 1298, 1300, 7, 0, 0, 0, 1299, 1298, 1, 0, 0, 0, 1300, 1301, 1, 0, 0, 0, 1301, 1299, 1, 0, 0, 0, 1301, 1302, 1, 0, 0, 0, 1302, 1304, 1, 0, 0, 0, 1303, 1297, 1, 0, 0, 0, 1303, 1304, 1, 0, 0, 0, 1304, 1314, 1, 0, 0, 0, 1305, 1307, 7, 2, 0, 0, 1306, 1308, 7, 3, 0, 0, 1307, 1306, 1, 0, 0, 0, 1307, 1308, 1, 0, 0, 0, 1308, 1310, 1, 0, 0, 0, 1309, 1311, 7, 0, 0, 0, 1310, 1309, 1, 0, 0, 0, 1311, 1312, 1, 0, 0, 0, 1312, 1310, 1, 0, 0, 0, 1312, 1313, 1, 0, 0, 0, 1313, 1315, 1, 0, 0, 0, 1314, 1305, 1, 0, 0, 0, 1314, 1315, 1, 0, 0, 0, 1315, 276, 1, 0, 0, 0, 1316, 1320, 7, 4, 0, 0, 1317, 1319, 7, 5, 0, 0, 1318, 1317, 1, 0, 0, 0, 1319, 1322, 1, 0, 0, 0, 1320, 1318, 1, 0, 0, 0, 1320, 1321, 1, 0, 0, 0, 1321, 278, 1, 0, 0, 0, 1322, 1320, 1, 0, 0, 0, 1323, 1328, 5, 34, 0, 0, 1324, 1327, 3, 281, 140, 0, 1325, 1327, 8, 6, 0, 0, 1326, 1324, 1, 0, 0, 0, 1326, 1325, 1, 0, 0, 0, 1327, 1330, 1, 0, 0, 0, 1328, 1326, 1, 0, 0, 0, 1328, 1329, 1, 0, 0, 0, 1329, 1331, 1, 0, 0, 0, 1330, 1328, 1, 0, 0, 0, 1331, 1332, 5, 34, 0, 0, 1332, 280, 1, 0, 0, 0, 1333, 1341, 5, 92, 0, 0, 1334, 1342, 7, 7, 0, 0, 1335, 1336, 5, 117, 0, 0, 1336, 1337, 3, 283, 141, 0, 1337, 1338, 3, 283, 141, 0, 1338, 1339, 3, 283, 141, 0, 1339, 1340, 3, 283, 141, 0, 1340, 1342, 1, 0, 0, 0, 1341, 1334, 1, 0, 0, 0, 1341, 1335, 1, 0, 0, 0, 1342, 282, 1, 0, 0, 0, 1343, 1344, 7, 8, 0, 0, 1344, 284, 1, 0, 0, 0, 1345, 1346, 5, 47, 0, 0, 1346, 1347, 5, 47, 0, 0, 1347, 1351, 1, 0, 0, 0, 1348, 1350, 8, 9, 0, 0, 1349, 1348, 1, 0, 0, 0, 1350, 1353, 1, 0, 0, 0, 1351, 1349, 1, 0, 0, 0, 1351, 1352, 1, 0, 0, 0, 1352, 1354, 1, 0, 0, 0, 1353, 1351, 1, 0, 0, 0, 1354, 1355, 6, 142, 0, 0, 1355, 286, 1, 0, 0, 0, 1356, 1357, 5, 47, 0, 0, 1357, 1358, 5, 42, 0, 0, 1358, 1362, 1, 0, 0, 0, 1359, 1361, 9, 0, 0, 0, 1360, 1359, 1, 0, 0, 0, 1361, 1364, 1, 0, 0, 0, 1362, 1363, 1, 0, 0, 0, 1362, 1360, 1, 0, 0, 0, 1363, 1365, 1, 0, 0, 0, 1364, 1362, 1, 0, 0, 0, 1365, 1366, 5, 42, 0, 0, 1366, 1367, 5, 47, 0, 0, 1367, 1368, 1, 0, 0, 0, 1368, 1369, 6, 143, 0, 0, 1369, 288, 1, 0, 0, 0, 1370, 1372, 7, 10, 0, 0, 1371, 1370, 1, 0, 0, 0, 1372, 1373, 1, 0, 0, 0, 1373, 1371, 1, 0, 0, 0, 1373, 1374, 1, 0, 0, 0, 1374, 1375, 1, 0, 0, 0, 1375, 1376, 6, 144, 0, 0, 1376, 290, 1, 0, 0, 0, 18, 0, 1277, 1282, 1285, 1292, 1295, 1301, 1303, 1307, 1312, 1314, 1320, 1326, 1328, 1341, 1351, 1362, 1373, 1, 0, 1, 0] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapabilityLexer.tokens b/src/capability-language/generated/QuixosCapabilityLexer.tokens index 81f78bd..6557cbb 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.tokens +++ b/src/capability-language/generated/QuixosCapabilityLexer.tokens @@ -1,261 +1,279 @@ WORKSPACE=1 -RESULT_BYTES=2 -RPC_CALLS=3 -DEADLINE_MS=4 -QUERY=5 -REFLECTION=6 -SPECIALIZE=7 -ROOT=8 -DOCUMENT=9 -FRAGMENTS=10 -VIEW=11 -MAX=12 -ALLOW=13 -POLL=14 -QUERYABLE=15 -RPC=16 -QUERY_REASON=17 -TYPE=18 -OBJECT=19 -STORABLE=20 -IMPLEMENTS=21 -REF=22 -FRAGMENT=23 -IMPORT=24 -EXTERNAL=25 -ATOM=26 -INTERFACE=27 -INTERFACES=28 -PACKAGE=29 -VALUE=30 -RELATION=31 -OPERATION=32 -FUNCTION=33 -CONSTRUCTOR=34 -CONSTRUCTS=35 -INPUT=36 -CONFORM=37 -AS=38 -BIND=39 -STATIC=40 -TO=41 -PRIVATE=42 -SHARED=43 -STATE=44 -EDGE=45 -PROJECTION=46 -WITH=47 -USING=48 -VIA=49 -MATERIALIZE=50 -IF=51 -ABSENT=52 -ON=53 -POLICY=54 -DEFAULT=55 -SOURCE=56 -REPOSITORY=57 -COMMIT=58 -REVISION=59 -SEMANTIC_MAJOR=60 -ON_DELETE=61 -RETAIN_OTHER=62 -KEYED=63 -PUBLIC_TRAVERSAL=64 -ID=65 -DOC=66 -MODE=67 -EMITS=68 -RECEIVER=69 -REQUIRES=70 -ANY=71 -GET=72 -SET=73 -WATCH=74 -START=75 -STOP=76 -READ=77 -WRITE=78 -RESOLVE=79 -CONNECT=80 -DISCONNECT=81 -CALL=82 -WATCH_START=83 -WATCH_STOP=84 -SUBSCRIBE=85 -UNSUBSCRIBE=86 -OPTIMISTIC_REGISTER=87 -CRDT=88 -OPTIONAL_ONE=89 -EXACTLY_ONE=90 -MANY_UNIQUE=91 -MANY=92 -ORDERED=93 -UNIT=94 -WATCH_HANDLE=95 -MESSAGE=96 -ATOM_REF=97 -INTERFACE_REF=98 -OPTIONAL=99 -LIST=100 -RECORD=101 -BOOL=102 -BYTES=103 -DOUBLE=104 -INT32=105 -INT64=106 -STRING=107 -UINT32=108 -UINT64=109 -TRUE=110 -FALSE=111 -NULL=112 -ARROW=113 -COLON=114 -SEMI=115 -COMMA=116 -DOT=117 -LBRACE=118 -RBRACE=119 -LBRACK=120 -RBRACK=121 -LPAREN=122 -RPAREN=123 -LT=124 -GT=125 -AMP=126 -EQUAL=127 -INTEGER=128 -JSON_NUMBER=129 -IDENTIFIER=130 -STRING_LITERAL=131 -LINE_COMMENT=132 -BLOCK_COMMENT=133 -WS=134 +EXECUTION=2 +SNAPSHOT=3 +TRANSACTION=4 +REMOTE=5 +TARGETS=6 +PORTABLE=7 +REPLICA=8 +LOCAL=9 +FROM=10 +RESULT_BYTES=11 +RPC_CALLS=12 +DEADLINE_MS=13 +QUERY=14 +REFLECTION=15 +SPECIALIZE=16 +ROOT=17 +DOCUMENT=18 +FRAGMENTS=19 +VIEW=20 +MAX=21 +ALLOW=22 +POLL=23 +QUERYABLE=24 +RPC=25 +QUERY_REASON=26 +TYPE=27 +OBJECT=28 +STORABLE=29 +IMPLEMENTS=30 +REF=31 +FRAGMENT=32 +IMPORT=33 +EXTERNAL=34 +ATOM=35 +INTERFACE=36 +INTERFACES=37 +PACKAGE=38 +VALUE=39 +RELATION=40 +OPERATION=41 +FUNCTION=42 +CONSTRUCTOR=43 +CONSTRUCTS=44 +INPUT=45 +CONFORM=46 +AS=47 +BIND=48 +STATIC=49 +TO=50 +PRIVATE=51 +SHARED=52 +STATE=53 +EDGE=54 +PROJECTION=55 +WITH=56 +USING=57 +VIA=58 +MATERIALIZE=59 +IF=60 +ABSENT=61 +ON=62 +POLICY=63 +DEFAULT=64 +SOURCE=65 +REPOSITORY=66 +COMMIT=67 +REVISION=68 +SEMANTIC_MAJOR=69 +ON_DELETE=70 +RETAIN_OTHER=71 +KEYED=72 +PUBLIC_TRAVERSAL=73 +ID=74 +DOC=75 +MODE=76 +EMITS=77 +RECEIVER=78 +REQUIRES=79 +ANY=80 +GET=81 +SET=82 +WATCH=83 +START=84 +STOP=85 +READ=86 +WRITE=87 +RESOLVE=88 +CONNECT=89 +DISCONNECT=90 +CALL=91 +WATCH_START=92 +WATCH_STOP=93 +SUBSCRIBE=94 +UNSUBSCRIBE=95 +OPTIMISTIC_REGISTER=96 +CRDT=97 +OPTIONAL_ONE=98 +EXACTLY_ONE=99 +MANY_UNIQUE=100 +MANY=101 +ORDERED=102 +UNIT=103 +WATCH_HANDLE=104 +MESSAGE=105 +ATOM_REF=106 +INTERFACE_REF=107 +OPTIONAL=108 +LIST=109 +RECORD=110 +BOOL=111 +BYTES=112 +DOUBLE=113 +INT32=114 +INT64=115 +STRING=116 +UINT32=117 +UINT64=118 +TRUE=119 +FALSE=120 +NULL=121 +ARROW=122 +COLON=123 +SEMI=124 +COMMA=125 +DOT=126 +LBRACE=127 +RBRACE=128 +LBRACK=129 +RBRACK=130 +LPAREN=131 +RPAREN=132 +LT=133 +GT=134 +AMP=135 +EQUAL=136 +INTEGER=137 +JSON_NUMBER=138 +IDENTIFIER=139 +STRING_LITERAL=140 +LINE_COMMENT=141 +BLOCK_COMMENT=142 +WS=143 'workspace'=1 -'result-bytes'=2 -'rpc-calls'=3 -'deadline-ms'=4 -'query'=5 -'reflection'=6 -'specialize'=7 -'root'=8 -'document'=9 -'fragments'=10 -'view'=11 -'max'=12 -'allow'=13 -'poll'=14 -'queryable'=15 -'rpc'=16 -'query-reason'=17 -'type'=18 -'object'=19 -'storable'=20 -'implements'=21 -'ref'=22 -'fragment'=23 -'import'=24 -'external'=25 -'atom'=26 -'interface'=27 -'interfaces'=28 -'package'=29 -'value'=30 -'relation'=31 -'operation'=32 -'function'=33 -'constructor'=34 -'constructs'=35 -'input'=36 -'conform'=37 -'as'=38 -'bind'=39 -'static'=40 -'to'=41 -'private'=42 -'shared'=43 -'state'=44 -'edge'=45 -'projection'=46 -'with'=47 -'using'=48 -'via'=49 -'materialize'=50 -'if'=51 -'absent'=52 -'on'=53 -'policy'=54 -'default'=55 -'source'=56 -'repository'=57 -'commit'=58 -'revision'=59 -'semantic-major'=60 -'on-delete'=61 -'retain-other'=62 -'keyed'=63 -'public-traversal'=64 -'id'=65 -'doc'=66 -'mode'=67 -'emits'=68 -'receiver'=69 -'requires'=70 -'any'=71 -'get'=72 -'set'=73 -'watch'=74 -'start'=75 -'stop'=76 -'read'=77 -'write'=78 -'resolve'=79 -'connect'=80 -'disconnect'=81 -'call'=82 -'watch-start'=83 -'watch-stop'=84 -'subscribe'=85 -'unsubscribe'=86 -'optimistic-register'=87 -'crdt'=88 -'optional-one'=89 -'exactly-one'=90 -'many-unique'=91 -'many'=92 -'ordered'=93 -'unit'=94 -'watch-handle'=95 -'message'=96 -'atom-ref'=97 -'interface-ref'=98 -'optional'=99 -'list'=100 -'record'=101 -'bool'=102 -'bytes'=103 -'double'=104 -'int32'=105 -'int64'=106 -'string'=107 -'uint32'=108 -'uint64'=109 -'true'=110 -'false'=111 -'null'=112 -'->'=113 -':'=114 -';'=115 -','=116 -'.'=117 -'{'=118 -'}'=119 -'['=120 -']'=121 -'('=122 -')'=123 -'<'=124 -'>'=125 -'&'=126 -'='=127 +'execution'=2 +'snapshot'=3 +'transaction'=4 +'remote'=5 +'targets'=6 +'portable'=7 +'replica'=8 +'local'=9 +'from'=10 +'result-bytes'=11 +'rpc-calls'=12 +'deadline-ms'=13 +'query'=14 +'reflection'=15 +'specialize'=16 +'root'=17 +'document'=18 +'fragments'=19 +'view'=20 +'max'=21 +'allow'=22 +'poll'=23 +'queryable'=24 +'rpc'=25 +'query-reason'=26 +'type'=27 +'object'=28 +'storable'=29 +'implements'=30 +'ref'=31 +'fragment'=32 +'import'=33 +'external'=34 +'atom'=35 +'interface'=36 +'interfaces'=37 +'package'=38 +'value'=39 +'relation'=40 +'operation'=41 +'function'=42 +'constructor'=43 +'constructs'=44 +'input'=45 +'conform'=46 +'as'=47 +'bind'=48 +'static'=49 +'to'=50 +'private'=51 +'shared'=52 +'state'=53 +'edge'=54 +'projection'=55 +'with'=56 +'using'=57 +'via'=58 +'materialize'=59 +'if'=60 +'absent'=61 +'on'=62 +'policy'=63 +'default'=64 +'source'=65 +'repository'=66 +'commit'=67 +'revision'=68 +'semantic-major'=69 +'on-delete'=70 +'retain-other'=71 +'keyed'=72 +'public-traversal'=73 +'id'=74 +'doc'=75 +'mode'=76 +'emits'=77 +'receiver'=78 +'requires'=79 +'any'=80 +'get'=81 +'set'=82 +'watch'=83 +'start'=84 +'stop'=85 +'read'=86 +'write'=87 +'resolve'=88 +'connect'=89 +'disconnect'=90 +'call'=91 +'watch-start'=92 +'watch-stop'=93 +'subscribe'=94 +'unsubscribe'=95 +'optimistic-register'=96 +'crdt'=97 +'optional-one'=98 +'exactly-one'=99 +'many-unique'=100 +'many'=101 +'ordered'=102 +'unit'=103 +'watch-handle'=104 +'message'=105 +'atom-ref'=106 +'interface-ref'=107 +'optional'=108 +'list'=109 +'record'=110 +'bool'=111 +'bytes'=112 +'double'=113 +'int32'=114 +'int64'=115 +'string'=116 +'uint32'=117 +'uint64'=118 +'true'=119 +'false'=120 +'null'=121 +'->'=122 +':'=123 +';'=124 +','=125 +'.'=126 +'{'=127 +'}'=128 +'['=129 +']'=130 +'('=131 +')'=132 +'<'=133 +'>'=134 +'&'=135 +'='=136 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.ts b/src/capability-language/generated/QuixosCapabilityLexer.ts index aaa0248..e947ca6 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.ts +++ b/src/capability-language/generated/QuixosCapabilityLexer.ts @@ -5,153 +5,164 @@ import { Token } from "antlr4ng"; export class QuixosCapabilityLexer extends antlr.Lexer { public static readonly WORKSPACE = 1; - public static readonly RESULT_BYTES = 2; - public static readonly RPC_CALLS = 3; - public static readonly DEADLINE_MS = 4; - public static readonly QUERY = 5; - public static readonly REFLECTION = 6; - public static readonly SPECIALIZE = 7; - public static readonly ROOT = 8; - public static readonly DOCUMENT = 9; - public static readonly FRAGMENTS = 10; - public static readonly VIEW = 11; - public static readonly MAX = 12; - public static readonly ALLOW = 13; - public static readonly POLL = 14; - public static readonly QUERYABLE = 15; - public static readonly RPC = 16; - public static readonly QUERY_REASON = 17; - public static readonly TYPE = 18; - public static readonly OBJECT = 19; - public static readonly STORABLE = 20; - public static readonly IMPLEMENTS = 21; - public static readonly REF = 22; - public static readonly FRAGMENT = 23; - public static readonly IMPORT = 24; - public static readonly EXTERNAL = 25; - public static readonly ATOM = 26; - public static readonly INTERFACE = 27; - public static readonly INTERFACES = 28; - public static readonly PACKAGE = 29; - public static readonly VALUE = 30; - public static readonly RELATION = 31; - public static readonly OPERATION = 32; - public static readonly FUNCTION = 33; - public static readonly CONSTRUCTOR = 34; - public static readonly CONSTRUCTS = 35; - public static readonly INPUT = 36; - public static readonly CONFORM = 37; - public static readonly AS = 38; - public static readonly BIND = 39; - public static readonly STATIC = 40; - public static readonly TO = 41; - public static readonly PRIVATE = 42; - public static readonly SHARED = 43; - public static readonly STATE = 44; - public static readonly EDGE = 45; - public static readonly PROJECTION = 46; - public static readonly WITH = 47; - public static readonly USING = 48; - public static readonly VIA = 49; - public static readonly MATERIALIZE = 50; - public static readonly IF = 51; - public static readonly ABSENT = 52; - public static readonly ON = 53; - public static readonly POLICY = 54; - public static readonly DEFAULT = 55; - public static readonly SOURCE = 56; - public static readonly REPOSITORY = 57; - public static readonly COMMIT = 58; - public static readonly REVISION = 59; - public static readonly SEMANTIC_MAJOR = 60; - public static readonly ON_DELETE = 61; - public static readonly RETAIN_OTHER = 62; - public static readonly KEYED = 63; - public static readonly PUBLIC_TRAVERSAL = 64; - public static readonly ID = 65; - public static readonly DOC = 66; - public static readonly MODE = 67; - public static readonly EMITS = 68; - public static readonly RECEIVER = 69; - public static readonly REQUIRES = 70; - public static readonly ANY = 71; - public static readonly GET = 72; - public static readonly SET = 73; - public static readonly WATCH = 74; - public static readonly START = 75; - public static readonly STOP = 76; - public static readonly READ = 77; - public static readonly WRITE = 78; - public static readonly RESOLVE = 79; - public static readonly CONNECT = 80; - public static readonly DISCONNECT = 81; - public static readonly CALL = 82; - public static readonly WATCH_START = 83; - public static readonly WATCH_STOP = 84; - public static readonly SUBSCRIBE = 85; - public static readonly UNSUBSCRIBE = 86; - public static readonly OPTIMISTIC_REGISTER = 87; - public static readonly CRDT = 88; - public static readonly OPTIONAL_ONE = 89; - public static readonly EXACTLY_ONE = 90; - public static readonly MANY_UNIQUE = 91; - public static readonly MANY = 92; - public static readonly ORDERED = 93; - public static readonly UNIT = 94; - public static readonly WATCH_HANDLE = 95; - public static readonly MESSAGE = 96; - public static readonly ATOM_REF = 97; - public static readonly INTERFACE_REF = 98; - public static readonly OPTIONAL = 99; - public static readonly LIST = 100; - public static readonly RECORD = 101; - public static readonly BOOL = 102; - public static readonly BYTES = 103; - public static readonly DOUBLE = 104; - public static readonly INT32 = 105; - public static readonly INT64 = 106; - public static readonly STRING = 107; - public static readonly UINT32 = 108; - public static readonly UINT64 = 109; - public static readonly TRUE = 110; - public static readonly FALSE = 111; - public static readonly NULL = 112; - public static readonly ARROW = 113; - public static readonly COLON = 114; - public static readonly SEMI = 115; - public static readonly COMMA = 116; - public static readonly DOT = 117; - public static readonly LBRACE = 118; - public static readonly RBRACE = 119; - public static readonly LBRACK = 120; - public static readonly RBRACK = 121; - public static readonly LPAREN = 122; - public static readonly RPAREN = 123; - public static readonly LT = 124; - public static readonly GT = 125; - public static readonly AMP = 126; - public static readonly EQUAL = 127; - public static readonly INTEGER = 128; - public static readonly JSON_NUMBER = 129; - public static readonly IDENTIFIER = 130; - public static readonly STRING_LITERAL = 131; - public static readonly LINE_COMMENT = 132; - public static readonly BLOCK_COMMENT = 133; - public static readonly WS = 134; + public static readonly EXECUTION = 2; + public static readonly SNAPSHOT = 3; + public static readonly TRANSACTION = 4; + public static readonly REMOTE = 5; + public static readonly TARGETS = 6; + public static readonly PORTABLE = 7; + public static readonly REPLICA = 8; + public static readonly LOCAL = 9; + public static readonly FROM = 10; + public static readonly RESULT_BYTES = 11; + public static readonly RPC_CALLS = 12; + public static readonly DEADLINE_MS = 13; + public static readonly QUERY = 14; + public static readonly REFLECTION = 15; + public static readonly SPECIALIZE = 16; + public static readonly ROOT = 17; + public static readonly DOCUMENT = 18; + public static readonly FRAGMENTS = 19; + public static readonly VIEW = 20; + public static readonly MAX = 21; + public static readonly ALLOW = 22; + public static readonly POLL = 23; + public static readonly QUERYABLE = 24; + public static readonly RPC = 25; + public static readonly QUERY_REASON = 26; + public static readonly TYPE = 27; + public static readonly OBJECT = 28; + public static readonly STORABLE = 29; + public static readonly IMPLEMENTS = 30; + public static readonly REF = 31; + public static readonly FRAGMENT = 32; + public static readonly IMPORT = 33; + public static readonly EXTERNAL = 34; + public static readonly ATOM = 35; + public static readonly INTERFACE = 36; + public static readonly INTERFACES = 37; + public static readonly PACKAGE = 38; + public static readonly VALUE = 39; + public static readonly RELATION = 40; + public static readonly OPERATION = 41; + public static readonly FUNCTION = 42; + public static readonly CONSTRUCTOR = 43; + public static readonly CONSTRUCTS = 44; + public static readonly INPUT = 45; + public static readonly CONFORM = 46; + public static readonly AS = 47; + public static readonly BIND = 48; + public static readonly STATIC = 49; + public static readonly TO = 50; + public static readonly PRIVATE = 51; + public static readonly SHARED = 52; + public static readonly STATE = 53; + public static readonly EDGE = 54; + public static readonly PROJECTION = 55; + public static readonly WITH = 56; + public static readonly USING = 57; + public static readonly VIA = 58; + public static readonly MATERIALIZE = 59; + public static readonly IF = 60; + public static readonly ABSENT = 61; + public static readonly ON = 62; + public static readonly POLICY = 63; + public static readonly DEFAULT = 64; + public static readonly SOURCE = 65; + public static readonly REPOSITORY = 66; + public static readonly COMMIT = 67; + public static readonly REVISION = 68; + public static readonly SEMANTIC_MAJOR = 69; + public static readonly ON_DELETE = 70; + public static readonly RETAIN_OTHER = 71; + public static readonly KEYED = 72; + public static readonly PUBLIC_TRAVERSAL = 73; + public static readonly ID = 74; + public static readonly DOC = 75; + public static readonly MODE = 76; + public static readonly EMITS = 77; + public static readonly RECEIVER = 78; + public static readonly REQUIRES = 79; + public static readonly ANY = 80; + public static readonly GET = 81; + public static readonly SET = 82; + public static readonly WATCH = 83; + public static readonly START = 84; + public static readonly STOP = 85; + public static readonly READ = 86; + public static readonly WRITE = 87; + public static readonly RESOLVE = 88; + public static readonly CONNECT = 89; + public static readonly DISCONNECT = 90; + public static readonly CALL = 91; + public static readonly WATCH_START = 92; + public static readonly WATCH_STOP = 93; + public static readonly SUBSCRIBE = 94; + public static readonly UNSUBSCRIBE = 95; + public static readonly OPTIMISTIC_REGISTER = 96; + public static readonly CRDT = 97; + public static readonly OPTIONAL_ONE = 98; + public static readonly EXACTLY_ONE = 99; + public static readonly MANY_UNIQUE = 100; + public static readonly MANY = 101; + public static readonly ORDERED = 102; + public static readonly UNIT = 103; + public static readonly WATCH_HANDLE = 104; + public static readonly MESSAGE = 105; + public static readonly ATOM_REF = 106; + public static readonly INTERFACE_REF = 107; + public static readonly OPTIONAL = 108; + public static readonly LIST = 109; + public static readonly RECORD = 110; + public static readonly BOOL = 111; + public static readonly BYTES = 112; + public static readonly DOUBLE = 113; + public static readonly INT32 = 114; + public static readonly INT64 = 115; + public static readonly STRING = 116; + public static readonly UINT32 = 117; + public static readonly UINT64 = 118; + public static readonly TRUE = 119; + public static readonly FALSE = 120; + public static readonly NULL = 121; + public static readonly ARROW = 122; + public static readonly COLON = 123; + public static readonly SEMI = 124; + public static readonly COMMA = 125; + public static readonly DOT = 126; + public static readonly LBRACE = 127; + public static readonly RBRACE = 128; + public static readonly LBRACK = 129; + public static readonly RBRACK = 130; + public static readonly LPAREN = 131; + public static readonly RPAREN = 132; + public static readonly LT = 133; + public static readonly GT = 134; + public static readonly AMP = 135; + public static readonly EQUAL = 136; + public static readonly INTEGER = 137; + public static readonly JSON_NUMBER = 138; + public static readonly IDENTIFIER = 139; + public static readonly STRING_LITERAL = 140; + public static readonly LINE_COMMENT = 141; + public static readonly BLOCK_COMMENT = 142; + public static readonly WS = 143; public static readonly channelNames = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" ]; public static readonly literalNames = [ - null, "'workspace'", "'result-bytes'", "'rpc-calls'", "'deadline-ms'", - "'query'", "'reflection'", "'specialize'", "'root'", "'document'", - "'fragments'", "'view'", "'max'", "'allow'", "'poll'", "'queryable'", - "'rpc'", "'query-reason'", "'type'", "'object'", "'storable'", "'implements'", - "'ref'", "'fragment'", "'import'", "'external'", "'atom'", "'interface'", - "'interfaces'", "'package'", "'value'", "'relation'", "'operation'", - "'function'", "'constructor'", "'constructs'", "'input'", "'conform'", - "'as'", "'bind'", "'static'", "'to'", "'private'", "'shared'", "'state'", + null, "'workspace'", "'execution'", "'snapshot'", "'transaction'", + "'remote'", "'targets'", "'portable'", "'replica'", "'local'", "'from'", + "'result-bytes'", "'rpc-calls'", "'deadline-ms'", "'query'", "'reflection'", + "'specialize'", "'root'", "'document'", "'fragments'", "'view'", + "'max'", "'allow'", "'poll'", "'queryable'", "'rpc'", "'query-reason'", + "'type'", "'object'", "'storable'", "'implements'", "'ref'", "'fragment'", + "'import'", "'external'", "'atom'", "'interface'", "'interfaces'", + "'package'", "'value'", "'relation'", "'operation'", "'function'", + "'constructor'", "'constructs'", "'input'", "'conform'", "'as'", + "'bind'", "'static'", "'to'", "'private'", "'shared'", "'state'", "'edge'", "'projection'", "'with'", "'using'", "'via'", "'materialize'", "'if'", "'absent'", "'on'", "'policy'", "'default'", "'source'", "'repository'", "'commit'", "'revision'", "'semantic-major'", "'on-delete'", @@ -169,28 +180,29 @@ export class QuixosCapabilityLexer extends antlr.Lexer { ]; public static readonly symbolicNames = [ - null, "WORKSPACE", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", - "REFLECTION", "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", - "MAX", "ALLOW", "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", - "OBJECT", "STORABLE", "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", - "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", - "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", - "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", "PRIVATE", "SHARED", - "STATE", "EDGE", "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", - "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", - "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", "RETAIN_OTHER", - "KEYED", "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", "EMITS", "RECEIVER", - "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", - "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", - "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", - "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", - "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", - "OPTIONAL", "LIST", "RECORD", "BOOL", "BYTES", "DOUBLE", "INT32", - "INT64", "STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", - "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", - "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "AMP", "EQUAL", "INTEGER", - "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", - "WS" + null, "WORKSPACE", "EXECUTION", "SNAPSHOT", "TRANSACTION", "REMOTE", + "TARGETS", "PORTABLE", "REPLICA", "LOCAL", "FROM", "RESULT_BYTES", + "RPC_CALLS", "DEADLINE_MS", "QUERY", "REFLECTION", "SPECIALIZE", + "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", "MAX", "ALLOW", "POLL", + "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", "OBJECT", "STORABLE", + "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", + "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", + "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", + "TO", "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", + "USING", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", + "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", + "ON_DELETE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", + "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", + "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", + "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", + "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", + "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", + "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", "BOOL", + "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", + "TRUE", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", + "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", + "GT", "AMP", "EQUAL", "INTEGER", "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", + "LINE_COMMENT", "BLOCK_COMMENT", "WS" ]; public static readonly modeNames = [ @@ -198,28 +210,29 @@ export class QuixosCapabilityLexer extends antlr.Lexer { ]; public static readonly ruleNames = [ - "WORKSPACE", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", - "REFLECTION", "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", - "MAX", "ALLOW", "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", - "OBJECT", "STORABLE", "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", - "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", - "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", - "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", "PRIVATE", "SHARED", - "STATE", "EDGE", "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", - "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", - "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", "RETAIN_OTHER", - "KEYED", "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", "EMITS", "RECEIVER", - "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", - "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", - "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", - "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", - "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", - "OPTIONAL", "LIST", "RECORD", "BOOL", "BYTES", "DOUBLE", "INT32", - "INT64", "STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", - "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", - "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "AMP", "EQUAL", "INTEGER", - "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "ESC", "HEX", "LINE_COMMENT", - "BLOCK_COMMENT", "WS", + "WORKSPACE", "EXECUTION", "SNAPSHOT", "TRANSACTION", "REMOTE", "TARGETS", + "PORTABLE", "REPLICA", "LOCAL", "FROM", "RESULT_BYTES", "RPC_CALLS", + "DEADLINE_MS", "QUERY", "REFLECTION", "SPECIALIZE", "ROOT", "DOCUMENT", + "FRAGMENTS", "VIEW", "MAX", "ALLOW", "POLL", "QUERYABLE", "RPC", + "QUERY_REASON", "TYPE", "OBJECT", "STORABLE", "IMPLEMENTS", "REF", + "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", + "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", + "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", + "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", "USING", + "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", + "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", + "ON_DELETE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", + "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", + "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", + "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", + "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", + "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", + "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", "BOOL", + "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", + "TRUE", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", + "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", + "GT", "AMP", "EQUAL", "INTEGER", "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", + "ESC", "HEX", "LINE_COMMENT", "BLOCK_COMMENT", "WS", ]; @@ -241,7 +254,7 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public get modeNames(): string[] { return QuixosCapabilityLexer.modeNames; } public static readonly _serializedATN: number[] = [ - 4,0,134,1285,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, + 4,0,143,1377,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, @@ -262,453 +275,489 @@ export class QuixosCapabilityLexer extends antlr.Lexer { 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,1,0, - 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, - 1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4, - 1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6, - 1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,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,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9, - 1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12, - 1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14, - 1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,16,1,16,1,16,1,16,1,16, - 1,16,1,16,1,16,1,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,19,1,19,1,19,1,19,1,19,1,19, - 1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20, - 1,20,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,23,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24, - 1,24,1,24,1,24,1,24,1,25,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,26,1,26,1,27,1,27,1,27,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,28,1,28,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,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,32,1,32,1,32,1,32,1,32,1,33,1,33,1,33,1,33,1,33,1,33, - 1,33,1,33,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,1,34,1,34, - 1,34,1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,35,1,35,1,36,1,36,1,36, - 1,36,1,36,1,36,1,36,1,36,1,37,1,37,1,37,1,38,1,38,1,38,1,38,1,38, - 1,39,1,39,1,39,1,39,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,41,1,41,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,43, - 1,43,1,43,1,43,1,43,1,43,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,45,1,45,1,46,1,46,1,46,1,46,1,46, - 1,47,1,47,1,47,1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,49,1,49,1,49, - 1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,50,1,50,1,50,1,51, - 1,51,1,51,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,1,53,1,54,1,54,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,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,58,1,58,1,58,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,60,1,60,1,60,1,60,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,61, - 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,63,1,63,1,63,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,65,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,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,71,1,71,1,71,1,71,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,75,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,78,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,79,1,80,1,80,1,80,1,80,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,82,1,82,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,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,85,1,85,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,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,87,1,87,1,88,1,88, - 1,88,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,89,1,89,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,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,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,94,1,94,1,94, - 1,94,1,95,1,95,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,96,1,96,1,96,1,97,1,97,1,97,1,97,1,97,1,97,1,97,1,97, - 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,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,100,1,100,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,104,1,105,1,105,1,105,1,105,1,105,1,105,1,106, - 1,106,1,106,1,106,1,106,1,106,1,106,1,107,1,107,1,107,1,107,1,107, - 1,107,1,107,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,109,1,109, - 1,109,1,109,1,109,1,110,1,110,1,110,1,110,1,110,1,110,1,111,1,111, - 1,111,1,111,1,111,1,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,3,127,1186,8,127,1,127,4,127,1189,8,127,11,127,12,127, - 1190,1,128,3,128,1194,8,128,1,128,1,128,1,128,5,128,1199,8,128,10, - 128,12,128,1202,9,128,3,128,1204,8,128,1,128,1,128,4,128,1208,8, - 128,11,128,12,128,1209,3,128,1212,8,128,1,128,1,128,3,128,1216,8, - 128,1,128,4,128,1219,8,128,11,128,12,128,1220,3,128,1223,8,128,1, - 129,1,129,5,129,1227,8,129,10,129,12,129,1230,9,129,1,130,1,130, - 1,130,5,130,1235,8,130,10,130,12,130,1238,9,130,1,130,1,130,1,131, - 1,131,1,131,1,131,1,131,1,131,1,131,1,131,3,131,1250,8,131,1,132, - 1,132,1,133,1,133,1,133,1,133,5,133,1258,8,133,10,133,12,133,1261, - 9,133,1,133,1,133,1,134,1,134,1,134,1,134,5,134,1269,8,134,10,134, - 12,134,1272,9,134,1,134,1,134,1,134,1,134,1,134,1,135,4,135,1280, - 8,135,11,135,12,135,1281,1,135,1,135,1,1270,0,136,1,1,3,2,5,3,7, - 4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13,27,14,29,15,31, - 16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,47,24,49,25,51,26,53, - 27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,69,35,71,36,73,37,75, - 38,77,39,79,40,81,41,83,42,85,43,87,44,89,45,91,46,93,47,95,48,97, - 49,99,50,101,51,103,52,105,53,107,54,109,55,111,56,113,57,115,58, - 117,59,119,60,121,61,123,62,125,63,127,64,129,65,131,66,133,67,135, - 68,137,69,139,70,141,71,143,72,145,73,147,74,149,75,151,76,153,77, - 155,78,157,79,159,80,161,81,163,82,165,83,167,84,169,85,171,86,173, - 87,175,88,177,89,179,90,181,91,183,92,185,93,187,94,189,95,191,96, - 193,97,195,98,197,99,199,100,201,101,203,102,205,103,207,104,209, - 105,211,106,213,107,215,108,217,109,219,110,221,111,223,112,225, - 113,227,114,229,115,231,116,233,117,235,118,237,119,239,120,241, - 121,243,122,245,123,247,124,249,125,251,126,253,127,255,128,257, - 129,259,130,261,131,263,0,265,0,267,132,269,133,271,134,1,0,11,1, - 0,48,57,1,0,49,57,2,0,69,69,101,101,2,0,43,43,45,45,3,0,65,90,95, - 95,97,122,4,0,48,57,65,90,95,95,97,122,4,0,10,10,13,13,34,34,92, - 92,8,0,34,34,47,47,92,92,98,98,102,102,110,110,114,114,116,116,3, - 0,48,57,65,70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32,32,1299,0, - 1,1,0,0,0,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,229,1,0, - 0,0,0,231,1,0,0,0,0,233,1,0,0,0,0,235,1,0,0,0,0,237,1,0,0,0,0,239, - 1,0,0,0,0,241,1,0,0,0,0,243,1,0,0,0,0,245,1,0,0,0,0,247,1,0,0,0, - 0,249,1,0,0,0,0,251,1,0,0,0,0,253,1,0,0,0,0,255,1,0,0,0,0,257,1, - 0,0,0,0,259,1,0,0,0,0,261,1,0,0,0,0,267,1,0,0,0,0,269,1,0,0,0,0, - 271,1,0,0,0,1,273,1,0,0,0,3,283,1,0,0,0,5,296,1,0,0,0,7,306,1,0, - 0,0,9,318,1,0,0,0,11,324,1,0,0,0,13,335,1,0,0,0,15,346,1,0,0,0,17, - 351,1,0,0,0,19,360,1,0,0,0,21,370,1,0,0,0,23,375,1,0,0,0,25,379, - 1,0,0,0,27,385,1,0,0,0,29,390,1,0,0,0,31,400,1,0,0,0,33,404,1,0, - 0,0,35,417,1,0,0,0,37,422,1,0,0,0,39,429,1,0,0,0,41,438,1,0,0,0, - 43,449,1,0,0,0,45,453,1,0,0,0,47,462,1,0,0,0,49,469,1,0,0,0,51,478, - 1,0,0,0,53,483,1,0,0,0,55,493,1,0,0,0,57,504,1,0,0,0,59,512,1,0, - 0,0,61,518,1,0,0,0,63,527,1,0,0,0,65,537,1,0,0,0,67,546,1,0,0,0, - 69,558,1,0,0,0,71,569,1,0,0,0,73,575,1,0,0,0,75,583,1,0,0,0,77,586, - 1,0,0,0,79,591,1,0,0,0,81,598,1,0,0,0,83,601,1,0,0,0,85,609,1,0, - 0,0,87,616,1,0,0,0,89,622,1,0,0,0,91,627,1,0,0,0,93,638,1,0,0,0, - 95,643,1,0,0,0,97,649,1,0,0,0,99,653,1,0,0,0,101,665,1,0,0,0,103, - 668,1,0,0,0,105,675,1,0,0,0,107,678,1,0,0,0,109,685,1,0,0,0,111, - 693,1,0,0,0,113,700,1,0,0,0,115,711,1,0,0,0,117,718,1,0,0,0,119, - 727,1,0,0,0,121,742,1,0,0,0,123,752,1,0,0,0,125,765,1,0,0,0,127, - 771,1,0,0,0,129,788,1,0,0,0,131,791,1,0,0,0,133,795,1,0,0,0,135, - 800,1,0,0,0,137,806,1,0,0,0,139,815,1,0,0,0,141,824,1,0,0,0,143, - 828,1,0,0,0,145,832,1,0,0,0,147,836,1,0,0,0,149,842,1,0,0,0,151, - 848,1,0,0,0,153,853,1,0,0,0,155,858,1,0,0,0,157,864,1,0,0,0,159, - 872,1,0,0,0,161,880,1,0,0,0,163,891,1,0,0,0,165,896,1,0,0,0,167, - 908,1,0,0,0,169,919,1,0,0,0,171,929,1,0,0,0,173,941,1,0,0,0,175, - 961,1,0,0,0,177,966,1,0,0,0,179,979,1,0,0,0,181,991,1,0,0,0,183, - 1003,1,0,0,0,185,1008,1,0,0,0,187,1016,1,0,0,0,189,1021,1,0,0,0, - 191,1034,1,0,0,0,193,1042,1,0,0,0,195,1051,1,0,0,0,197,1065,1,0, - 0,0,199,1074,1,0,0,0,201,1079,1,0,0,0,203,1086,1,0,0,0,205,1091, - 1,0,0,0,207,1097,1,0,0,0,209,1104,1,0,0,0,211,1110,1,0,0,0,213,1116, - 1,0,0,0,215,1123,1,0,0,0,217,1130,1,0,0,0,219,1137,1,0,0,0,221,1142, - 1,0,0,0,223,1148,1,0,0,0,225,1153,1,0,0,0,227,1156,1,0,0,0,229,1158, - 1,0,0,0,231,1160,1,0,0,0,233,1162,1,0,0,0,235,1164,1,0,0,0,237,1166, - 1,0,0,0,239,1168,1,0,0,0,241,1170,1,0,0,0,243,1172,1,0,0,0,245,1174, - 1,0,0,0,247,1176,1,0,0,0,249,1178,1,0,0,0,251,1180,1,0,0,0,253,1182, - 1,0,0,0,255,1185,1,0,0,0,257,1193,1,0,0,0,259,1224,1,0,0,0,261,1231, - 1,0,0,0,263,1241,1,0,0,0,265,1251,1,0,0,0,267,1253,1,0,0,0,269,1264, - 1,0,0,0,271,1279,1,0,0,0,273,274,5,119,0,0,274,275,5,111,0,0,275, - 276,5,114,0,0,276,277,5,107,0,0,277,278,5,115,0,0,278,279,5,112, - 0,0,279,280,5,97,0,0,280,281,5,99,0,0,281,282,5,101,0,0,282,2,1, - 0,0,0,283,284,5,114,0,0,284,285,5,101,0,0,285,286,5,115,0,0,286, - 287,5,117,0,0,287,288,5,108,0,0,288,289,5,116,0,0,289,290,5,45,0, - 0,290,291,5,98,0,0,291,292,5,121,0,0,292,293,5,116,0,0,293,294,5, - 101,0,0,294,295,5,115,0,0,295,4,1,0,0,0,296,297,5,114,0,0,297,298, - 5,112,0,0,298,299,5,99,0,0,299,300,5,45,0,0,300,301,5,99,0,0,301, - 302,5,97,0,0,302,303,5,108,0,0,303,304,5,108,0,0,304,305,5,115,0, - 0,305,6,1,0,0,0,306,307,5,100,0,0,307,308,5,101,0,0,308,309,5,97, - 0,0,309,310,5,100,0,0,310,311,5,108,0,0,311,312,5,105,0,0,312,313, - 5,110,0,0,313,314,5,101,0,0,314,315,5,45,0,0,315,316,5,109,0,0,316, - 317,5,115,0,0,317,8,1,0,0,0,318,319,5,113,0,0,319,320,5,117,0,0, - 320,321,5,101,0,0,321,322,5,114,0,0,322,323,5,121,0,0,323,10,1,0, - 0,0,324,325,5,114,0,0,325,326,5,101,0,0,326,327,5,102,0,0,327,328, - 5,108,0,0,328,329,5,101,0,0,329,330,5,99,0,0,330,331,5,116,0,0,331, - 332,5,105,0,0,332,333,5,111,0,0,333,334,5,110,0,0,334,12,1,0,0,0, - 335,336,5,115,0,0,336,337,5,112,0,0,337,338,5,101,0,0,338,339,5, - 99,0,0,339,340,5,105,0,0,340,341,5,97,0,0,341,342,5,108,0,0,342, - 343,5,105,0,0,343,344,5,122,0,0,344,345,5,101,0,0,345,14,1,0,0,0, - 346,347,5,114,0,0,347,348,5,111,0,0,348,349,5,111,0,0,349,350,5, - 116,0,0,350,16,1,0,0,0,351,352,5,100,0,0,352,353,5,111,0,0,353,354, - 5,99,0,0,354,355,5,117,0,0,355,356,5,109,0,0,356,357,5,101,0,0,357, - 358,5,110,0,0,358,359,5,116,0,0,359,18,1,0,0,0,360,361,5,102,0,0, - 361,362,5,114,0,0,362,363,5,97,0,0,363,364,5,103,0,0,364,365,5,109, - 0,0,365,366,5,101,0,0,366,367,5,110,0,0,367,368,5,116,0,0,368,369, - 5,115,0,0,369,20,1,0,0,0,370,371,5,118,0,0,371,372,5,105,0,0,372, - 373,5,101,0,0,373,374,5,119,0,0,374,22,1,0,0,0,375,376,5,109,0,0, - 376,377,5,97,0,0,377,378,5,120,0,0,378,24,1,0,0,0,379,380,5,97,0, - 0,380,381,5,108,0,0,381,382,5,108,0,0,382,383,5,111,0,0,383,384, - 5,119,0,0,384,26,1,0,0,0,385,386,5,112,0,0,386,387,5,111,0,0,387, - 388,5,108,0,0,388,389,5,108,0,0,389,28,1,0,0,0,390,391,5,113,0,0, - 391,392,5,117,0,0,392,393,5,101,0,0,393,394,5,114,0,0,394,395,5, - 121,0,0,395,396,5,97,0,0,396,397,5,98,0,0,397,398,5,108,0,0,398, - 399,5,101,0,0,399,30,1,0,0,0,400,401,5,114,0,0,401,402,5,112,0,0, - 402,403,5,99,0,0,403,32,1,0,0,0,404,405,5,113,0,0,405,406,5,117, - 0,0,406,407,5,101,0,0,407,408,5,114,0,0,408,409,5,121,0,0,409,410, - 5,45,0,0,410,411,5,114,0,0,411,412,5,101,0,0,412,413,5,97,0,0,413, - 414,5,115,0,0,414,415,5,111,0,0,415,416,5,110,0,0,416,34,1,0,0,0, - 417,418,5,116,0,0,418,419,5,121,0,0,419,420,5,112,0,0,420,421,5, - 101,0,0,421,36,1,0,0,0,422,423,5,111,0,0,423,424,5,98,0,0,424,425, - 5,106,0,0,425,426,5,101,0,0,426,427,5,99,0,0,427,428,5,116,0,0,428, - 38,1,0,0,0,429,430,5,115,0,0,430,431,5,116,0,0,431,432,5,111,0,0, - 432,433,5,114,0,0,433,434,5,97,0,0,434,435,5,98,0,0,435,436,5,108, - 0,0,436,437,5,101,0,0,437,40,1,0,0,0,438,439,5,105,0,0,439,440,5, - 109,0,0,440,441,5,112,0,0,441,442,5,108,0,0,442,443,5,101,0,0,443, - 444,5,109,0,0,444,445,5,101,0,0,445,446,5,110,0,0,446,447,5,116, - 0,0,447,448,5,115,0,0,448,42,1,0,0,0,449,450,5,114,0,0,450,451,5, - 101,0,0,451,452,5,102,0,0,452,44,1,0,0,0,453,454,5,102,0,0,454,455, - 5,114,0,0,455,456,5,97,0,0,456,457,5,103,0,0,457,458,5,109,0,0,458, - 459,5,101,0,0,459,460,5,110,0,0,460,461,5,116,0,0,461,46,1,0,0,0, - 462,463,5,105,0,0,463,464,5,109,0,0,464,465,5,112,0,0,465,466,5, - 111,0,0,466,467,5,114,0,0,467,468,5,116,0,0,468,48,1,0,0,0,469,470, - 5,101,0,0,470,471,5,120,0,0,471,472,5,116,0,0,472,473,5,101,0,0, - 473,474,5,114,0,0,474,475,5,110,0,0,475,476,5,97,0,0,476,477,5,108, - 0,0,477,50,1,0,0,0,478,479,5,97,0,0,479,480,5,116,0,0,480,481,5, - 111,0,0,481,482,5,109,0,0,482,52,1,0,0,0,483,484,5,105,0,0,484,485, - 5,110,0,0,485,486,5,116,0,0,486,487,5,101,0,0,487,488,5,114,0,0, - 488,489,5,102,0,0,489,490,5,97,0,0,490,491,5,99,0,0,491,492,5,101, - 0,0,492,54,1,0,0,0,493,494,5,105,0,0,494,495,5,110,0,0,495,496,5, - 116,0,0,496,497,5,101,0,0,497,498,5,114,0,0,498,499,5,102,0,0,499, - 500,5,97,0,0,500,501,5,99,0,0,501,502,5,101,0,0,502,503,5,115,0, - 0,503,56,1,0,0,0,504,505,5,112,0,0,505,506,5,97,0,0,506,507,5,99, - 0,0,507,508,5,107,0,0,508,509,5,97,0,0,509,510,5,103,0,0,510,511, - 5,101,0,0,511,58,1,0,0,0,512,513,5,118,0,0,513,514,5,97,0,0,514, - 515,5,108,0,0,515,516,5,117,0,0,516,517,5,101,0,0,517,60,1,0,0,0, - 518,519,5,114,0,0,519,520,5,101,0,0,520,521,5,108,0,0,521,522,5, - 97,0,0,522,523,5,116,0,0,523,524,5,105,0,0,524,525,5,111,0,0,525, - 526,5,110,0,0,526,62,1,0,0,0,527,528,5,111,0,0,528,529,5,112,0,0, - 529,530,5,101,0,0,530,531,5,114,0,0,531,532,5,97,0,0,532,533,5,116, - 0,0,533,534,5,105,0,0,534,535,5,111,0,0,535,536,5,110,0,0,536,64, - 1,0,0,0,537,538,5,102,0,0,538,539,5,117,0,0,539,540,5,110,0,0,540, - 541,5,99,0,0,541,542,5,116,0,0,542,543,5,105,0,0,543,544,5,111,0, - 0,544,545,5,110,0,0,545,66,1,0,0,0,546,547,5,99,0,0,547,548,5,111, - 0,0,548,549,5,110,0,0,549,550,5,115,0,0,550,551,5,116,0,0,551,552, - 5,114,0,0,552,553,5,117,0,0,553,554,5,99,0,0,554,555,5,116,0,0,555, - 556,5,111,0,0,556,557,5,114,0,0,557,68,1,0,0,0,558,559,5,99,0,0, - 559,560,5,111,0,0,560,561,5,110,0,0,561,562,5,115,0,0,562,563,5, - 116,0,0,563,564,5,114,0,0,564,565,5,117,0,0,565,566,5,99,0,0,566, - 567,5,116,0,0,567,568,5,115,0,0,568,70,1,0,0,0,569,570,5,105,0,0, - 570,571,5,110,0,0,571,572,5,112,0,0,572,573,5,117,0,0,573,574,5, - 116,0,0,574,72,1,0,0,0,575,576,5,99,0,0,576,577,5,111,0,0,577,578, - 5,110,0,0,578,579,5,102,0,0,579,580,5,111,0,0,580,581,5,114,0,0, - 581,582,5,109,0,0,582,74,1,0,0,0,583,584,5,97,0,0,584,585,5,115, - 0,0,585,76,1,0,0,0,586,587,5,98,0,0,587,588,5,105,0,0,588,589,5, - 110,0,0,589,590,5,100,0,0,590,78,1,0,0,0,591,592,5,115,0,0,592,593, - 5,116,0,0,593,594,5,97,0,0,594,595,5,116,0,0,595,596,5,105,0,0,596, - 597,5,99,0,0,597,80,1,0,0,0,598,599,5,116,0,0,599,600,5,111,0,0, - 600,82,1,0,0,0,601,602,5,112,0,0,602,603,5,114,0,0,603,604,5,105, - 0,0,604,605,5,118,0,0,605,606,5,97,0,0,606,607,5,116,0,0,607,608, - 5,101,0,0,608,84,1,0,0,0,609,610,5,115,0,0,610,611,5,104,0,0,611, - 612,5,97,0,0,612,613,5,114,0,0,613,614,5,101,0,0,614,615,5,100,0, - 0,615,86,1,0,0,0,616,617,5,115,0,0,617,618,5,116,0,0,618,619,5,97, - 0,0,619,620,5,116,0,0,620,621,5,101,0,0,621,88,1,0,0,0,622,623,5, - 101,0,0,623,624,5,100,0,0,624,625,5,103,0,0,625,626,5,101,0,0,626, - 90,1,0,0,0,627,628,5,112,0,0,628,629,5,114,0,0,629,630,5,111,0,0, - 630,631,5,106,0,0,631,632,5,101,0,0,632,633,5,99,0,0,633,634,5,116, - 0,0,634,635,5,105,0,0,635,636,5,111,0,0,636,637,5,110,0,0,637,92, - 1,0,0,0,638,639,5,119,0,0,639,640,5,105,0,0,640,641,5,116,0,0,641, - 642,5,104,0,0,642,94,1,0,0,0,643,644,5,117,0,0,644,645,5,115,0,0, - 645,646,5,105,0,0,646,647,5,110,0,0,647,648,5,103,0,0,648,96,1,0, - 0,0,649,650,5,118,0,0,650,651,5,105,0,0,651,652,5,97,0,0,652,98, - 1,0,0,0,653,654,5,109,0,0,654,655,5,97,0,0,655,656,5,116,0,0,656, - 657,5,101,0,0,657,658,5,114,0,0,658,659,5,105,0,0,659,660,5,97,0, - 0,660,661,5,108,0,0,661,662,5,105,0,0,662,663,5,122,0,0,663,664, - 5,101,0,0,664,100,1,0,0,0,665,666,5,105,0,0,666,667,5,102,0,0,667, - 102,1,0,0,0,668,669,5,97,0,0,669,670,5,98,0,0,670,671,5,115,0,0, - 671,672,5,101,0,0,672,673,5,110,0,0,673,674,5,116,0,0,674,104,1, - 0,0,0,675,676,5,111,0,0,676,677,5,110,0,0,677,106,1,0,0,0,678,679, - 5,112,0,0,679,680,5,111,0,0,680,681,5,108,0,0,681,682,5,105,0,0, - 682,683,5,99,0,0,683,684,5,121,0,0,684,108,1,0,0,0,685,686,5,100, - 0,0,686,687,5,101,0,0,687,688,5,102,0,0,688,689,5,97,0,0,689,690, - 5,117,0,0,690,691,5,108,0,0,691,692,5,116,0,0,692,110,1,0,0,0,693, - 694,5,115,0,0,694,695,5,111,0,0,695,696,5,117,0,0,696,697,5,114, - 0,0,697,698,5,99,0,0,698,699,5,101,0,0,699,112,1,0,0,0,700,701,5, - 114,0,0,701,702,5,101,0,0,702,703,5,112,0,0,703,704,5,111,0,0,704, - 705,5,115,0,0,705,706,5,105,0,0,706,707,5,116,0,0,707,708,5,111, - 0,0,708,709,5,114,0,0,709,710,5,121,0,0,710,114,1,0,0,0,711,712, - 5,99,0,0,712,713,5,111,0,0,713,714,5,109,0,0,714,715,5,109,0,0,715, - 716,5,105,0,0,716,717,5,116,0,0,717,116,1,0,0,0,718,719,5,114,0, - 0,719,720,5,101,0,0,720,721,5,118,0,0,721,722,5,105,0,0,722,723, - 5,115,0,0,723,724,5,105,0,0,724,725,5,111,0,0,725,726,5,110,0,0, - 726,118,1,0,0,0,727,728,5,115,0,0,728,729,5,101,0,0,729,730,5,109, - 0,0,730,731,5,97,0,0,731,732,5,110,0,0,732,733,5,116,0,0,733,734, - 5,105,0,0,734,735,5,99,0,0,735,736,5,45,0,0,736,737,5,109,0,0,737, - 738,5,97,0,0,738,739,5,106,0,0,739,740,5,111,0,0,740,741,5,114,0, - 0,741,120,1,0,0,0,742,743,5,111,0,0,743,744,5,110,0,0,744,745,5, - 45,0,0,745,746,5,100,0,0,746,747,5,101,0,0,747,748,5,108,0,0,748, - 749,5,101,0,0,749,750,5,116,0,0,750,751,5,101,0,0,751,122,1,0,0, - 0,752,753,5,114,0,0,753,754,5,101,0,0,754,755,5,116,0,0,755,756, - 5,97,0,0,756,757,5,105,0,0,757,758,5,110,0,0,758,759,5,45,0,0,759, - 760,5,111,0,0,760,761,5,116,0,0,761,762,5,104,0,0,762,763,5,101, - 0,0,763,764,5,114,0,0,764,124,1,0,0,0,765,766,5,107,0,0,766,767, - 5,101,0,0,767,768,5,121,0,0,768,769,5,101,0,0,769,770,5,100,0,0, - 770,126,1,0,0,0,771,772,5,112,0,0,772,773,5,117,0,0,773,774,5,98, - 0,0,774,775,5,108,0,0,775,776,5,105,0,0,776,777,5,99,0,0,777,778, - 5,45,0,0,778,779,5,116,0,0,779,780,5,114,0,0,780,781,5,97,0,0,781, - 782,5,118,0,0,782,783,5,101,0,0,783,784,5,114,0,0,784,785,5,115, - 0,0,785,786,5,97,0,0,786,787,5,108,0,0,787,128,1,0,0,0,788,789,5, - 105,0,0,789,790,5,100,0,0,790,130,1,0,0,0,791,792,5,100,0,0,792, - 793,5,111,0,0,793,794,5,99,0,0,794,132,1,0,0,0,795,796,5,109,0,0, - 796,797,5,111,0,0,797,798,5,100,0,0,798,799,5,101,0,0,799,134,1, - 0,0,0,800,801,5,101,0,0,801,802,5,109,0,0,802,803,5,105,0,0,803, - 804,5,116,0,0,804,805,5,115,0,0,805,136,1,0,0,0,806,807,5,114,0, - 0,807,808,5,101,0,0,808,809,5,99,0,0,809,810,5,101,0,0,810,811,5, - 105,0,0,811,812,5,118,0,0,812,813,5,101,0,0,813,814,5,114,0,0,814, - 138,1,0,0,0,815,816,5,114,0,0,816,817,5,101,0,0,817,818,5,113,0, - 0,818,819,5,117,0,0,819,820,5,105,0,0,820,821,5,114,0,0,821,822, - 5,101,0,0,822,823,5,115,0,0,823,140,1,0,0,0,824,825,5,97,0,0,825, - 826,5,110,0,0,826,827,5,121,0,0,827,142,1,0,0,0,828,829,5,103,0, - 0,829,830,5,101,0,0,830,831,5,116,0,0,831,144,1,0,0,0,832,833,5, - 115,0,0,833,834,5,101,0,0,834,835,5,116,0,0,835,146,1,0,0,0,836, - 837,5,119,0,0,837,838,5,97,0,0,838,839,5,116,0,0,839,840,5,99,0, - 0,840,841,5,104,0,0,841,148,1,0,0,0,842,843,5,115,0,0,843,844,5, - 116,0,0,844,845,5,97,0,0,845,846,5,114,0,0,846,847,5,116,0,0,847, - 150,1,0,0,0,848,849,5,115,0,0,849,850,5,116,0,0,850,851,5,111,0, - 0,851,852,5,112,0,0,852,152,1,0,0,0,853,854,5,114,0,0,854,855,5, - 101,0,0,855,856,5,97,0,0,856,857,5,100,0,0,857,154,1,0,0,0,858,859, - 5,119,0,0,859,860,5,114,0,0,860,861,5,105,0,0,861,862,5,116,0,0, - 862,863,5,101,0,0,863,156,1,0,0,0,864,865,5,114,0,0,865,866,5,101, - 0,0,866,867,5,115,0,0,867,868,5,111,0,0,868,869,5,108,0,0,869,870, - 5,118,0,0,870,871,5,101,0,0,871,158,1,0,0,0,872,873,5,99,0,0,873, - 874,5,111,0,0,874,875,5,110,0,0,875,876,5,110,0,0,876,877,5,101, - 0,0,877,878,5,99,0,0,878,879,5,116,0,0,879,160,1,0,0,0,880,881,5, - 100,0,0,881,882,5,105,0,0,882,883,5,115,0,0,883,884,5,99,0,0,884, - 885,5,111,0,0,885,886,5,110,0,0,886,887,5,110,0,0,887,888,5,101, - 0,0,888,889,5,99,0,0,889,890,5,116,0,0,890,162,1,0,0,0,891,892,5, - 99,0,0,892,893,5,97,0,0,893,894,5,108,0,0,894,895,5,108,0,0,895, - 164,1,0,0,0,896,897,5,119,0,0,897,898,5,97,0,0,898,899,5,116,0,0, - 899,900,5,99,0,0,900,901,5,104,0,0,901,902,5,45,0,0,902,903,5,115, - 0,0,903,904,5,116,0,0,904,905,5,97,0,0,905,906,5,114,0,0,906,907, - 5,116,0,0,907,166,1,0,0,0,908,909,5,119,0,0,909,910,5,97,0,0,910, - 911,5,116,0,0,911,912,5,99,0,0,912,913,5,104,0,0,913,914,5,45,0, - 0,914,915,5,115,0,0,915,916,5,116,0,0,916,917,5,111,0,0,917,918, - 5,112,0,0,918,168,1,0,0,0,919,920,5,115,0,0,920,921,5,117,0,0,921, - 922,5,98,0,0,922,923,5,115,0,0,923,924,5,99,0,0,924,925,5,114,0, - 0,925,926,5,105,0,0,926,927,5,98,0,0,927,928,5,101,0,0,928,170,1, - 0,0,0,929,930,5,117,0,0,930,931,5,110,0,0,931,932,5,115,0,0,932, - 933,5,117,0,0,933,934,5,98,0,0,934,935,5,115,0,0,935,936,5,99,0, - 0,936,937,5,114,0,0,937,938,5,105,0,0,938,939,5,98,0,0,939,940,5, - 101,0,0,940,172,1,0,0,0,941,942,5,111,0,0,942,943,5,112,0,0,943, - 944,5,116,0,0,944,945,5,105,0,0,945,946,5,109,0,0,946,947,5,105, - 0,0,947,948,5,115,0,0,948,949,5,116,0,0,949,950,5,105,0,0,950,951, - 5,99,0,0,951,952,5,45,0,0,952,953,5,114,0,0,953,954,5,101,0,0,954, - 955,5,103,0,0,955,956,5,105,0,0,956,957,5,115,0,0,957,958,5,116, - 0,0,958,959,5,101,0,0,959,960,5,114,0,0,960,174,1,0,0,0,961,962, - 5,99,0,0,962,963,5,114,0,0,963,964,5,100,0,0,964,965,5,116,0,0,965, - 176,1,0,0,0,966,967,5,111,0,0,967,968,5,112,0,0,968,969,5,116,0, - 0,969,970,5,105,0,0,970,971,5,111,0,0,971,972,5,110,0,0,972,973, - 5,97,0,0,973,974,5,108,0,0,974,975,5,45,0,0,975,976,5,111,0,0,976, - 977,5,110,0,0,977,978,5,101,0,0,978,178,1,0,0,0,979,980,5,101,0, - 0,980,981,5,120,0,0,981,982,5,97,0,0,982,983,5,99,0,0,983,984,5, - 116,0,0,984,985,5,108,0,0,985,986,5,121,0,0,986,987,5,45,0,0,987, - 988,5,111,0,0,988,989,5,110,0,0,989,990,5,101,0,0,990,180,1,0,0, - 0,991,992,5,109,0,0,992,993,5,97,0,0,993,994,5,110,0,0,994,995,5, - 121,0,0,995,996,5,45,0,0,996,997,5,117,0,0,997,998,5,110,0,0,998, - 999,5,105,0,0,999,1000,5,113,0,0,1000,1001,5,117,0,0,1001,1002,5, - 101,0,0,1002,182,1,0,0,0,1003,1004,5,109,0,0,1004,1005,5,97,0,0, - 1005,1006,5,110,0,0,1006,1007,5,121,0,0,1007,184,1,0,0,0,1008,1009, - 5,111,0,0,1009,1010,5,114,0,0,1010,1011,5,100,0,0,1011,1012,5,101, - 0,0,1012,1013,5,114,0,0,1013,1014,5,101,0,0,1014,1015,5,100,0,0, - 1015,186,1,0,0,0,1016,1017,5,117,0,0,1017,1018,5,110,0,0,1018,1019, - 5,105,0,0,1019,1020,5,116,0,0,1020,188,1,0,0,0,1021,1022,5,119,0, - 0,1022,1023,5,97,0,0,1023,1024,5,116,0,0,1024,1025,5,99,0,0,1025, - 1026,5,104,0,0,1026,1027,5,45,0,0,1027,1028,5,104,0,0,1028,1029, - 5,97,0,0,1029,1030,5,110,0,0,1030,1031,5,100,0,0,1031,1032,5,108, - 0,0,1032,1033,5,101,0,0,1033,190,1,0,0,0,1034,1035,5,109,0,0,1035, - 1036,5,101,0,0,1036,1037,5,115,0,0,1037,1038,5,115,0,0,1038,1039, - 5,97,0,0,1039,1040,5,103,0,0,1040,1041,5,101,0,0,1041,192,1,0,0, - 0,1042,1043,5,97,0,0,1043,1044,5,116,0,0,1044,1045,5,111,0,0,1045, - 1046,5,109,0,0,1046,1047,5,45,0,0,1047,1048,5,114,0,0,1048,1049, - 5,101,0,0,1049,1050,5,102,0,0,1050,194,1,0,0,0,1051,1052,5,105,0, - 0,1052,1053,5,110,0,0,1053,1054,5,116,0,0,1054,1055,5,101,0,0,1055, - 1056,5,114,0,0,1056,1057,5,102,0,0,1057,1058,5,97,0,0,1058,1059, - 5,99,0,0,1059,1060,5,101,0,0,1060,1061,5,45,0,0,1061,1062,5,114, - 0,0,1062,1063,5,101,0,0,1063,1064,5,102,0,0,1064,196,1,0,0,0,1065, - 1066,5,111,0,0,1066,1067,5,112,0,0,1067,1068,5,116,0,0,1068,1069, - 5,105,0,0,1069,1070,5,111,0,0,1070,1071,5,110,0,0,1071,1072,5,97, - 0,0,1072,1073,5,108,0,0,1073,198,1,0,0,0,1074,1075,5,108,0,0,1075, - 1076,5,105,0,0,1076,1077,5,115,0,0,1077,1078,5,116,0,0,1078,200, - 1,0,0,0,1079,1080,5,114,0,0,1080,1081,5,101,0,0,1081,1082,5,99,0, - 0,1082,1083,5,111,0,0,1083,1084,5,114,0,0,1084,1085,5,100,0,0,1085, - 202,1,0,0,0,1086,1087,5,98,0,0,1087,1088,5,111,0,0,1088,1089,5,111, - 0,0,1089,1090,5,108,0,0,1090,204,1,0,0,0,1091,1092,5,98,0,0,1092, - 1093,5,121,0,0,1093,1094,5,116,0,0,1094,1095,5,101,0,0,1095,1096, - 5,115,0,0,1096,206,1,0,0,0,1097,1098,5,100,0,0,1098,1099,5,111,0, - 0,1099,1100,5,117,0,0,1100,1101,5,98,0,0,1101,1102,5,108,0,0,1102, - 1103,5,101,0,0,1103,208,1,0,0,0,1104,1105,5,105,0,0,1105,1106,5, - 110,0,0,1106,1107,5,116,0,0,1107,1108,5,51,0,0,1108,1109,5,50,0, - 0,1109,210,1,0,0,0,1110,1111,5,105,0,0,1111,1112,5,110,0,0,1112, - 1113,5,116,0,0,1113,1114,5,54,0,0,1114,1115,5,52,0,0,1115,212,1, - 0,0,0,1116,1117,5,115,0,0,1117,1118,5,116,0,0,1118,1119,5,114,0, - 0,1119,1120,5,105,0,0,1120,1121,5,110,0,0,1121,1122,5,103,0,0,1122, - 214,1,0,0,0,1123,1124,5,117,0,0,1124,1125,5,105,0,0,1125,1126,5, - 110,0,0,1126,1127,5,116,0,0,1127,1128,5,51,0,0,1128,1129,5,50,0, - 0,1129,216,1,0,0,0,1130,1131,5,117,0,0,1131,1132,5,105,0,0,1132, - 1133,5,110,0,0,1133,1134,5,116,0,0,1134,1135,5,54,0,0,1135,1136, - 5,52,0,0,1136,218,1,0,0,0,1137,1138,5,116,0,0,1138,1139,5,114,0, - 0,1139,1140,5,117,0,0,1140,1141,5,101,0,0,1141,220,1,0,0,0,1142, - 1143,5,102,0,0,1143,1144,5,97,0,0,1144,1145,5,108,0,0,1145,1146, - 5,115,0,0,1146,1147,5,101,0,0,1147,222,1,0,0,0,1148,1149,5,110,0, - 0,1149,1150,5,117,0,0,1150,1151,5,108,0,0,1151,1152,5,108,0,0,1152, - 224,1,0,0,0,1153,1154,5,45,0,0,1154,1155,5,62,0,0,1155,226,1,0,0, - 0,1156,1157,5,58,0,0,1157,228,1,0,0,0,1158,1159,5,59,0,0,1159,230, - 1,0,0,0,1160,1161,5,44,0,0,1161,232,1,0,0,0,1162,1163,5,46,0,0,1163, - 234,1,0,0,0,1164,1165,5,123,0,0,1165,236,1,0,0,0,1166,1167,5,125, - 0,0,1167,238,1,0,0,0,1168,1169,5,91,0,0,1169,240,1,0,0,0,1170,1171, - 5,93,0,0,1171,242,1,0,0,0,1172,1173,5,40,0,0,1173,244,1,0,0,0,1174, - 1175,5,41,0,0,1175,246,1,0,0,0,1176,1177,5,60,0,0,1177,248,1,0,0, - 0,1178,1179,5,62,0,0,1179,250,1,0,0,0,1180,1181,5,38,0,0,1181,252, - 1,0,0,0,1182,1183,5,61,0,0,1183,254,1,0,0,0,1184,1186,5,45,0,0,1185, - 1184,1,0,0,0,1185,1186,1,0,0,0,1186,1188,1,0,0,0,1187,1189,7,0,0, - 0,1188,1187,1,0,0,0,1189,1190,1,0,0,0,1190,1188,1,0,0,0,1190,1191, - 1,0,0,0,1191,256,1,0,0,0,1192,1194,5,45,0,0,1193,1192,1,0,0,0,1193, - 1194,1,0,0,0,1194,1203,1,0,0,0,1195,1204,5,48,0,0,1196,1200,7,1, - 0,0,1197,1199,7,0,0,0,1198,1197,1,0,0,0,1199,1202,1,0,0,0,1200,1198, - 1,0,0,0,1200,1201,1,0,0,0,1201,1204,1,0,0,0,1202,1200,1,0,0,0,1203, - 1195,1,0,0,0,1203,1196,1,0,0,0,1204,1211,1,0,0,0,1205,1207,5,46, - 0,0,1206,1208,7,0,0,0,1207,1206,1,0,0,0,1208,1209,1,0,0,0,1209,1207, - 1,0,0,0,1209,1210,1,0,0,0,1210,1212,1,0,0,0,1211,1205,1,0,0,0,1211, - 1212,1,0,0,0,1212,1222,1,0,0,0,1213,1215,7,2,0,0,1214,1216,7,3,0, - 0,1215,1214,1,0,0,0,1215,1216,1,0,0,0,1216,1218,1,0,0,0,1217,1219, - 7,0,0,0,1218,1217,1,0,0,0,1219,1220,1,0,0,0,1220,1218,1,0,0,0,1220, - 1221,1,0,0,0,1221,1223,1,0,0,0,1222,1213,1,0,0,0,1222,1223,1,0,0, - 0,1223,258,1,0,0,0,1224,1228,7,4,0,0,1225,1227,7,5,0,0,1226,1225, - 1,0,0,0,1227,1230,1,0,0,0,1228,1226,1,0,0,0,1228,1229,1,0,0,0,1229, - 260,1,0,0,0,1230,1228,1,0,0,0,1231,1236,5,34,0,0,1232,1235,3,263, - 131,0,1233,1235,8,6,0,0,1234,1232,1,0,0,0,1234,1233,1,0,0,0,1235, - 1238,1,0,0,0,1236,1234,1,0,0,0,1236,1237,1,0,0,0,1237,1239,1,0,0, - 0,1238,1236,1,0,0,0,1239,1240,5,34,0,0,1240,262,1,0,0,0,1241,1249, - 5,92,0,0,1242,1250,7,7,0,0,1243,1244,5,117,0,0,1244,1245,3,265,132, - 0,1245,1246,3,265,132,0,1246,1247,3,265,132,0,1247,1248,3,265,132, - 0,1248,1250,1,0,0,0,1249,1242,1,0,0,0,1249,1243,1,0,0,0,1250,264, - 1,0,0,0,1251,1252,7,8,0,0,1252,266,1,0,0,0,1253,1254,5,47,0,0,1254, - 1255,5,47,0,0,1255,1259,1,0,0,0,1256,1258,8,9,0,0,1257,1256,1,0, - 0,0,1258,1261,1,0,0,0,1259,1257,1,0,0,0,1259,1260,1,0,0,0,1260,1262, - 1,0,0,0,1261,1259,1,0,0,0,1262,1263,6,133,0,0,1263,268,1,0,0,0,1264, - 1265,5,47,0,0,1265,1266,5,42,0,0,1266,1270,1,0,0,0,1267,1269,9,0, - 0,0,1268,1267,1,0,0,0,1269,1272,1,0,0,0,1270,1271,1,0,0,0,1270,1268, - 1,0,0,0,1271,1273,1,0,0,0,1272,1270,1,0,0,0,1273,1274,5,42,0,0,1274, - 1275,5,47,0,0,1275,1276,1,0,0,0,1276,1277,6,134,0,0,1277,270,1,0, - 0,0,1278,1280,7,10,0,0,1279,1278,1,0,0,0,1280,1281,1,0,0,0,1281, - 1279,1,0,0,0,1281,1282,1,0,0,0,1282,1283,1,0,0,0,1283,1284,6,135, - 0,0,1284,272,1,0,0,0,18,0,1185,1190,1193,1200,1203,1209,1211,1215, - 1220,1222,1228,1234,1236,1249,1259,1270,1281,1,0,1,0 + 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,1,0,1,0,1,0,1,0,1,0,1,0,1,0, + 1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2, + 1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3, + 1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5, + 1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7, + 1,7,1,7,1,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,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,1,11,1, + 11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1, + 12,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1, + 14,1,14,1,14,1,14,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,15,1,15,1,15,1,16,1,16,1,16,1,16,1, + 16,1,17,1,17,1,17,1,17,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,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,21,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,23,1,24,1,24,1, + 24,1,24,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1, + 25,1,25,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,28,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,29,1,29,1,29,1,29,1,29,1,30,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,32,1,32,1,32,1,32,1,32,1, + 32,1,32,1,33,1,33,1,33,1,33,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,35,1,35,1,35,1,35,1,35,1,35,1, + 36,1,36,1,36,1,36,1,36,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,37,1,38,1,38,1,38,1,38,1,38,1,38,1,39,1, + 39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,1, + 40,1,40,1,40,1,40,1,40,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1, + 41,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,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,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,46,1, + 46,1,46,1,47,1,47,1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,48,1,48,1, + 48,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,51,1,51,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,54,1,54,1,54,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,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1, + 58,1,58,1,58,1,59,1,59,1,59,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1, + 61,1,61,1,61,1,62,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,63,1,64,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,65,1,65,1,65,1,65,1,65,1,66,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,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,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,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,72,1, + 72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,73,1,73,1,73,1,74,1, + 74,1,74,1,74,1,75,1,75,1,75,1,75,1,75,1,76,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,77,1,77,1,78,1,78,1,78,1, + 78,1,78,1,78,1,78,1,78,1,78,1,79,1,79,1,79,1,79,1,80,1,80,1,80,1, + 80,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,1,82,1,82,1,83,1,83,1, + 83,1,83,1,83,1,83,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,87,1, + 87,1,87,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,89,1,89,1,89,1, + 89,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, + 91,1,91,1,91,1,91,1,91,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,92,1,92,1,93,1,93,1,93,1, + 93,1,93,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,94,1,94,1,94,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1, + 95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1, + 96,1,96,1,96,1,96,1,96,1,97,1,97,1,97,1,97,1,97,1,97,1,97,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,98,1,98,1, + 98,1,98,1,98,1,98,1,99,1,99,1,99,1,99,1,99,1,99,1,99,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,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,1,103,1,103,1,103, + 1,104,1,104,1,104,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,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,107,1,107, + 1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,108,1,108,1,108,1,108, + 1,108,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,110,1,110,1,110, + 1,110,1,110,1,111,1,111,1,111,1,111,1,111,1,111,1,112,1,112,1,112, + 1,112,1,112,1,112,1,112,1,113,1,113,1,113,1,113,1,113,1,113,1,114, + 1,114,1,114,1,114,1,114,1,114,1,115,1,115,1,115,1,115,1,115,1,115, + 1,115,1,116,1,116,1,116,1,116,1,116,1,116,1,116,1,117,1,117,1,117, + 1,117,1,117,1,117,1,117,1,118,1,118,1,118,1,118,1,118,1,119,1,119, + 1,119,1,119,1,119,1,119,1,120,1,120,1,120,1,120,1,120,1,121,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,3,136,1278,8,136, + 1,136,4,136,1281,8,136,11,136,12,136,1282,1,137,3,137,1286,8,137, + 1,137,1,137,1,137,5,137,1291,8,137,10,137,12,137,1294,9,137,3,137, + 1296,8,137,1,137,1,137,4,137,1300,8,137,11,137,12,137,1301,3,137, + 1304,8,137,1,137,1,137,3,137,1308,8,137,1,137,4,137,1311,8,137,11, + 137,12,137,1312,3,137,1315,8,137,1,138,1,138,5,138,1319,8,138,10, + 138,12,138,1322,9,138,1,139,1,139,1,139,5,139,1327,8,139,10,139, + 12,139,1330,9,139,1,139,1,139,1,140,1,140,1,140,1,140,1,140,1,140, + 1,140,1,140,3,140,1342,8,140,1,141,1,141,1,142,1,142,1,142,1,142, + 5,142,1350,8,142,10,142,12,142,1353,9,142,1,142,1,142,1,143,1,143, + 1,143,1,143,5,143,1361,8,143,10,143,12,143,1364,9,143,1,143,1,143, + 1,143,1,143,1,143,1,144,4,144,1372,8,144,11,144,12,144,1373,1,144, + 1,144,1,1362,0,145,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10, + 21,11,23,12,25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21, + 43,22,45,23,47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32, + 65,33,67,34,69,35,71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43, + 87,44,89,45,91,46,93,47,95,48,97,49,99,50,101,51,103,52,105,53,107, + 54,109,55,111,56,113,57,115,58,117,59,119,60,121,61,123,62,125,63, + 127,64,129,65,131,66,133,67,135,68,137,69,139,70,141,71,143,72,145, + 73,147,74,149,75,151,76,153,77,155,78,157,79,159,80,161,81,163,82, + 165,83,167,84,169,85,171,86,173,87,175,88,177,89,179,90,181,91,183, + 92,185,93,187,94,189,95,191,96,193,97,195,98,197,99,199,100,201, + 101,203,102,205,103,207,104,209,105,211,106,213,107,215,108,217, + 109,219,110,221,111,223,112,225,113,227,114,229,115,231,116,233, + 117,235,118,237,119,239,120,241,121,243,122,245,123,247,124,249, + 125,251,126,253,127,255,128,257,129,259,130,261,131,263,132,265, + 133,267,134,269,135,271,136,273,137,275,138,277,139,279,140,281, + 0,283,0,285,141,287,142,289,143,1,0,11,1,0,48,57,1,0,49,57,2,0,69, + 69,101,101,2,0,43,43,45,45,3,0,65,90,95,95,97,122,4,0,48,57,65,90, + 95,95,97,122,4,0,10,10,13,13,34,34,92,92,8,0,34,34,47,47,92,92,98, + 98,102,102,110,110,114,114,116,116,3,0,48,57,65,70,97,102,2,0,10, + 10,13,13,3,0,9,10,13,13,32,32,1391,0,1,1,0,0,0,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,229,1,0,0,0,0,231,1,0,0,0,0,233,1,0, + 0,0,0,235,1,0,0,0,0,237,1,0,0,0,0,239,1,0,0,0,0,241,1,0,0,0,0,243, + 1,0,0,0,0,245,1,0,0,0,0,247,1,0,0,0,0,249,1,0,0,0,0,251,1,0,0,0, + 0,253,1,0,0,0,0,255,1,0,0,0,0,257,1,0,0,0,0,259,1,0,0,0,0,261,1, + 0,0,0,0,263,1,0,0,0,0,265,1,0,0,0,0,267,1,0,0,0,0,269,1,0,0,0,0, + 271,1,0,0,0,0,273,1,0,0,0,0,275,1,0,0,0,0,277,1,0,0,0,0,279,1,0, + 0,0,0,285,1,0,0,0,0,287,1,0,0,0,0,289,1,0,0,0,1,291,1,0,0,0,3,301, + 1,0,0,0,5,311,1,0,0,0,7,320,1,0,0,0,9,332,1,0,0,0,11,339,1,0,0,0, + 13,347,1,0,0,0,15,356,1,0,0,0,17,364,1,0,0,0,19,370,1,0,0,0,21,375, + 1,0,0,0,23,388,1,0,0,0,25,398,1,0,0,0,27,410,1,0,0,0,29,416,1,0, + 0,0,31,427,1,0,0,0,33,438,1,0,0,0,35,443,1,0,0,0,37,452,1,0,0,0, + 39,462,1,0,0,0,41,467,1,0,0,0,43,471,1,0,0,0,45,477,1,0,0,0,47,482, + 1,0,0,0,49,492,1,0,0,0,51,496,1,0,0,0,53,509,1,0,0,0,55,514,1,0, + 0,0,57,521,1,0,0,0,59,530,1,0,0,0,61,541,1,0,0,0,63,545,1,0,0,0, + 65,554,1,0,0,0,67,561,1,0,0,0,69,570,1,0,0,0,71,575,1,0,0,0,73,585, + 1,0,0,0,75,596,1,0,0,0,77,604,1,0,0,0,79,610,1,0,0,0,81,619,1,0, + 0,0,83,629,1,0,0,0,85,638,1,0,0,0,87,650,1,0,0,0,89,661,1,0,0,0, + 91,667,1,0,0,0,93,675,1,0,0,0,95,678,1,0,0,0,97,683,1,0,0,0,99,690, + 1,0,0,0,101,693,1,0,0,0,103,701,1,0,0,0,105,708,1,0,0,0,107,714, + 1,0,0,0,109,719,1,0,0,0,111,730,1,0,0,0,113,735,1,0,0,0,115,741, + 1,0,0,0,117,745,1,0,0,0,119,757,1,0,0,0,121,760,1,0,0,0,123,767, + 1,0,0,0,125,770,1,0,0,0,127,777,1,0,0,0,129,785,1,0,0,0,131,792, + 1,0,0,0,133,803,1,0,0,0,135,810,1,0,0,0,137,819,1,0,0,0,139,834, + 1,0,0,0,141,844,1,0,0,0,143,857,1,0,0,0,145,863,1,0,0,0,147,880, + 1,0,0,0,149,883,1,0,0,0,151,887,1,0,0,0,153,892,1,0,0,0,155,898, + 1,0,0,0,157,907,1,0,0,0,159,916,1,0,0,0,161,920,1,0,0,0,163,924, + 1,0,0,0,165,928,1,0,0,0,167,934,1,0,0,0,169,940,1,0,0,0,171,945, + 1,0,0,0,173,950,1,0,0,0,175,956,1,0,0,0,177,964,1,0,0,0,179,972, + 1,0,0,0,181,983,1,0,0,0,183,988,1,0,0,0,185,1000,1,0,0,0,187,1011, + 1,0,0,0,189,1021,1,0,0,0,191,1033,1,0,0,0,193,1053,1,0,0,0,195,1058, + 1,0,0,0,197,1071,1,0,0,0,199,1083,1,0,0,0,201,1095,1,0,0,0,203,1100, + 1,0,0,0,205,1108,1,0,0,0,207,1113,1,0,0,0,209,1126,1,0,0,0,211,1134, + 1,0,0,0,213,1143,1,0,0,0,215,1157,1,0,0,0,217,1166,1,0,0,0,219,1171, + 1,0,0,0,221,1178,1,0,0,0,223,1183,1,0,0,0,225,1189,1,0,0,0,227,1196, + 1,0,0,0,229,1202,1,0,0,0,231,1208,1,0,0,0,233,1215,1,0,0,0,235,1222, + 1,0,0,0,237,1229,1,0,0,0,239,1234,1,0,0,0,241,1240,1,0,0,0,243,1245, + 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,1277,1,0,0,0,275,1285, + 1,0,0,0,277,1316,1,0,0,0,279,1323,1,0,0,0,281,1333,1,0,0,0,283,1343, + 1,0,0,0,285,1345,1,0,0,0,287,1356,1,0,0,0,289,1371,1,0,0,0,291,292, + 5,119,0,0,292,293,5,111,0,0,293,294,5,114,0,0,294,295,5,107,0,0, + 295,296,5,115,0,0,296,297,5,112,0,0,297,298,5,97,0,0,298,299,5,99, + 0,0,299,300,5,101,0,0,300,2,1,0,0,0,301,302,5,101,0,0,302,303,5, + 120,0,0,303,304,5,101,0,0,304,305,5,99,0,0,305,306,5,117,0,0,306, + 307,5,116,0,0,307,308,5,105,0,0,308,309,5,111,0,0,309,310,5,110, + 0,0,310,4,1,0,0,0,311,312,5,115,0,0,312,313,5,110,0,0,313,314,5, + 97,0,0,314,315,5,112,0,0,315,316,5,115,0,0,316,317,5,104,0,0,317, + 318,5,111,0,0,318,319,5,116,0,0,319,6,1,0,0,0,320,321,5,116,0,0, + 321,322,5,114,0,0,322,323,5,97,0,0,323,324,5,110,0,0,324,325,5,115, + 0,0,325,326,5,97,0,0,326,327,5,99,0,0,327,328,5,116,0,0,328,329, + 5,105,0,0,329,330,5,111,0,0,330,331,5,110,0,0,331,8,1,0,0,0,332, + 333,5,114,0,0,333,334,5,101,0,0,334,335,5,109,0,0,335,336,5,111, + 0,0,336,337,5,116,0,0,337,338,5,101,0,0,338,10,1,0,0,0,339,340,5, + 116,0,0,340,341,5,97,0,0,341,342,5,114,0,0,342,343,5,103,0,0,343, + 344,5,101,0,0,344,345,5,116,0,0,345,346,5,115,0,0,346,12,1,0,0,0, + 347,348,5,112,0,0,348,349,5,111,0,0,349,350,5,114,0,0,350,351,5, + 116,0,0,351,352,5,97,0,0,352,353,5,98,0,0,353,354,5,108,0,0,354, + 355,5,101,0,0,355,14,1,0,0,0,356,357,5,114,0,0,357,358,5,101,0,0, + 358,359,5,112,0,0,359,360,5,108,0,0,360,361,5,105,0,0,361,362,5, + 99,0,0,362,363,5,97,0,0,363,16,1,0,0,0,364,365,5,108,0,0,365,366, + 5,111,0,0,366,367,5,99,0,0,367,368,5,97,0,0,368,369,5,108,0,0,369, + 18,1,0,0,0,370,371,5,102,0,0,371,372,5,114,0,0,372,373,5,111,0,0, + 373,374,5,109,0,0,374,20,1,0,0,0,375,376,5,114,0,0,376,377,5,101, + 0,0,377,378,5,115,0,0,378,379,5,117,0,0,379,380,5,108,0,0,380,381, + 5,116,0,0,381,382,5,45,0,0,382,383,5,98,0,0,383,384,5,121,0,0,384, + 385,5,116,0,0,385,386,5,101,0,0,386,387,5,115,0,0,387,22,1,0,0,0, + 388,389,5,114,0,0,389,390,5,112,0,0,390,391,5,99,0,0,391,392,5,45, + 0,0,392,393,5,99,0,0,393,394,5,97,0,0,394,395,5,108,0,0,395,396, + 5,108,0,0,396,397,5,115,0,0,397,24,1,0,0,0,398,399,5,100,0,0,399, + 400,5,101,0,0,400,401,5,97,0,0,401,402,5,100,0,0,402,403,5,108,0, + 0,403,404,5,105,0,0,404,405,5,110,0,0,405,406,5,101,0,0,406,407, + 5,45,0,0,407,408,5,109,0,0,408,409,5,115,0,0,409,26,1,0,0,0,410, + 411,5,113,0,0,411,412,5,117,0,0,412,413,5,101,0,0,413,414,5,114, + 0,0,414,415,5,121,0,0,415,28,1,0,0,0,416,417,5,114,0,0,417,418,5, + 101,0,0,418,419,5,102,0,0,419,420,5,108,0,0,420,421,5,101,0,0,421, + 422,5,99,0,0,422,423,5,116,0,0,423,424,5,105,0,0,424,425,5,111,0, + 0,425,426,5,110,0,0,426,30,1,0,0,0,427,428,5,115,0,0,428,429,5,112, + 0,0,429,430,5,101,0,0,430,431,5,99,0,0,431,432,5,105,0,0,432,433, + 5,97,0,0,433,434,5,108,0,0,434,435,5,105,0,0,435,436,5,122,0,0,436, + 437,5,101,0,0,437,32,1,0,0,0,438,439,5,114,0,0,439,440,5,111,0,0, + 440,441,5,111,0,0,441,442,5,116,0,0,442,34,1,0,0,0,443,444,5,100, + 0,0,444,445,5,111,0,0,445,446,5,99,0,0,446,447,5,117,0,0,447,448, + 5,109,0,0,448,449,5,101,0,0,449,450,5,110,0,0,450,451,5,116,0,0, + 451,36,1,0,0,0,452,453,5,102,0,0,453,454,5,114,0,0,454,455,5,97, + 0,0,455,456,5,103,0,0,456,457,5,109,0,0,457,458,5,101,0,0,458,459, + 5,110,0,0,459,460,5,116,0,0,460,461,5,115,0,0,461,38,1,0,0,0,462, + 463,5,118,0,0,463,464,5,105,0,0,464,465,5,101,0,0,465,466,5,119, + 0,0,466,40,1,0,0,0,467,468,5,109,0,0,468,469,5,97,0,0,469,470,5, + 120,0,0,470,42,1,0,0,0,471,472,5,97,0,0,472,473,5,108,0,0,473,474, + 5,108,0,0,474,475,5,111,0,0,475,476,5,119,0,0,476,44,1,0,0,0,477, + 478,5,112,0,0,478,479,5,111,0,0,479,480,5,108,0,0,480,481,5,108, + 0,0,481,46,1,0,0,0,482,483,5,113,0,0,483,484,5,117,0,0,484,485,5, + 101,0,0,485,486,5,114,0,0,486,487,5,121,0,0,487,488,5,97,0,0,488, + 489,5,98,0,0,489,490,5,108,0,0,490,491,5,101,0,0,491,48,1,0,0,0, + 492,493,5,114,0,0,493,494,5,112,0,0,494,495,5,99,0,0,495,50,1,0, + 0,0,496,497,5,113,0,0,497,498,5,117,0,0,498,499,5,101,0,0,499,500, + 5,114,0,0,500,501,5,121,0,0,501,502,5,45,0,0,502,503,5,114,0,0,503, + 504,5,101,0,0,504,505,5,97,0,0,505,506,5,115,0,0,506,507,5,111,0, + 0,507,508,5,110,0,0,508,52,1,0,0,0,509,510,5,116,0,0,510,511,5,121, + 0,0,511,512,5,112,0,0,512,513,5,101,0,0,513,54,1,0,0,0,514,515,5, + 111,0,0,515,516,5,98,0,0,516,517,5,106,0,0,517,518,5,101,0,0,518, + 519,5,99,0,0,519,520,5,116,0,0,520,56,1,0,0,0,521,522,5,115,0,0, + 522,523,5,116,0,0,523,524,5,111,0,0,524,525,5,114,0,0,525,526,5, + 97,0,0,526,527,5,98,0,0,527,528,5,108,0,0,528,529,5,101,0,0,529, + 58,1,0,0,0,530,531,5,105,0,0,531,532,5,109,0,0,532,533,5,112,0,0, + 533,534,5,108,0,0,534,535,5,101,0,0,535,536,5,109,0,0,536,537,5, + 101,0,0,537,538,5,110,0,0,538,539,5,116,0,0,539,540,5,115,0,0,540, + 60,1,0,0,0,541,542,5,114,0,0,542,543,5,101,0,0,543,544,5,102,0,0, + 544,62,1,0,0,0,545,546,5,102,0,0,546,547,5,114,0,0,547,548,5,97, + 0,0,548,549,5,103,0,0,549,550,5,109,0,0,550,551,5,101,0,0,551,552, + 5,110,0,0,552,553,5,116,0,0,553,64,1,0,0,0,554,555,5,105,0,0,555, + 556,5,109,0,0,556,557,5,112,0,0,557,558,5,111,0,0,558,559,5,114, + 0,0,559,560,5,116,0,0,560,66,1,0,0,0,561,562,5,101,0,0,562,563,5, + 120,0,0,563,564,5,116,0,0,564,565,5,101,0,0,565,566,5,114,0,0,566, + 567,5,110,0,0,567,568,5,97,0,0,568,569,5,108,0,0,569,68,1,0,0,0, + 570,571,5,97,0,0,571,572,5,116,0,0,572,573,5,111,0,0,573,574,5,109, + 0,0,574,70,1,0,0,0,575,576,5,105,0,0,576,577,5,110,0,0,577,578,5, + 116,0,0,578,579,5,101,0,0,579,580,5,114,0,0,580,581,5,102,0,0,581, + 582,5,97,0,0,582,583,5,99,0,0,583,584,5,101,0,0,584,72,1,0,0,0,585, + 586,5,105,0,0,586,587,5,110,0,0,587,588,5,116,0,0,588,589,5,101, + 0,0,589,590,5,114,0,0,590,591,5,102,0,0,591,592,5,97,0,0,592,593, + 5,99,0,0,593,594,5,101,0,0,594,595,5,115,0,0,595,74,1,0,0,0,596, + 597,5,112,0,0,597,598,5,97,0,0,598,599,5,99,0,0,599,600,5,107,0, + 0,600,601,5,97,0,0,601,602,5,103,0,0,602,603,5,101,0,0,603,76,1, + 0,0,0,604,605,5,118,0,0,605,606,5,97,0,0,606,607,5,108,0,0,607,608, + 5,117,0,0,608,609,5,101,0,0,609,78,1,0,0,0,610,611,5,114,0,0,611, + 612,5,101,0,0,612,613,5,108,0,0,613,614,5,97,0,0,614,615,5,116,0, + 0,615,616,5,105,0,0,616,617,5,111,0,0,617,618,5,110,0,0,618,80,1, + 0,0,0,619,620,5,111,0,0,620,621,5,112,0,0,621,622,5,101,0,0,622, + 623,5,114,0,0,623,624,5,97,0,0,624,625,5,116,0,0,625,626,5,105,0, + 0,626,627,5,111,0,0,627,628,5,110,0,0,628,82,1,0,0,0,629,630,5,102, + 0,0,630,631,5,117,0,0,631,632,5,110,0,0,632,633,5,99,0,0,633,634, + 5,116,0,0,634,635,5,105,0,0,635,636,5,111,0,0,636,637,5,110,0,0, + 637,84,1,0,0,0,638,639,5,99,0,0,639,640,5,111,0,0,640,641,5,110, + 0,0,641,642,5,115,0,0,642,643,5,116,0,0,643,644,5,114,0,0,644,645, + 5,117,0,0,645,646,5,99,0,0,646,647,5,116,0,0,647,648,5,111,0,0,648, + 649,5,114,0,0,649,86,1,0,0,0,650,651,5,99,0,0,651,652,5,111,0,0, + 652,653,5,110,0,0,653,654,5,115,0,0,654,655,5,116,0,0,655,656,5, + 114,0,0,656,657,5,117,0,0,657,658,5,99,0,0,658,659,5,116,0,0,659, + 660,5,115,0,0,660,88,1,0,0,0,661,662,5,105,0,0,662,663,5,110,0,0, + 663,664,5,112,0,0,664,665,5,117,0,0,665,666,5,116,0,0,666,90,1,0, + 0,0,667,668,5,99,0,0,668,669,5,111,0,0,669,670,5,110,0,0,670,671, + 5,102,0,0,671,672,5,111,0,0,672,673,5,114,0,0,673,674,5,109,0,0, + 674,92,1,0,0,0,675,676,5,97,0,0,676,677,5,115,0,0,677,94,1,0,0,0, + 678,679,5,98,0,0,679,680,5,105,0,0,680,681,5,110,0,0,681,682,5,100, + 0,0,682,96,1,0,0,0,683,684,5,115,0,0,684,685,5,116,0,0,685,686,5, + 97,0,0,686,687,5,116,0,0,687,688,5,105,0,0,688,689,5,99,0,0,689, + 98,1,0,0,0,690,691,5,116,0,0,691,692,5,111,0,0,692,100,1,0,0,0,693, + 694,5,112,0,0,694,695,5,114,0,0,695,696,5,105,0,0,696,697,5,118, + 0,0,697,698,5,97,0,0,698,699,5,116,0,0,699,700,5,101,0,0,700,102, + 1,0,0,0,701,702,5,115,0,0,702,703,5,104,0,0,703,704,5,97,0,0,704, + 705,5,114,0,0,705,706,5,101,0,0,706,707,5,100,0,0,707,104,1,0,0, + 0,708,709,5,115,0,0,709,710,5,116,0,0,710,711,5,97,0,0,711,712,5, + 116,0,0,712,713,5,101,0,0,713,106,1,0,0,0,714,715,5,101,0,0,715, + 716,5,100,0,0,716,717,5,103,0,0,717,718,5,101,0,0,718,108,1,0,0, + 0,719,720,5,112,0,0,720,721,5,114,0,0,721,722,5,111,0,0,722,723, + 5,106,0,0,723,724,5,101,0,0,724,725,5,99,0,0,725,726,5,116,0,0,726, + 727,5,105,0,0,727,728,5,111,0,0,728,729,5,110,0,0,729,110,1,0,0, + 0,730,731,5,119,0,0,731,732,5,105,0,0,732,733,5,116,0,0,733,734, + 5,104,0,0,734,112,1,0,0,0,735,736,5,117,0,0,736,737,5,115,0,0,737, + 738,5,105,0,0,738,739,5,110,0,0,739,740,5,103,0,0,740,114,1,0,0, + 0,741,742,5,118,0,0,742,743,5,105,0,0,743,744,5,97,0,0,744,116,1, + 0,0,0,745,746,5,109,0,0,746,747,5,97,0,0,747,748,5,116,0,0,748,749, + 5,101,0,0,749,750,5,114,0,0,750,751,5,105,0,0,751,752,5,97,0,0,752, + 753,5,108,0,0,753,754,5,105,0,0,754,755,5,122,0,0,755,756,5,101, + 0,0,756,118,1,0,0,0,757,758,5,105,0,0,758,759,5,102,0,0,759,120, + 1,0,0,0,760,761,5,97,0,0,761,762,5,98,0,0,762,763,5,115,0,0,763, + 764,5,101,0,0,764,765,5,110,0,0,765,766,5,116,0,0,766,122,1,0,0, + 0,767,768,5,111,0,0,768,769,5,110,0,0,769,124,1,0,0,0,770,771,5, + 112,0,0,771,772,5,111,0,0,772,773,5,108,0,0,773,774,5,105,0,0,774, + 775,5,99,0,0,775,776,5,121,0,0,776,126,1,0,0,0,777,778,5,100,0,0, + 778,779,5,101,0,0,779,780,5,102,0,0,780,781,5,97,0,0,781,782,5,117, + 0,0,782,783,5,108,0,0,783,784,5,116,0,0,784,128,1,0,0,0,785,786, + 5,115,0,0,786,787,5,111,0,0,787,788,5,117,0,0,788,789,5,114,0,0, + 789,790,5,99,0,0,790,791,5,101,0,0,791,130,1,0,0,0,792,793,5,114, + 0,0,793,794,5,101,0,0,794,795,5,112,0,0,795,796,5,111,0,0,796,797, + 5,115,0,0,797,798,5,105,0,0,798,799,5,116,0,0,799,800,5,111,0,0, + 800,801,5,114,0,0,801,802,5,121,0,0,802,132,1,0,0,0,803,804,5,99, + 0,0,804,805,5,111,0,0,805,806,5,109,0,0,806,807,5,109,0,0,807,808, + 5,105,0,0,808,809,5,116,0,0,809,134,1,0,0,0,810,811,5,114,0,0,811, + 812,5,101,0,0,812,813,5,118,0,0,813,814,5,105,0,0,814,815,5,115, + 0,0,815,816,5,105,0,0,816,817,5,111,0,0,817,818,5,110,0,0,818,136, + 1,0,0,0,819,820,5,115,0,0,820,821,5,101,0,0,821,822,5,109,0,0,822, + 823,5,97,0,0,823,824,5,110,0,0,824,825,5,116,0,0,825,826,5,105,0, + 0,826,827,5,99,0,0,827,828,5,45,0,0,828,829,5,109,0,0,829,830,5, + 97,0,0,830,831,5,106,0,0,831,832,5,111,0,0,832,833,5,114,0,0,833, + 138,1,0,0,0,834,835,5,111,0,0,835,836,5,110,0,0,836,837,5,45,0,0, + 837,838,5,100,0,0,838,839,5,101,0,0,839,840,5,108,0,0,840,841,5, + 101,0,0,841,842,5,116,0,0,842,843,5,101,0,0,843,140,1,0,0,0,844, + 845,5,114,0,0,845,846,5,101,0,0,846,847,5,116,0,0,847,848,5,97,0, + 0,848,849,5,105,0,0,849,850,5,110,0,0,850,851,5,45,0,0,851,852,5, + 111,0,0,852,853,5,116,0,0,853,854,5,104,0,0,854,855,5,101,0,0,855, + 856,5,114,0,0,856,142,1,0,0,0,857,858,5,107,0,0,858,859,5,101,0, + 0,859,860,5,121,0,0,860,861,5,101,0,0,861,862,5,100,0,0,862,144, + 1,0,0,0,863,864,5,112,0,0,864,865,5,117,0,0,865,866,5,98,0,0,866, + 867,5,108,0,0,867,868,5,105,0,0,868,869,5,99,0,0,869,870,5,45,0, + 0,870,871,5,116,0,0,871,872,5,114,0,0,872,873,5,97,0,0,873,874,5, + 118,0,0,874,875,5,101,0,0,875,876,5,114,0,0,876,877,5,115,0,0,877, + 878,5,97,0,0,878,879,5,108,0,0,879,146,1,0,0,0,880,881,5,105,0,0, + 881,882,5,100,0,0,882,148,1,0,0,0,883,884,5,100,0,0,884,885,5,111, + 0,0,885,886,5,99,0,0,886,150,1,0,0,0,887,888,5,109,0,0,888,889,5, + 111,0,0,889,890,5,100,0,0,890,891,5,101,0,0,891,152,1,0,0,0,892, + 893,5,101,0,0,893,894,5,109,0,0,894,895,5,105,0,0,895,896,5,116, + 0,0,896,897,5,115,0,0,897,154,1,0,0,0,898,899,5,114,0,0,899,900, + 5,101,0,0,900,901,5,99,0,0,901,902,5,101,0,0,902,903,5,105,0,0,903, + 904,5,118,0,0,904,905,5,101,0,0,905,906,5,114,0,0,906,156,1,0,0, + 0,907,908,5,114,0,0,908,909,5,101,0,0,909,910,5,113,0,0,910,911, + 5,117,0,0,911,912,5,105,0,0,912,913,5,114,0,0,913,914,5,101,0,0, + 914,915,5,115,0,0,915,158,1,0,0,0,916,917,5,97,0,0,917,918,5,110, + 0,0,918,919,5,121,0,0,919,160,1,0,0,0,920,921,5,103,0,0,921,922, + 5,101,0,0,922,923,5,116,0,0,923,162,1,0,0,0,924,925,5,115,0,0,925, + 926,5,101,0,0,926,927,5,116,0,0,927,164,1,0,0,0,928,929,5,119,0, + 0,929,930,5,97,0,0,930,931,5,116,0,0,931,932,5,99,0,0,932,933,5, + 104,0,0,933,166,1,0,0,0,934,935,5,115,0,0,935,936,5,116,0,0,936, + 937,5,97,0,0,937,938,5,114,0,0,938,939,5,116,0,0,939,168,1,0,0,0, + 940,941,5,115,0,0,941,942,5,116,0,0,942,943,5,111,0,0,943,944,5, + 112,0,0,944,170,1,0,0,0,945,946,5,114,0,0,946,947,5,101,0,0,947, + 948,5,97,0,0,948,949,5,100,0,0,949,172,1,0,0,0,950,951,5,119,0,0, + 951,952,5,114,0,0,952,953,5,105,0,0,953,954,5,116,0,0,954,955,5, + 101,0,0,955,174,1,0,0,0,956,957,5,114,0,0,957,958,5,101,0,0,958, + 959,5,115,0,0,959,960,5,111,0,0,960,961,5,108,0,0,961,962,5,118, + 0,0,962,963,5,101,0,0,963,176,1,0,0,0,964,965,5,99,0,0,965,966,5, + 111,0,0,966,967,5,110,0,0,967,968,5,110,0,0,968,969,5,101,0,0,969, + 970,5,99,0,0,970,971,5,116,0,0,971,178,1,0,0,0,972,973,5,100,0,0, + 973,974,5,105,0,0,974,975,5,115,0,0,975,976,5,99,0,0,976,977,5,111, + 0,0,977,978,5,110,0,0,978,979,5,110,0,0,979,980,5,101,0,0,980,981, + 5,99,0,0,981,982,5,116,0,0,982,180,1,0,0,0,983,984,5,99,0,0,984, + 985,5,97,0,0,985,986,5,108,0,0,986,987,5,108,0,0,987,182,1,0,0,0, + 988,989,5,119,0,0,989,990,5,97,0,0,990,991,5,116,0,0,991,992,5,99, + 0,0,992,993,5,104,0,0,993,994,5,45,0,0,994,995,5,115,0,0,995,996, + 5,116,0,0,996,997,5,97,0,0,997,998,5,114,0,0,998,999,5,116,0,0,999, + 184,1,0,0,0,1000,1001,5,119,0,0,1001,1002,5,97,0,0,1002,1003,5,116, + 0,0,1003,1004,5,99,0,0,1004,1005,5,104,0,0,1005,1006,5,45,0,0,1006, + 1007,5,115,0,0,1007,1008,5,116,0,0,1008,1009,5,111,0,0,1009,1010, + 5,112,0,0,1010,186,1,0,0,0,1011,1012,5,115,0,0,1012,1013,5,117,0, + 0,1013,1014,5,98,0,0,1014,1015,5,115,0,0,1015,1016,5,99,0,0,1016, + 1017,5,114,0,0,1017,1018,5,105,0,0,1018,1019,5,98,0,0,1019,1020, + 5,101,0,0,1020,188,1,0,0,0,1021,1022,5,117,0,0,1022,1023,5,110,0, + 0,1023,1024,5,115,0,0,1024,1025,5,117,0,0,1025,1026,5,98,0,0,1026, + 1027,5,115,0,0,1027,1028,5,99,0,0,1028,1029,5,114,0,0,1029,1030, + 5,105,0,0,1030,1031,5,98,0,0,1031,1032,5,101,0,0,1032,190,1,0,0, + 0,1033,1034,5,111,0,0,1034,1035,5,112,0,0,1035,1036,5,116,0,0,1036, + 1037,5,105,0,0,1037,1038,5,109,0,0,1038,1039,5,105,0,0,1039,1040, + 5,115,0,0,1040,1041,5,116,0,0,1041,1042,5,105,0,0,1042,1043,5,99, + 0,0,1043,1044,5,45,0,0,1044,1045,5,114,0,0,1045,1046,5,101,0,0,1046, + 1047,5,103,0,0,1047,1048,5,105,0,0,1048,1049,5,115,0,0,1049,1050, + 5,116,0,0,1050,1051,5,101,0,0,1051,1052,5,114,0,0,1052,192,1,0,0, + 0,1053,1054,5,99,0,0,1054,1055,5,114,0,0,1055,1056,5,100,0,0,1056, + 1057,5,116,0,0,1057,194,1,0,0,0,1058,1059,5,111,0,0,1059,1060,5, + 112,0,0,1060,1061,5,116,0,0,1061,1062,5,105,0,0,1062,1063,5,111, + 0,0,1063,1064,5,110,0,0,1064,1065,5,97,0,0,1065,1066,5,108,0,0,1066, + 1067,5,45,0,0,1067,1068,5,111,0,0,1068,1069,5,110,0,0,1069,1070, + 5,101,0,0,1070,196,1,0,0,0,1071,1072,5,101,0,0,1072,1073,5,120,0, + 0,1073,1074,5,97,0,0,1074,1075,5,99,0,0,1075,1076,5,116,0,0,1076, + 1077,5,108,0,0,1077,1078,5,121,0,0,1078,1079,5,45,0,0,1079,1080, + 5,111,0,0,1080,1081,5,110,0,0,1081,1082,5,101,0,0,1082,198,1,0,0, + 0,1083,1084,5,109,0,0,1084,1085,5,97,0,0,1085,1086,5,110,0,0,1086, + 1087,5,121,0,0,1087,1088,5,45,0,0,1088,1089,5,117,0,0,1089,1090, + 5,110,0,0,1090,1091,5,105,0,0,1091,1092,5,113,0,0,1092,1093,5,117, + 0,0,1093,1094,5,101,0,0,1094,200,1,0,0,0,1095,1096,5,109,0,0,1096, + 1097,5,97,0,0,1097,1098,5,110,0,0,1098,1099,5,121,0,0,1099,202,1, + 0,0,0,1100,1101,5,111,0,0,1101,1102,5,114,0,0,1102,1103,5,100,0, + 0,1103,1104,5,101,0,0,1104,1105,5,114,0,0,1105,1106,5,101,0,0,1106, + 1107,5,100,0,0,1107,204,1,0,0,0,1108,1109,5,117,0,0,1109,1110,5, + 110,0,0,1110,1111,5,105,0,0,1111,1112,5,116,0,0,1112,206,1,0,0,0, + 1113,1114,5,119,0,0,1114,1115,5,97,0,0,1115,1116,5,116,0,0,1116, + 1117,5,99,0,0,1117,1118,5,104,0,0,1118,1119,5,45,0,0,1119,1120,5, + 104,0,0,1120,1121,5,97,0,0,1121,1122,5,110,0,0,1122,1123,5,100,0, + 0,1123,1124,5,108,0,0,1124,1125,5,101,0,0,1125,208,1,0,0,0,1126, + 1127,5,109,0,0,1127,1128,5,101,0,0,1128,1129,5,115,0,0,1129,1130, + 5,115,0,0,1130,1131,5,97,0,0,1131,1132,5,103,0,0,1132,1133,5,101, + 0,0,1133,210,1,0,0,0,1134,1135,5,97,0,0,1135,1136,5,116,0,0,1136, + 1137,5,111,0,0,1137,1138,5,109,0,0,1138,1139,5,45,0,0,1139,1140, + 5,114,0,0,1140,1141,5,101,0,0,1141,1142,5,102,0,0,1142,212,1,0,0, + 0,1143,1144,5,105,0,0,1144,1145,5,110,0,0,1145,1146,5,116,0,0,1146, + 1147,5,101,0,0,1147,1148,5,114,0,0,1148,1149,5,102,0,0,1149,1150, + 5,97,0,0,1150,1151,5,99,0,0,1151,1152,5,101,0,0,1152,1153,5,45,0, + 0,1153,1154,5,114,0,0,1154,1155,5,101,0,0,1155,1156,5,102,0,0,1156, + 214,1,0,0,0,1157,1158,5,111,0,0,1158,1159,5,112,0,0,1159,1160,5, + 116,0,0,1160,1161,5,105,0,0,1161,1162,5,111,0,0,1162,1163,5,110, + 0,0,1163,1164,5,97,0,0,1164,1165,5,108,0,0,1165,216,1,0,0,0,1166, + 1167,5,108,0,0,1167,1168,5,105,0,0,1168,1169,5,115,0,0,1169,1170, + 5,116,0,0,1170,218,1,0,0,0,1171,1172,5,114,0,0,1172,1173,5,101,0, + 0,1173,1174,5,99,0,0,1174,1175,5,111,0,0,1175,1176,5,114,0,0,1176, + 1177,5,100,0,0,1177,220,1,0,0,0,1178,1179,5,98,0,0,1179,1180,5,111, + 0,0,1180,1181,5,111,0,0,1181,1182,5,108,0,0,1182,222,1,0,0,0,1183, + 1184,5,98,0,0,1184,1185,5,121,0,0,1185,1186,5,116,0,0,1186,1187, + 5,101,0,0,1187,1188,5,115,0,0,1188,224,1,0,0,0,1189,1190,5,100,0, + 0,1190,1191,5,111,0,0,1191,1192,5,117,0,0,1192,1193,5,98,0,0,1193, + 1194,5,108,0,0,1194,1195,5,101,0,0,1195,226,1,0,0,0,1196,1197,5, + 105,0,0,1197,1198,5,110,0,0,1198,1199,5,116,0,0,1199,1200,5,51,0, + 0,1200,1201,5,50,0,0,1201,228,1,0,0,0,1202,1203,5,105,0,0,1203,1204, + 5,110,0,0,1204,1205,5,116,0,0,1205,1206,5,54,0,0,1206,1207,5,52, + 0,0,1207,230,1,0,0,0,1208,1209,5,115,0,0,1209,1210,5,116,0,0,1210, + 1211,5,114,0,0,1211,1212,5,105,0,0,1212,1213,5,110,0,0,1213,1214, + 5,103,0,0,1214,232,1,0,0,0,1215,1216,5,117,0,0,1216,1217,5,105,0, + 0,1217,1218,5,110,0,0,1218,1219,5,116,0,0,1219,1220,5,51,0,0,1220, + 1221,5,50,0,0,1221,234,1,0,0,0,1222,1223,5,117,0,0,1223,1224,5,105, + 0,0,1224,1225,5,110,0,0,1225,1226,5,116,0,0,1226,1227,5,54,0,0,1227, + 1228,5,52,0,0,1228,236,1,0,0,0,1229,1230,5,116,0,0,1230,1231,5,114, + 0,0,1231,1232,5,117,0,0,1232,1233,5,101,0,0,1233,238,1,0,0,0,1234, + 1235,5,102,0,0,1235,1236,5,97,0,0,1236,1237,5,108,0,0,1237,1238, + 5,115,0,0,1238,1239,5,101,0,0,1239,240,1,0,0,0,1240,1241,5,110,0, + 0,1241,1242,5,117,0,0,1242,1243,5,108,0,0,1243,1244,5,108,0,0,1244, + 242,1,0,0,0,1245,1246,5,45,0,0,1246,1247,5,62,0,0,1247,244,1,0,0, + 0,1248,1249,5,58,0,0,1249,246,1,0,0,0,1250,1251,5,59,0,0,1251,248, + 1,0,0,0,1252,1253,5,44,0,0,1253,250,1,0,0,0,1254,1255,5,46,0,0,1255, + 252,1,0,0,0,1256,1257,5,123,0,0,1257,254,1,0,0,0,1258,1259,5,125, + 0,0,1259,256,1,0,0,0,1260,1261,5,91,0,0,1261,258,1,0,0,0,1262,1263, + 5,93,0,0,1263,260,1,0,0,0,1264,1265,5,40,0,0,1265,262,1,0,0,0,1266, + 1267,5,41,0,0,1267,264,1,0,0,0,1268,1269,5,60,0,0,1269,266,1,0,0, + 0,1270,1271,5,62,0,0,1271,268,1,0,0,0,1272,1273,5,38,0,0,1273,270, + 1,0,0,0,1274,1275,5,61,0,0,1275,272,1,0,0,0,1276,1278,5,45,0,0,1277, + 1276,1,0,0,0,1277,1278,1,0,0,0,1278,1280,1,0,0,0,1279,1281,7,0,0, + 0,1280,1279,1,0,0,0,1281,1282,1,0,0,0,1282,1280,1,0,0,0,1282,1283, + 1,0,0,0,1283,274,1,0,0,0,1284,1286,5,45,0,0,1285,1284,1,0,0,0,1285, + 1286,1,0,0,0,1286,1295,1,0,0,0,1287,1296,5,48,0,0,1288,1292,7,1, + 0,0,1289,1291,7,0,0,0,1290,1289,1,0,0,0,1291,1294,1,0,0,0,1292,1290, + 1,0,0,0,1292,1293,1,0,0,0,1293,1296,1,0,0,0,1294,1292,1,0,0,0,1295, + 1287,1,0,0,0,1295,1288,1,0,0,0,1296,1303,1,0,0,0,1297,1299,5,46, + 0,0,1298,1300,7,0,0,0,1299,1298,1,0,0,0,1300,1301,1,0,0,0,1301,1299, + 1,0,0,0,1301,1302,1,0,0,0,1302,1304,1,0,0,0,1303,1297,1,0,0,0,1303, + 1304,1,0,0,0,1304,1314,1,0,0,0,1305,1307,7,2,0,0,1306,1308,7,3,0, + 0,1307,1306,1,0,0,0,1307,1308,1,0,0,0,1308,1310,1,0,0,0,1309,1311, + 7,0,0,0,1310,1309,1,0,0,0,1311,1312,1,0,0,0,1312,1310,1,0,0,0,1312, + 1313,1,0,0,0,1313,1315,1,0,0,0,1314,1305,1,0,0,0,1314,1315,1,0,0, + 0,1315,276,1,0,0,0,1316,1320,7,4,0,0,1317,1319,7,5,0,0,1318,1317, + 1,0,0,0,1319,1322,1,0,0,0,1320,1318,1,0,0,0,1320,1321,1,0,0,0,1321, + 278,1,0,0,0,1322,1320,1,0,0,0,1323,1328,5,34,0,0,1324,1327,3,281, + 140,0,1325,1327,8,6,0,0,1326,1324,1,0,0,0,1326,1325,1,0,0,0,1327, + 1330,1,0,0,0,1328,1326,1,0,0,0,1328,1329,1,0,0,0,1329,1331,1,0,0, + 0,1330,1328,1,0,0,0,1331,1332,5,34,0,0,1332,280,1,0,0,0,1333,1341, + 5,92,0,0,1334,1342,7,7,0,0,1335,1336,5,117,0,0,1336,1337,3,283,141, + 0,1337,1338,3,283,141,0,1338,1339,3,283,141,0,1339,1340,3,283,141, + 0,1340,1342,1,0,0,0,1341,1334,1,0,0,0,1341,1335,1,0,0,0,1342,282, + 1,0,0,0,1343,1344,7,8,0,0,1344,284,1,0,0,0,1345,1346,5,47,0,0,1346, + 1347,5,47,0,0,1347,1351,1,0,0,0,1348,1350,8,9,0,0,1349,1348,1,0, + 0,0,1350,1353,1,0,0,0,1351,1349,1,0,0,0,1351,1352,1,0,0,0,1352,1354, + 1,0,0,0,1353,1351,1,0,0,0,1354,1355,6,142,0,0,1355,286,1,0,0,0,1356, + 1357,5,47,0,0,1357,1358,5,42,0,0,1358,1362,1,0,0,0,1359,1361,9,0, + 0,0,1360,1359,1,0,0,0,1361,1364,1,0,0,0,1362,1363,1,0,0,0,1362,1360, + 1,0,0,0,1363,1365,1,0,0,0,1364,1362,1,0,0,0,1365,1366,5,42,0,0,1366, + 1367,5,47,0,0,1367,1368,1,0,0,0,1368,1369,6,143,0,0,1369,288,1,0, + 0,0,1370,1372,7,10,0,0,1371,1370,1,0,0,0,1372,1373,1,0,0,0,1373, + 1371,1,0,0,0,1373,1374,1,0,0,0,1374,1375,1,0,0,0,1375,1376,6,144, + 0,0,1376,290,1,0,0,0,18,0,1277,1282,1285,1292,1295,1301,1303,1307, + 1312,1314,1320,1326,1328,1341,1351,1362,1373,1,0,1,0 ]; private static __ATN: antlr.ATN; diff --git a/src/capability-language/generated/QuixosCapabilityParser.ts b/src/capability-language/generated/QuixosCapabilityParser.ts index b77d280..a0aa492 100644 --- a/src/capability-language/generated/QuixosCapabilityParser.ts +++ b/src/capability-language/generated/QuixosCapabilityParser.ts @@ -11,139 +11,148 @@ type int = number; export class QuixosCapabilityParser extends antlr.Parser { public static readonly WORKSPACE = 1; - public static readonly RESULT_BYTES = 2; - public static readonly RPC_CALLS = 3; - public static readonly DEADLINE_MS = 4; - public static readonly QUERY = 5; - public static readonly REFLECTION = 6; - public static readonly SPECIALIZE = 7; - public static readonly ROOT = 8; - public static readonly DOCUMENT = 9; - public static readonly FRAGMENTS = 10; - public static readonly VIEW = 11; - public static readonly MAX = 12; - public static readonly ALLOW = 13; - public static readonly POLL = 14; - public static readonly QUERYABLE = 15; - public static readonly RPC = 16; - public static readonly QUERY_REASON = 17; - public static readonly TYPE = 18; - public static readonly OBJECT = 19; - public static readonly STORABLE = 20; - public static readonly IMPLEMENTS = 21; - public static readonly REF = 22; - public static readonly FRAGMENT = 23; - public static readonly IMPORT = 24; - public static readonly EXTERNAL = 25; - public static readonly ATOM = 26; - public static readonly INTERFACE = 27; - public static readonly INTERFACES = 28; - public static readonly PACKAGE = 29; - public static readonly VALUE = 30; - public static readonly RELATION = 31; - public static readonly OPERATION = 32; - public static readonly FUNCTION = 33; - public static readonly CONSTRUCTOR = 34; - public static readonly CONSTRUCTS = 35; - public static readonly INPUT = 36; - public static readonly CONFORM = 37; - public static readonly AS = 38; - public static readonly BIND = 39; - public static readonly STATIC = 40; - public static readonly TO = 41; - public static readonly PRIVATE = 42; - public static readonly SHARED = 43; - public static readonly STATE = 44; - public static readonly EDGE = 45; - public static readonly PROJECTION = 46; - public static readonly WITH = 47; - public static readonly USING = 48; - public static readonly VIA = 49; - public static readonly MATERIALIZE = 50; - public static readonly IF = 51; - public static readonly ABSENT = 52; - public static readonly ON = 53; - public static readonly POLICY = 54; - public static readonly DEFAULT = 55; - public static readonly SOURCE = 56; - public static readonly REPOSITORY = 57; - public static readonly COMMIT = 58; - public static readonly REVISION = 59; - public static readonly SEMANTIC_MAJOR = 60; - public static readonly ON_DELETE = 61; - public static readonly RETAIN_OTHER = 62; - public static readonly KEYED = 63; - public static readonly PUBLIC_TRAVERSAL = 64; - public static readonly ID = 65; - public static readonly DOC = 66; - public static readonly MODE = 67; - public static readonly EMITS = 68; - public static readonly RECEIVER = 69; - public static readonly REQUIRES = 70; - public static readonly ANY = 71; - public static readonly GET = 72; - public static readonly SET = 73; - public static readonly WATCH = 74; - public static readonly START = 75; - public static readonly STOP = 76; - public static readonly READ = 77; - public static readonly WRITE = 78; - public static readonly RESOLVE = 79; - public static readonly CONNECT = 80; - public static readonly DISCONNECT = 81; - public static readonly CALL = 82; - public static readonly WATCH_START = 83; - public static readonly WATCH_STOP = 84; - public static readonly SUBSCRIBE = 85; - public static readonly UNSUBSCRIBE = 86; - public static readonly OPTIMISTIC_REGISTER = 87; - public static readonly CRDT = 88; - public static readonly OPTIONAL_ONE = 89; - public static readonly EXACTLY_ONE = 90; - public static readonly MANY_UNIQUE = 91; - public static readonly MANY = 92; - public static readonly ORDERED = 93; - public static readonly UNIT = 94; - public static readonly WATCH_HANDLE = 95; - public static readonly MESSAGE = 96; - public static readonly ATOM_REF = 97; - public static readonly INTERFACE_REF = 98; - public static readonly OPTIONAL = 99; - public static readonly LIST = 100; - public static readonly RECORD = 101; - public static readonly BOOL = 102; - public static readonly BYTES = 103; - public static readonly DOUBLE = 104; - public static readonly INT32 = 105; - public static readonly INT64 = 106; - public static readonly STRING = 107; - public static readonly UINT32 = 108; - public static readonly UINT64 = 109; - public static readonly TRUE = 110; - public static readonly FALSE = 111; - public static readonly NULL = 112; - public static readonly ARROW = 113; - public static readonly COLON = 114; - public static readonly SEMI = 115; - public static readonly COMMA = 116; - public static readonly DOT = 117; - public static readonly LBRACE = 118; - public static readonly RBRACE = 119; - public static readonly LBRACK = 120; - public static readonly RBRACK = 121; - public static readonly LPAREN = 122; - public static readonly RPAREN = 123; - public static readonly LT = 124; - public static readonly GT = 125; - public static readonly AMP = 126; - public static readonly EQUAL = 127; - public static readonly INTEGER = 128; - public static readonly JSON_NUMBER = 129; - public static readonly IDENTIFIER = 130; - public static readonly STRING_LITERAL = 131; - public static readonly LINE_COMMENT = 132; - public static readonly BLOCK_COMMENT = 133; - public static readonly WS = 134; + public static readonly EXECUTION = 2; + public static readonly SNAPSHOT = 3; + public static readonly TRANSACTION = 4; + public static readonly REMOTE = 5; + public static readonly TARGETS = 6; + public static readonly PORTABLE = 7; + public static readonly REPLICA = 8; + public static readonly LOCAL = 9; + public static readonly FROM = 10; + public static readonly RESULT_BYTES = 11; + public static readonly RPC_CALLS = 12; + public static readonly DEADLINE_MS = 13; + public static readonly QUERY = 14; + public static readonly REFLECTION = 15; + public static readonly SPECIALIZE = 16; + public static readonly ROOT = 17; + public static readonly DOCUMENT = 18; + public static readonly FRAGMENTS = 19; + public static readonly VIEW = 20; + public static readonly MAX = 21; + public static readonly ALLOW = 22; + public static readonly POLL = 23; + public static readonly QUERYABLE = 24; + public static readonly RPC = 25; + public static readonly QUERY_REASON = 26; + public static readonly TYPE = 27; + public static readonly OBJECT = 28; + public static readonly STORABLE = 29; + public static readonly IMPLEMENTS = 30; + public static readonly REF = 31; + public static readonly FRAGMENT = 32; + public static readonly IMPORT = 33; + public static readonly EXTERNAL = 34; + public static readonly ATOM = 35; + public static readonly INTERFACE = 36; + public static readonly INTERFACES = 37; + public static readonly PACKAGE = 38; + public static readonly VALUE = 39; + public static readonly RELATION = 40; + public static readonly OPERATION = 41; + public static readonly FUNCTION = 42; + public static readonly CONSTRUCTOR = 43; + public static readonly CONSTRUCTS = 44; + public static readonly INPUT = 45; + public static readonly CONFORM = 46; + public static readonly AS = 47; + public static readonly BIND = 48; + public static readonly STATIC = 49; + public static readonly TO = 50; + public static readonly PRIVATE = 51; + public static readonly SHARED = 52; + public static readonly STATE = 53; + public static readonly EDGE = 54; + public static readonly PROJECTION = 55; + public static readonly WITH = 56; + public static readonly USING = 57; + public static readonly VIA = 58; + public static readonly MATERIALIZE = 59; + public static readonly IF = 60; + public static readonly ABSENT = 61; + public static readonly ON = 62; + public static readonly POLICY = 63; + public static readonly DEFAULT = 64; + public static readonly SOURCE = 65; + public static readonly REPOSITORY = 66; + public static readonly COMMIT = 67; + public static readonly REVISION = 68; + public static readonly SEMANTIC_MAJOR = 69; + public static readonly ON_DELETE = 70; + public static readonly RETAIN_OTHER = 71; + public static readonly KEYED = 72; + public static readonly PUBLIC_TRAVERSAL = 73; + public static readonly ID = 74; + public static readonly DOC = 75; + public static readonly MODE = 76; + public static readonly EMITS = 77; + public static readonly RECEIVER = 78; + public static readonly REQUIRES = 79; + public static readonly ANY = 80; + public static readonly GET = 81; + public static readonly SET = 82; + public static readonly WATCH = 83; + public static readonly START = 84; + public static readonly STOP = 85; + public static readonly READ = 86; + public static readonly WRITE = 87; + public static readonly RESOLVE = 88; + public static readonly CONNECT = 89; + public static readonly DISCONNECT = 90; + public static readonly CALL = 91; + public static readonly WATCH_START = 92; + public static readonly WATCH_STOP = 93; + public static readonly SUBSCRIBE = 94; + public static readonly UNSUBSCRIBE = 95; + public static readonly OPTIMISTIC_REGISTER = 96; + public static readonly CRDT = 97; + public static readonly OPTIONAL_ONE = 98; + public static readonly EXACTLY_ONE = 99; + public static readonly MANY_UNIQUE = 100; + public static readonly MANY = 101; + public static readonly ORDERED = 102; + public static readonly UNIT = 103; + public static readonly WATCH_HANDLE = 104; + public static readonly MESSAGE = 105; + public static readonly ATOM_REF = 106; + public static readonly INTERFACE_REF = 107; + public static readonly OPTIONAL = 108; + public static readonly LIST = 109; + public static readonly RECORD = 110; + public static readonly BOOL = 111; + public static readonly BYTES = 112; + public static readonly DOUBLE = 113; + public static readonly INT32 = 114; + public static readonly INT64 = 115; + public static readonly STRING = 116; + public static readonly UINT32 = 117; + public static readonly UINT64 = 118; + public static readonly TRUE = 119; + public static readonly FALSE = 120; + public static readonly NULL = 121; + public static readonly ARROW = 122; + public static readonly COLON = 123; + public static readonly SEMI = 124; + public static readonly COMMA = 125; + public static readonly DOT = 126; + public static readonly LBRACE = 127; + public static readonly RBRACE = 128; + public static readonly LBRACK = 129; + public static readonly RBRACK = 130; + public static readonly LPAREN = 131; + public static readonly RPAREN = 132; + public static readonly LT = 133; + public static readonly GT = 134; + public static readonly AMP = 135; + public static readonly EQUAL = 136; + public static readonly INTEGER = 137; + public static readonly JSON_NUMBER = 138; + public static readonly IDENTIFIER = 139; + public static readonly STRING_LITERAL = 140; + public static readonly LINE_COMMENT = 141; + public static readonly BLOCK_COMMENT = 142; + public static readonly WS = 143; public static readonly RULE_document = 0; public static readonly RULE_fragmentDecl = 1; public static readonly RULE_sourceImportDecl = 2; @@ -176,54 +185,58 @@ export class QuixosCapabilityParser extends antlr.Parser { public static readonly RULE_queryClause = 29; public static readonly RULE_packageOperationExport = 30; public static readonly RULE_packageFunctionExport = 31; - public static readonly RULE_packageConstructorExport = 32; - public static readonly RULE_eventClause = 33; - public static readonly RULE_operationMode = 34; - public static readonly RULE_receiverRequirement = 35; - public static readonly RULE_identifierList = 36; - public static readonly RULE_dependencyBlock = 37; - public static readonly RULE_dependencyPort = 38; - public static readonly RULE_primitiveList = 39; - public static readonly RULE_primitive = 40; - public static readonly RULE_sharedAttachmentDecl = 41; - public static readonly RULE_attachmentDecl = 42; - public static readonly RULE_stateDecl = 43; - public static readonly RULE_storagePolicy = 44; - public static readonly RULE_edgeDecl = 45; - public static readonly RULE_edgeEndpoint = 46; - public static readonly RULE_conformanceDecl = 47; - public static readonly RULE_conformanceItem = 48; - public static readonly RULE_stateFieldBindingDecl = 49; - public static readonly RULE_relationshipMaterializationDecl = 50; - public static readonly RULE_operationBindingDecl = 51; - public static readonly RULE_memberOperationRef = 52; - public static readonly RULE_operationName = 53; - public static readonly RULE_operationProvider = 54; - public static readonly RULE_statePrimitive = 55; - public static readonly RULE_edgePrimitive = 56; - public static readonly RULE_dependencyBindingBlock = 57; - public static readonly RULE_dependencyBinding = 58; - public static readonly RULE_constructorBindingDecl = 59; - public static readonly RULE_valueType = 60; - public static readonly RULE_recordField = 61; - public static readonly RULE_scalarType = 62; - public static readonly RULE_cardinality = 63; - public static readonly RULE_jsonLiteral = 64; - public static readonly RULE_jsonObject = 65; - public static readonly RULE_jsonMember = 66; - public static readonly RULE_jsonArray = 67; - public static readonly RULE_identifier = 68; - public static readonly RULE_stringLiteral = 69; + public static readonly RULE_executionClause = 32; + public static readonly RULE_selectedOperations = 33; + public static readonly RULE_packageConstructorExport = 34; + public static readonly RULE_eventClause = 35; + public static readonly RULE_operationMode = 36; + public static readonly RULE_receiverRequirement = 37; + public static readonly RULE_identifierList = 38; + public static readonly RULE_dependencyBlock = 39; + public static readonly RULE_dependencyPort = 40; + public static readonly RULE_primitiveList = 41; + public static readonly RULE_primitive = 42; + public static readonly RULE_sharedAttachmentDecl = 43; + public static readonly RULE_attachmentDecl = 44; + public static readonly RULE_stateDecl = 45; + public static readonly RULE_storagePolicy = 46; + public static readonly RULE_edgeDecl = 47; + public static readonly RULE_edgeEndpoint = 48; + public static readonly RULE_conformanceDecl = 49; + public static readonly RULE_conformanceItem = 50; + public static readonly RULE_stateFieldBindingDecl = 51; + public static readonly RULE_relationshipMaterializationDecl = 52; + public static readonly RULE_operationBindingDecl = 53; + public static readonly RULE_memberOperationRef = 54; + public static readonly RULE_operationName = 55; + public static readonly RULE_operationProvider = 56; + public static readonly RULE_statePrimitive = 57; + public static readonly RULE_edgePrimitive = 58; + public static readonly RULE_dependencyBindingBlock = 59; + public static readonly RULE_dependencyBinding = 60; + public static readonly RULE_constructorBindingDecl = 61; + public static readonly RULE_valueType = 62; + public static readonly RULE_recordField = 63; + public static readonly RULE_scalarType = 64; + public static readonly RULE_cardinality = 65; + public static readonly RULE_jsonLiteral = 66; + public static readonly RULE_jsonObject = 67; + public static readonly RULE_jsonMember = 68; + public static readonly RULE_jsonArray = 69; + public static readonly RULE_identifier = 70; + public static readonly RULE_stringLiteral = 71; public static readonly literalNames = [ - null, "'workspace'", "'result-bytes'", "'rpc-calls'", "'deadline-ms'", - "'query'", "'reflection'", "'specialize'", "'root'", "'document'", - "'fragments'", "'view'", "'max'", "'allow'", "'poll'", "'queryable'", - "'rpc'", "'query-reason'", "'type'", "'object'", "'storable'", "'implements'", - "'ref'", "'fragment'", "'import'", "'external'", "'atom'", "'interface'", - "'interfaces'", "'package'", "'value'", "'relation'", "'operation'", - "'function'", "'constructor'", "'constructs'", "'input'", "'conform'", - "'as'", "'bind'", "'static'", "'to'", "'private'", "'shared'", "'state'", + null, "'workspace'", "'execution'", "'snapshot'", "'transaction'", + "'remote'", "'targets'", "'portable'", "'replica'", "'local'", "'from'", + "'result-bytes'", "'rpc-calls'", "'deadline-ms'", "'query'", "'reflection'", + "'specialize'", "'root'", "'document'", "'fragments'", "'view'", + "'max'", "'allow'", "'poll'", "'queryable'", "'rpc'", "'query-reason'", + "'type'", "'object'", "'storable'", "'implements'", "'ref'", "'fragment'", + "'import'", "'external'", "'atom'", "'interface'", "'interfaces'", + "'package'", "'value'", "'relation'", "'operation'", "'function'", + "'constructor'", "'constructs'", "'input'", "'conform'", "'as'", + "'bind'", "'static'", "'to'", "'private'", "'shared'", "'state'", "'edge'", "'projection'", "'with'", "'using'", "'via'", "'materialize'", "'if'", "'absent'", "'on'", "'policy'", "'default'", "'source'", "'repository'", "'commit'", "'revision'", "'semantic-major'", "'on-delete'", @@ -241,28 +254,29 @@ export class QuixosCapabilityParser extends antlr.Parser { ]; public static readonly symbolicNames = [ - null, "WORKSPACE", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", - "REFLECTION", "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", - "MAX", "ALLOW", "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", - "OBJECT", "STORABLE", "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", - "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", - "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", - "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", "PRIVATE", "SHARED", - "STATE", "EDGE", "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", - "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", - "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", "RETAIN_OTHER", - "KEYED", "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", "EMITS", "RECEIVER", - "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", - "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", - "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", - "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", - "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", - "OPTIONAL", "LIST", "RECORD", "BOOL", "BYTES", "DOUBLE", "INT32", - "INT64", "STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", - "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", - "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "AMP", "EQUAL", "INTEGER", - "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", - "WS" + null, "WORKSPACE", "EXECUTION", "SNAPSHOT", "TRANSACTION", "REMOTE", + "TARGETS", "PORTABLE", "REPLICA", "LOCAL", "FROM", "RESULT_BYTES", + "RPC_CALLS", "DEADLINE_MS", "QUERY", "REFLECTION", "SPECIALIZE", + "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", "MAX", "ALLOW", "POLL", + "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", "OBJECT", "STORABLE", + "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", + "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", + "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", + "TO", "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", + "USING", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", + "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", + "ON_DELETE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", + "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", + "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", + "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", + "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", + "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", + "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", "BOOL", + "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", + "TRUE", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", + "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", + "GT", "AMP", "EQUAL", "INTEGER", "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", + "LINE_COMMENT", "BLOCK_COMMENT", "WS" ]; public static readonly ruleNames = [ "document", "fragmentDecl", "sourceImportDecl", "workspaceDecl", @@ -273,14 +287,14 @@ export class QuixosCapabilityParser extends antlr.Parser { "valueMemberOperation", "relationshipMember", "queryReadContract", "relationshipOperation", "targetConstraint", "packageResourceDecl", "packageExport", "packageQuery", "packageQuerySpecialization", "queryClause", - "packageOperationExport", "packageFunctionExport", "packageConstructorExport", - "eventClause", "operationMode", "receiverRequirement", "identifierList", - "dependencyBlock", "dependencyPort", "primitiveList", "primitive", - "sharedAttachmentDecl", "attachmentDecl", "stateDecl", "storagePolicy", - "edgeDecl", "edgeEndpoint", "conformanceDecl", "conformanceItem", - "stateFieldBindingDecl", "relationshipMaterializationDecl", "operationBindingDecl", - "memberOperationRef", "operationName", "operationProvider", "statePrimitive", - "edgePrimitive", "dependencyBindingBlock", "dependencyBinding", + "packageOperationExport", "packageFunctionExport", "executionClause", + "selectedOperations", "packageConstructorExport", "eventClause", + "operationMode", "receiverRequirement", "identifierList", "dependencyBlock", + "dependencyPort", "primitiveList", "primitive", "sharedAttachmentDecl", + "attachmentDecl", "stateDecl", "storagePolicy", "edgeDecl", "edgeEndpoint", + "conformanceDecl", "conformanceItem", "stateFieldBindingDecl", "relationshipMaterializationDecl", + "operationBindingDecl", "memberOperationRef", "operationName", "operationProvider", + "statePrimitive", "edgePrimitive", "dependencyBindingBlock", "dependencyBinding", "constructorBindingDecl", "valueType", "recordField", "scalarType", "cardinality", "jsonLiteral", "jsonObject", "jsonMember", "jsonArray", "identifier", "stringLiteral", @@ -304,42 +318,42 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new DocumentContext(this.context, this.state); this.enterRule(localContext, 0, QuixosCapabilityParser.RULE_document); try { - this.state = 152; + this.state = 156; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 0, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 140; + this.state = 144; this.workspaceDecl(); - this.state = 141; + this.state = 145; this.match(QuixosCapabilityParser.EOF); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 143; + this.state = 147; this.interfaceResourceDecl(); - this.state = 144; + this.state = 148; this.match(QuixosCapabilityParser.EOF); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 146; + this.state = 150; this.packageResourceDecl(); - this.state = 147; + this.state = 151; this.match(QuixosCapabilityParser.EOF); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 149; + this.state = 153; this.fragmentDecl(); - this.state = 150; + this.state = 154; this.match(QuixosCapabilityParser.EOF); } break; @@ -365,25 +379,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 154; + this.state = 158; this.match(QuixosCapabilityParser.FRAGMENT); - this.state = 155; - this.match(QuixosCapabilityParser.LBRACE); this.state = 159; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 163; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 18)) & ~0x1F) === 0 && ((1 << (_la - 18)) & 34144577) !== 0)) { + while (((((_la - 27)) & ~0x1F) === 0 && ((1 << (_la - 27)) & 34144577) !== 0)) { { { - this.state = 156; + this.state = 160; this.workspaceItem(); } } - this.state = 161; + this.state = 165; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 162; + this.state = 166; this.match(QuixosCapabilityParser.RBRACE); } } @@ -406,11 +420,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 164; + this.state = 168; this.match(QuixosCapabilityParser.IMPORT); - this.state = 165; + this.state = 169; this.stringLiteral(); - this.state = 166; + this.state = 170; this.match(QuixosCapabilityParser.SEMI); } } @@ -434,39 +448,39 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 168; - this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 169; - this.identifier(); - this.state = 170; - this.match(QuixosCapabilityParser.ID); - this.state = 171; - this.stringLiteral(); this.state = 172; - this.match(QuixosCapabilityParser.REVISION); + this.match(QuixosCapabilityParser.WORKSPACE); this.state = 173; - this.stringLiteral(); + this.identifier(); this.state = 174; - this.match(QuixosCapabilityParser.COMMIT); + this.match(QuixosCapabilityParser.ID); this.state = 175; this.stringLiteral(); this.state = 176; - this.match(QuixosCapabilityParser.LBRACE); + this.match(QuixosCapabilityParser.REVISION); + this.state = 177; + this.stringLiteral(); + this.state = 178; + this.match(QuixosCapabilityParser.COMMIT); + this.state = 179; + this.stringLiteral(); this.state = 180; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 184; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 18)) & ~0x1F) === 0 && ((1 << (_la - 18)) & 34144577) !== 0)) { + while (((((_la - 27)) & ~0x1F) === 0 && ((1 << (_la - 27)) & 34144577) !== 0)) { { { - this.state = 177; + this.state = 181; this.workspaceItem(); } } - this.state = 182; + this.state = 186; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 183; + this.state = 187; this.match(QuixosCapabilityParser.RBRACE); } } @@ -487,55 +501,55 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new WorkspaceItemContext(this.context, this.state); this.enterRule(localContext, 8, QuixosCapabilityParser.RULE_workspaceItem); try { - this.state = 192; + this.state = 196; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 3, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 185; + this.state = 189; this.sourceImportDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 186; + this.state = 190; this.atomDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 187; + this.state = 191; this.resourceImportDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 188; + this.state = 192; this.sharedAttachmentDecl(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 189; + this.state = 193; this.conformanceDecl(); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 190; + this.state = 194; this.constructorBindingDecl(); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 191; + this.state = 195; this.typeAliasDecl(); } break; @@ -558,32 +572,32 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ResourceImportDeclContext(this.context, this.state); this.enterRule(localContext, 10, QuixosCapabilityParser.RULE_resourceImportDecl); try { - this.state = 204; + this.state = 208; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 4, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 194; + this.state = 198; this.match(QuixosCapabilityParser.IMPORT); - this.state = 195; + this.state = 199; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 196; + this.state = 200; this.identifier(); - this.state = 197; + this.state = 201; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 199; + this.state = 203; this.match(QuixosCapabilityParser.IMPORT); - this.state = 200; + this.state = 204; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 201; + this.state = 205; this.identifier(); - this.state = 202; + this.state = 206; this.match(QuixosCapabilityParser.SEMI); } break; @@ -608,17 +622,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 206; - this.match(QuixosCapabilityParser.EXTERNAL); - this.state = 207; - this.match(QuixosCapabilityParser.ATOM); - this.state = 208; - this.identifier(); - this.state = 209; - this.match(QuixosCapabilityParser.ID); this.state = 210; - this.stringLiteral(); + this.match(QuixosCapabilityParser.EXTERNAL); this.state = 211; + this.match(QuixosCapabilityParser.ATOM); + this.state = 212; + this.identifier(); + this.state = 213; + this.match(QuixosCapabilityParser.ID); + this.state = 214; + this.stringLiteral(); + this.state = 215; this.match(QuixosCapabilityParser.SEMI); } } @@ -641,17 +655,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 213; - this.match(QuixosCapabilityParser.EXTERNAL); - this.state = 214; - this.match(QuixosCapabilityParser.INTERFACE); - this.state = 215; - this.identifier(); - this.state = 216; - this.match(QuixosCapabilityParser.REVISION); this.state = 217; - this.stringLiteral(); + this.match(QuixosCapabilityParser.EXTERNAL); this.state = 218; + this.match(QuixosCapabilityParser.INTERFACE); + this.state = 219; + this.identifier(); + this.state = 220; + this.match(QuixosCapabilityParser.REVISION); + this.state = 221; + this.stringLiteral(); + this.state = 222; this.match(QuixosCapabilityParser.SEMI); } } @@ -672,34 +686,34 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ResourcePreambleContext(this.context, this.state); this.enterRule(localContext, 16, QuixosCapabilityParser.RULE_resourcePreamble); try { - this.state = 224; + this.state = 228; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 5, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 220; + this.state = 224; this.resourceImportDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 221; + this.state = 225; this.externalAtomDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 222; + this.state = 226; this.externalInterfaceDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 223; + this.state = 227; this.typeAliasDecl(); } break; @@ -725,27 +739,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 226; + this.state = 230; this.match(QuixosCapabilityParser.ATOM); - this.state = 227; + this.state = 231; this.identifier(); - this.state = 228; - this.match(QuixosCapabilityParser.ID); - this.state = 229; - this.stringLiteral(); this.state = 232; + this.match(QuixosCapabilityParser.ID); + this.state = 233; + this.stringLiteral(); + this.state = 236; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 66) { + if (_la === 75) { { - this.state = 230; + this.state = 234; this.match(QuixosCapabilityParser.DOC); - this.state = 231; + this.state = 235; this.stringLiteral(); } } - this.state = 234; + this.state = 238; this.match(QuixosCapabilityParser.SEMI); } } @@ -769,87 +783,87 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 239; + this.state = 243; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 50593792) !== 0)) { + while (((((_la - 27)) & ~0x1F) === 0 && ((1 << (_la - 27)) & 193) !== 0)) { { { - this.state = 236; + this.state = 240; this.resourcePreamble(); } } - this.state = 241; + this.state = 245; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 242; + this.state = 246; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 243; + this.state = 247; this.identifier(); - this.state = 245; + this.state = 249; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 124) { + if (_la === 133) { { - this.state = 244; + this.state = 248; this.typeParameters(); } } - this.state = 247; + this.state = 251; this.match(QuixosCapabilityParser.ID); - this.state = 248; + this.state = 252; this.stringLiteral(); - this.state = 249; + this.state = 253; this.match(QuixosCapabilityParser.REVISION); - this.state = 250; + this.state = 254; this.stringLiteral(); - this.state = 260; + this.state = 264; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 70) { + if (_la === 79) { { - this.state = 251; + this.state = 255; this.match(QuixosCapabilityParser.REQUIRES); - this.state = 252; + this.state = 256; this.interfaceType(); - this.state = 257; + this.state = 261; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 116) { + while (_la === 125) { { { - this.state = 253; + this.state = 257; this.match(QuixosCapabilityParser.COMMA); - this.state = 254; + this.state = 258; this.interfaceType(); } } - this.state = 259; + this.state = 263; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 262; - this.match(QuixosCapabilityParser.LBRACE); this.state = 266; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 270; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 15)) & ~0x1F) === 0 && ((1 << (_la - 15)) & 33783809) !== 0)) { + while (((((_la - 24)) & ~0x1F) === 0 && ((1 << (_la - 24)) & 33783809) !== 0)) { { { - this.state = 263; + this.state = 267; this.interfaceMember(); } } - this.state = 268; + this.state = 272; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 269; + this.state = 273; this.match(QuixosCapabilityParser.RBRACE); } } @@ -873,27 +887,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 271; + this.state = 275; this.match(QuixosCapabilityParser.LT); - this.state = 272; + this.state = 276; this.typeParameter(); - this.state = 277; + this.state = 281; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 116) { + while (_la === 125) { { { - this.state = 273; + this.state = 277; this.match(QuixosCapabilityParser.COMMA); - this.state = 274; + this.state = 278; this.typeParameter(); } } - this.state = 279; + this.state = 283; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 280; + this.state = 284; this.match(QuixosCapabilityParser.GT); } } @@ -915,24 +929,24 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 24, QuixosCapabilityParser.RULE_typeParameter); let _la: number; try { - this.state = 301; + this.state = 305; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.VALUE: this.enterOuterAlt(localContext, 1); { - this.state = 282; - this.match(QuixosCapabilityParser.VALUE); - this.state = 283; - this.identifier(); this.state = 286; + this.match(QuixosCapabilityParser.VALUE); + this.state = 287; + this.identifier(); + this.state = 290; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 114) { + if (_la === 123) { { - this.state = 284; + this.state = 288; this.match(QuixosCapabilityParser.COLON); - this.state = 285; + this.state = 289; this.match(QuixosCapabilityParser.STORABLE); } } @@ -942,32 +956,32 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 2); { - this.state = 288; + this.state = 292; this.match(QuixosCapabilityParser.OBJECT); - this.state = 289; + this.state = 293; this.identifier(); - this.state = 299; + this.state = 303; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 21) { + if (_la === 30) { { - this.state = 290; + this.state = 294; this.match(QuixosCapabilityParser.IMPLEMENTS); - this.state = 291; + this.state = 295; this.interfaceType(); - this.state = 296; + this.state = 300; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 126) { + while (_la === 135) { { { - this.state = 292; + this.state = 296; this.match(QuixosCapabilityParser.AMP); - this.state = 293; + this.state = 297; this.interfaceType(); } } - this.state = 298; + this.state = 302; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } @@ -1000,14 +1014,14 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 303; + this.state = 307; this.identifier(); - this.state = 305; + this.state = 309; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 124) { + if (_la === 133) { { - this.state = 304; + this.state = 308; this.typeArguments(); } } @@ -1034,27 +1048,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 307; + this.state = 311; this.match(QuixosCapabilityParser.LT); - this.state = 308; + this.state = 312; this.typeArgument(); - this.state = 313; + this.state = 317; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 116) { + while (_la === 125) { { { - this.state = 309; + this.state = 313; this.match(QuixosCapabilityParser.COMMA); - this.state = 310; + this.state = 314; this.typeArgument(); } } - this.state = 315; + this.state = 319; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 316; + this.state = 320; this.match(QuixosCapabilityParser.GT); } } @@ -1075,33 +1089,33 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new TypeArgumentContext(this.context, this.state); this.enterRule(localContext, 30, QuixosCapabilityParser.RULE_typeArgument); try { - this.state = 325; + this.state = 329; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 1); { - this.state = 318; + this.state = 322; this.match(QuixosCapabilityParser.ATOM); - this.state = 319; + this.state = 323; this.identifier(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 2); { - this.state = 320; + this.state = 324; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 321; + this.state = 325; this.interfaceType(); } break; case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 322; + this.state = 326; this.match(QuixosCapabilityParser.OBJECT); - this.state = 323; + this.state = 327; this.identifier(); } break; @@ -1142,7 +1156,7 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 4); { - this.state = 324; + this.state = 328; this.valueType(); } break; @@ -1170,25 +1184,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 327; + this.state = 331; this.match(QuixosCapabilityParser.TYPE); - this.state = 328; + this.state = 332; this.identifier(); - this.state = 330; + this.state = 334; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 124) { + if (_la === 133) { { - this.state = 329; + this.state = 333; this.typeParameters(); } } - this.state = 332; + this.state = 336; this.match(QuixosCapabilityParser.EQUAL); - this.state = 333; + this.state = 337; this.valueType(); - this.state = 334; + this.state = 338; this.match(QuixosCapabilityParser.SEMI); } } @@ -1209,27 +1223,27 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new InterfaceMemberContext(this.context, this.state); this.enterRule(localContext, 34, QuixosCapabilityParser.RULE_interfaceMember); try { - this.state = 339; + this.state = 343; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 21, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 336; + this.state = 340; this.valueMember(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 337; + this.state = 341; this.relationshipMember(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 338; + this.state = 342; this.operationMember(); } break; @@ -1255,43 +1269,53 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 342; + this.state = 346; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 40) { + if (_la === 49) { { - this.state = 341; + this.state = 345; this.match(QuixosCapabilityParser.STATIC); } } - this.state = 344; - this.match(QuixosCapabilityParser.OPERATION); - this.state = 345; - this.identifier(); - this.state = 346; - this.match(QuixosCapabilityParser.ID); - this.state = 347; - this.stringLiteral(); this.state = 348; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.OPERATION); this.state = 349; - this.valueType(); + this.identifier(); this.state = 350; - this.match(QuixosCapabilityParser.ARROW); - this.state = 351; - this.valueType(); - this.state = 352; - this.match(QuixosCapabilityParser.LBRACE); - this.state = 353; - this.match(QuixosCapabilityParser.CALL); - this.state = 354; this.match(QuixosCapabilityParser.ID); - this.state = 355; + this.state = 351; this.stringLiteral(); + this.state = 352; + this.match(QuixosCapabilityParser.COLON); + this.state = 353; + this.valueType(); + this.state = 354; + this.match(QuixosCapabilityParser.ARROW); + this.state = 355; + this.valueType(); this.state = 356; - this.match(QuixosCapabilityParser.SEMI); + this.match(QuixosCapabilityParser.LBRACE); this.state = 357; + this.match(QuixosCapabilityParser.CALL); + this.state = 358; + this.match(QuixosCapabilityParser.ID); + this.state = 359; + this.stringLiteral(); + this.state = 361; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 2) { + { + this.state = 360; + this.executionClause(); + } + } + + this.state = 363; + this.match(QuixosCapabilityParser.SEMI); + this.state = 364; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1315,45 +1339,45 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 360; + this.state = 367; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 15) { + if (_la === 24) { { - this.state = 359; + this.state = 366; this.queryReadContract(); } } - this.state = 362; + this.state = 369; this.match(QuixosCapabilityParser.VALUE); - this.state = 363; + this.state = 370; this.identifier(); - this.state = 364; + this.state = 371; this.match(QuixosCapabilityParser.ID); - this.state = 365; - this.stringLiteral(); - this.state = 366; - this.match(QuixosCapabilityParser.COLON); - this.state = 367; - this.valueType(); - this.state = 368; - this.match(QuixosCapabilityParser.LBRACE); this.state = 372; + this.stringLiteral(); + this.state = 373; + this.match(QuixosCapabilityParser.COLON); + this.state = 374; + this.valueType(); + this.state = 375; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 379; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 72)) & ~0x1F) === 0 && ((1 << (_la - 72)) & 7) !== 0)) { + while (((((_la - 81)) & ~0x1F) === 0 && ((1 << (_la - 81)) & 7) !== 0)) { { { - this.state = 369; + this.state = 376; this.valueMemberOperation(); } } - this.state = 374; + this.state = 381; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 375; + this.state = 382; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1373,54 +1397,75 @@ export class QuixosCapabilityParser extends antlr.Parser { public valueMemberOperation(): ValueMemberOperationContext { let localContext = new ValueMemberOperationContext(this.context, this.state); this.enterRule(localContext, 40, QuixosCapabilityParser.RULE_valueMemberOperation); + let _la: number; try { - this.state = 396; + this.state = 409; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.GET: this.enterOuterAlt(localContext, 1); { - this.state = 377; + this.state = 384; this.match(QuixosCapabilityParser.GET); - this.state = 378; + this.state = 385; this.match(QuixosCapabilityParser.ID); - this.state = 379; + this.state = 386; this.stringLiteral(); - this.state = 380; + this.state = 388; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 2) { + { + this.state = 387; + this.executionClause(); + } + } + + this.state = 390; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.SET: this.enterOuterAlt(localContext, 2); { - this.state = 382; + this.state = 392; this.match(QuixosCapabilityParser.SET); - this.state = 383; + this.state = 393; this.match(QuixosCapabilityParser.ID); - this.state = 384; + this.state = 394; this.stringLiteral(); - this.state = 385; + this.state = 396; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 2) { + { + this.state = 395; + this.executionClause(); + } + } + + this.state = 398; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 3); { - this.state = 387; + this.state = 400; this.match(QuixosCapabilityParser.WATCH); - this.state = 388; + this.state = 401; this.match(QuixosCapabilityParser.START); - this.state = 389; + this.state = 402; this.match(QuixosCapabilityParser.ID); - this.state = 390; + this.state = 403; this.stringLiteral(); - this.state = 391; + this.state = 404; this.match(QuixosCapabilityParser.STOP); - this.state = 392; + this.state = 405; this.match(QuixosCapabilityParser.ID); - this.state = 393; + this.state = 406; this.stringLiteral(); - this.state = 394; + this.state = 407; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1448,69 +1493,69 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 399; + this.state = 412; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 15) { + if (_la === 24) { { - this.state = 398; + this.state = 411; this.queryReadContract(); } } - this.state = 401; + this.state = 414; this.match(QuixosCapabilityParser.RELATION); - this.state = 402; + this.state = 415; this.identifier(); - this.state = 403; + this.state = 416; this.match(QuixosCapabilityParser.ID); - this.state = 404; + this.state = 417; this.stringLiteral(); - this.state = 405; + this.state = 418; this.match(QuixosCapabilityParser.COLON); - this.state = 406; + this.state = 419; this.cardinality(); - this.state = 407; + this.state = 420; this.targetConstraint(); - this.state = 409; + this.state = 422; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 93) { + if (_la === 102) { { - this.state = 408; + this.state = 421; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 413; + this.state = 426; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 63) { + if (_la === 72) { { - this.state = 411; + this.state = 424; this.match(QuixosCapabilityParser.KEYED); - this.state = 412; + this.state = 425; this.stringLiteral(); } } - this.state = 415; + this.state = 428; this.match(QuixosCapabilityParser.LBRACE); - this.state = 419; + this.state = 432; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 225) !== 0)) { + while (((((_la - 83)) & ~0x1F) === 0 && ((1 << (_la - 83)) & 225) !== 0)) { { { - this.state = 416; + this.state = 429; this.relationshipOperation(); } } - this.state = 421; + this.state = 434; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 422; + this.state = 435; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1534,15 +1579,22 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 424; + this.state = 437; this.match(QuixosCapabilityParser.QUERYABLE); - this.state = 426; + this.state = 439; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 16) { + if (_la === 7 || _la === 25) { { - this.state = 425; - this.match(QuixosCapabilityParser.RPC); + this.state = 438; + _la = this.tokenStream.LA(1); + if(!(_la === 7 || _la === 25)) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } } } @@ -1564,67 +1616,98 @@ export class QuixosCapabilityParser extends antlr.Parser { public relationshipOperation(): RelationshipOperationContext { let localContext = new RelationshipOperationContext(this.context, this.state); this.enterRule(localContext, 46, QuixosCapabilityParser.RULE_relationshipOperation); + let _la: number; try { - this.state = 452; + this.state = 474; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.RESOLVE: this.enterOuterAlt(localContext, 1); { - this.state = 428; + this.state = 441; this.match(QuixosCapabilityParser.RESOLVE); - this.state = 429; + this.state = 442; this.match(QuixosCapabilityParser.ID); - this.state = 430; + this.state = 443; this.stringLiteral(); - this.state = 431; + this.state = 445; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 2) { + { + this.state = 444; + this.executionClause(); + } + } + + this.state = 447; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONNECT: this.enterOuterAlt(localContext, 2); { - this.state = 433; + this.state = 449; this.match(QuixosCapabilityParser.CONNECT); - this.state = 434; + this.state = 450; this.match(QuixosCapabilityParser.ID); - this.state = 435; + this.state = 451; this.stringLiteral(); - this.state = 436; + this.state = 453; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 2) { + { + this.state = 452; + this.executionClause(); + } + } + + this.state = 455; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.DISCONNECT: this.enterOuterAlt(localContext, 3); { - this.state = 438; + this.state = 457; this.match(QuixosCapabilityParser.DISCONNECT); - this.state = 439; + this.state = 458; this.match(QuixosCapabilityParser.ID); - this.state = 440; + this.state = 459; this.stringLiteral(); - this.state = 441; + this.state = 461; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 2) { + { + this.state = 460; + this.executionClause(); + } + } + + this.state = 463; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 4); { - this.state = 443; + this.state = 465; this.match(QuixosCapabilityParser.WATCH); - this.state = 444; + this.state = 466; this.match(QuixosCapabilityParser.START); - this.state = 445; + this.state = 467; this.match(QuixosCapabilityParser.ID); - this.state = 446; + this.state = 468; this.stringLiteral(); - this.state = 447; + this.state = 469; this.match(QuixosCapabilityParser.STOP); - this.state = 448; + this.state = 470; this.match(QuixosCapabilityParser.ID); - this.state = 449; + this.state = 471; this.stringLiteral(); - this.state = 450; + this.state = 472; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1650,31 +1733,31 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 48, QuixosCapabilityParser.RULE_targetConstraint); let _la: number; try { - this.state = 463; + this.state = 485; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 1); { - this.state = 454; + this.state = 476; this.match(QuixosCapabilityParser.ATOM); - this.state = 455; + this.state = 477; this.identifier(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 2); { - this.state = 456; + this.state = 478; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 457; + this.state = 479; this.identifier(); - this.state = 459; + this.state = 481; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 124) { + if (_la === 133) { { - this.state = 458; + this.state = 480; this.typeArguments(); } } @@ -1684,9 +1767,9 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 461; + this.state = 483; this.match(QuixosCapabilityParser.OBJECT); - this.state = 462; + this.state = 484; this.identifier(); } break; @@ -1714,61 +1797,61 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 468; + this.state = 490; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 50593792) !== 0)) { + while (((((_la - 27)) & ~0x1F) === 0 && ((1 << (_la - 27)) & 193) !== 0)) { { { - this.state = 465; + this.state = 487; this.resourcePreamble(); } } - this.state = 470; + this.state = 492; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 471; + this.state = 493; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 472; + this.state = 494; this.identifier(); - this.state = 473; + this.state = 495; this.match(QuixosCapabilityParser.ID); - this.state = 474; + this.state = 496; this.stringLiteral(); - this.state = 475; + this.state = 497; this.match(QuixosCapabilityParser.REVISION); - this.state = 476; + this.state = 498; this.stringLiteral(); - this.state = 479; + this.state = 501; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 60) { + if (_la === 69) { { - this.state = 477; + this.state = 499; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); - this.state = 478; + this.state = 500; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 481; + this.state = 503; this.match(QuixosCapabilityParser.LBRACE); - this.state = 485; + this.state = 507; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 5)) & ~0x1F) === 0 && ((1 << (_la - 5)) & 939524097) !== 0)) { + while (((((_la - 14)) & ~0x1F) === 0 && ((1 << (_la - 14)) & 939524097) !== 0)) { { { - this.state = 482; + this.state = 504; this.packageExport(); } } - this.state = 487; + this.state = 509; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 488; + this.state = 510; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1789,41 +1872,41 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new PackageExportContext(this.context, this.state); this.enterRule(localContext, 52, QuixosCapabilityParser.RULE_packageExport); try { - this.state = 495; + this.state = 517; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 37, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 43, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 490; + this.state = 512; this.packageOperationExport(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 491; + this.state = 513; this.packageFunctionExport(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 492; + this.state = 514; this.packageConstructorExport(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 493; + this.state = 515; this.packageQuery(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 494; + this.state = 516; this.packageQuerySpecialization(); } break; @@ -1849,63 +1932,63 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 497; + this.state = 519; this.match(QuixosCapabilityParser.QUERY); - this.state = 498; + this.state = 520; this.identifier(); - this.state = 500; + this.state = 522; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 124) { + if (_la === 133) { { - this.state = 499; + this.state = 521; this.typeParameters(); } } - this.state = 502; + this.state = 524; this.match(QuixosCapabilityParser.ID); - this.state = 503; + this.state = 525; this.stringLiteral(); - this.state = 504; + this.state = 526; this.match(QuixosCapabilityParser.ROOT); - this.state = 506; + this.state = 528; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 1) { { - this.state = 505; + this.state = 527; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 508; + this.state = 530; this.interfaceType(); - this.state = 509; + this.state = 531; this.match(QuixosCapabilityParser.DOCUMENT); - this.state = 510; + this.state = 532; this.stringLiteral(); - this.state = 511; + this.state = 533; this.match(QuixosCapabilityParser.OPERATION); - this.state = 512; + this.state = 534; this.stringLiteral(); - this.state = 513; + this.state = 535; this.match(QuixosCapabilityParser.LBRACE); - this.state = 517; + this.state = 539; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 31744) !== 0) || _la === 74) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 16253696) !== 0) || _la === 83) { { { - this.state = 514; + this.state = 536; this.queryClause(); } } - this.state = 519; + this.state = 541; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 520; + this.state = 542; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1928,21 +2011,21 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 522; + this.state = 544; this.match(QuixosCapabilityParser.QUERY); - this.state = 523; + this.state = 545; this.identifier(); - this.state = 524; + this.state = 546; this.match(QuixosCapabilityParser.ID); - this.state = 525; + this.state = 547; this.stringLiteral(); - this.state = 526; + this.state = 548; this.match(QuixosCapabilityParser.SPECIALIZE); - this.state = 527; + this.state = 549; this.identifier(); - this.state = 528; + this.state = 550; this.typeArguments(); - this.state = 529; + this.state = 551; this.match(QuixosCapabilityParser.SEMI); } } @@ -1964,99 +2047,121 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 58, QuixosCapabilityParser.RULE_queryClause); let _la: number; try { - this.state = 564; + this.state = 593; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { - case QuixosCapabilityParser.FRAGMENTS: + case QuixosCapabilityParser.REPLICA: this.enterOuterAlt(localContext, 1); { - this.state = 531; - this.match(QuixosCapabilityParser.FRAGMENTS); - this.state = 532; - this.stringLiteral(); - this.state = 533; + this.state = 553; + this.match(QuixosCapabilityParser.REPLICA); + this.state = 554; this.match(QuixosCapabilityParser.SEMI); } break; - case QuixosCapabilityParser.VIEW: + case QuixosCapabilityParser.LOCAL: this.enterOuterAlt(localContext, 2); { - this.state = 535; - this.match(QuixosCapabilityParser.VIEW); - this.state = 537; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 19) { - { - this.state = 536; - this.match(QuixosCapabilityParser.OBJECT); - } - } - - this.state = 539; - this.identifier(); - this.state = 540; - this.match(QuixosCapabilityParser.AS); - this.state = 541; - this.interfaceType(); - this.state = 542; - this.match(QuixosCapabilityParser.SEMI); - } - break; - case QuixosCapabilityParser.MAX: - this.enterOuterAlt(localContext, 3); - { - this.state = 544; - this.match(QuixosCapabilityParser.MAX); - this.state = 545; - this.identifier(); - this.state = 546; - this.match(QuixosCapabilityParser.INTEGER); - this.state = 547; - this.match(QuixosCapabilityParser.SEMI); - } - break; - case QuixosCapabilityParser.ALLOW: - this.enterOuterAlt(localContext, 4); - { - this.state = 549; - this.match(QuixosCapabilityParser.ALLOW); - this.state = 550; - this.interfaceType(); - this.state = 551; - this.match(QuixosCapabilityParser.DOT); - this.state = 552; - this.identifier(); - this.state = 553; - this.identifier(); - this.state = 554; - this.stringLiteral(); this.state = 555; - this.match(QuixosCapabilityParser.SEMI); - } - break; - case QuixosCapabilityParser.WATCH: - this.enterOuterAlt(localContext, 5); - { + this.match(QuixosCapabilityParser.LOCAL); + this.state = 556; + this.match(QuixosCapabilityParser.FROM); this.state = 557; - this.match(QuixosCapabilityParser.WATCH); + this.identifier(); this.state = 558; this.match(QuixosCapabilityParser.SEMI); } break; - case QuixosCapabilityParser.POLL: - this.enterOuterAlt(localContext, 6); + case QuixosCapabilityParser.FRAGMENTS: + this.enterOuterAlt(localContext, 3); { - this.state = 559; - this.match(QuixosCapabilityParser.POLL); this.state = 560; - this.match(QuixosCapabilityParser.INTEGER); + this.match(QuixosCapabilityParser.FRAGMENTS); this.state = 561; this.stringLiteral(); this.state = 562; this.match(QuixosCapabilityParser.SEMI); } break; + case QuixosCapabilityParser.VIEW: + this.enterOuterAlt(localContext, 4); + { + this.state = 564; + this.match(QuixosCapabilityParser.VIEW); + this.state = 566; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 28) { + { + this.state = 565; + this.match(QuixosCapabilityParser.OBJECT); + } + } + + this.state = 568; + this.identifier(); + this.state = 569; + this.match(QuixosCapabilityParser.AS); + this.state = 570; + this.interfaceType(); + this.state = 571; + this.match(QuixosCapabilityParser.SEMI); + } + break; + case QuixosCapabilityParser.MAX: + this.enterOuterAlt(localContext, 5); + { + this.state = 573; + this.match(QuixosCapabilityParser.MAX); + this.state = 574; + this.identifier(); + this.state = 575; + this.match(QuixosCapabilityParser.INTEGER); + this.state = 576; + this.match(QuixosCapabilityParser.SEMI); + } + break; + case QuixosCapabilityParser.ALLOW: + this.enterOuterAlt(localContext, 6); + { + this.state = 578; + this.match(QuixosCapabilityParser.ALLOW); + this.state = 579; + this.interfaceType(); + this.state = 580; + this.match(QuixosCapabilityParser.DOT); + this.state = 581; + this.identifier(); + this.state = 582; + this.identifier(); + this.state = 583; + this.stringLiteral(); + this.state = 584; + this.match(QuixosCapabilityParser.SEMI); + } + break; + case QuixosCapabilityParser.WATCH: + this.enterOuterAlt(localContext, 7); + { + this.state = 586; + this.match(QuixosCapabilityParser.WATCH); + this.state = 587; + this.match(QuixosCapabilityParser.SEMI); + } + break; + case QuixosCapabilityParser.POLL: + this.enterOuterAlt(localContext, 8); + { + this.state = 588; + this.match(QuixosCapabilityParser.POLL); + this.state = 589; + this.match(QuixosCapabilityParser.INTEGER); + this.state = 590; + this.stringLiteral(); + this.state = 591; + this.match(QuixosCapabilityParser.SEMI); + } + break; default: throw new antlr.NoViableAltException(this); } @@ -2081,61 +2186,71 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 566; + this.state = 595; this.match(QuixosCapabilityParser.OPERATION); - this.state = 567; + this.state = 596; this.identifier(); - this.state = 569; + this.state = 598; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 124) { + if (_la === 133) { { - this.state = 568; + this.state = 597; this.typeParameters(); } } - this.state = 571; + this.state = 600; this.match(QuixosCapabilityParser.ID); - this.state = 572; + this.state = 601; this.stringLiteral(); - this.state = 573; + this.state = 602; this.match(QuixosCapabilityParser.COLON); - this.state = 574; + this.state = 603; this.valueType(); - this.state = 575; + this.state = 604; this.match(QuixosCapabilityParser.ARROW); - this.state = 576; + this.state = 605; this.valueType(); - this.state = 577; + this.state = 606; this.match(QuixosCapabilityParser.MODE); - this.state = 578; + this.state = 607; this.operationMode(); - this.state = 580; + this.state = 609; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 68) { + if (_la === 2) { { - this.state = 579; + this.state = 608; + this.executionClause(); + } + } + + this.state = 612; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 77) { + { + this.state = 611; this.eventClause(); } } - this.state = 582; + this.state = 614; this.match(QuixosCapabilityParser.RECEIVER); - this.state = 583; + this.state = 615; this.receiverRequirement(); - this.state = 585; + this.state = 617; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 70) { + if (_la === 79) { { - this.state = 584; + this.state = 616; this.dependencyBlock(); } } - this.state = 587; + this.state = 619; this.match(QuixosCapabilityParser.SEMI); } } @@ -2159,43 +2274,53 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 589; + this.state = 621; this.match(QuixosCapabilityParser.FUNCTION); - this.state = 590; + this.state = 622; this.identifier(); - this.state = 592; + this.state = 624; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 124) { + if (_la === 133) { { - this.state = 591; + this.state = 623; this.typeParameters(); } } - this.state = 594; + this.state = 626; this.match(QuixosCapabilityParser.ID); - this.state = 595; + this.state = 627; this.stringLiteral(); - this.state = 596; + this.state = 628; this.match(QuixosCapabilityParser.COLON); - this.state = 597; + this.state = 629; this.valueType(); - this.state = 598; + this.state = 630; this.match(QuixosCapabilityParser.ARROW); - this.state = 599; + this.state = 631; this.valueType(); - this.state = 601; + this.state = 633; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 70) { + if (_la === 2) { { - this.state = 600; + this.state = 632; + this.executionClause(); + } + } + + this.state = 636; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 79) { + { + this.state = 635; this.dependencyBlock(); } } - this.state = 603; + this.state = 638; this.match(QuixosCapabilityParser.SEMI); } } @@ -2212,40 +2337,142 @@ export class QuixosCapabilityParser extends antlr.Parser { } return localContext; } + public executionClause(): ExecutionClauseContext { + let localContext = new ExecutionClauseContext(this.context, this.state); + this.enterRule(localContext, 64, QuixosCapabilityParser.RULE_executionClause); + let _la: number; + try { + this.state = 649; + this.errorHandler.sync(this); + switch (this.interpreter.adaptivePredict(this.tokenStream, 56, this.context) ) { + case 1: + this.enterOuterAlt(localContext, 1); + { + this.state = 640; + this.match(QuixosCapabilityParser.EXECUTION); + this.state = 641; + this.match(QuixosCapabilityParser.REMOTE); + } + break; + case 2: + this.enterOuterAlt(localContext, 2); + { + this.state = 642; + this.match(QuixosCapabilityParser.EXECUTION); + this.state = 643; + _la = this.tokenStream.LA(1); + if(!(_la === 3 || _la === 4)) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + this.state = 644; + this.match(QuixosCapabilityParser.TARGETS); + this.state = 645; + this.match(QuixosCapabilityParser.LBRACK); + this.state = 646; + this.identifierList(); + this.state = 647; + this.match(QuixosCapabilityParser.RBRACK); + } + break; + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public selectedOperations(): SelectedOperationsContext { + let localContext = new SelectedOperationsContext(this.context, this.state); + this.enterRule(localContext, 66, QuixosCapabilityParser.RULE_selectedOperations); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 651; + this.match(QuixosCapabilityParser.USING); + this.state = 652; + this.match(QuixosCapabilityParser.LBRACK); + this.state = 653; + this.memberOperationRef(); + this.state = 658; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while (_la === 125) { + { + { + this.state = 654; + this.match(QuixosCapabilityParser.COMMA); + this.state = 655; + this.memberOperationRef(); + } + } + this.state = 660; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + this.state = 661; + this.match(QuixosCapabilityParser.RBRACK); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } public packageConstructorExport(): PackageConstructorExportContext { let localContext = new PackageConstructorExportContext(this.context, this.state); - this.enterRule(localContext, 64, QuixosCapabilityParser.RULE_packageConstructorExport); + this.enterRule(localContext, 68, QuixosCapabilityParser.RULE_packageConstructorExport); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 605; + this.state = 663; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 606; + this.state = 664; this.identifier(); - this.state = 607; + this.state = 665; this.match(QuixosCapabilityParser.ID); - this.state = 608; + this.state = 666; this.stringLiteral(); - this.state = 609; + this.state = 667; this.match(QuixosCapabilityParser.CONSTRUCTS); - this.state = 610; + this.state = 668; this.identifier(); - this.state = 611; + this.state = 669; this.match(QuixosCapabilityParser.COLON); - this.state = 612; + this.state = 670; this.valueType(); - this.state = 614; + this.state = 672; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 70) { + if (_la === 79) { { - this.state = 613; + this.state = 671; this.dependencyBlock(); } } - this.state = 616; + this.state = 674; this.match(QuixosCapabilityParser.SEMI); } } @@ -2264,13 +2491,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public eventClause(): EventClauseContext { let localContext = new EventClauseContext(this.context, this.state); - this.enterRule(localContext, 66, QuixosCapabilityParser.RULE_eventClause); + this.enterRule(localContext, 70, QuixosCapabilityParser.RULE_eventClause); try { this.enterOuterAlt(localContext, 1); { - this.state = 618; + this.state = 676; this.match(QuixosCapabilityParser.EMITS); - this.state = 619; + this.state = 677; this.valueType(); } } @@ -2289,14 +2516,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationMode(): OperationModeContext { let localContext = new OperationModeContext(this.context, this.state); - this.enterRule(localContext, 68, QuixosCapabilityParser.RULE_operationMode); + this.enterRule(localContext, 72, QuixosCapabilityParser.RULE_operationMode); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 621; + this.state = 679; _la = this.tokenStream.LA(1); - if(!(((((_la - 82)) & ~0x1F) === 0 && ((1 << (_la - 82)) & 31) !== 0))) { + if(!(((((_la - 91)) & ~0x1F) === 0 && ((1 << (_la - 91)) & 31) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2320,71 +2547,71 @@ export class QuixosCapabilityParser extends antlr.Parser { } public receiverRequirement(): ReceiverRequirementContext { let localContext = new ReceiverRequirementContext(this.context, this.state); - this.enterRule(localContext, 70, QuixosCapabilityParser.RULE_receiverRequirement); + this.enterRule(localContext, 74, QuixosCapabilityParser.RULE_receiverRequirement); let _la: number; try { - this.state = 641; + this.state = 699; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ANY: this.enterOuterAlt(localContext, 1); { - this.state = 623; + this.state = 681; this.match(QuixosCapabilityParser.ANY); } break; case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 2); { - this.state = 624; + this.state = 682; this.match(QuixosCapabilityParser.ATOM); - this.state = 625; + this.state = 683; this.identifier(); } break; case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 626; + this.state = 684; this.match(QuixosCapabilityParser.OBJECT); - this.state = 627; + this.state = 685; this.identifier(); } break; case QuixosCapabilityParser.INTERFACES: this.enterOuterAlt(localContext, 4); { - this.state = 628; + this.state = 686; this.match(QuixosCapabilityParser.INTERFACES); - this.state = 629; + this.state = 687; this.match(QuixosCapabilityParser.LBRACK); - this.state = 638; + this.state = 696; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 268566524) !== 0) || _la === 56 || _la === 130) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 67106816) !== 0) || _la === 37 || _la === 65 || _la === 139) { { - this.state = 630; + this.state = 688; this.interfaceType(); - this.state = 635; + this.state = 693; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 116) { + while (_la === 125) { { { - this.state = 631; + this.state = 689; this.match(QuixosCapabilityParser.COMMA); - this.state = 632; + this.state = 690; this.interfaceType(); } } - this.state = 637; + this.state = 695; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 640; + this.state = 698; this.match(QuixosCapabilityParser.RBRACK); } break; @@ -2407,26 +2634,26 @@ export class QuixosCapabilityParser extends antlr.Parser { } public identifierList(): IdentifierListContext { let localContext = new IdentifierListContext(this.context, this.state); - this.enterRule(localContext, 72, QuixosCapabilityParser.RULE_identifierList); + this.enterRule(localContext, 76, QuixosCapabilityParser.RULE_identifierList); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 643; + this.state = 701; this.identifier(); - this.state = 648; + this.state = 706; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 116) { + while (_la === 125) { { { - this.state = 644; + this.state = 702; this.match(QuixosCapabilityParser.COMMA); - this.state = 645; + this.state = 703; this.identifier(); } } - this.state = 650; + this.state = 708; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } @@ -2447,30 +2674,30 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBlock(): DependencyBlockContext { let localContext = new DependencyBlockContext(this.context, this.state); - this.enterRule(localContext, 74, QuixosCapabilityParser.RULE_dependencyBlock); + this.enterRule(localContext, 78, QuixosCapabilityParser.RULE_dependencyBlock); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 651; + this.state = 709; this.match(QuixosCapabilityParser.REQUIRES); - this.state = 652; + this.state = 710; this.match(QuixosCapabilityParser.LBRACE); - this.state = 656; + this.state = 714; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 134217824) !== 0) || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & 3073) !== 0)) { + while (_la === 14 || _la === 15 || ((((_la - 36)) & ~0x1F) === 0 && ((1 << (_la - 36)) & 393345) !== 0)) { { { - this.state = 653; + this.state = 711; this.dependencyPort(); } } - this.state = 658; + this.state = 716; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 659; + this.state = 717; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2489,157 +2716,167 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyPort(): DependencyPortContext { let localContext = new DependencyPortContext(this.context, this.state); - this.enterRule(localContext, 76, QuixosCapabilityParser.RULE_dependencyPort); + this.enterRule(localContext, 80, QuixosCapabilityParser.RULE_dependencyPort); let _la: number; try { - this.state = 722; + this.state = 783; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REFLECTION: this.enterOuterAlt(localContext, 1); { - this.state = 661; + this.state = 719; this.match(QuixosCapabilityParser.REFLECTION); - this.state = 662; + this.state = 720; this.identifier(); - this.state = 663; + this.state = 721; this.match(QuixosCapabilityParser.ID); - this.state = 664; + this.state = 722; this.stringLiteral(); - this.state = 665; + this.state = 723; this.match(QuixosCapabilityParser.LBRACK); - this.state = 666; + this.state = 724; this.identifierList(); - this.state = 667; + this.state = 725; this.match(QuixosCapabilityParser.RBRACK); - this.state = 668; + this.state = 726; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 2); { - this.state = 670; + this.state = 728; this.match(QuixosCapabilityParser.STATE); - this.state = 671; + this.state = 729; this.identifier(); - this.state = 672; + this.state = 730; this.match(QuixosCapabilityParser.ID); - this.state = 673; + this.state = 731; this.stringLiteral(); - this.state = 674; + this.state = 732; this.match(QuixosCapabilityParser.COLON); - this.state = 675; + this.state = 733; this.valueType(); - this.state = 676; + this.state = 734; this.primitiveList(); - this.state = 677; + this.state = 735; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 3); { - this.state = 679; + this.state = 737; this.match(QuixosCapabilityParser.EDGE); - this.state = 680; + this.state = 738; this.identifier(); - this.state = 681; + this.state = 739; this.match(QuixosCapabilityParser.ID); - this.state = 682; + this.state = 740; this.stringLiteral(); - this.state = 683; + this.state = 741; this.match(QuixosCapabilityParser.COLON); - this.state = 684; + this.state = 742; this.cardinality(); - this.state = 685; + this.state = 743; this.targetConstraint(); - this.state = 686; + this.state = 744; this.primitiveList(); - this.state = 687; + this.state = 745; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 4); { - this.state = 689; + this.state = 747; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 690; + this.state = 748; this.identifier(); - this.state = 691; + this.state = 749; this.match(QuixosCapabilityParser.ID); - this.state = 692; + this.state = 750; this.stringLiteral(); - this.state = 693; + this.state = 751; this.match(QuixosCapabilityParser.COLON); - this.state = 694; + this.state = 752; this.identifier(); - this.state = 696; + this.state = 754; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 124) { + if (_la === 133) { { - this.state = 695; + this.state = 753; this.typeArguments(); } } - this.state = 698; + this.state = 757; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 57) { + { + this.state = 756; + this.selectedOperations(); + } + } + + this.state = 759; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONSTRUCTOR: this.enterOuterAlt(localContext, 5); { - this.state = 700; + this.state = 761; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 701; + this.state = 762; this.identifier(); - this.state = 702; + this.state = 763; this.match(QuixosCapabilityParser.ID); - this.state = 703; + this.state = 764; this.stringLiteral(); - this.state = 704; + this.state = 765; this.match(QuixosCapabilityParser.COLON); - this.state = 705; + this.state = 766; this.identifier(); - this.state = 708; + this.state = 769; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 36) { + if (_la === 45) { { - this.state = 706; + this.state = 767; this.match(QuixosCapabilityParser.INPUT); - this.state = 707; + this.state = 768; this.valueType(); } } - this.state = 710; + this.state = 771; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.QUERY: this.enterOuterAlt(localContext, 6); { - this.state = 712; + this.state = 773; this.match(QuixosCapabilityParser.QUERY); - this.state = 713; + this.state = 774; this.identifier(); - this.state = 714; + this.state = 775; this.match(QuixosCapabilityParser.ID); - this.state = 715; + this.state = 776; this.stringLiteral(); - this.state = 716; + this.state = 777; this.match(QuixosCapabilityParser.COLON); - this.state = 717; + this.state = 778; this.identifier(); - this.state = 718; + this.state = 779; this.match(QuixosCapabilityParser.DOT); - this.state = 719; + this.state = 780; this.identifier(); - this.state = 720; + this.state = 781; this.match(QuixosCapabilityParser.SEMI); } break; @@ -2662,32 +2899,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public primitiveList(): PrimitiveListContext { let localContext = new PrimitiveListContext(this.context, this.state); - this.enterRule(localContext, 78, QuixosCapabilityParser.RULE_primitiveList); + this.enterRule(localContext, 82, QuixosCapabilityParser.RULE_primitiveList); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 724; + this.state = 785; this.match(QuixosCapabilityParser.LBRACK); - this.state = 725; + this.state = 786; this.primitive(); - this.state = 730; + this.state = 791; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 116) { + while (_la === 125) { { { - this.state = 726; + this.state = 787; this.match(QuixosCapabilityParser.COMMA); - this.state = 727; + this.state = 788; this.primitive(); } } - this.state = 732; + this.state = 793; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 733; + this.state = 794; this.match(QuixosCapabilityParser.RBRACK); } } @@ -2706,14 +2943,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public primitive(): PrimitiveContext { let localContext = new PrimitiveContext(this.context, this.state); - this.enterRule(localContext, 80, QuixosCapabilityParser.RULE_primitive); + this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_primitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 735; + this.state = 796; _la = this.tokenStream.LA(1); - if(!(((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 223) !== 0))) { + if(!(((((_la - 86)) & ~0x1F) === 0 && ((1 << (_la - 86)) & 223) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2737,13 +2974,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public sharedAttachmentDecl(): SharedAttachmentDeclContext { let localContext = new SharedAttachmentDeclContext(this.context, this.state); - this.enterRule(localContext, 82, QuixosCapabilityParser.RULE_sharedAttachmentDecl); + this.enterRule(localContext, 86, QuixosCapabilityParser.RULE_sharedAttachmentDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 737; + this.state = 798; this.match(QuixosCapabilityParser.SHARED); - this.state = 738; + this.state = 799; this.attachmentDecl(); } } @@ -2762,22 +2999,22 @@ export class QuixosCapabilityParser extends antlr.Parser { } public attachmentDecl(): AttachmentDeclContext { let localContext = new AttachmentDeclContext(this.context, this.state); - this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_attachmentDecl); + this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_attachmentDecl); try { - this.state = 742; + this.state = 803; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 740; + this.state = 801; this.stateDecl(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 741; + this.state = 802; this.edgeDecl(); } break; @@ -2800,44 +3037,44 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stateDecl(): StateDeclContext { let localContext = new StateDeclContext(this.context, this.state); - this.enterRule(localContext, 86, QuixosCapabilityParser.RULE_stateDecl); + this.enterRule(localContext, 90, QuixosCapabilityParser.RULE_stateDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 744; + this.state = 805; this.match(QuixosCapabilityParser.STATE); - this.state = 745; + this.state = 806; this.identifier(); - this.state = 746; + this.state = 807; this.match(QuixosCapabilityParser.ID); - this.state = 747; + this.state = 808; this.stringLiteral(); - this.state = 748; + this.state = 809; this.match(QuixosCapabilityParser.ON); - this.state = 749; + this.state = 810; this.identifier(); - this.state = 750; + this.state = 811; this.match(QuixosCapabilityParser.COLON); - this.state = 751; + this.state = 812; this.valueType(); - this.state = 752; + this.state = 813; this.match(QuixosCapabilityParser.POLICY); - this.state = 753; + this.state = 814; this.storagePolicy(); - this.state = 756; + this.state = 817; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 55) { + if (_la === 64) { { - this.state = 754; + this.state = 815; this.match(QuixosCapabilityParser.DEFAULT); - this.state = 755; + this.state = 816; this.jsonLiteral(); } } - this.state = 758; + this.state = 819; this.match(QuixosCapabilityParser.SEMI); } } @@ -2856,28 +3093,28 @@ export class QuixosCapabilityParser extends antlr.Parser { } public storagePolicy(): StoragePolicyContext { let localContext = new StoragePolicyContext(this.context, this.state); - this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_storagePolicy); + this.enterRule(localContext, 92, QuixosCapabilityParser.RULE_storagePolicy); try { - this.state = 766; + this.state = 827; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.OPTIMISTIC_REGISTER: this.enterOuterAlt(localContext, 1); { - this.state = 760; + this.state = 821; this.match(QuixosCapabilityParser.OPTIMISTIC_REGISTER); } break; case QuixosCapabilityParser.CRDT: this.enterOuterAlt(localContext, 2); { - this.state = 761; + this.state = 822; this.match(QuixosCapabilityParser.CRDT); - this.state = 762; + this.state = 823; this.match(QuixosCapabilityParser.LPAREN); - this.state = 763; + this.state = 824; this.valueType(); - this.state = 764; + this.state = 825; this.match(QuixosCapabilityParser.RPAREN); } break; @@ -2900,25 +3137,25 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgeDecl(): EdgeDeclContext { let localContext = new EdgeDeclContext(this.context, this.state); - this.enterRule(localContext, 90, QuixosCapabilityParser.RULE_edgeDecl); + this.enterRule(localContext, 94, QuixosCapabilityParser.RULE_edgeDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 768; + this.state = 829; this.match(QuixosCapabilityParser.EDGE); - this.state = 769; + this.state = 830; this.identifier(); - this.state = 770; + this.state = 831; this.match(QuixosCapabilityParser.ID); - this.state = 771; + this.state = 832; this.stringLiteral(); - this.state = 772; + this.state = 833; this.match(QuixosCapabilityParser.LBRACE); - this.state = 773; + this.state = 834; this.edgeEndpoint(); - this.state = 774; + this.state = 835; this.edgeEndpoint(); - this.state = 775; + this.state = 836; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2937,78 +3174,78 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgeEndpoint(): EdgeEndpointContext { let localContext = new EdgeEndpointContext(this.context, this.state); - this.enterRule(localContext, 92, QuixosCapabilityParser.RULE_edgeEndpoint); + this.enterRule(localContext, 96, QuixosCapabilityParser.RULE_edgeEndpoint); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 777; + this.state = 838; this.targetConstraint(); - this.state = 778; + this.state = 839; this.match(QuixosCapabilityParser.PROJECTION); - this.state = 779; + this.state = 840; this.identifier(); - this.state = 780; + this.state = 841; this.match(QuixosCapabilityParser.ID); - this.state = 781; + this.state = 842; this.stringLiteral(); - this.state = 782; + this.state = 843; this.cardinality(); - this.state = 784; + this.state = 845; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 93) { + if (_la === 102) { { - this.state = 783; + this.state = 844; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 788; + this.state = 849; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 61) { + if (_la === 70) { { - this.state = 786; + this.state = 847; this.match(QuixosCapabilityParser.ON_DELETE); - this.state = 787; + this.state = 848; this.stringLiteral(); } } - this.state = 791; + this.state = 852; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 62) { + if (_la === 71) { { - this.state = 790; + this.state = 851; this.match(QuixosCapabilityParser.RETAIN_OTHER); } } - this.state = 795; + this.state = 856; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 63) { + if (_la === 72) { { - this.state = 793; + this.state = 854; this.match(QuixosCapabilityParser.KEYED); - this.state = 794; + this.state = 855; this.stringLiteral(); } } - this.state = 798; + this.state = 859; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 64) { + if (_la === 73) { { - this.state = 797; + this.state = 858; this.match(QuixosCapabilityParser.PUBLIC_TRAVERSAL); } } - this.state = 800; + this.state = 861; this.match(QuixosCapabilityParser.SEMI); } } @@ -3027,70 +3264,70 @@ export class QuixosCapabilityParser extends antlr.Parser { } public conformanceDecl(): ConformanceDeclContext { let localContext = new ConformanceDeclContext(this.context, this.state); - this.enterRule(localContext, 94, QuixosCapabilityParser.RULE_conformanceDecl); + this.enterRule(localContext, 98, QuixosCapabilityParser.RULE_conformanceDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 802; + this.state = 863; this.match(QuixosCapabilityParser.CONFORM); - this.state = 803; + this.state = 864; this.identifier(); - this.state = 804; + this.state = 865; this.match(QuixosCapabilityParser.AS); - this.state = 805; + this.state = 866; this.identifier(); - this.state = 807; + this.state = 868; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 124) { + if (_la === 133) { { - this.state = 806; + this.state = 867; this.typeArguments(); } } - this.state = 811; + this.state = 872; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 65) { + if (_la === 74) { { - this.state = 809; + this.state = 870; this.match(QuixosCapabilityParser.ID); - this.state = 810; + this.state = 871; this.stringLiteral(); } } - this.state = 815; + this.state = 876; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 60) { + if (_la === 69) { { - this.state = 813; + this.state = 874; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); - this.state = 814; + this.state = 875; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 817; + this.state = 878; this.match(QuixosCapabilityParser.LBRACE); - this.state = 821; + this.state = 882; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 39)) & ~0x1F) === 0 && ((1 << (_la - 39)) & 2057) !== 0)) { + while (((((_la - 48)) & ~0x1F) === 0 && ((1 << (_la - 48)) & 2057) !== 0)) { { { - this.state = 818; + this.state = 879; this.conformanceItem(); } } - this.state = 823; + this.state = 884; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 824; + this.state = 885; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3109,38 +3346,38 @@ export class QuixosCapabilityParser extends antlr.Parser { } public conformanceItem(): ConformanceItemContext { let localContext = new ConformanceItemContext(this.context, this.state); - this.enterRule(localContext, 96, QuixosCapabilityParser.RULE_conformanceItem); + this.enterRule(localContext, 100, QuixosCapabilityParser.RULE_conformanceItem); try { - this.state = 831; + this.state = 892; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 70, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 81, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 826; + this.state = 887; this.match(QuixosCapabilityParser.PRIVATE); - this.state = 827; + this.state = 888; this.attachmentDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 828; + this.state = 889; this.operationBindingDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 829; + this.state = 890; this.stateFieldBindingDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 830; + this.state = 891; this.relationshipMaterializationDecl(); } break; @@ -3161,21 +3398,21 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stateFieldBindingDecl(): StateFieldBindingDeclContext { let localContext = new StateFieldBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 98, QuixosCapabilityParser.RULE_stateFieldBindingDecl); + this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_stateFieldBindingDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 833; + this.state = 894; this.match(QuixosCapabilityParser.BIND); - this.state = 834; + this.state = 895; this.identifier(); - this.state = 835; + this.state = 896; this.match(QuixosCapabilityParser.TO); - this.state = 836; + this.state = 897; this.match(QuixosCapabilityParser.STATE); - this.state = 837; + this.state = 898; this.identifier(); - this.state = 838; + this.state = 899; this.match(QuixosCapabilityParser.SEMI); } } @@ -3194,35 +3431,35 @@ export class QuixosCapabilityParser extends antlr.Parser { } public relationshipMaterializationDecl(): RelationshipMaterializationDeclContext { let localContext = new RelationshipMaterializationDeclContext(this.context, this.state); - this.enterRule(localContext, 100, QuixosCapabilityParser.RULE_relationshipMaterializationDecl); + this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_relationshipMaterializationDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 840; + this.state = 901; this.match(QuixosCapabilityParser.MATERIALIZE); - this.state = 841; + this.state = 902; this.identifier(); - this.state = 842; + this.state = 903; this.match(QuixosCapabilityParser.IF); - this.state = 843; + this.state = 904; this.match(QuixosCapabilityParser.ABSENT); - this.state = 844; + this.state = 905; this.match(QuixosCapabilityParser.USING); - this.state = 845; + this.state = 906; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 846; + this.state = 907; this.identifier(); - this.state = 847; + this.state = 908; this.match(QuixosCapabilityParser.VIA); - this.state = 848; + this.state = 909; this.match(QuixosCapabilityParser.EDGE); - this.state = 849; + this.state = 910; this.identifier(); - this.state = 850; + this.state = 911; this.match(QuixosCapabilityParser.DOT); - this.state = 851; + this.state = 912; this.identifier(); - this.state = 852; + this.state = 913; this.match(QuixosCapabilityParser.SEMI); } } @@ -3241,32 +3478,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationBindingDecl(): OperationBindingDeclContext { let localContext = new OperationBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_operationBindingDecl); + this.enterRule(localContext, 106, QuixosCapabilityParser.RULE_operationBindingDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 854; + this.state = 915; this.match(QuixosCapabilityParser.BIND); - this.state = 855; + this.state = 916; this.memberOperationRef(); - this.state = 856; + this.state = 917; this.match(QuixosCapabilityParser.TO); - this.state = 857; + this.state = 918; this.operationProvider(); - this.state = 860; + this.state = 921; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 17) { + if (_la === 26) { { - this.state = 858; + this.state = 919; this.match(QuixosCapabilityParser.QUERY_REASON); - this.state = 859; + this.state = 920; this.stringLiteral(); } } - this.state = 862; + this.state = 923; this.match(QuixosCapabilityParser.SEMI); } } @@ -3285,15 +3522,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public memberOperationRef(): MemberOperationRefContext { let localContext = new MemberOperationRefContext(this.context, this.state); - this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_memberOperationRef); + this.enterRule(localContext, 108, QuixosCapabilityParser.RULE_memberOperationRef); try { this.enterOuterAlt(localContext, 1); { - this.state = 864; + this.state = 925; this.identifier(); - this.state = 865; + this.state = 926; this.match(QuixosCapabilityParser.DOT); - this.state = 866; + this.state = 927; this.operationName(); } } @@ -3312,9 +3549,9 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationName(): OperationNameContext { let localContext = new OperationNameContext(this.context, this.state); - this.enterRule(localContext, 106, QuixosCapabilityParser.RULE_operationName); + this.enterRule(localContext, 110, QuixosCapabilityParser.RULE_operationName); try { - this.state = 879; + this.state = 940; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.RESULT_BYTES: @@ -3337,77 +3574,77 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 1); { - this.state = 868; + this.state = 929; this.identifier(); } break; case QuixosCapabilityParser.CALL: this.enterOuterAlt(localContext, 2); { - this.state = 869; + this.state = 930; this.match(QuixosCapabilityParser.CALL); } break; case QuixosCapabilityParser.GET: this.enterOuterAlt(localContext, 3); { - this.state = 870; + this.state = 931; this.match(QuixosCapabilityParser.GET); } break; case QuixosCapabilityParser.SET: this.enterOuterAlt(localContext, 4); { - this.state = 871; + this.state = 932; this.match(QuixosCapabilityParser.SET); } break; case QuixosCapabilityParser.RESOLVE: this.enterOuterAlt(localContext, 5); { - this.state = 872; + this.state = 933; this.match(QuixosCapabilityParser.RESOLVE); } break; case QuixosCapabilityParser.CONNECT: this.enterOuterAlt(localContext, 6); { - this.state = 873; + this.state = 934; this.match(QuixosCapabilityParser.CONNECT); } break; case QuixosCapabilityParser.DISCONNECT: this.enterOuterAlt(localContext, 7); { - this.state = 874; + this.state = 935; this.match(QuixosCapabilityParser.DISCONNECT); } break; case QuixosCapabilityParser.WATCH_START: this.enterOuterAlt(localContext, 8); { - this.state = 875; + this.state = 936; this.match(QuixosCapabilityParser.WATCH_START); } break; case QuixosCapabilityParser.WATCH_STOP: this.enterOuterAlt(localContext, 9); { - this.state = 876; + this.state = 937; this.match(QuixosCapabilityParser.WATCH_STOP); } break; case QuixosCapabilityParser.SUBSCRIBE: this.enterOuterAlt(localContext, 10); { - this.state = 877; + this.state = 938; this.match(QuixosCapabilityParser.SUBSCRIBE); } break; case QuixosCapabilityParser.UNSUBSCRIBE: this.enterOuterAlt(localContext, 11); { - this.state = 878; + this.state = 939; this.match(QuixosCapabilityParser.UNSUBSCRIBE); } break; @@ -3430,92 +3667,92 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationProvider(): OperationProviderContext { let localContext = new OperationProviderContext(this.context, this.state); - this.enterRule(localContext, 108, QuixosCapabilityParser.RULE_operationProvider); + this.enterRule(localContext, 112, QuixosCapabilityParser.RULE_operationProvider); let _la: number; try { - this.state = 911; + this.state = 972; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 881; + this.state = 942; this.match(QuixosCapabilityParser.STATE); - this.state = 882; + this.state = 943; this.identifier(); - this.state = 883; + this.state = 944; this.match(QuixosCapabilityParser.DOT); - this.state = 884; + this.state = 945; this.statePrimitive(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 886; + this.state = 947; this.match(QuixosCapabilityParser.EDGE); - this.state = 887; + this.state = 948; this.identifier(); - this.state = 888; + this.state = 949; this.match(QuixosCapabilityParser.DOT); - this.state = 889; + this.state = 950; this.identifier(); - this.state = 890; + this.state = 951; this.match(QuixosCapabilityParser.DOT); - this.state = 891; + this.state = 952; this.edgePrimitive(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 3); { - this.state = 893; + this.state = 954; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 894; + this.state = 955; this.identifier(); - this.state = 896; + this.state = 957; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 124) { + if (_la === 133) { { - this.state = 895; + this.state = 956; this.typeArguments(); } } - this.state = 898; + this.state = 959; this.match(QuixosCapabilityParser.DOT); - this.state = 899; + this.state = 960; this.memberOperationRef(); } break; case QuixosCapabilityParser.PACKAGE: this.enterOuterAlt(localContext, 4); { - this.state = 901; + this.state = 962; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 902; + this.state = 963; this.identifier(); - this.state = 903; + this.state = 964; this.match(QuixosCapabilityParser.DOT); - this.state = 904; + this.state = 965; this.identifier(); - this.state = 906; + this.state = 967; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 124) { + if (_la === 133) { { - this.state = 905; + this.state = 966; this.typeArguments(); } } - this.state = 909; + this.state = 970; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 47) { + if (_la === 56) { { - this.state = 908; + this.state = 969; this.dependencyBindingBlock(); } } @@ -3541,14 +3778,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public statePrimitive(): StatePrimitiveContext { let localContext = new StatePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 110, QuixosCapabilityParser.RULE_statePrimitive); + this.enterRule(localContext, 114, QuixosCapabilityParser.RULE_statePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 913; + this.state = 974; _la = this.tokenStream.LA(1); - if(!(((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 195) !== 0))) { + if(!(((((_la - 86)) & ~0x1F) === 0 && ((1 << (_la - 86)) & 195) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -3572,14 +3809,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgePrimitive(): EdgePrimitiveContext { let localContext = new EdgePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 112, QuixosCapabilityParser.RULE_edgePrimitive); + this.enterRule(localContext, 116, QuixosCapabilityParser.RULE_edgePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 915; + this.state = 976; _la = this.tokenStream.LA(1); - if(!(((((_la - 79)) & ~0x1F) === 0 && ((1 << (_la - 79)) & 55) !== 0))) { + if(!(((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 55) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -3603,30 +3840,30 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBindingBlock(): DependencyBindingBlockContext { let localContext = new DependencyBindingBlockContext(this.context, this.state); - this.enterRule(localContext, 114, QuixosCapabilityParser.RULE_dependencyBindingBlock); + this.enterRule(localContext, 118, QuixosCapabilityParser.RULE_dependencyBindingBlock); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 917; + this.state = 978; this.match(QuixosCapabilityParser.WITH); - this.state = 918; + this.state = 979; this.match(QuixosCapabilityParser.LBRACE); - this.state = 922; + this.state = 983; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 268566524) !== 0) || _la === 56 || _la === 130) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 67106816) !== 0) || _la === 37 || _la === 65 || _la === 139) { { { - this.state = 919; + this.state = 980; this.dependencyBinding(); } } - this.state = 924; + this.state = 985; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 925; + this.state = 986; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3645,205 +3882,205 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBinding(): DependencyBindingContext { let localContext = new DependencyBindingContext(this.context, this.state); - this.enterRule(localContext, 116, QuixosCapabilityParser.RULE_dependencyBinding); + this.enterRule(localContext, 120, QuixosCapabilityParser.RULE_dependencyBinding); let _la: number; try { - this.state = 1008; + this.state = 1069; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 84, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 95, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 927; + this.state = 988; this.identifier(); - this.state = 928; + this.state = 989; this.match(QuixosCapabilityParser.TO); - this.state = 929; + this.state = 990; this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 930; + this.state = 991; this.match(QuixosCapabilityParser.REFLECTION); - this.state = 931; + this.state = 992; this.match(QuixosCapabilityParser.LBRACK); - this.state = 932; + this.state = 993; this.identifierList(); - this.state = 933; + this.state = 994; this.match(QuixosCapabilityParser.RBRACK); - this.state = 934; + this.state = 995; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 936; + this.state = 997; this.identifier(); - this.state = 937; + this.state = 998; this.match(QuixosCapabilityParser.TO); - this.state = 938; + this.state = 999; this.match(QuixosCapabilityParser.STATE); - this.state = 939; + this.state = 1000; this.identifier(); - this.state = 946; + this.state = 1007; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 49) { + if (_la === 58) { { - this.state = 940; + this.state = 1001; this.match(QuixosCapabilityParser.VIA); - this.state = 941; + this.state = 1002; this.match(QuixosCapabilityParser.EDGE); - this.state = 942; + this.state = 1003; this.identifier(); - this.state = 943; + this.state = 1004; this.match(QuixosCapabilityParser.DOT); - this.state = 944; + this.state = 1005; this.identifier(); } } - this.state = 948; + this.state = 1009; this.match(QuixosCapabilityParser.SEMI); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 950; + this.state = 1011; this.identifier(); - this.state = 951; + this.state = 1012; this.match(QuixosCapabilityParser.TO); - this.state = 952; + this.state = 1013; this.match(QuixosCapabilityParser.EDGE); - this.state = 953; + this.state = 1014; this.identifier(); - this.state = 954; + this.state = 1015; this.match(QuixosCapabilityParser.DOT); - this.state = 955; + this.state = 1016; this.identifier(); - this.state = 962; + this.state = 1023; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 49) { + if (_la === 58) { { - this.state = 956; + this.state = 1017; this.match(QuixosCapabilityParser.VIA); - this.state = 957; + this.state = 1018; this.match(QuixosCapabilityParser.EDGE); - this.state = 958; + this.state = 1019; this.identifier(); - this.state = 959; + this.state = 1020; this.match(QuixosCapabilityParser.DOT); - this.state = 960; + this.state = 1021; this.identifier(); } } - this.state = 964; + this.state = 1025; this.match(QuixosCapabilityParser.SEMI); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 966; + this.state = 1027; this.identifier(); - this.state = 967; + this.state = 1028; this.match(QuixosCapabilityParser.TO); - this.state = 968; + this.state = 1029; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 969; + this.state = 1030; this.identifier(); - this.state = 971; + this.state = 1032; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 124) { + if (_la === 133) { { - this.state = 970; + this.state = 1031; this.typeArguments(); } } - this.state = 979; + this.state = 1040; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 49) { + if (_la === 58) { { - this.state = 973; + this.state = 1034; this.match(QuixosCapabilityParser.VIA); - this.state = 974; + this.state = 1035; this.match(QuixosCapabilityParser.EDGE); - this.state = 975; + this.state = 1036; this.identifier(); - this.state = 976; + this.state = 1037; this.match(QuixosCapabilityParser.DOT); - this.state = 977; + this.state = 1038; this.identifier(); } } - this.state = 981; + this.state = 1042; this.match(QuixosCapabilityParser.SEMI); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 983; + this.state = 1044; this.identifier(); - this.state = 984; + this.state = 1045; this.match(QuixosCapabilityParser.TO); - this.state = 985; + this.state = 1046; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 986; + this.state = 1047; this.identifier(); - this.state = 987; + this.state = 1048; this.match(QuixosCapabilityParser.SEMI); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 989; + this.state = 1050; this.identifier(); - this.state = 990; + this.state = 1051; this.match(QuixosCapabilityParser.TO); - this.state = 992; + this.state = 1053; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 1) { { - this.state = 991; + this.state = 1052; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 994; + this.state = 1055; this.match(QuixosCapabilityParser.QUERY); - this.state = 995; + this.state = 1056; this.identifier(); - this.state = 996; + this.state = 1057; this.match(QuixosCapabilityParser.DOT); - this.state = 997; + this.state = 1058; this.identifier(); - this.state = 1004; + this.state = 1065; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 49) { + if (_la === 58) { { - this.state = 998; + this.state = 1059; this.match(QuixosCapabilityParser.VIA); - this.state = 999; + this.state = 1060; this.match(QuixosCapabilityParser.EDGE); - this.state = 1000; + this.state = 1061; this.identifier(); - this.state = 1001; + this.state = 1062; this.match(QuixosCapabilityParser.DOT); - this.state = 1002; + this.state = 1063; this.identifier(); } } - this.state = 1006; + this.state = 1067; this.match(QuixosCapabilityParser.SEMI); } break; @@ -3864,34 +4101,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public constructorBindingDecl(): ConstructorBindingDeclContext { let localContext = new ConstructorBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 118, QuixosCapabilityParser.RULE_constructorBindingDecl); + this.enterRule(localContext, 122, QuixosCapabilityParser.RULE_constructorBindingDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1010; + this.state = 1071; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1011; + this.state = 1072; this.identifier(); - this.state = 1012; + this.state = 1073; this.match(QuixosCapabilityParser.TO); - this.state = 1013; + this.state = 1074; this.identifier(); - this.state = 1014; + this.state = 1075; this.match(QuixosCapabilityParser.DOT); - this.state = 1015; + this.state = 1076; this.identifier(); - this.state = 1017; + this.state = 1078; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 47) { + if (_la === 56) { { - this.state = 1016; + this.state = 1077; this.dependencyBindingBlock(); } } - this.state = 1019; + this.state = 1080; this.match(QuixosCapabilityParser.SEMI); } } @@ -3910,10 +4147,10 @@ export class QuixosCapabilityParser extends antlr.Parser { } public valueType(): ValueTypeContext { let localContext = new ValueTypeContext(this.context, this.state); - this.enterRule(localContext, 120, QuixosCapabilityParser.RULE_valueType); + this.enterRule(localContext, 124, QuixosCapabilityParser.RULE_valueType); let _la: number; try { - this.state = 1067; + this.state = 1128; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.BOOL: @@ -3926,130 +4163,130 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.UINT64: this.enterOuterAlt(localContext, 1); { - this.state = 1021; + this.state = 1082; this.scalarType(); } break; case QuixosCapabilityParser.UNIT: this.enterOuterAlt(localContext, 2); { - this.state = 1022; + this.state = 1083; this.match(QuixosCapabilityParser.UNIT); } break; case QuixosCapabilityParser.WATCH_HANDLE: this.enterOuterAlt(localContext, 3); { - this.state = 1023; + this.state = 1084; this.match(QuixosCapabilityParser.WATCH_HANDLE); } break; case QuixosCapabilityParser.MESSAGE: this.enterOuterAlt(localContext, 4); { - this.state = 1024; + this.state = 1085; this.match(QuixosCapabilityParser.MESSAGE); - this.state = 1025; + this.state = 1086; this.stringLiteral(); } break; case QuixosCapabilityParser.ATOM_REF: this.enterOuterAlt(localContext, 5); { - this.state = 1026; + this.state = 1087; this.match(QuixosCapabilityParser.ATOM_REF); - this.state = 1027; + this.state = 1088; this.match(QuixosCapabilityParser.LT); - this.state = 1028; + this.state = 1089; this.identifier(); - this.state = 1029; + this.state = 1090; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.INTERFACE_REF: this.enterOuterAlt(localContext, 6); { - this.state = 1031; + this.state = 1092; this.match(QuixosCapabilityParser.INTERFACE_REF); - this.state = 1032; + this.state = 1093; this.match(QuixosCapabilityParser.LT); - this.state = 1033; + this.state = 1094; this.identifier(); - this.state = 1035; + this.state = 1096; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 124) { + if (_la === 133) { { - this.state = 1034; + this.state = 1095; this.typeArguments(); } } - this.state = 1037; + this.state = 1098; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.REF: this.enterOuterAlt(localContext, 7); { - this.state = 1039; + this.state = 1100; this.match(QuixosCapabilityParser.REF); - this.state = 1040; + this.state = 1101; this.match(QuixosCapabilityParser.LT); - this.state = 1041; + this.state = 1102; this.identifier(); - this.state = 1042; + this.state = 1103; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.OPTIONAL: this.enterOuterAlt(localContext, 8); { - this.state = 1044; + this.state = 1105; this.match(QuixosCapabilityParser.OPTIONAL); - this.state = 1045; + this.state = 1106; this.match(QuixosCapabilityParser.LT); - this.state = 1046; + this.state = 1107; this.valueType(); - this.state = 1047; + this.state = 1108; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.LIST: this.enterOuterAlt(localContext, 9); { - this.state = 1049; + this.state = 1110; this.match(QuixosCapabilityParser.LIST); - this.state = 1050; + this.state = 1111; this.match(QuixosCapabilityParser.LT); - this.state = 1051; + this.state = 1112; this.valueType(); - this.state = 1052; + this.state = 1113; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.RECORD: this.enterOuterAlt(localContext, 10); { - this.state = 1054; + this.state = 1115; this.match(QuixosCapabilityParser.RECORD); - this.state = 1055; + this.state = 1116; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1059; + this.state = 1120; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 268566524) !== 0) || _la === 56 || _la === 130) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 67106816) !== 0) || _la === 37 || _la === 65 || _la === 139) { { { - this.state = 1056; + this.state = 1117; this.recordField(); } } - this.state = 1061; + this.state = 1122; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1062; + this.state = 1123; this.match(QuixosCapabilityParser.RBRACE); } break; @@ -4073,14 +4310,14 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 11); { - this.state = 1063; + this.state = 1124; this.identifier(); - this.state = 1065; + this.state = 1126; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 124) { + if (_la === 133) { { - this.state = 1064; + this.state = 1125; this.typeArguments(); } } @@ -4106,17 +4343,17 @@ export class QuixosCapabilityParser extends antlr.Parser { } public recordField(): RecordFieldContext { let localContext = new RecordFieldContext(this.context, this.state); - this.enterRule(localContext, 122, QuixosCapabilityParser.RULE_recordField); + this.enterRule(localContext, 126, QuixosCapabilityParser.RULE_recordField); try { this.enterOuterAlt(localContext, 1); { - this.state = 1069; + this.state = 1130; this.identifier(); - this.state = 1070; + this.state = 1131; this.match(QuixosCapabilityParser.COLON); - this.state = 1071; + this.state = 1132; this.valueType(); - this.state = 1072; + this.state = 1133; this.match(QuixosCapabilityParser.SEMI); } } @@ -4135,14 +4372,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public scalarType(): ScalarTypeContext { let localContext = new ScalarTypeContext(this.context, this.state); - this.enterRule(localContext, 124, QuixosCapabilityParser.RULE_scalarType); + this.enterRule(localContext, 128, QuixosCapabilityParser.RULE_scalarType); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1074; + this.state = 1135; _la = this.tokenStream.LA(1); - if(!(((((_la - 102)) & ~0x1F) === 0 && ((1 << (_la - 102)) & 255) !== 0))) { + if(!(((((_la - 111)) & ~0x1F) === 0 && ((1 << (_la - 111)) & 255) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4166,14 +4403,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public cardinality(): CardinalityContext { let localContext = new CardinalityContext(this.context, this.state); - this.enterRule(localContext, 126, QuixosCapabilityParser.RULE_cardinality); + this.enterRule(localContext, 130, QuixosCapabilityParser.RULE_cardinality); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1076; + this.state = 1137; _la = this.tokenStream.LA(1); - if(!(((((_la - 89)) & ~0x1F) === 0 && ((1 << (_la - 89)) & 15) !== 0))) { + if(!(((((_la - 98)) & ~0x1F) === 0 && ((1 << (_la - 98)) & 15) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4197,64 +4434,64 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonLiteral(): JsonLiteralContext { let localContext = new JsonLiteralContext(this.context, this.state); - this.enterRule(localContext, 128, QuixosCapabilityParser.RULE_jsonLiteral); + this.enterRule(localContext, 132, QuixosCapabilityParser.RULE_jsonLiteral); try { - this.state = 1086; + this.state = 1147; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STRING_LITERAL: this.enterOuterAlt(localContext, 1); { - this.state = 1078; + this.state = 1139; this.stringLiteral(); } break; case QuixosCapabilityParser.INTEGER: this.enterOuterAlt(localContext, 2); { - this.state = 1079; + this.state = 1140; this.match(QuixosCapabilityParser.INTEGER); } break; case QuixosCapabilityParser.JSON_NUMBER: this.enterOuterAlt(localContext, 3); { - this.state = 1080; + this.state = 1141; this.match(QuixosCapabilityParser.JSON_NUMBER); } break; case QuixosCapabilityParser.TRUE: this.enterOuterAlt(localContext, 4); { - this.state = 1081; + this.state = 1142; this.match(QuixosCapabilityParser.TRUE); } break; case QuixosCapabilityParser.FALSE: this.enterOuterAlt(localContext, 5); { - this.state = 1082; + this.state = 1143; this.match(QuixosCapabilityParser.FALSE); } break; case QuixosCapabilityParser.NULL: this.enterOuterAlt(localContext, 6); { - this.state = 1083; + this.state = 1144; this.match(QuixosCapabilityParser.NULL); } break; case QuixosCapabilityParser.LBRACE: this.enterOuterAlt(localContext, 7); { - this.state = 1084; + this.state = 1145; this.jsonObject(); } break; case QuixosCapabilityParser.LBRACK: this.enterOuterAlt(localContext, 8); { - this.state = 1085; + this.state = 1146; this.jsonArray(); } break; @@ -4277,40 +4514,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonObject(): JsonObjectContext { let localContext = new JsonObjectContext(this.context, this.state); - this.enterRule(localContext, 130, QuixosCapabilityParser.RULE_jsonObject); + this.enterRule(localContext, 134, QuixosCapabilityParser.RULE_jsonObject); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1088; + this.state = 1149; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1097; + this.state = 1158; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 131) { + if (_la === 140) { { - this.state = 1089; + this.state = 1150; this.jsonMember(); - this.state = 1094; + this.state = 1155; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 116) { + while (_la === 125) { { { - this.state = 1090; + this.state = 1151; this.match(QuixosCapabilityParser.COMMA); - this.state = 1091; + this.state = 1152; this.jsonMember(); } } - this.state = 1096; + this.state = 1157; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1099; + this.state = 1160; this.match(QuixosCapabilityParser.RBRACE); } } @@ -4329,15 +4566,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonMember(): JsonMemberContext { let localContext = new JsonMemberContext(this.context, this.state); - this.enterRule(localContext, 132, QuixosCapabilityParser.RULE_jsonMember); + this.enterRule(localContext, 136, QuixosCapabilityParser.RULE_jsonMember); try { this.enterOuterAlt(localContext, 1); { - this.state = 1101; + this.state = 1162; this.stringLiteral(); - this.state = 1102; + this.state = 1163; this.match(QuixosCapabilityParser.COLON); - this.state = 1103; + this.state = 1164; this.jsonLiteral(); } } @@ -4356,40 +4593,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonArray(): JsonArrayContext { let localContext = new JsonArrayContext(this.context, this.state); - this.enterRule(localContext, 134, QuixosCapabilityParser.RULE_jsonArray); + this.enterRule(localContext, 138, QuixosCapabilityParser.RULE_jsonArray); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1105; + this.state = 1166; this.match(QuixosCapabilityParser.LBRACK); - this.state = 1114; + this.state = 1175; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (((((_la - 110)) & ~0x1F) === 0 && ((1 << (_la - 110)) & 2884871) !== 0)) { + if (((((_la - 119)) & ~0x1F) === 0 && ((1 << (_la - 119)) & 2884871) !== 0)) { { - this.state = 1106; + this.state = 1167; this.jsonLiteral(); - this.state = 1111; + this.state = 1172; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 116) { + while (_la === 125) { { { - this.state = 1107; + this.state = 1168; this.match(QuixosCapabilityParser.COMMA); - this.state = 1108; + this.state = 1169; this.jsonLiteral(); } } - this.state = 1113; + this.state = 1174; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1116; + this.state = 1177; this.match(QuixosCapabilityParser.RBRACK); } } @@ -4408,14 +4645,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public identifier(): IdentifierContext { let localContext = new IdentifierContext(this.context, this.state); - this.enterRule(localContext, 136, QuixosCapabilityParser.RULE_identifier); + this.enterRule(localContext, 140, QuixosCapabilityParser.RULE_identifier); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1118; + this.state = 1179; _la = this.tokenStream.LA(1); - if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 268566524) !== 0) || _la === 56 || _la === 130)) { + if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 67106816) !== 0) || _la === 37 || _la === 65 || _la === 139)) { this.errorHandler.recoverInline(this); } else { @@ -4439,11 +4676,11 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stringLiteral(): StringLiteralContext { let localContext = new StringLiteralContext(this.context, this.state); - this.enterRule(localContext, 138, QuixosCapabilityParser.RULE_stringLiteral); + this.enterRule(localContext, 142, QuixosCapabilityParser.RULE_stringLiteral); try { this.enterOuterAlt(localContext, 1); { - this.state = 1120; + this.state = 1181; this.match(QuixosCapabilityParser.STRING_LITERAL); } } @@ -4462,7 +4699,7 @@ export class QuixosCapabilityParser extends antlr.Parser { } public static readonly _serializedATN: number[] = [ - 4,1,134,1123,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,143,1184,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, @@ -4472,420 +4709,447 @@ export class QuixosCapabilityParser extends antlr.Parser { 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,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,153,8,0,1,1,1,1,1,1,5,1,158,8,1,10, - 1,12,1,161,9,1,1,1,1,1,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1, - 3,1,3,1,3,1,3,5,3,179,8,3,10,3,12,3,182,9,3,1,3,1,3,1,4,1,4,1,4, - 1,4,1,4,1,4,1,4,3,4,193,8,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5, - 1,5,3,5,205,8,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7, - 1,7,1,7,1,8,1,8,1,8,1,8,3,8,225,8,8,1,9,1,9,1,9,1,9,1,9,1,9,3,9, - 233,8,9,1,9,1,9,1,10,5,10,238,8,10,10,10,12,10,241,9,10,1,10,1,10, - 1,10,3,10,246,8,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,5,10, - 256,8,10,10,10,12,10,259,9,10,3,10,261,8,10,1,10,1,10,5,10,265,8, - 10,10,10,12,10,268,9,10,1,10,1,10,1,11,1,11,1,11,1,11,5,11,276,8, - 11,10,11,12,11,279,9,11,1,11,1,11,1,12,1,12,1,12,1,12,3,12,287,8, - 12,1,12,1,12,1,12,1,12,1,12,1,12,5,12,295,8,12,10,12,12,12,298,9, - 12,3,12,300,8,12,3,12,302,8,12,1,13,1,13,3,13,306,8,13,1,14,1,14, - 1,14,1,14,5,14,312,8,14,10,14,12,14,315,9,14,1,14,1,14,1,15,1,15, - 1,15,1,15,1,15,1,15,1,15,3,15,326,8,15,1,16,1,16,1,16,3,16,331,8, - 16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,3,17,340,8,17,1,18,3,18,343, - 8,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18, - 1,18,1,18,1,18,1,19,3,19,361,8,19,1,19,1,19,1,19,1,19,1,19,1,19, - 1,19,1,19,5,19,371,8,19,10,19,12,19,374,9,19,1,19,1,19,1,20,1,20, - 1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20, - 1,20,1,20,1,20,1,20,3,20,397,8,20,1,21,3,21,400,8,21,1,21,1,21,1, - 21,1,21,1,21,1,21,1,21,1,21,3,21,410,8,21,1,21,1,21,3,21,414,8,21, - 1,21,1,21,5,21,418,8,21,10,21,12,21,421,9,21,1,21,1,21,1,22,1,22, - 3,22,427,8,22,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23, - 1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23, - 1,23,3,23,453,8,23,1,24,1,24,1,24,1,24,1,24,3,24,460,8,24,1,24,1, - 24,3,24,464,8,24,1,25,5,25,467,8,25,10,25,12,25,470,9,25,1,25,1, - 25,1,25,1,25,1,25,1,25,1,25,1,25,3,25,480,8,25,1,25,1,25,5,25,484, - 8,25,10,25,12,25,487,9,25,1,25,1,25,1,26,1,26,1,26,1,26,1,26,3,26, - 496,8,26,1,27,1,27,1,27,3,27,501,8,27,1,27,1,27,1,27,1,27,3,27,507, - 8,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,5,27,516,8,27,10,27,12,27, - 519,9,27,1,27,1,27,1,28,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,3,29,538,8,29,1,29,1,29,1,29,1,29, + 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,1, + 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,157,8,0,1,1,1, + 1,1,1,5,1,162,8,1,10,1,12,1,165,9,1,1,1,1,1,1,2,1,2,1,2,1,2,1,3, + 1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,5,3,183,8,3,10,3,12,3,186,9, + 3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,3,4,197,8,4,1,5,1,5,1,5,1, + 5,1,5,1,5,1,5,1,5,1,5,1,5,3,5,209,8,5,1,6,1,6,1,6,1,6,1,6,1,6,1, + 6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,3,8,229,8,8,1,9,1, + 9,1,9,1,9,1,9,1,9,3,9,237,8,9,1,9,1,9,1,10,5,10,242,8,10,10,10,12, + 10,245,9,10,1,10,1,10,1,10,3,10,250,8,10,1,10,1,10,1,10,1,10,1,10, + 1,10,1,10,1,10,5,10,260,8,10,10,10,12,10,263,9,10,3,10,265,8,10, + 1,10,1,10,5,10,269,8,10,10,10,12,10,272,9,10,1,10,1,10,1,11,1,11, + 1,11,1,11,5,11,280,8,11,10,11,12,11,283,9,11,1,11,1,11,1,12,1,12, + 1,12,1,12,3,12,291,8,12,1,12,1,12,1,12,1,12,1,12,1,12,5,12,299,8, + 12,10,12,12,12,302,9,12,3,12,304,8,12,3,12,306,8,12,1,13,1,13,3, + 13,310,8,13,1,14,1,14,1,14,1,14,5,14,316,8,14,10,14,12,14,319,9, + 14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,3,15,330,8,15,1, + 16,1,16,1,16,3,16,335,8,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,3, + 17,344,8,17,1,18,3,18,347,8,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18, + 1,18,1,18,1,18,1,18,1,18,1,18,3,18,362,8,18,1,18,1,18,1,18,1,19, + 3,19,368,8,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,5,19,378,8, + 19,10,19,12,19,381,9,19,1,19,1,19,1,20,1,20,1,20,1,20,3,20,389,8, + 20,1,20,1,20,1,20,1,20,1,20,1,20,3,20,397,8,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,3,20,410,8,20,1,21,3,21,413, + 8,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,3,21,423,8,21,1,21, + 1,21,3,21,427,8,21,1,21,1,21,5,21,431,8,21,10,21,12,21,434,9,21, + 1,21,1,21,1,22,1,22,3,22,440,8,22,1,23,1,23,1,23,1,23,3,23,446,8, + 23,1,23,1,23,1,23,1,23,1,23,1,23,3,23,454,8,23,1,23,1,23,1,23,1, + 23,1,23,1,23,3,23,462,8,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, + 23,1,23,1,23,1,23,3,23,475,8,23,1,24,1,24,1,24,1,24,1,24,3,24,482, + 8,24,1,24,1,24,3,24,486,8,24,1,25,5,25,489,8,25,10,25,12,25,492, + 9,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,3,25,502,8,25,1,25, + 1,25,5,25,506,8,25,10,25,12,25,509,9,25,1,25,1,25,1,26,1,26,1,26, + 1,26,1,26,3,26,518,8,26,1,27,1,27,1,27,3,27,523,8,27,1,27,1,27,1, + 27,1,27,3,27,529,8,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,5,27,538, + 8,27,10,27,12,27,541,9,27,1,27,1,27,1,28,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,29,1,29,1,29,1,29, + 1,29,1,29,1,29,3,29,567,8,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,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,1,29,1,29,1,29,3,29,565,8,29,1,30,1,30, - 1,30,3,30,570,8,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30, - 3,30,581,8,30,1,30,1,30,1,30,3,30,586,8,30,1,30,1,30,1,31,1,31,1, - 31,3,31,593,8,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,3,31,602,8,31, - 1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,3,32,615, - 8,32,1,32,1,32,1,33,1,33,1,33,1,34,1,34,1,35,1,35,1,35,1,35,1,35, - 1,35,1,35,1,35,1,35,1,35,5,35,634,8,35,10,35,12,35,637,9,35,3,35, - 639,8,35,1,35,3,35,642,8,35,1,36,1,36,1,36,5,36,647,8,36,10,36,12, - 36,650,9,36,1,37,1,37,1,37,5,37,655,8,37,10,37,12,37,658,9,37,1, - 37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1, - 38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1, - 38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,3,38,697,8, - 38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,3,38,709,8, - 38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,3, - 38,723,8,38,1,39,1,39,1,39,1,39,5,39,729,8,39,10,39,12,39,732,9, - 39,1,39,1,39,1,40,1,40,1,41,1,41,1,41,1,42,1,42,3,42,743,8,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,3,43,757, - 8,43,1,43,1,43,1,44,1,44,1,44,1,44,1,44,1,44,3,44,767,8,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,46,1,46, - 1,46,1,46,3,46,785,8,46,1,46,1,46,3,46,789,8,46,1,46,3,46,792,8, - 46,1,46,1,46,3,46,796,8,46,1,46,3,46,799,8,46,1,46,1,46,1,47,1,47, - 1,47,1,47,1,47,3,47,808,8,47,1,47,1,47,3,47,812,8,47,1,47,1,47,3, - 47,816,8,47,1,47,1,47,5,47,820,8,47,10,47,12,47,823,9,47,1,47,1, - 47,1,48,1,48,1,48,1,48,1,48,3,48,832,8,48,1,49,1,49,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,50,1,50,1, - 50,1,50,1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,51,3,51,861,8,51,1, - 51,1,51,1,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1, - 53,1,53,1,53,1,53,3,53,880,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,1,54,1,54,1,54,3,54,897,8,54,1,54,1, - 54,1,54,1,54,1,54,1,54,1,54,1,54,3,54,907,8,54,1,54,3,54,910,8,54, - 3,54,912,8,54,1,55,1,55,1,56,1,56,1,57,1,57,1,57,5,57,921,8,57,10, - 57,12,57,924,9,57,1,57,1,57,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,947, - 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,963,8,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58, - 972,8,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,980,8,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,993,8,58,1,58,1, - 58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,1005,8,58,1,58,1, - 58,3,58,1009,8,58,1,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,1018,8, - 59,1,59,1,59,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1, - 60,1,60,1,60,1,60,3,60,1036,8,60,1,60,1,60,1,60,1,60,1,60,1,60,1, - 60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1, - 60,5,60,1058,8,60,10,60,12,60,1061,9,60,1,60,1,60,1,60,3,60,1066, - 8,60,3,60,1068,8,60,1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,63,1,63, - 1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,3,64,1087,8,64,1,65,1,65, - 1,65,1,65,5,65,1093,8,65,10,65,12,65,1096,9,65,3,65,1098,8,65,1, - 65,1,65,1,66,1,66,1,66,1,66,1,67,1,67,1,67,1,67,5,67,1110,8,67,10, - 67,12,67,1113,9,67,3,67,1115,8,67,1,67,1,67,1,68,1,68,1,69,1,69, - 1,69,0,0,70,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,0,7,1,0,82,86,2,0,77,81, - 83,84,2,0,77,78,83,84,2,0,79,81,83,84,1,0,102,109,1,0,89,92,4,0, - 2,16,28,28,56,56,130,130,1208,0,152,1,0,0,0,2,154,1,0,0,0,4,164, - 1,0,0,0,6,168,1,0,0,0,8,192,1,0,0,0,10,204,1,0,0,0,12,206,1,0,0, - 0,14,213,1,0,0,0,16,224,1,0,0,0,18,226,1,0,0,0,20,239,1,0,0,0,22, - 271,1,0,0,0,24,301,1,0,0,0,26,303,1,0,0,0,28,307,1,0,0,0,30,325, - 1,0,0,0,32,327,1,0,0,0,34,339,1,0,0,0,36,342,1,0,0,0,38,360,1,0, - 0,0,40,396,1,0,0,0,42,399,1,0,0,0,44,424,1,0,0,0,46,452,1,0,0,0, - 48,463,1,0,0,0,50,468,1,0,0,0,52,495,1,0,0,0,54,497,1,0,0,0,56,522, - 1,0,0,0,58,564,1,0,0,0,60,566,1,0,0,0,62,589,1,0,0,0,64,605,1,0, - 0,0,66,618,1,0,0,0,68,621,1,0,0,0,70,641,1,0,0,0,72,643,1,0,0,0, - 74,651,1,0,0,0,76,722,1,0,0,0,78,724,1,0,0,0,80,735,1,0,0,0,82,737, - 1,0,0,0,84,742,1,0,0,0,86,744,1,0,0,0,88,766,1,0,0,0,90,768,1,0, - 0,0,92,777,1,0,0,0,94,802,1,0,0,0,96,831,1,0,0,0,98,833,1,0,0,0, - 100,840,1,0,0,0,102,854,1,0,0,0,104,864,1,0,0,0,106,879,1,0,0,0, - 108,911,1,0,0,0,110,913,1,0,0,0,112,915,1,0,0,0,114,917,1,0,0,0, - 116,1008,1,0,0,0,118,1010,1,0,0,0,120,1067,1,0,0,0,122,1069,1,0, - 0,0,124,1074,1,0,0,0,126,1076,1,0,0,0,128,1086,1,0,0,0,130,1088, - 1,0,0,0,132,1101,1,0,0,0,134,1105,1,0,0,0,136,1118,1,0,0,0,138,1120, - 1,0,0,0,140,141,3,6,3,0,141,142,5,0,0,1,142,153,1,0,0,0,143,144, - 3,20,10,0,144,145,5,0,0,1,145,153,1,0,0,0,146,147,3,50,25,0,147, - 148,5,0,0,1,148,153,1,0,0,0,149,150,3,2,1,0,150,151,5,0,0,1,151, - 153,1,0,0,0,152,140,1,0,0,0,152,143,1,0,0,0,152,146,1,0,0,0,152, - 149,1,0,0,0,153,1,1,0,0,0,154,155,5,23,0,0,155,159,5,118,0,0,156, - 158,3,8,4,0,157,156,1,0,0,0,158,161,1,0,0,0,159,157,1,0,0,0,159, - 160,1,0,0,0,160,162,1,0,0,0,161,159,1,0,0,0,162,163,5,119,0,0,163, - 3,1,0,0,0,164,165,5,24,0,0,165,166,3,138,69,0,166,167,5,115,0,0, - 167,5,1,0,0,0,168,169,5,1,0,0,169,170,3,136,68,0,170,171,5,65,0, - 0,171,172,3,138,69,0,172,173,5,59,0,0,173,174,3,138,69,0,174,175, - 5,58,0,0,175,176,3,138,69,0,176,180,5,118,0,0,177,179,3,8,4,0,178, - 177,1,0,0,0,179,182,1,0,0,0,180,178,1,0,0,0,180,181,1,0,0,0,181, - 183,1,0,0,0,182,180,1,0,0,0,183,184,5,119,0,0,184,7,1,0,0,0,185, - 193,3,4,2,0,186,193,3,18,9,0,187,193,3,10,5,0,188,193,3,82,41,0, - 189,193,3,94,47,0,190,193,3,118,59,0,191,193,3,32,16,0,192,185,1, - 0,0,0,192,186,1,0,0,0,192,187,1,0,0,0,192,188,1,0,0,0,192,189,1, - 0,0,0,192,190,1,0,0,0,192,191,1,0,0,0,193,9,1,0,0,0,194,195,5,24, - 0,0,195,196,5,27,0,0,196,197,3,136,68,0,197,198,5,115,0,0,198,205, - 1,0,0,0,199,200,5,24,0,0,200,201,5,29,0,0,201,202,3,136,68,0,202, - 203,5,115,0,0,203,205,1,0,0,0,204,194,1,0,0,0,204,199,1,0,0,0,205, - 11,1,0,0,0,206,207,5,25,0,0,207,208,5,26,0,0,208,209,3,136,68,0, - 209,210,5,65,0,0,210,211,3,138,69,0,211,212,5,115,0,0,212,13,1,0, - 0,0,213,214,5,25,0,0,214,215,5,27,0,0,215,216,3,136,68,0,216,217, - 5,59,0,0,217,218,3,138,69,0,218,219,5,115,0,0,219,15,1,0,0,0,220, - 225,3,10,5,0,221,225,3,12,6,0,222,225,3,14,7,0,223,225,3,32,16,0, - 224,220,1,0,0,0,224,221,1,0,0,0,224,222,1,0,0,0,224,223,1,0,0,0, - 225,17,1,0,0,0,226,227,5,26,0,0,227,228,3,136,68,0,228,229,5,65, - 0,0,229,232,3,138,69,0,230,231,5,66,0,0,231,233,3,138,69,0,232,230, - 1,0,0,0,232,233,1,0,0,0,233,234,1,0,0,0,234,235,5,115,0,0,235,19, - 1,0,0,0,236,238,3,16,8,0,237,236,1,0,0,0,238,241,1,0,0,0,239,237, - 1,0,0,0,239,240,1,0,0,0,240,242,1,0,0,0,241,239,1,0,0,0,242,243, - 5,27,0,0,243,245,3,136,68,0,244,246,3,22,11,0,245,244,1,0,0,0,245, - 246,1,0,0,0,246,247,1,0,0,0,247,248,5,65,0,0,248,249,3,138,69,0, - 249,250,5,59,0,0,250,260,3,138,69,0,251,252,5,70,0,0,252,257,3,26, - 13,0,253,254,5,116,0,0,254,256,3,26,13,0,255,253,1,0,0,0,256,259, - 1,0,0,0,257,255,1,0,0,0,257,258,1,0,0,0,258,261,1,0,0,0,259,257, - 1,0,0,0,260,251,1,0,0,0,260,261,1,0,0,0,261,262,1,0,0,0,262,266, - 5,118,0,0,263,265,3,34,17,0,264,263,1,0,0,0,265,268,1,0,0,0,266, - 264,1,0,0,0,266,267,1,0,0,0,267,269,1,0,0,0,268,266,1,0,0,0,269, - 270,5,119,0,0,270,21,1,0,0,0,271,272,5,124,0,0,272,277,3,24,12,0, - 273,274,5,116,0,0,274,276,3,24,12,0,275,273,1,0,0,0,276,279,1,0, - 0,0,277,275,1,0,0,0,277,278,1,0,0,0,278,280,1,0,0,0,279,277,1,0, - 0,0,280,281,5,125,0,0,281,23,1,0,0,0,282,283,5,30,0,0,283,286,3, - 136,68,0,284,285,5,114,0,0,285,287,5,20,0,0,286,284,1,0,0,0,286, - 287,1,0,0,0,287,302,1,0,0,0,288,289,5,19,0,0,289,299,3,136,68,0, - 290,291,5,21,0,0,291,296,3,26,13,0,292,293,5,126,0,0,293,295,3,26, - 13,0,294,292,1,0,0,0,295,298,1,0,0,0,296,294,1,0,0,0,296,297,1,0, - 0,0,297,300,1,0,0,0,298,296,1,0,0,0,299,290,1,0,0,0,299,300,1,0, - 0,0,300,302,1,0,0,0,301,282,1,0,0,0,301,288,1,0,0,0,302,25,1,0,0, - 0,303,305,3,136,68,0,304,306,3,28,14,0,305,304,1,0,0,0,305,306,1, - 0,0,0,306,27,1,0,0,0,307,308,5,124,0,0,308,313,3,30,15,0,309,310, - 5,116,0,0,310,312,3,30,15,0,311,309,1,0,0,0,312,315,1,0,0,0,313, - 311,1,0,0,0,313,314,1,0,0,0,314,316,1,0,0,0,315,313,1,0,0,0,316, - 317,5,125,0,0,317,29,1,0,0,0,318,319,5,26,0,0,319,326,3,136,68,0, - 320,321,5,27,0,0,321,326,3,26,13,0,322,323,5,19,0,0,323,326,3,136, - 68,0,324,326,3,120,60,0,325,318,1,0,0,0,325,320,1,0,0,0,325,322, - 1,0,0,0,325,324,1,0,0,0,326,31,1,0,0,0,327,328,5,18,0,0,328,330, - 3,136,68,0,329,331,3,22,11,0,330,329,1,0,0,0,330,331,1,0,0,0,331, - 332,1,0,0,0,332,333,5,127,0,0,333,334,3,120,60,0,334,335,5,115,0, - 0,335,33,1,0,0,0,336,340,3,38,19,0,337,340,3,42,21,0,338,340,3,36, - 18,0,339,336,1,0,0,0,339,337,1,0,0,0,339,338,1,0,0,0,340,35,1,0, - 0,0,341,343,5,40,0,0,342,341,1,0,0,0,342,343,1,0,0,0,343,344,1,0, - 0,0,344,345,5,32,0,0,345,346,3,136,68,0,346,347,5,65,0,0,347,348, - 3,138,69,0,348,349,5,114,0,0,349,350,3,120,60,0,350,351,5,113,0, - 0,351,352,3,120,60,0,352,353,5,118,0,0,353,354,5,82,0,0,354,355, - 5,65,0,0,355,356,3,138,69,0,356,357,5,115,0,0,357,358,5,119,0,0, - 358,37,1,0,0,0,359,361,3,44,22,0,360,359,1,0,0,0,360,361,1,0,0,0, - 361,362,1,0,0,0,362,363,5,30,0,0,363,364,3,136,68,0,364,365,5,65, - 0,0,365,366,3,138,69,0,366,367,5,114,0,0,367,368,3,120,60,0,368, - 372,5,118,0,0,369,371,3,40,20,0,370,369,1,0,0,0,371,374,1,0,0,0, - 372,370,1,0,0,0,372,373,1,0,0,0,373,375,1,0,0,0,374,372,1,0,0,0, - 375,376,5,119,0,0,376,39,1,0,0,0,377,378,5,72,0,0,378,379,5,65,0, - 0,379,380,3,138,69,0,380,381,5,115,0,0,381,397,1,0,0,0,382,383,5, - 73,0,0,383,384,5,65,0,0,384,385,3,138,69,0,385,386,5,115,0,0,386, - 397,1,0,0,0,387,388,5,74,0,0,388,389,5,75,0,0,389,390,5,65,0,0,390, - 391,3,138,69,0,391,392,5,76,0,0,392,393,5,65,0,0,393,394,3,138,69, - 0,394,395,5,115,0,0,395,397,1,0,0,0,396,377,1,0,0,0,396,382,1,0, - 0,0,396,387,1,0,0,0,397,41,1,0,0,0,398,400,3,44,22,0,399,398,1,0, - 0,0,399,400,1,0,0,0,400,401,1,0,0,0,401,402,5,31,0,0,402,403,3,136, - 68,0,403,404,5,65,0,0,404,405,3,138,69,0,405,406,5,114,0,0,406,407, - 3,126,63,0,407,409,3,48,24,0,408,410,5,93,0,0,409,408,1,0,0,0,409, - 410,1,0,0,0,410,413,1,0,0,0,411,412,5,63,0,0,412,414,3,138,69,0, - 413,411,1,0,0,0,413,414,1,0,0,0,414,415,1,0,0,0,415,419,5,118,0, - 0,416,418,3,46,23,0,417,416,1,0,0,0,418,421,1,0,0,0,419,417,1,0, - 0,0,419,420,1,0,0,0,420,422,1,0,0,0,421,419,1,0,0,0,422,423,5,119, - 0,0,423,43,1,0,0,0,424,426,5,15,0,0,425,427,5,16,0,0,426,425,1,0, - 0,0,426,427,1,0,0,0,427,45,1,0,0,0,428,429,5,79,0,0,429,430,5,65, - 0,0,430,431,3,138,69,0,431,432,5,115,0,0,432,453,1,0,0,0,433,434, - 5,80,0,0,434,435,5,65,0,0,435,436,3,138,69,0,436,437,5,115,0,0,437, - 453,1,0,0,0,438,439,5,81,0,0,439,440,5,65,0,0,440,441,3,138,69,0, - 441,442,5,115,0,0,442,453,1,0,0,0,443,444,5,74,0,0,444,445,5,75, - 0,0,445,446,5,65,0,0,446,447,3,138,69,0,447,448,5,76,0,0,448,449, - 5,65,0,0,449,450,3,138,69,0,450,451,5,115,0,0,451,453,1,0,0,0,452, - 428,1,0,0,0,452,433,1,0,0,0,452,438,1,0,0,0,452,443,1,0,0,0,453, - 47,1,0,0,0,454,455,5,26,0,0,455,464,3,136,68,0,456,457,5,27,0,0, - 457,459,3,136,68,0,458,460,3,28,14,0,459,458,1,0,0,0,459,460,1,0, - 0,0,460,464,1,0,0,0,461,462,5,19,0,0,462,464,3,136,68,0,463,454, - 1,0,0,0,463,456,1,0,0,0,463,461,1,0,0,0,464,49,1,0,0,0,465,467,3, - 16,8,0,466,465,1,0,0,0,467,470,1,0,0,0,468,466,1,0,0,0,468,469,1, - 0,0,0,469,471,1,0,0,0,470,468,1,0,0,0,471,472,5,29,0,0,472,473,3, - 136,68,0,473,474,5,65,0,0,474,475,3,138,69,0,475,476,5,59,0,0,476, - 479,3,138,69,0,477,478,5,60,0,0,478,480,5,128,0,0,479,477,1,0,0, - 0,479,480,1,0,0,0,480,481,1,0,0,0,481,485,5,118,0,0,482,484,3,52, - 26,0,483,482,1,0,0,0,484,487,1,0,0,0,485,483,1,0,0,0,485,486,1,0, - 0,0,486,488,1,0,0,0,487,485,1,0,0,0,488,489,5,119,0,0,489,51,1,0, - 0,0,490,496,3,60,30,0,491,496,3,62,31,0,492,496,3,64,32,0,493,496, - 3,54,27,0,494,496,3,56,28,0,495,490,1,0,0,0,495,491,1,0,0,0,495, - 492,1,0,0,0,495,493,1,0,0,0,495,494,1,0,0,0,496,53,1,0,0,0,497,498, - 5,5,0,0,498,500,3,136,68,0,499,501,3,22,11,0,500,499,1,0,0,0,500, - 501,1,0,0,0,501,502,1,0,0,0,502,503,5,65,0,0,503,504,3,138,69,0, - 504,506,5,8,0,0,505,507,5,1,0,0,506,505,1,0,0,0,506,507,1,0,0,0, - 507,508,1,0,0,0,508,509,3,26,13,0,509,510,5,9,0,0,510,511,3,138, - 69,0,511,512,5,32,0,0,512,513,3,138,69,0,513,517,5,118,0,0,514,516, - 3,58,29,0,515,514,1,0,0,0,516,519,1,0,0,0,517,515,1,0,0,0,517,518, - 1,0,0,0,518,520,1,0,0,0,519,517,1,0,0,0,520,521,5,119,0,0,521,55, - 1,0,0,0,522,523,5,5,0,0,523,524,3,136,68,0,524,525,5,65,0,0,525, - 526,3,138,69,0,526,527,5,7,0,0,527,528,3,136,68,0,528,529,3,28,14, - 0,529,530,5,115,0,0,530,57,1,0,0,0,531,532,5,10,0,0,532,533,3,138, - 69,0,533,534,5,115,0,0,534,565,1,0,0,0,535,537,5,11,0,0,536,538, - 5,19,0,0,537,536,1,0,0,0,537,538,1,0,0,0,538,539,1,0,0,0,539,540, - 3,136,68,0,540,541,5,38,0,0,541,542,3,26,13,0,542,543,5,115,0,0, - 543,565,1,0,0,0,544,545,5,12,0,0,545,546,3,136,68,0,546,547,5,128, - 0,0,547,548,5,115,0,0,548,565,1,0,0,0,549,550,5,13,0,0,550,551,3, - 26,13,0,551,552,5,117,0,0,552,553,3,136,68,0,553,554,3,136,68,0, - 554,555,3,138,69,0,555,556,5,115,0,0,556,565,1,0,0,0,557,558,5,74, - 0,0,558,565,5,115,0,0,559,560,5,14,0,0,560,561,5,128,0,0,561,562, - 3,138,69,0,562,563,5,115,0,0,563,565,1,0,0,0,564,531,1,0,0,0,564, - 535,1,0,0,0,564,544,1,0,0,0,564,549,1,0,0,0,564,557,1,0,0,0,564, - 559,1,0,0,0,565,59,1,0,0,0,566,567,5,32,0,0,567,569,3,136,68,0,568, - 570,3,22,11,0,569,568,1,0,0,0,569,570,1,0,0,0,570,571,1,0,0,0,571, - 572,5,65,0,0,572,573,3,138,69,0,573,574,5,114,0,0,574,575,3,120, - 60,0,575,576,5,113,0,0,576,577,3,120,60,0,577,578,5,67,0,0,578,580, - 3,68,34,0,579,581,3,66,33,0,580,579,1,0,0,0,580,581,1,0,0,0,581, - 582,1,0,0,0,582,583,5,69,0,0,583,585,3,70,35,0,584,586,3,74,37,0, - 585,584,1,0,0,0,585,586,1,0,0,0,586,587,1,0,0,0,587,588,5,115,0, - 0,588,61,1,0,0,0,589,590,5,33,0,0,590,592,3,136,68,0,591,593,3,22, - 11,0,592,591,1,0,0,0,592,593,1,0,0,0,593,594,1,0,0,0,594,595,5,65, - 0,0,595,596,3,138,69,0,596,597,5,114,0,0,597,598,3,120,60,0,598, - 599,5,113,0,0,599,601,3,120,60,0,600,602,3,74,37,0,601,600,1,0,0, - 0,601,602,1,0,0,0,602,603,1,0,0,0,603,604,5,115,0,0,604,63,1,0,0, - 0,605,606,5,34,0,0,606,607,3,136,68,0,607,608,5,65,0,0,608,609,3, - 138,69,0,609,610,5,35,0,0,610,611,3,136,68,0,611,612,5,114,0,0,612, - 614,3,120,60,0,613,615,3,74,37,0,614,613,1,0,0,0,614,615,1,0,0,0, - 615,616,1,0,0,0,616,617,5,115,0,0,617,65,1,0,0,0,618,619,5,68,0, - 0,619,620,3,120,60,0,620,67,1,0,0,0,621,622,7,0,0,0,622,69,1,0,0, - 0,623,642,5,71,0,0,624,625,5,26,0,0,625,642,3,136,68,0,626,627,5, - 19,0,0,627,642,3,136,68,0,628,629,5,28,0,0,629,638,5,120,0,0,630, - 635,3,26,13,0,631,632,5,116,0,0,632,634,3,26,13,0,633,631,1,0,0, - 0,634,637,1,0,0,0,635,633,1,0,0,0,635,636,1,0,0,0,636,639,1,0,0, - 0,637,635,1,0,0,0,638,630,1,0,0,0,638,639,1,0,0,0,639,640,1,0,0, - 0,640,642,5,121,0,0,641,623,1,0,0,0,641,624,1,0,0,0,641,626,1,0, - 0,0,641,628,1,0,0,0,642,71,1,0,0,0,643,648,3,136,68,0,644,645,5, - 116,0,0,645,647,3,136,68,0,646,644,1,0,0,0,647,650,1,0,0,0,648,646, - 1,0,0,0,648,649,1,0,0,0,649,73,1,0,0,0,650,648,1,0,0,0,651,652,5, - 70,0,0,652,656,5,118,0,0,653,655,3,76,38,0,654,653,1,0,0,0,655,658, - 1,0,0,0,656,654,1,0,0,0,656,657,1,0,0,0,657,659,1,0,0,0,658,656, - 1,0,0,0,659,660,5,119,0,0,660,75,1,0,0,0,661,662,5,6,0,0,662,663, - 3,136,68,0,663,664,5,65,0,0,664,665,3,138,69,0,665,666,5,120,0,0, - 666,667,3,72,36,0,667,668,5,121,0,0,668,669,5,115,0,0,669,723,1, - 0,0,0,670,671,5,44,0,0,671,672,3,136,68,0,672,673,5,65,0,0,673,674, - 3,138,69,0,674,675,5,114,0,0,675,676,3,120,60,0,676,677,3,78,39, - 0,677,678,5,115,0,0,678,723,1,0,0,0,679,680,5,45,0,0,680,681,3,136, - 68,0,681,682,5,65,0,0,682,683,3,138,69,0,683,684,5,114,0,0,684,685, - 3,126,63,0,685,686,3,48,24,0,686,687,3,78,39,0,687,688,5,115,0,0, - 688,723,1,0,0,0,689,690,5,27,0,0,690,691,3,136,68,0,691,692,5,65, - 0,0,692,693,3,138,69,0,693,694,5,114,0,0,694,696,3,136,68,0,695, - 697,3,28,14,0,696,695,1,0,0,0,696,697,1,0,0,0,697,698,1,0,0,0,698, - 699,5,115,0,0,699,723,1,0,0,0,700,701,5,34,0,0,701,702,3,136,68, - 0,702,703,5,65,0,0,703,704,3,138,69,0,704,705,5,114,0,0,705,708, - 3,136,68,0,706,707,5,36,0,0,707,709,3,120,60,0,708,706,1,0,0,0,708, - 709,1,0,0,0,709,710,1,0,0,0,710,711,5,115,0,0,711,723,1,0,0,0,712, - 713,5,5,0,0,713,714,3,136,68,0,714,715,5,65,0,0,715,716,3,138,69, - 0,716,717,5,114,0,0,717,718,3,136,68,0,718,719,5,117,0,0,719,720, - 3,136,68,0,720,721,5,115,0,0,721,723,1,0,0,0,722,661,1,0,0,0,722, - 670,1,0,0,0,722,679,1,0,0,0,722,689,1,0,0,0,722,700,1,0,0,0,722, - 712,1,0,0,0,723,77,1,0,0,0,724,725,5,120,0,0,725,730,3,80,40,0,726, - 727,5,116,0,0,727,729,3,80,40,0,728,726,1,0,0,0,729,732,1,0,0,0, - 730,728,1,0,0,0,730,731,1,0,0,0,731,733,1,0,0,0,732,730,1,0,0,0, - 733,734,5,121,0,0,734,79,1,0,0,0,735,736,7,1,0,0,736,81,1,0,0,0, - 737,738,5,43,0,0,738,739,3,84,42,0,739,83,1,0,0,0,740,743,3,86,43, - 0,741,743,3,90,45,0,742,740,1,0,0,0,742,741,1,0,0,0,743,85,1,0,0, - 0,744,745,5,44,0,0,745,746,3,136,68,0,746,747,5,65,0,0,747,748,3, - 138,69,0,748,749,5,53,0,0,749,750,3,136,68,0,750,751,5,114,0,0,751, - 752,3,120,60,0,752,753,5,54,0,0,753,756,3,88,44,0,754,755,5,55,0, - 0,755,757,3,128,64,0,756,754,1,0,0,0,756,757,1,0,0,0,757,758,1,0, - 0,0,758,759,5,115,0,0,759,87,1,0,0,0,760,767,5,87,0,0,761,762,5, - 88,0,0,762,763,5,122,0,0,763,764,3,120,60,0,764,765,5,123,0,0,765, - 767,1,0,0,0,766,760,1,0,0,0,766,761,1,0,0,0,767,89,1,0,0,0,768,769, - 5,45,0,0,769,770,3,136,68,0,770,771,5,65,0,0,771,772,3,138,69,0, - 772,773,5,118,0,0,773,774,3,92,46,0,774,775,3,92,46,0,775,776,5, - 119,0,0,776,91,1,0,0,0,777,778,3,48,24,0,778,779,5,46,0,0,779,780, - 3,136,68,0,780,781,5,65,0,0,781,782,3,138,69,0,782,784,3,126,63, - 0,783,785,5,93,0,0,784,783,1,0,0,0,784,785,1,0,0,0,785,788,1,0,0, - 0,786,787,5,61,0,0,787,789,3,138,69,0,788,786,1,0,0,0,788,789,1, - 0,0,0,789,791,1,0,0,0,790,792,5,62,0,0,791,790,1,0,0,0,791,792,1, - 0,0,0,792,795,1,0,0,0,793,794,5,63,0,0,794,796,3,138,69,0,795,793, - 1,0,0,0,795,796,1,0,0,0,796,798,1,0,0,0,797,799,5,64,0,0,798,797, - 1,0,0,0,798,799,1,0,0,0,799,800,1,0,0,0,800,801,5,115,0,0,801,93, - 1,0,0,0,802,803,5,37,0,0,803,804,3,136,68,0,804,805,5,38,0,0,805, - 807,3,136,68,0,806,808,3,28,14,0,807,806,1,0,0,0,807,808,1,0,0,0, - 808,811,1,0,0,0,809,810,5,65,0,0,810,812,3,138,69,0,811,809,1,0, - 0,0,811,812,1,0,0,0,812,815,1,0,0,0,813,814,5,60,0,0,814,816,5,128, - 0,0,815,813,1,0,0,0,815,816,1,0,0,0,816,817,1,0,0,0,817,821,5,118, - 0,0,818,820,3,96,48,0,819,818,1,0,0,0,820,823,1,0,0,0,821,819,1, - 0,0,0,821,822,1,0,0,0,822,824,1,0,0,0,823,821,1,0,0,0,824,825,5, - 119,0,0,825,95,1,0,0,0,826,827,5,42,0,0,827,832,3,84,42,0,828,832, - 3,102,51,0,829,832,3,98,49,0,830,832,3,100,50,0,831,826,1,0,0,0, - 831,828,1,0,0,0,831,829,1,0,0,0,831,830,1,0,0,0,832,97,1,0,0,0,833, - 834,5,39,0,0,834,835,3,136,68,0,835,836,5,41,0,0,836,837,5,44,0, - 0,837,838,3,136,68,0,838,839,5,115,0,0,839,99,1,0,0,0,840,841,5, - 50,0,0,841,842,3,136,68,0,842,843,5,51,0,0,843,844,5,52,0,0,844, - 845,5,48,0,0,845,846,5,34,0,0,846,847,3,136,68,0,847,848,5,49,0, - 0,848,849,5,45,0,0,849,850,3,136,68,0,850,851,5,117,0,0,851,852, - 3,136,68,0,852,853,5,115,0,0,853,101,1,0,0,0,854,855,5,39,0,0,855, - 856,3,104,52,0,856,857,5,41,0,0,857,860,3,108,54,0,858,859,5,17, - 0,0,859,861,3,138,69,0,860,858,1,0,0,0,860,861,1,0,0,0,861,862,1, - 0,0,0,862,863,5,115,0,0,863,103,1,0,0,0,864,865,3,136,68,0,865,866, - 5,117,0,0,866,867,3,106,53,0,867,105,1,0,0,0,868,880,3,136,68,0, - 869,880,5,82,0,0,870,880,5,72,0,0,871,880,5,73,0,0,872,880,5,79, - 0,0,873,880,5,80,0,0,874,880,5,81,0,0,875,880,5,83,0,0,876,880,5, - 84,0,0,877,880,5,85,0,0,878,880,5,86,0,0,879,868,1,0,0,0,879,869, - 1,0,0,0,879,870,1,0,0,0,879,871,1,0,0,0,879,872,1,0,0,0,879,873, - 1,0,0,0,879,874,1,0,0,0,879,875,1,0,0,0,879,876,1,0,0,0,879,877, - 1,0,0,0,879,878,1,0,0,0,880,107,1,0,0,0,881,882,5,44,0,0,882,883, - 3,136,68,0,883,884,5,117,0,0,884,885,3,110,55,0,885,912,1,0,0,0, - 886,887,5,45,0,0,887,888,3,136,68,0,888,889,5,117,0,0,889,890,3, - 136,68,0,890,891,5,117,0,0,891,892,3,112,56,0,892,912,1,0,0,0,893, - 894,5,27,0,0,894,896,3,136,68,0,895,897,3,28,14,0,896,895,1,0,0, - 0,896,897,1,0,0,0,897,898,1,0,0,0,898,899,5,117,0,0,899,900,3,104, - 52,0,900,912,1,0,0,0,901,902,5,29,0,0,902,903,3,136,68,0,903,904, - 5,117,0,0,904,906,3,136,68,0,905,907,3,28,14,0,906,905,1,0,0,0,906, - 907,1,0,0,0,907,909,1,0,0,0,908,910,3,114,57,0,909,908,1,0,0,0,909, - 910,1,0,0,0,910,912,1,0,0,0,911,881,1,0,0,0,911,886,1,0,0,0,911, - 893,1,0,0,0,911,901,1,0,0,0,912,109,1,0,0,0,913,914,7,2,0,0,914, - 111,1,0,0,0,915,916,7,3,0,0,916,113,1,0,0,0,917,918,5,47,0,0,918, - 922,5,118,0,0,919,921,3,116,58,0,920,919,1,0,0,0,921,924,1,0,0,0, - 922,920,1,0,0,0,922,923,1,0,0,0,923,925,1,0,0,0,924,922,1,0,0,0, - 925,926,5,119,0,0,926,115,1,0,0,0,927,928,3,136,68,0,928,929,5,41, - 0,0,929,930,5,1,0,0,930,931,5,6,0,0,931,932,5,120,0,0,932,933,3, - 72,36,0,933,934,5,121,0,0,934,935,5,115,0,0,935,1009,1,0,0,0,936, - 937,3,136,68,0,937,938,5,41,0,0,938,939,5,44,0,0,939,946,3,136,68, - 0,940,941,5,49,0,0,941,942,5,45,0,0,942,943,3,136,68,0,943,944,5, - 117,0,0,944,945,3,136,68,0,945,947,1,0,0,0,946,940,1,0,0,0,946,947, - 1,0,0,0,947,948,1,0,0,0,948,949,5,115,0,0,949,1009,1,0,0,0,950,951, - 3,136,68,0,951,952,5,41,0,0,952,953,5,45,0,0,953,954,3,136,68,0, - 954,955,5,117,0,0,955,962,3,136,68,0,956,957,5,49,0,0,957,958,5, - 45,0,0,958,959,3,136,68,0,959,960,5,117,0,0,960,961,3,136,68,0,961, - 963,1,0,0,0,962,956,1,0,0,0,962,963,1,0,0,0,963,964,1,0,0,0,964, - 965,5,115,0,0,965,1009,1,0,0,0,966,967,3,136,68,0,967,968,5,41,0, - 0,968,969,5,27,0,0,969,971,3,136,68,0,970,972,3,28,14,0,971,970, - 1,0,0,0,971,972,1,0,0,0,972,979,1,0,0,0,973,974,5,49,0,0,974,975, - 5,45,0,0,975,976,3,136,68,0,976,977,5,117,0,0,977,978,3,136,68,0, - 978,980,1,0,0,0,979,973,1,0,0,0,979,980,1,0,0,0,980,981,1,0,0,0, - 981,982,5,115,0,0,982,1009,1,0,0,0,983,984,3,136,68,0,984,985,5, - 41,0,0,985,986,5,34,0,0,986,987,3,136,68,0,987,988,5,115,0,0,988, - 1009,1,0,0,0,989,990,3,136,68,0,990,992,5,41,0,0,991,993,5,1,0,0, - 992,991,1,0,0,0,992,993,1,0,0,0,993,994,1,0,0,0,994,995,5,5,0,0, - 995,996,3,136,68,0,996,997,5,117,0,0,997,1004,3,136,68,0,998,999, - 5,49,0,0,999,1000,5,45,0,0,1000,1001,3,136,68,0,1001,1002,5,117, - 0,0,1002,1003,3,136,68,0,1003,1005,1,0,0,0,1004,998,1,0,0,0,1004, - 1005,1,0,0,0,1005,1006,1,0,0,0,1006,1007,5,115,0,0,1007,1009,1,0, - 0,0,1008,927,1,0,0,0,1008,936,1,0,0,0,1008,950,1,0,0,0,1008,966, - 1,0,0,0,1008,983,1,0,0,0,1008,989,1,0,0,0,1009,117,1,0,0,0,1010, - 1011,5,34,0,0,1011,1012,3,136,68,0,1012,1013,5,41,0,0,1013,1014, - 3,136,68,0,1014,1015,5,117,0,0,1015,1017,3,136,68,0,1016,1018,3, - 114,57,0,1017,1016,1,0,0,0,1017,1018,1,0,0,0,1018,1019,1,0,0,0,1019, - 1020,5,115,0,0,1020,119,1,0,0,0,1021,1068,3,124,62,0,1022,1068,5, - 94,0,0,1023,1068,5,95,0,0,1024,1025,5,96,0,0,1025,1068,3,138,69, - 0,1026,1027,5,97,0,0,1027,1028,5,124,0,0,1028,1029,3,136,68,0,1029, - 1030,5,125,0,0,1030,1068,1,0,0,0,1031,1032,5,98,0,0,1032,1033,5, - 124,0,0,1033,1035,3,136,68,0,1034,1036,3,28,14,0,1035,1034,1,0,0, - 0,1035,1036,1,0,0,0,1036,1037,1,0,0,0,1037,1038,5,125,0,0,1038,1068, - 1,0,0,0,1039,1040,5,22,0,0,1040,1041,5,124,0,0,1041,1042,3,136,68, - 0,1042,1043,5,125,0,0,1043,1068,1,0,0,0,1044,1045,5,99,0,0,1045, - 1046,5,124,0,0,1046,1047,3,120,60,0,1047,1048,5,125,0,0,1048,1068, - 1,0,0,0,1049,1050,5,100,0,0,1050,1051,5,124,0,0,1051,1052,3,120, - 60,0,1052,1053,5,125,0,0,1053,1068,1,0,0,0,1054,1055,5,101,0,0,1055, - 1059,5,118,0,0,1056,1058,3,122,61,0,1057,1056,1,0,0,0,1058,1061, - 1,0,0,0,1059,1057,1,0,0,0,1059,1060,1,0,0,0,1060,1062,1,0,0,0,1061, - 1059,1,0,0,0,1062,1068,5,119,0,0,1063,1065,3,136,68,0,1064,1066, - 3,28,14,0,1065,1064,1,0,0,0,1065,1066,1,0,0,0,1066,1068,1,0,0,0, - 1067,1021,1,0,0,0,1067,1022,1,0,0,0,1067,1023,1,0,0,0,1067,1024, - 1,0,0,0,1067,1026,1,0,0,0,1067,1031,1,0,0,0,1067,1039,1,0,0,0,1067, - 1044,1,0,0,0,1067,1049,1,0,0,0,1067,1054,1,0,0,0,1067,1063,1,0,0, - 0,1068,121,1,0,0,0,1069,1070,3,136,68,0,1070,1071,5,114,0,0,1071, - 1072,3,120,60,0,1072,1073,5,115,0,0,1073,123,1,0,0,0,1074,1075,7, - 4,0,0,1075,125,1,0,0,0,1076,1077,7,5,0,0,1077,127,1,0,0,0,1078,1087, - 3,138,69,0,1079,1087,5,128,0,0,1080,1087,5,129,0,0,1081,1087,5,110, - 0,0,1082,1087,5,111,0,0,1083,1087,5,112,0,0,1084,1087,3,130,65,0, - 1085,1087,3,134,67,0,1086,1078,1,0,0,0,1086,1079,1,0,0,0,1086,1080, - 1,0,0,0,1086,1081,1,0,0,0,1086,1082,1,0,0,0,1086,1083,1,0,0,0,1086, - 1084,1,0,0,0,1086,1085,1,0,0,0,1087,129,1,0,0,0,1088,1097,5,118, - 0,0,1089,1094,3,132,66,0,1090,1091,5,116,0,0,1091,1093,3,132,66, - 0,1092,1090,1,0,0,0,1093,1096,1,0,0,0,1094,1092,1,0,0,0,1094,1095, - 1,0,0,0,1095,1098,1,0,0,0,1096,1094,1,0,0,0,1097,1089,1,0,0,0,1097, - 1098,1,0,0,0,1098,1099,1,0,0,0,1099,1100,5,119,0,0,1100,131,1,0, - 0,0,1101,1102,3,138,69,0,1102,1103,5,114,0,0,1103,1104,3,128,64, - 0,1104,133,1,0,0,0,1105,1114,5,120,0,0,1106,1111,3,128,64,0,1107, - 1108,5,116,0,0,1108,1110,3,128,64,0,1109,1107,1,0,0,0,1110,1113, - 1,0,0,0,1111,1109,1,0,0,0,1111,1112,1,0,0,0,1112,1115,1,0,0,0,1113, - 1111,1,0,0,0,1114,1106,1,0,0,0,1114,1115,1,0,0,0,1115,1116,1,0,0, - 0,1116,1117,5,121,0,0,1117,135,1,0,0,0,1118,1119,7,6,0,0,1119,137, - 1,0,0,0,1120,1121,5,131,0,0,1121,139,1,0,0,0,95,152,159,180,192, - 204,224,232,239,245,257,260,266,277,286,296,299,301,305,313,325, - 330,339,342,360,372,396,399,409,413,419,426,452,459,463,468,479, - 485,495,500,506,517,537,564,569,580,585,592,601,614,635,638,641, - 648,656,696,708,722,730,742,756,766,784,788,791,795,798,807,811, - 815,821,831,860,879,896,906,909,911,922,946,962,971,979,992,1004, - 1008,1017,1035,1059,1065,1067,1086,1094,1097,1111,1114 + 1,29,1,29,1,29,1,29,1,29,3,29,594,8,29,1,30,1,30,1,30,3,30,599,8, + 30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,3,30,610,8,30,1, + 30,3,30,613,8,30,1,30,1,30,1,30,3,30,618,8,30,1,30,1,30,1,31,1,31, + 1,31,3,31,625,8,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,3,31,634,8, + 31,1,31,3,31,637,8,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,32,1, + 32,1,32,1,32,3,32,650,8,32,1,33,1,33,1,33,1,33,1,33,5,33,657,8,33, + 10,33,12,33,660,9,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,1,34,1,34, + 1,34,1,34,3,34,673,8,34,1,34,1,34,1,35,1,35,1,35,1,36,1,36,1,37, + 1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,5,37,692,8,37,10,37, + 12,37,695,9,37,3,37,697,8,37,1,37,3,37,700,8,37,1,38,1,38,1,38,5, + 38,705,8,38,10,38,12,38,708,9,38,1,39,1,39,1,39,5,39,713,8,39,10, + 39,12,39,716,9,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1, + 40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1, + 40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1, + 40,1,40,3,40,755,8,40,1,40,3,40,758,8,40,1,40,1,40,1,40,1,40,1,40, + 1,40,1,40,1,40,1,40,1,40,3,40,770,8,40,1,40,1,40,1,40,1,40,1,40, + 1,40,1,40,1,40,1,40,1,40,1,40,1,40,3,40,784,8,40,1,41,1,41,1,41, + 1,41,5,41,790,8,41,10,41,12,41,793,9,41,1,41,1,41,1,42,1,42,1,43, + 1,43,1,43,1,44,1,44,3,44,804,8,44,1,45,1,45,1,45,1,45,1,45,1,45, + 1,45,1,45,1,45,1,45,1,45,1,45,3,45,818,8,45,1,45,1,45,1,46,1,46, + 1,46,1,46,1,46,1,46,3,46,828,8,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,48,1,48,1,48,1,48,3,48,846,8,48, + 1,48,1,48,3,48,850,8,48,1,48,3,48,853,8,48,1,48,1,48,3,48,857,8, + 48,1,48,3,48,860,8,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,3,49,869, + 8,49,1,49,1,49,3,49,873,8,49,1,49,1,49,3,49,877,8,49,1,49,1,49,5, + 49,881,8,49,10,49,12,49,884,9,49,1,49,1,49,1,50,1,50,1,50,1,50,1, + 50,3,50,893,8,50,1,51,1,51,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,52,1,52,1,52,1,52,1,52,1,52,1,53,1, + 53,1,53,1,53,1,53,1,53,3,53,922,8,53,1,53,1,53,1,54,1,54,1,54,1, + 54,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,3,55,941, + 8,55,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56, + 1,56,1,56,1,56,3,56,958,8,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56, + 1,56,3,56,968,8,56,1,56,3,56,971,8,56,3,56,973,8,56,1,57,1,57,1, + 58,1,58,1,59,1,59,1,59,5,59,982,8,59,10,59,12,59,985,9,59,1,59,1, + 59,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1, + 60,1,60,1,60,1,60,1,60,1,60,1,60,3,60,1008,8,60,1,60,1,60,1,60,1, + 60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,3,60,1024,8, + 60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,3,60,1033,8,60,1,60,1,60,1, + 60,1,60,1,60,1,60,3,60,1041,8,60,1,60,1,60,1,60,1,60,1,60,1,60,1, + 60,1,60,1,60,1,60,1,60,3,60,1054,8,60,1,60,1,60,1,60,1,60,1,60,1, + 60,1,60,1,60,1,60,1,60,3,60,1066,8,60,1,60,1,60,3,60,1070,8,60,1, + 61,1,61,1,61,1,61,1,61,1,61,1,61,3,61,1079,8,61,1,61,1,61,1,62,1, + 62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,3, + 62,1097,8,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1, + 62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,5,62,1119,8,62,10, + 62,12,62,1122,9,62,1,62,1,62,1,62,3,62,1127,8,62,3,62,1129,8,62, + 1,63,1,63,1,63,1,63,1,63,1,64,1,64,1,65,1,65,1,66,1,66,1,66,1,66, + 1,66,1,66,1,66,1,66,3,66,1148,8,66,1,67,1,67,1,67,1,67,5,67,1154, + 8,67,10,67,12,67,1157,9,67,3,67,1159,8,67,1,67,1,67,1,68,1,68,1, + 68,1,68,1,69,1,69,1,69,1,69,5,69,1171,8,69,10,69,12,69,1174,9,69, + 3,69,1176,8,69,1,69,1,69,1,70,1,70,1,71,1,71,1,71,0,0,72,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,0,9,2,0,7,7,25,25,1,0,3,4,1,0,91,95, + 2,0,86,90,92,93,2,0,86,87,92,93,2,0,88,90,92,93,1,0,111,118,1,0, + 98,101,4,0,11,25,37,37,65,65,139,139,1280,0,156,1,0,0,0,2,158,1, + 0,0,0,4,168,1,0,0,0,6,172,1,0,0,0,8,196,1,0,0,0,10,208,1,0,0,0,12, + 210,1,0,0,0,14,217,1,0,0,0,16,228,1,0,0,0,18,230,1,0,0,0,20,243, + 1,0,0,0,22,275,1,0,0,0,24,305,1,0,0,0,26,307,1,0,0,0,28,311,1,0, + 0,0,30,329,1,0,0,0,32,331,1,0,0,0,34,343,1,0,0,0,36,346,1,0,0,0, + 38,367,1,0,0,0,40,409,1,0,0,0,42,412,1,0,0,0,44,437,1,0,0,0,46,474, + 1,0,0,0,48,485,1,0,0,0,50,490,1,0,0,0,52,517,1,0,0,0,54,519,1,0, + 0,0,56,544,1,0,0,0,58,593,1,0,0,0,60,595,1,0,0,0,62,621,1,0,0,0, + 64,649,1,0,0,0,66,651,1,0,0,0,68,663,1,0,0,0,70,676,1,0,0,0,72,679, + 1,0,0,0,74,699,1,0,0,0,76,701,1,0,0,0,78,709,1,0,0,0,80,783,1,0, + 0,0,82,785,1,0,0,0,84,796,1,0,0,0,86,798,1,0,0,0,88,803,1,0,0,0, + 90,805,1,0,0,0,92,827,1,0,0,0,94,829,1,0,0,0,96,838,1,0,0,0,98,863, + 1,0,0,0,100,892,1,0,0,0,102,894,1,0,0,0,104,901,1,0,0,0,106,915, + 1,0,0,0,108,925,1,0,0,0,110,940,1,0,0,0,112,972,1,0,0,0,114,974, + 1,0,0,0,116,976,1,0,0,0,118,978,1,0,0,0,120,1069,1,0,0,0,122,1071, + 1,0,0,0,124,1128,1,0,0,0,126,1130,1,0,0,0,128,1135,1,0,0,0,130,1137, + 1,0,0,0,132,1147,1,0,0,0,134,1149,1,0,0,0,136,1162,1,0,0,0,138,1166, + 1,0,0,0,140,1179,1,0,0,0,142,1181,1,0,0,0,144,145,3,6,3,0,145,146, + 5,0,0,1,146,157,1,0,0,0,147,148,3,20,10,0,148,149,5,0,0,1,149,157, + 1,0,0,0,150,151,3,50,25,0,151,152,5,0,0,1,152,157,1,0,0,0,153,154, + 3,2,1,0,154,155,5,0,0,1,155,157,1,0,0,0,156,144,1,0,0,0,156,147, + 1,0,0,0,156,150,1,0,0,0,156,153,1,0,0,0,157,1,1,0,0,0,158,159,5, + 32,0,0,159,163,5,127,0,0,160,162,3,8,4,0,161,160,1,0,0,0,162,165, + 1,0,0,0,163,161,1,0,0,0,163,164,1,0,0,0,164,166,1,0,0,0,165,163, + 1,0,0,0,166,167,5,128,0,0,167,3,1,0,0,0,168,169,5,33,0,0,169,170, + 3,142,71,0,170,171,5,124,0,0,171,5,1,0,0,0,172,173,5,1,0,0,173,174, + 3,140,70,0,174,175,5,74,0,0,175,176,3,142,71,0,176,177,5,68,0,0, + 177,178,3,142,71,0,178,179,5,67,0,0,179,180,3,142,71,0,180,184,5, + 127,0,0,181,183,3,8,4,0,182,181,1,0,0,0,183,186,1,0,0,0,184,182, + 1,0,0,0,184,185,1,0,0,0,185,187,1,0,0,0,186,184,1,0,0,0,187,188, + 5,128,0,0,188,7,1,0,0,0,189,197,3,4,2,0,190,197,3,18,9,0,191,197, + 3,10,5,0,192,197,3,86,43,0,193,197,3,98,49,0,194,197,3,122,61,0, + 195,197,3,32,16,0,196,189,1,0,0,0,196,190,1,0,0,0,196,191,1,0,0, + 0,196,192,1,0,0,0,196,193,1,0,0,0,196,194,1,0,0,0,196,195,1,0,0, + 0,197,9,1,0,0,0,198,199,5,33,0,0,199,200,5,36,0,0,200,201,3,140, + 70,0,201,202,5,124,0,0,202,209,1,0,0,0,203,204,5,33,0,0,204,205, + 5,38,0,0,205,206,3,140,70,0,206,207,5,124,0,0,207,209,1,0,0,0,208, + 198,1,0,0,0,208,203,1,0,0,0,209,11,1,0,0,0,210,211,5,34,0,0,211, + 212,5,35,0,0,212,213,3,140,70,0,213,214,5,74,0,0,214,215,3,142,71, + 0,215,216,5,124,0,0,216,13,1,0,0,0,217,218,5,34,0,0,218,219,5,36, + 0,0,219,220,3,140,70,0,220,221,5,68,0,0,221,222,3,142,71,0,222,223, + 5,124,0,0,223,15,1,0,0,0,224,229,3,10,5,0,225,229,3,12,6,0,226,229, + 3,14,7,0,227,229,3,32,16,0,228,224,1,0,0,0,228,225,1,0,0,0,228,226, + 1,0,0,0,228,227,1,0,0,0,229,17,1,0,0,0,230,231,5,35,0,0,231,232, + 3,140,70,0,232,233,5,74,0,0,233,236,3,142,71,0,234,235,5,75,0,0, + 235,237,3,142,71,0,236,234,1,0,0,0,236,237,1,0,0,0,237,238,1,0,0, + 0,238,239,5,124,0,0,239,19,1,0,0,0,240,242,3,16,8,0,241,240,1,0, + 0,0,242,245,1,0,0,0,243,241,1,0,0,0,243,244,1,0,0,0,244,246,1,0, + 0,0,245,243,1,0,0,0,246,247,5,36,0,0,247,249,3,140,70,0,248,250, + 3,22,11,0,249,248,1,0,0,0,249,250,1,0,0,0,250,251,1,0,0,0,251,252, + 5,74,0,0,252,253,3,142,71,0,253,254,5,68,0,0,254,264,3,142,71,0, + 255,256,5,79,0,0,256,261,3,26,13,0,257,258,5,125,0,0,258,260,3,26, + 13,0,259,257,1,0,0,0,260,263,1,0,0,0,261,259,1,0,0,0,261,262,1,0, + 0,0,262,265,1,0,0,0,263,261,1,0,0,0,264,255,1,0,0,0,264,265,1,0, + 0,0,265,266,1,0,0,0,266,270,5,127,0,0,267,269,3,34,17,0,268,267, + 1,0,0,0,269,272,1,0,0,0,270,268,1,0,0,0,270,271,1,0,0,0,271,273, + 1,0,0,0,272,270,1,0,0,0,273,274,5,128,0,0,274,21,1,0,0,0,275,276, + 5,133,0,0,276,281,3,24,12,0,277,278,5,125,0,0,278,280,3,24,12,0, + 279,277,1,0,0,0,280,283,1,0,0,0,281,279,1,0,0,0,281,282,1,0,0,0, + 282,284,1,0,0,0,283,281,1,0,0,0,284,285,5,134,0,0,285,23,1,0,0,0, + 286,287,5,39,0,0,287,290,3,140,70,0,288,289,5,123,0,0,289,291,5, + 29,0,0,290,288,1,0,0,0,290,291,1,0,0,0,291,306,1,0,0,0,292,293,5, + 28,0,0,293,303,3,140,70,0,294,295,5,30,0,0,295,300,3,26,13,0,296, + 297,5,135,0,0,297,299,3,26,13,0,298,296,1,0,0,0,299,302,1,0,0,0, + 300,298,1,0,0,0,300,301,1,0,0,0,301,304,1,0,0,0,302,300,1,0,0,0, + 303,294,1,0,0,0,303,304,1,0,0,0,304,306,1,0,0,0,305,286,1,0,0,0, + 305,292,1,0,0,0,306,25,1,0,0,0,307,309,3,140,70,0,308,310,3,28,14, + 0,309,308,1,0,0,0,309,310,1,0,0,0,310,27,1,0,0,0,311,312,5,133,0, + 0,312,317,3,30,15,0,313,314,5,125,0,0,314,316,3,30,15,0,315,313, + 1,0,0,0,316,319,1,0,0,0,317,315,1,0,0,0,317,318,1,0,0,0,318,320, + 1,0,0,0,319,317,1,0,0,0,320,321,5,134,0,0,321,29,1,0,0,0,322,323, + 5,35,0,0,323,330,3,140,70,0,324,325,5,36,0,0,325,330,3,26,13,0,326, + 327,5,28,0,0,327,330,3,140,70,0,328,330,3,124,62,0,329,322,1,0,0, + 0,329,324,1,0,0,0,329,326,1,0,0,0,329,328,1,0,0,0,330,31,1,0,0,0, + 331,332,5,27,0,0,332,334,3,140,70,0,333,335,3,22,11,0,334,333,1, + 0,0,0,334,335,1,0,0,0,335,336,1,0,0,0,336,337,5,136,0,0,337,338, + 3,124,62,0,338,339,5,124,0,0,339,33,1,0,0,0,340,344,3,38,19,0,341, + 344,3,42,21,0,342,344,3,36,18,0,343,340,1,0,0,0,343,341,1,0,0,0, + 343,342,1,0,0,0,344,35,1,0,0,0,345,347,5,49,0,0,346,345,1,0,0,0, + 346,347,1,0,0,0,347,348,1,0,0,0,348,349,5,41,0,0,349,350,3,140,70, + 0,350,351,5,74,0,0,351,352,3,142,71,0,352,353,5,123,0,0,353,354, + 3,124,62,0,354,355,5,122,0,0,355,356,3,124,62,0,356,357,5,127,0, + 0,357,358,5,91,0,0,358,359,5,74,0,0,359,361,3,142,71,0,360,362,3, + 64,32,0,361,360,1,0,0,0,361,362,1,0,0,0,362,363,1,0,0,0,363,364, + 5,124,0,0,364,365,5,128,0,0,365,37,1,0,0,0,366,368,3,44,22,0,367, + 366,1,0,0,0,367,368,1,0,0,0,368,369,1,0,0,0,369,370,5,39,0,0,370, + 371,3,140,70,0,371,372,5,74,0,0,372,373,3,142,71,0,373,374,5,123, + 0,0,374,375,3,124,62,0,375,379,5,127,0,0,376,378,3,40,20,0,377,376, + 1,0,0,0,378,381,1,0,0,0,379,377,1,0,0,0,379,380,1,0,0,0,380,382, + 1,0,0,0,381,379,1,0,0,0,382,383,5,128,0,0,383,39,1,0,0,0,384,385, + 5,81,0,0,385,386,5,74,0,0,386,388,3,142,71,0,387,389,3,64,32,0,388, + 387,1,0,0,0,388,389,1,0,0,0,389,390,1,0,0,0,390,391,5,124,0,0,391, + 410,1,0,0,0,392,393,5,82,0,0,393,394,5,74,0,0,394,396,3,142,71,0, + 395,397,3,64,32,0,396,395,1,0,0,0,396,397,1,0,0,0,397,398,1,0,0, + 0,398,399,5,124,0,0,399,410,1,0,0,0,400,401,5,83,0,0,401,402,5,84, + 0,0,402,403,5,74,0,0,403,404,3,142,71,0,404,405,5,85,0,0,405,406, + 5,74,0,0,406,407,3,142,71,0,407,408,5,124,0,0,408,410,1,0,0,0,409, + 384,1,0,0,0,409,392,1,0,0,0,409,400,1,0,0,0,410,41,1,0,0,0,411,413, + 3,44,22,0,412,411,1,0,0,0,412,413,1,0,0,0,413,414,1,0,0,0,414,415, + 5,40,0,0,415,416,3,140,70,0,416,417,5,74,0,0,417,418,3,142,71,0, + 418,419,5,123,0,0,419,420,3,130,65,0,420,422,3,48,24,0,421,423,5, + 102,0,0,422,421,1,0,0,0,422,423,1,0,0,0,423,426,1,0,0,0,424,425, + 5,72,0,0,425,427,3,142,71,0,426,424,1,0,0,0,426,427,1,0,0,0,427, + 428,1,0,0,0,428,432,5,127,0,0,429,431,3,46,23,0,430,429,1,0,0,0, + 431,434,1,0,0,0,432,430,1,0,0,0,432,433,1,0,0,0,433,435,1,0,0,0, + 434,432,1,0,0,0,435,436,5,128,0,0,436,43,1,0,0,0,437,439,5,24,0, + 0,438,440,7,0,0,0,439,438,1,0,0,0,439,440,1,0,0,0,440,45,1,0,0,0, + 441,442,5,88,0,0,442,443,5,74,0,0,443,445,3,142,71,0,444,446,3,64, + 32,0,445,444,1,0,0,0,445,446,1,0,0,0,446,447,1,0,0,0,447,448,5,124, + 0,0,448,475,1,0,0,0,449,450,5,89,0,0,450,451,5,74,0,0,451,453,3, + 142,71,0,452,454,3,64,32,0,453,452,1,0,0,0,453,454,1,0,0,0,454,455, + 1,0,0,0,455,456,5,124,0,0,456,475,1,0,0,0,457,458,5,90,0,0,458,459, + 5,74,0,0,459,461,3,142,71,0,460,462,3,64,32,0,461,460,1,0,0,0,461, + 462,1,0,0,0,462,463,1,0,0,0,463,464,5,124,0,0,464,475,1,0,0,0,465, + 466,5,83,0,0,466,467,5,84,0,0,467,468,5,74,0,0,468,469,3,142,71, + 0,469,470,5,85,0,0,470,471,5,74,0,0,471,472,3,142,71,0,472,473,5, + 124,0,0,473,475,1,0,0,0,474,441,1,0,0,0,474,449,1,0,0,0,474,457, + 1,0,0,0,474,465,1,0,0,0,475,47,1,0,0,0,476,477,5,35,0,0,477,486, + 3,140,70,0,478,479,5,36,0,0,479,481,3,140,70,0,480,482,3,28,14,0, + 481,480,1,0,0,0,481,482,1,0,0,0,482,486,1,0,0,0,483,484,5,28,0,0, + 484,486,3,140,70,0,485,476,1,0,0,0,485,478,1,0,0,0,485,483,1,0,0, + 0,486,49,1,0,0,0,487,489,3,16,8,0,488,487,1,0,0,0,489,492,1,0,0, + 0,490,488,1,0,0,0,490,491,1,0,0,0,491,493,1,0,0,0,492,490,1,0,0, + 0,493,494,5,38,0,0,494,495,3,140,70,0,495,496,5,74,0,0,496,497,3, + 142,71,0,497,498,5,68,0,0,498,501,3,142,71,0,499,500,5,69,0,0,500, + 502,5,137,0,0,501,499,1,0,0,0,501,502,1,0,0,0,502,503,1,0,0,0,503, + 507,5,127,0,0,504,506,3,52,26,0,505,504,1,0,0,0,506,509,1,0,0,0, + 507,505,1,0,0,0,507,508,1,0,0,0,508,510,1,0,0,0,509,507,1,0,0,0, + 510,511,5,128,0,0,511,51,1,0,0,0,512,518,3,60,30,0,513,518,3,62, + 31,0,514,518,3,68,34,0,515,518,3,54,27,0,516,518,3,56,28,0,517,512, + 1,0,0,0,517,513,1,0,0,0,517,514,1,0,0,0,517,515,1,0,0,0,517,516, + 1,0,0,0,518,53,1,0,0,0,519,520,5,14,0,0,520,522,3,140,70,0,521,523, + 3,22,11,0,522,521,1,0,0,0,522,523,1,0,0,0,523,524,1,0,0,0,524,525, + 5,74,0,0,525,526,3,142,71,0,526,528,5,17,0,0,527,529,5,1,0,0,528, + 527,1,0,0,0,528,529,1,0,0,0,529,530,1,0,0,0,530,531,3,26,13,0,531, + 532,5,18,0,0,532,533,3,142,71,0,533,534,5,41,0,0,534,535,3,142,71, + 0,535,539,5,127,0,0,536,538,3,58,29,0,537,536,1,0,0,0,538,541,1, + 0,0,0,539,537,1,0,0,0,539,540,1,0,0,0,540,542,1,0,0,0,541,539,1, + 0,0,0,542,543,5,128,0,0,543,55,1,0,0,0,544,545,5,14,0,0,545,546, + 3,140,70,0,546,547,5,74,0,0,547,548,3,142,71,0,548,549,5,16,0,0, + 549,550,3,140,70,0,550,551,3,28,14,0,551,552,5,124,0,0,552,57,1, + 0,0,0,553,554,5,8,0,0,554,594,5,124,0,0,555,556,5,9,0,0,556,557, + 5,10,0,0,557,558,3,140,70,0,558,559,5,124,0,0,559,594,1,0,0,0,560, + 561,5,19,0,0,561,562,3,142,71,0,562,563,5,124,0,0,563,594,1,0,0, + 0,564,566,5,20,0,0,565,567,5,28,0,0,566,565,1,0,0,0,566,567,1,0, + 0,0,567,568,1,0,0,0,568,569,3,140,70,0,569,570,5,47,0,0,570,571, + 3,26,13,0,571,572,5,124,0,0,572,594,1,0,0,0,573,574,5,21,0,0,574, + 575,3,140,70,0,575,576,5,137,0,0,576,577,5,124,0,0,577,594,1,0,0, + 0,578,579,5,22,0,0,579,580,3,26,13,0,580,581,5,126,0,0,581,582,3, + 140,70,0,582,583,3,140,70,0,583,584,3,142,71,0,584,585,5,124,0,0, + 585,594,1,0,0,0,586,587,5,83,0,0,587,594,5,124,0,0,588,589,5,23, + 0,0,589,590,5,137,0,0,590,591,3,142,71,0,591,592,5,124,0,0,592,594, + 1,0,0,0,593,553,1,0,0,0,593,555,1,0,0,0,593,560,1,0,0,0,593,564, + 1,0,0,0,593,573,1,0,0,0,593,578,1,0,0,0,593,586,1,0,0,0,593,588, + 1,0,0,0,594,59,1,0,0,0,595,596,5,41,0,0,596,598,3,140,70,0,597,599, + 3,22,11,0,598,597,1,0,0,0,598,599,1,0,0,0,599,600,1,0,0,0,600,601, + 5,74,0,0,601,602,3,142,71,0,602,603,5,123,0,0,603,604,3,124,62,0, + 604,605,5,122,0,0,605,606,3,124,62,0,606,607,5,76,0,0,607,609,3, + 72,36,0,608,610,3,64,32,0,609,608,1,0,0,0,609,610,1,0,0,0,610,612, + 1,0,0,0,611,613,3,70,35,0,612,611,1,0,0,0,612,613,1,0,0,0,613,614, + 1,0,0,0,614,615,5,78,0,0,615,617,3,74,37,0,616,618,3,78,39,0,617, + 616,1,0,0,0,617,618,1,0,0,0,618,619,1,0,0,0,619,620,5,124,0,0,620, + 61,1,0,0,0,621,622,5,42,0,0,622,624,3,140,70,0,623,625,3,22,11,0, + 624,623,1,0,0,0,624,625,1,0,0,0,625,626,1,0,0,0,626,627,5,74,0,0, + 627,628,3,142,71,0,628,629,5,123,0,0,629,630,3,124,62,0,630,631, + 5,122,0,0,631,633,3,124,62,0,632,634,3,64,32,0,633,632,1,0,0,0,633, + 634,1,0,0,0,634,636,1,0,0,0,635,637,3,78,39,0,636,635,1,0,0,0,636, + 637,1,0,0,0,637,638,1,0,0,0,638,639,5,124,0,0,639,63,1,0,0,0,640, + 641,5,2,0,0,641,650,5,5,0,0,642,643,5,2,0,0,643,644,7,1,0,0,644, + 645,5,6,0,0,645,646,5,129,0,0,646,647,3,76,38,0,647,648,5,130,0, + 0,648,650,1,0,0,0,649,640,1,0,0,0,649,642,1,0,0,0,650,65,1,0,0,0, + 651,652,5,57,0,0,652,653,5,129,0,0,653,658,3,108,54,0,654,655,5, + 125,0,0,655,657,3,108,54,0,656,654,1,0,0,0,657,660,1,0,0,0,658,656, + 1,0,0,0,658,659,1,0,0,0,659,661,1,0,0,0,660,658,1,0,0,0,661,662, + 5,130,0,0,662,67,1,0,0,0,663,664,5,43,0,0,664,665,3,140,70,0,665, + 666,5,74,0,0,666,667,3,142,71,0,667,668,5,44,0,0,668,669,3,140,70, + 0,669,670,5,123,0,0,670,672,3,124,62,0,671,673,3,78,39,0,672,671, + 1,0,0,0,672,673,1,0,0,0,673,674,1,0,0,0,674,675,5,124,0,0,675,69, + 1,0,0,0,676,677,5,77,0,0,677,678,3,124,62,0,678,71,1,0,0,0,679,680, + 7,2,0,0,680,73,1,0,0,0,681,700,5,80,0,0,682,683,5,35,0,0,683,700, + 3,140,70,0,684,685,5,28,0,0,685,700,3,140,70,0,686,687,5,37,0,0, + 687,696,5,129,0,0,688,693,3,26,13,0,689,690,5,125,0,0,690,692,3, + 26,13,0,691,689,1,0,0,0,692,695,1,0,0,0,693,691,1,0,0,0,693,694, + 1,0,0,0,694,697,1,0,0,0,695,693,1,0,0,0,696,688,1,0,0,0,696,697, + 1,0,0,0,697,698,1,0,0,0,698,700,5,130,0,0,699,681,1,0,0,0,699,682, + 1,0,0,0,699,684,1,0,0,0,699,686,1,0,0,0,700,75,1,0,0,0,701,706,3, + 140,70,0,702,703,5,125,0,0,703,705,3,140,70,0,704,702,1,0,0,0,705, + 708,1,0,0,0,706,704,1,0,0,0,706,707,1,0,0,0,707,77,1,0,0,0,708,706, + 1,0,0,0,709,710,5,79,0,0,710,714,5,127,0,0,711,713,3,80,40,0,712, + 711,1,0,0,0,713,716,1,0,0,0,714,712,1,0,0,0,714,715,1,0,0,0,715, + 717,1,0,0,0,716,714,1,0,0,0,717,718,5,128,0,0,718,79,1,0,0,0,719, + 720,5,15,0,0,720,721,3,140,70,0,721,722,5,74,0,0,722,723,3,142,71, + 0,723,724,5,129,0,0,724,725,3,76,38,0,725,726,5,130,0,0,726,727, + 5,124,0,0,727,784,1,0,0,0,728,729,5,53,0,0,729,730,3,140,70,0,730, + 731,5,74,0,0,731,732,3,142,71,0,732,733,5,123,0,0,733,734,3,124, + 62,0,734,735,3,82,41,0,735,736,5,124,0,0,736,784,1,0,0,0,737,738, + 5,54,0,0,738,739,3,140,70,0,739,740,5,74,0,0,740,741,3,142,71,0, + 741,742,5,123,0,0,742,743,3,130,65,0,743,744,3,48,24,0,744,745,3, + 82,41,0,745,746,5,124,0,0,746,784,1,0,0,0,747,748,5,36,0,0,748,749, + 3,140,70,0,749,750,5,74,0,0,750,751,3,142,71,0,751,752,5,123,0,0, + 752,754,3,140,70,0,753,755,3,28,14,0,754,753,1,0,0,0,754,755,1,0, + 0,0,755,757,1,0,0,0,756,758,3,66,33,0,757,756,1,0,0,0,757,758,1, + 0,0,0,758,759,1,0,0,0,759,760,5,124,0,0,760,784,1,0,0,0,761,762, + 5,43,0,0,762,763,3,140,70,0,763,764,5,74,0,0,764,765,3,142,71,0, + 765,766,5,123,0,0,766,769,3,140,70,0,767,768,5,45,0,0,768,770,3, + 124,62,0,769,767,1,0,0,0,769,770,1,0,0,0,770,771,1,0,0,0,771,772, + 5,124,0,0,772,784,1,0,0,0,773,774,5,14,0,0,774,775,3,140,70,0,775, + 776,5,74,0,0,776,777,3,142,71,0,777,778,5,123,0,0,778,779,3,140, + 70,0,779,780,5,126,0,0,780,781,3,140,70,0,781,782,5,124,0,0,782, + 784,1,0,0,0,783,719,1,0,0,0,783,728,1,0,0,0,783,737,1,0,0,0,783, + 747,1,0,0,0,783,761,1,0,0,0,783,773,1,0,0,0,784,81,1,0,0,0,785,786, + 5,129,0,0,786,791,3,84,42,0,787,788,5,125,0,0,788,790,3,84,42,0, + 789,787,1,0,0,0,790,793,1,0,0,0,791,789,1,0,0,0,791,792,1,0,0,0, + 792,794,1,0,0,0,793,791,1,0,0,0,794,795,5,130,0,0,795,83,1,0,0,0, + 796,797,7,3,0,0,797,85,1,0,0,0,798,799,5,52,0,0,799,800,3,88,44, + 0,800,87,1,0,0,0,801,804,3,90,45,0,802,804,3,94,47,0,803,801,1,0, + 0,0,803,802,1,0,0,0,804,89,1,0,0,0,805,806,5,53,0,0,806,807,3,140, + 70,0,807,808,5,74,0,0,808,809,3,142,71,0,809,810,5,62,0,0,810,811, + 3,140,70,0,811,812,5,123,0,0,812,813,3,124,62,0,813,814,5,63,0,0, + 814,817,3,92,46,0,815,816,5,64,0,0,816,818,3,132,66,0,817,815,1, + 0,0,0,817,818,1,0,0,0,818,819,1,0,0,0,819,820,5,124,0,0,820,91,1, + 0,0,0,821,828,5,96,0,0,822,823,5,97,0,0,823,824,5,131,0,0,824,825, + 3,124,62,0,825,826,5,132,0,0,826,828,1,0,0,0,827,821,1,0,0,0,827, + 822,1,0,0,0,828,93,1,0,0,0,829,830,5,54,0,0,830,831,3,140,70,0,831, + 832,5,74,0,0,832,833,3,142,71,0,833,834,5,127,0,0,834,835,3,96,48, + 0,835,836,3,96,48,0,836,837,5,128,0,0,837,95,1,0,0,0,838,839,3,48, + 24,0,839,840,5,55,0,0,840,841,3,140,70,0,841,842,5,74,0,0,842,843, + 3,142,71,0,843,845,3,130,65,0,844,846,5,102,0,0,845,844,1,0,0,0, + 845,846,1,0,0,0,846,849,1,0,0,0,847,848,5,70,0,0,848,850,3,142,71, + 0,849,847,1,0,0,0,849,850,1,0,0,0,850,852,1,0,0,0,851,853,5,71,0, + 0,852,851,1,0,0,0,852,853,1,0,0,0,853,856,1,0,0,0,854,855,5,72,0, + 0,855,857,3,142,71,0,856,854,1,0,0,0,856,857,1,0,0,0,857,859,1,0, + 0,0,858,860,5,73,0,0,859,858,1,0,0,0,859,860,1,0,0,0,860,861,1,0, + 0,0,861,862,5,124,0,0,862,97,1,0,0,0,863,864,5,46,0,0,864,865,3, + 140,70,0,865,866,5,47,0,0,866,868,3,140,70,0,867,869,3,28,14,0,868, + 867,1,0,0,0,868,869,1,0,0,0,869,872,1,0,0,0,870,871,5,74,0,0,871, + 873,3,142,71,0,872,870,1,0,0,0,872,873,1,0,0,0,873,876,1,0,0,0,874, + 875,5,69,0,0,875,877,5,137,0,0,876,874,1,0,0,0,876,877,1,0,0,0,877, + 878,1,0,0,0,878,882,5,127,0,0,879,881,3,100,50,0,880,879,1,0,0,0, + 881,884,1,0,0,0,882,880,1,0,0,0,882,883,1,0,0,0,883,885,1,0,0,0, + 884,882,1,0,0,0,885,886,5,128,0,0,886,99,1,0,0,0,887,888,5,51,0, + 0,888,893,3,88,44,0,889,893,3,106,53,0,890,893,3,102,51,0,891,893, + 3,104,52,0,892,887,1,0,0,0,892,889,1,0,0,0,892,890,1,0,0,0,892,891, + 1,0,0,0,893,101,1,0,0,0,894,895,5,48,0,0,895,896,3,140,70,0,896, + 897,5,50,0,0,897,898,5,53,0,0,898,899,3,140,70,0,899,900,5,124,0, + 0,900,103,1,0,0,0,901,902,5,59,0,0,902,903,3,140,70,0,903,904,5, + 60,0,0,904,905,5,61,0,0,905,906,5,57,0,0,906,907,5,43,0,0,907,908, + 3,140,70,0,908,909,5,58,0,0,909,910,5,54,0,0,910,911,3,140,70,0, + 911,912,5,126,0,0,912,913,3,140,70,0,913,914,5,124,0,0,914,105,1, + 0,0,0,915,916,5,48,0,0,916,917,3,108,54,0,917,918,5,50,0,0,918,921, + 3,112,56,0,919,920,5,26,0,0,920,922,3,142,71,0,921,919,1,0,0,0,921, + 922,1,0,0,0,922,923,1,0,0,0,923,924,5,124,0,0,924,107,1,0,0,0,925, + 926,3,140,70,0,926,927,5,126,0,0,927,928,3,110,55,0,928,109,1,0, + 0,0,929,941,3,140,70,0,930,941,5,91,0,0,931,941,5,81,0,0,932,941, + 5,82,0,0,933,941,5,88,0,0,934,941,5,89,0,0,935,941,5,90,0,0,936, + 941,5,92,0,0,937,941,5,93,0,0,938,941,5,94,0,0,939,941,5,95,0,0, + 940,929,1,0,0,0,940,930,1,0,0,0,940,931,1,0,0,0,940,932,1,0,0,0, + 940,933,1,0,0,0,940,934,1,0,0,0,940,935,1,0,0,0,940,936,1,0,0,0, + 940,937,1,0,0,0,940,938,1,0,0,0,940,939,1,0,0,0,941,111,1,0,0,0, + 942,943,5,53,0,0,943,944,3,140,70,0,944,945,5,126,0,0,945,946,3, + 114,57,0,946,973,1,0,0,0,947,948,5,54,0,0,948,949,3,140,70,0,949, + 950,5,126,0,0,950,951,3,140,70,0,951,952,5,126,0,0,952,953,3,116, + 58,0,953,973,1,0,0,0,954,955,5,36,0,0,955,957,3,140,70,0,956,958, + 3,28,14,0,957,956,1,0,0,0,957,958,1,0,0,0,958,959,1,0,0,0,959,960, + 5,126,0,0,960,961,3,108,54,0,961,973,1,0,0,0,962,963,5,38,0,0,963, + 964,3,140,70,0,964,965,5,126,0,0,965,967,3,140,70,0,966,968,3,28, + 14,0,967,966,1,0,0,0,967,968,1,0,0,0,968,970,1,0,0,0,969,971,3,118, + 59,0,970,969,1,0,0,0,970,971,1,0,0,0,971,973,1,0,0,0,972,942,1,0, + 0,0,972,947,1,0,0,0,972,954,1,0,0,0,972,962,1,0,0,0,973,113,1,0, + 0,0,974,975,7,4,0,0,975,115,1,0,0,0,976,977,7,5,0,0,977,117,1,0, + 0,0,978,979,5,56,0,0,979,983,5,127,0,0,980,982,3,120,60,0,981,980, + 1,0,0,0,982,985,1,0,0,0,983,981,1,0,0,0,983,984,1,0,0,0,984,986, + 1,0,0,0,985,983,1,0,0,0,986,987,5,128,0,0,987,119,1,0,0,0,988,989, + 3,140,70,0,989,990,5,50,0,0,990,991,5,1,0,0,991,992,5,15,0,0,992, + 993,5,129,0,0,993,994,3,76,38,0,994,995,5,130,0,0,995,996,5,124, + 0,0,996,1070,1,0,0,0,997,998,3,140,70,0,998,999,5,50,0,0,999,1000, + 5,53,0,0,1000,1007,3,140,70,0,1001,1002,5,58,0,0,1002,1003,5,54, + 0,0,1003,1004,3,140,70,0,1004,1005,5,126,0,0,1005,1006,3,140,70, + 0,1006,1008,1,0,0,0,1007,1001,1,0,0,0,1007,1008,1,0,0,0,1008,1009, + 1,0,0,0,1009,1010,5,124,0,0,1010,1070,1,0,0,0,1011,1012,3,140,70, + 0,1012,1013,5,50,0,0,1013,1014,5,54,0,0,1014,1015,3,140,70,0,1015, + 1016,5,126,0,0,1016,1023,3,140,70,0,1017,1018,5,58,0,0,1018,1019, + 5,54,0,0,1019,1020,3,140,70,0,1020,1021,5,126,0,0,1021,1022,3,140, + 70,0,1022,1024,1,0,0,0,1023,1017,1,0,0,0,1023,1024,1,0,0,0,1024, + 1025,1,0,0,0,1025,1026,5,124,0,0,1026,1070,1,0,0,0,1027,1028,3,140, + 70,0,1028,1029,5,50,0,0,1029,1030,5,36,0,0,1030,1032,3,140,70,0, + 1031,1033,3,28,14,0,1032,1031,1,0,0,0,1032,1033,1,0,0,0,1033,1040, + 1,0,0,0,1034,1035,5,58,0,0,1035,1036,5,54,0,0,1036,1037,3,140,70, + 0,1037,1038,5,126,0,0,1038,1039,3,140,70,0,1039,1041,1,0,0,0,1040, + 1034,1,0,0,0,1040,1041,1,0,0,0,1041,1042,1,0,0,0,1042,1043,5,124, + 0,0,1043,1070,1,0,0,0,1044,1045,3,140,70,0,1045,1046,5,50,0,0,1046, + 1047,5,43,0,0,1047,1048,3,140,70,0,1048,1049,5,124,0,0,1049,1070, + 1,0,0,0,1050,1051,3,140,70,0,1051,1053,5,50,0,0,1052,1054,5,1,0, + 0,1053,1052,1,0,0,0,1053,1054,1,0,0,0,1054,1055,1,0,0,0,1055,1056, + 5,14,0,0,1056,1057,3,140,70,0,1057,1058,5,126,0,0,1058,1065,3,140, + 70,0,1059,1060,5,58,0,0,1060,1061,5,54,0,0,1061,1062,3,140,70,0, + 1062,1063,5,126,0,0,1063,1064,3,140,70,0,1064,1066,1,0,0,0,1065, + 1059,1,0,0,0,1065,1066,1,0,0,0,1066,1067,1,0,0,0,1067,1068,5,124, + 0,0,1068,1070,1,0,0,0,1069,988,1,0,0,0,1069,997,1,0,0,0,1069,1011, + 1,0,0,0,1069,1027,1,0,0,0,1069,1044,1,0,0,0,1069,1050,1,0,0,0,1070, + 121,1,0,0,0,1071,1072,5,43,0,0,1072,1073,3,140,70,0,1073,1074,5, + 50,0,0,1074,1075,3,140,70,0,1075,1076,5,126,0,0,1076,1078,3,140, + 70,0,1077,1079,3,118,59,0,1078,1077,1,0,0,0,1078,1079,1,0,0,0,1079, + 1080,1,0,0,0,1080,1081,5,124,0,0,1081,123,1,0,0,0,1082,1129,3,128, + 64,0,1083,1129,5,103,0,0,1084,1129,5,104,0,0,1085,1086,5,105,0,0, + 1086,1129,3,142,71,0,1087,1088,5,106,0,0,1088,1089,5,133,0,0,1089, + 1090,3,140,70,0,1090,1091,5,134,0,0,1091,1129,1,0,0,0,1092,1093, + 5,107,0,0,1093,1094,5,133,0,0,1094,1096,3,140,70,0,1095,1097,3,28, + 14,0,1096,1095,1,0,0,0,1096,1097,1,0,0,0,1097,1098,1,0,0,0,1098, + 1099,5,134,0,0,1099,1129,1,0,0,0,1100,1101,5,31,0,0,1101,1102,5, + 133,0,0,1102,1103,3,140,70,0,1103,1104,5,134,0,0,1104,1129,1,0,0, + 0,1105,1106,5,108,0,0,1106,1107,5,133,0,0,1107,1108,3,124,62,0,1108, + 1109,5,134,0,0,1109,1129,1,0,0,0,1110,1111,5,109,0,0,1111,1112,5, + 133,0,0,1112,1113,3,124,62,0,1113,1114,5,134,0,0,1114,1129,1,0,0, + 0,1115,1116,5,110,0,0,1116,1120,5,127,0,0,1117,1119,3,126,63,0,1118, + 1117,1,0,0,0,1119,1122,1,0,0,0,1120,1118,1,0,0,0,1120,1121,1,0,0, + 0,1121,1123,1,0,0,0,1122,1120,1,0,0,0,1123,1129,5,128,0,0,1124,1126, + 3,140,70,0,1125,1127,3,28,14,0,1126,1125,1,0,0,0,1126,1127,1,0,0, + 0,1127,1129,1,0,0,0,1128,1082,1,0,0,0,1128,1083,1,0,0,0,1128,1084, + 1,0,0,0,1128,1085,1,0,0,0,1128,1087,1,0,0,0,1128,1092,1,0,0,0,1128, + 1100,1,0,0,0,1128,1105,1,0,0,0,1128,1110,1,0,0,0,1128,1115,1,0,0, + 0,1128,1124,1,0,0,0,1129,125,1,0,0,0,1130,1131,3,140,70,0,1131,1132, + 5,123,0,0,1132,1133,3,124,62,0,1133,1134,5,124,0,0,1134,127,1,0, + 0,0,1135,1136,7,6,0,0,1136,129,1,0,0,0,1137,1138,7,7,0,0,1138,131, + 1,0,0,0,1139,1148,3,142,71,0,1140,1148,5,137,0,0,1141,1148,5,138, + 0,0,1142,1148,5,119,0,0,1143,1148,5,120,0,0,1144,1148,5,121,0,0, + 1145,1148,3,134,67,0,1146,1148,3,138,69,0,1147,1139,1,0,0,0,1147, + 1140,1,0,0,0,1147,1141,1,0,0,0,1147,1142,1,0,0,0,1147,1143,1,0,0, + 0,1147,1144,1,0,0,0,1147,1145,1,0,0,0,1147,1146,1,0,0,0,1148,133, + 1,0,0,0,1149,1158,5,127,0,0,1150,1155,3,136,68,0,1151,1152,5,125, + 0,0,1152,1154,3,136,68,0,1153,1151,1,0,0,0,1154,1157,1,0,0,0,1155, + 1153,1,0,0,0,1155,1156,1,0,0,0,1156,1159,1,0,0,0,1157,1155,1,0,0, + 0,1158,1150,1,0,0,0,1158,1159,1,0,0,0,1159,1160,1,0,0,0,1160,1161, + 5,128,0,0,1161,135,1,0,0,0,1162,1163,3,142,71,0,1163,1164,5,123, + 0,0,1164,1165,3,132,66,0,1165,137,1,0,0,0,1166,1175,5,129,0,0,1167, + 1172,3,132,66,0,1168,1169,5,125,0,0,1169,1171,3,132,66,0,1170,1168, + 1,0,0,0,1171,1174,1,0,0,0,1172,1170,1,0,0,0,1172,1173,1,0,0,0,1173, + 1176,1,0,0,0,1174,1172,1,0,0,0,1175,1167,1,0,0,0,1175,1176,1,0,0, + 0,1176,1177,1,0,0,0,1177,1178,5,130,0,0,1178,139,1,0,0,0,1179,1180, + 7,8,0,0,1180,141,1,0,0,0,1181,1182,5,140,0,0,1182,143,1,0,0,0,106, + 156,163,184,196,208,228,236,243,249,261,264,270,281,290,300,303, + 305,309,317,329,334,343,346,361,367,379,388,396,409,412,422,426, + 432,439,445,453,461,474,481,485,490,501,507,517,522,528,539,566, + 593,598,609,612,617,624,633,636,649,658,672,693,696,699,706,714, + 754,757,769,783,791,803,817,827,845,849,852,856,859,868,872,876, + 882,892,921,940,957,967,970,972,983,1007,1023,1032,1040,1053,1065, + 1069,1078,1096,1120,1126,1128,1147,1155,1158,1172,1175 ]; private static __ATN: antlr.ATN; @@ -5664,6 +5928,9 @@ export class OperationMemberContext extends antlr.ParserRuleContext { public STATIC(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.STATIC, 0); } + public executionClause(): ExecutionClauseContext | null { + return this.getRuleContext(0, ExecutionClauseContext); + } public override get ruleIndex(): number { return QuixosCapabilityParser.RULE_operationMember; } @@ -5758,6 +6025,9 @@ export class ValueMemberOperationContext extends antlr.ParserRuleContext { public SEMI(): antlr.TerminalNode { return this.getToken(QuixosCapabilityParser.SEMI, 0)!; } + public executionClause(): ExecutionClauseContext | null { + return this.getRuleContext(0, ExecutionClauseContext); + } public SET(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.SET, 0); } @@ -5861,6 +6131,9 @@ export class QueryReadContractContext extends antlr.ParserRuleContext { public RPC(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.RPC, 0); } + public PORTABLE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.PORTABLE, 0); + } public override get ruleIndex(): number { return QuixosCapabilityParser.RULE_queryReadContract; } @@ -5902,6 +6175,9 @@ export class RelationshipOperationContext extends antlr.ParserRuleContext { public SEMI(): antlr.TerminalNode { return this.getToken(QuixosCapabilityParser.SEMI, 0)!; } + public executionClause(): ExecutionClauseContext | null { + return this.getRuleContext(0, ExecutionClauseContext); + } public CONNECT(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.CONNECT, 0); } @@ -6178,17 +6454,17 @@ export class QueryClauseContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); } - public FRAGMENTS(): antlr.TerminalNode | null { - return this.getToken(QuixosCapabilityParser.FRAGMENTS, 0); - } - public stringLiteral(): StringLiteralContext | null { - return this.getRuleContext(0, StringLiteralContext); + public REPLICA(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.REPLICA, 0); } public SEMI(): antlr.TerminalNode { return this.getToken(QuixosCapabilityParser.SEMI, 0)!; } - public VIEW(): antlr.TerminalNode | null { - return this.getToken(QuixosCapabilityParser.VIEW, 0); + public LOCAL(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.LOCAL, 0); + } + public FROM(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.FROM, 0); } public identifier(): IdentifierContext[]; public identifier(i: number): IdentifierContext | null; @@ -6199,6 +6475,15 @@ export class QueryClauseContext extends antlr.ParserRuleContext { return this.getRuleContext(i, IdentifierContext); } + public FRAGMENTS(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.FRAGMENTS, 0); + } + public stringLiteral(): StringLiteralContext | null { + return this.getRuleContext(0, StringLiteralContext); + } + public VIEW(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.VIEW, 0); + } public AS(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.AS, 0); } @@ -6288,6 +6573,9 @@ export class PackageOperationExportContext extends antlr.ParserRuleContext { public typeParameters(): TypeParametersContext | null { return this.getRuleContext(0, TypeParametersContext); } + public executionClause(): ExecutionClauseContext | null { + return this.getRuleContext(0, ExecutionClauseContext); + } public eventClause(): EventClauseContext | null { return this.getRuleContext(0, EventClauseContext); } @@ -6344,6 +6632,9 @@ export class PackageFunctionExportContext extends antlr.ParserRuleContext { public typeParameters(): TypeParametersContext | null { return this.getRuleContext(0, TypeParametersContext); } + public executionClause(): ExecutionClauseContext | null { + return this.getRuleContext(0, ExecutionClauseContext); + } public dependencyBlock(): DependencyBlockContext | null { return this.getRuleContext(0, DependencyBlockContext); } @@ -6360,6 +6651,91 @@ export class PackageFunctionExportContext extends antlr.ParserRuleContext { } +export class ExecutionClauseContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public EXECUTION(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.EXECUTION, 0)!; + } + public REMOTE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.REMOTE, 0); + } + public TARGETS(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.TARGETS, 0); + } + public LBRACK(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.LBRACK, 0); + } + public identifierList(): IdentifierListContext | null { + return this.getRuleContext(0, IdentifierListContext); + } + public RBRACK(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.RBRACK, 0); + } + public SNAPSHOT(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.SNAPSHOT, 0); + } + public TRANSACTION(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.TRANSACTION, 0); + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_executionClause; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitExecutionClause) { + return visitor.visitExecutionClause(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class SelectedOperationsContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public USING(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.USING, 0)!; + } + public LBRACK(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.LBRACK, 0)!; + } + public memberOperationRef(): MemberOperationRefContext[]; + public memberOperationRef(i: number): MemberOperationRefContext | null; + public memberOperationRef(i?: number): MemberOperationRefContext[] | MemberOperationRefContext | null { + if (i === undefined) { + return this.getRuleContexts(MemberOperationRefContext); + } + + return this.getRuleContext(i, MemberOperationRefContext); + } + public RBRACK(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.RBRACK, 0)!; + } + public COMMA(): antlr.TerminalNode[]; + public COMMA(i: number): antlr.TerminalNode | null; + public COMMA(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(QuixosCapabilityParser.COMMA); + } else { + return this.getToken(QuixosCapabilityParser.COMMA, i); + } + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_selectedOperations; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitSelectedOperations) { + return visitor.visitSelectedOperations(this); + } else { + return visitor.visitChildren(this); + } + } +} + + export class PackageConstructorExportContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); @@ -6652,6 +7028,9 @@ export class DependencyPortContext extends antlr.ParserRuleContext { public typeArguments(): TypeArgumentsContext | null { return this.getRuleContext(0, TypeArgumentsContext); } + public selectedOperations(): SelectedOperationsContext | null { + return this.getRuleContext(0, SelectedOperationsContext); + } public CONSTRUCTOR(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.CONSTRUCTOR, 0); } diff --git a/src/capability-language/generated/QuixosCapabilityVisitor.ts b/src/capability-language/generated/QuixosCapabilityVisitor.ts index c852287..3c2cd20 100644 --- a/src/capability-language/generated/QuixosCapabilityVisitor.ts +++ b/src/capability-language/generated/QuixosCapabilityVisitor.ts @@ -34,6 +34,8 @@ import { PackageQuerySpecializationContext } from "./QuixosCapabilityParser.js"; import { QueryClauseContext } from "./QuixosCapabilityParser.js"; import { PackageOperationExportContext } from "./QuixosCapabilityParser.js"; import { PackageFunctionExportContext } from "./QuixosCapabilityParser.js"; +import { ExecutionClauseContext } from "./QuixosCapabilityParser.js"; +import { SelectedOperationsContext } from "./QuixosCapabilityParser.js"; import { PackageConstructorExportContext } from "./QuixosCapabilityParser.js"; import { EventClauseContext } from "./QuixosCapabilityParser.js"; import { OperationModeContext } from "./QuixosCapabilityParser.js"; @@ -274,6 +276,18 @@ export class QuixosCapabilityVisitor extends AbstractParseTreeVisitor Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.executionClause`. + * @param ctx the parse tree + * @return the visitor result + */ + visitExecutionClause?: (ctx: ExecutionClauseContext) => Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.selectedOperations`. + * @param ctx the parse tree + * @return the visitor result + */ + visitSelectedOperations?: (ctx: SelectedOperationsContext) => Result; /** * Visit a parse tree produced by `QuixosCapabilityParser.packageConstructorExport`. * @param ctx the parse tree diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index 2a9a6ee..f4943ed 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -13,6 +13,7 @@ import { cardinalityValueType, compileWorkspaceRevision, valueType, + type ExecutionContract, type AtomId, type BoundDependency, type CompiledWorkspaceRevision, @@ -57,6 +58,7 @@ import { specializeQueryTemplate } from "../query/templates.js"; import { QuixosCapabilityLexer } from "./generated/QuixosCapabilityLexer.js"; import { QuixosCapabilityParser, + type ExecutionClauseContext, type AttachmentDeclContext, type ConformanceDeclContext, type DependencyBindingBlockContext, @@ -361,6 +363,38 @@ const lowerValueType = (state: LoweringState, context: ValueTypeContext | null): return valueType.unit; }; +const lowerSelectedOperations = ( + state: LoweringState, + context: DependencyPortContext, + target: InterfaceSymbol | undefined, +): { operations?: InterfaceOperation["id"][] } => { + const selected = context.selectedOperations(); + if (!selected) return {}; + const operations = selected.memberOperationRef().flatMap((reference) => { + const name = identifier(reference.identifier()); + const member = target && requireSymbol(state, target.members, name, reference, "interface member"); + const operation = + member && + requireSymbol(state, member.operations, text(reference.operationName()), reference, "interface operation"); + return operation ? [operation] : []; + }); + if (new Set(operations).size !== operations.length) + loweringIssue(state, context, "duplicate-operation-selection", "Interface operation selection contains duplicates"); + return { operations }; +}; + +const lowerExecution = (context: ExecutionClauseContext | null): { execution?: ExecutionContract } => { + if (!context) return {}; + return { + execution: context.REMOTE() + ? { kind: "remote" } + : { + kind: context.SNAPSHOT() ? "snapshot" : "transaction", + targets: context.identifierList()!.identifier().map(identifier), + }, + }; +}; + const valueOperation = (displayName: string, id: InterfaceOperation["id"], value: ValueType): InterfaceOperation => { switch (displayName) { case "get": @@ -456,13 +490,15 @@ const lowerValueMember = (state: LoweringState, context: ValueMemberContext): In const operations: InterfaceOperation[] = []; for (const operation of context.valueMemberOperation()) { if (operation.GET()) { - operations.push( - valueOperation("get", capabilityId.operation(stringValue(operation.stringLiteral(0))), memberValueType), - ); + operations.push({ + ...valueOperation("get", capabilityId.operation(stringValue(operation.stringLiteral(0))), memberValueType), + ...lowerExecution(operation.executionClause()), + }); } else if (operation.SET()) { - operations.push( - valueOperation("set", capabilityId.operation(stringValue(operation.stringLiteral(0))), memberValueType), - ); + operations.push({ + ...valueOperation("set", capabilityId.operation(stringValue(operation.stringLiteral(0))), memberValueType), + ...lowerExecution(operation.executionClause()), + }); } else { operations.push( valueOperation("watch-start", capabilityId.operation(stringValue(operation.stringLiteral(0))), memberValueType), @@ -475,7 +511,11 @@ const lowerValueMember = (state: LoweringState, context: ValueMemberContext): In ...(context.queryReadContract() ? { queryRead: { - execution: context.queryReadContract()!.RPC() ? ("rpc-permitted" as const) : ("native" as const), + execution: context.queryReadContract()!.RPC() + ? ("rpc-permitted" as const) + : context.queryReadContract()!.PORTABLE() + ? ("portable" as const) + : ("native" as const), }, } : {}), @@ -540,6 +580,8 @@ const lowerRelationshipMember = ( ), ); } + if (operation.executionClause()) + Object.assign(operations[operations.length - 1]!, lowerExecution(operation.executionClause())); } return { kind: "relationship", @@ -547,7 +589,11 @@ const lowerRelationshipMember = ( ...(context.queryReadContract() ? { queryRead: { - execution: context.queryReadContract()!.RPC() ? ("rpc-permitted" as const) : ("native" as const), + execution: context.queryReadContract()!.RPC() + ? ("rpc-permitted" as const) + : context.queryReadContract()!.PORTABLE() + ? ("portable" as const) + : ("native" as const), }, } : {}), @@ -577,6 +623,7 @@ const lowerOperationMember = (state: LoweringState, context: OperationMemberCont outputType, mode: "call", ...(context.STATIC() ? { scope: "class" as const } : {}), + ...lowerExecution(context.executionClause()), }, ], }; @@ -699,7 +746,11 @@ const lowerInterfaceTemplate = ( ...(value.queryReadContract() ? { queryRead: { - execution: value.queryReadContract()!.RPC() ? ("rpc-permitted" as const) : ("native" as const), + execution: value.queryReadContract()!.RPC() + ? ("rpc-permitted" as const) + : value.queryReadContract()!.PORTABLE() + ? ("portable" as const) + : ("native" as const), }, } : {}), @@ -708,8 +759,14 @@ const lowerInterfaceTemplate = ( valueType: type, operations: value.valueMemberOperation().flatMap((operation) => { const id = capabilityId.operation(stringValue(operation.stringLiteral(0))); - if (operation.GET()) return [signature("get", id, valueType.unit, type)]; - if (operation.SET()) return [signature("set", id, type, valueType.unit)]; + if (operation.GET()) + return [ + { ...signature("get", id, valueType.unit, type), ...lowerExecution(operation.executionClause()) }, + ]; + if (operation.SET()) + return [ + { ...signature("set", id, type, valueType.unit), ...lowerExecution(operation.executionClause()) }, + ]; return [ signature("watch-start", id, valueType.unit, valueType.watchHandle, "watch-start", type), signature( @@ -742,6 +799,7 @@ const lowerInterfaceTemplate = ( outputType, ), ...(operation.STATIC() ? { scope: "class" as const } : {}), + ...lowerExecution(operation.executionClause()), }, ], }; @@ -762,7 +820,11 @@ const lowerInterfaceTemplate = ( ...(relationship.queryReadContract() ? { queryRead: { - execution: relationship.queryReadContract()!.RPC() ? ("rpc-permitted" as const) : ("native" as const), + execution: relationship.queryReadContract()!.RPC() + ? ("rpc-permitted" as const) + : relationship.queryReadContract()!.PORTABLE() + ? ("portable" as const) + : ("native" as const), }, } : {}), @@ -773,9 +835,17 @@ const lowerInterfaceTemplate = ( ordered: Boolean(relationship.ORDERED()), operations: relationship.relationshipOperation().flatMap((operation) => { const id = capabilityId.operation(stringValue(operation.stringLiteral(0))); - if (operation.RESOLVE()) return [signature("resolve", id, valueType.unit, resolved)]; + if (operation.RESOLVE()) + return [ + { ...signature("resolve", id, valueType.unit, resolved), ...lowerExecution(operation.executionClause()) }, + ]; if (operation.CONNECT() || operation.DISCONNECT()) - return [signature(operation.CONNECT() ? "connect" : "disconnect", id, targetType, valueType.unit)]; + return [ + { + ...signature(operation.CONNECT() ? "connect" : "disconnect", id, targetType, valueType.unit), + ...lowerExecution(operation.executionClause()), + }, + ]; return [ signature("watch-start", id, valueType.unit, valueType.watchHandle, "watch-start", resolved), signature( @@ -933,6 +1003,7 @@ const lowerDependencyPort = (state: LoweringState, context: DependencyPortContex requirement: { kind: "interface", interfaceRevisionId: target.revisionId, + ...lowerSelectedOperations(state, context, target), }, } : undefined; @@ -1036,6 +1107,7 @@ const lowerPackageOperation = ( inputType: lowerValueType(state, context.valueType(0)), outputType: lowerValueType(state, context.valueType(1)), mode: text(context.operationMode()) as InterfaceOperationMode, + ...lowerExecution(context.executionClause()), eventType: event ? lowerValueType(state, event.valueType()) : undefined, receiverRequirement: lowerReceiver(state, context.receiverRequirement()), dependencyPorts: ports, @@ -1052,6 +1124,7 @@ const lowerPackageFunction = ( const alias = identifier(context.identifier()); const entry: PackageExport = { kind: "function", + ...lowerExecution(context.executionClause()), id: capabilityId.packageExport(stringValue(context.stringLiteral())), displayName: alias, inputType: lowerValueType(state, context.valueType(0)), @@ -1143,6 +1216,7 @@ const lowerGenericPackageExport = ( requirement: { kind: "interface", application: state.types.interfaceByName(identifier(port.identifier(1)), port.typeArguments()), + ...lowerSelectedOperations(state, port, state.interfaces.get(identifier(port.identifier(1)))), }, }; const name = identifier(port.identifier(1)), @@ -1186,6 +1260,7 @@ const lowerGenericPackageExport = ( displayName: identifier(context.identifier()), parameters, kind: operation ? "operation" : "function", + ...lowerExecution(context.executionClause()), inputType: state.types.expression(context.valueType(0)!), outputType: state.types.expression(context.valueType(1)!), dependencyPorts, @@ -1275,7 +1350,22 @@ const lowerPackage = ( }; const assigned = new Set(); for (const clause of query.queryClause()) { - if (clause.FRAGMENTS()) declaration.fragments.push(stringValue(clause.stringLiteral()!)); + if (clause.REPLICA() || clause.LOCAL()) { + if (declaration.placement) + loweringIssue(state, clause, "duplicate-query-placement", "Declare query placement once"); + else if (clause.REPLICA()) declaration.placement = { kind: "replica" }; + else { + const name = identifier(clause.identifier(0)); + const sourceQueryId = requireSymbol( + state, + state.packages.get(alias)!.queries!, + name, + clause, + "replica query", + ); + if (sourceQueryId) declaration.placement = { kind: "local", sourceQueryId }; + } + } else if (clause.FRAGMENTS()) declaration.fragments.push(stringValue(clause.stringLiteral()!)); else if (clause.VIEW()) { const name = identifier(clause.identifier(0)); if (parameters.length) { @@ -1952,7 +2042,7 @@ const interfaceSymbolFor = (revision: InterfaceRevision): InterfaceSymbol => ({ revisionId: revision.revisionId, contractAvailable: true, members: new Map( - revision.members.map((member) => [ + (revision.template?.members ?? revision.members).map((member) => [ member.displayName, { memberId: member.id, diff --git a/src/capability-model/execution.ts b/src/capability-model/execution.ts new file mode 100644 index 0000000..6434688 --- /dev/null +++ b/src/capability-model/execution.ts @@ -0,0 +1,139 @@ +import type { ExecutionContract, InterfaceOperation, WorkspaceRevision } from "./types.js"; +import type { CapabilityValidationIssue } from "./validation.js"; +import { resolveForwardedBinding } from "./forwarding.js"; + +/** Validate declared effects and targets; this is not a JavaScript purity proof. */ +export function validateExecutionContracts(workspace: WorkspaceRevision): CapabilityValidationIssue[] { + const issues: CapabilityValidationIssue[] = []; + const fail = (path: string, message: string) => issues.push({ code: "invalid-execution-contract", path, message }); + const interfaces = new Map(workspace.interfaceImports.map((i) => [i.revisionId, i])); + const packages = new Map(workspace.packageImports.map((p) => [p.revisionId, p])); + const operations = (id: InterfaceOperation["id"], revision: WorkspaceRevision["interfaceImports"][number]) => + (revision.template?.members ?? revision.members).flatMap((m) => m.operations).find((o) => o.id === id); + const check = (contract: ExecutionContract | undefined, path: string) => { + if (!contract || contract.kind === "remote") return; + if ( + !["snapshot", "transaction"].includes(contract.kind) || + !Array.isArray(contract.targets) || + !contract.targets.length || + contract.targets.some((t) => typeof t !== "string" || !t.trim()) || + new Set(contract.targets).size !== contract.targets.length + ) + fail(path, "Portable execution requires a nonempty set of distinct target names"); + }; + const supports = ( + requested: ExecutionContract | undefined, + provided: ExecutionContract | undefined, + path: string, + ) => { + if (!requested || requested.kind === "remote") return; + if (!provided || provided.kind === "remote") { + fail(path, "Portable execution depends on a remote-only operation"); + return; + } + if (requested.kind === "snapshot" && provided.kind !== "snapshot") + fail(path, "Snapshot execution cannot perform a transaction"); + for (const target of requested.targets ?? []) + if (!provided.targets?.includes(target)) fail(path, `Dependency does not provide execution target ${target}`); + }; + for (const revision of workspace.interfaceImports) + for (const member of revision.template?.members ?? revision.members) { + for (const operation of member.operations) { + check(operation.execution, `${revision.revisionId}/${operation.id}`); + if (operation.execution && operation.execution.kind !== "remote" && operation.mode !== "call") + fail( + `${revision.revisionId}/${operation.id}`, + "Watch lifecycle operations are remote; portable reads use snapshots", + ); + } + if (member.kind !== "operation" && member.queryRead?.execution === "portable") { + const getter = member.operations.find((o) => o.displayName === (member.kind === "value" ? "get" : "resolve")); + if (getter?.execution?.kind !== "snapshot") + fail(`${revision.revisionId}/${member.id}`, "Queryable portable members require a snapshot getter"); + } + } + for (const revision of workspace.packageImports) { + for (const entry of [...revision.exports, ...(revision.genericExports ?? [])]) { + const path = `${revision.revisionId}/${entry.id}`; + check(entry.execution, path); + for (const port of entry.dependencyPorts) { + const requirement = port.requirement; + const portPath = `${path}/${port.id}`; + if (requirement.kind === "interface") { + const contract = interfaces.get( + "interfaceRevisionId" in requirement + ? requirement.interfaceRevisionId + : requirement.application.definitionId, + ); + const selected = requirement.operations; + if (selected && (!selected.length || new Set(selected).size !== selected.length)) + fail(portPath, "Selected interface operations must be nonempty and distinct"); + for (const id of selected ?? []) + if (contract && !operations(id, contract)) fail(portPath, `Unknown selected operation ${id}`); + if (entry.execution && entry.execution.kind !== "remote") { + if (!selected) fail(portPath, "Portable interface ports must select their required operations"); + for (const id of selected ?? []) + if (contract) supports(entry.execution, operations(id, contract)?.execution, portPath); + } + } + if (!entry.execution || entry.execution.kind === "remote") continue; + if (requirement.kind === "state" || requirement.kind === "edge") { + const read = requirement.kind === "state" ? "read" : "resolve"; + for (const primitive of requirement.primitives) { + if (primitive.startsWith("watch")) + fail(portPath, "Portable operations cannot acquire watch lifecycle primitives"); + else if (entry.execution.kind === "snapshot" && primitive !== read) + fail(portPath, "Snapshot operations cannot acquire write primitives"); + } + } else if (requirement.kind === "query") { + const query = packages.get(requirement.packageRevisionId)?.queries?.find((q) => q.id === requirement.queryId); + if (query?.placement?.kind !== "local") + fail(portPath, "Portable operations require a local query dependency"); + } else if (requirement.kind !== "interface") + fail(portPath, `Portable execution does not support ${requirement.kind} dependencies`); + } + } + for (const query of revision.queries ?? []) + if (query.placement?.kind === "local") { + const sourceQueryId = query.placement.sourceQueryId; + const source = revision.queries?.find((q) => q.id === sourceQueryId); + if (source?.placement?.kind !== "replica") + fail(`${revision.revisionId}/${query.id}`, "Local queries must name a replica query in the same package"); + } + } + for (const conformance of workspace.conformances) { + const revision = interfaces.get(conformance.interfaceRevisionId); + if (!revision) continue; + for (const entry of conformance.operationBindings) { + const operation = operations(entry.operationId, revision); + if (!operation?.execution || operation.execution.kind === "remote") continue; + const path = `${conformance.atomId}/${revision.revisionId}/${entry.operationId}`; + let binding; + try { + binding = resolveForwardedBinding( + workspace, + conformance.atomId, + revision.revisionId, + entry.operationId, + ).binding; + } catch { + continue; + } // Ordinary binding validation reports unresolved references and cycles. + if (entry.binding.kind === "interface") { + const target = interfaces.get(entry.binding.interfaceRevisionId); + if (target) supports(operation.execution, operations(entry.binding.operationId, target)?.execution, path); + } + if (binding.kind === "package") { + const provider = packages.get(binding.packageRevisionId)?.exports.find((e) => e.id === binding.exportId); + supports(operation.execution, provider?.execution, path); + } else { + const read = binding.kind === "state" ? "read" : "resolve"; + if (binding.primitive.startsWith("watch")) + fail(path, "Portable operations cannot bind watch lifecycle primitives"); + else if (operation.execution.kind === "snapshot" && binding.primitive !== read) + fail(path, "Snapshot operations cannot bind write primitives"); + } + } + } + return issues; +} diff --git a/src/capability-model/generic-packages.ts b/src/capability-model/generic-packages.ts index 0e2583c..bf76e71 100644 --- a/src/capability-model/generic-packages.ts +++ b/src/capability-model/generic-packages.ts @@ -34,11 +34,16 @@ export type GenericDependencyPort = Omit & { cardinality: Extract["cardinality"]; primitives: Extract["primitives"]; } - | { kind: "interface"; application: InterfaceApplicationExpression } + | { + kind: "interface"; + application: InterfaceApplicationExpression; + operations?: import("./types.js").OperationId[]; + } | { kind: "constructor"; target: ObjectTypeExpression; inputType: ValueTypeExpression }; }; export interface GenericPackageExport { + execution?: import("./types.js").ExecutionContract; id: PackageExportId; displayName: string; parameters: TypeParameter[]; @@ -90,7 +95,11 @@ export const specializePackageExport = ( case "interface": return { ...port, - requirement: { kind: "interface", interfaceRevisionId: substitution.application(requirement.application) }, + requirement: { + kind: "interface", + interfaceRevisionId: substitution.application(requirement.application), + ...(requirement.operations ? { operations: requirement.operations } : {}), + }, }; case "constructor": { const target = substitution.object(requirement.target); @@ -112,6 +121,7 @@ export const specializePackageExport = ( } }); const common = { + ...(definition.execution ? { execution: structuredClone(definition.execution) } : {}), id: capabilityId.packageExport(`export-application:sha256:${digest}`), displayName: `${definition.displayName}$${digest}`, inputType: substitution.value(definition.inputType), diff --git a/src/capability-model/types.ts b/src/capability-model/types.ts index 0dc2acb..4818713 100644 --- a/src/capability-model/types.ts +++ b/src/capability-model/types.ts @@ -104,7 +104,11 @@ export interface AtomDefinition { export type InterfaceOperationMode = "call" | "watch-start" | "watch-stop" | "subscribe" | "unsubscribe"; +/** Omission has remote semantics; availability never strengthens an imported contract. */ +export type ExecutionContract = { kind: "remote" } | { kind: "snapshot" | "transaction"; targets: string[] }; + export interface InterfaceOperation { + execution?: ExecutionContract; id: OperationId; displayName: string; inputType: Type; @@ -116,7 +120,7 @@ export interface InterfaceOperation { eventType?: Type; } -export type QueryReadContract = { execution: "native" | "rpc-permitted" }; +export type QueryReadContract = { execution: "native" | "rpc-permitted" | "portable" }; interface InterfaceMemberBase { id: MemberId; @@ -239,6 +243,8 @@ export type DependencyPortRequirement = | { kind: "interface"; interfaceRevisionId: InterfaceRevisionId; + /** Exact public operation identities, not implementation export names. */ + operations?: OperationId[]; } | { kind: "constructor"; atomId: AtomId; inputType?: ValueType }; @@ -249,6 +255,7 @@ export interface DependencyPort { } interface PackageExportBase { + execution?: ExecutionContract; id: PackageExportId; displayName: string; inputType: ValueType; diff --git a/src/capability-model/validation.ts b/src/capability-model/validation.ts index 41c6bc8..a7f9fe6 100644 --- a/src/capability-model/validation.ts +++ b/src/capability-model/validation.ts @@ -1,3 +1,4 @@ +import { validateExecutionContracts } from "./execution.js"; import { resolveForwardedBinding, type ConcreteBinding } from "./forwarding.js"; import type { AtomConstructorBinding, @@ -41,6 +42,7 @@ import { specializePackageExport } from "./generic-packages.js"; import { isDeepStrictEqual } from "node:util"; export type CapabilityValidationIssueCode = + | "invalid-execution-contract" | "invalid-query-contract" | "query-provider-reason-required" | "invalid-semantic-major" @@ -521,7 +523,7 @@ const collectIdentityIndexes = ( if (member.kind !== "operation" && member.queryRead) { const contract = member.queryRead.execution; const getter = member.kind === "value" ? "get" : "resolve"; - if (contract !== "native" && contract !== "rpc-permitted") + if (contract !== "native" && contract !== "rpc-permitted" && contract !== "portable") issue(issues, "invalid-query-contract", memberPath, "Unknown query execution contract"); if (member.operations.filter((operation) => operation.displayName === getter).length !== 1) issue(issues, "invalid-query-contract", memberPath, `Queryable members require exactly one ${getter}`); @@ -1590,7 +1592,7 @@ const validateConformances = ( bindingPath, "This queryable contract requires a native read binding; a justification cannot weaken it", ); - else if (!native && !entry.queryReason?.trim()) + else if (!native && member.queryRead.execution === "rpc-permitted" && !entry.queryReason?.trim()) issue( issues, "query-provider-reason-required", @@ -2082,6 +2084,7 @@ export const validateWorkspaceRevision = (workspace: WorkspaceRevision): Capabil validatePackages(workspace, issues, indexes); validateConformances(workspace, issues, indexes); validateConstructors(workspace, issues, indexes); + issues.push(...validateExecutionContracts(workspace)); return issues; }; diff --git a/src/gen/camino/schema_pb.ts b/src/gen/camino/schema_pb.ts index 1315059..aa0730a 100644 --- a/src/gen/camino/schema_pb.ts +++ b/src/gen/camino/schema_pb.ts @@ -10,7 +10,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file camino/schema.proto. */ export const file_camino_schema: GenFile = /*@__PURE__*/ - fileDesc("ChNjYW1pbm8vc2NoZW1hLnByb3RvEgZjYW1pbm8iNwoOQXRvbURlZmluaXRpb24SDwoHYXRvbV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkiWQoPQXRvbUNvbmZvcm1hbmNlEg8KB2F0b21faWQYASABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAIgASgJEhYKDmNvbmZvcm1hbmNlX2lkGAMgASgJIsIBCg9TdGF0ZUF0dGFjaG1lbnQSDwoHc2xvdF9pZBgBIAEoCRIYChBhdHRhY2hlZF9hdG9tX2lkGAIgASgJEhQKDGRpc3BsYXlfbmFtZRgDIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YBCABKAkSGwoTc3RvcmFnZV9wb2xpY3lfanNvbhgFIAEoCRIaChJkZWZhdWx0X3ZhbHVlX2pzb24YBiABKAkSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYByABKAkiUAoSRW5kcG9pbnRDb25zdHJhaW50EhEKB2F0b21faWQYASABKAlIABIfChVpbnRlcmZhY2VfcmV2aXNpb25faWQYAiABKAlIAEIGCgRraW5kIvsBCgxFZGdlRW5kcG9pbnQSFQoNcHJvamVjdGlvbl9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSLgoKY29uc3RyYWludBgDIAEoCzIaLmNhbWluby5FbmRwb2ludENvbnN0cmFpbnQSKAoLY2FyZGluYWxpdHkYBCABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSDwoHb3JkZXJlZBgFIAEoCBIRCglvbl9kZWxldGUYBiABKAkSFAoMcmV0YWluX290aGVyGAcgASgIEhAKCGtleV90eXBlGAggASgJEhgKEHB1YmxpY190cmF2ZXJzYWwYCSABKAgipQEKDkVkZ2VBdHRhY2htZW50EhQKDGVkZ2VfdHlwZV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSIwoFZmlyc3QYAyABKAsyFC5jYW1pbm8uRWRnZUVuZHBvaW50EiQKBnNlY29uZBgEIAEoCzIULmNhbWluby5FZGdlRW5kcG9pbnQSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYBSABKAkilQIKD1BlcnNpc3RlbmNlUGxhbhIUCgx3b3Jrc3BhY2VfaWQYASABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAIgASgJEiUKBWF0b21zGAMgAygLMhYuY2FtaW5vLkF0b21EZWZpbml0aW9uEi0KDGNvbmZvcm1hbmNlcxgEIAMoCzIXLmNhbWluby5BdG9tQ29uZm9ybWFuY2USJwoGc3RhdGVzGAUgAygLMhcuY2FtaW5vLlN0YXRlQXR0YWNobWVudBIlCgVlZGdlcxgGIAMoCzIWLmNhbWluby5FZGdlQXR0YWNobWVudBInCgdxdWVyaWVzGAcgAygLMhYuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5Ip4BCg1RdWVyeUFyZ3VtZW50EhIKCHZhcmlhYmxlGAEgASgJSAASFgoMbGl0ZXJhbF9qc29uGAIgASgJSAASKQoEbGlzdBgDIAEoCzIZLmNhbWluby5RdWVyeUFyZ3VtZW50TGlzdEgAEi0KBm9iamVjdBgEIAEoCzIbLmNhbWluby5RdWVyeUFyZ3VtZW50T2JqZWN0SABCBwoFdmFsdWUiOgoRUXVlcnlBcmd1bWVudExpc3QSJQoGdmFsdWVzGAEgAygLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQilAEKE1F1ZXJ5QXJndW1lbnRPYmplY3QSNwoGZmllbGRzGAEgAygLMicuY2FtaW5vLlF1ZXJ5QXJndW1lbnRPYmplY3QuRmllbGRzRW50cnkaRAoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQ6AjgBIkcKDlF1ZXJ5Q29uZGl0aW9uEg8KB2luY2x1ZGUYASABKAgSJAoFdmFsdWUYAiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCLUAwoOUXVlcnlTZWxlY3Rpb24SDAoEbmFtZRgBIAEoCRILCgNrZXkYAiABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAMgASgJEhEKCW1lbWJlcl9pZBgEIAEoCRIkChx0YXJnZXRfaW50ZXJmYWNlX3JldmlzaW9uX2lkGAUgASgJEioKCmNvbmRpdGlvbnMYBiADKAsyFi5jYW1pbm8uUXVlcnlDb25kaXRpb24SOAoJYXJndW1lbnRzGAcgAygLMiUuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uLkFyZ3VtZW50c0VudHJ5EikKCXNlbGVjdGlvbhgIIAMoCzIWLmNhbWluby5RdWVyeVNlbGVjdGlvbhIvCgpyZWxhdGlvbmFsGAkgASgLMhsuY2FtaW5vLlF1ZXJ5UmVsYXRpb25hbFBsYW4SKQoJcHJlZGljYXRlGAogASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEhkKEWxpdmVfc2VsZWN0aW9uX2lkGAsgASgJGkcKDkFyZ3VtZW50c0VudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50OgI4ASJqCg1RdWVyeVBhdGhTdGVwEhAKBnNvdXJjZRgBIAEoCEgAEhAKBnRhcmdldBgCIAEoCEgAEi0KCHJlbGF0aW9uGAMgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoSABCBgoEc3RlcCJ9ChFRdWVyeVJlbGF0aW9uUGF0aBIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEQoJbWVtYmVyX2lkGAIgASgJEiQKHHRhcmdldF9pbnRlcmZhY2VfcmV2aXNpb25faWQYAyABKAkSEAoIb3B0aW9uYWwYBCABKAgiRQoRUXVlcnlGaWVsZE9wZXJhbmQSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhEKCW1lbWJlcl9pZBgCIAEoCSK2AQoPUXVlcnlFeHByZXNzaW9uEiMKBHBhdGgYASADKAsyFS5jYW1pbm8uUXVlcnlQYXRoU3RlcBIqCgVmaWVsZBgCIAEoCzIZLmNhbWluby5RdWVyeUZpZWxkT3BlcmFuZEgAEg0KA3JlZhgDIAEoCUgAEg8KBWVudHJ5GAQgASgISAASEQoHbWFwX2tleRgFIAEoCEgAEhcKD3ZhbHVlX3R5cGVfanNvbhgGIAEoCUIGCgRsZWFmIoUBCg5RdWVyeVJlZHVjdGlvbhIwCghvcGVyYXRvchgBIAEoDjIeLmNhbWluby5RdWVyeUFnZ3JlZ2F0ZU9wZXJhdG9yEigKB29wZXJhbmQYAiABKAsyFy5jYW1pbm8uUXVlcnlFeHByZXNzaW9uEhcKD3ZhbHVlX3R5cGVfanNvbhgDIAEoCSJ1CgxRdWVyeU9wZXJhbmQSLQoKZXhwcmVzc2lvbhgBIAEoCzIXLmNhbWluby5RdWVyeUV4cHJlc3Npb25IABIrCglyZWR1Y3Rpb24YAiABKAsyFi5jYW1pbm8uUXVlcnlSZWR1Y3Rpb25IAEIJCgdvcGVyYW5kIpEBCg9RdWVyeUNvbXBhcmlzb24SJQoHb3BlcmFuZBgBIAEoCzIULmNhbWluby5RdWVyeU9wZXJhbmQSMQoIb3BlcmF0b3IYAiABKA4yHy5jYW1pbm8uUXVlcnlDb21wYXJpc29uT3BlcmF0b3ISJAoFdmFsdWUYAyABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCI+ChJRdWVyeVByZWRpY2F0ZUxpc3QSKAoIY2hpbGRyZW4YASADKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUi9QEKFlF1ZXJ5UmVsYXRpb25QcmVkaWNhdGUSIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhTdGVwEisKCHJlbGF0aW9uGAIgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoEjgKCG9wZXJhdG9yGAMgASgOMiYuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QcmVkaWNhdGVPcGVyYXRvchIpCglwcmVkaWNhdGUYBCABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUSJAoFdmFsdWUYBSABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCK6AQoXUXVlcnlSZWR1Y3Rpb25QcmVkaWNhdGUSIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhTdGVwEisKCHJlbGF0aW9uGAIgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoEiUKBXdoZXJlGAMgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEiYKBmhhdmluZxgEIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZSKsAgoOUXVlcnlQcmVkaWNhdGUSKQoDYW5kGAEgASgLMhouY2FtaW5vLlF1ZXJ5UHJlZGljYXRlTGlzdEgAEigKAm9yGAIgASgLMhouY2FtaW5vLlF1ZXJ5UHJlZGljYXRlTGlzdEgAEiUKA25vdBgDIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZUgAEioKB2NvbXBhcmUYBCABKAsyFy5jYW1pbm8uUXVlcnlDb21wYXJpc29uSAASMgoIcmVsYXRpb24YBSABKAsyHi5jYW1pbm8uUXVlcnlSZWxhdGlvblByZWRpY2F0ZUgAEjEKBnJlZHVjZRgGIAEoCzIfLmNhbWluby5RdWVyeVJlZHVjdGlvblByZWRpY2F0ZUgAQgsKCXByZWRpY2F0ZSJhCghRdWVyeVJvdxIoCgZvYmplY3QYASABKAsyFi5jYW1pbm8uUXVlcnlPYmplY3RSb3dIABIkCgRwYWlyGAIgASgLMhQuY2FtaW5vLlF1ZXJ5UGFpclJvd0gAQgUKA3JvdyJVCg5RdWVyeU9iamVjdFJvdxIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEgoKbWVtYmVyc2hpcBgCIAEoCBIQCghrZXlfdHlwZRgDIAEoCSJSCgxRdWVyeVBhaXJSb3cSIAoGc291cmNlGAEgASgLMhAuY2FtaW5vLlF1ZXJ5Um93EiAKBnRhcmdldBgCIAEoCzIQLmNhbWluby5RdWVyeVJvdyJFCghRdWVyeUtleRIMCgRwYXRoGAEgAygJEisKCmV4cHJlc3Npb24YAiABKAsyFy5jYW1pbm8uUXVlcnlFeHByZXNzaW9uIi8KDVF1ZXJ5RGlzdGluY3QSHgoEa2V5cxgBIAMoCzIQLmNhbWluby5RdWVyeUtleSJiCg5RdWVyeUV4cGFuc2lvbhIjCgRwYXRoGAEgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFN0ZXASKwoIcmVsYXRpb24YAiABKAsyGS5jYW1pbm8uUXVlcnlSZWxhdGlvblBhdGgimAIKFFF1ZXJ5UmVsYXRpb25hbFN0YWdlEgoKAmlkGAEgASgNEhIKBWlucHV0GAIgASgNSAGIAQESHQoDcm93GAMgASgLMhAuY2FtaW5vLlF1ZXJ5Um93EisKBnNvdXJjZRgEIAEoCzIZLmNhbWluby5RdWVyeVJlbGF0aW9uUGF0aEgAEigKBmZpbHRlchgFIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZUgAEigKBmV4cGFuZBgGIAEoCzIWLmNhbWluby5RdWVyeUV4cGFuc2lvbkgAEikKCGRpc3RpbmN0GAcgASgLMhUuY2FtaW5vLlF1ZXJ5RGlzdGluY3RIAEILCglvcGVyYXRpb25CCAoGX2lucHV0IlMKGFF1ZXJ5UmVkdWN0aW9uUHJvamVjdGlvbhIMCgRwYXRoGAEgAygJEikKCXJlZHVjdGlvbhgCIAEoCzIWLmNhbWluby5RdWVyeVJlZHVjdGlvbiJQChNRdWVyeUFnZ3JlZ2F0ZU9yZGVyEiUKB29wZXJhbmQYASABKAsyFC5jYW1pbm8uUXVlcnlPcGVyYW5kEhIKCmRlc2NlbmRpbmcYAiABKAgi0gMKF1F1ZXJ5UmVsYXRpb25hbFRlcm1pbmFsEg0KBXN0YWdlGAEgASgNEgwKBHBhdGgYAiADKAkSDgoGZ3JvdXBzGAMgASgIEh4KBGtleXMYBCADKAsyEC5jYW1pbm8uUXVlcnlLZXkSNAoKcmVkdWN0aW9ucxgFIAMoCzIgLmNhbWluby5RdWVyeVJlZHVjdGlvblByb2plY3Rpb24SJQoFd2hlcmUYBiABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUSJgoGaGF2aW5nGAcgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEioKBW9yZGVyGAggAygLMhsuY2FtaW5vLlF1ZXJ5QWdncmVnYXRlT3JkZXISJAoFZmlyc3QYCSABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudBIiCgNhbGwYCiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudBIkCgVhZnRlchgLIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50EikKCXNlbGVjdGlvbhgMIAMoCzIWLmNhbWluby5RdWVyeVNlbGVjdGlvbhIQCghyZXNpZHVhbBgNIAEoCBIMCgRyb3dzGA4gASgIIncKE1F1ZXJ5UmVsYXRpb25hbFBsYW4SLAoGc3RhZ2VzGAEgAygLMhwuY2FtaW5vLlF1ZXJ5UmVsYXRpb25hbFN0YWdlEjIKCXRlcm1pbmFscxgCIAMoCzIfLmNhbWluby5RdWVyeVJlbGF0aW9uYWxUZXJtaW5hbCLpAgoQUXVlcnlSZWFkQmluZGluZxIPCgdhdG9tX2lkGAEgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgCIAEoCRIRCgltZW1iZXJfaWQYAyABKAkSGwoTZ2V0dGVyX29wZXJhdGlvbl9pZBgEIAEoCRIPCgdzbG90X2lkGAUgASgJEhQKDGVkZ2VfdHlwZV9pZBgGIAEoCRIVCg1wcm9qZWN0aW9uX2lkGAcgASgJEgsKA3JwYxgIIAEoCBIgChh3YXRjaF9zdGFydF9vcGVyYXRpb25faWQYCSABKAkSHwoXd2F0Y2hfc3RvcF9vcGVyYXRpb25faWQYCiABKAkSEgoKZmllbGRfbmFtZRgLIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YDCABKAkSKAoLY2FyZGluYWxpdHkYDSABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSEAoIa2V5X3R5cGUYDiABKAkirwEKElF1ZXJ5RmllbGRDb250cmFjdBIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEQoJbWVtYmVyX2lkGAIgASgJEhIKCmZpZWxkX25hbWUYAyABKAkSFwoPdmFsdWVfdHlwZV9qc29uGAQgASgJEigKC2NhcmRpbmFsaXR5GAUgASgOMhMuY2FtaW5vLkNhcmRpbmFsaXR5EhAKCGtleV90eXBlGAYgASgJIpIBCgxRdWVyeUJ1ZGdldHMSDAoEcm93cxgBIAEoDRINCgVkZXB0aBgCIAEoDRIUCgxyZXN1bHRfYnl0ZXMYAyABKA0SEgoKY2FuZGlkYXRlcxgEIAEoDRIRCglycGNfY2FsbHMYBSABKA0SEwoLY29uY3VycmVuY3kYBiABKA0SEwoLZGVhZGxpbmVfbXMYByABKA0i7wQKDkluc3RhbGxlZFF1ZXJ5EgoKAmlkGAEgASgJEhkKEWRlZmluaXRpb25fZGlnZXN0GAIgASgJEhYKDmJpbmRpbmdfZGlnZXN0GAMgASgJEhoKEG9iamVjdF9pbnRlcmZhY2UYBCABKAlIABIdChN3b3Jrc3BhY2VfaW50ZXJmYWNlGA4gASgJSAASKQoJc2VsZWN0aW9uGAUgAygLMhYuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uEioKCGJpbmRpbmdzGAYgAygLMhguY2FtaW5vLlF1ZXJ5UmVhZEJpbmRpbmcSJQoHYnVkZ2V0cxgHIAEoCzIULmNhbWluby5RdWVyeUJ1ZGdldHMSGwoTdmFyaWFibGVzX3R5cGVfanNvbhgIIAEoCRIYChBvdXRwdXRfdHlwZV9qc29uGAkgASgJEkcKEXZhcmlhYmxlX2RlZmF1bHRzGAogAygLMiwuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5LlZhcmlhYmxlRGVmYXVsdHNFbnRyeRINCgV3YXRjaBgLIAEoCBIbChNwb2xsaW5nX2ludGVydmFsX21zGAwgASgNEh4KFnJwY19wcmVkaWNhdGVfb3Jfb3JkZXIYDSABKAgSFQoNcm9vdF9hdG9tX2lkcxgPIAMoCRIqCgZmaWVsZHMYECADKAsyGi5jYW1pbm8uUXVlcnlGaWVsZENvbnRyYWN0Gk4KFVZhcmlhYmxlRGVmYXVsdHNFbnRyeRILCgNrZXkYASABKAkSJAoFdmFsdWUYAiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudDoCOAFCBgoEcm9vdCpoCgtDYXJkaW5hbGl0eRIbChdDQVJESU5BTElUWV9VTlNQRUNJRklFRBAAEhAKDE9QVElPTkFMX09ORRABEg8KC0VYQUNUTFlfT05FEAISCAoETUFOWRADEg8KC01BTllfVU5JUVVFEAQqmgIKFlF1ZXJ5QWdncmVnYXRlT3BlcmF0b3ISKAokUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX1VOU1BFQ0lGSUVEEAASIgoeUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0NPVU5UEAESKgomUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0NPVU5UX1BSRVNFTlQQAhIgChxRVUVSWV9BR0dSRUdBVEVfT1BFUkFUT1JfU1VNEAMSIAocUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0FWRxAEEiAKHFFVRVJZX0FHR1JFR0FURV9PUEVSQVRPUl9NSU4QBRIgChxRVUVSWV9BR0dSRUdBVEVfT1BFUkFUT1JfTUFYEAYq7QIKF1F1ZXJ5Q29tcGFyaXNvbk9wZXJhdG9yEikKJVFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfVU5TUEVDSUZJRUQQABIgChxRVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0VREAESIAocUVVFUllfQ09NUEFSSVNPTl9PUEVSQVRPUl9JThACEiUKIVFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfSVNfTlVMTBADEiAKHFFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfTFQQBBIhCh1RVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0xURRAFEiAKHFFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfR1QQBhIhCh1RVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0dURRAHEjIKLlFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfQ09OVEFJTlNfSU5TRU5TSVRJVkUQCCqEAgoeUXVlcnlSZWxhdGlvblByZWRpY2F0ZU9wZXJhdG9yEjEKLVFVRVJZX1JFTEFUSU9OX1BSRURJQ0FURV9PUEVSQVRPUl9VTlNQRUNJRklFRBAAEioKJlFVRVJZX1JFTEFUSU9OX1BSRURJQ0FURV9PUEVSQVRPUl9TT01FEAESKgomUVVFUllfUkVMQVRJT05fUFJFRElDQVRFX09QRVJBVE9SX05PTkUQAhIoCiRRVUVSWV9SRUxBVElPTl9QUkVESUNBVEVfT1BFUkFUT1JfSVMQAxItCilRVUVSWV9SRUxBVElPTl9QUkVESUNBVEVfT1BFUkFUT1JfSVNfTlVMTBAEYgZwcm90bzM"); + fileDesc("ChNjYW1pbm8vc2NoZW1hLnByb3RvEgZjYW1pbm8iNwoOQXRvbURlZmluaXRpb24SDwoHYXRvbV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkiWQoPQXRvbUNvbmZvcm1hbmNlEg8KB2F0b21faWQYASABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAIgASgJEhYKDmNvbmZvcm1hbmNlX2lkGAMgASgJIsIBCg9TdGF0ZUF0dGFjaG1lbnQSDwoHc2xvdF9pZBgBIAEoCRIYChBhdHRhY2hlZF9hdG9tX2lkGAIgASgJEhQKDGRpc3BsYXlfbmFtZRgDIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YBCABKAkSGwoTc3RvcmFnZV9wb2xpY3lfanNvbhgFIAEoCRIaChJkZWZhdWx0X3ZhbHVlX2pzb24YBiABKAkSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYByABKAkiUAoSRW5kcG9pbnRDb25zdHJhaW50EhEKB2F0b21faWQYASABKAlIABIfChVpbnRlcmZhY2VfcmV2aXNpb25faWQYAiABKAlIAEIGCgRraW5kIvsBCgxFZGdlRW5kcG9pbnQSFQoNcHJvamVjdGlvbl9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSLgoKY29uc3RyYWludBgDIAEoCzIaLmNhbWluby5FbmRwb2ludENvbnN0cmFpbnQSKAoLY2FyZGluYWxpdHkYBCABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSDwoHb3JkZXJlZBgFIAEoCBIRCglvbl9kZWxldGUYBiABKAkSFAoMcmV0YWluX290aGVyGAcgASgIEhAKCGtleV90eXBlGAggASgJEhgKEHB1YmxpY190cmF2ZXJzYWwYCSABKAgipQEKDkVkZ2VBdHRhY2htZW50EhQKDGVkZ2VfdHlwZV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSIwoFZmlyc3QYAyABKAsyFC5jYW1pbm8uRWRnZUVuZHBvaW50EiQKBnNlY29uZBgEIAEoCzIULmNhbWluby5FZGdlRW5kcG9pbnQSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYBSABKAkilQIKD1BlcnNpc3RlbmNlUGxhbhIUCgx3b3Jrc3BhY2VfaWQYASABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAIgASgJEiUKBWF0b21zGAMgAygLMhYuY2FtaW5vLkF0b21EZWZpbml0aW9uEi0KDGNvbmZvcm1hbmNlcxgEIAMoCzIXLmNhbWluby5BdG9tQ29uZm9ybWFuY2USJwoGc3RhdGVzGAUgAygLMhcuY2FtaW5vLlN0YXRlQXR0YWNobWVudBIlCgVlZGdlcxgGIAMoCzIWLmNhbWluby5FZGdlQXR0YWNobWVudBInCgdxdWVyaWVzGAcgAygLMhYuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5Ip4BCg1RdWVyeUFyZ3VtZW50EhIKCHZhcmlhYmxlGAEgASgJSAASFgoMbGl0ZXJhbF9qc29uGAIgASgJSAASKQoEbGlzdBgDIAEoCzIZLmNhbWluby5RdWVyeUFyZ3VtZW50TGlzdEgAEi0KBm9iamVjdBgEIAEoCzIbLmNhbWluby5RdWVyeUFyZ3VtZW50T2JqZWN0SABCBwoFdmFsdWUiOgoRUXVlcnlBcmd1bWVudExpc3QSJQoGdmFsdWVzGAEgAygLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQilAEKE1F1ZXJ5QXJndW1lbnRPYmplY3QSNwoGZmllbGRzGAEgAygLMicuY2FtaW5vLlF1ZXJ5QXJndW1lbnRPYmplY3QuRmllbGRzRW50cnkaRAoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQ6AjgBIkcKDlF1ZXJ5Q29uZGl0aW9uEg8KB2luY2x1ZGUYASABKAgSJAoFdmFsdWUYAiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCLUAwoOUXVlcnlTZWxlY3Rpb24SDAoEbmFtZRgBIAEoCRILCgNrZXkYAiABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAMgASgJEhEKCW1lbWJlcl9pZBgEIAEoCRIkChx0YXJnZXRfaW50ZXJmYWNlX3JldmlzaW9uX2lkGAUgASgJEioKCmNvbmRpdGlvbnMYBiADKAsyFi5jYW1pbm8uUXVlcnlDb25kaXRpb24SOAoJYXJndW1lbnRzGAcgAygLMiUuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uLkFyZ3VtZW50c0VudHJ5EikKCXNlbGVjdGlvbhgIIAMoCzIWLmNhbWluby5RdWVyeVNlbGVjdGlvbhIvCgpyZWxhdGlvbmFsGAkgASgLMhsuY2FtaW5vLlF1ZXJ5UmVsYXRpb25hbFBsYW4SKQoJcHJlZGljYXRlGAogASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEhkKEWxpdmVfc2VsZWN0aW9uX2lkGAsgASgJGkcKDkFyZ3VtZW50c0VudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50OgI4ASJqCg1RdWVyeVBhdGhTdGVwEhAKBnNvdXJjZRgBIAEoCEgAEhAKBnRhcmdldBgCIAEoCEgAEi0KCHJlbGF0aW9uGAMgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoSABCBgoEc3RlcCJ9ChFRdWVyeVJlbGF0aW9uUGF0aBIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEQoJbWVtYmVyX2lkGAIgASgJEiQKHHRhcmdldF9pbnRlcmZhY2VfcmV2aXNpb25faWQYAyABKAkSEAoIb3B0aW9uYWwYBCABKAgiRQoRUXVlcnlGaWVsZE9wZXJhbmQSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhEKCW1lbWJlcl9pZBgCIAEoCSK2AQoPUXVlcnlFeHByZXNzaW9uEiMKBHBhdGgYASADKAsyFS5jYW1pbm8uUXVlcnlQYXRoU3RlcBIqCgVmaWVsZBgCIAEoCzIZLmNhbWluby5RdWVyeUZpZWxkT3BlcmFuZEgAEg0KA3JlZhgDIAEoCUgAEg8KBWVudHJ5GAQgASgISAASEQoHbWFwX2tleRgFIAEoCEgAEhcKD3ZhbHVlX3R5cGVfanNvbhgGIAEoCUIGCgRsZWFmIoUBCg5RdWVyeVJlZHVjdGlvbhIwCghvcGVyYXRvchgBIAEoDjIeLmNhbWluby5RdWVyeUFnZ3JlZ2F0ZU9wZXJhdG9yEigKB29wZXJhbmQYAiABKAsyFy5jYW1pbm8uUXVlcnlFeHByZXNzaW9uEhcKD3ZhbHVlX3R5cGVfanNvbhgDIAEoCSJ1CgxRdWVyeU9wZXJhbmQSLQoKZXhwcmVzc2lvbhgBIAEoCzIXLmNhbWluby5RdWVyeUV4cHJlc3Npb25IABIrCglyZWR1Y3Rpb24YAiABKAsyFi5jYW1pbm8uUXVlcnlSZWR1Y3Rpb25IAEIJCgdvcGVyYW5kIpEBCg9RdWVyeUNvbXBhcmlzb24SJQoHb3BlcmFuZBgBIAEoCzIULmNhbWluby5RdWVyeU9wZXJhbmQSMQoIb3BlcmF0b3IYAiABKA4yHy5jYW1pbm8uUXVlcnlDb21wYXJpc29uT3BlcmF0b3ISJAoFdmFsdWUYAyABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCI+ChJRdWVyeVByZWRpY2F0ZUxpc3QSKAoIY2hpbGRyZW4YASADKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUi9QEKFlF1ZXJ5UmVsYXRpb25QcmVkaWNhdGUSIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhTdGVwEisKCHJlbGF0aW9uGAIgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoEjgKCG9wZXJhdG9yGAMgASgOMiYuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QcmVkaWNhdGVPcGVyYXRvchIpCglwcmVkaWNhdGUYBCABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUSJAoFdmFsdWUYBSABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCK6AQoXUXVlcnlSZWR1Y3Rpb25QcmVkaWNhdGUSIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhTdGVwEisKCHJlbGF0aW9uGAIgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoEiUKBXdoZXJlGAMgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEiYKBmhhdmluZxgEIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZSKsAgoOUXVlcnlQcmVkaWNhdGUSKQoDYW5kGAEgASgLMhouY2FtaW5vLlF1ZXJ5UHJlZGljYXRlTGlzdEgAEigKAm9yGAIgASgLMhouY2FtaW5vLlF1ZXJ5UHJlZGljYXRlTGlzdEgAEiUKA25vdBgDIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZUgAEioKB2NvbXBhcmUYBCABKAsyFy5jYW1pbm8uUXVlcnlDb21wYXJpc29uSAASMgoIcmVsYXRpb24YBSABKAsyHi5jYW1pbm8uUXVlcnlSZWxhdGlvblByZWRpY2F0ZUgAEjEKBnJlZHVjZRgGIAEoCzIfLmNhbWluby5RdWVyeVJlZHVjdGlvblByZWRpY2F0ZUgAQgsKCXByZWRpY2F0ZSJhCghRdWVyeVJvdxIoCgZvYmplY3QYASABKAsyFi5jYW1pbm8uUXVlcnlPYmplY3RSb3dIABIkCgRwYWlyGAIgASgLMhQuY2FtaW5vLlF1ZXJ5UGFpclJvd0gAQgUKA3JvdyJVCg5RdWVyeU9iamVjdFJvdxIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEgoKbWVtYmVyc2hpcBgCIAEoCBIQCghrZXlfdHlwZRgDIAEoCSJSCgxRdWVyeVBhaXJSb3cSIAoGc291cmNlGAEgASgLMhAuY2FtaW5vLlF1ZXJ5Um93EiAKBnRhcmdldBgCIAEoCzIQLmNhbWluby5RdWVyeVJvdyJFCghRdWVyeUtleRIMCgRwYXRoGAEgAygJEisKCmV4cHJlc3Npb24YAiABKAsyFy5jYW1pbm8uUXVlcnlFeHByZXNzaW9uIi8KDVF1ZXJ5RGlzdGluY3QSHgoEa2V5cxgBIAMoCzIQLmNhbWluby5RdWVyeUtleSJiCg5RdWVyeUV4cGFuc2lvbhIjCgRwYXRoGAEgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFN0ZXASKwoIcmVsYXRpb24YAiABKAsyGS5jYW1pbm8uUXVlcnlSZWxhdGlvblBhdGgimAIKFFF1ZXJ5UmVsYXRpb25hbFN0YWdlEgoKAmlkGAEgASgNEhIKBWlucHV0GAIgASgNSAGIAQESHQoDcm93GAMgASgLMhAuY2FtaW5vLlF1ZXJ5Um93EisKBnNvdXJjZRgEIAEoCzIZLmNhbWluby5RdWVyeVJlbGF0aW9uUGF0aEgAEigKBmZpbHRlchgFIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZUgAEigKBmV4cGFuZBgGIAEoCzIWLmNhbWluby5RdWVyeUV4cGFuc2lvbkgAEikKCGRpc3RpbmN0GAcgASgLMhUuY2FtaW5vLlF1ZXJ5RGlzdGluY3RIAEILCglvcGVyYXRpb25CCAoGX2lucHV0IlMKGFF1ZXJ5UmVkdWN0aW9uUHJvamVjdGlvbhIMCgRwYXRoGAEgAygJEikKCXJlZHVjdGlvbhgCIAEoCzIWLmNhbWluby5RdWVyeVJlZHVjdGlvbiJQChNRdWVyeUFnZ3JlZ2F0ZU9yZGVyEiUKB29wZXJhbmQYASABKAsyFC5jYW1pbm8uUXVlcnlPcGVyYW5kEhIKCmRlc2NlbmRpbmcYAiABKAgi0gMKF1F1ZXJ5UmVsYXRpb25hbFRlcm1pbmFsEg0KBXN0YWdlGAEgASgNEgwKBHBhdGgYAiADKAkSDgoGZ3JvdXBzGAMgASgIEh4KBGtleXMYBCADKAsyEC5jYW1pbm8uUXVlcnlLZXkSNAoKcmVkdWN0aW9ucxgFIAMoCzIgLmNhbWluby5RdWVyeVJlZHVjdGlvblByb2plY3Rpb24SJQoFd2hlcmUYBiABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUSJgoGaGF2aW5nGAcgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEioKBW9yZGVyGAggAygLMhsuY2FtaW5vLlF1ZXJ5QWdncmVnYXRlT3JkZXISJAoFZmlyc3QYCSABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudBIiCgNhbGwYCiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudBIkCgVhZnRlchgLIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50EikKCXNlbGVjdGlvbhgMIAMoCzIWLmNhbWluby5RdWVyeVNlbGVjdGlvbhIQCghyZXNpZHVhbBgNIAEoCBIMCgRyb3dzGA4gASgIIncKE1F1ZXJ5UmVsYXRpb25hbFBsYW4SLAoGc3RhZ2VzGAEgAygLMhwuY2FtaW5vLlF1ZXJ5UmVsYXRpb25hbFN0YWdlEjIKCXRlcm1pbmFscxgCIAMoCzIfLmNhbWluby5RdWVyeVJlbGF0aW9uYWxUZXJtaW5hbCLpAgoQUXVlcnlSZWFkQmluZGluZxIPCgdhdG9tX2lkGAEgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgCIAEoCRIRCgltZW1iZXJfaWQYAyABKAkSGwoTZ2V0dGVyX29wZXJhdGlvbl9pZBgEIAEoCRIPCgdzbG90X2lkGAUgASgJEhQKDGVkZ2VfdHlwZV9pZBgGIAEoCRIVCg1wcm9qZWN0aW9uX2lkGAcgASgJEgsKA3JwYxgIIAEoCBIgChh3YXRjaF9zdGFydF9vcGVyYXRpb25faWQYCSABKAkSHwoXd2F0Y2hfc3RvcF9vcGVyYXRpb25faWQYCiABKAkSEgoKZmllbGRfbmFtZRgLIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YDCABKAkSKAoLY2FyZGluYWxpdHkYDSABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSEAoIa2V5X3R5cGUYDiABKAkirwEKElF1ZXJ5RmllbGRDb250cmFjdBIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEQoJbWVtYmVyX2lkGAIgASgJEhIKCmZpZWxkX25hbWUYAyABKAkSFwoPdmFsdWVfdHlwZV9qc29uGAQgASgJEigKC2NhcmRpbmFsaXR5GAUgASgOMhMuY2FtaW5vLkNhcmRpbmFsaXR5EhAKCGtleV90eXBlGAYgASgJIpIBCgxRdWVyeUJ1ZGdldHMSDAoEcm93cxgBIAEoDRINCgVkZXB0aBgCIAEoDRIUCgxyZXN1bHRfYnl0ZXMYAyABKA0SEgoKY2FuZGlkYXRlcxgEIAEoDRIRCglycGNfY2FsbHMYBSABKA0SEwoLY29uY3VycmVuY3kYBiABKA0SEwoLZGVhZGxpbmVfbXMYByABKA0iTAoOUXVlcnlQbGFjZW1lbnQSEQoHcmVwbGljYRgBIAEoCEgAEh8KFWxvY2FsX3NvdXJjZV9xdWVyeV9pZBgCIAEoCUgAQgYKBGtpbmQimgUKDkluc3RhbGxlZFF1ZXJ5EgoKAmlkGAEgASgJEhkKEWRlZmluaXRpb25fZGlnZXN0GAIgASgJEhYKDmJpbmRpbmdfZGlnZXN0GAMgASgJEhoKEG9iamVjdF9pbnRlcmZhY2UYBCABKAlIABIdChN3b3Jrc3BhY2VfaW50ZXJmYWNlGA4gASgJSAASKQoJc2VsZWN0aW9uGAUgAygLMhYuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uEioKCGJpbmRpbmdzGAYgAygLMhguY2FtaW5vLlF1ZXJ5UmVhZEJpbmRpbmcSJQoHYnVkZ2V0cxgHIAEoCzIULmNhbWluby5RdWVyeUJ1ZGdldHMSGwoTdmFyaWFibGVzX3R5cGVfanNvbhgIIAEoCRIYChBvdXRwdXRfdHlwZV9qc29uGAkgASgJEkcKEXZhcmlhYmxlX2RlZmF1bHRzGAogAygLMiwuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5LlZhcmlhYmxlRGVmYXVsdHNFbnRyeRINCgV3YXRjaBgLIAEoCBIbChNwb2xsaW5nX2ludGVydmFsX21zGAwgASgNEh4KFnJwY19wcmVkaWNhdGVfb3Jfb3JkZXIYDSABKAgSFQoNcm9vdF9hdG9tX2lkcxgPIAMoCRIqCgZmaWVsZHMYECADKAsyGi5jYW1pbm8uUXVlcnlGaWVsZENvbnRyYWN0EikKCXBsYWNlbWVudBgRIAEoCzIWLmNhbWluby5RdWVyeVBsYWNlbWVudBpOChVWYXJpYWJsZURlZmF1bHRzRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQ6AjgBQgYKBHJvb3QqaAoLQ2FyZGluYWxpdHkSGwoXQ0FSRElOQUxJVFlfVU5TUEVDSUZJRUQQABIQCgxPUFRJT05BTF9PTkUQARIPCgtFWEFDVExZX09ORRACEggKBE1BTlkQAxIPCgtNQU5ZX1VOSVFVRRAEKpoCChZRdWVyeUFnZ3JlZ2F0ZU9wZXJhdG9yEigKJFFVRVJZX0FHR1JFR0FURV9PUEVSQVRPUl9VTlNQRUNJRklFRBAAEiIKHlFVRVJZX0FHR1JFR0FURV9PUEVSQVRPUl9DT1VOVBABEioKJlFVRVJZX0FHR1JFR0FURV9PUEVSQVRPUl9DT1VOVF9QUkVTRU5UEAISIAocUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX1NVTRADEiAKHFFVRVJZX0FHR1JFR0FURV9PUEVSQVRPUl9BVkcQBBIgChxRVUVSWV9BR0dSRUdBVEVfT1BFUkFUT1JfTUlOEAUSIAocUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX01BWBAGKu0CChdRdWVyeUNvbXBhcmlzb25PcGVyYXRvchIpCiVRVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX1VOU1BFQ0lGSUVEEAASIAocUVVFUllfQ09NUEFSSVNPTl9PUEVSQVRPUl9FURABEiAKHFFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfSU4QAhIlCiFRVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0lTX05VTEwQAxIgChxRVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0xUEAQSIQodUVVFUllfQ09NUEFSSVNPTl9PUEVSQVRPUl9MVEUQBRIgChxRVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0dUEAYSIQodUVVFUllfQ09NUEFSSVNPTl9PUEVSQVRPUl9HVEUQBxIyCi5RVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0NPTlRBSU5TX0lOU0VOU0lUSVZFEAgqhAIKHlF1ZXJ5UmVsYXRpb25QcmVkaWNhdGVPcGVyYXRvchIxCi1RVUVSWV9SRUxBVElPTl9QUkVESUNBVEVfT1BFUkFUT1JfVU5TUEVDSUZJRUQQABIqCiZRVUVSWV9SRUxBVElPTl9QUkVESUNBVEVfT1BFUkFUT1JfU09NRRABEioKJlFVRVJZX1JFTEFUSU9OX1BSRURJQ0FURV9PUEVSQVRPUl9OT05FEAISKAokUVVFUllfUkVMQVRJT05fUFJFRElDQVRFX09QRVJBVE9SX0lTEAMSLQopUVVFUllfUkVMQVRJT05fUFJFRElDQVRFX09QRVJBVE9SX0lTX05VTEwQBGIGcHJvdG8z"); /** * @generated from message camino.AtomDefinition @@ -1339,6 +1339,35 @@ export type QueryBudgets = Message<"camino.QueryBudgets"> & { export const QueryBudgetsSchema: GenMessage = /*@__PURE__*/ messageDesc(file_camino_schema, 36); +/** + * @generated from message camino.QueryPlacement + */ +export type QueryPlacement = Message<"camino.QueryPlacement"> & { + /** + * @generated from oneof camino.QueryPlacement.kind + */ + kind: { + /** + * @generated from field: bool replica = 1; + */ + value: boolean; + case: "replica"; + } | { + /** + * @generated from field: string local_source_query_id = 2; + */ + value: string; + case: "localSourceQueryId"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message camino.QueryPlacement. + * Use `create(QueryPlacementSchema)` to create a new message. + */ +export const QueryPlacementSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_camino_schema, 37); + /** * @generated from message camino.InstalledQuery */ @@ -1429,6 +1458,11 @@ export type InstalledQuery = Message<"camino.InstalledQuery"> & { * @generated from field: repeated camino.QueryFieldContract fields = 16; */ fields: QueryFieldContract[]; + + /** + * @generated from field: camino.QueryPlacement placement = 17; + */ + placement?: QueryPlacement | undefined; }; /** @@ -1436,7 +1470,7 @@ export type InstalledQuery = Message<"camino.InstalledQuery"> & { * Use `create(InstalledQuerySchema)` to create a new message. */ export const InstalledQuerySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_schema, 37); + messageDesc(file_camino_schema, 38); /** * @generated from enum camino.Cardinality diff --git a/src/query/compile.ts b/src/query/compile.ts index d37fa39..61f9a3e 100644 --- a/src/query/compile.ts +++ b/src/query/compile.ts @@ -128,6 +128,23 @@ export async function compileQuery( const member = contract.members.find((entry) => entry.displayName === name); if (!member || member.kind === "operation" || !member.queryRead) return fail("QUERY_FIELD_NOT_QUERYABLE", `${contract.displayName}.${name} is not queryable`, node); + if (declaration.placement?.kind === "local") { + const getter = member.operations.find( + (operation) => operation.displayName === (member.kind === "value" ? "get" : "resolve"), + ); + if (getter?.execution?.kind !== "snapshot" || !getter.execution.targets.includes("browser")) + fail( + "QUERY_LOCAL_DEPENDENCY", + `Local query requires a browser snapshot getter for ${contract.displayName}.${name}; split the remote field or move the query to the server`, + node, + ); + if (member.queryRead.execution === "rpc-permitted") + fail( + "QUERY_LOCAL_DEPENDENCY", + `Local query cannot include remote-compute field ${contract.displayName}.${name}`, + node, + ); + } const key = `${id}\0${member.id}`; const effect = effects.get(key) ?? { interfaceRevisionId: id, diff --git a/src/query/link.ts b/src/query/link.ts index c22a43c..db51484 100644 --- a/src/query/link.ts +++ b/src/query/link.ts @@ -82,12 +82,12 @@ export function linkQueries(workspace: WorkspaceRevision): LinkedQuery[] { getter.id, ).binding; if (binding.kind === "package") { - if (effect.execution !== "rpc-permitted") + if (effect.execution === "native") throw new QueryCompileError( "QUERY_NATIVE_BINDING_REQUIRED", `Native query field ${effect.memberId} binds package code`, ); - if (!provider.queryReason?.trim()) + if (effect.execution === "rpc-permitted" && !provider.queryReason?.trim()) throw new QueryCompileError( "QUERY_RPC_PROVIDER_REASON", `Package query field ${effect.memberId} needs query-reason`, diff --git a/src/query/proto.ts b/src/query/proto.ts index 727df4a..7c0d255 100644 --- a/src/query/proto.ts +++ b/src/query/proto.ts @@ -46,6 +46,15 @@ export const queryRuntimePlan = (linked: LinkedQuery, workspace: WorkspaceRevisi InstalledQuerySchema, create(InstalledQuerySchema, { id: linked.id, + placement: linked.checked.declaration.placement && { + kind: + linked.checked.declaration.placement.kind === "replica" + ? { case: "replica", value: true } + : { + case: "localSourceQueryId", + value: `${linked.packageRevisionId}:${linked.checked.declaration.placement.sourceQueryId}`, + }, + }, definitionDigest: linked.checked.definitionDigest, bindingDigest: linked.bindingDigest, root: { diff --git a/src/query/root.ts b/src/query/root.ts index e5a90fd..7d3c244 100644 --- a/src/query/root.ts +++ b/src/query/root.ts @@ -11,7 +11,7 @@ export const workspaceQueryRootId: InterfaceRevisionId = capabilityId.interfaceR "qx-internal-workspace-query-root", ); export const workspaceObjectsMemberId: MemberId = capabilityId.member("qx-internal-workspace-objects"); -export function queryRootSchema(root: QueryRoot, interfaces: readonly InterfaceRevision[]) { +export function queryRootSchema(root: QueryRoot, interfaces: readonly InterfaceRevision[], local = false) { if (interfaces.some((i) => i.revisionId === workspaceQueryRootId)) throw new QueryCompileError("QUERY_RESERVED_ID", "The workspace query root identity is compiler-owned"); if (root.kind === "object") return { interface: root.interface, interfaces }; @@ -27,7 +27,7 @@ export function queryRootSchema(root: QueryRoot, interfaces: readonly InterfaceR { kind: "relationship", id: workspaceObjectsMemberId, - displayName: "objects", + displayName: local ? "availableObjects" : "objects", target: { kind: "interface", interfaceRevisionId: root.interface }, cardinality: "many-unique", ordered: false, diff --git a/src/query/schema.ts b/src/query/schema.ts index 5100548..a4da7a8 100644 --- a/src/query/schema.ts +++ b/src/query/schema.ts @@ -79,7 +79,7 @@ export function querySchema( interfaces: readonly InterfaceRevision[], document?: DocumentNode, ) { - const root = queryRootSchema(declaration.root, interfaces); + const root = queryRootSchema(declaration.root, interfaces, declaration.placement?.kind === "local"); const contracts = new Map(root.interfaces.map((entry) => [entry.revisionId, entry])); const objects = new Map(); const orders = new Map(); diff --git a/src/query/types.ts b/src/query/types.ts index d75ac80..4c6eff3 100644 --- a/src/query/types.ts +++ b/src/query/types.ts @@ -35,6 +35,7 @@ export type QueryRoot = | { kind: "object"; interface: Interface } | { kind: "workspace-interface"; interface: Interface }; export interface QueryDeclaration { + placement?: { kind: "replica" } | { kind: "local"; sourceQueryId: string }; id: string; displayName: string; root: QueryRoot; @@ -64,7 +65,7 @@ export interface QueryFieldEffect { interfaceRevisionId: InterfaceRevisionId; memberId: MemberId; uses: QueryUse[]; - execution: "native" | "rpc-permitted"; + execution: "native" | "rpc-permitted" | "portable"; } export interface QuerySourceLocation { file: string; diff --git a/test/execution-contracts.test.ts b/test/execution-contracts.test.ts new file mode 100644 index 0000000..35b3f06 --- /dev/null +++ b/test/execution-contracts.test.ts @@ -0,0 +1,240 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { compileCapabilityResourceSource } from "../src/capability-language/index.js"; + +const source = { repository: "https://example.test/execution.git", commit: "a".repeat(40) }; +const data = (execution = "snapshot targets [browser, server]") => + compileCapabilityResourceSource( + ` +interface Data id "interface:data" revision "interface:data@1" { + queryable portable value label id "member:label" : string { + get id "operation:label:get" execution ${execution}; + } + operation refresh id "member:refresh" : unit -> unit { call id "operation:refresh"; } +}`, + { source }, + ); +const program = (selection: string, execution = "snapshot targets [browser, server]") => { + const contract = data(); + assert.ok(contract.ok, JSON.stringify(contract.diagnostics)); + assert.equal(contract.resource.kind, "interface"); + if (contract.resource.kind !== "interface") throw new Error("Expected interface"); + return compileCapabilityResourceSource( + ` +import interface Data; +package Reader id "package:reader" revision "package:reader@1" { + function label id "export:label" : unit -> string execution ${execution} requires { + interface data id "port:data" : Data ${selection}; + }; +}`, + { + source, + environment: { + interfaces: new Map([["Data", contract.resource.revision]]), + interfaceClosure: [contract.resource.revision], + }, + }, + ); +}; + +test("portable contracts preserve exact selected operations and targets", () => { + const result = program("using [label.get]"); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + assert.equal(result.resource.kind, "package"); + if (result.resource.kind !== "package") return; + const entry = result.resource.revision.exports[0]!; + assert.deepEqual(entry.execution, { kind: "snapshot", targets: ["browser", "server"] }); + assert.deepEqual(entry.dependencyPorts[0]!.requirement, { + kind: "interface", + interfaceRevisionId: "interface:data@1", + operations: ["operation:label:get"], + }); +}); + +test("portable dependency diagnostics reject remote defaults, missing targets, and broad acquisition", () => { + for (const [selection, execution, message] of [ + ["using [refresh.call]", "snapshot targets [browser]", "remote-only"], + ["using [label.get]", "snapshot targets [arduino]", "arduino"], + ["", "snapshot targets [browser]", "select"], + ["using [label.get, label.get]", "snapshot targets [browser]", "duplicates"], + ["using [label.set]", "snapshot targets [browser]", "Unknown"], + ]) { + const result = program(selection!, execution); + assert.equal(result.ok, false); + assert.match(JSON.stringify(result.diagnostics), new RegExp(message!)); + } +}); + +test("portable query getters and target declarations are checked", () => { + assert.equal(data("remote").ok, false); + assert.equal(data("transaction targets [browser]").ok, false); + assert.equal(data("snapshot targets [browser, browser]").ok, false); +}); + +test("snapshot exports reject mutable state ports but transactions admit them", () => { + const compile = (effect: string) => + compileCapabilityResourceSource( + ` +package Reader id "package:reader" revision "package:reader@1" { + function update id "export:update" : string -> unit execution ${effect} targets [browser, server] requires { + state storage id "port:value" : string [read, write]; + }; +}`, + { source }, + ); + const snapshot = compile("snapshot"); + assert.equal(snapshot.ok, false); + assert.match(JSON.stringify(snapshot.diagnostics), /write primitives/); + const transaction = compile("transaction"); + assert.ok(transaction.ok, JSON.stringify(transaction.diagnostics)); +}); + +test("query placement round-trips and local extents never claim complete membership", async () => { + const { compileQuery } = await import("../src/query/compile.js"); + const { linkQueries } = await import("../src/query/link.js"); + const { toBinary, fromBinary, fromJson } = await import("@bufbuild/protobuf"); + const { InstalledQuerySchema } = await import("../src/gen/camino/schema_pb.js"); + const { formatQx, parseQx, walkSyntax, applySourceEdits } = await import("../src/capability-language/index.js"); + const contract = data(); + assert.ok(contract.ok && contract.resource.kind === "interface"); + const iface = contract.resource.revision; + const text = `import interface Data; +package Reader id "package:reader" revision "package:reader@1" { + query Visible id "visible" root workspace Data document "visible.graphql" operation "Visible" { replica; } + query Presentation id "presentation" root workspace Data document "presentation.graphql" operation "Presentation" { local from Visible; } +}`; + const environment = { interfaces: new Map([["Data", iface]]), interfaceClosure: [iface] }; + const compiled = compileCapabilityResourceSource(formatQx(text), { source, environment }); + assert.ok(compiled.ok && compiled.resource.kind === "package", JSON.stringify(compiled.diagnostics)); + const pkg = compiled.resource.revision; + assert.deepEqual( + pkg.queries!.map((q) => q.placement), + [{ kind: "replica" }, { kind: "local", sourceQueryId: "visible" }], + ); + const parsed = parseQx(text); + const clause = [...walkSyntax(parsed.root)].find( + (node) => node.kind === "queryClause" && text.slice(node.start, node.end).startsWith("local"), + )!; + const edited = applySourceEdits(text, [{ ...clause, text: "local from Missing;" }]); + assert.equal(compileCapabilityResourceSource(edited, { source, environment }).ok, false); + const admission = pkg.queries![0]!, + local = pkg.queries![1]!; + const document = (name: string, field: string) => + `query ${name} { root { ${field}(first: 10) { entries { node { label } } } } }`; + pkg.checkedQueries = [ + await compileQuery(admission, [iface], async () => document("Visible", "objects")), + await compileQuery(local, [iface], async () => document("Presentation", "availableObjects")), + ]; + await assert.rejects( + compileQuery(local, [iface], async () => document("Presentation", "objects")), + /Cannot query field "objects"/, + ); + const remote = structuredClone(iface); + delete remote.members[0]!.operations[0]!.execution; + await assert.rejects( + compileQuery(local, [remote], async () => document("Presentation", "availableObjects")), + /browser snapshot getter/, + ); + const { capabilityId } = await import("../src/capability-model/index.js"); + const linked = linkQueries({ + id: capabilityId.workspaceRevision("w@1"), + workspaceId: capabilityId.workspace("w"), + sourceRootCommit: "a".repeat(40), + parentRevisionIds: [], + atoms: [], + sharedAttachments: [], + interfaceImports: [iface], + packageImports: [pkg], + conformances: [], + constructors: [], + }); + const wire = fromJson(InstalledQuerySchema, linked[1]!.runtime!); + const roundtrip = fromBinary(InstalledQuerySchema, toBinary(InstalledQuerySchema, wire)); + assert.deepEqual(roundtrip.placement?.kind, { case: "localSourceQueryId", value: "package:reader@1:visible" }); +}); + +test("generated interface ports expose only selected operations", async () => { + const { generateTypeScriptBindings } = await import("../src/bindings/index.js"); + const contract = data(); + const result = program("using [label.get]"); + assert.ok(contract.ok && contract.resource.kind === "interface"); + assert.ok(result.ok && result.resource.kind === "package"); + const generated = generateTypeScriptBindings( + { + format: "quixos-bindings", + version: 1, + interfaces: [contract.resource.revision], + packages: [result.resource.revision], + }, + "package:reader@1", + ); + assert.match(generated, /label\.get/); + assert.doesNotMatch(generated.split("export type Results")[0]!, /refresh\.call/); + assert.doesNotMatch(generated.split("const specs")[1]!, /refresh\.call/); +}); + +test("workspace validation checks concrete package and storage effects", async () => { + const { makeValidCapabilityWorkspace, fixtureId } = await import("./fixtures/capability-model.js"); + const { validateWorkspaceRevision } = await import("../src/capability-model/index.js"); + const workspace = makeValidCapabilityWorkspace(); + const named = workspace.interfaceImports.find((i) => i.revisionId === fixtureId.namedV1)!; + const setter = named.members.flatMap((m) => m.operations).find((o) => o.id === fixtureId.namedSet)!; + setter.execution = { kind: "snapshot", targets: ["browser"] }; + assert.ok(validateWorkspaceRevision(workspace).some((i) => i.message.includes("bind write primitives"))); + setter.execution.kind = "transaction"; + assert.deepEqual(validateWorkspaceRevision(workspace), []); + const summary = workspace.interfaceImports.find((i) => i.revisionId === fixtureId.summaryV1)!; + summary.members[0]!.operations[0]!.execution = { kind: "snapshot", targets: ["browser"] }; + assert.ok( + validateWorkspaceRevision(workspace).some( + (i) => i.path.includes(fixtureId.summaryGet) && i.message.includes("remote-only"), + ), + ); +}); + +test("generic selected ports preserve operation identities and execution through specialization", async () => { + const { specializePackageExport, capabilityId } = await import("../src/capability-model/index.js"); + const iface = compileCapabilityResourceSource( + `interface Cell id "cell" revision "cell@1" { + value content id "content" : T { get id "content:get" execution snapshot targets [browser, server]; } + }`, + { source }, + ); + assert.ok(iface.ok && iface.resource.kind === "interface", JSON.stringify(iface.diagnostics)); + const pkg = compileCapabilityResourceSource( + `import interface Cell; + package P id "p" revision "p@1" { + function load id "read" : unit -> T execution snapshot targets [browser, server] requires { + interface cell id "cell" : Cell using [content.get]; + }; + }`, + { + source, + environment: { + interfaces: new Map([["Cell", iface.resource.revision]]), + interfaceClosure: [iface.resource.revision], + }, + }, + ); + assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); + const definition = pkg.resource.revision.genericExports![0]!; + const specialized = specializePackageExport( + pkg.resource.revision, + definition, + [{ kind: "value", type: { kind: "scalar", name: "string" } }], + { + arguments: new Map(), + applyInterface: (id, args) => { + assert.equal(id, "cell@1"); + assert.deepEqual(args, [{ kind: "value", type: { kind: "scalar", name: "string" } }]); + return capabilityId.interfaceRevision("cell:string"); + }, + implementsInterface: () => false, + }, + ); + assert.deepEqual(specialized.execution, { kind: "snapshot", targets: ["browser", "server"] }); + assert.deepEqual(specialized.dependencyPorts[0]!.requirement.kind, "interface"); + const requirement = specialized.dependencyPorts[0]!.requirement; + if (requirement.kind === "interface") + assert.deepEqual(requirement.operations, [capabilityId.operation("content:get")]); +}); From 0555c929b1393de375e13eadf21622a60a7b4ce1 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sat, 19 Sep 2026 22:09:55 -0700 Subject: [PATCH 07/91] Add factory creation ports and owner initialization contracts --- grammar/QuixosCapability.g4 | 22 +- src/bindings/generics.ts | 2 + src/bindings/index.ts | 2 + .../generated/QuixosCapability.interp | 13 +- .../generated/QuixosCapability.tokens | 562 +-- .../generated/QuixosCapabilityLexer.interp | 14 +- .../generated/QuixosCapabilityLexer.tokens | 562 +-- .../generated/QuixosCapabilityLexer.ts | 1334 +++--- .../generated/QuixosCapabilityParser.ts | 3918 +++++++++-------- .../generated/QuixosCapabilityVisitor.ts | 21 + src/capability-language/parser.ts | 73 +- src/capability-model/evolution.ts | 7 + src/capability-model/execution.ts | 2 + src/capability-model/generic-packages.ts | 4 +- src/capability-model/initialization.ts | 121 + src/capability-model/types.ts | 15 +- src/capability-model/validation.ts | 16 +- test/capability-language.test.ts | 6 +- test/creation-contracts.test.ts | 197 + test/fixtures/query-workspace.ts | 6 +- test/fixtures/todo.capabilities.qx | 4 +- test/fixtures/web-studio.capabilities.qx | 2 +- test/forwarding.test.ts | 2 +- test/generics.test.ts | 4 +- test/structural-edits.test.ts | 2 +- 25 files changed, 3899 insertions(+), 3012 deletions(-) create mode 100644 src/capability-model/initialization.ts create mode 100644 test/creation-contracts.test.ts diff --git a/grammar/QuixosCapability.g4 b/grammar/QuixosCapability.g4 index 9b0ef60..e4cd0a3 100644 --- a/grammar/QuixosCapability.g4 +++ b/grammar/QuixosCapability.g4 @@ -222,6 +222,7 @@ dependencyPort | STATE identifier ID stringLiteral COLON valueType primitiveList SEMI | EDGE identifier ID stringLiteral COLON cardinality targetConstraint primitiveList SEMI | INTERFACE identifier ID stringLiteral COLON identifier typeArguments? selectedOperations? SEMI + | CREATION identifier ID stringLiteral COLON identifier INPUT valueType SEMI | CONSTRUCTOR identifier ID stringLiteral COLON identifier (INPUT valueType)? SEMI | QUERY identifier ID stringLiteral COLON identifier DOT identifier SEMI ; @@ -255,7 +256,7 @@ stateDecl ; storagePolicy - : OPTIMISTIC_REGISTER + : REGISTER | CRDT LPAREN valueType RPAREN ; @@ -277,9 +278,23 @@ conformanceItem : PRIVATE attachmentDecl | operationBindingDecl | stateFieldBindingDecl + | initializationDecl | relationshipMaterializationDecl ; +initializationDecl + : INITIALIZE LBRACE initializationField* RBRACE SEMI + ; + +initializationField + : identifier TO STATE identifier SEMI + | identifier TO EDGE identifier DOT identifier SEMI + ; + +creationOwnerMapping + : interfaceType FROM INPUT (DOT identifier)* SEMI + ; + stateFieldBindingDecl : BIND identifier TO STATE identifier SEMI ; @@ -341,6 +356,7 @@ dependencyBinding | identifier TO STATE identifier (VIA EDGE identifier DOT identifier)? SEMI | identifier TO EDGE identifier DOT identifier (VIA EDGE identifier DOT identifier)? SEMI | identifier TO INTERFACE identifier typeArguments? (VIA EDGE identifier DOT identifier)? SEMI + | identifier TO CREATION identifier WITH LBRACE creationOwnerMapping* RBRACE SEMI | identifier TO CONSTRUCTOR identifier SEMI | identifier TO WORKSPACE? QUERY identifier DOT identifier (VIA EDGE identifier DOT identifier)? SEMI ; @@ -433,6 +449,8 @@ stringLiteral : STRING_LITERAL ; +CREATION: 'creation'; +INITIALIZE: 'initialize'; WORKSPACE: 'workspace'; EXECUTION: 'execution'; SNAPSHOT: 'snapshot'; @@ -528,7 +546,7 @@ WATCH_START: 'watch-start'; WATCH_STOP: 'watch-stop'; SUBSCRIBE: 'subscribe'; UNSUBSCRIBE: 'unsubscribe'; -OPTIMISTIC_REGISTER: 'optimistic-register'; +REGISTER: 'register'; CRDT: 'crdt'; OPTIONAL_ONE: 'optional-one'; EXACTLY_ONE: 'exactly-one'; diff --git a/src/bindings/generics.ts b/src/bindings/generics.ts index d59d6f9..f4a4dba 100644 --- a/src/bindings/generics.ts +++ b/src/bindings/generics.ts @@ -115,6 +115,8 @@ export const genericImplementationType = ( } case "query": return queryPort(requirement); + case "creation": + throw new Error("Creation ports require the portable transaction context generator (LF-09)"); case "constructor": return object([ [ diff --git a/src/bindings/index.ts b/src/bindings/index.ts index 07d0966..3ff21f5 100644 --- a/src/bindings/index.ts +++ b/src/bindings/index.ts @@ -249,6 +249,8 @@ export const generateTypeScriptBindings = ( }, }; } + case "creation": + throw new Error("Creation ports require the portable transaction context generator (LF-09)"); case "constructor": { const input = requirement.inputType; if (!input) diff --git a/src/capability-language/generated/QuixosCapability.interp b/src/capability-language/generated/QuixosCapability.interp index 46c5655..9d5d308 100644 --- a/src/capability-language/generated/QuixosCapability.interp +++ b/src/capability-language/generated/QuixosCapability.interp @@ -1,5 +1,7 @@ token literal names: null +'creation' +'initialize' 'workspace' 'execution' 'snapshot' @@ -95,7 +97,7 @@ null 'watch-stop' 'subscribe' 'unsubscribe' -'optimistic-register' +'register' 'crdt' 'optional-one' 'exactly-one' @@ -146,6 +148,8 @@ null token symbolic names: null +CREATION +INITIALIZE WORKSPACE EXECUTION SNAPSHOT @@ -241,7 +245,7 @@ WATCH_START WATCH_STOP SUBSCRIBE UNSUBSCRIBE -OPTIMISTIC_REGISTER +REGISTER CRDT OPTIONAL_ONE EXACTLY_ONE @@ -342,6 +346,9 @@ edgeDecl edgeEndpoint conformanceDecl conformanceItem +initializationDecl +initializationField +creationOwnerMapping stateFieldBindingDecl relationshipMaterializationDecl operationBindingDecl @@ -366,4 +373,4 @@ stringLiteral atn: -[4, 1, 143, 1184, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 157, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 162, 8, 1, 10, 1, 12, 1, 165, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 183, 8, 3, 10, 3, 12, 3, 186, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 197, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 209, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 229, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 237, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 242, 8, 10, 10, 10, 12, 10, 245, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 250, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 260, 8, 10, 10, 10, 12, 10, 263, 9, 10, 3, 10, 265, 8, 10, 1, 10, 1, 10, 5, 10, 269, 8, 10, 10, 10, 12, 10, 272, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 280, 8, 11, 10, 11, 12, 11, 283, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 291, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 299, 8, 12, 10, 12, 12, 12, 302, 9, 12, 3, 12, 304, 8, 12, 3, 12, 306, 8, 12, 1, 13, 1, 13, 3, 13, 310, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 316, 8, 14, 10, 14, 12, 14, 319, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 330, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 335, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 344, 8, 17, 1, 18, 3, 18, 347, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 362, 8, 18, 1, 18, 1, 18, 1, 18, 1, 19, 3, 19, 368, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 378, 8, 19, 10, 19, 12, 19, 381, 9, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 389, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 397, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 410, 8, 20, 1, 21, 3, 21, 413, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 423, 8, 21, 1, 21, 1, 21, 3, 21, 427, 8, 21, 1, 21, 1, 21, 5, 21, 431, 8, 21, 10, 21, 12, 21, 434, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 440, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 446, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 454, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 462, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 475, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 482, 8, 24, 1, 24, 1, 24, 3, 24, 486, 8, 24, 1, 25, 5, 25, 489, 8, 25, 10, 25, 12, 25, 492, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 502, 8, 25, 1, 25, 1, 25, 5, 25, 506, 8, 25, 10, 25, 12, 25, 509, 9, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 518, 8, 26, 1, 27, 1, 27, 1, 27, 3, 27, 523, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 529, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 538, 8, 27, 10, 27, 12, 27, 541, 9, 27, 1, 27, 1, 27, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 567, 8, 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, 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, 3, 29, 594, 8, 29, 1, 30, 1, 30, 1, 30, 3, 30, 599, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 610, 8, 30, 1, 30, 3, 30, 613, 8, 30, 1, 30, 1, 30, 1, 30, 3, 30, 618, 8, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 3, 31, 625, 8, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 634, 8, 31, 1, 31, 3, 31, 637, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 650, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 5, 33, 657, 8, 33, 10, 33, 12, 33, 660, 9, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 673, 8, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 5, 37, 692, 8, 37, 10, 37, 12, 37, 695, 9, 37, 3, 37, 697, 8, 37, 1, 37, 3, 37, 700, 8, 37, 1, 38, 1, 38, 1, 38, 5, 38, 705, 8, 38, 10, 38, 12, 38, 708, 9, 38, 1, 39, 1, 39, 1, 39, 5, 39, 713, 8, 39, 10, 39, 12, 39, 716, 9, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 755, 8, 40, 1, 40, 3, 40, 758, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 770, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 784, 8, 40, 1, 41, 1, 41, 1, 41, 1, 41, 5, 41, 790, 8, 41, 10, 41, 12, 41, 793, 9, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 3, 44, 804, 8, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 818, 8, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 828, 8, 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, 48, 1, 48, 1, 48, 1, 48, 3, 48, 846, 8, 48, 1, 48, 1, 48, 3, 48, 850, 8, 48, 1, 48, 3, 48, 853, 8, 48, 1, 48, 1, 48, 3, 48, 857, 8, 48, 1, 48, 3, 48, 860, 8, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 869, 8, 49, 1, 49, 1, 49, 3, 49, 873, 8, 49, 1, 49, 1, 49, 3, 49, 877, 8, 49, 1, 49, 1, 49, 5, 49, 881, 8, 49, 10, 49, 12, 49, 884, 9, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 893, 8, 50, 1, 51, 1, 51, 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, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 922, 8, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 3, 55, 941, 8, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 958, 8, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 968, 8, 56, 1, 56, 3, 56, 971, 8, 56, 3, 56, 973, 8, 56, 1, 57, 1, 57, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 5, 59, 982, 8, 59, 10, 59, 12, 59, 985, 9, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1008, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1024, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1033, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1041, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1054, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1066, 8, 60, 1, 60, 1, 60, 3, 60, 1070, 8, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 1079, 8, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 3, 62, 1097, 8, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 5, 62, 1119, 8, 62, 10, 62, 12, 62, 1122, 9, 62, 1, 62, 1, 62, 1, 62, 3, 62, 1127, 8, 62, 3, 62, 1129, 8, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1148, 8, 66, 1, 67, 1, 67, 1, 67, 1, 67, 5, 67, 1154, 8, 67, 10, 67, 12, 67, 1157, 9, 67, 3, 67, 1159, 8, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 5, 69, 1171, 8, 69, 10, 69, 12, 69, 1174, 9, 69, 3, 69, 1176, 8, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 0, 0, 72, 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, 0, 9, 2, 0, 7, 7, 25, 25, 1, 0, 3, 4, 1, 0, 91, 95, 2, 0, 86, 90, 92, 93, 2, 0, 86, 87, 92, 93, 2, 0, 88, 90, 92, 93, 1, 0, 111, 118, 1, 0, 98, 101, 4, 0, 11, 25, 37, 37, 65, 65, 139, 139, 1280, 0, 156, 1, 0, 0, 0, 2, 158, 1, 0, 0, 0, 4, 168, 1, 0, 0, 0, 6, 172, 1, 0, 0, 0, 8, 196, 1, 0, 0, 0, 10, 208, 1, 0, 0, 0, 12, 210, 1, 0, 0, 0, 14, 217, 1, 0, 0, 0, 16, 228, 1, 0, 0, 0, 18, 230, 1, 0, 0, 0, 20, 243, 1, 0, 0, 0, 22, 275, 1, 0, 0, 0, 24, 305, 1, 0, 0, 0, 26, 307, 1, 0, 0, 0, 28, 311, 1, 0, 0, 0, 30, 329, 1, 0, 0, 0, 32, 331, 1, 0, 0, 0, 34, 343, 1, 0, 0, 0, 36, 346, 1, 0, 0, 0, 38, 367, 1, 0, 0, 0, 40, 409, 1, 0, 0, 0, 42, 412, 1, 0, 0, 0, 44, 437, 1, 0, 0, 0, 46, 474, 1, 0, 0, 0, 48, 485, 1, 0, 0, 0, 50, 490, 1, 0, 0, 0, 52, 517, 1, 0, 0, 0, 54, 519, 1, 0, 0, 0, 56, 544, 1, 0, 0, 0, 58, 593, 1, 0, 0, 0, 60, 595, 1, 0, 0, 0, 62, 621, 1, 0, 0, 0, 64, 649, 1, 0, 0, 0, 66, 651, 1, 0, 0, 0, 68, 663, 1, 0, 0, 0, 70, 676, 1, 0, 0, 0, 72, 679, 1, 0, 0, 0, 74, 699, 1, 0, 0, 0, 76, 701, 1, 0, 0, 0, 78, 709, 1, 0, 0, 0, 80, 783, 1, 0, 0, 0, 82, 785, 1, 0, 0, 0, 84, 796, 1, 0, 0, 0, 86, 798, 1, 0, 0, 0, 88, 803, 1, 0, 0, 0, 90, 805, 1, 0, 0, 0, 92, 827, 1, 0, 0, 0, 94, 829, 1, 0, 0, 0, 96, 838, 1, 0, 0, 0, 98, 863, 1, 0, 0, 0, 100, 892, 1, 0, 0, 0, 102, 894, 1, 0, 0, 0, 104, 901, 1, 0, 0, 0, 106, 915, 1, 0, 0, 0, 108, 925, 1, 0, 0, 0, 110, 940, 1, 0, 0, 0, 112, 972, 1, 0, 0, 0, 114, 974, 1, 0, 0, 0, 116, 976, 1, 0, 0, 0, 118, 978, 1, 0, 0, 0, 120, 1069, 1, 0, 0, 0, 122, 1071, 1, 0, 0, 0, 124, 1128, 1, 0, 0, 0, 126, 1130, 1, 0, 0, 0, 128, 1135, 1, 0, 0, 0, 130, 1137, 1, 0, 0, 0, 132, 1147, 1, 0, 0, 0, 134, 1149, 1, 0, 0, 0, 136, 1162, 1, 0, 0, 0, 138, 1166, 1, 0, 0, 0, 140, 1179, 1, 0, 0, 0, 142, 1181, 1, 0, 0, 0, 144, 145, 3, 6, 3, 0, 145, 146, 5, 0, 0, 1, 146, 157, 1, 0, 0, 0, 147, 148, 3, 20, 10, 0, 148, 149, 5, 0, 0, 1, 149, 157, 1, 0, 0, 0, 150, 151, 3, 50, 25, 0, 151, 152, 5, 0, 0, 1, 152, 157, 1, 0, 0, 0, 153, 154, 3, 2, 1, 0, 154, 155, 5, 0, 0, 1, 155, 157, 1, 0, 0, 0, 156, 144, 1, 0, 0, 0, 156, 147, 1, 0, 0, 0, 156, 150, 1, 0, 0, 0, 156, 153, 1, 0, 0, 0, 157, 1, 1, 0, 0, 0, 158, 159, 5, 32, 0, 0, 159, 163, 5, 127, 0, 0, 160, 162, 3, 8, 4, 0, 161, 160, 1, 0, 0, 0, 162, 165, 1, 0, 0, 0, 163, 161, 1, 0, 0, 0, 163, 164, 1, 0, 0, 0, 164, 166, 1, 0, 0, 0, 165, 163, 1, 0, 0, 0, 166, 167, 5, 128, 0, 0, 167, 3, 1, 0, 0, 0, 168, 169, 5, 33, 0, 0, 169, 170, 3, 142, 71, 0, 170, 171, 5, 124, 0, 0, 171, 5, 1, 0, 0, 0, 172, 173, 5, 1, 0, 0, 173, 174, 3, 140, 70, 0, 174, 175, 5, 74, 0, 0, 175, 176, 3, 142, 71, 0, 176, 177, 5, 68, 0, 0, 177, 178, 3, 142, 71, 0, 178, 179, 5, 67, 0, 0, 179, 180, 3, 142, 71, 0, 180, 184, 5, 127, 0, 0, 181, 183, 3, 8, 4, 0, 182, 181, 1, 0, 0, 0, 183, 186, 1, 0, 0, 0, 184, 182, 1, 0, 0, 0, 184, 185, 1, 0, 0, 0, 185, 187, 1, 0, 0, 0, 186, 184, 1, 0, 0, 0, 187, 188, 5, 128, 0, 0, 188, 7, 1, 0, 0, 0, 189, 197, 3, 4, 2, 0, 190, 197, 3, 18, 9, 0, 191, 197, 3, 10, 5, 0, 192, 197, 3, 86, 43, 0, 193, 197, 3, 98, 49, 0, 194, 197, 3, 122, 61, 0, 195, 197, 3, 32, 16, 0, 196, 189, 1, 0, 0, 0, 196, 190, 1, 0, 0, 0, 196, 191, 1, 0, 0, 0, 196, 192, 1, 0, 0, 0, 196, 193, 1, 0, 0, 0, 196, 194, 1, 0, 0, 0, 196, 195, 1, 0, 0, 0, 197, 9, 1, 0, 0, 0, 198, 199, 5, 33, 0, 0, 199, 200, 5, 36, 0, 0, 200, 201, 3, 140, 70, 0, 201, 202, 5, 124, 0, 0, 202, 209, 1, 0, 0, 0, 203, 204, 5, 33, 0, 0, 204, 205, 5, 38, 0, 0, 205, 206, 3, 140, 70, 0, 206, 207, 5, 124, 0, 0, 207, 209, 1, 0, 0, 0, 208, 198, 1, 0, 0, 0, 208, 203, 1, 0, 0, 0, 209, 11, 1, 0, 0, 0, 210, 211, 5, 34, 0, 0, 211, 212, 5, 35, 0, 0, 212, 213, 3, 140, 70, 0, 213, 214, 5, 74, 0, 0, 214, 215, 3, 142, 71, 0, 215, 216, 5, 124, 0, 0, 216, 13, 1, 0, 0, 0, 217, 218, 5, 34, 0, 0, 218, 219, 5, 36, 0, 0, 219, 220, 3, 140, 70, 0, 220, 221, 5, 68, 0, 0, 221, 222, 3, 142, 71, 0, 222, 223, 5, 124, 0, 0, 223, 15, 1, 0, 0, 0, 224, 229, 3, 10, 5, 0, 225, 229, 3, 12, 6, 0, 226, 229, 3, 14, 7, 0, 227, 229, 3, 32, 16, 0, 228, 224, 1, 0, 0, 0, 228, 225, 1, 0, 0, 0, 228, 226, 1, 0, 0, 0, 228, 227, 1, 0, 0, 0, 229, 17, 1, 0, 0, 0, 230, 231, 5, 35, 0, 0, 231, 232, 3, 140, 70, 0, 232, 233, 5, 74, 0, 0, 233, 236, 3, 142, 71, 0, 234, 235, 5, 75, 0, 0, 235, 237, 3, 142, 71, 0, 236, 234, 1, 0, 0, 0, 236, 237, 1, 0, 0, 0, 237, 238, 1, 0, 0, 0, 238, 239, 5, 124, 0, 0, 239, 19, 1, 0, 0, 0, 240, 242, 3, 16, 8, 0, 241, 240, 1, 0, 0, 0, 242, 245, 1, 0, 0, 0, 243, 241, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 246, 1, 0, 0, 0, 245, 243, 1, 0, 0, 0, 246, 247, 5, 36, 0, 0, 247, 249, 3, 140, 70, 0, 248, 250, 3, 22, 11, 0, 249, 248, 1, 0, 0, 0, 249, 250, 1, 0, 0, 0, 250, 251, 1, 0, 0, 0, 251, 252, 5, 74, 0, 0, 252, 253, 3, 142, 71, 0, 253, 254, 5, 68, 0, 0, 254, 264, 3, 142, 71, 0, 255, 256, 5, 79, 0, 0, 256, 261, 3, 26, 13, 0, 257, 258, 5, 125, 0, 0, 258, 260, 3, 26, 13, 0, 259, 257, 1, 0, 0, 0, 260, 263, 1, 0, 0, 0, 261, 259, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 265, 1, 0, 0, 0, 263, 261, 1, 0, 0, 0, 264, 255, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 266, 1, 0, 0, 0, 266, 270, 5, 127, 0, 0, 267, 269, 3, 34, 17, 0, 268, 267, 1, 0, 0, 0, 269, 272, 1, 0, 0, 0, 270, 268, 1, 0, 0, 0, 270, 271, 1, 0, 0, 0, 271, 273, 1, 0, 0, 0, 272, 270, 1, 0, 0, 0, 273, 274, 5, 128, 0, 0, 274, 21, 1, 0, 0, 0, 275, 276, 5, 133, 0, 0, 276, 281, 3, 24, 12, 0, 277, 278, 5, 125, 0, 0, 278, 280, 3, 24, 12, 0, 279, 277, 1, 0, 0, 0, 280, 283, 1, 0, 0, 0, 281, 279, 1, 0, 0, 0, 281, 282, 1, 0, 0, 0, 282, 284, 1, 0, 0, 0, 283, 281, 1, 0, 0, 0, 284, 285, 5, 134, 0, 0, 285, 23, 1, 0, 0, 0, 286, 287, 5, 39, 0, 0, 287, 290, 3, 140, 70, 0, 288, 289, 5, 123, 0, 0, 289, 291, 5, 29, 0, 0, 290, 288, 1, 0, 0, 0, 290, 291, 1, 0, 0, 0, 291, 306, 1, 0, 0, 0, 292, 293, 5, 28, 0, 0, 293, 303, 3, 140, 70, 0, 294, 295, 5, 30, 0, 0, 295, 300, 3, 26, 13, 0, 296, 297, 5, 135, 0, 0, 297, 299, 3, 26, 13, 0, 298, 296, 1, 0, 0, 0, 299, 302, 1, 0, 0, 0, 300, 298, 1, 0, 0, 0, 300, 301, 1, 0, 0, 0, 301, 304, 1, 0, 0, 0, 302, 300, 1, 0, 0, 0, 303, 294, 1, 0, 0, 0, 303, 304, 1, 0, 0, 0, 304, 306, 1, 0, 0, 0, 305, 286, 1, 0, 0, 0, 305, 292, 1, 0, 0, 0, 306, 25, 1, 0, 0, 0, 307, 309, 3, 140, 70, 0, 308, 310, 3, 28, 14, 0, 309, 308, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 27, 1, 0, 0, 0, 311, 312, 5, 133, 0, 0, 312, 317, 3, 30, 15, 0, 313, 314, 5, 125, 0, 0, 314, 316, 3, 30, 15, 0, 315, 313, 1, 0, 0, 0, 316, 319, 1, 0, 0, 0, 317, 315, 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 320, 1, 0, 0, 0, 319, 317, 1, 0, 0, 0, 320, 321, 5, 134, 0, 0, 321, 29, 1, 0, 0, 0, 322, 323, 5, 35, 0, 0, 323, 330, 3, 140, 70, 0, 324, 325, 5, 36, 0, 0, 325, 330, 3, 26, 13, 0, 326, 327, 5, 28, 0, 0, 327, 330, 3, 140, 70, 0, 328, 330, 3, 124, 62, 0, 329, 322, 1, 0, 0, 0, 329, 324, 1, 0, 0, 0, 329, 326, 1, 0, 0, 0, 329, 328, 1, 0, 0, 0, 330, 31, 1, 0, 0, 0, 331, 332, 5, 27, 0, 0, 332, 334, 3, 140, 70, 0, 333, 335, 3, 22, 11, 0, 334, 333, 1, 0, 0, 0, 334, 335, 1, 0, 0, 0, 335, 336, 1, 0, 0, 0, 336, 337, 5, 136, 0, 0, 337, 338, 3, 124, 62, 0, 338, 339, 5, 124, 0, 0, 339, 33, 1, 0, 0, 0, 340, 344, 3, 38, 19, 0, 341, 344, 3, 42, 21, 0, 342, 344, 3, 36, 18, 0, 343, 340, 1, 0, 0, 0, 343, 341, 1, 0, 0, 0, 343, 342, 1, 0, 0, 0, 344, 35, 1, 0, 0, 0, 345, 347, 5, 49, 0, 0, 346, 345, 1, 0, 0, 0, 346, 347, 1, 0, 0, 0, 347, 348, 1, 0, 0, 0, 348, 349, 5, 41, 0, 0, 349, 350, 3, 140, 70, 0, 350, 351, 5, 74, 0, 0, 351, 352, 3, 142, 71, 0, 352, 353, 5, 123, 0, 0, 353, 354, 3, 124, 62, 0, 354, 355, 5, 122, 0, 0, 355, 356, 3, 124, 62, 0, 356, 357, 5, 127, 0, 0, 357, 358, 5, 91, 0, 0, 358, 359, 5, 74, 0, 0, 359, 361, 3, 142, 71, 0, 360, 362, 3, 64, 32, 0, 361, 360, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 363, 1, 0, 0, 0, 363, 364, 5, 124, 0, 0, 364, 365, 5, 128, 0, 0, 365, 37, 1, 0, 0, 0, 366, 368, 3, 44, 22, 0, 367, 366, 1, 0, 0, 0, 367, 368, 1, 0, 0, 0, 368, 369, 1, 0, 0, 0, 369, 370, 5, 39, 0, 0, 370, 371, 3, 140, 70, 0, 371, 372, 5, 74, 0, 0, 372, 373, 3, 142, 71, 0, 373, 374, 5, 123, 0, 0, 374, 375, 3, 124, 62, 0, 375, 379, 5, 127, 0, 0, 376, 378, 3, 40, 20, 0, 377, 376, 1, 0, 0, 0, 378, 381, 1, 0, 0, 0, 379, 377, 1, 0, 0, 0, 379, 380, 1, 0, 0, 0, 380, 382, 1, 0, 0, 0, 381, 379, 1, 0, 0, 0, 382, 383, 5, 128, 0, 0, 383, 39, 1, 0, 0, 0, 384, 385, 5, 81, 0, 0, 385, 386, 5, 74, 0, 0, 386, 388, 3, 142, 71, 0, 387, 389, 3, 64, 32, 0, 388, 387, 1, 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 390, 1, 0, 0, 0, 390, 391, 5, 124, 0, 0, 391, 410, 1, 0, 0, 0, 392, 393, 5, 82, 0, 0, 393, 394, 5, 74, 0, 0, 394, 396, 3, 142, 71, 0, 395, 397, 3, 64, 32, 0, 396, 395, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 398, 1, 0, 0, 0, 398, 399, 5, 124, 0, 0, 399, 410, 1, 0, 0, 0, 400, 401, 5, 83, 0, 0, 401, 402, 5, 84, 0, 0, 402, 403, 5, 74, 0, 0, 403, 404, 3, 142, 71, 0, 404, 405, 5, 85, 0, 0, 405, 406, 5, 74, 0, 0, 406, 407, 3, 142, 71, 0, 407, 408, 5, 124, 0, 0, 408, 410, 1, 0, 0, 0, 409, 384, 1, 0, 0, 0, 409, 392, 1, 0, 0, 0, 409, 400, 1, 0, 0, 0, 410, 41, 1, 0, 0, 0, 411, 413, 3, 44, 22, 0, 412, 411, 1, 0, 0, 0, 412, 413, 1, 0, 0, 0, 413, 414, 1, 0, 0, 0, 414, 415, 5, 40, 0, 0, 415, 416, 3, 140, 70, 0, 416, 417, 5, 74, 0, 0, 417, 418, 3, 142, 71, 0, 418, 419, 5, 123, 0, 0, 419, 420, 3, 130, 65, 0, 420, 422, 3, 48, 24, 0, 421, 423, 5, 102, 0, 0, 422, 421, 1, 0, 0, 0, 422, 423, 1, 0, 0, 0, 423, 426, 1, 0, 0, 0, 424, 425, 5, 72, 0, 0, 425, 427, 3, 142, 71, 0, 426, 424, 1, 0, 0, 0, 426, 427, 1, 0, 0, 0, 427, 428, 1, 0, 0, 0, 428, 432, 5, 127, 0, 0, 429, 431, 3, 46, 23, 0, 430, 429, 1, 0, 0, 0, 431, 434, 1, 0, 0, 0, 432, 430, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 435, 1, 0, 0, 0, 434, 432, 1, 0, 0, 0, 435, 436, 5, 128, 0, 0, 436, 43, 1, 0, 0, 0, 437, 439, 5, 24, 0, 0, 438, 440, 7, 0, 0, 0, 439, 438, 1, 0, 0, 0, 439, 440, 1, 0, 0, 0, 440, 45, 1, 0, 0, 0, 441, 442, 5, 88, 0, 0, 442, 443, 5, 74, 0, 0, 443, 445, 3, 142, 71, 0, 444, 446, 3, 64, 32, 0, 445, 444, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 447, 1, 0, 0, 0, 447, 448, 5, 124, 0, 0, 448, 475, 1, 0, 0, 0, 449, 450, 5, 89, 0, 0, 450, 451, 5, 74, 0, 0, 451, 453, 3, 142, 71, 0, 452, 454, 3, 64, 32, 0, 453, 452, 1, 0, 0, 0, 453, 454, 1, 0, 0, 0, 454, 455, 1, 0, 0, 0, 455, 456, 5, 124, 0, 0, 456, 475, 1, 0, 0, 0, 457, 458, 5, 90, 0, 0, 458, 459, 5, 74, 0, 0, 459, 461, 3, 142, 71, 0, 460, 462, 3, 64, 32, 0, 461, 460, 1, 0, 0, 0, 461, 462, 1, 0, 0, 0, 462, 463, 1, 0, 0, 0, 463, 464, 5, 124, 0, 0, 464, 475, 1, 0, 0, 0, 465, 466, 5, 83, 0, 0, 466, 467, 5, 84, 0, 0, 467, 468, 5, 74, 0, 0, 468, 469, 3, 142, 71, 0, 469, 470, 5, 85, 0, 0, 470, 471, 5, 74, 0, 0, 471, 472, 3, 142, 71, 0, 472, 473, 5, 124, 0, 0, 473, 475, 1, 0, 0, 0, 474, 441, 1, 0, 0, 0, 474, 449, 1, 0, 0, 0, 474, 457, 1, 0, 0, 0, 474, 465, 1, 0, 0, 0, 475, 47, 1, 0, 0, 0, 476, 477, 5, 35, 0, 0, 477, 486, 3, 140, 70, 0, 478, 479, 5, 36, 0, 0, 479, 481, 3, 140, 70, 0, 480, 482, 3, 28, 14, 0, 481, 480, 1, 0, 0, 0, 481, 482, 1, 0, 0, 0, 482, 486, 1, 0, 0, 0, 483, 484, 5, 28, 0, 0, 484, 486, 3, 140, 70, 0, 485, 476, 1, 0, 0, 0, 485, 478, 1, 0, 0, 0, 485, 483, 1, 0, 0, 0, 486, 49, 1, 0, 0, 0, 487, 489, 3, 16, 8, 0, 488, 487, 1, 0, 0, 0, 489, 492, 1, 0, 0, 0, 490, 488, 1, 0, 0, 0, 490, 491, 1, 0, 0, 0, 491, 493, 1, 0, 0, 0, 492, 490, 1, 0, 0, 0, 493, 494, 5, 38, 0, 0, 494, 495, 3, 140, 70, 0, 495, 496, 5, 74, 0, 0, 496, 497, 3, 142, 71, 0, 497, 498, 5, 68, 0, 0, 498, 501, 3, 142, 71, 0, 499, 500, 5, 69, 0, 0, 500, 502, 5, 137, 0, 0, 501, 499, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 507, 5, 127, 0, 0, 504, 506, 3, 52, 26, 0, 505, 504, 1, 0, 0, 0, 506, 509, 1, 0, 0, 0, 507, 505, 1, 0, 0, 0, 507, 508, 1, 0, 0, 0, 508, 510, 1, 0, 0, 0, 509, 507, 1, 0, 0, 0, 510, 511, 5, 128, 0, 0, 511, 51, 1, 0, 0, 0, 512, 518, 3, 60, 30, 0, 513, 518, 3, 62, 31, 0, 514, 518, 3, 68, 34, 0, 515, 518, 3, 54, 27, 0, 516, 518, 3, 56, 28, 0, 517, 512, 1, 0, 0, 0, 517, 513, 1, 0, 0, 0, 517, 514, 1, 0, 0, 0, 517, 515, 1, 0, 0, 0, 517, 516, 1, 0, 0, 0, 518, 53, 1, 0, 0, 0, 519, 520, 5, 14, 0, 0, 520, 522, 3, 140, 70, 0, 521, 523, 3, 22, 11, 0, 522, 521, 1, 0, 0, 0, 522, 523, 1, 0, 0, 0, 523, 524, 1, 0, 0, 0, 524, 525, 5, 74, 0, 0, 525, 526, 3, 142, 71, 0, 526, 528, 5, 17, 0, 0, 527, 529, 5, 1, 0, 0, 528, 527, 1, 0, 0, 0, 528, 529, 1, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 531, 3, 26, 13, 0, 531, 532, 5, 18, 0, 0, 532, 533, 3, 142, 71, 0, 533, 534, 5, 41, 0, 0, 534, 535, 3, 142, 71, 0, 535, 539, 5, 127, 0, 0, 536, 538, 3, 58, 29, 0, 537, 536, 1, 0, 0, 0, 538, 541, 1, 0, 0, 0, 539, 537, 1, 0, 0, 0, 539, 540, 1, 0, 0, 0, 540, 542, 1, 0, 0, 0, 541, 539, 1, 0, 0, 0, 542, 543, 5, 128, 0, 0, 543, 55, 1, 0, 0, 0, 544, 545, 5, 14, 0, 0, 545, 546, 3, 140, 70, 0, 546, 547, 5, 74, 0, 0, 547, 548, 3, 142, 71, 0, 548, 549, 5, 16, 0, 0, 549, 550, 3, 140, 70, 0, 550, 551, 3, 28, 14, 0, 551, 552, 5, 124, 0, 0, 552, 57, 1, 0, 0, 0, 553, 554, 5, 8, 0, 0, 554, 594, 5, 124, 0, 0, 555, 556, 5, 9, 0, 0, 556, 557, 5, 10, 0, 0, 557, 558, 3, 140, 70, 0, 558, 559, 5, 124, 0, 0, 559, 594, 1, 0, 0, 0, 560, 561, 5, 19, 0, 0, 561, 562, 3, 142, 71, 0, 562, 563, 5, 124, 0, 0, 563, 594, 1, 0, 0, 0, 564, 566, 5, 20, 0, 0, 565, 567, 5, 28, 0, 0, 566, 565, 1, 0, 0, 0, 566, 567, 1, 0, 0, 0, 567, 568, 1, 0, 0, 0, 568, 569, 3, 140, 70, 0, 569, 570, 5, 47, 0, 0, 570, 571, 3, 26, 13, 0, 571, 572, 5, 124, 0, 0, 572, 594, 1, 0, 0, 0, 573, 574, 5, 21, 0, 0, 574, 575, 3, 140, 70, 0, 575, 576, 5, 137, 0, 0, 576, 577, 5, 124, 0, 0, 577, 594, 1, 0, 0, 0, 578, 579, 5, 22, 0, 0, 579, 580, 3, 26, 13, 0, 580, 581, 5, 126, 0, 0, 581, 582, 3, 140, 70, 0, 582, 583, 3, 140, 70, 0, 583, 584, 3, 142, 71, 0, 584, 585, 5, 124, 0, 0, 585, 594, 1, 0, 0, 0, 586, 587, 5, 83, 0, 0, 587, 594, 5, 124, 0, 0, 588, 589, 5, 23, 0, 0, 589, 590, 5, 137, 0, 0, 590, 591, 3, 142, 71, 0, 591, 592, 5, 124, 0, 0, 592, 594, 1, 0, 0, 0, 593, 553, 1, 0, 0, 0, 593, 555, 1, 0, 0, 0, 593, 560, 1, 0, 0, 0, 593, 564, 1, 0, 0, 0, 593, 573, 1, 0, 0, 0, 593, 578, 1, 0, 0, 0, 593, 586, 1, 0, 0, 0, 593, 588, 1, 0, 0, 0, 594, 59, 1, 0, 0, 0, 595, 596, 5, 41, 0, 0, 596, 598, 3, 140, 70, 0, 597, 599, 3, 22, 11, 0, 598, 597, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 600, 1, 0, 0, 0, 600, 601, 5, 74, 0, 0, 601, 602, 3, 142, 71, 0, 602, 603, 5, 123, 0, 0, 603, 604, 3, 124, 62, 0, 604, 605, 5, 122, 0, 0, 605, 606, 3, 124, 62, 0, 606, 607, 5, 76, 0, 0, 607, 609, 3, 72, 36, 0, 608, 610, 3, 64, 32, 0, 609, 608, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 612, 1, 0, 0, 0, 611, 613, 3, 70, 35, 0, 612, 611, 1, 0, 0, 0, 612, 613, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 615, 5, 78, 0, 0, 615, 617, 3, 74, 37, 0, 616, 618, 3, 78, 39, 0, 617, 616, 1, 0, 0, 0, 617, 618, 1, 0, 0, 0, 618, 619, 1, 0, 0, 0, 619, 620, 5, 124, 0, 0, 620, 61, 1, 0, 0, 0, 621, 622, 5, 42, 0, 0, 622, 624, 3, 140, 70, 0, 623, 625, 3, 22, 11, 0, 624, 623, 1, 0, 0, 0, 624, 625, 1, 0, 0, 0, 625, 626, 1, 0, 0, 0, 626, 627, 5, 74, 0, 0, 627, 628, 3, 142, 71, 0, 628, 629, 5, 123, 0, 0, 629, 630, 3, 124, 62, 0, 630, 631, 5, 122, 0, 0, 631, 633, 3, 124, 62, 0, 632, 634, 3, 64, 32, 0, 633, 632, 1, 0, 0, 0, 633, 634, 1, 0, 0, 0, 634, 636, 1, 0, 0, 0, 635, 637, 3, 78, 39, 0, 636, 635, 1, 0, 0, 0, 636, 637, 1, 0, 0, 0, 637, 638, 1, 0, 0, 0, 638, 639, 5, 124, 0, 0, 639, 63, 1, 0, 0, 0, 640, 641, 5, 2, 0, 0, 641, 650, 5, 5, 0, 0, 642, 643, 5, 2, 0, 0, 643, 644, 7, 1, 0, 0, 644, 645, 5, 6, 0, 0, 645, 646, 5, 129, 0, 0, 646, 647, 3, 76, 38, 0, 647, 648, 5, 130, 0, 0, 648, 650, 1, 0, 0, 0, 649, 640, 1, 0, 0, 0, 649, 642, 1, 0, 0, 0, 650, 65, 1, 0, 0, 0, 651, 652, 5, 57, 0, 0, 652, 653, 5, 129, 0, 0, 653, 658, 3, 108, 54, 0, 654, 655, 5, 125, 0, 0, 655, 657, 3, 108, 54, 0, 656, 654, 1, 0, 0, 0, 657, 660, 1, 0, 0, 0, 658, 656, 1, 0, 0, 0, 658, 659, 1, 0, 0, 0, 659, 661, 1, 0, 0, 0, 660, 658, 1, 0, 0, 0, 661, 662, 5, 130, 0, 0, 662, 67, 1, 0, 0, 0, 663, 664, 5, 43, 0, 0, 664, 665, 3, 140, 70, 0, 665, 666, 5, 74, 0, 0, 666, 667, 3, 142, 71, 0, 667, 668, 5, 44, 0, 0, 668, 669, 3, 140, 70, 0, 669, 670, 5, 123, 0, 0, 670, 672, 3, 124, 62, 0, 671, 673, 3, 78, 39, 0, 672, 671, 1, 0, 0, 0, 672, 673, 1, 0, 0, 0, 673, 674, 1, 0, 0, 0, 674, 675, 5, 124, 0, 0, 675, 69, 1, 0, 0, 0, 676, 677, 5, 77, 0, 0, 677, 678, 3, 124, 62, 0, 678, 71, 1, 0, 0, 0, 679, 680, 7, 2, 0, 0, 680, 73, 1, 0, 0, 0, 681, 700, 5, 80, 0, 0, 682, 683, 5, 35, 0, 0, 683, 700, 3, 140, 70, 0, 684, 685, 5, 28, 0, 0, 685, 700, 3, 140, 70, 0, 686, 687, 5, 37, 0, 0, 687, 696, 5, 129, 0, 0, 688, 693, 3, 26, 13, 0, 689, 690, 5, 125, 0, 0, 690, 692, 3, 26, 13, 0, 691, 689, 1, 0, 0, 0, 692, 695, 1, 0, 0, 0, 693, 691, 1, 0, 0, 0, 693, 694, 1, 0, 0, 0, 694, 697, 1, 0, 0, 0, 695, 693, 1, 0, 0, 0, 696, 688, 1, 0, 0, 0, 696, 697, 1, 0, 0, 0, 697, 698, 1, 0, 0, 0, 698, 700, 5, 130, 0, 0, 699, 681, 1, 0, 0, 0, 699, 682, 1, 0, 0, 0, 699, 684, 1, 0, 0, 0, 699, 686, 1, 0, 0, 0, 700, 75, 1, 0, 0, 0, 701, 706, 3, 140, 70, 0, 702, 703, 5, 125, 0, 0, 703, 705, 3, 140, 70, 0, 704, 702, 1, 0, 0, 0, 705, 708, 1, 0, 0, 0, 706, 704, 1, 0, 0, 0, 706, 707, 1, 0, 0, 0, 707, 77, 1, 0, 0, 0, 708, 706, 1, 0, 0, 0, 709, 710, 5, 79, 0, 0, 710, 714, 5, 127, 0, 0, 711, 713, 3, 80, 40, 0, 712, 711, 1, 0, 0, 0, 713, 716, 1, 0, 0, 0, 714, 712, 1, 0, 0, 0, 714, 715, 1, 0, 0, 0, 715, 717, 1, 0, 0, 0, 716, 714, 1, 0, 0, 0, 717, 718, 5, 128, 0, 0, 718, 79, 1, 0, 0, 0, 719, 720, 5, 15, 0, 0, 720, 721, 3, 140, 70, 0, 721, 722, 5, 74, 0, 0, 722, 723, 3, 142, 71, 0, 723, 724, 5, 129, 0, 0, 724, 725, 3, 76, 38, 0, 725, 726, 5, 130, 0, 0, 726, 727, 5, 124, 0, 0, 727, 784, 1, 0, 0, 0, 728, 729, 5, 53, 0, 0, 729, 730, 3, 140, 70, 0, 730, 731, 5, 74, 0, 0, 731, 732, 3, 142, 71, 0, 732, 733, 5, 123, 0, 0, 733, 734, 3, 124, 62, 0, 734, 735, 3, 82, 41, 0, 735, 736, 5, 124, 0, 0, 736, 784, 1, 0, 0, 0, 737, 738, 5, 54, 0, 0, 738, 739, 3, 140, 70, 0, 739, 740, 5, 74, 0, 0, 740, 741, 3, 142, 71, 0, 741, 742, 5, 123, 0, 0, 742, 743, 3, 130, 65, 0, 743, 744, 3, 48, 24, 0, 744, 745, 3, 82, 41, 0, 745, 746, 5, 124, 0, 0, 746, 784, 1, 0, 0, 0, 747, 748, 5, 36, 0, 0, 748, 749, 3, 140, 70, 0, 749, 750, 5, 74, 0, 0, 750, 751, 3, 142, 71, 0, 751, 752, 5, 123, 0, 0, 752, 754, 3, 140, 70, 0, 753, 755, 3, 28, 14, 0, 754, 753, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 757, 1, 0, 0, 0, 756, 758, 3, 66, 33, 0, 757, 756, 1, 0, 0, 0, 757, 758, 1, 0, 0, 0, 758, 759, 1, 0, 0, 0, 759, 760, 5, 124, 0, 0, 760, 784, 1, 0, 0, 0, 761, 762, 5, 43, 0, 0, 762, 763, 3, 140, 70, 0, 763, 764, 5, 74, 0, 0, 764, 765, 3, 142, 71, 0, 765, 766, 5, 123, 0, 0, 766, 769, 3, 140, 70, 0, 767, 768, 5, 45, 0, 0, 768, 770, 3, 124, 62, 0, 769, 767, 1, 0, 0, 0, 769, 770, 1, 0, 0, 0, 770, 771, 1, 0, 0, 0, 771, 772, 5, 124, 0, 0, 772, 784, 1, 0, 0, 0, 773, 774, 5, 14, 0, 0, 774, 775, 3, 140, 70, 0, 775, 776, 5, 74, 0, 0, 776, 777, 3, 142, 71, 0, 777, 778, 5, 123, 0, 0, 778, 779, 3, 140, 70, 0, 779, 780, 5, 126, 0, 0, 780, 781, 3, 140, 70, 0, 781, 782, 5, 124, 0, 0, 782, 784, 1, 0, 0, 0, 783, 719, 1, 0, 0, 0, 783, 728, 1, 0, 0, 0, 783, 737, 1, 0, 0, 0, 783, 747, 1, 0, 0, 0, 783, 761, 1, 0, 0, 0, 783, 773, 1, 0, 0, 0, 784, 81, 1, 0, 0, 0, 785, 786, 5, 129, 0, 0, 786, 791, 3, 84, 42, 0, 787, 788, 5, 125, 0, 0, 788, 790, 3, 84, 42, 0, 789, 787, 1, 0, 0, 0, 790, 793, 1, 0, 0, 0, 791, 789, 1, 0, 0, 0, 791, 792, 1, 0, 0, 0, 792, 794, 1, 0, 0, 0, 793, 791, 1, 0, 0, 0, 794, 795, 5, 130, 0, 0, 795, 83, 1, 0, 0, 0, 796, 797, 7, 3, 0, 0, 797, 85, 1, 0, 0, 0, 798, 799, 5, 52, 0, 0, 799, 800, 3, 88, 44, 0, 800, 87, 1, 0, 0, 0, 801, 804, 3, 90, 45, 0, 802, 804, 3, 94, 47, 0, 803, 801, 1, 0, 0, 0, 803, 802, 1, 0, 0, 0, 804, 89, 1, 0, 0, 0, 805, 806, 5, 53, 0, 0, 806, 807, 3, 140, 70, 0, 807, 808, 5, 74, 0, 0, 808, 809, 3, 142, 71, 0, 809, 810, 5, 62, 0, 0, 810, 811, 3, 140, 70, 0, 811, 812, 5, 123, 0, 0, 812, 813, 3, 124, 62, 0, 813, 814, 5, 63, 0, 0, 814, 817, 3, 92, 46, 0, 815, 816, 5, 64, 0, 0, 816, 818, 3, 132, 66, 0, 817, 815, 1, 0, 0, 0, 817, 818, 1, 0, 0, 0, 818, 819, 1, 0, 0, 0, 819, 820, 5, 124, 0, 0, 820, 91, 1, 0, 0, 0, 821, 828, 5, 96, 0, 0, 822, 823, 5, 97, 0, 0, 823, 824, 5, 131, 0, 0, 824, 825, 3, 124, 62, 0, 825, 826, 5, 132, 0, 0, 826, 828, 1, 0, 0, 0, 827, 821, 1, 0, 0, 0, 827, 822, 1, 0, 0, 0, 828, 93, 1, 0, 0, 0, 829, 830, 5, 54, 0, 0, 830, 831, 3, 140, 70, 0, 831, 832, 5, 74, 0, 0, 832, 833, 3, 142, 71, 0, 833, 834, 5, 127, 0, 0, 834, 835, 3, 96, 48, 0, 835, 836, 3, 96, 48, 0, 836, 837, 5, 128, 0, 0, 837, 95, 1, 0, 0, 0, 838, 839, 3, 48, 24, 0, 839, 840, 5, 55, 0, 0, 840, 841, 3, 140, 70, 0, 841, 842, 5, 74, 0, 0, 842, 843, 3, 142, 71, 0, 843, 845, 3, 130, 65, 0, 844, 846, 5, 102, 0, 0, 845, 844, 1, 0, 0, 0, 845, 846, 1, 0, 0, 0, 846, 849, 1, 0, 0, 0, 847, 848, 5, 70, 0, 0, 848, 850, 3, 142, 71, 0, 849, 847, 1, 0, 0, 0, 849, 850, 1, 0, 0, 0, 850, 852, 1, 0, 0, 0, 851, 853, 5, 71, 0, 0, 852, 851, 1, 0, 0, 0, 852, 853, 1, 0, 0, 0, 853, 856, 1, 0, 0, 0, 854, 855, 5, 72, 0, 0, 855, 857, 3, 142, 71, 0, 856, 854, 1, 0, 0, 0, 856, 857, 1, 0, 0, 0, 857, 859, 1, 0, 0, 0, 858, 860, 5, 73, 0, 0, 859, 858, 1, 0, 0, 0, 859, 860, 1, 0, 0, 0, 860, 861, 1, 0, 0, 0, 861, 862, 5, 124, 0, 0, 862, 97, 1, 0, 0, 0, 863, 864, 5, 46, 0, 0, 864, 865, 3, 140, 70, 0, 865, 866, 5, 47, 0, 0, 866, 868, 3, 140, 70, 0, 867, 869, 3, 28, 14, 0, 868, 867, 1, 0, 0, 0, 868, 869, 1, 0, 0, 0, 869, 872, 1, 0, 0, 0, 870, 871, 5, 74, 0, 0, 871, 873, 3, 142, 71, 0, 872, 870, 1, 0, 0, 0, 872, 873, 1, 0, 0, 0, 873, 876, 1, 0, 0, 0, 874, 875, 5, 69, 0, 0, 875, 877, 5, 137, 0, 0, 876, 874, 1, 0, 0, 0, 876, 877, 1, 0, 0, 0, 877, 878, 1, 0, 0, 0, 878, 882, 5, 127, 0, 0, 879, 881, 3, 100, 50, 0, 880, 879, 1, 0, 0, 0, 881, 884, 1, 0, 0, 0, 882, 880, 1, 0, 0, 0, 882, 883, 1, 0, 0, 0, 883, 885, 1, 0, 0, 0, 884, 882, 1, 0, 0, 0, 885, 886, 5, 128, 0, 0, 886, 99, 1, 0, 0, 0, 887, 888, 5, 51, 0, 0, 888, 893, 3, 88, 44, 0, 889, 893, 3, 106, 53, 0, 890, 893, 3, 102, 51, 0, 891, 893, 3, 104, 52, 0, 892, 887, 1, 0, 0, 0, 892, 889, 1, 0, 0, 0, 892, 890, 1, 0, 0, 0, 892, 891, 1, 0, 0, 0, 893, 101, 1, 0, 0, 0, 894, 895, 5, 48, 0, 0, 895, 896, 3, 140, 70, 0, 896, 897, 5, 50, 0, 0, 897, 898, 5, 53, 0, 0, 898, 899, 3, 140, 70, 0, 899, 900, 5, 124, 0, 0, 900, 103, 1, 0, 0, 0, 901, 902, 5, 59, 0, 0, 902, 903, 3, 140, 70, 0, 903, 904, 5, 60, 0, 0, 904, 905, 5, 61, 0, 0, 905, 906, 5, 57, 0, 0, 906, 907, 5, 43, 0, 0, 907, 908, 3, 140, 70, 0, 908, 909, 5, 58, 0, 0, 909, 910, 5, 54, 0, 0, 910, 911, 3, 140, 70, 0, 911, 912, 5, 126, 0, 0, 912, 913, 3, 140, 70, 0, 913, 914, 5, 124, 0, 0, 914, 105, 1, 0, 0, 0, 915, 916, 5, 48, 0, 0, 916, 917, 3, 108, 54, 0, 917, 918, 5, 50, 0, 0, 918, 921, 3, 112, 56, 0, 919, 920, 5, 26, 0, 0, 920, 922, 3, 142, 71, 0, 921, 919, 1, 0, 0, 0, 921, 922, 1, 0, 0, 0, 922, 923, 1, 0, 0, 0, 923, 924, 5, 124, 0, 0, 924, 107, 1, 0, 0, 0, 925, 926, 3, 140, 70, 0, 926, 927, 5, 126, 0, 0, 927, 928, 3, 110, 55, 0, 928, 109, 1, 0, 0, 0, 929, 941, 3, 140, 70, 0, 930, 941, 5, 91, 0, 0, 931, 941, 5, 81, 0, 0, 932, 941, 5, 82, 0, 0, 933, 941, 5, 88, 0, 0, 934, 941, 5, 89, 0, 0, 935, 941, 5, 90, 0, 0, 936, 941, 5, 92, 0, 0, 937, 941, 5, 93, 0, 0, 938, 941, 5, 94, 0, 0, 939, 941, 5, 95, 0, 0, 940, 929, 1, 0, 0, 0, 940, 930, 1, 0, 0, 0, 940, 931, 1, 0, 0, 0, 940, 932, 1, 0, 0, 0, 940, 933, 1, 0, 0, 0, 940, 934, 1, 0, 0, 0, 940, 935, 1, 0, 0, 0, 940, 936, 1, 0, 0, 0, 940, 937, 1, 0, 0, 0, 940, 938, 1, 0, 0, 0, 940, 939, 1, 0, 0, 0, 941, 111, 1, 0, 0, 0, 942, 943, 5, 53, 0, 0, 943, 944, 3, 140, 70, 0, 944, 945, 5, 126, 0, 0, 945, 946, 3, 114, 57, 0, 946, 973, 1, 0, 0, 0, 947, 948, 5, 54, 0, 0, 948, 949, 3, 140, 70, 0, 949, 950, 5, 126, 0, 0, 950, 951, 3, 140, 70, 0, 951, 952, 5, 126, 0, 0, 952, 953, 3, 116, 58, 0, 953, 973, 1, 0, 0, 0, 954, 955, 5, 36, 0, 0, 955, 957, 3, 140, 70, 0, 956, 958, 3, 28, 14, 0, 957, 956, 1, 0, 0, 0, 957, 958, 1, 0, 0, 0, 958, 959, 1, 0, 0, 0, 959, 960, 5, 126, 0, 0, 960, 961, 3, 108, 54, 0, 961, 973, 1, 0, 0, 0, 962, 963, 5, 38, 0, 0, 963, 964, 3, 140, 70, 0, 964, 965, 5, 126, 0, 0, 965, 967, 3, 140, 70, 0, 966, 968, 3, 28, 14, 0, 967, 966, 1, 0, 0, 0, 967, 968, 1, 0, 0, 0, 968, 970, 1, 0, 0, 0, 969, 971, 3, 118, 59, 0, 970, 969, 1, 0, 0, 0, 970, 971, 1, 0, 0, 0, 971, 973, 1, 0, 0, 0, 972, 942, 1, 0, 0, 0, 972, 947, 1, 0, 0, 0, 972, 954, 1, 0, 0, 0, 972, 962, 1, 0, 0, 0, 973, 113, 1, 0, 0, 0, 974, 975, 7, 4, 0, 0, 975, 115, 1, 0, 0, 0, 976, 977, 7, 5, 0, 0, 977, 117, 1, 0, 0, 0, 978, 979, 5, 56, 0, 0, 979, 983, 5, 127, 0, 0, 980, 982, 3, 120, 60, 0, 981, 980, 1, 0, 0, 0, 982, 985, 1, 0, 0, 0, 983, 981, 1, 0, 0, 0, 983, 984, 1, 0, 0, 0, 984, 986, 1, 0, 0, 0, 985, 983, 1, 0, 0, 0, 986, 987, 5, 128, 0, 0, 987, 119, 1, 0, 0, 0, 988, 989, 3, 140, 70, 0, 989, 990, 5, 50, 0, 0, 990, 991, 5, 1, 0, 0, 991, 992, 5, 15, 0, 0, 992, 993, 5, 129, 0, 0, 993, 994, 3, 76, 38, 0, 994, 995, 5, 130, 0, 0, 995, 996, 5, 124, 0, 0, 996, 1070, 1, 0, 0, 0, 997, 998, 3, 140, 70, 0, 998, 999, 5, 50, 0, 0, 999, 1000, 5, 53, 0, 0, 1000, 1007, 3, 140, 70, 0, 1001, 1002, 5, 58, 0, 0, 1002, 1003, 5, 54, 0, 0, 1003, 1004, 3, 140, 70, 0, 1004, 1005, 5, 126, 0, 0, 1005, 1006, 3, 140, 70, 0, 1006, 1008, 1, 0, 0, 0, 1007, 1001, 1, 0, 0, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1009, 1, 0, 0, 0, 1009, 1010, 5, 124, 0, 0, 1010, 1070, 1, 0, 0, 0, 1011, 1012, 3, 140, 70, 0, 1012, 1013, 5, 50, 0, 0, 1013, 1014, 5, 54, 0, 0, 1014, 1015, 3, 140, 70, 0, 1015, 1016, 5, 126, 0, 0, 1016, 1023, 3, 140, 70, 0, 1017, 1018, 5, 58, 0, 0, 1018, 1019, 5, 54, 0, 0, 1019, 1020, 3, 140, 70, 0, 1020, 1021, 5, 126, 0, 0, 1021, 1022, 3, 140, 70, 0, 1022, 1024, 1, 0, 0, 0, 1023, 1017, 1, 0, 0, 0, 1023, 1024, 1, 0, 0, 0, 1024, 1025, 1, 0, 0, 0, 1025, 1026, 5, 124, 0, 0, 1026, 1070, 1, 0, 0, 0, 1027, 1028, 3, 140, 70, 0, 1028, 1029, 5, 50, 0, 0, 1029, 1030, 5, 36, 0, 0, 1030, 1032, 3, 140, 70, 0, 1031, 1033, 3, 28, 14, 0, 1032, 1031, 1, 0, 0, 0, 1032, 1033, 1, 0, 0, 0, 1033, 1040, 1, 0, 0, 0, 1034, 1035, 5, 58, 0, 0, 1035, 1036, 5, 54, 0, 0, 1036, 1037, 3, 140, 70, 0, 1037, 1038, 5, 126, 0, 0, 1038, 1039, 3, 140, 70, 0, 1039, 1041, 1, 0, 0, 0, 1040, 1034, 1, 0, 0, 0, 1040, 1041, 1, 0, 0, 0, 1041, 1042, 1, 0, 0, 0, 1042, 1043, 5, 124, 0, 0, 1043, 1070, 1, 0, 0, 0, 1044, 1045, 3, 140, 70, 0, 1045, 1046, 5, 50, 0, 0, 1046, 1047, 5, 43, 0, 0, 1047, 1048, 3, 140, 70, 0, 1048, 1049, 5, 124, 0, 0, 1049, 1070, 1, 0, 0, 0, 1050, 1051, 3, 140, 70, 0, 1051, 1053, 5, 50, 0, 0, 1052, 1054, 5, 1, 0, 0, 1053, 1052, 1, 0, 0, 0, 1053, 1054, 1, 0, 0, 0, 1054, 1055, 1, 0, 0, 0, 1055, 1056, 5, 14, 0, 0, 1056, 1057, 3, 140, 70, 0, 1057, 1058, 5, 126, 0, 0, 1058, 1065, 3, 140, 70, 0, 1059, 1060, 5, 58, 0, 0, 1060, 1061, 5, 54, 0, 0, 1061, 1062, 3, 140, 70, 0, 1062, 1063, 5, 126, 0, 0, 1063, 1064, 3, 140, 70, 0, 1064, 1066, 1, 0, 0, 0, 1065, 1059, 1, 0, 0, 0, 1065, 1066, 1, 0, 0, 0, 1066, 1067, 1, 0, 0, 0, 1067, 1068, 5, 124, 0, 0, 1068, 1070, 1, 0, 0, 0, 1069, 988, 1, 0, 0, 0, 1069, 997, 1, 0, 0, 0, 1069, 1011, 1, 0, 0, 0, 1069, 1027, 1, 0, 0, 0, 1069, 1044, 1, 0, 0, 0, 1069, 1050, 1, 0, 0, 0, 1070, 121, 1, 0, 0, 0, 1071, 1072, 5, 43, 0, 0, 1072, 1073, 3, 140, 70, 0, 1073, 1074, 5, 50, 0, 0, 1074, 1075, 3, 140, 70, 0, 1075, 1076, 5, 126, 0, 0, 1076, 1078, 3, 140, 70, 0, 1077, 1079, 3, 118, 59, 0, 1078, 1077, 1, 0, 0, 0, 1078, 1079, 1, 0, 0, 0, 1079, 1080, 1, 0, 0, 0, 1080, 1081, 5, 124, 0, 0, 1081, 123, 1, 0, 0, 0, 1082, 1129, 3, 128, 64, 0, 1083, 1129, 5, 103, 0, 0, 1084, 1129, 5, 104, 0, 0, 1085, 1086, 5, 105, 0, 0, 1086, 1129, 3, 142, 71, 0, 1087, 1088, 5, 106, 0, 0, 1088, 1089, 5, 133, 0, 0, 1089, 1090, 3, 140, 70, 0, 1090, 1091, 5, 134, 0, 0, 1091, 1129, 1, 0, 0, 0, 1092, 1093, 5, 107, 0, 0, 1093, 1094, 5, 133, 0, 0, 1094, 1096, 3, 140, 70, 0, 1095, 1097, 3, 28, 14, 0, 1096, 1095, 1, 0, 0, 0, 1096, 1097, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1099, 5, 134, 0, 0, 1099, 1129, 1, 0, 0, 0, 1100, 1101, 5, 31, 0, 0, 1101, 1102, 5, 133, 0, 0, 1102, 1103, 3, 140, 70, 0, 1103, 1104, 5, 134, 0, 0, 1104, 1129, 1, 0, 0, 0, 1105, 1106, 5, 108, 0, 0, 1106, 1107, 5, 133, 0, 0, 1107, 1108, 3, 124, 62, 0, 1108, 1109, 5, 134, 0, 0, 1109, 1129, 1, 0, 0, 0, 1110, 1111, 5, 109, 0, 0, 1111, 1112, 5, 133, 0, 0, 1112, 1113, 3, 124, 62, 0, 1113, 1114, 5, 134, 0, 0, 1114, 1129, 1, 0, 0, 0, 1115, 1116, 5, 110, 0, 0, 1116, 1120, 5, 127, 0, 0, 1117, 1119, 3, 126, 63, 0, 1118, 1117, 1, 0, 0, 0, 1119, 1122, 1, 0, 0, 0, 1120, 1118, 1, 0, 0, 0, 1120, 1121, 1, 0, 0, 0, 1121, 1123, 1, 0, 0, 0, 1122, 1120, 1, 0, 0, 0, 1123, 1129, 5, 128, 0, 0, 1124, 1126, 3, 140, 70, 0, 1125, 1127, 3, 28, 14, 0, 1126, 1125, 1, 0, 0, 0, 1126, 1127, 1, 0, 0, 0, 1127, 1129, 1, 0, 0, 0, 1128, 1082, 1, 0, 0, 0, 1128, 1083, 1, 0, 0, 0, 1128, 1084, 1, 0, 0, 0, 1128, 1085, 1, 0, 0, 0, 1128, 1087, 1, 0, 0, 0, 1128, 1092, 1, 0, 0, 0, 1128, 1100, 1, 0, 0, 0, 1128, 1105, 1, 0, 0, 0, 1128, 1110, 1, 0, 0, 0, 1128, 1115, 1, 0, 0, 0, 1128, 1124, 1, 0, 0, 0, 1129, 125, 1, 0, 0, 0, 1130, 1131, 3, 140, 70, 0, 1131, 1132, 5, 123, 0, 0, 1132, 1133, 3, 124, 62, 0, 1133, 1134, 5, 124, 0, 0, 1134, 127, 1, 0, 0, 0, 1135, 1136, 7, 6, 0, 0, 1136, 129, 1, 0, 0, 0, 1137, 1138, 7, 7, 0, 0, 1138, 131, 1, 0, 0, 0, 1139, 1148, 3, 142, 71, 0, 1140, 1148, 5, 137, 0, 0, 1141, 1148, 5, 138, 0, 0, 1142, 1148, 5, 119, 0, 0, 1143, 1148, 5, 120, 0, 0, 1144, 1148, 5, 121, 0, 0, 1145, 1148, 3, 134, 67, 0, 1146, 1148, 3, 138, 69, 0, 1147, 1139, 1, 0, 0, 0, 1147, 1140, 1, 0, 0, 0, 1147, 1141, 1, 0, 0, 0, 1147, 1142, 1, 0, 0, 0, 1147, 1143, 1, 0, 0, 0, 1147, 1144, 1, 0, 0, 0, 1147, 1145, 1, 0, 0, 0, 1147, 1146, 1, 0, 0, 0, 1148, 133, 1, 0, 0, 0, 1149, 1158, 5, 127, 0, 0, 1150, 1155, 3, 136, 68, 0, 1151, 1152, 5, 125, 0, 0, 1152, 1154, 3, 136, 68, 0, 1153, 1151, 1, 0, 0, 0, 1154, 1157, 1, 0, 0, 0, 1155, 1153, 1, 0, 0, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1159, 1, 0, 0, 0, 1157, 1155, 1, 0, 0, 0, 1158, 1150, 1, 0, 0, 0, 1158, 1159, 1, 0, 0, 0, 1159, 1160, 1, 0, 0, 0, 1160, 1161, 5, 128, 0, 0, 1161, 135, 1, 0, 0, 0, 1162, 1163, 3, 142, 71, 0, 1163, 1164, 5, 123, 0, 0, 1164, 1165, 3, 132, 66, 0, 1165, 137, 1, 0, 0, 0, 1166, 1175, 5, 129, 0, 0, 1167, 1172, 3, 132, 66, 0, 1168, 1169, 5, 125, 0, 0, 1169, 1171, 3, 132, 66, 0, 1170, 1168, 1, 0, 0, 0, 1171, 1174, 1, 0, 0, 0, 1172, 1170, 1, 0, 0, 0, 1172, 1173, 1, 0, 0, 0, 1173, 1176, 1, 0, 0, 0, 1174, 1172, 1, 0, 0, 0, 1175, 1167, 1, 0, 0, 0, 1175, 1176, 1, 0, 0, 0, 1176, 1177, 1, 0, 0, 0, 1177, 1178, 5, 130, 0, 0, 1178, 139, 1, 0, 0, 0, 1179, 1180, 7, 8, 0, 0, 1180, 141, 1, 0, 0, 0, 1181, 1182, 5, 140, 0, 0, 1182, 143, 1, 0, 0, 0, 106, 156, 163, 184, 196, 208, 228, 236, 243, 249, 261, 264, 270, 281, 290, 300, 303, 305, 309, 317, 329, 334, 343, 346, 361, 367, 379, 388, 396, 409, 412, 422, 426, 432, 439, 445, 453, 461, 474, 481, 485, 490, 501, 507, 517, 522, 528, 539, 566, 593, 598, 609, 612, 617, 624, 633, 636, 649, 658, 672, 693, 696, 699, 706, 714, 754, 757, 769, 783, 791, 803, 817, 827, 845, 849, 852, 856, 859, 868, 872, 876, 882, 892, 921, 940, 957, 967, 970, 972, 983, 1007, 1023, 1032, 1040, 1053, 1065, 1069, 1078, 1096, 1120, 1126, 1128, 1147, 1155, 1158, 1172, 1175] \ No newline at end of file +[4, 1, 145, 1255, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 163, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 168, 8, 1, 10, 1, 12, 1, 171, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 189, 8, 3, 10, 3, 12, 3, 192, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 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, 3, 5, 215, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 235, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 243, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 248, 8, 10, 10, 10, 12, 10, 251, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 256, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 266, 8, 10, 10, 10, 12, 10, 269, 9, 10, 3, 10, 271, 8, 10, 1, 10, 1, 10, 5, 10, 275, 8, 10, 10, 10, 12, 10, 278, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 286, 8, 11, 10, 11, 12, 11, 289, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 297, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 305, 8, 12, 10, 12, 12, 12, 308, 9, 12, 3, 12, 310, 8, 12, 3, 12, 312, 8, 12, 1, 13, 1, 13, 3, 13, 316, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 322, 8, 14, 10, 14, 12, 14, 325, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 336, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 341, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 350, 8, 17, 1, 18, 3, 18, 353, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 368, 8, 18, 1, 18, 1, 18, 1, 18, 1, 19, 3, 19, 374, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 384, 8, 19, 10, 19, 12, 19, 387, 9, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 395, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 403, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 416, 8, 20, 1, 21, 3, 21, 419, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 429, 8, 21, 1, 21, 1, 21, 3, 21, 433, 8, 21, 1, 21, 1, 21, 5, 21, 437, 8, 21, 10, 21, 12, 21, 440, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 446, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 452, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 460, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 468, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 481, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 488, 8, 24, 1, 24, 1, 24, 3, 24, 492, 8, 24, 1, 25, 5, 25, 495, 8, 25, 10, 25, 12, 25, 498, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 508, 8, 25, 1, 25, 1, 25, 5, 25, 512, 8, 25, 10, 25, 12, 25, 515, 9, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 524, 8, 26, 1, 27, 1, 27, 1, 27, 3, 27, 529, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 535, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 544, 8, 27, 10, 27, 12, 27, 547, 9, 27, 1, 27, 1, 27, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 573, 8, 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, 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, 3, 29, 600, 8, 29, 1, 30, 1, 30, 1, 30, 3, 30, 605, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 616, 8, 30, 1, 30, 3, 30, 619, 8, 30, 1, 30, 1, 30, 1, 30, 3, 30, 624, 8, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 3, 31, 631, 8, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 640, 8, 31, 1, 31, 3, 31, 643, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 656, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 5, 33, 663, 8, 33, 10, 33, 12, 33, 666, 9, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 679, 8, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 5, 37, 698, 8, 37, 10, 37, 12, 37, 701, 9, 37, 3, 37, 703, 8, 37, 1, 37, 3, 37, 706, 8, 37, 1, 38, 1, 38, 1, 38, 5, 38, 711, 8, 38, 10, 38, 12, 38, 714, 9, 38, 1, 39, 1, 39, 1, 39, 5, 39, 719, 8, 39, 10, 39, 12, 39, 722, 9, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 761, 8, 40, 1, 40, 3, 40, 764, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 786, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 800, 8, 40, 1, 41, 1, 41, 1, 41, 1, 41, 5, 41, 806, 8, 41, 10, 41, 12, 41, 809, 9, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 3, 44, 820, 8, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 834, 8, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 844, 8, 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, 48, 1, 48, 1, 48, 1, 48, 3, 48, 862, 8, 48, 1, 48, 1, 48, 3, 48, 866, 8, 48, 1, 48, 3, 48, 869, 8, 48, 1, 48, 1, 48, 3, 48, 873, 8, 48, 1, 48, 3, 48, 876, 8, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 885, 8, 49, 1, 49, 1, 49, 3, 49, 889, 8, 49, 1, 49, 1, 49, 3, 49, 893, 8, 49, 1, 49, 1, 49, 5, 49, 897, 8, 49, 10, 49, 12, 49, 900, 9, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 910, 8, 50, 1, 51, 1, 51, 1, 51, 5, 51, 915, 8, 51, 10, 51, 12, 51, 918, 9, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 937, 8, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 5, 53, 944, 8, 53, 10, 53, 12, 53, 947, 9, 53, 1, 53, 1, 53, 1, 54, 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, 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, 3, 56, 978, 8, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 997, 8, 58, 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, 1014, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1024, 8, 59, 1, 59, 3, 59, 1027, 8, 59, 3, 59, 1029, 8, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 5, 62, 1038, 8, 62, 10, 62, 12, 62, 1041, 9, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1064, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1080, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1089, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1097, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 5, 63, 1108, 8, 63, 10, 63, 12, 63, 1111, 9, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1125, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1137, 8, 63, 1, 63, 1, 63, 3, 63, 1141, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1150, 8, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1168, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 5, 65, 1190, 8, 65, 10, 65, 12, 65, 1193, 9, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1198, 8, 65, 3, 65, 1200, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1219, 8, 69, 1, 70, 1, 70, 1, 70, 1, 70, 5, 70, 1225, 8, 70, 10, 70, 12, 70, 1228, 9, 70, 3, 70, 1230, 8, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 5, 72, 1242, 8, 72, 10, 72, 12, 72, 1245, 9, 72, 3, 72, 1247, 8, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 0, 0, 75, 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, 0, 9, 2, 0, 9, 9, 27, 27, 1, 0, 5, 6, 1, 0, 93, 97, 2, 0, 88, 92, 94, 95, 2, 0, 88, 89, 94, 95, 2, 0, 90, 92, 94, 95, 1, 0, 113, 120, 1, 0, 100, 103, 4, 0, 13, 27, 39, 39, 67, 67, 141, 141, 1355, 0, 162, 1, 0, 0, 0, 2, 164, 1, 0, 0, 0, 4, 174, 1, 0, 0, 0, 6, 178, 1, 0, 0, 0, 8, 202, 1, 0, 0, 0, 10, 214, 1, 0, 0, 0, 12, 216, 1, 0, 0, 0, 14, 223, 1, 0, 0, 0, 16, 234, 1, 0, 0, 0, 18, 236, 1, 0, 0, 0, 20, 249, 1, 0, 0, 0, 22, 281, 1, 0, 0, 0, 24, 311, 1, 0, 0, 0, 26, 313, 1, 0, 0, 0, 28, 317, 1, 0, 0, 0, 30, 335, 1, 0, 0, 0, 32, 337, 1, 0, 0, 0, 34, 349, 1, 0, 0, 0, 36, 352, 1, 0, 0, 0, 38, 373, 1, 0, 0, 0, 40, 415, 1, 0, 0, 0, 42, 418, 1, 0, 0, 0, 44, 443, 1, 0, 0, 0, 46, 480, 1, 0, 0, 0, 48, 491, 1, 0, 0, 0, 50, 496, 1, 0, 0, 0, 52, 523, 1, 0, 0, 0, 54, 525, 1, 0, 0, 0, 56, 550, 1, 0, 0, 0, 58, 599, 1, 0, 0, 0, 60, 601, 1, 0, 0, 0, 62, 627, 1, 0, 0, 0, 64, 655, 1, 0, 0, 0, 66, 657, 1, 0, 0, 0, 68, 669, 1, 0, 0, 0, 70, 682, 1, 0, 0, 0, 72, 685, 1, 0, 0, 0, 74, 705, 1, 0, 0, 0, 76, 707, 1, 0, 0, 0, 78, 715, 1, 0, 0, 0, 80, 799, 1, 0, 0, 0, 82, 801, 1, 0, 0, 0, 84, 812, 1, 0, 0, 0, 86, 814, 1, 0, 0, 0, 88, 819, 1, 0, 0, 0, 90, 821, 1, 0, 0, 0, 92, 843, 1, 0, 0, 0, 94, 845, 1, 0, 0, 0, 96, 854, 1, 0, 0, 0, 98, 879, 1, 0, 0, 0, 100, 909, 1, 0, 0, 0, 102, 911, 1, 0, 0, 0, 104, 936, 1, 0, 0, 0, 106, 938, 1, 0, 0, 0, 108, 950, 1, 0, 0, 0, 110, 957, 1, 0, 0, 0, 112, 971, 1, 0, 0, 0, 114, 981, 1, 0, 0, 0, 116, 996, 1, 0, 0, 0, 118, 1028, 1, 0, 0, 0, 120, 1030, 1, 0, 0, 0, 122, 1032, 1, 0, 0, 0, 124, 1034, 1, 0, 0, 0, 126, 1140, 1, 0, 0, 0, 128, 1142, 1, 0, 0, 0, 130, 1199, 1, 0, 0, 0, 132, 1201, 1, 0, 0, 0, 134, 1206, 1, 0, 0, 0, 136, 1208, 1, 0, 0, 0, 138, 1218, 1, 0, 0, 0, 140, 1220, 1, 0, 0, 0, 142, 1233, 1, 0, 0, 0, 144, 1237, 1, 0, 0, 0, 146, 1250, 1, 0, 0, 0, 148, 1252, 1, 0, 0, 0, 150, 151, 3, 6, 3, 0, 151, 152, 5, 0, 0, 1, 152, 163, 1, 0, 0, 0, 153, 154, 3, 20, 10, 0, 154, 155, 5, 0, 0, 1, 155, 163, 1, 0, 0, 0, 156, 157, 3, 50, 25, 0, 157, 158, 5, 0, 0, 1, 158, 163, 1, 0, 0, 0, 159, 160, 3, 2, 1, 0, 160, 161, 5, 0, 0, 1, 161, 163, 1, 0, 0, 0, 162, 150, 1, 0, 0, 0, 162, 153, 1, 0, 0, 0, 162, 156, 1, 0, 0, 0, 162, 159, 1, 0, 0, 0, 163, 1, 1, 0, 0, 0, 164, 165, 5, 34, 0, 0, 165, 169, 5, 129, 0, 0, 166, 168, 3, 8, 4, 0, 167, 166, 1, 0, 0, 0, 168, 171, 1, 0, 0, 0, 169, 167, 1, 0, 0, 0, 169, 170, 1, 0, 0, 0, 170, 172, 1, 0, 0, 0, 171, 169, 1, 0, 0, 0, 172, 173, 5, 130, 0, 0, 173, 3, 1, 0, 0, 0, 174, 175, 5, 35, 0, 0, 175, 176, 3, 148, 74, 0, 176, 177, 5, 126, 0, 0, 177, 5, 1, 0, 0, 0, 178, 179, 5, 3, 0, 0, 179, 180, 3, 146, 73, 0, 180, 181, 5, 76, 0, 0, 181, 182, 3, 148, 74, 0, 182, 183, 5, 70, 0, 0, 183, 184, 3, 148, 74, 0, 184, 185, 5, 69, 0, 0, 185, 186, 3, 148, 74, 0, 186, 190, 5, 129, 0, 0, 187, 189, 3, 8, 4, 0, 188, 187, 1, 0, 0, 0, 189, 192, 1, 0, 0, 0, 190, 188, 1, 0, 0, 0, 190, 191, 1, 0, 0, 0, 191, 193, 1, 0, 0, 0, 192, 190, 1, 0, 0, 0, 193, 194, 5, 130, 0, 0, 194, 7, 1, 0, 0, 0, 195, 203, 3, 4, 2, 0, 196, 203, 3, 18, 9, 0, 197, 203, 3, 10, 5, 0, 198, 203, 3, 86, 43, 0, 199, 203, 3, 98, 49, 0, 200, 203, 3, 128, 64, 0, 201, 203, 3, 32, 16, 0, 202, 195, 1, 0, 0, 0, 202, 196, 1, 0, 0, 0, 202, 197, 1, 0, 0, 0, 202, 198, 1, 0, 0, 0, 202, 199, 1, 0, 0, 0, 202, 200, 1, 0, 0, 0, 202, 201, 1, 0, 0, 0, 203, 9, 1, 0, 0, 0, 204, 205, 5, 35, 0, 0, 205, 206, 5, 38, 0, 0, 206, 207, 3, 146, 73, 0, 207, 208, 5, 126, 0, 0, 208, 215, 1, 0, 0, 0, 209, 210, 5, 35, 0, 0, 210, 211, 5, 40, 0, 0, 211, 212, 3, 146, 73, 0, 212, 213, 5, 126, 0, 0, 213, 215, 1, 0, 0, 0, 214, 204, 1, 0, 0, 0, 214, 209, 1, 0, 0, 0, 215, 11, 1, 0, 0, 0, 216, 217, 5, 36, 0, 0, 217, 218, 5, 37, 0, 0, 218, 219, 3, 146, 73, 0, 219, 220, 5, 76, 0, 0, 220, 221, 3, 148, 74, 0, 221, 222, 5, 126, 0, 0, 222, 13, 1, 0, 0, 0, 223, 224, 5, 36, 0, 0, 224, 225, 5, 38, 0, 0, 225, 226, 3, 146, 73, 0, 226, 227, 5, 70, 0, 0, 227, 228, 3, 148, 74, 0, 228, 229, 5, 126, 0, 0, 229, 15, 1, 0, 0, 0, 230, 235, 3, 10, 5, 0, 231, 235, 3, 12, 6, 0, 232, 235, 3, 14, 7, 0, 233, 235, 3, 32, 16, 0, 234, 230, 1, 0, 0, 0, 234, 231, 1, 0, 0, 0, 234, 232, 1, 0, 0, 0, 234, 233, 1, 0, 0, 0, 235, 17, 1, 0, 0, 0, 236, 237, 5, 37, 0, 0, 237, 238, 3, 146, 73, 0, 238, 239, 5, 76, 0, 0, 239, 242, 3, 148, 74, 0, 240, 241, 5, 77, 0, 0, 241, 243, 3, 148, 74, 0, 242, 240, 1, 0, 0, 0, 242, 243, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 245, 5, 126, 0, 0, 245, 19, 1, 0, 0, 0, 246, 248, 3, 16, 8, 0, 247, 246, 1, 0, 0, 0, 248, 251, 1, 0, 0, 0, 249, 247, 1, 0, 0, 0, 249, 250, 1, 0, 0, 0, 250, 252, 1, 0, 0, 0, 251, 249, 1, 0, 0, 0, 252, 253, 5, 38, 0, 0, 253, 255, 3, 146, 73, 0, 254, 256, 3, 22, 11, 0, 255, 254, 1, 0, 0, 0, 255, 256, 1, 0, 0, 0, 256, 257, 1, 0, 0, 0, 257, 258, 5, 76, 0, 0, 258, 259, 3, 148, 74, 0, 259, 260, 5, 70, 0, 0, 260, 270, 3, 148, 74, 0, 261, 262, 5, 81, 0, 0, 262, 267, 3, 26, 13, 0, 263, 264, 5, 127, 0, 0, 264, 266, 3, 26, 13, 0, 265, 263, 1, 0, 0, 0, 266, 269, 1, 0, 0, 0, 267, 265, 1, 0, 0, 0, 267, 268, 1, 0, 0, 0, 268, 271, 1, 0, 0, 0, 269, 267, 1, 0, 0, 0, 270, 261, 1, 0, 0, 0, 270, 271, 1, 0, 0, 0, 271, 272, 1, 0, 0, 0, 272, 276, 5, 129, 0, 0, 273, 275, 3, 34, 17, 0, 274, 273, 1, 0, 0, 0, 275, 278, 1, 0, 0, 0, 276, 274, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 279, 1, 0, 0, 0, 278, 276, 1, 0, 0, 0, 279, 280, 5, 130, 0, 0, 280, 21, 1, 0, 0, 0, 281, 282, 5, 135, 0, 0, 282, 287, 3, 24, 12, 0, 283, 284, 5, 127, 0, 0, 284, 286, 3, 24, 12, 0, 285, 283, 1, 0, 0, 0, 286, 289, 1, 0, 0, 0, 287, 285, 1, 0, 0, 0, 287, 288, 1, 0, 0, 0, 288, 290, 1, 0, 0, 0, 289, 287, 1, 0, 0, 0, 290, 291, 5, 136, 0, 0, 291, 23, 1, 0, 0, 0, 292, 293, 5, 41, 0, 0, 293, 296, 3, 146, 73, 0, 294, 295, 5, 125, 0, 0, 295, 297, 5, 31, 0, 0, 296, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 312, 1, 0, 0, 0, 298, 299, 5, 30, 0, 0, 299, 309, 3, 146, 73, 0, 300, 301, 5, 32, 0, 0, 301, 306, 3, 26, 13, 0, 302, 303, 5, 137, 0, 0, 303, 305, 3, 26, 13, 0, 304, 302, 1, 0, 0, 0, 305, 308, 1, 0, 0, 0, 306, 304, 1, 0, 0, 0, 306, 307, 1, 0, 0, 0, 307, 310, 1, 0, 0, 0, 308, 306, 1, 0, 0, 0, 309, 300, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 312, 1, 0, 0, 0, 311, 292, 1, 0, 0, 0, 311, 298, 1, 0, 0, 0, 312, 25, 1, 0, 0, 0, 313, 315, 3, 146, 73, 0, 314, 316, 3, 28, 14, 0, 315, 314, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 27, 1, 0, 0, 0, 317, 318, 5, 135, 0, 0, 318, 323, 3, 30, 15, 0, 319, 320, 5, 127, 0, 0, 320, 322, 3, 30, 15, 0, 321, 319, 1, 0, 0, 0, 322, 325, 1, 0, 0, 0, 323, 321, 1, 0, 0, 0, 323, 324, 1, 0, 0, 0, 324, 326, 1, 0, 0, 0, 325, 323, 1, 0, 0, 0, 326, 327, 5, 136, 0, 0, 327, 29, 1, 0, 0, 0, 328, 329, 5, 37, 0, 0, 329, 336, 3, 146, 73, 0, 330, 331, 5, 38, 0, 0, 331, 336, 3, 26, 13, 0, 332, 333, 5, 30, 0, 0, 333, 336, 3, 146, 73, 0, 334, 336, 3, 130, 65, 0, 335, 328, 1, 0, 0, 0, 335, 330, 1, 0, 0, 0, 335, 332, 1, 0, 0, 0, 335, 334, 1, 0, 0, 0, 336, 31, 1, 0, 0, 0, 337, 338, 5, 29, 0, 0, 338, 340, 3, 146, 73, 0, 339, 341, 3, 22, 11, 0, 340, 339, 1, 0, 0, 0, 340, 341, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 343, 5, 138, 0, 0, 343, 344, 3, 130, 65, 0, 344, 345, 5, 126, 0, 0, 345, 33, 1, 0, 0, 0, 346, 350, 3, 38, 19, 0, 347, 350, 3, 42, 21, 0, 348, 350, 3, 36, 18, 0, 349, 346, 1, 0, 0, 0, 349, 347, 1, 0, 0, 0, 349, 348, 1, 0, 0, 0, 350, 35, 1, 0, 0, 0, 351, 353, 5, 51, 0, 0, 352, 351, 1, 0, 0, 0, 352, 353, 1, 0, 0, 0, 353, 354, 1, 0, 0, 0, 354, 355, 5, 43, 0, 0, 355, 356, 3, 146, 73, 0, 356, 357, 5, 76, 0, 0, 357, 358, 3, 148, 74, 0, 358, 359, 5, 125, 0, 0, 359, 360, 3, 130, 65, 0, 360, 361, 5, 124, 0, 0, 361, 362, 3, 130, 65, 0, 362, 363, 5, 129, 0, 0, 363, 364, 5, 93, 0, 0, 364, 365, 5, 76, 0, 0, 365, 367, 3, 148, 74, 0, 366, 368, 3, 64, 32, 0, 367, 366, 1, 0, 0, 0, 367, 368, 1, 0, 0, 0, 368, 369, 1, 0, 0, 0, 369, 370, 5, 126, 0, 0, 370, 371, 5, 130, 0, 0, 371, 37, 1, 0, 0, 0, 372, 374, 3, 44, 22, 0, 373, 372, 1, 0, 0, 0, 373, 374, 1, 0, 0, 0, 374, 375, 1, 0, 0, 0, 375, 376, 5, 41, 0, 0, 376, 377, 3, 146, 73, 0, 377, 378, 5, 76, 0, 0, 378, 379, 3, 148, 74, 0, 379, 380, 5, 125, 0, 0, 380, 381, 3, 130, 65, 0, 381, 385, 5, 129, 0, 0, 382, 384, 3, 40, 20, 0, 383, 382, 1, 0, 0, 0, 384, 387, 1, 0, 0, 0, 385, 383, 1, 0, 0, 0, 385, 386, 1, 0, 0, 0, 386, 388, 1, 0, 0, 0, 387, 385, 1, 0, 0, 0, 388, 389, 5, 130, 0, 0, 389, 39, 1, 0, 0, 0, 390, 391, 5, 83, 0, 0, 391, 392, 5, 76, 0, 0, 392, 394, 3, 148, 74, 0, 393, 395, 3, 64, 32, 0, 394, 393, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 396, 1, 0, 0, 0, 396, 397, 5, 126, 0, 0, 397, 416, 1, 0, 0, 0, 398, 399, 5, 84, 0, 0, 399, 400, 5, 76, 0, 0, 400, 402, 3, 148, 74, 0, 401, 403, 3, 64, 32, 0, 402, 401, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 404, 1, 0, 0, 0, 404, 405, 5, 126, 0, 0, 405, 416, 1, 0, 0, 0, 406, 407, 5, 85, 0, 0, 407, 408, 5, 86, 0, 0, 408, 409, 5, 76, 0, 0, 409, 410, 3, 148, 74, 0, 410, 411, 5, 87, 0, 0, 411, 412, 5, 76, 0, 0, 412, 413, 3, 148, 74, 0, 413, 414, 5, 126, 0, 0, 414, 416, 1, 0, 0, 0, 415, 390, 1, 0, 0, 0, 415, 398, 1, 0, 0, 0, 415, 406, 1, 0, 0, 0, 416, 41, 1, 0, 0, 0, 417, 419, 3, 44, 22, 0, 418, 417, 1, 0, 0, 0, 418, 419, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 421, 5, 42, 0, 0, 421, 422, 3, 146, 73, 0, 422, 423, 5, 76, 0, 0, 423, 424, 3, 148, 74, 0, 424, 425, 5, 125, 0, 0, 425, 426, 3, 136, 68, 0, 426, 428, 3, 48, 24, 0, 427, 429, 5, 104, 0, 0, 428, 427, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 432, 1, 0, 0, 0, 430, 431, 5, 74, 0, 0, 431, 433, 3, 148, 74, 0, 432, 430, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 434, 1, 0, 0, 0, 434, 438, 5, 129, 0, 0, 435, 437, 3, 46, 23, 0, 436, 435, 1, 0, 0, 0, 437, 440, 1, 0, 0, 0, 438, 436, 1, 0, 0, 0, 438, 439, 1, 0, 0, 0, 439, 441, 1, 0, 0, 0, 440, 438, 1, 0, 0, 0, 441, 442, 5, 130, 0, 0, 442, 43, 1, 0, 0, 0, 443, 445, 5, 26, 0, 0, 444, 446, 7, 0, 0, 0, 445, 444, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 45, 1, 0, 0, 0, 447, 448, 5, 90, 0, 0, 448, 449, 5, 76, 0, 0, 449, 451, 3, 148, 74, 0, 450, 452, 3, 64, 32, 0, 451, 450, 1, 0, 0, 0, 451, 452, 1, 0, 0, 0, 452, 453, 1, 0, 0, 0, 453, 454, 5, 126, 0, 0, 454, 481, 1, 0, 0, 0, 455, 456, 5, 91, 0, 0, 456, 457, 5, 76, 0, 0, 457, 459, 3, 148, 74, 0, 458, 460, 3, 64, 32, 0, 459, 458, 1, 0, 0, 0, 459, 460, 1, 0, 0, 0, 460, 461, 1, 0, 0, 0, 461, 462, 5, 126, 0, 0, 462, 481, 1, 0, 0, 0, 463, 464, 5, 92, 0, 0, 464, 465, 5, 76, 0, 0, 465, 467, 3, 148, 74, 0, 466, 468, 3, 64, 32, 0, 467, 466, 1, 0, 0, 0, 467, 468, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 470, 5, 126, 0, 0, 470, 481, 1, 0, 0, 0, 471, 472, 5, 85, 0, 0, 472, 473, 5, 86, 0, 0, 473, 474, 5, 76, 0, 0, 474, 475, 3, 148, 74, 0, 475, 476, 5, 87, 0, 0, 476, 477, 5, 76, 0, 0, 477, 478, 3, 148, 74, 0, 478, 479, 5, 126, 0, 0, 479, 481, 1, 0, 0, 0, 480, 447, 1, 0, 0, 0, 480, 455, 1, 0, 0, 0, 480, 463, 1, 0, 0, 0, 480, 471, 1, 0, 0, 0, 481, 47, 1, 0, 0, 0, 482, 483, 5, 37, 0, 0, 483, 492, 3, 146, 73, 0, 484, 485, 5, 38, 0, 0, 485, 487, 3, 146, 73, 0, 486, 488, 3, 28, 14, 0, 487, 486, 1, 0, 0, 0, 487, 488, 1, 0, 0, 0, 488, 492, 1, 0, 0, 0, 489, 490, 5, 30, 0, 0, 490, 492, 3, 146, 73, 0, 491, 482, 1, 0, 0, 0, 491, 484, 1, 0, 0, 0, 491, 489, 1, 0, 0, 0, 492, 49, 1, 0, 0, 0, 493, 495, 3, 16, 8, 0, 494, 493, 1, 0, 0, 0, 495, 498, 1, 0, 0, 0, 496, 494, 1, 0, 0, 0, 496, 497, 1, 0, 0, 0, 497, 499, 1, 0, 0, 0, 498, 496, 1, 0, 0, 0, 499, 500, 5, 40, 0, 0, 500, 501, 3, 146, 73, 0, 501, 502, 5, 76, 0, 0, 502, 503, 3, 148, 74, 0, 503, 504, 5, 70, 0, 0, 504, 507, 3, 148, 74, 0, 505, 506, 5, 71, 0, 0, 506, 508, 5, 139, 0, 0, 507, 505, 1, 0, 0, 0, 507, 508, 1, 0, 0, 0, 508, 509, 1, 0, 0, 0, 509, 513, 5, 129, 0, 0, 510, 512, 3, 52, 26, 0, 511, 510, 1, 0, 0, 0, 512, 515, 1, 0, 0, 0, 513, 511, 1, 0, 0, 0, 513, 514, 1, 0, 0, 0, 514, 516, 1, 0, 0, 0, 515, 513, 1, 0, 0, 0, 516, 517, 5, 130, 0, 0, 517, 51, 1, 0, 0, 0, 518, 524, 3, 60, 30, 0, 519, 524, 3, 62, 31, 0, 520, 524, 3, 68, 34, 0, 521, 524, 3, 54, 27, 0, 522, 524, 3, 56, 28, 0, 523, 518, 1, 0, 0, 0, 523, 519, 1, 0, 0, 0, 523, 520, 1, 0, 0, 0, 523, 521, 1, 0, 0, 0, 523, 522, 1, 0, 0, 0, 524, 53, 1, 0, 0, 0, 525, 526, 5, 16, 0, 0, 526, 528, 3, 146, 73, 0, 527, 529, 3, 22, 11, 0, 528, 527, 1, 0, 0, 0, 528, 529, 1, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 531, 5, 76, 0, 0, 531, 532, 3, 148, 74, 0, 532, 534, 5, 19, 0, 0, 533, 535, 5, 3, 0, 0, 534, 533, 1, 0, 0, 0, 534, 535, 1, 0, 0, 0, 535, 536, 1, 0, 0, 0, 536, 537, 3, 26, 13, 0, 537, 538, 5, 20, 0, 0, 538, 539, 3, 148, 74, 0, 539, 540, 5, 43, 0, 0, 540, 541, 3, 148, 74, 0, 541, 545, 5, 129, 0, 0, 542, 544, 3, 58, 29, 0, 543, 542, 1, 0, 0, 0, 544, 547, 1, 0, 0, 0, 545, 543, 1, 0, 0, 0, 545, 546, 1, 0, 0, 0, 546, 548, 1, 0, 0, 0, 547, 545, 1, 0, 0, 0, 548, 549, 5, 130, 0, 0, 549, 55, 1, 0, 0, 0, 550, 551, 5, 16, 0, 0, 551, 552, 3, 146, 73, 0, 552, 553, 5, 76, 0, 0, 553, 554, 3, 148, 74, 0, 554, 555, 5, 18, 0, 0, 555, 556, 3, 146, 73, 0, 556, 557, 3, 28, 14, 0, 557, 558, 5, 126, 0, 0, 558, 57, 1, 0, 0, 0, 559, 560, 5, 10, 0, 0, 560, 600, 5, 126, 0, 0, 561, 562, 5, 11, 0, 0, 562, 563, 5, 12, 0, 0, 563, 564, 3, 146, 73, 0, 564, 565, 5, 126, 0, 0, 565, 600, 1, 0, 0, 0, 566, 567, 5, 21, 0, 0, 567, 568, 3, 148, 74, 0, 568, 569, 5, 126, 0, 0, 569, 600, 1, 0, 0, 0, 570, 572, 5, 22, 0, 0, 571, 573, 5, 30, 0, 0, 572, 571, 1, 0, 0, 0, 572, 573, 1, 0, 0, 0, 573, 574, 1, 0, 0, 0, 574, 575, 3, 146, 73, 0, 575, 576, 5, 49, 0, 0, 576, 577, 3, 26, 13, 0, 577, 578, 5, 126, 0, 0, 578, 600, 1, 0, 0, 0, 579, 580, 5, 23, 0, 0, 580, 581, 3, 146, 73, 0, 581, 582, 5, 139, 0, 0, 582, 583, 5, 126, 0, 0, 583, 600, 1, 0, 0, 0, 584, 585, 5, 24, 0, 0, 585, 586, 3, 26, 13, 0, 586, 587, 5, 128, 0, 0, 587, 588, 3, 146, 73, 0, 588, 589, 3, 146, 73, 0, 589, 590, 3, 148, 74, 0, 590, 591, 5, 126, 0, 0, 591, 600, 1, 0, 0, 0, 592, 593, 5, 85, 0, 0, 593, 600, 5, 126, 0, 0, 594, 595, 5, 25, 0, 0, 595, 596, 5, 139, 0, 0, 596, 597, 3, 148, 74, 0, 597, 598, 5, 126, 0, 0, 598, 600, 1, 0, 0, 0, 599, 559, 1, 0, 0, 0, 599, 561, 1, 0, 0, 0, 599, 566, 1, 0, 0, 0, 599, 570, 1, 0, 0, 0, 599, 579, 1, 0, 0, 0, 599, 584, 1, 0, 0, 0, 599, 592, 1, 0, 0, 0, 599, 594, 1, 0, 0, 0, 600, 59, 1, 0, 0, 0, 601, 602, 5, 43, 0, 0, 602, 604, 3, 146, 73, 0, 603, 605, 3, 22, 11, 0, 604, 603, 1, 0, 0, 0, 604, 605, 1, 0, 0, 0, 605, 606, 1, 0, 0, 0, 606, 607, 5, 76, 0, 0, 607, 608, 3, 148, 74, 0, 608, 609, 5, 125, 0, 0, 609, 610, 3, 130, 65, 0, 610, 611, 5, 124, 0, 0, 611, 612, 3, 130, 65, 0, 612, 613, 5, 78, 0, 0, 613, 615, 3, 72, 36, 0, 614, 616, 3, 64, 32, 0, 615, 614, 1, 0, 0, 0, 615, 616, 1, 0, 0, 0, 616, 618, 1, 0, 0, 0, 617, 619, 3, 70, 35, 0, 618, 617, 1, 0, 0, 0, 618, 619, 1, 0, 0, 0, 619, 620, 1, 0, 0, 0, 620, 621, 5, 80, 0, 0, 621, 623, 3, 74, 37, 0, 622, 624, 3, 78, 39, 0, 623, 622, 1, 0, 0, 0, 623, 624, 1, 0, 0, 0, 624, 625, 1, 0, 0, 0, 625, 626, 5, 126, 0, 0, 626, 61, 1, 0, 0, 0, 627, 628, 5, 44, 0, 0, 628, 630, 3, 146, 73, 0, 629, 631, 3, 22, 11, 0, 630, 629, 1, 0, 0, 0, 630, 631, 1, 0, 0, 0, 631, 632, 1, 0, 0, 0, 632, 633, 5, 76, 0, 0, 633, 634, 3, 148, 74, 0, 634, 635, 5, 125, 0, 0, 635, 636, 3, 130, 65, 0, 636, 637, 5, 124, 0, 0, 637, 639, 3, 130, 65, 0, 638, 640, 3, 64, 32, 0, 639, 638, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 642, 1, 0, 0, 0, 641, 643, 3, 78, 39, 0, 642, 641, 1, 0, 0, 0, 642, 643, 1, 0, 0, 0, 643, 644, 1, 0, 0, 0, 644, 645, 5, 126, 0, 0, 645, 63, 1, 0, 0, 0, 646, 647, 5, 4, 0, 0, 647, 656, 5, 7, 0, 0, 648, 649, 5, 4, 0, 0, 649, 650, 7, 1, 0, 0, 650, 651, 5, 8, 0, 0, 651, 652, 5, 131, 0, 0, 652, 653, 3, 76, 38, 0, 653, 654, 5, 132, 0, 0, 654, 656, 1, 0, 0, 0, 655, 646, 1, 0, 0, 0, 655, 648, 1, 0, 0, 0, 656, 65, 1, 0, 0, 0, 657, 658, 5, 59, 0, 0, 658, 659, 5, 131, 0, 0, 659, 664, 3, 114, 57, 0, 660, 661, 5, 127, 0, 0, 661, 663, 3, 114, 57, 0, 662, 660, 1, 0, 0, 0, 663, 666, 1, 0, 0, 0, 664, 662, 1, 0, 0, 0, 664, 665, 1, 0, 0, 0, 665, 667, 1, 0, 0, 0, 666, 664, 1, 0, 0, 0, 667, 668, 5, 132, 0, 0, 668, 67, 1, 0, 0, 0, 669, 670, 5, 45, 0, 0, 670, 671, 3, 146, 73, 0, 671, 672, 5, 76, 0, 0, 672, 673, 3, 148, 74, 0, 673, 674, 5, 46, 0, 0, 674, 675, 3, 146, 73, 0, 675, 676, 5, 125, 0, 0, 676, 678, 3, 130, 65, 0, 677, 679, 3, 78, 39, 0, 678, 677, 1, 0, 0, 0, 678, 679, 1, 0, 0, 0, 679, 680, 1, 0, 0, 0, 680, 681, 5, 126, 0, 0, 681, 69, 1, 0, 0, 0, 682, 683, 5, 79, 0, 0, 683, 684, 3, 130, 65, 0, 684, 71, 1, 0, 0, 0, 685, 686, 7, 2, 0, 0, 686, 73, 1, 0, 0, 0, 687, 706, 5, 82, 0, 0, 688, 689, 5, 37, 0, 0, 689, 706, 3, 146, 73, 0, 690, 691, 5, 30, 0, 0, 691, 706, 3, 146, 73, 0, 692, 693, 5, 39, 0, 0, 693, 702, 5, 131, 0, 0, 694, 699, 3, 26, 13, 0, 695, 696, 5, 127, 0, 0, 696, 698, 3, 26, 13, 0, 697, 695, 1, 0, 0, 0, 698, 701, 1, 0, 0, 0, 699, 697, 1, 0, 0, 0, 699, 700, 1, 0, 0, 0, 700, 703, 1, 0, 0, 0, 701, 699, 1, 0, 0, 0, 702, 694, 1, 0, 0, 0, 702, 703, 1, 0, 0, 0, 703, 704, 1, 0, 0, 0, 704, 706, 5, 132, 0, 0, 705, 687, 1, 0, 0, 0, 705, 688, 1, 0, 0, 0, 705, 690, 1, 0, 0, 0, 705, 692, 1, 0, 0, 0, 706, 75, 1, 0, 0, 0, 707, 712, 3, 146, 73, 0, 708, 709, 5, 127, 0, 0, 709, 711, 3, 146, 73, 0, 710, 708, 1, 0, 0, 0, 711, 714, 1, 0, 0, 0, 712, 710, 1, 0, 0, 0, 712, 713, 1, 0, 0, 0, 713, 77, 1, 0, 0, 0, 714, 712, 1, 0, 0, 0, 715, 716, 5, 81, 0, 0, 716, 720, 5, 129, 0, 0, 717, 719, 3, 80, 40, 0, 718, 717, 1, 0, 0, 0, 719, 722, 1, 0, 0, 0, 720, 718, 1, 0, 0, 0, 720, 721, 1, 0, 0, 0, 721, 723, 1, 0, 0, 0, 722, 720, 1, 0, 0, 0, 723, 724, 5, 130, 0, 0, 724, 79, 1, 0, 0, 0, 725, 726, 5, 17, 0, 0, 726, 727, 3, 146, 73, 0, 727, 728, 5, 76, 0, 0, 728, 729, 3, 148, 74, 0, 729, 730, 5, 131, 0, 0, 730, 731, 3, 76, 38, 0, 731, 732, 5, 132, 0, 0, 732, 733, 5, 126, 0, 0, 733, 800, 1, 0, 0, 0, 734, 735, 5, 55, 0, 0, 735, 736, 3, 146, 73, 0, 736, 737, 5, 76, 0, 0, 737, 738, 3, 148, 74, 0, 738, 739, 5, 125, 0, 0, 739, 740, 3, 130, 65, 0, 740, 741, 3, 82, 41, 0, 741, 742, 5, 126, 0, 0, 742, 800, 1, 0, 0, 0, 743, 744, 5, 56, 0, 0, 744, 745, 3, 146, 73, 0, 745, 746, 5, 76, 0, 0, 746, 747, 3, 148, 74, 0, 747, 748, 5, 125, 0, 0, 748, 749, 3, 136, 68, 0, 749, 750, 3, 48, 24, 0, 750, 751, 3, 82, 41, 0, 751, 752, 5, 126, 0, 0, 752, 800, 1, 0, 0, 0, 753, 754, 5, 38, 0, 0, 754, 755, 3, 146, 73, 0, 755, 756, 5, 76, 0, 0, 756, 757, 3, 148, 74, 0, 757, 758, 5, 125, 0, 0, 758, 760, 3, 146, 73, 0, 759, 761, 3, 28, 14, 0, 760, 759, 1, 0, 0, 0, 760, 761, 1, 0, 0, 0, 761, 763, 1, 0, 0, 0, 762, 764, 3, 66, 33, 0, 763, 762, 1, 0, 0, 0, 763, 764, 1, 0, 0, 0, 764, 765, 1, 0, 0, 0, 765, 766, 5, 126, 0, 0, 766, 800, 1, 0, 0, 0, 767, 768, 5, 1, 0, 0, 768, 769, 3, 146, 73, 0, 769, 770, 5, 76, 0, 0, 770, 771, 3, 148, 74, 0, 771, 772, 5, 125, 0, 0, 772, 773, 3, 146, 73, 0, 773, 774, 5, 47, 0, 0, 774, 775, 3, 130, 65, 0, 775, 776, 5, 126, 0, 0, 776, 800, 1, 0, 0, 0, 777, 778, 5, 45, 0, 0, 778, 779, 3, 146, 73, 0, 779, 780, 5, 76, 0, 0, 780, 781, 3, 148, 74, 0, 781, 782, 5, 125, 0, 0, 782, 785, 3, 146, 73, 0, 783, 784, 5, 47, 0, 0, 784, 786, 3, 130, 65, 0, 785, 783, 1, 0, 0, 0, 785, 786, 1, 0, 0, 0, 786, 787, 1, 0, 0, 0, 787, 788, 5, 126, 0, 0, 788, 800, 1, 0, 0, 0, 789, 790, 5, 16, 0, 0, 790, 791, 3, 146, 73, 0, 791, 792, 5, 76, 0, 0, 792, 793, 3, 148, 74, 0, 793, 794, 5, 125, 0, 0, 794, 795, 3, 146, 73, 0, 795, 796, 5, 128, 0, 0, 796, 797, 3, 146, 73, 0, 797, 798, 5, 126, 0, 0, 798, 800, 1, 0, 0, 0, 799, 725, 1, 0, 0, 0, 799, 734, 1, 0, 0, 0, 799, 743, 1, 0, 0, 0, 799, 753, 1, 0, 0, 0, 799, 767, 1, 0, 0, 0, 799, 777, 1, 0, 0, 0, 799, 789, 1, 0, 0, 0, 800, 81, 1, 0, 0, 0, 801, 802, 5, 131, 0, 0, 802, 807, 3, 84, 42, 0, 803, 804, 5, 127, 0, 0, 804, 806, 3, 84, 42, 0, 805, 803, 1, 0, 0, 0, 806, 809, 1, 0, 0, 0, 807, 805, 1, 0, 0, 0, 807, 808, 1, 0, 0, 0, 808, 810, 1, 0, 0, 0, 809, 807, 1, 0, 0, 0, 810, 811, 5, 132, 0, 0, 811, 83, 1, 0, 0, 0, 812, 813, 7, 3, 0, 0, 813, 85, 1, 0, 0, 0, 814, 815, 5, 54, 0, 0, 815, 816, 3, 88, 44, 0, 816, 87, 1, 0, 0, 0, 817, 820, 3, 90, 45, 0, 818, 820, 3, 94, 47, 0, 819, 817, 1, 0, 0, 0, 819, 818, 1, 0, 0, 0, 820, 89, 1, 0, 0, 0, 821, 822, 5, 55, 0, 0, 822, 823, 3, 146, 73, 0, 823, 824, 5, 76, 0, 0, 824, 825, 3, 148, 74, 0, 825, 826, 5, 64, 0, 0, 826, 827, 3, 146, 73, 0, 827, 828, 5, 125, 0, 0, 828, 829, 3, 130, 65, 0, 829, 830, 5, 65, 0, 0, 830, 833, 3, 92, 46, 0, 831, 832, 5, 66, 0, 0, 832, 834, 3, 138, 69, 0, 833, 831, 1, 0, 0, 0, 833, 834, 1, 0, 0, 0, 834, 835, 1, 0, 0, 0, 835, 836, 5, 126, 0, 0, 836, 91, 1, 0, 0, 0, 837, 844, 5, 98, 0, 0, 838, 839, 5, 99, 0, 0, 839, 840, 5, 133, 0, 0, 840, 841, 3, 130, 65, 0, 841, 842, 5, 134, 0, 0, 842, 844, 1, 0, 0, 0, 843, 837, 1, 0, 0, 0, 843, 838, 1, 0, 0, 0, 844, 93, 1, 0, 0, 0, 845, 846, 5, 56, 0, 0, 846, 847, 3, 146, 73, 0, 847, 848, 5, 76, 0, 0, 848, 849, 3, 148, 74, 0, 849, 850, 5, 129, 0, 0, 850, 851, 3, 96, 48, 0, 851, 852, 3, 96, 48, 0, 852, 853, 5, 130, 0, 0, 853, 95, 1, 0, 0, 0, 854, 855, 3, 48, 24, 0, 855, 856, 5, 57, 0, 0, 856, 857, 3, 146, 73, 0, 857, 858, 5, 76, 0, 0, 858, 859, 3, 148, 74, 0, 859, 861, 3, 136, 68, 0, 860, 862, 5, 104, 0, 0, 861, 860, 1, 0, 0, 0, 861, 862, 1, 0, 0, 0, 862, 865, 1, 0, 0, 0, 863, 864, 5, 72, 0, 0, 864, 866, 3, 148, 74, 0, 865, 863, 1, 0, 0, 0, 865, 866, 1, 0, 0, 0, 866, 868, 1, 0, 0, 0, 867, 869, 5, 73, 0, 0, 868, 867, 1, 0, 0, 0, 868, 869, 1, 0, 0, 0, 869, 872, 1, 0, 0, 0, 870, 871, 5, 74, 0, 0, 871, 873, 3, 148, 74, 0, 872, 870, 1, 0, 0, 0, 872, 873, 1, 0, 0, 0, 873, 875, 1, 0, 0, 0, 874, 876, 5, 75, 0, 0, 875, 874, 1, 0, 0, 0, 875, 876, 1, 0, 0, 0, 876, 877, 1, 0, 0, 0, 877, 878, 5, 126, 0, 0, 878, 97, 1, 0, 0, 0, 879, 880, 5, 48, 0, 0, 880, 881, 3, 146, 73, 0, 881, 882, 5, 49, 0, 0, 882, 884, 3, 146, 73, 0, 883, 885, 3, 28, 14, 0, 884, 883, 1, 0, 0, 0, 884, 885, 1, 0, 0, 0, 885, 888, 1, 0, 0, 0, 886, 887, 5, 76, 0, 0, 887, 889, 3, 148, 74, 0, 888, 886, 1, 0, 0, 0, 888, 889, 1, 0, 0, 0, 889, 892, 1, 0, 0, 0, 890, 891, 5, 71, 0, 0, 891, 893, 5, 139, 0, 0, 892, 890, 1, 0, 0, 0, 892, 893, 1, 0, 0, 0, 893, 894, 1, 0, 0, 0, 894, 898, 5, 129, 0, 0, 895, 897, 3, 100, 50, 0, 896, 895, 1, 0, 0, 0, 897, 900, 1, 0, 0, 0, 898, 896, 1, 0, 0, 0, 898, 899, 1, 0, 0, 0, 899, 901, 1, 0, 0, 0, 900, 898, 1, 0, 0, 0, 901, 902, 5, 130, 0, 0, 902, 99, 1, 0, 0, 0, 903, 904, 5, 53, 0, 0, 904, 910, 3, 88, 44, 0, 905, 910, 3, 112, 56, 0, 906, 910, 3, 108, 54, 0, 907, 910, 3, 102, 51, 0, 908, 910, 3, 110, 55, 0, 909, 903, 1, 0, 0, 0, 909, 905, 1, 0, 0, 0, 909, 906, 1, 0, 0, 0, 909, 907, 1, 0, 0, 0, 909, 908, 1, 0, 0, 0, 910, 101, 1, 0, 0, 0, 911, 912, 5, 2, 0, 0, 912, 916, 5, 129, 0, 0, 913, 915, 3, 104, 52, 0, 914, 913, 1, 0, 0, 0, 915, 918, 1, 0, 0, 0, 916, 914, 1, 0, 0, 0, 916, 917, 1, 0, 0, 0, 917, 919, 1, 0, 0, 0, 918, 916, 1, 0, 0, 0, 919, 920, 5, 130, 0, 0, 920, 921, 5, 126, 0, 0, 921, 103, 1, 0, 0, 0, 922, 923, 3, 146, 73, 0, 923, 924, 5, 52, 0, 0, 924, 925, 5, 55, 0, 0, 925, 926, 3, 146, 73, 0, 926, 927, 5, 126, 0, 0, 927, 937, 1, 0, 0, 0, 928, 929, 3, 146, 73, 0, 929, 930, 5, 52, 0, 0, 930, 931, 5, 56, 0, 0, 931, 932, 3, 146, 73, 0, 932, 933, 5, 128, 0, 0, 933, 934, 3, 146, 73, 0, 934, 935, 5, 126, 0, 0, 935, 937, 1, 0, 0, 0, 936, 922, 1, 0, 0, 0, 936, 928, 1, 0, 0, 0, 937, 105, 1, 0, 0, 0, 938, 939, 3, 26, 13, 0, 939, 940, 5, 12, 0, 0, 940, 945, 5, 47, 0, 0, 941, 942, 5, 128, 0, 0, 942, 944, 3, 146, 73, 0, 943, 941, 1, 0, 0, 0, 944, 947, 1, 0, 0, 0, 945, 943, 1, 0, 0, 0, 945, 946, 1, 0, 0, 0, 946, 948, 1, 0, 0, 0, 947, 945, 1, 0, 0, 0, 948, 949, 5, 126, 0, 0, 949, 107, 1, 0, 0, 0, 950, 951, 5, 50, 0, 0, 951, 952, 3, 146, 73, 0, 952, 953, 5, 52, 0, 0, 953, 954, 5, 55, 0, 0, 954, 955, 3, 146, 73, 0, 955, 956, 5, 126, 0, 0, 956, 109, 1, 0, 0, 0, 957, 958, 5, 61, 0, 0, 958, 959, 3, 146, 73, 0, 959, 960, 5, 62, 0, 0, 960, 961, 5, 63, 0, 0, 961, 962, 5, 59, 0, 0, 962, 963, 5, 45, 0, 0, 963, 964, 3, 146, 73, 0, 964, 965, 5, 60, 0, 0, 965, 966, 5, 56, 0, 0, 966, 967, 3, 146, 73, 0, 967, 968, 5, 128, 0, 0, 968, 969, 3, 146, 73, 0, 969, 970, 5, 126, 0, 0, 970, 111, 1, 0, 0, 0, 971, 972, 5, 50, 0, 0, 972, 973, 3, 114, 57, 0, 973, 974, 5, 52, 0, 0, 974, 977, 3, 118, 59, 0, 975, 976, 5, 28, 0, 0, 976, 978, 3, 148, 74, 0, 977, 975, 1, 0, 0, 0, 977, 978, 1, 0, 0, 0, 978, 979, 1, 0, 0, 0, 979, 980, 5, 126, 0, 0, 980, 113, 1, 0, 0, 0, 981, 982, 3, 146, 73, 0, 982, 983, 5, 128, 0, 0, 983, 984, 3, 116, 58, 0, 984, 115, 1, 0, 0, 0, 985, 997, 3, 146, 73, 0, 986, 997, 5, 93, 0, 0, 987, 997, 5, 83, 0, 0, 988, 997, 5, 84, 0, 0, 989, 997, 5, 90, 0, 0, 990, 997, 5, 91, 0, 0, 991, 997, 5, 92, 0, 0, 992, 997, 5, 94, 0, 0, 993, 997, 5, 95, 0, 0, 994, 997, 5, 96, 0, 0, 995, 997, 5, 97, 0, 0, 996, 985, 1, 0, 0, 0, 996, 986, 1, 0, 0, 0, 996, 987, 1, 0, 0, 0, 996, 988, 1, 0, 0, 0, 996, 989, 1, 0, 0, 0, 996, 990, 1, 0, 0, 0, 996, 991, 1, 0, 0, 0, 996, 992, 1, 0, 0, 0, 996, 993, 1, 0, 0, 0, 996, 994, 1, 0, 0, 0, 996, 995, 1, 0, 0, 0, 997, 117, 1, 0, 0, 0, 998, 999, 5, 55, 0, 0, 999, 1000, 3, 146, 73, 0, 1000, 1001, 5, 128, 0, 0, 1001, 1002, 3, 120, 60, 0, 1002, 1029, 1, 0, 0, 0, 1003, 1004, 5, 56, 0, 0, 1004, 1005, 3, 146, 73, 0, 1005, 1006, 5, 128, 0, 0, 1006, 1007, 3, 146, 73, 0, 1007, 1008, 5, 128, 0, 0, 1008, 1009, 3, 122, 61, 0, 1009, 1029, 1, 0, 0, 0, 1010, 1011, 5, 38, 0, 0, 1011, 1013, 3, 146, 73, 0, 1012, 1014, 3, 28, 14, 0, 1013, 1012, 1, 0, 0, 0, 1013, 1014, 1, 0, 0, 0, 1014, 1015, 1, 0, 0, 0, 1015, 1016, 5, 128, 0, 0, 1016, 1017, 3, 114, 57, 0, 1017, 1029, 1, 0, 0, 0, 1018, 1019, 5, 40, 0, 0, 1019, 1020, 3, 146, 73, 0, 1020, 1021, 5, 128, 0, 0, 1021, 1023, 3, 146, 73, 0, 1022, 1024, 3, 28, 14, 0, 1023, 1022, 1, 0, 0, 0, 1023, 1024, 1, 0, 0, 0, 1024, 1026, 1, 0, 0, 0, 1025, 1027, 3, 124, 62, 0, 1026, 1025, 1, 0, 0, 0, 1026, 1027, 1, 0, 0, 0, 1027, 1029, 1, 0, 0, 0, 1028, 998, 1, 0, 0, 0, 1028, 1003, 1, 0, 0, 0, 1028, 1010, 1, 0, 0, 0, 1028, 1018, 1, 0, 0, 0, 1029, 119, 1, 0, 0, 0, 1030, 1031, 7, 4, 0, 0, 1031, 121, 1, 0, 0, 0, 1032, 1033, 7, 5, 0, 0, 1033, 123, 1, 0, 0, 0, 1034, 1035, 5, 58, 0, 0, 1035, 1039, 5, 129, 0, 0, 1036, 1038, 3, 126, 63, 0, 1037, 1036, 1, 0, 0, 0, 1038, 1041, 1, 0, 0, 0, 1039, 1037, 1, 0, 0, 0, 1039, 1040, 1, 0, 0, 0, 1040, 1042, 1, 0, 0, 0, 1041, 1039, 1, 0, 0, 0, 1042, 1043, 5, 130, 0, 0, 1043, 125, 1, 0, 0, 0, 1044, 1045, 3, 146, 73, 0, 1045, 1046, 5, 52, 0, 0, 1046, 1047, 5, 3, 0, 0, 1047, 1048, 5, 17, 0, 0, 1048, 1049, 5, 131, 0, 0, 1049, 1050, 3, 76, 38, 0, 1050, 1051, 5, 132, 0, 0, 1051, 1052, 5, 126, 0, 0, 1052, 1141, 1, 0, 0, 0, 1053, 1054, 3, 146, 73, 0, 1054, 1055, 5, 52, 0, 0, 1055, 1056, 5, 55, 0, 0, 1056, 1063, 3, 146, 73, 0, 1057, 1058, 5, 60, 0, 0, 1058, 1059, 5, 56, 0, 0, 1059, 1060, 3, 146, 73, 0, 1060, 1061, 5, 128, 0, 0, 1061, 1062, 3, 146, 73, 0, 1062, 1064, 1, 0, 0, 0, 1063, 1057, 1, 0, 0, 0, 1063, 1064, 1, 0, 0, 0, 1064, 1065, 1, 0, 0, 0, 1065, 1066, 5, 126, 0, 0, 1066, 1141, 1, 0, 0, 0, 1067, 1068, 3, 146, 73, 0, 1068, 1069, 5, 52, 0, 0, 1069, 1070, 5, 56, 0, 0, 1070, 1071, 3, 146, 73, 0, 1071, 1072, 5, 128, 0, 0, 1072, 1079, 3, 146, 73, 0, 1073, 1074, 5, 60, 0, 0, 1074, 1075, 5, 56, 0, 0, 1075, 1076, 3, 146, 73, 0, 1076, 1077, 5, 128, 0, 0, 1077, 1078, 3, 146, 73, 0, 1078, 1080, 1, 0, 0, 0, 1079, 1073, 1, 0, 0, 0, 1079, 1080, 1, 0, 0, 0, 1080, 1081, 1, 0, 0, 0, 1081, 1082, 5, 126, 0, 0, 1082, 1141, 1, 0, 0, 0, 1083, 1084, 3, 146, 73, 0, 1084, 1085, 5, 52, 0, 0, 1085, 1086, 5, 38, 0, 0, 1086, 1088, 3, 146, 73, 0, 1087, 1089, 3, 28, 14, 0, 1088, 1087, 1, 0, 0, 0, 1088, 1089, 1, 0, 0, 0, 1089, 1096, 1, 0, 0, 0, 1090, 1091, 5, 60, 0, 0, 1091, 1092, 5, 56, 0, 0, 1092, 1093, 3, 146, 73, 0, 1093, 1094, 5, 128, 0, 0, 1094, 1095, 3, 146, 73, 0, 1095, 1097, 1, 0, 0, 0, 1096, 1090, 1, 0, 0, 0, 1096, 1097, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1099, 5, 126, 0, 0, 1099, 1141, 1, 0, 0, 0, 1100, 1101, 3, 146, 73, 0, 1101, 1102, 5, 52, 0, 0, 1102, 1103, 5, 1, 0, 0, 1103, 1104, 3, 146, 73, 0, 1104, 1105, 5, 58, 0, 0, 1105, 1109, 5, 129, 0, 0, 1106, 1108, 3, 106, 53, 0, 1107, 1106, 1, 0, 0, 0, 1108, 1111, 1, 0, 0, 0, 1109, 1107, 1, 0, 0, 0, 1109, 1110, 1, 0, 0, 0, 1110, 1112, 1, 0, 0, 0, 1111, 1109, 1, 0, 0, 0, 1112, 1113, 5, 130, 0, 0, 1113, 1114, 5, 126, 0, 0, 1114, 1141, 1, 0, 0, 0, 1115, 1116, 3, 146, 73, 0, 1116, 1117, 5, 52, 0, 0, 1117, 1118, 5, 45, 0, 0, 1118, 1119, 3, 146, 73, 0, 1119, 1120, 5, 126, 0, 0, 1120, 1141, 1, 0, 0, 0, 1121, 1122, 3, 146, 73, 0, 1122, 1124, 5, 52, 0, 0, 1123, 1125, 5, 3, 0, 0, 1124, 1123, 1, 0, 0, 0, 1124, 1125, 1, 0, 0, 0, 1125, 1126, 1, 0, 0, 0, 1126, 1127, 5, 16, 0, 0, 1127, 1128, 3, 146, 73, 0, 1128, 1129, 5, 128, 0, 0, 1129, 1136, 3, 146, 73, 0, 1130, 1131, 5, 60, 0, 0, 1131, 1132, 5, 56, 0, 0, 1132, 1133, 3, 146, 73, 0, 1133, 1134, 5, 128, 0, 0, 1134, 1135, 3, 146, 73, 0, 1135, 1137, 1, 0, 0, 0, 1136, 1130, 1, 0, 0, 0, 1136, 1137, 1, 0, 0, 0, 1137, 1138, 1, 0, 0, 0, 1138, 1139, 5, 126, 0, 0, 1139, 1141, 1, 0, 0, 0, 1140, 1044, 1, 0, 0, 0, 1140, 1053, 1, 0, 0, 0, 1140, 1067, 1, 0, 0, 0, 1140, 1083, 1, 0, 0, 0, 1140, 1100, 1, 0, 0, 0, 1140, 1115, 1, 0, 0, 0, 1140, 1121, 1, 0, 0, 0, 1141, 127, 1, 0, 0, 0, 1142, 1143, 5, 45, 0, 0, 1143, 1144, 3, 146, 73, 0, 1144, 1145, 5, 52, 0, 0, 1145, 1146, 3, 146, 73, 0, 1146, 1147, 5, 128, 0, 0, 1147, 1149, 3, 146, 73, 0, 1148, 1150, 3, 124, 62, 0, 1149, 1148, 1, 0, 0, 0, 1149, 1150, 1, 0, 0, 0, 1150, 1151, 1, 0, 0, 0, 1151, 1152, 5, 126, 0, 0, 1152, 129, 1, 0, 0, 0, 1153, 1200, 3, 134, 67, 0, 1154, 1200, 5, 105, 0, 0, 1155, 1200, 5, 106, 0, 0, 1156, 1157, 5, 107, 0, 0, 1157, 1200, 3, 148, 74, 0, 1158, 1159, 5, 108, 0, 0, 1159, 1160, 5, 135, 0, 0, 1160, 1161, 3, 146, 73, 0, 1161, 1162, 5, 136, 0, 0, 1162, 1200, 1, 0, 0, 0, 1163, 1164, 5, 109, 0, 0, 1164, 1165, 5, 135, 0, 0, 1165, 1167, 3, 146, 73, 0, 1166, 1168, 3, 28, 14, 0, 1167, 1166, 1, 0, 0, 0, 1167, 1168, 1, 0, 0, 0, 1168, 1169, 1, 0, 0, 0, 1169, 1170, 5, 136, 0, 0, 1170, 1200, 1, 0, 0, 0, 1171, 1172, 5, 33, 0, 0, 1172, 1173, 5, 135, 0, 0, 1173, 1174, 3, 146, 73, 0, 1174, 1175, 5, 136, 0, 0, 1175, 1200, 1, 0, 0, 0, 1176, 1177, 5, 110, 0, 0, 1177, 1178, 5, 135, 0, 0, 1178, 1179, 3, 130, 65, 0, 1179, 1180, 5, 136, 0, 0, 1180, 1200, 1, 0, 0, 0, 1181, 1182, 5, 111, 0, 0, 1182, 1183, 5, 135, 0, 0, 1183, 1184, 3, 130, 65, 0, 1184, 1185, 5, 136, 0, 0, 1185, 1200, 1, 0, 0, 0, 1186, 1187, 5, 112, 0, 0, 1187, 1191, 5, 129, 0, 0, 1188, 1190, 3, 132, 66, 0, 1189, 1188, 1, 0, 0, 0, 1190, 1193, 1, 0, 0, 0, 1191, 1189, 1, 0, 0, 0, 1191, 1192, 1, 0, 0, 0, 1192, 1194, 1, 0, 0, 0, 1193, 1191, 1, 0, 0, 0, 1194, 1200, 5, 130, 0, 0, 1195, 1197, 3, 146, 73, 0, 1196, 1198, 3, 28, 14, 0, 1197, 1196, 1, 0, 0, 0, 1197, 1198, 1, 0, 0, 0, 1198, 1200, 1, 0, 0, 0, 1199, 1153, 1, 0, 0, 0, 1199, 1154, 1, 0, 0, 0, 1199, 1155, 1, 0, 0, 0, 1199, 1156, 1, 0, 0, 0, 1199, 1158, 1, 0, 0, 0, 1199, 1163, 1, 0, 0, 0, 1199, 1171, 1, 0, 0, 0, 1199, 1176, 1, 0, 0, 0, 1199, 1181, 1, 0, 0, 0, 1199, 1186, 1, 0, 0, 0, 1199, 1195, 1, 0, 0, 0, 1200, 131, 1, 0, 0, 0, 1201, 1202, 3, 146, 73, 0, 1202, 1203, 5, 125, 0, 0, 1203, 1204, 3, 130, 65, 0, 1204, 1205, 5, 126, 0, 0, 1205, 133, 1, 0, 0, 0, 1206, 1207, 7, 6, 0, 0, 1207, 135, 1, 0, 0, 0, 1208, 1209, 7, 7, 0, 0, 1209, 137, 1, 0, 0, 0, 1210, 1219, 3, 148, 74, 0, 1211, 1219, 5, 139, 0, 0, 1212, 1219, 5, 140, 0, 0, 1213, 1219, 5, 121, 0, 0, 1214, 1219, 5, 122, 0, 0, 1215, 1219, 5, 123, 0, 0, 1216, 1219, 3, 140, 70, 0, 1217, 1219, 3, 144, 72, 0, 1218, 1210, 1, 0, 0, 0, 1218, 1211, 1, 0, 0, 0, 1218, 1212, 1, 0, 0, 0, 1218, 1213, 1, 0, 0, 0, 1218, 1214, 1, 0, 0, 0, 1218, 1215, 1, 0, 0, 0, 1218, 1216, 1, 0, 0, 0, 1218, 1217, 1, 0, 0, 0, 1219, 139, 1, 0, 0, 0, 1220, 1229, 5, 129, 0, 0, 1221, 1226, 3, 142, 71, 0, 1222, 1223, 5, 127, 0, 0, 1223, 1225, 3, 142, 71, 0, 1224, 1222, 1, 0, 0, 0, 1225, 1228, 1, 0, 0, 0, 1226, 1224, 1, 0, 0, 0, 1226, 1227, 1, 0, 0, 0, 1227, 1230, 1, 0, 0, 0, 1228, 1226, 1, 0, 0, 0, 1229, 1221, 1, 0, 0, 0, 1229, 1230, 1, 0, 0, 0, 1230, 1231, 1, 0, 0, 0, 1231, 1232, 5, 130, 0, 0, 1232, 141, 1, 0, 0, 0, 1233, 1234, 3, 148, 74, 0, 1234, 1235, 5, 125, 0, 0, 1235, 1236, 3, 138, 69, 0, 1236, 143, 1, 0, 0, 0, 1237, 1246, 5, 131, 0, 0, 1238, 1243, 3, 138, 69, 0, 1239, 1240, 5, 127, 0, 0, 1240, 1242, 3, 138, 69, 0, 1241, 1239, 1, 0, 0, 0, 1242, 1245, 1, 0, 0, 0, 1243, 1241, 1, 0, 0, 0, 1243, 1244, 1, 0, 0, 0, 1244, 1247, 1, 0, 0, 0, 1245, 1243, 1, 0, 0, 0, 1246, 1238, 1, 0, 0, 0, 1246, 1247, 1, 0, 0, 0, 1247, 1248, 1, 0, 0, 0, 1248, 1249, 5, 132, 0, 0, 1249, 145, 1, 0, 0, 0, 1250, 1251, 7, 8, 0, 0, 1251, 147, 1, 0, 0, 0, 1252, 1253, 5, 142, 0, 0, 1253, 149, 1, 0, 0, 0, 110, 162, 169, 190, 202, 214, 234, 242, 249, 255, 267, 270, 276, 287, 296, 306, 309, 311, 315, 323, 335, 340, 349, 352, 367, 373, 385, 394, 402, 415, 418, 428, 432, 438, 445, 451, 459, 467, 480, 487, 491, 496, 507, 513, 523, 528, 534, 545, 572, 599, 604, 615, 618, 623, 630, 639, 642, 655, 664, 678, 699, 702, 705, 712, 720, 760, 763, 785, 799, 807, 819, 833, 843, 861, 865, 868, 872, 875, 884, 888, 892, 898, 909, 916, 936, 945, 977, 996, 1013, 1023, 1026, 1028, 1039, 1063, 1079, 1088, 1096, 1109, 1124, 1136, 1140, 1149, 1167, 1191, 1197, 1199, 1218, 1226, 1229, 1243, 1246] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapability.tokens b/src/capability-language/generated/QuixosCapability.tokens index 6557cbb..879ca09 100644 --- a/src/capability-language/generated/QuixosCapability.tokens +++ b/src/capability-language/generated/QuixosCapability.tokens @@ -1,279 +1,283 @@ -WORKSPACE=1 -EXECUTION=2 -SNAPSHOT=3 -TRANSACTION=4 -REMOTE=5 -TARGETS=6 -PORTABLE=7 -REPLICA=8 -LOCAL=9 -FROM=10 -RESULT_BYTES=11 -RPC_CALLS=12 -DEADLINE_MS=13 -QUERY=14 -REFLECTION=15 -SPECIALIZE=16 -ROOT=17 -DOCUMENT=18 -FRAGMENTS=19 -VIEW=20 -MAX=21 -ALLOW=22 -POLL=23 -QUERYABLE=24 -RPC=25 -QUERY_REASON=26 -TYPE=27 -OBJECT=28 -STORABLE=29 -IMPLEMENTS=30 -REF=31 -FRAGMENT=32 -IMPORT=33 -EXTERNAL=34 -ATOM=35 -INTERFACE=36 -INTERFACES=37 -PACKAGE=38 -VALUE=39 -RELATION=40 -OPERATION=41 -FUNCTION=42 -CONSTRUCTOR=43 -CONSTRUCTS=44 -INPUT=45 -CONFORM=46 -AS=47 -BIND=48 -STATIC=49 -TO=50 -PRIVATE=51 -SHARED=52 -STATE=53 -EDGE=54 -PROJECTION=55 -WITH=56 -USING=57 -VIA=58 -MATERIALIZE=59 -IF=60 -ABSENT=61 -ON=62 -POLICY=63 -DEFAULT=64 -SOURCE=65 -REPOSITORY=66 -COMMIT=67 -REVISION=68 -SEMANTIC_MAJOR=69 -ON_DELETE=70 -RETAIN_OTHER=71 -KEYED=72 -PUBLIC_TRAVERSAL=73 -ID=74 -DOC=75 -MODE=76 -EMITS=77 -RECEIVER=78 -REQUIRES=79 -ANY=80 -GET=81 -SET=82 -WATCH=83 -START=84 -STOP=85 -READ=86 -WRITE=87 -RESOLVE=88 -CONNECT=89 -DISCONNECT=90 -CALL=91 -WATCH_START=92 -WATCH_STOP=93 -SUBSCRIBE=94 -UNSUBSCRIBE=95 -OPTIMISTIC_REGISTER=96 -CRDT=97 -OPTIONAL_ONE=98 -EXACTLY_ONE=99 -MANY_UNIQUE=100 -MANY=101 -ORDERED=102 -UNIT=103 -WATCH_HANDLE=104 -MESSAGE=105 -ATOM_REF=106 -INTERFACE_REF=107 -OPTIONAL=108 -LIST=109 -RECORD=110 -BOOL=111 -BYTES=112 -DOUBLE=113 -INT32=114 -INT64=115 -STRING=116 -UINT32=117 -UINT64=118 -TRUE=119 -FALSE=120 -NULL=121 -ARROW=122 -COLON=123 -SEMI=124 -COMMA=125 -DOT=126 -LBRACE=127 -RBRACE=128 -LBRACK=129 -RBRACK=130 -LPAREN=131 -RPAREN=132 -LT=133 -GT=134 -AMP=135 -EQUAL=136 -INTEGER=137 -JSON_NUMBER=138 -IDENTIFIER=139 -STRING_LITERAL=140 -LINE_COMMENT=141 -BLOCK_COMMENT=142 -WS=143 -'workspace'=1 -'execution'=2 -'snapshot'=3 -'transaction'=4 -'remote'=5 -'targets'=6 -'portable'=7 -'replica'=8 -'local'=9 -'from'=10 -'result-bytes'=11 -'rpc-calls'=12 -'deadline-ms'=13 -'query'=14 -'reflection'=15 -'specialize'=16 -'root'=17 -'document'=18 -'fragments'=19 -'view'=20 -'max'=21 -'allow'=22 -'poll'=23 -'queryable'=24 -'rpc'=25 -'query-reason'=26 -'type'=27 -'object'=28 -'storable'=29 -'implements'=30 -'ref'=31 -'fragment'=32 -'import'=33 -'external'=34 -'atom'=35 -'interface'=36 -'interfaces'=37 -'package'=38 -'value'=39 -'relation'=40 -'operation'=41 -'function'=42 -'constructor'=43 -'constructs'=44 -'input'=45 -'conform'=46 -'as'=47 -'bind'=48 -'static'=49 -'to'=50 -'private'=51 -'shared'=52 -'state'=53 -'edge'=54 -'projection'=55 -'with'=56 -'using'=57 -'via'=58 -'materialize'=59 -'if'=60 -'absent'=61 -'on'=62 -'policy'=63 -'default'=64 -'source'=65 -'repository'=66 -'commit'=67 -'revision'=68 -'semantic-major'=69 -'on-delete'=70 -'retain-other'=71 -'keyed'=72 -'public-traversal'=73 -'id'=74 -'doc'=75 -'mode'=76 -'emits'=77 -'receiver'=78 -'requires'=79 -'any'=80 -'get'=81 -'set'=82 -'watch'=83 -'start'=84 -'stop'=85 -'read'=86 -'write'=87 -'resolve'=88 -'connect'=89 -'disconnect'=90 -'call'=91 -'watch-start'=92 -'watch-stop'=93 -'subscribe'=94 -'unsubscribe'=95 -'optimistic-register'=96 -'crdt'=97 -'optional-one'=98 -'exactly-one'=99 -'many-unique'=100 -'many'=101 -'ordered'=102 -'unit'=103 -'watch-handle'=104 -'message'=105 -'atom-ref'=106 -'interface-ref'=107 -'optional'=108 -'list'=109 -'record'=110 -'bool'=111 -'bytes'=112 -'double'=113 -'int32'=114 -'int64'=115 -'string'=116 -'uint32'=117 -'uint64'=118 -'true'=119 -'false'=120 -'null'=121 -'->'=122 -':'=123 -';'=124 -','=125 -'.'=126 -'{'=127 -'}'=128 -'['=129 -']'=130 -'('=131 -')'=132 -'<'=133 -'>'=134 -'&'=135 -'='=136 +CREATION=1 +INITIALIZE=2 +WORKSPACE=3 +EXECUTION=4 +SNAPSHOT=5 +TRANSACTION=6 +REMOTE=7 +TARGETS=8 +PORTABLE=9 +REPLICA=10 +LOCAL=11 +FROM=12 +RESULT_BYTES=13 +RPC_CALLS=14 +DEADLINE_MS=15 +QUERY=16 +REFLECTION=17 +SPECIALIZE=18 +ROOT=19 +DOCUMENT=20 +FRAGMENTS=21 +VIEW=22 +MAX=23 +ALLOW=24 +POLL=25 +QUERYABLE=26 +RPC=27 +QUERY_REASON=28 +TYPE=29 +OBJECT=30 +STORABLE=31 +IMPLEMENTS=32 +REF=33 +FRAGMENT=34 +IMPORT=35 +EXTERNAL=36 +ATOM=37 +INTERFACE=38 +INTERFACES=39 +PACKAGE=40 +VALUE=41 +RELATION=42 +OPERATION=43 +FUNCTION=44 +CONSTRUCTOR=45 +CONSTRUCTS=46 +INPUT=47 +CONFORM=48 +AS=49 +BIND=50 +STATIC=51 +TO=52 +PRIVATE=53 +SHARED=54 +STATE=55 +EDGE=56 +PROJECTION=57 +WITH=58 +USING=59 +VIA=60 +MATERIALIZE=61 +IF=62 +ABSENT=63 +ON=64 +POLICY=65 +DEFAULT=66 +SOURCE=67 +REPOSITORY=68 +COMMIT=69 +REVISION=70 +SEMANTIC_MAJOR=71 +ON_DELETE=72 +RETAIN_OTHER=73 +KEYED=74 +PUBLIC_TRAVERSAL=75 +ID=76 +DOC=77 +MODE=78 +EMITS=79 +RECEIVER=80 +REQUIRES=81 +ANY=82 +GET=83 +SET=84 +WATCH=85 +START=86 +STOP=87 +READ=88 +WRITE=89 +RESOLVE=90 +CONNECT=91 +DISCONNECT=92 +CALL=93 +WATCH_START=94 +WATCH_STOP=95 +SUBSCRIBE=96 +UNSUBSCRIBE=97 +REGISTER=98 +CRDT=99 +OPTIONAL_ONE=100 +EXACTLY_ONE=101 +MANY_UNIQUE=102 +MANY=103 +ORDERED=104 +UNIT=105 +WATCH_HANDLE=106 +MESSAGE=107 +ATOM_REF=108 +INTERFACE_REF=109 +OPTIONAL=110 +LIST=111 +RECORD=112 +BOOL=113 +BYTES=114 +DOUBLE=115 +INT32=116 +INT64=117 +STRING=118 +UINT32=119 +UINT64=120 +TRUE=121 +FALSE=122 +NULL=123 +ARROW=124 +COLON=125 +SEMI=126 +COMMA=127 +DOT=128 +LBRACE=129 +RBRACE=130 +LBRACK=131 +RBRACK=132 +LPAREN=133 +RPAREN=134 +LT=135 +GT=136 +AMP=137 +EQUAL=138 +INTEGER=139 +JSON_NUMBER=140 +IDENTIFIER=141 +STRING_LITERAL=142 +LINE_COMMENT=143 +BLOCK_COMMENT=144 +WS=145 +'creation'=1 +'initialize'=2 +'workspace'=3 +'execution'=4 +'snapshot'=5 +'transaction'=6 +'remote'=7 +'targets'=8 +'portable'=9 +'replica'=10 +'local'=11 +'from'=12 +'result-bytes'=13 +'rpc-calls'=14 +'deadline-ms'=15 +'query'=16 +'reflection'=17 +'specialize'=18 +'root'=19 +'document'=20 +'fragments'=21 +'view'=22 +'max'=23 +'allow'=24 +'poll'=25 +'queryable'=26 +'rpc'=27 +'query-reason'=28 +'type'=29 +'object'=30 +'storable'=31 +'implements'=32 +'ref'=33 +'fragment'=34 +'import'=35 +'external'=36 +'atom'=37 +'interface'=38 +'interfaces'=39 +'package'=40 +'value'=41 +'relation'=42 +'operation'=43 +'function'=44 +'constructor'=45 +'constructs'=46 +'input'=47 +'conform'=48 +'as'=49 +'bind'=50 +'static'=51 +'to'=52 +'private'=53 +'shared'=54 +'state'=55 +'edge'=56 +'projection'=57 +'with'=58 +'using'=59 +'via'=60 +'materialize'=61 +'if'=62 +'absent'=63 +'on'=64 +'policy'=65 +'default'=66 +'source'=67 +'repository'=68 +'commit'=69 +'revision'=70 +'semantic-major'=71 +'on-delete'=72 +'retain-other'=73 +'keyed'=74 +'public-traversal'=75 +'id'=76 +'doc'=77 +'mode'=78 +'emits'=79 +'receiver'=80 +'requires'=81 +'any'=82 +'get'=83 +'set'=84 +'watch'=85 +'start'=86 +'stop'=87 +'read'=88 +'write'=89 +'resolve'=90 +'connect'=91 +'disconnect'=92 +'call'=93 +'watch-start'=94 +'watch-stop'=95 +'subscribe'=96 +'unsubscribe'=97 +'register'=98 +'crdt'=99 +'optional-one'=100 +'exactly-one'=101 +'many-unique'=102 +'many'=103 +'ordered'=104 +'unit'=105 +'watch-handle'=106 +'message'=107 +'atom-ref'=108 +'interface-ref'=109 +'optional'=110 +'list'=111 +'record'=112 +'bool'=113 +'bytes'=114 +'double'=115 +'int32'=116 +'int64'=117 +'string'=118 +'uint32'=119 +'uint64'=120 +'true'=121 +'false'=122 +'null'=123 +'->'=124 +':'=125 +';'=126 +','=127 +'.'=128 +'{'=129 +'}'=130 +'['=131 +']'=132 +'('=133 +')'=134 +'<'=135 +'>'=136 +'&'=137 +'='=138 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.interp b/src/capability-language/generated/QuixosCapabilityLexer.interp index 44581dc..11408b7 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.interp +++ b/src/capability-language/generated/QuixosCapabilityLexer.interp @@ -1,5 +1,7 @@ token literal names: null +'creation' +'initialize' 'workspace' 'execution' 'snapshot' @@ -95,7 +97,7 @@ null 'watch-stop' 'subscribe' 'unsubscribe' -'optimistic-register' +'register' 'crdt' 'optional-one' 'exactly-one' @@ -146,6 +148,8 @@ null token symbolic names: null +CREATION +INITIALIZE WORKSPACE EXECUTION SNAPSHOT @@ -241,7 +245,7 @@ WATCH_START WATCH_STOP SUBSCRIBE UNSUBSCRIBE -OPTIMISTIC_REGISTER +REGISTER CRDT OPTIONAL_ONE EXACTLY_ONE @@ -291,6 +295,8 @@ BLOCK_COMMENT WS rule names: +CREATION +INITIALIZE WORKSPACE EXECUTION SNAPSHOT @@ -386,7 +392,7 @@ WATCH_START WATCH_STOP SUBSCRIBE UNSUBSCRIBE -OPTIMISTIC_REGISTER +REGISTER CRDT OPTIONAL_ONE EXACTLY_ONE @@ -445,4 +451,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 143, 1377, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 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, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 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, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 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, 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, 21, 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, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 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, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 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, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 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, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 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, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 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, 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, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 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, 51, 1, 51, 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, 54, 1, 54, 1, 54, 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, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 62, 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, 63, 1, 64, 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, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 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, 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, 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, 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, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 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, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 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, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 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, 91, 1, 91, 1, 91, 1, 91, 1, 91, 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, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 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, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 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, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 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, 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, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 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, 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, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 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, 3, 136, 1278, 8, 136, 1, 136, 4, 136, 1281, 8, 136, 11, 136, 12, 136, 1282, 1, 137, 3, 137, 1286, 8, 137, 1, 137, 1, 137, 1, 137, 5, 137, 1291, 8, 137, 10, 137, 12, 137, 1294, 9, 137, 3, 137, 1296, 8, 137, 1, 137, 1, 137, 4, 137, 1300, 8, 137, 11, 137, 12, 137, 1301, 3, 137, 1304, 8, 137, 1, 137, 1, 137, 3, 137, 1308, 8, 137, 1, 137, 4, 137, 1311, 8, 137, 11, 137, 12, 137, 1312, 3, 137, 1315, 8, 137, 1, 138, 1, 138, 5, 138, 1319, 8, 138, 10, 138, 12, 138, 1322, 9, 138, 1, 139, 1, 139, 1, 139, 5, 139, 1327, 8, 139, 10, 139, 12, 139, 1330, 9, 139, 1, 139, 1, 139, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 1, 140, 3, 140, 1342, 8, 140, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 5, 142, 1350, 8, 142, 10, 142, 12, 142, 1353, 9, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 5, 143, 1361, 8, 143, 10, 143, 12, 143, 1364, 9, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 144, 4, 144, 1372, 8, 144, 11, 144, 12, 144, 1373, 1, 144, 1, 144, 1, 1362, 0, 145, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 0, 283, 0, 285, 141, 287, 142, 289, 143, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1391, 0, 1, 1, 0, 0, 0, 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, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 285, 1, 0, 0, 0, 0, 287, 1, 0, 0, 0, 0, 289, 1, 0, 0, 0, 1, 291, 1, 0, 0, 0, 3, 301, 1, 0, 0, 0, 5, 311, 1, 0, 0, 0, 7, 320, 1, 0, 0, 0, 9, 332, 1, 0, 0, 0, 11, 339, 1, 0, 0, 0, 13, 347, 1, 0, 0, 0, 15, 356, 1, 0, 0, 0, 17, 364, 1, 0, 0, 0, 19, 370, 1, 0, 0, 0, 21, 375, 1, 0, 0, 0, 23, 388, 1, 0, 0, 0, 25, 398, 1, 0, 0, 0, 27, 410, 1, 0, 0, 0, 29, 416, 1, 0, 0, 0, 31, 427, 1, 0, 0, 0, 33, 438, 1, 0, 0, 0, 35, 443, 1, 0, 0, 0, 37, 452, 1, 0, 0, 0, 39, 462, 1, 0, 0, 0, 41, 467, 1, 0, 0, 0, 43, 471, 1, 0, 0, 0, 45, 477, 1, 0, 0, 0, 47, 482, 1, 0, 0, 0, 49, 492, 1, 0, 0, 0, 51, 496, 1, 0, 0, 0, 53, 509, 1, 0, 0, 0, 55, 514, 1, 0, 0, 0, 57, 521, 1, 0, 0, 0, 59, 530, 1, 0, 0, 0, 61, 541, 1, 0, 0, 0, 63, 545, 1, 0, 0, 0, 65, 554, 1, 0, 0, 0, 67, 561, 1, 0, 0, 0, 69, 570, 1, 0, 0, 0, 71, 575, 1, 0, 0, 0, 73, 585, 1, 0, 0, 0, 75, 596, 1, 0, 0, 0, 77, 604, 1, 0, 0, 0, 79, 610, 1, 0, 0, 0, 81, 619, 1, 0, 0, 0, 83, 629, 1, 0, 0, 0, 85, 638, 1, 0, 0, 0, 87, 650, 1, 0, 0, 0, 89, 661, 1, 0, 0, 0, 91, 667, 1, 0, 0, 0, 93, 675, 1, 0, 0, 0, 95, 678, 1, 0, 0, 0, 97, 683, 1, 0, 0, 0, 99, 690, 1, 0, 0, 0, 101, 693, 1, 0, 0, 0, 103, 701, 1, 0, 0, 0, 105, 708, 1, 0, 0, 0, 107, 714, 1, 0, 0, 0, 109, 719, 1, 0, 0, 0, 111, 730, 1, 0, 0, 0, 113, 735, 1, 0, 0, 0, 115, 741, 1, 0, 0, 0, 117, 745, 1, 0, 0, 0, 119, 757, 1, 0, 0, 0, 121, 760, 1, 0, 0, 0, 123, 767, 1, 0, 0, 0, 125, 770, 1, 0, 0, 0, 127, 777, 1, 0, 0, 0, 129, 785, 1, 0, 0, 0, 131, 792, 1, 0, 0, 0, 133, 803, 1, 0, 0, 0, 135, 810, 1, 0, 0, 0, 137, 819, 1, 0, 0, 0, 139, 834, 1, 0, 0, 0, 141, 844, 1, 0, 0, 0, 143, 857, 1, 0, 0, 0, 145, 863, 1, 0, 0, 0, 147, 880, 1, 0, 0, 0, 149, 883, 1, 0, 0, 0, 151, 887, 1, 0, 0, 0, 153, 892, 1, 0, 0, 0, 155, 898, 1, 0, 0, 0, 157, 907, 1, 0, 0, 0, 159, 916, 1, 0, 0, 0, 161, 920, 1, 0, 0, 0, 163, 924, 1, 0, 0, 0, 165, 928, 1, 0, 0, 0, 167, 934, 1, 0, 0, 0, 169, 940, 1, 0, 0, 0, 171, 945, 1, 0, 0, 0, 173, 950, 1, 0, 0, 0, 175, 956, 1, 0, 0, 0, 177, 964, 1, 0, 0, 0, 179, 972, 1, 0, 0, 0, 181, 983, 1, 0, 0, 0, 183, 988, 1, 0, 0, 0, 185, 1000, 1, 0, 0, 0, 187, 1011, 1, 0, 0, 0, 189, 1021, 1, 0, 0, 0, 191, 1033, 1, 0, 0, 0, 193, 1053, 1, 0, 0, 0, 195, 1058, 1, 0, 0, 0, 197, 1071, 1, 0, 0, 0, 199, 1083, 1, 0, 0, 0, 201, 1095, 1, 0, 0, 0, 203, 1100, 1, 0, 0, 0, 205, 1108, 1, 0, 0, 0, 207, 1113, 1, 0, 0, 0, 209, 1126, 1, 0, 0, 0, 211, 1134, 1, 0, 0, 0, 213, 1143, 1, 0, 0, 0, 215, 1157, 1, 0, 0, 0, 217, 1166, 1, 0, 0, 0, 219, 1171, 1, 0, 0, 0, 221, 1178, 1, 0, 0, 0, 223, 1183, 1, 0, 0, 0, 225, 1189, 1, 0, 0, 0, 227, 1196, 1, 0, 0, 0, 229, 1202, 1, 0, 0, 0, 231, 1208, 1, 0, 0, 0, 233, 1215, 1, 0, 0, 0, 235, 1222, 1, 0, 0, 0, 237, 1229, 1, 0, 0, 0, 239, 1234, 1, 0, 0, 0, 241, 1240, 1, 0, 0, 0, 243, 1245, 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, 1277, 1, 0, 0, 0, 275, 1285, 1, 0, 0, 0, 277, 1316, 1, 0, 0, 0, 279, 1323, 1, 0, 0, 0, 281, 1333, 1, 0, 0, 0, 283, 1343, 1, 0, 0, 0, 285, 1345, 1, 0, 0, 0, 287, 1356, 1, 0, 0, 0, 289, 1371, 1, 0, 0, 0, 291, 292, 5, 119, 0, 0, 292, 293, 5, 111, 0, 0, 293, 294, 5, 114, 0, 0, 294, 295, 5, 107, 0, 0, 295, 296, 5, 115, 0, 0, 296, 297, 5, 112, 0, 0, 297, 298, 5, 97, 0, 0, 298, 299, 5, 99, 0, 0, 299, 300, 5, 101, 0, 0, 300, 2, 1, 0, 0, 0, 301, 302, 5, 101, 0, 0, 302, 303, 5, 120, 0, 0, 303, 304, 5, 101, 0, 0, 304, 305, 5, 99, 0, 0, 305, 306, 5, 117, 0, 0, 306, 307, 5, 116, 0, 0, 307, 308, 5, 105, 0, 0, 308, 309, 5, 111, 0, 0, 309, 310, 5, 110, 0, 0, 310, 4, 1, 0, 0, 0, 311, 312, 5, 115, 0, 0, 312, 313, 5, 110, 0, 0, 313, 314, 5, 97, 0, 0, 314, 315, 5, 112, 0, 0, 315, 316, 5, 115, 0, 0, 316, 317, 5, 104, 0, 0, 317, 318, 5, 111, 0, 0, 318, 319, 5, 116, 0, 0, 319, 6, 1, 0, 0, 0, 320, 321, 5, 116, 0, 0, 321, 322, 5, 114, 0, 0, 322, 323, 5, 97, 0, 0, 323, 324, 5, 110, 0, 0, 324, 325, 5, 115, 0, 0, 325, 326, 5, 97, 0, 0, 326, 327, 5, 99, 0, 0, 327, 328, 5, 116, 0, 0, 328, 329, 5, 105, 0, 0, 329, 330, 5, 111, 0, 0, 330, 331, 5, 110, 0, 0, 331, 8, 1, 0, 0, 0, 332, 333, 5, 114, 0, 0, 333, 334, 5, 101, 0, 0, 334, 335, 5, 109, 0, 0, 335, 336, 5, 111, 0, 0, 336, 337, 5, 116, 0, 0, 337, 338, 5, 101, 0, 0, 338, 10, 1, 0, 0, 0, 339, 340, 5, 116, 0, 0, 340, 341, 5, 97, 0, 0, 341, 342, 5, 114, 0, 0, 342, 343, 5, 103, 0, 0, 343, 344, 5, 101, 0, 0, 344, 345, 5, 116, 0, 0, 345, 346, 5, 115, 0, 0, 346, 12, 1, 0, 0, 0, 347, 348, 5, 112, 0, 0, 348, 349, 5, 111, 0, 0, 349, 350, 5, 114, 0, 0, 350, 351, 5, 116, 0, 0, 351, 352, 5, 97, 0, 0, 352, 353, 5, 98, 0, 0, 353, 354, 5, 108, 0, 0, 354, 355, 5, 101, 0, 0, 355, 14, 1, 0, 0, 0, 356, 357, 5, 114, 0, 0, 357, 358, 5, 101, 0, 0, 358, 359, 5, 112, 0, 0, 359, 360, 5, 108, 0, 0, 360, 361, 5, 105, 0, 0, 361, 362, 5, 99, 0, 0, 362, 363, 5, 97, 0, 0, 363, 16, 1, 0, 0, 0, 364, 365, 5, 108, 0, 0, 365, 366, 5, 111, 0, 0, 366, 367, 5, 99, 0, 0, 367, 368, 5, 97, 0, 0, 368, 369, 5, 108, 0, 0, 369, 18, 1, 0, 0, 0, 370, 371, 5, 102, 0, 0, 371, 372, 5, 114, 0, 0, 372, 373, 5, 111, 0, 0, 373, 374, 5, 109, 0, 0, 374, 20, 1, 0, 0, 0, 375, 376, 5, 114, 0, 0, 376, 377, 5, 101, 0, 0, 377, 378, 5, 115, 0, 0, 378, 379, 5, 117, 0, 0, 379, 380, 5, 108, 0, 0, 380, 381, 5, 116, 0, 0, 381, 382, 5, 45, 0, 0, 382, 383, 5, 98, 0, 0, 383, 384, 5, 121, 0, 0, 384, 385, 5, 116, 0, 0, 385, 386, 5, 101, 0, 0, 386, 387, 5, 115, 0, 0, 387, 22, 1, 0, 0, 0, 388, 389, 5, 114, 0, 0, 389, 390, 5, 112, 0, 0, 390, 391, 5, 99, 0, 0, 391, 392, 5, 45, 0, 0, 392, 393, 5, 99, 0, 0, 393, 394, 5, 97, 0, 0, 394, 395, 5, 108, 0, 0, 395, 396, 5, 108, 0, 0, 396, 397, 5, 115, 0, 0, 397, 24, 1, 0, 0, 0, 398, 399, 5, 100, 0, 0, 399, 400, 5, 101, 0, 0, 400, 401, 5, 97, 0, 0, 401, 402, 5, 100, 0, 0, 402, 403, 5, 108, 0, 0, 403, 404, 5, 105, 0, 0, 404, 405, 5, 110, 0, 0, 405, 406, 5, 101, 0, 0, 406, 407, 5, 45, 0, 0, 407, 408, 5, 109, 0, 0, 408, 409, 5, 115, 0, 0, 409, 26, 1, 0, 0, 0, 410, 411, 5, 113, 0, 0, 411, 412, 5, 117, 0, 0, 412, 413, 5, 101, 0, 0, 413, 414, 5, 114, 0, 0, 414, 415, 5, 121, 0, 0, 415, 28, 1, 0, 0, 0, 416, 417, 5, 114, 0, 0, 417, 418, 5, 101, 0, 0, 418, 419, 5, 102, 0, 0, 419, 420, 5, 108, 0, 0, 420, 421, 5, 101, 0, 0, 421, 422, 5, 99, 0, 0, 422, 423, 5, 116, 0, 0, 423, 424, 5, 105, 0, 0, 424, 425, 5, 111, 0, 0, 425, 426, 5, 110, 0, 0, 426, 30, 1, 0, 0, 0, 427, 428, 5, 115, 0, 0, 428, 429, 5, 112, 0, 0, 429, 430, 5, 101, 0, 0, 430, 431, 5, 99, 0, 0, 431, 432, 5, 105, 0, 0, 432, 433, 5, 97, 0, 0, 433, 434, 5, 108, 0, 0, 434, 435, 5, 105, 0, 0, 435, 436, 5, 122, 0, 0, 436, 437, 5, 101, 0, 0, 437, 32, 1, 0, 0, 0, 438, 439, 5, 114, 0, 0, 439, 440, 5, 111, 0, 0, 440, 441, 5, 111, 0, 0, 441, 442, 5, 116, 0, 0, 442, 34, 1, 0, 0, 0, 443, 444, 5, 100, 0, 0, 444, 445, 5, 111, 0, 0, 445, 446, 5, 99, 0, 0, 446, 447, 5, 117, 0, 0, 447, 448, 5, 109, 0, 0, 448, 449, 5, 101, 0, 0, 449, 450, 5, 110, 0, 0, 450, 451, 5, 116, 0, 0, 451, 36, 1, 0, 0, 0, 452, 453, 5, 102, 0, 0, 453, 454, 5, 114, 0, 0, 454, 455, 5, 97, 0, 0, 455, 456, 5, 103, 0, 0, 456, 457, 5, 109, 0, 0, 457, 458, 5, 101, 0, 0, 458, 459, 5, 110, 0, 0, 459, 460, 5, 116, 0, 0, 460, 461, 5, 115, 0, 0, 461, 38, 1, 0, 0, 0, 462, 463, 5, 118, 0, 0, 463, 464, 5, 105, 0, 0, 464, 465, 5, 101, 0, 0, 465, 466, 5, 119, 0, 0, 466, 40, 1, 0, 0, 0, 467, 468, 5, 109, 0, 0, 468, 469, 5, 97, 0, 0, 469, 470, 5, 120, 0, 0, 470, 42, 1, 0, 0, 0, 471, 472, 5, 97, 0, 0, 472, 473, 5, 108, 0, 0, 473, 474, 5, 108, 0, 0, 474, 475, 5, 111, 0, 0, 475, 476, 5, 119, 0, 0, 476, 44, 1, 0, 0, 0, 477, 478, 5, 112, 0, 0, 478, 479, 5, 111, 0, 0, 479, 480, 5, 108, 0, 0, 480, 481, 5, 108, 0, 0, 481, 46, 1, 0, 0, 0, 482, 483, 5, 113, 0, 0, 483, 484, 5, 117, 0, 0, 484, 485, 5, 101, 0, 0, 485, 486, 5, 114, 0, 0, 486, 487, 5, 121, 0, 0, 487, 488, 5, 97, 0, 0, 488, 489, 5, 98, 0, 0, 489, 490, 5, 108, 0, 0, 490, 491, 5, 101, 0, 0, 491, 48, 1, 0, 0, 0, 492, 493, 5, 114, 0, 0, 493, 494, 5, 112, 0, 0, 494, 495, 5, 99, 0, 0, 495, 50, 1, 0, 0, 0, 496, 497, 5, 113, 0, 0, 497, 498, 5, 117, 0, 0, 498, 499, 5, 101, 0, 0, 499, 500, 5, 114, 0, 0, 500, 501, 5, 121, 0, 0, 501, 502, 5, 45, 0, 0, 502, 503, 5, 114, 0, 0, 503, 504, 5, 101, 0, 0, 504, 505, 5, 97, 0, 0, 505, 506, 5, 115, 0, 0, 506, 507, 5, 111, 0, 0, 507, 508, 5, 110, 0, 0, 508, 52, 1, 0, 0, 0, 509, 510, 5, 116, 0, 0, 510, 511, 5, 121, 0, 0, 511, 512, 5, 112, 0, 0, 512, 513, 5, 101, 0, 0, 513, 54, 1, 0, 0, 0, 514, 515, 5, 111, 0, 0, 515, 516, 5, 98, 0, 0, 516, 517, 5, 106, 0, 0, 517, 518, 5, 101, 0, 0, 518, 519, 5, 99, 0, 0, 519, 520, 5, 116, 0, 0, 520, 56, 1, 0, 0, 0, 521, 522, 5, 115, 0, 0, 522, 523, 5, 116, 0, 0, 523, 524, 5, 111, 0, 0, 524, 525, 5, 114, 0, 0, 525, 526, 5, 97, 0, 0, 526, 527, 5, 98, 0, 0, 527, 528, 5, 108, 0, 0, 528, 529, 5, 101, 0, 0, 529, 58, 1, 0, 0, 0, 530, 531, 5, 105, 0, 0, 531, 532, 5, 109, 0, 0, 532, 533, 5, 112, 0, 0, 533, 534, 5, 108, 0, 0, 534, 535, 5, 101, 0, 0, 535, 536, 5, 109, 0, 0, 536, 537, 5, 101, 0, 0, 537, 538, 5, 110, 0, 0, 538, 539, 5, 116, 0, 0, 539, 540, 5, 115, 0, 0, 540, 60, 1, 0, 0, 0, 541, 542, 5, 114, 0, 0, 542, 543, 5, 101, 0, 0, 543, 544, 5, 102, 0, 0, 544, 62, 1, 0, 0, 0, 545, 546, 5, 102, 0, 0, 546, 547, 5, 114, 0, 0, 547, 548, 5, 97, 0, 0, 548, 549, 5, 103, 0, 0, 549, 550, 5, 109, 0, 0, 550, 551, 5, 101, 0, 0, 551, 552, 5, 110, 0, 0, 552, 553, 5, 116, 0, 0, 553, 64, 1, 0, 0, 0, 554, 555, 5, 105, 0, 0, 555, 556, 5, 109, 0, 0, 556, 557, 5, 112, 0, 0, 557, 558, 5, 111, 0, 0, 558, 559, 5, 114, 0, 0, 559, 560, 5, 116, 0, 0, 560, 66, 1, 0, 0, 0, 561, 562, 5, 101, 0, 0, 562, 563, 5, 120, 0, 0, 563, 564, 5, 116, 0, 0, 564, 565, 5, 101, 0, 0, 565, 566, 5, 114, 0, 0, 566, 567, 5, 110, 0, 0, 567, 568, 5, 97, 0, 0, 568, 569, 5, 108, 0, 0, 569, 68, 1, 0, 0, 0, 570, 571, 5, 97, 0, 0, 571, 572, 5, 116, 0, 0, 572, 573, 5, 111, 0, 0, 573, 574, 5, 109, 0, 0, 574, 70, 1, 0, 0, 0, 575, 576, 5, 105, 0, 0, 576, 577, 5, 110, 0, 0, 577, 578, 5, 116, 0, 0, 578, 579, 5, 101, 0, 0, 579, 580, 5, 114, 0, 0, 580, 581, 5, 102, 0, 0, 581, 582, 5, 97, 0, 0, 582, 583, 5, 99, 0, 0, 583, 584, 5, 101, 0, 0, 584, 72, 1, 0, 0, 0, 585, 586, 5, 105, 0, 0, 586, 587, 5, 110, 0, 0, 587, 588, 5, 116, 0, 0, 588, 589, 5, 101, 0, 0, 589, 590, 5, 114, 0, 0, 590, 591, 5, 102, 0, 0, 591, 592, 5, 97, 0, 0, 592, 593, 5, 99, 0, 0, 593, 594, 5, 101, 0, 0, 594, 595, 5, 115, 0, 0, 595, 74, 1, 0, 0, 0, 596, 597, 5, 112, 0, 0, 597, 598, 5, 97, 0, 0, 598, 599, 5, 99, 0, 0, 599, 600, 5, 107, 0, 0, 600, 601, 5, 97, 0, 0, 601, 602, 5, 103, 0, 0, 602, 603, 5, 101, 0, 0, 603, 76, 1, 0, 0, 0, 604, 605, 5, 118, 0, 0, 605, 606, 5, 97, 0, 0, 606, 607, 5, 108, 0, 0, 607, 608, 5, 117, 0, 0, 608, 609, 5, 101, 0, 0, 609, 78, 1, 0, 0, 0, 610, 611, 5, 114, 0, 0, 611, 612, 5, 101, 0, 0, 612, 613, 5, 108, 0, 0, 613, 614, 5, 97, 0, 0, 614, 615, 5, 116, 0, 0, 615, 616, 5, 105, 0, 0, 616, 617, 5, 111, 0, 0, 617, 618, 5, 110, 0, 0, 618, 80, 1, 0, 0, 0, 619, 620, 5, 111, 0, 0, 620, 621, 5, 112, 0, 0, 621, 622, 5, 101, 0, 0, 622, 623, 5, 114, 0, 0, 623, 624, 5, 97, 0, 0, 624, 625, 5, 116, 0, 0, 625, 626, 5, 105, 0, 0, 626, 627, 5, 111, 0, 0, 627, 628, 5, 110, 0, 0, 628, 82, 1, 0, 0, 0, 629, 630, 5, 102, 0, 0, 630, 631, 5, 117, 0, 0, 631, 632, 5, 110, 0, 0, 632, 633, 5, 99, 0, 0, 633, 634, 5, 116, 0, 0, 634, 635, 5, 105, 0, 0, 635, 636, 5, 111, 0, 0, 636, 637, 5, 110, 0, 0, 637, 84, 1, 0, 0, 0, 638, 639, 5, 99, 0, 0, 639, 640, 5, 111, 0, 0, 640, 641, 5, 110, 0, 0, 641, 642, 5, 115, 0, 0, 642, 643, 5, 116, 0, 0, 643, 644, 5, 114, 0, 0, 644, 645, 5, 117, 0, 0, 645, 646, 5, 99, 0, 0, 646, 647, 5, 116, 0, 0, 647, 648, 5, 111, 0, 0, 648, 649, 5, 114, 0, 0, 649, 86, 1, 0, 0, 0, 650, 651, 5, 99, 0, 0, 651, 652, 5, 111, 0, 0, 652, 653, 5, 110, 0, 0, 653, 654, 5, 115, 0, 0, 654, 655, 5, 116, 0, 0, 655, 656, 5, 114, 0, 0, 656, 657, 5, 117, 0, 0, 657, 658, 5, 99, 0, 0, 658, 659, 5, 116, 0, 0, 659, 660, 5, 115, 0, 0, 660, 88, 1, 0, 0, 0, 661, 662, 5, 105, 0, 0, 662, 663, 5, 110, 0, 0, 663, 664, 5, 112, 0, 0, 664, 665, 5, 117, 0, 0, 665, 666, 5, 116, 0, 0, 666, 90, 1, 0, 0, 0, 667, 668, 5, 99, 0, 0, 668, 669, 5, 111, 0, 0, 669, 670, 5, 110, 0, 0, 670, 671, 5, 102, 0, 0, 671, 672, 5, 111, 0, 0, 672, 673, 5, 114, 0, 0, 673, 674, 5, 109, 0, 0, 674, 92, 1, 0, 0, 0, 675, 676, 5, 97, 0, 0, 676, 677, 5, 115, 0, 0, 677, 94, 1, 0, 0, 0, 678, 679, 5, 98, 0, 0, 679, 680, 5, 105, 0, 0, 680, 681, 5, 110, 0, 0, 681, 682, 5, 100, 0, 0, 682, 96, 1, 0, 0, 0, 683, 684, 5, 115, 0, 0, 684, 685, 5, 116, 0, 0, 685, 686, 5, 97, 0, 0, 686, 687, 5, 116, 0, 0, 687, 688, 5, 105, 0, 0, 688, 689, 5, 99, 0, 0, 689, 98, 1, 0, 0, 0, 690, 691, 5, 116, 0, 0, 691, 692, 5, 111, 0, 0, 692, 100, 1, 0, 0, 0, 693, 694, 5, 112, 0, 0, 694, 695, 5, 114, 0, 0, 695, 696, 5, 105, 0, 0, 696, 697, 5, 118, 0, 0, 697, 698, 5, 97, 0, 0, 698, 699, 5, 116, 0, 0, 699, 700, 5, 101, 0, 0, 700, 102, 1, 0, 0, 0, 701, 702, 5, 115, 0, 0, 702, 703, 5, 104, 0, 0, 703, 704, 5, 97, 0, 0, 704, 705, 5, 114, 0, 0, 705, 706, 5, 101, 0, 0, 706, 707, 5, 100, 0, 0, 707, 104, 1, 0, 0, 0, 708, 709, 5, 115, 0, 0, 709, 710, 5, 116, 0, 0, 710, 711, 5, 97, 0, 0, 711, 712, 5, 116, 0, 0, 712, 713, 5, 101, 0, 0, 713, 106, 1, 0, 0, 0, 714, 715, 5, 101, 0, 0, 715, 716, 5, 100, 0, 0, 716, 717, 5, 103, 0, 0, 717, 718, 5, 101, 0, 0, 718, 108, 1, 0, 0, 0, 719, 720, 5, 112, 0, 0, 720, 721, 5, 114, 0, 0, 721, 722, 5, 111, 0, 0, 722, 723, 5, 106, 0, 0, 723, 724, 5, 101, 0, 0, 724, 725, 5, 99, 0, 0, 725, 726, 5, 116, 0, 0, 726, 727, 5, 105, 0, 0, 727, 728, 5, 111, 0, 0, 728, 729, 5, 110, 0, 0, 729, 110, 1, 0, 0, 0, 730, 731, 5, 119, 0, 0, 731, 732, 5, 105, 0, 0, 732, 733, 5, 116, 0, 0, 733, 734, 5, 104, 0, 0, 734, 112, 1, 0, 0, 0, 735, 736, 5, 117, 0, 0, 736, 737, 5, 115, 0, 0, 737, 738, 5, 105, 0, 0, 738, 739, 5, 110, 0, 0, 739, 740, 5, 103, 0, 0, 740, 114, 1, 0, 0, 0, 741, 742, 5, 118, 0, 0, 742, 743, 5, 105, 0, 0, 743, 744, 5, 97, 0, 0, 744, 116, 1, 0, 0, 0, 745, 746, 5, 109, 0, 0, 746, 747, 5, 97, 0, 0, 747, 748, 5, 116, 0, 0, 748, 749, 5, 101, 0, 0, 749, 750, 5, 114, 0, 0, 750, 751, 5, 105, 0, 0, 751, 752, 5, 97, 0, 0, 752, 753, 5, 108, 0, 0, 753, 754, 5, 105, 0, 0, 754, 755, 5, 122, 0, 0, 755, 756, 5, 101, 0, 0, 756, 118, 1, 0, 0, 0, 757, 758, 5, 105, 0, 0, 758, 759, 5, 102, 0, 0, 759, 120, 1, 0, 0, 0, 760, 761, 5, 97, 0, 0, 761, 762, 5, 98, 0, 0, 762, 763, 5, 115, 0, 0, 763, 764, 5, 101, 0, 0, 764, 765, 5, 110, 0, 0, 765, 766, 5, 116, 0, 0, 766, 122, 1, 0, 0, 0, 767, 768, 5, 111, 0, 0, 768, 769, 5, 110, 0, 0, 769, 124, 1, 0, 0, 0, 770, 771, 5, 112, 0, 0, 771, 772, 5, 111, 0, 0, 772, 773, 5, 108, 0, 0, 773, 774, 5, 105, 0, 0, 774, 775, 5, 99, 0, 0, 775, 776, 5, 121, 0, 0, 776, 126, 1, 0, 0, 0, 777, 778, 5, 100, 0, 0, 778, 779, 5, 101, 0, 0, 779, 780, 5, 102, 0, 0, 780, 781, 5, 97, 0, 0, 781, 782, 5, 117, 0, 0, 782, 783, 5, 108, 0, 0, 783, 784, 5, 116, 0, 0, 784, 128, 1, 0, 0, 0, 785, 786, 5, 115, 0, 0, 786, 787, 5, 111, 0, 0, 787, 788, 5, 117, 0, 0, 788, 789, 5, 114, 0, 0, 789, 790, 5, 99, 0, 0, 790, 791, 5, 101, 0, 0, 791, 130, 1, 0, 0, 0, 792, 793, 5, 114, 0, 0, 793, 794, 5, 101, 0, 0, 794, 795, 5, 112, 0, 0, 795, 796, 5, 111, 0, 0, 796, 797, 5, 115, 0, 0, 797, 798, 5, 105, 0, 0, 798, 799, 5, 116, 0, 0, 799, 800, 5, 111, 0, 0, 800, 801, 5, 114, 0, 0, 801, 802, 5, 121, 0, 0, 802, 132, 1, 0, 0, 0, 803, 804, 5, 99, 0, 0, 804, 805, 5, 111, 0, 0, 805, 806, 5, 109, 0, 0, 806, 807, 5, 109, 0, 0, 807, 808, 5, 105, 0, 0, 808, 809, 5, 116, 0, 0, 809, 134, 1, 0, 0, 0, 810, 811, 5, 114, 0, 0, 811, 812, 5, 101, 0, 0, 812, 813, 5, 118, 0, 0, 813, 814, 5, 105, 0, 0, 814, 815, 5, 115, 0, 0, 815, 816, 5, 105, 0, 0, 816, 817, 5, 111, 0, 0, 817, 818, 5, 110, 0, 0, 818, 136, 1, 0, 0, 0, 819, 820, 5, 115, 0, 0, 820, 821, 5, 101, 0, 0, 821, 822, 5, 109, 0, 0, 822, 823, 5, 97, 0, 0, 823, 824, 5, 110, 0, 0, 824, 825, 5, 116, 0, 0, 825, 826, 5, 105, 0, 0, 826, 827, 5, 99, 0, 0, 827, 828, 5, 45, 0, 0, 828, 829, 5, 109, 0, 0, 829, 830, 5, 97, 0, 0, 830, 831, 5, 106, 0, 0, 831, 832, 5, 111, 0, 0, 832, 833, 5, 114, 0, 0, 833, 138, 1, 0, 0, 0, 834, 835, 5, 111, 0, 0, 835, 836, 5, 110, 0, 0, 836, 837, 5, 45, 0, 0, 837, 838, 5, 100, 0, 0, 838, 839, 5, 101, 0, 0, 839, 840, 5, 108, 0, 0, 840, 841, 5, 101, 0, 0, 841, 842, 5, 116, 0, 0, 842, 843, 5, 101, 0, 0, 843, 140, 1, 0, 0, 0, 844, 845, 5, 114, 0, 0, 845, 846, 5, 101, 0, 0, 846, 847, 5, 116, 0, 0, 847, 848, 5, 97, 0, 0, 848, 849, 5, 105, 0, 0, 849, 850, 5, 110, 0, 0, 850, 851, 5, 45, 0, 0, 851, 852, 5, 111, 0, 0, 852, 853, 5, 116, 0, 0, 853, 854, 5, 104, 0, 0, 854, 855, 5, 101, 0, 0, 855, 856, 5, 114, 0, 0, 856, 142, 1, 0, 0, 0, 857, 858, 5, 107, 0, 0, 858, 859, 5, 101, 0, 0, 859, 860, 5, 121, 0, 0, 860, 861, 5, 101, 0, 0, 861, 862, 5, 100, 0, 0, 862, 144, 1, 0, 0, 0, 863, 864, 5, 112, 0, 0, 864, 865, 5, 117, 0, 0, 865, 866, 5, 98, 0, 0, 866, 867, 5, 108, 0, 0, 867, 868, 5, 105, 0, 0, 868, 869, 5, 99, 0, 0, 869, 870, 5, 45, 0, 0, 870, 871, 5, 116, 0, 0, 871, 872, 5, 114, 0, 0, 872, 873, 5, 97, 0, 0, 873, 874, 5, 118, 0, 0, 874, 875, 5, 101, 0, 0, 875, 876, 5, 114, 0, 0, 876, 877, 5, 115, 0, 0, 877, 878, 5, 97, 0, 0, 878, 879, 5, 108, 0, 0, 879, 146, 1, 0, 0, 0, 880, 881, 5, 105, 0, 0, 881, 882, 5, 100, 0, 0, 882, 148, 1, 0, 0, 0, 883, 884, 5, 100, 0, 0, 884, 885, 5, 111, 0, 0, 885, 886, 5, 99, 0, 0, 886, 150, 1, 0, 0, 0, 887, 888, 5, 109, 0, 0, 888, 889, 5, 111, 0, 0, 889, 890, 5, 100, 0, 0, 890, 891, 5, 101, 0, 0, 891, 152, 1, 0, 0, 0, 892, 893, 5, 101, 0, 0, 893, 894, 5, 109, 0, 0, 894, 895, 5, 105, 0, 0, 895, 896, 5, 116, 0, 0, 896, 897, 5, 115, 0, 0, 897, 154, 1, 0, 0, 0, 898, 899, 5, 114, 0, 0, 899, 900, 5, 101, 0, 0, 900, 901, 5, 99, 0, 0, 901, 902, 5, 101, 0, 0, 902, 903, 5, 105, 0, 0, 903, 904, 5, 118, 0, 0, 904, 905, 5, 101, 0, 0, 905, 906, 5, 114, 0, 0, 906, 156, 1, 0, 0, 0, 907, 908, 5, 114, 0, 0, 908, 909, 5, 101, 0, 0, 909, 910, 5, 113, 0, 0, 910, 911, 5, 117, 0, 0, 911, 912, 5, 105, 0, 0, 912, 913, 5, 114, 0, 0, 913, 914, 5, 101, 0, 0, 914, 915, 5, 115, 0, 0, 915, 158, 1, 0, 0, 0, 916, 917, 5, 97, 0, 0, 917, 918, 5, 110, 0, 0, 918, 919, 5, 121, 0, 0, 919, 160, 1, 0, 0, 0, 920, 921, 5, 103, 0, 0, 921, 922, 5, 101, 0, 0, 922, 923, 5, 116, 0, 0, 923, 162, 1, 0, 0, 0, 924, 925, 5, 115, 0, 0, 925, 926, 5, 101, 0, 0, 926, 927, 5, 116, 0, 0, 927, 164, 1, 0, 0, 0, 928, 929, 5, 119, 0, 0, 929, 930, 5, 97, 0, 0, 930, 931, 5, 116, 0, 0, 931, 932, 5, 99, 0, 0, 932, 933, 5, 104, 0, 0, 933, 166, 1, 0, 0, 0, 934, 935, 5, 115, 0, 0, 935, 936, 5, 116, 0, 0, 936, 937, 5, 97, 0, 0, 937, 938, 5, 114, 0, 0, 938, 939, 5, 116, 0, 0, 939, 168, 1, 0, 0, 0, 940, 941, 5, 115, 0, 0, 941, 942, 5, 116, 0, 0, 942, 943, 5, 111, 0, 0, 943, 944, 5, 112, 0, 0, 944, 170, 1, 0, 0, 0, 945, 946, 5, 114, 0, 0, 946, 947, 5, 101, 0, 0, 947, 948, 5, 97, 0, 0, 948, 949, 5, 100, 0, 0, 949, 172, 1, 0, 0, 0, 950, 951, 5, 119, 0, 0, 951, 952, 5, 114, 0, 0, 952, 953, 5, 105, 0, 0, 953, 954, 5, 116, 0, 0, 954, 955, 5, 101, 0, 0, 955, 174, 1, 0, 0, 0, 956, 957, 5, 114, 0, 0, 957, 958, 5, 101, 0, 0, 958, 959, 5, 115, 0, 0, 959, 960, 5, 111, 0, 0, 960, 961, 5, 108, 0, 0, 961, 962, 5, 118, 0, 0, 962, 963, 5, 101, 0, 0, 963, 176, 1, 0, 0, 0, 964, 965, 5, 99, 0, 0, 965, 966, 5, 111, 0, 0, 966, 967, 5, 110, 0, 0, 967, 968, 5, 110, 0, 0, 968, 969, 5, 101, 0, 0, 969, 970, 5, 99, 0, 0, 970, 971, 5, 116, 0, 0, 971, 178, 1, 0, 0, 0, 972, 973, 5, 100, 0, 0, 973, 974, 5, 105, 0, 0, 974, 975, 5, 115, 0, 0, 975, 976, 5, 99, 0, 0, 976, 977, 5, 111, 0, 0, 977, 978, 5, 110, 0, 0, 978, 979, 5, 110, 0, 0, 979, 980, 5, 101, 0, 0, 980, 981, 5, 99, 0, 0, 981, 982, 5, 116, 0, 0, 982, 180, 1, 0, 0, 0, 983, 984, 5, 99, 0, 0, 984, 985, 5, 97, 0, 0, 985, 986, 5, 108, 0, 0, 986, 987, 5, 108, 0, 0, 987, 182, 1, 0, 0, 0, 988, 989, 5, 119, 0, 0, 989, 990, 5, 97, 0, 0, 990, 991, 5, 116, 0, 0, 991, 992, 5, 99, 0, 0, 992, 993, 5, 104, 0, 0, 993, 994, 5, 45, 0, 0, 994, 995, 5, 115, 0, 0, 995, 996, 5, 116, 0, 0, 996, 997, 5, 97, 0, 0, 997, 998, 5, 114, 0, 0, 998, 999, 5, 116, 0, 0, 999, 184, 1, 0, 0, 0, 1000, 1001, 5, 119, 0, 0, 1001, 1002, 5, 97, 0, 0, 1002, 1003, 5, 116, 0, 0, 1003, 1004, 5, 99, 0, 0, 1004, 1005, 5, 104, 0, 0, 1005, 1006, 5, 45, 0, 0, 1006, 1007, 5, 115, 0, 0, 1007, 1008, 5, 116, 0, 0, 1008, 1009, 5, 111, 0, 0, 1009, 1010, 5, 112, 0, 0, 1010, 186, 1, 0, 0, 0, 1011, 1012, 5, 115, 0, 0, 1012, 1013, 5, 117, 0, 0, 1013, 1014, 5, 98, 0, 0, 1014, 1015, 5, 115, 0, 0, 1015, 1016, 5, 99, 0, 0, 1016, 1017, 5, 114, 0, 0, 1017, 1018, 5, 105, 0, 0, 1018, 1019, 5, 98, 0, 0, 1019, 1020, 5, 101, 0, 0, 1020, 188, 1, 0, 0, 0, 1021, 1022, 5, 117, 0, 0, 1022, 1023, 5, 110, 0, 0, 1023, 1024, 5, 115, 0, 0, 1024, 1025, 5, 117, 0, 0, 1025, 1026, 5, 98, 0, 0, 1026, 1027, 5, 115, 0, 0, 1027, 1028, 5, 99, 0, 0, 1028, 1029, 5, 114, 0, 0, 1029, 1030, 5, 105, 0, 0, 1030, 1031, 5, 98, 0, 0, 1031, 1032, 5, 101, 0, 0, 1032, 190, 1, 0, 0, 0, 1033, 1034, 5, 111, 0, 0, 1034, 1035, 5, 112, 0, 0, 1035, 1036, 5, 116, 0, 0, 1036, 1037, 5, 105, 0, 0, 1037, 1038, 5, 109, 0, 0, 1038, 1039, 5, 105, 0, 0, 1039, 1040, 5, 115, 0, 0, 1040, 1041, 5, 116, 0, 0, 1041, 1042, 5, 105, 0, 0, 1042, 1043, 5, 99, 0, 0, 1043, 1044, 5, 45, 0, 0, 1044, 1045, 5, 114, 0, 0, 1045, 1046, 5, 101, 0, 0, 1046, 1047, 5, 103, 0, 0, 1047, 1048, 5, 105, 0, 0, 1048, 1049, 5, 115, 0, 0, 1049, 1050, 5, 116, 0, 0, 1050, 1051, 5, 101, 0, 0, 1051, 1052, 5, 114, 0, 0, 1052, 192, 1, 0, 0, 0, 1053, 1054, 5, 99, 0, 0, 1054, 1055, 5, 114, 0, 0, 1055, 1056, 5, 100, 0, 0, 1056, 1057, 5, 116, 0, 0, 1057, 194, 1, 0, 0, 0, 1058, 1059, 5, 111, 0, 0, 1059, 1060, 5, 112, 0, 0, 1060, 1061, 5, 116, 0, 0, 1061, 1062, 5, 105, 0, 0, 1062, 1063, 5, 111, 0, 0, 1063, 1064, 5, 110, 0, 0, 1064, 1065, 5, 97, 0, 0, 1065, 1066, 5, 108, 0, 0, 1066, 1067, 5, 45, 0, 0, 1067, 1068, 5, 111, 0, 0, 1068, 1069, 5, 110, 0, 0, 1069, 1070, 5, 101, 0, 0, 1070, 196, 1, 0, 0, 0, 1071, 1072, 5, 101, 0, 0, 1072, 1073, 5, 120, 0, 0, 1073, 1074, 5, 97, 0, 0, 1074, 1075, 5, 99, 0, 0, 1075, 1076, 5, 116, 0, 0, 1076, 1077, 5, 108, 0, 0, 1077, 1078, 5, 121, 0, 0, 1078, 1079, 5, 45, 0, 0, 1079, 1080, 5, 111, 0, 0, 1080, 1081, 5, 110, 0, 0, 1081, 1082, 5, 101, 0, 0, 1082, 198, 1, 0, 0, 0, 1083, 1084, 5, 109, 0, 0, 1084, 1085, 5, 97, 0, 0, 1085, 1086, 5, 110, 0, 0, 1086, 1087, 5, 121, 0, 0, 1087, 1088, 5, 45, 0, 0, 1088, 1089, 5, 117, 0, 0, 1089, 1090, 5, 110, 0, 0, 1090, 1091, 5, 105, 0, 0, 1091, 1092, 5, 113, 0, 0, 1092, 1093, 5, 117, 0, 0, 1093, 1094, 5, 101, 0, 0, 1094, 200, 1, 0, 0, 0, 1095, 1096, 5, 109, 0, 0, 1096, 1097, 5, 97, 0, 0, 1097, 1098, 5, 110, 0, 0, 1098, 1099, 5, 121, 0, 0, 1099, 202, 1, 0, 0, 0, 1100, 1101, 5, 111, 0, 0, 1101, 1102, 5, 114, 0, 0, 1102, 1103, 5, 100, 0, 0, 1103, 1104, 5, 101, 0, 0, 1104, 1105, 5, 114, 0, 0, 1105, 1106, 5, 101, 0, 0, 1106, 1107, 5, 100, 0, 0, 1107, 204, 1, 0, 0, 0, 1108, 1109, 5, 117, 0, 0, 1109, 1110, 5, 110, 0, 0, 1110, 1111, 5, 105, 0, 0, 1111, 1112, 5, 116, 0, 0, 1112, 206, 1, 0, 0, 0, 1113, 1114, 5, 119, 0, 0, 1114, 1115, 5, 97, 0, 0, 1115, 1116, 5, 116, 0, 0, 1116, 1117, 5, 99, 0, 0, 1117, 1118, 5, 104, 0, 0, 1118, 1119, 5, 45, 0, 0, 1119, 1120, 5, 104, 0, 0, 1120, 1121, 5, 97, 0, 0, 1121, 1122, 5, 110, 0, 0, 1122, 1123, 5, 100, 0, 0, 1123, 1124, 5, 108, 0, 0, 1124, 1125, 5, 101, 0, 0, 1125, 208, 1, 0, 0, 0, 1126, 1127, 5, 109, 0, 0, 1127, 1128, 5, 101, 0, 0, 1128, 1129, 5, 115, 0, 0, 1129, 1130, 5, 115, 0, 0, 1130, 1131, 5, 97, 0, 0, 1131, 1132, 5, 103, 0, 0, 1132, 1133, 5, 101, 0, 0, 1133, 210, 1, 0, 0, 0, 1134, 1135, 5, 97, 0, 0, 1135, 1136, 5, 116, 0, 0, 1136, 1137, 5, 111, 0, 0, 1137, 1138, 5, 109, 0, 0, 1138, 1139, 5, 45, 0, 0, 1139, 1140, 5, 114, 0, 0, 1140, 1141, 5, 101, 0, 0, 1141, 1142, 5, 102, 0, 0, 1142, 212, 1, 0, 0, 0, 1143, 1144, 5, 105, 0, 0, 1144, 1145, 5, 110, 0, 0, 1145, 1146, 5, 116, 0, 0, 1146, 1147, 5, 101, 0, 0, 1147, 1148, 5, 114, 0, 0, 1148, 1149, 5, 102, 0, 0, 1149, 1150, 5, 97, 0, 0, 1150, 1151, 5, 99, 0, 0, 1151, 1152, 5, 101, 0, 0, 1152, 1153, 5, 45, 0, 0, 1153, 1154, 5, 114, 0, 0, 1154, 1155, 5, 101, 0, 0, 1155, 1156, 5, 102, 0, 0, 1156, 214, 1, 0, 0, 0, 1157, 1158, 5, 111, 0, 0, 1158, 1159, 5, 112, 0, 0, 1159, 1160, 5, 116, 0, 0, 1160, 1161, 5, 105, 0, 0, 1161, 1162, 5, 111, 0, 0, 1162, 1163, 5, 110, 0, 0, 1163, 1164, 5, 97, 0, 0, 1164, 1165, 5, 108, 0, 0, 1165, 216, 1, 0, 0, 0, 1166, 1167, 5, 108, 0, 0, 1167, 1168, 5, 105, 0, 0, 1168, 1169, 5, 115, 0, 0, 1169, 1170, 5, 116, 0, 0, 1170, 218, 1, 0, 0, 0, 1171, 1172, 5, 114, 0, 0, 1172, 1173, 5, 101, 0, 0, 1173, 1174, 5, 99, 0, 0, 1174, 1175, 5, 111, 0, 0, 1175, 1176, 5, 114, 0, 0, 1176, 1177, 5, 100, 0, 0, 1177, 220, 1, 0, 0, 0, 1178, 1179, 5, 98, 0, 0, 1179, 1180, 5, 111, 0, 0, 1180, 1181, 5, 111, 0, 0, 1181, 1182, 5, 108, 0, 0, 1182, 222, 1, 0, 0, 0, 1183, 1184, 5, 98, 0, 0, 1184, 1185, 5, 121, 0, 0, 1185, 1186, 5, 116, 0, 0, 1186, 1187, 5, 101, 0, 0, 1187, 1188, 5, 115, 0, 0, 1188, 224, 1, 0, 0, 0, 1189, 1190, 5, 100, 0, 0, 1190, 1191, 5, 111, 0, 0, 1191, 1192, 5, 117, 0, 0, 1192, 1193, 5, 98, 0, 0, 1193, 1194, 5, 108, 0, 0, 1194, 1195, 5, 101, 0, 0, 1195, 226, 1, 0, 0, 0, 1196, 1197, 5, 105, 0, 0, 1197, 1198, 5, 110, 0, 0, 1198, 1199, 5, 116, 0, 0, 1199, 1200, 5, 51, 0, 0, 1200, 1201, 5, 50, 0, 0, 1201, 228, 1, 0, 0, 0, 1202, 1203, 5, 105, 0, 0, 1203, 1204, 5, 110, 0, 0, 1204, 1205, 5, 116, 0, 0, 1205, 1206, 5, 54, 0, 0, 1206, 1207, 5, 52, 0, 0, 1207, 230, 1, 0, 0, 0, 1208, 1209, 5, 115, 0, 0, 1209, 1210, 5, 116, 0, 0, 1210, 1211, 5, 114, 0, 0, 1211, 1212, 5, 105, 0, 0, 1212, 1213, 5, 110, 0, 0, 1213, 1214, 5, 103, 0, 0, 1214, 232, 1, 0, 0, 0, 1215, 1216, 5, 117, 0, 0, 1216, 1217, 5, 105, 0, 0, 1217, 1218, 5, 110, 0, 0, 1218, 1219, 5, 116, 0, 0, 1219, 1220, 5, 51, 0, 0, 1220, 1221, 5, 50, 0, 0, 1221, 234, 1, 0, 0, 0, 1222, 1223, 5, 117, 0, 0, 1223, 1224, 5, 105, 0, 0, 1224, 1225, 5, 110, 0, 0, 1225, 1226, 5, 116, 0, 0, 1226, 1227, 5, 54, 0, 0, 1227, 1228, 5, 52, 0, 0, 1228, 236, 1, 0, 0, 0, 1229, 1230, 5, 116, 0, 0, 1230, 1231, 5, 114, 0, 0, 1231, 1232, 5, 117, 0, 0, 1232, 1233, 5, 101, 0, 0, 1233, 238, 1, 0, 0, 0, 1234, 1235, 5, 102, 0, 0, 1235, 1236, 5, 97, 0, 0, 1236, 1237, 5, 108, 0, 0, 1237, 1238, 5, 115, 0, 0, 1238, 1239, 5, 101, 0, 0, 1239, 240, 1, 0, 0, 0, 1240, 1241, 5, 110, 0, 0, 1241, 1242, 5, 117, 0, 0, 1242, 1243, 5, 108, 0, 0, 1243, 1244, 5, 108, 0, 0, 1244, 242, 1, 0, 0, 0, 1245, 1246, 5, 45, 0, 0, 1246, 1247, 5, 62, 0, 0, 1247, 244, 1, 0, 0, 0, 1248, 1249, 5, 58, 0, 0, 1249, 246, 1, 0, 0, 0, 1250, 1251, 5, 59, 0, 0, 1251, 248, 1, 0, 0, 0, 1252, 1253, 5, 44, 0, 0, 1253, 250, 1, 0, 0, 0, 1254, 1255, 5, 46, 0, 0, 1255, 252, 1, 0, 0, 0, 1256, 1257, 5, 123, 0, 0, 1257, 254, 1, 0, 0, 0, 1258, 1259, 5, 125, 0, 0, 1259, 256, 1, 0, 0, 0, 1260, 1261, 5, 91, 0, 0, 1261, 258, 1, 0, 0, 0, 1262, 1263, 5, 93, 0, 0, 1263, 260, 1, 0, 0, 0, 1264, 1265, 5, 40, 0, 0, 1265, 262, 1, 0, 0, 0, 1266, 1267, 5, 41, 0, 0, 1267, 264, 1, 0, 0, 0, 1268, 1269, 5, 60, 0, 0, 1269, 266, 1, 0, 0, 0, 1270, 1271, 5, 62, 0, 0, 1271, 268, 1, 0, 0, 0, 1272, 1273, 5, 38, 0, 0, 1273, 270, 1, 0, 0, 0, 1274, 1275, 5, 61, 0, 0, 1275, 272, 1, 0, 0, 0, 1276, 1278, 5, 45, 0, 0, 1277, 1276, 1, 0, 0, 0, 1277, 1278, 1, 0, 0, 0, 1278, 1280, 1, 0, 0, 0, 1279, 1281, 7, 0, 0, 0, 1280, 1279, 1, 0, 0, 0, 1281, 1282, 1, 0, 0, 0, 1282, 1280, 1, 0, 0, 0, 1282, 1283, 1, 0, 0, 0, 1283, 274, 1, 0, 0, 0, 1284, 1286, 5, 45, 0, 0, 1285, 1284, 1, 0, 0, 0, 1285, 1286, 1, 0, 0, 0, 1286, 1295, 1, 0, 0, 0, 1287, 1296, 5, 48, 0, 0, 1288, 1292, 7, 1, 0, 0, 1289, 1291, 7, 0, 0, 0, 1290, 1289, 1, 0, 0, 0, 1291, 1294, 1, 0, 0, 0, 1292, 1290, 1, 0, 0, 0, 1292, 1293, 1, 0, 0, 0, 1293, 1296, 1, 0, 0, 0, 1294, 1292, 1, 0, 0, 0, 1295, 1287, 1, 0, 0, 0, 1295, 1288, 1, 0, 0, 0, 1296, 1303, 1, 0, 0, 0, 1297, 1299, 5, 46, 0, 0, 1298, 1300, 7, 0, 0, 0, 1299, 1298, 1, 0, 0, 0, 1300, 1301, 1, 0, 0, 0, 1301, 1299, 1, 0, 0, 0, 1301, 1302, 1, 0, 0, 0, 1302, 1304, 1, 0, 0, 0, 1303, 1297, 1, 0, 0, 0, 1303, 1304, 1, 0, 0, 0, 1304, 1314, 1, 0, 0, 0, 1305, 1307, 7, 2, 0, 0, 1306, 1308, 7, 3, 0, 0, 1307, 1306, 1, 0, 0, 0, 1307, 1308, 1, 0, 0, 0, 1308, 1310, 1, 0, 0, 0, 1309, 1311, 7, 0, 0, 0, 1310, 1309, 1, 0, 0, 0, 1311, 1312, 1, 0, 0, 0, 1312, 1310, 1, 0, 0, 0, 1312, 1313, 1, 0, 0, 0, 1313, 1315, 1, 0, 0, 0, 1314, 1305, 1, 0, 0, 0, 1314, 1315, 1, 0, 0, 0, 1315, 276, 1, 0, 0, 0, 1316, 1320, 7, 4, 0, 0, 1317, 1319, 7, 5, 0, 0, 1318, 1317, 1, 0, 0, 0, 1319, 1322, 1, 0, 0, 0, 1320, 1318, 1, 0, 0, 0, 1320, 1321, 1, 0, 0, 0, 1321, 278, 1, 0, 0, 0, 1322, 1320, 1, 0, 0, 0, 1323, 1328, 5, 34, 0, 0, 1324, 1327, 3, 281, 140, 0, 1325, 1327, 8, 6, 0, 0, 1326, 1324, 1, 0, 0, 0, 1326, 1325, 1, 0, 0, 0, 1327, 1330, 1, 0, 0, 0, 1328, 1326, 1, 0, 0, 0, 1328, 1329, 1, 0, 0, 0, 1329, 1331, 1, 0, 0, 0, 1330, 1328, 1, 0, 0, 0, 1331, 1332, 5, 34, 0, 0, 1332, 280, 1, 0, 0, 0, 1333, 1341, 5, 92, 0, 0, 1334, 1342, 7, 7, 0, 0, 1335, 1336, 5, 117, 0, 0, 1336, 1337, 3, 283, 141, 0, 1337, 1338, 3, 283, 141, 0, 1338, 1339, 3, 283, 141, 0, 1339, 1340, 3, 283, 141, 0, 1340, 1342, 1, 0, 0, 0, 1341, 1334, 1, 0, 0, 0, 1341, 1335, 1, 0, 0, 0, 1342, 282, 1, 0, 0, 0, 1343, 1344, 7, 8, 0, 0, 1344, 284, 1, 0, 0, 0, 1345, 1346, 5, 47, 0, 0, 1346, 1347, 5, 47, 0, 0, 1347, 1351, 1, 0, 0, 0, 1348, 1350, 8, 9, 0, 0, 1349, 1348, 1, 0, 0, 0, 1350, 1353, 1, 0, 0, 0, 1351, 1349, 1, 0, 0, 0, 1351, 1352, 1, 0, 0, 0, 1352, 1354, 1, 0, 0, 0, 1353, 1351, 1, 0, 0, 0, 1354, 1355, 6, 142, 0, 0, 1355, 286, 1, 0, 0, 0, 1356, 1357, 5, 47, 0, 0, 1357, 1358, 5, 42, 0, 0, 1358, 1362, 1, 0, 0, 0, 1359, 1361, 9, 0, 0, 0, 1360, 1359, 1, 0, 0, 0, 1361, 1364, 1, 0, 0, 0, 1362, 1363, 1, 0, 0, 0, 1362, 1360, 1, 0, 0, 0, 1363, 1365, 1, 0, 0, 0, 1364, 1362, 1, 0, 0, 0, 1365, 1366, 5, 42, 0, 0, 1366, 1367, 5, 47, 0, 0, 1367, 1368, 1, 0, 0, 0, 1368, 1369, 6, 143, 0, 0, 1369, 288, 1, 0, 0, 0, 1370, 1372, 7, 10, 0, 0, 1371, 1370, 1, 0, 0, 0, 1372, 1373, 1, 0, 0, 0, 1373, 1371, 1, 0, 0, 0, 1373, 1374, 1, 0, 0, 0, 1374, 1375, 1, 0, 0, 0, 1375, 1376, 6, 144, 0, 0, 1376, 290, 1, 0, 0, 0, 18, 0, 1277, 1282, 1285, 1292, 1295, 1301, 1303, 1307, 1312, 1314, 1320, 1326, 1328, 1341, 1351, 1362, 1373, 1, 0, 1, 0] \ No newline at end of file +[4, 0, 145, 1390, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 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, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 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, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 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, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 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, 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, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 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, 27, 1, 27, 1, 27, 1, 27, 1, 27, 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, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 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, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 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, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 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, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 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, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 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, 45, 1, 45, 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, 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, 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, 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, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 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, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 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, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 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, 67, 1, 67, 1, 67, 1, 67, 1, 67, 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, 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, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 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, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 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, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 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, 85, 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, 89, 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, 91, 1, 91, 1, 91, 1, 91, 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, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 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, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 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, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 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, 99, 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, 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, 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, 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, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 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, 3, 138, 1291, 8, 138, 1, 138, 4, 138, 1294, 8, 138, 11, 138, 12, 138, 1295, 1, 139, 3, 139, 1299, 8, 139, 1, 139, 1, 139, 1, 139, 5, 139, 1304, 8, 139, 10, 139, 12, 139, 1307, 9, 139, 3, 139, 1309, 8, 139, 1, 139, 1, 139, 4, 139, 1313, 8, 139, 11, 139, 12, 139, 1314, 3, 139, 1317, 8, 139, 1, 139, 1, 139, 3, 139, 1321, 8, 139, 1, 139, 4, 139, 1324, 8, 139, 11, 139, 12, 139, 1325, 3, 139, 1328, 8, 139, 1, 140, 1, 140, 5, 140, 1332, 8, 140, 10, 140, 12, 140, 1335, 9, 140, 1, 141, 1, 141, 1, 141, 5, 141, 1340, 8, 141, 10, 141, 12, 141, 1343, 9, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 3, 142, 1355, 8, 142, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 5, 144, 1363, 8, 144, 10, 144, 12, 144, 1366, 9, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 5, 145, 1374, 8, 145, 10, 145, 12, 145, 1377, 9, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 4, 146, 1385, 8, 146, 11, 146, 12, 146, 1386, 1, 146, 1, 146, 1, 1375, 0, 147, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 0, 287, 0, 289, 143, 291, 144, 293, 145, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1404, 0, 1, 1, 0, 0, 0, 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, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 1, 0, 0, 0, 0, 289, 1, 0, 0, 0, 0, 291, 1, 0, 0, 0, 0, 293, 1, 0, 0, 0, 1, 295, 1, 0, 0, 0, 3, 304, 1, 0, 0, 0, 5, 315, 1, 0, 0, 0, 7, 325, 1, 0, 0, 0, 9, 335, 1, 0, 0, 0, 11, 344, 1, 0, 0, 0, 13, 356, 1, 0, 0, 0, 15, 363, 1, 0, 0, 0, 17, 371, 1, 0, 0, 0, 19, 380, 1, 0, 0, 0, 21, 388, 1, 0, 0, 0, 23, 394, 1, 0, 0, 0, 25, 399, 1, 0, 0, 0, 27, 412, 1, 0, 0, 0, 29, 422, 1, 0, 0, 0, 31, 434, 1, 0, 0, 0, 33, 440, 1, 0, 0, 0, 35, 451, 1, 0, 0, 0, 37, 462, 1, 0, 0, 0, 39, 467, 1, 0, 0, 0, 41, 476, 1, 0, 0, 0, 43, 486, 1, 0, 0, 0, 45, 491, 1, 0, 0, 0, 47, 495, 1, 0, 0, 0, 49, 501, 1, 0, 0, 0, 51, 506, 1, 0, 0, 0, 53, 516, 1, 0, 0, 0, 55, 520, 1, 0, 0, 0, 57, 533, 1, 0, 0, 0, 59, 538, 1, 0, 0, 0, 61, 545, 1, 0, 0, 0, 63, 554, 1, 0, 0, 0, 65, 565, 1, 0, 0, 0, 67, 569, 1, 0, 0, 0, 69, 578, 1, 0, 0, 0, 71, 585, 1, 0, 0, 0, 73, 594, 1, 0, 0, 0, 75, 599, 1, 0, 0, 0, 77, 609, 1, 0, 0, 0, 79, 620, 1, 0, 0, 0, 81, 628, 1, 0, 0, 0, 83, 634, 1, 0, 0, 0, 85, 643, 1, 0, 0, 0, 87, 653, 1, 0, 0, 0, 89, 662, 1, 0, 0, 0, 91, 674, 1, 0, 0, 0, 93, 685, 1, 0, 0, 0, 95, 691, 1, 0, 0, 0, 97, 699, 1, 0, 0, 0, 99, 702, 1, 0, 0, 0, 101, 707, 1, 0, 0, 0, 103, 714, 1, 0, 0, 0, 105, 717, 1, 0, 0, 0, 107, 725, 1, 0, 0, 0, 109, 732, 1, 0, 0, 0, 111, 738, 1, 0, 0, 0, 113, 743, 1, 0, 0, 0, 115, 754, 1, 0, 0, 0, 117, 759, 1, 0, 0, 0, 119, 765, 1, 0, 0, 0, 121, 769, 1, 0, 0, 0, 123, 781, 1, 0, 0, 0, 125, 784, 1, 0, 0, 0, 127, 791, 1, 0, 0, 0, 129, 794, 1, 0, 0, 0, 131, 801, 1, 0, 0, 0, 133, 809, 1, 0, 0, 0, 135, 816, 1, 0, 0, 0, 137, 827, 1, 0, 0, 0, 139, 834, 1, 0, 0, 0, 141, 843, 1, 0, 0, 0, 143, 858, 1, 0, 0, 0, 145, 868, 1, 0, 0, 0, 147, 881, 1, 0, 0, 0, 149, 887, 1, 0, 0, 0, 151, 904, 1, 0, 0, 0, 153, 907, 1, 0, 0, 0, 155, 911, 1, 0, 0, 0, 157, 916, 1, 0, 0, 0, 159, 922, 1, 0, 0, 0, 161, 931, 1, 0, 0, 0, 163, 940, 1, 0, 0, 0, 165, 944, 1, 0, 0, 0, 167, 948, 1, 0, 0, 0, 169, 952, 1, 0, 0, 0, 171, 958, 1, 0, 0, 0, 173, 964, 1, 0, 0, 0, 175, 969, 1, 0, 0, 0, 177, 974, 1, 0, 0, 0, 179, 980, 1, 0, 0, 0, 181, 988, 1, 0, 0, 0, 183, 996, 1, 0, 0, 0, 185, 1007, 1, 0, 0, 0, 187, 1012, 1, 0, 0, 0, 189, 1024, 1, 0, 0, 0, 191, 1035, 1, 0, 0, 0, 193, 1045, 1, 0, 0, 0, 195, 1057, 1, 0, 0, 0, 197, 1066, 1, 0, 0, 0, 199, 1071, 1, 0, 0, 0, 201, 1084, 1, 0, 0, 0, 203, 1096, 1, 0, 0, 0, 205, 1108, 1, 0, 0, 0, 207, 1113, 1, 0, 0, 0, 209, 1121, 1, 0, 0, 0, 211, 1126, 1, 0, 0, 0, 213, 1139, 1, 0, 0, 0, 215, 1147, 1, 0, 0, 0, 217, 1156, 1, 0, 0, 0, 219, 1170, 1, 0, 0, 0, 221, 1179, 1, 0, 0, 0, 223, 1184, 1, 0, 0, 0, 225, 1191, 1, 0, 0, 0, 227, 1196, 1, 0, 0, 0, 229, 1202, 1, 0, 0, 0, 231, 1209, 1, 0, 0, 0, 233, 1215, 1, 0, 0, 0, 235, 1221, 1, 0, 0, 0, 237, 1228, 1, 0, 0, 0, 239, 1235, 1, 0, 0, 0, 241, 1242, 1, 0, 0, 0, 243, 1247, 1, 0, 0, 0, 245, 1253, 1, 0, 0, 0, 247, 1258, 1, 0, 0, 0, 249, 1261, 1, 0, 0, 0, 251, 1263, 1, 0, 0, 0, 253, 1265, 1, 0, 0, 0, 255, 1267, 1, 0, 0, 0, 257, 1269, 1, 0, 0, 0, 259, 1271, 1, 0, 0, 0, 261, 1273, 1, 0, 0, 0, 263, 1275, 1, 0, 0, 0, 265, 1277, 1, 0, 0, 0, 267, 1279, 1, 0, 0, 0, 269, 1281, 1, 0, 0, 0, 271, 1283, 1, 0, 0, 0, 273, 1285, 1, 0, 0, 0, 275, 1287, 1, 0, 0, 0, 277, 1290, 1, 0, 0, 0, 279, 1298, 1, 0, 0, 0, 281, 1329, 1, 0, 0, 0, 283, 1336, 1, 0, 0, 0, 285, 1346, 1, 0, 0, 0, 287, 1356, 1, 0, 0, 0, 289, 1358, 1, 0, 0, 0, 291, 1369, 1, 0, 0, 0, 293, 1384, 1, 0, 0, 0, 295, 296, 5, 99, 0, 0, 296, 297, 5, 114, 0, 0, 297, 298, 5, 101, 0, 0, 298, 299, 5, 97, 0, 0, 299, 300, 5, 116, 0, 0, 300, 301, 5, 105, 0, 0, 301, 302, 5, 111, 0, 0, 302, 303, 5, 110, 0, 0, 303, 2, 1, 0, 0, 0, 304, 305, 5, 105, 0, 0, 305, 306, 5, 110, 0, 0, 306, 307, 5, 105, 0, 0, 307, 308, 5, 116, 0, 0, 308, 309, 5, 105, 0, 0, 309, 310, 5, 97, 0, 0, 310, 311, 5, 108, 0, 0, 311, 312, 5, 105, 0, 0, 312, 313, 5, 122, 0, 0, 313, 314, 5, 101, 0, 0, 314, 4, 1, 0, 0, 0, 315, 316, 5, 119, 0, 0, 316, 317, 5, 111, 0, 0, 317, 318, 5, 114, 0, 0, 318, 319, 5, 107, 0, 0, 319, 320, 5, 115, 0, 0, 320, 321, 5, 112, 0, 0, 321, 322, 5, 97, 0, 0, 322, 323, 5, 99, 0, 0, 323, 324, 5, 101, 0, 0, 324, 6, 1, 0, 0, 0, 325, 326, 5, 101, 0, 0, 326, 327, 5, 120, 0, 0, 327, 328, 5, 101, 0, 0, 328, 329, 5, 99, 0, 0, 329, 330, 5, 117, 0, 0, 330, 331, 5, 116, 0, 0, 331, 332, 5, 105, 0, 0, 332, 333, 5, 111, 0, 0, 333, 334, 5, 110, 0, 0, 334, 8, 1, 0, 0, 0, 335, 336, 5, 115, 0, 0, 336, 337, 5, 110, 0, 0, 337, 338, 5, 97, 0, 0, 338, 339, 5, 112, 0, 0, 339, 340, 5, 115, 0, 0, 340, 341, 5, 104, 0, 0, 341, 342, 5, 111, 0, 0, 342, 343, 5, 116, 0, 0, 343, 10, 1, 0, 0, 0, 344, 345, 5, 116, 0, 0, 345, 346, 5, 114, 0, 0, 346, 347, 5, 97, 0, 0, 347, 348, 5, 110, 0, 0, 348, 349, 5, 115, 0, 0, 349, 350, 5, 97, 0, 0, 350, 351, 5, 99, 0, 0, 351, 352, 5, 116, 0, 0, 352, 353, 5, 105, 0, 0, 353, 354, 5, 111, 0, 0, 354, 355, 5, 110, 0, 0, 355, 12, 1, 0, 0, 0, 356, 357, 5, 114, 0, 0, 357, 358, 5, 101, 0, 0, 358, 359, 5, 109, 0, 0, 359, 360, 5, 111, 0, 0, 360, 361, 5, 116, 0, 0, 361, 362, 5, 101, 0, 0, 362, 14, 1, 0, 0, 0, 363, 364, 5, 116, 0, 0, 364, 365, 5, 97, 0, 0, 365, 366, 5, 114, 0, 0, 366, 367, 5, 103, 0, 0, 367, 368, 5, 101, 0, 0, 368, 369, 5, 116, 0, 0, 369, 370, 5, 115, 0, 0, 370, 16, 1, 0, 0, 0, 371, 372, 5, 112, 0, 0, 372, 373, 5, 111, 0, 0, 373, 374, 5, 114, 0, 0, 374, 375, 5, 116, 0, 0, 375, 376, 5, 97, 0, 0, 376, 377, 5, 98, 0, 0, 377, 378, 5, 108, 0, 0, 378, 379, 5, 101, 0, 0, 379, 18, 1, 0, 0, 0, 380, 381, 5, 114, 0, 0, 381, 382, 5, 101, 0, 0, 382, 383, 5, 112, 0, 0, 383, 384, 5, 108, 0, 0, 384, 385, 5, 105, 0, 0, 385, 386, 5, 99, 0, 0, 386, 387, 5, 97, 0, 0, 387, 20, 1, 0, 0, 0, 388, 389, 5, 108, 0, 0, 389, 390, 5, 111, 0, 0, 390, 391, 5, 99, 0, 0, 391, 392, 5, 97, 0, 0, 392, 393, 5, 108, 0, 0, 393, 22, 1, 0, 0, 0, 394, 395, 5, 102, 0, 0, 395, 396, 5, 114, 0, 0, 396, 397, 5, 111, 0, 0, 397, 398, 5, 109, 0, 0, 398, 24, 1, 0, 0, 0, 399, 400, 5, 114, 0, 0, 400, 401, 5, 101, 0, 0, 401, 402, 5, 115, 0, 0, 402, 403, 5, 117, 0, 0, 403, 404, 5, 108, 0, 0, 404, 405, 5, 116, 0, 0, 405, 406, 5, 45, 0, 0, 406, 407, 5, 98, 0, 0, 407, 408, 5, 121, 0, 0, 408, 409, 5, 116, 0, 0, 409, 410, 5, 101, 0, 0, 410, 411, 5, 115, 0, 0, 411, 26, 1, 0, 0, 0, 412, 413, 5, 114, 0, 0, 413, 414, 5, 112, 0, 0, 414, 415, 5, 99, 0, 0, 415, 416, 5, 45, 0, 0, 416, 417, 5, 99, 0, 0, 417, 418, 5, 97, 0, 0, 418, 419, 5, 108, 0, 0, 419, 420, 5, 108, 0, 0, 420, 421, 5, 115, 0, 0, 421, 28, 1, 0, 0, 0, 422, 423, 5, 100, 0, 0, 423, 424, 5, 101, 0, 0, 424, 425, 5, 97, 0, 0, 425, 426, 5, 100, 0, 0, 426, 427, 5, 108, 0, 0, 427, 428, 5, 105, 0, 0, 428, 429, 5, 110, 0, 0, 429, 430, 5, 101, 0, 0, 430, 431, 5, 45, 0, 0, 431, 432, 5, 109, 0, 0, 432, 433, 5, 115, 0, 0, 433, 30, 1, 0, 0, 0, 434, 435, 5, 113, 0, 0, 435, 436, 5, 117, 0, 0, 436, 437, 5, 101, 0, 0, 437, 438, 5, 114, 0, 0, 438, 439, 5, 121, 0, 0, 439, 32, 1, 0, 0, 0, 440, 441, 5, 114, 0, 0, 441, 442, 5, 101, 0, 0, 442, 443, 5, 102, 0, 0, 443, 444, 5, 108, 0, 0, 444, 445, 5, 101, 0, 0, 445, 446, 5, 99, 0, 0, 446, 447, 5, 116, 0, 0, 447, 448, 5, 105, 0, 0, 448, 449, 5, 111, 0, 0, 449, 450, 5, 110, 0, 0, 450, 34, 1, 0, 0, 0, 451, 452, 5, 115, 0, 0, 452, 453, 5, 112, 0, 0, 453, 454, 5, 101, 0, 0, 454, 455, 5, 99, 0, 0, 455, 456, 5, 105, 0, 0, 456, 457, 5, 97, 0, 0, 457, 458, 5, 108, 0, 0, 458, 459, 5, 105, 0, 0, 459, 460, 5, 122, 0, 0, 460, 461, 5, 101, 0, 0, 461, 36, 1, 0, 0, 0, 462, 463, 5, 114, 0, 0, 463, 464, 5, 111, 0, 0, 464, 465, 5, 111, 0, 0, 465, 466, 5, 116, 0, 0, 466, 38, 1, 0, 0, 0, 467, 468, 5, 100, 0, 0, 468, 469, 5, 111, 0, 0, 469, 470, 5, 99, 0, 0, 470, 471, 5, 117, 0, 0, 471, 472, 5, 109, 0, 0, 472, 473, 5, 101, 0, 0, 473, 474, 5, 110, 0, 0, 474, 475, 5, 116, 0, 0, 475, 40, 1, 0, 0, 0, 476, 477, 5, 102, 0, 0, 477, 478, 5, 114, 0, 0, 478, 479, 5, 97, 0, 0, 479, 480, 5, 103, 0, 0, 480, 481, 5, 109, 0, 0, 481, 482, 5, 101, 0, 0, 482, 483, 5, 110, 0, 0, 483, 484, 5, 116, 0, 0, 484, 485, 5, 115, 0, 0, 485, 42, 1, 0, 0, 0, 486, 487, 5, 118, 0, 0, 487, 488, 5, 105, 0, 0, 488, 489, 5, 101, 0, 0, 489, 490, 5, 119, 0, 0, 490, 44, 1, 0, 0, 0, 491, 492, 5, 109, 0, 0, 492, 493, 5, 97, 0, 0, 493, 494, 5, 120, 0, 0, 494, 46, 1, 0, 0, 0, 495, 496, 5, 97, 0, 0, 496, 497, 5, 108, 0, 0, 497, 498, 5, 108, 0, 0, 498, 499, 5, 111, 0, 0, 499, 500, 5, 119, 0, 0, 500, 48, 1, 0, 0, 0, 501, 502, 5, 112, 0, 0, 502, 503, 5, 111, 0, 0, 503, 504, 5, 108, 0, 0, 504, 505, 5, 108, 0, 0, 505, 50, 1, 0, 0, 0, 506, 507, 5, 113, 0, 0, 507, 508, 5, 117, 0, 0, 508, 509, 5, 101, 0, 0, 509, 510, 5, 114, 0, 0, 510, 511, 5, 121, 0, 0, 511, 512, 5, 97, 0, 0, 512, 513, 5, 98, 0, 0, 513, 514, 5, 108, 0, 0, 514, 515, 5, 101, 0, 0, 515, 52, 1, 0, 0, 0, 516, 517, 5, 114, 0, 0, 517, 518, 5, 112, 0, 0, 518, 519, 5, 99, 0, 0, 519, 54, 1, 0, 0, 0, 520, 521, 5, 113, 0, 0, 521, 522, 5, 117, 0, 0, 522, 523, 5, 101, 0, 0, 523, 524, 5, 114, 0, 0, 524, 525, 5, 121, 0, 0, 525, 526, 5, 45, 0, 0, 526, 527, 5, 114, 0, 0, 527, 528, 5, 101, 0, 0, 528, 529, 5, 97, 0, 0, 529, 530, 5, 115, 0, 0, 530, 531, 5, 111, 0, 0, 531, 532, 5, 110, 0, 0, 532, 56, 1, 0, 0, 0, 533, 534, 5, 116, 0, 0, 534, 535, 5, 121, 0, 0, 535, 536, 5, 112, 0, 0, 536, 537, 5, 101, 0, 0, 537, 58, 1, 0, 0, 0, 538, 539, 5, 111, 0, 0, 539, 540, 5, 98, 0, 0, 540, 541, 5, 106, 0, 0, 541, 542, 5, 101, 0, 0, 542, 543, 5, 99, 0, 0, 543, 544, 5, 116, 0, 0, 544, 60, 1, 0, 0, 0, 545, 546, 5, 115, 0, 0, 546, 547, 5, 116, 0, 0, 547, 548, 5, 111, 0, 0, 548, 549, 5, 114, 0, 0, 549, 550, 5, 97, 0, 0, 550, 551, 5, 98, 0, 0, 551, 552, 5, 108, 0, 0, 552, 553, 5, 101, 0, 0, 553, 62, 1, 0, 0, 0, 554, 555, 5, 105, 0, 0, 555, 556, 5, 109, 0, 0, 556, 557, 5, 112, 0, 0, 557, 558, 5, 108, 0, 0, 558, 559, 5, 101, 0, 0, 559, 560, 5, 109, 0, 0, 560, 561, 5, 101, 0, 0, 561, 562, 5, 110, 0, 0, 562, 563, 5, 116, 0, 0, 563, 564, 5, 115, 0, 0, 564, 64, 1, 0, 0, 0, 565, 566, 5, 114, 0, 0, 566, 567, 5, 101, 0, 0, 567, 568, 5, 102, 0, 0, 568, 66, 1, 0, 0, 0, 569, 570, 5, 102, 0, 0, 570, 571, 5, 114, 0, 0, 571, 572, 5, 97, 0, 0, 572, 573, 5, 103, 0, 0, 573, 574, 5, 109, 0, 0, 574, 575, 5, 101, 0, 0, 575, 576, 5, 110, 0, 0, 576, 577, 5, 116, 0, 0, 577, 68, 1, 0, 0, 0, 578, 579, 5, 105, 0, 0, 579, 580, 5, 109, 0, 0, 580, 581, 5, 112, 0, 0, 581, 582, 5, 111, 0, 0, 582, 583, 5, 114, 0, 0, 583, 584, 5, 116, 0, 0, 584, 70, 1, 0, 0, 0, 585, 586, 5, 101, 0, 0, 586, 587, 5, 120, 0, 0, 587, 588, 5, 116, 0, 0, 588, 589, 5, 101, 0, 0, 589, 590, 5, 114, 0, 0, 590, 591, 5, 110, 0, 0, 591, 592, 5, 97, 0, 0, 592, 593, 5, 108, 0, 0, 593, 72, 1, 0, 0, 0, 594, 595, 5, 97, 0, 0, 595, 596, 5, 116, 0, 0, 596, 597, 5, 111, 0, 0, 597, 598, 5, 109, 0, 0, 598, 74, 1, 0, 0, 0, 599, 600, 5, 105, 0, 0, 600, 601, 5, 110, 0, 0, 601, 602, 5, 116, 0, 0, 602, 603, 5, 101, 0, 0, 603, 604, 5, 114, 0, 0, 604, 605, 5, 102, 0, 0, 605, 606, 5, 97, 0, 0, 606, 607, 5, 99, 0, 0, 607, 608, 5, 101, 0, 0, 608, 76, 1, 0, 0, 0, 609, 610, 5, 105, 0, 0, 610, 611, 5, 110, 0, 0, 611, 612, 5, 116, 0, 0, 612, 613, 5, 101, 0, 0, 613, 614, 5, 114, 0, 0, 614, 615, 5, 102, 0, 0, 615, 616, 5, 97, 0, 0, 616, 617, 5, 99, 0, 0, 617, 618, 5, 101, 0, 0, 618, 619, 5, 115, 0, 0, 619, 78, 1, 0, 0, 0, 620, 621, 5, 112, 0, 0, 621, 622, 5, 97, 0, 0, 622, 623, 5, 99, 0, 0, 623, 624, 5, 107, 0, 0, 624, 625, 5, 97, 0, 0, 625, 626, 5, 103, 0, 0, 626, 627, 5, 101, 0, 0, 627, 80, 1, 0, 0, 0, 628, 629, 5, 118, 0, 0, 629, 630, 5, 97, 0, 0, 630, 631, 5, 108, 0, 0, 631, 632, 5, 117, 0, 0, 632, 633, 5, 101, 0, 0, 633, 82, 1, 0, 0, 0, 634, 635, 5, 114, 0, 0, 635, 636, 5, 101, 0, 0, 636, 637, 5, 108, 0, 0, 637, 638, 5, 97, 0, 0, 638, 639, 5, 116, 0, 0, 639, 640, 5, 105, 0, 0, 640, 641, 5, 111, 0, 0, 641, 642, 5, 110, 0, 0, 642, 84, 1, 0, 0, 0, 643, 644, 5, 111, 0, 0, 644, 645, 5, 112, 0, 0, 645, 646, 5, 101, 0, 0, 646, 647, 5, 114, 0, 0, 647, 648, 5, 97, 0, 0, 648, 649, 5, 116, 0, 0, 649, 650, 5, 105, 0, 0, 650, 651, 5, 111, 0, 0, 651, 652, 5, 110, 0, 0, 652, 86, 1, 0, 0, 0, 653, 654, 5, 102, 0, 0, 654, 655, 5, 117, 0, 0, 655, 656, 5, 110, 0, 0, 656, 657, 5, 99, 0, 0, 657, 658, 5, 116, 0, 0, 658, 659, 5, 105, 0, 0, 659, 660, 5, 111, 0, 0, 660, 661, 5, 110, 0, 0, 661, 88, 1, 0, 0, 0, 662, 663, 5, 99, 0, 0, 663, 664, 5, 111, 0, 0, 664, 665, 5, 110, 0, 0, 665, 666, 5, 115, 0, 0, 666, 667, 5, 116, 0, 0, 667, 668, 5, 114, 0, 0, 668, 669, 5, 117, 0, 0, 669, 670, 5, 99, 0, 0, 670, 671, 5, 116, 0, 0, 671, 672, 5, 111, 0, 0, 672, 673, 5, 114, 0, 0, 673, 90, 1, 0, 0, 0, 674, 675, 5, 99, 0, 0, 675, 676, 5, 111, 0, 0, 676, 677, 5, 110, 0, 0, 677, 678, 5, 115, 0, 0, 678, 679, 5, 116, 0, 0, 679, 680, 5, 114, 0, 0, 680, 681, 5, 117, 0, 0, 681, 682, 5, 99, 0, 0, 682, 683, 5, 116, 0, 0, 683, 684, 5, 115, 0, 0, 684, 92, 1, 0, 0, 0, 685, 686, 5, 105, 0, 0, 686, 687, 5, 110, 0, 0, 687, 688, 5, 112, 0, 0, 688, 689, 5, 117, 0, 0, 689, 690, 5, 116, 0, 0, 690, 94, 1, 0, 0, 0, 691, 692, 5, 99, 0, 0, 692, 693, 5, 111, 0, 0, 693, 694, 5, 110, 0, 0, 694, 695, 5, 102, 0, 0, 695, 696, 5, 111, 0, 0, 696, 697, 5, 114, 0, 0, 697, 698, 5, 109, 0, 0, 698, 96, 1, 0, 0, 0, 699, 700, 5, 97, 0, 0, 700, 701, 5, 115, 0, 0, 701, 98, 1, 0, 0, 0, 702, 703, 5, 98, 0, 0, 703, 704, 5, 105, 0, 0, 704, 705, 5, 110, 0, 0, 705, 706, 5, 100, 0, 0, 706, 100, 1, 0, 0, 0, 707, 708, 5, 115, 0, 0, 708, 709, 5, 116, 0, 0, 709, 710, 5, 97, 0, 0, 710, 711, 5, 116, 0, 0, 711, 712, 5, 105, 0, 0, 712, 713, 5, 99, 0, 0, 713, 102, 1, 0, 0, 0, 714, 715, 5, 116, 0, 0, 715, 716, 5, 111, 0, 0, 716, 104, 1, 0, 0, 0, 717, 718, 5, 112, 0, 0, 718, 719, 5, 114, 0, 0, 719, 720, 5, 105, 0, 0, 720, 721, 5, 118, 0, 0, 721, 722, 5, 97, 0, 0, 722, 723, 5, 116, 0, 0, 723, 724, 5, 101, 0, 0, 724, 106, 1, 0, 0, 0, 725, 726, 5, 115, 0, 0, 726, 727, 5, 104, 0, 0, 727, 728, 5, 97, 0, 0, 728, 729, 5, 114, 0, 0, 729, 730, 5, 101, 0, 0, 730, 731, 5, 100, 0, 0, 731, 108, 1, 0, 0, 0, 732, 733, 5, 115, 0, 0, 733, 734, 5, 116, 0, 0, 734, 735, 5, 97, 0, 0, 735, 736, 5, 116, 0, 0, 736, 737, 5, 101, 0, 0, 737, 110, 1, 0, 0, 0, 738, 739, 5, 101, 0, 0, 739, 740, 5, 100, 0, 0, 740, 741, 5, 103, 0, 0, 741, 742, 5, 101, 0, 0, 742, 112, 1, 0, 0, 0, 743, 744, 5, 112, 0, 0, 744, 745, 5, 114, 0, 0, 745, 746, 5, 111, 0, 0, 746, 747, 5, 106, 0, 0, 747, 748, 5, 101, 0, 0, 748, 749, 5, 99, 0, 0, 749, 750, 5, 116, 0, 0, 750, 751, 5, 105, 0, 0, 751, 752, 5, 111, 0, 0, 752, 753, 5, 110, 0, 0, 753, 114, 1, 0, 0, 0, 754, 755, 5, 119, 0, 0, 755, 756, 5, 105, 0, 0, 756, 757, 5, 116, 0, 0, 757, 758, 5, 104, 0, 0, 758, 116, 1, 0, 0, 0, 759, 760, 5, 117, 0, 0, 760, 761, 5, 115, 0, 0, 761, 762, 5, 105, 0, 0, 762, 763, 5, 110, 0, 0, 763, 764, 5, 103, 0, 0, 764, 118, 1, 0, 0, 0, 765, 766, 5, 118, 0, 0, 766, 767, 5, 105, 0, 0, 767, 768, 5, 97, 0, 0, 768, 120, 1, 0, 0, 0, 769, 770, 5, 109, 0, 0, 770, 771, 5, 97, 0, 0, 771, 772, 5, 116, 0, 0, 772, 773, 5, 101, 0, 0, 773, 774, 5, 114, 0, 0, 774, 775, 5, 105, 0, 0, 775, 776, 5, 97, 0, 0, 776, 777, 5, 108, 0, 0, 777, 778, 5, 105, 0, 0, 778, 779, 5, 122, 0, 0, 779, 780, 5, 101, 0, 0, 780, 122, 1, 0, 0, 0, 781, 782, 5, 105, 0, 0, 782, 783, 5, 102, 0, 0, 783, 124, 1, 0, 0, 0, 784, 785, 5, 97, 0, 0, 785, 786, 5, 98, 0, 0, 786, 787, 5, 115, 0, 0, 787, 788, 5, 101, 0, 0, 788, 789, 5, 110, 0, 0, 789, 790, 5, 116, 0, 0, 790, 126, 1, 0, 0, 0, 791, 792, 5, 111, 0, 0, 792, 793, 5, 110, 0, 0, 793, 128, 1, 0, 0, 0, 794, 795, 5, 112, 0, 0, 795, 796, 5, 111, 0, 0, 796, 797, 5, 108, 0, 0, 797, 798, 5, 105, 0, 0, 798, 799, 5, 99, 0, 0, 799, 800, 5, 121, 0, 0, 800, 130, 1, 0, 0, 0, 801, 802, 5, 100, 0, 0, 802, 803, 5, 101, 0, 0, 803, 804, 5, 102, 0, 0, 804, 805, 5, 97, 0, 0, 805, 806, 5, 117, 0, 0, 806, 807, 5, 108, 0, 0, 807, 808, 5, 116, 0, 0, 808, 132, 1, 0, 0, 0, 809, 810, 5, 115, 0, 0, 810, 811, 5, 111, 0, 0, 811, 812, 5, 117, 0, 0, 812, 813, 5, 114, 0, 0, 813, 814, 5, 99, 0, 0, 814, 815, 5, 101, 0, 0, 815, 134, 1, 0, 0, 0, 816, 817, 5, 114, 0, 0, 817, 818, 5, 101, 0, 0, 818, 819, 5, 112, 0, 0, 819, 820, 5, 111, 0, 0, 820, 821, 5, 115, 0, 0, 821, 822, 5, 105, 0, 0, 822, 823, 5, 116, 0, 0, 823, 824, 5, 111, 0, 0, 824, 825, 5, 114, 0, 0, 825, 826, 5, 121, 0, 0, 826, 136, 1, 0, 0, 0, 827, 828, 5, 99, 0, 0, 828, 829, 5, 111, 0, 0, 829, 830, 5, 109, 0, 0, 830, 831, 5, 109, 0, 0, 831, 832, 5, 105, 0, 0, 832, 833, 5, 116, 0, 0, 833, 138, 1, 0, 0, 0, 834, 835, 5, 114, 0, 0, 835, 836, 5, 101, 0, 0, 836, 837, 5, 118, 0, 0, 837, 838, 5, 105, 0, 0, 838, 839, 5, 115, 0, 0, 839, 840, 5, 105, 0, 0, 840, 841, 5, 111, 0, 0, 841, 842, 5, 110, 0, 0, 842, 140, 1, 0, 0, 0, 843, 844, 5, 115, 0, 0, 844, 845, 5, 101, 0, 0, 845, 846, 5, 109, 0, 0, 846, 847, 5, 97, 0, 0, 847, 848, 5, 110, 0, 0, 848, 849, 5, 116, 0, 0, 849, 850, 5, 105, 0, 0, 850, 851, 5, 99, 0, 0, 851, 852, 5, 45, 0, 0, 852, 853, 5, 109, 0, 0, 853, 854, 5, 97, 0, 0, 854, 855, 5, 106, 0, 0, 855, 856, 5, 111, 0, 0, 856, 857, 5, 114, 0, 0, 857, 142, 1, 0, 0, 0, 858, 859, 5, 111, 0, 0, 859, 860, 5, 110, 0, 0, 860, 861, 5, 45, 0, 0, 861, 862, 5, 100, 0, 0, 862, 863, 5, 101, 0, 0, 863, 864, 5, 108, 0, 0, 864, 865, 5, 101, 0, 0, 865, 866, 5, 116, 0, 0, 866, 867, 5, 101, 0, 0, 867, 144, 1, 0, 0, 0, 868, 869, 5, 114, 0, 0, 869, 870, 5, 101, 0, 0, 870, 871, 5, 116, 0, 0, 871, 872, 5, 97, 0, 0, 872, 873, 5, 105, 0, 0, 873, 874, 5, 110, 0, 0, 874, 875, 5, 45, 0, 0, 875, 876, 5, 111, 0, 0, 876, 877, 5, 116, 0, 0, 877, 878, 5, 104, 0, 0, 878, 879, 5, 101, 0, 0, 879, 880, 5, 114, 0, 0, 880, 146, 1, 0, 0, 0, 881, 882, 5, 107, 0, 0, 882, 883, 5, 101, 0, 0, 883, 884, 5, 121, 0, 0, 884, 885, 5, 101, 0, 0, 885, 886, 5, 100, 0, 0, 886, 148, 1, 0, 0, 0, 887, 888, 5, 112, 0, 0, 888, 889, 5, 117, 0, 0, 889, 890, 5, 98, 0, 0, 890, 891, 5, 108, 0, 0, 891, 892, 5, 105, 0, 0, 892, 893, 5, 99, 0, 0, 893, 894, 5, 45, 0, 0, 894, 895, 5, 116, 0, 0, 895, 896, 5, 114, 0, 0, 896, 897, 5, 97, 0, 0, 897, 898, 5, 118, 0, 0, 898, 899, 5, 101, 0, 0, 899, 900, 5, 114, 0, 0, 900, 901, 5, 115, 0, 0, 901, 902, 5, 97, 0, 0, 902, 903, 5, 108, 0, 0, 903, 150, 1, 0, 0, 0, 904, 905, 5, 105, 0, 0, 905, 906, 5, 100, 0, 0, 906, 152, 1, 0, 0, 0, 907, 908, 5, 100, 0, 0, 908, 909, 5, 111, 0, 0, 909, 910, 5, 99, 0, 0, 910, 154, 1, 0, 0, 0, 911, 912, 5, 109, 0, 0, 912, 913, 5, 111, 0, 0, 913, 914, 5, 100, 0, 0, 914, 915, 5, 101, 0, 0, 915, 156, 1, 0, 0, 0, 916, 917, 5, 101, 0, 0, 917, 918, 5, 109, 0, 0, 918, 919, 5, 105, 0, 0, 919, 920, 5, 116, 0, 0, 920, 921, 5, 115, 0, 0, 921, 158, 1, 0, 0, 0, 922, 923, 5, 114, 0, 0, 923, 924, 5, 101, 0, 0, 924, 925, 5, 99, 0, 0, 925, 926, 5, 101, 0, 0, 926, 927, 5, 105, 0, 0, 927, 928, 5, 118, 0, 0, 928, 929, 5, 101, 0, 0, 929, 930, 5, 114, 0, 0, 930, 160, 1, 0, 0, 0, 931, 932, 5, 114, 0, 0, 932, 933, 5, 101, 0, 0, 933, 934, 5, 113, 0, 0, 934, 935, 5, 117, 0, 0, 935, 936, 5, 105, 0, 0, 936, 937, 5, 114, 0, 0, 937, 938, 5, 101, 0, 0, 938, 939, 5, 115, 0, 0, 939, 162, 1, 0, 0, 0, 940, 941, 5, 97, 0, 0, 941, 942, 5, 110, 0, 0, 942, 943, 5, 121, 0, 0, 943, 164, 1, 0, 0, 0, 944, 945, 5, 103, 0, 0, 945, 946, 5, 101, 0, 0, 946, 947, 5, 116, 0, 0, 947, 166, 1, 0, 0, 0, 948, 949, 5, 115, 0, 0, 949, 950, 5, 101, 0, 0, 950, 951, 5, 116, 0, 0, 951, 168, 1, 0, 0, 0, 952, 953, 5, 119, 0, 0, 953, 954, 5, 97, 0, 0, 954, 955, 5, 116, 0, 0, 955, 956, 5, 99, 0, 0, 956, 957, 5, 104, 0, 0, 957, 170, 1, 0, 0, 0, 958, 959, 5, 115, 0, 0, 959, 960, 5, 116, 0, 0, 960, 961, 5, 97, 0, 0, 961, 962, 5, 114, 0, 0, 962, 963, 5, 116, 0, 0, 963, 172, 1, 0, 0, 0, 964, 965, 5, 115, 0, 0, 965, 966, 5, 116, 0, 0, 966, 967, 5, 111, 0, 0, 967, 968, 5, 112, 0, 0, 968, 174, 1, 0, 0, 0, 969, 970, 5, 114, 0, 0, 970, 971, 5, 101, 0, 0, 971, 972, 5, 97, 0, 0, 972, 973, 5, 100, 0, 0, 973, 176, 1, 0, 0, 0, 974, 975, 5, 119, 0, 0, 975, 976, 5, 114, 0, 0, 976, 977, 5, 105, 0, 0, 977, 978, 5, 116, 0, 0, 978, 979, 5, 101, 0, 0, 979, 178, 1, 0, 0, 0, 980, 981, 5, 114, 0, 0, 981, 982, 5, 101, 0, 0, 982, 983, 5, 115, 0, 0, 983, 984, 5, 111, 0, 0, 984, 985, 5, 108, 0, 0, 985, 986, 5, 118, 0, 0, 986, 987, 5, 101, 0, 0, 987, 180, 1, 0, 0, 0, 988, 989, 5, 99, 0, 0, 989, 990, 5, 111, 0, 0, 990, 991, 5, 110, 0, 0, 991, 992, 5, 110, 0, 0, 992, 993, 5, 101, 0, 0, 993, 994, 5, 99, 0, 0, 994, 995, 5, 116, 0, 0, 995, 182, 1, 0, 0, 0, 996, 997, 5, 100, 0, 0, 997, 998, 5, 105, 0, 0, 998, 999, 5, 115, 0, 0, 999, 1000, 5, 99, 0, 0, 1000, 1001, 5, 111, 0, 0, 1001, 1002, 5, 110, 0, 0, 1002, 1003, 5, 110, 0, 0, 1003, 1004, 5, 101, 0, 0, 1004, 1005, 5, 99, 0, 0, 1005, 1006, 5, 116, 0, 0, 1006, 184, 1, 0, 0, 0, 1007, 1008, 5, 99, 0, 0, 1008, 1009, 5, 97, 0, 0, 1009, 1010, 5, 108, 0, 0, 1010, 1011, 5, 108, 0, 0, 1011, 186, 1, 0, 0, 0, 1012, 1013, 5, 119, 0, 0, 1013, 1014, 5, 97, 0, 0, 1014, 1015, 5, 116, 0, 0, 1015, 1016, 5, 99, 0, 0, 1016, 1017, 5, 104, 0, 0, 1017, 1018, 5, 45, 0, 0, 1018, 1019, 5, 115, 0, 0, 1019, 1020, 5, 116, 0, 0, 1020, 1021, 5, 97, 0, 0, 1021, 1022, 5, 114, 0, 0, 1022, 1023, 5, 116, 0, 0, 1023, 188, 1, 0, 0, 0, 1024, 1025, 5, 119, 0, 0, 1025, 1026, 5, 97, 0, 0, 1026, 1027, 5, 116, 0, 0, 1027, 1028, 5, 99, 0, 0, 1028, 1029, 5, 104, 0, 0, 1029, 1030, 5, 45, 0, 0, 1030, 1031, 5, 115, 0, 0, 1031, 1032, 5, 116, 0, 0, 1032, 1033, 5, 111, 0, 0, 1033, 1034, 5, 112, 0, 0, 1034, 190, 1, 0, 0, 0, 1035, 1036, 5, 115, 0, 0, 1036, 1037, 5, 117, 0, 0, 1037, 1038, 5, 98, 0, 0, 1038, 1039, 5, 115, 0, 0, 1039, 1040, 5, 99, 0, 0, 1040, 1041, 5, 114, 0, 0, 1041, 1042, 5, 105, 0, 0, 1042, 1043, 5, 98, 0, 0, 1043, 1044, 5, 101, 0, 0, 1044, 192, 1, 0, 0, 0, 1045, 1046, 5, 117, 0, 0, 1046, 1047, 5, 110, 0, 0, 1047, 1048, 5, 115, 0, 0, 1048, 1049, 5, 117, 0, 0, 1049, 1050, 5, 98, 0, 0, 1050, 1051, 5, 115, 0, 0, 1051, 1052, 5, 99, 0, 0, 1052, 1053, 5, 114, 0, 0, 1053, 1054, 5, 105, 0, 0, 1054, 1055, 5, 98, 0, 0, 1055, 1056, 5, 101, 0, 0, 1056, 194, 1, 0, 0, 0, 1057, 1058, 5, 114, 0, 0, 1058, 1059, 5, 101, 0, 0, 1059, 1060, 5, 103, 0, 0, 1060, 1061, 5, 105, 0, 0, 1061, 1062, 5, 115, 0, 0, 1062, 1063, 5, 116, 0, 0, 1063, 1064, 5, 101, 0, 0, 1064, 1065, 5, 114, 0, 0, 1065, 196, 1, 0, 0, 0, 1066, 1067, 5, 99, 0, 0, 1067, 1068, 5, 114, 0, 0, 1068, 1069, 5, 100, 0, 0, 1069, 1070, 5, 116, 0, 0, 1070, 198, 1, 0, 0, 0, 1071, 1072, 5, 111, 0, 0, 1072, 1073, 5, 112, 0, 0, 1073, 1074, 5, 116, 0, 0, 1074, 1075, 5, 105, 0, 0, 1075, 1076, 5, 111, 0, 0, 1076, 1077, 5, 110, 0, 0, 1077, 1078, 5, 97, 0, 0, 1078, 1079, 5, 108, 0, 0, 1079, 1080, 5, 45, 0, 0, 1080, 1081, 5, 111, 0, 0, 1081, 1082, 5, 110, 0, 0, 1082, 1083, 5, 101, 0, 0, 1083, 200, 1, 0, 0, 0, 1084, 1085, 5, 101, 0, 0, 1085, 1086, 5, 120, 0, 0, 1086, 1087, 5, 97, 0, 0, 1087, 1088, 5, 99, 0, 0, 1088, 1089, 5, 116, 0, 0, 1089, 1090, 5, 108, 0, 0, 1090, 1091, 5, 121, 0, 0, 1091, 1092, 5, 45, 0, 0, 1092, 1093, 5, 111, 0, 0, 1093, 1094, 5, 110, 0, 0, 1094, 1095, 5, 101, 0, 0, 1095, 202, 1, 0, 0, 0, 1096, 1097, 5, 109, 0, 0, 1097, 1098, 5, 97, 0, 0, 1098, 1099, 5, 110, 0, 0, 1099, 1100, 5, 121, 0, 0, 1100, 1101, 5, 45, 0, 0, 1101, 1102, 5, 117, 0, 0, 1102, 1103, 5, 110, 0, 0, 1103, 1104, 5, 105, 0, 0, 1104, 1105, 5, 113, 0, 0, 1105, 1106, 5, 117, 0, 0, 1106, 1107, 5, 101, 0, 0, 1107, 204, 1, 0, 0, 0, 1108, 1109, 5, 109, 0, 0, 1109, 1110, 5, 97, 0, 0, 1110, 1111, 5, 110, 0, 0, 1111, 1112, 5, 121, 0, 0, 1112, 206, 1, 0, 0, 0, 1113, 1114, 5, 111, 0, 0, 1114, 1115, 5, 114, 0, 0, 1115, 1116, 5, 100, 0, 0, 1116, 1117, 5, 101, 0, 0, 1117, 1118, 5, 114, 0, 0, 1118, 1119, 5, 101, 0, 0, 1119, 1120, 5, 100, 0, 0, 1120, 208, 1, 0, 0, 0, 1121, 1122, 5, 117, 0, 0, 1122, 1123, 5, 110, 0, 0, 1123, 1124, 5, 105, 0, 0, 1124, 1125, 5, 116, 0, 0, 1125, 210, 1, 0, 0, 0, 1126, 1127, 5, 119, 0, 0, 1127, 1128, 5, 97, 0, 0, 1128, 1129, 5, 116, 0, 0, 1129, 1130, 5, 99, 0, 0, 1130, 1131, 5, 104, 0, 0, 1131, 1132, 5, 45, 0, 0, 1132, 1133, 5, 104, 0, 0, 1133, 1134, 5, 97, 0, 0, 1134, 1135, 5, 110, 0, 0, 1135, 1136, 5, 100, 0, 0, 1136, 1137, 5, 108, 0, 0, 1137, 1138, 5, 101, 0, 0, 1138, 212, 1, 0, 0, 0, 1139, 1140, 5, 109, 0, 0, 1140, 1141, 5, 101, 0, 0, 1141, 1142, 5, 115, 0, 0, 1142, 1143, 5, 115, 0, 0, 1143, 1144, 5, 97, 0, 0, 1144, 1145, 5, 103, 0, 0, 1145, 1146, 5, 101, 0, 0, 1146, 214, 1, 0, 0, 0, 1147, 1148, 5, 97, 0, 0, 1148, 1149, 5, 116, 0, 0, 1149, 1150, 5, 111, 0, 0, 1150, 1151, 5, 109, 0, 0, 1151, 1152, 5, 45, 0, 0, 1152, 1153, 5, 114, 0, 0, 1153, 1154, 5, 101, 0, 0, 1154, 1155, 5, 102, 0, 0, 1155, 216, 1, 0, 0, 0, 1156, 1157, 5, 105, 0, 0, 1157, 1158, 5, 110, 0, 0, 1158, 1159, 5, 116, 0, 0, 1159, 1160, 5, 101, 0, 0, 1160, 1161, 5, 114, 0, 0, 1161, 1162, 5, 102, 0, 0, 1162, 1163, 5, 97, 0, 0, 1163, 1164, 5, 99, 0, 0, 1164, 1165, 5, 101, 0, 0, 1165, 1166, 5, 45, 0, 0, 1166, 1167, 5, 114, 0, 0, 1167, 1168, 5, 101, 0, 0, 1168, 1169, 5, 102, 0, 0, 1169, 218, 1, 0, 0, 0, 1170, 1171, 5, 111, 0, 0, 1171, 1172, 5, 112, 0, 0, 1172, 1173, 5, 116, 0, 0, 1173, 1174, 5, 105, 0, 0, 1174, 1175, 5, 111, 0, 0, 1175, 1176, 5, 110, 0, 0, 1176, 1177, 5, 97, 0, 0, 1177, 1178, 5, 108, 0, 0, 1178, 220, 1, 0, 0, 0, 1179, 1180, 5, 108, 0, 0, 1180, 1181, 5, 105, 0, 0, 1181, 1182, 5, 115, 0, 0, 1182, 1183, 5, 116, 0, 0, 1183, 222, 1, 0, 0, 0, 1184, 1185, 5, 114, 0, 0, 1185, 1186, 5, 101, 0, 0, 1186, 1187, 5, 99, 0, 0, 1187, 1188, 5, 111, 0, 0, 1188, 1189, 5, 114, 0, 0, 1189, 1190, 5, 100, 0, 0, 1190, 224, 1, 0, 0, 0, 1191, 1192, 5, 98, 0, 0, 1192, 1193, 5, 111, 0, 0, 1193, 1194, 5, 111, 0, 0, 1194, 1195, 5, 108, 0, 0, 1195, 226, 1, 0, 0, 0, 1196, 1197, 5, 98, 0, 0, 1197, 1198, 5, 121, 0, 0, 1198, 1199, 5, 116, 0, 0, 1199, 1200, 5, 101, 0, 0, 1200, 1201, 5, 115, 0, 0, 1201, 228, 1, 0, 0, 0, 1202, 1203, 5, 100, 0, 0, 1203, 1204, 5, 111, 0, 0, 1204, 1205, 5, 117, 0, 0, 1205, 1206, 5, 98, 0, 0, 1206, 1207, 5, 108, 0, 0, 1207, 1208, 5, 101, 0, 0, 1208, 230, 1, 0, 0, 0, 1209, 1210, 5, 105, 0, 0, 1210, 1211, 5, 110, 0, 0, 1211, 1212, 5, 116, 0, 0, 1212, 1213, 5, 51, 0, 0, 1213, 1214, 5, 50, 0, 0, 1214, 232, 1, 0, 0, 0, 1215, 1216, 5, 105, 0, 0, 1216, 1217, 5, 110, 0, 0, 1217, 1218, 5, 116, 0, 0, 1218, 1219, 5, 54, 0, 0, 1219, 1220, 5, 52, 0, 0, 1220, 234, 1, 0, 0, 0, 1221, 1222, 5, 115, 0, 0, 1222, 1223, 5, 116, 0, 0, 1223, 1224, 5, 114, 0, 0, 1224, 1225, 5, 105, 0, 0, 1225, 1226, 5, 110, 0, 0, 1226, 1227, 5, 103, 0, 0, 1227, 236, 1, 0, 0, 0, 1228, 1229, 5, 117, 0, 0, 1229, 1230, 5, 105, 0, 0, 1230, 1231, 5, 110, 0, 0, 1231, 1232, 5, 116, 0, 0, 1232, 1233, 5, 51, 0, 0, 1233, 1234, 5, 50, 0, 0, 1234, 238, 1, 0, 0, 0, 1235, 1236, 5, 117, 0, 0, 1236, 1237, 5, 105, 0, 0, 1237, 1238, 5, 110, 0, 0, 1238, 1239, 5, 116, 0, 0, 1239, 1240, 5, 54, 0, 0, 1240, 1241, 5, 52, 0, 0, 1241, 240, 1, 0, 0, 0, 1242, 1243, 5, 116, 0, 0, 1243, 1244, 5, 114, 0, 0, 1244, 1245, 5, 117, 0, 0, 1245, 1246, 5, 101, 0, 0, 1246, 242, 1, 0, 0, 0, 1247, 1248, 5, 102, 0, 0, 1248, 1249, 5, 97, 0, 0, 1249, 1250, 5, 108, 0, 0, 1250, 1251, 5, 115, 0, 0, 1251, 1252, 5, 101, 0, 0, 1252, 244, 1, 0, 0, 0, 1253, 1254, 5, 110, 0, 0, 1254, 1255, 5, 117, 0, 0, 1255, 1256, 5, 108, 0, 0, 1256, 1257, 5, 108, 0, 0, 1257, 246, 1, 0, 0, 0, 1258, 1259, 5, 45, 0, 0, 1259, 1260, 5, 62, 0, 0, 1260, 248, 1, 0, 0, 0, 1261, 1262, 5, 58, 0, 0, 1262, 250, 1, 0, 0, 0, 1263, 1264, 5, 59, 0, 0, 1264, 252, 1, 0, 0, 0, 1265, 1266, 5, 44, 0, 0, 1266, 254, 1, 0, 0, 0, 1267, 1268, 5, 46, 0, 0, 1268, 256, 1, 0, 0, 0, 1269, 1270, 5, 123, 0, 0, 1270, 258, 1, 0, 0, 0, 1271, 1272, 5, 125, 0, 0, 1272, 260, 1, 0, 0, 0, 1273, 1274, 5, 91, 0, 0, 1274, 262, 1, 0, 0, 0, 1275, 1276, 5, 93, 0, 0, 1276, 264, 1, 0, 0, 0, 1277, 1278, 5, 40, 0, 0, 1278, 266, 1, 0, 0, 0, 1279, 1280, 5, 41, 0, 0, 1280, 268, 1, 0, 0, 0, 1281, 1282, 5, 60, 0, 0, 1282, 270, 1, 0, 0, 0, 1283, 1284, 5, 62, 0, 0, 1284, 272, 1, 0, 0, 0, 1285, 1286, 5, 38, 0, 0, 1286, 274, 1, 0, 0, 0, 1287, 1288, 5, 61, 0, 0, 1288, 276, 1, 0, 0, 0, 1289, 1291, 5, 45, 0, 0, 1290, 1289, 1, 0, 0, 0, 1290, 1291, 1, 0, 0, 0, 1291, 1293, 1, 0, 0, 0, 1292, 1294, 7, 0, 0, 0, 1293, 1292, 1, 0, 0, 0, 1294, 1295, 1, 0, 0, 0, 1295, 1293, 1, 0, 0, 0, 1295, 1296, 1, 0, 0, 0, 1296, 278, 1, 0, 0, 0, 1297, 1299, 5, 45, 0, 0, 1298, 1297, 1, 0, 0, 0, 1298, 1299, 1, 0, 0, 0, 1299, 1308, 1, 0, 0, 0, 1300, 1309, 5, 48, 0, 0, 1301, 1305, 7, 1, 0, 0, 1302, 1304, 7, 0, 0, 0, 1303, 1302, 1, 0, 0, 0, 1304, 1307, 1, 0, 0, 0, 1305, 1303, 1, 0, 0, 0, 1305, 1306, 1, 0, 0, 0, 1306, 1309, 1, 0, 0, 0, 1307, 1305, 1, 0, 0, 0, 1308, 1300, 1, 0, 0, 0, 1308, 1301, 1, 0, 0, 0, 1309, 1316, 1, 0, 0, 0, 1310, 1312, 5, 46, 0, 0, 1311, 1313, 7, 0, 0, 0, 1312, 1311, 1, 0, 0, 0, 1313, 1314, 1, 0, 0, 0, 1314, 1312, 1, 0, 0, 0, 1314, 1315, 1, 0, 0, 0, 1315, 1317, 1, 0, 0, 0, 1316, 1310, 1, 0, 0, 0, 1316, 1317, 1, 0, 0, 0, 1317, 1327, 1, 0, 0, 0, 1318, 1320, 7, 2, 0, 0, 1319, 1321, 7, 3, 0, 0, 1320, 1319, 1, 0, 0, 0, 1320, 1321, 1, 0, 0, 0, 1321, 1323, 1, 0, 0, 0, 1322, 1324, 7, 0, 0, 0, 1323, 1322, 1, 0, 0, 0, 1324, 1325, 1, 0, 0, 0, 1325, 1323, 1, 0, 0, 0, 1325, 1326, 1, 0, 0, 0, 1326, 1328, 1, 0, 0, 0, 1327, 1318, 1, 0, 0, 0, 1327, 1328, 1, 0, 0, 0, 1328, 280, 1, 0, 0, 0, 1329, 1333, 7, 4, 0, 0, 1330, 1332, 7, 5, 0, 0, 1331, 1330, 1, 0, 0, 0, 1332, 1335, 1, 0, 0, 0, 1333, 1331, 1, 0, 0, 0, 1333, 1334, 1, 0, 0, 0, 1334, 282, 1, 0, 0, 0, 1335, 1333, 1, 0, 0, 0, 1336, 1341, 5, 34, 0, 0, 1337, 1340, 3, 285, 142, 0, 1338, 1340, 8, 6, 0, 0, 1339, 1337, 1, 0, 0, 0, 1339, 1338, 1, 0, 0, 0, 1340, 1343, 1, 0, 0, 0, 1341, 1339, 1, 0, 0, 0, 1341, 1342, 1, 0, 0, 0, 1342, 1344, 1, 0, 0, 0, 1343, 1341, 1, 0, 0, 0, 1344, 1345, 5, 34, 0, 0, 1345, 284, 1, 0, 0, 0, 1346, 1354, 5, 92, 0, 0, 1347, 1355, 7, 7, 0, 0, 1348, 1349, 5, 117, 0, 0, 1349, 1350, 3, 287, 143, 0, 1350, 1351, 3, 287, 143, 0, 1351, 1352, 3, 287, 143, 0, 1352, 1353, 3, 287, 143, 0, 1353, 1355, 1, 0, 0, 0, 1354, 1347, 1, 0, 0, 0, 1354, 1348, 1, 0, 0, 0, 1355, 286, 1, 0, 0, 0, 1356, 1357, 7, 8, 0, 0, 1357, 288, 1, 0, 0, 0, 1358, 1359, 5, 47, 0, 0, 1359, 1360, 5, 47, 0, 0, 1360, 1364, 1, 0, 0, 0, 1361, 1363, 8, 9, 0, 0, 1362, 1361, 1, 0, 0, 0, 1363, 1366, 1, 0, 0, 0, 1364, 1362, 1, 0, 0, 0, 1364, 1365, 1, 0, 0, 0, 1365, 1367, 1, 0, 0, 0, 1366, 1364, 1, 0, 0, 0, 1367, 1368, 6, 144, 0, 0, 1368, 290, 1, 0, 0, 0, 1369, 1370, 5, 47, 0, 0, 1370, 1371, 5, 42, 0, 0, 1371, 1375, 1, 0, 0, 0, 1372, 1374, 9, 0, 0, 0, 1373, 1372, 1, 0, 0, 0, 1374, 1377, 1, 0, 0, 0, 1375, 1376, 1, 0, 0, 0, 1375, 1373, 1, 0, 0, 0, 1376, 1378, 1, 0, 0, 0, 1377, 1375, 1, 0, 0, 0, 1378, 1379, 5, 42, 0, 0, 1379, 1380, 5, 47, 0, 0, 1380, 1381, 1, 0, 0, 0, 1381, 1382, 6, 145, 0, 0, 1382, 292, 1, 0, 0, 0, 1383, 1385, 7, 10, 0, 0, 1384, 1383, 1, 0, 0, 0, 1385, 1386, 1, 0, 0, 0, 1386, 1384, 1, 0, 0, 0, 1386, 1387, 1, 0, 0, 0, 1387, 1388, 1, 0, 0, 0, 1388, 1389, 6, 146, 0, 0, 1389, 294, 1, 0, 0, 0, 18, 0, 1290, 1295, 1298, 1305, 1308, 1314, 1316, 1320, 1325, 1327, 1333, 1339, 1341, 1354, 1364, 1375, 1386, 1, 0, 1, 0] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapabilityLexer.tokens b/src/capability-language/generated/QuixosCapabilityLexer.tokens index 6557cbb..879ca09 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.tokens +++ b/src/capability-language/generated/QuixosCapabilityLexer.tokens @@ -1,279 +1,283 @@ -WORKSPACE=1 -EXECUTION=2 -SNAPSHOT=3 -TRANSACTION=4 -REMOTE=5 -TARGETS=6 -PORTABLE=7 -REPLICA=8 -LOCAL=9 -FROM=10 -RESULT_BYTES=11 -RPC_CALLS=12 -DEADLINE_MS=13 -QUERY=14 -REFLECTION=15 -SPECIALIZE=16 -ROOT=17 -DOCUMENT=18 -FRAGMENTS=19 -VIEW=20 -MAX=21 -ALLOW=22 -POLL=23 -QUERYABLE=24 -RPC=25 -QUERY_REASON=26 -TYPE=27 -OBJECT=28 -STORABLE=29 -IMPLEMENTS=30 -REF=31 -FRAGMENT=32 -IMPORT=33 -EXTERNAL=34 -ATOM=35 -INTERFACE=36 -INTERFACES=37 -PACKAGE=38 -VALUE=39 -RELATION=40 -OPERATION=41 -FUNCTION=42 -CONSTRUCTOR=43 -CONSTRUCTS=44 -INPUT=45 -CONFORM=46 -AS=47 -BIND=48 -STATIC=49 -TO=50 -PRIVATE=51 -SHARED=52 -STATE=53 -EDGE=54 -PROJECTION=55 -WITH=56 -USING=57 -VIA=58 -MATERIALIZE=59 -IF=60 -ABSENT=61 -ON=62 -POLICY=63 -DEFAULT=64 -SOURCE=65 -REPOSITORY=66 -COMMIT=67 -REVISION=68 -SEMANTIC_MAJOR=69 -ON_DELETE=70 -RETAIN_OTHER=71 -KEYED=72 -PUBLIC_TRAVERSAL=73 -ID=74 -DOC=75 -MODE=76 -EMITS=77 -RECEIVER=78 -REQUIRES=79 -ANY=80 -GET=81 -SET=82 -WATCH=83 -START=84 -STOP=85 -READ=86 -WRITE=87 -RESOLVE=88 -CONNECT=89 -DISCONNECT=90 -CALL=91 -WATCH_START=92 -WATCH_STOP=93 -SUBSCRIBE=94 -UNSUBSCRIBE=95 -OPTIMISTIC_REGISTER=96 -CRDT=97 -OPTIONAL_ONE=98 -EXACTLY_ONE=99 -MANY_UNIQUE=100 -MANY=101 -ORDERED=102 -UNIT=103 -WATCH_HANDLE=104 -MESSAGE=105 -ATOM_REF=106 -INTERFACE_REF=107 -OPTIONAL=108 -LIST=109 -RECORD=110 -BOOL=111 -BYTES=112 -DOUBLE=113 -INT32=114 -INT64=115 -STRING=116 -UINT32=117 -UINT64=118 -TRUE=119 -FALSE=120 -NULL=121 -ARROW=122 -COLON=123 -SEMI=124 -COMMA=125 -DOT=126 -LBRACE=127 -RBRACE=128 -LBRACK=129 -RBRACK=130 -LPAREN=131 -RPAREN=132 -LT=133 -GT=134 -AMP=135 -EQUAL=136 -INTEGER=137 -JSON_NUMBER=138 -IDENTIFIER=139 -STRING_LITERAL=140 -LINE_COMMENT=141 -BLOCK_COMMENT=142 -WS=143 -'workspace'=1 -'execution'=2 -'snapshot'=3 -'transaction'=4 -'remote'=5 -'targets'=6 -'portable'=7 -'replica'=8 -'local'=9 -'from'=10 -'result-bytes'=11 -'rpc-calls'=12 -'deadline-ms'=13 -'query'=14 -'reflection'=15 -'specialize'=16 -'root'=17 -'document'=18 -'fragments'=19 -'view'=20 -'max'=21 -'allow'=22 -'poll'=23 -'queryable'=24 -'rpc'=25 -'query-reason'=26 -'type'=27 -'object'=28 -'storable'=29 -'implements'=30 -'ref'=31 -'fragment'=32 -'import'=33 -'external'=34 -'atom'=35 -'interface'=36 -'interfaces'=37 -'package'=38 -'value'=39 -'relation'=40 -'operation'=41 -'function'=42 -'constructor'=43 -'constructs'=44 -'input'=45 -'conform'=46 -'as'=47 -'bind'=48 -'static'=49 -'to'=50 -'private'=51 -'shared'=52 -'state'=53 -'edge'=54 -'projection'=55 -'with'=56 -'using'=57 -'via'=58 -'materialize'=59 -'if'=60 -'absent'=61 -'on'=62 -'policy'=63 -'default'=64 -'source'=65 -'repository'=66 -'commit'=67 -'revision'=68 -'semantic-major'=69 -'on-delete'=70 -'retain-other'=71 -'keyed'=72 -'public-traversal'=73 -'id'=74 -'doc'=75 -'mode'=76 -'emits'=77 -'receiver'=78 -'requires'=79 -'any'=80 -'get'=81 -'set'=82 -'watch'=83 -'start'=84 -'stop'=85 -'read'=86 -'write'=87 -'resolve'=88 -'connect'=89 -'disconnect'=90 -'call'=91 -'watch-start'=92 -'watch-stop'=93 -'subscribe'=94 -'unsubscribe'=95 -'optimistic-register'=96 -'crdt'=97 -'optional-one'=98 -'exactly-one'=99 -'many-unique'=100 -'many'=101 -'ordered'=102 -'unit'=103 -'watch-handle'=104 -'message'=105 -'atom-ref'=106 -'interface-ref'=107 -'optional'=108 -'list'=109 -'record'=110 -'bool'=111 -'bytes'=112 -'double'=113 -'int32'=114 -'int64'=115 -'string'=116 -'uint32'=117 -'uint64'=118 -'true'=119 -'false'=120 -'null'=121 -'->'=122 -':'=123 -';'=124 -','=125 -'.'=126 -'{'=127 -'}'=128 -'['=129 -']'=130 -'('=131 -')'=132 -'<'=133 -'>'=134 -'&'=135 -'='=136 +CREATION=1 +INITIALIZE=2 +WORKSPACE=3 +EXECUTION=4 +SNAPSHOT=5 +TRANSACTION=6 +REMOTE=7 +TARGETS=8 +PORTABLE=9 +REPLICA=10 +LOCAL=11 +FROM=12 +RESULT_BYTES=13 +RPC_CALLS=14 +DEADLINE_MS=15 +QUERY=16 +REFLECTION=17 +SPECIALIZE=18 +ROOT=19 +DOCUMENT=20 +FRAGMENTS=21 +VIEW=22 +MAX=23 +ALLOW=24 +POLL=25 +QUERYABLE=26 +RPC=27 +QUERY_REASON=28 +TYPE=29 +OBJECT=30 +STORABLE=31 +IMPLEMENTS=32 +REF=33 +FRAGMENT=34 +IMPORT=35 +EXTERNAL=36 +ATOM=37 +INTERFACE=38 +INTERFACES=39 +PACKAGE=40 +VALUE=41 +RELATION=42 +OPERATION=43 +FUNCTION=44 +CONSTRUCTOR=45 +CONSTRUCTS=46 +INPUT=47 +CONFORM=48 +AS=49 +BIND=50 +STATIC=51 +TO=52 +PRIVATE=53 +SHARED=54 +STATE=55 +EDGE=56 +PROJECTION=57 +WITH=58 +USING=59 +VIA=60 +MATERIALIZE=61 +IF=62 +ABSENT=63 +ON=64 +POLICY=65 +DEFAULT=66 +SOURCE=67 +REPOSITORY=68 +COMMIT=69 +REVISION=70 +SEMANTIC_MAJOR=71 +ON_DELETE=72 +RETAIN_OTHER=73 +KEYED=74 +PUBLIC_TRAVERSAL=75 +ID=76 +DOC=77 +MODE=78 +EMITS=79 +RECEIVER=80 +REQUIRES=81 +ANY=82 +GET=83 +SET=84 +WATCH=85 +START=86 +STOP=87 +READ=88 +WRITE=89 +RESOLVE=90 +CONNECT=91 +DISCONNECT=92 +CALL=93 +WATCH_START=94 +WATCH_STOP=95 +SUBSCRIBE=96 +UNSUBSCRIBE=97 +REGISTER=98 +CRDT=99 +OPTIONAL_ONE=100 +EXACTLY_ONE=101 +MANY_UNIQUE=102 +MANY=103 +ORDERED=104 +UNIT=105 +WATCH_HANDLE=106 +MESSAGE=107 +ATOM_REF=108 +INTERFACE_REF=109 +OPTIONAL=110 +LIST=111 +RECORD=112 +BOOL=113 +BYTES=114 +DOUBLE=115 +INT32=116 +INT64=117 +STRING=118 +UINT32=119 +UINT64=120 +TRUE=121 +FALSE=122 +NULL=123 +ARROW=124 +COLON=125 +SEMI=126 +COMMA=127 +DOT=128 +LBRACE=129 +RBRACE=130 +LBRACK=131 +RBRACK=132 +LPAREN=133 +RPAREN=134 +LT=135 +GT=136 +AMP=137 +EQUAL=138 +INTEGER=139 +JSON_NUMBER=140 +IDENTIFIER=141 +STRING_LITERAL=142 +LINE_COMMENT=143 +BLOCK_COMMENT=144 +WS=145 +'creation'=1 +'initialize'=2 +'workspace'=3 +'execution'=4 +'snapshot'=5 +'transaction'=6 +'remote'=7 +'targets'=8 +'portable'=9 +'replica'=10 +'local'=11 +'from'=12 +'result-bytes'=13 +'rpc-calls'=14 +'deadline-ms'=15 +'query'=16 +'reflection'=17 +'specialize'=18 +'root'=19 +'document'=20 +'fragments'=21 +'view'=22 +'max'=23 +'allow'=24 +'poll'=25 +'queryable'=26 +'rpc'=27 +'query-reason'=28 +'type'=29 +'object'=30 +'storable'=31 +'implements'=32 +'ref'=33 +'fragment'=34 +'import'=35 +'external'=36 +'atom'=37 +'interface'=38 +'interfaces'=39 +'package'=40 +'value'=41 +'relation'=42 +'operation'=43 +'function'=44 +'constructor'=45 +'constructs'=46 +'input'=47 +'conform'=48 +'as'=49 +'bind'=50 +'static'=51 +'to'=52 +'private'=53 +'shared'=54 +'state'=55 +'edge'=56 +'projection'=57 +'with'=58 +'using'=59 +'via'=60 +'materialize'=61 +'if'=62 +'absent'=63 +'on'=64 +'policy'=65 +'default'=66 +'source'=67 +'repository'=68 +'commit'=69 +'revision'=70 +'semantic-major'=71 +'on-delete'=72 +'retain-other'=73 +'keyed'=74 +'public-traversal'=75 +'id'=76 +'doc'=77 +'mode'=78 +'emits'=79 +'receiver'=80 +'requires'=81 +'any'=82 +'get'=83 +'set'=84 +'watch'=85 +'start'=86 +'stop'=87 +'read'=88 +'write'=89 +'resolve'=90 +'connect'=91 +'disconnect'=92 +'call'=93 +'watch-start'=94 +'watch-stop'=95 +'subscribe'=96 +'unsubscribe'=97 +'register'=98 +'crdt'=99 +'optional-one'=100 +'exactly-one'=101 +'many-unique'=102 +'many'=103 +'ordered'=104 +'unit'=105 +'watch-handle'=106 +'message'=107 +'atom-ref'=108 +'interface-ref'=109 +'optional'=110 +'list'=111 +'record'=112 +'bool'=113 +'bytes'=114 +'double'=115 +'int32'=116 +'int64'=117 +'string'=118 +'uint32'=119 +'uint64'=120 +'true'=121 +'false'=122 +'null'=123 +'->'=124 +':'=125 +';'=126 +','=127 +'.'=128 +'{'=129 +'}'=130 +'['=131 +']'=132 +'('=133 +')'=134 +'<'=135 +'>'=136 +'&'=137 +'='=138 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.ts b/src/capability-language/generated/QuixosCapabilityLexer.ts index e947ca6..9dab062 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.ts +++ b/src/capability-language/generated/QuixosCapabilityLexer.ts @@ -4,187 +4,190 @@ import { Token } from "antlr4ng"; export class QuixosCapabilityLexer extends antlr.Lexer { - public static readonly WORKSPACE = 1; - public static readonly EXECUTION = 2; - public static readonly SNAPSHOT = 3; - public static readonly TRANSACTION = 4; - public static readonly REMOTE = 5; - public static readonly TARGETS = 6; - public static readonly PORTABLE = 7; - public static readonly REPLICA = 8; - public static readonly LOCAL = 9; - public static readonly FROM = 10; - public static readonly RESULT_BYTES = 11; - public static readonly RPC_CALLS = 12; - public static readonly DEADLINE_MS = 13; - public static readonly QUERY = 14; - public static readonly REFLECTION = 15; - public static readonly SPECIALIZE = 16; - public static readonly ROOT = 17; - public static readonly DOCUMENT = 18; - public static readonly FRAGMENTS = 19; - public static readonly VIEW = 20; - public static readonly MAX = 21; - public static readonly ALLOW = 22; - public static readonly POLL = 23; - public static readonly QUERYABLE = 24; - public static readonly RPC = 25; - public static readonly QUERY_REASON = 26; - public static readonly TYPE = 27; - public static readonly OBJECT = 28; - public static readonly STORABLE = 29; - public static readonly IMPLEMENTS = 30; - public static readonly REF = 31; - public static readonly FRAGMENT = 32; - public static readonly IMPORT = 33; - public static readonly EXTERNAL = 34; - public static readonly ATOM = 35; - public static readonly INTERFACE = 36; - public static readonly INTERFACES = 37; - public static readonly PACKAGE = 38; - public static readonly VALUE = 39; - public static readonly RELATION = 40; - public static readonly OPERATION = 41; - public static readonly FUNCTION = 42; - public static readonly CONSTRUCTOR = 43; - public static readonly CONSTRUCTS = 44; - public static readonly INPUT = 45; - public static readonly CONFORM = 46; - public static readonly AS = 47; - public static readonly BIND = 48; - public static readonly STATIC = 49; - public static readonly TO = 50; - public static readonly PRIVATE = 51; - public static readonly SHARED = 52; - public static readonly STATE = 53; - public static readonly EDGE = 54; - public static readonly PROJECTION = 55; - public static readonly WITH = 56; - public static readonly USING = 57; - public static readonly VIA = 58; - public static readonly MATERIALIZE = 59; - public static readonly IF = 60; - public static readonly ABSENT = 61; - public static readonly ON = 62; - public static readonly POLICY = 63; - public static readonly DEFAULT = 64; - public static readonly SOURCE = 65; - public static readonly REPOSITORY = 66; - public static readonly COMMIT = 67; - public static readonly REVISION = 68; - public static readonly SEMANTIC_MAJOR = 69; - public static readonly ON_DELETE = 70; - public static readonly RETAIN_OTHER = 71; - public static readonly KEYED = 72; - public static readonly PUBLIC_TRAVERSAL = 73; - public static readonly ID = 74; - public static readonly DOC = 75; - public static readonly MODE = 76; - public static readonly EMITS = 77; - public static readonly RECEIVER = 78; - public static readonly REQUIRES = 79; - public static readonly ANY = 80; - public static readonly GET = 81; - public static readonly SET = 82; - public static readonly WATCH = 83; - public static readonly START = 84; - public static readonly STOP = 85; - public static readonly READ = 86; - public static readonly WRITE = 87; - public static readonly RESOLVE = 88; - public static readonly CONNECT = 89; - public static readonly DISCONNECT = 90; - public static readonly CALL = 91; - public static readonly WATCH_START = 92; - public static readonly WATCH_STOP = 93; - public static readonly SUBSCRIBE = 94; - public static readonly UNSUBSCRIBE = 95; - public static readonly OPTIMISTIC_REGISTER = 96; - public static readonly CRDT = 97; - public static readonly OPTIONAL_ONE = 98; - public static readonly EXACTLY_ONE = 99; - public static readonly MANY_UNIQUE = 100; - public static readonly MANY = 101; - public static readonly ORDERED = 102; - public static readonly UNIT = 103; - public static readonly WATCH_HANDLE = 104; - public static readonly MESSAGE = 105; - public static readonly ATOM_REF = 106; - public static readonly INTERFACE_REF = 107; - public static readonly OPTIONAL = 108; - public static readonly LIST = 109; - public static readonly RECORD = 110; - public static readonly BOOL = 111; - public static readonly BYTES = 112; - public static readonly DOUBLE = 113; - public static readonly INT32 = 114; - public static readonly INT64 = 115; - public static readonly STRING = 116; - public static readonly UINT32 = 117; - public static readonly UINT64 = 118; - public static readonly TRUE = 119; - public static readonly FALSE = 120; - public static readonly NULL = 121; - public static readonly ARROW = 122; - public static readonly COLON = 123; - public static readonly SEMI = 124; - public static readonly COMMA = 125; - public static readonly DOT = 126; - public static readonly LBRACE = 127; - public static readonly RBRACE = 128; - public static readonly LBRACK = 129; - public static readonly RBRACK = 130; - public static readonly LPAREN = 131; - public static readonly RPAREN = 132; - public static readonly LT = 133; - public static readonly GT = 134; - public static readonly AMP = 135; - public static readonly EQUAL = 136; - public static readonly INTEGER = 137; - public static readonly JSON_NUMBER = 138; - public static readonly IDENTIFIER = 139; - public static readonly STRING_LITERAL = 140; - public static readonly LINE_COMMENT = 141; - public static readonly BLOCK_COMMENT = 142; - public static readonly WS = 143; + public static readonly CREATION = 1; + public static readonly INITIALIZE = 2; + public static readonly WORKSPACE = 3; + public static readonly EXECUTION = 4; + public static readonly SNAPSHOT = 5; + public static readonly TRANSACTION = 6; + public static readonly REMOTE = 7; + public static readonly TARGETS = 8; + public static readonly PORTABLE = 9; + public static readonly REPLICA = 10; + public static readonly LOCAL = 11; + public static readonly FROM = 12; + public static readonly RESULT_BYTES = 13; + public static readonly RPC_CALLS = 14; + public static readonly DEADLINE_MS = 15; + public static readonly QUERY = 16; + public static readonly REFLECTION = 17; + public static readonly SPECIALIZE = 18; + public static readonly ROOT = 19; + public static readonly DOCUMENT = 20; + public static readonly FRAGMENTS = 21; + public static readonly VIEW = 22; + public static readonly MAX = 23; + public static readonly ALLOW = 24; + public static readonly POLL = 25; + public static readonly QUERYABLE = 26; + public static readonly RPC = 27; + public static readonly QUERY_REASON = 28; + public static readonly TYPE = 29; + public static readonly OBJECT = 30; + public static readonly STORABLE = 31; + public static readonly IMPLEMENTS = 32; + public static readonly REF = 33; + public static readonly FRAGMENT = 34; + public static readonly IMPORT = 35; + public static readonly EXTERNAL = 36; + public static readonly ATOM = 37; + public static readonly INTERFACE = 38; + public static readonly INTERFACES = 39; + public static readonly PACKAGE = 40; + public static readonly VALUE = 41; + public static readonly RELATION = 42; + public static readonly OPERATION = 43; + public static readonly FUNCTION = 44; + public static readonly CONSTRUCTOR = 45; + public static readonly CONSTRUCTS = 46; + public static readonly INPUT = 47; + public static readonly CONFORM = 48; + public static readonly AS = 49; + public static readonly BIND = 50; + public static readonly STATIC = 51; + public static readonly TO = 52; + public static readonly PRIVATE = 53; + public static readonly SHARED = 54; + public static readonly STATE = 55; + public static readonly EDGE = 56; + public static readonly PROJECTION = 57; + public static readonly WITH = 58; + public static readonly USING = 59; + public static readonly VIA = 60; + public static readonly MATERIALIZE = 61; + public static readonly IF = 62; + public static readonly ABSENT = 63; + public static readonly ON = 64; + public static readonly POLICY = 65; + public static readonly DEFAULT = 66; + public static readonly SOURCE = 67; + public static readonly REPOSITORY = 68; + public static readonly COMMIT = 69; + public static readonly REVISION = 70; + public static readonly SEMANTIC_MAJOR = 71; + public static readonly ON_DELETE = 72; + public static readonly RETAIN_OTHER = 73; + public static readonly KEYED = 74; + public static readonly PUBLIC_TRAVERSAL = 75; + public static readonly ID = 76; + public static readonly DOC = 77; + public static readonly MODE = 78; + public static readonly EMITS = 79; + public static readonly RECEIVER = 80; + public static readonly REQUIRES = 81; + public static readonly ANY = 82; + public static readonly GET = 83; + public static readonly SET = 84; + public static readonly WATCH = 85; + public static readonly START = 86; + public static readonly STOP = 87; + public static readonly READ = 88; + public static readonly WRITE = 89; + public static readonly RESOLVE = 90; + public static readonly CONNECT = 91; + public static readonly DISCONNECT = 92; + public static readonly CALL = 93; + public static readonly WATCH_START = 94; + public static readonly WATCH_STOP = 95; + public static readonly SUBSCRIBE = 96; + public static readonly UNSUBSCRIBE = 97; + public static readonly REGISTER = 98; + public static readonly CRDT = 99; + public static readonly OPTIONAL_ONE = 100; + public static readonly EXACTLY_ONE = 101; + public static readonly MANY_UNIQUE = 102; + public static readonly MANY = 103; + public static readonly ORDERED = 104; + public static readonly UNIT = 105; + public static readonly WATCH_HANDLE = 106; + public static readonly MESSAGE = 107; + public static readonly ATOM_REF = 108; + public static readonly INTERFACE_REF = 109; + public static readonly OPTIONAL = 110; + public static readonly LIST = 111; + public static readonly RECORD = 112; + public static readonly BOOL = 113; + public static readonly BYTES = 114; + public static readonly DOUBLE = 115; + public static readonly INT32 = 116; + public static readonly INT64 = 117; + public static readonly STRING = 118; + public static readonly UINT32 = 119; + public static readonly UINT64 = 120; + public static readonly TRUE = 121; + public static readonly FALSE = 122; + public static readonly NULL = 123; + public static readonly ARROW = 124; + public static readonly COLON = 125; + public static readonly SEMI = 126; + public static readonly COMMA = 127; + public static readonly DOT = 128; + public static readonly LBRACE = 129; + public static readonly RBRACE = 130; + public static readonly LBRACK = 131; + public static readonly RBRACK = 132; + public static readonly LPAREN = 133; + public static readonly RPAREN = 134; + public static readonly LT = 135; + public static readonly GT = 136; + public static readonly AMP = 137; + public static readonly EQUAL = 138; + public static readonly INTEGER = 139; + public static readonly JSON_NUMBER = 140; + public static readonly IDENTIFIER = 141; + public static readonly STRING_LITERAL = 142; + public static readonly LINE_COMMENT = 143; + public static readonly BLOCK_COMMENT = 144; + public static readonly WS = 145; public static readonly channelNames = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" ]; public static readonly literalNames = [ - null, "'workspace'", "'execution'", "'snapshot'", "'transaction'", - "'remote'", "'targets'", "'portable'", "'replica'", "'local'", "'from'", - "'result-bytes'", "'rpc-calls'", "'deadline-ms'", "'query'", "'reflection'", - "'specialize'", "'root'", "'document'", "'fragments'", "'view'", - "'max'", "'allow'", "'poll'", "'queryable'", "'rpc'", "'query-reason'", - "'type'", "'object'", "'storable'", "'implements'", "'ref'", "'fragment'", - "'import'", "'external'", "'atom'", "'interface'", "'interfaces'", - "'package'", "'value'", "'relation'", "'operation'", "'function'", - "'constructor'", "'constructs'", "'input'", "'conform'", "'as'", - "'bind'", "'static'", "'to'", "'private'", "'shared'", "'state'", - "'edge'", "'projection'", "'with'", "'using'", "'via'", "'materialize'", - "'if'", "'absent'", "'on'", "'policy'", "'default'", "'source'", - "'repository'", "'commit'", "'revision'", "'semantic-major'", "'on-delete'", - "'retain-other'", "'keyed'", "'public-traversal'", "'id'", "'doc'", - "'mode'", "'emits'", "'receiver'", "'requires'", "'any'", "'get'", - "'set'", "'watch'", "'start'", "'stop'", "'read'", "'write'", "'resolve'", - "'connect'", "'disconnect'", "'call'", "'watch-start'", "'watch-stop'", - "'subscribe'", "'unsubscribe'", "'optimistic-register'", "'crdt'", - "'optional-one'", "'exactly-one'", "'many-unique'", "'many'", "'ordered'", - "'unit'", "'watch-handle'", "'message'", "'atom-ref'", "'interface-ref'", - "'optional'", "'list'", "'record'", "'bool'", "'bytes'", "'double'", - "'int32'", "'int64'", "'string'", "'uint32'", "'uint64'", "'true'", - "'false'", "'null'", "'->'", "':'", "';'", "','", "'.'", "'{'", - "'}'", "'['", "']'", "'('", "')'", "'<'", "'>'", "'&'", "'='" + null, "'creation'", "'initialize'", "'workspace'", "'execution'", + "'snapshot'", "'transaction'", "'remote'", "'targets'", "'portable'", + "'replica'", "'local'", "'from'", "'result-bytes'", "'rpc-calls'", + "'deadline-ms'", "'query'", "'reflection'", "'specialize'", "'root'", + "'document'", "'fragments'", "'view'", "'max'", "'allow'", "'poll'", + "'queryable'", "'rpc'", "'query-reason'", "'type'", "'object'", + "'storable'", "'implements'", "'ref'", "'fragment'", "'import'", + "'external'", "'atom'", "'interface'", "'interfaces'", "'package'", + "'value'", "'relation'", "'operation'", "'function'", "'constructor'", + "'constructs'", "'input'", "'conform'", "'as'", "'bind'", "'static'", + "'to'", "'private'", "'shared'", "'state'", "'edge'", "'projection'", + "'with'", "'using'", "'via'", "'materialize'", "'if'", "'absent'", + "'on'", "'policy'", "'default'", "'source'", "'repository'", "'commit'", + "'revision'", "'semantic-major'", "'on-delete'", "'retain-other'", + "'keyed'", "'public-traversal'", "'id'", "'doc'", "'mode'", "'emits'", + "'receiver'", "'requires'", "'any'", "'get'", "'set'", "'watch'", + "'start'", "'stop'", "'read'", "'write'", "'resolve'", "'connect'", + "'disconnect'", "'call'", "'watch-start'", "'watch-stop'", "'subscribe'", + "'unsubscribe'", "'register'", "'crdt'", "'optional-one'", "'exactly-one'", + "'many-unique'", "'many'", "'ordered'", "'unit'", "'watch-handle'", + "'message'", "'atom-ref'", "'interface-ref'", "'optional'", "'list'", + "'record'", "'bool'", "'bytes'", "'double'", "'int32'", "'int64'", + "'string'", "'uint32'", "'uint64'", "'true'", "'false'", "'null'", + "'->'", "':'", "';'", "','", "'.'", "'{'", "'}'", "'['", "']'", + "'('", "')'", "'<'", "'>'", "'&'", "'='" ]; public static readonly symbolicNames = [ - null, "WORKSPACE", "EXECUTION", "SNAPSHOT", "TRANSACTION", "REMOTE", - "TARGETS", "PORTABLE", "REPLICA", "LOCAL", "FROM", "RESULT_BYTES", - "RPC_CALLS", "DEADLINE_MS", "QUERY", "REFLECTION", "SPECIALIZE", - "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", "MAX", "ALLOW", "POLL", - "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", "OBJECT", "STORABLE", + null, "CREATION", "INITIALIZE", "WORKSPACE", "EXECUTION", "SNAPSHOT", + "TRANSACTION", "REMOTE", "TARGETS", "PORTABLE", "REPLICA", "LOCAL", + "FROM", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", "REFLECTION", + "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", "MAX", "ALLOW", + "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", "OBJECT", "STORABLE", "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", @@ -195,7 +198,7 @@ export class QuixosCapabilityLexer extends antlr.Lexer { "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", - "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", + "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", @@ -210,22 +213,22 @@ export class QuixosCapabilityLexer extends antlr.Lexer { ]; public static readonly ruleNames = [ - "WORKSPACE", "EXECUTION", "SNAPSHOT", "TRANSACTION", "REMOTE", "TARGETS", - "PORTABLE", "REPLICA", "LOCAL", "FROM", "RESULT_BYTES", "RPC_CALLS", - "DEADLINE_MS", "QUERY", "REFLECTION", "SPECIALIZE", "ROOT", "DOCUMENT", - "FRAGMENTS", "VIEW", "MAX", "ALLOW", "POLL", "QUERYABLE", "RPC", - "QUERY_REASON", "TYPE", "OBJECT", "STORABLE", "IMPLEMENTS", "REF", - "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", - "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", - "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", - "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", "USING", - "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", + "CREATION", "INITIALIZE", "WORKSPACE", "EXECUTION", "SNAPSHOT", + "TRANSACTION", "REMOTE", "TARGETS", "PORTABLE", "REPLICA", "LOCAL", + "FROM", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", "REFLECTION", + "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", "MAX", "ALLOW", + "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", "OBJECT", "STORABLE", + "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", + "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", + "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", + "TO", "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", + "USING", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", - "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", + "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", @@ -254,7 +257,7 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public get modeNames(): string[] { return QuixosCapabilityLexer.modeNames; } public static readonly _serializedATN: number[] = [ - 4,0,143,1377,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, + 4,0,145,1390,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, @@ -277,487 +280,492 @@ export class QuixosCapabilityLexer extends antlr.Lexer { 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,1,0,1,0,1,0,1,0,1,0,1,0,1,0, - 1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2, - 1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3, - 1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5, - 1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7, - 1,7,1,7,1,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,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,1,11,1, - 11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1, - 12,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1, - 14,1,14,1,14,1,14,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,15,1,15,1,15,1,16,1,16,1,16,1,16,1, - 16,1,17,1,17,1,17,1,17,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,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,21,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,23,1,24,1,24,1, - 24,1,24,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1, - 25,1,25,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,28,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,29,1,29,1,29,1,29,1,29,1,30,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,32,1,32,1,32,1,32,1,32,1, - 32,1,32,1,33,1,33,1,33,1,33,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,35,1,35,1,35,1,35,1,35,1,35,1, - 36,1,36,1,36,1,36,1,36,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,37,1,38,1,38,1,38,1,38,1,38,1,38,1,39,1, - 39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,1, - 40,1,40,1,40,1,40,1,40,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1, - 41,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,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,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,46,1, - 46,1,46,1,47,1,47,1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,48,1,48,1, - 48,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,51,1,51,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,54,1,54,1,54,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,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1, - 58,1,58,1,58,1,59,1,59,1,59,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1, + 2,142,7,142,2,143,7,143,2,144,7,144,2,145,7,145,2,146,7,146,1,0, + 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3, + 1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4, + 1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6, + 1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,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,9,1,9,1,9,1,10,1,10,1,10,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, + 12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1, + 13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,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,16,1,16,1,16,1, + 16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1, + 17,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,18,1,18,1,19,1,19,1, + 19,1,19,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,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, + 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,25,1,25,1,25,1,25,1,25,1,25,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,27,1,27,1,27,1,27,1,27,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,30,1,30,1, + 30,1,30,1,30,1,30,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,31,1,32,1,32,1,32,1,32,1,33,1,33,1,33,1,33,1, + 33,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,35,1, + 35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,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,37,1,37,1,37,1,38,1,38,1,38,1, + 38,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, + 39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,1,40,1,41,1,41,1,41,1,41,1, + 41,1,41,1,41,1,41,1,41,1,42,1,42,1,42,1,42,1,42,1,42,1,42,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,44,1,44,1, + 44,1,44,1,44,1,44,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,45,1,45,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,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,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,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,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,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,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1, 61,1,61,1,61,1,62,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,63,1,64,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,65,1,65,1,65,1,65,1,65,1,66,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,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,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, + 64,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, + 65,1,65,1,66,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,67,1,67,1,67,1,67,1,67,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,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,72,1, - 72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,73,1,73,1,73,1,74,1, - 74,1,74,1,74,1,75,1,75,1,75,1,75,1,75,1,76,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,77,1,77,1,78,1,78,1,78,1, - 78,1,78,1,78,1,78,1,78,1,78,1,79,1,79,1,79,1,79,1,80,1,80,1,80,1, - 80,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,1,82,1,82,1,83,1,83,1, - 83,1,83,1,83,1,83,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,87,1, - 87,1,87,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,89,1,89,1,89,1, - 89,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, - 91,1,91,1,91,1,91,1,91,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,92,1,92,1,93,1,93,1,93,1, - 93,1,93,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,94,1,94,1,94,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1, - 95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1,95,1, - 96,1,96,1,96,1,96,1,96,1,97,1,97,1,97,1,97,1,97,1,97,1,97,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,98,1,98,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,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,74,1,74,1,74,1,74,1, + 74,1,74,1,74,1,74,1,74,1,74,1,75,1,75,1,75,1,76,1,76,1,76,1,76,1, + 77,1,77,1,77,1,77,1,77,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,79,1,79,1,80,1,80,1,80,1,80,1,80,1,80,1, + 80,1,80,1,80,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,1,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, + 85,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,89,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,91,1,91,1,91,1,91,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,93,1,93,1,93,1, + 93,1,93,1,93,1,93,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,94,1,94,1,95,1,95,1,95,1,95,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,96,1,96,1,96,1, + 96,1,96,1,96,1,97,1,97,1,97,1,97,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,99,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,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,1,103,1,103,1,103, - 1,104,1,104,1,104,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,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,107,1,107, - 1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,108,1,108,1,108,1,108, - 1,108,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,110,1,110,1,110, - 1,110,1,110,1,111,1,111,1,111,1,111,1,111,1,111,1,112,1,112,1,112, - 1,112,1,112,1,112,1,112,1,113,1,113,1,113,1,113,1,113,1,113,1,114, - 1,114,1,114,1,114,1,114,1,114,1,115,1,115,1,115,1,115,1,115,1,115, - 1,115,1,116,1,116,1,116,1,116,1,116,1,116,1,116,1,117,1,117,1,117, - 1,117,1,117,1,117,1,117,1,118,1,118,1,118,1,118,1,118,1,119,1,119, - 1,119,1,119,1,119,1,119,1,120,1,120,1,120,1,120,1,120,1,121,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,3,136,1278,8,136, - 1,136,4,136,1281,8,136,11,136,12,136,1282,1,137,3,137,1286,8,137, - 1,137,1,137,1,137,5,137,1291,8,137,10,137,12,137,1294,9,137,3,137, - 1296,8,137,1,137,1,137,4,137,1300,8,137,11,137,12,137,1301,3,137, - 1304,8,137,1,137,1,137,3,137,1308,8,137,1,137,4,137,1311,8,137,11, - 137,12,137,1312,3,137,1315,8,137,1,138,1,138,5,138,1319,8,138,10, - 138,12,138,1322,9,138,1,139,1,139,1,139,5,139,1327,8,139,10,139, - 12,139,1330,9,139,1,139,1,139,1,140,1,140,1,140,1,140,1,140,1,140, - 1,140,1,140,3,140,1342,8,140,1,141,1,141,1,142,1,142,1,142,1,142, - 5,142,1350,8,142,10,142,12,142,1353,9,142,1,142,1,142,1,143,1,143, - 1,143,1,143,5,143,1361,8,143,10,143,12,143,1364,9,143,1,143,1,143, - 1,143,1,143,1,143,1,144,4,144,1372,8,144,11,144,12,144,1373,1,144, - 1,144,1,1362,0,145,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10, - 21,11,23,12,25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21, - 43,22,45,23,47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32, - 65,33,67,34,69,35,71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43, - 87,44,89,45,91,46,93,47,95,48,97,49,99,50,101,51,103,52,105,53,107, - 54,109,55,111,56,113,57,115,58,117,59,119,60,121,61,123,62,125,63, - 127,64,129,65,131,66,133,67,135,68,137,69,139,70,141,71,143,72,145, - 73,147,74,149,75,151,76,153,77,155,78,157,79,159,80,161,81,163,82, - 165,83,167,84,169,85,171,86,173,87,175,88,177,89,179,90,181,91,183, - 92,185,93,187,94,189,95,191,96,193,97,195,98,197,99,199,100,201, - 101,203,102,205,103,207,104,209,105,211,106,213,107,215,108,217, - 109,219,110,221,111,223,112,225,113,227,114,229,115,231,116,233, - 117,235,118,237,119,239,120,241,121,243,122,245,123,247,124,249, - 125,251,126,253,127,255,128,257,129,259,130,261,131,263,132,265, - 133,267,134,269,135,271,136,273,137,275,138,277,139,279,140,281, - 0,283,0,285,141,287,142,289,143,1,0,11,1,0,48,57,1,0,49,57,2,0,69, - 69,101,101,2,0,43,43,45,45,3,0,65,90,95,95,97,122,4,0,48,57,65,90, - 95,95,97,122,4,0,10,10,13,13,34,34,92,92,8,0,34,34,47,47,92,92,98, - 98,102,102,110,110,114,114,116,116,3,0,48,57,65,70,97,102,2,0,10, - 10,13,13,3,0,9,10,13,13,32,32,1391,0,1,1,0,0,0,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,229,1,0,0,0,0,231,1,0,0,0,0,233,1,0, - 0,0,0,235,1,0,0,0,0,237,1,0,0,0,0,239,1,0,0,0,0,241,1,0,0,0,0,243, - 1,0,0,0,0,245,1,0,0,0,0,247,1,0,0,0,0,249,1,0,0,0,0,251,1,0,0,0, - 0,253,1,0,0,0,0,255,1,0,0,0,0,257,1,0,0,0,0,259,1,0,0,0,0,261,1, - 0,0,0,0,263,1,0,0,0,0,265,1,0,0,0,0,267,1,0,0,0,0,269,1,0,0,0,0, - 271,1,0,0,0,0,273,1,0,0,0,0,275,1,0,0,0,0,277,1,0,0,0,0,279,1,0, - 0,0,0,285,1,0,0,0,0,287,1,0,0,0,0,289,1,0,0,0,1,291,1,0,0,0,3,301, - 1,0,0,0,5,311,1,0,0,0,7,320,1,0,0,0,9,332,1,0,0,0,11,339,1,0,0,0, - 13,347,1,0,0,0,15,356,1,0,0,0,17,364,1,0,0,0,19,370,1,0,0,0,21,375, - 1,0,0,0,23,388,1,0,0,0,25,398,1,0,0,0,27,410,1,0,0,0,29,416,1,0, - 0,0,31,427,1,0,0,0,33,438,1,0,0,0,35,443,1,0,0,0,37,452,1,0,0,0, - 39,462,1,0,0,0,41,467,1,0,0,0,43,471,1,0,0,0,45,477,1,0,0,0,47,482, - 1,0,0,0,49,492,1,0,0,0,51,496,1,0,0,0,53,509,1,0,0,0,55,514,1,0, - 0,0,57,521,1,0,0,0,59,530,1,0,0,0,61,541,1,0,0,0,63,545,1,0,0,0, - 65,554,1,0,0,0,67,561,1,0,0,0,69,570,1,0,0,0,71,575,1,0,0,0,73,585, - 1,0,0,0,75,596,1,0,0,0,77,604,1,0,0,0,79,610,1,0,0,0,81,619,1,0, - 0,0,83,629,1,0,0,0,85,638,1,0,0,0,87,650,1,0,0,0,89,661,1,0,0,0, - 91,667,1,0,0,0,93,675,1,0,0,0,95,678,1,0,0,0,97,683,1,0,0,0,99,690, - 1,0,0,0,101,693,1,0,0,0,103,701,1,0,0,0,105,708,1,0,0,0,107,714, - 1,0,0,0,109,719,1,0,0,0,111,730,1,0,0,0,113,735,1,0,0,0,115,741, - 1,0,0,0,117,745,1,0,0,0,119,757,1,0,0,0,121,760,1,0,0,0,123,767, - 1,0,0,0,125,770,1,0,0,0,127,777,1,0,0,0,129,785,1,0,0,0,131,792, - 1,0,0,0,133,803,1,0,0,0,135,810,1,0,0,0,137,819,1,0,0,0,139,834, - 1,0,0,0,141,844,1,0,0,0,143,857,1,0,0,0,145,863,1,0,0,0,147,880, - 1,0,0,0,149,883,1,0,0,0,151,887,1,0,0,0,153,892,1,0,0,0,155,898, - 1,0,0,0,157,907,1,0,0,0,159,916,1,0,0,0,161,920,1,0,0,0,163,924, - 1,0,0,0,165,928,1,0,0,0,167,934,1,0,0,0,169,940,1,0,0,0,171,945, - 1,0,0,0,173,950,1,0,0,0,175,956,1,0,0,0,177,964,1,0,0,0,179,972, - 1,0,0,0,181,983,1,0,0,0,183,988,1,0,0,0,185,1000,1,0,0,0,187,1011, - 1,0,0,0,189,1021,1,0,0,0,191,1033,1,0,0,0,193,1053,1,0,0,0,195,1058, - 1,0,0,0,197,1071,1,0,0,0,199,1083,1,0,0,0,201,1095,1,0,0,0,203,1100, - 1,0,0,0,205,1108,1,0,0,0,207,1113,1,0,0,0,209,1126,1,0,0,0,211,1134, - 1,0,0,0,213,1143,1,0,0,0,215,1157,1,0,0,0,217,1166,1,0,0,0,219,1171, - 1,0,0,0,221,1178,1,0,0,0,223,1183,1,0,0,0,225,1189,1,0,0,0,227,1196, - 1,0,0,0,229,1202,1,0,0,0,231,1208,1,0,0,0,233,1215,1,0,0,0,235,1222, - 1,0,0,0,237,1229,1,0,0,0,239,1234,1,0,0,0,241,1240,1,0,0,0,243,1245, - 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,1277,1,0,0,0,275,1285, - 1,0,0,0,277,1316,1,0,0,0,279,1323,1,0,0,0,281,1333,1,0,0,0,283,1343, - 1,0,0,0,285,1345,1,0,0,0,287,1356,1,0,0,0,289,1371,1,0,0,0,291,292, - 5,119,0,0,292,293,5,111,0,0,293,294,5,114,0,0,294,295,5,107,0,0, - 295,296,5,115,0,0,296,297,5,112,0,0,297,298,5,97,0,0,298,299,5,99, - 0,0,299,300,5,101,0,0,300,2,1,0,0,0,301,302,5,101,0,0,302,303,5, - 120,0,0,303,304,5,101,0,0,304,305,5,99,0,0,305,306,5,117,0,0,306, - 307,5,116,0,0,307,308,5,105,0,0,308,309,5,111,0,0,309,310,5,110, - 0,0,310,4,1,0,0,0,311,312,5,115,0,0,312,313,5,110,0,0,313,314,5, - 97,0,0,314,315,5,112,0,0,315,316,5,115,0,0,316,317,5,104,0,0,317, - 318,5,111,0,0,318,319,5,116,0,0,319,6,1,0,0,0,320,321,5,116,0,0, - 321,322,5,114,0,0,322,323,5,97,0,0,323,324,5,110,0,0,324,325,5,115, - 0,0,325,326,5,97,0,0,326,327,5,99,0,0,327,328,5,116,0,0,328,329, - 5,105,0,0,329,330,5,111,0,0,330,331,5,110,0,0,331,8,1,0,0,0,332, - 333,5,114,0,0,333,334,5,101,0,0,334,335,5,109,0,0,335,336,5,111, - 0,0,336,337,5,116,0,0,337,338,5,101,0,0,338,10,1,0,0,0,339,340,5, - 116,0,0,340,341,5,97,0,0,341,342,5,114,0,0,342,343,5,103,0,0,343, - 344,5,101,0,0,344,345,5,116,0,0,345,346,5,115,0,0,346,12,1,0,0,0, - 347,348,5,112,0,0,348,349,5,111,0,0,349,350,5,114,0,0,350,351,5, - 116,0,0,351,352,5,97,0,0,352,353,5,98,0,0,353,354,5,108,0,0,354, - 355,5,101,0,0,355,14,1,0,0,0,356,357,5,114,0,0,357,358,5,101,0,0, - 358,359,5,112,0,0,359,360,5,108,0,0,360,361,5,105,0,0,361,362,5, - 99,0,0,362,363,5,97,0,0,363,16,1,0,0,0,364,365,5,108,0,0,365,366, - 5,111,0,0,366,367,5,99,0,0,367,368,5,97,0,0,368,369,5,108,0,0,369, - 18,1,0,0,0,370,371,5,102,0,0,371,372,5,114,0,0,372,373,5,111,0,0, - 373,374,5,109,0,0,374,20,1,0,0,0,375,376,5,114,0,0,376,377,5,101, - 0,0,377,378,5,115,0,0,378,379,5,117,0,0,379,380,5,108,0,0,380,381, - 5,116,0,0,381,382,5,45,0,0,382,383,5,98,0,0,383,384,5,121,0,0,384, - 385,5,116,0,0,385,386,5,101,0,0,386,387,5,115,0,0,387,22,1,0,0,0, - 388,389,5,114,0,0,389,390,5,112,0,0,390,391,5,99,0,0,391,392,5,45, - 0,0,392,393,5,99,0,0,393,394,5,97,0,0,394,395,5,108,0,0,395,396, - 5,108,0,0,396,397,5,115,0,0,397,24,1,0,0,0,398,399,5,100,0,0,399, - 400,5,101,0,0,400,401,5,97,0,0,401,402,5,100,0,0,402,403,5,108,0, - 0,403,404,5,105,0,0,404,405,5,110,0,0,405,406,5,101,0,0,406,407, - 5,45,0,0,407,408,5,109,0,0,408,409,5,115,0,0,409,26,1,0,0,0,410, - 411,5,113,0,0,411,412,5,117,0,0,412,413,5,101,0,0,413,414,5,114, - 0,0,414,415,5,121,0,0,415,28,1,0,0,0,416,417,5,114,0,0,417,418,5, - 101,0,0,418,419,5,102,0,0,419,420,5,108,0,0,420,421,5,101,0,0,421, - 422,5,99,0,0,422,423,5,116,0,0,423,424,5,105,0,0,424,425,5,111,0, - 0,425,426,5,110,0,0,426,30,1,0,0,0,427,428,5,115,0,0,428,429,5,112, - 0,0,429,430,5,101,0,0,430,431,5,99,0,0,431,432,5,105,0,0,432,433, - 5,97,0,0,433,434,5,108,0,0,434,435,5,105,0,0,435,436,5,122,0,0,436, - 437,5,101,0,0,437,32,1,0,0,0,438,439,5,114,0,0,439,440,5,111,0,0, - 440,441,5,111,0,0,441,442,5,116,0,0,442,34,1,0,0,0,443,444,5,100, - 0,0,444,445,5,111,0,0,445,446,5,99,0,0,446,447,5,117,0,0,447,448, - 5,109,0,0,448,449,5,101,0,0,449,450,5,110,0,0,450,451,5,116,0,0, - 451,36,1,0,0,0,452,453,5,102,0,0,453,454,5,114,0,0,454,455,5,97, - 0,0,455,456,5,103,0,0,456,457,5,109,0,0,457,458,5,101,0,0,458,459, - 5,110,0,0,459,460,5,116,0,0,460,461,5,115,0,0,461,38,1,0,0,0,462, - 463,5,118,0,0,463,464,5,105,0,0,464,465,5,101,0,0,465,466,5,119, - 0,0,466,40,1,0,0,0,467,468,5,109,0,0,468,469,5,97,0,0,469,470,5, - 120,0,0,470,42,1,0,0,0,471,472,5,97,0,0,472,473,5,108,0,0,473,474, - 5,108,0,0,474,475,5,111,0,0,475,476,5,119,0,0,476,44,1,0,0,0,477, - 478,5,112,0,0,478,479,5,111,0,0,479,480,5,108,0,0,480,481,5,108, - 0,0,481,46,1,0,0,0,482,483,5,113,0,0,483,484,5,117,0,0,484,485,5, - 101,0,0,485,486,5,114,0,0,486,487,5,121,0,0,487,488,5,97,0,0,488, - 489,5,98,0,0,489,490,5,108,0,0,490,491,5,101,0,0,491,48,1,0,0,0, - 492,493,5,114,0,0,493,494,5,112,0,0,494,495,5,99,0,0,495,50,1,0, - 0,0,496,497,5,113,0,0,497,498,5,117,0,0,498,499,5,101,0,0,499,500, - 5,114,0,0,500,501,5,121,0,0,501,502,5,45,0,0,502,503,5,114,0,0,503, - 504,5,101,0,0,504,505,5,97,0,0,505,506,5,115,0,0,506,507,5,111,0, - 0,507,508,5,110,0,0,508,52,1,0,0,0,509,510,5,116,0,0,510,511,5,121, - 0,0,511,512,5,112,0,0,512,513,5,101,0,0,513,54,1,0,0,0,514,515,5, - 111,0,0,515,516,5,98,0,0,516,517,5,106,0,0,517,518,5,101,0,0,518, - 519,5,99,0,0,519,520,5,116,0,0,520,56,1,0,0,0,521,522,5,115,0,0, - 522,523,5,116,0,0,523,524,5,111,0,0,524,525,5,114,0,0,525,526,5, - 97,0,0,526,527,5,98,0,0,527,528,5,108,0,0,528,529,5,101,0,0,529, - 58,1,0,0,0,530,531,5,105,0,0,531,532,5,109,0,0,532,533,5,112,0,0, - 533,534,5,108,0,0,534,535,5,101,0,0,535,536,5,109,0,0,536,537,5, - 101,0,0,537,538,5,110,0,0,538,539,5,116,0,0,539,540,5,115,0,0,540, - 60,1,0,0,0,541,542,5,114,0,0,542,543,5,101,0,0,543,544,5,102,0,0, - 544,62,1,0,0,0,545,546,5,102,0,0,546,547,5,114,0,0,547,548,5,97, - 0,0,548,549,5,103,0,0,549,550,5,109,0,0,550,551,5,101,0,0,551,552, - 5,110,0,0,552,553,5,116,0,0,553,64,1,0,0,0,554,555,5,105,0,0,555, - 556,5,109,0,0,556,557,5,112,0,0,557,558,5,111,0,0,558,559,5,114, - 0,0,559,560,5,116,0,0,560,66,1,0,0,0,561,562,5,101,0,0,562,563,5, - 120,0,0,563,564,5,116,0,0,564,565,5,101,0,0,565,566,5,114,0,0,566, - 567,5,110,0,0,567,568,5,97,0,0,568,569,5,108,0,0,569,68,1,0,0,0, - 570,571,5,97,0,0,571,572,5,116,0,0,572,573,5,111,0,0,573,574,5,109, - 0,0,574,70,1,0,0,0,575,576,5,105,0,0,576,577,5,110,0,0,577,578,5, - 116,0,0,578,579,5,101,0,0,579,580,5,114,0,0,580,581,5,102,0,0,581, - 582,5,97,0,0,582,583,5,99,0,0,583,584,5,101,0,0,584,72,1,0,0,0,585, - 586,5,105,0,0,586,587,5,110,0,0,587,588,5,116,0,0,588,589,5,101, - 0,0,589,590,5,114,0,0,590,591,5,102,0,0,591,592,5,97,0,0,592,593, - 5,99,0,0,593,594,5,101,0,0,594,595,5,115,0,0,595,74,1,0,0,0,596, - 597,5,112,0,0,597,598,5,97,0,0,598,599,5,99,0,0,599,600,5,107,0, - 0,600,601,5,97,0,0,601,602,5,103,0,0,602,603,5,101,0,0,603,76,1, - 0,0,0,604,605,5,118,0,0,605,606,5,97,0,0,606,607,5,108,0,0,607,608, - 5,117,0,0,608,609,5,101,0,0,609,78,1,0,0,0,610,611,5,114,0,0,611, - 612,5,101,0,0,612,613,5,108,0,0,613,614,5,97,0,0,614,615,5,116,0, - 0,615,616,5,105,0,0,616,617,5,111,0,0,617,618,5,110,0,0,618,80,1, - 0,0,0,619,620,5,111,0,0,620,621,5,112,0,0,621,622,5,101,0,0,622, - 623,5,114,0,0,623,624,5,97,0,0,624,625,5,116,0,0,625,626,5,105,0, - 0,626,627,5,111,0,0,627,628,5,110,0,0,628,82,1,0,0,0,629,630,5,102, - 0,0,630,631,5,117,0,0,631,632,5,110,0,0,632,633,5,99,0,0,633,634, - 5,116,0,0,634,635,5,105,0,0,635,636,5,111,0,0,636,637,5,110,0,0, - 637,84,1,0,0,0,638,639,5,99,0,0,639,640,5,111,0,0,640,641,5,110, - 0,0,641,642,5,115,0,0,642,643,5,116,0,0,643,644,5,114,0,0,644,645, - 5,117,0,0,645,646,5,99,0,0,646,647,5,116,0,0,647,648,5,111,0,0,648, - 649,5,114,0,0,649,86,1,0,0,0,650,651,5,99,0,0,651,652,5,111,0,0, - 652,653,5,110,0,0,653,654,5,115,0,0,654,655,5,116,0,0,655,656,5, - 114,0,0,656,657,5,117,0,0,657,658,5,99,0,0,658,659,5,116,0,0,659, - 660,5,115,0,0,660,88,1,0,0,0,661,662,5,105,0,0,662,663,5,110,0,0, - 663,664,5,112,0,0,664,665,5,117,0,0,665,666,5,116,0,0,666,90,1,0, - 0,0,667,668,5,99,0,0,668,669,5,111,0,0,669,670,5,110,0,0,670,671, - 5,102,0,0,671,672,5,111,0,0,672,673,5,114,0,0,673,674,5,109,0,0, - 674,92,1,0,0,0,675,676,5,97,0,0,676,677,5,115,0,0,677,94,1,0,0,0, - 678,679,5,98,0,0,679,680,5,105,0,0,680,681,5,110,0,0,681,682,5,100, - 0,0,682,96,1,0,0,0,683,684,5,115,0,0,684,685,5,116,0,0,685,686,5, - 97,0,0,686,687,5,116,0,0,687,688,5,105,0,0,688,689,5,99,0,0,689, - 98,1,0,0,0,690,691,5,116,0,0,691,692,5,111,0,0,692,100,1,0,0,0,693, - 694,5,112,0,0,694,695,5,114,0,0,695,696,5,105,0,0,696,697,5,118, - 0,0,697,698,5,97,0,0,698,699,5,116,0,0,699,700,5,101,0,0,700,102, - 1,0,0,0,701,702,5,115,0,0,702,703,5,104,0,0,703,704,5,97,0,0,704, - 705,5,114,0,0,705,706,5,101,0,0,706,707,5,100,0,0,707,104,1,0,0, - 0,708,709,5,115,0,0,709,710,5,116,0,0,710,711,5,97,0,0,711,712,5, - 116,0,0,712,713,5,101,0,0,713,106,1,0,0,0,714,715,5,101,0,0,715, - 716,5,100,0,0,716,717,5,103,0,0,717,718,5,101,0,0,718,108,1,0,0, - 0,719,720,5,112,0,0,720,721,5,114,0,0,721,722,5,111,0,0,722,723, - 5,106,0,0,723,724,5,101,0,0,724,725,5,99,0,0,725,726,5,116,0,0,726, - 727,5,105,0,0,727,728,5,111,0,0,728,729,5,110,0,0,729,110,1,0,0, - 0,730,731,5,119,0,0,731,732,5,105,0,0,732,733,5,116,0,0,733,734, - 5,104,0,0,734,112,1,0,0,0,735,736,5,117,0,0,736,737,5,115,0,0,737, - 738,5,105,0,0,738,739,5,110,0,0,739,740,5,103,0,0,740,114,1,0,0, - 0,741,742,5,118,0,0,742,743,5,105,0,0,743,744,5,97,0,0,744,116,1, - 0,0,0,745,746,5,109,0,0,746,747,5,97,0,0,747,748,5,116,0,0,748,749, - 5,101,0,0,749,750,5,114,0,0,750,751,5,105,0,0,751,752,5,97,0,0,752, - 753,5,108,0,0,753,754,5,105,0,0,754,755,5,122,0,0,755,756,5,101, - 0,0,756,118,1,0,0,0,757,758,5,105,0,0,758,759,5,102,0,0,759,120, - 1,0,0,0,760,761,5,97,0,0,761,762,5,98,0,0,762,763,5,115,0,0,763, - 764,5,101,0,0,764,765,5,110,0,0,765,766,5,116,0,0,766,122,1,0,0, - 0,767,768,5,111,0,0,768,769,5,110,0,0,769,124,1,0,0,0,770,771,5, - 112,0,0,771,772,5,111,0,0,772,773,5,108,0,0,773,774,5,105,0,0,774, - 775,5,99,0,0,775,776,5,121,0,0,776,126,1,0,0,0,777,778,5,100,0,0, - 778,779,5,101,0,0,779,780,5,102,0,0,780,781,5,97,0,0,781,782,5,117, - 0,0,782,783,5,108,0,0,783,784,5,116,0,0,784,128,1,0,0,0,785,786, - 5,115,0,0,786,787,5,111,0,0,787,788,5,117,0,0,788,789,5,114,0,0, - 789,790,5,99,0,0,790,791,5,101,0,0,791,130,1,0,0,0,792,793,5,114, - 0,0,793,794,5,101,0,0,794,795,5,112,0,0,795,796,5,111,0,0,796,797, - 5,115,0,0,797,798,5,105,0,0,798,799,5,116,0,0,799,800,5,111,0,0, - 800,801,5,114,0,0,801,802,5,121,0,0,802,132,1,0,0,0,803,804,5,99, - 0,0,804,805,5,111,0,0,805,806,5,109,0,0,806,807,5,109,0,0,807,808, - 5,105,0,0,808,809,5,116,0,0,809,134,1,0,0,0,810,811,5,114,0,0,811, - 812,5,101,0,0,812,813,5,118,0,0,813,814,5,105,0,0,814,815,5,115, - 0,0,815,816,5,105,0,0,816,817,5,111,0,0,817,818,5,110,0,0,818,136, - 1,0,0,0,819,820,5,115,0,0,820,821,5,101,0,0,821,822,5,109,0,0,822, - 823,5,97,0,0,823,824,5,110,0,0,824,825,5,116,0,0,825,826,5,105,0, - 0,826,827,5,99,0,0,827,828,5,45,0,0,828,829,5,109,0,0,829,830,5, - 97,0,0,830,831,5,106,0,0,831,832,5,111,0,0,832,833,5,114,0,0,833, - 138,1,0,0,0,834,835,5,111,0,0,835,836,5,110,0,0,836,837,5,45,0,0, - 837,838,5,100,0,0,838,839,5,101,0,0,839,840,5,108,0,0,840,841,5, - 101,0,0,841,842,5,116,0,0,842,843,5,101,0,0,843,140,1,0,0,0,844, - 845,5,114,0,0,845,846,5,101,0,0,846,847,5,116,0,0,847,848,5,97,0, - 0,848,849,5,105,0,0,849,850,5,110,0,0,850,851,5,45,0,0,851,852,5, - 111,0,0,852,853,5,116,0,0,853,854,5,104,0,0,854,855,5,101,0,0,855, - 856,5,114,0,0,856,142,1,0,0,0,857,858,5,107,0,0,858,859,5,101,0, - 0,859,860,5,121,0,0,860,861,5,101,0,0,861,862,5,100,0,0,862,144, - 1,0,0,0,863,864,5,112,0,0,864,865,5,117,0,0,865,866,5,98,0,0,866, - 867,5,108,0,0,867,868,5,105,0,0,868,869,5,99,0,0,869,870,5,45,0, - 0,870,871,5,116,0,0,871,872,5,114,0,0,872,873,5,97,0,0,873,874,5, - 118,0,0,874,875,5,101,0,0,875,876,5,114,0,0,876,877,5,115,0,0,877, - 878,5,97,0,0,878,879,5,108,0,0,879,146,1,0,0,0,880,881,5,105,0,0, - 881,882,5,100,0,0,882,148,1,0,0,0,883,884,5,100,0,0,884,885,5,111, - 0,0,885,886,5,99,0,0,886,150,1,0,0,0,887,888,5,109,0,0,888,889,5, - 111,0,0,889,890,5,100,0,0,890,891,5,101,0,0,891,152,1,0,0,0,892, - 893,5,101,0,0,893,894,5,109,0,0,894,895,5,105,0,0,895,896,5,116, - 0,0,896,897,5,115,0,0,897,154,1,0,0,0,898,899,5,114,0,0,899,900, - 5,101,0,0,900,901,5,99,0,0,901,902,5,101,0,0,902,903,5,105,0,0,903, - 904,5,118,0,0,904,905,5,101,0,0,905,906,5,114,0,0,906,156,1,0,0, - 0,907,908,5,114,0,0,908,909,5,101,0,0,909,910,5,113,0,0,910,911, - 5,117,0,0,911,912,5,105,0,0,912,913,5,114,0,0,913,914,5,101,0,0, - 914,915,5,115,0,0,915,158,1,0,0,0,916,917,5,97,0,0,917,918,5,110, - 0,0,918,919,5,121,0,0,919,160,1,0,0,0,920,921,5,103,0,0,921,922, - 5,101,0,0,922,923,5,116,0,0,923,162,1,0,0,0,924,925,5,115,0,0,925, - 926,5,101,0,0,926,927,5,116,0,0,927,164,1,0,0,0,928,929,5,119,0, - 0,929,930,5,97,0,0,930,931,5,116,0,0,931,932,5,99,0,0,932,933,5, - 104,0,0,933,166,1,0,0,0,934,935,5,115,0,0,935,936,5,116,0,0,936, - 937,5,97,0,0,937,938,5,114,0,0,938,939,5,116,0,0,939,168,1,0,0,0, - 940,941,5,115,0,0,941,942,5,116,0,0,942,943,5,111,0,0,943,944,5, - 112,0,0,944,170,1,0,0,0,945,946,5,114,0,0,946,947,5,101,0,0,947, - 948,5,97,0,0,948,949,5,100,0,0,949,172,1,0,0,0,950,951,5,119,0,0, - 951,952,5,114,0,0,952,953,5,105,0,0,953,954,5,116,0,0,954,955,5, - 101,0,0,955,174,1,0,0,0,956,957,5,114,0,0,957,958,5,101,0,0,958, - 959,5,115,0,0,959,960,5,111,0,0,960,961,5,108,0,0,961,962,5,118, - 0,0,962,963,5,101,0,0,963,176,1,0,0,0,964,965,5,99,0,0,965,966,5, - 111,0,0,966,967,5,110,0,0,967,968,5,110,0,0,968,969,5,101,0,0,969, - 970,5,99,0,0,970,971,5,116,0,0,971,178,1,0,0,0,972,973,5,100,0,0, - 973,974,5,105,0,0,974,975,5,115,0,0,975,976,5,99,0,0,976,977,5,111, - 0,0,977,978,5,110,0,0,978,979,5,110,0,0,979,980,5,101,0,0,980,981, - 5,99,0,0,981,982,5,116,0,0,982,180,1,0,0,0,983,984,5,99,0,0,984, - 985,5,97,0,0,985,986,5,108,0,0,986,987,5,108,0,0,987,182,1,0,0,0, - 988,989,5,119,0,0,989,990,5,97,0,0,990,991,5,116,0,0,991,992,5,99, - 0,0,992,993,5,104,0,0,993,994,5,45,0,0,994,995,5,115,0,0,995,996, - 5,116,0,0,996,997,5,97,0,0,997,998,5,114,0,0,998,999,5,116,0,0,999, - 184,1,0,0,0,1000,1001,5,119,0,0,1001,1002,5,97,0,0,1002,1003,5,116, - 0,0,1003,1004,5,99,0,0,1004,1005,5,104,0,0,1005,1006,5,45,0,0,1006, - 1007,5,115,0,0,1007,1008,5,116,0,0,1008,1009,5,111,0,0,1009,1010, - 5,112,0,0,1010,186,1,0,0,0,1011,1012,5,115,0,0,1012,1013,5,117,0, - 0,1013,1014,5,98,0,0,1014,1015,5,115,0,0,1015,1016,5,99,0,0,1016, - 1017,5,114,0,0,1017,1018,5,105,0,0,1018,1019,5,98,0,0,1019,1020, - 5,101,0,0,1020,188,1,0,0,0,1021,1022,5,117,0,0,1022,1023,5,110,0, - 0,1023,1024,5,115,0,0,1024,1025,5,117,0,0,1025,1026,5,98,0,0,1026, - 1027,5,115,0,0,1027,1028,5,99,0,0,1028,1029,5,114,0,0,1029,1030, - 5,105,0,0,1030,1031,5,98,0,0,1031,1032,5,101,0,0,1032,190,1,0,0, - 0,1033,1034,5,111,0,0,1034,1035,5,112,0,0,1035,1036,5,116,0,0,1036, - 1037,5,105,0,0,1037,1038,5,109,0,0,1038,1039,5,105,0,0,1039,1040, - 5,115,0,0,1040,1041,5,116,0,0,1041,1042,5,105,0,0,1042,1043,5,99, - 0,0,1043,1044,5,45,0,0,1044,1045,5,114,0,0,1045,1046,5,101,0,0,1046, - 1047,5,103,0,0,1047,1048,5,105,0,0,1048,1049,5,115,0,0,1049,1050, - 5,116,0,0,1050,1051,5,101,0,0,1051,1052,5,114,0,0,1052,192,1,0,0, - 0,1053,1054,5,99,0,0,1054,1055,5,114,0,0,1055,1056,5,100,0,0,1056, - 1057,5,116,0,0,1057,194,1,0,0,0,1058,1059,5,111,0,0,1059,1060,5, - 112,0,0,1060,1061,5,116,0,0,1061,1062,5,105,0,0,1062,1063,5,111, - 0,0,1063,1064,5,110,0,0,1064,1065,5,97,0,0,1065,1066,5,108,0,0,1066, - 1067,5,45,0,0,1067,1068,5,111,0,0,1068,1069,5,110,0,0,1069,1070, - 5,101,0,0,1070,196,1,0,0,0,1071,1072,5,101,0,0,1072,1073,5,120,0, - 0,1073,1074,5,97,0,0,1074,1075,5,99,0,0,1075,1076,5,116,0,0,1076, - 1077,5,108,0,0,1077,1078,5,121,0,0,1078,1079,5,45,0,0,1079,1080, - 5,111,0,0,1080,1081,5,110,0,0,1081,1082,5,101,0,0,1082,198,1,0,0, - 0,1083,1084,5,109,0,0,1084,1085,5,97,0,0,1085,1086,5,110,0,0,1086, - 1087,5,121,0,0,1087,1088,5,45,0,0,1088,1089,5,117,0,0,1089,1090, - 5,110,0,0,1090,1091,5,105,0,0,1091,1092,5,113,0,0,1092,1093,5,117, - 0,0,1093,1094,5,101,0,0,1094,200,1,0,0,0,1095,1096,5,109,0,0,1096, - 1097,5,97,0,0,1097,1098,5,110,0,0,1098,1099,5,121,0,0,1099,202,1, - 0,0,0,1100,1101,5,111,0,0,1101,1102,5,114,0,0,1102,1103,5,100,0, - 0,1103,1104,5,101,0,0,1104,1105,5,114,0,0,1105,1106,5,101,0,0,1106, - 1107,5,100,0,0,1107,204,1,0,0,0,1108,1109,5,117,0,0,1109,1110,5, - 110,0,0,1110,1111,5,105,0,0,1111,1112,5,116,0,0,1112,206,1,0,0,0, - 1113,1114,5,119,0,0,1114,1115,5,97,0,0,1115,1116,5,116,0,0,1116, - 1117,5,99,0,0,1117,1118,5,104,0,0,1118,1119,5,45,0,0,1119,1120,5, - 104,0,0,1120,1121,5,97,0,0,1121,1122,5,110,0,0,1122,1123,5,100,0, - 0,1123,1124,5,108,0,0,1124,1125,5,101,0,0,1125,208,1,0,0,0,1126, - 1127,5,109,0,0,1127,1128,5,101,0,0,1128,1129,5,115,0,0,1129,1130, - 5,115,0,0,1130,1131,5,97,0,0,1131,1132,5,103,0,0,1132,1133,5,101, - 0,0,1133,210,1,0,0,0,1134,1135,5,97,0,0,1135,1136,5,116,0,0,1136, - 1137,5,111,0,0,1137,1138,5,109,0,0,1138,1139,5,45,0,0,1139,1140, - 5,114,0,0,1140,1141,5,101,0,0,1141,1142,5,102,0,0,1142,212,1,0,0, - 0,1143,1144,5,105,0,0,1144,1145,5,110,0,0,1145,1146,5,116,0,0,1146, - 1147,5,101,0,0,1147,1148,5,114,0,0,1148,1149,5,102,0,0,1149,1150, - 5,97,0,0,1150,1151,5,99,0,0,1151,1152,5,101,0,0,1152,1153,5,45,0, - 0,1153,1154,5,114,0,0,1154,1155,5,101,0,0,1155,1156,5,102,0,0,1156, - 214,1,0,0,0,1157,1158,5,111,0,0,1158,1159,5,112,0,0,1159,1160,5, - 116,0,0,1160,1161,5,105,0,0,1161,1162,5,111,0,0,1162,1163,5,110, - 0,0,1163,1164,5,97,0,0,1164,1165,5,108,0,0,1165,216,1,0,0,0,1166, - 1167,5,108,0,0,1167,1168,5,105,0,0,1168,1169,5,115,0,0,1169,1170, - 5,116,0,0,1170,218,1,0,0,0,1171,1172,5,114,0,0,1172,1173,5,101,0, - 0,1173,1174,5,99,0,0,1174,1175,5,111,0,0,1175,1176,5,114,0,0,1176, - 1177,5,100,0,0,1177,220,1,0,0,0,1178,1179,5,98,0,0,1179,1180,5,111, - 0,0,1180,1181,5,111,0,0,1181,1182,5,108,0,0,1182,222,1,0,0,0,1183, - 1184,5,98,0,0,1184,1185,5,121,0,0,1185,1186,5,116,0,0,1186,1187, - 5,101,0,0,1187,1188,5,115,0,0,1188,224,1,0,0,0,1189,1190,5,100,0, - 0,1190,1191,5,111,0,0,1191,1192,5,117,0,0,1192,1193,5,98,0,0,1193, - 1194,5,108,0,0,1194,1195,5,101,0,0,1195,226,1,0,0,0,1196,1197,5, - 105,0,0,1197,1198,5,110,0,0,1198,1199,5,116,0,0,1199,1200,5,51,0, - 0,1200,1201,5,50,0,0,1201,228,1,0,0,0,1202,1203,5,105,0,0,1203,1204, - 5,110,0,0,1204,1205,5,116,0,0,1205,1206,5,54,0,0,1206,1207,5,52, - 0,0,1207,230,1,0,0,0,1208,1209,5,115,0,0,1209,1210,5,116,0,0,1210, - 1211,5,114,0,0,1211,1212,5,105,0,0,1212,1213,5,110,0,0,1213,1214, - 5,103,0,0,1214,232,1,0,0,0,1215,1216,5,117,0,0,1216,1217,5,105,0, - 0,1217,1218,5,110,0,0,1218,1219,5,116,0,0,1219,1220,5,51,0,0,1220, - 1221,5,50,0,0,1221,234,1,0,0,0,1222,1223,5,117,0,0,1223,1224,5,105, - 0,0,1224,1225,5,110,0,0,1225,1226,5,116,0,0,1226,1227,5,54,0,0,1227, - 1228,5,52,0,0,1228,236,1,0,0,0,1229,1230,5,116,0,0,1230,1231,5,114, - 0,0,1231,1232,5,117,0,0,1232,1233,5,101,0,0,1233,238,1,0,0,0,1234, - 1235,5,102,0,0,1235,1236,5,97,0,0,1236,1237,5,108,0,0,1237,1238, - 5,115,0,0,1238,1239,5,101,0,0,1239,240,1,0,0,0,1240,1241,5,110,0, - 0,1241,1242,5,117,0,0,1242,1243,5,108,0,0,1243,1244,5,108,0,0,1244, - 242,1,0,0,0,1245,1246,5,45,0,0,1246,1247,5,62,0,0,1247,244,1,0,0, - 0,1248,1249,5,58,0,0,1249,246,1,0,0,0,1250,1251,5,59,0,0,1251,248, - 1,0,0,0,1252,1253,5,44,0,0,1253,250,1,0,0,0,1254,1255,5,46,0,0,1255, - 252,1,0,0,0,1256,1257,5,123,0,0,1257,254,1,0,0,0,1258,1259,5,125, - 0,0,1259,256,1,0,0,0,1260,1261,5,91,0,0,1261,258,1,0,0,0,1262,1263, - 5,93,0,0,1263,260,1,0,0,0,1264,1265,5,40,0,0,1265,262,1,0,0,0,1266, - 1267,5,41,0,0,1267,264,1,0,0,0,1268,1269,5,60,0,0,1269,266,1,0,0, - 0,1270,1271,5,62,0,0,1271,268,1,0,0,0,1272,1273,5,38,0,0,1273,270, - 1,0,0,0,1274,1275,5,61,0,0,1275,272,1,0,0,0,1276,1278,5,45,0,0,1277, - 1276,1,0,0,0,1277,1278,1,0,0,0,1278,1280,1,0,0,0,1279,1281,7,0,0, - 0,1280,1279,1,0,0,0,1281,1282,1,0,0,0,1282,1280,1,0,0,0,1282,1283, - 1,0,0,0,1283,274,1,0,0,0,1284,1286,5,45,0,0,1285,1284,1,0,0,0,1285, - 1286,1,0,0,0,1286,1295,1,0,0,0,1287,1296,5,48,0,0,1288,1292,7,1, - 0,0,1289,1291,7,0,0,0,1290,1289,1,0,0,0,1291,1294,1,0,0,0,1292,1290, - 1,0,0,0,1292,1293,1,0,0,0,1293,1296,1,0,0,0,1294,1292,1,0,0,0,1295, - 1287,1,0,0,0,1295,1288,1,0,0,0,1296,1303,1,0,0,0,1297,1299,5,46, - 0,0,1298,1300,7,0,0,0,1299,1298,1,0,0,0,1300,1301,1,0,0,0,1301,1299, - 1,0,0,0,1301,1302,1,0,0,0,1302,1304,1,0,0,0,1303,1297,1,0,0,0,1303, - 1304,1,0,0,0,1304,1314,1,0,0,0,1305,1307,7,2,0,0,1306,1308,7,3,0, - 0,1307,1306,1,0,0,0,1307,1308,1,0,0,0,1308,1310,1,0,0,0,1309,1311, - 7,0,0,0,1310,1309,1,0,0,0,1311,1312,1,0,0,0,1312,1310,1,0,0,0,1312, - 1313,1,0,0,0,1313,1315,1,0,0,0,1314,1305,1,0,0,0,1314,1315,1,0,0, - 0,1315,276,1,0,0,0,1316,1320,7,4,0,0,1317,1319,7,5,0,0,1318,1317, - 1,0,0,0,1319,1322,1,0,0,0,1320,1318,1,0,0,0,1320,1321,1,0,0,0,1321, - 278,1,0,0,0,1322,1320,1,0,0,0,1323,1328,5,34,0,0,1324,1327,3,281, - 140,0,1325,1327,8,6,0,0,1326,1324,1,0,0,0,1326,1325,1,0,0,0,1327, - 1330,1,0,0,0,1328,1326,1,0,0,0,1328,1329,1,0,0,0,1329,1331,1,0,0, - 0,1330,1328,1,0,0,0,1331,1332,5,34,0,0,1332,280,1,0,0,0,1333,1341, - 5,92,0,0,1334,1342,7,7,0,0,1335,1336,5,117,0,0,1336,1337,3,283,141, - 0,1337,1338,3,283,141,0,1338,1339,3,283,141,0,1339,1340,3,283,141, - 0,1340,1342,1,0,0,0,1341,1334,1,0,0,0,1341,1335,1,0,0,0,1342,282, - 1,0,0,0,1343,1344,7,8,0,0,1344,284,1,0,0,0,1345,1346,5,47,0,0,1346, - 1347,5,47,0,0,1347,1351,1,0,0,0,1348,1350,8,9,0,0,1349,1348,1,0, - 0,0,1350,1353,1,0,0,0,1351,1349,1,0,0,0,1351,1352,1,0,0,0,1352,1354, - 1,0,0,0,1353,1351,1,0,0,0,1354,1355,6,142,0,0,1355,286,1,0,0,0,1356, - 1357,5,47,0,0,1357,1358,5,42,0,0,1358,1362,1,0,0,0,1359,1361,9,0, - 0,0,1360,1359,1,0,0,0,1361,1364,1,0,0,0,1362,1363,1,0,0,0,1362,1360, - 1,0,0,0,1363,1365,1,0,0,0,1364,1362,1,0,0,0,1365,1366,5,42,0,0,1366, - 1367,5,47,0,0,1367,1368,1,0,0,0,1368,1369,6,143,0,0,1369,288,1,0, - 0,0,1370,1372,7,10,0,0,1371,1370,1,0,0,0,1372,1373,1,0,0,0,1373, - 1371,1,0,0,0,1373,1374,1,0,0,0,1374,1375,1,0,0,0,1375,1376,6,144, - 0,0,1376,290,1,0,0,0,18,0,1277,1282,1285,1292,1295,1301,1303,1307, - 1312,1314,1320,1326,1328,1341,1351,1362,1373,1,0,1,0 + 99,1,99,1,99,1,99,1,100,1,100,1,100,1,100,1,100,1,100,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,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,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, + 1,105,1,105,1,105,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106, + 1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,108,1,108, + 1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108, + 1,108,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,110, + 1,110,1,110,1,110,1,110,1,111,1,111,1,111,1,111,1,111,1,111,1,111, + 1,112,1,112,1,112,1,112,1,112,1,113,1,113,1,113,1,113,1,113,1,113, + 1,114,1,114,1,114,1,114,1,114,1,114,1,114,1,115,1,115,1,115,1,115, + 1,115,1,115,1,116,1,116,1,116,1,116,1,116,1,116,1,117,1,117,1,117, + 1,117,1,117,1,117,1,117,1,118,1,118,1,118,1,118,1,118,1,118,1,118, + 1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,120,1,120,1,120,1,120, + 1,120,1,121,1,121,1,121,1,121,1,121,1,121,1,122,1,122,1,122,1,122, + 1,122,1,123,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, + 3,138,1291,8,138,1,138,4,138,1294,8,138,11,138,12,138,1295,1,139, + 3,139,1299,8,139,1,139,1,139,1,139,5,139,1304,8,139,10,139,12,139, + 1307,9,139,3,139,1309,8,139,1,139,1,139,4,139,1313,8,139,11,139, + 12,139,1314,3,139,1317,8,139,1,139,1,139,3,139,1321,8,139,1,139, + 4,139,1324,8,139,11,139,12,139,1325,3,139,1328,8,139,1,140,1,140, + 5,140,1332,8,140,10,140,12,140,1335,9,140,1,141,1,141,1,141,5,141, + 1340,8,141,10,141,12,141,1343,9,141,1,141,1,141,1,142,1,142,1,142, + 1,142,1,142,1,142,1,142,1,142,3,142,1355,8,142,1,143,1,143,1,144, + 1,144,1,144,1,144,5,144,1363,8,144,10,144,12,144,1366,9,144,1,144, + 1,144,1,145,1,145,1,145,1,145,5,145,1374,8,145,10,145,12,145,1377, + 9,145,1,145,1,145,1,145,1,145,1,145,1,146,4,146,1385,8,146,11,146, + 12,146,1386,1,146,1,146,1,1375,0,147,1,1,3,2,5,3,7,4,9,5,11,6,13, + 7,15,8,17,9,19,10,21,11,23,12,25,13,27,14,29,15,31,16,33,17,35,18, + 37,19,39,20,41,21,43,22,45,23,47,24,49,25,51,26,53,27,55,28,57,29, + 59,30,61,31,63,32,65,33,67,34,69,35,71,36,73,37,75,38,77,39,79,40, + 81,41,83,42,85,43,87,44,89,45,91,46,93,47,95,48,97,49,99,50,101, + 51,103,52,105,53,107,54,109,55,111,56,113,57,115,58,117,59,119,60, + 121,61,123,62,125,63,127,64,129,65,131,66,133,67,135,68,137,69,139, + 70,141,71,143,72,145,73,147,74,149,75,151,76,153,77,155,78,157,79, + 159,80,161,81,163,82,165,83,167,84,169,85,171,86,173,87,175,88,177, + 89,179,90,181,91,183,92,185,93,187,94,189,95,191,96,193,97,195,98, + 197,99,199,100,201,101,203,102,205,103,207,104,209,105,211,106,213, + 107,215,108,217,109,219,110,221,111,223,112,225,113,227,114,229, + 115,231,116,233,117,235,118,237,119,239,120,241,121,243,122,245, + 123,247,124,249,125,251,126,253,127,255,128,257,129,259,130,261, + 131,263,132,265,133,267,134,269,135,271,136,273,137,275,138,277, + 139,279,140,281,141,283,142,285,0,287,0,289,143,291,144,293,145, + 1,0,11,1,0,48,57,1,0,49,57,2,0,69,69,101,101,2,0,43,43,45,45,3,0, + 65,90,95,95,97,122,4,0,48,57,65,90,95,95,97,122,4,0,10,10,13,13, + 34,34,92,92,8,0,34,34,47,47,92,92,98,98,102,102,110,110,114,114, + 116,116,3,0,48,57,65,70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32, + 32,1404,0,1,1,0,0,0,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, + 229,1,0,0,0,0,231,1,0,0,0,0,233,1,0,0,0,0,235,1,0,0,0,0,237,1,0, + 0,0,0,239,1,0,0,0,0,241,1,0,0,0,0,243,1,0,0,0,0,245,1,0,0,0,0,247, + 1,0,0,0,0,249,1,0,0,0,0,251,1,0,0,0,0,253,1,0,0,0,0,255,1,0,0,0, + 0,257,1,0,0,0,0,259,1,0,0,0,0,261,1,0,0,0,0,263,1,0,0,0,0,265,1, + 0,0,0,0,267,1,0,0,0,0,269,1,0,0,0,0,271,1,0,0,0,0,273,1,0,0,0,0, + 275,1,0,0,0,0,277,1,0,0,0,0,279,1,0,0,0,0,281,1,0,0,0,0,283,1,0, + 0,0,0,289,1,0,0,0,0,291,1,0,0,0,0,293,1,0,0,0,1,295,1,0,0,0,3,304, + 1,0,0,0,5,315,1,0,0,0,7,325,1,0,0,0,9,335,1,0,0,0,11,344,1,0,0,0, + 13,356,1,0,0,0,15,363,1,0,0,0,17,371,1,0,0,0,19,380,1,0,0,0,21,388, + 1,0,0,0,23,394,1,0,0,0,25,399,1,0,0,0,27,412,1,0,0,0,29,422,1,0, + 0,0,31,434,1,0,0,0,33,440,1,0,0,0,35,451,1,0,0,0,37,462,1,0,0,0, + 39,467,1,0,0,0,41,476,1,0,0,0,43,486,1,0,0,0,45,491,1,0,0,0,47,495, + 1,0,0,0,49,501,1,0,0,0,51,506,1,0,0,0,53,516,1,0,0,0,55,520,1,0, + 0,0,57,533,1,0,0,0,59,538,1,0,0,0,61,545,1,0,0,0,63,554,1,0,0,0, + 65,565,1,0,0,0,67,569,1,0,0,0,69,578,1,0,0,0,71,585,1,0,0,0,73,594, + 1,0,0,0,75,599,1,0,0,0,77,609,1,0,0,0,79,620,1,0,0,0,81,628,1,0, + 0,0,83,634,1,0,0,0,85,643,1,0,0,0,87,653,1,0,0,0,89,662,1,0,0,0, + 91,674,1,0,0,0,93,685,1,0,0,0,95,691,1,0,0,0,97,699,1,0,0,0,99,702, + 1,0,0,0,101,707,1,0,0,0,103,714,1,0,0,0,105,717,1,0,0,0,107,725, + 1,0,0,0,109,732,1,0,0,0,111,738,1,0,0,0,113,743,1,0,0,0,115,754, + 1,0,0,0,117,759,1,0,0,0,119,765,1,0,0,0,121,769,1,0,0,0,123,781, + 1,0,0,0,125,784,1,0,0,0,127,791,1,0,0,0,129,794,1,0,0,0,131,801, + 1,0,0,0,133,809,1,0,0,0,135,816,1,0,0,0,137,827,1,0,0,0,139,834, + 1,0,0,0,141,843,1,0,0,0,143,858,1,0,0,0,145,868,1,0,0,0,147,881, + 1,0,0,0,149,887,1,0,0,0,151,904,1,0,0,0,153,907,1,0,0,0,155,911, + 1,0,0,0,157,916,1,0,0,0,159,922,1,0,0,0,161,931,1,0,0,0,163,940, + 1,0,0,0,165,944,1,0,0,0,167,948,1,0,0,0,169,952,1,0,0,0,171,958, + 1,0,0,0,173,964,1,0,0,0,175,969,1,0,0,0,177,974,1,0,0,0,179,980, + 1,0,0,0,181,988,1,0,0,0,183,996,1,0,0,0,185,1007,1,0,0,0,187,1012, + 1,0,0,0,189,1024,1,0,0,0,191,1035,1,0,0,0,193,1045,1,0,0,0,195,1057, + 1,0,0,0,197,1066,1,0,0,0,199,1071,1,0,0,0,201,1084,1,0,0,0,203,1096, + 1,0,0,0,205,1108,1,0,0,0,207,1113,1,0,0,0,209,1121,1,0,0,0,211,1126, + 1,0,0,0,213,1139,1,0,0,0,215,1147,1,0,0,0,217,1156,1,0,0,0,219,1170, + 1,0,0,0,221,1179,1,0,0,0,223,1184,1,0,0,0,225,1191,1,0,0,0,227,1196, + 1,0,0,0,229,1202,1,0,0,0,231,1209,1,0,0,0,233,1215,1,0,0,0,235,1221, + 1,0,0,0,237,1228,1,0,0,0,239,1235,1,0,0,0,241,1242,1,0,0,0,243,1247, + 1,0,0,0,245,1253,1,0,0,0,247,1258,1,0,0,0,249,1261,1,0,0,0,251,1263, + 1,0,0,0,253,1265,1,0,0,0,255,1267,1,0,0,0,257,1269,1,0,0,0,259,1271, + 1,0,0,0,261,1273,1,0,0,0,263,1275,1,0,0,0,265,1277,1,0,0,0,267,1279, + 1,0,0,0,269,1281,1,0,0,0,271,1283,1,0,0,0,273,1285,1,0,0,0,275,1287, + 1,0,0,0,277,1290,1,0,0,0,279,1298,1,0,0,0,281,1329,1,0,0,0,283,1336, + 1,0,0,0,285,1346,1,0,0,0,287,1356,1,0,0,0,289,1358,1,0,0,0,291,1369, + 1,0,0,0,293,1384,1,0,0,0,295,296,5,99,0,0,296,297,5,114,0,0,297, + 298,5,101,0,0,298,299,5,97,0,0,299,300,5,116,0,0,300,301,5,105,0, + 0,301,302,5,111,0,0,302,303,5,110,0,0,303,2,1,0,0,0,304,305,5,105, + 0,0,305,306,5,110,0,0,306,307,5,105,0,0,307,308,5,116,0,0,308,309, + 5,105,0,0,309,310,5,97,0,0,310,311,5,108,0,0,311,312,5,105,0,0,312, + 313,5,122,0,0,313,314,5,101,0,0,314,4,1,0,0,0,315,316,5,119,0,0, + 316,317,5,111,0,0,317,318,5,114,0,0,318,319,5,107,0,0,319,320,5, + 115,0,0,320,321,5,112,0,0,321,322,5,97,0,0,322,323,5,99,0,0,323, + 324,5,101,0,0,324,6,1,0,0,0,325,326,5,101,0,0,326,327,5,120,0,0, + 327,328,5,101,0,0,328,329,5,99,0,0,329,330,5,117,0,0,330,331,5,116, + 0,0,331,332,5,105,0,0,332,333,5,111,0,0,333,334,5,110,0,0,334,8, + 1,0,0,0,335,336,5,115,0,0,336,337,5,110,0,0,337,338,5,97,0,0,338, + 339,5,112,0,0,339,340,5,115,0,0,340,341,5,104,0,0,341,342,5,111, + 0,0,342,343,5,116,0,0,343,10,1,0,0,0,344,345,5,116,0,0,345,346,5, + 114,0,0,346,347,5,97,0,0,347,348,5,110,0,0,348,349,5,115,0,0,349, + 350,5,97,0,0,350,351,5,99,0,0,351,352,5,116,0,0,352,353,5,105,0, + 0,353,354,5,111,0,0,354,355,5,110,0,0,355,12,1,0,0,0,356,357,5,114, + 0,0,357,358,5,101,0,0,358,359,5,109,0,0,359,360,5,111,0,0,360,361, + 5,116,0,0,361,362,5,101,0,0,362,14,1,0,0,0,363,364,5,116,0,0,364, + 365,5,97,0,0,365,366,5,114,0,0,366,367,5,103,0,0,367,368,5,101,0, + 0,368,369,5,116,0,0,369,370,5,115,0,0,370,16,1,0,0,0,371,372,5,112, + 0,0,372,373,5,111,0,0,373,374,5,114,0,0,374,375,5,116,0,0,375,376, + 5,97,0,0,376,377,5,98,0,0,377,378,5,108,0,0,378,379,5,101,0,0,379, + 18,1,0,0,0,380,381,5,114,0,0,381,382,5,101,0,0,382,383,5,112,0,0, + 383,384,5,108,0,0,384,385,5,105,0,0,385,386,5,99,0,0,386,387,5,97, + 0,0,387,20,1,0,0,0,388,389,5,108,0,0,389,390,5,111,0,0,390,391,5, + 99,0,0,391,392,5,97,0,0,392,393,5,108,0,0,393,22,1,0,0,0,394,395, + 5,102,0,0,395,396,5,114,0,0,396,397,5,111,0,0,397,398,5,109,0,0, + 398,24,1,0,0,0,399,400,5,114,0,0,400,401,5,101,0,0,401,402,5,115, + 0,0,402,403,5,117,0,0,403,404,5,108,0,0,404,405,5,116,0,0,405,406, + 5,45,0,0,406,407,5,98,0,0,407,408,5,121,0,0,408,409,5,116,0,0,409, + 410,5,101,0,0,410,411,5,115,0,0,411,26,1,0,0,0,412,413,5,114,0,0, + 413,414,5,112,0,0,414,415,5,99,0,0,415,416,5,45,0,0,416,417,5,99, + 0,0,417,418,5,97,0,0,418,419,5,108,0,0,419,420,5,108,0,0,420,421, + 5,115,0,0,421,28,1,0,0,0,422,423,5,100,0,0,423,424,5,101,0,0,424, + 425,5,97,0,0,425,426,5,100,0,0,426,427,5,108,0,0,427,428,5,105,0, + 0,428,429,5,110,0,0,429,430,5,101,0,0,430,431,5,45,0,0,431,432,5, + 109,0,0,432,433,5,115,0,0,433,30,1,0,0,0,434,435,5,113,0,0,435,436, + 5,117,0,0,436,437,5,101,0,0,437,438,5,114,0,0,438,439,5,121,0,0, + 439,32,1,0,0,0,440,441,5,114,0,0,441,442,5,101,0,0,442,443,5,102, + 0,0,443,444,5,108,0,0,444,445,5,101,0,0,445,446,5,99,0,0,446,447, + 5,116,0,0,447,448,5,105,0,0,448,449,5,111,0,0,449,450,5,110,0,0, + 450,34,1,0,0,0,451,452,5,115,0,0,452,453,5,112,0,0,453,454,5,101, + 0,0,454,455,5,99,0,0,455,456,5,105,0,0,456,457,5,97,0,0,457,458, + 5,108,0,0,458,459,5,105,0,0,459,460,5,122,0,0,460,461,5,101,0,0, + 461,36,1,0,0,0,462,463,5,114,0,0,463,464,5,111,0,0,464,465,5,111, + 0,0,465,466,5,116,0,0,466,38,1,0,0,0,467,468,5,100,0,0,468,469,5, + 111,0,0,469,470,5,99,0,0,470,471,5,117,0,0,471,472,5,109,0,0,472, + 473,5,101,0,0,473,474,5,110,0,0,474,475,5,116,0,0,475,40,1,0,0,0, + 476,477,5,102,0,0,477,478,5,114,0,0,478,479,5,97,0,0,479,480,5,103, + 0,0,480,481,5,109,0,0,481,482,5,101,0,0,482,483,5,110,0,0,483,484, + 5,116,0,0,484,485,5,115,0,0,485,42,1,0,0,0,486,487,5,118,0,0,487, + 488,5,105,0,0,488,489,5,101,0,0,489,490,5,119,0,0,490,44,1,0,0,0, + 491,492,5,109,0,0,492,493,5,97,0,0,493,494,5,120,0,0,494,46,1,0, + 0,0,495,496,5,97,0,0,496,497,5,108,0,0,497,498,5,108,0,0,498,499, + 5,111,0,0,499,500,5,119,0,0,500,48,1,0,0,0,501,502,5,112,0,0,502, + 503,5,111,0,0,503,504,5,108,0,0,504,505,5,108,0,0,505,50,1,0,0,0, + 506,507,5,113,0,0,507,508,5,117,0,0,508,509,5,101,0,0,509,510,5, + 114,0,0,510,511,5,121,0,0,511,512,5,97,0,0,512,513,5,98,0,0,513, + 514,5,108,0,0,514,515,5,101,0,0,515,52,1,0,0,0,516,517,5,114,0,0, + 517,518,5,112,0,0,518,519,5,99,0,0,519,54,1,0,0,0,520,521,5,113, + 0,0,521,522,5,117,0,0,522,523,5,101,0,0,523,524,5,114,0,0,524,525, + 5,121,0,0,525,526,5,45,0,0,526,527,5,114,0,0,527,528,5,101,0,0,528, + 529,5,97,0,0,529,530,5,115,0,0,530,531,5,111,0,0,531,532,5,110,0, + 0,532,56,1,0,0,0,533,534,5,116,0,0,534,535,5,121,0,0,535,536,5,112, + 0,0,536,537,5,101,0,0,537,58,1,0,0,0,538,539,5,111,0,0,539,540,5, + 98,0,0,540,541,5,106,0,0,541,542,5,101,0,0,542,543,5,99,0,0,543, + 544,5,116,0,0,544,60,1,0,0,0,545,546,5,115,0,0,546,547,5,116,0,0, + 547,548,5,111,0,0,548,549,5,114,0,0,549,550,5,97,0,0,550,551,5,98, + 0,0,551,552,5,108,0,0,552,553,5,101,0,0,553,62,1,0,0,0,554,555,5, + 105,0,0,555,556,5,109,0,0,556,557,5,112,0,0,557,558,5,108,0,0,558, + 559,5,101,0,0,559,560,5,109,0,0,560,561,5,101,0,0,561,562,5,110, + 0,0,562,563,5,116,0,0,563,564,5,115,0,0,564,64,1,0,0,0,565,566,5, + 114,0,0,566,567,5,101,0,0,567,568,5,102,0,0,568,66,1,0,0,0,569,570, + 5,102,0,0,570,571,5,114,0,0,571,572,5,97,0,0,572,573,5,103,0,0,573, + 574,5,109,0,0,574,575,5,101,0,0,575,576,5,110,0,0,576,577,5,116, + 0,0,577,68,1,0,0,0,578,579,5,105,0,0,579,580,5,109,0,0,580,581,5, + 112,0,0,581,582,5,111,0,0,582,583,5,114,0,0,583,584,5,116,0,0,584, + 70,1,0,0,0,585,586,5,101,0,0,586,587,5,120,0,0,587,588,5,116,0,0, + 588,589,5,101,0,0,589,590,5,114,0,0,590,591,5,110,0,0,591,592,5, + 97,0,0,592,593,5,108,0,0,593,72,1,0,0,0,594,595,5,97,0,0,595,596, + 5,116,0,0,596,597,5,111,0,0,597,598,5,109,0,0,598,74,1,0,0,0,599, + 600,5,105,0,0,600,601,5,110,0,0,601,602,5,116,0,0,602,603,5,101, + 0,0,603,604,5,114,0,0,604,605,5,102,0,0,605,606,5,97,0,0,606,607, + 5,99,0,0,607,608,5,101,0,0,608,76,1,0,0,0,609,610,5,105,0,0,610, + 611,5,110,0,0,611,612,5,116,0,0,612,613,5,101,0,0,613,614,5,114, + 0,0,614,615,5,102,0,0,615,616,5,97,0,0,616,617,5,99,0,0,617,618, + 5,101,0,0,618,619,5,115,0,0,619,78,1,0,0,0,620,621,5,112,0,0,621, + 622,5,97,0,0,622,623,5,99,0,0,623,624,5,107,0,0,624,625,5,97,0,0, + 625,626,5,103,0,0,626,627,5,101,0,0,627,80,1,0,0,0,628,629,5,118, + 0,0,629,630,5,97,0,0,630,631,5,108,0,0,631,632,5,117,0,0,632,633, + 5,101,0,0,633,82,1,0,0,0,634,635,5,114,0,0,635,636,5,101,0,0,636, + 637,5,108,0,0,637,638,5,97,0,0,638,639,5,116,0,0,639,640,5,105,0, + 0,640,641,5,111,0,0,641,642,5,110,0,0,642,84,1,0,0,0,643,644,5,111, + 0,0,644,645,5,112,0,0,645,646,5,101,0,0,646,647,5,114,0,0,647,648, + 5,97,0,0,648,649,5,116,0,0,649,650,5,105,0,0,650,651,5,111,0,0,651, + 652,5,110,0,0,652,86,1,0,0,0,653,654,5,102,0,0,654,655,5,117,0,0, + 655,656,5,110,0,0,656,657,5,99,0,0,657,658,5,116,0,0,658,659,5,105, + 0,0,659,660,5,111,0,0,660,661,5,110,0,0,661,88,1,0,0,0,662,663,5, + 99,0,0,663,664,5,111,0,0,664,665,5,110,0,0,665,666,5,115,0,0,666, + 667,5,116,0,0,667,668,5,114,0,0,668,669,5,117,0,0,669,670,5,99,0, + 0,670,671,5,116,0,0,671,672,5,111,0,0,672,673,5,114,0,0,673,90,1, + 0,0,0,674,675,5,99,0,0,675,676,5,111,0,0,676,677,5,110,0,0,677,678, + 5,115,0,0,678,679,5,116,0,0,679,680,5,114,0,0,680,681,5,117,0,0, + 681,682,5,99,0,0,682,683,5,116,0,0,683,684,5,115,0,0,684,92,1,0, + 0,0,685,686,5,105,0,0,686,687,5,110,0,0,687,688,5,112,0,0,688,689, + 5,117,0,0,689,690,5,116,0,0,690,94,1,0,0,0,691,692,5,99,0,0,692, + 693,5,111,0,0,693,694,5,110,0,0,694,695,5,102,0,0,695,696,5,111, + 0,0,696,697,5,114,0,0,697,698,5,109,0,0,698,96,1,0,0,0,699,700,5, + 97,0,0,700,701,5,115,0,0,701,98,1,0,0,0,702,703,5,98,0,0,703,704, + 5,105,0,0,704,705,5,110,0,0,705,706,5,100,0,0,706,100,1,0,0,0,707, + 708,5,115,0,0,708,709,5,116,0,0,709,710,5,97,0,0,710,711,5,116,0, + 0,711,712,5,105,0,0,712,713,5,99,0,0,713,102,1,0,0,0,714,715,5,116, + 0,0,715,716,5,111,0,0,716,104,1,0,0,0,717,718,5,112,0,0,718,719, + 5,114,0,0,719,720,5,105,0,0,720,721,5,118,0,0,721,722,5,97,0,0,722, + 723,5,116,0,0,723,724,5,101,0,0,724,106,1,0,0,0,725,726,5,115,0, + 0,726,727,5,104,0,0,727,728,5,97,0,0,728,729,5,114,0,0,729,730,5, + 101,0,0,730,731,5,100,0,0,731,108,1,0,0,0,732,733,5,115,0,0,733, + 734,5,116,0,0,734,735,5,97,0,0,735,736,5,116,0,0,736,737,5,101,0, + 0,737,110,1,0,0,0,738,739,5,101,0,0,739,740,5,100,0,0,740,741,5, + 103,0,0,741,742,5,101,0,0,742,112,1,0,0,0,743,744,5,112,0,0,744, + 745,5,114,0,0,745,746,5,111,0,0,746,747,5,106,0,0,747,748,5,101, + 0,0,748,749,5,99,0,0,749,750,5,116,0,0,750,751,5,105,0,0,751,752, + 5,111,0,0,752,753,5,110,0,0,753,114,1,0,0,0,754,755,5,119,0,0,755, + 756,5,105,0,0,756,757,5,116,0,0,757,758,5,104,0,0,758,116,1,0,0, + 0,759,760,5,117,0,0,760,761,5,115,0,0,761,762,5,105,0,0,762,763, + 5,110,0,0,763,764,5,103,0,0,764,118,1,0,0,0,765,766,5,118,0,0,766, + 767,5,105,0,0,767,768,5,97,0,0,768,120,1,0,0,0,769,770,5,109,0,0, + 770,771,5,97,0,0,771,772,5,116,0,0,772,773,5,101,0,0,773,774,5,114, + 0,0,774,775,5,105,0,0,775,776,5,97,0,0,776,777,5,108,0,0,777,778, + 5,105,0,0,778,779,5,122,0,0,779,780,5,101,0,0,780,122,1,0,0,0,781, + 782,5,105,0,0,782,783,5,102,0,0,783,124,1,0,0,0,784,785,5,97,0,0, + 785,786,5,98,0,0,786,787,5,115,0,0,787,788,5,101,0,0,788,789,5,110, + 0,0,789,790,5,116,0,0,790,126,1,0,0,0,791,792,5,111,0,0,792,793, + 5,110,0,0,793,128,1,0,0,0,794,795,5,112,0,0,795,796,5,111,0,0,796, + 797,5,108,0,0,797,798,5,105,0,0,798,799,5,99,0,0,799,800,5,121,0, + 0,800,130,1,0,0,0,801,802,5,100,0,0,802,803,5,101,0,0,803,804,5, + 102,0,0,804,805,5,97,0,0,805,806,5,117,0,0,806,807,5,108,0,0,807, + 808,5,116,0,0,808,132,1,0,0,0,809,810,5,115,0,0,810,811,5,111,0, + 0,811,812,5,117,0,0,812,813,5,114,0,0,813,814,5,99,0,0,814,815,5, + 101,0,0,815,134,1,0,0,0,816,817,5,114,0,0,817,818,5,101,0,0,818, + 819,5,112,0,0,819,820,5,111,0,0,820,821,5,115,0,0,821,822,5,105, + 0,0,822,823,5,116,0,0,823,824,5,111,0,0,824,825,5,114,0,0,825,826, + 5,121,0,0,826,136,1,0,0,0,827,828,5,99,0,0,828,829,5,111,0,0,829, + 830,5,109,0,0,830,831,5,109,0,0,831,832,5,105,0,0,832,833,5,116, + 0,0,833,138,1,0,0,0,834,835,5,114,0,0,835,836,5,101,0,0,836,837, + 5,118,0,0,837,838,5,105,0,0,838,839,5,115,0,0,839,840,5,105,0,0, + 840,841,5,111,0,0,841,842,5,110,0,0,842,140,1,0,0,0,843,844,5,115, + 0,0,844,845,5,101,0,0,845,846,5,109,0,0,846,847,5,97,0,0,847,848, + 5,110,0,0,848,849,5,116,0,0,849,850,5,105,0,0,850,851,5,99,0,0,851, + 852,5,45,0,0,852,853,5,109,0,0,853,854,5,97,0,0,854,855,5,106,0, + 0,855,856,5,111,0,0,856,857,5,114,0,0,857,142,1,0,0,0,858,859,5, + 111,0,0,859,860,5,110,0,0,860,861,5,45,0,0,861,862,5,100,0,0,862, + 863,5,101,0,0,863,864,5,108,0,0,864,865,5,101,0,0,865,866,5,116, + 0,0,866,867,5,101,0,0,867,144,1,0,0,0,868,869,5,114,0,0,869,870, + 5,101,0,0,870,871,5,116,0,0,871,872,5,97,0,0,872,873,5,105,0,0,873, + 874,5,110,0,0,874,875,5,45,0,0,875,876,5,111,0,0,876,877,5,116,0, + 0,877,878,5,104,0,0,878,879,5,101,0,0,879,880,5,114,0,0,880,146, + 1,0,0,0,881,882,5,107,0,0,882,883,5,101,0,0,883,884,5,121,0,0,884, + 885,5,101,0,0,885,886,5,100,0,0,886,148,1,0,0,0,887,888,5,112,0, + 0,888,889,5,117,0,0,889,890,5,98,0,0,890,891,5,108,0,0,891,892,5, + 105,0,0,892,893,5,99,0,0,893,894,5,45,0,0,894,895,5,116,0,0,895, + 896,5,114,0,0,896,897,5,97,0,0,897,898,5,118,0,0,898,899,5,101,0, + 0,899,900,5,114,0,0,900,901,5,115,0,0,901,902,5,97,0,0,902,903,5, + 108,0,0,903,150,1,0,0,0,904,905,5,105,0,0,905,906,5,100,0,0,906, + 152,1,0,0,0,907,908,5,100,0,0,908,909,5,111,0,0,909,910,5,99,0,0, + 910,154,1,0,0,0,911,912,5,109,0,0,912,913,5,111,0,0,913,914,5,100, + 0,0,914,915,5,101,0,0,915,156,1,0,0,0,916,917,5,101,0,0,917,918, + 5,109,0,0,918,919,5,105,0,0,919,920,5,116,0,0,920,921,5,115,0,0, + 921,158,1,0,0,0,922,923,5,114,0,0,923,924,5,101,0,0,924,925,5,99, + 0,0,925,926,5,101,0,0,926,927,5,105,0,0,927,928,5,118,0,0,928,929, + 5,101,0,0,929,930,5,114,0,0,930,160,1,0,0,0,931,932,5,114,0,0,932, + 933,5,101,0,0,933,934,5,113,0,0,934,935,5,117,0,0,935,936,5,105, + 0,0,936,937,5,114,0,0,937,938,5,101,0,0,938,939,5,115,0,0,939,162, + 1,0,0,0,940,941,5,97,0,0,941,942,5,110,0,0,942,943,5,121,0,0,943, + 164,1,0,0,0,944,945,5,103,0,0,945,946,5,101,0,0,946,947,5,116,0, + 0,947,166,1,0,0,0,948,949,5,115,0,0,949,950,5,101,0,0,950,951,5, + 116,0,0,951,168,1,0,0,0,952,953,5,119,0,0,953,954,5,97,0,0,954,955, + 5,116,0,0,955,956,5,99,0,0,956,957,5,104,0,0,957,170,1,0,0,0,958, + 959,5,115,0,0,959,960,5,116,0,0,960,961,5,97,0,0,961,962,5,114,0, + 0,962,963,5,116,0,0,963,172,1,0,0,0,964,965,5,115,0,0,965,966,5, + 116,0,0,966,967,5,111,0,0,967,968,5,112,0,0,968,174,1,0,0,0,969, + 970,5,114,0,0,970,971,5,101,0,0,971,972,5,97,0,0,972,973,5,100,0, + 0,973,176,1,0,0,0,974,975,5,119,0,0,975,976,5,114,0,0,976,977,5, + 105,0,0,977,978,5,116,0,0,978,979,5,101,0,0,979,178,1,0,0,0,980, + 981,5,114,0,0,981,982,5,101,0,0,982,983,5,115,0,0,983,984,5,111, + 0,0,984,985,5,108,0,0,985,986,5,118,0,0,986,987,5,101,0,0,987,180, + 1,0,0,0,988,989,5,99,0,0,989,990,5,111,0,0,990,991,5,110,0,0,991, + 992,5,110,0,0,992,993,5,101,0,0,993,994,5,99,0,0,994,995,5,116,0, + 0,995,182,1,0,0,0,996,997,5,100,0,0,997,998,5,105,0,0,998,999,5, + 115,0,0,999,1000,5,99,0,0,1000,1001,5,111,0,0,1001,1002,5,110,0, + 0,1002,1003,5,110,0,0,1003,1004,5,101,0,0,1004,1005,5,99,0,0,1005, + 1006,5,116,0,0,1006,184,1,0,0,0,1007,1008,5,99,0,0,1008,1009,5,97, + 0,0,1009,1010,5,108,0,0,1010,1011,5,108,0,0,1011,186,1,0,0,0,1012, + 1013,5,119,0,0,1013,1014,5,97,0,0,1014,1015,5,116,0,0,1015,1016, + 5,99,0,0,1016,1017,5,104,0,0,1017,1018,5,45,0,0,1018,1019,5,115, + 0,0,1019,1020,5,116,0,0,1020,1021,5,97,0,0,1021,1022,5,114,0,0,1022, + 1023,5,116,0,0,1023,188,1,0,0,0,1024,1025,5,119,0,0,1025,1026,5, + 97,0,0,1026,1027,5,116,0,0,1027,1028,5,99,0,0,1028,1029,5,104,0, + 0,1029,1030,5,45,0,0,1030,1031,5,115,0,0,1031,1032,5,116,0,0,1032, + 1033,5,111,0,0,1033,1034,5,112,0,0,1034,190,1,0,0,0,1035,1036,5, + 115,0,0,1036,1037,5,117,0,0,1037,1038,5,98,0,0,1038,1039,5,115,0, + 0,1039,1040,5,99,0,0,1040,1041,5,114,0,0,1041,1042,5,105,0,0,1042, + 1043,5,98,0,0,1043,1044,5,101,0,0,1044,192,1,0,0,0,1045,1046,5,117, + 0,0,1046,1047,5,110,0,0,1047,1048,5,115,0,0,1048,1049,5,117,0,0, + 1049,1050,5,98,0,0,1050,1051,5,115,0,0,1051,1052,5,99,0,0,1052,1053, + 5,114,0,0,1053,1054,5,105,0,0,1054,1055,5,98,0,0,1055,1056,5,101, + 0,0,1056,194,1,0,0,0,1057,1058,5,114,0,0,1058,1059,5,101,0,0,1059, + 1060,5,103,0,0,1060,1061,5,105,0,0,1061,1062,5,115,0,0,1062,1063, + 5,116,0,0,1063,1064,5,101,0,0,1064,1065,5,114,0,0,1065,196,1,0,0, + 0,1066,1067,5,99,0,0,1067,1068,5,114,0,0,1068,1069,5,100,0,0,1069, + 1070,5,116,0,0,1070,198,1,0,0,0,1071,1072,5,111,0,0,1072,1073,5, + 112,0,0,1073,1074,5,116,0,0,1074,1075,5,105,0,0,1075,1076,5,111, + 0,0,1076,1077,5,110,0,0,1077,1078,5,97,0,0,1078,1079,5,108,0,0,1079, + 1080,5,45,0,0,1080,1081,5,111,0,0,1081,1082,5,110,0,0,1082,1083, + 5,101,0,0,1083,200,1,0,0,0,1084,1085,5,101,0,0,1085,1086,5,120,0, + 0,1086,1087,5,97,0,0,1087,1088,5,99,0,0,1088,1089,5,116,0,0,1089, + 1090,5,108,0,0,1090,1091,5,121,0,0,1091,1092,5,45,0,0,1092,1093, + 5,111,0,0,1093,1094,5,110,0,0,1094,1095,5,101,0,0,1095,202,1,0,0, + 0,1096,1097,5,109,0,0,1097,1098,5,97,0,0,1098,1099,5,110,0,0,1099, + 1100,5,121,0,0,1100,1101,5,45,0,0,1101,1102,5,117,0,0,1102,1103, + 5,110,0,0,1103,1104,5,105,0,0,1104,1105,5,113,0,0,1105,1106,5,117, + 0,0,1106,1107,5,101,0,0,1107,204,1,0,0,0,1108,1109,5,109,0,0,1109, + 1110,5,97,0,0,1110,1111,5,110,0,0,1111,1112,5,121,0,0,1112,206,1, + 0,0,0,1113,1114,5,111,0,0,1114,1115,5,114,0,0,1115,1116,5,100,0, + 0,1116,1117,5,101,0,0,1117,1118,5,114,0,0,1118,1119,5,101,0,0,1119, + 1120,5,100,0,0,1120,208,1,0,0,0,1121,1122,5,117,0,0,1122,1123,5, + 110,0,0,1123,1124,5,105,0,0,1124,1125,5,116,0,0,1125,210,1,0,0,0, + 1126,1127,5,119,0,0,1127,1128,5,97,0,0,1128,1129,5,116,0,0,1129, + 1130,5,99,0,0,1130,1131,5,104,0,0,1131,1132,5,45,0,0,1132,1133,5, + 104,0,0,1133,1134,5,97,0,0,1134,1135,5,110,0,0,1135,1136,5,100,0, + 0,1136,1137,5,108,0,0,1137,1138,5,101,0,0,1138,212,1,0,0,0,1139, + 1140,5,109,0,0,1140,1141,5,101,0,0,1141,1142,5,115,0,0,1142,1143, + 5,115,0,0,1143,1144,5,97,0,0,1144,1145,5,103,0,0,1145,1146,5,101, + 0,0,1146,214,1,0,0,0,1147,1148,5,97,0,0,1148,1149,5,116,0,0,1149, + 1150,5,111,0,0,1150,1151,5,109,0,0,1151,1152,5,45,0,0,1152,1153, + 5,114,0,0,1153,1154,5,101,0,0,1154,1155,5,102,0,0,1155,216,1,0,0, + 0,1156,1157,5,105,0,0,1157,1158,5,110,0,0,1158,1159,5,116,0,0,1159, + 1160,5,101,0,0,1160,1161,5,114,0,0,1161,1162,5,102,0,0,1162,1163, + 5,97,0,0,1163,1164,5,99,0,0,1164,1165,5,101,0,0,1165,1166,5,45,0, + 0,1166,1167,5,114,0,0,1167,1168,5,101,0,0,1168,1169,5,102,0,0,1169, + 218,1,0,0,0,1170,1171,5,111,0,0,1171,1172,5,112,0,0,1172,1173,5, + 116,0,0,1173,1174,5,105,0,0,1174,1175,5,111,0,0,1175,1176,5,110, + 0,0,1176,1177,5,97,0,0,1177,1178,5,108,0,0,1178,220,1,0,0,0,1179, + 1180,5,108,0,0,1180,1181,5,105,0,0,1181,1182,5,115,0,0,1182,1183, + 5,116,0,0,1183,222,1,0,0,0,1184,1185,5,114,0,0,1185,1186,5,101,0, + 0,1186,1187,5,99,0,0,1187,1188,5,111,0,0,1188,1189,5,114,0,0,1189, + 1190,5,100,0,0,1190,224,1,0,0,0,1191,1192,5,98,0,0,1192,1193,5,111, + 0,0,1193,1194,5,111,0,0,1194,1195,5,108,0,0,1195,226,1,0,0,0,1196, + 1197,5,98,0,0,1197,1198,5,121,0,0,1198,1199,5,116,0,0,1199,1200, + 5,101,0,0,1200,1201,5,115,0,0,1201,228,1,0,0,0,1202,1203,5,100,0, + 0,1203,1204,5,111,0,0,1204,1205,5,117,0,0,1205,1206,5,98,0,0,1206, + 1207,5,108,0,0,1207,1208,5,101,0,0,1208,230,1,0,0,0,1209,1210,5, + 105,0,0,1210,1211,5,110,0,0,1211,1212,5,116,0,0,1212,1213,5,51,0, + 0,1213,1214,5,50,0,0,1214,232,1,0,0,0,1215,1216,5,105,0,0,1216,1217, + 5,110,0,0,1217,1218,5,116,0,0,1218,1219,5,54,0,0,1219,1220,5,52, + 0,0,1220,234,1,0,0,0,1221,1222,5,115,0,0,1222,1223,5,116,0,0,1223, + 1224,5,114,0,0,1224,1225,5,105,0,0,1225,1226,5,110,0,0,1226,1227, + 5,103,0,0,1227,236,1,0,0,0,1228,1229,5,117,0,0,1229,1230,5,105,0, + 0,1230,1231,5,110,0,0,1231,1232,5,116,0,0,1232,1233,5,51,0,0,1233, + 1234,5,50,0,0,1234,238,1,0,0,0,1235,1236,5,117,0,0,1236,1237,5,105, + 0,0,1237,1238,5,110,0,0,1238,1239,5,116,0,0,1239,1240,5,54,0,0,1240, + 1241,5,52,0,0,1241,240,1,0,0,0,1242,1243,5,116,0,0,1243,1244,5,114, + 0,0,1244,1245,5,117,0,0,1245,1246,5,101,0,0,1246,242,1,0,0,0,1247, + 1248,5,102,0,0,1248,1249,5,97,0,0,1249,1250,5,108,0,0,1250,1251, + 5,115,0,0,1251,1252,5,101,0,0,1252,244,1,0,0,0,1253,1254,5,110,0, + 0,1254,1255,5,117,0,0,1255,1256,5,108,0,0,1256,1257,5,108,0,0,1257, + 246,1,0,0,0,1258,1259,5,45,0,0,1259,1260,5,62,0,0,1260,248,1,0,0, + 0,1261,1262,5,58,0,0,1262,250,1,0,0,0,1263,1264,5,59,0,0,1264,252, + 1,0,0,0,1265,1266,5,44,0,0,1266,254,1,0,0,0,1267,1268,5,46,0,0,1268, + 256,1,0,0,0,1269,1270,5,123,0,0,1270,258,1,0,0,0,1271,1272,5,125, + 0,0,1272,260,1,0,0,0,1273,1274,5,91,0,0,1274,262,1,0,0,0,1275,1276, + 5,93,0,0,1276,264,1,0,0,0,1277,1278,5,40,0,0,1278,266,1,0,0,0,1279, + 1280,5,41,0,0,1280,268,1,0,0,0,1281,1282,5,60,0,0,1282,270,1,0,0, + 0,1283,1284,5,62,0,0,1284,272,1,0,0,0,1285,1286,5,38,0,0,1286,274, + 1,0,0,0,1287,1288,5,61,0,0,1288,276,1,0,0,0,1289,1291,5,45,0,0,1290, + 1289,1,0,0,0,1290,1291,1,0,0,0,1291,1293,1,0,0,0,1292,1294,7,0,0, + 0,1293,1292,1,0,0,0,1294,1295,1,0,0,0,1295,1293,1,0,0,0,1295,1296, + 1,0,0,0,1296,278,1,0,0,0,1297,1299,5,45,0,0,1298,1297,1,0,0,0,1298, + 1299,1,0,0,0,1299,1308,1,0,0,0,1300,1309,5,48,0,0,1301,1305,7,1, + 0,0,1302,1304,7,0,0,0,1303,1302,1,0,0,0,1304,1307,1,0,0,0,1305,1303, + 1,0,0,0,1305,1306,1,0,0,0,1306,1309,1,0,0,0,1307,1305,1,0,0,0,1308, + 1300,1,0,0,0,1308,1301,1,0,0,0,1309,1316,1,0,0,0,1310,1312,5,46, + 0,0,1311,1313,7,0,0,0,1312,1311,1,0,0,0,1313,1314,1,0,0,0,1314,1312, + 1,0,0,0,1314,1315,1,0,0,0,1315,1317,1,0,0,0,1316,1310,1,0,0,0,1316, + 1317,1,0,0,0,1317,1327,1,0,0,0,1318,1320,7,2,0,0,1319,1321,7,3,0, + 0,1320,1319,1,0,0,0,1320,1321,1,0,0,0,1321,1323,1,0,0,0,1322,1324, + 7,0,0,0,1323,1322,1,0,0,0,1324,1325,1,0,0,0,1325,1323,1,0,0,0,1325, + 1326,1,0,0,0,1326,1328,1,0,0,0,1327,1318,1,0,0,0,1327,1328,1,0,0, + 0,1328,280,1,0,0,0,1329,1333,7,4,0,0,1330,1332,7,5,0,0,1331,1330, + 1,0,0,0,1332,1335,1,0,0,0,1333,1331,1,0,0,0,1333,1334,1,0,0,0,1334, + 282,1,0,0,0,1335,1333,1,0,0,0,1336,1341,5,34,0,0,1337,1340,3,285, + 142,0,1338,1340,8,6,0,0,1339,1337,1,0,0,0,1339,1338,1,0,0,0,1340, + 1343,1,0,0,0,1341,1339,1,0,0,0,1341,1342,1,0,0,0,1342,1344,1,0,0, + 0,1343,1341,1,0,0,0,1344,1345,5,34,0,0,1345,284,1,0,0,0,1346,1354, + 5,92,0,0,1347,1355,7,7,0,0,1348,1349,5,117,0,0,1349,1350,3,287,143, + 0,1350,1351,3,287,143,0,1351,1352,3,287,143,0,1352,1353,3,287,143, + 0,1353,1355,1,0,0,0,1354,1347,1,0,0,0,1354,1348,1,0,0,0,1355,286, + 1,0,0,0,1356,1357,7,8,0,0,1357,288,1,0,0,0,1358,1359,5,47,0,0,1359, + 1360,5,47,0,0,1360,1364,1,0,0,0,1361,1363,8,9,0,0,1362,1361,1,0, + 0,0,1363,1366,1,0,0,0,1364,1362,1,0,0,0,1364,1365,1,0,0,0,1365,1367, + 1,0,0,0,1366,1364,1,0,0,0,1367,1368,6,144,0,0,1368,290,1,0,0,0,1369, + 1370,5,47,0,0,1370,1371,5,42,0,0,1371,1375,1,0,0,0,1372,1374,9,0, + 0,0,1373,1372,1,0,0,0,1374,1377,1,0,0,0,1375,1376,1,0,0,0,1375,1373, + 1,0,0,0,1376,1378,1,0,0,0,1377,1375,1,0,0,0,1378,1379,5,42,0,0,1379, + 1380,5,47,0,0,1380,1381,1,0,0,0,1381,1382,6,145,0,0,1382,292,1,0, + 0,0,1383,1385,7,10,0,0,1384,1383,1,0,0,0,1385,1386,1,0,0,0,1386, + 1384,1,0,0,0,1386,1387,1,0,0,0,1387,1388,1,0,0,0,1388,1389,6,146, + 0,0,1389,294,1,0,0,0,18,0,1290,1295,1298,1305,1308,1314,1316,1320, + 1325,1327,1333,1339,1341,1354,1364,1375,1386,1,0,1,0 ]; private static __ATN: antlr.ATN; diff --git a/src/capability-language/generated/QuixosCapabilityParser.ts b/src/capability-language/generated/QuixosCapabilityParser.ts index a0aa492..4c2e2c9 100644 --- a/src/capability-language/generated/QuixosCapabilityParser.ts +++ b/src/capability-language/generated/QuixosCapabilityParser.ts @@ -10,149 +10,151 @@ type int = number; export class QuixosCapabilityParser extends antlr.Parser { - public static readonly WORKSPACE = 1; - public static readonly EXECUTION = 2; - public static readonly SNAPSHOT = 3; - public static readonly TRANSACTION = 4; - public static readonly REMOTE = 5; - public static readonly TARGETS = 6; - public static readonly PORTABLE = 7; - public static readonly REPLICA = 8; - public static readonly LOCAL = 9; - public static readonly FROM = 10; - public static readonly RESULT_BYTES = 11; - public static readonly RPC_CALLS = 12; - public static readonly DEADLINE_MS = 13; - public static readonly QUERY = 14; - public static readonly REFLECTION = 15; - public static readonly SPECIALIZE = 16; - public static readonly ROOT = 17; - public static readonly DOCUMENT = 18; - public static readonly FRAGMENTS = 19; - public static readonly VIEW = 20; - public static readonly MAX = 21; - public static readonly ALLOW = 22; - public static readonly POLL = 23; - public static readonly QUERYABLE = 24; - public static readonly RPC = 25; - public static readonly QUERY_REASON = 26; - public static readonly TYPE = 27; - public static readonly OBJECT = 28; - public static readonly STORABLE = 29; - public static readonly IMPLEMENTS = 30; - public static readonly REF = 31; - public static readonly FRAGMENT = 32; - public static readonly IMPORT = 33; - public static readonly EXTERNAL = 34; - public static readonly ATOM = 35; - public static readonly INTERFACE = 36; - public static readonly INTERFACES = 37; - public static readonly PACKAGE = 38; - public static readonly VALUE = 39; - public static readonly RELATION = 40; - public static readonly OPERATION = 41; - public static readonly FUNCTION = 42; - public static readonly CONSTRUCTOR = 43; - public static readonly CONSTRUCTS = 44; - public static readonly INPUT = 45; - public static readonly CONFORM = 46; - public static readonly AS = 47; - public static readonly BIND = 48; - public static readonly STATIC = 49; - public static readonly TO = 50; - public static readonly PRIVATE = 51; - public static readonly SHARED = 52; - public static readonly STATE = 53; - public static readonly EDGE = 54; - public static readonly PROJECTION = 55; - public static readonly WITH = 56; - public static readonly USING = 57; - public static readonly VIA = 58; - public static readonly MATERIALIZE = 59; - public static readonly IF = 60; - public static readonly ABSENT = 61; - public static readonly ON = 62; - public static readonly POLICY = 63; - public static readonly DEFAULT = 64; - public static readonly SOURCE = 65; - public static readonly REPOSITORY = 66; - public static readonly COMMIT = 67; - public static readonly REVISION = 68; - public static readonly SEMANTIC_MAJOR = 69; - public static readonly ON_DELETE = 70; - public static readonly RETAIN_OTHER = 71; - public static readonly KEYED = 72; - public static readonly PUBLIC_TRAVERSAL = 73; - public static readonly ID = 74; - public static readonly DOC = 75; - public static readonly MODE = 76; - public static readonly EMITS = 77; - public static readonly RECEIVER = 78; - public static readonly REQUIRES = 79; - public static readonly ANY = 80; - public static readonly GET = 81; - public static readonly SET = 82; - public static readonly WATCH = 83; - public static readonly START = 84; - public static readonly STOP = 85; - public static readonly READ = 86; - public static readonly WRITE = 87; - public static readonly RESOLVE = 88; - public static readonly CONNECT = 89; - public static readonly DISCONNECT = 90; - public static readonly CALL = 91; - public static readonly WATCH_START = 92; - public static readonly WATCH_STOP = 93; - public static readonly SUBSCRIBE = 94; - public static readonly UNSUBSCRIBE = 95; - public static readonly OPTIMISTIC_REGISTER = 96; - public static readonly CRDT = 97; - public static readonly OPTIONAL_ONE = 98; - public static readonly EXACTLY_ONE = 99; - public static readonly MANY_UNIQUE = 100; - public static readonly MANY = 101; - public static readonly ORDERED = 102; - public static readonly UNIT = 103; - public static readonly WATCH_HANDLE = 104; - public static readonly MESSAGE = 105; - public static readonly ATOM_REF = 106; - public static readonly INTERFACE_REF = 107; - public static readonly OPTIONAL = 108; - public static readonly LIST = 109; - public static readonly RECORD = 110; - public static readonly BOOL = 111; - public static readonly BYTES = 112; - public static readonly DOUBLE = 113; - public static readonly INT32 = 114; - public static readonly INT64 = 115; - public static readonly STRING = 116; - public static readonly UINT32 = 117; - public static readonly UINT64 = 118; - public static readonly TRUE = 119; - public static readonly FALSE = 120; - public static readonly NULL = 121; - public static readonly ARROW = 122; - public static readonly COLON = 123; - public static readonly SEMI = 124; - public static readonly COMMA = 125; - public static readonly DOT = 126; - public static readonly LBRACE = 127; - public static readonly RBRACE = 128; - public static readonly LBRACK = 129; - public static readonly RBRACK = 130; - public static readonly LPAREN = 131; - public static readonly RPAREN = 132; - public static readonly LT = 133; - public static readonly GT = 134; - public static readonly AMP = 135; - public static readonly EQUAL = 136; - public static readonly INTEGER = 137; - public static readonly JSON_NUMBER = 138; - public static readonly IDENTIFIER = 139; - public static readonly STRING_LITERAL = 140; - public static readonly LINE_COMMENT = 141; - public static readonly BLOCK_COMMENT = 142; - public static readonly WS = 143; + public static readonly CREATION = 1; + public static readonly INITIALIZE = 2; + public static readonly WORKSPACE = 3; + public static readonly EXECUTION = 4; + public static readonly SNAPSHOT = 5; + public static readonly TRANSACTION = 6; + public static readonly REMOTE = 7; + public static readonly TARGETS = 8; + public static readonly PORTABLE = 9; + public static readonly REPLICA = 10; + public static readonly LOCAL = 11; + public static readonly FROM = 12; + public static readonly RESULT_BYTES = 13; + public static readonly RPC_CALLS = 14; + public static readonly DEADLINE_MS = 15; + public static readonly QUERY = 16; + public static readonly REFLECTION = 17; + public static readonly SPECIALIZE = 18; + public static readonly ROOT = 19; + public static readonly DOCUMENT = 20; + public static readonly FRAGMENTS = 21; + public static readonly VIEW = 22; + public static readonly MAX = 23; + public static readonly ALLOW = 24; + public static readonly POLL = 25; + public static readonly QUERYABLE = 26; + public static readonly RPC = 27; + public static readonly QUERY_REASON = 28; + public static readonly TYPE = 29; + public static readonly OBJECT = 30; + public static readonly STORABLE = 31; + public static readonly IMPLEMENTS = 32; + public static readonly REF = 33; + public static readonly FRAGMENT = 34; + public static readonly IMPORT = 35; + public static readonly EXTERNAL = 36; + public static readonly ATOM = 37; + public static readonly INTERFACE = 38; + public static readonly INTERFACES = 39; + public static readonly PACKAGE = 40; + public static readonly VALUE = 41; + public static readonly RELATION = 42; + public static readonly OPERATION = 43; + public static readonly FUNCTION = 44; + public static readonly CONSTRUCTOR = 45; + public static readonly CONSTRUCTS = 46; + public static readonly INPUT = 47; + public static readonly CONFORM = 48; + public static readonly AS = 49; + public static readonly BIND = 50; + public static readonly STATIC = 51; + public static readonly TO = 52; + public static readonly PRIVATE = 53; + public static readonly SHARED = 54; + public static readonly STATE = 55; + public static readonly EDGE = 56; + public static readonly PROJECTION = 57; + public static readonly WITH = 58; + public static readonly USING = 59; + public static readonly VIA = 60; + public static readonly MATERIALIZE = 61; + public static readonly IF = 62; + public static readonly ABSENT = 63; + public static readonly ON = 64; + public static readonly POLICY = 65; + public static readonly DEFAULT = 66; + public static readonly SOURCE = 67; + public static readonly REPOSITORY = 68; + public static readonly COMMIT = 69; + public static readonly REVISION = 70; + public static readonly SEMANTIC_MAJOR = 71; + public static readonly ON_DELETE = 72; + public static readonly RETAIN_OTHER = 73; + public static readonly KEYED = 74; + public static readonly PUBLIC_TRAVERSAL = 75; + public static readonly ID = 76; + public static readonly DOC = 77; + public static readonly MODE = 78; + public static readonly EMITS = 79; + public static readonly RECEIVER = 80; + public static readonly REQUIRES = 81; + public static readonly ANY = 82; + public static readonly GET = 83; + public static readonly SET = 84; + public static readonly WATCH = 85; + public static readonly START = 86; + public static readonly STOP = 87; + public static readonly READ = 88; + public static readonly WRITE = 89; + public static readonly RESOLVE = 90; + public static readonly CONNECT = 91; + public static readonly DISCONNECT = 92; + public static readonly CALL = 93; + public static readonly WATCH_START = 94; + public static readonly WATCH_STOP = 95; + public static readonly SUBSCRIBE = 96; + public static readonly UNSUBSCRIBE = 97; + public static readonly REGISTER = 98; + public static readonly CRDT = 99; + public static readonly OPTIONAL_ONE = 100; + public static readonly EXACTLY_ONE = 101; + public static readonly MANY_UNIQUE = 102; + public static readonly MANY = 103; + public static readonly ORDERED = 104; + public static readonly UNIT = 105; + public static readonly WATCH_HANDLE = 106; + public static readonly MESSAGE = 107; + public static readonly ATOM_REF = 108; + public static readonly INTERFACE_REF = 109; + public static readonly OPTIONAL = 110; + public static readonly LIST = 111; + public static readonly RECORD = 112; + public static readonly BOOL = 113; + public static readonly BYTES = 114; + public static readonly DOUBLE = 115; + public static readonly INT32 = 116; + public static readonly INT64 = 117; + public static readonly STRING = 118; + public static readonly UINT32 = 119; + public static readonly UINT64 = 120; + public static readonly TRUE = 121; + public static readonly FALSE = 122; + public static readonly NULL = 123; + public static readonly ARROW = 124; + public static readonly COLON = 125; + public static readonly SEMI = 126; + public static readonly COMMA = 127; + public static readonly DOT = 128; + public static readonly LBRACE = 129; + public static readonly RBRACE = 130; + public static readonly LBRACK = 131; + public static readonly RBRACK = 132; + public static readonly LPAREN = 133; + public static readonly RPAREN = 134; + public static readonly LT = 135; + public static readonly GT = 136; + public static readonly AMP = 137; + public static readonly EQUAL = 138; + public static readonly INTEGER = 139; + public static readonly JSON_NUMBER = 140; + public static readonly IDENTIFIER = 141; + public static readonly STRING_LITERAL = 142; + public static readonly LINE_COMMENT = 143; + public static readonly BLOCK_COMMENT = 144; + public static readonly WS = 145; public static readonly RULE_document = 0; public static readonly RULE_fragmentDecl = 1; public static readonly RULE_sourceImportDecl = 2; @@ -204,61 +206,65 @@ export class QuixosCapabilityParser extends antlr.Parser { public static readonly RULE_edgeEndpoint = 48; public static readonly RULE_conformanceDecl = 49; public static readonly RULE_conformanceItem = 50; - public static readonly RULE_stateFieldBindingDecl = 51; - public static readonly RULE_relationshipMaterializationDecl = 52; - public static readonly RULE_operationBindingDecl = 53; - public static readonly RULE_memberOperationRef = 54; - public static readonly RULE_operationName = 55; - public static readonly RULE_operationProvider = 56; - public static readonly RULE_statePrimitive = 57; - public static readonly RULE_edgePrimitive = 58; - public static readonly RULE_dependencyBindingBlock = 59; - public static readonly RULE_dependencyBinding = 60; - public static readonly RULE_constructorBindingDecl = 61; - public static readonly RULE_valueType = 62; - public static readonly RULE_recordField = 63; - public static readonly RULE_scalarType = 64; - public static readonly RULE_cardinality = 65; - public static readonly RULE_jsonLiteral = 66; - public static readonly RULE_jsonObject = 67; - public static readonly RULE_jsonMember = 68; - public static readonly RULE_jsonArray = 69; - public static readonly RULE_identifier = 70; - public static readonly RULE_stringLiteral = 71; + public static readonly RULE_initializationDecl = 51; + public static readonly RULE_initializationField = 52; + public static readonly RULE_creationOwnerMapping = 53; + public static readonly RULE_stateFieldBindingDecl = 54; + public static readonly RULE_relationshipMaterializationDecl = 55; + public static readonly RULE_operationBindingDecl = 56; + public static readonly RULE_memberOperationRef = 57; + public static readonly RULE_operationName = 58; + public static readonly RULE_operationProvider = 59; + public static readonly RULE_statePrimitive = 60; + public static readonly RULE_edgePrimitive = 61; + public static readonly RULE_dependencyBindingBlock = 62; + public static readonly RULE_dependencyBinding = 63; + public static readonly RULE_constructorBindingDecl = 64; + public static readonly RULE_valueType = 65; + public static readonly RULE_recordField = 66; + public static readonly RULE_scalarType = 67; + public static readonly RULE_cardinality = 68; + public static readonly RULE_jsonLiteral = 69; + public static readonly RULE_jsonObject = 70; + public static readonly RULE_jsonMember = 71; + public static readonly RULE_jsonArray = 72; + public static readonly RULE_identifier = 73; + public static readonly RULE_stringLiteral = 74; public static readonly literalNames = [ - null, "'workspace'", "'execution'", "'snapshot'", "'transaction'", - "'remote'", "'targets'", "'portable'", "'replica'", "'local'", "'from'", - "'result-bytes'", "'rpc-calls'", "'deadline-ms'", "'query'", "'reflection'", - "'specialize'", "'root'", "'document'", "'fragments'", "'view'", - "'max'", "'allow'", "'poll'", "'queryable'", "'rpc'", "'query-reason'", - "'type'", "'object'", "'storable'", "'implements'", "'ref'", "'fragment'", - "'import'", "'external'", "'atom'", "'interface'", "'interfaces'", - "'package'", "'value'", "'relation'", "'operation'", "'function'", - "'constructor'", "'constructs'", "'input'", "'conform'", "'as'", - "'bind'", "'static'", "'to'", "'private'", "'shared'", "'state'", - "'edge'", "'projection'", "'with'", "'using'", "'via'", "'materialize'", - "'if'", "'absent'", "'on'", "'policy'", "'default'", "'source'", - "'repository'", "'commit'", "'revision'", "'semantic-major'", "'on-delete'", - "'retain-other'", "'keyed'", "'public-traversal'", "'id'", "'doc'", - "'mode'", "'emits'", "'receiver'", "'requires'", "'any'", "'get'", - "'set'", "'watch'", "'start'", "'stop'", "'read'", "'write'", "'resolve'", - "'connect'", "'disconnect'", "'call'", "'watch-start'", "'watch-stop'", - "'subscribe'", "'unsubscribe'", "'optimistic-register'", "'crdt'", - "'optional-one'", "'exactly-one'", "'many-unique'", "'many'", "'ordered'", - "'unit'", "'watch-handle'", "'message'", "'atom-ref'", "'interface-ref'", - "'optional'", "'list'", "'record'", "'bool'", "'bytes'", "'double'", - "'int32'", "'int64'", "'string'", "'uint32'", "'uint64'", "'true'", - "'false'", "'null'", "'->'", "':'", "';'", "','", "'.'", "'{'", - "'}'", "'['", "']'", "'('", "')'", "'<'", "'>'", "'&'", "'='" + null, "'creation'", "'initialize'", "'workspace'", "'execution'", + "'snapshot'", "'transaction'", "'remote'", "'targets'", "'portable'", + "'replica'", "'local'", "'from'", "'result-bytes'", "'rpc-calls'", + "'deadline-ms'", "'query'", "'reflection'", "'specialize'", "'root'", + "'document'", "'fragments'", "'view'", "'max'", "'allow'", "'poll'", + "'queryable'", "'rpc'", "'query-reason'", "'type'", "'object'", + "'storable'", "'implements'", "'ref'", "'fragment'", "'import'", + "'external'", "'atom'", "'interface'", "'interfaces'", "'package'", + "'value'", "'relation'", "'operation'", "'function'", "'constructor'", + "'constructs'", "'input'", "'conform'", "'as'", "'bind'", "'static'", + "'to'", "'private'", "'shared'", "'state'", "'edge'", "'projection'", + "'with'", "'using'", "'via'", "'materialize'", "'if'", "'absent'", + "'on'", "'policy'", "'default'", "'source'", "'repository'", "'commit'", + "'revision'", "'semantic-major'", "'on-delete'", "'retain-other'", + "'keyed'", "'public-traversal'", "'id'", "'doc'", "'mode'", "'emits'", + "'receiver'", "'requires'", "'any'", "'get'", "'set'", "'watch'", + "'start'", "'stop'", "'read'", "'write'", "'resolve'", "'connect'", + "'disconnect'", "'call'", "'watch-start'", "'watch-stop'", "'subscribe'", + "'unsubscribe'", "'register'", "'crdt'", "'optional-one'", "'exactly-one'", + "'many-unique'", "'many'", "'ordered'", "'unit'", "'watch-handle'", + "'message'", "'atom-ref'", "'interface-ref'", "'optional'", "'list'", + "'record'", "'bool'", "'bytes'", "'double'", "'int32'", "'int64'", + "'string'", "'uint32'", "'uint64'", "'true'", "'false'", "'null'", + "'->'", "':'", "';'", "','", "'.'", "'{'", "'}'", "'['", "']'", + "'('", "')'", "'<'", "'>'", "'&'", "'='" ]; public static readonly symbolicNames = [ - null, "WORKSPACE", "EXECUTION", "SNAPSHOT", "TRANSACTION", "REMOTE", - "TARGETS", "PORTABLE", "REPLICA", "LOCAL", "FROM", "RESULT_BYTES", - "RPC_CALLS", "DEADLINE_MS", "QUERY", "REFLECTION", "SPECIALIZE", - "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", "MAX", "ALLOW", "POLL", - "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", "OBJECT", "STORABLE", + null, "CREATION", "INITIALIZE", "WORKSPACE", "EXECUTION", "SNAPSHOT", + "TRANSACTION", "REMOTE", "TARGETS", "PORTABLE", "REPLICA", "LOCAL", + "FROM", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", "REFLECTION", + "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", "MAX", "ALLOW", + "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", "OBJECT", "STORABLE", "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", @@ -269,7 +275,7 @@ export class QuixosCapabilityParser extends antlr.Parser { "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", - "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", + "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", @@ -292,7 +298,8 @@ export class QuixosCapabilityParser extends antlr.Parser { "operationMode", "receiverRequirement", "identifierList", "dependencyBlock", "dependencyPort", "primitiveList", "primitive", "sharedAttachmentDecl", "attachmentDecl", "stateDecl", "storagePolicy", "edgeDecl", "edgeEndpoint", - "conformanceDecl", "conformanceItem", "stateFieldBindingDecl", "relationshipMaterializationDecl", + "conformanceDecl", "conformanceItem", "initializationDecl", "initializationField", + "creationOwnerMapping", "stateFieldBindingDecl", "relationshipMaterializationDecl", "operationBindingDecl", "memberOperationRef", "operationName", "operationProvider", "statePrimitive", "edgePrimitive", "dependencyBindingBlock", "dependencyBinding", "constructorBindingDecl", "valueType", "recordField", "scalarType", @@ -318,42 +325,42 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new DocumentContext(this.context, this.state); this.enterRule(localContext, 0, QuixosCapabilityParser.RULE_document); try { - this.state = 156; + this.state = 162; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 0, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 144; + this.state = 150; this.workspaceDecl(); - this.state = 145; + this.state = 151; this.match(QuixosCapabilityParser.EOF); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 147; + this.state = 153; this.interfaceResourceDecl(); - this.state = 148; + this.state = 154; this.match(QuixosCapabilityParser.EOF); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 150; + this.state = 156; this.packageResourceDecl(); - this.state = 151; + this.state = 157; this.match(QuixosCapabilityParser.EOF); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 153; + this.state = 159; this.fragmentDecl(); - this.state = 154; + this.state = 160; this.match(QuixosCapabilityParser.EOF); } break; @@ -379,25 +386,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 158; + this.state = 164; this.match(QuixosCapabilityParser.FRAGMENT); - this.state = 159; + this.state = 165; this.match(QuixosCapabilityParser.LBRACE); - this.state = 163; + this.state = 169; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 27)) & ~0x1F) === 0 && ((1 << (_la - 27)) & 34144577) !== 0)) { + while (((((_la - 29)) & ~0x1F) === 0 && ((1 << (_la - 29)) & 34144577) !== 0)) { { { - this.state = 160; + this.state = 166; this.workspaceItem(); } } - this.state = 165; + this.state = 171; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 166; + this.state = 172; this.match(QuixosCapabilityParser.RBRACE); } } @@ -420,11 +427,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 168; + this.state = 174; this.match(QuixosCapabilityParser.IMPORT); - this.state = 169; + this.state = 175; this.stringLiteral(); - this.state = 170; + this.state = 176; this.match(QuixosCapabilityParser.SEMI); } } @@ -448,39 +455,39 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 172; - this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 173; - this.identifier(); - this.state = 174; - this.match(QuixosCapabilityParser.ID); - this.state = 175; - this.stringLiteral(); - this.state = 176; - this.match(QuixosCapabilityParser.REVISION); - this.state = 177; - this.stringLiteral(); this.state = 178; - this.match(QuixosCapabilityParser.COMMIT); + this.match(QuixosCapabilityParser.WORKSPACE); this.state = 179; - this.stringLiteral(); + this.identifier(); this.state = 180; - this.match(QuixosCapabilityParser.LBRACE); + this.match(QuixosCapabilityParser.ID); + this.state = 181; + this.stringLiteral(); + this.state = 182; + this.match(QuixosCapabilityParser.REVISION); + this.state = 183; + this.stringLiteral(); this.state = 184; + this.match(QuixosCapabilityParser.COMMIT); + this.state = 185; + this.stringLiteral(); + this.state = 186; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 190; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 27)) & ~0x1F) === 0 && ((1 << (_la - 27)) & 34144577) !== 0)) { + while (((((_la - 29)) & ~0x1F) === 0 && ((1 << (_la - 29)) & 34144577) !== 0)) { { { - this.state = 181; + this.state = 187; this.workspaceItem(); } } - this.state = 186; + this.state = 192; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 187; + this.state = 193; this.match(QuixosCapabilityParser.RBRACE); } } @@ -501,55 +508,55 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new WorkspaceItemContext(this.context, this.state); this.enterRule(localContext, 8, QuixosCapabilityParser.RULE_workspaceItem); try { - this.state = 196; + this.state = 202; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 3, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 189; + this.state = 195; this.sourceImportDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 190; + this.state = 196; this.atomDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 191; + this.state = 197; this.resourceImportDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 192; + this.state = 198; this.sharedAttachmentDecl(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 193; + this.state = 199; this.conformanceDecl(); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 194; + this.state = 200; this.constructorBindingDecl(); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 195; + this.state = 201; this.typeAliasDecl(); } break; @@ -572,32 +579,32 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ResourceImportDeclContext(this.context, this.state); this.enterRule(localContext, 10, QuixosCapabilityParser.RULE_resourceImportDecl); try { - this.state = 208; + this.state = 214; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 4, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 198; + this.state = 204; this.match(QuixosCapabilityParser.IMPORT); - this.state = 199; + this.state = 205; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 200; + this.state = 206; this.identifier(); - this.state = 201; + this.state = 207; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 203; + this.state = 209; this.match(QuixosCapabilityParser.IMPORT); - this.state = 204; + this.state = 210; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 205; + this.state = 211; this.identifier(); - this.state = 206; + this.state = 212; this.match(QuixosCapabilityParser.SEMI); } break; @@ -622,17 +629,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 210; + this.state = 216; this.match(QuixosCapabilityParser.EXTERNAL); - this.state = 211; + this.state = 217; this.match(QuixosCapabilityParser.ATOM); - this.state = 212; + this.state = 218; this.identifier(); - this.state = 213; + this.state = 219; this.match(QuixosCapabilityParser.ID); - this.state = 214; + this.state = 220; this.stringLiteral(); - this.state = 215; + this.state = 221; this.match(QuixosCapabilityParser.SEMI); } } @@ -655,17 +662,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 217; + this.state = 223; this.match(QuixosCapabilityParser.EXTERNAL); - this.state = 218; + this.state = 224; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 219; + this.state = 225; this.identifier(); - this.state = 220; + this.state = 226; this.match(QuixosCapabilityParser.REVISION); - this.state = 221; + this.state = 227; this.stringLiteral(); - this.state = 222; + this.state = 228; this.match(QuixosCapabilityParser.SEMI); } } @@ -686,34 +693,34 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ResourcePreambleContext(this.context, this.state); this.enterRule(localContext, 16, QuixosCapabilityParser.RULE_resourcePreamble); try { - this.state = 228; + this.state = 234; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 5, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 224; + this.state = 230; this.resourceImportDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 225; + this.state = 231; this.externalAtomDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 226; + this.state = 232; this.externalInterfaceDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 227; + this.state = 233; this.typeAliasDecl(); } break; @@ -739,27 +746,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 230; - this.match(QuixosCapabilityParser.ATOM); - this.state = 231; - this.identifier(); - this.state = 232; - this.match(QuixosCapabilityParser.ID); - this.state = 233; - this.stringLiteral(); this.state = 236; + this.match(QuixosCapabilityParser.ATOM); + this.state = 237; + this.identifier(); + this.state = 238; + this.match(QuixosCapabilityParser.ID); + this.state = 239; + this.stringLiteral(); + this.state = 242; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 75) { + if (_la === 77) { { - this.state = 234; + this.state = 240; this.match(QuixosCapabilityParser.DOC); - this.state = 235; + this.state = 241; this.stringLiteral(); } } - this.state = 238; + this.state = 244; this.match(QuixosCapabilityParser.SEMI); } } @@ -783,87 +790,87 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 243; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - while (((((_la - 27)) & ~0x1F) === 0 && ((1 << (_la - 27)) & 193) !== 0)) { - { - { - this.state = 240; - this.resourcePreamble(); - } - } - this.state = 245; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - } - this.state = 246; - this.match(QuixosCapabilityParser.INTERFACE); - this.state = 247; - this.identifier(); this.state = 249; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 133) { + while (((((_la - 29)) & ~0x1F) === 0 && ((1 << (_la - 29)) & 193) !== 0)) { { - this.state = 248; + { + this.state = 246; + this.resourcePreamble(); + } + } + this.state = 251; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + this.state = 252; + this.match(QuixosCapabilityParser.INTERFACE); + this.state = 253; + this.identifier(); + this.state = 255; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 135) { + { + this.state = 254; this.typeParameters(); } } - this.state = 251; + this.state = 257; this.match(QuixosCapabilityParser.ID); - this.state = 252; + this.state = 258; this.stringLiteral(); - this.state = 253; + this.state = 259; this.match(QuixosCapabilityParser.REVISION); - this.state = 254; + this.state = 260; this.stringLiteral(); - this.state = 264; + this.state = 270; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 79) { + if (_la === 81) { { - this.state = 255; - this.match(QuixosCapabilityParser.REQUIRES); - this.state = 256; - this.interfaceType(); this.state = 261; + this.match(QuixosCapabilityParser.REQUIRES); + this.state = 262; + this.interfaceType(); + this.state = 267; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 125) { + while (_la === 127) { { { - this.state = 257; + this.state = 263; this.match(QuixosCapabilityParser.COMMA); - this.state = 258; + this.state = 264; this.interfaceType(); } } - this.state = 263; + this.state = 269; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 266; + this.state = 272; this.match(QuixosCapabilityParser.LBRACE); - this.state = 270; + this.state = 276; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 24)) & ~0x1F) === 0 && ((1 << (_la - 24)) & 33783809) !== 0)) { + while (((((_la - 26)) & ~0x1F) === 0 && ((1 << (_la - 26)) & 33783809) !== 0)) { { { - this.state = 267; + this.state = 273; this.interfaceMember(); } } - this.state = 272; + this.state = 278; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 273; + this.state = 279; this.match(QuixosCapabilityParser.RBRACE); } } @@ -887,27 +894,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 275; - this.match(QuixosCapabilityParser.LT); - this.state = 276; - this.typeParameter(); this.state = 281; + this.match(QuixosCapabilityParser.LT); + this.state = 282; + this.typeParameter(); + this.state = 287; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 125) { + while (_la === 127) { { { - this.state = 277; + this.state = 283; this.match(QuixosCapabilityParser.COMMA); - this.state = 278; + this.state = 284; this.typeParameter(); } } - this.state = 283; + this.state = 289; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 284; + this.state = 290; this.match(QuixosCapabilityParser.GT); } } @@ -929,24 +936,24 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 24, QuixosCapabilityParser.RULE_typeParameter); let _la: number; try { - this.state = 305; + this.state = 311; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.VALUE: this.enterOuterAlt(localContext, 1); { - this.state = 286; + this.state = 292; this.match(QuixosCapabilityParser.VALUE); - this.state = 287; + this.state = 293; this.identifier(); - this.state = 290; + this.state = 296; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 123) { + if (_la === 125) { { - this.state = 288; + this.state = 294; this.match(QuixosCapabilityParser.COLON); - this.state = 289; + this.state = 295; this.match(QuixosCapabilityParser.STORABLE); } } @@ -956,32 +963,32 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 2); { - this.state = 292; + this.state = 298; this.match(QuixosCapabilityParser.OBJECT); - this.state = 293; + this.state = 299; this.identifier(); - this.state = 303; + this.state = 309; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 30) { + if (_la === 32) { { - this.state = 294; - this.match(QuixosCapabilityParser.IMPLEMENTS); - this.state = 295; - this.interfaceType(); this.state = 300; + this.match(QuixosCapabilityParser.IMPLEMENTS); + this.state = 301; + this.interfaceType(); + this.state = 306; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 135) { + while (_la === 137) { { { - this.state = 296; + this.state = 302; this.match(QuixosCapabilityParser.AMP); - this.state = 297; + this.state = 303; this.interfaceType(); } } - this.state = 302; + this.state = 308; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } @@ -1014,14 +1021,14 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 307; + this.state = 313; this.identifier(); - this.state = 309; + this.state = 315; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 133) { + if (_la === 135) { { - this.state = 308; + this.state = 314; this.typeArguments(); } } @@ -1048,27 +1055,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 311; - this.match(QuixosCapabilityParser.LT); - this.state = 312; - this.typeArgument(); this.state = 317; + this.match(QuixosCapabilityParser.LT); + this.state = 318; + this.typeArgument(); + this.state = 323; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 125) { + while (_la === 127) { { { - this.state = 313; + this.state = 319; this.match(QuixosCapabilityParser.COMMA); - this.state = 314; + this.state = 320; this.typeArgument(); } } - this.state = 319; + this.state = 325; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 320; + this.state = 326; this.match(QuixosCapabilityParser.GT); } } @@ -1089,33 +1096,33 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new TypeArgumentContext(this.context, this.state); this.enterRule(localContext, 30, QuixosCapabilityParser.RULE_typeArgument); try { - this.state = 329; + this.state = 335; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 1); { - this.state = 322; + this.state = 328; this.match(QuixosCapabilityParser.ATOM); - this.state = 323; + this.state = 329; this.identifier(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 2); { - this.state = 324; + this.state = 330; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 325; + this.state = 331; this.interfaceType(); } break; case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 326; + this.state = 332; this.match(QuixosCapabilityParser.OBJECT); - this.state = 327; + this.state = 333; this.identifier(); } break; @@ -1156,7 +1163,7 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 4); { - this.state = 328; + this.state = 334; this.valueType(); } break; @@ -1184,25 +1191,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 331; + this.state = 337; this.match(QuixosCapabilityParser.TYPE); - this.state = 332; + this.state = 338; this.identifier(); - this.state = 334; + this.state = 340; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 133) { + if (_la === 135) { { - this.state = 333; + this.state = 339; this.typeParameters(); } } - this.state = 336; + this.state = 342; this.match(QuixosCapabilityParser.EQUAL); - this.state = 337; + this.state = 343; this.valueType(); - this.state = 338; + this.state = 344; this.match(QuixosCapabilityParser.SEMI); } } @@ -1223,27 +1230,27 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new InterfaceMemberContext(this.context, this.state); this.enterRule(localContext, 34, QuixosCapabilityParser.RULE_interfaceMember); try { - this.state = 343; + this.state = 349; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 21, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 340; + this.state = 346; this.valueMember(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 341; + this.state = 347; this.relationshipMember(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 342; + this.state = 348; this.operationMember(); } break; @@ -1269,53 +1276,53 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 346; + this.state = 352; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 49) { + if (_la === 51) { { - this.state = 345; + this.state = 351; this.match(QuixosCapabilityParser.STATIC); } } - this.state = 348; - this.match(QuixosCapabilityParser.OPERATION); - this.state = 349; - this.identifier(); - this.state = 350; - this.match(QuixosCapabilityParser.ID); - this.state = 351; - this.stringLiteral(); - this.state = 352; - this.match(QuixosCapabilityParser.COLON); - this.state = 353; - this.valueType(); this.state = 354; - this.match(QuixosCapabilityParser.ARROW); + this.match(QuixosCapabilityParser.OPERATION); this.state = 355; - this.valueType(); + this.identifier(); this.state = 356; - this.match(QuixosCapabilityParser.LBRACE); - this.state = 357; - this.match(QuixosCapabilityParser.CALL); - this.state = 358; this.match(QuixosCapabilityParser.ID); - this.state = 359; + this.state = 357; this.stringLiteral(); + this.state = 358; + this.match(QuixosCapabilityParser.COLON); + this.state = 359; + this.valueType(); + this.state = 360; + this.match(QuixosCapabilityParser.ARROW); this.state = 361; + this.valueType(); + this.state = 362; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 363; + this.match(QuixosCapabilityParser.CALL); + this.state = 364; + this.match(QuixosCapabilityParser.ID); + this.state = 365; + this.stringLiteral(); + this.state = 367; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 2) { + if (_la === 4) { { - this.state = 360; + this.state = 366; this.executionClause(); } } - this.state = 363; + this.state = 369; this.match(QuixosCapabilityParser.SEMI); - this.state = 364; + this.state = 370; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1339,45 +1346,45 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 367; + this.state = 373; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 24) { + if (_la === 26) { { - this.state = 366; + this.state = 372; this.queryReadContract(); } } - this.state = 369; - this.match(QuixosCapabilityParser.VALUE); - this.state = 370; - this.identifier(); - this.state = 371; - this.match(QuixosCapabilityParser.ID); - this.state = 372; - this.stringLiteral(); - this.state = 373; - this.match(QuixosCapabilityParser.COLON); - this.state = 374; - this.valueType(); this.state = 375; - this.match(QuixosCapabilityParser.LBRACE); + this.match(QuixosCapabilityParser.VALUE); + this.state = 376; + this.identifier(); + this.state = 377; + this.match(QuixosCapabilityParser.ID); + this.state = 378; + this.stringLiteral(); this.state = 379; + this.match(QuixosCapabilityParser.COLON); + this.state = 380; + this.valueType(); + this.state = 381; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 385; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 81)) & ~0x1F) === 0 && ((1 << (_la - 81)) & 7) !== 0)) { + while (((((_la - 83)) & ~0x1F) === 0 && ((1 << (_la - 83)) & 7) !== 0)) { { { - this.state = 376; + this.state = 382; this.valueMemberOperation(); } } - this.state = 381; + this.state = 387; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 382; + this.state = 388; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1399,73 +1406,73 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 40, QuixosCapabilityParser.RULE_valueMemberOperation); let _la: number; try { - this.state = 409; + this.state = 415; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.GET: this.enterOuterAlt(localContext, 1); { - this.state = 384; + this.state = 390; this.match(QuixosCapabilityParser.GET); - this.state = 385; + this.state = 391; this.match(QuixosCapabilityParser.ID); - this.state = 386; + this.state = 392; this.stringLiteral(); - this.state = 388; + this.state = 394; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 2) { + if (_la === 4) { { - this.state = 387; + this.state = 393; this.executionClause(); } } - this.state = 390; + this.state = 396; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.SET: this.enterOuterAlt(localContext, 2); { - this.state = 392; + this.state = 398; this.match(QuixosCapabilityParser.SET); - this.state = 393; + this.state = 399; this.match(QuixosCapabilityParser.ID); - this.state = 394; + this.state = 400; this.stringLiteral(); - this.state = 396; + this.state = 402; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 2) { + if (_la === 4) { { - this.state = 395; + this.state = 401; this.executionClause(); } } - this.state = 398; + this.state = 404; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 3); { - this.state = 400; - this.match(QuixosCapabilityParser.WATCH); - this.state = 401; - this.match(QuixosCapabilityParser.START); - this.state = 402; - this.match(QuixosCapabilityParser.ID); - this.state = 403; - this.stringLiteral(); - this.state = 404; - this.match(QuixosCapabilityParser.STOP); - this.state = 405; - this.match(QuixosCapabilityParser.ID); this.state = 406; - this.stringLiteral(); + this.match(QuixosCapabilityParser.WATCH); this.state = 407; + this.match(QuixosCapabilityParser.START); + this.state = 408; + this.match(QuixosCapabilityParser.ID); + this.state = 409; + this.stringLiteral(); + this.state = 410; + this.match(QuixosCapabilityParser.STOP); + this.state = 411; + this.match(QuixosCapabilityParser.ID); + this.state = 412; + this.stringLiteral(); + this.state = 413; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1493,69 +1500,69 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 412; + this.state = 418; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 24) { + if (_la === 26) { { - this.state = 411; + this.state = 417; this.queryReadContract(); } } - this.state = 414; - this.match(QuixosCapabilityParser.RELATION); - this.state = 415; - this.identifier(); - this.state = 416; - this.match(QuixosCapabilityParser.ID); - this.state = 417; - this.stringLiteral(); - this.state = 418; - this.match(QuixosCapabilityParser.COLON); - this.state = 419; - this.cardinality(); this.state = 420; - this.targetConstraint(); + this.match(QuixosCapabilityParser.RELATION); + this.state = 421; + this.identifier(); this.state = 422; + this.match(QuixosCapabilityParser.ID); + this.state = 423; + this.stringLiteral(); + this.state = 424; + this.match(QuixosCapabilityParser.COLON); + this.state = 425; + this.cardinality(); + this.state = 426; + this.targetConstraint(); + this.state = 428; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 102) { + if (_la === 104) { { - this.state = 421; + this.state = 427; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 426; + this.state = 432; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 72) { + if (_la === 74) { { - this.state = 424; + this.state = 430; this.match(QuixosCapabilityParser.KEYED); - this.state = 425; + this.state = 431; this.stringLiteral(); } } - this.state = 428; + this.state = 434; this.match(QuixosCapabilityParser.LBRACE); - this.state = 432; + this.state = 438; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 83)) & ~0x1F) === 0 && ((1 << (_la - 83)) & 225) !== 0)) { + while (((((_la - 85)) & ~0x1F) === 0 && ((1 << (_la - 85)) & 225) !== 0)) { { { - this.state = 429; + this.state = 435; this.relationshipOperation(); } } - this.state = 434; + this.state = 440; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 435; + this.state = 441; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1579,16 +1586,16 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 437; + this.state = 443; this.match(QuixosCapabilityParser.QUERYABLE); - this.state = 439; + this.state = 445; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 7 || _la === 25) { + if (_la === 9 || _la === 27) { { - this.state = 438; + this.state = 444; _la = this.tokenStream.LA(1); - if(!(_la === 7 || _la === 25)) { + if(!(_la === 9 || _la === 27)) { this.errorHandler.recoverInline(this); } else { @@ -1618,96 +1625,96 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 46, QuixosCapabilityParser.RULE_relationshipOperation); let _la: number; try { - this.state = 474; + this.state = 480; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.RESOLVE: this.enterOuterAlt(localContext, 1); { - this.state = 441; + this.state = 447; this.match(QuixosCapabilityParser.RESOLVE); - this.state = 442; + this.state = 448; this.match(QuixosCapabilityParser.ID); - this.state = 443; + this.state = 449; this.stringLiteral(); - this.state = 445; + this.state = 451; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 2) { + if (_la === 4) { { - this.state = 444; + this.state = 450; this.executionClause(); } } - this.state = 447; + this.state = 453; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONNECT: this.enterOuterAlt(localContext, 2); { - this.state = 449; + this.state = 455; this.match(QuixosCapabilityParser.CONNECT); - this.state = 450; + this.state = 456; this.match(QuixosCapabilityParser.ID); - this.state = 451; + this.state = 457; this.stringLiteral(); - this.state = 453; + this.state = 459; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 2) { + if (_la === 4) { { - this.state = 452; + this.state = 458; this.executionClause(); } } - this.state = 455; + this.state = 461; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.DISCONNECT: this.enterOuterAlt(localContext, 3); { - this.state = 457; + this.state = 463; this.match(QuixosCapabilityParser.DISCONNECT); - this.state = 458; + this.state = 464; this.match(QuixosCapabilityParser.ID); - this.state = 459; + this.state = 465; this.stringLiteral(); - this.state = 461; + this.state = 467; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 2) { + if (_la === 4) { { - this.state = 460; + this.state = 466; this.executionClause(); } } - this.state = 463; + this.state = 469; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 4); { - this.state = 465; - this.match(QuixosCapabilityParser.WATCH); - this.state = 466; - this.match(QuixosCapabilityParser.START); - this.state = 467; - this.match(QuixosCapabilityParser.ID); - this.state = 468; - this.stringLiteral(); - this.state = 469; - this.match(QuixosCapabilityParser.STOP); - this.state = 470; - this.match(QuixosCapabilityParser.ID); this.state = 471; - this.stringLiteral(); + this.match(QuixosCapabilityParser.WATCH); this.state = 472; + this.match(QuixosCapabilityParser.START); + this.state = 473; + this.match(QuixosCapabilityParser.ID); + this.state = 474; + this.stringLiteral(); + this.state = 475; + this.match(QuixosCapabilityParser.STOP); + this.state = 476; + this.match(QuixosCapabilityParser.ID); + this.state = 477; + this.stringLiteral(); + this.state = 478; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1733,31 +1740,31 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 48, QuixosCapabilityParser.RULE_targetConstraint); let _la: number; try { - this.state = 485; + this.state = 491; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 1); { - this.state = 476; + this.state = 482; this.match(QuixosCapabilityParser.ATOM); - this.state = 477; + this.state = 483; this.identifier(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 2); { - this.state = 478; + this.state = 484; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 479; + this.state = 485; this.identifier(); - this.state = 481; + this.state = 487; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 133) { + if (_la === 135) { { - this.state = 480; + this.state = 486; this.typeArguments(); } } @@ -1767,9 +1774,9 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 483; + this.state = 489; this.match(QuixosCapabilityParser.OBJECT); - this.state = 484; + this.state = 490; this.identifier(); } break; @@ -1797,61 +1804,61 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 490; + this.state = 496; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 27)) & ~0x1F) === 0 && ((1 << (_la - 27)) & 193) !== 0)) { + while (((((_la - 29)) & ~0x1F) === 0 && ((1 << (_la - 29)) & 193) !== 0)) { { { - this.state = 487; + this.state = 493; this.resourcePreamble(); } } - this.state = 492; + this.state = 498; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 493; + this.state = 499; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 494; + this.state = 500; this.identifier(); - this.state = 495; - this.match(QuixosCapabilityParser.ID); - this.state = 496; - this.stringLiteral(); - this.state = 497; - this.match(QuixosCapabilityParser.REVISION); - this.state = 498; - this.stringLiteral(); this.state = 501; + this.match(QuixosCapabilityParser.ID); + this.state = 502; + this.stringLiteral(); + this.state = 503; + this.match(QuixosCapabilityParser.REVISION); + this.state = 504; + this.stringLiteral(); + this.state = 507; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 69) { + if (_la === 71) { { - this.state = 499; + this.state = 505; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); - this.state = 500; + this.state = 506; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 503; + this.state = 509; this.match(QuixosCapabilityParser.LBRACE); - this.state = 507; + this.state = 513; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 14)) & ~0x1F) === 0 && ((1 << (_la - 14)) & 939524097) !== 0)) { + while (((((_la - 16)) & ~0x1F) === 0 && ((1 << (_la - 16)) & 939524097) !== 0)) { { { - this.state = 504; + this.state = 510; this.packageExport(); } } - this.state = 509; + this.state = 515; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 510; + this.state = 516; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1872,41 +1879,41 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new PackageExportContext(this.context, this.state); this.enterRule(localContext, 52, QuixosCapabilityParser.RULE_packageExport); try { - this.state = 517; + this.state = 523; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 43, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 512; + this.state = 518; this.packageOperationExport(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 513; + this.state = 519; this.packageFunctionExport(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 514; + this.state = 520; this.packageConstructorExport(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 515; + this.state = 521; this.packageQuery(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 516; + this.state = 522; this.packageQuerySpecialization(); } break; @@ -1932,63 +1939,63 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 519; + this.state = 525; this.match(QuixosCapabilityParser.QUERY); - this.state = 520; + this.state = 526; this.identifier(); - this.state = 522; + this.state = 528; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 133) { + if (_la === 135) { { - this.state = 521; + this.state = 527; this.typeParameters(); } } - this.state = 524; + this.state = 530; this.match(QuixosCapabilityParser.ID); - this.state = 525; + this.state = 531; this.stringLiteral(); - this.state = 526; + this.state = 532; this.match(QuixosCapabilityParser.ROOT); - this.state = 528; + this.state = 534; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 1) { + if (_la === 3) { { - this.state = 527; + this.state = 533; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 530; + this.state = 536; this.interfaceType(); - this.state = 531; + this.state = 537; this.match(QuixosCapabilityParser.DOCUMENT); - this.state = 532; + this.state = 538; this.stringLiteral(); - this.state = 533; - this.match(QuixosCapabilityParser.OPERATION); - this.state = 534; - this.stringLiteral(); - this.state = 535; - this.match(QuixosCapabilityParser.LBRACE); this.state = 539; + this.match(QuixosCapabilityParser.OPERATION); + this.state = 540; + this.stringLiteral(); + this.state = 541; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 545; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 16253696) !== 0) || _la === 83) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 65014784) !== 0) || _la === 85) { { { - this.state = 536; + this.state = 542; this.queryClause(); } } - this.state = 541; + this.state = 547; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 542; + this.state = 548; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2011,21 +2018,21 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 544; - this.match(QuixosCapabilityParser.QUERY); - this.state = 545; - this.identifier(); - this.state = 546; - this.match(QuixosCapabilityParser.ID); - this.state = 547; - this.stringLiteral(); - this.state = 548; - this.match(QuixosCapabilityParser.SPECIALIZE); - this.state = 549; - this.identifier(); this.state = 550; - this.typeArguments(); + this.match(QuixosCapabilityParser.QUERY); this.state = 551; + this.identifier(); + this.state = 552; + this.match(QuixosCapabilityParser.ID); + this.state = 553; + this.stringLiteral(); + this.state = 554; + this.match(QuixosCapabilityParser.SPECIALIZE); + this.state = 555; + this.identifier(); + this.state = 556; + this.typeArguments(); + this.state = 557; this.match(QuixosCapabilityParser.SEMI); } } @@ -2047,118 +2054,118 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 58, QuixosCapabilityParser.RULE_queryClause); let _la: number; try { - this.state = 593; + this.state = 599; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REPLICA: this.enterOuterAlt(localContext, 1); { - this.state = 553; + this.state = 559; this.match(QuixosCapabilityParser.REPLICA); - this.state = 554; + this.state = 560; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.LOCAL: this.enterOuterAlt(localContext, 2); { - this.state = 555; + this.state = 561; this.match(QuixosCapabilityParser.LOCAL); - this.state = 556; + this.state = 562; this.match(QuixosCapabilityParser.FROM); - this.state = 557; + this.state = 563; this.identifier(); - this.state = 558; + this.state = 564; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.FRAGMENTS: this.enterOuterAlt(localContext, 3); { - this.state = 560; + this.state = 566; this.match(QuixosCapabilityParser.FRAGMENTS); - this.state = 561; + this.state = 567; this.stringLiteral(); - this.state = 562; + this.state = 568; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.VIEW: this.enterOuterAlt(localContext, 4); { - this.state = 564; + this.state = 570; this.match(QuixosCapabilityParser.VIEW); - this.state = 566; + this.state = 572; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 28) { + if (_la === 30) { { - this.state = 565; + this.state = 571; this.match(QuixosCapabilityParser.OBJECT); } } - this.state = 568; + this.state = 574; this.identifier(); - this.state = 569; + this.state = 575; this.match(QuixosCapabilityParser.AS); - this.state = 570; + this.state = 576; this.interfaceType(); - this.state = 571; + this.state = 577; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.MAX: this.enterOuterAlt(localContext, 5); { - this.state = 573; + this.state = 579; this.match(QuixosCapabilityParser.MAX); - this.state = 574; + this.state = 580; this.identifier(); - this.state = 575; + this.state = 581; this.match(QuixosCapabilityParser.INTEGER); - this.state = 576; + this.state = 582; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.ALLOW: this.enterOuterAlt(localContext, 6); { - this.state = 578; - this.match(QuixosCapabilityParser.ALLOW); - this.state = 579; - this.interfaceType(); - this.state = 580; - this.match(QuixosCapabilityParser.DOT); - this.state = 581; - this.identifier(); - this.state = 582; - this.identifier(); - this.state = 583; - this.stringLiteral(); this.state = 584; + this.match(QuixosCapabilityParser.ALLOW); + this.state = 585; + this.interfaceType(); + this.state = 586; + this.match(QuixosCapabilityParser.DOT); + this.state = 587; + this.identifier(); + this.state = 588; + this.identifier(); + this.state = 589; + this.stringLiteral(); + this.state = 590; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 7); { - this.state = 586; + this.state = 592; this.match(QuixosCapabilityParser.WATCH); - this.state = 587; + this.state = 593; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.POLL: this.enterOuterAlt(localContext, 8); { - this.state = 588; + this.state = 594; this.match(QuixosCapabilityParser.POLL); - this.state = 589; + this.state = 595; this.match(QuixosCapabilityParser.INTEGER); - this.state = 590; + this.state = 596; this.stringLiteral(); - this.state = 591; + this.state = 597; this.match(QuixosCapabilityParser.SEMI); } break; @@ -2186,71 +2193,71 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 595; + this.state = 601; this.match(QuixosCapabilityParser.OPERATION); - this.state = 596; + this.state = 602; this.identifier(); - this.state = 598; + this.state = 604; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 133) { + if (_la === 135) { { - this.state = 597; + this.state = 603; this.typeParameters(); } } - this.state = 600; - this.match(QuixosCapabilityParser.ID); - this.state = 601; - this.stringLiteral(); - this.state = 602; - this.match(QuixosCapabilityParser.COLON); - this.state = 603; - this.valueType(); - this.state = 604; - this.match(QuixosCapabilityParser.ARROW); - this.state = 605; - this.valueType(); this.state = 606; - this.match(QuixosCapabilityParser.MODE); + this.match(QuixosCapabilityParser.ID); this.state = 607; - this.operationMode(); + this.stringLiteral(); + this.state = 608; + this.match(QuixosCapabilityParser.COLON); this.state = 609; + this.valueType(); + this.state = 610; + this.match(QuixosCapabilityParser.ARROW); + this.state = 611; + this.valueType(); + this.state = 612; + this.match(QuixosCapabilityParser.MODE); + this.state = 613; + this.operationMode(); + this.state = 615; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 2) { + if (_la === 4) { { - this.state = 608; + this.state = 614; this.executionClause(); } } - this.state = 612; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 77) { - { - this.state = 611; - this.eventClause(); - } - } - - this.state = 614; - this.match(QuixosCapabilityParser.RECEIVER); - this.state = 615; - this.receiverRequirement(); - this.state = 617; + this.state = 618; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 79) { { - this.state = 616; + this.state = 617; + this.eventClause(); + } + } + + this.state = 620; + this.match(QuixosCapabilityParser.RECEIVER); + this.state = 621; + this.receiverRequirement(); + this.state = 623; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 81) { + { + this.state = 622; this.dependencyBlock(); } } - this.state = 619; + this.state = 625; this.match(QuixosCapabilityParser.SEMI); } } @@ -2274,53 +2281,53 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 621; + this.state = 627; this.match(QuixosCapabilityParser.FUNCTION); - this.state = 622; + this.state = 628; this.identifier(); - this.state = 624; + this.state = 630; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 133) { + if (_la === 135) { { - this.state = 623; + this.state = 629; this.typeParameters(); } } - this.state = 626; + this.state = 632; this.match(QuixosCapabilityParser.ID); - this.state = 627; - this.stringLiteral(); - this.state = 628; - this.match(QuixosCapabilityParser.COLON); - this.state = 629; - this.valueType(); - this.state = 630; - this.match(QuixosCapabilityParser.ARROW); - this.state = 631; - this.valueType(); this.state = 633; + this.stringLiteral(); + this.state = 634; + this.match(QuixosCapabilityParser.COLON); + this.state = 635; + this.valueType(); + this.state = 636; + this.match(QuixosCapabilityParser.ARROW); + this.state = 637; + this.valueType(); + this.state = 639; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 2) { + if (_la === 4) { { - this.state = 632; + this.state = 638; this.executionClause(); } } - this.state = 636; + this.state = 642; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 79) { + if (_la === 81) { { - this.state = 635; + this.state = 641; this.dependencyBlock(); } } - this.state = 638; + this.state = 644; this.match(QuixosCapabilityParser.SEMI); } } @@ -2342,39 +2349,39 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 64, QuixosCapabilityParser.RULE_executionClause); let _la: number; try { - this.state = 649; + this.state = 655; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 56, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 640; + this.state = 646; this.match(QuixosCapabilityParser.EXECUTION); - this.state = 641; + this.state = 647; this.match(QuixosCapabilityParser.REMOTE); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 642; + this.state = 648; this.match(QuixosCapabilityParser.EXECUTION); - this.state = 643; + this.state = 649; _la = this.tokenStream.LA(1); - if(!(_la === 3 || _la === 4)) { + if(!(_la === 5 || _la === 6)) { this.errorHandler.recoverInline(this); } else { this.errorHandler.reportMatch(this); this.consume(); } - this.state = 644; + this.state = 650; this.match(QuixosCapabilityParser.TARGETS); - this.state = 645; + this.state = 651; this.match(QuixosCapabilityParser.LBRACK); - this.state = 646; + this.state = 652; this.identifierList(); - this.state = 647; + this.state = 653; this.match(QuixosCapabilityParser.RBRACK); } break; @@ -2400,29 +2407,29 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 651; + this.state = 657; this.match(QuixosCapabilityParser.USING); - this.state = 652; - this.match(QuixosCapabilityParser.LBRACK); - this.state = 653; - this.memberOperationRef(); this.state = 658; + this.match(QuixosCapabilityParser.LBRACK); + this.state = 659; + this.memberOperationRef(); + this.state = 664; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 125) { + while (_la === 127) { { { - this.state = 654; + this.state = 660; this.match(QuixosCapabilityParser.COMMA); - this.state = 655; + this.state = 661; this.memberOperationRef(); } } - this.state = 660; + this.state = 666; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 661; + this.state = 667; this.match(QuixosCapabilityParser.RBRACK); } } @@ -2446,33 +2453,33 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 663; - this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 664; - this.identifier(); - this.state = 665; - this.match(QuixosCapabilityParser.ID); - this.state = 666; - this.stringLiteral(); - this.state = 667; - this.match(QuixosCapabilityParser.CONSTRUCTS); - this.state = 668; - this.identifier(); this.state = 669; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.CONSTRUCTOR); this.state = 670; - this.valueType(); + this.identifier(); + this.state = 671; + this.match(QuixosCapabilityParser.ID); this.state = 672; + this.stringLiteral(); + this.state = 673; + this.match(QuixosCapabilityParser.CONSTRUCTS); + this.state = 674; + this.identifier(); + this.state = 675; + this.match(QuixosCapabilityParser.COLON); + this.state = 676; + this.valueType(); + this.state = 678; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 79) { + if (_la === 81) { { - this.state = 671; + this.state = 677; this.dependencyBlock(); } } - this.state = 674; + this.state = 680; this.match(QuixosCapabilityParser.SEMI); } } @@ -2495,9 +2502,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 676; + this.state = 682; this.match(QuixosCapabilityParser.EMITS); - this.state = 677; + this.state = 683; this.valueType(); } } @@ -2521,9 +2528,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 679; + this.state = 685; _la = this.tokenStream.LA(1); - if(!(((((_la - 91)) & ~0x1F) === 0 && ((1 << (_la - 91)) & 31) !== 0))) { + if(!(((((_la - 93)) & ~0x1F) === 0 && ((1 << (_la - 93)) & 31) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2550,68 +2557,68 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 74, QuixosCapabilityParser.RULE_receiverRequirement); let _la: number; try { - this.state = 699; + this.state = 705; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ANY: this.enterOuterAlt(localContext, 1); { - this.state = 681; + this.state = 687; this.match(QuixosCapabilityParser.ANY); } break; case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 2); { - this.state = 682; + this.state = 688; this.match(QuixosCapabilityParser.ATOM); - this.state = 683; + this.state = 689; this.identifier(); } break; case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 684; + this.state = 690; this.match(QuixosCapabilityParser.OBJECT); - this.state = 685; + this.state = 691; this.identifier(); } break; case QuixosCapabilityParser.INTERFACES: this.enterOuterAlt(localContext, 4); { - this.state = 686; + this.state = 692; this.match(QuixosCapabilityParser.INTERFACES); - this.state = 687; + this.state = 693; this.match(QuixosCapabilityParser.LBRACK); - this.state = 696; + this.state = 702; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 67106816) !== 0) || _la === 37 || _la === 65 || _la === 139) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 268427264) !== 0) || _la === 39 || _la === 67 || _la === 141) { { - this.state = 688; + this.state = 694; this.interfaceType(); - this.state = 693; + this.state = 699; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 125) { + while (_la === 127) { { { - this.state = 689; + this.state = 695; this.match(QuixosCapabilityParser.COMMA); - this.state = 690; + this.state = 696; this.interfaceType(); } } - this.state = 695; + this.state = 701; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 698; + this.state = 704; this.match(QuixosCapabilityParser.RBRACK); } break; @@ -2639,21 +2646,21 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 701; + this.state = 707; this.identifier(); - this.state = 706; + this.state = 712; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 125) { + while (_la === 127) { { { - this.state = 702; + this.state = 708; this.match(QuixosCapabilityParser.COMMA); - this.state = 703; + this.state = 709; this.identifier(); } } - this.state = 708; + this.state = 714; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } @@ -2679,25 +2686,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 709; + this.state = 715; this.match(QuixosCapabilityParser.REQUIRES); - this.state = 710; + this.state = 716; this.match(QuixosCapabilityParser.LBRACE); - this.state = 714; + this.state = 720; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 14 || _la === 15 || ((((_la - 36)) & ~0x1F) === 0 && ((1 << (_la - 36)) & 393345) !== 0)) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 196610) !== 0) || ((((_la - 38)) & ~0x1F) === 0 && ((1 << (_la - 38)) & 393345) !== 0)) { { { - this.state = 711; + this.state = 717; this.dependencyPort(); } } - this.state = 716; + this.state = 722; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 717; + this.state = 723; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2719,164 +2726,187 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 80, QuixosCapabilityParser.RULE_dependencyPort); let _la: number; try { - this.state = 783; + this.state = 799; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REFLECTION: this.enterOuterAlt(localContext, 1); { - this.state = 719; - this.match(QuixosCapabilityParser.REFLECTION); - this.state = 720; - this.identifier(); - this.state = 721; - this.match(QuixosCapabilityParser.ID); - this.state = 722; - this.stringLiteral(); - this.state = 723; - this.match(QuixosCapabilityParser.LBRACK); - this.state = 724; - this.identifierList(); this.state = 725; - this.match(QuixosCapabilityParser.RBRACK); + this.match(QuixosCapabilityParser.REFLECTION); this.state = 726; + this.identifier(); + this.state = 727; + this.match(QuixosCapabilityParser.ID); + this.state = 728; + this.stringLiteral(); + this.state = 729; + this.match(QuixosCapabilityParser.LBRACK); + this.state = 730; + this.identifierList(); + this.state = 731; + this.match(QuixosCapabilityParser.RBRACK); + this.state = 732; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 2); { - this.state = 728; - this.match(QuixosCapabilityParser.STATE); - this.state = 729; - this.identifier(); - this.state = 730; - this.match(QuixosCapabilityParser.ID); - this.state = 731; - this.stringLiteral(); - this.state = 732; - this.match(QuixosCapabilityParser.COLON); - this.state = 733; - this.valueType(); this.state = 734; - this.primitiveList(); + this.match(QuixosCapabilityParser.STATE); this.state = 735; + this.identifier(); + this.state = 736; + this.match(QuixosCapabilityParser.ID); + this.state = 737; + this.stringLiteral(); + this.state = 738; + this.match(QuixosCapabilityParser.COLON); + this.state = 739; + this.valueType(); + this.state = 740; + this.primitiveList(); + this.state = 741; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 3); { - this.state = 737; - this.match(QuixosCapabilityParser.EDGE); - this.state = 738; - this.identifier(); - this.state = 739; - this.match(QuixosCapabilityParser.ID); - this.state = 740; - this.stringLiteral(); - this.state = 741; - this.match(QuixosCapabilityParser.COLON); - this.state = 742; - this.cardinality(); this.state = 743; - this.targetConstraint(); + this.match(QuixosCapabilityParser.EDGE); this.state = 744; - this.primitiveList(); + this.identifier(); this.state = 745; + this.match(QuixosCapabilityParser.ID); + this.state = 746; + this.stringLiteral(); + this.state = 747; + this.match(QuixosCapabilityParser.COLON); + this.state = 748; + this.cardinality(); + this.state = 749; + this.targetConstraint(); + this.state = 750; + this.primitiveList(); + this.state = 751; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 4); { - this.state = 747; + this.state = 753; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 748; - this.identifier(); - this.state = 749; - this.match(QuixosCapabilityParser.ID); - this.state = 750; - this.stringLiteral(); - this.state = 751; - this.match(QuixosCapabilityParser.COLON); - this.state = 752; - this.identifier(); this.state = 754; + this.identifier(); + this.state = 755; + this.match(QuixosCapabilityParser.ID); + this.state = 756; + this.stringLiteral(); + this.state = 757; + this.match(QuixosCapabilityParser.COLON); + this.state = 758; + this.identifier(); + this.state = 760; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 133) { + if (_la === 135) { { - this.state = 753; + this.state = 759; this.typeArguments(); } } - this.state = 757; + this.state = 763; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 57) { + if (_la === 59) { { - this.state = 756; + this.state = 762; this.selectedOperations(); } } - this.state = 759; + this.state = 765; + this.match(QuixosCapabilityParser.SEMI); + } + break; + case QuixosCapabilityParser.CREATION: + this.enterOuterAlt(localContext, 5); + { + this.state = 767; + this.match(QuixosCapabilityParser.CREATION); + this.state = 768; + this.identifier(); + this.state = 769; + this.match(QuixosCapabilityParser.ID); + this.state = 770; + this.stringLiteral(); + this.state = 771; + this.match(QuixosCapabilityParser.COLON); + this.state = 772; + this.identifier(); + this.state = 773; + this.match(QuixosCapabilityParser.INPUT); + this.state = 774; + this.valueType(); + this.state = 775; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONSTRUCTOR: - this.enterOuterAlt(localContext, 5); + this.enterOuterAlt(localContext, 6); { - this.state = 761; + this.state = 777; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 762; + this.state = 778; this.identifier(); - this.state = 763; + this.state = 779; this.match(QuixosCapabilityParser.ID); - this.state = 764; + this.state = 780; this.stringLiteral(); - this.state = 765; + this.state = 781; this.match(QuixosCapabilityParser.COLON); - this.state = 766; + this.state = 782; this.identifier(); - this.state = 769; + this.state = 785; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 45) { + if (_la === 47) { { - this.state = 767; + this.state = 783; this.match(QuixosCapabilityParser.INPUT); - this.state = 768; + this.state = 784; this.valueType(); } } - this.state = 771; + this.state = 787; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.QUERY: - this.enterOuterAlt(localContext, 6); + this.enterOuterAlt(localContext, 7); { - this.state = 773; + this.state = 789; this.match(QuixosCapabilityParser.QUERY); - this.state = 774; + this.state = 790; this.identifier(); - this.state = 775; + this.state = 791; this.match(QuixosCapabilityParser.ID); - this.state = 776; + this.state = 792; this.stringLiteral(); - this.state = 777; + this.state = 793; this.match(QuixosCapabilityParser.COLON); - this.state = 778; + this.state = 794; this.identifier(); - this.state = 779; + this.state = 795; this.match(QuixosCapabilityParser.DOT); - this.state = 780; + this.state = 796; this.identifier(); - this.state = 781; + this.state = 797; this.match(QuixosCapabilityParser.SEMI); } break; @@ -2904,27 +2934,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 785; + this.state = 801; this.match(QuixosCapabilityParser.LBRACK); - this.state = 786; + this.state = 802; this.primitive(); - this.state = 791; + this.state = 807; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 125) { + while (_la === 127) { { { - this.state = 787; + this.state = 803; this.match(QuixosCapabilityParser.COMMA); - this.state = 788; + this.state = 804; this.primitive(); } } - this.state = 793; + this.state = 809; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 794; + this.state = 810; this.match(QuixosCapabilityParser.RBRACK); } } @@ -2948,9 +2978,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 796; + this.state = 812; _la = this.tokenStream.LA(1); - if(!(((((_la - 86)) & ~0x1F) === 0 && ((1 << (_la - 86)) & 223) !== 0))) { + if(!(((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 223) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2978,9 +3008,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 798; + this.state = 814; this.match(QuixosCapabilityParser.SHARED); - this.state = 799; + this.state = 815; this.attachmentDecl(); } } @@ -3001,20 +3031,20 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new AttachmentDeclContext(this.context, this.state); this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_attachmentDecl); try { - this.state = 803; + this.state = 819; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 801; + this.state = 817; this.stateDecl(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 802; + this.state = 818; this.edgeDecl(); } break; @@ -3042,39 +3072,39 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 805; + this.state = 821; this.match(QuixosCapabilityParser.STATE); - this.state = 806; + this.state = 822; this.identifier(); - this.state = 807; + this.state = 823; this.match(QuixosCapabilityParser.ID); - this.state = 808; + this.state = 824; this.stringLiteral(); - this.state = 809; + this.state = 825; this.match(QuixosCapabilityParser.ON); - this.state = 810; + this.state = 826; this.identifier(); - this.state = 811; + this.state = 827; this.match(QuixosCapabilityParser.COLON); - this.state = 812; + this.state = 828; this.valueType(); - this.state = 813; + this.state = 829; this.match(QuixosCapabilityParser.POLICY); - this.state = 814; + this.state = 830; this.storagePolicy(); - this.state = 817; + this.state = 833; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 64) { + if (_la === 66) { { - this.state = 815; + this.state = 831; this.match(QuixosCapabilityParser.DEFAULT); - this.state = 816; + this.state = 832; this.jsonLiteral(); } } - this.state = 819; + this.state = 835; this.match(QuixosCapabilityParser.SEMI); } } @@ -3095,26 +3125,26 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new StoragePolicyContext(this.context, this.state); this.enterRule(localContext, 92, QuixosCapabilityParser.RULE_storagePolicy); try { - this.state = 827; + this.state = 843; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { - case QuixosCapabilityParser.OPTIMISTIC_REGISTER: + case QuixosCapabilityParser.REGISTER: this.enterOuterAlt(localContext, 1); { - this.state = 821; - this.match(QuixosCapabilityParser.OPTIMISTIC_REGISTER); + this.state = 837; + this.match(QuixosCapabilityParser.REGISTER); } break; case QuixosCapabilityParser.CRDT: this.enterOuterAlt(localContext, 2); { - this.state = 822; + this.state = 838; this.match(QuixosCapabilityParser.CRDT); - this.state = 823; + this.state = 839; this.match(QuixosCapabilityParser.LPAREN); - this.state = 824; + this.state = 840; this.valueType(); - this.state = 825; + this.state = 841; this.match(QuixosCapabilityParser.RPAREN); } break; @@ -3141,21 +3171,21 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 829; + this.state = 845; this.match(QuixosCapabilityParser.EDGE); - this.state = 830; + this.state = 846; this.identifier(); - this.state = 831; + this.state = 847; this.match(QuixosCapabilityParser.ID); - this.state = 832; + this.state = 848; this.stringLiteral(); - this.state = 833; + this.state = 849; this.match(QuixosCapabilityParser.LBRACE); - this.state = 834; + this.state = 850; this.edgeEndpoint(); - this.state = 835; + this.state = 851; this.edgeEndpoint(); - this.state = 836; + this.state = 852; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3179,73 +3209,73 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 838; + this.state = 854; this.targetConstraint(); - this.state = 839; + this.state = 855; this.match(QuixosCapabilityParser.PROJECTION); - this.state = 840; + this.state = 856; this.identifier(); - this.state = 841; + this.state = 857; this.match(QuixosCapabilityParser.ID); - this.state = 842; + this.state = 858; this.stringLiteral(); - this.state = 843; + this.state = 859; this.cardinality(); - this.state = 845; + this.state = 861; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 102) { + if (_la === 104) { { - this.state = 844; + this.state = 860; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 849; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 70) { - { - this.state = 847; - this.match(QuixosCapabilityParser.ON_DELETE); - this.state = 848; - this.stringLiteral(); - } - } - - this.state = 852; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 71) { - { - this.state = 851; - this.match(QuixosCapabilityParser.RETAIN_OTHER); - } - } - - this.state = 856; + this.state = 865; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 72) { { - this.state = 854; - this.match(QuixosCapabilityParser.KEYED); - this.state = 855; + this.state = 863; + this.match(QuixosCapabilityParser.ON_DELETE); + this.state = 864; this.stringLiteral(); } } - this.state = 859; + this.state = 868; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 73) { { - this.state = 858; + this.state = 867; + this.match(QuixosCapabilityParser.RETAIN_OTHER); + } + } + + this.state = 872; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 74) { + { + this.state = 870; + this.match(QuixosCapabilityParser.KEYED); + this.state = 871; + this.stringLiteral(); + } + } + + this.state = 875; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 75) { + { + this.state = 874; this.match(QuixosCapabilityParser.PUBLIC_TRAVERSAL); } } - this.state = 861; + this.state = 877; this.match(QuixosCapabilityParser.SEMI); } } @@ -3269,65 +3299,65 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 863; + this.state = 879; this.match(QuixosCapabilityParser.CONFORM); - this.state = 864; + this.state = 880; this.identifier(); - this.state = 865; + this.state = 881; this.match(QuixosCapabilityParser.AS); - this.state = 866; + this.state = 882; this.identifier(); - this.state = 868; + this.state = 884; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 133) { + if (_la === 135) { { - this.state = 867; + this.state = 883; this.typeArguments(); } } - this.state = 872; + this.state = 888; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 74) { + if (_la === 76) { { - this.state = 870; + this.state = 886; this.match(QuixosCapabilityParser.ID); - this.state = 871; + this.state = 887; this.stringLiteral(); } } - this.state = 876; + this.state = 892; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 69) { + if (_la === 71) { { - this.state = 874; + this.state = 890; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); - this.state = 875; + this.state = 891; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 878; + this.state = 894; this.match(QuixosCapabilityParser.LBRACE); - this.state = 882; + this.state = 898; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 48)) & ~0x1F) === 0 && ((1 << (_la - 48)) & 2057) !== 0)) { + while (_la === 2 || ((((_la - 50)) & ~0x1F) === 0 && ((1 << (_la - 50)) & 2057) !== 0)) { { { - this.state = 879; + this.state = 895; this.conformanceItem(); } } - this.state = 884; + this.state = 900; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 885; + this.state = 901; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3348,36 +3378,43 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ConformanceItemContext(this.context, this.state); this.enterRule(localContext, 100, QuixosCapabilityParser.RULE_conformanceItem); try { - this.state = 892; + this.state = 909; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 81, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 887; + this.state = 903; this.match(QuixosCapabilityParser.PRIVATE); - this.state = 888; + this.state = 904; this.attachmentDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 889; + this.state = 905; this.operationBindingDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 890; + this.state = 906; this.stateFieldBindingDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 891; + this.state = 907; + this.initializationDecl(); + } + break; + case 5: + this.enterOuterAlt(localContext, 5); + { + this.state = 908; this.relationshipMaterializationDecl(); } break; @@ -3396,23 +3433,169 @@ export class QuixosCapabilityParser extends antlr.Parser { } return localContext; } - public stateFieldBindingDecl(): StateFieldBindingDeclContext { - let localContext = new StateFieldBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_stateFieldBindingDecl); + public initializationDecl(): InitializationDeclContext { + let localContext = new InitializationDeclContext(this.context, this.state); + this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_initializationDecl); + let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 894; + this.state = 911; + this.match(QuixosCapabilityParser.INITIALIZE); + this.state = 912; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 916; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 268427264) !== 0) || _la === 39 || _la === 67 || _la === 141) { + { + { + this.state = 913; + this.initializationField(); + } + } + this.state = 918; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + this.state = 919; + this.match(QuixosCapabilityParser.RBRACE); + this.state = 920; + this.match(QuixosCapabilityParser.SEMI); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public initializationField(): InitializationFieldContext { + let localContext = new InitializationFieldContext(this.context, this.state); + this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_initializationField); + try { + this.state = 936; + this.errorHandler.sync(this); + switch (this.interpreter.adaptivePredict(this.tokenStream, 83, this.context) ) { + case 1: + this.enterOuterAlt(localContext, 1); + { + this.state = 922; + this.identifier(); + this.state = 923; + this.match(QuixosCapabilityParser.TO); + this.state = 924; + this.match(QuixosCapabilityParser.STATE); + this.state = 925; + this.identifier(); + this.state = 926; + this.match(QuixosCapabilityParser.SEMI); + } + break; + case 2: + this.enterOuterAlt(localContext, 2); + { + this.state = 928; + this.identifier(); + this.state = 929; + this.match(QuixosCapabilityParser.TO); + this.state = 930; + this.match(QuixosCapabilityParser.EDGE); + this.state = 931; + this.identifier(); + this.state = 932; + this.match(QuixosCapabilityParser.DOT); + this.state = 933; + this.identifier(); + this.state = 934; + this.match(QuixosCapabilityParser.SEMI); + } + break; + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public creationOwnerMapping(): CreationOwnerMappingContext { + let localContext = new CreationOwnerMappingContext(this.context, this.state); + this.enterRule(localContext, 106, QuixosCapabilityParser.RULE_creationOwnerMapping); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 938; + this.interfaceType(); + this.state = 939; + this.match(QuixosCapabilityParser.FROM); + this.state = 940; + this.match(QuixosCapabilityParser.INPUT); + this.state = 945; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while (_la === 128) { + { + { + this.state = 941; + this.match(QuixosCapabilityParser.DOT); + this.state = 942; + this.identifier(); + } + } + this.state = 947; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + this.state = 948; + this.match(QuixosCapabilityParser.SEMI); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public stateFieldBindingDecl(): StateFieldBindingDeclContext { + let localContext = new StateFieldBindingDeclContext(this.context, this.state); + this.enterRule(localContext, 108, QuixosCapabilityParser.RULE_stateFieldBindingDecl); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 950; this.match(QuixosCapabilityParser.BIND); - this.state = 895; + this.state = 951; this.identifier(); - this.state = 896; + this.state = 952; this.match(QuixosCapabilityParser.TO); - this.state = 897; + this.state = 953; this.match(QuixosCapabilityParser.STATE); - this.state = 898; + this.state = 954; this.identifier(); - this.state = 899; + this.state = 955; this.match(QuixosCapabilityParser.SEMI); } } @@ -3431,35 +3614,35 @@ export class QuixosCapabilityParser extends antlr.Parser { } public relationshipMaterializationDecl(): RelationshipMaterializationDeclContext { let localContext = new RelationshipMaterializationDeclContext(this.context, this.state); - this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_relationshipMaterializationDecl); + this.enterRule(localContext, 110, QuixosCapabilityParser.RULE_relationshipMaterializationDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 901; + this.state = 957; this.match(QuixosCapabilityParser.MATERIALIZE); - this.state = 902; + this.state = 958; this.identifier(); - this.state = 903; + this.state = 959; this.match(QuixosCapabilityParser.IF); - this.state = 904; + this.state = 960; this.match(QuixosCapabilityParser.ABSENT); - this.state = 905; + this.state = 961; this.match(QuixosCapabilityParser.USING); - this.state = 906; + this.state = 962; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 907; + this.state = 963; this.identifier(); - this.state = 908; + this.state = 964; this.match(QuixosCapabilityParser.VIA); - this.state = 909; + this.state = 965; this.match(QuixosCapabilityParser.EDGE); - this.state = 910; + this.state = 966; this.identifier(); - this.state = 911; + this.state = 967; this.match(QuixosCapabilityParser.DOT); - this.state = 912; + this.state = 968; this.identifier(); - this.state = 913; + this.state = 969; this.match(QuixosCapabilityParser.SEMI); } } @@ -3478,32 +3661,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationBindingDecl(): OperationBindingDeclContext { let localContext = new OperationBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 106, QuixosCapabilityParser.RULE_operationBindingDecl); + this.enterRule(localContext, 112, QuixosCapabilityParser.RULE_operationBindingDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 915; + this.state = 971; this.match(QuixosCapabilityParser.BIND); - this.state = 916; + this.state = 972; this.memberOperationRef(); - this.state = 917; + this.state = 973; this.match(QuixosCapabilityParser.TO); - this.state = 918; + this.state = 974; this.operationProvider(); - this.state = 921; + this.state = 977; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 26) { + if (_la === 28) { { - this.state = 919; + this.state = 975; this.match(QuixosCapabilityParser.QUERY_REASON); - this.state = 920; + this.state = 976; this.stringLiteral(); } } - this.state = 923; + this.state = 979; this.match(QuixosCapabilityParser.SEMI); } } @@ -3522,15 +3705,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public memberOperationRef(): MemberOperationRefContext { let localContext = new MemberOperationRefContext(this.context, this.state); - this.enterRule(localContext, 108, QuixosCapabilityParser.RULE_memberOperationRef); + this.enterRule(localContext, 114, QuixosCapabilityParser.RULE_memberOperationRef); try { this.enterOuterAlt(localContext, 1); { - this.state = 925; + this.state = 981; this.identifier(); - this.state = 926; + this.state = 982; this.match(QuixosCapabilityParser.DOT); - this.state = 927; + this.state = 983; this.operationName(); } } @@ -3549,9 +3732,9 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationName(): OperationNameContext { let localContext = new OperationNameContext(this.context, this.state); - this.enterRule(localContext, 110, QuixosCapabilityParser.RULE_operationName); + this.enterRule(localContext, 116, QuixosCapabilityParser.RULE_operationName); try { - this.state = 940; + this.state = 996; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.RESULT_BYTES: @@ -3574,77 +3757,77 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 1); { - this.state = 929; + this.state = 985; this.identifier(); } break; case QuixosCapabilityParser.CALL: this.enterOuterAlt(localContext, 2); { - this.state = 930; + this.state = 986; this.match(QuixosCapabilityParser.CALL); } break; case QuixosCapabilityParser.GET: this.enterOuterAlt(localContext, 3); { - this.state = 931; + this.state = 987; this.match(QuixosCapabilityParser.GET); } break; case QuixosCapabilityParser.SET: this.enterOuterAlt(localContext, 4); { - this.state = 932; + this.state = 988; this.match(QuixosCapabilityParser.SET); } break; case QuixosCapabilityParser.RESOLVE: this.enterOuterAlt(localContext, 5); { - this.state = 933; + this.state = 989; this.match(QuixosCapabilityParser.RESOLVE); } break; case QuixosCapabilityParser.CONNECT: this.enterOuterAlt(localContext, 6); { - this.state = 934; + this.state = 990; this.match(QuixosCapabilityParser.CONNECT); } break; case QuixosCapabilityParser.DISCONNECT: this.enterOuterAlt(localContext, 7); { - this.state = 935; + this.state = 991; this.match(QuixosCapabilityParser.DISCONNECT); } break; case QuixosCapabilityParser.WATCH_START: this.enterOuterAlt(localContext, 8); { - this.state = 936; + this.state = 992; this.match(QuixosCapabilityParser.WATCH_START); } break; case QuixosCapabilityParser.WATCH_STOP: this.enterOuterAlt(localContext, 9); { - this.state = 937; + this.state = 993; this.match(QuixosCapabilityParser.WATCH_STOP); } break; case QuixosCapabilityParser.SUBSCRIBE: this.enterOuterAlt(localContext, 10); { - this.state = 938; + this.state = 994; this.match(QuixosCapabilityParser.SUBSCRIBE); } break; case QuixosCapabilityParser.UNSUBSCRIBE: this.enterOuterAlt(localContext, 11); { - this.state = 939; + this.state = 995; this.match(QuixosCapabilityParser.UNSUBSCRIBE); } break; @@ -3667,92 +3850,92 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationProvider(): OperationProviderContext { let localContext = new OperationProviderContext(this.context, this.state); - this.enterRule(localContext, 112, QuixosCapabilityParser.RULE_operationProvider); + this.enterRule(localContext, 118, QuixosCapabilityParser.RULE_operationProvider); let _la: number; try { - this.state = 972; + this.state = 1028; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 942; + this.state = 998; this.match(QuixosCapabilityParser.STATE); - this.state = 943; + this.state = 999; this.identifier(); - this.state = 944; + this.state = 1000; this.match(QuixosCapabilityParser.DOT); - this.state = 945; + this.state = 1001; this.statePrimitive(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 947; + this.state = 1003; this.match(QuixosCapabilityParser.EDGE); - this.state = 948; + this.state = 1004; this.identifier(); - this.state = 949; + this.state = 1005; this.match(QuixosCapabilityParser.DOT); - this.state = 950; + this.state = 1006; this.identifier(); - this.state = 951; + this.state = 1007; this.match(QuixosCapabilityParser.DOT); - this.state = 952; + this.state = 1008; this.edgePrimitive(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 3); { - this.state = 954; + this.state = 1010; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 955; + this.state = 1011; this.identifier(); - this.state = 957; + this.state = 1013; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 133) { + if (_la === 135) { { - this.state = 956; + this.state = 1012; this.typeArguments(); } } - this.state = 959; + this.state = 1015; this.match(QuixosCapabilityParser.DOT); - this.state = 960; + this.state = 1016; this.memberOperationRef(); } break; case QuixosCapabilityParser.PACKAGE: this.enterOuterAlt(localContext, 4); { - this.state = 962; + this.state = 1018; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 963; + this.state = 1019; this.identifier(); - this.state = 964; + this.state = 1020; this.match(QuixosCapabilityParser.DOT); - this.state = 965; + this.state = 1021; this.identifier(); - this.state = 967; + this.state = 1023; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 133) { + if (_la === 135) { { - this.state = 966; + this.state = 1022; this.typeArguments(); } } - this.state = 970; + this.state = 1026; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 56) { + if (_la === 58) { { - this.state = 969; + this.state = 1025; this.dependencyBindingBlock(); } } @@ -3778,14 +3961,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public statePrimitive(): StatePrimitiveContext { let localContext = new StatePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 114, QuixosCapabilityParser.RULE_statePrimitive); + this.enterRule(localContext, 120, QuixosCapabilityParser.RULE_statePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 974; + this.state = 1030; _la = this.tokenStream.LA(1); - if(!(((((_la - 86)) & ~0x1F) === 0 && ((1 << (_la - 86)) & 195) !== 0))) { + if(!(((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 195) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -3809,14 +3992,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgePrimitive(): EdgePrimitiveContext { let localContext = new EdgePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 116, QuixosCapabilityParser.RULE_edgePrimitive); + this.enterRule(localContext, 122, QuixosCapabilityParser.RULE_edgePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 976; + this.state = 1032; _la = this.tokenStream.LA(1); - if(!(((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 55) !== 0))) { + if(!(((((_la - 90)) & ~0x1F) === 0 && ((1 << (_la - 90)) & 55) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -3840,30 +4023,30 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBindingBlock(): DependencyBindingBlockContext { let localContext = new DependencyBindingBlockContext(this.context, this.state); - this.enterRule(localContext, 118, QuixosCapabilityParser.RULE_dependencyBindingBlock); + this.enterRule(localContext, 124, QuixosCapabilityParser.RULE_dependencyBindingBlock); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 978; + this.state = 1034; this.match(QuixosCapabilityParser.WITH); - this.state = 979; + this.state = 1035; this.match(QuixosCapabilityParser.LBRACE); - this.state = 983; + this.state = 1039; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 67106816) !== 0) || _la === 37 || _la === 65 || _la === 139) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 268427264) !== 0) || _la === 39 || _la === 67 || _la === 141) { { { - this.state = 980; + this.state = 1036; this.dependencyBinding(); } } - this.state = 985; + this.state = 1041; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 986; + this.state = 1042; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3882,205 +4065,240 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBinding(): DependencyBindingContext { let localContext = new DependencyBindingContext(this.context, this.state); - this.enterRule(localContext, 120, QuixosCapabilityParser.RULE_dependencyBinding); + this.enterRule(localContext, 126, QuixosCapabilityParser.RULE_dependencyBinding); let _la: number; try { - this.state = 1069; + this.state = 1140; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 95, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 99, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 988; - this.identifier(); - this.state = 989; - this.match(QuixosCapabilityParser.TO); - this.state = 990; - this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 991; - this.match(QuixosCapabilityParser.REFLECTION); - this.state = 992; - this.match(QuixosCapabilityParser.LBRACK); - this.state = 993; - this.identifierList(); - this.state = 994; - this.match(QuixosCapabilityParser.RBRACK); - this.state = 995; - this.match(QuixosCapabilityParser.SEMI); - } - break; - case 2: - this.enterOuterAlt(localContext, 2); - { - this.state = 997; - this.identifier(); - this.state = 998; - this.match(QuixosCapabilityParser.TO); - this.state = 999; - this.match(QuixosCapabilityParser.STATE); - this.state = 1000; - this.identifier(); - this.state = 1007; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 58) { - { - this.state = 1001; - this.match(QuixosCapabilityParser.VIA); - this.state = 1002; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1003; - this.identifier(); - this.state = 1004; - this.match(QuixosCapabilityParser.DOT); - this.state = 1005; - this.identifier(); - } - } - - this.state = 1009; - this.match(QuixosCapabilityParser.SEMI); - } - break; - case 3: - this.enterOuterAlt(localContext, 3); - { - this.state = 1011; - this.identifier(); - this.state = 1012; - this.match(QuixosCapabilityParser.TO); - this.state = 1013; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1014; - this.identifier(); - this.state = 1015; - this.match(QuixosCapabilityParser.DOT); - this.state = 1016; - this.identifier(); - this.state = 1023; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 58) { - { - this.state = 1017; - this.match(QuixosCapabilityParser.VIA); - this.state = 1018; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1019; - this.identifier(); - this.state = 1020; - this.match(QuixosCapabilityParser.DOT); - this.state = 1021; - this.identifier(); - } - } - - this.state = 1025; - this.match(QuixosCapabilityParser.SEMI); - } - break; - case 4: - this.enterOuterAlt(localContext, 4); - { - this.state = 1027; - this.identifier(); - this.state = 1028; - this.match(QuixosCapabilityParser.TO); - this.state = 1029; - this.match(QuixosCapabilityParser.INTERFACE); - this.state = 1030; - this.identifier(); - this.state = 1032; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 133) { - { - this.state = 1031; - this.typeArguments(); - } - } - - this.state = 1040; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 58) { - { - this.state = 1034; - this.match(QuixosCapabilityParser.VIA); - this.state = 1035; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1036; - this.identifier(); - this.state = 1037; - this.match(QuixosCapabilityParser.DOT); - this.state = 1038; - this.identifier(); - } - } - - this.state = 1042; - this.match(QuixosCapabilityParser.SEMI); - } - break; - case 5: - this.enterOuterAlt(localContext, 5); - { this.state = 1044; this.identifier(); this.state = 1045; this.match(QuixosCapabilityParser.TO); this.state = 1046; - this.match(QuixosCapabilityParser.CONSTRUCTOR); + this.match(QuixosCapabilityParser.WORKSPACE); this.state = 1047; - this.identifier(); + this.match(QuixosCapabilityParser.REFLECTION); this.state = 1048; + this.match(QuixosCapabilityParser.LBRACK); + this.state = 1049; + this.identifierList(); + this.state = 1050; + this.match(QuixosCapabilityParser.RBRACK); + this.state = 1051; + this.match(QuixosCapabilityParser.SEMI); + } + break; + case 2: + this.enterOuterAlt(localContext, 2); + { + this.state = 1053; + this.identifier(); + this.state = 1054; + this.match(QuixosCapabilityParser.TO); + this.state = 1055; + this.match(QuixosCapabilityParser.STATE); + this.state = 1056; + this.identifier(); + this.state = 1063; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 60) { + { + this.state = 1057; + this.match(QuixosCapabilityParser.VIA); + this.state = 1058; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1059; + this.identifier(); + this.state = 1060; + this.match(QuixosCapabilityParser.DOT); + this.state = 1061; + this.identifier(); + } + } + + this.state = 1065; + this.match(QuixosCapabilityParser.SEMI); + } + break; + case 3: + this.enterOuterAlt(localContext, 3); + { + this.state = 1067; + this.identifier(); + this.state = 1068; + this.match(QuixosCapabilityParser.TO); + this.state = 1069; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1070; + this.identifier(); + this.state = 1071; + this.match(QuixosCapabilityParser.DOT); + this.state = 1072; + this.identifier(); + this.state = 1079; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 60) { + { + this.state = 1073; + this.match(QuixosCapabilityParser.VIA); + this.state = 1074; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1075; + this.identifier(); + this.state = 1076; + this.match(QuixosCapabilityParser.DOT); + this.state = 1077; + this.identifier(); + } + } + + this.state = 1081; + this.match(QuixosCapabilityParser.SEMI); + } + break; + case 4: + this.enterOuterAlt(localContext, 4); + { + this.state = 1083; + this.identifier(); + this.state = 1084; + this.match(QuixosCapabilityParser.TO); + this.state = 1085; + this.match(QuixosCapabilityParser.INTERFACE); + this.state = 1086; + this.identifier(); + this.state = 1088; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 135) { + { + this.state = 1087; + this.typeArguments(); + } + } + + this.state = 1096; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 60) { + { + this.state = 1090; + this.match(QuixosCapabilityParser.VIA); + this.state = 1091; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1092; + this.identifier(); + this.state = 1093; + this.match(QuixosCapabilityParser.DOT); + this.state = 1094; + this.identifier(); + } + } + + this.state = 1098; + this.match(QuixosCapabilityParser.SEMI); + } + break; + case 5: + this.enterOuterAlt(localContext, 5); + { + this.state = 1100; + this.identifier(); + this.state = 1101; + this.match(QuixosCapabilityParser.TO); + this.state = 1102; + this.match(QuixosCapabilityParser.CREATION); + this.state = 1103; + this.identifier(); + this.state = 1104; + this.match(QuixosCapabilityParser.WITH); + this.state = 1105; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 1109; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 268427264) !== 0) || _la === 39 || _la === 67 || _la === 141) { + { + { + this.state = 1106; + this.creationOwnerMapping(); + } + } + this.state = 1111; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + this.state = 1112; + this.match(QuixosCapabilityParser.RBRACE); + this.state = 1113; this.match(QuixosCapabilityParser.SEMI); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1050; + this.state = 1115; this.identifier(); - this.state = 1051; + this.state = 1116; this.match(QuixosCapabilityParser.TO); - this.state = 1053; + this.state = 1117; + this.match(QuixosCapabilityParser.CONSTRUCTOR); + this.state = 1118; + this.identifier(); + this.state = 1119; + this.match(QuixosCapabilityParser.SEMI); + } + break; + case 7: + this.enterOuterAlt(localContext, 7); + { + this.state = 1121; + this.identifier(); + this.state = 1122; + this.match(QuixosCapabilityParser.TO); + this.state = 1124; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 1) { + if (_la === 3) { { - this.state = 1052; + this.state = 1123; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 1055; + this.state = 1126; this.match(QuixosCapabilityParser.QUERY); - this.state = 1056; + this.state = 1127; this.identifier(); - this.state = 1057; + this.state = 1128; this.match(QuixosCapabilityParser.DOT); - this.state = 1058; + this.state = 1129; this.identifier(); - this.state = 1065; + this.state = 1136; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 58) { + if (_la === 60) { { - this.state = 1059; + this.state = 1130; this.match(QuixosCapabilityParser.VIA); - this.state = 1060; + this.state = 1131; this.match(QuixosCapabilityParser.EDGE); - this.state = 1061; + this.state = 1132; this.identifier(); - this.state = 1062; + this.state = 1133; this.match(QuixosCapabilityParser.DOT); - this.state = 1063; + this.state = 1134; this.identifier(); } } - this.state = 1067; + this.state = 1138; this.match(QuixosCapabilityParser.SEMI); } break; @@ -4101,34 +4319,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public constructorBindingDecl(): ConstructorBindingDeclContext { let localContext = new ConstructorBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 122, QuixosCapabilityParser.RULE_constructorBindingDecl); + this.enterRule(localContext, 128, QuixosCapabilityParser.RULE_constructorBindingDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1071; + this.state = 1142; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1072; + this.state = 1143; this.identifier(); - this.state = 1073; + this.state = 1144; this.match(QuixosCapabilityParser.TO); - this.state = 1074; + this.state = 1145; this.identifier(); - this.state = 1075; + this.state = 1146; this.match(QuixosCapabilityParser.DOT); - this.state = 1076; + this.state = 1147; this.identifier(); - this.state = 1078; + this.state = 1149; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 56) { + if (_la === 58) { { - this.state = 1077; + this.state = 1148; this.dependencyBindingBlock(); } } - this.state = 1080; + this.state = 1151; this.match(QuixosCapabilityParser.SEMI); } } @@ -4147,10 +4365,10 @@ export class QuixosCapabilityParser extends antlr.Parser { } public valueType(): ValueTypeContext { let localContext = new ValueTypeContext(this.context, this.state); - this.enterRule(localContext, 124, QuixosCapabilityParser.RULE_valueType); + this.enterRule(localContext, 130, QuixosCapabilityParser.RULE_valueType); let _la: number; try { - this.state = 1128; + this.state = 1199; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.BOOL: @@ -4163,130 +4381,130 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.UINT64: this.enterOuterAlt(localContext, 1); { - this.state = 1082; + this.state = 1153; this.scalarType(); } break; case QuixosCapabilityParser.UNIT: this.enterOuterAlt(localContext, 2); { - this.state = 1083; + this.state = 1154; this.match(QuixosCapabilityParser.UNIT); } break; case QuixosCapabilityParser.WATCH_HANDLE: this.enterOuterAlt(localContext, 3); { - this.state = 1084; + this.state = 1155; this.match(QuixosCapabilityParser.WATCH_HANDLE); } break; case QuixosCapabilityParser.MESSAGE: this.enterOuterAlt(localContext, 4); { - this.state = 1085; + this.state = 1156; this.match(QuixosCapabilityParser.MESSAGE); - this.state = 1086; + this.state = 1157; this.stringLiteral(); } break; case QuixosCapabilityParser.ATOM_REF: this.enterOuterAlt(localContext, 5); { - this.state = 1087; + this.state = 1158; this.match(QuixosCapabilityParser.ATOM_REF); - this.state = 1088; + this.state = 1159; this.match(QuixosCapabilityParser.LT); - this.state = 1089; + this.state = 1160; this.identifier(); - this.state = 1090; + this.state = 1161; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.INTERFACE_REF: this.enterOuterAlt(localContext, 6); { - this.state = 1092; + this.state = 1163; this.match(QuixosCapabilityParser.INTERFACE_REF); - this.state = 1093; + this.state = 1164; this.match(QuixosCapabilityParser.LT); - this.state = 1094; + this.state = 1165; this.identifier(); - this.state = 1096; + this.state = 1167; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 133) { + if (_la === 135) { { - this.state = 1095; + this.state = 1166; this.typeArguments(); } } - this.state = 1098; + this.state = 1169; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.REF: this.enterOuterAlt(localContext, 7); { - this.state = 1100; + this.state = 1171; this.match(QuixosCapabilityParser.REF); - this.state = 1101; + this.state = 1172; this.match(QuixosCapabilityParser.LT); - this.state = 1102; + this.state = 1173; this.identifier(); - this.state = 1103; + this.state = 1174; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.OPTIONAL: this.enterOuterAlt(localContext, 8); { - this.state = 1105; + this.state = 1176; this.match(QuixosCapabilityParser.OPTIONAL); - this.state = 1106; + this.state = 1177; this.match(QuixosCapabilityParser.LT); - this.state = 1107; + this.state = 1178; this.valueType(); - this.state = 1108; + this.state = 1179; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.LIST: this.enterOuterAlt(localContext, 9); { - this.state = 1110; + this.state = 1181; this.match(QuixosCapabilityParser.LIST); - this.state = 1111; + this.state = 1182; this.match(QuixosCapabilityParser.LT); - this.state = 1112; + this.state = 1183; this.valueType(); - this.state = 1113; + this.state = 1184; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.RECORD: this.enterOuterAlt(localContext, 10); { - this.state = 1115; + this.state = 1186; this.match(QuixosCapabilityParser.RECORD); - this.state = 1116; + this.state = 1187; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1120; + this.state = 1191; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 67106816) !== 0) || _la === 37 || _la === 65 || _la === 139) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 268427264) !== 0) || _la === 39 || _la === 67 || _la === 141) { { { - this.state = 1117; + this.state = 1188; this.recordField(); } } - this.state = 1122; + this.state = 1193; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1123; + this.state = 1194; this.match(QuixosCapabilityParser.RBRACE); } break; @@ -4310,14 +4528,14 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 11); { - this.state = 1124; + this.state = 1195; this.identifier(); - this.state = 1126; + this.state = 1197; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 133) { + if (_la === 135) { { - this.state = 1125; + this.state = 1196; this.typeArguments(); } } @@ -4343,17 +4561,17 @@ export class QuixosCapabilityParser extends antlr.Parser { } public recordField(): RecordFieldContext { let localContext = new RecordFieldContext(this.context, this.state); - this.enterRule(localContext, 126, QuixosCapabilityParser.RULE_recordField); + this.enterRule(localContext, 132, QuixosCapabilityParser.RULE_recordField); try { this.enterOuterAlt(localContext, 1); { - this.state = 1130; + this.state = 1201; this.identifier(); - this.state = 1131; + this.state = 1202; this.match(QuixosCapabilityParser.COLON); - this.state = 1132; + this.state = 1203; this.valueType(); - this.state = 1133; + this.state = 1204; this.match(QuixosCapabilityParser.SEMI); } } @@ -4372,14 +4590,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public scalarType(): ScalarTypeContext { let localContext = new ScalarTypeContext(this.context, this.state); - this.enterRule(localContext, 128, QuixosCapabilityParser.RULE_scalarType); + this.enterRule(localContext, 134, QuixosCapabilityParser.RULE_scalarType); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1135; + this.state = 1206; _la = this.tokenStream.LA(1); - if(!(((((_la - 111)) & ~0x1F) === 0 && ((1 << (_la - 111)) & 255) !== 0))) { + if(!(((((_la - 113)) & ~0x1F) === 0 && ((1 << (_la - 113)) & 255) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4403,14 +4621,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public cardinality(): CardinalityContext { let localContext = new CardinalityContext(this.context, this.state); - this.enterRule(localContext, 130, QuixosCapabilityParser.RULE_cardinality); + this.enterRule(localContext, 136, QuixosCapabilityParser.RULE_cardinality); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1137; + this.state = 1208; _la = this.tokenStream.LA(1); - if(!(((((_la - 98)) & ~0x1F) === 0 && ((1 << (_la - 98)) & 15) !== 0))) { + if(!(((((_la - 100)) & ~0x1F) === 0 && ((1 << (_la - 100)) & 15) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4434,64 +4652,64 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonLiteral(): JsonLiteralContext { let localContext = new JsonLiteralContext(this.context, this.state); - this.enterRule(localContext, 132, QuixosCapabilityParser.RULE_jsonLiteral); + this.enterRule(localContext, 138, QuixosCapabilityParser.RULE_jsonLiteral); try { - this.state = 1147; + this.state = 1218; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STRING_LITERAL: this.enterOuterAlt(localContext, 1); { - this.state = 1139; + this.state = 1210; this.stringLiteral(); } break; case QuixosCapabilityParser.INTEGER: this.enterOuterAlt(localContext, 2); { - this.state = 1140; + this.state = 1211; this.match(QuixosCapabilityParser.INTEGER); } break; case QuixosCapabilityParser.JSON_NUMBER: this.enterOuterAlt(localContext, 3); { - this.state = 1141; + this.state = 1212; this.match(QuixosCapabilityParser.JSON_NUMBER); } break; case QuixosCapabilityParser.TRUE: this.enterOuterAlt(localContext, 4); { - this.state = 1142; + this.state = 1213; this.match(QuixosCapabilityParser.TRUE); } break; case QuixosCapabilityParser.FALSE: this.enterOuterAlt(localContext, 5); { - this.state = 1143; + this.state = 1214; this.match(QuixosCapabilityParser.FALSE); } break; case QuixosCapabilityParser.NULL: this.enterOuterAlt(localContext, 6); { - this.state = 1144; + this.state = 1215; this.match(QuixosCapabilityParser.NULL); } break; case QuixosCapabilityParser.LBRACE: this.enterOuterAlt(localContext, 7); { - this.state = 1145; + this.state = 1216; this.jsonObject(); } break; case QuixosCapabilityParser.LBRACK: this.enterOuterAlt(localContext, 8); { - this.state = 1146; + this.state = 1217; this.jsonArray(); } break; @@ -4514,40 +4732,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonObject(): JsonObjectContext { let localContext = new JsonObjectContext(this.context, this.state); - this.enterRule(localContext, 134, QuixosCapabilityParser.RULE_jsonObject); + this.enterRule(localContext, 140, QuixosCapabilityParser.RULE_jsonObject); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1149; + this.state = 1220; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1158; + this.state = 1229; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 140) { + if (_la === 142) { { - this.state = 1150; + this.state = 1221; this.jsonMember(); - this.state = 1155; + this.state = 1226; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 125) { + while (_la === 127) { { { - this.state = 1151; + this.state = 1222; this.match(QuixosCapabilityParser.COMMA); - this.state = 1152; + this.state = 1223; this.jsonMember(); } } - this.state = 1157; + this.state = 1228; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1160; + this.state = 1231; this.match(QuixosCapabilityParser.RBRACE); } } @@ -4566,15 +4784,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonMember(): JsonMemberContext { let localContext = new JsonMemberContext(this.context, this.state); - this.enterRule(localContext, 136, QuixosCapabilityParser.RULE_jsonMember); + this.enterRule(localContext, 142, QuixosCapabilityParser.RULE_jsonMember); try { this.enterOuterAlt(localContext, 1); { - this.state = 1162; + this.state = 1233; this.stringLiteral(); - this.state = 1163; + this.state = 1234; this.match(QuixosCapabilityParser.COLON); - this.state = 1164; + this.state = 1235; this.jsonLiteral(); } } @@ -4593,40 +4811,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonArray(): JsonArrayContext { let localContext = new JsonArrayContext(this.context, this.state); - this.enterRule(localContext, 138, QuixosCapabilityParser.RULE_jsonArray); + this.enterRule(localContext, 144, QuixosCapabilityParser.RULE_jsonArray); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1166; + this.state = 1237; this.match(QuixosCapabilityParser.LBRACK); - this.state = 1175; + this.state = 1246; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (((((_la - 119)) & ~0x1F) === 0 && ((1 << (_la - 119)) & 2884871) !== 0)) { + if (((((_la - 121)) & ~0x1F) === 0 && ((1 << (_la - 121)) & 2884871) !== 0)) { { - this.state = 1167; + this.state = 1238; this.jsonLiteral(); - this.state = 1172; + this.state = 1243; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 125) { + while (_la === 127) { { { - this.state = 1168; + this.state = 1239; this.match(QuixosCapabilityParser.COMMA); - this.state = 1169; + this.state = 1240; this.jsonLiteral(); } } - this.state = 1174; + this.state = 1245; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1177; + this.state = 1248; this.match(QuixosCapabilityParser.RBRACK); } } @@ -4645,14 +4863,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public identifier(): IdentifierContext { let localContext = new IdentifierContext(this.context, this.state); - this.enterRule(localContext, 140, QuixosCapabilityParser.RULE_identifier); + this.enterRule(localContext, 146, QuixosCapabilityParser.RULE_identifier); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1179; + this.state = 1250; _la = this.tokenStream.LA(1); - if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 67106816) !== 0) || _la === 37 || _la === 65 || _la === 139)) { + if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 268427264) !== 0) || _la === 39 || _la === 67 || _la === 141)) { this.errorHandler.recoverInline(this); } else { @@ -4676,11 +4894,11 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stringLiteral(): StringLiteralContext { let localContext = new StringLiteralContext(this.context, this.state); - this.enterRule(localContext, 142, QuixosCapabilityParser.RULE_stringLiteral); + this.enterRule(localContext, 148, QuixosCapabilityParser.RULE_stringLiteral); try { this.enterOuterAlt(localContext, 1); { - this.state = 1181; + this.state = 1252; this.match(QuixosCapabilityParser.STRING_LITERAL); } } @@ -4699,7 +4917,7 @@ export class QuixosCapabilityParser extends antlr.Parser { } public static readonly _serializedATN: number[] = [ - 4,1,143,1184,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,145,1255,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, @@ -4709,447 +4927,476 @@ export class QuixosCapabilityParser extends antlr.Parser { 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,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,157,8,0,1,1,1, - 1,1,1,5,1,162,8,1,10,1,12,1,165,9,1,1,1,1,1,1,2,1,2,1,2,1,2,1,3, - 1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,5,3,183,8,3,10,3,12,3,186,9, - 3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,3,4,197,8,4,1,5,1,5,1,5,1, - 5,1,5,1,5,1,5,1,5,1,5,1,5,3,5,209,8,5,1,6,1,6,1,6,1,6,1,6,1,6,1, - 6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,3,8,229,8,8,1,9,1, - 9,1,9,1,9,1,9,1,9,3,9,237,8,9,1,9,1,9,1,10,5,10,242,8,10,10,10,12, - 10,245,9,10,1,10,1,10,1,10,3,10,250,8,10,1,10,1,10,1,10,1,10,1,10, - 1,10,1,10,1,10,5,10,260,8,10,10,10,12,10,263,9,10,3,10,265,8,10, - 1,10,1,10,5,10,269,8,10,10,10,12,10,272,9,10,1,10,1,10,1,11,1,11, - 1,11,1,11,5,11,280,8,11,10,11,12,11,283,9,11,1,11,1,11,1,12,1,12, - 1,12,1,12,3,12,291,8,12,1,12,1,12,1,12,1,12,1,12,1,12,5,12,299,8, - 12,10,12,12,12,302,9,12,3,12,304,8,12,3,12,306,8,12,1,13,1,13,3, - 13,310,8,13,1,14,1,14,1,14,1,14,5,14,316,8,14,10,14,12,14,319,9, - 14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,3,15,330,8,15,1, - 16,1,16,1,16,3,16,335,8,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,3, - 17,344,8,17,1,18,3,18,347,8,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18, - 1,18,1,18,1,18,1,18,1,18,1,18,3,18,362,8,18,1,18,1,18,1,18,1,19, - 3,19,368,8,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,5,19,378,8, - 19,10,19,12,19,381,9,19,1,19,1,19,1,20,1,20,1,20,1,20,3,20,389,8, - 20,1,20,1,20,1,20,1,20,1,20,1,20,3,20,397,8,20,1,20,1,20,1,20,1, - 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,3,20,410,8,20,1,21,3,21,413, - 8,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,3,21,423,8,21,1,21, - 1,21,3,21,427,8,21,1,21,1,21,5,21,431,8,21,10,21,12,21,434,9,21, - 1,21,1,21,1,22,1,22,3,22,440,8,22,1,23,1,23,1,23,1,23,3,23,446,8, - 23,1,23,1,23,1,23,1,23,1,23,1,23,3,23,454,8,23,1,23,1,23,1,23,1, - 23,1,23,1,23,3,23,462,8,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,3,23,475,8,23,1,24,1,24,1,24,1,24,1,24,3,24,482, - 8,24,1,24,1,24,3,24,486,8,24,1,25,5,25,489,8,25,10,25,12,25,492, - 9,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,3,25,502,8,25,1,25, - 1,25,5,25,506,8,25,10,25,12,25,509,9,25,1,25,1,25,1,26,1,26,1,26, - 1,26,1,26,3,26,518,8,26,1,27,1,27,1,27,3,27,523,8,27,1,27,1,27,1, - 27,1,27,3,27,529,8,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,5,27,538, - 8,27,10,27,12,27,541,9,27,1,27,1,27,1,28,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,29,1,29,1,29,1,29, - 1,29,1,29,1,29,3,29,567,8,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,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,3,29,594,8,29,1,30,1,30,1,30,3,30,599,8, - 30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,3,30,610,8,30,1, - 30,3,30,613,8,30,1,30,1,30,1,30,3,30,618,8,30,1,30,1,30,1,31,1,31, - 1,31,3,31,625,8,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,3,31,634,8, - 31,1,31,3,31,637,8,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,32,1, - 32,1,32,1,32,3,32,650,8,32,1,33,1,33,1,33,1,33,1,33,5,33,657,8,33, - 10,33,12,33,660,9,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,1,34,1,34, - 1,34,1,34,3,34,673,8,34,1,34,1,34,1,35,1,35,1,35,1,36,1,36,1,37, - 1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,5,37,692,8,37,10,37, - 12,37,695,9,37,3,37,697,8,37,1,37,3,37,700,8,37,1,38,1,38,1,38,5, - 38,705,8,38,10,38,12,38,708,9,38,1,39,1,39,1,39,5,39,713,8,39,10, - 39,12,39,716,9,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1, - 40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1, - 40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1, - 40,1,40,3,40,755,8,40,1,40,3,40,758,8,40,1,40,1,40,1,40,1,40,1,40, - 1,40,1,40,1,40,1,40,1,40,3,40,770,8,40,1,40,1,40,1,40,1,40,1,40, - 1,40,1,40,1,40,1,40,1,40,1,40,1,40,3,40,784,8,40,1,41,1,41,1,41, - 1,41,5,41,790,8,41,10,41,12,41,793,9,41,1,41,1,41,1,42,1,42,1,43, - 1,43,1,43,1,44,1,44,3,44,804,8,44,1,45,1,45,1,45,1,45,1,45,1,45, - 1,45,1,45,1,45,1,45,1,45,1,45,3,45,818,8,45,1,45,1,45,1,46,1,46, - 1,46,1,46,1,46,1,46,3,46,828,8,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,48,1,48,1,48,1,48,3,48,846,8,48, - 1,48,1,48,3,48,850,8,48,1,48,3,48,853,8,48,1,48,1,48,3,48,857,8, - 48,1,48,3,48,860,8,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,3,49,869, - 8,49,1,49,1,49,3,49,873,8,49,1,49,1,49,3,49,877,8,49,1,49,1,49,5, - 49,881,8,49,10,49,12,49,884,9,49,1,49,1,49,1,50,1,50,1,50,1,50,1, - 50,3,50,893,8,50,1,51,1,51,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,52,1,52,1,52,1,52,1,52,1,52,1,53,1, - 53,1,53,1,53,1,53,1,53,3,53,922,8,53,1,53,1,53,1,54,1,54,1,54,1, - 54,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,3,55,941, - 8,55,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56, - 1,56,1,56,1,56,3,56,958,8,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56, - 1,56,3,56,968,8,56,1,56,3,56,971,8,56,3,56,973,8,56,1,57,1,57,1, - 58,1,58,1,59,1,59,1,59,5,59,982,8,59,10,59,12,59,985,9,59,1,59,1, - 59,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1, - 60,1,60,1,60,1,60,1,60,1,60,1,60,3,60,1008,8,60,1,60,1,60,1,60,1, - 60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,3,60,1024,8, - 60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,3,60,1033,8,60,1,60,1,60,1, - 60,1,60,1,60,1,60,3,60,1041,8,60,1,60,1,60,1,60,1,60,1,60,1,60,1, - 60,1,60,1,60,1,60,1,60,3,60,1054,8,60,1,60,1,60,1,60,1,60,1,60,1, - 60,1,60,1,60,1,60,1,60,3,60,1066,8,60,1,60,1,60,3,60,1070,8,60,1, - 61,1,61,1,61,1,61,1,61,1,61,1,61,3,61,1079,8,61,1,61,1,61,1,62,1, - 62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,3, - 62,1097,8,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1, - 62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,5,62,1119,8,62,10, - 62,12,62,1122,9,62,1,62,1,62,1,62,3,62,1127,8,62,3,62,1129,8,62, - 1,63,1,63,1,63,1,63,1,63,1,64,1,64,1,65,1,65,1,66,1,66,1,66,1,66, - 1,66,1,66,1,66,1,66,3,66,1148,8,66,1,67,1,67,1,67,1,67,5,67,1154, - 8,67,10,67,12,67,1157,9,67,3,67,1159,8,67,1,67,1,67,1,68,1,68,1, - 68,1,68,1,69,1,69,1,69,1,69,5,69,1171,8,69,10,69,12,69,1174,9,69, - 3,69,1176,8,69,1,69,1,69,1,70,1,70,1,71,1,71,1,71,0,0,72,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,0,9,2,0,7,7,25,25,1,0,3,4,1,0,91,95, - 2,0,86,90,92,93,2,0,86,87,92,93,2,0,88,90,92,93,1,0,111,118,1,0, - 98,101,4,0,11,25,37,37,65,65,139,139,1280,0,156,1,0,0,0,2,158,1, - 0,0,0,4,168,1,0,0,0,6,172,1,0,0,0,8,196,1,0,0,0,10,208,1,0,0,0,12, - 210,1,0,0,0,14,217,1,0,0,0,16,228,1,0,0,0,18,230,1,0,0,0,20,243, - 1,0,0,0,22,275,1,0,0,0,24,305,1,0,0,0,26,307,1,0,0,0,28,311,1,0, - 0,0,30,329,1,0,0,0,32,331,1,0,0,0,34,343,1,0,0,0,36,346,1,0,0,0, - 38,367,1,0,0,0,40,409,1,0,0,0,42,412,1,0,0,0,44,437,1,0,0,0,46,474, - 1,0,0,0,48,485,1,0,0,0,50,490,1,0,0,0,52,517,1,0,0,0,54,519,1,0, - 0,0,56,544,1,0,0,0,58,593,1,0,0,0,60,595,1,0,0,0,62,621,1,0,0,0, - 64,649,1,0,0,0,66,651,1,0,0,0,68,663,1,0,0,0,70,676,1,0,0,0,72,679, - 1,0,0,0,74,699,1,0,0,0,76,701,1,0,0,0,78,709,1,0,0,0,80,783,1,0, - 0,0,82,785,1,0,0,0,84,796,1,0,0,0,86,798,1,0,0,0,88,803,1,0,0,0, - 90,805,1,0,0,0,92,827,1,0,0,0,94,829,1,0,0,0,96,838,1,0,0,0,98,863, - 1,0,0,0,100,892,1,0,0,0,102,894,1,0,0,0,104,901,1,0,0,0,106,915, - 1,0,0,0,108,925,1,0,0,0,110,940,1,0,0,0,112,972,1,0,0,0,114,974, - 1,0,0,0,116,976,1,0,0,0,118,978,1,0,0,0,120,1069,1,0,0,0,122,1071, - 1,0,0,0,124,1128,1,0,0,0,126,1130,1,0,0,0,128,1135,1,0,0,0,130,1137, - 1,0,0,0,132,1147,1,0,0,0,134,1149,1,0,0,0,136,1162,1,0,0,0,138,1166, - 1,0,0,0,140,1179,1,0,0,0,142,1181,1,0,0,0,144,145,3,6,3,0,145,146, - 5,0,0,1,146,157,1,0,0,0,147,148,3,20,10,0,148,149,5,0,0,1,149,157, - 1,0,0,0,150,151,3,50,25,0,151,152,5,0,0,1,152,157,1,0,0,0,153,154, - 3,2,1,0,154,155,5,0,0,1,155,157,1,0,0,0,156,144,1,0,0,0,156,147, - 1,0,0,0,156,150,1,0,0,0,156,153,1,0,0,0,157,1,1,0,0,0,158,159,5, - 32,0,0,159,163,5,127,0,0,160,162,3,8,4,0,161,160,1,0,0,0,162,165, - 1,0,0,0,163,161,1,0,0,0,163,164,1,0,0,0,164,166,1,0,0,0,165,163, - 1,0,0,0,166,167,5,128,0,0,167,3,1,0,0,0,168,169,5,33,0,0,169,170, - 3,142,71,0,170,171,5,124,0,0,171,5,1,0,0,0,172,173,5,1,0,0,173,174, - 3,140,70,0,174,175,5,74,0,0,175,176,3,142,71,0,176,177,5,68,0,0, - 177,178,3,142,71,0,178,179,5,67,0,0,179,180,3,142,71,0,180,184,5, - 127,0,0,181,183,3,8,4,0,182,181,1,0,0,0,183,186,1,0,0,0,184,182, - 1,0,0,0,184,185,1,0,0,0,185,187,1,0,0,0,186,184,1,0,0,0,187,188, - 5,128,0,0,188,7,1,0,0,0,189,197,3,4,2,0,190,197,3,18,9,0,191,197, - 3,10,5,0,192,197,3,86,43,0,193,197,3,98,49,0,194,197,3,122,61,0, - 195,197,3,32,16,0,196,189,1,0,0,0,196,190,1,0,0,0,196,191,1,0,0, - 0,196,192,1,0,0,0,196,193,1,0,0,0,196,194,1,0,0,0,196,195,1,0,0, - 0,197,9,1,0,0,0,198,199,5,33,0,0,199,200,5,36,0,0,200,201,3,140, - 70,0,201,202,5,124,0,0,202,209,1,0,0,0,203,204,5,33,0,0,204,205, - 5,38,0,0,205,206,3,140,70,0,206,207,5,124,0,0,207,209,1,0,0,0,208, - 198,1,0,0,0,208,203,1,0,0,0,209,11,1,0,0,0,210,211,5,34,0,0,211, - 212,5,35,0,0,212,213,3,140,70,0,213,214,5,74,0,0,214,215,3,142,71, - 0,215,216,5,124,0,0,216,13,1,0,0,0,217,218,5,34,0,0,218,219,5,36, - 0,0,219,220,3,140,70,0,220,221,5,68,0,0,221,222,3,142,71,0,222,223, - 5,124,0,0,223,15,1,0,0,0,224,229,3,10,5,0,225,229,3,12,6,0,226,229, - 3,14,7,0,227,229,3,32,16,0,228,224,1,0,0,0,228,225,1,0,0,0,228,226, - 1,0,0,0,228,227,1,0,0,0,229,17,1,0,0,0,230,231,5,35,0,0,231,232, - 3,140,70,0,232,233,5,74,0,0,233,236,3,142,71,0,234,235,5,75,0,0, - 235,237,3,142,71,0,236,234,1,0,0,0,236,237,1,0,0,0,237,238,1,0,0, - 0,238,239,5,124,0,0,239,19,1,0,0,0,240,242,3,16,8,0,241,240,1,0, - 0,0,242,245,1,0,0,0,243,241,1,0,0,0,243,244,1,0,0,0,244,246,1,0, - 0,0,245,243,1,0,0,0,246,247,5,36,0,0,247,249,3,140,70,0,248,250, - 3,22,11,0,249,248,1,0,0,0,249,250,1,0,0,0,250,251,1,0,0,0,251,252, - 5,74,0,0,252,253,3,142,71,0,253,254,5,68,0,0,254,264,3,142,71,0, - 255,256,5,79,0,0,256,261,3,26,13,0,257,258,5,125,0,0,258,260,3,26, - 13,0,259,257,1,0,0,0,260,263,1,0,0,0,261,259,1,0,0,0,261,262,1,0, - 0,0,262,265,1,0,0,0,263,261,1,0,0,0,264,255,1,0,0,0,264,265,1,0, - 0,0,265,266,1,0,0,0,266,270,5,127,0,0,267,269,3,34,17,0,268,267, - 1,0,0,0,269,272,1,0,0,0,270,268,1,0,0,0,270,271,1,0,0,0,271,273, - 1,0,0,0,272,270,1,0,0,0,273,274,5,128,0,0,274,21,1,0,0,0,275,276, - 5,133,0,0,276,281,3,24,12,0,277,278,5,125,0,0,278,280,3,24,12,0, - 279,277,1,0,0,0,280,283,1,0,0,0,281,279,1,0,0,0,281,282,1,0,0,0, - 282,284,1,0,0,0,283,281,1,0,0,0,284,285,5,134,0,0,285,23,1,0,0,0, - 286,287,5,39,0,0,287,290,3,140,70,0,288,289,5,123,0,0,289,291,5, - 29,0,0,290,288,1,0,0,0,290,291,1,0,0,0,291,306,1,0,0,0,292,293,5, - 28,0,0,293,303,3,140,70,0,294,295,5,30,0,0,295,300,3,26,13,0,296, - 297,5,135,0,0,297,299,3,26,13,0,298,296,1,0,0,0,299,302,1,0,0,0, - 300,298,1,0,0,0,300,301,1,0,0,0,301,304,1,0,0,0,302,300,1,0,0,0, - 303,294,1,0,0,0,303,304,1,0,0,0,304,306,1,0,0,0,305,286,1,0,0,0, - 305,292,1,0,0,0,306,25,1,0,0,0,307,309,3,140,70,0,308,310,3,28,14, - 0,309,308,1,0,0,0,309,310,1,0,0,0,310,27,1,0,0,0,311,312,5,133,0, - 0,312,317,3,30,15,0,313,314,5,125,0,0,314,316,3,30,15,0,315,313, - 1,0,0,0,316,319,1,0,0,0,317,315,1,0,0,0,317,318,1,0,0,0,318,320, - 1,0,0,0,319,317,1,0,0,0,320,321,5,134,0,0,321,29,1,0,0,0,322,323, - 5,35,0,0,323,330,3,140,70,0,324,325,5,36,0,0,325,330,3,26,13,0,326, - 327,5,28,0,0,327,330,3,140,70,0,328,330,3,124,62,0,329,322,1,0,0, - 0,329,324,1,0,0,0,329,326,1,0,0,0,329,328,1,0,0,0,330,31,1,0,0,0, - 331,332,5,27,0,0,332,334,3,140,70,0,333,335,3,22,11,0,334,333,1, - 0,0,0,334,335,1,0,0,0,335,336,1,0,0,0,336,337,5,136,0,0,337,338, - 3,124,62,0,338,339,5,124,0,0,339,33,1,0,0,0,340,344,3,38,19,0,341, - 344,3,42,21,0,342,344,3,36,18,0,343,340,1,0,0,0,343,341,1,0,0,0, - 343,342,1,0,0,0,344,35,1,0,0,0,345,347,5,49,0,0,346,345,1,0,0,0, - 346,347,1,0,0,0,347,348,1,0,0,0,348,349,5,41,0,0,349,350,3,140,70, - 0,350,351,5,74,0,0,351,352,3,142,71,0,352,353,5,123,0,0,353,354, - 3,124,62,0,354,355,5,122,0,0,355,356,3,124,62,0,356,357,5,127,0, - 0,357,358,5,91,0,0,358,359,5,74,0,0,359,361,3,142,71,0,360,362,3, - 64,32,0,361,360,1,0,0,0,361,362,1,0,0,0,362,363,1,0,0,0,363,364, - 5,124,0,0,364,365,5,128,0,0,365,37,1,0,0,0,366,368,3,44,22,0,367, - 366,1,0,0,0,367,368,1,0,0,0,368,369,1,0,0,0,369,370,5,39,0,0,370, - 371,3,140,70,0,371,372,5,74,0,0,372,373,3,142,71,0,373,374,5,123, - 0,0,374,375,3,124,62,0,375,379,5,127,0,0,376,378,3,40,20,0,377,376, - 1,0,0,0,378,381,1,0,0,0,379,377,1,0,0,0,379,380,1,0,0,0,380,382, - 1,0,0,0,381,379,1,0,0,0,382,383,5,128,0,0,383,39,1,0,0,0,384,385, - 5,81,0,0,385,386,5,74,0,0,386,388,3,142,71,0,387,389,3,64,32,0,388, - 387,1,0,0,0,388,389,1,0,0,0,389,390,1,0,0,0,390,391,5,124,0,0,391, - 410,1,0,0,0,392,393,5,82,0,0,393,394,5,74,0,0,394,396,3,142,71,0, - 395,397,3,64,32,0,396,395,1,0,0,0,396,397,1,0,0,0,397,398,1,0,0, - 0,398,399,5,124,0,0,399,410,1,0,0,0,400,401,5,83,0,0,401,402,5,84, - 0,0,402,403,5,74,0,0,403,404,3,142,71,0,404,405,5,85,0,0,405,406, - 5,74,0,0,406,407,3,142,71,0,407,408,5,124,0,0,408,410,1,0,0,0,409, - 384,1,0,0,0,409,392,1,0,0,0,409,400,1,0,0,0,410,41,1,0,0,0,411,413, - 3,44,22,0,412,411,1,0,0,0,412,413,1,0,0,0,413,414,1,0,0,0,414,415, - 5,40,0,0,415,416,3,140,70,0,416,417,5,74,0,0,417,418,3,142,71,0, - 418,419,5,123,0,0,419,420,3,130,65,0,420,422,3,48,24,0,421,423,5, - 102,0,0,422,421,1,0,0,0,422,423,1,0,0,0,423,426,1,0,0,0,424,425, - 5,72,0,0,425,427,3,142,71,0,426,424,1,0,0,0,426,427,1,0,0,0,427, - 428,1,0,0,0,428,432,5,127,0,0,429,431,3,46,23,0,430,429,1,0,0,0, - 431,434,1,0,0,0,432,430,1,0,0,0,432,433,1,0,0,0,433,435,1,0,0,0, - 434,432,1,0,0,0,435,436,5,128,0,0,436,43,1,0,0,0,437,439,5,24,0, - 0,438,440,7,0,0,0,439,438,1,0,0,0,439,440,1,0,0,0,440,45,1,0,0,0, - 441,442,5,88,0,0,442,443,5,74,0,0,443,445,3,142,71,0,444,446,3,64, - 32,0,445,444,1,0,0,0,445,446,1,0,0,0,446,447,1,0,0,0,447,448,5,124, - 0,0,448,475,1,0,0,0,449,450,5,89,0,0,450,451,5,74,0,0,451,453,3, - 142,71,0,452,454,3,64,32,0,453,452,1,0,0,0,453,454,1,0,0,0,454,455, - 1,0,0,0,455,456,5,124,0,0,456,475,1,0,0,0,457,458,5,90,0,0,458,459, - 5,74,0,0,459,461,3,142,71,0,460,462,3,64,32,0,461,460,1,0,0,0,461, - 462,1,0,0,0,462,463,1,0,0,0,463,464,5,124,0,0,464,475,1,0,0,0,465, - 466,5,83,0,0,466,467,5,84,0,0,467,468,5,74,0,0,468,469,3,142,71, - 0,469,470,5,85,0,0,470,471,5,74,0,0,471,472,3,142,71,0,472,473,5, - 124,0,0,473,475,1,0,0,0,474,441,1,0,0,0,474,449,1,0,0,0,474,457, - 1,0,0,0,474,465,1,0,0,0,475,47,1,0,0,0,476,477,5,35,0,0,477,486, - 3,140,70,0,478,479,5,36,0,0,479,481,3,140,70,0,480,482,3,28,14,0, - 481,480,1,0,0,0,481,482,1,0,0,0,482,486,1,0,0,0,483,484,5,28,0,0, - 484,486,3,140,70,0,485,476,1,0,0,0,485,478,1,0,0,0,485,483,1,0,0, - 0,486,49,1,0,0,0,487,489,3,16,8,0,488,487,1,0,0,0,489,492,1,0,0, - 0,490,488,1,0,0,0,490,491,1,0,0,0,491,493,1,0,0,0,492,490,1,0,0, - 0,493,494,5,38,0,0,494,495,3,140,70,0,495,496,5,74,0,0,496,497,3, - 142,71,0,497,498,5,68,0,0,498,501,3,142,71,0,499,500,5,69,0,0,500, - 502,5,137,0,0,501,499,1,0,0,0,501,502,1,0,0,0,502,503,1,0,0,0,503, - 507,5,127,0,0,504,506,3,52,26,0,505,504,1,0,0,0,506,509,1,0,0,0, - 507,505,1,0,0,0,507,508,1,0,0,0,508,510,1,0,0,0,509,507,1,0,0,0, - 510,511,5,128,0,0,511,51,1,0,0,0,512,518,3,60,30,0,513,518,3,62, - 31,0,514,518,3,68,34,0,515,518,3,54,27,0,516,518,3,56,28,0,517,512, - 1,0,0,0,517,513,1,0,0,0,517,514,1,0,0,0,517,515,1,0,0,0,517,516, - 1,0,0,0,518,53,1,0,0,0,519,520,5,14,0,0,520,522,3,140,70,0,521,523, - 3,22,11,0,522,521,1,0,0,0,522,523,1,0,0,0,523,524,1,0,0,0,524,525, - 5,74,0,0,525,526,3,142,71,0,526,528,5,17,0,0,527,529,5,1,0,0,528, - 527,1,0,0,0,528,529,1,0,0,0,529,530,1,0,0,0,530,531,3,26,13,0,531, - 532,5,18,0,0,532,533,3,142,71,0,533,534,5,41,0,0,534,535,3,142,71, - 0,535,539,5,127,0,0,536,538,3,58,29,0,537,536,1,0,0,0,538,541,1, - 0,0,0,539,537,1,0,0,0,539,540,1,0,0,0,540,542,1,0,0,0,541,539,1, - 0,0,0,542,543,5,128,0,0,543,55,1,0,0,0,544,545,5,14,0,0,545,546, - 3,140,70,0,546,547,5,74,0,0,547,548,3,142,71,0,548,549,5,16,0,0, - 549,550,3,140,70,0,550,551,3,28,14,0,551,552,5,124,0,0,552,57,1, - 0,0,0,553,554,5,8,0,0,554,594,5,124,0,0,555,556,5,9,0,0,556,557, - 5,10,0,0,557,558,3,140,70,0,558,559,5,124,0,0,559,594,1,0,0,0,560, - 561,5,19,0,0,561,562,3,142,71,0,562,563,5,124,0,0,563,594,1,0,0, - 0,564,566,5,20,0,0,565,567,5,28,0,0,566,565,1,0,0,0,566,567,1,0, - 0,0,567,568,1,0,0,0,568,569,3,140,70,0,569,570,5,47,0,0,570,571, - 3,26,13,0,571,572,5,124,0,0,572,594,1,0,0,0,573,574,5,21,0,0,574, - 575,3,140,70,0,575,576,5,137,0,0,576,577,5,124,0,0,577,594,1,0,0, - 0,578,579,5,22,0,0,579,580,3,26,13,0,580,581,5,126,0,0,581,582,3, - 140,70,0,582,583,3,140,70,0,583,584,3,142,71,0,584,585,5,124,0,0, - 585,594,1,0,0,0,586,587,5,83,0,0,587,594,5,124,0,0,588,589,5,23, - 0,0,589,590,5,137,0,0,590,591,3,142,71,0,591,592,5,124,0,0,592,594, - 1,0,0,0,593,553,1,0,0,0,593,555,1,0,0,0,593,560,1,0,0,0,593,564, - 1,0,0,0,593,573,1,0,0,0,593,578,1,0,0,0,593,586,1,0,0,0,593,588, - 1,0,0,0,594,59,1,0,0,0,595,596,5,41,0,0,596,598,3,140,70,0,597,599, - 3,22,11,0,598,597,1,0,0,0,598,599,1,0,0,0,599,600,1,0,0,0,600,601, - 5,74,0,0,601,602,3,142,71,0,602,603,5,123,0,0,603,604,3,124,62,0, - 604,605,5,122,0,0,605,606,3,124,62,0,606,607,5,76,0,0,607,609,3, - 72,36,0,608,610,3,64,32,0,609,608,1,0,0,0,609,610,1,0,0,0,610,612, - 1,0,0,0,611,613,3,70,35,0,612,611,1,0,0,0,612,613,1,0,0,0,613,614, - 1,0,0,0,614,615,5,78,0,0,615,617,3,74,37,0,616,618,3,78,39,0,617, - 616,1,0,0,0,617,618,1,0,0,0,618,619,1,0,0,0,619,620,5,124,0,0,620, - 61,1,0,0,0,621,622,5,42,0,0,622,624,3,140,70,0,623,625,3,22,11,0, - 624,623,1,0,0,0,624,625,1,0,0,0,625,626,1,0,0,0,626,627,5,74,0,0, - 627,628,3,142,71,0,628,629,5,123,0,0,629,630,3,124,62,0,630,631, - 5,122,0,0,631,633,3,124,62,0,632,634,3,64,32,0,633,632,1,0,0,0,633, - 634,1,0,0,0,634,636,1,0,0,0,635,637,3,78,39,0,636,635,1,0,0,0,636, - 637,1,0,0,0,637,638,1,0,0,0,638,639,5,124,0,0,639,63,1,0,0,0,640, - 641,5,2,0,0,641,650,5,5,0,0,642,643,5,2,0,0,643,644,7,1,0,0,644, - 645,5,6,0,0,645,646,5,129,0,0,646,647,3,76,38,0,647,648,5,130,0, - 0,648,650,1,0,0,0,649,640,1,0,0,0,649,642,1,0,0,0,650,65,1,0,0,0, - 651,652,5,57,0,0,652,653,5,129,0,0,653,658,3,108,54,0,654,655,5, - 125,0,0,655,657,3,108,54,0,656,654,1,0,0,0,657,660,1,0,0,0,658,656, - 1,0,0,0,658,659,1,0,0,0,659,661,1,0,0,0,660,658,1,0,0,0,661,662, - 5,130,0,0,662,67,1,0,0,0,663,664,5,43,0,0,664,665,3,140,70,0,665, - 666,5,74,0,0,666,667,3,142,71,0,667,668,5,44,0,0,668,669,3,140,70, - 0,669,670,5,123,0,0,670,672,3,124,62,0,671,673,3,78,39,0,672,671, - 1,0,0,0,672,673,1,0,0,0,673,674,1,0,0,0,674,675,5,124,0,0,675,69, - 1,0,0,0,676,677,5,77,0,0,677,678,3,124,62,0,678,71,1,0,0,0,679,680, - 7,2,0,0,680,73,1,0,0,0,681,700,5,80,0,0,682,683,5,35,0,0,683,700, - 3,140,70,0,684,685,5,28,0,0,685,700,3,140,70,0,686,687,5,37,0,0, - 687,696,5,129,0,0,688,693,3,26,13,0,689,690,5,125,0,0,690,692,3, - 26,13,0,691,689,1,0,0,0,692,695,1,0,0,0,693,691,1,0,0,0,693,694, - 1,0,0,0,694,697,1,0,0,0,695,693,1,0,0,0,696,688,1,0,0,0,696,697, - 1,0,0,0,697,698,1,0,0,0,698,700,5,130,0,0,699,681,1,0,0,0,699,682, - 1,0,0,0,699,684,1,0,0,0,699,686,1,0,0,0,700,75,1,0,0,0,701,706,3, - 140,70,0,702,703,5,125,0,0,703,705,3,140,70,0,704,702,1,0,0,0,705, - 708,1,0,0,0,706,704,1,0,0,0,706,707,1,0,0,0,707,77,1,0,0,0,708,706, - 1,0,0,0,709,710,5,79,0,0,710,714,5,127,0,0,711,713,3,80,40,0,712, - 711,1,0,0,0,713,716,1,0,0,0,714,712,1,0,0,0,714,715,1,0,0,0,715, - 717,1,0,0,0,716,714,1,0,0,0,717,718,5,128,0,0,718,79,1,0,0,0,719, - 720,5,15,0,0,720,721,3,140,70,0,721,722,5,74,0,0,722,723,3,142,71, - 0,723,724,5,129,0,0,724,725,3,76,38,0,725,726,5,130,0,0,726,727, - 5,124,0,0,727,784,1,0,0,0,728,729,5,53,0,0,729,730,3,140,70,0,730, - 731,5,74,0,0,731,732,3,142,71,0,732,733,5,123,0,0,733,734,3,124, - 62,0,734,735,3,82,41,0,735,736,5,124,0,0,736,784,1,0,0,0,737,738, - 5,54,0,0,738,739,3,140,70,0,739,740,5,74,0,0,740,741,3,142,71,0, - 741,742,5,123,0,0,742,743,3,130,65,0,743,744,3,48,24,0,744,745,3, - 82,41,0,745,746,5,124,0,0,746,784,1,0,0,0,747,748,5,36,0,0,748,749, - 3,140,70,0,749,750,5,74,0,0,750,751,3,142,71,0,751,752,5,123,0,0, - 752,754,3,140,70,0,753,755,3,28,14,0,754,753,1,0,0,0,754,755,1,0, - 0,0,755,757,1,0,0,0,756,758,3,66,33,0,757,756,1,0,0,0,757,758,1, - 0,0,0,758,759,1,0,0,0,759,760,5,124,0,0,760,784,1,0,0,0,761,762, - 5,43,0,0,762,763,3,140,70,0,763,764,5,74,0,0,764,765,3,142,71,0, - 765,766,5,123,0,0,766,769,3,140,70,0,767,768,5,45,0,0,768,770,3, - 124,62,0,769,767,1,0,0,0,769,770,1,0,0,0,770,771,1,0,0,0,771,772, - 5,124,0,0,772,784,1,0,0,0,773,774,5,14,0,0,774,775,3,140,70,0,775, - 776,5,74,0,0,776,777,3,142,71,0,777,778,5,123,0,0,778,779,3,140, - 70,0,779,780,5,126,0,0,780,781,3,140,70,0,781,782,5,124,0,0,782, - 784,1,0,0,0,783,719,1,0,0,0,783,728,1,0,0,0,783,737,1,0,0,0,783, - 747,1,0,0,0,783,761,1,0,0,0,783,773,1,0,0,0,784,81,1,0,0,0,785,786, - 5,129,0,0,786,791,3,84,42,0,787,788,5,125,0,0,788,790,3,84,42,0, - 789,787,1,0,0,0,790,793,1,0,0,0,791,789,1,0,0,0,791,792,1,0,0,0, - 792,794,1,0,0,0,793,791,1,0,0,0,794,795,5,130,0,0,795,83,1,0,0,0, - 796,797,7,3,0,0,797,85,1,0,0,0,798,799,5,52,0,0,799,800,3,88,44, - 0,800,87,1,0,0,0,801,804,3,90,45,0,802,804,3,94,47,0,803,801,1,0, - 0,0,803,802,1,0,0,0,804,89,1,0,0,0,805,806,5,53,0,0,806,807,3,140, - 70,0,807,808,5,74,0,0,808,809,3,142,71,0,809,810,5,62,0,0,810,811, - 3,140,70,0,811,812,5,123,0,0,812,813,3,124,62,0,813,814,5,63,0,0, - 814,817,3,92,46,0,815,816,5,64,0,0,816,818,3,132,66,0,817,815,1, - 0,0,0,817,818,1,0,0,0,818,819,1,0,0,0,819,820,5,124,0,0,820,91,1, - 0,0,0,821,828,5,96,0,0,822,823,5,97,0,0,823,824,5,131,0,0,824,825, - 3,124,62,0,825,826,5,132,0,0,826,828,1,0,0,0,827,821,1,0,0,0,827, - 822,1,0,0,0,828,93,1,0,0,0,829,830,5,54,0,0,830,831,3,140,70,0,831, - 832,5,74,0,0,832,833,3,142,71,0,833,834,5,127,0,0,834,835,3,96,48, - 0,835,836,3,96,48,0,836,837,5,128,0,0,837,95,1,0,0,0,838,839,3,48, - 24,0,839,840,5,55,0,0,840,841,3,140,70,0,841,842,5,74,0,0,842,843, - 3,142,71,0,843,845,3,130,65,0,844,846,5,102,0,0,845,844,1,0,0,0, - 845,846,1,0,0,0,846,849,1,0,0,0,847,848,5,70,0,0,848,850,3,142,71, - 0,849,847,1,0,0,0,849,850,1,0,0,0,850,852,1,0,0,0,851,853,5,71,0, - 0,852,851,1,0,0,0,852,853,1,0,0,0,853,856,1,0,0,0,854,855,5,72,0, - 0,855,857,3,142,71,0,856,854,1,0,0,0,856,857,1,0,0,0,857,859,1,0, - 0,0,858,860,5,73,0,0,859,858,1,0,0,0,859,860,1,0,0,0,860,861,1,0, - 0,0,861,862,5,124,0,0,862,97,1,0,0,0,863,864,5,46,0,0,864,865,3, - 140,70,0,865,866,5,47,0,0,866,868,3,140,70,0,867,869,3,28,14,0,868, - 867,1,0,0,0,868,869,1,0,0,0,869,872,1,0,0,0,870,871,5,74,0,0,871, - 873,3,142,71,0,872,870,1,0,0,0,872,873,1,0,0,0,873,876,1,0,0,0,874, - 875,5,69,0,0,875,877,5,137,0,0,876,874,1,0,0,0,876,877,1,0,0,0,877, - 878,1,0,0,0,878,882,5,127,0,0,879,881,3,100,50,0,880,879,1,0,0,0, - 881,884,1,0,0,0,882,880,1,0,0,0,882,883,1,0,0,0,883,885,1,0,0,0, - 884,882,1,0,0,0,885,886,5,128,0,0,886,99,1,0,0,0,887,888,5,51,0, - 0,888,893,3,88,44,0,889,893,3,106,53,0,890,893,3,102,51,0,891,893, - 3,104,52,0,892,887,1,0,0,0,892,889,1,0,0,0,892,890,1,0,0,0,892,891, - 1,0,0,0,893,101,1,0,0,0,894,895,5,48,0,0,895,896,3,140,70,0,896, - 897,5,50,0,0,897,898,5,53,0,0,898,899,3,140,70,0,899,900,5,124,0, - 0,900,103,1,0,0,0,901,902,5,59,0,0,902,903,3,140,70,0,903,904,5, - 60,0,0,904,905,5,61,0,0,905,906,5,57,0,0,906,907,5,43,0,0,907,908, - 3,140,70,0,908,909,5,58,0,0,909,910,5,54,0,0,910,911,3,140,70,0, - 911,912,5,126,0,0,912,913,3,140,70,0,913,914,5,124,0,0,914,105,1, - 0,0,0,915,916,5,48,0,0,916,917,3,108,54,0,917,918,5,50,0,0,918,921, - 3,112,56,0,919,920,5,26,0,0,920,922,3,142,71,0,921,919,1,0,0,0,921, - 922,1,0,0,0,922,923,1,0,0,0,923,924,5,124,0,0,924,107,1,0,0,0,925, - 926,3,140,70,0,926,927,5,126,0,0,927,928,3,110,55,0,928,109,1,0, - 0,0,929,941,3,140,70,0,930,941,5,91,0,0,931,941,5,81,0,0,932,941, - 5,82,0,0,933,941,5,88,0,0,934,941,5,89,0,0,935,941,5,90,0,0,936, - 941,5,92,0,0,937,941,5,93,0,0,938,941,5,94,0,0,939,941,5,95,0,0, - 940,929,1,0,0,0,940,930,1,0,0,0,940,931,1,0,0,0,940,932,1,0,0,0, - 940,933,1,0,0,0,940,934,1,0,0,0,940,935,1,0,0,0,940,936,1,0,0,0, - 940,937,1,0,0,0,940,938,1,0,0,0,940,939,1,0,0,0,941,111,1,0,0,0, - 942,943,5,53,0,0,943,944,3,140,70,0,944,945,5,126,0,0,945,946,3, - 114,57,0,946,973,1,0,0,0,947,948,5,54,0,0,948,949,3,140,70,0,949, - 950,5,126,0,0,950,951,3,140,70,0,951,952,5,126,0,0,952,953,3,116, - 58,0,953,973,1,0,0,0,954,955,5,36,0,0,955,957,3,140,70,0,956,958, - 3,28,14,0,957,956,1,0,0,0,957,958,1,0,0,0,958,959,1,0,0,0,959,960, - 5,126,0,0,960,961,3,108,54,0,961,973,1,0,0,0,962,963,5,38,0,0,963, - 964,3,140,70,0,964,965,5,126,0,0,965,967,3,140,70,0,966,968,3,28, - 14,0,967,966,1,0,0,0,967,968,1,0,0,0,968,970,1,0,0,0,969,971,3,118, - 59,0,970,969,1,0,0,0,970,971,1,0,0,0,971,973,1,0,0,0,972,942,1,0, - 0,0,972,947,1,0,0,0,972,954,1,0,0,0,972,962,1,0,0,0,973,113,1,0, - 0,0,974,975,7,4,0,0,975,115,1,0,0,0,976,977,7,5,0,0,977,117,1,0, - 0,0,978,979,5,56,0,0,979,983,5,127,0,0,980,982,3,120,60,0,981,980, - 1,0,0,0,982,985,1,0,0,0,983,981,1,0,0,0,983,984,1,0,0,0,984,986, - 1,0,0,0,985,983,1,0,0,0,986,987,5,128,0,0,987,119,1,0,0,0,988,989, - 3,140,70,0,989,990,5,50,0,0,990,991,5,1,0,0,991,992,5,15,0,0,992, - 993,5,129,0,0,993,994,3,76,38,0,994,995,5,130,0,0,995,996,5,124, - 0,0,996,1070,1,0,0,0,997,998,3,140,70,0,998,999,5,50,0,0,999,1000, - 5,53,0,0,1000,1007,3,140,70,0,1001,1002,5,58,0,0,1002,1003,5,54, - 0,0,1003,1004,3,140,70,0,1004,1005,5,126,0,0,1005,1006,3,140,70, - 0,1006,1008,1,0,0,0,1007,1001,1,0,0,0,1007,1008,1,0,0,0,1008,1009, - 1,0,0,0,1009,1010,5,124,0,0,1010,1070,1,0,0,0,1011,1012,3,140,70, - 0,1012,1013,5,50,0,0,1013,1014,5,54,0,0,1014,1015,3,140,70,0,1015, - 1016,5,126,0,0,1016,1023,3,140,70,0,1017,1018,5,58,0,0,1018,1019, - 5,54,0,0,1019,1020,3,140,70,0,1020,1021,5,126,0,0,1021,1022,3,140, - 70,0,1022,1024,1,0,0,0,1023,1017,1,0,0,0,1023,1024,1,0,0,0,1024, - 1025,1,0,0,0,1025,1026,5,124,0,0,1026,1070,1,0,0,0,1027,1028,3,140, - 70,0,1028,1029,5,50,0,0,1029,1030,5,36,0,0,1030,1032,3,140,70,0, - 1031,1033,3,28,14,0,1032,1031,1,0,0,0,1032,1033,1,0,0,0,1033,1040, - 1,0,0,0,1034,1035,5,58,0,0,1035,1036,5,54,0,0,1036,1037,3,140,70, - 0,1037,1038,5,126,0,0,1038,1039,3,140,70,0,1039,1041,1,0,0,0,1040, - 1034,1,0,0,0,1040,1041,1,0,0,0,1041,1042,1,0,0,0,1042,1043,5,124, - 0,0,1043,1070,1,0,0,0,1044,1045,3,140,70,0,1045,1046,5,50,0,0,1046, - 1047,5,43,0,0,1047,1048,3,140,70,0,1048,1049,5,124,0,0,1049,1070, - 1,0,0,0,1050,1051,3,140,70,0,1051,1053,5,50,0,0,1052,1054,5,1,0, - 0,1053,1052,1,0,0,0,1053,1054,1,0,0,0,1054,1055,1,0,0,0,1055,1056, - 5,14,0,0,1056,1057,3,140,70,0,1057,1058,5,126,0,0,1058,1065,3,140, - 70,0,1059,1060,5,58,0,0,1060,1061,5,54,0,0,1061,1062,3,140,70,0, - 1062,1063,5,126,0,0,1063,1064,3,140,70,0,1064,1066,1,0,0,0,1065, - 1059,1,0,0,0,1065,1066,1,0,0,0,1066,1067,1,0,0,0,1067,1068,5,124, - 0,0,1068,1070,1,0,0,0,1069,988,1,0,0,0,1069,997,1,0,0,0,1069,1011, - 1,0,0,0,1069,1027,1,0,0,0,1069,1044,1,0,0,0,1069,1050,1,0,0,0,1070, - 121,1,0,0,0,1071,1072,5,43,0,0,1072,1073,3,140,70,0,1073,1074,5, - 50,0,0,1074,1075,3,140,70,0,1075,1076,5,126,0,0,1076,1078,3,140, - 70,0,1077,1079,3,118,59,0,1078,1077,1,0,0,0,1078,1079,1,0,0,0,1079, - 1080,1,0,0,0,1080,1081,5,124,0,0,1081,123,1,0,0,0,1082,1129,3,128, - 64,0,1083,1129,5,103,0,0,1084,1129,5,104,0,0,1085,1086,5,105,0,0, - 1086,1129,3,142,71,0,1087,1088,5,106,0,0,1088,1089,5,133,0,0,1089, - 1090,3,140,70,0,1090,1091,5,134,0,0,1091,1129,1,0,0,0,1092,1093, - 5,107,0,0,1093,1094,5,133,0,0,1094,1096,3,140,70,0,1095,1097,3,28, - 14,0,1096,1095,1,0,0,0,1096,1097,1,0,0,0,1097,1098,1,0,0,0,1098, - 1099,5,134,0,0,1099,1129,1,0,0,0,1100,1101,5,31,0,0,1101,1102,5, - 133,0,0,1102,1103,3,140,70,0,1103,1104,5,134,0,0,1104,1129,1,0,0, - 0,1105,1106,5,108,0,0,1106,1107,5,133,0,0,1107,1108,3,124,62,0,1108, - 1109,5,134,0,0,1109,1129,1,0,0,0,1110,1111,5,109,0,0,1111,1112,5, - 133,0,0,1112,1113,3,124,62,0,1113,1114,5,134,0,0,1114,1129,1,0,0, - 0,1115,1116,5,110,0,0,1116,1120,5,127,0,0,1117,1119,3,126,63,0,1118, - 1117,1,0,0,0,1119,1122,1,0,0,0,1120,1118,1,0,0,0,1120,1121,1,0,0, - 0,1121,1123,1,0,0,0,1122,1120,1,0,0,0,1123,1129,5,128,0,0,1124,1126, - 3,140,70,0,1125,1127,3,28,14,0,1126,1125,1,0,0,0,1126,1127,1,0,0, - 0,1127,1129,1,0,0,0,1128,1082,1,0,0,0,1128,1083,1,0,0,0,1128,1084, - 1,0,0,0,1128,1085,1,0,0,0,1128,1087,1,0,0,0,1128,1092,1,0,0,0,1128, - 1100,1,0,0,0,1128,1105,1,0,0,0,1128,1110,1,0,0,0,1128,1115,1,0,0, - 0,1128,1124,1,0,0,0,1129,125,1,0,0,0,1130,1131,3,140,70,0,1131,1132, - 5,123,0,0,1132,1133,3,124,62,0,1133,1134,5,124,0,0,1134,127,1,0, - 0,0,1135,1136,7,6,0,0,1136,129,1,0,0,0,1137,1138,7,7,0,0,1138,131, - 1,0,0,0,1139,1148,3,142,71,0,1140,1148,5,137,0,0,1141,1148,5,138, - 0,0,1142,1148,5,119,0,0,1143,1148,5,120,0,0,1144,1148,5,121,0,0, - 1145,1148,3,134,67,0,1146,1148,3,138,69,0,1147,1139,1,0,0,0,1147, - 1140,1,0,0,0,1147,1141,1,0,0,0,1147,1142,1,0,0,0,1147,1143,1,0,0, - 0,1147,1144,1,0,0,0,1147,1145,1,0,0,0,1147,1146,1,0,0,0,1148,133, - 1,0,0,0,1149,1158,5,127,0,0,1150,1155,3,136,68,0,1151,1152,5,125, - 0,0,1152,1154,3,136,68,0,1153,1151,1,0,0,0,1154,1157,1,0,0,0,1155, - 1153,1,0,0,0,1155,1156,1,0,0,0,1156,1159,1,0,0,0,1157,1155,1,0,0, - 0,1158,1150,1,0,0,0,1158,1159,1,0,0,0,1159,1160,1,0,0,0,1160,1161, - 5,128,0,0,1161,135,1,0,0,0,1162,1163,3,142,71,0,1163,1164,5,123, - 0,0,1164,1165,3,132,66,0,1165,137,1,0,0,0,1166,1175,5,129,0,0,1167, - 1172,3,132,66,0,1168,1169,5,125,0,0,1169,1171,3,132,66,0,1170,1168, - 1,0,0,0,1171,1174,1,0,0,0,1172,1170,1,0,0,0,1172,1173,1,0,0,0,1173, - 1176,1,0,0,0,1174,1172,1,0,0,0,1175,1167,1,0,0,0,1175,1176,1,0,0, - 0,1176,1177,1,0,0,0,1177,1178,5,130,0,0,1178,139,1,0,0,0,1179,1180, - 7,8,0,0,1180,141,1,0,0,0,1181,1182,5,140,0,0,1182,143,1,0,0,0,106, - 156,163,184,196,208,228,236,243,249,261,264,270,281,290,300,303, - 305,309,317,329,334,343,346,361,367,379,388,396,409,412,422,426, - 432,439,445,453,461,474,481,485,490,501,507,517,522,528,539,566, - 593,598,609,612,617,624,633,636,649,658,672,693,696,699,706,714, - 754,757,769,783,791,803,817,827,845,849,852,856,859,868,872,876, - 882,892,921,940,957,967,970,972,983,1007,1023,1032,1040,1053,1065, - 1069,1078,1096,1120,1126,1128,1147,1155,1158,1172,1175 + 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,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, + 1,0,1,0,1,0,3,0,163,8,0,1,1,1,1,1,1,5,1,168,8,1,10,1,12,1,171,9, + 1,1,1,1,1,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1, + 3,5,3,189,8,3,10,3,12,3,192,9,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,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,3,5,215, + 8,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8, + 1,8,1,8,1,8,3,8,235,8,8,1,9,1,9,1,9,1,9,1,9,1,9,3,9,243,8,9,1,9, + 1,9,1,10,5,10,248,8,10,10,10,12,10,251,9,10,1,10,1,10,1,10,3,10, + 256,8,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,5,10,266,8,10,10, + 10,12,10,269,9,10,3,10,271,8,10,1,10,1,10,5,10,275,8,10,10,10,12, + 10,278,9,10,1,10,1,10,1,11,1,11,1,11,1,11,5,11,286,8,11,10,11,12, + 11,289,9,11,1,11,1,11,1,12,1,12,1,12,1,12,3,12,297,8,12,1,12,1,12, + 1,12,1,12,1,12,1,12,5,12,305,8,12,10,12,12,12,308,9,12,3,12,310, + 8,12,3,12,312,8,12,1,13,1,13,3,13,316,8,13,1,14,1,14,1,14,1,14,5, + 14,322,8,14,10,14,12,14,325,9,14,1,14,1,14,1,15,1,15,1,15,1,15,1, + 15,1,15,1,15,3,15,336,8,15,1,16,1,16,1,16,3,16,341,8,16,1,16,1,16, + 1,16,1,16,1,17,1,17,1,17,3,17,350,8,17,1,18,3,18,353,8,18,1,18,1, + 18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,3,18,368, + 8,18,1,18,1,18,1,18,1,19,3,19,374,8,19,1,19,1,19,1,19,1,19,1,19, + 1,19,1,19,1,19,5,19,384,8,19,10,19,12,19,387,9,19,1,19,1,19,1,20, + 1,20,1,20,1,20,3,20,395,8,20,1,20,1,20,1,20,1,20,1,20,1,20,3,20, + 403,8,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20, + 3,20,416,8,20,1,21,3,21,419,8,21,1,21,1,21,1,21,1,21,1,21,1,21,1, + 21,1,21,3,21,429,8,21,1,21,1,21,3,21,433,8,21,1,21,1,21,5,21,437, + 8,21,10,21,12,21,440,9,21,1,21,1,21,1,22,1,22,3,22,446,8,22,1,23, + 1,23,1,23,1,23,3,23,452,8,23,1,23,1,23,1,23,1,23,1,23,1,23,3,23, + 460,8,23,1,23,1,23,1,23,1,23,1,23,1,23,3,23,468,8,23,1,23,1,23,1, + 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,3,23,481,8,23,1,24,1, + 24,1,24,1,24,1,24,3,24,488,8,24,1,24,1,24,3,24,492,8,24,1,25,5,25, + 495,8,25,10,25,12,25,498,9,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25, + 1,25,3,25,508,8,25,1,25,1,25,5,25,512,8,25,10,25,12,25,515,9,25, + 1,25,1,25,1,26,1,26,1,26,1,26,1,26,3,26,524,8,26,1,27,1,27,1,27, + 3,27,529,8,27,1,27,1,27,1,27,1,27,3,27,535,8,27,1,27,1,27,1,27,1, + 27,1,27,1,27,1,27,5,27,544,8,27,10,27,12,27,547,9,27,1,27,1,27,1, + 28,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,29,1,29,1,29,1,29,1,29,1,29,1,29,3,29,573,8,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,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,3,29,600,8, + 29,1,30,1,30,1,30,3,30,605,8,30,1,30,1,30,1,30,1,30,1,30,1,30,1, + 30,1,30,1,30,3,30,616,8,30,1,30,3,30,619,8,30,1,30,1,30,1,30,3,30, + 624,8,30,1,30,1,30,1,31,1,31,1,31,3,31,631,8,31,1,31,1,31,1,31,1, + 31,1,31,1,31,1,31,3,31,640,8,31,1,31,3,31,643,8,31,1,31,1,31,1,32, + 1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,3,32,656,8,32,1,33,1,33, + 1,33,1,33,1,33,5,33,663,8,33,10,33,12,33,666,9,33,1,33,1,33,1,34, + 1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,3,34,679,8,34,1,34,1,34, + 1,35,1,35,1,35,1,36,1,36,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37, + 1,37,1,37,5,37,698,8,37,10,37,12,37,701,9,37,3,37,703,8,37,1,37, + 3,37,706,8,37,1,38,1,38,1,38,5,38,711,8,38,10,38,12,38,714,9,38, + 1,39,1,39,1,39,5,39,719,8,39,10,39,12,39,722,9,39,1,39,1,39,1,40, + 1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40, + 1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40, + 1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,3,40,761,8,40,1,40,3,40, + 764,8,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40, + 1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,3,40,786,8,40,1,40, + 1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,3,40,800, + 8,40,1,41,1,41,1,41,1,41,5,41,806,8,41,10,41,12,41,809,9,41,1,41, + 1,41,1,42,1,42,1,43,1,43,1,43,1,44,1,44,3,44,820,8,44,1,45,1,45, + 1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,3,45,834,8,45, + 1,45,1,45,1,46,1,46,1,46,1,46,1,46,1,46,3,46,844,8,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,48,1,48,1,48, + 1,48,3,48,862,8,48,1,48,1,48,3,48,866,8,48,1,48,3,48,869,8,48,1, + 48,1,48,3,48,873,8,48,1,48,3,48,876,8,48,1,48,1,48,1,49,1,49,1,49, + 1,49,1,49,3,49,885,8,49,1,49,1,49,3,49,889,8,49,1,49,1,49,3,49,893, + 8,49,1,49,1,49,5,49,897,8,49,10,49,12,49,900,9,49,1,49,1,49,1,50, + 1,50,1,50,1,50,1,50,1,50,3,50,910,8,50,1,51,1,51,1,51,5,51,915,8, + 51,10,51,12,51,918,9,51,1,51,1,51,1,51,1,52,1,52,1,52,1,52,1,52, + 1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,3,52,937,8,52,1,53, + 1,53,1,53,1,53,1,53,5,53,944,8,53,10,53,12,53,947,9,53,1,53,1,53, + 1,54,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,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,3,56,978,8,56,1,56,1,56,1,57,1,57,1,57,1,57,1,58,1,58,1,58, + 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,997,8,58,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,1014,8,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,1024, + 8,59,1,59,3,59,1027,8,59,3,59,1029,8,59,1,60,1,60,1,61,1,61,1,62, + 1,62,1,62,5,62,1038,8,62,10,62,12,62,1041,9,62,1,62,1,62,1,63,1, + 63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1, + 63,1,63,1,63,1,63,1,63,3,63,1064,8,63,1,63,1,63,1,63,1,63,1,63,1, + 63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,3,63,1080,8,63,1,63,1, + 63,1,63,1,63,1,63,1,63,1,63,3,63,1089,8,63,1,63,1,63,1,63,1,63,1, + 63,1,63,3,63,1097,8,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1, + 63,5,63,1108,8,63,10,63,12,63,1111,9,63,1,63,1,63,1,63,1,63,1,63, + 1,63,1,63,1,63,1,63,1,63,1,63,1,63,3,63,1125,8,63,1,63,1,63,1,63, + 1,63,1,63,1,63,1,63,1,63,1,63,1,63,3,63,1137,8,63,1,63,1,63,3,63, + 1141,8,63,1,64,1,64,1,64,1,64,1,64,1,64,1,64,3,64,1150,8,64,1,64, + 1,64,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65, + 1,65,1,65,3,65,1168,8,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65, + 1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,5,65, + 1190,8,65,10,65,12,65,1193,9,65,1,65,1,65,1,65,3,65,1198,8,65,3, + 65,1200,8,65,1,66,1,66,1,66,1,66,1,66,1,67,1,67,1,68,1,68,1,69,1, + 69,1,69,1,69,1,69,1,69,1,69,1,69,3,69,1219,8,69,1,70,1,70,1,70,1, + 70,5,70,1225,8,70,10,70,12,70,1228,9,70,3,70,1230,8,70,1,70,1,70, + 1,71,1,71,1,71,1,71,1,72,1,72,1,72,1,72,5,72,1242,8,72,10,72,12, + 72,1245,9,72,3,72,1247,8,72,1,72,1,72,1,73,1,73,1,74,1,74,1,74,0, + 0,75,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,0,9,2,0,9,9, + 27,27,1,0,5,6,1,0,93,97,2,0,88,92,94,95,2,0,88,89,94,95,2,0,90,92, + 94,95,1,0,113,120,1,0,100,103,4,0,13,27,39,39,67,67,141,141,1355, + 0,162,1,0,0,0,2,164,1,0,0,0,4,174,1,0,0,0,6,178,1,0,0,0,8,202,1, + 0,0,0,10,214,1,0,0,0,12,216,1,0,0,0,14,223,1,0,0,0,16,234,1,0,0, + 0,18,236,1,0,0,0,20,249,1,0,0,0,22,281,1,0,0,0,24,311,1,0,0,0,26, + 313,1,0,0,0,28,317,1,0,0,0,30,335,1,0,0,0,32,337,1,0,0,0,34,349, + 1,0,0,0,36,352,1,0,0,0,38,373,1,0,0,0,40,415,1,0,0,0,42,418,1,0, + 0,0,44,443,1,0,0,0,46,480,1,0,0,0,48,491,1,0,0,0,50,496,1,0,0,0, + 52,523,1,0,0,0,54,525,1,0,0,0,56,550,1,0,0,0,58,599,1,0,0,0,60,601, + 1,0,0,0,62,627,1,0,0,0,64,655,1,0,0,0,66,657,1,0,0,0,68,669,1,0, + 0,0,70,682,1,0,0,0,72,685,1,0,0,0,74,705,1,0,0,0,76,707,1,0,0,0, + 78,715,1,0,0,0,80,799,1,0,0,0,82,801,1,0,0,0,84,812,1,0,0,0,86,814, + 1,0,0,0,88,819,1,0,0,0,90,821,1,0,0,0,92,843,1,0,0,0,94,845,1,0, + 0,0,96,854,1,0,0,0,98,879,1,0,0,0,100,909,1,0,0,0,102,911,1,0,0, + 0,104,936,1,0,0,0,106,938,1,0,0,0,108,950,1,0,0,0,110,957,1,0,0, + 0,112,971,1,0,0,0,114,981,1,0,0,0,116,996,1,0,0,0,118,1028,1,0,0, + 0,120,1030,1,0,0,0,122,1032,1,0,0,0,124,1034,1,0,0,0,126,1140,1, + 0,0,0,128,1142,1,0,0,0,130,1199,1,0,0,0,132,1201,1,0,0,0,134,1206, + 1,0,0,0,136,1208,1,0,0,0,138,1218,1,0,0,0,140,1220,1,0,0,0,142,1233, + 1,0,0,0,144,1237,1,0,0,0,146,1250,1,0,0,0,148,1252,1,0,0,0,150,151, + 3,6,3,0,151,152,5,0,0,1,152,163,1,0,0,0,153,154,3,20,10,0,154,155, + 5,0,0,1,155,163,1,0,0,0,156,157,3,50,25,0,157,158,5,0,0,1,158,163, + 1,0,0,0,159,160,3,2,1,0,160,161,5,0,0,1,161,163,1,0,0,0,162,150, + 1,0,0,0,162,153,1,0,0,0,162,156,1,0,0,0,162,159,1,0,0,0,163,1,1, + 0,0,0,164,165,5,34,0,0,165,169,5,129,0,0,166,168,3,8,4,0,167,166, + 1,0,0,0,168,171,1,0,0,0,169,167,1,0,0,0,169,170,1,0,0,0,170,172, + 1,0,0,0,171,169,1,0,0,0,172,173,5,130,0,0,173,3,1,0,0,0,174,175, + 5,35,0,0,175,176,3,148,74,0,176,177,5,126,0,0,177,5,1,0,0,0,178, + 179,5,3,0,0,179,180,3,146,73,0,180,181,5,76,0,0,181,182,3,148,74, + 0,182,183,5,70,0,0,183,184,3,148,74,0,184,185,5,69,0,0,185,186,3, + 148,74,0,186,190,5,129,0,0,187,189,3,8,4,0,188,187,1,0,0,0,189,192, + 1,0,0,0,190,188,1,0,0,0,190,191,1,0,0,0,191,193,1,0,0,0,192,190, + 1,0,0,0,193,194,5,130,0,0,194,7,1,0,0,0,195,203,3,4,2,0,196,203, + 3,18,9,0,197,203,3,10,5,0,198,203,3,86,43,0,199,203,3,98,49,0,200, + 203,3,128,64,0,201,203,3,32,16,0,202,195,1,0,0,0,202,196,1,0,0,0, + 202,197,1,0,0,0,202,198,1,0,0,0,202,199,1,0,0,0,202,200,1,0,0,0, + 202,201,1,0,0,0,203,9,1,0,0,0,204,205,5,35,0,0,205,206,5,38,0,0, + 206,207,3,146,73,0,207,208,5,126,0,0,208,215,1,0,0,0,209,210,5,35, + 0,0,210,211,5,40,0,0,211,212,3,146,73,0,212,213,5,126,0,0,213,215, + 1,0,0,0,214,204,1,0,0,0,214,209,1,0,0,0,215,11,1,0,0,0,216,217,5, + 36,0,0,217,218,5,37,0,0,218,219,3,146,73,0,219,220,5,76,0,0,220, + 221,3,148,74,0,221,222,5,126,0,0,222,13,1,0,0,0,223,224,5,36,0,0, + 224,225,5,38,0,0,225,226,3,146,73,0,226,227,5,70,0,0,227,228,3,148, + 74,0,228,229,5,126,0,0,229,15,1,0,0,0,230,235,3,10,5,0,231,235,3, + 12,6,0,232,235,3,14,7,0,233,235,3,32,16,0,234,230,1,0,0,0,234,231, + 1,0,0,0,234,232,1,0,0,0,234,233,1,0,0,0,235,17,1,0,0,0,236,237,5, + 37,0,0,237,238,3,146,73,0,238,239,5,76,0,0,239,242,3,148,74,0,240, + 241,5,77,0,0,241,243,3,148,74,0,242,240,1,0,0,0,242,243,1,0,0,0, + 243,244,1,0,0,0,244,245,5,126,0,0,245,19,1,0,0,0,246,248,3,16,8, + 0,247,246,1,0,0,0,248,251,1,0,0,0,249,247,1,0,0,0,249,250,1,0,0, + 0,250,252,1,0,0,0,251,249,1,0,0,0,252,253,5,38,0,0,253,255,3,146, + 73,0,254,256,3,22,11,0,255,254,1,0,0,0,255,256,1,0,0,0,256,257,1, + 0,0,0,257,258,5,76,0,0,258,259,3,148,74,0,259,260,5,70,0,0,260,270, + 3,148,74,0,261,262,5,81,0,0,262,267,3,26,13,0,263,264,5,127,0,0, + 264,266,3,26,13,0,265,263,1,0,0,0,266,269,1,0,0,0,267,265,1,0,0, + 0,267,268,1,0,0,0,268,271,1,0,0,0,269,267,1,0,0,0,270,261,1,0,0, + 0,270,271,1,0,0,0,271,272,1,0,0,0,272,276,5,129,0,0,273,275,3,34, + 17,0,274,273,1,0,0,0,275,278,1,0,0,0,276,274,1,0,0,0,276,277,1,0, + 0,0,277,279,1,0,0,0,278,276,1,0,0,0,279,280,5,130,0,0,280,21,1,0, + 0,0,281,282,5,135,0,0,282,287,3,24,12,0,283,284,5,127,0,0,284,286, + 3,24,12,0,285,283,1,0,0,0,286,289,1,0,0,0,287,285,1,0,0,0,287,288, + 1,0,0,0,288,290,1,0,0,0,289,287,1,0,0,0,290,291,5,136,0,0,291,23, + 1,0,0,0,292,293,5,41,0,0,293,296,3,146,73,0,294,295,5,125,0,0,295, + 297,5,31,0,0,296,294,1,0,0,0,296,297,1,0,0,0,297,312,1,0,0,0,298, + 299,5,30,0,0,299,309,3,146,73,0,300,301,5,32,0,0,301,306,3,26,13, + 0,302,303,5,137,0,0,303,305,3,26,13,0,304,302,1,0,0,0,305,308,1, + 0,0,0,306,304,1,0,0,0,306,307,1,0,0,0,307,310,1,0,0,0,308,306,1, + 0,0,0,309,300,1,0,0,0,309,310,1,0,0,0,310,312,1,0,0,0,311,292,1, + 0,0,0,311,298,1,0,0,0,312,25,1,0,0,0,313,315,3,146,73,0,314,316, + 3,28,14,0,315,314,1,0,0,0,315,316,1,0,0,0,316,27,1,0,0,0,317,318, + 5,135,0,0,318,323,3,30,15,0,319,320,5,127,0,0,320,322,3,30,15,0, + 321,319,1,0,0,0,322,325,1,0,0,0,323,321,1,0,0,0,323,324,1,0,0,0, + 324,326,1,0,0,0,325,323,1,0,0,0,326,327,5,136,0,0,327,29,1,0,0,0, + 328,329,5,37,0,0,329,336,3,146,73,0,330,331,5,38,0,0,331,336,3,26, + 13,0,332,333,5,30,0,0,333,336,3,146,73,0,334,336,3,130,65,0,335, + 328,1,0,0,0,335,330,1,0,0,0,335,332,1,0,0,0,335,334,1,0,0,0,336, + 31,1,0,0,0,337,338,5,29,0,0,338,340,3,146,73,0,339,341,3,22,11,0, + 340,339,1,0,0,0,340,341,1,0,0,0,341,342,1,0,0,0,342,343,5,138,0, + 0,343,344,3,130,65,0,344,345,5,126,0,0,345,33,1,0,0,0,346,350,3, + 38,19,0,347,350,3,42,21,0,348,350,3,36,18,0,349,346,1,0,0,0,349, + 347,1,0,0,0,349,348,1,0,0,0,350,35,1,0,0,0,351,353,5,51,0,0,352, + 351,1,0,0,0,352,353,1,0,0,0,353,354,1,0,0,0,354,355,5,43,0,0,355, + 356,3,146,73,0,356,357,5,76,0,0,357,358,3,148,74,0,358,359,5,125, + 0,0,359,360,3,130,65,0,360,361,5,124,0,0,361,362,3,130,65,0,362, + 363,5,129,0,0,363,364,5,93,0,0,364,365,5,76,0,0,365,367,3,148,74, + 0,366,368,3,64,32,0,367,366,1,0,0,0,367,368,1,0,0,0,368,369,1,0, + 0,0,369,370,5,126,0,0,370,371,5,130,0,0,371,37,1,0,0,0,372,374,3, + 44,22,0,373,372,1,0,0,0,373,374,1,0,0,0,374,375,1,0,0,0,375,376, + 5,41,0,0,376,377,3,146,73,0,377,378,5,76,0,0,378,379,3,148,74,0, + 379,380,5,125,0,0,380,381,3,130,65,0,381,385,5,129,0,0,382,384,3, + 40,20,0,383,382,1,0,0,0,384,387,1,0,0,0,385,383,1,0,0,0,385,386, + 1,0,0,0,386,388,1,0,0,0,387,385,1,0,0,0,388,389,5,130,0,0,389,39, + 1,0,0,0,390,391,5,83,0,0,391,392,5,76,0,0,392,394,3,148,74,0,393, + 395,3,64,32,0,394,393,1,0,0,0,394,395,1,0,0,0,395,396,1,0,0,0,396, + 397,5,126,0,0,397,416,1,0,0,0,398,399,5,84,0,0,399,400,5,76,0,0, + 400,402,3,148,74,0,401,403,3,64,32,0,402,401,1,0,0,0,402,403,1,0, + 0,0,403,404,1,0,0,0,404,405,5,126,0,0,405,416,1,0,0,0,406,407,5, + 85,0,0,407,408,5,86,0,0,408,409,5,76,0,0,409,410,3,148,74,0,410, + 411,5,87,0,0,411,412,5,76,0,0,412,413,3,148,74,0,413,414,5,126,0, + 0,414,416,1,0,0,0,415,390,1,0,0,0,415,398,1,0,0,0,415,406,1,0,0, + 0,416,41,1,0,0,0,417,419,3,44,22,0,418,417,1,0,0,0,418,419,1,0,0, + 0,419,420,1,0,0,0,420,421,5,42,0,0,421,422,3,146,73,0,422,423,5, + 76,0,0,423,424,3,148,74,0,424,425,5,125,0,0,425,426,3,136,68,0,426, + 428,3,48,24,0,427,429,5,104,0,0,428,427,1,0,0,0,428,429,1,0,0,0, + 429,432,1,0,0,0,430,431,5,74,0,0,431,433,3,148,74,0,432,430,1,0, + 0,0,432,433,1,0,0,0,433,434,1,0,0,0,434,438,5,129,0,0,435,437,3, + 46,23,0,436,435,1,0,0,0,437,440,1,0,0,0,438,436,1,0,0,0,438,439, + 1,0,0,0,439,441,1,0,0,0,440,438,1,0,0,0,441,442,5,130,0,0,442,43, + 1,0,0,0,443,445,5,26,0,0,444,446,7,0,0,0,445,444,1,0,0,0,445,446, + 1,0,0,0,446,45,1,0,0,0,447,448,5,90,0,0,448,449,5,76,0,0,449,451, + 3,148,74,0,450,452,3,64,32,0,451,450,1,0,0,0,451,452,1,0,0,0,452, + 453,1,0,0,0,453,454,5,126,0,0,454,481,1,0,0,0,455,456,5,91,0,0,456, + 457,5,76,0,0,457,459,3,148,74,0,458,460,3,64,32,0,459,458,1,0,0, + 0,459,460,1,0,0,0,460,461,1,0,0,0,461,462,5,126,0,0,462,481,1,0, + 0,0,463,464,5,92,0,0,464,465,5,76,0,0,465,467,3,148,74,0,466,468, + 3,64,32,0,467,466,1,0,0,0,467,468,1,0,0,0,468,469,1,0,0,0,469,470, + 5,126,0,0,470,481,1,0,0,0,471,472,5,85,0,0,472,473,5,86,0,0,473, + 474,5,76,0,0,474,475,3,148,74,0,475,476,5,87,0,0,476,477,5,76,0, + 0,477,478,3,148,74,0,478,479,5,126,0,0,479,481,1,0,0,0,480,447,1, + 0,0,0,480,455,1,0,0,0,480,463,1,0,0,0,480,471,1,0,0,0,481,47,1,0, + 0,0,482,483,5,37,0,0,483,492,3,146,73,0,484,485,5,38,0,0,485,487, + 3,146,73,0,486,488,3,28,14,0,487,486,1,0,0,0,487,488,1,0,0,0,488, + 492,1,0,0,0,489,490,5,30,0,0,490,492,3,146,73,0,491,482,1,0,0,0, + 491,484,1,0,0,0,491,489,1,0,0,0,492,49,1,0,0,0,493,495,3,16,8,0, + 494,493,1,0,0,0,495,498,1,0,0,0,496,494,1,0,0,0,496,497,1,0,0,0, + 497,499,1,0,0,0,498,496,1,0,0,0,499,500,5,40,0,0,500,501,3,146,73, + 0,501,502,5,76,0,0,502,503,3,148,74,0,503,504,5,70,0,0,504,507,3, + 148,74,0,505,506,5,71,0,0,506,508,5,139,0,0,507,505,1,0,0,0,507, + 508,1,0,0,0,508,509,1,0,0,0,509,513,5,129,0,0,510,512,3,52,26,0, + 511,510,1,0,0,0,512,515,1,0,0,0,513,511,1,0,0,0,513,514,1,0,0,0, + 514,516,1,0,0,0,515,513,1,0,0,0,516,517,5,130,0,0,517,51,1,0,0,0, + 518,524,3,60,30,0,519,524,3,62,31,0,520,524,3,68,34,0,521,524,3, + 54,27,0,522,524,3,56,28,0,523,518,1,0,0,0,523,519,1,0,0,0,523,520, + 1,0,0,0,523,521,1,0,0,0,523,522,1,0,0,0,524,53,1,0,0,0,525,526,5, + 16,0,0,526,528,3,146,73,0,527,529,3,22,11,0,528,527,1,0,0,0,528, + 529,1,0,0,0,529,530,1,0,0,0,530,531,5,76,0,0,531,532,3,148,74,0, + 532,534,5,19,0,0,533,535,5,3,0,0,534,533,1,0,0,0,534,535,1,0,0,0, + 535,536,1,0,0,0,536,537,3,26,13,0,537,538,5,20,0,0,538,539,3,148, + 74,0,539,540,5,43,0,0,540,541,3,148,74,0,541,545,5,129,0,0,542,544, + 3,58,29,0,543,542,1,0,0,0,544,547,1,0,0,0,545,543,1,0,0,0,545,546, + 1,0,0,0,546,548,1,0,0,0,547,545,1,0,0,0,548,549,5,130,0,0,549,55, + 1,0,0,0,550,551,5,16,0,0,551,552,3,146,73,0,552,553,5,76,0,0,553, + 554,3,148,74,0,554,555,5,18,0,0,555,556,3,146,73,0,556,557,3,28, + 14,0,557,558,5,126,0,0,558,57,1,0,0,0,559,560,5,10,0,0,560,600,5, + 126,0,0,561,562,5,11,0,0,562,563,5,12,0,0,563,564,3,146,73,0,564, + 565,5,126,0,0,565,600,1,0,0,0,566,567,5,21,0,0,567,568,3,148,74, + 0,568,569,5,126,0,0,569,600,1,0,0,0,570,572,5,22,0,0,571,573,5,30, + 0,0,572,571,1,0,0,0,572,573,1,0,0,0,573,574,1,0,0,0,574,575,3,146, + 73,0,575,576,5,49,0,0,576,577,3,26,13,0,577,578,5,126,0,0,578,600, + 1,0,0,0,579,580,5,23,0,0,580,581,3,146,73,0,581,582,5,139,0,0,582, + 583,5,126,0,0,583,600,1,0,0,0,584,585,5,24,0,0,585,586,3,26,13,0, + 586,587,5,128,0,0,587,588,3,146,73,0,588,589,3,146,73,0,589,590, + 3,148,74,0,590,591,5,126,0,0,591,600,1,0,0,0,592,593,5,85,0,0,593, + 600,5,126,0,0,594,595,5,25,0,0,595,596,5,139,0,0,596,597,3,148,74, + 0,597,598,5,126,0,0,598,600,1,0,0,0,599,559,1,0,0,0,599,561,1,0, + 0,0,599,566,1,0,0,0,599,570,1,0,0,0,599,579,1,0,0,0,599,584,1,0, + 0,0,599,592,1,0,0,0,599,594,1,0,0,0,600,59,1,0,0,0,601,602,5,43, + 0,0,602,604,3,146,73,0,603,605,3,22,11,0,604,603,1,0,0,0,604,605, + 1,0,0,0,605,606,1,0,0,0,606,607,5,76,0,0,607,608,3,148,74,0,608, + 609,5,125,0,0,609,610,3,130,65,0,610,611,5,124,0,0,611,612,3,130, + 65,0,612,613,5,78,0,0,613,615,3,72,36,0,614,616,3,64,32,0,615,614, + 1,0,0,0,615,616,1,0,0,0,616,618,1,0,0,0,617,619,3,70,35,0,618,617, + 1,0,0,0,618,619,1,0,0,0,619,620,1,0,0,0,620,621,5,80,0,0,621,623, + 3,74,37,0,622,624,3,78,39,0,623,622,1,0,0,0,623,624,1,0,0,0,624, + 625,1,0,0,0,625,626,5,126,0,0,626,61,1,0,0,0,627,628,5,44,0,0,628, + 630,3,146,73,0,629,631,3,22,11,0,630,629,1,0,0,0,630,631,1,0,0,0, + 631,632,1,0,0,0,632,633,5,76,0,0,633,634,3,148,74,0,634,635,5,125, + 0,0,635,636,3,130,65,0,636,637,5,124,0,0,637,639,3,130,65,0,638, + 640,3,64,32,0,639,638,1,0,0,0,639,640,1,0,0,0,640,642,1,0,0,0,641, + 643,3,78,39,0,642,641,1,0,0,0,642,643,1,0,0,0,643,644,1,0,0,0,644, + 645,5,126,0,0,645,63,1,0,0,0,646,647,5,4,0,0,647,656,5,7,0,0,648, + 649,5,4,0,0,649,650,7,1,0,0,650,651,5,8,0,0,651,652,5,131,0,0,652, + 653,3,76,38,0,653,654,5,132,0,0,654,656,1,0,0,0,655,646,1,0,0,0, + 655,648,1,0,0,0,656,65,1,0,0,0,657,658,5,59,0,0,658,659,5,131,0, + 0,659,664,3,114,57,0,660,661,5,127,0,0,661,663,3,114,57,0,662,660, + 1,0,0,0,663,666,1,0,0,0,664,662,1,0,0,0,664,665,1,0,0,0,665,667, + 1,0,0,0,666,664,1,0,0,0,667,668,5,132,0,0,668,67,1,0,0,0,669,670, + 5,45,0,0,670,671,3,146,73,0,671,672,5,76,0,0,672,673,3,148,74,0, + 673,674,5,46,0,0,674,675,3,146,73,0,675,676,5,125,0,0,676,678,3, + 130,65,0,677,679,3,78,39,0,678,677,1,0,0,0,678,679,1,0,0,0,679,680, + 1,0,0,0,680,681,5,126,0,0,681,69,1,0,0,0,682,683,5,79,0,0,683,684, + 3,130,65,0,684,71,1,0,0,0,685,686,7,2,0,0,686,73,1,0,0,0,687,706, + 5,82,0,0,688,689,5,37,0,0,689,706,3,146,73,0,690,691,5,30,0,0,691, + 706,3,146,73,0,692,693,5,39,0,0,693,702,5,131,0,0,694,699,3,26,13, + 0,695,696,5,127,0,0,696,698,3,26,13,0,697,695,1,0,0,0,698,701,1, + 0,0,0,699,697,1,0,0,0,699,700,1,0,0,0,700,703,1,0,0,0,701,699,1, + 0,0,0,702,694,1,0,0,0,702,703,1,0,0,0,703,704,1,0,0,0,704,706,5, + 132,0,0,705,687,1,0,0,0,705,688,1,0,0,0,705,690,1,0,0,0,705,692, + 1,0,0,0,706,75,1,0,0,0,707,712,3,146,73,0,708,709,5,127,0,0,709, + 711,3,146,73,0,710,708,1,0,0,0,711,714,1,0,0,0,712,710,1,0,0,0,712, + 713,1,0,0,0,713,77,1,0,0,0,714,712,1,0,0,0,715,716,5,81,0,0,716, + 720,5,129,0,0,717,719,3,80,40,0,718,717,1,0,0,0,719,722,1,0,0,0, + 720,718,1,0,0,0,720,721,1,0,0,0,721,723,1,0,0,0,722,720,1,0,0,0, + 723,724,5,130,0,0,724,79,1,0,0,0,725,726,5,17,0,0,726,727,3,146, + 73,0,727,728,5,76,0,0,728,729,3,148,74,0,729,730,5,131,0,0,730,731, + 3,76,38,0,731,732,5,132,0,0,732,733,5,126,0,0,733,800,1,0,0,0,734, + 735,5,55,0,0,735,736,3,146,73,0,736,737,5,76,0,0,737,738,3,148,74, + 0,738,739,5,125,0,0,739,740,3,130,65,0,740,741,3,82,41,0,741,742, + 5,126,0,0,742,800,1,0,0,0,743,744,5,56,0,0,744,745,3,146,73,0,745, + 746,5,76,0,0,746,747,3,148,74,0,747,748,5,125,0,0,748,749,3,136, + 68,0,749,750,3,48,24,0,750,751,3,82,41,0,751,752,5,126,0,0,752,800, + 1,0,0,0,753,754,5,38,0,0,754,755,3,146,73,0,755,756,5,76,0,0,756, + 757,3,148,74,0,757,758,5,125,0,0,758,760,3,146,73,0,759,761,3,28, + 14,0,760,759,1,0,0,0,760,761,1,0,0,0,761,763,1,0,0,0,762,764,3,66, + 33,0,763,762,1,0,0,0,763,764,1,0,0,0,764,765,1,0,0,0,765,766,5,126, + 0,0,766,800,1,0,0,0,767,768,5,1,0,0,768,769,3,146,73,0,769,770,5, + 76,0,0,770,771,3,148,74,0,771,772,5,125,0,0,772,773,3,146,73,0,773, + 774,5,47,0,0,774,775,3,130,65,0,775,776,5,126,0,0,776,800,1,0,0, + 0,777,778,5,45,0,0,778,779,3,146,73,0,779,780,5,76,0,0,780,781,3, + 148,74,0,781,782,5,125,0,0,782,785,3,146,73,0,783,784,5,47,0,0,784, + 786,3,130,65,0,785,783,1,0,0,0,785,786,1,0,0,0,786,787,1,0,0,0,787, + 788,5,126,0,0,788,800,1,0,0,0,789,790,5,16,0,0,790,791,3,146,73, + 0,791,792,5,76,0,0,792,793,3,148,74,0,793,794,5,125,0,0,794,795, + 3,146,73,0,795,796,5,128,0,0,796,797,3,146,73,0,797,798,5,126,0, + 0,798,800,1,0,0,0,799,725,1,0,0,0,799,734,1,0,0,0,799,743,1,0,0, + 0,799,753,1,0,0,0,799,767,1,0,0,0,799,777,1,0,0,0,799,789,1,0,0, + 0,800,81,1,0,0,0,801,802,5,131,0,0,802,807,3,84,42,0,803,804,5,127, + 0,0,804,806,3,84,42,0,805,803,1,0,0,0,806,809,1,0,0,0,807,805,1, + 0,0,0,807,808,1,0,0,0,808,810,1,0,0,0,809,807,1,0,0,0,810,811,5, + 132,0,0,811,83,1,0,0,0,812,813,7,3,0,0,813,85,1,0,0,0,814,815,5, + 54,0,0,815,816,3,88,44,0,816,87,1,0,0,0,817,820,3,90,45,0,818,820, + 3,94,47,0,819,817,1,0,0,0,819,818,1,0,0,0,820,89,1,0,0,0,821,822, + 5,55,0,0,822,823,3,146,73,0,823,824,5,76,0,0,824,825,3,148,74,0, + 825,826,5,64,0,0,826,827,3,146,73,0,827,828,5,125,0,0,828,829,3, + 130,65,0,829,830,5,65,0,0,830,833,3,92,46,0,831,832,5,66,0,0,832, + 834,3,138,69,0,833,831,1,0,0,0,833,834,1,0,0,0,834,835,1,0,0,0,835, + 836,5,126,0,0,836,91,1,0,0,0,837,844,5,98,0,0,838,839,5,99,0,0,839, + 840,5,133,0,0,840,841,3,130,65,0,841,842,5,134,0,0,842,844,1,0,0, + 0,843,837,1,0,0,0,843,838,1,0,0,0,844,93,1,0,0,0,845,846,5,56,0, + 0,846,847,3,146,73,0,847,848,5,76,0,0,848,849,3,148,74,0,849,850, + 5,129,0,0,850,851,3,96,48,0,851,852,3,96,48,0,852,853,5,130,0,0, + 853,95,1,0,0,0,854,855,3,48,24,0,855,856,5,57,0,0,856,857,3,146, + 73,0,857,858,5,76,0,0,858,859,3,148,74,0,859,861,3,136,68,0,860, + 862,5,104,0,0,861,860,1,0,0,0,861,862,1,0,0,0,862,865,1,0,0,0,863, + 864,5,72,0,0,864,866,3,148,74,0,865,863,1,0,0,0,865,866,1,0,0,0, + 866,868,1,0,0,0,867,869,5,73,0,0,868,867,1,0,0,0,868,869,1,0,0,0, + 869,872,1,0,0,0,870,871,5,74,0,0,871,873,3,148,74,0,872,870,1,0, + 0,0,872,873,1,0,0,0,873,875,1,0,0,0,874,876,5,75,0,0,875,874,1,0, + 0,0,875,876,1,0,0,0,876,877,1,0,0,0,877,878,5,126,0,0,878,97,1,0, + 0,0,879,880,5,48,0,0,880,881,3,146,73,0,881,882,5,49,0,0,882,884, + 3,146,73,0,883,885,3,28,14,0,884,883,1,0,0,0,884,885,1,0,0,0,885, + 888,1,0,0,0,886,887,5,76,0,0,887,889,3,148,74,0,888,886,1,0,0,0, + 888,889,1,0,0,0,889,892,1,0,0,0,890,891,5,71,0,0,891,893,5,139,0, + 0,892,890,1,0,0,0,892,893,1,0,0,0,893,894,1,0,0,0,894,898,5,129, + 0,0,895,897,3,100,50,0,896,895,1,0,0,0,897,900,1,0,0,0,898,896,1, + 0,0,0,898,899,1,0,0,0,899,901,1,0,0,0,900,898,1,0,0,0,901,902,5, + 130,0,0,902,99,1,0,0,0,903,904,5,53,0,0,904,910,3,88,44,0,905,910, + 3,112,56,0,906,910,3,108,54,0,907,910,3,102,51,0,908,910,3,110,55, + 0,909,903,1,0,0,0,909,905,1,0,0,0,909,906,1,0,0,0,909,907,1,0,0, + 0,909,908,1,0,0,0,910,101,1,0,0,0,911,912,5,2,0,0,912,916,5,129, + 0,0,913,915,3,104,52,0,914,913,1,0,0,0,915,918,1,0,0,0,916,914,1, + 0,0,0,916,917,1,0,0,0,917,919,1,0,0,0,918,916,1,0,0,0,919,920,5, + 130,0,0,920,921,5,126,0,0,921,103,1,0,0,0,922,923,3,146,73,0,923, + 924,5,52,0,0,924,925,5,55,0,0,925,926,3,146,73,0,926,927,5,126,0, + 0,927,937,1,0,0,0,928,929,3,146,73,0,929,930,5,52,0,0,930,931,5, + 56,0,0,931,932,3,146,73,0,932,933,5,128,0,0,933,934,3,146,73,0,934, + 935,5,126,0,0,935,937,1,0,0,0,936,922,1,0,0,0,936,928,1,0,0,0,937, + 105,1,0,0,0,938,939,3,26,13,0,939,940,5,12,0,0,940,945,5,47,0,0, + 941,942,5,128,0,0,942,944,3,146,73,0,943,941,1,0,0,0,944,947,1,0, + 0,0,945,943,1,0,0,0,945,946,1,0,0,0,946,948,1,0,0,0,947,945,1,0, + 0,0,948,949,5,126,0,0,949,107,1,0,0,0,950,951,5,50,0,0,951,952,3, + 146,73,0,952,953,5,52,0,0,953,954,5,55,0,0,954,955,3,146,73,0,955, + 956,5,126,0,0,956,109,1,0,0,0,957,958,5,61,0,0,958,959,3,146,73, + 0,959,960,5,62,0,0,960,961,5,63,0,0,961,962,5,59,0,0,962,963,5,45, + 0,0,963,964,3,146,73,0,964,965,5,60,0,0,965,966,5,56,0,0,966,967, + 3,146,73,0,967,968,5,128,0,0,968,969,3,146,73,0,969,970,5,126,0, + 0,970,111,1,0,0,0,971,972,5,50,0,0,972,973,3,114,57,0,973,974,5, + 52,0,0,974,977,3,118,59,0,975,976,5,28,0,0,976,978,3,148,74,0,977, + 975,1,0,0,0,977,978,1,0,0,0,978,979,1,0,0,0,979,980,5,126,0,0,980, + 113,1,0,0,0,981,982,3,146,73,0,982,983,5,128,0,0,983,984,3,116,58, + 0,984,115,1,0,0,0,985,997,3,146,73,0,986,997,5,93,0,0,987,997,5, + 83,0,0,988,997,5,84,0,0,989,997,5,90,0,0,990,997,5,91,0,0,991,997, + 5,92,0,0,992,997,5,94,0,0,993,997,5,95,0,0,994,997,5,96,0,0,995, + 997,5,97,0,0,996,985,1,0,0,0,996,986,1,0,0,0,996,987,1,0,0,0,996, + 988,1,0,0,0,996,989,1,0,0,0,996,990,1,0,0,0,996,991,1,0,0,0,996, + 992,1,0,0,0,996,993,1,0,0,0,996,994,1,0,0,0,996,995,1,0,0,0,997, + 117,1,0,0,0,998,999,5,55,0,0,999,1000,3,146,73,0,1000,1001,5,128, + 0,0,1001,1002,3,120,60,0,1002,1029,1,0,0,0,1003,1004,5,56,0,0,1004, + 1005,3,146,73,0,1005,1006,5,128,0,0,1006,1007,3,146,73,0,1007,1008, + 5,128,0,0,1008,1009,3,122,61,0,1009,1029,1,0,0,0,1010,1011,5,38, + 0,0,1011,1013,3,146,73,0,1012,1014,3,28,14,0,1013,1012,1,0,0,0,1013, + 1014,1,0,0,0,1014,1015,1,0,0,0,1015,1016,5,128,0,0,1016,1017,3,114, + 57,0,1017,1029,1,0,0,0,1018,1019,5,40,0,0,1019,1020,3,146,73,0,1020, + 1021,5,128,0,0,1021,1023,3,146,73,0,1022,1024,3,28,14,0,1023,1022, + 1,0,0,0,1023,1024,1,0,0,0,1024,1026,1,0,0,0,1025,1027,3,124,62,0, + 1026,1025,1,0,0,0,1026,1027,1,0,0,0,1027,1029,1,0,0,0,1028,998,1, + 0,0,0,1028,1003,1,0,0,0,1028,1010,1,0,0,0,1028,1018,1,0,0,0,1029, + 119,1,0,0,0,1030,1031,7,4,0,0,1031,121,1,0,0,0,1032,1033,7,5,0,0, + 1033,123,1,0,0,0,1034,1035,5,58,0,0,1035,1039,5,129,0,0,1036,1038, + 3,126,63,0,1037,1036,1,0,0,0,1038,1041,1,0,0,0,1039,1037,1,0,0,0, + 1039,1040,1,0,0,0,1040,1042,1,0,0,0,1041,1039,1,0,0,0,1042,1043, + 5,130,0,0,1043,125,1,0,0,0,1044,1045,3,146,73,0,1045,1046,5,52,0, + 0,1046,1047,5,3,0,0,1047,1048,5,17,0,0,1048,1049,5,131,0,0,1049, + 1050,3,76,38,0,1050,1051,5,132,0,0,1051,1052,5,126,0,0,1052,1141, + 1,0,0,0,1053,1054,3,146,73,0,1054,1055,5,52,0,0,1055,1056,5,55,0, + 0,1056,1063,3,146,73,0,1057,1058,5,60,0,0,1058,1059,5,56,0,0,1059, + 1060,3,146,73,0,1060,1061,5,128,0,0,1061,1062,3,146,73,0,1062,1064, + 1,0,0,0,1063,1057,1,0,0,0,1063,1064,1,0,0,0,1064,1065,1,0,0,0,1065, + 1066,5,126,0,0,1066,1141,1,0,0,0,1067,1068,3,146,73,0,1068,1069, + 5,52,0,0,1069,1070,5,56,0,0,1070,1071,3,146,73,0,1071,1072,5,128, + 0,0,1072,1079,3,146,73,0,1073,1074,5,60,0,0,1074,1075,5,56,0,0,1075, + 1076,3,146,73,0,1076,1077,5,128,0,0,1077,1078,3,146,73,0,1078,1080, + 1,0,0,0,1079,1073,1,0,0,0,1079,1080,1,0,0,0,1080,1081,1,0,0,0,1081, + 1082,5,126,0,0,1082,1141,1,0,0,0,1083,1084,3,146,73,0,1084,1085, + 5,52,0,0,1085,1086,5,38,0,0,1086,1088,3,146,73,0,1087,1089,3,28, + 14,0,1088,1087,1,0,0,0,1088,1089,1,0,0,0,1089,1096,1,0,0,0,1090, + 1091,5,60,0,0,1091,1092,5,56,0,0,1092,1093,3,146,73,0,1093,1094, + 5,128,0,0,1094,1095,3,146,73,0,1095,1097,1,0,0,0,1096,1090,1,0,0, + 0,1096,1097,1,0,0,0,1097,1098,1,0,0,0,1098,1099,5,126,0,0,1099,1141, + 1,0,0,0,1100,1101,3,146,73,0,1101,1102,5,52,0,0,1102,1103,5,1,0, + 0,1103,1104,3,146,73,0,1104,1105,5,58,0,0,1105,1109,5,129,0,0,1106, + 1108,3,106,53,0,1107,1106,1,0,0,0,1108,1111,1,0,0,0,1109,1107,1, + 0,0,0,1109,1110,1,0,0,0,1110,1112,1,0,0,0,1111,1109,1,0,0,0,1112, + 1113,5,130,0,0,1113,1114,5,126,0,0,1114,1141,1,0,0,0,1115,1116,3, + 146,73,0,1116,1117,5,52,0,0,1117,1118,5,45,0,0,1118,1119,3,146,73, + 0,1119,1120,5,126,0,0,1120,1141,1,0,0,0,1121,1122,3,146,73,0,1122, + 1124,5,52,0,0,1123,1125,5,3,0,0,1124,1123,1,0,0,0,1124,1125,1,0, + 0,0,1125,1126,1,0,0,0,1126,1127,5,16,0,0,1127,1128,3,146,73,0,1128, + 1129,5,128,0,0,1129,1136,3,146,73,0,1130,1131,5,60,0,0,1131,1132, + 5,56,0,0,1132,1133,3,146,73,0,1133,1134,5,128,0,0,1134,1135,3,146, + 73,0,1135,1137,1,0,0,0,1136,1130,1,0,0,0,1136,1137,1,0,0,0,1137, + 1138,1,0,0,0,1138,1139,5,126,0,0,1139,1141,1,0,0,0,1140,1044,1,0, + 0,0,1140,1053,1,0,0,0,1140,1067,1,0,0,0,1140,1083,1,0,0,0,1140,1100, + 1,0,0,0,1140,1115,1,0,0,0,1140,1121,1,0,0,0,1141,127,1,0,0,0,1142, + 1143,5,45,0,0,1143,1144,3,146,73,0,1144,1145,5,52,0,0,1145,1146, + 3,146,73,0,1146,1147,5,128,0,0,1147,1149,3,146,73,0,1148,1150,3, + 124,62,0,1149,1148,1,0,0,0,1149,1150,1,0,0,0,1150,1151,1,0,0,0,1151, + 1152,5,126,0,0,1152,129,1,0,0,0,1153,1200,3,134,67,0,1154,1200,5, + 105,0,0,1155,1200,5,106,0,0,1156,1157,5,107,0,0,1157,1200,3,148, + 74,0,1158,1159,5,108,0,0,1159,1160,5,135,0,0,1160,1161,3,146,73, + 0,1161,1162,5,136,0,0,1162,1200,1,0,0,0,1163,1164,5,109,0,0,1164, + 1165,5,135,0,0,1165,1167,3,146,73,0,1166,1168,3,28,14,0,1167,1166, + 1,0,0,0,1167,1168,1,0,0,0,1168,1169,1,0,0,0,1169,1170,5,136,0,0, + 1170,1200,1,0,0,0,1171,1172,5,33,0,0,1172,1173,5,135,0,0,1173,1174, + 3,146,73,0,1174,1175,5,136,0,0,1175,1200,1,0,0,0,1176,1177,5,110, + 0,0,1177,1178,5,135,0,0,1178,1179,3,130,65,0,1179,1180,5,136,0,0, + 1180,1200,1,0,0,0,1181,1182,5,111,0,0,1182,1183,5,135,0,0,1183,1184, + 3,130,65,0,1184,1185,5,136,0,0,1185,1200,1,0,0,0,1186,1187,5,112, + 0,0,1187,1191,5,129,0,0,1188,1190,3,132,66,0,1189,1188,1,0,0,0,1190, + 1193,1,0,0,0,1191,1189,1,0,0,0,1191,1192,1,0,0,0,1192,1194,1,0,0, + 0,1193,1191,1,0,0,0,1194,1200,5,130,0,0,1195,1197,3,146,73,0,1196, + 1198,3,28,14,0,1197,1196,1,0,0,0,1197,1198,1,0,0,0,1198,1200,1,0, + 0,0,1199,1153,1,0,0,0,1199,1154,1,0,0,0,1199,1155,1,0,0,0,1199,1156, + 1,0,0,0,1199,1158,1,0,0,0,1199,1163,1,0,0,0,1199,1171,1,0,0,0,1199, + 1176,1,0,0,0,1199,1181,1,0,0,0,1199,1186,1,0,0,0,1199,1195,1,0,0, + 0,1200,131,1,0,0,0,1201,1202,3,146,73,0,1202,1203,5,125,0,0,1203, + 1204,3,130,65,0,1204,1205,5,126,0,0,1205,133,1,0,0,0,1206,1207,7, + 6,0,0,1207,135,1,0,0,0,1208,1209,7,7,0,0,1209,137,1,0,0,0,1210,1219, + 3,148,74,0,1211,1219,5,139,0,0,1212,1219,5,140,0,0,1213,1219,5,121, + 0,0,1214,1219,5,122,0,0,1215,1219,5,123,0,0,1216,1219,3,140,70,0, + 1217,1219,3,144,72,0,1218,1210,1,0,0,0,1218,1211,1,0,0,0,1218,1212, + 1,0,0,0,1218,1213,1,0,0,0,1218,1214,1,0,0,0,1218,1215,1,0,0,0,1218, + 1216,1,0,0,0,1218,1217,1,0,0,0,1219,139,1,0,0,0,1220,1229,5,129, + 0,0,1221,1226,3,142,71,0,1222,1223,5,127,0,0,1223,1225,3,142,71, + 0,1224,1222,1,0,0,0,1225,1228,1,0,0,0,1226,1224,1,0,0,0,1226,1227, + 1,0,0,0,1227,1230,1,0,0,0,1228,1226,1,0,0,0,1229,1221,1,0,0,0,1229, + 1230,1,0,0,0,1230,1231,1,0,0,0,1231,1232,5,130,0,0,1232,141,1,0, + 0,0,1233,1234,3,148,74,0,1234,1235,5,125,0,0,1235,1236,3,138,69, + 0,1236,143,1,0,0,0,1237,1246,5,131,0,0,1238,1243,3,138,69,0,1239, + 1240,5,127,0,0,1240,1242,3,138,69,0,1241,1239,1,0,0,0,1242,1245, + 1,0,0,0,1243,1241,1,0,0,0,1243,1244,1,0,0,0,1244,1247,1,0,0,0,1245, + 1243,1,0,0,0,1246,1238,1,0,0,0,1246,1247,1,0,0,0,1247,1248,1,0,0, + 0,1248,1249,5,132,0,0,1249,145,1,0,0,0,1250,1251,7,8,0,0,1251,147, + 1,0,0,0,1252,1253,5,142,0,0,1253,149,1,0,0,0,110,162,169,190,202, + 214,234,242,249,255,267,270,276,287,296,306,309,311,315,323,335, + 340,349,352,367,373,385,394,402,415,418,428,432,438,445,451,459, + 467,480,487,491,496,507,513,523,528,534,545,572,599,604,615,618, + 623,630,639,642,655,664,678,699,702,705,712,720,760,763,785,799, + 807,819,833,843,861,865,868,872,875,884,888,892,898,909,916,936, + 945,977,996,1013,1023,1026,1028,1039,1063,1079,1088,1096,1109,1124, + 1136,1140,1149,1167,1191,1197,1199,1218,1226,1229,1243,1246 ]; private static __ATN: antlr.ATN; @@ -7031,12 +7278,15 @@ export class DependencyPortContext extends antlr.ParserRuleContext { public selectedOperations(): SelectedOperationsContext | null { return this.getRuleContext(0, SelectedOperationsContext); } - public CONSTRUCTOR(): antlr.TerminalNode | null { - return this.getToken(QuixosCapabilityParser.CONSTRUCTOR, 0); + public CREATION(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.CREATION, 0); } public INPUT(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.INPUT, 0); } + public CONSTRUCTOR(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.CONSTRUCTOR, 0); + } public QUERY(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.QUERY, 0); } @@ -7244,8 +7494,8 @@ export class StoragePolicyContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); } - public OPTIMISTIC_REGISTER(): antlr.TerminalNode | null { - return this.getToken(QuixosCapabilityParser.OPTIMISTIC_REGISTER, 0); + public REGISTER(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.REGISTER, 0); } public CRDT(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.CRDT, 0); @@ -7453,6 +7703,9 @@ export class ConformanceItemContext extends antlr.ParserRuleContext { public stateFieldBindingDecl(): StateFieldBindingDeclContext | null { return this.getRuleContext(0, StateFieldBindingDeclContext); } + public initializationDecl(): InitializationDeclContext | null { + return this.getRuleContext(0, InitializationDeclContext); + } public relationshipMaterializationDecl(): RelationshipMaterializationDeclContext | null { return this.getRuleContext(0, RelationshipMaterializationDeclContext); } @@ -7469,6 +7722,132 @@ export class ConformanceItemContext extends antlr.ParserRuleContext { } +export class InitializationDeclContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public INITIALIZE(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.INITIALIZE, 0)!; + } + public LBRACE(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.LBRACE, 0)!; + } + public RBRACE(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.RBRACE, 0)!; + } + public SEMI(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.SEMI, 0)!; + } + public initializationField(): InitializationFieldContext[]; + public initializationField(i: number): InitializationFieldContext | null; + public initializationField(i?: number): InitializationFieldContext[] | InitializationFieldContext | null { + if (i === undefined) { + return this.getRuleContexts(InitializationFieldContext); + } + + return this.getRuleContext(i, InitializationFieldContext); + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_initializationDecl; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitInitializationDecl) { + return visitor.visitInitializationDecl(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class InitializationFieldContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public identifier(): IdentifierContext[]; + public identifier(i: number): IdentifierContext | null; + public identifier(i?: number): IdentifierContext[] | IdentifierContext | null { + if (i === undefined) { + return this.getRuleContexts(IdentifierContext); + } + + return this.getRuleContext(i, IdentifierContext); + } + public TO(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.TO, 0)!; + } + public STATE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.STATE, 0); + } + public SEMI(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.SEMI, 0)!; + } + public EDGE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.EDGE, 0); + } + public DOT(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.DOT, 0); + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_initializationField; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitInitializationField) { + return visitor.visitInitializationField(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class CreationOwnerMappingContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public interfaceType(): InterfaceTypeContext { + return this.getRuleContext(0, InterfaceTypeContext)!; + } + public FROM(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.FROM, 0)!; + } + public INPUT(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.INPUT, 0)!; + } + public SEMI(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.SEMI, 0)!; + } + public DOT(): antlr.TerminalNode[]; + public DOT(i: number): antlr.TerminalNode | null; + public DOT(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(QuixosCapabilityParser.DOT); + } else { + return this.getToken(QuixosCapabilityParser.DOT, i); + } + } + public identifier(): IdentifierContext[]; + public identifier(i: number): IdentifierContext | null; + public identifier(i?: number): IdentifierContext[] | IdentifierContext | null { + if (i === undefined) { + return this.getRuleContexts(IdentifierContext); + } + + return this.getRuleContext(i, IdentifierContext); + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_creationOwnerMapping; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitCreationOwnerMapping) { + return visitor.visitCreationOwnerMapping(this); + } else { + return visitor.visitChildren(this); + } + } +} + + export class StateFieldBindingDeclContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); @@ -7896,6 +8275,27 @@ export class DependencyBindingContext extends antlr.ParserRuleContext { public typeArguments(): TypeArgumentsContext | null { return this.getRuleContext(0, TypeArgumentsContext); } + public CREATION(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.CREATION, 0); + } + public WITH(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.WITH, 0); + } + public LBRACE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.LBRACE, 0); + } + public RBRACE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.RBRACE, 0); + } + public creationOwnerMapping(): CreationOwnerMappingContext[]; + public creationOwnerMapping(i: number): CreationOwnerMappingContext | null; + public creationOwnerMapping(i?: number): CreationOwnerMappingContext[] | CreationOwnerMappingContext | null { + if (i === undefined) { + return this.getRuleContexts(CreationOwnerMappingContext); + } + + return this.getRuleContext(i, CreationOwnerMappingContext); + } public CONSTRUCTOR(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.CONSTRUCTOR, 0); } diff --git a/src/capability-language/generated/QuixosCapabilityVisitor.ts b/src/capability-language/generated/QuixosCapabilityVisitor.ts index 3c2cd20..2167dc5 100644 --- a/src/capability-language/generated/QuixosCapabilityVisitor.ts +++ b/src/capability-language/generated/QuixosCapabilityVisitor.ts @@ -53,6 +53,9 @@ import { EdgeDeclContext } from "./QuixosCapabilityParser.js"; import { EdgeEndpointContext } from "./QuixosCapabilityParser.js"; import { ConformanceDeclContext } from "./QuixosCapabilityParser.js"; import { ConformanceItemContext } from "./QuixosCapabilityParser.js"; +import { InitializationDeclContext } from "./QuixosCapabilityParser.js"; +import { InitializationFieldContext } from "./QuixosCapabilityParser.js"; +import { CreationOwnerMappingContext } from "./QuixosCapabilityParser.js"; import { StateFieldBindingDeclContext } from "./QuixosCapabilityParser.js"; import { RelationshipMaterializationDeclContext } from "./QuixosCapabilityParser.js"; import { OperationBindingDeclContext } from "./QuixosCapabilityParser.js"; @@ -390,6 +393,24 @@ export class QuixosCapabilityVisitor extends AbstractParseTreeVisitor Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.initializationDecl`. + * @param ctx the parse tree + * @return the visitor result + */ + visitInitializationDecl?: (ctx: InitializationDeclContext) => Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.initializationField`. + * @param ctx the parse tree + * @return the visitor result + */ + visitInitializationField?: (ctx: InitializationFieldContext) => Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.creationOwnerMapping`. + * @param ctx the parse tree + * @return the visitor result + */ + visitCreationOwnerMapping?: (ctx: CreationOwnerMappingContext) => Result; /** * Visit a parse tree produced by `QuixosCapabilityParser.stateFieldBindingDecl`. * @param ctx the parse tree diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index f4943ed..cf7d1ed 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -1009,6 +1009,14 @@ const lowerDependencyPort = (state: LoweringState, context: DependencyPortContex : undefined; } const atomId = requireSymbol(state, state.atoms, targetName, context, "atom"); + if (context.CREATION()) + return atomId + ? { + id, + displayName: name, + requirement: { kind: "creation", atomId, inputType: lowerValueType(state, context.valueType()) }, + } + : undefined; return atomId ? { id, @@ -1229,7 +1237,11 @@ const lowerGenericPackageExport = ( throw new GenericTypeError("missing-constructor-input", id, "Constructor ports require an explicit input type"); return { ...base, - requirement: { kind: "constructor", target, inputType: state.types.expression(port.valueType()!) }, + requirement: { + kind: port.CREATION() ? "creation" : "constructor", + target, + inputType: state.types.expression(port.valueType()!), + }, }; }); const operation = "receiverRequirement" in context ? context : undefined; @@ -1567,8 +1579,8 @@ const lowerState = (state: LoweringState, context: StateDeclContext): StateSlotD attachedTo: atomId, displayName: identifier(context.identifier(0)), valueType: lowerValueType(state, context.valueType()), - storagePolicy: policy.OPTIMISTIC_REGISTER() - ? { kind: "optimistic-register" } + storagePolicy: policy.REGISTER() + ? { kind: "register" } : { kind: "crdt-document", updateType: lowerValueType(state, policy.valueType()), @@ -1774,6 +1786,24 @@ const lowerBoundDependencies = ( } const atomName = identifier(entry.identifier(1)); const atomId = requireSymbol(state, state.atoms, atomName, entry, "atom"); + if (entry.CREATION()) + return atomId + ? [ + { + portId, + binding: { + kind: "creation", + atomId, + owners: entry.creationOwnerMapping().map((owner) => ({ + interfaceRevisionId: new TypeSubstitution(state.types.environment()).application( + state.types.interface(owner.interfaceType()), + ), + inputPath: owner.identifier().map(identifier), + })), + }, + }, + ] + : []; return atomId ? [{ portId, binding: { kind: "constructor", atomId } }] : []; }); }; @@ -2025,8 +2055,43 @@ const lowerConformance = ( const lowered = lowerRelationshipMaterialization(state, interfaceName, materialization); return lowered ? [lowered] : []; }); + const initializers = context + .conformanceItem() + .flatMap((item) => (item.initializationDecl() ? [item.initializationDecl()!] : [])); + if (initializers.length > 1) + loweringIssue(state, context, "duplicate-initialization", "Declare one initialization mapping per owner"); + const initialization = initializers.flatMap((initializer) => + initializer.initializationField().flatMap((field): import("../capability-model/types.js").InitializationField[] => { + const input = identifier(field.identifier(0)); + const attachment = requireSymbol( + state, + state.attachments, + identifier(field.identifier(1)), + field, + "initialization attachment", + ); + if (!attachment) return []; + if (field.STATE() && attachment.attachment.kind === "state") + return [{ input, binding: { kind: "state", slotId: attachment.attachment.id } }]; + if (field.EDGE() && attachment.attachment.kind === "edge") { + const projectionId = requireSymbol( + state, + attachment.projections, + identifier(field.identifier(2)), + field, + "initialization projection", + ); + return projectionId + ? [{ input, binding: { kind: "edge", edgeTypeId: attachment.attachment.id, projectionId } }] + : []; + } + loweringIssue(state, field, "invalid-initialization", "Initialization attachment kind does not match"); + return []; + }), + ); state.interfaces.set(interfaceName, originalSymbol); return { + ...(initializers.length ? { initialization } : {}), atomId, interfaceRevisionId: interfaceSymbol.revisionId, ...(context.stringLiteral() ? { id: capabilityId.conformance(stringValue(context.stringLiteral()!)) } : {}), @@ -2562,7 +2627,7 @@ const compileCapabilityResourceSourceInternal = ( types.push(requirement.valueType); } if (requirement.kind === "edge") types.push({ kind: "object-ref", expectation: requirement.target }); - if (requirement.kind === "constructor") + if (requirement.kind === "constructor" || requirement.kind === "creation") types.push(requirement.inputType, { kind: "object-ref", expectation: requirement.target }); if (requirement.kind === "interface") requires.push(requirement.application); } diff --git a/src/capability-model/evolution.ts b/src/capability-model/evolution.ts index 1dcbb05..6de2aed 100644 --- a/src/capability-model/evolution.ts +++ b/src/capability-model/evolution.ts @@ -149,6 +149,10 @@ export const runtimeContracts = (workspace: WorkspaceRevision): RuntimeContract[ } if (binding.kind === "state") parent.dependencies.add(`attachment:${binding.slotId}`); if (binding.kind === "edge") parent.dependencies.add(`attachment:${binding.edgeTypeId}`); + if (binding.kind === "creation") { + for (const owner of binding.owners) + parent.dependencies.add(conformanceKey(binding.atomId, owner.interfaceRevisionId)); + } if (binding.kind === "constructor") { parent.dependencies.add(`constructor:${binding.atomId}`); const ctor = workspace.constructors.find((entry) => entry.atomId === binding.atomId); @@ -210,6 +214,9 @@ export const runtimeContracts = (workspace: WorkspaceRevision): RuntimeContract[ atomId: conformance.atomId, interfaceRevisionId: conformance.interfaceRevisionId, operations: sorted(conformance.operationBindings, (entry) => entry.operationId), + ...(conformance.initialization + ? { initialization: sorted(conformance.initialization, (entry) => entry.input) } + : {}), materializations: sorted(conformance.relationshipMaterializations, (entry) => entry.memberId), }); parent.dependencies.add(`interface:${conformance.interfaceRevisionId}`); diff --git a/src/capability-model/execution.ts b/src/capability-model/execution.ts index 6434688..563db18 100644 --- a/src/capability-model/execution.ts +++ b/src/capability-model/execution.ts @@ -89,6 +89,8 @@ export function validateExecutionContracts(workspace: WorkspaceRevision): Capabi const query = packages.get(requirement.packageRevisionId)?.queries?.find((q) => q.id === requirement.queryId); if (query?.placement?.kind !== "local") fail(portPath, "Portable operations require a local query dependency"); + } else if (requirement.kind === "creation") { + if (entry.execution.kind !== "transaction") fail(portPath, "Object creation requires transaction execution"); } else if (requirement.kind !== "interface") fail(portPath, `Portable execution does not support ${requirement.kind} dependencies`); } diff --git a/src/capability-model/generic-packages.ts b/src/capability-model/generic-packages.ts index bf76e71..6151772 100644 --- a/src/capability-model/generic-packages.ts +++ b/src/capability-model/generic-packages.ts @@ -39,6 +39,7 @@ export type GenericDependencyPort = Omit & { application: InterfaceApplicationExpression; operations?: import("./types.js").OperationId[]; } + | { kind: "creation"; target: ObjectTypeExpression; inputType: ValueTypeExpression } | { kind: "constructor"; target: ObjectTypeExpression; inputType: ValueTypeExpression }; }; @@ -101,6 +102,7 @@ export const specializePackageExport = ( ...(requirement.operations ? { operations: requirement.operations } : {}), }, }; + case "creation": case "constructor": { const target = substitution.object(requirement.target); if (target.kind !== "atom") @@ -112,7 +114,7 @@ export const specializePackageExport = ( return { ...port, requirement: { - kind: "constructor", + kind: requirement.kind, atomId: target.atomId, inputType: substitution.value(requirement.inputType), }, diff --git a/src/capability-model/initialization.ts b/src/capability-model/initialization.ts new file mode 100644 index 0000000..65204a9 --- /dev/null +++ b/src/capability-model/initialization.ts @@ -0,0 +1,121 @@ +import type { + BoundDependency, + Conformance, + DependencyPort, + InitializationField, + ValueType, + WorkspaceRevision, +} from "./types.js"; +import type { CapabilityValidationIssue } from "./validation.js"; +import { cardinalityValueType, valueTypesEqual } from "./validation.js"; + +/** Creation grants seed inputs on new objects, never general private-state authority. */ +export function validateInitialization(workspace: WorkspaceRevision): CapabilityValidationIssue[] { + const issues: CapabilityValidationIssue[] = []; + const fail = (path: string, message: string) => issues.push({ code: "invalid-initialization", path, message }); + const ownerKey = (owner: Conformance) => `${owner.atomId}/${owner.interfaceRevisionId}`; + const shapes = new Map(); + const fieldType = (owner: Conformance, field: InitializationField): ValueType | undefined => { + const binding = field.binding; + const attachment = owner.privateAttachments.find( + (a) => a.kind === binding.kind && a.id === (binding.kind === "state" ? binding.slotId : binding.edgeTypeId), + ); + if (!attachment) { + fail(ownerKey(owner), `Initialization input ${field.input} must name an attachment owned by this conformance`); + return; + } + if (attachment.kind === "state") return attachment.valueType; + if (binding.kind !== "edge") return; + const index = attachment.endpoints.findIndex((e) => e.projectionId === binding.projectionId); + const endpoint = attachment.endpoints[index]; + const target = attachment.endpoints[1 - index]; + if (!endpoint || !target || endpoint.constraint.kind !== "atom" || endpoint.constraint.atomId !== owner.atomId) { + fail(ownerKey(owner), `Initialization input ${field.input} must name an edge projection on the newborn atom`); + return; + } + if (endpoint.cardinality === "many" || endpoint.cardinality === "many-unique") { + const fields: Record = { + key: { kind: "scalar", name: "string" }, + target: cardinalityValueType(target.constraint, "exactly-one"), + }; + if (endpoint.keyType) + fields.mapKey = { kind: "scalar", name: endpoint.keyType === "boolean" ? "bool" : endpoint.keyType }; + return { kind: "list", value: { kind: "record", fields } }; + } + return cardinalityValueType(target.constraint, endpoint.cardinality); + }; + for (const owner of workspace.conformances) { + if (!owner.initialization) continue; + const fields: Record = Object.create(null); + const destinations = new Set(); + for (const field of owner.initialization) { + const path = `${ownerKey(owner)}/${field.input}`; + if (!field.input || Object.hasOwn(fields, field.input)) + fail(path, "Initialization input names must be nonempty and distinct"); + const destination = JSON.stringify(field.binding); + if (destinations.has(destination)) fail(path, "An attachment may have only one initialization input"); + destinations.add(destination); + const type = fieldType(owner, field); + if (type) fields[field.input] = type; + } + shapes.set(ownerKey(owner), { kind: "record", fields }); + } + const checkBindings = (ports: DependencyPort[], dependencies: BoundDependency[], path: string) => { + for (const dependency of dependencies) { + if (dependency.binding.kind !== "creation") continue; + const binding = dependency.binding; + const requirement = ports.find((p) => p.id === dependency.portId)?.requirement; + if (requirement?.kind !== "creation") continue; // General binding validation reports the kind mismatch. + const portPath = `${path}/${dependency.portId}`; + if (binding.atomId !== requirement.atomId) fail(portPath, `Creation port requires atom ${requirement.atomId}`); + const initialized = new Set(); + const supplied = new Set(); + for (const mapping of binding.owners) { + const key = `${binding.atomId}/${mapping.interfaceRevisionId}`; + if (supplied.has(key)) fail(portPath, `Duplicate initialization owner ${key}`); + supplied.add(key); + const owner = workspace.conformances.find((o) => ownerKey(o) === key); + const shape = shapes.get(key); + if (!owner || !shape) { + fail(portPath, `Owner ${key} has no declared initialization mapping`); + continue; + } + let seed: ValueType | undefined = requirement.inputType; + for (const component of mapping.inputPath) seed = seed?.kind === "record" ? seed.fields[component] : undefined; + if (!seed || !valueTypesEqual(seed, shape)) + fail( + portPath, + `Seed input${mapping.inputPath.map((p) => `.${p}`).join("")} does not match initialization inputs of ${key}`, + ); + for (const field of owner.initialization!) + if (field.binding.kind === "state") initialized.add(field.binding.slotId); + } + const states = [ + ...workspace.sharedAttachments, + ...workspace.conformances.flatMap((o) => o.privateAttachments), + ].filter((a) => a.kind === "state" && a.attachedTo === binding.atomId); + for (const state of states) + if (state.kind === "state" && state.defaultValue === undefined && !initialized.has(state.id)) + fail(portPath, `Required state ${state.id} has no default or declared seed mapping`); + } + }; + const exports = new Map( + workspace.packageImports.flatMap((p) => p.exports.map((e) => [`${p.revisionId}/${e.id}`, e] as const)), + ); + for (const owner of workspace.conformances) + for (const operation of owner.operationBindings) { + if (operation.binding.kind !== "package") continue; + const entry = exports.get(`${operation.binding.packageRevisionId}/${operation.binding.exportId}`); + if (entry) + checkBindings( + entry.dependencyPorts, + operation.binding.dependencies, + `${ownerKey(owner)}/${operation.operationId}`, + ); + } + for (const constructor of workspace.constructors) { + const entry = exports.get(`${constructor.packageRevisionId}/${constructor.exportId}`); + if (entry) checkBindings(entry.dependencyPorts, constructor.dependencies, `constructor/${constructor.atomId}`); + } + return issues; +} diff --git a/src/capability-model/types.ts b/src/capability-model/types.ts index 4818713..c231f5d 100644 --- a/src/capability-model/types.ts +++ b/src/capability-model/types.ts @@ -181,7 +181,7 @@ export interface InterfaceRevision { argumentRequirements?: { target: ObjectExpectation; required: InterfaceRevisionId }[]; } -export type StoragePolicy = { kind: "optimistic-register" } | { kind: "crdt-document"; updateType: ValueType }; +export type StoragePolicy = { kind: "register" } | { kind: "crdt-document"; updateType: ValueType }; export interface StateSlotDefinition { kind: "state"; @@ -246,6 +246,7 @@ export type DependencyPortRequirement = /** Exact public operation identities, not implementation export names. */ operations?: OperationId[]; } + | { kind: "creation"; atomId: AtomId; inputType: ValueType } | { kind: "constructor"; atomId: AtomId; inputType?: ValueType }; export interface DependencyPort { @@ -320,6 +321,12 @@ export type DependencyBinding = interfaceRevisionId: InterfaceRevisionId; via?: EdgeTraversal; } + | { + kind: "creation"; + atomId: AtomId; + owners: { interfaceRevisionId: InterfaceRevisionId; inputPath: string[] }[]; + via?: never; + } | { kind: "constructor"; atomId: AtomId }; export interface BoundDependency { @@ -376,7 +383,13 @@ export interface OperationBinding { queryReason?: string; } +export interface InitializationField { + input: string; + binding: { kind: "state"; slotId: SlotId } | { kind: "edge"; edgeTypeId: EdgeTypeId; projectionId: EdgeProjectionId }; +} + export interface Conformance { + initialization?: InitializationField[]; /** Absent only for legacy assemblies awaiting explicit ownership enrollment. */ id?: ConformanceId; semanticMajor?: number; diff --git a/src/capability-model/validation.ts b/src/capability-model/validation.ts index a7f9fe6..4ea62af 100644 --- a/src/capability-model/validation.ts +++ b/src/capability-model/validation.ts @@ -1,3 +1,4 @@ +import { validateInitialization } from "./initialization.js"; import { validateExecutionContracts } from "./execution.js"; import { resolveForwardedBinding, type ConcreteBinding } from "./forwarding.js"; import type { @@ -42,6 +43,7 @@ import { specializePackageExport } from "./generic-packages.js"; import { isDeepStrictEqual } from "node:util"; export type CapabilityValidationIssueCode = + | "invalid-initialization" | "invalid-execution-contract" | "invalid-query-contract" | "query-provider-reason-required" @@ -1043,6 +1045,7 @@ const validatePackages = ( ); } break; + case "creation": case "constructor": if (port.requirement.inputType) validateValueType(issues, port.requirement.inputType, `${portPath}.requirement.inputType`, indexes); @@ -1794,14 +1797,14 @@ const validateConformances = ( }); if ( operation.scope === "class" && - (binding.dependencies.some((entry) => entry.binding.kind !== "constructor") || - packageExport.dependencyPorts.some((entry) => entry.requirement.kind !== "constructor")) + (binding.dependencies.some((entry) => !["constructor", "creation"].includes(entry.binding.kind)) || + packageExport.dependencyPorts.some((entry) => !["constructor", "creation"].includes(entry.requirement.kind))) ) { issue( issues, "invalid-package-binding", bindingPath, - "Class functions may inject constructors, not instance-dependent ports", + "Class functions require receiverless dependencies such as creation ports", ); } validateBoundDependencies(issues, { @@ -2084,7 +2087,7 @@ export const validateWorkspaceRevision = (workspace: WorkspaceRevision): Capabil validatePackages(workspace, issues, indexes); validateConformances(workspace, issues, indexes); validateConstructors(workspace, issues, indexes); - issues.push(...validateExecutionContracts(workspace)); + issues.push(...validateExecutionContracts(workspace), ...validateInitialization(workspace)); return issues; }; @@ -2327,6 +2330,11 @@ export const computeCapabilityClosure = ( } break; } + case "creation": { + for (const owner of dependency.binding.owners) + queued.push({ atomId: dependency.binding.atomId, interfaceRevisionId: owner.interfaceRevisionId }); + break; + } case "constructor": { constructors.add(dependency.binding.atomId); const constructor = plan.constructors.get(dependency.binding.atomId); diff --git a/test/capability-language.test.ts b/test/capability-language.test.ts index 826cad3..593097b 100644 --- a/test/capability-language.test.ts +++ b/test/capability-language.test.ts @@ -148,10 +148,10 @@ test("interfaces can declare ordinary call operations", () => { test("state defaults accept recursive JSON values", () => { const source = capabilityFixtureSource.replace( - /policy optimistic-register default "Untitled project";/, - ` policy optimistic-register default "Untitled project"; + /policy register default "Untitled project";/, + ` policy register default "Untitled project"; shared state ProjectMetadata id "slot:project:metadata" on Project : message "example.Metadata" - policy optimistic-register default {"labels":["compiler","runtime"],"score":1.5,"enabled":true,"extra":null};`, + policy register default {"labels":["compiler","runtime"],"score":1.5,"enabled":true,"extra":null};`, ); const result = compileCapabilityFixture({ workspace: source }); assert.equal(result.ok, true); diff --git a/test/creation-contracts.test.ts b/test/creation-contracts.test.ts new file mode 100644 index 0000000..88f07de --- /dev/null +++ b/test/creation-contracts.test.ts @@ -0,0 +1,197 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { + compileCapabilityResourceSource, + compileCapabilitySource, + formatQx, +} from "../src/capability-language/index.js"; +import type { InterfaceRevision } from "../src/capability-model/types.js"; +const source = { repository: "https://example.test/factories.git", commit: "a".repeat(40) }; +const seed = "record { data: record { title: string; }; tags: record { tags: list; }; }"; +const iface = (text: string): InterfaceRevision => { + const result = compileCapabilityResourceSource(text, { source }); + assert.ok(result.ok && result.resource.kind === "interface", JSON.stringify(result.diagnostics)); + return result.resource.revision; +}; +const data = iface(`interface Data id "data" revision "data@1" { + value title id "title" : string { get id "title:get" execution snapshot targets [browser, server]; } +}`); +const tagged = iface(`interface Tagged id "tagged" revision "tagged@1" { + value tags id "tags" : list { get id "tags:get" execution snapshot targets [browser, server]; } +}`); +const factory = iface(`external atom Note id "note"; +interface Factory id "factory" revision "factory@1" { + static operation create id "create" : ${seed} -> atom-ref { call id "create:call" execution transaction targets [browser, server]; } + static operation importNote id "import" : ${seed} -> atom-ref { call id "import:call" execution transaction targets [browser, server]; } +}`); +const runtime = compileCapabilityResourceSource( + `external atom Note id "note"; +package Runtime id "runtime" revision "runtime@1" { + function createNote id "create-note" : ${seed} -> atom-ref execution transaction targets [browser, server] requires { + creation note id "new-note" : Note input ${seed}; + }; + function importNote id "import-note" : ${seed} -> atom-ref execution transaction targets [browser, server] requires { + creation note id "new-note" : Note input ${seed}; + }; +}`, + { source }, +); +assert.ok(runtime.ok && runtime.resource.kind === "package", JSON.stringify(runtime.diagnostics)); +const packageRevision = runtime.resource.revision; +const text = `workspace Notes id "notes" revision "notes@1" commit "${"a".repeat(40)}" { + import interface Data; import interface Tagged; import interface Factory; import package Runtime; + atom Note id "note"; + conform Note as Data id "owner:data" { + private state Title id "title-state" on Note : string policy register; + initialize { title to state Title; }; + bind title.get to state Title.read; + } + conform Note as Tagged id "owner:tags" { + private state Tags id "tags-state" on Note : list policy register; + initialize { tags to state Tags; }; + bind tags.get to state Tags.read; + } + conform Note as Factory id "owner:factory" { + bind create.call to package Runtime.createNote with { + note to creation Note with { Data from input.data; Tagged from input.tags; }; + }; + bind importNote.call to package Runtime.importNote with { + note to creation Note with { Data from input.data; Tagged from input.tags; }; + }; + } +}`; +const compile = (textOverride = text) => + compileCapabilitySource(formatQx(textOverride), "notes.qx", { + interfaces: new Map([ + ["Data", data], + ["Tagged", tagged], + ["Factory", factory], + ]), + interfaceClosure: [data, tagged, factory], + packages: new Map([["Runtime", packageRevision]]), + packageClosure: [packageRevision], + }); +test("two factories initialize two independent state owners without constructors", () => { + const result = compile(); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + assert.deepEqual(result.workspace.constructors, []); + assert.equal(result.workspace.conformances.filter((c) => c.initialization).length, 2); + const owners = result.workspace.conformances[2]!.operationBindings.map((b) => + b.binding.kind === "package" ? b.binding.dependencies[0]!.binding : undefined, + ); + for (const binding of owners) { + assert.ok(binding?.kind === "creation"); + assert.deepEqual(binding.owners, [ + { interfaceRevisionId: "data@1", inputPath: ["data"] }, + { interfaceRevisionId: "tagged@1", inputPath: ["tags"] }, + ]); + } +}); +test("creation rejects missing seeds, wrong input shapes, and private initialization laundering", () => { + for (const [edit, message] of [ + [text.replaceAll("Tagged from input.tags;", ""), "Required state tags-state"], + [text.replaceAll("Data from input.data;", "Data from input.tags;"), "does not match"], + [text.replace("title to state Title;", "title to state Tags;"), "owned by this conformance"], + [ + text.replaceAll("Data from input.data;", "Data from input.data; Data from input.data;"), + "Duplicate initialization owner", + ], + ]) { + const result = compile(edit!); + assert.equal(result.ok, false); + assert.match(JSON.stringify(result.diagnostics), new RegExp(message!)); + } +}); + +test("defaults supply unmapped state and seeds cannot invoke an undeclared owner", () => { + const withDefault = text + .replace("on Note : list policy register;", "on Note : list policy register default [];") + .replaceAll("Tagged from input.tags;", ""); + const result = compile(withDefault); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const missing = compile(text.replace("initialize { tags to state Tags; };", "")); + assert.equal(missing.ok, false); + assert.match(JSON.stringify(missing.diagnostics), /no declared initialization mapping/); +}); + +test("creation ports cannot be used in snapshot execution", () => { + const result = compileCapabilityResourceSource( + `external atom Note id "note"; + package P id "p" revision "p@1" { + function createNote id "create" : unit -> atom-ref execution snapshot targets [browser, server] requires { + creation note id "note" : Note input record { title:string; }; + }; + }`, + { source }, + ); + assert.equal(result.ok, false); + assert.match(JSON.stringify(result.diagnostics), /creation requires transaction/); +}); + +test("the authored storage policy is register, without an old spelling alias", () => { + const result = compileCapabilitySource(text.replaceAll("policy register", "policy optimistic-register"), "notes.qx"); + assert.equal(result.ok, false); + assert.ok(result.diagnostics.some((d) => d.phase === "syntax")); +}); + +test("initialization contracts participate in executable source identity", async () => { + const { runtimeContracts } = await import("../src/capability-model/index.js"); + const result = compile(); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const before = runtimeContracts(result.workspace); + const changed = structuredClone(result.workspace); + changed.conformances[0]!.initialization![0]!.input = "renamed"; + assert.notDeepEqual(runtimeContracts(changed), before); +}); + +test("to-many initialization requires stable entry keys and typed targets", async () => { + const { validateInitialization } = await import("../src/capability-model/initialization.js"); + const { capabilityId } = await import("../src/capability-model/index.js"); + const result = compile(); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const workspace = result.workspace; + const owner = workspace.conformances[1]!; + const state = owner.privateAttachments[0]!; + assert.equal(state.kind, "state"); + if (state.kind !== "state") return; + state.defaultValue = []; + const edgeId = capabilityId.edgeType("children"), + projectionId = capabilityId.edgeProjection("children:parent"); + owner.privateAttachments.push({ + kind: "edge", + id: edgeId, + displayName: "Children", + endpoints: [ + { + projectionId, + displayName: "children", + constraint: { kind: "atom", atomId: owner.atomId }, + cardinality: "many-unique", + ordered: false, + }, + { + projectionId: capabilityId.edgeProjection("children:child"), + displayName: "parent", + constraint: { kind: "atom", atomId: owner.atomId }, + cardinality: "optional-one", + ordered: false, + }, + ], + }); + owner.initialization = [{ input: "children", binding: { kind: "edge", edgeTypeId: edgeId, projectionId } }]; + const entryType = { + kind: "record" as const, + fields: { + key: { kind: "scalar" as const, name: "string" as const }, + target: { kind: "object-ref" as const, expectation: { kind: "atom" as const, atomId: owner.atomId } }, + }, + }; + for (const entry of workspace.packageImports[0]!.exports) { + const port = entry.dependencyPorts[0]!.requirement; + assert.ok(port.kind === "creation" && port.inputType.kind === "record"); + port.inputType.fields.tags = { kind: "record", fields: { children: { kind: "list", value: entryType } } }; + } + assert.deepEqual(validateInitialization(workspace), []); + Reflect.deleteProperty(entryType.fields, "key"); + assert.ok(validateInitialization(workspace).some((i) => i.message.includes("does not match"))); +}); diff --git a/test/fixtures/query-workspace.ts b/test/fixtures/query-workspace.ts index b8f868f..d2d7071 100644 --- a/test/fixtures/query-workspace.ts +++ b/test/fixtures/query-workspace.ts @@ -98,8 +98,8 @@ export async function queryWorkspaceFixture(options: { live?: boolean } = {}) { ); const implementation = (atom: string) => `conform ${atom} as TaskFacts id "${atom}-facts" { private state Title${atom} id "${atom}:title" on ${atom} : string policy crdt(string) default "Untitled"; - private state Done${atom} id "${atom}:done" on ${atom} : bool policy optimistic-register default false; - private state Rank${atom} id "${atom}:rank" on ${atom} : int64 policy optimistic-register default 0; + private state Done${atom} id "${atom}:done" on ${atom} : bool policy register default false; + private state Rank${atom} id "${atom}:rank" on ${atom} : int64 policy register default 0; private edge Assignee${atom} id "${atom}:assignee" { atom ${atom} projection assignee id "${atom}:assignee:forward" optional-one; interface PersonFacts projection tasks id "${atom}:assignee:inverse" many; @@ -114,7 +114,7 @@ export async function queryWorkspaceFixture(options: { live?: boolean } = {}) { import interface PersonFacts; import interface TaskFacts; import interface Collection; import package Queries; atom Task id "Task"; atom Reminder id "Reminder"; atom Person id "Person"; atom Tasks id "Tasks"; conform Person as PersonFacts id "person-facts" { - private state Name id "person:name" on Person : string policy optimistic-register default "Nobody"; + private state Name id "person:name" on Person : string policy register default "Nobody"; bind name to state Name; } ${implementation("Task")} ${implementation("Reminder")} diff --git a/test/fixtures/todo.capabilities.qx b/test/fixtures/todo.capabilities.qx index 466277e..d94945d 100644 --- a/test/fixtures/todo.capabilities.qx +++ b/test/fixtures/todo.capabilities.qx @@ -8,7 +8,7 @@ workspace Todo id "workspace:todo" revision "workspace:todo@1" commit "111111111 import package TodoRuntime; shared state ProjectTitle id "slot:project:title" on Project : string - policy optimistic-register default "Untitled project"; + policy register default "Untitled project"; conform Project as Named { bind name.get to state ProjectTitle.read; @@ -19,7 +19,7 @@ workspace Todo id "workspace:todo" revision "workspace:todo@1" commit "111111111 conform Person as Named { private state PersonName id "slot:person:name" on Person : string - policy optimistic-register default "Anonymous"; + policy register default "Anonymous"; bind name.get to state PersonName.read; bind name.set to state PersonName.write; bind name.watch-start to state PersonName.watch-start; diff --git a/test/fixtures/web-studio.capabilities.qx b/test/fixtures/web-studio.capabilities.qx index 5ead8b3..ed39f0d 100644 --- a/test/fixtures/web-studio.capabilities.qx +++ b/test/fixtures/web-studio.capabilities.qx @@ -8,7 +8,7 @@ workspace WebStudioFixture id "workspace:web-studio-fixture" revision "workspace import package ComponentRuntime; shared state ProjectName id "slot:project:name" on Project : string - policy optimistic-register default "Untitled project"; + policy register default "Untitled project"; shared edge ProjectComponentEdge id "edge:project:component" { atom ProjectComponent projection subject id "projection:component:subject" exactly-one; atom Project projection component id "projection:project:component" optional-one; diff --git a/test/forwarding.test.ts b/test/forwarding.test.ts index 13492d8..487d955 100644 --- a/test/forwarding.test.ts +++ b/test/forwarding.test.ts @@ -36,7 +36,7 @@ function fixture(transform = (s: string) => s, generic = false) { ${forward("Relay", "Alias")} ${forward("Alias", generic ? "Owner" : "Owner")} conform Item as Owner${generic ? "" : ""} id "owner-conformance" { - private state Title id "title" on Item : string policy optimistic-register default ""; + private state Title id "title" on Item : string policy register default ""; bind title to state Title; } }`; diff --git a/test/generics.test.ts b/test/generics.test.ts index b2e86ba..7272f10 100644 --- a/test/generics.test.ts +++ b/test/generics.test.ts @@ -272,7 +272,7 @@ test("generic conformances bind state against specialized signatures", () => { atom Document id "document"; import interface Reader; conform Document as Reader id "reader-conformance" { - private state Values id "values-slot" on Document : list> policy optimistic-register; + private state Values id "values-slot" on Document : list> policy register; bind values.get to state Values.read; bind values.watch-start to state Values.watch-start; bind values.watch-stop to state Values.watch-stop; @@ -328,7 +328,7 @@ test("package receivers and injected dependencies select exact applications", () import interface Reader; import interface Summary; import package P; atom Note id "note"; conform Note as Reader id "reader-conformance" { - private state Values id "values" on Note : list> policy optimistic-register; + private state Values id "values" on Note : list> policy register; bind values.get to state Values.read; bind values.watch-start to state Values.watch-start; bind values.watch-stop to state Values.watch-stop; diff --git a/test/structural-edits.test.ts b/test/structural-edits.test.ts index a8e582d..2f6d389 100644 --- a/test/structural-edits.test.ts +++ b/test/structural-edits.test.ts @@ -82,7 +82,7 @@ test("dependency scaffolding validates exact sources and preserves unrelated loc }); test("conformance enrollment, major edits, imports, and private attachment removal preserve valid structure", () => { - const source = `fragment { conform Game as Playable { private state Board id "slot:board" on Game : string policy optimistic-register; } }`; + const source = `fragment { conform Game as Playable { private state Board id "slot:board" on Game : string policy register; } }`; const selector = { kind: "conformanceDecl", names: ["Game", "Playable"] }; const enrolled = editStructure(source, { operation: "conformance-id", target: selector, id: "conformance:playable" }); assert.ok(enrolled.includes('as Playable id "conformance:playable"')); From 4c0c404a3991ef313b7739b865e725421f67ff0e Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sat, 19 Sep 2026 22:20:55 -0700 Subject: [PATCH 08/91] Add explicit CRDT edit contracts and structured query values --- grammar/QuixosCapability.g4 | 20 + proto/camino/schema.proto | 1 + src/bindings/client.ts | 2 + src/bindings/generics.ts | 2 + src/bindings/index.ts | 2 + src/bindings/react.ts | 2 + .../generated/QuixosCapability.interp | 4 +- .../generated/QuixosCapability.tokens | 568 +-- .../generated/QuixosCapabilityLexer.interp | 5 +- .../generated/QuixosCapabilityLexer.tokens | 568 +-- .../generated/QuixosCapabilityLexer.ts | 1319 +++---- .../generated/QuixosCapabilityParser.ts | 3064 +++++++++-------- src/capability-language/generic-types.ts | 7 + src/capability-language/parser.ts | 25 +- src/capability-model/generics.ts | 10 +- src/capability-model/types.ts | 5 +- src/capability-model/validation.ts | 55 +- src/gen/camino/schema_pb.ts | 7 +- src/query/relational-compile.ts | 59 +- src/query/relational-schema.ts | 6 +- src/query/relational.ts | 2 +- src/query/schema.ts | 25 +- src/query/structured.ts | 76 + test/crdt-edit-contracts.test.ts | 91 + test/generics.test.ts | 4 +- test/query-contracts.test.ts | 2 +- test/query-structured.test.ts | 86 + 27 files changed, 3272 insertions(+), 2745 deletions(-) create mode 100644 src/query/structured.ts create mode 100644 test/crdt-edit-contracts.test.ts create mode 100644 test/query-structured.test.ts diff --git a/grammar/QuixosCapability.g4 b/grammar/QuixosCapability.g4 index e4cd0a3..5517897 100644 --- a/grammar/QuixosCapability.g4 +++ b/grammar/QuixosCapability.g4 @@ -107,6 +107,7 @@ valueMember valueMemberOperation : GET ID stringLiteral executionClause? SEMI | SET ID stringLiteral executionClause? SEMI + | EDIT ID stringLiteral executionClause? SEMI | WATCH START ID stringLiteral STOP ID stringLiteral SEMI ; @@ -234,6 +235,7 @@ primitiveList primitive : READ | WRITE + | EDIT | RESOLVE | CONNECT | DISCONNECT @@ -316,6 +318,7 @@ operationName | CALL | GET | SET + | EDIT | RESOLVE | CONNECT | DISCONNECT @@ -335,6 +338,7 @@ operationProvider statePrimitive : READ | WRITE + | EDIT | WATCH_START | WATCH_STOP ; @@ -426,6 +430,21 @@ jsonArray identifier : IDENTIFIER + | START + | STOP + | EDIT + | CREATION + | INITIALIZE + | EXECUTION + | SNAPSHOT + | TRANSACTION + | REMOTE + | TARGETS + | PORTABLE + | REPLICA + | LOCAL + | FROM + | REGISTER | INTERFACES | REFLECTION | SOURCE @@ -449,6 +468,7 @@ stringLiteral : STRING_LITERAL ; +EDIT: 'edit'; CREATION: 'creation'; INITIALIZE: 'initialize'; WORKSPACE: 'workspace'; diff --git a/proto/camino/schema.proto b/proto/camino/schema.proto index e292ff6..7b4cef9 100644 --- a/proto/camino/schema.proto +++ b/proto/camino/schema.proto @@ -125,6 +125,7 @@ message QueryRelationPath { message QueryFieldOperand { string interface_revision_id = 1; string member_id = 2; + repeated string value_path = 3; } message QueryExpression { repeated QueryPathStep path = 1; diff --git a/src/bindings/client.ts b/src/bindings/client.ts index cac5353..f397b41 100644 --- a/src/bindings/client.ts +++ b/src/bindings/client.ts @@ -28,6 +28,8 @@ export const generateClientContracts = ( return qualified ? `CapabilityReference<${JSON.stringify(value.expectation.kind === "atom" ? `atom:${value.expectation.atomId}` : `interface:${value.expectation.interfaceRevisionId}`)}>` : `{readonly $quixosRef: string}`; + case "change": + throw new Error("CRDT change values require the prepared-change codec and runtime (LF-19)"); case "optional": return `(${type(value.value)} | null)`; case "list": diff --git a/src/bindings/generics.ts b/src/bindings/generics.ts index f4a4dba..d4e8714 100644 --- a/src/bindings/generics.ts +++ b/src/bindings/generics.ts @@ -60,6 +60,8 @@ export const genericImplementationType = ( return `QxObjectRef<${target(type.expectation, scope)}>`; case "record": return object(Object.entries(type.fields).map(([name, field]) => [name, value(field, scope, depth + 1)])); + case "change": + throw new Error("CRDT change values require the prepared-change codec and runtime (LF-19)"); case "optional": return `(${value(type.value, scope, depth + 1)} | null)`; case "list": diff --git a/src/bindings/index.ts b/src/bindings/index.ts index 3ff21f5..1e17989 100644 --- a/src/bindings/index.ts +++ b/src/bindings/index.ts @@ -122,6 +122,8 @@ export const generateTypeScriptBindings = ( }[value.name]; case "object-ref": return `QxObjectRef<${q(value.expectation.kind === "atom" ? `atom:${value.expectation.atomId}` : `interface:${value.expectation.interfaceRevisionId}`)}>`; + case "change": + throw new Error("CRDT change values require the prepared-change codec and runtime (LF-19)"); case "optional": return `(${type(value.value)} | null)`; case "list": diff --git a/src/bindings/react.ts b/src/bindings/react.ts index e35ae72..237caa8 100644 --- a/src/bindings/react.ts +++ b/src/bindings/react.ts @@ -30,6 +30,8 @@ export function generateReactBindings( uint32: "number", double: "number", }[value.name]; + case "change": + throw new Error("CRDT change values require the prepared-change codec and runtime (LF-19)"); case "optional": return `(${type(value.value)} | null)`; case "list": diff --git a/src/capability-language/generated/QuixosCapability.interp b/src/capability-language/generated/QuixosCapability.interp index 9d5d308..f8017cb 100644 --- a/src/capability-language/generated/QuixosCapability.interp +++ b/src/capability-language/generated/QuixosCapability.interp @@ -1,5 +1,6 @@ token literal names: null +'edit' 'creation' 'initialize' 'workspace' @@ -148,6 +149,7 @@ null token symbolic names: null +EDIT CREATION INITIALIZE WORKSPACE @@ -373,4 +375,4 @@ stringLiteral atn: -[4, 1, 145, 1255, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 163, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 168, 8, 1, 10, 1, 12, 1, 171, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 189, 8, 3, 10, 3, 12, 3, 192, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 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, 3, 5, 215, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 235, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 243, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 248, 8, 10, 10, 10, 12, 10, 251, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 256, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 266, 8, 10, 10, 10, 12, 10, 269, 9, 10, 3, 10, 271, 8, 10, 1, 10, 1, 10, 5, 10, 275, 8, 10, 10, 10, 12, 10, 278, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 286, 8, 11, 10, 11, 12, 11, 289, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 297, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 305, 8, 12, 10, 12, 12, 12, 308, 9, 12, 3, 12, 310, 8, 12, 3, 12, 312, 8, 12, 1, 13, 1, 13, 3, 13, 316, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 322, 8, 14, 10, 14, 12, 14, 325, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 336, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 341, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 350, 8, 17, 1, 18, 3, 18, 353, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 368, 8, 18, 1, 18, 1, 18, 1, 18, 1, 19, 3, 19, 374, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 384, 8, 19, 10, 19, 12, 19, 387, 9, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 395, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 403, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 416, 8, 20, 1, 21, 3, 21, 419, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 429, 8, 21, 1, 21, 1, 21, 3, 21, 433, 8, 21, 1, 21, 1, 21, 5, 21, 437, 8, 21, 10, 21, 12, 21, 440, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 446, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 452, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 460, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 468, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 481, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 488, 8, 24, 1, 24, 1, 24, 3, 24, 492, 8, 24, 1, 25, 5, 25, 495, 8, 25, 10, 25, 12, 25, 498, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 508, 8, 25, 1, 25, 1, 25, 5, 25, 512, 8, 25, 10, 25, 12, 25, 515, 9, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 524, 8, 26, 1, 27, 1, 27, 1, 27, 3, 27, 529, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 535, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 544, 8, 27, 10, 27, 12, 27, 547, 9, 27, 1, 27, 1, 27, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 573, 8, 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, 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, 3, 29, 600, 8, 29, 1, 30, 1, 30, 1, 30, 3, 30, 605, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 616, 8, 30, 1, 30, 3, 30, 619, 8, 30, 1, 30, 1, 30, 1, 30, 3, 30, 624, 8, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 3, 31, 631, 8, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 640, 8, 31, 1, 31, 3, 31, 643, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 656, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 5, 33, 663, 8, 33, 10, 33, 12, 33, 666, 9, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 679, 8, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 5, 37, 698, 8, 37, 10, 37, 12, 37, 701, 9, 37, 3, 37, 703, 8, 37, 1, 37, 3, 37, 706, 8, 37, 1, 38, 1, 38, 1, 38, 5, 38, 711, 8, 38, 10, 38, 12, 38, 714, 9, 38, 1, 39, 1, 39, 1, 39, 5, 39, 719, 8, 39, 10, 39, 12, 39, 722, 9, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 761, 8, 40, 1, 40, 3, 40, 764, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 786, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 800, 8, 40, 1, 41, 1, 41, 1, 41, 1, 41, 5, 41, 806, 8, 41, 10, 41, 12, 41, 809, 9, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 3, 44, 820, 8, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 834, 8, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 844, 8, 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, 48, 1, 48, 1, 48, 1, 48, 3, 48, 862, 8, 48, 1, 48, 1, 48, 3, 48, 866, 8, 48, 1, 48, 3, 48, 869, 8, 48, 1, 48, 1, 48, 3, 48, 873, 8, 48, 1, 48, 3, 48, 876, 8, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 885, 8, 49, 1, 49, 1, 49, 3, 49, 889, 8, 49, 1, 49, 1, 49, 3, 49, 893, 8, 49, 1, 49, 1, 49, 5, 49, 897, 8, 49, 10, 49, 12, 49, 900, 9, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 910, 8, 50, 1, 51, 1, 51, 1, 51, 5, 51, 915, 8, 51, 10, 51, 12, 51, 918, 9, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 937, 8, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 5, 53, 944, 8, 53, 10, 53, 12, 53, 947, 9, 53, 1, 53, 1, 53, 1, 54, 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, 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, 3, 56, 978, 8, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 997, 8, 58, 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, 1014, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1024, 8, 59, 1, 59, 3, 59, 1027, 8, 59, 3, 59, 1029, 8, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 5, 62, 1038, 8, 62, 10, 62, 12, 62, 1041, 9, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1064, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1080, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1089, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1097, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 5, 63, 1108, 8, 63, 10, 63, 12, 63, 1111, 9, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1125, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1137, 8, 63, 1, 63, 1, 63, 3, 63, 1141, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1150, 8, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1168, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 5, 65, 1190, 8, 65, 10, 65, 12, 65, 1193, 9, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1198, 8, 65, 3, 65, 1200, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1219, 8, 69, 1, 70, 1, 70, 1, 70, 1, 70, 5, 70, 1225, 8, 70, 10, 70, 12, 70, 1228, 9, 70, 3, 70, 1230, 8, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 5, 72, 1242, 8, 72, 10, 72, 12, 72, 1245, 9, 72, 3, 72, 1247, 8, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 0, 0, 75, 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, 0, 9, 2, 0, 9, 9, 27, 27, 1, 0, 5, 6, 1, 0, 93, 97, 2, 0, 88, 92, 94, 95, 2, 0, 88, 89, 94, 95, 2, 0, 90, 92, 94, 95, 1, 0, 113, 120, 1, 0, 100, 103, 4, 0, 13, 27, 39, 39, 67, 67, 141, 141, 1355, 0, 162, 1, 0, 0, 0, 2, 164, 1, 0, 0, 0, 4, 174, 1, 0, 0, 0, 6, 178, 1, 0, 0, 0, 8, 202, 1, 0, 0, 0, 10, 214, 1, 0, 0, 0, 12, 216, 1, 0, 0, 0, 14, 223, 1, 0, 0, 0, 16, 234, 1, 0, 0, 0, 18, 236, 1, 0, 0, 0, 20, 249, 1, 0, 0, 0, 22, 281, 1, 0, 0, 0, 24, 311, 1, 0, 0, 0, 26, 313, 1, 0, 0, 0, 28, 317, 1, 0, 0, 0, 30, 335, 1, 0, 0, 0, 32, 337, 1, 0, 0, 0, 34, 349, 1, 0, 0, 0, 36, 352, 1, 0, 0, 0, 38, 373, 1, 0, 0, 0, 40, 415, 1, 0, 0, 0, 42, 418, 1, 0, 0, 0, 44, 443, 1, 0, 0, 0, 46, 480, 1, 0, 0, 0, 48, 491, 1, 0, 0, 0, 50, 496, 1, 0, 0, 0, 52, 523, 1, 0, 0, 0, 54, 525, 1, 0, 0, 0, 56, 550, 1, 0, 0, 0, 58, 599, 1, 0, 0, 0, 60, 601, 1, 0, 0, 0, 62, 627, 1, 0, 0, 0, 64, 655, 1, 0, 0, 0, 66, 657, 1, 0, 0, 0, 68, 669, 1, 0, 0, 0, 70, 682, 1, 0, 0, 0, 72, 685, 1, 0, 0, 0, 74, 705, 1, 0, 0, 0, 76, 707, 1, 0, 0, 0, 78, 715, 1, 0, 0, 0, 80, 799, 1, 0, 0, 0, 82, 801, 1, 0, 0, 0, 84, 812, 1, 0, 0, 0, 86, 814, 1, 0, 0, 0, 88, 819, 1, 0, 0, 0, 90, 821, 1, 0, 0, 0, 92, 843, 1, 0, 0, 0, 94, 845, 1, 0, 0, 0, 96, 854, 1, 0, 0, 0, 98, 879, 1, 0, 0, 0, 100, 909, 1, 0, 0, 0, 102, 911, 1, 0, 0, 0, 104, 936, 1, 0, 0, 0, 106, 938, 1, 0, 0, 0, 108, 950, 1, 0, 0, 0, 110, 957, 1, 0, 0, 0, 112, 971, 1, 0, 0, 0, 114, 981, 1, 0, 0, 0, 116, 996, 1, 0, 0, 0, 118, 1028, 1, 0, 0, 0, 120, 1030, 1, 0, 0, 0, 122, 1032, 1, 0, 0, 0, 124, 1034, 1, 0, 0, 0, 126, 1140, 1, 0, 0, 0, 128, 1142, 1, 0, 0, 0, 130, 1199, 1, 0, 0, 0, 132, 1201, 1, 0, 0, 0, 134, 1206, 1, 0, 0, 0, 136, 1208, 1, 0, 0, 0, 138, 1218, 1, 0, 0, 0, 140, 1220, 1, 0, 0, 0, 142, 1233, 1, 0, 0, 0, 144, 1237, 1, 0, 0, 0, 146, 1250, 1, 0, 0, 0, 148, 1252, 1, 0, 0, 0, 150, 151, 3, 6, 3, 0, 151, 152, 5, 0, 0, 1, 152, 163, 1, 0, 0, 0, 153, 154, 3, 20, 10, 0, 154, 155, 5, 0, 0, 1, 155, 163, 1, 0, 0, 0, 156, 157, 3, 50, 25, 0, 157, 158, 5, 0, 0, 1, 158, 163, 1, 0, 0, 0, 159, 160, 3, 2, 1, 0, 160, 161, 5, 0, 0, 1, 161, 163, 1, 0, 0, 0, 162, 150, 1, 0, 0, 0, 162, 153, 1, 0, 0, 0, 162, 156, 1, 0, 0, 0, 162, 159, 1, 0, 0, 0, 163, 1, 1, 0, 0, 0, 164, 165, 5, 34, 0, 0, 165, 169, 5, 129, 0, 0, 166, 168, 3, 8, 4, 0, 167, 166, 1, 0, 0, 0, 168, 171, 1, 0, 0, 0, 169, 167, 1, 0, 0, 0, 169, 170, 1, 0, 0, 0, 170, 172, 1, 0, 0, 0, 171, 169, 1, 0, 0, 0, 172, 173, 5, 130, 0, 0, 173, 3, 1, 0, 0, 0, 174, 175, 5, 35, 0, 0, 175, 176, 3, 148, 74, 0, 176, 177, 5, 126, 0, 0, 177, 5, 1, 0, 0, 0, 178, 179, 5, 3, 0, 0, 179, 180, 3, 146, 73, 0, 180, 181, 5, 76, 0, 0, 181, 182, 3, 148, 74, 0, 182, 183, 5, 70, 0, 0, 183, 184, 3, 148, 74, 0, 184, 185, 5, 69, 0, 0, 185, 186, 3, 148, 74, 0, 186, 190, 5, 129, 0, 0, 187, 189, 3, 8, 4, 0, 188, 187, 1, 0, 0, 0, 189, 192, 1, 0, 0, 0, 190, 188, 1, 0, 0, 0, 190, 191, 1, 0, 0, 0, 191, 193, 1, 0, 0, 0, 192, 190, 1, 0, 0, 0, 193, 194, 5, 130, 0, 0, 194, 7, 1, 0, 0, 0, 195, 203, 3, 4, 2, 0, 196, 203, 3, 18, 9, 0, 197, 203, 3, 10, 5, 0, 198, 203, 3, 86, 43, 0, 199, 203, 3, 98, 49, 0, 200, 203, 3, 128, 64, 0, 201, 203, 3, 32, 16, 0, 202, 195, 1, 0, 0, 0, 202, 196, 1, 0, 0, 0, 202, 197, 1, 0, 0, 0, 202, 198, 1, 0, 0, 0, 202, 199, 1, 0, 0, 0, 202, 200, 1, 0, 0, 0, 202, 201, 1, 0, 0, 0, 203, 9, 1, 0, 0, 0, 204, 205, 5, 35, 0, 0, 205, 206, 5, 38, 0, 0, 206, 207, 3, 146, 73, 0, 207, 208, 5, 126, 0, 0, 208, 215, 1, 0, 0, 0, 209, 210, 5, 35, 0, 0, 210, 211, 5, 40, 0, 0, 211, 212, 3, 146, 73, 0, 212, 213, 5, 126, 0, 0, 213, 215, 1, 0, 0, 0, 214, 204, 1, 0, 0, 0, 214, 209, 1, 0, 0, 0, 215, 11, 1, 0, 0, 0, 216, 217, 5, 36, 0, 0, 217, 218, 5, 37, 0, 0, 218, 219, 3, 146, 73, 0, 219, 220, 5, 76, 0, 0, 220, 221, 3, 148, 74, 0, 221, 222, 5, 126, 0, 0, 222, 13, 1, 0, 0, 0, 223, 224, 5, 36, 0, 0, 224, 225, 5, 38, 0, 0, 225, 226, 3, 146, 73, 0, 226, 227, 5, 70, 0, 0, 227, 228, 3, 148, 74, 0, 228, 229, 5, 126, 0, 0, 229, 15, 1, 0, 0, 0, 230, 235, 3, 10, 5, 0, 231, 235, 3, 12, 6, 0, 232, 235, 3, 14, 7, 0, 233, 235, 3, 32, 16, 0, 234, 230, 1, 0, 0, 0, 234, 231, 1, 0, 0, 0, 234, 232, 1, 0, 0, 0, 234, 233, 1, 0, 0, 0, 235, 17, 1, 0, 0, 0, 236, 237, 5, 37, 0, 0, 237, 238, 3, 146, 73, 0, 238, 239, 5, 76, 0, 0, 239, 242, 3, 148, 74, 0, 240, 241, 5, 77, 0, 0, 241, 243, 3, 148, 74, 0, 242, 240, 1, 0, 0, 0, 242, 243, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 245, 5, 126, 0, 0, 245, 19, 1, 0, 0, 0, 246, 248, 3, 16, 8, 0, 247, 246, 1, 0, 0, 0, 248, 251, 1, 0, 0, 0, 249, 247, 1, 0, 0, 0, 249, 250, 1, 0, 0, 0, 250, 252, 1, 0, 0, 0, 251, 249, 1, 0, 0, 0, 252, 253, 5, 38, 0, 0, 253, 255, 3, 146, 73, 0, 254, 256, 3, 22, 11, 0, 255, 254, 1, 0, 0, 0, 255, 256, 1, 0, 0, 0, 256, 257, 1, 0, 0, 0, 257, 258, 5, 76, 0, 0, 258, 259, 3, 148, 74, 0, 259, 260, 5, 70, 0, 0, 260, 270, 3, 148, 74, 0, 261, 262, 5, 81, 0, 0, 262, 267, 3, 26, 13, 0, 263, 264, 5, 127, 0, 0, 264, 266, 3, 26, 13, 0, 265, 263, 1, 0, 0, 0, 266, 269, 1, 0, 0, 0, 267, 265, 1, 0, 0, 0, 267, 268, 1, 0, 0, 0, 268, 271, 1, 0, 0, 0, 269, 267, 1, 0, 0, 0, 270, 261, 1, 0, 0, 0, 270, 271, 1, 0, 0, 0, 271, 272, 1, 0, 0, 0, 272, 276, 5, 129, 0, 0, 273, 275, 3, 34, 17, 0, 274, 273, 1, 0, 0, 0, 275, 278, 1, 0, 0, 0, 276, 274, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 279, 1, 0, 0, 0, 278, 276, 1, 0, 0, 0, 279, 280, 5, 130, 0, 0, 280, 21, 1, 0, 0, 0, 281, 282, 5, 135, 0, 0, 282, 287, 3, 24, 12, 0, 283, 284, 5, 127, 0, 0, 284, 286, 3, 24, 12, 0, 285, 283, 1, 0, 0, 0, 286, 289, 1, 0, 0, 0, 287, 285, 1, 0, 0, 0, 287, 288, 1, 0, 0, 0, 288, 290, 1, 0, 0, 0, 289, 287, 1, 0, 0, 0, 290, 291, 5, 136, 0, 0, 291, 23, 1, 0, 0, 0, 292, 293, 5, 41, 0, 0, 293, 296, 3, 146, 73, 0, 294, 295, 5, 125, 0, 0, 295, 297, 5, 31, 0, 0, 296, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 312, 1, 0, 0, 0, 298, 299, 5, 30, 0, 0, 299, 309, 3, 146, 73, 0, 300, 301, 5, 32, 0, 0, 301, 306, 3, 26, 13, 0, 302, 303, 5, 137, 0, 0, 303, 305, 3, 26, 13, 0, 304, 302, 1, 0, 0, 0, 305, 308, 1, 0, 0, 0, 306, 304, 1, 0, 0, 0, 306, 307, 1, 0, 0, 0, 307, 310, 1, 0, 0, 0, 308, 306, 1, 0, 0, 0, 309, 300, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 312, 1, 0, 0, 0, 311, 292, 1, 0, 0, 0, 311, 298, 1, 0, 0, 0, 312, 25, 1, 0, 0, 0, 313, 315, 3, 146, 73, 0, 314, 316, 3, 28, 14, 0, 315, 314, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 27, 1, 0, 0, 0, 317, 318, 5, 135, 0, 0, 318, 323, 3, 30, 15, 0, 319, 320, 5, 127, 0, 0, 320, 322, 3, 30, 15, 0, 321, 319, 1, 0, 0, 0, 322, 325, 1, 0, 0, 0, 323, 321, 1, 0, 0, 0, 323, 324, 1, 0, 0, 0, 324, 326, 1, 0, 0, 0, 325, 323, 1, 0, 0, 0, 326, 327, 5, 136, 0, 0, 327, 29, 1, 0, 0, 0, 328, 329, 5, 37, 0, 0, 329, 336, 3, 146, 73, 0, 330, 331, 5, 38, 0, 0, 331, 336, 3, 26, 13, 0, 332, 333, 5, 30, 0, 0, 333, 336, 3, 146, 73, 0, 334, 336, 3, 130, 65, 0, 335, 328, 1, 0, 0, 0, 335, 330, 1, 0, 0, 0, 335, 332, 1, 0, 0, 0, 335, 334, 1, 0, 0, 0, 336, 31, 1, 0, 0, 0, 337, 338, 5, 29, 0, 0, 338, 340, 3, 146, 73, 0, 339, 341, 3, 22, 11, 0, 340, 339, 1, 0, 0, 0, 340, 341, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 343, 5, 138, 0, 0, 343, 344, 3, 130, 65, 0, 344, 345, 5, 126, 0, 0, 345, 33, 1, 0, 0, 0, 346, 350, 3, 38, 19, 0, 347, 350, 3, 42, 21, 0, 348, 350, 3, 36, 18, 0, 349, 346, 1, 0, 0, 0, 349, 347, 1, 0, 0, 0, 349, 348, 1, 0, 0, 0, 350, 35, 1, 0, 0, 0, 351, 353, 5, 51, 0, 0, 352, 351, 1, 0, 0, 0, 352, 353, 1, 0, 0, 0, 353, 354, 1, 0, 0, 0, 354, 355, 5, 43, 0, 0, 355, 356, 3, 146, 73, 0, 356, 357, 5, 76, 0, 0, 357, 358, 3, 148, 74, 0, 358, 359, 5, 125, 0, 0, 359, 360, 3, 130, 65, 0, 360, 361, 5, 124, 0, 0, 361, 362, 3, 130, 65, 0, 362, 363, 5, 129, 0, 0, 363, 364, 5, 93, 0, 0, 364, 365, 5, 76, 0, 0, 365, 367, 3, 148, 74, 0, 366, 368, 3, 64, 32, 0, 367, 366, 1, 0, 0, 0, 367, 368, 1, 0, 0, 0, 368, 369, 1, 0, 0, 0, 369, 370, 5, 126, 0, 0, 370, 371, 5, 130, 0, 0, 371, 37, 1, 0, 0, 0, 372, 374, 3, 44, 22, 0, 373, 372, 1, 0, 0, 0, 373, 374, 1, 0, 0, 0, 374, 375, 1, 0, 0, 0, 375, 376, 5, 41, 0, 0, 376, 377, 3, 146, 73, 0, 377, 378, 5, 76, 0, 0, 378, 379, 3, 148, 74, 0, 379, 380, 5, 125, 0, 0, 380, 381, 3, 130, 65, 0, 381, 385, 5, 129, 0, 0, 382, 384, 3, 40, 20, 0, 383, 382, 1, 0, 0, 0, 384, 387, 1, 0, 0, 0, 385, 383, 1, 0, 0, 0, 385, 386, 1, 0, 0, 0, 386, 388, 1, 0, 0, 0, 387, 385, 1, 0, 0, 0, 388, 389, 5, 130, 0, 0, 389, 39, 1, 0, 0, 0, 390, 391, 5, 83, 0, 0, 391, 392, 5, 76, 0, 0, 392, 394, 3, 148, 74, 0, 393, 395, 3, 64, 32, 0, 394, 393, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 396, 1, 0, 0, 0, 396, 397, 5, 126, 0, 0, 397, 416, 1, 0, 0, 0, 398, 399, 5, 84, 0, 0, 399, 400, 5, 76, 0, 0, 400, 402, 3, 148, 74, 0, 401, 403, 3, 64, 32, 0, 402, 401, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 404, 1, 0, 0, 0, 404, 405, 5, 126, 0, 0, 405, 416, 1, 0, 0, 0, 406, 407, 5, 85, 0, 0, 407, 408, 5, 86, 0, 0, 408, 409, 5, 76, 0, 0, 409, 410, 3, 148, 74, 0, 410, 411, 5, 87, 0, 0, 411, 412, 5, 76, 0, 0, 412, 413, 3, 148, 74, 0, 413, 414, 5, 126, 0, 0, 414, 416, 1, 0, 0, 0, 415, 390, 1, 0, 0, 0, 415, 398, 1, 0, 0, 0, 415, 406, 1, 0, 0, 0, 416, 41, 1, 0, 0, 0, 417, 419, 3, 44, 22, 0, 418, 417, 1, 0, 0, 0, 418, 419, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 421, 5, 42, 0, 0, 421, 422, 3, 146, 73, 0, 422, 423, 5, 76, 0, 0, 423, 424, 3, 148, 74, 0, 424, 425, 5, 125, 0, 0, 425, 426, 3, 136, 68, 0, 426, 428, 3, 48, 24, 0, 427, 429, 5, 104, 0, 0, 428, 427, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 432, 1, 0, 0, 0, 430, 431, 5, 74, 0, 0, 431, 433, 3, 148, 74, 0, 432, 430, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 434, 1, 0, 0, 0, 434, 438, 5, 129, 0, 0, 435, 437, 3, 46, 23, 0, 436, 435, 1, 0, 0, 0, 437, 440, 1, 0, 0, 0, 438, 436, 1, 0, 0, 0, 438, 439, 1, 0, 0, 0, 439, 441, 1, 0, 0, 0, 440, 438, 1, 0, 0, 0, 441, 442, 5, 130, 0, 0, 442, 43, 1, 0, 0, 0, 443, 445, 5, 26, 0, 0, 444, 446, 7, 0, 0, 0, 445, 444, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 45, 1, 0, 0, 0, 447, 448, 5, 90, 0, 0, 448, 449, 5, 76, 0, 0, 449, 451, 3, 148, 74, 0, 450, 452, 3, 64, 32, 0, 451, 450, 1, 0, 0, 0, 451, 452, 1, 0, 0, 0, 452, 453, 1, 0, 0, 0, 453, 454, 5, 126, 0, 0, 454, 481, 1, 0, 0, 0, 455, 456, 5, 91, 0, 0, 456, 457, 5, 76, 0, 0, 457, 459, 3, 148, 74, 0, 458, 460, 3, 64, 32, 0, 459, 458, 1, 0, 0, 0, 459, 460, 1, 0, 0, 0, 460, 461, 1, 0, 0, 0, 461, 462, 5, 126, 0, 0, 462, 481, 1, 0, 0, 0, 463, 464, 5, 92, 0, 0, 464, 465, 5, 76, 0, 0, 465, 467, 3, 148, 74, 0, 466, 468, 3, 64, 32, 0, 467, 466, 1, 0, 0, 0, 467, 468, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 470, 5, 126, 0, 0, 470, 481, 1, 0, 0, 0, 471, 472, 5, 85, 0, 0, 472, 473, 5, 86, 0, 0, 473, 474, 5, 76, 0, 0, 474, 475, 3, 148, 74, 0, 475, 476, 5, 87, 0, 0, 476, 477, 5, 76, 0, 0, 477, 478, 3, 148, 74, 0, 478, 479, 5, 126, 0, 0, 479, 481, 1, 0, 0, 0, 480, 447, 1, 0, 0, 0, 480, 455, 1, 0, 0, 0, 480, 463, 1, 0, 0, 0, 480, 471, 1, 0, 0, 0, 481, 47, 1, 0, 0, 0, 482, 483, 5, 37, 0, 0, 483, 492, 3, 146, 73, 0, 484, 485, 5, 38, 0, 0, 485, 487, 3, 146, 73, 0, 486, 488, 3, 28, 14, 0, 487, 486, 1, 0, 0, 0, 487, 488, 1, 0, 0, 0, 488, 492, 1, 0, 0, 0, 489, 490, 5, 30, 0, 0, 490, 492, 3, 146, 73, 0, 491, 482, 1, 0, 0, 0, 491, 484, 1, 0, 0, 0, 491, 489, 1, 0, 0, 0, 492, 49, 1, 0, 0, 0, 493, 495, 3, 16, 8, 0, 494, 493, 1, 0, 0, 0, 495, 498, 1, 0, 0, 0, 496, 494, 1, 0, 0, 0, 496, 497, 1, 0, 0, 0, 497, 499, 1, 0, 0, 0, 498, 496, 1, 0, 0, 0, 499, 500, 5, 40, 0, 0, 500, 501, 3, 146, 73, 0, 501, 502, 5, 76, 0, 0, 502, 503, 3, 148, 74, 0, 503, 504, 5, 70, 0, 0, 504, 507, 3, 148, 74, 0, 505, 506, 5, 71, 0, 0, 506, 508, 5, 139, 0, 0, 507, 505, 1, 0, 0, 0, 507, 508, 1, 0, 0, 0, 508, 509, 1, 0, 0, 0, 509, 513, 5, 129, 0, 0, 510, 512, 3, 52, 26, 0, 511, 510, 1, 0, 0, 0, 512, 515, 1, 0, 0, 0, 513, 511, 1, 0, 0, 0, 513, 514, 1, 0, 0, 0, 514, 516, 1, 0, 0, 0, 515, 513, 1, 0, 0, 0, 516, 517, 5, 130, 0, 0, 517, 51, 1, 0, 0, 0, 518, 524, 3, 60, 30, 0, 519, 524, 3, 62, 31, 0, 520, 524, 3, 68, 34, 0, 521, 524, 3, 54, 27, 0, 522, 524, 3, 56, 28, 0, 523, 518, 1, 0, 0, 0, 523, 519, 1, 0, 0, 0, 523, 520, 1, 0, 0, 0, 523, 521, 1, 0, 0, 0, 523, 522, 1, 0, 0, 0, 524, 53, 1, 0, 0, 0, 525, 526, 5, 16, 0, 0, 526, 528, 3, 146, 73, 0, 527, 529, 3, 22, 11, 0, 528, 527, 1, 0, 0, 0, 528, 529, 1, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 531, 5, 76, 0, 0, 531, 532, 3, 148, 74, 0, 532, 534, 5, 19, 0, 0, 533, 535, 5, 3, 0, 0, 534, 533, 1, 0, 0, 0, 534, 535, 1, 0, 0, 0, 535, 536, 1, 0, 0, 0, 536, 537, 3, 26, 13, 0, 537, 538, 5, 20, 0, 0, 538, 539, 3, 148, 74, 0, 539, 540, 5, 43, 0, 0, 540, 541, 3, 148, 74, 0, 541, 545, 5, 129, 0, 0, 542, 544, 3, 58, 29, 0, 543, 542, 1, 0, 0, 0, 544, 547, 1, 0, 0, 0, 545, 543, 1, 0, 0, 0, 545, 546, 1, 0, 0, 0, 546, 548, 1, 0, 0, 0, 547, 545, 1, 0, 0, 0, 548, 549, 5, 130, 0, 0, 549, 55, 1, 0, 0, 0, 550, 551, 5, 16, 0, 0, 551, 552, 3, 146, 73, 0, 552, 553, 5, 76, 0, 0, 553, 554, 3, 148, 74, 0, 554, 555, 5, 18, 0, 0, 555, 556, 3, 146, 73, 0, 556, 557, 3, 28, 14, 0, 557, 558, 5, 126, 0, 0, 558, 57, 1, 0, 0, 0, 559, 560, 5, 10, 0, 0, 560, 600, 5, 126, 0, 0, 561, 562, 5, 11, 0, 0, 562, 563, 5, 12, 0, 0, 563, 564, 3, 146, 73, 0, 564, 565, 5, 126, 0, 0, 565, 600, 1, 0, 0, 0, 566, 567, 5, 21, 0, 0, 567, 568, 3, 148, 74, 0, 568, 569, 5, 126, 0, 0, 569, 600, 1, 0, 0, 0, 570, 572, 5, 22, 0, 0, 571, 573, 5, 30, 0, 0, 572, 571, 1, 0, 0, 0, 572, 573, 1, 0, 0, 0, 573, 574, 1, 0, 0, 0, 574, 575, 3, 146, 73, 0, 575, 576, 5, 49, 0, 0, 576, 577, 3, 26, 13, 0, 577, 578, 5, 126, 0, 0, 578, 600, 1, 0, 0, 0, 579, 580, 5, 23, 0, 0, 580, 581, 3, 146, 73, 0, 581, 582, 5, 139, 0, 0, 582, 583, 5, 126, 0, 0, 583, 600, 1, 0, 0, 0, 584, 585, 5, 24, 0, 0, 585, 586, 3, 26, 13, 0, 586, 587, 5, 128, 0, 0, 587, 588, 3, 146, 73, 0, 588, 589, 3, 146, 73, 0, 589, 590, 3, 148, 74, 0, 590, 591, 5, 126, 0, 0, 591, 600, 1, 0, 0, 0, 592, 593, 5, 85, 0, 0, 593, 600, 5, 126, 0, 0, 594, 595, 5, 25, 0, 0, 595, 596, 5, 139, 0, 0, 596, 597, 3, 148, 74, 0, 597, 598, 5, 126, 0, 0, 598, 600, 1, 0, 0, 0, 599, 559, 1, 0, 0, 0, 599, 561, 1, 0, 0, 0, 599, 566, 1, 0, 0, 0, 599, 570, 1, 0, 0, 0, 599, 579, 1, 0, 0, 0, 599, 584, 1, 0, 0, 0, 599, 592, 1, 0, 0, 0, 599, 594, 1, 0, 0, 0, 600, 59, 1, 0, 0, 0, 601, 602, 5, 43, 0, 0, 602, 604, 3, 146, 73, 0, 603, 605, 3, 22, 11, 0, 604, 603, 1, 0, 0, 0, 604, 605, 1, 0, 0, 0, 605, 606, 1, 0, 0, 0, 606, 607, 5, 76, 0, 0, 607, 608, 3, 148, 74, 0, 608, 609, 5, 125, 0, 0, 609, 610, 3, 130, 65, 0, 610, 611, 5, 124, 0, 0, 611, 612, 3, 130, 65, 0, 612, 613, 5, 78, 0, 0, 613, 615, 3, 72, 36, 0, 614, 616, 3, 64, 32, 0, 615, 614, 1, 0, 0, 0, 615, 616, 1, 0, 0, 0, 616, 618, 1, 0, 0, 0, 617, 619, 3, 70, 35, 0, 618, 617, 1, 0, 0, 0, 618, 619, 1, 0, 0, 0, 619, 620, 1, 0, 0, 0, 620, 621, 5, 80, 0, 0, 621, 623, 3, 74, 37, 0, 622, 624, 3, 78, 39, 0, 623, 622, 1, 0, 0, 0, 623, 624, 1, 0, 0, 0, 624, 625, 1, 0, 0, 0, 625, 626, 5, 126, 0, 0, 626, 61, 1, 0, 0, 0, 627, 628, 5, 44, 0, 0, 628, 630, 3, 146, 73, 0, 629, 631, 3, 22, 11, 0, 630, 629, 1, 0, 0, 0, 630, 631, 1, 0, 0, 0, 631, 632, 1, 0, 0, 0, 632, 633, 5, 76, 0, 0, 633, 634, 3, 148, 74, 0, 634, 635, 5, 125, 0, 0, 635, 636, 3, 130, 65, 0, 636, 637, 5, 124, 0, 0, 637, 639, 3, 130, 65, 0, 638, 640, 3, 64, 32, 0, 639, 638, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 642, 1, 0, 0, 0, 641, 643, 3, 78, 39, 0, 642, 641, 1, 0, 0, 0, 642, 643, 1, 0, 0, 0, 643, 644, 1, 0, 0, 0, 644, 645, 5, 126, 0, 0, 645, 63, 1, 0, 0, 0, 646, 647, 5, 4, 0, 0, 647, 656, 5, 7, 0, 0, 648, 649, 5, 4, 0, 0, 649, 650, 7, 1, 0, 0, 650, 651, 5, 8, 0, 0, 651, 652, 5, 131, 0, 0, 652, 653, 3, 76, 38, 0, 653, 654, 5, 132, 0, 0, 654, 656, 1, 0, 0, 0, 655, 646, 1, 0, 0, 0, 655, 648, 1, 0, 0, 0, 656, 65, 1, 0, 0, 0, 657, 658, 5, 59, 0, 0, 658, 659, 5, 131, 0, 0, 659, 664, 3, 114, 57, 0, 660, 661, 5, 127, 0, 0, 661, 663, 3, 114, 57, 0, 662, 660, 1, 0, 0, 0, 663, 666, 1, 0, 0, 0, 664, 662, 1, 0, 0, 0, 664, 665, 1, 0, 0, 0, 665, 667, 1, 0, 0, 0, 666, 664, 1, 0, 0, 0, 667, 668, 5, 132, 0, 0, 668, 67, 1, 0, 0, 0, 669, 670, 5, 45, 0, 0, 670, 671, 3, 146, 73, 0, 671, 672, 5, 76, 0, 0, 672, 673, 3, 148, 74, 0, 673, 674, 5, 46, 0, 0, 674, 675, 3, 146, 73, 0, 675, 676, 5, 125, 0, 0, 676, 678, 3, 130, 65, 0, 677, 679, 3, 78, 39, 0, 678, 677, 1, 0, 0, 0, 678, 679, 1, 0, 0, 0, 679, 680, 1, 0, 0, 0, 680, 681, 5, 126, 0, 0, 681, 69, 1, 0, 0, 0, 682, 683, 5, 79, 0, 0, 683, 684, 3, 130, 65, 0, 684, 71, 1, 0, 0, 0, 685, 686, 7, 2, 0, 0, 686, 73, 1, 0, 0, 0, 687, 706, 5, 82, 0, 0, 688, 689, 5, 37, 0, 0, 689, 706, 3, 146, 73, 0, 690, 691, 5, 30, 0, 0, 691, 706, 3, 146, 73, 0, 692, 693, 5, 39, 0, 0, 693, 702, 5, 131, 0, 0, 694, 699, 3, 26, 13, 0, 695, 696, 5, 127, 0, 0, 696, 698, 3, 26, 13, 0, 697, 695, 1, 0, 0, 0, 698, 701, 1, 0, 0, 0, 699, 697, 1, 0, 0, 0, 699, 700, 1, 0, 0, 0, 700, 703, 1, 0, 0, 0, 701, 699, 1, 0, 0, 0, 702, 694, 1, 0, 0, 0, 702, 703, 1, 0, 0, 0, 703, 704, 1, 0, 0, 0, 704, 706, 5, 132, 0, 0, 705, 687, 1, 0, 0, 0, 705, 688, 1, 0, 0, 0, 705, 690, 1, 0, 0, 0, 705, 692, 1, 0, 0, 0, 706, 75, 1, 0, 0, 0, 707, 712, 3, 146, 73, 0, 708, 709, 5, 127, 0, 0, 709, 711, 3, 146, 73, 0, 710, 708, 1, 0, 0, 0, 711, 714, 1, 0, 0, 0, 712, 710, 1, 0, 0, 0, 712, 713, 1, 0, 0, 0, 713, 77, 1, 0, 0, 0, 714, 712, 1, 0, 0, 0, 715, 716, 5, 81, 0, 0, 716, 720, 5, 129, 0, 0, 717, 719, 3, 80, 40, 0, 718, 717, 1, 0, 0, 0, 719, 722, 1, 0, 0, 0, 720, 718, 1, 0, 0, 0, 720, 721, 1, 0, 0, 0, 721, 723, 1, 0, 0, 0, 722, 720, 1, 0, 0, 0, 723, 724, 5, 130, 0, 0, 724, 79, 1, 0, 0, 0, 725, 726, 5, 17, 0, 0, 726, 727, 3, 146, 73, 0, 727, 728, 5, 76, 0, 0, 728, 729, 3, 148, 74, 0, 729, 730, 5, 131, 0, 0, 730, 731, 3, 76, 38, 0, 731, 732, 5, 132, 0, 0, 732, 733, 5, 126, 0, 0, 733, 800, 1, 0, 0, 0, 734, 735, 5, 55, 0, 0, 735, 736, 3, 146, 73, 0, 736, 737, 5, 76, 0, 0, 737, 738, 3, 148, 74, 0, 738, 739, 5, 125, 0, 0, 739, 740, 3, 130, 65, 0, 740, 741, 3, 82, 41, 0, 741, 742, 5, 126, 0, 0, 742, 800, 1, 0, 0, 0, 743, 744, 5, 56, 0, 0, 744, 745, 3, 146, 73, 0, 745, 746, 5, 76, 0, 0, 746, 747, 3, 148, 74, 0, 747, 748, 5, 125, 0, 0, 748, 749, 3, 136, 68, 0, 749, 750, 3, 48, 24, 0, 750, 751, 3, 82, 41, 0, 751, 752, 5, 126, 0, 0, 752, 800, 1, 0, 0, 0, 753, 754, 5, 38, 0, 0, 754, 755, 3, 146, 73, 0, 755, 756, 5, 76, 0, 0, 756, 757, 3, 148, 74, 0, 757, 758, 5, 125, 0, 0, 758, 760, 3, 146, 73, 0, 759, 761, 3, 28, 14, 0, 760, 759, 1, 0, 0, 0, 760, 761, 1, 0, 0, 0, 761, 763, 1, 0, 0, 0, 762, 764, 3, 66, 33, 0, 763, 762, 1, 0, 0, 0, 763, 764, 1, 0, 0, 0, 764, 765, 1, 0, 0, 0, 765, 766, 5, 126, 0, 0, 766, 800, 1, 0, 0, 0, 767, 768, 5, 1, 0, 0, 768, 769, 3, 146, 73, 0, 769, 770, 5, 76, 0, 0, 770, 771, 3, 148, 74, 0, 771, 772, 5, 125, 0, 0, 772, 773, 3, 146, 73, 0, 773, 774, 5, 47, 0, 0, 774, 775, 3, 130, 65, 0, 775, 776, 5, 126, 0, 0, 776, 800, 1, 0, 0, 0, 777, 778, 5, 45, 0, 0, 778, 779, 3, 146, 73, 0, 779, 780, 5, 76, 0, 0, 780, 781, 3, 148, 74, 0, 781, 782, 5, 125, 0, 0, 782, 785, 3, 146, 73, 0, 783, 784, 5, 47, 0, 0, 784, 786, 3, 130, 65, 0, 785, 783, 1, 0, 0, 0, 785, 786, 1, 0, 0, 0, 786, 787, 1, 0, 0, 0, 787, 788, 5, 126, 0, 0, 788, 800, 1, 0, 0, 0, 789, 790, 5, 16, 0, 0, 790, 791, 3, 146, 73, 0, 791, 792, 5, 76, 0, 0, 792, 793, 3, 148, 74, 0, 793, 794, 5, 125, 0, 0, 794, 795, 3, 146, 73, 0, 795, 796, 5, 128, 0, 0, 796, 797, 3, 146, 73, 0, 797, 798, 5, 126, 0, 0, 798, 800, 1, 0, 0, 0, 799, 725, 1, 0, 0, 0, 799, 734, 1, 0, 0, 0, 799, 743, 1, 0, 0, 0, 799, 753, 1, 0, 0, 0, 799, 767, 1, 0, 0, 0, 799, 777, 1, 0, 0, 0, 799, 789, 1, 0, 0, 0, 800, 81, 1, 0, 0, 0, 801, 802, 5, 131, 0, 0, 802, 807, 3, 84, 42, 0, 803, 804, 5, 127, 0, 0, 804, 806, 3, 84, 42, 0, 805, 803, 1, 0, 0, 0, 806, 809, 1, 0, 0, 0, 807, 805, 1, 0, 0, 0, 807, 808, 1, 0, 0, 0, 808, 810, 1, 0, 0, 0, 809, 807, 1, 0, 0, 0, 810, 811, 5, 132, 0, 0, 811, 83, 1, 0, 0, 0, 812, 813, 7, 3, 0, 0, 813, 85, 1, 0, 0, 0, 814, 815, 5, 54, 0, 0, 815, 816, 3, 88, 44, 0, 816, 87, 1, 0, 0, 0, 817, 820, 3, 90, 45, 0, 818, 820, 3, 94, 47, 0, 819, 817, 1, 0, 0, 0, 819, 818, 1, 0, 0, 0, 820, 89, 1, 0, 0, 0, 821, 822, 5, 55, 0, 0, 822, 823, 3, 146, 73, 0, 823, 824, 5, 76, 0, 0, 824, 825, 3, 148, 74, 0, 825, 826, 5, 64, 0, 0, 826, 827, 3, 146, 73, 0, 827, 828, 5, 125, 0, 0, 828, 829, 3, 130, 65, 0, 829, 830, 5, 65, 0, 0, 830, 833, 3, 92, 46, 0, 831, 832, 5, 66, 0, 0, 832, 834, 3, 138, 69, 0, 833, 831, 1, 0, 0, 0, 833, 834, 1, 0, 0, 0, 834, 835, 1, 0, 0, 0, 835, 836, 5, 126, 0, 0, 836, 91, 1, 0, 0, 0, 837, 844, 5, 98, 0, 0, 838, 839, 5, 99, 0, 0, 839, 840, 5, 133, 0, 0, 840, 841, 3, 130, 65, 0, 841, 842, 5, 134, 0, 0, 842, 844, 1, 0, 0, 0, 843, 837, 1, 0, 0, 0, 843, 838, 1, 0, 0, 0, 844, 93, 1, 0, 0, 0, 845, 846, 5, 56, 0, 0, 846, 847, 3, 146, 73, 0, 847, 848, 5, 76, 0, 0, 848, 849, 3, 148, 74, 0, 849, 850, 5, 129, 0, 0, 850, 851, 3, 96, 48, 0, 851, 852, 3, 96, 48, 0, 852, 853, 5, 130, 0, 0, 853, 95, 1, 0, 0, 0, 854, 855, 3, 48, 24, 0, 855, 856, 5, 57, 0, 0, 856, 857, 3, 146, 73, 0, 857, 858, 5, 76, 0, 0, 858, 859, 3, 148, 74, 0, 859, 861, 3, 136, 68, 0, 860, 862, 5, 104, 0, 0, 861, 860, 1, 0, 0, 0, 861, 862, 1, 0, 0, 0, 862, 865, 1, 0, 0, 0, 863, 864, 5, 72, 0, 0, 864, 866, 3, 148, 74, 0, 865, 863, 1, 0, 0, 0, 865, 866, 1, 0, 0, 0, 866, 868, 1, 0, 0, 0, 867, 869, 5, 73, 0, 0, 868, 867, 1, 0, 0, 0, 868, 869, 1, 0, 0, 0, 869, 872, 1, 0, 0, 0, 870, 871, 5, 74, 0, 0, 871, 873, 3, 148, 74, 0, 872, 870, 1, 0, 0, 0, 872, 873, 1, 0, 0, 0, 873, 875, 1, 0, 0, 0, 874, 876, 5, 75, 0, 0, 875, 874, 1, 0, 0, 0, 875, 876, 1, 0, 0, 0, 876, 877, 1, 0, 0, 0, 877, 878, 5, 126, 0, 0, 878, 97, 1, 0, 0, 0, 879, 880, 5, 48, 0, 0, 880, 881, 3, 146, 73, 0, 881, 882, 5, 49, 0, 0, 882, 884, 3, 146, 73, 0, 883, 885, 3, 28, 14, 0, 884, 883, 1, 0, 0, 0, 884, 885, 1, 0, 0, 0, 885, 888, 1, 0, 0, 0, 886, 887, 5, 76, 0, 0, 887, 889, 3, 148, 74, 0, 888, 886, 1, 0, 0, 0, 888, 889, 1, 0, 0, 0, 889, 892, 1, 0, 0, 0, 890, 891, 5, 71, 0, 0, 891, 893, 5, 139, 0, 0, 892, 890, 1, 0, 0, 0, 892, 893, 1, 0, 0, 0, 893, 894, 1, 0, 0, 0, 894, 898, 5, 129, 0, 0, 895, 897, 3, 100, 50, 0, 896, 895, 1, 0, 0, 0, 897, 900, 1, 0, 0, 0, 898, 896, 1, 0, 0, 0, 898, 899, 1, 0, 0, 0, 899, 901, 1, 0, 0, 0, 900, 898, 1, 0, 0, 0, 901, 902, 5, 130, 0, 0, 902, 99, 1, 0, 0, 0, 903, 904, 5, 53, 0, 0, 904, 910, 3, 88, 44, 0, 905, 910, 3, 112, 56, 0, 906, 910, 3, 108, 54, 0, 907, 910, 3, 102, 51, 0, 908, 910, 3, 110, 55, 0, 909, 903, 1, 0, 0, 0, 909, 905, 1, 0, 0, 0, 909, 906, 1, 0, 0, 0, 909, 907, 1, 0, 0, 0, 909, 908, 1, 0, 0, 0, 910, 101, 1, 0, 0, 0, 911, 912, 5, 2, 0, 0, 912, 916, 5, 129, 0, 0, 913, 915, 3, 104, 52, 0, 914, 913, 1, 0, 0, 0, 915, 918, 1, 0, 0, 0, 916, 914, 1, 0, 0, 0, 916, 917, 1, 0, 0, 0, 917, 919, 1, 0, 0, 0, 918, 916, 1, 0, 0, 0, 919, 920, 5, 130, 0, 0, 920, 921, 5, 126, 0, 0, 921, 103, 1, 0, 0, 0, 922, 923, 3, 146, 73, 0, 923, 924, 5, 52, 0, 0, 924, 925, 5, 55, 0, 0, 925, 926, 3, 146, 73, 0, 926, 927, 5, 126, 0, 0, 927, 937, 1, 0, 0, 0, 928, 929, 3, 146, 73, 0, 929, 930, 5, 52, 0, 0, 930, 931, 5, 56, 0, 0, 931, 932, 3, 146, 73, 0, 932, 933, 5, 128, 0, 0, 933, 934, 3, 146, 73, 0, 934, 935, 5, 126, 0, 0, 935, 937, 1, 0, 0, 0, 936, 922, 1, 0, 0, 0, 936, 928, 1, 0, 0, 0, 937, 105, 1, 0, 0, 0, 938, 939, 3, 26, 13, 0, 939, 940, 5, 12, 0, 0, 940, 945, 5, 47, 0, 0, 941, 942, 5, 128, 0, 0, 942, 944, 3, 146, 73, 0, 943, 941, 1, 0, 0, 0, 944, 947, 1, 0, 0, 0, 945, 943, 1, 0, 0, 0, 945, 946, 1, 0, 0, 0, 946, 948, 1, 0, 0, 0, 947, 945, 1, 0, 0, 0, 948, 949, 5, 126, 0, 0, 949, 107, 1, 0, 0, 0, 950, 951, 5, 50, 0, 0, 951, 952, 3, 146, 73, 0, 952, 953, 5, 52, 0, 0, 953, 954, 5, 55, 0, 0, 954, 955, 3, 146, 73, 0, 955, 956, 5, 126, 0, 0, 956, 109, 1, 0, 0, 0, 957, 958, 5, 61, 0, 0, 958, 959, 3, 146, 73, 0, 959, 960, 5, 62, 0, 0, 960, 961, 5, 63, 0, 0, 961, 962, 5, 59, 0, 0, 962, 963, 5, 45, 0, 0, 963, 964, 3, 146, 73, 0, 964, 965, 5, 60, 0, 0, 965, 966, 5, 56, 0, 0, 966, 967, 3, 146, 73, 0, 967, 968, 5, 128, 0, 0, 968, 969, 3, 146, 73, 0, 969, 970, 5, 126, 0, 0, 970, 111, 1, 0, 0, 0, 971, 972, 5, 50, 0, 0, 972, 973, 3, 114, 57, 0, 973, 974, 5, 52, 0, 0, 974, 977, 3, 118, 59, 0, 975, 976, 5, 28, 0, 0, 976, 978, 3, 148, 74, 0, 977, 975, 1, 0, 0, 0, 977, 978, 1, 0, 0, 0, 978, 979, 1, 0, 0, 0, 979, 980, 5, 126, 0, 0, 980, 113, 1, 0, 0, 0, 981, 982, 3, 146, 73, 0, 982, 983, 5, 128, 0, 0, 983, 984, 3, 116, 58, 0, 984, 115, 1, 0, 0, 0, 985, 997, 3, 146, 73, 0, 986, 997, 5, 93, 0, 0, 987, 997, 5, 83, 0, 0, 988, 997, 5, 84, 0, 0, 989, 997, 5, 90, 0, 0, 990, 997, 5, 91, 0, 0, 991, 997, 5, 92, 0, 0, 992, 997, 5, 94, 0, 0, 993, 997, 5, 95, 0, 0, 994, 997, 5, 96, 0, 0, 995, 997, 5, 97, 0, 0, 996, 985, 1, 0, 0, 0, 996, 986, 1, 0, 0, 0, 996, 987, 1, 0, 0, 0, 996, 988, 1, 0, 0, 0, 996, 989, 1, 0, 0, 0, 996, 990, 1, 0, 0, 0, 996, 991, 1, 0, 0, 0, 996, 992, 1, 0, 0, 0, 996, 993, 1, 0, 0, 0, 996, 994, 1, 0, 0, 0, 996, 995, 1, 0, 0, 0, 997, 117, 1, 0, 0, 0, 998, 999, 5, 55, 0, 0, 999, 1000, 3, 146, 73, 0, 1000, 1001, 5, 128, 0, 0, 1001, 1002, 3, 120, 60, 0, 1002, 1029, 1, 0, 0, 0, 1003, 1004, 5, 56, 0, 0, 1004, 1005, 3, 146, 73, 0, 1005, 1006, 5, 128, 0, 0, 1006, 1007, 3, 146, 73, 0, 1007, 1008, 5, 128, 0, 0, 1008, 1009, 3, 122, 61, 0, 1009, 1029, 1, 0, 0, 0, 1010, 1011, 5, 38, 0, 0, 1011, 1013, 3, 146, 73, 0, 1012, 1014, 3, 28, 14, 0, 1013, 1012, 1, 0, 0, 0, 1013, 1014, 1, 0, 0, 0, 1014, 1015, 1, 0, 0, 0, 1015, 1016, 5, 128, 0, 0, 1016, 1017, 3, 114, 57, 0, 1017, 1029, 1, 0, 0, 0, 1018, 1019, 5, 40, 0, 0, 1019, 1020, 3, 146, 73, 0, 1020, 1021, 5, 128, 0, 0, 1021, 1023, 3, 146, 73, 0, 1022, 1024, 3, 28, 14, 0, 1023, 1022, 1, 0, 0, 0, 1023, 1024, 1, 0, 0, 0, 1024, 1026, 1, 0, 0, 0, 1025, 1027, 3, 124, 62, 0, 1026, 1025, 1, 0, 0, 0, 1026, 1027, 1, 0, 0, 0, 1027, 1029, 1, 0, 0, 0, 1028, 998, 1, 0, 0, 0, 1028, 1003, 1, 0, 0, 0, 1028, 1010, 1, 0, 0, 0, 1028, 1018, 1, 0, 0, 0, 1029, 119, 1, 0, 0, 0, 1030, 1031, 7, 4, 0, 0, 1031, 121, 1, 0, 0, 0, 1032, 1033, 7, 5, 0, 0, 1033, 123, 1, 0, 0, 0, 1034, 1035, 5, 58, 0, 0, 1035, 1039, 5, 129, 0, 0, 1036, 1038, 3, 126, 63, 0, 1037, 1036, 1, 0, 0, 0, 1038, 1041, 1, 0, 0, 0, 1039, 1037, 1, 0, 0, 0, 1039, 1040, 1, 0, 0, 0, 1040, 1042, 1, 0, 0, 0, 1041, 1039, 1, 0, 0, 0, 1042, 1043, 5, 130, 0, 0, 1043, 125, 1, 0, 0, 0, 1044, 1045, 3, 146, 73, 0, 1045, 1046, 5, 52, 0, 0, 1046, 1047, 5, 3, 0, 0, 1047, 1048, 5, 17, 0, 0, 1048, 1049, 5, 131, 0, 0, 1049, 1050, 3, 76, 38, 0, 1050, 1051, 5, 132, 0, 0, 1051, 1052, 5, 126, 0, 0, 1052, 1141, 1, 0, 0, 0, 1053, 1054, 3, 146, 73, 0, 1054, 1055, 5, 52, 0, 0, 1055, 1056, 5, 55, 0, 0, 1056, 1063, 3, 146, 73, 0, 1057, 1058, 5, 60, 0, 0, 1058, 1059, 5, 56, 0, 0, 1059, 1060, 3, 146, 73, 0, 1060, 1061, 5, 128, 0, 0, 1061, 1062, 3, 146, 73, 0, 1062, 1064, 1, 0, 0, 0, 1063, 1057, 1, 0, 0, 0, 1063, 1064, 1, 0, 0, 0, 1064, 1065, 1, 0, 0, 0, 1065, 1066, 5, 126, 0, 0, 1066, 1141, 1, 0, 0, 0, 1067, 1068, 3, 146, 73, 0, 1068, 1069, 5, 52, 0, 0, 1069, 1070, 5, 56, 0, 0, 1070, 1071, 3, 146, 73, 0, 1071, 1072, 5, 128, 0, 0, 1072, 1079, 3, 146, 73, 0, 1073, 1074, 5, 60, 0, 0, 1074, 1075, 5, 56, 0, 0, 1075, 1076, 3, 146, 73, 0, 1076, 1077, 5, 128, 0, 0, 1077, 1078, 3, 146, 73, 0, 1078, 1080, 1, 0, 0, 0, 1079, 1073, 1, 0, 0, 0, 1079, 1080, 1, 0, 0, 0, 1080, 1081, 1, 0, 0, 0, 1081, 1082, 5, 126, 0, 0, 1082, 1141, 1, 0, 0, 0, 1083, 1084, 3, 146, 73, 0, 1084, 1085, 5, 52, 0, 0, 1085, 1086, 5, 38, 0, 0, 1086, 1088, 3, 146, 73, 0, 1087, 1089, 3, 28, 14, 0, 1088, 1087, 1, 0, 0, 0, 1088, 1089, 1, 0, 0, 0, 1089, 1096, 1, 0, 0, 0, 1090, 1091, 5, 60, 0, 0, 1091, 1092, 5, 56, 0, 0, 1092, 1093, 3, 146, 73, 0, 1093, 1094, 5, 128, 0, 0, 1094, 1095, 3, 146, 73, 0, 1095, 1097, 1, 0, 0, 0, 1096, 1090, 1, 0, 0, 0, 1096, 1097, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1099, 5, 126, 0, 0, 1099, 1141, 1, 0, 0, 0, 1100, 1101, 3, 146, 73, 0, 1101, 1102, 5, 52, 0, 0, 1102, 1103, 5, 1, 0, 0, 1103, 1104, 3, 146, 73, 0, 1104, 1105, 5, 58, 0, 0, 1105, 1109, 5, 129, 0, 0, 1106, 1108, 3, 106, 53, 0, 1107, 1106, 1, 0, 0, 0, 1108, 1111, 1, 0, 0, 0, 1109, 1107, 1, 0, 0, 0, 1109, 1110, 1, 0, 0, 0, 1110, 1112, 1, 0, 0, 0, 1111, 1109, 1, 0, 0, 0, 1112, 1113, 5, 130, 0, 0, 1113, 1114, 5, 126, 0, 0, 1114, 1141, 1, 0, 0, 0, 1115, 1116, 3, 146, 73, 0, 1116, 1117, 5, 52, 0, 0, 1117, 1118, 5, 45, 0, 0, 1118, 1119, 3, 146, 73, 0, 1119, 1120, 5, 126, 0, 0, 1120, 1141, 1, 0, 0, 0, 1121, 1122, 3, 146, 73, 0, 1122, 1124, 5, 52, 0, 0, 1123, 1125, 5, 3, 0, 0, 1124, 1123, 1, 0, 0, 0, 1124, 1125, 1, 0, 0, 0, 1125, 1126, 1, 0, 0, 0, 1126, 1127, 5, 16, 0, 0, 1127, 1128, 3, 146, 73, 0, 1128, 1129, 5, 128, 0, 0, 1129, 1136, 3, 146, 73, 0, 1130, 1131, 5, 60, 0, 0, 1131, 1132, 5, 56, 0, 0, 1132, 1133, 3, 146, 73, 0, 1133, 1134, 5, 128, 0, 0, 1134, 1135, 3, 146, 73, 0, 1135, 1137, 1, 0, 0, 0, 1136, 1130, 1, 0, 0, 0, 1136, 1137, 1, 0, 0, 0, 1137, 1138, 1, 0, 0, 0, 1138, 1139, 5, 126, 0, 0, 1139, 1141, 1, 0, 0, 0, 1140, 1044, 1, 0, 0, 0, 1140, 1053, 1, 0, 0, 0, 1140, 1067, 1, 0, 0, 0, 1140, 1083, 1, 0, 0, 0, 1140, 1100, 1, 0, 0, 0, 1140, 1115, 1, 0, 0, 0, 1140, 1121, 1, 0, 0, 0, 1141, 127, 1, 0, 0, 0, 1142, 1143, 5, 45, 0, 0, 1143, 1144, 3, 146, 73, 0, 1144, 1145, 5, 52, 0, 0, 1145, 1146, 3, 146, 73, 0, 1146, 1147, 5, 128, 0, 0, 1147, 1149, 3, 146, 73, 0, 1148, 1150, 3, 124, 62, 0, 1149, 1148, 1, 0, 0, 0, 1149, 1150, 1, 0, 0, 0, 1150, 1151, 1, 0, 0, 0, 1151, 1152, 5, 126, 0, 0, 1152, 129, 1, 0, 0, 0, 1153, 1200, 3, 134, 67, 0, 1154, 1200, 5, 105, 0, 0, 1155, 1200, 5, 106, 0, 0, 1156, 1157, 5, 107, 0, 0, 1157, 1200, 3, 148, 74, 0, 1158, 1159, 5, 108, 0, 0, 1159, 1160, 5, 135, 0, 0, 1160, 1161, 3, 146, 73, 0, 1161, 1162, 5, 136, 0, 0, 1162, 1200, 1, 0, 0, 0, 1163, 1164, 5, 109, 0, 0, 1164, 1165, 5, 135, 0, 0, 1165, 1167, 3, 146, 73, 0, 1166, 1168, 3, 28, 14, 0, 1167, 1166, 1, 0, 0, 0, 1167, 1168, 1, 0, 0, 0, 1168, 1169, 1, 0, 0, 0, 1169, 1170, 5, 136, 0, 0, 1170, 1200, 1, 0, 0, 0, 1171, 1172, 5, 33, 0, 0, 1172, 1173, 5, 135, 0, 0, 1173, 1174, 3, 146, 73, 0, 1174, 1175, 5, 136, 0, 0, 1175, 1200, 1, 0, 0, 0, 1176, 1177, 5, 110, 0, 0, 1177, 1178, 5, 135, 0, 0, 1178, 1179, 3, 130, 65, 0, 1179, 1180, 5, 136, 0, 0, 1180, 1200, 1, 0, 0, 0, 1181, 1182, 5, 111, 0, 0, 1182, 1183, 5, 135, 0, 0, 1183, 1184, 3, 130, 65, 0, 1184, 1185, 5, 136, 0, 0, 1185, 1200, 1, 0, 0, 0, 1186, 1187, 5, 112, 0, 0, 1187, 1191, 5, 129, 0, 0, 1188, 1190, 3, 132, 66, 0, 1189, 1188, 1, 0, 0, 0, 1190, 1193, 1, 0, 0, 0, 1191, 1189, 1, 0, 0, 0, 1191, 1192, 1, 0, 0, 0, 1192, 1194, 1, 0, 0, 0, 1193, 1191, 1, 0, 0, 0, 1194, 1200, 5, 130, 0, 0, 1195, 1197, 3, 146, 73, 0, 1196, 1198, 3, 28, 14, 0, 1197, 1196, 1, 0, 0, 0, 1197, 1198, 1, 0, 0, 0, 1198, 1200, 1, 0, 0, 0, 1199, 1153, 1, 0, 0, 0, 1199, 1154, 1, 0, 0, 0, 1199, 1155, 1, 0, 0, 0, 1199, 1156, 1, 0, 0, 0, 1199, 1158, 1, 0, 0, 0, 1199, 1163, 1, 0, 0, 0, 1199, 1171, 1, 0, 0, 0, 1199, 1176, 1, 0, 0, 0, 1199, 1181, 1, 0, 0, 0, 1199, 1186, 1, 0, 0, 0, 1199, 1195, 1, 0, 0, 0, 1200, 131, 1, 0, 0, 0, 1201, 1202, 3, 146, 73, 0, 1202, 1203, 5, 125, 0, 0, 1203, 1204, 3, 130, 65, 0, 1204, 1205, 5, 126, 0, 0, 1205, 133, 1, 0, 0, 0, 1206, 1207, 7, 6, 0, 0, 1207, 135, 1, 0, 0, 0, 1208, 1209, 7, 7, 0, 0, 1209, 137, 1, 0, 0, 0, 1210, 1219, 3, 148, 74, 0, 1211, 1219, 5, 139, 0, 0, 1212, 1219, 5, 140, 0, 0, 1213, 1219, 5, 121, 0, 0, 1214, 1219, 5, 122, 0, 0, 1215, 1219, 5, 123, 0, 0, 1216, 1219, 3, 140, 70, 0, 1217, 1219, 3, 144, 72, 0, 1218, 1210, 1, 0, 0, 0, 1218, 1211, 1, 0, 0, 0, 1218, 1212, 1, 0, 0, 0, 1218, 1213, 1, 0, 0, 0, 1218, 1214, 1, 0, 0, 0, 1218, 1215, 1, 0, 0, 0, 1218, 1216, 1, 0, 0, 0, 1218, 1217, 1, 0, 0, 0, 1219, 139, 1, 0, 0, 0, 1220, 1229, 5, 129, 0, 0, 1221, 1226, 3, 142, 71, 0, 1222, 1223, 5, 127, 0, 0, 1223, 1225, 3, 142, 71, 0, 1224, 1222, 1, 0, 0, 0, 1225, 1228, 1, 0, 0, 0, 1226, 1224, 1, 0, 0, 0, 1226, 1227, 1, 0, 0, 0, 1227, 1230, 1, 0, 0, 0, 1228, 1226, 1, 0, 0, 0, 1229, 1221, 1, 0, 0, 0, 1229, 1230, 1, 0, 0, 0, 1230, 1231, 1, 0, 0, 0, 1231, 1232, 5, 130, 0, 0, 1232, 141, 1, 0, 0, 0, 1233, 1234, 3, 148, 74, 0, 1234, 1235, 5, 125, 0, 0, 1235, 1236, 3, 138, 69, 0, 1236, 143, 1, 0, 0, 0, 1237, 1246, 5, 131, 0, 0, 1238, 1243, 3, 138, 69, 0, 1239, 1240, 5, 127, 0, 0, 1240, 1242, 3, 138, 69, 0, 1241, 1239, 1, 0, 0, 0, 1242, 1245, 1, 0, 0, 0, 1243, 1241, 1, 0, 0, 0, 1243, 1244, 1, 0, 0, 0, 1244, 1247, 1, 0, 0, 0, 1245, 1243, 1, 0, 0, 0, 1246, 1238, 1, 0, 0, 0, 1246, 1247, 1, 0, 0, 0, 1247, 1248, 1, 0, 0, 0, 1248, 1249, 5, 132, 0, 0, 1249, 145, 1, 0, 0, 0, 1250, 1251, 7, 8, 0, 0, 1251, 147, 1, 0, 0, 0, 1252, 1253, 5, 142, 0, 0, 1253, 149, 1, 0, 0, 0, 110, 162, 169, 190, 202, 214, 234, 242, 249, 255, 267, 270, 276, 287, 296, 306, 309, 311, 315, 323, 335, 340, 349, 352, 367, 373, 385, 394, 402, 415, 418, 428, 432, 438, 445, 451, 459, 467, 480, 487, 491, 496, 507, 513, 523, 528, 534, 545, 572, 599, 604, 615, 618, 623, 630, 639, 642, 655, 664, 678, 699, 702, 705, 712, 720, 760, 763, 785, 799, 807, 819, 833, 843, 861, 865, 868, 872, 875, 884, 888, 892, 898, 909, 916, 936, 945, 977, 996, 1013, 1023, 1026, 1028, 1039, 1063, 1079, 1088, 1096, 1109, 1124, 1136, 1140, 1149, 1167, 1191, 1197, 1199, 1218, 1226, 1229, 1243, 1246] \ No newline at end of file +[4, 1, 146, 1264, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 163, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 168, 8, 1, 10, 1, 12, 1, 171, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 189, 8, 3, 10, 3, 12, 3, 192, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 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, 3, 5, 215, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 235, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 243, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 248, 8, 10, 10, 10, 12, 10, 251, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 256, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 266, 8, 10, 10, 10, 12, 10, 269, 9, 10, 3, 10, 271, 8, 10, 1, 10, 1, 10, 5, 10, 275, 8, 10, 10, 10, 12, 10, 278, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 286, 8, 11, 10, 11, 12, 11, 289, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 297, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 305, 8, 12, 10, 12, 12, 12, 308, 9, 12, 3, 12, 310, 8, 12, 3, 12, 312, 8, 12, 1, 13, 1, 13, 3, 13, 316, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 322, 8, 14, 10, 14, 12, 14, 325, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 336, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 341, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 350, 8, 17, 1, 18, 3, 18, 353, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 368, 8, 18, 1, 18, 1, 18, 1, 18, 1, 19, 3, 19, 374, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 384, 8, 19, 10, 19, 12, 19, 387, 9, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 395, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 403, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 411, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 424, 8, 20, 1, 21, 3, 21, 427, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 437, 8, 21, 1, 21, 1, 21, 3, 21, 441, 8, 21, 1, 21, 1, 21, 5, 21, 445, 8, 21, 10, 21, 12, 21, 448, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 454, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 460, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 468, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 476, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 489, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 496, 8, 24, 1, 24, 1, 24, 3, 24, 500, 8, 24, 1, 25, 5, 25, 503, 8, 25, 10, 25, 12, 25, 506, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 516, 8, 25, 1, 25, 1, 25, 5, 25, 520, 8, 25, 10, 25, 12, 25, 523, 9, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 532, 8, 26, 1, 27, 1, 27, 1, 27, 3, 27, 537, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 543, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 552, 8, 27, 10, 27, 12, 27, 555, 9, 27, 1, 27, 1, 27, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 581, 8, 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, 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, 3, 29, 608, 8, 29, 1, 30, 1, 30, 1, 30, 3, 30, 613, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 624, 8, 30, 1, 30, 3, 30, 627, 8, 30, 1, 30, 1, 30, 1, 30, 3, 30, 632, 8, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 3, 31, 639, 8, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 648, 8, 31, 1, 31, 3, 31, 651, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 664, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 5, 33, 671, 8, 33, 10, 33, 12, 33, 674, 9, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 687, 8, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 5, 37, 706, 8, 37, 10, 37, 12, 37, 709, 9, 37, 3, 37, 711, 8, 37, 1, 37, 3, 37, 714, 8, 37, 1, 38, 1, 38, 1, 38, 5, 38, 719, 8, 38, 10, 38, 12, 38, 722, 9, 38, 1, 39, 1, 39, 1, 39, 5, 39, 727, 8, 39, 10, 39, 12, 39, 730, 9, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 769, 8, 40, 1, 40, 3, 40, 772, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 794, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 808, 8, 40, 1, 41, 1, 41, 1, 41, 1, 41, 5, 41, 814, 8, 41, 10, 41, 12, 41, 817, 9, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 3, 44, 828, 8, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 842, 8, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 852, 8, 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, 48, 1, 48, 1, 48, 1, 48, 3, 48, 870, 8, 48, 1, 48, 1, 48, 3, 48, 874, 8, 48, 1, 48, 3, 48, 877, 8, 48, 1, 48, 1, 48, 3, 48, 881, 8, 48, 1, 48, 3, 48, 884, 8, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 893, 8, 49, 1, 49, 1, 49, 3, 49, 897, 8, 49, 1, 49, 1, 49, 3, 49, 901, 8, 49, 1, 49, 1, 49, 5, 49, 905, 8, 49, 10, 49, 12, 49, 908, 9, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 918, 8, 50, 1, 51, 1, 51, 1, 51, 5, 51, 923, 8, 51, 10, 51, 12, 51, 926, 9, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 945, 8, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 5, 53, 952, 8, 53, 10, 53, 12, 53, 955, 9, 53, 1, 53, 1, 53, 1, 54, 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, 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, 3, 56, 986, 8, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 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, 1006, 8, 58, 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, 1023, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1033, 8, 59, 1, 59, 3, 59, 1036, 8, 59, 3, 59, 1038, 8, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 5, 62, 1047, 8, 62, 10, 62, 12, 62, 1050, 9, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1073, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1089, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1098, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1106, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 5, 63, 1117, 8, 63, 10, 63, 12, 63, 1120, 9, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1134, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1146, 8, 63, 1, 63, 1, 63, 3, 63, 1150, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1159, 8, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1177, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 5, 65, 1199, 8, 65, 10, 65, 12, 65, 1202, 9, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1207, 8, 65, 3, 65, 1209, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1228, 8, 69, 1, 70, 1, 70, 1, 70, 1, 70, 5, 70, 1234, 8, 70, 10, 70, 12, 70, 1237, 9, 70, 3, 70, 1239, 8, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 5, 72, 1251, 8, 72, 10, 72, 12, 72, 1254, 9, 72, 3, 72, 1256, 8, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 0, 0, 75, 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, 0, 9, 2, 0, 10, 10, 28, 28, 1, 0, 6, 7, 1, 0, 94, 98, 3, 0, 1, 1, 89, 93, 95, 96, 3, 0, 1, 1, 89, 90, 95, 96, 2, 0, 91, 93, 95, 96, 1, 0, 114, 121, 1, 0, 101, 104, 7, 0, 1, 3, 5, 28, 40, 40, 68, 68, 87, 88, 99, 99, 142, 142, 1367, 0, 162, 1, 0, 0, 0, 2, 164, 1, 0, 0, 0, 4, 174, 1, 0, 0, 0, 6, 178, 1, 0, 0, 0, 8, 202, 1, 0, 0, 0, 10, 214, 1, 0, 0, 0, 12, 216, 1, 0, 0, 0, 14, 223, 1, 0, 0, 0, 16, 234, 1, 0, 0, 0, 18, 236, 1, 0, 0, 0, 20, 249, 1, 0, 0, 0, 22, 281, 1, 0, 0, 0, 24, 311, 1, 0, 0, 0, 26, 313, 1, 0, 0, 0, 28, 317, 1, 0, 0, 0, 30, 335, 1, 0, 0, 0, 32, 337, 1, 0, 0, 0, 34, 349, 1, 0, 0, 0, 36, 352, 1, 0, 0, 0, 38, 373, 1, 0, 0, 0, 40, 423, 1, 0, 0, 0, 42, 426, 1, 0, 0, 0, 44, 451, 1, 0, 0, 0, 46, 488, 1, 0, 0, 0, 48, 499, 1, 0, 0, 0, 50, 504, 1, 0, 0, 0, 52, 531, 1, 0, 0, 0, 54, 533, 1, 0, 0, 0, 56, 558, 1, 0, 0, 0, 58, 607, 1, 0, 0, 0, 60, 609, 1, 0, 0, 0, 62, 635, 1, 0, 0, 0, 64, 663, 1, 0, 0, 0, 66, 665, 1, 0, 0, 0, 68, 677, 1, 0, 0, 0, 70, 690, 1, 0, 0, 0, 72, 693, 1, 0, 0, 0, 74, 713, 1, 0, 0, 0, 76, 715, 1, 0, 0, 0, 78, 723, 1, 0, 0, 0, 80, 807, 1, 0, 0, 0, 82, 809, 1, 0, 0, 0, 84, 820, 1, 0, 0, 0, 86, 822, 1, 0, 0, 0, 88, 827, 1, 0, 0, 0, 90, 829, 1, 0, 0, 0, 92, 851, 1, 0, 0, 0, 94, 853, 1, 0, 0, 0, 96, 862, 1, 0, 0, 0, 98, 887, 1, 0, 0, 0, 100, 917, 1, 0, 0, 0, 102, 919, 1, 0, 0, 0, 104, 944, 1, 0, 0, 0, 106, 946, 1, 0, 0, 0, 108, 958, 1, 0, 0, 0, 110, 965, 1, 0, 0, 0, 112, 979, 1, 0, 0, 0, 114, 989, 1, 0, 0, 0, 116, 1005, 1, 0, 0, 0, 118, 1037, 1, 0, 0, 0, 120, 1039, 1, 0, 0, 0, 122, 1041, 1, 0, 0, 0, 124, 1043, 1, 0, 0, 0, 126, 1149, 1, 0, 0, 0, 128, 1151, 1, 0, 0, 0, 130, 1208, 1, 0, 0, 0, 132, 1210, 1, 0, 0, 0, 134, 1215, 1, 0, 0, 0, 136, 1217, 1, 0, 0, 0, 138, 1227, 1, 0, 0, 0, 140, 1229, 1, 0, 0, 0, 142, 1242, 1, 0, 0, 0, 144, 1246, 1, 0, 0, 0, 146, 1259, 1, 0, 0, 0, 148, 1261, 1, 0, 0, 0, 150, 151, 3, 6, 3, 0, 151, 152, 5, 0, 0, 1, 152, 163, 1, 0, 0, 0, 153, 154, 3, 20, 10, 0, 154, 155, 5, 0, 0, 1, 155, 163, 1, 0, 0, 0, 156, 157, 3, 50, 25, 0, 157, 158, 5, 0, 0, 1, 158, 163, 1, 0, 0, 0, 159, 160, 3, 2, 1, 0, 160, 161, 5, 0, 0, 1, 161, 163, 1, 0, 0, 0, 162, 150, 1, 0, 0, 0, 162, 153, 1, 0, 0, 0, 162, 156, 1, 0, 0, 0, 162, 159, 1, 0, 0, 0, 163, 1, 1, 0, 0, 0, 164, 165, 5, 35, 0, 0, 165, 169, 5, 130, 0, 0, 166, 168, 3, 8, 4, 0, 167, 166, 1, 0, 0, 0, 168, 171, 1, 0, 0, 0, 169, 167, 1, 0, 0, 0, 169, 170, 1, 0, 0, 0, 170, 172, 1, 0, 0, 0, 171, 169, 1, 0, 0, 0, 172, 173, 5, 131, 0, 0, 173, 3, 1, 0, 0, 0, 174, 175, 5, 36, 0, 0, 175, 176, 3, 148, 74, 0, 176, 177, 5, 127, 0, 0, 177, 5, 1, 0, 0, 0, 178, 179, 5, 4, 0, 0, 179, 180, 3, 146, 73, 0, 180, 181, 5, 77, 0, 0, 181, 182, 3, 148, 74, 0, 182, 183, 5, 71, 0, 0, 183, 184, 3, 148, 74, 0, 184, 185, 5, 70, 0, 0, 185, 186, 3, 148, 74, 0, 186, 190, 5, 130, 0, 0, 187, 189, 3, 8, 4, 0, 188, 187, 1, 0, 0, 0, 189, 192, 1, 0, 0, 0, 190, 188, 1, 0, 0, 0, 190, 191, 1, 0, 0, 0, 191, 193, 1, 0, 0, 0, 192, 190, 1, 0, 0, 0, 193, 194, 5, 131, 0, 0, 194, 7, 1, 0, 0, 0, 195, 203, 3, 4, 2, 0, 196, 203, 3, 18, 9, 0, 197, 203, 3, 10, 5, 0, 198, 203, 3, 86, 43, 0, 199, 203, 3, 98, 49, 0, 200, 203, 3, 128, 64, 0, 201, 203, 3, 32, 16, 0, 202, 195, 1, 0, 0, 0, 202, 196, 1, 0, 0, 0, 202, 197, 1, 0, 0, 0, 202, 198, 1, 0, 0, 0, 202, 199, 1, 0, 0, 0, 202, 200, 1, 0, 0, 0, 202, 201, 1, 0, 0, 0, 203, 9, 1, 0, 0, 0, 204, 205, 5, 36, 0, 0, 205, 206, 5, 39, 0, 0, 206, 207, 3, 146, 73, 0, 207, 208, 5, 127, 0, 0, 208, 215, 1, 0, 0, 0, 209, 210, 5, 36, 0, 0, 210, 211, 5, 41, 0, 0, 211, 212, 3, 146, 73, 0, 212, 213, 5, 127, 0, 0, 213, 215, 1, 0, 0, 0, 214, 204, 1, 0, 0, 0, 214, 209, 1, 0, 0, 0, 215, 11, 1, 0, 0, 0, 216, 217, 5, 37, 0, 0, 217, 218, 5, 38, 0, 0, 218, 219, 3, 146, 73, 0, 219, 220, 5, 77, 0, 0, 220, 221, 3, 148, 74, 0, 221, 222, 5, 127, 0, 0, 222, 13, 1, 0, 0, 0, 223, 224, 5, 37, 0, 0, 224, 225, 5, 39, 0, 0, 225, 226, 3, 146, 73, 0, 226, 227, 5, 71, 0, 0, 227, 228, 3, 148, 74, 0, 228, 229, 5, 127, 0, 0, 229, 15, 1, 0, 0, 0, 230, 235, 3, 10, 5, 0, 231, 235, 3, 12, 6, 0, 232, 235, 3, 14, 7, 0, 233, 235, 3, 32, 16, 0, 234, 230, 1, 0, 0, 0, 234, 231, 1, 0, 0, 0, 234, 232, 1, 0, 0, 0, 234, 233, 1, 0, 0, 0, 235, 17, 1, 0, 0, 0, 236, 237, 5, 38, 0, 0, 237, 238, 3, 146, 73, 0, 238, 239, 5, 77, 0, 0, 239, 242, 3, 148, 74, 0, 240, 241, 5, 78, 0, 0, 241, 243, 3, 148, 74, 0, 242, 240, 1, 0, 0, 0, 242, 243, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 245, 5, 127, 0, 0, 245, 19, 1, 0, 0, 0, 246, 248, 3, 16, 8, 0, 247, 246, 1, 0, 0, 0, 248, 251, 1, 0, 0, 0, 249, 247, 1, 0, 0, 0, 249, 250, 1, 0, 0, 0, 250, 252, 1, 0, 0, 0, 251, 249, 1, 0, 0, 0, 252, 253, 5, 39, 0, 0, 253, 255, 3, 146, 73, 0, 254, 256, 3, 22, 11, 0, 255, 254, 1, 0, 0, 0, 255, 256, 1, 0, 0, 0, 256, 257, 1, 0, 0, 0, 257, 258, 5, 77, 0, 0, 258, 259, 3, 148, 74, 0, 259, 260, 5, 71, 0, 0, 260, 270, 3, 148, 74, 0, 261, 262, 5, 82, 0, 0, 262, 267, 3, 26, 13, 0, 263, 264, 5, 128, 0, 0, 264, 266, 3, 26, 13, 0, 265, 263, 1, 0, 0, 0, 266, 269, 1, 0, 0, 0, 267, 265, 1, 0, 0, 0, 267, 268, 1, 0, 0, 0, 268, 271, 1, 0, 0, 0, 269, 267, 1, 0, 0, 0, 270, 261, 1, 0, 0, 0, 270, 271, 1, 0, 0, 0, 271, 272, 1, 0, 0, 0, 272, 276, 5, 130, 0, 0, 273, 275, 3, 34, 17, 0, 274, 273, 1, 0, 0, 0, 275, 278, 1, 0, 0, 0, 276, 274, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 279, 1, 0, 0, 0, 278, 276, 1, 0, 0, 0, 279, 280, 5, 131, 0, 0, 280, 21, 1, 0, 0, 0, 281, 282, 5, 136, 0, 0, 282, 287, 3, 24, 12, 0, 283, 284, 5, 128, 0, 0, 284, 286, 3, 24, 12, 0, 285, 283, 1, 0, 0, 0, 286, 289, 1, 0, 0, 0, 287, 285, 1, 0, 0, 0, 287, 288, 1, 0, 0, 0, 288, 290, 1, 0, 0, 0, 289, 287, 1, 0, 0, 0, 290, 291, 5, 137, 0, 0, 291, 23, 1, 0, 0, 0, 292, 293, 5, 42, 0, 0, 293, 296, 3, 146, 73, 0, 294, 295, 5, 126, 0, 0, 295, 297, 5, 32, 0, 0, 296, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 312, 1, 0, 0, 0, 298, 299, 5, 31, 0, 0, 299, 309, 3, 146, 73, 0, 300, 301, 5, 33, 0, 0, 301, 306, 3, 26, 13, 0, 302, 303, 5, 138, 0, 0, 303, 305, 3, 26, 13, 0, 304, 302, 1, 0, 0, 0, 305, 308, 1, 0, 0, 0, 306, 304, 1, 0, 0, 0, 306, 307, 1, 0, 0, 0, 307, 310, 1, 0, 0, 0, 308, 306, 1, 0, 0, 0, 309, 300, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 312, 1, 0, 0, 0, 311, 292, 1, 0, 0, 0, 311, 298, 1, 0, 0, 0, 312, 25, 1, 0, 0, 0, 313, 315, 3, 146, 73, 0, 314, 316, 3, 28, 14, 0, 315, 314, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 27, 1, 0, 0, 0, 317, 318, 5, 136, 0, 0, 318, 323, 3, 30, 15, 0, 319, 320, 5, 128, 0, 0, 320, 322, 3, 30, 15, 0, 321, 319, 1, 0, 0, 0, 322, 325, 1, 0, 0, 0, 323, 321, 1, 0, 0, 0, 323, 324, 1, 0, 0, 0, 324, 326, 1, 0, 0, 0, 325, 323, 1, 0, 0, 0, 326, 327, 5, 137, 0, 0, 327, 29, 1, 0, 0, 0, 328, 329, 5, 38, 0, 0, 329, 336, 3, 146, 73, 0, 330, 331, 5, 39, 0, 0, 331, 336, 3, 26, 13, 0, 332, 333, 5, 31, 0, 0, 333, 336, 3, 146, 73, 0, 334, 336, 3, 130, 65, 0, 335, 328, 1, 0, 0, 0, 335, 330, 1, 0, 0, 0, 335, 332, 1, 0, 0, 0, 335, 334, 1, 0, 0, 0, 336, 31, 1, 0, 0, 0, 337, 338, 5, 30, 0, 0, 338, 340, 3, 146, 73, 0, 339, 341, 3, 22, 11, 0, 340, 339, 1, 0, 0, 0, 340, 341, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 343, 5, 139, 0, 0, 343, 344, 3, 130, 65, 0, 344, 345, 5, 127, 0, 0, 345, 33, 1, 0, 0, 0, 346, 350, 3, 38, 19, 0, 347, 350, 3, 42, 21, 0, 348, 350, 3, 36, 18, 0, 349, 346, 1, 0, 0, 0, 349, 347, 1, 0, 0, 0, 349, 348, 1, 0, 0, 0, 350, 35, 1, 0, 0, 0, 351, 353, 5, 52, 0, 0, 352, 351, 1, 0, 0, 0, 352, 353, 1, 0, 0, 0, 353, 354, 1, 0, 0, 0, 354, 355, 5, 44, 0, 0, 355, 356, 3, 146, 73, 0, 356, 357, 5, 77, 0, 0, 357, 358, 3, 148, 74, 0, 358, 359, 5, 126, 0, 0, 359, 360, 3, 130, 65, 0, 360, 361, 5, 125, 0, 0, 361, 362, 3, 130, 65, 0, 362, 363, 5, 130, 0, 0, 363, 364, 5, 94, 0, 0, 364, 365, 5, 77, 0, 0, 365, 367, 3, 148, 74, 0, 366, 368, 3, 64, 32, 0, 367, 366, 1, 0, 0, 0, 367, 368, 1, 0, 0, 0, 368, 369, 1, 0, 0, 0, 369, 370, 5, 127, 0, 0, 370, 371, 5, 131, 0, 0, 371, 37, 1, 0, 0, 0, 372, 374, 3, 44, 22, 0, 373, 372, 1, 0, 0, 0, 373, 374, 1, 0, 0, 0, 374, 375, 1, 0, 0, 0, 375, 376, 5, 42, 0, 0, 376, 377, 3, 146, 73, 0, 377, 378, 5, 77, 0, 0, 378, 379, 3, 148, 74, 0, 379, 380, 5, 126, 0, 0, 380, 381, 3, 130, 65, 0, 381, 385, 5, 130, 0, 0, 382, 384, 3, 40, 20, 0, 383, 382, 1, 0, 0, 0, 384, 387, 1, 0, 0, 0, 385, 383, 1, 0, 0, 0, 385, 386, 1, 0, 0, 0, 386, 388, 1, 0, 0, 0, 387, 385, 1, 0, 0, 0, 388, 389, 5, 131, 0, 0, 389, 39, 1, 0, 0, 0, 390, 391, 5, 84, 0, 0, 391, 392, 5, 77, 0, 0, 392, 394, 3, 148, 74, 0, 393, 395, 3, 64, 32, 0, 394, 393, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 396, 1, 0, 0, 0, 396, 397, 5, 127, 0, 0, 397, 424, 1, 0, 0, 0, 398, 399, 5, 85, 0, 0, 399, 400, 5, 77, 0, 0, 400, 402, 3, 148, 74, 0, 401, 403, 3, 64, 32, 0, 402, 401, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 404, 1, 0, 0, 0, 404, 405, 5, 127, 0, 0, 405, 424, 1, 0, 0, 0, 406, 407, 5, 1, 0, 0, 407, 408, 5, 77, 0, 0, 408, 410, 3, 148, 74, 0, 409, 411, 3, 64, 32, 0, 410, 409, 1, 0, 0, 0, 410, 411, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 413, 5, 127, 0, 0, 413, 424, 1, 0, 0, 0, 414, 415, 5, 86, 0, 0, 415, 416, 5, 87, 0, 0, 416, 417, 5, 77, 0, 0, 417, 418, 3, 148, 74, 0, 418, 419, 5, 88, 0, 0, 419, 420, 5, 77, 0, 0, 420, 421, 3, 148, 74, 0, 421, 422, 5, 127, 0, 0, 422, 424, 1, 0, 0, 0, 423, 390, 1, 0, 0, 0, 423, 398, 1, 0, 0, 0, 423, 406, 1, 0, 0, 0, 423, 414, 1, 0, 0, 0, 424, 41, 1, 0, 0, 0, 425, 427, 3, 44, 22, 0, 426, 425, 1, 0, 0, 0, 426, 427, 1, 0, 0, 0, 427, 428, 1, 0, 0, 0, 428, 429, 5, 43, 0, 0, 429, 430, 3, 146, 73, 0, 430, 431, 5, 77, 0, 0, 431, 432, 3, 148, 74, 0, 432, 433, 5, 126, 0, 0, 433, 434, 3, 136, 68, 0, 434, 436, 3, 48, 24, 0, 435, 437, 5, 105, 0, 0, 436, 435, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 440, 1, 0, 0, 0, 438, 439, 5, 75, 0, 0, 439, 441, 3, 148, 74, 0, 440, 438, 1, 0, 0, 0, 440, 441, 1, 0, 0, 0, 441, 442, 1, 0, 0, 0, 442, 446, 5, 130, 0, 0, 443, 445, 3, 46, 23, 0, 444, 443, 1, 0, 0, 0, 445, 448, 1, 0, 0, 0, 446, 444, 1, 0, 0, 0, 446, 447, 1, 0, 0, 0, 447, 449, 1, 0, 0, 0, 448, 446, 1, 0, 0, 0, 449, 450, 5, 131, 0, 0, 450, 43, 1, 0, 0, 0, 451, 453, 5, 27, 0, 0, 452, 454, 7, 0, 0, 0, 453, 452, 1, 0, 0, 0, 453, 454, 1, 0, 0, 0, 454, 45, 1, 0, 0, 0, 455, 456, 5, 91, 0, 0, 456, 457, 5, 77, 0, 0, 457, 459, 3, 148, 74, 0, 458, 460, 3, 64, 32, 0, 459, 458, 1, 0, 0, 0, 459, 460, 1, 0, 0, 0, 460, 461, 1, 0, 0, 0, 461, 462, 5, 127, 0, 0, 462, 489, 1, 0, 0, 0, 463, 464, 5, 92, 0, 0, 464, 465, 5, 77, 0, 0, 465, 467, 3, 148, 74, 0, 466, 468, 3, 64, 32, 0, 467, 466, 1, 0, 0, 0, 467, 468, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 470, 5, 127, 0, 0, 470, 489, 1, 0, 0, 0, 471, 472, 5, 93, 0, 0, 472, 473, 5, 77, 0, 0, 473, 475, 3, 148, 74, 0, 474, 476, 3, 64, 32, 0, 475, 474, 1, 0, 0, 0, 475, 476, 1, 0, 0, 0, 476, 477, 1, 0, 0, 0, 477, 478, 5, 127, 0, 0, 478, 489, 1, 0, 0, 0, 479, 480, 5, 86, 0, 0, 480, 481, 5, 87, 0, 0, 481, 482, 5, 77, 0, 0, 482, 483, 3, 148, 74, 0, 483, 484, 5, 88, 0, 0, 484, 485, 5, 77, 0, 0, 485, 486, 3, 148, 74, 0, 486, 487, 5, 127, 0, 0, 487, 489, 1, 0, 0, 0, 488, 455, 1, 0, 0, 0, 488, 463, 1, 0, 0, 0, 488, 471, 1, 0, 0, 0, 488, 479, 1, 0, 0, 0, 489, 47, 1, 0, 0, 0, 490, 491, 5, 38, 0, 0, 491, 500, 3, 146, 73, 0, 492, 493, 5, 39, 0, 0, 493, 495, 3, 146, 73, 0, 494, 496, 3, 28, 14, 0, 495, 494, 1, 0, 0, 0, 495, 496, 1, 0, 0, 0, 496, 500, 1, 0, 0, 0, 497, 498, 5, 31, 0, 0, 498, 500, 3, 146, 73, 0, 499, 490, 1, 0, 0, 0, 499, 492, 1, 0, 0, 0, 499, 497, 1, 0, 0, 0, 500, 49, 1, 0, 0, 0, 501, 503, 3, 16, 8, 0, 502, 501, 1, 0, 0, 0, 503, 506, 1, 0, 0, 0, 504, 502, 1, 0, 0, 0, 504, 505, 1, 0, 0, 0, 505, 507, 1, 0, 0, 0, 506, 504, 1, 0, 0, 0, 507, 508, 5, 41, 0, 0, 508, 509, 3, 146, 73, 0, 509, 510, 5, 77, 0, 0, 510, 511, 3, 148, 74, 0, 511, 512, 5, 71, 0, 0, 512, 515, 3, 148, 74, 0, 513, 514, 5, 72, 0, 0, 514, 516, 5, 140, 0, 0, 515, 513, 1, 0, 0, 0, 515, 516, 1, 0, 0, 0, 516, 517, 1, 0, 0, 0, 517, 521, 5, 130, 0, 0, 518, 520, 3, 52, 26, 0, 519, 518, 1, 0, 0, 0, 520, 523, 1, 0, 0, 0, 521, 519, 1, 0, 0, 0, 521, 522, 1, 0, 0, 0, 522, 524, 1, 0, 0, 0, 523, 521, 1, 0, 0, 0, 524, 525, 5, 131, 0, 0, 525, 51, 1, 0, 0, 0, 526, 532, 3, 60, 30, 0, 527, 532, 3, 62, 31, 0, 528, 532, 3, 68, 34, 0, 529, 532, 3, 54, 27, 0, 530, 532, 3, 56, 28, 0, 531, 526, 1, 0, 0, 0, 531, 527, 1, 0, 0, 0, 531, 528, 1, 0, 0, 0, 531, 529, 1, 0, 0, 0, 531, 530, 1, 0, 0, 0, 532, 53, 1, 0, 0, 0, 533, 534, 5, 17, 0, 0, 534, 536, 3, 146, 73, 0, 535, 537, 3, 22, 11, 0, 536, 535, 1, 0, 0, 0, 536, 537, 1, 0, 0, 0, 537, 538, 1, 0, 0, 0, 538, 539, 5, 77, 0, 0, 539, 540, 3, 148, 74, 0, 540, 542, 5, 20, 0, 0, 541, 543, 5, 4, 0, 0, 542, 541, 1, 0, 0, 0, 542, 543, 1, 0, 0, 0, 543, 544, 1, 0, 0, 0, 544, 545, 3, 26, 13, 0, 545, 546, 5, 21, 0, 0, 546, 547, 3, 148, 74, 0, 547, 548, 5, 44, 0, 0, 548, 549, 3, 148, 74, 0, 549, 553, 5, 130, 0, 0, 550, 552, 3, 58, 29, 0, 551, 550, 1, 0, 0, 0, 552, 555, 1, 0, 0, 0, 553, 551, 1, 0, 0, 0, 553, 554, 1, 0, 0, 0, 554, 556, 1, 0, 0, 0, 555, 553, 1, 0, 0, 0, 556, 557, 5, 131, 0, 0, 557, 55, 1, 0, 0, 0, 558, 559, 5, 17, 0, 0, 559, 560, 3, 146, 73, 0, 560, 561, 5, 77, 0, 0, 561, 562, 3, 148, 74, 0, 562, 563, 5, 19, 0, 0, 563, 564, 3, 146, 73, 0, 564, 565, 3, 28, 14, 0, 565, 566, 5, 127, 0, 0, 566, 57, 1, 0, 0, 0, 567, 568, 5, 11, 0, 0, 568, 608, 5, 127, 0, 0, 569, 570, 5, 12, 0, 0, 570, 571, 5, 13, 0, 0, 571, 572, 3, 146, 73, 0, 572, 573, 5, 127, 0, 0, 573, 608, 1, 0, 0, 0, 574, 575, 5, 22, 0, 0, 575, 576, 3, 148, 74, 0, 576, 577, 5, 127, 0, 0, 577, 608, 1, 0, 0, 0, 578, 580, 5, 23, 0, 0, 579, 581, 5, 31, 0, 0, 580, 579, 1, 0, 0, 0, 580, 581, 1, 0, 0, 0, 581, 582, 1, 0, 0, 0, 582, 583, 3, 146, 73, 0, 583, 584, 5, 50, 0, 0, 584, 585, 3, 26, 13, 0, 585, 586, 5, 127, 0, 0, 586, 608, 1, 0, 0, 0, 587, 588, 5, 24, 0, 0, 588, 589, 3, 146, 73, 0, 589, 590, 5, 140, 0, 0, 590, 591, 5, 127, 0, 0, 591, 608, 1, 0, 0, 0, 592, 593, 5, 25, 0, 0, 593, 594, 3, 26, 13, 0, 594, 595, 5, 129, 0, 0, 595, 596, 3, 146, 73, 0, 596, 597, 3, 146, 73, 0, 597, 598, 3, 148, 74, 0, 598, 599, 5, 127, 0, 0, 599, 608, 1, 0, 0, 0, 600, 601, 5, 86, 0, 0, 601, 608, 5, 127, 0, 0, 602, 603, 5, 26, 0, 0, 603, 604, 5, 140, 0, 0, 604, 605, 3, 148, 74, 0, 605, 606, 5, 127, 0, 0, 606, 608, 1, 0, 0, 0, 607, 567, 1, 0, 0, 0, 607, 569, 1, 0, 0, 0, 607, 574, 1, 0, 0, 0, 607, 578, 1, 0, 0, 0, 607, 587, 1, 0, 0, 0, 607, 592, 1, 0, 0, 0, 607, 600, 1, 0, 0, 0, 607, 602, 1, 0, 0, 0, 608, 59, 1, 0, 0, 0, 609, 610, 5, 44, 0, 0, 610, 612, 3, 146, 73, 0, 611, 613, 3, 22, 11, 0, 612, 611, 1, 0, 0, 0, 612, 613, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 615, 5, 77, 0, 0, 615, 616, 3, 148, 74, 0, 616, 617, 5, 126, 0, 0, 617, 618, 3, 130, 65, 0, 618, 619, 5, 125, 0, 0, 619, 620, 3, 130, 65, 0, 620, 621, 5, 79, 0, 0, 621, 623, 3, 72, 36, 0, 622, 624, 3, 64, 32, 0, 623, 622, 1, 0, 0, 0, 623, 624, 1, 0, 0, 0, 624, 626, 1, 0, 0, 0, 625, 627, 3, 70, 35, 0, 626, 625, 1, 0, 0, 0, 626, 627, 1, 0, 0, 0, 627, 628, 1, 0, 0, 0, 628, 629, 5, 81, 0, 0, 629, 631, 3, 74, 37, 0, 630, 632, 3, 78, 39, 0, 631, 630, 1, 0, 0, 0, 631, 632, 1, 0, 0, 0, 632, 633, 1, 0, 0, 0, 633, 634, 5, 127, 0, 0, 634, 61, 1, 0, 0, 0, 635, 636, 5, 45, 0, 0, 636, 638, 3, 146, 73, 0, 637, 639, 3, 22, 11, 0, 638, 637, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 641, 5, 77, 0, 0, 641, 642, 3, 148, 74, 0, 642, 643, 5, 126, 0, 0, 643, 644, 3, 130, 65, 0, 644, 645, 5, 125, 0, 0, 645, 647, 3, 130, 65, 0, 646, 648, 3, 64, 32, 0, 647, 646, 1, 0, 0, 0, 647, 648, 1, 0, 0, 0, 648, 650, 1, 0, 0, 0, 649, 651, 3, 78, 39, 0, 650, 649, 1, 0, 0, 0, 650, 651, 1, 0, 0, 0, 651, 652, 1, 0, 0, 0, 652, 653, 5, 127, 0, 0, 653, 63, 1, 0, 0, 0, 654, 655, 5, 5, 0, 0, 655, 664, 5, 8, 0, 0, 656, 657, 5, 5, 0, 0, 657, 658, 7, 1, 0, 0, 658, 659, 5, 9, 0, 0, 659, 660, 5, 132, 0, 0, 660, 661, 3, 76, 38, 0, 661, 662, 5, 133, 0, 0, 662, 664, 1, 0, 0, 0, 663, 654, 1, 0, 0, 0, 663, 656, 1, 0, 0, 0, 664, 65, 1, 0, 0, 0, 665, 666, 5, 60, 0, 0, 666, 667, 5, 132, 0, 0, 667, 672, 3, 114, 57, 0, 668, 669, 5, 128, 0, 0, 669, 671, 3, 114, 57, 0, 670, 668, 1, 0, 0, 0, 671, 674, 1, 0, 0, 0, 672, 670, 1, 0, 0, 0, 672, 673, 1, 0, 0, 0, 673, 675, 1, 0, 0, 0, 674, 672, 1, 0, 0, 0, 675, 676, 5, 133, 0, 0, 676, 67, 1, 0, 0, 0, 677, 678, 5, 46, 0, 0, 678, 679, 3, 146, 73, 0, 679, 680, 5, 77, 0, 0, 680, 681, 3, 148, 74, 0, 681, 682, 5, 47, 0, 0, 682, 683, 3, 146, 73, 0, 683, 684, 5, 126, 0, 0, 684, 686, 3, 130, 65, 0, 685, 687, 3, 78, 39, 0, 686, 685, 1, 0, 0, 0, 686, 687, 1, 0, 0, 0, 687, 688, 1, 0, 0, 0, 688, 689, 5, 127, 0, 0, 689, 69, 1, 0, 0, 0, 690, 691, 5, 80, 0, 0, 691, 692, 3, 130, 65, 0, 692, 71, 1, 0, 0, 0, 693, 694, 7, 2, 0, 0, 694, 73, 1, 0, 0, 0, 695, 714, 5, 83, 0, 0, 696, 697, 5, 38, 0, 0, 697, 714, 3, 146, 73, 0, 698, 699, 5, 31, 0, 0, 699, 714, 3, 146, 73, 0, 700, 701, 5, 40, 0, 0, 701, 710, 5, 132, 0, 0, 702, 707, 3, 26, 13, 0, 703, 704, 5, 128, 0, 0, 704, 706, 3, 26, 13, 0, 705, 703, 1, 0, 0, 0, 706, 709, 1, 0, 0, 0, 707, 705, 1, 0, 0, 0, 707, 708, 1, 0, 0, 0, 708, 711, 1, 0, 0, 0, 709, 707, 1, 0, 0, 0, 710, 702, 1, 0, 0, 0, 710, 711, 1, 0, 0, 0, 711, 712, 1, 0, 0, 0, 712, 714, 5, 133, 0, 0, 713, 695, 1, 0, 0, 0, 713, 696, 1, 0, 0, 0, 713, 698, 1, 0, 0, 0, 713, 700, 1, 0, 0, 0, 714, 75, 1, 0, 0, 0, 715, 720, 3, 146, 73, 0, 716, 717, 5, 128, 0, 0, 717, 719, 3, 146, 73, 0, 718, 716, 1, 0, 0, 0, 719, 722, 1, 0, 0, 0, 720, 718, 1, 0, 0, 0, 720, 721, 1, 0, 0, 0, 721, 77, 1, 0, 0, 0, 722, 720, 1, 0, 0, 0, 723, 724, 5, 82, 0, 0, 724, 728, 5, 130, 0, 0, 725, 727, 3, 80, 40, 0, 726, 725, 1, 0, 0, 0, 727, 730, 1, 0, 0, 0, 728, 726, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 731, 1, 0, 0, 0, 730, 728, 1, 0, 0, 0, 731, 732, 5, 131, 0, 0, 732, 79, 1, 0, 0, 0, 733, 734, 5, 18, 0, 0, 734, 735, 3, 146, 73, 0, 735, 736, 5, 77, 0, 0, 736, 737, 3, 148, 74, 0, 737, 738, 5, 132, 0, 0, 738, 739, 3, 76, 38, 0, 739, 740, 5, 133, 0, 0, 740, 741, 5, 127, 0, 0, 741, 808, 1, 0, 0, 0, 742, 743, 5, 56, 0, 0, 743, 744, 3, 146, 73, 0, 744, 745, 5, 77, 0, 0, 745, 746, 3, 148, 74, 0, 746, 747, 5, 126, 0, 0, 747, 748, 3, 130, 65, 0, 748, 749, 3, 82, 41, 0, 749, 750, 5, 127, 0, 0, 750, 808, 1, 0, 0, 0, 751, 752, 5, 57, 0, 0, 752, 753, 3, 146, 73, 0, 753, 754, 5, 77, 0, 0, 754, 755, 3, 148, 74, 0, 755, 756, 5, 126, 0, 0, 756, 757, 3, 136, 68, 0, 757, 758, 3, 48, 24, 0, 758, 759, 3, 82, 41, 0, 759, 760, 5, 127, 0, 0, 760, 808, 1, 0, 0, 0, 761, 762, 5, 39, 0, 0, 762, 763, 3, 146, 73, 0, 763, 764, 5, 77, 0, 0, 764, 765, 3, 148, 74, 0, 765, 766, 5, 126, 0, 0, 766, 768, 3, 146, 73, 0, 767, 769, 3, 28, 14, 0, 768, 767, 1, 0, 0, 0, 768, 769, 1, 0, 0, 0, 769, 771, 1, 0, 0, 0, 770, 772, 3, 66, 33, 0, 771, 770, 1, 0, 0, 0, 771, 772, 1, 0, 0, 0, 772, 773, 1, 0, 0, 0, 773, 774, 5, 127, 0, 0, 774, 808, 1, 0, 0, 0, 775, 776, 5, 2, 0, 0, 776, 777, 3, 146, 73, 0, 777, 778, 5, 77, 0, 0, 778, 779, 3, 148, 74, 0, 779, 780, 5, 126, 0, 0, 780, 781, 3, 146, 73, 0, 781, 782, 5, 48, 0, 0, 782, 783, 3, 130, 65, 0, 783, 784, 5, 127, 0, 0, 784, 808, 1, 0, 0, 0, 785, 786, 5, 46, 0, 0, 786, 787, 3, 146, 73, 0, 787, 788, 5, 77, 0, 0, 788, 789, 3, 148, 74, 0, 789, 790, 5, 126, 0, 0, 790, 793, 3, 146, 73, 0, 791, 792, 5, 48, 0, 0, 792, 794, 3, 130, 65, 0, 793, 791, 1, 0, 0, 0, 793, 794, 1, 0, 0, 0, 794, 795, 1, 0, 0, 0, 795, 796, 5, 127, 0, 0, 796, 808, 1, 0, 0, 0, 797, 798, 5, 17, 0, 0, 798, 799, 3, 146, 73, 0, 799, 800, 5, 77, 0, 0, 800, 801, 3, 148, 74, 0, 801, 802, 5, 126, 0, 0, 802, 803, 3, 146, 73, 0, 803, 804, 5, 129, 0, 0, 804, 805, 3, 146, 73, 0, 805, 806, 5, 127, 0, 0, 806, 808, 1, 0, 0, 0, 807, 733, 1, 0, 0, 0, 807, 742, 1, 0, 0, 0, 807, 751, 1, 0, 0, 0, 807, 761, 1, 0, 0, 0, 807, 775, 1, 0, 0, 0, 807, 785, 1, 0, 0, 0, 807, 797, 1, 0, 0, 0, 808, 81, 1, 0, 0, 0, 809, 810, 5, 132, 0, 0, 810, 815, 3, 84, 42, 0, 811, 812, 5, 128, 0, 0, 812, 814, 3, 84, 42, 0, 813, 811, 1, 0, 0, 0, 814, 817, 1, 0, 0, 0, 815, 813, 1, 0, 0, 0, 815, 816, 1, 0, 0, 0, 816, 818, 1, 0, 0, 0, 817, 815, 1, 0, 0, 0, 818, 819, 5, 133, 0, 0, 819, 83, 1, 0, 0, 0, 820, 821, 7, 3, 0, 0, 821, 85, 1, 0, 0, 0, 822, 823, 5, 55, 0, 0, 823, 824, 3, 88, 44, 0, 824, 87, 1, 0, 0, 0, 825, 828, 3, 90, 45, 0, 826, 828, 3, 94, 47, 0, 827, 825, 1, 0, 0, 0, 827, 826, 1, 0, 0, 0, 828, 89, 1, 0, 0, 0, 829, 830, 5, 56, 0, 0, 830, 831, 3, 146, 73, 0, 831, 832, 5, 77, 0, 0, 832, 833, 3, 148, 74, 0, 833, 834, 5, 65, 0, 0, 834, 835, 3, 146, 73, 0, 835, 836, 5, 126, 0, 0, 836, 837, 3, 130, 65, 0, 837, 838, 5, 66, 0, 0, 838, 841, 3, 92, 46, 0, 839, 840, 5, 67, 0, 0, 840, 842, 3, 138, 69, 0, 841, 839, 1, 0, 0, 0, 841, 842, 1, 0, 0, 0, 842, 843, 1, 0, 0, 0, 843, 844, 5, 127, 0, 0, 844, 91, 1, 0, 0, 0, 845, 852, 5, 99, 0, 0, 846, 847, 5, 100, 0, 0, 847, 848, 5, 134, 0, 0, 848, 849, 3, 130, 65, 0, 849, 850, 5, 135, 0, 0, 850, 852, 1, 0, 0, 0, 851, 845, 1, 0, 0, 0, 851, 846, 1, 0, 0, 0, 852, 93, 1, 0, 0, 0, 853, 854, 5, 57, 0, 0, 854, 855, 3, 146, 73, 0, 855, 856, 5, 77, 0, 0, 856, 857, 3, 148, 74, 0, 857, 858, 5, 130, 0, 0, 858, 859, 3, 96, 48, 0, 859, 860, 3, 96, 48, 0, 860, 861, 5, 131, 0, 0, 861, 95, 1, 0, 0, 0, 862, 863, 3, 48, 24, 0, 863, 864, 5, 58, 0, 0, 864, 865, 3, 146, 73, 0, 865, 866, 5, 77, 0, 0, 866, 867, 3, 148, 74, 0, 867, 869, 3, 136, 68, 0, 868, 870, 5, 105, 0, 0, 869, 868, 1, 0, 0, 0, 869, 870, 1, 0, 0, 0, 870, 873, 1, 0, 0, 0, 871, 872, 5, 73, 0, 0, 872, 874, 3, 148, 74, 0, 873, 871, 1, 0, 0, 0, 873, 874, 1, 0, 0, 0, 874, 876, 1, 0, 0, 0, 875, 877, 5, 74, 0, 0, 876, 875, 1, 0, 0, 0, 876, 877, 1, 0, 0, 0, 877, 880, 1, 0, 0, 0, 878, 879, 5, 75, 0, 0, 879, 881, 3, 148, 74, 0, 880, 878, 1, 0, 0, 0, 880, 881, 1, 0, 0, 0, 881, 883, 1, 0, 0, 0, 882, 884, 5, 76, 0, 0, 883, 882, 1, 0, 0, 0, 883, 884, 1, 0, 0, 0, 884, 885, 1, 0, 0, 0, 885, 886, 5, 127, 0, 0, 886, 97, 1, 0, 0, 0, 887, 888, 5, 49, 0, 0, 888, 889, 3, 146, 73, 0, 889, 890, 5, 50, 0, 0, 890, 892, 3, 146, 73, 0, 891, 893, 3, 28, 14, 0, 892, 891, 1, 0, 0, 0, 892, 893, 1, 0, 0, 0, 893, 896, 1, 0, 0, 0, 894, 895, 5, 77, 0, 0, 895, 897, 3, 148, 74, 0, 896, 894, 1, 0, 0, 0, 896, 897, 1, 0, 0, 0, 897, 900, 1, 0, 0, 0, 898, 899, 5, 72, 0, 0, 899, 901, 5, 140, 0, 0, 900, 898, 1, 0, 0, 0, 900, 901, 1, 0, 0, 0, 901, 902, 1, 0, 0, 0, 902, 906, 5, 130, 0, 0, 903, 905, 3, 100, 50, 0, 904, 903, 1, 0, 0, 0, 905, 908, 1, 0, 0, 0, 906, 904, 1, 0, 0, 0, 906, 907, 1, 0, 0, 0, 907, 909, 1, 0, 0, 0, 908, 906, 1, 0, 0, 0, 909, 910, 5, 131, 0, 0, 910, 99, 1, 0, 0, 0, 911, 912, 5, 54, 0, 0, 912, 918, 3, 88, 44, 0, 913, 918, 3, 112, 56, 0, 914, 918, 3, 108, 54, 0, 915, 918, 3, 102, 51, 0, 916, 918, 3, 110, 55, 0, 917, 911, 1, 0, 0, 0, 917, 913, 1, 0, 0, 0, 917, 914, 1, 0, 0, 0, 917, 915, 1, 0, 0, 0, 917, 916, 1, 0, 0, 0, 918, 101, 1, 0, 0, 0, 919, 920, 5, 3, 0, 0, 920, 924, 5, 130, 0, 0, 921, 923, 3, 104, 52, 0, 922, 921, 1, 0, 0, 0, 923, 926, 1, 0, 0, 0, 924, 922, 1, 0, 0, 0, 924, 925, 1, 0, 0, 0, 925, 927, 1, 0, 0, 0, 926, 924, 1, 0, 0, 0, 927, 928, 5, 131, 0, 0, 928, 929, 5, 127, 0, 0, 929, 103, 1, 0, 0, 0, 930, 931, 3, 146, 73, 0, 931, 932, 5, 53, 0, 0, 932, 933, 5, 56, 0, 0, 933, 934, 3, 146, 73, 0, 934, 935, 5, 127, 0, 0, 935, 945, 1, 0, 0, 0, 936, 937, 3, 146, 73, 0, 937, 938, 5, 53, 0, 0, 938, 939, 5, 57, 0, 0, 939, 940, 3, 146, 73, 0, 940, 941, 5, 129, 0, 0, 941, 942, 3, 146, 73, 0, 942, 943, 5, 127, 0, 0, 943, 945, 1, 0, 0, 0, 944, 930, 1, 0, 0, 0, 944, 936, 1, 0, 0, 0, 945, 105, 1, 0, 0, 0, 946, 947, 3, 26, 13, 0, 947, 948, 5, 13, 0, 0, 948, 953, 5, 48, 0, 0, 949, 950, 5, 129, 0, 0, 950, 952, 3, 146, 73, 0, 951, 949, 1, 0, 0, 0, 952, 955, 1, 0, 0, 0, 953, 951, 1, 0, 0, 0, 953, 954, 1, 0, 0, 0, 954, 956, 1, 0, 0, 0, 955, 953, 1, 0, 0, 0, 956, 957, 5, 127, 0, 0, 957, 107, 1, 0, 0, 0, 958, 959, 5, 51, 0, 0, 959, 960, 3, 146, 73, 0, 960, 961, 5, 53, 0, 0, 961, 962, 5, 56, 0, 0, 962, 963, 3, 146, 73, 0, 963, 964, 5, 127, 0, 0, 964, 109, 1, 0, 0, 0, 965, 966, 5, 62, 0, 0, 966, 967, 3, 146, 73, 0, 967, 968, 5, 63, 0, 0, 968, 969, 5, 64, 0, 0, 969, 970, 5, 60, 0, 0, 970, 971, 5, 46, 0, 0, 971, 972, 3, 146, 73, 0, 972, 973, 5, 61, 0, 0, 973, 974, 5, 57, 0, 0, 974, 975, 3, 146, 73, 0, 975, 976, 5, 129, 0, 0, 976, 977, 3, 146, 73, 0, 977, 978, 5, 127, 0, 0, 978, 111, 1, 0, 0, 0, 979, 980, 5, 51, 0, 0, 980, 981, 3, 114, 57, 0, 981, 982, 5, 53, 0, 0, 982, 985, 3, 118, 59, 0, 983, 984, 5, 29, 0, 0, 984, 986, 3, 148, 74, 0, 985, 983, 1, 0, 0, 0, 985, 986, 1, 0, 0, 0, 986, 987, 1, 0, 0, 0, 987, 988, 5, 127, 0, 0, 988, 113, 1, 0, 0, 0, 989, 990, 3, 146, 73, 0, 990, 991, 5, 129, 0, 0, 991, 992, 3, 116, 58, 0, 992, 115, 1, 0, 0, 0, 993, 1006, 3, 146, 73, 0, 994, 1006, 5, 94, 0, 0, 995, 1006, 5, 84, 0, 0, 996, 1006, 5, 85, 0, 0, 997, 1006, 5, 1, 0, 0, 998, 1006, 5, 91, 0, 0, 999, 1006, 5, 92, 0, 0, 1000, 1006, 5, 93, 0, 0, 1001, 1006, 5, 95, 0, 0, 1002, 1006, 5, 96, 0, 0, 1003, 1006, 5, 97, 0, 0, 1004, 1006, 5, 98, 0, 0, 1005, 993, 1, 0, 0, 0, 1005, 994, 1, 0, 0, 0, 1005, 995, 1, 0, 0, 0, 1005, 996, 1, 0, 0, 0, 1005, 997, 1, 0, 0, 0, 1005, 998, 1, 0, 0, 0, 1005, 999, 1, 0, 0, 0, 1005, 1000, 1, 0, 0, 0, 1005, 1001, 1, 0, 0, 0, 1005, 1002, 1, 0, 0, 0, 1005, 1003, 1, 0, 0, 0, 1005, 1004, 1, 0, 0, 0, 1006, 117, 1, 0, 0, 0, 1007, 1008, 5, 56, 0, 0, 1008, 1009, 3, 146, 73, 0, 1009, 1010, 5, 129, 0, 0, 1010, 1011, 3, 120, 60, 0, 1011, 1038, 1, 0, 0, 0, 1012, 1013, 5, 57, 0, 0, 1013, 1014, 3, 146, 73, 0, 1014, 1015, 5, 129, 0, 0, 1015, 1016, 3, 146, 73, 0, 1016, 1017, 5, 129, 0, 0, 1017, 1018, 3, 122, 61, 0, 1018, 1038, 1, 0, 0, 0, 1019, 1020, 5, 39, 0, 0, 1020, 1022, 3, 146, 73, 0, 1021, 1023, 3, 28, 14, 0, 1022, 1021, 1, 0, 0, 0, 1022, 1023, 1, 0, 0, 0, 1023, 1024, 1, 0, 0, 0, 1024, 1025, 5, 129, 0, 0, 1025, 1026, 3, 114, 57, 0, 1026, 1038, 1, 0, 0, 0, 1027, 1028, 5, 41, 0, 0, 1028, 1029, 3, 146, 73, 0, 1029, 1030, 5, 129, 0, 0, 1030, 1032, 3, 146, 73, 0, 1031, 1033, 3, 28, 14, 0, 1032, 1031, 1, 0, 0, 0, 1032, 1033, 1, 0, 0, 0, 1033, 1035, 1, 0, 0, 0, 1034, 1036, 3, 124, 62, 0, 1035, 1034, 1, 0, 0, 0, 1035, 1036, 1, 0, 0, 0, 1036, 1038, 1, 0, 0, 0, 1037, 1007, 1, 0, 0, 0, 1037, 1012, 1, 0, 0, 0, 1037, 1019, 1, 0, 0, 0, 1037, 1027, 1, 0, 0, 0, 1038, 119, 1, 0, 0, 0, 1039, 1040, 7, 4, 0, 0, 1040, 121, 1, 0, 0, 0, 1041, 1042, 7, 5, 0, 0, 1042, 123, 1, 0, 0, 0, 1043, 1044, 5, 59, 0, 0, 1044, 1048, 5, 130, 0, 0, 1045, 1047, 3, 126, 63, 0, 1046, 1045, 1, 0, 0, 0, 1047, 1050, 1, 0, 0, 0, 1048, 1046, 1, 0, 0, 0, 1048, 1049, 1, 0, 0, 0, 1049, 1051, 1, 0, 0, 0, 1050, 1048, 1, 0, 0, 0, 1051, 1052, 5, 131, 0, 0, 1052, 125, 1, 0, 0, 0, 1053, 1054, 3, 146, 73, 0, 1054, 1055, 5, 53, 0, 0, 1055, 1056, 5, 4, 0, 0, 1056, 1057, 5, 18, 0, 0, 1057, 1058, 5, 132, 0, 0, 1058, 1059, 3, 76, 38, 0, 1059, 1060, 5, 133, 0, 0, 1060, 1061, 5, 127, 0, 0, 1061, 1150, 1, 0, 0, 0, 1062, 1063, 3, 146, 73, 0, 1063, 1064, 5, 53, 0, 0, 1064, 1065, 5, 56, 0, 0, 1065, 1072, 3, 146, 73, 0, 1066, 1067, 5, 61, 0, 0, 1067, 1068, 5, 57, 0, 0, 1068, 1069, 3, 146, 73, 0, 1069, 1070, 5, 129, 0, 0, 1070, 1071, 3, 146, 73, 0, 1071, 1073, 1, 0, 0, 0, 1072, 1066, 1, 0, 0, 0, 1072, 1073, 1, 0, 0, 0, 1073, 1074, 1, 0, 0, 0, 1074, 1075, 5, 127, 0, 0, 1075, 1150, 1, 0, 0, 0, 1076, 1077, 3, 146, 73, 0, 1077, 1078, 5, 53, 0, 0, 1078, 1079, 5, 57, 0, 0, 1079, 1080, 3, 146, 73, 0, 1080, 1081, 5, 129, 0, 0, 1081, 1088, 3, 146, 73, 0, 1082, 1083, 5, 61, 0, 0, 1083, 1084, 5, 57, 0, 0, 1084, 1085, 3, 146, 73, 0, 1085, 1086, 5, 129, 0, 0, 1086, 1087, 3, 146, 73, 0, 1087, 1089, 1, 0, 0, 0, 1088, 1082, 1, 0, 0, 0, 1088, 1089, 1, 0, 0, 0, 1089, 1090, 1, 0, 0, 0, 1090, 1091, 5, 127, 0, 0, 1091, 1150, 1, 0, 0, 0, 1092, 1093, 3, 146, 73, 0, 1093, 1094, 5, 53, 0, 0, 1094, 1095, 5, 39, 0, 0, 1095, 1097, 3, 146, 73, 0, 1096, 1098, 3, 28, 14, 0, 1097, 1096, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1105, 1, 0, 0, 0, 1099, 1100, 5, 61, 0, 0, 1100, 1101, 5, 57, 0, 0, 1101, 1102, 3, 146, 73, 0, 1102, 1103, 5, 129, 0, 0, 1103, 1104, 3, 146, 73, 0, 1104, 1106, 1, 0, 0, 0, 1105, 1099, 1, 0, 0, 0, 1105, 1106, 1, 0, 0, 0, 1106, 1107, 1, 0, 0, 0, 1107, 1108, 5, 127, 0, 0, 1108, 1150, 1, 0, 0, 0, 1109, 1110, 3, 146, 73, 0, 1110, 1111, 5, 53, 0, 0, 1111, 1112, 5, 2, 0, 0, 1112, 1113, 3, 146, 73, 0, 1113, 1114, 5, 59, 0, 0, 1114, 1118, 5, 130, 0, 0, 1115, 1117, 3, 106, 53, 0, 1116, 1115, 1, 0, 0, 0, 1117, 1120, 1, 0, 0, 0, 1118, 1116, 1, 0, 0, 0, 1118, 1119, 1, 0, 0, 0, 1119, 1121, 1, 0, 0, 0, 1120, 1118, 1, 0, 0, 0, 1121, 1122, 5, 131, 0, 0, 1122, 1123, 5, 127, 0, 0, 1123, 1150, 1, 0, 0, 0, 1124, 1125, 3, 146, 73, 0, 1125, 1126, 5, 53, 0, 0, 1126, 1127, 5, 46, 0, 0, 1127, 1128, 3, 146, 73, 0, 1128, 1129, 5, 127, 0, 0, 1129, 1150, 1, 0, 0, 0, 1130, 1131, 3, 146, 73, 0, 1131, 1133, 5, 53, 0, 0, 1132, 1134, 5, 4, 0, 0, 1133, 1132, 1, 0, 0, 0, 1133, 1134, 1, 0, 0, 0, 1134, 1135, 1, 0, 0, 0, 1135, 1136, 5, 17, 0, 0, 1136, 1137, 3, 146, 73, 0, 1137, 1138, 5, 129, 0, 0, 1138, 1145, 3, 146, 73, 0, 1139, 1140, 5, 61, 0, 0, 1140, 1141, 5, 57, 0, 0, 1141, 1142, 3, 146, 73, 0, 1142, 1143, 5, 129, 0, 0, 1143, 1144, 3, 146, 73, 0, 1144, 1146, 1, 0, 0, 0, 1145, 1139, 1, 0, 0, 0, 1145, 1146, 1, 0, 0, 0, 1146, 1147, 1, 0, 0, 0, 1147, 1148, 5, 127, 0, 0, 1148, 1150, 1, 0, 0, 0, 1149, 1053, 1, 0, 0, 0, 1149, 1062, 1, 0, 0, 0, 1149, 1076, 1, 0, 0, 0, 1149, 1092, 1, 0, 0, 0, 1149, 1109, 1, 0, 0, 0, 1149, 1124, 1, 0, 0, 0, 1149, 1130, 1, 0, 0, 0, 1150, 127, 1, 0, 0, 0, 1151, 1152, 5, 46, 0, 0, 1152, 1153, 3, 146, 73, 0, 1153, 1154, 5, 53, 0, 0, 1154, 1155, 3, 146, 73, 0, 1155, 1156, 5, 129, 0, 0, 1156, 1158, 3, 146, 73, 0, 1157, 1159, 3, 124, 62, 0, 1158, 1157, 1, 0, 0, 0, 1158, 1159, 1, 0, 0, 0, 1159, 1160, 1, 0, 0, 0, 1160, 1161, 5, 127, 0, 0, 1161, 129, 1, 0, 0, 0, 1162, 1209, 3, 134, 67, 0, 1163, 1209, 5, 106, 0, 0, 1164, 1209, 5, 107, 0, 0, 1165, 1166, 5, 108, 0, 0, 1166, 1209, 3, 148, 74, 0, 1167, 1168, 5, 109, 0, 0, 1168, 1169, 5, 136, 0, 0, 1169, 1170, 3, 146, 73, 0, 1170, 1171, 5, 137, 0, 0, 1171, 1209, 1, 0, 0, 0, 1172, 1173, 5, 110, 0, 0, 1173, 1174, 5, 136, 0, 0, 1174, 1176, 3, 146, 73, 0, 1175, 1177, 3, 28, 14, 0, 1176, 1175, 1, 0, 0, 0, 1176, 1177, 1, 0, 0, 0, 1177, 1178, 1, 0, 0, 0, 1178, 1179, 5, 137, 0, 0, 1179, 1209, 1, 0, 0, 0, 1180, 1181, 5, 34, 0, 0, 1181, 1182, 5, 136, 0, 0, 1182, 1183, 3, 146, 73, 0, 1183, 1184, 5, 137, 0, 0, 1184, 1209, 1, 0, 0, 0, 1185, 1186, 5, 111, 0, 0, 1186, 1187, 5, 136, 0, 0, 1187, 1188, 3, 130, 65, 0, 1188, 1189, 5, 137, 0, 0, 1189, 1209, 1, 0, 0, 0, 1190, 1191, 5, 112, 0, 0, 1191, 1192, 5, 136, 0, 0, 1192, 1193, 3, 130, 65, 0, 1193, 1194, 5, 137, 0, 0, 1194, 1209, 1, 0, 0, 0, 1195, 1196, 5, 113, 0, 0, 1196, 1200, 5, 130, 0, 0, 1197, 1199, 3, 132, 66, 0, 1198, 1197, 1, 0, 0, 0, 1199, 1202, 1, 0, 0, 0, 1200, 1198, 1, 0, 0, 0, 1200, 1201, 1, 0, 0, 0, 1201, 1203, 1, 0, 0, 0, 1202, 1200, 1, 0, 0, 0, 1203, 1209, 5, 131, 0, 0, 1204, 1206, 3, 146, 73, 0, 1205, 1207, 3, 28, 14, 0, 1206, 1205, 1, 0, 0, 0, 1206, 1207, 1, 0, 0, 0, 1207, 1209, 1, 0, 0, 0, 1208, 1162, 1, 0, 0, 0, 1208, 1163, 1, 0, 0, 0, 1208, 1164, 1, 0, 0, 0, 1208, 1165, 1, 0, 0, 0, 1208, 1167, 1, 0, 0, 0, 1208, 1172, 1, 0, 0, 0, 1208, 1180, 1, 0, 0, 0, 1208, 1185, 1, 0, 0, 0, 1208, 1190, 1, 0, 0, 0, 1208, 1195, 1, 0, 0, 0, 1208, 1204, 1, 0, 0, 0, 1209, 131, 1, 0, 0, 0, 1210, 1211, 3, 146, 73, 0, 1211, 1212, 5, 126, 0, 0, 1212, 1213, 3, 130, 65, 0, 1213, 1214, 5, 127, 0, 0, 1214, 133, 1, 0, 0, 0, 1215, 1216, 7, 6, 0, 0, 1216, 135, 1, 0, 0, 0, 1217, 1218, 7, 7, 0, 0, 1218, 137, 1, 0, 0, 0, 1219, 1228, 3, 148, 74, 0, 1220, 1228, 5, 140, 0, 0, 1221, 1228, 5, 141, 0, 0, 1222, 1228, 5, 122, 0, 0, 1223, 1228, 5, 123, 0, 0, 1224, 1228, 5, 124, 0, 0, 1225, 1228, 3, 140, 70, 0, 1226, 1228, 3, 144, 72, 0, 1227, 1219, 1, 0, 0, 0, 1227, 1220, 1, 0, 0, 0, 1227, 1221, 1, 0, 0, 0, 1227, 1222, 1, 0, 0, 0, 1227, 1223, 1, 0, 0, 0, 1227, 1224, 1, 0, 0, 0, 1227, 1225, 1, 0, 0, 0, 1227, 1226, 1, 0, 0, 0, 1228, 139, 1, 0, 0, 0, 1229, 1238, 5, 130, 0, 0, 1230, 1235, 3, 142, 71, 0, 1231, 1232, 5, 128, 0, 0, 1232, 1234, 3, 142, 71, 0, 1233, 1231, 1, 0, 0, 0, 1234, 1237, 1, 0, 0, 0, 1235, 1233, 1, 0, 0, 0, 1235, 1236, 1, 0, 0, 0, 1236, 1239, 1, 0, 0, 0, 1237, 1235, 1, 0, 0, 0, 1238, 1230, 1, 0, 0, 0, 1238, 1239, 1, 0, 0, 0, 1239, 1240, 1, 0, 0, 0, 1240, 1241, 5, 131, 0, 0, 1241, 141, 1, 0, 0, 0, 1242, 1243, 3, 148, 74, 0, 1243, 1244, 5, 126, 0, 0, 1244, 1245, 3, 138, 69, 0, 1245, 143, 1, 0, 0, 0, 1246, 1255, 5, 132, 0, 0, 1247, 1252, 3, 138, 69, 0, 1248, 1249, 5, 128, 0, 0, 1249, 1251, 3, 138, 69, 0, 1250, 1248, 1, 0, 0, 0, 1251, 1254, 1, 0, 0, 0, 1252, 1250, 1, 0, 0, 0, 1252, 1253, 1, 0, 0, 0, 1253, 1256, 1, 0, 0, 0, 1254, 1252, 1, 0, 0, 0, 1255, 1247, 1, 0, 0, 0, 1255, 1256, 1, 0, 0, 0, 1256, 1257, 1, 0, 0, 0, 1257, 1258, 5, 133, 0, 0, 1258, 145, 1, 0, 0, 0, 1259, 1260, 7, 8, 0, 0, 1260, 147, 1, 0, 0, 0, 1261, 1262, 5, 143, 0, 0, 1262, 149, 1, 0, 0, 0, 111, 162, 169, 190, 202, 214, 234, 242, 249, 255, 267, 270, 276, 287, 296, 306, 309, 311, 315, 323, 335, 340, 349, 352, 367, 373, 385, 394, 402, 410, 423, 426, 436, 440, 446, 453, 459, 467, 475, 488, 495, 499, 504, 515, 521, 531, 536, 542, 553, 580, 607, 612, 623, 626, 631, 638, 647, 650, 663, 672, 686, 707, 710, 713, 720, 728, 768, 771, 793, 807, 815, 827, 841, 851, 869, 873, 876, 880, 883, 892, 896, 900, 906, 917, 924, 944, 953, 985, 1005, 1022, 1032, 1035, 1037, 1048, 1072, 1088, 1097, 1105, 1118, 1133, 1145, 1149, 1158, 1176, 1200, 1206, 1208, 1227, 1235, 1238, 1252, 1255] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapability.tokens b/src/capability-language/generated/QuixosCapability.tokens index 879ca09..25f0df9 100644 --- a/src/capability-language/generated/QuixosCapability.tokens +++ b/src/capability-language/generated/QuixosCapability.tokens @@ -1,283 +1,285 @@ -CREATION=1 -INITIALIZE=2 -WORKSPACE=3 -EXECUTION=4 -SNAPSHOT=5 -TRANSACTION=6 -REMOTE=7 -TARGETS=8 -PORTABLE=9 -REPLICA=10 -LOCAL=11 -FROM=12 -RESULT_BYTES=13 -RPC_CALLS=14 -DEADLINE_MS=15 -QUERY=16 -REFLECTION=17 -SPECIALIZE=18 -ROOT=19 -DOCUMENT=20 -FRAGMENTS=21 -VIEW=22 -MAX=23 -ALLOW=24 -POLL=25 -QUERYABLE=26 -RPC=27 -QUERY_REASON=28 -TYPE=29 -OBJECT=30 -STORABLE=31 -IMPLEMENTS=32 -REF=33 -FRAGMENT=34 -IMPORT=35 -EXTERNAL=36 -ATOM=37 -INTERFACE=38 -INTERFACES=39 -PACKAGE=40 -VALUE=41 -RELATION=42 -OPERATION=43 -FUNCTION=44 -CONSTRUCTOR=45 -CONSTRUCTS=46 -INPUT=47 -CONFORM=48 -AS=49 -BIND=50 -STATIC=51 -TO=52 -PRIVATE=53 -SHARED=54 -STATE=55 -EDGE=56 -PROJECTION=57 -WITH=58 -USING=59 -VIA=60 -MATERIALIZE=61 -IF=62 -ABSENT=63 -ON=64 -POLICY=65 -DEFAULT=66 -SOURCE=67 -REPOSITORY=68 -COMMIT=69 -REVISION=70 -SEMANTIC_MAJOR=71 -ON_DELETE=72 -RETAIN_OTHER=73 -KEYED=74 -PUBLIC_TRAVERSAL=75 -ID=76 -DOC=77 -MODE=78 -EMITS=79 -RECEIVER=80 -REQUIRES=81 -ANY=82 -GET=83 -SET=84 -WATCH=85 -START=86 -STOP=87 -READ=88 -WRITE=89 -RESOLVE=90 -CONNECT=91 -DISCONNECT=92 -CALL=93 -WATCH_START=94 -WATCH_STOP=95 -SUBSCRIBE=96 -UNSUBSCRIBE=97 -REGISTER=98 -CRDT=99 -OPTIONAL_ONE=100 -EXACTLY_ONE=101 -MANY_UNIQUE=102 -MANY=103 -ORDERED=104 -UNIT=105 -WATCH_HANDLE=106 -MESSAGE=107 -ATOM_REF=108 -INTERFACE_REF=109 -OPTIONAL=110 -LIST=111 -RECORD=112 -BOOL=113 -BYTES=114 -DOUBLE=115 -INT32=116 -INT64=117 -STRING=118 -UINT32=119 -UINT64=120 -TRUE=121 -FALSE=122 -NULL=123 -ARROW=124 -COLON=125 -SEMI=126 -COMMA=127 -DOT=128 -LBRACE=129 -RBRACE=130 -LBRACK=131 -RBRACK=132 -LPAREN=133 -RPAREN=134 -LT=135 -GT=136 -AMP=137 -EQUAL=138 -INTEGER=139 -JSON_NUMBER=140 -IDENTIFIER=141 -STRING_LITERAL=142 -LINE_COMMENT=143 -BLOCK_COMMENT=144 -WS=145 -'creation'=1 -'initialize'=2 -'workspace'=3 -'execution'=4 -'snapshot'=5 -'transaction'=6 -'remote'=7 -'targets'=8 -'portable'=9 -'replica'=10 -'local'=11 -'from'=12 -'result-bytes'=13 -'rpc-calls'=14 -'deadline-ms'=15 -'query'=16 -'reflection'=17 -'specialize'=18 -'root'=19 -'document'=20 -'fragments'=21 -'view'=22 -'max'=23 -'allow'=24 -'poll'=25 -'queryable'=26 -'rpc'=27 -'query-reason'=28 -'type'=29 -'object'=30 -'storable'=31 -'implements'=32 -'ref'=33 -'fragment'=34 -'import'=35 -'external'=36 -'atom'=37 -'interface'=38 -'interfaces'=39 -'package'=40 -'value'=41 -'relation'=42 -'operation'=43 -'function'=44 -'constructor'=45 -'constructs'=46 -'input'=47 -'conform'=48 -'as'=49 -'bind'=50 -'static'=51 -'to'=52 -'private'=53 -'shared'=54 -'state'=55 -'edge'=56 -'projection'=57 -'with'=58 -'using'=59 -'via'=60 -'materialize'=61 -'if'=62 -'absent'=63 -'on'=64 -'policy'=65 -'default'=66 -'source'=67 -'repository'=68 -'commit'=69 -'revision'=70 -'semantic-major'=71 -'on-delete'=72 -'retain-other'=73 -'keyed'=74 -'public-traversal'=75 -'id'=76 -'doc'=77 -'mode'=78 -'emits'=79 -'receiver'=80 -'requires'=81 -'any'=82 -'get'=83 -'set'=84 -'watch'=85 -'start'=86 -'stop'=87 -'read'=88 -'write'=89 -'resolve'=90 -'connect'=91 -'disconnect'=92 -'call'=93 -'watch-start'=94 -'watch-stop'=95 -'subscribe'=96 -'unsubscribe'=97 -'register'=98 -'crdt'=99 -'optional-one'=100 -'exactly-one'=101 -'many-unique'=102 -'many'=103 -'ordered'=104 -'unit'=105 -'watch-handle'=106 -'message'=107 -'atom-ref'=108 -'interface-ref'=109 -'optional'=110 -'list'=111 -'record'=112 -'bool'=113 -'bytes'=114 -'double'=115 -'int32'=116 -'int64'=117 -'string'=118 -'uint32'=119 -'uint64'=120 -'true'=121 -'false'=122 -'null'=123 -'->'=124 -':'=125 -';'=126 -','=127 -'.'=128 -'{'=129 -'}'=130 -'['=131 -']'=132 -'('=133 -')'=134 -'<'=135 -'>'=136 -'&'=137 -'='=138 +EDIT=1 +CREATION=2 +INITIALIZE=3 +WORKSPACE=4 +EXECUTION=5 +SNAPSHOT=6 +TRANSACTION=7 +REMOTE=8 +TARGETS=9 +PORTABLE=10 +REPLICA=11 +LOCAL=12 +FROM=13 +RESULT_BYTES=14 +RPC_CALLS=15 +DEADLINE_MS=16 +QUERY=17 +REFLECTION=18 +SPECIALIZE=19 +ROOT=20 +DOCUMENT=21 +FRAGMENTS=22 +VIEW=23 +MAX=24 +ALLOW=25 +POLL=26 +QUERYABLE=27 +RPC=28 +QUERY_REASON=29 +TYPE=30 +OBJECT=31 +STORABLE=32 +IMPLEMENTS=33 +REF=34 +FRAGMENT=35 +IMPORT=36 +EXTERNAL=37 +ATOM=38 +INTERFACE=39 +INTERFACES=40 +PACKAGE=41 +VALUE=42 +RELATION=43 +OPERATION=44 +FUNCTION=45 +CONSTRUCTOR=46 +CONSTRUCTS=47 +INPUT=48 +CONFORM=49 +AS=50 +BIND=51 +STATIC=52 +TO=53 +PRIVATE=54 +SHARED=55 +STATE=56 +EDGE=57 +PROJECTION=58 +WITH=59 +USING=60 +VIA=61 +MATERIALIZE=62 +IF=63 +ABSENT=64 +ON=65 +POLICY=66 +DEFAULT=67 +SOURCE=68 +REPOSITORY=69 +COMMIT=70 +REVISION=71 +SEMANTIC_MAJOR=72 +ON_DELETE=73 +RETAIN_OTHER=74 +KEYED=75 +PUBLIC_TRAVERSAL=76 +ID=77 +DOC=78 +MODE=79 +EMITS=80 +RECEIVER=81 +REQUIRES=82 +ANY=83 +GET=84 +SET=85 +WATCH=86 +START=87 +STOP=88 +READ=89 +WRITE=90 +RESOLVE=91 +CONNECT=92 +DISCONNECT=93 +CALL=94 +WATCH_START=95 +WATCH_STOP=96 +SUBSCRIBE=97 +UNSUBSCRIBE=98 +REGISTER=99 +CRDT=100 +OPTIONAL_ONE=101 +EXACTLY_ONE=102 +MANY_UNIQUE=103 +MANY=104 +ORDERED=105 +UNIT=106 +WATCH_HANDLE=107 +MESSAGE=108 +ATOM_REF=109 +INTERFACE_REF=110 +OPTIONAL=111 +LIST=112 +RECORD=113 +BOOL=114 +BYTES=115 +DOUBLE=116 +INT32=117 +INT64=118 +STRING=119 +UINT32=120 +UINT64=121 +TRUE=122 +FALSE=123 +NULL=124 +ARROW=125 +COLON=126 +SEMI=127 +COMMA=128 +DOT=129 +LBRACE=130 +RBRACE=131 +LBRACK=132 +RBRACK=133 +LPAREN=134 +RPAREN=135 +LT=136 +GT=137 +AMP=138 +EQUAL=139 +INTEGER=140 +JSON_NUMBER=141 +IDENTIFIER=142 +STRING_LITERAL=143 +LINE_COMMENT=144 +BLOCK_COMMENT=145 +WS=146 +'edit'=1 +'creation'=2 +'initialize'=3 +'workspace'=4 +'execution'=5 +'snapshot'=6 +'transaction'=7 +'remote'=8 +'targets'=9 +'portable'=10 +'replica'=11 +'local'=12 +'from'=13 +'result-bytes'=14 +'rpc-calls'=15 +'deadline-ms'=16 +'query'=17 +'reflection'=18 +'specialize'=19 +'root'=20 +'document'=21 +'fragments'=22 +'view'=23 +'max'=24 +'allow'=25 +'poll'=26 +'queryable'=27 +'rpc'=28 +'query-reason'=29 +'type'=30 +'object'=31 +'storable'=32 +'implements'=33 +'ref'=34 +'fragment'=35 +'import'=36 +'external'=37 +'atom'=38 +'interface'=39 +'interfaces'=40 +'package'=41 +'value'=42 +'relation'=43 +'operation'=44 +'function'=45 +'constructor'=46 +'constructs'=47 +'input'=48 +'conform'=49 +'as'=50 +'bind'=51 +'static'=52 +'to'=53 +'private'=54 +'shared'=55 +'state'=56 +'edge'=57 +'projection'=58 +'with'=59 +'using'=60 +'via'=61 +'materialize'=62 +'if'=63 +'absent'=64 +'on'=65 +'policy'=66 +'default'=67 +'source'=68 +'repository'=69 +'commit'=70 +'revision'=71 +'semantic-major'=72 +'on-delete'=73 +'retain-other'=74 +'keyed'=75 +'public-traversal'=76 +'id'=77 +'doc'=78 +'mode'=79 +'emits'=80 +'receiver'=81 +'requires'=82 +'any'=83 +'get'=84 +'set'=85 +'watch'=86 +'start'=87 +'stop'=88 +'read'=89 +'write'=90 +'resolve'=91 +'connect'=92 +'disconnect'=93 +'call'=94 +'watch-start'=95 +'watch-stop'=96 +'subscribe'=97 +'unsubscribe'=98 +'register'=99 +'crdt'=100 +'optional-one'=101 +'exactly-one'=102 +'many-unique'=103 +'many'=104 +'ordered'=105 +'unit'=106 +'watch-handle'=107 +'message'=108 +'atom-ref'=109 +'interface-ref'=110 +'optional'=111 +'list'=112 +'record'=113 +'bool'=114 +'bytes'=115 +'double'=116 +'int32'=117 +'int64'=118 +'string'=119 +'uint32'=120 +'uint64'=121 +'true'=122 +'false'=123 +'null'=124 +'->'=125 +':'=126 +';'=127 +','=128 +'.'=129 +'{'=130 +'}'=131 +'['=132 +']'=133 +'('=134 +')'=135 +'<'=136 +'>'=137 +'&'=138 +'='=139 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.interp b/src/capability-language/generated/QuixosCapabilityLexer.interp index 11408b7..fff6f1b 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.interp +++ b/src/capability-language/generated/QuixosCapabilityLexer.interp @@ -1,5 +1,6 @@ token literal names: null +'edit' 'creation' 'initialize' 'workspace' @@ -148,6 +149,7 @@ null token symbolic names: null +EDIT CREATION INITIALIZE WORKSPACE @@ -295,6 +297,7 @@ BLOCK_COMMENT WS rule names: +EDIT CREATION INITIALIZE WORKSPACE @@ -451,4 +454,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 145, 1390, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 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, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 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, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 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, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 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, 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, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 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, 27, 1, 27, 1, 27, 1, 27, 1, 27, 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, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 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, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 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, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 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, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 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, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 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, 45, 1, 45, 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, 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, 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, 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, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 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, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 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, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 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, 67, 1, 67, 1, 67, 1, 67, 1, 67, 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, 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, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 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, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 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, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 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, 85, 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, 89, 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, 91, 1, 91, 1, 91, 1, 91, 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, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 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, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 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, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 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, 99, 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, 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, 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, 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, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 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, 3, 138, 1291, 8, 138, 1, 138, 4, 138, 1294, 8, 138, 11, 138, 12, 138, 1295, 1, 139, 3, 139, 1299, 8, 139, 1, 139, 1, 139, 1, 139, 5, 139, 1304, 8, 139, 10, 139, 12, 139, 1307, 9, 139, 3, 139, 1309, 8, 139, 1, 139, 1, 139, 4, 139, 1313, 8, 139, 11, 139, 12, 139, 1314, 3, 139, 1317, 8, 139, 1, 139, 1, 139, 3, 139, 1321, 8, 139, 1, 139, 4, 139, 1324, 8, 139, 11, 139, 12, 139, 1325, 3, 139, 1328, 8, 139, 1, 140, 1, 140, 5, 140, 1332, 8, 140, 10, 140, 12, 140, 1335, 9, 140, 1, 141, 1, 141, 1, 141, 5, 141, 1340, 8, 141, 10, 141, 12, 141, 1343, 9, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 1, 142, 3, 142, 1355, 8, 142, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 5, 144, 1363, 8, 144, 10, 144, 12, 144, 1366, 9, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 5, 145, 1374, 8, 145, 10, 145, 12, 145, 1377, 9, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 146, 4, 146, 1385, 8, 146, 11, 146, 12, 146, 1386, 1, 146, 1, 146, 1, 1375, 0, 147, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 0, 287, 0, 289, 143, 291, 144, 293, 145, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1404, 0, 1, 1, 0, 0, 0, 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, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 1, 0, 0, 0, 0, 289, 1, 0, 0, 0, 0, 291, 1, 0, 0, 0, 0, 293, 1, 0, 0, 0, 1, 295, 1, 0, 0, 0, 3, 304, 1, 0, 0, 0, 5, 315, 1, 0, 0, 0, 7, 325, 1, 0, 0, 0, 9, 335, 1, 0, 0, 0, 11, 344, 1, 0, 0, 0, 13, 356, 1, 0, 0, 0, 15, 363, 1, 0, 0, 0, 17, 371, 1, 0, 0, 0, 19, 380, 1, 0, 0, 0, 21, 388, 1, 0, 0, 0, 23, 394, 1, 0, 0, 0, 25, 399, 1, 0, 0, 0, 27, 412, 1, 0, 0, 0, 29, 422, 1, 0, 0, 0, 31, 434, 1, 0, 0, 0, 33, 440, 1, 0, 0, 0, 35, 451, 1, 0, 0, 0, 37, 462, 1, 0, 0, 0, 39, 467, 1, 0, 0, 0, 41, 476, 1, 0, 0, 0, 43, 486, 1, 0, 0, 0, 45, 491, 1, 0, 0, 0, 47, 495, 1, 0, 0, 0, 49, 501, 1, 0, 0, 0, 51, 506, 1, 0, 0, 0, 53, 516, 1, 0, 0, 0, 55, 520, 1, 0, 0, 0, 57, 533, 1, 0, 0, 0, 59, 538, 1, 0, 0, 0, 61, 545, 1, 0, 0, 0, 63, 554, 1, 0, 0, 0, 65, 565, 1, 0, 0, 0, 67, 569, 1, 0, 0, 0, 69, 578, 1, 0, 0, 0, 71, 585, 1, 0, 0, 0, 73, 594, 1, 0, 0, 0, 75, 599, 1, 0, 0, 0, 77, 609, 1, 0, 0, 0, 79, 620, 1, 0, 0, 0, 81, 628, 1, 0, 0, 0, 83, 634, 1, 0, 0, 0, 85, 643, 1, 0, 0, 0, 87, 653, 1, 0, 0, 0, 89, 662, 1, 0, 0, 0, 91, 674, 1, 0, 0, 0, 93, 685, 1, 0, 0, 0, 95, 691, 1, 0, 0, 0, 97, 699, 1, 0, 0, 0, 99, 702, 1, 0, 0, 0, 101, 707, 1, 0, 0, 0, 103, 714, 1, 0, 0, 0, 105, 717, 1, 0, 0, 0, 107, 725, 1, 0, 0, 0, 109, 732, 1, 0, 0, 0, 111, 738, 1, 0, 0, 0, 113, 743, 1, 0, 0, 0, 115, 754, 1, 0, 0, 0, 117, 759, 1, 0, 0, 0, 119, 765, 1, 0, 0, 0, 121, 769, 1, 0, 0, 0, 123, 781, 1, 0, 0, 0, 125, 784, 1, 0, 0, 0, 127, 791, 1, 0, 0, 0, 129, 794, 1, 0, 0, 0, 131, 801, 1, 0, 0, 0, 133, 809, 1, 0, 0, 0, 135, 816, 1, 0, 0, 0, 137, 827, 1, 0, 0, 0, 139, 834, 1, 0, 0, 0, 141, 843, 1, 0, 0, 0, 143, 858, 1, 0, 0, 0, 145, 868, 1, 0, 0, 0, 147, 881, 1, 0, 0, 0, 149, 887, 1, 0, 0, 0, 151, 904, 1, 0, 0, 0, 153, 907, 1, 0, 0, 0, 155, 911, 1, 0, 0, 0, 157, 916, 1, 0, 0, 0, 159, 922, 1, 0, 0, 0, 161, 931, 1, 0, 0, 0, 163, 940, 1, 0, 0, 0, 165, 944, 1, 0, 0, 0, 167, 948, 1, 0, 0, 0, 169, 952, 1, 0, 0, 0, 171, 958, 1, 0, 0, 0, 173, 964, 1, 0, 0, 0, 175, 969, 1, 0, 0, 0, 177, 974, 1, 0, 0, 0, 179, 980, 1, 0, 0, 0, 181, 988, 1, 0, 0, 0, 183, 996, 1, 0, 0, 0, 185, 1007, 1, 0, 0, 0, 187, 1012, 1, 0, 0, 0, 189, 1024, 1, 0, 0, 0, 191, 1035, 1, 0, 0, 0, 193, 1045, 1, 0, 0, 0, 195, 1057, 1, 0, 0, 0, 197, 1066, 1, 0, 0, 0, 199, 1071, 1, 0, 0, 0, 201, 1084, 1, 0, 0, 0, 203, 1096, 1, 0, 0, 0, 205, 1108, 1, 0, 0, 0, 207, 1113, 1, 0, 0, 0, 209, 1121, 1, 0, 0, 0, 211, 1126, 1, 0, 0, 0, 213, 1139, 1, 0, 0, 0, 215, 1147, 1, 0, 0, 0, 217, 1156, 1, 0, 0, 0, 219, 1170, 1, 0, 0, 0, 221, 1179, 1, 0, 0, 0, 223, 1184, 1, 0, 0, 0, 225, 1191, 1, 0, 0, 0, 227, 1196, 1, 0, 0, 0, 229, 1202, 1, 0, 0, 0, 231, 1209, 1, 0, 0, 0, 233, 1215, 1, 0, 0, 0, 235, 1221, 1, 0, 0, 0, 237, 1228, 1, 0, 0, 0, 239, 1235, 1, 0, 0, 0, 241, 1242, 1, 0, 0, 0, 243, 1247, 1, 0, 0, 0, 245, 1253, 1, 0, 0, 0, 247, 1258, 1, 0, 0, 0, 249, 1261, 1, 0, 0, 0, 251, 1263, 1, 0, 0, 0, 253, 1265, 1, 0, 0, 0, 255, 1267, 1, 0, 0, 0, 257, 1269, 1, 0, 0, 0, 259, 1271, 1, 0, 0, 0, 261, 1273, 1, 0, 0, 0, 263, 1275, 1, 0, 0, 0, 265, 1277, 1, 0, 0, 0, 267, 1279, 1, 0, 0, 0, 269, 1281, 1, 0, 0, 0, 271, 1283, 1, 0, 0, 0, 273, 1285, 1, 0, 0, 0, 275, 1287, 1, 0, 0, 0, 277, 1290, 1, 0, 0, 0, 279, 1298, 1, 0, 0, 0, 281, 1329, 1, 0, 0, 0, 283, 1336, 1, 0, 0, 0, 285, 1346, 1, 0, 0, 0, 287, 1356, 1, 0, 0, 0, 289, 1358, 1, 0, 0, 0, 291, 1369, 1, 0, 0, 0, 293, 1384, 1, 0, 0, 0, 295, 296, 5, 99, 0, 0, 296, 297, 5, 114, 0, 0, 297, 298, 5, 101, 0, 0, 298, 299, 5, 97, 0, 0, 299, 300, 5, 116, 0, 0, 300, 301, 5, 105, 0, 0, 301, 302, 5, 111, 0, 0, 302, 303, 5, 110, 0, 0, 303, 2, 1, 0, 0, 0, 304, 305, 5, 105, 0, 0, 305, 306, 5, 110, 0, 0, 306, 307, 5, 105, 0, 0, 307, 308, 5, 116, 0, 0, 308, 309, 5, 105, 0, 0, 309, 310, 5, 97, 0, 0, 310, 311, 5, 108, 0, 0, 311, 312, 5, 105, 0, 0, 312, 313, 5, 122, 0, 0, 313, 314, 5, 101, 0, 0, 314, 4, 1, 0, 0, 0, 315, 316, 5, 119, 0, 0, 316, 317, 5, 111, 0, 0, 317, 318, 5, 114, 0, 0, 318, 319, 5, 107, 0, 0, 319, 320, 5, 115, 0, 0, 320, 321, 5, 112, 0, 0, 321, 322, 5, 97, 0, 0, 322, 323, 5, 99, 0, 0, 323, 324, 5, 101, 0, 0, 324, 6, 1, 0, 0, 0, 325, 326, 5, 101, 0, 0, 326, 327, 5, 120, 0, 0, 327, 328, 5, 101, 0, 0, 328, 329, 5, 99, 0, 0, 329, 330, 5, 117, 0, 0, 330, 331, 5, 116, 0, 0, 331, 332, 5, 105, 0, 0, 332, 333, 5, 111, 0, 0, 333, 334, 5, 110, 0, 0, 334, 8, 1, 0, 0, 0, 335, 336, 5, 115, 0, 0, 336, 337, 5, 110, 0, 0, 337, 338, 5, 97, 0, 0, 338, 339, 5, 112, 0, 0, 339, 340, 5, 115, 0, 0, 340, 341, 5, 104, 0, 0, 341, 342, 5, 111, 0, 0, 342, 343, 5, 116, 0, 0, 343, 10, 1, 0, 0, 0, 344, 345, 5, 116, 0, 0, 345, 346, 5, 114, 0, 0, 346, 347, 5, 97, 0, 0, 347, 348, 5, 110, 0, 0, 348, 349, 5, 115, 0, 0, 349, 350, 5, 97, 0, 0, 350, 351, 5, 99, 0, 0, 351, 352, 5, 116, 0, 0, 352, 353, 5, 105, 0, 0, 353, 354, 5, 111, 0, 0, 354, 355, 5, 110, 0, 0, 355, 12, 1, 0, 0, 0, 356, 357, 5, 114, 0, 0, 357, 358, 5, 101, 0, 0, 358, 359, 5, 109, 0, 0, 359, 360, 5, 111, 0, 0, 360, 361, 5, 116, 0, 0, 361, 362, 5, 101, 0, 0, 362, 14, 1, 0, 0, 0, 363, 364, 5, 116, 0, 0, 364, 365, 5, 97, 0, 0, 365, 366, 5, 114, 0, 0, 366, 367, 5, 103, 0, 0, 367, 368, 5, 101, 0, 0, 368, 369, 5, 116, 0, 0, 369, 370, 5, 115, 0, 0, 370, 16, 1, 0, 0, 0, 371, 372, 5, 112, 0, 0, 372, 373, 5, 111, 0, 0, 373, 374, 5, 114, 0, 0, 374, 375, 5, 116, 0, 0, 375, 376, 5, 97, 0, 0, 376, 377, 5, 98, 0, 0, 377, 378, 5, 108, 0, 0, 378, 379, 5, 101, 0, 0, 379, 18, 1, 0, 0, 0, 380, 381, 5, 114, 0, 0, 381, 382, 5, 101, 0, 0, 382, 383, 5, 112, 0, 0, 383, 384, 5, 108, 0, 0, 384, 385, 5, 105, 0, 0, 385, 386, 5, 99, 0, 0, 386, 387, 5, 97, 0, 0, 387, 20, 1, 0, 0, 0, 388, 389, 5, 108, 0, 0, 389, 390, 5, 111, 0, 0, 390, 391, 5, 99, 0, 0, 391, 392, 5, 97, 0, 0, 392, 393, 5, 108, 0, 0, 393, 22, 1, 0, 0, 0, 394, 395, 5, 102, 0, 0, 395, 396, 5, 114, 0, 0, 396, 397, 5, 111, 0, 0, 397, 398, 5, 109, 0, 0, 398, 24, 1, 0, 0, 0, 399, 400, 5, 114, 0, 0, 400, 401, 5, 101, 0, 0, 401, 402, 5, 115, 0, 0, 402, 403, 5, 117, 0, 0, 403, 404, 5, 108, 0, 0, 404, 405, 5, 116, 0, 0, 405, 406, 5, 45, 0, 0, 406, 407, 5, 98, 0, 0, 407, 408, 5, 121, 0, 0, 408, 409, 5, 116, 0, 0, 409, 410, 5, 101, 0, 0, 410, 411, 5, 115, 0, 0, 411, 26, 1, 0, 0, 0, 412, 413, 5, 114, 0, 0, 413, 414, 5, 112, 0, 0, 414, 415, 5, 99, 0, 0, 415, 416, 5, 45, 0, 0, 416, 417, 5, 99, 0, 0, 417, 418, 5, 97, 0, 0, 418, 419, 5, 108, 0, 0, 419, 420, 5, 108, 0, 0, 420, 421, 5, 115, 0, 0, 421, 28, 1, 0, 0, 0, 422, 423, 5, 100, 0, 0, 423, 424, 5, 101, 0, 0, 424, 425, 5, 97, 0, 0, 425, 426, 5, 100, 0, 0, 426, 427, 5, 108, 0, 0, 427, 428, 5, 105, 0, 0, 428, 429, 5, 110, 0, 0, 429, 430, 5, 101, 0, 0, 430, 431, 5, 45, 0, 0, 431, 432, 5, 109, 0, 0, 432, 433, 5, 115, 0, 0, 433, 30, 1, 0, 0, 0, 434, 435, 5, 113, 0, 0, 435, 436, 5, 117, 0, 0, 436, 437, 5, 101, 0, 0, 437, 438, 5, 114, 0, 0, 438, 439, 5, 121, 0, 0, 439, 32, 1, 0, 0, 0, 440, 441, 5, 114, 0, 0, 441, 442, 5, 101, 0, 0, 442, 443, 5, 102, 0, 0, 443, 444, 5, 108, 0, 0, 444, 445, 5, 101, 0, 0, 445, 446, 5, 99, 0, 0, 446, 447, 5, 116, 0, 0, 447, 448, 5, 105, 0, 0, 448, 449, 5, 111, 0, 0, 449, 450, 5, 110, 0, 0, 450, 34, 1, 0, 0, 0, 451, 452, 5, 115, 0, 0, 452, 453, 5, 112, 0, 0, 453, 454, 5, 101, 0, 0, 454, 455, 5, 99, 0, 0, 455, 456, 5, 105, 0, 0, 456, 457, 5, 97, 0, 0, 457, 458, 5, 108, 0, 0, 458, 459, 5, 105, 0, 0, 459, 460, 5, 122, 0, 0, 460, 461, 5, 101, 0, 0, 461, 36, 1, 0, 0, 0, 462, 463, 5, 114, 0, 0, 463, 464, 5, 111, 0, 0, 464, 465, 5, 111, 0, 0, 465, 466, 5, 116, 0, 0, 466, 38, 1, 0, 0, 0, 467, 468, 5, 100, 0, 0, 468, 469, 5, 111, 0, 0, 469, 470, 5, 99, 0, 0, 470, 471, 5, 117, 0, 0, 471, 472, 5, 109, 0, 0, 472, 473, 5, 101, 0, 0, 473, 474, 5, 110, 0, 0, 474, 475, 5, 116, 0, 0, 475, 40, 1, 0, 0, 0, 476, 477, 5, 102, 0, 0, 477, 478, 5, 114, 0, 0, 478, 479, 5, 97, 0, 0, 479, 480, 5, 103, 0, 0, 480, 481, 5, 109, 0, 0, 481, 482, 5, 101, 0, 0, 482, 483, 5, 110, 0, 0, 483, 484, 5, 116, 0, 0, 484, 485, 5, 115, 0, 0, 485, 42, 1, 0, 0, 0, 486, 487, 5, 118, 0, 0, 487, 488, 5, 105, 0, 0, 488, 489, 5, 101, 0, 0, 489, 490, 5, 119, 0, 0, 490, 44, 1, 0, 0, 0, 491, 492, 5, 109, 0, 0, 492, 493, 5, 97, 0, 0, 493, 494, 5, 120, 0, 0, 494, 46, 1, 0, 0, 0, 495, 496, 5, 97, 0, 0, 496, 497, 5, 108, 0, 0, 497, 498, 5, 108, 0, 0, 498, 499, 5, 111, 0, 0, 499, 500, 5, 119, 0, 0, 500, 48, 1, 0, 0, 0, 501, 502, 5, 112, 0, 0, 502, 503, 5, 111, 0, 0, 503, 504, 5, 108, 0, 0, 504, 505, 5, 108, 0, 0, 505, 50, 1, 0, 0, 0, 506, 507, 5, 113, 0, 0, 507, 508, 5, 117, 0, 0, 508, 509, 5, 101, 0, 0, 509, 510, 5, 114, 0, 0, 510, 511, 5, 121, 0, 0, 511, 512, 5, 97, 0, 0, 512, 513, 5, 98, 0, 0, 513, 514, 5, 108, 0, 0, 514, 515, 5, 101, 0, 0, 515, 52, 1, 0, 0, 0, 516, 517, 5, 114, 0, 0, 517, 518, 5, 112, 0, 0, 518, 519, 5, 99, 0, 0, 519, 54, 1, 0, 0, 0, 520, 521, 5, 113, 0, 0, 521, 522, 5, 117, 0, 0, 522, 523, 5, 101, 0, 0, 523, 524, 5, 114, 0, 0, 524, 525, 5, 121, 0, 0, 525, 526, 5, 45, 0, 0, 526, 527, 5, 114, 0, 0, 527, 528, 5, 101, 0, 0, 528, 529, 5, 97, 0, 0, 529, 530, 5, 115, 0, 0, 530, 531, 5, 111, 0, 0, 531, 532, 5, 110, 0, 0, 532, 56, 1, 0, 0, 0, 533, 534, 5, 116, 0, 0, 534, 535, 5, 121, 0, 0, 535, 536, 5, 112, 0, 0, 536, 537, 5, 101, 0, 0, 537, 58, 1, 0, 0, 0, 538, 539, 5, 111, 0, 0, 539, 540, 5, 98, 0, 0, 540, 541, 5, 106, 0, 0, 541, 542, 5, 101, 0, 0, 542, 543, 5, 99, 0, 0, 543, 544, 5, 116, 0, 0, 544, 60, 1, 0, 0, 0, 545, 546, 5, 115, 0, 0, 546, 547, 5, 116, 0, 0, 547, 548, 5, 111, 0, 0, 548, 549, 5, 114, 0, 0, 549, 550, 5, 97, 0, 0, 550, 551, 5, 98, 0, 0, 551, 552, 5, 108, 0, 0, 552, 553, 5, 101, 0, 0, 553, 62, 1, 0, 0, 0, 554, 555, 5, 105, 0, 0, 555, 556, 5, 109, 0, 0, 556, 557, 5, 112, 0, 0, 557, 558, 5, 108, 0, 0, 558, 559, 5, 101, 0, 0, 559, 560, 5, 109, 0, 0, 560, 561, 5, 101, 0, 0, 561, 562, 5, 110, 0, 0, 562, 563, 5, 116, 0, 0, 563, 564, 5, 115, 0, 0, 564, 64, 1, 0, 0, 0, 565, 566, 5, 114, 0, 0, 566, 567, 5, 101, 0, 0, 567, 568, 5, 102, 0, 0, 568, 66, 1, 0, 0, 0, 569, 570, 5, 102, 0, 0, 570, 571, 5, 114, 0, 0, 571, 572, 5, 97, 0, 0, 572, 573, 5, 103, 0, 0, 573, 574, 5, 109, 0, 0, 574, 575, 5, 101, 0, 0, 575, 576, 5, 110, 0, 0, 576, 577, 5, 116, 0, 0, 577, 68, 1, 0, 0, 0, 578, 579, 5, 105, 0, 0, 579, 580, 5, 109, 0, 0, 580, 581, 5, 112, 0, 0, 581, 582, 5, 111, 0, 0, 582, 583, 5, 114, 0, 0, 583, 584, 5, 116, 0, 0, 584, 70, 1, 0, 0, 0, 585, 586, 5, 101, 0, 0, 586, 587, 5, 120, 0, 0, 587, 588, 5, 116, 0, 0, 588, 589, 5, 101, 0, 0, 589, 590, 5, 114, 0, 0, 590, 591, 5, 110, 0, 0, 591, 592, 5, 97, 0, 0, 592, 593, 5, 108, 0, 0, 593, 72, 1, 0, 0, 0, 594, 595, 5, 97, 0, 0, 595, 596, 5, 116, 0, 0, 596, 597, 5, 111, 0, 0, 597, 598, 5, 109, 0, 0, 598, 74, 1, 0, 0, 0, 599, 600, 5, 105, 0, 0, 600, 601, 5, 110, 0, 0, 601, 602, 5, 116, 0, 0, 602, 603, 5, 101, 0, 0, 603, 604, 5, 114, 0, 0, 604, 605, 5, 102, 0, 0, 605, 606, 5, 97, 0, 0, 606, 607, 5, 99, 0, 0, 607, 608, 5, 101, 0, 0, 608, 76, 1, 0, 0, 0, 609, 610, 5, 105, 0, 0, 610, 611, 5, 110, 0, 0, 611, 612, 5, 116, 0, 0, 612, 613, 5, 101, 0, 0, 613, 614, 5, 114, 0, 0, 614, 615, 5, 102, 0, 0, 615, 616, 5, 97, 0, 0, 616, 617, 5, 99, 0, 0, 617, 618, 5, 101, 0, 0, 618, 619, 5, 115, 0, 0, 619, 78, 1, 0, 0, 0, 620, 621, 5, 112, 0, 0, 621, 622, 5, 97, 0, 0, 622, 623, 5, 99, 0, 0, 623, 624, 5, 107, 0, 0, 624, 625, 5, 97, 0, 0, 625, 626, 5, 103, 0, 0, 626, 627, 5, 101, 0, 0, 627, 80, 1, 0, 0, 0, 628, 629, 5, 118, 0, 0, 629, 630, 5, 97, 0, 0, 630, 631, 5, 108, 0, 0, 631, 632, 5, 117, 0, 0, 632, 633, 5, 101, 0, 0, 633, 82, 1, 0, 0, 0, 634, 635, 5, 114, 0, 0, 635, 636, 5, 101, 0, 0, 636, 637, 5, 108, 0, 0, 637, 638, 5, 97, 0, 0, 638, 639, 5, 116, 0, 0, 639, 640, 5, 105, 0, 0, 640, 641, 5, 111, 0, 0, 641, 642, 5, 110, 0, 0, 642, 84, 1, 0, 0, 0, 643, 644, 5, 111, 0, 0, 644, 645, 5, 112, 0, 0, 645, 646, 5, 101, 0, 0, 646, 647, 5, 114, 0, 0, 647, 648, 5, 97, 0, 0, 648, 649, 5, 116, 0, 0, 649, 650, 5, 105, 0, 0, 650, 651, 5, 111, 0, 0, 651, 652, 5, 110, 0, 0, 652, 86, 1, 0, 0, 0, 653, 654, 5, 102, 0, 0, 654, 655, 5, 117, 0, 0, 655, 656, 5, 110, 0, 0, 656, 657, 5, 99, 0, 0, 657, 658, 5, 116, 0, 0, 658, 659, 5, 105, 0, 0, 659, 660, 5, 111, 0, 0, 660, 661, 5, 110, 0, 0, 661, 88, 1, 0, 0, 0, 662, 663, 5, 99, 0, 0, 663, 664, 5, 111, 0, 0, 664, 665, 5, 110, 0, 0, 665, 666, 5, 115, 0, 0, 666, 667, 5, 116, 0, 0, 667, 668, 5, 114, 0, 0, 668, 669, 5, 117, 0, 0, 669, 670, 5, 99, 0, 0, 670, 671, 5, 116, 0, 0, 671, 672, 5, 111, 0, 0, 672, 673, 5, 114, 0, 0, 673, 90, 1, 0, 0, 0, 674, 675, 5, 99, 0, 0, 675, 676, 5, 111, 0, 0, 676, 677, 5, 110, 0, 0, 677, 678, 5, 115, 0, 0, 678, 679, 5, 116, 0, 0, 679, 680, 5, 114, 0, 0, 680, 681, 5, 117, 0, 0, 681, 682, 5, 99, 0, 0, 682, 683, 5, 116, 0, 0, 683, 684, 5, 115, 0, 0, 684, 92, 1, 0, 0, 0, 685, 686, 5, 105, 0, 0, 686, 687, 5, 110, 0, 0, 687, 688, 5, 112, 0, 0, 688, 689, 5, 117, 0, 0, 689, 690, 5, 116, 0, 0, 690, 94, 1, 0, 0, 0, 691, 692, 5, 99, 0, 0, 692, 693, 5, 111, 0, 0, 693, 694, 5, 110, 0, 0, 694, 695, 5, 102, 0, 0, 695, 696, 5, 111, 0, 0, 696, 697, 5, 114, 0, 0, 697, 698, 5, 109, 0, 0, 698, 96, 1, 0, 0, 0, 699, 700, 5, 97, 0, 0, 700, 701, 5, 115, 0, 0, 701, 98, 1, 0, 0, 0, 702, 703, 5, 98, 0, 0, 703, 704, 5, 105, 0, 0, 704, 705, 5, 110, 0, 0, 705, 706, 5, 100, 0, 0, 706, 100, 1, 0, 0, 0, 707, 708, 5, 115, 0, 0, 708, 709, 5, 116, 0, 0, 709, 710, 5, 97, 0, 0, 710, 711, 5, 116, 0, 0, 711, 712, 5, 105, 0, 0, 712, 713, 5, 99, 0, 0, 713, 102, 1, 0, 0, 0, 714, 715, 5, 116, 0, 0, 715, 716, 5, 111, 0, 0, 716, 104, 1, 0, 0, 0, 717, 718, 5, 112, 0, 0, 718, 719, 5, 114, 0, 0, 719, 720, 5, 105, 0, 0, 720, 721, 5, 118, 0, 0, 721, 722, 5, 97, 0, 0, 722, 723, 5, 116, 0, 0, 723, 724, 5, 101, 0, 0, 724, 106, 1, 0, 0, 0, 725, 726, 5, 115, 0, 0, 726, 727, 5, 104, 0, 0, 727, 728, 5, 97, 0, 0, 728, 729, 5, 114, 0, 0, 729, 730, 5, 101, 0, 0, 730, 731, 5, 100, 0, 0, 731, 108, 1, 0, 0, 0, 732, 733, 5, 115, 0, 0, 733, 734, 5, 116, 0, 0, 734, 735, 5, 97, 0, 0, 735, 736, 5, 116, 0, 0, 736, 737, 5, 101, 0, 0, 737, 110, 1, 0, 0, 0, 738, 739, 5, 101, 0, 0, 739, 740, 5, 100, 0, 0, 740, 741, 5, 103, 0, 0, 741, 742, 5, 101, 0, 0, 742, 112, 1, 0, 0, 0, 743, 744, 5, 112, 0, 0, 744, 745, 5, 114, 0, 0, 745, 746, 5, 111, 0, 0, 746, 747, 5, 106, 0, 0, 747, 748, 5, 101, 0, 0, 748, 749, 5, 99, 0, 0, 749, 750, 5, 116, 0, 0, 750, 751, 5, 105, 0, 0, 751, 752, 5, 111, 0, 0, 752, 753, 5, 110, 0, 0, 753, 114, 1, 0, 0, 0, 754, 755, 5, 119, 0, 0, 755, 756, 5, 105, 0, 0, 756, 757, 5, 116, 0, 0, 757, 758, 5, 104, 0, 0, 758, 116, 1, 0, 0, 0, 759, 760, 5, 117, 0, 0, 760, 761, 5, 115, 0, 0, 761, 762, 5, 105, 0, 0, 762, 763, 5, 110, 0, 0, 763, 764, 5, 103, 0, 0, 764, 118, 1, 0, 0, 0, 765, 766, 5, 118, 0, 0, 766, 767, 5, 105, 0, 0, 767, 768, 5, 97, 0, 0, 768, 120, 1, 0, 0, 0, 769, 770, 5, 109, 0, 0, 770, 771, 5, 97, 0, 0, 771, 772, 5, 116, 0, 0, 772, 773, 5, 101, 0, 0, 773, 774, 5, 114, 0, 0, 774, 775, 5, 105, 0, 0, 775, 776, 5, 97, 0, 0, 776, 777, 5, 108, 0, 0, 777, 778, 5, 105, 0, 0, 778, 779, 5, 122, 0, 0, 779, 780, 5, 101, 0, 0, 780, 122, 1, 0, 0, 0, 781, 782, 5, 105, 0, 0, 782, 783, 5, 102, 0, 0, 783, 124, 1, 0, 0, 0, 784, 785, 5, 97, 0, 0, 785, 786, 5, 98, 0, 0, 786, 787, 5, 115, 0, 0, 787, 788, 5, 101, 0, 0, 788, 789, 5, 110, 0, 0, 789, 790, 5, 116, 0, 0, 790, 126, 1, 0, 0, 0, 791, 792, 5, 111, 0, 0, 792, 793, 5, 110, 0, 0, 793, 128, 1, 0, 0, 0, 794, 795, 5, 112, 0, 0, 795, 796, 5, 111, 0, 0, 796, 797, 5, 108, 0, 0, 797, 798, 5, 105, 0, 0, 798, 799, 5, 99, 0, 0, 799, 800, 5, 121, 0, 0, 800, 130, 1, 0, 0, 0, 801, 802, 5, 100, 0, 0, 802, 803, 5, 101, 0, 0, 803, 804, 5, 102, 0, 0, 804, 805, 5, 97, 0, 0, 805, 806, 5, 117, 0, 0, 806, 807, 5, 108, 0, 0, 807, 808, 5, 116, 0, 0, 808, 132, 1, 0, 0, 0, 809, 810, 5, 115, 0, 0, 810, 811, 5, 111, 0, 0, 811, 812, 5, 117, 0, 0, 812, 813, 5, 114, 0, 0, 813, 814, 5, 99, 0, 0, 814, 815, 5, 101, 0, 0, 815, 134, 1, 0, 0, 0, 816, 817, 5, 114, 0, 0, 817, 818, 5, 101, 0, 0, 818, 819, 5, 112, 0, 0, 819, 820, 5, 111, 0, 0, 820, 821, 5, 115, 0, 0, 821, 822, 5, 105, 0, 0, 822, 823, 5, 116, 0, 0, 823, 824, 5, 111, 0, 0, 824, 825, 5, 114, 0, 0, 825, 826, 5, 121, 0, 0, 826, 136, 1, 0, 0, 0, 827, 828, 5, 99, 0, 0, 828, 829, 5, 111, 0, 0, 829, 830, 5, 109, 0, 0, 830, 831, 5, 109, 0, 0, 831, 832, 5, 105, 0, 0, 832, 833, 5, 116, 0, 0, 833, 138, 1, 0, 0, 0, 834, 835, 5, 114, 0, 0, 835, 836, 5, 101, 0, 0, 836, 837, 5, 118, 0, 0, 837, 838, 5, 105, 0, 0, 838, 839, 5, 115, 0, 0, 839, 840, 5, 105, 0, 0, 840, 841, 5, 111, 0, 0, 841, 842, 5, 110, 0, 0, 842, 140, 1, 0, 0, 0, 843, 844, 5, 115, 0, 0, 844, 845, 5, 101, 0, 0, 845, 846, 5, 109, 0, 0, 846, 847, 5, 97, 0, 0, 847, 848, 5, 110, 0, 0, 848, 849, 5, 116, 0, 0, 849, 850, 5, 105, 0, 0, 850, 851, 5, 99, 0, 0, 851, 852, 5, 45, 0, 0, 852, 853, 5, 109, 0, 0, 853, 854, 5, 97, 0, 0, 854, 855, 5, 106, 0, 0, 855, 856, 5, 111, 0, 0, 856, 857, 5, 114, 0, 0, 857, 142, 1, 0, 0, 0, 858, 859, 5, 111, 0, 0, 859, 860, 5, 110, 0, 0, 860, 861, 5, 45, 0, 0, 861, 862, 5, 100, 0, 0, 862, 863, 5, 101, 0, 0, 863, 864, 5, 108, 0, 0, 864, 865, 5, 101, 0, 0, 865, 866, 5, 116, 0, 0, 866, 867, 5, 101, 0, 0, 867, 144, 1, 0, 0, 0, 868, 869, 5, 114, 0, 0, 869, 870, 5, 101, 0, 0, 870, 871, 5, 116, 0, 0, 871, 872, 5, 97, 0, 0, 872, 873, 5, 105, 0, 0, 873, 874, 5, 110, 0, 0, 874, 875, 5, 45, 0, 0, 875, 876, 5, 111, 0, 0, 876, 877, 5, 116, 0, 0, 877, 878, 5, 104, 0, 0, 878, 879, 5, 101, 0, 0, 879, 880, 5, 114, 0, 0, 880, 146, 1, 0, 0, 0, 881, 882, 5, 107, 0, 0, 882, 883, 5, 101, 0, 0, 883, 884, 5, 121, 0, 0, 884, 885, 5, 101, 0, 0, 885, 886, 5, 100, 0, 0, 886, 148, 1, 0, 0, 0, 887, 888, 5, 112, 0, 0, 888, 889, 5, 117, 0, 0, 889, 890, 5, 98, 0, 0, 890, 891, 5, 108, 0, 0, 891, 892, 5, 105, 0, 0, 892, 893, 5, 99, 0, 0, 893, 894, 5, 45, 0, 0, 894, 895, 5, 116, 0, 0, 895, 896, 5, 114, 0, 0, 896, 897, 5, 97, 0, 0, 897, 898, 5, 118, 0, 0, 898, 899, 5, 101, 0, 0, 899, 900, 5, 114, 0, 0, 900, 901, 5, 115, 0, 0, 901, 902, 5, 97, 0, 0, 902, 903, 5, 108, 0, 0, 903, 150, 1, 0, 0, 0, 904, 905, 5, 105, 0, 0, 905, 906, 5, 100, 0, 0, 906, 152, 1, 0, 0, 0, 907, 908, 5, 100, 0, 0, 908, 909, 5, 111, 0, 0, 909, 910, 5, 99, 0, 0, 910, 154, 1, 0, 0, 0, 911, 912, 5, 109, 0, 0, 912, 913, 5, 111, 0, 0, 913, 914, 5, 100, 0, 0, 914, 915, 5, 101, 0, 0, 915, 156, 1, 0, 0, 0, 916, 917, 5, 101, 0, 0, 917, 918, 5, 109, 0, 0, 918, 919, 5, 105, 0, 0, 919, 920, 5, 116, 0, 0, 920, 921, 5, 115, 0, 0, 921, 158, 1, 0, 0, 0, 922, 923, 5, 114, 0, 0, 923, 924, 5, 101, 0, 0, 924, 925, 5, 99, 0, 0, 925, 926, 5, 101, 0, 0, 926, 927, 5, 105, 0, 0, 927, 928, 5, 118, 0, 0, 928, 929, 5, 101, 0, 0, 929, 930, 5, 114, 0, 0, 930, 160, 1, 0, 0, 0, 931, 932, 5, 114, 0, 0, 932, 933, 5, 101, 0, 0, 933, 934, 5, 113, 0, 0, 934, 935, 5, 117, 0, 0, 935, 936, 5, 105, 0, 0, 936, 937, 5, 114, 0, 0, 937, 938, 5, 101, 0, 0, 938, 939, 5, 115, 0, 0, 939, 162, 1, 0, 0, 0, 940, 941, 5, 97, 0, 0, 941, 942, 5, 110, 0, 0, 942, 943, 5, 121, 0, 0, 943, 164, 1, 0, 0, 0, 944, 945, 5, 103, 0, 0, 945, 946, 5, 101, 0, 0, 946, 947, 5, 116, 0, 0, 947, 166, 1, 0, 0, 0, 948, 949, 5, 115, 0, 0, 949, 950, 5, 101, 0, 0, 950, 951, 5, 116, 0, 0, 951, 168, 1, 0, 0, 0, 952, 953, 5, 119, 0, 0, 953, 954, 5, 97, 0, 0, 954, 955, 5, 116, 0, 0, 955, 956, 5, 99, 0, 0, 956, 957, 5, 104, 0, 0, 957, 170, 1, 0, 0, 0, 958, 959, 5, 115, 0, 0, 959, 960, 5, 116, 0, 0, 960, 961, 5, 97, 0, 0, 961, 962, 5, 114, 0, 0, 962, 963, 5, 116, 0, 0, 963, 172, 1, 0, 0, 0, 964, 965, 5, 115, 0, 0, 965, 966, 5, 116, 0, 0, 966, 967, 5, 111, 0, 0, 967, 968, 5, 112, 0, 0, 968, 174, 1, 0, 0, 0, 969, 970, 5, 114, 0, 0, 970, 971, 5, 101, 0, 0, 971, 972, 5, 97, 0, 0, 972, 973, 5, 100, 0, 0, 973, 176, 1, 0, 0, 0, 974, 975, 5, 119, 0, 0, 975, 976, 5, 114, 0, 0, 976, 977, 5, 105, 0, 0, 977, 978, 5, 116, 0, 0, 978, 979, 5, 101, 0, 0, 979, 178, 1, 0, 0, 0, 980, 981, 5, 114, 0, 0, 981, 982, 5, 101, 0, 0, 982, 983, 5, 115, 0, 0, 983, 984, 5, 111, 0, 0, 984, 985, 5, 108, 0, 0, 985, 986, 5, 118, 0, 0, 986, 987, 5, 101, 0, 0, 987, 180, 1, 0, 0, 0, 988, 989, 5, 99, 0, 0, 989, 990, 5, 111, 0, 0, 990, 991, 5, 110, 0, 0, 991, 992, 5, 110, 0, 0, 992, 993, 5, 101, 0, 0, 993, 994, 5, 99, 0, 0, 994, 995, 5, 116, 0, 0, 995, 182, 1, 0, 0, 0, 996, 997, 5, 100, 0, 0, 997, 998, 5, 105, 0, 0, 998, 999, 5, 115, 0, 0, 999, 1000, 5, 99, 0, 0, 1000, 1001, 5, 111, 0, 0, 1001, 1002, 5, 110, 0, 0, 1002, 1003, 5, 110, 0, 0, 1003, 1004, 5, 101, 0, 0, 1004, 1005, 5, 99, 0, 0, 1005, 1006, 5, 116, 0, 0, 1006, 184, 1, 0, 0, 0, 1007, 1008, 5, 99, 0, 0, 1008, 1009, 5, 97, 0, 0, 1009, 1010, 5, 108, 0, 0, 1010, 1011, 5, 108, 0, 0, 1011, 186, 1, 0, 0, 0, 1012, 1013, 5, 119, 0, 0, 1013, 1014, 5, 97, 0, 0, 1014, 1015, 5, 116, 0, 0, 1015, 1016, 5, 99, 0, 0, 1016, 1017, 5, 104, 0, 0, 1017, 1018, 5, 45, 0, 0, 1018, 1019, 5, 115, 0, 0, 1019, 1020, 5, 116, 0, 0, 1020, 1021, 5, 97, 0, 0, 1021, 1022, 5, 114, 0, 0, 1022, 1023, 5, 116, 0, 0, 1023, 188, 1, 0, 0, 0, 1024, 1025, 5, 119, 0, 0, 1025, 1026, 5, 97, 0, 0, 1026, 1027, 5, 116, 0, 0, 1027, 1028, 5, 99, 0, 0, 1028, 1029, 5, 104, 0, 0, 1029, 1030, 5, 45, 0, 0, 1030, 1031, 5, 115, 0, 0, 1031, 1032, 5, 116, 0, 0, 1032, 1033, 5, 111, 0, 0, 1033, 1034, 5, 112, 0, 0, 1034, 190, 1, 0, 0, 0, 1035, 1036, 5, 115, 0, 0, 1036, 1037, 5, 117, 0, 0, 1037, 1038, 5, 98, 0, 0, 1038, 1039, 5, 115, 0, 0, 1039, 1040, 5, 99, 0, 0, 1040, 1041, 5, 114, 0, 0, 1041, 1042, 5, 105, 0, 0, 1042, 1043, 5, 98, 0, 0, 1043, 1044, 5, 101, 0, 0, 1044, 192, 1, 0, 0, 0, 1045, 1046, 5, 117, 0, 0, 1046, 1047, 5, 110, 0, 0, 1047, 1048, 5, 115, 0, 0, 1048, 1049, 5, 117, 0, 0, 1049, 1050, 5, 98, 0, 0, 1050, 1051, 5, 115, 0, 0, 1051, 1052, 5, 99, 0, 0, 1052, 1053, 5, 114, 0, 0, 1053, 1054, 5, 105, 0, 0, 1054, 1055, 5, 98, 0, 0, 1055, 1056, 5, 101, 0, 0, 1056, 194, 1, 0, 0, 0, 1057, 1058, 5, 114, 0, 0, 1058, 1059, 5, 101, 0, 0, 1059, 1060, 5, 103, 0, 0, 1060, 1061, 5, 105, 0, 0, 1061, 1062, 5, 115, 0, 0, 1062, 1063, 5, 116, 0, 0, 1063, 1064, 5, 101, 0, 0, 1064, 1065, 5, 114, 0, 0, 1065, 196, 1, 0, 0, 0, 1066, 1067, 5, 99, 0, 0, 1067, 1068, 5, 114, 0, 0, 1068, 1069, 5, 100, 0, 0, 1069, 1070, 5, 116, 0, 0, 1070, 198, 1, 0, 0, 0, 1071, 1072, 5, 111, 0, 0, 1072, 1073, 5, 112, 0, 0, 1073, 1074, 5, 116, 0, 0, 1074, 1075, 5, 105, 0, 0, 1075, 1076, 5, 111, 0, 0, 1076, 1077, 5, 110, 0, 0, 1077, 1078, 5, 97, 0, 0, 1078, 1079, 5, 108, 0, 0, 1079, 1080, 5, 45, 0, 0, 1080, 1081, 5, 111, 0, 0, 1081, 1082, 5, 110, 0, 0, 1082, 1083, 5, 101, 0, 0, 1083, 200, 1, 0, 0, 0, 1084, 1085, 5, 101, 0, 0, 1085, 1086, 5, 120, 0, 0, 1086, 1087, 5, 97, 0, 0, 1087, 1088, 5, 99, 0, 0, 1088, 1089, 5, 116, 0, 0, 1089, 1090, 5, 108, 0, 0, 1090, 1091, 5, 121, 0, 0, 1091, 1092, 5, 45, 0, 0, 1092, 1093, 5, 111, 0, 0, 1093, 1094, 5, 110, 0, 0, 1094, 1095, 5, 101, 0, 0, 1095, 202, 1, 0, 0, 0, 1096, 1097, 5, 109, 0, 0, 1097, 1098, 5, 97, 0, 0, 1098, 1099, 5, 110, 0, 0, 1099, 1100, 5, 121, 0, 0, 1100, 1101, 5, 45, 0, 0, 1101, 1102, 5, 117, 0, 0, 1102, 1103, 5, 110, 0, 0, 1103, 1104, 5, 105, 0, 0, 1104, 1105, 5, 113, 0, 0, 1105, 1106, 5, 117, 0, 0, 1106, 1107, 5, 101, 0, 0, 1107, 204, 1, 0, 0, 0, 1108, 1109, 5, 109, 0, 0, 1109, 1110, 5, 97, 0, 0, 1110, 1111, 5, 110, 0, 0, 1111, 1112, 5, 121, 0, 0, 1112, 206, 1, 0, 0, 0, 1113, 1114, 5, 111, 0, 0, 1114, 1115, 5, 114, 0, 0, 1115, 1116, 5, 100, 0, 0, 1116, 1117, 5, 101, 0, 0, 1117, 1118, 5, 114, 0, 0, 1118, 1119, 5, 101, 0, 0, 1119, 1120, 5, 100, 0, 0, 1120, 208, 1, 0, 0, 0, 1121, 1122, 5, 117, 0, 0, 1122, 1123, 5, 110, 0, 0, 1123, 1124, 5, 105, 0, 0, 1124, 1125, 5, 116, 0, 0, 1125, 210, 1, 0, 0, 0, 1126, 1127, 5, 119, 0, 0, 1127, 1128, 5, 97, 0, 0, 1128, 1129, 5, 116, 0, 0, 1129, 1130, 5, 99, 0, 0, 1130, 1131, 5, 104, 0, 0, 1131, 1132, 5, 45, 0, 0, 1132, 1133, 5, 104, 0, 0, 1133, 1134, 5, 97, 0, 0, 1134, 1135, 5, 110, 0, 0, 1135, 1136, 5, 100, 0, 0, 1136, 1137, 5, 108, 0, 0, 1137, 1138, 5, 101, 0, 0, 1138, 212, 1, 0, 0, 0, 1139, 1140, 5, 109, 0, 0, 1140, 1141, 5, 101, 0, 0, 1141, 1142, 5, 115, 0, 0, 1142, 1143, 5, 115, 0, 0, 1143, 1144, 5, 97, 0, 0, 1144, 1145, 5, 103, 0, 0, 1145, 1146, 5, 101, 0, 0, 1146, 214, 1, 0, 0, 0, 1147, 1148, 5, 97, 0, 0, 1148, 1149, 5, 116, 0, 0, 1149, 1150, 5, 111, 0, 0, 1150, 1151, 5, 109, 0, 0, 1151, 1152, 5, 45, 0, 0, 1152, 1153, 5, 114, 0, 0, 1153, 1154, 5, 101, 0, 0, 1154, 1155, 5, 102, 0, 0, 1155, 216, 1, 0, 0, 0, 1156, 1157, 5, 105, 0, 0, 1157, 1158, 5, 110, 0, 0, 1158, 1159, 5, 116, 0, 0, 1159, 1160, 5, 101, 0, 0, 1160, 1161, 5, 114, 0, 0, 1161, 1162, 5, 102, 0, 0, 1162, 1163, 5, 97, 0, 0, 1163, 1164, 5, 99, 0, 0, 1164, 1165, 5, 101, 0, 0, 1165, 1166, 5, 45, 0, 0, 1166, 1167, 5, 114, 0, 0, 1167, 1168, 5, 101, 0, 0, 1168, 1169, 5, 102, 0, 0, 1169, 218, 1, 0, 0, 0, 1170, 1171, 5, 111, 0, 0, 1171, 1172, 5, 112, 0, 0, 1172, 1173, 5, 116, 0, 0, 1173, 1174, 5, 105, 0, 0, 1174, 1175, 5, 111, 0, 0, 1175, 1176, 5, 110, 0, 0, 1176, 1177, 5, 97, 0, 0, 1177, 1178, 5, 108, 0, 0, 1178, 220, 1, 0, 0, 0, 1179, 1180, 5, 108, 0, 0, 1180, 1181, 5, 105, 0, 0, 1181, 1182, 5, 115, 0, 0, 1182, 1183, 5, 116, 0, 0, 1183, 222, 1, 0, 0, 0, 1184, 1185, 5, 114, 0, 0, 1185, 1186, 5, 101, 0, 0, 1186, 1187, 5, 99, 0, 0, 1187, 1188, 5, 111, 0, 0, 1188, 1189, 5, 114, 0, 0, 1189, 1190, 5, 100, 0, 0, 1190, 224, 1, 0, 0, 0, 1191, 1192, 5, 98, 0, 0, 1192, 1193, 5, 111, 0, 0, 1193, 1194, 5, 111, 0, 0, 1194, 1195, 5, 108, 0, 0, 1195, 226, 1, 0, 0, 0, 1196, 1197, 5, 98, 0, 0, 1197, 1198, 5, 121, 0, 0, 1198, 1199, 5, 116, 0, 0, 1199, 1200, 5, 101, 0, 0, 1200, 1201, 5, 115, 0, 0, 1201, 228, 1, 0, 0, 0, 1202, 1203, 5, 100, 0, 0, 1203, 1204, 5, 111, 0, 0, 1204, 1205, 5, 117, 0, 0, 1205, 1206, 5, 98, 0, 0, 1206, 1207, 5, 108, 0, 0, 1207, 1208, 5, 101, 0, 0, 1208, 230, 1, 0, 0, 0, 1209, 1210, 5, 105, 0, 0, 1210, 1211, 5, 110, 0, 0, 1211, 1212, 5, 116, 0, 0, 1212, 1213, 5, 51, 0, 0, 1213, 1214, 5, 50, 0, 0, 1214, 232, 1, 0, 0, 0, 1215, 1216, 5, 105, 0, 0, 1216, 1217, 5, 110, 0, 0, 1217, 1218, 5, 116, 0, 0, 1218, 1219, 5, 54, 0, 0, 1219, 1220, 5, 52, 0, 0, 1220, 234, 1, 0, 0, 0, 1221, 1222, 5, 115, 0, 0, 1222, 1223, 5, 116, 0, 0, 1223, 1224, 5, 114, 0, 0, 1224, 1225, 5, 105, 0, 0, 1225, 1226, 5, 110, 0, 0, 1226, 1227, 5, 103, 0, 0, 1227, 236, 1, 0, 0, 0, 1228, 1229, 5, 117, 0, 0, 1229, 1230, 5, 105, 0, 0, 1230, 1231, 5, 110, 0, 0, 1231, 1232, 5, 116, 0, 0, 1232, 1233, 5, 51, 0, 0, 1233, 1234, 5, 50, 0, 0, 1234, 238, 1, 0, 0, 0, 1235, 1236, 5, 117, 0, 0, 1236, 1237, 5, 105, 0, 0, 1237, 1238, 5, 110, 0, 0, 1238, 1239, 5, 116, 0, 0, 1239, 1240, 5, 54, 0, 0, 1240, 1241, 5, 52, 0, 0, 1241, 240, 1, 0, 0, 0, 1242, 1243, 5, 116, 0, 0, 1243, 1244, 5, 114, 0, 0, 1244, 1245, 5, 117, 0, 0, 1245, 1246, 5, 101, 0, 0, 1246, 242, 1, 0, 0, 0, 1247, 1248, 5, 102, 0, 0, 1248, 1249, 5, 97, 0, 0, 1249, 1250, 5, 108, 0, 0, 1250, 1251, 5, 115, 0, 0, 1251, 1252, 5, 101, 0, 0, 1252, 244, 1, 0, 0, 0, 1253, 1254, 5, 110, 0, 0, 1254, 1255, 5, 117, 0, 0, 1255, 1256, 5, 108, 0, 0, 1256, 1257, 5, 108, 0, 0, 1257, 246, 1, 0, 0, 0, 1258, 1259, 5, 45, 0, 0, 1259, 1260, 5, 62, 0, 0, 1260, 248, 1, 0, 0, 0, 1261, 1262, 5, 58, 0, 0, 1262, 250, 1, 0, 0, 0, 1263, 1264, 5, 59, 0, 0, 1264, 252, 1, 0, 0, 0, 1265, 1266, 5, 44, 0, 0, 1266, 254, 1, 0, 0, 0, 1267, 1268, 5, 46, 0, 0, 1268, 256, 1, 0, 0, 0, 1269, 1270, 5, 123, 0, 0, 1270, 258, 1, 0, 0, 0, 1271, 1272, 5, 125, 0, 0, 1272, 260, 1, 0, 0, 0, 1273, 1274, 5, 91, 0, 0, 1274, 262, 1, 0, 0, 0, 1275, 1276, 5, 93, 0, 0, 1276, 264, 1, 0, 0, 0, 1277, 1278, 5, 40, 0, 0, 1278, 266, 1, 0, 0, 0, 1279, 1280, 5, 41, 0, 0, 1280, 268, 1, 0, 0, 0, 1281, 1282, 5, 60, 0, 0, 1282, 270, 1, 0, 0, 0, 1283, 1284, 5, 62, 0, 0, 1284, 272, 1, 0, 0, 0, 1285, 1286, 5, 38, 0, 0, 1286, 274, 1, 0, 0, 0, 1287, 1288, 5, 61, 0, 0, 1288, 276, 1, 0, 0, 0, 1289, 1291, 5, 45, 0, 0, 1290, 1289, 1, 0, 0, 0, 1290, 1291, 1, 0, 0, 0, 1291, 1293, 1, 0, 0, 0, 1292, 1294, 7, 0, 0, 0, 1293, 1292, 1, 0, 0, 0, 1294, 1295, 1, 0, 0, 0, 1295, 1293, 1, 0, 0, 0, 1295, 1296, 1, 0, 0, 0, 1296, 278, 1, 0, 0, 0, 1297, 1299, 5, 45, 0, 0, 1298, 1297, 1, 0, 0, 0, 1298, 1299, 1, 0, 0, 0, 1299, 1308, 1, 0, 0, 0, 1300, 1309, 5, 48, 0, 0, 1301, 1305, 7, 1, 0, 0, 1302, 1304, 7, 0, 0, 0, 1303, 1302, 1, 0, 0, 0, 1304, 1307, 1, 0, 0, 0, 1305, 1303, 1, 0, 0, 0, 1305, 1306, 1, 0, 0, 0, 1306, 1309, 1, 0, 0, 0, 1307, 1305, 1, 0, 0, 0, 1308, 1300, 1, 0, 0, 0, 1308, 1301, 1, 0, 0, 0, 1309, 1316, 1, 0, 0, 0, 1310, 1312, 5, 46, 0, 0, 1311, 1313, 7, 0, 0, 0, 1312, 1311, 1, 0, 0, 0, 1313, 1314, 1, 0, 0, 0, 1314, 1312, 1, 0, 0, 0, 1314, 1315, 1, 0, 0, 0, 1315, 1317, 1, 0, 0, 0, 1316, 1310, 1, 0, 0, 0, 1316, 1317, 1, 0, 0, 0, 1317, 1327, 1, 0, 0, 0, 1318, 1320, 7, 2, 0, 0, 1319, 1321, 7, 3, 0, 0, 1320, 1319, 1, 0, 0, 0, 1320, 1321, 1, 0, 0, 0, 1321, 1323, 1, 0, 0, 0, 1322, 1324, 7, 0, 0, 0, 1323, 1322, 1, 0, 0, 0, 1324, 1325, 1, 0, 0, 0, 1325, 1323, 1, 0, 0, 0, 1325, 1326, 1, 0, 0, 0, 1326, 1328, 1, 0, 0, 0, 1327, 1318, 1, 0, 0, 0, 1327, 1328, 1, 0, 0, 0, 1328, 280, 1, 0, 0, 0, 1329, 1333, 7, 4, 0, 0, 1330, 1332, 7, 5, 0, 0, 1331, 1330, 1, 0, 0, 0, 1332, 1335, 1, 0, 0, 0, 1333, 1331, 1, 0, 0, 0, 1333, 1334, 1, 0, 0, 0, 1334, 282, 1, 0, 0, 0, 1335, 1333, 1, 0, 0, 0, 1336, 1341, 5, 34, 0, 0, 1337, 1340, 3, 285, 142, 0, 1338, 1340, 8, 6, 0, 0, 1339, 1337, 1, 0, 0, 0, 1339, 1338, 1, 0, 0, 0, 1340, 1343, 1, 0, 0, 0, 1341, 1339, 1, 0, 0, 0, 1341, 1342, 1, 0, 0, 0, 1342, 1344, 1, 0, 0, 0, 1343, 1341, 1, 0, 0, 0, 1344, 1345, 5, 34, 0, 0, 1345, 284, 1, 0, 0, 0, 1346, 1354, 5, 92, 0, 0, 1347, 1355, 7, 7, 0, 0, 1348, 1349, 5, 117, 0, 0, 1349, 1350, 3, 287, 143, 0, 1350, 1351, 3, 287, 143, 0, 1351, 1352, 3, 287, 143, 0, 1352, 1353, 3, 287, 143, 0, 1353, 1355, 1, 0, 0, 0, 1354, 1347, 1, 0, 0, 0, 1354, 1348, 1, 0, 0, 0, 1355, 286, 1, 0, 0, 0, 1356, 1357, 7, 8, 0, 0, 1357, 288, 1, 0, 0, 0, 1358, 1359, 5, 47, 0, 0, 1359, 1360, 5, 47, 0, 0, 1360, 1364, 1, 0, 0, 0, 1361, 1363, 8, 9, 0, 0, 1362, 1361, 1, 0, 0, 0, 1363, 1366, 1, 0, 0, 0, 1364, 1362, 1, 0, 0, 0, 1364, 1365, 1, 0, 0, 0, 1365, 1367, 1, 0, 0, 0, 1366, 1364, 1, 0, 0, 0, 1367, 1368, 6, 144, 0, 0, 1368, 290, 1, 0, 0, 0, 1369, 1370, 5, 47, 0, 0, 1370, 1371, 5, 42, 0, 0, 1371, 1375, 1, 0, 0, 0, 1372, 1374, 9, 0, 0, 0, 1373, 1372, 1, 0, 0, 0, 1374, 1377, 1, 0, 0, 0, 1375, 1376, 1, 0, 0, 0, 1375, 1373, 1, 0, 0, 0, 1376, 1378, 1, 0, 0, 0, 1377, 1375, 1, 0, 0, 0, 1378, 1379, 5, 42, 0, 0, 1379, 1380, 5, 47, 0, 0, 1380, 1381, 1, 0, 0, 0, 1381, 1382, 6, 145, 0, 0, 1382, 292, 1, 0, 0, 0, 1383, 1385, 7, 10, 0, 0, 1384, 1383, 1, 0, 0, 0, 1385, 1386, 1, 0, 0, 0, 1386, 1384, 1, 0, 0, 0, 1386, 1387, 1, 0, 0, 0, 1387, 1388, 1, 0, 0, 0, 1388, 1389, 6, 146, 0, 0, 1389, 294, 1, 0, 0, 0, 18, 0, 1290, 1295, 1298, 1305, 1308, 1314, 1316, 1320, 1325, 1327, 1333, 1339, 1341, 1354, 1364, 1375, 1386, 1, 0, 1, 0] \ No newline at end of file +[4, 0, 146, 1397, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 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, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 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, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 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, 17, 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, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 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, 26, 1, 26, 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, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 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, 32, 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, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 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, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 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, 42, 1, 42, 1, 42, 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, 44, 1, 44, 1, 44, 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, 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, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 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, 1, 53, 1, 53, 1, 54, 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, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 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, 59, 1, 59, 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, 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, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 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, 67, 1, 68, 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, 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, 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, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 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, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 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, 80, 1, 80, 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, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 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, 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, 91, 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, 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, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 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, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 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, 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, 100, 1, 100, 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, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 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, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 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, 3, 139, 1298, 8, 139, 1, 139, 4, 139, 1301, 8, 139, 11, 139, 12, 139, 1302, 1, 140, 3, 140, 1306, 8, 140, 1, 140, 1, 140, 1, 140, 5, 140, 1311, 8, 140, 10, 140, 12, 140, 1314, 9, 140, 3, 140, 1316, 8, 140, 1, 140, 1, 140, 4, 140, 1320, 8, 140, 11, 140, 12, 140, 1321, 3, 140, 1324, 8, 140, 1, 140, 1, 140, 3, 140, 1328, 8, 140, 1, 140, 4, 140, 1331, 8, 140, 11, 140, 12, 140, 1332, 3, 140, 1335, 8, 140, 1, 141, 1, 141, 5, 141, 1339, 8, 141, 10, 141, 12, 141, 1342, 9, 141, 1, 142, 1, 142, 1, 142, 5, 142, 1347, 8, 142, 10, 142, 12, 142, 1350, 9, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 3, 143, 1362, 8, 143, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 5, 145, 1370, 8, 145, 10, 145, 12, 145, 1373, 9, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 5, 146, 1381, 8, 146, 10, 146, 12, 146, 1384, 9, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 4, 147, 1392, 8, 147, 11, 147, 12, 147, 1393, 1, 147, 1, 147, 1, 1382, 0, 148, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 143, 287, 0, 289, 0, 291, 144, 293, 145, 295, 146, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1411, 0, 1, 1, 0, 0, 0, 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, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 1, 0, 0, 0, 0, 285, 1, 0, 0, 0, 0, 291, 1, 0, 0, 0, 0, 293, 1, 0, 0, 0, 0, 295, 1, 0, 0, 0, 1, 297, 1, 0, 0, 0, 3, 302, 1, 0, 0, 0, 5, 311, 1, 0, 0, 0, 7, 322, 1, 0, 0, 0, 9, 332, 1, 0, 0, 0, 11, 342, 1, 0, 0, 0, 13, 351, 1, 0, 0, 0, 15, 363, 1, 0, 0, 0, 17, 370, 1, 0, 0, 0, 19, 378, 1, 0, 0, 0, 21, 387, 1, 0, 0, 0, 23, 395, 1, 0, 0, 0, 25, 401, 1, 0, 0, 0, 27, 406, 1, 0, 0, 0, 29, 419, 1, 0, 0, 0, 31, 429, 1, 0, 0, 0, 33, 441, 1, 0, 0, 0, 35, 447, 1, 0, 0, 0, 37, 458, 1, 0, 0, 0, 39, 469, 1, 0, 0, 0, 41, 474, 1, 0, 0, 0, 43, 483, 1, 0, 0, 0, 45, 493, 1, 0, 0, 0, 47, 498, 1, 0, 0, 0, 49, 502, 1, 0, 0, 0, 51, 508, 1, 0, 0, 0, 53, 513, 1, 0, 0, 0, 55, 523, 1, 0, 0, 0, 57, 527, 1, 0, 0, 0, 59, 540, 1, 0, 0, 0, 61, 545, 1, 0, 0, 0, 63, 552, 1, 0, 0, 0, 65, 561, 1, 0, 0, 0, 67, 572, 1, 0, 0, 0, 69, 576, 1, 0, 0, 0, 71, 585, 1, 0, 0, 0, 73, 592, 1, 0, 0, 0, 75, 601, 1, 0, 0, 0, 77, 606, 1, 0, 0, 0, 79, 616, 1, 0, 0, 0, 81, 627, 1, 0, 0, 0, 83, 635, 1, 0, 0, 0, 85, 641, 1, 0, 0, 0, 87, 650, 1, 0, 0, 0, 89, 660, 1, 0, 0, 0, 91, 669, 1, 0, 0, 0, 93, 681, 1, 0, 0, 0, 95, 692, 1, 0, 0, 0, 97, 698, 1, 0, 0, 0, 99, 706, 1, 0, 0, 0, 101, 709, 1, 0, 0, 0, 103, 714, 1, 0, 0, 0, 105, 721, 1, 0, 0, 0, 107, 724, 1, 0, 0, 0, 109, 732, 1, 0, 0, 0, 111, 739, 1, 0, 0, 0, 113, 745, 1, 0, 0, 0, 115, 750, 1, 0, 0, 0, 117, 761, 1, 0, 0, 0, 119, 766, 1, 0, 0, 0, 121, 772, 1, 0, 0, 0, 123, 776, 1, 0, 0, 0, 125, 788, 1, 0, 0, 0, 127, 791, 1, 0, 0, 0, 129, 798, 1, 0, 0, 0, 131, 801, 1, 0, 0, 0, 133, 808, 1, 0, 0, 0, 135, 816, 1, 0, 0, 0, 137, 823, 1, 0, 0, 0, 139, 834, 1, 0, 0, 0, 141, 841, 1, 0, 0, 0, 143, 850, 1, 0, 0, 0, 145, 865, 1, 0, 0, 0, 147, 875, 1, 0, 0, 0, 149, 888, 1, 0, 0, 0, 151, 894, 1, 0, 0, 0, 153, 911, 1, 0, 0, 0, 155, 914, 1, 0, 0, 0, 157, 918, 1, 0, 0, 0, 159, 923, 1, 0, 0, 0, 161, 929, 1, 0, 0, 0, 163, 938, 1, 0, 0, 0, 165, 947, 1, 0, 0, 0, 167, 951, 1, 0, 0, 0, 169, 955, 1, 0, 0, 0, 171, 959, 1, 0, 0, 0, 173, 965, 1, 0, 0, 0, 175, 971, 1, 0, 0, 0, 177, 976, 1, 0, 0, 0, 179, 981, 1, 0, 0, 0, 181, 987, 1, 0, 0, 0, 183, 995, 1, 0, 0, 0, 185, 1003, 1, 0, 0, 0, 187, 1014, 1, 0, 0, 0, 189, 1019, 1, 0, 0, 0, 191, 1031, 1, 0, 0, 0, 193, 1042, 1, 0, 0, 0, 195, 1052, 1, 0, 0, 0, 197, 1064, 1, 0, 0, 0, 199, 1073, 1, 0, 0, 0, 201, 1078, 1, 0, 0, 0, 203, 1091, 1, 0, 0, 0, 205, 1103, 1, 0, 0, 0, 207, 1115, 1, 0, 0, 0, 209, 1120, 1, 0, 0, 0, 211, 1128, 1, 0, 0, 0, 213, 1133, 1, 0, 0, 0, 215, 1146, 1, 0, 0, 0, 217, 1154, 1, 0, 0, 0, 219, 1163, 1, 0, 0, 0, 221, 1177, 1, 0, 0, 0, 223, 1186, 1, 0, 0, 0, 225, 1191, 1, 0, 0, 0, 227, 1198, 1, 0, 0, 0, 229, 1203, 1, 0, 0, 0, 231, 1209, 1, 0, 0, 0, 233, 1216, 1, 0, 0, 0, 235, 1222, 1, 0, 0, 0, 237, 1228, 1, 0, 0, 0, 239, 1235, 1, 0, 0, 0, 241, 1242, 1, 0, 0, 0, 243, 1249, 1, 0, 0, 0, 245, 1254, 1, 0, 0, 0, 247, 1260, 1, 0, 0, 0, 249, 1265, 1, 0, 0, 0, 251, 1268, 1, 0, 0, 0, 253, 1270, 1, 0, 0, 0, 255, 1272, 1, 0, 0, 0, 257, 1274, 1, 0, 0, 0, 259, 1276, 1, 0, 0, 0, 261, 1278, 1, 0, 0, 0, 263, 1280, 1, 0, 0, 0, 265, 1282, 1, 0, 0, 0, 267, 1284, 1, 0, 0, 0, 269, 1286, 1, 0, 0, 0, 271, 1288, 1, 0, 0, 0, 273, 1290, 1, 0, 0, 0, 275, 1292, 1, 0, 0, 0, 277, 1294, 1, 0, 0, 0, 279, 1297, 1, 0, 0, 0, 281, 1305, 1, 0, 0, 0, 283, 1336, 1, 0, 0, 0, 285, 1343, 1, 0, 0, 0, 287, 1353, 1, 0, 0, 0, 289, 1363, 1, 0, 0, 0, 291, 1365, 1, 0, 0, 0, 293, 1376, 1, 0, 0, 0, 295, 1391, 1, 0, 0, 0, 297, 298, 5, 101, 0, 0, 298, 299, 5, 100, 0, 0, 299, 300, 5, 105, 0, 0, 300, 301, 5, 116, 0, 0, 301, 2, 1, 0, 0, 0, 302, 303, 5, 99, 0, 0, 303, 304, 5, 114, 0, 0, 304, 305, 5, 101, 0, 0, 305, 306, 5, 97, 0, 0, 306, 307, 5, 116, 0, 0, 307, 308, 5, 105, 0, 0, 308, 309, 5, 111, 0, 0, 309, 310, 5, 110, 0, 0, 310, 4, 1, 0, 0, 0, 311, 312, 5, 105, 0, 0, 312, 313, 5, 110, 0, 0, 313, 314, 5, 105, 0, 0, 314, 315, 5, 116, 0, 0, 315, 316, 5, 105, 0, 0, 316, 317, 5, 97, 0, 0, 317, 318, 5, 108, 0, 0, 318, 319, 5, 105, 0, 0, 319, 320, 5, 122, 0, 0, 320, 321, 5, 101, 0, 0, 321, 6, 1, 0, 0, 0, 322, 323, 5, 119, 0, 0, 323, 324, 5, 111, 0, 0, 324, 325, 5, 114, 0, 0, 325, 326, 5, 107, 0, 0, 326, 327, 5, 115, 0, 0, 327, 328, 5, 112, 0, 0, 328, 329, 5, 97, 0, 0, 329, 330, 5, 99, 0, 0, 330, 331, 5, 101, 0, 0, 331, 8, 1, 0, 0, 0, 332, 333, 5, 101, 0, 0, 333, 334, 5, 120, 0, 0, 334, 335, 5, 101, 0, 0, 335, 336, 5, 99, 0, 0, 336, 337, 5, 117, 0, 0, 337, 338, 5, 116, 0, 0, 338, 339, 5, 105, 0, 0, 339, 340, 5, 111, 0, 0, 340, 341, 5, 110, 0, 0, 341, 10, 1, 0, 0, 0, 342, 343, 5, 115, 0, 0, 343, 344, 5, 110, 0, 0, 344, 345, 5, 97, 0, 0, 345, 346, 5, 112, 0, 0, 346, 347, 5, 115, 0, 0, 347, 348, 5, 104, 0, 0, 348, 349, 5, 111, 0, 0, 349, 350, 5, 116, 0, 0, 350, 12, 1, 0, 0, 0, 351, 352, 5, 116, 0, 0, 352, 353, 5, 114, 0, 0, 353, 354, 5, 97, 0, 0, 354, 355, 5, 110, 0, 0, 355, 356, 5, 115, 0, 0, 356, 357, 5, 97, 0, 0, 357, 358, 5, 99, 0, 0, 358, 359, 5, 116, 0, 0, 359, 360, 5, 105, 0, 0, 360, 361, 5, 111, 0, 0, 361, 362, 5, 110, 0, 0, 362, 14, 1, 0, 0, 0, 363, 364, 5, 114, 0, 0, 364, 365, 5, 101, 0, 0, 365, 366, 5, 109, 0, 0, 366, 367, 5, 111, 0, 0, 367, 368, 5, 116, 0, 0, 368, 369, 5, 101, 0, 0, 369, 16, 1, 0, 0, 0, 370, 371, 5, 116, 0, 0, 371, 372, 5, 97, 0, 0, 372, 373, 5, 114, 0, 0, 373, 374, 5, 103, 0, 0, 374, 375, 5, 101, 0, 0, 375, 376, 5, 116, 0, 0, 376, 377, 5, 115, 0, 0, 377, 18, 1, 0, 0, 0, 378, 379, 5, 112, 0, 0, 379, 380, 5, 111, 0, 0, 380, 381, 5, 114, 0, 0, 381, 382, 5, 116, 0, 0, 382, 383, 5, 97, 0, 0, 383, 384, 5, 98, 0, 0, 384, 385, 5, 108, 0, 0, 385, 386, 5, 101, 0, 0, 386, 20, 1, 0, 0, 0, 387, 388, 5, 114, 0, 0, 388, 389, 5, 101, 0, 0, 389, 390, 5, 112, 0, 0, 390, 391, 5, 108, 0, 0, 391, 392, 5, 105, 0, 0, 392, 393, 5, 99, 0, 0, 393, 394, 5, 97, 0, 0, 394, 22, 1, 0, 0, 0, 395, 396, 5, 108, 0, 0, 396, 397, 5, 111, 0, 0, 397, 398, 5, 99, 0, 0, 398, 399, 5, 97, 0, 0, 399, 400, 5, 108, 0, 0, 400, 24, 1, 0, 0, 0, 401, 402, 5, 102, 0, 0, 402, 403, 5, 114, 0, 0, 403, 404, 5, 111, 0, 0, 404, 405, 5, 109, 0, 0, 405, 26, 1, 0, 0, 0, 406, 407, 5, 114, 0, 0, 407, 408, 5, 101, 0, 0, 408, 409, 5, 115, 0, 0, 409, 410, 5, 117, 0, 0, 410, 411, 5, 108, 0, 0, 411, 412, 5, 116, 0, 0, 412, 413, 5, 45, 0, 0, 413, 414, 5, 98, 0, 0, 414, 415, 5, 121, 0, 0, 415, 416, 5, 116, 0, 0, 416, 417, 5, 101, 0, 0, 417, 418, 5, 115, 0, 0, 418, 28, 1, 0, 0, 0, 419, 420, 5, 114, 0, 0, 420, 421, 5, 112, 0, 0, 421, 422, 5, 99, 0, 0, 422, 423, 5, 45, 0, 0, 423, 424, 5, 99, 0, 0, 424, 425, 5, 97, 0, 0, 425, 426, 5, 108, 0, 0, 426, 427, 5, 108, 0, 0, 427, 428, 5, 115, 0, 0, 428, 30, 1, 0, 0, 0, 429, 430, 5, 100, 0, 0, 430, 431, 5, 101, 0, 0, 431, 432, 5, 97, 0, 0, 432, 433, 5, 100, 0, 0, 433, 434, 5, 108, 0, 0, 434, 435, 5, 105, 0, 0, 435, 436, 5, 110, 0, 0, 436, 437, 5, 101, 0, 0, 437, 438, 5, 45, 0, 0, 438, 439, 5, 109, 0, 0, 439, 440, 5, 115, 0, 0, 440, 32, 1, 0, 0, 0, 441, 442, 5, 113, 0, 0, 442, 443, 5, 117, 0, 0, 443, 444, 5, 101, 0, 0, 444, 445, 5, 114, 0, 0, 445, 446, 5, 121, 0, 0, 446, 34, 1, 0, 0, 0, 447, 448, 5, 114, 0, 0, 448, 449, 5, 101, 0, 0, 449, 450, 5, 102, 0, 0, 450, 451, 5, 108, 0, 0, 451, 452, 5, 101, 0, 0, 452, 453, 5, 99, 0, 0, 453, 454, 5, 116, 0, 0, 454, 455, 5, 105, 0, 0, 455, 456, 5, 111, 0, 0, 456, 457, 5, 110, 0, 0, 457, 36, 1, 0, 0, 0, 458, 459, 5, 115, 0, 0, 459, 460, 5, 112, 0, 0, 460, 461, 5, 101, 0, 0, 461, 462, 5, 99, 0, 0, 462, 463, 5, 105, 0, 0, 463, 464, 5, 97, 0, 0, 464, 465, 5, 108, 0, 0, 465, 466, 5, 105, 0, 0, 466, 467, 5, 122, 0, 0, 467, 468, 5, 101, 0, 0, 468, 38, 1, 0, 0, 0, 469, 470, 5, 114, 0, 0, 470, 471, 5, 111, 0, 0, 471, 472, 5, 111, 0, 0, 472, 473, 5, 116, 0, 0, 473, 40, 1, 0, 0, 0, 474, 475, 5, 100, 0, 0, 475, 476, 5, 111, 0, 0, 476, 477, 5, 99, 0, 0, 477, 478, 5, 117, 0, 0, 478, 479, 5, 109, 0, 0, 479, 480, 5, 101, 0, 0, 480, 481, 5, 110, 0, 0, 481, 482, 5, 116, 0, 0, 482, 42, 1, 0, 0, 0, 483, 484, 5, 102, 0, 0, 484, 485, 5, 114, 0, 0, 485, 486, 5, 97, 0, 0, 486, 487, 5, 103, 0, 0, 487, 488, 5, 109, 0, 0, 488, 489, 5, 101, 0, 0, 489, 490, 5, 110, 0, 0, 490, 491, 5, 116, 0, 0, 491, 492, 5, 115, 0, 0, 492, 44, 1, 0, 0, 0, 493, 494, 5, 118, 0, 0, 494, 495, 5, 105, 0, 0, 495, 496, 5, 101, 0, 0, 496, 497, 5, 119, 0, 0, 497, 46, 1, 0, 0, 0, 498, 499, 5, 109, 0, 0, 499, 500, 5, 97, 0, 0, 500, 501, 5, 120, 0, 0, 501, 48, 1, 0, 0, 0, 502, 503, 5, 97, 0, 0, 503, 504, 5, 108, 0, 0, 504, 505, 5, 108, 0, 0, 505, 506, 5, 111, 0, 0, 506, 507, 5, 119, 0, 0, 507, 50, 1, 0, 0, 0, 508, 509, 5, 112, 0, 0, 509, 510, 5, 111, 0, 0, 510, 511, 5, 108, 0, 0, 511, 512, 5, 108, 0, 0, 512, 52, 1, 0, 0, 0, 513, 514, 5, 113, 0, 0, 514, 515, 5, 117, 0, 0, 515, 516, 5, 101, 0, 0, 516, 517, 5, 114, 0, 0, 517, 518, 5, 121, 0, 0, 518, 519, 5, 97, 0, 0, 519, 520, 5, 98, 0, 0, 520, 521, 5, 108, 0, 0, 521, 522, 5, 101, 0, 0, 522, 54, 1, 0, 0, 0, 523, 524, 5, 114, 0, 0, 524, 525, 5, 112, 0, 0, 525, 526, 5, 99, 0, 0, 526, 56, 1, 0, 0, 0, 527, 528, 5, 113, 0, 0, 528, 529, 5, 117, 0, 0, 529, 530, 5, 101, 0, 0, 530, 531, 5, 114, 0, 0, 531, 532, 5, 121, 0, 0, 532, 533, 5, 45, 0, 0, 533, 534, 5, 114, 0, 0, 534, 535, 5, 101, 0, 0, 535, 536, 5, 97, 0, 0, 536, 537, 5, 115, 0, 0, 537, 538, 5, 111, 0, 0, 538, 539, 5, 110, 0, 0, 539, 58, 1, 0, 0, 0, 540, 541, 5, 116, 0, 0, 541, 542, 5, 121, 0, 0, 542, 543, 5, 112, 0, 0, 543, 544, 5, 101, 0, 0, 544, 60, 1, 0, 0, 0, 545, 546, 5, 111, 0, 0, 546, 547, 5, 98, 0, 0, 547, 548, 5, 106, 0, 0, 548, 549, 5, 101, 0, 0, 549, 550, 5, 99, 0, 0, 550, 551, 5, 116, 0, 0, 551, 62, 1, 0, 0, 0, 552, 553, 5, 115, 0, 0, 553, 554, 5, 116, 0, 0, 554, 555, 5, 111, 0, 0, 555, 556, 5, 114, 0, 0, 556, 557, 5, 97, 0, 0, 557, 558, 5, 98, 0, 0, 558, 559, 5, 108, 0, 0, 559, 560, 5, 101, 0, 0, 560, 64, 1, 0, 0, 0, 561, 562, 5, 105, 0, 0, 562, 563, 5, 109, 0, 0, 563, 564, 5, 112, 0, 0, 564, 565, 5, 108, 0, 0, 565, 566, 5, 101, 0, 0, 566, 567, 5, 109, 0, 0, 567, 568, 5, 101, 0, 0, 568, 569, 5, 110, 0, 0, 569, 570, 5, 116, 0, 0, 570, 571, 5, 115, 0, 0, 571, 66, 1, 0, 0, 0, 572, 573, 5, 114, 0, 0, 573, 574, 5, 101, 0, 0, 574, 575, 5, 102, 0, 0, 575, 68, 1, 0, 0, 0, 576, 577, 5, 102, 0, 0, 577, 578, 5, 114, 0, 0, 578, 579, 5, 97, 0, 0, 579, 580, 5, 103, 0, 0, 580, 581, 5, 109, 0, 0, 581, 582, 5, 101, 0, 0, 582, 583, 5, 110, 0, 0, 583, 584, 5, 116, 0, 0, 584, 70, 1, 0, 0, 0, 585, 586, 5, 105, 0, 0, 586, 587, 5, 109, 0, 0, 587, 588, 5, 112, 0, 0, 588, 589, 5, 111, 0, 0, 589, 590, 5, 114, 0, 0, 590, 591, 5, 116, 0, 0, 591, 72, 1, 0, 0, 0, 592, 593, 5, 101, 0, 0, 593, 594, 5, 120, 0, 0, 594, 595, 5, 116, 0, 0, 595, 596, 5, 101, 0, 0, 596, 597, 5, 114, 0, 0, 597, 598, 5, 110, 0, 0, 598, 599, 5, 97, 0, 0, 599, 600, 5, 108, 0, 0, 600, 74, 1, 0, 0, 0, 601, 602, 5, 97, 0, 0, 602, 603, 5, 116, 0, 0, 603, 604, 5, 111, 0, 0, 604, 605, 5, 109, 0, 0, 605, 76, 1, 0, 0, 0, 606, 607, 5, 105, 0, 0, 607, 608, 5, 110, 0, 0, 608, 609, 5, 116, 0, 0, 609, 610, 5, 101, 0, 0, 610, 611, 5, 114, 0, 0, 611, 612, 5, 102, 0, 0, 612, 613, 5, 97, 0, 0, 613, 614, 5, 99, 0, 0, 614, 615, 5, 101, 0, 0, 615, 78, 1, 0, 0, 0, 616, 617, 5, 105, 0, 0, 617, 618, 5, 110, 0, 0, 618, 619, 5, 116, 0, 0, 619, 620, 5, 101, 0, 0, 620, 621, 5, 114, 0, 0, 621, 622, 5, 102, 0, 0, 622, 623, 5, 97, 0, 0, 623, 624, 5, 99, 0, 0, 624, 625, 5, 101, 0, 0, 625, 626, 5, 115, 0, 0, 626, 80, 1, 0, 0, 0, 627, 628, 5, 112, 0, 0, 628, 629, 5, 97, 0, 0, 629, 630, 5, 99, 0, 0, 630, 631, 5, 107, 0, 0, 631, 632, 5, 97, 0, 0, 632, 633, 5, 103, 0, 0, 633, 634, 5, 101, 0, 0, 634, 82, 1, 0, 0, 0, 635, 636, 5, 118, 0, 0, 636, 637, 5, 97, 0, 0, 637, 638, 5, 108, 0, 0, 638, 639, 5, 117, 0, 0, 639, 640, 5, 101, 0, 0, 640, 84, 1, 0, 0, 0, 641, 642, 5, 114, 0, 0, 642, 643, 5, 101, 0, 0, 643, 644, 5, 108, 0, 0, 644, 645, 5, 97, 0, 0, 645, 646, 5, 116, 0, 0, 646, 647, 5, 105, 0, 0, 647, 648, 5, 111, 0, 0, 648, 649, 5, 110, 0, 0, 649, 86, 1, 0, 0, 0, 650, 651, 5, 111, 0, 0, 651, 652, 5, 112, 0, 0, 652, 653, 5, 101, 0, 0, 653, 654, 5, 114, 0, 0, 654, 655, 5, 97, 0, 0, 655, 656, 5, 116, 0, 0, 656, 657, 5, 105, 0, 0, 657, 658, 5, 111, 0, 0, 658, 659, 5, 110, 0, 0, 659, 88, 1, 0, 0, 0, 660, 661, 5, 102, 0, 0, 661, 662, 5, 117, 0, 0, 662, 663, 5, 110, 0, 0, 663, 664, 5, 99, 0, 0, 664, 665, 5, 116, 0, 0, 665, 666, 5, 105, 0, 0, 666, 667, 5, 111, 0, 0, 667, 668, 5, 110, 0, 0, 668, 90, 1, 0, 0, 0, 669, 670, 5, 99, 0, 0, 670, 671, 5, 111, 0, 0, 671, 672, 5, 110, 0, 0, 672, 673, 5, 115, 0, 0, 673, 674, 5, 116, 0, 0, 674, 675, 5, 114, 0, 0, 675, 676, 5, 117, 0, 0, 676, 677, 5, 99, 0, 0, 677, 678, 5, 116, 0, 0, 678, 679, 5, 111, 0, 0, 679, 680, 5, 114, 0, 0, 680, 92, 1, 0, 0, 0, 681, 682, 5, 99, 0, 0, 682, 683, 5, 111, 0, 0, 683, 684, 5, 110, 0, 0, 684, 685, 5, 115, 0, 0, 685, 686, 5, 116, 0, 0, 686, 687, 5, 114, 0, 0, 687, 688, 5, 117, 0, 0, 688, 689, 5, 99, 0, 0, 689, 690, 5, 116, 0, 0, 690, 691, 5, 115, 0, 0, 691, 94, 1, 0, 0, 0, 692, 693, 5, 105, 0, 0, 693, 694, 5, 110, 0, 0, 694, 695, 5, 112, 0, 0, 695, 696, 5, 117, 0, 0, 696, 697, 5, 116, 0, 0, 697, 96, 1, 0, 0, 0, 698, 699, 5, 99, 0, 0, 699, 700, 5, 111, 0, 0, 700, 701, 5, 110, 0, 0, 701, 702, 5, 102, 0, 0, 702, 703, 5, 111, 0, 0, 703, 704, 5, 114, 0, 0, 704, 705, 5, 109, 0, 0, 705, 98, 1, 0, 0, 0, 706, 707, 5, 97, 0, 0, 707, 708, 5, 115, 0, 0, 708, 100, 1, 0, 0, 0, 709, 710, 5, 98, 0, 0, 710, 711, 5, 105, 0, 0, 711, 712, 5, 110, 0, 0, 712, 713, 5, 100, 0, 0, 713, 102, 1, 0, 0, 0, 714, 715, 5, 115, 0, 0, 715, 716, 5, 116, 0, 0, 716, 717, 5, 97, 0, 0, 717, 718, 5, 116, 0, 0, 718, 719, 5, 105, 0, 0, 719, 720, 5, 99, 0, 0, 720, 104, 1, 0, 0, 0, 721, 722, 5, 116, 0, 0, 722, 723, 5, 111, 0, 0, 723, 106, 1, 0, 0, 0, 724, 725, 5, 112, 0, 0, 725, 726, 5, 114, 0, 0, 726, 727, 5, 105, 0, 0, 727, 728, 5, 118, 0, 0, 728, 729, 5, 97, 0, 0, 729, 730, 5, 116, 0, 0, 730, 731, 5, 101, 0, 0, 731, 108, 1, 0, 0, 0, 732, 733, 5, 115, 0, 0, 733, 734, 5, 104, 0, 0, 734, 735, 5, 97, 0, 0, 735, 736, 5, 114, 0, 0, 736, 737, 5, 101, 0, 0, 737, 738, 5, 100, 0, 0, 738, 110, 1, 0, 0, 0, 739, 740, 5, 115, 0, 0, 740, 741, 5, 116, 0, 0, 741, 742, 5, 97, 0, 0, 742, 743, 5, 116, 0, 0, 743, 744, 5, 101, 0, 0, 744, 112, 1, 0, 0, 0, 745, 746, 5, 101, 0, 0, 746, 747, 5, 100, 0, 0, 747, 748, 5, 103, 0, 0, 748, 749, 5, 101, 0, 0, 749, 114, 1, 0, 0, 0, 750, 751, 5, 112, 0, 0, 751, 752, 5, 114, 0, 0, 752, 753, 5, 111, 0, 0, 753, 754, 5, 106, 0, 0, 754, 755, 5, 101, 0, 0, 755, 756, 5, 99, 0, 0, 756, 757, 5, 116, 0, 0, 757, 758, 5, 105, 0, 0, 758, 759, 5, 111, 0, 0, 759, 760, 5, 110, 0, 0, 760, 116, 1, 0, 0, 0, 761, 762, 5, 119, 0, 0, 762, 763, 5, 105, 0, 0, 763, 764, 5, 116, 0, 0, 764, 765, 5, 104, 0, 0, 765, 118, 1, 0, 0, 0, 766, 767, 5, 117, 0, 0, 767, 768, 5, 115, 0, 0, 768, 769, 5, 105, 0, 0, 769, 770, 5, 110, 0, 0, 770, 771, 5, 103, 0, 0, 771, 120, 1, 0, 0, 0, 772, 773, 5, 118, 0, 0, 773, 774, 5, 105, 0, 0, 774, 775, 5, 97, 0, 0, 775, 122, 1, 0, 0, 0, 776, 777, 5, 109, 0, 0, 777, 778, 5, 97, 0, 0, 778, 779, 5, 116, 0, 0, 779, 780, 5, 101, 0, 0, 780, 781, 5, 114, 0, 0, 781, 782, 5, 105, 0, 0, 782, 783, 5, 97, 0, 0, 783, 784, 5, 108, 0, 0, 784, 785, 5, 105, 0, 0, 785, 786, 5, 122, 0, 0, 786, 787, 5, 101, 0, 0, 787, 124, 1, 0, 0, 0, 788, 789, 5, 105, 0, 0, 789, 790, 5, 102, 0, 0, 790, 126, 1, 0, 0, 0, 791, 792, 5, 97, 0, 0, 792, 793, 5, 98, 0, 0, 793, 794, 5, 115, 0, 0, 794, 795, 5, 101, 0, 0, 795, 796, 5, 110, 0, 0, 796, 797, 5, 116, 0, 0, 797, 128, 1, 0, 0, 0, 798, 799, 5, 111, 0, 0, 799, 800, 5, 110, 0, 0, 800, 130, 1, 0, 0, 0, 801, 802, 5, 112, 0, 0, 802, 803, 5, 111, 0, 0, 803, 804, 5, 108, 0, 0, 804, 805, 5, 105, 0, 0, 805, 806, 5, 99, 0, 0, 806, 807, 5, 121, 0, 0, 807, 132, 1, 0, 0, 0, 808, 809, 5, 100, 0, 0, 809, 810, 5, 101, 0, 0, 810, 811, 5, 102, 0, 0, 811, 812, 5, 97, 0, 0, 812, 813, 5, 117, 0, 0, 813, 814, 5, 108, 0, 0, 814, 815, 5, 116, 0, 0, 815, 134, 1, 0, 0, 0, 816, 817, 5, 115, 0, 0, 817, 818, 5, 111, 0, 0, 818, 819, 5, 117, 0, 0, 819, 820, 5, 114, 0, 0, 820, 821, 5, 99, 0, 0, 821, 822, 5, 101, 0, 0, 822, 136, 1, 0, 0, 0, 823, 824, 5, 114, 0, 0, 824, 825, 5, 101, 0, 0, 825, 826, 5, 112, 0, 0, 826, 827, 5, 111, 0, 0, 827, 828, 5, 115, 0, 0, 828, 829, 5, 105, 0, 0, 829, 830, 5, 116, 0, 0, 830, 831, 5, 111, 0, 0, 831, 832, 5, 114, 0, 0, 832, 833, 5, 121, 0, 0, 833, 138, 1, 0, 0, 0, 834, 835, 5, 99, 0, 0, 835, 836, 5, 111, 0, 0, 836, 837, 5, 109, 0, 0, 837, 838, 5, 109, 0, 0, 838, 839, 5, 105, 0, 0, 839, 840, 5, 116, 0, 0, 840, 140, 1, 0, 0, 0, 841, 842, 5, 114, 0, 0, 842, 843, 5, 101, 0, 0, 843, 844, 5, 118, 0, 0, 844, 845, 5, 105, 0, 0, 845, 846, 5, 115, 0, 0, 846, 847, 5, 105, 0, 0, 847, 848, 5, 111, 0, 0, 848, 849, 5, 110, 0, 0, 849, 142, 1, 0, 0, 0, 850, 851, 5, 115, 0, 0, 851, 852, 5, 101, 0, 0, 852, 853, 5, 109, 0, 0, 853, 854, 5, 97, 0, 0, 854, 855, 5, 110, 0, 0, 855, 856, 5, 116, 0, 0, 856, 857, 5, 105, 0, 0, 857, 858, 5, 99, 0, 0, 858, 859, 5, 45, 0, 0, 859, 860, 5, 109, 0, 0, 860, 861, 5, 97, 0, 0, 861, 862, 5, 106, 0, 0, 862, 863, 5, 111, 0, 0, 863, 864, 5, 114, 0, 0, 864, 144, 1, 0, 0, 0, 865, 866, 5, 111, 0, 0, 866, 867, 5, 110, 0, 0, 867, 868, 5, 45, 0, 0, 868, 869, 5, 100, 0, 0, 869, 870, 5, 101, 0, 0, 870, 871, 5, 108, 0, 0, 871, 872, 5, 101, 0, 0, 872, 873, 5, 116, 0, 0, 873, 874, 5, 101, 0, 0, 874, 146, 1, 0, 0, 0, 875, 876, 5, 114, 0, 0, 876, 877, 5, 101, 0, 0, 877, 878, 5, 116, 0, 0, 878, 879, 5, 97, 0, 0, 879, 880, 5, 105, 0, 0, 880, 881, 5, 110, 0, 0, 881, 882, 5, 45, 0, 0, 882, 883, 5, 111, 0, 0, 883, 884, 5, 116, 0, 0, 884, 885, 5, 104, 0, 0, 885, 886, 5, 101, 0, 0, 886, 887, 5, 114, 0, 0, 887, 148, 1, 0, 0, 0, 888, 889, 5, 107, 0, 0, 889, 890, 5, 101, 0, 0, 890, 891, 5, 121, 0, 0, 891, 892, 5, 101, 0, 0, 892, 893, 5, 100, 0, 0, 893, 150, 1, 0, 0, 0, 894, 895, 5, 112, 0, 0, 895, 896, 5, 117, 0, 0, 896, 897, 5, 98, 0, 0, 897, 898, 5, 108, 0, 0, 898, 899, 5, 105, 0, 0, 899, 900, 5, 99, 0, 0, 900, 901, 5, 45, 0, 0, 901, 902, 5, 116, 0, 0, 902, 903, 5, 114, 0, 0, 903, 904, 5, 97, 0, 0, 904, 905, 5, 118, 0, 0, 905, 906, 5, 101, 0, 0, 906, 907, 5, 114, 0, 0, 907, 908, 5, 115, 0, 0, 908, 909, 5, 97, 0, 0, 909, 910, 5, 108, 0, 0, 910, 152, 1, 0, 0, 0, 911, 912, 5, 105, 0, 0, 912, 913, 5, 100, 0, 0, 913, 154, 1, 0, 0, 0, 914, 915, 5, 100, 0, 0, 915, 916, 5, 111, 0, 0, 916, 917, 5, 99, 0, 0, 917, 156, 1, 0, 0, 0, 918, 919, 5, 109, 0, 0, 919, 920, 5, 111, 0, 0, 920, 921, 5, 100, 0, 0, 921, 922, 5, 101, 0, 0, 922, 158, 1, 0, 0, 0, 923, 924, 5, 101, 0, 0, 924, 925, 5, 109, 0, 0, 925, 926, 5, 105, 0, 0, 926, 927, 5, 116, 0, 0, 927, 928, 5, 115, 0, 0, 928, 160, 1, 0, 0, 0, 929, 930, 5, 114, 0, 0, 930, 931, 5, 101, 0, 0, 931, 932, 5, 99, 0, 0, 932, 933, 5, 101, 0, 0, 933, 934, 5, 105, 0, 0, 934, 935, 5, 118, 0, 0, 935, 936, 5, 101, 0, 0, 936, 937, 5, 114, 0, 0, 937, 162, 1, 0, 0, 0, 938, 939, 5, 114, 0, 0, 939, 940, 5, 101, 0, 0, 940, 941, 5, 113, 0, 0, 941, 942, 5, 117, 0, 0, 942, 943, 5, 105, 0, 0, 943, 944, 5, 114, 0, 0, 944, 945, 5, 101, 0, 0, 945, 946, 5, 115, 0, 0, 946, 164, 1, 0, 0, 0, 947, 948, 5, 97, 0, 0, 948, 949, 5, 110, 0, 0, 949, 950, 5, 121, 0, 0, 950, 166, 1, 0, 0, 0, 951, 952, 5, 103, 0, 0, 952, 953, 5, 101, 0, 0, 953, 954, 5, 116, 0, 0, 954, 168, 1, 0, 0, 0, 955, 956, 5, 115, 0, 0, 956, 957, 5, 101, 0, 0, 957, 958, 5, 116, 0, 0, 958, 170, 1, 0, 0, 0, 959, 960, 5, 119, 0, 0, 960, 961, 5, 97, 0, 0, 961, 962, 5, 116, 0, 0, 962, 963, 5, 99, 0, 0, 963, 964, 5, 104, 0, 0, 964, 172, 1, 0, 0, 0, 965, 966, 5, 115, 0, 0, 966, 967, 5, 116, 0, 0, 967, 968, 5, 97, 0, 0, 968, 969, 5, 114, 0, 0, 969, 970, 5, 116, 0, 0, 970, 174, 1, 0, 0, 0, 971, 972, 5, 115, 0, 0, 972, 973, 5, 116, 0, 0, 973, 974, 5, 111, 0, 0, 974, 975, 5, 112, 0, 0, 975, 176, 1, 0, 0, 0, 976, 977, 5, 114, 0, 0, 977, 978, 5, 101, 0, 0, 978, 979, 5, 97, 0, 0, 979, 980, 5, 100, 0, 0, 980, 178, 1, 0, 0, 0, 981, 982, 5, 119, 0, 0, 982, 983, 5, 114, 0, 0, 983, 984, 5, 105, 0, 0, 984, 985, 5, 116, 0, 0, 985, 986, 5, 101, 0, 0, 986, 180, 1, 0, 0, 0, 987, 988, 5, 114, 0, 0, 988, 989, 5, 101, 0, 0, 989, 990, 5, 115, 0, 0, 990, 991, 5, 111, 0, 0, 991, 992, 5, 108, 0, 0, 992, 993, 5, 118, 0, 0, 993, 994, 5, 101, 0, 0, 994, 182, 1, 0, 0, 0, 995, 996, 5, 99, 0, 0, 996, 997, 5, 111, 0, 0, 997, 998, 5, 110, 0, 0, 998, 999, 5, 110, 0, 0, 999, 1000, 5, 101, 0, 0, 1000, 1001, 5, 99, 0, 0, 1001, 1002, 5, 116, 0, 0, 1002, 184, 1, 0, 0, 0, 1003, 1004, 5, 100, 0, 0, 1004, 1005, 5, 105, 0, 0, 1005, 1006, 5, 115, 0, 0, 1006, 1007, 5, 99, 0, 0, 1007, 1008, 5, 111, 0, 0, 1008, 1009, 5, 110, 0, 0, 1009, 1010, 5, 110, 0, 0, 1010, 1011, 5, 101, 0, 0, 1011, 1012, 5, 99, 0, 0, 1012, 1013, 5, 116, 0, 0, 1013, 186, 1, 0, 0, 0, 1014, 1015, 5, 99, 0, 0, 1015, 1016, 5, 97, 0, 0, 1016, 1017, 5, 108, 0, 0, 1017, 1018, 5, 108, 0, 0, 1018, 188, 1, 0, 0, 0, 1019, 1020, 5, 119, 0, 0, 1020, 1021, 5, 97, 0, 0, 1021, 1022, 5, 116, 0, 0, 1022, 1023, 5, 99, 0, 0, 1023, 1024, 5, 104, 0, 0, 1024, 1025, 5, 45, 0, 0, 1025, 1026, 5, 115, 0, 0, 1026, 1027, 5, 116, 0, 0, 1027, 1028, 5, 97, 0, 0, 1028, 1029, 5, 114, 0, 0, 1029, 1030, 5, 116, 0, 0, 1030, 190, 1, 0, 0, 0, 1031, 1032, 5, 119, 0, 0, 1032, 1033, 5, 97, 0, 0, 1033, 1034, 5, 116, 0, 0, 1034, 1035, 5, 99, 0, 0, 1035, 1036, 5, 104, 0, 0, 1036, 1037, 5, 45, 0, 0, 1037, 1038, 5, 115, 0, 0, 1038, 1039, 5, 116, 0, 0, 1039, 1040, 5, 111, 0, 0, 1040, 1041, 5, 112, 0, 0, 1041, 192, 1, 0, 0, 0, 1042, 1043, 5, 115, 0, 0, 1043, 1044, 5, 117, 0, 0, 1044, 1045, 5, 98, 0, 0, 1045, 1046, 5, 115, 0, 0, 1046, 1047, 5, 99, 0, 0, 1047, 1048, 5, 114, 0, 0, 1048, 1049, 5, 105, 0, 0, 1049, 1050, 5, 98, 0, 0, 1050, 1051, 5, 101, 0, 0, 1051, 194, 1, 0, 0, 0, 1052, 1053, 5, 117, 0, 0, 1053, 1054, 5, 110, 0, 0, 1054, 1055, 5, 115, 0, 0, 1055, 1056, 5, 117, 0, 0, 1056, 1057, 5, 98, 0, 0, 1057, 1058, 5, 115, 0, 0, 1058, 1059, 5, 99, 0, 0, 1059, 1060, 5, 114, 0, 0, 1060, 1061, 5, 105, 0, 0, 1061, 1062, 5, 98, 0, 0, 1062, 1063, 5, 101, 0, 0, 1063, 196, 1, 0, 0, 0, 1064, 1065, 5, 114, 0, 0, 1065, 1066, 5, 101, 0, 0, 1066, 1067, 5, 103, 0, 0, 1067, 1068, 5, 105, 0, 0, 1068, 1069, 5, 115, 0, 0, 1069, 1070, 5, 116, 0, 0, 1070, 1071, 5, 101, 0, 0, 1071, 1072, 5, 114, 0, 0, 1072, 198, 1, 0, 0, 0, 1073, 1074, 5, 99, 0, 0, 1074, 1075, 5, 114, 0, 0, 1075, 1076, 5, 100, 0, 0, 1076, 1077, 5, 116, 0, 0, 1077, 200, 1, 0, 0, 0, 1078, 1079, 5, 111, 0, 0, 1079, 1080, 5, 112, 0, 0, 1080, 1081, 5, 116, 0, 0, 1081, 1082, 5, 105, 0, 0, 1082, 1083, 5, 111, 0, 0, 1083, 1084, 5, 110, 0, 0, 1084, 1085, 5, 97, 0, 0, 1085, 1086, 5, 108, 0, 0, 1086, 1087, 5, 45, 0, 0, 1087, 1088, 5, 111, 0, 0, 1088, 1089, 5, 110, 0, 0, 1089, 1090, 5, 101, 0, 0, 1090, 202, 1, 0, 0, 0, 1091, 1092, 5, 101, 0, 0, 1092, 1093, 5, 120, 0, 0, 1093, 1094, 5, 97, 0, 0, 1094, 1095, 5, 99, 0, 0, 1095, 1096, 5, 116, 0, 0, 1096, 1097, 5, 108, 0, 0, 1097, 1098, 5, 121, 0, 0, 1098, 1099, 5, 45, 0, 0, 1099, 1100, 5, 111, 0, 0, 1100, 1101, 5, 110, 0, 0, 1101, 1102, 5, 101, 0, 0, 1102, 204, 1, 0, 0, 0, 1103, 1104, 5, 109, 0, 0, 1104, 1105, 5, 97, 0, 0, 1105, 1106, 5, 110, 0, 0, 1106, 1107, 5, 121, 0, 0, 1107, 1108, 5, 45, 0, 0, 1108, 1109, 5, 117, 0, 0, 1109, 1110, 5, 110, 0, 0, 1110, 1111, 5, 105, 0, 0, 1111, 1112, 5, 113, 0, 0, 1112, 1113, 5, 117, 0, 0, 1113, 1114, 5, 101, 0, 0, 1114, 206, 1, 0, 0, 0, 1115, 1116, 5, 109, 0, 0, 1116, 1117, 5, 97, 0, 0, 1117, 1118, 5, 110, 0, 0, 1118, 1119, 5, 121, 0, 0, 1119, 208, 1, 0, 0, 0, 1120, 1121, 5, 111, 0, 0, 1121, 1122, 5, 114, 0, 0, 1122, 1123, 5, 100, 0, 0, 1123, 1124, 5, 101, 0, 0, 1124, 1125, 5, 114, 0, 0, 1125, 1126, 5, 101, 0, 0, 1126, 1127, 5, 100, 0, 0, 1127, 210, 1, 0, 0, 0, 1128, 1129, 5, 117, 0, 0, 1129, 1130, 5, 110, 0, 0, 1130, 1131, 5, 105, 0, 0, 1131, 1132, 5, 116, 0, 0, 1132, 212, 1, 0, 0, 0, 1133, 1134, 5, 119, 0, 0, 1134, 1135, 5, 97, 0, 0, 1135, 1136, 5, 116, 0, 0, 1136, 1137, 5, 99, 0, 0, 1137, 1138, 5, 104, 0, 0, 1138, 1139, 5, 45, 0, 0, 1139, 1140, 5, 104, 0, 0, 1140, 1141, 5, 97, 0, 0, 1141, 1142, 5, 110, 0, 0, 1142, 1143, 5, 100, 0, 0, 1143, 1144, 5, 108, 0, 0, 1144, 1145, 5, 101, 0, 0, 1145, 214, 1, 0, 0, 0, 1146, 1147, 5, 109, 0, 0, 1147, 1148, 5, 101, 0, 0, 1148, 1149, 5, 115, 0, 0, 1149, 1150, 5, 115, 0, 0, 1150, 1151, 5, 97, 0, 0, 1151, 1152, 5, 103, 0, 0, 1152, 1153, 5, 101, 0, 0, 1153, 216, 1, 0, 0, 0, 1154, 1155, 5, 97, 0, 0, 1155, 1156, 5, 116, 0, 0, 1156, 1157, 5, 111, 0, 0, 1157, 1158, 5, 109, 0, 0, 1158, 1159, 5, 45, 0, 0, 1159, 1160, 5, 114, 0, 0, 1160, 1161, 5, 101, 0, 0, 1161, 1162, 5, 102, 0, 0, 1162, 218, 1, 0, 0, 0, 1163, 1164, 5, 105, 0, 0, 1164, 1165, 5, 110, 0, 0, 1165, 1166, 5, 116, 0, 0, 1166, 1167, 5, 101, 0, 0, 1167, 1168, 5, 114, 0, 0, 1168, 1169, 5, 102, 0, 0, 1169, 1170, 5, 97, 0, 0, 1170, 1171, 5, 99, 0, 0, 1171, 1172, 5, 101, 0, 0, 1172, 1173, 5, 45, 0, 0, 1173, 1174, 5, 114, 0, 0, 1174, 1175, 5, 101, 0, 0, 1175, 1176, 5, 102, 0, 0, 1176, 220, 1, 0, 0, 0, 1177, 1178, 5, 111, 0, 0, 1178, 1179, 5, 112, 0, 0, 1179, 1180, 5, 116, 0, 0, 1180, 1181, 5, 105, 0, 0, 1181, 1182, 5, 111, 0, 0, 1182, 1183, 5, 110, 0, 0, 1183, 1184, 5, 97, 0, 0, 1184, 1185, 5, 108, 0, 0, 1185, 222, 1, 0, 0, 0, 1186, 1187, 5, 108, 0, 0, 1187, 1188, 5, 105, 0, 0, 1188, 1189, 5, 115, 0, 0, 1189, 1190, 5, 116, 0, 0, 1190, 224, 1, 0, 0, 0, 1191, 1192, 5, 114, 0, 0, 1192, 1193, 5, 101, 0, 0, 1193, 1194, 5, 99, 0, 0, 1194, 1195, 5, 111, 0, 0, 1195, 1196, 5, 114, 0, 0, 1196, 1197, 5, 100, 0, 0, 1197, 226, 1, 0, 0, 0, 1198, 1199, 5, 98, 0, 0, 1199, 1200, 5, 111, 0, 0, 1200, 1201, 5, 111, 0, 0, 1201, 1202, 5, 108, 0, 0, 1202, 228, 1, 0, 0, 0, 1203, 1204, 5, 98, 0, 0, 1204, 1205, 5, 121, 0, 0, 1205, 1206, 5, 116, 0, 0, 1206, 1207, 5, 101, 0, 0, 1207, 1208, 5, 115, 0, 0, 1208, 230, 1, 0, 0, 0, 1209, 1210, 5, 100, 0, 0, 1210, 1211, 5, 111, 0, 0, 1211, 1212, 5, 117, 0, 0, 1212, 1213, 5, 98, 0, 0, 1213, 1214, 5, 108, 0, 0, 1214, 1215, 5, 101, 0, 0, 1215, 232, 1, 0, 0, 0, 1216, 1217, 5, 105, 0, 0, 1217, 1218, 5, 110, 0, 0, 1218, 1219, 5, 116, 0, 0, 1219, 1220, 5, 51, 0, 0, 1220, 1221, 5, 50, 0, 0, 1221, 234, 1, 0, 0, 0, 1222, 1223, 5, 105, 0, 0, 1223, 1224, 5, 110, 0, 0, 1224, 1225, 5, 116, 0, 0, 1225, 1226, 5, 54, 0, 0, 1226, 1227, 5, 52, 0, 0, 1227, 236, 1, 0, 0, 0, 1228, 1229, 5, 115, 0, 0, 1229, 1230, 5, 116, 0, 0, 1230, 1231, 5, 114, 0, 0, 1231, 1232, 5, 105, 0, 0, 1232, 1233, 5, 110, 0, 0, 1233, 1234, 5, 103, 0, 0, 1234, 238, 1, 0, 0, 0, 1235, 1236, 5, 117, 0, 0, 1236, 1237, 5, 105, 0, 0, 1237, 1238, 5, 110, 0, 0, 1238, 1239, 5, 116, 0, 0, 1239, 1240, 5, 51, 0, 0, 1240, 1241, 5, 50, 0, 0, 1241, 240, 1, 0, 0, 0, 1242, 1243, 5, 117, 0, 0, 1243, 1244, 5, 105, 0, 0, 1244, 1245, 5, 110, 0, 0, 1245, 1246, 5, 116, 0, 0, 1246, 1247, 5, 54, 0, 0, 1247, 1248, 5, 52, 0, 0, 1248, 242, 1, 0, 0, 0, 1249, 1250, 5, 116, 0, 0, 1250, 1251, 5, 114, 0, 0, 1251, 1252, 5, 117, 0, 0, 1252, 1253, 5, 101, 0, 0, 1253, 244, 1, 0, 0, 0, 1254, 1255, 5, 102, 0, 0, 1255, 1256, 5, 97, 0, 0, 1256, 1257, 5, 108, 0, 0, 1257, 1258, 5, 115, 0, 0, 1258, 1259, 5, 101, 0, 0, 1259, 246, 1, 0, 0, 0, 1260, 1261, 5, 110, 0, 0, 1261, 1262, 5, 117, 0, 0, 1262, 1263, 5, 108, 0, 0, 1263, 1264, 5, 108, 0, 0, 1264, 248, 1, 0, 0, 0, 1265, 1266, 5, 45, 0, 0, 1266, 1267, 5, 62, 0, 0, 1267, 250, 1, 0, 0, 0, 1268, 1269, 5, 58, 0, 0, 1269, 252, 1, 0, 0, 0, 1270, 1271, 5, 59, 0, 0, 1271, 254, 1, 0, 0, 0, 1272, 1273, 5, 44, 0, 0, 1273, 256, 1, 0, 0, 0, 1274, 1275, 5, 46, 0, 0, 1275, 258, 1, 0, 0, 0, 1276, 1277, 5, 123, 0, 0, 1277, 260, 1, 0, 0, 0, 1278, 1279, 5, 125, 0, 0, 1279, 262, 1, 0, 0, 0, 1280, 1281, 5, 91, 0, 0, 1281, 264, 1, 0, 0, 0, 1282, 1283, 5, 93, 0, 0, 1283, 266, 1, 0, 0, 0, 1284, 1285, 5, 40, 0, 0, 1285, 268, 1, 0, 0, 0, 1286, 1287, 5, 41, 0, 0, 1287, 270, 1, 0, 0, 0, 1288, 1289, 5, 60, 0, 0, 1289, 272, 1, 0, 0, 0, 1290, 1291, 5, 62, 0, 0, 1291, 274, 1, 0, 0, 0, 1292, 1293, 5, 38, 0, 0, 1293, 276, 1, 0, 0, 0, 1294, 1295, 5, 61, 0, 0, 1295, 278, 1, 0, 0, 0, 1296, 1298, 5, 45, 0, 0, 1297, 1296, 1, 0, 0, 0, 1297, 1298, 1, 0, 0, 0, 1298, 1300, 1, 0, 0, 0, 1299, 1301, 7, 0, 0, 0, 1300, 1299, 1, 0, 0, 0, 1301, 1302, 1, 0, 0, 0, 1302, 1300, 1, 0, 0, 0, 1302, 1303, 1, 0, 0, 0, 1303, 280, 1, 0, 0, 0, 1304, 1306, 5, 45, 0, 0, 1305, 1304, 1, 0, 0, 0, 1305, 1306, 1, 0, 0, 0, 1306, 1315, 1, 0, 0, 0, 1307, 1316, 5, 48, 0, 0, 1308, 1312, 7, 1, 0, 0, 1309, 1311, 7, 0, 0, 0, 1310, 1309, 1, 0, 0, 0, 1311, 1314, 1, 0, 0, 0, 1312, 1310, 1, 0, 0, 0, 1312, 1313, 1, 0, 0, 0, 1313, 1316, 1, 0, 0, 0, 1314, 1312, 1, 0, 0, 0, 1315, 1307, 1, 0, 0, 0, 1315, 1308, 1, 0, 0, 0, 1316, 1323, 1, 0, 0, 0, 1317, 1319, 5, 46, 0, 0, 1318, 1320, 7, 0, 0, 0, 1319, 1318, 1, 0, 0, 0, 1320, 1321, 1, 0, 0, 0, 1321, 1319, 1, 0, 0, 0, 1321, 1322, 1, 0, 0, 0, 1322, 1324, 1, 0, 0, 0, 1323, 1317, 1, 0, 0, 0, 1323, 1324, 1, 0, 0, 0, 1324, 1334, 1, 0, 0, 0, 1325, 1327, 7, 2, 0, 0, 1326, 1328, 7, 3, 0, 0, 1327, 1326, 1, 0, 0, 0, 1327, 1328, 1, 0, 0, 0, 1328, 1330, 1, 0, 0, 0, 1329, 1331, 7, 0, 0, 0, 1330, 1329, 1, 0, 0, 0, 1331, 1332, 1, 0, 0, 0, 1332, 1330, 1, 0, 0, 0, 1332, 1333, 1, 0, 0, 0, 1333, 1335, 1, 0, 0, 0, 1334, 1325, 1, 0, 0, 0, 1334, 1335, 1, 0, 0, 0, 1335, 282, 1, 0, 0, 0, 1336, 1340, 7, 4, 0, 0, 1337, 1339, 7, 5, 0, 0, 1338, 1337, 1, 0, 0, 0, 1339, 1342, 1, 0, 0, 0, 1340, 1338, 1, 0, 0, 0, 1340, 1341, 1, 0, 0, 0, 1341, 284, 1, 0, 0, 0, 1342, 1340, 1, 0, 0, 0, 1343, 1348, 5, 34, 0, 0, 1344, 1347, 3, 287, 143, 0, 1345, 1347, 8, 6, 0, 0, 1346, 1344, 1, 0, 0, 0, 1346, 1345, 1, 0, 0, 0, 1347, 1350, 1, 0, 0, 0, 1348, 1346, 1, 0, 0, 0, 1348, 1349, 1, 0, 0, 0, 1349, 1351, 1, 0, 0, 0, 1350, 1348, 1, 0, 0, 0, 1351, 1352, 5, 34, 0, 0, 1352, 286, 1, 0, 0, 0, 1353, 1361, 5, 92, 0, 0, 1354, 1362, 7, 7, 0, 0, 1355, 1356, 5, 117, 0, 0, 1356, 1357, 3, 289, 144, 0, 1357, 1358, 3, 289, 144, 0, 1358, 1359, 3, 289, 144, 0, 1359, 1360, 3, 289, 144, 0, 1360, 1362, 1, 0, 0, 0, 1361, 1354, 1, 0, 0, 0, 1361, 1355, 1, 0, 0, 0, 1362, 288, 1, 0, 0, 0, 1363, 1364, 7, 8, 0, 0, 1364, 290, 1, 0, 0, 0, 1365, 1366, 5, 47, 0, 0, 1366, 1367, 5, 47, 0, 0, 1367, 1371, 1, 0, 0, 0, 1368, 1370, 8, 9, 0, 0, 1369, 1368, 1, 0, 0, 0, 1370, 1373, 1, 0, 0, 0, 1371, 1369, 1, 0, 0, 0, 1371, 1372, 1, 0, 0, 0, 1372, 1374, 1, 0, 0, 0, 1373, 1371, 1, 0, 0, 0, 1374, 1375, 6, 145, 0, 0, 1375, 292, 1, 0, 0, 0, 1376, 1377, 5, 47, 0, 0, 1377, 1378, 5, 42, 0, 0, 1378, 1382, 1, 0, 0, 0, 1379, 1381, 9, 0, 0, 0, 1380, 1379, 1, 0, 0, 0, 1381, 1384, 1, 0, 0, 0, 1382, 1383, 1, 0, 0, 0, 1382, 1380, 1, 0, 0, 0, 1383, 1385, 1, 0, 0, 0, 1384, 1382, 1, 0, 0, 0, 1385, 1386, 5, 42, 0, 0, 1386, 1387, 5, 47, 0, 0, 1387, 1388, 1, 0, 0, 0, 1388, 1389, 6, 146, 0, 0, 1389, 294, 1, 0, 0, 0, 1390, 1392, 7, 10, 0, 0, 1391, 1390, 1, 0, 0, 0, 1392, 1393, 1, 0, 0, 0, 1393, 1391, 1, 0, 0, 0, 1393, 1394, 1, 0, 0, 0, 1394, 1395, 1, 0, 0, 0, 1395, 1396, 6, 147, 0, 0, 1396, 296, 1, 0, 0, 0, 18, 0, 1297, 1302, 1305, 1312, 1315, 1321, 1323, 1327, 1332, 1334, 1340, 1346, 1348, 1361, 1371, 1382, 1393, 1, 0, 1, 0] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapabilityLexer.tokens b/src/capability-language/generated/QuixosCapabilityLexer.tokens index 879ca09..25f0df9 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.tokens +++ b/src/capability-language/generated/QuixosCapabilityLexer.tokens @@ -1,283 +1,285 @@ -CREATION=1 -INITIALIZE=2 -WORKSPACE=3 -EXECUTION=4 -SNAPSHOT=5 -TRANSACTION=6 -REMOTE=7 -TARGETS=8 -PORTABLE=9 -REPLICA=10 -LOCAL=11 -FROM=12 -RESULT_BYTES=13 -RPC_CALLS=14 -DEADLINE_MS=15 -QUERY=16 -REFLECTION=17 -SPECIALIZE=18 -ROOT=19 -DOCUMENT=20 -FRAGMENTS=21 -VIEW=22 -MAX=23 -ALLOW=24 -POLL=25 -QUERYABLE=26 -RPC=27 -QUERY_REASON=28 -TYPE=29 -OBJECT=30 -STORABLE=31 -IMPLEMENTS=32 -REF=33 -FRAGMENT=34 -IMPORT=35 -EXTERNAL=36 -ATOM=37 -INTERFACE=38 -INTERFACES=39 -PACKAGE=40 -VALUE=41 -RELATION=42 -OPERATION=43 -FUNCTION=44 -CONSTRUCTOR=45 -CONSTRUCTS=46 -INPUT=47 -CONFORM=48 -AS=49 -BIND=50 -STATIC=51 -TO=52 -PRIVATE=53 -SHARED=54 -STATE=55 -EDGE=56 -PROJECTION=57 -WITH=58 -USING=59 -VIA=60 -MATERIALIZE=61 -IF=62 -ABSENT=63 -ON=64 -POLICY=65 -DEFAULT=66 -SOURCE=67 -REPOSITORY=68 -COMMIT=69 -REVISION=70 -SEMANTIC_MAJOR=71 -ON_DELETE=72 -RETAIN_OTHER=73 -KEYED=74 -PUBLIC_TRAVERSAL=75 -ID=76 -DOC=77 -MODE=78 -EMITS=79 -RECEIVER=80 -REQUIRES=81 -ANY=82 -GET=83 -SET=84 -WATCH=85 -START=86 -STOP=87 -READ=88 -WRITE=89 -RESOLVE=90 -CONNECT=91 -DISCONNECT=92 -CALL=93 -WATCH_START=94 -WATCH_STOP=95 -SUBSCRIBE=96 -UNSUBSCRIBE=97 -REGISTER=98 -CRDT=99 -OPTIONAL_ONE=100 -EXACTLY_ONE=101 -MANY_UNIQUE=102 -MANY=103 -ORDERED=104 -UNIT=105 -WATCH_HANDLE=106 -MESSAGE=107 -ATOM_REF=108 -INTERFACE_REF=109 -OPTIONAL=110 -LIST=111 -RECORD=112 -BOOL=113 -BYTES=114 -DOUBLE=115 -INT32=116 -INT64=117 -STRING=118 -UINT32=119 -UINT64=120 -TRUE=121 -FALSE=122 -NULL=123 -ARROW=124 -COLON=125 -SEMI=126 -COMMA=127 -DOT=128 -LBRACE=129 -RBRACE=130 -LBRACK=131 -RBRACK=132 -LPAREN=133 -RPAREN=134 -LT=135 -GT=136 -AMP=137 -EQUAL=138 -INTEGER=139 -JSON_NUMBER=140 -IDENTIFIER=141 -STRING_LITERAL=142 -LINE_COMMENT=143 -BLOCK_COMMENT=144 -WS=145 -'creation'=1 -'initialize'=2 -'workspace'=3 -'execution'=4 -'snapshot'=5 -'transaction'=6 -'remote'=7 -'targets'=8 -'portable'=9 -'replica'=10 -'local'=11 -'from'=12 -'result-bytes'=13 -'rpc-calls'=14 -'deadline-ms'=15 -'query'=16 -'reflection'=17 -'specialize'=18 -'root'=19 -'document'=20 -'fragments'=21 -'view'=22 -'max'=23 -'allow'=24 -'poll'=25 -'queryable'=26 -'rpc'=27 -'query-reason'=28 -'type'=29 -'object'=30 -'storable'=31 -'implements'=32 -'ref'=33 -'fragment'=34 -'import'=35 -'external'=36 -'atom'=37 -'interface'=38 -'interfaces'=39 -'package'=40 -'value'=41 -'relation'=42 -'operation'=43 -'function'=44 -'constructor'=45 -'constructs'=46 -'input'=47 -'conform'=48 -'as'=49 -'bind'=50 -'static'=51 -'to'=52 -'private'=53 -'shared'=54 -'state'=55 -'edge'=56 -'projection'=57 -'with'=58 -'using'=59 -'via'=60 -'materialize'=61 -'if'=62 -'absent'=63 -'on'=64 -'policy'=65 -'default'=66 -'source'=67 -'repository'=68 -'commit'=69 -'revision'=70 -'semantic-major'=71 -'on-delete'=72 -'retain-other'=73 -'keyed'=74 -'public-traversal'=75 -'id'=76 -'doc'=77 -'mode'=78 -'emits'=79 -'receiver'=80 -'requires'=81 -'any'=82 -'get'=83 -'set'=84 -'watch'=85 -'start'=86 -'stop'=87 -'read'=88 -'write'=89 -'resolve'=90 -'connect'=91 -'disconnect'=92 -'call'=93 -'watch-start'=94 -'watch-stop'=95 -'subscribe'=96 -'unsubscribe'=97 -'register'=98 -'crdt'=99 -'optional-one'=100 -'exactly-one'=101 -'many-unique'=102 -'many'=103 -'ordered'=104 -'unit'=105 -'watch-handle'=106 -'message'=107 -'atom-ref'=108 -'interface-ref'=109 -'optional'=110 -'list'=111 -'record'=112 -'bool'=113 -'bytes'=114 -'double'=115 -'int32'=116 -'int64'=117 -'string'=118 -'uint32'=119 -'uint64'=120 -'true'=121 -'false'=122 -'null'=123 -'->'=124 -':'=125 -';'=126 -','=127 -'.'=128 -'{'=129 -'}'=130 -'['=131 -']'=132 -'('=133 -')'=134 -'<'=135 -'>'=136 -'&'=137 -'='=138 +EDIT=1 +CREATION=2 +INITIALIZE=3 +WORKSPACE=4 +EXECUTION=5 +SNAPSHOT=6 +TRANSACTION=7 +REMOTE=8 +TARGETS=9 +PORTABLE=10 +REPLICA=11 +LOCAL=12 +FROM=13 +RESULT_BYTES=14 +RPC_CALLS=15 +DEADLINE_MS=16 +QUERY=17 +REFLECTION=18 +SPECIALIZE=19 +ROOT=20 +DOCUMENT=21 +FRAGMENTS=22 +VIEW=23 +MAX=24 +ALLOW=25 +POLL=26 +QUERYABLE=27 +RPC=28 +QUERY_REASON=29 +TYPE=30 +OBJECT=31 +STORABLE=32 +IMPLEMENTS=33 +REF=34 +FRAGMENT=35 +IMPORT=36 +EXTERNAL=37 +ATOM=38 +INTERFACE=39 +INTERFACES=40 +PACKAGE=41 +VALUE=42 +RELATION=43 +OPERATION=44 +FUNCTION=45 +CONSTRUCTOR=46 +CONSTRUCTS=47 +INPUT=48 +CONFORM=49 +AS=50 +BIND=51 +STATIC=52 +TO=53 +PRIVATE=54 +SHARED=55 +STATE=56 +EDGE=57 +PROJECTION=58 +WITH=59 +USING=60 +VIA=61 +MATERIALIZE=62 +IF=63 +ABSENT=64 +ON=65 +POLICY=66 +DEFAULT=67 +SOURCE=68 +REPOSITORY=69 +COMMIT=70 +REVISION=71 +SEMANTIC_MAJOR=72 +ON_DELETE=73 +RETAIN_OTHER=74 +KEYED=75 +PUBLIC_TRAVERSAL=76 +ID=77 +DOC=78 +MODE=79 +EMITS=80 +RECEIVER=81 +REQUIRES=82 +ANY=83 +GET=84 +SET=85 +WATCH=86 +START=87 +STOP=88 +READ=89 +WRITE=90 +RESOLVE=91 +CONNECT=92 +DISCONNECT=93 +CALL=94 +WATCH_START=95 +WATCH_STOP=96 +SUBSCRIBE=97 +UNSUBSCRIBE=98 +REGISTER=99 +CRDT=100 +OPTIONAL_ONE=101 +EXACTLY_ONE=102 +MANY_UNIQUE=103 +MANY=104 +ORDERED=105 +UNIT=106 +WATCH_HANDLE=107 +MESSAGE=108 +ATOM_REF=109 +INTERFACE_REF=110 +OPTIONAL=111 +LIST=112 +RECORD=113 +BOOL=114 +BYTES=115 +DOUBLE=116 +INT32=117 +INT64=118 +STRING=119 +UINT32=120 +UINT64=121 +TRUE=122 +FALSE=123 +NULL=124 +ARROW=125 +COLON=126 +SEMI=127 +COMMA=128 +DOT=129 +LBRACE=130 +RBRACE=131 +LBRACK=132 +RBRACK=133 +LPAREN=134 +RPAREN=135 +LT=136 +GT=137 +AMP=138 +EQUAL=139 +INTEGER=140 +JSON_NUMBER=141 +IDENTIFIER=142 +STRING_LITERAL=143 +LINE_COMMENT=144 +BLOCK_COMMENT=145 +WS=146 +'edit'=1 +'creation'=2 +'initialize'=3 +'workspace'=4 +'execution'=5 +'snapshot'=6 +'transaction'=7 +'remote'=8 +'targets'=9 +'portable'=10 +'replica'=11 +'local'=12 +'from'=13 +'result-bytes'=14 +'rpc-calls'=15 +'deadline-ms'=16 +'query'=17 +'reflection'=18 +'specialize'=19 +'root'=20 +'document'=21 +'fragments'=22 +'view'=23 +'max'=24 +'allow'=25 +'poll'=26 +'queryable'=27 +'rpc'=28 +'query-reason'=29 +'type'=30 +'object'=31 +'storable'=32 +'implements'=33 +'ref'=34 +'fragment'=35 +'import'=36 +'external'=37 +'atom'=38 +'interface'=39 +'interfaces'=40 +'package'=41 +'value'=42 +'relation'=43 +'operation'=44 +'function'=45 +'constructor'=46 +'constructs'=47 +'input'=48 +'conform'=49 +'as'=50 +'bind'=51 +'static'=52 +'to'=53 +'private'=54 +'shared'=55 +'state'=56 +'edge'=57 +'projection'=58 +'with'=59 +'using'=60 +'via'=61 +'materialize'=62 +'if'=63 +'absent'=64 +'on'=65 +'policy'=66 +'default'=67 +'source'=68 +'repository'=69 +'commit'=70 +'revision'=71 +'semantic-major'=72 +'on-delete'=73 +'retain-other'=74 +'keyed'=75 +'public-traversal'=76 +'id'=77 +'doc'=78 +'mode'=79 +'emits'=80 +'receiver'=81 +'requires'=82 +'any'=83 +'get'=84 +'set'=85 +'watch'=86 +'start'=87 +'stop'=88 +'read'=89 +'write'=90 +'resolve'=91 +'connect'=92 +'disconnect'=93 +'call'=94 +'watch-start'=95 +'watch-stop'=96 +'subscribe'=97 +'unsubscribe'=98 +'register'=99 +'crdt'=100 +'optional-one'=101 +'exactly-one'=102 +'many-unique'=103 +'many'=104 +'ordered'=105 +'unit'=106 +'watch-handle'=107 +'message'=108 +'atom-ref'=109 +'interface-ref'=110 +'optional'=111 +'list'=112 +'record'=113 +'bool'=114 +'bytes'=115 +'double'=116 +'int32'=117 +'int64'=118 +'string'=119 +'uint32'=120 +'uint64'=121 +'true'=122 +'false'=123 +'null'=124 +'->'=125 +':'=126 +';'=127 +','=128 +'.'=129 +'{'=130 +'}'=131 +'['=132 +']'=133 +'('=134 +')'=135 +'<'=136 +'>'=137 +'&'=138 +'='=139 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.ts b/src/capability-language/generated/QuixosCapabilityLexer.ts index 9dab062..e346e80 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.ts +++ b/src/capability-language/generated/QuixosCapabilityLexer.ts @@ -4,158 +4,159 @@ import { Token } from "antlr4ng"; export class QuixosCapabilityLexer extends antlr.Lexer { - public static readonly CREATION = 1; - public static readonly INITIALIZE = 2; - public static readonly WORKSPACE = 3; - public static readonly EXECUTION = 4; - public static readonly SNAPSHOT = 5; - public static readonly TRANSACTION = 6; - public static readonly REMOTE = 7; - public static readonly TARGETS = 8; - public static readonly PORTABLE = 9; - public static readonly REPLICA = 10; - public static readonly LOCAL = 11; - public static readonly FROM = 12; - public static readonly RESULT_BYTES = 13; - public static readonly RPC_CALLS = 14; - public static readonly DEADLINE_MS = 15; - public static readonly QUERY = 16; - public static readonly REFLECTION = 17; - public static readonly SPECIALIZE = 18; - public static readonly ROOT = 19; - public static readonly DOCUMENT = 20; - public static readonly FRAGMENTS = 21; - public static readonly VIEW = 22; - public static readonly MAX = 23; - public static readonly ALLOW = 24; - public static readonly POLL = 25; - public static readonly QUERYABLE = 26; - public static readonly RPC = 27; - public static readonly QUERY_REASON = 28; - public static readonly TYPE = 29; - public static readonly OBJECT = 30; - public static readonly STORABLE = 31; - public static readonly IMPLEMENTS = 32; - public static readonly REF = 33; - public static readonly FRAGMENT = 34; - public static readonly IMPORT = 35; - public static readonly EXTERNAL = 36; - public static readonly ATOM = 37; - public static readonly INTERFACE = 38; - public static readonly INTERFACES = 39; - public static readonly PACKAGE = 40; - public static readonly VALUE = 41; - public static readonly RELATION = 42; - public static readonly OPERATION = 43; - public static readonly FUNCTION = 44; - public static readonly CONSTRUCTOR = 45; - public static readonly CONSTRUCTS = 46; - public static readonly INPUT = 47; - public static readonly CONFORM = 48; - public static readonly AS = 49; - public static readonly BIND = 50; - public static readonly STATIC = 51; - public static readonly TO = 52; - public static readonly PRIVATE = 53; - public static readonly SHARED = 54; - public static readonly STATE = 55; - public static readonly EDGE = 56; - public static readonly PROJECTION = 57; - public static readonly WITH = 58; - public static readonly USING = 59; - public static readonly VIA = 60; - public static readonly MATERIALIZE = 61; - public static readonly IF = 62; - public static readonly ABSENT = 63; - public static readonly ON = 64; - public static readonly POLICY = 65; - public static readonly DEFAULT = 66; - public static readonly SOURCE = 67; - public static readonly REPOSITORY = 68; - public static readonly COMMIT = 69; - public static readonly REVISION = 70; - public static readonly SEMANTIC_MAJOR = 71; - public static readonly ON_DELETE = 72; - public static readonly RETAIN_OTHER = 73; - public static readonly KEYED = 74; - public static readonly PUBLIC_TRAVERSAL = 75; - public static readonly ID = 76; - public static readonly DOC = 77; - public static readonly MODE = 78; - public static readonly EMITS = 79; - public static readonly RECEIVER = 80; - public static readonly REQUIRES = 81; - public static readonly ANY = 82; - public static readonly GET = 83; - public static readonly SET = 84; - public static readonly WATCH = 85; - public static readonly START = 86; - public static readonly STOP = 87; - public static readonly READ = 88; - public static readonly WRITE = 89; - public static readonly RESOLVE = 90; - public static readonly CONNECT = 91; - public static readonly DISCONNECT = 92; - public static readonly CALL = 93; - public static readonly WATCH_START = 94; - public static readonly WATCH_STOP = 95; - public static readonly SUBSCRIBE = 96; - public static readonly UNSUBSCRIBE = 97; - public static readonly REGISTER = 98; - public static readonly CRDT = 99; - public static readonly OPTIONAL_ONE = 100; - public static readonly EXACTLY_ONE = 101; - public static readonly MANY_UNIQUE = 102; - public static readonly MANY = 103; - public static readonly ORDERED = 104; - public static readonly UNIT = 105; - public static readonly WATCH_HANDLE = 106; - public static readonly MESSAGE = 107; - public static readonly ATOM_REF = 108; - public static readonly INTERFACE_REF = 109; - public static readonly OPTIONAL = 110; - public static readonly LIST = 111; - public static readonly RECORD = 112; - public static readonly BOOL = 113; - public static readonly BYTES = 114; - public static readonly DOUBLE = 115; - public static readonly INT32 = 116; - public static readonly INT64 = 117; - public static readonly STRING = 118; - public static readonly UINT32 = 119; - public static readonly UINT64 = 120; - public static readonly TRUE = 121; - public static readonly FALSE = 122; - public static readonly NULL = 123; - public static readonly ARROW = 124; - public static readonly COLON = 125; - public static readonly SEMI = 126; - public static readonly COMMA = 127; - public static readonly DOT = 128; - public static readonly LBRACE = 129; - public static readonly RBRACE = 130; - public static readonly LBRACK = 131; - public static readonly RBRACK = 132; - public static readonly LPAREN = 133; - public static readonly RPAREN = 134; - public static readonly LT = 135; - public static readonly GT = 136; - public static readonly AMP = 137; - public static readonly EQUAL = 138; - public static readonly INTEGER = 139; - public static readonly JSON_NUMBER = 140; - public static readonly IDENTIFIER = 141; - public static readonly STRING_LITERAL = 142; - public static readonly LINE_COMMENT = 143; - public static readonly BLOCK_COMMENT = 144; - public static readonly WS = 145; + public static readonly EDIT = 1; + public static readonly CREATION = 2; + public static readonly INITIALIZE = 3; + public static readonly WORKSPACE = 4; + public static readonly EXECUTION = 5; + public static readonly SNAPSHOT = 6; + public static readonly TRANSACTION = 7; + public static readonly REMOTE = 8; + public static readonly TARGETS = 9; + public static readonly PORTABLE = 10; + public static readonly REPLICA = 11; + public static readonly LOCAL = 12; + public static readonly FROM = 13; + public static readonly RESULT_BYTES = 14; + public static readonly RPC_CALLS = 15; + public static readonly DEADLINE_MS = 16; + public static readonly QUERY = 17; + public static readonly REFLECTION = 18; + public static readonly SPECIALIZE = 19; + public static readonly ROOT = 20; + public static readonly DOCUMENT = 21; + public static readonly FRAGMENTS = 22; + public static readonly VIEW = 23; + public static readonly MAX = 24; + public static readonly ALLOW = 25; + public static readonly POLL = 26; + public static readonly QUERYABLE = 27; + public static readonly RPC = 28; + public static readonly QUERY_REASON = 29; + public static readonly TYPE = 30; + public static readonly OBJECT = 31; + public static readonly STORABLE = 32; + public static readonly IMPLEMENTS = 33; + public static readonly REF = 34; + public static readonly FRAGMENT = 35; + public static readonly IMPORT = 36; + public static readonly EXTERNAL = 37; + public static readonly ATOM = 38; + public static readonly INTERFACE = 39; + public static readonly INTERFACES = 40; + public static readonly PACKAGE = 41; + public static readonly VALUE = 42; + public static readonly RELATION = 43; + public static readonly OPERATION = 44; + public static readonly FUNCTION = 45; + public static readonly CONSTRUCTOR = 46; + public static readonly CONSTRUCTS = 47; + public static readonly INPUT = 48; + public static readonly CONFORM = 49; + public static readonly AS = 50; + public static readonly BIND = 51; + public static readonly STATIC = 52; + public static readonly TO = 53; + public static readonly PRIVATE = 54; + public static readonly SHARED = 55; + public static readonly STATE = 56; + public static readonly EDGE = 57; + public static readonly PROJECTION = 58; + public static readonly WITH = 59; + public static readonly USING = 60; + public static readonly VIA = 61; + public static readonly MATERIALIZE = 62; + public static readonly IF = 63; + public static readonly ABSENT = 64; + public static readonly ON = 65; + public static readonly POLICY = 66; + public static readonly DEFAULT = 67; + public static readonly SOURCE = 68; + public static readonly REPOSITORY = 69; + public static readonly COMMIT = 70; + public static readonly REVISION = 71; + public static readonly SEMANTIC_MAJOR = 72; + public static readonly ON_DELETE = 73; + public static readonly RETAIN_OTHER = 74; + public static readonly KEYED = 75; + public static readonly PUBLIC_TRAVERSAL = 76; + public static readonly ID = 77; + public static readonly DOC = 78; + public static readonly MODE = 79; + public static readonly EMITS = 80; + public static readonly RECEIVER = 81; + public static readonly REQUIRES = 82; + public static readonly ANY = 83; + public static readonly GET = 84; + public static readonly SET = 85; + public static readonly WATCH = 86; + public static readonly START = 87; + public static readonly STOP = 88; + public static readonly READ = 89; + public static readonly WRITE = 90; + public static readonly RESOLVE = 91; + public static readonly CONNECT = 92; + public static readonly DISCONNECT = 93; + public static readonly CALL = 94; + public static readonly WATCH_START = 95; + public static readonly WATCH_STOP = 96; + public static readonly SUBSCRIBE = 97; + public static readonly UNSUBSCRIBE = 98; + public static readonly REGISTER = 99; + public static readonly CRDT = 100; + public static readonly OPTIONAL_ONE = 101; + public static readonly EXACTLY_ONE = 102; + public static readonly MANY_UNIQUE = 103; + public static readonly MANY = 104; + public static readonly ORDERED = 105; + public static readonly UNIT = 106; + public static readonly WATCH_HANDLE = 107; + public static readonly MESSAGE = 108; + public static readonly ATOM_REF = 109; + public static readonly INTERFACE_REF = 110; + public static readonly OPTIONAL = 111; + public static readonly LIST = 112; + public static readonly RECORD = 113; + public static readonly BOOL = 114; + public static readonly BYTES = 115; + public static readonly DOUBLE = 116; + public static readonly INT32 = 117; + public static readonly INT64 = 118; + public static readonly STRING = 119; + public static readonly UINT32 = 120; + public static readonly UINT64 = 121; + public static readonly TRUE = 122; + public static readonly FALSE = 123; + public static readonly NULL = 124; + public static readonly ARROW = 125; + public static readonly COLON = 126; + public static readonly SEMI = 127; + public static readonly COMMA = 128; + public static readonly DOT = 129; + public static readonly LBRACE = 130; + public static readonly RBRACE = 131; + public static readonly LBRACK = 132; + public static readonly RBRACK = 133; + public static readonly LPAREN = 134; + public static readonly RPAREN = 135; + public static readonly LT = 136; + public static readonly GT = 137; + public static readonly AMP = 138; + public static readonly EQUAL = 139; + public static readonly INTEGER = 140; + public static readonly JSON_NUMBER = 141; + public static readonly IDENTIFIER = 142; + public static readonly STRING_LITERAL = 143; + public static readonly LINE_COMMENT = 144; + public static readonly BLOCK_COMMENT = 145; + public static readonly WS = 146; public static readonly channelNames = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" ]; public static readonly literalNames = [ - null, "'creation'", "'initialize'", "'workspace'", "'execution'", + null, "'edit'", "'creation'", "'initialize'", "'workspace'", "'execution'", "'snapshot'", "'transaction'", "'remote'", "'targets'", "'portable'", "'replica'", "'local'", "'from'", "'result-bytes'", "'rpc-calls'", "'deadline-ms'", "'query'", "'reflection'", "'specialize'", "'root'", @@ -183,29 +184,29 @@ export class QuixosCapabilityLexer extends antlr.Lexer { ]; public static readonly symbolicNames = [ - null, "CREATION", "INITIALIZE", "WORKSPACE", "EXECUTION", "SNAPSHOT", - "TRANSACTION", "REMOTE", "TARGETS", "PORTABLE", "REPLICA", "LOCAL", - "FROM", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", "REFLECTION", - "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", "MAX", "ALLOW", - "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", "OBJECT", "STORABLE", - "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", - "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", - "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", - "TO", "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", - "USING", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", - "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", - "ON_DELETE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", - "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", - "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", - "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", - "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", - "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", - "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", "BOOL", - "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", - "TRUE", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", - "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", - "GT", "AMP", "EQUAL", "INTEGER", "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", - "LINE_COMMENT", "BLOCK_COMMENT", "WS" + null, "EDIT", "CREATION", "INITIALIZE", "WORKSPACE", "EXECUTION", + "SNAPSHOT", "TRANSACTION", "REMOTE", "TARGETS", "PORTABLE", "REPLICA", + "LOCAL", "FROM", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", + "REFLECTION", "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", + "MAX", "ALLOW", "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", + "OBJECT", "STORABLE", "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", + "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", + "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", + "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", "PRIVATE", "SHARED", + "STATE", "EDGE", "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", + "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", + "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", "RETAIN_OTHER", + "KEYED", "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", "EMITS", "RECEIVER", + "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", + "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", + "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", + "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", + "MESSAGE", "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", + "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", + "UINT64", "TRUE", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", + "DOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", + "LT", "GT", "AMP", "EQUAL", "INTEGER", "JSON_NUMBER", "IDENTIFIER", + "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", "WS" ]; public static readonly modeNames = [ @@ -213,7 +214,7 @@ export class QuixosCapabilityLexer extends antlr.Lexer { ]; public static readonly ruleNames = [ - "CREATION", "INITIALIZE", "WORKSPACE", "EXECUTION", "SNAPSHOT", + "EDIT", "CREATION", "INITIALIZE", "WORKSPACE", "EXECUTION", "SNAPSHOT", "TRANSACTION", "REMOTE", "TARGETS", "PORTABLE", "REPLICA", "LOCAL", "FROM", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", "REFLECTION", "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", "MAX", "ALLOW", @@ -257,7 +258,7 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public get modeNames(): string[] { return QuixosCapabilityLexer.modeNames; } public static readonly _serializedATN: number[] = [ - 4,0,145,1390,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, + 4,0,146,1397,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, @@ -280,492 +281,496 @@ export class QuixosCapabilityLexer extends antlr.Lexer { 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,1,0, - 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3, - 1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4, - 1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6, - 1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,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,9,1,9,1,9,1,10,1,10,1,10,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, - 12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1, - 13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,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,16,1,16,1,16,1, - 16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1, - 17,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,18,1,18,1,19,1,19,1, - 19,1,19,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,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, - 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,25,1,25,1,25,1,25,1,25,1,25,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,27,1,27,1,27,1,27,1,27,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,30,1,30,1, - 30,1,30,1,30,1,30,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,31,1,32,1,32,1,32,1,32,1,33,1,33,1,33,1,33,1, - 33,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,35,1, - 35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,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,37,1,37,1,37,1,38,1,38,1,38,1, - 38,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, - 39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,1,40,1,41,1,41,1,41,1,41,1, - 41,1,41,1,41,1,41,1,41,1,42,1,42,1,42,1,42,1,42,1,42,1,42,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,44,1,44,1, - 44,1,44,1,44,1,44,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,45,1,45,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,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,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,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,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,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,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1, - 61,1,61,1,61,1,62,1,62,1,62,1,62,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,64,1,65,1,65,1,65,1,65,1,65,1,65,1, - 65,1,65,1,66,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,67,1,67,1,67,1,67,1,67,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,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,71,1,72,1,72,1,72,1,72,1, - 72,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,74,1,74,1,74,1,74,1, - 74,1,74,1,74,1,74,1,74,1,74,1,75,1,75,1,75,1,76,1,76,1,76,1,76,1, - 77,1,77,1,77,1,77,1,77,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,79,1,79,1,80,1,80,1,80,1,80,1,80,1,80,1, - 80,1,80,1,80,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,1,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, - 85,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,89,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,91,1,91,1,91,1,91,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,93,1,93,1,93,1, - 93,1,93,1,93,1,93,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,94,1,94,1,95,1,95,1,95,1,95,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,96,1,96,1,96,1, - 96,1,96,1,96,1,97,1,97,1,97,1,97,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,99,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,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,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,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, - 1,105,1,105,1,105,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106, - 1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,108,1,108, - 1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108, - 1,108,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,110, - 1,110,1,110,1,110,1,110,1,111,1,111,1,111,1,111,1,111,1,111,1,111, - 1,112,1,112,1,112,1,112,1,112,1,113,1,113,1,113,1,113,1,113,1,113, - 1,114,1,114,1,114,1,114,1,114,1,114,1,114,1,115,1,115,1,115,1,115, - 1,115,1,115,1,116,1,116,1,116,1,116,1,116,1,116,1,117,1,117,1,117, - 1,117,1,117,1,117,1,117,1,118,1,118,1,118,1,118,1,118,1,118,1,118, - 1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,120,1,120,1,120,1,120, - 1,120,1,121,1,121,1,121,1,121,1,121,1,121,1,122,1,122,1,122,1,122, - 1,122,1,123,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, - 3,138,1291,8,138,1,138,4,138,1294,8,138,11,138,12,138,1295,1,139, - 3,139,1299,8,139,1,139,1,139,1,139,5,139,1304,8,139,10,139,12,139, - 1307,9,139,3,139,1309,8,139,1,139,1,139,4,139,1313,8,139,11,139, - 12,139,1314,3,139,1317,8,139,1,139,1,139,3,139,1321,8,139,1,139, - 4,139,1324,8,139,11,139,12,139,1325,3,139,1328,8,139,1,140,1,140, - 5,140,1332,8,140,10,140,12,140,1335,9,140,1,141,1,141,1,141,5,141, - 1340,8,141,10,141,12,141,1343,9,141,1,141,1,141,1,142,1,142,1,142, - 1,142,1,142,1,142,1,142,1,142,3,142,1355,8,142,1,143,1,143,1,144, - 1,144,1,144,1,144,5,144,1363,8,144,10,144,12,144,1366,9,144,1,144, - 1,144,1,145,1,145,1,145,1,145,5,145,1374,8,145,10,145,12,145,1377, - 9,145,1,145,1,145,1,145,1,145,1,145,1,146,4,146,1385,8,146,11,146, - 12,146,1386,1,146,1,146,1,1375,0,147,1,1,3,2,5,3,7,4,9,5,11,6,13, - 7,15,8,17,9,19,10,21,11,23,12,25,13,27,14,29,15,31,16,33,17,35,18, - 37,19,39,20,41,21,43,22,45,23,47,24,49,25,51,26,53,27,55,28,57,29, - 59,30,61,31,63,32,65,33,67,34,69,35,71,36,73,37,75,38,77,39,79,40, - 81,41,83,42,85,43,87,44,89,45,91,46,93,47,95,48,97,49,99,50,101, - 51,103,52,105,53,107,54,109,55,111,56,113,57,115,58,117,59,119,60, - 121,61,123,62,125,63,127,64,129,65,131,66,133,67,135,68,137,69,139, - 70,141,71,143,72,145,73,147,74,149,75,151,76,153,77,155,78,157,79, - 159,80,161,81,163,82,165,83,167,84,169,85,171,86,173,87,175,88,177, - 89,179,90,181,91,183,92,185,93,187,94,189,95,191,96,193,97,195,98, - 197,99,199,100,201,101,203,102,205,103,207,104,209,105,211,106,213, - 107,215,108,217,109,219,110,221,111,223,112,225,113,227,114,229, - 115,231,116,233,117,235,118,237,119,239,120,241,121,243,122,245, - 123,247,124,249,125,251,126,253,127,255,128,257,129,259,130,261, - 131,263,132,265,133,267,134,269,135,271,136,273,137,275,138,277, - 139,279,140,281,141,283,142,285,0,287,0,289,143,291,144,293,145, - 1,0,11,1,0,48,57,1,0,49,57,2,0,69,69,101,101,2,0,43,43,45,45,3,0, - 65,90,95,95,97,122,4,0,48,57,65,90,95,95,97,122,4,0,10,10,13,13, - 34,34,92,92,8,0,34,34,47,47,92,92,98,98,102,102,110,110,114,114, - 116,116,3,0,48,57,65,70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32, - 32,1404,0,1,1,0,0,0,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, - 229,1,0,0,0,0,231,1,0,0,0,0,233,1,0,0,0,0,235,1,0,0,0,0,237,1,0, - 0,0,0,239,1,0,0,0,0,241,1,0,0,0,0,243,1,0,0,0,0,245,1,0,0,0,0,247, - 1,0,0,0,0,249,1,0,0,0,0,251,1,0,0,0,0,253,1,0,0,0,0,255,1,0,0,0, - 0,257,1,0,0,0,0,259,1,0,0,0,0,261,1,0,0,0,0,263,1,0,0,0,0,265,1, - 0,0,0,0,267,1,0,0,0,0,269,1,0,0,0,0,271,1,0,0,0,0,273,1,0,0,0,0, - 275,1,0,0,0,0,277,1,0,0,0,0,279,1,0,0,0,0,281,1,0,0,0,0,283,1,0, - 0,0,0,289,1,0,0,0,0,291,1,0,0,0,0,293,1,0,0,0,1,295,1,0,0,0,3,304, - 1,0,0,0,5,315,1,0,0,0,7,325,1,0,0,0,9,335,1,0,0,0,11,344,1,0,0,0, - 13,356,1,0,0,0,15,363,1,0,0,0,17,371,1,0,0,0,19,380,1,0,0,0,21,388, - 1,0,0,0,23,394,1,0,0,0,25,399,1,0,0,0,27,412,1,0,0,0,29,422,1,0, - 0,0,31,434,1,0,0,0,33,440,1,0,0,0,35,451,1,0,0,0,37,462,1,0,0,0, - 39,467,1,0,0,0,41,476,1,0,0,0,43,486,1,0,0,0,45,491,1,0,0,0,47,495, - 1,0,0,0,49,501,1,0,0,0,51,506,1,0,0,0,53,516,1,0,0,0,55,520,1,0, - 0,0,57,533,1,0,0,0,59,538,1,0,0,0,61,545,1,0,0,0,63,554,1,0,0,0, - 65,565,1,0,0,0,67,569,1,0,0,0,69,578,1,0,0,0,71,585,1,0,0,0,73,594, - 1,0,0,0,75,599,1,0,0,0,77,609,1,0,0,0,79,620,1,0,0,0,81,628,1,0, - 0,0,83,634,1,0,0,0,85,643,1,0,0,0,87,653,1,0,0,0,89,662,1,0,0,0, - 91,674,1,0,0,0,93,685,1,0,0,0,95,691,1,0,0,0,97,699,1,0,0,0,99,702, - 1,0,0,0,101,707,1,0,0,0,103,714,1,0,0,0,105,717,1,0,0,0,107,725, - 1,0,0,0,109,732,1,0,0,0,111,738,1,0,0,0,113,743,1,0,0,0,115,754, - 1,0,0,0,117,759,1,0,0,0,119,765,1,0,0,0,121,769,1,0,0,0,123,781, - 1,0,0,0,125,784,1,0,0,0,127,791,1,0,0,0,129,794,1,0,0,0,131,801, - 1,0,0,0,133,809,1,0,0,0,135,816,1,0,0,0,137,827,1,0,0,0,139,834, - 1,0,0,0,141,843,1,0,0,0,143,858,1,0,0,0,145,868,1,0,0,0,147,881, - 1,0,0,0,149,887,1,0,0,0,151,904,1,0,0,0,153,907,1,0,0,0,155,911, - 1,0,0,0,157,916,1,0,0,0,159,922,1,0,0,0,161,931,1,0,0,0,163,940, - 1,0,0,0,165,944,1,0,0,0,167,948,1,0,0,0,169,952,1,0,0,0,171,958, - 1,0,0,0,173,964,1,0,0,0,175,969,1,0,0,0,177,974,1,0,0,0,179,980, - 1,0,0,0,181,988,1,0,0,0,183,996,1,0,0,0,185,1007,1,0,0,0,187,1012, - 1,0,0,0,189,1024,1,0,0,0,191,1035,1,0,0,0,193,1045,1,0,0,0,195,1057, - 1,0,0,0,197,1066,1,0,0,0,199,1071,1,0,0,0,201,1084,1,0,0,0,203,1096, - 1,0,0,0,205,1108,1,0,0,0,207,1113,1,0,0,0,209,1121,1,0,0,0,211,1126, - 1,0,0,0,213,1139,1,0,0,0,215,1147,1,0,0,0,217,1156,1,0,0,0,219,1170, - 1,0,0,0,221,1179,1,0,0,0,223,1184,1,0,0,0,225,1191,1,0,0,0,227,1196, - 1,0,0,0,229,1202,1,0,0,0,231,1209,1,0,0,0,233,1215,1,0,0,0,235,1221, - 1,0,0,0,237,1228,1,0,0,0,239,1235,1,0,0,0,241,1242,1,0,0,0,243,1247, - 1,0,0,0,245,1253,1,0,0,0,247,1258,1,0,0,0,249,1261,1,0,0,0,251,1263, - 1,0,0,0,253,1265,1,0,0,0,255,1267,1,0,0,0,257,1269,1,0,0,0,259,1271, - 1,0,0,0,261,1273,1,0,0,0,263,1275,1,0,0,0,265,1277,1,0,0,0,267,1279, - 1,0,0,0,269,1281,1,0,0,0,271,1283,1,0,0,0,273,1285,1,0,0,0,275,1287, - 1,0,0,0,277,1290,1,0,0,0,279,1298,1,0,0,0,281,1329,1,0,0,0,283,1336, - 1,0,0,0,285,1346,1,0,0,0,287,1356,1,0,0,0,289,1358,1,0,0,0,291,1369, - 1,0,0,0,293,1384,1,0,0,0,295,296,5,99,0,0,296,297,5,114,0,0,297, - 298,5,101,0,0,298,299,5,97,0,0,299,300,5,116,0,0,300,301,5,105,0, - 0,301,302,5,111,0,0,302,303,5,110,0,0,303,2,1,0,0,0,304,305,5,105, - 0,0,305,306,5,110,0,0,306,307,5,105,0,0,307,308,5,116,0,0,308,309, - 5,105,0,0,309,310,5,97,0,0,310,311,5,108,0,0,311,312,5,105,0,0,312, - 313,5,122,0,0,313,314,5,101,0,0,314,4,1,0,0,0,315,316,5,119,0,0, - 316,317,5,111,0,0,317,318,5,114,0,0,318,319,5,107,0,0,319,320,5, - 115,0,0,320,321,5,112,0,0,321,322,5,97,0,0,322,323,5,99,0,0,323, - 324,5,101,0,0,324,6,1,0,0,0,325,326,5,101,0,0,326,327,5,120,0,0, - 327,328,5,101,0,0,328,329,5,99,0,0,329,330,5,117,0,0,330,331,5,116, - 0,0,331,332,5,105,0,0,332,333,5,111,0,0,333,334,5,110,0,0,334,8, - 1,0,0,0,335,336,5,115,0,0,336,337,5,110,0,0,337,338,5,97,0,0,338, - 339,5,112,0,0,339,340,5,115,0,0,340,341,5,104,0,0,341,342,5,111, - 0,0,342,343,5,116,0,0,343,10,1,0,0,0,344,345,5,116,0,0,345,346,5, - 114,0,0,346,347,5,97,0,0,347,348,5,110,0,0,348,349,5,115,0,0,349, - 350,5,97,0,0,350,351,5,99,0,0,351,352,5,116,0,0,352,353,5,105,0, - 0,353,354,5,111,0,0,354,355,5,110,0,0,355,12,1,0,0,0,356,357,5,114, - 0,0,357,358,5,101,0,0,358,359,5,109,0,0,359,360,5,111,0,0,360,361, - 5,116,0,0,361,362,5,101,0,0,362,14,1,0,0,0,363,364,5,116,0,0,364, - 365,5,97,0,0,365,366,5,114,0,0,366,367,5,103,0,0,367,368,5,101,0, - 0,368,369,5,116,0,0,369,370,5,115,0,0,370,16,1,0,0,0,371,372,5,112, - 0,0,372,373,5,111,0,0,373,374,5,114,0,0,374,375,5,116,0,0,375,376, - 5,97,0,0,376,377,5,98,0,0,377,378,5,108,0,0,378,379,5,101,0,0,379, - 18,1,0,0,0,380,381,5,114,0,0,381,382,5,101,0,0,382,383,5,112,0,0, - 383,384,5,108,0,0,384,385,5,105,0,0,385,386,5,99,0,0,386,387,5,97, - 0,0,387,20,1,0,0,0,388,389,5,108,0,0,389,390,5,111,0,0,390,391,5, - 99,0,0,391,392,5,97,0,0,392,393,5,108,0,0,393,22,1,0,0,0,394,395, - 5,102,0,0,395,396,5,114,0,0,396,397,5,111,0,0,397,398,5,109,0,0, - 398,24,1,0,0,0,399,400,5,114,0,0,400,401,5,101,0,0,401,402,5,115, - 0,0,402,403,5,117,0,0,403,404,5,108,0,0,404,405,5,116,0,0,405,406, - 5,45,0,0,406,407,5,98,0,0,407,408,5,121,0,0,408,409,5,116,0,0,409, - 410,5,101,0,0,410,411,5,115,0,0,411,26,1,0,0,0,412,413,5,114,0,0, - 413,414,5,112,0,0,414,415,5,99,0,0,415,416,5,45,0,0,416,417,5,99, - 0,0,417,418,5,97,0,0,418,419,5,108,0,0,419,420,5,108,0,0,420,421, - 5,115,0,0,421,28,1,0,0,0,422,423,5,100,0,0,423,424,5,101,0,0,424, - 425,5,97,0,0,425,426,5,100,0,0,426,427,5,108,0,0,427,428,5,105,0, - 0,428,429,5,110,0,0,429,430,5,101,0,0,430,431,5,45,0,0,431,432,5, - 109,0,0,432,433,5,115,0,0,433,30,1,0,0,0,434,435,5,113,0,0,435,436, - 5,117,0,0,436,437,5,101,0,0,437,438,5,114,0,0,438,439,5,121,0,0, - 439,32,1,0,0,0,440,441,5,114,0,0,441,442,5,101,0,0,442,443,5,102, - 0,0,443,444,5,108,0,0,444,445,5,101,0,0,445,446,5,99,0,0,446,447, - 5,116,0,0,447,448,5,105,0,0,448,449,5,111,0,0,449,450,5,110,0,0, - 450,34,1,0,0,0,451,452,5,115,0,0,452,453,5,112,0,0,453,454,5,101, - 0,0,454,455,5,99,0,0,455,456,5,105,0,0,456,457,5,97,0,0,457,458, - 5,108,0,0,458,459,5,105,0,0,459,460,5,122,0,0,460,461,5,101,0,0, - 461,36,1,0,0,0,462,463,5,114,0,0,463,464,5,111,0,0,464,465,5,111, - 0,0,465,466,5,116,0,0,466,38,1,0,0,0,467,468,5,100,0,0,468,469,5, - 111,0,0,469,470,5,99,0,0,470,471,5,117,0,0,471,472,5,109,0,0,472, - 473,5,101,0,0,473,474,5,110,0,0,474,475,5,116,0,0,475,40,1,0,0,0, - 476,477,5,102,0,0,477,478,5,114,0,0,478,479,5,97,0,0,479,480,5,103, - 0,0,480,481,5,109,0,0,481,482,5,101,0,0,482,483,5,110,0,0,483,484, - 5,116,0,0,484,485,5,115,0,0,485,42,1,0,0,0,486,487,5,118,0,0,487, - 488,5,105,0,0,488,489,5,101,0,0,489,490,5,119,0,0,490,44,1,0,0,0, - 491,492,5,109,0,0,492,493,5,97,0,0,493,494,5,120,0,0,494,46,1,0, - 0,0,495,496,5,97,0,0,496,497,5,108,0,0,497,498,5,108,0,0,498,499, - 5,111,0,0,499,500,5,119,0,0,500,48,1,0,0,0,501,502,5,112,0,0,502, - 503,5,111,0,0,503,504,5,108,0,0,504,505,5,108,0,0,505,50,1,0,0,0, - 506,507,5,113,0,0,507,508,5,117,0,0,508,509,5,101,0,0,509,510,5, - 114,0,0,510,511,5,121,0,0,511,512,5,97,0,0,512,513,5,98,0,0,513, - 514,5,108,0,0,514,515,5,101,0,0,515,52,1,0,0,0,516,517,5,114,0,0, - 517,518,5,112,0,0,518,519,5,99,0,0,519,54,1,0,0,0,520,521,5,113, - 0,0,521,522,5,117,0,0,522,523,5,101,0,0,523,524,5,114,0,0,524,525, - 5,121,0,0,525,526,5,45,0,0,526,527,5,114,0,0,527,528,5,101,0,0,528, - 529,5,97,0,0,529,530,5,115,0,0,530,531,5,111,0,0,531,532,5,110,0, - 0,532,56,1,0,0,0,533,534,5,116,0,0,534,535,5,121,0,0,535,536,5,112, - 0,0,536,537,5,101,0,0,537,58,1,0,0,0,538,539,5,111,0,0,539,540,5, - 98,0,0,540,541,5,106,0,0,541,542,5,101,0,0,542,543,5,99,0,0,543, - 544,5,116,0,0,544,60,1,0,0,0,545,546,5,115,0,0,546,547,5,116,0,0, - 547,548,5,111,0,0,548,549,5,114,0,0,549,550,5,97,0,0,550,551,5,98, - 0,0,551,552,5,108,0,0,552,553,5,101,0,0,553,62,1,0,0,0,554,555,5, - 105,0,0,555,556,5,109,0,0,556,557,5,112,0,0,557,558,5,108,0,0,558, - 559,5,101,0,0,559,560,5,109,0,0,560,561,5,101,0,0,561,562,5,110, - 0,0,562,563,5,116,0,0,563,564,5,115,0,0,564,64,1,0,0,0,565,566,5, - 114,0,0,566,567,5,101,0,0,567,568,5,102,0,0,568,66,1,0,0,0,569,570, - 5,102,0,0,570,571,5,114,0,0,571,572,5,97,0,0,572,573,5,103,0,0,573, - 574,5,109,0,0,574,575,5,101,0,0,575,576,5,110,0,0,576,577,5,116, - 0,0,577,68,1,0,0,0,578,579,5,105,0,0,579,580,5,109,0,0,580,581,5, - 112,0,0,581,582,5,111,0,0,582,583,5,114,0,0,583,584,5,116,0,0,584, - 70,1,0,0,0,585,586,5,101,0,0,586,587,5,120,0,0,587,588,5,116,0,0, - 588,589,5,101,0,0,589,590,5,114,0,0,590,591,5,110,0,0,591,592,5, - 97,0,0,592,593,5,108,0,0,593,72,1,0,0,0,594,595,5,97,0,0,595,596, - 5,116,0,0,596,597,5,111,0,0,597,598,5,109,0,0,598,74,1,0,0,0,599, - 600,5,105,0,0,600,601,5,110,0,0,601,602,5,116,0,0,602,603,5,101, - 0,0,603,604,5,114,0,0,604,605,5,102,0,0,605,606,5,97,0,0,606,607, - 5,99,0,0,607,608,5,101,0,0,608,76,1,0,0,0,609,610,5,105,0,0,610, - 611,5,110,0,0,611,612,5,116,0,0,612,613,5,101,0,0,613,614,5,114, - 0,0,614,615,5,102,0,0,615,616,5,97,0,0,616,617,5,99,0,0,617,618, - 5,101,0,0,618,619,5,115,0,0,619,78,1,0,0,0,620,621,5,112,0,0,621, - 622,5,97,0,0,622,623,5,99,0,0,623,624,5,107,0,0,624,625,5,97,0,0, - 625,626,5,103,0,0,626,627,5,101,0,0,627,80,1,0,0,0,628,629,5,118, - 0,0,629,630,5,97,0,0,630,631,5,108,0,0,631,632,5,117,0,0,632,633, - 5,101,0,0,633,82,1,0,0,0,634,635,5,114,0,0,635,636,5,101,0,0,636, - 637,5,108,0,0,637,638,5,97,0,0,638,639,5,116,0,0,639,640,5,105,0, - 0,640,641,5,111,0,0,641,642,5,110,0,0,642,84,1,0,0,0,643,644,5,111, - 0,0,644,645,5,112,0,0,645,646,5,101,0,0,646,647,5,114,0,0,647,648, - 5,97,0,0,648,649,5,116,0,0,649,650,5,105,0,0,650,651,5,111,0,0,651, - 652,5,110,0,0,652,86,1,0,0,0,653,654,5,102,0,0,654,655,5,117,0,0, - 655,656,5,110,0,0,656,657,5,99,0,0,657,658,5,116,0,0,658,659,5,105, - 0,0,659,660,5,111,0,0,660,661,5,110,0,0,661,88,1,0,0,0,662,663,5, - 99,0,0,663,664,5,111,0,0,664,665,5,110,0,0,665,666,5,115,0,0,666, - 667,5,116,0,0,667,668,5,114,0,0,668,669,5,117,0,0,669,670,5,99,0, - 0,670,671,5,116,0,0,671,672,5,111,0,0,672,673,5,114,0,0,673,90,1, - 0,0,0,674,675,5,99,0,0,675,676,5,111,0,0,676,677,5,110,0,0,677,678, - 5,115,0,0,678,679,5,116,0,0,679,680,5,114,0,0,680,681,5,117,0,0, - 681,682,5,99,0,0,682,683,5,116,0,0,683,684,5,115,0,0,684,92,1,0, - 0,0,685,686,5,105,0,0,686,687,5,110,0,0,687,688,5,112,0,0,688,689, - 5,117,0,0,689,690,5,116,0,0,690,94,1,0,0,0,691,692,5,99,0,0,692, - 693,5,111,0,0,693,694,5,110,0,0,694,695,5,102,0,0,695,696,5,111, - 0,0,696,697,5,114,0,0,697,698,5,109,0,0,698,96,1,0,0,0,699,700,5, - 97,0,0,700,701,5,115,0,0,701,98,1,0,0,0,702,703,5,98,0,0,703,704, - 5,105,0,0,704,705,5,110,0,0,705,706,5,100,0,0,706,100,1,0,0,0,707, - 708,5,115,0,0,708,709,5,116,0,0,709,710,5,97,0,0,710,711,5,116,0, - 0,711,712,5,105,0,0,712,713,5,99,0,0,713,102,1,0,0,0,714,715,5,116, - 0,0,715,716,5,111,0,0,716,104,1,0,0,0,717,718,5,112,0,0,718,719, - 5,114,0,0,719,720,5,105,0,0,720,721,5,118,0,0,721,722,5,97,0,0,722, - 723,5,116,0,0,723,724,5,101,0,0,724,106,1,0,0,0,725,726,5,115,0, - 0,726,727,5,104,0,0,727,728,5,97,0,0,728,729,5,114,0,0,729,730,5, - 101,0,0,730,731,5,100,0,0,731,108,1,0,0,0,732,733,5,115,0,0,733, - 734,5,116,0,0,734,735,5,97,0,0,735,736,5,116,0,0,736,737,5,101,0, - 0,737,110,1,0,0,0,738,739,5,101,0,0,739,740,5,100,0,0,740,741,5, - 103,0,0,741,742,5,101,0,0,742,112,1,0,0,0,743,744,5,112,0,0,744, - 745,5,114,0,0,745,746,5,111,0,0,746,747,5,106,0,0,747,748,5,101, - 0,0,748,749,5,99,0,0,749,750,5,116,0,0,750,751,5,105,0,0,751,752, - 5,111,0,0,752,753,5,110,0,0,753,114,1,0,0,0,754,755,5,119,0,0,755, - 756,5,105,0,0,756,757,5,116,0,0,757,758,5,104,0,0,758,116,1,0,0, - 0,759,760,5,117,0,0,760,761,5,115,0,0,761,762,5,105,0,0,762,763, - 5,110,0,0,763,764,5,103,0,0,764,118,1,0,0,0,765,766,5,118,0,0,766, - 767,5,105,0,0,767,768,5,97,0,0,768,120,1,0,0,0,769,770,5,109,0,0, - 770,771,5,97,0,0,771,772,5,116,0,0,772,773,5,101,0,0,773,774,5,114, - 0,0,774,775,5,105,0,0,775,776,5,97,0,0,776,777,5,108,0,0,777,778, - 5,105,0,0,778,779,5,122,0,0,779,780,5,101,0,0,780,122,1,0,0,0,781, - 782,5,105,0,0,782,783,5,102,0,0,783,124,1,0,0,0,784,785,5,97,0,0, - 785,786,5,98,0,0,786,787,5,115,0,0,787,788,5,101,0,0,788,789,5,110, - 0,0,789,790,5,116,0,0,790,126,1,0,0,0,791,792,5,111,0,0,792,793, - 5,110,0,0,793,128,1,0,0,0,794,795,5,112,0,0,795,796,5,111,0,0,796, - 797,5,108,0,0,797,798,5,105,0,0,798,799,5,99,0,0,799,800,5,121,0, - 0,800,130,1,0,0,0,801,802,5,100,0,0,802,803,5,101,0,0,803,804,5, - 102,0,0,804,805,5,97,0,0,805,806,5,117,0,0,806,807,5,108,0,0,807, - 808,5,116,0,0,808,132,1,0,0,0,809,810,5,115,0,0,810,811,5,111,0, - 0,811,812,5,117,0,0,812,813,5,114,0,0,813,814,5,99,0,0,814,815,5, - 101,0,0,815,134,1,0,0,0,816,817,5,114,0,0,817,818,5,101,0,0,818, - 819,5,112,0,0,819,820,5,111,0,0,820,821,5,115,0,0,821,822,5,105, - 0,0,822,823,5,116,0,0,823,824,5,111,0,0,824,825,5,114,0,0,825,826, - 5,121,0,0,826,136,1,0,0,0,827,828,5,99,0,0,828,829,5,111,0,0,829, - 830,5,109,0,0,830,831,5,109,0,0,831,832,5,105,0,0,832,833,5,116, - 0,0,833,138,1,0,0,0,834,835,5,114,0,0,835,836,5,101,0,0,836,837, - 5,118,0,0,837,838,5,105,0,0,838,839,5,115,0,0,839,840,5,105,0,0, - 840,841,5,111,0,0,841,842,5,110,0,0,842,140,1,0,0,0,843,844,5,115, - 0,0,844,845,5,101,0,0,845,846,5,109,0,0,846,847,5,97,0,0,847,848, - 5,110,0,0,848,849,5,116,0,0,849,850,5,105,0,0,850,851,5,99,0,0,851, - 852,5,45,0,0,852,853,5,109,0,0,853,854,5,97,0,0,854,855,5,106,0, - 0,855,856,5,111,0,0,856,857,5,114,0,0,857,142,1,0,0,0,858,859,5, - 111,0,0,859,860,5,110,0,0,860,861,5,45,0,0,861,862,5,100,0,0,862, - 863,5,101,0,0,863,864,5,108,0,0,864,865,5,101,0,0,865,866,5,116, - 0,0,866,867,5,101,0,0,867,144,1,0,0,0,868,869,5,114,0,0,869,870, - 5,101,0,0,870,871,5,116,0,0,871,872,5,97,0,0,872,873,5,105,0,0,873, - 874,5,110,0,0,874,875,5,45,0,0,875,876,5,111,0,0,876,877,5,116,0, - 0,877,878,5,104,0,0,878,879,5,101,0,0,879,880,5,114,0,0,880,146, - 1,0,0,0,881,882,5,107,0,0,882,883,5,101,0,0,883,884,5,121,0,0,884, - 885,5,101,0,0,885,886,5,100,0,0,886,148,1,0,0,0,887,888,5,112,0, - 0,888,889,5,117,0,0,889,890,5,98,0,0,890,891,5,108,0,0,891,892,5, - 105,0,0,892,893,5,99,0,0,893,894,5,45,0,0,894,895,5,116,0,0,895, - 896,5,114,0,0,896,897,5,97,0,0,897,898,5,118,0,0,898,899,5,101,0, - 0,899,900,5,114,0,0,900,901,5,115,0,0,901,902,5,97,0,0,902,903,5, - 108,0,0,903,150,1,0,0,0,904,905,5,105,0,0,905,906,5,100,0,0,906, - 152,1,0,0,0,907,908,5,100,0,0,908,909,5,111,0,0,909,910,5,99,0,0, - 910,154,1,0,0,0,911,912,5,109,0,0,912,913,5,111,0,0,913,914,5,100, - 0,0,914,915,5,101,0,0,915,156,1,0,0,0,916,917,5,101,0,0,917,918, - 5,109,0,0,918,919,5,105,0,0,919,920,5,116,0,0,920,921,5,115,0,0, - 921,158,1,0,0,0,922,923,5,114,0,0,923,924,5,101,0,0,924,925,5,99, - 0,0,925,926,5,101,0,0,926,927,5,105,0,0,927,928,5,118,0,0,928,929, - 5,101,0,0,929,930,5,114,0,0,930,160,1,0,0,0,931,932,5,114,0,0,932, - 933,5,101,0,0,933,934,5,113,0,0,934,935,5,117,0,0,935,936,5,105, - 0,0,936,937,5,114,0,0,937,938,5,101,0,0,938,939,5,115,0,0,939,162, - 1,0,0,0,940,941,5,97,0,0,941,942,5,110,0,0,942,943,5,121,0,0,943, - 164,1,0,0,0,944,945,5,103,0,0,945,946,5,101,0,0,946,947,5,116,0, - 0,947,166,1,0,0,0,948,949,5,115,0,0,949,950,5,101,0,0,950,951,5, - 116,0,0,951,168,1,0,0,0,952,953,5,119,0,0,953,954,5,97,0,0,954,955, - 5,116,0,0,955,956,5,99,0,0,956,957,5,104,0,0,957,170,1,0,0,0,958, - 959,5,115,0,0,959,960,5,116,0,0,960,961,5,97,0,0,961,962,5,114,0, - 0,962,963,5,116,0,0,963,172,1,0,0,0,964,965,5,115,0,0,965,966,5, - 116,0,0,966,967,5,111,0,0,967,968,5,112,0,0,968,174,1,0,0,0,969, - 970,5,114,0,0,970,971,5,101,0,0,971,972,5,97,0,0,972,973,5,100,0, - 0,973,176,1,0,0,0,974,975,5,119,0,0,975,976,5,114,0,0,976,977,5, - 105,0,0,977,978,5,116,0,0,978,979,5,101,0,0,979,178,1,0,0,0,980, - 981,5,114,0,0,981,982,5,101,0,0,982,983,5,115,0,0,983,984,5,111, - 0,0,984,985,5,108,0,0,985,986,5,118,0,0,986,987,5,101,0,0,987,180, - 1,0,0,0,988,989,5,99,0,0,989,990,5,111,0,0,990,991,5,110,0,0,991, - 992,5,110,0,0,992,993,5,101,0,0,993,994,5,99,0,0,994,995,5,116,0, - 0,995,182,1,0,0,0,996,997,5,100,0,0,997,998,5,105,0,0,998,999,5, - 115,0,0,999,1000,5,99,0,0,1000,1001,5,111,0,0,1001,1002,5,110,0, - 0,1002,1003,5,110,0,0,1003,1004,5,101,0,0,1004,1005,5,99,0,0,1005, - 1006,5,116,0,0,1006,184,1,0,0,0,1007,1008,5,99,0,0,1008,1009,5,97, - 0,0,1009,1010,5,108,0,0,1010,1011,5,108,0,0,1011,186,1,0,0,0,1012, - 1013,5,119,0,0,1013,1014,5,97,0,0,1014,1015,5,116,0,0,1015,1016, - 5,99,0,0,1016,1017,5,104,0,0,1017,1018,5,45,0,0,1018,1019,5,115, - 0,0,1019,1020,5,116,0,0,1020,1021,5,97,0,0,1021,1022,5,114,0,0,1022, - 1023,5,116,0,0,1023,188,1,0,0,0,1024,1025,5,119,0,0,1025,1026,5, - 97,0,0,1026,1027,5,116,0,0,1027,1028,5,99,0,0,1028,1029,5,104,0, - 0,1029,1030,5,45,0,0,1030,1031,5,115,0,0,1031,1032,5,116,0,0,1032, - 1033,5,111,0,0,1033,1034,5,112,0,0,1034,190,1,0,0,0,1035,1036,5, - 115,0,0,1036,1037,5,117,0,0,1037,1038,5,98,0,0,1038,1039,5,115,0, - 0,1039,1040,5,99,0,0,1040,1041,5,114,0,0,1041,1042,5,105,0,0,1042, - 1043,5,98,0,0,1043,1044,5,101,0,0,1044,192,1,0,0,0,1045,1046,5,117, - 0,0,1046,1047,5,110,0,0,1047,1048,5,115,0,0,1048,1049,5,117,0,0, - 1049,1050,5,98,0,0,1050,1051,5,115,0,0,1051,1052,5,99,0,0,1052,1053, - 5,114,0,0,1053,1054,5,105,0,0,1054,1055,5,98,0,0,1055,1056,5,101, - 0,0,1056,194,1,0,0,0,1057,1058,5,114,0,0,1058,1059,5,101,0,0,1059, - 1060,5,103,0,0,1060,1061,5,105,0,0,1061,1062,5,115,0,0,1062,1063, - 5,116,0,0,1063,1064,5,101,0,0,1064,1065,5,114,0,0,1065,196,1,0,0, - 0,1066,1067,5,99,0,0,1067,1068,5,114,0,0,1068,1069,5,100,0,0,1069, - 1070,5,116,0,0,1070,198,1,0,0,0,1071,1072,5,111,0,0,1072,1073,5, - 112,0,0,1073,1074,5,116,0,0,1074,1075,5,105,0,0,1075,1076,5,111, - 0,0,1076,1077,5,110,0,0,1077,1078,5,97,0,0,1078,1079,5,108,0,0,1079, - 1080,5,45,0,0,1080,1081,5,111,0,0,1081,1082,5,110,0,0,1082,1083, - 5,101,0,0,1083,200,1,0,0,0,1084,1085,5,101,0,0,1085,1086,5,120,0, - 0,1086,1087,5,97,0,0,1087,1088,5,99,0,0,1088,1089,5,116,0,0,1089, - 1090,5,108,0,0,1090,1091,5,121,0,0,1091,1092,5,45,0,0,1092,1093, - 5,111,0,0,1093,1094,5,110,0,0,1094,1095,5,101,0,0,1095,202,1,0,0, - 0,1096,1097,5,109,0,0,1097,1098,5,97,0,0,1098,1099,5,110,0,0,1099, - 1100,5,121,0,0,1100,1101,5,45,0,0,1101,1102,5,117,0,0,1102,1103, - 5,110,0,0,1103,1104,5,105,0,0,1104,1105,5,113,0,0,1105,1106,5,117, - 0,0,1106,1107,5,101,0,0,1107,204,1,0,0,0,1108,1109,5,109,0,0,1109, - 1110,5,97,0,0,1110,1111,5,110,0,0,1111,1112,5,121,0,0,1112,206,1, - 0,0,0,1113,1114,5,111,0,0,1114,1115,5,114,0,0,1115,1116,5,100,0, - 0,1116,1117,5,101,0,0,1117,1118,5,114,0,0,1118,1119,5,101,0,0,1119, - 1120,5,100,0,0,1120,208,1,0,0,0,1121,1122,5,117,0,0,1122,1123,5, - 110,0,0,1123,1124,5,105,0,0,1124,1125,5,116,0,0,1125,210,1,0,0,0, - 1126,1127,5,119,0,0,1127,1128,5,97,0,0,1128,1129,5,116,0,0,1129, - 1130,5,99,0,0,1130,1131,5,104,0,0,1131,1132,5,45,0,0,1132,1133,5, - 104,0,0,1133,1134,5,97,0,0,1134,1135,5,110,0,0,1135,1136,5,100,0, - 0,1136,1137,5,108,0,0,1137,1138,5,101,0,0,1138,212,1,0,0,0,1139, - 1140,5,109,0,0,1140,1141,5,101,0,0,1141,1142,5,115,0,0,1142,1143, - 5,115,0,0,1143,1144,5,97,0,0,1144,1145,5,103,0,0,1145,1146,5,101, - 0,0,1146,214,1,0,0,0,1147,1148,5,97,0,0,1148,1149,5,116,0,0,1149, - 1150,5,111,0,0,1150,1151,5,109,0,0,1151,1152,5,45,0,0,1152,1153, - 5,114,0,0,1153,1154,5,101,0,0,1154,1155,5,102,0,0,1155,216,1,0,0, - 0,1156,1157,5,105,0,0,1157,1158,5,110,0,0,1158,1159,5,116,0,0,1159, - 1160,5,101,0,0,1160,1161,5,114,0,0,1161,1162,5,102,0,0,1162,1163, - 5,97,0,0,1163,1164,5,99,0,0,1164,1165,5,101,0,0,1165,1166,5,45,0, - 0,1166,1167,5,114,0,0,1167,1168,5,101,0,0,1168,1169,5,102,0,0,1169, - 218,1,0,0,0,1170,1171,5,111,0,0,1171,1172,5,112,0,0,1172,1173,5, - 116,0,0,1173,1174,5,105,0,0,1174,1175,5,111,0,0,1175,1176,5,110, - 0,0,1176,1177,5,97,0,0,1177,1178,5,108,0,0,1178,220,1,0,0,0,1179, - 1180,5,108,0,0,1180,1181,5,105,0,0,1181,1182,5,115,0,0,1182,1183, - 5,116,0,0,1183,222,1,0,0,0,1184,1185,5,114,0,0,1185,1186,5,101,0, - 0,1186,1187,5,99,0,0,1187,1188,5,111,0,0,1188,1189,5,114,0,0,1189, - 1190,5,100,0,0,1190,224,1,0,0,0,1191,1192,5,98,0,0,1192,1193,5,111, - 0,0,1193,1194,5,111,0,0,1194,1195,5,108,0,0,1195,226,1,0,0,0,1196, - 1197,5,98,0,0,1197,1198,5,121,0,0,1198,1199,5,116,0,0,1199,1200, - 5,101,0,0,1200,1201,5,115,0,0,1201,228,1,0,0,0,1202,1203,5,100,0, - 0,1203,1204,5,111,0,0,1204,1205,5,117,0,0,1205,1206,5,98,0,0,1206, - 1207,5,108,0,0,1207,1208,5,101,0,0,1208,230,1,0,0,0,1209,1210,5, - 105,0,0,1210,1211,5,110,0,0,1211,1212,5,116,0,0,1212,1213,5,51,0, - 0,1213,1214,5,50,0,0,1214,232,1,0,0,0,1215,1216,5,105,0,0,1216,1217, - 5,110,0,0,1217,1218,5,116,0,0,1218,1219,5,54,0,0,1219,1220,5,52, - 0,0,1220,234,1,0,0,0,1221,1222,5,115,0,0,1222,1223,5,116,0,0,1223, - 1224,5,114,0,0,1224,1225,5,105,0,0,1225,1226,5,110,0,0,1226,1227, - 5,103,0,0,1227,236,1,0,0,0,1228,1229,5,117,0,0,1229,1230,5,105,0, - 0,1230,1231,5,110,0,0,1231,1232,5,116,0,0,1232,1233,5,51,0,0,1233, - 1234,5,50,0,0,1234,238,1,0,0,0,1235,1236,5,117,0,0,1236,1237,5,105, - 0,0,1237,1238,5,110,0,0,1238,1239,5,116,0,0,1239,1240,5,54,0,0,1240, - 1241,5,52,0,0,1241,240,1,0,0,0,1242,1243,5,116,0,0,1243,1244,5,114, - 0,0,1244,1245,5,117,0,0,1245,1246,5,101,0,0,1246,242,1,0,0,0,1247, - 1248,5,102,0,0,1248,1249,5,97,0,0,1249,1250,5,108,0,0,1250,1251, - 5,115,0,0,1251,1252,5,101,0,0,1252,244,1,0,0,0,1253,1254,5,110,0, - 0,1254,1255,5,117,0,0,1255,1256,5,108,0,0,1256,1257,5,108,0,0,1257, - 246,1,0,0,0,1258,1259,5,45,0,0,1259,1260,5,62,0,0,1260,248,1,0,0, - 0,1261,1262,5,58,0,0,1262,250,1,0,0,0,1263,1264,5,59,0,0,1264,252, - 1,0,0,0,1265,1266,5,44,0,0,1266,254,1,0,0,0,1267,1268,5,46,0,0,1268, - 256,1,0,0,0,1269,1270,5,123,0,0,1270,258,1,0,0,0,1271,1272,5,125, - 0,0,1272,260,1,0,0,0,1273,1274,5,91,0,0,1274,262,1,0,0,0,1275,1276, - 5,93,0,0,1276,264,1,0,0,0,1277,1278,5,40,0,0,1278,266,1,0,0,0,1279, - 1280,5,41,0,0,1280,268,1,0,0,0,1281,1282,5,60,0,0,1282,270,1,0,0, - 0,1283,1284,5,62,0,0,1284,272,1,0,0,0,1285,1286,5,38,0,0,1286,274, - 1,0,0,0,1287,1288,5,61,0,0,1288,276,1,0,0,0,1289,1291,5,45,0,0,1290, - 1289,1,0,0,0,1290,1291,1,0,0,0,1291,1293,1,0,0,0,1292,1294,7,0,0, - 0,1293,1292,1,0,0,0,1294,1295,1,0,0,0,1295,1293,1,0,0,0,1295,1296, - 1,0,0,0,1296,278,1,0,0,0,1297,1299,5,45,0,0,1298,1297,1,0,0,0,1298, - 1299,1,0,0,0,1299,1308,1,0,0,0,1300,1309,5,48,0,0,1301,1305,7,1, - 0,0,1302,1304,7,0,0,0,1303,1302,1,0,0,0,1304,1307,1,0,0,0,1305,1303, - 1,0,0,0,1305,1306,1,0,0,0,1306,1309,1,0,0,0,1307,1305,1,0,0,0,1308, - 1300,1,0,0,0,1308,1301,1,0,0,0,1309,1316,1,0,0,0,1310,1312,5,46, - 0,0,1311,1313,7,0,0,0,1312,1311,1,0,0,0,1313,1314,1,0,0,0,1314,1312, - 1,0,0,0,1314,1315,1,0,0,0,1315,1317,1,0,0,0,1316,1310,1,0,0,0,1316, - 1317,1,0,0,0,1317,1327,1,0,0,0,1318,1320,7,2,0,0,1319,1321,7,3,0, - 0,1320,1319,1,0,0,0,1320,1321,1,0,0,0,1321,1323,1,0,0,0,1322,1324, - 7,0,0,0,1323,1322,1,0,0,0,1324,1325,1,0,0,0,1325,1323,1,0,0,0,1325, - 1326,1,0,0,0,1326,1328,1,0,0,0,1327,1318,1,0,0,0,1327,1328,1,0,0, - 0,1328,280,1,0,0,0,1329,1333,7,4,0,0,1330,1332,7,5,0,0,1331,1330, - 1,0,0,0,1332,1335,1,0,0,0,1333,1331,1,0,0,0,1333,1334,1,0,0,0,1334, - 282,1,0,0,0,1335,1333,1,0,0,0,1336,1341,5,34,0,0,1337,1340,3,285, - 142,0,1338,1340,8,6,0,0,1339,1337,1,0,0,0,1339,1338,1,0,0,0,1340, - 1343,1,0,0,0,1341,1339,1,0,0,0,1341,1342,1,0,0,0,1342,1344,1,0,0, - 0,1343,1341,1,0,0,0,1344,1345,5,34,0,0,1345,284,1,0,0,0,1346,1354, - 5,92,0,0,1347,1355,7,7,0,0,1348,1349,5,117,0,0,1349,1350,3,287,143, - 0,1350,1351,3,287,143,0,1351,1352,3,287,143,0,1352,1353,3,287,143, - 0,1353,1355,1,0,0,0,1354,1347,1,0,0,0,1354,1348,1,0,0,0,1355,286, - 1,0,0,0,1356,1357,7,8,0,0,1357,288,1,0,0,0,1358,1359,5,47,0,0,1359, - 1360,5,47,0,0,1360,1364,1,0,0,0,1361,1363,8,9,0,0,1362,1361,1,0, - 0,0,1363,1366,1,0,0,0,1364,1362,1,0,0,0,1364,1365,1,0,0,0,1365,1367, - 1,0,0,0,1366,1364,1,0,0,0,1367,1368,6,144,0,0,1368,290,1,0,0,0,1369, - 1370,5,47,0,0,1370,1371,5,42,0,0,1371,1375,1,0,0,0,1372,1374,9,0, - 0,0,1373,1372,1,0,0,0,1374,1377,1,0,0,0,1375,1376,1,0,0,0,1375,1373, - 1,0,0,0,1376,1378,1,0,0,0,1377,1375,1,0,0,0,1378,1379,5,42,0,0,1379, - 1380,5,47,0,0,1380,1381,1,0,0,0,1381,1382,6,145,0,0,1382,292,1,0, - 0,0,1383,1385,7,10,0,0,1384,1383,1,0,0,0,1385,1386,1,0,0,0,1386, - 1384,1,0,0,0,1386,1387,1,0,0,0,1387,1388,1,0,0,0,1388,1389,6,146, - 0,0,1389,294,1,0,0,0,18,0,1290,1295,1298,1305,1308,1314,1316,1320, - 1325,1327,1333,1339,1341,1354,1364,1375,1386,1,0,1,0 + 2,142,7,142,2,143,7,143,2,144,7,144,2,145,7,145,2,146,7,146,2,147, + 7,147,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1, + 3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1, + 5,1,5,1,5,1,5,1,5,1,5,1,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,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1, + 8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10, + 1,10,1,10,1,10,1,10,1,11,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,13,1,13,1,13,1,13,1,13, + 1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,15, + 1,15,1,15,1,15,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,17,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,18,1,18,1,18, + 1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20, + 1,20,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,22,1,22, + 1,22,1,22,1,22,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24,1,24, + 1,25,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,26,1,26,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,28,1,28,1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,29,1,30,1,30, + 1,30,1,30,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,32,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,34,1,34,1,34,1,34,1,35, + 1,35,1,35,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,36,1,36,1,36,1,36, + 1,36,1,36,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,38,1,38,1,38,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39, + 1,39,1,39,1,40,1,40,1,40,1,40,1,40,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,42,1,42,1,42,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,44,1,44,1,44,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,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,46,1,47,1,47,1,47,1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,48, + 1,48,1,48,1,48,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1,50,1,51,1,51, + 1,51,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,1,53,1,53,1,54,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,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,57,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,59,1,59, + 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,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,63,1,63,1,63,1,63,1,64,1,64,1,64,1,65,1,65,1,65,1,65,1,65,1,65, + 1,65,1,66,1,66,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,67,1,68,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,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,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,72,1,72,1,73,1,73,1,73,1,73,1,73,1,73,1,73,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,75,1,75,1,75,1,75, + 1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75, + 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,80,1,80,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,81,1,81,1,82,1,82,1,82, + 1,82,1,83,1,83,1,83,1,83,1,84,1,84,1,84,1,84,1,85,1,85,1,85,1,85, + 1,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,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,91,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,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,94,1,94,1,94,1,95,1,95,1,95,1,95,1,95,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,96,1,96,1,96,1,96,1,97,1,97, + 1,97,1,97,1,97,1,97,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,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,100,1,100,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,101,1,101,1,101,1,101, + 1,101,1,102,1,102,1,102,1,102,1,102,1,102,1,102,1,102,1,102,1,102, + 1,102,1,102,1,103,1,103,1,103,1,103,1,103,1,104,1,104,1,104,1,104, + 1,104,1,104,1,104,1,104,1,105,1,105,1,105,1,105,1,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,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,108,1,108,1,108, + 1,108,1,108,1,108,1,108,1,108,1,108,1,109,1,109,1,109,1,109,1,109, + 1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,110,1,110, + 1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,111,1,111,1,111,1,111, + 1,111,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,113,1,113,1,113, + 1,113,1,113,1,114,1,114,1,114,1,114,1,114,1,114,1,115,1,115,1,115, + 1,115,1,115,1,115,1,115,1,116,1,116,1,116,1,116,1,116,1,116,1,117, + 1,117,1,117,1,117,1,117,1,117,1,118,1,118,1,118,1,118,1,118,1,118, + 1,118,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,120,1,120,1,120, + 1,120,1,120,1,120,1,120,1,121,1,121,1,121,1,121,1,121,1,122,1,122, + 1,122,1,122,1,122,1,122,1,123,1,123,1,123,1,123,1,123,1,124,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,3,139,1298,8,139, + 1,139,4,139,1301,8,139,11,139,12,139,1302,1,140,3,140,1306,8,140, + 1,140,1,140,1,140,5,140,1311,8,140,10,140,12,140,1314,9,140,3,140, + 1316,8,140,1,140,1,140,4,140,1320,8,140,11,140,12,140,1321,3,140, + 1324,8,140,1,140,1,140,3,140,1328,8,140,1,140,4,140,1331,8,140,11, + 140,12,140,1332,3,140,1335,8,140,1,141,1,141,5,141,1339,8,141,10, + 141,12,141,1342,9,141,1,142,1,142,1,142,5,142,1347,8,142,10,142, + 12,142,1350,9,142,1,142,1,142,1,143,1,143,1,143,1,143,1,143,1,143, + 1,143,1,143,3,143,1362,8,143,1,144,1,144,1,145,1,145,1,145,1,145, + 5,145,1370,8,145,10,145,12,145,1373,9,145,1,145,1,145,1,146,1,146, + 1,146,1,146,5,146,1381,8,146,10,146,12,146,1384,9,146,1,146,1,146, + 1,146,1,146,1,146,1,147,4,147,1392,8,147,11,147,12,147,1393,1,147, + 1,147,1,1382,0,148,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10, + 21,11,23,12,25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21, + 43,22,45,23,47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32, + 65,33,67,34,69,35,71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43, + 87,44,89,45,91,46,93,47,95,48,97,49,99,50,101,51,103,52,105,53,107, + 54,109,55,111,56,113,57,115,58,117,59,119,60,121,61,123,62,125,63, + 127,64,129,65,131,66,133,67,135,68,137,69,139,70,141,71,143,72,145, + 73,147,74,149,75,151,76,153,77,155,78,157,79,159,80,161,81,163,82, + 165,83,167,84,169,85,171,86,173,87,175,88,177,89,179,90,181,91,183, + 92,185,93,187,94,189,95,191,96,193,97,195,98,197,99,199,100,201, + 101,203,102,205,103,207,104,209,105,211,106,213,107,215,108,217, + 109,219,110,221,111,223,112,225,113,227,114,229,115,231,116,233, + 117,235,118,237,119,239,120,241,121,243,122,245,123,247,124,249, + 125,251,126,253,127,255,128,257,129,259,130,261,131,263,132,265, + 133,267,134,269,135,271,136,273,137,275,138,277,139,279,140,281, + 141,283,142,285,143,287,0,289,0,291,144,293,145,295,146,1,0,11,1, + 0,48,57,1,0,49,57,2,0,69,69,101,101,2,0,43,43,45,45,3,0,65,90,95, + 95,97,122,4,0,48,57,65,90,95,95,97,122,4,0,10,10,13,13,34,34,92, + 92,8,0,34,34,47,47,92,92,98,98,102,102,110,110,114,114,116,116,3, + 0,48,57,65,70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32,32,1411,0, + 1,1,0,0,0,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,229,1,0, + 0,0,0,231,1,0,0,0,0,233,1,0,0,0,0,235,1,0,0,0,0,237,1,0,0,0,0,239, + 1,0,0,0,0,241,1,0,0,0,0,243,1,0,0,0,0,245,1,0,0,0,0,247,1,0,0,0, + 0,249,1,0,0,0,0,251,1,0,0,0,0,253,1,0,0,0,0,255,1,0,0,0,0,257,1, + 0,0,0,0,259,1,0,0,0,0,261,1,0,0,0,0,263,1,0,0,0,0,265,1,0,0,0,0, + 267,1,0,0,0,0,269,1,0,0,0,0,271,1,0,0,0,0,273,1,0,0,0,0,275,1,0, + 0,0,0,277,1,0,0,0,0,279,1,0,0,0,0,281,1,0,0,0,0,283,1,0,0,0,0,285, + 1,0,0,0,0,291,1,0,0,0,0,293,1,0,0,0,0,295,1,0,0,0,1,297,1,0,0,0, + 3,302,1,0,0,0,5,311,1,0,0,0,7,322,1,0,0,0,9,332,1,0,0,0,11,342,1, + 0,0,0,13,351,1,0,0,0,15,363,1,0,0,0,17,370,1,0,0,0,19,378,1,0,0, + 0,21,387,1,0,0,0,23,395,1,0,0,0,25,401,1,0,0,0,27,406,1,0,0,0,29, + 419,1,0,0,0,31,429,1,0,0,0,33,441,1,0,0,0,35,447,1,0,0,0,37,458, + 1,0,0,0,39,469,1,0,0,0,41,474,1,0,0,0,43,483,1,0,0,0,45,493,1,0, + 0,0,47,498,1,0,0,0,49,502,1,0,0,0,51,508,1,0,0,0,53,513,1,0,0,0, + 55,523,1,0,0,0,57,527,1,0,0,0,59,540,1,0,0,0,61,545,1,0,0,0,63,552, + 1,0,0,0,65,561,1,0,0,0,67,572,1,0,0,0,69,576,1,0,0,0,71,585,1,0, + 0,0,73,592,1,0,0,0,75,601,1,0,0,0,77,606,1,0,0,0,79,616,1,0,0,0, + 81,627,1,0,0,0,83,635,1,0,0,0,85,641,1,0,0,0,87,650,1,0,0,0,89,660, + 1,0,0,0,91,669,1,0,0,0,93,681,1,0,0,0,95,692,1,0,0,0,97,698,1,0, + 0,0,99,706,1,0,0,0,101,709,1,0,0,0,103,714,1,0,0,0,105,721,1,0,0, + 0,107,724,1,0,0,0,109,732,1,0,0,0,111,739,1,0,0,0,113,745,1,0,0, + 0,115,750,1,0,0,0,117,761,1,0,0,0,119,766,1,0,0,0,121,772,1,0,0, + 0,123,776,1,0,0,0,125,788,1,0,0,0,127,791,1,0,0,0,129,798,1,0,0, + 0,131,801,1,0,0,0,133,808,1,0,0,0,135,816,1,0,0,0,137,823,1,0,0, + 0,139,834,1,0,0,0,141,841,1,0,0,0,143,850,1,0,0,0,145,865,1,0,0, + 0,147,875,1,0,0,0,149,888,1,0,0,0,151,894,1,0,0,0,153,911,1,0,0, + 0,155,914,1,0,0,0,157,918,1,0,0,0,159,923,1,0,0,0,161,929,1,0,0, + 0,163,938,1,0,0,0,165,947,1,0,0,0,167,951,1,0,0,0,169,955,1,0,0, + 0,171,959,1,0,0,0,173,965,1,0,0,0,175,971,1,0,0,0,177,976,1,0,0, + 0,179,981,1,0,0,0,181,987,1,0,0,0,183,995,1,0,0,0,185,1003,1,0,0, + 0,187,1014,1,0,0,0,189,1019,1,0,0,0,191,1031,1,0,0,0,193,1042,1, + 0,0,0,195,1052,1,0,0,0,197,1064,1,0,0,0,199,1073,1,0,0,0,201,1078, + 1,0,0,0,203,1091,1,0,0,0,205,1103,1,0,0,0,207,1115,1,0,0,0,209,1120, + 1,0,0,0,211,1128,1,0,0,0,213,1133,1,0,0,0,215,1146,1,0,0,0,217,1154, + 1,0,0,0,219,1163,1,0,0,0,221,1177,1,0,0,0,223,1186,1,0,0,0,225,1191, + 1,0,0,0,227,1198,1,0,0,0,229,1203,1,0,0,0,231,1209,1,0,0,0,233,1216, + 1,0,0,0,235,1222,1,0,0,0,237,1228,1,0,0,0,239,1235,1,0,0,0,241,1242, + 1,0,0,0,243,1249,1,0,0,0,245,1254,1,0,0,0,247,1260,1,0,0,0,249,1265, + 1,0,0,0,251,1268,1,0,0,0,253,1270,1,0,0,0,255,1272,1,0,0,0,257,1274, + 1,0,0,0,259,1276,1,0,0,0,261,1278,1,0,0,0,263,1280,1,0,0,0,265,1282, + 1,0,0,0,267,1284,1,0,0,0,269,1286,1,0,0,0,271,1288,1,0,0,0,273,1290, + 1,0,0,0,275,1292,1,0,0,0,277,1294,1,0,0,0,279,1297,1,0,0,0,281,1305, + 1,0,0,0,283,1336,1,0,0,0,285,1343,1,0,0,0,287,1353,1,0,0,0,289,1363, + 1,0,0,0,291,1365,1,0,0,0,293,1376,1,0,0,0,295,1391,1,0,0,0,297,298, + 5,101,0,0,298,299,5,100,0,0,299,300,5,105,0,0,300,301,5,116,0,0, + 301,2,1,0,0,0,302,303,5,99,0,0,303,304,5,114,0,0,304,305,5,101,0, + 0,305,306,5,97,0,0,306,307,5,116,0,0,307,308,5,105,0,0,308,309,5, + 111,0,0,309,310,5,110,0,0,310,4,1,0,0,0,311,312,5,105,0,0,312,313, + 5,110,0,0,313,314,5,105,0,0,314,315,5,116,0,0,315,316,5,105,0,0, + 316,317,5,97,0,0,317,318,5,108,0,0,318,319,5,105,0,0,319,320,5,122, + 0,0,320,321,5,101,0,0,321,6,1,0,0,0,322,323,5,119,0,0,323,324,5, + 111,0,0,324,325,5,114,0,0,325,326,5,107,0,0,326,327,5,115,0,0,327, + 328,5,112,0,0,328,329,5,97,0,0,329,330,5,99,0,0,330,331,5,101,0, + 0,331,8,1,0,0,0,332,333,5,101,0,0,333,334,5,120,0,0,334,335,5,101, + 0,0,335,336,5,99,0,0,336,337,5,117,0,0,337,338,5,116,0,0,338,339, + 5,105,0,0,339,340,5,111,0,0,340,341,5,110,0,0,341,10,1,0,0,0,342, + 343,5,115,0,0,343,344,5,110,0,0,344,345,5,97,0,0,345,346,5,112,0, + 0,346,347,5,115,0,0,347,348,5,104,0,0,348,349,5,111,0,0,349,350, + 5,116,0,0,350,12,1,0,0,0,351,352,5,116,0,0,352,353,5,114,0,0,353, + 354,5,97,0,0,354,355,5,110,0,0,355,356,5,115,0,0,356,357,5,97,0, + 0,357,358,5,99,0,0,358,359,5,116,0,0,359,360,5,105,0,0,360,361,5, + 111,0,0,361,362,5,110,0,0,362,14,1,0,0,0,363,364,5,114,0,0,364,365, + 5,101,0,0,365,366,5,109,0,0,366,367,5,111,0,0,367,368,5,116,0,0, + 368,369,5,101,0,0,369,16,1,0,0,0,370,371,5,116,0,0,371,372,5,97, + 0,0,372,373,5,114,0,0,373,374,5,103,0,0,374,375,5,101,0,0,375,376, + 5,116,0,0,376,377,5,115,0,0,377,18,1,0,0,0,378,379,5,112,0,0,379, + 380,5,111,0,0,380,381,5,114,0,0,381,382,5,116,0,0,382,383,5,97,0, + 0,383,384,5,98,0,0,384,385,5,108,0,0,385,386,5,101,0,0,386,20,1, + 0,0,0,387,388,5,114,0,0,388,389,5,101,0,0,389,390,5,112,0,0,390, + 391,5,108,0,0,391,392,5,105,0,0,392,393,5,99,0,0,393,394,5,97,0, + 0,394,22,1,0,0,0,395,396,5,108,0,0,396,397,5,111,0,0,397,398,5,99, + 0,0,398,399,5,97,0,0,399,400,5,108,0,0,400,24,1,0,0,0,401,402,5, + 102,0,0,402,403,5,114,0,0,403,404,5,111,0,0,404,405,5,109,0,0,405, + 26,1,0,0,0,406,407,5,114,0,0,407,408,5,101,0,0,408,409,5,115,0,0, + 409,410,5,117,0,0,410,411,5,108,0,0,411,412,5,116,0,0,412,413,5, + 45,0,0,413,414,5,98,0,0,414,415,5,121,0,0,415,416,5,116,0,0,416, + 417,5,101,0,0,417,418,5,115,0,0,418,28,1,0,0,0,419,420,5,114,0,0, + 420,421,5,112,0,0,421,422,5,99,0,0,422,423,5,45,0,0,423,424,5,99, + 0,0,424,425,5,97,0,0,425,426,5,108,0,0,426,427,5,108,0,0,427,428, + 5,115,0,0,428,30,1,0,0,0,429,430,5,100,0,0,430,431,5,101,0,0,431, + 432,5,97,0,0,432,433,5,100,0,0,433,434,5,108,0,0,434,435,5,105,0, + 0,435,436,5,110,0,0,436,437,5,101,0,0,437,438,5,45,0,0,438,439,5, + 109,0,0,439,440,5,115,0,0,440,32,1,0,0,0,441,442,5,113,0,0,442,443, + 5,117,0,0,443,444,5,101,0,0,444,445,5,114,0,0,445,446,5,121,0,0, + 446,34,1,0,0,0,447,448,5,114,0,0,448,449,5,101,0,0,449,450,5,102, + 0,0,450,451,5,108,0,0,451,452,5,101,0,0,452,453,5,99,0,0,453,454, + 5,116,0,0,454,455,5,105,0,0,455,456,5,111,0,0,456,457,5,110,0,0, + 457,36,1,0,0,0,458,459,5,115,0,0,459,460,5,112,0,0,460,461,5,101, + 0,0,461,462,5,99,0,0,462,463,5,105,0,0,463,464,5,97,0,0,464,465, + 5,108,0,0,465,466,5,105,0,0,466,467,5,122,0,0,467,468,5,101,0,0, + 468,38,1,0,0,0,469,470,5,114,0,0,470,471,5,111,0,0,471,472,5,111, + 0,0,472,473,5,116,0,0,473,40,1,0,0,0,474,475,5,100,0,0,475,476,5, + 111,0,0,476,477,5,99,0,0,477,478,5,117,0,0,478,479,5,109,0,0,479, + 480,5,101,0,0,480,481,5,110,0,0,481,482,5,116,0,0,482,42,1,0,0,0, + 483,484,5,102,0,0,484,485,5,114,0,0,485,486,5,97,0,0,486,487,5,103, + 0,0,487,488,5,109,0,0,488,489,5,101,0,0,489,490,5,110,0,0,490,491, + 5,116,0,0,491,492,5,115,0,0,492,44,1,0,0,0,493,494,5,118,0,0,494, + 495,5,105,0,0,495,496,5,101,0,0,496,497,5,119,0,0,497,46,1,0,0,0, + 498,499,5,109,0,0,499,500,5,97,0,0,500,501,5,120,0,0,501,48,1,0, + 0,0,502,503,5,97,0,0,503,504,5,108,0,0,504,505,5,108,0,0,505,506, + 5,111,0,0,506,507,5,119,0,0,507,50,1,0,0,0,508,509,5,112,0,0,509, + 510,5,111,0,0,510,511,5,108,0,0,511,512,5,108,0,0,512,52,1,0,0,0, + 513,514,5,113,0,0,514,515,5,117,0,0,515,516,5,101,0,0,516,517,5, + 114,0,0,517,518,5,121,0,0,518,519,5,97,0,0,519,520,5,98,0,0,520, + 521,5,108,0,0,521,522,5,101,0,0,522,54,1,0,0,0,523,524,5,114,0,0, + 524,525,5,112,0,0,525,526,5,99,0,0,526,56,1,0,0,0,527,528,5,113, + 0,0,528,529,5,117,0,0,529,530,5,101,0,0,530,531,5,114,0,0,531,532, + 5,121,0,0,532,533,5,45,0,0,533,534,5,114,0,0,534,535,5,101,0,0,535, + 536,5,97,0,0,536,537,5,115,0,0,537,538,5,111,0,0,538,539,5,110,0, + 0,539,58,1,0,0,0,540,541,5,116,0,0,541,542,5,121,0,0,542,543,5,112, + 0,0,543,544,5,101,0,0,544,60,1,0,0,0,545,546,5,111,0,0,546,547,5, + 98,0,0,547,548,5,106,0,0,548,549,5,101,0,0,549,550,5,99,0,0,550, + 551,5,116,0,0,551,62,1,0,0,0,552,553,5,115,0,0,553,554,5,116,0,0, + 554,555,5,111,0,0,555,556,5,114,0,0,556,557,5,97,0,0,557,558,5,98, + 0,0,558,559,5,108,0,0,559,560,5,101,0,0,560,64,1,0,0,0,561,562,5, + 105,0,0,562,563,5,109,0,0,563,564,5,112,0,0,564,565,5,108,0,0,565, + 566,5,101,0,0,566,567,5,109,0,0,567,568,5,101,0,0,568,569,5,110, + 0,0,569,570,5,116,0,0,570,571,5,115,0,0,571,66,1,0,0,0,572,573,5, + 114,0,0,573,574,5,101,0,0,574,575,5,102,0,0,575,68,1,0,0,0,576,577, + 5,102,0,0,577,578,5,114,0,0,578,579,5,97,0,0,579,580,5,103,0,0,580, + 581,5,109,0,0,581,582,5,101,0,0,582,583,5,110,0,0,583,584,5,116, + 0,0,584,70,1,0,0,0,585,586,5,105,0,0,586,587,5,109,0,0,587,588,5, + 112,0,0,588,589,5,111,0,0,589,590,5,114,0,0,590,591,5,116,0,0,591, + 72,1,0,0,0,592,593,5,101,0,0,593,594,5,120,0,0,594,595,5,116,0,0, + 595,596,5,101,0,0,596,597,5,114,0,0,597,598,5,110,0,0,598,599,5, + 97,0,0,599,600,5,108,0,0,600,74,1,0,0,0,601,602,5,97,0,0,602,603, + 5,116,0,0,603,604,5,111,0,0,604,605,5,109,0,0,605,76,1,0,0,0,606, + 607,5,105,0,0,607,608,5,110,0,0,608,609,5,116,0,0,609,610,5,101, + 0,0,610,611,5,114,0,0,611,612,5,102,0,0,612,613,5,97,0,0,613,614, + 5,99,0,0,614,615,5,101,0,0,615,78,1,0,0,0,616,617,5,105,0,0,617, + 618,5,110,0,0,618,619,5,116,0,0,619,620,5,101,0,0,620,621,5,114, + 0,0,621,622,5,102,0,0,622,623,5,97,0,0,623,624,5,99,0,0,624,625, + 5,101,0,0,625,626,5,115,0,0,626,80,1,0,0,0,627,628,5,112,0,0,628, + 629,5,97,0,0,629,630,5,99,0,0,630,631,5,107,0,0,631,632,5,97,0,0, + 632,633,5,103,0,0,633,634,5,101,0,0,634,82,1,0,0,0,635,636,5,118, + 0,0,636,637,5,97,0,0,637,638,5,108,0,0,638,639,5,117,0,0,639,640, + 5,101,0,0,640,84,1,0,0,0,641,642,5,114,0,0,642,643,5,101,0,0,643, + 644,5,108,0,0,644,645,5,97,0,0,645,646,5,116,0,0,646,647,5,105,0, + 0,647,648,5,111,0,0,648,649,5,110,0,0,649,86,1,0,0,0,650,651,5,111, + 0,0,651,652,5,112,0,0,652,653,5,101,0,0,653,654,5,114,0,0,654,655, + 5,97,0,0,655,656,5,116,0,0,656,657,5,105,0,0,657,658,5,111,0,0,658, + 659,5,110,0,0,659,88,1,0,0,0,660,661,5,102,0,0,661,662,5,117,0,0, + 662,663,5,110,0,0,663,664,5,99,0,0,664,665,5,116,0,0,665,666,5,105, + 0,0,666,667,5,111,0,0,667,668,5,110,0,0,668,90,1,0,0,0,669,670,5, + 99,0,0,670,671,5,111,0,0,671,672,5,110,0,0,672,673,5,115,0,0,673, + 674,5,116,0,0,674,675,5,114,0,0,675,676,5,117,0,0,676,677,5,99,0, + 0,677,678,5,116,0,0,678,679,5,111,0,0,679,680,5,114,0,0,680,92,1, + 0,0,0,681,682,5,99,0,0,682,683,5,111,0,0,683,684,5,110,0,0,684,685, + 5,115,0,0,685,686,5,116,0,0,686,687,5,114,0,0,687,688,5,117,0,0, + 688,689,5,99,0,0,689,690,5,116,0,0,690,691,5,115,0,0,691,94,1,0, + 0,0,692,693,5,105,0,0,693,694,5,110,0,0,694,695,5,112,0,0,695,696, + 5,117,0,0,696,697,5,116,0,0,697,96,1,0,0,0,698,699,5,99,0,0,699, + 700,5,111,0,0,700,701,5,110,0,0,701,702,5,102,0,0,702,703,5,111, + 0,0,703,704,5,114,0,0,704,705,5,109,0,0,705,98,1,0,0,0,706,707,5, + 97,0,0,707,708,5,115,0,0,708,100,1,0,0,0,709,710,5,98,0,0,710,711, + 5,105,0,0,711,712,5,110,0,0,712,713,5,100,0,0,713,102,1,0,0,0,714, + 715,5,115,0,0,715,716,5,116,0,0,716,717,5,97,0,0,717,718,5,116,0, + 0,718,719,5,105,0,0,719,720,5,99,0,0,720,104,1,0,0,0,721,722,5,116, + 0,0,722,723,5,111,0,0,723,106,1,0,0,0,724,725,5,112,0,0,725,726, + 5,114,0,0,726,727,5,105,0,0,727,728,5,118,0,0,728,729,5,97,0,0,729, + 730,5,116,0,0,730,731,5,101,0,0,731,108,1,0,0,0,732,733,5,115,0, + 0,733,734,5,104,0,0,734,735,5,97,0,0,735,736,5,114,0,0,736,737,5, + 101,0,0,737,738,5,100,0,0,738,110,1,0,0,0,739,740,5,115,0,0,740, + 741,5,116,0,0,741,742,5,97,0,0,742,743,5,116,0,0,743,744,5,101,0, + 0,744,112,1,0,0,0,745,746,5,101,0,0,746,747,5,100,0,0,747,748,5, + 103,0,0,748,749,5,101,0,0,749,114,1,0,0,0,750,751,5,112,0,0,751, + 752,5,114,0,0,752,753,5,111,0,0,753,754,5,106,0,0,754,755,5,101, + 0,0,755,756,5,99,0,0,756,757,5,116,0,0,757,758,5,105,0,0,758,759, + 5,111,0,0,759,760,5,110,0,0,760,116,1,0,0,0,761,762,5,119,0,0,762, + 763,5,105,0,0,763,764,5,116,0,0,764,765,5,104,0,0,765,118,1,0,0, + 0,766,767,5,117,0,0,767,768,5,115,0,0,768,769,5,105,0,0,769,770, + 5,110,0,0,770,771,5,103,0,0,771,120,1,0,0,0,772,773,5,118,0,0,773, + 774,5,105,0,0,774,775,5,97,0,0,775,122,1,0,0,0,776,777,5,109,0,0, + 777,778,5,97,0,0,778,779,5,116,0,0,779,780,5,101,0,0,780,781,5,114, + 0,0,781,782,5,105,0,0,782,783,5,97,0,0,783,784,5,108,0,0,784,785, + 5,105,0,0,785,786,5,122,0,0,786,787,5,101,0,0,787,124,1,0,0,0,788, + 789,5,105,0,0,789,790,5,102,0,0,790,126,1,0,0,0,791,792,5,97,0,0, + 792,793,5,98,0,0,793,794,5,115,0,0,794,795,5,101,0,0,795,796,5,110, + 0,0,796,797,5,116,0,0,797,128,1,0,0,0,798,799,5,111,0,0,799,800, + 5,110,0,0,800,130,1,0,0,0,801,802,5,112,0,0,802,803,5,111,0,0,803, + 804,5,108,0,0,804,805,5,105,0,0,805,806,5,99,0,0,806,807,5,121,0, + 0,807,132,1,0,0,0,808,809,5,100,0,0,809,810,5,101,0,0,810,811,5, + 102,0,0,811,812,5,97,0,0,812,813,5,117,0,0,813,814,5,108,0,0,814, + 815,5,116,0,0,815,134,1,0,0,0,816,817,5,115,0,0,817,818,5,111,0, + 0,818,819,5,117,0,0,819,820,5,114,0,0,820,821,5,99,0,0,821,822,5, + 101,0,0,822,136,1,0,0,0,823,824,5,114,0,0,824,825,5,101,0,0,825, + 826,5,112,0,0,826,827,5,111,0,0,827,828,5,115,0,0,828,829,5,105, + 0,0,829,830,5,116,0,0,830,831,5,111,0,0,831,832,5,114,0,0,832,833, + 5,121,0,0,833,138,1,0,0,0,834,835,5,99,0,0,835,836,5,111,0,0,836, + 837,5,109,0,0,837,838,5,109,0,0,838,839,5,105,0,0,839,840,5,116, + 0,0,840,140,1,0,0,0,841,842,5,114,0,0,842,843,5,101,0,0,843,844, + 5,118,0,0,844,845,5,105,0,0,845,846,5,115,0,0,846,847,5,105,0,0, + 847,848,5,111,0,0,848,849,5,110,0,0,849,142,1,0,0,0,850,851,5,115, + 0,0,851,852,5,101,0,0,852,853,5,109,0,0,853,854,5,97,0,0,854,855, + 5,110,0,0,855,856,5,116,0,0,856,857,5,105,0,0,857,858,5,99,0,0,858, + 859,5,45,0,0,859,860,5,109,0,0,860,861,5,97,0,0,861,862,5,106,0, + 0,862,863,5,111,0,0,863,864,5,114,0,0,864,144,1,0,0,0,865,866,5, + 111,0,0,866,867,5,110,0,0,867,868,5,45,0,0,868,869,5,100,0,0,869, + 870,5,101,0,0,870,871,5,108,0,0,871,872,5,101,0,0,872,873,5,116, + 0,0,873,874,5,101,0,0,874,146,1,0,0,0,875,876,5,114,0,0,876,877, + 5,101,0,0,877,878,5,116,0,0,878,879,5,97,0,0,879,880,5,105,0,0,880, + 881,5,110,0,0,881,882,5,45,0,0,882,883,5,111,0,0,883,884,5,116,0, + 0,884,885,5,104,0,0,885,886,5,101,0,0,886,887,5,114,0,0,887,148, + 1,0,0,0,888,889,5,107,0,0,889,890,5,101,0,0,890,891,5,121,0,0,891, + 892,5,101,0,0,892,893,5,100,0,0,893,150,1,0,0,0,894,895,5,112,0, + 0,895,896,5,117,0,0,896,897,5,98,0,0,897,898,5,108,0,0,898,899,5, + 105,0,0,899,900,5,99,0,0,900,901,5,45,0,0,901,902,5,116,0,0,902, + 903,5,114,0,0,903,904,5,97,0,0,904,905,5,118,0,0,905,906,5,101,0, + 0,906,907,5,114,0,0,907,908,5,115,0,0,908,909,5,97,0,0,909,910,5, + 108,0,0,910,152,1,0,0,0,911,912,5,105,0,0,912,913,5,100,0,0,913, + 154,1,0,0,0,914,915,5,100,0,0,915,916,5,111,0,0,916,917,5,99,0,0, + 917,156,1,0,0,0,918,919,5,109,0,0,919,920,5,111,0,0,920,921,5,100, + 0,0,921,922,5,101,0,0,922,158,1,0,0,0,923,924,5,101,0,0,924,925, + 5,109,0,0,925,926,5,105,0,0,926,927,5,116,0,0,927,928,5,115,0,0, + 928,160,1,0,0,0,929,930,5,114,0,0,930,931,5,101,0,0,931,932,5,99, + 0,0,932,933,5,101,0,0,933,934,5,105,0,0,934,935,5,118,0,0,935,936, + 5,101,0,0,936,937,5,114,0,0,937,162,1,0,0,0,938,939,5,114,0,0,939, + 940,5,101,0,0,940,941,5,113,0,0,941,942,5,117,0,0,942,943,5,105, + 0,0,943,944,5,114,0,0,944,945,5,101,0,0,945,946,5,115,0,0,946,164, + 1,0,0,0,947,948,5,97,0,0,948,949,5,110,0,0,949,950,5,121,0,0,950, + 166,1,0,0,0,951,952,5,103,0,0,952,953,5,101,0,0,953,954,5,116,0, + 0,954,168,1,0,0,0,955,956,5,115,0,0,956,957,5,101,0,0,957,958,5, + 116,0,0,958,170,1,0,0,0,959,960,5,119,0,0,960,961,5,97,0,0,961,962, + 5,116,0,0,962,963,5,99,0,0,963,964,5,104,0,0,964,172,1,0,0,0,965, + 966,5,115,0,0,966,967,5,116,0,0,967,968,5,97,0,0,968,969,5,114,0, + 0,969,970,5,116,0,0,970,174,1,0,0,0,971,972,5,115,0,0,972,973,5, + 116,0,0,973,974,5,111,0,0,974,975,5,112,0,0,975,176,1,0,0,0,976, + 977,5,114,0,0,977,978,5,101,0,0,978,979,5,97,0,0,979,980,5,100,0, + 0,980,178,1,0,0,0,981,982,5,119,0,0,982,983,5,114,0,0,983,984,5, + 105,0,0,984,985,5,116,0,0,985,986,5,101,0,0,986,180,1,0,0,0,987, + 988,5,114,0,0,988,989,5,101,0,0,989,990,5,115,0,0,990,991,5,111, + 0,0,991,992,5,108,0,0,992,993,5,118,0,0,993,994,5,101,0,0,994,182, + 1,0,0,0,995,996,5,99,0,0,996,997,5,111,0,0,997,998,5,110,0,0,998, + 999,5,110,0,0,999,1000,5,101,0,0,1000,1001,5,99,0,0,1001,1002,5, + 116,0,0,1002,184,1,0,0,0,1003,1004,5,100,0,0,1004,1005,5,105,0,0, + 1005,1006,5,115,0,0,1006,1007,5,99,0,0,1007,1008,5,111,0,0,1008, + 1009,5,110,0,0,1009,1010,5,110,0,0,1010,1011,5,101,0,0,1011,1012, + 5,99,0,0,1012,1013,5,116,0,0,1013,186,1,0,0,0,1014,1015,5,99,0,0, + 1015,1016,5,97,0,0,1016,1017,5,108,0,0,1017,1018,5,108,0,0,1018, + 188,1,0,0,0,1019,1020,5,119,0,0,1020,1021,5,97,0,0,1021,1022,5,116, + 0,0,1022,1023,5,99,0,0,1023,1024,5,104,0,0,1024,1025,5,45,0,0,1025, + 1026,5,115,0,0,1026,1027,5,116,0,0,1027,1028,5,97,0,0,1028,1029, + 5,114,0,0,1029,1030,5,116,0,0,1030,190,1,0,0,0,1031,1032,5,119,0, + 0,1032,1033,5,97,0,0,1033,1034,5,116,0,0,1034,1035,5,99,0,0,1035, + 1036,5,104,0,0,1036,1037,5,45,0,0,1037,1038,5,115,0,0,1038,1039, + 5,116,0,0,1039,1040,5,111,0,0,1040,1041,5,112,0,0,1041,192,1,0,0, + 0,1042,1043,5,115,0,0,1043,1044,5,117,0,0,1044,1045,5,98,0,0,1045, + 1046,5,115,0,0,1046,1047,5,99,0,0,1047,1048,5,114,0,0,1048,1049, + 5,105,0,0,1049,1050,5,98,0,0,1050,1051,5,101,0,0,1051,194,1,0,0, + 0,1052,1053,5,117,0,0,1053,1054,5,110,0,0,1054,1055,5,115,0,0,1055, + 1056,5,117,0,0,1056,1057,5,98,0,0,1057,1058,5,115,0,0,1058,1059, + 5,99,0,0,1059,1060,5,114,0,0,1060,1061,5,105,0,0,1061,1062,5,98, + 0,0,1062,1063,5,101,0,0,1063,196,1,0,0,0,1064,1065,5,114,0,0,1065, + 1066,5,101,0,0,1066,1067,5,103,0,0,1067,1068,5,105,0,0,1068,1069, + 5,115,0,0,1069,1070,5,116,0,0,1070,1071,5,101,0,0,1071,1072,5,114, + 0,0,1072,198,1,0,0,0,1073,1074,5,99,0,0,1074,1075,5,114,0,0,1075, + 1076,5,100,0,0,1076,1077,5,116,0,0,1077,200,1,0,0,0,1078,1079,5, + 111,0,0,1079,1080,5,112,0,0,1080,1081,5,116,0,0,1081,1082,5,105, + 0,0,1082,1083,5,111,0,0,1083,1084,5,110,0,0,1084,1085,5,97,0,0,1085, + 1086,5,108,0,0,1086,1087,5,45,0,0,1087,1088,5,111,0,0,1088,1089, + 5,110,0,0,1089,1090,5,101,0,0,1090,202,1,0,0,0,1091,1092,5,101,0, + 0,1092,1093,5,120,0,0,1093,1094,5,97,0,0,1094,1095,5,99,0,0,1095, + 1096,5,116,0,0,1096,1097,5,108,0,0,1097,1098,5,121,0,0,1098,1099, + 5,45,0,0,1099,1100,5,111,0,0,1100,1101,5,110,0,0,1101,1102,5,101, + 0,0,1102,204,1,0,0,0,1103,1104,5,109,0,0,1104,1105,5,97,0,0,1105, + 1106,5,110,0,0,1106,1107,5,121,0,0,1107,1108,5,45,0,0,1108,1109, + 5,117,0,0,1109,1110,5,110,0,0,1110,1111,5,105,0,0,1111,1112,5,113, + 0,0,1112,1113,5,117,0,0,1113,1114,5,101,0,0,1114,206,1,0,0,0,1115, + 1116,5,109,0,0,1116,1117,5,97,0,0,1117,1118,5,110,0,0,1118,1119, + 5,121,0,0,1119,208,1,0,0,0,1120,1121,5,111,0,0,1121,1122,5,114,0, + 0,1122,1123,5,100,0,0,1123,1124,5,101,0,0,1124,1125,5,114,0,0,1125, + 1126,5,101,0,0,1126,1127,5,100,0,0,1127,210,1,0,0,0,1128,1129,5, + 117,0,0,1129,1130,5,110,0,0,1130,1131,5,105,0,0,1131,1132,5,116, + 0,0,1132,212,1,0,0,0,1133,1134,5,119,0,0,1134,1135,5,97,0,0,1135, + 1136,5,116,0,0,1136,1137,5,99,0,0,1137,1138,5,104,0,0,1138,1139, + 5,45,0,0,1139,1140,5,104,0,0,1140,1141,5,97,0,0,1141,1142,5,110, + 0,0,1142,1143,5,100,0,0,1143,1144,5,108,0,0,1144,1145,5,101,0,0, + 1145,214,1,0,0,0,1146,1147,5,109,0,0,1147,1148,5,101,0,0,1148,1149, + 5,115,0,0,1149,1150,5,115,0,0,1150,1151,5,97,0,0,1151,1152,5,103, + 0,0,1152,1153,5,101,0,0,1153,216,1,0,0,0,1154,1155,5,97,0,0,1155, + 1156,5,116,0,0,1156,1157,5,111,0,0,1157,1158,5,109,0,0,1158,1159, + 5,45,0,0,1159,1160,5,114,0,0,1160,1161,5,101,0,0,1161,1162,5,102, + 0,0,1162,218,1,0,0,0,1163,1164,5,105,0,0,1164,1165,5,110,0,0,1165, + 1166,5,116,0,0,1166,1167,5,101,0,0,1167,1168,5,114,0,0,1168,1169, + 5,102,0,0,1169,1170,5,97,0,0,1170,1171,5,99,0,0,1171,1172,5,101, + 0,0,1172,1173,5,45,0,0,1173,1174,5,114,0,0,1174,1175,5,101,0,0,1175, + 1176,5,102,0,0,1176,220,1,0,0,0,1177,1178,5,111,0,0,1178,1179,5, + 112,0,0,1179,1180,5,116,0,0,1180,1181,5,105,0,0,1181,1182,5,111, + 0,0,1182,1183,5,110,0,0,1183,1184,5,97,0,0,1184,1185,5,108,0,0,1185, + 222,1,0,0,0,1186,1187,5,108,0,0,1187,1188,5,105,0,0,1188,1189,5, + 115,0,0,1189,1190,5,116,0,0,1190,224,1,0,0,0,1191,1192,5,114,0,0, + 1192,1193,5,101,0,0,1193,1194,5,99,0,0,1194,1195,5,111,0,0,1195, + 1196,5,114,0,0,1196,1197,5,100,0,0,1197,226,1,0,0,0,1198,1199,5, + 98,0,0,1199,1200,5,111,0,0,1200,1201,5,111,0,0,1201,1202,5,108,0, + 0,1202,228,1,0,0,0,1203,1204,5,98,0,0,1204,1205,5,121,0,0,1205,1206, + 5,116,0,0,1206,1207,5,101,0,0,1207,1208,5,115,0,0,1208,230,1,0,0, + 0,1209,1210,5,100,0,0,1210,1211,5,111,0,0,1211,1212,5,117,0,0,1212, + 1213,5,98,0,0,1213,1214,5,108,0,0,1214,1215,5,101,0,0,1215,232,1, + 0,0,0,1216,1217,5,105,0,0,1217,1218,5,110,0,0,1218,1219,5,116,0, + 0,1219,1220,5,51,0,0,1220,1221,5,50,0,0,1221,234,1,0,0,0,1222,1223, + 5,105,0,0,1223,1224,5,110,0,0,1224,1225,5,116,0,0,1225,1226,5,54, + 0,0,1226,1227,5,52,0,0,1227,236,1,0,0,0,1228,1229,5,115,0,0,1229, + 1230,5,116,0,0,1230,1231,5,114,0,0,1231,1232,5,105,0,0,1232,1233, + 5,110,0,0,1233,1234,5,103,0,0,1234,238,1,0,0,0,1235,1236,5,117,0, + 0,1236,1237,5,105,0,0,1237,1238,5,110,0,0,1238,1239,5,116,0,0,1239, + 1240,5,51,0,0,1240,1241,5,50,0,0,1241,240,1,0,0,0,1242,1243,5,117, + 0,0,1243,1244,5,105,0,0,1244,1245,5,110,0,0,1245,1246,5,116,0,0, + 1246,1247,5,54,0,0,1247,1248,5,52,0,0,1248,242,1,0,0,0,1249,1250, + 5,116,0,0,1250,1251,5,114,0,0,1251,1252,5,117,0,0,1252,1253,5,101, + 0,0,1253,244,1,0,0,0,1254,1255,5,102,0,0,1255,1256,5,97,0,0,1256, + 1257,5,108,0,0,1257,1258,5,115,0,0,1258,1259,5,101,0,0,1259,246, + 1,0,0,0,1260,1261,5,110,0,0,1261,1262,5,117,0,0,1262,1263,5,108, + 0,0,1263,1264,5,108,0,0,1264,248,1,0,0,0,1265,1266,5,45,0,0,1266, + 1267,5,62,0,0,1267,250,1,0,0,0,1268,1269,5,58,0,0,1269,252,1,0,0, + 0,1270,1271,5,59,0,0,1271,254,1,0,0,0,1272,1273,5,44,0,0,1273,256, + 1,0,0,0,1274,1275,5,46,0,0,1275,258,1,0,0,0,1276,1277,5,123,0,0, + 1277,260,1,0,0,0,1278,1279,5,125,0,0,1279,262,1,0,0,0,1280,1281, + 5,91,0,0,1281,264,1,0,0,0,1282,1283,5,93,0,0,1283,266,1,0,0,0,1284, + 1285,5,40,0,0,1285,268,1,0,0,0,1286,1287,5,41,0,0,1287,270,1,0,0, + 0,1288,1289,5,60,0,0,1289,272,1,0,0,0,1290,1291,5,62,0,0,1291,274, + 1,0,0,0,1292,1293,5,38,0,0,1293,276,1,0,0,0,1294,1295,5,61,0,0,1295, + 278,1,0,0,0,1296,1298,5,45,0,0,1297,1296,1,0,0,0,1297,1298,1,0,0, + 0,1298,1300,1,0,0,0,1299,1301,7,0,0,0,1300,1299,1,0,0,0,1301,1302, + 1,0,0,0,1302,1300,1,0,0,0,1302,1303,1,0,0,0,1303,280,1,0,0,0,1304, + 1306,5,45,0,0,1305,1304,1,0,0,0,1305,1306,1,0,0,0,1306,1315,1,0, + 0,0,1307,1316,5,48,0,0,1308,1312,7,1,0,0,1309,1311,7,0,0,0,1310, + 1309,1,0,0,0,1311,1314,1,0,0,0,1312,1310,1,0,0,0,1312,1313,1,0,0, + 0,1313,1316,1,0,0,0,1314,1312,1,0,0,0,1315,1307,1,0,0,0,1315,1308, + 1,0,0,0,1316,1323,1,0,0,0,1317,1319,5,46,0,0,1318,1320,7,0,0,0,1319, + 1318,1,0,0,0,1320,1321,1,0,0,0,1321,1319,1,0,0,0,1321,1322,1,0,0, + 0,1322,1324,1,0,0,0,1323,1317,1,0,0,0,1323,1324,1,0,0,0,1324,1334, + 1,0,0,0,1325,1327,7,2,0,0,1326,1328,7,3,0,0,1327,1326,1,0,0,0,1327, + 1328,1,0,0,0,1328,1330,1,0,0,0,1329,1331,7,0,0,0,1330,1329,1,0,0, + 0,1331,1332,1,0,0,0,1332,1330,1,0,0,0,1332,1333,1,0,0,0,1333,1335, + 1,0,0,0,1334,1325,1,0,0,0,1334,1335,1,0,0,0,1335,282,1,0,0,0,1336, + 1340,7,4,0,0,1337,1339,7,5,0,0,1338,1337,1,0,0,0,1339,1342,1,0,0, + 0,1340,1338,1,0,0,0,1340,1341,1,0,0,0,1341,284,1,0,0,0,1342,1340, + 1,0,0,0,1343,1348,5,34,0,0,1344,1347,3,287,143,0,1345,1347,8,6,0, + 0,1346,1344,1,0,0,0,1346,1345,1,0,0,0,1347,1350,1,0,0,0,1348,1346, + 1,0,0,0,1348,1349,1,0,0,0,1349,1351,1,0,0,0,1350,1348,1,0,0,0,1351, + 1352,5,34,0,0,1352,286,1,0,0,0,1353,1361,5,92,0,0,1354,1362,7,7, + 0,0,1355,1356,5,117,0,0,1356,1357,3,289,144,0,1357,1358,3,289,144, + 0,1358,1359,3,289,144,0,1359,1360,3,289,144,0,1360,1362,1,0,0,0, + 1361,1354,1,0,0,0,1361,1355,1,0,0,0,1362,288,1,0,0,0,1363,1364,7, + 8,0,0,1364,290,1,0,0,0,1365,1366,5,47,0,0,1366,1367,5,47,0,0,1367, + 1371,1,0,0,0,1368,1370,8,9,0,0,1369,1368,1,0,0,0,1370,1373,1,0,0, + 0,1371,1369,1,0,0,0,1371,1372,1,0,0,0,1372,1374,1,0,0,0,1373,1371, + 1,0,0,0,1374,1375,6,145,0,0,1375,292,1,0,0,0,1376,1377,5,47,0,0, + 1377,1378,5,42,0,0,1378,1382,1,0,0,0,1379,1381,9,0,0,0,1380,1379, + 1,0,0,0,1381,1384,1,0,0,0,1382,1383,1,0,0,0,1382,1380,1,0,0,0,1383, + 1385,1,0,0,0,1384,1382,1,0,0,0,1385,1386,5,42,0,0,1386,1387,5,47, + 0,0,1387,1388,1,0,0,0,1388,1389,6,146,0,0,1389,294,1,0,0,0,1390, + 1392,7,10,0,0,1391,1390,1,0,0,0,1392,1393,1,0,0,0,1393,1391,1,0, + 0,0,1393,1394,1,0,0,0,1394,1395,1,0,0,0,1395,1396,6,147,0,0,1396, + 296,1,0,0,0,18,0,1297,1302,1305,1312,1315,1321,1323,1327,1332,1334, + 1340,1346,1348,1361,1371,1382,1393,1,0,1,0 ]; private static __ATN: antlr.ATN; diff --git a/src/capability-language/generated/QuixosCapabilityParser.ts b/src/capability-language/generated/QuixosCapabilityParser.ts index 4c2e2c9..4e9b654 100644 --- a/src/capability-language/generated/QuixosCapabilityParser.ts +++ b/src/capability-language/generated/QuixosCapabilityParser.ts @@ -10,151 +10,152 @@ type int = number; export class QuixosCapabilityParser extends antlr.Parser { - public static readonly CREATION = 1; - public static readonly INITIALIZE = 2; - public static readonly WORKSPACE = 3; - public static readonly EXECUTION = 4; - public static readonly SNAPSHOT = 5; - public static readonly TRANSACTION = 6; - public static readonly REMOTE = 7; - public static readonly TARGETS = 8; - public static readonly PORTABLE = 9; - public static readonly REPLICA = 10; - public static readonly LOCAL = 11; - public static readonly FROM = 12; - public static readonly RESULT_BYTES = 13; - public static readonly RPC_CALLS = 14; - public static readonly DEADLINE_MS = 15; - public static readonly QUERY = 16; - public static readonly REFLECTION = 17; - public static readonly SPECIALIZE = 18; - public static readonly ROOT = 19; - public static readonly DOCUMENT = 20; - public static readonly FRAGMENTS = 21; - public static readonly VIEW = 22; - public static readonly MAX = 23; - public static readonly ALLOW = 24; - public static readonly POLL = 25; - public static readonly QUERYABLE = 26; - public static readonly RPC = 27; - public static readonly QUERY_REASON = 28; - public static readonly TYPE = 29; - public static readonly OBJECT = 30; - public static readonly STORABLE = 31; - public static readonly IMPLEMENTS = 32; - public static readonly REF = 33; - public static readonly FRAGMENT = 34; - public static readonly IMPORT = 35; - public static readonly EXTERNAL = 36; - public static readonly ATOM = 37; - public static readonly INTERFACE = 38; - public static readonly INTERFACES = 39; - public static readonly PACKAGE = 40; - public static readonly VALUE = 41; - public static readonly RELATION = 42; - public static readonly OPERATION = 43; - public static readonly FUNCTION = 44; - public static readonly CONSTRUCTOR = 45; - public static readonly CONSTRUCTS = 46; - public static readonly INPUT = 47; - public static readonly CONFORM = 48; - public static readonly AS = 49; - public static readonly BIND = 50; - public static readonly STATIC = 51; - public static readonly TO = 52; - public static readonly PRIVATE = 53; - public static readonly SHARED = 54; - public static readonly STATE = 55; - public static readonly EDGE = 56; - public static readonly PROJECTION = 57; - public static readonly WITH = 58; - public static readonly USING = 59; - public static readonly VIA = 60; - public static readonly MATERIALIZE = 61; - public static readonly IF = 62; - public static readonly ABSENT = 63; - public static readonly ON = 64; - public static readonly POLICY = 65; - public static readonly DEFAULT = 66; - public static readonly SOURCE = 67; - public static readonly REPOSITORY = 68; - public static readonly COMMIT = 69; - public static readonly REVISION = 70; - public static readonly SEMANTIC_MAJOR = 71; - public static readonly ON_DELETE = 72; - public static readonly RETAIN_OTHER = 73; - public static readonly KEYED = 74; - public static readonly PUBLIC_TRAVERSAL = 75; - public static readonly ID = 76; - public static readonly DOC = 77; - public static readonly MODE = 78; - public static readonly EMITS = 79; - public static readonly RECEIVER = 80; - public static readonly REQUIRES = 81; - public static readonly ANY = 82; - public static readonly GET = 83; - public static readonly SET = 84; - public static readonly WATCH = 85; - public static readonly START = 86; - public static readonly STOP = 87; - public static readonly READ = 88; - public static readonly WRITE = 89; - public static readonly RESOLVE = 90; - public static readonly CONNECT = 91; - public static readonly DISCONNECT = 92; - public static readonly CALL = 93; - public static readonly WATCH_START = 94; - public static readonly WATCH_STOP = 95; - public static readonly SUBSCRIBE = 96; - public static readonly UNSUBSCRIBE = 97; - public static readonly REGISTER = 98; - public static readonly CRDT = 99; - public static readonly OPTIONAL_ONE = 100; - public static readonly EXACTLY_ONE = 101; - public static readonly MANY_UNIQUE = 102; - public static readonly MANY = 103; - public static readonly ORDERED = 104; - public static readonly UNIT = 105; - public static readonly WATCH_HANDLE = 106; - public static readonly MESSAGE = 107; - public static readonly ATOM_REF = 108; - public static readonly INTERFACE_REF = 109; - public static readonly OPTIONAL = 110; - public static readonly LIST = 111; - public static readonly RECORD = 112; - public static readonly BOOL = 113; - public static readonly BYTES = 114; - public static readonly DOUBLE = 115; - public static readonly INT32 = 116; - public static readonly INT64 = 117; - public static readonly STRING = 118; - public static readonly UINT32 = 119; - public static readonly UINT64 = 120; - public static readonly TRUE = 121; - public static readonly FALSE = 122; - public static readonly NULL = 123; - public static readonly ARROW = 124; - public static readonly COLON = 125; - public static readonly SEMI = 126; - public static readonly COMMA = 127; - public static readonly DOT = 128; - public static readonly LBRACE = 129; - public static readonly RBRACE = 130; - public static readonly LBRACK = 131; - public static readonly RBRACK = 132; - public static readonly LPAREN = 133; - public static readonly RPAREN = 134; - public static readonly LT = 135; - public static readonly GT = 136; - public static readonly AMP = 137; - public static readonly EQUAL = 138; - public static readonly INTEGER = 139; - public static readonly JSON_NUMBER = 140; - public static readonly IDENTIFIER = 141; - public static readonly STRING_LITERAL = 142; - public static readonly LINE_COMMENT = 143; - public static readonly BLOCK_COMMENT = 144; - public static readonly WS = 145; + public static readonly EDIT = 1; + public static readonly CREATION = 2; + public static readonly INITIALIZE = 3; + public static readonly WORKSPACE = 4; + public static readonly EXECUTION = 5; + public static readonly SNAPSHOT = 6; + public static readonly TRANSACTION = 7; + public static readonly REMOTE = 8; + public static readonly TARGETS = 9; + public static readonly PORTABLE = 10; + public static readonly REPLICA = 11; + public static readonly LOCAL = 12; + public static readonly FROM = 13; + public static readonly RESULT_BYTES = 14; + public static readonly RPC_CALLS = 15; + public static readonly DEADLINE_MS = 16; + public static readonly QUERY = 17; + public static readonly REFLECTION = 18; + public static readonly SPECIALIZE = 19; + public static readonly ROOT = 20; + public static readonly DOCUMENT = 21; + public static readonly FRAGMENTS = 22; + public static readonly VIEW = 23; + public static readonly MAX = 24; + public static readonly ALLOW = 25; + public static readonly POLL = 26; + public static readonly QUERYABLE = 27; + public static readonly RPC = 28; + public static readonly QUERY_REASON = 29; + public static readonly TYPE = 30; + public static readonly OBJECT = 31; + public static readonly STORABLE = 32; + public static readonly IMPLEMENTS = 33; + public static readonly REF = 34; + public static readonly FRAGMENT = 35; + public static readonly IMPORT = 36; + public static readonly EXTERNAL = 37; + public static readonly ATOM = 38; + public static readonly INTERFACE = 39; + public static readonly INTERFACES = 40; + public static readonly PACKAGE = 41; + public static readonly VALUE = 42; + public static readonly RELATION = 43; + public static readonly OPERATION = 44; + public static readonly FUNCTION = 45; + public static readonly CONSTRUCTOR = 46; + public static readonly CONSTRUCTS = 47; + public static readonly INPUT = 48; + public static readonly CONFORM = 49; + public static readonly AS = 50; + public static readonly BIND = 51; + public static readonly STATIC = 52; + public static readonly TO = 53; + public static readonly PRIVATE = 54; + public static readonly SHARED = 55; + public static readonly STATE = 56; + public static readonly EDGE = 57; + public static readonly PROJECTION = 58; + public static readonly WITH = 59; + public static readonly USING = 60; + public static readonly VIA = 61; + public static readonly MATERIALIZE = 62; + public static readonly IF = 63; + public static readonly ABSENT = 64; + public static readonly ON = 65; + public static readonly POLICY = 66; + public static readonly DEFAULT = 67; + public static readonly SOURCE = 68; + public static readonly REPOSITORY = 69; + public static readonly COMMIT = 70; + public static readonly REVISION = 71; + public static readonly SEMANTIC_MAJOR = 72; + public static readonly ON_DELETE = 73; + public static readonly RETAIN_OTHER = 74; + public static readonly KEYED = 75; + public static readonly PUBLIC_TRAVERSAL = 76; + public static readonly ID = 77; + public static readonly DOC = 78; + public static readonly MODE = 79; + public static readonly EMITS = 80; + public static readonly RECEIVER = 81; + public static readonly REQUIRES = 82; + public static readonly ANY = 83; + public static readonly GET = 84; + public static readonly SET = 85; + public static readonly WATCH = 86; + public static readonly START = 87; + public static readonly STOP = 88; + public static readonly READ = 89; + public static readonly WRITE = 90; + public static readonly RESOLVE = 91; + public static readonly CONNECT = 92; + public static readonly DISCONNECT = 93; + public static readonly CALL = 94; + public static readonly WATCH_START = 95; + public static readonly WATCH_STOP = 96; + public static readonly SUBSCRIBE = 97; + public static readonly UNSUBSCRIBE = 98; + public static readonly REGISTER = 99; + public static readonly CRDT = 100; + public static readonly OPTIONAL_ONE = 101; + public static readonly EXACTLY_ONE = 102; + public static readonly MANY_UNIQUE = 103; + public static readonly MANY = 104; + public static readonly ORDERED = 105; + public static readonly UNIT = 106; + public static readonly WATCH_HANDLE = 107; + public static readonly MESSAGE = 108; + public static readonly ATOM_REF = 109; + public static readonly INTERFACE_REF = 110; + public static readonly OPTIONAL = 111; + public static readonly LIST = 112; + public static readonly RECORD = 113; + public static readonly BOOL = 114; + public static readonly BYTES = 115; + public static readonly DOUBLE = 116; + public static readonly INT32 = 117; + public static readonly INT64 = 118; + public static readonly STRING = 119; + public static readonly UINT32 = 120; + public static readonly UINT64 = 121; + public static readonly TRUE = 122; + public static readonly FALSE = 123; + public static readonly NULL = 124; + public static readonly ARROW = 125; + public static readonly COLON = 126; + public static readonly SEMI = 127; + public static readonly COMMA = 128; + public static readonly DOT = 129; + public static readonly LBRACE = 130; + public static readonly RBRACE = 131; + public static readonly LBRACK = 132; + public static readonly RBRACK = 133; + public static readonly LPAREN = 134; + public static readonly RPAREN = 135; + public static readonly LT = 136; + public static readonly GT = 137; + public static readonly AMP = 138; + public static readonly EQUAL = 139; + public static readonly INTEGER = 140; + public static readonly JSON_NUMBER = 141; + public static readonly IDENTIFIER = 142; + public static readonly STRING_LITERAL = 143; + public static readonly LINE_COMMENT = 144; + public static readonly BLOCK_COMMENT = 145; + public static readonly WS = 146; public static readonly RULE_document = 0; public static readonly RULE_fragmentDecl = 1; public static readonly RULE_sourceImportDecl = 2; @@ -232,7 +233,7 @@ export class QuixosCapabilityParser extends antlr.Parser { public static readonly RULE_stringLiteral = 74; public static readonly literalNames = [ - null, "'creation'", "'initialize'", "'workspace'", "'execution'", + null, "'edit'", "'creation'", "'initialize'", "'workspace'", "'execution'", "'snapshot'", "'transaction'", "'remote'", "'targets'", "'portable'", "'replica'", "'local'", "'from'", "'result-bytes'", "'rpc-calls'", "'deadline-ms'", "'query'", "'reflection'", "'specialize'", "'root'", @@ -260,29 +261,29 @@ export class QuixosCapabilityParser extends antlr.Parser { ]; public static readonly symbolicNames = [ - null, "CREATION", "INITIALIZE", "WORKSPACE", "EXECUTION", "SNAPSHOT", - "TRANSACTION", "REMOTE", "TARGETS", "PORTABLE", "REPLICA", "LOCAL", - "FROM", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", "REFLECTION", - "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", "MAX", "ALLOW", - "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", "OBJECT", "STORABLE", - "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", - "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", - "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", - "TO", "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", - "USING", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", - "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", - "ON_DELETE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", - "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", - "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", - "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", - "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", - "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", - "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", "BOOL", - "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", - "TRUE", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", - "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", - "GT", "AMP", "EQUAL", "INTEGER", "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", - "LINE_COMMENT", "BLOCK_COMMENT", "WS" + null, "EDIT", "CREATION", "INITIALIZE", "WORKSPACE", "EXECUTION", + "SNAPSHOT", "TRANSACTION", "REMOTE", "TARGETS", "PORTABLE", "REPLICA", + "LOCAL", "FROM", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", + "REFLECTION", "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", + "MAX", "ALLOW", "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", + "OBJECT", "STORABLE", "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", + "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", + "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", + "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", "PRIVATE", "SHARED", + "STATE", "EDGE", "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", + "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", + "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", "RETAIN_OTHER", + "KEYED", "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", "EMITS", "RECEIVER", + "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", + "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", + "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", + "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", + "MESSAGE", "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", + "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", + "UINT64", "TRUE", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", + "DOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", + "LT", "GT", "AMP", "EQUAL", "INTEGER", "JSON_NUMBER", "IDENTIFIER", + "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", "WS" ]; public static readonly ruleNames = [ "document", "fragmentDecl", "sourceImportDecl", "workspaceDecl", @@ -393,7 +394,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 169; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 29)) & ~0x1F) === 0 && ((1 << (_la - 29)) & 34144577) !== 0)) { + while (((((_la - 30)) & ~0x1F) === 0 && ((1 << (_la - 30)) & 34144577) !== 0)) { { { this.state = 166; @@ -476,7 +477,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 190; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 29)) & ~0x1F) === 0 && ((1 << (_la - 29)) & 34144577) !== 0)) { + while (((((_la - 30)) & ~0x1F) === 0 && ((1 << (_la - 30)) & 34144577) !== 0)) { { { this.state = 187; @@ -757,7 +758,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 242; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 77) { + if (_la === 78) { { this.state = 240; this.match(QuixosCapabilityParser.DOC); @@ -793,7 +794,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 249; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 29)) & ~0x1F) === 0 && ((1 << (_la - 29)) & 193) !== 0)) { + while (((((_la - 30)) & ~0x1F) === 0 && ((1 << (_la - 30)) & 193) !== 0)) { { { this.state = 246; @@ -811,7 +812,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 255; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 135) { + if (_la === 136) { { this.state = 254; this.typeParameters(); @@ -829,7 +830,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 270; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 81) { + if (_la === 82) { { this.state = 261; this.match(QuixosCapabilityParser.REQUIRES); @@ -838,7 +839,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 267; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 127) { + while (_la === 128) { { { this.state = 263; @@ -859,7 +860,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 276; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 26)) & ~0x1F) === 0 && ((1 << (_la - 26)) & 33783809) !== 0)) { + while (((((_la - 27)) & ~0x1F) === 0 && ((1 << (_la - 27)) & 33783809) !== 0)) { { { this.state = 273; @@ -901,7 +902,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 287; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 127) { + while (_la === 128) { { { this.state = 283; @@ -949,7 +950,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 296; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 125) { + if (_la === 126) { { this.state = 294; this.match(QuixosCapabilityParser.COLON); @@ -970,7 +971,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 309; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 32) { + if (_la === 33) { { this.state = 300; this.match(QuixosCapabilityParser.IMPLEMENTS); @@ -979,7 +980,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 306; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 137) { + while (_la === 138) { { { this.state = 302; @@ -1026,7 +1027,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 315; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 135) { + if (_la === 136) { { this.state = 314; this.typeArguments(); @@ -1062,7 +1063,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 323; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 127) { + while (_la === 128) { { { this.state = 319; @@ -1126,6 +1127,18 @@ export class QuixosCapabilityParser extends antlr.Parser { this.identifier(); } break; + case QuixosCapabilityParser.EDIT: + case QuixosCapabilityParser.CREATION: + case QuixosCapabilityParser.INITIALIZE: + case QuixosCapabilityParser.EXECUTION: + case QuixosCapabilityParser.SNAPSHOT: + case QuixosCapabilityParser.TRANSACTION: + case QuixosCapabilityParser.REMOTE: + case QuixosCapabilityParser.TARGETS: + case QuixosCapabilityParser.PORTABLE: + case QuixosCapabilityParser.REPLICA: + case QuixosCapabilityParser.LOCAL: + case QuixosCapabilityParser.FROM: case QuixosCapabilityParser.RESULT_BYTES: case QuixosCapabilityParser.RPC_CALLS: case QuixosCapabilityParser.DEADLINE_MS: @@ -1144,6 +1157,9 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.REF: case QuixosCapabilityParser.INTERFACES: case QuixosCapabilityParser.SOURCE: + case QuixosCapabilityParser.START: + case QuixosCapabilityParser.STOP: + case QuixosCapabilityParser.REGISTER: case QuixosCapabilityParser.UNIT: case QuixosCapabilityParser.WATCH_HANDLE: case QuixosCapabilityParser.MESSAGE: @@ -1198,7 +1214,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 340; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 135) { + if (_la === 136) { { this.state = 339; this.typeParameters(); @@ -1279,7 +1295,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 352; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 51) { + if (_la === 52) { { this.state = 351; this.match(QuixosCapabilityParser.STATIC); @@ -1313,7 +1329,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 367; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 4) { + if (_la === 5) { { this.state = 366; this.executionClause(); @@ -1349,7 +1365,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 373; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 26) { + if (_la === 27) { { this.state = 372; this.queryReadContract(); @@ -1373,7 +1389,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 385; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 83)) & ~0x1F) === 0 && ((1 << (_la - 83)) & 7) !== 0)) { + while (_la === 1 || ((((_la - 84)) & ~0x1F) === 0 && ((1 << (_la - 84)) & 7) !== 0)) { { { this.state = 382; @@ -1406,7 +1422,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 40, QuixosCapabilityParser.RULE_valueMemberOperation); let _la: number; try { - this.state = 415; + this.state = 423; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.GET: @@ -1421,7 +1437,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 394; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 4) { + if (_la === 5) { { this.state = 393; this.executionClause(); @@ -1444,7 +1460,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 402; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 4) { + if (_la === 5) { { this.state = 401; this.executionClause(); @@ -1455,24 +1471,47 @@ export class QuixosCapabilityParser extends antlr.Parser { this.match(QuixosCapabilityParser.SEMI); } break; - case QuixosCapabilityParser.WATCH: + case QuixosCapabilityParser.EDIT: this.enterOuterAlt(localContext, 3); { this.state = 406; - this.match(QuixosCapabilityParser.WATCH); + this.match(QuixosCapabilityParser.EDIT); this.state = 407; - this.match(QuixosCapabilityParser.START); - this.state = 408; this.match(QuixosCapabilityParser.ID); - this.state = 409; + this.state = 408; this.stringLiteral(); this.state = 410; - this.match(QuixosCapabilityParser.STOP); - this.state = 411; - this.match(QuixosCapabilityParser.ID); + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 5) { + { + this.state = 409; + this.executionClause(); + } + } + this.state = 412; + this.match(QuixosCapabilityParser.SEMI); + } + break; + case QuixosCapabilityParser.WATCH: + this.enterOuterAlt(localContext, 4); + { + this.state = 414; + this.match(QuixosCapabilityParser.WATCH); + this.state = 415; + this.match(QuixosCapabilityParser.START); + this.state = 416; + this.match(QuixosCapabilityParser.ID); + this.state = 417; this.stringLiteral(); - this.state = 413; + this.state = 418; + this.match(QuixosCapabilityParser.STOP); + this.state = 419; + this.match(QuixosCapabilityParser.ID); + this.state = 420; + this.stringLiteral(); + this.state = 421; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1500,69 +1539,69 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 418; + this.state = 426; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 26) { + if (_la === 27) { { - this.state = 417; + this.state = 425; this.queryReadContract(); } } - this.state = 420; - this.match(QuixosCapabilityParser.RELATION); - this.state = 421; - this.identifier(); - this.state = 422; - this.match(QuixosCapabilityParser.ID); - this.state = 423; - this.stringLiteral(); - this.state = 424; - this.match(QuixosCapabilityParser.COLON); - this.state = 425; - this.cardinality(); - this.state = 426; - this.targetConstraint(); this.state = 428; + this.match(QuixosCapabilityParser.RELATION); + this.state = 429; + this.identifier(); + this.state = 430; + this.match(QuixosCapabilityParser.ID); + this.state = 431; + this.stringLiteral(); + this.state = 432; + this.match(QuixosCapabilityParser.COLON); + this.state = 433; + this.cardinality(); + this.state = 434; + this.targetConstraint(); + this.state = 436; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 104) { + if (_la === 105) { { - this.state = 427; + this.state = 435; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 432; + this.state = 440; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 74) { + if (_la === 75) { { - this.state = 430; + this.state = 438; this.match(QuixosCapabilityParser.KEYED); - this.state = 431; + this.state = 439; this.stringLiteral(); } } - this.state = 434; + this.state = 442; this.match(QuixosCapabilityParser.LBRACE); - this.state = 438; + this.state = 446; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 85)) & ~0x1F) === 0 && ((1 << (_la - 85)) & 225) !== 0)) { + while (((((_la - 86)) & ~0x1F) === 0 && ((1 << (_la - 86)) & 225) !== 0)) { { { - this.state = 435; + this.state = 443; this.relationshipOperation(); } } - this.state = 440; + this.state = 448; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 441; + this.state = 449; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1586,16 +1625,16 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 443; + this.state = 451; this.match(QuixosCapabilityParser.QUERYABLE); - this.state = 445; + this.state = 453; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 9 || _la === 27) { + if (_la === 10 || _la === 28) { { - this.state = 444; + this.state = 452; _la = this.tokenStream.LA(1); - if(!(_la === 9 || _la === 27)) { + if(!(_la === 10 || _la === 28)) { this.errorHandler.recoverInline(this); } else { @@ -1625,37 +1664,14 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 46, QuixosCapabilityParser.RULE_relationshipOperation); let _la: number; try { - this.state = 480; + this.state = 488; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.RESOLVE: this.enterOuterAlt(localContext, 1); { - this.state = 447; - this.match(QuixosCapabilityParser.RESOLVE); - this.state = 448; - this.match(QuixosCapabilityParser.ID); - this.state = 449; - this.stringLiteral(); - this.state = 451; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 4) { - { - this.state = 450; - this.executionClause(); - } - } - - this.state = 453; - this.match(QuixosCapabilityParser.SEMI); - } - break; - case QuixosCapabilityParser.CONNECT: - this.enterOuterAlt(localContext, 2); - { this.state = 455; - this.match(QuixosCapabilityParser.CONNECT); + this.match(QuixosCapabilityParser.RESOLVE); this.state = 456; this.match(QuixosCapabilityParser.ID); this.state = 457; @@ -1663,7 +1679,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 459; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 4) { + if (_la === 5) { { this.state = 458; this.executionClause(); @@ -1674,11 +1690,11 @@ export class QuixosCapabilityParser extends antlr.Parser { this.match(QuixosCapabilityParser.SEMI); } break; - case QuixosCapabilityParser.DISCONNECT: - this.enterOuterAlt(localContext, 3); + case QuixosCapabilityParser.CONNECT: + this.enterOuterAlt(localContext, 2); { this.state = 463; - this.match(QuixosCapabilityParser.DISCONNECT); + this.match(QuixosCapabilityParser.CONNECT); this.state = 464; this.match(QuixosCapabilityParser.ID); this.state = 465; @@ -1686,7 +1702,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 467; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 4) { + if (_la === 5) { { this.state = 466; this.executionClause(); @@ -1697,24 +1713,47 @@ export class QuixosCapabilityParser extends antlr.Parser { this.match(QuixosCapabilityParser.SEMI); } break; + case QuixosCapabilityParser.DISCONNECT: + this.enterOuterAlt(localContext, 3); + { + this.state = 471; + this.match(QuixosCapabilityParser.DISCONNECT); + this.state = 472; + this.match(QuixosCapabilityParser.ID); + this.state = 473; + this.stringLiteral(); + this.state = 475; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 5) { + { + this.state = 474; + this.executionClause(); + } + } + + this.state = 477; + this.match(QuixosCapabilityParser.SEMI); + } + break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 4); { - this.state = 471; + this.state = 479; this.match(QuixosCapabilityParser.WATCH); - this.state = 472; + this.state = 480; this.match(QuixosCapabilityParser.START); - this.state = 473; + this.state = 481; this.match(QuixosCapabilityParser.ID); - this.state = 474; + this.state = 482; this.stringLiteral(); - this.state = 475; + this.state = 483; this.match(QuixosCapabilityParser.STOP); - this.state = 476; + this.state = 484; this.match(QuixosCapabilityParser.ID); - this.state = 477; + this.state = 485; this.stringLiteral(); - this.state = 478; + this.state = 486; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1740,31 +1779,31 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 48, QuixosCapabilityParser.RULE_targetConstraint); let _la: number; try { - this.state = 491; + this.state = 499; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 1); { - this.state = 482; + this.state = 490; this.match(QuixosCapabilityParser.ATOM); - this.state = 483; + this.state = 491; this.identifier(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 2); { - this.state = 484; + this.state = 492; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 485; + this.state = 493; this.identifier(); - this.state = 487; + this.state = 495; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 135) { + if (_la === 136) { { - this.state = 486; + this.state = 494; this.typeArguments(); } } @@ -1774,9 +1813,9 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 489; + this.state = 497; this.match(QuixosCapabilityParser.OBJECT); - this.state = 490; + this.state = 498; this.identifier(); } break; @@ -1804,61 +1843,61 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 496; + this.state = 504; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 29)) & ~0x1F) === 0 && ((1 << (_la - 29)) & 193) !== 0)) { + while (((((_la - 30)) & ~0x1F) === 0 && ((1 << (_la - 30)) & 193) !== 0)) { { { - this.state = 493; + this.state = 501; this.resourcePreamble(); } } - this.state = 498; + this.state = 506; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 499; - this.match(QuixosCapabilityParser.PACKAGE); - this.state = 500; - this.identifier(); - this.state = 501; - this.match(QuixosCapabilityParser.ID); - this.state = 502; - this.stringLiteral(); - this.state = 503; - this.match(QuixosCapabilityParser.REVISION); - this.state = 504; - this.stringLiteral(); this.state = 507; + this.match(QuixosCapabilityParser.PACKAGE); + this.state = 508; + this.identifier(); + this.state = 509; + this.match(QuixosCapabilityParser.ID); + this.state = 510; + this.stringLiteral(); + this.state = 511; + this.match(QuixosCapabilityParser.REVISION); + this.state = 512; + this.stringLiteral(); + this.state = 515; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 71) { + if (_la === 72) { { - this.state = 505; + this.state = 513; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); - this.state = 506; + this.state = 514; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 509; + this.state = 517; this.match(QuixosCapabilityParser.LBRACE); - this.state = 513; + this.state = 521; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 16)) & ~0x1F) === 0 && ((1 << (_la - 16)) & 939524097) !== 0)) { + while (((((_la - 17)) & ~0x1F) === 0 && ((1 << (_la - 17)) & 939524097) !== 0)) { { { - this.state = 510; + this.state = 518; this.packageExport(); } } - this.state = 515; + this.state = 523; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 516; + this.state = 524; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1879,41 +1918,41 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new PackageExportContext(this.context, this.state); this.enterRule(localContext, 52, QuixosCapabilityParser.RULE_packageExport); try { - this.state = 523; + this.state = 531; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 43, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 44, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 518; + this.state = 526; this.packageOperationExport(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 519; + this.state = 527; this.packageFunctionExport(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 520; + this.state = 528; this.packageConstructorExport(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 521; + this.state = 529; this.packageQuery(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 522; + this.state = 530; this.packageQuerySpecialization(); } break; @@ -1939,63 +1978,63 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 525; + this.state = 533; this.match(QuixosCapabilityParser.QUERY); - this.state = 526; + this.state = 534; this.identifier(); - this.state = 528; + this.state = 536; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 135) { + if (_la === 136) { { - this.state = 527; + this.state = 535; this.typeParameters(); } } - this.state = 530; + this.state = 538; this.match(QuixosCapabilityParser.ID); - this.state = 531; + this.state = 539; this.stringLiteral(); - this.state = 532; + this.state = 540; this.match(QuixosCapabilityParser.ROOT); - this.state = 534; + this.state = 542; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 3) { + if (_la === 4) { { - this.state = 533; + this.state = 541; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 536; + this.state = 544; this.interfaceType(); - this.state = 537; - this.match(QuixosCapabilityParser.DOCUMENT); - this.state = 538; - this.stringLiteral(); - this.state = 539; - this.match(QuixosCapabilityParser.OPERATION); - this.state = 540; - this.stringLiteral(); - this.state = 541; - this.match(QuixosCapabilityParser.LBRACE); this.state = 545; + this.match(QuixosCapabilityParser.DOCUMENT); + this.state = 546; + this.stringLiteral(); + this.state = 547; + this.match(QuixosCapabilityParser.OPERATION); + this.state = 548; + this.stringLiteral(); + this.state = 549; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 553; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 65014784) !== 0) || _la === 85) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 130029568) !== 0) || _la === 86) { { { - this.state = 542; + this.state = 550; this.queryClause(); } } - this.state = 547; + this.state = 555; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 548; + this.state = 556; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2018,21 +2057,21 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 550; + this.state = 558; this.match(QuixosCapabilityParser.QUERY); - this.state = 551; + this.state = 559; this.identifier(); - this.state = 552; + this.state = 560; this.match(QuixosCapabilityParser.ID); - this.state = 553; + this.state = 561; this.stringLiteral(); - this.state = 554; + this.state = 562; this.match(QuixosCapabilityParser.SPECIALIZE); - this.state = 555; + this.state = 563; this.identifier(); - this.state = 556; + this.state = 564; this.typeArguments(); - this.state = 557; + this.state = 565; this.match(QuixosCapabilityParser.SEMI); } } @@ -2054,118 +2093,118 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 58, QuixosCapabilityParser.RULE_queryClause); let _la: number; try { - this.state = 599; + this.state = 607; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REPLICA: this.enterOuterAlt(localContext, 1); { - this.state = 559; + this.state = 567; this.match(QuixosCapabilityParser.REPLICA); - this.state = 560; + this.state = 568; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.LOCAL: this.enterOuterAlt(localContext, 2); { - this.state = 561; + this.state = 569; this.match(QuixosCapabilityParser.LOCAL); - this.state = 562; + this.state = 570; this.match(QuixosCapabilityParser.FROM); - this.state = 563; + this.state = 571; this.identifier(); - this.state = 564; + this.state = 572; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.FRAGMENTS: this.enterOuterAlt(localContext, 3); { - this.state = 566; + this.state = 574; this.match(QuixosCapabilityParser.FRAGMENTS); - this.state = 567; + this.state = 575; this.stringLiteral(); - this.state = 568; + this.state = 576; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.VIEW: this.enterOuterAlt(localContext, 4); { - this.state = 570; + this.state = 578; this.match(QuixosCapabilityParser.VIEW); - this.state = 572; + this.state = 580; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 30) { + if (_la === 31) { { - this.state = 571; + this.state = 579; this.match(QuixosCapabilityParser.OBJECT); } } - this.state = 574; + this.state = 582; this.identifier(); - this.state = 575; + this.state = 583; this.match(QuixosCapabilityParser.AS); - this.state = 576; + this.state = 584; this.interfaceType(); - this.state = 577; + this.state = 585; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.MAX: this.enterOuterAlt(localContext, 5); { - this.state = 579; + this.state = 587; this.match(QuixosCapabilityParser.MAX); - this.state = 580; + this.state = 588; this.identifier(); - this.state = 581; + this.state = 589; this.match(QuixosCapabilityParser.INTEGER); - this.state = 582; + this.state = 590; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.ALLOW: this.enterOuterAlt(localContext, 6); { - this.state = 584; + this.state = 592; this.match(QuixosCapabilityParser.ALLOW); - this.state = 585; + this.state = 593; this.interfaceType(); - this.state = 586; + this.state = 594; this.match(QuixosCapabilityParser.DOT); - this.state = 587; + this.state = 595; this.identifier(); - this.state = 588; + this.state = 596; this.identifier(); - this.state = 589; + this.state = 597; this.stringLiteral(); - this.state = 590; + this.state = 598; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 7); { - this.state = 592; + this.state = 600; this.match(QuixosCapabilityParser.WATCH); - this.state = 593; + this.state = 601; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.POLL: this.enterOuterAlt(localContext, 8); { - this.state = 594; + this.state = 602; this.match(QuixosCapabilityParser.POLL); - this.state = 595; + this.state = 603; this.match(QuixosCapabilityParser.INTEGER); - this.state = 596; + this.state = 604; this.stringLiteral(); - this.state = 597; + this.state = 605; this.match(QuixosCapabilityParser.SEMI); } break; @@ -2193,71 +2232,71 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 601; + this.state = 609; this.match(QuixosCapabilityParser.OPERATION); - this.state = 602; + this.state = 610; this.identifier(); - this.state = 604; + this.state = 612; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 135) { + if (_la === 136) { { - this.state = 603; + this.state = 611; this.typeParameters(); } } - this.state = 606; + this.state = 614; this.match(QuixosCapabilityParser.ID); - this.state = 607; - this.stringLiteral(); - this.state = 608; - this.match(QuixosCapabilityParser.COLON); - this.state = 609; - this.valueType(); - this.state = 610; - this.match(QuixosCapabilityParser.ARROW); - this.state = 611; - this.valueType(); - this.state = 612; - this.match(QuixosCapabilityParser.MODE); - this.state = 613; - this.operationMode(); this.state = 615; + this.stringLiteral(); + this.state = 616; + this.match(QuixosCapabilityParser.COLON); + this.state = 617; + this.valueType(); + this.state = 618; + this.match(QuixosCapabilityParser.ARROW); + this.state = 619; + this.valueType(); + this.state = 620; + this.match(QuixosCapabilityParser.MODE); + this.state = 621; + this.operationMode(); + this.state = 623; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 4) { + if (_la === 5) { { - this.state = 614; + this.state = 622; this.executionClause(); } } - this.state = 618; + this.state = 626; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 79) { + if (_la === 80) { { - this.state = 617; + this.state = 625; this.eventClause(); } } - this.state = 620; + this.state = 628; this.match(QuixosCapabilityParser.RECEIVER); - this.state = 621; + this.state = 629; this.receiverRequirement(); - this.state = 623; + this.state = 631; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 81) { + if (_la === 82) { { - this.state = 622; + this.state = 630; this.dependencyBlock(); } } - this.state = 625; + this.state = 633; this.match(QuixosCapabilityParser.SEMI); } } @@ -2281,53 +2320,53 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 627; + this.state = 635; this.match(QuixosCapabilityParser.FUNCTION); - this.state = 628; + this.state = 636; this.identifier(); - this.state = 630; + this.state = 638; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 135) { + if (_la === 136) { { - this.state = 629; + this.state = 637; this.typeParameters(); } } - this.state = 632; + this.state = 640; this.match(QuixosCapabilityParser.ID); - this.state = 633; + this.state = 641; this.stringLiteral(); - this.state = 634; + this.state = 642; this.match(QuixosCapabilityParser.COLON); - this.state = 635; + this.state = 643; this.valueType(); - this.state = 636; + this.state = 644; this.match(QuixosCapabilityParser.ARROW); - this.state = 637; + this.state = 645; this.valueType(); - this.state = 639; + this.state = 647; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 4) { + if (_la === 5) { { - this.state = 638; + this.state = 646; this.executionClause(); } } - this.state = 642; + this.state = 650; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 81) { + if (_la === 82) { { - this.state = 641; + this.state = 649; this.dependencyBlock(); } } - this.state = 644; + this.state = 652; this.match(QuixosCapabilityParser.SEMI); } } @@ -2349,39 +2388,39 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 64, QuixosCapabilityParser.RULE_executionClause); let _la: number; try { - this.state = 655; + this.state = 663; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 56, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 57, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 646; + this.state = 654; this.match(QuixosCapabilityParser.EXECUTION); - this.state = 647; + this.state = 655; this.match(QuixosCapabilityParser.REMOTE); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 648; + this.state = 656; this.match(QuixosCapabilityParser.EXECUTION); - this.state = 649; + this.state = 657; _la = this.tokenStream.LA(1); - if(!(_la === 5 || _la === 6)) { + if(!(_la === 6 || _la === 7)) { this.errorHandler.recoverInline(this); } else { this.errorHandler.reportMatch(this); this.consume(); } - this.state = 650; + this.state = 658; this.match(QuixosCapabilityParser.TARGETS); - this.state = 651; + this.state = 659; this.match(QuixosCapabilityParser.LBRACK); - this.state = 652; + this.state = 660; this.identifierList(); - this.state = 653; + this.state = 661; this.match(QuixosCapabilityParser.RBRACK); } break; @@ -2407,29 +2446,29 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 657; + this.state = 665; this.match(QuixosCapabilityParser.USING); - this.state = 658; + this.state = 666; this.match(QuixosCapabilityParser.LBRACK); - this.state = 659; + this.state = 667; this.memberOperationRef(); - this.state = 664; + this.state = 672; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 127) { + while (_la === 128) { { { - this.state = 660; + this.state = 668; this.match(QuixosCapabilityParser.COMMA); - this.state = 661; + this.state = 669; this.memberOperationRef(); } } - this.state = 666; + this.state = 674; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 667; + this.state = 675; this.match(QuixosCapabilityParser.RBRACK); } } @@ -2453,33 +2492,33 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 669; + this.state = 677; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 670; - this.identifier(); - this.state = 671; - this.match(QuixosCapabilityParser.ID); - this.state = 672; - this.stringLiteral(); - this.state = 673; - this.match(QuixosCapabilityParser.CONSTRUCTS); - this.state = 674; - this.identifier(); - this.state = 675; - this.match(QuixosCapabilityParser.COLON); - this.state = 676; - this.valueType(); this.state = 678; + this.identifier(); + this.state = 679; + this.match(QuixosCapabilityParser.ID); + this.state = 680; + this.stringLiteral(); + this.state = 681; + this.match(QuixosCapabilityParser.CONSTRUCTS); + this.state = 682; + this.identifier(); + this.state = 683; + this.match(QuixosCapabilityParser.COLON); + this.state = 684; + this.valueType(); + this.state = 686; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 81) { + if (_la === 82) { { - this.state = 677; + this.state = 685; this.dependencyBlock(); } } - this.state = 680; + this.state = 688; this.match(QuixosCapabilityParser.SEMI); } } @@ -2502,9 +2541,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 682; + this.state = 690; this.match(QuixosCapabilityParser.EMITS); - this.state = 683; + this.state = 691; this.valueType(); } } @@ -2528,9 +2567,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 685; + this.state = 693; _la = this.tokenStream.LA(1); - if(!(((((_la - 93)) & ~0x1F) === 0 && ((1 << (_la - 93)) & 31) !== 0))) { + if(!(((((_la - 94)) & ~0x1F) === 0 && ((1 << (_la - 94)) & 31) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2557,68 +2596,68 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 74, QuixosCapabilityParser.RULE_receiverRequirement); let _la: number; try { - this.state = 705; + this.state = 713; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ANY: this.enterOuterAlt(localContext, 1); { - this.state = 687; + this.state = 695; this.match(QuixosCapabilityParser.ANY); } break; case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 2); { - this.state = 688; + this.state = 696; this.match(QuixosCapabilityParser.ATOM); - this.state = 689; + this.state = 697; this.identifier(); } break; case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 690; + this.state = 698; this.match(QuixosCapabilityParser.OBJECT); - this.state = 691; + this.state = 699; this.identifier(); } break; case QuixosCapabilityParser.INTERFACES: this.enterOuterAlt(localContext, 4); { - this.state = 692; + this.state = 700; this.match(QuixosCapabilityParser.INTERFACES); - this.state = 693; + this.state = 701; this.match(QuixosCapabilityParser.LBRACK); - this.state = 702; + this.state = 710; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 268427264) !== 0) || _la === 39 || _la === 67 || _la === 141) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 68 || ((((_la - 87)) & ~0x1F) === 0 && ((1 << (_la - 87)) & 4099) !== 0) || _la === 142) { { - this.state = 694; + this.state = 702; this.interfaceType(); - this.state = 699; + this.state = 707; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 127) { + while (_la === 128) { { { - this.state = 695; + this.state = 703; this.match(QuixosCapabilityParser.COMMA); - this.state = 696; + this.state = 704; this.interfaceType(); } } - this.state = 701; + this.state = 709; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 704; + this.state = 712; this.match(QuixosCapabilityParser.RBRACK); } break; @@ -2646,21 +2685,21 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 707; + this.state = 715; this.identifier(); - this.state = 712; + this.state = 720; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 127) { + while (_la === 128) { { { - this.state = 708; + this.state = 716; this.match(QuixosCapabilityParser.COMMA); - this.state = 709; + this.state = 717; this.identifier(); } } - this.state = 714; + this.state = 722; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } @@ -2686,25 +2725,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 715; + this.state = 723; this.match(QuixosCapabilityParser.REQUIRES); - this.state = 716; + this.state = 724; this.match(QuixosCapabilityParser.LBRACE); - this.state = 720; + this.state = 728; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 196610) !== 0) || ((((_la - 38)) & ~0x1F) === 0 && ((1 << (_la - 38)) & 393345) !== 0)) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 393220) !== 0) || ((((_la - 39)) & ~0x1F) === 0 && ((1 << (_la - 39)) & 393345) !== 0)) { { { - this.state = 717; + this.state = 725; this.dependencyPort(); } } - this.state = 722; + this.state = 730; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 723; + this.state = 731; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2726,187 +2765,187 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 80, QuixosCapabilityParser.RULE_dependencyPort); let _la: number; try { - this.state = 799; + this.state = 807; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REFLECTION: this.enterOuterAlt(localContext, 1); { - this.state = 725; + this.state = 733; this.match(QuixosCapabilityParser.REFLECTION); - this.state = 726; + this.state = 734; this.identifier(); - this.state = 727; + this.state = 735; this.match(QuixosCapabilityParser.ID); - this.state = 728; + this.state = 736; this.stringLiteral(); - this.state = 729; + this.state = 737; this.match(QuixosCapabilityParser.LBRACK); - this.state = 730; + this.state = 738; this.identifierList(); - this.state = 731; + this.state = 739; this.match(QuixosCapabilityParser.RBRACK); - this.state = 732; + this.state = 740; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 2); { - this.state = 734; + this.state = 742; this.match(QuixosCapabilityParser.STATE); - this.state = 735; + this.state = 743; this.identifier(); - this.state = 736; + this.state = 744; this.match(QuixosCapabilityParser.ID); - this.state = 737; + this.state = 745; this.stringLiteral(); - this.state = 738; + this.state = 746; this.match(QuixosCapabilityParser.COLON); - this.state = 739; + this.state = 747; this.valueType(); - this.state = 740; + this.state = 748; this.primitiveList(); - this.state = 741; + this.state = 749; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 3); { - this.state = 743; - this.match(QuixosCapabilityParser.EDGE); - this.state = 744; - this.identifier(); - this.state = 745; - this.match(QuixosCapabilityParser.ID); - this.state = 746; - this.stringLiteral(); - this.state = 747; - this.match(QuixosCapabilityParser.COLON); - this.state = 748; - this.cardinality(); - this.state = 749; - this.targetConstraint(); - this.state = 750; - this.primitiveList(); this.state = 751; + this.match(QuixosCapabilityParser.EDGE); + this.state = 752; + this.identifier(); + this.state = 753; + this.match(QuixosCapabilityParser.ID); + this.state = 754; + this.stringLiteral(); + this.state = 755; + this.match(QuixosCapabilityParser.COLON); + this.state = 756; + this.cardinality(); + this.state = 757; + this.targetConstraint(); + this.state = 758; + this.primitiveList(); + this.state = 759; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 4); { - this.state = 753; + this.state = 761; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 754; + this.state = 762; this.identifier(); - this.state = 755; + this.state = 763; this.match(QuixosCapabilityParser.ID); - this.state = 756; + this.state = 764; this.stringLiteral(); - this.state = 757; + this.state = 765; this.match(QuixosCapabilityParser.COLON); - this.state = 758; + this.state = 766; this.identifier(); - this.state = 760; + this.state = 768; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 135) { + if (_la === 136) { { - this.state = 759; + this.state = 767; this.typeArguments(); } } - this.state = 763; + this.state = 771; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 59) { + if (_la === 60) { { - this.state = 762; + this.state = 770; this.selectedOperations(); } } - this.state = 765; + this.state = 773; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CREATION: this.enterOuterAlt(localContext, 5); { - this.state = 767; - this.match(QuixosCapabilityParser.CREATION); - this.state = 768; - this.identifier(); - this.state = 769; - this.match(QuixosCapabilityParser.ID); - this.state = 770; - this.stringLiteral(); - this.state = 771; - this.match(QuixosCapabilityParser.COLON); - this.state = 772; - this.identifier(); - this.state = 773; - this.match(QuixosCapabilityParser.INPUT); - this.state = 774; - this.valueType(); this.state = 775; + this.match(QuixosCapabilityParser.CREATION); + this.state = 776; + this.identifier(); + this.state = 777; + this.match(QuixosCapabilityParser.ID); + this.state = 778; + this.stringLiteral(); + this.state = 779; + this.match(QuixosCapabilityParser.COLON); + this.state = 780; + this.identifier(); + this.state = 781; + this.match(QuixosCapabilityParser.INPUT); + this.state = 782; + this.valueType(); + this.state = 783; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONSTRUCTOR: this.enterOuterAlt(localContext, 6); { - this.state = 777; - this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 778; - this.identifier(); - this.state = 779; - this.match(QuixosCapabilityParser.ID); - this.state = 780; - this.stringLiteral(); - this.state = 781; - this.match(QuixosCapabilityParser.COLON); - this.state = 782; - this.identifier(); this.state = 785; + this.match(QuixosCapabilityParser.CONSTRUCTOR); + this.state = 786; + this.identifier(); + this.state = 787; + this.match(QuixosCapabilityParser.ID); + this.state = 788; + this.stringLiteral(); + this.state = 789; + this.match(QuixosCapabilityParser.COLON); + this.state = 790; + this.identifier(); + this.state = 793; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 47) { + if (_la === 48) { { - this.state = 783; + this.state = 791; this.match(QuixosCapabilityParser.INPUT); - this.state = 784; + this.state = 792; this.valueType(); } } - this.state = 787; + this.state = 795; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.QUERY: this.enterOuterAlt(localContext, 7); { - this.state = 789; - this.match(QuixosCapabilityParser.QUERY); - this.state = 790; - this.identifier(); - this.state = 791; - this.match(QuixosCapabilityParser.ID); - this.state = 792; - this.stringLiteral(); - this.state = 793; - this.match(QuixosCapabilityParser.COLON); - this.state = 794; - this.identifier(); - this.state = 795; - this.match(QuixosCapabilityParser.DOT); - this.state = 796; - this.identifier(); this.state = 797; + this.match(QuixosCapabilityParser.QUERY); + this.state = 798; + this.identifier(); + this.state = 799; + this.match(QuixosCapabilityParser.ID); + this.state = 800; + this.stringLiteral(); + this.state = 801; + this.match(QuixosCapabilityParser.COLON); + this.state = 802; + this.identifier(); + this.state = 803; + this.match(QuixosCapabilityParser.DOT); + this.state = 804; + this.identifier(); + this.state = 805; this.match(QuixosCapabilityParser.SEMI); } break; @@ -2934,27 +2973,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 801; + this.state = 809; this.match(QuixosCapabilityParser.LBRACK); - this.state = 802; + this.state = 810; this.primitive(); - this.state = 807; + this.state = 815; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 127) { + while (_la === 128) { { { - this.state = 803; + this.state = 811; this.match(QuixosCapabilityParser.COMMA); - this.state = 804; + this.state = 812; this.primitive(); } } - this.state = 809; + this.state = 817; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 810; + this.state = 818; this.match(QuixosCapabilityParser.RBRACK); } } @@ -2978,9 +3017,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 812; + this.state = 820; _la = this.tokenStream.LA(1); - if(!(((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 223) !== 0))) { + if(!(_la === 1 || ((((_la - 89)) & ~0x1F) === 0 && ((1 << (_la - 89)) & 223) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -3008,9 +3047,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 814; + this.state = 822; this.match(QuixosCapabilityParser.SHARED); - this.state = 815; + this.state = 823; this.attachmentDecl(); } } @@ -3031,20 +3070,20 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new AttachmentDeclContext(this.context, this.state); this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_attachmentDecl); try { - this.state = 819; + this.state = 827; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 817; + this.state = 825; this.stateDecl(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 818; + this.state = 826; this.edgeDecl(); } break; @@ -3072,39 +3111,39 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 821; - this.match(QuixosCapabilityParser.STATE); - this.state = 822; - this.identifier(); - this.state = 823; - this.match(QuixosCapabilityParser.ID); - this.state = 824; - this.stringLiteral(); - this.state = 825; - this.match(QuixosCapabilityParser.ON); - this.state = 826; - this.identifier(); - this.state = 827; - this.match(QuixosCapabilityParser.COLON); - this.state = 828; - this.valueType(); this.state = 829; - this.match(QuixosCapabilityParser.POLICY); + this.match(QuixosCapabilityParser.STATE); this.state = 830; - this.storagePolicy(); + this.identifier(); + this.state = 831; + this.match(QuixosCapabilityParser.ID); + this.state = 832; + this.stringLiteral(); this.state = 833; + this.match(QuixosCapabilityParser.ON); + this.state = 834; + this.identifier(); + this.state = 835; + this.match(QuixosCapabilityParser.COLON); + this.state = 836; + this.valueType(); + this.state = 837; + this.match(QuixosCapabilityParser.POLICY); + this.state = 838; + this.storagePolicy(); + this.state = 841; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 66) { + if (_la === 67) { { - this.state = 831; + this.state = 839; this.match(QuixosCapabilityParser.DEFAULT); - this.state = 832; + this.state = 840; this.jsonLiteral(); } } - this.state = 835; + this.state = 843; this.match(QuixosCapabilityParser.SEMI); } } @@ -3125,26 +3164,26 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new StoragePolicyContext(this.context, this.state); this.enterRule(localContext, 92, QuixosCapabilityParser.RULE_storagePolicy); try { - this.state = 843; + this.state = 851; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REGISTER: this.enterOuterAlt(localContext, 1); { - this.state = 837; + this.state = 845; this.match(QuixosCapabilityParser.REGISTER); } break; case QuixosCapabilityParser.CRDT: this.enterOuterAlt(localContext, 2); { - this.state = 838; + this.state = 846; this.match(QuixosCapabilityParser.CRDT); - this.state = 839; + this.state = 847; this.match(QuixosCapabilityParser.LPAREN); - this.state = 840; + this.state = 848; this.valueType(); - this.state = 841; + this.state = 849; this.match(QuixosCapabilityParser.RPAREN); } break; @@ -3171,21 +3210,21 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 845; + this.state = 853; this.match(QuixosCapabilityParser.EDGE); - this.state = 846; + this.state = 854; this.identifier(); - this.state = 847; + this.state = 855; this.match(QuixosCapabilityParser.ID); - this.state = 848; + this.state = 856; this.stringLiteral(); - this.state = 849; + this.state = 857; this.match(QuixosCapabilityParser.LBRACE); - this.state = 850; + this.state = 858; this.edgeEndpoint(); - this.state = 851; + this.state = 859; this.edgeEndpoint(); - this.state = 852; + this.state = 860; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3209,73 +3248,73 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 854; + this.state = 862; this.targetConstraint(); - this.state = 855; + this.state = 863; this.match(QuixosCapabilityParser.PROJECTION); - this.state = 856; + this.state = 864; this.identifier(); - this.state = 857; + this.state = 865; this.match(QuixosCapabilityParser.ID); - this.state = 858; + this.state = 866; this.stringLiteral(); - this.state = 859; + this.state = 867; this.cardinality(); - this.state = 861; + this.state = 869; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 104) { + if (_la === 105) { { - this.state = 860; + this.state = 868; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 865; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 72) { - { - this.state = 863; - this.match(QuixosCapabilityParser.ON_DELETE); - this.state = 864; - this.stringLiteral(); - } - } - - this.state = 868; + this.state = 873; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 73) { { - this.state = 867; - this.match(QuixosCapabilityParser.RETAIN_OTHER); - } - } - - this.state = 872; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 74) { - { - this.state = 870; - this.match(QuixosCapabilityParser.KEYED); this.state = 871; + this.match(QuixosCapabilityParser.ON_DELETE); + this.state = 872; this.stringLiteral(); } } - this.state = 875; + this.state = 876; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 74) { + { + this.state = 875; + this.match(QuixosCapabilityParser.RETAIN_OTHER); + } + } + + this.state = 880; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 75) { { - this.state = 874; + this.state = 878; + this.match(QuixosCapabilityParser.KEYED); + this.state = 879; + this.stringLiteral(); + } + } + + this.state = 883; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 76) { + { + this.state = 882; this.match(QuixosCapabilityParser.PUBLIC_TRAVERSAL); } } - this.state = 877; + this.state = 885; this.match(QuixosCapabilityParser.SEMI); } } @@ -3299,65 +3338,65 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 879; + this.state = 887; this.match(QuixosCapabilityParser.CONFORM); - this.state = 880; + this.state = 888; this.identifier(); - this.state = 881; + this.state = 889; this.match(QuixosCapabilityParser.AS); - this.state = 882; + this.state = 890; this.identifier(); - this.state = 884; + this.state = 892; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 135) { + if (_la === 136) { { - this.state = 883; + this.state = 891; this.typeArguments(); } } - this.state = 888; + this.state = 896; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 76) { + if (_la === 77) { { - this.state = 886; + this.state = 894; this.match(QuixosCapabilityParser.ID); - this.state = 887; + this.state = 895; this.stringLiteral(); } } - this.state = 892; + this.state = 900; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 71) { + if (_la === 72) { { - this.state = 890; + this.state = 898; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); - this.state = 891; + this.state = 899; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 894; + this.state = 902; this.match(QuixosCapabilityParser.LBRACE); - this.state = 898; + this.state = 906; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 2 || ((((_la - 50)) & ~0x1F) === 0 && ((1 << (_la - 50)) & 2057) !== 0)) { + while (_la === 3 || ((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & 2057) !== 0)) { { { - this.state = 895; + this.state = 903; this.conformanceItem(); } } - this.state = 900; + this.state = 908; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 901; + this.state = 909; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3378,43 +3417,43 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ConformanceItemContext(this.context, this.state); this.enterRule(localContext, 100, QuixosCapabilityParser.RULE_conformanceItem); try { - this.state = 909; + this.state = 917; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 81, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 82, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 903; + this.state = 911; this.match(QuixosCapabilityParser.PRIVATE); - this.state = 904; + this.state = 912; this.attachmentDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 905; + this.state = 913; this.operationBindingDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 906; + this.state = 914; this.stateFieldBindingDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 907; + this.state = 915; this.initializationDecl(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 908; + this.state = 916; this.relationshipMaterializationDecl(); } break; @@ -3440,27 +3479,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 911; + this.state = 919; this.match(QuixosCapabilityParser.INITIALIZE); - this.state = 912; + this.state = 920; this.match(QuixosCapabilityParser.LBRACE); - this.state = 916; + this.state = 924; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 268427264) !== 0) || _la === 39 || _la === 67 || _la === 141) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 68 || ((((_la - 87)) & ~0x1F) === 0 && ((1 << (_la - 87)) & 4099) !== 0) || _la === 142) { { { - this.state = 913; + this.state = 921; this.initializationField(); } } - this.state = 918; + this.state = 926; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 919; + this.state = 927; this.match(QuixosCapabilityParser.RBRACE); - this.state = 920; + this.state = 928; this.match(QuixosCapabilityParser.SEMI); } } @@ -3481,40 +3520,40 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new InitializationFieldContext(this.context, this.state); this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_initializationField); try { - this.state = 936; + this.state = 944; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 83, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 84, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 922; + this.state = 930; this.identifier(); - this.state = 923; + this.state = 931; this.match(QuixosCapabilityParser.TO); - this.state = 924; + this.state = 932; this.match(QuixosCapabilityParser.STATE); - this.state = 925; + this.state = 933; this.identifier(); - this.state = 926; + this.state = 934; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 928; + this.state = 936; this.identifier(); - this.state = 929; + this.state = 937; this.match(QuixosCapabilityParser.TO); - this.state = 930; + this.state = 938; this.match(QuixosCapabilityParser.EDGE); - this.state = 931; + this.state = 939; this.identifier(); - this.state = 932; + this.state = 940; this.match(QuixosCapabilityParser.DOT); - this.state = 933; + this.state = 941; this.identifier(); - this.state = 934; + this.state = 942; this.match(QuixosCapabilityParser.SEMI); } break; @@ -3540,29 +3579,29 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 938; + this.state = 946; this.interfaceType(); - this.state = 939; + this.state = 947; this.match(QuixosCapabilityParser.FROM); - this.state = 940; + this.state = 948; this.match(QuixosCapabilityParser.INPUT); - this.state = 945; + this.state = 953; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 128) { + while (_la === 129) { { { - this.state = 941; + this.state = 949; this.match(QuixosCapabilityParser.DOT); - this.state = 942; + this.state = 950; this.identifier(); } } - this.state = 947; + this.state = 955; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 948; + this.state = 956; this.match(QuixosCapabilityParser.SEMI); } } @@ -3585,17 +3624,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 950; + this.state = 958; this.match(QuixosCapabilityParser.BIND); - this.state = 951; + this.state = 959; this.identifier(); - this.state = 952; + this.state = 960; this.match(QuixosCapabilityParser.TO); - this.state = 953; + this.state = 961; this.match(QuixosCapabilityParser.STATE); - this.state = 954; + this.state = 962; this.identifier(); - this.state = 955; + this.state = 963; this.match(QuixosCapabilityParser.SEMI); } } @@ -3618,31 +3657,31 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 957; - this.match(QuixosCapabilityParser.MATERIALIZE); - this.state = 958; - this.identifier(); - this.state = 959; - this.match(QuixosCapabilityParser.IF); - this.state = 960; - this.match(QuixosCapabilityParser.ABSENT); - this.state = 961; - this.match(QuixosCapabilityParser.USING); - this.state = 962; - this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 963; - this.identifier(); - this.state = 964; - this.match(QuixosCapabilityParser.VIA); this.state = 965; - this.match(QuixosCapabilityParser.EDGE); + this.match(QuixosCapabilityParser.MATERIALIZE); this.state = 966; this.identifier(); this.state = 967; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.IF); this.state = 968; - this.identifier(); + this.match(QuixosCapabilityParser.ABSENT); this.state = 969; + this.match(QuixosCapabilityParser.USING); + this.state = 970; + this.match(QuixosCapabilityParser.CONSTRUCTOR); + this.state = 971; + this.identifier(); + this.state = 972; + this.match(QuixosCapabilityParser.VIA); + this.state = 973; + this.match(QuixosCapabilityParser.EDGE); + this.state = 974; + this.identifier(); + this.state = 975; + this.match(QuixosCapabilityParser.DOT); + this.state = 976; + this.identifier(); + this.state = 977; this.match(QuixosCapabilityParser.SEMI); } } @@ -3666,27 +3705,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 971; + this.state = 979; this.match(QuixosCapabilityParser.BIND); - this.state = 972; + this.state = 980; this.memberOperationRef(); - this.state = 973; + this.state = 981; this.match(QuixosCapabilityParser.TO); - this.state = 974; + this.state = 982; this.operationProvider(); - this.state = 977; + this.state = 985; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 28) { + if (_la === 29) { { - this.state = 975; + this.state = 983; this.match(QuixosCapabilityParser.QUERY_REASON); - this.state = 976; + this.state = 984; this.stringLiteral(); } } - this.state = 979; + this.state = 987; this.match(QuixosCapabilityParser.SEMI); } } @@ -3709,11 +3748,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 981; + this.state = 989; this.identifier(); - this.state = 982; + this.state = 990; this.match(QuixosCapabilityParser.DOT); - this.state = 983; + this.state = 991; this.operationName(); } } @@ -3734,105 +3773,93 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new OperationNameContext(this.context, this.state); this.enterRule(localContext, 116, QuixosCapabilityParser.RULE_operationName); try { - this.state = 996; + this.state = 1005; this.errorHandler.sync(this); - switch (this.tokenStream.LA(1)) { - case QuixosCapabilityParser.RESULT_BYTES: - case QuixosCapabilityParser.RPC_CALLS: - case QuixosCapabilityParser.DEADLINE_MS: - case QuixosCapabilityParser.QUERY: - case QuixosCapabilityParser.REFLECTION: - case QuixosCapabilityParser.SPECIALIZE: - case QuixosCapabilityParser.ROOT: - case QuixosCapabilityParser.DOCUMENT: - case QuixosCapabilityParser.FRAGMENTS: - case QuixosCapabilityParser.VIEW: - case QuixosCapabilityParser.MAX: - case QuixosCapabilityParser.ALLOW: - case QuixosCapabilityParser.POLL: - case QuixosCapabilityParser.QUERYABLE: - case QuixosCapabilityParser.RPC: - case QuixosCapabilityParser.INTERFACES: - case QuixosCapabilityParser.SOURCE: - case QuixosCapabilityParser.IDENTIFIER: + switch (this.interpreter.adaptivePredict(this.tokenStream, 87, this.context) ) { + case 1: this.enterOuterAlt(localContext, 1); { - this.state = 985; + this.state = 993; this.identifier(); } break; - case QuixosCapabilityParser.CALL: + case 2: this.enterOuterAlt(localContext, 2); { - this.state = 986; + this.state = 994; this.match(QuixosCapabilityParser.CALL); } break; - case QuixosCapabilityParser.GET: + case 3: this.enterOuterAlt(localContext, 3); { - this.state = 987; + this.state = 995; this.match(QuixosCapabilityParser.GET); } break; - case QuixosCapabilityParser.SET: + case 4: this.enterOuterAlt(localContext, 4); { - this.state = 988; + this.state = 996; this.match(QuixosCapabilityParser.SET); } break; - case QuixosCapabilityParser.RESOLVE: + case 5: this.enterOuterAlt(localContext, 5); { - this.state = 989; + this.state = 997; + this.match(QuixosCapabilityParser.EDIT); + } + break; + case 6: + this.enterOuterAlt(localContext, 6); + { + this.state = 998; this.match(QuixosCapabilityParser.RESOLVE); } break; - case QuixosCapabilityParser.CONNECT: - this.enterOuterAlt(localContext, 6); + case 7: + this.enterOuterAlt(localContext, 7); { - this.state = 990; + this.state = 999; this.match(QuixosCapabilityParser.CONNECT); } break; - case QuixosCapabilityParser.DISCONNECT: - this.enterOuterAlt(localContext, 7); + case 8: + this.enterOuterAlt(localContext, 8); { - this.state = 991; + this.state = 1000; this.match(QuixosCapabilityParser.DISCONNECT); } break; - case QuixosCapabilityParser.WATCH_START: - this.enterOuterAlt(localContext, 8); + case 9: + this.enterOuterAlt(localContext, 9); { - this.state = 992; + this.state = 1001; this.match(QuixosCapabilityParser.WATCH_START); } break; - case QuixosCapabilityParser.WATCH_STOP: - this.enterOuterAlt(localContext, 9); + case 10: + this.enterOuterAlt(localContext, 10); { - this.state = 993; + this.state = 1002; this.match(QuixosCapabilityParser.WATCH_STOP); } break; - case QuixosCapabilityParser.SUBSCRIBE: - this.enterOuterAlt(localContext, 10); + case 11: + this.enterOuterAlt(localContext, 11); { - this.state = 994; + this.state = 1003; this.match(QuixosCapabilityParser.SUBSCRIBE); } break; - case QuixosCapabilityParser.UNSUBSCRIBE: - this.enterOuterAlt(localContext, 11); + case 12: + this.enterOuterAlt(localContext, 12); { - this.state = 995; + this.state = 1004; this.match(QuixosCapabilityParser.UNSUBSCRIBE); } break; - default: - throw new antlr.NoViableAltException(this); } } catch (re) { @@ -3853,89 +3880,89 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 118, QuixosCapabilityParser.RULE_operationProvider); let _la: number; try { - this.state = 1028; + this.state = 1037; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 998; + this.state = 1007; this.match(QuixosCapabilityParser.STATE); - this.state = 999; + this.state = 1008; this.identifier(); - this.state = 1000; + this.state = 1009; this.match(QuixosCapabilityParser.DOT); - this.state = 1001; + this.state = 1010; this.statePrimitive(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 1003; + this.state = 1012; this.match(QuixosCapabilityParser.EDGE); - this.state = 1004; + this.state = 1013; this.identifier(); - this.state = 1005; + this.state = 1014; this.match(QuixosCapabilityParser.DOT); - this.state = 1006; + this.state = 1015; this.identifier(); - this.state = 1007; + this.state = 1016; this.match(QuixosCapabilityParser.DOT); - this.state = 1008; + this.state = 1017; this.edgePrimitive(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 3); { - this.state = 1010; + this.state = 1019; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 1011; + this.state = 1020; this.identifier(); - this.state = 1013; + this.state = 1022; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 135) { + if (_la === 136) { { - this.state = 1012; + this.state = 1021; this.typeArguments(); } } - this.state = 1015; + this.state = 1024; this.match(QuixosCapabilityParser.DOT); - this.state = 1016; + this.state = 1025; this.memberOperationRef(); } break; case QuixosCapabilityParser.PACKAGE: this.enterOuterAlt(localContext, 4); { - this.state = 1018; + this.state = 1027; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 1019; + this.state = 1028; this.identifier(); - this.state = 1020; + this.state = 1029; this.match(QuixosCapabilityParser.DOT); - this.state = 1021; + this.state = 1030; this.identifier(); - this.state = 1023; + this.state = 1032; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 135) { + if (_la === 136) { { - this.state = 1022; + this.state = 1031; this.typeArguments(); } } - this.state = 1026; + this.state = 1035; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 58) { + if (_la === 59) { { - this.state = 1025; + this.state = 1034; this.dependencyBindingBlock(); } } @@ -3966,9 +3993,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1030; + this.state = 1039; _la = this.tokenStream.LA(1); - if(!(((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 195) !== 0))) { + if(!(_la === 1 || ((((_la - 89)) & ~0x1F) === 0 && ((1 << (_la - 89)) & 195) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -3997,9 +4024,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1032; + this.state = 1041; _la = this.tokenStream.LA(1); - if(!(((((_la - 90)) & ~0x1F) === 0 && ((1 << (_la - 90)) & 55) !== 0))) { + if(!(((((_la - 91)) & ~0x1F) === 0 && ((1 << (_la - 91)) & 55) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4028,25 +4055,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1034; + this.state = 1043; this.match(QuixosCapabilityParser.WITH); - this.state = 1035; + this.state = 1044; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1039; + this.state = 1048; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 268427264) !== 0) || _la === 39 || _la === 67 || _la === 141) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 68 || ((((_la - 87)) & ~0x1F) === 0 && ((1 << (_la - 87)) & 4099) !== 0) || _la === 142) { { { - this.state = 1036; + this.state = 1045; this.dependencyBinding(); } } - this.state = 1041; + this.state = 1050; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1042; + this.state = 1051; this.match(QuixosCapabilityParser.RBRACE); } } @@ -4068,237 +4095,237 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 126, QuixosCapabilityParser.RULE_dependencyBinding); let _la: number; try { - this.state = 1140; + this.state = 1149; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 99, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 100, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1044; - this.identifier(); - this.state = 1045; - this.match(QuixosCapabilityParser.TO); - this.state = 1046; - this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 1047; - this.match(QuixosCapabilityParser.REFLECTION); - this.state = 1048; - this.match(QuixosCapabilityParser.LBRACK); - this.state = 1049; - this.identifierList(); - this.state = 1050; - this.match(QuixosCapabilityParser.RBRACK); - this.state = 1051; - this.match(QuixosCapabilityParser.SEMI); - } - break; - case 2: - this.enterOuterAlt(localContext, 2); - { this.state = 1053; this.identifier(); this.state = 1054; this.match(QuixosCapabilityParser.TO); this.state = 1055; - this.match(QuixosCapabilityParser.STATE); + this.match(QuixosCapabilityParser.WORKSPACE); this.state = 1056; + this.match(QuixosCapabilityParser.REFLECTION); + this.state = 1057; + this.match(QuixosCapabilityParser.LBRACK); + this.state = 1058; + this.identifierList(); + this.state = 1059; + this.match(QuixosCapabilityParser.RBRACK); + this.state = 1060; + this.match(QuixosCapabilityParser.SEMI); + } + break; + case 2: + this.enterOuterAlt(localContext, 2); + { + this.state = 1062; this.identifier(); this.state = 1063; + this.match(QuixosCapabilityParser.TO); + this.state = 1064; + this.match(QuixosCapabilityParser.STATE); + this.state = 1065; + this.identifier(); + this.state = 1072; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 60) { + if (_la === 61) { { - this.state = 1057; + this.state = 1066; this.match(QuixosCapabilityParser.VIA); - this.state = 1058; + this.state = 1067; this.match(QuixosCapabilityParser.EDGE); - this.state = 1059; + this.state = 1068; this.identifier(); - this.state = 1060; + this.state = 1069; this.match(QuixosCapabilityParser.DOT); - this.state = 1061; + this.state = 1070; this.identifier(); } } - this.state = 1065; + this.state = 1074; this.match(QuixosCapabilityParser.SEMI); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1067; + this.state = 1076; this.identifier(); - this.state = 1068; + this.state = 1077; this.match(QuixosCapabilityParser.TO); - this.state = 1069; + this.state = 1078; this.match(QuixosCapabilityParser.EDGE); - this.state = 1070; - this.identifier(); - this.state = 1071; - this.match(QuixosCapabilityParser.DOT); - this.state = 1072; - this.identifier(); this.state = 1079; + this.identifier(); + this.state = 1080; + this.match(QuixosCapabilityParser.DOT); + this.state = 1081; + this.identifier(); + this.state = 1088; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 60) { + if (_la === 61) { { - this.state = 1073; + this.state = 1082; this.match(QuixosCapabilityParser.VIA); - this.state = 1074; + this.state = 1083; this.match(QuixosCapabilityParser.EDGE); - this.state = 1075; + this.state = 1084; this.identifier(); - this.state = 1076; + this.state = 1085; this.match(QuixosCapabilityParser.DOT); - this.state = 1077; + this.state = 1086; this.identifier(); } } - this.state = 1081; + this.state = 1090; this.match(QuixosCapabilityParser.SEMI); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1083; + this.state = 1092; this.identifier(); - this.state = 1084; + this.state = 1093; this.match(QuixosCapabilityParser.TO); - this.state = 1085; + this.state = 1094; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 1086; + this.state = 1095; this.identifier(); - this.state = 1088; + this.state = 1097; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 135) { + if (_la === 136) { { - this.state = 1087; + this.state = 1096; this.typeArguments(); } } - this.state = 1096; + this.state = 1105; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 60) { + if (_la === 61) { { - this.state = 1090; + this.state = 1099; this.match(QuixosCapabilityParser.VIA); - this.state = 1091; + this.state = 1100; this.match(QuixosCapabilityParser.EDGE); - this.state = 1092; + this.state = 1101; this.identifier(); - this.state = 1093; + this.state = 1102; this.match(QuixosCapabilityParser.DOT); - this.state = 1094; + this.state = 1103; this.identifier(); } } - this.state = 1098; + this.state = 1107; this.match(QuixosCapabilityParser.SEMI); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1100; - this.identifier(); - this.state = 1101; - this.match(QuixosCapabilityParser.TO); - this.state = 1102; - this.match(QuixosCapabilityParser.CREATION); - this.state = 1103; - this.identifier(); - this.state = 1104; - this.match(QuixosCapabilityParser.WITH); - this.state = 1105; - this.match(QuixosCapabilityParser.LBRACE); this.state = 1109; + this.identifier(); + this.state = 1110; + this.match(QuixosCapabilityParser.TO); + this.state = 1111; + this.match(QuixosCapabilityParser.CREATION); + this.state = 1112; + this.identifier(); + this.state = 1113; + this.match(QuixosCapabilityParser.WITH); + this.state = 1114; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 1118; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 268427264) !== 0) || _la === 39 || _la === 67 || _la === 141) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 68 || ((((_la - 87)) & ~0x1F) === 0 && ((1 << (_la - 87)) & 4099) !== 0) || _la === 142) { { { - this.state = 1106; + this.state = 1115; this.creationOwnerMapping(); } } - this.state = 1111; + this.state = 1120; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1112; + this.state = 1121; this.match(QuixosCapabilityParser.RBRACE); - this.state = 1113; + this.state = 1122; this.match(QuixosCapabilityParser.SEMI); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1115; + this.state = 1124; this.identifier(); - this.state = 1116; + this.state = 1125; this.match(QuixosCapabilityParser.TO); - this.state = 1117; + this.state = 1126; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1118; + this.state = 1127; this.identifier(); - this.state = 1119; + this.state = 1128; this.match(QuixosCapabilityParser.SEMI); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 1121; + this.state = 1130; this.identifier(); - this.state = 1122; + this.state = 1131; this.match(QuixosCapabilityParser.TO); - this.state = 1124; + this.state = 1133; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 3) { + if (_la === 4) { { - this.state = 1123; + this.state = 1132; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 1126; + this.state = 1135; this.match(QuixosCapabilityParser.QUERY); - this.state = 1127; - this.identifier(); - this.state = 1128; - this.match(QuixosCapabilityParser.DOT); - this.state = 1129; - this.identifier(); this.state = 1136; + this.identifier(); + this.state = 1137; + this.match(QuixosCapabilityParser.DOT); + this.state = 1138; + this.identifier(); + this.state = 1145; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 60) { + if (_la === 61) { { - this.state = 1130; + this.state = 1139; this.match(QuixosCapabilityParser.VIA); - this.state = 1131; + this.state = 1140; this.match(QuixosCapabilityParser.EDGE); - this.state = 1132; + this.state = 1141; this.identifier(); - this.state = 1133; + this.state = 1142; this.match(QuixosCapabilityParser.DOT); - this.state = 1134; + this.state = 1143; this.identifier(); } } - this.state = 1138; + this.state = 1147; this.match(QuixosCapabilityParser.SEMI); } break; @@ -4324,29 +4351,29 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1142; + this.state = 1151; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1143; + this.state = 1152; this.identifier(); - this.state = 1144; + this.state = 1153; this.match(QuixosCapabilityParser.TO); - this.state = 1145; + this.state = 1154; this.identifier(); - this.state = 1146; + this.state = 1155; this.match(QuixosCapabilityParser.DOT); - this.state = 1147; + this.state = 1156; this.identifier(); - this.state = 1149; + this.state = 1158; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 58) { + if (_la === 59) { { - this.state = 1148; + this.state = 1157; this.dependencyBindingBlock(); } } - this.state = 1151; + this.state = 1160; this.match(QuixosCapabilityParser.SEMI); } } @@ -4368,7 +4395,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 130, QuixosCapabilityParser.RULE_valueType); let _la: number; try { - this.state = 1199; + this.state = 1208; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.BOOL: @@ -4381,133 +4408,145 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.UINT64: this.enterOuterAlt(localContext, 1); { - this.state = 1153; + this.state = 1162; this.scalarType(); } break; case QuixosCapabilityParser.UNIT: this.enterOuterAlt(localContext, 2); { - this.state = 1154; + this.state = 1163; this.match(QuixosCapabilityParser.UNIT); } break; case QuixosCapabilityParser.WATCH_HANDLE: this.enterOuterAlt(localContext, 3); { - this.state = 1155; + this.state = 1164; this.match(QuixosCapabilityParser.WATCH_HANDLE); } break; case QuixosCapabilityParser.MESSAGE: this.enterOuterAlt(localContext, 4); { - this.state = 1156; + this.state = 1165; this.match(QuixosCapabilityParser.MESSAGE); - this.state = 1157; + this.state = 1166; this.stringLiteral(); } break; case QuixosCapabilityParser.ATOM_REF: this.enterOuterAlt(localContext, 5); { - this.state = 1158; + this.state = 1167; this.match(QuixosCapabilityParser.ATOM_REF); - this.state = 1159; + this.state = 1168; this.match(QuixosCapabilityParser.LT); - this.state = 1160; + this.state = 1169; this.identifier(); - this.state = 1161; + this.state = 1170; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.INTERFACE_REF: this.enterOuterAlt(localContext, 6); { - this.state = 1163; + this.state = 1172; this.match(QuixosCapabilityParser.INTERFACE_REF); - this.state = 1164; + this.state = 1173; this.match(QuixosCapabilityParser.LT); - this.state = 1165; + this.state = 1174; this.identifier(); - this.state = 1167; + this.state = 1176; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 135) { + if (_la === 136) { { - this.state = 1166; + this.state = 1175; this.typeArguments(); } } - this.state = 1169; + this.state = 1178; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.REF: this.enterOuterAlt(localContext, 7); { - this.state = 1171; + this.state = 1180; this.match(QuixosCapabilityParser.REF); - this.state = 1172; + this.state = 1181; this.match(QuixosCapabilityParser.LT); - this.state = 1173; + this.state = 1182; this.identifier(); - this.state = 1174; + this.state = 1183; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.OPTIONAL: this.enterOuterAlt(localContext, 8); { - this.state = 1176; + this.state = 1185; this.match(QuixosCapabilityParser.OPTIONAL); - this.state = 1177; + this.state = 1186; this.match(QuixosCapabilityParser.LT); - this.state = 1178; + this.state = 1187; this.valueType(); - this.state = 1179; + this.state = 1188; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.LIST: this.enterOuterAlt(localContext, 9); { - this.state = 1181; + this.state = 1190; this.match(QuixosCapabilityParser.LIST); - this.state = 1182; + this.state = 1191; this.match(QuixosCapabilityParser.LT); - this.state = 1183; + this.state = 1192; this.valueType(); - this.state = 1184; + this.state = 1193; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.RECORD: this.enterOuterAlt(localContext, 10); { - this.state = 1186; + this.state = 1195; this.match(QuixosCapabilityParser.RECORD); - this.state = 1187; + this.state = 1196; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1191; + this.state = 1200; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 268427264) !== 0) || _la === 39 || _la === 67 || _la === 141) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 68 || ((((_la - 87)) & ~0x1F) === 0 && ((1 << (_la - 87)) & 4099) !== 0) || _la === 142) { { { - this.state = 1188; + this.state = 1197; this.recordField(); } } - this.state = 1193; + this.state = 1202; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1194; + this.state = 1203; this.match(QuixosCapabilityParser.RBRACE); } break; + case QuixosCapabilityParser.EDIT: + case QuixosCapabilityParser.CREATION: + case QuixosCapabilityParser.INITIALIZE: + case QuixosCapabilityParser.EXECUTION: + case QuixosCapabilityParser.SNAPSHOT: + case QuixosCapabilityParser.TRANSACTION: + case QuixosCapabilityParser.REMOTE: + case QuixosCapabilityParser.TARGETS: + case QuixosCapabilityParser.PORTABLE: + case QuixosCapabilityParser.REPLICA: + case QuixosCapabilityParser.LOCAL: + case QuixosCapabilityParser.FROM: case QuixosCapabilityParser.RESULT_BYTES: case QuixosCapabilityParser.RPC_CALLS: case QuixosCapabilityParser.DEADLINE_MS: @@ -4525,17 +4564,20 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.RPC: case QuixosCapabilityParser.INTERFACES: case QuixosCapabilityParser.SOURCE: + case QuixosCapabilityParser.START: + case QuixosCapabilityParser.STOP: + case QuixosCapabilityParser.REGISTER: case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 11); { - this.state = 1195; + this.state = 1204; this.identifier(); - this.state = 1197; + this.state = 1206; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 135) { + if (_la === 136) { { - this.state = 1196; + this.state = 1205; this.typeArguments(); } } @@ -4565,13 +4607,13 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1201; + this.state = 1210; this.identifier(); - this.state = 1202; + this.state = 1211; this.match(QuixosCapabilityParser.COLON); - this.state = 1203; + this.state = 1212; this.valueType(); - this.state = 1204; + this.state = 1213; this.match(QuixosCapabilityParser.SEMI); } } @@ -4595,9 +4637,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1206; + this.state = 1215; _la = this.tokenStream.LA(1); - if(!(((((_la - 113)) & ~0x1F) === 0 && ((1 << (_la - 113)) & 255) !== 0))) { + if(!(((((_la - 114)) & ~0x1F) === 0 && ((1 << (_la - 114)) & 255) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4626,9 +4668,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1208; + this.state = 1217; _la = this.tokenStream.LA(1); - if(!(((((_la - 100)) & ~0x1F) === 0 && ((1 << (_la - 100)) & 15) !== 0))) { + if(!(((((_la - 101)) & ~0x1F) === 0 && ((1 << (_la - 101)) & 15) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4654,62 +4696,62 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new JsonLiteralContext(this.context, this.state); this.enterRule(localContext, 138, QuixosCapabilityParser.RULE_jsonLiteral); try { - this.state = 1218; + this.state = 1227; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STRING_LITERAL: this.enterOuterAlt(localContext, 1); { - this.state = 1210; + this.state = 1219; this.stringLiteral(); } break; case QuixosCapabilityParser.INTEGER: this.enterOuterAlt(localContext, 2); { - this.state = 1211; + this.state = 1220; this.match(QuixosCapabilityParser.INTEGER); } break; case QuixosCapabilityParser.JSON_NUMBER: this.enterOuterAlt(localContext, 3); { - this.state = 1212; + this.state = 1221; this.match(QuixosCapabilityParser.JSON_NUMBER); } break; case QuixosCapabilityParser.TRUE: this.enterOuterAlt(localContext, 4); { - this.state = 1213; + this.state = 1222; this.match(QuixosCapabilityParser.TRUE); } break; case QuixosCapabilityParser.FALSE: this.enterOuterAlt(localContext, 5); { - this.state = 1214; + this.state = 1223; this.match(QuixosCapabilityParser.FALSE); } break; case QuixosCapabilityParser.NULL: this.enterOuterAlt(localContext, 6); { - this.state = 1215; + this.state = 1224; this.match(QuixosCapabilityParser.NULL); } break; case QuixosCapabilityParser.LBRACE: this.enterOuterAlt(localContext, 7); { - this.state = 1216; + this.state = 1225; this.jsonObject(); } break; case QuixosCapabilityParser.LBRACK: this.enterOuterAlt(localContext, 8); { - this.state = 1217; + this.state = 1226; this.jsonArray(); } break; @@ -4737,35 +4779,35 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1220; - this.match(QuixosCapabilityParser.LBRACE); this.state = 1229; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 1238; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 142) { + if (_la === 143) { { - this.state = 1221; + this.state = 1230; this.jsonMember(); - this.state = 1226; + this.state = 1235; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 127) { + while (_la === 128) { { { - this.state = 1222; + this.state = 1231; this.match(QuixosCapabilityParser.COMMA); - this.state = 1223; + this.state = 1232; this.jsonMember(); } } - this.state = 1228; + this.state = 1237; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1231; + this.state = 1240; this.match(QuixosCapabilityParser.RBRACE); } } @@ -4788,11 +4830,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1233; + this.state = 1242; this.stringLiteral(); - this.state = 1234; + this.state = 1243; this.match(QuixosCapabilityParser.COLON); - this.state = 1235; + this.state = 1244; this.jsonLiteral(); } } @@ -4816,35 +4858,35 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1237; - this.match(QuixosCapabilityParser.LBRACK); this.state = 1246; + this.match(QuixosCapabilityParser.LBRACK); + this.state = 1255; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (((((_la - 121)) & ~0x1F) === 0 && ((1 << (_la - 121)) & 2884871) !== 0)) { + if (((((_la - 122)) & ~0x1F) === 0 && ((1 << (_la - 122)) & 2884871) !== 0)) { { - this.state = 1238; + this.state = 1247; this.jsonLiteral(); - this.state = 1243; + this.state = 1252; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 127) { + while (_la === 128) { { { - this.state = 1239; + this.state = 1248; this.match(QuixosCapabilityParser.COMMA); - this.state = 1240; + this.state = 1249; this.jsonLiteral(); } } - this.state = 1245; + this.state = 1254; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1248; + this.state = 1257; this.match(QuixosCapabilityParser.RBRACK); } } @@ -4868,9 +4910,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1250; + this.state = 1259; _la = this.tokenStream.LA(1); - if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 268427264) !== 0) || _la === 39 || _la === 67 || _la === 141)) { + if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 68 || ((((_la - 87)) & ~0x1F) === 0 && ((1 << (_la - 87)) & 4099) !== 0) || _la === 142)) { this.errorHandler.recoverInline(this); } else { @@ -4898,7 +4940,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1252; + this.state = 1261; this.match(QuixosCapabilityParser.STRING_LITERAL); } } @@ -4917,7 +4959,7 @@ export class QuixosCapabilityParser extends antlr.Parser { } public static readonly _serializedATN: number[] = [ - 4,1,145,1255,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,146,1264,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, @@ -4949,454 +4991,459 @@ export class QuixosCapabilityParser extends antlr.Parser { 8,18,1,18,1,18,1,18,1,19,3,19,374,8,19,1,19,1,19,1,19,1,19,1,19, 1,19,1,19,1,19,5,19,384,8,19,10,19,12,19,387,9,19,1,19,1,19,1,20, 1,20,1,20,1,20,3,20,395,8,20,1,20,1,20,1,20,1,20,1,20,1,20,3,20, - 403,8,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20, - 3,20,416,8,20,1,21,3,21,419,8,21,1,21,1,21,1,21,1,21,1,21,1,21,1, - 21,1,21,3,21,429,8,21,1,21,1,21,3,21,433,8,21,1,21,1,21,5,21,437, - 8,21,10,21,12,21,440,9,21,1,21,1,21,1,22,1,22,3,22,446,8,22,1,23, - 1,23,1,23,1,23,3,23,452,8,23,1,23,1,23,1,23,1,23,1,23,1,23,3,23, + 403,8,20,1,20,1,20,1,20,1,20,1,20,1,20,3,20,411,8,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,3,20,424,8,20,1,21,3, + 21,427,8,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,3,21,437,8,21, + 1,21,1,21,3,21,441,8,21,1,21,1,21,5,21,445,8,21,10,21,12,21,448, + 9,21,1,21,1,21,1,22,1,22,3,22,454,8,22,1,23,1,23,1,23,1,23,3,23, 460,8,23,1,23,1,23,1,23,1,23,1,23,1,23,3,23,468,8,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,3,23,481,8,23,1,24,1, - 24,1,24,1,24,1,24,3,24,488,8,24,1,24,1,24,3,24,492,8,24,1,25,5,25, - 495,8,25,10,25,12,25,498,9,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25, - 1,25,3,25,508,8,25,1,25,1,25,5,25,512,8,25,10,25,12,25,515,9,25, - 1,25,1,25,1,26,1,26,1,26,1,26,1,26,3,26,524,8,26,1,27,1,27,1,27, - 3,27,529,8,27,1,27,1,27,1,27,1,27,3,27,535,8,27,1,27,1,27,1,27,1, - 27,1,27,1,27,1,27,5,27,544,8,27,10,27,12,27,547,9,27,1,27,1,27,1, - 28,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,29,1,29,1,29,1,29,1,29,1,29,1,29,3,29,573,8,29,1,29,1, + 23,1,23,1,23,1,23,3,23,476,8,23,1,23,1,23,1,23,1,23,1,23,1,23,1, + 23,1,23,1,23,1,23,1,23,3,23,489,8,23,1,24,1,24,1,24,1,24,1,24,3, + 24,496,8,24,1,24,1,24,3,24,500,8,24,1,25,5,25,503,8,25,10,25,12, + 25,506,9,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,3,25,516,8,25, + 1,25,1,25,5,25,520,8,25,10,25,12,25,523,9,25,1,25,1,25,1,26,1,26, + 1,26,1,26,1,26,3,26,532,8,26,1,27,1,27,1,27,3,27,537,8,27,1,27,1, + 27,1,27,1,27,3,27,543,8,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,5, + 27,552,8,27,10,27,12,27,555,9,27,1,27,1,27,1,28,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,29,1,29,1, + 29,1,29,1,29,1,29,1,29,3,29,581,8,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,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,1,29,1,29,1,29,1,29,3,29,600,8, - 29,1,30,1,30,1,30,3,30,605,8,30,1,30,1,30,1,30,1,30,1,30,1,30,1, - 30,1,30,1,30,3,30,616,8,30,1,30,3,30,619,8,30,1,30,1,30,1,30,3,30, - 624,8,30,1,30,1,30,1,31,1,31,1,31,3,31,631,8,31,1,31,1,31,1,31,1, - 31,1,31,1,31,1,31,3,31,640,8,31,1,31,3,31,643,8,31,1,31,1,31,1,32, - 1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,3,32,656,8,32,1,33,1,33, - 1,33,1,33,1,33,5,33,663,8,33,10,33,12,33,666,9,33,1,33,1,33,1,34, - 1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,3,34,679,8,34,1,34,1,34, - 1,35,1,35,1,35,1,36,1,36,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37, - 1,37,1,37,5,37,698,8,37,10,37,12,37,701,9,37,3,37,703,8,37,1,37, - 3,37,706,8,37,1,38,1,38,1,38,5,38,711,8,38,10,38,12,38,714,9,38, - 1,39,1,39,1,39,5,39,719,8,39,10,39,12,39,722,9,39,1,39,1,39,1,40, + 29,1,29,1,29,1,29,1,29,1,29,1,29,3,29,608,8,29,1,30,1,30,1,30,3, + 30,613,8,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,3,30,624, + 8,30,1,30,3,30,627,8,30,1,30,1,30,1,30,3,30,632,8,30,1,30,1,30,1, + 31,1,31,1,31,3,31,639,8,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,3, + 31,648,8,31,1,31,3,31,651,8,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32, + 1,32,1,32,1,32,1,32,3,32,664,8,32,1,33,1,33,1,33,1,33,1,33,5,33, + 671,8,33,10,33,12,33,674,9,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34, + 1,34,1,34,1,34,1,34,3,34,687,8,34,1,34,1,34,1,35,1,35,1,35,1,36, + 1,36,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,5,37,706, + 8,37,10,37,12,37,709,9,37,3,37,711,8,37,1,37,3,37,714,8,37,1,38, + 1,38,1,38,5,38,719,8,38,10,38,12,38,722,9,38,1,39,1,39,1,39,5,39, + 727,8,39,10,39,12,39,730,9,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40, 1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40, 1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40, - 1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,3,40,761,8,40,1,40,3,40, - 764,8,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40, - 1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,3,40,786,8,40,1,40, - 1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,3,40,800, - 8,40,1,41,1,41,1,41,1,41,5,41,806,8,41,10,41,12,41,809,9,41,1,41, - 1,41,1,42,1,42,1,43,1,43,1,43,1,44,1,44,3,44,820,8,44,1,45,1,45, - 1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,3,45,834,8,45, - 1,45,1,45,1,46,1,46,1,46,1,46,1,46,1,46,3,46,844,8,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,48,1,48,1,48, - 1,48,3,48,862,8,48,1,48,1,48,3,48,866,8,48,1,48,3,48,869,8,48,1, - 48,1,48,3,48,873,8,48,1,48,3,48,876,8,48,1,48,1,48,1,49,1,49,1,49, - 1,49,1,49,3,49,885,8,49,1,49,1,49,3,49,889,8,49,1,49,1,49,3,49,893, - 8,49,1,49,1,49,5,49,897,8,49,10,49,12,49,900,9,49,1,49,1,49,1,50, - 1,50,1,50,1,50,1,50,1,50,3,50,910,8,50,1,51,1,51,1,51,5,51,915,8, - 51,10,51,12,51,918,9,51,1,51,1,51,1,51,1,52,1,52,1,52,1,52,1,52, - 1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,3,52,937,8,52,1,53, - 1,53,1,53,1,53,1,53,5,53,944,8,53,10,53,12,53,947,9,53,1,53,1,53, - 1,54,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,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,3,56,978,8,56,1,56,1,56,1,57,1,57,1,57,1,57,1,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,997,8,58,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,1014,8,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,1024, - 8,59,1,59,3,59,1027,8,59,3,59,1029,8,59,1,60,1,60,1,61,1,61,1,62, - 1,62,1,62,5,62,1038,8,62,10,62,12,62,1041,9,62,1,62,1,62,1,63,1, + 1,40,1,40,1,40,1,40,3,40,769,8,40,1,40,3,40,772,8,40,1,40,1,40,1, + 40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1, + 40,1,40,1,40,1,40,1,40,3,40,794,8,40,1,40,1,40,1,40,1,40,1,40,1, + 40,1,40,1,40,1,40,1,40,1,40,1,40,3,40,808,8,40,1,41,1,41,1,41,1, + 41,5,41,814,8,41,10,41,12,41,817,9,41,1,41,1,41,1,42,1,42,1,43,1, + 43,1,43,1,44,1,44,3,44,828,8,44,1,45,1,45,1,45,1,45,1,45,1,45,1, + 45,1,45,1,45,1,45,1,45,1,45,3,45,842,8,45,1,45,1,45,1,46,1,46,1, + 46,1,46,1,46,1,46,3,46,852,8,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,48,1,48,1,48,1,48,3,48,870,8,48,1, + 48,1,48,3,48,874,8,48,1,48,3,48,877,8,48,1,48,1,48,3,48,881,8,48, + 1,48,3,48,884,8,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,3,49,893,8, + 49,1,49,1,49,3,49,897,8,49,1,49,1,49,3,49,901,8,49,1,49,1,49,5,49, + 905,8,49,10,49,12,49,908,9,49,1,49,1,49,1,50,1,50,1,50,1,50,1,50, + 1,50,3,50,918,8,50,1,51,1,51,1,51,5,51,923,8,51,10,51,12,51,926, + 9,51,1,51,1,51,1,51,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52, + 1,52,1,52,1,52,1,52,1,52,3,52,945,8,52,1,53,1,53,1,53,1,53,1,53, + 5,53,952,8,53,10,53,12,53,955,9,53,1,53,1,53,1,54,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,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,3,56,986,8,56, + 1,56,1,56,1,57,1,57,1,57,1,57,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,1006,8,58,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,1023,8,59, + 1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,1033,8,59,1,59,3,59, + 1036,8,59,3,59,1038,8,59,1,60,1,60,1,61,1,61,1,62,1,62,1,62,5,62, + 1047,8,62,10,62,12,62,1050,9,62,1,62,1,62,1,63,1,63,1,63,1,63,1, 63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1, - 63,1,63,1,63,1,63,1,63,3,63,1064,8,63,1,63,1,63,1,63,1,63,1,63,1, - 63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,3,63,1080,8,63,1,63,1, + 63,1,63,3,63,1073,8,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1, 63,1,63,1,63,1,63,1,63,1,63,3,63,1089,8,63,1,63,1,63,1,63,1,63,1, - 63,1,63,3,63,1097,8,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1, - 63,5,63,1108,8,63,10,63,12,63,1111,9,63,1,63,1,63,1,63,1,63,1,63, - 1,63,1,63,1,63,1,63,1,63,1,63,1,63,3,63,1125,8,63,1,63,1,63,1,63, - 1,63,1,63,1,63,1,63,1,63,1,63,1,63,3,63,1137,8,63,1,63,1,63,3,63, - 1141,8,63,1,64,1,64,1,64,1,64,1,64,1,64,1,64,3,64,1150,8,64,1,64, - 1,64,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65, - 1,65,1,65,3,65,1168,8,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65, - 1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,5,65, - 1190,8,65,10,65,12,65,1193,9,65,1,65,1,65,1,65,3,65,1198,8,65,3, - 65,1200,8,65,1,66,1,66,1,66,1,66,1,66,1,67,1,67,1,68,1,68,1,69,1, - 69,1,69,1,69,1,69,1,69,1,69,1,69,3,69,1219,8,69,1,70,1,70,1,70,1, - 70,5,70,1225,8,70,10,70,12,70,1228,9,70,3,70,1230,8,70,1,70,1,70, - 1,71,1,71,1,71,1,71,1,72,1,72,1,72,1,72,5,72,1242,8,72,10,72,12, - 72,1245,9,72,3,72,1247,8,72,1,72,1,72,1,73,1,73,1,74,1,74,1,74,0, - 0,75,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,0,9,2,0,9,9, - 27,27,1,0,5,6,1,0,93,97,2,0,88,92,94,95,2,0,88,89,94,95,2,0,90,92, - 94,95,1,0,113,120,1,0,100,103,4,0,13,27,39,39,67,67,141,141,1355, - 0,162,1,0,0,0,2,164,1,0,0,0,4,174,1,0,0,0,6,178,1,0,0,0,8,202,1, - 0,0,0,10,214,1,0,0,0,12,216,1,0,0,0,14,223,1,0,0,0,16,234,1,0,0, - 0,18,236,1,0,0,0,20,249,1,0,0,0,22,281,1,0,0,0,24,311,1,0,0,0,26, - 313,1,0,0,0,28,317,1,0,0,0,30,335,1,0,0,0,32,337,1,0,0,0,34,349, - 1,0,0,0,36,352,1,0,0,0,38,373,1,0,0,0,40,415,1,0,0,0,42,418,1,0, - 0,0,44,443,1,0,0,0,46,480,1,0,0,0,48,491,1,0,0,0,50,496,1,0,0,0, - 52,523,1,0,0,0,54,525,1,0,0,0,56,550,1,0,0,0,58,599,1,0,0,0,60,601, - 1,0,0,0,62,627,1,0,0,0,64,655,1,0,0,0,66,657,1,0,0,0,68,669,1,0, - 0,0,70,682,1,0,0,0,72,685,1,0,0,0,74,705,1,0,0,0,76,707,1,0,0,0, - 78,715,1,0,0,0,80,799,1,0,0,0,82,801,1,0,0,0,84,812,1,0,0,0,86,814, - 1,0,0,0,88,819,1,0,0,0,90,821,1,0,0,0,92,843,1,0,0,0,94,845,1,0, - 0,0,96,854,1,0,0,0,98,879,1,0,0,0,100,909,1,0,0,0,102,911,1,0,0, - 0,104,936,1,0,0,0,106,938,1,0,0,0,108,950,1,0,0,0,110,957,1,0,0, - 0,112,971,1,0,0,0,114,981,1,0,0,0,116,996,1,0,0,0,118,1028,1,0,0, - 0,120,1030,1,0,0,0,122,1032,1,0,0,0,124,1034,1,0,0,0,126,1140,1, - 0,0,0,128,1142,1,0,0,0,130,1199,1,0,0,0,132,1201,1,0,0,0,134,1206, - 1,0,0,0,136,1208,1,0,0,0,138,1218,1,0,0,0,140,1220,1,0,0,0,142,1233, - 1,0,0,0,144,1237,1,0,0,0,146,1250,1,0,0,0,148,1252,1,0,0,0,150,151, + 63,1,63,1,63,3,63,1098,8,63,1,63,1,63,1,63,1,63,1,63,1,63,3,63,1106, + 8,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,5,63,1117,8,63, + 10,63,12,63,1120,9,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1, + 63,1,63,1,63,1,63,3,63,1134,8,63,1,63,1,63,1,63,1,63,1,63,1,63,1, + 63,1,63,1,63,1,63,3,63,1146,8,63,1,63,1,63,3,63,1150,8,63,1,64,1, + 64,1,64,1,64,1,64,1,64,1,64,3,64,1159,8,64,1,64,1,64,1,65,1,65,1, + 65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65,1177, + 8,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65, + 1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,5,65,1199,8,65,10,65,12, + 65,1202,9,65,1,65,1,65,1,65,3,65,1207,8,65,3,65,1209,8,65,1,66,1, + 66,1,66,1,66,1,66,1,67,1,67,1,68,1,68,1,69,1,69,1,69,1,69,1,69,1, + 69,1,69,1,69,3,69,1228,8,69,1,70,1,70,1,70,1,70,5,70,1234,8,70,10, + 70,12,70,1237,9,70,3,70,1239,8,70,1,70,1,70,1,71,1,71,1,71,1,71, + 1,72,1,72,1,72,1,72,5,72,1251,8,72,10,72,12,72,1254,9,72,3,72,1256, + 8,72,1,72,1,72,1,73,1,73,1,74,1,74,1,74,0,0,75,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,0,9,2,0,10,10,28,28,1,0,6,7,1,0, + 94,98,3,0,1,1,89,93,95,96,3,0,1,1,89,90,95,96,2,0,91,93,95,96,1, + 0,114,121,1,0,101,104,7,0,1,3,5,28,40,40,68,68,87,88,99,99,142,142, + 1367,0,162,1,0,0,0,2,164,1,0,0,0,4,174,1,0,0,0,6,178,1,0,0,0,8,202, + 1,0,0,0,10,214,1,0,0,0,12,216,1,0,0,0,14,223,1,0,0,0,16,234,1,0, + 0,0,18,236,1,0,0,0,20,249,1,0,0,0,22,281,1,0,0,0,24,311,1,0,0,0, + 26,313,1,0,0,0,28,317,1,0,0,0,30,335,1,0,0,0,32,337,1,0,0,0,34,349, + 1,0,0,0,36,352,1,0,0,0,38,373,1,0,0,0,40,423,1,0,0,0,42,426,1,0, + 0,0,44,451,1,0,0,0,46,488,1,0,0,0,48,499,1,0,0,0,50,504,1,0,0,0, + 52,531,1,0,0,0,54,533,1,0,0,0,56,558,1,0,0,0,58,607,1,0,0,0,60,609, + 1,0,0,0,62,635,1,0,0,0,64,663,1,0,0,0,66,665,1,0,0,0,68,677,1,0, + 0,0,70,690,1,0,0,0,72,693,1,0,0,0,74,713,1,0,0,0,76,715,1,0,0,0, + 78,723,1,0,0,0,80,807,1,0,0,0,82,809,1,0,0,0,84,820,1,0,0,0,86,822, + 1,0,0,0,88,827,1,0,0,0,90,829,1,0,0,0,92,851,1,0,0,0,94,853,1,0, + 0,0,96,862,1,0,0,0,98,887,1,0,0,0,100,917,1,0,0,0,102,919,1,0,0, + 0,104,944,1,0,0,0,106,946,1,0,0,0,108,958,1,0,0,0,110,965,1,0,0, + 0,112,979,1,0,0,0,114,989,1,0,0,0,116,1005,1,0,0,0,118,1037,1,0, + 0,0,120,1039,1,0,0,0,122,1041,1,0,0,0,124,1043,1,0,0,0,126,1149, + 1,0,0,0,128,1151,1,0,0,0,130,1208,1,0,0,0,132,1210,1,0,0,0,134,1215, + 1,0,0,0,136,1217,1,0,0,0,138,1227,1,0,0,0,140,1229,1,0,0,0,142,1242, + 1,0,0,0,144,1246,1,0,0,0,146,1259,1,0,0,0,148,1261,1,0,0,0,150,151, 3,6,3,0,151,152,5,0,0,1,152,163,1,0,0,0,153,154,3,20,10,0,154,155, 5,0,0,1,155,163,1,0,0,0,156,157,3,50,25,0,157,158,5,0,0,1,158,163, 1,0,0,0,159,160,3,2,1,0,160,161,5,0,0,1,161,163,1,0,0,0,162,150, 1,0,0,0,162,153,1,0,0,0,162,156,1,0,0,0,162,159,1,0,0,0,163,1,1, - 0,0,0,164,165,5,34,0,0,165,169,5,129,0,0,166,168,3,8,4,0,167,166, + 0,0,0,164,165,5,35,0,0,165,169,5,130,0,0,166,168,3,8,4,0,167,166, 1,0,0,0,168,171,1,0,0,0,169,167,1,0,0,0,169,170,1,0,0,0,170,172, - 1,0,0,0,171,169,1,0,0,0,172,173,5,130,0,0,173,3,1,0,0,0,174,175, - 5,35,0,0,175,176,3,148,74,0,176,177,5,126,0,0,177,5,1,0,0,0,178, - 179,5,3,0,0,179,180,3,146,73,0,180,181,5,76,0,0,181,182,3,148,74, - 0,182,183,5,70,0,0,183,184,3,148,74,0,184,185,5,69,0,0,185,186,3, - 148,74,0,186,190,5,129,0,0,187,189,3,8,4,0,188,187,1,0,0,0,189,192, + 1,0,0,0,171,169,1,0,0,0,172,173,5,131,0,0,173,3,1,0,0,0,174,175, + 5,36,0,0,175,176,3,148,74,0,176,177,5,127,0,0,177,5,1,0,0,0,178, + 179,5,4,0,0,179,180,3,146,73,0,180,181,5,77,0,0,181,182,3,148,74, + 0,182,183,5,71,0,0,183,184,3,148,74,0,184,185,5,70,0,0,185,186,3, + 148,74,0,186,190,5,130,0,0,187,189,3,8,4,0,188,187,1,0,0,0,189,192, 1,0,0,0,190,188,1,0,0,0,190,191,1,0,0,0,191,193,1,0,0,0,192,190, - 1,0,0,0,193,194,5,130,0,0,194,7,1,0,0,0,195,203,3,4,2,0,196,203, + 1,0,0,0,193,194,5,131,0,0,194,7,1,0,0,0,195,203,3,4,2,0,196,203, 3,18,9,0,197,203,3,10,5,0,198,203,3,86,43,0,199,203,3,98,49,0,200, 203,3,128,64,0,201,203,3,32,16,0,202,195,1,0,0,0,202,196,1,0,0,0, 202,197,1,0,0,0,202,198,1,0,0,0,202,199,1,0,0,0,202,200,1,0,0,0, - 202,201,1,0,0,0,203,9,1,0,0,0,204,205,5,35,0,0,205,206,5,38,0,0, - 206,207,3,146,73,0,207,208,5,126,0,0,208,215,1,0,0,0,209,210,5,35, - 0,0,210,211,5,40,0,0,211,212,3,146,73,0,212,213,5,126,0,0,213,215, + 202,201,1,0,0,0,203,9,1,0,0,0,204,205,5,36,0,0,205,206,5,39,0,0, + 206,207,3,146,73,0,207,208,5,127,0,0,208,215,1,0,0,0,209,210,5,36, + 0,0,210,211,5,41,0,0,211,212,3,146,73,0,212,213,5,127,0,0,213,215, 1,0,0,0,214,204,1,0,0,0,214,209,1,0,0,0,215,11,1,0,0,0,216,217,5, - 36,0,0,217,218,5,37,0,0,218,219,3,146,73,0,219,220,5,76,0,0,220, - 221,3,148,74,0,221,222,5,126,0,0,222,13,1,0,0,0,223,224,5,36,0,0, - 224,225,5,38,0,0,225,226,3,146,73,0,226,227,5,70,0,0,227,228,3,148, - 74,0,228,229,5,126,0,0,229,15,1,0,0,0,230,235,3,10,5,0,231,235,3, + 37,0,0,217,218,5,38,0,0,218,219,3,146,73,0,219,220,5,77,0,0,220, + 221,3,148,74,0,221,222,5,127,0,0,222,13,1,0,0,0,223,224,5,37,0,0, + 224,225,5,39,0,0,225,226,3,146,73,0,226,227,5,71,0,0,227,228,3,148, + 74,0,228,229,5,127,0,0,229,15,1,0,0,0,230,235,3,10,5,0,231,235,3, 12,6,0,232,235,3,14,7,0,233,235,3,32,16,0,234,230,1,0,0,0,234,231, 1,0,0,0,234,232,1,0,0,0,234,233,1,0,0,0,235,17,1,0,0,0,236,237,5, - 37,0,0,237,238,3,146,73,0,238,239,5,76,0,0,239,242,3,148,74,0,240, - 241,5,77,0,0,241,243,3,148,74,0,242,240,1,0,0,0,242,243,1,0,0,0, - 243,244,1,0,0,0,244,245,5,126,0,0,245,19,1,0,0,0,246,248,3,16,8, + 38,0,0,237,238,3,146,73,0,238,239,5,77,0,0,239,242,3,148,74,0,240, + 241,5,78,0,0,241,243,3,148,74,0,242,240,1,0,0,0,242,243,1,0,0,0, + 243,244,1,0,0,0,244,245,5,127,0,0,245,19,1,0,0,0,246,248,3,16,8, 0,247,246,1,0,0,0,248,251,1,0,0,0,249,247,1,0,0,0,249,250,1,0,0, - 0,250,252,1,0,0,0,251,249,1,0,0,0,252,253,5,38,0,0,253,255,3,146, + 0,250,252,1,0,0,0,251,249,1,0,0,0,252,253,5,39,0,0,253,255,3,146, 73,0,254,256,3,22,11,0,255,254,1,0,0,0,255,256,1,0,0,0,256,257,1, - 0,0,0,257,258,5,76,0,0,258,259,3,148,74,0,259,260,5,70,0,0,260,270, - 3,148,74,0,261,262,5,81,0,0,262,267,3,26,13,0,263,264,5,127,0,0, + 0,0,0,257,258,5,77,0,0,258,259,3,148,74,0,259,260,5,71,0,0,260,270, + 3,148,74,0,261,262,5,82,0,0,262,267,3,26,13,0,263,264,5,128,0,0, 264,266,3,26,13,0,265,263,1,0,0,0,266,269,1,0,0,0,267,265,1,0,0, 0,267,268,1,0,0,0,268,271,1,0,0,0,269,267,1,0,0,0,270,261,1,0,0, - 0,270,271,1,0,0,0,271,272,1,0,0,0,272,276,5,129,0,0,273,275,3,34, + 0,270,271,1,0,0,0,271,272,1,0,0,0,272,276,5,130,0,0,273,275,3,34, 17,0,274,273,1,0,0,0,275,278,1,0,0,0,276,274,1,0,0,0,276,277,1,0, - 0,0,277,279,1,0,0,0,278,276,1,0,0,0,279,280,5,130,0,0,280,21,1,0, - 0,0,281,282,5,135,0,0,282,287,3,24,12,0,283,284,5,127,0,0,284,286, + 0,0,277,279,1,0,0,0,278,276,1,0,0,0,279,280,5,131,0,0,280,21,1,0, + 0,0,281,282,5,136,0,0,282,287,3,24,12,0,283,284,5,128,0,0,284,286, 3,24,12,0,285,283,1,0,0,0,286,289,1,0,0,0,287,285,1,0,0,0,287,288, - 1,0,0,0,288,290,1,0,0,0,289,287,1,0,0,0,290,291,5,136,0,0,291,23, - 1,0,0,0,292,293,5,41,0,0,293,296,3,146,73,0,294,295,5,125,0,0,295, - 297,5,31,0,0,296,294,1,0,0,0,296,297,1,0,0,0,297,312,1,0,0,0,298, - 299,5,30,0,0,299,309,3,146,73,0,300,301,5,32,0,0,301,306,3,26,13, - 0,302,303,5,137,0,0,303,305,3,26,13,0,304,302,1,0,0,0,305,308,1, + 1,0,0,0,288,290,1,0,0,0,289,287,1,0,0,0,290,291,5,137,0,0,291,23, + 1,0,0,0,292,293,5,42,0,0,293,296,3,146,73,0,294,295,5,126,0,0,295, + 297,5,32,0,0,296,294,1,0,0,0,296,297,1,0,0,0,297,312,1,0,0,0,298, + 299,5,31,0,0,299,309,3,146,73,0,300,301,5,33,0,0,301,306,3,26,13, + 0,302,303,5,138,0,0,303,305,3,26,13,0,304,302,1,0,0,0,305,308,1, 0,0,0,306,304,1,0,0,0,306,307,1,0,0,0,307,310,1,0,0,0,308,306,1, 0,0,0,309,300,1,0,0,0,309,310,1,0,0,0,310,312,1,0,0,0,311,292,1, 0,0,0,311,298,1,0,0,0,312,25,1,0,0,0,313,315,3,146,73,0,314,316, 3,28,14,0,315,314,1,0,0,0,315,316,1,0,0,0,316,27,1,0,0,0,317,318, - 5,135,0,0,318,323,3,30,15,0,319,320,5,127,0,0,320,322,3,30,15,0, + 5,136,0,0,318,323,3,30,15,0,319,320,5,128,0,0,320,322,3,30,15,0, 321,319,1,0,0,0,322,325,1,0,0,0,323,321,1,0,0,0,323,324,1,0,0,0, - 324,326,1,0,0,0,325,323,1,0,0,0,326,327,5,136,0,0,327,29,1,0,0,0, - 328,329,5,37,0,0,329,336,3,146,73,0,330,331,5,38,0,0,331,336,3,26, - 13,0,332,333,5,30,0,0,333,336,3,146,73,0,334,336,3,130,65,0,335, + 324,326,1,0,0,0,325,323,1,0,0,0,326,327,5,137,0,0,327,29,1,0,0,0, + 328,329,5,38,0,0,329,336,3,146,73,0,330,331,5,39,0,0,331,336,3,26, + 13,0,332,333,5,31,0,0,333,336,3,146,73,0,334,336,3,130,65,0,335, 328,1,0,0,0,335,330,1,0,0,0,335,332,1,0,0,0,335,334,1,0,0,0,336, - 31,1,0,0,0,337,338,5,29,0,0,338,340,3,146,73,0,339,341,3,22,11,0, - 340,339,1,0,0,0,340,341,1,0,0,0,341,342,1,0,0,0,342,343,5,138,0, - 0,343,344,3,130,65,0,344,345,5,126,0,0,345,33,1,0,0,0,346,350,3, + 31,1,0,0,0,337,338,5,30,0,0,338,340,3,146,73,0,339,341,3,22,11,0, + 340,339,1,0,0,0,340,341,1,0,0,0,341,342,1,0,0,0,342,343,5,139,0, + 0,343,344,3,130,65,0,344,345,5,127,0,0,345,33,1,0,0,0,346,350,3, 38,19,0,347,350,3,42,21,0,348,350,3,36,18,0,349,346,1,0,0,0,349, - 347,1,0,0,0,349,348,1,0,0,0,350,35,1,0,0,0,351,353,5,51,0,0,352, - 351,1,0,0,0,352,353,1,0,0,0,353,354,1,0,0,0,354,355,5,43,0,0,355, - 356,3,146,73,0,356,357,5,76,0,0,357,358,3,148,74,0,358,359,5,125, - 0,0,359,360,3,130,65,0,360,361,5,124,0,0,361,362,3,130,65,0,362, - 363,5,129,0,0,363,364,5,93,0,0,364,365,5,76,0,0,365,367,3,148,74, + 347,1,0,0,0,349,348,1,0,0,0,350,35,1,0,0,0,351,353,5,52,0,0,352, + 351,1,0,0,0,352,353,1,0,0,0,353,354,1,0,0,0,354,355,5,44,0,0,355, + 356,3,146,73,0,356,357,5,77,0,0,357,358,3,148,74,0,358,359,5,126, + 0,0,359,360,3,130,65,0,360,361,5,125,0,0,361,362,3,130,65,0,362, + 363,5,130,0,0,363,364,5,94,0,0,364,365,5,77,0,0,365,367,3,148,74, 0,366,368,3,64,32,0,367,366,1,0,0,0,367,368,1,0,0,0,368,369,1,0, - 0,0,369,370,5,126,0,0,370,371,5,130,0,0,371,37,1,0,0,0,372,374,3, + 0,0,369,370,5,127,0,0,370,371,5,131,0,0,371,37,1,0,0,0,372,374,3, 44,22,0,373,372,1,0,0,0,373,374,1,0,0,0,374,375,1,0,0,0,375,376, - 5,41,0,0,376,377,3,146,73,0,377,378,5,76,0,0,378,379,3,148,74,0, - 379,380,5,125,0,0,380,381,3,130,65,0,381,385,5,129,0,0,382,384,3, + 5,42,0,0,376,377,3,146,73,0,377,378,5,77,0,0,378,379,3,148,74,0, + 379,380,5,126,0,0,380,381,3,130,65,0,381,385,5,130,0,0,382,384,3, 40,20,0,383,382,1,0,0,0,384,387,1,0,0,0,385,383,1,0,0,0,385,386, - 1,0,0,0,386,388,1,0,0,0,387,385,1,0,0,0,388,389,5,130,0,0,389,39, - 1,0,0,0,390,391,5,83,0,0,391,392,5,76,0,0,392,394,3,148,74,0,393, + 1,0,0,0,386,388,1,0,0,0,387,385,1,0,0,0,388,389,5,131,0,0,389,39, + 1,0,0,0,390,391,5,84,0,0,391,392,5,77,0,0,392,394,3,148,74,0,393, 395,3,64,32,0,394,393,1,0,0,0,394,395,1,0,0,0,395,396,1,0,0,0,396, - 397,5,126,0,0,397,416,1,0,0,0,398,399,5,84,0,0,399,400,5,76,0,0, + 397,5,127,0,0,397,424,1,0,0,0,398,399,5,85,0,0,399,400,5,77,0,0, 400,402,3,148,74,0,401,403,3,64,32,0,402,401,1,0,0,0,402,403,1,0, - 0,0,403,404,1,0,0,0,404,405,5,126,0,0,405,416,1,0,0,0,406,407,5, - 85,0,0,407,408,5,86,0,0,408,409,5,76,0,0,409,410,3,148,74,0,410, - 411,5,87,0,0,411,412,5,76,0,0,412,413,3,148,74,0,413,414,5,126,0, - 0,414,416,1,0,0,0,415,390,1,0,0,0,415,398,1,0,0,0,415,406,1,0,0, - 0,416,41,1,0,0,0,417,419,3,44,22,0,418,417,1,0,0,0,418,419,1,0,0, - 0,419,420,1,0,0,0,420,421,5,42,0,0,421,422,3,146,73,0,422,423,5, - 76,0,0,423,424,3,148,74,0,424,425,5,125,0,0,425,426,3,136,68,0,426, - 428,3,48,24,0,427,429,5,104,0,0,428,427,1,0,0,0,428,429,1,0,0,0, - 429,432,1,0,0,0,430,431,5,74,0,0,431,433,3,148,74,0,432,430,1,0, - 0,0,432,433,1,0,0,0,433,434,1,0,0,0,434,438,5,129,0,0,435,437,3, - 46,23,0,436,435,1,0,0,0,437,440,1,0,0,0,438,436,1,0,0,0,438,439, - 1,0,0,0,439,441,1,0,0,0,440,438,1,0,0,0,441,442,5,130,0,0,442,43, - 1,0,0,0,443,445,5,26,0,0,444,446,7,0,0,0,445,444,1,0,0,0,445,446, - 1,0,0,0,446,45,1,0,0,0,447,448,5,90,0,0,448,449,5,76,0,0,449,451, - 3,148,74,0,450,452,3,64,32,0,451,450,1,0,0,0,451,452,1,0,0,0,452, - 453,1,0,0,0,453,454,5,126,0,0,454,481,1,0,0,0,455,456,5,91,0,0,456, - 457,5,76,0,0,457,459,3,148,74,0,458,460,3,64,32,0,459,458,1,0,0, - 0,459,460,1,0,0,0,460,461,1,0,0,0,461,462,5,126,0,0,462,481,1,0, - 0,0,463,464,5,92,0,0,464,465,5,76,0,0,465,467,3,148,74,0,466,468, - 3,64,32,0,467,466,1,0,0,0,467,468,1,0,0,0,468,469,1,0,0,0,469,470, - 5,126,0,0,470,481,1,0,0,0,471,472,5,85,0,0,472,473,5,86,0,0,473, - 474,5,76,0,0,474,475,3,148,74,0,475,476,5,87,0,0,476,477,5,76,0, - 0,477,478,3,148,74,0,478,479,5,126,0,0,479,481,1,0,0,0,480,447,1, - 0,0,0,480,455,1,0,0,0,480,463,1,0,0,0,480,471,1,0,0,0,481,47,1,0, - 0,0,482,483,5,37,0,0,483,492,3,146,73,0,484,485,5,38,0,0,485,487, - 3,146,73,0,486,488,3,28,14,0,487,486,1,0,0,0,487,488,1,0,0,0,488, - 492,1,0,0,0,489,490,5,30,0,0,490,492,3,146,73,0,491,482,1,0,0,0, - 491,484,1,0,0,0,491,489,1,0,0,0,492,49,1,0,0,0,493,495,3,16,8,0, - 494,493,1,0,0,0,495,498,1,0,0,0,496,494,1,0,0,0,496,497,1,0,0,0, - 497,499,1,0,0,0,498,496,1,0,0,0,499,500,5,40,0,0,500,501,3,146,73, - 0,501,502,5,76,0,0,502,503,3,148,74,0,503,504,5,70,0,0,504,507,3, - 148,74,0,505,506,5,71,0,0,506,508,5,139,0,0,507,505,1,0,0,0,507, - 508,1,0,0,0,508,509,1,0,0,0,509,513,5,129,0,0,510,512,3,52,26,0, - 511,510,1,0,0,0,512,515,1,0,0,0,513,511,1,0,0,0,513,514,1,0,0,0, - 514,516,1,0,0,0,515,513,1,0,0,0,516,517,5,130,0,0,517,51,1,0,0,0, - 518,524,3,60,30,0,519,524,3,62,31,0,520,524,3,68,34,0,521,524,3, - 54,27,0,522,524,3,56,28,0,523,518,1,0,0,0,523,519,1,0,0,0,523,520, - 1,0,0,0,523,521,1,0,0,0,523,522,1,0,0,0,524,53,1,0,0,0,525,526,5, - 16,0,0,526,528,3,146,73,0,527,529,3,22,11,0,528,527,1,0,0,0,528, - 529,1,0,0,0,529,530,1,0,0,0,530,531,5,76,0,0,531,532,3,148,74,0, - 532,534,5,19,0,0,533,535,5,3,0,0,534,533,1,0,0,0,534,535,1,0,0,0, - 535,536,1,0,0,0,536,537,3,26,13,0,537,538,5,20,0,0,538,539,3,148, - 74,0,539,540,5,43,0,0,540,541,3,148,74,0,541,545,5,129,0,0,542,544, - 3,58,29,0,543,542,1,0,0,0,544,547,1,0,0,0,545,543,1,0,0,0,545,546, - 1,0,0,0,546,548,1,0,0,0,547,545,1,0,0,0,548,549,5,130,0,0,549,55, - 1,0,0,0,550,551,5,16,0,0,551,552,3,146,73,0,552,553,5,76,0,0,553, - 554,3,148,74,0,554,555,5,18,0,0,555,556,3,146,73,0,556,557,3,28, - 14,0,557,558,5,126,0,0,558,57,1,0,0,0,559,560,5,10,0,0,560,600,5, - 126,0,0,561,562,5,11,0,0,562,563,5,12,0,0,563,564,3,146,73,0,564, - 565,5,126,0,0,565,600,1,0,0,0,566,567,5,21,0,0,567,568,3,148,74, - 0,568,569,5,126,0,0,569,600,1,0,0,0,570,572,5,22,0,0,571,573,5,30, - 0,0,572,571,1,0,0,0,572,573,1,0,0,0,573,574,1,0,0,0,574,575,3,146, - 73,0,575,576,5,49,0,0,576,577,3,26,13,0,577,578,5,126,0,0,578,600, - 1,0,0,0,579,580,5,23,0,0,580,581,3,146,73,0,581,582,5,139,0,0,582, - 583,5,126,0,0,583,600,1,0,0,0,584,585,5,24,0,0,585,586,3,26,13,0, - 586,587,5,128,0,0,587,588,3,146,73,0,588,589,3,146,73,0,589,590, - 3,148,74,0,590,591,5,126,0,0,591,600,1,0,0,0,592,593,5,85,0,0,593, - 600,5,126,0,0,594,595,5,25,0,0,595,596,5,139,0,0,596,597,3,148,74, - 0,597,598,5,126,0,0,598,600,1,0,0,0,599,559,1,0,0,0,599,561,1,0, - 0,0,599,566,1,0,0,0,599,570,1,0,0,0,599,579,1,0,0,0,599,584,1,0, - 0,0,599,592,1,0,0,0,599,594,1,0,0,0,600,59,1,0,0,0,601,602,5,43, - 0,0,602,604,3,146,73,0,603,605,3,22,11,0,604,603,1,0,0,0,604,605, - 1,0,0,0,605,606,1,0,0,0,606,607,5,76,0,0,607,608,3,148,74,0,608, - 609,5,125,0,0,609,610,3,130,65,0,610,611,5,124,0,0,611,612,3,130, - 65,0,612,613,5,78,0,0,613,615,3,72,36,0,614,616,3,64,32,0,615,614, - 1,0,0,0,615,616,1,0,0,0,616,618,1,0,0,0,617,619,3,70,35,0,618,617, - 1,0,0,0,618,619,1,0,0,0,619,620,1,0,0,0,620,621,5,80,0,0,621,623, - 3,74,37,0,622,624,3,78,39,0,623,622,1,0,0,0,623,624,1,0,0,0,624, - 625,1,0,0,0,625,626,5,126,0,0,626,61,1,0,0,0,627,628,5,44,0,0,628, - 630,3,146,73,0,629,631,3,22,11,0,630,629,1,0,0,0,630,631,1,0,0,0, - 631,632,1,0,0,0,632,633,5,76,0,0,633,634,3,148,74,0,634,635,5,125, - 0,0,635,636,3,130,65,0,636,637,5,124,0,0,637,639,3,130,65,0,638, - 640,3,64,32,0,639,638,1,0,0,0,639,640,1,0,0,0,640,642,1,0,0,0,641, - 643,3,78,39,0,642,641,1,0,0,0,642,643,1,0,0,0,643,644,1,0,0,0,644, - 645,5,126,0,0,645,63,1,0,0,0,646,647,5,4,0,0,647,656,5,7,0,0,648, - 649,5,4,0,0,649,650,7,1,0,0,650,651,5,8,0,0,651,652,5,131,0,0,652, - 653,3,76,38,0,653,654,5,132,0,0,654,656,1,0,0,0,655,646,1,0,0,0, - 655,648,1,0,0,0,656,65,1,0,0,0,657,658,5,59,0,0,658,659,5,131,0, - 0,659,664,3,114,57,0,660,661,5,127,0,0,661,663,3,114,57,0,662,660, - 1,0,0,0,663,666,1,0,0,0,664,662,1,0,0,0,664,665,1,0,0,0,665,667, - 1,0,0,0,666,664,1,0,0,0,667,668,5,132,0,0,668,67,1,0,0,0,669,670, - 5,45,0,0,670,671,3,146,73,0,671,672,5,76,0,0,672,673,3,148,74,0, - 673,674,5,46,0,0,674,675,3,146,73,0,675,676,5,125,0,0,676,678,3, - 130,65,0,677,679,3,78,39,0,678,677,1,0,0,0,678,679,1,0,0,0,679,680, - 1,0,0,0,680,681,5,126,0,0,681,69,1,0,0,0,682,683,5,79,0,0,683,684, - 3,130,65,0,684,71,1,0,0,0,685,686,7,2,0,0,686,73,1,0,0,0,687,706, - 5,82,0,0,688,689,5,37,0,0,689,706,3,146,73,0,690,691,5,30,0,0,691, - 706,3,146,73,0,692,693,5,39,0,0,693,702,5,131,0,0,694,699,3,26,13, - 0,695,696,5,127,0,0,696,698,3,26,13,0,697,695,1,0,0,0,698,701,1, - 0,0,0,699,697,1,0,0,0,699,700,1,0,0,0,700,703,1,0,0,0,701,699,1, - 0,0,0,702,694,1,0,0,0,702,703,1,0,0,0,703,704,1,0,0,0,704,706,5, - 132,0,0,705,687,1,0,0,0,705,688,1,0,0,0,705,690,1,0,0,0,705,692, - 1,0,0,0,706,75,1,0,0,0,707,712,3,146,73,0,708,709,5,127,0,0,709, - 711,3,146,73,0,710,708,1,0,0,0,711,714,1,0,0,0,712,710,1,0,0,0,712, - 713,1,0,0,0,713,77,1,0,0,0,714,712,1,0,0,0,715,716,5,81,0,0,716, - 720,5,129,0,0,717,719,3,80,40,0,718,717,1,0,0,0,719,722,1,0,0,0, - 720,718,1,0,0,0,720,721,1,0,0,0,721,723,1,0,0,0,722,720,1,0,0,0, - 723,724,5,130,0,0,724,79,1,0,0,0,725,726,5,17,0,0,726,727,3,146, - 73,0,727,728,5,76,0,0,728,729,3,148,74,0,729,730,5,131,0,0,730,731, - 3,76,38,0,731,732,5,132,0,0,732,733,5,126,0,0,733,800,1,0,0,0,734, - 735,5,55,0,0,735,736,3,146,73,0,736,737,5,76,0,0,737,738,3,148,74, - 0,738,739,5,125,0,0,739,740,3,130,65,0,740,741,3,82,41,0,741,742, - 5,126,0,0,742,800,1,0,0,0,743,744,5,56,0,0,744,745,3,146,73,0,745, - 746,5,76,0,0,746,747,3,148,74,0,747,748,5,125,0,0,748,749,3,136, - 68,0,749,750,3,48,24,0,750,751,3,82,41,0,751,752,5,126,0,0,752,800, - 1,0,0,0,753,754,5,38,0,0,754,755,3,146,73,0,755,756,5,76,0,0,756, - 757,3,148,74,0,757,758,5,125,0,0,758,760,3,146,73,0,759,761,3,28, - 14,0,760,759,1,0,0,0,760,761,1,0,0,0,761,763,1,0,0,0,762,764,3,66, - 33,0,763,762,1,0,0,0,763,764,1,0,0,0,764,765,1,0,0,0,765,766,5,126, - 0,0,766,800,1,0,0,0,767,768,5,1,0,0,768,769,3,146,73,0,769,770,5, - 76,0,0,770,771,3,148,74,0,771,772,5,125,0,0,772,773,3,146,73,0,773, - 774,5,47,0,0,774,775,3,130,65,0,775,776,5,126,0,0,776,800,1,0,0, - 0,777,778,5,45,0,0,778,779,3,146,73,0,779,780,5,76,0,0,780,781,3, - 148,74,0,781,782,5,125,0,0,782,785,3,146,73,0,783,784,5,47,0,0,784, - 786,3,130,65,0,785,783,1,0,0,0,785,786,1,0,0,0,786,787,1,0,0,0,787, - 788,5,126,0,0,788,800,1,0,0,0,789,790,5,16,0,0,790,791,3,146,73, - 0,791,792,5,76,0,0,792,793,3,148,74,0,793,794,5,125,0,0,794,795, - 3,146,73,0,795,796,5,128,0,0,796,797,3,146,73,0,797,798,5,126,0, - 0,798,800,1,0,0,0,799,725,1,0,0,0,799,734,1,0,0,0,799,743,1,0,0, - 0,799,753,1,0,0,0,799,767,1,0,0,0,799,777,1,0,0,0,799,789,1,0,0, - 0,800,81,1,0,0,0,801,802,5,131,0,0,802,807,3,84,42,0,803,804,5,127, - 0,0,804,806,3,84,42,0,805,803,1,0,0,0,806,809,1,0,0,0,807,805,1, - 0,0,0,807,808,1,0,0,0,808,810,1,0,0,0,809,807,1,0,0,0,810,811,5, - 132,0,0,811,83,1,0,0,0,812,813,7,3,0,0,813,85,1,0,0,0,814,815,5, - 54,0,0,815,816,3,88,44,0,816,87,1,0,0,0,817,820,3,90,45,0,818,820, - 3,94,47,0,819,817,1,0,0,0,819,818,1,0,0,0,820,89,1,0,0,0,821,822, - 5,55,0,0,822,823,3,146,73,0,823,824,5,76,0,0,824,825,3,148,74,0, - 825,826,5,64,0,0,826,827,3,146,73,0,827,828,5,125,0,0,828,829,3, - 130,65,0,829,830,5,65,0,0,830,833,3,92,46,0,831,832,5,66,0,0,832, - 834,3,138,69,0,833,831,1,0,0,0,833,834,1,0,0,0,834,835,1,0,0,0,835, - 836,5,126,0,0,836,91,1,0,0,0,837,844,5,98,0,0,838,839,5,99,0,0,839, - 840,5,133,0,0,840,841,3,130,65,0,841,842,5,134,0,0,842,844,1,0,0, - 0,843,837,1,0,0,0,843,838,1,0,0,0,844,93,1,0,0,0,845,846,5,56,0, - 0,846,847,3,146,73,0,847,848,5,76,0,0,848,849,3,148,74,0,849,850, - 5,129,0,0,850,851,3,96,48,0,851,852,3,96,48,0,852,853,5,130,0,0, - 853,95,1,0,0,0,854,855,3,48,24,0,855,856,5,57,0,0,856,857,3,146, - 73,0,857,858,5,76,0,0,858,859,3,148,74,0,859,861,3,136,68,0,860, - 862,5,104,0,0,861,860,1,0,0,0,861,862,1,0,0,0,862,865,1,0,0,0,863, - 864,5,72,0,0,864,866,3,148,74,0,865,863,1,0,0,0,865,866,1,0,0,0, - 866,868,1,0,0,0,867,869,5,73,0,0,868,867,1,0,0,0,868,869,1,0,0,0, - 869,872,1,0,0,0,870,871,5,74,0,0,871,873,3,148,74,0,872,870,1,0, - 0,0,872,873,1,0,0,0,873,875,1,0,0,0,874,876,5,75,0,0,875,874,1,0, - 0,0,875,876,1,0,0,0,876,877,1,0,0,0,877,878,5,126,0,0,878,97,1,0, - 0,0,879,880,5,48,0,0,880,881,3,146,73,0,881,882,5,49,0,0,882,884, - 3,146,73,0,883,885,3,28,14,0,884,883,1,0,0,0,884,885,1,0,0,0,885, - 888,1,0,0,0,886,887,5,76,0,0,887,889,3,148,74,0,888,886,1,0,0,0, - 888,889,1,0,0,0,889,892,1,0,0,0,890,891,5,71,0,0,891,893,5,139,0, - 0,892,890,1,0,0,0,892,893,1,0,0,0,893,894,1,0,0,0,894,898,5,129, - 0,0,895,897,3,100,50,0,896,895,1,0,0,0,897,900,1,0,0,0,898,896,1, - 0,0,0,898,899,1,0,0,0,899,901,1,0,0,0,900,898,1,0,0,0,901,902,5, - 130,0,0,902,99,1,0,0,0,903,904,5,53,0,0,904,910,3,88,44,0,905,910, - 3,112,56,0,906,910,3,108,54,0,907,910,3,102,51,0,908,910,3,110,55, - 0,909,903,1,0,0,0,909,905,1,0,0,0,909,906,1,0,0,0,909,907,1,0,0, - 0,909,908,1,0,0,0,910,101,1,0,0,0,911,912,5,2,0,0,912,916,5,129, - 0,0,913,915,3,104,52,0,914,913,1,0,0,0,915,918,1,0,0,0,916,914,1, - 0,0,0,916,917,1,0,0,0,917,919,1,0,0,0,918,916,1,0,0,0,919,920,5, - 130,0,0,920,921,5,126,0,0,921,103,1,0,0,0,922,923,3,146,73,0,923, - 924,5,52,0,0,924,925,5,55,0,0,925,926,3,146,73,0,926,927,5,126,0, - 0,927,937,1,0,0,0,928,929,3,146,73,0,929,930,5,52,0,0,930,931,5, - 56,0,0,931,932,3,146,73,0,932,933,5,128,0,0,933,934,3,146,73,0,934, - 935,5,126,0,0,935,937,1,0,0,0,936,922,1,0,0,0,936,928,1,0,0,0,937, - 105,1,0,0,0,938,939,3,26,13,0,939,940,5,12,0,0,940,945,5,47,0,0, - 941,942,5,128,0,0,942,944,3,146,73,0,943,941,1,0,0,0,944,947,1,0, - 0,0,945,943,1,0,0,0,945,946,1,0,0,0,946,948,1,0,0,0,947,945,1,0, - 0,0,948,949,5,126,0,0,949,107,1,0,0,0,950,951,5,50,0,0,951,952,3, - 146,73,0,952,953,5,52,0,0,953,954,5,55,0,0,954,955,3,146,73,0,955, - 956,5,126,0,0,956,109,1,0,0,0,957,958,5,61,0,0,958,959,3,146,73, - 0,959,960,5,62,0,0,960,961,5,63,0,0,961,962,5,59,0,0,962,963,5,45, - 0,0,963,964,3,146,73,0,964,965,5,60,0,0,965,966,5,56,0,0,966,967, - 3,146,73,0,967,968,5,128,0,0,968,969,3,146,73,0,969,970,5,126,0, - 0,970,111,1,0,0,0,971,972,5,50,0,0,972,973,3,114,57,0,973,974,5, - 52,0,0,974,977,3,118,59,0,975,976,5,28,0,0,976,978,3,148,74,0,977, - 975,1,0,0,0,977,978,1,0,0,0,978,979,1,0,0,0,979,980,5,126,0,0,980, - 113,1,0,0,0,981,982,3,146,73,0,982,983,5,128,0,0,983,984,3,116,58, - 0,984,115,1,0,0,0,985,997,3,146,73,0,986,997,5,93,0,0,987,997,5, - 83,0,0,988,997,5,84,0,0,989,997,5,90,0,0,990,997,5,91,0,0,991,997, - 5,92,0,0,992,997,5,94,0,0,993,997,5,95,0,0,994,997,5,96,0,0,995, - 997,5,97,0,0,996,985,1,0,0,0,996,986,1,0,0,0,996,987,1,0,0,0,996, - 988,1,0,0,0,996,989,1,0,0,0,996,990,1,0,0,0,996,991,1,0,0,0,996, - 992,1,0,0,0,996,993,1,0,0,0,996,994,1,0,0,0,996,995,1,0,0,0,997, - 117,1,0,0,0,998,999,5,55,0,0,999,1000,3,146,73,0,1000,1001,5,128, - 0,0,1001,1002,3,120,60,0,1002,1029,1,0,0,0,1003,1004,5,56,0,0,1004, - 1005,3,146,73,0,1005,1006,5,128,0,0,1006,1007,3,146,73,0,1007,1008, - 5,128,0,0,1008,1009,3,122,61,0,1009,1029,1,0,0,0,1010,1011,5,38, - 0,0,1011,1013,3,146,73,0,1012,1014,3,28,14,0,1013,1012,1,0,0,0,1013, - 1014,1,0,0,0,1014,1015,1,0,0,0,1015,1016,5,128,0,0,1016,1017,3,114, - 57,0,1017,1029,1,0,0,0,1018,1019,5,40,0,0,1019,1020,3,146,73,0,1020, - 1021,5,128,0,0,1021,1023,3,146,73,0,1022,1024,3,28,14,0,1023,1022, - 1,0,0,0,1023,1024,1,0,0,0,1024,1026,1,0,0,0,1025,1027,3,124,62,0, - 1026,1025,1,0,0,0,1026,1027,1,0,0,0,1027,1029,1,0,0,0,1028,998,1, - 0,0,0,1028,1003,1,0,0,0,1028,1010,1,0,0,0,1028,1018,1,0,0,0,1029, - 119,1,0,0,0,1030,1031,7,4,0,0,1031,121,1,0,0,0,1032,1033,7,5,0,0, - 1033,123,1,0,0,0,1034,1035,5,58,0,0,1035,1039,5,129,0,0,1036,1038, - 3,126,63,0,1037,1036,1,0,0,0,1038,1041,1,0,0,0,1039,1037,1,0,0,0, - 1039,1040,1,0,0,0,1040,1042,1,0,0,0,1041,1039,1,0,0,0,1042,1043, - 5,130,0,0,1043,125,1,0,0,0,1044,1045,3,146,73,0,1045,1046,5,52,0, - 0,1046,1047,5,3,0,0,1047,1048,5,17,0,0,1048,1049,5,131,0,0,1049, - 1050,3,76,38,0,1050,1051,5,132,0,0,1051,1052,5,126,0,0,1052,1141, - 1,0,0,0,1053,1054,3,146,73,0,1054,1055,5,52,0,0,1055,1056,5,55,0, - 0,1056,1063,3,146,73,0,1057,1058,5,60,0,0,1058,1059,5,56,0,0,1059, - 1060,3,146,73,0,1060,1061,5,128,0,0,1061,1062,3,146,73,0,1062,1064, - 1,0,0,0,1063,1057,1,0,0,0,1063,1064,1,0,0,0,1064,1065,1,0,0,0,1065, - 1066,5,126,0,0,1066,1141,1,0,0,0,1067,1068,3,146,73,0,1068,1069, - 5,52,0,0,1069,1070,5,56,0,0,1070,1071,3,146,73,0,1071,1072,5,128, - 0,0,1072,1079,3,146,73,0,1073,1074,5,60,0,0,1074,1075,5,56,0,0,1075, - 1076,3,146,73,0,1076,1077,5,128,0,0,1077,1078,3,146,73,0,1078,1080, - 1,0,0,0,1079,1073,1,0,0,0,1079,1080,1,0,0,0,1080,1081,1,0,0,0,1081, - 1082,5,126,0,0,1082,1141,1,0,0,0,1083,1084,3,146,73,0,1084,1085, - 5,52,0,0,1085,1086,5,38,0,0,1086,1088,3,146,73,0,1087,1089,3,28, - 14,0,1088,1087,1,0,0,0,1088,1089,1,0,0,0,1089,1096,1,0,0,0,1090, - 1091,5,60,0,0,1091,1092,5,56,0,0,1092,1093,3,146,73,0,1093,1094, - 5,128,0,0,1094,1095,3,146,73,0,1095,1097,1,0,0,0,1096,1090,1,0,0, - 0,1096,1097,1,0,0,0,1097,1098,1,0,0,0,1098,1099,5,126,0,0,1099,1141, - 1,0,0,0,1100,1101,3,146,73,0,1101,1102,5,52,0,0,1102,1103,5,1,0, - 0,1103,1104,3,146,73,0,1104,1105,5,58,0,0,1105,1109,5,129,0,0,1106, - 1108,3,106,53,0,1107,1106,1,0,0,0,1108,1111,1,0,0,0,1109,1107,1, - 0,0,0,1109,1110,1,0,0,0,1110,1112,1,0,0,0,1111,1109,1,0,0,0,1112, - 1113,5,130,0,0,1113,1114,5,126,0,0,1114,1141,1,0,0,0,1115,1116,3, - 146,73,0,1116,1117,5,52,0,0,1117,1118,5,45,0,0,1118,1119,3,146,73, - 0,1119,1120,5,126,0,0,1120,1141,1,0,0,0,1121,1122,3,146,73,0,1122, - 1124,5,52,0,0,1123,1125,5,3,0,0,1124,1123,1,0,0,0,1124,1125,1,0, - 0,0,1125,1126,1,0,0,0,1126,1127,5,16,0,0,1127,1128,3,146,73,0,1128, - 1129,5,128,0,0,1129,1136,3,146,73,0,1130,1131,5,60,0,0,1131,1132, - 5,56,0,0,1132,1133,3,146,73,0,1133,1134,5,128,0,0,1134,1135,3,146, - 73,0,1135,1137,1,0,0,0,1136,1130,1,0,0,0,1136,1137,1,0,0,0,1137, - 1138,1,0,0,0,1138,1139,5,126,0,0,1139,1141,1,0,0,0,1140,1044,1,0, - 0,0,1140,1053,1,0,0,0,1140,1067,1,0,0,0,1140,1083,1,0,0,0,1140,1100, - 1,0,0,0,1140,1115,1,0,0,0,1140,1121,1,0,0,0,1141,127,1,0,0,0,1142, - 1143,5,45,0,0,1143,1144,3,146,73,0,1144,1145,5,52,0,0,1145,1146, - 3,146,73,0,1146,1147,5,128,0,0,1147,1149,3,146,73,0,1148,1150,3, - 124,62,0,1149,1148,1,0,0,0,1149,1150,1,0,0,0,1150,1151,1,0,0,0,1151, - 1152,5,126,0,0,1152,129,1,0,0,0,1153,1200,3,134,67,0,1154,1200,5, - 105,0,0,1155,1200,5,106,0,0,1156,1157,5,107,0,0,1157,1200,3,148, - 74,0,1158,1159,5,108,0,0,1159,1160,5,135,0,0,1160,1161,3,146,73, - 0,1161,1162,5,136,0,0,1162,1200,1,0,0,0,1163,1164,5,109,0,0,1164, - 1165,5,135,0,0,1165,1167,3,146,73,0,1166,1168,3,28,14,0,1167,1166, - 1,0,0,0,1167,1168,1,0,0,0,1168,1169,1,0,0,0,1169,1170,5,136,0,0, - 1170,1200,1,0,0,0,1171,1172,5,33,0,0,1172,1173,5,135,0,0,1173,1174, - 3,146,73,0,1174,1175,5,136,0,0,1175,1200,1,0,0,0,1176,1177,5,110, - 0,0,1177,1178,5,135,0,0,1178,1179,3,130,65,0,1179,1180,5,136,0,0, - 1180,1200,1,0,0,0,1181,1182,5,111,0,0,1182,1183,5,135,0,0,1183,1184, - 3,130,65,0,1184,1185,5,136,0,0,1185,1200,1,0,0,0,1186,1187,5,112, - 0,0,1187,1191,5,129,0,0,1188,1190,3,132,66,0,1189,1188,1,0,0,0,1190, - 1193,1,0,0,0,1191,1189,1,0,0,0,1191,1192,1,0,0,0,1192,1194,1,0,0, - 0,1193,1191,1,0,0,0,1194,1200,5,130,0,0,1195,1197,3,146,73,0,1196, - 1198,3,28,14,0,1197,1196,1,0,0,0,1197,1198,1,0,0,0,1198,1200,1,0, - 0,0,1199,1153,1,0,0,0,1199,1154,1,0,0,0,1199,1155,1,0,0,0,1199,1156, - 1,0,0,0,1199,1158,1,0,0,0,1199,1163,1,0,0,0,1199,1171,1,0,0,0,1199, - 1176,1,0,0,0,1199,1181,1,0,0,0,1199,1186,1,0,0,0,1199,1195,1,0,0, - 0,1200,131,1,0,0,0,1201,1202,3,146,73,0,1202,1203,5,125,0,0,1203, - 1204,3,130,65,0,1204,1205,5,126,0,0,1205,133,1,0,0,0,1206,1207,7, - 6,0,0,1207,135,1,0,0,0,1208,1209,7,7,0,0,1209,137,1,0,0,0,1210,1219, - 3,148,74,0,1211,1219,5,139,0,0,1212,1219,5,140,0,0,1213,1219,5,121, - 0,0,1214,1219,5,122,0,0,1215,1219,5,123,0,0,1216,1219,3,140,70,0, - 1217,1219,3,144,72,0,1218,1210,1,0,0,0,1218,1211,1,0,0,0,1218,1212, - 1,0,0,0,1218,1213,1,0,0,0,1218,1214,1,0,0,0,1218,1215,1,0,0,0,1218, - 1216,1,0,0,0,1218,1217,1,0,0,0,1219,139,1,0,0,0,1220,1229,5,129, - 0,0,1221,1226,3,142,71,0,1222,1223,5,127,0,0,1223,1225,3,142,71, - 0,1224,1222,1,0,0,0,1225,1228,1,0,0,0,1226,1224,1,0,0,0,1226,1227, - 1,0,0,0,1227,1230,1,0,0,0,1228,1226,1,0,0,0,1229,1221,1,0,0,0,1229, - 1230,1,0,0,0,1230,1231,1,0,0,0,1231,1232,5,130,0,0,1232,141,1,0, - 0,0,1233,1234,3,148,74,0,1234,1235,5,125,0,0,1235,1236,3,138,69, - 0,1236,143,1,0,0,0,1237,1246,5,131,0,0,1238,1243,3,138,69,0,1239, - 1240,5,127,0,0,1240,1242,3,138,69,0,1241,1239,1,0,0,0,1242,1245, - 1,0,0,0,1243,1241,1,0,0,0,1243,1244,1,0,0,0,1244,1247,1,0,0,0,1245, - 1243,1,0,0,0,1246,1238,1,0,0,0,1246,1247,1,0,0,0,1247,1248,1,0,0, - 0,1248,1249,5,132,0,0,1249,145,1,0,0,0,1250,1251,7,8,0,0,1251,147, - 1,0,0,0,1252,1253,5,142,0,0,1253,149,1,0,0,0,110,162,169,190,202, - 214,234,242,249,255,267,270,276,287,296,306,309,311,315,323,335, - 340,349,352,367,373,385,394,402,415,418,428,432,438,445,451,459, - 467,480,487,491,496,507,513,523,528,534,545,572,599,604,615,618, - 623,630,639,642,655,664,678,699,702,705,712,720,760,763,785,799, - 807,819,833,843,861,865,868,872,875,884,888,892,898,909,916,936, - 945,977,996,1013,1023,1026,1028,1039,1063,1079,1088,1096,1109,1124, - 1136,1140,1149,1167,1191,1197,1199,1218,1226,1229,1243,1246 + 0,0,403,404,1,0,0,0,404,405,5,127,0,0,405,424,1,0,0,0,406,407,5, + 1,0,0,407,408,5,77,0,0,408,410,3,148,74,0,409,411,3,64,32,0,410, + 409,1,0,0,0,410,411,1,0,0,0,411,412,1,0,0,0,412,413,5,127,0,0,413, + 424,1,0,0,0,414,415,5,86,0,0,415,416,5,87,0,0,416,417,5,77,0,0,417, + 418,3,148,74,0,418,419,5,88,0,0,419,420,5,77,0,0,420,421,3,148,74, + 0,421,422,5,127,0,0,422,424,1,0,0,0,423,390,1,0,0,0,423,398,1,0, + 0,0,423,406,1,0,0,0,423,414,1,0,0,0,424,41,1,0,0,0,425,427,3,44, + 22,0,426,425,1,0,0,0,426,427,1,0,0,0,427,428,1,0,0,0,428,429,5,43, + 0,0,429,430,3,146,73,0,430,431,5,77,0,0,431,432,3,148,74,0,432,433, + 5,126,0,0,433,434,3,136,68,0,434,436,3,48,24,0,435,437,5,105,0,0, + 436,435,1,0,0,0,436,437,1,0,0,0,437,440,1,0,0,0,438,439,5,75,0,0, + 439,441,3,148,74,0,440,438,1,0,0,0,440,441,1,0,0,0,441,442,1,0,0, + 0,442,446,5,130,0,0,443,445,3,46,23,0,444,443,1,0,0,0,445,448,1, + 0,0,0,446,444,1,0,0,0,446,447,1,0,0,0,447,449,1,0,0,0,448,446,1, + 0,0,0,449,450,5,131,0,0,450,43,1,0,0,0,451,453,5,27,0,0,452,454, + 7,0,0,0,453,452,1,0,0,0,453,454,1,0,0,0,454,45,1,0,0,0,455,456,5, + 91,0,0,456,457,5,77,0,0,457,459,3,148,74,0,458,460,3,64,32,0,459, + 458,1,0,0,0,459,460,1,0,0,0,460,461,1,0,0,0,461,462,5,127,0,0,462, + 489,1,0,0,0,463,464,5,92,0,0,464,465,5,77,0,0,465,467,3,148,74,0, + 466,468,3,64,32,0,467,466,1,0,0,0,467,468,1,0,0,0,468,469,1,0,0, + 0,469,470,5,127,0,0,470,489,1,0,0,0,471,472,5,93,0,0,472,473,5,77, + 0,0,473,475,3,148,74,0,474,476,3,64,32,0,475,474,1,0,0,0,475,476, + 1,0,0,0,476,477,1,0,0,0,477,478,5,127,0,0,478,489,1,0,0,0,479,480, + 5,86,0,0,480,481,5,87,0,0,481,482,5,77,0,0,482,483,3,148,74,0,483, + 484,5,88,0,0,484,485,5,77,0,0,485,486,3,148,74,0,486,487,5,127,0, + 0,487,489,1,0,0,0,488,455,1,0,0,0,488,463,1,0,0,0,488,471,1,0,0, + 0,488,479,1,0,0,0,489,47,1,0,0,0,490,491,5,38,0,0,491,500,3,146, + 73,0,492,493,5,39,0,0,493,495,3,146,73,0,494,496,3,28,14,0,495,494, + 1,0,0,0,495,496,1,0,0,0,496,500,1,0,0,0,497,498,5,31,0,0,498,500, + 3,146,73,0,499,490,1,0,0,0,499,492,1,0,0,0,499,497,1,0,0,0,500,49, + 1,0,0,0,501,503,3,16,8,0,502,501,1,0,0,0,503,506,1,0,0,0,504,502, + 1,0,0,0,504,505,1,0,0,0,505,507,1,0,0,0,506,504,1,0,0,0,507,508, + 5,41,0,0,508,509,3,146,73,0,509,510,5,77,0,0,510,511,3,148,74,0, + 511,512,5,71,0,0,512,515,3,148,74,0,513,514,5,72,0,0,514,516,5,140, + 0,0,515,513,1,0,0,0,515,516,1,0,0,0,516,517,1,0,0,0,517,521,5,130, + 0,0,518,520,3,52,26,0,519,518,1,0,0,0,520,523,1,0,0,0,521,519,1, + 0,0,0,521,522,1,0,0,0,522,524,1,0,0,0,523,521,1,0,0,0,524,525,5, + 131,0,0,525,51,1,0,0,0,526,532,3,60,30,0,527,532,3,62,31,0,528,532, + 3,68,34,0,529,532,3,54,27,0,530,532,3,56,28,0,531,526,1,0,0,0,531, + 527,1,0,0,0,531,528,1,0,0,0,531,529,1,0,0,0,531,530,1,0,0,0,532, + 53,1,0,0,0,533,534,5,17,0,0,534,536,3,146,73,0,535,537,3,22,11,0, + 536,535,1,0,0,0,536,537,1,0,0,0,537,538,1,0,0,0,538,539,5,77,0,0, + 539,540,3,148,74,0,540,542,5,20,0,0,541,543,5,4,0,0,542,541,1,0, + 0,0,542,543,1,0,0,0,543,544,1,0,0,0,544,545,3,26,13,0,545,546,5, + 21,0,0,546,547,3,148,74,0,547,548,5,44,0,0,548,549,3,148,74,0,549, + 553,5,130,0,0,550,552,3,58,29,0,551,550,1,0,0,0,552,555,1,0,0,0, + 553,551,1,0,0,0,553,554,1,0,0,0,554,556,1,0,0,0,555,553,1,0,0,0, + 556,557,5,131,0,0,557,55,1,0,0,0,558,559,5,17,0,0,559,560,3,146, + 73,0,560,561,5,77,0,0,561,562,3,148,74,0,562,563,5,19,0,0,563,564, + 3,146,73,0,564,565,3,28,14,0,565,566,5,127,0,0,566,57,1,0,0,0,567, + 568,5,11,0,0,568,608,5,127,0,0,569,570,5,12,0,0,570,571,5,13,0,0, + 571,572,3,146,73,0,572,573,5,127,0,0,573,608,1,0,0,0,574,575,5,22, + 0,0,575,576,3,148,74,0,576,577,5,127,0,0,577,608,1,0,0,0,578,580, + 5,23,0,0,579,581,5,31,0,0,580,579,1,0,0,0,580,581,1,0,0,0,581,582, + 1,0,0,0,582,583,3,146,73,0,583,584,5,50,0,0,584,585,3,26,13,0,585, + 586,5,127,0,0,586,608,1,0,0,0,587,588,5,24,0,0,588,589,3,146,73, + 0,589,590,5,140,0,0,590,591,5,127,0,0,591,608,1,0,0,0,592,593,5, + 25,0,0,593,594,3,26,13,0,594,595,5,129,0,0,595,596,3,146,73,0,596, + 597,3,146,73,0,597,598,3,148,74,0,598,599,5,127,0,0,599,608,1,0, + 0,0,600,601,5,86,0,0,601,608,5,127,0,0,602,603,5,26,0,0,603,604, + 5,140,0,0,604,605,3,148,74,0,605,606,5,127,0,0,606,608,1,0,0,0,607, + 567,1,0,0,0,607,569,1,0,0,0,607,574,1,0,0,0,607,578,1,0,0,0,607, + 587,1,0,0,0,607,592,1,0,0,0,607,600,1,0,0,0,607,602,1,0,0,0,608, + 59,1,0,0,0,609,610,5,44,0,0,610,612,3,146,73,0,611,613,3,22,11,0, + 612,611,1,0,0,0,612,613,1,0,0,0,613,614,1,0,0,0,614,615,5,77,0,0, + 615,616,3,148,74,0,616,617,5,126,0,0,617,618,3,130,65,0,618,619, + 5,125,0,0,619,620,3,130,65,0,620,621,5,79,0,0,621,623,3,72,36,0, + 622,624,3,64,32,0,623,622,1,0,0,0,623,624,1,0,0,0,624,626,1,0,0, + 0,625,627,3,70,35,0,626,625,1,0,0,0,626,627,1,0,0,0,627,628,1,0, + 0,0,628,629,5,81,0,0,629,631,3,74,37,0,630,632,3,78,39,0,631,630, + 1,0,0,0,631,632,1,0,0,0,632,633,1,0,0,0,633,634,5,127,0,0,634,61, + 1,0,0,0,635,636,5,45,0,0,636,638,3,146,73,0,637,639,3,22,11,0,638, + 637,1,0,0,0,638,639,1,0,0,0,639,640,1,0,0,0,640,641,5,77,0,0,641, + 642,3,148,74,0,642,643,5,126,0,0,643,644,3,130,65,0,644,645,5,125, + 0,0,645,647,3,130,65,0,646,648,3,64,32,0,647,646,1,0,0,0,647,648, + 1,0,0,0,648,650,1,0,0,0,649,651,3,78,39,0,650,649,1,0,0,0,650,651, + 1,0,0,0,651,652,1,0,0,0,652,653,5,127,0,0,653,63,1,0,0,0,654,655, + 5,5,0,0,655,664,5,8,0,0,656,657,5,5,0,0,657,658,7,1,0,0,658,659, + 5,9,0,0,659,660,5,132,0,0,660,661,3,76,38,0,661,662,5,133,0,0,662, + 664,1,0,0,0,663,654,1,0,0,0,663,656,1,0,0,0,664,65,1,0,0,0,665,666, + 5,60,0,0,666,667,5,132,0,0,667,672,3,114,57,0,668,669,5,128,0,0, + 669,671,3,114,57,0,670,668,1,0,0,0,671,674,1,0,0,0,672,670,1,0,0, + 0,672,673,1,0,0,0,673,675,1,0,0,0,674,672,1,0,0,0,675,676,5,133, + 0,0,676,67,1,0,0,0,677,678,5,46,0,0,678,679,3,146,73,0,679,680,5, + 77,0,0,680,681,3,148,74,0,681,682,5,47,0,0,682,683,3,146,73,0,683, + 684,5,126,0,0,684,686,3,130,65,0,685,687,3,78,39,0,686,685,1,0,0, + 0,686,687,1,0,0,0,687,688,1,0,0,0,688,689,5,127,0,0,689,69,1,0,0, + 0,690,691,5,80,0,0,691,692,3,130,65,0,692,71,1,0,0,0,693,694,7,2, + 0,0,694,73,1,0,0,0,695,714,5,83,0,0,696,697,5,38,0,0,697,714,3,146, + 73,0,698,699,5,31,0,0,699,714,3,146,73,0,700,701,5,40,0,0,701,710, + 5,132,0,0,702,707,3,26,13,0,703,704,5,128,0,0,704,706,3,26,13,0, + 705,703,1,0,0,0,706,709,1,0,0,0,707,705,1,0,0,0,707,708,1,0,0,0, + 708,711,1,0,0,0,709,707,1,0,0,0,710,702,1,0,0,0,710,711,1,0,0,0, + 711,712,1,0,0,0,712,714,5,133,0,0,713,695,1,0,0,0,713,696,1,0,0, + 0,713,698,1,0,0,0,713,700,1,0,0,0,714,75,1,0,0,0,715,720,3,146,73, + 0,716,717,5,128,0,0,717,719,3,146,73,0,718,716,1,0,0,0,719,722,1, + 0,0,0,720,718,1,0,0,0,720,721,1,0,0,0,721,77,1,0,0,0,722,720,1,0, + 0,0,723,724,5,82,0,0,724,728,5,130,0,0,725,727,3,80,40,0,726,725, + 1,0,0,0,727,730,1,0,0,0,728,726,1,0,0,0,728,729,1,0,0,0,729,731, + 1,0,0,0,730,728,1,0,0,0,731,732,5,131,0,0,732,79,1,0,0,0,733,734, + 5,18,0,0,734,735,3,146,73,0,735,736,5,77,0,0,736,737,3,148,74,0, + 737,738,5,132,0,0,738,739,3,76,38,0,739,740,5,133,0,0,740,741,5, + 127,0,0,741,808,1,0,0,0,742,743,5,56,0,0,743,744,3,146,73,0,744, + 745,5,77,0,0,745,746,3,148,74,0,746,747,5,126,0,0,747,748,3,130, + 65,0,748,749,3,82,41,0,749,750,5,127,0,0,750,808,1,0,0,0,751,752, + 5,57,0,0,752,753,3,146,73,0,753,754,5,77,0,0,754,755,3,148,74,0, + 755,756,5,126,0,0,756,757,3,136,68,0,757,758,3,48,24,0,758,759,3, + 82,41,0,759,760,5,127,0,0,760,808,1,0,0,0,761,762,5,39,0,0,762,763, + 3,146,73,0,763,764,5,77,0,0,764,765,3,148,74,0,765,766,5,126,0,0, + 766,768,3,146,73,0,767,769,3,28,14,0,768,767,1,0,0,0,768,769,1,0, + 0,0,769,771,1,0,0,0,770,772,3,66,33,0,771,770,1,0,0,0,771,772,1, + 0,0,0,772,773,1,0,0,0,773,774,5,127,0,0,774,808,1,0,0,0,775,776, + 5,2,0,0,776,777,3,146,73,0,777,778,5,77,0,0,778,779,3,148,74,0,779, + 780,5,126,0,0,780,781,3,146,73,0,781,782,5,48,0,0,782,783,3,130, + 65,0,783,784,5,127,0,0,784,808,1,0,0,0,785,786,5,46,0,0,786,787, + 3,146,73,0,787,788,5,77,0,0,788,789,3,148,74,0,789,790,5,126,0,0, + 790,793,3,146,73,0,791,792,5,48,0,0,792,794,3,130,65,0,793,791,1, + 0,0,0,793,794,1,0,0,0,794,795,1,0,0,0,795,796,5,127,0,0,796,808, + 1,0,0,0,797,798,5,17,0,0,798,799,3,146,73,0,799,800,5,77,0,0,800, + 801,3,148,74,0,801,802,5,126,0,0,802,803,3,146,73,0,803,804,5,129, + 0,0,804,805,3,146,73,0,805,806,5,127,0,0,806,808,1,0,0,0,807,733, + 1,0,0,0,807,742,1,0,0,0,807,751,1,0,0,0,807,761,1,0,0,0,807,775, + 1,0,0,0,807,785,1,0,0,0,807,797,1,0,0,0,808,81,1,0,0,0,809,810,5, + 132,0,0,810,815,3,84,42,0,811,812,5,128,0,0,812,814,3,84,42,0,813, + 811,1,0,0,0,814,817,1,0,0,0,815,813,1,0,0,0,815,816,1,0,0,0,816, + 818,1,0,0,0,817,815,1,0,0,0,818,819,5,133,0,0,819,83,1,0,0,0,820, + 821,7,3,0,0,821,85,1,0,0,0,822,823,5,55,0,0,823,824,3,88,44,0,824, + 87,1,0,0,0,825,828,3,90,45,0,826,828,3,94,47,0,827,825,1,0,0,0,827, + 826,1,0,0,0,828,89,1,0,0,0,829,830,5,56,0,0,830,831,3,146,73,0,831, + 832,5,77,0,0,832,833,3,148,74,0,833,834,5,65,0,0,834,835,3,146,73, + 0,835,836,5,126,0,0,836,837,3,130,65,0,837,838,5,66,0,0,838,841, + 3,92,46,0,839,840,5,67,0,0,840,842,3,138,69,0,841,839,1,0,0,0,841, + 842,1,0,0,0,842,843,1,0,0,0,843,844,5,127,0,0,844,91,1,0,0,0,845, + 852,5,99,0,0,846,847,5,100,0,0,847,848,5,134,0,0,848,849,3,130,65, + 0,849,850,5,135,0,0,850,852,1,0,0,0,851,845,1,0,0,0,851,846,1,0, + 0,0,852,93,1,0,0,0,853,854,5,57,0,0,854,855,3,146,73,0,855,856,5, + 77,0,0,856,857,3,148,74,0,857,858,5,130,0,0,858,859,3,96,48,0,859, + 860,3,96,48,0,860,861,5,131,0,0,861,95,1,0,0,0,862,863,3,48,24,0, + 863,864,5,58,0,0,864,865,3,146,73,0,865,866,5,77,0,0,866,867,3,148, + 74,0,867,869,3,136,68,0,868,870,5,105,0,0,869,868,1,0,0,0,869,870, + 1,0,0,0,870,873,1,0,0,0,871,872,5,73,0,0,872,874,3,148,74,0,873, + 871,1,0,0,0,873,874,1,0,0,0,874,876,1,0,0,0,875,877,5,74,0,0,876, + 875,1,0,0,0,876,877,1,0,0,0,877,880,1,0,0,0,878,879,5,75,0,0,879, + 881,3,148,74,0,880,878,1,0,0,0,880,881,1,0,0,0,881,883,1,0,0,0,882, + 884,5,76,0,0,883,882,1,0,0,0,883,884,1,0,0,0,884,885,1,0,0,0,885, + 886,5,127,0,0,886,97,1,0,0,0,887,888,5,49,0,0,888,889,3,146,73,0, + 889,890,5,50,0,0,890,892,3,146,73,0,891,893,3,28,14,0,892,891,1, + 0,0,0,892,893,1,0,0,0,893,896,1,0,0,0,894,895,5,77,0,0,895,897,3, + 148,74,0,896,894,1,0,0,0,896,897,1,0,0,0,897,900,1,0,0,0,898,899, + 5,72,0,0,899,901,5,140,0,0,900,898,1,0,0,0,900,901,1,0,0,0,901,902, + 1,0,0,0,902,906,5,130,0,0,903,905,3,100,50,0,904,903,1,0,0,0,905, + 908,1,0,0,0,906,904,1,0,0,0,906,907,1,0,0,0,907,909,1,0,0,0,908, + 906,1,0,0,0,909,910,5,131,0,0,910,99,1,0,0,0,911,912,5,54,0,0,912, + 918,3,88,44,0,913,918,3,112,56,0,914,918,3,108,54,0,915,918,3,102, + 51,0,916,918,3,110,55,0,917,911,1,0,0,0,917,913,1,0,0,0,917,914, + 1,0,0,0,917,915,1,0,0,0,917,916,1,0,0,0,918,101,1,0,0,0,919,920, + 5,3,0,0,920,924,5,130,0,0,921,923,3,104,52,0,922,921,1,0,0,0,923, + 926,1,0,0,0,924,922,1,0,0,0,924,925,1,0,0,0,925,927,1,0,0,0,926, + 924,1,0,0,0,927,928,5,131,0,0,928,929,5,127,0,0,929,103,1,0,0,0, + 930,931,3,146,73,0,931,932,5,53,0,0,932,933,5,56,0,0,933,934,3,146, + 73,0,934,935,5,127,0,0,935,945,1,0,0,0,936,937,3,146,73,0,937,938, + 5,53,0,0,938,939,5,57,0,0,939,940,3,146,73,0,940,941,5,129,0,0,941, + 942,3,146,73,0,942,943,5,127,0,0,943,945,1,0,0,0,944,930,1,0,0,0, + 944,936,1,0,0,0,945,105,1,0,0,0,946,947,3,26,13,0,947,948,5,13,0, + 0,948,953,5,48,0,0,949,950,5,129,0,0,950,952,3,146,73,0,951,949, + 1,0,0,0,952,955,1,0,0,0,953,951,1,0,0,0,953,954,1,0,0,0,954,956, + 1,0,0,0,955,953,1,0,0,0,956,957,5,127,0,0,957,107,1,0,0,0,958,959, + 5,51,0,0,959,960,3,146,73,0,960,961,5,53,0,0,961,962,5,56,0,0,962, + 963,3,146,73,0,963,964,5,127,0,0,964,109,1,0,0,0,965,966,5,62,0, + 0,966,967,3,146,73,0,967,968,5,63,0,0,968,969,5,64,0,0,969,970,5, + 60,0,0,970,971,5,46,0,0,971,972,3,146,73,0,972,973,5,61,0,0,973, + 974,5,57,0,0,974,975,3,146,73,0,975,976,5,129,0,0,976,977,3,146, + 73,0,977,978,5,127,0,0,978,111,1,0,0,0,979,980,5,51,0,0,980,981, + 3,114,57,0,981,982,5,53,0,0,982,985,3,118,59,0,983,984,5,29,0,0, + 984,986,3,148,74,0,985,983,1,0,0,0,985,986,1,0,0,0,986,987,1,0,0, + 0,987,988,5,127,0,0,988,113,1,0,0,0,989,990,3,146,73,0,990,991,5, + 129,0,0,991,992,3,116,58,0,992,115,1,0,0,0,993,1006,3,146,73,0,994, + 1006,5,94,0,0,995,1006,5,84,0,0,996,1006,5,85,0,0,997,1006,5,1,0, + 0,998,1006,5,91,0,0,999,1006,5,92,0,0,1000,1006,5,93,0,0,1001,1006, + 5,95,0,0,1002,1006,5,96,0,0,1003,1006,5,97,0,0,1004,1006,5,98,0, + 0,1005,993,1,0,0,0,1005,994,1,0,0,0,1005,995,1,0,0,0,1005,996,1, + 0,0,0,1005,997,1,0,0,0,1005,998,1,0,0,0,1005,999,1,0,0,0,1005,1000, + 1,0,0,0,1005,1001,1,0,0,0,1005,1002,1,0,0,0,1005,1003,1,0,0,0,1005, + 1004,1,0,0,0,1006,117,1,0,0,0,1007,1008,5,56,0,0,1008,1009,3,146, + 73,0,1009,1010,5,129,0,0,1010,1011,3,120,60,0,1011,1038,1,0,0,0, + 1012,1013,5,57,0,0,1013,1014,3,146,73,0,1014,1015,5,129,0,0,1015, + 1016,3,146,73,0,1016,1017,5,129,0,0,1017,1018,3,122,61,0,1018,1038, + 1,0,0,0,1019,1020,5,39,0,0,1020,1022,3,146,73,0,1021,1023,3,28,14, + 0,1022,1021,1,0,0,0,1022,1023,1,0,0,0,1023,1024,1,0,0,0,1024,1025, + 5,129,0,0,1025,1026,3,114,57,0,1026,1038,1,0,0,0,1027,1028,5,41, + 0,0,1028,1029,3,146,73,0,1029,1030,5,129,0,0,1030,1032,3,146,73, + 0,1031,1033,3,28,14,0,1032,1031,1,0,0,0,1032,1033,1,0,0,0,1033,1035, + 1,0,0,0,1034,1036,3,124,62,0,1035,1034,1,0,0,0,1035,1036,1,0,0,0, + 1036,1038,1,0,0,0,1037,1007,1,0,0,0,1037,1012,1,0,0,0,1037,1019, + 1,0,0,0,1037,1027,1,0,0,0,1038,119,1,0,0,0,1039,1040,7,4,0,0,1040, + 121,1,0,0,0,1041,1042,7,5,0,0,1042,123,1,0,0,0,1043,1044,5,59,0, + 0,1044,1048,5,130,0,0,1045,1047,3,126,63,0,1046,1045,1,0,0,0,1047, + 1050,1,0,0,0,1048,1046,1,0,0,0,1048,1049,1,0,0,0,1049,1051,1,0,0, + 0,1050,1048,1,0,0,0,1051,1052,5,131,0,0,1052,125,1,0,0,0,1053,1054, + 3,146,73,0,1054,1055,5,53,0,0,1055,1056,5,4,0,0,1056,1057,5,18,0, + 0,1057,1058,5,132,0,0,1058,1059,3,76,38,0,1059,1060,5,133,0,0,1060, + 1061,5,127,0,0,1061,1150,1,0,0,0,1062,1063,3,146,73,0,1063,1064, + 5,53,0,0,1064,1065,5,56,0,0,1065,1072,3,146,73,0,1066,1067,5,61, + 0,0,1067,1068,5,57,0,0,1068,1069,3,146,73,0,1069,1070,5,129,0,0, + 1070,1071,3,146,73,0,1071,1073,1,0,0,0,1072,1066,1,0,0,0,1072,1073, + 1,0,0,0,1073,1074,1,0,0,0,1074,1075,5,127,0,0,1075,1150,1,0,0,0, + 1076,1077,3,146,73,0,1077,1078,5,53,0,0,1078,1079,5,57,0,0,1079, + 1080,3,146,73,0,1080,1081,5,129,0,0,1081,1088,3,146,73,0,1082,1083, + 5,61,0,0,1083,1084,5,57,0,0,1084,1085,3,146,73,0,1085,1086,5,129, + 0,0,1086,1087,3,146,73,0,1087,1089,1,0,0,0,1088,1082,1,0,0,0,1088, + 1089,1,0,0,0,1089,1090,1,0,0,0,1090,1091,5,127,0,0,1091,1150,1,0, + 0,0,1092,1093,3,146,73,0,1093,1094,5,53,0,0,1094,1095,5,39,0,0,1095, + 1097,3,146,73,0,1096,1098,3,28,14,0,1097,1096,1,0,0,0,1097,1098, + 1,0,0,0,1098,1105,1,0,0,0,1099,1100,5,61,0,0,1100,1101,5,57,0,0, + 1101,1102,3,146,73,0,1102,1103,5,129,0,0,1103,1104,3,146,73,0,1104, + 1106,1,0,0,0,1105,1099,1,0,0,0,1105,1106,1,0,0,0,1106,1107,1,0,0, + 0,1107,1108,5,127,0,0,1108,1150,1,0,0,0,1109,1110,3,146,73,0,1110, + 1111,5,53,0,0,1111,1112,5,2,0,0,1112,1113,3,146,73,0,1113,1114,5, + 59,0,0,1114,1118,5,130,0,0,1115,1117,3,106,53,0,1116,1115,1,0,0, + 0,1117,1120,1,0,0,0,1118,1116,1,0,0,0,1118,1119,1,0,0,0,1119,1121, + 1,0,0,0,1120,1118,1,0,0,0,1121,1122,5,131,0,0,1122,1123,5,127,0, + 0,1123,1150,1,0,0,0,1124,1125,3,146,73,0,1125,1126,5,53,0,0,1126, + 1127,5,46,0,0,1127,1128,3,146,73,0,1128,1129,5,127,0,0,1129,1150, + 1,0,0,0,1130,1131,3,146,73,0,1131,1133,5,53,0,0,1132,1134,5,4,0, + 0,1133,1132,1,0,0,0,1133,1134,1,0,0,0,1134,1135,1,0,0,0,1135,1136, + 5,17,0,0,1136,1137,3,146,73,0,1137,1138,5,129,0,0,1138,1145,3,146, + 73,0,1139,1140,5,61,0,0,1140,1141,5,57,0,0,1141,1142,3,146,73,0, + 1142,1143,5,129,0,0,1143,1144,3,146,73,0,1144,1146,1,0,0,0,1145, + 1139,1,0,0,0,1145,1146,1,0,0,0,1146,1147,1,0,0,0,1147,1148,5,127, + 0,0,1148,1150,1,0,0,0,1149,1053,1,0,0,0,1149,1062,1,0,0,0,1149,1076, + 1,0,0,0,1149,1092,1,0,0,0,1149,1109,1,0,0,0,1149,1124,1,0,0,0,1149, + 1130,1,0,0,0,1150,127,1,0,0,0,1151,1152,5,46,0,0,1152,1153,3,146, + 73,0,1153,1154,5,53,0,0,1154,1155,3,146,73,0,1155,1156,5,129,0,0, + 1156,1158,3,146,73,0,1157,1159,3,124,62,0,1158,1157,1,0,0,0,1158, + 1159,1,0,0,0,1159,1160,1,0,0,0,1160,1161,5,127,0,0,1161,129,1,0, + 0,0,1162,1209,3,134,67,0,1163,1209,5,106,0,0,1164,1209,5,107,0,0, + 1165,1166,5,108,0,0,1166,1209,3,148,74,0,1167,1168,5,109,0,0,1168, + 1169,5,136,0,0,1169,1170,3,146,73,0,1170,1171,5,137,0,0,1171,1209, + 1,0,0,0,1172,1173,5,110,0,0,1173,1174,5,136,0,0,1174,1176,3,146, + 73,0,1175,1177,3,28,14,0,1176,1175,1,0,0,0,1176,1177,1,0,0,0,1177, + 1178,1,0,0,0,1178,1179,5,137,0,0,1179,1209,1,0,0,0,1180,1181,5,34, + 0,0,1181,1182,5,136,0,0,1182,1183,3,146,73,0,1183,1184,5,137,0,0, + 1184,1209,1,0,0,0,1185,1186,5,111,0,0,1186,1187,5,136,0,0,1187,1188, + 3,130,65,0,1188,1189,5,137,0,0,1189,1209,1,0,0,0,1190,1191,5,112, + 0,0,1191,1192,5,136,0,0,1192,1193,3,130,65,0,1193,1194,5,137,0,0, + 1194,1209,1,0,0,0,1195,1196,5,113,0,0,1196,1200,5,130,0,0,1197,1199, + 3,132,66,0,1198,1197,1,0,0,0,1199,1202,1,0,0,0,1200,1198,1,0,0,0, + 1200,1201,1,0,0,0,1201,1203,1,0,0,0,1202,1200,1,0,0,0,1203,1209, + 5,131,0,0,1204,1206,3,146,73,0,1205,1207,3,28,14,0,1206,1205,1,0, + 0,0,1206,1207,1,0,0,0,1207,1209,1,0,0,0,1208,1162,1,0,0,0,1208,1163, + 1,0,0,0,1208,1164,1,0,0,0,1208,1165,1,0,0,0,1208,1167,1,0,0,0,1208, + 1172,1,0,0,0,1208,1180,1,0,0,0,1208,1185,1,0,0,0,1208,1190,1,0,0, + 0,1208,1195,1,0,0,0,1208,1204,1,0,0,0,1209,131,1,0,0,0,1210,1211, + 3,146,73,0,1211,1212,5,126,0,0,1212,1213,3,130,65,0,1213,1214,5, + 127,0,0,1214,133,1,0,0,0,1215,1216,7,6,0,0,1216,135,1,0,0,0,1217, + 1218,7,7,0,0,1218,137,1,0,0,0,1219,1228,3,148,74,0,1220,1228,5,140, + 0,0,1221,1228,5,141,0,0,1222,1228,5,122,0,0,1223,1228,5,123,0,0, + 1224,1228,5,124,0,0,1225,1228,3,140,70,0,1226,1228,3,144,72,0,1227, + 1219,1,0,0,0,1227,1220,1,0,0,0,1227,1221,1,0,0,0,1227,1222,1,0,0, + 0,1227,1223,1,0,0,0,1227,1224,1,0,0,0,1227,1225,1,0,0,0,1227,1226, + 1,0,0,0,1228,139,1,0,0,0,1229,1238,5,130,0,0,1230,1235,3,142,71, + 0,1231,1232,5,128,0,0,1232,1234,3,142,71,0,1233,1231,1,0,0,0,1234, + 1237,1,0,0,0,1235,1233,1,0,0,0,1235,1236,1,0,0,0,1236,1239,1,0,0, + 0,1237,1235,1,0,0,0,1238,1230,1,0,0,0,1238,1239,1,0,0,0,1239,1240, + 1,0,0,0,1240,1241,5,131,0,0,1241,141,1,0,0,0,1242,1243,3,148,74, + 0,1243,1244,5,126,0,0,1244,1245,3,138,69,0,1245,143,1,0,0,0,1246, + 1255,5,132,0,0,1247,1252,3,138,69,0,1248,1249,5,128,0,0,1249,1251, + 3,138,69,0,1250,1248,1,0,0,0,1251,1254,1,0,0,0,1252,1250,1,0,0,0, + 1252,1253,1,0,0,0,1253,1256,1,0,0,0,1254,1252,1,0,0,0,1255,1247, + 1,0,0,0,1255,1256,1,0,0,0,1256,1257,1,0,0,0,1257,1258,5,133,0,0, + 1258,145,1,0,0,0,1259,1260,7,8,0,0,1260,147,1,0,0,0,1261,1262,5, + 143,0,0,1262,149,1,0,0,0,111,162,169,190,202,214,234,242,249,255, + 267,270,276,287,296,306,309,311,315,323,335,340,349,352,367,373, + 385,394,402,410,423,426,436,440,446,453,459,467,475,488,495,499, + 504,515,521,531,536,542,553,580,607,612,623,626,631,638,647,650, + 663,672,686,707,710,713,720,728,768,771,793,807,815,827,841,851, + 869,873,876,880,883,892,896,900,906,917,924,944,953,985,1005,1022, + 1032,1035,1037,1048,1072,1088,1097,1105,1118,1133,1145,1149,1158, + 1176,1200,1206,1208,1227,1235,1238,1252,1255 ]; private static __ATN: antlr.ATN; @@ -6278,6 +6325,9 @@ export class ValueMemberOperationContext extends antlr.ParserRuleContext { public SET(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.SET, 0); } + public EDIT(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.EDIT, 0); + } public WATCH(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.WATCH, 0); } @@ -7357,6 +7407,9 @@ export class PrimitiveContext extends antlr.ParserRuleContext { public WRITE(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.WRITE, 0); } + public EDIT(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.EDIT, 0); + } public RESOLVE(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.RESOLVE, 0); } @@ -8019,6 +8072,9 @@ export class OperationNameContext extends antlr.ParserRuleContext { public SET(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.SET, 0); } + public EDIT(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.EDIT, 0); + } public RESOLVE(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.RESOLVE, 0); } @@ -8125,6 +8181,9 @@ export class StatePrimitiveContext extends antlr.ParserRuleContext { public WRITE(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.WRITE, 0); } + public EDIT(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.EDIT, 0); + } public WATCH_START(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.WATCH_START, 0); } @@ -8691,6 +8750,51 @@ export class IdentifierContext extends antlr.ParserRuleContext { public IDENTIFIER(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.IDENTIFIER, 0); } + public START(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.START, 0); + } + public STOP(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.STOP, 0); + } + public EDIT(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.EDIT, 0); + } + public CREATION(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.CREATION, 0); + } + public INITIALIZE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.INITIALIZE, 0); + } + public EXECUTION(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.EXECUTION, 0); + } + public SNAPSHOT(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.SNAPSHOT, 0); + } + public TRANSACTION(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.TRANSACTION, 0); + } + public REMOTE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.REMOTE, 0); + } + public TARGETS(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.TARGETS, 0); + } + public PORTABLE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.PORTABLE, 0); + } + public REPLICA(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.REPLICA, 0); + } + public LOCAL(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.LOCAL, 0); + } + public FROM(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.FROM, 0); + } + public REGISTER(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.REGISTER, 0); + } public INTERFACES(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.INTERFACES, 0); } diff --git a/src/capability-language/generic-types.ts b/src/capability-language/generic-types.ts index 4a3f83b..98fa817 100644 --- a/src/capability-language/generic-types.ts +++ b/src/capability-language/generic-types.ts @@ -108,6 +108,7 @@ export class GenericSourceTypes { return parameter?.kind === "value" && Boolean(parameter.storable); } if (type.kind === "list" || type.kind === "optional") return storable(type.value, depth + 1); + if (type.kind === "record") return Object.values(type.fields).every((field) => storable(field, depth + 1)); if (type.kind === "alias") { const alias = aliases.get(type.definitionId); if (!alias || alias.parameters.length !== type.arguments.length) return false; @@ -318,6 +319,12 @@ export class GenericSourceTypes { return { kind: "record", fields: Object.fromEntries(fields) }; } const name = context.identifier()!.getText(); + if (name === "change" && context.typeArguments()) + throw new GenericTypeError( + "unsupported-prepared-change", + name, + "Authored change transport values require LF-19; native edit contracts are available separately", + ); if (context.ATOM_REF()) return { kind: "object-ref", expectation: this.atom(name) }; if (context.INTERFACE_REF()) return { diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index cf7d1ed..d1e11ae 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -405,6 +405,8 @@ const valueOperation = (displayName: string, id: InterfaceOperation["id"], value outputType: value, mode: "call", }; + case "edit": + return { id, displayName, inputType: { kind: "change", value }, outputType: valueType.unit, mode: "call" }; case "set": return { id, @@ -494,6 +496,11 @@ const lowerValueMember = (state: LoweringState, context: ValueMemberContext): In ...valueOperation("get", capabilityId.operation(stringValue(operation.stringLiteral(0))), memberValueType), ...lowerExecution(operation.executionClause()), }); + } else if (operation.EDIT()) { + operations.push({ + ...valueOperation("edit", capabilityId.operation(stringValue(operation.stringLiteral(0))), memberValueType), + ...lowerExecution(operation.executionClause()), + }); } else if (operation.SET()) { operations.push({ ...valueOperation("set", capabilityId.operation(stringValue(operation.stringLiteral(0))), memberValueType), @@ -763,6 +770,13 @@ const lowerInterfaceTemplate = ( return [ { ...signature("get", id, valueType.unit, type), ...lowerExecution(operation.executionClause()) }, ]; + if (operation.EDIT()) + return [ + { + ...signature("edit", id, { kind: "change", value: type }, valueType.unit), + ...lowerExecution(operation.executionClause()), + }, + ]; if (operation.SET()) return [ { ...signature("set", id, type, valueType.unit), ...lowerExecution(operation.executionClause()) }, @@ -939,7 +953,9 @@ const lowerDependencyPort = (state: LoweringState, context: DependencyPortContex .primitiveList()! .primitive() .map((entry) => text(entry)); - const invalid = primitives.filter((entry) => !["read", "write", "watch-start", "watch-stop"].includes(entry)); + const invalid = primitives.filter( + (entry) => !["read", "write", "edit", "watch-start", "watch-stop"].includes(entry), + ); if (invalid.length > 0) { loweringIssue(state, context, "invalid-port-primitive", `State port cannot request ${invalid.join(", ")}`); } @@ -1405,12 +1421,12 @@ const lowerPackage = ( const name = identifier(clause.identifier(0)); const key = budgetNames[name], n = Number(clause.INTEGER()!.getText()); - if (!key || assigned.has(name) || !Number.isSafeInteger(n) || n < 1 || n > defaultQueryBudgets[key]) + if (!key || assigned.has(name) || !Number.isSafeInteger(n) || n < 1 || n > 0xffffffff) loweringIssue( state, clause, "invalid-query-budget", - `Invalid, duplicate, or excessive query budget ${name}`, + `Invalid, duplicate, or out-of-range query budget ${name}`, ); else { declaration.budgets[key] = n; @@ -1898,6 +1914,7 @@ const lowerConformance = ( const primitives = { get: "read", set: "write", + edit: "edit", "watch-start": "watch-start", "watch-stop": "watch-stop", } as const; @@ -2622,7 +2639,7 @@ const compileCapabilityResourceSourceInternal = ( portNames.add(port.displayName); const requirement = port.requirement; if (requirement.kind === "state") { - if (requirement.primitives.some((p) => !["read", "write", "watch-start", "watch-stop"].includes(p))) + if (requirement.primitives.some((p) => !["read", "write", "edit", "watch-start", "watch-stop"].includes(p))) throw new GenericTypeError("invalid-port-primitive", port.displayName, "Invalid state primitive"); types.push(requirement.valueType); } diff --git a/src/capability-model/generics.ts b/src/capability-model/generics.ts index 9955463..fa6cca3 100644 --- a/src/capability-model/generics.ts +++ b/src/capability-model/generics.ts @@ -16,7 +16,7 @@ export type ValueTypeExpression = | Extract | { kind: "parameter"; parameterId: string } | { kind: "record"; fields: Record } - | { kind: "list" | "optional"; value: ValueTypeExpression } + | { kind: "list" | "optional" | "change"; value: ValueTypeExpression } | { kind: "object-ref"; expectation: ObjectTypeExpression } | { kind: "alias"; definitionId: string; arguments: TypeArgumentExpression[] }; @@ -184,10 +184,10 @@ export const isStorableType = ( case "list": case "optional": return visit(value.value, depth + 1); - // Records currently have RPC codecs, not ordinary-state persistence codecs. - // A generic bound must not promise storage that the installed model rejects. - case "record": + case "change": return false; + case "record": + return Object.values(value.fields).every((field) => visit(field, depth + 1)); } }; return visit(type, 0); @@ -216,6 +216,7 @@ export const canonicalTypeArgument = (argument: ClosedTypeArgument): string => { return ["message", value.descriptorId]; case "object-ref": return ["object-ref", target(value.expectation)]; + case "change": case "list": case "optional": return [value.kind, type(value.value, depth + 1)]; @@ -323,6 +324,7 @@ export class TypeSubstitution { return { kind: "scalar", name: expression.name }; case "message": return { kind: "message", descriptorId: expression.descriptorId }; + case "change": case "list": case "optional": return { kind: expression.kind, value: this.value(expression.value, `${path}.${expression.kind}`, depth + 1) }; diff --git a/src/capability-model/types.ts b/src/capability-model/types.ts index c231f5d..fcec7a1 100644 --- a/src/capability-model/types.ts +++ b/src/capability-model/types.ts @@ -67,7 +67,8 @@ export type ValueType = | { kind: "record"; fields: Record } | { kind: "object-ref"; expectation: ObjectExpectation } | { kind: "optional"; value: ValueType } - | { kind: "list"; value: ValueType }; + | { kind: "list"; value: ValueType } + | { kind: "change"; value: ValueType }; export const valueType = { unit: { kind: "builtin", name: "unit" } as const, @@ -214,7 +215,7 @@ export interface EdgeDefinition { export type PersistentAttachment = StateSlotDefinition | EdgeDefinition; -export type StatePrimitive = "read" | "write" | "watch-start" | "watch-stop"; +export type StatePrimitive = "read" | "write" | "edit" | "watch-start" | "watch-stop"; export type EdgePrimitive = "resolve" | "connect" | "disconnect" | "watch-start" | "watch-stop"; diff --git a/src/capability-model/validation.ts b/src/capability-model/validation.ts index 4ea62af..0dfa5a1 100644 --- a/src/capability-model/validation.ts +++ b/src/capability-model/validation.ts @@ -154,6 +154,8 @@ const typeLabel = (type: ValueType): string => { return type.expectation.kind === "atom" ? `object:atom:${type.expectation.atomId}` : `object:interface:${type.expectation.interfaceRevisionId}`; + case "change": + return `change<${typeLabel(type.value)}>`; case "optional": return `optional<${typeLabel(type.value)}>`; case "list": @@ -189,6 +191,7 @@ export const valueTypesEqual = (left: ValueType, right: ValueType): boolean => { ? left.expectation.atomId === (other as typeof left.expectation).atomId : left.expectation.interfaceRevisionId === (other as typeof left.expectation).interfaceRevisionId; } + case "change": case "optional": case "list": return valueTypesEqual(left.value, (right as typeof left).value); @@ -239,6 +242,7 @@ const validateValueType = ( case "message": requireText(issues, type.descriptorId, `${path}.descriptorId`, "Message descriptor identity"); return; + case "change": case "optional": case "list": validateValueType(issues, type.value, `${path}.value`, indexes); @@ -341,6 +345,8 @@ export const statePrimitiveSignature = (slot: StateSlotDefinition, primitive: St inputType: valueType.unit, outputType: slot.valueType, }; + case "edit": + return { mode: "call", inputType: { kind: "change", value: slot.valueType }, outputType: valueType.unit }; case "write": return { mode: "call", @@ -532,9 +538,19 @@ const collectIdentityIndexes = ( if (member.kind === "relationship" && contract === "rpc-permitted") issue(issues, "invalid-query-contract", memberPath, "RPC query relationships are not supported"); if (member.kind === "value") { - const type = member.valueType.kind === "optional" ? member.valueType.value : member.valueType; - if (type.kind !== "scalar") - issue(issues, "invalid-query-contract", memberPath, "Queryable values must be scalar or optional scalar"); + const queryValue = (type: ValueType): boolean => + type.kind === "scalar" || + ((type.kind === "optional" || type.kind === "list") && queryValue(type.value)) || + (type.kind === "record" && + Object.keys(type.fields).length > 0 && + Object.values(type.fields).every(queryValue)); + if (!queryValue(member.valueType)) + issue( + issues, + "invalid-query-contract", + memberPath, + "Queryable values require scalar leaves in optional, list, or nonempty record shapes", + ); } } requireText(issues, member.id, `${memberPath}.id`, "Member ID"); @@ -837,7 +853,8 @@ const validateAttachments = (issues: CapabilityValidationIssue[], indexes: Valid validateValueType(issues, attachment.valueType, `${path}.valueType`, indexes); const containsRpcType = (type: ValueType): boolean => type.kind === "object-ref" || - type.kind === "record" || + type.kind === "change" || + (type.kind === "record" && Object.values(type.fields).some(containsRpcType)) || ((type.kind === "optional" || type.kind === "list") && containsRpcType(type.value)); if ( containsRpcType(attachment.valueType) || @@ -847,7 +864,7 @@ const validateAttachments = (issues: CapabilityValidationIssue[], indexes: Valid issues, "invalid-attachment", `${path}.valueType`, - "Managed object references belong in graph relationships, not ordinary state; record types are RPC-only", + "Managed object references belong in graph relationships; captured changes are transport-only", ); } if (attachment.storagePolicy.kind === "crdt-document") { @@ -1287,6 +1304,12 @@ const validateBoundDependencies = ( : `State ${stateBinding.slotId} is not attached to receiver atom ${params.atomId}`, ); } + if ( + requirement.primitives.includes("edit") && + (attachment.attachment.storagePolicy.kind !== "crdt-document" || + !valueTypesEqual(attachment.attachment.valueType, attachment.attachment.storagePolicy.updateType)) + ) + issue(issues, "invalid-dependency-binding", path, "Edit ports require a matching CRDT slot"); if (!valueTypesEqual(requirement.valueType, attachment.attachment.valueType)) { issue( issues, @@ -1579,6 +1602,17 @@ const validateConformances = ( } } else binding = entry.binding; const member = operationEntry.member; + if ( + member.kind === "value" && + operation.displayName === "edit" && + (binding.kind !== "state" || binding.primitive !== "edit") + ) + issue( + issues, + "invalid-state-binding", + bindingPath, + "CRDT edit operations must resolve to a native state edit capability", + ); if ( member.kind !== "operation" && member.queryRead && @@ -1652,6 +1686,17 @@ const validateConformances = ( "State primitives may only implement value members", ); } + if ( + binding.primitive === "edit" && + (attachment.attachment.storagePolicy.kind !== "crdt-document" || + !valueTypesEqual(attachment.attachment.valueType, attachment.attachment.storagePolicy.updateType)) + ) + issue( + issues, + "invalid-state-binding", + bindingPath, + "Edit requires a CRDT slot with a matching materialized profile type", + ); const expected = statePrimitiveSignature(attachment.attachment, binding.primitive); if (!signaturesMatch(operation, expected)) { issue( diff --git a/src/gen/camino/schema_pb.ts b/src/gen/camino/schema_pb.ts index aa0730a..3c05ed7 100644 --- a/src/gen/camino/schema_pb.ts +++ b/src/gen/camino/schema_pb.ts @@ -10,7 +10,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file camino/schema.proto. */ export const file_camino_schema: GenFile = /*@__PURE__*/ - fileDesc("ChNjYW1pbm8vc2NoZW1hLnByb3RvEgZjYW1pbm8iNwoOQXRvbURlZmluaXRpb24SDwoHYXRvbV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkiWQoPQXRvbUNvbmZvcm1hbmNlEg8KB2F0b21faWQYASABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAIgASgJEhYKDmNvbmZvcm1hbmNlX2lkGAMgASgJIsIBCg9TdGF0ZUF0dGFjaG1lbnQSDwoHc2xvdF9pZBgBIAEoCRIYChBhdHRhY2hlZF9hdG9tX2lkGAIgASgJEhQKDGRpc3BsYXlfbmFtZRgDIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YBCABKAkSGwoTc3RvcmFnZV9wb2xpY3lfanNvbhgFIAEoCRIaChJkZWZhdWx0X3ZhbHVlX2pzb24YBiABKAkSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYByABKAkiUAoSRW5kcG9pbnRDb25zdHJhaW50EhEKB2F0b21faWQYASABKAlIABIfChVpbnRlcmZhY2VfcmV2aXNpb25faWQYAiABKAlIAEIGCgRraW5kIvsBCgxFZGdlRW5kcG9pbnQSFQoNcHJvamVjdGlvbl9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSLgoKY29uc3RyYWludBgDIAEoCzIaLmNhbWluby5FbmRwb2ludENvbnN0cmFpbnQSKAoLY2FyZGluYWxpdHkYBCABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSDwoHb3JkZXJlZBgFIAEoCBIRCglvbl9kZWxldGUYBiABKAkSFAoMcmV0YWluX290aGVyGAcgASgIEhAKCGtleV90eXBlGAggASgJEhgKEHB1YmxpY190cmF2ZXJzYWwYCSABKAgipQEKDkVkZ2VBdHRhY2htZW50EhQKDGVkZ2VfdHlwZV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSIwoFZmlyc3QYAyABKAsyFC5jYW1pbm8uRWRnZUVuZHBvaW50EiQKBnNlY29uZBgEIAEoCzIULmNhbWluby5FZGdlRW5kcG9pbnQSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYBSABKAkilQIKD1BlcnNpc3RlbmNlUGxhbhIUCgx3b3Jrc3BhY2VfaWQYASABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAIgASgJEiUKBWF0b21zGAMgAygLMhYuY2FtaW5vLkF0b21EZWZpbml0aW9uEi0KDGNvbmZvcm1hbmNlcxgEIAMoCzIXLmNhbWluby5BdG9tQ29uZm9ybWFuY2USJwoGc3RhdGVzGAUgAygLMhcuY2FtaW5vLlN0YXRlQXR0YWNobWVudBIlCgVlZGdlcxgGIAMoCzIWLmNhbWluby5FZGdlQXR0YWNobWVudBInCgdxdWVyaWVzGAcgAygLMhYuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5Ip4BCg1RdWVyeUFyZ3VtZW50EhIKCHZhcmlhYmxlGAEgASgJSAASFgoMbGl0ZXJhbF9qc29uGAIgASgJSAASKQoEbGlzdBgDIAEoCzIZLmNhbWluby5RdWVyeUFyZ3VtZW50TGlzdEgAEi0KBm9iamVjdBgEIAEoCzIbLmNhbWluby5RdWVyeUFyZ3VtZW50T2JqZWN0SABCBwoFdmFsdWUiOgoRUXVlcnlBcmd1bWVudExpc3QSJQoGdmFsdWVzGAEgAygLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQilAEKE1F1ZXJ5QXJndW1lbnRPYmplY3QSNwoGZmllbGRzGAEgAygLMicuY2FtaW5vLlF1ZXJ5QXJndW1lbnRPYmplY3QuRmllbGRzRW50cnkaRAoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQ6AjgBIkcKDlF1ZXJ5Q29uZGl0aW9uEg8KB2luY2x1ZGUYASABKAgSJAoFdmFsdWUYAiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCLUAwoOUXVlcnlTZWxlY3Rpb24SDAoEbmFtZRgBIAEoCRILCgNrZXkYAiABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAMgASgJEhEKCW1lbWJlcl9pZBgEIAEoCRIkChx0YXJnZXRfaW50ZXJmYWNlX3JldmlzaW9uX2lkGAUgASgJEioKCmNvbmRpdGlvbnMYBiADKAsyFi5jYW1pbm8uUXVlcnlDb25kaXRpb24SOAoJYXJndW1lbnRzGAcgAygLMiUuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uLkFyZ3VtZW50c0VudHJ5EikKCXNlbGVjdGlvbhgIIAMoCzIWLmNhbWluby5RdWVyeVNlbGVjdGlvbhIvCgpyZWxhdGlvbmFsGAkgASgLMhsuY2FtaW5vLlF1ZXJ5UmVsYXRpb25hbFBsYW4SKQoJcHJlZGljYXRlGAogASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEhkKEWxpdmVfc2VsZWN0aW9uX2lkGAsgASgJGkcKDkFyZ3VtZW50c0VudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50OgI4ASJqCg1RdWVyeVBhdGhTdGVwEhAKBnNvdXJjZRgBIAEoCEgAEhAKBnRhcmdldBgCIAEoCEgAEi0KCHJlbGF0aW9uGAMgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoSABCBgoEc3RlcCJ9ChFRdWVyeVJlbGF0aW9uUGF0aBIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEQoJbWVtYmVyX2lkGAIgASgJEiQKHHRhcmdldF9pbnRlcmZhY2VfcmV2aXNpb25faWQYAyABKAkSEAoIb3B0aW9uYWwYBCABKAgiRQoRUXVlcnlGaWVsZE9wZXJhbmQSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhEKCW1lbWJlcl9pZBgCIAEoCSK2AQoPUXVlcnlFeHByZXNzaW9uEiMKBHBhdGgYASADKAsyFS5jYW1pbm8uUXVlcnlQYXRoU3RlcBIqCgVmaWVsZBgCIAEoCzIZLmNhbWluby5RdWVyeUZpZWxkT3BlcmFuZEgAEg0KA3JlZhgDIAEoCUgAEg8KBWVudHJ5GAQgASgISAASEQoHbWFwX2tleRgFIAEoCEgAEhcKD3ZhbHVlX3R5cGVfanNvbhgGIAEoCUIGCgRsZWFmIoUBCg5RdWVyeVJlZHVjdGlvbhIwCghvcGVyYXRvchgBIAEoDjIeLmNhbWluby5RdWVyeUFnZ3JlZ2F0ZU9wZXJhdG9yEigKB29wZXJhbmQYAiABKAsyFy5jYW1pbm8uUXVlcnlFeHByZXNzaW9uEhcKD3ZhbHVlX3R5cGVfanNvbhgDIAEoCSJ1CgxRdWVyeU9wZXJhbmQSLQoKZXhwcmVzc2lvbhgBIAEoCzIXLmNhbWluby5RdWVyeUV4cHJlc3Npb25IABIrCglyZWR1Y3Rpb24YAiABKAsyFi5jYW1pbm8uUXVlcnlSZWR1Y3Rpb25IAEIJCgdvcGVyYW5kIpEBCg9RdWVyeUNvbXBhcmlzb24SJQoHb3BlcmFuZBgBIAEoCzIULmNhbWluby5RdWVyeU9wZXJhbmQSMQoIb3BlcmF0b3IYAiABKA4yHy5jYW1pbm8uUXVlcnlDb21wYXJpc29uT3BlcmF0b3ISJAoFdmFsdWUYAyABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCI+ChJRdWVyeVByZWRpY2F0ZUxpc3QSKAoIY2hpbGRyZW4YASADKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUi9QEKFlF1ZXJ5UmVsYXRpb25QcmVkaWNhdGUSIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhTdGVwEisKCHJlbGF0aW9uGAIgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoEjgKCG9wZXJhdG9yGAMgASgOMiYuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QcmVkaWNhdGVPcGVyYXRvchIpCglwcmVkaWNhdGUYBCABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUSJAoFdmFsdWUYBSABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCK6AQoXUXVlcnlSZWR1Y3Rpb25QcmVkaWNhdGUSIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhTdGVwEisKCHJlbGF0aW9uGAIgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoEiUKBXdoZXJlGAMgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEiYKBmhhdmluZxgEIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZSKsAgoOUXVlcnlQcmVkaWNhdGUSKQoDYW5kGAEgASgLMhouY2FtaW5vLlF1ZXJ5UHJlZGljYXRlTGlzdEgAEigKAm9yGAIgASgLMhouY2FtaW5vLlF1ZXJ5UHJlZGljYXRlTGlzdEgAEiUKA25vdBgDIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZUgAEioKB2NvbXBhcmUYBCABKAsyFy5jYW1pbm8uUXVlcnlDb21wYXJpc29uSAASMgoIcmVsYXRpb24YBSABKAsyHi5jYW1pbm8uUXVlcnlSZWxhdGlvblByZWRpY2F0ZUgAEjEKBnJlZHVjZRgGIAEoCzIfLmNhbWluby5RdWVyeVJlZHVjdGlvblByZWRpY2F0ZUgAQgsKCXByZWRpY2F0ZSJhCghRdWVyeVJvdxIoCgZvYmplY3QYASABKAsyFi5jYW1pbm8uUXVlcnlPYmplY3RSb3dIABIkCgRwYWlyGAIgASgLMhQuY2FtaW5vLlF1ZXJ5UGFpclJvd0gAQgUKA3JvdyJVCg5RdWVyeU9iamVjdFJvdxIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEgoKbWVtYmVyc2hpcBgCIAEoCBIQCghrZXlfdHlwZRgDIAEoCSJSCgxRdWVyeVBhaXJSb3cSIAoGc291cmNlGAEgASgLMhAuY2FtaW5vLlF1ZXJ5Um93EiAKBnRhcmdldBgCIAEoCzIQLmNhbWluby5RdWVyeVJvdyJFCghRdWVyeUtleRIMCgRwYXRoGAEgAygJEisKCmV4cHJlc3Npb24YAiABKAsyFy5jYW1pbm8uUXVlcnlFeHByZXNzaW9uIi8KDVF1ZXJ5RGlzdGluY3QSHgoEa2V5cxgBIAMoCzIQLmNhbWluby5RdWVyeUtleSJiCg5RdWVyeUV4cGFuc2lvbhIjCgRwYXRoGAEgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFN0ZXASKwoIcmVsYXRpb24YAiABKAsyGS5jYW1pbm8uUXVlcnlSZWxhdGlvblBhdGgimAIKFFF1ZXJ5UmVsYXRpb25hbFN0YWdlEgoKAmlkGAEgASgNEhIKBWlucHV0GAIgASgNSAGIAQESHQoDcm93GAMgASgLMhAuY2FtaW5vLlF1ZXJ5Um93EisKBnNvdXJjZRgEIAEoCzIZLmNhbWluby5RdWVyeVJlbGF0aW9uUGF0aEgAEigKBmZpbHRlchgFIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZUgAEigKBmV4cGFuZBgGIAEoCzIWLmNhbWluby5RdWVyeUV4cGFuc2lvbkgAEikKCGRpc3RpbmN0GAcgASgLMhUuY2FtaW5vLlF1ZXJ5RGlzdGluY3RIAEILCglvcGVyYXRpb25CCAoGX2lucHV0IlMKGFF1ZXJ5UmVkdWN0aW9uUHJvamVjdGlvbhIMCgRwYXRoGAEgAygJEikKCXJlZHVjdGlvbhgCIAEoCzIWLmNhbWluby5RdWVyeVJlZHVjdGlvbiJQChNRdWVyeUFnZ3JlZ2F0ZU9yZGVyEiUKB29wZXJhbmQYASABKAsyFC5jYW1pbm8uUXVlcnlPcGVyYW5kEhIKCmRlc2NlbmRpbmcYAiABKAgi0gMKF1F1ZXJ5UmVsYXRpb25hbFRlcm1pbmFsEg0KBXN0YWdlGAEgASgNEgwKBHBhdGgYAiADKAkSDgoGZ3JvdXBzGAMgASgIEh4KBGtleXMYBCADKAsyEC5jYW1pbm8uUXVlcnlLZXkSNAoKcmVkdWN0aW9ucxgFIAMoCzIgLmNhbWluby5RdWVyeVJlZHVjdGlvblByb2plY3Rpb24SJQoFd2hlcmUYBiABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUSJgoGaGF2aW5nGAcgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEioKBW9yZGVyGAggAygLMhsuY2FtaW5vLlF1ZXJ5QWdncmVnYXRlT3JkZXISJAoFZmlyc3QYCSABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudBIiCgNhbGwYCiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudBIkCgVhZnRlchgLIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50EikKCXNlbGVjdGlvbhgMIAMoCzIWLmNhbWluby5RdWVyeVNlbGVjdGlvbhIQCghyZXNpZHVhbBgNIAEoCBIMCgRyb3dzGA4gASgIIncKE1F1ZXJ5UmVsYXRpb25hbFBsYW4SLAoGc3RhZ2VzGAEgAygLMhwuY2FtaW5vLlF1ZXJ5UmVsYXRpb25hbFN0YWdlEjIKCXRlcm1pbmFscxgCIAMoCzIfLmNhbWluby5RdWVyeVJlbGF0aW9uYWxUZXJtaW5hbCLpAgoQUXVlcnlSZWFkQmluZGluZxIPCgdhdG9tX2lkGAEgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgCIAEoCRIRCgltZW1iZXJfaWQYAyABKAkSGwoTZ2V0dGVyX29wZXJhdGlvbl9pZBgEIAEoCRIPCgdzbG90X2lkGAUgASgJEhQKDGVkZ2VfdHlwZV9pZBgGIAEoCRIVCg1wcm9qZWN0aW9uX2lkGAcgASgJEgsKA3JwYxgIIAEoCBIgChh3YXRjaF9zdGFydF9vcGVyYXRpb25faWQYCSABKAkSHwoXd2F0Y2hfc3RvcF9vcGVyYXRpb25faWQYCiABKAkSEgoKZmllbGRfbmFtZRgLIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YDCABKAkSKAoLY2FyZGluYWxpdHkYDSABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSEAoIa2V5X3R5cGUYDiABKAkirwEKElF1ZXJ5RmllbGRDb250cmFjdBIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEQoJbWVtYmVyX2lkGAIgASgJEhIKCmZpZWxkX25hbWUYAyABKAkSFwoPdmFsdWVfdHlwZV9qc29uGAQgASgJEigKC2NhcmRpbmFsaXR5GAUgASgOMhMuY2FtaW5vLkNhcmRpbmFsaXR5EhAKCGtleV90eXBlGAYgASgJIpIBCgxRdWVyeUJ1ZGdldHMSDAoEcm93cxgBIAEoDRINCgVkZXB0aBgCIAEoDRIUCgxyZXN1bHRfYnl0ZXMYAyABKA0SEgoKY2FuZGlkYXRlcxgEIAEoDRIRCglycGNfY2FsbHMYBSABKA0SEwoLY29uY3VycmVuY3kYBiABKA0SEwoLZGVhZGxpbmVfbXMYByABKA0iTAoOUXVlcnlQbGFjZW1lbnQSEQoHcmVwbGljYRgBIAEoCEgAEh8KFWxvY2FsX3NvdXJjZV9xdWVyeV9pZBgCIAEoCUgAQgYKBGtpbmQimgUKDkluc3RhbGxlZFF1ZXJ5EgoKAmlkGAEgASgJEhkKEWRlZmluaXRpb25fZGlnZXN0GAIgASgJEhYKDmJpbmRpbmdfZGlnZXN0GAMgASgJEhoKEG9iamVjdF9pbnRlcmZhY2UYBCABKAlIABIdChN3b3Jrc3BhY2VfaW50ZXJmYWNlGA4gASgJSAASKQoJc2VsZWN0aW9uGAUgAygLMhYuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uEioKCGJpbmRpbmdzGAYgAygLMhguY2FtaW5vLlF1ZXJ5UmVhZEJpbmRpbmcSJQoHYnVkZ2V0cxgHIAEoCzIULmNhbWluby5RdWVyeUJ1ZGdldHMSGwoTdmFyaWFibGVzX3R5cGVfanNvbhgIIAEoCRIYChBvdXRwdXRfdHlwZV9qc29uGAkgASgJEkcKEXZhcmlhYmxlX2RlZmF1bHRzGAogAygLMiwuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5LlZhcmlhYmxlRGVmYXVsdHNFbnRyeRINCgV3YXRjaBgLIAEoCBIbChNwb2xsaW5nX2ludGVydmFsX21zGAwgASgNEh4KFnJwY19wcmVkaWNhdGVfb3Jfb3JkZXIYDSABKAgSFQoNcm9vdF9hdG9tX2lkcxgPIAMoCRIqCgZmaWVsZHMYECADKAsyGi5jYW1pbm8uUXVlcnlGaWVsZENvbnRyYWN0EikKCXBsYWNlbWVudBgRIAEoCzIWLmNhbWluby5RdWVyeVBsYWNlbWVudBpOChVWYXJpYWJsZURlZmF1bHRzRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQ6AjgBQgYKBHJvb3QqaAoLQ2FyZGluYWxpdHkSGwoXQ0FSRElOQUxJVFlfVU5TUEVDSUZJRUQQABIQCgxPUFRJT05BTF9PTkUQARIPCgtFWEFDVExZX09ORRACEggKBE1BTlkQAxIPCgtNQU5ZX1VOSVFVRRAEKpoCChZRdWVyeUFnZ3JlZ2F0ZU9wZXJhdG9yEigKJFFVRVJZX0FHR1JFR0FURV9PUEVSQVRPUl9VTlNQRUNJRklFRBAAEiIKHlFVRVJZX0FHR1JFR0FURV9PUEVSQVRPUl9DT1VOVBABEioKJlFVRVJZX0FHR1JFR0FURV9PUEVSQVRPUl9DT1VOVF9QUkVTRU5UEAISIAocUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX1NVTRADEiAKHFFVRVJZX0FHR1JFR0FURV9PUEVSQVRPUl9BVkcQBBIgChxRVUVSWV9BR0dSRUdBVEVfT1BFUkFUT1JfTUlOEAUSIAocUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX01BWBAGKu0CChdRdWVyeUNvbXBhcmlzb25PcGVyYXRvchIpCiVRVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX1VOU1BFQ0lGSUVEEAASIAocUVVFUllfQ09NUEFSSVNPTl9PUEVSQVRPUl9FURABEiAKHFFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfSU4QAhIlCiFRVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0lTX05VTEwQAxIgChxRVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0xUEAQSIQodUVVFUllfQ09NUEFSSVNPTl9PUEVSQVRPUl9MVEUQBRIgChxRVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0dUEAYSIQodUVVFUllfQ09NUEFSSVNPTl9PUEVSQVRPUl9HVEUQBxIyCi5RVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0NPTlRBSU5TX0lOU0VOU0lUSVZFEAgqhAIKHlF1ZXJ5UmVsYXRpb25QcmVkaWNhdGVPcGVyYXRvchIxCi1RVUVSWV9SRUxBVElPTl9QUkVESUNBVEVfT1BFUkFUT1JfVU5TUEVDSUZJRUQQABIqCiZRVUVSWV9SRUxBVElPTl9QUkVESUNBVEVfT1BFUkFUT1JfU09NRRABEioKJlFVRVJZX1JFTEFUSU9OX1BSRURJQ0FURV9PUEVSQVRPUl9OT05FEAISKAokUVVFUllfUkVMQVRJT05fUFJFRElDQVRFX09QRVJBVE9SX0lTEAMSLQopUVVFUllfUkVMQVRJT05fUFJFRElDQVRFX09QRVJBVE9SX0lTX05VTEwQBGIGcHJvdG8z"); + fileDesc("ChNjYW1pbm8vc2NoZW1hLnByb3RvEgZjYW1pbm8iNwoOQXRvbURlZmluaXRpb24SDwoHYXRvbV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkiWQoPQXRvbUNvbmZvcm1hbmNlEg8KB2F0b21faWQYASABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAIgASgJEhYKDmNvbmZvcm1hbmNlX2lkGAMgASgJIsIBCg9TdGF0ZUF0dGFjaG1lbnQSDwoHc2xvdF9pZBgBIAEoCRIYChBhdHRhY2hlZF9hdG9tX2lkGAIgASgJEhQKDGRpc3BsYXlfbmFtZRgDIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YBCABKAkSGwoTc3RvcmFnZV9wb2xpY3lfanNvbhgFIAEoCRIaChJkZWZhdWx0X3ZhbHVlX2pzb24YBiABKAkSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYByABKAkiUAoSRW5kcG9pbnRDb25zdHJhaW50EhEKB2F0b21faWQYASABKAlIABIfChVpbnRlcmZhY2VfcmV2aXNpb25faWQYAiABKAlIAEIGCgRraW5kIvsBCgxFZGdlRW5kcG9pbnQSFQoNcHJvamVjdGlvbl9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSLgoKY29uc3RyYWludBgDIAEoCzIaLmNhbWluby5FbmRwb2ludENvbnN0cmFpbnQSKAoLY2FyZGluYWxpdHkYBCABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSDwoHb3JkZXJlZBgFIAEoCBIRCglvbl9kZWxldGUYBiABKAkSFAoMcmV0YWluX290aGVyGAcgASgIEhAKCGtleV90eXBlGAggASgJEhgKEHB1YmxpY190cmF2ZXJzYWwYCSABKAgipQEKDkVkZ2VBdHRhY2htZW50EhQKDGVkZ2VfdHlwZV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSIwoFZmlyc3QYAyABKAsyFC5jYW1pbm8uRWRnZUVuZHBvaW50EiQKBnNlY29uZBgEIAEoCzIULmNhbWluby5FZGdlRW5kcG9pbnQSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYBSABKAkilQIKD1BlcnNpc3RlbmNlUGxhbhIUCgx3b3Jrc3BhY2VfaWQYASABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAIgASgJEiUKBWF0b21zGAMgAygLMhYuY2FtaW5vLkF0b21EZWZpbml0aW9uEi0KDGNvbmZvcm1hbmNlcxgEIAMoCzIXLmNhbWluby5BdG9tQ29uZm9ybWFuY2USJwoGc3RhdGVzGAUgAygLMhcuY2FtaW5vLlN0YXRlQXR0YWNobWVudBIlCgVlZGdlcxgGIAMoCzIWLmNhbWluby5FZGdlQXR0YWNobWVudBInCgdxdWVyaWVzGAcgAygLMhYuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5Ip4BCg1RdWVyeUFyZ3VtZW50EhIKCHZhcmlhYmxlGAEgASgJSAASFgoMbGl0ZXJhbF9qc29uGAIgASgJSAASKQoEbGlzdBgDIAEoCzIZLmNhbWluby5RdWVyeUFyZ3VtZW50TGlzdEgAEi0KBm9iamVjdBgEIAEoCzIbLmNhbWluby5RdWVyeUFyZ3VtZW50T2JqZWN0SABCBwoFdmFsdWUiOgoRUXVlcnlBcmd1bWVudExpc3QSJQoGdmFsdWVzGAEgAygLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQilAEKE1F1ZXJ5QXJndW1lbnRPYmplY3QSNwoGZmllbGRzGAEgAygLMicuY2FtaW5vLlF1ZXJ5QXJndW1lbnRPYmplY3QuRmllbGRzRW50cnkaRAoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQ6AjgBIkcKDlF1ZXJ5Q29uZGl0aW9uEg8KB2luY2x1ZGUYASABKAgSJAoFdmFsdWUYAiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCLUAwoOUXVlcnlTZWxlY3Rpb24SDAoEbmFtZRgBIAEoCRILCgNrZXkYAiABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAMgASgJEhEKCW1lbWJlcl9pZBgEIAEoCRIkChx0YXJnZXRfaW50ZXJmYWNlX3JldmlzaW9uX2lkGAUgASgJEioKCmNvbmRpdGlvbnMYBiADKAsyFi5jYW1pbm8uUXVlcnlDb25kaXRpb24SOAoJYXJndW1lbnRzGAcgAygLMiUuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uLkFyZ3VtZW50c0VudHJ5EikKCXNlbGVjdGlvbhgIIAMoCzIWLmNhbWluby5RdWVyeVNlbGVjdGlvbhIvCgpyZWxhdGlvbmFsGAkgASgLMhsuY2FtaW5vLlF1ZXJ5UmVsYXRpb25hbFBsYW4SKQoJcHJlZGljYXRlGAogASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEhkKEWxpdmVfc2VsZWN0aW9uX2lkGAsgASgJGkcKDkFyZ3VtZW50c0VudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50OgI4ASJqCg1RdWVyeVBhdGhTdGVwEhAKBnNvdXJjZRgBIAEoCEgAEhAKBnRhcmdldBgCIAEoCEgAEi0KCHJlbGF0aW9uGAMgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoSABCBgoEc3RlcCJ9ChFRdWVyeVJlbGF0aW9uUGF0aBIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEQoJbWVtYmVyX2lkGAIgASgJEiQKHHRhcmdldF9pbnRlcmZhY2VfcmV2aXNpb25faWQYAyABKAkSEAoIb3B0aW9uYWwYBCABKAgiWQoRUXVlcnlGaWVsZE9wZXJhbmQSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhEKCW1lbWJlcl9pZBgCIAEoCRISCgp2YWx1ZV9wYXRoGAMgAygJIrYBCg9RdWVyeUV4cHJlc3Npb24SIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhTdGVwEioKBWZpZWxkGAIgASgLMhkuY2FtaW5vLlF1ZXJ5RmllbGRPcGVyYW5kSAASDQoDcmVmGAMgASgJSAASDwoFZW50cnkYBCABKAhIABIRCgdtYXBfa2V5GAUgASgISAASFwoPdmFsdWVfdHlwZV9qc29uGAYgASgJQgYKBGxlYWYihQEKDlF1ZXJ5UmVkdWN0aW9uEjAKCG9wZXJhdG9yGAEgASgOMh4uY2FtaW5vLlF1ZXJ5QWdncmVnYXRlT3BlcmF0b3ISKAoHb3BlcmFuZBgCIAEoCzIXLmNhbWluby5RdWVyeUV4cHJlc3Npb24SFwoPdmFsdWVfdHlwZV9qc29uGAMgASgJInUKDFF1ZXJ5T3BlcmFuZBItCgpleHByZXNzaW9uGAEgASgLMhcuY2FtaW5vLlF1ZXJ5RXhwcmVzc2lvbkgAEisKCXJlZHVjdGlvbhgCIAEoCzIWLmNhbWluby5RdWVyeVJlZHVjdGlvbkgAQgkKB29wZXJhbmQikQEKD1F1ZXJ5Q29tcGFyaXNvbhIlCgdvcGVyYW5kGAEgASgLMhQuY2FtaW5vLlF1ZXJ5T3BlcmFuZBIxCghvcGVyYXRvchgCIAEoDjIfLmNhbWluby5RdWVyeUNvbXBhcmlzb25PcGVyYXRvchIkCgV2YWx1ZRgDIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50Ij4KElF1ZXJ5UHJlZGljYXRlTGlzdBIoCghjaGlsZHJlbhgBIAMoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZSL1AQoWUXVlcnlSZWxhdGlvblByZWRpY2F0ZRIjCgRwYXRoGAEgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFN0ZXASKwoIcmVsYXRpb24YAiABKAsyGS5jYW1pbm8uUXVlcnlSZWxhdGlvblBhdGgSOAoIb3BlcmF0b3IYAyABKA4yJi5jYW1pbm8uUXVlcnlSZWxhdGlvblByZWRpY2F0ZU9wZXJhdG9yEikKCXByZWRpY2F0ZRgEIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZRIkCgV2YWx1ZRgFIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50IroBChdRdWVyeVJlZHVjdGlvblByZWRpY2F0ZRIjCgRwYXRoGAEgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFN0ZXASKwoIcmVsYXRpb24YAiABKAsyGS5jYW1pbm8uUXVlcnlSZWxhdGlvblBhdGgSJQoFd2hlcmUYAyABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUSJgoGaGF2aW5nGAQgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlIqwCCg5RdWVyeVByZWRpY2F0ZRIpCgNhbmQYASABKAsyGi5jYW1pbm8uUXVlcnlQcmVkaWNhdGVMaXN0SAASKAoCb3IYAiABKAsyGi5jYW1pbm8uUXVlcnlQcmVkaWNhdGVMaXN0SAASJQoDbm90GAMgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlSAASKgoHY29tcGFyZRgEIAEoCzIXLmNhbWluby5RdWVyeUNvbXBhcmlzb25IABIyCghyZWxhdGlvbhgFIAEoCzIeLmNhbWluby5RdWVyeVJlbGF0aW9uUHJlZGljYXRlSAASMQoGcmVkdWNlGAYgASgLMh8uY2FtaW5vLlF1ZXJ5UmVkdWN0aW9uUHJlZGljYXRlSABCCwoJcHJlZGljYXRlImEKCFF1ZXJ5Um93EigKBm9iamVjdBgBIAEoCzIWLmNhbWluby5RdWVyeU9iamVjdFJvd0gAEiQKBHBhaXIYAiABKAsyFC5jYW1pbm8uUXVlcnlQYWlyUm93SABCBQoDcm93IlUKDlF1ZXJ5T2JqZWN0Um93Eh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgBIAEoCRISCgptZW1iZXJzaGlwGAIgASgIEhAKCGtleV90eXBlGAMgASgJIlIKDFF1ZXJ5UGFpclJvdxIgCgZzb3VyY2UYASABKAsyEC5jYW1pbm8uUXVlcnlSb3cSIAoGdGFyZ2V0GAIgASgLMhAuY2FtaW5vLlF1ZXJ5Um93IkUKCFF1ZXJ5S2V5EgwKBHBhdGgYASADKAkSKwoKZXhwcmVzc2lvbhgCIAEoCzIXLmNhbWluby5RdWVyeUV4cHJlc3Npb24iLwoNUXVlcnlEaXN0aW5jdBIeCgRrZXlzGAEgAygLMhAuY2FtaW5vLlF1ZXJ5S2V5ImIKDlF1ZXJ5RXhwYW5zaW9uEiMKBHBhdGgYASADKAsyFS5jYW1pbm8uUXVlcnlQYXRoU3RlcBIrCghyZWxhdGlvbhgCIAEoCzIZLmNhbWluby5RdWVyeVJlbGF0aW9uUGF0aCKYAgoUUXVlcnlSZWxhdGlvbmFsU3RhZ2USCgoCaWQYASABKA0SEgoFaW5wdXQYAiABKA1IAYgBARIdCgNyb3cYAyABKAsyEC5jYW1pbm8uUXVlcnlSb3cSKwoGc291cmNlGAQgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoSAASKAoGZmlsdGVyGAUgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlSAASKAoGZXhwYW5kGAYgASgLMhYuY2FtaW5vLlF1ZXJ5RXhwYW5zaW9uSAASKQoIZGlzdGluY3QYByABKAsyFS5jYW1pbm8uUXVlcnlEaXN0aW5jdEgAQgsKCW9wZXJhdGlvbkIICgZfaW5wdXQiUwoYUXVlcnlSZWR1Y3Rpb25Qcm9qZWN0aW9uEgwKBHBhdGgYASADKAkSKQoJcmVkdWN0aW9uGAIgASgLMhYuY2FtaW5vLlF1ZXJ5UmVkdWN0aW9uIlAKE1F1ZXJ5QWdncmVnYXRlT3JkZXISJQoHb3BlcmFuZBgBIAEoCzIULmNhbWluby5RdWVyeU9wZXJhbmQSEgoKZGVzY2VuZGluZxgCIAEoCCLSAwoXUXVlcnlSZWxhdGlvbmFsVGVybWluYWwSDQoFc3RhZ2UYASABKA0SDAoEcGF0aBgCIAMoCRIOCgZncm91cHMYAyABKAgSHgoEa2V5cxgEIAMoCzIQLmNhbWluby5RdWVyeUtleRI0CgpyZWR1Y3Rpb25zGAUgAygLMiAuY2FtaW5vLlF1ZXJ5UmVkdWN0aW9uUHJvamVjdGlvbhIlCgV3aGVyZRgGIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZRImCgZoYXZpbmcYByABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUSKgoFb3JkZXIYCCADKAsyGy5jYW1pbm8uUXVlcnlBZ2dyZWdhdGVPcmRlchIkCgVmaXJzdBgJIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50EiIKA2FsbBgKIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50EiQKBWFmdGVyGAsgASgLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQSKQoJc2VsZWN0aW9uGAwgAygLMhYuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uEhAKCHJlc2lkdWFsGA0gASgIEgwKBHJvd3MYDiABKAgidwoTUXVlcnlSZWxhdGlvbmFsUGxhbhIsCgZzdGFnZXMYASADKAsyHC5jYW1pbm8uUXVlcnlSZWxhdGlvbmFsU3RhZ2USMgoJdGVybWluYWxzGAIgAygLMh8uY2FtaW5vLlF1ZXJ5UmVsYXRpb25hbFRlcm1pbmFsIukCChBRdWVyeVJlYWRCaW5kaW5nEg8KB2F0b21faWQYASABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAIgASgJEhEKCW1lbWJlcl9pZBgDIAEoCRIbChNnZXR0ZXJfb3BlcmF0aW9uX2lkGAQgASgJEg8KB3Nsb3RfaWQYBSABKAkSFAoMZWRnZV90eXBlX2lkGAYgASgJEhUKDXByb2plY3Rpb25faWQYByABKAkSCwoDcnBjGAggASgIEiAKGHdhdGNoX3N0YXJ0X29wZXJhdGlvbl9pZBgJIAEoCRIfChd3YXRjaF9zdG9wX29wZXJhdGlvbl9pZBgKIAEoCRISCgpmaWVsZF9uYW1lGAsgASgJEhcKD3ZhbHVlX3R5cGVfanNvbhgMIAEoCRIoCgtjYXJkaW5hbGl0eRgNIAEoDjITLmNhbWluby5DYXJkaW5hbGl0eRIQCghrZXlfdHlwZRgOIAEoCSKvAQoSUXVlcnlGaWVsZENvbnRyYWN0Eh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgBIAEoCRIRCgltZW1iZXJfaWQYAiABKAkSEgoKZmllbGRfbmFtZRgDIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YBCABKAkSKAoLY2FyZGluYWxpdHkYBSABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSEAoIa2V5X3R5cGUYBiABKAkikgEKDFF1ZXJ5QnVkZ2V0cxIMCgRyb3dzGAEgASgNEg0KBWRlcHRoGAIgASgNEhQKDHJlc3VsdF9ieXRlcxgDIAEoDRISCgpjYW5kaWRhdGVzGAQgASgNEhEKCXJwY19jYWxscxgFIAEoDRITCgtjb25jdXJyZW5jeRgGIAEoDRITCgtkZWFkbGluZV9tcxgHIAEoDSJMCg5RdWVyeVBsYWNlbWVudBIRCgdyZXBsaWNhGAEgASgISAASHwoVbG9jYWxfc291cmNlX3F1ZXJ5X2lkGAIgASgJSABCBgoEa2luZCKaBQoOSW5zdGFsbGVkUXVlcnkSCgoCaWQYASABKAkSGQoRZGVmaW5pdGlvbl9kaWdlc3QYAiABKAkSFgoOYmluZGluZ19kaWdlc3QYAyABKAkSGgoQb2JqZWN0X2ludGVyZmFjZRgEIAEoCUgAEh0KE3dvcmtzcGFjZV9pbnRlcmZhY2UYDiABKAlIABIpCglzZWxlY3Rpb24YBSADKAsyFi5jYW1pbm8uUXVlcnlTZWxlY3Rpb24SKgoIYmluZGluZ3MYBiADKAsyGC5jYW1pbm8uUXVlcnlSZWFkQmluZGluZxIlCgdidWRnZXRzGAcgASgLMhQuY2FtaW5vLlF1ZXJ5QnVkZ2V0cxIbChN2YXJpYWJsZXNfdHlwZV9qc29uGAggASgJEhgKEG91dHB1dF90eXBlX2pzb24YCSABKAkSRwoRdmFyaWFibGVfZGVmYXVsdHMYCiADKAsyLC5jYW1pbm8uSW5zdGFsbGVkUXVlcnkuVmFyaWFibGVEZWZhdWx0c0VudHJ5Eg0KBXdhdGNoGAsgASgIEhsKE3BvbGxpbmdfaW50ZXJ2YWxfbXMYDCABKA0SHgoWcnBjX3ByZWRpY2F0ZV9vcl9vcmRlchgNIAEoCBIVCg1yb290X2F0b21faWRzGA8gAygJEioKBmZpZWxkcxgQIAMoCzIaLmNhbWluby5RdWVyeUZpZWxkQ29udHJhY3QSKQoJcGxhY2VtZW50GBEgASgLMhYuY2FtaW5vLlF1ZXJ5UGxhY2VtZW50Gk4KFVZhcmlhYmxlRGVmYXVsdHNFbnRyeRILCgNrZXkYASABKAkSJAoFdmFsdWUYAiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudDoCOAFCBgoEcm9vdCpoCgtDYXJkaW5hbGl0eRIbChdDQVJESU5BTElUWV9VTlNQRUNJRklFRBAAEhAKDE9QVElPTkFMX09ORRABEg8KC0VYQUNUTFlfT05FEAISCAoETUFOWRADEg8KC01BTllfVU5JUVVFEAQqmgIKFlF1ZXJ5QWdncmVnYXRlT3BlcmF0b3ISKAokUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX1VOU1BFQ0lGSUVEEAASIgoeUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0NPVU5UEAESKgomUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0NPVU5UX1BSRVNFTlQQAhIgChxRVUVSWV9BR0dSRUdBVEVfT1BFUkFUT1JfU1VNEAMSIAocUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0FWRxAEEiAKHFFVRVJZX0FHR1JFR0FURV9PUEVSQVRPUl9NSU4QBRIgChxRVUVSWV9BR0dSRUdBVEVfT1BFUkFUT1JfTUFYEAYq7QIKF1F1ZXJ5Q29tcGFyaXNvbk9wZXJhdG9yEikKJVFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfVU5TUEVDSUZJRUQQABIgChxRVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0VREAESIAocUVVFUllfQ09NUEFSSVNPTl9PUEVSQVRPUl9JThACEiUKIVFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfSVNfTlVMTBADEiAKHFFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfTFQQBBIhCh1RVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0xURRAFEiAKHFFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfR1QQBhIhCh1RVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0dURRAHEjIKLlFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfQ09OVEFJTlNfSU5TRU5TSVRJVkUQCCqEAgoeUXVlcnlSZWxhdGlvblByZWRpY2F0ZU9wZXJhdG9yEjEKLVFVRVJZX1JFTEFUSU9OX1BSRURJQ0FURV9PUEVSQVRPUl9VTlNQRUNJRklFRBAAEioKJlFVRVJZX1JFTEFUSU9OX1BSRURJQ0FURV9PUEVSQVRPUl9TT01FEAESKgomUVVFUllfUkVMQVRJT05fUFJFRElDQVRFX09QRVJBVE9SX05PTkUQAhIoCiRRVUVSWV9SRUxBVElPTl9QUkVESUNBVEVfT1BFUkFUT1JfSVMQAxItCilRVUVSWV9SRUxBVElPTl9QUkVESUNBVEVfT1BFUkFUT1JfSVNfTlVMTBAEYgZwcm90bzM"); /** * @generated from message camino.AtomDefinition @@ -539,6 +539,11 @@ export type QueryFieldOperand = Message<"camino.QueryFieldOperand"> & { * @generated from field: string member_id = 2; */ memberId: string; + + /** + * @generated from field: repeated string value_path = 3; + */ + valuePath: string[]; }; /** diff --git a/src/query/relational-compile.ts b/src/query/relational-compile.ts index 25a076f..c574ad1 100644 --- a/src/query/relational-compile.ts +++ b/src/query/relational-compile.ts @@ -154,8 +154,19 @@ export function relationalCompiler( ): QueryExpression => { requireAvailable(names, available, node); const meta = names.at(-2) === "_qx"; - const { row, path, nullable } = walk(root, names.slice(0, meta ? -2 : -1), uses, node); - const name = names.at(-1)!; + let fieldIndex = names.length - 1; + if (!meta) { + let cursor = root; + for (let index = 0; index < names.length; index++) { + if (cursor.kind === "object" && rowFields(cursor).get(names[index]!)?.kind === "leaf") { + fieldIndex = index; + break; + } + if (index < names.length - 1) cursor = walk(root, names.slice(0, index + 1), uses, node).row; + } + } + const { row, path, nullable } = walk(root, names.slice(0, meta ? -2 : fieldIndex), uses, node); + const name = names[meta ? names.length - 1 : fieldIndex]!; let type: ValueType, leaf: QueryExpression["leaf"]; if (meta) { if (name === "ref" && row.kind === "object") { @@ -185,7 +196,24 @@ export function relationalCompiler( for (const use of uses) mark(row.interfaceRevisionId, name, use, node); const member = env.contracts.get(row.interfaceRevisionId)!.members.find((m) => m.displayName === name)!; type = field.type; - leaf = { kind: "field", interfaceRevisionId: row.interfaceRevisionId, memberId: member.id }; + const valuePath = names.slice(fieldIndex + 1); + let valueNullable = false; + for (const component of valuePath) { + if (type.kind === "optional") { + valueNullable = true; + type = type.value; + } + if (type.kind !== "record" || !Object.hasOwn(type.fields, component)) + return fail("QUERY_FIELD_NOT_QUERYABLE", `Unknown scalar value path ${names.join(".")}`, node); + type = type.fields[component]!; + } + if (valueNullable && type.kind !== "optional") type = valueType.optional(type); + leaf = { + kind: "field", + interfaceRevisionId: row.interfaceRevisionId, + memberId: member.id, + ...(valuePath.length ? { valuePath } : {}), + }; } return { path, leaf, type: nullable && type.kind !== "optional" ? valueType.optional(type) : type }; }; @@ -356,15 +384,22 @@ export function relationalCompiler( } } } else { - const expr = expression(row, [...base, name], ["predicate"], field, available); - children.push( - ...(comparisons(field.value, (operator, value) => ({ - kind: "compare", - expression: expr, - operator, - value, - })) as QueryPredicate[]), - ); + const valuePredicate = (names: string[], value: ValueNode) => { + const expr = expression(row, names, ["predicate"], field, available); + const type = expr.type.kind === "optional" ? expr.type.value : expr.type; + if (type.kind === "record") { + for (const child of pairs(value)) valuePredicate([...names, child.name.value], child.value); + } else + children.push( + ...(comparisons(value, (operator, value) => ({ + kind: "compare", + expression: expr, + operator, + value, + })) as QueryPredicate[]), + ); + }; + valuePredicate([...base, name], field.value); } } }; diff --git a/src/query/relational-schema.ts b/src/query/relational-schema.ts index b26050b..fb004e7 100644 --- a/src/query/relational-schema.ts +++ b/src/query/relational-schema.ts @@ -1,3 +1,4 @@ +import { comparableValue } from "./structured.js"; import { GraphQLBoolean, GraphQLString, @@ -45,6 +46,7 @@ export interface RelationalSchemaEnvironment { name(id: InterfaceRevisionId): string; scalar(type: ValueType): GraphQLInputType & GraphQLOutputType; comparison(type: ValueType): GraphQLInputObjectType; + valueOrder(type: ValueType): GraphQLInputType; scalarTypes: Map; direction: GraphQLEnumType; cursor: GraphQLScalarType; @@ -255,7 +257,8 @@ export function relationalSchema(env: RelationalSchemaEnvironment, document?: Do continue; } } - result[name] = { type: ordering ? env.direction : compare(type) }; + if (!comparableValue(type, ordering)) continue; + result[name] = { type: ordering ? env.valueOrder(type) : compare(type) }; } } const meta: GraphQLInputFieldConfigMap = {}; @@ -300,6 +303,7 @@ export function relationalSchema(env: RelationalSchemaEnvironment, document?: Do for (const [name, field] of fields(row)) { if (row.kind === "object" && field.kind === "row") continue; if (name in result) throw new QueryCompileError("QUERY_SCHEMA_NAME", `Reserved predicate name ${name}`); + if (field.kind === "leaf" && !comparableValue(field.type)) continue; result[name] = { type: field.kind === "row" ? where(field.row) : compare(field.type) }; } result._qx = { diff --git a/src/query/relational.ts b/src/query/relational.ts index cbfd509..5f1886a 100644 --- a/src/query/relational.ts +++ b/src/query/relational.ts @@ -49,7 +49,7 @@ export type QueryPathStep = export interface QueryExpression { path: QueryPathStep[]; leaf: - | { kind: "field"; interfaceRevisionId: InterfaceRevisionId; memberId: MemberId } + | { kind: "field"; interfaceRevisionId: InterfaceRevisionId; memberId: MemberId; valuePath?: string[] } | { kind: "ref"; interfaceRevisionId: InterfaceRevisionId } | { kind: "entry" | "mapKey" }; type: ValueType; diff --git a/src/query/schema.ts b/src/query/schema.ts index a4da7a8..0d5c324 100644 --- a/src/query/schema.ts +++ b/src/query/schema.ts @@ -1,3 +1,4 @@ +import { structuredQueryTypes, comparableValue } from "./structured.js"; import { GraphQLBoolean, GraphQLString, @@ -132,7 +133,7 @@ export function querySchema( throw new QueryCompileError("QUERY_TYPE", "Only scalar/optional scalar query fields are supported"); return queryScalars[type.name]; }; - const comparison = (type: ValueType) => { + const scalarComparison = (type: ValueType) => { const base = type.kind === "optional" ? type.value : type; const value = scalar(base); const key = String(value); @@ -149,8 +150,21 @@ export function querySchema( } return result; }; + const structured = structuredQueryTypes(scalar, scalarComparison, direction); + const comparison = (type: ValueType) => structured.input(type) as GraphQLInputObjectType; const relational = relationalSchema( - { contracts, target, name, scalar, comparison, scalarTypes, direction, cursor: cursorScalar, pageInfo }, + { + contracts, + target, + name, + scalar, + comparison, + valueOrder: (type) => structured.input(type, true), + scalarTypes, + direction, + cursor: cursorScalar, + pageInfo, + }, document, ); relational.discover(root.interface); @@ -162,7 +176,7 @@ export function querySchema( for (const member of contract(id).members) { if (member.kind !== "value" || !member.queryRead) continue; const t = member.valueType.kind === "optional" ? member.valueType.value : member.valueType; - if (t.kind === "scalar" && t.name !== "bytes") fields[member.displayName] = { type: direction }; + if (comparableValue(t, true)) fields[member.displayName] = { type: structured.input(t, true) }; } if (Object.keys(fields).length === 0) return undefined; result = new GraphQLInputObjectType({ name: `${name(id)}Order`, fields }); @@ -190,10 +204,7 @@ export function querySchema( if (!/^[_A-Za-z][_0-9A-Za-z]*$/.test(member.displayName) || member.displayName.startsWith("_")) throw new QueryCompileError("QUERY_SCHEMA_NAME", `Unsupported query field name ${member.displayName}`); if (member.kind === "value") { - const type = scalar(member.valueType); - fields[member.displayName] = { - type: member.valueType.kind === "optional" ? type : new GraphQLNonNull(type), - }; + fields[member.displayName] = { type: structured.output(member.valueType) }; } else { const targetId = target(member), node = object(targetId); diff --git a/src/query/structured.ts b/src/query/structured.ts new file mode 100644 index 0000000..f628cb3 --- /dev/null +++ b/src/query/structured.ts @@ -0,0 +1,76 @@ +import { createHash } from "node:crypto"; +import { + GraphQLObjectType, + GraphQLInputObjectType, + GraphQLList, + GraphQLNonNull, + type GraphQLNullableType, + type GraphQLOutputType, + type GraphQLInputType, + type GraphQLEnumType, +} from "graphql"; +import type { ValueType } from "../capability-model/types.js"; +import { QueryCompileError } from "./types.js"; + +export function comparableValue(type: ValueType, ordering = false): boolean { + if (type.kind === "optional") return comparableValue(type.value, ordering); + if (type.kind === "record") return Object.values(type.fields).some((t) => comparableValue(t, ordering)); + return type.kind === "scalar" && (!ordering || type.name !== "bytes"); +} + +/** Structured values retain one field identity; their children are value projections. */ +export function structuredQueryTypes( + scalar: (type: ValueType) => GraphQLInputType & GraphQLOutputType, + scalarComparison: (type: ValueType) => GraphQLInputObjectType, + direction: GraphQLEnumType, +) { + const objects = new Map(); + const inputs = new Map(); + const name = (role: string, type: ValueType) => + `QxValue${role}_${createHash("sha256").update(JSON.stringify(type)).digest("hex").slice(0, 16)}`; + const output = (type: ValueType, depth = 0): GraphQLOutputType => { + if (depth > 128) throw new QueryCompileError("QUERY_TYPE", "Structured value exceeds type depth limit"); + if (type.kind === "optional") return required(type.value, depth + 1); + return new GraphQLNonNull(required(type, depth)); + }; + const required = (type: ValueType, depth: number): GraphQLNullableType & GraphQLOutputType => { + if (type.kind === "optional") return required(type.value, depth + 1); + if (type.kind === "list") return new GraphQLList(output(type.value, depth + 1)); + if (type.kind !== "record") return scalar(type) as GraphQLNullableType & GraphQLOutputType; + const key = name("Record", type); + let result = objects.get(key); + if (!result) { + if (!Object.keys(type.fields).length) + throw new QueryCompileError("QUERY_TYPE", "Queryable records must have at least one field"); + result = new GraphQLObjectType({ + name: key, + fields: () => + Object.fromEntries( + Object.entries(type.fields).map(([key, value]) => [key, { type: output(value, depth + 1) }]), + ), + }); + objects.set(key, result); + } + return result; + }; + const input = (type: ValueType, ordering = false): GraphQLInputType => { + if (type.kind === "optional") return input(type.value, ordering); + if (type.kind !== "record") return ordering ? direction : scalarComparison(type); + const key = name(ordering ? "Order" : "Compare", type); + let result = inputs.get(key); + if (!result) { + result = new GraphQLInputObjectType({ + name: key, + fields: () => + Object.fromEntries( + Object.entries(type.fields) + .filter(([, value]) => comparableValue(value, ordering)) + .map(([key, value]) => [key, { type: input(value, ordering) }]), + ), + }); + inputs.set(key, result); + } + return result; + }; + return { output, input }; +} diff --git a/test/crdt-edit-contracts.test.ts b/test/crdt-edit-contracts.test.ts new file mode 100644 index 0000000..c97329b --- /dev/null +++ b/test/crdt-edit-contracts.test.ts @@ -0,0 +1,91 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/index.js"; +const source = { repository: "https://example.test/edit.git", commit: "a".repeat(40) }; +const content = "record { text:string; tags:list; }"; +const iface = compileCapabilityResourceSource( + `interface Comment id "comment" revision "comment@1" { + value content id "content" : ${content} { + get id "content:get" execution snapshot targets [browser, server]; + edit id "content:edit" execution transaction targets [browser, server]; + } +}`, + { source }, +); +assert.ok(iface.ok && iface.resource.kind === "interface", JSON.stringify(iface.diagnostics)); +const contract = iface.resource.revision; +const compile = (policy = `crdt(${content})`, binding = "edit") => + compileCapabilitySource( + ` +workspace Comments id "w" revision "w@1" commit "${"a".repeat(40)}" { + import interface Comment; + atom Comment id "comment"; + conform Comment as Comment id "owner:comment" { + private state Content id "content" on Comment : ${content} policy ${policy}; + initialize { content to state Content; }; + bind content.get to state Content.read; + bind content.edit to state Content.${binding}; + } +}`, + "comments.qx", + { interfaces: new Map([["Comment", contract]]), interfaceClosure: [contract] }, + ); +test("native edit is an explicit typed change capability over structured content", () => { + const result = compile(); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const member = contract.members[0]!; + assert.equal(member.kind, "value"); + if (member.kind !== "value") return; + assert.deepEqual(member.operations[1]!.inputType, { kind: "change", value: member.valueType }); + assert.equal(result.workspace.conformances[0]!.operationBindings[1]!.binding.kind, "state"); +}); +test("edit cannot target a register, mismatched profile, or ordinary replacement", () => { + for (const [policy, binding] of [ + ["register", "edit"], + ["crdt(bytes)", "edit"], + [`crdt(${content})`, "write"], + ]) { + const result = compile(policy, binding); + assert.equal(result.ok, false); + assert.ok( + result.diagnostics.some((d) => d.code === "invalid-state-binding"), + JSON.stringify(result.diagnostics), + ); + } +}); +test("authored prepared change transport values fail explicitly until their runtime is implemented", () => { + const result = compileCapabilityResourceSource( + 'package P id "p" revision "p@1" { function applyChange id "apply" : change -> unit; }', + { source }, + ); + assert.equal(result.ok, false); + assert.ok( + result.diagnostics.some((d) => d.code === "unsupported-prepared-change"), + JSON.stringify(result.diagnostics), + ); +}); + +test("generic edit retains its materialized type through specialization", () => { + const generic = compileCapabilityResourceSource( + `interface Cell id "cell" revision "cell@1" { + value content id "content" : T { get id "get"; edit id "edit" execution transaction targets [browser, server]; } + }`, + { source }, + ); + assert.ok(generic.ok && generic.resource.kind === "interface", JSON.stringify(generic.diagnostics)); + const result = compileCapabilitySource( + `workspace W id "w" revision "w@1" commit "${"a".repeat(40)}" { + import interface Cell; + atom Note id "note"; + conform Note as Cell<${content}> { + private state Content id "content" on Note : ${content} policy crdt(${content}); + bind content to state Content; + } + }`, + "cell.qx", + { interfaces: new Map([["Cell", generic.resource.revision]]), interfaceClosure: [generic.resource.revision] }, + ); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const applied = result.workspace.interfaceImports.find((i) => i.application)!; + assert.equal(applied.members[0]!.operations[1]!.inputType.kind, "change"); +}); diff --git a/test/generics.test.ts b/test/generics.test.ts index 7272f10..8cef6b4 100644 --- a/test/generics.test.ts +++ b/test/generics.test.ts @@ -455,8 +455,8 @@ test("expanding recursive generic interfaces fail with a bounded diagnostic", () assert.equal(result.diagnostics[0].code, "recursive-application"); }); -test("storable parameters do not imply support for RPC-only records", () => { - assert.equal(isStorableType({ kind: "record", fields: { name: valueType.string } }), false); +test("storable records recursively require storable leaves", () => { + assert.equal(isStorableType({ kind: "record", fields: { name: valueType.string } }), true); assert.equal(isStorableType(valueType.list(valueType.optional(valueType.string))), true); }); diff --git a/test/query-contracts.test.ts b/test/query-contracts.test.ts index c8f15f2..0068437 100644 --- a/test/query-contracts.test.ts +++ b/test/query-contracts.test.ts @@ -34,7 +34,7 @@ test("queryable fields need one authoritative getter and supported values", () = assert.equal(compile('queryable value title id "title" : string { get id "title:get"; }').ok, true); for (const member of [ 'queryable value title id "title" : string { set id "title:set"; }', - 'queryable value title id "title" : list { get id "title:get"; }', + 'queryable value title id "title" : list { get id "title:get"; }', 'queryable value title id "title" : string { get id "title:get"; get id "other:get"; }', ]) assert.equal(compile(member).ok, false, member); diff --git a/test/query-structured.test.ts b/test/query-structured.test.ts new file mode 100644 index 0000000..7709bc5 --- /dev/null +++ b/test/query-structured.test.ts @@ -0,0 +1,86 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { compileCapabilityResourceSource } from "../src/capability-language/index.js"; +import { compileQuery } from "../src/query/compile.js"; +import { querySelectionToWire } from "../src/query/proto.js"; +import { defaultQueryBudgets, type QueryDeclaration } from "../src/query/types.js"; +const source = { repository: "https://example.test/structured.git", commit: "a".repeat(40) }; +const result = compileCapabilityResourceSource( + `interface Highlight id "highlight" revision "highlight@1" { + queryable value range id "range" : record { sourceRevision:string; start:int32; end:int32; } { get id "range:get" execution snapshot targets [browser, server]; } + queryable value content id "content" : record { text:string; tags:list; metadata:optional; } { get id "content:get" execution snapshot targets [browser, server]; } +}`, + { source }, +); +assert.ok(result.ok && result.resource.kind === "interface", JSON.stringify(result.diagnostics)); +const iface = result.resource.revision; +const declaration: QueryDeclaration = { + id: "rows", + displayName: "Rows", + root: { kind: "workspace-interface", interface: iface.revisionId }, + document: "rows.graphql", + operation: "Rows", + fragments: [], + views: [], + allowances: [], + budgets: { ...defaultQueryBudgets }, + watch: false, +}; +const compile = (selection: string) => + compileQuery( + declaration, + [iface], + async () => + `query Rows {root {objects(first:10, ${selection}) {entries {node {position:range {begin:start end} content {text tags metadata {score}}}}}}}`, + ); +test("record/list query values preserve nested projections and leaf predicates", async () => { + const checked = await compile( + "where:{range:{start:{gte:4}},content:{metadata:{score:{gt:2}}}}, orderBy:{range:{start:ASC}}", + ); + const extent = checked.selection[0]!.selection[0]!; + assert.equal(extent.predicate?.kind, "and"); + if (extent.predicate?.kind !== "and") return; + const expressions = extent.predicate.children.map((p) => (p.kind === "compare" ? p.expression : undefined)); + assert.deepEqual( + expressions.map((e) => e?.leaf), + [ + { kind: "field", interfaceRevisionId: "highlight@1", memberId: "range", valuePath: ["start"] }, + { kind: "field", interfaceRevisionId: "highlight@1", memberId: "content", valuePath: ["metadata", "score"] }, + ], + ); + assert.deepEqual(expressions[1]?.type, { kind: "optional", value: { kind: "scalar", name: "int32" } }); + const wire = querySelectionToWire(extent); + assert.equal(wire.predicate?.predicate.case, "and"); + if (wire.predicate?.predicate.case === "and") { + const child = wire.predicate.predicate.value.children[0]!; + assert.equal(child.predicate.case, "compare"); + if (child.predicate.case === "compare") { + const operand = child.predicate.value.operand?.operand; + assert.ok(operand?.case === "expression" && operand.value.leaf.case === "field"); + assert.deepEqual(operand.value.leaf.value.valuePath, ["start"]); + } + } + const raw = JSON.stringify(checked.output); + assert.match(raw, /"begin"/); + assert.match(raw, /"tags":\{"kind":"list"/); + assert.equal(checked.effects.filter((e) => e.memberId === "range").length, 1); +}); +test("structured predicates reject whole-record scalar comparisons and implicit list expansion", async () => { + await assert.rejects(compile("where:{range:{eq:4}}"), /not defined/); + await assert.rejects(compile('where:{content:{tags:{eq:"x"}}}'), /not defined/); +}); + +test("explicit budgets can exceed defaults without exceeding wire bounds", () => { + const compile = (rows: string) => + compileCapabilityResourceSource( + `import interface Highlight; + package P id "p" revision "p@1" { + query Rows id "rows" root Highlight document "rows.graphql" operation "Rows" { replica; max rows ${rows}; max result-bytes 8388608; } + }`, + { source, environment: { interfaces: new Map([["Highlight", iface]]), interfaceClosure: [iface] } }, + ); + const result = compile("5000"); + assert.ok(result.ok && result.resource.kind === "package", JSON.stringify(result.diagnostics)); + assert.equal(result.resource.revision.queries![0]!.budgets.rows, 5000); + assert.equal(compile("4294967296").ok, false); +}); From 15c132a38b45df04b78db98eec961eb384928eb1 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sat, 19 Sep 2026 22:33:20 -0700 Subject: [PATCH 09/91] Compile complete local-first reader and scope fixtures --- .../local-first-reader/CommentData.qx | 27 ++++++ .../local-first-reader/DocumentActions.qx | 25 +++++ .../local-first-reader/DocumentData.qx | 36 +++++++ .../local-first-reader/DocumentFactory.qx | 25 +++++ .../local-first-reader/HighlightData.qx | 39 ++++++++ .../local-first-reader/ReaderRuntime.qx | 83 ++++++++++++++++ .../queries/editor-inputs.graphql | 1 + .../queries/editor-view.graphql | 1 + .../queries/highlight-list.graphql | 1 + .../queries/highlight-scope.graphql | 1 + .../queries/reader-screen.graphql | 21 ++++ .../queries/replica-inputs.graphql | 20 ++++ test/fixtures/local-first-reader/workspace.qx | 92 ++++++++++++++++++ test/local-first-reader.test.ts | 97 +++++++++++++++++++ 14 files changed, 469 insertions(+) create mode 100644 test/fixtures/local-first-reader/CommentData.qx create mode 100644 test/fixtures/local-first-reader/DocumentActions.qx create mode 100644 test/fixtures/local-first-reader/DocumentData.qx create mode 100644 test/fixtures/local-first-reader/DocumentFactory.qx create mode 100644 test/fixtures/local-first-reader/HighlightData.qx create mode 100644 test/fixtures/local-first-reader/ReaderRuntime.qx create mode 100644 test/fixtures/local-first-reader/queries/editor-inputs.graphql create mode 100644 test/fixtures/local-first-reader/queries/editor-view.graphql create mode 100644 test/fixtures/local-first-reader/queries/highlight-list.graphql create mode 100644 test/fixtures/local-first-reader/queries/highlight-scope.graphql create mode 100644 test/fixtures/local-first-reader/queries/reader-screen.graphql create mode 100644 test/fixtures/local-first-reader/queries/replica-inputs.graphql create mode 100644 test/fixtures/local-first-reader/workspace.qx create mode 100644 test/local-first-reader.test.ts diff --git a/test/fixtures/local-first-reader/CommentData.qx b/test/fixtures/local-first-reader/CommentData.qx new file mode 100644 index 0000000..8bfebb8 --- /dev/null +++ b/test/fixtures/local-first-reader/CommentData.qx @@ -0,0 +1,27 @@ +// Shared record definitions, repeated explicitly in independently locked resources. +external atom Document id "atom:reader:document"; +external atom Highlight id "atom:reader:highlight"; +external atom Comment id "atom:reader:comment"; + +type SourceRange = record { + sourceRevision: string; + start: int32; + end: int32; +}; + +type CommentContent = record { + text: string; + tags: list; +}; + +type DocumentSeed = record { sourceRevision: string; content: string; }; + +interface CommentData id "interface:reader:comment-data" +revision "interface:reader:comment-data@1" { + queryable value content id "comment:content" : CommentContent { + get id "comment:content:get" + execution snapshot targets [browser, server]; + edit id "comment:content:edit" + execution transaction targets [browser, server]; + } +} diff --git a/test/fixtures/local-first-reader/DocumentActions.qx b/test/fixtures/local-first-reader/DocumentActions.qx new file mode 100644 index 0000000..ae18ac1 --- /dev/null +++ b/test/fixtures/local-first-reader/DocumentActions.qx @@ -0,0 +1,25 @@ +// Shared record definitions, repeated explicitly in independently locked resources. +external atom Document id "atom:reader:document"; +external atom Highlight id "atom:reader:highlight"; +external atom Comment id "atom:reader:comment"; + +type SourceRange = record { + sourceRevision: string; + start: int32; + end: int32; +}; + +type CommentContent = record { + text: string; + tags: list; +}; + +type DocumentSeed = record { sourceRevision: string; content: string; }; + +interface DocumentActions id "interface:reader:document-actions" +revision "interface:reader:document-actions@1" { + operation annotate id "document:annotate" : SourceRange -> atom-ref { + call id "document:annotate:call" + execution transaction targets [browser, server]; + } +} diff --git a/test/fixtures/local-first-reader/DocumentData.qx b/test/fixtures/local-first-reader/DocumentData.qx new file mode 100644 index 0000000..7526ba5 --- /dev/null +++ b/test/fixtures/local-first-reader/DocumentData.qx @@ -0,0 +1,36 @@ +// Shared record definitions, repeated explicitly in independently locked resources. +external atom Document id "atom:reader:document"; +external atom Highlight id "atom:reader:highlight"; +external atom Comment id "atom:reader:comment"; + +type SourceRange = record { + sourceRevision: string; + start: int32; + end: int32; +}; + +type CommentContent = record { + text: string; + tags: list; +}; + +type DocumentSeed = record { sourceRevision: string; content: string; }; + +interface DocumentData id "interface:reader:document-data" +revision "interface:reader:document-data@1" { + queryable value sourceRevision id "document:source-revision" : string { + get id "document:source-revision:get" + execution snapshot targets [browser, server]; + } + queryable value content id "document:content" : string { + get id "document:content:get" + execution snapshot targets [browser, server]; + } + queryable relation highlights id "document:highlights" + : many-unique atom Highlight { + resolve id "document:highlights:resolve" + execution snapshot targets [browser, server]; + connect id "document:highlights:connect" + execution transaction targets [browser, server]; + } +} diff --git a/test/fixtures/local-first-reader/DocumentFactory.qx b/test/fixtures/local-first-reader/DocumentFactory.qx new file mode 100644 index 0000000..e8bdbd3 --- /dev/null +++ b/test/fixtures/local-first-reader/DocumentFactory.qx @@ -0,0 +1,25 @@ +// Shared record definitions, repeated explicitly in independently locked resources. +external atom Document id "atom:reader:document"; +external atom Highlight id "atom:reader:highlight"; +external atom Comment id "atom:reader:comment"; + +type SourceRange = record { + sourceRevision: string; + start: int32; + end: int32; +}; + +type CommentContent = record { + text: string; + tags: list; +}; + +type DocumentSeed = record { sourceRevision: string; content: string; }; + +interface DocumentFactory id "interface:reader:document-factory" +revision "interface:reader:document-factory@1" { + static operation create id "document:create" : DocumentSeed -> atom-ref { + call id "document:create:call" + execution transaction targets [browser, server]; + } +} diff --git a/test/fixtures/local-first-reader/HighlightData.qx b/test/fixtures/local-first-reader/HighlightData.qx new file mode 100644 index 0000000..035f501 --- /dev/null +++ b/test/fixtures/local-first-reader/HighlightData.qx @@ -0,0 +1,39 @@ +// Shared record definitions, repeated explicitly in independently locked resources. +external atom Document id "atom:reader:document"; +external atom Highlight id "atom:reader:highlight"; +external atom Comment id "atom:reader:comment"; + +type SourceRange = record { + sourceRevision: string; + start: int32; + end: int32; +}; + +type CommentContent = record { + text: string; + tags: list; +}; + +type DocumentSeed = record { sourceRevision: string; content: string; }; + +interface HighlightData id "interface:reader:highlight-data" +revision "interface:reader:highlight-data@1" { + queryable value range id "highlight:range" : SourceRange { + get id "highlight:range:get" + execution snapshot targets [browser, server]; + } + queryable value color id "highlight:color" : string { + get id "highlight:color:get" + execution snapshot targets [browser, server]; + set id "highlight:color:set" + execution transaction targets [browser, server]; + } + queryable portable value excerpt id "highlight:excerpt" : string { + get id "highlight:excerpt:get" + execution snapshot targets [browser, server]; + } + queryable relation comments id "highlight:comments" : many-unique atom Comment { + resolve id "highlight:comments:resolve" + execution snapshot targets [browser, server]; + } +} diff --git a/test/fixtures/local-first-reader/ReaderRuntime.qx b/test/fixtures/local-first-reader/ReaderRuntime.qx new file mode 100644 index 0000000..629a3ef --- /dev/null +++ b/test/fixtures/local-first-reader/ReaderRuntime.qx @@ -0,0 +1,83 @@ +// Shared record definitions, repeated explicitly in independently locked resources. +external atom Document id "atom:reader:document"; +external atom Highlight id "atom:reader:highlight"; +external atom Comment id "atom:reader:comment"; + +type SourceRange = record { + sourceRevision: string; + start: int32; + end: int32; +}; + +type CommentContent = record { + text: string; + tags: list; +}; + +type DocumentSeed = record { sourceRevision: string; content: string; }; + +import interface DocumentData; +import interface HighlightData; +import interface CommentData; +type CommentSeed = record { content: CommentContent; }; +type HighlightSeed = record { + range: SourceRange; + comments: list; }>; +}; + +package ReaderRuntime id "package:reader-runtime" +revision "package:reader-runtime@1" { + operation addHighlight id "reader:add-highlight" + : SourceRange -> atom-ref + mode call execution transaction targets [browser, server] + receiver atom Document requires { + interface document id "reader:add:document" : DocumentData + using [sourceRevision.get, content.get, highlights.connect]; + creation highlight id "reader:add:highlight" : Highlight input HighlightSeed; + creation comment id "reader:add:comment" : Comment input CommentSeed; + }; + + operation excerpt id "reader:excerpt" : unit -> string + mode call execution snapshot targets [browser, server] + receiver atom Highlight requires { + state range id "reader:excerpt:range" : SourceRange [read]; + interface document id "reader:excerpt:document" : DocumentData + using [sourceRevision.get, content.get]; + }; + + // A receiverless function needs no synthetic service object. + function validateRange id "reader:validate-range" + : record { range: SourceRange; content: string; } -> bool + execution snapshot targets [browser, server]; + + function createDocument id "reader:create-document" + : DocumentSeed -> atom-ref + execution transaction targets [browser, server] requires { + creation document id "reader:create:document" : Document input DocumentSeed; + }; + query ReplicaInputs id "reader:replica-inputs" root DocumentData + document "queries/replica-inputs.graphql" operation "ReplicaInputs" { + replica; + view Highlight as HighlightData; + view Comment as CommentData; + max rows 5000; + max depth 8; + max result-bytes 8388608; + } + + query ReaderScreen id "reader:screen" root DocumentData + document "queries/reader-screen.graphql" operation "ReaderScreen" { + local from ReplicaInputs; + view Highlight as HighlightData; + view Comment as CommentData; + max rows 5000; + max depth 8; + max result-bytes 8388608; + watch; + } + + query HighlightScope id "reader:highlight-scope" root workspace HighlightData document "queries/highlight-scope.graphql" operation "HighlightScope" { view Comment as CommentData; replica; max rows 200; } + query HighlightList id "reader:highlight-list" root workspace HighlightData document "queries/highlight-list.graphql" operation "HighlightList" { view Comment as CommentData; local from HighlightScope; max rows 200; watch; } + query HighlightEditorInputs id "reader:editor-inputs" root HighlightData document "queries/editor-inputs.graphql" operation "HighlightEditorInputs" { view Comment as CommentData; replica; max rows 1; } + query HighlightEditorView id "reader:editor-view" root HighlightData document "queries/editor-view.graphql" operation "HighlightEditorView" { view Comment as CommentData; local from HighlightEditorInputs; max rows 1; watch; } +} diff --git a/test/fixtures/local-first-reader/queries/editor-inputs.graphql b/test/fixtures/local-first-reader/queries/editor-inputs.graphql new file mode 100644 index 0000000..b69323d --- /dev/null +++ b/test/fixtures/local-first-reader/queries/editor-inputs.graphql @@ -0,0 +1 @@ +query HighlightEditorInputs { root { _qx {ref} color range {sourceRevision start end} } } diff --git a/test/fixtures/local-first-reader/queries/editor-view.graphql b/test/fixtures/local-first-reader/queries/editor-view.graphql new file mode 100644 index 0000000..97a1cc4 --- /dev/null +++ b/test/fixtures/local-first-reader/queries/editor-view.graphql @@ -0,0 +1 @@ +query HighlightEditorView { root { _qx {ref} color @live range {sourceRevision start end} } } diff --git a/test/fixtures/local-first-reader/queries/highlight-list.graphql b/test/fixtures/local-first-reader/queries/highlight-list.graphql new file mode 100644 index 0000000..13e0094 --- /dev/null +++ b/test/fixtures/local-first-reader/queries/highlight-list.graphql @@ -0,0 +1 @@ +query HighlightList($color: String!) { root { availableObjects(all: 200, where: {color: {eq: $color}}, orderBy: {range: {start: ASC}}) { entries { key node { _qx {ref} color @live range {sourceRevision start end} } } } } } diff --git a/test/fixtures/local-first-reader/queries/highlight-scope.graphql b/test/fixtures/local-first-reader/queries/highlight-scope.graphql new file mode 100644 index 0000000..eb35067 --- /dev/null +++ b/test/fixtures/local-first-reader/queries/highlight-scope.graphql @@ -0,0 +1 @@ +query HighlightScope($color: String!) { root { objects(all: 200, where: {color: {eq: $color}}) { entries { key node { _qx {ref} color range {sourceRevision start end} } } } } } diff --git a/test/fixtures/local-first-reader/queries/reader-screen.graphql b/test/fixtures/local-first-reader/queries/reader-screen.graphql new file mode 100644 index 0000000..1f50d8c --- /dev/null +++ b/test/fixtures/local-first-reader/queries/reader-screen.graphql @@ -0,0 +1,21 @@ +query ReaderScreen($color: String!) { + root { + sourceRevision + content + highlights(all: 1000, where: {color: {eq: $color}}, orderBy: [{range: {start: ASC}}]) { + entries { + key + node { + _qx { ref } + range { sourceRevision start end } + color @live + excerpt + comments(all: 200) { + entries { key node { _qx { ref } content @live { text tags } } } + } + } + } + } + _qx { relations { highlights { aggregate { count } } } } + } +} diff --git a/test/fixtures/local-first-reader/queries/replica-inputs.graphql b/test/fixtures/local-first-reader/queries/replica-inputs.graphql new file mode 100644 index 0000000..b69387b --- /dev/null +++ b/test/fixtures/local-first-reader/queries/replica-inputs.graphql @@ -0,0 +1,20 @@ +query ReplicaInputs { + root { + sourceRevision + content + highlights(all: 1000) { + entries { + key + node { + _qx { ref } + range { sourceRevision start end } + color + excerpt + comments(all: 200) { + entries { key node { _qx { ref } content { text tags } } } + } + } + } + } + } +} diff --git a/test/fixtures/local-first-reader/workspace.qx b/test/fixtures/local-first-reader/workspace.qx new file mode 100644 index 0000000..ad0b81d --- /dev/null +++ b/test/fixtures/local-first-reader/workspace.qx @@ -0,0 +1,92 @@ +workspace Reader id "workspace:reader" revision "workspace:reader@1" commit "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" { + import interface DocumentData; + import interface HighlightData; + import interface CommentData; + import interface DocumentActions; + import interface DocumentFactory; + import package ReaderRuntime; + // Shared record definitions, repeated explicitly in independently locked resources. + + type SourceRange = record { + sourceRevision: string; + start: int32; + end: int32; + }; + + type CommentContent = record { + text: string; + tags: list; + }; + + type DocumentSeed = record { sourceRevision: string; content: string; }; + + atom Document id "atom:reader:document"; + atom Highlight id "atom:reader:highlight"; + atom Comment id "atom:reader:comment"; + + conform Document as DocumentData id "conformance:reader:document-data" { + private state Revision id "slot:document:revision" + on Document : string policy register; + private state Content id "slot:document:content" + on Document : string policy register; + private edge DocumentHighlights id "edge:document-highlights" { + atom Document projection highlights id "projection:highlights" many-unique; + atom Highlight projection document id "projection:document" + exactly-one public-traversal; + } + initialize { + sourceRevision to state Revision; + content to state Content; + }; + bind sourceRevision.get to state Revision.read; + bind content.get to state Content.read; + bind highlights.resolve to edge DocumentHighlights.highlights.resolve; + bind highlights.connect to edge DocumentHighlights.highlights.connect; + } + + conform Document as DocumentActions id "conformance:reader:document-actions" { + bind annotate.call to package ReaderRuntime.addHighlight with { + document to interface DocumentData; + highlight to creation Highlight with { HighlightData from input; }; + comment to creation Comment with { CommentData from input; }; + }; + } + + conform Document as DocumentFactory id "conformance:reader:document-factory" { + bind create.call to package ReaderRuntime.createDocument with { + document to creation Document with { DocumentData from input; }; + }; + } + + conform Highlight as HighlightData id "conformance:reader:highlight-data" { + private state Range id "slot:highlight:range" + on Highlight : SourceRange policy register; + private state Color id "slot:highlight:color" + on Highlight : string policy register default "yellow"; + private edge HighlightComments id "edge:highlight-comments" { + atom Highlight projection comments id "projection:comments" many-unique; + atom Comment projection highlight id "projection:highlight" + exactly-one public-traversal; + } + initialize { + range to state Range; + comments to edge HighlightComments.comments; + }; + bind range.get to state Range.read; + bind color.get to state Color.read; + bind color.set to state Color.write; + bind comments.resolve to edge HighlightComments.comments.resolve; + bind excerpt.get to package ReaderRuntime.excerpt with { + range to state Range; + document to interface DocumentData via edge DocumentHighlights.document; + }; + } + + conform Comment as CommentData id "conformance:reader:comment-data" { + private state CommentBody id "slot:comment:content" + on Comment : CommentContent policy crdt(CommentContent); + initialize { content to state CommentBody; }; + bind content.get to state CommentBody.read; + bind content.edit to state CommentBody.edit; + } +} diff --git a/test/local-first-reader.test.ts b/test/local-first-reader.test.ts new file mode 100644 index 0000000..cc6ffcd --- /dev/null +++ b/test/local-first-reader.test.ts @@ -0,0 +1,97 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { readFile } from "node:fs/promises"; +import { resolve } from "node:path"; +import { + compileCapabilityResourceSource, + compileCapabilitySource, + formatQx, +} from "../src/capability-language/index.js"; +import type { InterfaceRevision } from "../src/capability-model/types.js"; +import { compileQuery } from "../src/query/compile.js"; +import { linkQueries } from "../src/query/link.js"; +const directory = resolve("test/fixtures/local-first-reader"); +const read = (name: string) => readFile(resolve(directory, name), "utf8"); +const source = { repository: "https://example.test/reader.git", commit: "a".repeat(40) }; +const load = async (transform = (name: string, text: string) => text) => { + const interfaces = new Map(); + for (const name of ["DocumentData", "HighlightData", "CommentData", "DocumentActions", "DocumentFactory"]) { + const text = transform(`${name}.qx`, await read(`${name}.qx`)); + const result = compileCapabilityResourceSource(formatQx(text), { source }); + assert.ok(result.ok && result.resource.kind === "interface", `${name}: ${JSON.stringify(result.diagnostics)}`); + interfaces.set(name, result.resource.revision); + } + const environment = { interfaces, interfaceClosure: [...interfaces.values()] }; + const pkg = compileCapabilityResourceSource(formatQx(transform("ReaderRuntime.qx", await read("ReaderRuntime.qx"))), { + source, + environment, + }); + assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); + const revision = pkg.resource.revision; + revision.checkedQueries = await Promise.all( + revision.queries!.map((query) => compileQuery(query, [...interfaces.values()], read)), + ); + const result = compileCapabilitySource(formatQx(await read("workspace.qx")), "workspace.qx", { + ...environment, + packages: new Map([["ReaderRuntime", revision]]), + packageClosure: [revision], + }); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + return result.workspace; +}; +test("complete reader contracts compose factories, portable selectors, CRDT edits, and six query scopes", async () => { + const workspace = await load(); + assert.equal(workspace.constructors.length, 0); + assert.equal(workspace.atoms.length, 3); + const linked = linkQueries(workspace); + assert.equal(linked.length, 6); + assert.equal(linked.filter((q) => q.checked.declaration.placement?.kind === "local").length, 3); + const screen = linked.find((q) => q.checked.declaration.displayName === "ReaderScreen")!; + assert.ok(screen.fields.some((f) => f.memberId === "highlight:excerpt" && f.binding.kind === "package")); + assert.ok(screen.fields.some((f) => f.memberId === "comment:content" && f.binding.kind === "state")); + assert.equal( + linked.find((q) => q.checked.declaration.displayName === "HighlightEditorInputs")!.checked.declaration.root.kind, + "object", + ); + assert.equal( + linked.find((q) => q.checked.declaration.displayName === "HighlightScope")!.checked.declaration.root.kind, + "workspace-interface", + ); +}); + +test("reader composition reports the dependency that weakens a portable promise", async () => { + await assert.rejects( + load((name, text) => + name === "ReaderRuntime.qx" + ? text.replace(/(operation excerpt[\s\S]*?targets )\[browser, server\]/, "$1[server]") + : text, + ), + /does not provide execution target browser/, + ); + await assert.rejects( + load((name, text) => + name === "ReaderRuntime.qx" + ? text.replace( + "using [sourceRevision.get, content.get];", + "using [sourceRevision.get, content.get, highlights.connect];", + ) + : text, + ), + /Snapshot execution cannot perform a transaction/, + ); +}); + +test("a field can remain server-queryable while failing local query placement", async () => { + const workspace = await load(); + const pkg = workspace.packageImports[0]!; + const highlight = workspace.interfaceImports.find((i) => i.displayName === "HighlightData")!; + const field = highlight.members.find((m) => m.displayName === "color")!; + delete field.operations[0]!.execution; + const admission = pkg.queries!.find((q) => q.displayName === "HighlightScope")!; + const local = pkg.queries!.find((q) => q.displayName === "HighlightList")!; + await compileQuery(admission, workspace.interfaceImports, read); + await assert.rejects( + compileQuery(local, workspace.interfaceImports, read), + /browser snapshot getter for HighlightData.color/, + ); +}); From ac36edf62dea675515178a49b0f2372bf96a72ef Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sat, 19 Sep 2026 23:05:52 -0700 Subject: [PATCH 10/91] Compile closed execution plans and checked artifact manifests --- flake.nix | 2 + package.json | 3 +- src/capability-language/workspace-cli.ts | 10 +- src/execution-world/README.md | 86 +++++ src/execution-world/artifacts.ts | 281 ++++++++++++++++ src/execution-world/index.ts | 3 + src/execution-world/plan.ts | 401 +++++++++++++++++++++++ src/execution-world/ports.ts | 78 +++++ test/execution-world.test.ts | 286 ++++++++++++++++ test/local-first-reader.test.ts | 38 +-- test/reader-fixture.ts | 44 +++ 11 files changed, 1193 insertions(+), 39 deletions(-) create mode 100644 src/execution-world/README.md create mode 100644 src/execution-world/artifacts.ts create mode 100644 src/execution-world/index.ts create mode 100644 src/execution-world/plan.ts create mode 100644 src/execution-world/ports.ts create mode 100644 test/execution-world.test.ts create mode 100644 test/reader-fixture.ts diff --git a/flake.nix b/flake.nix index 7a86d3d..69fa91f 100644 --- a/flake.nix +++ b/flake.nix @@ -39,6 +39,7 @@ export QUIXOS_PROTO_PATH="${pkgs.protobuf}/include:$PWD/proto''${QUIXOS_PROTO_PATH:+:$QUIXOS_PROTO_PATH}" patchShebangs node_modules/.bin node_modules/@bufbuild/protoc-gen-es/bin yarn build + esbuild dist/src/execution-world/index.js --bundle --platform=node --target=node24 --format=esm --outfile=execution-world.mjs esbuild dist/src/bindings/client.js --bundle --platform=node --target=node24 --format=esm --outfile=client-codegen.mjs diff --recursive --unified "$TMPDIR/generated-before/proto" src/gen diff --recursive --unified "$TMPDIR/generated-before/capability" src/capability-language/generated @@ -112,6 +113,7 @@ EOF chmod +x "$out/bin/quixos-lock-check" mkdir -p "$out/libexec/quixos-protocol" + install -m644 execution-world.mjs "$out/libexec/quixos-protocol/execution-world.mjs" install -m644 client-codegen.mjs "$out/libexec/quixos-protocol/client-codegen.mjs" install -m644 react-platform.mjs "$out/libexec/quixos-protocol/react-platform.mjs" install -m644 quixos-codegen-ts.mjs quixos-qx.mjs "$out/libexec/quixos-protocol/" diff --git a/package.json b/package.json index c499da9..742ebb6 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,8 @@ "./capability-model": "./dist/src/capability-model/index.js", "./capability-language": "./dist/src/capability-language/index.js", "./resource-lock": "./dist/src/resource-lock/index.js", - "./gen/*": "./dist/src/gen/*" + "./gen/*": "./dist/src/gen/*", + "./execution-world": "./dist/src/execution-world/index.js" }, "scripts": { "build": "yarn generate && tsc -p tsconfig.build.json", diff --git a/src/capability-language/workspace-cli.ts b/src/capability-language/workspace-cli.ts index f56f80b..e7ddac0 100644 --- a/src/capability-language/workspace-cli.ts +++ b/src/capability-language/workspace-cli.ts @@ -4,6 +4,7 @@ import { readFile, writeFile } from "node:fs/promises"; import process from "node:process"; import { compileWorkspaceRepository } from "./assembly.js"; import { createGitCapabilityResolver } from "./git-resolver.js"; +import { compileExecutionPlan } from "../execution-world/index.js"; import { bindingSchema, specializeBindingSchema } from "../bindings/index.js"; import { planEvolution, @@ -15,7 +16,7 @@ import { const usage = `usage: quixos-workspace-compile --root DIRECTORY --checkout-root DIRECTORY [--snapshot-map PATH] [--graph-out PATH] [--workspace-id ID] [--workspace-revision-id ID] [--source-root-commit GIT_REV] [--baseline PLAN_JSON] [--evolution-out PATH] - [--reviews REVIEW_JSON] [--schemas-out PATH] + [--reviews REVIEW_JSON] [--schemas-out PATH] [--execution-plan-out PATH] Resolves a workspace's recursive resource-lock graph, clones every exact resource revision, validates standalone interface/package manifests, and emits @@ -37,6 +38,7 @@ const parseArgs = (args: string[]) => { checkoutRoot, graphOut: values.get("--graph-out"), schemasOut: values.get("--schemas-out"), + executionPlanOut: values.get("--execution-plan-out"), snapshotMap: values.get("--snapshot-map"), workspaceId: values.get("--workspace-id"), workspaceRevisionId: values.get("--workspace-revision-id"), @@ -98,6 +100,12 @@ const main = async () => { ); } const candidate = { ...assembled.workspace, executionContracts: runtimeContracts(assembled.workspace) }; + if (options.executionPlanOut) { + await writeFile( + options.executionPlanOut, + `${JSON.stringify(compileExecutionPlan(assembled.workspace), null, 2)}\n`, + ); + } if (options.schemasOut) { const schemas: Record = {}; for (const node of assembled.resources.filter((entry) => entry.kind === "package")) { diff --git a/src/execution-world/README.md b/src/execution-world/README.md new file mode 100644 index 0000000..eabbe35 --- /dev/null +++ b/src/execution-world/README.md @@ -0,0 +1,86 @@ +# Closed execution plans and artifacts + +`compileExecutionPlan` validates a workspace, links its checked queries, resolves +public forwarding, and emits one versioned plan with an SHA-256 digest. It retains +exact interface/package revisions and generic applications, owner initialization, +storage definitions/profiles, selected operation identities, query placement, and +source provenance. `quixos-workspace-compile --execution-plan-out PATH` writes it. + +The compiler emits operation dependencies as a graph. A traversed interface port +retains its edge/projection and exact selected operations; native reads identify +the canonical storage inputs. Cycles do not become infinitely expanded paths. +Execution and admission must apply their runtime depth/work budgets when walking +this graph. The plan includes the full linked GraphQL selections, not just root +traversals or a list of fields. + +Local and replica queries must have the same root contract. A local query cannot +introduce a relationship path absent from its replica source; authors expand the +source selection explicitly. Portable getters may require extra canonical fields +and exactly-one dependency traversals, recorded in the dependency graph. Admission +resolves those inputs on the server for selected objects. This never changes the +source query's candidate membership, and does not claim a limited source is a +complete interface extent. An incomplete runtime projection remains a coverage +state, not permission to invent a missing value. + +A portable transaction cannot depend on a local presentation query, including +through a selector. Pass explicit references and preconditions as mutation input. +Otherwise an admitted top-N list could select different mutation targets locally +and at acceptance. Remote transactions can implement explicit server workflows. +This restriction does not ban local queries from snapshot selectors. Such query +ports are view-relative: both hosts must use the frame's admitted candidate +universe. An executor must report unavailable coverage when that view is absent, +not substitute a full-server extent. Query-port acquisition remains unavailable +until the query executor implements this rule; emitting its checked dependency +graph is not runtime support. + +## Artifacts and world identity + +`PackageArtifacts` describes one package output containing a process service and +optional target modules. Implementation IDs are stable manifest keys, separate +from export capability IDs and JavaScript registry names. Each implementation +covers its ABI, export map, entrypoint, and declared asset paths/digests/sizes/MIME. +Its digest excludes its own digest field. Paths must be normalized and relative. + +`checkExecutionWorld` verifies plan identity, supported codecs, exact source and +binding schema, service fallback, promised targets, declared exports, and all +supplied file bytes. The reader must confine paths/symlinks to the checked output +and honor its byte limit before allocation. LF-05 supplies that filesystem adapter, +checks actual module registries/imports, and verifies build receipts; a manifest +claim alone does not establish the JavaScript exports or an isolated process. + +The returned `camino-world-v1` descriptor includes every declared implementation +and its digest, so executor choice does not change semantics or silently load new +code. Each binding key is the JSON pair `[packageRevisionId, implementationId]`; +there can be both a service and module for the server target. World hashing uses +the core codec's canonical ordering and domain-separated SHA-256 framing. The +monorepo `camino-execution-world` check compares the compiler and core implementations. +No machine-local Nix path enters the world descriptor. + +The current binding schema is the closed workspace schema. This is conservative: +an unrelated contract change can require checking/rebuilding several packages. +LF-05 may narrow it to exact checked per-package closures, but must use the same +schema for generation, receipts, and world validation. It must not substitute an +older package schema just because the source revision did not change. + +## Transaction-port ABI + +`quixos-transaction-ports-v1` uses coordinator-issued frame/invocation handles and +monotonic invocation-local sequence numbers. A package receives its export ID, +input, and optional receiver. Port calls name a declared port and its allowed +primitive or exact interface operation; they never select arbitrary private slots, +packages, or coordinator transactions. Creation uses an explicit stable call key. Interface calls into transaction +operations also require a stable key, checked after resolving the selected +operation. The coordinator extends the birth path; it never derives that path +from an asynchronous completion order or the transport sequence number. + +The coordinator resolves each port through the installed operation binding, +checks effects/selected methods, validates typed arguments/references, and joins +nested calls to the outer logical transaction. A nested failure rolls back to its +frame boundary; process completion cannot independently commit. The coordinator +owns savepoints, cancellation, frame expiry, and rejection. These enforcement +mechanisms are LF-06/LF-08, not guarantees provided by TypeScript frame types. + +The service control vocabulary includes readiness, cancellation, and shutdown; +transport framing and generated adapters are LF-05/LF-08. Portable modules and +services implement the same declared operation contracts. ABI compatibility is +not a statement about package trust, co-location permission, or multi-user isolation. diff --git a/src/execution-world/artifacts.ts b/src/execution-world/artifacts.ts new file mode 100644 index 0000000..87b8a73 --- /dev/null +++ b/src/execution-world/artifacts.ts @@ -0,0 +1,281 @@ +import { createHash } from "node:crypto"; +import { canonicalJson } from "../capability-model/evolution.js"; +import { type ExecutionPlan, type PlanPackage, ExecutionPlanError, hexDigest, executionVersions } from "./plan.js"; + +export interface ArtifactFile { + path: string; + digest: string; + bytes: number; + mediaType: string; +} +export interface ArtifactImplementation { + id: string; + target: string; + compatibility: "quixos-service-v1" | "quixos-js-module-v1"; + path: string; + ports: "quixos-transaction-ports-v1"; + registryExport?: string; + exports: string[]; + /** Every executable/imported local asset, including the entrypoint, must be declared. */ + files: ArtifactFile[]; + contentDigest: string; +} +export interface PackageArtifacts { + schemaVersion: 1; + packageRevisionId: string; + bindingDigest: string; + sourceDigest: string; + versions: ExecutionPlan["definition"]["versions"]; + implementations: ArtifactImplementation[]; +} +export interface CheckedWorld { + codec: "camino-world-v1"; + plan: string; + artifacts: { binding: string; target: string; digest: string }[]; + versions: Record; +} +const fail = (path: string, message: string): never => { + throw new ExecutionPlanError("INVALID_ARTIFACT", path, message); +}; +const object = (value: unknown, path: string): Record => { + if (!value || typeof value !== "object" || Array.isArray(value) || Object.getPrototypeOf(value) !== Object.prototype) + fail(path, "Expected a plain JSON record"); + return value as Record; +}; +const keys = (record: Record, required: string[], optional: string[], path: string) => { + if ( + required.some((key) => !Object.hasOwn(record, key)) || + Object.keys(record).some((key) => ![...required, ...optional].includes(key)) + ) + fail(path, "Unexpected or missing fields"); +}; +const text = (value: unknown, path: string): string => { + if ( + typeof value !== "string" || + !value.length || + value.length > 4096 || + value.includes("\0") || + Buffer.from(value, "utf8").toString("utf8") !== value + ) + fail(path, "Expected bounded nonempty text"); + return value as string; +}; +const digest = (value: unknown, path: string): string => { + if (typeof value !== "string" || !/^[0-9a-f]{64}$/.test(value)) fail(path, "Expected SHA-256 hex"); + return value as string; +}; +const array = (value: unknown, path: string): unknown[] => { + if (!Array.isArray(value) || value.length > 10000) fail(path, "Expected a bounded array"); + return value as unknown[]; +}; +const unique = (values: string[], path: string) => { + if (new Set(values).size !== values.length) fail(path, "Duplicate identities"); +}; +export function artifactPath(value: unknown): string { + const path = text(value, "artifact path"); + if ( + path.startsWith("/") || + path.includes("\\") || + path.split("/").some((part) => !part || part === "." || part === "..") || + /[\u0000-\u001f\u007f?#%]/.test(path) + ) + fail(path, "Expected a normalized relative artifact path"); + return path; +} +/** No self-reference: the digest covers ABI/export metadata and the digests of every declared file. */ +export function implementationDigest(implementation: Omit): string { + return hexDigest({ + ...implementation, + exports: [...implementation.exports].sort(), + files: [...implementation.files].sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0)), + }); +} +export function parsePackageArtifacts(value: unknown): PackageArtifacts { + const record = object(value, "manifest"); + keys( + record, + ["schemaVersion", "packageRevisionId", "bindingDigest", "sourceDigest", "versions", "implementations"], + [], + "manifest", + ); + if (record.schemaVersion !== 1) fail("manifest", "Unsupported artifact manifest version"); + const versions = object(record.versions, "versions"); + keys(versions, ["value", "reference", "ports", "crdt"], [], "versions"); + for (const [key, value] of Object.entries(versions)) text(value, `versions.${key}`); + const implementations = array(record.implementations, "implementations").map( + (value, index): ArtifactImplementation => { + const path = `implementations[${index}]`, + entry = object(value, path); + keys( + entry, + ["id", "target", "compatibility", "path", "ports", "exports", "files", "contentDigest"], + ["registryExport"], + path, + ); + if (entry.compatibility !== "quixos-service-v1" && entry.compatibility !== "quixos-js-module-v1") + fail(path, "Unsupported artifact ABI"); + if (entry.ports !== "quixos-transaction-ports-v1") fail(path, "Unsupported transaction port ABI"); + if ( + entry.compatibility === "quixos-service-v1" && + (entry.target !== "server" || entry.registryExport !== undefined) + ) + fail(path, "Service must target server and has no JS registry export"); + if (entry.compatibility === "quixos-js-module-v1") text(entry.registryExport, `${path}.registryExport`); + const exports = array(entry.exports, `${path}.exports`).map((value) => text(value, `${path}.exports`)); + unique(exports, `${path}.exports`); + const files = array(entry.files, `${path}.files`).map((value): ArtifactFile => { + const file = object(value, `${path}.file`); + keys(file, ["path", "digest", "bytes", "mediaType"], [], `${path}.file`); + if ( + !Number.isSafeInteger(file.bytes) || + (file.bytes as number) < 0 || + (file.bytes as number) > 256 * 1024 * 1024 + ) + fail(path, "Artifact file exceeds size bound"); + return { + path: artifactPath(file.path), + digest: digest(file.digest, path), + bytes: file.bytes as number, + mediaType: text(file.mediaType, path), + }; + }); + unique( + files.map((file) => file.path), + `${path}.files`, + ); + const entryPath = artifactPath(entry.path); + if (!files.some((file) => file.path === entryPath)) fail(path, "Entrypoint is not covered by the file manifest"); + const result: ArtifactImplementation = { + id: text(entry.id, path), + target: text(entry.target, path), + compatibility: entry.compatibility as ArtifactImplementation["compatibility"], + path: entryPath, + ports: "quixos-transaction-ports-v1", + exports: exports.sort(), + files: files.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0)), + contentDigest: digest(entry.contentDigest, path), + ...(entry.registryExport !== undefined ? { registryExport: entry.registryExport as string } : {}), + }; + const { contentDigest, ...body } = result; + if (implementationDigest(body) !== contentDigest) fail(path, "Implementation metadata digest mismatch"); + return result; + }, + ); + unique( + implementations.map((implementation) => implementation.id), + "implementations", + ); + return { + schemaVersion: 1, + packageRevisionId: text(record.packageRevisionId, "packageRevisionId"), + bindingDigest: digest(record.bindingDigest, "bindingDigest"), + sourceDigest: digest(record.sourceDigest, "sourceDigest"), + versions: versions as unknown as PackageArtifacts["versions"], + implementations, + }; +} +function checkCoverage(expected: PlanPackage, manifest: PackageArtifacts): void { + if (expected.bindingDigest !== manifest.bindingDigest || expected.sourceDigest !== manifest.sourceDigest) + fail(expected.revision, "Substituted binding schema or source revision"); + for (const implementation of manifest.implementations) + for (const id of implementation.exports) { + const entry = expected.exports.find((e) => e.id === id); + if (!entry) fail(implementation.id, `Unknown export ${id}`); + if ( + implementation.target !== "server" && + (!entry?.execution || + entry.execution.kind === "remote" || + !entry.execution.targets.includes(implementation.target)) + ) + fail(implementation.id, `Export ${id} does not promise target ${implementation.target}`); + } + for (const entry of expected.exports) { + if (!manifest.implementations.some((i) => i.compatibility === "quixos-service-v1" && i.exports.includes(entry.id))) + fail(expected.revision, `Missing service fallback for ${entry.id}`); + if (entry.execution.kind !== "remote") + for (const target of entry.execution.targets) + if ( + !manifest.implementations.some( + (i) => + i.target === target && + i.exports.includes(entry.id) && + (target === "server" || i.compatibility !== "quixos-service-v1"), + ) + ) + fail(expected.revision, `Missing ${target} implementation for ${entry.id}`); + } +} +export type ArtifactReader = (packageRevisionId: string, path: string, maxBytes: number) => Promise; +/** Caller supplies a reader confined to the resolved immutable package output, including symlink checks. */ +export async function checkExecutionWorld( + plan: ExecutionPlan, + inputs: readonly unknown[], + read: ArtifactReader, +): Promise { + if (canonicalJson(plan.definition.versions) !== canonicalJson(executionVersions)) + fail("world", "Unsupported plan codec versions"); + if (hexDigest(plan.definition) !== plan.digest) fail("plan", "Plan digest mismatch"); + const manifests = inputs.map(parsePackageArtifacts); + unique( + manifests.map((m) => m.packageRevisionId), + "packages", + ); + if (manifests.length !== plan.definition.packages.length) fail("world", "Package closure differs from plan"); + const artifacts: CheckedWorld["artifacts"] = []; + for (const expected of plan.definition.packages) { + const manifest = + manifests.find((m) => m.packageRevisionId === expected.revision) ?? + fail(expected.revision, "Missing package artifact"); + checkCoverage(expected, manifest); + if (canonicalJson(manifest.versions) !== canonicalJson(plan.definition.versions)) + fail(expected.revision, "Incompatible runtime codecs"); + const files = new Map(); + for (const implementation of manifest.implementations) { + for (const file of implementation.files) { + const existing = files.get(file.path); + if (existing && canonicalJson(existing) !== canonicalJson(file)) + fail(file.path, "Conflicting file descriptors"); + files.set(file.path, file); + } + artifacts.push({ + binding: JSON.stringify([expected.revision, implementation.id]), + target: implementation.target, + digest: implementation.contentDigest, + }); + } + for (const file of files.values()) { + const bytes = await read(expected.revision, file.path, file.bytes); + if (bytes.byteLength !== file.bytes || createHash("sha256").update(bytes).digest("hex") !== file.digest) + fail(file.path, "Artifact bytes do not match the checked content digest"); + } + } + return { + codec: "camino-world-v1", + plan: plan.digest, + artifacts: artifacts.sort((a, b) => + a.binding < b.binding ? -1 : a.binding > b.binding ? 1 : a.target < b.target ? -1 : a.target > b.target ? 1 : 0, + ), + versions: { ...plan.definition.versions }, + }; +} +/** Node counterpart of replica-core worldDigest. The wire fixture checks cross-package agreement. */ +export function checkedWorldDigest(world: CheckedWorld): string { + const normalized = { + ...world, + artifacts: [...world.artifacts].sort((a, b) => + a.binding < b.binding ? -1 : a.binding > b.binding ? 1 : a.target < b.target ? -1 : a.target > b.target ? 1 : 0, + ), + }; + const json = canonicalJson(normalized), + content = createHash("sha256").update(json).digest("hex"); + const components = ["camino-world-v1", content].map((text) => Buffer.from(text, "utf8")); + const count = Buffer.alloc(4); + count.writeUInt32BE(components.length); + const pieces = [count]; + for (const bytes of components) { + const length = Buffer.alloc(4); + length.writeUInt32BE(bytes.length); + pieces.push(length, bytes); + } + return createHash("sha256").update(Buffer.concat(pieces)).digest("hex"); +} diff --git a/src/execution-world/index.ts b/src/execution-world/index.ts new file mode 100644 index 0000000..110c772 --- /dev/null +++ b/src/execution-world/index.ts @@ -0,0 +1,3 @@ +export * from "./plan.js"; +export * from "./artifacts.js"; +export * from "./ports.js"; diff --git a/src/execution-world/plan.ts b/src/execution-world/plan.ts new file mode 100644 index 0000000..f411da7 --- /dev/null +++ b/src/execution-world/plan.ts @@ -0,0 +1,401 @@ +import type { + WorkspaceRevision, + ExecutionContract, + ValueType, + Binding, + DependencyBinding, + EdgeTraversal, + InterfaceRevisionId, + AtomId, + OperationId, +} from "../capability-model/types.js"; +import { validateWorkspaceRevision } from "../capability-model/validation.js"; +import { canonicalJson, contentDigest } from "../capability-model/evolution.js"; +import { resolveForwardedBinding } from "../capability-model/forwarding.js"; +import { linkQueries, type LinkedQuery } from "../query/link.js"; +import { type BindingSchema } from "../bindings/index.js"; + +export class ExecutionPlanError extends Error { + constructor( + readonly code: string, + readonly path: string, + message: string, + ) { + super(`${code} ${path}: ${message}`); + this.name = "ExecutionPlanError"; + } +} +export const hexDigest = (value: unknown): string => contentDigest(value).slice("sha256:".length); +const sorted = (values: readonly T[], key: (value: T) => string): T[] => + [...values].sort((a, b) => (key(a) < key(b) ? -1 : key(a) > key(b) ? 1 : 0)); +export const publicOperationKey = (atom: string, iface: string, operation: string): string => + JSON.stringify([atom, iface, operation]); +export type DataDependency = + | { kind: "state"; slot: string; via?: EdgeTraversal } + | { kind: "edge"; edge: string; projection: string; via?: EdgeTraversal } + | { kind: "operation"; operation: string; port: string; via?: EdgeTraversal } + | { kind: "query"; query: string; port: string }; +export interface PlannedOperation { + key: string; + atomId: string; + interfaceRevisionId: string; + operationId: string; + scope: "object" | "class"; + execution: ExecutionContract; + input: ValueType; + output: ValueType; + /** Concrete target after public forwarding. Never chosen by a runtime caller. */ + binding: Exclude; + dependencies: DataDependency[]; +} +export interface PlannedQuery { + id: string; + query: LinkedQuery; + /** Query-selected getter entrypoints; dependency traversal supplies canonical inputs. */ + operations: string[]; + /** Local query roots that admission must support, in addition to selected wire outputs. */ + admittedOperations: string[]; +} +export interface PlanPackage { + revision: string; + source: WorkspaceRevision["packageImports"][number]["source"]; + sourceDigest: string; + bindingDigest: string; + exports: { id: string; execution: ExecutionContract }[]; +} +export interface ExecutionPlanDefinition { + codec: "camino-execution-plan-v1"; + workspace: WorkspaceRevision; + bindingSchema: BindingSchema; + packages: PlanPackage[]; + owners: { id: string; atom: string; interface: string; initialization: unknown; storage: unknown }[]; + operations: PlannedOperation[]; + queries: PlannedQuery[]; + profiles: { slot: string; profile: string }[]; + versions: { + value: "camino-value-v1"; + reference: "camino-ref-v1"; + ports: "quixos-transaction-ports-v1"; + crdt: "camino-automerge-3.4.1-structured-v1"; + }; +} +export interface ExecutionPlan { + definition: ExecutionPlanDefinition; + digest: string; +} +export const executionVersions: ExecutionPlanDefinition["versions"] = { + value: "camino-value-v1", + reference: "camino-ref-v1", + ports: "quixos-transaction-ports-v1", + crdt: "camino-automerge-3.4.1-structured-v1", +}; +/** Selection only: the coordinator separately verifies the caller's grant and receiver witness. */ +export function resolvePlannedOperation( + plan: ExecutionPlan, + atom: string, + iface: string, + operation: string, +): PlannedOperation { + const key = publicOperationKey(atom, iface, operation); + const selected = plan.definition.operations.find((entry) => entry.key === key); + if (!selected) throw new ExecutionPlanError("UNINSTALLED_OPERATION", key, "No installed public operation binding"); + return selected; +} + +/** Bound argument/state codec subset. A parsed type alone does not mean a runtime implements it. */ +function checkValue(type: ValueType, path: string, allowChange = false): void { + switch (type.kind) { + case "scalar": + case "object-ref": + return; + case "builtin": + if (type.name === "unit") return; + break; + case "optional": + case "list": + checkValue(type.value, path, allowChange); + return; + case "record": + for (const [name, field] of Object.entries(type.fields)) checkValue(field, `${path}.${name}`, allowChange); + return; + case "change": + if (allowChange) { + checkValue(type.value, path); + return; + } + break; + } + throw new ExecutionPlanError("UNSUPPORTED_PORTABLE_CODEC", path, `Portable execution does not support ${type.kind}`); +} + +/** Compile declarations into a closed dispatch/dependency graph before artifact selection. */ +export function compileExecutionPlan(input: WorkspaceRevision): ExecutionPlan { + const workspace = structuredClone(input); + const issues = validateWorkspaceRevision(workspace); + if (issues.length) + throw new ExecutionPlanError( + "INVALID_WORKSPACE", + workspace.id, + issues.map((i) => `${i.path}: ${i.message}`).join("\n"), + ); + const interfaces = new Map(workspace.interfaceImports.map((i) => [i.revisionId, i])); + const packages = new Map(workspace.packageImports.map((p) => [p.revisionId, p])); + const attachments = [...workspace.sharedAttachments, ...workspace.conformances.flatMap((c) => c.privateAttachments)]; + for (const pkg of workspace.packageImports) + for (const entry of pkg.exports) + if (entry.execution && entry.execution.kind !== "remote") { + checkValue(entry.inputType, `${pkg.revisionId}/${entry.id}/input`); + checkValue(entry.outputType, `${pkg.revisionId}/${entry.id}/output`); + } + for (const attachment of attachments) + if (attachment.kind === "state" && attachment.storagePolicy.kind === "crdt-document") + checkValue(attachment.valueType, attachment.id); + const operationMap = new Map(); + const queries = linkQueries(workspace); + const queryKey = (pkg: string, id: string) => JSON.stringify([pkg, id]); + const queryMap = new Map(queries.map((q) => [queryKey(q.packageRevisionId, q.checked.declaration.id), q])); + const declaration = (iface: InterfaceRevisionId, operation: OperationId) => + interfaces + .get(iface) + ?.members.flatMap((m) => m.operations) + .find((o) => o.id === operation); + const queryOperations = (query: LinkedQuery) => + query.fields.map((f) => publicOperationKey(f.atomId, f.interfaceRevisionId, f.getter)); + const targetAtoms = (binding: DependencyBinding, atom: AtomId): AtomId[] => { + if (!("via" in binding) || !binding.via) return [atom]; + const edge = attachments.find((a) => a.id === binding.via!.edgeTypeId); + if (!edge || edge.kind !== "edge") throw new ExecutionPlanError("MISSING_EDGE", atom, "Missing traversal edge"); + const endpoint = edge.endpoints.find((e) => e.projectionId !== binding.via!.projectionId)!; + const constraint = endpoint.constraint; + return workspace.atoms + .filter((a) => + constraint.kind === "atom" + ? constraint.atomId === a.id + : workspace.conformances.some( + (c) => c.atomId === a.id && c.interfaceRevisionId === constraint.interfaceRevisionId, + ), + ) + .map((a) => a.id); + }; + const add = (atom: AtomId, iface: InterfaceRevisionId, operation: OperationId): PlannedOperation => { + const key = publicOperationKey(atom, iface, operation), + existing = operationMap.get(key); + if (existing) return existing; + const publicContract = declaration(iface, operation); + if (!publicContract) throw new ExecutionPlanError("MISSING_OPERATION", key, "Missing public contract"); + const { binding } = resolveForwardedBinding(workspace, atom, iface, operation); + const planned: PlannedOperation = { + key, + atomId: atom, + interfaceRevisionId: iface, + operationId: operation, + scope: publicContract.scope === "class" ? "class" : "object", + execution: publicContract.execution ?? { kind: "remote" }, + input: publicContract.inputType, + output: publicContract.outputType, + binding, + dependencies: [], + }; + operationMap.set(key, planned); + const portable = planned.execution.kind !== "remote"; + if (portable) { + checkValue(planned.input, `${key}/input`, binding.kind === "state" && binding.primitive === "edit"); + checkValue(planned.output, `${key}/output`); + } + if (binding.kind === "state") planned.dependencies.push({ kind: "state", slot: binding.slotId }); + else if (binding.kind === "edge") + planned.dependencies.push({ kind: "edge", edge: binding.edgeTypeId, projection: binding.projectionId }); + else { + const entry = packages.get(binding.packageRevisionId)?.exports.find((e) => e.id === binding.exportId); + if (!entry) throw new ExecutionPlanError("MISSING_EXPORT", key, "Unresolved package export"); + for (const dependency of binding.dependencies) { + const port = entry.dependencyPorts.find((p) => p.id === dependency.portId)!; + const target = dependency.binding; + const via = "via" in target && target.via ? { via: target.via } : {}; + if ("via" in target && target.via) + planned.dependencies.push({ kind: "edge", edge: target.via.edgeTypeId, projection: target.via.projectionId }); + if (target.kind === "state") planned.dependencies.push({ kind: "state", slot: target.slotId, ...via }); + else if (target.kind === "edge") + planned.dependencies.push({ kind: "edge", edge: target.edgeTypeId, projection: target.projectionId, ...via }); + else if (target.kind === "interface" && port.requirement.kind === "interface") { + const selected = + port.requirement.operations ?? + interfaces.get(target.interfaceRevisionId)!.members.flatMap((m) => m.operations.map((o) => o.id)); + for (const targetAtom of targetAtoms(target, atom)) + for (const selectedOperation of selected) { + const operation = add(targetAtom, target.interfaceRevisionId, selectedOperation); + planned.dependencies.push({ kind: "operation", operation: operation.key, port: port.id, ...via }); + } + } else if (target.kind === "query") { + const query = queryMap.get(queryKey(target.packageRevisionId, target.queryId)); + if (!query) throw new ExecutionPlanError("MISSING_QUERY", key, `Unresolved query port ${port.id}`); + planned.dependencies.push({ + kind: "query", + query: queryKey(target.packageRevisionId, target.queryId), + port: port.id, + }); + } + } + } + planned.dependencies = sorted(planned.dependencies, canonicalJson); + return planned; + }; + for (const conformance of workspace.conformances) + for (const entry of conformance.operationBindings) + add(conformance.atomId, conformance.interfaceRevisionId, entry.operationId); + // Check the transitive closure, retaining a dependency path for diagnostics. + for (const root of operationMap.values()) { + if (root.execution.kind === "remote") continue; + const requested = root.execution, + visited = new Set(); + const walk = (key: string, path: string[]) => { + if (visited.has(key)) return; + visited.add(key); + const node = operationMap.get(key)!; + if (node.execution.kind === "remote" || (requested.kind === "snapshot" && node.execution.kind !== "snapshot")) + throw new ExecutionPlanError( + "NONPORTABLE_DEPENDENCY", + path.join(" -> "), + "Execution effect is not allowed by the root contract", + ); + for (const target of requested.targets) + if (!node.execution.targets.includes(target)) + throw new ExecutionPlanError( + "MISSING_EXECUTION_TARGET", + path.join(" -> "), + `Dependency does not provide ${target}`, + ); + for (const dependency of node.dependencies) { + if (dependency.kind === "operation") + walk(dependency.operation, [...path, dependency.port, dependency.operation]); + if (dependency.kind === "query") { + // An admitted presentation window is not an authoritative mutation read set. + if (requested.kind === "transaction") + throw new ExecutionPlanError( + "QUERY_IN_TRANSACTION", + [...path, dependency.port].join(" -> "), + "Capture explicit object references as mutation inputs; local presentation queries cannot define transaction membership", + ); + const query = queryMap.get(dependency.query)!; + if (query.checked.declaration.placement?.kind !== "local") + throw new ExecutionPlanError( + "REMOTE_QUERY_DEPENDENCY", + path.join(" -> "), + "Portable code requires a local query", + ); + for (const operation of queryOperations(query)) walk(operation, [...path, dependency.port, operation]); + } + } + }; + walk(root.key, [root.key]); + } + const plannedQueries: PlannedQuery[] = queries.map((query) => ({ + id: queryKey(query.packageRevisionId, query.checked.declaration.id), + query, + operations: queryOperations(query).sort(), + admittedOperations: [], + })); + for (const query of plannedQueries) { + const placement = query.query.checked.declaration.placement; + if (placement?.kind !== "local") continue; + const source = plannedQueries.find( + (q) => q.id === queryKey(query.query.packageRevisionId, placement.sourceQueryId), + ); + if (!source || source.query.checked.declaration.placement?.kind !== "replica") + throw new ExecutionPlanError("MISSING_REPLICA_SOURCE", query.id, "Local query source must be a replica query"); + const localRoot = query.query.checked.declaration.root, + sourceRoot = source.query.checked.declaration.root; + if (localRoot.kind !== sourceRoot.kind || localRoot.interface !== sourceRoot.interface) + throw new ExecutionPlanError( + "REPLICA_ROOT_MISMATCH", + query.id, + "Local and replica queries must use the same root contract", + ); + const traversals = (linked: LinkedQuery) => { + const paths = new Set(); + const visit = (selections: LinkedQuery["checked"]["selection"], parents: string[]) => { + for (const selection of selections) { + const member = selection.interfaceRevisionId + ? interfaces.get(selection.interfaceRevisionId)?.members.find((m) => m.id === selection.memberId) + : undefined; + const path = member?.kind === "relationship" ? [...parents, member.id] : parents; + if (member?.kind === "relationship") paths.add(JSON.stringify(path)); + visit(selection.selection, path); + } + }; + visit(linked.checked.selection, []); + return paths; + }; + const admittedTraversals = traversals(source.query); + for (const traversal of traversals(query.query)) + if (!admittedTraversals.has(traversal)) + throw new ExecutionPlanError( + "REPLICA_TRAVERSAL_MISSING", + query.id, + `Replica source does not admit relationship path ${traversal}`, + ); + // The admission executor follows these canonical dependencies on the admitted roots. + // They do not change source candidate membership or make local take/filters authoritative. + source.admittedOperations.push(...query.operations); + for (const operation of query.operations) { + const node = operationMap.get(operation)!; + if (node.execution.kind !== "snapshot" || !node.execution.targets.includes("browser")) + throw new ExecutionPlanError( + "NONPORTABLE_QUERY_FIELD", + `${query.id}/${operation}`, + "Local query getter must provide browser snapshot execution", + ); + } + } + for (const query of plannedQueries) query.admittedOperations = [...new Set(query.admittedOperations)].sort(); + const schema: BindingSchema = { + format: "quixos-bindings", + version: 1, + interfaces: sorted( + workspace.interfaceImports.filter((i) => !i.template), + (i) => i.revisionId, + ), + interfaceTemplates: sorted( + workspace.interfaceImports.filter((i) => i.template), + (i) => i.revisionId, + ), + packages: sorted(workspace.packageImports, (p) => p.revisionId), + }; + const normalizedSchema = JSON.parse(canonicalJson(schema)) as BindingSchema; + const definition: ExecutionPlanDefinition = { + codec: "camino-execution-plan-v1", + workspace, + bindingSchema: normalizedSchema, + packages: sorted(workspace.packageImports, (p) => p.revisionId).map((p) => ({ + revision: p.revisionId, + source: p.source, + sourceDigest: hexDigest({ revision: p.revisionId, source: p.source }), + bindingDigest: hexDigest(normalizedSchema), + exports: sorted(p.exports, (e) => e.id).map((e) => ({ id: e.id, execution: e.execution ?? { kind: "remote" } })), + })), + owners: sorted(workspace.conformances, (c) => c.id ?? "").map((c) => { + if (!c.id) + throw new ExecutionPlanError( + "OWNER_ID_REQUIRED", + `${c.atomId}/${c.interfaceRevisionId}`, + "Installed state owners require explicit stable identities", + ); + return { + id: c.id, + atom: c.atomId, + interface: c.interfaceRevisionId, + initialization: c.initialization ?? [], + storage: c.privateAttachments, + }; + }), + operations: sorted([...operationMap.values()], (o) => o.key), + queries: sorted(plannedQueries, (q) => q.id), + profiles: sorted( + attachments.filter((a) => a.kind === "state" && a.storagePolicy.kind === "crdt-document"), + (a) => a.id, + ).map((a) => ({ slot: a.id, profile: "camino-automerge-3.4.1-structured-v1" })), + versions: { ...executionVersions }, + }; + const normalized = JSON.parse(canonicalJson(definition)) as ExecutionPlanDefinition; + return { definition: normalized, digest: hexDigest(normalized) }; +} diff --git a/src/execution-world/ports.ts b/src/execution-world/ports.ts new file mode 100644 index 0000000..666e102 --- /dev/null +++ b/src/execution-world/ports.ts @@ -0,0 +1,78 @@ +/** Process/module ABI shared by generated adapters. Values are decoded against the checked + * operation/port schema by the coordinator, not trusted because this header parsed. */ +export const transactionPortAbi = "quixos-transaction-ports-v1"; +export type PortAction = + | { kind: "state"; primitive: "read" | "write" | "edit" } + | { kind: "edge"; primitive: "resolve" | "connect" | "disconnect" } + | { kind: "interface"; operationId: string; key?: string } + | { kind: "query" } + | { kind: "creation"; key: string }; +export interface PortInvocation { + abi: typeof transactionPortAbi; + /** Coordinator-issued frame and invocation handles, not application object IDs. */ + frame: string; + invocation: string; + sequence: number; + portId: string; + action: PortAction; + input: unknown; +} +export interface PackageInvocation { + abi: typeof transactionPortAbi; + frame: string; + invocation: string; + exportId: string; + effect: "snapshot" | "transaction" | "remote"; + /** Capability arguments/receiver use the versioned managed-reference codec. */ + input: unknown; + receiver: unknown | null; +} +export type InvocationReply = + | { abi: typeof transactionPortAbi; invocation: string; status: "returned"; output: unknown } + | { abi: typeof transactionPortAbi; invocation: string; status: "failed"; error: { code: string; message: string } }; +export type ServiceControl = + | { abi: typeof transactionPortAbi; kind: "ready" } + | { abi: typeof transactionPortAbi; kind: "cancel"; invocation: string } + | { abi: typeof transactionPortAbi; kind: "shutdown" }; +/** ABI-only header check. LF-08 resolves handles and enforces the frame/port authority. */ +export function checkPortInvocation(value: unknown): PortInvocation { + if (!value || typeof value !== "object" || Array.isArray(value) || Object.getPrototypeOf(value) !== Object.prototype) + throw new Error("Invalid port invocation"); + const fields = value as Record; + const keys = ["abi", "frame", "invocation", "sequence", "portId", "action", "input"]; + if ( + Object.keys(fields).length !== keys.length || + keys.some((key) => !Object.hasOwn(fields, key)) || + fields.abi !== transactionPortAbi + ) + throw new Error("Invalid port invocation fields or ABI"); + for (const key of ["frame", "invocation", "portId"]) + if (typeof fields[key] !== "string" || !fields[key] || fields[key].length > 4096) + throw new Error(`Invalid port invocation ${key}`); + if (!Number.isSafeInteger(fields.sequence) || (fields.sequence as number) < 1) + throw new Error("Invalid port invocation sequence"); + const action = fields.action as Record; + if ( + !action || + typeof action !== "object" || + Array.isArray(action) || + Object.getPrototypeOf(action) !== Object.prototype + ) + throw new Error("Invalid port action"); + const exact = (names: string[]) => + Object.keys(action).length === names.length && names.every((name) => Object.hasOwn(action, name)); + const identifier = (value: unknown) => typeof value === "string" && value.length > 0 && value.length <= 1024; + const valid = + action.kind === "state" + ? exact(["kind", "primitive"]) && ["read", "write", "edit"].includes(action.primitive as string) + : action.kind === "edge" + ? exact(["kind", "primitive"]) && ["resolve", "connect", "disconnect"].includes(action.primitive as string) + : action.kind === "interface" + ? (exact(["kind", "operationId"]) || (exact(["kind", "operationId", "key"]) && identifier(action.key))) && + identifier(action.operationId) + : action.kind === "creation" + ? exact(["kind", "key"]) && identifier(action.key) + : action.kind === "query" && exact(["kind"]); + if (!valid) throw new Error("Invalid port action"); + return { ...fields, action: { ...action } } as unknown as PortInvocation; +} diff --git a/test/execution-world.test.ts b/test/execution-world.test.ts new file mode 100644 index 0000000..2e2568d --- /dev/null +++ b/test/execution-world.test.ts @@ -0,0 +1,286 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { createHash } from "node:crypto"; +import { loadReaderWorkspace } from "./reader-fixture.js"; +import { + compileExecutionPlan, + checkExecutionWorld, + checkedWorldDigest, + implementationDigest, + hexDigest, + parsePackageArtifacts, + artifactPath, + type PackageArtifacts, + type ExecutionPlan, + type ArtifactImplementation, +} from "../src/execution-world/index.js"; + +const buildFixture = (plan: ExecutionPlan) => { + const expected = plan.definition.packages[0]!; + const bytes = new TextEncoder().encode("export const handlers = Object.freeze({});\n"); + const implementation = ( + id: string, + target: string, + compatibility: ArtifactImplementation["compatibility"], + ): ArtifactImplementation => { + const path = compatibility === "quixos-service-v1" ? "bin/service" : `portable/${target}/module.mjs`; + const value = { + id, + target, + compatibility, + path, + ports: "quixos-transaction-ports-v1" as const, + ...(compatibility === "quixos-js-module-v1" ? { registryExport: "handlers" } : {}), + exports: expected.exports.map((e) => e.id), + files: [ + { + path, + digest: createHash("sha256").update(bytes).digest("hex"), + bytes: bytes.length, + mediaType: compatibility === "quixos-service-v1" ? "application/octet-stream" : "text/javascript", + }, + ], + }; + return { ...value, contentDigest: implementationDigest(value) }; + }; + const manifest: PackageArtifacts = { + schemaVersion: 1, + packageRevisionId: expected.revision, + bindingDigest: expected.bindingDigest, + sourceDigest: expected.sourceDigest, + versions: plan.definition.versions, + implementations: [ + implementation("service", "server", "quixos-service-v1"), + implementation("server", "server", "quixos-js-module-v1"), + implementation("browser", "browser", "quixos-js-module-v1"), + ], + }; + return { manifest, bytes, read: async () => bytes }; +}; +const resign = (implementation: ArtifactImplementation) => { + const { contentDigest, ...body } = implementation; + implementation.contentDigest = implementationDigest(body); +}; + +test("reader execution plan closes selector storage and traversed interface dependencies", async () => { + const workspace = await loadReaderWorkspace(); + const plan = compileExecutionPlan(workspace); + assert.equal(plan.digest, compileExecutionPlan(structuredClone(workspace)).digest); + assert.equal(plan.definition.owners.length, 5); + const excerpt = + plan.definition.operations.find((o) => o.operationId === "highlight:excerpt:get") ?? + plan.definition.operations.find((o) => o.binding.kind === "package" && o.binding.exportId === "reader:excerpt")!; + assert.ok(excerpt.dependencies.some((d) => d.kind === "state" && d.slot === "slot:highlight:range")); + assert.ok( + excerpt.dependencies.some( + (d) => d.kind === "edge" && d.edge === "edge:document-highlights" && d.projection === "projection:document", + ), + ); + const calls = excerpt.dependencies.filter((d) => d.kind === "operation"); + assert.equal(calls.length, 2); + for (const call of calls) { + assert.equal(call.via?.projectionId, "projection:document"); + const target = plan.definition.operations.find((o) => o.key === call.operation)!; + assert.ok(target.dependencies.some((d) => d.kind === "state" && d.slot.startsWith("slot:document:"))); + } + const admission = plan.definition.queries.find((q) => q.query.checked.declaration.displayName === "ReplicaInputs")!; + assert.ok(admission.admittedOperations.includes(excerpt.key)); + assert.equal(plan.definition.profiles[0]!.profile, "camino-automerge-3.4.1-structured-v1"); + const factory = plan.definition.operations.find( + (o) => o.binding.kind === "package" && o.binding.exportId === "reader:create-document", + )!; + assert.equal(factory.scope, "class"); + assert.ok( + factory.binding.kind === "package" && factory.binding.dependencies.some((d) => d.binding.kind === "creation"), + ); + assert.ok(plan.definition.owners.some((o) => Array.isArray(o.initialization) && o.initialization.length > 0)); +}); + +test("artifact closure checks bytes, exact source/schema, ABI, exports and target coverage", async () => { + const plan = compileExecutionPlan(await loadReaderWorkspace()); + const fixture = buildFixture(plan); + const world = await checkExecutionWorld(plan, [fixture.manifest], fixture.read); + assert.equal(world.artifacts.length, 3); + assert.equal( + checkedWorldDigest(world), + checkedWorldDigest(await checkExecutionWorld(plan, [structuredClone(fixture.manifest)], fixture.read)), + ); + const negative = async (change: (manifest: PackageArtifacts) => void, pattern: RegExp) => { + const manifest = structuredClone(fixture.manifest); + change(manifest); + await assert.rejects(checkExecutionWorld(plan, [manifest], fixture.read), pattern); + }; + await negative((m) => { + m.bindingDigest = "0".repeat(64); + }, /Substituted binding schema/); + await negative((m) => { + m.sourceDigest = "0".repeat(64); + }, /source revision/); + await negative((m) => { + (m.versions as unknown as Record).value = "v2"; + }, /Incompatible runtime codecs/); + await negative((m) => { + m.implementations = m.implementations.filter((i) => i.target !== "browser"); + }, /Missing browser implementation/); + await negative((m) => { + m.implementations = m.implementations.filter((i) => i.compatibility !== "quixos-service-v1"); + }, /Missing service fallback/); + await negative((m) => { + m.implementations[0]!.exports.push("wrong-export"); + resign(m.implementations[0]!); + }, /Unknown export/); + await negative((m) => { + m.implementations[0]!.files[0]!.digest = "0".repeat(64); + resign(m.implementations[0]!); + }, /Artifact bytes/); + await negative((m) => { + m.implementations[0]!.exports.pop(); + }, /metadata digest mismatch/); + await assert.rejects( + checkExecutionWorld(plan, [fixture.manifest], async () => new Uint8Array([1])), + /Artifact bytes/, + ); + for (const path of ["/tmp/code", "../code", "a/../b", "a//b", "a\\b", "a%2fb", "a?query"]) + assert.throws(() => artifactPath(path), /normalized relative/); + const changed = structuredClone(plan); + changed.definition.versions.value = "wrong" as typeof changed.definition.versions.value; + await assert.rejects( + checkExecutionWorld(changed, [fixture.manifest], fixture.read), + /Unsupported plan codec versions/, + ); +}); + +test("artifact identity changes when code or registry changes without hashing its own digest", async () => { + const plan = compileExecutionPlan(await loadReaderWorkspace()), + fixture = buildFixture(plan); + const before = checkedWorldDigest(await checkExecutionWorld(plan, [fixture.manifest], fixture.read)); + const manifest = structuredClone(fixture.manifest); + manifest.implementations[2]!.registryExport = "anotherRegistry"; + resign(manifest.implementations[2]!); + const after = checkedWorldDigest(await checkExecutionWorld(plan, [manifest], fixture.read)); + assert.notEqual(before, after); + assert.equal(parsePackageArtifacts(manifest).implementations[2]!.registryExport, "anotherRegistry"); + assert.equal(hexDigest(plan.definition), plan.digest); +}); + +test("transactions cannot derive their membership from an admitted presentation query", async () => { + const workspace = await loadReaderWorkspace(), + pkg = workspace.packageImports[0]!; + const query = pkg.queries!.find((q) => q.placement?.kind === "local")!; + const entry = pkg.exports.find((e) => e.id === "reader:add-highlight")!; + const portId = "test:query-port" as (typeof entry.dependencyPorts)[number]["id"]; + entry.dependencyPorts.push({ + id: portId, + displayName: "visible", + requirement: { kind: "query", packageRevisionId: pkg.revisionId, queryId: query.id }, + }); + const bound = workspace.conformances + .flatMap((c) => c.operationBindings) + .find((o) => o.binding.kind === "package" && o.binding.exportId === entry.id)!.binding; + assert.equal(bound.kind, "package"); + if (bound.kind !== "package") return; + bound.dependencies.push({ + portId, + binding: { kind: "query", packageRevisionId: pkg.revisionId, queryId: query.id, scope: "object" }, + }); + assert.throws(() => compileExecutionPlan(workspace), /QUERY_IN_TRANSACTION.*test:query-port/); +}); + +test("port ABI carries only declared port actions, never caller-selected storage IDs", async () => { + const { checkPortInvocation } = await import("../src/execution-world/index.js"); + const frame = { + abi: "quixos-transaction-ports-v1", + frame: "frame1", + invocation: "invoke1", + sequence: 1, + portId: "content", + action: { kind: "state", primitive: "read" }, + input: { codec: "camino-value-v1", usage: "argument", value: null }, + }; + assert.deepEqual(checkPortInvocation(frame), frame); + assert.throws(() => checkPortInvocation({ ...frame, slotId: "private" }), /fields or ABI/); + assert.throws( + () => checkPortInvocation({ ...frame, action: { kind: "state", primitive: "read", slotId: "private" } }), + /Invalid port action/, + ); + assert.throws(() => checkPortInvocation({ ...frame, sequence: NaN }), /sequence/); + assert.throws(() => checkPortInvocation({ ...frame, action: { kind: "creation", key: "" } }), /Invalid port action/); +}); + +test("local queries cannot silently expand the replica relationship traversal", async () => { + const workspace = await loadReaderWorkspace((name, text) => + name === "queries/replica-inputs.graphql" ? "query ReplicaInputs { root { sourceRevision content } }" : text, + ); + assert.throws(() => compileExecutionPlan(workspace), /REPLICA_TRAVERSAL_MISSING/); +}); + +test("closed generic applications retain distinct identities and codec shapes", async () => { + const { compileCapabilityResourceSource, compileCapabilitySource } = + await import("../src/capability-language/index.js"); + const source = { repository: "https://example.test/generic.git", commit: "a".repeat(40) }; + const definition = compileCapabilityResourceSource( + `interface Cell id "cell" revision "cell@1" { + value content id "value" : V { get id "get" execution snapshot targets [browser, server]; } + }`, + { source }, + ); + assert.ok(definition.ok && definition.resource.kind === "interface", JSON.stringify(definition.diagnostics)); + const compiled = compileCapabilitySource( + `workspace Demo id "ws" revision "ws@1" commit "${source.commit}" { + import interface Cell; atom Item id "item"; + conform Item as Cell id "text-owner" { private state Text id "text-slot" on Item : string policy register; bind content.get to state Text.read; } + conform Item as Cell id "number-owner" { private state Number id "number-slot" on Item : int64 policy register; bind content.get to state Number.read; } + }`, + "workspace.qx", + { interfaces: new Map([["Cell", definition.resource.revision]]) }, + ); + assert.ok(compiled.ok, JSON.stringify(compiled.diagnostics)); + const plan = compileExecutionPlan(compiled.workspace); + assert.equal(plan.definition.operations.length, 2); + assert.notEqual( + plan.definition.operations[0]!.interfaceRevisionId, + plan.definition.operations[1]!.interfaceRevisionId, + ); + assert.deepEqual( + new Set(plan.definition.operations.map((o) => (o.output.kind === "scalar" ? o.output.name : null))), + new Set(["string", "int64"]), + ); + assert.ok(plan.definition.bindingSchema.interfaces.every((i) => i.application)); +}); + +test("unbound portable exports cannot claim an unsupported transport codec", async () => { + const workspace = await loadReaderWorkspace(); + workspace.packageImports[0]!.exports.find((e) => e.id === "reader:validate-range")!.outputType = { + kind: "message", + descriptorId: "opaque-message", + }; + assert.throws(() => compileExecutionPlan(workspace), /UNSUPPORTED_PORTABLE_CODEC.*reader:validate-range/); +}); + +test("query dependencies propagate target requirements through selected getters", async () => { + const workspace = await loadReaderWorkspace(), + pkg = workspace.packageImports[0]!; + const query = pkg.queries!.find((q) => q.displayName === "HighlightList")!; + const entry = pkg.exports.find((e) => e.id === "reader:excerpt")!; + const portId = "test:selector-query" as (typeof entry.dependencyPorts)[number]["id"]; + entry.dependencyPorts.push({ + id: portId, + displayName: "visible", + requirement: { kind: "query", packageRevisionId: pkg.revisionId, queryId: query.id }, + }); + const bound = workspace.conformances + .flatMap((c) => c.operationBindings) + .find((o) => o.binding.kind === "package" && o.binding.exportId === entry.id)!.binding; + assert.equal(bound.kind, "package"); + if (bound.kind !== "package") return; + bound.dependencies.push({ + portId, + binding: { kind: "query", packageRevisionId: pkg.revisionId, queryId: query.id, scope: "workspace" }, + }); + compileExecutionPlan(workspace); + const field = workspace.interfaceImports + .find((i) => i.displayName === "HighlightData")! + .members.find((m) => m.displayName === "color")!; + field.operations.find((o) => o.displayName === "get")!.execution = { kind: "snapshot", targets: ["browser"] }; + assert.throws(() => compileExecutionPlan(workspace), /MISSING_EXECUTION_TARGET.*test:selector-query.*server/); +}); diff --git a/test/local-first-reader.test.ts b/test/local-first-reader.test.ts index cc6ffcd..7ac3243 100644 --- a/test/local-first-reader.test.ts +++ b/test/local-first-reader.test.ts @@ -1,44 +1,8 @@ import assert from "node:assert/strict"; import { test } from "node:test"; -import { readFile } from "node:fs/promises"; -import { resolve } from "node:path"; -import { - compileCapabilityResourceSource, - compileCapabilitySource, - formatQx, -} from "../src/capability-language/index.js"; -import type { InterfaceRevision } from "../src/capability-model/types.js"; import { compileQuery } from "../src/query/compile.js"; import { linkQueries } from "../src/query/link.js"; -const directory = resolve("test/fixtures/local-first-reader"); -const read = (name: string) => readFile(resolve(directory, name), "utf8"); -const source = { repository: "https://example.test/reader.git", commit: "a".repeat(40) }; -const load = async (transform = (name: string, text: string) => text) => { - const interfaces = new Map(); - for (const name of ["DocumentData", "HighlightData", "CommentData", "DocumentActions", "DocumentFactory"]) { - const text = transform(`${name}.qx`, await read(`${name}.qx`)); - const result = compileCapabilityResourceSource(formatQx(text), { source }); - assert.ok(result.ok && result.resource.kind === "interface", `${name}: ${JSON.stringify(result.diagnostics)}`); - interfaces.set(name, result.resource.revision); - } - const environment = { interfaces, interfaceClosure: [...interfaces.values()] }; - const pkg = compileCapabilityResourceSource(formatQx(transform("ReaderRuntime.qx", await read("ReaderRuntime.qx"))), { - source, - environment, - }); - assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); - const revision = pkg.resource.revision; - revision.checkedQueries = await Promise.all( - revision.queries!.map((query) => compileQuery(query, [...interfaces.values()], read)), - ); - const result = compileCapabilitySource(formatQx(await read("workspace.qx")), "workspace.qx", { - ...environment, - packages: new Map([["ReaderRuntime", revision]]), - packageClosure: [revision], - }); - assert.ok(result.ok, JSON.stringify(result.diagnostics)); - return result.workspace; -}; +import { loadReaderWorkspace as load, readReaderFixture as read } from "./reader-fixture.js"; test("complete reader contracts compose factories, portable selectors, CRDT edits, and six query scopes", async () => { const workspace = await load(); assert.equal(workspace.constructors.length, 0); diff --git a/test/reader-fixture.ts b/test/reader-fixture.ts new file mode 100644 index 0000000..7664e55 --- /dev/null +++ b/test/reader-fixture.ts @@ -0,0 +1,44 @@ +import assert from "node:assert/strict"; +import { readFile } from "node:fs/promises"; +import { resolve } from "node:path"; +import { + compileCapabilityResourceSource, + compileCapabilitySource, + formatQx, +} from "../src/capability-language/index.js"; +import type { InterfaceRevision } from "../src/capability-model/types.js"; +import { compileQuery } from "../src/query/compile.js"; +const directory = resolve("test/fixtures/local-first-reader"); +export const readReaderFixture = (name: string) => readFile(resolve(directory, name), "utf8"); +const source = { repository: "https://example.test/reader.git", commit: "a".repeat(40) }; +export const loadReaderWorkspace = async (transform = (name: string, text: string) => text) => { + const interfaces = new Map(); + for (const name of ["DocumentData", "HighlightData", "CommentData", "DocumentActions", "DocumentFactory"]) { + const text = transform(`${name}.qx`, await readReaderFixture(`${name}.qx`)); + const result = compileCapabilityResourceSource(formatQx(text), { source }); + assert.ok(result.ok && result.resource.kind === "interface", `${name}: ${JSON.stringify(result.diagnostics)}`); + interfaces.set(name, result.resource.revision); + } + const environment = { interfaces, interfaceClosure: [...interfaces.values()] }; + const pkg = compileCapabilityResourceSource( + formatQx(transform("ReaderRuntime.qx", await readReaderFixture("ReaderRuntime.qx"))), + { + source, + environment, + }, + ); + assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); + const revision = pkg.resource.revision; + revision.checkedQueries = await Promise.all( + revision.queries!.map((query) => + compileQuery(query, [...interfaces.values()], async (name) => transform(name, await readReaderFixture(name))), + ), + ); + const result = compileCapabilitySource(formatQx(await readReaderFixture("workspace.qx")), "workspace.qx", { + ...environment, + packages: new Map([["ReaderRuntime", revision]]), + packageClosure: [revision], + }); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + return result.workspace; +}; From 0aaa80a4bad86ac38caa514887793a2361d1b78e Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sat, 19 Sep 2026 23:27:19 -0700 Subject: [PATCH 11/91] Confine checked artifact loading and browser asset lookup --- src/execution-world/README.md | 13 ++- src/execution-world/files.ts | 155 ++++++++++++++++++++++++++++++++++ src/execution-world/index.ts | 1 + test/artifact-files.test.ts | 88 +++++++++++++++++++ test/artifact-fixture.ts | 49 +++++++++++ test/execution-world.test.ts | 43 +--------- 6 files changed, 303 insertions(+), 46 deletions(-) create mode 100644 src/execution-world/files.ts create mode 100644 test/artifact-files.test.ts create mode 100644 test/artifact-fixture.ts diff --git a/src/execution-world/README.md b/src/execution-world/README.md index eabbe35..d65ec12 100644 --- a/src/execution-world/README.md +++ b/src/execution-world/README.md @@ -44,8 +44,12 @@ Its digest excludes its own digest field. Paths must be normalized and relative. `checkExecutionWorld` verifies plan identity, supported codecs, exact source and binding schema, service fallback, promised targets, declared exports, and all supplied file bytes. The reader must confine paths/symlinks to the checked output -and honor its byte limit before allocation. LF-05 supplies that filesystem adapter, -checks actual module registries/imports, and verifies build receipts; a manifest +and honor its byte limit before allocation. `artifactFileReader` supplies that +adapter for trusted immutable output roots. `loadArtifactWorld` checks candidate +outputs without importing package code. `BrowserArtifactGateway` registers only +declared browser assets and verifies bytes before serving; Web Studio places it +behind workspace authentication. LF-05 still checks actual module +registries/imports and verifies build receipts; a manifest claim alone does not establish the JavaScript exports or an isolated process. The returned `camino-world-v1` descriptor includes every declared implementation @@ -75,8 +79,9 @@ from an asynchronous completion order or the transport sequence number. The coordinator resolves each port through the installed operation binding, checks effects/selected methods, validates typed arguments/references, and joins -nested calls to the outer logical transaction. A nested failure rolls back to its -frame boundary; process completion cannot independently commit. The coordinator +nested calls to the outer logical transaction. A nested failure poisons the outer domain +transaction even if application code catches it; frame cleanup cannot turn it into +a partial success. Process completion cannot independently commit. The coordinator owns savepoints, cancellation, frame expiry, and rejection. These enforcement mechanisms are LF-06/LF-08, not guarantees provided by TypeScript frame types. diff --git a/src/execution-world/files.ts b/src/execution-world/files.ts new file mode 100644 index 0000000..765a590 --- /dev/null +++ b/src/execution-world/files.ts @@ -0,0 +1,155 @@ +import { constants } from "node:fs"; +import { lstat, open, realpath } from "node:fs/promises"; +import path from "node:path"; +import { createHash } from "node:crypto"; +import { + artifactPath, + parsePackageArtifacts, + checkExecutionWorld, + checkedWorldDigest, + type ArtifactReader, + type ArtifactFile, + type PackageArtifacts, + type CheckedWorld, +} from "./artifacts.js"; +import { type ExecutionPlan, ExecutionPlanError } from "./plan.js"; + +const maxFileBytes = 256 * 1024 * 1024; +const metadataLimit = 16 * 1024 * 1024; +const fail = (where: string, message: string): never => { + throw new ExecutionPlanError("ARTIFACT_FILE_INVALID", where, message); +}; +/** Roots must be trusted immutable output directories. Refuse symlinks, including + * interior directory links. Hash verification is still required before serving bytes. */ +export async function artifactFileReader(roots: Readonly>): Promise { + const directories = new Map(); + for (const [revision, root] of Object.entries(roots)) { + if (!path.isAbsolute(root) || path.normalize(root) !== root || (await realpath(root)) !== root) + fail(revision, "Output root must be a canonical absolute directory"); + const stat = await lstat(root); + if (!stat.isDirectory() || stat.isSymbolicLink()) fail(root, "Output root is not a directory"); + directories.set(revision, root); + } + return async (revision, relative, limit) => { + const root = directories.get(revision); + if (!root) fail(revision, "Unknown package output"); + artifactPath(relative); + if (!Number.isSafeInteger(limit) || limit < 0 || limit > maxFileBytes) fail(relative, "Invalid file byte limit"); + const components = relative.split("/"); + let resolved = root!; + for (let index = 0; index < components.length; index++) { + resolved = path.join(resolved, components[index]!); + const stat = await lstat(resolved); + if (stat.isSymbolicLink() || (index < components.length - 1 ? !stat.isDirectory() : !stat.isFile())) + fail(relative, "Only real directories and regular files are allowed"); + } + const handle = await open(resolved, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK); + try { + const stat = await handle.stat(); + if (!stat.isFile() || stat.size > limit) fail(relative, "File exceeds its declared bound"); + // A fixed allocation and one extra byte detect growth without readFile's unbounded allocation. + const buffer = Buffer.alloc(stat.size + 1); + let offset = 0; + while (offset < buffer.length) { + const { bytesRead } = await handle.read(buffer, offset, buffer.length - offset, offset); + if (!bytesRead) break; + offset += bytesRead; + } + if (offset !== stat.size) fail(relative, "File changed while reading"); + return buffer.subarray(0, offset); + } finally { + await handle.close(); + } + }; +} +export interface LoadedArtifactWorld { + world: CheckedWorld; + digest: string; + manifests: PackageArtifacts[]; + read: ArtifactReader; +} +/** Immutable-output loader. No module code is imported into the coordinator. */ +export async function loadArtifactWorld( + plan: ExecutionPlan, + roots: Readonly>, +): Promise { + const read = await artifactFileReader(roots), + manifests: PackageArtifacts[] = []; + const expected = plan.definition.packages.map((p) => p.revision).sort(); + if (JSON.stringify(Object.keys(roots).sort()) !== JSON.stringify(expected)) + fail("world", "Output roots must exactly match the installed plan"); + for (const revision of expected) { + const bytes = await read(revision, "share/quixos/package-artifacts.json", metadataLimit); + const manifest = parsePackageArtifacts(JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes))); + if (manifest.packageRevisionId !== revision) fail(revision, "Output belongs to another package revision"); + manifests.push(manifest); + } + const world = await checkExecutionWorld(plan, manifests, read); + return { world, digest: checkedWorldDigest(world), manifests, read }; +} +export interface BrowserArtifact { + url: string; + implementation: string; + packageRevisionId: string; + registryExport: string; + exports: readonly string[]; +} +export interface ArtifactResponse { + status: 200 | 304; + headers: Record; + body: Uint8Array; +} +/** This registry is placed behind the workspace gateway's existing authentication. + * Lookup uses an explicit URL table; request paths never become filesystem paths. */ +export class BrowserArtifactGateway { + readonly entries: readonly BrowserArtifact[]; + private readonly routes = new Map(); + private readonly read: ArtifactReader; + constructor(loaded: LoadedArtifactWorld) { + this.read = loaded.read; + const entries: BrowserArtifact[] = []; + for (const manifest of loaded.manifests) + for (const implementation of manifest.implementations) { + if (implementation.target !== "browser" || implementation.compatibility !== "quixos-js-module-v1") continue; + const prefix = `/__quixos/artifacts/${loaded.digest}/${implementation.contentDigest}/`; + for (const file of implementation.files) { + if (!/^[a-zA-Z0-9.+-]+\/[a-zA-Z0-9.+-]+$/.test(file.mediaType)) fail(file.path, "Invalid asset MIME type"); + const url = prefix + file.path.split("/").map(encodeURIComponent).join("/"); + const previous = this.routes.get(url); + if ( + previous && + (previous.file.digest !== file.digest || + previous.file.bytes !== file.bytes || + previous.file.mediaType !== file.mediaType) + ) + fail(url, "Conflicting browser asset route"); + this.routes.set(url, { revision: manifest.packageRevisionId, file: Object.freeze({ ...file }) }); + } + entries.push({ + url: prefix + implementation.path.split("/").map(encodeURIComponent).join("/"), + implementation: implementation.id, + packageRevisionId: manifest.packageRevisionId, + registryExport: implementation.registryExport!, + exports: Object.freeze([...implementation.exports]), + }); + } + this.entries = Object.freeze(entries.map((entry) => Object.freeze(entry))); + } + async response(url: string, ifNoneMatch?: string): Promise { + const route = this.routes.get(url); + if (!route) return undefined; + const bytes = await this.read(route.revision, route.file.path, route.file.bytes); + if (bytes.length !== route.file.bytes || createHash("sha256").update(bytes).digest("hex") !== route.file.digest) + fail(url, "Browser asset changed after world validation"); + const etag = `"sha256-${route.file.digest}"`; + const headers = { + "content-type": route.file.mediaType, + "cache-control": "private, max-age=31536000, immutable", + etag, + "x-content-type-options": "nosniff", + }; + return ifNoneMatch === etag + ? { status: 304, headers, body: new Uint8Array() } + : { status: 200, headers, body: bytes }; + } +} diff --git a/src/execution-world/index.ts b/src/execution-world/index.ts index 110c772..efd6ed6 100644 --- a/src/execution-world/index.ts +++ b/src/execution-world/index.ts @@ -1,3 +1,4 @@ export * from "./plan.js"; export * from "./artifacts.js"; export * from "./ports.js"; +export * from "./files.js"; diff --git a/test/artifact-files.test.ts b/test/artifact-files.test.ts new file mode 100644 index 0000000..45796e1 --- /dev/null +++ b/test/artifact-files.test.ts @@ -0,0 +1,88 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { mkdtemp, mkdir, writeFile, symlink, rm } from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import { createHash } from "node:crypto"; +import { + compileExecutionPlan, + artifactFileReader, + loadArtifactWorld, + BrowserArtifactGateway, + implementationDigest, +} from "../src/execution-world/index.js"; +import { loadReaderWorkspace } from "./reader-fixture.js"; +import { buildArtifactFixture } from "./artifact-fixture.js"; + +test("immutable-output loading rejects traversal, links, and files larger than the declared bound", async () => { + const root = await mkdtemp(path.join(os.tmpdir(), "camino-artifact-read-")); + try { + await mkdir(path.join(root, "output")); + await writeFile(path.join(root, "outside"), "secret"); + await writeFile(path.join(root, "output", "file"), "data"); + await symlink(path.join(root, "outside"), path.join(root, "output", "linked-file")); + await symlink(root, path.join(root, "output", "linked-dir")); + const read = await artifactFileReader({ package: path.join(root, "output") }); + assert.equal(new TextDecoder().decode(await read("package", "file", 4)), "data"); + await assert.rejects(read("package", "file", 3), /exceeds its declared bound/); + await assert.rejects(read("package", "linked-file", 100), /Only real directories/); + await assert.rejects(read("package", "linked-dir/outside", 100), /Only real directories/); + await assert.rejects(read("package", "../outside", 100), /normalized relative/); + await assert.rejects(read("unknown", "file", 100), /Unknown package output/); + await assert.rejects(read("package", "file", Infinity), /Invalid file byte limit/); + await assert.rejects( + artifactFileReader({ package: path.join(root, "output", "linked-dir") }), + /canonical absolute/, + ); + } finally { + await rm(root, { recursive: true, force: true }); + } +}); + +test("gateway serves only declared browser assets with correct Wasm MIME and content identity", async () => { + const root = await mkdtemp(path.join(os.tmpdir(), "camino-artifact-world-")); + try { + const plan = compileExecutionPlan(await loadReaderWorkspace()), + fixture = buildArtifactFixture(plan); + const wasm = new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0]); + const browser = fixture.manifest.implementations.find((i) => i.target === "browser")!; + browser.files.push({ + path: "portable/browser/assets/café.wasm", + bytes: wasm.length, + digest: createHash("sha256").update(wasm).digest("hex"), + mediaType: "application/wasm", + }); + const { contentDigest, ...body } = browser; + browser.contentDigest = implementationDigest(body); + for (const implementation of fixture.manifest.implementations) + for (const file of implementation.files) { + const target = path.join(root, file.path); + await mkdir(path.dirname(target), { recursive: true }); + await writeFile(target, file.mediaType === "application/wasm" ? wasm : fixture.bytes); + } + await mkdir(path.join(root, "share/quixos"), { recursive: true }); + await writeFile(path.join(root, "share/quixos/package-artifacts.json"), JSON.stringify(fixture.manifest)); + const loaded = await loadArtifactWorld(plan, { [fixture.manifest.packageRevisionId]: root }); + const gateway = new BrowserArtifactGateway(loaded); + assert.equal(gateway.entries.length, 1); + const entry = gateway.entries[0]!; + const response = await gateway.response(entry.url); + assert.equal(response?.status, 200); + assert.equal(response?.headers["content-type"], "text/javascript"); + assert.equal(response?.headers["cache-control"], "private, max-age=31536000, immutable"); + assert.deepEqual(response?.body, Buffer.from(fixture.bytes)); + assert.equal((await gateway.response(entry.url, response?.headers.etag))?.status, 304); + const wasmUrl = entry.url.replace("module.mjs", "assets/caf%C3%A9.wasm"); + const wasmResponse = await gateway.response(wasmUrl); + assert.equal(wasmResponse?.headers["content-type"], "application/wasm"); + assert.deepEqual(wasmResponse?.body, Buffer.from(wasm)); + assert.equal(await gateway.response(entry.url.replace("portable/browser/module.mjs", "bin/service")), undefined); + assert.equal(await gateway.response("/nix/store/secret"), undefined); + assert.equal(await gateway.response(entry.url.replace(loaded.digest, "0".repeat(64))), undefined); + await writeFile(path.join(root, browser.path), "x".repeat(fixture.bytes.length)); + await assert.rejects(gateway.response(entry.url), /changed after world validation/); + await assert.rejects(loadArtifactWorld(plan, { [fixture.manifest.packageRevisionId]: root }), /Artifact bytes/); + } finally { + await rm(root, { recursive: true, force: true }); + } +}); diff --git a/test/artifact-fixture.ts b/test/artifact-fixture.ts new file mode 100644 index 0000000..48144e8 --- /dev/null +++ b/test/artifact-fixture.ts @@ -0,0 +1,49 @@ +import { createHash } from "node:crypto"; +import { + implementationDigest, + type ExecutionPlan, + type PackageArtifacts, + type ArtifactImplementation, +} from "../src/execution-world/index.js"; +export const buildArtifactFixture = (plan: ExecutionPlan) => { + const expected = plan.definition.packages[0]!; + const bytes = new TextEncoder().encode("export const handlers = Object.freeze({});\n"); + const implementation = ( + id: string, + target: string, + compatibility: ArtifactImplementation["compatibility"], + ): ArtifactImplementation => { + const path = compatibility === "quixos-service-v1" ? "bin/service" : `portable/${target}/module.mjs`; + const value = { + id, + target, + compatibility, + path, + ports: "quixos-transaction-ports-v1" as const, + ...(compatibility === "quixos-js-module-v1" ? { registryExport: "handlers" } : {}), + exports: expected.exports.map((e) => e.id), + files: [ + { + path, + digest: createHash("sha256").update(bytes).digest("hex"), + bytes: bytes.length, + mediaType: compatibility === "quixos-service-v1" ? "application/octet-stream" : "text/javascript", + }, + ], + }; + return { ...value, contentDigest: implementationDigest(value) }; + }; + const manifest: PackageArtifacts = { + schemaVersion: 1, + packageRevisionId: expected.revision, + bindingDigest: expected.bindingDigest, + sourceDigest: expected.sourceDigest, + versions: plan.definition.versions, + implementations: [ + implementation("service", "server", "quixos-service-v1"), + implementation("server", "server", "quixos-js-module-v1"), + implementation("browser", "browser", "quixos-js-module-v1"), + ], + }; + return { manifest, bytes, read: async () => bytes }; +}; diff --git a/test/execution-world.test.ts b/test/execution-world.test.ts index 2e2568d..3b3afe0 100644 --- a/test/execution-world.test.ts +++ b/test/execution-world.test.ts @@ -15,48 +15,7 @@ import { type ArtifactImplementation, } from "../src/execution-world/index.js"; -const buildFixture = (plan: ExecutionPlan) => { - const expected = plan.definition.packages[0]!; - const bytes = new TextEncoder().encode("export const handlers = Object.freeze({});\n"); - const implementation = ( - id: string, - target: string, - compatibility: ArtifactImplementation["compatibility"], - ): ArtifactImplementation => { - const path = compatibility === "quixos-service-v1" ? "bin/service" : `portable/${target}/module.mjs`; - const value = { - id, - target, - compatibility, - path, - ports: "quixos-transaction-ports-v1" as const, - ...(compatibility === "quixos-js-module-v1" ? { registryExport: "handlers" } : {}), - exports: expected.exports.map((e) => e.id), - files: [ - { - path, - digest: createHash("sha256").update(bytes).digest("hex"), - bytes: bytes.length, - mediaType: compatibility === "quixos-service-v1" ? "application/octet-stream" : "text/javascript", - }, - ], - }; - return { ...value, contentDigest: implementationDigest(value) }; - }; - const manifest: PackageArtifacts = { - schemaVersion: 1, - packageRevisionId: expected.revision, - bindingDigest: expected.bindingDigest, - sourceDigest: expected.sourceDigest, - versions: plan.definition.versions, - implementations: [ - implementation("service", "server", "quixos-service-v1"), - implementation("server", "server", "quixos-js-module-v1"), - implementation("browser", "browser", "quixos-js-module-v1"), - ], - }; - return { manifest, bytes, read: async () => bytes }; -}; +import { buildArtifactFixture as buildFixture } from "./artifact-fixture.js"; const resign = (implementation: ArtifactImplementation) => { const { contentDigest, ...body } = implementation; implementation.contentDigest = implementationDigest(body); From 60b1bdb39f2979e1d1f30e682ab2abe8b982dd2a Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 20 Sep 2026 00:14:08 -0700 Subject: [PATCH 12/91] Generate portable capability contexts and checked handler registries --- flake.nix | 3 + src/bindings/cli.ts | 13 +- src/bindings/index.ts | 7 + src/bindings/portable.ts | 252 +++++++++++++++++++++++++++++++++ src/execution-world/README.md | 14 ++ test/emit-portable-reader.ts | 13 ++ test/portable-bindings.test.ts | 38 +++++ 7 files changed, 338 insertions(+), 2 deletions(-) create mode 100644 src/bindings/portable.ts create mode 100644 test/emit-portable-reader.ts create mode 100644 test/portable-bindings.test.ts diff --git a/flake.nix b/flake.nix index 69fa91f..35c21a0 100644 --- a/flake.nix +++ b/flake.nix @@ -68,6 +68,7 @@ checkPhase = '' runHook preCheck yarn test + node dist/test/emit-portable-reader.js runHook postCheck ''; installPhase = '' @@ -80,6 +81,8 @@ cp --reflink=auto --recursive proto "$out/proto" cp --reflink=auto --recursive dist "$out/dist" cp package.json "$out/package.json" + mkdir -p "$out/share/quixos-protocol/qualification" + cp -r dist/portable-reader "$out/share/quixos-protocol/qualification/" mkdir -p "$out/bin" for tool in quixos-codegen-ts quixos-qx; do printf '#!/bin/sh\nexec ${pkgs.nodejs_24}/bin/node "%s/libexec/quixos-protocol/%s.mjs" "$@"\n' "$out" "$tool" > "$out/bin/$tool" diff --git a/src/bindings/cli.ts b/src/bindings/cli.ts index d62f844..2febad9 100644 --- a/src/bindings/cli.ts +++ b/src/bindings/cli.ts @@ -1,6 +1,6 @@ #!/usr/bin/env node import { readFile, writeFile } from "node:fs/promises"; -import { generateTypeScriptBindings } from "./index.js"; +import { generateTypeScriptBindings, generatePortableTypeScriptBindings } from "./index.js"; import path from "node:path"; import { reactPlatformTypes } from "./react-platform.js"; import { generateReactBindings } from "./react.js"; @@ -11,7 +11,16 @@ const main = async () => { throw new Error("usage: quixos-codegen-ts SCHEMA.json PACKAGE_REVISION OUTPUT.ts [OPTIONS.json]"); const config = options ? JSON.parse(await readFile(options, "utf8")) : {}; const contracts = JSON.parse(await readFile(schema, "utf8")); - const generated = generateTypeScriptBindings(contracts, revision, config); + if (config.portable && config.react) + throw new Error("Portable handlers and React component bindings are separate artifacts"); + if (config.portable && typeof config.portable.target !== "string") + throw new Error("Portable bindings require an explicit target"); + const generated = config.portable + ? generatePortableTypeScriptBindings(contracts, revision, { + ...config.portable, + ...(config.runtimeModule ? { runtimeModule: config.runtimeModule } : {}), + }) + : generateTypeScriptBindings(contracts, revision, config); await writeFile(output, generated); if (config.react) { await writeFile(path.join(path.dirname(output), "web-studio-react-runtime.d.ts"), reactPlatformTypes); diff --git a/src/bindings/index.ts b/src/bindings/index.ts index 1e17989..826c8b5 100644 --- a/src/bindings/index.ts +++ b/src/bindings/index.ts @@ -421,3 +421,10 @@ export const generateTypeScriptBindings = ( `\n },\n});\n` ); }; + +export { + generatePortableTypeScriptBindings, + portableValueSchema, + PortableBindingError, + type PortableBindingOptions, +} from "./portable.js"; diff --git a/src/bindings/portable.ts b/src/bindings/portable.ts new file mode 100644 index 0000000..012f935 --- /dev/null +++ b/src/bindings/portable.ts @@ -0,0 +1,252 @@ +import type { BindingSchema } from "./index.js"; +import type { + ValueType, + ObjectExpectation, + PackageExport, + DependencyPort, + ExecutionContract, +} from "../capability-model/types.js"; +import { hexDigest } from "../execution-world/plan.js"; + +export class PortableBindingError extends Error { + constructor( + readonly path: string, + message: string, + ) { + super(`${path}: ${message}`); + this.name = "PortableBindingError"; + } +} +const q = JSON.stringify; +const unit: ValueType = { kind: "builtin", name: "unit" }; +const string: ValueType = { kind: "scalar", name: "string" }; +const bool: ValueType = { kind: "scalar", name: "bool" }; +const isUnit = (t: ValueType) => t.kind === "builtin" && t.name === "unit"; +const expectation = (e: ObjectExpectation) => ({ + kind: e.kind, + id: e.kind === "atom" ? e.atomId : e.interfaceRevisionId, +}); +/** The protocol IR and replica wire schema intentionally share structure, not reference identity. */ +export function portableValueSchema(type: ValueType): unknown { + switch (type.kind) { + case "scalar": + return type; + case "builtin": + if (type.name === "unit") return type; + break; + case "object-ref": + return { kind: type.kind, expectation: expectation(type.expectation) }; + case "optional": + case "list": + return { kind: type.kind, value: portableValueSchema(type.value) }; + case "record": + return { + kind: type.kind, + fields: Object.fromEntries( + Object.entries(type.fields).map(([key, value]) => [key, portableValueSchema(value)]), + ), + }; + } + throw new PortableBindingError( + type.kind, + "Unsupported portable value; use a supported record/reference contract (native edits and generic adapters have separate tasks)", + ); +} +function tsType(type: ValueType): string { + portableValueSchema(type); + switch (type.kind) { + case "scalar": + return type.name === "bool" + ? "boolean" + : type.name === "string" + ? "string" + : type.name === "bytes" + ? "Uint8Array" + : ["int64", "uint64"].includes(type.name) + ? "bigint" + : "number"; + case "builtin": + return "null"; + case "object-ref": { + const e = expectation(type.expectation); + return `ManagedReference<${q(e.kind)}, ${q(e.id)}>`; + } + case "optional": + return `(${tsType(type.value)} | null)`; + case "list": + return `ReadonlyArray<${tsType(type.value)}>`; + case "record": + return `{ ${Object.entries(type.fields) + .map(([key, value]) => `readonly ${q(key)}: ${tsType(value)}`) + .join("; ")} }`; + default: + throw new PortableBindingError(type.kind, "Unsupported type"); + } +} +interface Method { + name: string; + portId: string; + portName: string; + action: { kind: string; primitive?: string; operationId?: string }; + input: ValueType; + output: ValueType; + keyed: boolean; +} +function methods(schema: BindingSchema, entry: PackageExport, port: DependencyPort, target: string): Method[] { + const req = port.requirement; + const path = `${entry.displayName}.ports.${port.displayName}`; + const method = ( + name: string, + action: Method["action"], + input: ValueType, + output: ValueType, + keyed = false, + ): Method => ({ name, portId: port.id, portName: port.displayName, action, input, output, keyed }); + const writable = () => { + if (entry.execution?.kind !== "transaction") + throw new PortableBindingError(path, "Snapshot context cannot expose mutation ports"); + }; + switch (req.kind) { + case "creation": + writable(); + return [ + method( + "create", + { kind: "creation" }, + req.inputType, + { kind: "object-ref", expectation: { kind: "atom", atomId: req.atomId } }, + true, + ), + ]; + case "state": + return req.primitives.map((primitive) => { + if (primitive === "read") return method("get", { kind: "state", primitive }, unit, req.valueType); + if (primitive === "write") { + writable(); + return method("set", { kind: "state", primitive }, req.valueType, unit); + } + throw new PortableBindingError(path, `State ${primitive} is not supported by this portable adapter yet`); + }); + case "edge": { + const ref: ValueType = { kind: "object-ref", expectation: req.target }; + const item: ValueType = { kind: "record", fields: { entry: string, target: ref } }; + return req.primitives.map((primitive) => { + if (primitive === "resolve") + return method("resolve", { kind: "edge", primitive }, unit, { kind: "list", value: item }); + writable(); + if (primitive === "connect") return method("connect", { kind: "edge", primitive }, ref, string, true); + if (primitive === "disconnect") return method("disconnect", { kind: "edge", primitive }, string, bool); + throw new PortableBindingError(path, `Edge ${primitive} is not supported by this portable adapter yet`); + }); + } + case "interface": { + const iface = schema.interfaces.find((i) => i.revisionId === req.interfaceRevisionId); + if (!iface) throw new PortableBindingError(path, `Missing interface ${req.interfaceRevisionId}`); + const operations = iface.members.flatMap((member) => member.operations.map((op) => ({ member, op }))); + if (req.operations?.some((id) => !operations.some(({ op }) => op.id === id))) + throw new PortableBindingError(path, "Unknown selected interface operation"); + return operations + .filter(({ op }) => !req.operations || req.operations.includes(op.id)) + .map(({ member, op }) => { + const execution: ExecutionContract = op.execution ?? { kind: "remote" }; + if ( + execution.kind === "remote" || + !execution.targets.includes(target) || + op.mode !== "call" || + op.scope === "class" + ) + throw new PortableBindingError( + `${path}.${member.displayName}.${op.displayName}`, + `Selected operation is not an object call available in portable target ${target}; select a portable subset or move this handler to remote execution`, + ); + if (execution.kind === "transaction") writable(); + return method( + `${member.displayName}.${op.displayName}`, + { kind: "interface", operationId: op.id }, + op.inputType, + op.outputType, + execution.kind === "transaction", + ); + }); + } + default: + throw new PortableBindingError(path, `Unsupported ${req.kind} port in portable bindings`); + } +} +export interface PortableBindingOptions { + target: string; + runtimeModule?: string; +} +/** Generate one target's handlers. The same source signatures are used in browser/server builds. */ +export function generatePortableTypeScriptBindings( + schema: BindingSchema, + revision: string, + options: PortableBindingOptions, +): string { + const pkg = schema.packages.find((p) => p.revisionId === revision); + if (!pkg) throw new PortableBindingError(revision, "Missing package"); + const entries = pkg.exports.filter( + (e) => e.execution && e.execution.kind !== "remote" && e.execution.targets.includes(options.target), + ); + const names = new Set(); + const contexts: string[] = [], + implementations: string[] = [], + adapters: string[] = [], + descriptors: unknown[] = []; + for (const entry of entries) { + if (entry.application || entry.kind === "constructor") + throw new PortableBindingError( + entry.id, + "Portable generic adapters/legacy constructors are not implemented; declare an ordinary factory", + ); + if (names.has(entry.displayName)) throw new PortableBindingError(entry.id, "Duplicate handler name"); + names.add(entry.displayName); + const portNames = new Set(); + const all: Method[] = [], + facets: string[] = []; + for (const port of entry.dependencyPorts) { + if (portNames.has(port.displayName)) + throw new PortableBindingError(entry.id, `Duplicate port name ${port.displayName}`); + portNames.add(port.displayName); + const selected = methods(schema, entry, port, options.target); + if (new Set(selected.map((m) => m.name)).size !== selected.length) + throw new PortableBindingError(port.id, "Duplicate method name"); + all.push(...selected); + facets.push( + `readonly ${q(port.displayName)}: { ${selected.map((m) => `readonly ${q(m.name)}: (${[...(isUnit(m.input) ? [] : [`input: ${tsType(m.input)}`]), ...(m.keyed ? ["options: MutationKey"] : [])].join(", ")}) => Promise<${tsType(m.output)}>`).join("; ")} }`, + ); + } + const receiver = + entry.kind === "function" + ? null + : entry.receiverRequirement.kind === "exact-atom" + ? { kind: "atom", id: entry.receiverRequirement.atomId } + : "object"; + const receiverType = + receiver === null + ? "null" + : receiver === "object" + ? "ExactReference" + : `ManagedReference<"atom", ${q(receiver.id)}>`; + contexts.push( + `readonly ${q(entry.displayName)}: { readonly effect: ${q(entry.execution!.kind)}; readonly input: ${tsType(entry.inputType)}; readonly receiver: ${receiverType}; readonly ports: { ${facets.join("; ")} } }`, + ); + const output = tsType(entry.outputType); + implementations.push( + `readonly ${q(entry.displayName)}: (context: Contexts[${q(entry.displayName)}]) => ${output} | Promise<${output}>`, + ); + adapters.push( + `${q(entry.id)}: context => installed[${q(entry.displayName)}](context as Contexts[${q(entry.displayName)}])`, + ); + descriptors.push({ + id: entry.id, + name: entry.displayName, + effect: entry.execution!.kind, + receiver, + input: portableValueSchema(entry.inputType), + output: portableValueSchema(entry.outputType), + methods: all.map((m) => ({ ...m, input: portableValueSchema(m.input), output: portableValueSchema(m.output) })), + }); + } + return `// Generated portable bindings. Regenerate from the checked capability schema; do not edit.\nimport { definePortableRegistry, type PortableExport, type ManagedReference, type ExactReference, type MutationKey } from ${q(options.runtimeModule ?? "@quixos/camino-replica-core")};\nexport const bindingDigest = ${q(hexDigest(schema))};\nexport const packageRevision = ${q(revision)};\nexport const target = ${q(options.target)};\nexport type Contexts = { ${contexts.join(";\n")} };\nexport type PortableImplementation = { ${implementations.join(";\n")} };\nexport const declarations = ${JSON.stringify(descriptors, null, 2)} as const satisfies readonly PortableExport[];\nexport function createRegistry(handlers: PortableImplementation) { const installed = { ...handlers }; return definePortableRegistry(declarations, { ${adapters.join(",\n")} }); }\n`; +} diff --git a/src/execution-world/README.md b/src/execution-world/README.md index d65ec12..023933c 100644 --- a/src/execution-world/README.md +++ b/src/execution-world/README.md @@ -89,3 +89,17 @@ The service control vocabulary includes readiness, cancellation, and shutdown; transport framing and generated adapters are LF-05/LF-08. Portable modules and services implement the same declared operation contracts. ABI compatibility is not a statement about package trust, co-location permission, or multi-user isolation. + +Portable package bindings are generated with `quixos-codegen-ts` options +`{"portable":{"target":"browser"}}` (or `server`). They expose `Contexts`, +`PortableImplementation`, checked codec declarations, and `createRegistry`. +Handlers import the shared replica core, never Replicache. Stable mutation keys +are mandatory for creation and selected nested transaction calls. Snapshot +contexts expose only their declared read methods; runtime frame checks remain +mandatory even when the TypeScript source passed compilation. + +The maintained reader source in `tools/local-first/reader/portable.ts` typechecks +against both generated targets without casts. The root +`camino-portable-bindings` qualification compares Node, Window, Worker and +serialized-port behavior. Its simulated channel tests adapters, not installed +operation acquisition or process isolation; those require the coordinator. diff --git a/test/emit-portable-reader.ts b/test/emit-portable-reader.ts new file mode 100644 index 0000000..1b2dd7c --- /dev/null +++ b/test/emit-portable-reader.ts @@ -0,0 +1,13 @@ +/** Qualification artifact emitted after tests, never a production fixture dependency. */ +import { mkdir, writeFile } from "node:fs/promises"; +import { loadReaderWorkspace } from "./reader-fixture.js"; +import { compileExecutionPlan } from "../src/execution-world/plan.js"; +import { generatePortableTypeScriptBindings } from "../src/bindings/portable.js"; +const plan = compileExecutionPlan(await loadReaderWorkspace()); +await mkdir("dist/portable-reader", { recursive: true }); +for (const target of ["browser", "server"]) + await writeFile( + `dist/portable-reader/${target}.ts`, + generatePortableTypeScriptBindings(plan.definition.bindingSchema, "package:reader-runtime@1", { target }), + ); +await writeFile("dist/portable-reader/plan.json", JSON.stringify(plan)); diff --git a/test/portable-bindings.test.ts b/test/portable-bindings.test.ts new file mode 100644 index 0000000..5265972 --- /dev/null +++ b/test/portable-bindings.test.ts @@ -0,0 +1,38 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { generatePortableTypeScriptBindings } from "../src/bindings/portable.js"; +import { compileExecutionPlan } from "../src/execution-world/plan.js"; +import { loadReaderWorkspace } from "./reader-fixture.js"; + +test("reader portable bindings have selected facets, creation inputs and stable keyed calls", async () => { + const schema = compileExecutionPlan(await loadReaderWorkspace()).definition.bindingSchema; + const source = generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", { target: "browser" }); + assert.match(source, /readonly "sourceRevision.get": \(\) => Promise/); + assert.match( + source, + /readonly "highlights.connect": \(input: ManagedReference<"atom", "atom:reader:highlight">, options: MutationKey\)/, + ); + assert.match(source, /readonly "createDocument"/); + assert.match(source, /readonly "create":/); + assert.match(source, /readonly "comments": ReadonlyArray/); + assert.doesNotMatch(source, /"highlights.resolve"|context\.conform|objectId|"live"/); + assert.equal(source, generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", { target: "browser" })); + const server = generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", { target: "server" }); + assert.equal(source.replace('target = "browser"', 'target = "server"'), server); +}); + +test("generation rejects remote dependencies, wrong effects and unsupported shapes explicitly", async () => { + const schema = compileExecutionPlan(await loadReaderWorkspace()).definition.bindingSchema; + const generate = () => generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", { target: "browser" }); + const entry = schema.packages[0]!.exports.find((e) => e.displayName === "addHighlight")!; + entry.execution = { kind: "snapshot", targets: ["browser"] }; + assert.throws(generate, /Snapshot context cannot expose mutation ports/); + entry.execution = { kind: "transaction", targets: ["browser"] }; + const iface = schema.interfaces.find((i) => i.revisionId === "interface:reader:document-data@1")!; + const getter = iface.members[0]!.operations[0]!; + getter.execution = { kind: "remote" }; + assert.throws(generate, /not an object call available in portable target browser/); + getter.execution = { kind: "snapshot", targets: ["browser", "server"] }; + entry.dependencyPorts[0]!.requirement = { kind: "reflection", selectors: ["active"] }; + assert.throws(generate, /Unsupported reflection port/); +}); From ab41e67dc56df39350f0935b6e8642d72774a541 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 20 Sep 2026 00:25:53 -0700 Subject: [PATCH 13/91] Build checked portable package artifacts and shared runtime assets --- flake.nix | 1 + nix/checked-artifacts.nix | 41 +++++++++++++ src/execution-world/files.ts | 15 +++++ src/execution-world/index.ts | 4 ++ src/execution-world/ports.ts | 7 ++- src/execution-world/receipts.ts | 102 ++++++++++++++++++++++++++++++++ test/artifact-files.test.ts | 28 +++++++++ test/emit-portable-reader.ts | 20 +++++++ 8 files changed, 216 insertions(+), 2 deletions(-) create mode 100644 nix/checked-artifacts.nix create mode 100644 src/execution-world/receipts.ts diff --git a/flake.nix b/flake.nix index 35c21a0..3256fe8 100644 --- a/flake.nix +++ b/flake.nix @@ -75,6 +75,7 @@ runHook preInstall mkdir -p "$out" install -Dm644 nix/checked-package.nix "$out/share/checked-package.nix" + install -Dm644 nix/checked-artifacts.nix "$out/share/checked-artifacts.nix" substitute nix/checked-candidate.nix "$out/share/checked-candidate.nix" \ --replace-fail '@nixpkgs@' '${pkgs.path}' cp --reflink=auto --recursive grammar "$out/grammar" diff --git a/nix/checked-artifacts.nix b/nix/checked-artifacts.nix new file mode 100644 index 0000000..0505663 --- /dev/null +++ b/nix/checked-artifacts.nix @@ -0,0 +1,41 @@ +# Candidate artifact evaluation. This is separate from the old server activation path; +# the new coordinator consumes its manifest/receipt, not the legacy server ABI. +{ + source, + plan, + generator, + core, + sharedRuntime, + typescript, + packageRevisionId, + system ? builtins.currentSystem, +}: +let + packageSource = builtins.path { + path = /. + source; + name = "quixos-package-source"; + filter = + path: _: + !(builtins.elem (baseNameOf path) [ + ".git" + ".jj" + ]); + }; + package = builtins.getFlake ( + "path:" + builtins.unsafeDiscardStringContext (toString packageSource) + ); + checked = + package.quixosPackages.${system}.checkedArtifacts + or (throw "Package ${packageRevisionId} lacks checkedArtifacts for the portable execution world."); +in +checked { + inherit packageRevisionId; + plan = builtins.path { + path = /. + plan; + name = "candidate-execution-plan.json"; + }; + generator = builtins.storePath generator; + core = builtins.storePath core; + sharedRuntime = builtins.storePath sharedRuntime; + typescript = builtins.storePath typescript; +} diff --git a/src/execution-world/files.ts b/src/execution-world/files.ts index 765a590..601b8f1 100644 --- a/src/execution-world/files.ts +++ b/src/execution-world/files.ts @@ -99,6 +99,13 @@ export interface ArtifactResponse { headers: Record; body: Uint8Array; } +/** Shared runtime imports use content identity, independent of the importing package/world. + * The file remains covered by every importing implementation's checked manifest. */ +export function contentArtifactUrl(file: Pick): string { + if (!/^[0-9a-f]{64}$/.test(file.digest)) fail(file.path, "Invalid content digest"); + artifactPath(file.path); + return `/__quixos/artifacts/content/${file.digest}/${encodeURIComponent(path.basename(file.path))}`; +} /** This registry is placed behind the workspace gateway's existing authentication. * Lookup uses an explicit URL table; request paths never become filesystem paths. */ export class BrowserArtifactGateway { @@ -124,6 +131,14 @@ export class BrowserArtifactGateway { ) fail(url, "Conflicting browser asset route"); this.routes.set(url, { revision: manifest.packageRevisionId, file: Object.freeze({ ...file }) }); + // Exact shared-file names are a packaging convention, never a path lookup capability. + if (file.path.startsWith("share/quixos/shared/")) { + const contentUrl = contentArtifactUrl(file); + const existing = this.routes.get(contentUrl); + if (existing && (existing.file.bytes !== file.bytes || existing.file.mediaType !== file.mediaType)) + fail(contentUrl, "Conflicting shared asset metadata"); + this.routes.set(contentUrl, { revision: manifest.packageRevisionId, file: Object.freeze({ ...file }) }); + } } entries.push({ url: prefix + implementation.path.split("/").map(encodeURIComponent).join("/"), diff --git a/src/execution-world/index.ts b/src/execution-world/index.ts index efd6ed6..335c596 100644 --- a/src/execution-world/index.ts +++ b/src/execution-world/index.ts @@ -2,3 +2,7 @@ export * from "./plan.js"; export * from "./artifacts.js"; export * from "./ports.js"; export * from "./files.js"; + +export * from "./receipts.js"; + +export { generatePortableTypeScriptBindings } from "../bindings/portable.js"; diff --git a/src/execution-world/ports.ts b/src/execution-world/ports.ts index 666e102..7896193 100644 --- a/src/execution-world/ports.ts +++ b/src/execution-world/ports.ts @@ -3,7 +3,8 @@ export const transactionPortAbi = "quixos-transaction-ports-v1"; export type PortAction = | { kind: "state"; primitive: "read" | "write" | "edit" } - | { kind: "edge"; primitive: "resolve" | "connect" | "disconnect" } + | { kind: "edge"; primitive: "resolve" | "disconnect" } + | { kind: "edge"; primitive: "connect"; key: string } | { kind: "interface"; operationId: string; key?: string } | { kind: "query" } | { kind: "creation"; key: string }; @@ -19,6 +20,7 @@ export interface PortInvocation { } export interface PackageInvocation { abi: typeof transactionPortAbi; + workspace: string; frame: string; invocation: string; exportId: string; @@ -66,7 +68,8 @@ export function checkPortInvocation(value: unknown): PortInvocation { action.kind === "state" ? exact(["kind", "primitive"]) && ["read", "write", "edit"].includes(action.primitive as string) : action.kind === "edge" - ? exact(["kind", "primitive"]) && ["resolve", "connect", "disconnect"].includes(action.primitive as string) + ? (exact(["kind", "primitive"]) && ["resolve", "disconnect"].includes(action.primitive as string)) || + (exact(["kind", "primitive", "key"]) && action.primitive === "connect" && identifier(action.key)) : action.kind === "interface" ? (exact(["kind", "operationId"]) || (exact(["kind", "operationId", "key"]) && identifier(action.key))) && identifier(action.operationId) diff --git a/src/execution-world/receipts.ts b/src/execution-world/receipts.ts new file mode 100644 index 0000000..693d4ee --- /dev/null +++ b/src/execution-world/receipts.ts @@ -0,0 +1,102 @@ +import { createHash } from "node:crypto"; +import { generatePortableTypeScriptBindings } from "../bindings/portable.js"; +import { type ExecutionPlan, ExecutionPlanError, hexDigest } from "./plan.js"; +import { type ArtifactReader, type PackageArtifacts } from "./artifacts.js"; +import { loadArtifactWorld, type LoadedArtifactWorld } from "./files.js"; + +export interface ArtifactReceipt { + schemaVersion: 1; + packageRevisionId: string; + bindingDigest: string; + sourceDigest: string; + manifestDigest: string; + generatorDigest: string; + generated: { target: string; path: string; digest: string; bytes: number }[]; +} +const hashBytes = (bytes: Uint8Array) => createHash("sha256").update(bytes).digest("hex"); +/** Deterministic expected receipt. A trusted build must also typecheck and bundle these exact sources. + * This is consistency evidence inside a trusted Nix build path, not remote build attestation. */ +export function expectedArtifactReceipt( + plan: ExecutionPlan, + manifest: PackageArtifacts, + generatorDigest: string, +): { receipt: ArtifactReceipt; sources: Map } { + if (!/^[0-9a-f]{64}$/.test(generatorDigest)) throw new Error("Invalid trusted generator digest"); + const pkg = plan.definition.packages.find((p) => p.revision === manifest.packageRevisionId); + const schemaPackage = plan.definition.bindingSchema.packages.find((p) => p.revisionId === manifest.packageRevisionId); + if ( + !pkg || + !schemaPackage || + manifest.bindingDigest !== pkg.bindingDigest || + manifest.sourceDigest !== pkg.sourceDigest + ) + throw new ExecutionPlanError( + "INVALID_RECEIPT", + manifest.packageRevisionId, + "Receipt package/schema/source mismatch", + ); + const available = new Set(manifest.implementations.map((i) => i.target)); + const targets = [ + ...new Set( + schemaPackage.exports.flatMap((e) => (e.execution && e.execution.kind !== "remote" ? e.execution.targets : [])), + ), + ] + .filter((t) => available.has(t)) + .sort(); + const sources = new Map(); + const generated = targets.map((target) => { + if (!/^[a-zA-Z0-9_-]+$/.test(target)) throw new Error("Unsupported generated target filename"); + const path = `share/quixos/generated/${target}.ts`; + const bytes = new TextEncoder().encode( + generatePortableTypeScriptBindings(plan.definition.bindingSchema, pkg.revision, { target }), + ); + sources.set(path, bytes); + return { target, path, digest: hashBytes(bytes), bytes: bytes.length }; + }); + return { + receipt: { + schemaVersion: 1, + packageRevisionId: pkg.revision, + bindingDigest: pkg.bindingDigest, + sourceDigest: pkg.sourceDigest, + manifestDigest: hexDigest(manifest), + generatorDigest, + generated, + }, + sources, + }; +} +export async function checkArtifactReceipt( + plan: ExecutionPlan, + manifest: PackageArtifacts, + receipt: unknown, + generatorDigest: string, + read: ArtifactReader, +): Promise { + const expected = expectedArtifactReceipt(plan, manifest, generatorDigest); + if (hexDigest(receipt) !== hexDigest(expected.receipt)) + throw new ExecutionPlanError( + "INVALID_RECEIPT", + manifest.packageRevisionId, + "Receipt differs from the trusted compiler/schema/artifact expectation", + ); + for (const file of expected.receipt.generated) { + const actual = await read(manifest.packageRevisionId, file.path, file.bytes); + if (actual.length !== file.bytes || hashBytes(actual) !== file.digest) + throw new ExecutionPlanError("INVALID_RECEIPT", file.path, "Generated bindings were replaced or omitted"); + } +} +/** Activation uses this entrypoint with its trusted generator identity, not the manifest-only loader. */ +export async function loadCheckedArtifactWorld( + plan: ExecutionPlan, + roots: Readonly>, + generatorDigest: string, +): Promise { + const loaded = await loadArtifactWorld(plan, roots); + for (const manifest of loaded.manifests) { + const bytes = await loaded.read(manifest.packageRevisionId, "share/quixos/build-receipt.json", 16 * 1024 * 1024); + const receipt: unknown = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes)); + await checkArtifactReceipt(plan, manifest, receipt, generatorDigest, loaded.read); + } + return loaded; +} diff --git a/test/artifact-files.test.ts b/test/artifact-files.test.ts index 45796e1..cf1b03b 100644 --- a/test/artifact-files.test.ts +++ b/test/artifact-files.test.ts @@ -10,6 +10,7 @@ import { loadArtifactWorld, BrowserArtifactGateway, implementationDigest, + contentArtifactUrl, } from "../src/execution-world/index.js"; import { loadReaderWorkspace } from "./reader-fixture.js"; import { buildArtifactFixture } from "./artifact-fixture.js"; @@ -52,6 +53,8 @@ test("gateway serves only declared browser assets with correct Wasm MIME and con digest: createHash("sha256").update(wasm).digest("hex"), mediaType: "application/wasm", }); + const shared = { ...browser.files[0]!, path: "share/quixos/shared/core.mjs" }; + browser.files.push(shared); const { contentDigest, ...body } = browser; browser.contentDigest = implementationDigest(body); for (const implementation of fixture.manifest.implementations) @@ -65,6 +68,7 @@ test("gateway serves only declared browser assets with correct Wasm MIME and con const loaded = await loadArtifactWorld(plan, { [fixture.manifest.packageRevisionId]: root }); const gateway = new BrowserArtifactGateway(loaded); assert.equal(gateway.entries.length, 1); + assert.deepEqual((await gateway.response(contentArtifactUrl(shared)))?.body, Buffer.from(fixture.bytes)); const entry = gateway.entries[0]!; const response = await gateway.response(entry.url); assert.equal(response?.status, 200); @@ -86,3 +90,27 @@ test("gateway serves only declared browser assets with correct Wasm MIME and con await rm(root, { recursive: true, force: true }); } }); + +test("checked receipts bind regenerated code, generator identity and manifests", async () => { + const { expectedArtifactReceipt, checkArtifactReceipt } = await import("../src/execution-world/receipts.js"); + const plan = compileExecutionPlan(await loadReaderWorkspace()); + const fixture = buildArtifactFixture(plan); + const generator = "a".repeat(64); + const { receipt, sources } = expectedArtifactReceipt(plan, fixture.manifest, generator); + const read = async (_revision: string, file: string) => sources.get(file)!; + await checkArtifactReceipt(plan, fixture.manifest, receipt, generator, read); + await assert.rejects( + checkArtifactReceipt(plan, fixture.manifest, { ...receipt, generatorDigest: "b".repeat(64) }, generator, read), + /trusted compiler/, + ); + await assert.rejects( + checkArtifactReceipt(plan, fixture.manifest, { ...receipt, manifestDigest: "b".repeat(64) }, generator, read), + /trusted compiler/, + ); + await assert.rejects( + checkArtifactReceipt(plan, fixture.manifest, receipt, generator, async () => + new TextEncoder().encode("substituted"), + ), + /replaced or omitted/, + ); +}); diff --git a/test/emit-portable-reader.ts b/test/emit-portable-reader.ts index 1b2dd7c..cd08753 100644 --- a/test/emit-portable-reader.ts +++ b/test/emit-portable-reader.ts @@ -11,3 +11,23 @@ for (const target of ["browser", "server"]) generatePortableTypeScriptBindings(plan.definition.bindingSchema, "package:reader-runtime@1", { target }), ); await writeFile("dist/portable-reader/plan.json", JSON.stringify(plan)); +const serviceWorkspace = structuredClone(plan.definition.workspace); +serviceWorkspace.atoms = []; +serviceWorkspace.conformances = []; +serviceWorkspace.constructors = []; +serviceWorkspace.interfaceImports = []; +serviceWorkspace.sharedAttachments = []; +serviceWorkspace.packageImports[0]!.queries = []; +serviceWorkspace.packageImports[0]!.checkedQueries = []; +const original = serviceWorkspace.packageImports[0]!.exports.find((e) => e.kind === "function")!; +serviceWorkspace.packageImports[0]!.exports = [ + { + ...original, + kind: "function", + execution: { kind: "remote" }, + inputType: { kind: "scalar", name: "string" }, + outputType: { kind: "scalar", name: "string" }, + dependencyPorts: [], + }, +]; +await writeFile("dist/portable-reader/service-plan.json", JSON.stringify(compileExecutionPlan(serviceWorkspace))); From 8fd800e69af8d921134c9c76cc329a28025d190a Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 20 Sep 2026 01:05:02 -0700 Subject: [PATCH 14/91] Execute checked capability bindings through scoped package runners --- src/execution-world/index.ts | 2 + src/execution-world/kernel.ts | 201 ++++++++++++++++++++++++++++++++++ test/emit-portable-reader.ts | 2 + 3 files changed, 205 insertions(+) create mode 100644 src/execution-world/kernel.ts diff --git a/src/execution-world/index.ts b/src/execution-world/index.ts index 335c596..c924f5b 100644 --- a/src/execution-world/index.ts +++ b/src/execution-world/index.ts @@ -6,3 +6,5 @@ export * from "./files.js"; export * from "./receipts.js"; export { generatePortableTypeScriptBindings } from "../bindings/portable.js"; + +export * from "./kernel.js"; diff --git a/src/execution-world/kernel.ts b/src/execution-world/kernel.ts new file mode 100644 index 0000000..00dcdd0 --- /dev/null +++ b/src/execution-world/kernel.ts @@ -0,0 +1,201 @@ +import type { + ValueType, + InitializationField, + PersistentAttachment, + DependencyBinding, +} from "../capability-model/types.js"; +import { type ExecutionPlan, ExecutionPlanError, hexDigest } from "./plan.js"; +import { portableValueSchema } from "../bindings/portable.js"; +/** Small data-only interpreter input; no compiler, parser, Node module or SQL dependency reaches the browser. */ +export function compileKernelProgram(plan: ExecutionPlan): unknown { + if (hexDigest(plan.definition) !== plan.digest) + throw new ExecutionPlanError("INVALID_PLAN", "kernel", "Plan digest mismatch"); + const workspace = plan.definition.workspace; + if (workspace.sharedAttachments.length) + throw new ExecutionPlanError( + "UNSUPPORTED_SHARED_STORAGE", + "kernel", + "Stage 0 requires explicit conformance-owned storage", + ); + const schema = (type: ValueType): unknown | null => { + try { + return portableValueSchema(type); + } catch { + return null; + } + }; + const ownerBySlot = new Map(); + const edges: unknown[] = []; + const owners = plan.definition.owners.map((owner) => { + const slots: unknown[] = []; + for (const storage of owner.storage as PersistentAttachment[]) { + if (storage.kind === "state") { + const shape = schema(storage.valueType); + if (!shape) + throw new ExecutionPlanError("UNSUPPORTED_STORAGE_CODEC", storage.id, "Unsupported canonical value type"); + ownerBySlot.set(storage.id, owner.id); + slots.push({ + id: storage.id, + schema: shape, + policy: storage.storagePolicy.kind === "register" ? "register" : "crdt", + ...(Object.hasOwn(storage, "defaultValue") ? { defaultLiteral: storage.defaultValue } : {}), + }); + } else { + const endpoints = storage.endpoints.map((endpoint) => { + if ( + endpoint.ordered || + endpoint.keyType || + endpoint.retainOther || + (endpoint.onDelete && endpoint.onDelete !== "restrict") + ) + throw new ExecutionPlanError( + "UNSUPPORTED_GRAPH_FEATURE", + storage.id, + "Ordered/keyed/deletion policies require LF-18", + ); + return { + projection: endpoint.projectionId, + constraint: { + kind: endpoint.constraint.kind, + id: + endpoint.constraint.kind === "atom" + ? endpoint.constraint.atomId + : endpoint.constraint.interfaceRevisionId, + }, + cardinality: endpoint.cardinality, + }; + }); + edges.push({ id: storage.id, owner: owner.id, a: endpoints[0], b: endpoints[1] }); + } + } + return { + id: owner.id, + atom: owner.atom, + interface: owner.interface, + slots, + initialize: (owner.initialization as InitializationField[]).map((field) => ({ + input: field.input, + binding: + field.binding.kind === "state" + ? { kind: "state", slot: field.binding.slotId } + : { kind: "edge", edge: field.binding.edgeTypeId, projection: field.binding.projectionId }, + })), + }; + }); + const slotOwner = (slot: string) => { + const owner = ownerBySlot.get(slot); + if (!owner) throw new ExecutionPlanError("MISSING_STORAGE_OWNER", slot, "No checked owner"); + return owner; + }; + const via = (binding: DependencyBinding) => + "via" in binding && binding.via + ? { via: { edge: binding.via.edgeTypeId, projection: binding.via.projectionId } } + : {}; + const operations = plan.definition.operations.map((operation) => { + const binding = operation.binding; + let target: unknown; + let unsupported: string | null = null; + if (binding.kind === "state") + target = { kind: "state", owner: slotOwner(binding.slotId), slot: binding.slotId, primitive: binding.primitive }; + else if (binding.kind === "edge") + target = { + kind: "edge", + edge: binding.edgeTypeId, + projection: binding.projectionId, + primitive: binding.primitive, + }; + else { + const pkg = workspace.packageImports.find((p) => p.revisionId === binding.packageRevisionId)!; + const entry = pkg.exports.find((e) => e.id === binding.exportId)!; + const ports = binding.dependencies.map((dependency) => { + const requirement = entry.dependencyPorts.find((p) => p.id === dependency.portId)!.requirement; + const bound = dependency.binding; + const common = { id: dependency.portId, ...via(bound) }; + if (bound.kind === "state" && requirement.kind === "state") + return { + ...common, + kind: "state", + owner: slotOwner(bound.slotId), + slot: bound.slotId, + primitives: requirement.primitives, + }; + if (bound.kind === "edge" && requirement.kind === "edge") + return { + ...common, + kind: "edge", + edge: bound.edgeTypeId, + projection: bound.projectionId, + primitives: requirement.primitives, + }; + if (bound.kind === "interface" && requirement.kind === "interface") { + const iface = workspace.interfaceImports.find((i) => i.revisionId === bound.interfaceRevisionId)!; + return { + ...common, + kind: "interface", + interface: bound.interfaceRevisionId, + operations: requirement.operations ?? iface.members.flatMap((m) => m.operations.map((o) => o.id)), + }; + } + if (bound.kind === "creation" && requirement.kind === "creation") + return { + ...common, + kind: "creation", + atom: bound.atomId, + schema: portableValueSchema(requirement.inputType), + recipe: hexDigest({ plan: plan.digest, operation: operation.key, port: dependency.portId }), + owners: bound.owners.map((seed) => { + const owner = owners.find((o) => o.atom === bound.atomId && o.interface === seed.interfaceRevisionId); + if (!owner) + throw new ExecutionPlanError( + "MISSING_STORAGE_OWNER", + dependency.portId, + "Creation has no initialization owner", + ); + return { owner: owner.id, inputPath: seed.inputPath }; + }), + }; + unsupported = `UNSUPPORTED_EXECUTION_PORT:${bound.kind}`; + return { ...common, kind: "unavailable" }; + }); + target = { kind: "package", package: binding.packageRevisionId, export: binding.exportId, ports }; + } + const input = schema(operation.input), + output = schema(operation.output); + return { + key: operation.key, + atom: operation.atomId, + interface: operation.interfaceRevisionId, + operation: operation.operationId, + scope: operation.scope, + effect: operation.execution.kind, + targets: operation.execution.kind === "remote" ? [] : operation.execution.targets, + input, + output, + unsupported: unsupported ?? (input && output ? null : "UNSUPPORTED_OPERATION_CODEC"), + binding: target, + }; + }); + const packages = workspace.packageImports.map((pkg) => ({ + revision: pkg.revisionId, + exports: pkg.exports.map((entry) => ({ + id: entry.id, + effect: entry.execution?.kind ?? "remote", + targets: entry.execution && entry.execution.kind !== "remote" ? entry.execution.targets : [], + receiver: + entry.kind === "function" + ? null + : entry.kind === "operation" && entry.receiverRequirement.kind === "exact-atom" + ? { kind: "atom", id: entry.receiverRequirement.atomId } + : "object", + input: schema(entry.inputType), + output: schema(entry.outputType), + })), + })); + return { + codec: "camino-kernel-program-v1", + plan: plan.digest, + model: { workspace: workspace.workspaceId, atoms: workspace.atoms.map((atom) => atom.id), owners, edges }, + operations, + packages, + }; +} diff --git a/test/emit-portable-reader.ts b/test/emit-portable-reader.ts index cd08753..33ffbab 100644 --- a/test/emit-portable-reader.ts +++ b/test/emit-portable-reader.ts @@ -1,6 +1,7 @@ /** Qualification artifact emitted after tests, never a production fixture dependency. */ import { mkdir, writeFile } from "node:fs/promises"; import { loadReaderWorkspace } from "./reader-fixture.js"; +import { compileKernelProgram } from "../src/execution-world/kernel.js"; import { compileExecutionPlan } from "../src/execution-world/plan.js"; import { generatePortableTypeScriptBindings } from "../src/bindings/portable.js"; const plan = compileExecutionPlan(await loadReaderWorkspace()); @@ -11,6 +12,7 @@ for (const target of ["browser", "server"]) generatePortableTypeScriptBindings(plan.definition.bindingSchema, "package:reader-runtime@1", { target }), ); await writeFile("dist/portable-reader/plan.json", JSON.stringify(plan)); +await writeFile("dist/portable-reader/kernel.json", JSON.stringify(compileKernelProgram(plan))); const serviceWorkspace = structuredClone(plan.definition.workspace); serviceWorkspace.atoms = []; serviceWorkspace.conformances = []; From d9bd5b280020a0fdcfa101ae1b5968a090aa5bc7 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 20 Sep 2026 01:49:56 -0700 Subject: [PATCH 15/91] Acquire installed portable operations with explicit authority and input coverage --- flake.nix | 4 +- package.json | 1 + src/bindings/index.ts | 1 + src/bindings/portable-client-cli.ts | 13 +++ src/bindings/portable-client.ts | 68 +++++++++++ src/bindings/portable.ts | 2 +- src/execution-world/index.ts | 2 + src/execution-world/projections.ts | 44 +++++++ test/composite-fixture.ts | 57 +++++++++ test/emit-portable-reader.ts | 16 +++ .../local-first-composite/CommentFactory.qx | 7 ++ .../local-first-composite/CommentRuntime.qx | 11 ++ .../local-first-composite/DocumentFactory.qx | 25 ++++ .../local-first-composite/DocumentMetadata.qx | 6 + .../local-first-composite/ReaderRuntime.qx | 84 ++++++++++++++ .../local-first-composite/workspace.qx | 108 ++++++++++++++++++ test/projection-compatibility.test.ts | 29 +++++ yarn.lock | 1 + 18 files changed, 477 insertions(+), 2 deletions(-) create mode 100644 src/bindings/portable-client-cli.ts create mode 100644 src/bindings/portable-client.ts create mode 100644 src/execution-world/projections.ts create mode 100644 test/composite-fixture.ts create mode 100644 test/fixtures/local-first-composite/CommentFactory.qx create mode 100644 test/fixtures/local-first-composite/CommentRuntime.qx create mode 100644 test/fixtures/local-first-composite/DocumentFactory.qx create mode 100644 test/fixtures/local-first-composite/DocumentMetadata.qx create mode 100644 test/fixtures/local-first-composite/ReaderRuntime.qx create mode 100644 test/fixtures/local-first-composite/workspace.qx create mode 100644 test/projection-compatibility.test.ts diff --git a/flake.nix b/flake.nix index 3256fe8..f2fcab4 100644 --- a/flake.nix +++ b/flake.nix @@ -60,6 +60,7 @@ --bundle --platform=node --target=node24 --format=esm \ --outfile=quixos-lock-check.mjs esbuild dist/src/bindings/cli.js --bundle --platform=node --target=node24 --format=esm --outfile=quixos-codegen-ts.mjs + esbuild dist/src/bindings/portable-client-cli.js --bundle --platform=node --target=node24 --format=esm --outfile=quixos-codegen-client.mjs esbuild dist/src/bindings/react-platform.js --bundle --platform=node --target=node24 --format=esm --outfile=react-platform.mjs esbuild dist/src/capability-language/tool-cli.js --bundle --platform=node --target=node24 --format=esm --outfile=quixos-qx.mjs runHook postBuild @@ -85,7 +86,7 @@ mkdir -p "$out/share/quixos-protocol/qualification" cp -r dist/portable-reader "$out/share/quixos-protocol/qualification/" mkdir -p "$out/bin" - for tool in quixos-codegen-ts quixos-qx; do + for tool in quixos-codegen-ts quixos-codegen-client quixos-qx; do printf '#!/bin/sh\nexec ${pkgs.nodejs_24}/bin/node "%s/libexec/quixos-protocol/%s.mjs" "$@"\n' "$out" "$tool" > "$out/bin/$tool" chmod +x "$out/bin/$tool" done @@ -121,6 +122,7 @@ install -m644 client-codegen.mjs "$out/libexec/quixos-protocol/client-codegen.mjs" install -m644 react-platform.mjs "$out/libexec/quixos-protocol/react-platform.mjs" install -m644 quixos-codegen-ts.mjs quixos-qx.mjs "$out/libexec/quixos-protocol/" + install -m644 quixos-codegen-client.mjs "$out/libexec/quixos-protocol/" install -m644 quixos-descriptor-check.mjs "$out/libexec/quixos-protocol/quixos-descriptor-check.mjs" install -m644 quixos-capability-compile.mjs "$out/libexec/quixos-protocol/quixos-capability-compile.mjs" install -m644 quixos-workspace-compile.mjs "$out/libexec/quixos-protocol/quixos-workspace-compile.mjs" diff --git a/package.json b/package.json index 742ebb6..4aa8a44 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "type": "module", "bin": { "quixos-capability-compile": "dist/src/capability-language/cli.js", + "quixos-codegen-client": "dist/src/bindings/portable-client-cli.js", "quixos-codegen-ts": "dist/src/bindings/cli.js", "quixos-descriptor-check": "dist/src/descriptor-check.js", "quixos-lock-check": "dist/src/resource-lock/cli.js", diff --git a/src/bindings/index.ts b/src/bindings/index.ts index 826c8b5..56d0ae1 100644 --- a/src/bindings/index.ts +++ b/src/bindings/index.ts @@ -428,3 +428,4 @@ export { PortableBindingError, type PortableBindingOptions, } from "./portable.js"; +export * from "./portable-client.js"; diff --git a/src/bindings/portable-client-cli.ts b/src/bindings/portable-client-cli.ts new file mode 100644 index 0000000..904a7d7 --- /dev/null +++ b/src/bindings/portable-client-cli.ts @@ -0,0 +1,13 @@ +#!/usr/bin/env node +import { readFile, writeFile } from "node:fs/promises"; +import { generatePortableClientBindings } from "./portable-client.js"; +async function main() { + const [plan, output, target = "browser", ...rest] = process.argv.slice(2); + if (!plan || !output || rest.length) + throw Error("usage: quixos-codegen-client EXECUTION_PLAN.json OUTPUT.ts [TARGET]"); + await writeFile(output, generatePortableClientBindings(JSON.parse(await readFile(plan, "utf8")), { target })); +} +void main().catch((error) => { + console.error(error instanceof Error ? error.message : error); + process.exitCode = 1; +}); diff --git a/src/bindings/portable-client.ts b/src/bindings/portable-client.ts new file mode 100644 index 0000000..b9be48e --- /dev/null +++ b/src/bindings/portable-client.ts @@ -0,0 +1,68 @@ +import { hexDigest, type ExecutionPlan } from "../execution-world/plan.js"; +import { resultInterfaces } from "../execution-world/projections.js"; +import { portableValueSchema, tsType, PortableBindingError } from "./portable.js"; +/** Closed-world app descriptors. Handler bindings and application acquisition share the same public identities. */ +export function generatePortableClientBindings( + plan: ExecutionPlan, + options: { target: string; runtimeModule?: string }, +): string { + if (hexDigest(plan.definition) !== plan.digest) throw new PortableBindingError("client", "Invalid plan digest"); + const workspace = plan.definition.workspace, + atoms = new Map(), + unavailable: { key: string; reason: string }[] = []; + const seen = new Set(); + for (const operation of plan.definition.operations) { + if (operation.execution.kind === "remote" || !operation.execution.targets.includes(options.target)) { + unavailable.push({ key: operation.key, reason: "OPERATION_NOT_PORTABLE" }); + continue; + } + let input: string, output: string; + try { + input = tsType(operation.input); + output = tsType(operation.output); + } catch (error) { + if (!(error instanceof PortableBindingError)) throw error; + unavailable.push({ key: operation.key, reason: "UNSUPPORTED_OPERATION_CODEC" }); + continue; + } + const atom = workspace.atoms.find((a) => a.id === operation.atomId)!; + const iface = workspace.interfaceImports.find((i) => i.revisionId === operation.interfaceRevisionId)!; + const member = iface.members.find((m) => m.operations.some((o) => o.id === operation.operationId))!; + const facet = member.operations.find((o) => o.id === operation.operationId)!; + const name = `${iface.displayName}.${member.displayName}.${facet.displayName}`; + const alias = JSON.stringify([atom.displayName, name]); + if (seen.has(alias)) throw new PortableBindingError(alias, "Ambiguous application descriptor alias"); + seen.add(alias); + const roots = resultInterfaces(plan, operation.key); + const descriptor = { + key: operation.key, + plan: plan.digest, + effect: operation.execution.kind, + input: portableValueSchema(operation.input), + output: portableValueSchema(operation.output), + resultInterfaces: roots, + }; + const list = atoms.get(atom.displayName) ?? []; + list.push( + `${JSON.stringify(name)}: defineOperationDescriptor<${input}, ${output}, ${roots.map((r) => JSON.stringify(r)).join(" | ") || "never"}, ${JSON.stringify(operation.execution.kind)}>(${JSON.stringify(descriptor)})`, + ); + atoms.set(atom.displayName, list); + } + const queries = new Map(); + for (const query of plan.definition.queries) { + const declaration = query.query.checked.declaration; + if (declaration.placement?.kind !== "replica") continue; + const pkg = workspace.packageImports.find((p) => p.revisionId === query.query.packageRevisionId)!; + const alias = JSON.stringify([pkg.displayName, declaration.displayName]); + if (seen.has(`query:${alias}`)) throw new PortableBindingError(alias, "Ambiguous query alias"); + seen.add(`query:${alias}`); + const list = queries.get(pkg.displayName) ?? []; + list.push( + `${JSON.stringify(declaration.displayName)}: { id: ${JSON.stringify(query.id)}, plan: ${JSON.stringify(plan.digest)}, root: ${JSON.stringify(declaration.root.interface)}, rootKind: ${JSON.stringify(declaration.root.kind)} } as const satisfies ReplicaProjection<${JSON.stringify(declaration.root.interface)}, ${JSON.stringify(declaration.root.kind)}>`, + ); + queries.set(pkg.displayName, list); + } + const groups = (entries: Map) => + [...entries].map(([name, values]) => `${JSON.stringify(name)}: {${values.join(",\n")}}`).join(",\n"); + return `// Generated application descriptors. Regenerate; do not edit.\nimport { defineOperationDescriptor, type ManagedReference, type ReplicaProjection } from ${JSON.stringify(options.runtimeModule ?? "@quixos/camino-replica-core")};\nexport const planDigest = ${JSON.stringify(plan.digest)};\nexport const operations = {${groups(atoms)}} as const;\nexport const queries = {${groups(queries)}} as const;\nexport const unavailable = ${JSON.stringify(unavailable)} as const;\n`; +} diff --git a/src/bindings/portable.ts b/src/bindings/portable.ts index 012f935..be5a90d 100644 --- a/src/bindings/portable.ts +++ b/src/bindings/portable.ts @@ -52,7 +52,7 @@ export function portableValueSchema(type: ValueType): unknown { "Unsupported portable value; use a supported record/reference contract (native edits and generic adapters have separate tasks)", ); } -function tsType(type: ValueType): string { +export function tsType(type: ValueType): string { portableValueSchema(type); switch (type.kind) { case "scalar": diff --git a/src/execution-world/index.ts b/src/execution-world/index.ts index c924f5b..726a4ac 100644 --- a/src/execution-world/index.ts +++ b/src/execution-world/index.ts @@ -8,3 +8,5 @@ export * from "./receipts.js"; export { generatePortableTypeScriptBindings } from "../bindings/portable.js"; export * from "./kernel.js"; +export * from "./projections.js"; +export { generatePortableClientBindings } from "../bindings/portable-client.js"; diff --git a/src/execution-world/projections.ts b/src/execution-world/projections.ts new file mode 100644 index 0000000..2eb24af --- /dev/null +++ b/src/execution-world/projections.ts @@ -0,0 +1,44 @@ +import { ExecutionPlanError, hexDigest, type ExecutionPlan, type PlannedQuery } from "./plan.js"; +/** Contracts promised by a direct result. Interface dependencies are explicit; accidental + * overlap among today's implementations does not silently widen an exported interface contract. */ +export function resultInterfaces(plan: ExecutionPlan, operationKey: string): string[] { + const operation = plan.definition.operations.find((operation) => operation.key === operationKey); + if (!operation) throw new ExecutionPlanError("UNKNOWN_OPERATION", operationKey, "No installed public operation"); + if (operation.output.kind !== "object-ref") return []; + const expected = operation.output.expectation; + if (expected.kind === "atom") + return plan.definition.workspace.conformances + .filter((c) => c.atomId === expected.atomId) + .map((c) => c.interfaceRevisionId) + .sort(); + const interfaces = new Map(plan.definition.workspace.interfaceImports.map((i) => [String(i.revisionId), i])); + const result = new Set(); + const visit = (id: string) => { + if (result.has(id)) return; + result.add(id); + for (const dependency of interfaces.get(id)?.requiredInterfaces ?? []) visit(dependency); + }; + visit(expected.interfaceRevisionId); + return [...result].sort(); +} +/** Compile-time observeResult compatibility. Observation does not grant read or mutation authority. */ +export function checkResultProjection(plan: ExecutionPlan, operationKey: string, queryId: string): PlannedQuery { + if (hexDigest(plan.definition) !== plan.digest) + throw new ExecutionPlanError("INVALID_PLAN", "projection", "Plan digest mismatch"); + const query = plan.definition.queries.find((q) => q.id === queryId); + if (!query) throw new ExecutionPlanError("UNKNOWN_PROJECTION", queryId, "No installed query"); + const declaration = query.query.checked.declaration; + if (declaration.placement?.kind !== "replica" || declaration.root.kind !== "object") + throw new ExecutionPlanError( + "INVALID_RESULT_PROJECTION", + queryId, + "Result observation requires a direct-object replica declaration", + ); + if (!resultInterfaces(plan, operationKey).includes(declaration.root.interface)) + throw new ExecutionPlanError( + "RESULT_PROJECTION_MISMATCH", + operationKey, + `Result does not promise ${declaration.root.interface}`, + ); + return query; +} diff --git a/test/composite-fixture.ts b/test/composite-fixture.ts new file mode 100644 index 0000000..156d8aa --- /dev/null +++ b/test/composite-fixture.ts @@ -0,0 +1,57 @@ +import assert from "node:assert/strict"; +import { readFile } from "node:fs/promises"; +import { resolve } from "node:path"; +import { + compileCapabilityResourceSource, + compileCapabilitySource, + formatQx, +} from "../src/capability-language/index.js"; +import type { InterfaceRevision, PackageRevision } from "../src/capability-model/types.js"; +import { compileQuery } from "../src/query/compile.js"; +import { readReaderFixture } from "./reader-fixture.js"; +const directory = resolve("test/fixtures/local-first-composite"); +export async function loadCompositeWorkspace() { + const changed = new Set(["DocumentFactory", "DocumentMetadata", "CommentFactory"]); + const read = (name: string) => readFile(resolve(directory, `${name}.qx`), "utf8"); + const source = { repository: "https://example.test/composite.git", commit: "b".repeat(40) }; + const interfaces = new Map(); + for (const name of [ + "DocumentData", + "HighlightData", + "CommentData", + "DocumentActions", + "DocumentFactory", + "DocumentMetadata", + "CommentFactory", + ]) { + const result = compileCapabilityResourceSource( + formatQx(await (changed.has(name) ? read(name) : readReaderFixture(`${name}.qx`))), + { source }, + ); + assert.ok(result.ok && result.resource.kind === "interface", JSON.stringify(result.diagnostics)); + interfaces.set(name, result.resource.revision); + } + const environment = { interfaces, interfaceClosure: [...interfaces.values()] }, + packages = new Map(); + for (const name of ["ReaderRuntime", "CommentRuntime"]) { + const selected = + name === "CommentRuntime" ? new Map([["CommentData", interfaces.get("CommentData")!]]) : interfaces; + const result = compileCapabilityResourceSource(formatQx(await read(name)), { + source, + environment: { interfaces: selected, interfaceClosure: [...selected.values()] }, + }); + assert.ok(result.ok && result.resource.kind === "package", JSON.stringify(result.diagnostics)); + const revision = result.resource.revision; + revision.checkedQueries = await Promise.all( + (revision.queries ?? []).map((query) => compileQuery(query, [...interfaces.values()], readReaderFixture)), + ); + packages.set(name, revision); + } + const result = compileCapabilitySource(formatQx(await read("workspace")), "workspace.qx", { + ...environment, + packages, + packageClosure: [...packages.values()], + }); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + return result.workspace; +} diff --git a/test/emit-portable-reader.ts b/test/emit-portable-reader.ts index 33ffbab..4867172 100644 --- a/test/emit-portable-reader.ts +++ b/test/emit-portable-reader.ts @@ -4,6 +4,8 @@ import { loadReaderWorkspace } from "./reader-fixture.js"; import { compileKernelProgram } from "../src/execution-world/kernel.js"; import { compileExecutionPlan } from "../src/execution-world/plan.js"; import { generatePortableTypeScriptBindings } from "../src/bindings/portable.js"; +import { generatePortableClientBindings } from "../src/bindings/portable-client.js"; +import { loadCompositeWorkspace } from "./composite-fixture.js"; const plan = compileExecutionPlan(await loadReaderWorkspace()); await mkdir("dist/portable-reader", { recursive: true }); for (const target of ["browser", "server"]) @@ -13,6 +15,7 @@ for (const target of ["browser", "server"]) ); await writeFile("dist/portable-reader/plan.json", JSON.stringify(plan)); await writeFile("dist/portable-reader/kernel.json", JSON.stringify(compileKernelProgram(plan))); +await writeFile("dist/portable-reader/client.ts", generatePortableClientBindings(plan, { target: "browser" })); const serviceWorkspace = structuredClone(plan.definition.workspace); serviceWorkspace.atoms = []; serviceWorkspace.conformances = []; @@ -33,3 +36,16 @@ serviceWorkspace.packageImports[0]!.exports = [ }, ]; await writeFile("dist/portable-reader/service-plan.json", JSON.stringify(compileExecutionPlan(serviceWorkspace))); +const composite = compileExecutionPlan(await loadCompositeWorkspace()); +await mkdir("dist/portable-reader/composite", { recursive: true }); +await writeFile("dist/portable-reader/composite/plan.json", JSON.stringify(composite)); +await writeFile("dist/portable-reader/composite/kernel.json", JSON.stringify(compileKernelProgram(composite))); +for (const target of ["browser", "server"]) + for (const [name, revision] of [ + ["reader", "package:reader-runtime@1"], + ["comment", "package:comment-runtime@1"], + ] as const) + await writeFile( + `dist/portable-reader/composite/${name}-${target}.ts`, + generatePortableTypeScriptBindings(composite.definition.bindingSchema, revision, { target }), + ); diff --git a/test/fixtures/local-first-composite/CommentFactory.qx b/test/fixtures/local-first-composite/CommentFactory.qx new file mode 100644 index 0000000..12edd77 --- /dev/null +++ b/test/fixtures/local-first-composite/CommentFactory.qx @@ -0,0 +1,7 @@ +external atom Comment id "atom:reader:comment"; +interface CommentFactory id "interface:reader:comment-factory" +revision "interface:reader:comment-factory@1" { + operation prepareComment id "document:prepare-comment" : bool -> atom-ref { + call id "document:prepare-comment:call" execution transaction targets [browser, server]; + } +} diff --git a/test/fixtures/local-first-composite/CommentRuntime.qx b/test/fixtures/local-first-composite/CommentRuntime.qx new file mode 100644 index 0000000..3f12bf7 --- /dev/null +++ b/test/fixtures/local-first-composite/CommentRuntime.qx @@ -0,0 +1,11 @@ +external atom Document id "atom:reader:document"; +external atom Comment id "atom:reader:comment"; +import interface CommentData; +type CommentSeed = record { content: record { text: string; tags: list; }; }; +package CommentRuntime id "package:comment-runtime" revision "package:comment-runtime@1" { + operation prepareComment id "comment:prepare" + : bool -> atom-ref mode call execution transaction targets [browser, server] + receiver atom Document requires { + creation comment id "comment:prepare:comment" : Comment input CommentSeed; + }; +} diff --git a/test/fixtures/local-first-composite/DocumentFactory.qx b/test/fixtures/local-first-composite/DocumentFactory.qx new file mode 100644 index 0000000..f5e700c --- /dev/null +++ b/test/fixtures/local-first-composite/DocumentFactory.qx @@ -0,0 +1,25 @@ +// Shared record definitions, repeated explicitly in independently locked resources. +external atom Document id "atom:reader:document"; +external atom Highlight id "atom:reader:highlight"; +external atom Comment id "atom:reader:comment"; + +type SourceRange = record { + sourceRevision: string; + start: int32; + end: int32; +}; + +type CommentContent = record { + text: string; + tags: list; +}; + +type DocumentSeed = record { document: record { sourceRevision: string; content: string; }; metadata: record { label: string; }; }; + +interface DocumentFactory id "interface:reader:document-factory" +revision "interface:reader:document-factory@1" { + static operation create id "document:create" : DocumentSeed -> atom-ref { + call id "document:create:call" + execution transaction targets [browser, server]; + } +} diff --git a/test/fixtures/local-first-composite/DocumentMetadata.qx b/test/fixtures/local-first-composite/DocumentMetadata.qx new file mode 100644 index 0000000..fe1f648 --- /dev/null +++ b/test/fixtures/local-first-composite/DocumentMetadata.qx @@ -0,0 +1,6 @@ +interface DocumentMetadata id "interface:reader:document-metadata" +revision "interface:reader:document-metadata@1" { + queryable value label id "document:label" : string { + get id "document:label:get" execution snapshot targets [browser, server]; + } +} diff --git a/test/fixtures/local-first-composite/ReaderRuntime.qx b/test/fixtures/local-first-composite/ReaderRuntime.qx new file mode 100644 index 0000000..5b6fce9 --- /dev/null +++ b/test/fixtures/local-first-composite/ReaderRuntime.qx @@ -0,0 +1,84 @@ +// Shared record definitions, repeated explicitly in independently locked resources. +external atom Document id "atom:reader:document"; +external atom Highlight id "atom:reader:highlight"; +external atom Comment id "atom:reader:comment"; + +type SourceRange = record { + sourceRevision: string; + start: int32; + end: int32; +}; + +type CommentContent = record { + text: string; + tags: list; +}; + +type DocumentSeed = record { document: record { sourceRevision: string; content: string; }; metadata: record { label: string; }; }; + +import interface DocumentData; +import interface CommentFactory; +import interface HighlightData; +import interface CommentData; +type CommentSeed = record { content: CommentContent; }; +type HighlightSeed = record { + range: SourceRange; + comments: list; }>; +}; + +package ReaderRuntime id "package:reader-runtime" +revision "package:reader-runtime@1" { + operation addHighlight id "reader:add-highlight" + : SourceRange -> atom-ref + mode call execution transaction targets [browser, server] + receiver atom Document requires { + interface document id "reader:add:document" : DocumentData + using [sourceRevision.get, content.get, highlights.connect]; + creation highlight id "reader:add:highlight" : Highlight input HighlightSeed; + interface comments id "reader:add:comments" : CommentFactory using [prepareComment.call]; + }; + + operation excerpt id "reader:excerpt" : unit -> string + mode call execution snapshot targets [browser, server] + receiver atom Highlight requires { + state range id "reader:excerpt:range" : SourceRange [read]; + interface document id "reader:excerpt:document" : DocumentData + using [sourceRevision.get, content.get]; + }; + + // A receiverless function needs no synthetic service object. + function validateRange id "reader:validate-range" + : record { range: SourceRange; content: string; } -> bool + execution snapshot targets [browser, server]; + + function createDocument id "reader:create-document" + : DocumentSeed -> atom-ref + execution transaction targets [browser, server] requires { + creation document id "reader:create:document" : Document input DocumentSeed; + }; + query ReplicaInputs id "reader:replica-inputs" root DocumentData + document "queries/replica-inputs.graphql" operation "ReplicaInputs" { + replica; + view Highlight as HighlightData; + view Comment as CommentData; + max rows 5000; + max depth 8; + max result-bytes 8388608; + } + + query ReaderScreen id "reader:screen" root DocumentData + document "queries/reader-screen.graphql" operation "ReaderScreen" { + local from ReplicaInputs; + view Highlight as HighlightData; + view Comment as CommentData; + max rows 5000; + max depth 8; + max result-bytes 8388608; + watch; + } + + query HighlightScope id "reader:highlight-scope" root workspace HighlightData document "queries/highlight-scope.graphql" operation "HighlightScope" { view Comment as CommentData; replica; max rows 200; } + query HighlightList id "reader:highlight-list" root workspace HighlightData document "queries/highlight-list.graphql" operation "HighlightList" { view Comment as CommentData; local from HighlightScope; max rows 200; watch; } + query HighlightEditorInputs id "reader:editor-inputs" root HighlightData document "queries/editor-inputs.graphql" operation "HighlightEditorInputs" { view Comment as CommentData; replica; max rows 1; } + query HighlightEditorView id "reader:editor-view" root HighlightData document "queries/editor-view.graphql" operation "HighlightEditorView" { view Comment as CommentData; local from HighlightEditorInputs; max rows 1; watch; } +} diff --git a/test/fixtures/local-first-composite/workspace.qx b/test/fixtures/local-first-composite/workspace.qx new file mode 100644 index 0000000..af3eea3 --- /dev/null +++ b/test/fixtures/local-first-composite/workspace.qx @@ -0,0 +1,108 @@ +workspace Reader id "workspace:reader" revision "workspace:reader@1" commit "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" { + import interface DocumentData; + import interface HighlightData; + import interface CommentData; + import interface DocumentActions; + import interface DocumentFactory; + import package ReaderRuntime; + import package CommentRuntime; + import interface DocumentMetadata; + import interface CommentFactory; + // Shared record definitions, repeated explicitly in independently locked resources. + + type SourceRange = record { + sourceRevision: string; + start: int32; + end: int32; + }; + + type CommentContent = record { + text: string; + tags: list; + }; + + type DocumentSeed = record { sourceRevision: string; content: string; }; + + atom Document id "atom:reader:document"; + atom Highlight id "atom:reader:highlight"; + atom Comment id "atom:reader:comment"; + + conform Document as DocumentData id "conformance:reader:document-data" { + private state Revision id "slot:document:revision" + on Document : string policy register; + private state Content id "slot:document:content" + on Document : string policy register; + private edge DocumentHighlights id "edge:document-highlights" { + atom Document projection highlights id "projection:highlights" many-unique; + atom Highlight projection document id "projection:document" + exactly-one public-traversal; + } + initialize { + sourceRevision to state Revision; + content to state Content; + }; + bind sourceRevision.get to state Revision.read; + bind content.get to state Content.read; + bind highlights.resolve to edge DocumentHighlights.highlights.resolve; + bind highlights.connect to edge DocumentHighlights.highlights.connect; + } + + conform Document as DocumentActions id "conformance:reader:document-actions" { + + bind annotate.call to package ReaderRuntime.addHighlight with { + document to interface DocumentData; + highlight to creation Highlight with { HighlightData from input; }; + comments to interface CommentFactory; + }; + } + + conform Document as CommentFactory id "conformance:reader:comment-factory" { + bind prepareComment.call to package CommentRuntime.prepareComment with { + comment to creation Comment with { CommentData from input; }; + }; + } + + conform Document as DocumentMetadata id "conformance:reader:document-metadata" { + private state Label id "slot:document:label" on Document : string policy register; + initialize { label to state Label; }; + bind label.get to state Label.read; + } + + conform Document as DocumentFactory id "conformance:reader:document-factory" { + bind create.call to package ReaderRuntime.createDocument with { + document to creation Document with { DocumentData from input.document; DocumentMetadata from input.metadata; }; + }; + } + + conform Highlight as HighlightData id "conformance:reader:highlight-data" { + private state Range id "slot:highlight:range" + on Highlight : SourceRange policy register; + private state Color id "slot:highlight:color" + on Highlight : string policy register default "yellow"; + private edge HighlightComments id "edge:highlight-comments" { + atom Highlight projection comments id "projection:comments" many-unique; + atom Comment projection highlight id "projection:highlight" + exactly-one public-traversal; + } + initialize { + range to state Range; + comments to edge HighlightComments.comments; + }; + bind range.get to state Range.read; + bind color.get to state Color.read; + bind color.set to state Color.write; + bind comments.resolve to edge HighlightComments.comments.resolve; + bind excerpt.get to package ReaderRuntime.excerpt with { + range to state Range; + document to interface DocumentData via edge DocumentHighlights.document; + }; + } + + conform Comment as CommentData id "conformance:reader:comment-data" { + private state CommentBody id "slot:comment:content" + on Comment : CommentContent policy crdt(CommentContent); + initialize { content to state CommentBody; }; + bind content.get to state CommentBody.read; + bind content.edit to state CommentBody.edit; + } +} diff --git a/test/projection-compatibility.test.ts b/test/projection-compatibility.test.ts new file mode 100644 index 0000000..9a73e34 --- /dev/null +++ b/test/projection-compatibility.test.ts @@ -0,0 +1,29 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { loadReaderWorkspace } from "./reader-fixture.js"; +import { compileExecutionPlan, checkResultProjection, publicOperationKey } from "../src/execution-world/index.js"; +test("factory result observation checks direct replica roots against the result contract", async () => { + const plan = compileExecutionPlan(await loadReaderWorkspace()); + const query = (id: string) => JSON.stringify(["package:reader-runtime@1", id]); + const create = publicOperationKey( + "atom:reader:document", + "interface:reader:document-factory@1", + "document:create:call", + ); + const annotate = publicOperationKey( + "atom:reader:document", + "interface:reader:document-actions@1", + "document:annotate:call", + ); + assert.equal(checkResultProjection(plan, create, query("reader:replica-inputs")).id, query("reader:replica-inputs")); + assert.equal(checkResultProjection(plan, annotate, query("reader:editor-inputs")).id, query("reader:editor-inputs")); + assert.throws(() => checkResultProjection(plan, create, query("reader:editor-inputs")), { + code: "RESULT_PROJECTION_MISMATCH", + }); + assert.throws(() => checkResultProjection(plan, annotate, query("reader:highlight-scope")), { + code: "INVALID_RESULT_PROJECTION", + }); + assert.throws(() => checkResultProjection(plan, annotate, query("reader:editor-view")), { + code: "INVALID_RESULT_PROJECTION", + }); +}); diff --git a/yarn.lock b/yarn.lock index fb471a2..5ebe829 100644 --- a/yarn.lock +++ b/yarn.lock @@ -89,6 +89,7 @@ __metadata: typescript: "npm:^7.0.2" bin: quixos-capability-compile: dist/src/capability-language/cli.js + quixos-codegen-client: dist/src/bindings/portable-client-cli.js quixos-codegen-ts: dist/src/bindings/cli.js quixos-descriptor-check: dist/src/descriptor-check.js quixos-lock-check: dist/src/resource-lock/cli.js From 3f1976815f25358b6bc300ad648c86b0e2c17d28 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 20 Sep 2026 02:42:13 -0700 Subject: [PATCH 16/91] Compile and execute bounded GraphQL replica admission --- src/execution-world/index.ts | 1 + src/execution-world/queries.ts | 60 +++++++++++++++++++ test/emit-portable-reader.ts | 2 + .../local-first-reader/ReaderRuntime.qx | 1 + .../queries/highlight-window.graphql | 8 +++ test/local-first-reader.test.ts | 2 +- 6 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 src/execution-world/queries.ts create mode 100644 test/fixtures/local-first-reader/queries/highlight-window.graphql diff --git a/src/execution-world/index.ts b/src/execution-world/index.ts index 726a4ac..6e234bc 100644 --- a/src/execution-world/index.ts +++ b/src/execution-world/index.ts @@ -9,4 +9,5 @@ export { generatePortableTypeScriptBindings } from "../bindings/portable.js"; export * from "./kernel.js"; export * from "./projections.js"; +export * from "./queries.js"; export { generatePortableClientBindings } from "../bindings/portable-client.js"; diff --git a/src/execution-world/queries.ts b/src/execution-world/queries.ts new file mode 100644 index 0000000..c737b04 --- /dev/null +++ b/src/execution-world/queries.ts @@ -0,0 +1,60 @@ +import { portableValueSchema } from "../bindings/portable.js"; +import { ExecutionPlanError, hexDigest, type ExecutionPlan } from "./plan.js"; +import type { ValueType } from "../capability-model/types.js"; + +const lowerTypes = (value: unknown): unknown => + JSON.parse( + JSON.stringify(value, (key, value: unknown) => { + if ( + key === "type" && + value && + typeof value === "object" && + "kind" in value && + ["scalar", "builtin", "optional", "list", "record", "object-ref"].includes(String(value.kind)) + ) + return portableValueSchema(value as ValueType); + return value; + }), + ); + +/** Checked query IR and installed getter identities, without GraphQL schemas/parsers or SQL adapters. + * Keep authored selection names only for output paths; field access uses resolved interface/member IDs. */ +export function compileQueryProgram(plan: ExecutionPlan): unknown { + if (hexDigest(plan.definition) !== plan.digest) + throw new ExecutionPlanError("INVALID_PLAN", "queries", "Plan digest mismatch"); + const interfaces = plan.definition.workspace.interfaceImports; + return { + codec: "camino-query-program-v1", + plan: plan.digest, + queries: plan.definition.queries.map(({ id, query, admittedOperations }) => { + const checked = query.checked; + return { + id, + placement: checked.declaration.placement?.kind ?? "remote", + source: + checked.declaration.placement?.kind === "local" + ? JSON.stringify([query.packageRevisionId, checked.declaration.placement.sourceQueryId]) + : null, + root: checked.declaration.root, + atoms: query.rootAtoms, + variables: portableValueSchema(checked.variables), + defaults: checked.variableDefaults, + selection: lowerTypes(checked.selection), + budgets: checked.declaration.budgets, + fields: query.fields.map((field) => { + const member = interfaces + .find((i) => i.revisionId === field.interfaceRevisionId)! + .members.find((m) => m.id === field.memberId)!; + return { + atom: field.atomId, + interface: field.interfaceRevisionId, + member: field.memberId, + name: member.displayName, + operation: JSON.stringify([field.atomId, field.interfaceRevisionId, field.getter]), + }; + }), + admittedOperations, + }; + }), + }; +} diff --git a/test/emit-portable-reader.ts b/test/emit-portable-reader.ts index 4867172..f60e04b 100644 --- a/test/emit-portable-reader.ts +++ b/test/emit-portable-reader.ts @@ -2,6 +2,7 @@ import { mkdir, writeFile } from "node:fs/promises"; import { loadReaderWorkspace } from "./reader-fixture.js"; import { compileKernelProgram } from "../src/execution-world/kernel.js"; +import { compileQueryProgram } from "../src/execution-world/queries.js"; import { compileExecutionPlan } from "../src/execution-world/plan.js"; import { generatePortableTypeScriptBindings } from "../src/bindings/portable.js"; import { generatePortableClientBindings } from "../src/bindings/portable-client.js"; @@ -15,6 +16,7 @@ for (const target of ["browser", "server"]) ); await writeFile("dist/portable-reader/plan.json", JSON.stringify(plan)); await writeFile("dist/portable-reader/kernel.json", JSON.stringify(compileKernelProgram(plan))); +await writeFile("dist/portable-reader/queries.json", JSON.stringify(compileQueryProgram(plan))); await writeFile("dist/portable-reader/client.ts", generatePortableClientBindings(plan, { target: "browser" })); const serviceWorkspace = structuredClone(plan.definition.workspace); serviceWorkspace.atoms = []; diff --git a/test/fixtures/local-first-reader/ReaderRuntime.qx b/test/fixtures/local-first-reader/ReaderRuntime.qx index 629a3ef..9067cbb 100644 --- a/test/fixtures/local-first-reader/ReaderRuntime.qx +++ b/test/fixtures/local-first-reader/ReaderRuntime.qx @@ -77,6 +77,7 @@ revision "package:reader-runtime@1" { } query HighlightScope id "reader:highlight-scope" root workspace HighlightData document "queries/highlight-scope.graphql" operation "HighlightScope" { view Comment as CommentData; replica; max rows 200; } + query HighlightWindow id "reader:highlight-window" root workspace HighlightData document "queries/highlight-window.graphql" operation "HighlightWindow" { view Comment as CommentData; replica; max rows 200; } query HighlightList id "reader:highlight-list" root workspace HighlightData document "queries/highlight-list.graphql" operation "HighlightList" { view Comment as CommentData; local from HighlightScope; max rows 200; watch; } query HighlightEditorInputs id "reader:editor-inputs" root HighlightData document "queries/editor-inputs.graphql" operation "HighlightEditorInputs" { view Comment as CommentData; replica; max rows 1; } query HighlightEditorView id "reader:editor-view" root HighlightData document "queries/editor-view.graphql" operation "HighlightEditorView" { view Comment as CommentData; local from HighlightEditorInputs; max rows 1; watch; } diff --git a/test/fixtures/local-first-reader/queries/highlight-window.graphql b/test/fixtures/local-first-reader/queries/highlight-window.graphql new file mode 100644 index 0000000..b19d729 --- /dev/null +++ b/test/fixtures/local-first-reader/queries/highlight-window.graphql @@ -0,0 +1,8 @@ +query HighlightWindow($color: String!) { + root { + objects(first: 2, where: {color: {eq: $color}}, orderBy: {range: {start: ASC}}) { + entries { key node { _qx {ref} color range {sourceRevision start end} } } + pageInfo { hasNextPage endCursor } + } + } +} diff --git a/test/local-first-reader.test.ts b/test/local-first-reader.test.ts index 7ac3243..4c04d5f 100644 --- a/test/local-first-reader.test.ts +++ b/test/local-first-reader.test.ts @@ -8,7 +8,7 @@ test("complete reader contracts compose factories, portable selectors, CRDT edit assert.equal(workspace.constructors.length, 0); assert.equal(workspace.atoms.length, 3); const linked = linkQueries(workspace); - assert.equal(linked.length, 6); + assert.equal(linked.length, 7); assert.equal(linked.filter((q) => q.checked.declaration.placement?.kind === "local").length, 3); const screen = linked.find((q) => q.checked.declaration.displayName === "ReaderScreen")!; assert.ok(screen.fields.some((f) => f.memberId === "highlight:excerpt" && f.binding.kind === "package")); From c75888833bf5455cb4deb87173ba07f1ffd5a3ad Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 20 Sep 2026 03:44:49 -0700 Subject: [PATCH 17/91] Evaluate coherent local queries over explicit replica scopes --- src/bindings/portable-client.ts | 13 +++++++++++-- src/execution-world/plan.ts | 18 +++++++++++++++--- test/execution-world.test.ts | 9 +++++++++ .../local-first-reader/ReaderRuntime.qx | 1 + test/local-first-reader.test.ts | 6 +++--- 5 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/bindings/portable-client.ts b/src/bindings/portable-client.ts index b9be48e..a9d1aa3 100644 --- a/src/bindings/portable-client.ts +++ b/src/bindings/portable-client.ts @@ -49,13 +49,22 @@ export function generatePortableClientBindings( atoms.set(atom.displayName, list); } const queries = new Map(); + const views = new Map(); for (const query of plan.definition.queries) { const declaration = query.query.checked.declaration; - if (declaration.placement?.kind !== "replica") continue; + if (!declaration.placement) continue; const pkg = workspace.packageImports.find((p) => p.revisionId === query.query.packageRevisionId)!; const alias = JSON.stringify([pkg.displayName, declaration.displayName]); if (seen.has(`query:${alias}`)) throw new PortableBindingError(alias, "Ambiguous query alias"); seen.add(`query:${alias}`); + if (declaration.placement.kind === "local") { + const list = views.get(pkg.displayName) ?? []; + list.push( + `${JSON.stringify(declaration.displayName)}: ${JSON.stringify({ id: query.id, plan: plan.digest, source: JSON.stringify([query.query.packageRevisionId, declaration.placement.sourceQueryId]) })} as const satisfies LocalQueryDescriptor`, + ); + views.set(pkg.displayName, list); + continue; + } const list = queries.get(pkg.displayName) ?? []; list.push( `${JSON.stringify(declaration.displayName)}: { id: ${JSON.stringify(query.id)}, plan: ${JSON.stringify(plan.digest)}, root: ${JSON.stringify(declaration.root.interface)}, rootKind: ${JSON.stringify(declaration.root.kind)} } as const satisfies ReplicaProjection<${JSON.stringify(declaration.root.interface)}, ${JSON.stringify(declaration.root.kind)}>`, @@ -64,5 +73,5 @@ export function generatePortableClientBindings( } const groups = (entries: Map) => [...entries].map(([name, values]) => `${JSON.stringify(name)}: {${values.join(",\n")}}`).join(",\n"); - return `// Generated application descriptors. Regenerate; do not edit.\nimport { defineOperationDescriptor, type ManagedReference, type ReplicaProjection } from ${JSON.stringify(options.runtimeModule ?? "@quixos/camino-replica-core")};\nexport const planDigest = ${JSON.stringify(plan.digest)};\nexport const operations = {${groups(atoms)}} as const;\nexport const queries = {${groups(queries)}} as const;\nexport const unavailable = ${JSON.stringify(unavailable)} as const;\n`; + return `// Generated application descriptors. Regenerate; do not edit.\nimport { defineOperationDescriptor, type ManagedReference, type ReplicaProjection, type LocalQueryDescriptor } from ${JSON.stringify(options.runtimeModule ?? "@quixos/camino-replica-core")};\nexport const planDigest = ${JSON.stringify(plan.digest)};\nexport const operations = {${groups(atoms)}} as const;\nexport const queries = {${groups(queries)}} as const;\nexport const views = {${groups(views)}} as const;\nexport const unavailable = ${JSON.stringify(unavailable)} as const;\n`; } diff --git a/src/execution-world/plan.ts b/src/execution-world/plan.ts index f411da7..1372ee7 100644 --- a/src/execution-world/plan.ts +++ b/src/execution-world/plan.ts @@ -312,14 +312,19 @@ export function compileExecutionPlan(input: WorkspaceRevision): ExecutionPlan { "Local and replica queries must use the same root contract", ); const traversals = (linked: LinkedQuery) => { - const paths = new Set(); + const paths = new Map(); const visit = (selections: LinkedQuery["checked"]["selection"], parents: string[]) => { for (const selection of selections) { const member = selection.interfaceRevisionId ? interfaces.get(selection.interfaceRevisionId)?.members.find((m) => m.id === selection.memberId) : undefined; const path = member?.kind === "relationship" ? [...parents, member.id] : parents; - if (member?.kind === "relationship") paths.add(JSON.stringify(path)); + if (member?.kind === "relationship") { + const many = member.cardinality === "many" || member.cardinality === "many-unique"; + const complete = !selection.predicate && (!many || !!selection.arguments.all); + const key = JSON.stringify(path); + paths.set(key, complete || paths.get(key) === true); + } visit(selection.selection, path); } }; @@ -327,13 +332,20 @@ export function compileExecutionPlan(input: WorkspaceRevision): ExecutionPlan { return paths; }; const admittedTraversals = traversals(source.query); - for (const traversal of traversals(query.query)) + for (const traversal of traversals(query.query).keys()) { if (!admittedTraversals.has(traversal)) throw new ExecutionPlanError( "REPLICA_TRAVERSAL_MISSING", query.id, `Replica source does not admit relationship path ${traversal}`, ); + if (!admittedTraversals.get(traversal)) + throw new ExecutionPlanError( + "REPLICA_RELATION_INCOMPLETE", + query.id, + `Local relationship ${traversal} needs an unfiltered bounded all selection in its replica source; a filtered/windowed source cannot supply unseen matches`, + ); + } // The admission executor follows these canonical dependencies on the admitted roots. // They do not change source candidate membership or make local take/filters authoritative. source.admittedOperations.push(...query.operations); diff --git a/test/execution-world.test.ts b/test/execution-world.test.ts index 3b3afe0..a4ad112 100644 --- a/test/execution-world.test.ts +++ b/test/execution-world.test.ts @@ -173,6 +173,15 @@ test("local queries cannot silently expand the replica relationship traversal", assert.throws(() => compileExecutionPlan(workspace), /REPLICA_TRAVERSAL_MISSING/); }); +test("local relationships require complete source candidates even when a filter initially matches", async () => { + for (const selection of ["highlights(first: 10)", 'highlights(all: 1000, where: {color: {eq: "yellow"}})']) { + const workspace = await loadReaderWorkspace((name, text) => + name === "queries/replica-inputs.graphql" ? text.replace("highlights(all: 1000)", selection) : text, + ); + assert.throws(() => compileExecutionPlan(workspace), /REPLICA_RELATION_INCOMPLETE/); + } +}); + test("closed generic applications retain distinct identities and codec shapes", async () => { const { compileCapabilityResourceSource, compileCapabilitySource } = await import("../src/capability-language/index.js"); diff --git a/test/fixtures/local-first-reader/ReaderRuntime.qx b/test/fixtures/local-first-reader/ReaderRuntime.qx index 9067cbb..f31385b 100644 --- a/test/fixtures/local-first-reader/ReaderRuntime.qx +++ b/test/fixtures/local-first-reader/ReaderRuntime.qx @@ -79,6 +79,7 @@ revision "package:reader-runtime@1" { query HighlightScope id "reader:highlight-scope" root workspace HighlightData document "queries/highlight-scope.graphql" operation "HighlightScope" { view Comment as CommentData; replica; max rows 200; } query HighlightWindow id "reader:highlight-window" root workspace HighlightData document "queries/highlight-window.graphql" operation "HighlightWindow" { view Comment as CommentData; replica; max rows 200; } query HighlightList id "reader:highlight-list" root workspace HighlightData document "queries/highlight-list.graphql" operation "HighlightList" { view Comment as CommentData; local from HighlightScope; max rows 200; watch; } + query HighlightWindowList id "reader:highlight-window-list" root workspace HighlightData document "queries/highlight-list.graphql" operation "HighlightList" { view Comment as CommentData; local from HighlightWindow; max rows 200; watch; } query HighlightEditorInputs id "reader:editor-inputs" root HighlightData document "queries/editor-inputs.graphql" operation "HighlightEditorInputs" { view Comment as CommentData; replica; max rows 1; } query HighlightEditorView id "reader:editor-view" root HighlightData document "queries/editor-view.graphql" operation "HighlightEditorView" { view Comment as CommentData; local from HighlightEditorInputs; max rows 1; watch; } } diff --git a/test/local-first-reader.test.ts b/test/local-first-reader.test.ts index 4c04d5f..29b5b65 100644 --- a/test/local-first-reader.test.ts +++ b/test/local-first-reader.test.ts @@ -3,13 +3,13 @@ import { test } from "node:test"; import { compileQuery } from "../src/query/compile.js"; import { linkQueries } from "../src/query/link.js"; import { loadReaderWorkspace as load, readReaderFixture as read } from "./reader-fixture.js"; -test("complete reader contracts compose factories, portable selectors, CRDT edits, and six query scopes", async () => { +test("complete reader contracts compose factories, portable selectors, CRDT edits, and bounded query scopes", async () => { const workspace = await load(); assert.equal(workspace.constructors.length, 0); assert.equal(workspace.atoms.length, 3); const linked = linkQueries(workspace); - assert.equal(linked.length, 7); - assert.equal(linked.filter((q) => q.checked.declaration.placement?.kind === "local").length, 3); + assert.equal(linked.length, 8); + assert.equal(linked.filter((q) => q.checked.declaration.placement?.kind === "local").length, 4); const screen = linked.find((q) => q.checked.declaration.displayName === "ReaderScreen")!; assert.ok(screen.fields.some((f) => f.memberId === "highlight:excerpt" && f.binding.kind === "package")); assert.ok(screen.fields.some((f) => f.memberId === "comment:content" && f.binding.kind === "state")); From 824caddbf288f03ed6b34eb255b6d4ee67588f14 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 20 Sep 2026 04:04:39 -0700 Subject: [PATCH 18/91] Author and apply bounded structured CRDT edits through the mutation log --- src/bindings/portable-client.ts | 2 +- src/bindings/portable.ts | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/bindings/portable-client.ts b/src/bindings/portable-client.ts index a9d1aa3..8d9a4f5 100644 --- a/src/bindings/portable-client.ts +++ b/src/bindings/portable-client.ts @@ -73,5 +73,5 @@ export function generatePortableClientBindings( } const groups = (entries: Map) => [...entries].map(([name, values]) => `${JSON.stringify(name)}: {${values.join(",\n")}}`).join(",\n"); - return `// Generated application descriptors. Regenerate; do not edit.\nimport { defineOperationDescriptor, type ManagedReference, type ReplicaProjection, type LocalQueryDescriptor } from ${JSON.stringify(options.runtimeModule ?? "@quixos/camino-replica-core")};\nexport const planDigest = ${JSON.stringify(plan.digest)};\nexport const operations = {${groups(atoms)}} as const;\nexport const queries = {${groups(queries)}} as const;\nexport const views = {${groups(views)}} as const;\nexport const unavailable = ${JSON.stringify(unavailable)} as const;\n`; + return `// Generated application descriptors. Regenerate; do not edit.\nimport { defineOperationDescriptor, type PreparedChange, type ManagedReference, type ReplicaProjection, type LocalQueryDescriptor } from ${JSON.stringify(options.runtimeModule ?? "@quixos/camino-replica-core")};\nexport const planDigest = ${JSON.stringify(plan.digest)};\nexport const operations = {${groups(atoms)}} as const;\nexport const queries = {${groups(queries)}} as const;\nexport const views = {${groups(views)}} as const;\nexport const unavailable = ${JSON.stringify(unavailable)} as const;\n`; } diff --git a/src/bindings/portable.ts b/src/bindings/portable.ts index be5a90d..bb62c06 100644 --- a/src/bindings/portable.ts +++ b/src/bindings/portable.ts @@ -29,6 +29,16 @@ const expectation = (e: ObjectExpectation) => ({ /** The protocol IR and replica wire schema intentionally share structure, not reference identity. */ export function portableValueSchema(type: ValueType): unknown { switch (type.kind) { + case "change": + return { + kind: "record", + fields: { + codec: { kind: "scalar", name: "string" }, + profile: { kind: "scalar", name: "string" }, + generation: { kind: "scalar", name: "string" }, + changes: { kind: "list", value: { kind: "scalar", name: "bytes" } }, + }, + }; case "scalar": return type; case "builtin": @@ -55,6 +65,8 @@ export function portableValueSchema(type: ValueType): unknown { export function tsType(type: ValueType): string { portableValueSchema(type); switch (type.kind) { + case "change": + return `PreparedChange<${tsType(type.value)}>`; case "scalar": return type.name === "bool" ? "boolean" @@ -125,6 +137,10 @@ function methods(schema: BindingSchema, entry: PackageExport, port: DependencyPo writable(); return method("set", { kind: "state", primitive }, req.valueType, unit); } + if (primitive === "edit") { + writable(); + return method("edit", { kind: "state", primitive }, { kind: "change", value: req.valueType }, unit); + } throw new PortableBindingError(path, `State ${primitive} is not supported by this portable adapter yet`); }); case "edge": { @@ -248,5 +264,5 @@ export function generatePortableTypeScriptBindings( methods: all.map((m) => ({ ...m, input: portableValueSchema(m.input), output: portableValueSchema(m.output) })), }); } - return `// Generated portable bindings. Regenerate from the checked capability schema; do not edit.\nimport { definePortableRegistry, type PortableExport, type ManagedReference, type ExactReference, type MutationKey } from ${q(options.runtimeModule ?? "@quixos/camino-replica-core")};\nexport const bindingDigest = ${q(hexDigest(schema))};\nexport const packageRevision = ${q(revision)};\nexport const target = ${q(options.target)};\nexport type Contexts = { ${contexts.join(";\n")} };\nexport type PortableImplementation = { ${implementations.join(";\n")} };\nexport const declarations = ${JSON.stringify(descriptors, null, 2)} as const satisfies readonly PortableExport[];\nexport function createRegistry(handlers: PortableImplementation) { const installed = { ...handlers }; return definePortableRegistry(declarations, { ${adapters.join(",\n")} }); }\n`; + return `// Generated portable bindings. Regenerate from the checked capability schema; do not edit.\nimport { definePortableRegistry, type PortableExport, type PreparedChange, type ManagedReference, type ExactReference, type MutationKey } from ${q(options.runtimeModule ?? "@quixos/camino-replica-core")};\nexport const bindingDigest = ${q(hexDigest(schema))};\nexport const packageRevision = ${q(revision)};\nexport const target = ${q(options.target)};\nexport type Contexts = { ${contexts.join(";\n")} };\nexport type PortableImplementation = { ${implementations.join(";\n")} };\nexport const declarations = ${JSON.stringify(descriptors, null, 2)} as const satisfies readonly PortableExport[];\nexport function createRegistry(handlers: PortableImplementation) { const installed = { ...handlers }; return definePortableRegistry(declarations, { ${adapters.join(",\n")} }); }\n`; } From 74a16d36469bfec7d79bead98f79cb549025d67b Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 20 Sep 2026 04:55:18 -0700 Subject: [PATCH 19/91] Build the packaged local-first reader and cross-package task application --- src/bindings/portable-client.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/bindings/portable-client.ts b/src/bindings/portable-client.ts index 8d9a4f5..e6ee821 100644 --- a/src/bindings/portable-client.ts +++ b/src/bindings/portable-client.ts @@ -1,6 +1,9 @@ import { hexDigest, type ExecutionPlan } from "../execution-world/plan.js"; import { resultInterfaces } from "../execution-world/projections.js"; import { portableValueSchema, tsType, PortableBindingError } from "./portable.js"; +import type { QuerySelection } from "../query/types.js"; +const conditional = (selections: readonly QuerySelection[]): boolean => + selections.some((selection) => selection.conditions.length > 0 || conditional(selection.selection)); /** Closed-world app descriptors. Handler bindings and application acquisition share the same public identities. */ export function generatePortableClientBindings( plan: ExecutionPlan, @@ -50,6 +53,7 @@ export function generatePortableClientBindings( } const queries = new Map(); const views = new Map(); + const results = new Map(); for (const query of plan.definition.queries) { const declaration = query.query.checked.declaration; if (!declaration.placement) continue; @@ -63,6 +67,15 @@ export function generatePortableClientBindings( `${JSON.stringify(declaration.displayName)}: ${JSON.stringify({ id: query.id, plan: plan.digest, source: JSON.stringify([query.query.packageRevisionId, declaration.placement.sourceQueryId]) })} as const satisfies LocalQueryDescriptor`, ); views.set(pkg.displayName, list); + if (conditional(query.query.checked.selection)) { + unavailable.push({ key: query.id, reason: "CONDITIONAL_RESULT_DECODER_UNSUPPORTED" }); + continue; + } + const decoders = results.get(pkg.displayName) ?? []; + decoders.push( + `${JSON.stringify(declaration.displayName)}: (data: Json): ${tsType(query.query.checked.output)} => decodeArgument(${JSON.stringify(portableValueSchema(query.query.checked.output))}, { codec: "camino-value-v1", usage: "argument", value: data }, { workspace: workspaceId(${JSON.stringify(workspace.workspaceId)}), limits: { bytes: ${declaration.budgets.resultBytes + 128}, nodes: 100000, depth: 64 } }) as ${tsType(query.query.checked.output)}`, + ); + results.set(pkg.displayName, decoders); continue; } const list = queries.get(pkg.displayName) ?? []; @@ -73,5 +86,5 @@ export function generatePortableClientBindings( } const groups = (entries: Map) => [...entries].map(([name, values]) => `${JSON.stringify(name)}: {${values.join(",\n")}}`).join(",\n"); - return `// Generated application descriptors. Regenerate; do not edit.\nimport { defineOperationDescriptor, type PreparedChange, type ManagedReference, type ReplicaProjection, type LocalQueryDescriptor } from ${JSON.stringify(options.runtimeModule ?? "@quixos/camino-replica-core")};\nexport const planDigest = ${JSON.stringify(plan.digest)};\nexport const operations = {${groups(atoms)}} as const;\nexport const queries = {${groups(queries)}} as const;\nexport const views = {${groups(views)}} as const;\nexport const unavailable = ${JSON.stringify(unavailable)} as const;\n`; + return `// Generated application descriptors. Regenerate; do not edit.\nimport { defineOperationDescriptor, decodeArgument, workspaceId, type Json, type PreparedChange, type ManagedReference, type ReplicaProjection, type LocalQueryDescriptor } from ${JSON.stringify(options.runtimeModule ?? "@quixos/camino-replica-core")};\nexport const planDigest = ${JSON.stringify(plan.digest)};\nexport const operations = {${groups(atoms)}} as const;\nexport const queries = {${groups(queries)}} as const;\nexport const views = {${groups(views)}} as const;\nexport const results = {${groups(results)}} as const;\nexport const unavailable = ${JSON.stringify(unavailable)} as const;\n`; } From d701464312221e8aefdb2aa56b936b13e8db5e78 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 20 Sep 2026 19:42:24 -0700 Subject: [PATCH 20/91] Support checked closed generic portable bindings --- src/bindings/portable.ts | 9 +++---- src/execution-world/README.md | 10 ++++++++ test/emit-portable-reader.ts | 36 ++++++++++++++++++++++++++ test/portable-bindings.test.ts | 43 ++++++++++++++++++++++++++++++++ test/portable-generic-fixture.ts | 42 +++++++++++++++++++++++++++++++ 5 files changed, 135 insertions(+), 5 deletions(-) create mode 100644 test/portable-generic-fixture.ts diff --git a/src/bindings/portable.ts b/src/bindings/portable.ts index bb62c06..1bdd4b6 100644 --- a/src/bindings/portable.ts +++ b/src/bindings/portable.ts @@ -210,11 +210,10 @@ export function generatePortableTypeScriptBindings( adapters: string[] = [], descriptors: unknown[] = []; for (const entry of entries) { - if (entry.application || entry.kind === "constructor") - throw new PortableBindingError( - entry.id, - "Portable generic adapters/legacy constructors are not implemented; declare an ordinary factory", - ); + // The checked binding schema already contains concrete generic applications. + // Each has its own identity, value codecs and specialized dependency ports. + if (entry.kind === "constructor") + throw new PortableBindingError(entry.id, "Legacy constructors are not supported; declare an ordinary factory"); if (names.has(entry.displayName)) throw new PortableBindingError(entry.id, "Duplicate handler name"); names.add(entry.displayName); const portNames = new Set(); diff --git a/src/execution-world/README.md b/src/execution-world/README.md index 023933c..15f5b28 100644 --- a/src/execution-world/README.md +++ b/src/execution-world/README.md @@ -103,3 +103,13 @@ against both generated targets without casts. The root `camino-portable-bindings` qualification compares Node, Window, Worker and serialized-port behavior. Its simulated channel tests adapters, not installed operation acquisition or process isolation; those require the coordinator. + +Closed generic package applications use the same portable adapters. The checked +workspace specializes their input/output types and dependency ports before code +generation. Each application has its own export ID and generated handler name +(`name$`); handlers are concrete, so a string application +and a list-of-int64 application cannot accidentally share an untyped codec. +Common implementation helpers can still be ordinary generic TypeScript functions. +This does not implement universal runtime type application or legacy constructors. +The `camino-portable-bindings` check compiles positive/negative typed consumers and +executes both specializations in Node, Chromium Window, and Worker hosts. diff --git a/test/emit-portable-reader.ts b/test/emit-portable-reader.ts index f60e04b..2e92d9c 100644 --- a/test/emit-portable-reader.ts +++ b/test/emit-portable-reader.ts @@ -51,3 +51,39 @@ for (const target of ["browser", "server"]) `dist/portable-reader/composite/${name}-${target}.ts`, generatePortableTypeScriptBindings(composite.definition.bindingSchema, revision, { target }), ); + +const { portableGenericPlan } = await import("./portable-generic-fixture.js"); +const generic = portableGenericPlan(); +const genericPackage = generic.definition.bindingSchema.packages[0]!; +await mkdir("dist/portable-reader/generic", { recursive: true }); +for (const target of ["browser", "server"]) { + await writeFile( + `dist/portable-reader/generic/${target}.ts`, + generatePortableTypeScriptBindings(generic.definition.bindingSchema, genericPackage.revisionId, { target }), + ); +} +const stringEntry = genericPackage.exports.find((e) => e.inputType.kind === "scalar")!; +const listEntry = genericPackage.exports.find((e) => e.inputType.kind === "list")!; +await writeFile( + "dist/portable-reader/generic/implementation.ts", + ` +import { createRegistry, type PortableImplementation } from "./gen/qx.js"; +export const registry = createRegistry({ + ${JSON.stringify(stringEntry.displayName)}: context => context.input.toUpperCase(), + ${JSON.stringify(listEntry.displayName)}: context => context.input.map(value => value + 1n), +}); +// The specialization must retain its actual contract, not become unknown or any. +const negative: PortableImplementation = { + // @ts-expect-error a string specialization cannot return a number + ${JSON.stringify(stringEntry.displayName)}: context => context.input.length, + ${JSON.stringify(listEntry.displayName)}: context => { + // @ts-expect-error input collections are read-only + context.input.push(0n); + // @ts-expect-error integer values are exact bigint, not number + const lostPrecision: number = context.input[0]!; + return context.input; + }, +}; +void negative; +`, +); diff --git a/test/portable-bindings.test.ts b/test/portable-bindings.test.ts index 5265972..4373227 100644 --- a/test/portable-bindings.test.ts +++ b/test/portable-bindings.test.ts @@ -36,3 +36,46 @@ test("generation rejects remote dependencies, wrong effects and unsupported shap entry.dependencyPorts[0]!.requirement = { kind: "reflection", selectors: ["active"] }; assert.throws(generate, /Unsupported reflection port/); }); + +test("closed generic portable handlers have distinct concrete codecs and no universal casts", async () => { + const { portableGenericPlan } = await import("./portable-generic-fixture.js"); + const plan = portableGenericPlan(); + const schema = plan.definition.bindingSchema; + const pkg = schema.packages[0]!; + assert.equal(pkg.exports.length, 2); + const generated = generatePortableTypeScriptBindings(schema, pkg.revisionId, { target: "browser" }); + assert.match(generated, /readonly input: string/); + assert.match(generated, /readonly input: ReadonlyArray/); + for (const entry of pkg.exports) { + assert.ok(entry.application); + assert.ok(generated.includes(JSON.stringify(entry.id))); + assert.ok(generated.includes(JSON.stringify(entry.displayName))); + } + assert.notEqual(pkg.exports[0]!.displayName, pkg.exports[1]!.displayName); + assert.equal( + generated.replace('target = "browser"', 'target = "server"'), + generatePortableTypeScriptBindings(schema, pkg.revisionId, { target: "server" }), + ); +}); + +test("a portable subset of a mixed interface excludes remote dependencies", async () => { + const schema = compileExecutionPlan(await loadReaderWorkspace()).definition.bindingSchema; + const entry = schema.packages.flatMap((p) => p.exports).find((e) => e.displayName === "addHighlight")!; + const iface = schema.interfaces.find((i) => i.revisionId === "interface:reader:document-data@1")!; + const selected = entry.dependencyPorts.find((p) => p.requirement.kind === "interface")!.requirement; + assert.equal(selected.kind, "interface"); + if (selected.kind !== "interface") throw Error("interface required"); + const operation = structuredClone(iface.members[0]!.operations[0]!); + operation.id = "document:remote:get" as typeof operation.id; + operation.execution = { kind: "remote" }; + iface.members.push({ + ...structuredClone(iface.members[0]!), + id: "document:remote" as (typeof iface.members)[0]["id"], + displayName: "remote", + operations: [operation], + }); + const generate = () => generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", { target: "browser" }); + assert.doesNotMatch(generate(), /readonly "remote.get"/); + selected.operations!.push(operation.id); + assert.throws(generate, /select a portable subset/); +}); diff --git a/test/portable-generic-fixture.ts b/test/portable-generic-fixture.ts new file mode 100644 index 0000000..e358515 --- /dev/null +++ b/test/portable-generic-fixture.ts @@ -0,0 +1,42 @@ +import assert from "node:assert/strict"; +import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/parser.js"; +import { compileExecutionPlan } from "../src/execution-world/plan.js"; + +/** Independently versioned generic interface and implementation, closed by a workspace. */ +export function portableGenericPlan() { + const source = { repository: "https://example.test/portable-generics.git", commit: "a".repeat(40) }; + const iface = compileCapabilityResourceSource( + ` + interface Echo id "echo-interface" revision "echo-interface@2" { + operation echo id "echo-member" : T -> T { + call id "echo-call" execution snapshot targets [browser, server]; + } + }`, + { source }, + ); + assert.ok(iface.ok && iface.resource.kind === "interface", JSON.stringify(iface.diagnostics)); + const pkg = compileCapabilityResourceSource( + ` + package Generic id "generic" revision "generic@3" { + operation echo id "echo" : T -> T mode call + execution snapshot targets [browser, server] receiver any; + }`, + { source: { ...source, commit: "b".repeat(40) } }, + ); + assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); + const workspace = compileCapabilitySource( + ` + workspace W id "w" revision "w@1" commit "${source.commit}" { + import interface Echo; import package Generic; atom Thing id "thing"; + conform Thing as Echo id "string-echo" { bind echo.call to package Generic.echo; } + conform Thing as Echo> id "list-echo" { bind echo.call to package Generic.echo>; } + }`, + "workspace.qx", + { + interfaces: new Map([["Echo", iface.resource.revision]]), + packages: new Map([["Generic", pkg.resource.revision]]), + }, + ); + assert.ok(workspace.ok, JSON.stringify(workspace.diagnostics)); + return compileExecutionPlan(workspace.workspace); +} From 619b3d61c79a73c348782953e4fd2ee903b650dc Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 20 Sep 2026 19:48:30 -0700 Subject: [PATCH 21/91] Select checked implementations explicitly by target and ABI --- src/execution-world/README.md | 26 ++++++++++++++++++++++++++ src/execution-world/artifacts.ts | 29 +++++++++++++++++++++++++++++ test/execution-world.test.ts | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+) diff --git a/src/execution-world/README.md b/src/execution-world/README.md index 15f5b28..740aaa0 100644 --- a/src/execution-world/README.md +++ b/src/execution-world/README.md @@ -113,3 +113,29 @@ Common implementation helpers can still be ordinary generic TypeScript functions This does not implement universal runtime type application or legacy constructors. The `camino-portable-bindings` check compiles positive/negative typed consumers and executes both specializations in Node, Chromium Window, and Worker hosts. + +Use `selectArtifactImplementation(checkedManifest, selection)` to choose an +implementation by target, ABI, required export IDs, and optionally its exact ID. +Without an ID, exactly one candidate must match. Missing exports, wrong targets, +and ambiguous choices fail; manifest order never determines execution. This +selects already checked bytes and does not grant permission to run untrusted +package code in process. Multiple selected implementations remain part of the +same checked world's complete artifact inventory. + +```ts +const implementation = selectArtifactImplementation(manifest, { + target: "server", + compatibility: "quixos-service-v1", + id: "isolated-service", + exports: requiredExports, +}); +``` + +Consumers use the selected entrypoint, registry export and export coverage from +that manifest. The reader's Nix builder accepts per-package +`implementationSelection = { "package:reader-runtime@1" = { + browser = "browser-module"; server = "server-module"; service = "service"; +}; };` overrides. Its fixture requires one implementation per lane covering that +lane's needed exports; the selector itself permits a smaller requested subset. +The installation records the chosen service and module entries. Process lifecycle +and trusted-module placement still belong to the existing runner. diff --git a/src/execution-world/artifacts.ts b/src/execution-world/artifacts.ts index 87b8a73..fc0862d 100644 --- a/src/execution-world/artifacts.ts +++ b/src/execution-world/artifacts.ts @@ -28,6 +28,35 @@ export interface PackageArtifacts { versions: ExecutionPlan["definition"]["versions"]; implementations: ArtifactImplementation[]; } +export interface ImplementationSelection { + target: string; + compatibility: ArtifactImplementation["compatibility"]; + /** Optional only when exactly one compatible implementation covers these exports. */ + id?: string; + exports: readonly string[]; +} +/** Select from a checked manifest; selection does not establish package trust or isolation. + * Never resolve ambiguity by manifest order or silently substitute a requested implementation. + */ +export function selectArtifactImplementation( + manifest: PackageArtifacts, + selection: ImplementationSelection, +): ArtifactImplementation { + const candidates = manifest.implementations.filter( + (entry) => + (selection.id === undefined || entry.id === selection.id) && + entry.target === selection.target && + entry.compatibility === selection.compatibility && + selection.exports.every((id) => entry.exports.includes(id)), + ); + if (candidates.length !== 1) + throw new ExecutionPlanError( + candidates.length ? "AMBIGUOUS_IMPLEMENTATION" : "IMPLEMENTATION_UNAVAILABLE", + manifest.packageRevisionId, + `${selection.id ?? "Select an explicit implementation ID"}: expected one ${selection.target}/${selection.compatibility} implementation covering the requested exports; found ${candidates.length}`, + ); + return candidates[0]!; +} export interface CheckedWorld { codec: "camino-world-v1"; plan: string; diff --git a/test/execution-world.test.ts b/test/execution-world.test.ts index a4ad112..c22dee2 100644 --- a/test/execution-world.test.ts +++ b/test/execution-world.test.ts @@ -252,3 +252,35 @@ test("query dependencies propagate target requirements through selected getters" field.operations.find((o) => o.displayName === "get")!.execution = { kind: "snapshot", targets: ["browser"] }; assert.throws(() => compileExecutionPlan(workspace), /MISSING_EXECUTION_TARGET.*test:selector-query.*server/); }); + +test("implementation selection is explicit, target checked and independent of manifest order", async () => { + const { selectArtifactImplementation } = await import("../src/execution-world/index.js"); + const plan = compileExecutionPlan(await loadReaderWorkspace()); + const { manifest, read } = buildFixture(plan); + const selection = { + target: "browser", + compatibility: "quixos-js-module-v1" as const, + exports: [manifest.implementations[0]!.exports[0]!], + }; + assert.equal(selectArtifactImplementation(manifest, selection).id, "browser"); + const alternative = structuredClone(manifest.implementations.find((i) => i.id === "browser")!); + alternative.id = "browser-alternative"; + resign(alternative); + manifest.implementations.unshift(alternative); + await checkExecutionWorld(plan, [manifest], read); + assert.throws(() => selectArtifactImplementation(manifest, selection), /AMBIGUOUS_IMPLEMENTATION/); + assert.equal(selectArtifactImplementation(manifest, { ...selection, id: alternative.id }).id, alternative.id); + manifest.implementations.reverse(); + assert.equal(selectArtifactImplementation(manifest, { ...selection, id: alternative.id }).id, alternative.id); + for (const invalid of [ + { ...selection, id: "missing" }, + { ...selection, id: "service" }, + { ...selection, id: alternative.id, target: "arduino" }, + { ...selection, id: alternative.id, exports: ["not-exported"] }, + ]) + assert.throws(() => selectArtifactImplementation(manifest, invalid), /IMPLEMENTATION_UNAVAILABLE/); + assert.equal( + selectArtifactImplementation(manifest, { ...selection, target: "server", compatibility: "quixos-service-v1" }).id, + "service", + ); +}); From 21502ed023b17a5dce2078a97a642da287bc76f9 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 20 Sep 2026 19:52:37 -0700 Subject: [PATCH 22/91] Qualify read-only forwarding and scoped portable discovery --- test/composite-fixture.ts | 3 ++- test/fixtures/local-first-composite/DocumentLabel.qx | 6 ++++++ test/fixtures/local-first-composite/workspace.qx | 5 +++++ 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/local-first-composite/DocumentLabel.qx diff --git a/test/composite-fixture.ts b/test/composite-fixture.ts index 156d8aa..f60412c 100644 --- a/test/composite-fixture.ts +++ b/test/composite-fixture.ts @@ -11,7 +11,7 @@ import { compileQuery } from "../src/query/compile.js"; import { readReaderFixture } from "./reader-fixture.js"; const directory = resolve("test/fixtures/local-first-composite"); export async function loadCompositeWorkspace() { - const changed = new Set(["DocumentFactory", "DocumentMetadata", "CommentFactory"]); + const changed = new Set(["DocumentFactory", "DocumentMetadata", "DocumentLabel", "CommentFactory"]); const read = (name: string) => readFile(resolve(directory, `${name}.qx`), "utf8"); const source = { repository: "https://example.test/composite.git", commit: "b".repeat(40) }; const interfaces = new Map(); @@ -22,6 +22,7 @@ export async function loadCompositeWorkspace() { "DocumentActions", "DocumentFactory", "DocumentMetadata", + "DocumentLabel", "CommentFactory", ]) { const result = compileCapabilityResourceSource( diff --git a/test/fixtures/local-first-composite/DocumentLabel.qx b/test/fixtures/local-first-composite/DocumentLabel.qx new file mode 100644 index 0000000..dc1649a --- /dev/null +++ b/test/fixtures/local-first-composite/DocumentLabel.qx @@ -0,0 +1,6 @@ +interface DocumentLabel id "interface:reader:document-label" +revision "interface:reader:document-label@1" { + queryable value title id "document:view-title" : string { + get id "document:view-title:get" execution snapshot targets [browser, server]; + } +} diff --git a/test/fixtures/local-first-composite/workspace.qx b/test/fixtures/local-first-composite/workspace.qx index af3eea3..62e7a44 100644 --- a/test/fixtures/local-first-composite/workspace.qx +++ b/test/fixtures/local-first-composite/workspace.qx @@ -7,6 +7,7 @@ workspace Reader id "workspace:reader" revision "workspace:reader@1" commit "aaa import package ReaderRuntime; import package CommentRuntime; import interface DocumentMetadata; + import interface DocumentLabel; import interface CommentFactory; // Shared record definitions, repeated explicitly in independently locked resources. @@ -62,6 +63,10 @@ workspace Reader id "workspace:reader" revision "workspace:reader@1" commit "aaa }; } + conform Document as DocumentLabel id "conformance:reader:document-label" { + bind title.get to interface DocumentMetadata.label.get; + } + conform Document as DocumentMetadata id "conformance:reader:document-metadata" { private state Label id "slot:document:label" on Document : string policy register; initialize { label to state Label; }; From c4ae58831daecf60fa407a3514b00dd89c9a2bd8 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 20 Sep 2026 20:20:47 -0700 Subject: [PATCH 23/91] Generate typed asynchronous service capability bindings --- src/bindings/cli.ts | 29 +++++++---- src/bindings/index.ts | 1 + src/bindings/portable.ts | 48 ++++++++++++++----- src/execution-world/index.ts | 2 +- test/async-fixture.ts | 25 ++++++++++ test/emit-portable-reader.ts | 15 ++++++ .../async-objects/ControllerRuntime.qx | 10 ++++ test/fixtures/async-objects/DocumentData.qx | 10 ++++ .../fixtures/async-objects/ProviderRuntime.qx | 5 ++ test/fixtures/async-objects/Summarizer.qx | 5 ++ .../async-objects/SummaryController.qx | 5 ++ test/fixtures/async-objects/workspace.qx | 31 ++++++++++++ test/remote-bindings.test.ts | 27 +++++++++++ 13 files changed, 192 insertions(+), 21 deletions(-) create mode 100644 test/async-fixture.ts create mode 100644 test/fixtures/async-objects/ControllerRuntime.qx create mode 100644 test/fixtures/async-objects/DocumentData.qx create mode 100644 test/fixtures/async-objects/ProviderRuntime.qx create mode 100644 test/fixtures/async-objects/Summarizer.qx create mode 100644 test/fixtures/async-objects/SummaryController.qx create mode 100644 test/fixtures/async-objects/workspace.qx create mode 100644 test/remote-bindings.test.ts diff --git a/src/bindings/cli.ts b/src/bindings/cli.ts index 2febad9..322c9de 100644 --- a/src/bindings/cli.ts +++ b/src/bindings/cli.ts @@ -1,6 +1,10 @@ #!/usr/bin/env node import { readFile, writeFile } from "node:fs/promises"; -import { generateTypeScriptBindings, generatePortableTypeScriptBindings } from "./index.js"; +import { + generateTypeScriptBindings, + generatePortableTypeScriptBindings, + generateRemoteTypeScriptBindings, +} from "./index.js"; import path from "node:path"; import { reactPlatformTypes } from "./react-platform.js"; import { generateReactBindings } from "./react.js"; @@ -11,16 +15,23 @@ const main = async () => { throw new Error("usage: quixos-codegen-ts SCHEMA.json PACKAGE_REVISION OUTPUT.ts [OPTIONS.json]"); const config = options ? JSON.parse(await readFile(options, "utf8")) : {}; const contracts = JSON.parse(await readFile(schema, "utf8")); - if (config.portable && config.react) - throw new Error("Portable handlers and React component bindings are separate artifacts"); + if ([config.portable, config.remote, config.react].filter(Boolean).length > 1) + throw new Error("Portable, remote and React bindings are separate artifacts"); + if (config.remote !== undefined && config.remote !== true) throw new Error("Remote binding mode must be true"); if (config.portable && typeof config.portable.target !== "string") throw new Error("Portable bindings require an explicit target"); - const generated = config.portable - ? generatePortableTypeScriptBindings(contracts, revision, { - ...config.portable, - ...(config.runtimeModule ? { runtimeModule: config.runtimeModule } : {}), - }) - : generateTypeScriptBindings(contracts, revision, config); + const generated = config.remote + ? generateRemoteTypeScriptBindings( + contracts, + revision, + config.runtimeModule ? { runtimeModule: config.runtimeModule } : {}, + ) + : config.portable + ? generatePortableTypeScriptBindings(contracts, revision, { + ...config.portable, + ...(config.runtimeModule ? { runtimeModule: config.runtimeModule } : {}), + }) + : generateTypeScriptBindings(contracts, revision, config); await writeFile(output, generated); if (config.react) { await writeFile(path.join(path.dirname(output), "web-studio-react-runtime.d.ts"), reactPlatformTypes); diff --git a/src/bindings/index.ts b/src/bindings/index.ts index 56d0ae1..8290516 100644 --- a/src/bindings/index.ts +++ b/src/bindings/index.ts @@ -424,6 +424,7 @@ export const generateTypeScriptBindings = ( export { generatePortableTypeScriptBindings, + generateRemoteTypeScriptBindings, portableValueSchema, PortableBindingError, type PortableBindingOptions, diff --git a/src/bindings/portable.ts b/src/bindings/portable.ts index 1bdd4b6..f6ea42d 100644 --- a/src/bindings/portable.ts +++ b/src/bindings/portable.ts @@ -104,7 +104,13 @@ interface Method { output: ValueType; keyed: boolean; } -function methods(schema: BindingSchema, entry: PackageExport, port: DependencyPort, target: string): Method[] { +function methods( + schema: BindingSchema, + entry: PackageExport, + port: DependencyPort, + target: string, + remote = false, +): Method[] { const req = port.requirement; const path = `${entry.displayName}.ports.${port.displayName}`; const method = ( @@ -115,6 +121,8 @@ function methods(schema: BindingSchema, entry: PackageExport, port: DependencyPo keyed = false, ): Method => ({ name, portId: port.id, portName: port.displayName, action, input, output, keyed }); const writable = () => { + if (remote) + throw new PortableBindingError(path, "Remote writes and creation require a named transaction capability"); if (entry.execution?.kind !== "transaction") throw new PortableBindingError(path, "Snapshot context cannot expose mutation ports"); }; @@ -166,8 +174,7 @@ function methods(schema: BindingSchema, entry: PackageExport, port: DependencyPo .map(({ member, op }) => { const execution: ExecutionContract = op.execution ?? { kind: "remote" }; if ( - execution.kind === "remote" || - !execution.targets.includes(target) || + (execution.kind === "remote" ? !remote : !execution.targets.includes(target)) || op.mode !== "call" || op.scope === "class" ) @@ -175,7 +182,7 @@ function methods(schema: BindingSchema, entry: PackageExport, port: DependencyPo `${path}.${member.displayName}.${op.displayName}`, `Selected operation is not an object call available in portable target ${target}; select a portable subset or move this handler to remote execution`, ); - if (execution.kind === "transaction") writable(); + if (execution.kind === "transaction" && !remote) writable(); return method( `${member.displayName}.${op.displayName}`, { kind: "interface", operationId: op.id }, @@ -199,10 +206,28 @@ export function generatePortableTypeScriptBindings( revision: string, options: PortableBindingOptions, ): string { + return generateBindings(schema, revision, options, false); +} +export function generateRemoteTypeScriptBindings( + schema: BindingSchema, + revision: string, + options: { runtimeModule?: string } = {}, +): string { + return generateBindings(schema, revision, { ...options, target: "server" }, true); +} +function generateBindings( + schema: BindingSchema, + revision: string, + options: PortableBindingOptions, + remote: boolean, +): string { + const mode = remote ? "Remote" : "Portable"; const pkg = schema.packages.find((p) => p.revisionId === revision); if (!pkg) throw new PortableBindingError(revision, "Missing package"); - const entries = pkg.exports.filter( - (e) => e.execution && e.execution.kind !== "remote" && e.execution.targets.includes(options.target), + const entries = pkg.exports.filter((e) => + remote + ? !e.execution || e.execution.kind === "remote" + : e.execution && e.execution.kind !== "remote" && e.execution.targets.includes(options.target), ); const names = new Set(); const contexts: string[] = [], @@ -210,6 +235,7 @@ export function generatePortableTypeScriptBindings( adapters: string[] = [], descriptors: unknown[] = []; for (const entry of entries) { + const effect = entry.execution?.kind ?? "remote"; // The checked binding schema already contains concrete generic applications. // Each has its own identity, value codecs and specialized dependency ports. if (entry.kind === "constructor") @@ -223,12 +249,12 @@ export function generatePortableTypeScriptBindings( if (portNames.has(port.displayName)) throw new PortableBindingError(entry.id, `Duplicate port name ${port.displayName}`); portNames.add(port.displayName); - const selected = methods(schema, entry, port, options.target); + const selected = methods(schema, entry, port, options.target, remote); if (new Set(selected.map((m) => m.name)).size !== selected.length) throw new PortableBindingError(port.id, "Duplicate method name"); all.push(...selected); facets.push( - `readonly ${q(port.displayName)}: { ${selected.map((m) => `readonly ${q(m.name)}: (${[...(isUnit(m.input) ? [] : [`input: ${tsType(m.input)}`]), ...(m.keyed ? ["options: MutationKey"] : [])].join(", ")}) => Promise<${tsType(m.output)}>`).join("; ")} }`, + `readonly ${q(port.displayName)}: { ${selected.map((m) => `readonly ${q(m.name)}: (${[...(isUnit(m.input) ? [] : [`input: ${tsType(m.input)}`]), ...(m.keyed ? [remote ? "options: ServerMutationOptions" : "options: MutationKey"] : [])].join(", ")}) => Promise<${tsType(m.output)}>`).join("; ")} }`, ); } const receiver = @@ -244,7 +270,7 @@ export function generatePortableTypeScriptBindings( ? "ExactReference" : `ManagedReference<"atom", ${q(receiver.id)}>`; contexts.push( - `readonly ${q(entry.displayName)}: { readonly effect: ${q(entry.execution!.kind)}; readonly input: ${tsType(entry.inputType)}; readonly receiver: ${receiverType}; readonly ports: { ${facets.join("; ")} } }`, + `readonly ${q(entry.displayName)}: { readonly effect: ${q(effect)}; ${remote ? "readonly signal: AbortSignal;" : ""} readonly input: ${tsType(entry.inputType)}; readonly receiver: ${receiverType}; readonly ports: { ${facets.join("; ")} } }`, ); const output = tsType(entry.outputType); implementations.push( @@ -256,12 +282,12 @@ export function generatePortableTypeScriptBindings( descriptors.push({ id: entry.id, name: entry.displayName, - effect: entry.execution!.kind, + effect, receiver, input: portableValueSchema(entry.inputType), output: portableValueSchema(entry.outputType), methods: all.map((m) => ({ ...m, input: portableValueSchema(m.input), output: portableValueSchema(m.output) })), }); } - return `// Generated portable bindings. Regenerate from the checked capability schema; do not edit.\nimport { definePortableRegistry, type PortableExport, type PreparedChange, type ManagedReference, type ExactReference, type MutationKey } from ${q(options.runtimeModule ?? "@quixos/camino-replica-core")};\nexport const bindingDigest = ${q(hexDigest(schema))};\nexport const packageRevision = ${q(revision)};\nexport const target = ${q(options.target)};\nexport type Contexts = { ${contexts.join(";\n")} };\nexport type PortableImplementation = { ${implementations.join(";\n")} };\nexport const declarations = ${JSON.stringify(descriptors, null, 2)} as const satisfies readonly PortableExport[];\nexport function createRegistry(handlers: PortableImplementation) { const installed = { ...handlers }; return definePortableRegistry(declarations, { ${adapters.join(",\n")} }); }\n`; + return `// Generated ${remote ? "remote" : "portable"} bindings. Regenerate from the checked capability schema; do not edit.\nimport { define${mode}Registry, type ${mode}Export, type PreparedChange, type ManagedReference, type ExactReference, type ${remote ? "ServerMutationOptions" : "MutationKey"} } from ${q(options.runtimeModule ?? "@quixos/camino-replica-core")};\nexport const bindingDigest = ${q(hexDigest(schema))};\nexport const packageRevision = ${q(revision)};\nexport const target = ${q(options.target)};\nexport type Contexts = { ${contexts.join(";\n")} };\nexport type ${mode}Implementation = { ${implementations.join(";\n")} };\nexport const declarations = ${JSON.stringify(descriptors, null, 2)} as const satisfies readonly ${mode}Export[];\nexport function createRegistry(handlers: ${mode}Implementation) { const installed = { ...handlers }; return define${mode}Registry(declarations, { ${adapters.join(",\n")} }); }\n`; } diff --git a/src/execution-world/index.ts b/src/execution-world/index.ts index 6e234bc..1bd02b3 100644 --- a/src/execution-world/index.ts +++ b/src/execution-world/index.ts @@ -5,7 +5,7 @@ export * from "./files.js"; export * from "./receipts.js"; -export { generatePortableTypeScriptBindings } from "../bindings/portable.js"; +export { generatePortableTypeScriptBindings, generateRemoteTypeScriptBindings } from "../bindings/portable.js"; export * from "./kernel.js"; export * from "./projections.js"; diff --git a/test/async-fixture.ts b/test/async-fixture.ts new file mode 100644 index 0000000..54e594e --- /dev/null +++ b/test/async-fixture.ts @@ -0,0 +1,25 @@ +import assert from "node:assert/strict"; +import { readFile } from "node:fs/promises"; +import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/parser.js"; +import { compileExecutionPlan } from "../src/execution-world/plan.js"; +import type { InterfaceRevision, PackageRevision } from "../src/capability-model/types.js"; +export async function asyncObjectPlan() { + const read = (name: string) => readFile(`test/fixtures/async-objects/${name}.qx`, "utf8"); + const source = { repository: "https://example.test/async.git", commit: "a".repeat(40) }; + const interfaces = new Map(); + const packages = new Map(); + for (const name of ["DocumentData", "SummaryController", "Summarizer"]) { + const result = compileCapabilityResourceSource(await read(name), { source }); + assert.ok(result.ok && result.resource.kind === "interface", JSON.stringify(result.diagnostics)); + interfaces.set(name, result.resource.revision); + } + const environment = { interfaces, interfaceClosure: [...interfaces.values()] }; + for (const name of ["ControllerRuntime", "ProviderRuntime"]) { + const result = compileCapabilityResourceSource(await read(name), { source, environment }); + assert.ok(result.ok && result.resource.kind === "package", JSON.stringify(result.diagnostics)); + packages.set(name, result.resource.revision); + } + const result = compileCapabilitySource(await read("workspace"), "workspace.qx", { ...environment, packages }); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + return compileExecutionPlan(result.workspace); +} diff --git a/test/emit-portable-reader.ts b/test/emit-portable-reader.ts index 2e92d9c..9af1a7a 100644 --- a/test/emit-portable-reader.ts +++ b/test/emit-portable-reader.ts @@ -87,3 +87,18 @@ const negative: PortableImplementation = { void negative; `, ); + +const { asyncObjectPlan } = await import("./async-fixture.js"); +const { generateRemoteTypeScriptBindings } = await import("../src/bindings/portable.js"); +const asyncPlan = await asyncObjectPlan(); +await mkdir("dist/portable-reader/async", { recursive: true }); +await writeFile("dist/portable-reader/async/plan.json", JSON.stringify(asyncPlan)); +await writeFile("dist/portable-reader/async/kernel.json", JSON.stringify(compileKernelProgram(asyncPlan))); +for (const [name, revision] of [ + ["controller", "async:controller-runtime@1"], + ["provider", "async:provider-runtime@2"], +] as const) + await writeFile( + `dist/portable-reader/async/${name}.ts`, + generateRemoteTypeScriptBindings(asyncPlan.definition.bindingSchema, revision), + ); diff --git a/test/fixtures/async-objects/ControllerRuntime.qx b/test/fixtures/async-objects/ControllerRuntime.qx new file mode 100644 index 0000000..5b06255 --- /dev/null +++ b/test/fixtures/async-objects/ControllerRuntime.qx @@ -0,0 +1,10 @@ +external atom Document id "async:document"; +import interface DocumentData; +import interface Summarizer; +package ControllerRuntime id "async:controller-runtime" revision "async:controller-runtime@1" { + operation refresh id "async:controller:refresh" : record { operationId: string; } -> string + mode call execution remote receiver atom Document requires { + interface document id "async:controller:document" : DocumentData using [content.get, summary.set]; + interface provider id "async:controller:provider" : Summarizer using [summarize.call]; + }; +} diff --git a/test/fixtures/async-objects/DocumentData.qx b/test/fixtures/async-objects/DocumentData.qx new file mode 100644 index 0000000..214adbe --- /dev/null +++ b/test/fixtures/async-objects/DocumentData.qx @@ -0,0 +1,10 @@ +type Summary = record { text: string; basedOn: string; }; +interface DocumentData id "async:document-data" revision "async:document-data@1" { + queryable value content id "async:content" : string { + get id "async:content:get" execution snapshot targets [browser, server]; + } + queryable value summary id "async:summary" : Summary { + get id "async:summary:get" execution snapshot targets [browser, server]; + set id "async:summary:set" execution transaction targets [browser, server]; + } +} diff --git a/test/fixtures/async-objects/ProviderRuntime.qx b/test/fixtures/async-objects/ProviderRuntime.qx new file mode 100644 index 0000000..8dfe9f9 --- /dev/null +++ b/test/fixtures/async-objects/ProviderRuntime.qx @@ -0,0 +1,5 @@ +external atom Provider id "async:provider"; +package ProviderRuntime id "async:provider-runtime" revision "async:provider-runtime@2" { + operation summarize id "async:provider:summarize" : string -> string + mode call execution remote receiver atom Provider; +} diff --git a/test/fixtures/async-objects/Summarizer.qx b/test/fixtures/async-objects/Summarizer.qx new file mode 100644 index 0000000..84f14f4 --- /dev/null +++ b/test/fixtures/async-objects/Summarizer.qx @@ -0,0 +1,5 @@ +interface Summarizer id "async:summarizer" revision "async:summarizer@1" { + operation summarize id "async:summarize" : string -> string { + call id "async:summarize:call" execution remote; + } +} diff --git a/test/fixtures/async-objects/SummaryController.qx b/test/fixtures/async-objects/SummaryController.qx new file mode 100644 index 0000000..82567e5 --- /dev/null +++ b/test/fixtures/async-objects/SummaryController.qx @@ -0,0 +1,5 @@ +interface SummaryController id "async:controller" revision "async:controller@1" { + operation refresh id "async:refresh" : record { operationId: string; } -> string { + call id "async:refresh:call" execution remote; + } +} diff --git a/test/fixtures/async-objects/workspace.qx b/test/fixtures/async-objects/workspace.qx new file mode 100644 index 0000000..fb0d48a --- /dev/null +++ b/test/fixtures/async-objects/workspace.qx @@ -0,0 +1,31 @@ +workspace AsyncObjects id "workspace:async" revision "workspace:async@1" commit "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" { + import interface DocumentData; + import interface SummaryController; + import interface Summarizer; + import package ControllerRuntime; + import package ProviderRuntime; + atom Document id "async:document"; + atom Provider id "async:provider"; + conform Document as DocumentData id "async:document:data" { + private state Content id "async:state:content" on Document : string policy register; + private state Summary id "async:state:summary" on Document : record { text: string; basedOn: string; } + policy register default { "text": "", "basedOn": "" }; + private edge ProviderLink id "async:provider-link" { + atom Document projection provider id "async:provider-projection" exactly-one public-traversal; + atom Provider projection documents id "async:documents-projection" many-unique; + } + initialize { content to state Content; provider to edge ProviderLink.provider; }; + bind content.get to state Content.read; + bind summary.get to state Summary.read; + bind summary.set to state Summary.write; + } + conform Document as SummaryController id "async:document:controller" { + bind refresh.call to package ControllerRuntime.refresh with { + document to interface DocumentData; + provider to interface Summarizer via edge ProviderLink.provider; + }; + } + conform Provider as Summarizer id "async:provider:summarizer" { + bind summarize.call to package ProviderRuntime.summarize; + } +} diff --git a/test/remote-bindings.test.ts b/test/remote-bindings.test.ts new file mode 100644 index 0000000..39a559c --- /dev/null +++ b/test/remote-bindings.test.ts @@ -0,0 +1,27 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { asyncObjectPlan } from "./async-fixture.js"; +import { generateRemoteTypeScriptBindings, generatePortableTypeScriptBindings } from "../src/bindings/portable.js"; +test("remote adapters expose selected typed calls, lifetimes and explicit transaction identities", async () => { + const plan = await asyncObjectPlan(); + const schema = plan.definition.bindingSchema; + const source = generateRemoteTypeScriptBindings(schema, "async:controller-runtime@1"); + assert.match(source, /readonly signal: AbortSignal/); + assert.match(source, /readonly "summary.set":.*options: ServerMutationOptions/); + assert.match(source, /readonly "summarize.call": \(input: string\) => Promise/); + assert.doesNotMatch(source, /readonly "summary.get"|context\.conform|readonly snapshot:/); + assert.doesNotMatch( + generatePortableTypeScriptBindings(schema, "async:controller-runtime@1", { target: "browser" }), + /readonly "refresh"/, + ); + const entry = schema.packages.find((p) => p.revisionId === "async:controller-runtime@1")!.exports[0]!; + entry.dependencyPorts[0]!.requirement = { + kind: "state", + valueType: { kind: "scalar", name: "string" }, + primitives: ["write"], + }; + assert.throws( + () => generateRemoteTypeScriptBindings(schema, "async:controller-runtime@1"), + /named transaction capability/, + ); +}); From 1dadc642d12049a5230370ef6c3e99c8e4426659 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 20 Sep 2026 20:58:01 -0700 Subject: [PATCH 24/91] Build checked asynchronous service registries with Nix --- src/execution-world/receipts.ts | 20 ++++++++++++++- test/artifact-files.test.ts | 25 +++++++++++++++++++ test/artifact-fixture.ts | 4 +-- .../async-objects/ControllerRuntime.qx | 1 + test/remote-bindings.test.ts | 4 ++- 5 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/execution-world/receipts.ts b/src/execution-world/receipts.ts index 693d4ee..4dd4b90 100644 --- a/src/execution-world/receipts.ts +++ b/src/execution-world/receipts.ts @@ -1,5 +1,5 @@ import { createHash } from "node:crypto"; -import { generatePortableTypeScriptBindings } from "../bindings/portable.js"; +import { generatePortableTypeScriptBindings, generateRemoteTypeScriptBindings } from "../bindings/portable.js"; import { type ExecutionPlan, ExecutionPlanError, hexDigest } from "./plan.js"; import { type ArtifactReader, type PackageArtifacts } from "./artifacts.js"; import { loadArtifactWorld, type LoadedArtifactWorld } from "./files.js"; @@ -53,6 +53,24 @@ export function expectedArtifactReceipt( sources.set(path, bytes); return { target, path, digest: hashBytes(bytes), bytes: bytes.length }; }); + // Custom language services need no TypeScript adapter. A checked JS module + // exporting remote handlers does, and must carry the exact generated source. + if ( + manifest.implementations.some( + (implementation) => + implementation.compatibility === "quixos-js-module-v1" && + implementation.exports.some((id) => + pkg.exports.some((entry) => entry.id === id && entry.execution.kind === "remote"), + ), + ) + ) { + const path = "share/quixos/generated/remote.ts"; + const bytes = new TextEncoder().encode( + generateRemoteTypeScriptBindings(plan.definition.bindingSchema, pkg.revision), + ); + sources.set(path, bytes); + generated.push({ target: "server", path, digest: hashBytes(bytes), bytes: bytes.length }); + } return { receipt: { schemaVersion: 1, diff --git a/test/artifact-files.test.ts b/test/artifact-files.test.ts index cf1b03b..754ca2a 100644 --- a/test/artifact-files.test.ts +++ b/test/artifact-files.test.ts @@ -114,3 +114,28 @@ test("checked receipts bind regenerated code, generator identity and manifests", /replaced or omitted/, ); }); + +test("remote JS modules witness generated adapters without imposing TypeScript on custom services", async () => { + const { asyncObjectPlan } = await import("./async-fixture.js"); + const { expectedArtifactReceipt, checkArtifactReceipt } = await import("../src/execution-world/receipts.js"); + const plan = await asyncObjectPlan(), + fixture = buildArtifactFixture(plan, "async:provider-runtime@2"), + generator = "a".repeat(64); + fixture.manifest.implementations = fixture.manifest.implementations.filter( + (implementation) => implementation.target === "server", + ); + const { receipt, sources } = expectedArtifactReceipt(plan, fixture.manifest, generator); + assert.deepEqual( + receipt.generated.map((file) => file.path), + ["share/quixos/generated/remote.ts"], + ); + await checkArtifactReceipt(plan, fixture.manifest, receipt, generator, async (_revision, path) => sources.get(path)!); + await assert.rejects( + checkArtifactReceipt(plan, fixture.manifest, receipt, generator, async () => new Uint8Array()), + /replaced or omitted/, + ); + fixture.manifest.implementations = fixture.manifest.implementations.filter( + (implementation) => implementation.compatibility === "quixos-service-v1", + ); + assert.deepEqual(expectedArtifactReceipt(plan, fixture.manifest, generator).receipt.generated, []); +}); diff --git a/test/artifact-fixture.ts b/test/artifact-fixture.ts index 48144e8..4b8de4c 100644 --- a/test/artifact-fixture.ts +++ b/test/artifact-fixture.ts @@ -5,8 +5,8 @@ import { type PackageArtifacts, type ArtifactImplementation, } from "../src/execution-world/index.js"; -export const buildArtifactFixture = (plan: ExecutionPlan) => { - const expected = plan.definition.packages[0]!; +export const buildArtifactFixture = (plan: ExecutionPlan, revision = plan.definition.packages[0]!.revision) => { + const expected = plan.definition.packages.find((pkg) => pkg.revision === revision)!; const bytes = new TextEncoder().encode("export const handlers = Object.freeze({});\n"); const implementation = ( id: string, diff --git a/test/fixtures/async-objects/ControllerRuntime.qx b/test/fixtures/async-objects/ControllerRuntime.qx index 5b06255..3ccd904 100644 --- a/test/fixtures/async-objects/ControllerRuntime.qx +++ b/test/fixtures/async-objects/ControllerRuntime.qx @@ -2,6 +2,7 @@ external atom Document id "async:document"; import interface DocumentData; import interface Summarizer; package ControllerRuntime id "async:controller-runtime" revision "async:controller-runtime@1" { + function echo id "async:controller:echo" : string -> string execution snapshot targets [server]; operation refresh id "async:controller:refresh" : record { operationId: string; } -> string mode call execution remote receiver atom Document requires { interface document id "async:controller:document" : DocumentData using [content.get, summary.set]; diff --git a/test/remote-bindings.test.ts b/test/remote-bindings.test.ts index 39a559c..aad99fd 100644 --- a/test/remote-bindings.test.ts +++ b/test/remote-bindings.test.ts @@ -14,7 +14,9 @@ test("remote adapters expose selected typed calls, lifetimes and explicit transa generatePortableTypeScriptBindings(schema, "async:controller-runtime@1", { target: "browser" }), /readonly "refresh"/, ); - const entry = schema.packages.find((p) => p.revisionId === "async:controller-runtime@1")!.exports[0]!; + const entry = schema.packages + .find((p) => p.revisionId === "async:controller-runtime@1")! + .exports.find((entry) => entry.id === "async:controller:refresh")!; entry.dependencyPorts[0]!.requirement = { kind: "state", valueType: { kind: "scalar", name: "string" }, From d638a9ed289f307242e7ea9a618bd3e6dca9e946 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 20 Sep 2026 21:21:11 -0700 Subject: [PATCH 25/91] Run asynchronous object controllers from accepted graph jobs --- test/fixtures/async-objects/ControllerRuntime.qx | 11 +++++++++++ test/fixtures/async-objects/DocumentData.qx | 7 +++++++ test/fixtures/async-objects/SummaryController.qx | 3 +++ test/fixtures/async-objects/workspace.qx | 12 ++++++++++++ 4 files changed, 33 insertions(+) diff --git a/test/fixtures/async-objects/ControllerRuntime.qx b/test/fixtures/async-objects/ControllerRuntime.qx index 3ccd904..9e4e742 100644 --- a/test/fixtures/async-objects/ControllerRuntime.qx +++ b/test/fixtures/async-objects/ControllerRuntime.qx @@ -8,4 +8,15 @@ package ControllerRuntime id "async:controller-runtime" revision "async:controll interface document id "async:controller:document" : DocumentData using [content.get, summary.set]; interface provider id "async:controller:provider" : Summarizer using [summarize.call]; }; + operation finish id "async:controller:finish" + : record { operationId: string; summary: record { text: string; basedOn: string; }; } -> unit + mode call execution transaction targets [server] receiver atom Document requires { + state job id "async:finish:job" : optional [read, write]; + state summary id "async:finish:summary" : record { text: string; basedOn: string; } [write]; + }; + operation runPending id "async:controller:run-pending" : optional -> unit + mode call execution remote receiver atom Document requires { + interface document id "async:pending:document" : DocumentData using [content.get, recordSummary.call]; + interface provider id "async:pending:provider" : Summarizer using [summarize.call]; + }; } diff --git a/test/fixtures/async-objects/DocumentData.qx b/test/fixtures/async-objects/DocumentData.qx index 214adbe..85e0aac 100644 --- a/test/fixtures/async-objects/DocumentData.qx +++ b/test/fixtures/async-objects/DocumentData.qx @@ -7,4 +7,11 @@ interface DocumentData id "async:document-data" revision "async:document-data@1" get id "async:summary:get" execution snapshot targets [browser, server]; set id "async:summary:set" execution transaction targets [browser, server]; } + queryable value pendingJob id "async:pending-job" : optional { + get id "async:pending-job:get" execution snapshot targets [server]; + set id "async:pending-job:set" execution transaction targets [server]; + } + operation recordSummary id "async:record-summary" : record { operationId: string; summary: Summary; } -> unit { + call id "async:record-summary:call" execution transaction targets [server]; + } } diff --git a/test/fixtures/async-objects/SummaryController.qx b/test/fixtures/async-objects/SummaryController.qx index 82567e5..75b6002 100644 --- a/test/fixtures/async-objects/SummaryController.qx +++ b/test/fixtures/async-objects/SummaryController.qx @@ -2,4 +2,7 @@ interface SummaryController id "async:controller" revision "async:controller@1" operation refresh id "async:refresh" : record { operationId: string; } -> string { call id "async:refresh:call" execution remote; } + operation processPending id "async:process-pending" : optional -> unit { + call id "async:process-pending:call" execution remote; + } } diff --git a/test/fixtures/async-objects/workspace.qx b/test/fixtures/async-objects/workspace.qx index fb0d48a..85e8bd9 100644 --- a/test/fixtures/async-objects/workspace.qx +++ b/test/fixtures/async-objects/workspace.qx @@ -10,6 +10,8 @@ workspace AsyncObjects id "workspace:async" revision "workspace:async@1" commit private state Content id "async:state:content" on Document : string policy register; private state Summary id "async:state:summary" on Document : record { text: string; basedOn: string; } policy register default { "text": "", "basedOn": "" }; + private state PendingJob id "async:state:pending-job" on Document : optional + policy register default null; private edge ProviderLink id "async:provider-link" { atom Document projection provider id "async:provider-projection" exactly-one public-traversal; atom Provider projection documents id "async:documents-projection" many-unique; @@ -18,12 +20,22 @@ workspace AsyncObjects id "workspace:async" revision "workspace:async@1" commit bind content.get to state Content.read; bind summary.get to state Summary.read; bind summary.set to state Summary.write; + bind pendingJob.get to state PendingJob.read; + bind pendingJob.set to state PendingJob.write; + bind recordSummary.call to package ControllerRuntime.finish with { + job to state PendingJob; + summary to state Summary; + }; } conform Document as SummaryController id "async:document:controller" { bind refresh.call to package ControllerRuntime.refresh with { document to interface DocumentData; provider to interface Summarizer via edge ProviderLink.provider; }; + bind processPending.call to package ControllerRuntime.runPending with { + document to interface DocumentData; + provider to interface Summarizer via edge ProviderLink.provider; + }; } conform Provider as Summarizer id "async:provider:summarizer" { bind summarize.call to package ProviderRuntime.summarize; From 1e69b0e662697d261aba15b26773b08f8c54ea2c Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 20 Sep 2026 21:40:14 -0700 Subject: [PATCH 26/91] Qualify recurring occurrence completion with portable graph transactions --- test/emit-portable-reader.ts | 5 +++++ test/fixtures/recurring-task/Task.qx | 15 +++++++++++++++ test/fixtures/recurring-task/TaskRuntime.qx | 8 ++++++++ test/fixtures/recurring-task/workspace.qx | 19 +++++++++++++++++++ test/recurring-fixture.ts | 19 +++++++++++++++++++ 5 files changed, 66 insertions(+) create mode 100644 test/fixtures/recurring-task/Task.qx create mode 100644 test/fixtures/recurring-task/TaskRuntime.qx create mode 100644 test/fixtures/recurring-task/workspace.qx create mode 100644 test/recurring-fixture.ts diff --git a/test/emit-portable-reader.ts b/test/emit-portable-reader.ts index 9af1a7a..25db047 100644 --- a/test/emit-portable-reader.ts +++ b/test/emit-portable-reader.ts @@ -89,6 +89,11 @@ void negative; ); const { asyncObjectPlan } = await import("./async-fixture.js"); +const { recurringTaskPlan } = await import("./recurring-fixture.js"); +const recurringPlan = await recurringTaskPlan(); +await mkdir("dist/portable-reader/recurring", { recursive: true }); +await writeFile("dist/portable-reader/recurring/plan.json", JSON.stringify(recurringPlan)); +await writeFile("dist/portable-reader/recurring/kernel.json", JSON.stringify(compileKernelProgram(recurringPlan))); const { generateRemoteTypeScriptBindings } = await import("../src/bindings/portable.js"); const asyncPlan = await asyncObjectPlan(); await mkdir("dist/portable-reader/async", { recursive: true }); diff --git a/test/fixtures/recurring-task/Task.qx b/test/fixtures/recurring-task/Task.qx new file mode 100644 index 0000000..95ed1f0 --- /dev/null +++ b/test/fixtures/recurring-task/Task.qx @@ -0,0 +1,15 @@ +interface Task id "recurring:task-data" revision "recurring:task-data@1" { + queryable value occurrence id "recurring:occurrence" : uint64 { + get id "recurring:occurrence:get" execution snapshot targets [browser, server]; + } + queryable value due id "recurring:due" : int64 { + get id "recurring:due:get" execution snapshot targets [browser, server]; + } + queryable value title id "recurring:title" : string { + get id "recurring:title:get" execution snapshot targets [browser, server]; + set id "recurring:title:set" execution transaction targets [browser, server]; + } + operation complete id "recurring:complete" : uint64 -> unit { + call id "recurring:complete:call" execution transaction targets [browser, server]; + } +} diff --git a/test/fixtures/recurring-task/TaskRuntime.qx b/test/fixtures/recurring-task/TaskRuntime.qx new file mode 100644 index 0000000..85b280c --- /dev/null +++ b/test/fixtures/recurring-task/TaskRuntime.qx @@ -0,0 +1,8 @@ +external atom TaskObject id "recurring:task"; +package TaskRuntime id "recurring:runtime" revision "recurring:runtime@1" { + operation complete id "recurring:runtime:complete" : uint64 -> unit + mode call execution transaction targets [browser, server] receiver atom TaskObject requires { + state occurrence id "recurring:port:occurrence" : uint64 [read, write]; + state due id "recurring:port:due" : int64 [read, write]; + }; +} diff --git a/test/fixtures/recurring-task/workspace.qx b/test/fixtures/recurring-task/workspace.qx new file mode 100644 index 0000000..adb2164 --- /dev/null +++ b/test/fixtures/recurring-task/workspace.qx @@ -0,0 +1,19 @@ +workspace RecurringTask id "workspace:recurring" revision "workspace:recurring@1" commit "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" { + import interface Task; + import package TaskRuntime; + atom TaskObject id "recurring:task"; + conform TaskObject as Task id "recurring:task:owner" { + private state Occurrence id "recurring:state:occurrence" on TaskObject : uint64 policy register default 0; + private state Due id "recurring:state:due" on TaskObject : int64 policy register; + private state Title id "recurring:state:title" on TaskObject : string policy register; + initialize { due to state Due; title to state Title; }; + bind occurrence.get to state Occurrence.read; + bind due.get to state Due.read; + bind title.get to state Title.read; + bind title.set to state Title.write; + bind complete.call to package TaskRuntime.complete with { + occurrence to state Occurrence; + due to state Due; + }; + } +} diff --git a/test/recurring-fixture.ts b/test/recurring-fixture.ts new file mode 100644 index 0000000..2f2c04e --- /dev/null +++ b/test/recurring-fixture.ts @@ -0,0 +1,19 @@ +import assert from "node:assert/strict"; +import { readFile } from "node:fs/promises"; +import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/parser.js"; +import { compileExecutionPlan } from "../src/execution-world/plan.js"; + +export async function recurringTaskPlan() { + const read = (name: string) => readFile(`test/fixtures/recurring-task/${name}.qx`, "utf8"); + const source = { repository: "https://example.test/recurring.git", commit: "a".repeat(40) }; + const task = compileCapabilityResourceSource(await read("Task"), { source }); + assert.ok(task.ok && task.resource.kind === "interface", JSON.stringify(task.diagnostics)); + const runtime = compileCapabilityResourceSource(await read("TaskRuntime"), { source }); + assert.ok(runtime.ok && runtime.resource.kind === "package", JSON.stringify(runtime.diagnostics)); + const result = compileCapabilitySource(await read("workspace"), "workspace.qx", { + interfaces: new Map([["Task", task.resource.revision]]), + packages: new Map([["TaskRuntime", runtime.resource.revision]]), + }); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + return compileExecutionPlan(result.workspace); +} From 266d2d98d0c075a5f68ebb5ce78e051a56eb708f Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 20 Sep 2026 21:51:43 -0700 Subject: [PATCH 27/91] Compile and dispatch authoritative acceptance hooks with target-specific package roots --- grammar/QuixosCapability.g4 | 15 +- .../generated/QuixosCapability.interp | 6 +- .../generated/QuixosCapability.tokens | 332 +- .../generated/QuixosCapabilityLexer.interp | 5 +- .../generated/QuixosCapabilityLexer.tokens | 332 +- .../generated/QuixosCapabilityLexer.ts | 1191 +++--- .../generated/QuixosCapabilityParser.ts | 3595 +++++++++-------- .../generated/QuixosCapabilityVisitor.ts | 14 + src/capability-language/parser.ts | 40 + src/capability-model/types.ts | 3 + src/capability-model/validation.ts | 40 + src/execution-world/kernel.ts | 118 +- test/acceptance-fixture.ts | 41 + test/acceptance-hooks.test.ts | 70 + test/artifact-fixture.ts | 4 +- test/emit-portable-reader.ts | 7 + 16 files changed, 3112 insertions(+), 2701 deletions(-) create mode 100644 test/acceptance-fixture.ts create mode 100644 test/acceptance-hooks.test.ts diff --git a/grammar/QuixosCapability.g4 b/grammar/QuixosCapability.g4 index 5517897..bc5f4aa 100644 --- a/grammar/QuixosCapability.g4 +++ b/grammar/QuixosCapability.g4 @@ -169,12 +169,16 @@ queryClause packageOperationExport : OPERATION identifier typeParameters? ID stringLiteral COLON valueType ARROW valueType - MODE operationMode executionClause? eventClause? RECEIVER receiverRequirement dependencyBlock? SEMI + MODE operationMode executionClause? eventClause? RECEIVER receiverRequirement dependencyBlock? acceptanceClause? SEMI ; packageFunctionExport : FUNCTION identifier typeParameters? ID stringLiteral COLON valueType ARROW valueType - executionClause? dependencyBlock? SEMI + executionClause? dependencyBlock? acceptanceClause? SEMI + ; + +acceptanceClause + : ACCEPT USING identifier ; executionClause @@ -332,7 +336,11 @@ operationProvider : STATE identifier DOT statePrimitive | EDGE identifier DOT identifier DOT edgePrimitive | INTERFACE identifier typeArguments? DOT memberOperationRef - | PACKAGE identifier DOT identifier typeArguments? dependencyBindingBlock? + | PACKAGE identifier DOT identifier typeArguments? dependencyBindingBlock? acceptanceBinding? + ; + +acceptanceBinding + : ACCEPT dependencyBindingBlock ; statePrimitive @@ -528,6 +536,7 @@ EDGE: 'edge'; PROJECTION: 'projection'; WITH: 'with'; USING: 'using'; +ACCEPT: 'accept'; VIA: 'via'; MATERIALIZE: 'materialize'; IF: 'if'; diff --git a/src/capability-language/generated/QuixosCapability.interp b/src/capability-language/generated/QuixosCapability.interp index f8017cb..2f8aa0c 100644 --- a/src/capability-language/generated/QuixosCapability.interp +++ b/src/capability-language/generated/QuixosCapability.interp @@ -60,6 +60,7 @@ null 'projection' 'with' 'using' +'accept' 'via' 'materialize' 'if' @@ -209,6 +210,7 @@ EDGE PROJECTION WITH USING +ACCEPT VIA MATERIALIZE IF @@ -329,6 +331,7 @@ packageQuerySpecialization queryClause packageOperationExport packageFunctionExport +acceptanceClause executionClause selectedOperations packageConstructorExport @@ -357,6 +360,7 @@ operationBindingDecl memberOperationRef operationName operationProvider +acceptanceBinding statePrimitive edgePrimitive dependencyBindingBlock @@ -375,4 +379,4 @@ stringLiteral atn: -[4, 1, 146, 1264, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 163, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 168, 8, 1, 10, 1, 12, 1, 171, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 189, 8, 3, 10, 3, 12, 3, 192, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 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, 3, 5, 215, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 235, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 243, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 248, 8, 10, 10, 10, 12, 10, 251, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 256, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 266, 8, 10, 10, 10, 12, 10, 269, 9, 10, 3, 10, 271, 8, 10, 1, 10, 1, 10, 5, 10, 275, 8, 10, 10, 10, 12, 10, 278, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 286, 8, 11, 10, 11, 12, 11, 289, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 297, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 305, 8, 12, 10, 12, 12, 12, 308, 9, 12, 3, 12, 310, 8, 12, 3, 12, 312, 8, 12, 1, 13, 1, 13, 3, 13, 316, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 322, 8, 14, 10, 14, 12, 14, 325, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 336, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 341, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 350, 8, 17, 1, 18, 3, 18, 353, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 368, 8, 18, 1, 18, 1, 18, 1, 18, 1, 19, 3, 19, 374, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 384, 8, 19, 10, 19, 12, 19, 387, 9, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 395, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 403, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 411, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 424, 8, 20, 1, 21, 3, 21, 427, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 437, 8, 21, 1, 21, 1, 21, 3, 21, 441, 8, 21, 1, 21, 1, 21, 5, 21, 445, 8, 21, 10, 21, 12, 21, 448, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 454, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 460, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 468, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 476, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 489, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 496, 8, 24, 1, 24, 1, 24, 3, 24, 500, 8, 24, 1, 25, 5, 25, 503, 8, 25, 10, 25, 12, 25, 506, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 516, 8, 25, 1, 25, 1, 25, 5, 25, 520, 8, 25, 10, 25, 12, 25, 523, 9, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 532, 8, 26, 1, 27, 1, 27, 1, 27, 3, 27, 537, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 543, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 552, 8, 27, 10, 27, 12, 27, 555, 9, 27, 1, 27, 1, 27, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 581, 8, 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, 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, 3, 29, 608, 8, 29, 1, 30, 1, 30, 1, 30, 3, 30, 613, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 624, 8, 30, 1, 30, 3, 30, 627, 8, 30, 1, 30, 1, 30, 1, 30, 3, 30, 632, 8, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 3, 31, 639, 8, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 648, 8, 31, 1, 31, 3, 31, 651, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 664, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 5, 33, 671, 8, 33, 10, 33, 12, 33, 674, 9, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 687, 8, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 5, 37, 706, 8, 37, 10, 37, 12, 37, 709, 9, 37, 3, 37, 711, 8, 37, 1, 37, 3, 37, 714, 8, 37, 1, 38, 1, 38, 1, 38, 5, 38, 719, 8, 38, 10, 38, 12, 38, 722, 9, 38, 1, 39, 1, 39, 1, 39, 5, 39, 727, 8, 39, 10, 39, 12, 39, 730, 9, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 769, 8, 40, 1, 40, 3, 40, 772, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 794, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 808, 8, 40, 1, 41, 1, 41, 1, 41, 1, 41, 5, 41, 814, 8, 41, 10, 41, 12, 41, 817, 9, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 3, 44, 828, 8, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 842, 8, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 852, 8, 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, 48, 1, 48, 1, 48, 1, 48, 3, 48, 870, 8, 48, 1, 48, 1, 48, 3, 48, 874, 8, 48, 1, 48, 3, 48, 877, 8, 48, 1, 48, 1, 48, 3, 48, 881, 8, 48, 1, 48, 3, 48, 884, 8, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 893, 8, 49, 1, 49, 1, 49, 3, 49, 897, 8, 49, 1, 49, 1, 49, 3, 49, 901, 8, 49, 1, 49, 1, 49, 5, 49, 905, 8, 49, 10, 49, 12, 49, 908, 9, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 918, 8, 50, 1, 51, 1, 51, 1, 51, 5, 51, 923, 8, 51, 10, 51, 12, 51, 926, 9, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 945, 8, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 5, 53, 952, 8, 53, 10, 53, 12, 53, 955, 9, 53, 1, 53, 1, 53, 1, 54, 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, 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, 3, 56, 986, 8, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 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, 1006, 8, 58, 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, 1023, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1033, 8, 59, 1, 59, 3, 59, 1036, 8, 59, 3, 59, 1038, 8, 59, 1, 60, 1, 60, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 5, 62, 1047, 8, 62, 10, 62, 12, 62, 1050, 9, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1073, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1089, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1098, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1106, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 5, 63, 1117, 8, 63, 10, 63, 12, 63, 1120, 9, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1134, 8, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1146, 8, 63, 1, 63, 1, 63, 3, 63, 1150, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1159, 8, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1177, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 5, 65, 1199, 8, 65, 10, 65, 12, 65, 1202, 9, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1207, 8, 65, 3, 65, 1209, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1228, 8, 69, 1, 70, 1, 70, 1, 70, 1, 70, 5, 70, 1234, 8, 70, 10, 70, 12, 70, 1237, 9, 70, 3, 70, 1239, 8, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 5, 72, 1251, 8, 72, 10, 72, 12, 72, 1254, 9, 72, 3, 72, 1256, 8, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 0, 0, 75, 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, 0, 9, 2, 0, 10, 10, 28, 28, 1, 0, 6, 7, 1, 0, 94, 98, 3, 0, 1, 1, 89, 93, 95, 96, 3, 0, 1, 1, 89, 90, 95, 96, 2, 0, 91, 93, 95, 96, 1, 0, 114, 121, 1, 0, 101, 104, 7, 0, 1, 3, 5, 28, 40, 40, 68, 68, 87, 88, 99, 99, 142, 142, 1367, 0, 162, 1, 0, 0, 0, 2, 164, 1, 0, 0, 0, 4, 174, 1, 0, 0, 0, 6, 178, 1, 0, 0, 0, 8, 202, 1, 0, 0, 0, 10, 214, 1, 0, 0, 0, 12, 216, 1, 0, 0, 0, 14, 223, 1, 0, 0, 0, 16, 234, 1, 0, 0, 0, 18, 236, 1, 0, 0, 0, 20, 249, 1, 0, 0, 0, 22, 281, 1, 0, 0, 0, 24, 311, 1, 0, 0, 0, 26, 313, 1, 0, 0, 0, 28, 317, 1, 0, 0, 0, 30, 335, 1, 0, 0, 0, 32, 337, 1, 0, 0, 0, 34, 349, 1, 0, 0, 0, 36, 352, 1, 0, 0, 0, 38, 373, 1, 0, 0, 0, 40, 423, 1, 0, 0, 0, 42, 426, 1, 0, 0, 0, 44, 451, 1, 0, 0, 0, 46, 488, 1, 0, 0, 0, 48, 499, 1, 0, 0, 0, 50, 504, 1, 0, 0, 0, 52, 531, 1, 0, 0, 0, 54, 533, 1, 0, 0, 0, 56, 558, 1, 0, 0, 0, 58, 607, 1, 0, 0, 0, 60, 609, 1, 0, 0, 0, 62, 635, 1, 0, 0, 0, 64, 663, 1, 0, 0, 0, 66, 665, 1, 0, 0, 0, 68, 677, 1, 0, 0, 0, 70, 690, 1, 0, 0, 0, 72, 693, 1, 0, 0, 0, 74, 713, 1, 0, 0, 0, 76, 715, 1, 0, 0, 0, 78, 723, 1, 0, 0, 0, 80, 807, 1, 0, 0, 0, 82, 809, 1, 0, 0, 0, 84, 820, 1, 0, 0, 0, 86, 822, 1, 0, 0, 0, 88, 827, 1, 0, 0, 0, 90, 829, 1, 0, 0, 0, 92, 851, 1, 0, 0, 0, 94, 853, 1, 0, 0, 0, 96, 862, 1, 0, 0, 0, 98, 887, 1, 0, 0, 0, 100, 917, 1, 0, 0, 0, 102, 919, 1, 0, 0, 0, 104, 944, 1, 0, 0, 0, 106, 946, 1, 0, 0, 0, 108, 958, 1, 0, 0, 0, 110, 965, 1, 0, 0, 0, 112, 979, 1, 0, 0, 0, 114, 989, 1, 0, 0, 0, 116, 1005, 1, 0, 0, 0, 118, 1037, 1, 0, 0, 0, 120, 1039, 1, 0, 0, 0, 122, 1041, 1, 0, 0, 0, 124, 1043, 1, 0, 0, 0, 126, 1149, 1, 0, 0, 0, 128, 1151, 1, 0, 0, 0, 130, 1208, 1, 0, 0, 0, 132, 1210, 1, 0, 0, 0, 134, 1215, 1, 0, 0, 0, 136, 1217, 1, 0, 0, 0, 138, 1227, 1, 0, 0, 0, 140, 1229, 1, 0, 0, 0, 142, 1242, 1, 0, 0, 0, 144, 1246, 1, 0, 0, 0, 146, 1259, 1, 0, 0, 0, 148, 1261, 1, 0, 0, 0, 150, 151, 3, 6, 3, 0, 151, 152, 5, 0, 0, 1, 152, 163, 1, 0, 0, 0, 153, 154, 3, 20, 10, 0, 154, 155, 5, 0, 0, 1, 155, 163, 1, 0, 0, 0, 156, 157, 3, 50, 25, 0, 157, 158, 5, 0, 0, 1, 158, 163, 1, 0, 0, 0, 159, 160, 3, 2, 1, 0, 160, 161, 5, 0, 0, 1, 161, 163, 1, 0, 0, 0, 162, 150, 1, 0, 0, 0, 162, 153, 1, 0, 0, 0, 162, 156, 1, 0, 0, 0, 162, 159, 1, 0, 0, 0, 163, 1, 1, 0, 0, 0, 164, 165, 5, 35, 0, 0, 165, 169, 5, 130, 0, 0, 166, 168, 3, 8, 4, 0, 167, 166, 1, 0, 0, 0, 168, 171, 1, 0, 0, 0, 169, 167, 1, 0, 0, 0, 169, 170, 1, 0, 0, 0, 170, 172, 1, 0, 0, 0, 171, 169, 1, 0, 0, 0, 172, 173, 5, 131, 0, 0, 173, 3, 1, 0, 0, 0, 174, 175, 5, 36, 0, 0, 175, 176, 3, 148, 74, 0, 176, 177, 5, 127, 0, 0, 177, 5, 1, 0, 0, 0, 178, 179, 5, 4, 0, 0, 179, 180, 3, 146, 73, 0, 180, 181, 5, 77, 0, 0, 181, 182, 3, 148, 74, 0, 182, 183, 5, 71, 0, 0, 183, 184, 3, 148, 74, 0, 184, 185, 5, 70, 0, 0, 185, 186, 3, 148, 74, 0, 186, 190, 5, 130, 0, 0, 187, 189, 3, 8, 4, 0, 188, 187, 1, 0, 0, 0, 189, 192, 1, 0, 0, 0, 190, 188, 1, 0, 0, 0, 190, 191, 1, 0, 0, 0, 191, 193, 1, 0, 0, 0, 192, 190, 1, 0, 0, 0, 193, 194, 5, 131, 0, 0, 194, 7, 1, 0, 0, 0, 195, 203, 3, 4, 2, 0, 196, 203, 3, 18, 9, 0, 197, 203, 3, 10, 5, 0, 198, 203, 3, 86, 43, 0, 199, 203, 3, 98, 49, 0, 200, 203, 3, 128, 64, 0, 201, 203, 3, 32, 16, 0, 202, 195, 1, 0, 0, 0, 202, 196, 1, 0, 0, 0, 202, 197, 1, 0, 0, 0, 202, 198, 1, 0, 0, 0, 202, 199, 1, 0, 0, 0, 202, 200, 1, 0, 0, 0, 202, 201, 1, 0, 0, 0, 203, 9, 1, 0, 0, 0, 204, 205, 5, 36, 0, 0, 205, 206, 5, 39, 0, 0, 206, 207, 3, 146, 73, 0, 207, 208, 5, 127, 0, 0, 208, 215, 1, 0, 0, 0, 209, 210, 5, 36, 0, 0, 210, 211, 5, 41, 0, 0, 211, 212, 3, 146, 73, 0, 212, 213, 5, 127, 0, 0, 213, 215, 1, 0, 0, 0, 214, 204, 1, 0, 0, 0, 214, 209, 1, 0, 0, 0, 215, 11, 1, 0, 0, 0, 216, 217, 5, 37, 0, 0, 217, 218, 5, 38, 0, 0, 218, 219, 3, 146, 73, 0, 219, 220, 5, 77, 0, 0, 220, 221, 3, 148, 74, 0, 221, 222, 5, 127, 0, 0, 222, 13, 1, 0, 0, 0, 223, 224, 5, 37, 0, 0, 224, 225, 5, 39, 0, 0, 225, 226, 3, 146, 73, 0, 226, 227, 5, 71, 0, 0, 227, 228, 3, 148, 74, 0, 228, 229, 5, 127, 0, 0, 229, 15, 1, 0, 0, 0, 230, 235, 3, 10, 5, 0, 231, 235, 3, 12, 6, 0, 232, 235, 3, 14, 7, 0, 233, 235, 3, 32, 16, 0, 234, 230, 1, 0, 0, 0, 234, 231, 1, 0, 0, 0, 234, 232, 1, 0, 0, 0, 234, 233, 1, 0, 0, 0, 235, 17, 1, 0, 0, 0, 236, 237, 5, 38, 0, 0, 237, 238, 3, 146, 73, 0, 238, 239, 5, 77, 0, 0, 239, 242, 3, 148, 74, 0, 240, 241, 5, 78, 0, 0, 241, 243, 3, 148, 74, 0, 242, 240, 1, 0, 0, 0, 242, 243, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 245, 5, 127, 0, 0, 245, 19, 1, 0, 0, 0, 246, 248, 3, 16, 8, 0, 247, 246, 1, 0, 0, 0, 248, 251, 1, 0, 0, 0, 249, 247, 1, 0, 0, 0, 249, 250, 1, 0, 0, 0, 250, 252, 1, 0, 0, 0, 251, 249, 1, 0, 0, 0, 252, 253, 5, 39, 0, 0, 253, 255, 3, 146, 73, 0, 254, 256, 3, 22, 11, 0, 255, 254, 1, 0, 0, 0, 255, 256, 1, 0, 0, 0, 256, 257, 1, 0, 0, 0, 257, 258, 5, 77, 0, 0, 258, 259, 3, 148, 74, 0, 259, 260, 5, 71, 0, 0, 260, 270, 3, 148, 74, 0, 261, 262, 5, 82, 0, 0, 262, 267, 3, 26, 13, 0, 263, 264, 5, 128, 0, 0, 264, 266, 3, 26, 13, 0, 265, 263, 1, 0, 0, 0, 266, 269, 1, 0, 0, 0, 267, 265, 1, 0, 0, 0, 267, 268, 1, 0, 0, 0, 268, 271, 1, 0, 0, 0, 269, 267, 1, 0, 0, 0, 270, 261, 1, 0, 0, 0, 270, 271, 1, 0, 0, 0, 271, 272, 1, 0, 0, 0, 272, 276, 5, 130, 0, 0, 273, 275, 3, 34, 17, 0, 274, 273, 1, 0, 0, 0, 275, 278, 1, 0, 0, 0, 276, 274, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 279, 1, 0, 0, 0, 278, 276, 1, 0, 0, 0, 279, 280, 5, 131, 0, 0, 280, 21, 1, 0, 0, 0, 281, 282, 5, 136, 0, 0, 282, 287, 3, 24, 12, 0, 283, 284, 5, 128, 0, 0, 284, 286, 3, 24, 12, 0, 285, 283, 1, 0, 0, 0, 286, 289, 1, 0, 0, 0, 287, 285, 1, 0, 0, 0, 287, 288, 1, 0, 0, 0, 288, 290, 1, 0, 0, 0, 289, 287, 1, 0, 0, 0, 290, 291, 5, 137, 0, 0, 291, 23, 1, 0, 0, 0, 292, 293, 5, 42, 0, 0, 293, 296, 3, 146, 73, 0, 294, 295, 5, 126, 0, 0, 295, 297, 5, 32, 0, 0, 296, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 312, 1, 0, 0, 0, 298, 299, 5, 31, 0, 0, 299, 309, 3, 146, 73, 0, 300, 301, 5, 33, 0, 0, 301, 306, 3, 26, 13, 0, 302, 303, 5, 138, 0, 0, 303, 305, 3, 26, 13, 0, 304, 302, 1, 0, 0, 0, 305, 308, 1, 0, 0, 0, 306, 304, 1, 0, 0, 0, 306, 307, 1, 0, 0, 0, 307, 310, 1, 0, 0, 0, 308, 306, 1, 0, 0, 0, 309, 300, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 312, 1, 0, 0, 0, 311, 292, 1, 0, 0, 0, 311, 298, 1, 0, 0, 0, 312, 25, 1, 0, 0, 0, 313, 315, 3, 146, 73, 0, 314, 316, 3, 28, 14, 0, 315, 314, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 27, 1, 0, 0, 0, 317, 318, 5, 136, 0, 0, 318, 323, 3, 30, 15, 0, 319, 320, 5, 128, 0, 0, 320, 322, 3, 30, 15, 0, 321, 319, 1, 0, 0, 0, 322, 325, 1, 0, 0, 0, 323, 321, 1, 0, 0, 0, 323, 324, 1, 0, 0, 0, 324, 326, 1, 0, 0, 0, 325, 323, 1, 0, 0, 0, 326, 327, 5, 137, 0, 0, 327, 29, 1, 0, 0, 0, 328, 329, 5, 38, 0, 0, 329, 336, 3, 146, 73, 0, 330, 331, 5, 39, 0, 0, 331, 336, 3, 26, 13, 0, 332, 333, 5, 31, 0, 0, 333, 336, 3, 146, 73, 0, 334, 336, 3, 130, 65, 0, 335, 328, 1, 0, 0, 0, 335, 330, 1, 0, 0, 0, 335, 332, 1, 0, 0, 0, 335, 334, 1, 0, 0, 0, 336, 31, 1, 0, 0, 0, 337, 338, 5, 30, 0, 0, 338, 340, 3, 146, 73, 0, 339, 341, 3, 22, 11, 0, 340, 339, 1, 0, 0, 0, 340, 341, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 343, 5, 139, 0, 0, 343, 344, 3, 130, 65, 0, 344, 345, 5, 127, 0, 0, 345, 33, 1, 0, 0, 0, 346, 350, 3, 38, 19, 0, 347, 350, 3, 42, 21, 0, 348, 350, 3, 36, 18, 0, 349, 346, 1, 0, 0, 0, 349, 347, 1, 0, 0, 0, 349, 348, 1, 0, 0, 0, 350, 35, 1, 0, 0, 0, 351, 353, 5, 52, 0, 0, 352, 351, 1, 0, 0, 0, 352, 353, 1, 0, 0, 0, 353, 354, 1, 0, 0, 0, 354, 355, 5, 44, 0, 0, 355, 356, 3, 146, 73, 0, 356, 357, 5, 77, 0, 0, 357, 358, 3, 148, 74, 0, 358, 359, 5, 126, 0, 0, 359, 360, 3, 130, 65, 0, 360, 361, 5, 125, 0, 0, 361, 362, 3, 130, 65, 0, 362, 363, 5, 130, 0, 0, 363, 364, 5, 94, 0, 0, 364, 365, 5, 77, 0, 0, 365, 367, 3, 148, 74, 0, 366, 368, 3, 64, 32, 0, 367, 366, 1, 0, 0, 0, 367, 368, 1, 0, 0, 0, 368, 369, 1, 0, 0, 0, 369, 370, 5, 127, 0, 0, 370, 371, 5, 131, 0, 0, 371, 37, 1, 0, 0, 0, 372, 374, 3, 44, 22, 0, 373, 372, 1, 0, 0, 0, 373, 374, 1, 0, 0, 0, 374, 375, 1, 0, 0, 0, 375, 376, 5, 42, 0, 0, 376, 377, 3, 146, 73, 0, 377, 378, 5, 77, 0, 0, 378, 379, 3, 148, 74, 0, 379, 380, 5, 126, 0, 0, 380, 381, 3, 130, 65, 0, 381, 385, 5, 130, 0, 0, 382, 384, 3, 40, 20, 0, 383, 382, 1, 0, 0, 0, 384, 387, 1, 0, 0, 0, 385, 383, 1, 0, 0, 0, 385, 386, 1, 0, 0, 0, 386, 388, 1, 0, 0, 0, 387, 385, 1, 0, 0, 0, 388, 389, 5, 131, 0, 0, 389, 39, 1, 0, 0, 0, 390, 391, 5, 84, 0, 0, 391, 392, 5, 77, 0, 0, 392, 394, 3, 148, 74, 0, 393, 395, 3, 64, 32, 0, 394, 393, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 396, 1, 0, 0, 0, 396, 397, 5, 127, 0, 0, 397, 424, 1, 0, 0, 0, 398, 399, 5, 85, 0, 0, 399, 400, 5, 77, 0, 0, 400, 402, 3, 148, 74, 0, 401, 403, 3, 64, 32, 0, 402, 401, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 404, 1, 0, 0, 0, 404, 405, 5, 127, 0, 0, 405, 424, 1, 0, 0, 0, 406, 407, 5, 1, 0, 0, 407, 408, 5, 77, 0, 0, 408, 410, 3, 148, 74, 0, 409, 411, 3, 64, 32, 0, 410, 409, 1, 0, 0, 0, 410, 411, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 413, 5, 127, 0, 0, 413, 424, 1, 0, 0, 0, 414, 415, 5, 86, 0, 0, 415, 416, 5, 87, 0, 0, 416, 417, 5, 77, 0, 0, 417, 418, 3, 148, 74, 0, 418, 419, 5, 88, 0, 0, 419, 420, 5, 77, 0, 0, 420, 421, 3, 148, 74, 0, 421, 422, 5, 127, 0, 0, 422, 424, 1, 0, 0, 0, 423, 390, 1, 0, 0, 0, 423, 398, 1, 0, 0, 0, 423, 406, 1, 0, 0, 0, 423, 414, 1, 0, 0, 0, 424, 41, 1, 0, 0, 0, 425, 427, 3, 44, 22, 0, 426, 425, 1, 0, 0, 0, 426, 427, 1, 0, 0, 0, 427, 428, 1, 0, 0, 0, 428, 429, 5, 43, 0, 0, 429, 430, 3, 146, 73, 0, 430, 431, 5, 77, 0, 0, 431, 432, 3, 148, 74, 0, 432, 433, 5, 126, 0, 0, 433, 434, 3, 136, 68, 0, 434, 436, 3, 48, 24, 0, 435, 437, 5, 105, 0, 0, 436, 435, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 440, 1, 0, 0, 0, 438, 439, 5, 75, 0, 0, 439, 441, 3, 148, 74, 0, 440, 438, 1, 0, 0, 0, 440, 441, 1, 0, 0, 0, 441, 442, 1, 0, 0, 0, 442, 446, 5, 130, 0, 0, 443, 445, 3, 46, 23, 0, 444, 443, 1, 0, 0, 0, 445, 448, 1, 0, 0, 0, 446, 444, 1, 0, 0, 0, 446, 447, 1, 0, 0, 0, 447, 449, 1, 0, 0, 0, 448, 446, 1, 0, 0, 0, 449, 450, 5, 131, 0, 0, 450, 43, 1, 0, 0, 0, 451, 453, 5, 27, 0, 0, 452, 454, 7, 0, 0, 0, 453, 452, 1, 0, 0, 0, 453, 454, 1, 0, 0, 0, 454, 45, 1, 0, 0, 0, 455, 456, 5, 91, 0, 0, 456, 457, 5, 77, 0, 0, 457, 459, 3, 148, 74, 0, 458, 460, 3, 64, 32, 0, 459, 458, 1, 0, 0, 0, 459, 460, 1, 0, 0, 0, 460, 461, 1, 0, 0, 0, 461, 462, 5, 127, 0, 0, 462, 489, 1, 0, 0, 0, 463, 464, 5, 92, 0, 0, 464, 465, 5, 77, 0, 0, 465, 467, 3, 148, 74, 0, 466, 468, 3, 64, 32, 0, 467, 466, 1, 0, 0, 0, 467, 468, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 470, 5, 127, 0, 0, 470, 489, 1, 0, 0, 0, 471, 472, 5, 93, 0, 0, 472, 473, 5, 77, 0, 0, 473, 475, 3, 148, 74, 0, 474, 476, 3, 64, 32, 0, 475, 474, 1, 0, 0, 0, 475, 476, 1, 0, 0, 0, 476, 477, 1, 0, 0, 0, 477, 478, 5, 127, 0, 0, 478, 489, 1, 0, 0, 0, 479, 480, 5, 86, 0, 0, 480, 481, 5, 87, 0, 0, 481, 482, 5, 77, 0, 0, 482, 483, 3, 148, 74, 0, 483, 484, 5, 88, 0, 0, 484, 485, 5, 77, 0, 0, 485, 486, 3, 148, 74, 0, 486, 487, 5, 127, 0, 0, 487, 489, 1, 0, 0, 0, 488, 455, 1, 0, 0, 0, 488, 463, 1, 0, 0, 0, 488, 471, 1, 0, 0, 0, 488, 479, 1, 0, 0, 0, 489, 47, 1, 0, 0, 0, 490, 491, 5, 38, 0, 0, 491, 500, 3, 146, 73, 0, 492, 493, 5, 39, 0, 0, 493, 495, 3, 146, 73, 0, 494, 496, 3, 28, 14, 0, 495, 494, 1, 0, 0, 0, 495, 496, 1, 0, 0, 0, 496, 500, 1, 0, 0, 0, 497, 498, 5, 31, 0, 0, 498, 500, 3, 146, 73, 0, 499, 490, 1, 0, 0, 0, 499, 492, 1, 0, 0, 0, 499, 497, 1, 0, 0, 0, 500, 49, 1, 0, 0, 0, 501, 503, 3, 16, 8, 0, 502, 501, 1, 0, 0, 0, 503, 506, 1, 0, 0, 0, 504, 502, 1, 0, 0, 0, 504, 505, 1, 0, 0, 0, 505, 507, 1, 0, 0, 0, 506, 504, 1, 0, 0, 0, 507, 508, 5, 41, 0, 0, 508, 509, 3, 146, 73, 0, 509, 510, 5, 77, 0, 0, 510, 511, 3, 148, 74, 0, 511, 512, 5, 71, 0, 0, 512, 515, 3, 148, 74, 0, 513, 514, 5, 72, 0, 0, 514, 516, 5, 140, 0, 0, 515, 513, 1, 0, 0, 0, 515, 516, 1, 0, 0, 0, 516, 517, 1, 0, 0, 0, 517, 521, 5, 130, 0, 0, 518, 520, 3, 52, 26, 0, 519, 518, 1, 0, 0, 0, 520, 523, 1, 0, 0, 0, 521, 519, 1, 0, 0, 0, 521, 522, 1, 0, 0, 0, 522, 524, 1, 0, 0, 0, 523, 521, 1, 0, 0, 0, 524, 525, 5, 131, 0, 0, 525, 51, 1, 0, 0, 0, 526, 532, 3, 60, 30, 0, 527, 532, 3, 62, 31, 0, 528, 532, 3, 68, 34, 0, 529, 532, 3, 54, 27, 0, 530, 532, 3, 56, 28, 0, 531, 526, 1, 0, 0, 0, 531, 527, 1, 0, 0, 0, 531, 528, 1, 0, 0, 0, 531, 529, 1, 0, 0, 0, 531, 530, 1, 0, 0, 0, 532, 53, 1, 0, 0, 0, 533, 534, 5, 17, 0, 0, 534, 536, 3, 146, 73, 0, 535, 537, 3, 22, 11, 0, 536, 535, 1, 0, 0, 0, 536, 537, 1, 0, 0, 0, 537, 538, 1, 0, 0, 0, 538, 539, 5, 77, 0, 0, 539, 540, 3, 148, 74, 0, 540, 542, 5, 20, 0, 0, 541, 543, 5, 4, 0, 0, 542, 541, 1, 0, 0, 0, 542, 543, 1, 0, 0, 0, 543, 544, 1, 0, 0, 0, 544, 545, 3, 26, 13, 0, 545, 546, 5, 21, 0, 0, 546, 547, 3, 148, 74, 0, 547, 548, 5, 44, 0, 0, 548, 549, 3, 148, 74, 0, 549, 553, 5, 130, 0, 0, 550, 552, 3, 58, 29, 0, 551, 550, 1, 0, 0, 0, 552, 555, 1, 0, 0, 0, 553, 551, 1, 0, 0, 0, 553, 554, 1, 0, 0, 0, 554, 556, 1, 0, 0, 0, 555, 553, 1, 0, 0, 0, 556, 557, 5, 131, 0, 0, 557, 55, 1, 0, 0, 0, 558, 559, 5, 17, 0, 0, 559, 560, 3, 146, 73, 0, 560, 561, 5, 77, 0, 0, 561, 562, 3, 148, 74, 0, 562, 563, 5, 19, 0, 0, 563, 564, 3, 146, 73, 0, 564, 565, 3, 28, 14, 0, 565, 566, 5, 127, 0, 0, 566, 57, 1, 0, 0, 0, 567, 568, 5, 11, 0, 0, 568, 608, 5, 127, 0, 0, 569, 570, 5, 12, 0, 0, 570, 571, 5, 13, 0, 0, 571, 572, 3, 146, 73, 0, 572, 573, 5, 127, 0, 0, 573, 608, 1, 0, 0, 0, 574, 575, 5, 22, 0, 0, 575, 576, 3, 148, 74, 0, 576, 577, 5, 127, 0, 0, 577, 608, 1, 0, 0, 0, 578, 580, 5, 23, 0, 0, 579, 581, 5, 31, 0, 0, 580, 579, 1, 0, 0, 0, 580, 581, 1, 0, 0, 0, 581, 582, 1, 0, 0, 0, 582, 583, 3, 146, 73, 0, 583, 584, 5, 50, 0, 0, 584, 585, 3, 26, 13, 0, 585, 586, 5, 127, 0, 0, 586, 608, 1, 0, 0, 0, 587, 588, 5, 24, 0, 0, 588, 589, 3, 146, 73, 0, 589, 590, 5, 140, 0, 0, 590, 591, 5, 127, 0, 0, 591, 608, 1, 0, 0, 0, 592, 593, 5, 25, 0, 0, 593, 594, 3, 26, 13, 0, 594, 595, 5, 129, 0, 0, 595, 596, 3, 146, 73, 0, 596, 597, 3, 146, 73, 0, 597, 598, 3, 148, 74, 0, 598, 599, 5, 127, 0, 0, 599, 608, 1, 0, 0, 0, 600, 601, 5, 86, 0, 0, 601, 608, 5, 127, 0, 0, 602, 603, 5, 26, 0, 0, 603, 604, 5, 140, 0, 0, 604, 605, 3, 148, 74, 0, 605, 606, 5, 127, 0, 0, 606, 608, 1, 0, 0, 0, 607, 567, 1, 0, 0, 0, 607, 569, 1, 0, 0, 0, 607, 574, 1, 0, 0, 0, 607, 578, 1, 0, 0, 0, 607, 587, 1, 0, 0, 0, 607, 592, 1, 0, 0, 0, 607, 600, 1, 0, 0, 0, 607, 602, 1, 0, 0, 0, 608, 59, 1, 0, 0, 0, 609, 610, 5, 44, 0, 0, 610, 612, 3, 146, 73, 0, 611, 613, 3, 22, 11, 0, 612, 611, 1, 0, 0, 0, 612, 613, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 615, 5, 77, 0, 0, 615, 616, 3, 148, 74, 0, 616, 617, 5, 126, 0, 0, 617, 618, 3, 130, 65, 0, 618, 619, 5, 125, 0, 0, 619, 620, 3, 130, 65, 0, 620, 621, 5, 79, 0, 0, 621, 623, 3, 72, 36, 0, 622, 624, 3, 64, 32, 0, 623, 622, 1, 0, 0, 0, 623, 624, 1, 0, 0, 0, 624, 626, 1, 0, 0, 0, 625, 627, 3, 70, 35, 0, 626, 625, 1, 0, 0, 0, 626, 627, 1, 0, 0, 0, 627, 628, 1, 0, 0, 0, 628, 629, 5, 81, 0, 0, 629, 631, 3, 74, 37, 0, 630, 632, 3, 78, 39, 0, 631, 630, 1, 0, 0, 0, 631, 632, 1, 0, 0, 0, 632, 633, 1, 0, 0, 0, 633, 634, 5, 127, 0, 0, 634, 61, 1, 0, 0, 0, 635, 636, 5, 45, 0, 0, 636, 638, 3, 146, 73, 0, 637, 639, 3, 22, 11, 0, 638, 637, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 641, 5, 77, 0, 0, 641, 642, 3, 148, 74, 0, 642, 643, 5, 126, 0, 0, 643, 644, 3, 130, 65, 0, 644, 645, 5, 125, 0, 0, 645, 647, 3, 130, 65, 0, 646, 648, 3, 64, 32, 0, 647, 646, 1, 0, 0, 0, 647, 648, 1, 0, 0, 0, 648, 650, 1, 0, 0, 0, 649, 651, 3, 78, 39, 0, 650, 649, 1, 0, 0, 0, 650, 651, 1, 0, 0, 0, 651, 652, 1, 0, 0, 0, 652, 653, 5, 127, 0, 0, 653, 63, 1, 0, 0, 0, 654, 655, 5, 5, 0, 0, 655, 664, 5, 8, 0, 0, 656, 657, 5, 5, 0, 0, 657, 658, 7, 1, 0, 0, 658, 659, 5, 9, 0, 0, 659, 660, 5, 132, 0, 0, 660, 661, 3, 76, 38, 0, 661, 662, 5, 133, 0, 0, 662, 664, 1, 0, 0, 0, 663, 654, 1, 0, 0, 0, 663, 656, 1, 0, 0, 0, 664, 65, 1, 0, 0, 0, 665, 666, 5, 60, 0, 0, 666, 667, 5, 132, 0, 0, 667, 672, 3, 114, 57, 0, 668, 669, 5, 128, 0, 0, 669, 671, 3, 114, 57, 0, 670, 668, 1, 0, 0, 0, 671, 674, 1, 0, 0, 0, 672, 670, 1, 0, 0, 0, 672, 673, 1, 0, 0, 0, 673, 675, 1, 0, 0, 0, 674, 672, 1, 0, 0, 0, 675, 676, 5, 133, 0, 0, 676, 67, 1, 0, 0, 0, 677, 678, 5, 46, 0, 0, 678, 679, 3, 146, 73, 0, 679, 680, 5, 77, 0, 0, 680, 681, 3, 148, 74, 0, 681, 682, 5, 47, 0, 0, 682, 683, 3, 146, 73, 0, 683, 684, 5, 126, 0, 0, 684, 686, 3, 130, 65, 0, 685, 687, 3, 78, 39, 0, 686, 685, 1, 0, 0, 0, 686, 687, 1, 0, 0, 0, 687, 688, 1, 0, 0, 0, 688, 689, 5, 127, 0, 0, 689, 69, 1, 0, 0, 0, 690, 691, 5, 80, 0, 0, 691, 692, 3, 130, 65, 0, 692, 71, 1, 0, 0, 0, 693, 694, 7, 2, 0, 0, 694, 73, 1, 0, 0, 0, 695, 714, 5, 83, 0, 0, 696, 697, 5, 38, 0, 0, 697, 714, 3, 146, 73, 0, 698, 699, 5, 31, 0, 0, 699, 714, 3, 146, 73, 0, 700, 701, 5, 40, 0, 0, 701, 710, 5, 132, 0, 0, 702, 707, 3, 26, 13, 0, 703, 704, 5, 128, 0, 0, 704, 706, 3, 26, 13, 0, 705, 703, 1, 0, 0, 0, 706, 709, 1, 0, 0, 0, 707, 705, 1, 0, 0, 0, 707, 708, 1, 0, 0, 0, 708, 711, 1, 0, 0, 0, 709, 707, 1, 0, 0, 0, 710, 702, 1, 0, 0, 0, 710, 711, 1, 0, 0, 0, 711, 712, 1, 0, 0, 0, 712, 714, 5, 133, 0, 0, 713, 695, 1, 0, 0, 0, 713, 696, 1, 0, 0, 0, 713, 698, 1, 0, 0, 0, 713, 700, 1, 0, 0, 0, 714, 75, 1, 0, 0, 0, 715, 720, 3, 146, 73, 0, 716, 717, 5, 128, 0, 0, 717, 719, 3, 146, 73, 0, 718, 716, 1, 0, 0, 0, 719, 722, 1, 0, 0, 0, 720, 718, 1, 0, 0, 0, 720, 721, 1, 0, 0, 0, 721, 77, 1, 0, 0, 0, 722, 720, 1, 0, 0, 0, 723, 724, 5, 82, 0, 0, 724, 728, 5, 130, 0, 0, 725, 727, 3, 80, 40, 0, 726, 725, 1, 0, 0, 0, 727, 730, 1, 0, 0, 0, 728, 726, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 731, 1, 0, 0, 0, 730, 728, 1, 0, 0, 0, 731, 732, 5, 131, 0, 0, 732, 79, 1, 0, 0, 0, 733, 734, 5, 18, 0, 0, 734, 735, 3, 146, 73, 0, 735, 736, 5, 77, 0, 0, 736, 737, 3, 148, 74, 0, 737, 738, 5, 132, 0, 0, 738, 739, 3, 76, 38, 0, 739, 740, 5, 133, 0, 0, 740, 741, 5, 127, 0, 0, 741, 808, 1, 0, 0, 0, 742, 743, 5, 56, 0, 0, 743, 744, 3, 146, 73, 0, 744, 745, 5, 77, 0, 0, 745, 746, 3, 148, 74, 0, 746, 747, 5, 126, 0, 0, 747, 748, 3, 130, 65, 0, 748, 749, 3, 82, 41, 0, 749, 750, 5, 127, 0, 0, 750, 808, 1, 0, 0, 0, 751, 752, 5, 57, 0, 0, 752, 753, 3, 146, 73, 0, 753, 754, 5, 77, 0, 0, 754, 755, 3, 148, 74, 0, 755, 756, 5, 126, 0, 0, 756, 757, 3, 136, 68, 0, 757, 758, 3, 48, 24, 0, 758, 759, 3, 82, 41, 0, 759, 760, 5, 127, 0, 0, 760, 808, 1, 0, 0, 0, 761, 762, 5, 39, 0, 0, 762, 763, 3, 146, 73, 0, 763, 764, 5, 77, 0, 0, 764, 765, 3, 148, 74, 0, 765, 766, 5, 126, 0, 0, 766, 768, 3, 146, 73, 0, 767, 769, 3, 28, 14, 0, 768, 767, 1, 0, 0, 0, 768, 769, 1, 0, 0, 0, 769, 771, 1, 0, 0, 0, 770, 772, 3, 66, 33, 0, 771, 770, 1, 0, 0, 0, 771, 772, 1, 0, 0, 0, 772, 773, 1, 0, 0, 0, 773, 774, 5, 127, 0, 0, 774, 808, 1, 0, 0, 0, 775, 776, 5, 2, 0, 0, 776, 777, 3, 146, 73, 0, 777, 778, 5, 77, 0, 0, 778, 779, 3, 148, 74, 0, 779, 780, 5, 126, 0, 0, 780, 781, 3, 146, 73, 0, 781, 782, 5, 48, 0, 0, 782, 783, 3, 130, 65, 0, 783, 784, 5, 127, 0, 0, 784, 808, 1, 0, 0, 0, 785, 786, 5, 46, 0, 0, 786, 787, 3, 146, 73, 0, 787, 788, 5, 77, 0, 0, 788, 789, 3, 148, 74, 0, 789, 790, 5, 126, 0, 0, 790, 793, 3, 146, 73, 0, 791, 792, 5, 48, 0, 0, 792, 794, 3, 130, 65, 0, 793, 791, 1, 0, 0, 0, 793, 794, 1, 0, 0, 0, 794, 795, 1, 0, 0, 0, 795, 796, 5, 127, 0, 0, 796, 808, 1, 0, 0, 0, 797, 798, 5, 17, 0, 0, 798, 799, 3, 146, 73, 0, 799, 800, 5, 77, 0, 0, 800, 801, 3, 148, 74, 0, 801, 802, 5, 126, 0, 0, 802, 803, 3, 146, 73, 0, 803, 804, 5, 129, 0, 0, 804, 805, 3, 146, 73, 0, 805, 806, 5, 127, 0, 0, 806, 808, 1, 0, 0, 0, 807, 733, 1, 0, 0, 0, 807, 742, 1, 0, 0, 0, 807, 751, 1, 0, 0, 0, 807, 761, 1, 0, 0, 0, 807, 775, 1, 0, 0, 0, 807, 785, 1, 0, 0, 0, 807, 797, 1, 0, 0, 0, 808, 81, 1, 0, 0, 0, 809, 810, 5, 132, 0, 0, 810, 815, 3, 84, 42, 0, 811, 812, 5, 128, 0, 0, 812, 814, 3, 84, 42, 0, 813, 811, 1, 0, 0, 0, 814, 817, 1, 0, 0, 0, 815, 813, 1, 0, 0, 0, 815, 816, 1, 0, 0, 0, 816, 818, 1, 0, 0, 0, 817, 815, 1, 0, 0, 0, 818, 819, 5, 133, 0, 0, 819, 83, 1, 0, 0, 0, 820, 821, 7, 3, 0, 0, 821, 85, 1, 0, 0, 0, 822, 823, 5, 55, 0, 0, 823, 824, 3, 88, 44, 0, 824, 87, 1, 0, 0, 0, 825, 828, 3, 90, 45, 0, 826, 828, 3, 94, 47, 0, 827, 825, 1, 0, 0, 0, 827, 826, 1, 0, 0, 0, 828, 89, 1, 0, 0, 0, 829, 830, 5, 56, 0, 0, 830, 831, 3, 146, 73, 0, 831, 832, 5, 77, 0, 0, 832, 833, 3, 148, 74, 0, 833, 834, 5, 65, 0, 0, 834, 835, 3, 146, 73, 0, 835, 836, 5, 126, 0, 0, 836, 837, 3, 130, 65, 0, 837, 838, 5, 66, 0, 0, 838, 841, 3, 92, 46, 0, 839, 840, 5, 67, 0, 0, 840, 842, 3, 138, 69, 0, 841, 839, 1, 0, 0, 0, 841, 842, 1, 0, 0, 0, 842, 843, 1, 0, 0, 0, 843, 844, 5, 127, 0, 0, 844, 91, 1, 0, 0, 0, 845, 852, 5, 99, 0, 0, 846, 847, 5, 100, 0, 0, 847, 848, 5, 134, 0, 0, 848, 849, 3, 130, 65, 0, 849, 850, 5, 135, 0, 0, 850, 852, 1, 0, 0, 0, 851, 845, 1, 0, 0, 0, 851, 846, 1, 0, 0, 0, 852, 93, 1, 0, 0, 0, 853, 854, 5, 57, 0, 0, 854, 855, 3, 146, 73, 0, 855, 856, 5, 77, 0, 0, 856, 857, 3, 148, 74, 0, 857, 858, 5, 130, 0, 0, 858, 859, 3, 96, 48, 0, 859, 860, 3, 96, 48, 0, 860, 861, 5, 131, 0, 0, 861, 95, 1, 0, 0, 0, 862, 863, 3, 48, 24, 0, 863, 864, 5, 58, 0, 0, 864, 865, 3, 146, 73, 0, 865, 866, 5, 77, 0, 0, 866, 867, 3, 148, 74, 0, 867, 869, 3, 136, 68, 0, 868, 870, 5, 105, 0, 0, 869, 868, 1, 0, 0, 0, 869, 870, 1, 0, 0, 0, 870, 873, 1, 0, 0, 0, 871, 872, 5, 73, 0, 0, 872, 874, 3, 148, 74, 0, 873, 871, 1, 0, 0, 0, 873, 874, 1, 0, 0, 0, 874, 876, 1, 0, 0, 0, 875, 877, 5, 74, 0, 0, 876, 875, 1, 0, 0, 0, 876, 877, 1, 0, 0, 0, 877, 880, 1, 0, 0, 0, 878, 879, 5, 75, 0, 0, 879, 881, 3, 148, 74, 0, 880, 878, 1, 0, 0, 0, 880, 881, 1, 0, 0, 0, 881, 883, 1, 0, 0, 0, 882, 884, 5, 76, 0, 0, 883, 882, 1, 0, 0, 0, 883, 884, 1, 0, 0, 0, 884, 885, 1, 0, 0, 0, 885, 886, 5, 127, 0, 0, 886, 97, 1, 0, 0, 0, 887, 888, 5, 49, 0, 0, 888, 889, 3, 146, 73, 0, 889, 890, 5, 50, 0, 0, 890, 892, 3, 146, 73, 0, 891, 893, 3, 28, 14, 0, 892, 891, 1, 0, 0, 0, 892, 893, 1, 0, 0, 0, 893, 896, 1, 0, 0, 0, 894, 895, 5, 77, 0, 0, 895, 897, 3, 148, 74, 0, 896, 894, 1, 0, 0, 0, 896, 897, 1, 0, 0, 0, 897, 900, 1, 0, 0, 0, 898, 899, 5, 72, 0, 0, 899, 901, 5, 140, 0, 0, 900, 898, 1, 0, 0, 0, 900, 901, 1, 0, 0, 0, 901, 902, 1, 0, 0, 0, 902, 906, 5, 130, 0, 0, 903, 905, 3, 100, 50, 0, 904, 903, 1, 0, 0, 0, 905, 908, 1, 0, 0, 0, 906, 904, 1, 0, 0, 0, 906, 907, 1, 0, 0, 0, 907, 909, 1, 0, 0, 0, 908, 906, 1, 0, 0, 0, 909, 910, 5, 131, 0, 0, 910, 99, 1, 0, 0, 0, 911, 912, 5, 54, 0, 0, 912, 918, 3, 88, 44, 0, 913, 918, 3, 112, 56, 0, 914, 918, 3, 108, 54, 0, 915, 918, 3, 102, 51, 0, 916, 918, 3, 110, 55, 0, 917, 911, 1, 0, 0, 0, 917, 913, 1, 0, 0, 0, 917, 914, 1, 0, 0, 0, 917, 915, 1, 0, 0, 0, 917, 916, 1, 0, 0, 0, 918, 101, 1, 0, 0, 0, 919, 920, 5, 3, 0, 0, 920, 924, 5, 130, 0, 0, 921, 923, 3, 104, 52, 0, 922, 921, 1, 0, 0, 0, 923, 926, 1, 0, 0, 0, 924, 922, 1, 0, 0, 0, 924, 925, 1, 0, 0, 0, 925, 927, 1, 0, 0, 0, 926, 924, 1, 0, 0, 0, 927, 928, 5, 131, 0, 0, 928, 929, 5, 127, 0, 0, 929, 103, 1, 0, 0, 0, 930, 931, 3, 146, 73, 0, 931, 932, 5, 53, 0, 0, 932, 933, 5, 56, 0, 0, 933, 934, 3, 146, 73, 0, 934, 935, 5, 127, 0, 0, 935, 945, 1, 0, 0, 0, 936, 937, 3, 146, 73, 0, 937, 938, 5, 53, 0, 0, 938, 939, 5, 57, 0, 0, 939, 940, 3, 146, 73, 0, 940, 941, 5, 129, 0, 0, 941, 942, 3, 146, 73, 0, 942, 943, 5, 127, 0, 0, 943, 945, 1, 0, 0, 0, 944, 930, 1, 0, 0, 0, 944, 936, 1, 0, 0, 0, 945, 105, 1, 0, 0, 0, 946, 947, 3, 26, 13, 0, 947, 948, 5, 13, 0, 0, 948, 953, 5, 48, 0, 0, 949, 950, 5, 129, 0, 0, 950, 952, 3, 146, 73, 0, 951, 949, 1, 0, 0, 0, 952, 955, 1, 0, 0, 0, 953, 951, 1, 0, 0, 0, 953, 954, 1, 0, 0, 0, 954, 956, 1, 0, 0, 0, 955, 953, 1, 0, 0, 0, 956, 957, 5, 127, 0, 0, 957, 107, 1, 0, 0, 0, 958, 959, 5, 51, 0, 0, 959, 960, 3, 146, 73, 0, 960, 961, 5, 53, 0, 0, 961, 962, 5, 56, 0, 0, 962, 963, 3, 146, 73, 0, 963, 964, 5, 127, 0, 0, 964, 109, 1, 0, 0, 0, 965, 966, 5, 62, 0, 0, 966, 967, 3, 146, 73, 0, 967, 968, 5, 63, 0, 0, 968, 969, 5, 64, 0, 0, 969, 970, 5, 60, 0, 0, 970, 971, 5, 46, 0, 0, 971, 972, 3, 146, 73, 0, 972, 973, 5, 61, 0, 0, 973, 974, 5, 57, 0, 0, 974, 975, 3, 146, 73, 0, 975, 976, 5, 129, 0, 0, 976, 977, 3, 146, 73, 0, 977, 978, 5, 127, 0, 0, 978, 111, 1, 0, 0, 0, 979, 980, 5, 51, 0, 0, 980, 981, 3, 114, 57, 0, 981, 982, 5, 53, 0, 0, 982, 985, 3, 118, 59, 0, 983, 984, 5, 29, 0, 0, 984, 986, 3, 148, 74, 0, 985, 983, 1, 0, 0, 0, 985, 986, 1, 0, 0, 0, 986, 987, 1, 0, 0, 0, 987, 988, 5, 127, 0, 0, 988, 113, 1, 0, 0, 0, 989, 990, 3, 146, 73, 0, 990, 991, 5, 129, 0, 0, 991, 992, 3, 116, 58, 0, 992, 115, 1, 0, 0, 0, 993, 1006, 3, 146, 73, 0, 994, 1006, 5, 94, 0, 0, 995, 1006, 5, 84, 0, 0, 996, 1006, 5, 85, 0, 0, 997, 1006, 5, 1, 0, 0, 998, 1006, 5, 91, 0, 0, 999, 1006, 5, 92, 0, 0, 1000, 1006, 5, 93, 0, 0, 1001, 1006, 5, 95, 0, 0, 1002, 1006, 5, 96, 0, 0, 1003, 1006, 5, 97, 0, 0, 1004, 1006, 5, 98, 0, 0, 1005, 993, 1, 0, 0, 0, 1005, 994, 1, 0, 0, 0, 1005, 995, 1, 0, 0, 0, 1005, 996, 1, 0, 0, 0, 1005, 997, 1, 0, 0, 0, 1005, 998, 1, 0, 0, 0, 1005, 999, 1, 0, 0, 0, 1005, 1000, 1, 0, 0, 0, 1005, 1001, 1, 0, 0, 0, 1005, 1002, 1, 0, 0, 0, 1005, 1003, 1, 0, 0, 0, 1005, 1004, 1, 0, 0, 0, 1006, 117, 1, 0, 0, 0, 1007, 1008, 5, 56, 0, 0, 1008, 1009, 3, 146, 73, 0, 1009, 1010, 5, 129, 0, 0, 1010, 1011, 3, 120, 60, 0, 1011, 1038, 1, 0, 0, 0, 1012, 1013, 5, 57, 0, 0, 1013, 1014, 3, 146, 73, 0, 1014, 1015, 5, 129, 0, 0, 1015, 1016, 3, 146, 73, 0, 1016, 1017, 5, 129, 0, 0, 1017, 1018, 3, 122, 61, 0, 1018, 1038, 1, 0, 0, 0, 1019, 1020, 5, 39, 0, 0, 1020, 1022, 3, 146, 73, 0, 1021, 1023, 3, 28, 14, 0, 1022, 1021, 1, 0, 0, 0, 1022, 1023, 1, 0, 0, 0, 1023, 1024, 1, 0, 0, 0, 1024, 1025, 5, 129, 0, 0, 1025, 1026, 3, 114, 57, 0, 1026, 1038, 1, 0, 0, 0, 1027, 1028, 5, 41, 0, 0, 1028, 1029, 3, 146, 73, 0, 1029, 1030, 5, 129, 0, 0, 1030, 1032, 3, 146, 73, 0, 1031, 1033, 3, 28, 14, 0, 1032, 1031, 1, 0, 0, 0, 1032, 1033, 1, 0, 0, 0, 1033, 1035, 1, 0, 0, 0, 1034, 1036, 3, 124, 62, 0, 1035, 1034, 1, 0, 0, 0, 1035, 1036, 1, 0, 0, 0, 1036, 1038, 1, 0, 0, 0, 1037, 1007, 1, 0, 0, 0, 1037, 1012, 1, 0, 0, 0, 1037, 1019, 1, 0, 0, 0, 1037, 1027, 1, 0, 0, 0, 1038, 119, 1, 0, 0, 0, 1039, 1040, 7, 4, 0, 0, 1040, 121, 1, 0, 0, 0, 1041, 1042, 7, 5, 0, 0, 1042, 123, 1, 0, 0, 0, 1043, 1044, 5, 59, 0, 0, 1044, 1048, 5, 130, 0, 0, 1045, 1047, 3, 126, 63, 0, 1046, 1045, 1, 0, 0, 0, 1047, 1050, 1, 0, 0, 0, 1048, 1046, 1, 0, 0, 0, 1048, 1049, 1, 0, 0, 0, 1049, 1051, 1, 0, 0, 0, 1050, 1048, 1, 0, 0, 0, 1051, 1052, 5, 131, 0, 0, 1052, 125, 1, 0, 0, 0, 1053, 1054, 3, 146, 73, 0, 1054, 1055, 5, 53, 0, 0, 1055, 1056, 5, 4, 0, 0, 1056, 1057, 5, 18, 0, 0, 1057, 1058, 5, 132, 0, 0, 1058, 1059, 3, 76, 38, 0, 1059, 1060, 5, 133, 0, 0, 1060, 1061, 5, 127, 0, 0, 1061, 1150, 1, 0, 0, 0, 1062, 1063, 3, 146, 73, 0, 1063, 1064, 5, 53, 0, 0, 1064, 1065, 5, 56, 0, 0, 1065, 1072, 3, 146, 73, 0, 1066, 1067, 5, 61, 0, 0, 1067, 1068, 5, 57, 0, 0, 1068, 1069, 3, 146, 73, 0, 1069, 1070, 5, 129, 0, 0, 1070, 1071, 3, 146, 73, 0, 1071, 1073, 1, 0, 0, 0, 1072, 1066, 1, 0, 0, 0, 1072, 1073, 1, 0, 0, 0, 1073, 1074, 1, 0, 0, 0, 1074, 1075, 5, 127, 0, 0, 1075, 1150, 1, 0, 0, 0, 1076, 1077, 3, 146, 73, 0, 1077, 1078, 5, 53, 0, 0, 1078, 1079, 5, 57, 0, 0, 1079, 1080, 3, 146, 73, 0, 1080, 1081, 5, 129, 0, 0, 1081, 1088, 3, 146, 73, 0, 1082, 1083, 5, 61, 0, 0, 1083, 1084, 5, 57, 0, 0, 1084, 1085, 3, 146, 73, 0, 1085, 1086, 5, 129, 0, 0, 1086, 1087, 3, 146, 73, 0, 1087, 1089, 1, 0, 0, 0, 1088, 1082, 1, 0, 0, 0, 1088, 1089, 1, 0, 0, 0, 1089, 1090, 1, 0, 0, 0, 1090, 1091, 5, 127, 0, 0, 1091, 1150, 1, 0, 0, 0, 1092, 1093, 3, 146, 73, 0, 1093, 1094, 5, 53, 0, 0, 1094, 1095, 5, 39, 0, 0, 1095, 1097, 3, 146, 73, 0, 1096, 1098, 3, 28, 14, 0, 1097, 1096, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1105, 1, 0, 0, 0, 1099, 1100, 5, 61, 0, 0, 1100, 1101, 5, 57, 0, 0, 1101, 1102, 3, 146, 73, 0, 1102, 1103, 5, 129, 0, 0, 1103, 1104, 3, 146, 73, 0, 1104, 1106, 1, 0, 0, 0, 1105, 1099, 1, 0, 0, 0, 1105, 1106, 1, 0, 0, 0, 1106, 1107, 1, 0, 0, 0, 1107, 1108, 5, 127, 0, 0, 1108, 1150, 1, 0, 0, 0, 1109, 1110, 3, 146, 73, 0, 1110, 1111, 5, 53, 0, 0, 1111, 1112, 5, 2, 0, 0, 1112, 1113, 3, 146, 73, 0, 1113, 1114, 5, 59, 0, 0, 1114, 1118, 5, 130, 0, 0, 1115, 1117, 3, 106, 53, 0, 1116, 1115, 1, 0, 0, 0, 1117, 1120, 1, 0, 0, 0, 1118, 1116, 1, 0, 0, 0, 1118, 1119, 1, 0, 0, 0, 1119, 1121, 1, 0, 0, 0, 1120, 1118, 1, 0, 0, 0, 1121, 1122, 5, 131, 0, 0, 1122, 1123, 5, 127, 0, 0, 1123, 1150, 1, 0, 0, 0, 1124, 1125, 3, 146, 73, 0, 1125, 1126, 5, 53, 0, 0, 1126, 1127, 5, 46, 0, 0, 1127, 1128, 3, 146, 73, 0, 1128, 1129, 5, 127, 0, 0, 1129, 1150, 1, 0, 0, 0, 1130, 1131, 3, 146, 73, 0, 1131, 1133, 5, 53, 0, 0, 1132, 1134, 5, 4, 0, 0, 1133, 1132, 1, 0, 0, 0, 1133, 1134, 1, 0, 0, 0, 1134, 1135, 1, 0, 0, 0, 1135, 1136, 5, 17, 0, 0, 1136, 1137, 3, 146, 73, 0, 1137, 1138, 5, 129, 0, 0, 1138, 1145, 3, 146, 73, 0, 1139, 1140, 5, 61, 0, 0, 1140, 1141, 5, 57, 0, 0, 1141, 1142, 3, 146, 73, 0, 1142, 1143, 5, 129, 0, 0, 1143, 1144, 3, 146, 73, 0, 1144, 1146, 1, 0, 0, 0, 1145, 1139, 1, 0, 0, 0, 1145, 1146, 1, 0, 0, 0, 1146, 1147, 1, 0, 0, 0, 1147, 1148, 5, 127, 0, 0, 1148, 1150, 1, 0, 0, 0, 1149, 1053, 1, 0, 0, 0, 1149, 1062, 1, 0, 0, 0, 1149, 1076, 1, 0, 0, 0, 1149, 1092, 1, 0, 0, 0, 1149, 1109, 1, 0, 0, 0, 1149, 1124, 1, 0, 0, 0, 1149, 1130, 1, 0, 0, 0, 1150, 127, 1, 0, 0, 0, 1151, 1152, 5, 46, 0, 0, 1152, 1153, 3, 146, 73, 0, 1153, 1154, 5, 53, 0, 0, 1154, 1155, 3, 146, 73, 0, 1155, 1156, 5, 129, 0, 0, 1156, 1158, 3, 146, 73, 0, 1157, 1159, 3, 124, 62, 0, 1158, 1157, 1, 0, 0, 0, 1158, 1159, 1, 0, 0, 0, 1159, 1160, 1, 0, 0, 0, 1160, 1161, 5, 127, 0, 0, 1161, 129, 1, 0, 0, 0, 1162, 1209, 3, 134, 67, 0, 1163, 1209, 5, 106, 0, 0, 1164, 1209, 5, 107, 0, 0, 1165, 1166, 5, 108, 0, 0, 1166, 1209, 3, 148, 74, 0, 1167, 1168, 5, 109, 0, 0, 1168, 1169, 5, 136, 0, 0, 1169, 1170, 3, 146, 73, 0, 1170, 1171, 5, 137, 0, 0, 1171, 1209, 1, 0, 0, 0, 1172, 1173, 5, 110, 0, 0, 1173, 1174, 5, 136, 0, 0, 1174, 1176, 3, 146, 73, 0, 1175, 1177, 3, 28, 14, 0, 1176, 1175, 1, 0, 0, 0, 1176, 1177, 1, 0, 0, 0, 1177, 1178, 1, 0, 0, 0, 1178, 1179, 5, 137, 0, 0, 1179, 1209, 1, 0, 0, 0, 1180, 1181, 5, 34, 0, 0, 1181, 1182, 5, 136, 0, 0, 1182, 1183, 3, 146, 73, 0, 1183, 1184, 5, 137, 0, 0, 1184, 1209, 1, 0, 0, 0, 1185, 1186, 5, 111, 0, 0, 1186, 1187, 5, 136, 0, 0, 1187, 1188, 3, 130, 65, 0, 1188, 1189, 5, 137, 0, 0, 1189, 1209, 1, 0, 0, 0, 1190, 1191, 5, 112, 0, 0, 1191, 1192, 5, 136, 0, 0, 1192, 1193, 3, 130, 65, 0, 1193, 1194, 5, 137, 0, 0, 1194, 1209, 1, 0, 0, 0, 1195, 1196, 5, 113, 0, 0, 1196, 1200, 5, 130, 0, 0, 1197, 1199, 3, 132, 66, 0, 1198, 1197, 1, 0, 0, 0, 1199, 1202, 1, 0, 0, 0, 1200, 1198, 1, 0, 0, 0, 1200, 1201, 1, 0, 0, 0, 1201, 1203, 1, 0, 0, 0, 1202, 1200, 1, 0, 0, 0, 1203, 1209, 5, 131, 0, 0, 1204, 1206, 3, 146, 73, 0, 1205, 1207, 3, 28, 14, 0, 1206, 1205, 1, 0, 0, 0, 1206, 1207, 1, 0, 0, 0, 1207, 1209, 1, 0, 0, 0, 1208, 1162, 1, 0, 0, 0, 1208, 1163, 1, 0, 0, 0, 1208, 1164, 1, 0, 0, 0, 1208, 1165, 1, 0, 0, 0, 1208, 1167, 1, 0, 0, 0, 1208, 1172, 1, 0, 0, 0, 1208, 1180, 1, 0, 0, 0, 1208, 1185, 1, 0, 0, 0, 1208, 1190, 1, 0, 0, 0, 1208, 1195, 1, 0, 0, 0, 1208, 1204, 1, 0, 0, 0, 1209, 131, 1, 0, 0, 0, 1210, 1211, 3, 146, 73, 0, 1211, 1212, 5, 126, 0, 0, 1212, 1213, 3, 130, 65, 0, 1213, 1214, 5, 127, 0, 0, 1214, 133, 1, 0, 0, 0, 1215, 1216, 7, 6, 0, 0, 1216, 135, 1, 0, 0, 0, 1217, 1218, 7, 7, 0, 0, 1218, 137, 1, 0, 0, 0, 1219, 1228, 3, 148, 74, 0, 1220, 1228, 5, 140, 0, 0, 1221, 1228, 5, 141, 0, 0, 1222, 1228, 5, 122, 0, 0, 1223, 1228, 5, 123, 0, 0, 1224, 1228, 5, 124, 0, 0, 1225, 1228, 3, 140, 70, 0, 1226, 1228, 3, 144, 72, 0, 1227, 1219, 1, 0, 0, 0, 1227, 1220, 1, 0, 0, 0, 1227, 1221, 1, 0, 0, 0, 1227, 1222, 1, 0, 0, 0, 1227, 1223, 1, 0, 0, 0, 1227, 1224, 1, 0, 0, 0, 1227, 1225, 1, 0, 0, 0, 1227, 1226, 1, 0, 0, 0, 1228, 139, 1, 0, 0, 0, 1229, 1238, 5, 130, 0, 0, 1230, 1235, 3, 142, 71, 0, 1231, 1232, 5, 128, 0, 0, 1232, 1234, 3, 142, 71, 0, 1233, 1231, 1, 0, 0, 0, 1234, 1237, 1, 0, 0, 0, 1235, 1233, 1, 0, 0, 0, 1235, 1236, 1, 0, 0, 0, 1236, 1239, 1, 0, 0, 0, 1237, 1235, 1, 0, 0, 0, 1238, 1230, 1, 0, 0, 0, 1238, 1239, 1, 0, 0, 0, 1239, 1240, 1, 0, 0, 0, 1240, 1241, 5, 131, 0, 0, 1241, 141, 1, 0, 0, 0, 1242, 1243, 3, 148, 74, 0, 1243, 1244, 5, 126, 0, 0, 1244, 1245, 3, 138, 69, 0, 1245, 143, 1, 0, 0, 0, 1246, 1255, 5, 132, 0, 0, 1247, 1252, 3, 138, 69, 0, 1248, 1249, 5, 128, 0, 0, 1249, 1251, 3, 138, 69, 0, 1250, 1248, 1, 0, 0, 0, 1251, 1254, 1, 0, 0, 0, 1252, 1250, 1, 0, 0, 0, 1252, 1253, 1, 0, 0, 0, 1253, 1256, 1, 0, 0, 0, 1254, 1252, 1, 0, 0, 0, 1255, 1247, 1, 0, 0, 0, 1255, 1256, 1, 0, 0, 0, 1256, 1257, 1, 0, 0, 0, 1257, 1258, 5, 133, 0, 0, 1258, 145, 1, 0, 0, 0, 1259, 1260, 7, 8, 0, 0, 1260, 147, 1, 0, 0, 0, 1261, 1262, 5, 143, 0, 0, 1262, 149, 1, 0, 0, 0, 111, 162, 169, 190, 202, 214, 234, 242, 249, 255, 267, 270, 276, 287, 296, 306, 309, 311, 315, 323, 335, 340, 349, 352, 367, 373, 385, 394, 402, 410, 423, 426, 436, 440, 446, 453, 459, 467, 475, 488, 495, 499, 504, 515, 521, 531, 536, 542, 553, 580, 607, 612, 623, 626, 631, 638, 647, 650, 663, 672, 686, 707, 710, 713, 720, 728, 768, 771, 793, 807, 815, 827, 841, 851, 869, 873, 876, 880, 883, 892, 896, 900, 906, 917, 924, 944, 953, 985, 1005, 1022, 1032, 1035, 1037, 1048, 1072, 1088, 1097, 1105, 1118, 1133, 1145, 1149, 1158, 1176, 1200, 1206, 1208, 1227, 1235, 1238, 1252, 1255] \ No newline at end of file +[4, 1, 147, 1284, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 167, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 172, 8, 1, 10, 1, 12, 1, 175, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 193, 8, 3, 10, 3, 12, 3, 196, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 207, 8, 4, 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, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 239, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 247, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 252, 8, 10, 10, 10, 12, 10, 255, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 260, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 270, 8, 10, 10, 10, 12, 10, 273, 9, 10, 3, 10, 275, 8, 10, 1, 10, 1, 10, 5, 10, 279, 8, 10, 10, 10, 12, 10, 282, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 290, 8, 11, 10, 11, 12, 11, 293, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 301, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 309, 8, 12, 10, 12, 12, 12, 312, 9, 12, 3, 12, 314, 8, 12, 3, 12, 316, 8, 12, 1, 13, 1, 13, 3, 13, 320, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 326, 8, 14, 10, 14, 12, 14, 329, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 340, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 345, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 354, 8, 17, 1, 18, 3, 18, 357, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 372, 8, 18, 1, 18, 1, 18, 1, 18, 1, 19, 3, 19, 378, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 388, 8, 19, 10, 19, 12, 19, 391, 9, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 399, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 407, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 415, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 428, 8, 20, 1, 21, 3, 21, 431, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 441, 8, 21, 1, 21, 1, 21, 3, 21, 445, 8, 21, 1, 21, 1, 21, 5, 21, 449, 8, 21, 10, 21, 12, 21, 452, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 458, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 464, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 472, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 480, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 493, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 500, 8, 24, 1, 24, 1, 24, 3, 24, 504, 8, 24, 1, 25, 5, 25, 507, 8, 25, 10, 25, 12, 25, 510, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 520, 8, 25, 1, 25, 1, 25, 5, 25, 524, 8, 25, 10, 25, 12, 25, 527, 9, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 536, 8, 26, 1, 27, 1, 27, 1, 27, 3, 27, 541, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 547, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 556, 8, 27, 10, 27, 12, 27, 559, 9, 27, 1, 27, 1, 27, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 585, 8, 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, 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, 3, 29, 612, 8, 29, 1, 30, 1, 30, 1, 30, 3, 30, 617, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 628, 8, 30, 1, 30, 3, 30, 631, 8, 30, 1, 30, 1, 30, 1, 30, 3, 30, 636, 8, 30, 1, 30, 3, 30, 639, 8, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 3, 31, 646, 8, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 655, 8, 31, 1, 31, 3, 31, 658, 8, 31, 1, 31, 3, 31, 661, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 678, 8, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 685, 8, 34, 10, 34, 12, 34, 688, 9, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 701, 8, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 720, 8, 38, 10, 38, 12, 38, 723, 9, 38, 3, 38, 725, 8, 38, 1, 38, 3, 38, 728, 8, 38, 1, 39, 1, 39, 1, 39, 5, 39, 733, 8, 39, 10, 39, 12, 39, 736, 9, 39, 1, 40, 1, 40, 1, 40, 5, 40, 741, 8, 40, 10, 40, 12, 40, 744, 9, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 783, 8, 41, 1, 41, 3, 41, 786, 8, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 808, 8, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 822, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 828, 8, 42, 10, 42, 12, 42, 831, 9, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 3, 45, 842, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 856, 8, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 866, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 884, 8, 49, 1, 49, 1, 49, 3, 49, 888, 8, 49, 1, 49, 3, 49, 891, 8, 49, 1, 49, 1, 49, 3, 49, 895, 8, 49, 1, 49, 3, 49, 898, 8, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 907, 8, 50, 1, 50, 1, 50, 3, 50, 911, 8, 50, 1, 50, 1, 50, 3, 50, 915, 8, 50, 1, 50, 1, 50, 5, 50, 919, 8, 50, 10, 50, 12, 50, 922, 9, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 932, 8, 51, 1, 52, 1, 52, 1, 52, 5, 52, 937, 8, 52, 10, 52, 12, 52, 940, 9, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 959, 8, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 5, 54, 966, 8, 54, 10, 54, 12, 54, 969, 9, 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, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 1000, 8, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 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, 1020, 8, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1037, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1047, 8, 60, 1, 60, 3, 60, 1050, 8, 60, 1, 60, 3, 60, 1053, 8, 60, 3, 60, 1055, 8, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 5, 64, 1067, 8, 64, 10, 64, 12, 64, 1070, 9, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1093, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1109, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1118, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1126, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 5, 65, 1137, 8, 65, 10, 65, 12, 65, 1140, 9, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1154, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1166, 8, 65, 1, 65, 1, 65, 3, 65, 1170, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1179, 8, 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, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1197, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 5, 67, 1219, 8, 67, 10, 67, 12, 67, 1222, 9, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1227, 8, 67, 3, 67, 1229, 8, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1248, 8, 71, 1, 72, 1, 72, 1, 72, 1, 72, 5, 72, 1254, 8, 72, 10, 72, 12, 72, 1257, 9, 72, 3, 72, 1259, 8, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 5, 74, 1271, 8, 74, 10, 74, 12, 74, 1274, 9, 74, 3, 74, 1276, 8, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 0, 0, 77, 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, 0, 9, 2, 0, 10, 10, 28, 28, 1, 0, 6, 7, 1, 0, 95, 99, 3, 0, 1, 1, 90, 94, 96, 97, 3, 0, 1, 1, 90, 91, 96, 97, 2, 0, 92, 94, 96, 97, 1, 0, 115, 122, 1, 0, 102, 105, 7, 0, 1, 3, 5, 28, 40, 40, 69, 69, 88, 89, 100, 100, 143, 143, 1388, 0, 166, 1, 0, 0, 0, 2, 168, 1, 0, 0, 0, 4, 178, 1, 0, 0, 0, 6, 182, 1, 0, 0, 0, 8, 206, 1, 0, 0, 0, 10, 218, 1, 0, 0, 0, 12, 220, 1, 0, 0, 0, 14, 227, 1, 0, 0, 0, 16, 238, 1, 0, 0, 0, 18, 240, 1, 0, 0, 0, 20, 253, 1, 0, 0, 0, 22, 285, 1, 0, 0, 0, 24, 315, 1, 0, 0, 0, 26, 317, 1, 0, 0, 0, 28, 321, 1, 0, 0, 0, 30, 339, 1, 0, 0, 0, 32, 341, 1, 0, 0, 0, 34, 353, 1, 0, 0, 0, 36, 356, 1, 0, 0, 0, 38, 377, 1, 0, 0, 0, 40, 427, 1, 0, 0, 0, 42, 430, 1, 0, 0, 0, 44, 455, 1, 0, 0, 0, 46, 492, 1, 0, 0, 0, 48, 503, 1, 0, 0, 0, 50, 508, 1, 0, 0, 0, 52, 535, 1, 0, 0, 0, 54, 537, 1, 0, 0, 0, 56, 562, 1, 0, 0, 0, 58, 611, 1, 0, 0, 0, 60, 613, 1, 0, 0, 0, 62, 642, 1, 0, 0, 0, 64, 664, 1, 0, 0, 0, 66, 677, 1, 0, 0, 0, 68, 679, 1, 0, 0, 0, 70, 691, 1, 0, 0, 0, 72, 704, 1, 0, 0, 0, 74, 707, 1, 0, 0, 0, 76, 727, 1, 0, 0, 0, 78, 729, 1, 0, 0, 0, 80, 737, 1, 0, 0, 0, 82, 821, 1, 0, 0, 0, 84, 823, 1, 0, 0, 0, 86, 834, 1, 0, 0, 0, 88, 836, 1, 0, 0, 0, 90, 841, 1, 0, 0, 0, 92, 843, 1, 0, 0, 0, 94, 865, 1, 0, 0, 0, 96, 867, 1, 0, 0, 0, 98, 876, 1, 0, 0, 0, 100, 901, 1, 0, 0, 0, 102, 931, 1, 0, 0, 0, 104, 933, 1, 0, 0, 0, 106, 958, 1, 0, 0, 0, 108, 960, 1, 0, 0, 0, 110, 972, 1, 0, 0, 0, 112, 979, 1, 0, 0, 0, 114, 993, 1, 0, 0, 0, 116, 1003, 1, 0, 0, 0, 118, 1019, 1, 0, 0, 0, 120, 1054, 1, 0, 0, 0, 122, 1056, 1, 0, 0, 0, 124, 1059, 1, 0, 0, 0, 126, 1061, 1, 0, 0, 0, 128, 1063, 1, 0, 0, 0, 130, 1169, 1, 0, 0, 0, 132, 1171, 1, 0, 0, 0, 134, 1228, 1, 0, 0, 0, 136, 1230, 1, 0, 0, 0, 138, 1235, 1, 0, 0, 0, 140, 1237, 1, 0, 0, 0, 142, 1247, 1, 0, 0, 0, 144, 1249, 1, 0, 0, 0, 146, 1262, 1, 0, 0, 0, 148, 1266, 1, 0, 0, 0, 150, 1279, 1, 0, 0, 0, 152, 1281, 1, 0, 0, 0, 154, 155, 3, 6, 3, 0, 155, 156, 5, 0, 0, 1, 156, 167, 1, 0, 0, 0, 157, 158, 3, 20, 10, 0, 158, 159, 5, 0, 0, 1, 159, 167, 1, 0, 0, 0, 160, 161, 3, 50, 25, 0, 161, 162, 5, 0, 0, 1, 162, 167, 1, 0, 0, 0, 163, 164, 3, 2, 1, 0, 164, 165, 5, 0, 0, 1, 165, 167, 1, 0, 0, 0, 166, 154, 1, 0, 0, 0, 166, 157, 1, 0, 0, 0, 166, 160, 1, 0, 0, 0, 166, 163, 1, 0, 0, 0, 167, 1, 1, 0, 0, 0, 168, 169, 5, 35, 0, 0, 169, 173, 5, 131, 0, 0, 170, 172, 3, 8, 4, 0, 171, 170, 1, 0, 0, 0, 172, 175, 1, 0, 0, 0, 173, 171, 1, 0, 0, 0, 173, 174, 1, 0, 0, 0, 174, 176, 1, 0, 0, 0, 175, 173, 1, 0, 0, 0, 176, 177, 5, 132, 0, 0, 177, 3, 1, 0, 0, 0, 178, 179, 5, 36, 0, 0, 179, 180, 3, 152, 76, 0, 180, 181, 5, 128, 0, 0, 181, 5, 1, 0, 0, 0, 182, 183, 5, 4, 0, 0, 183, 184, 3, 150, 75, 0, 184, 185, 5, 78, 0, 0, 185, 186, 3, 152, 76, 0, 186, 187, 5, 72, 0, 0, 187, 188, 3, 152, 76, 0, 188, 189, 5, 71, 0, 0, 189, 190, 3, 152, 76, 0, 190, 194, 5, 131, 0, 0, 191, 193, 3, 8, 4, 0, 192, 191, 1, 0, 0, 0, 193, 196, 1, 0, 0, 0, 194, 192, 1, 0, 0, 0, 194, 195, 1, 0, 0, 0, 195, 197, 1, 0, 0, 0, 196, 194, 1, 0, 0, 0, 197, 198, 5, 132, 0, 0, 198, 7, 1, 0, 0, 0, 199, 207, 3, 4, 2, 0, 200, 207, 3, 18, 9, 0, 201, 207, 3, 10, 5, 0, 202, 207, 3, 88, 44, 0, 203, 207, 3, 100, 50, 0, 204, 207, 3, 132, 66, 0, 205, 207, 3, 32, 16, 0, 206, 199, 1, 0, 0, 0, 206, 200, 1, 0, 0, 0, 206, 201, 1, 0, 0, 0, 206, 202, 1, 0, 0, 0, 206, 203, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 206, 205, 1, 0, 0, 0, 207, 9, 1, 0, 0, 0, 208, 209, 5, 36, 0, 0, 209, 210, 5, 39, 0, 0, 210, 211, 3, 150, 75, 0, 211, 212, 5, 128, 0, 0, 212, 219, 1, 0, 0, 0, 213, 214, 5, 36, 0, 0, 214, 215, 5, 41, 0, 0, 215, 216, 3, 150, 75, 0, 216, 217, 5, 128, 0, 0, 217, 219, 1, 0, 0, 0, 218, 208, 1, 0, 0, 0, 218, 213, 1, 0, 0, 0, 219, 11, 1, 0, 0, 0, 220, 221, 5, 37, 0, 0, 221, 222, 5, 38, 0, 0, 222, 223, 3, 150, 75, 0, 223, 224, 5, 78, 0, 0, 224, 225, 3, 152, 76, 0, 225, 226, 5, 128, 0, 0, 226, 13, 1, 0, 0, 0, 227, 228, 5, 37, 0, 0, 228, 229, 5, 39, 0, 0, 229, 230, 3, 150, 75, 0, 230, 231, 5, 72, 0, 0, 231, 232, 3, 152, 76, 0, 232, 233, 5, 128, 0, 0, 233, 15, 1, 0, 0, 0, 234, 239, 3, 10, 5, 0, 235, 239, 3, 12, 6, 0, 236, 239, 3, 14, 7, 0, 237, 239, 3, 32, 16, 0, 238, 234, 1, 0, 0, 0, 238, 235, 1, 0, 0, 0, 238, 236, 1, 0, 0, 0, 238, 237, 1, 0, 0, 0, 239, 17, 1, 0, 0, 0, 240, 241, 5, 38, 0, 0, 241, 242, 3, 150, 75, 0, 242, 243, 5, 78, 0, 0, 243, 246, 3, 152, 76, 0, 244, 245, 5, 79, 0, 0, 245, 247, 3, 152, 76, 0, 246, 244, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 249, 5, 128, 0, 0, 249, 19, 1, 0, 0, 0, 250, 252, 3, 16, 8, 0, 251, 250, 1, 0, 0, 0, 252, 255, 1, 0, 0, 0, 253, 251, 1, 0, 0, 0, 253, 254, 1, 0, 0, 0, 254, 256, 1, 0, 0, 0, 255, 253, 1, 0, 0, 0, 256, 257, 5, 39, 0, 0, 257, 259, 3, 150, 75, 0, 258, 260, 3, 22, 11, 0, 259, 258, 1, 0, 0, 0, 259, 260, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 262, 5, 78, 0, 0, 262, 263, 3, 152, 76, 0, 263, 264, 5, 72, 0, 0, 264, 274, 3, 152, 76, 0, 265, 266, 5, 83, 0, 0, 266, 271, 3, 26, 13, 0, 267, 268, 5, 129, 0, 0, 268, 270, 3, 26, 13, 0, 269, 267, 1, 0, 0, 0, 270, 273, 1, 0, 0, 0, 271, 269, 1, 0, 0, 0, 271, 272, 1, 0, 0, 0, 272, 275, 1, 0, 0, 0, 273, 271, 1, 0, 0, 0, 274, 265, 1, 0, 0, 0, 274, 275, 1, 0, 0, 0, 275, 276, 1, 0, 0, 0, 276, 280, 5, 131, 0, 0, 277, 279, 3, 34, 17, 0, 278, 277, 1, 0, 0, 0, 279, 282, 1, 0, 0, 0, 280, 278, 1, 0, 0, 0, 280, 281, 1, 0, 0, 0, 281, 283, 1, 0, 0, 0, 282, 280, 1, 0, 0, 0, 283, 284, 5, 132, 0, 0, 284, 21, 1, 0, 0, 0, 285, 286, 5, 137, 0, 0, 286, 291, 3, 24, 12, 0, 287, 288, 5, 129, 0, 0, 288, 290, 3, 24, 12, 0, 289, 287, 1, 0, 0, 0, 290, 293, 1, 0, 0, 0, 291, 289, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 294, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 294, 295, 5, 138, 0, 0, 295, 23, 1, 0, 0, 0, 296, 297, 5, 42, 0, 0, 297, 300, 3, 150, 75, 0, 298, 299, 5, 127, 0, 0, 299, 301, 5, 32, 0, 0, 300, 298, 1, 0, 0, 0, 300, 301, 1, 0, 0, 0, 301, 316, 1, 0, 0, 0, 302, 303, 5, 31, 0, 0, 303, 313, 3, 150, 75, 0, 304, 305, 5, 33, 0, 0, 305, 310, 3, 26, 13, 0, 306, 307, 5, 139, 0, 0, 307, 309, 3, 26, 13, 0, 308, 306, 1, 0, 0, 0, 309, 312, 1, 0, 0, 0, 310, 308, 1, 0, 0, 0, 310, 311, 1, 0, 0, 0, 311, 314, 1, 0, 0, 0, 312, 310, 1, 0, 0, 0, 313, 304, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 316, 1, 0, 0, 0, 315, 296, 1, 0, 0, 0, 315, 302, 1, 0, 0, 0, 316, 25, 1, 0, 0, 0, 317, 319, 3, 150, 75, 0, 318, 320, 3, 28, 14, 0, 319, 318, 1, 0, 0, 0, 319, 320, 1, 0, 0, 0, 320, 27, 1, 0, 0, 0, 321, 322, 5, 137, 0, 0, 322, 327, 3, 30, 15, 0, 323, 324, 5, 129, 0, 0, 324, 326, 3, 30, 15, 0, 325, 323, 1, 0, 0, 0, 326, 329, 1, 0, 0, 0, 327, 325, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 330, 1, 0, 0, 0, 329, 327, 1, 0, 0, 0, 330, 331, 5, 138, 0, 0, 331, 29, 1, 0, 0, 0, 332, 333, 5, 38, 0, 0, 333, 340, 3, 150, 75, 0, 334, 335, 5, 39, 0, 0, 335, 340, 3, 26, 13, 0, 336, 337, 5, 31, 0, 0, 337, 340, 3, 150, 75, 0, 338, 340, 3, 134, 67, 0, 339, 332, 1, 0, 0, 0, 339, 334, 1, 0, 0, 0, 339, 336, 1, 0, 0, 0, 339, 338, 1, 0, 0, 0, 340, 31, 1, 0, 0, 0, 341, 342, 5, 30, 0, 0, 342, 344, 3, 150, 75, 0, 343, 345, 3, 22, 11, 0, 344, 343, 1, 0, 0, 0, 344, 345, 1, 0, 0, 0, 345, 346, 1, 0, 0, 0, 346, 347, 5, 140, 0, 0, 347, 348, 3, 134, 67, 0, 348, 349, 5, 128, 0, 0, 349, 33, 1, 0, 0, 0, 350, 354, 3, 38, 19, 0, 351, 354, 3, 42, 21, 0, 352, 354, 3, 36, 18, 0, 353, 350, 1, 0, 0, 0, 353, 351, 1, 0, 0, 0, 353, 352, 1, 0, 0, 0, 354, 35, 1, 0, 0, 0, 355, 357, 5, 52, 0, 0, 356, 355, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 358, 1, 0, 0, 0, 358, 359, 5, 44, 0, 0, 359, 360, 3, 150, 75, 0, 360, 361, 5, 78, 0, 0, 361, 362, 3, 152, 76, 0, 362, 363, 5, 127, 0, 0, 363, 364, 3, 134, 67, 0, 364, 365, 5, 126, 0, 0, 365, 366, 3, 134, 67, 0, 366, 367, 5, 131, 0, 0, 367, 368, 5, 95, 0, 0, 368, 369, 5, 78, 0, 0, 369, 371, 3, 152, 76, 0, 370, 372, 3, 66, 33, 0, 371, 370, 1, 0, 0, 0, 371, 372, 1, 0, 0, 0, 372, 373, 1, 0, 0, 0, 373, 374, 5, 128, 0, 0, 374, 375, 5, 132, 0, 0, 375, 37, 1, 0, 0, 0, 376, 378, 3, 44, 22, 0, 377, 376, 1, 0, 0, 0, 377, 378, 1, 0, 0, 0, 378, 379, 1, 0, 0, 0, 379, 380, 5, 42, 0, 0, 380, 381, 3, 150, 75, 0, 381, 382, 5, 78, 0, 0, 382, 383, 3, 152, 76, 0, 383, 384, 5, 127, 0, 0, 384, 385, 3, 134, 67, 0, 385, 389, 5, 131, 0, 0, 386, 388, 3, 40, 20, 0, 387, 386, 1, 0, 0, 0, 388, 391, 1, 0, 0, 0, 389, 387, 1, 0, 0, 0, 389, 390, 1, 0, 0, 0, 390, 392, 1, 0, 0, 0, 391, 389, 1, 0, 0, 0, 392, 393, 5, 132, 0, 0, 393, 39, 1, 0, 0, 0, 394, 395, 5, 85, 0, 0, 395, 396, 5, 78, 0, 0, 396, 398, 3, 152, 76, 0, 397, 399, 3, 66, 33, 0, 398, 397, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 401, 5, 128, 0, 0, 401, 428, 1, 0, 0, 0, 402, 403, 5, 86, 0, 0, 403, 404, 5, 78, 0, 0, 404, 406, 3, 152, 76, 0, 405, 407, 3, 66, 33, 0, 406, 405, 1, 0, 0, 0, 406, 407, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 409, 5, 128, 0, 0, 409, 428, 1, 0, 0, 0, 410, 411, 5, 1, 0, 0, 411, 412, 5, 78, 0, 0, 412, 414, 3, 152, 76, 0, 413, 415, 3, 66, 33, 0, 414, 413, 1, 0, 0, 0, 414, 415, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 417, 5, 128, 0, 0, 417, 428, 1, 0, 0, 0, 418, 419, 5, 87, 0, 0, 419, 420, 5, 88, 0, 0, 420, 421, 5, 78, 0, 0, 421, 422, 3, 152, 76, 0, 422, 423, 5, 89, 0, 0, 423, 424, 5, 78, 0, 0, 424, 425, 3, 152, 76, 0, 425, 426, 5, 128, 0, 0, 426, 428, 1, 0, 0, 0, 427, 394, 1, 0, 0, 0, 427, 402, 1, 0, 0, 0, 427, 410, 1, 0, 0, 0, 427, 418, 1, 0, 0, 0, 428, 41, 1, 0, 0, 0, 429, 431, 3, 44, 22, 0, 430, 429, 1, 0, 0, 0, 430, 431, 1, 0, 0, 0, 431, 432, 1, 0, 0, 0, 432, 433, 5, 43, 0, 0, 433, 434, 3, 150, 75, 0, 434, 435, 5, 78, 0, 0, 435, 436, 3, 152, 76, 0, 436, 437, 5, 127, 0, 0, 437, 438, 3, 140, 70, 0, 438, 440, 3, 48, 24, 0, 439, 441, 5, 106, 0, 0, 440, 439, 1, 0, 0, 0, 440, 441, 1, 0, 0, 0, 441, 444, 1, 0, 0, 0, 442, 443, 5, 76, 0, 0, 443, 445, 3, 152, 76, 0, 444, 442, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 450, 5, 131, 0, 0, 447, 449, 3, 46, 23, 0, 448, 447, 1, 0, 0, 0, 449, 452, 1, 0, 0, 0, 450, 448, 1, 0, 0, 0, 450, 451, 1, 0, 0, 0, 451, 453, 1, 0, 0, 0, 452, 450, 1, 0, 0, 0, 453, 454, 5, 132, 0, 0, 454, 43, 1, 0, 0, 0, 455, 457, 5, 27, 0, 0, 456, 458, 7, 0, 0, 0, 457, 456, 1, 0, 0, 0, 457, 458, 1, 0, 0, 0, 458, 45, 1, 0, 0, 0, 459, 460, 5, 92, 0, 0, 460, 461, 5, 78, 0, 0, 461, 463, 3, 152, 76, 0, 462, 464, 3, 66, 33, 0, 463, 462, 1, 0, 0, 0, 463, 464, 1, 0, 0, 0, 464, 465, 1, 0, 0, 0, 465, 466, 5, 128, 0, 0, 466, 493, 1, 0, 0, 0, 467, 468, 5, 93, 0, 0, 468, 469, 5, 78, 0, 0, 469, 471, 3, 152, 76, 0, 470, 472, 3, 66, 33, 0, 471, 470, 1, 0, 0, 0, 471, 472, 1, 0, 0, 0, 472, 473, 1, 0, 0, 0, 473, 474, 5, 128, 0, 0, 474, 493, 1, 0, 0, 0, 475, 476, 5, 94, 0, 0, 476, 477, 5, 78, 0, 0, 477, 479, 3, 152, 76, 0, 478, 480, 3, 66, 33, 0, 479, 478, 1, 0, 0, 0, 479, 480, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 482, 5, 128, 0, 0, 482, 493, 1, 0, 0, 0, 483, 484, 5, 87, 0, 0, 484, 485, 5, 88, 0, 0, 485, 486, 5, 78, 0, 0, 486, 487, 3, 152, 76, 0, 487, 488, 5, 89, 0, 0, 488, 489, 5, 78, 0, 0, 489, 490, 3, 152, 76, 0, 490, 491, 5, 128, 0, 0, 491, 493, 1, 0, 0, 0, 492, 459, 1, 0, 0, 0, 492, 467, 1, 0, 0, 0, 492, 475, 1, 0, 0, 0, 492, 483, 1, 0, 0, 0, 493, 47, 1, 0, 0, 0, 494, 495, 5, 38, 0, 0, 495, 504, 3, 150, 75, 0, 496, 497, 5, 39, 0, 0, 497, 499, 3, 150, 75, 0, 498, 500, 3, 28, 14, 0, 499, 498, 1, 0, 0, 0, 499, 500, 1, 0, 0, 0, 500, 504, 1, 0, 0, 0, 501, 502, 5, 31, 0, 0, 502, 504, 3, 150, 75, 0, 503, 494, 1, 0, 0, 0, 503, 496, 1, 0, 0, 0, 503, 501, 1, 0, 0, 0, 504, 49, 1, 0, 0, 0, 505, 507, 3, 16, 8, 0, 506, 505, 1, 0, 0, 0, 507, 510, 1, 0, 0, 0, 508, 506, 1, 0, 0, 0, 508, 509, 1, 0, 0, 0, 509, 511, 1, 0, 0, 0, 510, 508, 1, 0, 0, 0, 511, 512, 5, 41, 0, 0, 512, 513, 3, 150, 75, 0, 513, 514, 5, 78, 0, 0, 514, 515, 3, 152, 76, 0, 515, 516, 5, 72, 0, 0, 516, 519, 3, 152, 76, 0, 517, 518, 5, 73, 0, 0, 518, 520, 5, 141, 0, 0, 519, 517, 1, 0, 0, 0, 519, 520, 1, 0, 0, 0, 520, 521, 1, 0, 0, 0, 521, 525, 5, 131, 0, 0, 522, 524, 3, 52, 26, 0, 523, 522, 1, 0, 0, 0, 524, 527, 1, 0, 0, 0, 525, 523, 1, 0, 0, 0, 525, 526, 1, 0, 0, 0, 526, 528, 1, 0, 0, 0, 527, 525, 1, 0, 0, 0, 528, 529, 5, 132, 0, 0, 529, 51, 1, 0, 0, 0, 530, 536, 3, 60, 30, 0, 531, 536, 3, 62, 31, 0, 532, 536, 3, 70, 35, 0, 533, 536, 3, 54, 27, 0, 534, 536, 3, 56, 28, 0, 535, 530, 1, 0, 0, 0, 535, 531, 1, 0, 0, 0, 535, 532, 1, 0, 0, 0, 535, 533, 1, 0, 0, 0, 535, 534, 1, 0, 0, 0, 536, 53, 1, 0, 0, 0, 537, 538, 5, 17, 0, 0, 538, 540, 3, 150, 75, 0, 539, 541, 3, 22, 11, 0, 540, 539, 1, 0, 0, 0, 540, 541, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 543, 5, 78, 0, 0, 543, 544, 3, 152, 76, 0, 544, 546, 5, 20, 0, 0, 545, 547, 5, 4, 0, 0, 546, 545, 1, 0, 0, 0, 546, 547, 1, 0, 0, 0, 547, 548, 1, 0, 0, 0, 548, 549, 3, 26, 13, 0, 549, 550, 5, 21, 0, 0, 550, 551, 3, 152, 76, 0, 551, 552, 5, 44, 0, 0, 552, 553, 3, 152, 76, 0, 553, 557, 5, 131, 0, 0, 554, 556, 3, 58, 29, 0, 555, 554, 1, 0, 0, 0, 556, 559, 1, 0, 0, 0, 557, 555, 1, 0, 0, 0, 557, 558, 1, 0, 0, 0, 558, 560, 1, 0, 0, 0, 559, 557, 1, 0, 0, 0, 560, 561, 5, 132, 0, 0, 561, 55, 1, 0, 0, 0, 562, 563, 5, 17, 0, 0, 563, 564, 3, 150, 75, 0, 564, 565, 5, 78, 0, 0, 565, 566, 3, 152, 76, 0, 566, 567, 5, 19, 0, 0, 567, 568, 3, 150, 75, 0, 568, 569, 3, 28, 14, 0, 569, 570, 5, 128, 0, 0, 570, 57, 1, 0, 0, 0, 571, 572, 5, 11, 0, 0, 572, 612, 5, 128, 0, 0, 573, 574, 5, 12, 0, 0, 574, 575, 5, 13, 0, 0, 575, 576, 3, 150, 75, 0, 576, 577, 5, 128, 0, 0, 577, 612, 1, 0, 0, 0, 578, 579, 5, 22, 0, 0, 579, 580, 3, 152, 76, 0, 580, 581, 5, 128, 0, 0, 581, 612, 1, 0, 0, 0, 582, 584, 5, 23, 0, 0, 583, 585, 5, 31, 0, 0, 584, 583, 1, 0, 0, 0, 584, 585, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 587, 3, 150, 75, 0, 587, 588, 5, 50, 0, 0, 588, 589, 3, 26, 13, 0, 589, 590, 5, 128, 0, 0, 590, 612, 1, 0, 0, 0, 591, 592, 5, 24, 0, 0, 592, 593, 3, 150, 75, 0, 593, 594, 5, 141, 0, 0, 594, 595, 5, 128, 0, 0, 595, 612, 1, 0, 0, 0, 596, 597, 5, 25, 0, 0, 597, 598, 3, 26, 13, 0, 598, 599, 5, 130, 0, 0, 599, 600, 3, 150, 75, 0, 600, 601, 3, 150, 75, 0, 601, 602, 3, 152, 76, 0, 602, 603, 5, 128, 0, 0, 603, 612, 1, 0, 0, 0, 604, 605, 5, 87, 0, 0, 605, 612, 5, 128, 0, 0, 606, 607, 5, 26, 0, 0, 607, 608, 5, 141, 0, 0, 608, 609, 3, 152, 76, 0, 609, 610, 5, 128, 0, 0, 610, 612, 1, 0, 0, 0, 611, 571, 1, 0, 0, 0, 611, 573, 1, 0, 0, 0, 611, 578, 1, 0, 0, 0, 611, 582, 1, 0, 0, 0, 611, 591, 1, 0, 0, 0, 611, 596, 1, 0, 0, 0, 611, 604, 1, 0, 0, 0, 611, 606, 1, 0, 0, 0, 612, 59, 1, 0, 0, 0, 613, 614, 5, 44, 0, 0, 614, 616, 3, 150, 75, 0, 615, 617, 3, 22, 11, 0, 616, 615, 1, 0, 0, 0, 616, 617, 1, 0, 0, 0, 617, 618, 1, 0, 0, 0, 618, 619, 5, 78, 0, 0, 619, 620, 3, 152, 76, 0, 620, 621, 5, 127, 0, 0, 621, 622, 3, 134, 67, 0, 622, 623, 5, 126, 0, 0, 623, 624, 3, 134, 67, 0, 624, 625, 5, 80, 0, 0, 625, 627, 3, 74, 37, 0, 626, 628, 3, 66, 33, 0, 627, 626, 1, 0, 0, 0, 627, 628, 1, 0, 0, 0, 628, 630, 1, 0, 0, 0, 629, 631, 3, 72, 36, 0, 630, 629, 1, 0, 0, 0, 630, 631, 1, 0, 0, 0, 631, 632, 1, 0, 0, 0, 632, 633, 5, 82, 0, 0, 633, 635, 3, 76, 38, 0, 634, 636, 3, 80, 40, 0, 635, 634, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 638, 1, 0, 0, 0, 637, 639, 3, 64, 32, 0, 638, 637, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 641, 5, 128, 0, 0, 641, 61, 1, 0, 0, 0, 642, 643, 5, 45, 0, 0, 643, 645, 3, 150, 75, 0, 644, 646, 3, 22, 11, 0, 645, 644, 1, 0, 0, 0, 645, 646, 1, 0, 0, 0, 646, 647, 1, 0, 0, 0, 647, 648, 5, 78, 0, 0, 648, 649, 3, 152, 76, 0, 649, 650, 5, 127, 0, 0, 650, 651, 3, 134, 67, 0, 651, 652, 5, 126, 0, 0, 652, 654, 3, 134, 67, 0, 653, 655, 3, 66, 33, 0, 654, 653, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 657, 1, 0, 0, 0, 656, 658, 3, 80, 40, 0, 657, 656, 1, 0, 0, 0, 657, 658, 1, 0, 0, 0, 658, 660, 1, 0, 0, 0, 659, 661, 3, 64, 32, 0, 660, 659, 1, 0, 0, 0, 660, 661, 1, 0, 0, 0, 661, 662, 1, 0, 0, 0, 662, 663, 5, 128, 0, 0, 663, 63, 1, 0, 0, 0, 664, 665, 5, 61, 0, 0, 665, 666, 5, 60, 0, 0, 666, 667, 3, 150, 75, 0, 667, 65, 1, 0, 0, 0, 668, 669, 5, 5, 0, 0, 669, 678, 5, 8, 0, 0, 670, 671, 5, 5, 0, 0, 671, 672, 7, 1, 0, 0, 672, 673, 5, 9, 0, 0, 673, 674, 5, 133, 0, 0, 674, 675, 3, 78, 39, 0, 675, 676, 5, 134, 0, 0, 676, 678, 1, 0, 0, 0, 677, 668, 1, 0, 0, 0, 677, 670, 1, 0, 0, 0, 678, 67, 1, 0, 0, 0, 679, 680, 5, 60, 0, 0, 680, 681, 5, 133, 0, 0, 681, 686, 3, 116, 58, 0, 682, 683, 5, 129, 0, 0, 683, 685, 3, 116, 58, 0, 684, 682, 1, 0, 0, 0, 685, 688, 1, 0, 0, 0, 686, 684, 1, 0, 0, 0, 686, 687, 1, 0, 0, 0, 687, 689, 1, 0, 0, 0, 688, 686, 1, 0, 0, 0, 689, 690, 5, 134, 0, 0, 690, 69, 1, 0, 0, 0, 691, 692, 5, 46, 0, 0, 692, 693, 3, 150, 75, 0, 693, 694, 5, 78, 0, 0, 694, 695, 3, 152, 76, 0, 695, 696, 5, 47, 0, 0, 696, 697, 3, 150, 75, 0, 697, 698, 5, 127, 0, 0, 698, 700, 3, 134, 67, 0, 699, 701, 3, 80, 40, 0, 700, 699, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 702, 1, 0, 0, 0, 702, 703, 5, 128, 0, 0, 703, 71, 1, 0, 0, 0, 704, 705, 5, 81, 0, 0, 705, 706, 3, 134, 67, 0, 706, 73, 1, 0, 0, 0, 707, 708, 7, 2, 0, 0, 708, 75, 1, 0, 0, 0, 709, 728, 5, 84, 0, 0, 710, 711, 5, 38, 0, 0, 711, 728, 3, 150, 75, 0, 712, 713, 5, 31, 0, 0, 713, 728, 3, 150, 75, 0, 714, 715, 5, 40, 0, 0, 715, 724, 5, 133, 0, 0, 716, 721, 3, 26, 13, 0, 717, 718, 5, 129, 0, 0, 718, 720, 3, 26, 13, 0, 719, 717, 1, 0, 0, 0, 720, 723, 1, 0, 0, 0, 721, 719, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 725, 1, 0, 0, 0, 723, 721, 1, 0, 0, 0, 724, 716, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 726, 1, 0, 0, 0, 726, 728, 5, 134, 0, 0, 727, 709, 1, 0, 0, 0, 727, 710, 1, 0, 0, 0, 727, 712, 1, 0, 0, 0, 727, 714, 1, 0, 0, 0, 728, 77, 1, 0, 0, 0, 729, 734, 3, 150, 75, 0, 730, 731, 5, 129, 0, 0, 731, 733, 3, 150, 75, 0, 732, 730, 1, 0, 0, 0, 733, 736, 1, 0, 0, 0, 734, 732, 1, 0, 0, 0, 734, 735, 1, 0, 0, 0, 735, 79, 1, 0, 0, 0, 736, 734, 1, 0, 0, 0, 737, 738, 5, 83, 0, 0, 738, 742, 5, 131, 0, 0, 739, 741, 3, 82, 41, 0, 740, 739, 1, 0, 0, 0, 741, 744, 1, 0, 0, 0, 742, 740, 1, 0, 0, 0, 742, 743, 1, 0, 0, 0, 743, 745, 1, 0, 0, 0, 744, 742, 1, 0, 0, 0, 745, 746, 5, 132, 0, 0, 746, 81, 1, 0, 0, 0, 747, 748, 5, 18, 0, 0, 748, 749, 3, 150, 75, 0, 749, 750, 5, 78, 0, 0, 750, 751, 3, 152, 76, 0, 751, 752, 5, 133, 0, 0, 752, 753, 3, 78, 39, 0, 753, 754, 5, 134, 0, 0, 754, 755, 5, 128, 0, 0, 755, 822, 1, 0, 0, 0, 756, 757, 5, 56, 0, 0, 757, 758, 3, 150, 75, 0, 758, 759, 5, 78, 0, 0, 759, 760, 3, 152, 76, 0, 760, 761, 5, 127, 0, 0, 761, 762, 3, 134, 67, 0, 762, 763, 3, 84, 42, 0, 763, 764, 5, 128, 0, 0, 764, 822, 1, 0, 0, 0, 765, 766, 5, 57, 0, 0, 766, 767, 3, 150, 75, 0, 767, 768, 5, 78, 0, 0, 768, 769, 3, 152, 76, 0, 769, 770, 5, 127, 0, 0, 770, 771, 3, 140, 70, 0, 771, 772, 3, 48, 24, 0, 772, 773, 3, 84, 42, 0, 773, 774, 5, 128, 0, 0, 774, 822, 1, 0, 0, 0, 775, 776, 5, 39, 0, 0, 776, 777, 3, 150, 75, 0, 777, 778, 5, 78, 0, 0, 778, 779, 3, 152, 76, 0, 779, 780, 5, 127, 0, 0, 780, 782, 3, 150, 75, 0, 781, 783, 3, 28, 14, 0, 782, 781, 1, 0, 0, 0, 782, 783, 1, 0, 0, 0, 783, 785, 1, 0, 0, 0, 784, 786, 3, 68, 34, 0, 785, 784, 1, 0, 0, 0, 785, 786, 1, 0, 0, 0, 786, 787, 1, 0, 0, 0, 787, 788, 5, 128, 0, 0, 788, 822, 1, 0, 0, 0, 789, 790, 5, 2, 0, 0, 790, 791, 3, 150, 75, 0, 791, 792, 5, 78, 0, 0, 792, 793, 3, 152, 76, 0, 793, 794, 5, 127, 0, 0, 794, 795, 3, 150, 75, 0, 795, 796, 5, 48, 0, 0, 796, 797, 3, 134, 67, 0, 797, 798, 5, 128, 0, 0, 798, 822, 1, 0, 0, 0, 799, 800, 5, 46, 0, 0, 800, 801, 3, 150, 75, 0, 801, 802, 5, 78, 0, 0, 802, 803, 3, 152, 76, 0, 803, 804, 5, 127, 0, 0, 804, 807, 3, 150, 75, 0, 805, 806, 5, 48, 0, 0, 806, 808, 3, 134, 67, 0, 807, 805, 1, 0, 0, 0, 807, 808, 1, 0, 0, 0, 808, 809, 1, 0, 0, 0, 809, 810, 5, 128, 0, 0, 810, 822, 1, 0, 0, 0, 811, 812, 5, 17, 0, 0, 812, 813, 3, 150, 75, 0, 813, 814, 5, 78, 0, 0, 814, 815, 3, 152, 76, 0, 815, 816, 5, 127, 0, 0, 816, 817, 3, 150, 75, 0, 817, 818, 5, 130, 0, 0, 818, 819, 3, 150, 75, 0, 819, 820, 5, 128, 0, 0, 820, 822, 1, 0, 0, 0, 821, 747, 1, 0, 0, 0, 821, 756, 1, 0, 0, 0, 821, 765, 1, 0, 0, 0, 821, 775, 1, 0, 0, 0, 821, 789, 1, 0, 0, 0, 821, 799, 1, 0, 0, 0, 821, 811, 1, 0, 0, 0, 822, 83, 1, 0, 0, 0, 823, 824, 5, 133, 0, 0, 824, 829, 3, 86, 43, 0, 825, 826, 5, 129, 0, 0, 826, 828, 3, 86, 43, 0, 827, 825, 1, 0, 0, 0, 828, 831, 1, 0, 0, 0, 829, 827, 1, 0, 0, 0, 829, 830, 1, 0, 0, 0, 830, 832, 1, 0, 0, 0, 831, 829, 1, 0, 0, 0, 832, 833, 5, 134, 0, 0, 833, 85, 1, 0, 0, 0, 834, 835, 7, 3, 0, 0, 835, 87, 1, 0, 0, 0, 836, 837, 5, 55, 0, 0, 837, 838, 3, 90, 45, 0, 838, 89, 1, 0, 0, 0, 839, 842, 3, 92, 46, 0, 840, 842, 3, 96, 48, 0, 841, 839, 1, 0, 0, 0, 841, 840, 1, 0, 0, 0, 842, 91, 1, 0, 0, 0, 843, 844, 5, 56, 0, 0, 844, 845, 3, 150, 75, 0, 845, 846, 5, 78, 0, 0, 846, 847, 3, 152, 76, 0, 847, 848, 5, 66, 0, 0, 848, 849, 3, 150, 75, 0, 849, 850, 5, 127, 0, 0, 850, 851, 3, 134, 67, 0, 851, 852, 5, 67, 0, 0, 852, 855, 3, 94, 47, 0, 853, 854, 5, 68, 0, 0, 854, 856, 3, 142, 71, 0, 855, 853, 1, 0, 0, 0, 855, 856, 1, 0, 0, 0, 856, 857, 1, 0, 0, 0, 857, 858, 5, 128, 0, 0, 858, 93, 1, 0, 0, 0, 859, 866, 5, 100, 0, 0, 860, 861, 5, 101, 0, 0, 861, 862, 5, 135, 0, 0, 862, 863, 3, 134, 67, 0, 863, 864, 5, 136, 0, 0, 864, 866, 1, 0, 0, 0, 865, 859, 1, 0, 0, 0, 865, 860, 1, 0, 0, 0, 866, 95, 1, 0, 0, 0, 867, 868, 5, 57, 0, 0, 868, 869, 3, 150, 75, 0, 869, 870, 5, 78, 0, 0, 870, 871, 3, 152, 76, 0, 871, 872, 5, 131, 0, 0, 872, 873, 3, 98, 49, 0, 873, 874, 3, 98, 49, 0, 874, 875, 5, 132, 0, 0, 875, 97, 1, 0, 0, 0, 876, 877, 3, 48, 24, 0, 877, 878, 5, 58, 0, 0, 878, 879, 3, 150, 75, 0, 879, 880, 5, 78, 0, 0, 880, 881, 3, 152, 76, 0, 881, 883, 3, 140, 70, 0, 882, 884, 5, 106, 0, 0, 883, 882, 1, 0, 0, 0, 883, 884, 1, 0, 0, 0, 884, 887, 1, 0, 0, 0, 885, 886, 5, 74, 0, 0, 886, 888, 3, 152, 76, 0, 887, 885, 1, 0, 0, 0, 887, 888, 1, 0, 0, 0, 888, 890, 1, 0, 0, 0, 889, 891, 5, 75, 0, 0, 890, 889, 1, 0, 0, 0, 890, 891, 1, 0, 0, 0, 891, 894, 1, 0, 0, 0, 892, 893, 5, 76, 0, 0, 893, 895, 3, 152, 76, 0, 894, 892, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 897, 1, 0, 0, 0, 896, 898, 5, 77, 0, 0, 897, 896, 1, 0, 0, 0, 897, 898, 1, 0, 0, 0, 898, 899, 1, 0, 0, 0, 899, 900, 5, 128, 0, 0, 900, 99, 1, 0, 0, 0, 901, 902, 5, 49, 0, 0, 902, 903, 3, 150, 75, 0, 903, 904, 5, 50, 0, 0, 904, 906, 3, 150, 75, 0, 905, 907, 3, 28, 14, 0, 906, 905, 1, 0, 0, 0, 906, 907, 1, 0, 0, 0, 907, 910, 1, 0, 0, 0, 908, 909, 5, 78, 0, 0, 909, 911, 3, 152, 76, 0, 910, 908, 1, 0, 0, 0, 910, 911, 1, 0, 0, 0, 911, 914, 1, 0, 0, 0, 912, 913, 5, 73, 0, 0, 913, 915, 5, 141, 0, 0, 914, 912, 1, 0, 0, 0, 914, 915, 1, 0, 0, 0, 915, 916, 1, 0, 0, 0, 916, 920, 5, 131, 0, 0, 917, 919, 3, 102, 51, 0, 918, 917, 1, 0, 0, 0, 919, 922, 1, 0, 0, 0, 920, 918, 1, 0, 0, 0, 920, 921, 1, 0, 0, 0, 921, 923, 1, 0, 0, 0, 922, 920, 1, 0, 0, 0, 923, 924, 5, 132, 0, 0, 924, 101, 1, 0, 0, 0, 925, 926, 5, 54, 0, 0, 926, 932, 3, 90, 45, 0, 927, 932, 3, 114, 57, 0, 928, 932, 3, 110, 55, 0, 929, 932, 3, 104, 52, 0, 930, 932, 3, 112, 56, 0, 931, 925, 1, 0, 0, 0, 931, 927, 1, 0, 0, 0, 931, 928, 1, 0, 0, 0, 931, 929, 1, 0, 0, 0, 931, 930, 1, 0, 0, 0, 932, 103, 1, 0, 0, 0, 933, 934, 5, 3, 0, 0, 934, 938, 5, 131, 0, 0, 935, 937, 3, 106, 53, 0, 936, 935, 1, 0, 0, 0, 937, 940, 1, 0, 0, 0, 938, 936, 1, 0, 0, 0, 938, 939, 1, 0, 0, 0, 939, 941, 1, 0, 0, 0, 940, 938, 1, 0, 0, 0, 941, 942, 5, 132, 0, 0, 942, 943, 5, 128, 0, 0, 943, 105, 1, 0, 0, 0, 944, 945, 3, 150, 75, 0, 945, 946, 5, 53, 0, 0, 946, 947, 5, 56, 0, 0, 947, 948, 3, 150, 75, 0, 948, 949, 5, 128, 0, 0, 949, 959, 1, 0, 0, 0, 950, 951, 3, 150, 75, 0, 951, 952, 5, 53, 0, 0, 952, 953, 5, 57, 0, 0, 953, 954, 3, 150, 75, 0, 954, 955, 5, 130, 0, 0, 955, 956, 3, 150, 75, 0, 956, 957, 5, 128, 0, 0, 957, 959, 1, 0, 0, 0, 958, 944, 1, 0, 0, 0, 958, 950, 1, 0, 0, 0, 959, 107, 1, 0, 0, 0, 960, 961, 3, 26, 13, 0, 961, 962, 5, 13, 0, 0, 962, 967, 5, 48, 0, 0, 963, 964, 5, 130, 0, 0, 964, 966, 3, 150, 75, 0, 965, 963, 1, 0, 0, 0, 966, 969, 1, 0, 0, 0, 967, 965, 1, 0, 0, 0, 967, 968, 1, 0, 0, 0, 968, 970, 1, 0, 0, 0, 969, 967, 1, 0, 0, 0, 970, 971, 5, 128, 0, 0, 971, 109, 1, 0, 0, 0, 972, 973, 5, 51, 0, 0, 973, 974, 3, 150, 75, 0, 974, 975, 5, 53, 0, 0, 975, 976, 5, 56, 0, 0, 976, 977, 3, 150, 75, 0, 977, 978, 5, 128, 0, 0, 978, 111, 1, 0, 0, 0, 979, 980, 5, 63, 0, 0, 980, 981, 3, 150, 75, 0, 981, 982, 5, 64, 0, 0, 982, 983, 5, 65, 0, 0, 983, 984, 5, 60, 0, 0, 984, 985, 5, 46, 0, 0, 985, 986, 3, 150, 75, 0, 986, 987, 5, 62, 0, 0, 987, 988, 5, 57, 0, 0, 988, 989, 3, 150, 75, 0, 989, 990, 5, 130, 0, 0, 990, 991, 3, 150, 75, 0, 991, 992, 5, 128, 0, 0, 992, 113, 1, 0, 0, 0, 993, 994, 5, 51, 0, 0, 994, 995, 3, 116, 58, 0, 995, 996, 5, 53, 0, 0, 996, 999, 3, 120, 60, 0, 997, 998, 5, 29, 0, 0, 998, 1000, 3, 152, 76, 0, 999, 997, 1, 0, 0, 0, 999, 1000, 1, 0, 0, 0, 1000, 1001, 1, 0, 0, 0, 1001, 1002, 5, 128, 0, 0, 1002, 115, 1, 0, 0, 0, 1003, 1004, 3, 150, 75, 0, 1004, 1005, 5, 130, 0, 0, 1005, 1006, 3, 118, 59, 0, 1006, 117, 1, 0, 0, 0, 1007, 1020, 3, 150, 75, 0, 1008, 1020, 5, 95, 0, 0, 1009, 1020, 5, 85, 0, 0, 1010, 1020, 5, 86, 0, 0, 1011, 1020, 5, 1, 0, 0, 1012, 1020, 5, 92, 0, 0, 1013, 1020, 5, 93, 0, 0, 1014, 1020, 5, 94, 0, 0, 1015, 1020, 5, 96, 0, 0, 1016, 1020, 5, 97, 0, 0, 1017, 1020, 5, 98, 0, 0, 1018, 1020, 5, 99, 0, 0, 1019, 1007, 1, 0, 0, 0, 1019, 1008, 1, 0, 0, 0, 1019, 1009, 1, 0, 0, 0, 1019, 1010, 1, 0, 0, 0, 1019, 1011, 1, 0, 0, 0, 1019, 1012, 1, 0, 0, 0, 1019, 1013, 1, 0, 0, 0, 1019, 1014, 1, 0, 0, 0, 1019, 1015, 1, 0, 0, 0, 1019, 1016, 1, 0, 0, 0, 1019, 1017, 1, 0, 0, 0, 1019, 1018, 1, 0, 0, 0, 1020, 119, 1, 0, 0, 0, 1021, 1022, 5, 56, 0, 0, 1022, 1023, 3, 150, 75, 0, 1023, 1024, 5, 130, 0, 0, 1024, 1025, 3, 124, 62, 0, 1025, 1055, 1, 0, 0, 0, 1026, 1027, 5, 57, 0, 0, 1027, 1028, 3, 150, 75, 0, 1028, 1029, 5, 130, 0, 0, 1029, 1030, 3, 150, 75, 0, 1030, 1031, 5, 130, 0, 0, 1031, 1032, 3, 126, 63, 0, 1032, 1055, 1, 0, 0, 0, 1033, 1034, 5, 39, 0, 0, 1034, 1036, 3, 150, 75, 0, 1035, 1037, 3, 28, 14, 0, 1036, 1035, 1, 0, 0, 0, 1036, 1037, 1, 0, 0, 0, 1037, 1038, 1, 0, 0, 0, 1038, 1039, 5, 130, 0, 0, 1039, 1040, 3, 116, 58, 0, 1040, 1055, 1, 0, 0, 0, 1041, 1042, 5, 41, 0, 0, 1042, 1043, 3, 150, 75, 0, 1043, 1044, 5, 130, 0, 0, 1044, 1046, 3, 150, 75, 0, 1045, 1047, 3, 28, 14, 0, 1046, 1045, 1, 0, 0, 0, 1046, 1047, 1, 0, 0, 0, 1047, 1049, 1, 0, 0, 0, 1048, 1050, 3, 128, 64, 0, 1049, 1048, 1, 0, 0, 0, 1049, 1050, 1, 0, 0, 0, 1050, 1052, 1, 0, 0, 0, 1051, 1053, 3, 122, 61, 0, 1052, 1051, 1, 0, 0, 0, 1052, 1053, 1, 0, 0, 0, 1053, 1055, 1, 0, 0, 0, 1054, 1021, 1, 0, 0, 0, 1054, 1026, 1, 0, 0, 0, 1054, 1033, 1, 0, 0, 0, 1054, 1041, 1, 0, 0, 0, 1055, 121, 1, 0, 0, 0, 1056, 1057, 5, 61, 0, 0, 1057, 1058, 3, 128, 64, 0, 1058, 123, 1, 0, 0, 0, 1059, 1060, 7, 4, 0, 0, 1060, 125, 1, 0, 0, 0, 1061, 1062, 7, 5, 0, 0, 1062, 127, 1, 0, 0, 0, 1063, 1064, 5, 59, 0, 0, 1064, 1068, 5, 131, 0, 0, 1065, 1067, 3, 130, 65, 0, 1066, 1065, 1, 0, 0, 0, 1067, 1070, 1, 0, 0, 0, 1068, 1066, 1, 0, 0, 0, 1068, 1069, 1, 0, 0, 0, 1069, 1071, 1, 0, 0, 0, 1070, 1068, 1, 0, 0, 0, 1071, 1072, 5, 132, 0, 0, 1072, 129, 1, 0, 0, 0, 1073, 1074, 3, 150, 75, 0, 1074, 1075, 5, 53, 0, 0, 1075, 1076, 5, 4, 0, 0, 1076, 1077, 5, 18, 0, 0, 1077, 1078, 5, 133, 0, 0, 1078, 1079, 3, 78, 39, 0, 1079, 1080, 5, 134, 0, 0, 1080, 1081, 5, 128, 0, 0, 1081, 1170, 1, 0, 0, 0, 1082, 1083, 3, 150, 75, 0, 1083, 1084, 5, 53, 0, 0, 1084, 1085, 5, 56, 0, 0, 1085, 1092, 3, 150, 75, 0, 1086, 1087, 5, 62, 0, 0, 1087, 1088, 5, 57, 0, 0, 1088, 1089, 3, 150, 75, 0, 1089, 1090, 5, 130, 0, 0, 1090, 1091, 3, 150, 75, 0, 1091, 1093, 1, 0, 0, 0, 1092, 1086, 1, 0, 0, 0, 1092, 1093, 1, 0, 0, 0, 1093, 1094, 1, 0, 0, 0, 1094, 1095, 5, 128, 0, 0, 1095, 1170, 1, 0, 0, 0, 1096, 1097, 3, 150, 75, 0, 1097, 1098, 5, 53, 0, 0, 1098, 1099, 5, 57, 0, 0, 1099, 1100, 3, 150, 75, 0, 1100, 1101, 5, 130, 0, 0, 1101, 1108, 3, 150, 75, 0, 1102, 1103, 5, 62, 0, 0, 1103, 1104, 5, 57, 0, 0, 1104, 1105, 3, 150, 75, 0, 1105, 1106, 5, 130, 0, 0, 1106, 1107, 3, 150, 75, 0, 1107, 1109, 1, 0, 0, 0, 1108, 1102, 1, 0, 0, 0, 1108, 1109, 1, 0, 0, 0, 1109, 1110, 1, 0, 0, 0, 1110, 1111, 5, 128, 0, 0, 1111, 1170, 1, 0, 0, 0, 1112, 1113, 3, 150, 75, 0, 1113, 1114, 5, 53, 0, 0, 1114, 1115, 5, 39, 0, 0, 1115, 1117, 3, 150, 75, 0, 1116, 1118, 3, 28, 14, 0, 1117, 1116, 1, 0, 0, 0, 1117, 1118, 1, 0, 0, 0, 1118, 1125, 1, 0, 0, 0, 1119, 1120, 5, 62, 0, 0, 1120, 1121, 5, 57, 0, 0, 1121, 1122, 3, 150, 75, 0, 1122, 1123, 5, 130, 0, 0, 1123, 1124, 3, 150, 75, 0, 1124, 1126, 1, 0, 0, 0, 1125, 1119, 1, 0, 0, 0, 1125, 1126, 1, 0, 0, 0, 1126, 1127, 1, 0, 0, 0, 1127, 1128, 5, 128, 0, 0, 1128, 1170, 1, 0, 0, 0, 1129, 1130, 3, 150, 75, 0, 1130, 1131, 5, 53, 0, 0, 1131, 1132, 5, 2, 0, 0, 1132, 1133, 3, 150, 75, 0, 1133, 1134, 5, 59, 0, 0, 1134, 1138, 5, 131, 0, 0, 1135, 1137, 3, 108, 54, 0, 1136, 1135, 1, 0, 0, 0, 1137, 1140, 1, 0, 0, 0, 1138, 1136, 1, 0, 0, 0, 1138, 1139, 1, 0, 0, 0, 1139, 1141, 1, 0, 0, 0, 1140, 1138, 1, 0, 0, 0, 1141, 1142, 5, 132, 0, 0, 1142, 1143, 5, 128, 0, 0, 1143, 1170, 1, 0, 0, 0, 1144, 1145, 3, 150, 75, 0, 1145, 1146, 5, 53, 0, 0, 1146, 1147, 5, 46, 0, 0, 1147, 1148, 3, 150, 75, 0, 1148, 1149, 5, 128, 0, 0, 1149, 1170, 1, 0, 0, 0, 1150, 1151, 3, 150, 75, 0, 1151, 1153, 5, 53, 0, 0, 1152, 1154, 5, 4, 0, 0, 1153, 1152, 1, 0, 0, 0, 1153, 1154, 1, 0, 0, 0, 1154, 1155, 1, 0, 0, 0, 1155, 1156, 5, 17, 0, 0, 1156, 1157, 3, 150, 75, 0, 1157, 1158, 5, 130, 0, 0, 1158, 1165, 3, 150, 75, 0, 1159, 1160, 5, 62, 0, 0, 1160, 1161, 5, 57, 0, 0, 1161, 1162, 3, 150, 75, 0, 1162, 1163, 5, 130, 0, 0, 1163, 1164, 3, 150, 75, 0, 1164, 1166, 1, 0, 0, 0, 1165, 1159, 1, 0, 0, 0, 1165, 1166, 1, 0, 0, 0, 1166, 1167, 1, 0, 0, 0, 1167, 1168, 5, 128, 0, 0, 1168, 1170, 1, 0, 0, 0, 1169, 1073, 1, 0, 0, 0, 1169, 1082, 1, 0, 0, 0, 1169, 1096, 1, 0, 0, 0, 1169, 1112, 1, 0, 0, 0, 1169, 1129, 1, 0, 0, 0, 1169, 1144, 1, 0, 0, 0, 1169, 1150, 1, 0, 0, 0, 1170, 131, 1, 0, 0, 0, 1171, 1172, 5, 46, 0, 0, 1172, 1173, 3, 150, 75, 0, 1173, 1174, 5, 53, 0, 0, 1174, 1175, 3, 150, 75, 0, 1175, 1176, 5, 130, 0, 0, 1176, 1178, 3, 150, 75, 0, 1177, 1179, 3, 128, 64, 0, 1178, 1177, 1, 0, 0, 0, 1178, 1179, 1, 0, 0, 0, 1179, 1180, 1, 0, 0, 0, 1180, 1181, 5, 128, 0, 0, 1181, 133, 1, 0, 0, 0, 1182, 1229, 3, 138, 69, 0, 1183, 1229, 5, 107, 0, 0, 1184, 1229, 5, 108, 0, 0, 1185, 1186, 5, 109, 0, 0, 1186, 1229, 3, 152, 76, 0, 1187, 1188, 5, 110, 0, 0, 1188, 1189, 5, 137, 0, 0, 1189, 1190, 3, 150, 75, 0, 1190, 1191, 5, 138, 0, 0, 1191, 1229, 1, 0, 0, 0, 1192, 1193, 5, 111, 0, 0, 1193, 1194, 5, 137, 0, 0, 1194, 1196, 3, 150, 75, 0, 1195, 1197, 3, 28, 14, 0, 1196, 1195, 1, 0, 0, 0, 1196, 1197, 1, 0, 0, 0, 1197, 1198, 1, 0, 0, 0, 1198, 1199, 5, 138, 0, 0, 1199, 1229, 1, 0, 0, 0, 1200, 1201, 5, 34, 0, 0, 1201, 1202, 5, 137, 0, 0, 1202, 1203, 3, 150, 75, 0, 1203, 1204, 5, 138, 0, 0, 1204, 1229, 1, 0, 0, 0, 1205, 1206, 5, 112, 0, 0, 1206, 1207, 5, 137, 0, 0, 1207, 1208, 3, 134, 67, 0, 1208, 1209, 5, 138, 0, 0, 1209, 1229, 1, 0, 0, 0, 1210, 1211, 5, 113, 0, 0, 1211, 1212, 5, 137, 0, 0, 1212, 1213, 3, 134, 67, 0, 1213, 1214, 5, 138, 0, 0, 1214, 1229, 1, 0, 0, 0, 1215, 1216, 5, 114, 0, 0, 1216, 1220, 5, 131, 0, 0, 1217, 1219, 3, 136, 68, 0, 1218, 1217, 1, 0, 0, 0, 1219, 1222, 1, 0, 0, 0, 1220, 1218, 1, 0, 0, 0, 1220, 1221, 1, 0, 0, 0, 1221, 1223, 1, 0, 0, 0, 1222, 1220, 1, 0, 0, 0, 1223, 1229, 5, 132, 0, 0, 1224, 1226, 3, 150, 75, 0, 1225, 1227, 3, 28, 14, 0, 1226, 1225, 1, 0, 0, 0, 1226, 1227, 1, 0, 0, 0, 1227, 1229, 1, 0, 0, 0, 1228, 1182, 1, 0, 0, 0, 1228, 1183, 1, 0, 0, 0, 1228, 1184, 1, 0, 0, 0, 1228, 1185, 1, 0, 0, 0, 1228, 1187, 1, 0, 0, 0, 1228, 1192, 1, 0, 0, 0, 1228, 1200, 1, 0, 0, 0, 1228, 1205, 1, 0, 0, 0, 1228, 1210, 1, 0, 0, 0, 1228, 1215, 1, 0, 0, 0, 1228, 1224, 1, 0, 0, 0, 1229, 135, 1, 0, 0, 0, 1230, 1231, 3, 150, 75, 0, 1231, 1232, 5, 127, 0, 0, 1232, 1233, 3, 134, 67, 0, 1233, 1234, 5, 128, 0, 0, 1234, 137, 1, 0, 0, 0, 1235, 1236, 7, 6, 0, 0, 1236, 139, 1, 0, 0, 0, 1237, 1238, 7, 7, 0, 0, 1238, 141, 1, 0, 0, 0, 1239, 1248, 3, 152, 76, 0, 1240, 1248, 5, 141, 0, 0, 1241, 1248, 5, 142, 0, 0, 1242, 1248, 5, 123, 0, 0, 1243, 1248, 5, 124, 0, 0, 1244, 1248, 5, 125, 0, 0, 1245, 1248, 3, 144, 72, 0, 1246, 1248, 3, 148, 74, 0, 1247, 1239, 1, 0, 0, 0, 1247, 1240, 1, 0, 0, 0, 1247, 1241, 1, 0, 0, 0, 1247, 1242, 1, 0, 0, 0, 1247, 1243, 1, 0, 0, 0, 1247, 1244, 1, 0, 0, 0, 1247, 1245, 1, 0, 0, 0, 1247, 1246, 1, 0, 0, 0, 1248, 143, 1, 0, 0, 0, 1249, 1258, 5, 131, 0, 0, 1250, 1255, 3, 146, 73, 0, 1251, 1252, 5, 129, 0, 0, 1252, 1254, 3, 146, 73, 0, 1253, 1251, 1, 0, 0, 0, 1254, 1257, 1, 0, 0, 0, 1255, 1253, 1, 0, 0, 0, 1255, 1256, 1, 0, 0, 0, 1256, 1259, 1, 0, 0, 0, 1257, 1255, 1, 0, 0, 0, 1258, 1250, 1, 0, 0, 0, 1258, 1259, 1, 0, 0, 0, 1259, 1260, 1, 0, 0, 0, 1260, 1261, 5, 132, 0, 0, 1261, 145, 1, 0, 0, 0, 1262, 1263, 3, 152, 76, 0, 1263, 1264, 5, 127, 0, 0, 1264, 1265, 3, 142, 71, 0, 1265, 147, 1, 0, 0, 0, 1266, 1275, 5, 133, 0, 0, 1267, 1272, 3, 142, 71, 0, 1268, 1269, 5, 129, 0, 0, 1269, 1271, 3, 142, 71, 0, 1270, 1268, 1, 0, 0, 0, 1271, 1274, 1, 0, 0, 0, 1272, 1270, 1, 0, 0, 0, 1272, 1273, 1, 0, 0, 0, 1273, 1276, 1, 0, 0, 0, 1274, 1272, 1, 0, 0, 0, 1275, 1267, 1, 0, 0, 0, 1275, 1276, 1, 0, 0, 0, 1276, 1277, 1, 0, 0, 0, 1277, 1278, 5, 134, 0, 0, 1278, 149, 1, 0, 0, 0, 1279, 1280, 7, 8, 0, 0, 1280, 151, 1, 0, 0, 0, 1281, 1282, 5, 144, 0, 0, 1282, 153, 1, 0, 0, 0, 114, 166, 173, 194, 206, 218, 238, 246, 253, 259, 271, 274, 280, 291, 300, 310, 313, 315, 319, 327, 339, 344, 353, 356, 371, 377, 389, 398, 406, 414, 427, 430, 440, 444, 450, 457, 463, 471, 479, 492, 499, 503, 508, 519, 525, 535, 540, 546, 557, 584, 611, 616, 627, 630, 635, 638, 645, 654, 657, 660, 677, 686, 700, 721, 724, 727, 734, 742, 782, 785, 807, 821, 829, 841, 855, 865, 883, 887, 890, 894, 897, 906, 910, 914, 920, 931, 938, 958, 967, 999, 1019, 1036, 1046, 1049, 1052, 1054, 1068, 1092, 1108, 1117, 1125, 1138, 1153, 1165, 1169, 1178, 1196, 1220, 1226, 1228, 1247, 1255, 1258, 1272, 1275] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapability.tokens b/src/capability-language/generated/QuixosCapability.tokens index 25f0df9..3f8605d 100644 --- a/src/capability-language/generated/QuixosCapability.tokens +++ b/src/capability-language/generated/QuixosCapability.tokens @@ -58,92 +58,93 @@ EDGE=57 PROJECTION=58 WITH=59 USING=60 -VIA=61 -MATERIALIZE=62 -IF=63 -ABSENT=64 -ON=65 -POLICY=66 -DEFAULT=67 -SOURCE=68 -REPOSITORY=69 -COMMIT=70 -REVISION=71 -SEMANTIC_MAJOR=72 -ON_DELETE=73 -RETAIN_OTHER=74 -KEYED=75 -PUBLIC_TRAVERSAL=76 -ID=77 -DOC=78 -MODE=79 -EMITS=80 -RECEIVER=81 -REQUIRES=82 -ANY=83 -GET=84 -SET=85 -WATCH=86 -START=87 -STOP=88 -READ=89 -WRITE=90 -RESOLVE=91 -CONNECT=92 -DISCONNECT=93 -CALL=94 -WATCH_START=95 -WATCH_STOP=96 -SUBSCRIBE=97 -UNSUBSCRIBE=98 -REGISTER=99 -CRDT=100 -OPTIONAL_ONE=101 -EXACTLY_ONE=102 -MANY_UNIQUE=103 -MANY=104 -ORDERED=105 -UNIT=106 -WATCH_HANDLE=107 -MESSAGE=108 -ATOM_REF=109 -INTERFACE_REF=110 -OPTIONAL=111 -LIST=112 -RECORD=113 -BOOL=114 -BYTES=115 -DOUBLE=116 -INT32=117 -INT64=118 -STRING=119 -UINT32=120 -UINT64=121 -TRUE=122 -FALSE=123 -NULL=124 -ARROW=125 -COLON=126 -SEMI=127 -COMMA=128 -DOT=129 -LBRACE=130 -RBRACE=131 -LBRACK=132 -RBRACK=133 -LPAREN=134 -RPAREN=135 -LT=136 -GT=137 -AMP=138 -EQUAL=139 -INTEGER=140 -JSON_NUMBER=141 -IDENTIFIER=142 -STRING_LITERAL=143 -LINE_COMMENT=144 -BLOCK_COMMENT=145 -WS=146 +ACCEPT=61 +VIA=62 +MATERIALIZE=63 +IF=64 +ABSENT=65 +ON=66 +POLICY=67 +DEFAULT=68 +SOURCE=69 +REPOSITORY=70 +COMMIT=71 +REVISION=72 +SEMANTIC_MAJOR=73 +ON_DELETE=74 +RETAIN_OTHER=75 +KEYED=76 +PUBLIC_TRAVERSAL=77 +ID=78 +DOC=79 +MODE=80 +EMITS=81 +RECEIVER=82 +REQUIRES=83 +ANY=84 +GET=85 +SET=86 +WATCH=87 +START=88 +STOP=89 +READ=90 +WRITE=91 +RESOLVE=92 +CONNECT=93 +DISCONNECT=94 +CALL=95 +WATCH_START=96 +WATCH_STOP=97 +SUBSCRIBE=98 +UNSUBSCRIBE=99 +REGISTER=100 +CRDT=101 +OPTIONAL_ONE=102 +EXACTLY_ONE=103 +MANY_UNIQUE=104 +MANY=105 +ORDERED=106 +UNIT=107 +WATCH_HANDLE=108 +MESSAGE=109 +ATOM_REF=110 +INTERFACE_REF=111 +OPTIONAL=112 +LIST=113 +RECORD=114 +BOOL=115 +BYTES=116 +DOUBLE=117 +INT32=118 +INT64=119 +STRING=120 +UINT32=121 +UINT64=122 +TRUE=123 +FALSE=124 +NULL=125 +ARROW=126 +COLON=127 +SEMI=128 +COMMA=129 +DOT=130 +LBRACE=131 +RBRACE=132 +LBRACK=133 +RBRACK=134 +LPAREN=135 +RPAREN=136 +LT=137 +GT=138 +AMP=139 +EQUAL=140 +INTEGER=141 +JSON_NUMBER=142 +IDENTIFIER=143 +STRING_LITERAL=144 +LINE_COMMENT=145 +BLOCK_COMMENT=146 +WS=147 'edit'=1 'creation'=2 'initialize'=3 @@ -204,82 +205,83 @@ WS=146 'projection'=58 'with'=59 'using'=60 -'via'=61 -'materialize'=62 -'if'=63 -'absent'=64 -'on'=65 -'policy'=66 -'default'=67 -'source'=68 -'repository'=69 -'commit'=70 -'revision'=71 -'semantic-major'=72 -'on-delete'=73 -'retain-other'=74 -'keyed'=75 -'public-traversal'=76 -'id'=77 -'doc'=78 -'mode'=79 -'emits'=80 -'receiver'=81 -'requires'=82 -'any'=83 -'get'=84 -'set'=85 -'watch'=86 -'start'=87 -'stop'=88 -'read'=89 -'write'=90 -'resolve'=91 -'connect'=92 -'disconnect'=93 -'call'=94 -'watch-start'=95 -'watch-stop'=96 -'subscribe'=97 -'unsubscribe'=98 -'register'=99 -'crdt'=100 -'optional-one'=101 -'exactly-one'=102 -'many-unique'=103 -'many'=104 -'ordered'=105 -'unit'=106 -'watch-handle'=107 -'message'=108 -'atom-ref'=109 -'interface-ref'=110 -'optional'=111 -'list'=112 -'record'=113 -'bool'=114 -'bytes'=115 -'double'=116 -'int32'=117 -'int64'=118 -'string'=119 -'uint32'=120 -'uint64'=121 -'true'=122 -'false'=123 -'null'=124 -'->'=125 -':'=126 -';'=127 -','=128 -'.'=129 -'{'=130 -'}'=131 -'['=132 -']'=133 -'('=134 -')'=135 -'<'=136 -'>'=137 -'&'=138 -'='=139 +'accept'=61 +'via'=62 +'materialize'=63 +'if'=64 +'absent'=65 +'on'=66 +'policy'=67 +'default'=68 +'source'=69 +'repository'=70 +'commit'=71 +'revision'=72 +'semantic-major'=73 +'on-delete'=74 +'retain-other'=75 +'keyed'=76 +'public-traversal'=77 +'id'=78 +'doc'=79 +'mode'=80 +'emits'=81 +'receiver'=82 +'requires'=83 +'any'=84 +'get'=85 +'set'=86 +'watch'=87 +'start'=88 +'stop'=89 +'read'=90 +'write'=91 +'resolve'=92 +'connect'=93 +'disconnect'=94 +'call'=95 +'watch-start'=96 +'watch-stop'=97 +'subscribe'=98 +'unsubscribe'=99 +'register'=100 +'crdt'=101 +'optional-one'=102 +'exactly-one'=103 +'many-unique'=104 +'many'=105 +'ordered'=106 +'unit'=107 +'watch-handle'=108 +'message'=109 +'atom-ref'=110 +'interface-ref'=111 +'optional'=112 +'list'=113 +'record'=114 +'bool'=115 +'bytes'=116 +'double'=117 +'int32'=118 +'int64'=119 +'string'=120 +'uint32'=121 +'uint64'=122 +'true'=123 +'false'=124 +'null'=125 +'->'=126 +':'=127 +';'=128 +','=129 +'.'=130 +'{'=131 +'}'=132 +'['=133 +']'=134 +'('=135 +')'=136 +'<'=137 +'>'=138 +'&'=139 +'='=140 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.interp b/src/capability-language/generated/QuixosCapabilityLexer.interp index fff6f1b..8117fb2 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.interp +++ b/src/capability-language/generated/QuixosCapabilityLexer.interp @@ -60,6 +60,7 @@ null 'projection' 'with' 'using' +'accept' 'via' 'materialize' 'if' @@ -209,6 +210,7 @@ EDGE PROJECTION WITH USING +ACCEPT VIA MATERIALIZE IF @@ -357,6 +359,7 @@ EDGE PROJECTION WITH USING +ACCEPT VIA MATERIALIZE IF @@ -454,4 +457,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 146, 1397, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 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, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 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, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 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, 17, 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, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 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, 26, 1, 26, 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, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 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, 32, 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, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 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, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 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, 42, 1, 42, 1, 42, 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, 44, 1, 44, 1, 44, 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, 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, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 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, 1, 53, 1, 53, 1, 54, 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, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 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, 59, 1, 59, 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, 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, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 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, 67, 1, 68, 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, 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, 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, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 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, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 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, 80, 1, 80, 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, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 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, 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, 91, 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, 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, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 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, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 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, 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, 100, 1, 100, 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, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 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, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 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, 3, 139, 1298, 8, 139, 1, 139, 4, 139, 1301, 8, 139, 11, 139, 12, 139, 1302, 1, 140, 3, 140, 1306, 8, 140, 1, 140, 1, 140, 1, 140, 5, 140, 1311, 8, 140, 10, 140, 12, 140, 1314, 9, 140, 3, 140, 1316, 8, 140, 1, 140, 1, 140, 4, 140, 1320, 8, 140, 11, 140, 12, 140, 1321, 3, 140, 1324, 8, 140, 1, 140, 1, 140, 3, 140, 1328, 8, 140, 1, 140, 4, 140, 1331, 8, 140, 11, 140, 12, 140, 1332, 3, 140, 1335, 8, 140, 1, 141, 1, 141, 5, 141, 1339, 8, 141, 10, 141, 12, 141, 1342, 9, 141, 1, 142, 1, 142, 1, 142, 5, 142, 1347, 8, 142, 10, 142, 12, 142, 1350, 9, 142, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 1, 143, 3, 143, 1362, 8, 143, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 5, 145, 1370, 8, 145, 10, 145, 12, 145, 1373, 9, 145, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 5, 146, 1381, 8, 146, 10, 146, 12, 146, 1384, 9, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 146, 1, 147, 4, 147, 1392, 8, 147, 11, 147, 12, 147, 1393, 1, 147, 1, 147, 1, 1382, 0, 148, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 143, 287, 0, 289, 0, 291, 144, 293, 145, 295, 146, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1411, 0, 1, 1, 0, 0, 0, 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, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 1, 0, 0, 0, 0, 285, 1, 0, 0, 0, 0, 291, 1, 0, 0, 0, 0, 293, 1, 0, 0, 0, 0, 295, 1, 0, 0, 0, 1, 297, 1, 0, 0, 0, 3, 302, 1, 0, 0, 0, 5, 311, 1, 0, 0, 0, 7, 322, 1, 0, 0, 0, 9, 332, 1, 0, 0, 0, 11, 342, 1, 0, 0, 0, 13, 351, 1, 0, 0, 0, 15, 363, 1, 0, 0, 0, 17, 370, 1, 0, 0, 0, 19, 378, 1, 0, 0, 0, 21, 387, 1, 0, 0, 0, 23, 395, 1, 0, 0, 0, 25, 401, 1, 0, 0, 0, 27, 406, 1, 0, 0, 0, 29, 419, 1, 0, 0, 0, 31, 429, 1, 0, 0, 0, 33, 441, 1, 0, 0, 0, 35, 447, 1, 0, 0, 0, 37, 458, 1, 0, 0, 0, 39, 469, 1, 0, 0, 0, 41, 474, 1, 0, 0, 0, 43, 483, 1, 0, 0, 0, 45, 493, 1, 0, 0, 0, 47, 498, 1, 0, 0, 0, 49, 502, 1, 0, 0, 0, 51, 508, 1, 0, 0, 0, 53, 513, 1, 0, 0, 0, 55, 523, 1, 0, 0, 0, 57, 527, 1, 0, 0, 0, 59, 540, 1, 0, 0, 0, 61, 545, 1, 0, 0, 0, 63, 552, 1, 0, 0, 0, 65, 561, 1, 0, 0, 0, 67, 572, 1, 0, 0, 0, 69, 576, 1, 0, 0, 0, 71, 585, 1, 0, 0, 0, 73, 592, 1, 0, 0, 0, 75, 601, 1, 0, 0, 0, 77, 606, 1, 0, 0, 0, 79, 616, 1, 0, 0, 0, 81, 627, 1, 0, 0, 0, 83, 635, 1, 0, 0, 0, 85, 641, 1, 0, 0, 0, 87, 650, 1, 0, 0, 0, 89, 660, 1, 0, 0, 0, 91, 669, 1, 0, 0, 0, 93, 681, 1, 0, 0, 0, 95, 692, 1, 0, 0, 0, 97, 698, 1, 0, 0, 0, 99, 706, 1, 0, 0, 0, 101, 709, 1, 0, 0, 0, 103, 714, 1, 0, 0, 0, 105, 721, 1, 0, 0, 0, 107, 724, 1, 0, 0, 0, 109, 732, 1, 0, 0, 0, 111, 739, 1, 0, 0, 0, 113, 745, 1, 0, 0, 0, 115, 750, 1, 0, 0, 0, 117, 761, 1, 0, 0, 0, 119, 766, 1, 0, 0, 0, 121, 772, 1, 0, 0, 0, 123, 776, 1, 0, 0, 0, 125, 788, 1, 0, 0, 0, 127, 791, 1, 0, 0, 0, 129, 798, 1, 0, 0, 0, 131, 801, 1, 0, 0, 0, 133, 808, 1, 0, 0, 0, 135, 816, 1, 0, 0, 0, 137, 823, 1, 0, 0, 0, 139, 834, 1, 0, 0, 0, 141, 841, 1, 0, 0, 0, 143, 850, 1, 0, 0, 0, 145, 865, 1, 0, 0, 0, 147, 875, 1, 0, 0, 0, 149, 888, 1, 0, 0, 0, 151, 894, 1, 0, 0, 0, 153, 911, 1, 0, 0, 0, 155, 914, 1, 0, 0, 0, 157, 918, 1, 0, 0, 0, 159, 923, 1, 0, 0, 0, 161, 929, 1, 0, 0, 0, 163, 938, 1, 0, 0, 0, 165, 947, 1, 0, 0, 0, 167, 951, 1, 0, 0, 0, 169, 955, 1, 0, 0, 0, 171, 959, 1, 0, 0, 0, 173, 965, 1, 0, 0, 0, 175, 971, 1, 0, 0, 0, 177, 976, 1, 0, 0, 0, 179, 981, 1, 0, 0, 0, 181, 987, 1, 0, 0, 0, 183, 995, 1, 0, 0, 0, 185, 1003, 1, 0, 0, 0, 187, 1014, 1, 0, 0, 0, 189, 1019, 1, 0, 0, 0, 191, 1031, 1, 0, 0, 0, 193, 1042, 1, 0, 0, 0, 195, 1052, 1, 0, 0, 0, 197, 1064, 1, 0, 0, 0, 199, 1073, 1, 0, 0, 0, 201, 1078, 1, 0, 0, 0, 203, 1091, 1, 0, 0, 0, 205, 1103, 1, 0, 0, 0, 207, 1115, 1, 0, 0, 0, 209, 1120, 1, 0, 0, 0, 211, 1128, 1, 0, 0, 0, 213, 1133, 1, 0, 0, 0, 215, 1146, 1, 0, 0, 0, 217, 1154, 1, 0, 0, 0, 219, 1163, 1, 0, 0, 0, 221, 1177, 1, 0, 0, 0, 223, 1186, 1, 0, 0, 0, 225, 1191, 1, 0, 0, 0, 227, 1198, 1, 0, 0, 0, 229, 1203, 1, 0, 0, 0, 231, 1209, 1, 0, 0, 0, 233, 1216, 1, 0, 0, 0, 235, 1222, 1, 0, 0, 0, 237, 1228, 1, 0, 0, 0, 239, 1235, 1, 0, 0, 0, 241, 1242, 1, 0, 0, 0, 243, 1249, 1, 0, 0, 0, 245, 1254, 1, 0, 0, 0, 247, 1260, 1, 0, 0, 0, 249, 1265, 1, 0, 0, 0, 251, 1268, 1, 0, 0, 0, 253, 1270, 1, 0, 0, 0, 255, 1272, 1, 0, 0, 0, 257, 1274, 1, 0, 0, 0, 259, 1276, 1, 0, 0, 0, 261, 1278, 1, 0, 0, 0, 263, 1280, 1, 0, 0, 0, 265, 1282, 1, 0, 0, 0, 267, 1284, 1, 0, 0, 0, 269, 1286, 1, 0, 0, 0, 271, 1288, 1, 0, 0, 0, 273, 1290, 1, 0, 0, 0, 275, 1292, 1, 0, 0, 0, 277, 1294, 1, 0, 0, 0, 279, 1297, 1, 0, 0, 0, 281, 1305, 1, 0, 0, 0, 283, 1336, 1, 0, 0, 0, 285, 1343, 1, 0, 0, 0, 287, 1353, 1, 0, 0, 0, 289, 1363, 1, 0, 0, 0, 291, 1365, 1, 0, 0, 0, 293, 1376, 1, 0, 0, 0, 295, 1391, 1, 0, 0, 0, 297, 298, 5, 101, 0, 0, 298, 299, 5, 100, 0, 0, 299, 300, 5, 105, 0, 0, 300, 301, 5, 116, 0, 0, 301, 2, 1, 0, 0, 0, 302, 303, 5, 99, 0, 0, 303, 304, 5, 114, 0, 0, 304, 305, 5, 101, 0, 0, 305, 306, 5, 97, 0, 0, 306, 307, 5, 116, 0, 0, 307, 308, 5, 105, 0, 0, 308, 309, 5, 111, 0, 0, 309, 310, 5, 110, 0, 0, 310, 4, 1, 0, 0, 0, 311, 312, 5, 105, 0, 0, 312, 313, 5, 110, 0, 0, 313, 314, 5, 105, 0, 0, 314, 315, 5, 116, 0, 0, 315, 316, 5, 105, 0, 0, 316, 317, 5, 97, 0, 0, 317, 318, 5, 108, 0, 0, 318, 319, 5, 105, 0, 0, 319, 320, 5, 122, 0, 0, 320, 321, 5, 101, 0, 0, 321, 6, 1, 0, 0, 0, 322, 323, 5, 119, 0, 0, 323, 324, 5, 111, 0, 0, 324, 325, 5, 114, 0, 0, 325, 326, 5, 107, 0, 0, 326, 327, 5, 115, 0, 0, 327, 328, 5, 112, 0, 0, 328, 329, 5, 97, 0, 0, 329, 330, 5, 99, 0, 0, 330, 331, 5, 101, 0, 0, 331, 8, 1, 0, 0, 0, 332, 333, 5, 101, 0, 0, 333, 334, 5, 120, 0, 0, 334, 335, 5, 101, 0, 0, 335, 336, 5, 99, 0, 0, 336, 337, 5, 117, 0, 0, 337, 338, 5, 116, 0, 0, 338, 339, 5, 105, 0, 0, 339, 340, 5, 111, 0, 0, 340, 341, 5, 110, 0, 0, 341, 10, 1, 0, 0, 0, 342, 343, 5, 115, 0, 0, 343, 344, 5, 110, 0, 0, 344, 345, 5, 97, 0, 0, 345, 346, 5, 112, 0, 0, 346, 347, 5, 115, 0, 0, 347, 348, 5, 104, 0, 0, 348, 349, 5, 111, 0, 0, 349, 350, 5, 116, 0, 0, 350, 12, 1, 0, 0, 0, 351, 352, 5, 116, 0, 0, 352, 353, 5, 114, 0, 0, 353, 354, 5, 97, 0, 0, 354, 355, 5, 110, 0, 0, 355, 356, 5, 115, 0, 0, 356, 357, 5, 97, 0, 0, 357, 358, 5, 99, 0, 0, 358, 359, 5, 116, 0, 0, 359, 360, 5, 105, 0, 0, 360, 361, 5, 111, 0, 0, 361, 362, 5, 110, 0, 0, 362, 14, 1, 0, 0, 0, 363, 364, 5, 114, 0, 0, 364, 365, 5, 101, 0, 0, 365, 366, 5, 109, 0, 0, 366, 367, 5, 111, 0, 0, 367, 368, 5, 116, 0, 0, 368, 369, 5, 101, 0, 0, 369, 16, 1, 0, 0, 0, 370, 371, 5, 116, 0, 0, 371, 372, 5, 97, 0, 0, 372, 373, 5, 114, 0, 0, 373, 374, 5, 103, 0, 0, 374, 375, 5, 101, 0, 0, 375, 376, 5, 116, 0, 0, 376, 377, 5, 115, 0, 0, 377, 18, 1, 0, 0, 0, 378, 379, 5, 112, 0, 0, 379, 380, 5, 111, 0, 0, 380, 381, 5, 114, 0, 0, 381, 382, 5, 116, 0, 0, 382, 383, 5, 97, 0, 0, 383, 384, 5, 98, 0, 0, 384, 385, 5, 108, 0, 0, 385, 386, 5, 101, 0, 0, 386, 20, 1, 0, 0, 0, 387, 388, 5, 114, 0, 0, 388, 389, 5, 101, 0, 0, 389, 390, 5, 112, 0, 0, 390, 391, 5, 108, 0, 0, 391, 392, 5, 105, 0, 0, 392, 393, 5, 99, 0, 0, 393, 394, 5, 97, 0, 0, 394, 22, 1, 0, 0, 0, 395, 396, 5, 108, 0, 0, 396, 397, 5, 111, 0, 0, 397, 398, 5, 99, 0, 0, 398, 399, 5, 97, 0, 0, 399, 400, 5, 108, 0, 0, 400, 24, 1, 0, 0, 0, 401, 402, 5, 102, 0, 0, 402, 403, 5, 114, 0, 0, 403, 404, 5, 111, 0, 0, 404, 405, 5, 109, 0, 0, 405, 26, 1, 0, 0, 0, 406, 407, 5, 114, 0, 0, 407, 408, 5, 101, 0, 0, 408, 409, 5, 115, 0, 0, 409, 410, 5, 117, 0, 0, 410, 411, 5, 108, 0, 0, 411, 412, 5, 116, 0, 0, 412, 413, 5, 45, 0, 0, 413, 414, 5, 98, 0, 0, 414, 415, 5, 121, 0, 0, 415, 416, 5, 116, 0, 0, 416, 417, 5, 101, 0, 0, 417, 418, 5, 115, 0, 0, 418, 28, 1, 0, 0, 0, 419, 420, 5, 114, 0, 0, 420, 421, 5, 112, 0, 0, 421, 422, 5, 99, 0, 0, 422, 423, 5, 45, 0, 0, 423, 424, 5, 99, 0, 0, 424, 425, 5, 97, 0, 0, 425, 426, 5, 108, 0, 0, 426, 427, 5, 108, 0, 0, 427, 428, 5, 115, 0, 0, 428, 30, 1, 0, 0, 0, 429, 430, 5, 100, 0, 0, 430, 431, 5, 101, 0, 0, 431, 432, 5, 97, 0, 0, 432, 433, 5, 100, 0, 0, 433, 434, 5, 108, 0, 0, 434, 435, 5, 105, 0, 0, 435, 436, 5, 110, 0, 0, 436, 437, 5, 101, 0, 0, 437, 438, 5, 45, 0, 0, 438, 439, 5, 109, 0, 0, 439, 440, 5, 115, 0, 0, 440, 32, 1, 0, 0, 0, 441, 442, 5, 113, 0, 0, 442, 443, 5, 117, 0, 0, 443, 444, 5, 101, 0, 0, 444, 445, 5, 114, 0, 0, 445, 446, 5, 121, 0, 0, 446, 34, 1, 0, 0, 0, 447, 448, 5, 114, 0, 0, 448, 449, 5, 101, 0, 0, 449, 450, 5, 102, 0, 0, 450, 451, 5, 108, 0, 0, 451, 452, 5, 101, 0, 0, 452, 453, 5, 99, 0, 0, 453, 454, 5, 116, 0, 0, 454, 455, 5, 105, 0, 0, 455, 456, 5, 111, 0, 0, 456, 457, 5, 110, 0, 0, 457, 36, 1, 0, 0, 0, 458, 459, 5, 115, 0, 0, 459, 460, 5, 112, 0, 0, 460, 461, 5, 101, 0, 0, 461, 462, 5, 99, 0, 0, 462, 463, 5, 105, 0, 0, 463, 464, 5, 97, 0, 0, 464, 465, 5, 108, 0, 0, 465, 466, 5, 105, 0, 0, 466, 467, 5, 122, 0, 0, 467, 468, 5, 101, 0, 0, 468, 38, 1, 0, 0, 0, 469, 470, 5, 114, 0, 0, 470, 471, 5, 111, 0, 0, 471, 472, 5, 111, 0, 0, 472, 473, 5, 116, 0, 0, 473, 40, 1, 0, 0, 0, 474, 475, 5, 100, 0, 0, 475, 476, 5, 111, 0, 0, 476, 477, 5, 99, 0, 0, 477, 478, 5, 117, 0, 0, 478, 479, 5, 109, 0, 0, 479, 480, 5, 101, 0, 0, 480, 481, 5, 110, 0, 0, 481, 482, 5, 116, 0, 0, 482, 42, 1, 0, 0, 0, 483, 484, 5, 102, 0, 0, 484, 485, 5, 114, 0, 0, 485, 486, 5, 97, 0, 0, 486, 487, 5, 103, 0, 0, 487, 488, 5, 109, 0, 0, 488, 489, 5, 101, 0, 0, 489, 490, 5, 110, 0, 0, 490, 491, 5, 116, 0, 0, 491, 492, 5, 115, 0, 0, 492, 44, 1, 0, 0, 0, 493, 494, 5, 118, 0, 0, 494, 495, 5, 105, 0, 0, 495, 496, 5, 101, 0, 0, 496, 497, 5, 119, 0, 0, 497, 46, 1, 0, 0, 0, 498, 499, 5, 109, 0, 0, 499, 500, 5, 97, 0, 0, 500, 501, 5, 120, 0, 0, 501, 48, 1, 0, 0, 0, 502, 503, 5, 97, 0, 0, 503, 504, 5, 108, 0, 0, 504, 505, 5, 108, 0, 0, 505, 506, 5, 111, 0, 0, 506, 507, 5, 119, 0, 0, 507, 50, 1, 0, 0, 0, 508, 509, 5, 112, 0, 0, 509, 510, 5, 111, 0, 0, 510, 511, 5, 108, 0, 0, 511, 512, 5, 108, 0, 0, 512, 52, 1, 0, 0, 0, 513, 514, 5, 113, 0, 0, 514, 515, 5, 117, 0, 0, 515, 516, 5, 101, 0, 0, 516, 517, 5, 114, 0, 0, 517, 518, 5, 121, 0, 0, 518, 519, 5, 97, 0, 0, 519, 520, 5, 98, 0, 0, 520, 521, 5, 108, 0, 0, 521, 522, 5, 101, 0, 0, 522, 54, 1, 0, 0, 0, 523, 524, 5, 114, 0, 0, 524, 525, 5, 112, 0, 0, 525, 526, 5, 99, 0, 0, 526, 56, 1, 0, 0, 0, 527, 528, 5, 113, 0, 0, 528, 529, 5, 117, 0, 0, 529, 530, 5, 101, 0, 0, 530, 531, 5, 114, 0, 0, 531, 532, 5, 121, 0, 0, 532, 533, 5, 45, 0, 0, 533, 534, 5, 114, 0, 0, 534, 535, 5, 101, 0, 0, 535, 536, 5, 97, 0, 0, 536, 537, 5, 115, 0, 0, 537, 538, 5, 111, 0, 0, 538, 539, 5, 110, 0, 0, 539, 58, 1, 0, 0, 0, 540, 541, 5, 116, 0, 0, 541, 542, 5, 121, 0, 0, 542, 543, 5, 112, 0, 0, 543, 544, 5, 101, 0, 0, 544, 60, 1, 0, 0, 0, 545, 546, 5, 111, 0, 0, 546, 547, 5, 98, 0, 0, 547, 548, 5, 106, 0, 0, 548, 549, 5, 101, 0, 0, 549, 550, 5, 99, 0, 0, 550, 551, 5, 116, 0, 0, 551, 62, 1, 0, 0, 0, 552, 553, 5, 115, 0, 0, 553, 554, 5, 116, 0, 0, 554, 555, 5, 111, 0, 0, 555, 556, 5, 114, 0, 0, 556, 557, 5, 97, 0, 0, 557, 558, 5, 98, 0, 0, 558, 559, 5, 108, 0, 0, 559, 560, 5, 101, 0, 0, 560, 64, 1, 0, 0, 0, 561, 562, 5, 105, 0, 0, 562, 563, 5, 109, 0, 0, 563, 564, 5, 112, 0, 0, 564, 565, 5, 108, 0, 0, 565, 566, 5, 101, 0, 0, 566, 567, 5, 109, 0, 0, 567, 568, 5, 101, 0, 0, 568, 569, 5, 110, 0, 0, 569, 570, 5, 116, 0, 0, 570, 571, 5, 115, 0, 0, 571, 66, 1, 0, 0, 0, 572, 573, 5, 114, 0, 0, 573, 574, 5, 101, 0, 0, 574, 575, 5, 102, 0, 0, 575, 68, 1, 0, 0, 0, 576, 577, 5, 102, 0, 0, 577, 578, 5, 114, 0, 0, 578, 579, 5, 97, 0, 0, 579, 580, 5, 103, 0, 0, 580, 581, 5, 109, 0, 0, 581, 582, 5, 101, 0, 0, 582, 583, 5, 110, 0, 0, 583, 584, 5, 116, 0, 0, 584, 70, 1, 0, 0, 0, 585, 586, 5, 105, 0, 0, 586, 587, 5, 109, 0, 0, 587, 588, 5, 112, 0, 0, 588, 589, 5, 111, 0, 0, 589, 590, 5, 114, 0, 0, 590, 591, 5, 116, 0, 0, 591, 72, 1, 0, 0, 0, 592, 593, 5, 101, 0, 0, 593, 594, 5, 120, 0, 0, 594, 595, 5, 116, 0, 0, 595, 596, 5, 101, 0, 0, 596, 597, 5, 114, 0, 0, 597, 598, 5, 110, 0, 0, 598, 599, 5, 97, 0, 0, 599, 600, 5, 108, 0, 0, 600, 74, 1, 0, 0, 0, 601, 602, 5, 97, 0, 0, 602, 603, 5, 116, 0, 0, 603, 604, 5, 111, 0, 0, 604, 605, 5, 109, 0, 0, 605, 76, 1, 0, 0, 0, 606, 607, 5, 105, 0, 0, 607, 608, 5, 110, 0, 0, 608, 609, 5, 116, 0, 0, 609, 610, 5, 101, 0, 0, 610, 611, 5, 114, 0, 0, 611, 612, 5, 102, 0, 0, 612, 613, 5, 97, 0, 0, 613, 614, 5, 99, 0, 0, 614, 615, 5, 101, 0, 0, 615, 78, 1, 0, 0, 0, 616, 617, 5, 105, 0, 0, 617, 618, 5, 110, 0, 0, 618, 619, 5, 116, 0, 0, 619, 620, 5, 101, 0, 0, 620, 621, 5, 114, 0, 0, 621, 622, 5, 102, 0, 0, 622, 623, 5, 97, 0, 0, 623, 624, 5, 99, 0, 0, 624, 625, 5, 101, 0, 0, 625, 626, 5, 115, 0, 0, 626, 80, 1, 0, 0, 0, 627, 628, 5, 112, 0, 0, 628, 629, 5, 97, 0, 0, 629, 630, 5, 99, 0, 0, 630, 631, 5, 107, 0, 0, 631, 632, 5, 97, 0, 0, 632, 633, 5, 103, 0, 0, 633, 634, 5, 101, 0, 0, 634, 82, 1, 0, 0, 0, 635, 636, 5, 118, 0, 0, 636, 637, 5, 97, 0, 0, 637, 638, 5, 108, 0, 0, 638, 639, 5, 117, 0, 0, 639, 640, 5, 101, 0, 0, 640, 84, 1, 0, 0, 0, 641, 642, 5, 114, 0, 0, 642, 643, 5, 101, 0, 0, 643, 644, 5, 108, 0, 0, 644, 645, 5, 97, 0, 0, 645, 646, 5, 116, 0, 0, 646, 647, 5, 105, 0, 0, 647, 648, 5, 111, 0, 0, 648, 649, 5, 110, 0, 0, 649, 86, 1, 0, 0, 0, 650, 651, 5, 111, 0, 0, 651, 652, 5, 112, 0, 0, 652, 653, 5, 101, 0, 0, 653, 654, 5, 114, 0, 0, 654, 655, 5, 97, 0, 0, 655, 656, 5, 116, 0, 0, 656, 657, 5, 105, 0, 0, 657, 658, 5, 111, 0, 0, 658, 659, 5, 110, 0, 0, 659, 88, 1, 0, 0, 0, 660, 661, 5, 102, 0, 0, 661, 662, 5, 117, 0, 0, 662, 663, 5, 110, 0, 0, 663, 664, 5, 99, 0, 0, 664, 665, 5, 116, 0, 0, 665, 666, 5, 105, 0, 0, 666, 667, 5, 111, 0, 0, 667, 668, 5, 110, 0, 0, 668, 90, 1, 0, 0, 0, 669, 670, 5, 99, 0, 0, 670, 671, 5, 111, 0, 0, 671, 672, 5, 110, 0, 0, 672, 673, 5, 115, 0, 0, 673, 674, 5, 116, 0, 0, 674, 675, 5, 114, 0, 0, 675, 676, 5, 117, 0, 0, 676, 677, 5, 99, 0, 0, 677, 678, 5, 116, 0, 0, 678, 679, 5, 111, 0, 0, 679, 680, 5, 114, 0, 0, 680, 92, 1, 0, 0, 0, 681, 682, 5, 99, 0, 0, 682, 683, 5, 111, 0, 0, 683, 684, 5, 110, 0, 0, 684, 685, 5, 115, 0, 0, 685, 686, 5, 116, 0, 0, 686, 687, 5, 114, 0, 0, 687, 688, 5, 117, 0, 0, 688, 689, 5, 99, 0, 0, 689, 690, 5, 116, 0, 0, 690, 691, 5, 115, 0, 0, 691, 94, 1, 0, 0, 0, 692, 693, 5, 105, 0, 0, 693, 694, 5, 110, 0, 0, 694, 695, 5, 112, 0, 0, 695, 696, 5, 117, 0, 0, 696, 697, 5, 116, 0, 0, 697, 96, 1, 0, 0, 0, 698, 699, 5, 99, 0, 0, 699, 700, 5, 111, 0, 0, 700, 701, 5, 110, 0, 0, 701, 702, 5, 102, 0, 0, 702, 703, 5, 111, 0, 0, 703, 704, 5, 114, 0, 0, 704, 705, 5, 109, 0, 0, 705, 98, 1, 0, 0, 0, 706, 707, 5, 97, 0, 0, 707, 708, 5, 115, 0, 0, 708, 100, 1, 0, 0, 0, 709, 710, 5, 98, 0, 0, 710, 711, 5, 105, 0, 0, 711, 712, 5, 110, 0, 0, 712, 713, 5, 100, 0, 0, 713, 102, 1, 0, 0, 0, 714, 715, 5, 115, 0, 0, 715, 716, 5, 116, 0, 0, 716, 717, 5, 97, 0, 0, 717, 718, 5, 116, 0, 0, 718, 719, 5, 105, 0, 0, 719, 720, 5, 99, 0, 0, 720, 104, 1, 0, 0, 0, 721, 722, 5, 116, 0, 0, 722, 723, 5, 111, 0, 0, 723, 106, 1, 0, 0, 0, 724, 725, 5, 112, 0, 0, 725, 726, 5, 114, 0, 0, 726, 727, 5, 105, 0, 0, 727, 728, 5, 118, 0, 0, 728, 729, 5, 97, 0, 0, 729, 730, 5, 116, 0, 0, 730, 731, 5, 101, 0, 0, 731, 108, 1, 0, 0, 0, 732, 733, 5, 115, 0, 0, 733, 734, 5, 104, 0, 0, 734, 735, 5, 97, 0, 0, 735, 736, 5, 114, 0, 0, 736, 737, 5, 101, 0, 0, 737, 738, 5, 100, 0, 0, 738, 110, 1, 0, 0, 0, 739, 740, 5, 115, 0, 0, 740, 741, 5, 116, 0, 0, 741, 742, 5, 97, 0, 0, 742, 743, 5, 116, 0, 0, 743, 744, 5, 101, 0, 0, 744, 112, 1, 0, 0, 0, 745, 746, 5, 101, 0, 0, 746, 747, 5, 100, 0, 0, 747, 748, 5, 103, 0, 0, 748, 749, 5, 101, 0, 0, 749, 114, 1, 0, 0, 0, 750, 751, 5, 112, 0, 0, 751, 752, 5, 114, 0, 0, 752, 753, 5, 111, 0, 0, 753, 754, 5, 106, 0, 0, 754, 755, 5, 101, 0, 0, 755, 756, 5, 99, 0, 0, 756, 757, 5, 116, 0, 0, 757, 758, 5, 105, 0, 0, 758, 759, 5, 111, 0, 0, 759, 760, 5, 110, 0, 0, 760, 116, 1, 0, 0, 0, 761, 762, 5, 119, 0, 0, 762, 763, 5, 105, 0, 0, 763, 764, 5, 116, 0, 0, 764, 765, 5, 104, 0, 0, 765, 118, 1, 0, 0, 0, 766, 767, 5, 117, 0, 0, 767, 768, 5, 115, 0, 0, 768, 769, 5, 105, 0, 0, 769, 770, 5, 110, 0, 0, 770, 771, 5, 103, 0, 0, 771, 120, 1, 0, 0, 0, 772, 773, 5, 118, 0, 0, 773, 774, 5, 105, 0, 0, 774, 775, 5, 97, 0, 0, 775, 122, 1, 0, 0, 0, 776, 777, 5, 109, 0, 0, 777, 778, 5, 97, 0, 0, 778, 779, 5, 116, 0, 0, 779, 780, 5, 101, 0, 0, 780, 781, 5, 114, 0, 0, 781, 782, 5, 105, 0, 0, 782, 783, 5, 97, 0, 0, 783, 784, 5, 108, 0, 0, 784, 785, 5, 105, 0, 0, 785, 786, 5, 122, 0, 0, 786, 787, 5, 101, 0, 0, 787, 124, 1, 0, 0, 0, 788, 789, 5, 105, 0, 0, 789, 790, 5, 102, 0, 0, 790, 126, 1, 0, 0, 0, 791, 792, 5, 97, 0, 0, 792, 793, 5, 98, 0, 0, 793, 794, 5, 115, 0, 0, 794, 795, 5, 101, 0, 0, 795, 796, 5, 110, 0, 0, 796, 797, 5, 116, 0, 0, 797, 128, 1, 0, 0, 0, 798, 799, 5, 111, 0, 0, 799, 800, 5, 110, 0, 0, 800, 130, 1, 0, 0, 0, 801, 802, 5, 112, 0, 0, 802, 803, 5, 111, 0, 0, 803, 804, 5, 108, 0, 0, 804, 805, 5, 105, 0, 0, 805, 806, 5, 99, 0, 0, 806, 807, 5, 121, 0, 0, 807, 132, 1, 0, 0, 0, 808, 809, 5, 100, 0, 0, 809, 810, 5, 101, 0, 0, 810, 811, 5, 102, 0, 0, 811, 812, 5, 97, 0, 0, 812, 813, 5, 117, 0, 0, 813, 814, 5, 108, 0, 0, 814, 815, 5, 116, 0, 0, 815, 134, 1, 0, 0, 0, 816, 817, 5, 115, 0, 0, 817, 818, 5, 111, 0, 0, 818, 819, 5, 117, 0, 0, 819, 820, 5, 114, 0, 0, 820, 821, 5, 99, 0, 0, 821, 822, 5, 101, 0, 0, 822, 136, 1, 0, 0, 0, 823, 824, 5, 114, 0, 0, 824, 825, 5, 101, 0, 0, 825, 826, 5, 112, 0, 0, 826, 827, 5, 111, 0, 0, 827, 828, 5, 115, 0, 0, 828, 829, 5, 105, 0, 0, 829, 830, 5, 116, 0, 0, 830, 831, 5, 111, 0, 0, 831, 832, 5, 114, 0, 0, 832, 833, 5, 121, 0, 0, 833, 138, 1, 0, 0, 0, 834, 835, 5, 99, 0, 0, 835, 836, 5, 111, 0, 0, 836, 837, 5, 109, 0, 0, 837, 838, 5, 109, 0, 0, 838, 839, 5, 105, 0, 0, 839, 840, 5, 116, 0, 0, 840, 140, 1, 0, 0, 0, 841, 842, 5, 114, 0, 0, 842, 843, 5, 101, 0, 0, 843, 844, 5, 118, 0, 0, 844, 845, 5, 105, 0, 0, 845, 846, 5, 115, 0, 0, 846, 847, 5, 105, 0, 0, 847, 848, 5, 111, 0, 0, 848, 849, 5, 110, 0, 0, 849, 142, 1, 0, 0, 0, 850, 851, 5, 115, 0, 0, 851, 852, 5, 101, 0, 0, 852, 853, 5, 109, 0, 0, 853, 854, 5, 97, 0, 0, 854, 855, 5, 110, 0, 0, 855, 856, 5, 116, 0, 0, 856, 857, 5, 105, 0, 0, 857, 858, 5, 99, 0, 0, 858, 859, 5, 45, 0, 0, 859, 860, 5, 109, 0, 0, 860, 861, 5, 97, 0, 0, 861, 862, 5, 106, 0, 0, 862, 863, 5, 111, 0, 0, 863, 864, 5, 114, 0, 0, 864, 144, 1, 0, 0, 0, 865, 866, 5, 111, 0, 0, 866, 867, 5, 110, 0, 0, 867, 868, 5, 45, 0, 0, 868, 869, 5, 100, 0, 0, 869, 870, 5, 101, 0, 0, 870, 871, 5, 108, 0, 0, 871, 872, 5, 101, 0, 0, 872, 873, 5, 116, 0, 0, 873, 874, 5, 101, 0, 0, 874, 146, 1, 0, 0, 0, 875, 876, 5, 114, 0, 0, 876, 877, 5, 101, 0, 0, 877, 878, 5, 116, 0, 0, 878, 879, 5, 97, 0, 0, 879, 880, 5, 105, 0, 0, 880, 881, 5, 110, 0, 0, 881, 882, 5, 45, 0, 0, 882, 883, 5, 111, 0, 0, 883, 884, 5, 116, 0, 0, 884, 885, 5, 104, 0, 0, 885, 886, 5, 101, 0, 0, 886, 887, 5, 114, 0, 0, 887, 148, 1, 0, 0, 0, 888, 889, 5, 107, 0, 0, 889, 890, 5, 101, 0, 0, 890, 891, 5, 121, 0, 0, 891, 892, 5, 101, 0, 0, 892, 893, 5, 100, 0, 0, 893, 150, 1, 0, 0, 0, 894, 895, 5, 112, 0, 0, 895, 896, 5, 117, 0, 0, 896, 897, 5, 98, 0, 0, 897, 898, 5, 108, 0, 0, 898, 899, 5, 105, 0, 0, 899, 900, 5, 99, 0, 0, 900, 901, 5, 45, 0, 0, 901, 902, 5, 116, 0, 0, 902, 903, 5, 114, 0, 0, 903, 904, 5, 97, 0, 0, 904, 905, 5, 118, 0, 0, 905, 906, 5, 101, 0, 0, 906, 907, 5, 114, 0, 0, 907, 908, 5, 115, 0, 0, 908, 909, 5, 97, 0, 0, 909, 910, 5, 108, 0, 0, 910, 152, 1, 0, 0, 0, 911, 912, 5, 105, 0, 0, 912, 913, 5, 100, 0, 0, 913, 154, 1, 0, 0, 0, 914, 915, 5, 100, 0, 0, 915, 916, 5, 111, 0, 0, 916, 917, 5, 99, 0, 0, 917, 156, 1, 0, 0, 0, 918, 919, 5, 109, 0, 0, 919, 920, 5, 111, 0, 0, 920, 921, 5, 100, 0, 0, 921, 922, 5, 101, 0, 0, 922, 158, 1, 0, 0, 0, 923, 924, 5, 101, 0, 0, 924, 925, 5, 109, 0, 0, 925, 926, 5, 105, 0, 0, 926, 927, 5, 116, 0, 0, 927, 928, 5, 115, 0, 0, 928, 160, 1, 0, 0, 0, 929, 930, 5, 114, 0, 0, 930, 931, 5, 101, 0, 0, 931, 932, 5, 99, 0, 0, 932, 933, 5, 101, 0, 0, 933, 934, 5, 105, 0, 0, 934, 935, 5, 118, 0, 0, 935, 936, 5, 101, 0, 0, 936, 937, 5, 114, 0, 0, 937, 162, 1, 0, 0, 0, 938, 939, 5, 114, 0, 0, 939, 940, 5, 101, 0, 0, 940, 941, 5, 113, 0, 0, 941, 942, 5, 117, 0, 0, 942, 943, 5, 105, 0, 0, 943, 944, 5, 114, 0, 0, 944, 945, 5, 101, 0, 0, 945, 946, 5, 115, 0, 0, 946, 164, 1, 0, 0, 0, 947, 948, 5, 97, 0, 0, 948, 949, 5, 110, 0, 0, 949, 950, 5, 121, 0, 0, 950, 166, 1, 0, 0, 0, 951, 952, 5, 103, 0, 0, 952, 953, 5, 101, 0, 0, 953, 954, 5, 116, 0, 0, 954, 168, 1, 0, 0, 0, 955, 956, 5, 115, 0, 0, 956, 957, 5, 101, 0, 0, 957, 958, 5, 116, 0, 0, 958, 170, 1, 0, 0, 0, 959, 960, 5, 119, 0, 0, 960, 961, 5, 97, 0, 0, 961, 962, 5, 116, 0, 0, 962, 963, 5, 99, 0, 0, 963, 964, 5, 104, 0, 0, 964, 172, 1, 0, 0, 0, 965, 966, 5, 115, 0, 0, 966, 967, 5, 116, 0, 0, 967, 968, 5, 97, 0, 0, 968, 969, 5, 114, 0, 0, 969, 970, 5, 116, 0, 0, 970, 174, 1, 0, 0, 0, 971, 972, 5, 115, 0, 0, 972, 973, 5, 116, 0, 0, 973, 974, 5, 111, 0, 0, 974, 975, 5, 112, 0, 0, 975, 176, 1, 0, 0, 0, 976, 977, 5, 114, 0, 0, 977, 978, 5, 101, 0, 0, 978, 979, 5, 97, 0, 0, 979, 980, 5, 100, 0, 0, 980, 178, 1, 0, 0, 0, 981, 982, 5, 119, 0, 0, 982, 983, 5, 114, 0, 0, 983, 984, 5, 105, 0, 0, 984, 985, 5, 116, 0, 0, 985, 986, 5, 101, 0, 0, 986, 180, 1, 0, 0, 0, 987, 988, 5, 114, 0, 0, 988, 989, 5, 101, 0, 0, 989, 990, 5, 115, 0, 0, 990, 991, 5, 111, 0, 0, 991, 992, 5, 108, 0, 0, 992, 993, 5, 118, 0, 0, 993, 994, 5, 101, 0, 0, 994, 182, 1, 0, 0, 0, 995, 996, 5, 99, 0, 0, 996, 997, 5, 111, 0, 0, 997, 998, 5, 110, 0, 0, 998, 999, 5, 110, 0, 0, 999, 1000, 5, 101, 0, 0, 1000, 1001, 5, 99, 0, 0, 1001, 1002, 5, 116, 0, 0, 1002, 184, 1, 0, 0, 0, 1003, 1004, 5, 100, 0, 0, 1004, 1005, 5, 105, 0, 0, 1005, 1006, 5, 115, 0, 0, 1006, 1007, 5, 99, 0, 0, 1007, 1008, 5, 111, 0, 0, 1008, 1009, 5, 110, 0, 0, 1009, 1010, 5, 110, 0, 0, 1010, 1011, 5, 101, 0, 0, 1011, 1012, 5, 99, 0, 0, 1012, 1013, 5, 116, 0, 0, 1013, 186, 1, 0, 0, 0, 1014, 1015, 5, 99, 0, 0, 1015, 1016, 5, 97, 0, 0, 1016, 1017, 5, 108, 0, 0, 1017, 1018, 5, 108, 0, 0, 1018, 188, 1, 0, 0, 0, 1019, 1020, 5, 119, 0, 0, 1020, 1021, 5, 97, 0, 0, 1021, 1022, 5, 116, 0, 0, 1022, 1023, 5, 99, 0, 0, 1023, 1024, 5, 104, 0, 0, 1024, 1025, 5, 45, 0, 0, 1025, 1026, 5, 115, 0, 0, 1026, 1027, 5, 116, 0, 0, 1027, 1028, 5, 97, 0, 0, 1028, 1029, 5, 114, 0, 0, 1029, 1030, 5, 116, 0, 0, 1030, 190, 1, 0, 0, 0, 1031, 1032, 5, 119, 0, 0, 1032, 1033, 5, 97, 0, 0, 1033, 1034, 5, 116, 0, 0, 1034, 1035, 5, 99, 0, 0, 1035, 1036, 5, 104, 0, 0, 1036, 1037, 5, 45, 0, 0, 1037, 1038, 5, 115, 0, 0, 1038, 1039, 5, 116, 0, 0, 1039, 1040, 5, 111, 0, 0, 1040, 1041, 5, 112, 0, 0, 1041, 192, 1, 0, 0, 0, 1042, 1043, 5, 115, 0, 0, 1043, 1044, 5, 117, 0, 0, 1044, 1045, 5, 98, 0, 0, 1045, 1046, 5, 115, 0, 0, 1046, 1047, 5, 99, 0, 0, 1047, 1048, 5, 114, 0, 0, 1048, 1049, 5, 105, 0, 0, 1049, 1050, 5, 98, 0, 0, 1050, 1051, 5, 101, 0, 0, 1051, 194, 1, 0, 0, 0, 1052, 1053, 5, 117, 0, 0, 1053, 1054, 5, 110, 0, 0, 1054, 1055, 5, 115, 0, 0, 1055, 1056, 5, 117, 0, 0, 1056, 1057, 5, 98, 0, 0, 1057, 1058, 5, 115, 0, 0, 1058, 1059, 5, 99, 0, 0, 1059, 1060, 5, 114, 0, 0, 1060, 1061, 5, 105, 0, 0, 1061, 1062, 5, 98, 0, 0, 1062, 1063, 5, 101, 0, 0, 1063, 196, 1, 0, 0, 0, 1064, 1065, 5, 114, 0, 0, 1065, 1066, 5, 101, 0, 0, 1066, 1067, 5, 103, 0, 0, 1067, 1068, 5, 105, 0, 0, 1068, 1069, 5, 115, 0, 0, 1069, 1070, 5, 116, 0, 0, 1070, 1071, 5, 101, 0, 0, 1071, 1072, 5, 114, 0, 0, 1072, 198, 1, 0, 0, 0, 1073, 1074, 5, 99, 0, 0, 1074, 1075, 5, 114, 0, 0, 1075, 1076, 5, 100, 0, 0, 1076, 1077, 5, 116, 0, 0, 1077, 200, 1, 0, 0, 0, 1078, 1079, 5, 111, 0, 0, 1079, 1080, 5, 112, 0, 0, 1080, 1081, 5, 116, 0, 0, 1081, 1082, 5, 105, 0, 0, 1082, 1083, 5, 111, 0, 0, 1083, 1084, 5, 110, 0, 0, 1084, 1085, 5, 97, 0, 0, 1085, 1086, 5, 108, 0, 0, 1086, 1087, 5, 45, 0, 0, 1087, 1088, 5, 111, 0, 0, 1088, 1089, 5, 110, 0, 0, 1089, 1090, 5, 101, 0, 0, 1090, 202, 1, 0, 0, 0, 1091, 1092, 5, 101, 0, 0, 1092, 1093, 5, 120, 0, 0, 1093, 1094, 5, 97, 0, 0, 1094, 1095, 5, 99, 0, 0, 1095, 1096, 5, 116, 0, 0, 1096, 1097, 5, 108, 0, 0, 1097, 1098, 5, 121, 0, 0, 1098, 1099, 5, 45, 0, 0, 1099, 1100, 5, 111, 0, 0, 1100, 1101, 5, 110, 0, 0, 1101, 1102, 5, 101, 0, 0, 1102, 204, 1, 0, 0, 0, 1103, 1104, 5, 109, 0, 0, 1104, 1105, 5, 97, 0, 0, 1105, 1106, 5, 110, 0, 0, 1106, 1107, 5, 121, 0, 0, 1107, 1108, 5, 45, 0, 0, 1108, 1109, 5, 117, 0, 0, 1109, 1110, 5, 110, 0, 0, 1110, 1111, 5, 105, 0, 0, 1111, 1112, 5, 113, 0, 0, 1112, 1113, 5, 117, 0, 0, 1113, 1114, 5, 101, 0, 0, 1114, 206, 1, 0, 0, 0, 1115, 1116, 5, 109, 0, 0, 1116, 1117, 5, 97, 0, 0, 1117, 1118, 5, 110, 0, 0, 1118, 1119, 5, 121, 0, 0, 1119, 208, 1, 0, 0, 0, 1120, 1121, 5, 111, 0, 0, 1121, 1122, 5, 114, 0, 0, 1122, 1123, 5, 100, 0, 0, 1123, 1124, 5, 101, 0, 0, 1124, 1125, 5, 114, 0, 0, 1125, 1126, 5, 101, 0, 0, 1126, 1127, 5, 100, 0, 0, 1127, 210, 1, 0, 0, 0, 1128, 1129, 5, 117, 0, 0, 1129, 1130, 5, 110, 0, 0, 1130, 1131, 5, 105, 0, 0, 1131, 1132, 5, 116, 0, 0, 1132, 212, 1, 0, 0, 0, 1133, 1134, 5, 119, 0, 0, 1134, 1135, 5, 97, 0, 0, 1135, 1136, 5, 116, 0, 0, 1136, 1137, 5, 99, 0, 0, 1137, 1138, 5, 104, 0, 0, 1138, 1139, 5, 45, 0, 0, 1139, 1140, 5, 104, 0, 0, 1140, 1141, 5, 97, 0, 0, 1141, 1142, 5, 110, 0, 0, 1142, 1143, 5, 100, 0, 0, 1143, 1144, 5, 108, 0, 0, 1144, 1145, 5, 101, 0, 0, 1145, 214, 1, 0, 0, 0, 1146, 1147, 5, 109, 0, 0, 1147, 1148, 5, 101, 0, 0, 1148, 1149, 5, 115, 0, 0, 1149, 1150, 5, 115, 0, 0, 1150, 1151, 5, 97, 0, 0, 1151, 1152, 5, 103, 0, 0, 1152, 1153, 5, 101, 0, 0, 1153, 216, 1, 0, 0, 0, 1154, 1155, 5, 97, 0, 0, 1155, 1156, 5, 116, 0, 0, 1156, 1157, 5, 111, 0, 0, 1157, 1158, 5, 109, 0, 0, 1158, 1159, 5, 45, 0, 0, 1159, 1160, 5, 114, 0, 0, 1160, 1161, 5, 101, 0, 0, 1161, 1162, 5, 102, 0, 0, 1162, 218, 1, 0, 0, 0, 1163, 1164, 5, 105, 0, 0, 1164, 1165, 5, 110, 0, 0, 1165, 1166, 5, 116, 0, 0, 1166, 1167, 5, 101, 0, 0, 1167, 1168, 5, 114, 0, 0, 1168, 1169, 5, 102, 0, 0, 1169, 1170, 5, 97, 0, 0, 1170, 1171, 5, 99, 0, 0, 1171, 1172, 5, 101, 0, 0, 1172, 1173, 5, 45, 0, 0, 1173, 1174, 5, 114, 0, 0, 1174, 1175, 5, 101, 0, 0, 1175, 1176, 5, 102, 0, 0, 1176, 220, 1, 0, 0, 0, 1177, 1178, 5, 111, 0, 0, 1178, 1179, 5, 112, 0, 0, 1179, 1180, 5, 116, 0, 0, 1180, 1181, 5, 105, 0, 0, 1181, 1182, 5, 111, 0, 0, 1182, 1183, 5, 110, 0, 0, 1183, 1184, 5, 97, 0, 0, 1184, 1185, 5, 108, 0, 0, 1185, 222, 1, 0, 0, 0, 1186, 1187, 5, 108, 0, 0, 1187, 1188, 5, 105, 0, 0, 1188, 1189, 5, 115, 0, 0, 1189, 1190, 5, 116, 0, 0, 1190, 224, 1, 0, 0, 0, 1191, 1192, 5, 114, 0, 0, 1192, 1193, 5, 101, 0, 0, 1193, 1194, 5, 99, 0, 0, 1194, 1195, 5, 111, 0, 0, 1195, 1196, 5, 114, 0, 0, 1196, 1197, 5, 100, 0, 0, 1197, 226, 1, 0, 0, 0, 1198, 1199, 5, 98, 0, 0, 1199, 1200, 5, 111, 0, 0, 1200, 1201, 5, 111, 0, 0, 1201, 1202, 5, 108, 0, 0, 1202, 228, 1, 0, 0, 0, 1203, 1204, 5, 98, 0, 0, 1204, 1205, 5, 121, 0, 0, 1205, 1206, 5, 116, 0, 0, 1206, 1207, 5, 101, 0, 0, 1207, 1208, 5, 115, 0, 0, 1208, 230, 1, 0, 0, 0, 1209, 1210, 5, 100, 0, 0, 1210, 1211, 5, 111, 0, 0, 1211, 1212, 5, 117, 0, 0, 1212, 1213, 5, 98, 0, 0, 1213, 1214, 5, 108, 0, 0, 1214, 1215, 5, 101, 0, 0, 1215, 232, 1, 0, 0, 0, 1216, 1217, 5, 105, 0, 0, 1217, 1218, 5, 110, 0, 0, 1218, 1219, 5, 116, 0, 0, 1219, 1220, 5, 51, 0, 0, 1220, 1221, 5, 50, 0, 0, 1221, 234, 1, 0, 0, 0, 1222, 1223, 5, 105, 0, 0, 1223, 1224, 5, 110, 0, 0, 1224, 1225, 5, 116, 0, 0, 1225, 1226, 5, 54, 0, 0, 1226, 1227, 5, 52, 0, 0, 1227, 236, 1, 0, 0, 0, 1228, 1229, 5, 115, 0, 0, 1229, 1230, 5, 116, 0, 0, 1230, 1231, 5, 114, 0, 0, 1231, 1232, 5, 105, 0, 0, 1232, 1233, 5, 110, 0, 0, 1233, 1234, 5, 103, 0, 0, 1234, 238, 1, 0, 0, 0, 1235, 1236, 5, 117, 0, 0, 1236, 1237, 5, 105, 0, 0, 1237, 1238, 5, 110, 0, 0, 1238, 1239, 5, 116, 0, 0, 1239, 1240, 5, 51, 0, 0, 1240, 1241, 5, 50, 0, 0, 1241, 240, 1, 0, 0, 0, 1242, 1243, 5, 117, 0, 0, 1243, 1244, 5, 105, 0, 0, 1244, 1245, 5, 110, 0, 0, 1245, 1246, 5, 116, 0, 0, 1246, 1247, 5, 54, 0, 0, 1247, 1248, 5, 52, 0, 0, 1248, 242, 1, 0, 0, 0, 1249, 1250, 5, 116, 0, 0, 1250, 1251, 5, 114, 0, 0, 1251, 1252, 5, 117, 0, 0, 1252, 1253, 5, 101, 0, 0, 1253, 244, 1, 0, 0, 0, 1254, 1255, 5, 102, 0, 0, 1255, 1256, 5, 97, 0, 0, 1256, 1257, 5, 108, 0, 0, 1257, 1258, 5, 115, 0, 0, 1258, 1259, 5, 101, 0, 0, 1259, 246, 1, 0, 0, 0, 1260, 1261, 5, 110, 0, 0, 1261, 1262, 5, 117, 0, 0, 1262, 1263, 5, 108, 0, 0, 1263, 1264, 5, 108, 0, 0, 1264, 248, 1, 0, 0, 0, 1265, 1266, 5, 45, 0, 0, 1266, 1267, 5, 62, 0, 0, 1267, 250, 1, 0, 0, 0, 1268, 1269, 5, 58, 0, 0, 1269, 252, 1, 0, 0, 0, 1270, 1271, 5, 59, 0, 0, 1271, 254, 1, 0, 0, 0, 1272, 1273, 5, 44, 0, 0, 1273, 256, 1, 0, 0, 0, 1274, 1275, 5, 46, 0, 0, 1275, 258, 1, 0, 0, 0, 1276, 1277, 5, 123, 0, 0, 1277, 260, 1, 0, 0, 0, 1278, 1279, 5, 125, 0, 0, 1279, 262, 1, 0, 0, 0, 1280, 1281, 5, 91, 0, 0, 1281, 264, 1, 0, 0, 0, 1282, 1283, 5, 93, 0, 0, 1283, 266, 1, 0, 0, 0, 1284, 1285, 5, 40, 0, 0, 1285, 268, 1, 0, 0, 0, 1286, 1287, 5, 41, 0, 0, 1287, 270, 1, 0, 0, 0, 1288, 1289, 5, 60, 0, 0, 1289, 272, 1, 0, 0, 0, 1290, 1291, 5, 62, 0, 0, 1291, 274, 1, 0, 0, 0, 1292, 1293, 5, 38, 0, 0, 1293, 276, 1, 0, 0, 0, 1294, 1295, 5, 61, 0, 0, 1295, 278, 1, 0, 0, 0, 1296, 1298, 5, 45, 0, 0, 1297, 1296, 1, 0, 0, 0, 1297, 1298, 1, 0, 0, 0, 1298, 1300, 1, 0, 0, 0, 1299, 1301, 7, 0, 0, 0, 1300, 1299, 1, 0, 0, 0, 1301, 1302, 1, 0, 0, 0, 1302, 1300, 1, 0, 0, 0, 1302, 1303, 1, 0, 0, 0, 1303, 280, 1, 0, 0, 0, 1304, 1306, 5, 45, 0, 0, 1305, 1304, 1, 0, 0, 0, 1305, 1306, 1, 0, 0, 0, 1306, 1315, 1, 0, 0, 0, 1307, 1316, 5, 48, 0, 0, 1308, 1312, 7, 1, 0, 0, 1309, 1311, 7, 0, 0, 0, 1310, 1309, 1, 0, 0, 0, 1311, 1314, 1, 0, 0, 0, 1312, 1310, 1, 0, 0, 0, 1312, 1313, 1, 0, 0, 0, 1313, 1316, 1, 0, 0, 0, 1314, 1312, 1, 0, 0, 0, 1315, 1307, 1, 0, 0, 0, 1315, 1308, 1, 0, 0, 0, 1316, 1323, 1, 0, 0, 0, 1317, 1319, 5, 46, 0, 0, 1318, 1320, 7, 0, 0, 0, 1319, 1318, 1, 0, 0, 0, 1320, 1321, 1, 0, 0, 0, 1321, 1319, 1, 0, 0, 0, 1321, 1322, 1, 0, 0, 0, 1322, 1324, 1, 0, 0, 0, 1323, 1317, 1, 0, 0, 0, 1323, 1324, 1, 0, 0, 0, 1324, 1334, 1, 0, 0, 0, 1325, 1327, 7, 2, 0, 0, 1326, 1328, 7, 3, 0, 0, 1327, 1326, 1, 0, 0, 0, 1327, 1328, 1, 0, 0, 0, 1328, 1330, 1, 0, 0, 0, 1329, 1331, 7, 0, 0, 0, 1330, 1329, 1, 0, 0, 0, 1331, 1332, 1, 0, 0, 0, 1332, 1330, 1, 0, 0, 0, 1332, 1333, 1, 0, 0, 0, 1333, 1335, 1, 0, 0, 0, 1334, 1325, 1, 0, 0, 0, 1334, 1335, 1, 0, 0, 0, 1335, 282, 1, 0, 0, 0, 1336, 1340, 7, 4, 0, 0, 1337, 1339, 7, 5, 0, 0, 1338, 1337, 1, 0, 0, 0, 1339, 1342, 1, 0, 0, 0, 1340, 1338, 1, 0, 0, 0, 1340, 1341, 1, 0, 0, 0, 1341, 284, 1, 0, 0, 0, 1342, 1340, 1, 0, 0, 0, 1343, 1348, 5, 34, 0, 0, 1344, 1347, 3, 287, 143, 0, 1345, 1347, 8, 6, 0, 0, 1346, 1344, 1, 0, 0, 0, 1346, 1345, 1, 0, 0, 0, 1347, 1350, 1, 0, 0, 0, 1348, 1346, 1, 0, 0, 0, 1348, 1349, 1, 0, 0, 0, 1349, 1351, 1, 0, 0, 0, 1350, 1348, 1, 0, 0, 0, 1351, 1352, 5, 34, 0, 0, 1352, 286, 1, 0, 0, 0, 1353, 1361, 5, 92, 0, 0, 1354, 1362, 7, 7, 0, 0, 1355, 1356, 5, 117, 0, 0, 1356, 1357, 3, 289, 144, 0, 1357, 1358, 3, 289, 144, 0, 1358, 1359, 3, 289, 144, 0, 1359, 1360, 3, 289, 144, 0, 1360, 1362, 1, 0, 0, 0, 1361, 1354, 1, 0, 0, 0, 1361, 1355, 1, 0, 0, 0, 1362, 288, 1, 0, 0, 0, 1363, 1364, 7, 8, 0, 0, 1364, 290, 1, 0, 0, 0, 1365, 1366, 5, 47, 0, 0, 1366, 1367, 5, 47, 0, 0, 1367, 1371, 1, 0, 0, 0, 1368, 1370, 8, 9, 0, 0, 1369, 1368, 1, 0, 0, 0, 1370, 1373, 1, 0, 0, 0, 1371, 1369, 1, 0, 0, 0, 1371, 1372, 1, 0, 0, 0, 1372, 1374, 1, 0, 0, 0, 1373, 1371, 1, 0, 0, 0, 1374, 1375, 6, 145, 0, 0, 1375, 292, 1, 0, 0, 0, 1376, 1377, 5, 47, 0, 0, 1377, 1378, 5, 42, 0, 0, 1378, 1382, 1, 0, 0, 0, 1379, 1381, 9, 0, 0, 0, 1380, 1379, 1, 0, 0, 0, 1381, 1384, 1, 0, 0, 0, 1382, 1383, 1, 0, 0, 0, 1382, 1380, 1, 0, 0, 0, 1383, 1385, 1, 0, 0, 0, 1384, 1382, 1, 0, 0, 0, 1385, 1386, 5, 42, 0, 0, 1386, 1387, 5, 47, 0, 0, 1387, 1388, 1, 0, 0, 0, 1388, 1389, 6, 146, 0, 0, 1389, 294, 1, 0, 0, 0, 1390, 1392, 7, 10, 0, 0, 1391, 1390, 1, 0, 0, 0, 1392, 1393, 1, 0, 0, 0, 1393, 1391, 1, 0, 0, 0, 1393, 1394, 1, 0, 0, 0, 1394, 1395, 1, 0, 0, 0, 1395, 1396, 6, 147, 0, 0, 1396, 296, 1, 0, 0, 0, 18, 0, 1297, 1302, 1305, 1312, 1315, 1321, 1323, 1327, 1332, 1334, 1340, 1346, 1348, 1361, 1371, 1382, 1393, 1, 0, 1, 0] \ No newline at end of file +[4, 0, 147, 1406, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 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, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 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, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 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, 17, 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, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 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, 26, 1, 26, 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, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 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, 32, 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, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 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, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 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, 42, 1, 42, 1, 42, 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, 44, 1, 44, 1, 44, 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, 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, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 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, 1, 53, 1, 53, 1, 54, 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, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 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, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 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, 64, 1, 65, 1, 65, 1, 65, 1, 66, 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, 67, 1, 67, 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, 69, 1, 69, 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, 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, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 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, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 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, 81, 1, 81, 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, 84, 1, 84, 1, 84, 1, 84, 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, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 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, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 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, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 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, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 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, 101, 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, 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, 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, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 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, 3, 140, 1307, 8, 140, 1, 140, 4, 140, 1310, 8, 140, 11, 140, 12, 140, 1311, 1, 141, 3, 141, 1315, 8, 141, 1, 141, 1, 141, 1, 141, 5, 141, 1320, 8, 141, 10, 141, 12, 141, 1323, 9, 141, 3, 141, 1325, 8, 141, 1, 141, 1, 141, 4, 141, 1329, 8, 141, 11, 141, 12, 141, 1330, 3, 141, 1333, 8, 141, 1, 141, 1, 141, 3, 141, 1337, 8, 141, 1, 141, 4, 141, 1340, 8, 141, 11, 141, 12, 141, 1341, 3, 141, 1344, 8, 141, 1, 142, 1, 142, 5, 142, 1348, 8, 142, 10, 142, 12, 142, 1351, 9, 142, 1, 143, 1, 143, 1, 143, 5, 143, 1356, 8, 143, 10, 143, 12, 143, 1359, 9, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 3, 144, 1371, 8, 144, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 5, 146, 1379, 8, 146, 10, 146, 12, 146, 1382, 9, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 5, 147, 1390, 8, 147, 10, 147, 12, 147, 1393, 9, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 4, 148, 1401, 8, 148, 11, 148, 12, 148, 1402, 1, 148, 1, 148, 1, 1391, 0, 149, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 143, 287, 144, 289, 0, 291, 0, 293, 145, 295, 146, 297, 147, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1420, 0, 1, 1, 0, 0, 0, 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, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 1, 0, 0, 0, 0, 285, 1, 0, 0, 0, 0, 287, 1, 0, 0, 0, 0, 293, 1, 0, 0, 0, 0, 295, 1, 0, 0, 0, 0, 297, 1, 0, 0, 0, 1, 299, 1, 0, 0, 0, 3, 304, 1, 0, 0, 0, 5, 313, 1, 0, 0, 0, 7, 324, 1, 0, 0, 0, 9, 334, 1, 0, 0, 0, 11, 344, 1, 0, 0, 0, 13, 353, 1, 0, 0, 0, 15, 365, 1, 0, 0, 0, 17, 372, 1, 0, 0, 0, 19, 380, 1, 0, 0, 0, 21, 389, 1, 0, 0, 0, 23, 397, 1, 0, 0, 0, 25, 403, 1, 0, 0, 0, 27, 408, 1, 0, 0, 0, 29, 421, 1, 0, 0, 0, 31, 431, 1, 0, 0, 0, 33, 443, 1, 0, 0, 0, 35, 449, 1, 0, 0, 0, 37, 460, 1, 0, 0, 0, 39, 471, 1, 0, 0, 0, 41, 476, 1, 0, 0, 0, 43, 485, 1, 0, 0, 0, 45, 495, 1, 0, 0, 0, 47, 500, 1, 0, 0, 0, 49, 504, 1, 0, 0, 0, 51, 510, 1, 0, 0, 0, 53, 515, 1, 0, 0, 0, 55, 525, 1, 0, 0, 0, 57, 529, 1, 0, 0, 0, 59, 542, 1, 0, 0, 0, 61, 547, 1, 0, 0, 0, 63, 554, 1, 0, 0, 0, 65, 563, 1, 0, 0, 0, 67, 574, 1, 0, 0, 0, 69, 578, 1, 0, 0, 0, 71, 587, 1, 0, 0, 0, 73, 594, 1, 0, 0, 0, 75, 603, 1, 0, 0, 0, 77, 608, 1, 0, 0, 0, 79, 618, 1, 0, 0, 0, 81, 629, 1, 0, 0, 0, 83, 637, 1, 0, 0, 0, 85, 643, 1, 0, 0, 0, 87, 652, 1, 0, 0, 0, 89, 662, 1, 0, 0, 0, 91, 671, 1, 0, 0, 0, 93, 683, 1, 0, 0, 0, 95, 694, 1, 0, 0, 0, 97, 700, 1, 0, 0, 0, 99, 708, 1, 0, 0, 0, 101, 711, 1, 0, 0, 0, 103, 716, 1, 0, 0, 0, 105, 723, 1, 0, 0, 0, 107, 726, 1, 0, 0, 0, 109, 734, 1, 0, 0, 0, 111, 741, 1, 0, 0, 0, 113, 747, 1, 0, 0, 0, 115, 752, 1, 0, 0, 0, 117, 763, 1, 0, 0, 0, 119, 768, 1, 0, 0, 0, 121, 774, 1, 0, 0, 0, 123, 781, 1, 0, 0, 0, 125, 785, 1, 0, 0, 0, 127, 797, 1, 0, 0, 0, 129, 800, 1, 0, 0, 0, 131, 807, 1, 0, 0, 0, 133, 810, 1, 0, 0, 0, 135, 817, 1, 0, 0, 0, 137, 825, 1, 0, 0, 0, 139, 832, 1, 0, 0, 0, 141, 843, 1, 0, 0, 0, 143, 850, 1, 0, 0, 0, 145, 859, 1, 0, 0, 0, 147, 874, 1, 0, 0, 0, 149, 884, 1, 0, 0, 0, 151, 897, 1, 0, 0, 0, 153, 903, 1, 0, 0, 0, 155, 920, 1, 0, 0, 0, 157, 923, 1, 0, 0, 0, 159, 927, 1, 0, 0, 0, 161, 932, 1, 0, 0, 0, 163, 938, 1, 0, 0, 0, 165, 947, 1, 0, 0, 0, 167, 956, 1, 0, 0, 0, 169, 960, 1, 0, 0, 0, 171, 964, 1, 0, 0, 0, 173, 968, 1, 0, 0, 0, 175, 974, 1, 0, 0, 0, 177, 980, 1, 0, 0, 0, 179, 985, 1, 0, 0, 0, 181, 990, 1, 0, 0, 0, 183, 996, 1, 0, 0, 0, 185, 1004, 1, 0, 0, 0, 187, 1012, 1, 0, 0, 0, 189, 1023, 1, 0, 0, 0, 191, 1028, 1, 0, 0, 0, 193, 1040, 1, 0, 0, 0, 195, 1051, 1, 0, 0, 0, 197, 1061, 1, 0, 0, 0, 199, 1073, 1, 0, 0, 0, 201, 1082, 1, 0, 0, 0, 203, 1087, 1, 0, 0, 0, 205, 1100, 1, 0, 0, 0, 207, 1112, 1, 0, 0, 0, 209, 1124, 1, 0, 0, 0, 211, 1129, 1, 0, 0, 0, 213, 1137, 1, 0, 0, 0, 215, 1142, 1, 0, 0, 0, 217, 1155, 1, 0, 0, 0, 219, 1163, 1, 0, 0, 0, 221, 1172, 1, 0, 0, 0, 223, 1186, 1, 0, 0, 0, 225, 1195, 1, 0, 0, 0, 227, 1200, 1, 0, 0, 0, 229, 1207, 1, 0, 0, 0, 231, 1212, 1, 0, 0, 0, 233, 1218, 1, 0, 0, 0, 235, 1225, 1, 0, 0, 0, 237, 1231, 1, 0, 0, 0, 239, 1237, 1, 0, 0, 0, 241, 1244, 1, 0, 0, 0, 243, 1251, 1, 0, 0, 0, 245, 1258, 1, 0, 0, 0, 247, 1263, 1, 0, 0, 0, 249, 1269, 1, 0, 0, 0, 251, 1274, 1, 0, 0, 0, 253, 1277, 1, 0, 0, 0, 255, 1279, 1, 0, 0, 0, 257, 1281, 1, 0, 0, 0, 259, 1283, 1, 0, 0, 0, 261, 1285, 1, 0, 0, 0, 263, 1287, 1, 0, 0, 0, 265, 1289, 1, 0, 0, 0, 267, 1291, 1, 0, 0, 0, 269, 1293, 1, 0, 0, 0, 271, 1295, 1, 0, 0, 0, 273, 1297, 1, 0, 0, 0, 275, 1299, 1, 0, 0, 0, 277, 1301, 1, 0, 0, 0, 279, 1303, 1, 0, 0, 0, 281, 1306, 1, 0, 0, 0, 283, 1314, 1, 0, 0, 0, 285, 1345, 1, 0, 0, 0, 287, 1352, 1, 0, 0, 0, 289, 1362, 1, 0, 0, 0, 291, 1372, 1, 0, 0, 0, 293, 1374, 1, 0, 0, 0, 295, 1385, 1, 0, 0, 0, 297, 1400, 1, 0, 0, 0, 299, 300, 5, 101, 0, 0, 300, 301, 5, 100, 0, 0, 301, 302, 5, 105, 0, 0, 302, 303, 5, 116, 0, 0, 303, 2, 1, 0, 0, 0, 304, 305, 5, 99, 0, 0, 305, 306, 5, 114, 0, 0, 306, 307, 5, 101, 0, 0, 307, 308, 5, 97, 0, 0, 308, 309, 5, 116, 0, 0, 309, 310, 5, 105, 0, 0, 310, 311, 5, 111, 0, 0, 311, 312, 5, 110, 0, 0, 312, 4, 1, 0, 0, 0, 313, 314, 5, 105, 0, 0, 314, 315, 5, 110, 0, 0, 315, 316, 5, 105, 0, 0, 316, 317, 5, 116, 0, 0, 317, 318, 5, 105, 0, 0, 318, 319, 5, 97, 0, 0, 319, 320, 5, 108, 0, 0, 320, 321, 5, 105, 0, 0, 321, 322, 5, 122, 0, 0, 322, 323, 5, 101, 0, 0, 323, 6, 1, 0, 0, 0, 324, 325, 5, 119, 0, 0, 325, 326, 5, 111, 0, 0, 326, 327, 5, 114, 0, 0, 327, 328, 5, 107, 0, 0, 328, 329, 5, 115, 0, 0, 329, 330, 5, 112, 0, 0, 330, 331, 5, 97, 0, 0, 331, 332, 5, 99, 0, 0, 332, 333, 5, 101, 0, 0, 333, 8, 1, 0, 0, 0, 334, 335, 5, 101, 0, 0, 335, 336, 5, 120, 0, 0, 336, 337, 5, 101, 0, 0, 337, 338, 5, 99, 0, 0, 338, 339, 5, 117, 0, 0, 339, 340, 5, 116, 0, 0, 340, 341, 5, 105, 0, 0, 341, 342, 5, 111, 0, 0, 342, 343, 5, 110, 0, 0, 343, 10, 1, 0, 0, 0, 344, 345, 5, 115, 0, 0, 345, 346, 5, 110, 0, 0, 346, 347, 5, 97, 0, 0, 347, 348, 5, 112, 0, 0, 348, 349, 5, 115, 0, 0, 349, 350, 5, 104, 0, 0, 350, 351, 5, 111, 0, 0, 351, 352, 5, 116, 0, 0, 352, 12, 1, 0, 0, 0, 353, 354, 5, 116, 0, 0, 354, 355, 5, 114, 0, 0, 355, 356, 5, 97, 0, 0, 356, 357, 5, 110, 0, 0, 357, 358, 5, 115, 0, 0, 358, 359, 5, 97, 0, 0, 359, 360, 5, 99, 0, 0, 360, 361, 5, 116, 0, 0, 361, 362, 5, 105, 0, 0, 362, 363, 5, 111, 0, 0, 363, 364, 5, 110, 0, 0, 364, 14, 1, 0, 0, 0, 365, 366, 5, 114, 0, 0, 366, 367, 5, 101, 0, 0, 367, 368, 5, 109, 0, 0, 368, 369, 5, 111, 0, 0, 369, 370, 5, 116, 0, 0, 370, 371, 5, 101, 0, 0, 371, 16, 1, 0, 0, 0, 372, 373, 5, 116, 0, 0, 373, 374, 5, 97, 0, 0, 374, 375, 5, 114, 0, 0, 375, 376, 5, 103, 0, 0, 376, 377, 5, 101, 0, 0, 377, 378, 5, 116, 0, 0, 378, 379, 5, 115, 0, 0, 379, 18, 1, 0, 0, 0, 380, 381, 5, 112, 0, 0, 381, 382, 5, 111, 0, 0, 382, 383, 5, 114, 0, 0, 383, 384, 5, 116, 0, 0, 384, 385, 5, 97, 0, 0, 385, 386, 5, 98, 0, 0, 386, 387, 5, 108, 0, 0, 387, 388, 5, 101, 0, 0, 388, 20, 1, 0, 0, 0, 389, 390, 5, 114, 0, 0, 390, 391, 5, 101, 0, 0, 391, 392, 5, 112, 0, 0, 392, 393, 5, 108, 0, 0, 393, 394, 5, 105, 0, 0, 394, 395, 5, 99, 0, 0, 395, 396, 5, 97, 0, 0, 396, 22, 1, 0, 0, 0, 397, 398, 5, 108, 0, 0, 398, 399, 5, 111, 0, 0, 399, 400, 5, 99, 0, 0, 400, 401, 5, 97, 0, 0, 401, 402, 5, 108, 0, 0, 402, 24, 1, 0, 0, 0, 403, 404, 5, 102, 0, 0, 404, 405, 5, 114, 0, 0, 405, 406, 5, 111, 0, 0, 406, 407, 5, 109, 0, 0, 407, 26, 1, 0, 0, 0, 408, 409, 5, 114, 0, 0, 409, 410, 5, 101, 0, 0, 410, 411, 5, 115, 0, 0, 411, 412, 5, 117, 0, 0, 412, 413, 5, 108, 0, 0, 413, 414, 5, 116, 0, 0, 414, 415, 5, 45, 0, 0, 415, 416, 5, 98, 0, 0, 416, 417, 5, 121, 0, 0, 417, 418, 5, 116, 0, 0, 418, 419, 5, 101, 0, 0, 419, 420, 5, 115, 0, 0, 420, 28, 1, 0, 0, 0, 421, 422, 5, 114, 0, 0, 422, 423, 5, 112, 0, 0, 423, 424, 5, 99, 0, 0, 424, 425, 5, 45, 0, 0, 425, 426, 5, 99, 0, 0, 426, 427, 5, 97, 0, 0, 427, 428, 5, 108, 0, 0, 428, 429, 5, 108, 0, 0, 429, 430, 5, 115, 0, 0, 430, 30, 1, 0, 0, 0, 431, 432, 5, 100, 0, 0, 432, 433, 5, 101, 0, 0, 433, 434, 5, 97, 0, 0, 434, 435, 5, 100, 0, 0, 435, 436, 5, 108, 0, 0, 436, 437, 5, 105, 0, 0, 437, 438, 5, 110, 0, 0, 438, 439, 5, 101, 0, 0, 439, 440, 5, 45, 0, 0, 440, 441, 5, 109, 0, 0, 441, 442, 5, 115, 0, 0, 442, 32, 1, 0, 0, 0, 443, 444, 5, 113, 0, 0, 444, 445, 5, 117, 0, 0, 445, 446, 5, 101, 0, 0, 446, 447, 5, 114, 0, 0, 447, 448, 5, 121, 0, 0, 448, 34, 1, 0, 0, 0, 449, 450, 5, 114, 0, 0, 450, 451, 5, 101, 0, 0, 451, 452, 5, 102, 0, 0, 452, 453, 5, 108, 0, 0, 453, 454, 5, 101, 0, 0, 454, 455, 5, 99, 0, 0, 455, 456, 5, 116, 0, 0, 456, 457, 5, 105, 0, 0, 457, 458, 5, 111, 0, 0, 458, 459, 5, 110, 0, 0, 459, 36, 1, 0, 0, 0, 460, 461, 5, 115, 0, 0, 461, 462, 5, 112, 0, 0, 462, 463, 5, 101, 0, 0, 463, 464, 5, 99, 0, 0, 464, 465, 5, 105, 0, 0, 465, 466, 5, 97, 0, 0, 466, 467, 5, 108, 0, 0, 467, 468, 5, 105, 0, 0, 468, 469, 5, 122, 0, 0, 469, 470, 5, 101, 0, 0, 470, 38, 1, 0, 0, 0, 471, 472, 5, 114, 0, 0, 472, 473, 5, 111, 0, 0, 473, 474, 5, 111, 0, 0, 474, 475, 5, 116, 0, 0, 475, 40, 1, 0, 0, 0, 476, 477, 5, 100, 0, 0, 477, 478, 5, 111, 0, 0, 478, 479, 5, 99, 0, 0, 479, 480, 5, 117, 0, 0, 480, 481, 5, 109, 0, 0, 481, 482, 5, 101, 0, 0, 482, 483, 5, 110, 0, 0, 483, 484, 5, 116, 0, 0, 484, 42, 1, 0, 0, 0, 485, 486, 5, 102, 0, 0, 486, 487, 5, 114, 0, 0, 487, 488, 5, 97, 0, 0, 488, 489, 5, 103, 0, 0, 489, 490, 5, 109, 0, 0, 490, 491, 5, 101, 0, 0, 491, 492, 5, 110, 0, 0, 492, 493, 5, 116, 0, 0, 493, 494, 5, 115, 0, 0, 494, 44, 1, 0, 0, 0, 495, 496, 5, 118, 0, 0, 496, 497, 5, 105, 0, 0, 497, 498, 5, 101, 0, 0, 498, 499, 5, 119, 0, 0, 499, 46, 1, 0, 0, 0, 500, 501, 5, 109, 0, 0, 501, 502, 5, 97, 0, 0, 502, 503, 5, 120, 0, 0, 503, 48, 1, 0, 0, 0, 504, 505, 5, 97, 0, 0, 505, 506, 5, 108, 0, 0, 506, 507, 5, 108, 0, 0, 507, 508, 5, 111, 0, 0, 508, 509, 5, 119, 0, 0, 509, 50, 1, 0, 0, 0, 510, 511, 5, 112, 0, 0, 511, 512, 5, 111, 0, 0, 512, 513, 5, 108, 0, 0, 513, 514, 5, 108, 0, 0, 514, 52, 1, 0, 0, 0, 515, 516, 5, 113, 0, 0, 516, 517, 5, 117, 0, 0, 517, 518, 5, 101, 0, 0, 518, 519, 5, 114, 0, 0, 519, 520, 5, 121, 0, 0, 520, 521, 5, 97, 0, 0, 521, 522, 5, 98, 0, 0, 522, 523, 5, 108, 0, 0, 523, 524, 5, 101, 0, 0, 524, 54, 1, 0, 0, 0, 525, 526, 5, 114, 0, 0, 526, 527, 5, 112, 0, 0, 527, 528, 5, 99, 0, 0, 528, 56, 1, 0, 0, 0, 529, 530, 5, 113, 0, 0, 530, 531, 5, 117, 0, 0, 531, 532, 5, 101, 0, 0, 532, 533, 5, 114, 0, 0, 533, 534, 5, 121, 0, 0, 534, 535, 5, 45, 0, 0, 535, 536, 5, 114, 0, 0, 536, 537, 5, 101, 0, 0, 537, 538, 5, 97, 0, 0, 538, 539, 5, 115, 0, 0, 539, 540, 5, 111, 0, 0, 540, 541, 5, 110, 0, 0, 541, 58, 1, 0, 0, 0, 542, 543, 5, 116, 0, 0, 543, 544, 5, 121, 0, 0, 544, 545, 5, 112, 0, 0, 545, 546, 5, 101, 0, 0, 546, 60, 1, 0, 0, 0, 547, 548, 5, 111, 0, 0, 548, 549, 5, 98, 0, 0, 549, 550, 5, 106, 0, 0, 550, 551, 5, 101, 0, 0, 551, 552, 5, 99, 0, 0, 552, 553, 5, 116, 0, 0, 553, 62, 1, 0, 0, 0, 554, 555, 5, 115, 0, 0, 555, 556, 5, 116, 0, 0, 556, 557, 5, 111, 0, 0, 557, 558, 5, 114, 0, 0, 558, 559, 5, 97, 0, 0, 559, 560, 5, 98, 0, 0, 560, 561, 5, 108, 0, 0, 561, 562, 5, 101, 0, 0, 562, 64, 1, 0, 0, 0, 563, 564, 5, 105, 0, 0, 564, 565, 5, 109, 0, 0, 565, 566, 5, 112, 0, 0, 566, 567, 5, 108, 0, 0, 567, 568, 5, 101, 0, 0, 568, 569, 5, 109, 0, 0, 569, 570, 5, 101, 0, 0, 570, 571, 5, 110, 0, 0, 571, 572, 5, 116, 0, 0, 572, 573, 5, 115, 0, 0, 573, 66, 1, 0, 0, 0, 574, 575, 5, 114, 0, 0, 575, 576, 5, 101, 0, 0, 576, 577, 5, 102, 0, 0, 577, 68, 1, 0, 0, 0, 578, 579, 5, 102, 0, 0, 579, 580, 5, 114, 0, 0, 580, 581, 5, 97, 0, 0, 581, 582, 5, 103, 0, 0, 582, 583, 5, 109, 0, 0, 583, 584, 5, 101, 0, 0, 584, 585, 5, 110, 0, 0, 585, 586, 5, 116, 0, 0, 586, 70, 1, 0, 0, 0, 587, 588, 5, 105, 0, 0, 588, 589, 5, 109, 0, 0, 589, 590, 5, 112, 0, 0, 590, 591, 5, 111, 0, 0, 591, 592, 5, 114, 0, 0, 592, 593, 5, 116, 0, 0, 593, 72, 1, 0, 0, 0, 594, 595, 5, 101, 0, 0, 595, 596, 5, 120, 0, 0, 596, 597, 5, 116, 0, 0, 597, 598, 5, 101, 0, 0, 598, 599, 5, 114, 0, 0, 599, 600, 5, 110, 0, 0, 600, 601, 5, 97, 0, 0, 601, 602, 5, 108, 0, 0, 602, 74, 1, 0, 0, 0, 603, 604, 5, 97, 0, 0, 604, 605, 5, 116, 0, 0, 605, 606, 5, 111, 0, 0, 606, 607, 5, 109, 0, 0, 607, 76, 1, 0, 0, 0, 608, 609, 5, 105, 0, 0, 609, 610, 5, 110, 0, 0, 610, 611, 5, 116, 0, 0, 611, 612, 5, 101, 0, 0, 612, 613, 5, 114, 0, 0, 613, 614, 5, 102, 0, 0, 614, 615, 5, 97, 0, 0, 615, 616, 5, 99, 0, 0, 616, 617, 5, 101, 0, 0, 617, 78, 1, 0, 0, 0, 618, 619, 5, 105, 0, 0, 619, 620, 5, 110, 0, 0, 620, 621, 5, 116, 0, 0, 621, 622, 5, 101, 0, 0, 622, 623, 5, 114, 0, 0, 623, 624, 5, 102, 0, 0, 624, 625, 5, 97, 0, 0, 625, 626, 5, 99, 0, 0, 626, 627, 5, 101, 0, 0, 627, 628, 5, 115, 0, 0, 628, 80, 1, 0, 0, 0, 629, 630, 5, 112, 0, 0, 630, 631, 5, 97, 0, 0, 631, 632, 5, 99, 0, 0, 632, 633, 5, 107, 0, 0, 633, 634, 5, 97, 0, 0, 634, 635, 5, 103, 0, 0, 635, 636, 5, 101, 0, 0, 636, 82, 1, 0, 0, 0, 637, 638, 5, 118, 0, 0, 638, 639, 5, 97, 0, 0, 639, 640, 5, 108, 0, 0, 640, 641, 5, 117, 0, 0, 641, 642, 5, 101, 0, 0, 642, 84, 1, 0, 0, 0, 643, 644, 5, 114, 0, 0, 644, 645, 5, 101, 0, 0, 645, 646, 5, 108, 0, 0, 646, 647, 5, 97, 0, 0, 647, 648, 5, 116, 0, 0, 648, 649, 5, 105, 0, 0, 649, 650, 5, 111, 0, 0, 650, 651, 5, 110, 0, 0, 651, 86, 1, 0, 0, 0, 652, 653, 5, 111, 0, 0, 653, 654, 5, 112, 0, 0, 654, 655, 5, 101, 0, 0, 655, 656, 5, 114, 0, 0, 656, 657, 5, 97, 0, 0, 657, 658, 5, 116, 0, 0, 658, 659, 5, 105, 0, 0, 659, 660, 5, 111, 0, 0, 660, 661, 5, 110, 0, 0, 661, 88, 1, 0, 0, 0, 662, 663, 5, 102, 0, 0, 663, 664, 5, 117, 0, 0, 664, 665, 5, 110, 0, 0, 665, 666, 5, 99, 0, 0, 666, 667, 5, 116, 0, 0, 667, 668, 5, 105, 0, 0, 668, 669, 5, 111, 0, 0, 669, 670, 5, 110, 0, 0, 670, 90, 1, 0, 0, 0, 671, 672, 5, 99, 0, 0, 672, 673, 5, 111, 0, 0, 673, 674, 5, 110, 0, 0, 674, 675, 5, 115, 0, 0, 675, 676, 5, 116, 0, 0, 676, 677, 5, 114, 0, 0, 677, 678, 5, 117, 0, 0, 678, 679, 5, 99, 0, 0, 679, 680, 5, 116, 0, 0, 680, 681, 5, 111, 0, 0, 681, 682, 5, 114, 0, 0, 682, 92, 1, 0, 0, 0, 683, 684, 5, 99, 0, 0, 684, 685, 5, 111, 0, 0, 685, 686, 5, 110, 0, 0, 686, 687, 5, 115, 0, 0, 687, 688, 5, 116, 0, 0, 688, 689, 5, 114, 0, 0, 689, 690, 5, 117, 0, 0, 690, 691, 5, 99, 0, 0, 691, 692, 5, 116, 0, 0, 692, 693, 5, 115, 0, 0, 693, 94, 1, 0, 0, 0, 694, 695, 5, 105, 0, 0, 695, 696, 5, 110, 0, 0, 696, 697, 5, 112, 0, 0, 697, 698, 5, 117, 0, 0, 698, 699, 5, 116, 0, 0, 699, 96, 1, 0, 0, 0, 700, 701, 5, 99, 0, 0, 701, 702, 5, 111, 0, 0, 702, 703, 5, 110, 0, 0, 703, 704, 5, 102, 0, 0, 704, 705, 5, 111, 0, 0, 705, 706, 5, 114, 0, 0, 706, 707, 5, 109, 0, 0, 707, 98, 1, 0, 0, 0, 708, 709, 5, 97, 0, 0, 709, 710, 5, 115, 0, 0, 710, 100, 1, 0, 0, 0, 711, 712, 5, 98, 0, 0, 712, 713, 5, 105, 0, 0, 713, 714, 5, 110, 0, 0, 714, 715, 5, 100, 0, 0, 715, 102, 1, 0, 0, 0, 716, 717, 5, 115, 0, 0, 717, 718, 5, 116, 0, 0, 718, 719, 5, 97, 0, 0, 719, 720, 5, 116, 0, 0, 720, 721, 5, 105, 0, 0, 721, 722, 5, 99, 0, 0, 722, 104, 1, 0, 0, 0, 723, 724, 5, 116, 0, 0, 724, 725, 5, 111, 0, 0, 725, 106, 1, 0, 0, 0, 726, 727, 5, 112, 0, 0, 727, 728, 5, 114, 0, 0, 728, 729, 5, 105, 0, 0, 729, 730, 5, 118, 0, 0, 730, 731, 5, 97, 0, 0, 731, 732, 5, 116, 0, 0, 732, 733, 5, 101, 0, 0, 733, 108, 1, 0, 0, 0, 734, 735, 5, 115, 0, 0, 735, 736, 5, 104, 0, 0, 736, 737, 5, 97, 0, 0, 737, 738, 5, 114, 0, 0, 738, 739, 5, 101, 0, 0, 739, 740, 5, 100, 0, 0, 740, 110, 1, 0, 0, 0, 741, 742, 5, 115, 0, 0, 742, 743, 5, 116, 0, 0, 743, 744, 5, 97, 0, 0, 744, 745, 5, 116, 0, 0, 745, 746, 5, 101, 0, 0, 746, 112, 1, 0, 0, 0, 747, 748, 5, 101, 0, 0, 748, 749, 5, 100, 0, 0, 749, 750, 5, 103, 0, 0, 750, 751, 5, 101, 0, 0, 751, 114, 1, 0, 0, 0, 752, 753, 5, 112, 0, 0, 753, 754, 5, 114, 0, 0, 754, 755, 5, 111, 0, 0, 755, 756, 5, 106, 0, 0, 756, 757, 5, 101, 0, 0, 757, 758, 5, 99, 0, 0, 758, 759, 5, 116, 0, 0, 759, 760, 5, 105, 0, 0, 760, 761, 5, 111, 0, 0, 761, 762, 5, 110, 0, 0, 762, 116, 1, 0, 0, 0, 763, 764, 5, 119, 0, 0, 764, 765, 5, 105, 0, 0, 765, 766, 5, 116, 0, 0, 766, 767, 5, 104, 0, 0, 767, 118, 1, 0, 0, 0, 768, 769, 5, 117, 0, 0, 769, 770, 5, 115, 0, 0, 770, 771, 5, 105, 0, 0, 771, 772, 5, 110, 0, 0, 772, 773, 5, 103, 0, 0, 773, 120, 1, 0, 0, 0, 774, 775, 5, 97, 0, 0, 775, 776, 5, 99, 0, 0, 776, 777, 5, 99, 0, 0, 777, 778, 5, 101, 0, 0, 778, 779, 5, 112, 0, 0, 779, 780, 5, 116, 0, 0, 780, 122, 1, 0, 0, 0, 781, 782, 5, 118, 0, 0, 782, 783, 5, 105, 0, 0, 783, 784, 5, 97, 0, 0, 784, 124, 1, 0, 0, 0, 785, 786, 5, 109, 0, 0, 786, 787, 5, 97, 0, 0, 787, 788, 5, 116, 0, 0, 788, 789, 5, 101, 0, 0, 789, 790, 5, 114, 0, 0, 790, 791, 5, 105, 0, 0, 791, 792, 5, 97, 0, 0, 792, 793, 5, 108, 0, 0, 793, 794, 5, 105, 0, 0, 794, 795, 5, 122, 0, 0, 795, 796, 5, 101, 0, 0, 796, 126, 1, 0, 0, 0, 797, 798, 5, 105, 0, 0, 798, 799, 5, 102, 0, 0, 799, 128, 1, 0, 0, 0, 800, 801, 5, 97, 0, 0, 801, 802, 5, 98, 0, 0, 802, 803, 5, 115, 0, 0, 803, 804, 5, 101, 0, 0, 804, 805, 5, 110, 0, 0, 805, 806, 5, 116, 0, 0, 806, 130, 1, 0, 0, 0, 807, 808, 5, 111, 0, 0, 808, 809, 5, 110, 0, 0, 809, 132, 1, 0, 0, 0, 810, 811, 5, 112, 0, 0, 811, 812, 5, 111, 0, 0, 812, 813, 5, 108, 0, 0, 813, 814, 5, 105, 0, 0, 814, 815, 5, 99, 0, 0, 815, 816, 5, 121, 0, 0, 816, 134, 1, 0, 0, 0, 817, 818, 5, 100, 0, 0, 818, 819, 5, 101, 0, 0, 819, 820, 5, 102, 0, 0, 820, 821, 5, 97, 0, 0, 821, 822, 5, 117, 0, 0, 822, 823, 5, 108, 0, 0, 823, 824, 5, 116, 0, 0, 824, 136, 1, 0, 0, 0, 825, 826, 5, 115, 0, 0, 826, 827, 5, 111, 0, 0, 827, 828, 5, 117, 0, 0, 828, 829, 5, 114, 0, 0, 829, 830, 5, 99, 0, 0, 830, 831, 5, 101, 0, 0, 831, 138, 1, 0, 0, 0, 832, 833, 5, 114, 0, 0, 833, 834, 5, 101, 0, 0, 834, 835, 5, 112, 0, 0, 835, 836, 5, 111, 0, 0, 836, 837, 5, 115, 0, 0, 837, 838, 5, 105, 0, 0, 838, 839, 5, 116, 0, 0, 839, 840, 5, 111, 0, 0, 840, 841, 5, 114, 0, 0, 841, 842, 5, 121, 0, 0, 842, 140, 1, 0, 0, 0, 843, 844, 5, 99, 0, 0, 844, 845, 5, 111, 0, 0, 845, 846, 5, 109, 0, 0, 846, 847, 5, 109, 0, 0, 847, 848, 5, 105, 0, 0, 848, 849, 5, 116, 0, 0, 849, 142, 1, 0, 0, 0, 850, 851, 5, 114, 0, 0, 851, 852, 5, 101, 0, 0, 852, 853, 5, 118, 0, 0, 853, 854, 5, 105, 0, 0, 854, 855, 5, 115, 0, 0, 855, 856, 5, 105, 0, 0, 856, 857, 5, 111, 0, 0, 857, 858, 5, 110, 0, 0, 858, 144, 1, 0, 0, 0, 859, 860, 5, 115, 0, 0, 860, 861, 5, 101, 0, 0, 861, 862, 5, 109, 0, 0, 862, 863, 5, 97, 0, 0, 863, 864, 5, 110, 0, 0, 864, 865, 5, 116, 0, 0, 865, 866, 5, 105, 0, 0, 866, 867, 5, 99, 0, 0, 867, 868, 5, 45, 0, 0, 868, 869, 5, 109, 0, 0, 869, 870, 5, 97, 0, 0, 870, 871, 5, 106, 0, 0, 871, 872, 5, 111, 0, 0, 872, 873, 5, 114, 0, 0, 873, 146, 1, 0, 0, 0, 874, 875, 5, 111, 0, 0, 875, 876, 5, 110, 0, 0, 876, 877, 5, 45, 0, 0, 877, 878, 5, 100, 0, 0, 878, 879, 5, 101, 0, 0, 879, 880, 5, 108, 0, 0, 880, 881, 5, 101, 0, 0, 881, 882, 5, 116, 0, 0, 882, 883, 5, 101, 0, 0, 883, 148, 1, 0, 0, 0, 884, 885, 5, 114, 0, 0, 885, 886, 5, 101, 0, 0, 886, 887, 5, 116, 0, 0, 887, 888, 5, 97, 0, 0, 888, 889, 5, 105, 0, 0, 889, 890, 5, 110, 0, 0, 890, 891, 5, 45, 0, 0, 891, 892, 5, 111, 0, 0, 892, 893, 5, 116, 0, 0, 893, 894, 5, 104, 0, 0, 894, 895, 5, 101, 0, 0, 895, 896, 5, 114, 0, 0, 896, 150, 1, 0, 0, 0, 897, 898, 5, 107, 0, 0, 898, 899, 5, 101, 0, 0, 899, 900, 5, 121, 0, 0, 900, 901, 5, 101, 0, 0, 901, 902, 5, 100, 0, 0, 902, 152, 1, 0, 0, 0, 903, 904, 5, 112, 0, 0, 904, 905, 5, 117, 0, 0, 905, 906, 5, 98, 0, 0, 906, 907, 5, 108, 0, 0, 907, 908, 5, 105, 0, 0, 908, 909, 5, 99, 0, 0, 909, 910, 5, 45, 0, 0, 910, 911, 5, 116, 0, 0, 911, 912, 5, 114, 0, 0, 912, 913, 5, 97, 0, 0, 913, 914, 5, 118, 0, 0, 914, 915, 5, 101, 0, 0, 915, 916, 5, 114, 0, 0, 916, 917, 5, 115, 0, 0, 917, 918, 5, 97, 0, 0, 918, 919, 5, 108, 0, 0, 919, 154, 1, 0, 0, 0, 920, 921, 5, 105, 0, 0, 921, 922, 5, 100, 0, 0, 922, 156, 1, 0, 0, 0, 923, 924, 5, 100, 0, 0, 924, 925, 5, 111, 0, 0, 925, 926, 5, 99, 0, 0, 926, 158, 1, 0, 0, 0, 927, 928, 5, 109, 0, 0, 928, 929, 5, 111, 0, 0, 929, 930, 5, 100, 0, 0, 930, 931, 5, 101, 0, 0, 931, 160, 1, 0, 0, 0, 932, 933, 5, 101, 0, 0, 933, 934, 5, 109, 0, 0, 934, 935, 5, 105, 0, 0, 935, 936, 5, 116, 0, 0, 936, 937, 5, 115, 0, 0, 937, 162, 1, 0, 0, 0, 938, 939, 5, 114, 0, 0, 939, 940, 5, 101, 0, 0, 940, 941, 5, 99, 0, 0, 941, 942, 5, 101, 0, 0, 942, 943, 5, 105, 0, 0, 943, 944, 5, 118, 0, 0, 944, 945, 5, 101, 0, 0, 945, 946, 5, 114, 0, 0, 946, 164, 1, 0, 0, 0, 947, 948, 5, 114, 0, 0, 948, 949, 5, 101, 0, 0, 949, 950, 5, 113, 0, 0, 950, 951, 5, 117, 0, 0, 951, 952, 5, 105, 0, 0, 952, 953, 5, 114, 0, 0, 953, 954, 5, 101, 0, 0, 954, 955, 5, 115, 0, 0, 955, 166, 1, 0, 0, 0, 956, 957, 5, 97, 0, 0, 957, 958, 5, 110, 0, 0, 958, 959, 5, 121, 0, 0, 959, 168, 1, 0, 0, 0, 960, 961, 5, 103, 0, 0, 961, 962, 5, 101, 0, 0, 962, 963, 5, 116, 0, 0, 963, 170, 1, 0, 0, 0, 964, 965, 5, 115, 0, 0, 965, 966, 5, 101, 0, 0, 966, 967, 5, 116, 0, 0, 967, 172, 1, 0, 0, 0, 968, 969, 5, 119, 0, 0, 969, 970, 5, 97, 0, 0, 970, 971, 5, 116, 0, 0, 971, 972, 5, 99, 0, 0, 972, 973, 5, 104, 0, 0, 973, 174, 1, 0, 0, 0, 974, 975, 5, 115, 0, 0, 975, 976, 5, 116, 0, 0, 976, 977, 5, 97, 0, 0, 977, 978, 5, 114, 0, 0, 978, 979, 5, 116, 0, 0, 979, 176, 1, 0, 0, 0, 980, 981, 5, 115, 0, 0, 981, 982, 5, 116, 0, 0, 982, 983, 5, 111, 0, 0, 983, 984, 5, 112, 0, 0, 984, 178, 1, 0, 0, 0, 985, 986, 5, 114, 0, 0, 986, 987, 5, 101, 0, 0, 987, 988, 5, 97, 0, 0, 988, 989, 5, 100, 0, 0, 989, 180, 1, 0, 0, 0, 990, 991, 5, 119, 0, 0, 991, 992, 5, 114, 0, 0, 992, 993, 5, 105, 0, 0, 993, 994, 5, 116, 0, 0, 994, 995, 5, 101, 0, 0, 995, 182, 1, 0, 0, 0, 996, 997, 5, 114, 0, 0, 997, 998, 5, 101, 0, 0, 998, 999, 5, 115, 0, 0, 999, 1000, 5, 111, 0, 0, 1000, 1001, 5, 108, 0, 0, 1001, 1002, 5, 118, 0, 0, 1002, 1003, 5, 101, 0, 0, 1003, 184, 1, 0, 0, 0, 1004, 1005, 5, 99, 0, 0, 1005, 1006, 5, 111, 0, 0, 1006, 1007, 5, 110, 0, 0, 1007, 1008, 5, 110, 0, 0, 1008, 1009, 5, 101, 0, 0, 1009, 1010, 5, 99, 0, 0, 1010, 1011, 5, 116, 0, 0, 1011, 186, 1, 0, 0, 0, 1012, 1013, 5, 100, 0, 0, 1013, 1014, 5, 105, 0, 0, 1014, 1015, 5, 115, 0, 0, 1015, 1016, 5, 99, 0, 0, 1016, 1017, 5, 111, 0, 0, 1017, 1018, 5, 110, 0, 0, 1018, 1019, 5, 110, 0, 0, 1019, 1020, 5, 101, 0, 0, 1020, 1021, 5, 99, 0, 0, 1021, 1022, 5, 116, 0, 0, 1022, 188, 1, 0, 0, 0, 1023, 1024, 5, 99, 0, 0, 1024, 1025, 5, 97, 0, 0, 1025, 1026, 5, 108, 0, 0, 1026, 1027, 5, 108, 0, 0, 1027, 190, 1, 0, 0, 0, 1028, 1029, 5, 119, 0, 0, 1029, 1030, 5, 97, 0, 0, 1030, 1031, 5, 116, 0, 0, 1031, 1032, 5, 99, 0, 0, 1032, 1033, 5, 104, 0, 0, 1033, 1034, 5, 45, 0, 0, 1034, 1035, 5, 115, 0, 0, 1035, 1036, 5, 116, 0, 0, 1036, 1037, 5, 97, 0, 0, 1037, 1038, 5, 114, 0, 0, 1038, 1039, 5, 116, 0, 0, 1039, 192, 1, 0, 0, 0, 1040, 1041, 5, 119, 0, 0, 1041, 1042, 5, 97, 0, 0, 1042, 1043, 5, 116, 0, 0, 1043, 1044, 5, 99, 0, 0, 1044, 1045, 5, 104, 0, 0, 1045, 1046, 5, 45, 0, 0, 1046, 1047, 5, 115, 0, 0, 1047, 1048, 5, 116, 0, 0, 1048, 1049, 5, 111, 0, 0, 1049, 1050, 5, 112, 0, 0, 1050, 194, 1, 0, 0, 0, 1051, 1052, 5, 115, 0, 0, 1052, 1053, 5, 117, 0, 0, 1053, 1054, 5, 98, 0, 0, 1054, 1055, 5, 115, 0, 0, 1055, 1056, 5, 99, 0, 0, 1056, 1057, 5, 114, 0, 0, 1057, 1058, 5, 105, 0, 0, 1058, 1059, 5, 98, 0, 0, 1059, 1060, 5, 101, 0, 0, 1060, 196, 1, 0, 0, 0, 1061, 1062, 5, 117, 0, 0, 1062, 1063, 5, 110, 0, 0, 1063, 1064, 5, 115, 0, 0, 1064, 1065, 5, 117, 0, 0, 1065, 1066, 5, 98, 0, 0, 1066, 1067, 5, 115, 0, 0, 1067, 1068, 5, 99, 0, 0, 1068, 1069, 5, 114, 0, 0, 1069, 1070, 5, 105, 0, 0, 1070, 1071, 5, 98, 0, 0, 1071, 1072, 5, 101, 0, 0, 1072, 198, 1, 0, 0, 0, 1073, 1074, 5, 114, 0, 0, 1074, 1075, 5, 101, 0, 0, 1075, 1076, 5, 103, 0, 0, 1076, 1077, 5, 105, 0, 0, 1077, 1078, 5, 115, 0, 0, 1078, 1079, 5, 116, 0, 0, 1079, 1080, 5, 101, 0, 0, 1080, 1081, 5, 114, 0, 0, 1081, 200, 1, 0, 0, 0, 1082, 1083, 5, 99, 0, 0, 1083, 1084, 5, 114, 0, 0, 1084, 1085, 5, 100, 0, 0, 1085, 1086, 5, 116, 0, 0, 1086, 202, 1, 0, 0, 0, 1087, 1088, 5, 111, 0, 0, 1088, 1089, 5, 112, 0, 0, 1089, 1090, 5, 116, 0, 0, 1090, 1091, 5, 105, 0, 0, 1091, 1092, 5, 111, 0, 0, 1092, 1093, 5, 110, 0, 0, 1093, 1094, 5, 97, 0, 0, 1094, 1095, 5, 108, 0, 0, 1095, 1096, 5, 45, 0, 0, 1096, 1097, 5, 111, 0, 0, 1097, 1098, 5, 110, 0, 0, 1098, 1099, 5, 101, 0, 0, 1099, 204, 1, 0, 0, 0, 1100, 1101, 5, 101, 0, 0, 1101, 1102, 5, 120, 0, 0, 1102, 1103, 5, 97, 0, 0, 1103, 1104, 5, 99, 0, 0, 1104, 1105, 5, 116, 0, 0, 1105, 1106, 5, 108, 0, 0, 1106, 1107, 5, 121, 0, 0, 1107, 1108, 5, 45, 0, 0, 1108, 1109, 5, 111, 0, 0, 1109, 1110, 5, 110, 0, 0, 1110, 1111, 5, 101, 0, 0, 1111, 206, 1, 0, 0, 0, 1112, 1113, 5, 109, 0, 0, 1113, 1114, 5, 97, 0, 0, 1114, 1115, 5, 110, 0, 0, 1115, 1116, 5, 121, 0, 0, 1116, 1117, 5, 45, 0, 0, 1117, 1118, 5, 117, 0, 0, 1118, 1119, 5, 110, 0, 0, 1119, 1120, 5, 105, 0, 0, 1120, 1121, 5, 113, 0, 0, 1121, 1122, 5, 117, 0, 0, 1122, 1123, 5, 101, 0, 0, 1123, 208, 1, 0, 0, 0, 1124, 1125, 5, 109, 0, 0, 1125, 1126, 5, 97, 0, 0, 1126, 1127, 5, 110, 0, 0, 1127, 1128, 5, 121, 0, 0, 1128, 210, 1, 0, 0, 0, 1129, 1130, 5, 111, 0, 0, 1130, 1131, 5, 114, 0, 0, 1131, 1132, 5, 100, 0, 0, 1132, 1133, 5, 101, 0, 0, 1133, 1134, 5, 114, 0, 0, 1134, 1135, 5, 101, 0, 0, 1135, 1136, 5, 100, 0, 0, 1136, 212, 1, 0, 0, 0, 1137, 1138, 5, 117, 0, 0, 1138, 1139, 5, 110, 0, 0, 1139, 1140, 5, 105, 0, 0, 1140, 1141, 5, 116, 0, 0, 1141, 214, 1, 0, 0, 0, 1142, 1143, 5, 119, 0, 0, 1143, 1144, 5, 97, 0, 0, 1144, 1145, 5, 116, 0, 0, 1145, 1146, 5, 99, 0, 0, 1146, 1147, 5, 104, 0, 0, 1147, 1148, 5, 45, 0, 0, 1148, 1149, 5, 104, 0, 0, 1149, 1150, 5, 97, 0, 0, 1150, 1151, 5, 110, 0, 0, 1151, 1152, 5, 100, 0, 0, 1152, 1153, 5, 108, 0, 0, 1153, 1154, 5, 101, 0, 0, 1154, 216, 1, 0, 0, 0, 1155, 1156, 5, 109, 0, 0, 1156, 1157, 5, 101, 0, 0, 1157, 1158, 5, 115, 0, 0, 1158, 1159, 5, 115, 0, 0, 1159, 1160, 5, 97, 0, 0, 1160, 1161, 5, 103, 0, 0, 1161, 1162, 5, 101, 0, 0, 1162, 218, 1, 0, 0, 0, 1163, 1164, 5, 97, 0, 0, 1164, 1165, 5, 116, 0, 0, 1165, 1166, 5, 111, 0, 0, 1166, 1167, 5, 109, 0, 0, 1167, 1168, 5, 45, 0, 0, 1168, 1169, 5, 114, 0, 0, 1169, 1170, 5, 101, 0, 0, 1170, 1171, 5, 102, 0, 0, 1171, 220, 1, 0, 0, 0, 1172, 1173, 5, 105, 0, 0, 1173, 1174, 5, 110, 0, 0, 1174, 1175, 5, 116, 0, 0, 1175, 1176, 5, 101, 0, 0, 1176, 1177, 5, 114, 0, 0, 1177, 1178, 5, 102, 0, 0, 1178, 1179, 5, 97, 0, 0, 1179, 1180, 5, 99, 0, 0, 1180, 1181, 5, 101, 0, 0, 1181, 1182, 5, 45, 0, 0, 1182, 1183, 5, 114, 0, 0, 1183, 1184, 5, 101, 0, 0, 1184, 1185, 5, 102, 0, 0, 1185, 222, 1, 0, 0, 0, 1186, 1187, 5, 111, 0, 0, 1187, 1188, 5, 112, 0, 0, 1188, 1189, 5, 116, 0, 0, 1189, 1190, 5, 105, 0, 0, 1190, 1191, 5, 111, 0, 0, 1191, 1192, 5, 110, 0, 0, 1192, 1193, 5, 97, 0, 0, 1193, 1194, 5, 108, 0, 0, 1194, 224, 1, 0, 0, 0, 1195, 1196, 5, 108, 0, 0, 1196, 1197, 5, 105, 0, 0, 1197, 1198, 5, 115, 0, 0, 1198, 1199, 5, 116, 0, 0, 1199, 226, 1, 0, 0, 0, 1200, 1201, 5, 114, 0, 0, 1201, 1202, 5, 101, 0, 0, 1202, 1203, 5, 99, 0, 0, 1203, 1204, 5, 111, 0, 0, 1204, 1205, 5, 114, 0, 0, 1205, 1206, 5, 100, 0, 0, 1206, 228, 1, 0, 0, 0, 1207, 1208, 5, 98, 0, 0, 1208, 1209, 5, 111, 0, 0, 1209, 1210, 5, 111, 0, 0, 1210, 1211, 5, 108, 0, 0, 1211, 230, 1, 0, 0, 0, 1212, 1213, 5, 98, 0, 0, 1213, 1214, 5, 121, 0, 0, 1214, 1215, 5, 116, 0, 0, 1215, 1216, 5, 101, 0, 0, 1216, 1217, 5, 115, 0, 0, 1217, 232, 1, 0, 0, 0, 1218, 1219, 5, 100, 0, 0, 1219, 1220, 5, 111, 0, 0, 1220, 1221, 5, 117, 0, 0, 1221, 1222, 5, 98, 0, 0, 1222, 1223, 5, 108, 0, 0, 1223, 1224, 5, 101, 0, 0, 1224, 234, 1, 0, 0, 0, 1225, 1226, 5, 105, 0, 0, 1226, 1227, 5, 110, 0, 0, 1227, 1228, 5, 116, 0, 0, 1228, 1229, 5, 51, 0, 0, 1229, 1230, 5, 50, 0, 0, 1230, 236, 1, 0, 0, 0, 1231, 1232, 5, 105, 0, 0, 1232, 1233, 5, 110, 0, 0, 1233, 1234, 5, 116, 0, 0, 1234, 1235, 5, 54, 0, 0, 1235, 1236, 5, 52, 0, 0, 1236, 238, 1, 0, 0, 0, 1237, 1238, 5, 115, 0, 0, 1238, 1239, 5, 116, 0, 0, 1239, 1240, 5, 114, 0, 0, 1240, 1241, 5, 105, 0, 0, 1241, 1242, 5, 110, 0, 0, 1242, 1243, 5, 103, 0, 0, 1243, 240, 1, 0, 0, 0, 1244, 1245, 5, 117, 0, 0, 1245, 1246, 5, 105, 0, 0, 1246, 1247, 5, 110, 0, 0, 1247, 1248, 5, 116, 0, 0, 1248, 1249, 5, 51, 0, 0, 1249, 1250, 5, 50, 0, 0, 1250, 242, 1, 0, 0, 0, 1251, 1252, 5, 117, 0, 0, 1252, 1253, 5, 105, 0, 0, 1253, 1254, 5, 110, 0, 0, 1254, 1255, 5, 116, 0, 0, 1255, 1256, 5, 54, 0, 0, 1256, 1257, 5, 52, 0, 0, 1257, 244, 1, 0, 0, 0, 1258, 1259, 5, 116, 0, 0, 1259, 1260, 5, 114, 0, 0, 1260, 1261, 5, 117, 0, 0, 1261, 1262, 5, 101, 0, 0, 1262, 246, 1, 0, 0, 0, 1263, 1264, 5, 102, 0, 0, 1264, 1265, 5, 97, 0, 0, 1265, 1266, 5, 108, 0, 0, 1266, 1267, 5, 115, 0, 0, 1267, 1268, 5, 101, 0, 0, 1268, 248, 1, 0, 0, 0, 1269, 1270, 5, 110, 0, 0, 1270, 1271, 5, 117, 0, 0, 1271, 1272, 5, 108, 0, 0, 1272, 1273, 5, 108, 0, 0, 1273, 250, 1, 0, 0, 0, 1274, 1275, 5, 45, 0, 0, 1275, 1276, 5, 62, 0, 0, 1276, 252, 1, 0, 0, 0, 1277, 1278, 5, 58, 0, 0, 1278, 254, 1, 0, 0, 0, 1279, 1280, 5, 59, 0, 0, 1280, 256, 1, 0, 0, 0, 1281, 1282, 5, 44, 0, 0, 1282, 258, 1, 0, 0, 0, 1283, 1284, 5, 46, 0, 0, 1284, 260, 1, 0, 0, 0, 1285, 1286, 5, 123, 0, 0, 1286, 262, 1, 0, 0, 0, 1287, 1288, 5, 125, 0, 0, 1288, 264, 1, 0, 0, 0, 1289, 1290, 5, 91, 0, 0, 1290, 266, 1, 0, 0, 0, 1291, 1292, 5, 93, 0, 0, 1292, 268, 1, 0, 0, 0, 1293, 1294, 5, 40, 0, 0, 1294, 270, 1, 0, 0, 0, 1295, 1296, 5, 41, 0, 0, 1296, 272, 1, 0, 0, 0, 1297, 1298, 5, 60, 0, 0, 1298, 274, 1, 0, 0, 0, 1299, 1300, 5, 62, 0, 0, 1300, 276, 1, 0, 0, 0, 1301, 1302, 5, 38, 0, 0, 1302, 278, 1, 0, 0, 0, 1303, 1304, 5, 61, 0, 0, 1304, 280, 1, 0, 0, 0, 1305, 1307, 5, 45, 0, 0, 1306, 1305, 1, 0, 0, 0, 1306, 1307, 1, 0, 0, 0, 1307, 1309, 1, 0, 0, 0, 1308, 1310, 7, 0, 0, 0, 1309, 1308, 1, 0, 0, 0, 1310, 1311, 1, 0, 0, 0, 1311, 1309, 1, 0, 0, 0, 1311, 1312, 1, 0, 0, 0, 1312, 282, 1, 0, 0, 0, 1313, 1315, 5, 45, 0, 0, 1314, 1313, 1, 0, 0, 0, 1314, 1315, 1, 0, 0, 0, 1315, 1324, 1, 0, 0, 0, 1316, 1325, 5, 48, 0, 0, 1317, 1321, 7, 1, 0, 0, 1318, 1320, 7, 0, 0, 0, 1319, 1318, 1, 0, 0, 0, 1320, 1323, 1, 0, 0, 0, 1321, 1319, 1, 0, 0, 0, 1321, 1322, 1, 0, 0, 0, 1322, 1325, 1, 0, 0, 0, 1323, 1321, 1, 0, 0, 0, 1324, 1316, 1, 0, 0, 0, 1324, 1317, 1, 0, 0, 0, 1325, 1332, 1, 0, 0, 0, 1326, 1328, 5, 46, 0, 0, 1327, 1329, 7, 0, 0, 0, 1328, 1327, 1, 0, 0, 0, 1329, 1330, 1, 0, 0, 0, 1330, 1328, 1, 0, 0, 0, 1330, 1331, 1, 0, 0, 0, 1331, 1333, 1, 0, 0, 0, 1332, 1326, 1, 0, 0, 0, 1332, 1333, 1, 0, 0, 0, 1333, 1343, 1, 0, 0, 0, 1334, 1336, 7, 2, 0, 0, 1335, 1337, 7, 3, 0, 0, 1336, 1335, 1, 0, 0, 0, 1336, 1337, 1, 0, 0, 0, 1337, 1339, 1, 0, 0, 0, 1338, 1340, 7, 0, 0, 0, 1339, 1338, 1, 0, 0, 0, 1340, 1341, 1, 0, 0, 0, 1341, 1339, 1, 0, 0, 0, 1341, 1342, 1, 0, 0, 0, 1342, 1344, 1, 0, 0, 0, 1343, 1334, 1, 0, 0, 0, 1343, 1344, 1, 0, 0, 0, 1344, 284, 1, 0, 0, 0, 1345, 1349, 7, 4, 0, 0, 1346, 1348, 7, 5, 0, 0, 1347, 1346, 1, 0, 0, 0, 1348, 1351, 1, 0, 0, 0, 1349, 1347, 1, 0, 0, 0, 1349, 1350, 1, 0, 0, 0, 1350, 286, 1, 0, 0, 0, 1351, 1349, 1, 0, 0, 0, 1352, 1357, 5, 34, 0, 0, 1353, 1356, 3, 289, 144, 0, 1354, 1356, 8, 6, 0, 0, 1355, 1353, 1, 0, 0, 0, 1355, 1354, 1, 0, 0, 0, 1356, 1359, 1, 0, 0, 0, 1357, 1355, 1, 0, 0, 0, 1357, 1358, 1, 0, 0, 0, 1358, 1360, 1, 0, 0, 0, 1359, 1357, 1, 0, 0, 0, 1360, 1361, 5, 34, 0, 0, 1361, 288, 1, 0, 0, 0, 1362, 1370, 5, 92, 0, 0, 1363, 1371, 7, 7, 0, 0, 1364, 1365, 5, 117, 0, 0, 1365, 1366, 3, 291, 145, 0, 1366, 1367, 3, 291, 145, 0, 1367, 1368, 3, 291, 145, 0, 1368, 1369, 3, 291, 145, 0, 1369, 1371, 1, 0, 0, 0, 1370, 1363, 1, 0, 0, 0, 1370, 1364, 1, 0, 0, 0, 1371, 290, 1, 0, 0, 0, 1372, 1373, 7, 8, 0, 0, 1373, 292, 1, 0, 0, 0, 1374, 1375, 5, 47, 0, 0, 1375, 1376, 5, 47, 0, 0, 1376, 1380, 1, 0, 0, 0, 1377, 1379, 8, 9, 0, 0, 1378, 1377, 1, 0, 0, 0, 1379, 1382, 1, 0, 0, 0, 1380, 1378, 1, 0, 0, 0, 1380, 1381, 1, 0, 0, 0, 1381, 1383, 1, 0, 0, 0, 1382, 1380, 1, 0, 0, 0, 1383, 1384, 6, 146, 0, 0, 1384, 294, 1, 0, 0, 0, 1385, 1386, 5, 47, 0, 0, 1386, 1387, 5, 42, 0, 0, 1387, 1391, 1, 0, 0, 0, 1388, 1390, 9, 0, 0, 0, 1389, 1388, 1, 0, 0, 0, 1390, 1393, 1, 0, 0, 0, 1391, 1392, 1, 0, 0, 0, 1391, 1389, 1, 0, 0, 0, 1392, 1394, 1, 0, 0, 0, 1393, 1391, 1, 0, 0, 0, 1394, 1395, 5, 42, 0, 0, 1395, 1396, 5, 47, 0, 0, 1396, 1397, 1, 0, 0, 0, 1397, 1398, 6, 147, 0, 0, 1398, 296, 1, 0, 0, 0, 1399, 1401, 7, 10, 0, 0, 1400, 1399, 1, 0, 0, 0, 1401, 1402, 1, 0, 0, 0, 1402, 1400, 1, 0, 0, 0, 1402, 1403, 1, 0, 0, 0, 1403, 1404, 1, 0, 0, 0, 1404, 1405, 6, 148, 0, 0, 1405, 298, 1, 0, 0, 0, 18, 0, 1306, 1311, 1314, 1321, 1324, 1330, 1332, 1336, 1341, 1343, 1349, 1355, 1357, 1370, 1380, 1391, 1402, 1, 0, 1, 0] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapabilityLexer.tokens b/src/capability-language/generated/QuixosCapabilityLexer.tokens index 25f0df9..3f8605d 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.tokens +++ b/src/capability-language/generated/QuixosCapabilityLexer.tokens @@ -58,92 +58,93 @@ EDGE=57 PROJECTION=58 WITH=59 USING=60 -VIA=61 -MATERIALIZE=62 -IF=63 -ABSENT=64 -ON=65 -POLICY=66 -DEFAULT=67 -SOURCE=68 -REPOSITORY=69 -COMMIT=70 -REVISION=71 -SEMANTIC_MAJOR=72 -ON_DELETE=73 -RETAIN_OTHER=74 -KEYED=75 -PUBLIC_TRAVERSAL=76 -ID=77 -DOC=78 -MODE=79 -EMITS=80 -RECEIVER=81 -REQUIRES=82 -ANY=83 -GET=84 -SET=85 -WATCH=86 -START=87 -STOP=88 -READ=89 -WRITE=90 -RESOLVE=91 -CONNECT=92 -DISCONNECT=93 -CALL=94 -WATCH_START=95 -WATCH_STOP=96 -SUBSCRIBE=97 -UNSUBSCRIBE=98 -REGISTER=99 -CRDT=100 -OPTIONAL_ONE=101 -EXACTLY_ONE=102 -MANY_UNIQUE=103 -MANY=104 -ORDERED=105 -UNIT=106 -WATCH_HANDLE=107 -MESSAGE=108 -ATOM_REF=109 -INTERFACE_REF=110 -OPTIONAL=111 -LIST=112 -RECORD=113 -BOOL=114 -BYTES=115 -DOUBLE=116 -INT32=117 -INT64=118 -STRING=119 -UINT32=120 -UINT64=121 -TRUE=122 -FALSE=123 -NULL=124 -ARROW=125 -COLON=126 -SEMI=127 -COMMA=128 -DOT=129 -LBRACE=130 -RBRACE=131 -LBRACK=132 -RBRACK=133 -LPAREN=134 -RPAREN=135 -LT=136 -GT=137 -AMP=138 -EQUAL=139 -INTEGER=140 -JSON_NUMBER=141 -IDENTIFIER=142 -STRING_LITERAL=143 -LINE_COMMENT=144 -BLOCK_COMMENT=145 -WS=146 +ACCEPT=61 +VIA=62 +MATERIALIZE=63 +IF=64 +ABSENT=65 +ON=66 +POLICY=67 +DEFAULT=68 +SOURCE=69 +REPOSITORY=70 +COMMIT=71 +REVISION=72 +SEMANTIC_MAJOR=73 +ON_DELETE=74 +RETAIN_OTHER=75 +KEYED=76 +PUBLIC_TRAVERSAL=77 +ID=78 +DOC=79 +MODE=80 +EMITS=81 +RECEIVER=82 +REQUIRES=83 +ANY=84 +GET=85 +SET=86 +WATCH=87 +START=88 +STOP=89 +READ=90 +WRITE=91 +RESOLVE=92 +CONNECT=93 +DISCONNECT=94 +CALL=95 +WATCH_START=96 +WATCH_STOP=97 +SUBSCRIBE=98 +UNSUBSCRIBE=99 +REGISTER=100 +CRDT=101 +OPTIONAL_ONE=102 +EXACTLY_ONE=103 +MANY_UNIQUE=104 +MANY=105 +ORDERED=106 +UNIT=107 +WATCH_HANDLE=108 +MESSAGE=109 +ATOM_REF=110 +INTERFACE_REF=111 +OPTIONAL=112 +LIST=113 +RECORD=114 +BOOL=115 +BYTES=116 +DOUBLE=117 +INT32=118 +INT64=119 +STRING=120 +UINT32=121 +UINT64=122 +TRUE=123 +FALSE=124 +NULL=125 +ARROW=126 +COLON=127 +SEMI=128 +COMMA=129 +DOT=130 +LBRACE=131 +RBRACE=132 +LBRACK=133 +RBRACK=134 +LPAREN=135 +RPAREN=136 +LT=137 +GT=138 +AMP=139 +EQUAL=140 +INTEGER=141 +JSON_NUMBER=142 +IDENTIFIER=143 +STRING_LITERAL=144 +LINE_COMMENT=145 +BLOCK_COMMENT=146 +WS=147 'edit'=1 'creation'=2 'initialize'=3 @@ -204,82 +205,83 @@ WS=146 'projection'=58 'with'=59 'using'=60 -'via'=61 -'materialize'=62 -'if'=63 -'absent'=64 -'on'=65 -'policy'=66 -'default'=67 -'source'=68 -'repository'=69 -'commit'=70 -'revision'=71 -'semantic-major'=72 -'on-delete'=73 -'retain-other'=74 -'keyed'=75 -'public-traversal'=76 -'id'=77 -'doc'=78 -'mode'=79 -'emits'=80 -'receiver'=81 -'requires'=82 -'any'=83 -'get'=84 -'set'=85 -'watch'=86 -'start'=87 -'stop'=88 -'read'=89 -'write'=90 -'resolve'=91 -'connect'=92 -'disconnect'=93 -'call'=94 -'watch-start'=95 -'watch-stop'=96 -'subscribe'=97 -'unsubscribe'=98 -'register'=99 -'crdt'=100 -'optional-one'=101 -'exactly-one'=102 -'many-unique'=103 -'many'=104 -'ordered'=105 -'unit'=106 -'watch-handle'=107 -'message'=108 -'atom-ref'=109 -'interface-ref'=110 -'optional'=111 -'list'=112 -'record'=113 -'bool'=114 -'bytes'=115 -'double'=116 -'int32'=117 -'int64'=118 -'string'=119 -'uint32'=120 -'uint64'=121 -'true'=122 -'false'=123 -'null'=124 -'->'=125 -':'=126 -';'=127 -','=128 -'.'=129 -'{'=130 -'}'=131 -'['=132 -']'=133 -'('=134 -')'=135 -'<'=136 -'>'=137 -'&'=138 -'='=139 +'accept'=61 +'via'=62 +'materialize'=63 +'if'=64 +'absent'=65 +'on'=66 +'policy'=67 +'default'=68 +'source'=69 +'repository'=70 +'commit'=71 +'revision'=72 +'semantic-major'=73 +'on-delete'=74 +'retain-other'=75 +'keyed'=76 +'public-traversal'=77 +'id'=78 +'doc'=79 +'mode'=80 +'emits'=81 +'receiver'=82 +'requires'=83 +'any'=84 +'get'=85 +'set'=86 +'watch'=87 +'start'=88 +'stop'=89 +'read'=90 +'write'=91 +'resolve'=92 +'connect'=93 +'disconnect'=94 +'call'=95 +'watch-start'=96 +'watch-stop'=97 +'subscribe'=98 +'unsubscribe'=99 +'register'=100 +'crdt'=101 +'optional-one'=102 +'exactly-one'=103 +'many-unique'=104 +'many'=105 +'ordered'=106 +'unit'=107 +'watch-handle'=108 +'message'=109 +'atom-ref'=110 +'interface-ref'=111 +'optional'=112 +'list'=113 +'record'=114 +'bool'=115 +'bytes'=116 +'double'=117 +'int32'=118 +'int64'=119 +'string'=120 +'uint32'=121 +'uint64'=122 +'true'=123 +'false'=124 +'null'=125 +'->'=126 +':'=127 +';'=128 +','=129 +'.'=130 +'{'=131 +'}'=132 +'['=133 +']'=134 +'('=135 +')'=136 +'<'=137 +'>'=138 +'&'=139 +'='=140 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.ts b/src/capability-language/generated/QuixosCapabilityLexer.ts index e346e80..fe595e4 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.ts +++ b/src/capability-language/generated/QuixosCapabilityLexer.ts @@ -64,92 +64,93 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public static readonly PROJECTION = 58; public static readonly WITH = 59; public static readonly USING = 60; - public static readonly VIA = 61; - public static readonly MATERIALIZE = 62; - public static readonly IF = 63; - public static readonly ABSENT = 64; - public static readonly ON = 65; - public static readonly POLICY = 66; - public static readonly DEFAULT = 67; - public static readonly SOURCE = 68; - public static readonly REPOSITORY = 69; - public static readonly COMMIT = 70; - public static readonly REVISION = 71; - public static readonly SEMANTIC_MAJOR = 72; - public static readonly ON_DELETE = 73; - public static readonly RETAIN_OTHER = 74; - public static readonly KEYED = 75; - public static readonly PUBLIC_TRAVERSAL = 76; - public static readonly ID = 77; - public static readonly DOC = 78; - public static readonly MODE = 79; - public static readonly EMITS = 80; - public static readonly RECEIVER = 81; - public static readonly REQUIRES = 82; - public static readonly ANY = 83; - public static readonly GET = 84; - public static readonly SET = 85; - public static readonly WATCH = 86; - public static readonly START = 87; - public static readonly STOP = 88; - public static readonly READ = 89; - public static readonly WRITE = 90; - public static readonly RESOLVE = 91; - public static readonly CONNECT = 92; - public static readonly DISCONNECT = 93; - public static readonly CALL = 94; - public static readonly WATCH_START = 95; - public static readonly WATCH_STOP = 96; - public static readonly SUBSCRIBE = 97; - public static readonly UNSUBSCRIBE = 98; - public static readonly REGISTER = 99; - public static readonly CRDT = 100; - public static readonly OPTIONAL_ONE = 101; - public static readonly EXACTLY_ONE = 102; - public static readonly MANY_UNIQUE = 103; - public static readonly MANY = 104; - public static readonly ORDERED = 105; - public static readonly UNIT = 106; - public static readonly WATCH_HANDLE = 107; - public static readonly MESSAGE = 108; - public static readonly ATOM_REF = 109; - public static readonly INTERFACE_REF = 110; - public static readonly OPTIONAL = 111; - public static readonly LIST = 112; - public static readonly RECORD = 113; - public static readonly BOOL = 114; - public static readonly BYTES = 115; - public static readonly DOUBLE = 116; - public static readonly INT32 = 117; - public static readonly INT64 = 118; - public static readonly STRING = 119; - public static readonly UINT32 = 120; - public static readonly UINT64 = 121; - public static readonly TRUE = 122; - public static readonly FALSE = 123; - public static readonly NULL = 124; - public static readonly ARROW = 125; - public static readonly COLON = 126; - public static readonly SEMI = 127; - public static readonly COMMA = 128; - public static readonly DOT = 129; - public static readonly LBRACE = 130; - public static readonly RBRACE = 131; - public static readonly LBRACK = 132; - public static readonly RBRACK = 133; - public static readonly LPAREN = 134; - public static readonly RPAREN = 135; - public static readonly LT = 136; - public static readonly GT = 137; - public static readonly AMP = 138; - public static readonly EQUAL = 139; - public static readonly INTEGER = 140; - public static readonly JSON_NUMBER = 141; - public static readonly IDENTIFIER = 142; - public static readonly STRING_LITERAL = 143; - public static readonly LINE_COMMENT = 144; - public static readonly BLOCK_COMMENT = 145; - public static readonly WS = 146; + public static readonly ACCEPT = 61; + public static readonly VIA = 62; + public static readonly MATERIALIZE = 63; + public static readonly IF = 64; + public static readonly ABSENT = 65; + public static readonly ON = 66; + public static readonly POLICY = 67; + public static readonly DEFAULT = 68; + public static readonly SOURCE = 69; + public static readonly REPOSITORY = 70; + public static readonly COMMIT = 71; + public static readonly REVISION = 72; + public static readonly SEMANTIC_MAJOR = 73; + public static readonly ON_DELETE = 74; + public static readonly RETAIN_OTHER = 75; + public static readonly KEYED = 76; + public static readonly PUBLIC_TRAVERSAL = 77; + public static readonly ID = 78; + public static readonly DOC = 79; + public static readonly MODE = 80; + public static readonly EMITS = 81; + public static readonly RECEIVER = 82; + public static readonly REQUIRES = 83; + public static readonly ANY = 84; + public static readonly GET = 85; + public static readonly SET = 86; + public static readonly WATCH = 87; + public static readonly START = 88; + public static readonly STOP = 89; + public static readonly READ = 90; + public static readonly WRITE = 91; + public static readonly RESOLVE = 92; + public static readonly CONNECT = 93; + public static readonly DISCONNECT = 94; + public static readonly CALL = 95; + public static readonly WATCH_START = 96; + public static readonly WATCH_STOP = 97; + public static readonly SUBSCRIBE = 98; + public static readonly UNSUBSCRIBE = 99; + public static readonly REGISTER = 100; + public static readonly CRDT = 101; + public static readonly OPTIONAL_ONE = 102; + public static readonly EXACTLY_ONE = 103; + public static readonly MANY_UNIQUE = 104; + public static readonly MANY = 105; + public static readonly ORDERED = 106; + public static readonly UNIT = 107; + public static readonly WATCH_HANDLE = 108; + public static readonly MESSAGE = 109; + public static readonly ATOM_REF = 110; + public static readonly INTERFACE_REF = 111; + public static readonly OPTIONAL = 112; + public static readonly LIST = 113; + public static readonly RECORD = 114; + public static readonly BOOL = 115; + public static readonly BYTES = 116; + public static readonly DOUBLE = 117; + public static readonly INT32 = 118; + public static readonly INT64 = 119; + public static readonly STRING = 120; + public static readonly UINT32 = 121; + public static readonly UINT64 = 122; + public static readonly TRUE = 123; + public static readonly FALSE = 124; + public static readonly NULL = 125; + public static readonly ARROW = 126; + public static readonly COLON = 127; + public static readonly SEMI = 128; + public static readonly COMMA = 129; + public static readonly DOT = 130; + public static readonly LBRACE = 131; + public static readonly RBRACE = 132; + public static readonly LBRACK = 133; + public static readonly RBRACK = 134; + public static readonly LPAREN = 135; + public static readonly RPAREN = 136; + public static readonly LT = 137; + public static readonly GT = 138; + public static readonly AMP = 139; + public static readonly EQUAL = 140; + public static readonly INTEGER = 141; + public static readonly JSON_NUMBER = 142; + public static readonly IDENTIFIER = 143; + public static readonly STRING_LITERAL = 144; + public static readonly LINE_COMMENT = 145; + public static readonly BLOCK_COMMENT = 146; + public static readonly WS = 147; public static readonly channelNames = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" @@ -167,9 +168,9 @@ export class QuixosCapabilityLexer extends antlr.Lexer { "'value'", "'relation'", "'operation'", "'function'", "'constructor'", "'constructs'", "'input'", "'conform'", "'as'", "'bind'", "'static'", "'to'", "'private'", "'shared'", "'state'", "'edge'", "'projection'", - "'with'", "'using'", "'via'", "'materialize'", "'if'", "'absent'", - "'on'", "'policy'", "'default'", "'source'", "'repository'", "'commit'", - "'revision'", "'semantic-major'", "'on-delete'", "'retain-other'", + "'with'", "'using'", "'accept'", "'via'", "'materialize'", "'if'", + "'absent'", "'on'", "'policy'", "'default'", "'source'", "'repository'", + "'commit'", "'revision'", "'semantic-major'", "'on-delete'", "'retain-other'", "'keyed'", "'public-traversal'", "'id'", "'doc'", "'mode'", "'emits'", "'receiver'", "'requires'", "'any'", "'get'", "'set'", "'watch'", "'start'", "'stop'", "'read'", "'write'", "'resolve'", "'connect'", @@ -193,20 +194,21 @@ export class QuixosCapabilityLexer extends antlr.Lexer { "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", "PRIVATE", "SHARED", - "STATE", "EDGE", "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", - "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", - "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", "RETAIN_OTHER", - "KEYED", "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", "EMITS", "RECEIVER", - "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", - "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", - "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", - "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", - "MESSAGE", "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", - "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", - "UINT64", "TRUE", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", - "DOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", - "LT", "GT", "AMP", "EQUAL", "INTEGER", "JSON_NUMBER", "IDENTIFIER", - "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", "WS" + "STATE", "EDGE", "PROJECTION", "WITH", "USING", "ACCEPT", "VIA", + "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", + "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", + "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", + "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", + "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", + "WATCH_START", "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "REGISTER", + "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", + "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", + "OPTIONAL", "LIST", "RECORD", "BOOL", "BYTES", "DOUBLE", "INT32", + "INT64", "STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", + "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", + "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "AMP", "EQUAL", "INTEGER", + "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", + "WS" ]; public static readonly modeNames = [ @@ -223,8 +225,8 @@ export class QuixosCapabilityLexer extends antlr.Lexer { "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", - "USING", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", - "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", + "USING", "ACCEPT", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", + "DEFAULT", "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", @@ -258,7 +260,7 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public get modeNames(): string[] { return QuixosCapabilityLexer.modeNames; } public static readonly _serializedATN: number[] = [ - 4,0,146,1397,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, + 4,0,147,1406,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, @@ -282,495 +284,498 @@ export class QuixosCapabilityLexer extends antlr.Lexer { 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,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1, - 3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1, - 5,1,5,1,5,1,5,1,5,1,5,1,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,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1, - 8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10, - 1,10,1,10,1,10,1,10,1,11,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,13,1,13,1,13,1,13,1,13, - 1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,15, - 1,15,1,15,1,15,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,17,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,18,1,18,1,18, - 1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20, - 1,20,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,22,1,22, - 1,22,1,22,1,22,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24,1,24, - 1,25,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,26,1,26,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,28,1,28,1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,29,1,30,1,30, - 1,30,1,30,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,32,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,34,1,34,1,34,1,34,1,35, - 1,35,1,35,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,36,1,36,1,36,1,36, - 1,36,1,36,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,38,1,38,1,38,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39, - 1,39,1,39,1,40,1,40,1,40,1,40,1,40,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,42,1,42,1,42,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,44,1,44,1,44,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,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,46,1,47,1,47,1,47,1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,48, - 1,48,1,48,1,48,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1,50,1,51,1,51, - 1,51,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,1,53,1,53,1,54,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,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,57,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,59,1,59, - 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,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,63,1,63,1,63,1,63,1,64,1,64,1,64,1,65,1,65,1,65,1,65,1,65,1,65, - 1,65,1,66,1,66,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,67,1,68,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,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,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,72,1,72,1,73,1,73,1,73,1,73,1,73,1,73,1,73,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,75,1,75,1,75,1,75, - 1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75, - 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,80,1,80,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,81,1,81,1,82,1,82,1,82, - 1,82,1,83,1,83,1,83,1,83,1,84,1,84,1,84,1,84,1,85,1,85,1,85,1,85, - 1,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,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,91,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,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,94,1,94,1,94,1,95,1,95,1,95,1,95,1,95,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,96,1,96,1,96,1,96,1,97,1,97, - 1,97,1,97,1,97,1,97,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,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,100,1,100,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,101,1,101,1,101,1,101, - 1,101,1,102,1,102,1,102,1,102,1,102,1,102,1,102,1,102,1,102,1,102, - 1,102,1,102,1,103,1,103,1,103,1,103,1,103,1,104,1,104,1,104,1,104, - 1,104,1,104,1,104,1,104,1,105,1,105,1,105,1,105,1,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,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,108,1,108,1,108, + 7,147,2,148,7,148,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1, + 3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1, + 4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,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,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1, + 8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1, + 10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,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,13,1,13,1, + 13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1, + 14,1,14,1,15,1,15,1,15,1,15,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,17,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, + 18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1, + 21,1,22,1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1, + 24,1,24,1,24,1,25,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,26,1,26,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,28,1,28,1,28,1,28,1,28,1,29,1,29,1,29,1,29,1, + 29,1,30,1,30,1,30,1,30,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,32,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,34,1,34,1, + 34,1,34,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,36,1, + 36,1,36,1,36,1,36,1,36,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,38,1,38,1,38,1,39,1,39,1,39,1,39,1,39,1,39,1, + 39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,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,42,1,42,1,42,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,44,1, + 44,1,44,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,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,46,1,47,1,47,1,47,1,47,1,47,1,47,1,48,1,48,1, + 48,1,48,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1, + 50,1,51,1,51,1,51,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,1,53,1,53,1,54,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,56,1,56,1,56,1,56,1,56,1,57,1,57,1, + 57,1,57,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,59,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60,1,60,1,60,1, + 60,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1, + 62,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, + 64,1,65,1,65,1,65,1,66,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,67,1,67,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,69,1,69,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,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,73,1,73,1,73,1,73,1, + 74,1,74,1,74,1,74,1,74,1,74,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, + 76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,77,1,77,1,77,1, + 78,1,78,1,78,1,78,1,79,1,79,1,79,1,79,1,79,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,81,1,81,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,84,1,84,1, + 84,1,84,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,87,1,88,1,88,1,88,1,88,1,88,1,89,1,89,1,89,1, + 89,1,89,1,90,1,90,1,90,1,90,1,90,1,90,1,91,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,93,1,93,1, + 93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,94,1,94,1,94,1,94,1, + 94,1,95,1,95,1,95,1,95,1,95,1,95,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,96,1,96,1,96,1,96,1,96,1,97,1,97,1, + 97,1,97,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,98,1,98,1,98,1,98,1,98,1,98,1,99,1,99,1,99,1,99,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,101,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,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,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,106,1,106,1,106,1,106,1,106,1,107,1,107,1,107,1,107, + 1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,108,1,108, 1,108,1,108,1,108,1,108,1,108,1,108,1,109,1,109,1,109,1,109,1,109, - 1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,110,1,110, + 1,109,1,109,1,109,1,109,1,110,1,110,1,110,1,110,1,110,1,110,1,110, 1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,111,1,111,1,111,1,111, - 1,111,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,113,1,113,1,113, - 1,113,1,113,1,114,1,114,1,114,1,114,1,114,1,114,1,115,1,115,1,115, - 1,115,1,115,1,115,1,115,1,116,1,116,1,116,1,116,1,116,1,116,1,117, - 1,117,1,117,1,117,1,117,1,117,1,118,1,118,1,118,1,118,1,118,1,118, - 1,118,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,120,1,120,1,120, - 1,120,1,120,1,120,1,120,1,121,1,121,1,121,1,121,1,121,1,122,1,122, - 1,122,1,122,1,122,1,122,1,123,1,123,1,123,1,123,1,123,1,124,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,3,139,1298,8,139, - 1,139,4,139,1301,8,139,11,139,12,139,1302,1,140,3,140,1306,8,140, - 1,140,1,140,1,140,5,140,1311,8,140,10,140,12,140,1314,9,140,3,140, - 1316,8,140,1,140,1,140,4,140,1320,8,140,11,140,12,140,1321,3,140, - 1324,8,140,1,140,1,140,3,140,1328,8,140,1,140,4,140,1331,8,140,11, - 140,12,140,1332,3,140,1335,8,140,1,141,1,141,5,141,1339,8,141,10, - 141,12,141,1342,9,141,1,142,1,142,1,142,5,142,1347,8,142,10,142, - 12,142,1350,9,142,1,142,1,142,1,143,1,143,1,143,1,143,1,143,1,143, - 1,143,1,143,3,143,1362,8,143,1,144,1,144,1,145,1,145,1,145,1,145, - 5,145,1370,8,145,10,145,12,145,1373,9,145,1,145,1,145,1,146,1,146, - 1,146,1,146,5,146,1381,8,146,10,146,12,146,1384,9,146,1,146,1,146, - 1,146,1,146,1,146,1,147,4,147,1392,8,147,11,147,12,147,1393,1,147, - 1,147,1,1382,0,148,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10, - 21,11,23,12,25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21, - 43,22,45,23,47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32, - 65,33,67,34,69,35,71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43, - 87,44,89,45,91,46,93,47,95,48,97,49,99,50,101,51,103,52,105,53,107, - 54,109,55,111,56,113,57,115,58,117,59,119,60,121,61,123,62,125,63, - 127,64,129,65,131,66,133,67,135,68,137,69,139,70,141,71,143,72,145, - 73,147,74,149,75,151,76,153,77,155,78,157,79,159,80,161,81,163,82, - 165,83,167,84,169,85,171,86,173,87,175,88,177,89,179,90,181,91,183, - 92,185,93,187,94,189,95,191,96,193,97,195,98,197,99,199,100,201, - 101,203,102,205,103,207,104,209,105,211,106,213,107,215,108,217, - 109,219,110,221,111,223,112,225,113,227,114,229,115,231,116,233, - 117,235,118,237,119,239,120,241,121,243,122,245,123,247,124,249, - 125,251,126,253,127,255,128,257,129,259,130,261,131,263,132,265, - 133,267,134,269,135,271,136,273,137,275,138,277,139,279,140,281, - 141,283,142,285,143,287,0,289,0,291,144,293,145,295,146,1,0,11,1, - 0,48,57,1,0,49,57,2,0,69,69,101,101,2,0,43,43,45,45,3,0,65,90,95, - 95,97,122,4,0,48,57,65,90,95,95,97,122,4,0,10,10,13,13,34,34,92, - 92,8,0,34,34,47,47,92,92,98,98,102,102,110,110,114,114,116,116,3, - 0,48,57,65,70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32,32,1411,0, - 1,1,0,0,0,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,229,1,0, - 0,0,0,231,1,0,0,0,0,233,1,0,0,0,0,235,1,0,0,0,0,237,1,0,0,0,0,239, - 1,0,0,0,0,241,1,0,0,0,0,243,1,0,0,0,0,245,1,0,0,0,0,247,1,0,0,0, - 0,249,1,0,0,0,0,251,1,0,0,0,0,253,1,0,0,0,0,255,1,0,0,0,0,257,1, - 0,0,0,0,259,1,0,0,0,0,261,1,0,0,0,0,263,1,0,0,0,0,265,1,0,0,0,0, - 267,1,0,0,0,0,269,1,0,0,0,0,271,1,0,0,0,0,273,1,0,0,0,0,275,1,0, - 0,0,0,277,1,0,0,0,0,279,1,0,0,0,0,281,1,0,0,0,0,283,1,0,0,0,0,285, - 1,0,0,0,0,291,1,0,0,0,0,293,1,0,0,0,0,295,1,0,0,0,1,297,1,0,0,0, - 3,302,1,0,0,0,5,311,1,0,0,0,7,322,1,0,0,0,9,332,1,0,0,0,11,342,1, - 0,0,0,13,351,1,0,0,0,15,363,1,0,0,0,17,370,1,0,0,0,19,378,1,0,0, - 0,21,387,1,0,0,0,23,395,1,0,0,0,25,401,1,0,0,0,27,406,1,0,0,0,29, - 419,1,0,0,0,31,429,1,0,0,0,33,441,1,0,0,0,35,447,1,0,0,0,37,458, - 1,0,0,0,39,469,1,0,0,0,41,474,1,0,0,0,43,483,1,0,0,0,45,493,1,0, - 0,0,47,498,1,0,0,0,49,502,1,0,0,0,51,508,1,0,0,0,53,513,1,0,0,0, - 55,523,1,0,0,0,57,527,1,0,0,0,59,540,1,0,0,0,61,545,1,0,0,0,63,552, - 1,0,0,0,65,561,1,0,0,0,67,572,1,0,0,0,69,576,1,0,0,0,71,585,1,0, - 0,0,73,592,1,0,0,0,75,601,1,0,0,0,77,606,1,0,0,0,79,616,1,0,0,0, - 81,627,1,0,0,0,83,635,1,0,0,0,85,641,1,0,0,0,87,650,1,0,0,0,89,660, - 1,0,0,0,91,669,1,0,0,0,93,681,1,0,0,0,95,692,1,0,0,0,97,698,1,0, - 0,0,99,706,1,0,0,0,101,709,1,0,0,0,103,714,1,0,0,0,105,721,1,0,0, - 0,107,724,1,0,0,0,109,732,1,0,0,0,111,739,1,0,0,0,113,745,1,0,0, - 0,115,750,1,0,0,0,117,761,1,0,0,0,119,766,1,0,0,0,121,772,1,0,0, - 0,123,776,1,0,0,0,125,788,1,0,0,0,127,791,1,0,0,0,129,798,1,0,0, - 0,131,801,1,0,0,0,133,808,1,0,0,0,135,816,1,0,0,0,137,823,1,0,0, - 0,139,834,1,0,0,0,141,841,1,0,0,0,143,850,1,0,0,0,145,865,1,0,0, - 0,147,875,1,0,0,0,149,888,1,0,0,0,151,894,1,0,0,0,153,911,1,0,0, - 0,155,914,1,0,0,0,157,918,1,0,0,0,159,923,1,0,0,0,161,929,1,0,0, - 0,163,938,1,0,0,0,165,947,1,0,0,0,167,951,1,0,0,0,169,955,1,0,0, - 0,171,959,1,0,0,0,173,965,1,0,0,0,175,971,1,0,0,0,177,976,1,0,0, - 0,179,981,1,0,0,0,181,987,1,0,0,0,183,995,1,0,0,0,185,1003,1,0,0, - 0,187,1014,1,0,0,0,189,1019,1,0,0,0,191,1031,1,0,0,0,193,1042,1, - 0,0,0,195,1052,1,0,0,0,197,1064,1,0,0,0,199,1073,1,0,0,0,201,1078, - 1,0,0,0,203,1091,1,0,0,0,205,1103,1,0,0,0,207,1115,1,0,0,0,209,1120, - 1,0,0,0,211,1128,1,0,0,0,213,1133,1,0,0,0,215,1146,1,0,0,0,217,1154, - 1,0,0,0,219,1163,1,0,0,0,221,1177,1,0,0,0,223,1186,1,0,0,0,225,1191, - 1,0,0,0,227,1198,1,0,0,0,229,1203,1,0,0,0,231,1209,1,0,0,0,233,1216, - 1,0,0,0,235,1222,1,0,0,0,237,1228,1,0,0,0,239,1235,1,0,0,0,241,1242, - 1,0,0,0,243,1249,1,0,0,0,245,1254,1,0,0,0,247,1260,1,0,0,0,249,1265, - 1,0,0,0,251,1268,1,0,0,0,253,1270,1,0,0,0,255,1272,1,0,0,0,257,1274, - 1,0,0,0,259,1276,1,0,0,0,261,1278,1,0,0,0,263,1280,1,0,0,0,265,1282, - 1,0,0,0,267,1284,1,0,0,0,269,1286,1,0,0,0,271,1288,1,0,0,0,273,1290, - 1,0,0,0,275,1292,1,0,0,0,277,1294,1,0,0,0,279,1297,1,0,0,0,281,1305, - 1,0,0,0,283,1336,1,0,0,0,285,1343,1,0,0,0,287,1353,1,0,0,0,289,1363, - 1,0,0,0,291,1365,1,0,0,0,293,1376,1,0,0,0,295,1391,1,0,0,0,297,298, - 5,101,0,0,298,299,5,100,0,0,299,300,5,105,0,0,300,301,5,116,0,0, - 301,2,1,0,0,0,302,303,5,99,0,0,303,304,5,114,0,0,304,305,5,101,0, - 0,305,306,5,97,0,0,306,307,5,116,0,0,307,308,5,105,0,0,308,309,5, - 111,0,0,309,310,5,110,0,0,310,4,1,0,0,0,311,312,5,105,0,0,312,313, - 5,110,0,0,313,314,5,105,0,0,314,315,5,116,0,0,315,316,5,105,0,0, - 316,317,5,97,0,0,317,318,5,108,0,0,318,319,5,105,0,0,319,320,5,122, - 0,0,320,321,5,101,0,0,321,6,1,0,0,0,322,323,5,119,0,0,323,324,5, - 111,0,0,324,325,5,114,0,0,325,326,5,107,0,0,326,327,5,115,0,0,327, - 328,5,112,0,0,328,329,5,97,0,0,329,330,5,99,0,0,330,331,5,101,0, - 0,331,8,1,0,0,0,332,333,5,101,0,0,333,334,5,120,0,0,334,335,5,101, - 0,0,335,336,5,99,0,0,336,337,5,117,0,0,337,338,5,116,0,0,338,339, - 5,105,0,0,339,340,5,111,0,0,340,341,5,110,0,0,341,10,1,0,0,0,342, - 343,5,115,0,0,343,344,5,110,0,0,344,345,5,97,0,0,345,346,5,112,0, - 0,346,347,5,115,0,0,347,348,5,104,0,0,348,349,5,111,0,0,349,350, - 5,116,0,0,350,12,1,0,0,0,351,352,5,116,0,0,352,353,5,114,0,0,353, - 354,5,97,0,0,354,355,5,110,0,0,355,356,5,115,0,0,356,357,5,97,0, - 0,357,358,5,99,0,0,358,359,5,116,0,0,359,360,5,105,0,0,360,361,5, - 111,0,0,361,362,5,110,0,0,362,14,1,0,0,0,363,364,5,114,0,0,364,365, - 5,101,0,0,365,366,5,109,0,0,366,367,5,111,0,0,367,368,5,116,0,0, - 368,369,5,101,0,0,369,16,1,0,0,0,370,371,5,116,0,0,371,372,5,97, - 0,0,372,373,5,114,0,0,373,374,5,103,0,0,374,375,5,101,0,0,375,376, - 5,116,0,0,376,377,5,115,0,0,377,18,1,0,0,0,378,379,5,112,0,0,379, - 380,5,111,0,0,380,381,5,114,0,0,381,382,5,116,0,0,382,383,5,97,0, - 0,383,384,5,98,0,0,384,385,5,108,0,0,385,386,5,101,0,0,386,20,1, - 0,0,0,387,388,5,114,0,0,388,389,5,101,0,0,389,390,5,112,0,0,390, - 391,5,108,0,0,391,392,5,105,0,0,392,393,5,99,0,0,393,394,5,97,0, - 0,394,22,1,0,0,0,395,396,5,108,0,0,396,397,5,111,0,0,397,398,5,99, - 0,0,398,399,5,97,0,0,399,400,5,108,0,0,400,24,1,0,0,0,401,402,5, - 102,0,0,402,403,5,114,0,0,403,404,5,111,0,0,404,405,5,109,0,0,405, - 26,1,0,0,0,406,407,5,114,0,0,407,408,5,101,0,0,408,409,5,115,0,0, - 409,410,5,117,0,0,410,411,5,108,0,0,411,412,5,116,0,0,412,413,5, - 45,0,0,413,414,5,98,0,0,414,415,5,121,0,0,415,416,5,116,0,0,416, - 417,5,101,0,0,417,418,5,115,0,0,418,28,1,0,0,0,419,420,5,114,0,0, - 420,421,5,112,0,0,421,422,5,99,0,0,422,423,5,45,0,0,423,424,5,99, - 0,0,424,425,5,97,0,0,425,426,5,108,0,0,426,427,5,108,0,0,427,428, - 5,115,0,0,428,30,1,0,0,0,429,430,5,100,0,0,430,431,5,101,0,0,431, - 432,5,97,0,0,432,433,5,100,0,0,433,434,5,108,0,0,434,435,5,105,0, - 0,435,436,5,110,0,0,436,437,5,101,0,0,437,438,5,45,0,0,438,439,5, - 109,0,0,439,440,5,115,0,0,440,32,1,0,0,0,441,442,5,113,0,0,442,443, - 5,117,0,0,443,444,5,101,0,0,444,445,5,114,0,0,445,446,5,121,0,0, - 446,34,1,0,0,0,447,448,5,114,0,0,448,449,5,101,0,0,449,450,5,102, - 0,0,450,451,5,108,0,0,451,452,5,101,0,0,452,453,5,99,0,0,453,454, - 5,116,0,0,454,455,5,105,0,0,455,456,5,111,0,0,456,457,5,110,0,0, - 457,36,1,0,0,0,458,459,5,115,0,0,459,460,5,112,0,0,460,461,5,101, - 0,0,461,462,5,99,0,0,462,463,5,105,0,0,463,464,5,97,0,0,464,465, - 5,108,0,0,465,466,5,105,0,0,466,467,5,122,0,0,467,468,5,101,0,0, - 468,38,1,0,0,0,469,470,5,114,0,0,470,471,5,111,0,0,471,472,5,111, - 0,0,472,473,5,116,0,0,473,40,1,0,0,0,474,475,5,100,0,0,475,476,5, - 111,0,0,476,477,5,99,0,0,477,478,5,117,0,0,478,479,5,109,0,0,479, - 480,5,101,0,0,480,481,5,110,0,0,481,482,5,116,0,0,482,42,1,0,0,0, - 483,484,5,102,0,0,484,485,5,114,0,0,485,486,5,97,0,0,486,487,5,103, - 0,0,487,488,5,109,0,0,488,489,5,101,0,0,489,490,5,110,0,0,490,491, - 5,116,0,0,491,492,5,115,0,0,492,44,1,0,0,0,493,494,5,118,0,0,494, - 495,5,105,0,0,495,496,5,101,0,0,496,497,5,119,0,0,497,46,1,0,0,0, - 498,499,5,109,0,0,499,500,5,97,0,0,500,501,5,120,0,0,501,48,1,0, - 0,0,502,503,5,97,0,0,503,504,5,108,0,0,504,505,5,108,0,0,505,506, - 5,111,0,0,506,507,5,119,0,0,507,50,1,0,0,0,508,509,5,112,0,0,509, - 510,5,111,0,0,510,511,5,108,0,0,511,512,5,108,0,0,512,52,1,0,0,0, - 513,514,5,113,0,0,514,515,5,117,0,0,515,516,5,101,0,0,516,517,5, - 114,0,0,517,518,5,121,0,0,518,519,5,97,0,0,519,520,5,98,0,0,520, - 521,5,108,0,0,521,522,5,101,0,0,522,54,1,0,0,0,523,524,5,114,0,0, - 524,525,5,112,0,0,525,526,5,99,0,0,526,56,1,0,0,0,527,528,5,113, - 0,0,528,529,5,117,0,0,529,530,5,101,0,0,530,531,5,114,0,0,531,532, - 5,121,0,0,532,533,5,45,0,0,533,534,5,114,0,0,534,535,5,101,0,0,535, - 536,5,97,0,0,536,537,5,115,0,0,537,538,5,111,0,0,538,539,5,110,0, - 0,539,58,1,0,0,0,540,541,5,116,0,0,541,542,5,121,0,0,542,543,5,112, - 0,0,543,544,5,101,0,0,544,60,1,0,0,0,545,546,5,111,0,0,546,547,5, - 98,0,0,547,548,5,106,0,0,548,549,5,101,0,0,549,550,5,99,0,0,550, - 551,5,116,0,0,551,62,1,0,0,0,552,553,5,115,0,0,553,554,5,116,0,0, - 554,555,5,111,0,0,555,556,5,114,0,0,556,557,5,97,0,0,557,558,5,98, - 0,0,558,559,5,108,0,0,559,560,5,101,0,0,560,64,1,0,0,0,561,562,5, - 105,0,0,562,563,5,109,0,0,563,564,5,112,0,0,564,565,5,108,0,0,565, - 566,5,101,0,0,566,567,5,109,0,0,567,568,5,101,0,0,568,569,5,110, - 0,0,569,570,5,116,0,0,570,571,5,115,0,0,571,66,1,0,0,0,572,573,5, - 114,0,0,573,574,5,101,0,0,574,575,5,102,0,0,575,68,1,0,0,0,576,577, - 5,102,0,0,577,578,5,114,0,0,578,579,5,97,0,0,579,580,5,103,0,0,580, - 581,5,109,0,0,581,582,5,101,0,0,582,583,5,110,0,0,583,584,5,116, - 0,0,584,70,1,0,0,0,585,586,5,105,0,0,586,587,5,109,0,0,587,588,5, - 112,0,0,588,589,5,111,0,0,589,590,5,114,0,0,590,591,5,116,0,0,591, - 72,1,0,0,0,592,593,5,101,0,0,593,594,5,120,0,0,594,595,5,116,0,0, - 595,596,5,101,0,0,596,597,5,114,0,0,597,598,5,110,0,0,598,599,5, - 97,0,0,599,600,5,108,0,0,600,74,1,0,0,0,601,602,5,97,0,0,602,603, - 5,116,0,0,603,604,5,111,0,0,604,605,5,109,0,0,605,76,1,0,0,0,606, - 607,5,105,0,0,607,608,5,110,0,0,608,609,5,116,0,0,609,610,5,101, - 0,0,610,611,5,114,0,0,611,612,5,102,0,0,612,613,5,97,0,0,613,614, - 5,99,0,0,614,615,5,101,0,0,615,78,1,0,0,0,616,617,5,105,0,0,617, - 618,5,110,0,0,618,619,5,116,0,0,619,620,5,101,0,0,620,621,5,114, - 0,0,621,622,5,102,0,0,622,623,5,97,0,0,623,624,5,99,0,0,624,625, - 5,101,0,0,625,626,5,115,0,0,626,80,1,0,0,0,627,628,5,112,0,0,628, - 629,5,97,0,0,629,630,5,99,0,0,630,631,5,107,0,0,631,632,5,97,0,0, - 632,633,5,103,0,0,633,634,5,101,0,0,634,82,1,0,0,0,635,636,5,118, - 0,0,636,637,5,97,0,0,637,638,5,108,0,0,638,639,5,117,0,0,639,640, - 5,101,0,0,640,84,1,0,0,0,641,642,5,114,0,0,642,643,5,101,0,0,643, - 644,5,108,0,0,644,645,5,97,0,0,645,646,5,116,0,0,646,647,5,105,0, - 0,647,648,5,111,0,0,648,649,5,110,0,0,649,86,1,0,0,0,650,651,5,111, - 0,0,651,652,5,112,0,0,652,653,5,101,0,0,653,654,5,114,0,0,654,655, - 5,97,0,0,655,656,5,116,0,0,656,657,5,105,0,0,657,658,5,111,0,0,658, - 659,5,110,0,0,659,88,1,0,0,0,660,661,5,102,0,0,661,662,5,117,0,0, - 662,663,5,110,0,0,663,664,5,99,0,0,664,665,5,116,0,0,665,666,5,105, - 0,0,666,667,5,111,0,0,667,668,5,110,0,0,668,90,1,0,0,0,669,670,5, - 99,0,0,670,671,5,111,0,0,671,672,5,110,0,0,672,673,5,115,0,0,673, - 674,5,116,0,0,674,675,5,114,0,0,675,676,5,117,0,0,676,677,5,99,0, - 0,677,678,5,116,0,0,678,679,5,111,0,0,679,680,5,114,0,0,680,92,1, - 0,0,0,681,682,5,99,0,0,682,683,5,111,0,0,683,684,5,110,0,0,684,685, - 5,115,0,0,685,686,5,116,0,0,686,687,5,114,0,0,687,688,5,117,0,0, - 688,689,5,99,0,0,689,690,5,116,0,0,690,691,5,115,0,0,691,94,1,0, - 0,0,692,693,5,105,0,0,693,694,5,110,0,0,694,695,5,112,0,0,695,696, - 5,117,0,0,696,697,5,116,0,0,697,96,1,0,0,0,698,699,5,99,0,0,699, - 700,5,111,0,0,700,701,5,110,0,0,701,702,5,102,0,0,702,703,5,111, - 0,0,703,704,5,114,0,0,704,705,5,109,0,0,705,98,1,0,0,0,706,707,5, - 97,0,0,707,708,5,115,0,0,708,100,1,0,0,0,709,710,5,98,0,0,710,711, - 5,105,0,0,711,712,5,110,0,0,712,713,5,100,0,0,713,102,1,0,0,0,714, - 715,5,115,0,0,715,716,5,116,0,0,716,717,5,97,0,0,717,718,5,116,0, - 0,718,719,5,105,0,0,719,720,5,99,0,0,720,104,1,0,0,0,721,722,5,116, - 0,0,722,723,5,111,0,0,723,106,1,0,0,0,724,725,5,112,0,0,725,726, - 5,114,0,0,726,727,5,105,0,0,727,728,5,118,0,0,728,729,5,97,0,0,729, - 730,5,116,0,0,730,731,5,101,0,0,731,108,1,0,0,0,732,733,5,115,0, - 0,733,734,5,104,0,0,734,735,5,97,0,0,735,736,5,114,0,0,736,737,5, - 101,0,0,737,738,5,100,0,0,738,110,1,0,0,0,739,740,5,115,0,0,740, - 741,5,116,0,0,741,742,5,97,0,0,742,743,5,116,0,0,743,744,5,101,0, - 0,744,112,1,0,0,0,745,746,5,101,0,0,746,747,5,100,0,0,747,748,5, - 103,0,0,748,749,5,101,0,0,749,114,1,0,0,0,750,751,5,112,0,0,751, - 752,5,114,0,0,752,753,5,111,0,0,753,754,5,106,0,0,754,755,5,101, - 0,0,755,756,5,99,0,0,756,757,5,116,0,0,757,758,5,105,0,0,758,759, - 5,111,0,0,759,760,5,110,0,0,760,116,1,0,0,0,761,762,5,119,0,0,762, - 763,5,105,0,0,763,764,5,116,0,0,764,765,5,104,0,0,765,118,1,0,0, - 0,766,767,5,117,0,0,767,768,5,115,0,0,768,769,5,105,0,0,769,770, - 5,110,0,0,770,771,5,103,0,0,771,120,1,0,0,0,772,773,5,118,0,0,773, - 774,5,105,0,0,774,775,5,97,0,0,775,122,1,0,0,0,776,777,5,109,0,0, - 777,778,5,97,0,0,778,779,5,116,0,0,779,780,5,101,0,0,780,781,5,114, - 0,0,781,782,5,105,0,0,782,783,5,97,0,0,783,784,5,108,0,0,784,785, - 5,105,0,0,785,786,5,122,0,0,786,787,5,101,0,0,787,124,1,0,0,0,788, - 789,5,105,0,0,789,790,5,102,0,0,790,126,1,0,0,0,791,792,5,97,0,0, - 792,793,5,98,0,0,793,794,5,115,0,0,794,795,5,101,0,0,795,796,5,110, - 0,0,796,797,5,116,0,0,797,128,1,0,0,0,798,799,5,111,0,0,799,800, - 5,110,0,0,800,130,1,0,0,0,801,802,5,112,0,0,802,803,5,111,0,0,803, - 804,5,108,0,0,804,805,5,105,0,0,805,806,5,99,0,0,806,807,5,121,0, - 0,807,132,1,0,0,0,808,809,5,100,0,0,809,810,5,101,0,0,810,811,5, - 102,0,0,811,812,5,97,0,0,812,813,5,117,0,0,813,814,5,108,0,0,814, - 815,5,116,0,0,815,134,1,0,0,0,816,817,5,115,0,0,817,818,5,111,0, - 0,818,819,5,117,0,0,819,820,5,114,0,0,820,821,5,99,0,0,821,822,5, - 101,0,0,822,136,1,0,0,0,823,824,5,114,0,0,824,825,5,101,0,0,825, - 826,5,112,0,0,826,827,5,111,0,0,827,828,5,115,0,0,828,829,5,105, - 0,0,829,830,5,116,0,0,830,831,5,111,0,0,831,832,5,114,0,0,832,833, - 5,121,0,0,833,138,1,0,0,0,834,835,5,99,0,0,835,836,5,111,0,0,836, - 837,5,109,0,0,837,838,5,109,0,0,838,839,5,105,0,0,839,840,5,116, - 0,0,840,140,1,0,0,0,841,842,5,114,0,0,842,843,5,101,0,0,843,844, - 5,118,0,0,844,845,5,105,0,0,845,846,5,115,0,0,846,847,5,105,0,0, - 847,848,5,111,0,0,848,849,5,110,0,0,849,142,1,0,0,0,850,851,5,115, - 0,0,851,852,5,101,0,0,852,853,5,109,0,0,853,854,5,97,0,0,854,855, - 5,110,0,0,855,856,5,116,0,0,856,857,5,105,0,0,857,858,5,99,0,0,858, - 859,5,45,0,0,859,860,5,109,0,0,860,861,5,97,0,0,861,862,5,106,0, - 0,862,863,5,111,0,0,863,864,5,114,0,0,864,144,1,0,0,0,865,866,5, - 111,0,0,866,867,5,110,0,0,867,868,5,45,0,0,868,869,5,100,0,0,869, - 870,5,101,0,0,870,871,5,108,0,0,871,872,5,101,0,0,872,873,5,116, - 0,0,873,874,5,101,0,0,874,146,1,0,0,0,875,876,5,114,0,0,876,877, - 5,101,0,0,877,878,5,116,0,0,878,879,5,97,0,0,879,880,5,105,0,0,880, - 881,5,110,0,0,881,882,5,45,0,0,882,883,5,111,0,0,883,884,5,116,0, - 0,884,885,5,104,0,0,885,886,5,101,0,0,886,887,5,114,0,0,887,148, - 1,0,0,0,888,889,5,107,0,0,889,890,5,101,0,0,890,891,5,121,0,0,891, - 892,5,101,0,0,892,893,5,100,0,0,893,150,1,0,0,0,894,895,5,112,0, - 0,895,896,5,117,0,0,896,897,5,98,0,0,897,898,5,108,0,0,898,899,5, - 105,0,0,899,900,5,99,0,0,900,901,5,45,0,0,901,902,5,116,0,0,902, - 903,5,114,0,0,903,904,5,97,0,0,904,905,5,118,0,0,905,906,5,101,0, - 0,906,907,5,114,0,0,907,908,5,115,0,0,908,909,5,97,0,0,909,910,5, - 108,0,0,910,152,1,0,0,0,911,912,5,105,0,0,912,913,5,100,0,0,913, - 154,1,0,0,0,914,915,5,100,0,0,915,916,5,111,0,0,916,917,5,99,0,0, - 917,156,1,0,0,0,918,919,5,109,0,0,919,920,5,111,0,0,920,921,5,100, - 0,0,921,922,5,101,0,0,922,158,1,0,0,0,923,924,5,101,0,0,924,925, - 5,109,0,0,925,926,5,105,0,0,926,927,5,116,0,0,927,928,5,115,0,0, - 928,160,1,0,0,0,929,930,5,114,0,0,930,931,5,101,0,0,931,932,5,99, - 0,0,932,933,5,101,0,0,933,934,5,105,0,0,934,935,5,118,0,0,935,936, - 5,101,0,0,936,937,5,114,0,0,937,162,1,0,0,0,938,939,5,114,0,0,939, - 940,5,101,0,0,940,941,5,113,0,0,941,942,5,117,0,0,942,943,5,105, - 0,0,943,944,5,114,0,0,944,945,5,101,0,0,945,946,5,115,0,0,946,164, - 1,0,0,0,947,948,5,97,0,0,948,949,5,110,0,0,949,950,5,121,0,0,950, - 166,1,0,0,0,951,952,5,103,0,0,952,953,5,101,0,0,953,954,5,116,0, - 0,954,168,1,0,0,0,955,956,5,115,0,0,956,957,5,101,0,0,957,958,5, - 116,0,0,958,170,1,0,0,0,959,960,5,119,0,0,960,961,5,97,0,0,961,962, - 5,116,0,0,962,963,5,99,0,0,963,964,5,104,0,0,964,172,1,0,0,0,965, - 966,5,115,0,0,966,967,5,116,0,0,967,968,5,97,0,0,968,969,5,114,0, - 0,969,970,5,116,0,0,970,174,1,0,0,0,971,972,5,115,0,0,972,973,5, - 116,0,0,973,974,5,111,0,0,974,975,5,112,0,0,975,176,1,0,0,0,976, - 977,5,114,0,0,977,978,5,101,0,0,978,979,5,97,0,0,979,980,5,100,0, - 0,980,178,1,0,0,0,981,982,5,119,0,0,982,983,5,114,0,0,983,984,5, - 105,0,0,984,985,5,116,0,0,985,986,5,101,0,0,986,180,1,0,0,0,987, - 988,5,114,0,0,988,989,5,101,0,0,989,990,5,115,0,0,990,991,5,111, - 0,0,991,992,5,108,0,0,992,993,5,118,0,0,993,994,5,101,0,0,994,182, - 1,0,0,0,995,996,5,99,0,0,996,997,5,111,0,0,997,998,5,110,0,0,998, - 999,5,110,0,0,999,1000,5,101,0,0,1000,1001,5,99,0,0,1001,1002,5, - 116,0,0,1002,184,1,0,0,0,1003,1004,5,100,0,0,1004,1005,5,105,0,0, - 1005,1006,5,115,0,0,1006,1007,5,99,0,0,1007,1008,5,111,0,0,1008, - 1009,5,110,0,0,1009,1010,5,110,0,0,1010,1011,5,101,0,0,1011,1012, - 5,99,0,0,1012,1013,5,116,0,0,1013,186,1,0,0,0,1014,1015,5,99,0,0, - 1015,1016,5,97,0,0,1016,1017,5,108,0,0,1017,1018,5,108,0,0,1018, - 188,1,0,0,0,1019,1020,5,119,0,0,1020,1021,5,97,0,0,1021,1022,5,116, - 0,0,1022,1023,5,99,0,0,1023,1024,5,104,0,0,1024,1025,5,45,0,0,1025, - 1026,5,115,0,0,1026,1027,5,116,0,0,1027,1028,5,97,0,0,1028,1029, - 5,114,0,0,1029,1030,5,116,0,0,1030,190,1,0,0,0,1031,1032,5,119,0, - 0,1032,1033,5,97,0,0,1033,1034,5,116,0,0,1034,1035,5,99,0,0,1035, - 1036,5,104,0,0,1036,1037,5,45,0,0,1037,1038,5,115,0,0,1038,1039, - 5,116,0,0,1039,1040,5,111,0,0,1040,1041,5,112,0,0,1041,192,1,0,0, - 0,1042,1043,5,115,0,0,1043,1044,5,117,0,0,1044,1045,5,98,0,0,1045, - 1046,5,115,0,0,1046,1047,5,99,0,0,1047,1048,5,114,0,0,1048,1049, - 5,105,0,0,1049,1050,5,98,0,0,1050,1051,5,101,0,0,1051,194,1,0,0, - 0,1052,1053,5,117,0,0,1053,1054,5,110,0,0,1054,1055,5,115,0,0,1055, - 1056,5,117,0,0,1056,1057,5,98,0,0,1057,1058,5,115,0,0,1058,1059, - 5,99,0,0,1059,1060,5,114,0,0,1060,1061,5,105,0,0,1061,1062,5,98, - 0,0,1062,1063,5,101,0,0,1063,196,1,0,0,0,1064,1065,5,114,0,0,1065, - 1066,5,101,0,0,1066,1067,5,103,0,0,1067,1068,5,105,0,0,1068,1069, - 5,115,0,0,1069,1070,5,116,0,0,1070,1071,5,101,0,0,1071,1072,5,114, - 0,0,1072,198,1,0,0,0,1073,1074,5,99,0,0,1074,1075,5,114,0,0,1075, - 1076,5,100,0,0,1076,1077,5,116,0,0,1077,200,1,0,0,0,1078,1079,5, - 111,0,0,1079,1080,5,112,0,0,1080,1081,5,116,0,0,1081,1082,5,105, - 0,0,1082,1083,5,111,0,0,1083,1084,5,110,0,0,1084,1085,5,97,0,0,1085, - 1086,5,108,0,0,1086,1087,5,45,0,0,1087,1088,5,111,0,0,1088,1089, - 5,110,0,0,1089,1090,5,101,0,0,1090,202,1,0,0,0,1091,1092,5,101,0, - 0,1092,1093,5,120,0,0,1093,1094,5,97,0,0,1094,1095,5,99,0,0,1095, - 1096,5,116,0,0,1096,1097,5,108,0,0,1097,1098,5,121,0,0,1098,1099, - 5,45,0,0,1099,1100,5,111,0,0,1100,1101,5,110,0,0,1101,1102,5,101, - 0,0,1102,204,1,0,0,0,1103,1104,5,109,0,0,1104,1105,5,97,0,0,1105, - 1106,5,110,0,0,1106,1107,5,121,0,0,1107,1108,5,45,0,0,1108,1109, - 5,117,0,0,1109,1110,5,110,0,0,1110,1111,5,105,0,0,1111,1112,5,113, - 0,0,1112,1113,5,117,0,0,1113,1114,5,101,0,0,1114,206,1,0,0,0,1115, - 1116,5,109,0,0,1116,1117,5,97,0,0,1117,1118,5,110,0,0,1118,1119, - 5,121,0,0,1119,208,1,0,0,0,1120,1121,5,111,0,0,1121,1122,5,114,0, - 0,1122,1123,5,100,0,0,1123,1124,5,101,0,0,1124,1125,5,114,0,0,1125, - 1126,5,101,0,0,1126,1127,5,100,0,0,1127,210,1,0,0,0,1128,1129,5, - 117,0,0,1129,1130,5,110,0,0,1130,1131,5,105,0,0,1131,1132,5,116, - 0,0,1132,212,1,0,0,0,1133,1134,5,119,0,0,1134,1135,5,97,0,0,1135, - 1136,5,116,0,0,1136,1137,5,99,0,0,1137,1138,5,104,0,0,1138,1139, - 5,45,0,0,1139,1140,5,104,0,0,1140,1141,5,97,0,0,1141,1142,5,110, - 0,0,1142,1143,5,100,0,0,1143,1144,5,108,0,0,1144,1145,5,101,0,0, - 1145,214,1,0,0,0,1146,1147,5,109,0,0,1147,1148,5,101,0,0,1148,1149, - 5,115,0,0,1149,1150,5,115,0,0,1150,1151,5,97,0,0,1151,1152,5,103, - 0,0,1152,1153,5,101,0,0,1153,216,1,0,0,0,1154,1155,5,97,0,0,1155, - 1156,5,116,0,0,1156,1157,5,111,0,0,1157,1158,5,109,0,0,1158,1159, - 5,45,0,0,1159,1160,5,114,0,0,1160,1161,5,101,0,0,1161,1162,5,102, - 0,0,1162,218,1,0,0,0,1163,1164,5,105,0,0,1164,1165,5,110,0,0,1165, - 1166,5,116,0,0,1166,1167,5,101,0,0,1167,1168,5,114,0,0,1168,1169, - 5,102,0,0,1169,1170,5,97,0,0,1170,1171,5,99,0,0,1171,1172,5,101, - 0,0,1172,1173,5,45,0,0,1173,1174,5,114,0,0,1174,1175,5,101,0,0,1175, - 1176,5,102,0,0,1176,220,1,0,0,0,1177,1178,5,111,0,0,1178,1179,5, - 112,0,0,1179,1180,5,116,0,0,1180,1181,5,105,0,0,1181,1182,5,111, - 0,0,1182,1183,5,110,0,0,1183,1184,5,97,0,0,1184,1185,5,108,0,0,1185, - 222,1,0,0,0,1186,1187,5,108,0,0,1187,1188,5,105,0,0,1188,1189,5, - 115,0,0,1189,1190,5,116,0,0,1190,224,1,0,0,0,1191,1192,5,114,0,0, - 1192,1193,5,101,0,0,1193,1194,5,99,0,0,1194,1195,5,111,0,0,1195, - 1196,5,114,0,0,1196,1197,5,100,0,0,1197,226,1,0,0,0,1198,1199,5, - 98,0,0,1199,1200,5,111,0,0,1200,1201,5,111,0,0,1201,1202,5,108,0, - 0,1202,228,1,0,0,0,1203,1204,5,98,0,0,1204,1205,5,121,0,0,1205,1206, - 5,116,0,0,1206,1207,5,101,0,0,1207,1208,5,115,0,0,1208,230,1,0,0, - 0,1209,1210,5,100,0,0,1210,1211,5,111,0,0,1211,1212,5,117,0,0,1212, - 1213,5,98,0,0,1213,1214,5,108,0,0,1214,1215,5,101,0,0,1215,232,1, - 0,0,0,1216,1217,5,105,0,0,1217,1218,5,110,0,0,1218,1219,5,116,0, - 0,1219,1220,5,51,0,0,1220,1221,5,50,0,0,1221,234,1,0,0,0,1222,1223, - 5,105,0,0,1223,1224,5,110,0,0,1224,1225,5,116,0,0,1225,1226,5,54, - 0,0,1226,1227,5,52,0,0,1227,236,1,0,0,0,1228,1229,5,115,0,0,1229, - 1230,5,116,0,0,1230,1231,5,114,0,0,1231,1232,5,105,0,0,1232,1233, - 5,110,0,0,1233,1234,5,103,0,0,1234,238,1,0,0,0,1235,1236,5,117,0, - 0,1236,1237,5,105,0,0,1237,1238,5,110,0,0,1238,1239,5,116,0,0,1239, - 1240,5,51,0,0,1240,1241,5,50,0,0,1241,240,1,0,0,0,1242,1243,5,117, - 0,0,1243,1244,5,105,0,0,1244,1245,5,110,0,0,1245,1246,5,116,0,0, - 1246,1247,5,54,0,0,1247,1248,5,52,0,0,1248,242,1,0,0,0,1249,1250, - 5,116,0,0,1250,1251,5,114,0,0,1251,1252,5,117,0,0,1252,1253,5,101, - 0,0,1253,244,1,0,0,0,1254,1255,5,102,0,0,1255,1256,5,97,0,0,1256, - 1257,5,108,0,0,1257,1258,5,115,0,0,1258,1259,5,101,0,0,1259,246, - 1,0,0,0,1260,1261,5,110,0,0,1261,1262,5,117,0,0,1262,1263,5,108, - 0,0,1263,1264,5,108,0,0,1264,248,1,0,0,0,1265,1266,5,45,0,0,1266, - 1267,5,62,0,0,1267,250,1,0,0,0,1268,1269,5,58,0,0,1269,252,1,0,0, - 0,1270,1271,5,59,0,0,1271,254,1,0,0,0,1272,1273,5,44,0,0,1273,256, - 1,0,0,0,1274,1275,5,46,0,0,1275,258,1,0,0,0,1276,1277,5,123,0,0, - 1277,260,1,0,0,0,1278,1279,5,125,0,0,1279,262,1,0,0,0,1280,1281, - 5,91,0,0,1281,264,1,0,0,0,1282,1283,5,93,0,0,1283,266,1,0,0,0,1284, - 1285,5,40,0,0,1285,268,1,0,0,0,1286,1287,5,41,0,0,1287,270,1,0,0, - 0,1288,1289,5,60,0,0,1289,272,1,0,0,0,1290,1291,5,62,0,0,1291,274, - 1,0,0,0,1292,1293,5,38,0,0,1293,276,1,0,0,0,1294,1295,5,61,0,0,1295, - 278,1,0,0,0,1296,1298,5,45,0,0,1297,1296,1,0,0,0,1297,1298,1,0,0, - 0,1298,1300,1,0,0,0,1299,1301,7,0,0,0,1300,1299,1,0,0,0,1301,1302, - 1,0,0,0,1302,1300,1,0,0,0,1302,1303,1,0,0,0,1303,280,1,0,0,0,1304, - 1306,5,45,0,0,1305,1304,1,0,0,0,1305,1306,1,0,0,0,1306,1315,1,0, - 0,0,1307,1316,5,48,0,0,1308,1312,7,1,0,0,1309,1311,7,0,0,0,1310, - 1309,1,0,0,0,1311,1314,1,0,0,0,1312,1310,1,0,0,0,1312,1313,1,0,0, - 0,1313,1316,1,0,0,0,1314,1312,1,0,0,0,1315,1307,1,0,0,0,1315,1308, - 1,0,0,0,1316,1323,1,0,0,0,1317,1319,5,46,0,0,1318,1320,7,0,0,0,1319, - 1318,1,0,0,0,1320,1321,1,0,0,0,1321,1319,1,0,0,0,1321,1322,1,0,0, - 0,1322,1324,1,0,0,0,1323,1317,1,0,0,0,1323,1324,1,0,0,0,1324,1334, - 1,0,0,0,1325,1327,7,2,0,0,1326,1328,7,3,0,0,1327,1326,1,0,0,0,1327, - 1328,1,0,0,0,1328,1330,1,0,0,0,1329,1331,7,0,0,0,1330,1329,1,0,0, - 0,1331,1332,1,0,0,0,1332,1330,1,0,0,0,1332,1333,1,0,0,0,1333,1335, - 1,0,0,0,1334,1325,1,0,0,0,1334,1335,1,0,0,0,1335,282,1,0,0,0,1336, - 1340,7,4,0,0,1337,1339,7,5,0,0,1338,1337,1,0,0,0,1339,1342,1,0,0, - 0,1340,1338,1,0,0,0,1340,1341,1,0,0,0,1341,284,1,0,0,0,1342,1340, - 1,0,0,0,1343,1348,5,34,0,0,1344,1347,3,287,143,0,1345,1347,8,6,0, - 0,1346,1344,1,0,0,0,1346,1345,1,0,0,0,1347,1350,1,0,0,0,1348,1346, - 1,0,0,0,1348,1349,1,0,0,0,1349,1351,1,0,0,0,1350,1348,1,0,0,0,1351, - 1352,5,34,0,0,1352,286,1,0,0,0,1353,1361,5,92,0,0,1354,1362,7,7, - 0,0,1355,1356,5,117,0,0,1356,1357,3,289,144,0,1357,1358,3,289,144, - 0,1358,1359,3,289,144,0,1359,1360,3,289,144,0,1360,1362,1,0,0,0, - 1361,1354,1,0,0,0,1361,1355,1,0,0,0,1362,288,1,0,0,0,1363,1364,7, - 8,0,0,1364,290,1,0,0,0,1365,1366,5,47,0,0,1366,1367,5,47,0,0,1367, - 1371,1,0,0,0,1368,1370,8,9,0,0,1369,1368,1,0,0,0,1370,1373,1,0,0, - 0,1371,1369,1,0,0,0,1371,1372,1,0,0,0,1372,1374,1,0,0,0,1373,1371, - 1,0,0,0,1374,1375,6,145,0,0,1375,292,1,0,0,0,1376,1377,5,47,0,0, - 1377,1378,5,42,0,0,1378,1382,1,0,0,0,1379,1381,9,0,0,0,1380,1379, - 1,0,0,0,1381,1384,1,0,0,0,1382,1383,1,0,0,0,1382,1380,1,0,0,0,1383, - 1385,1,0,0,0,1384,1382,1,0,0,0,1385,1386,5,42,0,0,1386,1387,5,47, - 0,0,1387,1388,1,0,0,0,1388,1389,6,146,0,0,1389,294,1,0,0,0,1390, - 1392,7,10,0,0,1391,1390,1,0,0,0,1392,1393,1,0,0,0,1393,1391,1,0, - 0,0,1393,1394,1,0,0,0,1394,1395,1,0,0,0,1395,1396,6,147,0,0,1396, - 296,1,0,0,0,18,0,1297,1302,1305,1312,1315,1321,1323,1327,1332,1334, - 1340,1346,1348,1361,1371,1382,1393,1,0,1,0 + 1,111,1,111,1,111,1,111,1,111,1,112,1,112,1,112,1,112,1,112,1,113, + 1,113,1,113,1,113,1,113,1,113,1,113,1,114,1,114,1,114,1,114,1,114, + 1,115,1,115,1,115,1,115,1,115,1,115,1,116,1,116,1,116,1,116,1,116, + 1,116,1,116,1,117,1,117,1,117,1,117,1,117,1,117,1,118,1,118,1,118, + 1,118,1,118,1,118,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,120, + 1,120,1,120,1,120,1,120,1,120,1,120,1,121,1,121,1,121,1,121,1,121, + 1,121,1,121,1,122,1,122,1,122,1,122,1,122,1,123,1,123,1,123,1,123, + 1,123,1,123,1,124,1,124,1,124,1,124,1,124,1,125,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,3,140,1307,8,140,1,140,4,140, + 1310,8,140,11,140,12,140,1311,1,141,3,141,1315,8,141,1,141,1,141, + 1,141,5,141,1320,8,141,10,141,12,141,1323,9,141,3,141,1325,8,141, + 1,141,1,141,4,141,1329,8,141,11,141,12,141,1330,3,141,1333,8,141, + 1,141,1,141,3,141,1337,8,141,1,141,4,141,1340,8,141,11,141,12,141, + 1341,3,141,1344,8,141,1,142,1,142,5,142,1348,8,142,10,142,12,142, + 1351,9,142,1,143,1,143,1,143,5,143,1356,8,143,10,143,12,143,1359, + 9,143,1,143,1,143,1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,144, + 3,144,1371,8,144,1,145,1,145,1,146,1,146,1,146,1,146,5,146,1379, + 8,146,10,146,12,146,1382,9,146,1,146,1,146,1,147,1,147,1,147,1,147, + 5,147,1390,8,147,10,147,12,147,1393,9,147,1,147,1,147,1,147,1,147, + 1,147,1,148,4,148,1401,8,148,11,148,12,148,1402,1,148,1,148,1,1391, + 0,149,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12, + 25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23, + 47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34, + 69,35,71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45, + 91,46,93,47,95,48,97,49,99,50,101,51,103,52,105,53,107,54,109,55, + 111,56,113,57,115,58,117,59,119,60,121,61,123,62,125,63,127,64,129, + 65,131,66,133,67,135,68,137,69,139,70,141,71,143,72,145,73,147,74, + 149,75,151,76,153,77,155,78,157,79,159,80,161,81,163,82,165,83,167, + 84,169,85,171,86,173,87,175,88,177,89,179,90,181,91,183,92,185,93, + 187,94,189,95,191,96,193,97,195,98,197,99,199,100,201,101,203,102, + 205,103,207,104,209,105,211,106,213,107,215,108,217,109,219,110, + 221,111,223,112,225,113,227,114,229,115,231,116,233,117,235,118, + 237,119,239,120,241,121,243,122,245,123,247,124,249,125,251,126, + 253,127,255,128,257,129,259,130,261,131,263,132,265,133,267,134, + 269,135,271,136,273,137,275,138,277,139,279,140,281,141,283,142, + 285,143,287,144,289,0,291,0,293,145,295,146,297,147,1,0,11,1,0,48, + 57,1,0,49,57,2,0,69,69,101,101,2,0,43,43,45,45,3,0,65,90,95,95,97, + 122,4,0,48,57,65,90,95,95,97,122,4,0,10,10,13,13,34,34,92,92,8,0, + 34,34,47,47,92,92,98,98,102,102,110,110,114,114,116,116,3,0,48,57, + 65,70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32,32,1420,0,1,1,0,0, + 0,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,229,1,0,0,0,0,231, + 1,0,0,0,0,233,1,0,0,0,0,235,1,0,0,0,0,237,1,0,0,0,0,239,1,0,0,0, + 0,241,1,0,0,0,0,243,1,0,0,0,0,245,1,0,0,0,0,247,1,0,0,0,0,249,1, + 0,0,0,0,251,1,0,0,0,0,253,1,0,0,0,0,255,1,0,0,0,0,257,1,0,0,0,0, + 259,1,0,0,0,0,261,1,0,0,0,0,263,1,0,0,0,0,265,1,0,0,0,0,267,1,0, + 0,0,0,269,1,0,0,0,0,271,1,0,0,0,0,273,1,0,0,0,0,275,1,0,0,0,0,277, + 1,0,0,0,0,279,1,0,0,0,0,281,1,0,0,0,0,283,1,0,0,0,0,285,1,0,0,0, + 0,287,1,0,0,0,0,293,1,0,0,0,0,295,1,0,0,0,0,297,1,0,0,0,1,299,1, + 0,0,0,3,304,1,0,0,0,5,313,1,0,0,0,7,324,1,0,0,0,9,334,1,0,0,0,11, + 344,1,0,0,0,13,353,1,0,0,0,15,365,1,0,0,0,17,372,1,0,0,0,19,380, + 1,0,0,0,21,389,1,0,0,0,23,397,1,0,0,0,25,403,1,0,0,0,27,408,1,0, + 0,0,29,421,1,0,0,0,31,431,1,0,0,0,33,443,1,0,0,0,35,449,1,0,0,0, + 37,460,1,0,0,0,39,471,1,0,0,0,41,476,1,0,0,0,43,485,1,0,0,0,45,495, + 1,0,0,0,47,500,1,0,0,0,49,504,1,0,0,0,51,510,1,0,0,0,53,515,1,0, + 0,0,55,525,1,0,0,0,57,529,1,0,0,0,59,542,1,0,0,0,61,547,1,0,0,0, + 63,554,1,0,0,0,65,563,1,0,0,0,67,574,1,0,0,0,69,578,1,0,0,0,71,587, + 1,0,0,0,73,594,1,0,0,0,75,603,1,0,0,0,77,608,1,0,0,0,79,618,1,0, + 0,0,81,629,1,0,0,0,83,637,1,0,0,0,85,643,1,0,0,0,87,652,1,0,0,0, + 89,662,1,0,0,0,91,671,1,0,0,0,93,683,1,0,0,0,95,694,1,0,0,0,97,700, + 1,0,0,0,99,708,1,0,0,0,101,711,1,0,0,0,103,716,1,0,0,0,105,723,1, + 0,0,0,107,726,1,0,0,0,109,734,1,0,0,0,111,741,1,0,0,0,113,747,1, + 0,0,0,115,752,1,0,0,0,117,763,1,0,0,0,119,768,1,0,0,0,121,774,1, + 0,0,0,123,781,1,0,0,0,125,785,1,0,0,0,127,797,1,0,0,0,129,800,1, + 0,0,0,131,807,1,0,0,0,133,810,1,0,0,0,135,817,1,0,0,0,137,825,1, + 0,0,0,139,832,1,0,0,0,141,843,1,0,0,0,143,850,1,0,0,0,145,859,1, + 0,0,0,147,874,1,0,0,0,149,884,1,0,0,0,151,897,1,0,0,0,153,903,1, + 0,0,0,155,920,1,0,0,0,157,923,1,0,0,0,159,927,1,0,0,0,161,932,1, + 0,0,0,163,938,1,0,0,0,165,947,1,0,0,0,167,956,1,0,0,0,169,960,1, + 0,0,0,171,964,1,0,0,0,173,968,1,0,0,0,175,974,1,0,0,0,177,980,1, + 0,0,0,179,985,1,0,0,0,181,990,1,0,0,0,183,996,1,0,0,0,185,1004,1, + 0,0,0,187,1012,1,0,0,0,189,1023,1,0,0,0,191,1028,1,0,0,0,193,1040, + 1,0,0,0,195,1051,1,0,0,0,197,1061,1,0,0,0,199,1073,1,0,0,0,201,1082, + 1,0,0,0,203,1087,1,0,0,0,205,1100,1,0,0,0,207,1112,1,0,0,0,209,1124, + 1,0,0,0,211,1129,1,0,0,0,213,1137,1,0,0,0,215,1142,1,0,0,0,217,1155, + 1,0,0,0,219,1163,1,0,0,0,221,1172,1,0,0,0,223,1186,1,0,0,0,225,1195, + 1,0,0,0,227,1200,1,0,0,0,229,1207,1,0,0,0,231,1212,1,0,0,0,233,1218, + 1,0,0,0,235,1225,1,0,0,0,237,1231,1,0,0,0,239,1237,1,0,0,0,241,1244, + 1,0,0,0,243,1251,1,0,0,0,245,1258,1,0,0,0,247,1263,1,0,0,0,249,1269, + 1,0,0,0,251,1274,1,0,0,0,253,1277,1,0,0,0,255,1279,1,0,0,0,257,1281, + 1,0,0,0,259,1283,1,0,0,0,261,1285,1,0,0,0,263,1287,1,0,0,0,265,1289, + 1,0,0,0,267,1291,1,0,0,0,269,1293,1,0,0,0,271,1295,1,0,0,0,273,1297, + 1,0,0,0,275,1299,1,0,0,0,277,1301,1,0,0,0,279,1303,1,0,0,0,281,1306, + 1,0,0,0,283,1314,1,0,0,0,285,1345,1,0,0,0,287,1352,1,0,0,0,289,1362, + 1,0,0,0,291,1372,1,0,0,0,293,1374,1,0,0,0,295,1385,1,0,0,0,297,1400, + 1,0,0,0,299,300,5,101,0,0,300,301,5,100,0,0,301,302,5,105,0,0,302, + 303,5,116,0,0,303,2,1,0,0,0,304,305,5,99,0,0,305,306,5,114,0,0,306, + 307,5,101,0,0,307,308,5,97,0,0,308,309,5,116,0,0,309,310,5,105,0, + 0,310,311,5,111,0,0,311,312,5,110,0,0,312,4,1,0,0,0,313,314,5,105, + 0,0,314,315,5,110,0,0,315,316,5,105,0,0,316,317,5,116,0,0,317,318, + 5,105,0,0,318,319,5,97,0,0,319,320,5,108,0,0,320,321,5,105,0,0,321, + 322,5,122,0,0,322,323,5,101,0,0,323,6,1,0,0,0,324,325,5,119,0,0, + 325,326,5,111,0,0,326,327,5,114,0,0,327,328,5,107,0,0,328,329,5, + 115,0,0,329,330,5,112,0,0,330,331,5,97,0,0,331,332,5,99,0,0,332, + 333,5,101,0,0,333,8,1,0,0,0,334,335,5,101,0,0,335,336,5,120,0,0, + 336,337,5,101,0,0,337,338,5,99,0,0,338,339,5,117,0,0,339,340,5,116, + 0,0,340,341,5,105,0,0,341,342,5,111,0,0,342,343,5,110,0,0,343,10, + 1,0,0,0,344,345,5,115,0,0,345,346,5,110,0,0,346,347,5,97,0,0,347, + 348,5,112,0,0,348,349,5,115,0,0,349,350,5,104,0,0,350,351,5,111, + 0,0,351,352,5,116,0,0,352,12,1,0,0,0,353,354,5,116,0,0,354,355,5, + 114,0,0,355,356,5,97,0,0,356,357,5,110,0,0,357,358,5,115,0,0,358, + 359,5,97,0,0,359,360,5,99,0,0,360,361,5,116,0,0,361,362,5,105,0, + 0,362,363,5,111,0,0,363,364,5,110,0,0,364,14,1,0,0,0,365,366,5,114, + 0,0,366,367,5,101,0,0,367,368,5,109,0,0,368,369,5,111,0,0,369,370, + 5,116,0,0,370,371,5,101,0,0,371,16,1,0,0,0,372,373,5,116,0,0,373, + 374,5,97,0,0,374,375,5,114,0,0,375,376,5,103,0,0,376,377,5,101,0, + 0,377,378,5,116,0,0,378,379,5,115,0,0,379,18,1,0,0,0,380,381,5,112, + 0,0,381,382,5,111,0,0,382,383,5,114,0,0,383,384,5,116,0,0,384,385, + 5,97,0,0,385,386,5,98,0,0,386,387,5,108,0,0,387,388,5,101,0,0,388, + 20,1,0,0,0,389,390,5,114,0,0,390,391,5,101,0,0,391,392,5,112,0,0, + 392,393,5,108,0,0,393,394,5,105,0,0,394,395,5,99,0,0,395,396,5,97, + 0,0,396,22,1,0,0,0,397,398,5,108,0,0,398,399,5,111,0,0,399,400,5, + 99,0,0,400,401,5,97,0,0,401,402,5,108,0,0,402,24,1,0,0,0,403,404, + 5,102,0,0,404,405,5,114,0,0,405,406,5,111,0,0,406,407,5,109,0,0, + 407,26,1,0,0,0,408,409,5,114,0,0,409,410,5,101,0,0,410,411,5,115, + 0,0,411,412,5,117,0,0,412,413,5,108,0,0,413,414,5,116,0,0,414,415, + 5,45,0,0,415,416,5,98,0,0,416,417,5,121,0,0,417,418,5,116,0,0,418, + 419,5,101,0,0,419,420,5,115,0,0,420,28,1,0,0,0,421,422,5,114,0,0, + 422,423,5,112,0,0,423,424,5,99,0,0,424,425,5,45,0,0,425,426,5,99, + 0,0,426,427,5,97,0,0,427,428,5,108,0,0,428,429,5,108,0,0,429,430, + 5,115,0,0,430,30,1,0,0,0,431,432,5,100,0,0,432,433,5,101,0,0,433, + 434,5,97,0,0,434,435,5,100,0,0,435,436,5,108,0,0,436,437,5,105,0, + 0,437,438,5,110,0,0,438,439,5,101,0,0,439,440,5,45,0,0,440,441,5, + 109,0,0,441,442,5,115,0,0,442,32,1,0,0,0,443,444,5,113,0,0,444,445, + 5,117,0,0,445,446,5,101,0,0,446,447,5,114,0,0,447,448,5,121,0,0, + 448,34,1,0,0,0,449,450,5,114,0,0,450,451,5,101,0,0,451,452,5,102, + 0,0,452,453,5,108,0,0,453,454,5,101,0,0,454,455,5,99,0,0,455,456, + 5,116,0,0,456,457,5,105,0,0,457,458,5,111,0,0,458,459,5,110,0,0, + 459,36,1,0,0,0,460,461,5,115,0,0,461,462,5,112,0,0,462,463,5,101, + 0,0,463,464,5,99,0,0,464,465,5,105,0,0,465,466,5,97,0,0,466,467, + 5,108,0,0,467,468,5,105,0,0,468,469,5,122,0,0,469,470,5,101,0,0, + 470,38,1,0,0,0,471,472,5,114,0,0,472,473,5,111,0,0,473,474,5,111, + 0,0,474,475,5,116,0,0,475,40,1,0,0,0,476,477,5,100,0,0,477,478,5, + 111,0,0,478,479,5,99,0,0,479,480,5,117,0,0,480,481,5,109,0,0,481, + 482,5,101,0,0,482,483,5,110,0,0,483,484,5,116,0,0,484,42,1,0,0,0, + 485,486,5,102,0,0,486,487,5,114,0,0,487,488,5,97,0,0,488,489,5,103, + 0,0,489,490,5,109,0,0,490,491,5,101,0,0,491,492,5,110,0,0,492,493, + 5,116,0,0,493,494,5,115,0,0,494,44,1,0,0,0,495,496,5,118,0,0,496, + 497,5,105,0,0,497,498,5,101,0,0,498,499,5,119,0,0,499,46,1,0,0,0, + 500,501,5,109,0,0,501,502,5,97,0,0,502,503,5,120,0,0,503,48,1,0, + 0,0,504,505,5,97,0,0,505,506,5,108,0,0,506,507,5,108,0,0,507,508, + 5,111,0,0,508,509,5,119,0,0,509,50,1,0,0,0,510,511,5,112,0,0,511, + 512,5,111,0,0,512,513,5,108,0,0,513,514,5,108,0,0,514,52,1,0,0,0, + 515,516,5,113,0,0,516,517,5,117,0,0,517,518,5,101,0,0,518,519,5, + 114,0,0,519,520,5,121,0,0,520,521,5,97,0,0,521,522,5,98,0,0,522, + 523,5,108,0,0,523,524,5,101,0,0,524,54,1,0,0,0,525,526,5,114,0,0, + 526,527,5,112,0,0,527,528,5,99,0,0,528,56,1,0,0,0,529,530,5,113, + 0,0,530,531,5,117,0,0,531,532,5,101,0,0,532,533,5,114,0,0,533,534, + 5,121,0,0,534,535,5,45,0,0,535,536,5,114,0,0,536,537,5,101,0,0,537, + 538,5,97,0,0,538,539,5,115,0,0,539,540,5,111,0,0,540,541,5,110,0, + 0,541,58,1,0,0,0,542,543,5,116,0,0,543,544,5,121,0,0,544,545,5,112, + 0,0,545,546,5,101,0,0,546,60,1,0,0,0,547,548,5,111,0,0,548,549,5, + 98,0,0,549,550,5,106,0,0,550,551,5,101,0,0,551,552,5,99,0,0,552, + 553,5,116,0,0,553,62,1,0,0,0,554,555,5,115,0,0,555,556,5,116,0,0, + 556,557,5,111,0,0,557,558,5,114,0,0,558,559,5,97,0,0,559,560,5,98, + 0,0,560,561,5,108,0,0,561,562,5,101,0,0,562,64,1,0,0,0,563,564,5, + 105,0,0,564,565,5,109,0,0,565,566,5,112,0,0,566,567,5,108,0,0,567, + 568,5,101,0,0,568,569,5,109,0,0,569,570,5,101,0,0,570,571,5,110, + 0,0,571,572,5,116,0,0,572,573,5,115,0,0,573,66,1,0,0,0,574,575,5, + 114,0,0,575,576,5,101,0,0,576,577,5,102,0,0,577,68,1,0,0,0,578,579, + 5,102,0,0,579,580,5,114,0,0,580,581,5,97,0,0,581,582,5,103,0,0,582, + 583,5,109,0,0,583,584,5,101,0,0,584,585,5,110,0,0,585,586,5,116, + 0,0,586,70,1,0,0,0,587,588,5,105,0,0,588,589,5,109,0,0,589,590,5, + 112,0,0,590,591,5,111,0,0,591,592,5,114,0,0,592,593,5,116,0,0,593, + 72,1,0,0,0,594,595,5,101,0,0,595,596,5,120,0,0,596,597,5,116,0,0, + 597,598,5,101,0,0,598,599,5,114,0,0,599,600,5,110,0,0,600,601,5, + 97,0,0,601,602,5,108,0,0,602,74,1,0,0,0,603,604,5,97,0,0,604,605, + 5,116,0,0,605,606,5,111,0,0,606,607,5,109,0,0,607,76,1,0,0,0,608, + 609,5,105,0,0,609,610,5,110,0,0,610,611,5,116,0,0,611,612,5,101, + 0,0,612,613,5,114,0,0,613,614,5,102,0,0,614,615,5,97,0,0,615,616, + 5,99,0,0,616,617,5,101,0,0,617,78,1,0,0,0,618,619,5,105,0,0,619, + 620,5,110,0,0,620,621,5,116,0,0,621,622,5,101,0,0,622,623,5,114, + 0,0,623,624,5,102,0,0,624,625,5,97,0,0,625,626,5,99,0,0,626,627, + 5,101,0,0,627,628,5,115,0,0,628,80,1,0,0,0,629,630,5,112,0,0,630, + 631,5,97,0,0,631,632,5,99,0,0,632,633,5,107,0,0,633,634,5,97,0,0, + 634,635,5,103,0,0,635,636,5,101,0,0,636,82,1,0,0,0,637,638,5,118, + 0,0,638,639,5,97,0,0,639,640,5,108,0,0,640,641,5,117,0,0,641,642, + 5,101,0,0,642,84,1,0,0,0,643,644,5,114,0,0,644,645,5,101,0,0,645, + 646,5,108,0,0,646,647,5,97,0,0,647,648,5,116,0,0,648,649,5,105,0, + 0,649,650,5,111,0,0,650,651,5,110,0,0,651,86,1,0,0,0,652,653,5,111, + 0,0,653,654,5,112,0,0,654,655,5,101,0,0,655,656,5,114,0,0,656,657, + 5,97,0,0,657,658,5,116,0,0,658,659,5,105,0,0,659,660,5,111,0,0,660, + 661,5,110,0,0,661,88,1,0,0,0,662,663,5,102,0,0,663,664,5,117,0,0, + 664,665,5,110,0,0,665,666,5,99,0,0,666,667,5,116,0,0,667,668,5,105, + 0,0,668,669,5,111,0,0,669,670,5,110,0,0,670,90,1,0,0,0,671,672,5, + 99,0,0,672,673,5,111,0,0,673,674,5,110,0,0,674,675,5,115,0,0,675, + 676,5,116,0,0,676,677,5,114,0,0,677,678,5,117,0,0,678,679,5,99,0, + 0,679,680,5,116,0,0,680,681,5,111,0,0,681,682,5,114,0,0,682,92,1, + 0,0,0,683,684,5,99,0,0,684,685,5,111,0,0,685,686,5,110,0,0,686,687, + 5,115,0,0,687,688,5,116,0,0,688,689,5,114,0,0,689,690,5,117,0,0, + 690,691,5,99,0,0,691,692,5,116,0,0,692,693,5,115,0,0,693,94,1,0, + 0,0,694,695,5,105,0,0,695,696,5,110,0,0,696,697,5,112,0,0,697,698, + 5,117,0,0,698,699,5,116,0,0,699,96,1,0,0,0,700,701,5,99,0,0,701, + 702,5,111,0,0,702,703,5,110,0,0,703,704,5,102,0,0,704,705,5,111, + 0,0,705,706,5,114,0,0,706,707,5,109,0,0,707,98,1,0,0,0,708,709,5, + 97,0,0,709,710,5,115,0,0,710,100,1,0,0,0,711,712,5,98,0,0,712,713, + 5,105,0,0,713,714,5,110,0,0,714,715,5,100,0,0,715,102,1,0,0,0,716, + 717,5,115,0,0,717,718,5,116,0,0,718,719,5,97,0,0,719,720,5,116,0, + 0,720,721,5,105,0,0,721,722,5,99,0,0,722,104,1,0,0,0,723,724,5,116, + 0,0,724,725,5,111,0,0,725,106,1,0,0,0,726,727,5,112,0,0,727,728, + 5,114,0,0,728,729,5,105,0,0,729,730,5,118,0,0,730,731,5,97,0,0,731, + 732,5,116,0,0,732,733,5,101,0,0,733,108,1,0,0,0,734,735,5,115,0, + 0,735,736,5,104,0,0,736,737,5,97,0,0,737,738,5,114,0,0,738,739,5, + 101,0,0,739,740,5,100,0,0,740,110,1,0,0,0,741,742,5,115,0,0,742, + 743,5,116,0,0,743,744,5,97,0,0,744,745,5,116,0,0,745,746,5,101,0, + 0,746,112,1,0,0,0,747,748,5,101,0,0,748,749,5,100,0,0,749,750,5, + 103,0,0,750,751,5,101,0,0,751,114,1,0,0,0,752,753,5,112,0,0,753, + 754,5,114,0,0,754,755,5,111,0,0,755,756,5,106,0,0,756,757,5,101, + 0,0,757,758,5,99,0,0,758,759,5,116,0,0,759,760,5,105,0,0,760,761, + 5,111,0,0,761,762,5,110,0,0,762,116,1,0,0,0,763,764,5,119,0,0,764, + 765,5,105,0,0,765,766,5,116,0,0,766,767,5,104,0,0,767,118,1,0,0, + 0,768,769,5,117,0,0,769,770,5,115,0,0,770,771,5,105,0,0,771,772, + 5,110,0,0,772,773,5,103,0,0,773,120,1,0,0,0,774,775,5,97,0,0,775, + 776,5,99,0,0,776,777,5,99,0,0,777,778,5,101,0,0,778,779,5,112,0, + 0,779,780,5,116,0,0,780,122,1,0,0,0,781,782,5,118,0,0,782,783,5, + 105,0,0,783,784,5,97,0,0,784,124,1,0,0,0,785,786,5,109,0,0,786,787, + 5,97,0,0,787,788,5,116,0,0,788,789,5,101,0,0,789,790,5,114,0,0,790, + 791,5,105,0,0,791,792,5,97,0,0,792,793,5,108,0,0,793,794,5,105,0, + 0,794,795,5,122,0,0,795,796,5,101,0,0,796,126,1,0,0,0,797,798,5, + 105,0,0,798,799,5,102,0,0,799,128,1,0,0,0,800,801,5,97,0,0,801,802, + 5,98,0,0,802,803,5,115,0,0,803,804,5,101,0,0,804,805,5,110,0,0,805, + 806,5,116,0,0,806,130,1,0,0,0,807,808,5,111,0,0,808,809,5,110,0, + 0,809,132,1,0,0,0,810,811,5,112,0,0,811,812,5,111,0,0,812,813,5, + 108,0,0,813,814,5,105,0,0,814,815,5,99,0,0,815,816,5,121,0,0,816, + 134,1,0,0,0,817,818,5,100,0,0,818,819,5,101,0,0,819,820,5,102,0, + 0,820,821,5,97,0,0,821,822,5,117,0,0,822,823,5,108,0,0,823,824,5, + 116,0,0,824,136,1,0,0,0,825,826,5,115,0,0,826,827,5,111,0,0,827, + 828,5,117,0,0,828,829,5,114,0,0,829,830,5,99,0,0,830,831,5,101,0, + 0,831,138,1,0,0,0,832,833,5,114,0,0,833,834,5,101,0,0,834,835,5, + 112,0,0,835,836,5,111,0,0,836,837,5,115,0,0,837,838,5,105,0,0,838, + 839,5,116,0,0,839,840,5,111,0,0,840,841,5,114,0,0,841,842,5,121, + 0,0,842,140,1,0,0,0,843,844,5,99,0,0,844,845,5,111,0,0,845,846,5, + 109,0,0,846,847,5,109,0,0,847,848,5,105,0,0,848,849,5,116,0,0,849, + 142,1,0,0,0,850,851,5,114,0,0,851,852,5,101,0,0,852,853,5,118,0, + 0,853,854,5,105,0,0,854,855,5,115,0,0,855,856,5,105,0,0,856,857, + 5,111,0,0,857,858,5,110,0,0,858,144,1,0,0,0,859,860,5,115,0,0,860, + 861,5,101,0,0,861,862,5,109,0,0,862,863,5,97,0,0,863,864,5,110,0, + 0,864,865,5,116,0,0,865,866,5,105,0,0,866,867,5,99,0,0,867,868,5, + 45,0,0,868,869,5,109,0,0,869,870,5,97,0,0,870,871,5,106,0,0,871, + 872,5,111,0,0,872,873,5,114,0,0,873,146,1,0,0,0,874,875,5,111,0, + 0,875,876,5,110,0,0,876,877,5,45,0,0,877,878,5,100,0,0,878,879,5, + 101,0,0,879,880,5,108,0,0,880,881,5,101,0,0,881,882,5,116,0,0,882, + 883,5,101,0,0,883,148,1,0,0,0,884,885,5,114,0,0,885,886,5,101,0, + 0,886,887,5,116,0,0,887,888,5,97,0,0,888,889,5,105,0,0,889,890,5, + 110,0,0,890,891,5,45,0,0,891,892,5,111,0,0,892,893,5,116,0,0,893, + 894,5,104,0,0,894,895,5,101,0,0,895,896,5,114,0,0,896,150,1,0,0, + 0,897,898,5,107,0,0,898,899,5,101,0,0,899,900,5,121,0,0,900,901, + 5,101,0,0,901,902,5,100,0,0,902,152,1,0,0,0,903,904,5,112,0,0,904, + 905,5,117,0,0,905,906,5,98,0,0,906,907,5,108,0,0,907,908,5,105,0, + 0,908,909,5,99,0,0,909,910,5,45,0,0,910,911,5,116,0,0,911,912,5, + 114,0,0,912,913,5,97,0,0,913,914,5,118,0,0,914,915,5,101,0,0,915, + 916,5,114,0,0,916,917,5,115,0,0,917,918,5,97,0,0,918,919,5,108,0, + 0,919,154,1,0,0,0,920,921,5,105,0,0,921,922,5,100,0,0,922,156,1, + 0,0,0,923,924,5,100,0,0,924,925,5,111,0,0,925,926,5,99,0,0,926,158, + 1,0,0,0,927,928,5,109,0,0,928,929,5,111,0,0,929,930,5,100,0,0,930, + 931,5,101,0,0,931,160,1,0,0,0,932,933,5,101,0,0,933,934,5,109,0, + 0,934,935,5,105,0,0,935,936,5,116,0,0,936,937,5,115,0,0,937,162, + 1,0,0,0,938,939,5,114,0,0,939,940,5,101,0,0,940,941,5,99,0,0,941, + 942,5,101,0,0,942,943,5,105,0,0,943,944,5,118,0,0,944,945,5,101, + 0,0,945,946,5,114,0,0,946,164,1,0,0,0,947,948,5,114,0,0,948,949, + 5,101,0,0,949,950,5,113,0,0,950,951,5,117,0,0,951,952,5,105,0,0, + 952,953,5,114,0,0,953,954,5,101,0,0,954,955,5,115,0,0,955,166,1, + 0,0,0,956,957,5,97,0,0,957,958,5,110,0,0,958,959,5,121,0,0,959,168, + 1,0,0,0,960,961,5,103,0,0,961,962,5,101,0,0,962,963,5,116,0,0,963, + 170,1,0,0,0,964,965,5,115,0,0,965,966,5,101,0,0,966,967,5,116,0, + 0,967,172,1,0,0,0,968,969,5,119,0,0,969,970,5,97,0,0,970,971,5,116, + 0,0,971,972,5,99,0,0,972,973,5,104,0,0,973,174,1,0,0,0,974,975,5, + 115,0,0,975,976,5,116,0,0,976,977,5,97,0,0,977,978,5,114,0,0,978, + 979,5,116,0,0,979,176,1,0,0,0,980,981,5,115,0,0,981,982,5,116,0, + 0,982,983,5,111,0,0,983,984,5,112,0,0,984,178,1,0,0,0,985,986,5, + 114,0,0,986,987,5,101,0,0,987,988,5,97,0,0,988,989,5,100,0,0,989, + 180,1,0,0,0,990,991,5,119,0,0,991,992,5,114,0,0,992,993,5,105,0, + 0,993,994,5,116,0,0,994,995,5,101,0,0,995,182,1,0,0,0,996,997,5, + 114,0,0,997,998,5,101,0,0,998,999,5,115,0,0,999,1000,5,111,0,0,1000, + 1001,5,108,0,0,1001,1002,5,118,0,0,1002,1003,5,101,0,0,1003,184, + 1,0,0,0,1004,1005,5,99,0,0,1005,1006,5,111,0,0,1006,1007,5,110,0, + 0,1007,1008,5,110,0,0,1008,1009,5,101,0,0,1009,1010,5,99,0,0,1010, + 1011,5,116,0,0,1011,186,1,0,0,0,1012,1013,5,100,0,0,1013,1014,5, + 105,0,0,1014,1015,5,115,0,0,1015,1016,5,99,0,0,1016,1017,5,111,0, + 0,1017,1018,5,110,0,0,1018,1019,5,110,0,0,1019,1020,5,101,0,0,1020, + 1021,5,99,0,0,1021,1022,5,116,0,0,1022,188,1,0,0,0,1023,1024,5,99, + 0,0,1024,1025,5,97,0,0,1025,1026,5,108,0,0,1026,1027,5,108,0,0,1027, + 190,1,0,0,0,1028,1029,5,119,0,0,1029,1030,5,97,0,0,1030,1031,5,116, + 0,0,1031,1032,5,99,0,0,1032,1033,5,104,0,0,1033,1034,5,45,0,0,1034, + 1035,5,115,0,0,1035,1036,5,116,0,0,1036,1037,5,97,0,0,1037,1038, + 5,114,0,0,1038,1039,5,116,0,0,1039,192,1,0,0,0,1040,1041,5,119,0, + 0,1041,1042,5,97,0,0,1042,1043,5,116,0,0,1043,1044,5,99,0,0,1044, + 1045,5,104,0,0,1045,1046,5,45,0,0,1046,1047,5,115,0,0,1047,1048, + 5,116,0,0,1048,1049,5,111,0,0,1049,1050,5,112,0,0,1050,194,1,0,0, + 0,1051,1052,5,115,0,0,1052,1053,5,117,0,0,1053,1054,5,98,0,0,1054, + 1055,5,115,0,0,1055,1056,5,99,0,0,1056,1057,5,114,0,0,1057,1058, + 5,105,0,0,1058,1059,5,98,0,0,1059,1060,5,101,0,0,1060,196,1,0,0, + 0,1061,1062,5,117,0,0,1062,1063,5,110,0,0,1063,1064,5,115,0,0,1064, + 1065,5,117,0,0,1065,1066,5,98,0,0,1066,1067,5,115,0,0,1067,1068, + 5,99,0,0,1068,1069,5,114,0,0,1069,1070,5,105,0,0,1070,1071,5,98, + 0,0,1071,1072,5,101,0,0,1072,198,1,0,0,0,1073,1074,5,114,0,0,1074, + 1075,5,101,0,0,1075,1076,5,103,0,0,1076,1077,5,105,0,0,1077,1078, + 5,115,0,0,1078,1079,5,116,0,0,1079,1080,5,101,0,0,1080,1081,5,114, + 0,0,1081,200,1,0,0,0,1082,1083,5,99,0,0,1083,1084,5,114,0,0,1084, + 1085,5,100,0,0,1085,1086,5,116,0,0,1086,202,1,0,0,0,1087,1088,5, + 111,0,0,1088,1089,5,112,0,0,1089,1090,5,116,0,0,1090,1091,5,105, + 0,0,1091,1092,5,111,0,0,1092,1093,5,110,0,0,1093,1094,5,97,0,0,1094, + 1095,5,108,0,0,1095,1096,5,45,0,0,1096,1097,5,111,0,0,1097,1098, + 5,110,0,0,1098,1099,5,101,0,0,1099,204,1,0,0,0,1100,1101,5,101,0, + 0,1101,1102,5,120,0,0,1102,1103,5,97,0,0,1103,1104,5,99,0,0,1104, + 1105,5,116,0,0,1105,1106,5,108,0,0,1106,1107,5,121,0,0,1107,1108, + 5,45,0,0,1108,1109,5,111,0,0,1109,1110,5,110,0,0,1110,1111,5,101, + 0,0,1111,206,1,0,0,0,1112,1113,5,109,0,0,1113,1114,5,97,0,0,1114, + 1115,5,110,0,0,1115,1116,5,121,0,0,1116,1117,5,45,0,0,1117,1118, + 5,117,0,0,1118,1119,5,110,0,0,1119,1120,5,105,0,0,1120,1121,5,113, + 0,0,1121,1122,5,117,0,0,1122,1123,5,101,0,0,1123,208,1,0,0,0,1124, + 1125,5,109,0,0,1125,1126,5,97,0,0,1126,1127,5,110,0,0,1127,1128, + 5,121,0,0,1128,210,1,0,0,0,1129,1130,5,111,0,0,1130,1131,5,114,0, + 0,1131,1132,5,100,0,0,1132,1133,5,101,0,0,1133,1134,5,114,0,0,1134, + 1135,5,101,0,0,1135,1136,5,100,0,0,1136,212,1,0,0,0,1137,1138,5, + 117,0,0,1138,1139,5,110,0,0,1139,1140,5,105,0,0,1140,1141,5,116, + 0,0,1141,214,1,0,0,0,1142,1143,5,119,0,0,1143,1144,5,97,0,0,1144, + 1145,5,116,0,0,1145,1146,5,99,0,0,1146,1147,5,104,0,0,1147,1148, + 5,45,0,0,1148,1149,5,104,0,0,1149,1150,5,97,0,0,1150,1151,5,110, + 0,0,1151,1152,5,100,0,0,1152,1153,5,108,0,0,1153,1154,5,101,0,0, + 1154,216,1,0,0,0,1155,1156,5,109,0,0,1156,1157,5,101,0,0,1157,1158, + 5,115,0,0,1158,1159,5,115,0,0,1159,1160,5,97,0,0,1160,1161,5,103, + 0,0,1161,1162,5,101,0,0,1162,218,1,0,0,0,1163,1164,5,97,0,0,1164, + 1165,5,116,0,0,1165,1166,5,111,0,0,1166,1167,5,109,0,0,1167,1168, + 5,45,0,0,1168,1169,5,114,0,0,1169,1170,5,101,0,0,1170,1171,5,102, + 0,0,1171,220,1,0,0,0,1172,1173,5,105,0,0,1173,1174,5,110,0,0,1174, + 1175,5,116,0,0,1175,1176,5,101,0,0,1176,1177,5,114,0,0,1177,1178, + 5,102,0,0,1178,1179,5,97,0,0,1179,1180,5,99,0,0,1180,1181,5,101, + 0,0,1181,1182,5,45,0,0,1182,1183,5,114,0,0,1183,1184,5,101,0,0,1184, + 1185,5,102,0,0,1185,222,1,0,0,0,1186,1187,5,111,0,0,1187,1188,5, + 112,0,0,1188,1189,5,116,0,0,1189,1190,5,105,0,0,1190,1191,5,111, + 0,0,1191,1192,5,110,0,0,1192,1193,5,97,0,0,1193,1194,5,108,0,0,1194, + 224,1,0,0,0,1195,1196,5,108,0,0,1196,1197,5,105,0,0,1197,1198,5, + 115,0,0,1198,1199,5,116,0,0,1199,226,1,0,0,0,1200,1201,5,114,0,0, + 1201,1202,5,101,0,0,1202,1203,5,99,0,0,1203,1204,5,111,0,0,1204, + 1205,5,114,0,0,1205,1206,5,100,0,0,1206,228,1,0,0,0,1207,1208,5, + 98,0,0,1208,1209,5,111,0,0,1209,1210,5,111,0,0,1210,1211,5,108,0, + 0,1211,230,1,0,0,0,1212,1213,5,98,0,0,1213,1214,5,121,0,0,1214,1215, + 5,116,0,0,1215,1216,5,101,0,0,1216,1217,5,115,0,0,1217,232,1,0,0, + 0,1218,1219,5,100,0,0,1219,1220,5,111,0,0,1220,1221,5,117,0,0,1221, + 1222,5,98,0,0,1222,1223,5,108,0,0,1223,1224,5,101,0,0,1224,234,1, + 0,0,0,1225,1226,5,105,0,0,1226,1227,5,110,0,0,1227,1228,5,116,0, + 0,1228,1229,5,51,0,0,1229,1230,5,50,0,0,1230,236,1,0,0,0,1231,1232, + 5,105,0,0,1232,1233,5,110,0,0,1233,1234,5,116,0,0,1234,1235,5,54, + 0,0,1235,1236,5,52,0,0,1236,238,1,0,0,0,1237,1238,5,115,0,0,1238, + 1239,5,116,0,0,1239,1240,5,114,0,0,1240,1241,5,105,0,0,1241,1242, + 5,110,0,0,1242,1243,5,103,0,0,1243,240,1,0,0,0,1244,1245,5,117,0, + 0,1245,1246,5,105,0,0,1246,1247,5,110,0,0,1247,1248,5,116,0,0,1248, + 1249,5,51,0,0,1249,1250,5,50,0,0,1250,242,1,0,0,0,1251,1252,5,117, + 0,0,1252,1253,5,105,0,0,1253,1254,5,110,0,0,1254,1255,5,116,0,0, + 1255,1256,5,54,0,0,1256,1257,5,52,0,0,1257,244,1,0,0,0,1258,1259, + 5,116,0,0,1259,1260,5,114,0,0,1260,1261,5,117,0,0,1261,1262,5,101, + 0,0,1262,246,1,0,0,0,1263,1264,5,102,0,0,1264,1265,5,97,0,0,1265, + 1266,5,108,0,0,1266,1267,5,115,0,0,1267,1268,5,101,0,0,1268,248, + 1,0,0,0,1269,1270,5,110,0,0,1270,1271,5,117,0,0,1271,1272,5,108, + 0,0,1272,1273,5,108,0,0,1273,250,1,0,0,0,1274,1275,5,45,0,0,1275, + 1276,5,62,0,0,1276,252,1,0,0,0,1277,1278,5,58,0,0,1278,254,1,0,0, + 0,1279,1280,5,59,0,0,1280,256,1,0,0,0,1281,1282,5,44,0,0,1282,258, + 1,0,0,0,1283,1284,5,46,0,0,1284,260,1,0,0,0,1285,1286,5,123,0,0, + 1286,262,1,0,0,0,1287,1288,5,125,0,0,1288,264,1,0,0,0,1289,1290, + 5,91,0,0,1290,266,1,0,0,0,1291,1292,5,93,0,0,1292,268,1,0,0,0,1293, + 1294,5,40,0,0,1294,270,1,0,0,0,1295,1296,5,41,0,0,1296,272,1,0,0, + 0,1297,1298,5,60,0,0,1298,274,1,0,0,0,1299,1300,5,62,0,0,1300,276, + 1,0,0,0,1301,1302,5,38,0,0,1302,278,1,0,0,0,1303,1304,5,61,0,0,1304, + 280,1,0,0,0,1305,1307,5,45,0,0,1306,1305,1,0,0,0,1306,1307,1,0,0, + 0,1307,1309,1,0,0,0,1308,1310,7,0,0,0,1309,1308,1,0,0,0,1310,1311, + 1,0,0,0,1311,1309,1,0,0,0,1311,1312,1,0,0,0,1312,282,1,0,0,0,1313, + 1315,5,45,0,0,1314,1313,1,0,0,0,1314,1315,1,0,0,0,1315,1324,1,0, + 0,0,1316,1325,5,48,0,0,1317,1321,7,1,0,0,1318,1320,7,0,0,0,1319, + 1318,1,0,0,0,1320,1323,1,0,0,0,1321,1319,1,0,0,0,1321,1322,1,0,0, + 0,1322,1325,1,0,0,0,1323,1321,1,0,0,0,1324,1316,1,0,0,0,1324,1317, + 1,0,0,0,1325,1332,1,0,0,0,1326,1328,5,46,0,0,1327,1329,7,0,0,0,1328, + 1327,1,0,0,0,1329,1330,1,0,0,0,1330,1328,1,0,0,0,1330,1331,1,0,0, + 0,1331,1333,1,0,0,0,1332,1326,1,0,0,0,1332,1333,1,0,0,0,1333,1343, + 1,0,0,0,1334,1336,7,2,0,0,1335,1337,7,3,0,0,1336,1335,1,0,0,0,1336, + 1337,1,0,0,0,1337,1339,1,0,0,0,1338,1340,7,0,0,0,1339,1338,1,0,0, + 0,1340,1341,1,0,0,0,1341,1339,1,0,0,0,1341,1342,1,0,0,0,1342,1344, + 1,0,0,0,1343,1334,1,0,0,0,1343,1344,1,0,0,0,1344,284,1,0,0,0,1345, + 1349,7,4,0,0,1346,1348,7,5,0,0,1347,1346,1,0,0,0,1348,1351,1,0,0, + 0,1349,1347,1,0,0,0,1349,1350,1,0,0,0,1350,286,1,0,0,0,1351,1349, + 1,0,0,0,1352,1357,5,34,0,0,1353,1356,3,289,144,0,1354,1356,8,6,0, + 0,1355,1353,1,0,0,0,1355,1354,1,0,0,0,1356,1359,1,0,0,0,1357,1355, + 1,0,0,0,1357,1358,1,0,0,0,1358,1360,1,0,0,0,1359,1357,1,0,0,0,1360, + 1361,5,34,0,0,1361,288,1,0,0,0,1362,1370,5,92,0,0,1363,1371,7,7, + 0,0,1364,1365,5,117,0,0,1365,1366,3,291,145,0,1366,1367,3,291,145, + 0,1367,1368,3,291,145,0,1368,1369,3,291,145,0,1369,1371,1,0,0,0, + 1370,1363,1,0,0,0,1370,1364,1,0,0,0,1371,290,1,0,0,0,1372,1373,7, + 8,0,0,1373,292,1,0,0,0,1374,1375,5,47,0,0,1375,1376,5,47,0,0,1376, + 1380,1,0,0,0,1377,1379,8,9,0,0,1378,1377,1,0,0,0,1379,1382,1,0,0, + 0,1380,1378,1,0,0,0,1380,1381,1,0,0,0,1381,1383,1,0,0,0,1382,1380, + 1,0,0,0,1383,1384,6,146,0,0,1384,294,1,0,0,0,1385,1386,5,47,0,0, + 1386,1387,5,42,0,0,1387,1391,1,0,0,0,1388,1390,9,0,0,0,1389,1388, + 1,0,0,0,1390,1393,1,0,0,0,1391,1392,1,0,0,0,1391,1389,1,0,0,0,1392, + 1394,1,0,0,0,1393,1391,1,0,0,0,1394,1395,5,42,0,0,1395,1396,5,47, + 0,0,1396,1397,1,0,0,0,1397,1398,6,147,0,0,1398,296,1,0,0,0,1399, + 1401,7,10,0,0,1400,1399,1,0,0,0,1401,1402,1,0,0,0,1402,1400,1,0, + 0,0,1402,1403,1,0,0,0,1403,1404,1,0,0,0,1404,1405,6,148,0,0,1405, + 298,1,0,0,0,18,0,1306,1311,1314,1321,1324,1330,1332,1336,1341,1343, + 1349,1355,1357,1370,1380,1391,1402,1,0,1,0 ]; private static __ATN: antlr.ATN; diff --git a/src/capability-language/generated/QuixosCapabilityParser.ts b/src/capability-language/generated/QuixosCapabilityParser.ts index 4e9b654..c11c8a3 100644 --- a/src/capability-language/generated/QuixosCapabilityParser.ts +++ b/src/capability-language/generated/QuixosCapabilityParser.ts @@ -70,92 +70,93 @@ export class QuixosCapabilityParser extends antlr.Parser { public static readonly PROJECTION = 58; public static readonly WITH = 59; public static readonly USING = 60; - public static readonly VIA = 61; - public static readonly MATERIALIZE = 62; - public static readonly IF = 63; - public static readonly ABSENT = 64; - public static readonly ON = 65; - public static readonly POLICY = 66; - public static readonly DEFAULT = 67; - public static readonly SOURCE = 68; - public static readonly REPOSITORY = 69; - public static readonly COMMIT = 70; - public static readonly REVISION = 71; - public static readonly SEMANTIC_MAJOR = 72; - public static readonly ON_DELETE = 73; - public static readonly RETAIN_OTHER = 74; - public static readonly KEYED = 75; - public static readonly PUBLIC_TRAVERSAL = 76; - public static readonly ID = 77; - public static readonly DOC = 78; - public static readonly MODE = 79; - public static readonly EMITS = 80; - public static readonly RECEIVER = 81; - public static readonly REQUIRES = 82; - public static readonly ANY = 83; - public static readonly GET = 84; - public static readonly SET = 85; - public static readonly WATCH = 86; - public static readonly START = 87; - public static readonly STOP = 88; - public static readonly READ = 89; - public static readonly WRITE = 90; - public static readonly RESOLVE = 91; - public static readonly CONNECT = 92; - public static readonly DISCONNECT = 93; - public static readonly CALL = 94; - public static readonly WATCH_START = 95; - public static readonly WATCH_STOP = 96; - public static readonly SUBSCRIBE = 97; - public static readonly UNSUBSCRIBE = 98; - public static readonly REGISTER = 99; - public static readonly CRDT = 100; - public static readonly OPTIONAL_ONE = 101; - public static readonly EXACTLY_ONE = 102; - public static readonly MANY_UNIQUE = 103; - public static readonly MANY = 104; - public static readonly ORDERED = 105; - public static readonly UNIT = 106; - public static readonly WATCH_HANDLE = 107; - public static readonly MESSAGE = 108; - public static readonly ATOM_REF = 109; - public static readonly INTERFACE_REF = 110; - public static readonly OPTIONAL = 111; - public static readonly LIST = 112; - public static readonly RECORD = 113; - public static readonly BOOL = 114; - public static readonly BYTES = 115; - public static readonly DOUBLE = 116; - public static readonly INT32 = 117; - public static readonly INT64 = 118; - public static readonly STRING = 119; - public static readonly UINT32 = 120; - public static readonly UINT64 = 121; - public static readonly TRUE = 122; - public static readonly FALSE = 123; - public static readonly NULL = 124; - public static readonly ARROW = 125; - public static readonly COLON = 126; - public static readonly SEMI = 127; - public static readonly COMMA = 128; - public static readonly DOT = 129; - public static readonly LBRACE = 130; - public static readonly RBRACE = 131; - public static readonly LBRACK = 132; - public static readonly RBRACK = 133; - public static readonly LPAREN = 134; - public static readonly RPAREN = 135; - public static readonly LT = 136; - public static readonly GT = 137; - public static readonly AMP = 138; - public static readonly EQUAL = 139; - public static readonly INTEGER = 140; - public static readonly JSON_NUMBER = 141; - public static readonly IDENTIFIER = 142; - public static readonly STRING_LITERAL = 143; - public static readonly LINE_COMMENT = 144; - public static readonly BLOCK_COMMENT = 145; - public static readonly WS = 146; + public static readonly ACCEPT = 61; + public static readonly VIA = 62; + public static readonly MATERIALIZE = 63; + public static readonly IF = 64; + public static readonly ABSENT = 65; + public static readonly ON = 66; + public static readonly POLICY = 67; + public static readonly DEFAULT = 68; + public static readonly SOURCE = 69; + public static readonly REPOSITORY = 70; + public static readonly COMMIT = 71; + public static readonly REVISION = 72; + public static readonly SEMANTIC_MAJOR = 73; + public static readonly ON_DELETE = 74; + public static readonly RETAIN_OTHER = 75; + public static readonly KEYED = 76; + public static readonly PUBLIC_TRAVERSAL = 77; + public static readonly ID = 78; + public static readonly DOC = 79; + public static readonly MODE = 80; + public static readonly EMITS = 81; + public static readonly RECEIVER = 82; + public static readonly REQUIRES = 83; + public static readonly ANY = 84; + public static readonly GET = 85; + public static readonly SET = 86; + public static readonly WATCH = 87; + public static readonly START = 88; + public static readonly STOP = 89; + public static readonly READ = 90; + public static readonly WRITE = 91; + public static readonly RESOLVE = 92; + public static readonly CONNECT = 93; + public static readonly DISCONNECT = 94; + public static readonly CALL = 95; + public static readonly WATCH_START = 96; + public static readonly WATCH_STOP = 97; + public static readonly SUBSCRIBE = 98; + public static readonly UNSUBSCRIBE = 99; + public static readonly REGISTER = 100; + public static readonly CRDT = 101; + public static readonly OPTIONAL_ONE = 102; + public static readonly EXACTLY_ONE = 103; + public static readonly MANY_UNIQUE = 104; + public static readonly MANY = 105; + public static readonly ORDERED = 106; + public static readonly UNIT = 107; + public static readonly WATCH_HANDLE = 108; + public static readonly MESSAGE = 109; + public static readonly ATOM_REF = 110; + public static readonly INTERFACE_REF = 111; + public static readonly OPTIONAL = 112; + public static readonly LIST = 113; + public static readonly RECORD = 114; + public static readonly BOOL = 115; + public static readonly BYTES = 116; + public static readonly DOUBLE = 117; + public static readonly INT32 = 118; + public static readonly INT64 = 119; + public static readonly STRING = 120; + public static readonly UINT32 = 121; + public static readonly UINT64 = 122; + public static readonly TRUE = 123; + public static readonly FALSE = 124; + public static readonly NULL = 125; + public static readonly ARROW = 126; + public static readonly COLON = 127; + public static readonly SEMI = 128; + public static readonly COMMA = 129; + public static readonly DOT = 130; + public static readonly LBRACE = 131; + public static readonly RBRACE = 132; + public static readonly LBRACK = 133; + public static readonly RBRACK = 134; + public static readonly LPAREN = 135; + public static readonly RPAREN = 136; + public static readonly LT = 137; + public static readonly GT = 138; + public static readonly AMP = 139; + public static readonly EQUAL = 140; + public static readonly INTEGER = 141; + public static readonly JSON_NUMBER = 142; + public static readonly IDENTIFIER = 143; + public static readonly STRING_LITERAL = 144; + public static readonly LINE_COMMENT = 145; + public static readonly BLOCK_COMMENT = 146; + public static readonly WS = 147; public static readonly RULE_document = 0; public static readonly RULE_fragmentDecl = 1; public static readonly RULE_sourceImportDecl = 2; @@ -188,49 +189,51 @@ export class QuixosCapabilityParser extends antlr.Parser { public static readonly RULE_queryClause = 29; public static readonly RULE_packageOperationExport = 30; public static readonly RULE_packageFunctionExport = 31; - public static readonly RULE_executionClause = 32; - public static readonly RULE_selectedOperations = 33; - public static readonly RULE_packageConstructorExport = 34; - public static readonly RULE_eventClause = 35; - public static readonly RULE_operationMode = 36; - public static readonly RULE_receiverRequirement = 37; - public static readonly RULE_identifierList = 38; - public static readonly RULE_dependencyBlock = 39; - public static readonly RULE_dependencyPort = 40; - public static readonly RULE_primitiveList = 41; - public static readonly RULE_primitive = 42; - public static readonly RULE_sharedAttachmentDecl = 43; - public static readonly RULE_attachmentDecl = 44; - public static readonly RULE_stateDecl = 45; - public static readonly RULE_storagePolicy = 46; - public static readonly RULE_edgeDecl = 47; - public static readonly RULE_edgeEndpoint = 48; - public static readonly RULE_conformanceDecl = 49; - public static readonly RULE_conformanceItem = 50; - public static readonly RULE_initializationDecl = 51; - public static readonly RULE_initializationField = 52; - public static readonly RULE_creationOwnerMapping = 53; - public static readonly RULE_stateFieldBindingDecl = 54; - public static readonly RULE_relationshipMaterializationDecl = 55; - public static readonly RULE_operationBindingDecl = 56; - public static readonly RULE_memberOperationRef = 57; - public static readonly RULE_operationName = 58; - public static readonly RULE_operationProvider = 59; - public static readonly RULE_statePrimitive = 60; - public static readonly RULE_edgePrimitive = 61; - public static readonly RULE_dependencyBindingBlock = 62; - public static readonly RULE_dependencyBinding = 63; - public static readonly RULE_constructorBindingDecl = 64; - public static readonly RULE_valueType = 65; - public static readonly RULE_recordField = 66; - public static readonly RULE_scalarType = 67; - public static readonly RULE_cardinality = 68; - public static readonly RULE_jsonLiteral = 69; - public static readonly RULE_jsonObject = 70; - public static readonly RULE_jsonMember = 71; - public static readonly RULE_jsonArray = 72; - public static readonly RULE_identifier = 73; - public static readonly RULE_stringLiteral = 74; + public static readonly RULE_acceptanceClause = 32; + public static readonly RULE_executionClause = 33; + public static readonly RULE_selectedOperations = 34; + public static readonly RULE_packageConstructorExport = 35; + public static readonly RULE_eventClause = 36; + public static readonly RULE_operationMode = 37; + public static readonly RULE_receiverRequirement = 38; + public static readonly RULE_identifierList = 39; + public static readonly RULE_dependencyBlock = 40; + public static readonly RULE_dependencyPort = 41; + public static readonly RULE_primitiveList = 42; + public static readonly RULE_primitive = 43; + public static readonly RULE_sharedAttachmentDecl = 44; + public static readonly RULE_attachmentDecl = 45; + public static readonly RULE_stateDecl = 46; + public static readonly RULE_storagePolicy = 47; + public static readonly RULE_edgeDecl = 48; + public static readonly RULE_edgeEndpoint = 49; + public static readonly RULE_conformanceDecl = 50; + public static readonly RULE_conformanceItem = 51; + public static readonly RULE_initializationDecl = 52; + public static readonly RULE_initializationField = 53; + public static readonly RULE_creationOwnerMapping = 54; + public static readonly RULE_stateFieldBindingDecl = 55; + public static readonly RULE_relationshipMaterializationDecl = 56; + public static readonly RULE_operationBindingDecl = 57; + public static readonly RULE_memberOperationRef = 58; + public static readonly RULE_operationName = 59; + public static readonly RULE_operationProvider = 60; + public static readonly RULE_acceptanceBinding = 61; + public static readonly RULE_statePrimitive = 62; + public static readonly RULE_edgePrimitive = 63; + public static readonly RULE_dependencyBindingBlock = 64; + public static readonly RULE_dependencyBinding = 65; + public static readonly RULE_constructorBindingDecl = 66; + public static readonly RULE_valueType = 67; + public static readonly RULE_recordField = 68; + public static readonly RULE_scalarType = 69; + public static readonly RULE_cardinality = 70; + public static readonly RULE_jsonLiteral = 71; + public static readonly RULE_jsonObject = 72; + public static readonly RULE_jsonMember = 73; + public static readonly RULE_jsonArray = 74; + public static readonly RULE_identifier = 75; + public static readonly RULE_stringLiteral = 76; public static readonly literalNames = [ null, "'edit'", "'creation'", "'initialize'", "'workspace'", "'execution'", @@ -244,9 +247,9 @@ export class QuixosCapabilityParser extends antlr.Parser { "'value'", "'relation'", "'operation'", "'function'", "'constructor'", "'constructs'", "'input'", "'conform'", "'as'", "'bind'", "'static'", "'to'", "'private'", "'shared'", "'state'", "'edge'", "'projection'", - "'with'", "'using'", "'via'", "'materialize'", "'if'", "'absent'", - "'on'", "'policy'", "'default'", "'source'", "'repository'", "'commit'", - "'revision'", "'semantic-major'", "'on-delete'", "'retain-other'", + "'with'", "'using'", "'accept'", "'via'", "'materialize'", "'if'", + "'absent'", "'on'", "'policy'", "'default'", "'source'", "'repository'", + "'commit'", "'revision'", "'semantic-major'", "'on-delete'", "'retain-other'", "'keyed'", "'public-traversal'", "'id'", "'doc'", "'mode'", "'emits'", "'receiver'", "'requires'", "'any'", "'get'", "'set'", "'watch'", "'start'", "'stop'", "'read'", "'write'", "'resolve'", "'connect'", @@ -270,20 +273,21 @@ export class QuixosCapabilityParser extends antlr.Parser { "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", "PRIVATE", "SHARED", - "STATE", "EDGE", "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", - "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", - "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", "RETAIN_OTHER", - "KEYED", "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", "EMITS", "RECEIVER", - "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", - "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", - "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", - "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", - "MESSAGE", "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", - "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", - "UINT64", "TRUE", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", - "DOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", - "LT", "GT", "AMP", "EQUAL", "INTEGER", "JSON_NUMBER", "IDENTIFIER", - "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", "WS" + "STATE", "EDGE", "PROJECTION", "WITH", "USING", "ACCEPT", "VIA", + "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", + "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", + "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", + "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", + "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", + "WATCH_START", "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "REGISTER", + "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", + "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", + "OPTIONAL", "LIST", "RECORD", "BOOL", "BYTES", "DOUBLE", "INT32", + "INT64", "STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", + "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", + "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "AMP", "EQUAL", "INTEGER", + "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", + "WS" ]; public static readonly ruleNames = [ "document", "fragmentDecl", "sourceImportDecl", "workspaceDecl", @@ -294,14 +298,15 @@ export class QuixosCapabilityParser extends antlr.Parser { "valueMemberOperation", "relationshipMember", "queryReadContract", "relationshipOperation", "targetConstraint", "packageResourceDecl", "packageExport", "packageQuery", "packageQuerySpecialization", "queryClause", - "packageOperationExport", "packageFunctionExport", "executionClause", - "selectedOperations", "packageConstructorExport", "eventClause", - "operationMode", "receiverRequirement", "identifierList", "dependencyBlock", - "dependencyPort", "primitiveList", "primitive", "sharedAttachmentDecl", - "attachmentDecl", "stateDecl", "storagePolicy", "edgeDecl", "edgeEndpoint", - "conformanceDecl", "conformanceItem", "initializationDecl", "initializationField", - "creationOwnerMapping", "stateFieldBindingDecl", "relationshipMaterializationDecl", - "operationBindingDecl", "memberOperationRef", "operationName", "operationProvider", + "packageOperationExport", "packageFunctionExport", "acceptanceClause", + "executionClause", "selectedOperations", "packageConstructorExport", + "eventClause", "operationMode", "receiverRequirement", "identifierList", + "dependencyBlock", "dependencyPort", "primitiveList", "primitive", + "sharedAttachmentDecl", "attachmentDecl", "stateDecl", "storagePolicy", + "edgeDecl", "edgeEndpoint", "conformanceDecl", "conformanceItem", + "initializationDecl", "initializationField", "creationOwnerMapping", + "stateFieldBindingDecl", "relationshipMaterializationDecl", "operationBindingDecl", + "memberOperationRef", "operationName", "operationProvider", "acceptanceBinding", "statePrimitive", "edgePrimitive", "dependencyBindingBlock", "dependencyBinding", "constructorBindingDecl", "valueType", "recordField", "scalarType", "cardinality", "jsonLiteral", "jsonObject", "jsonMember", "jsonArray", @@ -326,42 +331,42 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new DocumentContext(this.context, this.state); this.enterRule(localContext, 0, QuixosCapabilityParser.RULE_document); try { - this.state = 162; + this.state = 166; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 0, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 150; + this.state = 154; this.workspaceDecl(); - this.state = 151; + this.state = 155; this.match(QuixosCapabilityParser.EOF); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 153; + this.state = 157; this.interfaceResourceDecl(); - this.state = 154; + this.state = 158; this.match(QuixosCapabilityParser.EOF); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 156; + this.state = 160; this.packageResourceDecl(); - this.state = 157; + this.state = 161; this.match(QuixosCapabilityParser.EOF); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 159; + this.state = 163; this.fragmentDecl(); - this.state = 160; + this.state = 164; this.match(QuixosCapabilityParser.EOF); } break; @@ -387,25 +392,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 164; + this.state = 168; this.match(QuixosCapabilityParser.FRAGMENT); - this.state = 165; - this.match(QuixosCapabilityParser.LBRACE); this.state = 169; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 173; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (((((_la - 30)) & ~0x1F) === 0 && ((1 << (_la - 30)) & 34144577) !== 0)) { { { - this.state = 166; + this.state = 170; this.workspaceItem(); } } - this.state = 171; + this.state = 175; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 172; + this.state = 176; this.match(QuixosCapabilityParser.RBRACE); } } @@ -428,11 +433,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 174; + this.state = 178; this.match(QuixosCapabilityParser.IMPORT); - this.state = 175; + this.state = 179; this.stringLiteral(); - this.state = 176; + this.state = 180; this.match(QuixosCapabilityParser.SEMI); } } @@ -456,39 +461,39 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 178; - this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 179; - this.identifier(); - this.state = 180; - this.match(QuixosCapabilityParser.ID); - this.state = 181; - this.stringLiteral(); this.state = 182; - this.match(QuixosCapabilityParser.REVISION); + this.match(QuixosCapabilityParser.WORKSPACE); this.state = 183; - this.stringLiteral(); + this.identifier(); this.state = 184; - this.match(QuixosCapabilityParser.COMMIT); + this.match(QuixosCapabilityParser.ID); this.state = 185; this.stringLiteral(); this.state = 186; - this.match(QuixosCapabilityParser.LBRACE); + this.match(QuixosCapabilityParser.REVISION); + this.state = 187; + this.stringLiteral(); + this.state = 188; + this.match(QuixosCapabilityParser.COMMIT); + this.state = 189; + this.stringLiteral(); this.state = 190; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 194; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (((((_la - 30)) & ~0x1F) === 0 && ((1 << (_la - 30)) & 34144577) !== 0)) { { { - this.state = 187; + this.state = 191; this.workspaceItem(); } } - this.state = 192; + this.state = 196; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 193; + this.state = 197; this.match(QuixosCapabilityParser.RBRACE); } } @@ -509,55 +514,55 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new WorkspaceItemContext(this.context, this.state); this.enterRule(localContext, 8, QuixosCapabilityParser.RULE_workspaceItem); try { - this.state = 202; + this.state = 206; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 3, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 195; + this.state = 199; this.sourceImportDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 196; + this.state = 200; this.atomDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 197; + this.state = 201; this.resourceImportDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 198; + this.state = 202; this.sharedAttachmentDecl(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 199; + this.state = 203; this.conformanceDecl(); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 200; + this.state = 204; this.constructorBindingDecl(); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 201; + this.state = 205; this.typeAliasDecl(); } break; @@ -580,32 +585,32 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ResourceImportDeclContext(this.context, this.state); this.enterRule(localContext, 10, QuixosCapabilityParser.RULE_resourceImportDecl); try { - this.state = 214; + this.state = 218; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 4, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 204; + this.state = 208; this.match(QuixosCapabilityParser.IMPORT); - this.state = 205; + this.state = 209; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 206; + this.state = 210; this.identifier(); - this.state = 207; + this.state = 211; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 209; + this.state = 213; this.match(QuixosCapabilityParser.IMPORT); - this.state = 210; + this.state = 214; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 211; + this.state = 215; this.identifier(); - this.state = 212; + this.state = 216; this.match(QuixosCapabilityParser.SEMI); } break; @@ -630,17 +635,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 216; - this.match(QuixosCapabilityParser.EXTERNAL); - this.state = 217; - this.match(QuixosCapabilityParser.ATOM); - this.state = 218; - this.identifier(); - this.state = 219; - this.match(QuixosCapabilityParser.ID); this.state = 220; - this.stringLiteral(); + this.match(QuixosCapabilityParser.EXTERNAL); this.state = 221; + this.match(QuixosCapabilityParser.ATOM); + this.state = 222; + this.identifier(); + this.state = 223; + this.match(QuixosCapabilityParser.ID); + this.state = 224; + this.stringLiteral(); + this.state = 225; this.match(QuixosCapabilityParser.SEMI); } } @@ -663,17 +668,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 223; - this.match(QuixosCapabilityParser.EXTERNAL); - this.state = 224; - this.match(QuixosCapabilityParser.INTERFACE); - this.state = 225; - this.identifier(); - this.state = 226; - this.match(QuixosCapabilityParser.REVISION); this.state = 227; - this.stringLiteral(); + this.match(QuixosCapabilityParser.EXTERNAL); this.state = 228; + this.match(QuixosCapabilityParser.INTERFACE); + this.state = 229; + this.identifier(); + this.state = 230; + this.match(QuixosCapabilityParser.REVISION); + this.state = 231; + this.stringLiteral(); + this.state = 232; this.match(QuixosCapabilityParser.SEMI); } } @@ -694,34 +699,34 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ResourcePreambleContext(this.context, this.state); this.enterRule(localContext, 16, QuixosCapabilityParser.RULE_resourcePreamble); try { - this.state = 234; + this.state = 238; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 5, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 230; + this.state = 234; this.resourceImportDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 231; + this.state = 235; this.externalAtomDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 232; + this.state = 236; this.externalInterfaceDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 233; + this.state = 237; this.typeAliasDecl(); } break; @@ -747,27 +752,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 236; + this.state = 240; this.match(QuixosCapabilityParser.ATOM); - this.state = 237; + this.state = 241; this.identifier(); - this.state = 238; - this.match(QuixosCapabilityParser.ID); - this.state = 239; - this.stringLiteral(); this.state = 242; + this.match(QuixosCapabilityParser.ID); + this.state = 243; + this.stringLiteral(); + this.state = 246; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 78) { + if (_la === 79) { { - this.state = 240; + this.state = 244; this.match(QuixosCapabilityParser.DOC); - this.state = 241; + this.state = 245; this.stringLiteral(); } } - this.state = 244; + this.state = 248; this.match(QuixosCapabilityParser.SEMI); } } @@ -791,87 +796,87 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 249; + this.state = 253; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (((((_la - 30)) & ~0x1F) === 0 && ((1 << (_la - 30)) & 193) !== 0)) { { { - this.state = 246; + this.state = 250; this.resourcePreamble(); } } - this.state = 251; + this.state = 255; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 252; + this.state = 256; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 253; + this.state = 257; this.identifier(); - this.state = 255; + this.state = 259; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 136) { + if (_la === 137) { { - this.state = 254; + this.state = 258; this.typeParameters(); } } - this.state = 257; + this.state = 261; this.match(QuixosCapabilityParser.ID); - this.state = 258; + this.state = 262; this.stringLiteral(); - this.state = 259; + this.state = 263; this.match(QuixosCapabilityParser.REVISION); - this.state = 260; + this.state = 264; this.stringLiteral(); - this.state = 270; + this.state = 274; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 82) { + if (_la === 83) { { - this.state = 261; + this.state = 265; this.match(QuixosCapabilityParser.REQUIRES); - this.state = 262; + this.state = 266; this.interfaceType(); - this.state = 267; + this.state = 271; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 128) { + while (_la === 129) { { { - this.state = 263; + this.state = 267; this.match(QuixosCapabilityParser.COMMA); - this.state = 264; + this.state = 268; this.interfaceType(); } } - this.state = 269; + this.state = 273; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 272; - this.match(QuixosCapabilityParser.LBRACE); this.state = 276; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 280; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (((((_la - 27)) & ~0x1F) === 0 && ((1 << (_la - 27)) & 33783809) !== 0)) { { { - this.state = 273; + this.state = 277; this.interfaceMember(); } } - this.state = 278; + this.state = 282; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 279; + this.state = 283; this.match(QuixosCapabilityParser.RBRACE); } } @@ -895,27 +900,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 281; + this.state = 285; this.match(QuixosCapabilityParser.LT); - this.state = 282; + this.state = 286; this.typeParameter(); - this.state = 287; + this.state = 291; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 128) { + while (_la === 129) { { { - this.state = 283; + this.state = 287; this.match(QuixosCapabilityParser.COMMA); - this.state = 284; + this.state = 288; this.typeParameter(); } } - this.state = 289; + this.state = 293; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 290; + this.state = 294; this.match(QuixosCapabilityParser.GT); } } @@ -937,24 +942,24 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 24, QuixosCapabilityParser.RULE_typeParameter); let _la: number; try { - this.state = 311; + this.state = 315; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.VALUE: this.enterOuterAlt(localContext, 1); { - this.state = 292; - this.match(QuixosCapabilityParser.VALUE); - this.state = 293; - this.identifier(); this.state = 296; + this.match(QuixosCapabilityParser.VALUE); + this.state = 297; + this.identifier(); + this.state = 300; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 126) { + if (_la === 127) { { - this.state = 294; + this.state = 298; this.match(QuixosCapabilityParser.COLON); - this.state = 295; + this.state = 299; this.match(QuixosCapabilityParser.STORABLE); } } @@ -964,32 +969,32 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 2); { - this.state = 298; + this.state = 302; this.match(QuixosCapabilityParser.OBJECT); - this.state = 299; + this.state = 303; this.identifier(); - this.state = 309; + this.state = 313; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 33) { { - this.state = 300; + this.state = 304; this.match(QuixosCapabilityParser.IMPLEMENTS); - this.state = 301; + this.state = 305; this.interfaceType(); - this.state = 306; + this.state = 310; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 138) { + while (_la === 139) { { { - this.state = 302; + this.state = 306; this.match(QuixosCapabilityParser.AMP); - this.state = 303; + this.state = 307; this.interfaceType(); } } - this.state = 308; + this.state = 312; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } @@ -1022,14 +1027,14 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 313; + this.state = 317; this.identifier(); - this.state = 315; + this.state = 319; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 136) { + if (_la === 137) { { - this.state = 314; + this.state = 318; this.typeArguments(); } } @@ -1056,27 +1061,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 317; + this.state = 321; this.match(QuixosCapabilityParser.LT); - this.state = 318; + this.state = 322; this.typeArgument(); - this.state = 323; + this.state = 327; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 128) { + while (_la === 129) { { { - this.state = 319; + this.state = 323; this.match(QuixosCapabilityParser.COMMA); - this.state = 320; + this.state = 324; this.typeArgument(); } } - this.state = 325; + this.state = 329; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 326; + this.state = 330; this.match(QuixosCapabilityParser.GT); } } @@ -1097,33 +1102,33 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new TypeArgumentContext(this.context, this.state); this.enterRule(localContext, 30, QuixosCapabilityParser.RULE_typeArgument); try { - this.state = 335; + this.state = 339; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 1); { - this.state = 328; + this.state = 332; this.match(QuixosCapabilityParser.ATOM); - this.state = 329; + this.state = 333; this.identifier(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 2); { - this.state = 330; + this.state = 334; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 331; + this.state = 335; this.interfaceType(); } break; case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 332; + this.state = 336; this.match(QuixosCapabilityParser.OBJECT); - this.state = 333; + this.state = 337; this.identifier(); } break; @@ -1179,7 +1184,7 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 4); { - this.state = 334; + this.state = 338; this.valueType(); } break; @@ -1207,25 +1212,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 337; + this.state = 341; this.match(QuixosCapabilityParser.TYPE); - this.state = 338; + this.state = 342; this.identifier(); - this.state = 340; + this.state = 344; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 136) { + if (_la === 137) { { - this.state = 339; + this.state = 343; this.typeParameters(); } } - this.state = 342; + this.state = 346; this.match(QuixosCapabilityParser.EQUAL); - this.state = 343; + this.state = 347; this.valueType(); - this.state = 344; + this.state = 348; this.match(QuixosCapabilityParser.SEMI); } } @@ -1246,27 +1251,27 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new InterfaceMemberContext(this.context, this.state); this.enterRule(localContext, 34, QuixosCapabilityParser.RULE_interfaceMember); try { - this.state = 349; + this.state = 353; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 21, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 346; + this.state = 350; this.valueMember(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 347; + this.state = 351; this.relationshipMember(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 348; + this.state = 352; this.operationMember(); } break; @@ -1292,53 +1297,53 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 352; + this.state = 356; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 52) { { - this.state = 351; + this.state = 355; this.match(QuixosCapabilityParser.STATIC); } } - this.state = 354; - this.match(QuixosCapabilityParser.OPERATION); - this.state = 355; - this.identifier(); - this.state = 356; - this.match(QuixosCapabilityParser.ID); - this.state = 357; - this.stringLiteral(); this.state = 358; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.OPERATION); this.state = 359; - this.valueType(); + this.identifier(); this.state = 360; - this.match(QuixosCapabilityParser.ARROW); - this.state = 361; - this.valueType(); - this.state = 362; - this.match(QuixosCapabilityParser.LBRACE); - this.state = 363; - this.match(QuixosCapabilityParser.CALL); - this.state = 364; this.match(QuixosCapabilityParser.ID); - this.state = 365; + this.state = 361; this.stringLiteral(); + this.state = 362; + this.match(QuixosCapabilityParser.COLON); + this.state = 363; + this.valueType(); + this.state = 364; + this.match(QuixosCapabilityParser.ARROW); + this.state = 365; + this.valueType(); + this.state = 366; + this.match(QuixosCapabilityParser.LBRACE); this.state = 367; + this.match(QuixosCapabilityParser.CALL); + this.state = 368; + this.match(QuixosCapabilityParser.ID); + this.state = 369; + this.stringLiteral(); + this.state = 371; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 5) { { - this.state = 366; + this.state = 370; this.executionClause(); } } - this.state = 369; + this.state = 373; this.match(QuixosCapabilityParser.SEMI); - this.state = 370; + this.state = 374; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1362,45 +1367,45 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 373; + this.state = 377; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 27) { { - this.state = 372; + this.state = 376; this.queryReadContract(); } } - this.state = 375; - this.match(QuixosCapabilityParser.VALUE); - this.state = 376; - this.identifier(); - this.state = 377; - this.match(QuixosCapabilityParser.ID); - this.state = 378; - this.stringLiteral(); this.state = 379; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.VALUE); this.state = 380; - this.valueType(); + this.identifier(); this.state = 381; - this.match(QuixosCapabilityParser.LBRACE); + this.match(QuixosCapabilityParser.ID); + this.state = 382; + this.stringLiteral(); + this.state = 383; + this.match(QuixosCapabilityParser.COLON); + this.state = 384; + this.valueType(); this.state = 385; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 389; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 1 || ((((_la - 84)) & ~0x1F) === 0 && ((1 << (_la - 84)) & 7) !== 0)) { + while (_la === 1 || ((((_la - 85)) & ~0x1F) === 0 && ((1 << (_la - 85)) & 7) !== 0)) { { { - this.state = 382; + this.state = 386; this.valueMemberOperation(); } } - this.state = 387; + this.state = 391; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 388; + this.state = 392; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1422,96 +1427,96 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 40, QuixosCapabilityParser.RULE_valueMemberOperation); let _la: number; try { - this.state = 423; + this.state = 427; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.GET: this.enterOuterAlt(localContext, 1); { - this.state = 390; - this.match(QuixosCapabilityParser.GET); - this.state = 391; - this.match(QuixosCapabilityParser.ID); - this.state = 392; - this.stringLiteral(); this.state = 394; + this.match(QuixosCapabilityParser.GET); + this.state = 395; + this.match(QuixosCapabilityParser.ID); + this.state = 396; + this.stringLiteral(); + this.state = 398; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 5) { { - this.state = 393; + this.state = 397; this.executionClause(); } } - this.state = 396; + this.state = 400; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.SET: this.enterOuterAlt(localContext, 2); { - this.state = 398; - this.match(QuixosCapabilityParser.SET); - this.state = 399; - this.match(QuixosCapabilityParser.ID); - this.state = 400; - this.stringLiteral(); this.state = 402; + this.match(QuixosCapabilityParser.SET); + this.state = 403; + this.match(QuixosCapabilityParser.ID); + this.state = 404; + this.stringLiteral(); + this.state = 406; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 5) { { - this.state = 401; + this.state = 405; this.executionClause(); } } - this.state = 404; + this.state = 408; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.EDIT: this.enterOuterAlt(localContext, 3); { - this.state = 406; - this.match(QuixosCapabilityParser.EDIT); - this.state = 407; - this.match(QuixosCapabilityParser.ID); - this.state = 408; - this.stringLiteral(); this.state = 410; + this.match(QuixosCapabilityParser.EDIT); + this.state = 411; + this.match(QuixosCapabilityParser.ID); + this.state = 412; + this.stringLiteral(); + this.state = 414; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 5) { { - this.state = 409; + this.state = 413; this.executionClause(); } } - this.state = 412; + this.state = 416; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 4); { - this.state = 414; - this.match(QuixosCapabilityParser.WATCH); - this.state = 415; - this.match(QuixosCapabilityParser.START); - this.state = 416; - this.match(QuixosCapabilityParser.ID); - this.state = 417; - this.stringLiteral(); this.state = 418; - this.match(QuixosCapabilityParser.STOP); + this.match(QuixosCapabilityParser.WATCH); this.state = 419; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.START); this.state = 420; - this.stringLiteral(); + this.match(QuixosCapabilityParser.ID); this.state = 421; + this.stringLiteral(); + this.state = 422; + this.match(QuixosCapabilityParser.STOP); + this.state = 423; + this.match(QuixosCapabilityParser.ID); + this.state = 424; + this.stringLiteral(); + this.state = 425; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1539,69 +1544,69 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 426; + this.state = 430; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 27) { { - this.state = 425; + this.state = 429; this.queryReadContract(); } } - this.state = 428; - this.match(QuixosCapabilityParser.RELATION); - this.state = 429; - this.identifier(); - this.state = 430; - this.match(QuixosCapabilityParser.ID); - this.state = 431; - this.stringLiteral(); this.state = 432; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.RELATION); this.state = 433; - this.cardinality(); + this.identifier(); this.state = 434; - this.targetConstraint(); + this.match(QuixosCapabilityParser.ID); + this.state = 435; + this.stringLiteral(); this.state = 436; + this.match(QuixosCapabilityParser.COLON); + this.state = 437; + this.cardinality(); + this.state = 438; + this.targetConstraint(); + this.state = 440; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 105) { + if (_la === 106) { { - this.state = 435; + this.state = 439; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 440; + this.state = 444; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 75) { + if (_la === 76) { { - this.state = 438; + this.state = 442; this.match(QuixosCapabilityParser.KEYED); - this.state = 439; + this.state = 443; this.stringLiteral(); } } - this.state = 442; - this.match(QuixosCapabilityParser.LBRACE); this.state = 446; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 450; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 86)) & ~0x1F) === 0 && ((1 << (_la - 86)) & 225) !== 0)) { + while (((((_la - 87)) & ~0x1F) === 0 && ((1 << (_la - 87)) & 225) !== 0)) { { { - this.state = 443; + this.state = 447; this.relationshipOperation(); } } - this.state = 448; + this.state = 452; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 449; + this.state = 453; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1625,14 +1630,14 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 451; + this.state = 455; this.match(QuixosCapabilityParser.QUERYABLE); - this.state = 453; + this.state = 457; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10 || _la === 28) { { - this.state = 452; + this.state = 456; _la = this.tokenStream.LA(1); if(!(_la === 10 || _la === 28)) { this.errorHandler.recoverInline(this); @@ -1664,96 +1669,96 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 46, QuixosCapabilityParser.RULE_relationshipOperation); let _la: number; try { - this.state = 488; + this.state = 492; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.RESOLVE: this.enterOuterAlt(localContext, 1); { - this.state = 455; - this.match(QuixosCapabilityParser.RESOLVE); - this.state = 456; - this.match(QuixosCapabilityParser.ID); - this.state = 457; - this.stringLiteral(); this.state = 459; + this.match(QuixosCapabilityParser.RESOLVE); + this.state = 460; + this.match(QuixosCapabilityParser.ID); + this.state = 461; + this.stringLiteral(); + this.state = 463; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 5) { { - this.state = 458; + this.state = 462; this.executionClause(); } } - this.state = 461; + this.state = 465; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONNECT: this.enterOuterAlt(localContext, 2); { - this.state = 463; - this.match(QuixosCapabilityParser.CONNECT); - this.state = 464; - this.match(QuixosCapabilityParser.ID); - this.state = 465; - this.stringLiteral(); this.state = 467; + this.match(QuixosCapabilityParser.CONNECT); + this.state = 468; + this.match(QuixosCapabilityParser.ID); + this.state = 469; + this.stringLiteral(); + this.state = 471; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 5) { { - this.state = 466; + this.state = 470; this.executionClause(); } } - this.state = 469; + this.state = 473; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.DISCONNECT: this.enterOuterAlt(localContext, 3); { - this.state = 471; - this.match(QuixosCapabilityParser.DISCONNECT); - this.state = 472; - this.match(QuixosCapabilityParser.ID); - this.state = 473; - this.stringLiteral(); this.state = 475; + this.match(QuixosCapabilityParser.DISCONNECT); + this.state = 476; + this.match(QuixosCapabilityParser.ID); + this.state = 477; + this.stringLiteral(); + this.state = 479; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 5) { { - this.state = 474; + this.state = 478; this.executionClause(); } } - this.state = 477; + this.state = 481; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 4); { - this.state = 479; - this.match(QuixosCapabilityParser.WATCH); - this.state = 480; - this.match(QuixosCapabilityParser.START); - this.state = 481; - this.match(QuixosCapabilityParser.ID); - this.state = 482; - this.stringLiteral(); this.state = 483; - this.match(QuixosCapabilityParser.STOP); + this.match(QuixosCapabilityParser.WATCH); this.state = 484; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.START); this.state = 485; - this.stringLiteral(); + this.match(QuixosCapabilityParser.ID); this.state = 486; + this.stringLiteral(); + this.state = 487; + this.match(QuixosCapabilityParser.STOP); + this.state = 488; + this.match(QuixosCapabilityParser.ID); + this.state = 489; + this.stringLiteral(); + this.state = 490; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1779,31 +1784,31 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 48, QuixosCapabilityParser.RULE_targetConstraint); let _la: number; try { - this.state = 499; + this.state = 503; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 1); { - this.state = 490; + this.state = 494; this.match(QuixosCapabilityParser.ATOM); - this.state = 491; + this.state = 495; this.identifier(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 2); { - this.state = 492; + this.state = 496; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 493; + this.state = 497; this.identifier(); - this.state = 495; + this.state = 499; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 136) { + if (_la === 137) { { - this.state = 494; + this.state = 498; this.typeArguments(); } } @@ -1813,9 +1818,9 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 497; + this.state = 501; this.match(QuixosCapabilityParser.OBJECT); - this.state = 498; + this.state = 502; this.identifier(); } break; @@ -1843,61 +1848,61 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 504; + this.state = 508; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (((((_la - 30)) & ~0x1F) === 0 && ((1 << (_la - 30)) & 193) !== 0)) { { { - this.state = 501; + this.state = 505; this.resourcePreamble(); } } - this.state = 506; + this.state = 510; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 507; - this.match(QuixosCapabilityParser.PACKAGE); - this.state = 508; - this.identifier(); - this.state = 509; - this.match(QuixosCapabilityParser.ID); - this.state = 510; - this.stringLiteral(); this.state = 511; - this.match(QuixosCapabilityParser.REVISION); + this.match(QuixosCapabilityParser.PACKAGE); this.state = 512; + this.identifier(); + this.state = 513; + this.match(QuixosCapabilityParser.ID); + this.state = 514; this.stringLiteral(); this.state = 515; + this.match(QuixosCapabilityParser.REVISION); + this.state = 516; + this.stringLiteral(); + this.state = 519; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 72) { + if (_la === 73) { { - this.state = 513; + this.state = 517; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); - this.state = 514; + this.state = 518; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 517; - this.match(QuixosCapabilityParser.LBRACE); this.state = 521; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 525; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (((((_la - 17)) & ~0x1F) === 0 && ((1 << (_la - 17)) & 939524097) !== 0)) { { { - this.state = 518; + this.state = 522; this.packageExport(); } } - this.state = 523; + this.state = 527; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 524; + this.state = 528; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1918,41 +1923,41 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new PackageExportContext(this.context, this.state); this.enterRule(localContext, 52, QuixosCapabilityParser.RULE_packageExport); try { - this.state = 531; + this.state = 535; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 44, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 526; + this.state = 530; this.packageOperationExport(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 527; + this.state = 531; this.packageFunctionExport(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 528; + this.state = 532; this.packageConstructorExport(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 529; + this.state = 533; this.packageQuery(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 530; + this.state = 534; this.packageQuerySpecialization(); } break; @@ -1978,63 +1983,63 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 533; + this.state = 537; this.match(QuixosCapabilityParser.QUERY); - this.state = 534; + this.state = 538; this.identifier(); - this.state = 536; + this.state = 540; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 136) { + if (_la === 137) { { - this.state = 535; + this.state = 539; this.typeParameters(); } } - this.state = 538; - this.match(QuixosCapabilityParser.ID); - this.state = 539; - this.stringLiteral(); - this.state = 540; - this.match(QuixosCapabilityParser.ROOT); this.state = 542; + this.match(QuixosCapabilityParser.ID); + this.state = 543; + this.stringLiteral(); + this.state = 544; + this.match(QuixosCapabilityParser.ROOT); + this.state = 546; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 4) { { - this.state = 541; + this.state = 545; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 544; - this.interfaceType(); - this.state = 545; - this.match(QuixosCapabilityParser.DOCUMENT); - this.state = 546; - this.stringLiteral(); - this.state = 547; - this.match(QuixosCapabilityParser.OPERATION); this.state = 548; - this.stringLiteral(); + this.interfaceType(); this.state = 549; - this.match(QuixosCapabilityParser.LBRACE); + this.match(QuixosCapabilityParser.DOCUMENT); + this.state = 550; + this.stringLiteral(); + this.state = 551; + this.match(QuixosCapabilityParser.OPERATION); + this.state = 552; + this.stringLiteral(); this.state = 553; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 557; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 130029568) !== 0) || _la === 86) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 130029568) !== 0) || _la === 87) { { { - this.state = 550; + this.state = 554; this.queryClause(); } } - this.state = 555; + this.state = 559; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 556; + this.state = 560; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2057,21 +2062,21 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 558; - this.match(QuixosCapabilityParser.QUERY); - this.state = 559; - this.identifier(); - this.state = 560; - this.match(QuixosCapabilityParser.ID); - this.state = 561; - this.stringLiteral(); this.state = 562; - this.match(QuixosCapabilityParser.SPECIALIZE); + this.match(QuixosCapabilityParser.QUERY); this.state = 563; this.identifier(); this.state = 564; - this.typeArguments(); + this.match(QuixosCapabilityParser.ID); this.state = 565; + this.stringLiteral(); + this.state = 566; + this.match(QuixosCapabilityParser.SPECIALIZE); + this.state = 567; + this.identifier(); + this.state = 568; + this.typeArguments(); + this.state = 569; this.match(QuixosCapabilityParser.SEMI); } } @@ -2093,118 +2098,118 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 58, QuixosCapabilityParser.RULE_queryClause); let _la: number; try { - this.state = 607; + this.state = 611; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REPLICA: this.enterOuterAlt(localContext, 1); { - this.state = 567; + this.state = 571; this.match(QuixosCapabilityParser.REPLICA); - this.state = 568; + this.state = 572; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.LOCAL: this.enterOuterAlt(localContext, 2); { - this.state = 569; + this.state = 573; this.match(QuixosCapabilityParser.LOCAL); - this.state = 570; + this.state = 574; this.match(QuixosCapabilityParser.FROM); - this.state = 571; + this.state = 575; this.identifier(); - this.state = 572; + this.state = 576; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.FRAGMENTS: this.enterOuterAlt(localContext, 3); { - this.state = 574; + this.state = 578; this.match(QuixosCapabilityParser.FRAGMENTS); - this.state = 575; + this.state = 579; this.stringLiteral(); - this.state = 576; + this.state = 580; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.VIEW: this.enterOuterAlt(localContext, 4); { - this.state = 578; + this.state = 582; this.match(QuixosCapabilityParser.VIEW); - this.state = 580; + this.state = 584; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 31) { { - this.state = 579; + this.state = 583; this.match(QuixosCapabilityParser.OBJECT); } } - this.state = 582; + this.state = 586; this.identifier(); - this.state = 583; + this.state = 587; this.match(QuixosCapabilityParser.AS); - this.state = 584; + this.state = 588; this.interfaceType(); - this.state = 585; + this.state = 589; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.MAX: this.enterOuterAlt(localContext, 5); { - this.state = 587; + this.state = 591; this.match(QuixosCapabilityParser.MAX); - this.state = 588; + this.state = 592; this.identifier(); - this.state = 589; + this.state = 593; this.match(QuixosCapabilityParser.INTEGER); - this.state = 590; + this.state = 594; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.ALLOW: this.enterOuterAlt(localContext, 6); { - this.state = 592; - this.match(QuixosCapabilityParser.ALLOW); - this.state = 593; - this.interfaceType(); - this.state = 594; - this.match(QuixosCapabilityParser.DOT); - this.state = 595; - this.identifier(); this.state = 596; - this.identifier(); + this.match(QuixosCapabilityParser.ALLOW); this.state = 597; - this.stringLiteral(); + this.interfaceType(); this.state = 598; + this.match(QuixosCapabilityParser.DOT); + this.state = 599; + this.identifier(); + this.state = 600; + this.identifier(); + this.state = 601; + this.stringLiteral(); + this.state = 602; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 7); { - this.state = 600; + this.state = 604; this.match(QuixosCapabilityParser.WATCH); - this.state = 601; + this.state = 605; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.POLL: this.enterOuterAlt(localContext, 8); { - this.state = 602; + this.state = 606; this.match(QuixosCapabilityParser.POLL); - this.state = 603; + this.state = 607; this.match(QuixosCapabilityParser.INTEGER); - this.state = 604; + this.state = 608; this.stringLiteral(); - this.state = 605; + this.state = 609; this.match(QuixosCapabilityParser.SEMI); } break; @@ -2232,71 +2237,81 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 609; + this.state = 613; this.match(QuixosCapabilityParser.OPERATION); - this.state = 610; + this.state = 614; this.identifier(); - this.state = 612; + this.state = 616; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 136) { + if (_la === 137) { { - this.state = 611; + this.state = 615; this.typeParameters(); } } - this.state = 614; - this.match(QuixosCapabilityParser.ID); - this.state = 615; - this.stringLiteral(); - this.state = 616; - this.match(QuixosCapabilityParser.COLON); - this.state = 617; - this.valueType(); this.state = 618; - this.match(QuixosCapabilityParser.ARROW); + this.match(QuixosCapabilityParser.ID); this.state = 619; - this.valueType(); + this.stringLiteral(); this.state = 620; - this.match(QuixosCapabilityParser.MODE); + this.match(QuixosCapabilityParser.COLON); this.state = 621; - this.operationMode(); + this.valueType(); + this.state = 622; + this.match(QuixosCapabilityParser.ARROW); this.state = 623; + this.valueType(); + this.state = 624; + this.match(QuixosCapabilityParser.MODE); + this.state = 625; + this.operationMode(); + this.state = 627; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 5) { { - this.state = 622; + this.state = 626; this.executionClause(); } } - this.state = 626; + this.state = 630; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 80) { + if (_la === 81) { { - this.state = 625; + this.state = 629; this.eventClause(); } } - this.state = 628; + this.state = 632; this.match(QuixosCapabilityParser.RECEIVER); - this.state = 629; + this.state = 633; this.receiverRequirement(); - this.state = 631; + this.state = 635; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 82) { + if (_la === 83) { { - this.state = 630; + this.state = 634; this.dependencyBlock(); } } - this.state = 633; + this.state = 638; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 61) { + { + this.state = 637; + this.acceptanceClause(); + } + } + + this.state = 640; this.match(QuixosCapabilityParser.SEMI); } } @@ -2320,53 +2335,63 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 635; + this.state = 642; this.match(QuixosCapabilityParser.FUNCTION); - this.state = 636; + this.state = 643; this.identifier(); - this.state = 638; + this.state = 645; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 136) { + if (_la === 137) { { - this.state = 637; + this.state = 644; this.typeParameters(); } } - this.state = 640; - this.match(QuixosCapabilityParser.ID); - this.state = 641; - this.stringLiteral(); - this.state = 642; - this.match(QuixosCapabilityParser.COLON); - this.state = 643; - this.valueType(); - this.state = 644; - this.match(QuixosCapabilityParser.ARROW); - this.state = 645; - this.valueType(); this.state = 647; + this.match(QuixosCapabilityParser.ID); + this.state = 648; + this.stringLiteral(); + this.state = 649; + this.match(QuixosCapabilityParser.COLON); + this.state = 650; + this.valueType(); + this.state = 651; + this.match(QuixosCapabilityParser.ARROW); + this.state = 652; + this.valueType(); + this.state = 654; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 5) { { - this.state = 646; + this.state = 653; this.executionClause(); } } - this.state = 650; + this.state = 657; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 82) { + if (_la === 83) { { - this.state = 649; + this.state = 656; this.dependencyBlock(); } } - this.state = 652; + this.state = 660; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 61) { + { + this.state = 659; + this.acceptanceClause(); + } + } + + this.state = 662; this.match(QuixosCapabilityParser.SEMI); } } @@ -2383,29 +2408,56 @@ export class QuixosCapabilityParser extends antlr.Parser { } return localContext; } + public acceptanceClause(): AcceptanceClauseContext { + let localContext = new AcceptanceClauseContext(this.context, this.state); + this.enterRule(localContext, 64, QuixosCapabilityParser.RULE_acceptanceClause); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 664; + this.match(QuixosCapabilityParser.ACCEPT); + this.state = 665; + this.match(QuixosCapabilityParser.USING); + this.state = 666; + this.identifier(); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } public executionClause(): ExecutionClauseContext { let localContext = new ExecutionClauseContext(this.context, this.state); - this.enterRule(localContext, 64, QuixosCapabilityParser.RULE_executionClause); + this.enterRule(localContext, 66, QuixosCapabilityParser.RULE_executionClause); let _la: number; try { - this.state = 663; + this.state = 677; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 57, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 59, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 654; + this.state = 668; this.match(QuixosCapabilityParser.EXECUTION); - this.state = 655; + this.state = 669; this.match(QuixosCapabilityParser.REMOTE); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 656; + this.state = 670; this.match(QuixosCapabilityParser.EXECUTION); - this.state = 657; + this.state = 671; _la = this.tokenStream.LA(1); if(!(_la === 6 || _la === 7)) { this.errorHandler.recoverInline(this); @@ -2414,13 +2466,13 @@ export class QuixosCapabilityParser extends antlr.Parser { this.errorHandler.reportMatch(this); this.consume(); } - this.state = 658; + this.state = 672; this.match(QuixosCapabilityParser.TARGETS); - this.state = 659; + this.state = 673; this.match(QuixosCapabilityParser.LBRACK); - this.state = 660; + this.state = 674; this.identifierList(); - this.state = 661; + this.state = 675; this.match(QuixosCapabilityParser.RBRACK); } break; @@ -2441,34 +2493,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public selectedOperations(): SelectedOperationsContext { let localContext = new SelectedOperationsContext(this.context, this.state); - this.enterRule(localContext, 66, QuixosCapabilityParser.RULE_selectedOperations); + this.enterRule(localContext, 68, QuixosCapabilityParser.RULE_selectedOperations); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 665; + this.state = 679; this.match(QuixosCapabilityParser.USING); - this.state = 666; + this.state = 680; this.match(QuixosCapabilityParser.LBRACK); - this.state = 667; + this.state = 681; this.memberOperationRef(); - this.state = 672; + this.state = 686; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 128) { + while (_la === 129) { { { - this.state = 668; + this.state = 682; this.match(QuixosCapabilityParser.COMMA); - this.state = 669; + this.state = 683; this.memberOperationRef(); } } - this.state = 674; + this.state = 688; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 675; + this.state = 689; this.match(QuixosCapabilityParser.RBRACK); } } @@ -2487,38 +2539,38 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageConstructorExport(): PackageConstructorExportContext { let localContext = new PackageConstructorExportContext(this.context, this.state); - this.enterRule(localContext, 68, QuixosCapabilityParser.RULE_packageConstructorExport); + this.enterRule(localContext, 70, QuixosCapabilityParser.RULE_packageConstructorExport); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 677; + this.state = 691; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 678; + this.state = 692; this.identifier(); - this.state = 679; + this.state = 693; this.match(QuixosCapabilityParser.ID); - this.state = 680; + this.state = 694; this.stringLiteral(); - this.state = 681; + this.state = 695; this.match(QuixosCapabilityParser.CONSTRUCTS); - this.state = 682; + this.state = 696; this.identifier(); - this.state = 683; + this.state = 697; this.match(QuixosCapabilityParser.COLON); - this.state = 684; + this.state = 698; this.valueType(); - this.state = 686; + this.state = 700; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 82) { + if (_la === 83) { { - this.state = 685; + this.state = 699; this.dependencyBlock(); } } - this.state = 688; + this.state = 702; this.match(QuixosCapabilityParser.SEMI); } } @@ -2537,13 +2589,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public eventClause(): EventClauseContext { let localContext = new EventClauseContext(this.context, this.state); - this.enterRule(localContext, 70, QuixosCapabilityParser.RULE_eventClause); + this.enterRule(localContext, 72, QuixosCapabilityParser.RULE_eventClause); try { this.enterOuterAlt(localContext, 1); { - this.state = 690; + this.state = 704; this.match(QuixosCapabilityParser.EMITS); - this.state = 691; + this.state = 705; this.valueType(); } } @@ -2562,14 +2614,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationMode(): OperationModeContext { let localContext = new OperationModeContext(this.context, this.state); - this.enterRule(localContext, 72, QuixosCapabilityParser.RULE_operationMode); + this.enterRule(localContext, 74, QuixosCapabilityParser.RULE_operationMode); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 693; + this.state = 707; _la = this.tokenStream.LA(1); - if(!(((((_la - 94)) & ~0x1F) === 0 && ((1 << (_la - 94)) & 31) !== 0))) { + if(!(((((_la - 95)) & ~0x1F) === 0 && ((1 << (_la - 95)) & 31) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2593,71 +2645,71 @@ export class QuixosCapabilityParser extends antlr.Parser { } public receiverRequirement(): ReceiverRequirementContext { let localContext = new ReceiverRequirementContext(this.context, this.state); - this.enterRule(localContext, 74, QuixosCapabilityParser.RULE_receiverRequirement); + this.enterRule(localContext, 76, QuixosCapabilityParser.RULE_receiverRequirement); let _la: number; try { - this.state = 713; + this.state = 727; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ANY: this.enterOuterAlt(localContext, 1); { - this.state = 695; + this.state = 709; this.match(QuixosCapabilityParser.ANY); } break; case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 2); { - this.state = 696; + this.state = 710; this.match(QuixosCapabilityParser.ATOM); - this.state = 697; + this.state = 711; this.identifier(); } break; case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 698; + this.state = 712; this.match(QuixosCapabilityParser.OBJECT); - this.state = 699; + this.state = 713; this.identifier(); } break; case QuixosCapabilityParser.INTERFACES: this.enterOuterAlt(localContext, 4); { - this.state = 700; + this.state = 714; this.match(QuixosCapabilityParser.INTERFACES); - this.state = 701; + this.state = 715; this.match(QuixosCapabilityParser.LBRACK); - this.state = 710; + this.state = 724; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 68 || ((((_la - 87)) & ~0x1F) === 0 && ((1 << (_la - 87)) & 4099) !== 0) || _la === 142) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 4099) !== 0) || _la === 143) { { - this.state = 702; + this.state = 716; this.interfaceType(); - this.state = 707; + this.state = 721; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 128) { + while (_la === 129) { { { - this.state = 703; + this.state = 717; this.match(QuixosCapabilityParser.COMMA); - this.state = 704; + this.state = 718; this.interfaceType(); } } - this.state = 709; + this.state = 723; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 712; + this.state = 726; this.match(QuixosCapabilityParser.RBRACK); } break; @@ -2680,26 +2732,26 @@ export class QuixosCapabilityParser extends antlr.Parser { } public identifierList(): IdentifierListContext { let localContext = new IdentifierListContext(this.context, this.state); - this.enterRule(localContext, 76, QuixosCapabilityParser.RULE_identifierList); + this.enterRule(localContext, 78, QuixosCapabilityParser.RULE_identifierList); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 715; + this.state = 729; this.identifier(); - this.state = 720; + this.state = 734; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 128) { + while (_la === 129) { { { - this.state = 716; + this.state = 730; this.match(QuixosCapabilityParser.COMMA); - this.state = 717; + this.state = 731; this.identifier(); } } - this.state = 722; + this.state = 736; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } @@ -2720,30 +2772,30 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBlock(): DependencyBlockContext { let localContext = new DependencyBlockContext(this.context, this.state); - this.enterRule(localContext, 78, QuixosCapabilityParser.RULE_dependencyBlock); + this.enterRule(localContext, 80, QuixosCapabilityParser.RULE_dependencyBlock); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 723; + this.state = 737; this.match(QuixosCapabilityParser.REQUIRES); - this.state = 724; + this.state = 738; this.match(QuixosCapabilityParser.LBRACE); - this.state = 728; + this.state = 742; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 393220) !== 0) || ((((_la - 39)) & ~0x1F) === 0 && ((1 << (_la - 39)) & 393345) !== 0)) { { { - this.state = 725; + this.state = 739; this.dependencyPort(); } } - this.state = 730; + this.state = 744; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 731; + this.state = 745; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2762,121 +2814,82 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyPort(): DependencyPortContext { let localContext = new DependencyPortContext(this.context, this.state); - this.enterRule(localContext, 80, QuixosCapabilityParser.RULE_dependencyPort); + this.enterRule(localContext, 82, QuixosCapabilityParser.RULE_dependencyPort); let _la: number; try { - this.state = 807; + this.state = 821; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REFLECTION: this.enterOuterAlt(localContext, 1); { - this.state = 733; + this.state = 747; this.match(QuixosCapabilityParser.REFLECTION); - this.state = 734; + this.state = 748; this.identifier(); - this.state = 735; + this.state = 749; this.match(QuixosCapabilityParser.ID); - this.state = 736; + this.state = 750; this.stringLiteral(); - this.state = 737; + this.state = 751; this.match(QuixosCapabilityParser.LBRACK); - this.state = 738; + this.state = 752; this.identifierList(); - this.state = 739; + this.state = 753; this.match(QuixosCapabilityParser.RBRACK); - this.state = 740; + this.state = 754; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 2); { - this.state = 742; + this.state = 756; this.match(QuixosCapabilityParser.STATE); - this.state = 743; + this.state = 757; this.identifier(); - this.state = 744; + this.state = 758; this.match(QuixosCapabilityParser.ID); - this.state = 745; + this.state = 759; this.stringLiteral(); - this.state = 746; + this.state = 760; this.match(QuixosCapabilityParser.COLON); - this.state = 747; + this.state = 761; this.valueType(); - this.state = 748; + this.state = 762; this.primitiveList(); - this.state = 749; + this.state = 763; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 3); { - this.state = 751; + this.state = 765; this.match(QuixosCapabilityParser.EDGE); - this.state = 752; + this.state = 766; this.identifier(); - this.state = 753; + this.state = 767; this.match(QuixosCapabilityParser.ID); - this.state = 754; + this.state = 768; this.stringLiteral(); - this.state = 755; + this.state = 769; this.match(QuixosCapabilityParser.COLON); - this.state = 756; + this.state = 770; this.cardinality(); - this.state = 757; + this.state = 771; this.targetConstraint(); - this.state = 758; + this.state = 772; this.primitiveList(); - this.state = 759; + this.state = 773; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 4); { - this.state = 761; - this.match(QuixosCapabilityParser.INTERFACE); - this.state = 762; - this.identifier(); - this.state = 763; - this.match(QuixosCapabilityParser.ID); - this.state = 764; - this.stringLiteral(); - this.state = 765; - this.match(QuixosCapabilityParser.COLON); - this.state = 766; - this.identifier(); - this.state = 768; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 136) { - { - this.state = 767; - this.typeArguments(); - } - } - - this.state = 771; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 60) { - { - this.state = 770; - this.selectedOperations(); - } - } - - this.state = 773; - this.match(QuixosCapabilityParser.SEMI); - } - break; - case QuixosCapabilityParser.CREATION: - this.enterOuterAlt(localContext, 5); - { this.state = 775; - this.match(QuixosCapabilityParser.CREATION); + this.match(QuixosCapabilityParser.INTERFACE); this.state = 776; this.identifier(); this.state = 777; @@ -2887,65 +2900,104 @@ export class QuixosCapabilityParser extends antlr.Parser { this.match(QuixosCapabilityParser.COLON); this.state = 780; this.identifier(); - this.state = 781; - this.match(QuixosCapabilityParser.INPUT); this.state = 782; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 137) { + { + this.state = 781; + this.typeArguments(); + } + } + + this.state = 785; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 60) { + { + this.state = 784; + this.selectedOperations(); + } + } + + this.state = 787; + this.match(QuixosCapabilityParser.SEMI); + } + break; + case QuixosCapabilityParser.CREATION: + this.enterOuterAlt(localContext, 5); + { + this.state = 789; + this.match(QuixosCapabilityParser.CREATION); + this.state = 790; + this.identifier(); + this.state = 791; + this.match(QuixosCapabilityParser.ID); + this.state = 792; + this.stringLiteral(); + this.state = 793; + this.match(QuixosCapabilityParser.COLON); + this.state = 794; + this.identifier(); + this.state = 795; + this.match(QuixosCapabilityParser.INPUT); + this.state = 796; this.valueType(); - this.state = 783; + this.state = 797; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONSTRUCTOR: this.enterOuterAlt(localContext, 6); { - this.state = 785; + this.state = 799; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 786; + this.state = 800; this.identifier(); - this.state = 787; + this.state = 801; this.match(QuixosCapabilityParser.ID); - this.state = 788; + this.state = 802; this.stringLiteral(); - this.state = 789; + this.state = 803; this.match(QuixosCapabilityParser.COLON); - this.state = 790; + this.state = 804; this.identifier(); - this.state = 793; + this.state = 807; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 48) { { - this.state = 791; + this.state = 805; this.match(QuixosCapabilityParser.INPUT); - this.state = 792; + this.state = 806; this.valueType(); } } - this.state = 795; + this.state = 809; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.QUERY: this.enterOuterAlt(localContext, 7); { - this.state = 797; + this.state = 811; this.match(QuixosCapabilityParser.QUERY); - this.state = 798; + this.state = 812; this.identifier(); - this.state = 799; + this.state = 813; this.match(QuixosCapabilityParser.ID); - this.state = 800; + this.state = 814; this.stringLiteral(); - this.state = 801; + this.state = 815; this.match(QuixosCapabilityParser.COLON); - this.state = 802; + this.state = 816; this.identifier(); - this.state = 803; + this.state = 817; this.match(QuixosCapabilityParser.DOT); - this.state = 804; + this.state = 818; this.identifier(); - this.state = 805; + this.state = 819; this.match(QuixosCapabilityParser.SEMI); } break; @@ -2968,32 +3020,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public primitiveList(): PrimitiveListContext { let localContext = new PrimitiveListContext(this.context, this.state); - this.enterRule(localContext, 82, QuixosCapabilityParser.RULE_primitiveList); + this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_primitiveList); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 809; + this.state = 823; this.match(QuixosCapabilityParser.LBRACK); - this.state = 810; + this.state = 824; this.primitive(); - this.state = 815; + this.state = 829; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 128) { + while (_la === 129) { { { - this.state = 811; + this.state = 825; this.match(QuixosCapabilityParser.COMMA); - this.state = 812; + this.state = 826; this.primitive(); } } - this.state = 817; + this.state = 831; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 818; + this.state = 832; this.match(QuixosCapabilityParser.RBRACK); } } @@ -3012,14 +3064,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public primitive(): PrimitiveContext { let localContext = new PrimitiveContext(this.context, this.state); - this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_primitive); + this.enterRule(localContext, 86, QuixosCapabilityParser.RULE_primitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 820; + this.state = 834; _la = this.tokenStream.LA(1); - if(!(_la === 1 || ((((_la - 89)) & ~0x1F) === 0 && ((1 << (_la - 89)) & 223) !== 0))) { + if(!(_la === 1 || ((((_la - 90)) & ~0x1F) === 0 && ((1 << (_la - 90)) & 223) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -3043,13 +3095,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public sharedAttachmentDecl(): SharedAttachmentDeclContext { let localContext = new SharedAttachmentDeclContext(this.context, this.state); - this.enterRule(localContext, 86, QuixosCapabilityParser.RULE_sharedAttachmentDecl); + this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_sharedAttachmentDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 822; + this.state = 836; this.match(QuixosCapabilityParser.SHARED); - this.state = 823; + this.state = 837; this.attachmentDecl(); } } @@ -3068,22 +3120,22 @@ export class QuixosCapabilityParser extends antlr.Parser { } public attachmentDecl(): AttachmentDeclContext { let localContext = new AttachmentDeclContext(this.context, this.state); - this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_attachmentDecl); + this.enterRule(localContext, 90, QuixosCapabilityParser.RULE_attachmentDecl); try { - this.state = 827; + this.state = 841; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 825; + this.state = 839; this.stateDecl(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 826; + this.state = 840; this.edgeDecl(); } break; @@ -3106,44 +3158,44 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stateDecl(): StateDeclContext { let localContext = new StateDeclContext(this.context, this.state); - this.enterRule(localContext, 90, QuixosCapabilityParser.RULE_stateDecl); + this.enterRule(localContext, 92, QuixosCapabilityParser.RULE_stateDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 829; + this.state = 843; this.match(QuixosCapabilityParser.STATE); - this.state = 830; + this.state = 844; this.identifier(); - this.state = 831; + this.state = 845; this.match(QuixosCapabilityParser.ID); - this.state = 832; + this.state = 846; this.stringLiteral(); - this.state = 833; + this.state = 847; this.match(QuixosCapabilityParser.ON); - this.state = 834; + this.state = 848; this.identifier(); - this.state = 835; + this.state = 849; this.match(QuixosCapabilityParser.COLON); - this.state = 836; + this.state = 850; this.valueType(); - this.state = 837; + this.state = 851; this.match(QuixosCapabilityParser.POLICY); - this.state = 838; + this.state = 852; this.storagePolicy(); - this.state = 841; + this.state = 855; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 67) { + if (_la === 68) { { - this.state = 839; + this.state = 853; this.match(QuixosCapabilityParser.DEFAULT); - this.state = 840; + this.state = 854; this.jsonLiteral(); } } - this.state = 843; + this.state = 857; this.match(QuixosCapabilityParser.SEMI); } } @@ -3162,28 +3214,28 @@ export class QuixosCapabilityParser extends antlr.Parser { } public storagePolicy(): StoragePolicyContext { let localContext = new StoragePolicyContext(this.context, this.state); - this.enterRule(localContext, 92, QuixosCapabilityParser.RULE_storagePolicy); + this.enterRule(localContext, 94, QuixosCapabilityParser.RULE_storagePolicy); try { - this.state = 851; + this.state = 865; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REGISTER: this.enterOuterAlt(localContext, 1); { - this.state = 845; + this.state = 859; this.match(QuixosCapabilityParser.REGISTER); } break; case QuixosCapabilityParser.CRDT: this.enterOuterAlt(localContext, 2); { - this.state = 846; + this.state = 860; this.match(QuixosCapabilityParser.CRDT); - this.state = 847; + this.state = 861; this.match(QuixosCapabilityParser.LPAREN); - this.state = 848; + this.state = 862; this.valueType(); - this.state = 849; + this.state = 863; this.match(QuixosCapabilityParser.RPAREN); } break; @@ -3206,25 +3258,25 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgeDecl(): EdgeDeclContext { let localContext = new EdgeDeclContext(this.context, this.state); - this.enterRule(localContext, 94, QuixosCapabilityParser.RULE_edgeDecl); + this.enterRule(localContext, 96, QuixosCapabilityParser.RULE_edgeDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 853; + this.state = 867; this.match(QuixosCapabilityParser.EDGE); - this.state = 854; + this.state = 868; this.identifier(); - this.state = 855; + this.state = 869; this.match(QuixosCapabilityParser.ID); - this.state = 856; + this.state = 870; this.stringLiteral(); - this.state = 857; + this.state = 871; this.match(QuixosCapabilityParser.LBRACE); - this.state = 858; + this.state = 872; this.edgeEndpoint(); - this.state = 859; + this.state = 873; this.edgeEndpoint(); - this.state = 860; + this.state = 874; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3243,78 +3295,78 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgeEndpoint(): EdgeEndpointContext { let localContext = new EdgeEndpointContext(this.context, this.state); - this.enterRule(localContext, 96, QuixosCapabilityParser.RULE_edgeEndpoint); + this.enterRule(localContext, 98, QuixosCapabilityParser.RULE_edgeEndpoint); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 862; + this.state = 876; this.targetConstraint(); - this.state = 863; + this.state = 877; this.match(QuixosCapabilityParser.PROJECTION); - this.state = 864; + this.state = 878; this.identifier(); - this.state = 865; + this.state = 879; this.match(QuixosCapabilityParser.ID); - this.state = 866; + this.state = 880; this.stringLiteral(); - this.state = 867; + this.state = 881; this.cardinality(); - this.state = 869; + this.state = 883; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 105) { + if (_la === 106) { { - this.state = 868; + this.state = 882; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 873; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 73) { - { - this.state = 871; - this.match(QuixosCapabilityParser.ON_DELETE); - this.state = 872; - this.stringLiteral(); - } - } - - this.state = 876; + this.state = 887; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 74) { { - this.state = 875; - this.match(QuixosCapabilityParser.RETAIN_OTHER); - } - } - - this.state = 880; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 75) { - { - this.state = 878; - this.match(QuixosCapabilityParser.KEYED); - this.state = 879; + this.state = 885; + this.match(QuixosCapabilityParser.ON_DELETE); + this.state = 886; this.stringLiteral(); } } - this.state = 883; + this.state = 890; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 75) { + { + this.state = 889; + this.match(QuixosCapabilityParser.RETAIN_OTHER); + } + } + + this.state = 894; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 76) { { - this.state = 882; + this.state = 892; + this.match(QuixosCapabilityParser.KEYED); + this.state = 893; + this.stringLiteral(); + } + } + + this.state = 897; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 77) { + { + this.state = 896; this.match(QuixosCapabilityParser.PUBLIC_TRAVERSAL); } } - this.state = 885; + this.state = 899; this.match(QuixosCapabilityParser.SEMI); } } @@ -3333,70 +3385,70 @@ export class QuixosCapabilityParser extends antlr.Parser { } public conformanceDecl(): ConformanceDeclContext { let localContext = new ConformanceDeclContext(this.context, this.state); - this.enterRule(localContext, 98, QuixosCapabilityParser.RULE_conformanceDecl); + this.enterRule(localContext, 100, QuixosCapabilityParser.RULE_conformanceDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 887; + this.state = 901; this.match(QuixosCapabilityParser.CONFORM); - this.state = 888; + this.state = 902; this.identifier(); - this.state = 889; + this.state = 903; this.match(QuixosCapabilityParser.AS); - this.state = 890; + this.state = 904; this.identifier(); - this.state = 892; + this.state = 906; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 136) { + if (_la === 137) { { - this.state = 891; + this.state = 905; this.typeArguments(); } } - this.state = 896; + this.state = 910; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 77) { + if (_la === 78) { { - this.state = 894; + this.state = 908; this.match(QuixosCapabilityParser.ID); - this.state = 895; + this.state = 909; this.stringLiteral(); } } - this.state = 900; + this.state = 914; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 72) { + if (_la === 73) { { - this.state = 898; + this.state = 912; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); - this.state = 899; + this.state = 913; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 902; + this.state = 916; this.match(QuixosCapabilityParser.LBRACE); - this.state = 906; + this.state = 920; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 3 || ((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & 2057) !== 0)) { + while (_la === 3 || ((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & 4105) !== 0)) { { { - this.state = 903; + this.state = 917; this.conformanceItem(); } } - this.state = 908; + this.state = 922; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 909; + this.state = 923; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3415,45 +3467,45 @@ export class QuixosCapabilityParser extends antlr.Parser { } public conformanceItem(): ConformanceItemContext { let localContext = new ConformanceItemContext(this.context, this.state); - this.enterRule(localContext, 100, QuixosCapabilityParser.RULE_conformanceItem); + this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_conformanceItem); try { - this.state = 917; + this.state = 931; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 82, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 84, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 911; + this.state = 925; this.match(QuixosCapabilityParser.PRIVATE); - this.state = 912; + this.state = 926; this.attachmentDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 913; + this.state = 927; this.operationBindingDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 914; + this.state = 928; this.stateFieldBindingDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 915; + this.state = 929; this.initializationDecl(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 916; + this.state = 930; this.relationshipMaterializationDecl(); } break; @@ -3474,32 +3526,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public initializationDecl(): InitializationDeclContext { let localContext = new InitializationDeclContext(this.context, this.state); - this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_initializationDecl); + this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_initializationDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 919; + this.state = 933; this.match(QuixosCapabilityParser.INITIALIZE); - this.state = 920; + this.state = 934; this.match(QuixosCapabilityParser.LBRACE); - this.state = 924; + this.state = 938; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 68 || ((((_la - 87)) & ~0x1F) === 0 && ((1 << (_la - 87)) & 4099) !== 0) || _la === 142) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 4099) !== 0) || _la === 143) { { { - this.state = 921; + this.state = 935; this.initializationField(); } } - this.state = 926; + this.state = 940; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 927; + this.state = 941; this.match(QuixosCapabilityParser.RBRACE); - this.state = 928; + this.state = 942; this.match(QuixosCapabilityParser.SEMI); } } @@ -3518,42 +3570,42 @@ export class QuixosCapabilityParser extends antlr.Parser { } public initializationField(): InitializationFieldContext { let localContext = new InitializationFieldContext(this.context, this.state); - this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_initializationField); + this.enterRule(localContext, 106, QuixosCapabilityParser.RULE_initializationField); try { - this.state = 944; + this.state = 958; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 84, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 86, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 930; + this.state = 944; this.identifier(); - this.state = 931; + this.state = 945; this.match(QuixosCapabilityParser.TO); - this.state = 932; + this.state = 946; this.match(QuixosCapabilityParser.STATE); - this.state = 933; + this.state = 947; this.identifier(); - this.state = 934; + this.state = 948; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 936; + this.state = 950; this.identifier(); - this.state = 937; + this.state = 951; this.match(QuixosCapabilityParser.TO); - this.state = 938; + this.state = 952; this.match(QuixosCapabilityParser.EDGE); - this.state = 939; + this.state = 953; this.identifier(); - this.state = 940; + this.state = 954; this.match(QuixosCapabilityParser.DOT); - this.state = 941; + this.state = 955; this.identifier(); - this.state = 942; + this.state = 956; this.match(QuixosCapabilityParser.SEMI); } break; @@ -3574,34 +3626,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public creationOwnerMapping(): CreationOwnerMappingContext { let localContext = new CreationOwnerMappingContext(this.context, this.state); - this.enterRule(localContext, 106, QuixosCapabilityParser.RULE_creationOwnerMapping); + this.enterRule(localContext, 108, QuixosCapabilityParser.RULE_creationOwnerMapping); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 946; + this.state = 960; this.interfaceType(); - this.state = 947; + this.state = 961; this.match(QuixosCapabilityParser.FROM); - this.state = 948; + this.state = 962; this.match(QuixosCapabilityParser.INPUT); - this.state = 953; + this.state = 967; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 129) { + while (_la === 130) { { { - this.state = 949; + this.state = 963; this.match(QuixosCapabilityParser.DOT); - this.state = 950; + this.state = 964; this.identifier(); } } - this.state = 955; + this.state = 969; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 956; + this.state = 970; this.match(QuixosCapabilityParser.SEMI); } } @@ -3620,65 +3672,18 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stateFieldBindingDecl(): StateFieldBindingDeclContext { let localContext = new StateFieldBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 108, QuixosCapabilityParser.RULE_stateFieldBindingDecl); + this.enterRule(localContext, 110, QuixosCapabilityParser.RULE_stateFieldBindingDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 958; - this.match(QuixosCapabilityParser.BIND); - this.state = 959; - this.identifier(); - this.state = 960; - this.match(QuixosCapabilityParser.TO); - this.state = 961; - this.match(QuixosCapabilityParser.STATE); - this.state = 962; - this.identifier(); - this.state = 963; - this.match(QuixosCapabilityParser.SEMI); - } - } - catch (re) { - if (re instanceof antlr.RecognitionException) { - this.errorHandler.reportError(this, re); - this.errorHandler.recover(this, re); - } else { - throw re; - } - } - finally { - this.exitRule(); - } - return localContext; - } - public relationshipMaterializationDecl(): RelationshipMaterializationDeclContext { - let localContext = new RelationshipMaterializationDeclContext(this.context, this.state); - this.enterRule(localContext, 110, QuixosCapabilityParser.RULE_relationshipMaterializationDecl); - try { - this.enterOuterAlt(localContext, 1); - { - this.state = 965; - this.match(QuixosCapabilityParser.MATERIALIZE); - this.state = 966; - this.identifier(); - this.state = 967; - this.match(QuixosCapabilityParser.IF); - this.state = 968; - this.match(QuixosCapabilityParser.ABSENT); - this.state = 969; - this.match(QuixosCapabilityParser.USING); - this.state = 970; - this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 971; - this.identifier(); this.state = 972; - this.match(QuixosCapabilityParser.VIA); + this.match(QuixosCapabilityParser.BIND); this.state = 973; - this.match(QuixosCapabilityParser.EDGE); - this.state = 974; this.identifier(); + this.state = 974; + this.match(QuixosCapabilityParser.TO); this.state = 975; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.STATE); this.state = 976; this.identifier(); this.state = 977; @@ -3698,34 +3703,81 @@ export class QuixosCapabilityParser extends antlr.Parser { } return localContext; } - public operationBindingDecl(): OperationBindingDeclContext { - let localContext = new OperationBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 112, QuixosCapabilityParser.RULE_operationBindingDecl); - let _la: number; + public relationshipMaterializationDecl(): RelationshipMaterializationDeclContext { + let localContext = new RelationshipMaterializationDeclContext(this.context, this.state); + this.enterRule(localContext, 112, QuixosCapabilityParser.RULE_relationshipMaterializationDecl); try { this.enterOuterAlt(localContext, 1); { this.state = 979; - this.match(QuixosCapabilityParser.BIND); + this.match(QuixosCapabilityParser.MATERIALIZE); this.state = 980; - this.memberOperationRef(); + this.identifier(); this.state = 981; - this.match(QuixosCapabilityParser.TO); + this.match(QuixosCapabilityParser.IF); this.state = 982; - this.operationProvider(); + this.match(QuixosCapabilityParser.ABSENT); + this.state = 983; + this.match(QuixosCapabilityParser.USING); + this.state = 984; + this.match(QuixosCapabilityParser.CONSTRUCTOR); this.state = 985; + this.identifier(); + this.state = 986; + this.match(QuixosCapabilityParser.VIA); + this.state = 987; + this.match(QuixosCapabilityParser.EDGE); + this.state = 988; + this.identifier(); + this.state = 989; + this.match(QuixosCapabilityParser.DOT); + this.state = 990; + this.identifier(); + this.state = 991; + this.match(QuixosCapabilityParser.SEMI); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public operationBindingDecl(): OperationBindingDeclContext { + let localContext = new OperationBindingDeclContext(this.context, this.state); + this.enterRule(localContext, 114, QuixosCapabilityParser.RULE_operationBindingDecl); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 993; + this.match(QuixosCapabilityParser.BIND); + this.state = 994; + this.memberOperationRef(); + this.state = 995; + this.match(QuixosCapabilityParser.TO); + this.state = 996; + this.operationProvider(); + this.state = 999; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 29) { { - this.state = 983; + this.state = 997; this.match(QuixosCapabilityParser.QUERY_REASON); - this.state = 984; + this.state = 998; this.stringLiteral(); } } - this.state = 987; + this.state = 1001; this.match(QuixosCapabilityParser.SEMI); } } @@ -3744,15 +3796,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public memberOperationRef(): MemberOperationRefContext { let localContext = new MemberOperationRefContext(this.context, this.state); - this.enterRule(localContext, 114, QuixosCapabilityParser.RULE_memberOperationRef); + this.enterRule(localContext, 116, QuixosCapabilityParser.RULE_memberOperationRef); try { this.enterOuterAlt(localContext, 1); { - this.state = 989; + this.state = 1003; this.identifier(); - this.state = 990; + this.state = 1004; this.match(QuixosCapabilityParser.DOT); - this.state = 991; + this.state = 1005; this.operationName(); } } @@ -3771,92 +3823,92 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationName(): OperationNameContext { let localContext = new OperationNameContext(this.context, this.state); - this.enterRule(localContext, 116, QuixosCapabilityParser.RULE_operationName); + this.enterRule(localContext, 118, QuixosCapabilityParser.RULE_operationName); try { - this.state = 1005; + this.state = 1019; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 87, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 89, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 993; + this.state = 1007; this.identifier(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 994; + this.state = 1008; this.match(QuixosCapabilityParser.CALL); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 995; + this.state = 1009; this.match(QuixosCapabilityParser.GET); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 996; + this.state = 1010; this.match(QuixosCapabilityParser.SET); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 997; + this.state = 1011; this.match(QuixosCapabilityParser.EDIT); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 998; + this.state = 1012; this.match(QuixosCapabilityParser.RESOLVE); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 999; + this.state = 1013; this.match(QuixosCapabilityParser.CONNECT); } break; case 8: this.enterOuterAlt(localContext, 8); { - this.state = 1000; + this.state = 1014; this.match(QuixosCapabilityParser.DISCONNECT); } break; case 9: this.enterOuterAlt(localContext, 9); { - this.state = 1001; + this.state = 1015; this.match(QuixosCapabilityParser.WATCH_START); } break; case 10: this.enterOuterAlt(localContext, 10); { - this.state = 1002; + this.state = 1016; this.match(QuixosCapabilityParser.WATCH_STOP); } break; case 11: this.enterOuterAlt(localContext, 11); { - this.state = 1003; + this.state = 1017; this.match(QuixosCapabilityParser.SUBSCRIBE); } break; case 12: this.enterOuterAlt(localContext, 12); { - this.state = 1004; + this.state = 1018; this.match(QuixosCapabilityParser.UNSUBSCRIBE); } break; @@ -3877,96 +3929,106 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationProvider(): OperationProviderContext { let localContext = new OperationProviderContext(this.context, this.state); - this.enterRule(localContext, 118, QuixosCapabilityParser.RULE_operationProvider); + this.enterRule(localContext, 120, QuixosCapabilityParser.RULE_operationProvider); let _la: number; try { - this.state = 1037; + this.state = 1054; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 1007; + this.state = 1021; this.match(QuixosCapabilityParser.STATE); - this.state = 1008; + this.state = 1022; this.identifier(); - this.state = 1009; + this.state = 1023; this.match(QuixosCapabilityParser.DOT); - this.state = 1010; + this.state = 1024; this.statePrimitive(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 1012; + this.state = 1026; this.match(QuixosCapabilityParser.EDGE); - this.state = 1013; + this.state = 1027; this.identifier(); - this.state = 1014; + this.state = 1028; this.match(QuixosCapabilityParser.DOT); - this.state = 1015; + this.state = 1029; this.identifier(); - this.state = 1016; + this.state = 1030; this.match(QuixosCapabilityParser.DOT); - this.state = 1017; + this.state = 1031; this.edgePrimitive(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 3); { - this.state = 1019; + this.state = 1033; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 1020; + this.state = 1034; this.identifier(); - this.state = 1022; + this.state = 1036; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 136) { + if (_la === 137) { { - this.state = 1021; + this.state = 1035; this.typeArguments(); } } - this.state = 1024; + this.state = 1038; this.match(QuixosCapabilityParser.DOT); - this.state = 1025; + this.state = 1039; this.memberOperationRef(); } break; case QuixosCapabilityParser.PACKAGE: this.enterOuterAlt(localContext, 4); { - this.state = 1027; + this.state = 1041; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 1028; + this.state = 1042; this.identifier(); - this.state = 1029; + this.state = 1043; this.match(QuixosCapabilityParser.DOT); - this.state = 1030; + this.state = 1044; this.identifier(); - this.state = 1032; + this.state = 1046; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 136) { + if (_la === 137) { { - this.state = 1031; + this.state = 1045; this.typeArguments(); } } - this.state = 1035; + this.state = 1049; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 59) { { - this.state = 1034; + this.state = 1048; this.dependencyBindingBlock(); } } + this.state = 1052; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 61) { + { + this.state = 1051; + this.acceptanceBinding(); + } + } + } break; default: @@ -3986,16 +4048,41 @@ export class QuixosCapabilityParser extends antlr.Parser { } return localContext; } + public acceptanceBinding(): AcceptanceBindingContext { + let localContext = new AcceptanceBindingContext(this.context, this.state); + this.enterRule(localContext, 122, QuixosCapabilityParser.RULE_acceptanceBinding); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 1056; + this.match(QuixosCapabilityParser.ACCEPT); + this.state = 1057; + this.dependencyBindingBlock(); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } public statePrimitive(): StatePrimitiveContext { let localContext = new StatePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 120, QuixosCapabilityParser.RULE_statePrimitive); + this.enterRule(localContext, 124, QuixosCapabilityParser.RULE_statePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1039; + this.state = 1059; _la = this.tokenStream.LA(1); - if(!(_la === 1 || ((((_la - 89)) & ~0x1F) === 0 && ((1 << (_la - 89)) & 195) !== 0))) { + if(!(_la === 1 || ((((_la - 90)) & ~0x1F) === 0 && ((1 << (_la - 90)) & 195) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4019,14 +4106,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgePrimitive(): EdgePrimitiveContext { let localContext = new EdgePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 122, QuixosCapabilityParser.RULE_edgePrimitive); + this.enterRule(localContext, 126, QuixosCapabilityParser.RULE_edgePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1041; + this.state = 1061; _la = this.tokenStream.LA(1); - if(!(((((_la - 91)) & ~0x1F) === 0 && ((1 << (_la - 91)) & 55) !== 0))) { + if(!(((((_la - 92)) & ~0x1F) === 0 && ((1 << (_la - 92)) & 55) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4050,30 +4137,30 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBindingBlock(): DependencyBindingBlockContext { let localContext = new DependencyBindingBlockContext(this.context, this.state); - this.enterRule(localContext, 124, QuixosCapabilityParser.RULE_dependencyBindingBlock); + this.enterRule(localContext, 128, QuixosCapabilityParser.RULE_dependencyBindingBlock); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1043; + this.state = 1063; this.match(QuixosCapabilityParser.WITH); - this.state = 1044; + this.state = 1064; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1048; + this.state = 1068; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 68 || ((((_la - 87)) & ~0x1F) === 0 && ((1 << (_la - 87)) & 4099) !== 0) || _la === 142) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 4099) !== 0) || _la === 143) { { { - this.state = 1045; + this.state = 1065; this.dependencyBinding(); } } - this.state = 1050; + this.state = 1070; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1051; + this.state = 1071; this.match(QuixosCapabilityParser.RBRACE); } } @@ -4092,240 +4179,240 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBinding(): DependencyBindingContext { let localContext = new DependencyBindingContext(this.context, this.state); - this.enterRule(localContext, 126, QuixosCapabilityParser.RULE_dependencyBinding); + this.enterRule(localContext, 130, QuixosCapabilityParser.RULE_dependencyBinding); let _la: number; try { - this.state = 1149; + this.state = 1169; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 100, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 103, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1053; + this.state = 1073; this.identifier(); - this.state = 1054; + this.state = 1074; this.match(QuixosCapabilityParser.TO); - this.state = 1055; + this.state = 1075; this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 1056; + this.state = 1076; this.match(QuixosCapabilityParser.REFLECTION); - this.state = 1057; + this.state = 1077; this.match(QuixosCapabilityParser.LBRACK); - this.state = 1058; + this.state = 1078; this.identifierList(); - this.state = 1059; + this.state = 1079; this.match(QuixosCapabilityParser.RBRACK); - this.state = 1060; + this.state = 1080; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1062; + this.state = 1082; this.identifier(); - this.state = 1063; + this.state = 1083; this.match(QuixosCapabilityParser.TO); - this.state = 1064; + this.state = 1084; this.match(QuixosCapabilityParser.STATE); - this.state = 1065; + this.state = 1085; this.identifier(); - this.state = 1072; + this.state = 1092; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 61) { + if (_la === 62) { { - this.state = 1066; + this.state = 1086; this.match(QuixosCapabilityParser.VIA); - this.state = 1067; + this.state = 1087; this.match(QuixosCapabilityParser.EDGE); - this.state = 1068; + this.state = 1088; this.identifier(); - this.state = 1069; + this.state = 1089; this.match(QuixosCapabilityParser.DOT); - this.state = 1070; + this.state = 1090; this.identifier(); } } - this.state = 1074; + this.state = 1094; this.match(QuixosCapabilityParser.SEMI); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1076; + this.state = 1096; this.identifier(); - this.state = 1077; + this.state = 1097; this.match(QuixosCapabilityParser.TO); - this.state = 1078; + this.state = 1098; this.match(QuixosCapabilityParser.EDGE); - this.state = 1079; + this.state = 1099; this.identifier(); - this.state = 1080; + this.state = 1100; this.match(QuixosCapabilityParser.DOT); - this.state = 1081; + this.state = 1101; this.identifier(); - this.state = 1088; + this.state = 1108; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 61) { + if (_la === 62) { { - this.state = 1082; + this.state = 1102; this.match(QuixosCapabilityParser.VIA); - this.state = 1083; + this.state = 1103; this.match(QuixosCapabilityParser.EDGE); - this.state = 1084; + this.state = 1104; this.identifier(); - this.state = 1085; + this.state = 1105; this.match(QuixosCapabilityParser.DOT); - this.state = 1086; + this.state = 1106; this.identifier(); } } - this.state = 1090; + this.state = 1110; this.match(QuixosCapabilityParser.SEMI); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1092; + this.state = 1112; this.identifier(); - this.state = 1093; + this.state = 1113; this.match(QuixosCapabilityParser.TO); - this.state = 1094; + this.state = 1114; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 1095; + this.state = 1115; this.identifier(); - this.state = 1097; + this.state = 1117; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 136) { + if (_la === 137) { { - this.state = 1096; + this.state = 1116; this.typeArguments(); } } - this.state = 1105; + this.state = 1125; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 61) { + if (_la === 62) { { - this.state = 1099; + this.state = 1119; this.match(QuixosCapabilityParser.VIA); - this.state = 1100; + this.state = 1120; this.match(QuixosCapabilityParser.EDGE); - this.state = 1101; + this.state = 1121; this.identifier(); - this.state = 1102; + this.state = 1122; this.match(QuixosCapabilityParser.DOT); - this.state = 1103; + this.state = 1123; this.identifier(); } } - this.state = 1107; + this.state = 1127; this.match(QuixosCapabilityParser.SEMI); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1109; + this.state = 1129; this.identifier(); - this.state = 1110; + this.state = 1130; this.match(QuixosCapabilityParser.TO); - this.state = 1111; + this.state = 1131; this.match(QuixosCapabilityParser.CREATION); - this.state = 1112; + this.state = 1132; this.identifier(); - this.state = 1113; + this.state = 1133; this.match(QuixosCapabilityParser.WITH); - this.state = 1114; + this.state = 1134; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1118; + this.state = 1138; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 68 || ((((_la - 87)) & ~0x1F) === 0 && ((1 << (_la - 87)) & 4099) !== 0) || _la === 142) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 4099) !== 0) || _la === 143) { { { - this.state = 1115; + this.state = 1135; this.creationOwnerMapping(); } } - this.state = 1120; + this.state = 1140; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1121; + this.state = 1141; this.match(QuixosCapabilityParser.RBRACE); - this.state = 1122; + this.state = 1142; this.match(QuixosCapabilityParser.SEMI); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1124; + this.state = 1144; this.identifier(); - this.state = 1125; + this.state = 1145; this.match(QuixosCapabilityParser.TO); - this.state = 1126; + this.state = 1146; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1127; + this.state = 1147; this.identifier(); - this.state = 1128; + this.state = 1148; this.match(QuixosCapabilityParser.SEMI); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 1130; + this.state = 1150; this.identifier(); - this.state = 1131; + this.state = 1151; this.match(QuixosCapabilityParser.TO); - this.state = 1133; + this.state = 1153; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 4) { { - this.state = 1132; + this.state = 1152; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 1135; + this.state = 1155; this.match(QuixosCapabilityParser.QUERY); - this.state = 1136; + this.state = 1156; this.identifier(); - this.state = 1137; + this.state = 1157; this.match(QuixosCapabilityParser.DOT); - this.state = 1138; + this.state = 1158; this.identifier(); - this.state = 1145; + this.state = 1165; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 61) { + if (_la === 62) { { - this.state = 1139; + this.state = 1159; this.match(QuixosCapabilityParser.VIA); - this.state = 1140; + this.state = 1160; this.match(QuixosCapabilityParser.EDGE); - this.state = 1141; + this.state = 1161; this.identifier(); - this.state = 1142; + this.state = 1162; this.match(QuixosCapabilityParser.DOT); - this.state = 1143; + this.state = 1163; this.identifier(); } } - this.state = 1147; + this.state = 1167; this.match(QuixosCapabilityParser.SEMI); } break; @@ -4346,34 +4433,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public constructorBindingDecl(): ConstructorBindingDeclContext { let localContext = new ConstructorBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 128, QuixosCapabilityParser.RULE_constructorBindingDecl); + this.enterRule(localContext, 132, QuixosCapabilityParser.RULE_constructorBindingDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1151; + this.state = 1171; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1152; + this.state = 1172; this.identifier(); - this.state = 1153; + this.state = 1173; this.match(QuixosCapabilityParser.TO); - this.state = 1154; + this.state = 1174; this.identifier(); - this.state = 1155; + this.state = 1175; this.match(QuixosCapabilityParser.DOT); - this.state = 1156; + this.state = 1176; this.identifier(); - this.state = 1158; + this.state = 1178; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 59) { { - this.state = 1157; + this.state = 1177; this.dependencyBindingBlock(); } } - this.state = 1160; + this.state = 1180; this.match(QuixosCapabilityParser.SEMI); } } @@ -4392,10 +4479,10 @@ export class QuixosCapabilityParser extends antlr.Parser { } public valueType(): ValueTypeContext { let localContext = new ValueTypeContext(this.context, this.state); - this.enterRule(localContext, 130, QuixosCapabilityParser.RULE_valueType); + this.enterRule(localContext, 134, QuixosCapabilityParser.RULE_valueType); let _la: number; try { - this.state = 1208; + this.state = 1228; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.BOOL: @@ -4408,130 +4495,130 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.UINT64: this.enterOuterAlt(localContext, 1); { - this.state = 1162; + this.state = 1182; this.scalarType(); } break; case QuixosCapabilityParser.UNIT: this.enterOuterAlt(localContext, 2); { - this.state = 1163; + this.state = 1183; this.match(QuixosCapabilityParser.UNIT); } break; case QuixosCapabilityParser.WATCH_HANDLE: this.enterOuterAlt(localContext, 3); { - this.state = 1164; + this.state = 1184; this.match(QuixosCapabilityParser.WATCH_HANDLE); } break; case QuixosCapabilityParser.MESSAGE: this.enterOuterAlt(localContext, 4); { - this.state = 1165; + this.state = 1185; this.match(QuixosCapabilityParser.MESSAGE); - this.state = 1166; + this.state = 1186; this.stringLiteral(); } break; case QuixosCapabilityParser.ATOM_REF: this.enterOuterAlt(localContext, 5); { - this.state = 1167; + this.state = 1187; this.match(QuixosCapabilityParser.ATOM_REF); - this.state = 1168; + this.state = 1188; this.match(QuixosCapabilityParser.LT); - this.state = 1169; + this.state = 1189; this.identifier(); - this.state = 1170; + this.state = 1190; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.INTERFACE_REF: this.enterOuterAlt(localContext, 6); { - this.state = 1172; + this.state = 1192; this.match(QuixosCapabilityParser.INTERFACE_REF); - this.state = 1173; + this.state = 1193; this.match(QuixosCapabilityParser.LT); - this.state = 1174; + this.state = 1194; this.identifier(); - this.state = 1176; + this.state = 1196; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 136) { + if (_la === 137) { { - this.state = 1175; + this.state = 1195; this.typeArguments(); } } - this.state = 1178; + this.state = 1198; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.REF: this.enterOuterAlt(localContext, 7); { - this.state = 1180; + this.state = 1200; this.match(QuixosCapabilityParser.REF); - this.state = 1181; + this.state = 1201; this.match(QuixosCapabilityParser.LT); - this.state = 1182; + this.state = 1202; this.identifier(); - this.state = 1183; + this.state = 1203; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.OPTIONAL: this.enterOuterAlt(localContext, 8); { - this.state = 1185; + this.state = 1205; this.match(QuixosCapabilityParser.OPTIONAL); - this.state = 1186; + this.state = 1206; this.match(QuixosCapabilityParser.LT); - this.state = 1187; + this.state = 1207; this.valueType(); - this.state = 1188; + this.state = 1208; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.LIST: this.enterOuterAlt(localContext, 9); { - this.state = 1190; + this.state = 1210; this.match(QuixosCapabilityParser.LIST); - this.state = 1191; + this.state = 1211; this.match(QuixosCapabilityParser.LT); - this.state = 1192; + this.state = 1212; this.valueType(); - this.state = 1193; + this.state = 1213; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.RECORD: this.enterOuterAlt(localContext, 10); { - this.state = 1195; + this.state = 1215; this.match(QuixosCapabilityParser.RECORD); - this.state = 1196; + this.state = 1216; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1200; + this.state = 1220; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 68 || ((((_la - 87)) & ~0x1F) === 0 && ((1 << (_la - 87)) & 4099) !== 0) || _la === 142) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 4099) !== 0) || _la === 143) { { { - this.state = 1197; + this.state = 1217; this.recordField(); } } - this.state = 1202; + this.state = 1222; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1203; + this.state = 1223; this.match(QuixosCapabilityParser.RBRACE); } break; @@ -4570,14 +4657,14 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 11); { - this.state = 1204; + this.state = 1224; this.identifier(); - this.state = 1206; + this.state = 1226; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 136) { + if (_la === 137) { { - this.state = 1205; + this.state = 1225; this.typeArguments(); } } @@ -4603,17 +4690,17 @@ export class QuixosCapabilityParser extends antlr.Parser { } public recordField(): RecordFieldContext { let localContext = new RecordFieldContext(this.context, this.state); - this.enterRule(localContext, 132, QuixosCapabilityParser.RULE_recordField); + this.enterRule(localContext, 136, QuixosCapabilityParser.RULE_recordField); try { this.enterOuterAlt(localContext, 1); { - this.state = 1210; + this.state = 1230; this.identifier(); - this.state = 1211; + this.state = 1231; this.match(QuixosCapabilityParser.COLON); - this.state = 1212; + this.state = 1232; this.valueType(); - this.state = 1213; + this.state = 1233; this.match(QuixosCapabilityParser.SEMI); } } @@ -4632,14 +4719,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public scalarType(): ScalarTypeContext { let localContext = new ScalarTypeContext(this.context, this.state); - this.enterRule(localContext, 134, QuixosCapabilityParser.RULE_scalarType); + this.enterRule(localContext, 138, QuixosCapabilityParser.RULE_scalarType); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1215; + this.state = 1235; _la = this.tokenStream.LA(1); - if(!(((((_la - 114)) & ~0x1F) === 0 && ((1 << (_la - 114)) & 255) !== 0))) { + if(!(((((_la - 115)) & ~0x1F) === 0 && ((1 << (_la - 115)) & 255) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4663,14 +4750,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public cardinality(): CardinalityContext { let localContext = new CardinalityContext(this.context, this.state); - this.enterRule(localContext, 136, QuixosCapabilityParser.RULE_cardinality); + this.enterRule(localContext, 140, QuixosCapabilityParser.RULE_cardinality); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1217; + this.state = 1237; _la = this.tokenStream.LA(1); - if(!(((((_la - 101)) & ~0x1F) === 0 && ((1 << (_la - 101)) & 15) !== 0))) { + if(!(((((_la - 102)) & ~0x1F) === 0 && ((1 << (_la - 102)) & 15) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4694,64 +4781,64 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonLiteral(): JsonLiteralContext { let localContext = new JsonLiteralContext(this.context, this.state); - this.enterRule(localContext, 138, QuixosCapabilityParser.RULE_jsonLiteral); + this.enterRule(localContext, 142, QuixosCapabilityParser.RULE_jsonLiteral); try { - this.state = 1227; + this.state = 1247; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STRING_LITERAL: this.enterOuterAlt(localContext, 1); { - this.state = 1219; + this.state = 1239; this.stringLiteral(); } break; case QuixosCapabilityParser.INTEGER: this.enterOuterAlt(localContext, 2); { - this.state = 1220; + this.state = 1240; this.match(QuixosCapabilityParser.INTEGER); } break; case QuixosCapabilityParser.JSON_NUMBER: this.enterOuterAlt(localContext, 3); { - this.state = 1221; + this.state = 1241; this.match(QuixosCapabilityParser.JSON_NUMBER); } break; case QuixosCapabilityParser.TRUE: this.enterOuterAlt(localContext, 4); { - this.state = 1222; + this.state = 1242; this.match(QuixosCapabilityParser.TRUE); } break; case QuixosCapabilityParser.FALSE: this.enterOuterAlt(localContext, 5); { - this.state = 1223; + this.state = 1243; this.match(QuixosCapabilityParser.FALSE); } break; case QuixosCapabilityParser.NULL: this.enterOuterAlt(localContext, 6); { - this.state = 1224; + this.state = 1244; this.match(QuixosCapabilityParser.NULL); } break; case QuixosCapabilityParser.LBRACE: this.enterOuterAlt(localContext, 7); { - this.state = 1225; + this.state = 1245; this.jsonObject(); } break; case QuixosCapabilityParser.LBRACK: this.enterOuterAlt(localContext, 8); { - this.state = 1226; + this.state = 1246; this.jsonArray(); } break; @@ -4774,40 +4861,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonObject(): JsonObjectContext { let localContext = new JsonObjectContext(this.context, this.state); - this.enterRule(localContext, 140, QuixosCapabilityParser.RULE_jsonObject); + this.enterRule(localContext, 144, QuixosCapabilityParser.RULE_jsonObject); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1229; + this.state = 1249; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1238; + this.state = 1258; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 143) { + if (_la === 144) { { - this.state = 1230; + this.state = 1250; this.jsonMember(); - this.state = 1235; + this.state = 1255; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 128) { + while (_la === 129) { { { - this.state = 1231; + this.state = 1251; this.match(QuixosCapabilityParser.COMMA); - this.state = 1232; + this.state = 1252; this.jsonMember(); } } - this.state = 1237; + this.state = 1257; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1240; + this.state = 1260; this.match(QuixosCapabilityParser.RBRACE); } } @@ -4826,15 +4913,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonMember(): JsonMemberContext { let localContext = new JsonMemberContext(this.context, this.state); - this.enterRule(localContext, 142, QuixosCapabilityParser.RULE_jsonMember); + this.enterRule(localContext, 146, QuixosCapabilityParser.RULE_jsonMember); try { this.enterOuterAlt(localContext, 1); { - this.state = 1242; + this.state = 1262; this.stringLiteral(); - this.state = 1243; + this.state = 1263; this.match(QuixosCapabilityParser.COLON); - this.state = 1244; + this.state = 1264; this.jsonLiteral(); } } @@ -4853,40 +4940,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonArray(): JsonArrayContext { let localContext = new JsonArrayContext(this.context, this.state); - this.enterRule(localContext, 144, QuixosCapabilityParser.RULE_jsonArray); + this.enterRule(localContext, 148, QuixosCapabilityParser.RULE_jsonArray); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1246; + this.state = 1266; this.match(QuixosCapabilityParser.LBRACK); - this.state = 1255; + this.state = 1275; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (((((_la - 122)) & ~0x1F) === 0 && ((1 << (_la - 122)) & 2884871) !== 0)) { + if (((((_la - 123)) & ~0x1F) === 0 && ((1 << (_la - 123)) & 2884871) !== 0)) { { - this.state = 1247; + this.state = 1267; this.jsonLiteral(); - this.state = 1252; + this.state = 1272; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 128) { + while (_la === 129) { { { - this.state = 1248; + this.state = 1268; this.match(QuixosCapabilityParser.COMMA); - this.state = 1249; + this.state = 1269; this.jsonLiteral(); } } - this.state = 1254; + this.state = 1274; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1257; + this.state = 1277; this.match(QuixosCapabilityParser.RBRACK); } } @@ -4905,14 +4992,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public identifier(): IdentifierContext { let localContext = new IdentifierContext(this.context, this.state); - this.enterRule(localContext, 146, QuixosCapabilityParser.RULE_identifier); + this.enterRule(localContext, 150, QuixosCapabilityParser.RULE_identifier); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1259; + this.state = 1279; _la = this.tokenStream.LA(1); - if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 68 || ((((_la - 87)) & ~0x1F) === 0 && ((1 << (_la - 87)) & 4099) !== 0) || _la === 142)) { + if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 4099) !== 0) || _la === 143)) { this.errorHandler.recoverInline(this); } else { @@ -4936,11 +5023,11 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stringLiteral(): StringLiteralContext { let localContext = new StringLiteralContext(this.context, this.state); - this.enterRule(localContext, 148, QuixosCapabilityParser.RULE_stringLiteral); + this.enterRule(localContext, 152, QuixosCapabilityParser.RULE_stringLiteral); try { this.enterOuterAlt(localContext, 1); { - this.state = 1261; + this.state = 1281; this.match(QuixosCapabilityParser.STRING_LITERAL); } } @@ -4959,7 +5046,7 @@ export class QuixosCapabilityParser extends antlr.Parser { } public static readonly _serializedATN: number[] = [ - 4,1,146,1264,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,147,1284,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, @@ -4970,480 +5057,488 @@ export class QuixosCapabilityParser extends antlr.Parser { 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,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, - 1,0,1,0,1,0,3,0,163,8,0,1,1,1,1,1,1,5,1,168,8,1,10,1,12,1,171,9, - 1,1,1,1,1,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1, - 3,5,3,189,8,3,10,3,12,3,192,9,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,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,3,5,215, - 8,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8, - 1,8,1,8,1,8,3,8,235,8,8,1,9,1,9,1,9,1,9,1,9,1,9,3,9,243,8,9,1,9, - 1,9,1,10,5,10,248,8,10,10,10,12,10,251,9,10,1,10,1,10,1,10,3,10, - 256,8,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,5,10,266,8,10,10, - 10,12,10,269,9,10,3,10,271,8,10,1,10,1,10,5,10,275,8,10,10,10,12, - 10,278,9,10,1,10,1,10,1,11,1,11,1,11,1,11,5,11,286,8,11,10,11,12, - 11,289,9,11,1,11,1,11,1,12,1,12,1,12,1,12,3,12,297,8,12,1,12,1,12, - 1,12,1,12,1,12,1,12,5,12,305,8,12,10,12,12,12,308,9,12,3,12,310, - 8,12,3,12,312,8,12,1,13,1,13,3,13,316,8,13,1,14,1,14,1,14,1,14,5, - 14,322,8,14,10,14,12,14,325,9,14,1,14,1,14,1,15,1,15,1,15,1,15,1, - 15,1,15,1,15,3,15,336,8,15,1,16,1,16,1,16,3,16,341,8,16,1,16,1,16, - 1,16,1,16,1,17,1,17,1,17,3,17,350,8,17,1,18,3,18,353,8,18,1,18,1, - 18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,3,18,368, - 8,18,1,18,1,18,1,18,1,19,3,19,374,8,19,1,19,1,19,1,19,1,19,1,19, - 1,19,1,19,1,19,5,19,384,8,19,10,19,12,19,387,9,19,1,19,1,19,1,20, - 1,20,1,20,1,20,3,20,395,8,20,1,20,1,20,1,20,1,20,1,20,1,20,3,20, - 403,8,20,1,20,1,20,1,20,1,20,1,20,1,20,3,20,411,8,20,1,20,1,20,1, - 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,3,20,424,8,20,1,21,3, - 21,427,8,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,3,21,437,8,21, - 1,21,1,21,3,21,441,8,21,1,21,1,21,5,21,445,8,21,10,21,12,21,448, - 9,21,1,21,1,21,1,22,1,22,3,22,454,8,22,1,23,1,23,1,23,1,23,3,23, - 460,8,23,1,23,1,23,1,23,1,23,1,23,1,23,3,23,468,8,23,1,23,1,23,1, - 23,1,23,1,23,1,23,3,23,476,8,23,1,23,1,23,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,3,23,489,8,23,1,24,1,24,1,24,1,24,1,24,3, - 24,496,8,24,1,24,1,24,3,24,500,8,24,1,25,5,25,503,8,25,10,25,12, - 25,506,9,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,3,25,516,8,25, - 1,25,1,25,5,25,520,8,25,10,25,12,25,523,9,25,1,25,1,25,1,26,1,26, - 1,26,1,26,1,26,3,26,532,8,26,1,27,1,27,1,27,3,27,537,8,27,1,27,1, - 27,1,27,1,27,3,27,543,8,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,5, - 27,552,8,27,10,27,12,27,555,9,27,1,27,1,27,1,28,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,29,1,29,1, - 29,1,29,1,29,1,29,1,29,3,29,581,8,29,1,29,1,29,1,29,1,29,1,29,1, + 72,7,72,2,73,7,73,2,74,7,74,2,75,7,75,2,76,7,76,1,0,1,0,1,0,1,0, + 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,167,8,0,1,1,1,1,1,1,5,1,172, + 8,1,10,1,12,1,175,9,1,1,1,1,1,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1, + 3,1,3,1,3,1,3,1,3,1,3,5,3,193,8,3,10,3,12,3,196,9,3,1,3,1,3,1,4, + 1,4,1,4,1,4,1,4,1,4,1,4,3,4,207,8,4,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,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7, + 1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,3,8,239,8,8,1,9,1,9,1,9,1,9,1,9, + 1,9,3,9,247,8,9,1,9,1,9,1,10,5,10,252,8,10,10,10,12,10,255,9,10, + 1,10,1,10,1,10,3,10,260,8,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10, + 1,10,5,10,270,8,10,10,10,12,10,273,9,10,3,10,275,8,10,1,10,1,10, + 5,10,279,8,10,10,10,12,10,282,9,10,1,10,1,10,1,11,1,11,1,11,1,11, + 5,11,290,8,11,10,11,12,11,293,9,11,1,11,1,11,1,12,1,12,1,12,1,12, + 3,12,301,8,12,1,12,1,12,1,12,1,12,1,12,1,12,5,12,309,8,12,10,12, + 12,12,312,9,12,3,12,314,8,12,3,12,316,8,12,1,13,1,13,3,13,320,8, + 13,1,14,1,14,1,14,1,14,5,14,326,8,14,10,14,12,14,329,9,14,1,14,1, + 14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,3,15,340,8,15,1,16,1,16,1, + 16,3,16,345,8,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,3,17,354,8,17, + 1,18,3,18,357,8,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18, + 1,18,1,18,1,18,1,18,3,18,372,8,18,1,18,1,18,1,18,1,19,3,19,378,8, + 19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,5,19,388,8,19,10,19,12, + 19,391,9,19,1,19,1,19,1,20,1,20,1,20,1,20,3,20,399,8,20,1,20,1,20, + 1,20,1,20,1,20,1,20,3,20,407,8,20,1,20,1,20,1,20,1,20,1,20,1,20, + 3,20,415,8,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20, + 1,20,3,20,428,8,20,1,21,3,21,431,8,21,1,21,1,21,1,21,1,21,1,21,1, + 21,1,21,1,21,3,21,441,8,21,1,21,1,21,3,21,445,8,21,1,21,1,21,5,21, + 449,8,21,10,21,12,21,452,9,21,1,21,1,21,1,22,1,22,3,22,458,8,22, + 1,23,1,23,1,23,1,23,3,23,464,8,23,1,23,1,23,1,23,1,23,1,23,1,23, + 3,23,472,8,23,1,23,1,23,1,23,1,23,1,23,1,23,3,23,480,8,23,1,23,1, + 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,3,23,493,8,23,1, + 24,1,24,1,24,1,24,1,24,3,24,500,8,24,1,24,1,24,3,24,504,8,24,1,25, + 5,25,507,8,25,10,25,12,25,510,9,25,1,25,1,25,1,25,1,25,1,25,1,25, + 1,25,1,25,3,25,520,8,25,1,25,1,25,5,25,524,8,25,10,25,12,25,527, + 9,25,1,25,1,25,1,26,1,26,1,26,1,26,1,26,3,26,536,8,26,1,27,1,27, + 1,27,3,27,541,8,27,1,27,1,27,1,27,1,27,3,27,547,8,27,1,27,1,27,1, + 27,1,27,1,27,1,27,1,27,5,27,556,8,27,10,27,12,27,559,9,27,1,27,1, + 27,1,28,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,29,1,29,1,29,1,29,1,29,1,29,1,29,3,29,585,8,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,1,29,1, - 29,1,29,1,29,1,29,1,29,1,29,1,29,3,29,608,8,29,1,30,1,30,1,30,3, - 30,613,8,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,3,30,624, - 8,30,1,30,3,30,627,8,30,1,30,1,30,1,30,3,30,632,8,30,1,30,1,30,1, - 31,1,31,1,31,3,31,639,8,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,3, - 31,648,8,31,1,31,3,31,651,8,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32, - 1,32,1,32,1,32,1,32,3,32,664,8,32,1,33,1,33,1,33,1,33,1,33,5,33, - 671,8,33,10,33,12,33,674,9,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34, - 1,34,1,34,1,34,1,34,3,34,687,8,34,1,34,1,34,1,35,1,35,1,35,1,36, - 1,36,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,5,37,706, - 8,37,10,37,12,37,709,9,37,3,37,711,8,37,1,37,3,37,714,8,37,1,38, - 1,38,1,38,5,38,719,8,38,10,38,12,38,722,9,38,1,39,1,39,1,39,5,39, - 727,8,39,10,39,12,39,730,9,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40, - 1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40, - 1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40, - 1,40,1,40,1,40,1,40,3,40,769,8,40,1,40,3,40,772,8,40,1,40,1,40,1, - 40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1, - 40,1,40,1,40,1,40,1,40,3,40,794,8,40,1,40,1,40,1,40,1,40,1,40,1, - 40,1,40,1,40,1,40,1,40,1,40,1,40,3,40,808,8,40,1,41,1,41,1,41,1, - 41,5,41,814,8,41,10,41,12,41,817,9,41,1,41,1,41,1,42,1,42,1,43,1, - 43,1,43,1,44,1,44,3,44,828,8,44,1,45,1,45,1,45,1,45,1,45,1,45,1, - 45,1,45,1,45,1,45,1,45,1,45,3,45,842,8,45,1,45,1,45,1,46,1,46,1, - 46,1,46,1,46,1,46,3,46,852,8,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,48,1,48,1,48,1,48,3,48,870,8,48,1, - 48,1,48,3,48,874,8,48,1,48,3,48,877,8,48,1,48,1,48,3,48,881,8,48, - 1,48,3,48,884,8,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,3,49,893,8, - 49,1,49,1,49,3,49,897,8,49,1,49,1,49,3,49,901,8,49,1,49,1,49,5,49, - 905,8,49,10,49,12,49,908,9,49,1,49,1,49,1,50,1,50,1,50,1,50,1,50, - 1,50,3,50,918,8,50,1,51,1,51,1,51,5,51,923,8,51,10,51,12,51,926, - 9,51,1,51,1,51,1,51,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52, - 1,52,1,52,1,52,1,52,1,52,3,52,945,8,52,1,53,1,53,1,53,1,53,1,53, - 5,53,952,8,53,10,53,12,53,955,9,53,1,53,1,53,1,54,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,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,3,56,986,8,56, - 1,56,1,56,1,57,1,57,1,57,1,57,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,1006,8,58,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,1023,8,59, - 1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,1033,8,59,1,59,3,59, - 1036,8,59,3,59,1038,8,59,1,60,1,60,1,61,1,61,1,62,1,62,1,62,5,62, - 1047,8,62,10,62,12,62,1050,9,62,1,62,1,62,1,63,1,63,1,63,1,63,1, - 63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1, - 63,1,63,3,63,1073,8,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1, - 63,1,63,1,63,1,63,1,63,1,63,3,63,1089,8,63,1,63,1,63,1,63,1,63,1, - 63,1,63,1,63,3,63,1098,8,63,1,63,1,63,1,63,1,63,1,63,1,63,3,63,1106, - 8,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,5,63,1117,8,63, - 10,63,12,63,1120,9,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1, - 63,1,63,1,63,1,63,3,63,1134,8,63,1,63,1,63,1,63,1,63,1,63,1,63,1, - 63,1,63,1,63,1,63,3,63,1146,8,63,1,63,1,63,3,63,1150,8,63,1,64,1, - 64,1,64,1,64,1,64,1,64,1,64,3,64,1159,8,64,1,64,1,64,1,65,1,65,1, - 65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65,1177, + 29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,3,29,612, + 8,29,1,30,1,30,1,30,3,30,617,8,30,1,30,1,30,1,30,1,30,1,30,1,30, + 1,30,1,30,1,30,3,30,628,8,30,1,30,3,30,631,8,30,1,30,1,30,1,30,3, + 30,636,8,30,1,30,3,30,639,8,30,1,30,1,30,1,31,1,31,1,31,3,31,646, + 8,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,3,31,655,8,31,1,31,3,31, + 658,8,31,1,31,3,31,661,8,31,1,31,1,31,1,32,1,32,1,32,1,32,1,33,1, + 33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,3,33,678,8,33,1,34,1,34,1, + 34,1,34,1,34,5,34,685,8,34,10,34,12,34,688,9,34,1,34,1,34,1,35,1, + 35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,3,35,701,8,35,1,35,1,35,1, + 36,1,36,1,36,1,37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1, + 38,1,38,5,38,720,8,38,10,38,12,38,723,9,38,3,38,725,8,38,1,38,3, + 38,728,8,38,1,39,1,39,1,39,5,39,733,8,39,10,39,12,39,736,9,39,1, + 40,1,40,1,40,5,40,741,8,40,10,40,12,40,744,9,40,1,40,1,40,1,41,1, + 41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1, + 41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1, + 41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,3,41,783,8,41,1,41,3,41,786, + 8,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41, + 1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,3,41,808,8,41,1,41,1,41, + 1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,3,41,822,8,41, + 1,42,1,42,1,42,1,42,5,42,828,8,42,10,42,12,42,831,9,42,1,42,1,42, + 1,43,1,43,1,44,1,44,1,44,1,45,1,45,3,45,842,8,45,1,46,1,46,1,46, + 1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,3,46,856,8,46,1,46, + 1,46,1,47,1,47,1,47,1,47,1,47,1,47,3,47,866,8,47,1,48,1,48,1,48, + 1,48,1,48,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,49,1,49, + 3,49,884,8,49,1,49,1,49,3,49,888,8,49,1,49,3,49,891,8,49,1,49,1, + 49,3,49,895,8,49,1,49,3,49,898,8,49,1,49,1,49,1,50,1,50,1,50,1,50, + 1,50,3,50,907,8,50,1,50,1,50,3,50,911,8,50,1,50,1,50,3,50,915,8, + 50,1,50,1,50,5,50,919,8,50,10,50,12,50,922,9,50,1,50,1,50,1,51,1, + 51,1,51,1,51,1,51,1,51,3,51,932,8,51,1,52,1,52,1,52,5,52,937,8,52, + 10,52,12,52,940,9,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,53, + 1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,3,53,959,8,53,1,54,1,54, + 1,54,1,54,1,54,5,54,966,8,54,10,54,12,54,969,9,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,56, + 1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,57,1,57,1,57, + 3,57,1000,8,57,1,57,1,57,1,58,1,58,1,58,1,58,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,1020,8,59,1,60,1,60, + 1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60, + 3,60,1037,8,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,3,60,1047, + 8,60,1,60,3,60,1050,8,60,1,60,3,60,1053,8,60,3,60,1055,8,60,1,61, + 1,61,1,61,1,62,1,62,1,63,1,63,1,64,1,64,1,64,5,64,1067,8,64,10,64, + 12,64,1070,9,64,1,64,1,64,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65, + 1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65,1093, 8,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65, - 1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,5,65,1199,8,65,10,65,12, - 65,1202,9,65,1,65,1,65,1,65,3,65,1207,8,65,3,65,1209,8,65,1,66,1, - 66,1,66,1,66,1,66,1,67,1,67,1,68,1,68,1,69,1,69,1,69,1,69,1,69,1, - 69,1,69,1,69,3,69,1228,8,69,1,70,1,70,1,70,1,70,5,70,1234,8,70,10, - 70,12,70,1237,9,70,3,70,1239,8,70,1,70,1,70,1,71,1,71,1,71,1,71, - 1,72,1,72,1,72,1,72,5,72,1251,8,72,10,72,12,72,1254,9,72,3,72,1256, - 8,72,1,72,1,72,1,73,1,73,1,74,1,74,1,74,0,0,75,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,0,9,2,0,10,10,28,28,1,0,6,7,1,0, - 94,98,3,0,1,1,89,93,95,96,3,0,1,1,89,90,95,96,2,0,91,93,95,96,1, - 0,114,121,1,0,101,104,7,0,1,3,5,28,40,40,68,68,87,88,99,99,142,142, - 1367,0,162,1,0,0,0,2,164,1,0,0,0,4,174,1,0,0,0,6,178,1,0,0,0,8,202, - 1,0,0,0,10,214,1,0,0,0,12,216,1,0,0,0,14,223,1,0,0,0,16,234,1,0, - 0,0,18,236,1,0,0,0,20,249,1,0,0,0,22,281,1,0,0,0,24,311,1,0,0,0, - 26,313,1,0,0,0,28,317,1,0,0,0,30,335,1,0,0,0,32,337,1,0,0,0,34,349, - 1,0,0,0,36,352,1,0,0,0,38,373,1,0,0,0,40,423,1,0,0,0,42,426,1,0, - 0,0,44,451,1,0,0,0,46,488,1,0,0,0,48,499,1,0,0,0,50,504,1,0,0,0, - 52,531,1,0,0,0,54,533,1,0,0,0,56,558,1,0,0,0,58,607,1,0,0,0,60,609, - 1,0,0,0,62,635,1,0,0,0,64,663,1,0,0,0,66,665,1,0,0,0,68,677,1,0, - 0,0,70,690,1,0,0,0,72,693,1,0,0,0,74,713,1,0,0,0,76,715,1,0,0,0, - 78,723,1,0,0,0,80,807,1,0,0,0,82,809,1,0,0,0,84,820,1,0,0,0,86,822, - 1,0,0,0,88,827,1,0,0,0,90,829,1,0,0,0,92,851,1,0,0,0,94,853,1,0, - 0,0,96,862,1,0,0,0,98,887,1,0,0,0,100,917,1,0,0,0,102,919,1,0,0, - 0,104,944,1,0,0,0,106,946,1,0,0,0,108,958,1,0,0,0,110,965,1,0,0, - 0,112,979,1,0,0,0,114,989,1,0,0,0,116,1005,1,0,0,0,118,1037,1,0, - 0,0,120,1039,1,0,0,0,122,1041,1,0,0,0,124,1043,1,0,0,0,126,1149, - 1,0,0,0,128,1151,1,0,0,0,130,1208,1,0,0,0,132,1210,1,0,0,0,134,1215, - 1,0,0,0,136,1217,1,0,0,0,138,1227,1,0,0,0,140,1229,1,0,0,0,142,1242, - 1,0,0,0,144,1246,1,0,0,0,146,1259,1,0,0,0,148,1261,1,0,0,0,150,151, - 3,6,3,0,151,152,5,0,0,1,152,163,1,0,0,0,153,154,3,20,10,0,154,155, - 5,0,0,1,155,163,1,0,0,0,156,157,3,50,25,0,157,158,5,0,0,1,158,163, - 1,0,0,0,159,160,3,2,1,0,160,161,5,0,0,1,161,163,1,0,0,0,162,150, - 1,0,0,0,162,153,1,0,0,0,162,156,1,0,0,0,162,159,1,0,0,0,163,1,1, - 0,0,0,164,165,5,35,0,0,165,169,5,130,0,0,166,168,3,8,4,0,167,166, - 1,0,0,0,168,171,1,0,0,0,169,167,1,0,0,0,169,170,1,0,0,0,170,172, - 1,0,0,0,171,169,1,0,0,0,172,173,5,131,0,0,173,3,1,0,0,0,174,175, - 5,36,0,0,175,176,3,148,74,0,176,177,5,127,0,0,177,5,1,0,0,0,178, - 179,5,4,0,0,179,180,3,146,73,0,180,181,5,77,0,0,181,182,3,148,74, - 0,182,183,5,71,0,0,183,184,3,148,74,0,184,185,5,70,0,0,185,186,3, - 148,74,0,186,190,5,130,0,0,187,189,3,8,4,0,188,187,1,0,0,0,189,192, - 1,0,0,0,190,188,1,0,0,0,190,191,1,0,0,0,191,193,1,0,0,0,192,190, - 1,0,0,0,193,194,5,131,0,0,194,7,1,0,0,0,195,203,3,4,2,0,196,203, - 3,18,9,0,197,203,3,10,5,0,198,203,3,86,43,0,199,203,3,98,49,0,200, - 203,3,128,64,0,201,203,3,32,16,0,202,195,1,0,0,0,202,196,1,0,0,0, - 202,197,1,0,0,0,202,198,1,0,0,0,202,199,1,0,0,0,202,200,1,0,0,0, - 202,201,1,0,0,0,203,9,1,0,0,0,204,205,5,36,0,0,205,206,5,39,0,0, - 206,207,3,146,73,0,207,208,5,127,0,0,208,215,1,0,0,0,209,210,5,36, - 0,0,210,211,5,41,0,0,211,212,3,146,73,0,212,213,5,127,0,0,213,215, - 1,0,0,0,214,204,1,0,0,0,214,209,1,0,0,0,215,11,1,0,0,0,216,217,5, - 37,0,0,217,218,5,38,0,0,218,219,3,146,73,0,219,220,5,77,0,0,220, - 221,3,148,74,0,221,222,5,127,0,0,222,13,1,0,0,0,223,224,5,37,0,0, - 224,225,5,39,0,0,225,226,3,146,73,0,226,227,5,71,0,0,227,228,3,148, - 74,0,228,229,5,127,0,0,229,15,1,0,0,0,230,235,3,10,5,0,231,235,3, - 12,6,0,232,235,3,14,7,0,233,235,3,32,16,0,234,230,1,0,0,0,234,231, - 1,0,0,0,234,232,1,0,0,0,234,233,1,0,0,0,235,17,1,0,0,0,236,237,5, - 38,0,0,237,238,3,146,73,0,238,239,5,77,0,0,239,242,3,148,74,0,240, - 241,5,78,0,0,241,243,3,148,74,0,242,240,1,0,0,0,242,243,1,0,0,0, - 243,244,1,0,0,0,244,245,5,127,0,0,245,19,1,0,0,0,246,248,3,16,8, - 0,247,246,1,0,0,0,248,251,1,0,0,0,249,247,1,0,0,0,249,250,1,0,0, - 0,250,252,1,0,0,0,251,249,1,0,0,0,252,253,5,39,0,0,253,255,3,146, - 73,0,254,256,3,22,11,0,255,254,1,0,0,0,255,256,1,0,0,0,256,257,1, - 0,0,0,257,258,5,77,0,0,258,259,3,148,74,0,259,260,5,71,0,0,260,270, - 3,148,74,0,261,262,5,82,0,0,262,267,3,26,13,0,263,264,5,128,0,0, - 264,266,3,26,13,0,265,263,1,0,0,0,266,269,1,0,0,0,267,265,1,0,0, - 0,267,268,1,0,0,0,268,271,1,0,0,0,269,267,1,0,0,0,270,261,1,0,0, - 0,270,271,1,0,0,0,271,272,1,0,0,0,272,276,5,130,0,0,273,275,3,34, - 17,0,274,273,1,0,0,0,275,278,1,0,0,0,276,274,1,0,0,0,276,277,1,0, - 0,0,277,279,1,0,0,0,278,276,1,0,0,0,279,280,5,131,0,0,280,21,1,0, - 0,0,281,282,5,136,0,0,282,287,3,24,12,0,283,284,5,128,0,0,284,286, - 3,24,12,0,285,283,1,0,0,0,286,289,1,0,0,0,287,285,1,0,0,0,287,288, - 1,0,0,0,288,290,1,0,0,0,289,287,1,0,0,0,290,291,5,137,0,0,291,23, - 1,0,0,0,292,293,5,42,0,0,293,296,3,146,73,0,294,295,5,126,0,0,295, - 297,5,32,0,0,296,294,1,0,0,0,296,297,1,0,0,0,297,312,1,0,0,0,298, - 299,5,31,0,0,299,309,3,146,73,0,300,301,5,33,0,0,301,306,3,26,13, - 0,302,303,5,138,0,0,303,305,3,26,13,0,304,302,1,0,0,0,305,308,1, - 0,0,0,306,304,1,0,0,0,306,307,1,0,0,0,307,310,1,0,0,0,308,306,1, - 0,0,0,309,300,1,0,0,0,309,310,1,0,0,0,310,312,1,0,0,0,311,292,1, - 0,0,0,311,298,1,0,0,0,312,25,1,0,0,0,313,315,3,146,73,0,314,316, - 3,28,14,0,315,314,1,0,0,0,315,316,1,0,0,0,316,27,1,0,0,0,317,318, - 5,136,0,0,318,323,3,30,15,0,319,320,5,128,0,0,320,322,3,30,15,0, - 321,319,1,0,0,0,322,325,1,0,0,0,323,321,1,0,0,0,323,324,1,0,0,0, - 324,326,1,0,0,0,325,323,1,0,0,0,326,327,5,137,0,0,327,29,1,0,0,0, - 328,329,5,38,0,0,329,336,3,146,73,0,330,331,5,39,0,0,331,336,3,26, - 13,0,332,333,5,31,0,0,333,336,3,146,73,0,334,336,3,130,65,0,335, - 328,1,0,0,0,335,330,1,0,0,0,335,332,1,0,0,0,335,334,1,0,0,0,336, - 31,1,0,0,0,337,338,5,30,0,0,338,340,3,146,73,0,339,341,3,22,11,0, - 340,339,1,0,0,0,340,341,1,0,0,0,341,342,1,0,0,0,342,343,5,139,0, - 0,343,344,3,130,65,0,344,345,5,127,0,0,345,33,1,0,0,0,346,350,3, - 38,19,0,347,350,3,42,21,0,348,350,3,36,18,0,349,346,1,0,0,0,349, - 347,1,0,0,0,349,348,1,0,0,0,350,35,1,0,0,0,351,353,5,52,0,0,352, - 351,1,0,0,0,352,353,1,0,0,0,353,354,1,0,0,0,354,355,5,44,0,0,355, - 356,3,146,73,0,356,357,5,77,0,0,357,358,3,148,74,0,358,359,5,126, - 0,0,359,360,3,130,65,0,360,361,5,125,0,0,361,362,3,130,65,0,362, - 363,5,130,0,0,363,364,5,94,0,0,364,365,5,77,0,0,365,367,3,148,74, - 0,366,368,3,64,32,0,367,366,1,0,0,0,367,368,1,0,0,0,368,369,1,0, - 0,0,369,370,5,127,0,0,370,371,5,131,0,0,371,37,1,0,0,0,372,374,3, - 44,22,0,373,372,1,0,0,0,373,374,1,0,0,0,374,375,1,0,0,0,375,376, - 5,42,0,0,376,377,3,146,73,0,377,378,5,77,0,0,378,379,3,148,74,0, - 379,380,5,126,0,0,380,381,3,130,65,0,381,385,5,130,0,0,382,384,3, - 40,20,0,383,382,1,0,0,0,384,387,1,0,0,0,385,383,1,0,0,0,385,386, - 1,0,0,0,386,388,1,0,0,0,387,385,1,0,0,0,388,389,5,131,0,0,389,39, - 1,0,0,0,390,391,5,84,0,0,391,392,5,77,0,0,392,394,3,148,74,0,393, - 395,3,64,32,0,394,393,1,0,0,0,394,395,1,0,0,0,395,396,1,0,0,0,396, - 397,5,127,0,0,397,424,1,0,0,0,398,399,5,85,0,0,399,400,5,77,0,0, - 400,402,3,148,74,0,401,403,3,64,32,0,402,401,1,0,0,0,402,403,1,0, - 0,0,403,404,1,0,0,0,404,405,5,127,0,0,405,424,1,0,0,0,406,407,5, - 1,0,0,407,408,5,77,0,0,408,410,3,148,74,0,409,411,3,64,32,0,410, - 409,1,0,0,0,410,411,1,0,0,0,411,412,1,0,0,0,412,413,5,127,0,0,413, - 424,1,0,0,0,414,415,5,86,0,0,415,416,5,87,0,0,416,417,5,77,0,0,417, - 418,3,148,74,0,418,419,5,88,0,0,419,420,5,77,0,0,420,421,3,148,74, - 0,421,422,5,127,0,0,422,424,1,0,0,0,423,390,1,0,0,0,423,398,1,0, - 0,0,423,406,1,0,0,0,423,414,1,0,0,0,424,41,1,0,0,0,425,427,3,44, - 22,0,426,425,1,0,0,0,426,427,1,0,0,0,427,428,1,0,0,0,428,429,5,43, - 0,0,429,430,3,146,73,0,430,431,5,77,0,0,431,432,3,148,74,0,432,433, - 5,126,0,0,433,434,3,136,68,0,434,436,3,48,24,0,435,437,5,105,0,0, - 436,435,1,0,0,0,436,437,1,0,0,0,437,440,1,0,0,0,438,439,5,75,0,0, - 439,441,3,148,74,0,440,438,1,0,0,0,440,441,1,0,0,0,441,442,1,0,0, - 0,442,446,5,130,0,0,443,445,3,46,23,0,444,443,1,0,0,0,445,448,1, - 0,0,0,446,444,1,0,0,0,446,447,1,0,0,0,447,449,1,0,0,0,448,446,1, - 0,0,0,449,450,5,131,0,0,450,43,1,0,0,0,451,453,5,27,0,0,452,454, - 7,0,0,0,453,452,1,0,0,0,453,454,1,0,0,0,454,45,1,0,0,0,455,456,5, - 91,0,0,456,457,5,77,0,0,457,459,3,148,74,0,458,460,3,64,32,0,459, - 458,1,0,0,0,459,460,1,0,0,0,460,461,1,0,0,0,461,462,5,127,0,0,462, - 489,1,0,0,0,463,464,5,92,0,0,464,465,5,77,0,0,465,467,3,148,74,0, - 466,468,3,64,32,0,467,466,1,0,0,0,467,468,1,0,0,0,468,469,1,0,0, - 0,469,470,5,127,0,0,470,489,1,0,0,0,471,472,5,93,0,0,472,473,5,77, - 0,0,473,475,3,148,74,0,474,476,3,64,32,0,475,474,1,0,0,0,475,476, - 1,0,0,0,476,477,1,0,0,0,477,478,5,127,0,0,478,489,1,0,0,0,479,480, - 5,86,0,0,480,481,5,87,0,0,481,482,5,77,0,0,482,483,3,148,74,0,483, - 484,5,88,0,0,484,485,5,77,0,0,485,486,3,148,74,0,486,487,5,127,0, - 0,487,489,1,0,0,0,488,455,1,0,0,0,488,463,1,0,0,0,488,471,1,0,0, - 0,488,479,1,0,0,0,489,47,1,0,0,0,490,491,5,38,0,0,491,500,3,146, - 73,0,492,493,5,39,0,0,493,495,3,146,73,0,494,496,3,28,14,0,495,494, - 1,0,0,0,495,496,1,0,0,0,496,500,1,0,0,0,497,498,5,31,0,0,498,500, - 3,146,73,0,499,490,1,0,0,0,499,492,1,0,0,0,499,497,1,0,0,0,500,49, - 1,0,0,0,501,503,3,16,8,0,502,501,1,0,0,0,503,506,1,0,0,0,504,502, - 1,0,0,0,504,505,1,0,0,0,505,507,1,0,0,0,506,504,1,0,0,0,507,508, - 5,41,0,0,508,509,3,146,73,0,509,510,5,77,0,0,510,511,3,148,74,0, - 511,512,5,71,0,0,512,515,3,148,74,0,513,514,5,72,0,0,514,516,5,140, - 0,0,515,513,1,0,0,0,515,516,1,0,0,0,516,517,1,0,0,0,517,521,5,130, - 0,0,518,520,3,52,26,0,519,518,1,0,0,0,520,523,1,0,0,0,521,519,1, - 0,0,0,521,522,1,0,0,0,522,524,1,0,0,0,523,521,1,0,0,0,524,525,5, - 131,0,0,525,51,1,0,0,0,526,532,3,60,30,0,527,532,3,62,31,0,528,532, - 3,68,34,0,529,532,3,54,27,0,530,532,3,56,28,0,531,526,1,0,0,0,531, - 527,1,0,0,0,531,528,1,0,0,0,531,529,1,0,0,0,531,530,1,0,0,0,532, - 53,1,0,0,0,533,534,5,17,0,0,534,536,3,146,73,0,535,537,3,22,11,0, - 536,535,1,0,0,0,536,537,1,0,0,0,537,538,1,0,0,0,538,539,5,77,0,0, - 539,540,3,148,74,0,540,542,5,20,0,0,541,543,5,4,0,0,542,541,1,0, - 0,0,542,543,1,0,0,0,543,544,1,0,0,0,544,545,3,26,13,0,545,546,5, - 21,0,0,546,547,3,148,74,0,547,548,5,44,0,0,548,549,3,148,74,0,549, - 553,5,130,0,0,550,552,3,58,29,0,551,550,1,0,0,0,552,555,1,0,0,0, - 553,551,1,0,0,0,553,554,1,0,0,0,554,556,1,0,0,0,555,553,1,0,0,0, - 556,557,5,131,0,0,557,55,1,0,0,0,558,559,5,17,0,0,559,560,3,146, - 73,0,560,561,5,77,0,0,561,562,3,148,74,0,562,563,5,19,0,0,563,564, - 3,146,73,0,564,565,3,28,14,0,565,566,5,127,0,0,566,57,1,0,0,0,567, - 568,5,11,0,0,568,608,5,127,0,0,569,570,5,12,0,0,570,571,5,13,0,0, - 571,572,3,146,73,0,572,573,5,127,0,0,573,608,1,0,0,0,574,575,5,22, - 0,0,575,576,3,148,74,0,576,577,5,127,0,0,577,608,1,0,0,0,578,580, - 5,23,0,0,579,581,5,31,0,0,580,579,1,0,0,0,580,581,1,0,0,0,581,582, - 1,0,0,0,582,583,3,146,73,0,583,584,5,50,0,0,584,585,3,26,13,0,585, - 586,5,127,0,0,586,608,1,0,0,0,587,588,5,24,0,0,588,589,3,146,73, - 0,589,590,5,140,0,0,590,591,5,127,0,0,591,608,1,0,0,0,592,593,5, - 25,0,0,593,594,3,26,13,0,594,595,5,129,0,0,595,596,3,146,73,0,596, - 597,3,146,73,0,597,598,3,148,74,0,598,599,5,127,0,0,599,608,1,0, - 0,0,600,601,5,86,0,0,601,608,5,127,0,0,602,603,5,26,0,0,603,604, - 5,140,0,0,604,605,3,148,74,0,605,606,5,127,0,0,606,608,1,0,0,0,607, - 567,1,0,0,0,607,569,1,0,0,0,607,574,1,0,0,0,607,578,1,0,0,0,607, - 587,1,0,0,0,607,592,1,0,0,0,607,600,1,0,0,0,607,602,1,0,0,0,608, - 59,1,0,0,0,609,610,5,44,0,0,610,612,3,146,73,0,611,613,3,22,11,0, - 612,611,1,0,0,0,612,613,1,0,0,0,613,614,1,0,0,0,614,615,5,77,0,0, - 615,616,3,148,74,0,616,617,5,126,0,0,617,618,3,130,65,0,618,619, - 5,125,0,0,619,620,3,130,65,0,620,621,5,79,0,0,621,623,3,72,36,0, - 622,624,3,64,32,0,623,622,1,0,0,0,623,624,1,0,0,0,624,626,1,0,0, - 0,625,627,3,70,35,0,626,625,1,0,0,0,626,627,1,0,0,0,627,628,1,0, - 0,0,628,629,5,81,0,0,629,631,3,74,37,0,630,632,3,78,39,0,631,630, - 1,0,0,0,631,632,1,0,0,0,632,633,1,0,0,0,633,634,5,127,0,0,634,61, - 1,0,0,0,635,636,5,45,0,0,636,638,3,146,73,0,637,639,3,22,11,0,638, - 637,1,0,0,0,638,639,1,0,0,0,639,640,1,0,0,0,640,641,5,77,0,0,641, - 642,3,148,74,0,642,643,5,126,0,0,643,644,3,130,65,0,644,645,5,125, - 0,0,645,647,3,130,65,0,646,648,3,64,32,0,647,646,1,0,0,0,647,648, - 1,0,0,0,648,650,1,0,0,0,649,651,3,78,39,0,650,649,1,0,0,0,650,651, - 1,0,0,0,651,652,1,0,0,0,652,653,5,127,0,0,653,63,1,0,0,0,654,655, - 5,5,0,0,655,664,5,8,0,0,656,657,5,5,0,0,657,658,7,1,0,0,658,659, - 5,9,0,0,659,660,5,132,0,0,660,661,3,76,38,0,661,662,5,133,0,0,662, - 664,1,0,0,0,663,654,1,0,0,0,663,656,1,0,0,0,664,65,1,0,0,0,665,666, - 5,60,0,0,666,667,5,132,0,0,667,672,3,114,57,0,668,669,5,128,0,0, - 669,671,3,114,57,0,670,668,1,0,0,0,671,674,1,0,0,0,672,670,1,0,0, - 0,672,673,1,0,0,0,673,675,1,0,0,0,674,672,1,0,0,0,675,676,5,133, - 0,0,676,67,1,0,0,0,677,678,5,46,0,0,678,679,3,146,73,0,679,680,5, - 77,0,0,680,681,3,148,74,0,681,682,5,47,0,0,682,683,3,146,73,0,683, - 684,5,126,0,0,684,686,3,130,65,0,685,687,3,78,39,0,686,685,1,0,0, - 0,686,687,1,0,0,0,687,688,1,0,0,0,688,689,5,127,0,0,689,69,1,0,0, - 0,690,691,5,80,0,0,691,692,3,130,65,0,692,71,1,0,0,0,693,694,7,2, - 0,0,694,73,1,0,0,0,695,714,5,83,0,0,696,697,5,38,0,0,697,714,3,146, - 73,0,698,699,5,31,0,0,699,714,3,146,73,0,700,701,5,40,0,0,701,710, - 5,132,0,0,702,707,3,26,13,0,703,704,5,128,0,0,704,706,3,26,13,0, - 705,703,1,0,0,0,706,709,1,0,0,0,707,705,1,0,0,0,707,708,1,0,0,0, - 708,711,1,0,0,0,709,707,1,0,0,0,710,702,1,0,0,0,710,711,1,0,0,0, - 711,712,1,0,0,0,712,714,5,133,0,0,713,695,1,0,0,0,713,696,1,0,0, - 0,713,698,1,0,0,0,713,700,1,0,0,0,714,75,1,0,0,0,715,720,3,146,73, - 0,716,717,5,128,0,0,717,719,3,146,73,0,718,716,1,0,0,0,719,722,1, - 0,0,0,720,718,1,0,0,0,720,721,1,0,0,0,721,77,1,0,0,0,722,720,1,0, - 0,0,723,724,5,82,0,0,724,728,5,130,0,0,725,727,3,80,40,0,726,725, - 1,0,0,0,727,730,1,0,0,0,728,726,1,0,0,0,728,729,1,0,0,0,729,731, - 1,0,0,0,730,728,1,0,0,0,731,732,5,131,0,0,732,79,1,0,0,0,733,734, - 5,18,0,0,734,735,3,146,73,0,735,736,5,77,0,0,736,737,3,148,74,0, - 737,738,5,132,0,0,738,739,3,76,38,0,739,740,5,133,0,0,740,741,5, - 127,0,0,741,808,1,0,0,0,742,743,5,56,0,0,743,744,3,146,73,0,744, - 745,5,77,0,0,745,746,3,148,74,0,746,747,5,126,0,0,747,748,3,130, - 65,0,748,749,3,82,41,0,749,750,5,127,0,0,750,808,1,0,0,0,751,752, - 5,57,0,0,752,753,3,146,73,0,753,754,5,77,0,0,754,755,3,148,74,0, - 755,756,5,126,0,0,756,757,3,136,68,0,757,758,3,48,24,0,758,759,3, - 82,41,0,759,760,5,127,0,0,760,808,1,0,0,0,761,762,5,39,0,0,762,763, - 3,146,73,0,763,764,5,77,0,0,764,765,3,148,74,0,765,766,5,126,0,0, - 766,768,3,146,73,0,767,769,3,28,14,0,768,767,1,0,0,0,768,769,1,0, - 0,0,769,771,1,0,0,0,770,772,3,66,33,0,771,770,1,0,0,0,771,772,1, - 0,0,0,772,773,1,0,0,0,773,774,5,127,0,0,774,808,1,0,0,0,775,776, - 5,2,0,0,776,777,3,146,73,0,777,778,5,77,0,0,778,779,3,148,74,0,779, - 780,5,126,0,0,780,781,3,146,73,0,781,782,5,48,0,0,782,783,3,130, - 65,0,783,784,5,127,0,0,784,808,1,0,0,0,785,786,5,46,0,0,786,787, - 3,146,73,0,787,788,5,77,0,0,788,789,3,148,74,0,789,790,5,126,0,0, - 790,793,3,146,73,0,791,792,5,48,0,0,792,794,3,130,65,0,793,791,1, - 0,0,0,793,794,1,0,0,0,794,795,1,0,0,0,795,796,5,127,0,0,796,808, - 1,0,0,0,797,798,5,17,0,0,798,799,3,146,73,0,799,800,5,77,0,0,800, - 801,3,148,74,0,801,802,5,126,0,0,802,803,3,146,73,0,803,804,5,129, - 0,0,804,805,3,146,73,0,805,806,5,127,0,0,806,808,1,0,0,0,807,733, - 1,0,0,0,807,742,1,0,0,0,807,751,1,0,0,0,807,761,1,0,0,0,807,775, - 1,0,0,0,807,785,1,0,0,0,807,797,1,0,0,0,808,81,1,0,0,0,809,810,5, - 132,0,0,810,815,3,84,42,0,811,812,5,128,0,0,812,814,3,84,42,0,813, - 811,1,0,0,0,814,817,1,0,0,0,815,813,1,0,0,0,815,816,1,0,0,0,816, - 818,1,0,0,0,817,815,1,0,0,0,818,819,5,133,0,0,819,83,1,0,0,0,820, - 821,7,3,0,0,821,85,1,0,0,0,822,823,5,55,0,0,823,824,3,88,44,0,824, - 87,1,0,0,0,825,828,3,90,45,0,826,828,3,94,47,0,827,825,1,0,0,0,827, - 826,1,0,0,0,828,89,1,0,0,0,829,830,5,56,0,0,830,831,3,146,73,0,831, - 832,5,77,0,0,832,833,3,148,74,0,833,834,5,65,0,0,834,835,3,146,73, - 0,835,836,5,126,0,0,836,837,3,130,65,0,837,838,5,66,0,0,838,841, - 3,92,46,0,839,840,5,67,0,0,840,842,3,138,69,0,841,839,1,0,0,0,841, - 842,1,0,0,0,842,843,1,0,0,0,843,844,5,127,0,0,844,91,1,0,0,0,845, - 852,5,99,0,0,846,847,5,100,0,0,847,848,5,134,0,0,848,849,3,130,65, - 0,849,850,5,135,0,0,850,852,1,0,0,0,851,845,1,0,0,0,851,846,1,0, - 0,0,852,93,1,0,0,0,853,854,5,57,0,0,854,855,3,146,73,0,855,856,5, - 77,0,0,856,857,3,148,74,0,857,858,5,130,0,0,858,859,3,96,48,0,859, - 860,3,96,48,0,860,861,5,131,0,0,861,95,1,0,0,0,862,863,3,48,24,0, - 863,864,5,58,0,0,864,865,3,146,73,0,865,866,5,77,0,0,866,867,3,148, - 74,0,867,869,3,136,68,0,868,870,5,105,0,0,869,868,1,0,0,0,869,870, - 1,0,0,0,870,873,1,0,0,0,871,872,5,73,0,0,872,874,3,148,74,0,873, - 871,1,0,0,0,873,874,1,0,0,0,874,876,1,0,0,0,875,877,5,74,0,0,876, - 875,1,0,0,0,876,877,1,0,0,0,877,880,1,0,0,0,878,879,5,75,0,0,879, - 881,3,148,74,0,880,878,1,0,0,0,880,881,1,0,0,0,881,883,1,0,0,0,882, - 884,5,76,0,0,883,882,1,0,0,0,883,884,1,0,0,0,884,885,1,0,0,0,885, - 886,5,127,0,0,886,97,1,0,0,0,887,888,5,49,0,0,888,889,3,146,73,0, - 889,890,5,50,0,0,890,892,3,146,73,0,891,893,3,28,14,0,892,891,1, - 0,0,0,892,893,1,0,0,0,893,896,1,0,0,0,894,895,5,77,0,0,895,897,3, - 148,74,0,896,894,1,0,0,0,896,897,1,0,0,0,897,900,1,0,0,0,898,899, - 5,72,0,0,899,901,5,140,0,0,900,898,1,0,0,0,900,901,1,0,0,0,901,902, - 1,0,0,0,902,906,5,130,0,0,903,905,3,100,50,0,904,903,1,0,0,0,905, - 908,1,0,0,0,906,904,1,0,0,0,906,907,1,0,0,0,907,909,1,0,0,0,908, - 906,1,0,0,0,909,910,5,131,0,0,910,99,1,0,0,0,911,912,5,54,0,0,912, - 918,3,88,44,0,913,918,3,112,56,0,914,918,3,108,54,0,915,918,3,102, - 51,0,916,918,3,110,55,0,917,911,1,0,0,0,917,913,1,0,0,0,917,914, - 1,0,0,0,917,915,1,0,0,0,917,916,1,0,0,0,918,101,1,0,0,0,919,920, - 5,3,0,0,920,924,5,130,0,0,921,923,3,104,52,0,922,921,1,0,0,0,923, - 926,1,0,0,0,924,922,1,0,0,0,924,925,1,0,0,0,925,927,1,0,0,0,926, - 924,1,0,0,0,927,928,5,131,0,0,928,929,5,127,0,0,929,103,1,0,0,0, - 930,931,3,146,73,0,931,932,5,53,0,0,932,933,5,56,0,0,933,934,3,146, - 73,0,934,935,5,127,0,0,935,945,1,0,0,0,936,937,3,146,73,0,937,938, - 5,53,0,0,938,939,5,57,0,0,939,940,3,146,73,0,940,941,5,129,0,0,941, - 942,3,146,73,0,942,943,5,127,0,0,943,945,1,0,0,0,944,930,1,0,0,0, - 944,936,1,0,0,0,945,105,1,0,0,0,946,947,3,26,13,0,947,948,5,13,0, - 0,948,953,5,48,0,0,949,950,5,129,0,0,950,952,3,146,73,0,951,949, - 1,0,0,0,952,955,1,0,0,0,953,951,1,0,0,0,953,954,1,0,0,0,954,956, - 1,0,0,0,955,953,1,0,0,0,956,957,5,127,0,0,957,107,1,0,0,0,958,959, - 5,51,0,0,959,960,3,146,73,0,960,961,5,53,0,0,961,962,5,56,0,0,962, - 963,3,146,73,0,963,964,5,127,0,0,964,109,1,0,0,0,965,966,5,62,0, - 0,966,967,3,146,73,0,967,968,5,63,0,0,968,969,5,64,0,0,969,970,5, - 60,0,0,970,971,5,46,0,0,971,972,3,146,73,0,972,973,5,61,0,0,973, - 974,5,57,0,0,974,975,3,146,73,0,975,976,5,129,0,0,976,977,3,146, - 73,0,977,978,5,127,0,0,978,111,1,0,0,0,979,980,5,51,0,0,980,981, - 3,114,57,0,981,982,5,53,0,0,982,985,3,118,59,0,983,984,5,29,0,0, - 984,986,3,148,74,0,985,983,1,0,0,0,985,986,1,0,0,0,986,987,1,0,0, - 0,987,988,5,127,0,0,988,113,1,0,0,0,989,990,3,146,73,0,990,991,5, - 129,0,0,991,992,3,116,58,0,992,115,1,0,0,0,993,1006,3,146,73,0,994, - 1006,5,94,0,0,995,1006,5,84,0,0,996,1006,5,85,0,0,997,1006,5,1,0, - 0,998,1006,5,91,0,0,999,1006,5,92,0,0,1000,1006,5,93,0,0,1001,1006, - 5,95,0,0,1002,1006,5,96,0,0,1003,1006,5,97,0,0,1004,1006,5,98,0, - 0,1005,993,1,0,0,0,1005,994,1,0,0,0,1005,995,1,0,0,0,1005,996,1, - 0,0,0,1005,997,1,0,0,0,1005,998,1,0,0,0,1005,999,1,0,0,0,1005,1000, - 1,0,0,0,1005,1001,1,0,0,0,1005,1002,1,0,0,0,1005,1003,1,0,0,0,1005, - 1004,1,0,0,0,1006,117,1,0,0,0,1007,1008,5,56,0,0,1008,1009,3,146, - 73,0,1009,1010,5,129,0,0,1010,1011,3,120,60,0,1011,1038,1,0,0,0, - 1012,1013,5,57,0,0,1013,1014,3,146,73,0,1014,1015,5,129,0,0,1015, - 1016,3,146,73,0,1016,1017,5,129,0,0,1017,1018,3,122,61,0,1018,1038, - 1,0,0,0,1019,1020,5,39,0,0,1020,1022,3,146,73,0,1021,1023,3,28,14, - 0,1022,1021,1,0,0,0,1022,1023,1,0,0,0,1023,1024,1,0,0,0,1024,1025, - 5,129,0,0,1025,1026,3,114,57,0,1026,1038,1,0,0,0,1027,1028,5,41, - 0,0,1028,1029,3,146,73,0,1029,1030,5,129,0,0,1030,1032,3,146,73, - 0,1031,1033,3,28,14,0,1032,1031,1,0,0,0,1032,1033,1,0,0,0,1033,1035, - 1,0,0,0,1034,1036,3,124,62,0,1035,1034,1,0,0,0,1035,1036,1,0,0,0, - 1036,1038,1,0,0,0,1037,1007,1,0,0,0,1037,1012,1,0,0,0,1037,1019, - 1,0,0,0,1037,1027,1,0,0,0,1038,119,1,0,0,0,1039,1040,7,4,0,0,1040, - 121,1,0,0,0,1041,1042,7,5,0,0,1042,123,1,0,0,0,1043,1044,5,59,0, - 0,1044,1048,5,130,0,0,1045,1047,3,126,63,0,1046,1045,1,0,0,0,1047, - 1050,1,0,0,0,1048,1046,1,0,0,0,1048,1049,1,0,0,0,1049,1051,1,0,0, - 0,1050,1048,1,0,0,0,1051,1052,5,131,0,0,1052,125,1,0,0,0,1053,1054, - 3,146,73,0,1054,1055,5,53,0,0,1055,1056,5,4,0,0,1056,1057,5,18,0, - 0,1057,1058,5,132,0,0,1058,1059,3,76,38,0,1059,1060,5,133,0,0,1060, - 1061,5,127,0,0,1061,1150,1,0,0,0,1062,1063,3,146,73,0,1063,1064, - 5,53,0,0,1064,1065,5,56,0,0,1065,1072,3,146,73,0,1066,1067,5,61, - 0,0,1067,1068,5,57,0,0,1068,1069,3,146,73,0,1069,1070,5,129,0,0, - 1070,1071,3,146,73,0,1071,1073,1,0,0,0,1072,1066,1,0,0,0,1072,1073, - 1,0,0,0,1073,1074,1,0,0,0,1074,1075,5,127,0,0,1075,1150,1,0,0,0, - 1076,1077,3,146,73,0,1077,1078,5,53,0,0,1078,1079,5,57,0,0,1079, - 1080,3,146,73,0,1080,1081,5,129,0,0,1081,1088,3,146,73,0,1082,1083, - 5,61,0,0,1083,1084,5,57,0,0,1084,1085,3,146,73,0,1085,1086,5,129, - 0,0,1086,1087,3,146,73,0,1087,1089,1,0,0,0,1088,1082,1,0,0,0,1088, - 1089,1,0,0,0,1089,1090,1,0,0,0,1090,1091,5,127,0,0,1091,1150,1,0, - 0,0,1092,1093,3,146,73,0,1093,1094,5,53,0,0,1094,1095,5,39,0,0,1095, - 1097,3,146,73,0,1096,1098,3,28,14,0,1097,1096,1,0,0,0,1097,1098, - 1,0,0,0,1098,1105,1,0,0,0,1099,1100,5,61,0,0,1100,1101,5,57,0,0, - 1101,1102,3,146,73,0,1102,1103,5,129,0,0,1103,1104,3,146,73,0,1104, - 1106,1,0,0,0,1105,1099,1,0,0,0,1105,1106,1,0,0,0,1106,1107,1,0,0, - 0,1107,1108,5,127,0,0,1108,1150,1,0,0,0,1109,1110,3,146,73,0,1110, - 1111,5,53,0,0,1111,1112,5,2,0,0,1112,1113,3,146,73,0,1113,1114,5, - 59,0,0,1114,1118,5,130,0,0,1115,1117,3,106,53,0,1116,1115,1,0,0, - 0,1117,1120,1,0,0,0,1118,1116,1,0,0,0,1118,1119,1,0,0,0,1119,1121, - 1,0,0,0,1120,1118,1,0,0,0,1121,1122,5,131,0,0,1122,1123,5,127,0, - 0,1123,1150,1,0,0,0,1124,1125,3,146,73,0,1125,1126,5,53,0,0,1126, - 1127,5,46,0,0,1127,1128,3,146,73,0,1128,1129,5,127,0,0,1129,1150, - 1,0,0,0,1130,1131,3,146,73,0,1131,1133,5,53,0,0,1132,1134,5,4,0, - 0,1133,1132,1,0,0,0,1133,1134,1,0,0,0,1134,1135,1,0,0,0,1135,1136, - 5,17,0,0,1136,1137,3,146,73,0,1137,1138,5,129,0,0,1138,1145,3,146, - 73,0,1139,1140,5,61,0,0,1140,1141,5,57,0,0,1141,1142,3,146,73,0, - 1142,1143,5,129,0,0,1143,1144,3,146,73,0,1144,1146,1,0,0,0,1145, - 1139,1,0,0,0,1145,1146,1,0,0,0,1146,1147,1,0,0,0,1147,1148,5,127, - 0,0,1148,1150,1,0,0,0,1149,1053,1,0,0,0,1149,1062,1,0,0,0,1149,1076, - 1,0,0,0,1149,1092,1,0,0,0,1149,1109,1,0,0,0,1149,1124,1,0,0,0,1149, - 1130,1,0,0,0,1150,127,1,0,0,0,1151,1152,5,46,0,0,1152,1153,3,146, - 73,0,1153,1154,5,53,0,0,1154,1155,3,146,73,0,1155,1156,5,129,0,0, - 1156,1158,3,146,73,0,1157,1159,3,124,62,0,1158,1157,1,0,0,0,1158, - 1159,1,0,0,0,1159,1160,1,0,0,0,1160,1161,5,127,0,0,1161,129,1,0, - 0,0,1162,1209,3,134,67,0,1163,1209,5,106,0,0,1164,1209,5,107,0,0, - 1165,1166,5,108,0,0,1166,1209,3,148,74,0,1167,1168,5,109,0,0,1168, - 1169,5,136,0,0,1169,1170,3,146,73,0,1170,1171,5,137,0,0,1171,1209, - 1,0,0,0,1172,1173,5,110,0,0,1173,1174,5,136,0,0,1174,1176,3,146, - 73,0,1175,1177,3,28,14,0,1176,1175,1,0,0,0,1176,1177,1,0,0,0,1177, - 1178,1,0,0,0,1178,1179,5,137,0,0,1179,1209,1,0,0,0,1180,1181,5,34, - 0,0,1181,1182,5,136,0,0,1182,1183,3,146,73,0,1183,1184,5,137,0,0, - 1184,1209,1,0,0,0,1185,1186,5,111,0,0,1186,1187,5,136,0,0,1187,1188, - 3,130,65,0,1188,1189,5,137,0,0,1189,1209,1,0,0,0,1190,1191,5,112, - 0,0,1191,1192,5,136,0,0,1192,1193,3,130,65,0,1193,1194,5,137,0,0, - 1194,1209,1,0,0,0,1195,1196,5,113,0,0,1196,1200,5,130,0,0,1197,1199, - 3,132,66,0,1198,1197,1,0,0,0,1199,1202,1,0,0,0,1200,1198,1,0,0,0, - 1200,1201,1,0,0,0,1201,1203,1,0,0,0,1202,1200,1,0,0,0,1203,1209, - 5,131,0,0,1204,1206,3,146,73,0,1205,1207,3,28,14,0,1206,1205,1,0, - 0,0,1206,1207,1,0,0,0,1207,1209,1,0,0,0,1208,1162,1,0,0,0,1208,1163, - 1,0,0,0,1208,1164,1,0,0,0,1208,1165,1,0,0,0,1208,1167,1,0,0,0,1208, - 1172,1,0,0,0,1208,1180,1,0,0,0,1208,1185,1,0,0,0,1208,1190,1,0,0, - 0,1208,1195,1,0,0,0,1208,1204,1,0,0,0,1209,131,1,0,0,0,1210,1211, - 3,146,73,0,1211,1212,5,126,0,0,1212,1213,3,130,65,0,1213,1214,5, - 127,0,0,1214,133,1,0,0,0,1215,1216,7,6,0,0,1216,135,1,0,0,0,1217, - 1218,7,7,0,0,1218,137,1,0,0,0,1219,1228,3,148,74,0,1220,1228,5,140, - 0,0,1221,1228,5,141,0,0,1222,1228,5,122,0,0,1223,1228,5,123,0,0, - 1224,1228,5,124,0,0,1225,1228,3,140,70,0,1226,1228,3,144,72,0,1227, - 1219,1,0,0,0,1227,1220,1,0,0,0,1227,1221,1,0,0,0,1227,1222,1,0,0, - 0,1227,1223,1,0,0,0,1227,1224,1,0,0,0,1227,1225,1,0,0,0,1227,1226, - 1,0,0,0,1228,139,1,0,0,0,1229,1238,5,130,0,0,1230,1235,3,142,71, - 0,1231,1232,5,128,0,0,1232,1234,3,142,71,0,1233,1231,1,0,0,0,1234, - 1237,1,0,0,0,1235,1233,1,0,0,0,1235,1236,1,0,0,0,1236,1239,1,0,0, - 0,1237,1235,1,0,0,0,1238,1230,1,0,0,0,1238,1239,1,0,0,0,1239,1240, - 1,0,0,0,1240,1241,5,131,0,0,1241,141,1,0,0,0,1242,1243,3,148,74, - 0,1243,1244,5,126,0,0,1244,1245,3,138,69,0,1245,143,1,0,0,0,1246, - 1255,5,132,0,0,1247,1252,3,138,69,0,1248,1249,5,128,0,0,1249,1251, - 3,138,69,0,1250,1248,1,0,0,0,1251,1254,1,0,0,0,1252,1250,1,0,0,0, - 1252,1253,1,0,0,0,1253,1256,1,0,0,0,1254,1252,1,0,0,0,1255,1247, - 1,0,0,0,1255,1256,1,0,0,0,1256,1257,1,0,0,0,1257,1258,5,133,0,0, - 1258,145,1,0,0,0,1259,1260,7,8,0,0,1260,147,1,0,0,0,1261,1262,5, - 143,0,0,1262,149,1,0,0,0,111,162,169,190,202,214,234,242,249,255, - 267,270,276,287,296,306,309,311,315,323,335,340,349,352,367,373, - 385,394,402,410,423,426,436,440,446,453,459,467,475,488,495,499, - 504,515,521,531,536,542,553,580,607,612,623,626,631,638,647,650, - 663,672,686,707,710,713,720,728,768,771,793,807,815,827,841,851, - 869,873,876,880,883,892,896,900,906,917,924,944,953,985,1005,1022, - 1032,1035,1037,1048,1072,1088,1097,1105,1118,1133,1145,1149,1158, - 1176,1200,1206,1208,1227,1235,1238,1252,1255 + 1,65,1,65,3,65,1109,8,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65, + 1118,8,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65,1126,8,65,1,65,1,65, + 1,65,1,65,1,65,1,65,1,65,1,65,1,65,5,65,1137,8,65,10,65,12,65,1140, + 9,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65, + 3,65,1154,8,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65, + 3,65,1166,8,65,1,65,1,65,3,65,1170,8,65,1,66,1,66,1,66,1,66,1,66, + 1,66,1,66,3,66,1179,8,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,67,1,67,1,67,1,67,3,67,1197,8,67,1,67,1,67, + 1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67, + 1,67,1,67,1,67,1,67,1,67,5,67,1219,8,67,10,67,12,67,1222,9,67,1, + 67,1,67,1,67,3,67,1227,8,67,3,67,1229,8,67,1,68,1,68,1,68,1,68,1, + 68,1,69,1,69,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,3, + 71,1248,8,71,1,72,1,72,1,72,1,72,5,72,1254,8,72,10,72,12,72,1257, + 9,72,3,72,1259,8,72,1,72,1,72,1,73,1,73,1,73,1,73,1,74,1,74,1,74, + 1,74,5,74,1271,8,74,10,74,12,74,1274,9,74,3,74,1276,8,74,1,74,1, + 74,1,75,1,75,1,76,1,76,1,76,0,0,77,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,0,9,2,0,10,10,28,28,1,0,6,7,1,0,95,99, + 3,0,1,1,90,94,96,97,3,0,1,1,90,91,96,97,2,0,92,94,96,97,1,0,115, + 122,1,0,102,105,7,0,1,3,5,28,40,40,69,69,88,89,100,100,143,143,1388, + 0,166,1,0,0,0,2,168,1,0,0,0,4,178,1,0,0,0,6,182,1,0,0,0,8,206,1, + 0,0,0,10,218,1,0,0,0,12,220,1,0,0,0,14,227,1,0,0,0,16,238,1,0,0, + 0,18,240,1,0,0,0,20,253,1,0,0,0,22,285,1,0,0,0,24,315,1,0,0,0,26, + 317,1,0,0,0,28,321,1,0,0,0,30,339,1,0,0,0,32,341,1,0,0,0,34,353, + 1,0,0,0,36,356,1,0,0,0,38,377,1,0,0,0,40,427,1,0,0,0,42,430,1,0, + 0,0,44,455,1,0,0,0,46,492,1,0,0,0,48,503,1,0,0,0,50,508,1,0,0,0, + 52,535,1,0,0,0,54,537,1,0,0,0,56,562,1,0,0,0,58,611,1,0,0,0,60,613, + 1,0,0,0,62,642,1,0,0,0,64,664,1,0,0,0,66,677,1,0,0,0,68,679,1,0, + 0,0,70,691,1,0,0,0,72,704,1,0,0,0,74,707,1,0,0,0,76,727,1,0,0,0, + 78,729,1,0,0,0,80,737,1,0,0,0,82,821,1,0,0,0,84,823,1,0,0,0,86,834, + 1,0,0,0,88,836,1,0,0,0,90,841,1,0,0,0,92,843,1,0,0,0,94,865,1,0, + 0,0,96,867,1,0,0,0,98,876,1,0,0,0,100,901,1,0,0,0,102,931,1,0,0, + 0,104,933,1,0,0,0,106,958,1,0,0,0,108,960,1,0,0,0,110,972,1,0,0, + 0,112,979,1,0,0,0,114,993,1,0,0,0,116,1003,1,0,0,0,118,1019,1,0, + 0,0,120,1054,1,0,0,0,122,1056,1,0,0,0,124,1059,1,0,0,0,126,1061, + 1,0,0,0,128,1063,1,0,0,0,130,1169,1,0,0,0,132,1171,1,0,0,0,134,1228, + 1,0,0,0,136,1230,1,0,0,0,138,1235,1,0,0,0,140,1237,1,0,0,0,142,1247, + 1,0,0,0,144,1249,1,0,0,0,146,1262,1,0,0,0,148,1266,1,0,0,0,150,1279, + 1,0,0,0,152,1281,1,0,0,0,154,155,3,6,3,0,155,156,5,0,0,1,156,167, + 1,0,0,0,157,158,3,20,10,0,158,159,5,0,0,1,159,167,1,0,0,0,160,161, + 3,50,25,0,161,162,5,0,0,1,162,167,1,0,0,0,163,164,3,2,1,0,164,165, + 5,0,0,1,165,167,1,0,0,0,166,154,1,0,0,0,166,157,1,0,0,0,166,160, + 1,0,0,0,166,163,1,0,0,0,167,1,1,0,0,0,168,169,5,35,0,0,169,173,5, + 131,0,0,170,172,3,8,4,0,171,170,1,0,0,0,172,175,1,0,0,0,173,171, + 1,0,0,0,173,174,1,0,0,0,174,176,1,0,0,0,175,173,1,0,0,0,176,177, + 5,132,0,0,177,3,1,0,0,0,178,179,5,36,0,0,179,180,3,152,76,0,180, + 181,5,128,0,0,181,5,1,0,0,0,182,183,5,4,0,0,183,184,3,150,75,0,184, + 185,5,78,0,0,185,186,3,152,76,0,186,187,5,72,0,0,187,188,3,152,76, + 0,188,189,5,71,0,0,189,190,3,152,76,0,190,194,5,131,0,0,191,193, + 3,8,4,0,192,191,1,0,0,0,193,196,1,0,0,0,194,192,1,0,0,0,194,195, + 1,0,0,0,195,197,1,0,0,0,196,194,1,0,0,0,197,198,5,132,0,0,198,7, + 1,0,0,0,199,207,3,4,2,0,200,207,3,18,9,0,201,207,3,10,5,0,202,207, + 3,88,44,0,203,207,3,100,50,0,204,207,3,132,66,0,205,207,3,32,16, + 0,206,199,1,0,0,0,206,200,1,0,0,0,206,201,1,0,0,0,206,202,1,0,0, + 0,206,203,1,0,0,0,206,204,1,0,0,0,206,205,1,0,0,0,207,9,1,0,0,0, + 208,209,5,36,0,0,209,210,5,39,0,0,210,211,3,150,75,0,211,212,5,128, + 0,0,212,219,1,0,0,0,213,214,5,36,0,0,214,215,5,41,0,0,215,216,3, + 150,75,0,216,217,5,128,0,0,217,219,1,0,0,0,218,208,1,0,0,0,218,213, + 1,0,0,0,219,11,1,0,0,0,220,221,5,37,0,0,221,222,5,38,0,0,222,223, + 3,150,75,0,223,224,5,78,0,0,224,225,3,152,76,0,225,226,5,128,0,0, + 226,13,1,0,0,0,227,228,5,37,0,0,228,229,5,39,0,0,229,230,3,150,75, + 0,230,231,5,72,0,0,231,232,3,152,76,0,232,233,5,128,0,0,233,15,1, + 0,0,0,234,239,3,10,5,0,235,239,3,12,6,0,236,239,3,14,7,0,237,239, + 3,32,16,0,238,234,1,0,0,0,238,235,1,0,0,0,238,236,1,0,0,0,238,237, + 1,0,0,0,239,17,1,0,0,0,240,241,5,38,0,0,241,242,3,150,75,0,242,243, + 5,78,0,0,243,246,3,152,76,0,244,245,5,79,0,0,245,247,3,152,76,0, + 246,244,1,0,0,0,246,247,1,0,0,0,247,248,1,0,0,0,248,249,5,128,0, + 0,249,19,1,0,0,0,250,252,3,16,8,0,251,250,1,0,0,0,252,255,1,0,0, + 0,253,251,1,0,0,0,253,254,1,0,0,0,254,256,1,0,0,0,255,253,1,0,0, + 0,256,257,5,39,0,0,257,259,3,150,75,0,258,260,3,22,11,0,259,258, + 1,0,0,0,259,260,1,0,0,0,260,261,1,0,0,0,261,262,5,78,0,0,262,263, + 3,152,76,0,263,264,5,72,0,0,264,274,3,152,76,0,265,266,5,83,0,0, + 266,271,3,26,13,0,267,268,5,129,0,0,268,270,3,26,13,0,269,267,1, + 0,0,0,270,273,1,0,0,0,271,269,1,0,0,0,271,272,1,0,0,0,272,275,1, + 0,0,0,273,271,1,0,0,0,274,265,1,0,0,0,274,275,1,0,0,0,275,276,1, + 0,0,0,276,280,5,131,0,0,277,279,3,34,17,0,278,277,1,0,0,0,279,282, + 1,0,0,0,280,278,1,0,0,0,280,281,1,0,0,0,281,283,1,0,0,0,282,280, + 1,0,0,0,283,284,5,132,0,0,284,21,1,0,0,0,285,286,5,137,0,0,286,291, + 3,24,12,0,287,288,5,129,0,0,288,290,3,24,12,0,289,287,1,0,0,0,290, + 293,1,0,0,0,291,289,1,0,0,0,291,292,1,0,0,0,292,294,1,0,0,0,293, + 291,1,0,0,0,294,295,5,138,0,0,295,23,1,0,0,0,296,297,5,42,0,0,297, + 300,3,150,75,0,298,299,5,127,0,0,299,301,5,32,0,0,300,298,1,0,0, + 0,300,301,1,0,0,0,301,316,1,0,0,0,302,303,5,31,0,0,303,313,3,150, + 75,0,304,305,5,33,0,0,305,310,3,26,13,0,306,307,5,139,0,0,307,309, + 3,26,13,0,308,306,1,0,0,0,309,312,1,0,0,0,310,308,1,0,0,0,310,311, + 1,0,0,0,311,314,1,0,0,0,312,310,1,0,0,0,313,304,1,0,0,0,313,314, + 1,0,0,0,314,316,1,0,0,0,315,296,1,0,0,0,315,302,1,0,0,0,316,25,1, + 0,0,0,317,319,3,150,75,0,318,320,3,28,14,0,319,318,1,0,0,0,319,320, + 1,0,0,0,320,27,1,0,0,0,321,322,5,137,0,0,322,327,3,30,15,0,323,324, + 5,129,0,0,324,326,3,30,15,0,325,323,1,0,0,0,326,329,1,0,0,0,327, + 325,1,0,0,0,327,328,1,0,0,0,328,330,1,0,0,0,329,327,1,0,0,0,330, + 331,5,138,0,0,331,29,1,0,0,0,332,333,5,38,0,0,333,340,3,150,75,0, + 334,335,5,39,0,0,335,340,3,26,13,0,336,337,5,31,0,0,337,340,3,150, + 75,0,338,340,3,134,67,0,339,332,1,0,0,0,339,334,1,0,0,0,339,336, + 1,0,0,0,339,338,1,0,0,0,340,31,1,0,0,0,341,342,5,30,0,0,342,344, + 3,150,75,0,343,345,3,22,11,0,344,343,1,0,0,0,344,345,1,0,0,0,345, + 346,1,0,0,0,346,347,5,140,0,0,347,348,3,134,67,0,348,349,5,128,0, + 0,349,33,1,0,0,0,350,354,3,38,19,0,351,354,3,42,21,0,352,354,3,36, + 18,0,353,350,1,0,0,0,353,351,1,0,0,0,353,352,1,0,0,0,354,35,1,0, + 0,0,355,357,5,52,0,0,356,355,1,0,0,0,356,357,1,0,0,0,357,358,1,0, + 0,0,358,359,5,44,0,0,359,360,3,150,75,0,360,361,5,78,0,0,361,362, + 3,152,76,0,362,363,5,127,0,0,363,364,3,134,67,0,364,365,5,126,0, + 0,365,366,3,134,67,0,366,367,5,131,0,0,367,368,5,95,0,0,368,369, + 5,78,0,0,369,371,3,152,76,0,370,372,3,66,33,0,371,370,1,0,0,0,371, + 372,1,0,0,0,372,373,1,0,0,0,373,374,5,128,0,0,374,375,5,132,0,0, + 375,37,1,0,0,0,376,378,3,44,22,0,377,376,1,0,0,0,377,378,1,0,0,0, + 378,379,1,0,0,0,379,380,5,42,0,0,380,381,3,150,75,0,381,382,5,78, + 0,0,382,383,3,152,76,0,383,384,5,127,0,0,384,385,3,134,67,0,385, + 389,5,131,0,0,386,388,3,40,20,0,387,386,1,0,0,0,388,391,1,0,0,0, + 389,387,1,0,0,0,389,390,1,0,0,0,390,392,1,0,0,0,391,389,1,0,0,0, + 392,393,5,132,0,0,393,39,1,0,0,0,394,395,5,85,0,0,395,396,5,78,0, + 0,396,398,3,152,76,0,397,399,3,66,33,0,398,397,1,0,0,0,398,399,1, + 0,0,0,399,400,1,0,0,0,400,401,5,128,0,0,401,428,1,0,0,0,402,403, + 5,86,0,0,403,404,5,78,0,0,404,406,3,152,76,0,405,407,3,66,33,0,406, + 405,1,0,0,0,406,407,1,0,0,0,407,408,1,0,0,0,408,409,5,128,0,0,409, + 428,1,0,0,0,410,411,5,1,0,0,411,412,5,78,0,0,412,414,3,152,76,0, + 413,415,3,66,33,0,414,413,1,0,0,0,414,415,1,0,0,0,415,416,1,0,0, + 0,416,417,5,128,0,0,417,428,1,0,0,0,418,419,5,87,0,0,419,420,5,88, + 0,0,420,421,5,78,0,0,421,422,3,152,76,0,422,423,5,89,0,0,423,424, + 5,78,0,0,424,425,3,152,76,0,425,426,5,128,0,0,426,428,1,0,0,0,427, + 394,1,0,0,0,427,402,1,0,0,0,427,410,1,0,0,0,427,418,1,0,0,0,428, + 41,1,0,0,0,429,431,3,44,22,0,430,429,1,0,0,0,430,431,1,0,0,0,431, + 432,1,0,0,0,432,433,5,43,0,0,433,434,3,150,75,0,434,435,5,78,0,0, + 435,436,3,152,76,0,436,437,5,127,0,0,437,438,3,140,70,0,438,440, + 3,48,24,0,439,441,5,106,0,0,440,439,1,0,0,0,440,441,1,0,0,0,441, + 444,1,0,0,0,442,443,5,76,0,0,443,445,3,152,76,0,444,442,1,0,0,0, + 444,445,1,0,0,0,445,446,1,0,0,0,446,450,5,131,0,0,447,449,3,46,23, + 0,448,447,1,0,0,0,449,452,1,0,0,0,450,448,1,0,0,0,450,451,1,0,0, + 0,451,453,1,0,0,0,452,450,1,0,0,0,453,454,5,132,0,0,454,43,1,0,0, + 0,455,457,5,27,0,0,456,458,7,0,0,0,457,456,1,0,0,0,457,458,1,0,0, + 0,458,45,1,0,0,0,459,460,5,92,0,0,460,461,5,78,0,0,461,463,3,152, + 76,0,462,464,3,66,33,0,463,462,1,0,0,0,463,464,1,0,0,0,464,465,1, + 0,0,0,465,466,5,128,0,0,466,493,1,0,0,0,467,468,5,93,0,0,468,469, + 5,78,0,0,469,471,3,152,76,0,470,472,3,66,33,0,471,470,1,0,0,0,471, + 472,1,0,0,0,472,473,1,0,0,0,473,474,5,128,0,0,474,493,1,0,0,0,475, + 476,5,94,0,0,476,477,5,78,0,0,477,479,3,152,76,0,478,480,3,66,33, + 0,479,478,1,0,0,0,479,480,1,0,0,0,480,481,1,0,0,0,481,482,5,128, + 0,0,482,493,1,0,0,0,483,484,5,87,0,0,484,485,5,88,0,0,485,486,5, + 78,0,0,486,487,3,152,76,0,487,488,5,89,0,0,488,489,5,78,0,0,489, + 490,3,152,76,0,490,491,5,128,0,0,491,493,1,0,0,0,492,459,1,0,0,0, + 492,467,1,0,0,0,492,475,1,0,0,0,492,483,1,0,0,0,493,47,1,0,0,0,494, + 495,5,38,0,0,495,504,3,150,75,0,496,497,5,39,0,0,497,499,3,150,75, + 0,498,500,3,28,14,0,499,498,1,0,0,0,499,500,1,0,0,0,500,504,1,0, + 0,0,501,502,5,31,0,0,502,504,3,150,75,0,503,494,1,0,0,0,503,496, + 1,0,0,0,503,501,1,0,0,0,504,49,1,0,0,0,505,507,3,16,8,0,506,505, + 1,0,0,0,507,510,1,0,0,0,508,506,1,0,0,0,508,509,1,0,0,0,509,511, + 1,0,0,0,510,508,1,0,0,0,511,512,5,41,0,0,512,513,3,150,75,0,513, + 514,5,78,0,0,514,515,3,152,76,0,515,516,5,72,0,0,516,519,3,152,76, + 0,517,518,5,73,0,0,518,520,5,141,0,0,519,517,1,0,0,0,519,520,1,0, + 0,0,520,521,1,0,0,0,521,525,5,131,0,0,522,524,3,52,26,0,523,522, + 1,0,0,0,524,527,1,0,0,0,525,523,1,0,0,0,525,526,1,0,0,0,526,528, + 1,0,0,0,527,525,1,0,0,0,528,529,5,132,0,0,529,51,1,0,0,0,530,536, + 3,60,30,0,531,536,3,62,31,0,532,536,3,70,35,0,533,536,3,54,27,0, + 534,536,3,56,28,0,535,530,1,0,0,0,535,531,1,0,0,0,535,532,1,0,0, + 0,535,533,1,0,0,0,535,534,1,0,0,0,536,53,1,0,0,0,537,538,5,17,0, + 0,538,540,3,150,75,0,539,541,3,22,11,0,540,539,1,0,0,0,540,541,1, + 0,0,0,541,542,1,0,0,0,542,543,5,78,0,0,543,544,3,152,76,0,544,546, + 5,20,0,0,545,547,5,4,0,0,546,545,1,0,0,0,546,547,1,0,0,0,547,548, + 1,0,0,0,548,549,3,26,13,0,549,550,5,21,0,0,550,551,3,152,76,0,551, + 552,5,44,0,0,552,553,3,152,76,0,553,557,5,131,0,0,554,556,3,58,29, + 0,555,554,1,0,0,0,556,559,1,0,0,0,557,555,1,0,0,0,557,558,1,0,0, + 0,558,560,1,0,0,0,559,557,1,0,0,0,560,561,5,132,0,0,561,55,1,0,0, + 0,562,563,5,17,0,0,563,564,3,150,75,0,564,565,5,78,0,0,565,566,3, + 152,76,0,566,567,5,19,0,0,567,568,3,150,75,0,568,569,3,28,14,0,569, + 570,5,128,0,0,570,57,1,0,0,0,571,572,5,11,0,0,572,612,5,128,0,0, + 573,574,5,12,0,0,574,575,5,13,0,0,575,576,3,150,75,0,576,577,5,128, + 0,0,577,612,1,0,0,0,578,579,5,22,0,0,579,580,3,152,76,0,580,581, + 5,128,0,0,581,612,1,0,0,0,582,584,5,23,0,0,583,585,5,31,0,0,584, + 583,1,0,0,0,584,585,1,0,0,0,585,586,1,0,0,0,586,587,3,150,75,0,587, + 588,5,50,0,0,588,589,3,26,13,0,589,590,5,128,0,0,590,612,1,0,0,0, + 591,592,5,24,0,0,592,593,3,150,75,0,593,594,5,141,0,0,594,595,5, + 128,0,0,595,612,1,0,0,0,596,597,5,25,0,0,597,598,3,26,13,0,598,599, + 5,130,0,0,599,600,3,150,75,0,600,601,3,150,75,0,601,602,3,152,76, + 0,602,603,5,128,0,0,603,612,1,0,0,0,604,605,5,87,0,0,605,612,5,128, + 0,0,606,607,5,26,0,0,607,608,5,141,0,0,608,609,3,152,76,0,609,610, + 5,128,0,0,610,612,1,0,0,0,611,571,1,0,0,0,611,573,1,0,0,0,611,578, + 1,0,0,0,611,582,1,0,0,0,611,591,1,0,0,0,611,596,1,0,0,0,611,604, + 1,0,0,0,611,606,1,0,0,0,612,59,1,0,0,0,613,614,5,44,0,0,614,616, + 3,150,75,0,615,617,3,22,11,0,616,615,1,0,0,0,616,617,1,0,0,0,617, + 618,1,0,0,0,618,619,5,78,0,0,619,620,3,152,76,0,620,621,5,127,0, + 0,621,622,3,134,67,0,622,623,5,126,0,0,623,624,3,134,67,0,624,625, + 5,80,0,0,625,627,3,74,37,0,626,628,3,66,33,0,627,626,1,0,0,0,627, + 628,1,0,0,0,628,630,1,0,0,0,629,631,3,72,36,0,630,629,1,0,0,0,630, + 631,1,0,0,0,631,632,1,0,0,0,632,633,5,82,0,0,633,635,3,76,38,0,634, + 636,3,80,40,0,635,634,1,0,0,0,635,636,1,0,0,0,636,638,1,0,0,0,637, + 639,3,64,32,0,638,637,1,0,0,0,638,639,1,0,0,0,639,640,1,0,0,0,640, + 641,5,128,0,0,641,61,1,0,0,0,642,643,5,45,0,0,643,645,3,150,75,0, + 644,646,3,22,11,0,645,644,1,0,0,0,645,646,1,0,0,0,646,647,1,0,0, + 0,647,648,5,78,0,0,648,649,3,152,76,0,649,650,5,127,0,0,650,651, + 3,134,67,0,651,652,5,126,0,0,652,654,3,134,67,0,653,655,3,66,33, + 0,654,653,1,0,0,0,654,655,1,0,0,0,655,657,1,0,0,0,656,658,3,80,40, + 0,657,656,1,0,0,0,657,658,1,0,0,0,658,660,1,0,0,0,659,661,3,64,32, + 0,660,659,1,0,0,0,660,661,1,0,0,0,661,662,1,0,0,0,662,663,5,128, + 0,0,663,63,1,0,0,0,664,665,5,61,0,0,665,666,5,60,0,0,666,667,3,150, + 75,0,667,65,1,0,0,0,668,669,5,5,0,0,669,678,5,8,0,0,670,671,5,5, + 0,0,671,672,7,1,0,0,672,673,5,9,0,0,673,674,5,133,0,0,674,675,3, + 78,39,0,675,676,5,134,0,0,676,678,1,0,0,0,677,668,1,0,0,0,677,670, + 1,0,0,0,678,67,1,0,0,0,679,680,5,60,0,0,680,681,5,133,0,0,681,686, + 3,116,58,0,682,683,5,129,0,0,683,685,3,116,58,0,684,682,1,0,0,0, + 685,688,1,0,0,0,686,684,1,0,0,0,686,687,1,0,0,0,687,689,1,0,0,0, + 688,686,1,0,0,0,689,690,5,134,0,0,690,69,1,0,0,0,691,692,5,46,0, + 0,692,693,3,150,75,0,693,694,5,78,0,0,694,695,3,152,76,0,695,696, + 5,47,0,0,696,697,3,150,75,0,697,698,5,127,0,0,698,700,3,134,67,0, + 699,701,3,80,40,0,700,699,1,0,0,0,700,701,1,0,0,0,701,702,1,0,0, + 0,702,703,5,128,0,0,703,71,1,0,0,0,704,705,5,81,0,0,705,706,3,134, + 67,0,706,73,1,0,0,0,707,708,7,2,0,0,708,75,1,0,0,0,709,728,5,84, + 0,0,710,711,5,38,0,0,711,728,3,150,75,0,712,713,5,31,0,0,713,728, + 3,150,75,0,714,715,5,40,0,0,715,724,5,133,0,0,716,721,3,26,13,0, + 717,718,5,129,0,0,718,720,3,26,13,0,719,717,1,0,0,0,720,723,1,0, + 0,0,721,719,1,0,0,0,721,722,1,0,0,0,722,725,1,0,0,0,723,721,1,0, + 0,0,724,716,1,0,0,0,724,725,1,0,0,0,725,726,1,0,0,0,726,728,5,134, + 0,0,727,709,1,0,0,0,727,710,1,0,0,0,727,712,1,0,0,0,727,714,1,0, + 0,0,728,77,1,0,0,0,729,734,3,150,75,0,730,731,5,129,0,0,731,733, + 3,150,75,0,732,730,1,0,0,0,733,736,1,0,0,0,734,732,1,0,0,0,734,735, + 1,0,0,0,735,79,1,0,0,0,736,734,1,0,0,0,737,738,5,83,0,0,738,742, + 5,131,0,0,739,741,3,82,41,0,740,739,1,0,0,0,741,744,1,0,0,0,742, + 740,1,0,0,0,742,743,1,0,0,0,743,745,1,0,0,0,744,742,1,0,0,0,745, + 746,5,132,0,0,746,81,1,0,0,0,747,748,5,18,0,0,748,749,3,150,75,0, + 749,750,5,78,0,0,750,751,3,152,76,0,751,752,5,133,0,0,752,753,3, + 78,39,0,753,754,5,134,0,0,754,755,5,128,0,0,755,822,1,0,0,0,756, + 757,5,56,0,0,757,758,3,150,75,0,758,759,5,78,0,0,759,760,3,152,76, + 0,760,761,5,127,0,0,761,762,3,134,67,0,762,763,3,84,42,0,763,764, + 5,128,0,0,764,822,1,0,0,0,765,766,5,57,0,0,766,767,3,150,75,0,767, + 768,5,78,0,0,768,769,3,152,76,0,769,770,5,127,0,0,770,771,3,140, + 70,0,771,772,3,48,24,0,772,773,3,84,42,0,773,774,5,128,0,0,774,822, + 1,0,0,0,775,776,5,39,0,0,776,777,3,150,75,0,777,778,5,78,0,0,778, + 779,3,152,76,0,779,780,5,127,0,0,780,782,3,150,75,0,781,783,3,28, + 14,0,782,781,1,0,0,0,782,783,1,0,0,0,783,785,1,0,0,0,784,786,3,68, + 34,0,785,784,1,0,0,0,785,786,1,0,0,0,786,787,1,0,0,0,787,788,5,128, + 0,0,788,822,1,0,0,0,789,790,5,2,0,0,790,791,3,150,75,0,791,792,5, + 78,0,0,792,793,3,152,76,0,793,794,5,127,0,0,794,795,3,150,75,0,795, + 796,5,48,0,0,796,797,3,134,67,0,797,798,5,128,0,0,798,822,1,0,0, + 0,799,800,5,46,0,0,800,801,3,150,75,0,801,802,5,78,0,0,802,803,3, + 152,76,0,803,804,5,127,0,0,804,807,3,150,75,0,805,806,5,48,0,0,806, + 808,3,134,67,0,807,805,1,0,0,0,807,808,1,0,0,0,808,809,1,0,0,0,809, + 810,5,128,0,0,810,822,1,0,0,0,811,812,5,17,0,0,812,813,3,150,75, + 0,813,814,5,78,0,0,814,815,3,152,76,0,815,816,5,127,0,0,816,817, + 3,150,75,0,817,818,5,130,0,0,818,819,3,150,75,0,819,820,5,128,0, + 0,820,822,1,0,0,0,821,747,1,0,0,0,821,756,1,0,0,0,821,765,1,0,0, + 0,821,775,1,0,0,0,821,789,1,0,0,0,821,799,1,0,0,0,821,811,1,0,0, + 0,822,83,1,0,0,0,823,824,5,133,0,0,824,829,3,86,43,0,825,826,5,129, + 0,0,826,828,3,86,43,0,827,825,1,0,0,0,828,831,1,0,0,0,829,827,1, + 0,0,0,829,830,1,0,0,0,830,832,1,0,0,0,831,829,1,0,0,0,832,833,5, + 134,0,0,833,85,1,0,0,0,834,835,7,3,0,0,835,87,1,0,0,0,836,837,5, + 55,0,0,837,838,3,90,45,0,838,89,1,0,0,0,839,842,3,92,46,0,840,842, + 3,96,48,0,841,839,1,0,0,0,841,840,1,0,0,0,842,91,1,0,0,0,843,844, + 5,56,0,0,844,845,3,150,75,0,845,846,5,78,0,0,846,847,3,152,76,0, + 847,848,5,66,0,0,848,849,3,150,75,0,849,850,5,127,0,0,850,851,3, + 134,67,0,851,852,5,67,0,0,852,855,3,94,47,0,853,854,5,68,0,0,854, + 856,3,142,71,0,855,853,1,0,0,0,855,856,1,0,0,0,856,857,1,0,0,0,857, + 858,5,128,0,0,858,93,1,0,0,0,859,866,5,100,0,0,860,861,5,101,0,0, + 861,862,5,135,0,0,862,863,3,134,67,0,863,864,5,136,0,0,864,866,1, + 0,0,0,865,859,1,0,0,0,865,860,1,0,0,0,866,95,1,0,0,0,867,868,5,57, + 0,0,868,869,3,150,75,0,869,870,5,78,0,0,870,871,3,152,76,0,871,872, + 5,131,0,0,872,873,3,98,49,0,873,874,3,98,49,0,874,875,5,132,0,0, + 875,97,1,0,0,0,876,877,3,48,24,0,877,878,5,58,0,0,878,879,3,150, + 75,0,879,880,5,78,0,0,880,881,3,152,76,0,881,883,3,140,70,0,882, + 884,5,106,0,0,883,882,1,0,0,0,883,884,1,0,0,0,884,887,1,0,0,0,885, + 886,5,74,0,0,886,888,3,152,76,0,887,885,1,0,0,0,887,888,1,0,0,0, + 888,890,1,0,0,0,889,891,5,75,0,0,890,889,1,0,0,0,890,891,1,0,0,0, + 891,894,1,0,0,0,892,893,5,76,0,0,893,895,3,152,76,0,894,892,1,0, + 0,0,894,895,1,0,0,0,895,897,1,0,0,0,896,898,5,77,0,0,897,896,1,0, + 0,0,897,898,1,0,0,0,898,899,1,0,0,0,899,900,5,128,0,0,900,99,1,0, + 0,0,901,902,5,49,0,0,902,903,3,150,75,0,903,904,5,50,0,0,904,906, + 3,150,75,0,905,907,3,28,14,0,906,905,1,0,0,0,906,907,1,0,0,0,907, + 910,1,0,0,0,908,909,5,78,0,0,909,911,3,152,76,0,910,908,1,0,0,0, + 910,911,1,0,0,0,911,914,1,0,0,0,912,913,5,73,0,0,913,915,5,141,0, + 0,914,912,1,0,0,0,914,915,1,0,0,0,915,916,1,0,0,0,916,920,5,131, + 0,0,917,919,3,102,51,0,918,917,1,0,0,0,919,922,1,0,0,0,920,918,1, + 0,0,0,920,921,1,0,0,0,921,923,1,0,0,0,922,920,1,0,0,0,923,924,5, + 132,0,0,924,101,1,0,0,0,925,926,5,54,0,0,926,932,3,90,45,0,927,932, + 3,114,57,0,928,932,3,110,55,0,929,932,3,104,52,0,930,932,3,112,56, + 0,931,925,1,0,0,0,931,927,1,0,0,0,931,928,1,0,0,0,931,929,1,0,0, + 0,931,930,1,0,0,0,932,103,1,0,0,0,933,934,5,3,0,0,934,938,5,131, + 0,0,935,937,3,106,53,0,936,935,1,0,0,0,937,940,1,0,0,0,938,936,1, + 0,0,0,938,939,1,0,0,0,939,941,1,0,0,0,940,938,1,0,0,0,941,942,5, + 132,0,0,942,943,5,128,0,0,943,105,1,0,0,0,944,945,3,150,75,0,945, + 946,5,53,0,0,946,947,5,56,0,0,947,948,3,150,75,0,948,949,5,128,0, + 0,949,959,1,0,0,0,950,951,3,150,75,0,951,952,5,53,0,0,952,953,5, + 57,0,0,953,954,3,150,75,0,954,955,5,130,0,0,955,956,3,150,75,0,956, + 957,5,128,0,0,957,959,1,0,0,0,958,944,1,0,0,0,958,950,1,0,0,0,959, + 107,1,0,0,0,960,961,3,26,13,0,961,962,5,13,0,0,962,967,5,48,0,0, + 963,964,5,130,0,0,964,966,3,150,75,0,965,963,1,0,0,0,966,969,1,0, + 0,0,967,965,1,0,0,0,967,968,1,0,0,0,968,970,1,0,0,0,969,967,1,0, + 0,0,970,971,5,128,0,0,971,109,1,0,0,0,972,973,5,51,0,0,973,974,3, + 150,75,0,974,975,5,53,0,0,975,976,5,56,0,0,976,977,3,150,75,0,977, + 978,5,128,0,0,978,111,1,0,0,0,979,980,5,63,0,0,980,981,3,150,75, + 0,981,982,5,64,0,0,982,983,5,65,0,0,983,984,5,60,0,0,984,985,5,46, + 0,0,985,986,3,150,75,0,986,987,5,62,0,0,987,988,5,57,0,0,988,989, + 3,150,75,0,989,990,5,130,0,0,990,991,3,150,75,0,991,992,5,128,0, + 0,992,113,1,0,0,0,993,994,5,51,0,0,994,995,3,116,58,0,995,996,5, + 53,0,0,996,999,3,120,60,0,997,998,5,29,0,0,998,1000,3,152,76,0,999, + 997,1,0,0,0,999,1000,1,0,0,0,1000,1001,1,0,0,0,1001,1002,5,128,0, + 0,1002,115,1,0,0,0,1003,1004,3,150,75,0,1004,1005,5,130,0,0,1005, + 1006,3,118,59,0,1006,117,1,0,0,0,1007,1020,3,150,75,0,1008,1020, + 5,95,0,0,1009,1020,5,85,0,0,1010,1020,5,86,0,0,1011,1020,5,1,0,0, + 1012,1020,5,92,0,0,1013,1020,5,93,0,0,1014,1020,5,94,0,0,1015,1020, + 5,96,0,0,1016,1020,5,97,0,0,1017,1020,5,98,0,0,1018,1020,5,99,0, + 0,1019,1007,1,0,0,0,1019,1008,1,0,0,0,1019,1009,1,0,0,0,1019,1010, + 1,0,0,0,1019,1011,1,0,0,0,1019,1012,1,0,0,0,1019,1013,1,0,0,0,1019, + 1014,1,0,0,0,1019,1015,1,0,0,0,1019,1016,1,0,0,0,1019,1017,1,0,0, + 0,1019,1018,1,0,0,0,1020,119,1,0,0,0,1021,1022,5,56,0,0,1022,1023, + 3,150,75,0,1023,1024,5,130,0,0,1024,1025,3,124,62,0,1025,1055,1, + 0,0,0,1026,1027,5,57,0,0,1027,1028,3,150,75,0,1028,1029,5,130,0, + 0,1029,1030,3,150,75,0,1030,1031,5,130,0,0,1031,1032,3,126,63,0, + 1032,1055,1,0,0,0,1033,1034,5,39,0,0,1034,1036,3,150,75,0,1035,1037, + 3,28,14,0,1036,1035,1,0,0,0,1036,1037,1,0,0,0,1037,1038,1,0,0,0, + 1038,1039,5,130,0,0,1039,1040,3,116,58,0,1040,1055,1,0,0,0,1041, + 1042,5,41,0,0,1042,1043,3,150,75,0,1043,1044,5,130,0,0,1044,1046, + 3,150,75,0,1045,1047,3,28,14,0,1046,1045,1,0,0,0,1046,1047,1,0,0, + 0,1047,1049,1,0,0,0,1048,1050,3,128,64,0,1049,1048,1,0,0,0,1049, + 1050,1,0,0,0,1050,1052,1,0,0,0,1051,1053,3,122,61,0,1052,1051,1, + 0,0,0,1052,1053,1,0,0,0,1053,1055,1,0,0,0,1054,1021,1,0,0,0,1054, + 1026,1,0,0,0,1054,1033,1,0,0,0,1054,1041,1,0,0,0,1055,121,1,0,0, + 0,1056,1057,5,61,0,0,1057,1058,3,128,64,0,1058,123,1,0,0,0,1059, + 1060,7,4,0,0,1060,125,1,0,0,0,1061,1062,7,5,0,0,1062,127,1,0,0,0, + 1063,1064,5,59,0,0,1064,1068,5,131,0,0,1065,1067,3,130,65,0,1066, + 1065,1,0,0,0,1067,1070,1,0,0,0,1068,1066,1,0,0,0,1068,1069,1,0,0, + 0,1069,1071,1,0,0,0,1070,1068,1,0,0,0,1071,1072,5,132,0,0,1072,129, + 1,0,0,0,1073,1074,3,150,75,0,1074,1075,5,53,0,0,1075,1076,5,4,0, + 0,1076,1077,5,18,0,0,1077,1078,5,133,0,0,1078,1079,3,78,39,0,1079, + 1080,5,134,0,0,1080,1081,5,128,0,0,1081,1170,1,0,0,0,1082,1083,3, + 150,75,0,1083,1084,5,53,0,0,1084,1085,5,56,0,0,1085,1092,3,150,75, + 0,1086,1087,5,62,0,0,1087,1088,5,57,0,0,1088,1089,3,150,75,0,1089, + 1090,5,130,0,0,1090,1091,3,150,75,0,1091,1093,1,0,0,0,1092,1086, + 1,0,0,0,1092,1093,1,0,0,0,1093,1094,1,0,0,0,1094,1095,5,128,0,0, + 1095,1170,1,0,0,0,1096,1097,3,150,75,0,1097,1098,5,53,0,0,1098,1099, + 5,57,0,0,1099,1100,3,150,75,0,1100,1101,5,130,0,0,1101,1108,3,150, + 75,0,1102,1103,5,62,0,0,1103,1104,5,57,0,0,1104,1105,3,150,75,0, + 1105,1106,5,130,0,0,1106,1107,3,150,75,0,1107,1109,1,0,0,0,1108, + 1102,1,0,0,0,1108,1109,1,0,0,0,1109,1110,1,0,0,0,1110,1111,5,128, + 0,0,1111,1170,1,0,0,0,1112,1113,3,150,75,0,1113,1114,5,53,0,0,1114, + 1115,5,39,0,0,1115,1117,3,150,75,0,1116,1118,3,28,14,0,1117,1116, + 1,0,0,0,1117,1118,1,0,0,0,1118,1125,1,0,0,0,1119,1120,5,62,0,0,1120, + 1121,5,57,0,0,1121,1122,3,150,75,0,1122,1123,5,130,0,0,1123,1124, + 3,150,75,0,1124,1126,1,0,0,0,1125,1119,1,0,0,0,1125,1126,1,0,0,0, + 1126,1127,1,0,0,0,1127,1128,5,128,0,0,1128,1170,1,0,0,0,1129,1130, + 3,150,75,0,1130,1131,5,53,0,0,1131,1132,5,2,0,0,1132,1133,3,150, + 75,0,1133,1134,5,59,0,0,1134,1138,5,131,0,0,1135,1137,3,108,54,0, + 1136,1135,1,0,0,0,1137,1140,1,0,0,0,1138,1136,1,0,0,0,1138,1139, + 1,0,0,0,1139,1141,1,0,0,0,1140,1138,1,0,0,0,1141,1142,5,132,0,0, + 1142,1143,5,128,0,0,1143,1170,1,0,0,0,1144,1145,3,150,75,0,1145, + 1146,5,53,0,0,1146,1147,5,46,0,0,1147,1148,3,150,75,0,1148,1149, + 5,128,0,0,1149,1170,1,0,0,0,1150,1151,3,150,75,0,1151,1153,5,53, + 0,0,1152,1154,5,4,0,0,1153,1152,1,0,0,0,1153,1154,1,0,0,0,1154,1155, + 1,0,0,0,1155,1156,5,17,0,0,1156,1157,3,150,75,0,1157,1158,5,130, + 0,0,1158,1165,3,150,75,0,1159,1160,5,62,0,0,1160,1161,5,57,0,0,1161, + 1162,3,150,75,0,1162,1163,5,130,0,0,1163,1164,3,150,75,0,1164,1166, + 1,0,0,0,1165,1159,1,0,0,0,1165,1166,1,0,0,0,1166,1167,1,0,0,0,1167, + 1168,5,128,0,0,1168,1170,1,0,0,0,1169,1073,1,0,0,0,1169,1082,1,0, + 0,0,1169,1096,1,0,0,0,1169,1112,1,0,0,0,1169,1129,1,0,0,0,1169,1144, + 1,0,0,0,1169,1150,1,0,0,0,1170,131,1,0,0,0,1171,1172,5,46,0,0,1172, + 1173,3,150,75,0,1173,1174,5,53,0,0,1174,1175,3,150,75,0,1175,1176, + 5,130,0,0,1176,1178,3,150,75,0,1177,1179,3,128,64,0,1178,1177,1, + 0,0,0,1178,1179,1,0,0,0,1179,1180,1,0,0,0,1180,1181,5,128,0,0,1181, + 133,1,0,0,0,1182,1229,3,138,69,0,1183,1229,5,107,0,0,1184,1229,5, + 108,0,0,1185,1186,5,109,0,0,1186,1229,3,152,76,0,1187,1188,5,110, + 0,0,1188,1189,5,137,0,0,1189,1190,3,150,75,0,1190,1191,5,138,0,0, + 1191,1229,1,0,0,0,1192,1193,5,111,0,0,1193,1194,5,137,0,0,1194,1196, + 3,150,75,0,1195,1197,3,28,14,0,1196,1195,1,0,0,0,1196,1197,1,0,0, + 0,1197,1198,1,0,0,0,1198,1199,5,138,0,0,1199,1229,1,0,0,0,1200,1201, + 5,34,0,0,1201,1202,5,137,0,0,1202,1203,3,150,75,0,1203,1204,5,138, + 0,0,1204,1229,1,0,0,0,1205,1206,5,112,0,0,1206,1207,5,137,0,0,1207, + 1208,3,134,67,0,1208,1209,5,138,0,0,1209,1229,1,0,0,0,1210,1211, + 5,113,0,0,1211,1212,5,137,0,0,1212,1213,3,134,67,0,1213,1214,5,138, + 0,0,1214,1229,1,0,0,0,1215,1216,5,114,0,0,1216,1220,5,131,0,0,1217, + 1219,3,136,68,0,1218,1217,1,0,0,0,1219,1222,1,0,0,0,1220,1218,1, + 0,0,0,1220,1221,1,0,0,0,1221,1223,1,0,0,0,1222,1220,1,0,0,0,1223, + 1229,5,132,0,0,1224,1226,3,150,75,0,1225,1227,3,28,14,0,1226,1225, + 1,0,0,0,1226,1227,1,0,0,0,1227,1229,1,0,0,0,1228,1182,1,0,0,0,1228, + 1183,1,0,0,0,1228,1184,1,0,0,0,1228,1185,1,0,0,0,1228,1187,1,0,0, + 0,1228,1192,1,0,0,0,1228,1200,1,0,0,0,1228,1205,1,0,0,0,1228,1210, + 1,0,0,0,1228,1215,1,0,0,0,1228,1224,1,0,0,0,1229,135,1,0,0,0,1230, + 1231,3,150,75,0,1231,1232,5,127,0,0,1232,1233,3,134,67,0,1233,1234, + 5,128,0,0,1234,137,1,0,0,0,1235,1236,7,6,0,0,1236,139,1,0,0,0,1237, + 1238,7,7,0,0,1238,141,1,0,0,0,1239,1248,3,152,76,0,1240,1248,5,141, + 0,0,1241,1248,5,142,0,0,1242,1248,5,123,0,0,1243,1248,5,124,0,0, + 1244,1248,5,125,0,0,1245,1248,3,144,72,0,1246,1248,3,148,74,0,1247, + 1239,1,0,0,0,1247,1240,1,0,0,0,1247,1241,1,0,0,0,1247,1242,1,0,0, + 0,1247,1243,1,0,0,0,1247,1244,1,0,0,0,1247,1245,1,0,0,0,1247,1246, + 1,0,0,0,1248,143,1,0,0,0,1249,1258,5,131,0,0,1250,1255,3,146,73, + 0,1251,1252,5,129,0,0,1252,1254,3,146,73,0,1253,1251,1,0,0,0,1254, + 1257,1,0,0,0,1255,1253,1,0,0,0,1255,1256,1,0,0,0,1256,1259,1,0,0, + 0,1257,1255,1,0,0,0,1258,1250,1,0,0,0,1258,1259,1,0,0,0,1259,1260, + 1,0,0,0,1260,1261,5,132,0,0,1261,145,1,0,0,0,1262,1263,3,152,76, + 0,1263,1264,5,127,0,0,1264,1265,3,142,71,0,1265,147,1,0,0,0,1266, + 1275,5,133,0,0,1267,1272,3,142,71,0,1268,1269,5,129,0,0,1269,1271, + 3,142,71,0,1270,1268,1,0,0,0,1271,1274,1,0,0,0,1272,1270,1,0,0,0, + 1272,1273,1,0,0,0,1273,1276,1,0,0,0,1274,1272,1,0,0,0,1275,1267, + 1,0,0,0,1275,1276,1,0,0,0,1276,1277,1,0,0,0,1277,1278,5,134,0,0, + 1278,149,1,0,0,0,1279,1280,7,8,0,0,1280,151,1,0,0,0,1281,1282,5, + 144,0,0,1282,153,1,0,0,0,114,166,173,194,206,218,238,246,253,259, + 271,274,280,291,300,310,313,315,319,327,339,344,353,356,371,377, + 389,398,406,414,427,430,440,444,450,457,463,471,479,492,499,503, + 508,519,525,535,540,546,557,584,611,616,627,630,635,638,645,654, + 657,660,677,686,700,721,724,727,734,742,782,785,807,821,829,841, + 855,865,883,887,890,894,897,906,910,914,920,931,938,958,967,999, + 1019,1036,1046,1049,1052,1054,1068,1092,1108,1117,1125,1138,1153, + 1165,1169,1178,1196,1220,1226,1228,1247,1255,1258,1272,1275 ]; private static __ATN: antlr.ATN; @@ -6879,6 +6974,9 @@ export class PackageOperationExportContext extends antlr.ParserRuleContext { public dependencyBlock(): DependencyBlockContext | null { return this.getRuleContext(0, DependencyBlockContext); } + public acceptanceClause(): AcceptanceClauseContext | null { + return this.getRuleContext(0, AcceptanceClauseContext); + } public override get ruleIndex(): number { return QuixosCapabilityParser.RULE_packageOperationExport; } @@ -6935,6 +7033,9 @@ export class PackageFunctionExportContext extends antlr.ParserRuleContext { public dependencyBlock(): DependencyBlockContext | null { return this.getRuleContext(0, DependencyBlockContext); } + public acceptanceClause(): AcceptanceClauseContext | null { + return this.getRuleContext(0, AcceptanceClauseContext); + } public override get ruleIndex(): number { return QuixosCapabilityParser.RULE_packageFunctionExport; } @@ -6948,6 +7049,32 @@ export class PackageFunctionExportContext extends antlr.ParserRuleContext { } +export class AcceptanceClauseContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public ACCEPT(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.ACCEPT, 0)!; + } + public USING(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.USING, 0)!; + } + public identifier(): IdentifierContext { + return this.getRuleContext(0, IdentifierContext)!; + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_acceptanceClause; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitAcceptanceClause) { + return visitor.visitAcceptanceClause(this); + } else { + return visitor.visitChildren(this); + } + } +} + + export class ExecutionClauseContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); @@ -8158,6 +8285,9 @@ export class OperationProviderContext extends antlr.ParserRuleContext { public dependencyBindingBlock(): DependencyBindingBlockContext | null { return this.getRuleContext(0, DependencyBindingBlockContext); } + public acceptanceBinding(): AcceptanceBindingContext | null { + return this.getRuleContext(0, AcceptanceBindingContext); + } public override get ruleIndex(): number { return QuixosCapabilityParser.RULE_operationProvider; } @@ -8171,6 +8301,29 @@ export class OperationProviderContext extends antlr.ParserRuleContext { } +export class AcceptanceBindingContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public ACCEPT(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.ACCEPT, 0)!; + } + public dependencyBindingBlock(): DependencyBindingBlockContext { + return this.getRuleContext(0, DependencyBindingBlockContext)!; + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_acceptanceBinding; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitAcceptanceBinding) { + return visitor.visitAcceptanceBinding(this); + } else { + return visitor.visitChildren(this); + } + } +} + + export class StatePrimitiveContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); diff --git a/src/capability-language/generated/QuixosCapabilityVisitor.ts b/src/capability-language/generated/QuixosCapabilityVisitor.ts index 2167dc5..1861546 100644 --- a/src/capability-language/generated/QuixosCapabilityVisitor.ts +++ b/src/capability-language/generated/QuixosCapabilityVisitor.ts @@ -34,6 +34,7 @@ import { PackageQuerySpecializationContext } from "./QuixosCapabilityParser.js"; import { QueryClauseContext } from "./QuixosCapabilityParser.js"; import { PackageOperationExportContext } from "./QuixosCapabilityParser.js"; import { PackageFunctionExportContext } from "./QuixosCapabilityParser.js"; +import { AcceptanceClauseContext } from "./QuixosCapabilityParser.js"; import { ExecutionClauseContext } from "./QuixosCapabilityParser.js"; import { SelectedOperationsContext } from "./QuixosCapabilityParser.js"; import { PackageConstructorExportContext } from "./QuixosCapabilityParser.js"; @@ -62,6 +63,7 @@ import { OperationBindingDeclContext } from "./QuixosCapabilityParser.js"; import { MemberOperationRefContext } from "./QuixosCapabilityParser.js"; import { OperationNameContext } from "./QuixosCapabilityParser.js"; import { OperationProviderContext } from "./QuixosCapabilityParser.js"; +import { AcceptanceBindingContext } from "./QuixosCapabilityParser.js"; import { StatePrimitiveContext } from "./QuixosCapabilityParser.js"; import { EdgePrimitiveContext } from "./QuixosCapabilityParser.js"; import { DependencyBindingBlockContext } from "./QuixosCapabilityParser.js"; @@ -279,6 +281,12 @@ export class QuixosCapabilityVisitor extends AbstractParseTreeVisitor Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.acceptanceClause`. + * @param ctx the parse tree + * @return the visitor result + */ + visitAcceptanceClause?: (ctx: AcceptanceClauseContext) => Result; /** * Visit a parse tree produced by `QuixosCapabilityParser.executionClause`. * @param ctx the parse tree @@ -447,6 +455,12 @@ export class QuixosCapabilityVisitor extends AbstractParseTreeVisitor Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.acceptanceBinding`. + * @param ctx the parse tree + * @return the visitor result + */ + visitAcceptanceBinding?: (ctx: AcceptanceBindingContext) => Result; /** * Visit a parse tree produced by `QuixosCapabilityParser.statePrimitive`. * @param ctx the parse tree diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index d1e11ae..559e679 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -1514,6 +1514,13 @@ const lowerPackage = ( const operation = exportContext.packageOperationExport(); const generic = operation ?? exportContext.packageFunctionExport(); if (generic?.typeParameters()) { + if (generic.acceptanceClause()) + loweringIssue( + state, + generic, + "unsupported-generic-acceptance", + "Acceptance hooks currently require a closed export", + ); genericExports.push(atGenericSource(generic, () => lowerGenericPackageExport(state, generic))); return []; } @@ -1535,6 +1542,22 @@ const lowerPackage = ( state.types.self = previousSelf; } }); + // Resolve after all exports have been declared, so checks can follow bodies. + for (const source of context.packageExport()) { + const declaration = source.packageOperationExport() ?? source.packageFunctionExport(); + const clause = declaration?.acceptanceClause(); + if (!declaration || !clause || declaration.typeParameters()) continue; + const entry = exports.find((entry) => entry.displayName === identifier(declaration.identifier())); + const check = exports.find((entry) => entry.displayName === identifier(clause.identifier())); + if (!check) + loweringIssue( + state, + clause, + "unknown-acceptance-export", + "Acceptance hook must name a closed export in this package", + ); + else if (entry) entry.acceptanceExportId = check.id; + } for (const entry of context.packageExport()) { const specialized = entry.packageQuerySpecialization(); if (!specialized) continue; @@ -2047,6 +2070,22 @@ const lowerConformance = ( } else if (provider.typeArguments()) { throw new GenericTypeError("type-arity", exportName, "Non-generic export takes no type arguments"); } + const packageExport = packageSymbol?.definition?.exports.find((entry) => entry.id === exportSymbol?.exportId); + const check = packageSymbol?.definition?.exports.find((entry) => entry.id === packageExport?.acceptanceExportId); + const acceptanceBlock = provider.acceptanceBinding()?.dependencyBindingBlock(); + if (acceptanceBlock && !check) + loweringIssue( + state, + acceptanceBlock, + "unexpected-acceptance-binding", + "Export does not declare an acceptance hook", + ); + const acceptanceDependencies = check + ? lowerBoundDependencies(state, acceptanceBlock ?? undefined, { + exportId: check.id, + ports: new Map(check.dependencyPorts.map((port) => [port.displayName, port.id])), + }) + : undefined; return packageSymbol && exportSymbol ? [ { @@ -2056,6 +2095,7 @@ const lowerConformance = ( kind: "package" as const, packageRevisionId: packageSymbol.revisionId, exportId: exportSymbol.exportId, + ...(acceptanceDependencies ? { acceptanceDependencies } : {}), dependencies: lowerBoundDependencies( state, provider.dependencyBindingBlock() ?? undefined, diff --git a/src/capability-model/types.ts b/src/capability-model/types.ts index fcec7a1..6bd7a0e 100644 --- a/src/capability-model/types.ts +++ b/src/capability-model/types.ts @@ -257,6 +257,8 @@ export interface DependencyPort { } interface PackageExportBase { + /** Required authoritative snapshot export in this package. */ + acceptanceExportId?: PackageExportId; execution?: ExecutionContract; id: PackageExportId; displayName: string; @@ -375,6 +377,7 @@ export type Binding = packageRevisionId: PackageRevisionId; exportId: PackageExportId; dependencies: BoundDependency[]; + acceptanceDependencies?: BoundDependency[]; }; export interface OperationBinding { diff --git a/src/capability-model/validation.ts b/src/capability-model/validation.ts index 0dfa5a1..4adbb85 100644 --- a/src/capability-model/validation.ts +++ b/src/capability-model/validation.ts @@ -961,6 +961,32 @@ const validatePackages = ( const exportPath = `${path}.exports[${exportIndex}]`; validateValueType(issues, entry.inputType, `${exportPath}.inputType`, indexes); validateValueType(issues, entry.outputType, `${exportPath}.outputType`, indexes); + if (entry.acceptanceExportId !== undefined) { + const check = revision.exports.find((candidate) => candidate.id === entry.acceptanceExportId); + if ( + entry.execution?.kind !== "transaction" || + !entry.execution.targets.includes("server") || + !check || + check.execution?.kind !== "snapshot" || + check.execution.targets.length !== 1 || + check.execution.targets[0] !== "server" || + check.acceptanceExportId !== undefined || + entry.kind !== check.kind || + entry.kind === "constructor" || + !valueTypesEqual(entry.inputType, check.inputType) || + !valueTypesEqual(check.outputType, valueType.unit) || + (entry.kind === "operation" && + (check.kind !== "operation" || + check.mode !== "call" || + !isDeepStrictEqual(entry.receiverRequirement, check.receiverRequirement))) + ) + issue( + issues, + "invalid-operation", + `${exportPath}.acceptanceExportId`, + "Acceptance requires a server snapshot export with matching kind, receiver and input, unit output, and no further acceptance hook", + ); + } if (entry.kind === "operation") { validateOperationEventShape(issues, entry, exportPath); if (entry.eventType) { @@ -1862,6 +1888,20 @@ const validateConformances = ( requirementGraph, graphSourceKey: key, }); + const check = packageEntry.exports.get(packageExport.acceptanceExportId!); + if (check) { + validateBoundDependencies(issues, { + dependencies: binding.acceptanceDependencies ?? [], + dependencyPorts: check.dependencyPorts, + atomId: conformance.atomId, + conformance, + path: `${bindingPath}.binding.acceptance`, + indexes, + requirementGraph, + graphSourceKey: key, + }); + } else if (binding.acceptanceDependencies !== undefined) + issue(issues, "invalid-package-binding", bindingPath, "Acceptance ports require a declared acceptance export"); } for (const member of interfaceEntry.revision.members) { diff --git a/src/execution-world/kernel.ts b/src/execution-world/kernel.ts index 00dcdd0..1f6bc70 100644 --- a/src/execution-world/kernel.ts +++ b/src/execution-world/kernel.ts @@ -3,6 +3,8 @@ import type { InitializationField, PersistentAttachment, DependencyBinding, + BoundDependency, + PackageExport, } from "../capability-model/types.js"; import { type ExecutionPlan, ExecutionPlanError, hexDigest } from "./plan.js"; import { portableValueSchema } from "../bindings/portable.js"; @@ -107,57 +109,70 @@ export function compileKernelProgram(plan: ExecutionPlan): unknown { else { const pkg = workspace.packageImports.find((p) => p.revisionId === binding.packageRevisionId)!; const entry = pkg.exports.find((e) => e.id === binding.exportId)!; - const ports = binding.dependencies.map((dependency) => { - const requirement = entry.dependencyPorts.find((p) => p.id === dependency.portId)!.requirement; - const bound = dependency.binding; - const common = { id: dependency.portId, ...via(bound) }; - if (bound.kind === "state" && requirement.kind === "state") - return { - ...common, - kind: "state", - owner: slotOwner(bound.slotId), - slot: bound.slotId, - primitives: requirement.primitives, - }; - if (bound.kind === "edge" && requirement.kind === "edge") - return { - ...common, - kind: "edge", - edge: bound.edgeTypeId, - projection: bound.projectionId, - primitives: requirement.primitives, - }; - if (bound.kind === "interface" && requirement.kind === "interface") { - const iface = workspace.interfaceImports.find((i) => i.revisionId === bound.interfaceRevisionId)!; - return { - ...common, - kind: "interface", - interface: bound.interfaceRevisionId, - operations: requirement.operations ?? iface.members.flatMap((m) => m.operations.map((o) => o.id)), - }; - } - if (bound.kind === "creation" && requirement.kind === "creation") - return { - ...common, - kind: "creation", - atom: bound.atomId, - schema: portableValueSchema(requirement.inputType), - recipe: hexDigest({ plan: plan.digest, operation: operation.key, port: dependency.portId }), - owners: bound.owners.map((seed) => { - const owner = owners.find((o) => o.atom === bound.atomId && o.interface === seed.interfaceRevisionId); - if (!owner) - throw new ExecutionPlanError( - "MISSING_STORAGE_OWNER", - dependency.portId, - "Creation has no initialization owner", - ); - return { owner: owner.id, inputPath: seed.inputPath }; - }), - }; - unsupported = `UNSUPPORTED_EXECUTION_PORT:${bound.kind}`; - return { ...common, kind: "unavailable" }; - }); - target = { kind: "package", package: binding.packageRevisionId, export: binding.exportId, ports }; + const compilePorts = (entry: PackageExport, dependencies: BoundDependency[]) => + dependencies.map((dependency) => { + const requirement = entry.dependencyPorts.find((p) => p.id === dependency.portId)!.requirement; + const bound = dependency.binding; + const common = { id: dependency.portId, ...via(bound) }; + if (bound.kind === "state" && requirement.kind === "state") + return { + ...common, + kind: "state", + owner: slotOwner(bound.slotId), + slot: bound.slotId, + primitives: requirement.primitives, + }; + if (bound.kind === "edge" && requirement.kind === "edge") + return { + ...common, + kind: "edge", + edge: bound.edgeTypeId, + projection: bound.projectionId, + primitives: requirement.primitives, + }; + if (bound.kind === "interface" && requirement.kind === "interface") { + const iface = workspace.interfaceImports.find((i) => i.revisionId === bound.interfaceRevisionId)!; + return { + ...common, + kind: "interface", + interface: bound.interfaceRevisionId, + operations: requirement.operations ?? iface.members.flatMap((m) => m.operations.map((o) => o.id)), + }; + } + if (bound.kind === "creation" && requirement.kind === "creation") + return { + ...common, + kind: "creation", + atom: bound.atomId, + schema: portableValueSchema(requirement.inputType), + recipe: hexDigest({ plan: plan.digest, operation: operation.key, port: dependency.portId }), + owners: bound.owners.map((seed) => { + const owner = owners.find((o) => o.atom === bound.atomId && o.interface === seed.interfaceRevisionId); + if (!owner) + throw new ExecutionPlanError( + "MISSING_STORAGE_OWNER", + dependency.portId, + "Creation has no initialization owner", + ); + return { owner: owner.id, inputPath: seed.inputPath }; + }), + }; + unsupported = `UNSUPPORTED_EXECUTION_PORT:${bound.kind}`; + return { ...common, kind: "unavailable" }; + }); + const ports = compilePorts(entry, binding.dependencies); + const check = entry.acceptanceExportId + ? pkg.exports.find((candidate) => candidate.id === entry.acceptanceExportId)! + : undefined; + target = { + kind: "package", + package: binding.packageRevisionId, + export: binding.exportId, + ports, + ...(check + ? { acceptance: { export: check.id, ports: compilePorts(check, binding.acceptanceDependencies ?? []) } } + : {}), + }; } const input = schema(operation.input), output = schema(operation.output); @@ -179,6 +194,7 @@ export function compileKernelProgram(plan: ExecutionPlan): unknown { revision: pkg.revisionId, exports: pkg.exports.map((entry) => ({ id: entry.id, + ...(entry.acceptanceExportId ? { acceptance: entry.acceptanceExportId } : {}), effect: entry.execution?.kind ?? "remote", targets: entry.execution && entry.execution.kind !== "remote" ? entry.execution.targets : [], receiver: diff --git a/test/acceptance-fixture.ts b/test/acceptance-fixture.ts new file mode 100644 index 0000000..8d904fb --- /dev/null +++ b/test/acceptance-fixture.ts @@ -0,0 +1,41 @@ +import assert from "node:assert/strict"; +import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/parser.js"; +const contract = `interface Limit id "limit" revision "limit@1" { + operation change id "change" : int32 -> unit { + call id "change:call" execution transaction targets [browser, server]; + } +}`; +export const runtime = `external atom Item id "item"; +package Runtime id "runtime" revision "runtime@1" { + operation change id "runtime:change" : int32 -> unit mode call execution transaction targets [browser, server] + receiver atom Item requires { state level id "write:value" : int32 [write]; } accept using check; + operation check id "runtime:check" : int32 -> unit mode call execution snapshot targets [server] + receiver atom Item requires { + state level id "read:value" : int32 [read]; + state ceiling id "read:ceiling" : int32 [read]; + }; +}`; +export const workspace = `workspace LimitTest id "workspace:limit" revision "workspace:limit@1" commit "${"a".repeat(40)}" { + import interface Limit; + import package Runtime; + atom Item id "item"; + conform Item as Limit id "item:limit" { + private state Value id "value" on Item : int32 policy register default 0; + private state Ceiling id "ceiling" on Item : int32 policy register default 100; + bind change.call to package Runtime.change with { level to state Value; } + accept with { level to state Value; ceiling to state Ceiling; }; + } +}`; +export function compile(packageSource = runtime, workspaceSource = workspace) { + const source = { repository: "https://example.test/limit.git", commit: "a".repeat(40) }; + const iface = compileCapabilityResourceSource(contract, { source }); + assert.ok(iface.ok && iface.resource.kind === "interface", JSON.stringify(iface.diagnostics)); + const pkg = compileCapabilityResourceSource(packageSource, { source }); + if (!pkg.ok) return pkg; + assert.equal(pkg.resource.kind, "package"); + if (pkg.resource.kind !== "package") throw Error("Expected package"); + return compileCapabilitySource(workspaceSource, "workspace.qx", { + interfaces: new Map([["Limit", iface.resource.revision]]), + packages: new Map([["Runtime", pkg.resource.revision]]), + }); +} diff --git a/test/acceptance-hooks.test.ts b/test/acceptance-hooks.test.ts new file mode 100644 index 0000000..9ceac90 --- /dev/null +++ b/test/acceptance-hooks.test.ts @@ -0,0 +1,70 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { compileCapabilityResourceSource } from "../src/capability-language/parser.js"; +import { formatQx } from "../src/capability-language/source.js"; +import { compileExecutionPlan, compileKernelProgram, checkExecutionWorld } from "../src/execution-world/index.js"; +import { generatePortableTypeScriptBindings } from "../src/bindings/portable.js"; +import { buildArtifactFixture } from "./artifact-fixture.js"; +import { compile, runtime, workspace } from "./acceptance-fixture.js"; +test("acceptance syntax retains separate final-state ports through formatting, planning, adapters and artifacts", async () => { + const result = compile(); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const formatted = compile(formatQx(runtime), formatQx(workspace)); + assert.ok(formatted.ok, JSON.stringify(formatted.diagnostics)); + const plan = compileExecutionPlan(result.workspace); + assert.equal(compileExecutionPlan(formatted.workspace).digest, plan.digest); + const kernel = compileKernelProgram(plan) as { + operations: { binding: { ports: { id: string }[]; acceptance: { export: string; ports: { id: string }[] } } }[]; + packages: { exports: { id: string; acceptance?: string }[] }[]; + }; + assert.deepEqual( + kernel.operations[0]!.binding.ports.map((p) => p.id), + ["write:value"], + ); + assert.equal(kernel.operations[0]!.binding.acceptance.export, "runtime:check"); + assert.deepEqual(kernel.operations[0]!.binding.acceptance.ports.map((p) => p.id).sort(), [ + "read:ceiling", + "read:value", + ]); + assert.equal(kernel.packages[0]!.exports.find((e) => e.id === "runtime:change")!.acceptance, "runtime:check"); + assert.ok( + !generatePortableTypeScriptBindings(plan.definition.bindingSchema, "runtime@1", { target: "browser" }).includes( + '"runtime:check"', + ), + ); + assert.ok( + generatePortableTypeScriptBindings(plan.definition.bindingSchema, "runtime@1", { target: "server" }).includes( + '"runtime:check"', + ), + ); + const artifacts = buildArtifactFixture(plan, "runtime@1"); + await checkExecutionWorld(plan, [artifacts.manifest], artifacts.read); +}); +test("acceptance declarations reject wrong effects/signatures and missing or mutable ports", () => { + for (const [pkg, ws] of [ + [runtime.replace("snapshot targets [server]", "transaction targets [server]"), workspace], + [runtime.replace("snapshot targets [server]", "snapshot targets [browser, server]"), workspace], + [ + runtime.replace('check id "runtime:check" : int32 -> unit', 'check id "runtime:check" : string -> unit'), + workspace, + ], + [ + runtime.replace('check id "runtime:check" : int32 -> unit', 'check id "runtime:check" : int32 -> int32'), + workspace, + ], + [runtime.replace('id "read:ceiling" : int32 [read]', 'id "read:ceiling" : int32 [write]'), workspace], + [runtime, workspace.replace("ceiling to state Ceiling;", "")], + [runtime.replace(" accept using check", ""), workspace], + ]) + assert.equal(compile(pkg, ws).ok, false, `${pkg}\n${ws}`); +}); +test("generic acceptance syntax rejects explicitly until specialization is supported", () => { + const result = compileCapabilityResourceSource( + runtime.replace("operation change id", "operation change id"), + { + source: { repository: "https://example.test/limit.git", commit: "a".repeat(40) }, + }, + ); + assert.equal(result.ok, false); + assert.ok(result.diagnostics.some((d) => d.code === "unsupported-generic-acceptance")); +}); diff --git a/test/artifact-fixture.ts b/test/artifact-fixture.ts index 4b8de4c..7e7b6e5 100644 --- a/test/artifact-fixture.ts +++ b/test/artifact-fixture.ts @@ -21,7 +21,9 @@ export const buildArtifactFixture = (plan: ExecutionPlan, revision = plan.defini path, ports: "quixos-transaction-ports-v1" as const, ...(compatibility === "quixos-js-module-v1" ? { registryExport: "handlers" } : {}), - exports: expected.exports.map((e) => e.id), + exports: expected.exports + .filter((e) => target === "server" || (e.execution.kind !== "remote" && e.execution.targets.includes(target))) + .map((e) => e.id), files: [ { path, diff --git a/test/emit-portable-reader.ts b/test/emit-portable-reader.ts index 25db047..c3dff3b 100644 --- a/test/emit-portable-reader.ts +++ b/test/emit-portable-reader.ts @@ -89,6 +89,13 @@ void negative; ); const { asyncObjectPlan } = await import("./async-fixture.js"); +const { compile: compileAcceptance } = await import("./acceptance-fixture.js"); +const acceptance = compileAcceptance(); +if (!acceptance.ok) throw Error(JSON.stringify(acceptance.diagnostics)); +const acceptancePlan = compileExecutionPlan(acceptance.workspace); +await mkdir("dist/portable-reader/acceptance", { recursive: true }); +await writeFile("dist/portable-reader/acceptance/plan.json", JSON.stringify(acceptancePlan)); +await writeFile("dist/portable-reader/acceptance/kernel.json", JSON.stringify(compileKernelProgram(acceptancePlan))); const { recurringTaskPlan } = await import("./recurring-fixture.js"); const recurringPlan = await recurringTaskPlan(); await mkdir("dist/portable-reader/recurring", { recursive: true }); From c0669d2ed8c38f99ffa20cb58a7f0b6e0d3621a4 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 20 Sep 2026 22:05:59 -0700 Subject: [PATCH 28/91] Support explicitly reference-selected read-only interface dependencies --- grammar/QuixosCapability.g4 | 4 +- src/bindings/portable.ts | 15 +- .../generated/QuixosCapability.interp | 2 +- .../generated/QuixosCapabilityParser.ts | 1818 +++++++++-------- src/capability-language/parser.ts | 3 + src/capability-model/execution.ts | 17 + src/capability-model/generic-packages.ts | 2 + src/capability-model/types.ts | 2 + src/capability-model/validation.ts | 12 + src/execution-world/kernel.ts | 1 + src/execution-world/plan.ts | 9 + test/reference-dependencies.test.ts | 89 + 12 files changed, 1081 insertions(+), 893 deletions(-) create mode 100644 test/reference-dependencies.test.ts diff --git a/grammar/QuixosCapability.g4 b/grammar/QuixosCapability.g4 index bc5f4aa..e3eaee2 100644 --- a/grammar/QuixosCapability.g4 +++ b/grammar/QuixosCapability.g4 @@ -226,7 +226,7 @@ dependencyPort : REFLECTION identifier ID stringLiteral LBRACK identifierList RBRACK SEMI | STATE identifier ID stringLiteral COLON valueType primitiveList SEMI | EDGE identifier ID stringLiteral COLON cardinality targetConstraint primitiveList SEMI - | INTERFACE identifier ID stringLiteral COLON identifier typeArguments? selectedOperations? SEMI + | INTERFACE identifier ID stringLiteral COLON identifier typeArguments? selectedOperations? (FROM INPUT)? SEMI | CREATION identifier ID stringLiteral COLON identifier INPUT valueType SEMI | CONSTRUCTOR identifier ID stringLiteral COLON identifier (INPUT valueType)? SEMI | QUERY identifier ID stringLiteral COLON identifier DOT identifier SEMI @@ -367,7 +367,7 @@ dependencyBinding : identifier TO WORKSPACE REFLECTION LBRACK identifierList RBRACK SEMI | identifier TO STATE identifier (VIA EDGE identifier DOT identifier)? SEMI | identifier TO EDGE identifier DOT identifier (VIA EDGE identifier DOT identifier)? SEMI - | identifier TO INTERFACE identifier typeArguments? (VIA EDGE identifier DOT identifier)? SEMI + | identifier TO INTERFACE identifier typeArguments? ((VIA EDGE identifier DOT identifier) | (FROM INPUT))? SEMI | identifier TO CREATION identifier WITH LBRACE creationOwnerMapping* RBRACE SEMI | identifier TO CONSTRUCTOR identifier SEMI | identifier TO WORKSPACE? QUERY identifier DOT identifier (VIA EDGE identifier DOT identifier)? SEMI diff --git a/src/bindings/portable.ts b/src/bindings/portable.ts index f6ea42d..5e5e7b3 100644 --- a/src/bindings/portable.ts +++ b/src/bindings/portable.ts @@ -183,10 +183,23 @@ function methods( `Selected operation is not an object call available in portable target ${target}; select a portable subset or move this handler to remote execution`, ); if (execution.kind === "transaction" && !remote) writable(); + if (req.receiver === "input" && (remote || execution.kind !== "snapshot")) + throw new PortableBindingError(path, "Reference-selected dependencies require portable snapshot calls"); return method( `${member.displayName}.${op.displayName}`, { kind: "interface", operationId: op.id }, - op.inputType, + req.receiver === "input" + ? { + kind: "record", + fields: { + receiver: { + kind: "object-ref", + expectation: { kind: "interface", interfaceRevisionId: req.interfaceRevisionId }, + }, + input: op.inputType, + }, + } + : op.inputType, op.outputType, execution.kind === "transaction", ); diff --git a/src/capability-language/generated/QuixosCapability.interp b/src/capability-language/generated/QuixosCapability.interp index 2f8aa0c..7349e95 100644 --- a/src/capability-language/generated/QuixosCapability.interp +++ b/src/capability-language/generated/QuixosCapability.interp @@ -379,4 +379,4 @@ stringLiteral atn: -[4, 1, 147, 1284, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 167, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 172, 8, 1, 10, 1, 12, 1, 175, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 193, 8, 3, 10, 3, 12, 3, 196, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 207, 8, 4, 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, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 239, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 247, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 252, 8, 10, 10, 10, 12, 10, 255, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 260, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 270, 8, 10, 10, 10, 12, 10, 273, 9, 10, 3, 10, 275, 8, 10, 1, 10, 1, 10, 5, 10, 279, 8, 10, 10, 10, 12, 10, 282, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 290, 8, 11, 10, 11, 12, 11, 293, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 301, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 309, 8, 12, 10, 12, 12, 12, 312, 9, 12, 3, 12, 314, 8, 12, 3, 12, 316, 8, 12, 1, 13, 1, 13, 3, 13, 320, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 326, 8, 14, 10, 14, 12, 14, 329, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 340, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 345, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 354, 8, 17, 1, 18, 3, 18, 357, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 372, 8, 18, 1, 18, 1, 18, 1, 18, 1, 19, 3, 19, 378, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 388, 8, 19, 10, 19, 12, 19, 391, 9, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 399, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 407, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 415, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 428, 8, 20, 1, 21, 3, 21, 431, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 441, 8, 21, 1, 21, 1, 21, 3, 21, 445, 8, 21, 1, 21, 1, 21, 5, 21, 449, 8, 21, 10, 21, 12, 21, 452, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 458, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 464, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 472, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 480, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 493, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 500, 8, 24, 1, 24, 1, 24, 3, 24, 504, 8, 24, 1, 25, 5, 25, 507, 8, 25, 10, 25, 12, 25, 510, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 520, 8, 25, 1, 25, 1, 25, 5, 25, 524, 8, 25, 10, 25, 12, 25, 527, 9, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 536, 8, 26, 1, 27, 1, 27, 1, 27, 3, 27, 541, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 547, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 556, 8, 27, 10, 27, 12, 27, 559, 9, 27, 1, 27, 1, 27, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 585, 8, 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, 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, 3, 29, 612, 8, 29, 1, 30, 1, 30, 1, 30, 3, 30, 617, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 628, 8, 30, 1, 30, 3, 30, 631, 8, 30, 1, 30, 1, 30, 1, 30, 3, 30, 636, 8, 30, 1, 30, 3, 30, 639, 8, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 3, 31, 646, 8, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 655, 8, 31, 1, 31, 3, 31, 658, 8, 31, 1, 31, 3, 31, 661, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 678, 8, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 685, 8, 34, 10, 34, 12, 34, 688, 9, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 701, 8, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 720, 8, 38, 10, 38, 12, 38, 723, 9, 38, 3, 38, 725, 8, 38, 1, 38, 3, 38, 728, 8, 38, 1, 39, 1, 39, 1, 39, 5, 39, 733, 8, 39, 10, 39, 12, 39, 736, 9, 39, 1, 40, 1, 40, 1, 40, 5, 40, 741, 8, 40, 10, 40, 12, 40, 744, 9, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 783, 8, 41, 1, 41, 3, 41, 786, 8, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 808, 8, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 822, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 828, 8, 42, 10, 42, 12, 42, 831, 9, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 3, 45, 842, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 856, 8, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 866, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 884, 8, 49, 1, 49, 1, 49, 3, 49, 888, 8, 49, 1, 49, 3, 49, 891, 8, 49, 1, 49, 1, 49, 3, 49, 895, 8, 49, 1, 49, 3, 49, 898, 8, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 907, 8, 50, 1, 50, 1, 50, 3, 50, 911, 8, 50, 1, 50, 1, 50, 3, 50, 915, 8, 50, 1, 50, 1, 50, 5, 50, 919, 8, 50, 10, 50, 12, 50, 922, 9, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 932, 8, 51, 1, 52, 1, 52, 1, 52, 5, 52, 937, 8, 52, 10, 52, 12, 52, 940, 9, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 959, 8, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 5, 54, 966, 8, 54, 10, 54, 12, 54, 969, 9, 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, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 1000, 8, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 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, 1020, 8, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1037, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1047, 8, 60, 1, 60, 3, 60, 1050, 8, 60, 1, 60, 3, 60, 1053, 8, 60, 3, 60, 1055, 8, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 5, 64, 1067, 8, 64, 10, 64, 12, 64, 1070, 9, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1093, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1109, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1118, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1126, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 5, 65, 1137, 8, 65, 10, 65, 12, 65, 1140, 9, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1154, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1166, 8, 65, 1, 65, 1, 65, 3, 65, 1170, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1179, 8, 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, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1197, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 5, 67, 1219, 8, 67, 10, 67, 12, 67, 1222, 9, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1227, 8, 67, 3, 67, 1229, 8, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1248, 8, 71, 1, 72, 1, 72, 1, 72, 1, 72, 5, 72, 1254, 8, 72, 10, 72, 12, 72, 1257, 9, 72, 3, 72, 1259, 8, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 5, 74, 1271, 8, 74, 10, 74, 12, 74, 1274, 9, 74, 3, 74, 1276, 8, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 0, 0, 77, 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, 0, 9, 2, 0, 10, 10, 28, 28, 1, 0, 6, 7, 1, 0, 95, 99, 3, 0, 1, 1, 90, 94, 96, 97, 3, 0, 1, 1, 90, 91, 96, 97, 2, 0, 92, 94, 96, 97, 1, 0, 115, 122, 1, 0, 102, 105, 7, 0, 1, 3, 5, 28, 40, 40, 69, 69, 88, 89, 100, 100, 143, 143, 1388, 0, 166, 1, 0, 0, 0, 2, 168, 1, 0, 0, 0, 4, 178, 1, 0, 0, 0, 6, 182, 1, 0, 0, 0, 8, 206, 1, 0, 0, 0, 10, 218, 1, 0, 0, 0, 12, 220, 1, 0, 0, 0, 14, 227, 1, 0, 0, 0, 16, 238, 1, 0, 0, 0, 18, 240, 1, 0, 0, 0, 20, 253, 1, 0, 0, 0, 22, 285, 1, 0, 0, 0, 24, 315, 1, 0, 0, 0, 26, 317, 1, 0, 0, 0, 28, 321, 1, 0, 0, 0, 30, 339, 1, 0, 0, 0, 32, 341, 1, 0, 0, 0, 34, 353, 1, 0, 0, 0, 36, 356, 1, 0, 0, 0, 38, 377, 1, 0, 0, 0, 40, 427, 1, 0, 0, 0, 42, 430, 1, 0, 0, 0, 44, 455, 1, 0, 0, 0, 46, 492, 1, 0, 0, 0, 48, 503, 1, 0, 0, 0, 50, 508, 1, 0, 0, 0, 52, 535, 1, 0, 0, 0, 54, 537, 1, 0, 0, 0, 56, 562, 1, 0, 0, 0, 58, 611, 1, 0, 0, 0, 60, 613, 1, 0, 0, 0, 62, 642, 1, 0, 0, 0, 64, 664, 1, 0, 0, 0, 66, 677, 1, 0, 0, 0, 68, 679, 1, 0, 0, 0, 70, 691, 1, 0, 0, 0, 72, 704, 1, 0, 0, 0, 74, 707, 1, 0, 0, 0, 76, 727, 1, 0, 0, 0, 78, 729, 1, 0, 0, 0, 80, 737, 1, 0, 0, 0, 82, 821, 1, 0, 0, 0, 84, 823, 1, 0, 0, 0, 86, 834, 1, 0, 0, 0, 88, 836, 1, 0, 0, 0, 90, 841, 1, 0, 0, 0, 92, 843, 1, 0, 0, 0, 94, 865, 1, 0, 0, 0, 96, 867, 1, 0, 0, 0, 98, 876, 1, 0, 0, 0, 100, 901, 1, 0, 0, 0, 102, 931, 1, 0, 0, 0, 104, 933, 1, 0, 0, 0, 106, 958, 1, 0, 0, 0, 108, 960, 1, 0, 0, 0, 110, 972, 1, 0, 0, 0, 112, 979, 1, 0, 0, 0, 114, 993, 1, 0, 0, 0, 116, 1003, 1, 0, 0, 0, 118, 1019, 1, 0, 0, 0, 120, 1054, 1, 0, 0, 0, 122, 1056, 1, 0, 0, 0, 124, 1059, 1, 0, 0, 0, 126, 1061, 1, 0, 0, 0, 128, 1063, 1, 0, 0, 0, 130, 1169, 1, 0, 0, 0, 132, 1171, 1, 0, 0, 0, 134, 1228, 1, 0, 0, 0, 136, 1230, 1, 0, 0, 0, 138, 1235, 1, 0, 0, 0, 140, 1237, 1, 0, 0, 0, 142, 1247, 1, 0, 0, 0, 144, 1249, 1, 0, 0, 0, 146, 1262, 1, 0, 0, 0, 148, 1266, 1, 0, 0, 0, 150, 1279, 1, 0, 0, 0, 152, 1281, 1, 0, 0, 0, 154, 155, 3, 6, 3, 0, 155, 156, 5, 0, 0, 1, 156, 167, 1, 0, 0, 0, 157, 158, 3, 20, 10, 0, 158, 159, 5, 0, 0, 1, 159, 167, 1, 0, 0, 0, 160, 161, 3, 50, 25, 0, 161, 162, 5, 0, 0, 1, 162, 167, 1, 0, 0, 0, 163, 164, 3, 2, 1, 0, 164, 165, 5, 0, 0, 1, 165, 167, 1, 0, 0, 0, 166, 154, 1, 0, 0, 0, 166, 157, 1, 0, 0, 0, 166, 160, 1, 0, 0, 0, 166, 163, 1, 0, 0, 0, 167, 1, 1, 0, 0, 0, 168, 169, 5, 35, 0, 0, 169, 173, 5, 131, 0, 0, 170, 172, 3, 8, 4, 0, 171, 170, 1, 0, 0, 0, 172, 175, 1, 0, 0, 0, 173, 171, 1, 0, 0, 0, 173, 174, 1, 0, 0, 0, 174, 176, 1, 0, 0, 0, 175, 173, 1, 0, 0, 0, 176, 177, 5, 132, 0, 0, 177, 3, 1, 0, 0, 0, 178, 179, 5, 36, 0, 0, 179, 180, 3, 152, 76, 0, 180, 181, 5, 128, 0, 0, 181, 5, 1, 0, 0, 0, 182, 183, 5, 4, 0, 0, 183, 184, 3, 150, 75, 0, 184, 185, 5, 78, 0, 0, 185, 186, 3, 152, 76, 0, 186, 187, 5, 72, 0, 0, 187, 188, 3, 152, 76, 0, 188, 189, 5, 71, 0, 0, 189, 190, 3, 152, 76, 0, 190, 194, 5, 131, 0, 0, 191, 193, 3, 8, 4, 0, 192, 191, 1, 0, 0, 0, 193, 196, 1, 0, 0, 0, 194, 192, 1, 0, 0, 0, 194, 195, 1, 0, 0, 0, 195, 197, 1, 0, 0, 0, 196, 194, 1, 0, 0, 0, 197, 198, 5, 132, 0, 0, 198, 7, 1, 0, 0, 0, 199, 207, 3, 4, 2, 0, 200, 207, 3, 18, 9, 0, 201, 207, 3, 10, 5, 0, 202, 207, 3, 88, 44, 0, 203, 207, 3, 100, 50, 0, 204, 207, 3, 132, 66, 0, 205, 207, 3, 32, 16, 0, 206, 199, 1, 0, 0, 0, 206, 200, 1, 0, 0, 0, 206, 201, 1, 0, 0, 0, 206, 202, 1, 0, 0, 0, 206, 203, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 206, 205, 1, 0, 0, 0, 207, 9, 1, 0, 0, 0, 208, 209, 5, 36, 0, 0, 209, 210, 5, 39, 0, 0, 210, 211, 3, 150, 75, 0, 211, 212, 5, 128, 0, 0, 212, 219, 1, 0, 0, 0, 213, 214, 5, 36, 0, 0, 214, 215, 5, 41, 0, 0, 215, 216, 3, 150, 75, 0, 216, 217, 5, 128, 0, 0, 217, 219, 1, 0, 0, 0, 218, 208, 1, 0, 0, 0, 218, 213, 1, 0, 0, 0, 219, 11, 1, 0, 0, 0, 220, 221, 5, 37, 0, 0, 221, 222, 5, 38, 0, 0, 222, 223, 3, 150, 75, 0, 223, 224, 5, 78, 0, 0, 224, 225, 3, 152, 76, 0, 225, 226, 5, 128, 0, 0, 226, 13, 1, 0, 0, 0, 227, 228, 5, 37, 0, 0, 228, 229, 5, 39, 0, 0, 229, 230, 3, 150, 75, 0, 230, 231, 5, 72, 0, 0, 231, 232, 3, 152, 76, 0, 232, 233, 5, 128, 0, 0, 233, 15, 1, 0, 0, 0, 234, 239, 3, 10, 5, 0, 235, 239, 3, 12, 6, 0, 236, 239, 3, 14, 7, 0, 237, 239, 3, 32, 16, 0, 238, 234, 1, 0, 0, 0, 238, 235, 1, 0, 0, 0, 238, 236, 1, 0, 0, 0, 238, 237, 1, 0, 0, 0, 239, 17, 1, 0, 0, 0, 240, 241, 5, 38, 0, 0, 241, 242, 3, 150, 75, 0, 242, 243, 5, 78, 0, 0, 243, 246, 3, 152, 76, 0, 244, 245, 5, 79, 0, 0, 245, 247, 3, 152, 76, 0, 246, 244, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 249, 5, 128, 0, 0, 249, 19, 1, 0, 0, 0, 250, 252, 3, 16, 8, 0, 251, 250, 1, 0, 0, 0, 252, 255, 1, 0, 0, 0, 253, 251, 1, 0, 0, 0, 253, 254, 1, 0, 0, 0, 254, 256, 1, 0, 0, 0, 255, 253, 1, 0, 0, 0, 256, 257, 5, 39, 0, 0, 257, 259, 3, 150, 75, 0, 258, 260, 3, 22, 11, 0, 259, 258, 1, 0, 0, 0, 259, 260, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 262, 5, 78, 0, 0, 262, 263, 3, 152, 76, 0, 263, 264, 5, 72, 0, 0, 264, 274, 3, 152, 76, 0, 265, 266, 5, 83, 0, 0, 266, 271, 3, 26, 13, 0, 267, 268, 5, 129, 0, 0, 268, 270, 3, 26, 13, 0, 269, 267, 1, 0, 0, 0, 270, 273, 1, 0, 0, 0, 271, 269, 1, 0, 0, 0, 271, 272, 1, 0, 0, 0, 272, 275, 1, 0, 0, 0, 273, 271, 1, 0, 0, 0, 274, 265, 1, 0, 0, 0, 274, 275, 1, 0, 0, 0, 275, 276, 1, 0, 0, 0, 276, 280, 5, 131, 0, 0, 277, 279, 3, 34, 17, 0, 278, 277, 1, 0, 0, 0, 279, 282, 1, 0, 0, 0, 280, 278, 1, 0, 0, 0, 280, 281, 1, 0, 0, 0, 281, 283, 1, 0, 0, 0, 282, 280, 1, 0, 0, 0, 283, 284, 5, 132, 0, 0, 284, 21, 1, 0, 0, 0, 285, 286, 5, 137, 0, 0, 286, 291, 3, 24, 12, 0, 287, 288, 5, 129, 0, 0, 288, 290, 3, 24, 12, 0, 289, 287, 1, 0, 0, 0, 290, 293, 1, 0, 0, 0, 291, 289, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 294, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 294, 295, 5, 138, 0, 0, 295, 23, 1, 0, 0, 0, 296, 297, 5, 42, 0, 0, 297, 300, 3, 150, 75, 0, 298, 299, 5, 127, 0, 0, 299, 301, 5, 32, 0, 0, 300, 298, 1, 0, 0, 0, 300, 301, 1, 0, 0, 0, 301, 316, 1, 0, 0, 0, 302, 303, 5, 31, 0, 0, 303, 313, 3, 150, 75, 0, 304, 305, 5, 33, 0, 0, 305, 310, 3, 26, 13, 0, 306, 307, 5, 139, 0, 0, 307, 309, 3, 26, 13, 0, 308, 306, 1, 0, 0, 0, 309, 312, 1, 0, 0, 0, 310, 308, 1, 0, 0, 0, 310, 311, 1, 0, 0, 0, 311, 314, 1, 0, 0, 0, 312, 310, 1, 0, 0, 0, 313, 304, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 316, 1, 0, 0, 0, 315, 296, 1, 0, 0, 0, 315, 302, 1, 0, 0, 0, 316, 25, 1, 0, 0, 0, 317, 319, 3, 150, 75, 0, 318, 320, 3, 28, 14, 0, 319, 318, 1, 0, 0, 0, 319, 320, 1, 0, 0, 0, 320, 27, 1, 0, 0, 0, 321, 322, 5, 137, 0, 0, 322, 327, 3, 30, 15, 0, 323, 324, 5, 129, 0, 0, 324, 326, 3, 30, 15, 0, 325, 323, 1, 0, 0, 0, 326, 329, 1, 0, 0, 0, 327, 325, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 330, 1, 0, 0, 0, 329, 327, 1, 0, 0, 0, 330, 331, 5, 138, 0, 0, 331, 29, 1, 0, 0, 0, 332, 333, 5, 38, 0, 0, 333, 340, 3, 150, 75, 0, 334, 335, 5, 39, 0, 0, 335, 340, 3, 26, 13, 0, 336, 337, 5, 31, 0, 0, 337, 340, 3, 150, 75, 0, 338, 340, 3, 134, 67, 0, 339, 332, 1, 0, 0, 0, 339, 334, 1, 0, 0, 0, 339, 336, 1, 0, 0, 0, 339, 338, 1, 0, 0, 0, 340, 31, 1, 0, 0, 0, 341, 342, 5, 30, 0, 0, 342, 344, 3, 150, 75, 0, 343, 345, 3, 22, 11, 0, 344, 343, 1, 0, 0, 0, 344, 345, 1, 0, 0, 0, 345, 346, 1, 0, 0, 0, 346, 347, 5, 140, 0, 0, 347, 348, 3, 134, 67, 0, 348, 349, 5, 128, 0, 0, 349, 33, 1, 0, 0, 0, 350, 354, 3, 38, 19, 0, 351, 354, 3, 42, 21, 0, 352, 354, 3, 36, 18, 0, 353, 350, 1, 0, 0, 0, 353, 351, 1, 0, 0, 0, 353, 352, 1, 0, 0, 0, 354, 35, 1, 0, 0, 0, 355, 357, 5, 52, 0, 0, 356, 355, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 358, 1, 0, 0, 0, 358, 359, 5, 44, 0, 0, 359, 360, 3, 150, 75, 0, 360, 361, 5, 78, 0, 0, 361, 362, 3, 152, 76, 0, 362, 363, 5, 127, 0, 0, 363, 364, 3, 134, 67, 0, 364, 365, 5, 126, 0, 0, 365, 366, 3, 134, 67, 0, 366, 367, 5, 131, 0, 0, 367, 368, 5, 95, 0, 0, 368, 369, 5, 78, 0, 0, 369, 371, 3, 152, 76, 0, 370, 372, 3, 66, 33, 0, 371, 370, 1, 0, 0, 0, 371, 372, 1, 0, 0, 0, 372, 373, 1, 0, 0, 0, 373, 374, 5, 128, 0, 0, 374, 375, 5, 132, 0, 0, 375, 37, 1, 0, 0, 0, 376, 378, 3, 44, 22, 0, 377, 376, 1, 0, 0, 0, 377, 378, 1, 0, 0, 0, 378, 379, 1, 0, 0, 0, 379, 380, 5, 42, 0, 0, 380, 381, 3, 150, 75, 0, 381, 382, 5, 78, 0, 0, 382, 383, 3, 152, 76, 0, 383, 384, 5, 127, 0, 0, 384, 385, 3, 134, 67, 0, 385, 389, 5, 131, 0, 0, 386, 388, 3, 40, 20, 0, 387, 386, 1, 0, 0, 0, 388, 391, 1, 0, 0, 0, 389, 387, 1, 0, 0, 0, 389, 390, 1, 0, 0, 0, 390, 392, 1, 0, 0, 0, 391, 389, 1, 0, 0, 0, 392, 393, 5, 132, 0, 0, 393, 39, 1, 0, 0, 0, 394, 395, 5, 85, 0, 0, 395, 396, 5, 78, 0, 0, 396, 398, 3, 152, 76, 0, 397, 399, 3, 66, 33, 0, 398, 397, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 401, 5, 128, 0, 0, 401, 428, 1, 0, 0, 0, 402, 403, 5, 86, 0, 0, 403, 404, 5, 78, 0, 0, 404, 406, 3, 152, 76, 0, 405, 407, 3, 66, 33, 0, 406, 405, 1, 0, 0, 0, 406, 407, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 409, 5, 128, 0, 0, 409, 428, 1, 0, 0, 0, 410, 411, 5, 1, 0, 0, 411, 412, 5, 78, 0, 0, 412, 414, 3, 152, 76, 0, 413, 415, 3, 66, 33, 0, 414, 413, 1, 0, 0, 0, 414, 415, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 417, 5, 128, 0, 0, 417, 428, 1, 0, 0, 0, 418, 419, 5, 87, 0, 0, 419, 420, 5, 88, 0, 0, 420, 421, 5, 78, 0, 0, 421, 422, 3, 152, 76, 0, 422, 423, 5, 89, 0, 0, 423, 424, 5, 78, 0, 0, 424, 425, 3, 152, 76, 0, 425, 426, 5, 128, 0, 0, 426, 428, 1, 0, 0, 0, 427, 394, 1, 0, 0, 0, 427, 402, 1, 0, 0, 0, 427, 410, 1, 0, 0, 0, 427, 418, 1, 0, 0, 0, 428, 41, 1, 0, 0, 0, 429, 431, 3, 44, 22, 0, 430, 429, 1, 0, 0, 0, 430, 431, 1, 0, 0, 0, 431, 432, 1, 0, 0, 0, 432, 433, 5, 43, 0, 0, 433, 434, 3, 150, 75, 0, 434, 435, 5, 78, 0, 0, 435, 436, 3, 152, 76, 0, 436, 437, 5, 127, 0, 0, 437, 438, 3, 140, 70, 0, 438, 440, 3, 48, 24, 0, 439, 441, 5, 106, 0, 0, 440, 439, 1, 0, 0, 0, 440, 441, 1, 0, 0, 0, 441, 444, 1, 0, 0, 0, 442, 443, 5, 76, 0, 0, 443, 445, 3, 152, 76, 0, 444, 442, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 450, 5, 131, 0, 0, 447, 449, 3, 46, 23, 0, 448, 447, 1, 0, 0, 0, 449, 452, 1, 0, 0, 0, 450, 448, 1, 0, 0, 0, 450, 451, 1, 0, 0, 0, 451, 453, 1, 0, 0, 0, 452, 450, 1, 0, 0, 0, 453, 454, 5, 132, 0, 0, 454, 43, 1, 0, 0, 0, 455, 457, 5, 27, 0, 0, 456, 458, 7, 0, 0, 0, 457, 456, 1, 0, 0, 0, 457, 458, 1, 0, 0, 0, 458, 45, 1, 0, 0, 0, 459, 460, 5, 92, 0, 0, 460, 461, 5, 78, 0, 0, 461, 463, 3, 152, 76, 0, 462, 464, 3, 66, 33, 0, 463, 462, 1, 0, 0, 0, 463, 464, 1, 0, 0, 0, 464, 465, 1, 0, 0, 0, 465, 466, 5, 128, 0, 0, 466, 493, 1, 0, 0, 0, 467, 468, 5, 93, 0, 0, 468, 469, 5, 78, 0, 0, 469, 471, 3, 152, 76, 0, 470, 472, 3, 66, 33, 0, 471, 470, 1, 0, 0, 0, 471, 472, 1, 0, 0, 0, 472, 473, 1, 0, 0, 0, 473, 474, 5, 128, 0, 0, 474, 493, 1, 0, 0, 0, 475, 476, 5, 94, 0, 0, 476, 477, 5, 78, 0, 0, 477, 479, 3, 152, 76, 0, 478, 480, 3, 66, 33, 0, 479, 478, 1, 0, 0, 0, 479, 480, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 482, 5, 128, 0, 0, 482, 493, 1, 0, 0, 0, 483, 484, 5, 87, 0, 0, 484, 485, 5, 88, 0, 0, 485, 486, 5, 78, 0, 0, 486, 487, 3, 152, 76, 0, 487, 488, 5, 89, 0, 0, 488, 489, 5, 78, 0, 0, 489, 490, 3, 152, 76, 0, 490, 491, 5, 128, 0, 0, 491, 493, 1, 0, 0, 0, 492, 459, 1, 0, 0, 0, 492, 467, 1, 0, 0, 0, 492, 475, 1, 0, 0, 0, 492, 483, 1, 0, 0, 0, 493, 47, 1, 0, 0, 0, 494, 495, 5, 38, 0, 0, 495, 504, 3, 150, 75, 0, 496, 497, 5, 39, 0, 0, 497, 499, 3, 150, 75, 0, 498, 500, 3, 28, 14, 0, 499, 498, 1, 0, 0, 0, 499, 500, 1, 0, 0, 0, 500, 504, 1, 0, 0, 0, 501, 502, 5, 31, 0, 0, 502, 504, 3, 150, 75, 0, 503, 494, 1, 0, 0, 0, 503, 496, 1, 0, 0, 0, 503, 501, 1, 0, 0, 0, 504, 49, 1, 0, 0, 0, 505, 507, 3, 16, 8, 0, 506, 505, 1, 0, 0, 0, 507, 510, 1, 0, 0, 0, 508, 506, 1, 0, 0, 0, 508, 509, 1, 0, 0, 0, 509, 511, 1, 0, 0, 0, 510, 508, 1, 0, 0, 0, 511, 512, 5, 41, 0, 0, 512, 513, 3, 150, 75, 0, 513, 514, 5, 78, 0, 0, 514, 515, 3, 152, 76, 0, 515, 516, 5, 72, 0, 0, 516, 519, 3, 152, 76, 0, 517, 518, 5, 73, 0, 0, 518, 520, 5, 141, 0, 0, 519, 517, 1, 0, 0, 0, 519, 520, 1, 0, 0, 0, 520, 521, 1, 0, 0, 0, 521, 525, 5, 131, 0, 0, 522, 524, 3, 52, 26, 0, 523, 522, 1, 0, 0, 0, 524, 527, 1, 0, 0, 0, 525, 523, 1, 0, 0, 0, 525, 526, 1, 0, 0, 0, 526, 528, 1, 0, 0, 0, 527, 525, 1, 0, 0, 0, 528, 529, 5, 132, 0, 0, 529, 51, 1, 0, 0, 0, 530, 536, 3, 60, 30, 0, 531, 536, 3, 62, 31, 0, 532, 536, 3, 70, 35, 0, 533, 536, 3, 54, 27, 0, 534, 536, 3, 56, 28, 0, 535, 530, 1, 0, 0, 0, 535, 531, 1, 0, 0, 0, 535, 532, 1, 0, 0, 0, 535, 533, 1, 0, 0, 0, 535, 534, 1, 0, 0, 0, 536, 53, 1, 0, 0, 0, 537, 538, 5, 17, 0, 0, 538, 540, 3, 150, 75, 0, 539, 541, 3, 22, 11, 0, 540, 539, 1, 0, 0, 0, 540, 541, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 543, 5, 78, 0, 0, 543, 544, 3, 152, 76, 0, 544, 546, 5, 20, 0, 0, 545, 547, 5, 4, 0, 0, 546, 545, 1, 0, 0, 0, 546, 547, 1, 0, 0, 0, 547, 548, 1, 0, 0, 0, 548, 549, 3, 26, 13, 0, 549, 550, 5, 21, 0, 0, 550, 551, 3, 152, 76, 0, 551, 552, 5, 44, 0, 0, 552, 553, 3, 152, 76, 0, 553, 557, 5, 131, 0, 0, 554, 556, 3, 58, 29, 0, 555, 554, 1, 0, 0, 0, 556, 559, 1, 0, 0, 0, 557, 555, 1, 0, 0, 0, 557, 558, 1, 0, 0, 0, 558, 560, 1, 0, 0, 0, 559, 557, 1, 0, 0, 0, 560, 561, 5, 132, 0, 0, 561, 55, 1, 0, 0, 0, 562, 563, 5, 17, 0, 0, 563, 564, 3, 150, 75, 0, 564, 565, 5, 78, 0, 0, 565, 566, 3, 152, 76, 0, 566, 567, 5, 19, 0, 0, 567, 568, 3, 150, 75, 0, 568, 569, 3, 28, 14, 0, 569, 570, 5, 128, 0, 0, 570, 57, 1, 0, 0, 0, 571, 572, 5, 11, 0, 0, 572, 612, 5, 128, 0, 0, 573, 574, 5, 12, 0, 0, 574, 575, 5, 13, 0, 0, 575, 576, 3, 150, 75, 0, 576, 577, 5, 128, 0, 0, 577, 612, 1, 0, 0, 0, 578, 579, 5, 22, 0, 0, 579, 580, 3, 152, 76, 0, 580, 581, 5, 128, 0, 0, 581, 612, 1, 0, 0, 0, 582, 584, 5, 23, 0, 0, 583, 585, 5, 31, 0, 0, 584, 583, 1, 0, 0, 0, 584, 585, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 587, 3, 150, 75, 0, 587, 588, 5, 50, 0, 0, 588, 589, 3, 26, 13, 0, 589, 590, 5, 128, 0, 0, 590, 612, 1, 0, 0, 0, 591, 592, 5, 24, 0, 0, 592, 593, 3, 150, 75, 0, 593, 594, 5, 141, 0, 0, 594, 595, 5, 128, 0, 0, 595, 612, 1, 0, 0, 0, 596, 597, 5, 25, 0, 0, 597, 598, 3, 26, 13, 0, 598, 599, 5, 130, 0, 0, 599, 600, 3, 150, 75, 0, 600, 601, 3, 150, 75, 0, 601, 602, 3, 152, 76, 0, 602, 603, 5, 128, 0, 0, 603, 612, 1, 0, 0, 0, 604, 605, 5, 87, 0, 0, 605, 612, 5, 128, 0, 0, 606, 607, 5, 26, 0, 0, 607, 608, 5, 141, 0, 0, 608, 609, 3, 152, 76, 0, 609, 610, 5, 128, 0, 0, 610, 612, 1, 0, 0, 0, 611, 571, 1, 0, 0, 0, 611, 573, 1, 0, 0, 0, 611, 578, 1, 0, 0, 0, 611, 582, 1, 0, 0, 0, 611, 591, 1, 0, 0, 0, 611, 596, 1, 0, 0, 0, 611, 604, 1, 0, 0, 0, 611, 606, 1, 0, 0, 0, 612, 59, 1, 0, 0, 0, 613, 614, 5, 44, 0, 0, 614, 616, 3, 150, 75, 0, 615, 617, 3, 22, 11, 0, 616, 615, 1, 0, 0, 0, 616, 617, 1, 0, 0, 0, 617, 618, 1, 0, 0, 0, 618, 619, 5, 78, 0, 0, 619, 620, 3, 152, 76, 0, 620, 621, 5, 127, 0, 0, 621, 622, 3, 134, 67, 0, 622, 623, 5, 126, 0, 0, 623, 624, 3, 134, 67, 0, 624, 625, 5, 80, 0, 0, 625, 627, 3, 74, 37, 0, 626, 628, 3, 66, 33, 0, 627, 626, 1, 0, 0, 0, 627, 628, 1, 0, 0, 0, 628, 630, 1, 0, 0, 0, 629, 631, 3, 72, 36, 0, 630, 629, 1, 0, 0, 0, 630, 631, 1, 0, 0, 0, 631, 632, 1, 0, 0, 0, 632, 633, 5, 82, 0, 0, 633, 635, 3, 76, 38, 0, 634, 636, 3, 80, 40, 0, 635, 634, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 638, 1, 0, 0, 0, 637, 639, 3, 64, 32, 0, 638, 637, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 641, 5, 128, 0, 0, 641, 61, 1, 0, 0, 0, 642, 643, 5, 45, 0, 0, 643, 645, 3, 150, 75, 0, 644, 646, 3, 22, 11, 0, 645, 644, 1, 0, 0, 0, 645, 646, 1, 0, 0, 0, 646, 647, 1, 0, 0, 0, 647, 648, 5, 78, 0, 0, 648, 649, 3, 152, 76, 0, 649, 650, 5, 127, 0, 0, 650, 651, 3, 134, 67, 0, 651, 652, 5, 126, 0, 0, 652, 654, 3, 134, 67, 0, 653, 655, 3, 66, 33, 0, 654, 653, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 657, 1, 0, 0, 0, 656, 658, 3, 80, 40, 0, 657, 656, 1, 0, 0, 0, 657, 658, 1, 0, 0, 0, 658, 660, 1, 0, 0, 0, 659, 661, 3, 64, 32, 0, 660, 659, 1, 0, 0, 0, 660, 661, 1, 0, 0, 0, 661, 662, 1, 0, 0, 0, 662, 663, 5, 128, 0, 0, 663, 63, 1, 0, 0, 0, 664, 665, 5, 61, 0, 0, 665, 666, 5, 60, 0, 0, 666, 667, 3, 150, 75, 0, 667, 65, 1, 0, 0, 0, 668, 669, 5, 5, 0, 0, 669, 678, 5, 8, 0, 0, 670, 671, 5, 5, 0, 0, 671, 672, 7, 1, 0, 0, 672, 673, 5, 9, 0, 0, 673, 674, 5, 133, 0, 0, 674, 675, 3, 78, 39, 0, 675, 676, 5, 134, 0, 0, 676, 678, 1, 0, 0, 0, 677, 668, 1, 0, 0, 0, 677, 670, 1, 0, 0, 0, 678, 67, 1, 0, 0, 0, 679, 680, 5, 60, 0, 0, 680, 681, 5, 133, 0, 0, 681, 686, 3, 116, 58, 0, 682, 683, 5, 129, 0, 0, 683, 685, 3, 116, 58, 0, 684, 682, 1, 0, 0, 0, 685, 688, 1, 0, 0, 0, 686, 684, 1, 0, 0, 0, 686, 687, 1, 0, 0, 0, 687, 689, 1, 0, 0, 0, 688, 686, 1, 0, 0, 0, 689, 690, 5, 134, 0, 0, 690, 69, 1, 0, 0, 0, 691, 692, 5, 46, 0, 0, 692, 693, 3, 150, 75, 0, 693, 694, 5, 78, 0, 0, 694, 695, 3, 152, 76, 0, 695, 696, 5, 47, 0, 0, 696, 697, 3, 150, 75, 0, 697, 698, 5, 127, 0, 0, 698, 700, 3, 134, 67, 0, 699, 701, 3, 80, 40, 0, 700, 699, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 702, 1, 0, 0, 0, 702, 703, 5, 128, 0, 0, 703, 71, 1, 0, 0, 0, 704, 705, 5, 81, 0, 0, 705, 706, 3, 134, 67, 0, 706, 73, 1, 0, 0, 0, 707, 708, 7, 2, 0, 0, 708, 75, 1, 0, 0, 0, 709, 728, 5, 84, 0, 0, 710, 711, 5, 38, 0, 0, 711, 728, 3, 150, 75, 0, 712, 713, 5, 31, 0, 0, 713, 728, 3, 150, 75, 0, 714, 715, 5, 40, 0, 0, 715, 724, 5, 133, 0, 0, 716, 721, 3, 26, 13, 0, 717, 718, 5, 129, 0, 0, 718, 720, 3, 26, 13, 0, 719, 717, 1, 0, 0, 0, 720, 723, 1, 0, 0, 0, 721, 719, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 725, 1, 0, 0, 0, 723, 721, 1, 0, 0, 0, 724, 716, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 726, 1, 0, 0, 0, 726, 728, 5, 134, 0, 0, 727, 709, 1, 0, 0, 0, 727, 710, 1, 0, 0, 0, 727, 712, 1, 0, 0, 0, 727, 714, 1, 0, 0, 0, 728, 77, 1, 0, 0, 0, 729, 734, 3, 150, 75, 0, 730, 731, 5, 129, 0, 0, 731, 733, 3, 150, 75, 0, 732, 730, 1, 0, 0, 0, 733, 736, 1, 0, 0, 0, 734, 732, 1, 0, 0, 0, 734, 735, 1, 0, 0, 0, 735, 79, 1, 0, 0, 0, 736, 734, 1, 0, 0, 0, 737, 738, 5, 83, 0, 0, 738, 742, 5, 131, 0, 0, 739, 741, 3, 82, 41, 0, 740, 739, 1, 0, 0, 0, 741, 744, 1, 0, 0, 0, 742, 740, 1, 0, 0, 0, 742, 743, 1, 0, 0, 0, 743, 745, 1, 0, 0, 0, 744, 742, 1, 0, 0, 0, 745, 746, 5, 132, 0, 0, 746, 81, 1, 0, 0, 0, 747, 748, 5, 18, 0, 0, 748, 749, 3, 150, 75, 0, 749, 750, 5, 78, 0, 0, 750, 751, 3, 152, 76, 0, 751, 752, 5, 133, 0, 0, 752, 753, 3, 78, 39, 0, 753, 754, 5, 134, 0, 0, 754, 755, 5, 128, 0, 0, 755, 822, 1, 0, 0, 0, 756, 757, 5, 56, 0, 0, 757, 758, 3, 150, 75, 0, 758, 759, 5, 78, 0, 0, 759, 760, 3, 152, 76, 0, 760, 761, 5, 127, 0, 0, 761, 762, 3, 134, 67, 0, 762, 763, 3, 84, 42, 0, 763, 764, 5, 128, 0, 0, 764, 822, 1, 0, 0, 0, 765, 766, 5, 57, 0, 0, 766, 767, 3, 150, 75, 0, 767, 768, 5, 78, 0, 0, 768, 769, 3, 152, 76, 0, 769, 770, 5, 127, 0, 0, 770, 771, 3, 140, 70, 0, 771, 772, 3, 48, 24, 0, 772, 773, 3, 84, 42, 0, 773, 774, 5, 128, 0, 0, 774, 822, 1, 0, 0, 0, 775, 776, 5, 39, 0, 0, 776, 777, 3, 150, 75, 0, 777, 778, 5, 78, 0, 0, 778, 779, 3, 152, 76, 0, 779, 780, 5, 127, 0, 0, 780, 782, 3, 150, 75, 0, 781, 783, 3, 28, 14, 0, 782, 781, 1, 0, 0, 0, 782, 783, 1, 0, 0, 0, 783, 785, 1, 0, 0, 0, 784, 786, 3, 68, 34, 0, 785, 784, 1, 0, 0, 0, 785, 786, 1, 0, 0, 0, 786, 787, 1, 0, 0, 0, 787, 788, 5, 128, 0, 0, 788, 822, 1, 0, 0, 0, 789, 790, 5, 2, 0, 0, 790, 791, 3, 150, 75, 0, 791, 792, 5, 78, 0, 0, 792, 793, 3, 152, 76, 0, 793, 794, 5, 127, 0, 0, 794, 795, 3, 150, 75, 0, 795, 796, 5, 48, 0, 0, 796, 797, 3, 134, 67, 0, 797, 798, 5, 128, 0, 0, 798, 822, 1, 0, 0, 0, 799, 800, 5, 46, 0, 0, 800, 801, 3, 150, 75, 0, 801, 802, 5, 78, 0, 0, 802, 803, 3, 152, 76, 0, 803, 804, 5, 127, 0, 0, 804, 807, 3, 150, 75, 0, 805, 806, 5, 48, 0, 0, 806, 808, 3, 134, 67, 0, 807, 805, 1, 0, 0, 0, 807, 808, 1, 0, 0, 0, 808, 809, 1, 0, 0, 0, 809, 810, 5, 128, 0, 0, 810, 822, 1, 0, 0, 0, 811, 812, 5, 17, 0, 0, 812, 813, 3, 150, 75, 0, 813, 814, 5, 78, 0, 0, 814, 815, 3, 152, 76, 0, 815, 816, 5, 127, 0, 0, 816, 817, 3, 150, 75, 0, 817, 818, 5, 130, 0, 0, 818, 819, 3, 150, 75, 0, 819, 820, 5, 128, 0, 0, 820, 822, 1, 0, 0, 0, 821, 747, 1, 0, 0, 0, 821, 756, 1, 0, 0, 0, 821, 765, 1, 0, 0, 0, 821, 775, 1, 0, 0, 0, 821, 789, 1, 0, 0, 0, 821, 799, 1, 0, 0, 0, 821, 811, 1, 0, 0, 0, 822, 83, 1, 0, 0, 0, 823, 824, 5, 133, 0, 0, 824, 829, 3, 86, 43, 0, 825, 826, 5, 129, 0, 0, 826, 828, 3, 86, 43, 0, 827, 825, 1, 0, 0, 0, 828, 831, 1, 0, 0, 0, 829, 827, 1, 0, 0, 0, 829, 830, 1, 0, 0, 0, 830, 832, 1, 0, 0, 0, 831, 829, 1, 0, 0, 0, 832, 833, 5, 134, 0, 0, 833, 85, 1, 0, 0, 0, 834, 835, 7, 3, 0, 0, 835, 87, 1, 0, 0, 0, 836, 837, 5, 55, 0, 0, 837, 838, 3, 90, 45, 0, 838, 89, 1, 0, 0, 0, 839, 842, 3, 92, 46, 0, 840, 842, 3, 96, 48, 0, 841, 839, 1, 0, 0, 0, 841, 840, 1, 0, 0, 0, 842, 91, 1, 0, 0, 0, 843, 844, 5, 56, 0, 0, 844, 845, 3, 150, 75, 0, 845, 846, 5, 78, 0, 0, 846, 847, 3, 152, 76, 0, 847, 848, 5, 66, 0, 0, 848, 849, 3, 150, 75, 0, 849, 850, 5, 127, 0, 0, 850, 851, 3, 134, 67, 0, 851, 852, 5, 67, 0, 0, 852, 855, 3, 94, 47, 0, 853, 854, 5, 68, 0, 0, 854, 856, 3, 142, 71, 0, 855, 853, 1, 0, 0, 0, 855, 856, 1, 0, 0, 0, 856, 857, 1, 0, 0, 0, 857, 858, 5, 128, 0, 0, 858, 93, 1, 0, 0, 0, 859, 866, 5, 100, 0, 0, 860, 861, 5, 101, 0, 0, 861, 862, 5, 135, 0, 0, 862, 863, 3, 134, 67, 0, 863, 864, 5, 136, 0, 0, 864, 866, 1, 0, 0, 0, 865, 859, 1, 0, 0, 0, 865, 860, 1, 0, 0, 0, 866, 95, 1, 0, 0, 0, 867, 868, 5, 57, 0, 0, 868, 869, 3, 150, 75, 0, 869, 870, 5, 78, 0, 0, 870, 871, 3, 152, 76, 0, 871, 872, 5, 131, 0, 0, 872, 873, 3, 98, 49, 0, 873, 874, 3, 98, 49, 0, 874, 875, 5, 132, 0, 0, 875, 97, 1, 0, 0, 0, 876, 877, 3, 48, 24, 0, 877, 878, 5, 58, 0, 0, 878, 879, 3, 150, 75, 0, 879, 880, 5, 78, 0, 0, 880, 881, 3, 152, 76, 0, 881, 883, 3, 140, 70, 0, 882, 884, 5, 106, 0, 0, 883, 882, 1, 0, 0, 0, 883, 884, 1, 0, 0, 0, 884, 887, 1, 0, 0, 0, 885, 886, 5, 74, 0, 0, 886, 888, 3, 152, 76, 0, 887, 885, 1, 0, 0, 0, 887, 888, 1, 0, 0, 0, 888, 890, 1, 0, 0, 0, 889, 891, 5, 75, 0, 0, 890, 889, 1, 0, 0, 0, 890, 891, 1, 0, 0, 0, 891, 894, 1, 0, 0, 0, 892, 893, 5, 76, 0, 0, 893, 895, 3, 152, 76, 0, 894, 892, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 897, 1, 0, 0, 0, 896, 898, 5, 77, 0, 0, 897, 896, 1, 0, 0, 0, 897, 898, 1, 0, 0, 0, 898, 899, 1, 0, 0, 0, 899, 900, 5, 128, 0, 0, 900, 99, 1, 0, 0, 0, 901, 902, 5, 49, 0, 0, 902, 903, 3, 150, 75, 0, 903, 904, 5, 50, 0, 0, 904, 906, 3, 150, 75, 0, 905, 907, 3, 28, 14, 0, 906, 905, 1, 0, 0, 0, 906, 907, 1, 0, 0, 0, 907, 910, 1, 0, 0, 0, 908, 909, 5, 78, 0, 0, 909, 911, 3, 152, 76, 0, 910, 908, 1, 0, 0, 0, 910, 911, 1, 0, 0, 0, 911, 914, 1, 0, 0, 0, 912, 913, 5, 73, 0, 0, 913, 915, 5, 141, 0, 0, 914, 912, 1, 0, 0, 0, 914, 915, 1, 0, 0, 0, 915, 916, 1, 0, 0, 0, 916, 920, 5, 131, 0, 0, 917, 919, 3, 102, 51, 0, 918, 917, 1, 0, 0, 0, 919, 922, 1, 0, 0, 0, 920, 918, 1, 0, 0, 0, 920, 921, 1, 0, 0, 0, 921, 923, 1, 0, 0, 0, 922, 920, 1, 0, 0, 0, 923, 924, 5, 132, 0, 0, 924, 101, 1, 0, 0, 0, 925, 926, 5, 54, 0, 0, 926, 932, 3, 90, 45, 0, 927, 932, 3, 114, 57, 0, 928, 932, 3, 110, 55, 0, 929, 932, 3, 104, 52, 0, 930, 932, 3, 112, 56, 0, 931, 925, 1, 0, 0, 0, 931, 927, 1, 0, 0, 0, 931, 928, 1, 0, 0, 0, 931, 929, 1, 0, 0, 0, 931, 930, 1, 0, 0, 0, 932, 103, 1, 0, 0, 0, 933, 934, 5, 3, 0, 0, 934, 938, 5, 131, 0, 0, 935, 937, 3, 106, 53, 0, 936, 935, 1, 0, 0, 0, 937, 940, 1, 0, 0, 0, 938, 936, 1, 0, 0, 0, 938, 939, 1, 0, 0, 0, 939, 941, 1, 0, 0, 0, 940, 938, 1, 0, 0, 0, 941, 942, 5, 132, 0, 0, 942, 943, 5, 128, 0, 0, 943, 105, 1, 0, 0, 0, 944, 945, 3, 150, 75, 0, 945, 946, 5, 53, 0, 0, 946, 947, 5, 56, 0, 0, 947, 948, 3, 150, 75, 0, 948, 949, 5, 128, 0, 0, 949, 959, 1, 0, 0, 0, 950, 951, 3, 150, 75, 0, 951, 952, 5, 53, 0, 0, 952, 953, 5, 57, 0, 0, 953, 954, 3, 150, 75, 0, 954, 955, 5, 130, 0, 0, 955, 956, 3, 150, 75, 0, 956, 957, 5, 128, 0, 0, 957, 959, 1, 0, 0, 0, 958, 944, 1, 0, 0, 0, 958, 950, 1, 0, 0, 0, 959, 107, 1, 0, 0, 0, 960, 961, 3, 26, 13, 0, 961, 962, 5, 13, 0, 0, 962, 967, 5, 48, 0, 0, 963, 964, 5, 130, 0, 0, 964, 966, 3, 150, 75, 0, 965, 963, 1, 0, 0, 0, 966, 969, 1, 0, 0, 0, 967, 965, 1, 0, 0, 0, 967, 968, 1, 0, 0, 0, 968, 970, 1, 0, 0, 0, 969, 967, 1, 0, 0, 0, 970, 971, 5, 128, 0, 0, 971, 109, 1, 0, 0, 0, 972, 973, 5, 51, 0, 0, 973, 974, 3, 150, 75, 0, 974, 975, 5, 53, 0, 0, 975, 976, 5, 56, 0, 0, 976, 977, 3, 150, 75, 0, 977, 978, 5, 128, 0, 0, 978, 111, 1, 0, 0, 0, 979, 980, 5, 63, 0, 0, 980, 981, 3, 150, 75, 0, 981, 982, 5, 64, 0, 0, 982, 983, 5, 65, 0, 0, 983, 984, 5, 60, 0, 0, 984, 985, 5, 46, 0, 0, 985, 986, 3, 150, 75, 0, 986, 987, 5, 62, 0, 0, 987, 988, 5, 57, 0, 0, 988, 989, 3, 150, 75, 0, 989, 990, 5, 130, 0, 0, 990, 991, 3, 150, 75, 0, 991, 992, 5, 128, 0, 0, 992, 113, 1, 0, 0, 0, 993, 994, 5, 51, 0, 0, 994, 995, 3, 116, 58, 0, 995, 996, 5, 53, 0, 0, 996, 999, 3, 120, 60, 0, 997, 998, 5, 29, 0, 0, 998, 1000, 3, 152, 76, 0, 999, 997, 1, 0, 0, 0, 999, 1000, 1, 0, 0, 0, 1000, 1001, 1, 0, 0, 0, 1001, 1002, 5, 128, 0, 0, 1002, 115, 1, 0, 0, 0, 1003, 1004, 3, 150, 75, 0, 1004, 1005, 5, 130, 0, 0, 1005, 1006, 3, 118, 59, 0, 1006, 117, 1, 0, 0, 0, 1007, 1020, 3, 150, 75, 0, 1008, 1020, 5, 95, 0, 0, 1009, 1020, 5, 85, 0, 0, 1010, 1020, 5, 86, 0, 0, 1011, 1020, 5, 1, 0, 0, 1012, 1020, 5, 92, 0, 0, 1013, 1020, 5, 93, 0, 0, 1014, 1020, 5, 94, 0, 0, 1015, 1020, 5, 96, 0, 0, 1016, 1020, 5, 97, 0, 0, 1017, 1020, 5, 98, 0, 0, 1018, 1020, 5, 99, 0, 0, 1019, 1007, 1, 0, 0, 0, 1019, 1008, 1, 0, 0, 0, 1019, 1009, 1, 0, 0, 0, 1019, 1010, 1, 0, 0, 0, 1019, 1011, 1, 0, 0, 0, 1019, 1012, 1, 0, 0, 0, 1019, 1013, 1, 0, 0, 0, 1019, 1014, 1, 0, 0, 0, 1019, 1015, 1, 0, 0, 0, 1019, 1016, 1, 0, 0, 0, 1019, 1017, 1, 0, 0, 0, 1019, 1018, 1, 0, 0, 0, 1020, 119, 1, 0, 0, 0, 1021, 1022, 5, 56, 0, 0, 1022, 1023, 3, 150, 75, 0, 1023, 1024, 5, 130, 0, 0, 1024, 1025, 3, 124, 62, 0, 1025, 1055, 1, 0, 0, 0, 1026, 1027, 5, 57, 0, 0, 1027, 1028, 3, 150, 75, 0, 1028, 1029, 5, 130, 0, 0, 1029, 1030, 3, 150, 75, 0, 1030, 1031, 5, 130, 0, 0, 1031, 1032, 3, 126, 63, 0, 1032, 1055, 1, 0, 0, 0, 1033, 1034, 5, 39, 0, 0, 1034, 1036, 3, 150, 75, 0, 1035, 1037, 3, 28, 14, 0, 1036, 1035, 1, 0, 0, 0, 1036, 1037, 1, 0, 0, 0, 1037, 1038, 1, 0, 0, 0, 1038, 1039, 5, 130, 0, 0, 1039, 1040, 3, 116, 58, 0, 1040, 1055, 1, 0, 0, 0, 1041, 1042, 5, 41, 0, 0, 1042, 1043, 3, 150, 75, 0, 1043, 1044, 5, 130, 0, 0, 1044, 1046, 3, 150, 75, 0, 1045, 1047, 3, 28, 14, 0, 1046, 1045, 1, 0, 0, 0, 1046, 1047, 1, 0, 0, 0, 1047, 1049, 1, 0, 0, 0, 1048, 1050, 3, 128, 64, 0, 1049, 1048, 1, 0, 0, 0, 1049, 1050, 1, 0, 0, 0, 1050, 1052, 1, 0, 0, 0, 1051, 1053, 3, 122, 61, 0, 1052, 1051, 1, 0, 0, 0, 1052, 1053, 1, 0, 0, 0, 1053, 1055, 1, 0, 0, 0, 1054, 1021, 1, 0, 0, 0, 1054, 1026, 1, 0, 0, 0, 1054, 1033, 1, 0, 0, 0, 1054, 1041, 1, 0, 0, 0, 1055, 121, 1, 0, 0, 0, 1056, 1057, 5, 61, 0, 0, 1057, 1058, 3, 128, 64, 0, 1058, 123, 1, 0, 0, 0, 1059, 1060, 7, 4, 0, 0, 1060, 125, 1, 0, 0, 0, 1061, 1062, 7, 5, 0, 0, 1062, 127, 1, 0, 0, 0, 1063, 1064, 5, 59, 0, 0, 1064, 1068, 5, 131, 0, 0, 1065, 1067, 3, 130, 65, 0, 1066, 1065, 1, 0, 0, 0, 1067, 1070, 1, 0, 0, 0, 1068, 1066, 1, 0, 0, 0, 1068, 1069, 1, 0, 0, 0, 1069, 1071, 1, 0, 0, 0, 1070, 1068, 1, 0, 0, 0, 1071, 1072, 5, 132, 0, 0, 1072, 129, 1, 0, 0, 0, 1073, 1074, 3, 150, 75, 0, 1074, 1075, 5, 53, 0, 0, 1075, 1076, 5, 4, 0, 0, 1076, 1077, 5, 18, 0, 0, 1077, 1078, 5, 133, 0, 0, 1078, 1079, 3, 78, 39, 0, 1079, 1080, 5, 134, 0, 0, 1080, 1081, 5, 128, 0, 0, 1081, 1170, 1, 0, 0, 0, 1082, 1083, 3, 150, 75, 0, 1083, 1084, 5, 53, 0, 0, 1084, 1085, 5, 56, 0, 0, 1085, 1092, 3, 150, 75, 0, 1086, 1087, 5, 62, 0, 0, 1087, 1088, 5, 57, 0, 0, 1088, 1089, 3, 150, 75, 0, 1089, 1090, 5, 130, 0, 0, 1090, 1091, 3, 150, 75, 0, 1091, 1093, 1, 0, 0, 0, 1092, 1086, 1, 0, 0, 0, 1092, 1093, 1, 0, 0, 0, 1093, 1094, 1, 0, 0, 0, 1094, 1095, 5, 128, 0, 0, 1095, 1170, 1, 0, 0, 0, 1096, 1097, 3, 150, 75, 0, 1097, 1098, 5, 53, 0, 0, 1098, 1099, 5, 57, 0, 0, 1099, 1100, 3, 150, 75, 0, 1100, 1101, 5, 130, 0, 0, 1101, 1108, 3, 150, 75, 0, 1102, 1103, 5, 62, 0, 0, 1103, 1104, 5, 57, 0, 0, 1104, 1105, 3, 150, 75, 0, 1105, 1106, 5, 130, 0, 0, 1106, 1107, 3, 150, 75, 0, 1107, 1109, 1, 0, 0, 0, 1108, 1102, 1, 0, 0, 0, 1108, 1109, 1, 0, 0, 0, 1109, 1110, 1, 0, 0, 0, 1110, 1111, 5, 128, 0, 0, 1111, 1170, 1, 0, 0, 0, 1112, 1113, 3, 150, 75, 0, 1113, 1114, 5, 53, 0, 0, 1114, 1115, 5, 39, 0, 0, 1115, 1117, 3, 150, 75, 0, 1116, 1118, 3, 28, 14, 0, 1117, 1116, 1, 0, 0, 0, 1117, 1118, 1, 0, 0, 0, 1118, 1125, 1, 0, 0, 0, 1119, 1120, 5, 62, 0, 0, 1120, 1121, 5, 57, 0, 0, 1121, 1122, 3, 150, 75, 0, 1122, 1123, 5, 130, 0, 0, 1123, 1124, 3, 150, 75, 0, 1124, 1126, 1, 0, 0, 0, 1125, 1119, 1, 0, 0, 0, 1125, 1126, 1, 0, 0, 0, 1126, 1127, 1, 0, 0, 0, 1127, 1128, 5, 128, 0, 0, 1128, 1170, 1, 0, 0, 0, 1129, 1130, 3, 150, 75, 0, 1130, 1131, 5, 53, 0, 0, 1131, 1132, 5, 2, 0, 0, 1132, 1133, 3, 150, 75, 0, 1133, 1134, 5, 59, 0, 0, 1134, 1138, 5, 131, 0, 0, 1135, 1137, 3, 108, 54, 0, 1136, 1135, 1, 0, 0, 0, 1137, 1140, 1, 0, 0, 0, 1138, 1136, 1, 0, 0, 0, 1138, 1139, 1, 0, 0, 0, 1139, 1141, 1, 0, 0, 0, 1140, 1138, 1, 0, 0, 0, 1141, 1142, 5, 132, 0, 0, 1142, 1143, 5, 128, 0, 0, 1143, 1170, 1, 0, 0, 0, 1144, 1145, 3, 150, 75, 0, 1145, 1146, 5, 53, 0, 0, 1146, 1147, 5, 46, 0, 0, 1147, 1148, 3, 150, 75, 0, 1148, 1149, 5, 128, 0, 0, 1149, 1170, 1, 0, 0, 0, 1150, 1151, 3, 150, 75, 0, 1151, 1153, 5, 53, 0, 0, 1152, 1154, 5, 4, 0, 0, 1153, 1152, 1, 0, 0, 0, 1153, 1154, 1, 0, 0, 0, 1154, 1155, 1, 0, 0, 0, 1155, 1156, 5, 17, 0, 0, 1156, 1157, 3, 150, 75, 0, 1157, 1158, 5, 130, 0, 0, 1158, 1165, 3, 150, 75, 0, 1159, 1160, 5, 62, 0, 0, 1160, 1161, 5, 57, 0, 0, 1161, 1162, 3, 150, 75, 0, 1162, 1163, 5, 130, 0, 0, 1163, 1164, 3, 150, 75, 0, 1164, 1166, 1, 0, 0, 0, 1165, 1159, 1, 0, 0, 0, 1165, 1166, 1, 0, 0, 0, 1166, 1167, 1, 0, 0, 0, 1167, 1168, 5, 128, 0, 0, 1168, 1170, 1, 0, 0, 0, 1169, 1073, 1, 0, 0, 0, 1169, 1082, 1, 0, 0, 0, 1169, 1096, 1, 0, 0, 0, 1169, 1112, 1, 0, 0, 0, 1169, 1129, 1, 0, 0, 0, 1169, 1144, 1, 0, 0, 0, 1169, 1150, 1, 0, 0, 0, 1170, 131, 1, 0, 0, 0, 1171, 1172, 5, 46, 0, 0, 1172, 1173, 3, 150, 75, 0, 1173, 1174, 5, 53, 0, 0, 1174, 1175, 3, 150, 75, 0, 1175, 1176, 5, 130, 0, 0, 1176, 1178, 3, 150, 75, 0, 1177, 1179, 3, 128, 64, 0, 1178, 1177, 1, 0, 0, 0, 1178, 1179, 1, 0, 0, 0, 1179, 1180, 1, 0, 0, 0, 1180, 1181, 5, 128, 0, 0, 1181, 133, 1, 0, 0, 0, 1182, 1229, 3, 138, 69, 0, 1183, 1229, 5, 107, 0, 0, 1184, 1229, 5, 108, 0, 0, 1185, 1186, 5, 109, 0, 0, 1186, 1229, 3, 152, 76, 0, 1187, 1188, 5, 110, 0, 0, 1188, 1189, 5, 137, 0, 0, 1189, 1190, 3, 150, 75, 0, 1190, 1191, 5, 138, 0, 0, 1191, 1229, 1, 0, 0, 0, 1192, 1193, 5, 111, 0, 0, 1193, 1194, 5, 137, 0, 0, 1194, 1196, 3, 150, 75, 0, 1195, 1197, 3, 28, 14, 0, 1196, 1195, 1, 0, 0, 0, 1196, 1197, 1, 0, 0, 0, 1197, 1198, 1, 0, 0, 0, 1198, 1199, 5, 138, 0, 0, 1199, 1229, 1, 0, 0, 0, 1200, 1201, 5, 34, 0, 0, 1201, 1202, 5, 137, 0, 0, 1202, 1203, 3, 150, 75, 0, 1203, 1204, 5, 138, 0, 0, 1204, 1229, 1, 0, 0, 0, 1205, 1206, 5, 112, 0, 0, 1206, 1207, 5, 137, 0, 0, 1207, 1208, 3, 134, 67, 0, 1208, 1209, 5, 138, 0, 0, 1209, 1229, 1, 0, 0, 0, 1210, 1211, 5, 113, 0, 0, 1211, 1212, 5, 137, 0, 0, 1212, 1213, 3, 134, 67, 0, 1213, 1214, 5, 138, 0, 0, 1214, 1229, 1, 0, 0, 0, 1215, 1216, 5, 114, 0, 0, 1216, 1220, 5, 131, 0, 0, 1217, 1219, 3, 136, 68, 0, 1218, 1217, 1, 0, 0, 0, 1219, 1222, 1, 0, 0, 0, 1220, 1218, 1, 0, 0, 0, 1220, 1221, 1, 0, 0, 0, 1221, 1223, 1, 0, 0, 0, 1222, 1220, 1, 0, 0, 0, 1223, 1229, 5, 132, 0, 0, 1224, 1226, 3, 150, 75, 0, 1225, 1227, 3, 28, 14, 0, 1226, 1225, 1, 0, 0, 0, 1226, 1227, 1, 0, 0, 0, 1227, 1229, 1, 0, 0, 0, 1228, 1182, 1, 0, 0, 0, 1228, 1183, 1, 0, 0, 0, 1228, 1184, 1, 0, 0, 0, 1228, 1185, 1, 0, 0, 0, 1228, 1187, 1, 0, 0, 0, 1228, 1192, 1, 0, 0, 0, 1228, 1200, 1, 0, 0, 0, 1228, 1205, 1, 0, 0, 0, 1228, 1210, 1, 0, 0, 0, 1228, 1215, 1, 0, 0, 0, 1228, 1224, 1, 0, 0, 0, 1229, 135, 1, 0, 0, 0, 1230, 1231, 3, 150, 75, 0, 1231, 1232, 5, 127, 0, 0, 1232, 1233, 3, 134, 67, 0, 1233, 1234, 5, 128, 0, 0, 1234, 137, 1, 0, 0, 0, 1235, 1236, 7, 6, 0, 0, 1236, 139, 1, 0, 0, 0, 1237, 1238, 7, 7, 0, 0, 1238, 141, 1, 0, 0, 0, 1239, 1248, 3, 152, 76, 0, 1240, 1248, 5, 141, 0, 0, 1241, 1248, 5, 142, 0, 0, 1242, 1248, 5, 123, 0, 0, 1243, 1248, 5, 124, 0, 0, 1244, 1248, 5, 125, 0, 0, 1245, 1248, 3, 144, 72, 0, 1246, 1248, 3, 148, 74, 0, 1247, 1239, 1, 0, 0, 0, 1247, 1240, 1, 0, 0, 0, 1247, 1241, 1, 0, 0, 0, 1247, 1242, 1, 0, 0, 0, 1247, 1243, 1, 0, 0, 0, 1247, 1244, 1, 0, 0, 0, 1247, 1245, 1, 0, 0, 0, 1247, 1246, 1, 0, 0, 0, 1248, 143, 1, 0, 0, 0, 1249, 1258, 5, 131, 0, 0, 1250, 1255, 3, 146, 73, 0, 1251, 1252, 5, 129, 0, 0, 1252, 1254, 3, 146, 73, 0, 1253, 1251, 1, 0, 0, 0, 1254, 1257, 1, 0, 0, 0, 1255, 1253, 1, 0, 0, 0, 1255, 1256, 1, 0, 0, 0, 1256, 1259, 1, 0, 0, 0, 1257, 1255, 1, 0, 0, 0, 1258, 1250, 1, 0, 0, 0, 1258, 1259, 1, 0, 0, 0, 1259, 1260, 1, 0, 0, 0, 1260, 1261, 5, 132, 0, 0, 1261, 145, 1, 0, 0, 0, 1262, 1263, 3, 152, 76, 0, 1263, 1264, 5, 127, 0, 0, 1264, 1265, 3, 142, 71, 0, 1265, 147, 1, 0, 0, 0, 1266, 1275, 5, 133, 0, 0, 1267, 1272, 3, 142, 71, 0, 1268, 1269, 5, 129, 0, 0, 1269, 1271, 3, 142, 71, 0, 1270, 1268, 1, 0, 0, 0, 1271, 1274, 1, 0, 0, 0, 1272, 1270, 1, 0, 0, 0, 1272, 1273, 1, 0, 0, 0, 1273, 1276, 1, 0, 0, 0, 1274, 1272, 1, 0, 0, 0, 1275, 1267, 1, 0, 0, 0, 1275, 1276, 1, 0, 0, 0, 1276, 1277, 1, 0, 0, 0, 1277, 1278, 5, 134, 0, 0, 1278, 149, 1, 0, 0, 0, 1279, 1280, 7, 8, 0, 0, 1280, 151, 1, 0, 0, 0, 1281, 1282, 5, 144, 0, 0, 1282, 153, 1, 0, 0, 0, 114, 166, 173, 194, 206, 218, 238, 246, 253, 259, 271, 274, 280, 291, 300, 310, 313, 315, 319, 327, 339, 344, 353, 356, 371, 377, 389, 398, 406, 414, 427, 430, 440, 444, 450, 457, 463, 471, 479, 492, 499, 503, 508, 519, 525, 535, 540, 546, 557, 584, 611, 616, 627, 630, 635, 638, 645, 654, 657, 660, 677, 686, 700, 721, 724, 727, 734, 742, 782, 785, 807, 821, 829, 841, 855, 865, 883, 887, 890, 894, 897, 906, 910, 914, 920, 931, 938, 958, 967, 999, 1019, 1036, 1046, 1049, 1052, 1054, 1068, 1092, 1108, 1117, 1125, 1138, 1153, 1165, 1169, 1178, 1196, 1220, 1226, 1228, 1247, 1255, 1258, 1272, 1275] \ No newline at end of file +[4, 1, 147, 1290, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 167, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 172, 8, 1, 10, 1, 12, 1, 175, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 193, 8, 3, 10, 3, 12, 3, 196, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 207, 8, 4, 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, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 239, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 247, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 252, 8, 10, 10, 10, 12, 10, 255, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 260, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 270, 8, 10, 10, 10, 12, 10, 273, 9, 10, 3, 10, 275, 8, 10, 1, 10, 1, 10, 5, 10, 279, 8, 10, 10, 10, 12, 10, 282, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 290, 8, 11, 10, 11, 12, 11, 293, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 301, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 309, 8, 12, 10, 12, 12, 12, 312, 9, 12, 3, 12, 314, 8, 12, 3, 12, 316, 8, 12, 1, 13, 1, 13, 3, 13, 320, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 326, 8, 14, 10, 14, 12, 14, 329, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 340, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 345, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 354, 8, 17, 1, 18, 3, 18, 357, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 372, 8, 18, 1, 18, 1, 18, 1, 18, 1, 19, 3, 19, 378, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 388, 8, 19, 10, 19, 12, 19, 391, 9, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 399, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 407, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 415, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 428, 8, 20, 1, 21, 3, 21, 431, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 441, 8, 21, 1, 21, 1, 21, 3, 21, 445, 8, 21, 1, 21, 1, 21, 5, 21, 449, 8, 21, 10, 21, 12, 21, 452, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 458, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 464, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 472, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 480, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 493, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 500, 8, 24, 1, 24, 1, 24, 3, 24, 504, 8, 24, 1, 25, 5, 25, 507, 8, 25, 10, 25, 12, 25, 510, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 520, 8, 25, 1, 25, 1, 25, 5, 25, 524, 8, 25, 10, 25, 12, 25, 527, 9, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 536, 8, 26, 1, 27, 1, 27, 1, 27, 3, 27, 541, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 547, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 556, 8, 27, 10, 27, 12, 27, 559, 9, 27, 1, 27, 1, 27, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 585, 8, 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, 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, 3, 29, 612, 8, 29, 1, 30, 1, 30, 1, 30, 3, 30, 617, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 628, 8, 30, 1, 30, 3, 30, 631, 8, 30, 1, 30, 1, 30, 1, 30, 3, 30, 636, 8, 30, 1, 30, 3, 30, 639, 8, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 3, 31, 646, 8, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 655, 8, 31, 1, 31, 3, 31, 658, 8, 31, 1, 31, 3, 31, 661, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 678, 8, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 685, 8, 34, 10, 34, 12, 34, 688, 9, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 701, 8, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 720, 8, 38, 10, 38, 12, 38, 723, 9, 38, 3, 38, 725, 8, 38, 1, 38, 3, 38, 728, 8, 38, 1, 39, 1, 39, 1, 39, 5, 39, 733, 8, 39, 10, 39, 12, 39, 736, 9, 39, 1, 40, 1, 40, 1, 40, 5, 40, 741, 8, 40, 10, 40, 12, 40, 744, 9, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 783, 8, 41, 1, 41, 3, 41, 786, 8, 41, 1, 41, 1, 41, 3, 41, 790, 8, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 812, 8, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 826, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 832, 8, 42, 10, 42, 12, 42, 835, 9, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 3, 45, 846, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 860, 8, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 870, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 888, 8, 49, 1, 49, 1, 49, 3, 49, 892, 8, 49, 1, 49, 3, 49, 895, 8, 49, 1, 49, 1, 49, 3, 49, 899, 8, 49, 1, 49, 3, 49, 902, 8, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 911, 8, 50, 1, 50, 1, 50, 3, 50, 915, 8, 50, 1, 50, 1, 50, 3, 50, 919, 8, 50, 1, 50, 1, 50, 5, 50, 923, 8, 50, 10, 50, 12, 50, 926, 9, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 936, 8, 51, 1, 52, 1, 52, 1, 52, 5, 52, 941, 8, 52, 10, 52, 12, 52, 944, 9, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 963, 8, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 5, 54, 970, 8, 54, 10, 54, 12, 54, 973, 9, 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, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 1004, 8, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 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, 1024, 8, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1041, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1051, 8, 60, 1, 60, 3, 60, 1054, 8, 60, 1, 60, 3, 60, 1057, 8, 60, 3, 60, 1059, 8, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 5, 64, 1071, 8, 64, 10, 64, 12, 64, 1074, 9, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1097, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1113, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1122, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1132, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 5, 65, 1143, 8, 65, 10, 65, 12, 65, 1146, 9, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1160, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1172, 8, 65, 1, 65, 1, 65, 3, 65, 1176, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1185, 8, 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, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1203, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 5, 67, 1225, 8, 67, 10, 67, 12, 67, 1228, 9, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1233, 8, 67, 3, 67, 1235, 8, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1254, 8, 71, 1, 72, 1, 72, 1, 72, 1, 72, 5, 72, 1260, 8, 72, 10, 72, 12, 72, 1263, 9, 72, 3, 72, 1265, 8, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 5, 74, 1277, 8, 74, 10, 74, 12, 74, 1280, 9, 74, 3, 74, 1282, 8, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 0, 0, 77, 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, 0, 9, 2, 0, 10, 10, 28, 28, 1, 0, 6, 7, 1, 0, 95, 99, 3, 0, 1, 1, 90, 94, 96, 97, 3, 0, 1, 1, 90, 91, 96, 97, 2, 0, 92, 94, 96, 97, 1, 0, 115, 122, 1, 0, 102, 105, 7, 0, 1, 3, 5, 28, 40, 40, 69, 69, 88, 89, 100, 100, 143, 143, 1396, 0, 166, 1, 0, 0, 0, 2, 168, 1, 0, 0, 0, 4, 178, 1, 0, 0, 0, 6, 182, 1, 0, 0, 0, 8, 206, 1, 0, 0, 0, 10, 218, 1, 0, 0, 0, 12, 220, 1, 0, 0, 0, 14, 227, 1, 0, 0, 0, 16, 238, 1, 0, 0, 0, 18, 240, 1, 0, 0, 0, 20, 253, 1, 0, 0, 0, 22, 285, 1, 0, 0, 0, 24, 315, 1, 0, 0, 0, 26, 317, 1, 0, 0, 0, 28, 321, 1, 0, 0, 0, 30, 339, 1, 0, 0, 0, 32, 341, 1, 0, 0, 0, 34, 353, 1, 0, 0, 0, 36, 356, 1, 0, 0, 0, 38, 377, 1, 0, 0, 0, 40, 427, 1, 0, 0, 0, 42, 430, 1, 0, 0, 0, 44, 455, 1, 0, 0, 0, 46, 492, 1, 0, 0, 0, 48, 503, 1, 0, 0, 0, 50, 508, 1, 0, 0, 0, 52, 535, 1, 0, 0, 0, 54, 537, 1, 0, 0, 0, 56, 562, 1, 0, 0, 0, 58, 611, 1, 0, 0, 0, 60, 613, 1, 0, 0, 0, 62, 642, 1, 0, 0, 0, 64, 664, 1, 0, 0, 0, 66, 677, 1, 0, 0, 0, 68, 679, 1, 0, 0, 0, 70, 691, 1, 0, 0, 0, 72, 704, 1, 0, 0, 0, 74, 707, 1, 0, 0, 0, 76, 727, 1, 0, 0, 0, 78, 729, 1, 0, 0, 0, 80, 737, 1, 0, 0, 0, 82, 825, 1, 0, 0, 0, 84, 827, 1, 0, 0, 0, 86, 838, 1, 0, 0, 0, 88, 840, 1, 0, 0, 0, 90, 845, 1, 0, 0, 0, 92, 847, 1, 0, 0, 0, 94, 869, 1, 0, 0, 0, 96, 871, 1, 0, 0, 0, 98, 880, 1, 0, 0, 0, 100, 905, 1, 0, 0, 0, 102, 935, 1, 0, 0, 0, 104, 937, 1, 0, 0, 0, 106, 962, 1, 0, 0, 0, 108, 964, 1, 0, 0, 0, 110, 976, 1, 0, 0, 0, 112, 983, 1, 0, 0, 0, 114, 997, 1, 0, 0, 0, 116, 1007, 1, 0, 0, 0, 118, 1023, 1, 0, 0, 0, 120, 1058, 1, 0, 0, 0, 122, 1060, 1, 0, 0, 0, 124, 1063, 1, 0, 0, 0, 126, 1065, 1, 0, 0, 0, 128, 1067, 1, 0, 0, 0, 130, 1175, 1, 0, 0, 0, 132, 1177, 1, 0, 0, 0, 134, 1234, 1, 0, 0, 0, 136, 1236, 1, 0, 0, 0, 138, 1241, 1, 0, 0, 0, 140, 1243, 1, 0, 0, 0, 142, 1253, 1, 0, 0, 0, 144, 1255, 1, 0, 0, 0, 146, 1268, 1, 0, 0, 0, 148, 1272, 1, 0, 0, 0, 150, 1285, 1, 0, 0, 0, 152, 1287, 1, 0, 0, 0, 154, 155, 3, 6, 3, 0, 155, 156, 5, 0, 0, 1, 156, 167, 1, 0, 0, 0, 157, 158, 3, 20, 10, 0, 158, 159, 5, 0, 0, 1, 159, 167, 1, 0, 0, 0, 160, 161, 3, 50, 25, 0, 161, 162, 5, 0, 0, 1, 162, 167, 1, 0, 0, 0, 163, 164, 3, 2, 1, 0, 164, 165, 5, 0, 0, 1, 165, 167, 1, 0, 0, 0, 166, 154, 1, 0, 0, 0, 166, 157, 1, 0, 0, 0, 166, 160, 1, 0, 0, 0, 166, 163, 1, 0, 0, 0, 167, 1, 1, 0, 0, 0, 168, 169, 5, 35, 0, 0, 169, 173, 5, 131, 0, 0, 170, 172, 3, 8, 4, 0, 171, 170, 1, 0, 0, 0, 172, 175, 1, 0, 0, 0, 173, 171, 1, 0, 0, 0, 173, 174, 1, 0, 0, 0, 174, 176, 1, 0, 0, 0, 175, 173, 1, 0, 0, 0, 176, 177, 5, 132, 0, 0, 177, 3, 1, 0, 0, 0, 178, 179, 5, 36, 0, 0, 179, 180, 3, 152, 76, 0, 180, 181, 5, 128, 0, 0, 181, 5, 1, 0, 0, 0, 182, 183, 5, 4, 0, 0, 183, 184, 3, 150, 75, 0, 184, 185, 5, 78, 0, 0, 185, 186, 3, 152, 76, 0, 186, 187, 5, 72, 0, 0, 187, 188, 3, 152, 76, 0, 188, 189, 5, 71, 0, 0, 189, 190, 3, 152, 76, 0, 190, 194, 5, 131, 0, 0, 191, 193, 3, 8, 4, 0, 192, 191, 1, 0, 0, 0, 193, 196, 1, 0, 0, 0, 194, 192, 1, 0, 0, 0, 194, 195, 1, 0, 0, 0, 195, 197, 1, 0, 0, 0, 196, 194, 1, 0, 0, 0, 197, 198, 5, 132, 0, 0, 198, 7, 1, 0, 0, 0, 199, 207, 3, 4, 2, 0, 200, 207, 3, 18, 9, 0, 201, 207, 3, 10, 5, 0, 202, 207, 3, 88, 44, 0, 203, 207, 3, 100, 50, 0, 204, 207, 3, 132, 66, 0, 205, 207, 3, 32, 16, 0, 206, 199, 1, 0, 0, 0, 206, 200, 1, 0, 0, 0, 206, 201, 1, 0, 0, 0, 206, 202, 1, 0, 0, 0, 206, 203, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 206, 205, 1, 0, 0, 0, 207, 9, 1, 0, 0, 0, 208, 209, 5, 36, 0, 0, 209, 210, 5, 39, 0, 0, 210, 211, 3, 150, 75, 0, 211, 212, 5, 128, 0, 0, 212, 219, 1, 0, 0, 0, 213, 214, 5, 36, 0, 0, 214, 215, 5, 41, 0, 0, 215, 216, 3, 150, 75, 0, 216, 217, 5, 128, 0, 0, 217, 219, 1, 0, 0, 0, 218, 208, 1, 0, 0, 0, 218, 213, 1, 0, 0, 0, 219, 11, 1, 0, 0, 0, 220, 221, 5, 37, 0, 0, 221, 222, 5, 38, 0, 0, 222, 223, 3, 150, 75, 0, 223, 224, 5, 78, 0, 0, 224, 225, 3, 152, 76, 0, 225, 226, 5, 128, 0, 0, 226, 13, 1, 0, 0, 0, 227, 228, 5, 37, 0, 0, 228, 229, 5, 39, 0, 0, 229, 230, 3, 150, 75, 0, 230, 231, 5, 72, 0, 0, 231, 232, 3, 152, 76, 0, 232, 233, 5, 128, 0, 0, 233, 15, 1, 0, 0, 0, 234, 239, 3, 10, 5, 0, 235, 239, 3, 12, 6, 0, 236, 239, 3, 14, 7, 0, 237, 239, 3, 32, 16, 0, 238, 234, 1, 0, 0, 0, 238, 235, 1, 0, 0, 0, 238, 236, 1, 0, 0, 0, 238, 237, 1, 0, 0, 0, 239, 17, 1, 0, 0, 0, 240, 241, 5, 38, 0, 0, 241, 242, 3, 150, 75, 0, 242, 243, 5, 78, 0, 0, 243, 246, 3, 152, 76, 0, 244, 245, 5, 79, 0, 0, 245, 247, 3, 152, 76, 0, 246, 244, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 249, 5, 128, 0, 0, 249, 19, 1, 0, 0, 0, 250, 252, 3, 16, 8, 0, 251, 250, 1, 0, 0, 0, 252, 255, 1, 0, 0, 0, 253, 251, 1, 0, 0, 0, 253, 254, 1, 0, 0, 0, 254, 256, 1, 0, 0, 0, 255, 253, 1, 0, 0, 0, 256, 257, 5, 39, 0, 0, 257, 259, 3, 150, 75, 0, 258, 260, 3, 22, 11, 0, 259, 258, 1, 0, 0, 0, 259, 260, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 262, 5, 78, 0, 0, 262, 263, 3, 152, 76, 0, 263, 264, 5, 72, 0, 0, 264, 274, 3, 152, 76, 0, 265, 266, 5, 83, 0, 0, 266, 271, 3, 26, 13, 0, 267, 268, 5, 129, 0, 0, 268, 270, 3, 26, 13, 0, 269, 267, 1, 0, 0, 0, 270, 273, 1, 0, 0, 0, 271, 269, 1, 0, 0, 0, 271, 272, 1, 0, 0, 0, 272, 275, 1, 0, 0, 0, 273, 271, 1, 0, 0, 0, 274, 265, 1, 0, 0, 0, 274, 275, 1, 0, 0, 0, 275, 276, 1, 0, 0, 0, 276, 280, 5, 131, 0, 0, 277, 279, 3, 34, 17, 0, 278, 277, 1, 0, 0, 0, 279, 282, 1, 0, 0, 0, 280, 278, 1, 0, 0, 0, 280, 281, 1, 0, 0, 0, 281, 283, 1, 0, 0, 0, 282, 280, 1, 0, 0, 0, 283, 284, 5, 132, 0, 0, 284, 21, 1, 0, 0, 0, 285, 286, 5, 137, 0, 0, 286, 291, 3, 24, 12, 0, 287, 288, 5, 129, 0, 0, 288, 290, 3, 24, 12, 0, 289, 287, 1, 0, 0, 0, 290, 293, 1, 0, 0, 0, 291, 289, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 294, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 294, 295, 5, 138, 0, 0, 295, 23, 1, 0, 0, 0, 296, 297, 5, 42, 0, 0, 297, 300, 3, 150, 75, 0, 298, 299, 5, 127, 0, 0, 299, 301, 5, 32, 0, 0, 300, 298, 1, 0, 0, 0, 300, 301, 1, 0, 0, 0, 301, 316, 1, 0, 0, 0, 302, 303, 5, 31, 0, 0, 303, 313, 3, 150, 75, 0, 304, 305, 5, 33, 0, 0, 305, 310, 3, 26, 13, 0, 306, 307, 5, 139, 0, 0, 307, 309, 3, 26, 13, 0, 308, 306, 1, 0, 0, 0, 309, 312, 1, 0, 0, 0, 310, 308, 1, 0, 0, 0, 310, 311, 1, 0, 0, 0, 311, 314, 1, 0, 0, 0, 312, 310, 1, 0, 0, 0, 313, 304, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 316, 1, 0, 0, 0, 315, 296, 1, 0, 0, 0, 315, 302, 1, 0, 0, 0, 316, 25, 1, 0, 0, 0, 317, 319, 3, 150, 75, 0, 318, 320, 3, 28, 14, 0, 319, 318, 1, 0, 0, 0, 319, 320, 1, 0, 0, 0, 320, 27, 1, 0, 0, 0, 321, 322, 5, 137, 0, 0, 322, 327, 3, 30, 15, 0, 323, 324, 5, 129, 0, 0, 324, 326, 3, 30, 15, 0, 325, 323, 1, 0, 0, 0, 326, 329, 1, 0, 0, 0, 327, 325, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 330, 1, 0, 0, 0, 329, 327, 1, 0, 0, 0, 330, 331, 5, 138, 0, 0, 331, 29, 1, 0, 0, 0, 332, 333, 5, 38, 0, 0, 333, 340, 3, 150, 75, 0, 334, 335, 5, 39, 0, 0, 335, 340, 3, 26, 13, 0, 336, 337, 5, 31, 0, 0, 337, 340, 3, 150, 75, 0, 338, 340, 3, 134, 67, 0, 339, 332, 1, 0, 0, 0, 339, 334, 1, 0, 0, 0, 339, 336, 1, 0, 0, 0, 339, 338, 1, 0, 0, 0, 340, 31, 1, 0, 0, 0, 341, 342, 5, 30, 0, 0, 342, 344, 3, 150, 75, 0, 343, 345, 3, 22, 11, 0, 344, 343, 1, 0, 0, 0, 344, 345, 1, 0, 0, 0, 345, 346, 1, 0, 0, 0, 346, 347, 5, 140, 0, 0, 347, 348, 3, 134, 67, 0, 348, 349, 5, 128, 0, 0, 349, 33, 1, 0, 0, 0, 350, 354, 3, 38, 19, 0, 351, 354, 3, 42, 21, 0, 352, 354, 3, 36, 18, 0, 353, 350, 1, 0, 0, 0, 353, 351, 1, 0, 0, 0, 353, 352, 1, 0, 0, 0, 354, 35, 1, 0, 0, 0, 355, 357, 5, 52, 0, 0, 356, 355, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 358, 1, 0, 0, 0, 358, 359, 5, 44, 0, 0, 359, 360, 3, 150, 75, 0, 360, 361, 5, 78, 0, 0, 361, 362, 3, 152, 76, 0, 362, 363, 5, 127, 0, 0, 363, 364, 3, 134, 67, 0, 364, 365, 5, 126, 0, 0, 365, 366, 3, 134, 67, 0, 366, 367, 5, 131, 0, 0, 367, 368, 5, 95, 0, 0, 368, 369, 5, 78, 0, 0, 369, 371, 3, 152, 76, 0, 370, 372, 3, 66, 33, 0, 371, 370, 1, 0, 0, 0, 371, 372, 1, 0, 0, 0, 372, 373, 1, 0, 0, 0, 373, 374, 5, 128, 0, 0, 374, 375, 5, 132, 0, 0, 375, 37, 1, 0, 0, 0, 376, 378, 3, 44, 22, 0, 377, 376, 1, 0, 0, 0, 377, 378, 1, 0, 0, 0, 378, 379, 1, 0, 0, 0, 379, 380, 5, 42, 0, 0, 380, 381, 3, 150, 75, 0, 381, 382, 5, 78, 0, 0, 382, 383, 3, 152, 76, 0, 383, 384, 5, 127, 0, 0, 384, 385, 3, 134, 67, 0, 385, 389, 5, 131, 0, 0, 386, 388, 3, 40, 20, 0, 387, 386, 1, 0, 0, 0, 388, 391, 1, 0, 0, 0, 389, 387, 1, 0, 0, 0, 389, 390, 1, 0, 0, 0, 390, 392, 1, 0, 0, 0, 391, 389, 1, 0, 0, 0, 392, 393, 5, 132, 0, 0, 393, 39, 1, 0, 0, 0, 394, 395, 5, 85, 0, 0, 395, 396, 5, 78, 0, 0, 396, 398, 3, 152, 76, 0, 397, 399, 3, 66, 33, 0, 398, 397, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 401, 5, 128, 0, 0, 401, 428, 1, 0, 0, 0, 402, 403, 5, 86, 0, 0, 403, 404, 5, 78, 0, 0, 404, 406, 3, 152, 76, 0, 405, 407, 3, 66, 33, 0, 406, 405, 1, 0, 0, 0, 406, 407, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 409, 5, 128, 0, 0, 409, 428, 1, 0, 0, 0, 410, 411, 5, 1, 0, 0, 411, 412, 5, 78, 0, 0, 412, 414, 3, 152, 76, 0, 413, 415, 3, 66, 33, 0, 414, 413, 1, 0, 0, 0, 414, 415, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 417, 5, 128, 0, 0, 417, 428, 1, 0, 0, 0, 418, 419, 5, 87, 0, 0, 419, 420, 5, 88, 0, 0, 420, 421, 5, 78, 0, 0, 421, 422, 3, 152, 76, 0, 422, 423, 5, 89, 0, 0, 423, 424, 5, 78, 0, 0, 424, 425, 3, 152, 76, 0, 425, 426, 5, 128, 0, 0, 426, 428, 1, 0, 0, 0, 427, 394, 1, 0, 0, 0, 427, 402, 1, 0, 0, 0, 427, 410, 1, 0, 0, 0, 427, 418, 1, 0, 0, 0, 428, 41, 1, 0, 0, 0, 429, 431, 3, 44, 22, 0, 430, 429, 1, 0, 0, 0, 430, 431, 1, 0, 0, 0, 431, 432, 1, 0, 0, 0, 432, 433, 5, 43, 0, 0, 433, 434, 3, 150, 75, 0, 434, 435, 5, 78, 0, 0, 435, 436, 3, 152, 76, 0, 436, 437, 5, 127, 0, 0, 437, 438, 3, 140, 70, 0, 438, 440, 3, 48, 24, 0, 439, 441, 5, 106, 0, 0, 440, 439, 1, 0, 0, 0, 440, 441, 1, 0, 0, 0, 441, 444, 1, 0, 0, 0, 442, 443, 5, 76, 0, 0, 443, 445, 3, 152, 76, 0, 444, 442, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 450, 5, 131, 0, 0, 447, 449, 3, 46, 23, 0, 448, 447, 1, 0, 0, 0, 449, 452, 1, 0, 0, 0, 450, 448, 1, 0, 0, 0, 450, 451, 1, 0, 0, 0, 451, 453, 1, 0, 0, 0, 452, 450, 1, 0, 0, 0, 453, 454, 5, 132, 0, 0, 454, 43, 1, 0, 0, 0, 455, 457, 5, 27, 0, 0, 456, 458, 7, 0, 0, 0, 457, 456, 1, 0, 0, 0, 457, 458, 1, 0, 0, 0, 458, 45, 1, 0, 0, 0, 459, 460, 5, 92, 0, 0, 460, 461, 5, 78, 0, 0, 461, 463, 3, 152, 76, 0, 462, 464, 3, 66, 33, 0, 463, 462, 1, 0, 0, 0, 463, 464, 1, 0, 0, 0, 464, 465, 1, 0, 0, 0, 465, 466, 5, 128, 0, 0, 466, 493, 1, 0, 0, 0, 467, 468, 5, 93, 0, 0, 468, 469, 5, 78, 0, 0, 469, 471, 3, 152, 76, 0, 470, 472, 3, 66, 33, 0, 471, 470, 1, 0, 0, 0, 471, 472, 1, 0, 0, 0, 472, 473, 1, 0, 0, 0, 473, 474, 5, 128, 0, 0, 474, 493, 1, 0, 0, 0, 475, 476, 5, 94, 0, 0, 476, 477, 5, 78, 0, 0, 477, 479, 3, 152, 76, 0, 478, 480, 3, 66, 33, 0, 479, 478, 1, 0, 0, 0, 479, 480, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 482, 5, 128, 0, 0, 482, 493, 1, 0, 0, 0, 483, 484, 5, 87, 0, 0, 484, 485, 5, 88, 0, 0, 485, 486, 5, 78, 0, 0, 486, 487, 3, 152, 76, 0, 487, 488, 5, 89, 0, 0, 488, 489, 5, 78, 0, 0, 489, 490, 3, 152, 76, 0, 490, 491, 5, 128, 0, 0, 491, 493, 1, 0, 0, 0, 492, 459, 1, 0, 0, 0, 492, 467, 1, 0, 0, 0, 492, 475, 1, 0, 0, 0, 492, 483, 1, 0, 0, 0, 493, 47, 1, 0, 0, 0, 494, 495, 5, 38, 0, 0, 495, 504, 3, 150, 75, 0, 496, 497, 5, 39, 0, 0, 497, 499, 3, 150, 75, 0, 498, 500, 3, 28, 14, 0, 499, 498, 1, 0, 0, 0, 499, 500, 1, 0, 0, 0, 500, 504, 1, 0, 0, 0, 501, 502, 5, 31, 0, 0, 502, 504, 3, 150, 75, 0, 503, 494, 1, 0, 0, 0, 503, 496, 1, 0, 0, 0, 503, 501, 1, 0, 0, 0, 504, 49, 1, 0, 0, 0, 505, 507, 3, 16, 8, 0, 506, 505, 1, 0, 0, 0, 507, 510, 1, 0, 0, 0, 508, 506, 1, 0, 0, 0, 508, 509, 1, 0, 0, 0, 509, 511, 1, 0, 0, 0, 510, 508, 1, 0, 0, 0, 511, 512, 5, 41, 0, 0, 512, 513, 3, 150, 75, 0, 513, 514, 5, 78, 0, 0, 514, 515, 3, 152, 76, 0, 515, 516, 5, 72, 0, 0, 516, 519, 3, 152, 76, 0, 517, 518, 5, 73, 0, 0, 518, 520, 5, 141, 0, 0, 519, 517, 1, 0, 0, 0, 519, 520, 1, 0, 0, 0, 520, 521, 1, 0, 0, 0, 521, 525, 5, 131, 0, 0, 522, 524, 3, 52, 26, 0, 523, 522, 1, 0, 0, 0, 524, 527, 1, 0, 0, 0, 525, 523, 1, 0, 0, 0, 525, 526, 1, 0, 0, 0, 526, 528, 1, 0, 0, 0, 527, 525, 1, 0, 0, 0, 528, 529, 5, 132, 0, 0, 529, 51, 1, 0, 0, 0, 530, 536, 3, 60, 30, 0, 531, 536, 3, 62, 31, 0, 532, 536, 3, 70, 35, 0, 533, 536, 3, 54, 27, 0, 534, 536, 3, 56, 28, 0, 535, 530, 1, 0, 0, 0, 535, 531, 1, 0, 0, 0, 535, 532, 1, 0, 0, 0, 535, 533, 1, 0, 0, 0, 535, 534, 1, 0, 0, 0, 536, 53, 1, 0, 0, 0, 537, 538, 5, 17, 0, 0, 538, 540, 3, 150, 75, 0, 539, 541, 3, 22, 11, 0, 540, 539, 1, 0, 0, 0, 540, 541, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 543, 5, 78, 0, 0, 543, 544, 3, 152, 76, 0, 544, 546, 5, 20, 0, 0, 545, 547, 5, 4, 0, 0, 546, 545, 1, 0, 0, 0, 546, 547, 1, 0, 0, 0, 547, 548, 1, 0, 0, 0, 548, 549, 3, 26, 13, 0, 549, 550, 5, 21, 0, 0, 550, 551, 3, 152, 76, 0, 551, 552, 5, 44, 0, 0, 552, 553, 3, 152, 76, 0, 553, 557, 5, 131, 0, 0, 554, 556, 3, 58, 29, 0, 555, 554, 1, 0, 0, 0, 556, 559, 1, 0, 0, 0, 557, 555, 1, 0, 0, 0, 557, 558, 1, 0, 0, 0, 558, 560, 1, 0, 0, 0, 559, 557, 1, 0, 0, 0, 560, 561, 5, 132, 0, 0, 561, 55, 1, 0, 0, 0, 562, 563, 5, 17, 0, 0, 563, 564, 3, 150, 75, 0, 564, 565, 5, 78, 0, 0, 565, 566, 3, 152, 76, 0, 566, 567, 5, 19, 0, 0, 567, 568, 3, 150, 75, 0, 568, 569, 3, 28, 14, 0, 569, 570, 5, 128, 0, 0, 570, 57, 1, 0, 0, 0, 571, 572, 5, 11, 0, 0, 572, 612, 5, 128, 0, 0, 573, 574, 5, 12, 0, 0, 574, 575, 5, 13, 0, 0, 575, 576, 3, 150, 75, 0, 576, 577, 5, 128, 0, 0, 577, 612, 1, 0, 0, 0, 578, 579, 5, 22, 0, 0, 579, 580, 3, 152, 76, 0, 580, 581, 5, 128, 0, 0, 581, 612, 1, 0, 0, 0, 582, 584, 5, 23, 0, 0, 583, 585, 5, 31, 0, 0, 584, 583, 1, 0, 0, 0, 584, 585, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 587, 3, 150, 75, 0, 587, 588, 5, 50, 0, 0, 588, 589, 3, 26, 13, 0, 589, 590, 5, 128, 0, 0, 590, 612, 1, 0, 0, 0, 591, 592, 5, 24, 0, 0, 592, 593, 3, 150, 75, 0, 593, 594, 5, 141, 0, 0, 594, 595, 5, 128, 0, 0, 595, 612, 1, 0, 0, 0, 596, 597, 5, 25, 0, 0, 597, 598, 3, 26, 13, 0, 598, 599, 5, 130, 0, 0, 599, 600, 3, 150, 75, 0, 600, 601, 3, 150, 75, 0, 601, 602, 3, 152, 76, 0, 602, 603, 5, 128, 0, 0, 603, 612, 1, 0, 0, 0, 604, 605, 5, 87, 0, 0, 605, 612, 5, 128, 0, 0, 606, 607, 5, 26, 0, 0, 607, 608, 5, 141, 0, 0, 608, 609, 3, 152, 76, 0, 609, 610, 5, 128, 0, 0, 610, 612, 1, 0, 0, 0, 611, 571, 1, 0, 0, 0, 611, 573, 1, 0, 0, 0, 611, 578, 1, 0, 0, 0, 611, 582, 1, 0, 0, 0, 611, 591, 1, 0, 0, 0, 611, 596, 1, 0, 0, 0, 611, 604, 1, 0, 0, 0, 611, 606, 1, 0, 0, 0, 612, 59, 1, 0, 0, 0, 613, 614, 5, 44, 0, 0, 614, 616, 3, 150, 75, 0, 615, 617, 3, 22, 11, 0, 616, 615, 1, 0, 0, 0, 616, 617, 1, 0, 0, 0, 617, 618, 1, 0, 0, 0, 618, 619, 5, 78, 0, 0, 619, 620, 3, 152, 76, 0, 620, 621, 5, 127, 0, 0, 621, 622, 3, 134, 67, 0, 622, 623, 5, 126, 0, 0, 623, 624, 3, 134, 67, 0, 624, 625, 5, 80, 0, 0, 625, 627, 3, 74, 37, 0, 626, 628, 3, 66, 33, 0, 627, 626, 1, 0, 0, 0, 627, 628, 1, 0, 0, 0, 628, 630, 1, 0, 0, 0, 629, 631, 3, 72, 36, 0, 630, 629, 1, 0, 0, 0, 630, 631, 1, 0, 0, 0, 631, 632, 1, 0, 0, 0, 632, 633, 5, 82, 0, 0, 633, 635, 3, 76, 38, 0, 634, 636, 3, 80, 40, 0, 635, 634, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 638, 1, 0, 0, 0, 637, 639, 3, 64, 32, 0, 638, 637, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 641, 5, 128, 0, 0, 641, 61, 1, 0, 0, 0, 642, 643, 5, 45, 0, 0, 643, 645, 3, 150, 75, 0, 644, 646, 3, 22, 11, 0, 645, 644, 1, 0, 0, 0, 645, 646, 1, 0, 0, 0, 646, 647, 1, 0, 0, 0, 647, 648, 5, 78, 0, 0, 648, 649, 3, 152, 76, 0, 649, 650, 5, 127, 0, 0, 650, 651, 3, 134, 67, 0, 651, 652, 5, 126, 0, 0, 652, 654, 3, 134, 67, 0, 653, 655, 3, 66, 33, 0, 654, 653, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 657, 1, 0, 0, 0, 656, 658, 3, 80, 40, 0, 657, 656, 1, 0, 0, 0, 657, 658, 1, 0, 0, 0, 658, 660, 1, 0, 0, 0, 659, 661, 3, 64, 32, 0, 660, 659, 1, 0, 0, 0, 660, 661, 1, 0, 0, 0, 661, 662, 1, 0, 0, 0, 662, 663, 5, 128, 0, 0, 663, 63, 1, 0, 0, 0, 664, 665, 5, 61, 0, 0, 665, 666, 5, 60, 0, 0, 666, 667, 3, 150, 75, 0, 667, 65, 1, 0, 0, 0, 668, 669, 5, 5, 0, 0, 669, 678, 5, 8, 0, 0, 670, 671, 5, 5, 0, 0, 671, 672, 7, 1, 0, 0, 672, 673, 5, 9, 0, 0, 673, 674, 5, 133, 0, 0, 674, 675, 3, 78, 39, 0, 675, 676, 5, 134, 0, 0, 676, 678, 1, 0, 0, 0, 677, 668, 1, 0, 0, 0, 677, 670, 1, 0, 0, 0, 678, 67, 1, 0, 0, 0, 679, 680, 5, 60, 0, 0, 680, 681, 5, 133, 0, 0, 681, 686, 3, 116, 58, 0, 682, 683, 5, 129, 0, 0, 683, 685, 3, 116, 58, 0, 684, 682, 1, 0, 0, 0, 685, 688, 1, 0, 0, 0, 686, 684, 1, 0, 0, 0, 686, 687, 1, 0, 0, 0, 687, 689, 1, 0, 0, 0, 688, 686, 1, 0, 0, 0, 689, 690, 5, 134, 0, 0, 690, 69, 1, 0, 0, 0, 691, 692, 5, 46, 0, 0, 692, 693, 3, 150, 75, 0, 693, 694, 5, 78, 0, 0, 694, 695, 3, 152, 76, 0, 695, 696, 5, 47, 0, 0, 696, 697, 3, 150, 75, 0, 697, 698, 5, 127, 0, 0, 698, 700, 3, 134, 67, 0, 699, 701, 3, 80, 40, 0, 700, 699, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 702, 1, 0, 0, 0, 702, 703, 5, 128, 0, 0, 703, 71, 1, 0, 0, 0, 704, 705, 5, 81, 0, 0, 705, 706, 3, 134, 67, 0, 706, 73, 1, 0, 0, 0, 707, 708, 7, 2, 0, 0, 708, 75, 1, 0, 0, 0, 709, 728, 5, 84, 0, 0, 710, 711, 5, 38, 0, 0, 711, 728, 3, 150, 75, 0, 712, 713, 5, 31, 0, 0, 713, 728, 3, 150, 75, 0, 714, 715, 5, 40, 0, 0, 715, 724, 5, 133, 0, 0, 716, 721, 3, 26, 13, 0, 717, 718, 5, 129, 0, 0, 718, 720, 3, 26, 13, 0, 719, 717, 1, 0, 0, 0, 720, 723, 1, 0, 0, 0, 721, 719, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 725, 1, 0, 0, 0, 723, 721, 1, 0, 0, 0, 724, 716, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 726, 1, 0, 0, 0, 726, 728, 5, 134, 0, 0, 727, 709, 1, 0, 0, 0, 727, 710, 1, 0, 0, 0, 727, 712, 1, 0, 0, 0, 727, 714, 1, 0, 0, 0, 728, 77, 1, 0, 0, 0, 729, 734, 3, 150, 75, 0, 730, 731, 5, 129, 0, 0, 731, 733, 3, 150, 75, 0, 732, 730, 1, 0, 0, 0, 733, 736, 1, 0, 0, 0, 734, 732, 1, 0, 0, 0, 734, 735, 1, 0, 0, 0, 735, 79, 1, 0, 0, 0, 736, 734, 1, 0, 0, 0, 737, 738, 5, 83, 0, 0, 738, 742, 5, 131, 0, 0, 739, 741, 3, 82, 41, 0, 740, 739, 1, 0, 0, 0, 741, 744, 1, 0, 0, 0, 742, 740, 1, 0, 0, 0, 742, 743, 1, 0, 0, 0, 743, 745, 1, 0, 0, 0, 744, 742, 1, 0, 0, 0, 745, 746, 5, 132, 0, 0, 746, 81, 1, 0, 0, 0, 747, 748, 5, 18, 0, 0, 748, 749, 3, 150, 75, 0, 749, 750, 5, 78, 0, 0, 750, 751, 3, 152, 76, 0, 751, 752, 5, 133, 0, 0, 752, 753, 3, 78, 39, 0, 753, 754, 5, 134, 0, 0, 754, 755, 5, 128, 0, 0, 755, 826, 1, 0, 0, 0, 756, 757, 5, 56, 0, 0, 757, 758, 3, 150, 75, 0, 758, 759, 5, 78, 0, 0, 759, 760, 3, 152, 76, 0, 760, 761, 5, 127, 0, 0, 761, 762, 3, 134, 67, 0, 762, 763, 3, 84, 42, 0, 763, 764, 5, 128, 0, 0, 764, 826, 1, 0, 0, 0, 765, 766, 5, 57, 0, 0, 766, 767, 3, 150, 75, 0, 767, 768, 5, 78, 0, 0, 768, 769, 3, 152, 76, 0, 769, 770, 5, 127, 0, 0, 770, 771, 3, 140, 70, 0, 771, 772, 3, 48, 24, 0, 772, 773, 3, 84, 42, 0, 773, 774, 5, 128, 0, 0, 774, 826, 1, 0, 0, 0, 775, 776, 5, 39, 0, 0, 776, 777, 3, 150, 75, 0, 777, 778, 5, 78, 0, 0, 778, 779, 3, 152, 76, 0, 779, 780, 5, 127, 0, 0, 780, 782, 3, 150, 75, 0, 781, 783, 3, 28, 14, 0, 782, 781, 1, 0, 0, 0, 782, 783, 1, 0, 0, 0, 783, 785, 1, 0, 0, 0, 784, 786, 3, 68, 34, 0, 785, 784, 1, 0, 0, 0, 785, 786, 1, 0, 0, 0, 786, 789, 1, 0, 0, 0, 787, 788, 5, 13, 0, 0, 788, 790, 5, 48, 0, 0, 789, 787, 1, 0, 0, 0, 789, 790, 1, 0, 0, 0, 790, 791, 1, 0, 0, 0, 791, 792, 5, 128, 0, 0, 792, 826, 1, 0, 0, 0, 793, 794, 5, 2, 0, 0, 794, 795, 3, 150, 75, 0, 795, 796, 5, 78, 0, 0, 796, 797, 3, 152, 76, 0, 797, 798, 5, 127, 0, 0, 798, 799, 3, 150, 75, 0, 799, 800, 5, 48, 0, 0, 800, 801, 3, 134, 67, 0, 801, 802, 5, 128, 0, 0, 802, 826, 1, 0, 0, 0, 803, 804, 5, 46, 0, 0, 804, 805, 3, 150, 75, 0, 805, 806, 5, 78, 0, 0, 806, 807, 3, 152, 76, 0, 807, 808, 5, 127, 0, 0, 808, 811, 3, 150, 75, 0, 809, 810, 5, 48, 0, 0, 810, 812, 3, 134, 67, 0, 811, 809, 1, 0, 0, 0, 811, 812, 1, 0, 0, 0, 812, 813, 1, 0, 0, 0, 813, 814, 5, 128, 0, 0, 814, 826, 1, 0, 0, 0, 815, 816, 5, 17, 0, 0, 816, 817, 3, 150, 75, 0, 817, 818, 5, 78, 0, 0, 818, 819, 3, 152, 76, 0, 819, 820, 5, 127, 0, 0, 820, 821, 3, 150, 75, 0, 821, 822, 5, 130, 0, 0, 822, 823, 3, 150, 75, 0, 823, 824, 5, 128, 0, 0, 824, 826, 1, 0, 0, 0, 825, 747, 1, 0, 0, 0, 825, 756, 1, 0, 0, 0, 825, 765, 1, 0, 0, 0, 825, 775, 1, 0, 0, 0, 825, 793, 1, 0, 0, 0, 825, 803, 1, 0, 0, 0, 825, 815, 1, 0, 0, 0, 826, 83, 1, 0, 0, 0, 827, 828, 5, 133, 0, 0, 828, 833, 3, 86, 43, 0, 829, 830, 5, 129, 0, 0, 830, 832, 3, 86, 43, 0, 831, 829, 1, 0, 0, 0, 832, 835, 1, 0, 0, 0, 833, 831, 1, 0, 0, 0, 833, 834, 1, 0, 0, 0, 834, 836, 1, 0, 0, 0, 835, 833, 1, 0, 0, 0, 836, 837, 5, 134, 0, 0, 837, 85, 1, 0, 0, 0, 838, 839, 7, 3, 0, 0, 839, 87, 1, 0, 0, 0, 840, 841, 5, 55, 0, 0, 841, 842, 3, 90, 45, 0, 842, 89, 1, 0, 0, 0, 843, 846, 3, 92, 46, 0, 844, 846, 3, 96, 48, 0, 845, 843, 1, 0, 0, 0, 845, 844, 1, 0, 0, 0, 846, 91, 1, 0, 0, 0, 847, 848, 5, 56, 0, 0, 848, 849, 3, 150, 75, 0, 849, 850, 5, 78, 0, 0, 850, 851, 3, 152, 76, 0, 851, 852, 5, 66, 0, 0, 852, 853, 3, 150, 75, 0, 853, 854, 5, 127, 0, 0, 854, 855, 3, 134, 67, 0, 855, 856, 5, 67, 0, 0, 856, 859, 3, 94, 47, 0, 857, 858, 5, 68, 0, 0, 858, 860, 3, 142, 71, 0, 859, 857, 1, 0, 0, 0, 859, 860, 1, 0, 0, 0, 860, 861, 1, 0, 0, 0, 861, 862, 5, 128, 0, 0, 862, 93, 1, 0, 0, 0, 863, 870, 5, 100, 0, 0, 864, 865, 5, 101, 0, 0, 865, 866, 5, 135, 0, 0, 866, 867, 3, 134, 67, 0, 867, 868, 5, 136, 0, 0, 868, 870, 1, 0, 0, 0, 869, 863, 1, 0, 0, 0, 869, 864, 1, 0, 0, 0, 870, 95, 1, 0, 0, 0, 871, 872, 5, 57, 0, 0, 872, 873, 3, 150, 75, 0, 873, 874, 5, 78, 0, 0, 874, 875, 3, 152, 76, 0, 875, 876, 5, 131, 0, 0, 876, 877, 3, 98, 49, 0, 877, 878, 3, 98, 49, 0, 878, 879, 5, 132, 0, 0, 879, 97, 1, 0, 0, 0, 880, 881, 3, 48, 24, 0, 881, 882, 5, 58, 0, 0, 882, 883, 3, 150, 75, 0, 883, 884, 5, 78, 0, 0, 884, 885, 3, 152, 76, 0, 885, 887, 3, 140, 70, 0, 886, 888, 5, 106, 0, 0, 887, 886, 1, 0, 0, 0, 887, 888, 1, 0, 0, 0, 888, 891, 1, 0, 0, 0, 889, 890, 5, 74, 0, 0, 890, 892, 3, 152, 76, 0, 891, 889, 1, 0, 0, 0, 891, 892, 1, 0, 0, 0, 892, 894, 1, 0, 0, 0, 893, 895, 5, 75, 0, 0, 894, 893, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 898, 1, 0, 0, 0, 896, 897, 5, 76, 0, 0, 897, 899, 3, 152, 76, 0, 898, 896, 1, 0, 0, 0, 898, 899, 1, 0, 0, 0, 899, 901, 1, 0, 0, 0, 900, 902, 5, 77, 0, 0, 901, 900, 1, 0, 0, 0, 901, 902, 1, 0, 0, 0, 902, 903, 1, 0, 0, 0, 903, 904, 5, 128, 0, 0, 904, 99, 1, 0, 0, 0, 905, 906, 5, 49, 0, 0, 906, 907, 3, 150, 75, 0, 907, 908, 5, 50, 0, 0, 908, 910, 3, 150, 75, 0, 909, 911, 3, 28, 14, 0, 910, 909, 1, 0, 0, 0, 910, 911, 1, 0, 0, 0, 911, 914, 1, 0, 0, 0, 912, 913, 5, 78, 0, 0, 913, 915, 3, 152, 76, 0, 914, 912, 1, 0, 0, 0, 914, 915, 1, 0, 0, 0, 915, 918, 1, 0, 0, 0, 916, 917, 5, 73, 0, 0, 917, 919, 5, 141, 0, 0, 918, 916, 1, 0, 0, 0, 918, 919, 1, 0, 0, 0, 919, 920, 1, 0, 0, 0, 920, 924, 5, 131, 0, 0, 921, 923, 3, 102, 51, 0, 922, 921, 1, 0, 0, 0, 923, 926, 1, 0, 0, 0, 924, 922, 1, 0, 0, 0, 924, 925, 1, 0, 0, 0, 925, 927, 1, 0, 0, 0, 926, 924, 1, 0, 0, 0, 927, 928, 5, 132, 0, 0, 928, 101, 1, 0, 0, 0, 929, 930, 5, 54, 0, 0, 930, 936, 3, 90, 45, 0, 931, 936, 3, 114, 57, 0, 932, 936, 3, 110, 55, 0, 933, 936, 3, 104, 52, 0, 934, 936, 3, 112, 56, 0, 935, 929, 1, 0, 0, 0, 935, 931, 1, 0, 0, 0, 935, 932, 1, 0, 0, 0, 935, 933, 1, 0, 0, 0, 935, 934, 1, 0, 0, 0, 936, 103, 1, 0, 0, 0, 937, 938, 5, 3, 0, 0, 938, 942, 5, 131, 0, 0, 939, 941, 3, 106, 53, 0, 940, 939, 1, 0, 0, 0, 941, 944, 1, 0, 0, 0, 942, 940, 1, 0, 0, 0, 942, 943, 1, 0, 0, 0, 943, 945, 1, 0, 0, 0, 944, 942, 1, 0, 0, 0, 945, 946, 5, 132, 0, 0, 946, 947, 5, 128, 0, 0, 947, 105, 1, 0, 0, 0, 948, 949, 3, 150, 75, 0, 949, 950, 5, 53, 0, 0, 950, 951, 5, 56, 0, 0, 951, 952, 3, 150, 75, 0, 952, 953, 5, 128, 0, 0, 953, 963, 1, 0, 0, 0, 954, 955, 3, 150, 75, 0, 955, 956, 5, 53, 0, 0, 956, 957, 5, 57, 0, 0, 957, 958, 3, 150, 75, 0, 958, 959, 5, 130, 0, 0, 959, 960, 3, 150, 75, 0, 960, 961, 5, 128, 0, 0, 961, 963, 1, 0, 0, 0, 962, 948, 1, 0, 0, 0, 962, 954, 1, 0, 0, 0, 963, 107, 1, 0, 0, 0, 964, 965, 3, 26, 13, 0, 965, 966, 5, 13, 0, 0, 966, 971, 5, 48, 0, 0, 967, 968, 5, 130, 0, 0, 968, 970, 3, 150, 75, 0, 969, 967, 1, 0, 0, 0, 970, 973, 1, 0, 0, 0, 971, 969, 1, 0, 0, 0, 971, 972, 1, 0, 0, 0, 972, 974, 1, 0, 0, 0, 973, 971, 1, 0, 0, 0, 974, 975, 5, 128, 0, 0, 975, 109, 1, 0, 0, 0, 976, 977, 5, 51, 0, 0, 977, 978, 3, 150, 75, 0, 978, 979, 5, 53, 0, 0, 979, 980, 5, 56, 0, 0, 980, 981, 3, 150, 75, 0, 981, 982, 5, 128, 0, 0, 982, 111, 1, 0, 0, 0, 983, 984, 5, 63, 0, 0, 984, 985, 3, 150, 75, 0, 985, 986, 5, 64, 0, 0, 986, 987, 5, 65, 0, 0, 987, 988, 5, 60, 0, 0, 988, 989, 5, 46, 0, 0, 989, 990, 3, 150, 75, 0, 990, 991, 5, 62, 0, 0, 991, 992, 5, 57, 0, 0, 992, 993, 3, 150, 75, 0, 993, 994, 5, 130, 0, 0, 994, 995, 3, 150, 75, 0, 995, 996, 5, 128, 0, 0, 996, 113, 1, 0, 0, 0, 997, 998, 5, 51, 0, 0, 998, 999, 3, 116, 58, 0, 999, 1000, 5, 53, 0, 0, 1000, 1003, 3, 120, 60, 0, 1001, 1002, 5, 29, 0, 0, 1002, 1004, 3, 152, 76, 0, 1003, 1001, 1, 0, 0, 0, 1003, 1004, 1, 0, 0, 0, 1004, 1005, 1, 0, 0, 0, 1005, 1006, 5, 128, 0, 0, 1006, 115, 1, 0, 0, 0, 1007, 1008, 3, 150, 75, 0, 1008, 1009, 5, 130, 0, 0, 1009, 1010, 3, 118, 59, 0, 1010, 117, 1, 0, 0, 0, 1011, 1024, 3, 150, 75, 0, 1012, 1024, 5, 95, 0, 0, 1013, 1024, 5, 85, 0, 0, 1014, 1024, 5, 86, 0, 0, 1015, 1024, 5, 1, 0, 0, 1016, 1024, 5, 92, 0, 0, 1017, 1024, 5, 93, 0, 0, 1018, 1024, 5, 94, 0, 0, 1019, 1024, 5, 96, 0, 0, 1020, 1024, 5, 97, 0, 0, 1021, 1024, 5, 98, 0, 0, 1022, 1024, 5, 99, 0, 0, 1023, 1011, 1, 0, 0, 0, 1023, 1012, 1, 0, 0, 0, 1023, 1013, 1, 0, 0, 0, 1023, 1014, 1, 0, 0, 0, 1023, 1015, 1, 0, 0, 0, 1023, 1016, 1, 0, 0, 0, 1023, 1017, 1, 0, 0, 0, 1023, 1018, 1, 0, 0, 0, 1023, 1019, 1, 0, 0, 0, 1023, 1020, 1, 0, 0, 0, 1023, 1021, 1, 0, 0, 0, 1023, 1022, 1, 0, 0, 0, 1024, 119, 1, 0, 0, 0, 1025, 1026, 5, 56, 0, 0, 1026, 1027, 3, 150, 75, 0, 1027, 1028, 5, 130, 0, 0, 1028, 1029, 3, 124, 62, 0, 1029, 1059, 1, 0, 0, 0, 1030, 1031, 5, 57, 0, 0, 1031, 1032, 3, 150, 75, 0, 1032, 1033, 5, 130, 0, 0, 1033, 1034, 3, 150, 75, 0, 1034, 1035, 5, 130, 0, 0, 1035, 1036, 3, 126, 63, 0, 1036, 1059, 1, 0, 0, 0, 1037, 1038, 5, 39, 0, 0, 1038, 1040, 3, 150, 75, 0, 1039, 1041, 3, 28, 14, 0, 1040, 1039, 1, 0, 0, 0, 1040, 1041, 1, 0, 0, 0, 1041, 1042, 1, 0, 0, 0, 1042, 1043, 5, 130, 0, 0, 1043, 1044, 3, 116, 58, 0, 1044, 1059, 1, 0, 0, 0, 1045, 1046, 5, 41, 0, 0, 1046, 1047, 3, 150, 75, 0, 1047, 1048, 5, 130, 0, 0, 1048, 1050, 3, 150, 75, 0, 1049, 1051, 3, 28, 14, 0, 1050, 1049, 1, 0, 0, 0, 1050, 1051, 1, 0, 0, 0, 1051, 1053, 1, 0, 0, 0, 1052, 1054, 3, 128, 64, 0, 1053, 1052, 1, 0, 0, 0, 1053, 1054, 1, 0, 0, 0, 1054, 1056, 1, 0, 0, 0, 1055, 1057, 3, 122, 61, 0, 1056, 1055, 1, 0, 0, 0, 1056, 1057, 1, 0, 0, 0, 1057, 1059, 1, 0, 0, 0, 1058, 1025, 1, 0, 0, 0, 1058, 1030, 1, 0, 0, 0, 1058, 1037, 1, 0, 0, 0, 1058, 1045, 1, 0, 0, 0, 1059, 121, 1, 0, 0, 0, 1060, 1061, 5, 61, 0, 0, 1061, 1062, 3, 128, 64, 0, 1062, 123, 1, 0, 0, 0, 1063, 1064, 7, 4, 0, 0, 1064, 125, 1, 0, 0, 0, 1065, 1066, 7, 5, 0, 0, 1066, 127, 1, 0, 0, 0, 1067, 1068, 5, 59, 0, 0, 1068, 1072, 5, 131, 0, 0, 1069, 1071, 3, 130, 65, 0, 1070, 1069, 1, 0, 0, 0, 1071, 1074, 1, 0, 0, 0, 1072, 1070, 1, 0, 0, 0, 1072, 1073, 1, 0, 0, 0, 1073, 1075, 1, 0, 0, 0, 1074, 1072, 1, 0, 0, 0, 1075, 1076, 5, 132, 0, 0, 1076, 129, 1, 0, 0, 0, 1077, 1078, 3, 150, 75, 0, 1078, 1079, 5, 53, 0, 0, 1079, 1080, 5, 4, 0, 0, 1080, 1081, 5, 18, 0, 0, 1081, 1082, 5, 133, 0, 0, 1082, 1083, 3, 78, 39, 0, 1083, 1084, 5, 134, 0, 0, 1084, 1085, 5, 128, 0, 0, 1085, 1176, 1, 0, 0, 0, 1086, 1087, 3, 150, 75, 0, 1087, 1088, 5, 53, 0, 0, 1088, 1089, 5, 56, 0, 0, 1089, 1096, 3, 150, 75, 0, 1090, 1091, 5, 62, 0, 0, 1091, 1092, 5, 57, 0, 0, 1092, 1093, 3, 150, 75, 0, 1093, 1094, 5, 130, 0, 0, 1094, 1095, 3, 150, 75, 0, 1095, 1097, 1, 0, 0, 0, 1096, 1090, 1, 0, 0, 0, 1096, 1097, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1099, 5, 128, 0, 0, 1099, 1176, 1, 0, 0, 0, 1100, 1101, 3, 150, 75, 0, 1101, 1102, 5, 53, 0, 0, 1102, 1103, 5, 57, 0, 0, 1103, 1104, 3, 150, 75, 0, 1104, 1105, 5, 130, 0, 0, 1105, 1112, 3, 150, 75, 0, 1106, 1107, 5, 62, 0, 0, 1107, 1108, 5, 57, 0, 0, 1108, 1109, 3, 150, 75, 0, 1109, 1110, 5, 130, 0, 0, 1110, 1111, 3, 150, 75, 0, 1111, 1113, 1, 0, 0, 0, 1112, 1106, 1, 0, 0, 0, 1112, 1113, 1, 0, 0, 0, 1113, 1114, 1, 0, 0, 0, 1114, 1115, 5, 128, 0, 0, 1115, 1176, 1, 0, 0, 0, 1116, 1117, 3, 150, 75, 0, 1117, 1118, 5, 53, 0, 0, 1118, 1119, 5, 39, 0, 0, 1119, 1121, 3, 150, 75, 0, 1120, 1122, 3, 28, 14, 0, 1121, 1120, 1, 0, 0, 0, 1121, 1122, 1, 0, 0, 0, 1122, 1131, 1, 0, 0, 0, 1123, 1124, 5, 62, 0, 0, 1124, 1125, 5, 57, 0, 0, 1125, 1126, 3, 150, 75, 0, 1126, 1127, 5, 130, 0, 0, 1127, 1128, 3, 150, 75, 0, 1128, 1132, 1, 0, 0, 0, 1129, 1130, 5, 13, 0, 0, 1130, 1132, 5, 48, 0, 0, 1131, 1123, 1, 0, 0, 0, 1131, 1129, 1, 0, 0, 0, 1131, 1132, 1, 0, 0, 0, 1132, 1133, 1, 0, 0, 0, 1133, 1134, 5, 128, 0, 0, 1134, 1176, 1, 0, 0, 0, 1135, 1136, 3, 150, 75, 0, 1136, 1137, 5, 53, 0, 0, 1137, 1138, 5, 2, 0, 0, 1138, 1139, 3, 150, 75, 0, 1139, 1140, 5, 59, 0, 0, 1140, 1144, 5, 131, 0, 0, 1141, 1143, 3, 108, 54, 0, 1142, 1141, 1, 0, 0, 0, 1143, 1146, 1, 0, 0, 0, 1144, 1142, 1, 0, 0, 0, 1144, 1145, 1, 0, 0, 0, 1145, 1147, 1, 0, 0, 0, 1146, 1144, 1, 0, 0, 0, 1147, 1148, 5, 132, 0, 0, 1148, 1149, 5, 128, 0, 0, 1149, 1176, 1, 0, 0, 0, 1150, 1151, 3, 150, 75, 0, 1151, 1152, 5, 53, 0, 0, 1152, 1153, 5, 46, 0, 0, 1153, 1154, 3, 150, 75, 0, 1154, 1155, 5, 128, 0, 0, 1155, 1176, 1, 0, 0, 0, 1156, 1157, 3, 150, 75, 0, 1157, 1159, 5, 53, 0, 0, 1158, 1160, 5, 4, 0, 0, 1159, 1158, 1, 0, 0, 0, 1159, 1160, 1, 0, 0, 0, 1160, 1161, 1, 0, 0, 0, 1161, 1162, 5, 17, 0, 0, 1162, 1163, 3, 150, 75, 0, 1163, 1164, 5, 130, 0, 0, 1164, 1171, 3, 150, 75, 0, 1165, 1166, 5, 62, 0, 0, 1166, 1167, 5, 57, 0, 0, 1167, 1168, 3, 150, 75, 0, 1168, 1169, 5, 130, 0, 0, 1169, 1170, 3, 150, 75, 0, 1170, 1172, 1, 0, 0, 0, 1171, 1165, 1, 0, 0, 0, 1171, 1172, 1, 0, 0, 0, 1172, 1173, 1, 0, 0, 0, 1173, 1174, 5, 128, 0, 0, 1174, 1176, 1, 0, 0, 0, 1175, 1077, 1, 0, 0, 0, 1175, 1086, 1, 0, 0, 0, 1175, 1100, 1, 0, 0, 0, 1175, 1116, 1, 0, 0, 0, 1175, 1135, 1, 0, 0, 0, 1175, 1150, 1, 0, 0, 0, 1175, 1156, 1, 0, 0, 0, 1176, 131, 1, 0, 0, 0, 1177, 1178, 5, 46, 0, 0, 1178, 1179, 3, 150, 75, 0, 1179, 1180, 5, 53, 0, 0, 1180, 1181, 3, 150, 75, 0, 1181, 1182, 5, 130, 0, 0, 1182, 1184, 3, 150, 75, 0, 1183, 1185, 3, 128, 64, 0, 1184, 1183, 1, 0, 0, 0, 1184, 1185, 1, 0, 0, 0, 1185, 1186, 1, 0, 0, 0, 1186, 1187, 5, 128, 0, 0, 1187, 133, 1, 0, 0, 0, 1188, 1235, 3, 138, 69, 0, 1189, 1235, 5, 107, 0, 0, 1190, 1235, 5, 108, 0, 0, 1191, 1192, 5, 109, 0, 0, 1192, 1235, 3, 152, 76, 0, 1193, 1194, 5, 110, 0, 0, 1194, 1195, 5, 137, 0, 0, 1195, 1196, 3, 150, 75, 0, 1196, 1197, 5, 138, 0, 0, 1197, 1235, 1, 0, 0, 0, 1198, 1199, 5, 111, 0, 0, 1199, 1200, 5, 137, 0, 0, 1200, 1202, 3, 150, 75, 0, 1201, 1203, 3, 28, 14, 0, 1202, 1201, 1, 0, 0, 0, 1202, 1203, 1, 0, 0, 0, 1203, 1204, 1, 0, 0, 0, 1204, 1205, 5, 138, 0, 0, 1205, 1235, 1, 0, 0, 0, 1206, 1207, 5, 34, 0, 0, 1207, 1208, 5, 137, 0, 0, 1208, 1209, 3, 150, 75, 0, 1209, 1210, 5, 138, 0, 0, 1210, 1235, 1, 0, 0, 0, 1211, 1212, 5, 112, 0, 0, 1212, 1213, 5, 137, 0, 0, 1213, 1214, 3, 134, 67, 0, 1214, 1215, 5, 138, 0, 0, 1215, 1235, 1, 0, 0, 0, 1216, 1217, 5, 113, 0, 0, 1217, 1218, 5, 137, 0, 0, 1218, 1219, 3, 134, 67, 0, 1219, 1220, 5, 138, 0, 0, 1220, 1235, 1, 0, 0, 0, 1221, 1222, 5, 114, 0, 0, 1222, 1226, 5, 131, 0, 0, 1223, 1225, 3, 136, 68, 0, 1224, 1223, 1, 0, 0, 0, 1225, 1228, 1, 0, 0, 0, 1226, 1224, 1, 0, 0, 0, 1226, 1227, 1, 0, 0, 0, 1227, 1229, 1, 0, 0, 0, 1228, 1226, 1, 0, 0, 0, 1229, 1235, 5, 132, 0, 0, 1230, 1232, 3, 150, 75, 0, 1231, 1233, 3, 28, 14, 0, 1232, 1231, 1, 0, 0, 0, 1232, 1233, 1, 0, 0, 0, 1233, 1235, 1, 0, 0, 0, 1234, 1188, 1, 0, 0, 0, 1234, 1189, 1, 0, 0, 0, 1234, 1190, 1, 0, 0, 0, 1234, 1191, 1, 0, 0, 0, 1234, 1193, 1, 0, 0, 0, 1234, 1198, 1, 0, 0, 0, 1234, 1206, 1, 0, 0, 0, 1234, 1211, 1, 0, 0, 0, 1234, 1216, 1, 0, 0, 0, 1234, 1221, 1, 0, 0, 0, 1234, 1230, 1, 0, 0, 0, 1235, 135, 1, 0, 0, 0, 1236, 1237, 3, 150, 75, 0, 1237, 1238, 5, 127, 0, 0, 1238, 1239, 3, 134, 67, 0, 1239, 1240, 5, 128, 0, 0, 1240, 137, 1, 0, 0, 0, 1241, 1242, 7, 6, 0, 0, 1242, 139, 1, 0, 0, 0, 1243, 1244, 7, 7, 0, 0, 1244, 141, 1, 0, 0, 0, 1245, 1254, 3, 152, 76, 0, 1246, 1254, 5, 141, 0, 0, 1247, 1254, 5, 142, 0, 0, 1248, 1254, 5, 123, 0, 0, 1249, 1254, 5, 124, 0, 0, 1250, 1254, 5, 125, 0, 0, 1251, 1254, 3, 144, 72, 0, 1252, 1254, 3, 148, 74, 0, 1253, 1245, 1, 0, 0, 0, 1253, 1246, 1, 0, 0, 0, 1253, 1247, 1, 0, 0, 0, 1253, 1248, 1, 0, 0, 0, 1253, 1249, 1, 0, 0, 0, 1253, 1250, 1, 0, 0, 0, 1253, 1251, 1, 0, 0, 0, 1253, 1252, 1, 0, 0, 0, 1254, 143, 1, 0, 0, 0, 1255, 1264, 5, 131, 0, 0, 1256, 1261, 3, 146, 73, 0, 1257, 1258, 5, 129, 0, 0, 1258, 1260, 3, 146, 73, 0, 1259, 1257, 1, 0, 0, 0, 1260, 1263, 1, 0, 0, 0, 1261, 1259, 1, 0, 0, 0, 1261, 1262, 1, 0, 0, 0, 1262, 1265, 1, 0, 0, 0, 1263, 1261, 1, 0, 0, 0, 1264, 1256, 1, 0, 0, 0, 1264, 1265, 1, 0, 0, 0, 1265, 1266, 1, 0, 0, 0, 1266, 1267, 5, 132, 0, 0, 1267, 145, 1, 0, 0, 0, 1268, 1269, 3, 152, 76, 0, 1269, 1270, 5, 127, 0, 0, 1270, 1271, 3, 142, 71, 0, 1271, 147, 1, 0, 0, 0, 1272, 1281, 5, 133, 0, 0, 1273, 1278, 3, 142, 71, 0, 1274, 1275, 5, 129, 0, 0, 1275, 1277, 3, 142, 71, 0, 1276, 1274, 1, 0, 0, 0, 1277, 1280, 1, 0, 0, 0, 1278, 1276, 1, 0, 0, 0, 1278, 1279, 1, 0, 0, 0, 1279, 1282, 1, 0, 0, 0, 1280, 1278, 1, 0, 0, 0, 1281, 1273, 1, 0, 0, 0, 1281, 1282, 1, 0, 0, 0, 1282, 1283, 1, 0, 0, 0, 1283, 1284, 5, 134, 0, 0, 1284, 149, 1, 0, 0, 0, 1285, 1286, 7, 8, 0, 0, 1286, 151, 1, 0, 0, 0, 1287, 1288, 5, 144, 0, 0, 1288, 153, 1, 0, 0, 0, 115, 166, 173, 194, 206, 218, 238, 246, 253, 259, 271, 274, 280, 291, 300, 310, 313, 315, 319, 327, 339, 344, 353, 356, 371, 377, 389, 398, 406, 414, 427, 430, 440, 444, 450, 457, 463, 471, 479, 492, 499, 503, 508, 519, 525, 535, 540, 546, 557, 584, 611, 616, 627, 630, 635, 638, 645, 654, 657, 660, 677, 686, 700, 721, 724, 727, 734, 742, 782, 785, 789, 811, 825, 833, 845, 859, 869, 887, 891, 894, 898, 901, 910, 914, 918, 924, 935, 942, 962, 971, 1003, 1023, 1040, 1050, 1053, 1056, 1058, 1072, 1096, 1112, 1121, 1131, 1144, 1159, 1171, 1175, 1184, 1202, 1226, 1232, 1234, 1253, 1261, 1264, 1278, 1281] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapabilityParser.ts b/src/capability-language/generated/QuixosCapabilityParser.ts index c11c8a3..6fefb82 100644 --- a/src/capability-language/generated/QuixosCapabilityParser.ts +++ b/src/capability-language/generated/QuixosCapabilityParser.ts @@ -2817,7 +2817,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 82, QuixosCapabilityParser.RULE_dependencyPort); let _la: number; try { - this.state = 821; + this.state = 825; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REFLECTION: @@ -2920,84 +2920,96 @@ export class QuixosCapabilityParser extends antlr.Parser { } } - this.state = 787; + this.state = 789; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 13) { + { + this.state = 787; + this.match(QuixosCapabilityParser.FROM); + this.state = 788; + this.match(QuixosCapabilityParser.INPUT); + } + } + + this.state = 791; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CREATION: this.enterOuterAlt(localContext, 5); { - this.state = 789; - this.match(QuixosCapabilityParser.CREATION); - this.state = 790; - this.identifier(); - this.state = 791; - this.match(QuixosCapabilityParser.ID); - this.state = 792; - this.stringLiteral(); this.state = 793; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.CREATION); this.state = 794; this.identifier(); this.state = 795; - this.match(QuixosCapabilityParser.INPUT); + this.match(QuixosCapabilityParser.ID); this.state = 796; - this.valueType(); + this.stringLiteral(); this.state = 797; + this.match(QuixosCapabilityParser.COLON); + this.state = 798; + this.identifier(); + this.state = 799; + this.match(QuixosCapabilityParser.INPUT); + this.state = 800; + this.valueType(); + this.state = 801; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONSTRUCTOR: this.enterOuterAlt(localContext, 6); { - this.state = 799; - this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 800; - this.identifier(); - this.state = 801; - this.match(QuixosCapabilityParser.ID); - this.state = 802; - this.stringLiteral(); this.state = 803; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.CONSTRUCTOR); this.state = 804; this.identifier(); + this.state = 805; + this.match(QuixosCapabilityParser.ID); + this.state = 806; + this.stringLiteral(); this.state = 807; + this.match(QuixosCapabilityParser.COLON); + this.state = 808; + this.identifier(); + this.state = 811; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 48) { { - this.state = 805; + this.state = 809; this.match(QuixosCapabilityParser.INPUT); - this.state = 806; + this.state = 810; this.valueType(); } } - this.state = 809; + this.state = 813; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.QUERY: this.enterOuterAlt(localContext, 7); { - this.state = 811; - this.match(QuixosCapabilityParser.QUERY); - this.state = 812; - this.identifier(); - this.state = 813; - this.match(QuixosCapabilityParser.ID); - this.state = 814; - this.stringLiteral(); this.state = 815; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.QUERY); this.state = 816; this.identifier(); this.state = 817; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.ID); this.state = 818; - this.identifier(); + this.stringLiteral(); this.state = 819; + this.match(QuixosCapabilityParser.COLON); + this.state = 820; + this.identifier(); + this.state = 821; + this.match(QuixosCapabilityParser.DOT); + this.state = 822; + this.identifier(); + this.state = 823; this.match(QuixosCapabilityParser.SEMI); } break; @@ -3025,27 +3037,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 823; + this.state = 827; this.match(QuixosCapabilityParser.LBRACK); - this.state = 824; + this.state = 828; this.primitive(); - this.state = 829; + this.state = 833; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 129) { { { - this.state = 825; + this.state = 829; this.match(QuixosCapabilityParser.COMMA); - this.state = 826; + this.state = 830; this.primitive(); } } - this.state = 831; + this.state = 835; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 832; + this.state = 836; this.match(QuixosCapabilityParser.RBRACK); } } @@ -3069,7 +3081,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 834; + this.state = 838; _la = this.tokenStream.LA(1); if(!(_la === 1 || ((((_la - 90)) & ~0x1F) === 0 && ((1 << (_la - 90)) & 223) !== 0))) { this.errorHandler.recoverInline(this); @@ -3099,9 +3111,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 836; + this.state = 840; this.match(QuixosCapabilityParser.SHARED); - this.state = 837; + this.state = 841; this.attachmentDecl(); } } @@ -3122,20 +3134,20 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new AttachmentDeclContext(this.context, this.state); this.enterRule(localContext, 90, QuixosCapabilityParser.RULE_attachmentDecl); try { - this.state = 841; + this.state = 845; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 839; + this.state = 843; this.stateDecl(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 840; + this.state = 844; this.edgeDecl(); } break; @@ -3163,39 +3175,39 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 843; - this.match(QuixosCapabilityParser.STATE); - this.state = 844; - this.identifier(); - this.state = 845; - this.match(QuixosCapabilityParser.ID); - this.state = 846; - this.stringLiteral(); this.state = 847; - this.match(QuixosCapabilityParser.ON); + this.match(QuixosCapabilityParser.STATE); this.state = 848; this.identifier(); this.state = 849; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.ID); this.state = 850; - this.valueType(); + this.stringLiteral(); this.state = 851; - this.match(QuixosCapabilityParser.POLICY); + this.match(QuixosCapabilityParser.ON); this.state = 852; - this.storagePolicy(); + this.identifier(); + this.state = 853; + this.match(QuixosCapabilityParser.COLON); + this.state = 854; + this.valueType(); this.state = 855; + this.match(QuixosCapabilityParser.POLICY); + this.state = 856; + this.storagePolicy(); + this.state = 859; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 68) { { - this.state = 853; + this.state = 857; this.match(QuixosCapabilityParser.DEFAULT); - this.state = 854; + this.state = 858; this.jsonLiteral(); } } - this.state = 857; + this.state = 861; this.match(QuixosCapabilityParser.SEMI); } } @@ -3216,26 +3228,26 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new StoragePolicyContext(this.context, this.state); this.enterRule(localContext, 94, QuixosCapabilityParser.RULE_storagePolicy); try { - this.state = 865; + this.state = 869; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REGISTER: this.enterOuterAlt(localContext, 1); { - this.state = 859; + this.state = 863; this.match(QuixosCapabilityParser.REGISTER); } break; case QuixosCapabilityParser.CRDT: this.enterOuterAlt(localContext, 2); { - this.state = 860; + this.state = 864; this.match(QuixosCapabilityParser.CRDT); - this.state = 861; + this.state = 865; this.match(QuixosCapabilityParser.LPAREN); - this.state = 862; + this.state = 866; this.valueType(); - this.state = 863; + this.state = 867; this.match(QuixosCapabilityParser.RPAREN); } break; @@ -3262,21 +3274,21 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 867; - this.match(QuixosCapabilityParser.EDGE); - this.state = 868; - this.identifier(); - this.state = 869; - this.match(QuixosCapabilityParser.ID); - this.state = 870; - this.stringLiteral(); this.state = 871; - this.match(QuixosCapabilityParser.LBRACE); + this.match(QuixosCapabilityParser.EDGE); this.state = 872; - this.edgeEndpoint(); + this.identifier(); this.state = 873; - this.edgeEndpoint(); + this.match(QuixosCapabilityParser.ID); this.state = 874; + this.stringLiteral(); + this.state = 875; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 876; + this.edgeEndpoint(); + this.state = 877; + this.edgeEndpoint(); + this.state = 878; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3300,73 +3312,73 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 876; - this.targetConstraint(); - this.state = 877; - this.match(QuixosCapabilityParser.PROJECTION); - this.state = 878; - this.identifier(); - this.state = 879; - this.match(QuixosCapabilityParser.ID); this.state = 880; - this.stringLiteral(); + this.targetConstraint(); this.state = 881; - this.cardinality(); + this.match(QuixosCapabilityParser.PROJECTION); + this.state = 882; + this.identifier(); this.state = 883; + this.match(QuixosCapabilityParser.ID); + this.state = 884; + this.stringLiteral(); + this.state = 885; + this.cardinality(); + this.state = 887; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 106) { { - this.state = 882; + this.state = 886; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 887; + this.state = 891; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 74) { - { - this.state = 885; - this.match(QuixosCapabilityParser.ON_DELETE); - this.state = 886; - this.stringLiteral(); - } - } - - this.state = 890; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 75) { { this.state = 889; - this.match(QuixosCapabilityParser.RETAIN_OTHER); + this.match(QuixosCapabilityParser.ON_DELETE); + this.state = 890; + this.stringLiteral(); } } this.state = 894; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); + if (_la === 75) { + { + this.state = 893; + this.match(QuixosCapabilityParser.RETAIN_OTHER); + } + } + + this.state = 898; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); if (_la === 76) { { - this.state = 892; + this.state = 896; this.match(QuixosCapabilityParser.KEYED); - this.state = 893; + this.state = 897; this.stringLiteral(); } } - this.state = 897; + this.state = 901; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 77) { { - this.state = 896; + this.state = 900; this.match(QuixosCapabilityParser.PUBLIC_TRAVERSAL); } } - this.state = 899; + this.state = 903; this.match(QuixosCapabilityParser.SEMI); } } @@ -3390,65 +3402,65 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 901; + this.state = 905; this.match(QuixosCapabilityParser.CONFORM); - this.state = 902; - this.identifier(); - this.state = 903; - this.match(QuixosCapabilityParser.AS); - this.state = 904; - this.identifier(); this.state = 906; + this.identifier(); + this.state = 907; + this.match(QuixosCapabilityParser.AS); + this.state = 908; + this.identifier(); + this.state = 910; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 137) { { - this.state = 905; - this.typeArguments(); - } - } - - this.state = 910; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 78) { - { - this.state = 908; - this.match(QuixosCapabilityParser.ID); this.state = 909; - this.stringLiteral(); + this.typeArguments(); } } this.state = 914; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 73) { + if (_la === 78) { { this.state = 912; - this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); + this.match(QuixosCapabilityParser.ID); this.state = 913; + this.stringLiteral(); + } + } + + this.state = 918; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 73) { + { + this.state = 916; + this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); + this.state = 917; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 916; - this.match(QuixosCapabilityParser.LBRACE); this.state = 920; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 924; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 3 || ((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & 4105) !== 0)) { { { - this.state = 917; + this.state = 921; this.conformanceItem(); } } - this.state = 922; + this.state = 926; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 923; + this.state = 927; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3469,43 +3481,43 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ConformanceItemContext(this.context, this.state); this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_conformanceItem); try { - this.state = 931; + this.state = 935; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 84, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 85, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 925; + this.state = 929; this.match(QuixosCapabilityParser.PRIVATE); - this.state = 926; + this.state = 930; this.attachmentDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 927; + this.state = 931; this.operationBindingDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 928; + this.state = 932; this.stateFieldBindingDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 929; + this.state = 933; this.initializationDecl(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 930; + this.state = 934; this.relationshipMaterializationDecl(); } break; @@ -3531,27 +3543,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 933; + this.state = 937; this.match(QuixosCapabilityParser.INITIALIZE); - this.state = 934; - this.match(QuixosCapabilityParser.LBRACE); this.state = 938; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 942; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 4099) !== 0) || _la === 143) { { { - this.state = 935; + this.state = 939; this.initializationField(); } } - this.state = 940; + this.state = 944; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 941; + this.state = 945; this.match(QuixosCapabilityParser.RBRACE); - this.state = 942; + this.state = 946; this.match(QuixosCapabilityParser.SEMI); } } @@ -3572,40 +3584,40 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new InitializationFieldContext(this.context, this.state); this.enterRule(localContext, 106, QuixosCapabilityParser.RULE_initializationField); try { - this.state = 958; + this.state = 962; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 86, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 87, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 944; - this.identifier(); - this.state = 945; - this.match(QuixosCapabilityParser.TO); - this.state = 946; - this.match(QuixosCapabilityParser.STATE); - this.state = 947; - this.identifier(); this.state = 948; + this.identifier(); + this.state = 949; + this.match(QuixosCapabilityParser.TO); + this.state = 950; + this.match(QuixosCapabilityParser.STATE); + this.state = 951; + this.identifier(); + this.state = 952; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 950; - this.identifier(); - this.state = 951; - this.match(QuixosCapabilityParser.TO); - this.state = 952; - this.match(QuixosCapabilityParser.EDGE); - this.state = 953; - this.identifier(); this.state = 954; - this.match(QuixosCapabilityParser.DOT); - this.state = 955; this.identifier(); + this.state = 955; + this.match(QuixosCapabilityParser.TO); this.state = 956; + this.match(QuixosCapabilityParser.EDGE); + this.state = 957; + this.identifier(); + this.state = 958; + this.match(QuixosCapabilityParser.DOT); + this.state = 959; + this.identifier(); + this.state = 960; this.match(QuixosCapabilityParser.SEMI); } break; @@ -3631,29 +3643,29 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 960; + this.state = 964; this.interfaceType(); - this.state = 961; + this.state = 965; this.match(QuixosCapabilityParser.FROM); - this.state = 962; + this.state = 966; this.match(QuixosCapabilityParser.INPUT); - this.state = 967; + this.state = 971; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 130) { { { - this.state = 963; + this.state = 967; this.match(QuixosCapabilityParser.DOT); - this.state = 964; + this.state = 968; this.identifier(); } } - this.state = 969; + this.state = 973; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 970; + this.state = 974; this.match(QuixosCapabilityParser.SEMI); } } @@ -3676,17 +3688,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 972; - this.match(QuixosCapabilityParser.BIND); - this.state = 973; - this.identifier(); - this.state = 974; - this.match(QuixosCapabilityParser.TO); - this.state = 975; - this.match(QuixosCapabilityParser.STATE); this.state = 976; - this.identifier(); + this.match(QuixosCapabilityParser.BIND); this.state = 977; + this.identifier(); + this.state = 978; + this.match(QuixosCapabilityParser.TO); + this.state = 979; + this.match(QuixosCapabilityParser.STATE); + this.state = 980; + this.identifier(); + this.state = 981; this.match(QuixosCapabilityParser.SEMI); } } @@ -3709,31 +3721,31 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 979; - this.match(QuixosCapabilityParser.MATERIALIZE); - this.state = 980; - this.identifier(); - this.state = 981; - this.match(QuixosCapabilityParser.IF); - this.state = 982; - this.match(QuixosCapabilityParser.ABSENT); this.state = 983; - this.match(QuixosCapabilityParser.USING); + this.match(QuixosCapabilityParser.MATERIALIZE); this.state = 984; - this.match(QuixosCapabilityParser.CONSTRUCTOR); + this.identifier(); this.state = 985; - this.identifier(); + this.match(QuixosCapabilityParser.IF); this.state = 986; - this.match(QuixosCapabilityParser.VIA); + this.match(QuixosCapabilityParser.ABSENT); this.state = 987; - this.match(QuixosCapabilityParser.EDGE); + this.match(QuixosCapabilityParser.USING); this.state = 988; - this.identifier(); + this.match(QuixosCapabilityParser.CONSTRUCTOR); this.state = 989; - this.match(QuixosCapabilityParser.DOT); - this.state = 990; this.identifier(); + this.state = 990; + this.match(QuixosCapabilityParser.VIA); this.state = 991; + this.match(QuixosCapabilityParser.EDGE); + this.state = 992; + this.identifier(); + this.state = 993; + this.match(QuixosCapabilityParser.DOT); + this.state = 994; + this.identifier(); + this.state = 995; this.match(QuixosCapabilityParser.SEMI); } } @@ -3757,27 +3769,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 993; + this.state = 997; this.match(QuixosCapabilityParser.BIND); - this.state = 994; + this.state = 998; this.memberOperationRef(); - this.state = 995; - this.match(QuixosCapabilityParser.TO); - this.state = 996; - this.operationProvider(); this.state = 999; + this.match(QuixosCapabilityParser.TO); + this.state = 1000; + this.operationProvider(); + this.state = 1003; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 29) { { - this.state = 997; + this.state = 1001; this.match(QuixosCapabilityParser.QUERY_REASON); - this.state = 998; + this.state = 1002; this.stringLiteral(); } } - this.state = 1001; + this.state = 1005; this.match(QuixosCapabilityParser.SEMI); } } @@ -3800,11 +3812,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1003; + this.state = 1007; this.identifier(); - this.state = 1004; + this.state = 1008; this.match(QuixosCapabilityParser.DOT); - this.state = 1005; + this.state = 1009; this.operationName(); } } @@ -3825,90 +3837,90 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new OperationNameContext(this.context, this.state); this.enterRule(localContext, 118, QuixosCapabilityParser.RULE_operationName); try { - this.state = 1019; + this.state = 1023; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 89, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 90, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1007; + this.state = 1011; this.identifier(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1008; + this.state = 1012; this.match(QuixosCapabilityParser.CALL); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1009; + this.state = 1013; this.match(QuixosCapabilityParser.GET); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1010; + this.state = 1014; this.match(QuixosCapabilityParser.SET); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1011; + this.state = 1015; this.match(QuixosCapabilityParser.EDIT); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1012; + this.state = 1016; this.match(QuixosCapabilityParser.RESOLVE); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 1013; + this.state = 1017; this.match(QuixosCapabilityParser.CONNECT); } break; case 8: this.enterOuterAlt(localContext, 8); { - this.state = 1014; + this.state = 1018; this.match(QuixosCapabilityParser.DISCONNECT); } break; case 9: this.enterOuterAlt(localContext, 9); { - this.state = 1015; + this.state = 1019; this.match(QuixosCapabilityParser.WATCH_START); } break; case 10: this.enterOuterAlt(localContext, 10); { - this.state = 1016; + this.state = 1020; this.match(QuixosCapabilityParser.WATCH_STOP); } break; case 11: this.enterOuterAlt(localContext, 11); { - this.state = 1017; + this.state = 1021; this.match(QuixosCapabilityParser.SUBSCRIBE); } break; case 12: this.enterOuterAlt(localContext, 12); { - this.state = 1018; + this.state = 1022; this.match(QuixosCapabilityParser.UNSUBSCRIBE); } break; @@ -3932,99 +3944,99 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 120, QuixosCapabilityParser.RULE_operationProvider); let _la: number; try { - this.state = 1054; + this.state = 1058; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 1021; + this.state = 1025; this.match(QuixosCapabilityParser.STATE); - this.state = 1022; + this.state = 1026; this.identifier(); - this.state = 1023; + this.state = 1027; this.match(QuixosCapabilityParser.DOT); - this.state = 1024; + this.state = 1028; this.statePrimitive(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 1026; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1027; - this.identifier(); - this.state = 1028; - this.match(QuixosCapabilityParser.DOT); - this.state = 1029; - this.identifier(); this.state = 1030; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.EDGE); this.state = 1031; + this.identifier(); + this.state = 1032; + this.match(QuixosCapabilityParser.DOT); + this.state = 1033; + this.identifier(); + this.state = 1034; + this.match(QuixosCapabilityParser.DOT); + this.state = 1035; this.edgePrimitive(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 3); { - this.state = 1033; + this.state = 1037; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 1034; + this.state = 1038; this.identifier(); - this.state = 1036; + this.state = 1040; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 137) { { - this.state = 1035; + this.state = 1039; this.typeArguments(); } } - this.state = 1038; + this.state = 1042; this.match(QuixosCapabilityParser.DOT); - this.state = 1039; + this.state = 1043; this.memberOperationRef(); } break; case QuixosCapabilityParser.PACKAGE: this.enterOuterAlt(localContext, 4); { - this.state = 1041; + this.state = 1045; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 1042; - this.identifier(); - this.state = 1043; - this.match(QuixosCapabilityParser.DOT); - this.state = 1044; - this.identifier(); this.state = 1046; + this.identifier(); + this.state = 1047; + this.match(QuixosCapabilityParser.DOT); + this.state = 1048; + this.identifier(); + this.state = 1050; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 137) { { - this.state = 1045; + this.state = 1049; this.typeArguments(); } } - this.state = 1049; + this.state = 1053; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 59) { { - this.state = 1048; + this.state = 1052; this.dependencyBindingBlock(); } } - this.state = 1052; + this.state = 1056; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 61) { { - this.state = 1051; + this.state = 1055; this.acceptanceBinding(); } } @@ -4054,9 +4066,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1056; + this.state = 1060; this.match(QuixosCapabilityParser.ACCEPT); - this.state = 1057; + this.state = 1061; this.dependencyBindingBlock(); } } @@ -4080,7 +4092,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1059; + this.state = 1063; _la = this.tokenStream.LA(1); if(!(_la === 1 || ((((_la - 90)) & ~0x1F) === 0 && ((1 << (_la - 90)) & 195) !== 0))) { this.errorHandler.recoverInline(this); @@ -4111,7 +4123,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1061; + this.state = 1065; _la = this.tokenStream.LA(1); if(!(((((_la - 92)) & ~0x1F) === 0 && ((1 << (_la - 92)) & 55) !== 0))) { this.errorHandler.recoverInline(this); @@ -4142,25 +4154,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1063; + this.state = 1067; this.match(QuixosCapabilityParser.WITH); - this.state = 1064; - this.match(QuixosCapabilityParser.LBRACE); this.state = 1068; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 1072; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 4099) !== 0) || _la === 143) { { { - this.state = 1065; + this.state = 1069; this.dependencyBinding(); } } - this.state = 1070; + this.state = 1074; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1071; + this.state = 1075; this.match(QuixosCapabilityParser.RBRACE); } } @@ -4182,237 +4194,253 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 130, QuixosCapabilityParser.RULE_dependencyBinding); let _la: number; try { - this.state = 1169; + this.state = 1175; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 103, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 104, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1073; - this.identifier(); - this.state = 1074; - this.match(QuixosCapabilityParser.TO); - this.state = 1075; - this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 1076; - this.match(QuixosCapabilityParser.REFLECTION); this.state = 1077; - this.match(QuixosCapabilityParser.LBRACK); + this.identifier(); this.state = 1078; - this.identifierList(); + this.match(QuixosCapabilityParser.TO); this.state = 1079; - this.match(QuixosCapabilityParser.RBRACK); + this.match(QuixosCapabilityParser.WORKSPACE); this.state = 1080; + this.match(QuixosCapabilityParser.REFLECTION); + this.state = 1081; + this.match(QuixosCapabilityParser.LBRACK); + this.state = 1082; + this.identifierList(); + this.state = 1083; + this.match(QuixosCapabilityParser.RBRACK); + this.state = 1084; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1082; + this.state = 1086; this.identifier(); - this.state = 1083; + this.state = 1087; this.match(QuixosCapabilityParser.TO); - this.state = 1084; + this.state = 1088; this.match(QuixosCapabilityParser.STATE); - this.state = 1085; + this.state = 1089; this.identifier(); - this.state = 1092; + this.state = 1096; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 62) { { - this.state = 1086; - this.match(QuixosCapabilityParser.VIA); - this.state = 1087; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1088; - this.identifier(); - this.state = 1089; - this.match(QuixosCapabilityParser.DOT); this.state = 1090; + this.match(QuixosCapabilityParser.VIA); + this.state = 1091; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1092; + this.identifier(); + this.state = 1093; + this.match(QuixosCapabilityParser.DOT); + this.state = 1094; this.identifier(); } } - this.state = 1094; + this.state = 1098; this.match(QuixosCapabilityParser.SEMI); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1096; - this.identifier(); - this.state = 1097; - this.match(QuixosCapabilityParser.TO); - this.state = 1098; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1099; - this.identifier(); this.state = 1100; - this.match(QuixosCapabilityParser.DOT); - this.state = 1101; this.identifier(); - this.state = 1108; + this.state = 1101; + this.match(QuixosCapabilityParser.TO); + this.state = 1102; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1103; + this.identifier(); + this.state = 1104; + this.match(QuixosCapabilityParser.DOT); + this.state = 1105; + this.identifier(); + this.state = 1112; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 62) { { - this.state = 1102; - this.match(QuixosCapabilityParser.VIA); - this.state = 1103; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1104; - this.identifier(); - this.state = 1105; - this.match(QuixosCapabilityParser.DOT); this.state = 1106; + this.match(QuixosCapabilityParser.VIA); + this.state = 1107; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1108; + this.identifier(); + this.state = 1109; + this.match(QuixosCapabilityParser.DOT); + this.state = 1110; this.identifier(); } } - this.state = 1110; + this.state = 1114; this.match(QuixosCapabilityParser.SEMI); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1112; - this.identifier(); - this.state = 1113; - this.match(QuixosCapabilityParser.TO); - this.state = 1114; - this.match(QuixosCapabilityParser.INTERFACE); - this.state = 1115; + this.state = 1116; this.identifier(); this.state = 1117; + this.match(QuixosCapabilityParser.TO); + this.state = 1118; + this.match(QuixosCapabilityParser.INTERFACE); + this.state = 1119; + this.identifier(); + this.state = 1121; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 137) { { - this.state = 1116; + this.state = 1120; this.typeArguments(); } } - this.state = 1125; + this.state = 1131; this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 62) { + switch (this.tokenStream.LA(1)) { + case QuixosCapabilityParser.VIA: + { { - this.state = 1119; - this.match(QuixosCapabilityParser.VIA); - this.state = 1120; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1121; - this.identifier(); - this.state = 1122; - this.match(QuixosCapabilityParser.DOT); this.state = 1123; + this.match(QuixosCapabilityParser.VIA); + this.state = 1124; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1125; + this.identifier(); + this.state = 1126; + this.match(QuixosCapabilityParser.DOT); + this.state = 1127; this.identifier(); } + } + break; + case QuixosCapabilityParser.FROM: + { + { + this.state = 1129; + this.match(QuixosCapabilityParser.FROM); + this.state = 1130; + this.match(QuixosCapabilityParser.INPUT); + } + } + break; + case QuixosCapabilityParser.SEMI: + break; + default: + break; } - - this.state = 1127; + this.state = 1133; this.match(QuixosCapabilityParser.SEMI); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1129; + this.state = 1135; this.identifier(); - this.state = 1130; + this.state = 1136; this.match(QuixosCapabilityParser.TO); - this.state = 1131; + this.state = 1137; this.match(QuixosCapabilityParser.CREATION); - this.state = 1132; - this.identifier(); - this.state = 1133; - this.match(QuixosCapabilityParser.WITH); - this.state = 1134; - this.match(QuixosCapabilityParser.LBRACE); this.state = 1138; + this.identifier(); + this.state = 1139; + this.match(QuixosCapabilityParser.WITH); + this.state = 1140; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 1144; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 4099) !== 0) || _la === 143) { { { - this.state = 1135; + this.state = 1141; this.creationOwnerMapping(); } } - this.state = 1140; + this.state = 1146; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1141; + this.state = 1147; this.match(QuixosCapabilityParser.RBRACE); - this.state = 1142; + this.state = 1148; this.match(QuixosCapabilityParser.SEMI); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1144; + this.state = 1150; this.identifier(); - this.state = 1145; + this.state = 1151; this.match(QuixosCapabilityParser.TO); - this.state = 1146; + this.state = 1152; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1147; + this.state = 1153; this.identifier(); - this.state = 1148; + this.state = 1154; this.match(QuixosCapabilityParser.SEMI); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 1150; + this.state = 1156; this.identifier(); - this.state = 1151; + this.state = 1157; this.match(QuixosCapabilityParser.TO); - this.state = 1153; + this.state = 1159; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 4) { { - this.state = 1152; + this.state = 1158; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 1155; + this.state = 1161; this.match(QuixosCapabilityParser.QUERY); - this.state = 1156; + this.state = 1162; this.identifier(); - this.state = 1157; + this.state = 1163; this.match(QuixosCapabilityParser.DOT); - this.state = 1158; + this.state = 1164; this.identifier(); - this.state = 1165; + this.state = 1171; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 62) { { - this.state = 1159; + this.state = 1165; this.match(QuixosCapabilityParser.VIA); - this.state = 1160; + this.state = 1166; this.match(QuixosCapabilityParser.EDGE); - this.state = 1161; + this.state = 1167; this.identifier(); - this.state = 1162; + this.state = 1168; this.match(QuixosCapabilityParser.DOT); - this.state = 1163; + this.state = 1169; this.identifier(); } } - this.state = 1167; + this.state = 1173; this.match(QuixosCapabilityParser.SEMI); } break; @@ -4438,29 +4466,29 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1171; + this.state = 1177; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1172; - this.identifier(); - this.state = 1173; - this.match(QuixosCapabilityParser.TO); - this.state = 1174; - this.identifier(); - this.state = 1175; - this.match(QuixosCapabilityParser.DOT); - this.state = 1176; - this.identifier(); this.state = 1178; + this.identifier(); + this.state = 1179; + this.match(QuixosCapabilityParser.TO); + this.state = 1180; + this.identifier(); + this.state = 1181; + this.match(QuixosCapabilityParser.DOT); + this.state = 1182; + this.identifier(); + this.state = 1184; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 59) { { - this.state = 1177; + this.state = 1183; this.dependencyBindingBlock(); } } - this.state = 1180; + this.state = 1186; this.match(QuixosCapabilityParser.SEMI); } } @@ -4482,7 +4510,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 134, QuixosCapabilityParser.RULE_valueType); let _la: number; try { - this.state = 1228; + this.state = 1234; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.BOOL: @@ -4495,130 +4523,130 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.UINT64: this.enterOuterAlt(localContext, 1); { - this.state = 1182; + this.state = 1188; this.scalarType(); } break; case QuixosCapabilityParser.UNIT: this.enterOuterAlt(localContext, 2); { - this.state = 1183; + this.state = 1189; this.match(QuixosCapabilityParser.UNIT); } break; case QuixosCapabilityParser.WATCH_HANDLE: this.enterOuterAlt(localContext, 3); { - this.state = 1184; + this.state = 1190; this.match(QuixosCapabilityParser.WATCH_HANDLE); } break; case QuixosCapabilityParser.MESSAGE: this.enterOuterAlt(localContext, 4); { - this.state = 1185; + this.state = 1191; this.match(QuixosCapabilityParser.MESSAGE); - this.state = 1186; + this.state = 1192; this.stringLiteral(); } break; case QuixosCapabilityParser.ATOM_REF: this.enterOuterAlt(localContext, 5); { - this.state = 1187; + this.state = 1193; this.match(QuixosCapabilityParser.ATOM_REF); - this.state = 1188; + this.state = 1194; this.match(QuixosCapabilityParser.LT); - this.state = 1189; + this.state = 1195; this.identifier(); - this.state = 1190; + this.state = 1196; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.INTERFACE_REF: this.enterOuterAlt(localContext, 6); { - this.state = 1192; + this.state = 1198; this.match(QuixosCapabilityParser.INTERFACE_REF); - this.state = 1193; + this.state = 1199; this.match(QuixosCapabilityParser.LT); - this.state = 1194; + this.state = 1200; this.identifier(); - this.state = 1196; + this.state = 1202; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 137) { { - this.state = 1195; + this.state = 1201; this.typeArguments(); } } - this.state = 1198; + this.state = 1204; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.REF: this.enterOuterAlt(localContext, 7); { - this.state = 1200; + this.state = 1206; this.match(QuixosCapabilityParser.REF); - this.state = 1201; + this.state = 1207; this.match(QuixosCapabilityParser.LT); - this.state = 1202; + this.state = 1208; this.identifier(); - this.state = 1203; + this.state = 1209; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.OPTIONAL: this.enterOuterAlt(localContext, 8); { - this.state = 1205; + this.state = 1211; this.match(QuixosCapabilityParser.OPTIONAL); - this.state = 1206; + this.state = 1212; this.match(QuixosCapabilityParser.LT); - this.state = 1207; + this.state = 1213; this.valueType(); - this.state = 1208; + this.state = 1214; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.LIST: this.enterOuterAlt(localContext, 9); { - this.state = 1210; + this.state = 1216; this.match(QuixosCapabilityParser.LIST); - this.state = 1211; + this.state = 1217; this.match(QuixosCapabilityParser.LT); - this.state = 1212; + this.state = 1218; this.valueType(); - this.state = 1213; + this.state = 1219; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.RECORD: this.enterOuterAlt(localContext, 10); { - this.state = 1215; + this.state = 1221; this.match(QuixosCapabilityParser.RECORD); - this.state = 1216; + this.state = 1222; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1220; + this.state = 1226; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 4099) !== 0) || _la === 143) { { { - this.state = 1217; + this.state = 1223; this.recordField(); } } - this.state = 1222; + this.state = 1228; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1223; + this.state = 1229; this.match(QuixosCapabilityParser.RBRACE); } break; @@ -4657,14 +4685,14 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 11); { - this.state = 1224; + this.state = 1230; this.identifier(); - this.state = 1226; + this.state = 1232; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 137) { { - this.state = 1225; + this.state = 1231; this.typeArguments(); } } @@ -4694,13 +4722,13 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1230; + this.state = 1236; this.identifier(); - this.state = 1231; + this.state = 1237; this.match(QuixosCapabilityParser.COLON); - this.state = 1232; + this.state = 1238; this.valueType(); - this.state = 1233; + this.state = 1239; this.match(QuixosCapabilityParser.SEMI); } } @@ -4724,7 +4752,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1235; + this.state = 1241; _la = this.tokenStream.LA(1); if(!(((((_la - 115)) & ~0x1F) === 0 && ((1 << (_la - 115)) & 255) !== 0))) { this.errorHandler.recoverInline(this); @@ -4755,7 +4783,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1237; + this.state = 1243; _la = this.tokenStream.LA(1); if(!(((((_la - 102)) & ~0x1F) === 0 && ((1 << (_la - 102)) & 15) !== 0))) { this.errorHandler.recoverInline(this); @@ -4783,62 +4811,62 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new JsonLiteralContext(this.context, this.state); this.enterRule(localContext, 142, QuixosCapabilityParser.RULE_jsonLiteral); try { - this.state = 1247; + this.state = 1253; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STRING_LITERAL: this.enterOuterAlt(localContext, 1); { - this.state = 1239; + this.state = 1245; this.stringLiteral(); } break; case QuixosCapabilityParser.INTEGER: this.enterOuterAlt(localContext, 2); { - this.state = 1240; + this.state = 1246; this.match(QuixosCapabilityParser.INTEGER); } break; case QuixosCapabilityParser.JSON_NUMBER: this.enterOuterAlt(localContext, 3); { - this.state = 1241; + this.state = 1247; this.match(QuixosCapabilityParser.JSON_NUMBER); } break; case QuixosCapabilityParser.TRUE: this.enterOuterAlt(localContext, 4); { - this.state = 1242; + this.state = 1248; this.match(QuixosCapabilityParser.TRUE); } break; case QuixosCapabilityParser.FALSE: this.enterOuterAlt(localContext, 5); { - this.state = 1243; + this.state = 1249; this.match(QuixosCapabilityParser.FALSE); } break; case QuixosCapabilityParser.NULL: this.enterOuterAlt(localContext, 6); { - this.state = 1244; + this.state = 1250; this.match(QuixosCapabilityParser.NULL); } break; case QuixosCapabilityParser.LBRACE: this.enterOuterAlt(localContext, 7); { - this.state = 1245; + this.state = 1251; this.jsonObject(); } break; case QuixosCapabilityParser.LBRACK: this.enterOuterAlt(localContext, 8); { - this.state = 1246; + this.state = 1252; this.jsonArray(); } break; @@ -4866,35 +4894,35 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1249; + this.state = 1255; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1258; + this.state = 1264; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 144) { { - this.state = 1250; + this.state = 1256; this.jsonMember(); - this.state = 1255; + this.state = 1261; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 129) { { { - this.state = 1251; + this.state = 1257; this.match(QuixosCapabilityParser.COMMA); - this.state = 1252; + this.state = 1258; this.jsonMember(); } } - this.state = 1257; + this.state = 1263; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1260; + this.state = 1266; this.match(QuixosCapabilityParser.RBRACE); } } @@ -4917,11 +4945,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1262; + this.state = 1268; this.stringLiteral(); - this.state = 1263; + this.state = 1269; this.match(QuixosCapabilityParser.COLON); - this.state = 1264; + this.state = 1270; this.jsonLiteral(); } } @@ -4945,35 +4973,35 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1266; + this.state = 1272; this.match(QuixosCapabilityParser.LBRACK); - this.state = 1275; + this.state = 1281; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (((((_la - 123)) & ~0x1F) === 0 && ((1 << (_la - 123)) & 2884871) !== 0)) { { - this.state = 1267; + this.state = 1273; this.jsonLiteral(); - this.state = 1272; + this.state = 1278; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 129) { { { - this.state = 1268; + this.state = 1274; this.match(QuixosCapabilityParser.COMMA); - this.state = 1269; + this.state = 1275; this.jsonLiteral(); } } - this.state = 1274; + this.state = 1280; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1277; + this.state = 1283; this.match(QuixosCapabilityParser.RBRACK); } } @@ -4997,7 +5025,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1279; + this.state = 1285; _la = this.tokenStream.LA(1); if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 4099) !== 0) || _la === 143)) { this.errorHandler.recoverInline(this); @@ -5027,7 +5055,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1281; + this.state = 1287; this.match(QuixosCapabilityParser.STRING_LITERAL); } } @@ -5046,7 +5074,7 @@ export class QuixosCapabilityParser extends antlr.Parser { } public static readonly _serializedATN: number[] = [ - 4,1,147,1284,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,147,1290,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, @@ -5111,434 +5139,437 @@ export class QuixosCapabilityParser extends antlr.Parser { 41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1, 41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1, 41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,3,41,783,8,41,1,41,3,41,786, - 8,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41, - 1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,3,41,808,8,41,1,41,1,41, - 1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,3,41,822,8,41, - 1,42,1,42,1,42,1,42,5,42,828,8,42,10,42,12,42,831,9,42,1,42,1,42, - 1,43,1,43,1,44,1,44,1,44,1,45,1,45,3,45,842,8,45,1,46,1,46,1,46, - 1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,3,46,856,8,46,1,46, - 1,46,1,47,1,47,1,47,1,47,1,47,1,47,3,47,866,8,47,1,48,1,48,1,48, - 1,48,1,48,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,49,1,49, - 3,49,884,8,49,1,49,1,49,3,49,888,8,49,1,49,3,49,891,8,49,1,49,1, - 49,3,49,895,8,49,1,49,3,49,898,8,49,1,49,1,49,1,50,1,50,1,50,1,50, - 1,50,3,50,907,8,50,1,50,1,50,3,50,911,8,50,1,50,1,50,3,50,915,8, - 50,1,50,1,50,5,50,919,8,50,10,50,12,50,922,9,50,1,50,1,50,1,51,1, - 51,1,51,1,51,1,51,1,51,3,51,932,8,51,1,52,1,52,1,52,5,52,937,8,52, - 10,52,12,52,940,9,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,53, - 1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,3,53,959,8,53,1,54,1,54, - 1,54,1,54,1,54,5,54,966,8,54,10,54,12,54,969,9,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,56, - 1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,57,1,57,1,57, - 3,57,1000,8,57,1,57,1,57,1,58,1,58,1,58,1,58,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,1020,8,59,1,60,1,60, - 1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60, - 3,60,1037,8,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,3,60,1047, - 8,60,1,60,3,60,1050,8,60,1,60,3,60,1053,8,60,3,60,1055,8,60,1,61, - 1,61,1,61,1,62,1,62,1,63,1,63,1,64,1,64,1,64,5,64,1067,8,64,10,64, - 12,64,1070,9,64,1,64,1,64,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65, - 1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65,1093, - 8,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65, - 1,65,1,65,3,65,1109,8,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65, - 1118,8,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65,1126,8,65,1,65,1,65, - 1,65,1,65,1,65,1,65,1,65,1,65,1,65,5,65,1137,8,65,10,65,12,65,1140, - 9,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65, - 3,65,1154,8,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65, - 3,65,1166,8,65,1,65,1,65,3,65,1170,8,65,1,66,1,66,1,66,1,66,1,66, - 1,66,1,66,3,66,1179,8,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,67,1,67,1,67,1,67,3,67,1197,8,67,1,67,1,67, + 8,41,1,41,1,41,3,41,790,8,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41, + 1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41, + 3,41,812,8,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41, + 1,41,1,41,3,41,826,8,41,1,42,1,42,1,42,1,42,5,42,832,8,42,10,42, + 12,42,835,9,42,1,42,1,42,1,43,1,43,1,44,1,44,1,44,1,45,1,45,3,45, + 846,8,45,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46, + 1,46,3,46,860,8,46,1,46,1,46,1,47,1,47,1,47,1,47,1,47,1,47,3,47, + 870,8,47,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,49,1,49, + 1,49,1,49,1,49,1,49,1,49,3,49,888,8,49,1,49,1,49,3,49,892,8,49,1, + 49,3,49,895,8,49,1,49,1,49,3,49,899,8,49,1,49,3,49,902,8,49,1,49, + 1,49,1,50,1,50,1,50,1,50,1,50,3,50,911,8,50,1,50,1,50,3,50,915,8, + 50,1,50,1,50,3,50,919,8,50,1,50,1,50,5,50,923,8,50,10,50,12,50,926, + 9,50,1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,51,3,51,936,8,51,1,52, + 1,52,1,52,5,52,941,8,52,10,52,12,52,944,9,52,1,52,1,52,1,52,1,53, + 1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53, + 3,53,963,8,53,1,54,1,54,1,54,1,54,1,54,5,54,970,8,54,10,54,12,54, + 973,9,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,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,57, + 1,57,1,57,1,57,1,57,1,57,3,57,1004,8,57,1,57,1,57,1,58,1,58,1,58, + 1,58,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,1024,8,59,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60, + 1,60,1,60,1,60,1,60,1,60,3,60,1041,8,60,1,60,1,60,1,60,1,60,1,60, + 1,60,1,60,1,60,3,60,1051,8,60,1,60,3,60,1054,8,60,1,60,3,60,1057, + 8,60,3,60,1059,8,60,1,61,1,61,1,61,1,62,1,62,1,63,1,63,1,64,1,64, + 1,64,5,64,1071,8,64,10,64,12,64,1074,9,64,1,64,1,64,1,65,1,65,1, + 65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1, + 65,1,65,1,65,1,65,3,65,1097,8,65,1,65,1,65,1,65,1,65,1,65,1,65,1, + 65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65,1113,8,65,1,65,1,65,1, + 65,1,65,1,65,1,65,1,65,3,65,1122,8,65,1,65,1,65,1,65,1,65,1,65,1, + 65,1,65,1,65,3,65,1132,8,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1, + 65,1,65,5,65,1143,8,65,10,65,12,65,1146,9,65,1,65,1,65,1,65,1,65, + 1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65,1160,8,65,1,65,1,65, + 1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65,1172,8,65,1,65,1,65, + 3,65,1176,8,65,1,66,1,66,1,66,1,66,1,66,1,66,1,66,3,66,1185,8,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,67, + 1,67,1,67,1,67,3,67,1203,8,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67, 1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67, - 1,67,1,67,1,67,1,67,1,67,5,67,1219,8,67,10,67,12,67,1222,9,67,1, - 67,1,67,1,67,3,67,1227,8,67,3,67,1229,8,67,1,68,1,68,1,68,1,68,1, - 68,1,69,1,69,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,3, - 71,1248,8,71,1,72,1,72,1,72,1,72,5,72,1254,8,72,10,72,12,72,1257, - 9,72,3,72,1259,8,72,1,72,1,72,1,73,1,73,1,73,1,73,1,74,1,74,1,74, - 1,74,5,74,1271,8,74,10,74,12,74,1274,9,74,3,74,1276,8,74,1,74,1, - 74,1,75,1,75,1,76,1,76,1,76,0,0,77,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,0,9,2,0,10,10,28,28,1,0,6,7,1,0,95,99, - 3,0,1,1,90,94,96,97,3,0,1,1,90,91,96,97,2,0,92,94,96,97,1,0,115, - 122,1,0,102,105,7,0,1,3,5,28,40,40,69,69,88,89,100,100,143,143,1388, - 0,166,1,0,0,0,2,168,1,0,0,0,4,178,1,0,0,0,6,182,1,0,0,0,8,206,1, - 0,0,0,10,218,1,0,0,0,12,220,1,0,0,0,14,227,1,0,0,0,16,238,1,0,0, - 0,18,240,1,0,0,0,20,253,1,0,0,0,22,285,1,0,0,0,24,315,1,0,0,0,26, - 317,1,0,0,0,28,321,1,0,0,0,30,339,1,0,0,0,32,341,1,0,0,0,34,353, - 1,0,0,0,36,356,1,0,0,0,38,377,1,0,0,0,40,427,1,0,0,0,42,430,1,0, - 0,0,44,455,1,0,0,0,46,492,1,0,0,0,48,503,1,0,0,0,50,508,1,0,0,0, - 52,535,1,0,0,0,54,537,1,0,0,0,56,562,1,0,0,0,58,611,1,0,0,0,60,613, - 1,0,0,0,62,642,1,0,0,0,64,664,1,0,0,0,66,677,1,0,0,0,68,679,1,0, - 0,0,70,691,1,0,0,0,72,704,1,0,0,0,74,707,1,0,0,0,76,727,1,0,0,0, - 78,729,1,0,0,0,80,737,1,0,0,0,82,821,1,0,0,0,84,823,1,0,0,0,86,834, - 1,0,0,0,88,836,1,0,0,0,90,841,1,0,0,0,92,843,1,0,0,0,94,865,1,0, - 0,0,96,867,1,0,0,0,98,876,1,0,0,0,100,901,1,0,0,0,102,931,1,0,0, - 0,104,933,1,0,0,0,106,958,1,0,0,0,108,960,1,0,0,0,110,972,1,0,0, - 0,112,979,1,0,0,0,114,993,1,0,0,0,116,1003,1,0,0,0,118,1019,1,0, - 0,0,120,1054,1,0,0,0,122,1056,1,0,0,0,124,1059,1,0,0,0,126,1061, - 1,0,0,0,128,1063,1,0,0,0,130,1169,1,0,0,0,132,1171,1,0,0,0,134,1228, - 1,0,0,0,136,1230,1,0,0,0,138,1235,1,0,0,0,140,1237,1,0,0,0,142,1247, - 1,0,0,0,144,1249,1,0,0,0,146,1262,1,0,0,0,148,1266,1,0,0,0,150,1279, - 1,0,0,0,152,1281,1,0,0,0,154,155,3,6,3,0,155,156,5,0,0,1,156,167, - 1,0,0,0,157,158,3,20,10,0,158,159,5,0,0,1,159,167,1,0,0,0,160,161, - 3,50,25,0,161,162,5,0,0,1,162,167,1,0,0,0,163,164,3,2,1,0,164,165, - 5,0,0,1,165,167,1,0,0,0,166,154,1,0,0,0,166,157,1,0,0,0,166,160, - 1,0,0,0,166,163,1,0,0,0,167,1,1,0,0,0,168,169,5,35,0,0,169,173,5, - 131,0,0,170,172,3,8,4,0,171,170,1,0,0,0,172,175,1,0,0,0,173,171, - 1,0,0,0,173,174,1,0,0,0,174,176,1,0,0,0,175,173,1,0,0,0,176,177, - 5,132,0,0,177,3,1,0,0,0,178,179,5,36,0,0,179,180,3,152,76,0,180, - 181,5,128,0,0,181,5,1,0,0,0,182,183,5,4,0,0,183,184,3,150,75,0,184, - 185,5,78,0,0,185,186,3,152,76,0,186,187,5,72,0,0,187,188,3,152,76, - 0,188,189,5,71,0,0,189,190,3,152,76,0,190,194,5,131,0,0,191,193, - 3,8,4,0,192,191,1,0,0,0,193,196,1,0,0,0,194,192,1,0,0,0,194,195, - 1,0,0,0,195,197,1,0,0,0,196,194,1,0,0,0,197,198,5,132,0,0,198,7, - 1,0,0,0,199,207,3,4,2,0,200,207,3,18,9,0,201,207,3,10,5,0,202,207, - 3,88,44,0,203,207,3,100,50,0,204,207,3,132,66,0,205,207,3,32,16, - 0,206,199,1,0,0,0,206,200,1,0,0,0,206,201,1,0,0,0,206,202,1,0,0, - 0,206,203,1,0,0,0,206,204,1,0,0,0,206,205,1,0,0,0,207,9,1,0,0,0, - 208,209,5,36,0,0,209,210,5,39,0,0,210,211,3,150,75,0,211,212,5,128, - 0,0,212,219,1,0,0,0,213,214,5,36,0,0,214,215,5,41,0,0,215,216,3, - 150,75,0,216,217,5,128,0,0,217,219,1,0,0,0,218,208,1,0,0,0,218,213, - 1,0,0,0,219,11,1,0,0,0,220,221,5,37,0,0,221,222,5,38,0,0,222,223, - 3,150,75,0,223,224,5,78,0,0,224,225,3,152,76,0,225,226,5,128,0,0, - 226,13,1,0,0,0,227,228,5,37,0,0,228,229,5,39,0,0,229,230,3,150,75, - 0,230,231,5,72,0,0,231,232,3,152,76,0,232,233,5,128,0,0,233,15,1, - 0,0,0,234,239,3,10,5,0,235,239,3,12,6,0,236,239,3,14,7,0,237,239, - 3,32,16,0,238,234,1,0,0,0,238,235,1,0,0,0,238,236,1,0,0,0,238,237, - 1,0,0,0,239,17,1,0,0,0,240,241,5,38,0,0,241,242,3,150,75,0,242,243, - 5,78,0,0,243,246,3,152,76,0,244,245,5,79,0,0,245,247,3,152,76,0, - 246,244,1,0,0,0,246,247,1,0,0,0,247,248,1,0,0,0,248,249,5,128,0, - 0,249,19,1,0,0,0,250,252,3,16,8,0,251,250,1,0,0,0,252,255,1,0,0, - 0,253,251,1,0,0,0,253,254,1,0,0,0,254,256,1,0,0,0,255,253,1,0,0, - 0,256,257,5,39,0,0,257,259,3,150,75,0,258,260,3,22,11,0,259,258, - 1,0,0,0,259,260,1,0,0,0,260,261,1,0,0,0,261,262,5,78,0,0,262,263, - 3,152,76,0,263,264,5,72,0,0,264,274,3,152,76,0,265,266,5,83,0,0, - 266,271,3,26,13,0,267,268,5,129,0,0,268,270,3,26,13,0,269,267,1, - 0,0,0,270,273,1,0,0,0,271,269,1,0,0,0,271,272,1,0,0,0,272,275,1, - 0,0,0,273,271,1,0,0,0,274,265,1,0,0,0,274,275,1,0,0,0,275,276,1, - 0,0,0,276,280,5,131,0,0,277,279,3,34,17,0,278,277,1,0,0,0,279,282, - 1,0,0,0,280,278,1,0,0,0,280,281,1,0,0,0,281,283,1,0,0,0,282,280, - 1,0,0,0,283,284,5,132,0,0,284,21,1,0,0,0,285,286,5,137,0,0,286,291, - 3,24,12,0,287,288,5,129,0,0,288,290,3,24,12,0,289,287,1,0,0,0,290, - 293,1,0,0,0,291,289,1,0,0,0,291,292,1,0,0,0,292,294,1,0,0,0,293, - 291,1,0,0,0,294,295,5,138,0,0,295,23,1,0,0,0,296,297,5,42,0,0,297, - 300,3,150,75,0,298,299,5,127,0,0,299,301,5,32,0,0,300,298,1,0,0, - 0,300,301,1,0,0,0,301,316,1,0,0,0,302,303,5,31,0,0,303,313,3,150, - 75,0,304,305,5,33,0,0,305,310,3,26,13,0,306,307,5,139,0,0,307,309, - 3,26,13,0,308,306,1,0,0,0,309,312,1,0,0,0,310,308,1,0,0,0,310,311, - 1,0,0,0,311,314,1,0,0,0,312,310,1,0,0,0,313,304,1,0,0,0,313,314, - 1,0,0,0,314,316,1,0,0,0,315,296,1,0,0,0,315,302,1,0,0,0,316,25,1, - 0,0,0,317,319,3,150,75,0,318,320,3,28,14,0,319,318,1,0,0,0,319,320, - 1,0,0,0,320,27,1,0,0,0,321,322,5,137,0,0,322,327,3,30,15,0,323,324, - 5,129,0,0,324,326,3,30,15,0,325,323,1,0,0,0,326,329,1,0,0,0,327, - 325,1,0,0,0,327,328,1,0,0,0,328,330,1,0,0,0,329,327,1,0,0,0,330, - 331,5,138,0,0,331,29,1,0,0,0,332,333,5,38,0,0,333,340,3,150,75,0, - 334,335,5,39,0,0,335,340,3,26,13,0,336,337,5,31,0,0,337,340,3,150, - 75,0,338,340,3,134,67,0,339,332,1,0,0,0,339,334,1,0,0,0,339,336, - 1,0,0,0,339,338,1,0,0,0,340,31,1,0,0,0,341,342,5,30,0,0,342,344, - 3,150,75,0,343,345,3,22,11,0,344,343,1,0,0,0,344,345,1,0,0,0,345, - 346,1,0,0,0,346,347,5,140,0,0,347,348,3,134,67,0,348,349,5,128,0, - 0,349,33,1,0,0,0,350,354,3,38,19,0,351,354,3,42,21,0,352,354,3,36, - 18,0,353,350,1,0,0,0,353,351,1,0,0,0,353,352,1,0,0,0,354,35,1,0, - 0,0,355,357,5,52,0,0,356,355,1,0,0,0,356,357,1,0,0,0,357,358,1,0, - 0,0,358,359,5,44,0,0,359,360,3,150,75,0,360,361,5,78,0,0,361,362, - 3,152,76,0,362,363,5,127,0,0,363,364,3,134,67,0,364,365,5,126,0, - 0,365,366,3,134,67,0,366,367,5,131,0,0,367,368,5,95,0,0,368,369, - 5,78,0,0,369,371,3,152,76,0,370,372,3,66,33,0,371,370,1,0,0,0,371, - 372,1,0,0,0,372,373,1,0,0,0,373,374,5,128,0,0,374,375,5,132,0,0, - 375,37,1,0,0,0,376,378,3,44,22,0,377,376,1,0,0,0,377,378,1,0,0,0, - 378,379,1,0,0,0,379,380,5,42,0,0,380,381,3,150,75,0,381,382,5,78, - 0,0,382,383,3,152,76,0,383,384,5,127,0,0,384,385,3,134,67,0,385, - 389,5,131,0,0,386,388,3,40,20,0,387,386,1,0,0,0,388,391,1,0,0,0, - 389,387,1,0,0,0,389,390,1,0,0,0,390,392,1,0,0,0,391,389,1,0,0,0, - 392,393,5,132,0,0,393,39,1,0,0,0,394,395,5,85,0,0,395,396,5,78,0, - 0,396,398,3,152,76,0,397,399,3,66,33,0,398,397,1,0,0,0,398,399,1, - 0,0,0,399,400,1,0,0,0,400,401,5,128,0,0,401,428,1,0,0,0,402,403, - 5,86,0,0,403,404,5,78,0,0,404,406,3,152,76,0,405,407,3,66,33,0,406, - 405,1,0,0,0,406,407,1,0,0,0,407,408,1,0,0,0,408,409,5,128,0,0,409, - 428,1,0,0,0,410,411,5,1,0,0,411,412,5,78,0,0,412,414,3,152,76,0, - 413,415,3,66,33,0,414,413,1,0,0,0,414,415,1,0,0,0,415,416,1,0,0, - 0,416,417,5,128,0,0,417,428,1,0,0,0,418,419,5,87,0,0,419,420,5,88, - 0,0,420,421,5,78,0,0,421,422,3,152,76,0,422,423,5,89,0,0,423,424, - 5,78,0,0,424,425,3,152,76,0,425,426,5,128,0,0,426,428,1,0,0,0,427, - 394,1,0,0,0,427,402,1,0,0,0,427,410,1,0,0,0,427,418,1,0,0,0,428, - 41,1,0,0,0,429,431,3,44,22,0,430,429,1,0,0,0,430,431,1,0,0,0,431, - 432,1,0,0,0,432,433,5,43,0,0,433,434,3,150,75,0,434,435,5,78,0,0, - 435,436,3,152,76,0,436,437,5,127,0,0,437,438,3,140,70,0,438,440, - 3,48,24,0,439,441,5,106,0,0,440,439,1,0,0,0,440,441,1,0,0,0,441, - 444,1,0,0,0,442,443,5,76,0,0,443,445,3,152,76,0,444,442,1,0,0,0, - 444,445,1,0,0,0,445,446,1,0,0,0,446,450,5,131,0,0,447,449,3,46,23, - 0,448,447,1,0,0,0,449,452,1,0,0,0,450,448,1,0,0,0,450,451,1,0,0, - 0,451,453,1,0,0,0,452,450,1,0,0,0,453,454,5,132,0,0,454,43,1,0,0, - 0,455,457,5,27,0,0,456,458,7,0,0,0,457,456,1,0,0,0,457,458,1,0,0, - 0,458,45,1,0,0,0,459,460,5,92,0,0,460,461,5,78,0,0,461,463,3,152, - 76,0,462,464,3,66,33,0,463,462,1,0,0,0,463,464,1,0,0,0,464,465,1, - 0,0,0,465,466,5,128,0,0,466,493,1,0,0,0,467,468,5,93,0,0,468,469, - 5,78,0,0,469,471,3,152,76,0,470,472,3,66,33,0,471,470,1,0,0,0,471, - 472,1,0,0,0,472,473,1,0,0,0,473,474,5,128,0,0,474,493,1,0,0,0,475, - 476,5,94,0,0,476,477,5,78,0,0,477,479,3,152,76,0,478,480,3,66,33, - 0,479,478,1,0,0,0,479,480,1,0,0,0,480,481,1,0,0,0,481,482,5,128, - 0,0,482,493,1,0,0,0,483,484,5,87,0,0,484,485,5,88,0,0,485,486,5, - 78,0,0,486,487,3,152,76,0,487,488,5,89,0,0,488,489,5,78,0,0,489, - 490,3,152,76,0,490,491,5,128,0,0,491,493,1,0,0,0,492,459,1,0,0,0, - 492,467,1,0,0,0,492,475,1,0,0,0,492,483,1,0,0,0,493,47,1,0,0,0,494, - 495,5,38,0,0,495,504,3,150,75,0,496,497,5,39,0,0,497,499,3,150,75, - 0,498,500,3,28,14,0,499,498,1,0,0,0,499,500,1,0,0,0,500,504,1,0, - 0,0,501,502,5,31,0,0,502,504,3,150,75,0,503,494,1,0,0,0,503,496, - 1,0,0,0,503,501,1,0,0,0,504,49,1,0,0,0,505,507,3,16,8,0,506,505, - 1,0,0,0,507,510,1,0,0,0,508,506,1,0,0,0,508,509,1,0,0,0,509,511, - 1,0,0,0,510,508,1,0,0,0,511,512,5,41,0,0,512,513,3,150,75,0,513, - 514,5,78,0,0,514,515,3,152,76,0,515,516,5,72,0,0,516,519,3,152,76, - 0,517,518,5,73,0,0,518,520,5,141,0,0,519,517,1,0,0,0,519,520,1,0, - 0,0,520,521,1,0,0,0,521,525,5,131,0,0,522,524,3,52,26,0,523,522, - 1,0,0,0,524,527,1,0,0,0,525,523,1,0,0,0,525,526,1,0,0,0,526,528, - 1,0,0,0,527,525,1,0,0,0,528,529,5,132,0,0,529,51,1,0,0,0,530,536, - 3,60,30,0,531,536,3,62,31,0,532,536,3,70,35,0,533,536,3,54,27,0, - 534,536,3,56,28,0,535,530,1,0,0,0,535,531,1,0,0,0,535,532,1,0,0, - 0,535,533,1,0,0,0,535,534,1,0,0,0,536,53,1,0,0,0,537,538,5,17,0, - 0,538,540,3,150,75,0,539,541,3,22,11,0,540,539,1,0,0,0,540,541,1, - 0,0,0,541,542,1,0,0,0,542,543,5,78,0,0,543,544,3,152,76,0,544,546, - 5,20,0,0,545,547,5,4,0,0,546,545,1,0,0,0,546,547,1,0,0,0,547,548, - 1,0,0,0,548,549,3,26,13,0,549,550,5,21,0,0,550,551,3,152,76,0,551, - 552,5,44,0,0,552,553,3,152,76,0,553,557,5,131,0,0,554,556,3,58,29, - 0,555,554,1,0,0,0,556,559,1,0,0,0,557,555,1,0,0,0,557,558,1,0,0, - 0,558,560,1,0,0,0,559,557,1,0,0,0,560,561,5,132,0,0,561,55,1,0,0, - 0,562,563,5,17,0,0,563,564,3,150,75,0,564,565,5,78,0,0,565,566,3, - 152,76,0,566,567,5,19,0,0,567,568,3,150,75,0,568,569,3,28,14,0,569, - 570,5,128,0,0,570,57,1,0,0,0,571,572,5,11,0,0,572,612,5,128,0,0, - 573,574,5,12,0,0,574,575,5,13,0,0,575,576,3,150,75,0,576,577,5,128, - 0,0,577,612,1,0,0,0,578,579,5,22,0,0,579,580,3,152,76,0,580,581, - 5,128,0,0,581,612,1,0,0,0,582,584,5,23,0,0,583,585,5,31,0,0,584, - 583,1,0,0,0,584,585,1,0,0,0,585,586,1,0,0,0,586,587,3,150,75,0,587, - 588,5,50,0,0,588,589,3,26,13,0,589,590,5,128,0,0,590,612,1,0,0,0, - 591,592,5,24,0,0,592,593,3,150,75,0,593,594,5,141,0,0,594,595,5, - 128,0,0,595,612,1,0,0,0,596,597,5,25,0,0,597,598,3,26,13,0,598,599, - 5,130,0,0,599,600,3,150,75,0,600,601,3,150,75,0,601,602,3,152,76, - 0,602,603,5,128,0,0,603,612,1,0,0,0,604,605,5,87,0,0,605,612,5,128, - 0,0,606,607,5,26,0,0,607,608,5,141,0,0,608,609,3,152,76,0,609,610, - 5,128,0,0,610,612,1,0,0,0,611,571,1,0,0,0,611,573,1,0,0,0,611,578, - 1,0,0,0,611,582,1,0,0,0,611,591,1,0,0,0,611,596,1,0,0,0,611,604, - 1,0,0,0,611,606,1,0,0,0,612,59,1,0,0,0,613,614,5,44,0,0,614,616, - 3,150,75,0,615,617,3,22,11,0,616,615,1,0,0,0,616,617,1,0,0,0,617, - 618,1,0,0,0,618,619,5,78,0,0,619,620,3,152,76,0,620,621,5,127,0, - 0,621,622,3,134,67,0,622,623,5,126,0,0,623,624,3,134,67,0,624,625, - 5,80,0,0,625,627,3,74,37,0,626,628,3,66,33,0,627,626,1,0,0,0,627, - 628,1,0,0,0,628,630,1,0,0,0,629,631,3,72,36,0,630,629,1,0,0,0,630, - 631,1,0,0,0,631,632,1,0,0,0,632,633,5,82,0,0,633,635,3,76,38,0,634, - 636,3,80,40,0,635,634,1,0,0,0,635,636,1,0,0,0,636,638,1,0,0,0,637, - 639,3,64,32,0,638,637,1,0,0,0,638,639,1,0,0,0,639,640,1,0,0,0,640, - 641,5,128,0,0,641,61,1,0,0,0,642,643,5,45,0,0,643,645,3,150,75,0, - 644,646,3,22,11,0,645,644,1,0,0,0,645,646,1,0,0,0,646,647,1,0,0, - 0,647,648,5,78,0,0,648,649,3,152,76,0,649,650,5,127,0,0,650,651, - 3,134,67,0,651,652,5,126,0,0,652,654,3,134,67,0,653,655,3,66,33, - 0,654,653,1,0,0,0,654,655,1,0,0,0,655,657,1,0,0,0,656,658,3,80,40, - 0,657,656,1,0,0,0,657,658,1,0,0,0,658,660,1,0,0,0,659,661,3,64,32, - 0,660,659,1,0,0,0,660,661,1,0,0,0,661,662,1,0,0,0,662,663,5,128, - 0,0,663,63,1,0,0,0,664,665,5,61,0,0,665,666,5,60,0,0,666,667,3,150, - 75,0,667,65,1,0,0,0,668,669,5,5,0,0,669,678,5,8,0,0,670,671,5,5, - 0,0,671,672,7,1,0,0,672,673,5,9,0,0,673,674,5,133,0,0,674,675,3, - 78,39,0,675,676,5,134,0,0,676,678,1,0,0,0,677,668,1,0,0,0,677,670, - 1,0,0,0,678,67,1,0,0,0,679,680,5,60,0,0,680,681,5,133,0,0,681,686, - 3,116,58,0,682,683,5,129,0,0,683,685,3,116,58,0,684,682,1,0,0,0, - 685,688,1,0,0,0,686,684,1,0,0,0,686,687,1,0,0,0,687,689,1,0,0,0, - 688,686,1,0,0,0,689,690,5,134,0,0,690,69,1,0,0,0,691,692,5,46,0, - 0,692,693,3,150,75,0,693,694,5,78,0,0,694,695,3,152,76,0,695,696, - 5,47,0,0,696,697,3,150,75,0,697,698,5,127,0,0,698,700,3,134,67,0, - 699,701,3,80,40,0,700,699,1,0,0,0,700,701,1,0,0,0,701,702,1,0,0, - 0,702,703,5,128,0,0,703,71,1,0,0,0,704,705,5,81,0,0,705,706,3,134, - 67,0,706,73,1,0,0,0,707,708,7,2,0,0,708,75,1,0,0,0,709,728,5,84, - 0,0,710,711,5,38,0,0,711,728,3,150,75,0,712,713,5,31,0,0,713,728, - 3,150,75,0,714,715,5,40,0,0,715,724,5,133,0,0,716,721,3,26,13,0, - 717,718,5,129,0,0,718,720,3,26,13,0,719,717,1,0,0,0,720,723,1,0, - 0,0,721,719,1,0,0,0,721,722,1,0,0,0,722,725,1,0,0,0,723,721,1,0, - 0,0,724,716,1,0,0,0,724,725,1,0,0,0,725,726,1,0,0,0,726,728,5,134, - 0,0,727,709,1,0,0,0,727,710,1,0,0,0,727,712,1,0,0,0,727,714,1,0, - 0,0,728,77,1,0,0,0,729,734,3,150,75,0,730,731,5,129,0,0,731,733, - 3,150,75,0,732,730,1,0,0,0,733,736,1,0,0,0,734,732,1,0,0,0,734,735, - 1,0,0,0,735,79,1,0,0,0,736,734,1,0,0,0,737,738,5,83,0,0,738,742, - 5,131,0,0,739,741,3,82,41,0,740,739,1,0,0,0,741,744,1,0,0,0,742, - 740,1,0,0,0,742,743,1,0,0,0,743,745,1,0,0,0,744,742,1,0,0,0,745, - 746,5,132,0,0,746,81,1,0,0,0,747,748,5,18,0,0,748,749,3,150,75,0, - 749,750,5,78,0,0,750,751,3,152,76,0,751,752,5,133,0,0,752,753,3, - 78,39,0,753,754,5,134,0,0,754,755,5,128,0,0,755,822,1,0,0,0,756, - 757,5,56,0,0,757,758,3,150,75,0,758,759,5,78,0,0,759,760,3,152,76, - 0,760,761,5,127,0,0,761,762,3,134,67,0,762,763,3,84,42,0,763,764, - 5,128,0,0,764,822,1,0,0,0,765,766,5,57,0,0,766,767,3,150,75,0,767, - 768,5,78,0,0,768,769,3,152,76,0,769,770,5,127,0,0,770,771,3,140, - 70,0,771,772,3,48,24,0,772,773,3,84,42,0,773,774,5,128,0,0,774,822, - 1,0,0,0,775,776,5,39,0,0,776,777,3,150,75,0,777,778,5,78,0,0,778, - 779,3,152,76,0,779,780,5,127,0,0,780,782,3,150,75,0,781,783,3,28, - 14,0,782,781,1,0,0,0,782,783,1,0,0,0,783,785,1,0,0,0,784,786,3,68, - 34,0,785,784,1,0,0,0,785,786,1,0,0,0,786,787,1,0,0,0,787,788,5,128, - 0,0,788,822,1,0,0,0,789,790,5,2,0,0,790,791,3,150,75,0,791,792,5, - 78,0,0,792,793,3,152,76,0,793,794,5,127,0,0,794,795,3,150,75,0,795, - 796,5,48,0,0,796,797,3,134,67,0,797,798,5,128,0,0,798,822,1,0,0, - 0,799,800,5,46,0,0,800,801,3,150,75,0,801,802,5,78,0,0,802,803,3, - 152,76,0,803,804,5,127,0,0,804,807,3,150,75,0,805,806,5,48,0,0,806, - 808,3,134,67,0,807,805,1,0,0,0,807,808,1,0,0,0,808,809,1,0,0,0,809, - 810,5,128,0,0,810,822,1,0,0,0,811,812,5,17,0,0,812,813,3,150,75, - 0,813,814,5,78,0,0,814,815,3,152,76,0,815,816,5,127,0,0,816,817, - 3,150,75,0,817,818,5,130,0,0,818,819,3,150,75,0,819,820,5,128,0, - 0,820,822,1,0,0,0,821,747,1,0,0,0,821,756,1,0,0,0,821,765,1,0,0, - 0,821,775,1,0,0,0,821,789,1,0,0,0,821,799,1,0,0,0,821,811,1,0,0, - 0,822,83,1,0,0,0,823,824,5,133,0,0,824,829,3,86,43,0,825,826,5,129, - 0,0,826,828,3,86,43,0,827,825,1,0,0,0,828,831,1,0,0,0,829,827,1, - 0,0,0,829,830,1,0,0,0,830,832,1,0,0,0,831,829,1,0,0,0,832,833,5, - 134,0,0,833,85,1,0,0,0,834,835,7,3,0,0,835,87,1,0,0,0,836,837,5, - 55,0,0,837,838,3,90,45,0,838,89,1,0,0,0,839,842,3,92,46,0,840,842, - 3,96,48,0,841,839,1,0,0,0,841,840,1,0,0,0,842,91,1,0,0,0,843,844, - 5,56,0,0,844,845,3,150,75,0,845,846,5,78,0,0,846,847,3,152,76,0, - 847,848,5,66,0,0,848,849,3,150,75,0,849,850,5,127,0,0,850,851,3, - 134,67,0,851,852,5,67,0,0,852,855,3,94,47,0,853,854,5,68,0,0,854, - 856,3,142,71,0,855,853,1,0,0,0,855,856,1,0,0,0,856,857,1,0,0,0,857, - 858,5,128,0,0,858,93,1,0,0,0,859,866,5,100,0,0,860,861,5,101,0,0, - 861,862,5,135,0,0,862,863,3,134,67,0,863,864,5,136,0,0,864,866,1, - 0,0,0,865,859,1,0,0,0,865,860,1,0,0,0,866,95,1,0,0,0,867,868,5,57, - 0,0,868,869,3,150,75,0,869,870,5,78,0,0,870,871,3,152,76,0,871,872, - 5,131,0,0,872,873,3,98,49,0,873,874,3,98,49,0,874,875,5,132,0,0, - 875,97,1,0,0,0,876,877,3,48,24,0,877,878,5,58,0,0,878,879,3,150, - 75,0,879,880,5,78,0,0,880,881,3,152,76,0,881,883,3,140,70,0,882, - 884,5,106,0,0,883,882,1,0,0,0,883,884,1,0,0,0,884,887,1,0,0,0,885, - 886,5,74,0,0,886,888,3,152,76,0,887,885,1,0,0,0,887,888,1,0,0,0, - 888,890,1,0,0,0,889,891,5,75,0,0,890,889,1,0,0,0,890,891,1,0,0,0, - 891,894,1,0,0,0,892,893,5,76,0,0,893,895,3,152,76,0,894,892,1,0, - 0,0,894,895,1,0,0,0,895,897,1,0,0,0,896,898,5,77,0,0,897,896,1,0, - 0,0,897,898,1,0,0,0,898,899,1,0,0,0,899,900,5,128,0,0,900,99,1,0, - 0,0,901,902,5,49,0,0,902,903,3,150,75,0,903,904,5,50,0,0,904,906, - 3,150,75,0,905,907,3,28,14,0,906,905,1,0,0,0,906,907,1,0,0,0,907, - 910,1,0,0,0,908,909,5,78,0,0,909,911,3,152,76,0,910,908,1,0,0,0, - 910,911,1,0,0,0,911,914,1,0,0,0,912,913,5,73,0,0,913,915,5,141,0, - 0,914,912,1,0,0,0,914,915,1,0,0,0,915,916,1,0,0,0,916,920,5,131, - 0,0,917,919,3,102,51,0,918,917,1,0,0,0,919,922,1,0,0,0,920,918,1, - 0,0,0,920,921,1,0,0,0,921,923,1,0,0,0,922,920,1,0,0,0,923,924,5, - 132,0,0,924,101,1,0,0,0,925,926,5,54,0,0,926,932,3,90,45,0,927,932, - 3,114,57,0,928,932,3,110,55,0,929,932,3,104,52,0,930,932,3,112,56, - 0,931,925,1,0,0,0,931,927,1,0,0,0,931,928,1,0,0,0,931,929,1,0,0, - 0,931,930,1,0,0,0,932,103,1,0,0,0,933,934,5,3,0,0,934,938,5,131, - 0,0,935,937,3,106,53,0,936,935,1,0,0,0,937,940,1,0,0,0,938,936,1, - 0,0,0,938,939,1,0,0,0,939,941,1,0,0,0,940,938,1,0,0,0,941,942,5, - 132,0,0,942,943,5,128,0,0,943,105,1,0,0,0,944,945,3,150,75,0,945, - 946,5,53,0,0,946,947,5,56,0,0,947,948,3,150,75,0,948,949,5,128,0, - 0,949,959,1,0,0,0,950,951,3,150,75,0,951,952,5,53,0,0,952,953,5, - 57,0,0,953,954,3,150,75,0,954,955,5,130,0,0,955,956,3,150,75,0,956, - 957,5,128,0,0,957,959,1,0,0,0,958,944,1,0,0,0,958,950,1,0,0,0,959, - 107,1,0,0,0,960,961,3,26,13,0,961,962,5,13,0,0,962,967,5,48,0,0, - 963,964,5,130,0,0,964,966,3,150,75,0,965,963,1,0,0,0,966,969,1,0, - 0,0,967,965,1,0,0,0,967,968,1,0,0,0,968,970,1,0,0,0,969,967,1,0, - 0,0,970,971,5,128,0,0,971,109,1,0,0,0,972,973,5,51,0,0,973,974,3, - 150,75,0,974,975,5,53,0,0,975,976,5,56,0,0,976,977,3,150,75,0,977, - 978,5,128,0,0,978,111,1,0,0,0,979,980,5,63,0,0,980,981,3,150,75, - 0,981,982,5,64,0,0,982,983,5,65,0,0,983,984,5,60,0,0,984,985,5,46, - 0,0,985,986,3,150,75,0,986,987,5,62,0,0,987,988,5,57,0,0,988,989, - 3,150,75,0,989,990,5,130,0,0,990,991,3,150,75,0,991,992,5,128,0, - 0,992,113,1,0,0,0,993,994,5,51,0,0,994,995,3,116,58,0,995,996,5, - 53,0,0,996,999,3,120,60,0,997,998,5,29,0,0,998,1000,3,152,76,0,999, - 997,1,0,0,0,999,1000,1,0,0,0,1000,1001,1,0,0,0,1001,1002,5,128,0, - 0,1002,115,1,0,0,0,1003,1004,3,150,75,0,1004,1005,5,130,0,0,1005, - 1006,3,118,59,0,1006,117,1,0,0,0,1007,1020,3,150,75,0,1008,1020, - 5,95,0,0,1009,1020,5,85,0,0,1010,1020,5,86,0,0,1011,1020,5,1,0,0, - 1012,1020,5,92,0,0,1013,1020,5,93,0,0,1014,1020,5,94,0,0,1015,1020, - 5,96,0,0,1016,1020,5,97,0,0,1017,1020,5,98,0,0,1018,1020,5,99,0, - 0,1019,1007,1,0,0,0,1019,1008,1,0,0,0,1019,1009,1,0,0,0,1019,1010, - 1,0,0,0,1019,1011,1,0,0,0,1019,1012,1,0,0,0,1019,1013,1,0,0,0,1019, - 1014,1,0,0,0,1019,1015,1,0,0,0,1019,1016,1,0,0,0,1019,1017,1,0,0, - 0,1019,1018,1,0,0,0,1020,119,1,0,0,0,1021,1022,5,56,0,0,1022,1023, - 3,150,75,0,1023,1024,5,130,0,0,1024,1025,3,124,62,0,1025,1055,1, - 0,0,0,1026,1027,5,57,0,0,1027,1028,3,150,75,0,1028,1029,5,130,0, - 0,1029,1030,3,150,75,0,1030,1031,5,130,0,0,1031,1032,3,126,63,0, - 1032,1055,1,0,0,0,1033,1034,5,39,0,0,1034,1036,3,150,75,0,1035,1037, - 3,28,14,0,1036,1035,1,0,0,0,1036,1037,1,0,0,0,1037,1038,1,0,0,0, - 1038,1039,5,130,0,0,1039,1040,3,116,58,0,1040,1055,1,0,0,0,1041, - 1042,5,41,0,0,1042,1043,3,150,75,0,1043,1044,5,130,0,0,1044,1046, - 3,150,75,0,1045,1047,3,28,14,0,1046,1045,1,0,0,0,1046,1047,1,0,0, - 0,1047,1049,1,0,0,0,1048,1050,3,128,64,0,1049,1048,1,0,0,0,1049, - 1050,1,0,0,0,1050,1052,1,0,0,0,1051,1053,3,122,61,0,1052,1051,1, - 0,0,0,1052,1053,1,0,0,0,1053,1055,1,0,0,0,1054,1021,1,0,0,0,1054, - 1026,1,0,0,0,1054,1033,1,0,0,0,1054,1041,1,0,0,0,1055,121,1,0,0, - 0,1056,1057,5,61,0,0,1057,1058,3,128,64,0,1058,123,1,0,0,0,1059, - 1060,7,4,0,0,1060,125,1,0,0,0,1061,1062,7,5,0,0,1062,127,1,0,0,0, - 1063,1064,5,59,0,0,1064,1068,5,131,0,0,1065,1067,3,130,65,0,1066, - 1065,1,0,0,0,1067,1070,1,0,0,0,1068,1066,1,0,0,0,1068,1069,1,0,0, - 0,1069,1071,1,0,0,0,1070,1068,1,0,0,0,1071,1072,5,132,0,0,1072,129, - 1,0,0,0,1073,1074,3,150,75,0,1074,1075,5,53,0,0,1075,1076,5,4,0, - 0,1076,1077,5,18,0,0,1077,1078,5,133,0,0,1078,1079,3,78,39,0,1079, - 1080,5,134,0,0,1080,1081,5,128,0,0,1081,1170,1,0,0,0,1082,1083,3, - 150,75,0,1083,1084,5,53,0,0,1084,1085,5,56,0,0,1085,1092,3,150,75, - 0,1086,1087,5,62,0,0,1087,1088,5,57,0,0,1088,1089,3,150,75,0,1089, - 1090,5,130,0,0,1090,1091,3,150,75,0,1091,1093,1,0,0,0,1092,1086, - 1,0,0,0,1092,1093,1,0,0,0,1093,1094,1,0,0,0,1094,1095,5,128,0,0, - 1095,1170,1,0,0,0,1096,1097,3,150,75,0,1097,1098,5,53,0,0,1098,1099, - 5,57,0,0,1099,1100,3,150,75,0,1100,1101,5,130,0,0,1101,1108,3,150, - 75,0,1102,1103,5,62,0,0,1103,1104,5,57,0,0,1104,1105,3,150,75,0, - 1105,1106,5,130,0,0,1106,1107,3,150,75,0,1107,1109,1,0,0,0,1108, - 1102,1,0,0,0,1108,1109,1,0,0,0,1109,1110,1,0,0,0,1110,1111,5,128, - 0,0,1111,1170,1,0,0,0,1112,1113,3,150,75,0,1113,1114,5,53,0,0,1114, - 1115,5,39,0,0,1115,1117,3,150,75,0,1116,1118,3,28,14,0,1117,1116, - 1,0,0,0,1117,1118,1,0,0,0,1118,1125,1,0,0,0,1119,1120,5,62,0,0,1120, - 1121,5,57,0,0,1121,1122,3,150,75,0,1122,1123,5,130,0,0,1123,1124, - 3,150,75,0,1124,1126,1,0,0,0,1125,1119,1,0,0,0,1125,1126,1,0,0,0, - 1126,1127,1,0,0,0,1127,1128,5,128,0,0,1128,1170,1,0,0,0,1129,1130, - 3,150,75,0,1130,1131,5,53,0,0,1131,1132,5,2,0,0,1132,1133,3,150, - 75,0,1133,1134,5,59,0,0,1134,1138,5,131,0,0,1135,1137,3,108,54,0, - 1136,1135,1,0,0,0,1137,1140,1,0,0,0,1138,1136,1,0,0,0,1138,1139, - 1,0,0,0,1139,1141,1,0,0,0,1140,1138,1,0,0,0,1141,1142,5,132,0,0, - 1142,1143,5,128,0,0,1143,1170,1,0,0,0,1144,1145,3,150,75,0,1145, - 1146,5,53,0,0,1146,1147,5,46,0,0,1147,1148,3,150,75,0,1148,1149, - 5,128,0,0,1149,1170,1,0,0,0,1150,1151,3,150,75,0,1151,1153,5,53, - 0,0,1152,1154,5,4,0,0,1153,1152,1,0,0,0,1153,1154,1,0,0,0,1154,1155, - 1,0,0,0,1155,1156,5,17,0,0,1156,1157,3,150,75,0,1157,1158,5,130, - 0,0,1158,1165,3,150,75,0,1159,1160,5,62,0,0,1160,1161,5,57,0,0,1161, - 1162,3,150,75,0,1162,1163,5,130,0,0,1163,1164,3,150,75,0,1164,1166, - 1,0,0,0,1165,1159,1,0,0,0,1165,1166,1,0,0,0,1166,1167,1,0,0,0,1167, - 1168,5,128,0,0,1168,1170,1,0,0,0,1169,1073,1,0,0,0,1169,1082,1,0, - 0,0,1169,1096,1,0,0,0,1169,1112,1,0,0,0,1169,1129,1,0,0,0,1169,1144, - 1,0,0,0,1169,1150,1,0,0,0,1170,131,1,0,0,0,1171,1172,5,46,0,0,1172, - 1173,3,150,75,0,1173,1174,5,53,0,0,1174,1175,3,150,75,0,1175,1176, - 5,130,0,0,1176,1178,3,150,75,0,1177,1179,3,128,64,0,1178,1177,1, - 0,0,0,1178,1179,1,0,0,0,1179,1180,1,0,0,0,1180,1181,5,128,0,0,1181, - 133,1,0,0,0,1182,1229,3,138,69,0,1183,1229,5,107,0,0,1184,1229,5, - 108,0,0,1185,1186,5,109,0,0,1186,1229,3,152,76,0,1187,1188,5,110, - 0,0,1188,1189,5,137,0,0,1189,1190,3,150,75,0,1190,1191,5,138,0,0, - 1191,1229,1,0,0,0,1192,1193,5,111,0,0,1193,1194,5,137,0,0,1194,1196, - 3,150,75,0,1195,1197,3,28,14,0,1196,1195,1,0,0,0,1196,1197,1,0,0, - 0,1197,1198,1,0,0,0,1198,1199,5,138,0,0,1199,1229,1,0,0,0,1200,1201, - 5,34,0,0,1201,1202,5,137,0,0,1202,1203,3,150,75,0,1203,1204,5,138, - 0,0,1204,1229,1,0,0,0,1205,1206,5,112,0,0,1206,1207,5,137,0,0,1207, - 1208,3,134,67,0,1208,1209,5,138,0,0,1209,1229,1,0,0,0,1210,1211, - 5,113,0,0,1211,1212,5,137,0,0,1212,1213,3,134,67,0,1213,1214,5,138, - 0,0,1214,1229,1,0,0,0,1215,1216,5,114,0,0,1216,1220,5,131,0,0,1217, - 1219,3,136,68,0,1218,1217,1,0,0,0,1219,1222,1,0,0,0,1220,1218,1, - 0,0,0,1220,1221,1,0,0,0,1221,1223,1,0,0,0,1222,1220,1,0,0,0,1223, - 1229,5,132,0,0,1224,1226,3,150,75,0,1225,1227,3,28,14,0,1226,1225, - 1,0,0,0,1226,1227,1,0,0,0,1227,1229,1,0,0,0,1228,1182,1,0,0,0,1228, - 1183,1,0,0,0,1228,1184,1,0,0,0,1228,1185,1,0,0,0,1228,1187,1,0,0, - 0,1228,1192,1,0,0,0,1228,1200,1,0,0,0,1228,1205,1,0,0,0,1228,1210, - 1,0,0,0,1228,1215,1,0,0,0,1228,1224,1,0,0,0,1229,135,1,0,0,0,1230, - 1231,3,150,75,0,1231,1232,5,127,0,0,1232,1233,3,134,67,0,1233,1234, - 5,128,0,0,1234,137,1,0,0,0,1235,1236,7,6,0,0,1236,139,1,0,0,0,1237, - 1238,7,7,0,0,1238,141,1,0,0,0,1239,1248,3,152,76,0,1240,1248,5,141, - 0,0,1241,1248,5,142,0,0,1242,1248,5,123,0,0,1243,1248,5,124,0,0, - 1244,1248,5,125,0,0,1245,1248,3,144,72,0,1246,1248,3,148,74,0,1247, - 1239,1,0,0,0,1247,1240,1,0,0,0,1247,1241,1,0,0,0,1247,1242,1,0,0, - 0,1247,1243,1,0,0,0,1247,1244,1,0,0,0,1247,1245,1,0,0,0,1247,1246, - 1,0,0,0,1248,143,1,0,0,0,1249,1258,5,131,0,0,1250,1255,3,146,73, - 0,1251,1252,5,129,0,0,1252,1254,3,146,73,0,1253,1251,1,0,0,0,1254, - 1257,1,0,0,0,1255,1253,1,0,0,0,1255,1256,1,0,0,0,1256,1259,1,0,0, - 0,1257,1255,1,0,0,0,1258,1250,1,0,0,0,1258,1259,1,0,0,0,1259,1260, - 1,0,0,0,1260,1261,5,132,0,0,1261,145,1,0,0,0,1262,1263,3,152,76, - 0,1263,1264,5,127,0,0,1264,1265,3,142,71,0,1265,147,1,0,0,0,1266, - 1275,5,133,0,0,1267,1272,3,142,71,0,1268,1269,5,129,0,0,1269,1271, - 3,142,71,0,1270,1268,1,0,0,0,1271,1274,1,0,0,0,1272,1270,1,0,0,0, - 1272,1273,1,0,0,0,1273,1276,1,0,0,0,1274,1272,1,0,0,0,1275,1267, - 1,0,0,0,1275,1276,1,0,0,0,1276,1277,1,0,0,0,1277,1278,5,134,0,0, - 1278,149,1,0,0,0,1279,1280,7,8,0,0,1280,151,1,0,0,0,1281,1282,5, - 144,0,0,1282,153,1,0,0,0,114,166,173,194,206,218,238,246,253,259, + 5,67,1225,8,67,10,67,12,67,1228,9,67,1,67,1,67,1,67,3,67,1233,8, + 67,3,67,1235,8,67,1,68,1,68,1,68,1,68,1,68,1,69,1,69,1,70,1,70,1, + 71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,3,71,1254,8,71,1,72,1,72,1, + 72,1,72,5,72,1260,8,72,10,72,12,72,1263,9,72,3,72,1265,8,72,1,72, + 1,72,1,73,1,73,1,73,1,73,1,74,1,74,1,74,1,74,5,74,1277,8,74,10,74, + 12,74,1280,9,74,3,74,1282,8,74,1,74,1,74,1,75,1,75,1,76,1,76,1,76, + 0,0,77,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, + 0,9,2,0,10,10,28,28,1,0,6,7,1,0,95,99,3,0,1,1,90,94,96,97,3,0,1, + 1,90,91,96,97,2,0,92,94,96,97,1,0,115,122,1,0,102,105,7,0,1,3,5, + 28,40,40,69,69,88,89,100,100,143,143,1396,0,166,1,0,0,0,2,168,1, + 0,0,0,4,178,1,0,0,0,6,182,1,0,0,0,8,206,1,0,0,0,10,218,1,0,0,0,12, + 220,1,0,0,0,14,227,1,0,0,0,16,238,1,0,0,0,18,240,1,0,0,0,20,253, + 1,0,0,0,22,285,1,0,0,0,24,315,1,0,0,0,26,317,1,0,0,0,28,321,1,0, + 0,0,30,339,1,0,0,0,32,341,1,0,0,0,34,353,1,0,0,0,36,356,1,0,0,0, + 38,377,1,0,0,0,40,427,1,0,0,0,42,430,1,0,0,0,44,455,1,0,0,0,46,492, + 1,0,0,0,48,503,1,0,0,0,50,508,1,0,0,0,52,535,1,0,0,0,54,537,1,0, + 0,0,56,562,1,0,0,0,58,611,1,0,0,0,60,613,1,0,0,0,62,642,1,0,0,0, + 64,664,1,0,0,0,66,677,1,0,0,0,68,679,1,0,0,0,70,691,1,0,0,0,72,704, + 1,0,0,0,74,707,1,0,0,0,76,727,1,0,0,0,78,729,1,0,0,0,80,737,1,0, + 0,0,82,825,1,0,0,0,84,827,1,0,0,0,86,838,1,0,0,0,88,840,1,0,0,0, + 90,845,1,0,0,0,92,847,1,0,0,0,94,869,1,0,0,0,96,871,1,0,0,0,98,880, + 1,0,0,0,100,905,1,0,0,0,102,935,1,0,0,0,104,937,1,0,0,0,106,962, + 1,0,0,0,108,964,1,0,0,0,110,976,1,0,0,0,112,983,1,0,0,0,114,997, + 1,0,0,0,116,1007,1,0,0,0,118,1023,1,0,0,0,120,1058,1,0,0,0,122,1060, + 1,0,0,0,124,1063,1,0,0,0,126,1065,1,0,0,0,128,1067,1,0,0,0,130,1175, + 1,0,0,0,132,1177,1,0,0,0,134,1234,1,0,0,0,136,1236,1,0,0,0,138,1241, + 1,0,0,0,140,1243,1,0,0,0,142,1253,1,0,0,0,144,1255,1,0,0,0,146,1268, + 1,0,0,0,148,1272,1,0,0,0,150,1285,1,0,0,0,152,1287,1,0,0,0,154,155, + 3,6,3,0,155,156,5,0,0,1,156,167,1,0,0,0,157,158,3,20,10,0,158,159, + 5,0,0,1,159,167,1,0,0,0,160,161,3,50,25,0,161,162,5,0,0,1,162,167, + 1,0,0,0,163,164,3,2,1,0,164,165,5,0,0,1,165,167,1,0,0,0,166,154, + 1,0,0,0,166,157,1,0,0,0,166,160,1,0,0,0,166,163,1,0,0,0,167,1,1, + 0,0,0,168,169,5,35,0,0,169,173,5,131,0,0,170,172,3,8,4,0,171,170, + 1,0,0,0,172,175,1,0,0,0,173,171,1,0,0,0,173,174,1,0,0,0,174,176, + 1,0,0,0,175,173,1,0,0,0,176,177,5,132,0,0,177,3,1,0,0,0,178,179, + 5,36,0,0,179,180,3,152,76,0,180,181,5,128,0,0,181,5,1,0,0,0,182, + 183,5,4,0,0,183,184,3,150,75,0,184,185,5,78,0,0,185,186,3,152,76, + 0,186,187,5,72,0,0,187,188,3,152,76,0,188,189,5,71,0,0,189,190,3, + 152,76,0,190,194,5,131,0,0,191,193,3,8,4,0,192,191,1,0,0,0,193,196, + 1,0,0,0,194,192,1,0,0,0,194,195,1,0,0,0,195,197,1,0,0,0,196,194, + 1,0,0,0,197,198,5,132,0,0,198,7,1,0,0,0,199,207,3,4,2,0,200,207, + 3,18,9,0,201,207,3,10,5,0,202,207,3,88,44,0,203,207,3,100,50,0,204, + 207,3,132,66,0,205,207,3,32,16,0,206,199,1,0,0,0,206,200,1,0,0,0, + 206,201,1,0,0,0,206,202,1,0,0,0,206,203,1,0,0,0,206,204,1,0,0,0, + 206,205,1,0,0,0,207,9,1,0,0,0,208,209,5,36,0,0,209,210,5,39,0,0, + 210,211,3,150,75,0,211,212,5,128,0,0,212,219,1,0,0,0,213,214,5,36, + 0,0,214,215,5,41,0,0,215,216,3,150,75,0,216,217,5,128,0,0,217,219, + 1,0,0,0,218,208,1,0,0,0,218,213,1,0,0,0,219,11,1,0,0,0,220,221,5, + 37,0,0,221,222,5,38,0,0,222,223,3,150,75,0,223,224,5,78,0,0,224, + 225,3,152,76,0,225,226,5,128,0,0,226,13,1,0,0,0,227,228,5,37,0,0, + 228,229,5,39,0,0,229,230,3,150,75,0,230,231,5,72,0,0,231,232,3,152, + 76,0,232,233,5,128,0,0,233,15,1,0,0,0,234,239,3,10,5,0,235,239,3, + 12,6,0,236,239,3,14,7,0,237,239,3,32,16,0,238,234,1,0,0,0,238,235, + 1,0,0,0,238,236,1,0,0,0,238,237,1,0,0,0,239,17,1,0,0,0,240,241,5, + 38,0,0,241,242,3,150,75,0,242,243,5,78,0,0,243,246,3,152,76,0,244, + 245,5,79,0,0,245,247,3,152,76,0,246,244,1,0,0,0,246,247,1,0,0,0, + 247,248,1,0,0,0,248,249,5,128,0,0,249,19,1,0,0,0,250,252,3,16,8, + 0,251,250,1,0,0,0,252,255,1,0,0,0,253,251,1,0,0,0,253,254,1,0,0, + 0,254,256,1,0,0,0,255,253,1,0,0,0,256,257,5,39,0,0,257,259,3,150, + 75,0,258,260,3,22,11,0,259,258,1,0,0,0,259,260,1,0,0,0,260,261,1, + 0,0,0,261,262,5,78,0,0,262,263,3,152,76,0,263,264,5,72,0,0,264,274, + 3,152,76,0,265,266,5,83,0,0,266,271,3,26,13,0,267,268,5,129,0,0, + 268,270,3,26,13,0,269,267,1,0,0,0,270,273,1,0,0,0,271,269,1,0,0, + 0,271,272,1,0,0,0,272,275,1,0,0,0,273,271,1,0,0,0,274,265,1,0,0, + 0,274,275,1,0,0,0,275,276,1,0,0,0,276,280,5,131,0,0,277,279,3,34, + 17,0,278,277,1,0,0,0,279,282,1,0,0,0,280,278,1,0,0,0,280,281,1,0, + 0,0,281,283,1,0,0,0,282,280,1,0,0,0,283,284,5,132,0,0,284,21,1,0, + 0,0,285,286,5,137,0,0,286,291,3,24,12,0,287,288,5,129,0,0,288,290, + 3,24,12,0,289,287,1,0,0,0,290,293,1,0,0,0,291,289,1,0,0,0,291,292, + 1,0,0,0,292,294,1,0,0,0,293,291,1,0,0,0,294,295,5,138,0,0,295,23, + 1,0,0,0,296,297,5,42,0,0,297,300,3,150,75,0,298,299,5,127,0,0,299, + 301,5,32,0,0,300,298,1,0,0,0,300,301,1,0,0,0,301,316,1,0,0,0,302, + 303,5,31,0,0,303,313,3,150,75,0,304,305,5,33,0,0,305,310,3,26,13, + 0,306,307,5,139,0,0,307,309,3,26,13,0,308,306,1,0,0,0,309,312,1, + 0,0,0,310,308,1,0,0,0,310,311,1,0,0,0,311,314,1,0,0,0,312,310,1, + 0,0,0,313,304,1,0,0,0,313,314,1,0,0,0,314,316,1,0,0,0,315,296,1, + 0,0,0,315,302,1,0,0,0,316,25,1,0,0,0,317,319,3,150,75,0,318,320, + 3,28,14,0,319,318,1,0,0,0,319,320,1,0,0,0,320,27,1,0,0,0,321,322, + 5,137,0,0,322,327,3,30,15,0,323,324,5,129,0,0,324,326,3,30,15,0, + 325,323,1,0,0,0,326,329,1,0,0,0,327,325,1,0,0,0,327,328,1,0,0,0, + 328,330,1,0,0,0,329,327,1,0,0,0,330,331,5,138,0,0,331,29,1,0,0,0, + 332,333,5,38,0,0,333,340,3,150,75,0,334,335,5,39,0,0,335,340,3,26, + 13,0,336,337,5,31,0,0,337,340,3,150,75,0,338,340,3,134,67,0,339, + 332,1,0,0,0,339,334,1,0,0,0,339,336,1,0,0,0,339,338,1,0,0,0,340, + 31,1,0,0,0,341,342,5,30,0,0,342,344,3,150,75,0,343,345,3,22,11,0, + 344,343,1,0,0,0,344,345,1,0,0,0,345,346,1,0,0,0,346,347,5,140,0, + 0,347,348,3,134,67,0,348,349,5,128,0,0,349,33,1,0,0,0,350,354,3, + 38,19,0,351,354,3,42,21,0,352,354,3,36,18,0,353,350,1,0,0,0,353, + 351,1,0,0,0,353,352,1,0,0,0,354,35,1,0,0,0,355,357,5,52,0,0,356, + 355,1,0,0,0,356,357,1,0,0,0,357,358,1,0,0,0,358,359,5,44,0,0,359, + 360,3,150,75,0,360,361,5,78,0,0,361,362,3,152,76,0,362,363,5,127, + 0,0,363,364,3,134,67,0,364,365,5,126,0,0,365,366,3,134,67,0,366, + 367,5,131,0,0,367,368,5,95,0,0,368,369,5,78,0,0,369,371,3,152,76, + 0,370,372,3,66,33,0,371,370,1,0,0,0,371,372,1,0,0,0,372,373,1,0, + 0,0,373,374,5,128,0,0,374,375,5,132,0,0,375,37,1,0,0,0,376,378,3, + 44,22,0,377,376,1,0,0,0,377,378,1,0,0,0,378,379,1,0,0,0,379,380, + 5,42,0,0,380,381,3,150,75,0,381,382,5,78,0,0,382,383,3,152,76,0, + 383,384,5,127,0,0,384,385,3,134,67,0,385,389,5,131,0,0,386,388,3, + 40,20,0,387,386,1,0,0,0,388,391,1,0,0,0,389,387,1,0,0,0,389,390, + 1,0,0,0,390,392,1,0,0,0,391,389,1,0,0,0,392,393,5,132,0,0,393,39, + 1,0,0,0,394,395,5,85,0,0,395,396,5,78,0,0,396,398,3,152,76,0,397, + 399,3,66,33,0,398,397,1,0,0,0,398,399,1,0,0,0,399,400,1,0,0,0,400, + 401,5,128,0,0,401,428,1,0,0,0,402,403,5,86,0,0,403,404,5,78,0,0, + 404,406,3,152,76,0,405,407,3,66,33,0,406,405,1,0,0,0,406,407,1,0, + 0,0,407,408,1,0,0,0,408,409,5,128,0,0,409,428,1,0,0,0,410,411,5, + 1,0,0,411,412,5,78,0,0,412,414,3,152,76,0,413,415,3,66,33,0,414, + 413,1,0,0,0,414,415,1,0,0,0,415,416,1,0,0,0,416,417,5,128,0,0,417, + 428,1,0,0,0,418,419,5,87,0,0,419,420,5,88,0,0,420,421,5,78,0,0,421, + 422,3,152,76,0,422,423,5,89,0,0,423,424,5,78,0,0,424,425,3,152,76, + 0,425,426,5,128,0,0,426,428,1,0,0,0,427,394,1,0,0,0,427,402,1,0, + 0,0,427,410,1,0,0,0,427,418,1,0,0,0,428,41,1,0,0,0,429,431,3,44, + 22,0,430,429,1,0,0,0,430,431,1,0,0,0,431,432,1,0,0,0,432,433,5,43, + 0,0,433,434,3,150,75,0,434,435,5,78,0,0,435,436,3,152,76,0,436,437, + 5,127,0,0,437,438,3,140,70,0,438,440,3,48,24,0,439,441,5,106,0,0, + 440,439,1,0,0,0,440,441,1,0,0,0,441,444,1,0,0,0,442,443,5,76,0,0, + 443,445,3,152,76,0,444,442,1,0,0,0,444,445,1,0,0,0,445,446,1,0,0, + 0,446,450,5,131,0,0,447,449,3,46,23,0,448,447,1,0,0,0,449,452,1, + 0,0,0,450,448,1,0,0,0,450,451,1,0,0,0,451,453,1,0,0,0,452,450,1, + 0,0,0,453,454,5,132,0,0,454,43,1,0,0,0,455,457,5,27,0,0,456,458, + 7,0,0,0,457,456,1,0,0,0,457,458,1,0,0,0,458,45,1,0,0,0,459,460,5, + 92,0,0,460,461,5,78,0,0,461,463,3,152,76,0,462,464,3,66,33,0,463, + 462,1,0,0,0,463,464,1,0,0,0,464,465,1,0,0,0,465,466,5,128,0,0,466, + 493,1,0,0,0,467,468,5,93,0,0,468,469,5,78,0,0,469,471,3,152,76,0, + 470,472,3,66,33,0,471,470,1,0,0,0,471,472,1,0,0,0,472,473,1,0,0, + 0,473,474,5,128,0,0,474,493,1,0,0,0,475,476,5,94,0,0,476,477,5,78, + 0,0,477,479,3,152,76,0,478,480,3,66,33,0,479,478,1,0,0,0,479,480, + 1,0,0,0,480,481,1,0,0,0,481,482,5,128,0,0,482,493,1,0,0,0,483,484, + 5,87,0,0,484,485,5,88,0,0,485,486,5,78,0,0,486,487,3,152,76,0,487, + 488,5,89,0,0,488,489,5,78,0,0,489,490,3,152,76,0,490,491,5,128,0, + 0,491,493,1,0,0,0,492,459,1,0,0,0,492,467,1,0,0,0,492,475,1,0,0, + 0,492,483,1,0,0,0,493,47,1,0,0,0,494,495,5,38,0,0,495,504,3,150, + 75,0,496,497,5,39,0,0,497,499,3,150,75,0,498,500,3,28,14,0,499,498, + 1,0,0,0,499,500,1,0,0,0,500,504,1,0,0,0,501,502,5,31,0,0,502,504, + 3,150,75,0,503,494,1,0,0,0,503,496,1,0,0,0,503,501,1,0,0,0,504,49, + 1,0,0,0,505,507,3,16,8,0,506,505,1,0,0,0,507,510,1,0,0,0,508,506, + 1,0,0,0,508,509,1,0,0,0,509,511,1,0,0,0,510,508,1,0,0,0,511,512, + 5,41,0,0,512,513,3,150,75,0,513,514,5,78,0,0,514,515,3,152,76,0, + 515,516,5,72,0,0,516,519,3,152,76,0,517,518,5,73,0,0,518,520,5,141, + 0,0,519,517,1,0,0,0,519,520,1,0,0,0,520,521,1,0,0,0,521,525,5,131, + 0,0,522,524,3,52,26,0,523,522,1,0,0,0,524,527,1,0,0,0,525,523,1, + 0,0,0,525,526,1,0,0,0,526,528,1,0,0,0,527,525,1,0,0,0,528,529,5, + 132,0,0,529,51,1,0,0,0,530,536,3,60,30,0,531,536,3,62,31,0,532,536, + 3,70,35,0,533,536,3,54,27,0,534,536,3,56,28,0,535,530,1,0,0,0,535, + 531,1,0,0,0,535,532,1,0,0,0,535,533,1,0,0,0,535,534,1,0,0,0,536, + 53,1,0,0,0,537,538,5,17,0,0,538,540,3,150,75,0,539,541,3,22,11,0, + 540,539,1,0,0,0,540,541,1,0,0,0,541,542,1,0,0,0,542,543,5,78,0,0, + 543,544,3,152,76,0,544,546,5,20,0,0,545,547,5,4,0,0,546,545,1,0, + 0,0,546,547,1,0,0,0,547,548,1,0,0,0,548,549,3,26,13,0,549,550,5, + 21,0,0,550,551,3,152,76,0,551,552,5,44,0,0,552,553,3,152,76,0,553, + 557,5,131,0,0,554,556,3,58,29,0,555,554,1,0,0,0,556,559,1,0,0,0, + 557,555,1,0,0,0,557,558,1,0,0,0,558,560,1,0,0,0,559,557,1,0,0,0, + 560,561,5,132,0,0,561,55,1,0,0,0,562,563,5,17,0,0,563,564,3,150, + 75,0,564,565,5,78,0,0,565,566,3,152,76,0,566,567,5,19,0,0,567,568, + 3,150,75,0,568,569,3,28,14,0,569,570,5,128,0,0,570,57,1,0,0,0,571, + 572,5,11,0,0,572,612,5,128,0,0,573,574,5,12,0,0,574,575,5,13,0,0, + 575,576,3,150,75,0,576,577,5,128,0,0,577,612,1,0,0,0,578,579,5,22, + 0,0,579,580,3,152,76,0,580,581,5,128,0,0,581,612,1,0,0,0,582,584, + 5,23,0,0,583,585,5,31,0,0,584,583,1,0,0,0,584,585,1,0,0,0,585,586, + 1,0,0,0,586,587,3,150,75,0,587,588,5,50,0,0,588,589,3,26,13,0,589, + 590,5,128,0,0,590,612,1,0,0,0,591,592,5,24,0,0,592,593,3,150,75, + 0,593,594,5,141,0,0,594,595,5,128,0,0,595,612,1,0,0,0,596,597,5, + 25,0,0,597,598,3,26,13,0,598,599,5,130,0,0,599,600,3,150,75,0,600, + 601,3,150,75,0,601,602,3,152,76,0,602,603,5,128,0,0,603,612,1,0, + 0,0,604,605,5,87,0,0,605,612,5,128,0,0,606,607,5,26,0,0,607,608, + 5,141,0,0,608,609,3,152,76,0,609,610,5,128,0,0,610,612,1,0,0,0,611, + 571,1,0,0,0,611,573,1,0,0,0,611,578,1,0,0,0,611,582,1,0,0,0,611, + 591,1,0,0,0,611,596,1,0,0,0,611,604,1,0,0,0,611,606,1,0,0,0,612, + 59,1,0,0,0,613,614,5,44,0,0,614,616,3,150,75,0,615,617,3,22,11,0, + 616,615,1,0,0,0,616,617,1,0,0,0,617,618,1,0,0,0,618,619,5,78,0,0, + 619,620,3,152,76,0,620,621,5,127,0,0,621,622,3,134,67,0,622,623, + 5,126,0,0,623,624,3,134,67,0,624,625,5,80,0,0,625,627,3,74,37,0, + 626,628,3,66,33,0,627,626,1,0,0,0,627,628,1,0,0,0,628,630,1,0,0, + 0,629,631,3,72,36,0,630,629,1,0,0,0,630,631,1,0,0,0,631,632,1,0, + 0,0,632,633,5,82,0,0,633,635,3,76,38,0,634,636,3,80,40,0,635,634, + 1,0,0,0,635,636,1,0,0,0,636,638,1,0,0,0,637,639,3,64,32,0,638,637, + 1,0,0,0,638,639,1,0,0,0,639,640,1,0,0,0,640,641,5,128,0,0,641,61, + 1,0,0,0,642,643,5,45,0,0,643,645,3,150,75,0,644,646,3,22,11,0,645, + 644,1,0,0,0,645,646,1,0,0,0,646,647,1,0,0,0,647,648,5,78,0,0,648, + 649,3,152,76,0,649,650,5,127,0,0,650,651,3,134,67,0,651,652,5,126, + 0,0,652,654,3,134,67,0,653,655,3,66,33,0,654,653,1,0,0,0,654,655, + 1,0,0,0,655,657,1,0,0,0,656,658,3,80,40,0,657,656,1,0,0,0,657,658, + 1,0,0,0,658,660,1,0,0,0,659,661,3,64,32,0,660,659,1,0,0,0,660,661, + 1,0,0,0,661,662,1,0,0,0,662,663,5,128,0,0,663,63,1,0,0,0,664,665, + 5,61,0,0,665,666,5,60,0,0,666,667,3,150,75,0,667,65,1,0,0,0,668, + 669,5,5,0,0,669,678,5,8,0,0,670,671,5,5,0,0,671,672,7,1,0,0,672, + 673,5,9,0,0,673,674,5,133,0,0,674,675,3,78,39,0,675,676,5,134,0, + 0,676,678,1,0,0,0,677,668,1,0,0,0,677,670,1,0,0,0,678,67,1,0,0,0, + 679,680,5,60,0,0,680,681,5,133,0,0,681,686,3,116,58,0,682,683,5, + 129,0,0,683,685,3,116,58,0,684,682,1,0,0,0,685,688,1,0,0,0,686,684, + 1,0,0,0,686,687,1,0,0,0,687,689,1,0,0,0,688,686,1,0,0,0,689,690, + 5,134,0,0,690,69,1,0,0,0,691,692,5,46,0,0,692,693,3,150,75,0,693, + 694,5,78,0,0,694,695,3,152,76,0,695,696,5,47,0,0,696,697,3,150,75, + 0,697,698,5,127,0,0,698,700,3,134,67,0,699,701,3,80,40,0,700,699, + 1,0,0,0,700,701,1,0,0,0,701,702,1,0,0,0,702,703,5,128,0,0,703,71, + 1,0,0,0,704,705,5,81,0,0,705,706,3,134,67,0,706,73,1,0,0,0,707,708, + 7,2,0,0,708,75,1,0,0,0,709,728,5,84,0,0,710,711,5,38,0,0,711,728, + 3,150,75,0,712,713,5,31,0,0,713,728,3,150,75,0,714,715,5,40,0,0, + 715,724,5,133,0,0,716,721,3,26,13,0,717,718,5,129,0,0,718,720,3, + 26,13,0,719,717,1,0,0,0,720,723,1,0,0,0,721,719,1,0,0,0,721,722, + 1,0,0,0,722,725,1,0,0,0,723,721,1,0,0,0,724,716,1,0,0,0,724,725, + 1,0,0,0,725,726,1,0,0,0,726,728,5,134,0,0,727,709,1,0,0,0,727,710, + 1,0,0,0,727,712,1,0,0,0,727,714,1,0,0,0,728,77,1,0,0,0,729,734,3, + 150,75,0,730,731,5,129,0,0,731,733,3,150,75,0,732,730,1,0,0,0,733, + 736,1,0,0,0,734,732,1,0,0,0,734,735,1,0,0,0,735,79,1,0,0,0,736,734, + 1,0,0,0,737,738,5,83,0,0,738,742,5,131,0,0,739,741,3,82,41,0,740, + 739,1,0,0,0,741,744,1,0,0,0,742,740,1,0,0,0,742,743,1,0,0,0,743, + 745,1,0,0,0,744,742,1,0,0,0,745,746,5,132,0,0,746,81,1,0,0,0,747, + 748,5,18,0,0,748,749,3,150,75,0,749,750,5,78,0,0,750,751,3,152,76, + 0,751,752,5,133,0,0,752,753,3,78,39,0,753,754,5,134,0,0,754,755, + 5,128,0,0,755,826,1,0,0,0,756,757,5,56,0,0,757,758,3,150,75,0,758, + 759,5,78,0,0,759,760,3,152,76,0,760,761,5,127,0,0,761,762,3,134, + 67,0,762,763,3,84,42,0,763,764,5,128,0,0,764,826,1,0,0,0,765,766, + 5,57,0,0,766,767,3,150,75,0,767,768,5,78,0,0,768,769,3,152,76,0, + 769,770,5,127,0,0,770,771,3,140,70,0,771,772,3,48,24,0,772,773,3, + 84,42,0,773,774,5,128,0,0,774,826,1,0,0,0,775,776,5,39,0,0,776,777, + 3,150,75,0,777,778,5,78,0,0,778,779,3,152,76,0,779,780,5,127,0,0, + 780,782,3,150,75,0,781,783,3,28,14,0,782,781,1,0,0,0,782,783,1,0, + 0,0,783,785,1,0,0,0,784,786,3,68,34,0,785,784,1,0,0,0,785,786,1, + 0,0,0,786,789,1,0,0,0,787,788,5,13,0,0,788,790,5,48,0,0,789,787, + 1,0,0,0,789,790,1,0,0,0,790,791,1,0,0,0,791,792,5,128,0,0,792,826, + 1,0,0,0,793,794,5,2,0,0,794,795,3,150,75,0,795,796,5,78,0,0,796, + 797,3,152,76,0,797,798,5,127,0,0,798,799,3,150,75,0,799,800,5,48, + 0,0,800,801,3,134,67,0,801,802,5,128,0,0,802,826,1,0,0,0,803,804, + 5,46,0,0,804,805,3,150,75,0,805,806,5,78,0,0,806,807,3,152,76,0, + 807,808,5,127,0,0,808,811,3,150,75,0,809,810,5,48,0,0,810,812,3, + 134,67,0,811,809,1,0,0,0,811,812,1,0,0,0,812,813,1,0,0,0,813,814, + 5,128,0,0,814,826,1,0,0,0,815,816,5,17,0,0,816,817,3,150,75,0,817, + 818,5,78,0,0,818,819,3,152,76,0,819,820,5,127,0,0,820,821,3,150, + 75,0,821,822,5,130,0,0,822,823,3,150,75,0,823,824,5,128,0,0,824, + 826,1,0,0,0,825,747,1,0,0,0,825,756,1,0,0,0,825,765,1,0,0,0,825, + 775,1,0,0,0,825,793,1,0,0,0,825,803,1,0,0,0,825,815,1,0,0,0,826, + 83,1,0,0,0,827,828,5,133,0,0,828,833,3,86,43,0,829,830,5,129,0,0, + 830,832,3,86,43,0,831,829,1,0,0,0,832,835,1,0,0,0,833,831,1,0,0, + 0,833,834,1,0,0,0,834,836,1,0,0,0,835,833,1,0,0,0,836,837,5,134, + 0,0,837,85,1,0,0,0,838,839,7,3,0,0,839,87,1,0,0,0,840,841,5,55,0, + 0,841,842,3,90,45,0,842,89,1,0,0,0,843,846,3,92,46,0,844,846,3,96, + 48,0,845,843,1,0,0,0,845,844,1,0,0,0,846,91,1,0,0,0,847,848,5,56, + 0,0,848,849,3,150,75,0,849,850,5,78,0,0,850,851,3,152,76,0,851,852, + 5,66,0,0,852,853,3,150,75,0,853,854,5,127,0,0,854,855,3,134,67,0, + 855,856,5,67,0,0,856,859,3,94,47,0,857,858,5,68,0,0,858,860,3,142, + 71,0,859,857,1,0,0,0,859,860,1,0,0,0,860,861,1,0,0,0,861,862,5,128, + 0,0,862,93,1,0,0,0,863,870,5,100,0,0,864,865,5,101,0,0,865,866,5, + 135,0,0,866,867,3,134,67,0,867,868,5,136,0,0,868,870,1,0,0,0,869, + 863,1,0,0,0,869,864,1,0,0,0,870,95,1,0,0,0,871,872,5,57,0,0,872, + 873,3,150,75,0,873,874,5,78,0,0,874,875,3,152,76,0,875,876,5,131, + 0,0,876,877,3,98,49,0,877,878,3,98,49,0,878,879,5,132,0,0,879,97, + 1,0,0,0,880,881,3,48,24,0,881,882,5,58,0,0,882,883,3,150,75,0,883, + 884,5,78,0,0,884,885,3,152,76,0,885,887,3,140,70,0,886,888,5,106, + 0,0,887,886,1,0,0,0,887,888,1,0,0,0,888,891,1,0,0,0,889,890,5,74, + 0,0,890,892,3,152,76,0,891,889,1,0,0,0,891,892,1,0,0,0,892,894,1, + 0,0,0,893,895,5,75,0,0,894,893,1,0,0,0,894,895,1,0,0,0,895,898,1, + 0,0,0,896,897,5,76,0,0,897,899,3,152,76,0,898,896,1,0,0,0,898,899, + 1,0,0,0,899,901,1,0,0,0,900,902,5,77,0,0,901,900,1,0,0,0,901,902, + 1,0,0,0,902,903,1,0,0,0,903,904,5,128,0,0,904,99,1,0,0,0,905,906, + 5,49,0,0,906,907,3,150,75,0,907,908,5,50,0,0,908,910,3,150,75,0, + 909,911,3,28,14,0,910,909,1,0,0,0,910,911,1,0,0,0,911,914,1,0,0, + 0,912,913,5,78,0,0,913,915,3,152,76,0,914,912,1,0,0,0,914,915,1, + 0,0,0,915,918,1,0,0,0,916,917,5,73,0,0,917,919,5,141,0,0,918,916, + 1,0,0,0,918,919,1,0,0,0,919,920,1,0,0,0,920,924,5,131,0,0,921,923, + 3,102,51,0,922,921,1,0,0,0,923,926,1,0,0,0,924,922,1,0,0,0,924,925, + 1,0,0,0,925,927,1,0,0,0,926,924,1,0,0,0,927,928,5,132,0,0,928,101, + 1,0,0,0,929,930,5,54,0,0,930,936,3,90,45,0,931,936,3,114,57,0,932, + 936,3,110,55,0,933,936,3,104,52,0,934,936,3,112,56,0,935,929,1,0, + 0,0,935,931,1,0,0,0,935,932,1,0,0,0,935,933,1,0,0,0,935,934,1,0, + 0,0,936,103,1,0,0,0,937,938,5,3,0,0,938,942,5,131,0,0,939,941,3, + 106,53,0,940,939,1,0,0,0,941,944,1,0,0,0,942,940,1,0,0,0,942,943, + 1,0,0,0,943,945,1,0,0,0,944,942,1,0,0,0,945,946,5,132,0,0,946,947, + 5,128,0,0,947,105,1,0,0,0,948,949,3,150,75,0,949,950,5,53,0,0,950, + 951,5,56,0,0,951,952,3,150,75,0,952,953,5,128,0,0,953,963,1,0,0, + 0,954,955,3,150,75,0,955,956,5,53,0,0,956,957,5,57,0,0,957,958,3, + 150,75,0,958,959,5,130,0,0,959,960,3,150,75,0,960,961,5,128,0,0, + 961,963,1,0,0,0,962,948,1,0,0,0,962,954,1,0,0,0,963,107,1,0,0,0, + 964,965,3,26,13,0,965,966,5,13,0,0,966,971,5,48,0,0,967,968,5,130, + 0,0,968,970,3,150,75,0,969,967,1,0,0,0,970,973,1,0,0,0,971,969,1, + 0,0,0,971,972,1,0,0,0,972,974,1,0,0,0,973,971,1,0,0,0,974,975,5, + 128,0,0,975,109,1,0,0,0,976,977,5,51,0,0,977,978,3,150,75,0,978, + 979,5,53,0,0,979,980,5,56,0,0,980,981,3,150,75,0,981,982,5,128,0, + 0,982,111,1,0,0,0,983,984,5,63,0,0,984,985,3,150,75,0,985,986,5, + 64,0,0,986,987,5,65,0,0,987,988,5,60,0,0,988,989,5,46,0,0,989,990, + 3,150,75,0,990,991,5,62,0,0,991,992,5,57,0,0,992,993,3,150,75,0, + 993,994,5,130,0,0,994,995,3,150,75,0,995,996,5,128,0,0,996,113,1, + 0,0,0,997,998,5,51,0,0,998,999,3,116,58,0,999,1000,5,53,0,0,1000, + 1003,3,120,60,0,1001,1002,5,29,0,0,1002,1004,3,152,76,0,1003,1001, + 1,0,0,0,1003,1004,1,0,0,0,1004,1005,1,0,0,0,1005,1006,5,128,0,0, + 1006,115,1,0,0,0,1007,1008,3,150,75,0,1008,1009,5,130,0,0,1009,1010, + 3,118,59,0,1010,117,1,0,0,0,1011,1024,3,150,75,0,1012,1024,5,95, + 0,0,1013,1024,5,85,0,0,1014,1024,5,86,0,0,1015,1024,5,1,0,0,1016, + 1024,5,92,0,0,1017,1024,5,93,0,0,1018,1024,5,94,0,0,1019,1024,5, + 96,0,0,1020,1024,5,97,0,0,1021,1024,5,98,0,0,1022,1024,5,99,0,0, + 1023,1011,1,0,0,0,1023,1012,1,0,0,0,1023,1013,1,0,0,0,1023,1014, + 1,0,0,0,1023,1015,1,0,0,0,1023,1016,1,0,0,0,1023,1017,1,0,0,0,1023, + 1018,1,0,0,0,1023,1019,1,0,0,0,1023,1020,1,0,0,0,1023,1021,1,0,0, + 0,1023,1022,1,0,0,0,1024,119,1,0,0,0,1025,1026,5,56,0,0,1026,1027, + 3,150,75,0,1027,1028,5,130,0,0,1028,1029,3,124,62,0,1029,1059,1, + 0,0,0,1030,1031,5,57,0,0,1031,1032,3,150,75,0,1032,1033,5,130,0, + 0,1033,1034,3,150,75,0,1034,1035,5,130,0,0,1035,1036,3,126,63,0, + 1036,1059,1,0,0,0,1037,1038,5,39,0,0,1038,1040,3,150,75,0,1039,1041, + 3,28,14,0,1040,1039,1,0,0,0,1040,1041,1,0,0,0,1041,1042,1,0,0,0, + 1042,1043,5,130,0,0,1043,1044,3,116,58,0,1044,1059,1,0,0,0,1045, + 1046,5,41,0,0,1046,1047,3,150,75,0,1047,1048,5,130,0,0,1048,1050, + 3,150,75,0,1049,1051,3,28,14,0,1050,1049,1,0,0,0,1050,1051,1,0,0, + 0,1051,1053,1,0,0,0,1052,1054,3,128,64,0,1053,1052,1,0,0,0,1053, + 1054,1,0,0,0,1054,1056,1,0,0,0,1055,1057,3,122,61,0,1056,1055,1, + 0,0,0,1056,1057,1,0,0,0,1057,1059,1,0,0,0,1058,1025,1,0,0,0,1058, + 1030,1,0,0,0,1058,1037,1,0,0,0,1058,1045,1,0,0,0,1059,121,1,0,0, + 0,1060,1061,5,61,0,0,1061,1062,3,128,64,0,1062,123,1,0,0,0,1063, + 1064,7,4,0,0,1064,125,1,0,0,0,1065,1066,7,5,0,0,1066,127,1,0,0,0, + 1067,1068,5,59,0,0,1068,1072,5,131,0,0,1069,1071,3,130,65,0,1070, + 1069,1,0,0,0,1071,1074,1,0,0,0,1072,1070,1,0,0,0,1072,1073,1,0,0, + 0,1073,1075,1,0,0,0,1074,1072,1,0,0,0,1075,1076,5,132,0,0,1076,129, + 1,0,0,0,1077,1078,3,150,75,0,1078,1079,5,53,0,0,1079,1080,5,4,0, + 0,1080,1081,5,18,0,0,1081,1082,5,133,0,0,1082,1083,3,78,39,0,1083, + 1084,5,134,0,0,1084,1085,5,128,0,0,1085,1176,1,0,0,0,1086,1087,3, + 150,75,0,1087,1088,5,53,0,0,1088,1089,5,56,0,0,1089,1096,3,150,75, + 0,1090,1091,5,62,0,0,1091,1092,5,57,0,0,1092,1093,3,150,75,0,1093, + 1094,5,130,0,0,1094,1095,3,150,75,0,1095,1097,1,0,0,0,1096,1090, + 1,0,0,0,1096,1097,1,0,0,0,1097,1098,1,0,0,0,1098,1099,5,128,0,0, + 1099,1176,1,0,0,0,1100,1101,3,150,75,0,1101,1102,5,53,0,0,1102,1103, + 5,57,0,0,1103,1104,3,150,75,0,1104,1105,5,130,0,0,1105,1112,3,150, + 75,0,1106,1107,5,62,0,0,1107,1108,5,57,0,0,1108,1109,3,150,75,0, + 1109,1110,5,130,0,0,1110,1111,3,150,75,0,1111,1113,1,0,0,0,1112, + 1106,1,0,0,0,1112,1113,1,0,0,0,1113,1114,1,0,0,0,1114,1115,5,128, + 0,0,1115,1176,1,0,0,0,1116,1117,3,150,75,0,1117,1118,5,53,0,0,1118, + 1119,5,39,0,0,1119,1121,3,150,75,0,1120,1122,3,28,14,0,1121,1120, + 1,0,0,0,1121,1122,1,0,0,0,1122,1131,1,0,0,0,1123,1124,5,62,0,0,1124, + 1125,5,57,0,0,1125,1126,3,150,75,0,1126,1127,5,130,0,0,1127,1128, + 3,150,75,0,1128,1132,1,0,0,0,1129,1130,5,13,0,0,1130,1132,5,48,0, + 0,1131,1123,1,0,0,0,1131,1129,1,0,0,0,1131,1132,1,0,0,0,1132,1133, + 1,0,0,0,1133,1134,5,128,0,0,1134,1176,1,0,0,0,1135,1136,3,150,75, + 0,1136,1137,5,53,0,0,1137,1138,5,2,0,0,1138,1139,3,150,75,0,1139, + 1140,5,59,0,0,1140,1144,5,131,0,0,1141,1143,3,108,54,0,1142,1141, + 1,0,0,0,1143,1146,1,0,0,0,1144,1142,1,0,0,0,1144,1145,1,0,0,0,1145, + 1147,1,0,0,0,1146,1144,1,0,0,0,1147,1148,5,132,0,0,1148,1149,5,128, + 0,0,1149,1176,1,0,0,0,1150,1151,3,150,75,0,1151,1152,5,53,0,0,1152, + 1153,5,46,0,0,1153,1154,3,150,75,0,1154,1155,5,128,0,0,1155,1176, + 1,0,0,0,1156,1157,3,150,75,0,1157,1159,5,53,0,0,1158,1160,5,4,0, + 0,1159,1158,1,0,0,0,1159,1160,1,0,0,0,1160,1161,1,0,0,0,1161,1162, + 5,17,0,0,1162,1163,3,150,75,0,1163,1164,5,130,0,0,1164,1171,3,150, + 75,0,1165,1166,5,62,0,0,1166,1167,5,57,0,0,1167,1168,3,150,75,0, + 1168,1169,5,130,0,0,1169,1170,3,150,75,0,1170,1172,1,0,0,0,1171, + 1165,1,0,0,0,1171,1172,1,0,0,0,1172,1173,1,0,0,0,1173,1174,5,128, + 0,0,1174,1176,1,0,0,0,1175,1077,1,0,0,0,1175,1086,1,0,0,0,1175,1100, + 1,0,0,0,1175,1116,1,0,0,0,1175,1135,1,0,0,0,1175,1150,1,0,0,0,1175, + 1156,1,0,0,0,1176,131,1,0,0,0,1177,1178,5,46,0,0,1178,1179,3,150, + 75,0,1179,1180,5,53,0,0,1180,1181,3,150,75,0,1181,1182,5,130,0,0, + 1182,1184,3,150,75,0,1183,1185,3,128,64,0,1184,1183,1,0,0,0,1184, + 1185,1,0,0,0,1185,1186,1,0,0,0,1186,1187,5,128,0,0,1187,133,1,0, + 0,0,1188,1235,3,138,69,0,1189,1235,5,107,0,0,1190,1235,5,108,0,0, + 1191,1192,5,109,0,0,1192,1235,3,152,76,0,1193,1194,5,110,0,0,1194, + 1195,5,137,0,0,1195,1196,3,150,75,0,1196,1197,5,138,0,0,1197,1235, + 1,0,0,0,1198,1199,5,111,0,0,1199,1200,5,137,0,0,1200,1202,3,150, + 75,0,1201,1203,3,28,14,0,1202,1201,1,0,0,0,1202,1203,1,0,0,0,1203, + 1204,1,0,0,0,1204,1205,5,138,0,0,1205,1235,1,0,0,0,1206,1207,5,34, + 0,0,1207,1208,5,137,0,0,1208,1209,3,150,75,0,1209,1210,5,138,0,0, + 1210,1235,1,0,0,0,1211,1212,5,112,0,0,1212,1213,5,137,0,0,1213,1214, + 3,134,67,0,1214,1215,5,138,0,0,1215,1235,1,0,0,0,1216,1217,5,113, + 0,0,1217,1218,5,137,0,0,1218,1219,3,134,67,0,1219,1220,5,138,0,0, + 1220,1235,1,0,0,0,1221,1222,5,114,0,0,1222,1226,5,131,0,0,1223,1225, + 3,136,68,0,1224,1223,1,0,0,0,1225,1228,1,0,0,0,1226,1224,1,0,0,0, + 1226,1227,1,0,0,0,1227,1229,1,0,0,0,1228,1226,1,0,0,0,1229,1235, + 5,132,0,0,1230,1232,3,150,75,0,1231,1233,3,28,14,0,1232,1231,1,0, + 0,0,1232,1233,1,0,0,0,1233,1235,1,0,0,0,1234,1188,1,0,0,0,1234,1189, + 1,0,0,0,1234,1190,1,0,0,0,1234,1191,1,0,0,0,1234,1193,1,0,0,0,1234, + 1198,1,0,0,0,1234,1206,1,0,0,0,1234,1211,1,0,0,0,1234,1216,1,0,0, + 0,1234,1221,1,0,0,0,1234,1230,1,0,0,0,1235,135,1,0,0,0,1236,1237, + 3,150,75,0,1237,1238,5,127,0,0,1238,1239,3,134,67,0,1239,1240,5, + 128,0,0,1240,137,1,0,0,0,1241,1242,7,6,0,0,1242,139,1,0,0,0,1243, + 1244,7,7,0,0,1244,141,1,0,0,0,1245,1254,3,152,76,0,1246,1254,5,141, + 0,0,1247,1254,5,142,0,0,1248,1254,5,123,0,0,1249,1254,5,124,0,0, + 1250,1254,5,125,0,0,1251,1254,3,144,72,0,1252,1254,3,148,74,0,1253, + 1245,1,0,0,0,1253,1246,1,0,0,0,1253,1247,1,0,0,0,1253,1248,1,0,0, + 0,1253,1249,1,0,0,0,1253,1250,1,0,0,0,1253,1251,1,0,0,0,1253,1252, + 1,0,0,0,1254,143,1,0,0,0,1255,1264,5,131,0,0,1256,1261,3,146,73, + 0,1257,1258,5,129,0,0,1258,1260,3,146,73,0,1259,1257,1,0,0,0,1260, + 1263,1,0,0,0,1261,1259,1,0,0,0,1261,1262,1,0,0,0,1262,1265,1,0,0, + 0,1263,1261,1,0,0,0,1264,1256,1,0,0,0,1264,1265,1,0,0,0,1265,1266, + 1,0,0,0,1266,1267,5,132,0,0,1267,145,1,0,0,0,1268,1269,3,152,76, + 0,1269,1270,5,127,0,0,1270,1271,3,142,71,0,1271,147,1,0,0,0,1272, + 1281,5,133,0,0,1273,1278,3,142,71,0,1274,1275,5,129,0,0,1275,1277, + 3,142,71,0,1276,1274,1,0,0,0,1277,1280,1,0,0,0,1278,1276,1,0,0,0, + 1278,1279,1,0,0,0,1279,1282,1,0,0,0,1280,1278,1,0,0,0,1281,1273, + 1,0,0,0,1281,1282,1,0,0,0,1282,1283,1,0,0,0,1283,1284,5,134,0,0, + 1284,149,1,0,0,0,1285,1286,7,8,0,0,1286,151,1,0,0,0,1287,1288,5, + 144,0,0,1288,153,1,0,0,0,115,166,173,194,206,218,238,246,253,259, 271,274,280,291,300,310,313,315,319,327,339,344,353,356,371,377, 389,398,406,414,427,430,440,444,450,457,463,471,479,492,499,503, 508,519,525,535,540,546,557,584,611,616,627,630,635,638,645,654, - 657,660,677,686,700,721,724,727,734,742,782,785,807,821,829,841, - 855,865,883,887,890,894,897,906,910,914,920,931,938,958,967,999, - 1019,1036,1046,1049,1052,1054,1068,1092,1108,1117,1125,1138,1153, - 1165,1169,1178,1196,1220,1226,1228,1247,1255,1258,1272,1275 + 657,660,677,686,700,721,724,727,734,742,782,785,789,811,825,833, + 845,859,869,887,891,894,898,901,910,914,918,924,935,942,962,971, + 1003,1023,1040,1050,1053,1056,1058,1072,1096,1112,1121,1131,1144, + 1159,1171,1175,1184,1202,1226,1232,1234,1253,1261,1264,1278,1281 ]; private static __ATN: antlr.ATN; @@ -7455,12 +7486,15 @@ export class DependencyPortContext extends antlr.ParserRuleContext { public selectedOperations(): SelectedOperationsContext | null { return this.getRuleContext(0, SelectedOperationsContext); } - public CREATION(): antlr.TerminalNode | null { - return this.getToken(QuixosCapabilityParser.CREATION, 0); + public FROM(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.FROM, 0); } public INPUT(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.INPUT, 0); } + public CREATION(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.CREATION, 0); + } public CONSTRUCTOR(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.CONSTRUCTOR, 0); } @@ -8487,6 +8521,12 @@ export class DependencyBindingContext extends antlr.ParserRuleContext { public typeArguments(): TypeArgumentsContext | null { return this.getRuleContext(0, TypeArgumentsContext); } + public FROM(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.FROM, 0); + } + public INPUT(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.INPUT, 0); + } public CREATION(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.CREATION, 0); } diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index 559e679..fee0496 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -1020,6 +1020,7 @@ const lowerDependencyPort = (state: LoweringState, context: DependencyPortContex kind: "interface", interfaceRevisionId: target.revisionId, ...lowerSelectedOperations(state, context, target), + ...(context.FROM() ? { receiver: "input" as const } : {}), }, } : undefined; @@ -1241,6 +1242,7 @@ const lowerGenericPackageExport = ( kind: "interface", application: state.types.interfaceByName(identifier(port.identifier(1)), port.typeArguments()), ...lowerSelectedOperations(state, port, state.interfaces.get(identifier(port.identifier(1)))), + ...(port.FROM() ? { receiver: "input" as const } : {}), }, }; const name = identifier(port.identifier(1)), @@ -1817,6 +1819,7 @@ const lowerBoundDependencies = ( binding: { kind: "interface", interfaceRevisionId: interfaceSymbol.revisionId, + ...(entry.FROM() ? { receiver: "input" as const } : {}), ...(via ? { via } : {}), }, }, diff --git a/src/capability-model/execution.ts b/src/capability-model/execution.ts index 563db18..071b192 100644 --- a/src/capability-model/execution.ts +++ b/src/capability-model/execution.ts @@ -66,6 +66,23 @@ export function validateExecutionContracts(workspace: WorkspaceRevision): Capabi : requirement.application.definitionId, ); const selected = requirement.operations; + if (requirement.receiver === "input") { + if ( + entry.execution?.kind !== "snapshot" || + entry.execution.targets.length !== 1 || + entry.execution.targets[0] !== "server" || + !selected?.length + ) + fail( + portPath, + "Reference-selected reads currently require a server-only snapshot and an explicit selection; local acquisition of dynamic inputs is not implemented", + ); + for (const id of selected ?? []) { + const operation = contract && operations(id, contract); + if (operation?.execution?.kind !== "snapshot" || operation.scope === "class") + fail(portPath, "Reference-selected dependencies currently support object snapshot operations only"); + } + } if (selected && (!selected.length || new Set(selected).size !== selected.length)) fail(portPath, "Selected interface operations must be nonempty and distinct"); for (const id of selected ?? []) diff --git a/src/capability-model/generic-packages.ts b/src/capability-model/generic-packages.ts index 6151772..a71f0e7 100644 --- a/src/capability-model/generic-packages.ts +++ b/src/capability-model/generic-packages.ts @@ -38,6 +38,7 @@ export type GenericDependencyPort = Omit & { kind: "interface"; application: InterfaceApplicationExpression; operations?: import("./types.js").OperationId[]; + receiver?: "input"; } | { kind: "creation"; target: ObjectTypeExpression; inputType: ValueTypeExpression } | { kind: "constructor"; target: ObjectTypeExpression; inputType: ValueTypeExpression }; @@ -100,6 +101,7 @@ export const specializePackageExport = ( kind: "interface", interfaceRevisionId: substitution.application(requirement.application), ...(requirement.operations ? { operations: requirement.operations } : {}), + ...(requirement.receiver ? { receiver: requirement.receiver } : {}), }, }; case "creation": diff --git a/src/capability-model/types.ts b/src/capability-model/types.ts index 6bd7a0e..1bb0ded 100644 --- a/src/capability-model/types.ts +++ b/src/capability-model/types.ts @@ -246,6 +246,7 @@ export type DependencyPortRequirement = interfaceRevisionId: InterfaceRevisionId; /** Exact public operation identities, not implementation export names. */ operations?: OperationId[]; + receiver?: "input"; } | { kind: "creation"; atomId: AtomId; inputType: ValueType } | { kind: "constructor"; atomId: AtomId; inputType?: ValueType }; @@ -323,6 +324,7 @@ export type DependencyBinding = kind: "interface"; interfaceRevisionId: InterfaceRevisionId; via?: EdgeTraversal; + receiver?: "input"; } | { kind: "creation"; diff --git a/src/capability-model/validation.ts b/src/capability-model/validation.ts index 4adbb85..3841d51 100644 --- a/src/capability-model/validation.ts +++ b/src/capability-model/validation.ts @@ -1418,6 +1418,15 @@ const validateBoundDependencies = ( } case "interface": { const interfaceBinding = binding as Extract; + if (interfaceBinding.receiver !== requirement.receiver || (interfaceBinding.receiver && interfaceBinding.via)) { + issue( + issues, + "invalid-dependency-binding", + path, + "Reference-selected interface ports require an explicit matching from input binding", + ); + break; + } if (interfaceBinding.interfaceRevisionId !== requirement.interfaceRevisionId) { issue( issues, @@ -1427,6 +1436,9 @@ const validateBoundDependencies = ( ); break; } + // The reference supplies its own checked witness at invocation time. + // This is not a requirement that the current receiver implements the interface. + if (interfaceBinding.receiver === "input") break; const traversal = interfaceBinding.via ? validateTraversal( issues, diff --git a/src/execution-world/kernel.ts b/src/execution-world/kernel.ts index 1f6bc70..def6a73 100644 --- a/src/execution-world/kernel.ts +++ b/src/execution-world/kernel.ts @@ -136,6 +136,7 @@ export function compileKernelProgram(plan: ExecutionPlan): unknown { ...common, kind: "interface", interface: bound.interfaceRevisionId, + ...(bound.receiver ? { receiver: bound.receiver } : {}), operations: requirement.operations ?? iface.members.flatMap((m) => m.operations.map((o) => o.id)), }; } diff --git a/src/execution-world/plan.ts b/src/execution-world/plan.ts index 1372ee7..4bf128d 100644 --- a/src/execution-world/plan.ts +++ b/src/execution-world/plan.ts @@ -162,6 +162,15 @@ export function compileExecutionPlan(input: WorkspaceRevision): ExecutionPlan { const queryOperations = (query: LinkedQuery) => query.fields.map((f) => publicOperationKey(f.atomId, f.interfaceRevisionId, f.getter)); const targetAtoms = (binding: DependencyBinding, atom: AtomId): AtomId[] => { + if (binding.kind === "interface" && binding.receiver === "input") + return workspace.atoms + .filter((candidate) => + workspace.conformances.some( + (conformance) => + conformance.atomId === candidate.id && conformance.interfaceRevisionId === binding.interfaceRevisionId, + ), + ) + .map((candidate) => candidate.id); if (!("via" in binding) || !binding.via) return [atom]; const edge = attachments.find((a) => a.id === binding.via!.edgeTypeId); if (!edge || edge.kind !== "edge") throw new ExecutionPlanError("MISSING_EDGE", atom, "Missing traversal edge"); diff --git a/test/reference-dependencies.test.ts b/test/reference-dependencies.test.ts new file mode 100644 index 0000000..cb050be --- /dev/null +++ b/test/reference-dependencies.test.ts @@ -0,0 +1,89 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/parser.js"; +import { compileExecutionPlan, compileKernelProgram } from "../src/execution-world/index.js"; +import { generatePortableTypeScriptBindings } from "../src/bindings/portable.js"; +import { formatQx } from "../src/capability-language/source.js"; +const source = { repository: "https://example.test/reference.git", commit: "a".repeat(40) }; +const iface = `interface Data id "data" revision "data@1" { + value content id "content" : string { get id "content:get" execution snapshot targets [server]; } + operation peek id "peek" : interface-ref -> string { call id "peek:call" execution snapshot targets [server]; } +}`; +const pkg = `external atom Item id "item"; +import interface Data; +package Runtime id "runtime" revision "runtime@1" { + operation peek id "runtime:peek" : interface-ref -> string mode call execution snapshot targets [server] + receiver atom Item requires { interface peers id "peers" : Data using [content.get] from input; }; +}`; +const workspace = `workspace Test id "workspace:test" revision "workspace:test@1" commit "${"a".repeat(40)}" { + import interface Data; import package Runtime; atom Item id "item"; + conform Item as Data id "item:data" { + private state Content id "content" on Item : string policy register default "hello"; + bind content.get to state Content.read; + bind peek.call to package Runtime.peek with { peers to interface Data from input; }; + } +}`; +function compile(packageSource = pkg, workspaceSource = workspace) { + const contract = compileCapabilityResourceSource(iface, { source }); + assert.ok(contract.ok && contract.resource.kind === "interface", JSON.stringify(contract.diagnostics)); + const interfaces = new Map([["Data", contract.resource.revision]]); + const runtime = compileCapabilityResourceSource(packageSource, { source, environment: { interfaces } }); + if (!runtime.ok) return runtime; + assert.equal(runtime.resource.kind, "package"); + if (runtime.resource.kind !== "package") throw Error("Expected package"); + return compileCapabilitySource(workspaceSource, "workspace.qx", { + interfaces, + packages: new Map([["Runtime", runtime.resource.revision]]), + }); +} +test("reference-selected dependencies round trip and do not require a recursive receiver conformance", () => { + const result = compile(formatQx(pkg), formatQx(workspace)); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const plan = compileExecutionPlan(result.workspace); + const kernel = compileKernelProgram(plan) as { + operations: { operation: string; binding: { ports: { receiver?: string }[] } }[]; + }; + assert.equal(kernel.operations.find((op) => op.operation === "peek:call")!.binding.ports[0]!.receiver, "input"); + const peek = plan.definition.operations.find((op) => op.operationId === "peek:call")!; + assert.ok( + peek.dependencies.some( + (dependency) => dependency.kind === "operation" && dependency.operation.includes("content:get"), + ), + ); + const generated = generatePortableTypeScriptBindings(plan.definition.bindingSchema, "runtime@1", { + target: "server", + }); + assert.ok(generated.includes('ManagedReference<"interface", "data@1">')); + assert.ok(generated.includes('"receiver"')); +}); +test("both sides explicitly grant reference selection and only object snapshots are permitted", () => { + assert.equal(compile(pkg, workspace.replace("Data from input", "Data")).ok, false); + assert.equal(compile(pkg.replace(" from input", ""), workspace).ok, false); + assert.equal(compile(pkg.replace("execution snapshot targets [server]", "execution remote"), workspace).ok, false); + assert.equal(compile(pkg.replace("using [content.get]", "")).ok, false); +}); +test("closed generic specialization preserves reference-selected interface ports", () => { + const result = compile( + pkg.replace("operation peek id", "operation peek id"), + workspace.replace("Runtime.peek with", "Runtime.peek with"), + ); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const plan = compileExecutionPlan(result.workspace); + const entry = plan.definition.bindingSchema.packages[0]!.exports[0]!; + assert.ok( + entry.dependencyPorts.some( + (port) => port.requirement.kind === "interface" && port.requirement.receiver === "input", + ), + ); + assert.ok( + generatePortableTypeScriptBindings(plan.definition.bindingSchema, "runtime@1", { target: "server" }).includes( + '"receiver"', + ), + ); +}); + +test("dynamic reference reads do not promise an unimplemented client input closure", () => { + const result = compile(pkg.replace("targets [server]", "targets [browser, server]")); + assert.equal(result.ok, false); + assert.ok(result.diagnostics.some((diagnostic) => diagnostic.message.includes("local acquisition"))); +}); From d80464d285d8fd633f57f1ae49981b6969d2477a Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 20 Sep 2026 22:15:15 -0700 Subject: [PATCH 29/91] Qualify optimistic tree reparenting with authoritative cycle rejection --- test/emit-portable-reader.ts | 5 +++++ test/fixtures/tree/TreeData.qx | 11 +++++++++++ test/fixtures/tree/TreeRuntime.qx | 13 +++++++++++++ test/fixtures/tree/workspace.qx | 19 +++++++++++++++++++ test/tree-fixture.ts | 23 +++++++++++++++++++++++ 5 files changed, 71 insertions(+) create mode 100644 test/fixtures/tree/TreeData.qx create mode 100644 test/fixtures/tree/TreeRuntime.qx create mode 100644 test/fixtures/tree/workspace.qx create mode 100644 test/tree-fixture.ts diff --git a/test/emit-portable-reader.ts b/test/emit-portable-reader.ts index c3dff3b..90a413f 100644 --- a/test/emit-portable-reader.ts +++ b/test/emit-portable-reader.ts @@ -89,6 +89,11 @@ void negative; ); const { asyncObjectPlan } = await import("./async-fixture.js"); +const { treePlan } = await import("./tree-fixture.js"); +const tree = await treePlan(); +await mkdir("dist/portable-reader/tree", { recursive: true }); +await writeFile("dist/portable-reader/tree/plan.json", JSON.stringify(tree)); +await writeFile("dist/portable-reader/tree/kernel.json", JSON.stringify(compileKernelProgram(tree))); const { compile: compileAcceptance } = await import("./acceptance-fixture.js"); const acceptance = compileAcceptance(); if (!acceptance.ok) throw Error(JSON.stringify(acceptance.diagnostics)); diff --git a/test/fixtures/tree/TreeData.qx b/test/fixtures/tree/TreeData.qx new file mode 100644 index 0000000..701ad50 --- /dev/null +++ b/test/fixtures/tree/TreeData.qx @@ -0,0 +1,11 @@ +interface TreeData id "tree:data" revision "tree:data@1" { + operation reparent id "tree:reparent" : optional> -> unit { + call id "tree:reparent:call" execution transaction targets [browser, server]; + } + queryable relation parent id "tree:parent" : optional-one interface TreeData { + resolve id "tree:parent:resolve" execution snapshot targets [browser, server]; + } + queryable relation children id "tree:children" : many interface TreeData { + resolve id "tree:children:resolve" execution snapshot targets [browser, server]; + } +} diff --git a/test/fixtures/tree/TreeRuntime.qx b/test/fixtures/tree/TreeRuntime.qx new file mode 100644 index 0000000..0e2a489 --- /dev/null +++ b/test/fixtures/tree/TreeRuntime.qx @@ -0,0 +1,13 @@ +external atom Node id "tree:node"; +import interface TreeData; +package TreeRuntime id "tree:runtime" revision "tree:runtime@1" { + operation reparent id "tree:runtime:reparent" : optional> -> unit + mode call execution transaction targets [browser, server] receiver atom Node requires { + edge parent id "tree:move:parent" : optional-one interface TreeData [resolve, connect, disconnect]; + } accept using check; + operation check id "tree:runtime:check" : optional> -> unit + mode call execution snapshot targets [server] receiver atom Node requires { + edge current id "tree:check:current" : optional-one interface TreeData [resolve]; + interface ancestors id "tree:check:ancestors" : TreeData using [parent.resolve] from input; + }; +} diff --git a/test/fixtures/tree/workspace.qx b/test/fixtures/tree/workspace.qx new file mode 100644 index 0000000..f7c41b9 --- /dev/null +++ b/test/fixtures/tree/workspace.qx @@ -0,0 +1,19 @@ +workspace Tree id "workspace:tree" revision "workspace:tree@1" commit "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" { + import interface TreeData; + import package TreeRuntime; + atom Node id "tree:node"; + conform Node as TreeData id "tree:node:data" { + private edge Parent id "tree:parent-edge" { + atom Node projection parent id "tree:parent-projection" optional-one; + interface TreeData projection children id "tree:children-projection" many; + } + bind parent.resolve to edge Parent.parent.resolve; + bind children.resolve to edge Parent.children.resolve; + bind reparent.call to package TreeRuntime.reparent with { + parent to edge Parent.parent; + } accept with { + current to edge Parent.parent; + ancestors to interface TreeData from input; + }; + } +} diff --git a/test/tree-fixture.ts b/test/tree-fixture.ts new file mode 100644 index 0000000..11d30c4 --- /dev/null +++ b/test/tree-fixture.ts @@ -0,0 +1,23 @@ +import assert from "node:assert/strict"; +import { readFile } from "node:fs/promises"; +import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/parser.js"; +import { compileExecutionPlan } from "../src/execution-world/plan.js"; +import type { InterfaceRevision } from "../src/capability-model/types.js"; +export async function treePlan() { + const read = (name: string) => readFile(`test/fixtures/tree/${name}.qx`, "utf8"); + const source = { repository: "https://example.test/tree.git", commit: "a".repeat(40) }; + const interfaces = new Map(); + for (const name of ["TreeData"]) { + const result = compileCapabilityResourceSource(await read(name), { source, environment: { interfaces } }); + assert.ok(result.ok && result.resource.kind === "interface", JSON.stringify(result.diagnostics)); + interfaces.set(name, result.resource.revision); + } + const pkg = compileCapabilityResourceSource(await read("TreeRuntime"), { source, environment: { interfaces } }); + assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); + const result = compileCapabilitySource(await read("workspace"), "workspace.qx", { + interfaces, + packages: new Map([["TreeRuntime", pkg.resource.revision]]), + }); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + return compileExecutionPlan(result.workspace); +} From 115976cacdab5a71ec52cf20354a5bc8c84306d4 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 20 Sep 2026 22:41:51 -0700 Subject: [PATCH 30/91] Expose authoritative lifecycle deletion through capability bindings --- grammar/QuixosCapability.g4 | 4 +- .../generated/QuixosCapability.interp | 4 +- .../generated/QuixosCapability.tokens | 280 +-- .../generated/QuixosCapabilityLexer.interp | 5 +- .../generated/QuixosCapabilityLexer.tokens | 280 +-- .../generated/QuixosCapabilityLexer.ts | 1188 ++++++------ .../generated/QuixosCapabilityParser.ts | 1647 +++++++++-------- src/capability-language/parser.ts | 7 + src/capability-model/evolution.ts | 1 + src/capability-model/execution.ts | 15 +- src/capability-model/types.ts | 1 + src/capability-model/validation.ts | 22 +- src/execution-world/kernel.ts | 13 +- src/execution-world/plan.ts | 2 +- test/lifecycle.test.ts | 66 + 15 files changed, 1837 insertions(+), 1698 deletions(-) create mode 100644 test/lifecycle.test.ts diff --git a/grammar/QuixosCapability.g4 b/grammar/QuixosCapability.g4 index e3eaee2..c2ecf03 100644 --- a/grammar/QuixosCapability.g4 +++ b/grammar/QuixosCapability.g4 @@ -333,7 +333,8 @@ operationName ; operationProvider - : STATE identifier DOT statePrimitive + : LIFECYCLE DOT identifier + | STATE identifier DOT statePrimitive | EDGE identifier DOT identifier DOT edgePrimitive | INTERFACE identifier typeArguments? DOT memberOperationRef | PACKAGE identifier DOT identifier typeArguments? dependencyBindingBlock? acceptanceBinding? @@ -550,6 +551,7 @@ COMMIT: 'commit'; REVISION: 'revision'; SEMANTIC_MAJOR: 'semantic-major'; ON_DELETE: 'on-delete'; +LIFECYCLE: 'lifecycle'; RETAIN_OTHER: 'retain-other'; KEYED: 'keyed'; PUBLIC_TRAVERSAL: 'public-traversal'; diff --git a/src/capability-language/generated/QuixosCapability.interp b/src/capability-language/generated/QuixosCapability.interp index 7349e95..f8c4cf0 100644 --- a/src/capability-language/generated/QuixosCapability.interp +++ b/src/capability-language/generated/QuixosCapability.interp @@ -74,6 +74,7 @@ null 'revision' 'semantic-major' 'on-delete' +'lifecycle' 'retain-other' 'keyed' 'public-traversal' @@ -224,6 +225,7 @@ COMMIT REVISION SEMANTIC_MAJOR ON_DELETE +LIFECYCLE RETAIN_OTHER KEYED PUBLIC_TRAVERSAL @@ -379,4 +381,4 @@ stringLiteral atn: -[4, 1, 147, 1290, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 167, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 172, 8, 1, 10, 1, 12, 1, 175, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 193, 8, 3, 10, 3, 12, 3, 196, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 207, 8, 4, 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, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 239, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 247, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 252, 8, 10, 10, 10, 12, 10, 255, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 260, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 270, 8, 10, 10, 10, 12, 10, 273, 9, 10, 3, 10, 275, 8, 10, 1, 10, 1, 10, 5, 10, 279, 8, 10, 10, 10, 12, 10, 282, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 290, 8, 11, 10, 11, 12, 11, 293, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 301, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 309, 8, 12, 10, 12, 12, 12, 312, 9, 12, 3, 12, 314, 8, 12, 3, 12, 316, 8, 12, 1, 13, 1, 13, 3, 13, 320, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 326, 8, 14, 10, 14, 12, 14, 329, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 340, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 345, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 354, 8, 17, 1, 18, 3, 18, 357, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 372, 8, 18, 1, 18, 1, 18, 1, 18, 1, 19, 3, 19, 378, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 388, 8, 19, 10, 19, 12, 19, 391, 9, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 399, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 407, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 415, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 428, 8, 20, 1, 21, 3, 21, 431, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 441, 8, 21, 1, 21, 1, 21, 3, 21, 445, 8, 21, 1, 21, 1, 21, 5, 21, 449, 8, 21, 10, 21, 12, 21, 452, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 458, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 464, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 472, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 480, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 493, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 500, 8, 24, 1, 24, 1, 24, 3, 24, 504, 8, 24, 1, 25, 5, 25, 507, 8, 25, 10, 25, 12, 25, 510, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 520, 8, 25, 1, 25, 1, 25, 5, 25, 524, 8, 25, 10, 25, 12, 25, 527, 9, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 536, 8, 26, 1, 27, 1, 27, 1, 27, 3, 27, 541, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 547, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 556, 8, 27, 10, 27, 12, 27, 559, 9, 27, 1, 27, 1, 27, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 585, 8, 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, 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, 3, 29, 612, 8, 29, 1, 30, 1, 30, 1, 30, 3, 30, 617, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 628, 8, 30, 1, 30, 3, 30, 631, 8, 30, 1, 30, 1, 30, 1, 30, 3, 30, 636, 8, 30, 1, 30, 3, 30, 639, 8, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 3, 31, 646, 8, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 655, 8, 31, 1, 31, 3, 31, 658, 8, 31, 1, 31, 3, 31, 661, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 678, 8, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 685, 8, 34, 10, 34, 12, 34, 688, 9, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 701, 8, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 720, 8, 38, 10, 38, 12, 38, 723, 9, 38, 3, 38, 725, 8, 38, 1, 38, 3, 38, 728, 8, 38, 1, 39, 1, 39, 1, 39, 5, 39, 733, 8, 39, 10, 39, 12, 39, 736, 9, 39, 1, 40, 1, 40, 1, 40, 5, 40, 741, 8, 40, 10, 40, 12, 40, 744, 9, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 783, 8, 41, 1, 41, 3, 41, 786, 8, 41, 1, 41, 1, 41, 3, 41, 790, 8, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 812, 8, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 826, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 832, 8, 42, 10, 42, 12, 42, 835, 9, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 3, 45, 846, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 860, 8, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 870, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 888, 8, 49, 1, 49, 1, 49, 3, 49, 892, 8, 49, 1, 49, 3, 49, 895, 8, 49, 1, 49, 1, 49, 3, 49, 899, 8, 49, 1, 49, 3, 49, 902, 8, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 911, 8, 50, 1, 50, 1, 50, 3, 50, 915, 8, 50, 1, 50, 1, 50, 3, 50, 919, 8, 50, 1, 50, 1, 50, 5, 50, 923, 8, 50, 10, 50, 12, 50, 926, 9, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 936, 8, 51, 1, 52, 1, 52, 1, 52, 5, 52, 941, 8, 52, 10, 52, 12, 52, 944, 9, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 963, 8, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 5, 54, 970, 8, 54, 10, 54, 12, 54, 973, 9, 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, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 1004, 8, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 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, 1024, 8, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1041, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1051, 8, 60, 1, 60, 3, 60, 1054, 8, 60, 1, 60, 3, 60, 1057, 8, 60, 3, 60, 1059, 8, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 5, 64, 1071, 8, 64, 10, 64, 12, 64, 1074, 9, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1097, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1113, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1122, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1132, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 5, 65, 1143, 8, 65, 10, 65, 12, 65, 1146, 9, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1160, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1172, 8, 65, 1, 65, 1, 65, 3, 65, 1176, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1185, 8, 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, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1203, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 5, 67, 1225, 8, 67, 10, 67, 12, 67, 1228, 9, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1233, 8, 67, 3, 67, 1235, 8, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1254, 8, 71, 1, 72, 1, 72, 1, 72, 1, 72, 5, 72, 1260, 8, 72, 10, 72, 12, 72, 1263, 9, 72, 3, 72, 1265, 8, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 5, 74, 1277, 8, 74, 10, 74, 12, 74, 1280, 9, 74, 3, 74, 1282, 8, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 0, 0, 77, 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, 0, 9, 2, 0, 10, 10, 28, 28, 1, 0, 6, 7, 1, 0, 95, 99, 3, 0, 1, 1, 90, 94, 96, 97, 3, 0, 1, 1, 90, 91, 96, 97, 2, 0, 92, 94, 96, 97, 1, 0, 115, 122, 1, 0, 102, 105, 7, 0, 1, 3, 5, 28, 40, 40, 69, 69, 88, 89, 100, 100, 143, 143, 1396, 0, 166, 1, 0, 0, 0, 2, 168, 1, 0, 0, 0, 4, 178, 1, 0, 0, 0, 6, 182, 1, 0, 0, 0, 8, 206, 1, 0, 0, 0, 10, 218, 1, 0, 0, 0, 12, 220, 1, 0, 0, 0, 14, 227, 1, 0, 0, 0, 16, 238, 1, 0, 0, 0, 18, 240, 1, 0, 0, 0, 20, 253, 1, 0, 0, 0, 22, 285, 1, 0, 0, 0, 24, 315, 1, 0, 0, 0, 26, 317, 1, 0, 0, 0, 28, 321, 1, 0, 0, 0, 30, 339, 1, 0, 0, 0, 32, 341, 1, 0, 0, 0, 34, 353, 1, 0, 0, 0, 36, 356, 1, 0, 0, 0, 38, 377, 1, 0, 0, 0, 40, 427, 1, 0, 0, 0, 42, 430, 1, 0, 0, 0, 44, 455, 1, 0, 0, 0, 46, 492, 1, 0, 0, 0, 48, 503, 1, 0, 0, 0, 50, 508, 1, 0, 0, 0, 52, 535, 1, 0, 0, 0, 54, 537, 1, 0, 0, 0, 56, 562, 1, 0, 0, 0, 58, 611, 1, 0, 0, 0, 60, 613, 1, 0, 0, 0, 62, 642, 1, 0, 0, 0, 64, 664, 1, 0, 0, 0, 66, 677, 1, 0, 0, 0, 68, 679, 1, 0, 0, 0, 70, 691, 1, 0, 0, 0, 72, 704, 1, 0, 0, 0, 74, 707, 1, 0, 0, 0, 76, 727, 1, 0, 0, 0, 78, 729, 1, 0, 0, 0, 80, 737, 1, 0, 0, 0, 82, 825, 1, 0, 0, 0, 84, 827, 1, 0, 0, 0, 86, 838, 1, 0, 0, 0, 88, 840, 1, 0, 0, 0, 90, 845, 1, 0, 0, 0, 92, 847, 1, 0, 0, 0, 94, 869, 1, 0, 0, 0, 96, 871, 1, 0, 0, 0, 98, 880, 1, 0, 0, 0, 100, 905, 1, 0, 0, 0, 102, 935, 1, 0, 0, 0, 104, 937, 1, 0, 0, 0, 106, 962, 1, 0, 0, 0, 108, 964, 1, 0, 0, 0, 110, 976, 1, 0, 0, 0, 112, 983, 1, 0, 0, 0, 114, 997, 1, 0, 0, 0, 116, 1007, 1, 0, 0, 0, 118, 1023, 1, 0, 0, 0, 120, 1058, 1, 0, 0, 0, 122, 1060, 1, 0, 0, 0, 124, 1063, 1, 0, 0, 0, 126, 1065, 1, 0, 0, 0, 128, 1067, 1, 0, 0, 0, 130, 1175, 1, 0, 0, 0, 132, 1177, 1, 0, 0, 0, 134, 1234, 1, 0, 0, 0, 136, 1236, 1, 0, 0, 0, 138, 1241, 1, 0, 0, 0, 140, 1243, 1, 0, 0, 0, 142, 1253, 1, 0, 0, 0, 144, 1255, 1, 0, 0, 0, 146, 1268, 1, 0, 0, 0, 148, 1272, 1, 0, 0, 0, 150, 1285, 1, 0, 0, 0, 152, 1287, 1, 0, 0, 0, 154, 155, 3, 6, 3, 0, 155, 156, 5, 0, 0, 1, 156, 167, 1, 0, 0, 0, 157, 158, 3, 20, 10, 0, 158, 159, 5, 0, 0, 1, 159, 167, 1, 0, 0, 0, 160, 161, 3, 50, 25, 0, 161, 162, 5, 0, 0, 1, 162, 167, 1, 0, 0, 0, 163, 164, 3, 2, 1, 0, 164, 165, 5, 0, 0, 1, 165, 167, 1, 0, 0, 0, 166, 154, 1, 0, 0, 0, 166, 157, 1, 0, 0, 0, 166, 160, 1, 0, 0, 0, 166, 163, 1, 0, 0, 0, 167, 1, 1, 0, 0, 0, 168, 169, 5, 35, 0, 0, 169, 173, 5, 131, 0, 0, 170, 172, 3, 8, 4, 0, 171, 170, 1, 0, 0, 0, 172, 175, 1, 0, 0, 0, 173, 171, 1, 0, 0, 0, 173, 174, 1, 0, 0, 0, 174, 176, 1, 0, 0, 0, 175, 173, 1, 0, 0, 0, 176, 177, 5, 132, 0, 0, 177, 3, 1, 0, 0, 0, 178, 179, 5, 36, 0, 0, 179, 180, 3, 152, 76, 0, 180, 181, 5, 128, 0, 0, 181, 5, 1, 0, 0, 0, 182, 183, 5, 4, 0, 0, 183, 184, 3, 150, 75, 0, 184, 185, 5, 78, 0, 0, 185, 186, 3, 152, 76, 0, 186, 187, 5, 72, 0, 0, 187, 188, 3, 152, 76, 0, 188, 189, 5, 71, 0, 0, 189, 190, 3, 152, 76, 0, 190, 194, 5, 131, 0, 0, 191, 193, 3, 8, 4, 0, 192, 191, 1, 0, 0, 0, 193, 196, 1, 0, 0, 0, 194, 192, 1, 0, 0, 0, 194, 195, 1, 0, 0, 0, 195, 197, 1, 0, 0, 0, 196, 194, 1, 0, 0, 0, 197, 198, 5, 132, 0, 0, 198, 7, 1, 0, 0, 0, 199, 207, 3, 4, 2, 0, 200, 207, 3, 18, 9, 0, 201, 207, 3, 10, 5, 0, 202, 207, 3, 88, 44, 0, 203, 207, 3, 100, 50, 0, 204, 207, 3, 132, 66, 0, 205, 207, 3, 32, 16, 0, 206, 199, 1, 0, 0, 0, 206, 200, 1, 0, 0, 0, 206, 201, 1, 0, 0, 0, 206, 202, 1, 0, 0, 0, 206, 203, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 206, 205, 1, 0, 0, 0, 207, 9, 1, 0, 0, 0, 208, 209, 5, 36, 0, 0, 209, 210, 5, 39, 0, 0, 210, 211, 3, 150, 75, 0, 211, 212, 5, 128, 0, 0, 212, 219, 1, 0, 0, 0, 213, 214, 5, 36, 0, 0, 214, 215, 5, 41, 0, 0, 215, 216, 3, 150, 75, 0, 216, 217, 5, 128, 0, 0, 217, 219, 1, 0, 0, 0, 218, 208, 1, 0, 0, 0, 218, 213, 1, 0, 0, 0, 219, 11, 1, 0, 0, 0, 220, 221, 5, 37, 0, 0, 221, 222, 5, 38, 0, 0, 222, 223, 3, 150, 75, 0, 223, 224, 5, 78, 0, 0, 224, 225, 3, 152, 76, 0, 225, 226, 5, 128, 0, 0, 226, 13, 1, 0, 0, 0, 227, 228, 5, 37, 0, 0, 228, 229, 5, 39, 0, 0, 229, 230, 3, 150, 75, 0, 230, 231, 5, 72, 0, 0, 231, 232, 3, 152, 76, 0, 232, 233, 5, 128, 0, 0, 233, 15, 1, 0, 0, 0, 234, 239, 3, 10, 5, 0, 235, 239, 3, 12, 6, 0, 236, 239, 3, 14, 7, 0, 237, 239, 3, 32, 16, 0, 238, 234, 1, 0, 0, 0, 238, 235, 1, 0, 0, 0, 238, 236, 1, 0, 0, 0, 238, 237, 1, 0, 0, 0, 239, 17, 1, 0, 0, 0, 240, 241, 5, 38, 0, 0, 241, 242, 3, 150, 75, 0, 242, 243, 5, 78, 0, 0, 243, 246, 3, 152, 76, 0, 244, 245, 5, 79, 0, 0, 245, 247, 3, 152, 76, 0, 246, 244, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 249, 5, 128, 0, 0, 249, 19, 1, 0, 0, 0, 250, 252, 3, 16, 8, 0, 251, 250, 1, 0, 0, 0, 252, 255, 1, 0, 0, 0, 253, 251, 1, 0, 0, 0, 253, 254, 1, 0, 0, 0, 254, 256, 1, 0, 0, 0, 255, 253, 1, 0, 0, 0, 256, 257, 5, 39, 0, 0, 257, 259, 3, 150, 75, 0, 258, 260, 3, 22, 11, 0, 259, 258, 1, 0, 0, 0, 259, 260, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 262, 5, 78, 0, 0, 262, 263, 3, 152, 76, 0, 263, 264, 5, 72, 0, 0, 264, 274, 3, 152, 76, 0, 265, 266, 5, 83, 0, 0, 266, 271, 3, 26, 13, 0, 267, 268, 5, 129, 0, 0, 268, 270, 3, 26, 13, 0, 269, 267, 1, 0, 0, 0, 270, 273, 1, 0, 0, 0, 271, 269, 1, 0, 0, 0, 271, 272, 1, 0, 0, 0, 272, 275, 1, 0, 0, 0, 273, 271, 1, 0, 0, 0, 274, 265, 1, 0, 0, 0, 274, 275, 1, 0, 0, 0, 275, 276, 1, 0, 0, 0, 276, 280, 5, 131, 0, 0, 277, 279, 3, 34, 17, 0, 278, 277, 1, 0, 0, 0, 279, 282, 1, 0, 0, 0, 280, 278, 1, 0, 0, 0, 280, 281, 1, 0, 0, 0, 281, 283, 1, 0, 0, 0, 282, 280, 1, 0, 0, 0, 283, 284, 5, 132, 0, 0, 284, 21, 1, 0, 0, 0, 285, 286, 5, 137, 0, 0, 286, 291, 3, 24, 12, 0, 287, 288, 5, 129, 0, 0, 288, 290, 3, 24, 12, 0, 289, 287, 1, 0, 0, 0, 290, 293, 1, 0, 0, 0, 291, 289, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 294, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 294, 295, 5, 138, 0, 0, 295, 23, 1, 0, 0, 0, 296, 297, 5, 42, 0, 0, 297, 300, 3, 150, 75, 0, 298, 299, 5, 127, 0, 0, 299, 301, 5, 32, 0, 0, 300, 298, 1, 0, 0, 0, 300, 301, 1, 0, 0, 0, 301, 316, 1, 0, 0, 0, 302, 303, 5, 31, 0, 0, 303, 313, 3, 150, 75, 0, 304, 305, 5, 33, 0, 0, 305, 310, 3, 26, 13, 0, 306, 307, 5, 139, 0, 0, 307, 309, 3, 26, 13, 0, 308, 306, 1, 0, 0, 0, 309, 312, 1, 0, 0, 0, 310, 308, 1, 0, 0, 0, 310, 311, 1, 0, 0, 0, 311, 314, 1, 0, 0, 0, 312, 310, 1, 0, 0, 0, 313, 304, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 316, 1, 0, 0, 0, 315, 296, 1, 0, 0, 0, 315, 302, 1, 0, 0, 0, 316, 25, 1, 0, 0, 0, 317, 319, 3, 150, 75, 0, 318, 320, 3, 28, 14, 0, 319, 318, 1, 0, 0, 0, 319, 320, 1, 0, 0, 0, 320, 27, 1, 0, 0, 0, 321, 322, 5, 137, 0, 0, 322, 327, 3, 30, 15, 0, 323, 324, 5, 129, 0, 0, 324, 326, 3, 30, 15, 0, 325, 323, 1, 0, 0, 0, 326, 329, 1, 0, 0, 0, 327, 325, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 330, 1, 0, 0, 0, 329, 327, 1, 0, 0, 0, 330, 331, 5, 138, 0, 0, 331, 29, 1, 0, 0, 0, 332, 333, 5, 38, 0, 0, 333, 340, 3, 150, 75, 0, 334, 335, 5, 39, 0, 0, 335, 340, 3, 26, 13, 0, 336, 337, 5, 31, 0, 0, 337, 340, 3, 150, 75, 0, 338, 340, 3, 134, 67, 0, 339, 332, 1, 0, 0, 0, 339, 334, 1, 0, 0, 0, 339, 336, 1, 0, 0, 0, 339, 338, 1, 0, 0, 0, 340, 31, 1, 0, 0, 0, 341, 342, 5, 30, 0, 0, 342, 344, 3, 150, 75, 0, 343, 345, 3, 22, 11, 0, 344, 343, 1, 0, 0, 0, 344, 345, 1, 0, 0, 0, 345, 346, 1, 0, 0, 0, 346, 347, 5, 140, 0, 0, 347, 348, 3, 134, 67, 0, 348, 349, 5, 128, 0, 0, 349, 33, 1, 0, 0, 0, 350, 354, 3, 38, 19, 0, 351, 354, 3, 42, 21, 0, 352, 354, 3, 36, 18, 0, 353, 350, 1, 0, 0, 0, 353, 351, 1, 0, 0, 0, 353, 352, 1, 0, 0, 0, 354, 35, 1, 0, 0, 0, 355, 357, 5, 52, 0, 0, 356, 355, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 358, 1, 0, 0, 0, 358, 359, 5, 44, 0, 0, 359, 360, 3, 150, 75, 0, 360, 361, 5, 78, 0, 0, 361, 362, 3, 152, 76, 0, 362, 363, 5, 127, 0, 0, 363, 364, 3, 134, 67, 0, 364, 365, 5, 126, 0, 0, 365, 366, 3, 134, 67, 0, 366, 367, 5, 131, 0, 0, 367, 368, 5, 95, 0, 0, 368, 369, 5, 78, 0, 0, 369, 371, 3, 152, 76, 0, 370, 372, 3, 66, 33, 0, 371, 370, 1, 0, 0, 0, 371, 372, 1, 0, 0, 0, 372, 373, 1, 0, 0, 0, 373, 374, 5, 128, 0, 0, 374, 375, 5, 132, 0, 0, 375, 37, 1, 0, 0, 0, 376, 378, 3, 44, 22, 0, 377, 376, 1, 0, 0, 0, 377, 378, 1, 0, 0, 0, 378, 379, 1, 0, 0, 0, 379, 380, 5, 42, 0, 0, 380, 381, 3, 150, 75, 0, 381, 382, 5, 78, 0, 0, 382, 383, 3, 152, 76, 0, 383, 384, 5, 127, 0, 0, 384, 385, 3, 134, 67, 0, 385, 389, 5, 131, 0, 0, 386, 388, 3, 40, 20, 0, 387, 386, 1, 0, 0, 0, 388, 391, 1, 0, 0, 0, 389, 387, 1, 0, 0, 0, 389, 390, 1, 0, 0, 0, 390, 392, 1, 0, 0, 0, 391, 389, 1, 0, 0, 0, 392, 393, 5, 132, 0, 0, 393, 39, 1, 0, 0, 0, 394, 395, 5, 85, 0, 0, 395, 396, 5, 78, 0, 0, 396, 398, 3, 152, 76, 0, 397, 399, 3, 66, 33, 0, 398, 397, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 401, 5, 128, 0, 0, 401, 428, 1, 0, 0, 0, 402, 403, 5, 86, 0, 0, 403, 404, 5, 78, 0, 0, 404, 406, 3, 152, 76, 0, 405, 407, 3, 66, 33, 0, 406, 405, 1, 0, 0, 0, 406, 407, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 409, 5, 128, 0, 0, 409, 428, 1, 0, 0, 0, 410, 411, 5, 1, 0, 0, 411, 412, 5, 78, 0, 0, 412, 414, 3, 152, 76, 0, 413, 415, 3, 66, 33, 0, 414, 413, 1, 0, 0, 0, 414, 415, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 417, 5, 128, 0, 0, 417, 428, 1, 0, 0, 0, 418, 419, 5, 87, 0, 0, 419, 420, 5, 88, 0, 0, 420, 421, 5, 78, 0, 0, 421, 422, 3, 152, 76, 0, 422, 423, 5, 89, 0, 0, 423, 424, 5, 78, 0, 0, 424, 425, 3, 152, 76, 0, 425, 426, 5, 128, 0, 0, 426, 428, 1, 0, 0, 0, 427, 394, 1, 0, 0, 0, 427, 402, 1, 0, 0, 0, 427, 410, 1, 0, 0, 0, 427, 418, 1, 0, 0, 0, 428, 41, 1, 0, 0, 0, 429, 431, 3, 44, 22, 0, 430, 429, 1, 0, 0, 0, 430, 431, 1, 0, 0, 0, 431, 432, 1, 0, 0, 0, 432, 433, 5, 43, 0, 0, 433, 434, 3, 150, 75, 0, 434, 435, 5, 78, 0, 0, 435, 436, 3, 152, 76, 0, 436, 437, 5, 127, 0, 0, 437, 438, 3, 140, 70, 0, 438, 440, 3, 48, 24, 0, 439, 441, 5, 106, 0, 0, 440, 439, 1, 0, 0, 0, 440, 441, 1, 0, 0, 0, 441, 444, 1, 0, 0, 0, 442, 443, 5, 76, 0, 0, 443, 445, 3, 152, 76, 0, 444, 442, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 450, 5, 131, 0, 0, 447, 449, 3, 46, 23, 0, 448, 447, 1, 0, 0, 0, 449, 452, 1, 0, 0, 0, 450, 448, 1, 0, 0, 0, 450, 451, 1, 0, 0, 0, 451, 453, 1, 0, 0, 0, 452, 450, 1, 0, 0, 0, 453, 454, 5, 132, 0, 0, 454, 43, 1, 0, 0, 0, 455, 457, 5, 27, 0, 0, 456, 458, 7, 0, 0, 0, 457, 456, 1, 0, 0, 0, 457, 458, 1, 0, 0, 0, 458, 45, 1, 0, 0, 0, 459, 460, 5, 92, 0, 0, 460, 461, 5, 78, 0, 0, 461, 463, 3, 152, 76, 0, 462, 464, 3, 66, 33, 0, 463, 462, 1, 0, 0, 0, 463, 464, 1, 0, 0, 0, 464, 465, 1, 0, 0, 0, 465, 466, 5, 128, 0, 0, 466, 493, 1, 0, 0, 0, 467, 468, 5, 93, 0, 0, 468, 469, 5, 78, 0, 0, 469, 471, 3, 152, 76, 0, 470, 472, 3, 66, 33, 0, 471, 470, 1, 0, 0, 0, 471, 472, 1, 0, 0, 0, 472, 473, 1, 0, 0, 0, 473, 474, 5, 128, 0, 0, 474, 493, 1, 0, 0, 0, 475, 476, 5, 94, 0, 0, 476, 477, 5, 78, 0, 0, 477, 479, 3, 152, 76, 0, 478, 480, 3, 66, 33, 0, 479, 478, 1, 0, 0, 0, 479, 480, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 482, 5, 128, 0, 0, 482, 493, 1, 0, 0, 0, 483, 484, 5, 87, 0, 0, 484, 485, 5, 88, 0, 0, 485, 486, 5, 78, 0, 0, 486, 487, 3, 152, 76, 0, 487, 488, 5, 89, 0, 0, 488, 489, 5, 78, 0, 0, 489, 490, 3, 152, 76, 0, 490, 491, 5, 128, 0, 0, 491, 493, 1, 0, 0, 0, 492, 459, 1, 0, 0, 0, 492, 467, 1, 0, 0, 0, 492, 475, 1, 0, 0, 0, 492, 483, 1, 0, 0, 0, 493, 47, 1, 0, 0, 0, 494, 495, 5, 38, 0, 0, 495, 504, 3, 150, 75, 0, 496, 497, 5, 39, 0, 0, 497, 499, 3, 150, 75, 0, 498, 500, 3, 28, 14, 0, 499, 498, 1, 0, 0, 0, 499, 500, 1, 0, 0, 0, 500, 504, 1, 0, 0, 0, 501, 502, 5, 31, 0, 0, 502, 504, 3, 150, 75, 0, 503, 494, 1, 0, 0, 0, 503, 496, 1, 0, 0, 0, 503, 501, 1, 0, 0, 0, 504, 49, 1, 0, 0, 0, 505, 507, 3, 16, 8, 0, 506, 505, 1, 0, 0, 0, 507, 510, 1, 0, 0, 0, 508, 506, 1, 0, 0, 0, 508, 509, 1, 0, 0, 0, 509, 511, 1, 0, 0, 0, 510, 508, 1, 0, 0, 0, 511, 512, 5, 41, 0, 0, 512, 513, 3, 150, 75, 0, 513, 514, 5, 78, 0, 0, 514, 515, 3, 152, 76, 0, 515, 516, 5, 72, 0, 0, 516, 519, 3, 152, 76, 0, 517, 518, 5, 73, 0, 0, 518, 520, 5, 141, 0, 0, 519, 517, 1, 0, 0, 0, 519, 520, 1, 0, 0, 0, 520, 521, 1, 0, 0, 0, 521, 525, 5, 131, 0, 0, 522, 524, 3, 52, 26, 0, 523, 522, 1, 0, 0, 0, 524, 527, 1, 0, 0, 0, 525, 523, 1, 0, 0, 0, 525, 526, 1, 0, 0, 0, 526, 528, 1, 0, 0, 0, 527, 525, 1, 0, 0, 0, 528, 529, 5, 132, 0, 0, 529, 51, 1, 0, 0, 0, 530, 536, 3, 60, 30, 0, 531, 536, 3, 62, 31, 0, 532, 536, 3, 70, 35, 0, 533, 536, 3, 54, 27, 0, 534, 536, 3, 56, 28, 0, 535, 530, 1, 0, 0, 0, 535, 531, 1, 0, 0, 0, 535, 532, 1, 0, 0, 0, 535, 533, 1, 0, 0, 0, 535, 534, 1, 0, 0, 0, 536, 53, 1, 0, 0, 0, 537, 538, 5, 17, 0, 0, 538, 540, 3, 150, 75, 0, 539, 541, 3, 22, 11, 0, 540, 539, 1, 0, 0, 0, 540, 541, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 543, 5, 78, 0, 0, 543, 544, 3, 152, 76, 0, 544, 546, 5, 20, 0, 0, 545, 547, 5, 4, 0, 0, 546, 545, 1, 0, 0, 0, 546, 547, 1, 0, 0, 0, 547, 548, 1, 0, 0, 0, 548, 549, 3, 26, 13, 0, 549, 550, 5, 21, 0, 0, 550, 551, 3, 152, 76, 0, 551, 552, 5, 44, 0, 0, 552, 553, 3, 152, 76, 0, 553, 557, 5, 131, 0, 0, 554, 556, 3, 58, 29, 0, 555, 554, 1, 0, 0, 0, 556, 559, 1, 0, 0, 0, 557, 555, 1, 0, 0, 0, 557, 558, 1, 0, 0, 0, 558, 560, 1, 0, 0, 0, 559, 557, 1, 0, 0, 0, 560, 561, 5, 132, 0, 0, 561, 55, 1, 0, 0, 0, 562, 563, 5, 17, 0, 0, 563, 564, 3, 150, 75, 0, 564, 565, 5, 78, 0, 0, 565, 566, 3, 152, 76, 0, 566, 567, 5, 19, 0, 0, 567, 568, 3, 150, 75, 0, 568, 569, 3, 28, 14, 0, 569, 570, 5, 128, 0, 0, 570, 57, 1, 0, 0, 0, 571, 572, 5, 11, 0, 0, 572, 612, 5, 128, 0, 0, 573, 574, 5, 12, 0, 0, 574, 575, 5, 13, 0, 0, 575, 576, 3, 150, 75, 0, 576, 577, 5, 128, 0, 0, 577, 612, 1, 0, 0, 0, 578, 579, 5, 22, 0, 0, 579, 580, 3, 152, 76, 0, 580, 581, 5, 128, 0, 0, 581, 612, 1, 0, 0, 0, 582, 584, 5, 23, 0, 0, 583, 585, 5, 31, 0, 0, 584, 583, 1, 0, 0, 0, 584, 585, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 587, 3, 150, 75, 0, 587, 588, 5, 50, 0, 0, 588, 589, 3, 26, 13, 0, 589, 590, 5, 128, 0, 0, 590, 612, 1, 0, 0, 0, 591, 592, 5, 24, 0, 0, 592, 593, 3, 150, 75, 0, 593, 594, 5, 141, 0, 0, 594, 595, 5, 128, 0, 0, 595, 612, 1, 0, 0, 0, 596, 597, 5, 25, 0, 0, 597, 598, 3, 26, 13, 0, 598, 599, 5, 130, 0, 0, 599, 600, 3, 150, 75, 0, 600, 601, 3, 150, 75, 0, 601, 602, 3, 152, 76, 0, 602, 603, 5, 128, 0, 0, 603, 612, 1, 0, 0, 0, 604, 605, 5, 87, 0, 0, 605, 612, 5, 128, 0, 0, 606, 607, 5, 26, 0, 0, 607, 608, 5, 141, 0, 0, 608, 609, 3, 152, 76, 0, 609, 610, 5, 128, 0, 0, 610, 612, 1, 0, 0, 0, 611, 571, 1, 0, 0, 0, 611, 573, 1, 0, 0, 0, 611, 578, 1, 0, 0, 0, 611, 582, 1, 0, 0, 0, 611, 591, 1, 0, 0, 0, 611, 596, 1, 0, 0, 0, 611, 604, 1, 0, 0, 0, 611, 606, 1, 0, 0, 0, 612, 59, 1, 0, 0, 0, 613, 614, 5, 44, 0, 0, 614, 616, 3, 150, 75, 0, 615, 617, 3, 22, 11, 0, 616, 615, 1, 0, 0, 0, 616, 617, 1, 0, 0, 0, 617, 618, 1, 0, 0, 0, 618, 619, 5, 78, 0, 0, 619, 620, 3, 152, 76, 0, 620, 621, 5, 127, 0, 0, 621, 622, 3, 134, 67, 0, 622, 623, 5, 126, 0, 0, 623, 624, 3, 134, 67, 0, 624, 625, 5, 80, 0, 0, 625, 627, 3, 74, 37, 0, 626, 628, 3, 66, 33, 0, 627, 626, 1, 0, 0, 0, 627, 628, 1, 0, 0, 0, 628, 630, 1, 0, 0, 0, 629, 631, 3, 72, 36, 0, 630, 629, 1, 0, 0, 0, 630, 631, 1, 0, 0, 0, 631, 632, 1, 0, 0, 0, 632, 633, 5, 82, 0, 0, 633, 635, 3, 76, 38, 0, 634, 636, 3, 80, 40, 0, 635, 634, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 638, 1, 0, 0, 0, 637, 639, 3, 64, 32, 0, 638, 637, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 641, 5, 128, 0, 0, 641, 61, 1, 0, 0, 0, 642, 643, 5, 45, 0, 0, 643, 645, 3, 150, 75, 0, 644, 646, 3, 22, 11, 0, 645, 644, 1, 0, 0, 0, 645, 646, 1, 0, 0, 0, 646, 647, 1, 0, 0, 0, 647, 648, 5, 78, 0, 0, 648, 649, 3, 152, 76, 0, 649, 650, 5, 127, 0, 0, 650, 651, 3, 134, 67, 0, 651, 652, 5, 126, 0, 0, 652, 654, 3, 134, 67, 0, 653, 655, 3, 66, 33, 0, 654, 653, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 657, 1, 0, 0, 0, 656, 658, 3, 80, 40, 0, 657, 656, 1, 0, 0, 0, 657, 658, 1, 0, 0, 0, 658, 660, 1, 0, 0, 0, 659, 661, 3, 64, 32, 0, 660, 659, 1, 0, 0, 0, 660, 661, 1, 0, 0, 0, 661, 662, 1, 0, 0, 0, 662, 663, 5, 128, 0, 0, 663, 63, 1, 0, 0, 0, 664, 665, 5, 61, 0, 0, 665, 666, 5, 60, 0, 0, 666, 667, 3, 150, 75, 0, 667, 65, 1, 0, 0, 0, 668, 669, 5, 5, 0, 0, 669, 678, 5, 8, 0, 0, 670, 671, 5, 5, 0, 0, 671, 672, 7, 1, 0, 0, 672, 673, 5, 9, 0, 0, 673, 674, 5, 133, 0, 0, 674, 675, 3, 78, 39, 0, 675, 676, 5, 134, 0, 0, 676, 678, 1, 0, 0, 0, 677, 668, 1, 0, 0, 0, 677, 670, 1, 0, 0, 0, 678, 67, 1, 0, 0, 0, 679, 680, 5, 60, 0, 0, 680, 681, 5, 133, 0, 0, 681, 686, 3, 116, 58, 0, 682, 683, 5, 129, 0, 0, 683, 685, 3, 116, 58, 0, 684, 682, 1, 0, 0, 0, 685, 688, 1, 0, 0, 0, 686, 684, 1, 0, 0, 0, 686, 687, 1, 0, 0, 0, 687, 689, 1, 0, 0, 0, 688, 686, 1, 0, 0, 0, 689, 690, 5, 134, 0, 0, 690, 69, 1, 0, 0, 0, 691, 692, 5, 46, 0, 0, 692, 693, 3, 150, 75, 0, 693, 694, 5, 78, 0, 0, 694, 695, 3, 152, 76, 0, 695, 696, 5, 47, 0, 0, 696, 697, 3, 150, 75, 0, 697, 698, 5, 127, 0, 0, 698, 700, 3, 134, 67, 0, 699, 701, 3, 80, 40, 0, 700, 699, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 702, 1, 0, 0, 0, 702, 703, 5, 128, 0, 0, 703, 71, 1, 0, 0, 0, 704, 705, 5, 81, 0, 0, 705, 706, 3, 134, 67, 0, 706, 73, 1, 0, 0, 0, 707, 708, 7, 2, 0, 0, 708, 75, 1, 0, 0, 0, 709, 728, 5, 84, 0, 0, 710, 711, 5, 38, 0, 0, 711, 728, 3, 150, 75, 0, 712, 713, 5, 31, 0, 0, 713, 728, 3, 150, 75, 0, 714, 715, 5, 40, 0, 0, 715, 724, 5, 133, 0, 0, 716, 721, 3, 26, 13, 0, 717, 718, 5, 129, 0, 0, 718, 720, 3, 26, 13, 0, 719, 717, 1, 0, 0, 0, 720, 723, 1, 0, 0, 0, 721, 719, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 725, 1, 0, 0, 0, 723, 721, 1, 0, 0, 0, 724, 716, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 726, 1, 0, 0, 0, 726, 728, 5, 134, 0, 0, 727, 709, 1, 0, 0, 0, 727, 710, 1, 0, 0, 0, 727, 712, 1, 0, 0, 0, 727, 714, 1, 0, 0, 0, 728, 77, 1, 0, 0, 0, 729, 734, 3, 150, 75, 0, 730, 731, 5, 129, 0, 0, 731, 733, 3, 150, 75, 0, 732, 730, 1, 0, 0, 0, 733, 736, 1, 0, 0, 0, 734, 732, 1, 0, 0, 0, 734, 735, 1, 0, 0, 0, 735, 79, 1, 0, 0, 0, 736, 734, 1, 0, 0, 0, 737, 738, 5, 83, 0, 0, 738, 742, 5, 131, 0, 0, 739, 741, 3, 82, 41, 0, 740, 739, 1, 0, 0, 0, 741, 744, 1, 0, 0, 0, 742, 740, 1, 0, 0, 0, 742, 743, 1, 0, 0, 0, 743, 745, 1, 0, 0, 0, 744, 742, 1, 0, 0, 0, 745, 746, 5, 132, 0, 0, 746, 81, 1, 0, 0, 0, 747, 748, 5, 18, 0, 0, 748, 749, 3, 150, 75, 0, 749, 750, 5, 78, 0, 0, 750, 751, 3, 152, 76, 0, 751, 752, 5, 133, 0, 0, 752, 753, 3, 78, 39, 0, 753, 754, 5, 134, 0, 0, 754, 755, 5, 128, 0, 0, 755, 826, 1, 0, 0, 0, 756, 757, 5, 56, 0, 0, 757, 758, 3, 150, 75, 0, 758, 759, 5, 78, 0, 0, 759, 760, 3, 152, 76, 0, 760, 761, 5, 127, 0, 0, 761, 762, 3, 134, 67, 0, 762, 763, 3, 84, 42, 0, 763, 764, 5, 128, 0, 0, 764, 826, 1, 0, 0, 0, 765, 766, 5, 57, 0, 0, 766, 767, 3, 150, 75, 0, 767, 768, 5, 78, 0, 0, 768, 769, 3, 152, 76, 0, 769, 770, 5, 127, 0, 0, 770, 771, 3, 140, 70, 0, 771, 772, 3, 48, 24, 0, 772, 773, 3, 84, 42, 0, 773, 774, 5, 128, 0, 0, 774, 826, 1, 0, 0, 0, 775, 776, 5, 39, 0, 0, 776, 777, 3, 150, 75, 0, 777, 778, 5, 78, 0, 0, 778, 779, 3, 152, 76, 0, 779, 780, 5, 127, 0, 0, 780, 782, 3, 150, 75, 0, 781, 783, 3, 28, 14, 0, 782, 781, 1, 0, 0, 0, 782, 783, 1, 0, 0, 0, 783, 785, 1, 0, 0, 0, 784, 786, 3, 68, 34, 0, 785, 784, 1, 0, 0, 0, 785, 786, 1, 0, 0, 0, 786, 789, 1, 0, 0, 0, 787, 788, 5, 13, 0, 0, 788, 790, 5, 48, 0, 0, 789, 787, 1, 0, 0, 0, 789, 790, 1, 0, 0, 0, 790, 791, 1, 0, 0, 0, 791, 792, 5, 128, 0, 0, 792, 826, 1, 0, 0, 0, 793, 794, 5, 2, 0, 0, 794, 795, 3, 150, 75, 0, 795, 796, 5, 78, 0, 0, 796, 797, 3, 152, 76, 0, 797, 798, 5, 127, 0, 0, 798, 799, 3, 150, 75, 0, 799, 800, 5, 48, 0, 0, 800, 801, 3, 134, 67, 0, 801, 802, 5, 128, 0, 0, 802, 826, 1, 0, 0, 0, 803, 804, 5, 46, 0, 0, 804, 805, 3, 150, 75, 0, 805, 806, 5, 78, 0, 0, 806, 807, 3, 152, 76, 0, 807, 808, 5, 127, 0, 0, 808, 811, 3, 150, 75, 0, 809, 810, 5, 48, 0, 0, 810, 812, 3, 134, 67, 0, 811, 809, 1, 0, 0, 0, 811, 812, 1, 0, 0, 0, 812, 813, 1, 0, 0, 0, 813, 814, 5, 128, 0, 0, 814, 826, 1, 0, 0, 0, 815, 816, 5, 17, 0, 0, 816, 817, 3, 150, 75, 0, 817, 818, 5, 78, 0, 0, 818, 819, 3, 152, 76, 0, 819, 820, 5, 127, 0, 0, 820, 821, 3, 150, 75, 0, 821, 822, 5, 130, 0, 0, 822, 823, 3, 150, 75, 0, 823, 824, 5, 128, 0, 0, 824, 826, 1, 0, 0, 0, 825, 747, 1, 0, 0, 0, 825, 756, 1, 0, 0, 0, 825, 765, 1, 0, 0, 0, 825, 775, 1, 0, 0, 0, 825, 793, 1, 0, 0, 0, 825, 803, 1, 0, 0, 0, 825, 815, 1, 0, 0, 0, 826, 83, 1, 0, 0, 0, 827, 828, 5, 133, 0, 0, 828, 833, 3, 86, 43, 0, 829, 830, 5, 129, 0, 0, 830, 832, 3, 86, 43, 0, 831, 829, 1, 0, 0, 0, 832, 835, 1, 0, 0, 0, 833, 831, 1, 0, 0, 0, 833, 834, 1, 0, 0, 0, 834, 836, 1, 0, 0, 0, 835, 833, 1, 0, 0, 0, 836, 837, 5, 134, 0, 0, 837, 85, 1, 0, 0, 0, 838, 839, 7, 3, 0, 0, 839, 87, 1, 0, 0, 0, 840, 841, 5, 55, 0, 0, 841, 842, 3, 90, 45, 0, 842, 89, 1, 0, 0, 0, 843, 846, 3, 92, 46, 0, 844, 846, 3, 96, 48, 0, 845, 843, 1, 0, 0, 0, 845, 844, 1, 0, 0, 0, 846, 91, 1, 0, 0, 0, 847, 848, 5, 56, 0, 0, 848, 849, 3, 150, 75, 0, 849, 850, 5, 78, 0, 0, 850, 851, 3, 152, 76, 0, 851, 852, 5, 66, 0, 0, 852, 853, 3, 150, 75, 0, 853, 854, 5, 127, 0, 0, 854, 855, 3, 134, 67, 0, 855, 856, 5, 67, 0, 0, 856, 859, 3, 94, 47, 0, 857, 858, 5, 68, 0, 0, 858, 860, 3, 142, 71, 0, 859, 857, 1, 0, 0, 0, 859, 860, 1, 0, 0, 0, 860, 861, 1, 0, 0, 0, 861, 862, 5, 128, 0, 0, 862, 93, 1, 0, 0, 0, 863, 870, 5, 100, 0, 0, 864, 865, 5, 101, 0, 0, 865, 866, 5, 135, 0, 0, 866, 867, 3, 134, 67, 0, 867, 868, 5, 136, 0, 0, 868, 870, 1, 0, 0, 0, 869, 863, 1, 0, 0, 0, 869, 864, 1, 0, 0, 0, 870, 95, 1, 0, 0, 0, 871, 872, 5, 57, 0, 0, 872, 873, 3, 150, 75, 0, 873, 874, 5, 78, 0, 0, 874, 875, 3, 152, 76, 0, 875, 876, 5, 131, 0, 0, 876, 877, 3, 98, 49, 0, 877, 878, 3, 98, 49, 0, 878, 879, 5, 132, 0, 0, 879, 97, 1, 0, 0, 0, 880, 881, 3, 48, 24, 0, 881, 882, 5, 58, 0, 0, 882, 883, 3, 150, 75, 0, 883, 884, 5, 78, 0, 0, 884, 885, 3, 152, 76, 0, 885, 887, 3, 140, 70, 0, 886, 888, 5, 106, 0, 0, 887, 886, 1, 0, 0, 0, 887, 888, 1, 0, 0, 0, 888, 891, 1, 0, 0, 0, 889, 890, 5, 74, 0, 0, 890, 892, 3, 152, 76, 0, 891, 889, 1, 0, 0, 0, 891, 892, 1, 0, 0, 0, 892, 894, 1, 0, 0, 0, 893, 895, 5, 75, 0, 0, 894, 893, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 898, 1, 0, 0, 0, 896, 897, 5, 76, 0, 0, 897, 899, 3, 152, 76, 0, 898, 896, 1, 0, 0, 0, 898, 899, 1, 0, 0, 0, 899, 901, 1, 0, 0, 0, 900, 902, 5, 77, 0, 0, 901, 900, 1, 0, 0, 0, 901, 902, 1, 0, 0, 0, 902, 903, 1, 0, 0, 0, 903, 904, 5, 128, 0, 0, 904, 99, 1, 0, 0, 0, 905, 906, 5, 49, 0, 0, 906, 907, 3, 150, 75, 0, 907, 908, 5, 50, 0, 0, 908, 910, 3, 150, 75, 0, 909, 911, 3, 28, 14, 0, 910, 909, 1, 0, 0, 0, 910, 911, 1, 0, 0, 0, 911, 914, 1, 0, 0, 0, 912, 913, 5, 78, 0, 0, 913, 915, 3, 152, 76, 0, 914, 912, 1, 0, 0, 0, 914, 915, 1, 0, 0, 0, 915, 918, 1, 0, 0, 0, 916, 917, 5, 73, 0, 0, 917, 919, 5, 141, 0, 0, 918, 916, 1, 0, 0, 0, 918, 919, 1, 0, 0, 0, 919, 920, 1, 0, 0, 0, 920, 924, 5, 131, 0, 0, 921, 923, 3, 102, 51, 0, 922, 921, 1, 0, 0, 0, 923, 926, 1, 0, 0, 0, 924, 922, 1, 0, 0, 0, 924, 925, 1, 0, 0, 0, 925, 927, 1, 0, 0, 0, 926, 924, 1, 0, 0, 0, 927, 928, 5, 132, 0, 0, 928, 101, 1, 0, 0, 0, 929, 930, 5, 54, 0, 0, 930, 936, 3, 90, 45, 0, 931, 936, 3, 114, 57, 0, 932, 936, 3, 110, 55, 0, 933, 936, 3, 104, 52, 0, 934, 936, 3, 112, 56, 0, 935, 929, 1, 0, 0, 0, 935, 931, 1, 0, 0, 0, 935, 932, 1, 0, 0, 0, 935, 933, 1, 0, 0, 0, 935, 934, 1, 0, 0, 0, 936, 103, 1, 0, 0, 0, 937, 938, 5, 3, 0, 0, 938, 942, 5, 131, 0, 0, 939, 941, 3, 106, 53, 0, 940, 939, 1, 0, 0, 0, 941, 944, 1, 0, 0, 0, 942, 940, 1, 0, 0, 0, 942, 943, 1, 0, 0, 0, 943, 945, 1, 0, 0, 0, 944, 942, 1, 0, 0, 0, 945, 946, 5, 132, 0, 0, 946, 947, 5, 128, 0, 0, 947, 105, 1, 0, 0, 0, 948, 949, 3, 150, 75, 0, 949, 950, 5, 53, 0, 0, 950, 951, 5, 56, 0, 0, 951, 952, 3, 150, 75, 0, 952, 953, 5, 128, 0, 0, 953, 963, 1, 0, 0, 0, 954, 955, 3, 150, 75, 0, 955, 956, 5, 53, 0, 0, 956, 957, 5, 57, 0, 0, 957, 958, 3, 150, 75, 0, 958, 959, 5, 130, 0, 0, 959, 960, 3, 150, 75, 0, 960, 961, 5, 128, 0, 0, 961, 963, 1, 0, 0, 0, 962, 948, 1, 0, 0, 0, 962, 954, 1, 0, 0, 0, 963, 107, 1, 0, 0, 0, 964, 965, 3, 26, 13, 0, 965, 966, 5, 13, 0, 0, 966, 971, 5, 48, 0, 0, 967, 968, 5, 130, 0, 0, 968, 970, 3, 150, 75, 0, 969, 967, 1, 0, 0, 0, 970, 973, 1, 0, 0, 0, 971, 969, 1, 0, 0, 0, 971, 972, 1, 0, 0, 0, 972, 974, 1, 0, 0, 0, 973, 971, 1, 0, 0, 0, 974, 975, 5, 128, 0, 0, 975, 109, 1, 0, 0, 0, 976, 977, 5, 51, 0, 0, 977, 978, 3, 150, 75, 0, 978, 979, 5, 53, 0, 0, 979, 980, 5, 56, 0, 0, 980, 981, 3, 150, 75, 0, 981, 982, 5, 128, 0, 0, 982, 111, 1, 0, 0, 0, 983, 984, 5, 63, 0, 0, 984, 985, 3, 150, 75, 0, 985, 986, 5, 64, 0, 0, 986, 987, 5, 65, 0, 0, 987, 988, 5, 60, 0, 0, 988, 989, 5, 46, 0, 0, 989, 990, 3, 150, 75, 0, 990, 991, 5, 62, 0, 0, 991, 992, 5, 57, 0, 0, 992, 993, 3, 150, 75, 0, 993, 994, 5, 130, 0, 0, 994, 995, 3, 150, 75, 0, 995, 996, 5, 128, 0, 0, 996, 113, 1, 0, 0, 0, 997, 998, 5, 51, 0, 0, 998, 999, 3, 116, 58, 0, 999, 1000, 5, 53, 0, 0, 1000, 1003, 3, 120, 60, 0, 1001, 1002, 5, 29, 0, 0, 1002, 1004, 3, 152, 76, 0, 1003, 1001, 1, 0, 0, 0, 1003, 1004, 1, 0, 0, 0, 1004, 1005, 1, 0, 0, 0, 1005, 1006, 5, 128, 0, 0, 1006, 115, 1, 0, 0, 0, 1007, 1008, 3, 150, 75, 0, 1008, 1009, 5, 130, 0, 0, 1009, 1010, 3, 118, 59, 0, 1010, 117, 1, 0, 0, 0, 1011, 1024, 3, 150, 75, 0, 1012, 1024, 5, 95, 0, 0, 1013, 1024, 5, 85, 0, 0, 1014, 1024, 5, 86, 0, 0, 1015, 1024, 5, 1, 0, 0, 1016, 1024, 5, 92, 0, 0, 1017, 1024, 5, 93, 0, 0, 1018, 1024, 5, 94, 0, 0, 1019, 1024, 5, 96, 0, 0, 1020, 1024, 5, 97, 0, 0, 1021, 1024, 5, 98, 0, 0, 1022, 1024, 5, 99, 0, 0, 1023, 1011, 1, 0, 0, 0, 1023, 1012, 1, 0, 0, 0, 1023, 1013, 1, 0, 0, 0, 1023, 1014, 1, 0, 0, 0, 1023, 1015, 1, 0, 0, 0, 1023, 1016, 1, 0, 0, 0, 1023, 1017, 1, 0, 0, 0, 1023, 1018, 1, 0, 0, 0, 1023, 1019, 1, 0, 0, 0, 1023, 1020, 1, 0, 0, 0, 1023, 1021, 1, 0, 0, 0, 1023, 1022, 1, 0, 0, 0, 1024, 119, 1, 0, 0, 0, 1025, 1026, 5, 56, 0, 0, 1026, 1027, 3, 150, 75, 0, 1027, 1028, 5, 130, 0, 0, 1028, 1029, 3, 124, 62, 0, 1029, 1059, 1, 0, 0, 0, 1030, 1031, 5, 57, 0, 0, 1031, 1032, 3, 150, 75, 0, 1032, 1033, 5, 130, 0, 0, 1033, 1034, 3, 150, 75, 0, 1034, 1035, 5, 130, 0, 0, 1035, 1036, 3, 126, 63, 0, 1036, 1059, 1, 0, 0, 0, 1037, 1038, 5, 39, 0, 0, 1038, 1040, 3, 150, 75, 0, 1039, 1041, 3, 28, 14, 0, 1040, 1039, 1, 0, 0, 0, 1040, 1041, 1, 0, 0, 0, 1041, 1042, 1, 0, 0, 0, 1042, 1043, 5, 130, 0, 0, 1043, 1044, 3, 116, 58, 0, 1044, 1059, 1, 0, 0, 0, 1045, 1046, 5, 41, 0, 0, 1046, 1047, 3, 150, 75, 0, 1047, 1048, 5, 130, 0, 0, 1048, 1050, 3, 150, 75, 0, 1049, 1051, 3, 28, 14, 0, 1050, 1049, 1, 0, 0, 0, 1050, 1051, 1, 0, 0, 0, 1051, 1053, 1, 0, 0, 0, 1052, 1054, 3, 128, 64, 0, 1053, 1052, 1, 0, 0, 0, 1053, 1054, 1, 0, 0, 0, 1054, 1056, 1, 0, 0, 0, 1055, 1057, 3, 122, 61, 0, 1056, 1055, 1, 0, 0, 0, 1056, 1057, 1, 0, 0, 0, 1057, 1059, 1, 0, 0, 0, 1058, 1025, 1, 0, 0, 0, 1058, 1030, 1, 0, 0, 0, 1058, 1037, 1, 0, 0, 0, 1058, 1045, 1, 0, 0, 0, 1059, 121, 1, 0, 0, 0, 1060, 1061, 5, 61, 0, 0, 1061, 1062, 3, 128, 64, 0, 1062, 123, 1, 0, 0, 0, 1063, 1064, 7, 4, 0, 0, 1064, 125, 1, 0, 0, 0, 1065, 1066, 7, 5, 0, 0, 1066, 127, 1, 0, 0, 0, 1067, 1068, 5, 59, 0, 0, 1068, 1072, 5, 131, 0, 0, 1069, 1071, 3, 130, 65, 0, 1070, 1069, 1, 0, 0, 0, 1071, 1074, 1, 0, 0, 0, 1072, 1070, 1, 0, 0, 0, 1072, 1073, 1, 0, 0, 0, 1073, 1075, 1, 0, 0, 0, 1074, 1072, 1, 0, 0, 0, 1075, 1076, 5, 132, 0, 0, 1076, 129, 1, 0, 0, 0, 1077, 1078, 3, 150, 75, 0, 1078, 1079, 5, 53, 0, 0, 1079, 1080, 5, 4, 0, 0, 1080, 1081, 5, 18, 0, 0, 1081, 1082, 5, 133, 0, 0, 1082, 1083, 3, 78, 39, 0, 1083, 1084, 5, 134, 0, 0, 1084, 1085, 5, 128, 0, 0, 1085, 1176, 1, 0, 0, 0, 1086, 1087, 3, 150, 75, 0, 1087, 1088, 5, 53, 0, 0, 1088, 1089, 5, 56, 0, 0, 1089, 1096, 3, 150, 75, 0, 1090, 1091, 5, 62, 0, 0, 1091, 1092, 5, 57, 0, 0, 1092, 1093, 3, 150, 75, 0, 1093, 1094, 5, 130, 0, 0, 1094, 1095, 3, 150, 75, 0, 1095, 1097, 1, 0, 0, 0, 1096, 1090, 1, 0, 0, 0, 1096, 1097, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1099, 5, 128, 0, 0, 1099, 1176, 1, 0, 0, 0, 1100, 1101, 3, 150, 75, 0, 1101, 1102, 5, 53, 0, 0, 1102, 1103, 5, 57, 0, 0, 1103, 1104, 3, 150, 75, 0, 1104, 1105, 5, 130, 0, 0, 1105, 1112, 3, 150, 75, 0, 1106, 1107, 5, 62, 0, 0, 1107, 1108, 5, 57, 0, 0, 1108, 1109, 3, 150, 75, 0, 1109, 1110, 5, 130, 0, 0, 1110, 1111, 3, 150, 75, 0, 1111, 1113, 1, 0, 0, 0, 1112, 1106, 1, 0, 0, 0, 1112, 1113, 1, 0, 0, 0, 1113, 1114, 1, 0, 0, 0, 1114, 1115, 5, 128, 0, 0, 1115, 1176, 1, 0, 0, 0, 1116, 1117, 3, 150, 75, 0, 1117, 1118, 5, 53, 0, 0, 1118, 1119, 5, 39, 0, 0, 1119, 1121, 3, 150, 75, 0, 1120, 1122, 3, 28, 14, 0, 1121, 1120, 1, 0, 0, 0, 1121, 1122, 1, 0, 0, 0, 1122, 1131, 1, 0, 0, 0, 1123, 1124, 5, 62, 0, 0, 1124, 1125, 5, 57, 0, 0, 1125, 1126, 3, 150, 75, 0, 1126, 1127, 5, 130, 0, 0, 1127, 1128, 3, 150, 75, 0, 1128, 1132, 1, 0, 0, 0, 1129, 1130, 5, 13, 0, 0, 1130, 1132, 5, 48, 0, 0, 1131, 1123, 1, 0, 0, 0, 1131, 1129, 1, 0, 0, 0, 1131, 1132, 1, 0, 0, 0, 1132, 1133, 1, 0, 0, 0, 1133, 1134, 5, 128, 0, 0, 1134, 1176, 1, 0, 0, 0, 1135, 1136, 3, 150, 75, 0, 1136, 1137, 5, 53, 0, 0, 1137, 1138, 5, 2, 0, 0, 1138, 1139, 3, 150, 75, 0, 1139, 1140, 5, 59, 0, 0, 1140, 1144, 5, 131, 0, 0, 1141, 1143, 3, 108, 54, 0, 1142, 1141, 1, 0, 0, 0, 1143, 1146, 1, 0, 0, 0, 1144, 1142, 1, 0, 0, 0, 1144, 1145, 1, 0, 0, 0, 1145, 1147, 1, 0, 0, 0, 1146, 1144, 1, 0, 0, 0, 1147, 1148, 5, 132, 0, 0, 1148, 1149, 5, 128, 0, 0, 1149, 1176, 1, 0, 0, 0, 1150, 1151, 3, 150, 75, 0, 1151, 1152, 5, 53, 0, 0, 1152, 1153, 5, 46, 0, 0, 1153, 1154, 3, 150, 75, 0, 1154, 1155, 5, 128, 0, 0, 1155, 1176, 1, 0, 0, 0, 1156, 1157, 3, 150, 75, 0, 1157, 1159, 5, 53, 0, 0, 1158, 1160, 5, 4, 0, 0, 1159, 1158, 1, 0, 0, 0, 1159, 1160, 1, 0, 0, 0, 1160, 1161, 1, 0, 0, 0, 1161, 1162, 5, 17, 0, 0, 1162, 1163, 3, 150, 75, 0, 1163, 1164, 5, 130, 0, 0, 1164, 1171, 3, 150, 75, 0, 1165, 1166, 5, 62, 0, 0, 1166, 1167, 5, 57, 0, 0, 1167, 1168, 3, 150, 75, 0, 1168, 1169, 5, 130, 0, 0, 1169, 1170, 3, 150, 75, 0, 1170, 1172, 1, 0, 0, 0, 1171, 1165, 1, 0, 0, 0, 1171, 1172, 1, 0, 0, 0, 1172, 1173, 1, 0, 0, 0, 1173, 1174, 5, 128, 0, 0, 1174, 1176, 1, 0, 0, 0, 1175, 1077, 1, 0, 0, 0, 1175, 1086, 1, 0, 0, 0, 1175, 1100, 1, 0, 0, 0, 1175, 1116, 1, 0, 0, 0, 1175, 1135, 1, 0, 0, 0, 1175, 1150, 1, 0, 0, 0, 1175, 1156, 1, 0, 0, 0, 1176, 131, 1, 0, 0, 0, 1177, 1178, 5, 46, 0, 0, 1178, 1179, 3, 150, 75, 0, 1179, 1180, 5, 53, 0, 0, 1180, 1181, 3, 150, 75, 0, 1181, 1182, 5, 130, 0, 0, 1182, 1184, 3, 150, 75, 0, 1183, 1185, 3, 128, 64, 0, 1184, 1183, 1, 0, 0, 0, 1184, 1185, 1, 0, 0, 0, 1185, 1186, 1, 0, 0, 0, 1186, 1187, 5, 128, 0, 0, 1187, 133, 1, 0, 0, 0, 1188, 1235, 3, 138, 69, 0, 1189, 1235, 5, 107, 0, 0, 1190, 1235, 5, 108, 0, 0, 1191, 1192, 5, 109, 0, 0, 1192, 1235, 3, 152, 76, 0, 1193, 1194, 5, 110, 0, 0, 1194, 1195, 5, 137, 0, 0, 1195, 1196, 3, 150, 75, 0, 1196, 1197, 5, 138, 0, 0, 1197, 1235, 1, 0, 0, 0, 1198, 1199, 5, 111, 0, 0, 1199, 1200, 5, 137, 0, 0, 1200, 1202, 3, 150, 75, 0, 1201, 1203, 3, 28, 14, 0, 1202, 1201, 1, 0, 0, 0, 1202, 1203, 1, 0, 0, 0, 1203, 1204, 1, 0, 0, 0, 1204, 1205, 5, 138, 0, 0, 1205, 1235, 1, 0, 0, 0, 1206, 1207, 5, 34, 0, 0, 1207, 1208, 5, 137, 0, 0, 1208, 1209, 3, 150, 75, 0, 1209, 1210, 5, 138, 0, 0, 1210, 1235, 1, 0, 0, 0, 1211, 1212, 5, 112, 0, 0, 1212, 1213, 5, 137, 0, 0, 1213, 1214, 3, 134, 67, 0, 1214, 1215, 5, 138, 0, 0, 1215, 1235, 1, 0, 0, 0, 1216, 1217, 5, 113, 0, 0, 1217, 1218, 5, 137, 0, 0, 1218, 1219, 3, 134, 67, 0, 1219, 1220, 5, 138, 0, 0, 1220, 1235, 1, 0, 0, 0, 1221, 1222, 5, 114, 0, 0, 1222, 1226, 5, 131, 0, 0, 1223, 1225, 3, 136, 68, 0, 1224, 1223, 1, 0, 0, 0, 1225, 1228, 1, 0, 0, 0, 1226, 1224, 1, 0, 0, 0, 1226, 1227, 1, 0, 0, 0, 1227, 1229, 1, 0, 0, 0, 1228, 1226, 1, 0, 0, 0, 1229, 1235, 5, 132, 0, 0, 1230, 1232, 3, 150, 75, 0, 1231, 1233, 3, 28, 14, 0, 1232, 1231, 1, 0, 0, 0, 1232, 1233, 1, 0, 0, 0, 1233, 1235, 1, 0, 0, 0, 1234, 1188, 1, 0, 0, 0, 1234, 1189, 1, 0, 0, 0, 1234, 1190, 1, 0, 0, 0, 1234, 1191, 1, 0, 0, 0, 1234, 1193, 1, 0, 0, 0, 1234, 1198, 1, 0, 0, 0, 1234, 1206, 1, 0, 0, 0, 1234, 1211, 1, 0, 0, 0, 1234, 1216, 1, 0, 0, 0, 1234, 1221, 1, 0, 0, 0, 1234, 1230, 1, 0, 0, 0, 1235, 135, 1, 0, 0, 0, 1236, 1237, 3, 150, 75, 0, 1237, 1238, 5, 127, 0, 0, 1238, 1239, 3, 134, 67, 0, 1239, 1240, 5, 128, 0, 0, 1240, 137, 1, 0, 0, 0, 1241, 1242, 7, 6, 0, 0, 1242, 139, 1, 0, 0, 0, 1243, 1244, 7, 7, 0, 0, 1244, 141, 1, 0, 0, 0, 1245, 1254, 3, 152, 76, 0, 1246, 1254, 5, 141, 0, 0, 1247, 1254, 5, 142, 0, 0, 1248, 1254, 5, 123, 0, 0, 1249, 1254, 5, 124, 0, 0, 1250, 1254, 5, 125, 0, 0, 1251, 1254, 3, 144, 72, 0, 1252, 1254, 3, 148, 74, 0, 1253, 1245, 1, 0, 0, 0, 1253, 1246, 1, 0, 0, 0, 1253, 1247, 1, 0, 0, 0, 1253, 1248, 1, 0, 0, 0, 1253, 1249, 1, 0, 0, 0, 1253, 1250, 1, 0, 0, 0, 1253, 1251, 1, 0, 0, 0, 1253, 1252, 1, 0, 0, 0, 1254, 143, 1, 0, 0, 0, 1255, 1264, 5, 131, 0, 0, 1256, 1261, 3, 146, 73, 0, 1257, 1258, 5, 129, 0, 0, 1258, 1260, 3, 146, 73, 0, 1259, 1257, 1, 0, 0, 0, 1260, 1263, 1, 0, 0, 0, 1261, 1259, 1, 0, 0, 0, 1261, 1262, 1, 0, 0, 0, 1262, 1265, 1, 0, 0, 0, 1263, 1261, 1, 0, 0, 0, 1264, 1256, 1, 0, 0, 0, 1264, 1265, 1, 0, 0, 0, 1265, 1266, 1, 0, 0, 0, 1266, 1267, 5, 132, 0, 0, 1267, 145, 1, 0, 0, 0, 1268, 1269, 3, 152, 76, 0, 1269, 1270, 5, 127, 0, 0, 1270, 1271, 3, 142, 71, 0, 1271, 147, 1, 0, 0, 0, 1272, 1281, 5, 133, 0, 0, 1273, 1278, 3, 142, 71, 0, 1274, 1275, 5, 129, 0, 0, 1275, 1277, 3, 142, 71, 0, 1276, 1274, 1, 0, 0, 0, 1277, 1280, 1, 0, 0, 0, 1278, 1276, 1, 0, 0, 0, 1278, 1279, 1, 0, 0, 0, 1279, 1282, 1, 0, 0, 0, 1280, 1278, 1, 0, 0, 0, 1281, 1273, 1, 0, 0, 0, 1281, 1282, 1, 0, 0, 0, 1282, 1283, 1, 0, 0, 0, 1283, 1284, 5, 134, 0, 0, 1284, 149, 1, 0, 0, 0, 1285, 1286, 7, 8, 0, 0, 1286, 151, 1, 0, 0, 0, 1287, 1288, 5, 144, 0, 0, 1288, 153, 1, 0, 0, 0, 115, 166, 173, 194, 206, 218, 238, 246, 253, 259, 271, 274, 280, 291, 300, 310, 313, 315, 319, 327, 339, 344, 353, 356, 371, 377, 389, 398, 406, 414, 427, 430, 440, 444, 450, 457, 463, 471, 479, 492, 499, 503, 508, 519, 525, 535, 540, 546, 557, 584, 611, 616, 627, 630, 635, 638, 645, 654, 657, 660, 677, 686, 700, 721, 724, 727, 734, 742, 782, 785, 789, 811, 825, 833, 845, 859, 869, 887, 891, 894, 898, 901, 910, 914, 918, 924, 935, 942, 962, 971, 1003, 1023, 1040, 1050, 1053, 1056, 1058, 1072, 1096, 1112, 1121, 1131, 1144, 1159, 1171, 1175, 1184, 1202, 1226, 1232, 1234, 1253, 1261, 1264, 1278, 1281] \ No newline at end of file +[4, 1, 148, 1293, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 167, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 172, 8, 1, 10, 1, 12, 1, 175, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 193, 8, 3, 10, 3, 12, 3, 196, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 207, 8, 4, 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, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 239, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 247, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 252, 8, 10, 10, 10, 12, 10, 255, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 260, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 270, 8, 10, 10, 10, 12, 10, 273, 9, 10, 3, 10, 275, 8, 10, 1, 10, 1, 10, 5, 10, 279, 8, 10, 10, 10, 12, 10, 282, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 290, 8, 11, 10, 11, 12, 11, 293, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 301, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 309, 8, 12, 10, 12, 12, 12, 312, 9, 12, 3, 12, 314, 8, 12, 3, 12, 316, 8, 12, 1, 13, 1, 13, 3, 13, 320, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 326, 8, 14, 10, 14, 12, 14, 329, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 340, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 345, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 354, 8, 17, 1, 18, 3, 18, 357, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 372, 8, 18, 1, 18, 1, 18, 1, 18, 1, 19, 3, 19, 378, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 388, 8, 19, 10, 19, 12, 19, 391, 9, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 399, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 407, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 415, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 428, 8, 20, 1, 21, 3, 21, 431, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 441, 8, 21, 1, 21, 1, 21, 3, 21, 445, 8, 21, 1, 21, 1, 21, 5, 21, 449, 8, 21, 10, 21, 12, 21, 452, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 458, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 464, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 472, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 480, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 493, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 500, 8, 24, 1, 24, 1, 24, 3, 24, 504, 8, 24, 1, 25, 5, 25, 507, 8, 25, 10, 25, 12, 25, 510, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 520, 8, 25, 1, 25, 1, 25, 5, 25, 524, 8, 25, 10, 25, 12, 25, 527, 9, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 536, 8, 26, 1, 27, 1, 27, 1, 27, 3, 27, 541, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 547, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 556, 8, 27, 10, 27, 12, 27, 559, 9, 27, 1, 27, 1, 27, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 585, 8, 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, 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, 3, 29, 612, 8, 29, 1, 30, 1, 30, 1, 30, 3, 30, 617, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 628, 8, 30, 1, 30, 3, 30, 631, 8, 30, 1, 30, 1, 30, 1, 30, 3, 30, 636, 8, 30, 1, 30, 3, 30, 639, 8, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 3, 31, 646, 8, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 655, 8, 31, 1, 31, 3, 31, 658, 8, 31, 1, 31, 3, 31, 661, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 678, 8, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 685, 8, 34, 10, 34, 12, 34, 688, 9, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 701, 8, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 720, 8, 38, 10, 38, 12, 38, 723, 9, 38, 3, 38, 725, 8, 38, 1, 38, 3, 38, 728, 8, 38, 1, 39, 1, 39, 1, 39, 5, 39, 733, 8, 39, 10, 39, 12, 39, 736, 9, 39, 1, 40, 1, 40, 1, 40, 5, 40, 741, 8, 40, 10, 40, 12, 40, 744, 9, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 783, 8, 41, 1, 41, 3, 41, 786, 8, 41, 1, 41, 1, 41, 3, 41, 790, 8, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 812, 8, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 826, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 832, 8, 42, 10, 42, 12, 42, 835, 9, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 3, 45, 846, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 860, 8, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 870, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 888, 8, 49, 1, 49, 1, 49, 3, 49, 892, 8, 49, 1, 49, 3, 49, 895, 8, 49, 1, 49, 1, 49, 3, 49, 899, 8, 49, 1, 49, 3, 49, 902, 8, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 911, 8, 50, 1, 50, 1, 50, 3, 50, 915, 8, 50, 1, 50, 1, 50, 3, 50, 919, 8, 50, 1, 50, 1, 50, 5, 50, 923, 8, 50, 10, 50, 12, 50, 926, 9, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 936, 8, 51, 1, 52, 1, 52, 1, 52, 5, 52, 941, 8, 52, 10, 52, 12, 52, 944, 9, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 963, 8, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 5, 54, 970, 8, 54, 10, 54, 12, 54, 973, 9, 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, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 1004, 8, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 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, 1024, 8, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1044, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1054, 8, 60, 1, 60, 3, 60, 1057, 8, 60, 1, 60, 3, 60, 1060, 8, 60, 3, 60, 1062, 8, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 5, 64, 1074, 8, 64, 10, 64, 12, 64, 1077, 9, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1100, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1116, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1125, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1135, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 5, 65, 1146, 8, 65, 10, 65, 12, 65, 1149, 9, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1163, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1175, 8, 65, 1, 65, 1, 65, 3, 65, 1179, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1188, 8, 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, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1206, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 5, 67, 1228, 8, 67, 10, 67, 12, 67, 1231, 9, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1236, 8, 67, 3, 67, 1238, 8, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1257, 8, 71, 1, 72, 1, 72, 1, 72, 1, 72, 5, 72, 1263, 8, 72, 10, 72, 12, 72, 1266, 9, 72, 3, 72, 1268, 8, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 5, 74, 1280, 8, 74, 10, 74, 12, 74, 1283, 9, 74, 3, 74, 1285, 8, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 0, 0, 77, 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, 0, 9, 2, 0, 10, 10, 28, 28, 1, 0, 6, 7, 1, 0, 96, 100, 3, 0, 1, 1, 91, 95, 97, 98, 3, 0, 1, 1, 91, 92, 97, 98, 2, 0, 93, 95, 97, 98, 1, 0, 116, 123, 1, 0, 103, 106, 7, 0, 1, 3, 5, 28, 40, 40, 69, 69, 89, 90, 101, 101, 144, 144, 1400, 0, 166, 1, 0, 0, 0, 2, 168, 1, 0, 0, 0, 4, 178, 1, 0, 0, 0, 6, 182, 1, 0, 0, 0, 8, 206, 1, 0, 0, 0, 10, 218, 1, 0, 0, 0, 12, 220, 1, 0, 0, 0, 14, 227, 1, 0, 0, 0, 16, 238, 1, 0, 0, 0, 18, 240, 1, 0, 0, 0, 20, 253, 1, 0, 0, 0, 22, 285, 1, 0, 0, 0, 24, 315, 1, 0, 0, 0, 26, 317, 1, 0, 0, 0, 28, 321, 1, 0, 0, 0, 30, 339, 1, 0, 0, 0, 32, 341, 1, 0, 0, 0, 34, 353, 1, 0, 0, 0, 36, 356, 1, 0, 0, 0, 38, 377, 1, 0, 0, 0, 40, 427, 1, 0, 0, 0, 42, 430, 1, 0, 0, 0, 44, 455, 1, 0, 0, 0, 46, 492, 1, 0, 0, 0, 48, 503, 1, 0, 0, 0, 50, 508, 1, 0, 0, 0, 52, 535, 1, 0, 0, 0, 54, 537, 1, 0, 0, 0, 56, 562, 1, 0, 0, 0, 58, 611, 1, 0, 0, 0, 60, 613, 1, 0, 0, 0, 62, 642, 1, 0, 0, 0, 64, 664, 1, 0, 0, 0, 66, 677, 1, 0, 0, 0, 68, 679, 1, 0, 0, 0, 70, 691, 1, 0, 0, 0, 72, 704, 1, 0, 0, 0, 74, 707, 1, 0, 0, 0, 76, 727, 1, 0, 0, 0, 78, 729, 1, 0, 0, 0, 80, 737, 1, 0, 0, 0, 82, 825, 1, 0, 0, 0, 84, 827, 1, 0, 0, 0, 86, 838, 1, 0, 0, 0, 88, 840, 1, 0, 0, 0, 90, 845, 1, 0, 0, 0, 92, 847, 1, 0, 0, 0, 94, 869, 1, 0, 0, 0, 96, 871, 1, 0, 0, 0, 98, 880, 1, 0, 0, 0, 100, 905, 1, 0, 0, 0, 102, 935, 1, 0, 0, 0, 104, 937, 1, 0, 0, 0, 106, 962, 1, 0, 0, 0, 108, 964, 1, 0, 0, 0, 110, 976, 1, 0, 0, 0, 112, 983, 1, 0, 0, 0, 114, 997, 1, 0, 0, 0, 116, 1007, 1, 0, 0, 0, 118, 1023, 1, 0, 0, 0, 120, 1061, 1, 0, 0, 0, 122, 1063, 1, 0, 0, 0, 124, 1066, 1, 0, 0, 0, 126, 1068, 1, 0, 0, 0, 128, 1070, 1, 0, 0, 0, 130, 1178, 1, 0, 0, 0, 132, 1180, 1, 0, 0, 0, 134, 1237, 1, 0, 0, 0, 136, 1239, 1, 0, 0, 0, 138, 1244, 1, 0, 0, 0, 140, 1246, 1, 0, 0, 0, 142, 1256, 1, 0, 0, 0, 144, 1258, 1, 0, 0, 0, 146, 1271, 1, 0, 0, 0, 148, 1275, 1, 0, 0, 0, 150, 1288, 1, 0, 0, 0, 152, 1290, 1, 0, 0, 0, 154, 155, 3, 6, 3, 0, 155, 156, 5, 0, 0, 1, 156, 167, 1, 0, 0, 0, 157, 158, 3, 20, 10, 0, 158, 159, 5, 0, 0, 1, 159, 167, 1, 0, 0, 0, 160, 161, 3, 50, 25, 0, 161, 162, 5, 0, 0, 1, 162, 167, 1, 0, 0, 0, 163, 164, 3, 2, 1, 0, 164, 165, 5, 0, 0, 1, 165, 167, 1, 0, 0, 0, 166, 154, 1, 0, 0, 0, 166, 157, 1, 0, 0, 0, 166, 160, 1, 0, 0, 0, 166, 163, 1, 0, 0, 0, 167, 1, 1, 0, 0, 0, 168, 169, 5, 35, 0, 0, 169, 173, 5, 132, 0, 0, 170, 172, 3, 8, 4, 0, 171, 170, 1, 0, 0, 0, 172, 175, 1, 0, 0, 0, 173, 171, 1, 0, 0, 0, 173, 174, 1, 0, 0, 0, 174, 176, 1, 0, 0, 0, 175, 173, 1, 0, 0, 0, 176, 177, 5, 133, 0, 0, 177, 3, 1, 0, 0, 0, 178, 179, 5, 36, 0, 0, 179, 180, 3, 152, 76, 0, 180, 181, 5, 129, 0, 0, 181, 5, 1, 0, 0, 0, 182, 183, 5, 4, 0, 0, 183, 184, 3, 150, 75, 0, 184, 185, 5, 79, 0, 0, 185, 186, 3, 152, 76, 0, 186, 187, 5, 72, 0, 0, 187, 188, 3, 152, 76, 0, 188, 189, 5, 71, 0, 0, 189, 190, 3, 152, 76, 0, 190, 194, 5, 132, 0, 0, 191, 193, 3, 8, 4, 0, 192, 191, 1, 0, 0, 0, 193, 196, 1, 0, 0, 0, 194, 192, 1, 0, 0, 0, 194, 195, 1, 0, 0, 0, 195, 197, 1, 0, 0, 0, 196, 194, 1, 0, 0, 0, 197, 198, 5, 133, 0, 0, 198, 7, 1, 0, 0, 0, 199, 207, 3, 4, 2, 0, 200, 207, 3, 18, 9, 0, 201, 207, 3, 10, 5, 0, 202, 207, 3, 88, 44, 0, 203, 207, 3, 100, 50, 0, 204, 207, 3, 132, 66, 0, 205, 207, 3, 32, 16, 0, 206, 199, 1, 0, 0, 0, 206, 200, 1, 0, 0, 0, 206, 201, 1, 0, 0, 0, 206, 202, 1, 0, 0, 0, 206, 203, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 206, 205, 1, 0, 0, 0, 207, 9, 1, 0, 0, 0, 208, 209, 5, 36, 0, 0, 209, 210, 5, 39, 0, 0, 210, 211, 3, 150, 75, 0, 211, 212, 5, 129, 0, 0, 212, 219, 1, 0, 0, 0, 213, 214, 5, 36, 0, 0, 214, 215, 5, 41, 0, 0, 215, 216, 3, 150, 75, 0, 216, 217, 5, 129, 0, 0, 217, 219, 1, 0, 0, 0, 218, 208, 1, 0, 0, 0, 218, 213, 1, 0, 0, 0, 219, 11, 1, 0, 0, 0, 220, 221, 5, 37, 0, 0, 221, 222, 5, 38, 0, 0, 222, 223, 3, 150, 75, 0, 223, 224, 5, 79, 0, 0, 224, 225, 3, 152, 76, 0, 225, 226, 5, 129, 0, 0, 226, 13, 1, 0, 0, 0, 227, 228, 5, 37, 0, 0, 228, 229, 5, 39, 0, 0, 229, 230, 3, 150, 75, 0, 230, 231, 5, 72, 0, 0, 231, 232, 3, 152, 76, 0, 232, 233, 5, 129, 0, 0, 233, 15, 1, 0, 0, 0, 234, 239, 3, 10, 5, 0, 235, 239, 3, 12, 6, 0, 236, 239, 3, 14, 7, 0, 237, 239, 3, 32, 16, 0, 238, 234, 1, 0, 0, 0, 238, 235, 1, 0, 0, 0, 238, 236, 1, 0, 0, 0, 238, 237, 1, 0, 0, 0, 239, 17, 1, 0, 0, 0, 240, 241, 5, 38, 0, 0, 241, 242, 3, 150, 75, 0, 242, 243, 5, 79, 0, 0, 243, 246, 3, 152, 76, 0, 244, 245, 5, 80, 0, 0, 245, 247, 3, 152, 76, 0, 246, 244, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 249, 5, 129, 0, 0, 249, 19, 1, 0, 0, 0, 250, 252, 3, 16, 8, 0, 251, 250, 1, 0, 0, 0, 252, 255, 1, 0, 0, 0, 253, 251, 1, 0, 0, 0, 253, 254, 1, 0, 0, 0, 254, 256, 1, 0, 0, 0, 255, 253, 1, 0, 0, 0, 256, 257, 5, 39, 0, 0, 257, 259, 3, 150, 75, 0, 258, 260, 3, 22, 11, 0, 259, 258, 1, 0, 0, 0, 259, 260, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 262, 5, 79, 0, 0, 262, 263, 3, 152, 76, 0, 263, 264, 5, 72, 0, 0, 264, 274, 3, 152, 76, 0, 265, 266, 5, 84, 0, 0, 266, 271, 3, 26, 13, 0, 267, 268, 5, 130, 0, 0, 268, 270, 3, 26, 13, 0, 269, 267, 1, 0, 0, 0, 270, 273, 1, 0, 0, 0, 271, 269, 1, 0, 0, 0, 271, 272, 1, 0, 0, 0, 272, 275, 1, 0, 0, 0, 273, 271, 1, 0, 0, 0, 274, 265, 1, 0, 0, 0, 274, 275, 1, 0, 0, 0, 275, 276, 1, 0, 0, 0, 276, 280, 5, 132, 0, 0, 277, 279, 3, 34, 17, 0, 278, 277, 1, 0, 0, 0, 279, 282, 1, 0, 0, 0, 280, 278, 1, 0, 0, 0, 280, 281, 1, 0, 0, 0, 281, 283, 1, 0, 0, 0, 282, 280, 1, 0, 0, 0, 283, 284, 5, 133, 0, 0, 284, 21, 1, 0, 0, 0, 285, 286, 5, 138, 0, 0, 286, 291, 3, 24, 12, 0, 287, 288, 5, 130, 0, 0, 288, 290, 3, 24, 12, 0, 289, 287, 1, 0, 0, 0, 290, 293, 1, 0, 0, 0, 291, 289, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 294, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 294, 295, 5, 139, 0, 0, 295, 23, 1, 0, 0, 0, 296, 297, 5, 42, 0, 0, 297, 300, 3, 150, 75, 0, 298, 299, 5, 128, 0, 0, 299, 301, 5, 32, 0, 0, 300, 298, 1, 0, 0, 0, 300, 301, 1, 0, 0, 0, 301, 316, 1, 0, 0, 0, 302, 303, 5, 31, 0, 0, 303, 313, 3, 150, 75, 0, 304, 305, 5, 33, 0, 0, 305, 310, 3, 26, 13, 0, 306, 307, 5, 140, 0, 0, 307, 309, 3, 26, 13, 0, 308, 306, 1, 0, 0, 0, 309, 312, 1, 0, 0, 0, 310, 308, 1, 0, 0, 0, 310, 311, 1, 0, 0, 0, 311, 314, 1, 0, 0, 0, 312, 310, 1, 0, 0, 0, 313, 304, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 316, 1, 0, 0, 0, 315, 296, 1, 0, 0, 0, 315, 302, 1, 0, 0, 0, 316, 25, 1, 0, 0, 0, 317, 319, 3, 150, 75, 0, 318, 320, 3, 28, 14, 0, 319, 318, 1, 0, 0, 0, 319, 320, 1, 0, 0, 0, 320, 27, 1, 0, 0, 0, 321, 322, 5, 138, 0, 0, 322, 327, 3, 30, 15, 0, 323, 324, 5, 130, 0, 0, 324, 326, 3, 30, 15, 0, 325, 323, 1, 0, 0, 0, 326, 329, 1, 0, 0, 0, 327, 325, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 330, 1, 0, 0, 0, 329, 327, 1, 0, 0, 0, 330, 331, 5, 139, 0, 0, 331, 29, 1, 0, 0, 0, 332, 333, 5, 38, 0, 0, 333, 340, 3, 150, 75, 0, 334, 335, 5, 39, 0, 0, 335, 340, 3, 26, 13, 0, 336, 337, 5, 31, 0, 0, 337, 340, 3, 150, 75, 0, 338, 340, 3, 134, 67, 0, 339, 332, 1, 0, 0, 0, 339, 334, 1, 0, 0, 0, 339, 336, 1, 0, 0, 0, 339, 338, 1, 0, 0, 0, 340, 31, 1, 0, 0, 0, 341, 342, 5, 30, 0, 0, 342, 344, 3, 150, 75, 0, 343, 345, 3, 22, 11, 0, 344, 343, 1, 0, 0, 0, 344, 345, 1, 0, 0, 0, 345, 346, 1, 0, 0, 0, 346, 347, 5, 141, 0, 0, 347, 348, 3, 134, 67, 0, 348, 349, 5, 129, 0, 0, 349, 33, 1, 0, 0, 0, 350, 354, 3, 38, 19, 0, 351, 354, 3, 42, 21, 0, 352, 354, 3, 36, 18, 0, 353, 350, 1, 0, 0, 0, 353, 351, 1, 0, 0, 0, 353, 352, 1, 0, 0, 0, 354, 35, 1, 0, 0, 0, 355, 357, 5, 52, 0, 0, 356, 355, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 358, 1, 0, 0, 0, 358, 359, 5, 44, 0, 0, 359, 360, 3, 150, 75, 0, 360, 361, 5, 79, 0, 0, 361, 362, 3, 152, 76, 0, 362, 363, 5, 128, 0, 0, 363, 364, 3, 134, 67, 0, 364, 365, 5, 127, 0, 0, 365, 366, 3, 134, 67, 0, 366, 367, 5, 132, 0, 0, 367, 368, 5, 96, 0, 0, 368, 369, 5, 79, 0, 0, 369, 371, 3, 152, 76, 0, 370, 372, 3, 66, 33, 0, 371, 370, 1, 0, 0, 0, 371, 372, 1, 0, 0, 0, 372, 373, 1, 0, 0, 0, 373, 374, 5, 129, 0, 0, 374, 375, 5, 133, 0, 0, 375, 37, 1, 0, 0, 0, 376, 378, 3, 44, 22, 0, 377, 376, 1, 0, 0, 0, 377, 378, 1, 0, 0, 0, 378, 379, 1, 0, 0, 0, 379, 380, 5, 42, 0, 0, 380, 381, 3, 150, 75, 0, 381, 382, 5, 79, 0, 0, 382, 383, 3, 152, 76, 0, 383, 384, 5, 128, 0, 0, 384, 385, 3, 134, 67, 0, 385, 389, 5, 132, 0, 0, 386, 388, 3, 40, 20, 0, 387, 386, 1, 0, 0, 0, 388, 391, 1, 0, 0, 0, 389, 387, 1, 0, 0, 0, 389, 390, 1, 0, 0, 0, 390, 392, 1, 0, 0, 0, 391, 389, 1, 0, 0, 0, 392, 393, 5, 133, 0, 0, 393, 39, 1, 0, 0, 0, 394, 395, 5, 86, 0, 0, 395, 396, 5, 79, 0, 0, 396, 398, 3, 152, 76, 0, 397, 399, 3, 66, 33, 0, 398, 397, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 401, 5, 129, 0, 0, 401, 428, 1, 0, 0, 0, 402, 403, 5, 87, 0, 0, 403, 404, 5, 79, 0, 0, 404, 406, 3, 152, 76, 0, 405, 407, 3, 66, 33, 0, 406, 405, 1, 0, 0, 0, 406, 407, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 409, 5, 129, 0, 0, 409, 428, 1, 0, 0, 0, 410, 411, 5, 1, 0, 0, 411, 412, 5, 79, 0, 0, 412, 414, 3, 152, 76, 0, 413, 415, 3, 66, 33, 0, 414, 413, 1, 0, 0, 0, 414, 415, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 417, 5, 129, 0, 0, 417, 428, 1, 0, 0, 0, 418, 419, 5, 88, 0, 0, 419, 420, 5, 89, 0, 0, 420, 421, 5, 79, 0, 0, 421, 422, 3, 152, 76, 0, 422, 423, 5, 90, 0, 0, 423, 424, 5, 79, 0, 0, 424, 425, 3, 152, 76, 0, 425, 426, 5, 129, 0, 0, 426, 428, 1, 0, 0, 0, 427, 394, 1, 0, 0, 0, 427, 402, 1, 0, 0, 0, 427, 410, 1, 0, 0, 0, 427, 418, 1, 0, 0, 0, 428, 41, 1, 0, 0, 0, 429, 431, 3, 44, 22, 0, 430, 429, 1, 0, 0, 0, 430, 431, 1, 0, 0, 0, 431, 432, 1, 0, 0, 0, 432, 433, 5, 43, 0, 0, 433, 434, 3, 150, 75, 0, 434, 435, 5, 79, 0, 0, 435, 436, 3, 152, 76, 0, 436, 437, 5, 128, 0, 0, 437, 438, 3, 140, 70, 0, 438, 440, 3, 48, 24, 0, 439, 441, 5, 107, 0, 0, 440, 439, 1, 0, 0, 0, 440, 441, 1, 0, 0, 0, 441, 444, 1, 0, 0, 0, 442, 443, 5, 77, 0, 0, 443, 445, 3, 152, 76, 0, 444, 442, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 450, 5, 132, 0, 0, 447, 449, 3, 46, 23, 0, 448, 447, 1, 0, 0, 0, 449, 452, 1, 0, 0, 0, 450, 448, 1, 0, 0, 0, 450, 451, 1, 0, 0, 0, 451, 453, 1, 0, 0, 0, 452, 450, 1, 0, 0, 0, 453, 454, 5, 133, 0, 0, 454, 43, 1, 0, 0, 0, 455, 457, 5, 27, 0, 0, 456, 458, 7, 0, 0, 0, 457, 456, 1, 0, 0, 0, 457, 458, 1, 0, 0, 0, 458, 45, 1, 0, 0, 0, 459, 460, 5, 93, 0, 0, 460, 461, 5, 79, 0, 0, 461, 463, 3, 152, 76, 0, 462, 464, 3, 66, 33, 0, 463, 462, 1, 0, 0, 0, 463, 464, 1, 0, 0, 0, 464, 465, 1, 0, 0, 0, 465, 466, 5, 129, 0, 0, 466, 493, 1, 0, 0, 0, 467, 468, 5, 94, 0, 0, 468, 469, 5, 79, 0, 0, 469, 471, 3, 152, 76, 0, 470, 472, 3, 66, 33, 0, 471, 470, 1, 0, 0, 0, 471, 472, 1, 0, 0, 0, 472, 473, 1, 0, 0, 0, 473, 474, 5, 129, 0, 0, 474, 493, 1, 0, 0, 0, 475, 476, 5, 95, 0, 0, 476, 477, 5, 79, 0, 0, 477, 479, 3, 152, 76, 0, 478, 480, 3, 66, 33, 0, 479, 478, 1, 0, 0, 0, 479, 480, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 482, 5, 129, 0, 0, 482, 493, 1, 0, 0, 0, 483, 484, 5, 88, 0, 0, 484, 485, 5, 89, 0, 0, 485, 486, 5, 79, 0, 0, 486, 487, 3, 152, 76, 0, 487, 488, 5, 90, 0, 0, 488, 489, 5, 79, 0, 0, 489, 490, 3, 152, 76, 0, 490, 491, 5, 129, 0, 0, 491, 493, 1, 0, 0, 0, 492, 459, 1, 0, 0, 0, 492, 467, 1, 0, 0, 0, 492, 475, 1, 0, 0, 0, 492, 483, 1, 0, 0, 0, 493, 47, 1, 0, 0, 0, 494, 495, 5, 38, 0, 0, 495, 504, 3, 150, 75, 0, 496, 497, 5, 39, 0, 0, 497, 499, 3, 150, 75, 0, 498, 500, 3, 28, 14, 0, 499, 498, 1, 0, 0, 0, 499, 500, 1, 0, 0, 0, 500, 504, 1, 0, 0, 0, 501, 502, 5, 31, 0, 0, 502, 504, 3, 150, 75, 0, 503, 494, 1, 0, 0, 0, 503, 496, 1, 0, 0, 0, 503, 501, 1, 0, 0, 0, 504, 49, 1, 0, 0, 0, 505, 507, 3, 16, 8, 0, 506, 505, 1, 0, 0, 0, 507, 510, 1, 0, 0, 0, 508, 506, 1, 0, 0, 0, 508, 509, 1, 0, 0, 0, 509, 511, 1, 0, 0, 0, 510, 508, 1, 0, 0, 0, 511, 512, 5, 41, 0, 0, 512, 513, 3, 150, 75, 0, 513, 514, 5, 79, 0, 0, 514, 515, 3, 152, 76, 0, 515, 516, 5, 72, 0, 0, 516, 519, 3, 152, 76, 0, 517, 518, 5, 73, 0, 0, 518, 520, 5, 142, 0, 0, 519, 517, 1, 0, 0, 0, 519, 520, 1, 0, 0, 0, 520, 521, 1, 0, 0, 0, 521, 525, 5, 132, 0, 0, 522, 524, 3, 52, 26, 0, 523, 522, 1, 0, 0, 0, 524, 527, 1, 0, 0, 0, 525, 523, 1, 0, 0, 0, 525, 526, 1, 0, 0, 0, 526, 528, 1, 0, 0, 0, 527, 525, 1, 0, 0, 0, 528, 529, 5, 133, 0, 0, 529, 51, 1, 0, 0, 0, 530, 536, 3, 60, 30, 0, 531, 536, 3, 62, 31, 0, 532, 536, 3, 70, 35, 0, 533, 536, 3, 54, 27, 0, 534, 536, 3, 56, 28, 0, 535, 530, 1, 0, 0, 0, 535, 531, 1, 0, 0, 0, 535, 532, 1, 0, 0, 0, 535, 533, 1, 0, 0, 0, 535, 534, 1, 0, 0, 0, 536, 53, 1, 0, 0, 0, 537, 538, 5, 17, 0, 0, 538, 540, 3, 150, 75, 0, 539, 541, 3, 22, 11, 0, 540, 539, 1, 0, 0, 0, 540, 541, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 543, 5, 79, 0, 0, 543, 544, 3, 152, 76, 0, 544, 546, 5, 20, 0, 0, 545, 547, 5, 4, 0, 0, 546, 545, 1, 0, 0, 0, 546, 547, 1, 0, 0, 0, 547, 548, 1, 0, 0, 0, 548, 549, 3, 26, 13, 0, 549, 550, 5, 21, 0, 0, 550, 551, 3, 152, 76, 0, 551, 552, 5, 44, 0, 0, 552, 553, 3, 152, 76, 0, 553, 557, 5, 132, 0, 0, 554, 556, 3, 58, 29, 0, 555, 554, 1, 0, 0, 0, 556, 559, 1, 0, 0, 0, 557, 555, 1, 0, 0, 0, 557, 558, 1, 0, 0, 0, 558, 560, 1, 0, 0, 0, 559, 557, 1, 0, 0, 0, 560, 561, 5, 133, 0, 0, 561, 55, 1, 0, 0, 0, 562, 563, 5, 17, 0, 0, 563, 564, 3, 150, 75, 0, 564, 565, 5, 79, 0, 0, 565, 566, 3, 152, 76, 0, 566, 567, 5, 19, 0, 0, 567, 568, 3, 150, 75, 0, 568, 569, 3, 28, 14, 0, 569, 570, 5, 129, 0, 0, 570, 57, 1, 0, 0, 0, 571, 572, 5, 11, 0, 0, 572, 612, 5, 129, 0, 0, 573, 574, 5, 12, 0, 0, 574, 575, 5, 13, 0, 0, 575, 576, 3, 150, 75, 0, 576, 577, 5, 129, 0, 0, 577, 612, 1, 0, 0, 0, 578, 579, 5, 22, 0, 0, 579, 580, 3, 152, 76, 0, 580, 581, 5, 129, 0, 0, 581, 612, 1, 0, 0, 0, 582, 584, 5, 23, 0, 0, 583, 585, 5, 31, 0, 0, 584, 583, 1, 0, 0, 0, 584, 585, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 587, 3, 150, 75, 0, 587, 588, 5, 50, 0, 0, 588, 589, 3, 26, 13, 0, 589, 590, 5, 129, 0, 0, 590, 612, 1, 0, 0, 0, 591, 592, 5, 24, 0, 0, 592, 593, 3, 150, 75, 0, 593, 594, 5, 142, 0, 0, 594, 595, 5, 129, 0, 0, 595, 612, 1, 0, 0, 0, 596, 597, 5, 25, 0, 0, 597, 598, 3, 26, 13, 0, 598, 599, 5, 131, 0, 0, 599, 600, 3, 150, 75, 0, 600, 601, 3, 150, 75, 0, 601, 602, 3, 152, 76, 0, 602, 603, 5, 129, 0, 0, 603, 612, 1, 0, 0, 0, 604, 605, 5, 88, 0, 0, 605, 612, 5, 129, 0, 0, 606, 607, 5, 26, 0, 0, 607, 608, 5, 142, 0, 0, 608, 609, 3, 152, 76, 0, 609, 610, 5, 129, 0, 0, 610, 612, 1, 0, 0, 0, 611, 571, 1, 0, 0, 0, 611, 573, 1, 0, 0, 0, 611, 578, 1, 0, 0, 0, 611, 582, 1, 0, 0, 0, 611, 591, 1, 0, 0, 0, 611, 596, 1, 0, 0, 0, 611, 604, 1, 0, 0, 0, 611, 606, 1, 0, 0, 0, 612, 59, 1, 0, 0, 0, 613, 614, 5, 44, 0, 0, 614, 616, 3, 150, 75, 0, 615, 617, 3, 22, 11, 0, 616, 615, 1, 0, 0, 0, 616, 617, 1, 0, 0, 0, 617, 618, 1, 0, 0, 0, 618, 619, 5, 79, 0, 0, 619, 620, 3, 152, 76, 0, 620, 621, 5, 128, 0, 0, 621, 622, 3, 134, 67, 0, 622, 623, 5, 127, 0, 0, 623, 624, 3, 134, 67, 0, 624, 625, 5, 81, 0, 0, 625, 627, 3, 74, 37, 0, 626, 628, 3, 66, 33, 0, 627, 626, 1, 0, 0, 0, 627, 628, 1, 0, 0, 0, 628, 630, 1, 0, 0, 0, 629, 631, 3, 72, 36, 0, 630, 629, 1, 0, 0, 0, 630, 631, 1, 0, 0, 0, 631, 632, 1, 0, 0, 0, 632, 633, 5, 83, 0, 0, 633, 635, 3, 76, 38, 0, 634, 636, 3, 80, 40, 0, 635, 634, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 638, 1, 0, 0, 0, 637, 639, 3, 64, 32, 0, 638, 637, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 641, 5, 129, 0, 0, 641, 61, 1, 0, 0, 0, 642, 643, 5, 45, 0, 0, 643, 645, 3, 150, 75, 0, 644, 646, 3, 22, 11, 0, 645, 644, 1, 0, 0, 0, 645, 646, 1, 0, 0, 0, 646, 647, 1, 0, 0, 0, 647, 648, 5, 79, 0, 0, 648, 649, 3, 152, 76, 0, 649, 650, 5, 128, 0, 0, 650, 651, 3, 134, 67, 0, 651, 652, 5, 127, 0, 0, 652, 654, 3, 134, 67, 0, 653, 655, 3, 66, 33, 0, 654, 653, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 657, 1, 0, 0, 0, 656, 658, 3, 80, 40, 0, 657, 656, 1, 0, 0, 0, 657, 658, 1, 0, 0, 0, 658, 660, 1, 0, 0, 0, 659, 661, 3, 64, 32, 0, 660, 659, 1, 0, 0, 0, 660, 661, 1, 0, 0, 0, 661, 662, 1, 0, 0, 0, 662, 663, 5, 129, 0, 0, 663, 63, 1, 0, 0, 0, 664, 665, 5, 61, 0, 0, 665, 666, 5, 60, 0, 0, 666, 667, 3, 150, 75, 0, 667, 65, 1, 0, 0, 0, 668, 669, 5, 5, 0, 0, 669, 678, 5, 8, 0, 0, 670, 671, 5, 5, 0, 0, 671, 672, 7, 1, 0, 0, 672, 673, 5, 9, 0, 0, 673, 674, 5, 134, 0, 0, 674, 675, 3, 78, 39, 0, 675, 676, 5, 135, 0, 0, 676, 678, 1, 0, 0, 0, 677, 668, 1, 0, 0, 0, 677, 670, 1, 0, 0, 0, 678, 67, 1, 0, 0, 0, 679, 680, 5, 60, 0, 0, 680, 681, 5, 134, 0, 0, 681, 686, 3, 116, 58, 0, 682, 683, 5, 130, 0, 0, 683, 685, 3, 116, 58, 0, 684, 682, 1, 0, 0, 0, 685, 688, 1, 0, 0, 0, 686, 684, 1, 0, 0, 0, 686, 687, 1, 0, 0, 0, 687, 689, 1, 0, 0, 0, 688, 686, 1, 0, 0, 0, 689, 690, 5, 135, 0, 0, 690, 69, 1, 0, 0, 0, 691, 692, 5, 46, 0, 0, 692, 693, 3, 150, 75, 0, 693, 694, 5, 79, 0, 0, 694, 695, 3, 152, 76, 0, 695, 696, 5, 47, 0, 0, 696, 697, 3, 150, 75, 0, 697, 698, 5, 128, 0, 0, 698, 700, 3, 134, 67, 0, 699, 701, 3, 80, 40, 0, 700, 699, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 702, 1, 0, 0, 0, 702, 703, 5, 129, 0, 0, 703, 71, 1, 0, 0, 0, 704, 705, 5, 82, 0, 0, 705, 706, 3, 134, 67, 0, 706, 73, 1, 0, 0, 0, 707, 708, 7, 2, 0, 0, 708, 75, 1, 0, 0, 0, 709, 728, 5, 85, 0, 0, 710, 711, 5, 38, 0, 0, 711, 728, 3, 150, 75, 0, 712, 713, 5, 31, 0, 0, 713, 728, 3, 150, 75, 0, 714, 715, 5, 40, 0, 0, 715, 724, 5, 134, 0, 0, 716, 721, 3, 26, 13, 0, 717, 718, 5, 130, 0, 0, 718, 720, 3, 26, 13, 0, 719, 717, 1, 0, 0, 0, 720, 723, 1, 0, 0, 0, 721, 719, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 725, 1, 0, 0, 0, 723, 721, 1, 0, 0, 0, 724, 716, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 726, 1, 0, 0, 0, 726, 728, 5, 135, 0, 0, 727, 709, 1, 0, 0, 0, 727, 710, 1, 0, 0, 0, 727, 712, 1, 0, 0, 0, 727, 714, 1, 0, 0, 0, 728, 77, 1, 0, 0, 0, 729, 734, 3, 150, 75, 0, 730, 731, 5, 130, 0, 0, 731, 733, 3, 150, 75, 0, 732, 730, 1, 0, 0, 0, 733, 736, 1, 0, 0, 0, 734, 732, 1, 0, 0, 0, 734, 735, 1, 0, 0, 0, 735, 79, 1, 0, 0, 0, 736, 734, 1, 0, 0, 0, 737, 738, 5, 84, 0, 0, 738, 742, 5, 132, 0, 0, 739, 741, 3, 82, 41, 0, 740, 739, 1, 0, 0, 0, 741, 744, 1, 0, 0, 0, 742, 740, 1, 0, 0, 0, 742, 743, 1, 0, 0, 0, 743, 745, 1, 0, 0, 0, 744, 742, 1, 0, 0, 0, 745, 746, 5, 133, 0, 0, 746, 81, 1, 0, 0, 0, 747, 748, 5, 18, 0, 0, 748, 749, 3, 150, 75, 0, 749, 750, 5, 79, 0, 0, 750, 751, 3, 152, 76, 0, 751, 752, 5, 134, 0, 0, 752, 753, 3, 78, 39, 0, 753, 754, 5, 135, 0, 0, 754, 755, 5, 129, 0, 0, 755, 826, 1, 0, 0, 0, 756, 757, 5, 56, 0, 0, 757, 758, 3, 150, 75, 0, 758, 759, 5, 79, 0, 0, 759, 760, 3, 152, 76, 0, 760, 761, 5, 128, 0, 0, 761, 762, 3, 134, 67, 0, 762, 763, 3, 84, 42, 0, 763, 764, 5, 129, 0, 0, 764, 826, 1, 0, 0, 0, 765, 766, 5, 57, 0, 0, 766, 767, 3, 150, 75, 0, 767, 768, 5, 79, 0, 0, 768, 769, 3, 152, 76, 0, 769, 770, 5, 128, 0, 0, 770, 771, 3, 140, 70, 0, 771, 772, 3, 48, 24, 0, 772, 773, 3, 84, 42, 0, 773, 774, 5, 129, 0, 0, 774, 826, 1, 0, 0, 0, 775, 776, 5, 39, 0, 0, 776, 777, 3, 150, 75, 0, 777, 778, 5, 79, 0, 0, 778, 779, 3, 152, 76, 0, 779, 780, 5, 128, 0, 0, 780, 782, 3, 150, 75, 0, 781, 783, 3, 28, 14, 0, 782, 781, 1, 0, 0, 0, 782, 783, 1, 0, 0, 0, 783, 785, 1, 0, 0, 0, 784, 786, 3, 68, 34, 0, 785, 784, 1, 0, 0, 0, 785, 786, 1, 0, 0, 0, 786, 789, 1, 0, 0, 0, 787, 788, 5, 13, 0, 0, 788, 790, 5, 48, 0, 0, 789, 787, 1, 0, 0, 0, 789, 790, 1, 0, 0, 0, 790, 791, 1, 0, 0, 0, 791, 792, 5, 129, 0, 0, 792, 826, 1, 0, 0, 0, 793, 794, 5, 2, 0, 0, 794, 795, 3, 150, 75, 0, 795, 796, 5, 79, 0, 0, 796, 797, 3, 152, 76, 0, 797, 798, 5, 128, 0, 0, 798, 799, 3, 150, 75, 0, 799, 800, 5, 48, 0, 0, 800, 801, 3, 134, 67, 0, 801, 802, 5, 129, 0, 0, 802, 826, 1, 0, 0, 0, 803, 804, 5, 46, 0, 0, 804, 805, 3, 150, 75, 0, 805, 806, 5, 79, 0, 0, 806, 807, 3, 152, 76, 0, 807, 808, 5, 128, 0, 0, 808, 811, 3, 150, 75, 0, 809, 810, 5, 48, 0, 0, 810, 812, 3, 134, 67, 0, 811, 809, 1, 0, 0, 0, 811, 812, 1, 0, 0, 0, 812, 813, 1, 0, 0, 0, 813, 814, 5, 129, 0, 0, 814, 826, 1, 0, 0, 0, 815, 816, 5, 17, 0, 0, 816, 817, 3, 150, 75, 0, 817, 818, 5, 79, 0, 0, 818, 819, 3, 152, 76, 0, 819, 820, 5, 128, 0, 0, 820, 821, 3, 150, 75, 0, 821, 822, 5, 131, 0, 0, 822, 823, 3, 150, 75, 0, 823, 824, 5, 129, 0, 0, 824, 826, 1, 0, 0, 0, 825, 747, 1, 0, 0, 0, 825, 756, 1, 0, 0, 0, 825, 765, 1, 0, 0, 0, 825, 775, 1, 0, 0, 0, 825, 793, 1, 0, 0, 0, 825, 803, 1, 0, 0, 0, 825, 815, 1, 0, 0, 0, 826, 83, 1, 0, 0, 0, 827, 828, 5, 134, 0, 0, 828, 833, 3, 86, 43, 0, 829, 830, 5, 130, 0, 0, 830, 832, 3, 86, 43, 0, 831, 829, 1, 0, 0, 0, 832, 835, 1, 0, 0, 0, 833, 831, 1, 0, 0, 0, 833, 834, 1, 0, 0, 0, 834, 836, 1, 0, 0, 0, 835, 833, 1, 0, 0, 0, 836, 837, 5, 135, 0, 0, 837, 85, 1, 0, 0, 0, 838, 839, 7, 3, 0, 0, 839, 87, 1, 0, 0, 0, 840, 841, 5, 55, 0, 0, 841, 842, 3, 90, 45, 0, 842, 89, 1, 0, 0, 0, 843, 846, 3, 92, 46, 0, 844, 846, 3, 96, 48, 0, 845, 843, 1, 0, 0, 0, 845, 844, 1, 0, 0, 0, 846, 91, 1, 0, 0, 0, 847, 848, 5, 56, 0, 0, 848, 849, 3, 150, 75, 0, 849, 850, 5, 79, 0, 0, 850, 851, 3, 152, 76, 0, 851, 852, 5, 66, 0, 0, 852, 853, 3, 150, 75, 0, 853, 854, 5, 128, 0, 0, 854, 855, 3, 134, 67, 0, 855, 856, 5, 67, 0, 0, 856, 859, 3, 94, 47, 0, 857, 858, 5, 68, 0, 0, 858, 860, 3, 142, 71, 0, 859, 857, 1, 0, 0, 0, 859, 860, 1, 0, 0, 0, 860, 861, 1, 0, 0, 0, 861, 862, 5, 129, 0, 0, 862, 93, 1, 0, 0, 0, 863, 870, 5, 101, 0, 0, 864, 865, 5, 102, 0, 0, 865, 866, 5, 136, 0, 0, 866, 867, 3, 134, 67, 0, 867, 868, 5, 137, 0, 0, 868, 870, 1, 0, 0, 0, 869, 863, 1, 0, 0, 0, 869, 864, 1, 0, 0, 0, 870, 95, 1, 0, 0, 0, 871, 872, 5, 57, 0, 0, 872, 873, 3, 150, 75, 0, 873, 874, 5, 79, 0, 0, 874, 875, 3, 152, 76, 0, 875, 876, 5, 132, 0, 0, 876, 877, 3, 98, 49, 0, 877, 878, 3, 98, 49, 0, 878, 879, 5, 133, 0, 0, 879, 97, 1, 0, 0, 0, 880, 881, 3, 48, 24, 0, 881, 882, 5, 58, 0, 0, 882, 883, 3, 150, 75, 0, 883, 884, 5, 79, 0, 0, 884, 885, 3, 152, 76, 0, 885, 887, 3, 140, 70, 0, 886, 888, 5, 107, 0, 0, 887, 886, 1, 0, 0, 0, 887, 888, 1, 0, 0, 0, 888, 891, 1, 0, 0, 0, 889, 890, 5, 74, 0, 0, 890, 892, 3, 152, 76, 0, 891, 889, 1, 0, 0, 0, 891, 892, 1, 0, 0, 0, 892, 894, 1, 0, 0, 0, 893, 895, 5, 76, 0, 0, 894, 893, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 898, 1, 0, 0, 0, 896, 897, 5, 77, 0, 0, 897, 899, 3, 152, 76, 0, 898, 896, 1, 0, 0, 0, 898, 899, 1, 0, 0, 0, 899, 901, 1, 0, 0, 0, 900, 902, 5, 78, 0, 0, 901, 900, 1, 0, 0, 0, 901, 902, 1, 0, 0, 0, 902, 903, 1, 0, 0, 0, 903, 904, 5, 129, 0, 0, 904, 99, 1, 0, 0, 0, 905, 906, 5, 49, 0, 0, 906, 907, 3, 150, 75, 0, 907, 908, 5, 50, 0, 0, 908, 910, 3, 150, 75, 0, 909, 911, 3, 28, 14, 0, 910, 909, 1, 0, 0, 0, 910, 911, 1, 0, 0, 0, 911, 914, 1, 0, 0, 0, 912, 913, 5, 79, 0, 0, 913, 915, 3, 152, 76, 0, 914, 912, 1, 0, 0, 0, 914, 915, 1, 0, 0, 0, 915, 918, 1, 0, 0, 0, 916, 917, 5, 73, 0, 0, 917, 919, 5, 142, 0, 0, 918, 916, 1, 0, 0, 0, 918, 919, 1, 0, 0, 0, 919, 920, 1, 0, 0, 0, 920, 924, 5, 132, 0, 0, 921, 923, 3, 102, 51, 0, 922, 921, 1, 0, 0, 0, 923, 926, 1, 0, 0, 0, 924, 922, 1, 0, 0, 0, 924, 925, 1, 0, 0, 0, 925, 927, 1, 0, 0, 0, 926, 924, 1, 0, 0, 0, 927, 928, 5, 133, 0, 0, 928, 101, 1, 0, 0, 0, 929, 930, 5, 54, 0, 0, 930, 936, 3, 90, 45, 0, 931, 936, 3, 114, 57, 0, 932, 936, 3, 110, 55, 0, 933, 936, 3, 104, 52, 0, 934, 936, 3, 112, 56, 0, 935, 929, 1, 0, 0, 0, 935, 931, 1, 0, 0, 0, 935, 932, 1, 0, 0, 0, 935, 933, 1, 0, 0, 0, 935, 934, 1, 0, 0, 0, 936, 103, 1, 0, 0, 0, 937, 938, 5, 3, 0, 0, 938, 942, 5, 132, 0, 0, 939, 941, 3, 106, 53, 0, 940, 939, 1, 0, 0, 0, 941, 944, 1, 0, 0, 0, 942, 940, 1, 0, 0, 0, 942, 943, 1, 0, 0, 0, 943, 945, 1, 0, 0, 0, 944, 942, 1, 0, 0, 0, 945, 946, 5, 133, 0, 0, 946, 947, 5, 129, 0, 0, 947, 105, 1, 0, 0, 0, 948, 949, 3, 150, 75, 0, 949, 950, 5, 53, 0, 0, 950, 951, 5, 56, 0, 0, 951, 952, 3, 150, 75, 0, 952, 953, 5, 129, 0, 0, 953, 963, 1, 0, 0, 0, 954, 955, 3, 150, 75, 0, 955, 956, 5, 53, 0, 0, 956, 957, 5, 57, 0, 0, 957, 958, 3, 150, 75, 0, 958, 959, 5, 131, 0, 0, 959, 960, 3, 150, 75, 0, 960, 961, 5, 129, 0, 0, 961, 963, 1, 0, 0, 0, 962, 948, 1, 0, 0, 0, 962, 954, 1, 0, 0, 0, 963, 107, 1, 0, 0, 0, 964, 965, 3, 26, 13, 0, 965, 966, 5, 13, 0, 0, 966, 971, 5, 48, 0, 0, 967, 968, 5, 131, 0, 0, 968, 970, 3, 150, 75, 0, 969, 967, 1, 0, 0, 0, 970, 973, 1, 0, 0, 0, 971, 969, 1, 0, 0, 0, 971, 972, 1, 0, 0, 0, 972, 974, 1, 0, 0, 0, 973, 971, 1, 0, 0, 0, 974, 975, 5, 129, 0, 0, 975, 109, 1, 0, 0, 0, 976, 977, 5, 51, 0, 0, 977, 978, 3, 150, 75, 0, 978, 979, 5, 53, 0, 0, 979, 980, 5, 56, 0, 0, 980, 981, 3, 150, 75, 0, 981, 982, 5, 129, 0, 0, 982, 111, 1, 0, 0, 0, 983, 984, 5, 63, 0, 0, 984, 985, 3, 150, 75, 0, 985, 986, 5, 64, 0, 0, 986, 987, 5, 65, 0, 0, 987, 988, 5, 60, 0, 0, 988, 989, 5, 46, 0, 0, 989, 990, 3, 150, 75, 0, 990, 991, 5, 62, 0, 0, 991, 992, 5, 57, 0, 0, 992, 993, 3, 150, 75, 0, 993, 994, 5, 131, 0, 0, 994, 995, 3, 150, 75, 0, 995, 996, 5, 129, 0, 0, 996, 113, 1, 0, 0, 0, 997, 998, 5, 51, 0, 0, 998, 999, 3, 116, 58, 0, 999, 1000, 5, 53, 0, 0, 1000, 1003, 3, 120, 60, 0, 1001, 1002, 5, 29, 0, 0, 1002, 1004, 3, 152, 76, 0, 1003, 1001, 1, 0, 0, 0, 1003, 1004, 1, 0, 0, 0, 1004, 1005, 1, 0, 0, 0, 1005, 1006, 5, 129, 0, 0, 1006, 115, 1, 0, 0, 0, 1007, 1008, 3, 150, 75, 0, 1008, 1009, 5, 131, 0, 0, 1009, 1010, 3, 118, 59, 0, 1010, 117, 1, 0, 0, 0, 1011, 1024, 3, 150, 75, 0, 1012, 1024, 5, 96, 0, 0, 1013, 1024, 5, 86, 0, 0, 1014, 1024, 5, 87, 0, 0, 1015, 1024, 5, 1, 0, 0, 1016, 1024, 5, 93, 0, 0, 1017, 1024, 5, 94, 0, 0, 1018, 1024, 5, 95, 0, 0, 1019, 1024, 5, 97, 0, 0, 1020, 1024, 5, 98, 0, 0, 1021, 1024, 5, 99, 0, 0, 1022, 1024, 5, 100, 0, 0, 1023, 1011, 1, 0, 0, 0, 1023, 1012, 1, 0, 0, 0, 1023, 1013, 1, 0, 0, 0, 1023, 1014, 1, 0, 0, 0, 1023, 1015, 1, 0, 0, 0, 1023, 1016, 1, 0, 0, 0, 1023, 1017, 1, 0, 0, 0, 1023, 1018, 1, 0, 0, 0, 1023, 1019, 1, 0, 0, 0, 1023, 1020, 1, 0, 0, 0, 1023, 1021, 1, 0, 0, 0, 1023, 1022, 1, 0, 0, 0, 1024, 119, 1, 0, 0, 0, 1025, 1026, 5, 75, 0, 0, 1026, 1027, 5, 131, 0, 0, 1027, 1062, 3, 150, 75, 0, 1028, 1029, 5, 56, 0, 0, 1029, 1030, 3, 150, 75, 0, 1030, 1031, 5, 131, 0, 0, 1031, 1032, 3, 124, 62, 0, 1032, 1062, 1, 0, 0, 0, 1033, 1034, 5, 57, 0, 0, 1034, 1035, 3, 150, 75, 0, 1035, 1036, 5, 131, 0, 0, 1036, 1037, 3, 150, 75, 0, 1037, 1038, 5, 131, 0, 0, 1038, 1039, 3, 126, 63, 0, 1039, 1062, 1, 0, 0, 0, 1040, 1041, 5, 39, 0, 0, 1041, 1043, 3, 150, 75, 0, 1042, 1044, 3, 28, 14, 0, 1043, 1042, 1, 0, 0, 0, 1043, 1044, 1, 0, 0, 0, 1044, 1045, 1, 0, 0, 0, 1045, 1046, 5, 131, 0, 0, 1046, 1047, 3, 116, 58, 0, 1047, 1062, 1, 0, 0, 0, 1048, 1049, 5, 41, 0, 0, 1049, 1050, 3, 150, 75, 0, 1050, 1051, 5, 131, 0, 0, 1051, 1053, 3, 150, 75, 0, 1052, 1054, 3, 28, 14, 0, 1053, 1052, 1, 0, 0, 0, 1053, 1054, 1, 0, 0, 0, 1054, 1056, 1, 0, 0, 0, 1055, 1057, 3, 128, 64, 0, 1056, 1055, 1, 0, 0, 0, 1056, 1057, 1, 0, 0, 0, 1057, 1059, 1, 0, 0, 0, 1058, 1060, 3, 122, 61, 0, 1059, 1058, 1, 0, 0, 0, 1059, 1060, 1, 0, 0, 0, 1060, 1062, 1, 0, 0, 0, 1061, 1025, 1, 0, 0, 0, 1061, 1028, 1, 0, 0, 0, 1061, 1033, 1, 0, 0, 0, 1061, 1040, 1, 0, 0, 0, 1061, 1048, 1, 0, 0, 0, 1062, 121, 1, 0, 0, 0, 1063, 1064, 5, 61, 0, 0, 1064, 1065, 3, 128, 64, 0, 1065, 123, 1, 0, 0, 0, 1066, 1067, 7, 4, 0, 0, 1067, 125, 1, 0, 0, 0, 1068, 1069, 7, 5, 0, 0, 1069, 127, 1, 0, 0, 0, 1070, 1071, 5, 59, 0, 0, 1071, 1075, 5, 132, 0, 0, 1072, 1074, 3, 130, 65, 0, 1073, 1072, 1, 0, 0, 0, 1074, 1077, 1, 0, 0, 0, 1075, 1073, 1, 0, 0, 0, 1075, 1076, 1, 0, 0, 0, 1076, 1078, 1, 0, 0, 0, 1077, 1075, 1, 0, 0, 0, 1078, 1079, 5, 133, 0, 0, 1079, 129, 1, 0, 0, 0, 1080, 1081, 3, 150, 75, 0, 1081, 1082, 5, 53, 0, 0, 1082, 1083, 5, 4, 0, 0, 1083, 1084, 5, 18, 0, 0, 1084, 1085, 5, 134, 0, 0, 1085, 1086, 3, 78, 39, 0, 1086, 1087, 5, 135, 0, 0, 1087, 1088, 5, 129, 0, 0, 1088, 1179, 1, 0, 0, 0, 1089, 1090, 3, 150, 75, 0, 1090, 1091, 5, 53, 0, 0, 1091, 1092, 5, 56, 0, 0, 1092, 1099, 3, 150, 75, 0, 1093, 1094, 5, 62, 0, 0, 1094, 1095, 5, 57, 0, 0, 1095, 1096, 3, 150, 75, 0, 1096, 1097, 5, 131, 0, 0, 1097, 1098, 3, 150, 75, 0, 1098, 1100, 1, 0, 0, 0, 1099, 1093, 1, 0, 0, 0, 1099, 1100, 1, 0, 0, 0, 1100, 1101, 1, 0, 0, 0, 1101, 1102, 5, 129, 0, 0, 1102, 1179, 1, 0, 0, 0, 1103, 1104, 3, 150, 75, 0, 1104, 1105, 5, 53, 0, 0, 1105, 1106, 5, 57, 0, 0, 1106, 1107, 3, 150, 75, 0, 1107, 1108, 5, 131, 0, 0, 1108, 1115, 3, 150, 75, 0, 1109, 1110, 5, 62, 0, 0, 1110, 1111, 5, 57, 0, 0, 1111, 1112, 3, 150, 75, 0, 1112, 1113, 5, 131, 0, 0, 1113, 1114, 3, 150, 75, 0, 1114, 1116, 1, 0, 0, 0, 1115, 1109, 1, 0, 0, 0, 1115, 1116, 1, 0, 0, 0, 1116, 1117, 1, 0, 0, 0, 1117, 1118, 5, 129, 0, 0, 1118, 1179, 1, 0, 0, 0, 1119, 1120, 3, 150, 75, 0, 1120, 1121, 5, 53, 0, 0, 1121, 1122, 5, 39, 0, 0, 1122, 1124, 3, 150, 75, 0, 1123, 1125, 3, 28, 14, 0, 1124, 1123, 1, 0, 0, 0, 1124, 1125, 1, 0, 0, 0, 1125, 1134, 1, 0, 0, 0, 1126, 1127, 5, 62, 0, 0, 1127, 1128, 5, 57, 0, 0, 1128, 1129, 3, 150, 75, 0, 1129, 1130, 5, 131, 0, 0, 1130, 1131, 3, 150, 75, 0, 1131, 1135, 1, 0, 0, 0, 1132, 1133, 5, 13, 0, 0, 1133, 1135, 5, 48, 0, 0, 1134, 1126, 1, 0, 0, 0, 1134, 1132, 1, 0, 0, 0, 1134, 1135, 1, 0, 0, 0, 1135, 1136, 1, 0, 0, 0, 1136, 1137, 5, 129, 0, 0, 1137, 1179, 1, 0, 0, 0, 1138, 1139, 3, 150, 75, 0, 1139, 1140, 5, 53, 0, 0, 1140, 1141, 5, 2, 0, 0, 1141, 1142, 3, 150, 75, 0, 1142, 1143, 5, 59, 0, 0, 1143, 1147, 5, 132, 0, 0, 1144, 1146, 3, 108, 54, 0, 1145, 1144, 1, 0, 0, 0, 1146, 1149, 1, 0, 0, 0, 1147, 1145, 1, 0, 0, 0, 1147, 1148, 1, 0, 0, 0, 1148, 1150, 1, 0, 0, 0, 1149, 1147, 1, 0, 0, 0, 1150, 1151, 5, 133, 0, 0, 1151, 1152, 5, 129, 0, 0, 1152, 1179, 1, 0, 0, 0, 1153, 1154, 3, 150, 75, 0, 1154, 1155, 5, 53, 0, 0, 1155, 1156, 5, 46, 0, 0, 1156, 1157, 3, 150, 75, 0, 1157, 1158, 5, 129, 0, 0, 1158, 1179, 1, 0, 0, 0, 1159, 1160, 3, 150, 75, 0, 1160, 1162, 5, 53, 0, 0, 1161, 1163, 5, 4, 0, 0, 1162, 1161, 1, 0, 0, 0, 1162, 1163, 1, 0, 0, 0, 1163, 1164, 1, 0, 0, 0, 1164, 1165, 5, 17, 0, 0, 1165, 1166, 3, 150, 75, 0, 1166, 1167, 5, 131, 0, 0, 1167, 1174, 3, 150, 75, 0, 1168, 1169, 5, 62, 0, 0, 1169, 1170, 5, 57, 0, 0, 1170, 1171, 3, 150, 75, 0, 1171, 1172, 5, 131, 0, 0, 1172, 1173, 3, 150, 75, 0, 1173, 1175, 1, 0, 0, 0, 1174, 1168, 1, 0, 0, 0, 1174, 1175, 1, 0, 0, 0, 1175, 1176, 1, 0, 0, 0, 1176, 1177, 5, 129, 0, 0, 1177, 1179, 1, 0, 0, 0, 1178, 1080, 1, 0, 0, 0, 1178, 1089, 1, 0, 0, 0, 1178, 1103, 1, 0, 0, 0, 1178, 1119, 1, 0, 0, 0, 1178, 1138, 1, 0, 0, 0, 1178, 1153, 1, 0, 0, 0, 1178, 1159, 1, 0, 0, 0, 1179, 131, 1, 0, 0, 0, 1180, 1181, 5, 46, 0, 0, 1181, 1182, 3, 150, 75, 0, 1182, 1183, 5, 53, 0, 0, 1183, 1184, 3, 150, 75, 0, 1184, 1185, 5, 131, 0, 0, 1185, 1187, 3, 150, 75, 0, 1186, 1188, 3, 128, 64, 0, 1187, 1186, 1, 0, 0, 0, 1187, 1188, 1, 0, 0, 0, 1188, 1189, 1, 0, 0, 0, 1189, 1190, 5, 129, 0, 0, 1190, 133, 1, 0, 0, 0, 1191, 1238, 3, 138, 69, 0, 1192, 1238, 5, 108, 0, 0, 1193, 1238, 5, 109, 0, 0, 1194, 1195, 5, 110, 0, 0, 1195, 1238, 3, 152, 76, 0, 1196, 1197, 5, 111, 0, 0, 1197, 1198, 5, 138, 0, 0, 1198, 1199, 3, 150, 75, 0, 1199, 1200, 5, 139, 0, 0, 1200, 1238, 1, 0, 0, 0, 1201, 1202, 5, 112, 0, 0, 1202, 1203, 5, 138, 0, 0, 1203, 1205, 3, 150, 75, 0, 1204, 1206, 3, 28, 14, 0, 1205, 1204, 1, 0, 0, 0, 1205, 1206, 1, 0, 0, 0, 1206, 1207, 1, 0, 0, 0, 1207, 1208, 5, 139, 0, 0, 1208, 1238, 1, 0, 0, 0, 1209, 1210, 5, 34, 0, 0, 1210, 1211, 5, 138, 0, 0, 1211, 1212, 3, 150, 75, 0, 1212, 1213, 5, 139, 0, 0, 1213, 1238, 1, 0, 0, 0, 1214, 1215, 5, 113, 0, 0, 1215, 1216, 5, 138, 0, 0, 1216, 1217, 3, 134, 67, 0, 1217, 1218, 5, 139, 0, 0, 1218, 1238, 1, 0, 0, 0, 1219, 1220, 5, 114, 0, 0, 1220, 1221, 5, 138, 0, 0, 1221, 1222, 3, 134, 67, 0, 1222, 1223, 5, 139, 0, 0, 1223, 1238, 1, 0, 0, 0, 1224, 1225, 5, 115, 0, 0, 1225, 1229, 5, 132, 0, 0, 1226, 1228, 3, 136, 68, 0, 1227, 1226, 1, 0, 0, 0, 1228, 1231, 1, 0, 0, 0, 1229, 1227, 1, 0, 0, 0, 1229, 1230, 1, 0, 0, 0, 1230, 1232, 1, 0, 0, 0, 1231, 1229, 1, 0, 0, 0, 1232, 1238, 5, 133, 0, 0, 1233, 1235, 3, 150, 75, 0, 1234, 1236, 3, 28, 14, 0, 1235, 1234, 1, 0, 0, 0, 1235, 1236, 1, 0, 0, 0, 1236, 1238, 1, 0, 0, 0, 1237, 1191, 1, 0, 0, 0, 1237, 1192, 1, 0, 0, 0, 1237, 1193, 1, 0, 0, 0, 1237, 1194, 1, 0, 0, 0, 1237, 1196, 1, 0, 0, 0, 1237, 1201, 1, 0, 0, 0, 1237, 1209, 1, 0, 0, 0, 1237, 1214, 1, 0, 0, 0, 1237, 1219, 1, 0, 0, 0, 1237, 1224, 1, 0, 0, 0, 1237, 1233, 1, 0, 0, 0, 1238, 135, 1, 0, 0, 0, 1239, 1240, 3, 150, 75, 0, 1240, 1241, 5, 128, 0, 0, 1241, 1242, 3, 134, 67, 0, 1242, 1243, 5, 129, 0, 0, 1243, 137, 1, 0, 0, 0, 1244, 1245, 7, 6, 0, 0, 1245, 139, 1, 0, 0, 0, 1246, 1247, 7, 7, 0, 0, 1247, 141, 1, 0, 0, 0, 1248, 1257, 3, 152, 76, 0, 1249, 1257, 5, 142, 0, 0, 1250, 1257, 5, 143, 0, 0, 1251, 1257, 5, 124, 0, 0, 1252, 1257, 5, 125, 0, 0, 1253, 1257, 5, 126, 0, 0, 1254, 1257, 3, 144, 72, 0, 1255, 1257, 3, 148, 74, 0, 1256, 1248, 1, 0, 0, 0, 1256, 1249, 1, 0, 0, 0, 1256, 1250, 1, 0, 0, 0, 1256, 1251, 1, 0, 0, 0, 1256, 1252, 1, 0, 0, 0, 1256, 1253, 1, 0, 0, 0, 1256, 1254, 1, 0, 0, 0, 1256, 1255, 1, 0, 0, 0, 1257, 143, 1, 0, 0, 0, 1258, 1267, 5, 132, 0, 0, 1259, 1264, 3, 146, 73, 0, 1260, 1261, 5, 130, 0, 0, 1261, 1263, 3, 146, 73, 0, 1262, 1260, 1, 0, 0, 0, 1263, 1266, 1, 0, 0, 0, 1264, 1262, 1, 0, 0, 0, 1264, 1265, 1, 0, 0, 0, 1265, 1268, 1, 0, 0, 0, 1266, 1264, 1, 0, 0, 0, 1267, 1259, 1, 0, 0, 0, 1267, 1268, 1, 0, 0, 0, 1268, 1269, 1, 0, 0, 0, 1269, 1270, 5, 133, 0, 0, 1270, 145, 1, 0, 0, 0, 1271, 1272, 3, 152, 76, 0, 1272, 1273, 5, 128, 0, 0, 1273, 1274, 3, 142, 71, 0, 1274, 147, 1, 0, 0, 0, 1275, 1284, 5, 134, 0, 0, 1276, 1281, 3, 142, 71, 0, 1277, 1278, 5, 130, 0, 0, 1278, 1280, 3, 142, 71, 0, 1279, 1277, 1, 0, 0, 0, 1280, 1283, 1, 0, 0, 0, 1281, 1279, 1, 0, 0, 0, 1281, 1282, 1, 0, 0, 0, 1282, 1285, 1, 0, 0, 0, 1283, 1281, 1, 0, 0, 0, 1284, 1276, 1, 0, 0, 0, 1284, 1285, 1, 0, 0, 0, 1285, 1286, 1, 0, 0, 0, 1286, 1287, 5, 135, 0, 0, 1287, 149, 1, 0, 0, 0, 1288, 1289, 7, 8, 0, 0, 1289, 151, 1, 0, 0, 0, 1290, 1291, 5, 145, 0, 0, 1291, 153, 1, 0, 0, 0, 115, 166, 173, 194, 206, 218, 238, 246, 253, 259, 271, 274, 280, 291, 300, 310, 313, 315, 319, 327, 339, 344, 353, 356, 371, 377, 389, 398, 406, 414, 427, 430, 440, 444, 450, 457, 463, 471, 479, 492, 499, 503, 508, 519, 525, 535, 540, 546, 557, 584, 611, 616, 627, 630, 635, 638, 645, 654, 657, 660, 677, 686, 700, 721, 724, 727, 734, 742, 782, 785, 789, 811, 825, 833, 845, 859, 869, 887, 891, 894, 898, 901, 910, 914, 918, 924, 935, 942, 962, 971, 1003, 1023, 1043, 1053, 1056, 1059, 1061, 1075, 1099, 1115, 1124, 1134, 1147, 1162, 1174, 1178, 1187, 1205, 1229, 1235, 1237, 1256, 1264, 1267, 1281, 1284] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapability.tokens b/src/capability-language/generated/QuixosCapability.tokens index 3f8605d..56aff23 100644 --- a/src/capability-language/generated/QuixosCapability.tokens +++ b/src/capability-language/generated/QuixosCapability.tokens @@ -72,79 +72,80 @@ COMMIT=71 REVISION=72 SEMANTIC_MAJOR=73 ON_DELETE=74 -RETAIN_OTHER=75 -KEYED=76 -PUBLIC_TRAVERSAL=77 -ID=78 -DOC=79 -MODE=80 -EMITS=81 -RECEIVER=82 -REQUIRES=83 -ANY=84 -GET=85 -SET=86 -WATCH=87 -START=88 -STOP=89 -READ=90 -WRITE=91 -RESOLVE=92 -CONNECT=93 -DISCONNECT=94 -CALL=95 -WATCH_START=96 -WATCH_STOP=97 -SUBSCRIBE=98 -UNSUBSCRIBE=99 -REGISTER=100 -CRDT=101 -OPTIONAL_ONE=102 -EXACTLY_ONE=103 -MANY_UNIQUE=104 -MANY=105 -ORDERED=106 -UNIT=107 -WATCH_HANDLE=108 -MESSAGE=109 -ATOM_REF=110 -INTERFACE_REF=111 -OPTIONAL=112 -LIST=113 -RECORD=114 -BOOL=115 -BYTES=116 -DOUBLE=117 -INT32=118 -INT64=119 -STRING=120 -UINT32=121 -UINT64=122 -TRUE=123 -FALSE=124 -NULL=125 -ARROW=126 -COLON=127 -SEMI=128 -COMMA=129 -DOT=130 -LBRACE=131 -RBRACE=132 -LBRACK=133 -RBRACK=134 -LPAREN=135 -RPAREN=136 -LT=137 -GT=138 -AMP=139 -EQUAL=140 -INTEGER=141 -JSON_NUMBER=142 -IDENTIFIER=143 -STRING_LITERAL=144 -LINE_COMMENT=145 -BLOCK_COMMENT=146 -WS=147 +LIFECYCLE=75 +RETAIN_OTHER=76 +KEYED=77 +PUBLIC_TRAVERSAL=78 +ID=79 +DOC=80 +MODE=81 +EMITS=82 +RECEIVER=83 +REQUIRES=84 +ANY=85 +GET=86 +SET=87 +WATCH=88 +START=89 +STOP=90 +READ=91 +WRITE=92 +RESOLVE=93 +CONNECT=94 +DISCONNECT=95 +CALL=96 +WATCH_START=97 +WATCH_STOP=98 +SUBSCRIBE=99 +UNSUBSCRIBE=100 +REGISTER=101 +CRDT=102 +OPTIONAL_ONE=103 +EXACTLY_ONE=104 +MANY_UNIQUE=105 +MANY=106 +ORDERED=107 +UNIT=108 +WATCH_HANDLE=109 +MESSAGE=110 +ATOM_REF=111 +INTERFACE_REF=112 +OPTIONAL=113 +LIST=114 +RECORD=115 +BOOL=116 +BYTES=117 +DOUBLE=118 +INT32=119 +INT64=120 +STRING=121 +UINT32=122 +UINT64=123 +TRUE=124 +FALSE=125 +NULL=126 +ARROW=127 +COLON=128 +SEMI=129 +COMMA=130 +DOT=131 +LBRACE=132 +RBRACE=133 +LBRACK=134 +RBRACK=135 +LPAREN=136 +RPAREN=137 +LT=138 +GT=139 +AMP=140 +EQUAL=141 +INTEGER=142 +JSON_NUMBER=143 +IDENTIFIER=144 +STRING_LITERAL=145 +LINE_COMMENT=146 +BLOCK_COMMENT=147 +WS=148 'edit'=1 'creation'=2 'initialize'=3 @@ -219,69 +220,70 @@ WS=147 'revision'=72 'semantic-major'=73 'on-delete'=74 -'retain-other'=75 -'keyed'=76 -'public-traversal'=77 -'id'=78 -'doc'=79 -'mode'=80 -'emits'=81 -'receiver'=82 -'requires'=83 -'any'=84 -'get'=85 -'set'=86 -'watch'=87 -'start'=88 -'stop'=89 -'read'=90 -'write'=91 -'resolve'=92 -'connect'=93 -'disconnect'=94 -'call'=95 -'watch-start'=96 -'watch-stop'=97 -'subscribe'=98 -'unsubscribe'=99 -'register'=100 -'crdt'=101 -'optional-one'=102 -'exactly-one'=103 -'many-unique'=104 -'many'=105 -'ordered'=106 -'unit'=107 -'watch-handle'=108 -'message'=109 -'atom-ref'=110 -'interface-ref'=111 -'optional'=112 -'list'=113 -'record'=114 -'bool'=115 -'bytes'=116 -'double'=117 -'int32'=118 -'int64'=119 -'string'=120 -'uint32'=121 -'uint64'=122 -'true'=123 -'false'=124 -'null'=125 -'->'=126 -':'=127 -';'=128 -','=129 -'.'=130 -'{'=131 -'}'=132 -'['=133 -']'=134 -'('=135 -')'=136 -'<'=137 -'>'=138 -'&'=139 -'='=140 +'lifecycle'=75 +'retain-other'=76 +'keyed'=77 +'public-traversal'=78 +'id'=79 +'doc'=80 +'mode'=81 +'emits'=82 +'receiver'=83 +'requires'=84 +'any'=85 +'get'=86 +'set'=87 +'watch'=88 +'start'=89 +'stop'=90 +'read'=91 +'write'=92 +'resolve'=93 +'connect'=94 +'disconnect'=95 +'call'=96 +'watch-start'=97 +'watch-stop'=98 +'subscribe'=99 +'unsubscribe'=100 +'register'=101 +'crdt'=102 +'optional-one'=103 +'exactly-one'=104 +'many-unique'=105 +'many'=106 +'ordered'=107 +'unit'=108 +'watch-handle'=109 +'message'=110 +'atom-ref'=111 +'interface-ref'=112 +'optional'=113 +'list'=114 +'record'=115 +'bool'=116 +'bytes'=117 +'double'=118 +'int32'=119 +'int64'=120 +'string'=121 +'uint32'=122 +'uint64'=123 +'true'=124 +'false'=125 +'null'=126 +'->'=127 +':'=128 +';'=129 +','=130 +'.'=131 +'{'=132 +'}'=133 +'['=134 +']'=135 +'('=136 +')'=137 +'<'=138 +'>'=139 +'&'=140 +'='=141 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.interp b/src/capability-language/generated/QuixosCapabilityLexer.interp index 8117fb2..4b7782b 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.interp +++ b/src/capability-language/generated/QuixosCapabilityLexer.interp @@ -74,6 +74,7 @@ null 'revision' 'semantic-major' 'on-delete' +'lifecycle' 'retain-other' 'keyed' 'public-traversal' @@ -224,6 +225,7 @@ COMMIT REVISION SEMANTIC_MAJOR ON_DELETE +LIFECYCLE RETAIN_OTHER KEYED PUBLIC_TRAVERSAL @@ -373,6 +375,7 @@ COMMIT REVISION SEMANTIC_MAJOR ON_DELETE +LIFECYCLE RETAIN_OTHER KEYED PUBLIC_TRAVERSAL @@ -457,4 +460,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 147, 1406, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 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, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 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, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 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, 17, 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, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 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, 26, 1, 26, 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, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 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, 32, 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, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 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, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 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, 42, 1, 42, 1, 42, 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, 44, 1, 44, 1, 44, 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, 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, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 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, 1, 53, 1, 53, 1, 54, 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, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 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, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 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, 64, 1, 65, 1, 65, 1, 65, 1, 66, 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, 67, 1, 67, 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, 69, 1, 69, 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, 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, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 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, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 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, 81, 1, 81, 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, 84, 1, 84, 1, 84, 1, 84, 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, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 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, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 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, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 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, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 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, 101, 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, 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, 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, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 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, 3, 140, 1307, 8, 140, 1, 140, 4, 140, 1310, 8, 140, 11, 140, 12, 140, 1311, 1, 141, 3, 141, 1315, 8, 141, 1, 141, 1, 141, 1, 141, 5, 141, 1320, 8, 141, 10, 141, 12, 141, 1323, 9, 141, 3, 141, 1325, 8, 141, 1, 141, 1, 141, 4, 141, 1329, 8, 141, 11, 141, 12, 141, 1330, 3, 141, 1333, 8, 141, 1, 141, 1, 141, 3, 141, 1337, 8, 141, 1, 141, 4, 141, 1340, 8, 141, 11, 141, 12, 141, 1341, 3, 141, 1344, 8, 141, 1, 142, 1, 142, 5, 142, 1348, 8, 142, 10, 142, 12, 142, 1351, 9, 142, 1, 143, 1, 143, 1, 143, 5, 143, 1356, 8, 143, 10, 143, 12, 143, 1359, 9, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 1, 144, 3, 144, 1371, 8, 144, 1, 145, 1, 145, 1, 146, 1, 146, 1, 146, 1, 146, 5, 146, 1379, 8, 146, 10, 146, 12, 146, 1382, 9, 146, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 5, 147, 1390, 8, 147, 10, 147, 12, 147, 1393, 9, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 147, 1, 148, 4, 148, 1401, 8, 148, 11, 148, 12, 148, 1402, 1, 148, 1, 148, 1, 1391, 0, 149, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 143, 287, 144, 289, 0, 291, 0, 293, 145, 295, 146, 297, 147, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1420, 0, 1, 1, 0, 0, 0, 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, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 1, 0, 0, 0, 0, 285, 1, 0, 0, 0, 0, 287, 1, 0, 0, 0, 0, 293, 1, 0, 0, 0, 0, 295, 1, 0, 0, 0, 0, 297, 1, 0, 0, 0, 1, 299, 1, 0, 0, 0, 3, 304, 1, 0, 0, 0, 5, 313, 1, 0, 0, 0, 7, 324, 1, 0, 0, 0, 9, 334, 1, 0, 0, 0, 11, 344, 1, 0, 0, 0, 13, 353, 1, 0, 0, 0, 15, 365, 1, 0, 0, 0, 17, 372, 1, 0, 0, 0, 19, 380, 1, 0, 0, 0, 21, 389, 1, 0, 0, 0, 23, 397, 1, 0, 0, 0, 25, 403, 1, 0, 0, 0, 27, 408, 1, 0, 0, 0, 29, 421, 1, 0, 0, 0, 31, 431, 1, 0, 0, 0, 33, 443, 1, 0, 0, 0, 35, 449, 1, 0, 0, 0, 37, 460, 1, 0, 0, 0, 39, 471, 1, 0, 0, 0, 41, 476, 1, 0, 0, 0, 43, 485, 1, 0, 0, 0, 45, 495, 1, 0, 0, 0, 47, 500, 1, 0, 0, 0, 49, 504, 1, 0, 0, 0, 51, 510, 1, 0, 0, 0, 53, 515, 1, 0, 0, 0, 55, 525, 1, 0, 0, 0, 57, 529, 1, 0, 0, 0, 59, 542, 1, 0, 0, 0, 61, 547, 1, 0, 0, 0, 63, 554, 1, 0, 0, 0, 65, 563, 1, 0, 0, 0, 67, 574, 1, 0, 0, 0, 69, 578, 1, 0, 0, 0, 71, 587, 1, 0, 0, 0, 73, 594, 1, 0, 0, 0, 75, 603, 1, 0, 0, 0, 77, 608, 1, 0, 0, 0, 79, 618, 1, 0, 0, 0, 81, 629, 1, 0, 0, 0, 83, 637, 1, 0, 0, 0, 85, 643, 1, 0, 0, 0, 87, 652, 1, 0, 0, 0, 89, 662, 1, 0, 0, 0, 91, 671, 1, 0, 0, 0, 93, 683, 1, 0, 0, 0, 95, 694, 1, 0, 0, 0, 97, 700, 1, 0, 0, 0, 99, 708, 1, 0, 0, 0, 101, 711, 1, 0, 0, 0, 103, 716, 1, 0, 0, 0, 105, 723, 1, 0, 0, 0, 107, 726, 1, 0, 0, 0, 109, 734, 1, 0, 0, 0, 111, 741, 1, 0, 0, 0, 113, 747, 1, 0, 0, 0, 115, 752, 1, 0, 0, 0, 117, 763, 1, 0, 0, 0, 119, 768, 1, 0, 0, 0, 121, 774, 1, 0, 0, 0, 123, 781, 1, 0, 0, 0, 125, 785, 1, 0, 0, 0, 127, 797, 1, 0, 0, 0, 129, 800, 1, 0, 0, 0, 131, 807, 1, 0, 0, 0, 133, 810, 1, 0, 0, 0, 135, 817, 1, 0, 0, 0, 137, 825, 1, 0, 0, 0, 139, 832, 1, 0, 0, 0, 141, 843, 1, 0, 0, 0, 143, 850, 1, 0, 0, 0, 145, 859, 1, 0, 0, 0, 147, 874, 1, 0, 0, 0, 149, 884, 1, 0, 0, 0, 151, 897, 1, 0, 0, 0, 153, 903, 1, 0, 0, 0, 155, 920, 1, 0, 0, 0, 157, 923, 1, 0, 0, 0, 159, 927, 1, 0, 0, 0, 161, 932, 1, 0, 0, 0, 163, 938, 1, 0, 0, 0, 165, 947, 1, 0, 0, 0, 167, 956, 1, 0, 0, 0, 169, 960, 1, 0, 0, 0, 171, 964, 1, 0, 0, 0, 173, 968, 1, 0, 0, 0, 175, 974, 1, 0, 0, 0, 177, 980, 1, 0, 0, 0, 179, 985, 1, 0, 0, 0, 181, 990, 1, 0, 0, 0, 183, 996, 1, 0, 0, 0, 185, 1004, 1, 0, 0, 0, 187, 1012, 1, 0, 0, 0, 189, 1023, 1, 0, 0, 0, 191, 1028, 1, 0, 0, 0, 193, 1040, 1, 0, 0, 0, 195, 1051, 1, 0, 0, 0, 197, 1061, 1, 0, 0, 0, 199, 1073, 1, 0, 0, 0, 201, 1082, 1, 0, 0, 0, 203, 1087, 1, 0, 0, 0, 205, 1100, 1, 0, 0, 0, 207, 1112, 1, 0, 0, 0, 209, 1124, 1, 0, 0, 0, 211, 1129, 1, 0, 0, 0, 213, 1137, 1, 0, 0, 0, 215, 1142, 1, 0, 0, 0, 217, 1155, 1, 0, 0, 0, 219, 1163, 1, 0, 0, 0, 221, 1172, 1, 0, 0, 0, 223, 1186, 1, 0, 0, 0, 225, 1195, 1, 0, 0, 0, 227, 1200, 1, 0, 0, 0, 229, 1207, 1, 0, 0, 0, 231, 1212, 1, 0, 0, 0, 233, 1218, 1, 0, 0, 0, 235, 1225, 1, 0, 0, 0, 237, 1231, 1, 0, 0, 0, 239, 1237, 1, 0, 0, 0, 241, 1244, 1, 0, 0, 0, 243, 1251, 1, 0, 0, 0, 245, 1258, 1, 0, 0, 0, 247, 1263, 1, 0, 0, 0, 249, 1269, 1, 0, 0, 0, 251, 1274, 1, 0, 0, 0, 253, 1277, 1, 0, 0, 0, 255, 1279, 1, 0, 0, 0, 257, 1281, 1, 0, 0, 0, 259, 1283, 1, 0, 0, 0, 261, 1285, 1, 0, 0, 0, 263, 1287, 1, 0, 0, 0, 265, 1289, 1, 0, 0, 0, 267, 1291, 1, 0, 0, 0, 269, 1293, 1, 0, 0, 0, 271, 1295, 1, 0, 0, 0, 273, 1297, 1, 0, 0, 0, 275, 1299, 1, 0, 0, 0, 277, 1301, 1, 0, 0, 0, 279, 1303, 1, 0, 0, 0, 281, 1306, 1, 0, 0, 0, 283, 1314, 1, 0, 0, 0, 285, 1345, 1, 0, 0, 0, 287, 1352, 1, 0, 0, 0, 289, 1362, 1, 0, 0, 0, 291, 1372, 1, 0, 0, 0, 293, 1374, 1, 0, 0, 0, 295, 1385, 1, 0, 0, 0, 297, 1400, 1, 0, 0, 0, 299, 300, 5, 101, 0, 0, 300, 301, 5, 100, 0, 0, 301, 302, 5, 105, 0, 0, 302, 303, 5, 116, 0, 0, 303, 2, 1, 0, 0, 0, 304, 305, 5, 99, 0, 0, 305, 306, 5, 114, 0, 0, 306, 307, 5, 101, 0, 0, 307, 308, 5, 97, 0, 0, 308, 309, 5, 116, 0, 0, 309, 310, 5, 105, 0, 0, 310, 311, 5, 111, 0, 0, 311, 312, 5, 110, 0, 0, 312, 4, 1, 0, 0, 0, 313, 314, 5, 105, 0, 0, 314, 315, 5, 110, 0, 0, 315, 316, 5, 105, 0, 0, 316, 317, 5, 116, 0, 0, 317, 318, 5, 105, 0, 0, 318, 319, 5, 97, 0, 0, 319, 320, 5, 108, 0, 0, 320, 321, 5, 105, 0, 0, 321, 322, 5, 122, 0, 0, 322, 323, 5, 101, 0, 0, 323, 6, 1, 0, 0, 0, 324, 325, 5, 119, 0, 0, 325, 326, 5, 111, 0, 0, 326, 327, 5, 114, 0, 0, 327, 328, 5, 107, 0, 0, 328, 329, 5, 115, 0, 0, 329, 330, 5, 112, 0, 0, 330, 331, 5, 97, 0, 0, 331, 332, 5, 99, 0, 0, 332, 333, 5, 101, 0, 0, 333, 8, 1, 0, 0, 0, 334, 335, 5, 101, 0, 0, 335, 336, 5, 120, 0, 0, 336, 337, 5, 101, 0, 0, 337, 338, 5, 99, 0, 0, 338, 339, 5, 117, 0, 0, 339, 340, 5, 116, 0, 0, 340, 341, 5, 105, 0, 0, 341, 342, 5, 111, 0, 0, 342, 343, 5, 110, 0, 0, 343, 10, 1, 0, 0, 0, 344, 345, 5, 115, 0, 0, 345, 346, 5, 110, 0, 0, 346, 347, 5, 97, 0, 0, 347, 348, 5, 112, 0, 0, 348, 349, 5, 115, 0, 0, 349, 350, 5, 104, 0, 0, 350, 351, 5, 111, 0, 0, 351, 352, 5, 116, 0, 0, 352, 12, 1, 0, 0, 0, 353, 354, 5, 116, 0, 0, 354, 355, 5, 114, 0, 0, 355, 356, 5, 97, 0, 0, 356, 357, 5, 110, 0, 0, 357, 358, 5, 115, 0, 0, 358, 359, 5, 97, 0, 0, 359, 360, 5, 99, 0, 0, 360, 361, 5, 116, 0, 0, 361, 362, 5, 105, 0, 0, 362, 363, 5, 111, 0, 0, 363, 364, 5, 110, 0, 0, 364, 14, 1, 0, 0, 0, 365, 366, 5, 114, 0, 0, 366, 367, 5, 101, 0, 0, 367, 368, 5, 109, 0, 0, 368, 369, 5, 111, 0, 0, 369, 370, 5, 116, 0, 0, 370, 371, 5, 101, 0, 0, 371, 16, 1, 0, 0, 0, 372, 373, 5, 116, 0, 0, 373, 374, 5, 97, 0, 0, 374, 375, 5, 114, 0, 0, 375, 376, 5, 103, 0, 0, 376, 377, 5, 101, 0, 0, 377, 378, 5, 116, 0, 0, 378, 379, 5, 115, 0, 0, 379, 18, 1, 0, 0, 0, 380, 381, 5, 112, 0, 0, 381, 382, 5, 111, 0, 0, 382, 383, 5, 114, 0, 0, 383, 384, 5, 116, 0, 0, 384, 385, 5, 97, 0, 0, 385, 386, 5, 98, 0, 0, 386, 387, 5, 108, 0, 0, 387, 388, 5, 101, 0, 0, 388, 20, 1, 0, 0, 0, 389, 390, 5, 114, 0, 0, 390, 391, 5, 101, 0, 0, 391, 392, 5, 112, 0, 0, 392, 393, 5, 108, 0, 0, 393, 394, 5, 105, 0, 0, 394, 395, 5, 99, 0, 0, 395, 396, 5, 97, 0, 0, 396, 22, 1, 0, 0, 0, 397, 398, 5, 108, 0, 0, 398, 399, 5, 111, 0, 0, 399, 400, 5, 99, 0, 0, 400, 401, 5, 97, 0, 0, 401, 402, 5, 108, 0, 0, 402, 24, 1, 0, 0, 0, 403, 404, 5, 102, 0, 0, 404, 405, 5, 114, 0, 0, 405, 406, 5, 111, 0, 0, 406, 407, 5, 109, 0, 0, 407, 26, 1, 0, 0, 0, 408, 409, 5, 114, 0, 0, 409, 410, 5, 101, 0, 0, 410, 411, 5, 115, 0, 0, 411, 412, 5, 117, 0, 0, 412, 413, 5, 108, 0, 0, 413, 414, 5, 116, 0, 0, 414, 415, 5, 45, 0, 0, 415, 416, 5, 98, 0, 0, 416, 417, 5, 121, 0, 0, 417, 418, 5, 116, 0, 0, 418, 419, 5, 101, 0, 0, 419, 420, 5, 115, 0, 0, 420, 28, 1, 0, 0, 0, 421, 422, 5, 114, 0, 0, 422, 423, 5, 112, 0, 0, 423, 424, 5, 99, 0, 0, 424, 425, 5, 45, 0, 0, 425, 426, 5, 99, 0, 0, 426, 427, 5, 97, 0, 0, 427, 428, 5, 108, 0, 0, 428, 429, 5, 108, 0, 0, 429, 430, 5, 115, 0, 0, 430, 30, 1, 0, 0, 0, 431, 432, 5, 100, 0, 0, 432, 433, 5, 101, 0, 0, 433, 434, 5, 97, 0, 0, 434, 435, 5, 100, 0, 0, 435, 436, 5, 108, 0, 0, 436, 437, 5, 105, 0, 0, 437, 438, 5, 110, 0, 0, 438, 439, 5, 101, 0, 0, 439, 440, 5, 45, 0, 0, 440, 441, 5, 109, 0, 0, 441, 442, 5, 115, 0, 0, 442, 32, 1, 0, 0, 0, 443, 444, 5, 113, 0, 0, 444, 445, 5, 117, 0, 0, 445, 446, 5, 101, 0, 0, 446, 447, 5, 114, 0, 0, 447, 448, 5, 121, 0, 0, 448, 34, 1, 0, 0, 0, 449, 450, 5, 114, 0, 0, 450, 451, 5, 101, 0, 0, 451, 452, 5, 102, 0, 0, 452, 453, 5, 108, 0, 0, 453, 454, 5, 101, 0, 0, 454, 455, 5, 99, 0, 0, 455, 456, 5, 116, 0, 0, 456, 457, 5, 105, 0, 0, 457, 458, 5, 111, 0, 0, 458, 459, 5, 110, 0, 0, 459, 36, 1, 0, 0, 0, 460, 461, 5, 115, 0, 0, 461, 462, 5, 112, 0, 0, 462, 463, 5, 101, 0, 0, 463, 464, 5, 99, 0, 0, 464, 465, 5, 105, 0, 0, 465, 466, 5, 97, 0, 0, 466, 467, 5, 108, 0, 0, 467, 468, 5, 105, 0, 0, 468, 469, 5, 122, 0, 0, 469, 470, 5, 101, 0, 0, 470, 38, 1, 0, 0, 0, 471, 472, 5, 114, 0, 0, 472, 473, 5, 111, 0, 0, 473, 474, 5, 111, 0, 0, 474, 475, 5, 116, 0, 0, 475, 40, 1, 0, 0, 0, 476, 477, 5, 100, 0, 0, 477, 478, 5, 111, 0, 0, 478, 479, 5, 99, 0, 0, 479, 480, 5, 117, 0, 0, 480, 481, 5, 109, 0, 0, 481, 482, 5, 101, 0, 0, 482, 483, 5, 110, 0, 0, 483, 484, 5, 116, 0, 0, 484, 42, 1, 0, 0, 0, 485, 486, 5, 102, 0, 0, 486, 487, 5, 114, 0, 0, 487, 488, 5, 97, 0, 0, 488, 489, 5, 103, 0, 0, 489, 490, 5, 109, 0, 0, 490, 491, 5, 101, 0, 0, 491, 492, 5, 110, 0, 0, 492, 493, 5, 116, 0, 0, 493, 494, 5, 115, 0, 0, 494, 44, 1, 0, 0, 0, 495, 496, 5, 118, 0, 0, 496, 497, 5, 105, 0, 0, 497, 498, 5, 101, 0, 0, 498, 499, 5, 119, 0, 0, 499, 46, 1, 0, 0, 0, 500, 501, 5, 109, 0, 0, 501, 502, 5, 97, 0, 0, 502, 503, 5, 120, 0, 0, 503, 48, 1, 0, 0, 0, 504, 505, 5, 97, 0, 0, 505, 506, 5, 108, 0, 0, 506, 507, 5, 108, 0, 0, 507, 508, 5, 111, 0, 0, 508, 509, 5, 119, 0, 0, 509, 50, 1, 0, 0, 0, 510, 511, 5, 112, 0, 0, 511, 512, 5, 111, 0, 0, 512, 513, 5, 108, 0, 0, 513, 514, 5, 108, 0, 0, 514, 52, 1, 0, 0, 0, 515, 516, 5, 113, 0, 0, 516, 517, 5, 117, 0, 0, 517, 518, 5, 101, 0, 0, 518, 519, 5, 114, 0, 0, 519, 520, 5, 121, 0, 0, 520, 521, 5, 97, 0, 0, 521, 522, 5, 98, 0, 0, 522, 523, 5, 108, 0, 0, 523, 524, 5, 101, 0, 0, 524, 54, 1, 0, 0, 0, 525, 526, 5, 114, 0, 0, 526, 527, 5, 112, 0, 0, 527, 528, 5, 99, 0, 0, 528, 56, 1, 0, 0, 0, 529, 530, 5, 113, 0, 0, 530, 531, 5, 117, 0, 0, 531, 532, 5, 101, 0, 0, 532, 533, 5, 114, 0, 0, 533, 534, 5, 121, 0, 0, 534, 535, 5, 45, 0, 0, 535, 536, 5, 114, 0, 0, 536, 537, 5, 101, 0, 0, 537, 538, 5, 97, 0, 0, 538, 539, 5, 115, 0, 0, 539, 540, 5, 111, 0, 0, 540, 541, 5, 110, 0, 0, 541, 58, 1, 0, 0, 0, 542, 543, 5, 116, 0, 0, 543, 544, 5, 121, 0, 0, 544, 545, 5, 112, 0, 0, 545, 546, 5, 101, 0, 0, 546, 60, 1, 0, 0, 0, 547, 548, 5, 111, 0, 0, 548, 549, 5, 98, 0, 0, 549, 550, 5, 106, 0, 0, 550, 551, 5, 101, 0, 0, 551, 552, 5, 99, 0, 0, 552, 553, 5, 116, 0, 0, 553, 62, 1, 0, 0, 0, 554, 555, 5, 115, 0, 0, 555, 556, 5, 116, 0, 0, 556, 557, 5, 111, 0, 0, 557, 558, 5, 114, 0, 0, 558, 559, 5, 97, 0, 0, 559, 560, 5, 98, 0, 0, 560, 561, 5, 108, 0, 0, 561, 562, 5, 101, 0, 0, 562, 64, 1, 0, 0, 0, 563, 564, 5, 105, 0, 0, 564, 565, 5, 109, 0, 0, 565, 566, 5, 112, 0, 0, 566, 567, 5, 108, 0, 0, 567, 568, 5, 101, 0, 0, 568, 569, 5, 109, 0, 0, 569, 570, 5, 101, 0, 0, 570, 571, 5, 110, 0, 0, 571, 572, 5, 116, 0, 0, 572, 573, 5, 115, 0, 0, 573, 66, 1, 0, 0, 0, 574, 575, 5, 114, 0, 0, 575, 576, 5, 101, 0, 0, 576, 577, 5, 102, 0, 0, 577, 68, 1, 0, 0, 0, 578, 579, 5, 102, 0, 0, 579, 580, 5, 114, 0, 0, 580, 581, 5, 97, 0, 0, 581, 582, 5, 103, 0, 0, 582, 583, 5, 109, 0, 0, 583, 584, 5, 101, 0, 0, 584, 585, 5, 110, 0, 0, 585, 586, 5, 116, 0, 0, 586, 70, 1, 0, 0, 0, 587, 588, 5, 105, 0, 0, 588, 589, 5, 109, 0, 0, 589, 590, 5, 112, 0, 0, 590, 591, 5, 111, 0, 0, 591, 592, 5, 114, 0, 0, 592, 593, 5, 116, 0, 0, 593, 72, 1, 0, 0, 0, 594, 595, 5, 101, 0, 0, 595, 596, 5, 120, 0, 0, 596, 597, 5, 116, 0, 0, 597, 598, 5, 101, 0, 0, 598, 599, 5, 114, 0, 0, 599, 600, 5, 110, 0, 0, 600, 601, 5, 97, 0, 0, 601, 602, 5, 108, 0, 0, 602, 74, 1, 0, 0, 0, 603, 604, 5, 97, 0, 0, 604, 605, 5, 116, 0, 0, 605, 606, 5, 111, 0, 0, 606, 607, 5, 109, 0, 0, 607, 76, 1, 0, 0, 0, 608, 609, 5, 105, 0, 0, 609, 610, 5, 110, 0, 0, 610, 611, 5, 116, 0, 0, 611, 612, 5, 101, 0, 0, 612, 613, 5, 114, 0, 0, 613, 614, 5, 102, 0, 0, 614, 615, 5, 97, 0, 0, 615, 616, 5, 99, 0, 0, 616, 617, 5, 101, 0, 0, 617, 78, 1, 0, 0, 0, 618, 619, 5, 105, 0, 0, 619, 620, 5, 110, 0, 0, 620, 621, 5, 116, 0, 0, 621, 622, 5, 101, 0, 0, 622, 623, 5, 114, 0, 0, 623, 624, 5, 102, 0, 0, 624, 625, 5, 97, 0, 0, 625, 626, 5, 99, 0, 0, 626, 627, 5, 101, 0, 0, 627, 628, 5, 115, 0, 0, 628, 80, 1, 0, 0, 0, 629, 630, 5, 112, 0, 0, 630, 631, 5, 97, 0, 0, 631, 632, 5, 99, 0, 0, 632, 633, 5, 107, 0, 0, 633, 634, 5, 97, 0, 0, 634, 635, 5, 103, 0, 0, 635, 636, 5, 101, 0, 0, 636, 82, 1, 0, 0, 0, 637, 638, 5, 118, 0, 0, 638, 639, 5, 97, 0, 0, 639, 640, 5, 108, 0, 0, 640, 641, 5, 117, 0, 0, 641, 642, 5, 101, 0, 0, 642, 84, 1, 0, 0, 0, 643, 644, 5, 114, 0, 0, 644, 645, 5, 101, 0, 0, 645, 646, 5, 108, 0, 0, 646, 647, 5, 97, 0, 0, 647, 648, 5, 116, 0, 0, 648, 649, 5, 105, 0, 0, 649, 650, 5, 111, 0, 0, 650, 651, 5, 110, 0, 0, 651, 86, 1, 0, 0, 0, 652, 653, 5, 111, 0, 0, 653, 654, 5, 112, 0, 0, 654, 655, 5, 101, 0, 0, 655, 656, 5, 114, 0, 0, 656, 657, 5, 97, 0, 0, 657, 658, 5, 116, 0, 0, 658, 659, 5, 105, 0, 0, 659, 660, 5, 111, 0, 0, 660, 661, 5, 110, 0, 0, 661, 88, 1, 0, 0, 0, 662, 663, 5, 102, 0, 0, 663, 664, 5, 117, 0, 0, 664, 665, 5, 110, 0, 0, 665, 666, 5, 99, 0, 0, 666, 667, 5, 116, 0, 0, 667, 668, 5, 105, 0, 0, 668, 669, 5, 111, 0, 0, 669, 670, 5, 110, 0, 0, 670, 90, 1, 0, 0, 0, 671, 672, 5, 99, 0, 0, 672, 673, 5, 111, 0, 0, 673, 674, 5, 110, 0, 0, 674, 675, 5, 115, 0, 0, 675, 676, 5, 116, 0, 0, 676, 677, 5, 114, 0, 0, 677, 678, 5, 117, 0, 0, 678, 679, 5, 99, 0, 0, 679, 680, 5, 116, 0, 0, 680, 681, 5, 111, 0, 0, 681, 682, 5, 114, 0, 0, 682, 92, 1, 0, 0, 0, 683, 684, 5, 99, 0, 0, 684, 685, 5, 111, 0, 0, 685, 686, 5, 110, 0, 0, 686, 687, 5, 115, 0, 0, 687, 688, 5, 116, 0, 0, 688, 689, 5, 114, 0, 0, 689, 690, 5, 117, 0, 0, 690, 691, 5, 99, 0, 0, 691, 692, 5, 116, 0, 0, 692, 693, 5, 115, 0, 0, 693, 94, 1, 0, 0, 0, 694, 695, 5, 105, 0, 0, 695, 696, 5, 110, 0, 0, 696, 697, 5, 112, 0, 0, 697, 698, 5, 117, 0, 0, 698, 699, 5, 116, 0, 0, 699, 96, 1, 0, 0, 0, 700, 701, 5, 99, 0, 0, 701, 702, 5, 111, 0, 0, 702, 703, 5, 110, 0, 0, 703, 704, 5, 102, 0, 0, 704, 705, 5, 111, 0, 0, 705, 706, 5, 114, 0, 0, 706, 707, 5, 109, 0, 0, 707, 98, 1, 0, 0, 0, 708, 709, 5, 97, 0, 0, 709, 710, 5, 115, 0, 0, 710, 100, 1, 0, 0, 0, 711, 712, 5, 98, 0, 0, 712, 713, 5, 105, 0, 0, 713, 714, 5, 110, 0, 0, 714, 715, 5, 100, 0, 0, 715, 102, 1, 0, 0, 0, 716, 717, 5, 115, 0, 0, 717, 718, 5, 116, 0, 0, 718, 719, 5, 97, 0, 0, 719, 720, 5, 116, 0, 0, 720, 721, 5, 105, 0, 0, 721, 722, 5, 99, 0, 0, 722, 104, 1, 0, 0, 0, 723, 724, 5, 116, 0, 0, 724, 725, 5, 111, 0, 0, 725, 106, 1, 0, 0, 0, 726, 727, 5, 112, 0, 0, 727, 728, 5, 114, 0, 0, 728, 729, 5, 105, 0, 0, 729, 730, 5, 118, 0, 0, 730, 731, 5, 97, 0, 0, 731, 732, 5, 116, 0, 0, 732, 733, 5, 101, 0, 0, 733, 108, 1, 0, 0, 0, 734, 735, 5, 115, 0, 0, 735, 736, 5, 104, 0, 0, 736, 737, 5, 97, 0, 0, 737, 738, 5, 114, 0, 0, 738, 739, 5, 101, 0, 0, 739, 740, 5, 100, 0, 0, 740, 110, 1, 0, 0, 0, 741, 742, 5, 115, 0, 0, 742, 743, 5, 116, 0, 0, 743, 744, 5, 97, 0, 0, 744, 745, 5, 116, 0, 0, 745, 746, 5, 101, 0, 0, 746, 112, 1, 0, 0, 0, 747, 748, 5, 101, 0, 0, 748, 749, 5, 100, 0, 0, 749, 750, 5, 103, 0, 0, 750, 751, 5, 101, 0, 0, 751, 114, 1, 0, 0, 0, 752, 753, 5, 112, 0, 0, 753, 754, 5, 114, 0, 0, 754, 755, 5, 111, 0, 0, 755, 756, 5, 106, 0, 0, 756, 757, 5, 101, 0, 0, 757, 758, 5, 99, 0, 0, 758, 759, 5, 116, 0, 0, 759, 760, 5, 105, 0, 0, 760, 761, 5, 111, 0, 0, 761, 762, 5, 110, 0, 0, 762, 116, 1, 0, 0, 0, 763, 764, 5, 119, 0, 0, 764, 765, 5, 105, 0, 0, 765, 766, 5, 116, 0, 0, 766, 767, 5, 104, 0, 0, 767, 118, 1, 0, 0, 0, 768, 769, 5, 117, 0, 0, 769, 770, 5, 115, 0, 0, 770, 771, 5, 105, 0, 0, 771, 772, 5, 110, 0, 0, 772, 773, 5, 103, 0, 0, 773, 120, 1, 0, 0, 0, 774, 775, 5, 97, 0, 0, 775, 776, 5, 99, 0, 0, 776, 777, 5, 99, 0, 0, 777, 778, 5, 101, 0, 0, 778, 779, 5, 112, 0, 0, 779, 780, 5, 116, 0, 0, 780, 122, 1, 0, 0, 0, 781, 782, 5, 118, 0, 0, 782, 783, 5, 105, 0, 0, 783, 784, 5, 97, 0, 0, 784, 124, 1, 0, 0, 0, 785, 786, 5, 109, 0, 0, 786, 787, 5, 97, 0, 0, 787, 788, 5, 116, 0, 0, 788, 789, 5, 101, 0, 0, 789, 790, 5, 114, 0, 0, 790, 791, 5, 105, 0, 0, 791, 792, 5, 97, 0, 0, 792, 793, 5, 108, 0, 0, 793, 794, 5, 105, 0, 0, 794, 795, 5, 122, 0, 0, 795, 796, 5, 101, 0, 0, 796, 126, 1, 0, 0, 0, 797, 798, 5, 105, 0, 0, 798, 799, 5, 102, 0, 0, 799, 128, 1, 0, 0, 0, 800, 801, 5, 97, 0, 0, 801, 802, 5, 98, 0, 0, 802, 803, 5, 115, 0, 0, 803, 804, 5, 101, 0, 0, 804, 805, 5, 110, 0, 0, 805, 806, 5, 116, 0, 0, 806, 130, 1, 0, 0, 0, 807, 808, 5, 111, 0, 0, 808, 809, 5, 110, 0, 0, 809, 132, 1, 0, 0, 0, 810, 811, 5, 112, 0, 0, 811, 812, 5, 111, 0, 0, 812, 813, 5, 108, 0, 0, 813, 814, 5, 105, 0, 0, 814, 815, 5, 99, 0, 0, 815, 816, 5, 121, 0, 0, 816, 134, 1, 0, 0, 0, 817, 818, 5, 100, 0, 0, 818, 819, 5, 101, 0, 0, 819, 820, 5, 102, 0, 0, 820, 821, 5, 97, 0, 0, 821, 822, 5, 117, 0, 0, 822, 823, 5, 108, 0, 0, 823, 824, 5, 116, 0, 0, 824, 136, 1, 0, 0, 0, 825, 826, 5, 115, 0, 0, 826, 827, 5, 111, 0, 0, 827, 828, 5, 117, 0, 0, 828, 829, 5, 114, 0, 0, 829, 830, 5, 99, 0, 0, 830, 831, 5, 101, 0, 0, 831, 138, 1, 0, 0, 0, 832, 833, 5, 114, 0, 0, 833, 834, 5, 101, 0, 0, 834, 835, 5, 112, 0, 0, 835, 836, 5, 111, 0, 0, 836, 837, 5, 115, 0, 0, 837, 838, 5, 105, 0, 0, 838, 839, 5, 116, 0, 0, 839, 840, 5, 111, 0, 0, 840, 841, 5, 114, 0, 0, 841, 842, 5, 121, 0, 0, 842, 140, 1, 0, 0, 0, 843, 844, 5, 99, 0, 0, 844, 845, 5, 111, 0, 0, 845, 846, 5, 109, 0, 0, 846, 847, 5, 109, 0, 0, 847, 848, 5, 105, 0, 0, 848, 849, 5, 116, 0, 0, 849, 142, 1, 0, 0, 0, 850, 851, 5, 114, 0, 0, 851, 852, 5, 101, 0, 0, 852, 853, 5, 118, 0, 0, 853, 854, 5, 105, 0, 0, 854, 855, 5, 115, 0, 0, 855, 856, 5, 105, 0, 0, 856, 857, 5, 111, 0, 0, 857, 858, 5, 110, 0, 0, 858, 144, 1, 0, 0, 0, 859, 860, 5, 115, 0, 0, 860, 861, 5, 101, 0, 0, 861, 862, 5, 109, 0, 0, 862, 863, 5, 97, 0, 0, 863, 864, 5, 110, 0, 0, 864, 865, 5, 116, 0, 0, 865, 866, 5, 105, 0, 0, 866, 867, 5, 99, 0, 0, 867, 868, 5, 45, 0, 0, 868, 869, 5, 109, 0, 0, 869, 870, 5, 97, 0, 0, 870, 871, 5, 106, 0, 0, 871, 872, 5, 111, 0, 0, 872, 873, 5, 114, 0, 0, 873, 146, 1, 0, 0, 0, 874, 875, 5, 111, 0, 0, 875, 876, 5, 110, 0, 0, 876, 877, 5, 45, 0, 0, 877, 878, 5, 100, 0, 0, 878, 879, 5, 101, 0, 0, 879, 880, 5, 108, 0, 0, 880, 881, 5, 101, 0, 0, 881, 882, 5, 116, 0, 0, 882, 883, 5, 101, 0, 0, 883, 148, 1, 0, 0, 0, 884, 885, 5, 114, 0, 0, 885, 886, 5, 101, 0, 0, 886, 887, 5, 116, 0, 0, 887, 888, 5, 97, 0, 0, 888, 889, 5, 105, 0, 0, 889, 890, 5, 110, 0, 0, 890, 891, 5, 45, 0, 0, 891, 892, 5, 111, 0, 0, 892, 893, 5, 116, 0, 0, 893, 894, 5, 104, 0, 0, 894, 895, 5, 101, 0, 0, 895, 896, 5, 114, 0, 0, 896, 150, 1, 0, 0, 0, 897, 898, 5, 107, 0, 0, 898, 899, 5, 101, 0, 0, 899, 900, 5, 121, 0, 0, 900, 901, 5, 101, 0, 0, 901, 902, 5, 100, 0, 0, 902, 152, 1, 0, 0, 0, 903, 904, 5, 112, 0, 0, 904, 905, 5, 117, 0, 0, 905, 906, 5, 98, 0, 0, 906, 907, 5, 108, 0, 0, 907, 908, 5, 105, 0, 0, 908, 909, 5, 99, 0, 0, 909, 910, 5, 45, 0, 0, 910, 911, 5, 116, 0, 0, 911, 912, 5, 114, 0, 0, 912, 913, 5, 97, 0, 0, 913, 914, 5, 118, 0, 0, 914, 915, 5, 101, 0, 0, 915, 916, 5, 114, 0, 0, 916, 917, 5, 115, 0, 0, 917, 918, 5, 97, 0, 0, 918, 919, 5, 108, 0, 0, 919, 154, 1, 0, 0, 0, 920, 921, 5, 105, 0, 0, 921, 922, 5, 100, 0, 0, 922, 156, 1, 0, 0, 0, 923, 924, 5, 100, 0, 0, 924, 925, 5, 111, 0, 0, 925, 926, 5, 99, 0, 0, 926, 158, 1, 0, 0, 0, 927, 928, 5, 109, 0, 0, 928, 929, 5, 111, 0, 0, 929, 930, 5, 100, 0, 0, 930, 931, 5, 101, 0, 0, 931, 160, 1, 0, 0, 0, 932, 933, 5, 101, 0, 0, 933, 934, 5, 109, 0, 0, 934, 935, 5, 105, 0, 0, 935, 936, 5, 116, 0, 0, 936, 937, 5, 115, 0, 0, 937, 162, 1, 0, 0, 0, 938, 939, 5, 114, 0, 0, 939, 940, 5, 101, 0, 0, 940, 941, 5, 99, 0, 0, 941, 942, 5, 101, 0, 0, 942, 943, 5, 105, 0, 0, 943, 944, 5, 118, 0, 0, 944, 945, 5, 101, 0, 0, 945, 946, 5, 114, 0, 0, 946, 164, 1, 0, 0, 0, 947, 948, 5, 114, 0, 0, 948, 949, 5, 101, 0, 0, 949, 950, 5, 113, 0, 0, 950, 951, 5, 117, 0, 0, 951, 952, 5, 105, 0, 0, 952, 953, 5, 114, 0, 0, 953, 954, 5, 101, 0, 0, 954, 955, 5, 115, 0, 0, 955, 166, 1, 0, 0, 0, 956, 957, 5, 97, 0, 0, 957, 958, 5, 110, 0, 0, 958, 959, 5, 121, 0, 0, 959, 168, 1, 0, 0, 0, 960, 961, 5, 103, 0, 0, 961, 962, 5, 101, 0, 0, 962, 963, 5, 116, 0, 0, 963, 170, 1, 0, 0, 0, 964, 965, 5, 115, 0, 0, 965, 966, 5, 101, 0, 0, 966, 967, 5, 116, 0, 0, 967, 172, 1, 0, 0, 0, 968, 969, 5, 119, 0, 0, 969, 970, 5, 97, 0, 0, 970, 971, 5, 116, 0, 0, 971, 972, 5, 99, 0, 0, 972, 973, 5, 104, 0, 0, 973, 174, 1, 0, 0, 0, 974, 975, 5, 115, 0, 0, 975, 976, 5, 116, 0, 0, 976, 977, 5, 97, 0, 0, 977, 978, 5, 114, 0, 0, 978, 979, 5, 116, 0, 0, 979, 176, 1, 0, 0, 0, 980, 981, 5, 115, 0, 0, 981, 982, 5, 116, 0, 0, 982, 983, 5, 111, 0, 0, 983, 984, 5, 112, 0, 0, 984, 178, 1, 0, 0, 0, 985, 986, 5, 114, 0, 0, 986, 987, 5, 101, 0, 0, 987, 988, 5, 97, 0, 0, 988, 989, 5, 100, 0, 0, 989, 180, 1, 0, 0, 0, 990, 991, 5, 119, 0, 0, 991, 992, 5, 114, 0, 0, 992, 993, 5, 105, 0, 0, 993, 994, 5, 116, 0, 0, 994, 995, 5, 101, 0, 0, 995, 182, 1, 0, 0, 0, 996, 997, 5, 114, 0, 0, 997, 998, 5, 101, 0, 0, 998, 999, 5, 115, 0, 0, 999, 1000, 5, 111, 0, 0, 1000, 1001, 5, 108, 0, 0, 1001, 1002, 5, 118, 0, 0, 1002, 1003, 5, 101, 0, 0, 1003, 184, 1, 0, 0, 0, 1004, 1005, 5, 99, 0, 0, 1005, 1006, 5, 111, 0, 0, 1006, 1007, 5, 110, 0, 0, 1007, 1008, 5, 110, 0, 0, 1008, 1009, 5, 101, 0, 0, 1009, 1010, 5, 99, 0, 0, 1010, 1011, 5, 116, 0, 0, 1011, 186, 1, 0, 0, 0, 1012, 1013, 5, 100, 0, 0, 1013, 1014, 5, 105, 0, 0, 1014, 1015, 5, 115, 0, 0, 1015, 1016, 5, 99, 0, 0, 1016, 1017, 5, 111, 0, 0, 1017, 1018, 5, 110, 0, 0, 1018, 1019, 5, 110, 0, 0, 1019, 1020, 5, 101, 0, 0, 1020, 1021, 5, 99, 0, 0, 1021, 1022, 5, 116, 0, 0, 1022, 188, 1, 0, 0, 0, 1023, 1024, 5, 99, 0, 0, 1024, 1025, 5, 97, 0, 0, 1025, 1026, 5, 108, 0, 0, 1026, 1027, 5, 108, 0, 0, 1027, 190, 1, 0, 0, 0, 1028, 1029, 5, 119, 0, 0, 1029, 1030, 5, 97, 0, 0, 1030, 1031, 5, 116, 0, 0, 1031, 1032, 5, 99, 0, 0, 1032, 1033, 5, 104, 0, 0, 1033, 1034, 5, 45, 0, 0, 1034, 1035, 5, 115, 0, 0, 1035, 1036, 5, 116, 0, 0, 1036, 1037, 5, 97, 0, 0, 1037, 1038, 5, 114, 0, 0, 1038, 1039, 5, 116, 0, 0, 1039, 192, 1, 0, 0, 0, 1040, 1041, 5, 119, 0, 0, 1041, 1042, 5, 97, 0, 0, 1042, 1043, 5, 116, 0, 0, 1043, 1044, 5, 99, 0, 0, 1044, 1045, 5, 104, 0, 0, 1045, 1046, 5, 45, 0, 0, 1046, 1047, 5, 115, 0, 0, 1047, 1048, 5, 116, 0, 0, 1048, 1049, 5, 111, 0, 0, 1049, 1050, 5, 112, 0, 0, 1050, 194, 1, 0, 0, 0, 1051, 1052, 5, 115, 0, 0, 1052, 1053, 5, 117, 0, 0, 1053, 1054, 5, 98, 0, 0, 1054, 1055, 5, 115, 0, 0, 1055, 1056, 5, 99, 0, 0, 1056, 1057, 5, 114, 0, 0, 1057, 1058, 5, 105, 0, 0, 1058, 1059, 5, 98, 0, 0, 1059, 1060, 5, 101, 0, 0, 1060, 196, 1, 0, 0, 0, 1061, 1062, 5, 117, 0, 0, 1062, 1063, 5, 110, 0, 0, 1063, 1064, 5, 115, 0, 0, 1064, 1065, 5, 117, 0, 0, 1065, 1066, 5, 98, 0, 0, 1066, 1067, 5, 115, 0, 0, 1067, 1068, 5, 99, 0, 0, 1068, 1069, 5, 114, 0, 0, 1069, 1070, 5, 105, 0, 0, 1070, 1071, 5, 98, 0, 0, 1071, 1072, 5, 101, 0, 0, 1072, 198, 1, 0, 0, 0, 1073, 1074, 5, 114, 0, 0, 1074, 1075, 5, 101, 0, 0, 1075, 1076, 5, 103, 0, 0, 1076, 1077, 5, 105, 0, 0, 1077, 1078, 5, 115, 0, 0, 1078, 1079, 5, 116, 0, 0, 1079, 1080, 5, 101, 0, 0, 1080, 1081, 5, 114, 0, 0, 1081, 200, 1, 0, 0, 0, 1082, 1083, 5, 99, 0, 0, 1083, 1084, 5, 114, 0, 0, 1084, 1085, 5, 100, 0, 0, 1085, 1086, 5, 116, 0, 0, 1086, 202, 1, 0, 0, 0, 1087, 1088, 5, 111, 0, 0, 1088, 1089, 5, 112, 0, 0, 1089, 1090, 5, 116, 0, 0, 1090, 1091, 5, 105, 0, 0, 1091, 1092, 5, 111, 0, 0, 1092, 1093, 5, 110, 0, 0, 1093, 1094, 5, 97, 0, 0, 1094, 1095, 5, 108, 0, 0, 1095, 1096, 5, 45, 0, 0, 1096, 1097, 5, 111, 0, 0, 1097, 1098, 5, 110, 0, 0, 1098, 1099, 5, 101, 0, 0, 1099, 204, 1, 0, 0, 0, 1100, 1101, 5, 101, 0, 0, 1101, 1102, 5, 120, 0, 0, 1102, 1103, 5, 97, 0, 0, 1103, 1104, 5, 99, 0, 0, 1104, 1105, 5, 116, 0, 0, 1105, 1106, 5, 108, 0, 0, 1106, 1107, 5, 121, 0, 0, 1107, 1108, 5, 45, 0, 0, 1108, 1109, 5, 111, 0, 0, 1109, 1110, 5, 110, 0, 0, 1110, 1111, 5, 101, 0, 0, 1111, 206, 1, 0, 0, 0, 1112, 1113, 5, 109, 0, 0, 1113, 1114, 5, 97, 0, 0, 1114, 1115, 5, 110, 0, 0, 1115, 1116, 5, 121, 0, 0, 1116, 1117, 5, 45, 0, 0, 1117, 1118, 5, 117, 0, 0, 1118, 1119, 5, 110, 0, 0, 1119, 1120, 5, 105, 0, 0, 1120, 1121, 5, 113, 0, 0, 1121, 1122, 5, 117, 0, 0, 1122, 1123, 5, 101, 0, 0, 1123, 208, 1, 0, 0, 0, 1124, 1125, 5, 109, 0, 0, 1125, 1126, 5, 97, 0, 0, 1126, 1127, 5, 110, 0, 0, 1127, 1128, 5, 121, 0, 0, 1128, 210, 1, 0, 0, 0, 1129, 1130, 5, 111, 0, 0, 1130, 1131, 5, 114, 0, 0, 1131, 1132, 5, 100, 0, 0, 1132, 1133, 5, 101, 0, 0, 1133, 1134, 5, 114, 0, 0, 1134, 1135, 5, 101, 0, 0, 1135, 1136, 5, 100, 0, 0, 1136, 212, 1, 0, 0, 0, 1137, 1138, 5, 117, 0, 0, 1138, 1139, 5, 110, 0, 0, 1139, 1140, 5, 105, 0, 0, 1140, 1141, 5, 116, 0, 0, 1141, 214, 1, 0, 0, 0, 1142, 1143, 5, 119, 0, 0, 1143, 1144, 5, 97, 0, 0, 1144, 1145, 5, 116, 0, 0, 1145, 1146, 5, 99, 0, 0, 1146, 1147, 5, 104, 0, 0, 1147, 1148, 5, 45, 0, 0, 1148, 1149, 5, 104, 0, 0, 1149, 1150, 5, 97, 0, 0, 1150, 1151, 5, 110, 0, 0, 1151, 1152, 5, 100, 0, 0, 1152, 1153, 5, 108, 0, 0, 1153, 1154, 5, 101, 0, 0, 1154, 216, 1, 0, 0, 0, 1155, 1156, 5, 109, 0, 0, 1156, 1157, 5, 101, 0, 0, 1157, 1158, 5, 115, 0, 0, 1158, 1159, 5, 115, 0, 0, 1159, 1160, 5, 97, 0, 0, 1160, 1161, 5, 103, 0, 0, 1161, 1162, 5, 101, 0, 0, 1162, 218, 1, 0, 0, 0, 1163, 1164, 5, 97, 0, 0, 1164, 1165, 5, 116, 0, 0, 1165, 1166, 5, 111, 0, 0, 1166, 1167, 5, 109, 0, 0, 1167, 1168, 5, 45, 0, 0, 1168, 1169, 5, 114, 0, 0, 1169, 1170, 5, 101, 0, 0, 1170, 1171, 5, 102, 0, 0, 1171, 220, 1, 0, 0, 0, 1172, 1173, 5, 105, 0, 0, 1173, 1174, 5, 110, 0, 0, 1174, 1175, 5, 116, 0, 0, 1175, 1176, 5, 101, 0, 0, 1176, 1177, 5, 114, 0, 0, 1177, 1178, 5, 102, 0, 0, 1178, 1179, 5, 97, 0, 0, 1179, 1180, 5, 99, 0, 0, 1180, 1181, 5, 101, 0, 0, 1181, 1182, 5, 45, 0, 0, 1182, 1183, 5, 114, 0, 0, 1183, 1184, 5, 101, 0, 0, 1184, 1185, 5, 102, 0, 0, 1185, 222, 1, 0, 0, 0, 1186, 1187, 5, 111, 0, 0, 1187, 1188, 5, 112, 0, 0, 1188, 1189, 5, 116, 0, 0, 1189, 1190, 5, 105, 0, 0, 1190, 1191, 5, 111, 0, 0, 1191, 1192, 5, 110, 0, 0, 1192, 1193, 5, 97, 0, 0, 1193, 1194, 5, 108, 0, 0, 1194, 224, 1, 0, 0, 0, 1195, 1196, 5, 108, 0, 0, 1196, 1197, 5, 105, 0, 0, 1197, 1198, 5, 115, 0, 0, 1198, 1199, 5, 116, 0, 0, 1199, 226, 1, 0, 0, 0, 1200, 1201, 5, 114, 0, 0, 1201, 1202, 5, 101, 0, 0, 1202, 1203, 5, 99, 0, 0, 1203, 1204, 5, 111, 0, 0, 1204, 1205, 5, 114, 0, 0, 1205, 1206, 5, 100, 0, 0, 1206, 228, 1, 0, 0, 0, 1207, 1208, 5, 98, 0, 0, 1208, 1209, 5, 111, 0, 0, 1209, 1210, 5, 111, 0, 0, 1210, 1211, 5, 108, 0, 0, 1211, 230, 1, 0, 0, 0, 1212, 1213, 5, 98, 0, 0, 1213, 1214, 5, 121, 0, 0, 1214, 1215, 5, 116, 0, 0, 1215, 1216, 5, 101, 0, 0, 1216, 1217, 5, 115, 0, 0, 1217, 232, 1, 0, 0, 0, 1218, 1219, 5, 100, 0, 0, 1219, 1220, 5, 111, 0, 0, 1220, 1221, 5, 117, 0, 0, 1221, 1222, 5, 98, 0, 0, 1222, 1223, 5, 108, 0, 0, 1223, 1224, 5, 101, 0, 0, 1224, 234, 1, 0, 0, 0, 1225, 1226, 5, 105, 0, 0, 1226, 1227, 5, 110, 0, 0, 1227, 1228, 5, 116, 0, 0, 1228, 1229, 5, 51, 0, 0, 1229, 1230, 5, 50, 0, 0, 1230, 236, 1, 0, 0, 0, 1231, 1232, 5, 105, 0, 0, 1232, 1233, 5, 110, 0, 0, 1233, 1234, 5, 116, 0, 0, 1234, 1235, 5, 54, 0, 0, 1235, 1236, 5, 52, 0, 0, 1236, 238, 1, 0, 0, 0, 1237, 1238, 5, 115, 0, 0, 1238, 1239, 5, 116, 0, 0, 1239, 1240, 5, 114, 0, 0, 1240, 1241, 5, 105, 0, 0, 1241, 1242, 5, 110, 0, 0, 1242, 1243, 5, 103, 0, 0, 1243, 240, 1, 0, 0, 0, 1244, 1245, 5, 117, 0, 0, 1245, 1246, 5, 105, 0, 0, 1246, 1247, 5, 110, 0, 0, 1247, 1248, 5, 116, 0, 0, 1248, 1249, 5, 51, 0, 0, 1249, 1250, 5, 50, 0, 0, 1250, 242, 1, 0, 0, 0, 1251, 1252, 5, 117, 0, 0, 1252, 1253, 5, 105, 0, 0, 1253, 1254, 5, 110, 0, 0, 1254, 1255, 5, 116, 0, 0, 1255, 1256, 5, 54, 0, 0, 1256, 1257, 5, 52, 0, 0, 1257, 244, 1, 0, 0, 0, 1258, 1259, 5, 116, 0, 0, 1259, 1260, 5, 114, 0, 0, 1260, 1261, 5, 117, 0, 0, 1261, 1262, 5, 101, 0, 0, 1262, 246, 1, 0, 0, 0, 1263, 1264, 5, 102, 0, 0, 1264, 1265, 5, 97, 0, 0, 1265, 1266, 5, 108, 0, 0, 1266, 1267, 5, 115, 0, 0, 1267, 1268, 5, 101, 0, 0, 1268, 248, 1, 0, 0, 0, 1269, 1270, 5, 110, 0, 0, 1270, 1271, 5, 117, 0, 0, 1271, 1272, 5, 108, 0, 0, 1272, 1273, 5, 108, 0, 0, 1273, 250, 1, 0, 0, 0, 1274, 1275, 5, 45, 0, 0, 1275, 1276, 5, 62, 0, 0, 1276, 252, 1, 0, 0, 0, 1277, 1278, 5, 58, 0, 0, 1278, 254, 1, 0, 0, 0, 1279, 1280, 5, 59, 0, 0, 1280, 256, 1, 0, 0, 0, 1281, 1282, 5, 44, 0, 0, 1282, 258, 1, 0, 0, 0, 1283, 1284, 5, 46, 0, 0, 1284, 260, 1, 0, 0, 0, 1285, 1286, 5, 123, 0, 0, 1286, 262, 1, 0, 0, 0, 1287, 1288, 5, 125, 0, 0, 1288, 264, 1, 0, 0, 0, 1289, 1290, 5, 91, 0, 0, 1290, 266, 1, 0, 0, 0, 1291, 1292, 5, 93, 0, 0, 1292, 268, 1, 0, 0, 0, 1293, 1294, 5, 40, 0, 0, 1294, 270, 1, 0, 0, 0, 1295, 1296, 5, 41, 0, 0, 1296, 272, 1, 0, 0, 0, 1297, 1298, 5, 60, 0, 0, 1298, 274, 1, 0, 0, 0, 1299, 1300, 5, 62, 0, 0, 1300, 276, 1, 0, 0, 0, 1301, 1302, 5, 38, 0, 0, 1302, 278, 1, 0, 0, 0, 1303, 1304, 5, 61, 0, 0, 1304, 280, 1, 0, 0, 0, 1305, 1307, 5, 45, 0, 0, 1306, 1305, 1, 0, 0, 0, 1306, 1307, 1, 0, 0, 0, 1307, 1309, 1, 0, 0, 0, 1308, 1310, 7, 0, 0, 0, 1309, 1308, 1, 0, 0, 0, 1310, 1311, 1, 0, 0, 0, 1311, 1309, 1, 0, 0, 0, 1311, 1312, 1, 0, 0, 0, 1312, 282, 1, 0, 0, 0, 1313, 1315, 5, 45, 0, 0, 1314, 1313, 1, 0, 0, 0, 1314, 1315, 1, 0, 0, 0, 1315, 1324, 1, 0, 0, 0, 1316, 1325, 5, 48, 0, 0, 1317, 1321, 7, 1, 0, 0, 1318, 1320, 7, 0, 0, 0, 1319, 1318, 1, 0, 0, 0, 1320, 1323, 1, 0, 0, 0, 1321, 1319, 1, 0, 0, 0, 1321, 1322, 1, 0, 0, 0, 1322, 1325, 1, 0, 0, 0, 1323, 1321, 1, 0, 0, 0, 1324, 1316, 1, 0, 0, 0, 1324, 1317, 1, 0, 0, 0, 1325, 1332, 1, 0, 0, 0, 1326, 1328, 5, 46, 0, 0, 1327, 1329, 7, 0, 0, 0, 1328, 1327, 1, 0, 0, 0, 1329, 1330, 1, 0, 0, 0, 1330, 1328, 1, 0, 0, 0, 1330, 1331, 1, 0, 0, 0, 1331, 1333, 1, 0, 0, 0, 1332, 1326, 1, 0, 0, 0, 1332, 1333, 1, 0, 0, 0, 1333, 1343, 1, 0, 0, 0, 1334, 1336, 7, 2, 0, 0, 1335, 1337, 7, 3, 0, 0, 1336, 1335, 1, 0, 0, 0, 1336, 1337, 1, 0, 0, 0, 1337, 1339, 1, 0, 0, 0, 1338, 1340, 7, 0, 0, 0, 1339, 1338, 1, 0, 0, 0, 1340, 1341, 1, 0, 0, 0, 1341, 1339, 1, 0, 0, 0, 1341, 1342, 1, 0, 0, 0, 1342, 1344, 1, 0, 0, 0, 1343, 1334, 1, 0, 0, 0, 1343, 1344, 1, 0, 0, 0, 1344, 284, 1, 0, 0, 0, 1345, 1349, 7, 4, 0, 0, 1346, 1348, 7, 5, 0, 0, 1347, 1346, 1, 0, 0, 0, 1348, 1351, 1, 0, 0, 0, 1349, 1347, 1, 0, 0, 0, 1349, 1350, 1, 0, 0, 0, 1350, 286, 1, 0, 0, 0, 1351, 1349, 1, 0, 0, 0, 1352, 1357, 5, 34, 0, 0, 1353, 1356, 3, 289, 144, 0, 1354, 1356, 8, 6, 0, 0, 1355, 1353, 1, 0, 0, 0, 1355, 1354, 1, 0, 0, 0, 1356, 1359, 1, 0, 0, 0, 1357, 1355, 1, 0, 0, 0, 1357, 1358, 1, 0, 0, 0, 1358, 1360, 1, 0, 0, 0, 1359, 1357, 1, 0, 0, 0, 1360, 1361, 5, 34, 0, 0, 1361, 288, 1, 0, 0, 0, 1362, 1370, 5, 92, 0, 0, 1363, 1371, 7, 7, 0, 0, 1364, 1365, 5, 117, 0, 0, 1365, 1366, 3, 291, 145, 0, 1366, 1367, 3, 291, 145, 0, 1367, 1368, 3, 291, 145, 0, 1368, 1369, 3, 291, 145, 0, 1369, 1371, 1, 0, 0, 0, 1370, 1363, 1, 0, 0, 0, 1370, 1364, 1, 0, 0, 0, 1371, 290, 1, 0, 0, 0, 1372, 1373, 7, 8, 0, 0, 1373, 292, 1, 0, 0, 0, 1374, 1375, 5, 47, 0, 0, 1375, 1376, 5, 47, 0, 0, 1376, 1380, 1, 0, 0, 0, 1377, 1379, 8, 9, 0, 0, 1378, 1377, 1, 0, 0, 0, 1379, 1382, 1, 0, 0, 0, 1380, 1378, 1, 0, 0, 0, 1380, 1381, 1, 0, 0, 0, 1381, 1383, 1, 0, 0, 0, 1382, 1380, 1, 0, 0, 0, 1383, 1384, 6, 146, 0, 0, 1384, 294, 1, 0, 0, 0, 1385, 1386, 5, 47, 0, 0, 1386, 1387, 5, 42, 0, 0, 1387, 1391, 1, 0, 0, 0, 1388, 1390, 9, 0, 0, 0, 1389, 1388, 1, 0, 0, 0, 1390, 1393, 1, 0, 0, 0, 1391, 1392, 1, 0, 0, 0, 1391, 1389, 1, 0, 0, 0, 1392, 1394, 1, 0, 0, 0, 1393, 1391, 1, 0, 0, 0, 1394, 1395, 5, 42, 0, 0, 1395, 1396, 5, 47, 0, 0, 1396, 1397, 1, 0, 0, 0, 1397, 1398, 6, 147, 0, 0, 1398, 296, 1, 0, 0, 0, 1399, 1401, 7, 10, 0, 0, 1400, 1399, 1, 0, 0, 0, 1401, 1402, 1, 0, 0, 0, 1402, 1400, 1, 0, 0, 0, 1402, 1403, 1, 0, 0, 0, 1403, 1404, 1, 0, 0, 0, 1404, 1405, 6, 148, 0, 0, 1405, 298, 1, 0, 0, 0, 18, 0, 1306, 1311, 1314, 1321, 1324, 1330, 1332, 1336, 1341, 1343, 1349, 1355, 1357, 1370, 1380, 1391, 1402, 1, 0, 1, 0] \ No newline at end of file +[4, 0, 148, 1418, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 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, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 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, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 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, 17, 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, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 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, 26, 1, 26, 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, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 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, 32, 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, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 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, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 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, 42, 1, 42, 1, 42, 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, 44, 1, 44, 1, 44, 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, 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, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 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, 1, 53, 1, 53, 1, 54, 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, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 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, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 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, 64, 1, 65, 1, 65, 1, 65, 1, 66, 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, 67, 1, 67, 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, 69, 1, 69, 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, 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, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 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, 75, 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, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 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, 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, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 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, 93, 1, 93, 1, 93, 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, 94, 1, 94, 1, 95, 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, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 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, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 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, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 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, 103, 1, 103, 1, 103, 1, 103, 1, 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, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 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, 3, 141, 1319, 8, 141, 1, 141, 4, 141, 1322, 8, 141, 11, 141, 12, 141, 1323, 1, 142, 3, 142, 1327, 8, 142, 1, 142, 1, 142, 1, 142, 5, 142, 1332, 8, 142, 10, 142, 12, 142, 1335, 9, 142, 3, 142, 1337, 8, 142, 1, 142, 1, 142, 4, 142, 1341, 8, 142, 11, 142, 12, 142, 1342, 3, 142, 1345, 8, 142, 1, 142, 1, 142, 3, 142, 1349, 8, 142, 1, 142, 4, 142, 1352, 8, 142, 11, 142, 12, 142, 1353, 3, 142, 1356, 8, 142, 1, 143, 1, 143, 5, 143, 1360, 8, 143, 10, 143, 12, 143, 1363, 9, 143, 1, 144, 1, 144, 1, 144, 5, 144, 1368, 8, 144, 10, 144, 12, 144, 1371, 9, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 3, 145, 1383, 8, 145, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 5, 147, 1391, 8, 147, 10, 147, 12, 147, 1394, 9, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 5, 148, 1402, 8, 148, 10, 148, 12, 148, 1405, 9, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 4, 149, 1413, 8, 149, 11, 149, 12, 149, 1414, 1, 149, 1, 149, 1, 1403, 0, 150, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 143, 287, 144, 289, 145, 291, 0, 293, 0, 295, 146, 297, 147, 299, 148, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1432, 0, 1, 1, 0, 0, 0, 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, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 1, 0, 0, 0, 0, 285, 1, 0, 0, 0, 0, 287, 1, 0, 0, 0, 0, 289, 1, 0, 0, 0, 0, 295, 1, 0, 0, 0, 0, 297, 1, 0, 0, 0, 0, 299, 1, 0, 0, 0, 1, 301, 1, 0, 0, 0, 3, 306, 1, 0, 0, 0, 5, 315, 1, 0, 0, 0, 7, 326, 1, 0, 0, 0, 9, 336, 1, 0, 0, 0, 11, 346, 1, 0, 0, 0, 13, 355, 1, 0, 0, 0, 15, 367, 1, 0, 0, 0, 17, 374, 1, 0, 0, 0, 19, 382, 1, 0, 0, 0, 21, 391, 1, 0, 0, 0, 23, 399, 1, 0, 0, 0, 25, 405, 1, 0, 0, 0, 27, 410, 1, 0, 0, 0, 29, 423, 1, 0, 0, 0, 31, 433, 1, 0, 0, 0, 33, 445, 1, 0, 0, 0, 35, 451, 1, 0, 0, 0, 37, 462, 1, 0, 0, 0, 39, 473, 1, 0, 0, 0, 41, 478, 1, 0, 0, 0, 43, 487, 1, 0, 0, 0, 45, 497, 1, 0, 0, 0, 47, 502, 1, 0, 0, 0, 49, 506, 1, 0, 0, 0, 51, 512, 1, 0, 0, 0, 53, 517, 1, 0, 0, 0, 55, 527, 1, 0, 0, 0, 57, 531, 1, 0, 0, 0, 59, 544, 1, 0, 0, 0, 61, 549, 1, 0, 0, 0, 63, 556, 1, 0, 0, 0, 65, 565, 1, 0, 0, 0, 67, 576, 1, 0, 0, 0, 69, 580, 1, 0, 0, 0, 71, 589, 1, 0, 0, 0, 73, 596, 1, 0, 0, 0, 75, 605, 1, 0, 0, 0, 77, 610, 1, 0, 0, 0, 79, 620, 1, 0, 0, 0, 81, 631, 1, 0, 0, 0, 83, 639, 1, 0, 0, 0, 85, 645, 1, 0, 0, 0, 87, 654, 1, 0, 0, 0, 89, 664, 1, 0, 0, 0, 91, 673, 1, 0, 0, 0, 93, 685, 1, 0, 0, 0, 95, 696, 1, 0, 0, 0, 97, 702, 1, 0, 0, 0, 99, 710, 1, 0, 0, 0, 101, 713, 1, 0, 0, 0, 103, 718, 1, 0, 0, 0, 105, 725, 1, 0, 0, 0, 107, 728, 1, 0, 0, 0, 109, 736, 1, 0, 0, 0, 111, 743, 1, 0, 0, 0, 113, 749, 1, 0, 0, 0, 115, 754, 1, 0, 0, 0, 117, 765, 1, 0, 0, 0, 119, 770, 1, 0, 0, 0, 121, 776, 1, 0, 0, 0, 123, 783, 1, 0, 0, 0, 125, 787, 1, 0, 0, 0, 127, 799, 1, 0, 0, 0, 129, 802, 1, 0, 0, 0, 131, 809, 1, 0, 0, 0, 133, 812, 1, 0, 0, 0, 135, 819, 1, 0, 0, 0, 137, 827, 1, 0, 0, 0, 139, 834, 1, 0, 0, 0, 141, 845, 1, 0, 0, 0, 143, 852, 1, 0, 0, 0, 145, 861, 1, 0, 0, 0, 147, 876, 1, 0, 0, 0, 149, 886, 1, 0, 0, 0, 151, 896, 1, 0, 0, 0, 153, 909, 1, 0, 0, 0, 155, 915, 1, 0, 0, 0, 157, 932, 1, 0, 0, 0, 159, 935, 1, 0, 0, 0, 161, 939, 1, 0, 0, 0, 163, 944, 1, 0, 0, 0, 165, 950, 1, 0, 0, 0, 167, 959, 1, 0, 0, 0, 169, 968, 1, 0, 0, 0, 171, 972, 1, 0, 0, 0, 173, 976, 1, 0, 0, 0, 175, 980, 1, 0, 0, 0, 177, 986, 1, 0, 0, 0, 179, 992, 1, 0, 0, 0, 181, 997, 1, 0, 0, 0, 183, 1002, 1, 0, 0, 0, 185, 1008, 1, 0, 0, 0, 187, 1016, 1, 0, 0, 0, 189, 1024, 1, 0, 0, 0, 191, 1035, 1, 0, 0, 0, 193, 1040, 1, 0, 0, 0, 195, 1052, 1, 0, 0, 0, 197, 1063, 1, 0, 0, 0, 199, 1073, 1, 0, 0, 0, 201, 1085, 1, 0, 0, 0, 203, 1094, 1, 0, 0, 0, 205, 1099, 1, 0, 0, 0, 207, 1112, 1, 0, 0, 0, 209, 1124, 1, 0, 0, 0, 211, 1136, 1, 0, 0, 0, 213, 1141, 1, 0, 0, 0, 215, 1149, 1, 0, 0, 0, 217, 1154, 1, 0, 0, 0, 219, 1167, 1, 0, 0, 0, 221, 1175, 1, 0, 0, 0, 223, 1184, 1, 0, 0, 0, 225, 1198, 1, 0, 0, 0, 227, 1207, 1, 0, 0, 0, 229, 1212, 1, 0, 0, 0, 231, 1219, 1, 0, 0, 0, 233, 1224, 1, 0, 0, 0, 235, 1230, 1, 0, 0, 0, 237, 1237, 1, 0, 0, 0, 239, 1243, 1, 0, 0, 0, 241, 1249, 1, 0, 0, 0, 243, 1256, 1, 0, 0, 0, 245, 1263, 1, 0, 0, 0, 247, 1270, 1, 0, 0, 0, 249, 1275, 1, 0, 0, 0, 251, 1281, 1, 0, 0, 0, 253, 1286, 1, 0, 0, 0, 255, 1289, 1, 0, 0, 0, 257, 1291, 1, 0, 0, 0, 259, 1293, 1, 0, 0, 0, 261, 1295, 1, 0, 0, 0, 263, 1297, 1, 0, 0, 0, 265, 1299, 1, 0, 0, 0, 267, 1301, 1, 0, 0, 0, 269, 1303, 1, 0, 0, 0, 271, 1305, 1, 0, 0, 0, 273, 1307, 1, 0, 0, 0, 275, 1309, 1, 0, 0, 0, 277, 1311, 1, 0, 0, 0, 279, 1313, 1, 0, 0, 0, 281, 1315, 1, 0, 0, 0, 283, 1318, 1, 0, 0, 0, 285, 1326, 1, 0, 0, 0, 287, 1357, 1, 0, 0, 0, 289, 1364, 1, 0, 0, 0, 291, 1374, 1, 0, 0, 0, 293, 1384, 1, 0, 0, 0, 295, 1386, 1, 0, 0, 0, 297, 1397, 1, 0, 0, 0, 299, 1412, 1, 0, 0, 0, 301, 302, 5, 101, 0, 0, 302, 303, 5, 100, 0, 0, 303, 304, 5, 105, 0, 0, 304, 305, 5, 116, 0, 0, 305, 2, 1, 0, 0, 0, 306, 307, 5, 99, 0, 0, 307, 308, 5, 114, 0, 0, 308, 309, 5, 101, 0, 0, 309, 310, 5, 97, 0, 0, 310, 311, 5, 116, 0, 0, 311, 312, 5, 105, 0, 0, 312, 313, 5, 111, 0, 0, 313, 314, 5, 110, 0, 0, 314, 4, 1, 0, 0, 0, 315, 316, 5, 105, 0, 0, 316, 317, 5, 110, 0, 0, 317, 318, 5, 105, 0, 0, 318, 319, 5, 116, 0, 0, 319, 320, 5, 105, 0, 0, 320, 321, 5, 97, 0, 0, 321, 322, 5, 108, 0, 0, 322, 323, 5, 105, 0, 0, 323, 324, 5, 122, 0, 0, 324, 325, 5, 101, 0, 0, 325, 6, 1, 0, 0, 0, 326, 327, 5, 119, 0, 0, 327, 328, 5, 111, 0, 0, 328, 329, 5, 114, 0, 0, 329, 330, 5, 107, 0, 0, 330, 331, 5, 115, 0, 0, 331, 332, 5, 112, 0, 0, 332, 333, 5, 97, 0, 0, 333, 334, 5, 99, 0, 0, 334, 335, 5, 101, 0, 0, 335, 8, 1, 0, 0, 0, 336, 337, 5, 101, 0, 0, 337, 338, 5, 120, 0, 0, 338, 339, 5, 101, 0, 0, 339, 340, 5, 99, 0, 0, 340, 341, 5, 117, 0, 0, 341, 342, 5, 116, 0, 0, 342, 343, 5, 105, 0, 0, 343, 344, 5, 111, 0, 0, 344, 345, 5, 110, 0, 0, 345, 10, 1, 0, 0, 0, 346, 347, 5, 115, 0, 0, 347, 348, 5, 110, 0, 0, 348, 349, 5, 97, 0, 0, 349, 350, 5, 112, 0, 0, 350, 351, 5, 115, 0, 0, 351, 352, 5, 104, 0, 0, 352, 353, 5, 111, 0, 0, 353, 354, 5, 116, 0, 0, 354, 12, 1, 0, 0, 0, 355, 356, 5, 116, 0, 0, 356, 357, 5, 114, 0, 0, 357, 358, 5, 97, 0, 0, 358, 359, 5, 110, 0, 0, 359, 360, 5, 115, 0, 0, 360, 361, 5, 97, 0, 0, 361, 362, 5, 99, 0, 0, 362, 363, 5, 116, 0, 0, 363, 364, 5, 105, 0, 0, 364, 365, 5, 111, 0, 0, 365, 366, 5, 110, 0, 0, 366, 14, 1, 0, 0, 0, 367, 368, 5, 114, 0, 0, 368, 369, 5, 101, 0, 0, 369, 370, 5, 109, 0, 0, 370, 371, 5, 111, 0, 0, 371, 372, 5, 116, 0, 0, 372, 373, 5, 101, 0, 0, 373, 16, 1, 0, 0, 0, 374, 375, 5, 116, 0, 0, 375, 376, 5, 97, 0, 0, 376, 377, 5, 114, 0, 0, 377, 378, 5, 103, 0, 0, 378, 379, 5, 101, 0, 0, 379, 380, 5, 116, 0, 0, 380, 381, 5, 115, 0, 0, 381, 18, 1, 0, 0, 0, 382, 383, 5, 112, 0, 0, 383, 384, 5, 111, 0, 0, 384, 385, 5, 114, 0, 0, 385, 386, 5, 116, 0, 0, 386, 387, 5, 97, 0, 0, 387, 388, 5, 98, 0, 0, 388, 389, 5, 108, 0, 0, 389, 390, 5, 101, 0, 0, 390, 20, 1, 0, 0, 0, 391, 392, 5, 114, 0, 0, 392, 393, 5, 101, 0, 0, 393, 394, 5, 112, 0, 0, 394, 395, 5, 108, 0, 0, 395, 396, 5, 105, 0, 0, 396, 397, 5, 99, 0, 0, 397, 398, 5, 97, 0, 0, 398, 22, 1, 0, 0, 0, 399, 400, 5, 108, 0, 0, 400, 401, 5, 111, 0, 0, 401, 402, 5, 99, 0, 0, 402, 403, 5, 97, 0, 0, 403, 404, 5, 108, 0, 0, 404, 24, 1, 0, 0, 0, 405, 406, 5, 102, 0, 0, 406, 407, 5, 114, 0, 0, 407, 408, 5, 111, 0, 0, 408, 409, 5, 109, 0, 0, 409, 26, 1, 0, 0, 0, 410, 411, 5, 114, 0, 0, 411, 412, 5, 101, 0, 0, 412, 413, 5, 115, 0, 0, 413, 414, 5, 117, 0, 0, 414, 415, 5, 108, 0, 0, 415, 416, 5, 116, 0, 0, 416, 417, 5, 45, 0, 0, 417, 418, 5, 98, 0, 0, 418, 419, 5, 121, 0, 0, 419, 420, 5, 116, 0, 0, 420, 421, 5, 101, 0, 0, 421, 422, 5, 115, 0, 0, 422, 28, 1, 0, 0, 0, 423, 424, 5, 114, 0, 0, 424, 425, 5, 112, 0, 0, 425, 426, 5, 99, 0, 0, 426, 427, 5, 45, 0, 0, 427, 428, 5, 99, 0, 0, 428, 429, 5, 97, 0, 0, 429, 430, 5, 108, 0, 0, 430, 431, 5, 108, 0, 0, 431, 432, 5, 115, 0, 0, 432, 30, 1, 0, 0, 0, 433, 434, 5, 100, 0, 0, 434, 435, 5, 101, 0, 0, 435, 436, 5, 97, 0, 0, 436, 437, 5, 100, 0, 0, 437, 438, 5, 108, 0, 0, 438, 439, 5, 105, 0, 0, 439, 440, 5, 110, 0, 0, 440, 441, 5, 101, 0, 0, 441, 442, 5, 45, 0, 0, 442, 443, 5, 109, 0, 0, 443, 444, 5, 115, 0, 0, 444, 32, 1, 0, 0, 0, 445, 446, 5, 113, 0, 0, 446, 447, 5, 117, 0, 0, 447, 448, 5, 101, 0, 0, 448, 449, 5, 114, 0, 0, 449, 450, 5, 121, 0, 0, 450, 34, 1, 0, 0, 0, 451, 452, 5, 114, 0, 0, 452, 453, 5, 101, 0, 0, 453, 454, 5, 102, 0, 0, 454, 455, 5, 108, 0, 0, 455, 456, 5, 101, 0, 0, 456, 457, 5, 99, 0, 0, 457, 458, 5, 116, 0, 0, 458, 459, 5, 105, 0, 0, 459, 460, 5, 111, 0, 0, 460, 461, 5, 110, 0, 0, 461, 36, 1, 0, 0, 0, 462, 463, 5, 115, 0, 0, 463, 464, 5, 112, 0, 0, 464, 465, 5, 101, 0, 0, 465, 466, 5, 99, 0, 0, 466, 467, 5, 105, 0, 0, 467, 468, 5, 97, 0, 0, 468, 469, 5, 108, 0, 0, 469, 470, 5, 105, 0, 0, 470, 471, 5, 122, 0, 0, 471, 472, 5, 101, 0, 0, 472, 38, 1, 0, 0, 0, 473, 474, 5, 114, 0, 0, 474, 475, 5, 111, 0, 0, 475, 476, 5, 111, 0, 0, 476, 477, 5, 116, 0, 0, 477, 40, 1, 0, 0, 0, 478, 479, 5, 100, 0, 0, 479, 480, 5, 111, 0, 0, 480, 481, 5, 99, 0, 0, 481, 482, 5, 117, 0, 0, 482, 483, 5, 109, 0, 0, 483, 484, 5, 101, 0, 0, 484, 485, 5, 110, 0, 0, 485, 486, 5, 116, 0, 0, 486, 42, 1, 0, 0, 0, 487, 488, 5, 102, 0, 0, 488, 489, 5, 114, 0, 0, 489, 490, 5, 97, 0, 0, 490, 491, 5, 103, 0, 0, 491, 492, 5, 109, 0, 0, 492, 493, 5, 101, 0, 0, 493, 494, 5, 110, 0, 0, 494, 495, 5, 116, 0, 0, 495, 496, 5, 115, 0, 0, 496, 44, 1, 0, 0, 0, 497, 498, 5, 118, 0, 0, 498, 499, 5, 105, 0, 0, 499, 500, 5, 101, 0, 0, 500, 501, 5, 119, 0, 0, 501, 46, 1, 0, 0, 0, 502, 503, 5, 109, 0, 0, 503, 504, 5, 97, 0, 0, 504, 505, 5, 120, 0, 0, 505, 48, 1, 0, 0, 0, 506, 507, 5, 97, 0, 0, 507, 508, 5, 108, 0, 0, 508, 509, 5, 108, 0, 0, 509, 510, 5, 111, 0, 0, 510, 511, 5, 119, 0, 0, 511, 50, 1, 0, 0, 0, 512, 513, 5, 112, 0, 0, 513, 514, 5, 111, 0, 0, 514, 515, 5, 108, 0, 0, 515, 516, 5, 108, 0, 0, 516, 52, 1, 0, 0, 0, 517, 518, 5, 113, 0, 0, 518, 519, 5, 117, 0, 0, 519, 520, 5, 101, 0, 0, 520, 521, 5, 114, 0, 0, 521, 522, 5, 121, 0, 0, 522, 523, 5, 97, 0, 0, 523, 524, 5, 98, 0, 0, 524, 525, 5, 108, 0, 0, 525, 526, 5, 101, 0, 0, 526, 54, 1, 0, 0, 0, 527, 528, 5, 114, 0, 0, 528, 529, 5, 112, 0, 0, 529, 530, 5, 99, 0, 0, 530, 56, 1, 0, 0, 0, 531, 532, 5, 113, 0, 0, 532, 533, 5, 117, 0, 0, 533, 534, 5, 101, 0, 0, 534, 535, 5, 114, 0, 0, 535, 536, 5, 121, 0, 0, 536, 537, 5, 45, 0, 0, 537, 538, 5, 114, 0, 0, 538, 539, 5, 101, 0, 0, 539, 540, 5, 97, 0, 0, 540, 541, 5, 115, 0, 0, 541, 542, 5, 111, 0, 0, 542, 543, 5, 110, 0, 0, 543, 58, 1, 0, 0, 0, 544, 545, 5, 116, 0, 0, 545, 546, 5, 121, 0, 0, 546, 547, 5, 112, 0, 0, 547, 548, 5, 101, 0, 0, 548, 60, 1, 0, 0, 0, 549, 550, 5, 111, 0, 0, 550, 551, 5, 98, 0, 0, 551, 552, 5, 106, 0, 0, 552, 553, 5, 101, 0, 0, 553, 554, 5, 99, 0, 0, 554, 555, 5, 116, 0, 0, 555, 62, 1, 0, 0, 0, 556, 557, 5, 115, 0, 0, 557, 558, 5, 116, 0, 0, 558, 559, 5, 111, 0, 0, 559, 560, 5, 114, 0, 0, 560, 561, 5, 97, 0, 0, 561, 562, 5, 98, 0, 0, 562, 563, 5, 108, 0, 0, 563, 564, 5, 101, 0, 0, 564, 64, 1, 0, 0, 0, 565, 566, 5, 105, 0, 0, 566, 567, 5, 109, 0, 0, 567, 568, 5, 112, 0, 0, 568, 569, 5, 108, 0, 0, 569, 570, 5, 101, 0, 0, 570, 571, 5, 109, 0, 0, 571, 572, 5, 101, 0, 0, 572, 573, 5, 110, 0, 0, 573, 574, 5, 116, 0, 0, 574, 575, 5, 115, 0, 0, 575, 66, 1, 0, 0, 0, 576, 577, 5, 114, 0, 0, 577, 578, 5, 101, 0, 0, 578, 579, 5, 102, 0, 0, 579, 68, 1, 0, 0, 0, 580, 581, 5, 102, 0, 0, 581, 582, 5, 114, 0, 0, 582, 583, 5, 97, 0, 0, 583, 584, 5, 103, 0, 0, 584, 585, 5, 109, 0, 0, 585, 586, 5, 101, 0, 0, 586, 587, 5, 110, 0, 0, 587, 588, 5, 116, 0, 0, 588, 70, 1, 0, 0, 0, 589, 590, 5, 105, 0, 0, 590, 591, 5, 109, 0, 0, 591, 592, 5, 112, 0, 0, 592, 593, 5, 111, 0, 0, 593, 594, 5, 114, 0, 0, 594, 595, 5, 116, 0, 0, 595, 72, 1, 0, 0, 0, 596, 597, 5, 101, 0, 0, 597, 598, 5, 120, 0, 0, 598, 599, 5, 116, 0, 0, 599, 600, 5, 101, 0, 0, 600, 601, 5, 114, 0, 0, 601, 602, 5, 110, 0, 0, 602, 603, 5, 97, 0, 0, 603, 604, 5, 108, 0, 0, 604, 74, 1, 0, 0, 0, 605, 606, 5, 97, 0, 0, 606, 607, 5, 116, 0, 0, 607, 608, 5, 111, 0, 0, 608, 609, 5, 109, 0, 0, 609, 76, 1, 0, 0, 0, 610, 611, 5, 105, 0, 0, 611, 612, 5, 110, 0, 0, 612, 613, 5, 116, 0, 0, 613, 614, 5, 101, 0, 0, 614, 615, 5, 114, 0, 0, 615, 616, 5, 102, 0, 0, 616, 617, 5, 97, 0, 0, 617, 618, 5, 99, 0, 0, 618, 619, 5, 101, 0, 0, 619, 78, 1, 0, 0, 0, 620, 621, 5, 105, 0, 0, 621, 622, 5, 110, 0, 0, 622, 623, 5, 116, 0, 0, 623, 624, 5, 101, 0, 0, 624, 625, 5, 114, 0, 0, 625, 626, 5, 102, 0, 0, 626, 627, 5, 97, 0, 0, 627, 628, 5, 99, 0, 0, 628, 629, 5, 101, 0, 0, 629, 630, 5, 115, 0, 0, 630, 80, 1, 0, 0, 0, 631, 632, 5, 112, 0, 0, 632, 633, 5, 97, 0, 0, 633, 634, 5, 99, 0, 0, 634, 635, 5, 107, 0, 0, 635, 636, 5, 97, 0, 0, 636, 637, 5, 103, 0, 0, 637, 638, 5, 101, 0, 0, 638, 82, 1, 0, 0, 0, 639, 640, 5, 118, 0, 0, 640, 641, 5, 97, 0, 0, 641, 642, 5, 108, 0, 0, 642, 643, 5, 117, 0, 0, 643, 644, 5, 101, 0, 0, 644, 84, 1, 0, 0, 0, 645, 646, 5, 114, 0, 0, 646, 647, 5, 101, 0, 0, 647, 648, 5, 108, 0, 0, 648, 649, 5, 97, 0, 0, 649, 650, 5, 116, 0, 0, 650, 651, 5, 105, 0, 0, 651, 652, 5, 111, 0, 0, 652, 653, 5, 110, 0, 0, 653, 86, 1, 0, 0, 0, 654, 655, 5, 111, 0, 0, 655, 656, 5, 112, 0, 0, 656, 657, 5, 101, 0, 0, 657, 658, 5, 114, 0, 0, 658, 659, 5, 97, 0, 0, 659, 660, 5, 116, 0, 0, 660, 661, 5, 105, 0, 0, 661, 662, 5, 111, 0, 0, 662, 663, 5, 110, 0, 0, 663, 88, 1, 0, 0, 0, 664, 665, 5, 102, 0, 0, 665, 666, 5, 117, 0, 0, 666, 667, 5, 110, 0, 0, 667, 668, 5, 99, 0, 0, 668, 669, 5, 116, 0, 0, 669, 670, 5, 105, 0, 0, 670, 671, 5, 111, 0, 0, 671, 672, 5, 110, 0, 0, 672, 90, 1, 0, 0, 0, 673, 674, 5, 99, 0, 0, 674, 675, 5, 111, 0, 0, 675, 676, 5, 110, 0, 0, 676, 677, 5, 115, 0, 0, 677, 678, 5, 116, 0, 0, 678, 679, 5, 114, 0, 0, 679, 680, 5, 117, 0, 0, 680, 681, 5, 99, 0, 0, 681, 682, 5, 116, 0, 0, 682, 683, 5, 111, 0, 0, 683, 684, 5, 114, 0, 0, 684, 92, 1, 0, 0, 0, 685, 686, 5, 99, 0, 0, 686, 687, 5, 111, 0, 0, 687, 688, 5, 110, 0, 0, 688, 689, 5, 115, 0, 0, 689, 690, 5, 116, 0, 0, 690, 691, 5, 114, 0, 0, 691, 692, 5, 117, 0, 0, 692, 693, 5, 99, 0, 0, 693, 694, 5, 116, 0, 0, 694, 695, 5, 115, 0, 0, 695, 94, 1, 0, 0, 0, 696, 697, 5, 105, 0, 0, 697, 698, 5, 110, 0, 0, 698, 699, 5, 112, 0, 0, 699, 700, 5, 117, 0, 0, 700, 701, 5, 116, 0, 0, 701, 96, 1, 0, 0, 0, 702, 703, 5, 99, 0, 0, 703, 704, 5, 111, 0, 0, 704, 705, 5, 110, 0, 0, 705, 706, 5, 102, 0, 0, 706, 707, 5, 111, 0, 0, 707, 708, 5, 114, 0, 0, 708, 709, 5, 109, 0, 0, 709, 98, 1, 0, 0, 0, 710, 711, 5, 97, 0, 0, 711, 712, 5, 115, 0, 0, 712, 100, 1, 0, 0, 0, 713, 714, 5, 98, 0, 0, 714, 715, 5, 105, 0, 0, 715, 716, 5, 110, 0, 0, 716, 717, 5, 100, 0, 0, 717, 102, 1, 0, 0, 0, 718, 719, 5, 115, 0, 0, 719, 720, 5, 116, 0, 0, 720, 721, 5, 97, 0, 0, 721, 722, 5, 116, 0, 0, 722, 723, 5, 105, 0, 0, 723, 724, 5, 99, 0, 0, 724, 104, 1, 0, 0, 0, 725, 726, 5, 116, 0, 0, 726, 727, 5, 111, 0, 0, 727, 106, 1, 0, 0, 0, 728, 729, 5, 112, 0, 0, 729, 730, 5, 114, 0, 0, 730, 731, 5, 105, 0, 0, 731, 732, 5, 118, 0, 0, 732, 733, 5, 97, 0, 0, 733, 734, 5, 116, 0, 0, 734, 735, 5, 101, 0, 0, 735, 108, 1, 0, 0, 0, 736, 737, 5, 115, 0, 0, 737, 738, 5, 104, 0, 0, 738, 739, 5, 97, 0, 0, 739, 740, 5, 114, 0, 0, 740, 741, 5, 101, 0, 0, 741, 742, 5, 100, 0, 0, 742, 110, 1, 0, 0, 0, 743, 744, 5, 115, 0, 0, 744, 745, 5, 116, 0, 0, 745, 746, 5, 97, 0, 0, 746, 747, 5, 116, 0, 0, 747, 748, 5, 101, 0, 0, 748, 112, 1, 0, 0, 0, 749, 750, 5, 101, 0, 0, 750, 751, 5, 100, 0, 0, 751, 752, 5, 103, 0, 0, 752, 753, 5, 101, 0, 0, 753, 114, 1, 0, 0, 0, 754, 755, 5, 112, 0, 0, 755, 756, 5, 114, 0, 0, 756, 757, 5, 111, 0, 0, 757, 758, 5, 106, 0, 0, 758, 759, 5, 101, 0, 0, 759, 760, 5, 99, 0, 0, 760, 761, 5, 116, 0, 0, 761, 762, 5, 105, 0, 0, 762, 763, 5, 111, 0, 0, 763, 764, 5, 110, 0, 0, 764, 116, 1, 0, 0, 0, 765, 766, 5, 119, 0, 0, 766, 767, 5, 105, 0, 0, 767, 768, 5, 116, 0, 0, 768, 769, 5, 104, 0, 0, 769, 118, 1, 0, 0, 0, 770, 771, 5, 117, 0, 0, 771, 772, 5, 115, 0, 0, 772, 773, 5, 105, 0, 0, 773, 774, 5, 110, 0, 0, 774, 775, 5, 103, 0, 0, 775, 120, 1, 0, 0, 0, 776, 777, 5, 97, 0, 0, 777, 778, 5, 99, 0, 0, 778, 779, 5, 99, 0, 0, 779, 780, 5, 101, 0, 0, 780, 781, 5, 112, 0, 0, 781, 782, 5, 116, 0, 0, 782, 122, 1, 0, 0, 0, 783, 784, 5, 118, 0, 0, 784, 785, 5, 105, 0, 0, 785, 786, 5, 97, 0, 0, 786, 124, 1, 0, 0, 0, 787, 788, 5, 109, 0, 0, 788, 789, 5, 97, 0, 0, 789, 790, 5, 116, 0, 0, 790, 791, 5, 101, 0, 0, 791, 792, 5, 114, 0, 0, 792, 793, 5, 105, 0, 0, 793, 794, 5, 97, 0, 0, 794, 795, 5, 108, 0, 0, 795, 796, 5, 105, 0, 0, 796, 797, 5, 122, 0, 0, 797, 798, 5, 101, 0, 0, 798, 126, 1, 0, 0, 0, 799, 800, 5, 105, 0, 0, 800, 801, 5, 102, 0, 0, 801, 128, 1, 0, 0, 0, 802, 803, 5, 97, 0, 0, 803, 804, 5, 98, 0, 0, 804, 805, 5, 115, 0, 0, 805, 806, 5, 101, 0, 0, 806, 807, 5, 110, 0, 0, 807, 808, 5, 116, 0, 0, 808, 130, 1, 0, 0, 0, 809, 810, 5, 111, 0, 0, 810, 811, 5, 110, 0, 0, 811, 132, 1, 0, 0, 0, 812, 813, 5, 112, 0, 0, 813, 814, 5, 111, 0, 0, 814, 815, 5, 108, 0, 0, 815, 816, 5, 105, 0, 0, 816, 817, 5, 99, 0, 0, 817, 818, 5, 121, 0, 0, 818, 134, 1, 0, 0, 0, 819, 820, 5, 100, 0, 0, 820, 821, 5, 101, 0, 0, 821, 822, 5, 102, 0, 0, 822, 823, 5, 97, 0, 0, 823, 824, 5, 117, 0, 0, 824, 825, 5, 108, 0, 0, 825, 826, 5, 116, 0, 0, 826, 136, 1, 0, 0, 0, 827, 828, 5, 115, 0, 0, 828, 829, 5, 111, 0, 0, 829, 830, 5, 117, 0, 0, 830, 831, 5, 114, 0, 0, 831, 832, 5, 99, 0, 0, 832, 833, 5, 101, 0, 0, 833, 138, 1, 0, 0, 0, 834, 835, 5, 114, 0, 0, 835, 836, 5, 101, 0, 0, 836, 837, 5, 112, 0, 0, 837, 838, 5, 111, 0, 0, 838, 839, 5, 115, 0, 0, 839, 840, 5, 105, 0, 0, 840, 841, 5, 116, 0, 0, 841, 842, 5, 111, 0, 0, 842, 843, 5, 114, 0, 0, 843, 844, 5, 121, 0, 0, 844, 140, 1, 0, 0, 0, 845, 846, 5, 99, 0, 0, 846, 847, 5, 111, 0, 0, 847, 848, 5, 109, 0, 0, 848, 849, 5, 109, 0, 0, 849, 850, 5, 105, 0, 0, 850, 851, 5, 116, 0, 0, 851, 142, 1, 0, 0, 0, 852, 853, 5, 114, 0, 0, 853, 854, 5, 101, 0, 0, 854, 855, 5, 118, 0, 0, 855, 856, 5, 105, 0, 0, 856, 857, 5, 115, 0, 0, 857, 858, 5, 105, 0, 0, 858, 859, 5, 111, 0, 0, 859, 860, 5, 110, 0, 0, 860, 144, 1, 0, 0, 0, 861, 862, 5, 115, 0, 0, 862, 863, 5, 101, 0, 0, 863, 864, 5, 109, 0, 0, 864, 865, 5, 97, 0, 0, 865, 866, 5, 110, 0, 0, 866, 867, 5, 116, 0, 0, 867, 868, 5, 105, 0, 0, 868, 869, 5, 99, 0, 0, 869, 870, 5, 45, 0, 0, 870, 871, 5, 109, 0, 0, 871, 872, 5, 97, 0, 0, 872, 873, 5, 106, 0, 0, 873, 874, 5, 111, 0, 0, 874, 875, 5, 114, 0, 0, 875, 146, 1, 0, 0, 0, 876, 877, 5, 111, 0, 0, 877, 878, 5, 110, 0, 0, 878, 879, 5, 45, 0, 0, 879, 880, 5, 100, 0, 0, 880, 881, 5, 101, 0, 0, 881, 882, 5, 108, 0, 0, 882, 883, 5, 101, 0, 0, 883, 884, 5, 116, 0, 0, 884, 885, 5, 101, 0, 0, 885, 148, 1, 0, 0, 0, 886, 887, 5, 108, 0, 0, 887, 888, 5, 105, 0, 0, 888, 889, 5, 102, 0, 0, 889, 890, 5, 101, 0, 0, 890, 891, 5, 99, 0, 0, 891, 892, 5, 121, 0, 0, 892, 893, 5, 99, 0, 0, 893, 894, 5, 108, 0, 0, 894, 895, 5, 101, 0, 0, 895, 150, 1, 0, 0, 0, 896, 897, 5, 114, 0, 0, 897, 898, 5, 101, 0, 0, 898, 899, 5, 116, 0, 0, 899, 900, 5, 97, 0, 0, 900, 901, 5, 105, 0, 0, 901, 902, 5, 110, 0, 0, 902, 903, 5, 45, 0, 0, 903, 904, 5, 111, 0, 0, 904, 905, 5, 116, 0, 0, 905, 906, 5, 104, 0, 0, 906, 907, 5, 101, 0, 0, 907, 908, 5, 114, 0, 0, 908, 152, 1, 0, 0, 0, 909, 910, 5, 107, 0, 0, 910, 911, 5, 101, 0, 0, 911, 912, 5, 121, 0, 0, 912, 913, 5, 101, 0, 0, 913, 914, 5, 100, 0, 0, 914, 154, 1, 0, 0, 0, 915, 916, 5, 112, 0, 0, 916, 917, 5, 117, 0, 0, 917, 918, 5, 98, 0, 0, 918, 919, 5, 108, 0, 0, 919, 920, 5, 105, 0, 0, 920, 921, 5, 99, 0, 0, 921, 922, 5, 45, 0, 0, 922, 923, 5, 116, 0, 0, 923, 924, 5, 114, 0, 0, 924, 925, 5, 97, 0, 0, 925, 926, 5, 118, 0, 0, 926, 927, 5, 101, 0, 0, 927, 928, 5, 114, 0, 0, 928, 929, 5, 115, 0, 0, 929, 930, 5, 97, 0, 0, 930, 931, 5, 108, 0, 0, 931, 156, 1, 0, 0, 0, 932, 933, 5, 105, 0, 0, 933, 934, 5, 100, 0, 0, 934, 158, 1, 0, 0, 0, 935, 936, 5, 100, 0, 0, 936, 937, 5, 111, 0, 0, 937, 938, 5, 99, 0, 0, 938, 160, 1, 0, 0, 0, 939, 940, 5, 109, 0, 0, 940, 941, 5, 111, 0, 0, 941, 942, 5, 100, 0, 0, 942, 943, 5, 101, 0, 0, 943, 162, 1, 0, 0, 0, 944, 945, 5, 101, 0, 0, 945, 946, 5, 109, 0, 0, 946, 947, 5, 105, 0, 0, 947, 948, 5, 116, 0, 0, 948, 949, 5, 115, 0, 0, 949, 164, 1, 0, 0, 0, 950, 951, 5, 114, 0, 0, 951, 952, 5, 101, 0, 0, 952, 953, 5, 99, 0, 0, 953, 954, 5, 101, 0, 0, 954, 955, 5, 105, 0, 0, 955, 956, 5, 118, 0, 0, 956, 957, 5, 101, 0, 0, 957, 958, 5, 114, 0, 0, 958, 166, 1, 0, 0, 0, 959, 960, 5, 114, 0, 0, 960, 961, 5, 101, 0, 0, 961, 962, 5, 113, 0, 0, 962, 963, 5, 117, 0, 0, 963, 964, 5, 105, 0, 0, 964, 965, 5, 114, 0, 0, 965, 966, 5, 101, 0, 0, 966, 967, 5, 115, 0, 0, 967, 168, 1, 0, 0, 0, 968, 969, 5, 97, 0, 0, 969, 970, 5, 110, 0, 0, 970, 971, 5, 121, 0, 0, 971, 170, 1, 0, 0, 0, 972, 973, 5, 103, 0, 0, 973, 974, 5, 101, 0, 0, 974, 975, 5, 116, 0, 0, 975, 172, 1, 0, 0, 0, 976, 977, 5, 115, 0, 0, 977, 978, 5, 101, 0, 0, 978, 979, 5, 116, 0, 0, 979, 174, 1, 0, 0, 0, 980, 981, 5, 119, 0, 0, 981, 982, 5, 97, 0, 0, 982, 983, 5, 116, 0, 0, 983, 984, 5, 99, 0, 0, 984, 985, 5, 104, 0, 0, 985, 176, 1, 0, 0, 0, 986, 987, 5, 115, 0, 0, 987, 988, 5, 116, 0, 0, 988, 989, 5, 97, 0, 0, 989, 990, 5, 114, 0, 0, 990, 991, 5, 116, 0, 0, 991, 178, 1, 0, 0, 0, 992, 993, 5, 115, 0, 0, 993, 994, 5, 116, 0, 0, 994, 995, 5, 111, 0, 0, 995, 996, 5, 112, 0, 0, 996, 180, 1, 0, 0, 0, 997, 998, 5, 114, 0, 0, 998, 999, 5, 101, 0, 0, 999, 1000, 5, 97, 0, 0, 1000, 1001, 5, 100, 0, 0, 1001, 182, 1, 0, 0, 0, 1002, 1003, 5, 119, 0, 0, 1003, 1004, 5, 114, 0, 0, 1004, 1005, 5, 105, 0, 0, 1005, 1006, 5, 116, 0, 0, 1006, 1007, 5, 101, 0, 0, 1007, 184, 1, 0, 0, 0, 1008, 1009, 5, 114, 0, 0, 1009, 1010, 5, 101, 0, 0, 1010, 1011, 5, 115, 0, 0, 1011, 1012, 5, 111, 0, 0, 1012, 1013, 5, 108, 0, 0, 1013, 1014, 5, 118, 0, 0, 1014, 1015, 5, 101, 0, 0, 1015, 186, 1, 0, 0, 0, 1016, 1017, 5, 99, 0, 0, 1017, 1018, 5, 111, 0, 0, 1018, 1019, 5, 110, 0, 0, 1019, 1020, 5, 110, 0, 0, 1020, 1021, 5, 101, 0, 0, 1021, 1022, 5, 99, 0, 0, 1022, 1023, 5, 116, 0, 0, 1023, 188, 1, 0, 0, 0, 1024, 1025, 5, 100, 0, 0, 1025, 1026, 5, 105, 0, 0, 1026, 1027, 5, 115, 0, 0, 1027, 1028, 5, 99, 0, 0, 1028, 1029, 5, 111, 0, 0, 1029, 1030, 5, 110, 0, 0, 1030, 1031, 5, 110, 0, 0, 1031, 1032, 5, 101, 0, 0, 1032, 1033, 5, 99, 0, 0, 1033, 1034, 5, 116, 0, 0, 1034, 190, 1, 0, 0, 0, 1035, 1036, 5, 99, 0, 0, 1036, 1037, 5, 97, 0, 0, 1037, 1038, 5, 108, 0, 0, 1038, 1039, 5, 108, 0, 0, 1039, 192, 1, 0, 0, 0, 1040, 1041, 5, 119, 0, 0, 1041, 1042, 5, 97, 0, 0, 1042, 1043, 5, 116, 0, 0, 1043, 1044, 5, 99, 0, 0, 1044, 1045, 5, 104, 0, 0, 1045, 1046, 5, 45, 0, 0, 1046, 1047, 5, 115, 0, 0, 1047, 1048, 5, 116, 0, 0, 1048, 1049, 5, 97, 0, 0, 1049, 1050, 5, 114, 0, 0, 1050, 1051, 5, 116, 0, 0, 1051, 194, 1, 0, 0, 0, 1052, 1053, 5, 119, 0, 0, 1053, 1054, 5, 97, 0, 0, 1054, 1055, 5, 116, 0, 0, 1055, 1056, 5, 99, 0, 0, 1056, 1057, 5, 104, 0, 0, 1057, 1058, 5, 45, 0, 0, 1058, 1059, 5, 115, 0, 0, 1059, 1060, 5, 116, 0, 0, 1060, 1061, 5, 111, 0, 0, 1061, 1062, 5, 112, 0, 0, 1062, 196, 1, 0, 0, 0, 1063, 1064, 5, 115, 0, 0, 1064, 1065, 5, 117, 0, 0, 1065, 1066, 5, 98, 0, 0, 1066, 1067, 5, 115, 0, 0, 1067, 1068, 5, 99, 0, 0, 1068, 1069, 5, 114, 0, 0, 1069, 1070, 5, 105, 0, 0, 1070, 1071, 5, 98, 0, 0, 1071, 1072, 5, 101, 0, 0, 1072, 198, 1, 0, 0, 0, 1073, 1074, 5, 117, 0, 0, 1074, 1075, 5, 110, 0, 0, 1075, 1076, 5, 115, 0, 0, 1076, 1077, 5, 117, 0, 0, 1077, 1078, 5, 98, 0, 0, 1078, 1079, 5, 115, 0, 0, 1079, 1080, 5, 99, 0, 0, 1080, 1081, 5, 114, 0, 0, 1081, 1082, 5, 105, 0, 0, 1082, 1083, 5, 98, 0, 0, 1083, 1084, 5, 101, 0, 0, 1084, 200, 1, 0, 0, 0, 1085, 1086, 5, 114, 0, 0, 1086, 1087, 5, 101, 0, 0, 1087, 1088, 5, 103, 0, 0, 1088, 1089, 5, 105, 0, 0, 1089, 1090, 5, 115, 0, 0, 1090, 1091, 5, 116, 0, 0, 1091, 1092, 5, 101, 0, 0, 1092, 1093, 5, 114, 0, 0, 1093, 202, 1, 0, 0, 0, 1094, 1095, 5, 99, 0, 0, 1095, 1096, 5, 114, 0, 0, 1096, 1097, 5, 100, 0, 0, 1097, 1098, 5, 116, 0, 0, 1098, 204, 1, 0, 0, 0, 1099, 1100, 5, 111, 0, 0, 1100, 1101, 5, 112, 0, 0, 1101, 1102, 5, 116, 0, 0, 1102, 1103, 5, 105, 0, 0, 1103, 1104, 5, 111, 0, 0, 1104, 1105, 5, 110, 0, 0, 1105, 1106, 5, 97, 0, 0, 1106, 1107, 5, 108, 0, 0, 1107, 1108, 5, 45, 0, 0, 1108, 1109, 5, 111, 0, 0, 1109, 1110, 5, 110, 0, 0, 1110, 1111, 5, 101, 0, 0, 1111, 206, 1, 0, 0, 0, 1112, 1113, 5, 101, 0, 0, 1113, 1114, 5, 120, 0, 0, 1114, 1115, 5, 97, 0, 0, 1115, 1116, 5, 99, 0, 0, 1116, 1117, 5, 116, 0, 0, 1117, 1118, 5, 108, 0, 0, 1118, 1119, 5, 121, 0, 0, 1119, 1120, 5, 45, 0, 0, 1120, 1121, 5, 111, 0, 0, 1121, 1122, 5, 110, 0, 0, 1122, 1123, 5, 101, 0, 0, 1123, 208, 1, 0, 0, 0, 1124, 1125, 5, 109, 0, 0, 1125, 1126, 5, 97, 0, 0, 1126, 1127, 5, 110, 0, 0, 1127, 1128, 5, 121, 0, 0, 1128, 1129, 5, 45, 0, 0, 1129, 1130, 5, 117, 0, 0, 1130, 1131, 5, 110, 0, 0, 1131, 1132, 5, 105, 0, 0, 1132, 1133, 5, 113, 0, 0, 1133, 1134, 5, 117, 0, 0, 1134, 1135, 5, 101, 0, 0, 1135, 210, 1, 0, 0, 0, 1136, 1137, 5, 109, 0, 0, 1137, 1138, 5, 97, 0, 0, 1138, 1139, 5, 110, 0, 0, 1139, 1140, 5, 121, 0, 0, 1140, 212, 1, 0, 0, 0, 1141, 1142, 5, 111, 0, 0, 1142, 1143, 5, 114, 0, 0, 1143, 1144, 5, 100, 0, 0, 1144, 1145, 5, 101, 0, 0, 1145, 1146, 5, 114, 0, 0, 1146, 1147, 5, 101, 0, 0, 1147, 1148, 5, 100, 0, 0, 1148, 214, 1, 0, 0, 0, 1149, 1150, 5, 117, 0, 0, 1150, 1151, 5, 110, 0, 0, 1151, 1152, 5, 105, 0, 0, 1152, 1153, 5, 116, 0, 0, 1153, 216, 1, 0, 0, 0, 1154, 1155, 5, 119, 0, 0, 1155, 1156, 5, 97, 0, 0, 1156, 1157, 5, 116, 0, 0, 1157, 1158, 5, 99, 0, 0, 1158, 1159, 5, 104, 0, 0, 1159, 1160, 5, 45, 0, 0, 1160, 1161, 5, 104, 0, 0, 1161, 1162, 5, 97, 0, 0, 1162, 1163, 5, 110, 0, 0, 1163, 1164, 5, 100, 0, 0, 1164, 1165, 5, 108, 0, 0, 1165, 1166, 5, 101, 0, 0, 1166, 218, 1, 0, 0, 0, 1167, 1168, 5, 109, 0, 0, 1168, 1169, 5, 101, 0, 0, 1169, 1170, 5, 115, 0, 0, 1170, 1171, 5, 115, 0, 0, 1171, 1172, 5, 97, 0, 0, 1172, 1173, 5, 103, 0, 0, 1173, 1174, 5, 101, 0, 0, 1174, 220, 1, 0, 0, 0, 1175, 1176, 5, 97, 0, 0, 1176, 1177, 5, 116, 0, 0, 1177, 1178, 5, 111, 0, 0, 1178, 1179, 5, 109, 0, 0, 1179, 1180, 5, 45, 0, 0, 1180, 1181, 5, 114, 0, 0, 1181, 1182, 5, 101, 0, 0, 1182, 1183, 5, 102, 0, 0, 1183, 222, 1, 0, 0, 0, 1184, 1185, 5, 105, 0, 0, 1185, 1186, 5, 110, 0, 0, 1186, 1187, 5, 116, 0, 0, 1187, 1188, 5, 101, 0, 0, 1188, 1189, 5, 114, 0, 0, 1189, 1190, 5, 102, 0, 0, 1190, 1191, 5, 97, 0, 0, 1191, 1192, 5, 99, 0, 0, 1192, 1193, 5, 101, 0, 0, 1193, 1194, 5, 45, 0, 0, 1194, 1195, 5, 114, 0, 0, 1195, 1196, 5, 101, 0, 0, 1196, 1197, 5, 102, 0, 0, 1197, 224, 1, 0, 0, 0, 1198, 1199, 5, 111, 0, 0, 1199, 1200, 5, 112, 0, 0, 1200, 1201, 5, 116, 0, 0, 1201, 1202, 5, 105, 0, 0, 1202, 1203, 5, 111, 0, 0, 1203, 1204, 5, 110, 0, 0, 1204, 1205, 5, 97, 0, 0, 1205, 1206, 5, 108, 0, 0, 1206, 226, 1, 0, 0, 0, 1207, 1208, 5, 108, 0, 0, 1208, 1209, 5, 105, 0, 0, 1209, 1210, 5, 115, 0, 0, 1210, 1211, 5, 116, 0, 0, 1211, 228, 1, 0, 0, 0, 1212, 1213, 5, 114, 0, 0, 1213, 1214, 5, 101, 0, 0, 1214, 1215, 5, 99, 0, 0, 1215, 1216, 5, 111, 0, 0, 1216, 1217, 5, 114, 0, 0, 1217, 1218, 5, 100, 0, 0, 1218, 230, 1, 0, 0, 0, 1219, 1220, 5, 98, 0, 0, 1220, 1221, 5, 111, 0, 0, 1221, 1222, 5, 111, 0, 0, 1222, 1223, 5, 108, 0, 0, 1223, 232, 1, 0, 0, 0, 1224, 1225, 5, 98, 0, 0, 1225, 1226, 5, 121, 0, 0, 1226, 1227, 5, 116, 0, 0, 1227, 1228, 5, 101, 0, 0, 1228, 1229, 5, 115, 0, 0, 1229, 234, 1, 0, 0, 0, 1230, 1231, 5, 100, 0, 0, 1231, 1232, 5, 111, 0, 0, 1232, 1233, 5, 117, 0, 0, 1233, 1234, 5, 98, 0, 0, 1234, 1235, 5, 108, 0, 0, 1235, 1236, 5, 101, 0, 0, 1236, 236, 1, 0, 0, 0, 1237, 1238, 5, 105, 0, 0, 1238, 1239, 5, 110, 0, 0, 1239, 1240, 5, 116, 0, 0, 1240, 1241, 5, 51, 0, 0, 1241, 1242, 5, 50, 0, 0, 1242, 238, 1, 0, 0, 0, 1243, 1244, 5, 105, 0, 0, 1244, 1245, 5, 110, 0, 0, 1245, 1246, 5, 116, 0, 0, 1246, 1247, 5, 54, 0, 0, 1247, 1248, 5, 52, 0, 0, 1248, 240, 1, 0, 0, 0, 1249, 1250, 5, 115, 0, 0, 1250, 1251, 5, 116, 0, 0, 1251, 1252, 5, 114, 0, 0, 1252, 1253, 5, 105, 0, 0, 1253, 1254, 5, 110, 0, 0, 1254, 1255, 5, 103, 0, 0, 1255, 242, 1, 0, 0, 0, 1256, 1257, 5, 117, 0, 0, 1257, 1258, 5, 105, 0, 0, 1258, 1259, 5, 110, 0, 0, 1259, 1260, 5, 116, 0, 0, 1260, 1261, 5, 51, 0, 0, 1261, 1262, 5, 50, 0, 0, 1262, 244, 1, 0, 0, 0, 1263, 1264, 5, 117, 0, 0, 1264, 1265, 5, 105, 0, 0, 1265, 1266, 5, 110, 0, 0, 1266, 1267, 5, 116, 0, 0, 1267, 1268, 5, 54, 0, 0, 1268, 1269, 5, 52, 0, 0, 1269, 246, 1, 0, 0, 0, 1270, 1271, 5, 116, 0, 0, 1271, 1272, 5, 114, 0, 0, 1272, 1273, 5, 117, 0, 0, 1273, 1274, 5, 101, 0, 0, 1274, 248, 1, 0, 0, 0, 1275, 1276, 5, 102, 0, 0, 1276, 1277, 5, 97, 0, 0, 1277, 1278, 5, 108, 0, 0, 1278, 1279, 5, 115, 0, 0, 1279, 1280, 5, 101, 0, 0, 1280, 250, 1, 0, 0, 0, 1281, 1282, 5, 110, 0, 0, 1282, 1283, 5, 117, 0, 0, 1283, 1284, 5, 108, 0, 0, 1284, 1285, 5, 108, 0, 0, 1285, 252, 1, 0, 0, 0, 1286, 1287, 5, 45, 0, 0, 1287, 1288, 5, 62, 0, 0, 1288, 254, 1, 0, 0, 0, 1289, 1290, 5, 58, 0, 0, 1290, 256, 1, 0, 0, 0, 1291, 1292, 5, 59, 0, 0, 1292, 258, 1, 0, 0, 0, 1293, 1294, 5, 44, 0, 0, 1294, 260, 1, 0, 0, 0, 1295, 1296, 5, 46, 0, 0, 1296, 262, 1, 0, 0, 0, 1297, 1298, 5, 123, 0, 0, 1298, 264, 1, 0, 0, 0, 1299, 1300, 5, 125, 0, 0, 1300, 266, 1, 0, 0, 0, 1301, 1302, 5, 91, 0, 0, 1302, 268, 1, 0, 0, 0, 1303, 1304, 5, 93, 0, 0, 1304, 270, 1, 0, 0, 0, 1305, 1306, 5, 40, 0, 0, 1306, 272, 1, 0, 0, 0, 1307, 1308, 5, 41, 0, 0, 1308, 274, 1, 0, 0, 0, 1309, 1310, 5, 60, 0, 0, 1310, 276, 1, 0, 0, 0, 1311, 1312, 5, 62, 0, 0, 1312, 278, 1, 0, 0, 0, 1313, 1314, 5, 38, 0, 0, 1314, 280, 1, 0, 0, 0, 1315, 1316, 5, 61, 0, 0, 1316, 282, 1, 0, 0, 0, 1317, 1319, 5, 45, 0, 0, 1318, 1317, 1, 0, 0, 0, 1318, 1319, 1, 0, 0, 0, 1319, 1321, 1, 0, 0, 0, 1320, 1322, 7, 0, 0, 0, 1321, 1320, 1, 0, 0, 0, 1322, 1323, 1, 0, 0, 0, 1323, 1321, 1, 0, 0, 0, 1323, 1324, 1, 0, 0, 0, 1324, 284, 1, 0, 0, 0, 1325, 1327, 5, 45, 0, 0, 1326, 1325, 1, 0, 0, 0, 1326, 1327, 1, 0, 0, 0, 1327, 1336, 1, 0, 0, 0, 1328, 1337, 5, 48, 0, 0, 1329, 1333, 7, 1, 0, 0, 1330, 1332, 7, 0, 0, 0, 1331, 1330, 1, 0, 0, 0, 1332, 1335, 1, 0, 0, 0, 1333, 1331, 1, 0, 0, 0, 1333, 1334, 1, 0, 0, 0, 1334, 1337, 1, 0, 0, 0, 1335, 1333, 1, 0, 0, 0, 1336, 1328, 1, 0, 0, 0, 1336, 1329, 1, 0, 0, 0, 1337, 1344, 1, 0, 0, 0, 1338, 1340, 5, 46, 0, 0, 1339, 1341, 7, 0, 0, 0, 1340, 1339, 1, 0, 0, 0, 1341, 1342, 1, 0, 0, 0, 1342, 1340, 1, 0, 0, 0, 1342, 1343, 1, 0, 0, 0, 1343, 1345, 1, 0, 0, 0, 1344, 1338, 1, 0, 0, 0, 1344, 1345, 1, 0, 0, 0, 1345, 1355, 1, 0, 0, 0, 1346, 1348, 7, 2, 0, 0, 1347, 1349, 7, 3, 0, 0, 1348, 1347, 1, 0, 0, 0, 1348, 1349, 1, 0, 0, 0, 1349, 1351, 1, 0, 0, 0, 1350, 1352, 7, 0, 0, 0, 1351, 1350, 1, 0, 0, 0, 1352, 1353, 1, 0, 0, 0, 1353, 1351, 1, 0, 0, 0, 1353, 1354, 1, 0, 0, 0, 1354, 1356, 1, 0, 0, 0, 1355, 1346, 1, 0, 0, 0, 1355, 1356, 1, 0, 0, 0, 1356, 286, 1, 0, 0, 0, 1357, 1361, 7, 4, 0, 0, 1358, 1360, 7, 5, 0, 0, 1359, 1358, 1, 0, 0, 0, 1360, 1363, 1, 0, 0, 0, 1361, 1359, 1, 0, 0, 0, 1361, 1362, 1, 0, 0, 0, 1362, 288, 1, 0, 0, 0, 1363, 1361, 1, 0, 0, 0, 1364, 1369, 5, 34, 0, 0, 1365, 1368, 3, 291, 145, 0, 1366, 1368, 8, 6, 0, 0, 1367, 1365, 1, 0, 0, 0, 1367, 1366, 1, 0, 0, 0, 1368, 1371, 1, 0, 0, 0, 1369, 1367, 1, 0, 0, 0, 1369, 1370, 1, 0, 0, 0, 1370, 1372, 1, 0, 0, 0, 1371, 1369, 1, 0, 0, 0, 1372, 1373, 5, 34, 0, 0, 1373, 290, 1, 0, 0, 0, 1374, 1382, 5, 92, 0, 0, 1375, 1383, 7, 7, 0, 0, 1376, 1377, 5, 117, 0, 0, 1377, 1378, 3, 293, 146, 0, 1378, 1379, 3, 293, 146, 0, 1379, 1380, 3, 293, 146, 0, 1380, 1381, 3, 293, 146, 0, 1381, 1383, 1, 0, 0, 0, 1382, 1375, 1, 0, 0, 0, 1382, 1376, 1, 0, 0, 0, 1383, 292, 1, 0, 0, 0, 1384, 1385, 7, 8, 0, 0, 1385, 294, 1, 0, 0, 0, 1386, 1387, 5, 47, 0, 0, 1387, 1388, 5, 47, 0, 0, 1388, 1392, 1, 0, 0, 0, 1389, 1391, 8, 9, 0, 0, 1390, 1389, 1, 0, 0, 0, 1391, 1394, 1, 0, 0, 0, 1392, 1390, 1, 0, 0, 0, 1392, 1393, 1, 0, 0, 0, 1393, 1395, 1, 0, 0, 0, 1394, 1392, 1, 0, 0, 0, 1395, 1396, 6, 147, 0, 0, 1396, 296, 1, 0, 0, 0, 1397, 1398, 5, 47, 0, 0, 1398, 1399, 5, 42, 0, 0, 1399, 1403, 1, 0, 0, 0, 1400, 1402, 9, 0, 0, 0, 1401, 1400, 1, 0, 0, 0, 1402, 1405, 1, 0, 0, 0, 1403, 1404, 1, 0, 0, 0, 1403, 1401, 1, 0, 0, 0, 1404, 1406, 1, 0, 0, 0, 1405, 1403, 1, 0, 0, 0, 1406, 1407, 5, 42, 0, 0, 1407, 1408, 5, 47, 0, 0, 1408, 1409, 1, 0, 0, 0, 1409, 1410, 6, 148, 0, 0, 1410, 298, 1, 0, 0, 0, 1411, 1413, 7, 10, 0, 0, 1412, 1411, 1, 0, 0, 0, 1413, 1414, 1, 0, 0, 0, 1414, 1412, 1, 0, 0, 0, 1414, 1415, 1, 0, 0, 0, 1415, 1416, 1, 0, 0, 0, 1416, 1417, 6, 149, 0, 0, 1417, 300, 1, 0, 0, 0, 18, 0, 1318, 1323, 1326, 1333, 1336, 1342, 1344, 1348, 1353, 1355, 1361, 1367, 1369, 1382, 1392, 1403, 1414, 1, 0, 1, 0] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapabilityLexer.tokens b/src/capability-language/generated/QuixosCapabilityLexer.tokens index 3f8605d..56aff23 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.tokens +++ b/src/capability-language/generated/QuixosCapabilityLexer.tokens @@ -72,79 +72,80 @@ COMMIT=71 REVISION=72 SEMANTIC_MAJOR=73 ON_DELETE=74 -RETAIN_OTHER=75 -KEYED=76 -PUBLIC_TRAVERSAL=77 -ID=78 -DOC=79 -MODE=80 -EMITS=81 -RECEIVER=82 -REQUIRES=83 -ANY=84 -GET=85 -SET=86 -WATCH=87 -START=88 -STOP=89 -READ=90 -WRITE=91 -RESOLVE=92 -CONNECT=93 -DISCONNECT=94 -CALL=95 -WATCH_START=96 -WATCH_STOP=97 -SUBSCRIBE=98 -UNSUBSCRIBE=99 -REGISTER=100 -CRDT=101 -OPTIONAL_ONE=102 -EXACTLY_ONE=103 -MANY_UNIQUE=104 -MANY=105 -ORDERED=106 -UNIT=107 -WATCH_HANDLE=108 -MESSAGE=109 -ATOM_REF=110 -INTERFACE_REF=111 -OPTIONAL=112 -LIST=113 -RECORD=114 -BOOL=115 -BYTES=116 -DOUBLE=117 -INT32=118 -INT64=119 -STRING=120 -UINT32=121 -UINT64=122 -TRUE=123 -FALSE=124 -NULL=125 -ARROW=126 -COLON=127 -SEMI=128 -COMMA=129 -DOT=130 -LBRACE=131 -RBRACE=132 -LBRACK=133 -RBRACK=134 -LPAREN=135 -RPAREN=136 -LT=137 -GT=138 -AMP=139 -EQUAL=140 -INTEGER=141 -JSON_NUMBER=142 -IDENTIFIER=143 -STRING_LITERAL=144 -LINE_COMMENT=145 -BLOCK_COMMENT=146 -WS=147 +LIFECYCLE=75 +RETAIN_OTHER=76 +KEYED=77 +PUBLIC_TRAVERSAL=78 +ID=79 +DOC=80 +MODE=81 +EMITS=82 +RECEIVER=83 +REQUIRES=84 +ANY=85 +GET=86 +SET=87 +WATCH=88 +START=89 +STOP=90 +READ=91 +WRITE=92 +RESOLVE=93 +CONNECT=94 +DISCONNECT=95 +CALL=96 +WATCH_START=97 +WATCH_STOP=98 +SUBSCRIBE=99 +UNSUBSCRIBE=100 +REGISTER=101 +CRDT=102 +OPTIONAL_ONE=103 +EXACTLY_ONE=104 +MANY_UNIQUE=105 +MANY=106 +ORDERED=107 +UNIT=108 +WATCH_HANDLE=109 +MESSAGE=110 +ATOM_REF=111 +INTERFACE_REF=112 +OPTIONAL=113 +LIST=114 +RECORD=115 +BOOL=116 +BYTES=117 +DOUBLE=118 +INT32=119 +INT64=120 +STRING=121 +UINT32=122 +UINT64=123 +TRUE=124 +FALSE=125 +NULL=126 +ARROW=127 +COLON=128 +SEMI=129 +COMMA=130 +DOT=131 +LBRACE=132 +RBRACE=133 +LBRACK=134 +RBRACK=135 +LPAREN=136 +RPAREN=137 +LT=138 +GT=139 +AMP=140 +EQUAL=141 +INTEGER=142 +JSON_NUMBER=143 +IDENTIFIER=144 +STRING_LITERAL=145 +LINE_COMMENT=146 +BLOCK_COMMENT=147 +WS=148 'edit'=1 'creation'=2 'initialize'=3 @@ -219,69 +220,70 @@ WS=147 'revision'=72 'semantic-major'=73 'on-delete'=74 -'retain-other'=75 -'keyed'=76 -'public-traversal'=77 -'id'=78 -'doc'=79 -'mode'=80 -'emits'=81 -'receiver'=82 -'requires'=83 -'any'=84 -'get'=85 -'set'=86 -'watch'=87 -'start'=88 -'stop'=89 -'read'=90 -'write'=91 -'resolve'=92 -'connect'=93 -'disconnect'=94 -'call'=95 -'watch-start'=96 -'watch-stop'=97 -'subscribe'=98 -'unsubscribe'=99 -'register'=100 -'crdt'=101 -'optional-one'=102 -'exactly-one'=103 -'many-unique'=104 -'many'=105 -'ordered'=106 -'unit'=107 -'watch-handle'=108 -'message'=109 -'atom-ref'=110 -'interface-ref'=111 -'optional'=112 -'list'=113 -'record'=114 -'bool'=115 -'bytes'=116 -'double'=117 -'int32'=118 -'int64'=119 -'string'=120 -'uint32'=121 -'uint64'=122 -'true'=123 -'false'=124 -'null'=125 -'->'=126 -':'=127 -';'=128 -','=129 -'.'=130 -'{'=131 -'}'=132 -'['=133 -']'=134 -'('=135 -')'=136 -'<'=137 -'>'=138 -'&'=139 -'='=140 +'lifecycle'=75 +'retain-other'=76 +'keyed'=77 +'public-traversal'=78 +'id'=79 +'doc'=80 +'mode'=81 +'emits'=82 +'receiver'=83 +'requires'=84 +'any'=85 +'get'=86 +'set'=87 +'watch'=88 +'start'=89 +'stop'=90 +'read'=91 +'write'=92 +'resolve'=93 +'connect'=94 +'disconnect'=95 +'call'=96 +'watch-start'=97 +'watch-stop'=98 +'subscribe'=99 +'unsubscribe'=100 +'register'=101 +'crdt'=102 +'optional-one'=103 +'exactly-one'=104 +'many-unique'=105 +'many'=106 +'ordered'=107 +'unit'=108 +'watch-handle'=109 +'message'=110 +'atom-ref'=111 +'interface-ref'=112 +'optional'=113 +'list'=114 +'record'=115 +'bool'=116 +'bytes'=117 +'double'=118 +'int32'=119 +'int64'=120 +'string'=121 +'uint32'=122 +'uint64'=123 +'true'=124 +'false'=125 +'null'=126 +'->'=127 +':'=128 +';'=129 +','=130 +'.'=131 +'{'=132 +'}'=133 +'['=134 +']'=135 +'('=136 +')'=137 +'<'=138 +'>'=139 +'&'=140 +'='=141 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.ts b/src/capability-language/generated/QuixosCapabilityLexer.ts index fe595e4..2ce2b17 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.ts +++ b/src/capability-language/generated/QuixosCapabilityLexer.ts @@ -78,79 +78,80 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public static readonly REVISION = 72; public static readonly SEMANTIC_MAJOR = 73; public static readonly ON_DELETE = 74; - public static readonly RETAIN_OTHER = 75; - public static readonly KEYED = 76; - public static readonly PUBLIC_TRAVERSAL = 77; - public static readonly ID = 78; - public static readonly DOC = 79; - public static readonly MODE = 80; - public static readonly EMITS = 81; - public static readonly RECEIVER = 82; - public static readonly REQUIRES = 83; - public static readonly ANY = 84; - public static readonly GET = 85; - public static readonly SET = 86; - public static readonly WATCH = 87; - public static readonly START = 88; - public static readonly STOP = 89; - public static readonly READ = 90; - public static readonly WRITE = 91; - public static readonly RESOLVE = 92; - public static readonly CONNECT = 93; - public static readonly DISCONNECT = 94; - public static readonly CALL = 95; - public static readonly WATCH_START = 96; - public static readonly WATCH_STOP = 97; - public static readonly SUBSCRIBE = 98; - public static readonly UNSUBSCRIBE = 99; - public static readonly REGISTER = 100; - public static readonly CRDT = 101; - public static readonly OPTIONAL_ONE = 102; - public static readonly EXACTLY_ONE = 103; - public static readonly MANY_UNIQUE = 104; - public static readonly MANY = 105; - public static readonly ORDERED = 106; - public static readonly UNIT = 107; - public static readonly WATCH_HANDLE = 108; - public static readonly MESSAGE = 109; - public static readonly ATOM_REF = 110; - public static readonly INTERFACE_REF = 111; - public static readonly OPTIONAL = 112; - public static readonly LIST = 113; - public static readonly RECORD = 114; - public static readonly BOOL = 115; - public static readonly BYTES = 116; - public static readonly DOUBLE = 117; - public static readonly INT32 = 118; - public static readonly INT64 = 119; - public static readonly STRING = 120; - public static readonly UINT32 = 121; - public static readonly UINT64 = 122; - public static readonly TRUE = 123; - public static readonly FALSE = 124; - public static readonly NULL = 125; - public static readonly ARROW = 126; - public static readonly COLON = 127; - public static readonly SEMI = 128; - public static readonly COMMA = 129; - public static readonly DOT = 130; - public static readonly LBRACE = 131; - public static readonly RBRACE = 132; - public static readonly LBRACK = 133; - public static readonly RBRACK = 134; - public static readonly LPAREN = 135; - public static readonly RPAREN = 136; - public static readonly LT = 137; - public static readonly GT = 138; - public static readonly AMP = 139; - public static readonly EQUAL = 140; - public static readonly INTEGER = 141; - public static readonly JSON_NUMBER = 142; - public static readonly IDENTIFIER = 143; - public static readonly STRING_LITERAL = 144; - public static readonly LINE_COMMENT = 145; - public static readonly BLOCK_COMMENT = 146; - public static readonly WS = 147; + public static readonly LIFECYCLE = 75; + public static readonly RETAIN_OTHER = 76; + public static readonly KEYED = 77; + public static readonly PUBLIC_TRAVERSAL = 78; + public static readonly ID = 79; + public static readonly DOC = 80; + public static readonly MODE = 81; + public static readonly EMITS = 82; + public static readonly RECEIVER = 83; + public static readonly REQUIRES = 84; + public static readonly ANY = 85; + public static readonly GET = 86; + public static readonly SET = 87; + public static readonly WATCH = 88; + public static readonly START = 89; + public static readonly STOP = 90; + public static readonly READ = 91; + public static readonly WRITE = 92; + public static readonly RESOLVE = 93; + public static readonly CONNECT = 94; + public static readonly DISCONNECT = 95; + public static readonly CALL = 96; + public static readonly WATCH_START = 97; + public static readonly WATCH_STOP = 98; + public static readonly SUBSCRIBE = 99; + public static readonly UNSUBSCRIBE = 100; + public static readonly REGISTER = 101; + public static readonly CRDT = 102; + public static readonly OPTIONAL_ONE = 103; + public static readonly EXACTLY_ONE = 104; + public static readonly MANY_UNIQUE = 105; + public static readonly MANY = 106; + public static readonly ORDERED = 107; + public static readonly UNIT = 108; + public static readonly WATCH_HANDLE = 109; + public static readonly MESSAGE = 110; + public static readonly ATOM_REF = 111; + public static readonly INTERFACE_REF = 112; + public static readonly OPTIONAL = 113; + public static readonly LIST = 114; + public static readonly RECORD = 115; + public static readonly BOOL = 116; + public static readonly BYTES = 117; + public static readonly DOUBLE = 118; + public static readonly INT32 = 119; + public static readonly INT64 = 120; + public static readonly STRING = 121; + public static readonly UINT32 = 122; + public static readonly UINT64 = 123; + public static readonly TRUE = 124; + public static readonly FALSE = 125; + public static readonly NULL = 126; + public static readonly ARROW = 127; + public static readonly COLON = 128; + public static readonly SEMI = 129; + public static readonly COMMA = 130; + public static readonly DOT = 131; + public static readonly LBRACE = 132; + public static readonly RBRACE = 133; + public static readonly LBRACK = 134; + public static readonly RBRACK = 135; + public static readonly LPAREN = 136; + public static readonly RPAREN = 137; + public static readonly LT = 138; + public static readonly GT = 139; + public static readonly AMP = 140; + public static readonly EQUAL = 141; + public static readonly INTEGER = 142; + public static readonly JSON_NUMBER = 143; + public static readonly IDENTIFIER = 144; + public static readonly STRING_LITERAL = 145; + public static readonly LINE_COMMENT = 146; + public static readonly BLOCK_COMMENT = 147; + public static readonly WS = 148; public static readonly channelNames = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" @@ -170,18 +171,18 @@ export class QuixosCapabilityLexer extends antlr.Lexer { "'to'", "'private'", "'shared'", "'state'", "'edge'", "'projection'", "'with'", "'using'", "'accept'", "'via'", "'materialize'", "'if'", "'absent'", "'on'", "'policy'", "'default'", "'source'", "'repository'", - "'commit'", "'revision'", "'semantic-major'", "'on-delete'", "'retain-other'", - "'keyed'", "'public-traversal'", "'id'", "'doc'", "'mode'", "'emits'", - "'receiver'", "'requires'", "'any'", "'get'", "'set'", "'watch'", - "'start'", "'stop'", "'read'", "'write'", "'resolve'", "'connect'", - "'disconnect'", "'call'", "'watch-start'", "'watch-stop'", "'subscribe'", - "'unsubscribe'", "'register'", "'crdt'", "'optional-one'", "'exactly-one'", - "'many-unique'", "'many'", "'ordered'", "'unit'", "'watch-handle'", - "'message'", "'atom-ref'", "'interface-ref'", "'optional'", "'list'", - "'record'", "'bool'", "'bytes'", "'double'", "'int32'", "'int64'", - "'string'", "'uint32'", "'uint64'", "'true'", "'false'", "'null'", - "'->'", "':'", "';'", "','", "'.'", "'{'", "'}'", "'['", "']'", - "'('", "')'", "'<'", "'>'", "'&'", "'='" + "'commit'", "'revision'", "'semantic-major'", "'on-delete'", "'lifecycle'", + "'retain-other'", "'keyed'", "'public-traversal'", "'id'", "'doc'", + "'mode'", "'emits'", "'receiver'", "'requires'", "'any'", "'get'", + "'set'", "'watch'", "'start'", "'stop'", "'read'", "'write'", "'resolve'", + "'connect'", "'disconnect'", "'call'", "'watch-start'", "'watch-stop'", + "'subscribe'", "'unsubscribe'", "'register'", "'crdt'", "'optional-one'", + "'exactly-one'", "'many-unique'", "'many'", "'ordered'", "'unit'", + "'watch-handle'", "'message'", "'atom-ref'", "'interface-ref'", + "'optional'", "'list'", "'record'", "'bool'", "'bytes'", "'double'", + "'int32'", "'int64'", "'string'", "'uint32'", "'uint64'", "'true'", + "'false'", "'null'", "'->'", "':'", "';'", "','", "'.'", "'{'", + "'}'", "'['", "']'", "'('", "')'", "'<'", "'>'", "'&'", "'='" ]; public static readonly symbolicNames = [ @@ -197,18 +198,18 @@ export class QuixosCapabilityLexer extends antlr.Lexer { "STATE", "EDGE", "PROJECTION", "WITH", "USING", "ACCEPT", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", - "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", - "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", - "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", - "WATCH_START", "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "REGISTER", - "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", - "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", - "OPTIONAL", "LIST", "RECORD", "BOOL", "BYTES", "DOUBLE", "INT32", - "INT64", "STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", - "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", - "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "AMP", "EQUAL", "INTEGER", - "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", - "WS" + "LIFECYCLE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", + "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", + "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", + "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", + "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", + "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", + "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", "BOOL", + "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", + "TRUE", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", + "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", + "GT", "AMP", "EQUAL", "INTEGER", "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", + "LINE_COMMENT", "BLOCK_COMMENT", "WS" ]; public static readonly modeNames = [ @@ -227,9 +228,9 @@ export class QuixosCapabilityLexer extends antlr.Lexer { "TO", "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", "USING", "ACCEPT", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", - "ON_DELETE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", - "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", - "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", + "ON_DELETE", "LIFECYCLE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", + "ID", "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", + "SET", "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", @@ -260,7 +261,7 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public get modeNames(): string[] { return QuixosCapabilityLexer.modeNames; } public static readonly _serializedATN: number[] = [ - 4,0,147,1406,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, + 4,0,148,1418,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, @@ -284,498 +285,503 @@ export class QuixosCapabilityLexer extends antlr.Lexer { 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,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1, - 3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1, - 4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,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,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1, - 8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1, - 10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,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,13,1,13,1, - 13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1, - 14,1,14,1,15,1,15,1,15,1,15,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,17,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, - 18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1, - 20,1,20,1,20,1,20,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1, - 21,1,22,1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1, - 24,1,24,1,24,1,25,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,26,1,26,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,28,1,28,1,28,1,28,1,28,1,29,1,29,1,29,1,29,1, - 29,1,30,1,30,1,30,1,30,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,32,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,34,1,34,1, - 34,1,34,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,36,1, - 36,1,36,1,36,1,36,1,36,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,38,1,38,1,38,1,39,1,39,1,39,1,39,1,39,1,39,1, - 39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,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,42,1,42,1,42,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,44,1, - 44,1,44,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,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,46,1,47,1,47,1,47,1,47,1,47,1,47,1,48,1,48,1, - 48,1,48,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1, - 50,1,51,1,51,1,51,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,1,53,1,53,1,54,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,56,1,56,1,56,1,56,1,56,1,57,1,57,1, - 57,1,57,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,59,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60,1,60,1,60,1, - 60,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1, - 62,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, - 64,1,65,1,65,1,65,1,66,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,67,1,67,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,69,1,69,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,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,73,1,73,1,73,1,73,1, - 74,1,74,1,74,1,74,1,74,1,74,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, - 76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,77,1,77,1,77,1, - 78,1,78,1,78,1,78,1,79,1,79,1,79,1,79,1,79,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,81,1,81,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,84,1,84,1, - 84,1,84,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,87,1,88,1,88,1,88,1,88,1,88,1,89,1,89,1,89,1, - 89,1,89,1,90,1,90,1,90,1,90,1,90,1,90,1,91,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,93,1,93,1, - 93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,93,1,94,1,94,1,94,1,94,1, - 94,1,95,1,95,1,95,1,95,1,95,1,95,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,96,1,96,1,96,1,96,1,96,1,97,1,97,1, - 97,1,97,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,98,1,98,1,98,1,98,1,98,1,98,1,99,1,99,1,99,1,99,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,101,1,101,1,101,1,101,1,101,1,101,1,101,1,102,1,102, + 7,147,2,148,7,148,2,149,7,149,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1, + 2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1, + 4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,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,7,1,7,1,7,1,7,1,7,1,7,1, + 7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1, + 9,1,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,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,13,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14, + 1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,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,17,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,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20, + 1,20,1,20,1,20,1,20,1,20,1,20,1,21,1,21,1,21,1,21,1,21,1,21,1,21, + 1,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,23,1,24, + 1,24,1,24,1,24,1,24,1,24,1,25,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,26,1,26,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,28,1,28,1,28,1,28,1,28,1,29,1,29, + 1,29,1,29,1,29,1,30,1,30,1,30,1,30,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,32,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,34,1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,36,1,36, + 1,36,1,36,1,36,1,36,1,36,1,36,1,36,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,38,1,38,1,38,1,39,1,39,1,39,1,39, + 1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,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,42,1,42, + 1,42,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,44,1,44,1,44,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,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,46,1,47,1,47,1,47,1,47,1,47,1,47, + 1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,50,1,50, + 1,50,1,50,1,50,1,51,1,51,1,51,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,1,53,1,53,1,54,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,56,1,56,1,56,1,56,1,56, + 1,57,1,57,1,57,1,57,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,59,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60, + 1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,62, + 1,62,1,62,1,62,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,64,1,65,1,65,1,65,1,66,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,67,1,67,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,69,1,69, + 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,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,73,1,73, + 1,73,1,73,1,74,1,74,1,74,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,75,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,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77, + 1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,78,1,78,1,78,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,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,83,1,83,1,83,1,83,1,84,1,84,1,84,1,84,1,85,1,85,1,85, + 1,85,1,86,1,86,1,86,1,86,1,87,1,87,1,87,1,87,1,87,1,87,1,88,1,88, + 1,88,1,88,1,88,1,88,1,89,1,89,1,89,1,89,1,89,1,90,1,90,1,90,1,90, + 1,90,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,93,1,93,1,93,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,94,1,94,1,95,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,96,1,96,1,97, + 1,97,1,97,1,97,1,97,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,98,1,98,1,98,1,98,1,99,1,99,1,99,1,99,1,99,1,99, + 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,100,1,100,1,100,1,101,1,101,1,101,1,101,1,101,1,102,1,102,1,102, 1,102,1,102,1,102,1,102,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,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,106,1,106,1,106,1,106,1,106,1,107,1,107,1,107,1,107, - 1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,108,1,108, - 1,108,1,108,1,108,1,108,1,108,1,108,1,109,1,109,1,109,1,109,1,109, - 1,109,1,109,1,109,1,109,1,110,1,110,1,110,1,110,1,110,1,110,1,110, - 1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,111,1,111,1,111,1,111, - 1,111,1,111,1,111,1,111,1,111,1,112,1,112,1,112,1,112,1,112,1,113, - 1,113,1,113,1,113,1,113,1,113,1,113,1,114,1,114,1,114,1,114,1,114, - 1,115,1,115,1,115,1,115,1,115,1,115,1,116,1,116,1,116,1,116,1,116, - 1,116,1,116,1,117,1,117,1,117,1,117,1,117,1,117,1,118,1,118,1,118, - 1,118,1,118,1,118,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,120, - 1,120,1,120,1,120,1,120,1,120,1,120,1,121,1,121,1,121,1,121,1,121, - 1,121,1,121,1,122,1,122,1,122,1,122,1,122,1,123,1,123,1,123,1,123, - 1,123,1,123,1,124,1,124,1,124,1,124,1,124,1,125,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,3,140,1307,8,140,1,140,4,140, - 1310,8,140,11,140,12,140,1311,1,141,3,141,1315,8,141,1,141,1,141, - 1,141,5,141,1320,8,141,10,141,12,141,1323,9,141,3,141,1325,8,141, - 1,141,1,141,4,141,1329,8,141,11,141,12,141,1330,3,141,1333,8,141, - 1,141,1,141,3,141,1337,8,141,1,141,4,141,1340,8,141,11,141,12,141, - 1341,3,141,1344,8,141,1,142,1,142,5,142,1348,8,142,10,142,12,142, - 1351,9,142,1,143,1,143,1,143,5,143,1356,8,143,10,143,12,143,1359, - 9,143,1,143,1,143,1,144,1,144,1,144,1,144,1,144,1,144,1,144,1,144, - 3,144,1371,8,144,1,145,1,145,1,146,1,146,1,146,1,146,5,146,1379, - 8,146,10,146,12,146,1382,9,146,1,146,1,146,1,147,1,147,1,147,1,147, - 5,147,1390,8,147,10,147,12,147,1393,9,147,1,147,1,147,1,147,1,147, - 1,147,1,148,4,148,1401,8,148,11,148,12,148,1402,1,148,1,148,1,1391, - 0,149,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12, - 25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23, - 47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34, - 69,35,71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45, - 91,46,93,47,95,48,97,49,99,50,101,51,103,52,105,53,107,54,109,55, - 111,56,113,57,115,58,117,59,119,60,121,61,123,62,125,63,127,64,129, - 65,131,66,133,67,135,68,137,69,139,70,141,71,143,72,145,73,147,74, - 149,75,151,76,153,77,155,78,157,79,159,80,161,81,163,82,165,83,167, - 84,169,85,171,86,173,87,175,88,177,89,179,90,181,91,183,92,185,93, - 187,94,189,95,191,96,193,97,195,98,197,99,199,100,201,101,203,102, - 205,103,207,104,209,105,211,106,213,107,215,108,217,109,219,110, - 221,111,223,112,225,113,227,114,229,115,231,116,233,117,235,118, - 237,119,239,120,241,121,243,122,245,123,247,124,249,125,251,126, - 253,127,255,128,257,129,259,130,261,131,263,132,265,133,267,134, - 269,135,271,136,273,137,275,138,277,139,279,140,281,141,283,142, - 285,143,287,144,289,0,291,0,293,145,295,146,297,147,1,0,11,1,0,48, - 57,1,0,49,57,2,0,69,69,101,101,2,0,43,43,45,45,3,0,65,90,95,95,97, - 122,4,0,48,57,65,90,95,95,97,122,4,0,10,10,13,13,34,34,92,92,8,0, - 34,34,47,47,92,92,98,98,102,102,110,110,114,114,116,116,3,0,48,57, - 65,70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32,32,1420,0,1,1,0,0, - 0,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,229,1,0,0,0,0,231, - 1,0,0,0,0,233,1,0,0,0,0,235,1,0,0,0,0,237,1,0,0,0,0,239,1,0,0,0, - 0,241,1,0,0,0,0,243,1,0,0,0,0,245,1,0,0,0,0,247,1,0,0,0,0,249,1, - 0,0,0,0,251,1,0,0,0,0,253,1,0,0,0,0,255,1,0,0,0,0,257,1,0,0,0,0, - 259,1,0,0,0,0,261,1,0,0,0,0,263,1,0,0,0,0,265,1,0,0,0,0,267,1,0, - 0,0,0,269,1,0,0,0,0,271,1,0,0,0,0,273,1,0,0,0,0,275,1,0,0,0,0,277, - 1,0,0,0,0,279,1,0,0,0,0,281,1,0,0,0,0,283,1,0,0,0,0,285,1,0,0,0, - 0,287,1,0,0,0,0,293,1,0,0,0,0,295,1,0,0,0,0,297,1,0,0,0,1,299,1, - 0,0,0,3,304,1,0,0,0,5,313,1,0,0,0,7,324,1,0,0,0,9,334,1,0,0,0,11, - 344,1,0,0,0,13,353,1,0,0,0,15,365,1,0,0,0,17,372,1,0,0,0,19,380, - 1,0,0,0,21,389,1,0,0,0,23,397,1,0,0,0,25,403,1,0,0,0,27,408,1,0, - 0,0,29,421,1,0,0,0,31,431,1,0,0,0,33,443,1,0,0,0,35,449,1,0,0,0, - 37,460,1,0,0,0,39,471,1,0,0,0,41,476,1,0,0,0,43,485,1,0,0,0,45,495, - 1,0,0,0,47,500,1,0,0,0,49,504,1,0,0,0,51,510,1,0,0,0,53,515,1,0, - 0,0,55,525,1,0,0,0,57,529,1,0,0,0,59,542,1,0,0,0,61,547,1,0,0,0, - 63,554,1,0,0,0,65,563,1,0,0,0,67,574,1,0,0,0,69,578,1,0,0,0,71,587, - 1,0,0,0,73,594,1,0,0,0,75,603,1,0,0,0,77,608,1,0,0,0,79,618,1,0, - 0,0,81,629,1,0,0,0,83,637,1,0,0,0,85,643,1,0,0,0,87,652,1,0,0,0, - 89,662,1,0,0,0,91,671,1,0,0,0,93,683,1,0,0,0,95,694,1,0,0,0,97,700, - 1,0,0,0,99,708,1,0,0,0,101,711,1,0,0,0,103,716,1,0,0,0,105,723,1, - 0,0,0,107,726,1,0,0,0,109,734,1,0,0,0,111,741,1,0,0,0,113,747,1, - 0,0,0,115,752,1,0,0,0,117,763,1,0,0,0,119,768,1,0,0,0,121,774,1, - 0,0,0,123,781,1,0,0,0,125,785,1,0,0,0,127,797,1,0,0,0,129,800,1, - 0,0,0,131,807,1,0,0,0,133,810,1,0,0,0,135,817,1,0,0,0,137,825,1, - 0,0,0,139,832,1,0,0,0,141,843,1,0,0,0,143,850,1,0,0,0,145,859,1, - 0,0,0,147,874,1,0,0,0,149,884,1,0,0,0,151,897,1,0,0,0,153,903,1, - 0,0,0,155,920,1,0,0,0,157,923,1,0,0,0,159,927,1,0,0,0,161,932,1, - 0,0,0,163,938,1,0,0,0,165,947,1,0,0,0,167,956,1,0,0,0,169,960,1, - 0,0,0,171,964,1,0,0,0,173,968,1,0,0,0,175,974,1,0,0,0,177,980,1, - 0,0,0,179,985,1,0,0,0,181,990,1,0,0,0,183,996,1,0,0,0,185,1004,1, - 0,0,0,187,1012,1,0,0,0,189,1023,1,0,0,0,191,1028,1,0,0,0,193,1040, - 1,0,0,0,195,1051,1,0,0,0,197,1061,1,0,0,0,199,1073,1,0,0,0,201,1082, - 1,0,0,0,203,1087,1,0,0,0,205,1100,1,0,0,0,207,1112,1,0,0,0,209,1124, - 1,0,0,0,211,1129,1,0,0,0,213,1137,1,0,0,0,215,1142,1,0,0,0,217,1155, - 1,0,0,0,219,1163,1,0,0,0,221,1172,1,0,0,0,223,1186,1,0,0,0,225,1195, - 1,0,0,0,227,1200,1,0,0,0,229,1207,1,0,0,0,231,1212,1,0,0,0,233,1218, - 1,0,0,0,235,1225,1,0,0,0,237,1231,1,0,0,0,239,1237,1,0,0,0,241,1244, - 1,0,0,0,243,1251,1,0,0,0,245,1258,1,0,0,0,247,1263,1,0,0,0,249,1269, - 1,0,0,0,251,1274,1,0,0,0,253,1277,1,0,0,0,255,1279,1,0,0,0,257,1281, - 1,0,0,0,259,1283,1,0,0,0,261,1285,1,0,0,0,263,1287,1,0,0,0,265,1289, - 1,0,0,0,267,1291,1,0,0,0,269,1293,1,0,0,0,271,1295,1,0,0,0,273,1297, - 1,0,0,0,275,1299,1,0,0,0,277,1301,1,0,0,0,279,1303,1,0,0,0,281,1306, - 1,0,0,0,283,1314,1,0,0,0,285,1345,1,0,0,0,287,1352,1,0,0,0,289,1362, - 1,0,0,0,291,1372,1,0,0,0,293,1374,1,0,0,0,295,1385,1,0,0,0,297,1400, - 1,0,0,0,299,300,5,101,0,0,300,301,5,100,0,0,301,302,5,105,0,0,302, - 303,5,116,0,0,303,2,1,0,0,0,304,305,5,99,0,0,305,306,5,114,0,0,306, - 307,5,101,0,0,307,308,5,97,0,0,308,309,5,116,0,0,309,310,5,105,0, - 0,310,311,5,111,0,0,311,312,5,110,0,0,312,4,1,0,0,0,313,314,5,105, - 0,0,314,315,5,110,0,0,315,316,5,105,0,0,316,317,5,116,0,0,317,318, - 5,105,0,0,318,319,5,97,0,0,319,320,5,108,0,0,320,321,5,105,0,0,321, - 322,5,122,0,0,322,323,5,101,0,0,323,6,1,0,0,0,324,325,5,119,0,0, - 325,326,5,111,0,0,326,327,5,114,0,0,327,328,5,107,0,0,328,329,5, - 115,0,0,329,330,5,112,0,0,330,331,5,97,0,0,331,332,5,99,0,0,332, - 333,5,101,0,0,333,8,1,0,0,0,334,335,5,101,0,0,335,336,5,120,0,0, - 336,337,5,101,0,0,337,338,5,99,0,0,338,339,5,117,0,0,339,340,5,116, - 0,0,340,341,5,105,0,0,341,342,5,111,0,0,342,343,5,110,0,0,343,10, - 1,0,0,0,344,345,5,115,0,0,345,346,5,110,0,0,346,347,5,97,0,0,347, - 348,5,112,0,0,348,349,5,115,0,0,349,350,5,104,0,0,350,351,5,111, - 0,0,351,352,5,116,0,0,352,12,1,0,0,0,353,354,5,116,0,0,354,355,5, - 114,0,0,355,356,5,97,0,0,356,357,5,110,0,0,357,358,5,115,0,0,358, - 359,5,97,0,0,359,360,5,99,0,0,360,361,5,116,0,0,361,362,5,105,0, - 0,362,363,5,111,0,0,363,364,5,110,0,0,364,14,1,0,0,0,365,366,5,114, - 0,0,366,367,5,101,0,0,367,368,5,109,0,0,368,369,5,111,0,0,369,370, - 5,116,0,0,370,371,5,101,0,0,371,16,1,0,0,0,372,373,5,116,0,0,373, - 374,5,97,0,0,374,375,5,114,0,0,375,376,5,103,0,0,376,377,5,101,0, - 0,377,378,5,116,0,0,378,379,5,115,0,0,379,18,1,0,0,0,380,381,5,112, - 0,0,381,382,5,111,0,0,382,383,5,114,0,0,383,384,5,116,0,0,384,385, - 5,97,0,0,385,386,5,98,0,0,386,387,5,108,0,0,387,388,5,101,0,0,388, - 20,1,0,0,0,389,390,5,114,0,0,390,391,5,101,0,0,391,392,5,112,0,0, - 392,393,5,108,0,0,393,394,5,105,0,0,394,395,5,99,0,0,395,396,5,97, - 0,0,396,22,1,0,0,0,397,398,5,108,0,0,398,399,5,111,0,0,399,400,5, - 99,0,0,400,401,5,97,0,0,401,402,5,108,0,0,402,24,1,0,0,0,403,404, - 5,102,0,0,404,405,5,114,0,0,405,406,5,111,0,0,406,407,5,109,0,0, - 407,26,1,0,0,0,408,409,5,114,0,0,409,410,5,101,0,0,410,411,5,115, - 0,0,411,412,5,117,0,0,412,413,5,108,0,0,413,414,5,116,0,0,414,415, - 5,45,0,0,415,416,5,98,0,0,416,417,5,121,0,0,417,418,5,116,0,0,418, - 419,5,101,0,0,419,420,5,115,0,0,420,28,1,0,0,0,421,422,5,114,0,0, - 422,423,5,112,0,0,423,424,5,99,0,0,424,425,5,45,0,0,425,426,5,99, - 0,0,426,427,5,97,0,0,427,428,5,108,0,0,428,429,5,108,0,0,429,430, - 5,115,0,0,430,30,1,0,0,0,431,432,5,100,0,0,432,433,5,101,0,0,433, - 434,5,97,0,0,434,435,5,100,0,0,435,436,5,108,0,0,436,437,5,105,0, - 0,437,438,5,110,0,0,438,439,5,101,0,0,439,440,5,45,0,0,440,441,5, - 109,0,0,441,442,5,115,0,0,442,32,1,0,0,0,443,444,5,113,0,0,444,445, - 5,117,0,0,445,446,5,101,0,0,446,447,5,114,0,0,447,448,5,121,0,0, - 448,34,1,0,0,0,449,450,5,114,0,0,450,451,5,101,0,0,451,452,5,102, - 0,0,452,453,5,108,0,0,453,454,5,101,0,0,454,455,5,99,0,0,455,456, - 5,116,0,0,456,457,5,105,0,0,457,458,5,111,0,0,458,459,5,110,0,0, - 459,36,1,0,0,0,460,461,5,115,0,0,461,462,5,112,0,0,462,463,5,101, - 0,0,463,464,5,99,0,0,464,465,5,105,0,0,465,466,5,97,0,0,466,467, - 5,108,0,0,467,468,5,105,0,0,468,469,5,122,0,0,469,470,5,101,0,0, - 470,38,1,0,0,0,471,472,5,114,0,0,472,473,5,111,0,0,473,474,5,111, - 0,0,474,475,5,116,0,0,475,40,1,0,0,0,476,477,5,100,0,0,477,478,5, - 111,0,0,478,479,5,99,0,0,479,480,5,117,0,0,480,481,5,109,0,0,481, - 482,5,101,0,0,482,483,5,110,0,0,483,484,5,116,0,0,484,42,1,0,0,0, - 485,486,5,102,0,0,486,487,5,114,0,0,487,488,5,97,0,0,488,489,5,103, - 0,0,489,490,5,109,0,0,490,491,5,101,0,0,491,492,5,110,0,0,492,493, - 5,116,0,0,493,494,5,115,0,0,494,44,1,0,0,0,495,496,5,118,0,0,496, - 497,5,105,0,0,497,498,5,101,0,0,498,499,5,119,0,0,499,46,1,0,0,0, - 500,501,5,109,0,0,501,502,5,97,0,0,502,503,5,120,0,0,503,48,1,0, - 0,0,504,505,5,97,0,0,505,506,5,108,0,0,506,507,5,108,0,0,507,508, - 5,111,0,0,508,509,5,119,0,0,509,50,1,0,0,0,510,511,5,112,0,0,511, - 512,5,111,0,0,512,513,5,108,0,0,513,514,5,108,0,0,514,52,1,0,0,0, - 515,516,5,113,0,0,516,517,5,117,0,0,517,518,5,101,0,0,518,519,5, - 114,0,0,519,520,5,121,0,0,520,521,5,97,0,0,521,522,5,98,0,0,522, - 523,5,108,0,0,523,524,5,101,0,0,524,54,1,0,0,0,525,526,5,114,0,0, - 526,527,5,112,0,0,527,528,5,99,0,0,528,56,1,0,0,0,529,530,5,113, - 0,0,530,531,5,117,0,0,531,532,5,101,0,0,532,533,5,114,0,0,533,534, - 5,121,0,0,534,535,5,45,0,0,535,536,5,114,0,0,536,537,5,101,0,0,537, - 538,5,97,0,0,538,539,5,115,0,0,539,540,5,111,0,0,540,541,5,110,0, - 0,541,58,1,0,0,0,542,543,5,116,0,0,543,544,5,121,0,0,544,545,5,112, - 0,0,545,546,5,101,0,0,546,60,1,0,0,0,547,548,5,111,0,0,548,549,5, - 98,0,0,549,550,5,106,0,0,550,551,5,101,0,0,551,552,5,99,0,0,552, - 553,5,116,0,0,553,62,1,0,0,0,554,555,5,115,0,0,555,556,5,116,0,0, - 556,557,5,111,0,0,557,558,5,114,0,0,558,559,5,97,0,0,559,560,5,98, - 0,0,560,561,5,108,0,0,561,562,5,101,0,0,562,64,1,0,0,0,563,564,5, - 105,0,0,564,565,5,109,0,0,565,566,5,112,0,0,566,567,5,108,0,0,567, - 568,5,101,0,0,568,569,5,109,0,0,569,570,5,101,0,0,570,571,5,110, - 0,0,571,572,5,116,0,0,572,573,5,115,0,0,573,66,1,0,0,0,574,575,5, - 114,0,0,575,576,5,101,0,0,576,577,5,102,0,0,577,68,1,0,0,0,578,579, - 5,102,0,0,579,580,5,114,0,0,580,581,5,97,0,0,581,582,5,103,0,0,582, - 583,5,109,0,0,583,584,5,101,0,0,584,585,5,110,0,0,585,586,5,116, - 0,0,586,70,1,0,0,0,587,588,5,105,0,0,588,589,5,109,0,0,589,590,5, - 112,0,0,590,591,5,111,0,0,591,592,5,114,0,0,592,593,5,116,0,0,593, - 72,1,0,0,0,594,595,5,101,0,0,595,596,5,120,0,0,596,597,5,116,0,0, - 597,598,5,101,0,0,598,599,5,114,0,0,599,600,5,110,0,0,600,601,5, - 97,0,0,601,602,5,108,0,0,602,74,1,0,0,0,603,604,5,97,0,0,604,605, - 5,116,0,0,605,606,5,111,0,0,606,607,5,109,0,0,607,76,1,0,0,0,608, - 609,5,105,0,0,609,610,5,110,0,0,610,611,5,116,0,0,611,612,5,101, - 0,0,612,613,5,114,0,0,613,614,5,102,0,0,614,615,5,97,0,0,615,616, - 5,99,0,0,616,617,5,101,0,0,617,78,1,0,0,0,618,619,5,105,0,0,619, - 620,5,110,0,0,620,621,5,116,0,0,621,622,5,101,0,0,622,623,5,114, - 0,0,623,624,5,102,0,0,624,625,5,97,0,0,625,626,5,99,0,0,626,627, - 5,101,0,0,627,628,5,115,0,0,628,80,1,0,0,0,629,630,5,112,0,0,630, - 631,5,97,0,0,631,632,5,99,0,0,632,633,5,107,0,0,633,634,5,97,0,0, - 634,635,5,103,0,0,635,636,5,101,0,0,636,82,1,0,0,0,637,638,5,118, - 0,0,638,639,5,97,0,0,639,640,5,108,0,0,640,641,5,117,0,0,641,642, - 5,101,0,0,642,84,1,0,0,0,643,644,5,114,0,0,644,645,5,101,0,0,645, - 646,5,108,0,0,646,647,5,97,0,0,647,648,5,116,0,0,648,649,5,105,0, - 0,649,650,5,111,0,0,650,651,5,110,0,0,651,86,1,0,0,0,652,653,5,111, - 0,0,653,654,5,112,0,0,654,655,5,101,0,0,655,656,5,114,0,0,656,657, - 5,97,0,0,657,658,5,116,0,0,658,659,5,105,0,0,659,660,5,111,0,0,660, - 661,5,110,0,0,661,88,1,0,0,0,662,663,5,102,0,0,663,664,5,117,0,0, - 664,665,5,110,0,0,665,666,5,99,0,0,666,667,5,116,0,0,667,668,5,105, - 0,0,668,669,5,111,0,0,669,670,5,110,0,0,670,90,1,0,0,0,671,672,5, - 99,0,0,672,673,5,111,0,0,673,674,5,110,0,0,674,675,5,115,0,0,675, - 676,5,116,0,0,676,677,5,114,0,0,677,678,5,117,0,0,678,679,5,99,0, - 0,679,680,5,116,0,0,680,681,5,111,0,0,681,682,5,114,0,0,682,92,1, - 0,0,0,683,684,5,99,0,0,684,685,5,111,0,0,685,686,5,110,0,0,686,687, - 5,115,0,0,687,688,5,116,0,0,688,689,5,114,0,0,689,690,5,117,0,0, - 690,691,5,99,0,0,691,692,5,116,0,0,692,693,5,115,0,0,693,94,1,0, - 0,0,694,695,5,105,0,0,695,696,5,110,0,0,696,697,5,112,0,0,697,698, - 5,117,0,0,698,699,5,116,0,0,699,96,1,0,0,0,700,701,5,99,0,0,701, - 702,5,111,0,0,702,703,5,110,0,0,703,704,5,102,0,0,704,705,5,111, - 0,0,705,706,5,114,0,0,706,707,5,109,0,0,707,98,1,0,0,0,708,709,5, - 97,0,0,709,710,5,115,0,0,710,100,1,0,0,0,711,712,5,98,0,0,712,713, - 5,105,0,0,713,714,5,110,0,0,714,715,5,100,0,0,715,102,1,0,0,0,716, - 717,5,115,0,0,717,718,5,116,0,0,718,719,5,97,0,0,719,720,5,116,0, - 0,720,721,5,105,0,0,721,722,5,99,0,0,722,104,1,0,0,0,723,724,5,116, - 0,0,724,725,5,111,0,0,725,106,1,0,0,0,726,727,5,112,0,0,727,728, - 5,114,0,0,728,729,5,105,0,0,729,730,5,118,0,0,730,731,5,97,0,0,731, - 732,5,116,0,0,732,733,5,101,0,0,733,108,1,0,0,0,734,735,5,115,0, - 0,735,736,5,104,0,0,736,737,5,97,0,0,737,738,5,114,0,0,738,739,5, - 101,0,0,739,740,5,100,0,0,740,110,1,0,0,0,741,742,5,115,0,0,742, - 743,5,116,0,0,743,744,5,97,0,0,744,745,5,116,0,0,745,746,5,101,0, - 0,746,112,1,0,0,0,747,748,5,101,0,0,748,749,5,100,0,0,749,750,5, - 103,0,0,750,751,5,101,0,0,751,114,1,0,0,0,752,753,5,112,0,0,753, - 754,5,114,0,0,754,755,5,111,0,0,755,756,5,106,0,0,756,757,5,101, - 0,0,757,758,5,99,0,0,758,759,5,116,0,0,759,760,5,105,0,0,760,761, - 5,111,0,0,761,762,5,110,0,0,762,116,1,0,0,0,763,764,5,119,0,0,764, - 765,5,105,0,0,765,766,5,116,0,0,766,767,5,104,0,0,767,118,1,0,0, - 0,768,769,5,117,0,0,769,770,5,115,0,0,770,771,5,105,0,0,771,772, - 5,110,0,0,772,773,5,103,0,0,773,120,1,0,0,0,774,775,5,97,0,0,775, - 776,5,99,0,0,776,777,5,99,0,0,777,778,5,101,0,0,778,779,5,112,0, - 0,779,780,5,116,0,0,780,122,1,0,0,0,781,782,5,118,0,0,782,783,5, - 105,0,0,783,784,5,97,0,0,784,124,1,0,0,0,785,786,5,109,0,0,786,787, - 5,97,0,0,787,788,5,116,0,0,788,789,5,101,0,0,789,790,5,114,0,0,790, - 791,5,105,0,0,791,792,5,97,0,0,792,793,5,108,0,0,793,794,5,105,0, - 0,794,795,5,122,0,0,795,796,5,101,0,0,796,126,1,0,0,0,797,798,5, - 105,0,0,798,799,5,102,0,0,799,128,1,0,0,0,800,801,5,97,0,0,801,802, - 5,98,0,0,802,803,5,115,0,0,803,804,5,101,0,0,804,805,5,110,0,0,805, - 806,5,116,0,0,806,130,1,0,0,0,807,808,5,111,0,0,808,809,5,110,0, - 0,809,132,1,0,0,0,810,811,5,112,0,0,811,812,5,111,0,0,812,813,5, - 108,0,0,813,814,5,105,0,0,814,815,5,99,0,0,815,816,5,121,0,0,816, - 134,1,0,0,0,817,818,5,100,0,0,818,819,5,101,0,0,819,820,5,102,0, - 0,820,821,5,97,0,0,821,822,5,117,0,0,822,823,5,108,0,0,823,824,5, - 116,0,0,824,136,1,0,0,0,825,826,5,115,0,0,826,827,5,111,0,0,827, - 828,5,117,0,0,828,829,5,114,0,0,829,830,5,99,0,0,830,831,5,101,0, - 0,831,138,1,0,0,0,832,833,5,114,0,0,833,834,5,101,0,0,834,835,5, - 112,0,0,835,836,5,111,0,0,836,837,5,115,0,0,837,838,5,105,0,0,838, - 839,5,116,0,0,839,840,5,111,0,0,840,841,5,114,0,0,841,842,5,121, - 0,0,842,140,1,0,0,0,843,844,5,99,0,0,844,845,5,111,0,0,845,846,5, - 109,0,0,846,847,5,109,0,0,847,848,5,105,0,0,848,849,5,116,0,0,849, - 142,1,0,0,0,850,851,5,114,0,0,851,852,5,101,0,0,852,853,5,118,0, - 0,853,854,5,105,0,0,854,855,5,115,0,0,855,856,5,105,0,0,856,857, - 5,111,0,0,857,858,5,110,0,0,858,144,1,0,0,0,859,860,5,115,0,0,860, - 861,5,101,0,0,861,862,5,109,0,0,862,863,5,97,0,0,863,864,5,110,0, - 0,864,865,5,116,0,0,865,866,5,105,0,0,866,867,5,99,0,0,867,868,5, - 45,0,0,868,869,5,109,0,0,869,870,5,97,0,0,870,871,5,106,0,0,871, - 872,5,111,0,0,872,873,5,114,0,0,873,146,1,0,0,0,874,875,5,111,0, - 0,875,876,5,110,0,0,876,877,5,45,0,0,877,878,5,100,0,0,878,879,5, - 101,0,0,879,880,5,108,0,0,880,881,5,101,0,0,881,882,5,116,0,0,882, - 883,5,101,0,0,883,148,1,0,0,0,884,885,5,114,0,0,885,886,5,101,0, - 0,886,887,5,116,0,0,887,888,5,97,0,0,888,889,5,105,0,0,889,890,5, - 110,0,0,890,891,5,45,0,0,891,892,5,111,0,0,892,893,5,116,0,0,893, - 894,5,104,0,0,894,895,5,101,0,0,895,896,5,114,0,0,896,150,1,0,0, - 0,897,898,5,107,0,0,898,899,5,101,0,0,899,900,5,121,0,0,900,901, - 5,101,0,0,901,902,5,100,0,0,902,152,1,0,0,0,903,904,5,112,0,0,904, - 905,5,117,0,0,905,906,5,98,0,0,906,907,5,108,0,0,907,908,5,105,0, - 0,908,909,5,99,0,0,909,910,5,45,0,0,910,911,5,116,0,0,911,912,5, - 114,0,0,912,913,5,97,0,0,913,914,5,118,0,0,914,915,5,101,0,0,915, - 916,5,114,0,0,916,917,5,115,0,0,917,918,5,97,0,0,918,919,5,108,0, - 0,919,154,1,0,0,0,920,921,5,105,0,0,921,922,5,100,0,0,922,156,1, - 0,0,0,923,924,5,100,0,0,924,925,5,111,0,0,925,926,5,99,0,0,926,158, - 1,0,0,0,927,928,5,109,0,0,928,929,5,111,0,0,929,930,5,100,0,0,930, - 931,5,101,0,0,931,160,1,0,0,0,932,933,5,101,0,0,933,934,5,109,0, - 0,934,935,5,105,0,0,935,936,5,116,0,0,936,937,5,115,0,0,937,162, - 1,0,0,0,938,939,5,114,0,0,939,940,5,101,0,0,940,941,5,99,0,0,941, - 942,5,101,0,0,942,943,5,105,0,0,943,944,5,118,0,0,944,945,5,101, - 0,0,945,946,5,114,0,0,946,164,1,0,0,0,947,948,5,114,0,0,948,949, - 5,101,0,0,949,950,5,113,0,0,950,951,5,117,0,0,951,952,5,105,0,0, - 952,953,5,114,0,0,953,954,5,101,0,0,954,955,5,115,0,0,955,166,1, - 0,0,0,956,957,5,97,0,0,957,958,5,110,0,0,958,959,5,121,0,0,959,168, - 1,0,0,0,960,961,5,103,0,0,961,962,5,101,0,0,962,963,5,116,0,0,963, - 170,1,0,0,0,964,965,5,115,0,0,965,966,5,101,0,0,966,967,5,116,0, - 0,967,172,1,0,0,0,968,969,5,119,0,0,969,970,5,97,0,0,970,971,5,116, - 0,0,971,972,5,99,0,0,972,973,5,104,0,0,973,174,1,0,0,0,974,975,5, - 115,0,0,975,976,5,116,0,0,976,977,5,97,0,0,977,978,5,114,0,0,978, - 979,5,116,0,0,979,176,1,0,0,0,980,981,5,115,0,0,981,982,5,116,0, - 0,982,983,5,111,0,0,983,984,5,112,0,0,984,178,1,0,0,0,985,986,5, - 114,0,0,986,987,5,101,0,0,987,988,5,97,0,0,988,989,5,100,0,0,989, - 180,1,0,0,0,990,991,5,119,0,0,991,992,5,114,0,0,992,993,5,105,0, - 0,993,994,5,116,0,0,994,995,5,101,0,0,995,182,1,0,0,0,996,997,5, - 114,0,0,997,998,5,101,0,0,998,999,5,115,0,0,999,1000,5,111,0,0,1000, - 1001,5,108,0,0,1001,1002,5,118,0,0,1002,1003,5,101,0,0,1003,184, - 1,0,0,0,1004,1005,5,99,0,0,1005,1006,5,111,0,0,1006,1007,5,110,0, - 0,1007,1008,5,110,0,0,1008,1009,5,101,0,0,1009,1010,5,99,0,0,1010, - 1011,5,116,0,0,1011,186,1,0,0,0,1012,1013,5,100,0,0,1013,1014,5, - 105,0,0,1014,1015,5,115,0,0,1015,1016,5,99,0,0,1016,1017,5,111,0, - 0,1017,1018,5,110,0,0,1018,1019,5,110,0,0,1019,1020,5,101,0,0,1020, - 1021,5,99,0,0,1021,1022,5,116,0,0,1022,188,1,0,0,0,1023,1024,5,99, - 0,0,1024,1025,5,97,0,0,1025,1026,5,108,0,0,1026,1027,5,108,0,0,1027, - 190,1,0,0,0,1028,1029,5,119,0,0,1029,1030,5,97,0,0,1030,1031,5,116, - 0,0,1031,1032,5,99,0,0,1032,1033,5,104,0,0,1033,1034,5,45,0,0,1034, - 1035,5,115,0,0,1035,1036,5,116,0,0,1036,1037,5,97,0,0,1037,1038, - 5,114,0,0,1038,1039,5,116,0,0,1039,192,1,0,0,0,1040,1041,5,119,0, - 0,1041,1042,5,97,0,0,1042,1043,5,116,0,0,1043,1044,5,99,0,0,1044, - 1045,5,104,0,0,1045,1046,5,45,0,0,1046,1047,5,115,0,0,1047,1048, - 5,116,0,0,1048,1049,5,111,0,0,1049,1050,5,112,0,0,1050,194,1,0,0, - 0,1051,1052,5,115,0,0,1052,1053,5,117,0,0,1053,1054,5,98,0,0,1054, - 1055,5,115,0,0,1055,1056,5,99,0,0,1056,1057,5,114,0,0,1057,1058, - 5,105,0,0,1058,1059,5,98,0,0,1059,1060,5,101,0,0,1060,196,1,0,0, - 0,1061,1062,5,117,0,0,1062,1063,5,110,0,0,1063,1064,5,115,0,0,1064, - 1065,5,117,0,0,1065,1066,5,98,0,0,1066,1067,5,115,0,0,1067,1068, - 5,99,0,0,1068,1069,5,114,0,0,1069,1070,5,105,0,0,1070,1071,5,98, - 0,0,1071,1072,5,101,0,0,1072,198,1,0,0,0,1073,1074,5,114,0,0,1074, - 1075,5,101,0,0,1075,1076,5,103,0,0,1076,1077,5,105,0,0,1077,1078, - 5,115,0,0,1078,1079,5,116,0,0,1079,1080,5,101,0,0,1080,1081,5,114, - 0,0,1081,200,1,0,0,0,1082,1083,5,99,0,0,1083,1084,5,114,0,0,1084, - 1085,5,100,0,0,1085,1086,5,116,0,0,1086,202,1,0,0,0,1087,1088,5, - 111,0,0,1088,1089,5,112,0,0,1089,1090,5,116,0,0,1090,1091,5,105, - 0,0,1091,1092,5,111,0,0,1092,1093,5,110,0,0,1093,1094,5,97,0,0,1094, - 1095,5,108,0,0,1095,1096,5,45,0,0,1096,1097,5,111,0,0,1097,1098, - 5,110,0,0,1098,1099,5,101,0,0,1099,204,1,0,0,0,1100,1101,5,101,0, - 0,1101,1102,5,120,0,0,1102,1103,5,97,0,0,1103,1104,5,99,0,0,1104, - 1105,5,116,0,0,1105,1106,5,108,0,0,1106,1107,5,121,0,0,1107,1108, - 5,45,0,0,1108,1109,5,111,0,0,1109,1110,5,110,0,0,1110,1111,5,101, - 0,0,1111,206,1,0,0,0,1112,1113,5,109,0,0,1113,1114,5,97,0,0,1114, - 1115,5,110,0,0,1115,1116,5,121,0,0,1116,1117,5,45,0,0,1117,1118, - 5,117,0,0,1118,1119,5,110,0,0,1119,1120,5,105,0,0,1120,1121,5,113, - 0,0,1121,1122,5,117,0,0,1122,1123,5,101,0,0,1123,208,1,0,0,0,1124, - 1125,5,109,0,0,1125,1126,5,97,0,0,1126,1127,5,110,0,0,1127,1128, - 5,121,0,0,1128,210,1,0,0,0,1129,1130,5,111,0,0,1130,1131,5,114,0, - 0,1131,1132,5,100,0,0,1132,1133,5,101,0,0,1133,1134,5,114,0,0,1134, - 1135,5,101,0,0,1135,1136,5,100,0,0,1136,212,1,0,0,0,1137,1138,5, - 117,0,0,1138,1139,5,110,0,0,1139,1140,5,105,0,0,1140,1141,5,116, - 0,0,1141,214,1,0,0,0,1142,1143,5,119,0,0,1143,1144,5,97,0,0,1144, - 1145,5,116,0,0,1145,1146,5,99,0,0,1146,1147,5,104,0,0,1147,1148, - 5,45,0,0,1148,1149,5,104,0,0,1149,1150,5,97,0,0,1150,1151,5,110, - 0,0,1151,1152,5,100,0,0,1152,1153,5,108,0,0,1153,1154,5,101,0,0, - 1154,216,1,0,0,0,1155,1156,5,109,0,0,1156,1157,5,101,0,0,1157,1158, - 5,115,0,0,1158,1159,5,115,0,0,1159,1160,5,97,0,0,1160,1161,5,103, - 0,0,1161,1162,5,101,0,0,1162,218,1,0,0,0,1163,1164,5,97,0,0,1164, - 1165,5,116,0,0,1165,1166,5,111,0,0,1166,1167,5,109,0,0,1167,1168, - 5,45,0,0,1168,1169,5,114,0,0,1169,1170,5,101,0,0,1170,1171,5,102, - 0,0,1171,220,1,0,0,0,1172,1173,5,105,0,0,1173,1174,5,110,0,0,1174, - 1175,5,116,0,0,1175,1176,5,101,0,0,1176,1177,5,114,0,0,1177,1178, - 5,102,0,0,1178,1179,5,97,0,0,1179,1180,5,99,0,0,1180,1181,5,101, - 0,0,1181,1182,5,45,0,0,1182,1183,5,114,0,0,1183,1184,5,101,0,0,1184, - 1185,5,102,0,0,1185,222,1,0,0,0,1186,1187,5,111,0,0,1187,1188,5, - 112,0,0,1188,1189,5,116,0,0,1189,1190,5,105,0,0,1190,1191,5,111, - 0,0,1191,1192,5,110,0,0,1192,1193,5,97,0,0,1193,1194,5,108,0,0,1194, - 224,1,0,0,0,1195,1196,5,108,0,0,1196,1197,5,105,0,0,1197,1198,5, - 115,0,0,1198,1199,5,116,0,0,1199,226,1,0,0,0,1200,1201,5,114,0,0, - 1201,1202,5,101,0,0,1202,1203,5,99,0,0,1203,1204,5,111,0,0,1204, - 1205,5,114,0,0,1205,1206,5,100,0,0,1206,228,1,0,0,0,1207,1208,5, - 98,0,0,1208,1209,5,111,0,0,1209,1210,5,111,0,0,1210,1211,5,108,0, - 0,1211,230,1,0,0,0,1212,1213,5,98,0,0,1213,1214,5,121,0,0,1214,1215, - 5,116,0,0,1215,1216,5,101,0,0,1216,1217,5,115,0,0,1217,232,1,0,0, - 0,1218,1219,5,100,0,0,1219,1220,5,111,0,0,1220,1221,5,117,0,0,1221, - 1222,5,98,0,0,1222,1223,5,108,0,0,1223,1224,5,101,0,0,1224,234,1, - 0,0,0,1225,1226,5,105,0,0,1226,1227,5,110,0,0,1227,1228,5,116,0, - 0,1228,1229,5,51,0,0,1229,1230,5,50,0,0,1230,236,1,0,0,0,1231,1232, - 5,105,0,0,1232,1233,5,110,0,0,1233,1234,5,116,0,0,1234,1235,5,54, - 0,0,1235,1236,5,52,0,0,1236,238,1,0,0,0,1237,1238,5,115,0,0,1238, - 1239,5,116,0,0,1239,1240,5,114,0,0,1240,1241,5,105,0,0,1241,1242, - 5,110,0,0,1242,1243,5,103,0,0,1243,240,1,0,0,0,1244,1245,5,117,0, - 0,1245,1246,5,105,0,0,1246,1247,5,110,0,0,1247,1248,5,116,0,0,1248, - 1249,5,51,0,0,1249,1250,5,50,0,0,1250,242,1,0,0,0,1251,1252,5,117, - 0,0,1252,1253,5,105,0,0,1253,1254,5,110,0,0,1254,1255,5,116,0,0, - 1255,1256,5,54,0,0,1256,1257,5,52,0,0,1257,244,1,0,0,0,1258,1259, - 5,116,0,0,1259,1260,5,114,0,0,1260,1261,5,117,0,0,1261,1262,5,101, - 0,0,1262,246,1,0,0,0,1263,1264,5,102,0,0,1264,1265,5,97,0,0,1265, - 1266,5,108,0,0,1266,1267,5,115,0,0,1267,1268,5,101,0,0,1268,248, - 1,0,0,0,1269,1270,5,110,0,0,1270,1271,5,117,0,0,1271,1272,5,108, - 0,0,1272,1273,5,108,0,0,1273,250,1,0,0,0,1274,1275,5,45,0,0,1275, - 1276,5,62,0,0,1276,252,1,0,0,0,1277,1278,5,58,0,0,1278,254,1,0,0, - 0,1279,1280,5,59,0,0,1280,256,1,0,0,0,1281,1282,5,44,0,0,1282,258, - 1,0,0,0,1283,1284,5,46,0,0,1284,260,1,0,0,0,1285,1286,5,123,0,0, - 1286,262,1,0,0,0,1287,1288,5,125,0,0,1288,264,1,0,0,0,1289,1290, - 5,91,0,0,1290,266,1,0,0,0,1291,1292,5,93,0,0,1292,268,1,0,0,0,1293, - 1294,5,40,0,0,1294,270,1,0,0,0,1295,1296,5,41,0,0,1296,272,1,0,0, - 0,1297,1298,5,60,0,0,1298,274,1,0,0,0,1299,1300,5,62,0,0,1300,276, - 1,0,0,0,1301,1302,5,38,0,0,1302,278,1,0,0,0,1303,1304,5,61,0,0,1304, - 280,1,0,0,0,1305,1307,5,45,0,0,1306,1305,1,0,0,0,1306,1307,1,0,0, - 0,1307,1309,1,0,0,0,1308,1310,7,0,0,0,1309,1308,1,0,0,0,1310,1311, - 1,0,0,0,1311,1309,1,0,0,0,1311,1312,1,0,0,0,1312,282,1,0,0,0,1313, - 1315,5,45,0,0,1314,1313,1,0,0,0,1314,1315,1,0,0,0,1315,1324,1,0, - 0,0,1316,1325,5,48,0,0,1317,1321,7,1,0,0,1318,1320,7,0,0,0,1319, - 1318,1,0,0,0,1320,1323,1,0,0,0,1321,1319,1,0,0,0,1321,1322,1,0,0, - 0,1322,1325,1,0,0,0,1323,1321,1,0,0,0,1324,1316,1,0,0,0,1324,1317, - 1,0,0,0,1325,1332,1,0,0,0,1326,1328,5,46,0,0,1327,1329,7,0,0,0,1328, - 1327,1,0,0,0,1329,1330,1,0,0,0,1330,1328,1,0,0,0,1330,1331,1,0,0, - 0,1331,1333,1,0,0,0,1332,1326,1,0,0,0,1332,1333,1,0,0,0,1333,1343, - 1,0,0,0,1334,1336,7,2,0,0,1335,1337,7,3,0,0,1336,1335,1,0,0,0,1336, - 1337,1,0,0,0,1337,1339,1,0,0,0,1338,1340,7,0,0,0,1339,1338,1,0,0, - 0,1340,1341,1,0,0,0,1341,1339,1,0,0,0,1341,1342,1,0,0,0,1342,1344, - 1,0,0,0,1343,1334,1,0,0,0,1343,1344,1,0,0,0,1344,284,1,0,0,0,1345, - 1349,7,4,0,0,1346,1348,7,5,0,0,1347,1346,1,0,0,0,1348,1351,1,0,0, - 0,1349,1347,1,0,0,0,1349,1350,1,0,0,0,1350,286,1,0,0,0,1351,1349, - 1,0,0,0,1352,1357,5,34,0,0,1353,1356,3,289,144,0,1354,1356,8,6,0, - 0,1355,1353,1,0,0,0,1355,1354,1,0,0,0,1356,1359,1,0,0,0,1357,1355, - 1,0,0,0,1357,1358,1,0,0,0,1358,1360,1,0,0,0,1359,1357,1,0,0,0,1360, - 1361,5,34,0,0,1361,288,1,0,0,0,1362,1370,5,92,0,0,1363,1371,7,7, - 0,0,1364,1365,5,117,0,0,1365,1366,3,291,145,0,1366,1367,3,291,145, - 0,1367,1368,3,291,145,0,1368,1369,3,291,145,0,1369,1371,1,0,0,0, - 1370,1363,1,0,0,0,1370,1364,1,0,0,0,1371,290,1,0,0,0,1372,1373,7, - 8,0,0,1373,292,1,0,0,0,1374,1375,5,47,0,0,1375,1376,5,47,0,0,1376, - 1380,1,0,0,0,1377,1379,8,9,0,0,1378,1377,1,0,0,0,1379,1382,1,0,0, - 0,1380,1378,1,0,0,0,1380,1381,1,0,0,0,1381,1383,1,0,0,0,1382,1380, - 1,0,0,0,1383,1384,6,146,0,0,1384,294,1,0,0,0,1385,1386,5,47,0,0, - 1386,1387,5,42,0,0,1387,1391,1,0,0,0,1388,1390,9,0,0,0,1389,1388, - 1,0,0,0,1390,1393,1,0,0,0,1391,1392,1,0,0,0,1391,1389,1,0,0,0,1392, - 1394,1,0,0,0,1393,1391,1,0,0,0,1394,1395,5,42,0,0,1395,1396,5,47, - 0,0,1396,1397,1,0,0,0,1397,1398,6,147,0,0,1398,296,1,0,0,0,1399, - 1401,7,10,0,0,1400,1399,1,0,0,0,1401,1402,1,0,0,0,1402,1400,1,0, - 0,0,1402,1403,1,0,0,0,1403,1404,1,0,0,0,1404,1405,6,148,0,0,1405, - 298,1,0,0,0,18,0,1306,1311,1314,1321,1324,1330,1332,1336,1341,1343, - 1349,1355,1357,1370,1380,1391,1402,1,0,1,0 + 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,105,1,105,1,105,1,105,1,105,1,106,1,106,1,106,1,106,1,106, + 1,106,1,106,1,106,1,107,1,107,1,107,1,107,1,107,1,108,1,108,1,108, + 1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,109, + 1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,110,1,110,1,110,1,110, + 1,110,1,110,1,110,1,110,1,110,1,111,1,111,1,111,1,111,1,111,1,111, + 1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,112,1,112,1,112, + 1,112,1,112,1,112,1,112,1,112,1,112,1,113,1,113,1,113,1,113,1,113, + 1,114,1,114,1,114,1,114,1,114,1,114,1,114,1,115,1,115,1,115,1,115, + 1,115,1,116,1,116,1,116,1,116,1,116,1,116,1,117,1,117,1,117,1,117, + 1,117,1,117,1,117,1,118,1,118,1,118,1,118,1,118,1,118,1,119,1,119, + 1,119,1,119,1,119,1,119,1,120,1,120,1,120,1,120,1,120,1,120,1,120, + 1,121,1,121,1,121,1,121,1,121,1,121,1,121,1,122,1,122,1,122,1,122, + 1,122,1,122,1,122,1,123,1,123,1,123,1,123,1,123,1,124,1,124,1,124, + 1,124,1,124,1,124,1,125,1,125,1,125,1,125,1,125,1,126,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,3,141,1319,8,141,1,141, + 4,141,1322,8,141,11,141,12,141,1323,1,142,3,142,1327,8,142,1,142, + 1,142,1,142,5,142,1332,8,142,10,142,12,142,1335,9,142,3,142,1337, + 8,142,1,142,1,142,4,142,1341,8,142,11,142,12,142,1342,3,142,1345, + 8,142,1,142,1,142,3,142,1349,8,142,1,142,4,142,1352,8,142,11,142, + 12,142,1353,3,142,1356,8,142,1,143,1,143,5,143,1360,8,143,10,143, + 12,143,1363,9,143,1,144,1,144,1,144,5,144,1368,8,144,10,144,12,144, + 1371,9,144,1,144,1,144,1,145,1,145,1,145,1,145,1,145,1,145,1,145, + 1,145,3,145,1383,8,145,1,146,1,146,1,147,1,147,1,147,1,147,5,147, + 1391,8,147,10,147,12,147,1394,9,147,1,147,1,147,1,148,1,148,1,148, + 1,148,5,148,1402,8,148,10,148,12,148,1405,9,148,1,148,1,148,1,148, + 1,148,1,148,1,149,4,149,1413,8,149,11,149,12,149,1414,1,149,1,149, + 1,1403,0,150,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11, + 23,12,25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22, + 45,23,47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33, + 67,34,69,35,71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44, + 89,45,91,46,93,47,95,48,97,49,99,50,101,51,103,52,105,53,107,54, + 109,55,111,56,113,57,115,58,117,59,119,60,121,61,123,62,125,63,127, + 64,129,65,131,66,133,67,135,68,137,69,139,70,141,71,143,72,145,73, + 147,74,149,75,151,76,153,77,155,78,157,79,159,80,161,81,163,82,165, + 83,167,84,169,85,171,86,173,87,175,88,177,89,179,90,181,91,183,92, + 185,93,187,94,189,95,191,96,193,97,195,98,197,99,199,100,201,101, + 203,102,205,103,207,104,209,105,211,106,213,107,215,108,217,109, + 219,110,221,111,223,112,225,113,227,114,229,115,231,116,233,117, + 235,118,237,119,239,120,241,121,243,122,245,123,247,124,249,125, + 251,126,253,127,255,128,257,129,259,130,261,131,263,132,265,133, + 267,134,269,135,271,136,273,137,275,138,277,139,279,140,281,141, + 283,142,285,143,287,144,289,145,291,0,293,0,295,146,297,147,299, + 148,1,0,11,1,0,48,57,1,0,49,57,2,0,69,69,101,101,2,0,43,43,45,45, + 3,0,65,90,95,95,97,122,4,0,48,57,65,90,95,95,97,122,4,0,10,10,13, + 13,34,34,92,92,8,0,34,34,47,47,92,92,98,98,102,102,110,110,114,114, + 116,116,3,0,48,57,65,70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32, + 32,1432,0,1,1,0,0,0,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, + 229,1,0,0,0,0,231,1,0,0,0,0,233,1,0,0,0,0,235,1,0,0,0,0,237,1,0, + 0,0,0,239,1,0,0,0,0,241,1,0,0,0,0,243,1,0,0,0,0,245,1,0,0,0,0,247, + 1,0,0,0,0,249,1,0,0,0,0,251,1,0,0,0,0,253,1,0,0,0,0,255,1,0,0,0, + 0,257,1,0,0,0,0,259,1,0,0,0,0,261,1,0,0,0,0,263,1,0,0,0,0,265,1, + 0,0,0,0,267,1,0,0,0,0,269,1,0,0,0,0,271,1,0,0,0,0,273,1,0,0,0,0, + 275,1,0,0,0,0,277,1,0,0,0,0,279,1,0,0,0,0,281,1,0,0,0,0,283,1,0, + 0,0,0,285,1,0,0,0,0,287,1,0,0,0,0,289,1,0,0,0,0,295,1,0,0,0,0,297, + 1,0,0,0,0,299,1,0,0,0,1,301,1,0,0,0,3,306,1,0,0,0,5,315,1,0,0,0, + 7,326,1,0,0,0,9,336,1,0,0,0,11,346,1,0,0,0,13,355,1,0,0,0,15,367, + 1,0,0,0,17,374,1,0,0,0,19,382,1,0,0,0,21,391,1,0,0,0,23,399,1,0, + 0,0,25,405,1,0,0,0,27,410,1,0,0,0,29,423,1,0,0,0,31,433,1,0,0,0, + 33,445,1,0,0,0,35,451,1,0,0,0,37,462,1,0,0,0,39,473,1,0,0,0,41,478, + 1,0,0,0,43,487,1,0,0,0,45,497,1,0,0,0,47,502,1,0,0,0,49,506,1,0, + 0,0,51,512,1,0,0,0,53,517,1,0,0,0,55,527,1,0,0,0,57,531,1,0,0,0, + 59,544,1,0,0,0,61,549,1,0,0,0,63,556,1,0,0,0,65,565,1,0,0,0,67,576, + 1,0,0,0,69,580,1,0,0,0,71,589,1,0,0,0,73,596,1,0,0,0,75,605,1,0, + 0,0,77,610,1,0,0,0,79,620,1,0,0,0,81,631,1,0,0,0,83,639,1,0,0,0, + 85,645,1,0,0,0,87,654,1,0,0,0,89,664,1,0,0,0,91,673,1,0,0,0,93,685, + 1,0,0,0,95,696,1,0,0,0,97,702,1,0,0,0,99,710,1,0,0,0,101,713,1,0, + 0,0,103,718,1,0,0,0,105,725,1,0,0,0,107,728,1,0,0,0,109,736,1,0, + 0,0,111,743,1,0,0,0,113,749,1,0,0,0,115,754,1,0,0,0,117,765,1,0, + 0,0,119,770,1,0,0,0,121,776,1,0,0,0,123,783,1,0,0,0,125,787,1,0, + 0,0,127,799,1,0,0,0,129,802,1,0,0,0,131,809,1,0,0,0,133,812,1,0, + 0,0,135,819,1,0,0,0,137,827,1,0,0,0,139,834,1,0,0,0,141,845,1,0, + 0,0,143,852,1,0,0,0,145,861,1,0,0,0,147,876,1,0,0,0,149,886,1,0, + 0,0,151,896,1,0,0,0,153,909,1,0,0,0,155,915,1,0,0,0,157,932,1,0, + 0,0,159,935,1,0,0,0,161,939,1,0,0,0,163,944,1,0,0,0,165,950,1,0, + 0,0,167,959,1,0,0,0,169,968,1,0,0,0,171,972,1,0,0,0,173,976,1,0, + 0,0,175,980,1,0,0,0,177,986,1,0,0,0,179,992,1,0,0,0,181,997,1,0, + 0,0,183,1002,1,0,0,0,185,1008,1,0,0,0,187,1016,1,0,0,0,189,1024, + 1,0,0,0,191,1035,1,0,0,0,193,1040,1,0,0,0,195,1052,1,0,0,0,197,1063, + 1,0,0,0,199,1073,1,0,0,0,201,1085,1,0,0,0,203,1094,1,0,0,0,205,1099, + 1,0,0,0,207,1112,1,0,0,0,209,1124,1,0,0,0,211,1136,1,0,0,0,213,1141, + 1,0,0,0,215,1149,1,0,0,0,217,1154,1,0,0,0,219,1167,1,0,0,0,221,1175, + 1,0,0,0,223,1184,1,0,0,0,225,1198,1,0,0,0,227,1207,1,0,0,0,229,1212, + 1,0,0,0,231,1219,1,0,0,0,233,1224,1,0,0,0,235,1230,1,0,0,0,237,1237, + 1,0,0,0,239,1243,1,0,0,0,241,1249,1,0,0,0,243,1256,1,0,0,0,245,1263, + 1,0,0,0,247,1270,1,0,0,0,249,1275,1,0,0,0,251,1281,1,0,0,0,253,1286, + 1,0,0,0,255,1289,1,0,0,0,257,1291,1,0,0,0,259,1293,1,0,0,0,261,1295, + 1,0,0,0,263,1297,1,0,0,0,265,1299,1,0,0,0,267,1301,1,0,0,0,269,1303, + 1,0,0,0,271,1305,1,0,0,0,273,1307,1,0,0,0,275,1309,1,0,0,0,277,1311, + 1,0,0,0,279,1313,1,0,0,0,281,1315,1,0,0,0,283,1318,1,0,0,0,285,1326, + 1,0,0,0,287,1357,1,0,0,0,289,1364,1,0,0,0,291,1374,1,0,0,0,293,1384, + 1,0,0,0,295,1386,1,0,0,0,297,1397,1,0,0,0,299,1412,1,0,0,0,301,302, + 5,101,0,0,302,303,5,100,0,0,303,304,5,105,0,0,304,305,5,116,0,0, + 305,2,1,0,0,0,306,307,5,99,0,0,307,308,5,114,0,0,308,309,5,101,0, + 0,309,310,5,97,0,0,310,311,5,116,0,0,311,312,5,105,0,0,312,313,5, + 111,0,0,313,314,5,110,0,0,314,4,1,0,0,0,315,316,5,105,0,0,316,317, + 5,110,0,0,317,318,5,105,0,0,318,319,5,116,0,0,319,320,5,105,0,0, + 320,321,5,97,0,0,321,322,5,108,0,0,322,323,5,105,0,0,323,324,5,122, + 0,0,324,325,5,101,0,0,325,6,1,0,0,0,326,327,5,119,0,0,327,328,5, + 111,0,0,328,329,5,114,0,0,329,330,5,107,0,0,330,331,5,115,0,0,331, + 332,5,112,0,0,332,333,5,97,0,0,333,334,5,99,0,0,334,335,5,101,0, + 0,335,8,1,0,0,0,336,337,5,101,0,0,337,338,5,120,0,0,338,339,5,101, + 0,0,339,340,5,99,0,0,340,341,5,117,0,0,341,342,5,116,0,0,342,343, + 5,105,0,0,343,344,5,111,0,0,344,345,5,110,0,0,345,10,1,0,0,0,346, + 347,5,115,0,0,347,348,5,110,0,0,348,349,5,97,0,0,349,350,5,112,0, + 0,350,351,5,115,0,0,351,352,5,104,0,0,352,353,5,111,0,0,353,354, + 5,116,0,0,354,12,1,0,0,0,355,356,5,116,0,0,356,357,5,114,0,0,357, + 358,5,97,0,0,358,359,5,110,0,0,359,360,5,115,0,0,360,361,5,97,0, + 0,361,362,5,99,0,0,362,363,5,116,0,0,363,364,5,105,0,0,364,365,5, + 111,0,0,365,366,5,110,0,0,366,14,1,0,0,0,367,368,5,114,0,0,368,369, + 5,101,0,0,369,370,5,109,0,0,370,371,5,111,0,0,371,372,5,116,0,0, + 372,373,5,101,0,0,373,16,1,0,0,0,374,375,5,116,0,0,375,376,5,97, + 0,0,376,377,5,114,0,0,377,378,5,103,0,0,378,379,5,101,0,0,379,380, + 5,116,0,0,380,381,5,115,0,0,381,18,1,0,0,0,382,383,5,112,0,0,383, + 384,5,111,0,0,384,385,5,114,0,0,385,386,5,116,0,0,386,387,5,97,0, + 0,387,388,5,98,0,0,388,389,5,108,0,0,389,390,5,101,0,0,390,20,1, + 0,0,0,391,392,5,114,0,0,392,393,5,101,0,0,393,394,5,112,0,0,394, + 395,5,108,0,0,395,396,5,105,0,0,396,397,5,99,0,0,397,398,5,97,0, + 0,398,22,1,0,0,0,399,400,5,108,0,0,400,401,5,111,0,0,401,402,5,99, + 0,0,402,403,5,97,0,0,403,404,5,108,0,0,404,24,1,0,0,0,405,406,5, + 102,0,0,406,407,5,114,0,0,407,408,5,111,0,0,408,409,5,109,0,0,409, + 26,1,0,0,0,410,411,5,114,0,0,411,412,5,101,0,0,412,413,5,115,0,0, + 413,414,5,117,0,0,414,415,5,108,0,0,415,416,5,116,0,0,416,417,5, + 45,0,0,417,418,5,98,0,0,418,419,5,121,0,0,419,420,5,116,0,0,420, + 421,5,101,0,0,421,422,5,115,0,0,422,28,1,0,0,0,423,424,5,114,0,0, + 424,425,5,112,0,0,425,426,5,99,0,0,426,427,5,45,0,0,427,428,5,99, + 0,0,428,429,5,97,0,0,429,430,5,108,0,0,430,431,5,108,0,0,431,432, + 5,115,0,0,432,30,1,0,0,0,433,434,5,100,0,0,434,435,5,101,0,0,435, + 436,5,97,0,0,436,437,5,100,0,0,437,438,5,108,0,0,438,439,5,105,0, + 0,439,440,5,110,0,0,440,441,5,101,0,0,441,442,5,45,0,0,442,443,5, + 109,0,0,443,444,5,115,0,0,444,32,1,0,0,0,445,446,5,113,0,0,446,447, + 5,117,0,0,447,448,5,101,0,0,448,449,5,114,0,0,449,450,5,121,0,0, + 450,34,1,0,0,0,451,452,5,114,0,0,452,453,5,101,0,0,453,454,5,102, + 0,0,454,455,5,108,0,0,455,456,5,101,0,0,456,457,5,99,0,0,457,458, + 5,116,0,0,458,459,5,105,0,0,459,460,5,111,0,0,460,461,5,110,0,0, + 461,36,1,0,0,0,462,463,5,115,0,0,463,464,5,112,0,0,464,465,5,101, + 0,0,465,466,5,99,0,0,466,467,5,105,0,0,467,468,5,97,0,0,468,469, + 5,108,0,0,469,470,5,105,0,0,470,471,5,122,0,0,471,472,5,101,0,0, + 472,38,1,0,0,0,473,474,5,114,0,0,474,475,5,111,0,0,475,476,5,111, + 0,0,476,477,5,116,0,0,477,40,1,0,0,0,478,479,5,100,0,0,479,480,5, + 111,0,0,480,481,5,99,0,0,481,482,5,117,0,0,482,483,5,109,0,0,483, + 484,5,101,0,0,484,485,5,110,0,0,485,486,5,116,0,0,486,42,1,0,0,0, + 487,488,5,102,0,0,488,489,5,114,0,0,489,490,5,97,0,0,490,491,5,103, + 0,0,491,492,5,109,0,0,492,493,5,101,0,0,493,494,5,110,0,0,494,495, + 5,116,0,0,495,496,5,115,0,0,496,44,1,0,0,0,497,498,5,118,0,0,498, + 499,5,105,0,0,499,500,5,101,0,0,500,501,5,119,0,0,501,46,1,0,0,0, + 502,503,5,109,0,0,503,504,5,97,0,0,504,505,5,120,0,0,505,48,1,0, + 0,0,506,507,5,97,0,0,507,508,5,108,0,0,508,509,5,108,0,0,509,510, + 5,111,0,0,510,511,5,119,0,0,511,50,1,0,0,0,512,513,5,112,0,0,513, + 514,5,111,0,0,514,515,5,108,0,0,515,516,5,108,0,0,516,52,1,0,0,0, + 517,518,5,113,0,0,518,519,5,117,0,0,519,520,5,101,0,0,520,521,5, + 114,0,0,521,522,5,121,0,0,522,523,5,97,0,0,523,524,5,98,0,0,524, + 525,5,108,0,0,525,526,5,101,0,0,526,54,1,0,0,0,527,528,5,114,0,0, + 528,529,5,112,0,0,529,530,5,99,0,0,530,56,1,0,0,0,531,532,5,113, + 0,0,532,533,5,117,0,0,533,534,5,101,0,0,534,535,5,114,0,0,535,536, + 5,121,0,0,536,537,5,45,0,0,537,538,5,114,0,0,538,539,5,101,0,0,539, + 540,5,97,0,0,540,541,5,115,0,0,541,542,5,111,0,0,542,543,5,110,0, + 0,543,58,1,0,0,0,544,545,5,116,0,0,545,546,5,121,0,0,546,547,5,112, + 0,0,547,548,5,101,0,0,548,60,1,0,0,0,549,550,5,111,0,0,550,551,5, + 98,0,0,551,552,5,106,0,0,552,553,5,101,0,0,553,554,5,99,0,0,554, + 555,5,116,0,0,555,62,1,0,0,0,556,557,5,115,0,0,557,558,5,116,0,0, + 558,559,5,111,0,0,559,560,5,114,0,0,560,561,5,97,0,0,561,562,5,98, + 0,0,562,563,5,108,0,0,563,564,5,101,0,0,564,64,1,0,0,0,565,566,5, + 105,0,0,566,567,5,109,0,0,567,568,5,112,0,0,568,569,5,108,0,0,569, + 570,5,101,0,0,570,571,5,109,0,0,571,572,5,101,0,0,572,573,5,110, + 0,0,573,574,5,116,0,0,574,575,5,115,0,0,575,66,1,0,0,0,576,577,5, + 114,0,0,577,578,5,101,0,0,578,579,5,102,0,0,579,68,1,0,0,0,580,581, + 5,102,0,0,581,582,5,114,0,0,582,583,5,97,0,0,583,584,5,103,0,0,584, + 585,5,109,0,0,585,586,5,101,0,0,586,587,5,110,0,0,587,588,5,116, + 0,0,588,70,1,0,0,0,589,590,5,105,0,0,590,591,5,109,0,0,591,592,5, + 112,0,0,592,593,5,111,0,0,593,594,5,114,0,0,594,595,5,116,0,0,595, + 72,1,0,0,0,596,597,5,101,0,0,597,598,5,120,0,0,598,599,5,116,0,0, + 599,600,5,101,0,0,600,601,5,114,0,0,601,602,5,110,0,0,602,603,5, + 97,0,0,603,604,5,108,0,0,604,74,1,0,0,0,605,606,5,97,0,0,606,607, + 5,116,0,0,607,608,5,111,0,0,608,609,5,109,0,0,609,76,1,0,0,0,610, + 611,5,105,0,0,611,612,5,110,0,0,612,613,5,116,0,0,613,614,5,101, + 0,0,614,615,5,114,0,0,615,616,5,102,0,0,616,617,5,97,0,0,617,618, + 5,99,0,0,618,619,5,101,0,0,619,78,1,0,0,0,620,621,5,105,0,0,621, + 622,5,110,0,0,622,623,5,116,0,0,623,624,5,101,0,0,624,625,5,114, + 0,0,625,626,5,102,0,0,626,627,5,97,0,0,627,628,5,99,0,0,628,629, + 5,101,0,0,629,630,5,115,0,0,630,80,1,0,0,0,631,632,5,112,0,0,632, + 633,5,97,0,0,633,634,5,99,0,0,634,635,5,107,0,0,635,636,5,97,0,0, + 636,637,5,103,0,0,637,638,5,101,0,0,638,82,1,0,0,0,639,640,5,118, + 0,0,640,641,5,97,0,0,641,642,5,108,0,0,642,643,5,117,0,0,643,644, + 5,101,0,0,644,84,1,0,0,0,645,646,5,114,0,0,646,647,5,101,0,0,647, + 648,5,108,0,0,648,649,5,97,0,0,649,650,5,116,0,0,650,651,5,105,0, + 0,651,652,5,111,0,0,652,653,5,110,0,0,653,86,1,0,0,0,654,655,5,111, + 0,0,655,656,5,112,0,0,656,657,5,101,0,0,657,658,5,114,0,0,658,659, + 5,97,0,0,659,660,5,116,0,0,660,661,5,105,0,0,661,662,5,111,0,0,662, + 663,5,110,0,0,663,88,1,0,0,0,664,665,5,102,0,0,665,666,5,117,0,0, + 666,667,5,110,0,0,667,668,5,99,0,0,668,669,5,116,0,0,669,670,5,105, + 0,0,670,671,5,111,0,0,671,672,5,110,0,0,672,90,1,0,0,0,673,674,5, + 99,0,0,674,675,5,111,0,0,675,676,5,110,0,0,676,677,5,115,0,0,677, + 678,5,116,0,0,678,679,5,114,0,0,679,680,5,117,0,0,680,681,5,99,0, + 0,681,682,5,116,0,0,682,683,5,111,0,0,683,684,5,114,0,0,684,92,1, + 0,0,0,685,686,5,99,0,0,686,687,5,111,0,0,687,688,5,110,0,0,688,689, + 5,115,0,0,689,690,5,116,0,0,690,691,5,114,0,0,691,692,5,117,0,0, + 692,693,5,99,0,0,693,694,5,116,0,0,694,695,5,115,0,0,695,94,1,0, + 0,0,696,697,5,105,0,0,697,698,5,110,0,0,698,699,5,112,0,0,699,700, + 5,117,0,0,700,701,5,116,0,0,701,96,1,0,0,0,702,703,5,99,0,0,703, + 704,5,111,0,0,704,705,5,110,0,0,705,706,5,102,0,0,706,707,5,111, + 0,0,707,708,5,114,0,0,708,709,5,109,0,0,709,98,1,0,0,0,710,711,5, + 97,0,0,711,712,5,115,0,0,712,100,1,0,0,0,713,714,5,98,0,0,714,715, + 5,105,0,0,715,716,5,110,0,0,716,717,5,100,0,0,717,102,1,0,0,0,718, + 719,5,115,0,0,719,720,5,116,0,0,720,721,5,97,0,0,721,722,5,116,0, + 0,722,723,5,105,0,0,723,724,5,99,0,0,724,104,1,0,0,0,725,726,5,116, + 0,0,726,727,5,111,0,0,727,106,1,0,0,0,728,729,5,112,0,0,729,730, + 5,114,0,0,730,731,5,105,0,0,731,732,5,118,0,0,732,733,5,97,0,0,733, + 734,5,116,0,0,734,735,5,101,0,0,735,108,1,0,0,0,736,737,5,115,0, + 0,737,738,5,104,0,0,738,739,5,97,0,0,739,740,5,114,0,0,740,741,5, + 101,0,0,741,742,5,100,0,0,742,110,1,0,0,0,743,744,5,115,0,0,744, + 745,5,116,0,0,745,746,5,97,0,0,746,747,5,116,0,0,747,748,5,101,0, + 0,748,112,1,0,0,0,749,750,5,101,0,0,750,751,5,100,0,0,751,752,5, + 103,0,0,752,753,5,101,0,0,753,114,1,0,0,0,754,755,5,112,0,0,755, + 756,5,114,0,0,756,757,5,111,0,0,757,758,5,106,0,0,758,759,5,101, + 0,0,759,760,5,99,0,0,760,761,5,116,0,0,761,762,5,105,0,0,762,763, + 5,111,0,0,763,764,5,110,0,0,764,116,1,0,0,0,765,766,5,119,0,0,766, + 767,5,105,0,0,767,768,5,116,0,0,768,769,5,104,0,0,769,118,1,0,0, + 0,770,771,5,117,0,0,771,772,5,115,0,0,772,773,5,105,0,0,773,774, + 5,110,0,0,774,775,5,103,0,0,775,120,1,0,0,0,776,777,5,97,0,0,777, + 778,5,99,0,0,778,779,5,99,0,0,779,780,5,101,0,0,780,781,5,112,0, + 0,781,782,5,116,0,0,782,122,1,0,0,0,783,784,5,118,0,0,784,785,5, + 105,0,0,785,786,5,97,0,0,786,124,1,0,0,0,787,788,5,109,0,0,788,789, + 5,97,0,0,789,790,5,116,0,0,790,791,5,101,0,0,791,792,5,114,0,0,792, + 793,5,105,0,0,793,794,5,97,0,0,794,795,5,108,0,0,795,796,5,105,0, + 0,796,797,5,122,0,0,797,798,5,101,0,0,798,126,1,0,0,0,799,800,5, + 105,0,0,800,801,5,102,0,0,801,128,1,0,0,0,802,803,5,97,0,0,803,804, + 5,98,0,0,804,805,5,115,0,0,805,806,5,101,0,0,806,807,5,110,0,0,807, + 808,5,116,0,0,808,130,1,0,0,0,809,810,5,111,0,0,810,811,5,110,0, + 0,811,132,1,0,0,0,812,813,5,112,0,0,813,814,5,111,0,0,814,815,5, + 108,0,0,815,816,5,105,0,0,816,817,5,99,0,0,817,818,5,121,0,0,818, + 134,1,0,0,0,819,820,5,100,0,0,820,821,5,101,0,0,821,822,5,102,0, + 0,822,823,5,97,0,0,823,824,5,117,0,0,824,825,5,108,0,0,825,826,5, + 116,0,0,826,136,1,0,0,0,827,828,5,115,0,0,828,829,5,111,0,0,829, + 830,5,117,0,0,830,831,5,114,0,0,831,832,5,99,0,0,832,833,5,101,0, + 0,833,138,1,0,0,0,834,835,5,114,0,0,835,836,5,101,0,0,836,837,5, + 112,0,0,837,838,5,111,0,0,838,839,5,115,0,0,839,840,5,105,0,0,840, + 841,5,116,0,0,841,842,5,111,0,0,842,843,5,114,0,0,843,844,5,121, + 0,0,844,140,1,0,0,0,845,846,5,99,0,0,846,847,5,111,0,0,847,848,5, + 109,0,0,848,849,5,109,0,0,849,850,5,105,0,0,850,851,5,116,0,0,851, + 142,1,0,0,0,852,853,5,114,0,0,853,854,5,101,0,0,854,855,5,118,0, + 0,855,856,5,105,0,0,856,857,5,115,0,0,857,858,5,105,0,0,858,859, + 5,111,0,0,859,860,5,110,0,0,860,144,1,0,0,0,861,862,5,115,0,0,862, + 863,5,101,0,0,863,864,5,109,0,0,864,865,5,97,0,0,865,866,5,110,0, + 0,866,867,5,116,0,0,867,868,5,105,0,0,868,869,5,99,0,0,869,870,5, + 45,0,0,870,871,5,109,0,0,871,872,5,97,0,0,872,873,5,106,0,0,873, + 874,5,111,0,0,874,875,5,114,0,0,875,146,1,0,0,0,876,877,5,111,0, + 0,877,878,5,110,0,0,878,879,5,45,0,0,879,880,5,100,0,0,880,881,5, + 101,0,0,881,882,5,108,0,0,882,883,5,101,0,0,883,884,5,116,0,0,884, + 885,5,101,0,0,885,148,1,0,0,0,886,887,5,108,0,0,887,888,5,105,0, + 0,888,889,5,102,0,0,889,890,5,101,0,0,890,891,5,99,0,0,891,892,5, + 121,0,0,892,893,5,99,0,0,893,894,5,108,0,0,894,895,5,101,0,0,895, + 150,1,0,0,0,896,897,5,114,0,0,897,898,5,101,0,0,898,899,5,116,0, + 0,899,900,5,97,0,0,900,901,5,105,0,0,901,902,5,110,0,0,902,903,5, + 45,0,0,903,904,5,111,0,0,904,905,5,116,0,0,905,906,5,104,0,0,906, + 907,5,101,0,0,907,908,5,114,0,0,908,152,1,0,0,0,909,910,5,107,0, + 0,910,911,5,101,0,0,911,912,5,121,0,0,912,913,5,101,0,0,913,914, + 5,100,0,0,914,154,1,0,0,0,915,916,5,112,0,0,916,917,5,117,0,0,917, + 918,5,98,0,0,918,919,5,108,0,0,919,920,5,105,0,0,920,921,5,99,0, + 0,921,922,5,45,0,0,922,923,5,116,0,0,923,924,5,114,0,0,924,925,5, + 97,0,0,925,926,5,118,0,0,926,927,5,101,0,0,927,928,5,114,0,0,928, + 929,5,115,0,0,929,930,5,97,0,0,930,931,5,108,0,0,931,156,1,0,0,0, + 932,933,5,105,0,0,933,934,5,100,0,0,934,158,1,0,0,0,935,936,5,100, + 0,0,936,937,5,111,0,0,937,938,5,99,0,0,938,160,1,0,0,0,939,940,5, + 109,0,0,940,941,5,111,0,0,941,942,5,100,0,0,942,943,5,101,0,0,943, + 162,1,0,0,0,944,945,5,101,0,0,945,946,5,109,0,0,946,947,5,105,0, + 0,947,948,5,116,0,0,948,949,5,115,0,0,949,164,1,0,0,0,950,951,5, + 114,0,0,951,952,5,101,0,0,952,953,5,99,0,0,953,954,5,101,0,0,954, + 955,5,105,0,0,955,956,5,118,0,0,956,957,5,101,0,0,957,958,5,114, + 0,0,958,166,1,0,0,0,959,960,5,114,0,0,960,961,5,101,0,0,961,962, + 5,113,0,0,962,963,5,117,0,0,963,964,5,105,0,0,964,965,5,114,0,0, + 965,966,5,101,0,0,966,967,5,115,0,0,967,168,1,0,0,0,968,969,5,97, + 0,0,969,970,5,110,0,0,970,971,5,121,0,0,971,170,1,0,0,0,972,973, + 5,103,0,0,973,974,5,101,0,0,974,975,5,116,0,0,975,172,1,0,0,0,976, + 977,5,115,0,0,977,978,5,101,0,0,978,979,5,116,0,0,979,174,1,0,0, + 0,980,981,5,119,0,0,981,982,5,97,0,0,982,983,5,116,0,0,983,984,5, + 99,0,0,984,985,5,104,0,0,985,176,1,0,0,0,986,987,5,115,0,0,987,988, + 5,116,0,0,988,989,5,97,0,0,989,990,5,114,0,0,990,991,5,116,0,0,991, + 178,1,0,0,0,992,993,5,115,0,0,993,994,5,116,0,0,994,995,5,111,0, + 0,995,996,5,112,0,0,996,180,1,0,0,0,997,998,5,114,0,0,998,999,5, + 101,0,0,999,1000,5,97,0,0,1000,1001,5,100,0,0,1001,182,1,0,0,0,1002, + 1003,5,119,0,0,1003,1004,5,114,0,0,1004,1005,5,105,0,0,1005,1006, + 5,116,0,0,1006,1007,5,101,0,0,1007,184,1,0,0,0,1008,1009,5,114,0, + 0,1009,1010,5,101,0,0,1010,1011,5,115,0,0,1011,1012,5,111,0,0,1012, + 1013,5,108,0,0,1013,1014,5,118,0,0,1014,1015,5,101,0,0,1015,186, + 1,0,0,0,1016,1017,5,99,0,0,1017,1018,5,111,0,0,1018,1019,5,110,0, + 0,1019,1020,5,110,0,0,1020,1021,5,101,0,0,1021,1022,5,99,0,0,1022, + 1023,5,116,0,0,1023,188,1,0,0,0,1024,1025,5,100,0,0,1025,1026,5, + 105,0,0,1026,1027,5,115,0,0,1027,1028,5,99,0,0,1028,1029,5,111,0, + 0,1029,1030,5,110,0,0,1030,1031,5,110,0,0,1031,1032,5,101,0,0,1032, + 1033,5,99,0,0,1033,1034,5,116,0,0,1034,190,1,0,0,0,1035,1036,5,99, + 0,0,1036,1037,5,97,0,0,1037,1038,5,108,0,0,1038,1039,5,108,0,0,1039, + 192,1,0,0,0,1040,1041,5,119,0,0,1041,1042,5,97,0,0,1042,1043,5,116, + 0,0,1043,1044,5,99,0,0,1044,1045,5,104,0,0,1045,1046,5,45,0,0,1046, + 1047,5,115,0,0,1047,1048,5,116,0,0,1048,1049,5,97,0,0,1049,1050, + 5,114,0,0,1050,1051,5,116,0,0,1051,194,1,0,0,0,1052,1053,5,119,0, + 0,1053,1054,5,97,0,0,1054,1055,5,116,0,0,1055,1056,5,99,0,0,1056, + 1057,5,104,0,0,1057,1058,5,45,0,0,1058,1059,5,115,0,0,1059,1060, + 5,116,0,0,1060,1061,5,111,0,0,1061,1062,5,112,0,0,1062,196,1,0,0, + 0,1063,1064,5,115,0,0,1064,1065,5,117,0,0,1065,1066,5,98,0,0,1066, + 1067,5,115,0,0,1067,1068,5,99,0,0,1068,1069,5,114,0,0,1069,1070, + 5,105,0,0,1070,1071,5,98,0,0,1071,1072,5,101,0,0,1072,198,1,0,0, + 0,1073,1074,5,117,0,0,1074,1075,5,110,0,0,1075,1076,5,115,0,0,1076, + 1077,5,117,0,0,1077,1078,5,98,0,0,1078,1079,5,115,0,0,1079,1080, + 5,99,0,0,1080,1081,5,114,0,0,1081,1082,5,105,0,0,1082,1083,5,98, + 0,0,1083,1084,5,101,0,0,1084,200,1,0,0,0,1085,1086,5,114,0,0,1086, + 1087,5,101,0,0,1087,1088,5,103,0,0,1088,1089,5,105,0,0,1089,1090, + 5,115,0,0,1090,1091,5,116,0,0,1091,1092,5,101,0,0,1092,1093,5,114, + 0,0,1093,202,1,0,0,0,1094,1095,5,99,0,0,1095,1096,5,114,0,0,1096, + 1097,5,100,0,0,1097,1098,5,116,0,0,1098,204,1,0,0,0,1099,1100,5, + 111,0,0,1100,1101,5,112,0,0,1101,1102,5,116,0,0,1102,1103,5,105, + 0,0,1103,1104,5,111,0,0,1104,1105,5,110,0,0,1105,1106,5,97,0,0,1106, + 1107,5,108,0,0,1107,1108,5,45,0,0,1108,1109,5,111,0,0,1109,1110, + 5,110,0,0,1110,1111,5,101,0,0,1111,206,1,0,0,0,1112,1113,5,101,0, + 0,1113,1114,5,120,0,0,1114,1115,5,97,0,0,1115,1116,5,99,0,0,1116, + 1117,5,116,0,0,1117,1118,5,108,0,0,1118,1119,5,121,0,0,1119,1120, + 5,45,0,0,1120,1121,5,111,0,0,1121,1122,5,110,0,0,1122,1123,5,101, + 0,0,1123,208,1,0,0,0,1124,1125,5,109,0,0,1125,1126,5,97,0,0,1126, + 1127,5,110,0,0,1127,1128,5,121,0,0,1128,1129,5,45,0,0,1129,1130, + 5,117,0,0,1130,1131,5,110,0,0,1131,1132,5,105,0,0,1132,1133,5,113, + 0,0,1133,1134,5,117,0,0,1134,1135,5,101,0,0,1135,210,1,0,0,0,1136, + 1137,5,109,0,0,1137,1138,5,97,0,0,1138,1139,5,110,0,0,1139,1140, + 5,121,0,0,1140,212,1,0,0,0,1141,1142,5,111,0,0,1142,1143,5,114,0, + 0,1143,1144,5,100,0,0,1144,1145,5,101,0,0,1145,1146,5,114,0,0,1146, + 1147,5,101,0,0,1147,1148,5,100,0,0,1148,214,1,0,0,0,1149,1150,5, + 117,0,0,1150,1151,5,110,0,0,1151,1152,5,105,0,0,1152,1153,5,116, + 0,0,1153,216,1,0,0,0,1154,1155,5,119,0,0,1155,1156,5,97,0,0,1156, + 1157,5,116,0,0,1157,1158,5,99,0,0,1158,1159,5,104,0,0,1159,1160, + 5,45,0,0,1160,1161,5,104,0,0,1161,1162,5,97,0,0,1162,1163,5,110, + 0,0,1163,1164,5,100,0,0,1164,1165,5,108,0,0,1165,1166,5,101,0,0, + 1166,218,1,0,0,0,1167,1168,5,109,0,0,1168,1169,5,101,0,0,1169,1170, + 5,115,0,0,1170,1171,5,115,0,0,1171,1172,5,97,0,0,1172,1173,5,103, + 0,0,1173,1174,5,101,0,0,1174,220,1,0,0,0,1175,1176,5,97,0,0,1176, + 1177,5,116,0,0,1177,1178,5,111,0,0,1178,1179,5,109,0,0,1179,1180, + 5,45,0,0,1180,1181,5,114,0,0,1181,1182,5,101,0,0,1182,1183,5,102, + 0,0,1183,222,1,0,0,0,1184,1185,5,105,0,0,1185,1186,5,110,0,0,1186, + 1187,5,116,0,0,1187,1188,5,101,0,0,1188,1189,5,114,0,0,1189,1190, + 5,102,0,0,1190,1191,5,97,0,0,1191,1192,5,99,0,0,1192,1193,5,101, + 0,0,1193,1194,5,45,0,0,1194,1195,5,114,0,0,1195,1196,5,101,0,0,1196, + 1197,5,102,0,0,1197,224,1,0,0,0,1198,1199,5,111,0,0,1199,1200,5, + 112,0,0,1200,1201,5,116,0,0,1201,1202,5,105,0,0,1202,1203,5,111, + 0,0,1203,1204,5,110,0,0,1204,1205,5,97,0,0,1205,1206,5,108,0,0,1206, + 226,1,0,0,0,1207,1208,5,108,0,0,1208,1209,5,105,0,0,1209,1210,5, + 115,0,0,1210,1211,5,116,0,0,1211,228,1,0,0,0,1212,1213,5,114,0,0, + 1213,1214,5,101,0,0,1214,1215,5,99,0,0,1215,1216,5,111,0,0,1216, + 1217,5,114,0,0,1217,1218,5,100,0,0,1218,230,1,0,0,0,1219,1220,5, + 98,0,0,1220,1221,5,111,0,0,1221,1222,5,111,0,0,1222,1223,5,108,0, + 0,1223,232,1,0,0,0,1224,1225,5,98,0,0,1225,1226,5,121,0,0,1226,1227, + 5,116,0,0,1227,1228,5,101,0,0,1228,1229,5,115,0,0,1229,234,1,0,0, + 0,1230,1231,5,100,0,0,1231,1232,5,111,0,0,1232,1233,5,117,0,0,1233, + 1234,5,98,0,0,1234,1235,5,108,0,0,1235,1236,5,101,0,0,1236,236,1, + 0,0,0,1237,1238,5,105,0,0,1238,1239,5,110,0,0,1239,1240,5,116,0, + 0,1240,1241,5,51,0,0,1241,1242,5,50,0,0,1242,238,1,0,0,0,1243,1244, + 5,105,0,0,1244,1245,5,110,0,0,1245,1246,5,116,0,0,1246,1247,5,54, + 0,0,1247,1248,5,52,0,0,1248,240,1,0,0,0,1249,1250,5,115,0,0,1250, + 1251,5,116,0,0,1251,1252,5,114,0,0,1252,1253,5,105,0,0,1253,1254, + 5,110,0,0,1254,1255,5,103,0,0,1255,242,1,0,0,0,1256,1257,5,117,0, + 0,1257,1258,5,105,0,0,1258,1259,5,110,0,0,1259,1260,5,116,0,0,1260, + 1261,5,51,0,0,1261,1262,5,50,0,0,1262,244,1,0,0,0,1263,1264,5,117, + 0,0,1264,1265,5,105,0,0,1265,1266,5,110,0,0,1266,1267,5,116,0,0, + 1267,1268,5,54,0,0,1268,1269,5,52,0,0,1269,246,1,0,0,0,1270,1271, + 5,116,0,0,1271,1272,5,114,0,0,1272,1273,5,117,0,0,1273,1274,5,101, + 0,0,1274,248,1,0,0,0,1275,1276,5,102,0,0,1276,1277,5,97,0,0,1277, + 1278,5,108,0,0,1278,1279,5,115,0,0,1279,1280,5,101,0,0,1280,250, + 1,0,0,0,1281,1282,5,110,0,0,1282,1283,5,117,0,0,1283,1284,5,108, + 0,0,1284,1285,5,108,0,0,1285,252,1,0,0,0,1286,1287,5,45,0,0,1287, + 1288,5,62,0,0,1288,254,1,0,0,0,1289,1290,5,58,0,0,1290,256,1,0,0, + 0,1291,1292,5,59,0,0,1292,258,1,0,0,0,1293,1294,5,44,0,0,1294,260, + 1,0,0,0,1295,1296,5,46,0,0,1296,262,1,0,0,0,1297,1298,5,123,0,0, + 1298,264,1,0,0,0,1299,1300,5,125,0,0,1300,266,1,0,0,0,1301,1302, + 5,91,0,0,1302,268,1,0,0,0,1303,1304,5,93,0,0,1304,270,1,0,0,0,1305, + 1306,5,40,0,0,1306,272,1,0,0,0,1307,1308,5,41,0,0,1308,274,1,0,0, + 0,1309,1310,5,60,0,0,1310,276,1,0,0,0,1311,1312,5,62,0,0,1312,278, + 1,0,0,0,1313,1314,5,38,0,0,1314,280,1,0,0,0,1315,1316,5,61,0,0,1316, + 282,1,0,0,0,1317,1319,5,45,0,0,1318,1317,1,0,0,0,1318,1319,1,0,0, + 0,1319,1321,1,0,0,0,1320,1322,7,0,0,0,1321,1320,1,0,0,0,1322,1323, + 1,0,0,0,1323,1321,1,0,0,0,1323,1324,1,0,0,0,1324,284,1,0,0,0,1325, + 1327,5,45,0,0,1326,1325,1,0,0,0,1326,1327,1,0,0,0,1327,1336,1,0, + 0,0,1328,1337,5,48,0,0,1329,1333,7,1,0,0,1330,1332,7,0,0,0,1331, + 1330,1,0,0,0,1332,1335,1,0,0,0,1333,1331,1,0,0,0,1333,1334,1,0,0, + 0,1334,1337,1,0,0,0,1335,1333,1,0,0,0,1336,1328,1,0,0,0,1336,1329, + 1,0,0,0,1337,1344,1,0,0,0,1338,1340,5,46,0,0,1339,1341,7,0,0,0,1340, + 1339,1,0,0,0,1341,1342,1,0,0,0,1342,1340,1,0,0,0,1342,1343,1,0,0, + 0,1343,1345,1,0,0,0,1344,1338,1,0,0,0,1344,1345,1,0,0,0,1345,1355, + 1,0,0,0,1346,1348,7,2,0,0,1347,1349,7,3,0,0,1348,1347,1,0,0,0,1348, + 1349,1,0,0,0,1349,1351,1,0,0,0,1350,1352,7,0,0,0,1351,1350,1,0,0, + 0,1352,1353,1,0,0,0,1353,1351,1,0,0,0,1353,1354,1,0,0,0,1354,1356, + 1,0,0,0,1355,1346,1,0,0,0,1355,1356,1,0,0,0,1356,286,1,0,0,0,1357, + 1361,7,4,0,0,1358,1360,7,5,0,0,1359,1358,1,0,0,0,1360,1363,1,0,0, + 0,1361,1359,1,0,0,0,1361,1362,1,0,0,0,1362,288,1,0,0,0,1363,1361, + 1,0,0,0,1364,1369,5,34,0,0,1365,1368,3,291,145,0,1366,1368,8,6,0, + 0,1367,1365,1,0,0,0,1367,1366,1,0,0,0,1368,1371,1,0,0,0,1369,1367, + 1,0,0,0,1369,1370,1,0,0,0,1370,1372,1,0,0,0,1371,1369,1,0,0,0,1372, + 1373,5,34,0,0,1373,290,1,0,0,0,1374,1382,5,92,0,0,1375,1383,7,7, + 0,0,1376,1377,5,117,0,0,1377,1378,3,293,146,0,1378,1379,3,293,146, + 0,1379,1380,3,293,146,0,1380,1381,3,293,146,0,1381,1383,1,0,0,0, + 1382,1375,1,0,0,0,1382,1376,1,0,0,0,1383,292,1,0,0,0,1384,1385,7, + 8,0,0,1385,294,1,0,0,0,1386,1387,5,47,0,0,1387,1388,5,47,0,0,1388, + 1392,1,0,0,0,1389,1391,8,9,0,0,1390,1389,1,0,0,0,1391,1394,1,0,0, + 0,1392,1390,1,0,0,0,1392,1393,1,0,0,0,1393,1395,1,0,0,0,1394,1392, + 1,0,0,0,1395,1396,6,147,0,0,1396,296,1,0,0,0,1397,1398,5,47,0,0, + 1398,1399,5,42,0,0,1399,1403,1,0,0,0,1400,1402,9,0,0,0,1401,1400, + 1,0,0,0,1402,1405,1,0,0,0,1403,1404,1,0,0,0,1403,1401,1,0,0,0,1404, + 1406,1,0,0,0,1405,1403,1,0,0,0,1406,1407,5,42,0,0,1407,1408,5,47, + 0,0,1408,1409,1,0,0,0,1409,1410,6,148,0,0,1410,298,1,0,0,0,1411, + 1413,7,10,0,0,1412,1411,1,0,0,0,1413,1414,1,0,0,0,1414,1412,1,0, + 0,0,1414,1415,1,0,0,0,1415,1416,1,0,0,0,1416,1417,6,149,0,0,1417, + 300,1,0,0,0,18,0,1318,1323,1326,1333,1336,1342,1344,1348,1353,1355, + 1361,1367,1369,1382,1392,1403,1414,1,0,1,0 ]; private static __ATN: antlr.ATN; diff --git a/src/capability-language/generated/QuixosCapabilityParser.ts b/src/capability-language/generated/QuixosCapabilityParser.ts index 6fefb82..128b09f 100644 --- a/src/capability-language/generated/QuixosCapabilityParser.ts +++ b/src/capability-language/generated/QuixosCapabilityParser.ts @@ -84,79 +84,80 @@ export class QuixosCapabilityParser extends antlr.Parser { public static readonly REVISION = 72; public static readonly SEMANTIC_MAJOR = 73; public static readonly ON_DELETE = 74; - public static readonly RETAIN_OTHER = 75; - public static readonly KEYED = 76; - public static readonly PUBLIC_TRAVERSAL = 77; - public static readonly ID = 78; - public static readonly DOC = 79; - public static readonly MODE = 80; - public static readonly EMITS = 81; - public static readonly RECEIVER = 82; - public static readonly REQUIRES = 83; - public static readonly ANY = 84; - public static readonly GET = 85; - public static readonly SET = 86; - public static readonly WATCH = 87; - public static readonly START = 88; - public static readonly STOP = 89; - public static readonly READ = 90; - public static readonly WRITE = 91; - public static readonly RESOLVE = 92; - public static readonly CONNECT = 93; - public static readonly DISCONNECT = 94; - public static readonly CALL = 95; - public static readonly WATCH_START = 96; - public static readonly WATCH_STOP = 97; - public static readonly SUBSCRIBE = 98; - public static readonly UNSUBSCRIBE = 99; - public static readonly REGISTER = 100; - public static readonly CRDT = 101; - public static readonly OPTIONAL_ONE = 102; - public static readonly EXACTLY_ONE = 103; - public static readonly MANY_UNIQUE = 104; - public static readonly MANY = 105; - public static readonly ORDERED = 106; - public static readonly UNIT = 107; - public static readonly WATCH_HANDLE = 108; - public static readonly MESSAGE = 109; - public static readonly ATOM_REF = 110; - public static readonly INTERFACE_REF = 111; - public static readonly OPTIONAL = 112; - public static readonly LIST = 113; - public static readonly RECORD = 114; - public static readonly BOOL = 115; - public static readonly BYTES = 116; - public static readonly DOUBLE = 117; - public static readonly INT32 = 118; - public static readonly INT64 = 119; - public static readonly STRING = 120; - public static readonly UINT32 = 121; - public static readonly UINT64 = 122; - public static readonly TRUE = 123; - public static readonly FALSE = 124; - public static readonly NULL = 125; - public static readonly ARROW = 126; - public static readonly COLON = 127; - public static readonly SEMI = 128; - public static readonly COMMA = 129; - public static readonly DOT = 130; - public static readonly LBRACE = 131; - public static readonly RBRACE = 132; - public static readonly LBRACK = 133; - public static readonly RBRACK = 134; - public static readonly LPAREN = 135; - public static readonly RPAREN = 136; - public static readonly LT = 137; - public static readonly GT = 138; - public static readonly AMP = 139; - public static readonly EQUAL = 140; - public static readonly INTEGER = 141; - public static readonly JSON_NUMBER = 142; - public static readonly IDENTIFIER = 143; - public static readonly STRING_LITERAL = 144; - public static readonly LINE_COMMENT = 145; - public static readonly BLOCK_COMMENT = 146; - public static readonly WS = 147; + public static readonly LIFECYCLE = 75; + public static readonly RETAIN_OTHER = 76; + public static readonly KEYED = 77; + public static readonly PUBLIC_TRAVERSAL = 78; + public static readonly ID = 79; + public static readonly DOC = 80; + public static readonly MODE = 81; + public static readonly EMITS = 82; + public static readonly RECEIVER = 83; + public static readonly REQUIRES = 84; + public static readonly ANY = 85; + public static readonly GET = 86; + public static readonly SET = 87; + public static readonly WATCH = 88; + public static readonly START = 89; + public static readonly STOP = 90; + public static readonly READ = 91; + public static readonly WRITE = 92; + public static readonly RESOLVE = 93; + public static readonly CONNECT = 94; + public static readonly DISCONNECT = 95; + public static readonly CALL = 96; + public static readonly WATCH_START = 97; + public static readonly WATCH_STOP = 98; + public static readonly SUBSCRIBE = 99; + public static readonly UNSUBSCRIBE = 100; + public static readonly REGISTER = 101; + public static readonly CRDT = 102; + public static readonly OPTIONAL_ONE = 103; + public static readonly EXACTLY_ONE = 104; + public static readonly MANY_UNIQUE = 105; + public static readonly MANY = 106; + public static readonly ORDERED = 107; + public static readonly UNIT = 108; + public static readonly WATCH_HANDLE = 109; + public static readonly MESSAGE = 110; + public static readonly ATOM_REF = 111; + public static readonly INTERFACE_REF = 112; + public static readonly OPTIONAL = 113; + public static readonly LIST = 114; + public static readonly RECORD = 115; + public static readonly BOOL = 116; + public static readonly BYTES = 117; + public static readonly DOUBLE = 118; + public static readonly INT32 = 119; + public static readonly INT64 = 120; + public static readonly STRING = 121; + public static readonly UINT32 = 122; + public static readonly UINT64 = 123; + public static readonly TRUE = 124; + public static readonly FALSE = 125; + public static readonly NULL = 126; + public static readonly ARROW = 127; + public static readonly COLON = 128; + public static readonly SEMI = 129; + public static readonly COMMA = 130; + public static readonly DOT = 131; + public static readonly LBRACE = 132; + public static readonly RBRACE = 133; + public static readonly LBRACK = 134; + public static readonly RBRACK = 135; + public static readonly LPAREN = 136; + public static readonly RPAREN = 137; + public static readonly LT = 138; + public static readonly GT = 139; + public static readonly AMP = 140; + public static readonly EQUAL = 141; + public static readonly INTEGER = 142; + public static readonly JSON_NUMBER = 143; + public static readonly IDENTIFIER = 144; + public static readonly STRING_LITERAL = 145; + public static readonly LINE_COMMENT = 146; + public static readonly BLOCK_COMMENT = 147; + public static readonly WS = 148; public static readonly RULE_document = 0; public static readonly RULE_fragmentDecl = 1; public static readonly RULE_sourceImportDecl = 2; @@ -249,18 +250,18 @@ export class QuixosCapabilityParser extends antlr.Parser { "'to'", "'private'", "'shared'", "'state'", "'edge'", "'projection'", "'with'", "'using'", "'accept'", "'via'", "'materialize'", "'if'", "'absent'", "'on'", "'policy'", "'default'", "'source'", "'repository'", - "'commit'", "'revision'", "'semantic-major'", "'on-delete'", "'retain-other'", - "'keyed'", "'public-traversal'", "'id'", "'doc'", "'mode'", "'emits'", - "'receiver'", "'requires'", "'any'", "'get'", "'set'", "'watch'", - "'start'", "'stop'", "'read'", "'write'", "'resolve'", "'connect'", - "'disconnect'", "'call'", "'watch-start'", "'watch-stop'", "'subscribe'", - "'unsubscribe'", "'register'", "'crdt'", "'optional-one'", "'exactly-one'", - "'many-unique'", "'many'", "'ordered'", "'unit'", "'watch-handle'", - "'message'", "'atom-ref'", "'interface-ref'", "'optional'", "'list'", - "'record'", "'bool'", "'bytes'", "'double'", "'int32'", "'int64'", - "'string'", "'uint32'", "'uint64'", "'true'", "'false'", "'null'", - "'->'", "':'", "';'", "','", "'.'", "'{'", "'}'", "'['", "']'", - "'('", "')'", "'<'", "'>'", "'&'", "'='" + "'commit'", "'revision'", "'semantic-major'", "'on-delete'", "'lifecycle'", + "'retain-other'", "'keyed'", "'public-traversal'", "'id'", "'doc'", + "'mode'", "'emits'", "'receiver'", "'requires'", "'any'", "'get'", + "'set'", "'watch'", "'start'", "'stop'", "'read'", "'write'", "'resolve'", + "'connect'", "'disconnect'", "'call'", "'watch-start'", "'watch-stop'", + "'subscribe'", "'unsubscribe'", "'register'", "'crdt'", "'optional-one'", + "'exactly-one'", "'many-unique'", "'many'", "'ordered'", "'unit'", + "'watch-handle'", "'message'", "'atom-ref'", "'interface-ref'", + "'optional'", "'list'", "'record'", "'bool'", "'bytes'", "'double'", + "'int32'", "'int64'", "'string'", "'uint32'", "'uint64'", "'true'", + "'false'", "'null'", "'->'", "':'", "';'", "','", "'.'", "'{'", + "'}'", "'['", "']'", "'('", "')'", "'<'", "'>'", "'&'", "'='" ]; public static readonly symbolicNames = [ @@ -276,18 +277,18 @@ export class QuixosCapabilityParser extends antlr.Parser { "STATE", "EDGE", "PROJECTION", "WITH", "USING", "ACCEPT", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", - "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", - "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", - "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", - "WATCH_START", "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "REGISTER", - "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", - "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", - "OPTIONAL", "LIST", "RECORD", "BOOL", "BYTES", "DOUBLE", "INT32", - "INT64", "STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", - "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", - "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "AMP", "EQUAL", "INTEGER", - "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", - "WS" + "LIFECYCLE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", + "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", + "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", + "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", + "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", + "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", + "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", "BOOL", + "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", + "TRUE", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", + "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", + "GT", "AMP", "EQUAL", "INTEGER", "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", + "LINE_COMMENT", "BLOCK_COMMENT", "WS" ]; public static readonly ruleNames = [ "document", "fragmentDecl", "sourceImportDecl", "workspaceDecl", @@ -763,7 +764,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 246; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 79) { + if (_la === 80) { { this.state = 244; this.match(QuixosCapabilityParser.DOC); @@ -817,7 +818,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 259; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 137) { + if (_la === 138) { { this.state = 258; this.typeParameters(); @@ -835,7 +836,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 274; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 83) { + if (_la === 84) { { this.state = 265; this.match(QuixosCapabilityParser.REQUIRES); @@ -844,7 +845,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 271; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 129) { + while (_la === 130) { { { this.state = 267; @@ -907,7 +908,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 291; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 129) { + while (_la === 130) { { { this.state = 287; @@ -955,7 +956,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 300; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 127) { + if (_la === 128) { { this.state = 298; this.match(QuixosCapabilityParser.COLON); @@ -985,7 +986,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 310; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 139) { + while (_la === 140) { { { this.state = 306; @@ -1032,7 +1033,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 319; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 137) { + if (_la === 138) { { this.state = 318; this.typeArguments(); @@ -1068,7 +1069,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 327; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 129) { + while (_la === 130) { { { this.state = 323; @@ -1219,7 +1220,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 344; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 137) { + if (_la === 138) { { this.state = 343; this.typeParameters(); @@ -1394,7 +1395,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 389; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 1 || ((((_la - 85)) & ~0x1F) === 0 && ((1 << (_la - 85)) & 7) !== 0)) { + while (_la === 1 || ((((_la - 86)) & ~0x1F) === 0 && ((1 << (_la - 86)) & 7) !== 0)) { { { this.state = 386; @@ -1571,7 +1572,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 440; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 106) { + if (_la === 107) { { this.state = 439; this.match(QuixosCapabilityParser.ORDERED); @@ -1581,7 +1582,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 444; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 76) { + if (_la === 77) { { this.state = 442; this.match(QuixosCapabilityParser.KEYED); @@ -1595,7 +1596,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 450; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 87)) & ~0x1F) === 0 && ((1 << (_la - 87)) & 225) !== 0)) { + while (((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 225) !== 0)) { { { this.state = 447; @@ -1806,7 +1807,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 499; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 137) { + if (_la === 138) { { this.state = 498; this.typeArguments(); @@ -1990,7 +1991,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 540; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 137) { + if (_la === 138) { { this.state = 539; this.typeParameters(); @@ -2028,7 +2029,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 557; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 130029568) !== 0) || _la === 87) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 130029568) !== 0) || _la === 88) { { { this.state = 554; @@ -2244,7 +2245,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 616; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 137) { + if (_la === 138) { { this.state = 615; this.typeParameters(); @@ -2280,7 +2281,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 630; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 81) { + if (_la === 82) { { this.state = 629; this.eventClause(); @@ -2294,7 +2295,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 635; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 83) { + if (_la === 84) { { this.state = 634; this.dependencyBlock(); @@ -2342,7 +2343,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 645; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 137) { + if (_la === 138) { { this.state = 644; this.typeParameters(); @@ -2374,7 +2375,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 657; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 83) { + if (_la === 84) { { this.state = 656; this.dependencyBlock(); @@ -2507,7 +2508,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 686; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 129) { + while (_la === 130) { { { this.state = 682; @@ -2563,7 +2564,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 700; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 83) { + if (_la === 84) { { this.state = 699; this.dependencyBlock(); @@ -2621,7 +2622,7 @@ export class QuixosCapabilityParser extends antlr.Parser { { this.state = 707; _la = this.tokenStream.LA(1); - if(!(((((_la - 95)) & ~0x1F) === 0 && ((1 << (_la - 95)) & 31) !== 0))) { + if(!(((((_la - 96)) & ~0x1F) === 0 && ((1 << (_la - 96)) & 31) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2686,14 +2687,14 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 724; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 4099) !== 0) || _la === 143) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 89)) & ~0x1F) === 0 && ((1 << (_la - 89)) & 4099) !== 0) || _la === 144) { { this.state = 716; this.interfaceType(); this.state = 721; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 129) { + while (_la === 130) { { { this.state = 717; @@ -2742,7 +2743,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 734; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 129) { + while (_la === 130) { { { this.state = 730; @@ -2903,7 +2904,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 782; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 137) { + if (_la === 138) { { this.state = 781; this.typeArguments(); @@ -3044,7 +3045,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 833; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 129) { + while (_la === 130) { { { this.state = 829; @@ -3083,7 +3084,7 @@ export class QuixosCapabilityParser extends antlr.Parser { { this.state = 838; _la = this.tokenStream.LA(1); - if(!(_la === 1 || ((((_la - 90)) & ~0x1F) === 0 && ((1 << (_la - 90)) & 223) !== 0))) { + if(!(_la === 1 || ((((_la - 91)) & ~0x1F) === 0 && ((1 << (_la - 91)) & 223) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -3327,7 +3328,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 887; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 106) { + if (_la === 107) { { this.state = 886; this.match(QuixosCapabilityParser.ORDERED); @@ -3349,7 +3350,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 894; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 75) { + if (_la === 76) { { this.state = 893; this.match(QuixosCapabilityParser.RETAIN_OTHER); @@ -3359,7 +3360,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 898; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 76) { + if (_la === 77) { { this.state = 896; this.match(QuixosCapabilityParser.KEYED); @@ -3371,7 +3372,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 901; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 77) { + if (_la === 78) { { this.state = 900; this.match(QuixosCapabilityParser.PUBLIC_TRAVERSAL); @@ -3413,7 +3414,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 910; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 137) { + if (_la === 138) { { this.state = 909; this.typeArguments(); @@ -3423,7 +3424,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 914; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 78) { + if (_la === 79) { { this.state = 912; this.match(QuixosCapabilityParser.ID); @@ -3550,7 +3551,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 942; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 4099) !== 0) || _la === 143) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 89)) & ~0x1F) === 0 && ((1 << (_la - 89)) & 4099) !== 0) || _la === 144) { { { this.state = 939; @@ -3652,7 +3653,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 971; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 130) { + while (_la === 131) { { { this.state = 967; @@ -3944,99 +3945,110 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 120, QuixosCapabilityParser.RULE_operationProvider); let _la: number; try { - this.state = 1058; + this.state = 1061; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { - case QuixosCapabilityParser.STATE: + case QuixosCapabilityParser.LIFECYCLE: this.enterOuterAlt(localContext, 1); { this.state = 1025; - this.match(QuixosCapabilityParser.STATE); + this.match(QuixosCapabilityParser.LIFECYCLE); this.state = 1026; - this.identifier(); - this.state = 1027; this.match(QuixosCapabilityParser.DOT); + this.state = 1027; + this.identifier(); + } + break; + case QuixosCapabilityParser.STATE: + this.enterOuterAlt(localContext, 2); + { this.state = 1028; + this.match(QuixosCapabilityParser.STATE); + this.state = 1029; + this.identifier(); + this.state = 1030; + this.match(QuixosCapabilityParser.DOT); + this.state = 1031; this.statePrimitive(); } break; case QuixosCapabilityParser.EDGE: - this.enterOuterAlt(localContext, 2); + this.enterOuterAlt(localContext, 3); { - this.state = 1030; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1031; - this.identifier(); - this.state = 1032; - this.match(QuixosCapabilityParser.DOT); this.state = 1033; - this.identifier(); + this.match(QuixosCapabilityParser.EDGE); this.state = 1034; - this.match(QuixosCapabilityParser.DOT); + this.identifier(); this.state = 1035; + this.match(QuixosCapabilityParser.DOT); + this.state = 1036; + this.identifier(); + this.state = 1037; + this.match(QuixosCapabilityParser.DOT); + this.state = 1038; this.edgePrimitive(); } break; case QuixosCapabilityParser.INTERFACE: - this.enterOuterAlt(localContext, 3); + this.enterOuterAlt(localContext, 4); { - this.state = 1037; - this.match(QuixosCapabilityParser.INTERFACE); - this.state = 1038; - this.identifier(); this.state = 1040; + this.match(QuixosCapabilityParser.INTERFACE); + this.state = 1041; + this.identifier(); + this.state = 1043; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 137) { + if (_la === 138) { { - this.state = 1039; + this.state = 1042; this.typeArguments(); } } - this.state = 1042; + this.state = 1045; this.match(QuixosCapabilityParser.DOT); - this.state = 1043; + this.state = 1046; this.memberOperationRef(); } break; case QuixosCapabilityParser.PACKAGE: - this.enterOuterAlt(localContext, 4); + this.enterOuterAlt(localContext, 5); { - this.state = 1045; - this.match(QuixosCapabilityParser.PACKAGE); - this.state = 1046; - this.identifier(); - this.state = 1047; - this.match(QuixosCapabilityParser.DOT); this.state = 1048; + this.match(QuixosCapabilityParser.PACKAGE); + this.state = 1049; this.identifier(); this.state = 1050; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 137) { - { - this.state = 1049; - this.typeArguments(); - } - } - + this.match(QuixosCapabilityParser.DOT); + this.state = 1051; + this.identifier(); this.state = 1053; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 59) { + if (_la === 138) { { this.state = 1052; - this.dependencyBindingBlock(); + this.typeArguments(); } } this.state = 1056; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 61) { + if (_la === 59) { { this.state = 1055; + this.dependencyBindingBlock(); + } + } + + this.state = 1059; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 61) { + { + this.state = 1058; this.acceptanceBinding(); } } @@ -4066,9 +4078,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1060; + this.state = 1063; this.match(QuixosCapabilityParser.ACCEPT); - this.state = 1061; + this.state = 1064; this.dependencyBindingBlock(); } } @@ -4092,9 +4104,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1063; + this.state = 1066; _la = this.tokenStream.LA(1); - if(!(_la === 1 || ((((_la - 90)) & ~0x1F) === 0 && ((1 << (_la - 90)) & 195) !== 0))) { + if(!(_la === 1 || ((((_la - 91)) & ~0x1F) === 0 && ((1 << (_la - 91)) & 195) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4123,9 +4135,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1065; + this.state = 1068; _la = this.tokenStream.LA(1); - if(!(((((_la - 92)) & ~0x1F) === 0 && ((1 << (_la - 92)) & 55) !== 0))) { + if(!(((((_la - 93)) & ~0x1F) === 0 && ((1 << (_la - 93)) & 55) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4154,25 +4166,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1067; + this.state = 1070; this.match(QuixosCapabilityParser.WITH); - this.state = 1068; + this.state = 1071; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1072; + this.state = 1075; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 4099) !== 0) || _la === 143) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 89)) & ~0x1F) === 0 && ((1 << (_la - 89)) & 4099) !== 0) || _la === 144) { { { - this.state = 1069; + this.state = 1072; this.dependencyBinding(); } } - this.state = 1074; + this.state = 1077; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1075; + this.state = 1078; this.match(QuixosCapabilityParser.RBRACE); } } @@ -4194,136 +4206,136 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 130, QuixosCapabilityParser.RULE_dependencyBinding); let _la: number; try { - this.state = 1175; + this.state = 1178; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 104, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1077; - this.identifier(); - this.state = 1078; - this.match(QuixosCapabilityParser.TO); - this.state = 1079; - this.match(QuixosCapabilityParser.WORKSPACE); this.state = 1080; - this.match(QuixosCapabilityParser.REFLECTION); + this.identifier(); this.state = 1081; - this.match(QuixosCapabilityParser.LBRACK); + this.match(QuixosCapabilityParser.TO); this.state = 1082; - this.identifierList(); + this.match(QuixosCapabilityParser.WORKSPACE); this.state = 1083; - this.match(QuixosCapabilityParser.RBRACK); + this.match(QuixosCapabilityParser.REFLECTION); this.state = 1084; + this.match(QuixosCapabilityParser.LBRACK); + this.state = 1085; + this.identifierList(); + this.state = 1086; + this.match(QuixosCapabilityParser.RBRACK); + this.state = 1087; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1086; - this.identifier(); - this.state = 1087; - this.match(QuixosCapabilityParser.TO); - this.state = 1088; - this.match(QuixosCapabilityParser.STATE); this.state = 1089; this.identifier(); - this.state = 1096; + this.state = 1090; + this.match(QuixosCapabilityParser.TO); + this.state = 1091; + this.match(QuixosCapabilityParser.STATE); + this.state = 1092; + this.identifier(); + this.state = 1099; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 62) { { - this.state = 1090; - this.match(QuixosCapabilityParser.VIA); - this.state = 1091; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1092; - this.identifier(); this.state = 1093; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.VIA); this.state = 1094; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1095; + this.identifier(); + this.state = 1096; + this.match(QuixosCapabilityParser.DOT); + this.state = 1097; this.identifier(); } } - this.state = 1098; + this.state = 1101; this.match(QuixosCapabilityParser.SEMI); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1100; - this.identifier(); - this.state = 1101; - this.match(QuixosCapabilityParser.TO); - this.state = 1102; - this.match(QuixosCapabilityParser.EDGE); this.state = 1103; this.identifier(); this.state = 1104; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.TO); this.state = 1105; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1106; this.identifier(); - this.state = 1112; + this.state = 1107; + this.match(QuixosCapabilityParser.DOT); + this.state = 1108; + this.identifier(); + this.state = 1115; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 62) { { - this.state = 1106; - this.match(QuixosCapabilityParser.VIA); - this.state = 1107; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1108; - this.identifier(); this.state = 1109; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.VIA); this.state = 1110; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1111; + this.identifier(); + this.state = 1112; + this.match(QuixosCapabilityParser.DOT); + this.state = 1113; this.identifier(); } } - this.state = 1114; + this.state = 1117; this.match(QuixosCapabilityParser.SEMI); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1116; - this.identifier(); - this.state = 1117; - this.match(QuixosCapabilityParser.TO); - this.state = 1118; - this.match(QuixosCapabilityParser.INTERFACE); this.state = 1119; this.identifier(); + this.state = 1120; + this.match(QuixosCapabilityParser.TO); this.state = 1121; + this.match(QuixosCapabilityParser.INTERFACE); + this.state = 1122; + this.identifier(); + this.state = 1124; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 137) { + if (_la === 138) { { - this.state = 1120; + this.state = 1123; this.typeArguments(); } } - this.state = 1131; + this.state = 1134; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.VIA: { { - this.state = 1123; - this.match(QuixosCapabilityParser.VIA); - this.state = 1124; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1125; - this.identifier(); this.state = 1126; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.VIA); this.state = 1127; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1128; + this.identifier(); + this.state = 1129; + this.match(QuixosCapabilityParser.DOT); + this.state = 1130; this.identifier(); } } @@ -4331,9 +4343,9 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.FROM: { { - this.state = 1129; + this.state = 1132; this.match(QuixosCapabilityParser.FROM); - this.state = 1130; + this.state = 1133; this.match(QuixosCapabilityParser.INPUT); } } @@ -4343,104 +4355,104 @@ export class QuixosCapabilityParser extends antlr.Parser { default: break; } - this.state = 1133; + this.state = 1136; this.match(QuixosCapabilityParser.SEMI); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1135; - this.identifier(); - this.state = 1136; - this.match(QuixosCapabilityParser.TO); - this.state = 1137; - this.match(QuixosCapabilityParser.CREATION); this.state = 1138; this.identifier(); this.state = 1139; - this.match(QuixosCapabilityParser.WITH); + this.match(QuixosCapabilityParser.TO); this.state = 1140; + this.match(QuixosCapabilityParser.CREATION); + this.state = 1141; + this.identifier(); + this.state = 1142; + this.match(QuixosCapabilityParser.WITH); + this.state = 1143; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1144; + this.state = 1147; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 4099) !== 0) || _la === 143) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 89)) & ~0x1F) === 0 && ((1 << (_la - 89)) & 4099) !== 0) || _la === 144) { { { - this.state = 1141; + this.state = 1144; this.creationOwnerMapping(); } } - this.state = 1146; + this.state = 1149; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1147; + this.state = 1150; this.match(QuixosCapabilityParser.RBRACE); - this.state = 1148; + this.state = 1151; this.match(QuixosCapabilityParser.SEMI); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1150; - this.identifier(); - this.state = 1151; - this.match(QuixosCapabilityParser.TO); - this.state = 1152; - this.match(QuixosCapabilityParser.CONSTRUCTOR); this.state = 1153; this.identifier(); this.state = 1154; + this.match(QuixosCapabilityParser.TO); + this.state = 1155; + this.match(QuixosCapabilityParser.CONSTRUCTOR); + this.state = 1156; + this.identifier(); + this.state = 1157; this.match(QuixosCapabilityParser.SEMI); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 1156; - this.identifier(); - this.state = 1157; - this.match(QuixosCapabilityParser.TO); this.state = 1159; + this.identifier(); + this.state = 1160; + this.match(QuixosCapabilityParser.TO); + this.state = 1162; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 4) { { - this.state = 1158; + this.state = 1161; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 1161; - this.match(QuixosCapabilityParser.QUERY); - this.state = 1162; - this.identifier(); - this.state = 1163; - this.match(QuixosCapabilityParser.DOT); this.state = 1164; + this.match(QuixosCapabilityParser.QUERY); + this.state = 1165; this.identifier(); - this.state = 1171; + this.state = 1166; + this.match(QuixosCapabilityParser.DOT); + this.state = 1167; + this.identifier(); + this.state = 1174; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 62) { { - this.state = 1165; - this.match(QuixosCapabilityParser.VIA); - this.state = 1166; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1167; - this.identifier(); this.state = 1168; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.VIA); this.state = 1169; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1170; + this.identifier(); + this.state = 1171; + this.match(QuixosCapabilityParser.DOT); + this.state = 1172; this.identifier(); } } - this.state = 1173; + this.state = 1176; this.match(QuixosCapabilityParser.SEMI); } break; @@ -4466,29 +4478,29 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1177; - this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1178; - this.identifier(); - this.state = 1179; - this.match(QuixosCapabilityParser.TO); this.state = 1180; - this.identifier(); + this.match(QuixosCapabilityParser.CONSTRUCTOR); this.state = 1181; - this.match(QuixosCapabilityParser.DOT); + this.identifier(); this.state = 1182; + this.match(QuixosCapabilityParser.TO); + this.state = 1183; this.identifier(); this.state = 1184; + this.match(QuixosCapabilityParser.DOT); + this.state = 1185; + this.identifier(); + this.state = 1187; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 59) { { - this.state = 1183; + this.state = 1186; this.dependencyBindingBlock(); } } - this.state = 1186; + this.state = 1189; this.match(QuixosCapabilityParser.SEMI); } } @@ -4510,7 +4522,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 134, QuixosCapabilityParser.RULE_valueType); let _la: number; try { - this.state = 1234; + this.state = 1237; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.BOOL: @@ -4523,130 +4535,130 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.UINT64: this.enterOuterAlt(localContext, 1); { - this.state = 1188; + this.state = 1191; this.scalarType(); } break; case QuixosCapabilityParser.UNIT: this.enterOuterAlt(localContext, 2); { - this.state = 1189; + this.state = 1192; this.match(QuixosCapabilityParser.UNIT); } break; case QuixosCapabilityParser.WATCH_HANDLE: this.enterOuterAlt(localContext, 3); { - this.state = 1190; + this.state = 1193; this.match(QuixosCapabilityParser.WATCH_HANDLE); } break; case QuixosCapabilityParser.MESSAGE: this.enterOuterAlt(localContext, 4); { - this.state = 1191; + this.state = 1194; this.match(QuixosCapabilityParser.MESSAGE); - this.state = 1192; + this.state = 1195; this.stringLiteral(); } break; case QuixosCapabilityParser.ATOM_REF: this.enterOuterAlt(localContext, 5); { - this.state = 1193; - this.match(QuixosCapabilityParser.ATOM_REF); - this.state = 1194; - this.match(QuixosCapabilityParser.LT); - this.state = 1195; - this.identifier(); this.state = 1196; + this.match(QuixosCapabilityParser.ATOM_REF); + this.state = 1197; + this.match(QuixosCapabilityParser.LT); + this.state = 1198; + this.identifier(); + this.state = 1199; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.INTERFACE_REF: this.enterOuterAlt(localContext, 6); { - this.state = 1198; + this.state = 1201; this.match(QuixosCapabilityParser.INTERFACE_REF); - this.state = 1199; - this.match(QuixosCapabilityParser.LT); - this.state = 1200; - this.identifier(); this.state = 1202; + this.match(QuixosCapabilityParser.LT); + this.state = 1203; + this.identifier(); + this.state = 1205; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 137) { + if (_la === 138) { { - this.state = 1201; + this.state = 1204; this.typeArguments(); } } - this.state = 1204; + this.state = 1207; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.REF: this.enterOuterAlt(localContext, 7); { - this.state = 1206; - this.match(QuixosCapabilityParser.REF); - this.state = 1207; - this.match(QuixosCapabilityParser.LT); - this.state = 1208; - this.identifier(); this.state = 1209; + this.match(QuixosCapabilityParser.REF); + this.state = 1210; + this.match(QuixosCapabilityParser.LT); + this.state = 1211; + this.identifier(); + this.state = 1212; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.OPTIONAL: this.enterOuterAlt(localContext, 8); { - this.state = 1211; - this.match(QuixosCapabilityParser.OPTIONAL); - this.state = 1212; - this.match(QuixosCapabilityParser.LT); - this.state = 1213; - this.valueType(); this.state = 1214; + this.match(QuixosCapabilityParser.OPTIONAL); + this.state = 1215; + this.match(QuixosCapabilityParser.LT); + this.state = 1216; + this.valueType(); + this.state = 1217; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.LIST: this.enterOuterAlt(localContext, 9); { - this.state = 1216; - this.match(QuixosCapabilityParser.LIST); - this.state = 1217; - this.match(QuixosCapabilityParser.LT); - this.state = 1218; - this.valueType(); this.state = 1219; + this.match(QuixosCapabilityParser.LIST); + this.state = 1220; + this.match(QuixosCapabilityParser.LT); + this.state = 1221; + this.valueType(); + this.state = 1222; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.RECORD: this.enterOuterAlt(localContext, 10); { - this.state = 1221; + this.state = 1224; this.match(QuixosCapabilityParser.RECORD); - this.state = 1222; + this.state = 1225; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1226; + this.state = 1229; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 4099) !== 0) || _la === 143) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 89)) & ~0x1F) === 0 && ((1 << (_la - 89)) & 4099) !== 0) || _la === 144) { { { - this.state = 1223; + this.state = 1226; this.recordField(); } } - this.state = 1228; + this.state = 1231; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1229; + this.state = 1232; this.match(QuixosCapabilityParser.RBRACE); } break; @@ -4685,14 +4697,14 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 11); { - this.state = 1230; + this.state = 1233; this.identifier(); - this.state = 1232; + this.state = 1235; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 137) { + if (_la === 138) { { - this.state = 1231; + this.state = 1234; this.typeArguments(); } } @@ -4722,13 +4734,13 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1236; - this.identifier(); - this.state = 1237; - this.match(QuixosCapabilityParser.COLON); - this.state = 1238; - this.valueType(); this.state = 1239; + this.identifier(); + this.state = 1240; + this.match(QuixosCapabilityParser.COLON); + this.state = 1241; + this.valueType(); + this.state = 1242; this.match(QuixosCapabilityParser.SEMI); } } @@ -4752,9 +4764,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1241; + this.state = 1244; _la = this.tokenStream.LA(1); - if(!(((((_la - 115)) & ~0x1F) === 0 && ((1 << (_la - 115)) & 255) !== 0))) { + if(!(((((_la - 116)) & ~0x1F) === 0 && ((1 << (_la - 116)) & 255) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4783,9 +4795,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1243; + this.state = 1246; _la = this.tokenStream.LA(1); - if(!(((((_la - 102)) & ~0x1F) === 0 && ((1 << (_la - 102)) & 15) !== 0))) { + if(!(((((_la - 103)) & ~0x1F) === 0 && ((1 << (_la - 103)) & 15) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4811,62 +4823,62 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new JsonLiteralContext(this.context, this.state); this.enterRule(localContext, 142, QuixosCapabilityParser.RULE_jsonLiteral); try { - this.state = 1253; + this.state = 1256; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STRING_LITERAL: this.enterOuterAlt(localContext, 1); { - this.state = 1245; + this.state = 1248; this.stringLiteral(); } break; case QuixosCapabilityParser.INTEGER: this.enterOuterAlt(localContext, 2); { - this.state = 1246; + this.state = 1249; this.match(QuixosCapabilityParser.INTEGER); } break; case QuixosCapabilityParser.JSON_NUMBER: this.enterOuterAlt(localContext, 3); { - this.state = 1247; + this.state = 1250; this.match(QuixosCapabilityParser.JSON_NUMBER); } break; case QuixosCapabilityParser.TRUE: this.enterOuterAlt(localContext, 4); { - this.state = 1248; + this.state = 1251; this.match(QuixosCapabilityParser.TRUE); } break; case QuixosCapabilityParser.FALSE: this.enterOuterAlt(localContext, 5); { - this.state = 1249; + this.state = 1252; this.match(QuixosCapabilityParser.FALSE); } break; case QuixosCapabilityParser.NULL: this.enterOuterAlt(localContext, 6); { - this.state = 1250; + this.state = 1253; this.match(QuixosCapabilityParser.NULL); } break; case QuixosCapabilityParser.LBRACE: this.enterOuterAlt(localContext, 7); { - this.state = 1251; + this.state = 1254; this.jsonObject(); } break; case QuixosCapabilityParser.LBRACK: this.enterOuterAlt(localContext, 8); { - this.state = 1252; + this.state = 1255; this.jsonArray(); } break; @@ -4894,35 +4906,35 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1255; + this.state = 1258; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1264; + this.state = 1267; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 144) { + if (_la === 145) { { - this.state = 1256; + this.state = 1259; this.jsonMember(); - this.state = 1261; + this.state = 1264; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 129) { + while (_la === 130) { { { - this.state = 1257; + this.state = 1260; this.match(QuixosCapabilityParser.COMMA); - this.state = 1258; + this.state = 1261; this.jsonMember(); } } - this.state = 1263; + this.state = 1266; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1266; + this.state = 1269; this.match(QuixosCapabilityParser.RBRACE); } } @@ -4945,11 +4957,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1268; + this.state = 1271; this.stringLiteral(); - this.state = 1269; + this.state = 1272; this.match(QuixosCapabilityParser.COLON); - this.state = 1270; + this.state = 1273; this.jsonLiteral(); } } @@ -4973,35 +4985,35 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1272; + this.state = 1275; this.match(QuixosCapabilityParser.LBRACK); - this.state = 1281; + this.state = 1284; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (((((_la - 123)) & ~0x1F) === 0 && ((1 << (_la - 123)) & 2884871) !== 0)) { + if (((((_la - 124)) & ~0x1F) === 0 && ((1 << (_la - 124)) & 2884871) !== 0)) { { - this.state = 1273; + this.state = 1276; this.jsonLiteral(); - this.state = 1278; + this.state = 1281; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 129) { + while (_la === 130) { { { - this.state = 1274; + this.state = 1277; this.match(QuixosCapabilityParser.COMMA); - this.state = 1275; + this.state = 1278; this.jsonLiteral(); } } - this.state = 1280; + this.state = 1283; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1283; + this.state = 1286; this.match(QuixosCapabilityParser.RBRACK); } } @@ -5025,9 +5037,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1285; + this.state = 1288; _la = this.tokenStream.LA(1); - if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 4099) !== 0) || _la === 143)) { + if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 89)) & ~0x1F) === 0 && ((1 << (_la - 89)) & 4099) !== 0) || _la === 144)) { this.errorHandler.recoverInline(this); } else { @@ -5055,7 +5067,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1287; + this.state = 1290; this.match(QuixosCapabilityParser.STRING_LITERAL); } } @@ -5074,7 +5086,7 @@ export class QuixosCapabilityParser extends antlr.Parser { } public static readonly _serializedATN: number[] = [ - 4,1,147,1290,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,148,1293,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, @@ -5160,416 +5172,418 @@ export class QuixosCapabilityParser extends antlr.Parser { 1,57,1,57,1,57,1,57,1,57,3,57,1004,8,57,1,57,1,57,1,58,1,58,1,58, 1,58,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,1024,8,59,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60, - 1,60,1,60,1,60,1,60,1,60,3,60,1041,8,60,1,60,1,60,1,60,1,60,1,60, - 1,60,1,60,1,60,3,60,1051,8,60,1,60,3,60,1054,8,60,1,60,3,60,1057, - 8,60,3,60,1059,8,60,1,61,1,61,1,61,1,62,1,62,1,63,1,63,1,64,1,64, - 1,64,5,64,1071,8,64,10,64,12,64,1074,9,64,1,64,1,64,1,65,1,65,1, - 65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1, - 65,1,65,1,65,1,65,3,65,1097,8,65,1,65,1,65,1,65,1,65,1,65,1,65,1, - 65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65,1113,8,65,1,65,1,65,1, - 65,1,65,1,65,1,65,1,65,3,65,1122,8,65,1,65,1,65,1,65,1,65,1,65,1, - 65,1,65,1,65,3,65,1132,8,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1, - 65,1,65,5,65,1143,8,65,10,65,12,65,1146,9,65,1,65,1,65,1,65,1,65, - 1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65,1160,8,65,1,65,1,65, - 1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65,1172,8,65,1,65,1,65, - 3,65,1176,8,65,1,66,1,66,1,66,1,66,1,66,1,66,1,66,3,66,1185,8,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,67, - 1,67,1,67,1,67,3,67,1203,8,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67, + 1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,3,60,1044,8,60,1,60,1,60, + 1,60,1,60,1,60,1,60,1,60,1,60,3,60,1054,8,60,1,60,3,60,1057,8,60, + 1,60,3,60,1060,8,60,3,60,1062,8,60,1,61,1,61,1,61,1,62,1,62,1,63, + 1,63,1,64,1,64,1,64,5,64,1074,8,64,10,64,12,64,1077,9,64,1,64,1, + 64,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1, + 65,1,65,1,65,1,65,1,65,1,65,1,65,3,65,1100,8,65,1,65,1,65,1,65,1, + 65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65,1116,8, + 65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65,1125,8,65,1,65,1,65,1, + 65,1,65,1,65,1,65,1,65,1,65,3,65,1135,8,65,1,65,1,65,1,65,1,65,1, + 65,1,65,1,65,1,65,1,65,5,65,1146,8,65,10,65,12,65,1149,9,65,1,65, + 1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65,1163, + 8,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65,1175, + 8,65,1,65,1,65,3,65,1179,8,65,1,66,1,66,1,66,1,66,1,66,1,66,1,66, + 3,66,1188,8,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,67,1,67,1,67,1,67,3,67,1206,8,67,1,67,1,67,1,67,1,67, 1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67, - 5,67,1225,8,67,10,67,12,67,1228,9,67,1,67,1,67,1,67,3,67,1233,8, - 67,3,67,1235,8,67,1,68,1,68,1,68,1,68,1,68,1,69,1,69,1,70,1,70,1, - 71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,3,71,1254,8,71,1,72,1,72,1, - 72,1,72,5,72,1260,8,72,10,72,12,72,1263,9,72,3,72,1265,8,72,1,72, - 1,72,1,73,1,73,1,73,1,73,1,74,1,74,1,74,1,74,5,74,1277,8,74,10,74, - 12,74,1280,9,74,3,74,1282,8,74,1,74,1,74,1,75,1,75,1,76,1,76,1,76, - 0,0,77,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, - 0,9,2,0,10,10,28,28,1,0,6,7,1,0,95,99,3,0,1,1,90,94,96,97,3,0,1, - 1,90,91,96,97,2,0,92,94,96,97,1,0,115,122,1,0,102,105,7,0,1,3,5, - 28,40,40,69,69,88,89,100,100,143,143,1396,0,166,1,0,0,0,2,168,1, - 0,0,0,4,178,1,0,0,0,6,182,1,0,0,0,8,206,1,0,0,0,10,218,1,0,0,0,12, - 220,1,0,0,0,14,227,1,0,0,0,16,238,1,0,0,0,18,240,1,0,0,0,20,253, - 1,0,0,0,22,285,1,0,0,0,24,315,1,0,0,0,26,317,1,0,0,0,28,321,1,0, - 0,0,30,339,1,0,0,0,32,341,1,0,0,0,34,353,1,0,0,0,36,356,1,0,0,0, - 38,377,1,0,0,0,40,427,1,0,0,0,42,430,1,0,0,0,44,455,1,0,0,0,46,492, - 1,0,0,0,48,503,1,0,0,0,50,508,1,0,0,0,52,535,1,0,0,0,54,537,1,0, - 0,0,56,562,1,0,0,0,58,611,1,0,0,0,60,613,1,0,0,0,62,642,1,0,0,0, - 64,664,1,0,0,0,66,677,1,0,0,0,68,679,1,0,0,0,70,691,1,0,0,0,72,704, - 1,0,0,0,74,707,1,0,0,0,76,727,1,0,0,0,78,729,1,0,0,0,80,737,1,0, - 0,0,82,825,1,0,0,0,84,827,1,0,0,0,86,838,1,0,0,0,88,840,1,0,0,0, - 90,845,1,0,0,0,92,847,1,0,0,0,94,869,1,0,0,0,96,871,1,0,0,0,98,880, - 1,0,0,0,100,905,1,0,0,0,102,935,1,0,0,0,104,937,1,0,0,0,106,962, - 1,0,0,0,108,964,1,0,0,0,110,976,1,0,0,0,112,983,1,0,0,0,114,997, - 1,0,0,0,116,1007,1,0,0,0,118,1023,1,0,0,0,120,1058,1,0,0,0,122,1060, - 1,0,0,0,124,1063,1,0,0,0,126,1065,1,0,0,0,128,1067,1,0,0,0,130,1175, - 1,0,0,0,132,1177,1,0,0,0,134,1234,1,0,0,0,136,1236,1,0,0,0,138,1241, - 1,0,0,0,140,1243,1,0,0,0,142,1253,1,0,0,0,144,1255,1,0,0,0,146,1268, - 1,0,0,0,148,1272,1,0,0,0,150,1285,1,0,0,0,152,1287,1,0,0,0,154,155, - 3,6,3,0,155,156,5,0,0,1,156,167,1,0,0,0,157,158,3,20,10,0,158,159, - 5,0,0,1,159,167,1,0,0,0,160,161,3,50,25,0,161,162,5,0,0,1,162,167, - 1,0,0,0,163,164,3,2,1,0,164,165,5,0,0,1,165,167,1,0,0,0,166,154, - 1,0,0,0,166,157,1,0,0,0,166,160,1,0,0,0,166,163,1,0,0,0,167,1,1, - 0,0,0,168,169,5,35,0,0,169,173,5,131,0,0,170,172,3,8,4,0,171,170, - 1,0,0,0,172,175,1,0,0,0,173,171,1,0,0,0,173,174,1,0,0,0,174,176, - 1,0,0,0,175,173,1,0,0,0,176,177,5,132,0,0,177,3,1,0,0,0,178,179, - 5,36,0,0,179,180,3,152,76,0,180,181,5,128,0,0,181,5,1,0,0,0,182, - 183,5,4,0,0,183,184,3,150,75,0,184,185,5,78,0,0,185,186,3,152,76, - 0,186,187,5,72,0,0,187,188,3,152,76,0,188,189,5,71,0,0,189,190,3, - 152,76,0,190,194,5,131,0,0,191,193,3,8,4,0,192,191,1,0,0,0,193,196, - 1,0,0,0,194,192,1,0,0,0,194,195,1,0,0,0,195,197,1,0,0,0,196,194, - 1,0,0,0,197,198,5,132,0,0,198,7,1,0,0,0,199,207,3,4,2,0,200,207, - 3,18,9,0,201,207,3,10,5,0,202,207,3,88,44,0,203,207,3,100,50,0,204, - 207,3,132,66,0,205,207,3,32,16,0,206,199,1,0,0,0,206,200,1,0,0,0, - 206,201,1,0,0,0,206,202,1,0,0,0,206,203,1,0,0,0,206,204,1,0,0,0, - 206,205,1,0,0,0,207,9,1,0,0,0,208,209,5,36,0,0,209,210,5,39,0,0, - 210,211,3,150,75,0,211,212,5,128,0,0,212,219,1,0,0,0,213,214,5,36, - 0,0,214,215,5,41,0,0,215,216,3,150,75,0,216,217,5,128,0,0,217,219, - 1,0,0,0,218,208,1,0,0,0,218,213,1,0,0,0,219,11,1,0,0,0,220,221,5, - 37,0,0,221,222,5,38,0,0,222,223,3,150,75,0,223,224,5,78,0,0,224, - 225,3,152,76,0,225,226,5,128,0,0,226,13,1,0,0,0,227,228,5,37,0,0, - 228,229,5,39,0,0,229,230,3,150,75,0,230,231,5,72,0,0,231,232,3,152, - 76,0,232,233,5,128,0,0,233,15,1,0,0,0,234,239,3,10,5,0,235,239,3, - 12,6,0,236,239,3,14,7,0,237,239,3,32,16,0,238,234,1,0,0,0,238,235, - 1,0,0,0,238,236,1,0,0,0,238,237,1,0,0,0,239,17,1,0,0,0,240,241,5, - 38,0,0,241,242,3,150,75,0,242,243,5,78,0,0,243,246,3,152,76,0,244, - 245,5,79,0,0,245,247,3,152,76,0,246,244,1,0,0,0,246,247,1,0,0,0, - 247,248,1,0,0,0,248,249,5,128,0,0,249,19,1,0,0,0,250,252,3,16,8, - 0,251,250,1,0,0,0,252,255,1,0,0,0,253,251,1,0,0,0,253,254,1,0,0, - 0,254,256,1,0,0,0,255,253,1,0,0,0,256,257,5,39,0,0,257,259,3,150, - 75,0,258,260,3,22,11,0,259,258,1,0,0,0,259,260,1,0,0,0,260,261,1, - 0,0,0,261,262,5,78,0,0,262,263,3,152,76,0,263,264,5,72,0,0,264,274, - 3,152,76,0,265,266,5,83,0,0,266,271,3,26,13,0,267,268,5,129,0,0, - 268,270,3,26,13,0,269,267,1,0,0,0,270,273,1,0,0,0,271,269,1,0,0, - 0,271,272,1,0,0,0,272,275,1,0,0,0,273,271,1,0,0,0,274,265,1,0,0, - 0,274,275,1,0,0,0,275,276,1,0,0,0,276,280,5,131,0,0,277,279,3,34, - 17,0,278,277,1,0,0,0,279,282,1,0,0,0,280,278,1,0,0,0,280,281,1,0, - 0,0,281,283,1,0,0,0,282,280,1,0,0,0,283,284,5,132,0,0,284,21,1,0, - 0,0,285,286,5,137,0,0,286,291,3,24,12,0,287,288,5,129,0,0,288,290, - 3,24,12,0,289,287,1,0,0,0,290,293,1,0,0,0,291,289,1,0,0,0,291,292, - 1,0,0,0,292,294,1,0,0,0,293,291,1,0,0,0,294,295,5,138,0,0,295,23, - 1,0,0,0,296,297,5,42,0,0,297,300,3,150,75,0,298,299,5,127,0,0,299, - 301,5,32,0,0,300,298,1,0,0,0,300,301,1,0,0,0,301,316,1,0,0,0,302, - 303,5,31,0,0,303,313,3,150,75,0,304,305,5,33,0,0,305,310,3,26,13, - 0,306,307,5,139,0,0,307,309,3,26,13,0,308,306,1,0,0,0,309,312,1, - 0,0,0,310,308,1,0,0,0,310,311,1,0,0,0,311,314,1,0,0,0,312,310,1, - 0,0,0,313,304,1,0,0,0,313,314,1,0,0,0,314,316,1,0,0,0,315,296,1, - 0,0,0,315,302,1,0,0,0,316,25,1,0,0,0,317,319,3,150,75,0,318,320, - 3,28,14,0,319,318,1,0,0,0,319,320,1,0,0,0,320,27,1,0,0,0,321,322, - 5,137,0,0,322,327,3,30,15,0,323,324,5,129,0,0,324,326,3,30,15,0, - 325,323,1,0,0,0,326,329,1,0,0,0,327,325,1,0,0,0,327,328,1,0,0,0, - 328,330,1,0,0,0,329,327,1,0,0,0,330,331,5,138,0,0,331,29,1,0,0,0, - 332,333,5,38,0,0,333,340,3,150,75,0,334,335,5,39,0,0,335,340,3,26, - 13,0,336,337,5,31,0,0,337,340,3,150,75,0,338,340,3,134,67,0,339, - 332,1,0,0,0,339,334,1,0,0,0,339,336,1,0,0,0,339,338,1,0,0,0,340, - 31,1,0,0,0,341,342,5,30,0,0,342,344,3,150,75,0,343,345,3,22,11,0, - 344,343,1,0,0,0,344,345,1,0,0,0,345,346,1,0,0,0,346,347,5,140,0, - 0,347,348,3,134,67,0,348,349,5,128,0,0,349,33,1,0,0,0,350,354,3, - 38,19,0,351,354,3,42,21,0,352,354,3,36,18,0,353,350,1,0,0,0,353, - 351,1,0,0,0,353,352,1,0,0,0,354,35,1,0,0,0,355,357,5,52,0,0,356, - 355,1,0,0,0,356,357,1,0,0,0,357,358,1,0,0,0,358,359,5,44,0,0,359, - 360,3,150,75,0,360,361,5,78,0,0,361,362,3,152,76,0,362,363,5,127, - 0,0,363,364,3,134,67,0,364,365,5,126,0,0,365,366,3,134,67,0,366, - 367,5,131,0,0,367,368,5,95,0,0,368,369,5,78,0,0,369,371,3,152,76, - 0,370,372,3,66,33,0,371,370,1,0,0,0,371,372,1,0,0,0,372,373,1,0, - 0,0,373,374,5,128,0,0,374,375,5,132,0,0,375,37,1,0,0,0,376,378,3, - 44,22,0,377,376,1,0,0,0,377,378,1,0,0,0,378,379,1,0,0,0,379,380, - 5,42,0,0,380,381,3,150,75,0,381,382,5,78,0,0,382,383,3,152,76,0, - 383,384,5,127,0,0,384,385,3,134,67,0,385,389,5,131,0,0,386,388,3, - 40,20,0,387,386,1,0,0,0,388,391,1,0,0,0,389,387,1,0,0,0,389,390, - 1,0,0,0,390,392,1,0,0,0,391,389,1,0,0,0,392,393,5,132,0,0,393,39, - 1,0,0,0,394,395,5,85,0,0,395,396,5,78,0,0,396,398,3,152,76,0,397, - 399,3,66,33,0,398,397,1,0,0,0,398,399,1,0,0,0,399,400,1,0,0,0,400, - 401,5,128,0,0,401,428,1,0,0,0,402,403,5,86,0,0,403,404,5,78,0,0, - 404,406,3,152,76,0,405,407,3,66,33,0,406,405,1,0,0,0,406,407,1,0, - 0,0,407,408,1,0,0,0,408,409,5,128,0,0,409,428,1,0,0,0,410,411,5, - 1,0,0,411,412,5,78,0,0,412,414,3,152,76,0,413,415,3,66,33,0,414, - 413,1,0,0,0,414,415,1,0,0,0,415,416,1,0,0,0,416,417,5,128,0,0,417, - 428,1,0,0,0,418,419,5,87,0,0,419,420,5,88,0,0,420,421,5,78,0,0,421, - 422,3,152,76,0,422,423,5,89,0,0,423,424,5,78,0,0,424,425,3,152,76, - 0,425,426,5,128,0,0,426,428,1,0,0,0,427,394,1,0,0,0,427,402,1,0, - 0,0,427,410,1,0,0,0,427,418,1,0,0,0,428,41,1,0,0,0,429,431,3,44, - 22,0,430,429,1,0,0,0,430,431,1,0,0,0,431,432,1,0,0,0,432,433,5,43, - 0,0,433,434,3,150,75,0,434,435,5,78,0,0,435,436,3,152,76,0,436,437, - 5,127,0,0,437,438,3,140,70,0,438,440,3,48,24,0,439,441,5,106,0,0, - 440,439,1,0,0,0,440,441,1,0,0,0,441,444,1,0,0,0,442,443,5,76,0,0, - 443,445,3,152,76,0,444,442,1,0,0,0,444,445,1,0,0,0,445,446,1,0,0, - 0,446,450,5,131,0,0,447,449,3,46,23,0,448,447,1,0,0,0,449,452,1, - 0,0,0,450,448,1,0,0,0,450,451,1,0,0,0,451,453,1,0,0,0,452,450,1, - 0,0,0,453,454,5,132,0,0,454,43,1,0,0,0,455,457,5,27,0,0,456,458, - 7,0,0,0,457,456,1,0,0,0,457,458,1,0,0,0,458,45,1,0,0,0,459,460,5, - 92,0,0,460,461,5,78,0,0,461,463,3,152,76,0,462,464,3,66,33,0,463, - 462,1,0,0,0,463,464,1,0,0,0,464,465,1,0,0,0,465,466,5,128,0,0,466, - 493,1,0,0,0,467,468,5,93,0,0,468,469,5,78,0,0,469,471,3,152,76,0, - 470,472,3,66,33,0,471,470,1,0,0,0,471,472,1,0,0,0,472,473,1,0,0, - 0,473,474,5,128,0,0,474,493,1,0,0,0,475,476,5,94,0,0,476,477,5,78, - 0,0,477,479,3,152,76,0,478,480,3,66,33,0,479,478,1,0,0,0,479,480, - 1,0,0,0,480,481,1,0,0,0,481,482,5,128,0,0,482,493,1,0,0,0,483,484, - 5,87,0,0,484,485,5,88,0,0,485,486,5,78,0,0,486,487,3,152,76,0,487, - 488,5,89,0,0,488,489,5,78,0,0,489,490,3,152,76,0,490,491,5,128,0, - 0,491,493,1,0,0,0,492,459,1,0,0,0,492,467,1,0,0,0,492,475,1,0,0, - 0,492,483,1,0,0,0,493,47,1,0,0,0,494,495,5,38,0,0,495,504,3,150, - 75,0,496,497,5,39,0,0,497,499,3,150,75,0,498,500,3,28,14,0,499,498, - 1,0,0,0,499,500,1,0,0,0,500,504,1,0,0,0,501,502,5,31,0,0,502,504, - 3,150,75,0,503,494,1,0,0,0,503,496,1,0,0,0,503,501,1,0,0,0,504,49, - 1,0,0,0,505,507,3,16,8,0,506,505,1,0,0,0,507,510,1,0,0,0,508,506, - 1,0,0,0,508,509,1,0,0,0,509,511,1,0,0,0,510,508,1,0,0,0,511,512, - 5,41,0,0,512,513,3,150,75,0,513,514,5,78,0,0,514,515,3,152,76,0, - 515,516,5,72,0,0,516,519,3,152,76,0,517,518,5,73,0,0,518,520,5,141, - 0,0,519,517,1,0,0,0,519,520,1,0,0,0,520,521,1,0,0,0,521,525,5,131, - 0,0,522,524,3,52,26,0,523,522,1,0,0,0,524,527,1,0,0,0,525,523,1, - 0,0,0,525,526,1,0,0,0,526,528,1,0,0,0,527,525,1,0,0,0,528,529,5, - 132,0,0,529,51,1,0,0,0,530,536,3,60,30,0,531,536,3,62,31,0,532,536, - 3,70,35,0,533,536,3,54,27,0,534,536,3,56,28,0,535,530,1,0,0,0,535, - 531,1,0,0,0,535,532,1,0,0,0,535,533,1,0,0,0,535,534,1,0,0,0,536, - 53,1,0,0,0,537,538,5,17,0,0,538,540,3,150,75,0,539,541,3,22,11,0, - 540,539,1,0,0,0,540,541,1,0,0,0,541,542,1,0,0,0,542,543,5,78,0,0, - 543,544,3,152,76,0,544,546,5,20,0,0,545,547,5,4,0,0,546,545,1,0, - 0,0,546,547,1,0,0,0,547,548,1,0,0,0,548,549,3,26,13,0,549,550,5, - 21,0,0,550,551,3,152,76,0,551,552,5,44,0,0,552,553,3,152,76,0,553, - 557,5,131,0,0,554,556,3,58,29,0,555,554,1,0,0,0,556,559,1,0,0,0, - 557,555,1,0,0,0,557,558,1,0,0,0,558,560,1,0,0,0,559,557,1,0,0,0, - 560,561,5,132,0,0,561,55,1,0,0,0,562,563,5,17,0,0,563,564,3,150, - 75,0,564,565,5,78,0,0,565,566,3,152,76,0,566,567,5,19,0,0,567,568, - 3,150,75,0,568,569,3,28,14,0,569,570,5,128,0,0,570,57,1,0,0,0,571, - 572,5,11,0,0,572,612,5,128,0,0,573,574,5,12,0,0,574,575,5,13,0,0, - 575,576,3,150,75,0,576,577,5,128,0,0,577,612,1,0,0,0,578,579,5,22, - 0,0,579,580,3,152,76,0,580,581,5,128,0,0,581,612,1,0,0,0,582,584, - 5,23,0,0,583,585,5,31,0,0,584,583,1,0,0,0,584,585,1,0,0,0,585,586, - 1,0,0,0,586,587,3,150,75,0,587,588,5,50,0,0,588,589,3,26,13,0,589, - 590,5,128,0,0,590,612,1,0,0,0,591,592,5,24,0,0,592,593,3,150,75, - 0,593,594,5,141,0,0,594,595,5,128,0,0,595,612,1,0,0,0,596,597,5, - 25,0,0,597,598,3,26,13,0,598,599,5,130,0,0,599,600,3,150,75,0,600, - 601,3,150,75,0,601,602,3,152,76,0,602,603,5,128,0,0,603,612,1,0, - 0,0,604,605,5,87,0,0,605,612,5,128,0,0,606,607,5,26,0,0,607,608, - 5,141,0,0,608,609,3,152,76,0,609,610,5,128,0,0,610,612,1,0,0,0,611, - 571,1,0,0,0,611,573,1,0,0,0,611,578,1,0,0,0,611,582,1,0,0,0,611, - 591,1,0,0,0,611,596,1,0,0,0,611,604,1,0,0,0,611,606,1,0,0,0,612, - 59,1,0,0,0,613,614,5,44,0,0,614,616,3,150,75,0,615,617,3,22,11,0, - 616,615,1,0,0,0,616,617,1,0,0,0,617,618,1,0,0,0,618,619,5,78,0,0, - 619,620,3,152,76,0,620,621,5,127,0,0,621,622,3,134,67,0,622,623, - 5,126,0,0,623,624,3,134,67,0,624,625,5,80,0,0,625,627,3,74,37,0, - 626,628,3,66,33,0,627,626,1,0,0,0,627,628,1,0,0,0,628,630,1,0,0, - 0,629,631,3,72,36,0,630,629,1,0,0,0,630,631,1,0,0,0,631,632,1,0, - 0,0,632,633,5,82,0,0,633,635,3,76,38,0,634,636,3,80,40,0,635,634, - 1,0,0,0,635,636,1,0,0,0,636,638,1,0,0,0,637,639,3,64,32,0,638,637, - 1,0,0,0,638,639,1,0,0,0,639,640,1,0,0,0,640,641,5,128,0,0,641,61, - 1,0,0,0,642,643,5,45,0,0,643,645,3,150,75,0,644,646,3,22,11,0,645, - 644,1,0,0,0,645,646,1,0,0,0,646,647,1,0,0,0,647,648,5,78,0,0,648, - 649,3,152,76,0,649,650,5,127,0,0,650,651,3,134,67,0,651,652,5,126, - 0,0,652,654,3,134,67,0,653,655,3,66,33,0,654,653,1,0,0,0,654,655, - 1,0,0,0,655,657,1,0,0,0,656,658,3,80,40,0,657,656,1,0,0,0,657,658, - 1,0,0,0,658,660,1,0,0,0,659,661,3,64,32,0,660,659,1,0,0,0,660,661, - 1,0,0,0,661,662,1,0,0,0,662,663,5,128,0,0,663,63,1,0,0,0,664,665, - 5,61,0,0,665,666,5,60,0,0,666,667,3,150,75,0,667,65,1,0,0,0,668, - 669,5,5,0,0,669,678,5,8,0,0,670,671,5,5,0,0,671,672,7,1,0,0,672, - 673,5,9,0,0,673,674,5,133,0,0,674,675,3,78,39,0,675,676,5,134,0, - 0,676,678,1,0,0,0,677,668,1,0,0,0,677,670,1,0,0,0,678,67,1,0,0,0, - 679,680,5,60,0,0,680,681,5,133,0,0,681,686,3,116,58,0,682,683,5, - 129,0,0,683,685,3,116,58,0,684,682,1,0,0,0,685,688,1,0,0,0,686,684, - 1,0,0,0,686,687,1,0,0,0,687,689,1,0,0,0,688,686,1,0,0,0,689,690, - 5,134,0,0,690,69,1,0,0,0,691,692,5,46,0,0,692,693,3,150,75,0,693, - 694,5,78,0,0,694,695,3,152,76,0,695,696,5,47,0,0,696,697,3,150,75, - 0,697,698,5,127,0,0,698,700,3,134,67,0,699,701,3,80,40,0,700,699, - 1,0,0,0,700,701,1,0,0,0,701,702,1,0,0,0,702,703,5,128,0,0,703,71, - 1,0,0,0,704,705,5,81,0,0,705,706,3,134,67,0,706,73,1,0,0,0,707,708, - 7,2,0,0,708,75,1,0,0,0,709,728,5,84,0,0,710,711,5,38,0,0,711,728, - 3,150,75,0,712,713,5,31,0,0,713,728,3,150,75,0,714,715,5,40,0,0, - 715,724,5,133,0,0,716,721,3,26,13,0,717,718,5,129,0,0,718,720,3, - 26,13,0,719,717,1,0,0,0,720,723,1,0,0,0,721,719,1,0,0,0,721,722, - 1,0,0,0,722,725,1,0,0,0,723,721,1,0,0,0,724,716,1,0,0,0,724,725, - 1,0,0,0,725,726,1,0,0,0,726,728,5,134,0,0,727,709,1,0,0,0,727,710, - 1,0,0,0,727,712,1,0,0,0,727,714,1,0,0,0,728,77,1,0,0,0,729,734,3, - 150,75,0,730,731,5,129,0,0,731,733,3,150,75,0,732,730,1,0,0,0,733, - 736,1,0,0,0,734,732,1,0,0,0,734,735,1,0,0,0,735,79,1,0,0,0,736,734, - 1,0,0,0,737,738,5,83,0,0,738,742,5,131,0,0,739,741,3,82,41,0,740, - 739,1,0,0,0,741,744,1,0,0,0,742,740,1,0,0,0,742,743,1,0,0,0,743, - 745,1,0,0,0,744,742,1,0,0,0,745,746,5,132,0,0,746,81,1,0,0,0,747, - 748,5,18,0,0,748,749,3,150,75,0,749,750,5,78,0,0,750,751,3,152,76, - 0,751,752,5,133,0,0,752,753,3,78,39,0,753,754,5,134,0,0,754,755, - 5,128,0,0,755,826,1,0,0,0,756,757,5,56,0,0,757,758,3,150,75,0,758, - 759,5,78,0,0,759,760,3,152,76,0,760,761,5,127,0,0,761,762,3,134, - 67,0,762,763,3,84,42,0,763,764,5,128,0,0,764,826,1,0,0,0,765,766, - 5,57,0,0,766,767,3,150,75,0,767,768,5,78,0,0,768,769,3,152,76,0, - 769,770,5,127,0,0,770,771,3,140,70,0,771,772,3,48,24,0,772,773,3, - 84,42,0,773,774,5,128,0,0,774,826,1,0,0,0,775,776,5,39,0,0,776,777, - 3,150,75,0,777,778,5,78,0,0,778,779,3,152,76,0,779,780,5,127,0,0, - 780,782,3,150,75,0,781,783,3,28,14,0,782,781,1,0,0,0,782,783,1,0, - 0,0,783,785,1,0,0,0,784,786,3,68,34,0,785,784,1,0,0,0,785,786,1, - 0,0,0,786,789,1,0,0,0,787,788,5,13,0,0,788,790,5,48,0,0,789,787, - 1,0,0,0,789,790,1,0,0,0,790,791,1,0,0,0,791,792,5,128,0,0,792,826, - 1,0,0,0,793,794,5,2,0,0,794,795,3,150,75,0,795,796,5,78,0,0,796, - 797,3,152,76,0,797,798,5,127,0,0,798,799,3,150,75,0,799,800,5,48, - 0,0,800,801,3,134,67,0,801,802,5,128,0,0,802,826,1,0,0,0,803,804, - 5,46,0,0,804,805,3,150,75,0,805,806,5,78,0,0,806,807,3,152,76,0, - 807,808,5,127,0,0,808,811,3,150,75,0,809,810,5,48,0,0,810,812,3, - 134,67,0,811,809,1,0,0,0,811,812,1,0,0,0,812,813,1,0,0,0,813,814, - 5,128,0,0,814,826,1,0,0,0,815,816,5,17,0,0,816,817,3,150,75,0,817, - 818,5,78,0,0,818,819,3,152,76,0,819,820,5,127,0,0,820,821,3,150, - 75,0,821,822,5,130,0,0,822,823,3,150,75,0,823,824,5,128,0,0,824, - 826,1,0,0,0,825,747,1,0,0,0,825,756,1,0,0,0,825,765,1,0,0,0,825, - 775,1,0,0,0,825,793,1,0,0,0,825,803,1,0,0,0,825,815,1,0,0,0,826, - 83,1,0,0,0,827,828,5,133,0,0,828,833,3,86,43,0,829,830,5,129,0,0, - 830,832,3,86,43,0,831,829,1,0,0,0,832,835,1,0,0,0,833,831,1,0,0, - 0,833,834,1,0,0,0,834,836,1,0,0,0,835,833,1,0,0,0,836,837,5,134, - 0,0,837,85,1,0,0,0,838,839,7,3,0,0,839,87,1,0,0,0,840,841,5,55,0, - 0,841,842,3,90,45,0,842,89,1,0,0,0,843,846,3,92,46,0,844,846,3,96, - 48,0,845,843,1,0,0,0,845,844,1,0,0,0,846,91,1,0,0,0,847,848,5,56, - 0,0,848,849,3,150,75,0,849,850,5,78,0,0,850,851,3,152,76,0,851,852, - 5,66,0,0,852,853,3,150,75,0,853,854,5,127,0,0,854,855,3,134,67,0, - 855,856,5,67,0,0,856,859,3,94,47,0,857,858,5,68,0,0,858,860,3,142, - 71,0,859,857,1,0,0,0,859,860,1,0,0,0,860,861,1,0,0,0,861,862,5,128, - 0,0,862,93,1,0,0,0,863,870,5,100,0,0,864,865,5,101,0,0,865,866,5, - 135,0,0,866,867,3,134,67,0,867,868,5,136,0,0,868,870,1,0,0,0,869, - 863,1,0,0,0,869,864,1,0,0,0,870,95,1,0,0,0,871,872,5,57,0,0,872, - 873,3,150,75,0,873,874,5,78,0,0,874,875,3,152,76,0,875,876,5,131, - 0,0,876,877,3,98,49,0,877,878,3,98,49,0,878,879,5,132,0,0,879,97, - 1,0,0,0,880,881,3,48,24,0,881,882,5,58,0,0,882,883,3,150,75,0,883, - 884,5,78,0,0,884,885,3,152,76,0,885,887,3,140,70,0,886,888,5,106, - 0,0,887,886,1,0,0,0,887,888,1,0,0,0,888,891,1,0,0,0,889,890,5,74, - 0,0,890,892,3,152,76,0,891,889,1,0,0,0,891,892,1,0,0,0,892,894,1, - 0,0,0,893,895,5,75,0,0,894,893,1,0,0,0,894,895,1,0,0,0,895,898,1, - 0,0,0,896,897,5,76,0,0,897,899,3,152,76,0,898,896,1,0,0,0,898,899, - 1,0,0,0,899,901,1,0,0,0,900,902,5,77,0,0,901,900,1,0,0,0,901,902, - 1,0,0,0,902,903,1,0,0,0,903,904,5,128,0,0,904,99,1,0,0,0,905,906, - 5,49,0,0,906,907,3,150,75,0,907,908,5,50,0,0,908,910,3,150,75,0, - 909,911,3,28,14,0,910,909,1,0,0,0,910,911,1,0,0,0,911,914,1,0,0, - 0,912,913,5,78,0,0,913,915,3,152,76,0,914,912,1,0,0,0,914,915,1, - 0,0,0,915,918,1,0,0,0,916,917,5,73,0,0,917,919,5,141,0,0,918,916, - 1,0,0,0,918,919,1,0,0,0,919,920,1,0,0,0,920,924,5,131,0,0,921,923, - 3,102,51,0,922,921,1,0,0,0,923,926,1,0,0,0,924,922,1,0,0,0,924,925, - 1,0,0,0,925,927,1,0,0,0,926,924,1,0,0,0,927,928,5,132,0,0,928,101, - 1,0,0,0,929,930,5,54,0,0,930,936,3,90,45,0,931,936,3,114,57,0,932, - 936,3,110,55,0,933,936,3,104,52,0,934,936,3,112,56,0,935,929,1,0, - 0,0,935,931,1,0,0,0,935,932,1,0,0,0,935,933,1,0,0,0,935,934,1,0, - 0,0,936,103,1,0,0,0,937,938,5,3,0,0,938,942,5,131,0,0,939,941,3, - 106,53,0,940,939,1,0,0,0,941,944,1,0,0,0,942,940,1,0,0,0,942,943, - 1,0,0,0,943,945,1,0,0,0,944,942,1,0,0,0,945,946,5,132,0,0,946,947, - 5,128,0,0,947,105,1,0,0,0,948,949,3,150,75,0,949,950,5,53,0,0,950, - 951,5,56,0,0,951,952,3,150,75,0,952,953,5,128,0,0,953,963,1,0,0, - 0,954,955,3,150,75,0,955,956,5,53,0,0,956,957,5,57,0,0,957,958,3, - 150,75,0,958,959,5,130,0,0,959,960,3,150,75,0,960,961,5,128,0,0, - 961,963,1,0,0,0,962,948,1,0,0,0,962,954,1,0,0,0,963,107,1,0,0,0, - 964,965,3,26,13,0,965,966,5,13,0,0,966,971,5,48,0,0,967,968,5,130, - 0,0,968,970,3,150,75,0,969,967,1,0,0,0,970,973,1,0,0,0,971,969,1, - 0,0,0,971,972,1,0,0,0,972,974,1,0,0,0,973,971,1,0,0,0,974,975,5, - 128,0,0,975,109,1,0,0,0,976,977,5,51,0,0,977,978,3,150,75,0,978, - 979,5,53,0,0,979,980,5,56,0,0,980,981,3,150,75,0,981,982,5,128,0, - 0,982,111,1,0,0,0,983,984,5,63,0,0,984,985,3,150,75,0,985,986,5, - 64,0,0,986,987,5,65,0,0,987,988,5,60,0,0,988,989,5,46,0,0,989,990, - 3,150,75,0,990,991,5,62,0,0,991,992,5,57,0,0,992,993,3,150,75,0, - 993,994,5,130,0,0,994,995,3,150,75,0,995,996,5,128,0,0,996,113,1, - 0,0,0,997,998,5,51,0,0,998,999,3,116,58,0,999,1000,5,53,0,0,1000, - 1003,3,120,60,0,1001,1002,5,29,0,0,1002,1004,3,152,76,0,1003,1001, - 1,0,0,0,1003,1004,1,0,0,0,1004,1005,1,0,0,0,1005,1006,5,128,0,0, - 1006,115,1,0,0,0,1007,1008,3,150,75,0,1008,1009,5,130,0,0,1009,1010, - 3,118,59,0,1010,117,1,0,0,0,1011,1024,3,150,75,0,1012,1024,5,95, - 0,0,1013,1024,5,85,0,0,1014,1024,5,86,0,0,1015,1024,5,1,0,0,1016, - 1024,5,92,0,0,1017,1024,5,93,0,0,1018,1024,5,94,0,0,1019,1024,5, - 96,0,0,1020,1024,5,97,0,0,1021,1024,5,98,0,0,1022,1024,5,99,0,0, - 1023,1011,1,0,0,0,1023,1012,1,0,0,0,1023,1013,1,0,0,0,1023,1014, - 1,0,0,0,1023,1015,1,0,0,0,1023,1016,1,0,0,0,1023,1017,1,0,0,0,1023, - 1018,1,0,0,0,1023,1019,1,0,0,0,1023,1020,1,0,0,0,1023,1021,1,0,0, - 0,1023,1022,1,0,0,0,1024,119,1,0,0,0,1025,1026,5,56,0,0,1026,1027, - 3,150,75,0,1027,1028,5,130,0,0,1028,1029,3,124,62,0,1029,1059,1, - 0,0,0,1030,1031,5,57,0,0,1031,1032,3,150,75,0,1032,1033,5,130,0, - 0,1033,1034,3,150,75,0,1034,1035,5,130,0,0,1035,1036,3,126,63,0, - 1036,1059,1,0,0,0,1037,1038,5,39,0,0,1038,1040,3,150,75,0,1039,1041, - 3,28,14,0,1040,1039,1,0,0,0,1040,1041,1,0,0,0,1041,1042,1,0,0,0, - 1042,1043,5,130,0,0,1043,1044,3,116,58,0,1044,1059,1,0,0,0,1045, - 1046,5,41,0,0,1046,1047,3,150,75,0,1047,1048,5,130,0,0,1048,1050, - 3,150,75,0,1049,1051,3,28,14,0,1050,1049,1,0,0,0,1050,1051,1,0,0, - 0,1051,1053,1,0,0,0,1052,1054,3,128,64,0,1053,1052,1,0,0,0,1053, - 1054,1,0,0,0,1054,1056,1,0,0,0,1055,1057,3,122,61,0,1056,1055,1, - 0,0,0,1056,1057,1,0,0,0,1057,1059,1,0,0,0,1058,1025,1,0,0,0,1058, - 1030,1,0,0,0,1058,1037,1,0,0,0,1058,1045,1,0,0,0,1059,121,1,0,0, - 0,1060,1061,5,61,0,0,1061,1062,3,128,64,0,1062,123,1,0,0,0,1063, - 1064,7,4,0,0,1064,125,1,0,0,0,1065,1066,7,5,0,0,1066,127,1,0,0,0, - 1067,1068,5,59,0,0,1068,1072,5,131,0,0,1069,1071,3,130,65,0,1070, - 1069,1,0,0,0,1071,1074,1,0,0,0,1072,1070,1,0,0,0,1072,1073,1,0,0, - 0,1073,1075,1,0,0,0,1074,1072,1,0,0,0,1075,1076,5,132,0,0,1076,129, - 1,0,0,0,1077,1078,3,150,75,0,1078,1079,5,53,0,0,1079,1080,5,4,0, - 0,1080,1081,5,18,0,0,1081,1082,5,133,0,0,1082,1083,3,78,39,0,1083, - 1084,5,134,0,0,1084,1085,5,128,0,0,1085,1176,1,0,0,0,1086,1087,3, - 150,75,0,1087,1088,5,53,0,0,1088,1089,5,56,0,0,1089,1096,3,150,75, - 0,1090,1091,5,62,0,0,1091,1092,5,57,0,0,1092,1093,3,150,75,0,1093, - 1094,5,130,0,0,1094,1095,3,150,75,0,1095,1097,1,0,0,0,1096,1090, - 1,0,0,0,1096,1097,1,0,0,0,1097,1098,1,0,0,0,1098,1099,5,128,0,0, - 1099,1176,1,0,0,0,1100,1101,3,150,75,0,1101,1102,5,53,0,0,1102,1103, - 5,57,0,0,1103,1104,3,150,75,0,1104,1105,5,130,0,0,1105,1112,3,150, - 75,0,1106,1107,5,62,0,0,1107,1108,5,57,0,0,1108,1109,3,150,75,0, - 1109,1110,5,130,0,0,1110,1111,3,150,75,0,1111,1113,1,0,0,0,1112, - 1106,1,0,0,0,1112,1113,1,0,0,0,1113,1114,1,0,0,0,1114,1115,5,128, - 0,0,1115,1176,1,0,0,0,1116,1117,3,150,75,0,1117,1118,5,53,0,0,1118, - 1119,5,39,0,0,1119,1121,3,150,75,0,1120,1122,3,28,14,0,1121,1120, - 1,0,0,0,1121,1122,1,0,0,0,1122,1131,1,0,0,0,1123,1124,5,62,0,0,1124, - 1125,5,57,0,0,1125,1126,3,150,75,0,1126,1127,5,130,0,0,1127,1128, - 3,150,75,0,1128,1132,1,0,0,0,1129,1130,5,13,0,0,1130,1132,5,48,0, - 0,1131,1123,1,0,0,0,1131,1129,1,0,0,0,1131,1132,1,0,0,0,1132,1133, - 1,0,0,0,1133,1134,5,128,0,0,1134,1176,1,0,0,0,1135,1136,3,150,75, - 0,1136,1137,5,53,0,0,1137,1138,5,2,0,0,1138,1139,3,150,75,0,1139, - 1140,5,59,0,0,1140,1144,5,131,0,0,1141,1143,3,108,54,0,1142,1141, - 1,0,0,0,1143,1146,1,0,0,0,1144,1142,1,0,0,0,1144,1145,1,0,0,0,1145, - 1147,1,0,0,0,1146,1144,1,0,0,0,1147,1148,5,132,0,0,1148,1149,5,128, - 0,0,1149,1176,1,0,0,0,1150,1151,3,150,75,0,1151,1152,5,53,0,0,1152, - 1153,5,46,0,0,1153,1154,3,150,75,0,1154,1155,5,128,0,0,1155,1176, - 1,0,0,0,1156,1157,3,150,75,0,1157,1159,5,53,0,0,1158,1160,5,4,0, - 0,1159,1158,1,0,0,0,1159,1160,1,0,0,0,1160,1161,1,0,0,0,1161,1162, - 5,17,0,0,1162,1163,3,150,75,0,1163,1164,5,130,0,0,1164,1171,3,150, - 75,0,1165,1166,5,62,0,0,1166,1167,5,57,0,0,1167,1168,3,150,75,0, - 1168,1169,5,130,0,0,1169,1170,3,150,75,0,1170,1172,1,0,0,0,1171, - 1165,1,0,0,0,1171,1172,1,0,0,0,1172,1173,1,0,0,0,1173,1174,5,128, - 0,0,1174,1176,1,0,0,0,1175,1077,1,0,0,0,1175,1086,1,0,0,0,1175,1100, - 1,0,0,0,1175,1116,1,0,0,0,1175,1135,1,0,0,0,1175,1150,1,0,0,0,1175, - 1156,1,0,0,0,1176,131,1,0,0,0,1177,1178,5,46,0,0,1178,1179,3,150, - 75,0,1179,1180,5,53,0,0,1180,1181,3,150,75,0,1181,1182,5,130,0,0, - 1182,1184,3,150,75,0,1183,1185,3,128,64,0,1184,1183,1,0,0,0,1184, - 1185,1,0,0,0,1185,1186,1,0,0,0,1186,1187,5,128,0,0,1187,133,1,0, - 0,0,1188,1235,3,138,69,0,1189,1235,5,107,0,0,1190,1235,5,108,0,0, - 1191,1192,5,109,0,0,1192,1235,3,152,76,0,1193,1194,5,110,0,0,1194, - 1195,5,137,0,0,1195,1196,3,150,75,0,1196,1197,5,138,0,0,1197,1235, - 1,0,0,0,1198,1199,5,111,0,0,1199,1200,5,137,0,0,1200,1202,3,150, - 75,0,1201,1203,3,28,14,0,1202,1201,1,0,0,0,1202,1203,1,0,0,0,1203, - 1204,1,0,0,0,1204,1205,5,138,0,0,1205,1235,1,0,0,0,1206,1207,5,34, - 0,0,1207,1208,5,137,0,0,1208,1209,3,150,75,0,1209,1210,5,138,0,0, - 1210,1235,1,0,0,0,1211,1212,5,112,0,0,1212,1213,5,137,0,0,1213,1214, - 3,134,67,0,1214,1215,5,138,0,0,1215,1235,1,0,0,0,1216,1217,5,113, - 0,0,1217,1218,5,137,0,0,1218,1219,3,134,67,0,1219,1220,5,138,0,0, - 1220,1235,1,0,0,0,1221,1222,5,114,0,0,1222,1226,5,131,0,0,1223,1225, - 3,136,68,0,1224,1223,1,0,0,0,1225,1228,1,0,0,0,1226,1224,1,0,0,0, - 1226,1227,1,0,0,0,1227,1229,1,0,0,0,1228,1226,1,0,0,0,1229,1235, - 5,132,0,0,1230,1232,3,150,75,0,1231,1233,3,28,14,0,1232,1231,1,0, - 0,0,1232,1233,1,0,0,0,1233,1235,1,0,0,0,1234,1188,1,0,0,0,1234,1189, - 1,0,0,0,1234,1190,1,0,0,0,1234,1191,1,0,0,0,1234,1193,1,0,0,0,1234, - 1198,1,0,0,0,1234,1206,1,0,0,0,1234,1211,1,0,0,0,1234,1216,1,0,0, - 0,1234,1221,1,0,0,0,1234,1230,1,0,0,0,1235,135,1,0,0,0,1236,1237, - 3,150,75,0,1237,1238,5,127,0,0,1238,1239,3,134,67,0,1239,1240,5, - 128,0,0,1240,137,1,0,0,0,1241,1242,7,6,0,0,1242,139,1,0,0,0,1243, - 1244,7,7,0,0,1244,141,1,0,0,0,1245,1254,3,152,76,0,1246,1254,5,141, - 0,0,1247,1254,5,142,0,0,1248,1254,5,123,0,0,1249,1254,5,124,0,0, - 1250,1254,5,125,0,0,1251,1254,3,144,72,0,1252,1254,3,148,74,0,1253, - 1245,1,0,0,0,1253,1246,1,0,0,0,1253,1247,1,0,0,0,1253,1248,1,0,0, - 0,1253,1249,1,0,0,0,1253,1250,1,0,0,0,1253,1251,1,0,0,0,1253,1252, - 1,0,0,0,1254,143,1,0,0,0,1255,1264,5,131,0,0,1256,1261,3,146,73, - 0,1257,1258,5,129,0,0,1258,1260,3,146,73,0,1259,1257,1,0,0,0,1260, - 1263,1,0,0,0,1261,1259,1,0,0,0,1261,1262,1,0,0,0,1262,1265,1,0,0, - 0,1263,1261,1,0,0,0,1264,1256,1,0,0,0,1264,1265,1,0,0,0,1265,1266, - 1,0,0,0,1266,1267,5,132,0,0,1267,145,1,0,0,0,1268,1269,3,152,76, - 0,1269,1270,5,127,0,0,1270,1271,3,142,71,0,1271,147,1,0,0,0,1272, - 1281,5,133,0,0,1273,1278,3,142,71,0,1274,1275,5,129,0,0,1275,1277, - 3,142,71,0,1276,1274,1,0,0,0,1277,1280,1,0,0,0,1278,1276,1,0,0,0, - 1278,1279,1,0,0,0,1279,1282,1,0,0,0,1280,1278,1,0,0,0,1281,1273, - 1,0,0,0,1281,1282,1,0,0,0,1282,1283,1,0,0,0,1283,1284,5,134,0,0, - 1284,149,1,0,0,0,1285,1286,7,8,0,0,1286,151,1,0,0,0,1287,1288,5, - 144,0,0,1288,153,1,0,0,0,115,166,173,194,206,218,238,246,253,259, - 271,274,280,291,300,310,313,315,319,327,339,344,353,356,371,377, - 389,398,406,414,427,430,440,444,450,457,463,471,479,492,499,503, - 508,519,525,535,540,546,557,584,611,616,627,630,635,638,645,654, - 657,660,677,686,700,721,724,727,734,742,782,785,789,811,825,833, - 845,859,869,887,891,894,898,901,910,914,918,924,935,942,962,971, - 1003,1023,1040,1050,1053,1056,1058,1072,1096,1112,1121,1131,1144, - 1159,1171,1175,1184,1202,1226,1232,1234,1253,1261,1264,1278,1281 + 1,67,1,67,1,67,5,67,1228,8,67,10,67,12,67,1231,9,67,1,67,1,67,1, + 67,3,67,1236,8,67,3,67,1238,8,67,1,68,1,68,1,68,1,68,1,68,1,69,1, + 69,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,3,71,1257,8, + 71,1,72,1,72,1,72,1,72,5,72,1263,8,72,10,72,12,72,1266,9,72,3,72, + 1268,8,72,1,72,1,72,1,73,1,73,1,73,1,73,1,74,1,74,1,74,1,74,5,74, + 1280,8,74,10,74,12,74,1283,9,74,3,74,1285,8,74,1,74,1,74,1,75,1, + 75,1,76,1,76,1,76,0,0,77,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,0,9,2,0,10,10,28,28,1,0,6,7,1,0,96,100,3,0,1,1,91, + 95,97,98,3,0,1,1,91,92,97,98,2,0,93,95,97,98,1,0,116,123,1,0,103, + 106,7,0,1,3,5,28,40,40,69,69,89,90,101,101,144,144,1400,0,166,1, + 0,0,0,2,168,1,0,0,0,4,178,1,0,0,0,6,182,1,0,0,0,8,206,1,0,0,0,10, + 218,1,0,0,0,12,220,1,0,0,0,14,227,1,0,0,0,16,238,1,0,0,0,18,240, + 1,0,0,0,20,253,1,0,0,0,22,285,1,0,0,0,24,315,1,0,0,0,26,317,1,0, + 0,0,28,321,1,0,0,0,30,339,1,0,0,0,32,341,1,0,0,0,34,353,1,0,0,0, + 36,356,1,0,0,0,38,377,1,0,0,0,40,427,1,0,0,0,42,430,1,0,0,0,44,455, + 1,0,0,0,46,492,1,0,0,0,48,503,1,0,0,0,50,508,1,0,0,0,52,535,1,0, + 0,0,54,537,1,0,0,0,56,562,1,0,0,0,58,611,1,0,0,0,60,613,1,0,0,0, + 62,642,1,0,0,0,64,664,1,0,0,0,66,677,1,0,0,0,68,679,1,0,0,0,70,691, + 1,0,0,0,72,704,1,0,0,0,74,707,1,0,0,0,76,727,1,0,0,0,78,729,1,0, + 0,0,80,737,1,0,0,0,82,825,1,0,0,0,84,827,1,0,0,0,86,838,1,0,0,0, + 88,840,1,0,0,0,90,845,1,0,0,0,92,847,1,0,0,0,94,869,1,0,0,0,96,871, + 1,0,0,0,98,880,1,0,0,0,100,905,1,0,0,0,102,935,1,0,0,0,104,937,1, + 0,0,0,106,962,1,0,0,0,108,964,1,0,0,0,110,976,1,0,0,0,112,983,1, + 0,0,0,114,997,1,0,0,0,116,1007,1,0,0,0,118,1023,1,0,0,0,120,1061, + 1,0,0,0,122,1063,1,0,0,0,124,1066,1,0,0,0,126,1068,1,0,0,0,128,1070, + 1,0,0,0,130,1178,1,0,0,0,132,1180,1,0,0,0,134,1237,1,0,0,0,136,1239, + 1,0,0,0,138,1244,1,0,0,0,140,1246,1,0,0,0,142,1256,1,0,0,0,144,1258, + 1,0,0,0,146,1271,1,0,0,0,148,1275,1,0,0,0,150,1288,1,0,0,0,152,1290, + 1,0,0,0,154,155,3,6,3,0,155,156,5,0,0,1,156,167,1,0,0,0,157,158, + 3,20,10,0,158,159,5,0,0,1,159,167,1,0,0,0,160,161,3,50,25,0,161, + 162,5,0,0,1,162,167,1,0,0,0,163,164,3,2,1,0,164,165,5,0,0,1,165, + 167,1,0,0,0,166,154,1,0,0,0,166,157,1,0,0,0,166,160,1,0,0,0,166, + 163,1,0,0,0,167,1,1,0,0,0,168,169,5,35,0,0,169,173,5,132,0,0,170, + 172,3,8,4,0,171,170,1,0,0,0,172,175,1,0,0,0,173,171,1,0,0,0,173, + 174,1,0,0,0,174,176,1,0,0,0,175,173,1,0,0,0,176,177,5,133,0,0,177, + 3,1,0,0,0,178,179,5,36,0,0,179,180,3,152,76,0,180,181,5,129,0,0, + 181,5,1,0,0,0,182,183,5,4,0,0,183,184,3,150,75,0,184,185,5,79,0, + 0,185,186,3,152,76,0,186,187,5,72,0,0,187,188,3,152,76,0,188,189, + 5,71,0,0,189,190,3,152,76,0,190,194,5,132,0,0,191,193,3,8,4,0,192, + 191,1,0,0,0,193,196,1,0,0,0,194,192,1,0,0,0,194,195,1,0,0,0,195, + 197,1,0,0,0,196,194,1,0,0,0,197,198,5,133,0,0,198,7,1,0,0,0,199, + 207,3,4,2,0,200,207,3,18,9,0,201,207,3,10,5,0,202,207,3,88,44,0, + 203,207,3,100,50,0,204,207,3,132,66,0,205,207,3,32,16,0,206,199, + 1,0,0,0,206,200,1,0,0,0,206,201,1,0,0,0,206,202,1,0,0,0,206,203, + 1,0,0,0,206,204,1,0,0,0,206,205,1,0,0,0,207,9,1,0,0,0,208,209,5, + 36,0,0,209,210,5,39,0,0,210,211,3,150,75,0,211,212,5,129,0,0,212, + 219,1,0,0,0,213,214,5,36,0,0,214,215,5,41,0,0,215,216,3,150,75,0, + 216,217,5,129,0,0,217,219,1,0,0,0,218,208,1,0,0,0,218,213,1,0,0, + 0,219,11,1,0,0,0,220,221,5,37,0,0,221,222,5,38,0,0,222,223,3,150, + 75,0,223,224,5,79,0,0,224,225,3,152,76,0,225,226,5,129,0,0,226,13, + 1,0,0,0,227,228,5,37,0,0,228,229,5,39,0,0,229,230,3,150,75,0,230, + 231,5,72,0,0,231,232,3,152,76,0,232,233,5,129,0,0,233,15,1,0,0,0, + 234,239,3,10,5,0,235,239,3,12,6,0,236,239,3,14,7,0,237,239,3,32, + 16,0,238,234,1,0,0,0,238,235,1,0,0,0,238,236,1,0,0,0,238,237,1,0, + 0,0,239,17,1,0,0,0,240,241,5,38,0,0,241,242,3,150,75,0,242,243,5, + 79,0,0,243,246,3,152,76,0,244,245,5,80,0,0,245,247,3,152,76,0,246, + 244,1,0,0,0,246,247,1,0,0,0,247,248,1,0,0,0,248,249,5,129,0,0,249, + 19,1,0,0,0,250,252,3,16,8,0,251,250,1,0,0,0,252,255,1,0,0,0,253, + 251,1,0,0,0,253,254,1,0,0,0,254,256,1,0,0,0,255,253,1,0,0,0,256, + 257,5,39,0,0,257,259,3,150,75,0,258,260,3,22,11,0,259,258,1,0,0, + 0,259,260,1,0,0,0,260,261,1,0,0,0,261,262,5,79,0,0,262,263,3,152, + 76,0,263,264,5,72,0,0,264,274,3,152,76,0,265,266,5,84,0,0,266,271, + 3,26,13,0,267,268,5,130,0,0,268,270,3,26,13,0,269,267,1,0,0,0,270, + 273,1,0,0,0,271,269,1,0,0,0,271,272,1,0,0,0,272,275,1,0,0,0,273, + 271,1,0,0,0,274,265,1,0,0,0,274,275,1,0,0,0,275,276,1,0,0,0,276, + 280,5,132,0,0,277,279,3,34,17,0,278,277,1,0,0,0,279,282,1,0,0,0, + 280,278,1,0,0,0,280,281,1,0,0,0,281,283,1,0,0,0,282,280,1,0,0,0, + 283,284,5,133,0,0,284,21,1,0,0,0,285,286,5,138,0,0,286,291,3,24, + 12,0,287,288,5,130,0,0,288,290,3,24,12,0,289,287,1,0,0,0,290,293, + 1,0,0,0,291,289,1,0,0,0,291,292,1,0,0,0,292,294,1,0,0,0,293,291, + 1,0,0,0,294,295,5,139,0,0,295,23,1,0,0,0,296,297,5,42,0,0,297,300, + 3,150,75,0,298,299,5,128,0,0,299,301,5,32,0,0,300,298,1,0,0,0,300, + 301,1,0,0,0,301,316,1,0,0,0,302,303,5,31,0,0,303,313,3,150,75,0, + 304,305,5,33,0,0,305,310,3,26,13,0,306,307,5,140,0,0,307,309,3,26, + 13,0,308,306,1,0,0,0,309,312,1,0,0,0,310,308,1,0,0,0,310,311,1,0, + 0,0,311,314,1,0,0,0,312,310,1,0,0,0,313,304,1,0,0,0,313,314,1,0, + 0,0,314,316,1,0,0,0,315,296,1,0,0,0,315,302,1,0,0,0,316,25,1,0,0, + 0,317,319,3,150,75,0,318,320,3,28,14,0,319,318,1,0,0,0,319,320,1, + 0,0,0,320,27,1,0,0,0,321,322,5,138,0,0,322,327,3,30,15,0,323,324, + 5,130,0,0,324,326,3,30,15,0,325,323,1,0,0,0,326,329,1,0,0,0,327, + 325,1,0,0,0,327,328,1,0,0,0,328,330,1,0,0,0,329,327,1,0,0,0,330, + 331,5,139,0,0,331,29,1,0,0,0,332,333,5,38,0,0,333,340,3,150,75,0, + 334,335,5,39,0,0,335,340,3,26,13,0,336,337,5,31,0,0,337,340,3,150, + 75,0,338,340,3,134,67,0,339,332,1,0,0,0,339,334,1,0,0,0,339,336, + 1,0,0,0,339,338,1,0,0,0,340,31,1,0,0,0,341,342,5,30,0,0,342,344, + 3,150,75,0,343,345,3,22,11,0,344,343,1,0,0,0,344,345,1,0,0,0,345, + 346,1,0,0,0,346,347,5,141,0,0,347,348,3,134,67,0,348,349,5,129,0, + 0,349,33,1,0,0,0,350,354,3,38,19,0,351,354,3,42,21,0,352,354,3,36, + 18,0,353,350,1,0,0,0,353,351,1,0,0,0,353,352,1,0,0,0,354,35,1,0, + 0,0,355,357,5,52,0,0,356,355,1,0,0,0,356,357,1,0,0,0,357,358,1,0, + 0,0,358,359,5,44,0,0,359,360,3,150,75,0,360,361,5,79,0,0,361,362, + 3,152,76,0,362,363,5,128,0,0,363,364,3,134,67,0,364,365,5,127,0, + 0,365,366,3,134,67,0,366,367,5,132,0,0,367,368,5,96,0,0,368,369, + 5,79,0,0,369,371,3,152,76,0,370,372,3,66,33,0,371,370,1,0,0,0,371, + 372,1,0,0,0,372,373,1,0,0,0,373,374,5,129,0,0,374,375,5,133,0,0, + 375,37,1,0,0,0,376,378,3,44,22,0,377,376,1,0,0,0,377,378,1,0,0,0, + 378,379,1,0,0,0,379,380,5,42,0,0,380,381,3,150,75,0,381,382,5,79, + 0,0,382,383,3,152,76,0,383,384,5,128,0,0,384,385,3,134,67,0,385, + 389,5,132,0,0,386,388,3,40,20,0,387,386,1,0,0,0,388,391,1,0,0,0, + 389,387,1,0,0,0,389,390,1,0,0,0,390,392,1,0,0,0,391,389,1,0,0,0, + 392,393,5,133,0,0,393,39,1,0,0,0,394,395,5,86,0,0,395,396,5,79,0, + 0,396,398,3,152,76,0,397,399,3,66,33,0,398,397,1,0,0,0,398,399,1, + 0,0,0,399,400,1,0,0,0,400,401,5,129,0,0,401,428,1,0,0,0,402,403, + 5,87,0,0,403,404,5,79,0,0,404,406,3,152,76,0,405,407,3,66,33,0,406, + 405,1,0,0,0,406,407,1,0,0,0,407,408,1,0,0,0,408,409,5,129,0,0,409, + 428,1,0,0,0,410,411,5,1,0,0,411,412,5,79,0,0,412,414,3,152,76,0, + 413,415,3,66,33,0,414,413,1,0,0,0,414,415,1,0,0,0,415,416,1,0,0, + 0,416,417,5,129,0,0,417,428,1,0,0,0,418,419,5,88,0,0,419,420,5,89, + 0,0,420,421,5,79,0,0,421,422,3,152,76,0,422,423,5,90,0,0,423,424, + 5,79,0,0,424,425,3,152,76,0,425,426,5,129,0,0,426,428,1,0,0,0,427, + 394,1,0,0,0,427,402,1,0,0,0,427,410,1,0,0,0,427,418,1,0,0,0,428, + 41,1,0,0,0,429,431,3,44,22,0,430,429,1,0,0,0,430,431,1,0,0,0,431, + 432,1,0,0,0,432,433,5,43,0,0,433,434,3,150,75,0,434,435,5,79,0,0, + 435,436,3,152,76,0,436,437,5,128,0,0,437,438,3,140,70,0,438,440, + 3,48,24,0,439,441,5,107,0,0,440,439,1,0,0,0,440,441,1,0,0,0,441, + 444,1,0,0,0,442,443,5,77,0,0,443,445,3,152,76,0,444,442,1,0,0,0, + 444,445,1,0,0,0,445,446,1,0,0,0,446,450,5,132,0,0,447,449,3,46,23, + 0,448,447,1,0,0,0,449,452,1,0,0,0,450,448,1,0,0,0,450,451,1,0,0, + 0,451,453,1,0,0,0,452,450,1,0,0,0,453,454,5,133,0,0,454,43,1,0,0, + 0,455,457,5,27,0,0,456,458,7,0,0,0,457,456,1,0,0,0,457,458,1,0,0, + 0,458,45,1,0,0,0,459,460,5,93,0,0,460,461,5,79,0,0,461,463,3,152, + 76,0,462,464,3,66,33,0,463,462,1,0,0,0,463,464,1,0,0,0,464,465,1, + 0,0,0,465,466,5,129,0,0,466,493,1,0,0,0,467,468,5,94,0,0,468,469, + 5,79,0,0,469,471,3,152,76,0,470,472,3,66,33,0,471,470,1,0,0,0,471, + 472,1,0,0,0,472,473,1,0,0,0,473,474,5,129,0,0,474,493,1,0,0,0,475, + 476,5,95,0,0,476,477,5,79,0,0,477,479,3,152,76,0,478,480,3,66,33, + 0,479,478,1,0,0,0,479,480,1,0,0,0,480,481,1,0,0,0,481,482,5,129, + 0,0,482,493,1,0,0,0,483,484,5,88,0,0,484,485,5,89,0,0,485,486,5, + 79,0,0,486,487,3,152,76,0,487,488,5,90,0,0,488,489,5,79,0,0,489, + 490,3,152,76,0,490,491,5,129,0,0,491,493,1,0,0,0,492,459,1,0,0,0, + 492,467,1,0,0,0,492,475,1,0,0,0,492,483,1,0,0,0,493,47,1,0,0,0,494, + 495,5,38,0,0,495,504,3,150,75,0,496,497,5,39,0,0,497,499,3,150,75, + 0,498,500,3,28,14,0,499,498,1,0,0,0,499,500,1,0,0,0,500,504,1,0, + 0,0,501,502,5,31,0,0,502,504,3,150,75,0,503,494,1,0,0,0,503,496, + 1,0,0,0,503,501,1,0,0,0,504,49,1,0,0,0,505,507,3,16,8,0,506,505, + 1,0,0,0,507,510,1,0,0,0,508,506,1,0,0,0,508,509,1,0,0,0,509,511, + 1,0,0,0,510,508,1,0,0,0,511,512,5,41,0,0,512,513,3,150,75,0,513, + 514,5,79,0,0,514,515,3,152,76,0,515,516,5,72,0,0,516,519,3,152,76, + 0,517,518,5,73,0,0,518,520,5,142,0,0,519,517,1,0,0,0,519,520,1,0, + 0,0,520,521,1,0,0,0,521,525,5,132,0,0,522,524,3,52,26,0,523,522, + 1,0,0,0,524,527,1,0,0,0,525,523,1,0,0,0,525,526,1,0,0,0,526,528, + 1,0,0,0,527,525,1,0,0,0,528,529,5,133,0,0,529,51,1,0,0,0,530,536, + 3,60,30,0,531,536,3,62,31,0,532,536,3,70,35,0,533,536,3,54,27,0, + 534,536,3,56,28,0,535,530,1,0,0,0,535,531,1,0,0,0,535,532,1,0,0, + 0,535,533,1,0,0,0,535,534,1,0,0,0,536,53,1,0,0,0,537,538,5,17,0, + 0,538,540,3,150,75,0,539,541,3,22,11,0,540,539,1,0,0,0,540,541,1, + 0,0,0,541,542,1,0,0,0,542,543,5,79,0,0,543,544,3,152,76,0,544,546, + 5,20,0,0,545,547,5,4,0,0,546,545,1,0,0,0,546,547,1,0,0,0,547,548, + 1,0,0,0,548,549,3,26,13,0,549,550,5,21,0,0,550,551,3,152,76,0,551, + 552,5,44,0,0,552,553,3,152,76,0,553,557,5,132,0,0,554,556,3,58,29, + 0,555,554,1,0,0,0,556,559,1,0,0,0,557,555,1,0,0,0,557,558,1,0,0, + 0,558,560,1,0,0,0,559,557,1,0,0,0,560,561,5,133,0,0,561,55,1,0,0, + 0,562,563,5,17,0,0,563,564,3,150,75,0,564,565,5,79,0,0,565,566,3, + 152,76,0,566,567,5,19,0,0,567,568,3,150,75,0,568,569,3,28,14,0,569, + 570,5,129,0,0,570,57,1,0,0,0,571,572,5,11,0,0,572,612,5,129,0,0, + 573,574,5,12,0,0,574,575,5,13,0,0,575,576,3,150,75,0,576,577,5,129, + 0,0,577,612,1,0,0,0,578,579,5,22,0,0,579,580,3,152,76,0,580,581, + 5,129,0,0,581,612,1,0,0,0,582,584,5,23,0,0,583,585,5,31,0,0,584, + 583,1,0,0,0,584,585,1,0,0,0,585,586,1,0,0,0,586,587,3,150,75,0,587, + 588,5,50,0,0,588,589,3,26,13,0,589,590,5,129,0,0,590,612,1,0,0,0, + 591,592,5,24,0,0,592,593,3,150,75,0,593,594,5,142,0,0,594,595,5, + 129,0,0,595,612,1,0,0,0,596,597,5,25,0,0,597,598,3,26,13,0,598,599, + 5,131,0,0,599,600,3,150,75,0,600,601,3,150,75,0,601,602,3,152,76, + 0,602,603,5,129,0,0,603,612,1,0,0,0,604,605,5,88,0,0,605,612,5,129, + 0,0,606,607,5,26,0,0,607,608,5,142,0,0,608,609,3,152,76,0,609,610, + 5,129,0,0,610,612,1,0,0,0,611,571,1,0,0,0,611,573,1,0,0,0,611,578, + 1,0,0,0,611,582,1,0,0,0,611,591,1,0,0,0,611,596,1,0,0,0,611,604, + 1,0,0,0,611,606,1,0,0,0,612,59,1,0,0,0,613,614,5,44,0,0,614,616, + 3,150,75,0,615,617,3,22,11,0,616,615,1,0,0,0,616,617,1,0,0,0,617, + 618,1,0,0,0,618,619,5,79,0,0,619,620,3,152,76,0,620,621,5,128,0, + 0,621,622,3,134,67,0,622,623,5,127,0,0,623,624,3,134,67,0,624,625, + 5,81,0,0,625,627,3,74,37,0,626,628,3,66,33,0,627,626,1,0,0,0,627, + 628,1,0,0,0,628,630,1,0,0,0,629,631,3,72,36,0,630,629,1,0,0,0,630, + 631,1,0,0,0,631,632,1,0,0,0,632,633,5,83,0,0,633,635,3,76,38,0,634, + 636,3,80,40,0,635,634,1,0,0,0,635,636,1,0,0,0,636,638,1,0,0,0,637, + 639,3,64,32,0,638,637,1,0,0,0,638,639,1,0,0,0,639,640,1,0,0,0,640, + 641,5,129,0,0,641,61,1,0,0,0,642,643,5,45,0,0,643,645,3,150,75,0, + 644,646,3,22,11,0,645,644,1,0,0,0,645,646,1,0,0,0,646,647,1,0,0, + 0,647,648,5,79,0,0,648,649,3,152,76,0,649,650,5,128,0,0,650,651, + 3,134,67,0,651,652,5,127,0,0,652,654,3,134,67,0,653,655,3,66,33, + 0,654,653,1,0,0,0,654,655,1,0,0,0,655,657,1,0,0,0,656,658,3,80,40, + 0,657,656,1,0,0,0,657,658,1,0,0,0,658,660,1,0,0,0,659,661,3,64,32, + 0,660,659,1,0,0,0,660,661,1,0,0,0,661,662,1,0,0,0,662,663,5,129, + 0,0,663,63,1,0,0,0,664,665,5,61,0,0,665,666,5,60,0,0,666,667,3,150, + 75,0,667,65,1,0,0,0,668,669,5,5,0,0,669,678,5,8,0,0,670,671,5,5, + 0,0,671,672,7,1,0,0,672,673,5,9,0,0,673,674,5,134,0,0,674,675,3, + 78,39,0,675,676,5,135,0,0,676,678,1,0,0,0,677,668,1,0,0,0,677,670, + 1,0,0,0,678,67,1,0,0,0,679,680,5,60,0,0,680,681,5,134,0,0,681,686, + 3,116,58,0,682,683,5,130,0,0,683,685,3,116,58,0,684,682,1,0,0,0, + 685,688,1,0,0,0,686,684,1,0,0,0,686,687,1,0,0,0,687,689,1,0,0,0, + 688,686,1,0,0,0,689,690,5,135,0,0,690,69,1,0,0,0,691,692,5,46,0, + 0,692,693,3,150,75,0,693,694,5,79,0,0,694,695,3,152,76,0,695,696, + 5,47,0,0,696,697,3,150,75,0,697,698,5,128,0,0,698,700,3,134,67,0, + 699,701,3,80,40,0,700,699,1,0,0,0,700,701,1,0,0,0,701,702,1,0,0, + 0,702,703,5,129,0,0,703,71,1,0,0,0,704,705,5,82,0,0,705,706,3,134, + 67,0,706,73,1,0,0,0,707,708,7,2,0,0,708,75,1,0,0,0,709,728,5,85, + 0,0,710,711,5,38,0,0,711,728,3,150,75,0,712,713,5,31,0,0,713,728, + 3,150,75,0,714,715,5,40,0,0,715,724,5,134,0,0,716,721,3,26,13,0, + 717,718,5,130,0,0,718,720,3,26,13,0,719,717,1,0,0,0,720,723,1,0, + 0,0,721,719,1,0,0,0,721,722,1,0,0,0,722,725,1,0,0,0,723,721,1,0, + 0,0,724,716,1,0,0,0,724,725,1,0,0,0,725,726,1,0,0,0,726,728,5,135, + 0,0,727,709,1,0,0,0,727,710,1,0,0,0,727,712,1,0,0,0,727,714,1,0, + 0,0,728,77,1,0,0,0,729,734,3,150,75,0,730,731,5,130,0,0,731,733, + 3,150,75,0,732,730,1,0,0,0,733,736,1,0,0,0,734,732,1,0,0,0,734,735, + 1,0,0,0,735,79,1,0,0,0,736,734,1,0,0,0,737,738,5,84,0,0,738,742, + 5,132,0,0,739,741,3,82,41,0,740,739,1,0,0,0,741,744,1,0,0,0,742, + 740,1,0,0,0,742,743,1,0,0,0,743,745,1,0,0,0,744,742,1,0,0,0,745, + 746,5,133,0,0,746,81,1,0,0,0,747,748,5,18,0,0,748,749,3,150,75,0, + 749,750,5,79,0,0,750,751,3,152,76,0,751,752,5,134,0,0,752,753,3, + 78,39,0,753,754,5,135,0,0,754,755,5,129,0,0,755,826,1,0,0,0,756, + 757,5,56,0,0,757,758,3,150,75,0,758,759,5,79,0,0,759,760,3,152,76, + 0,760,761,5,128,0,0,761,762,3,134,67,0,762,763,3,84,42,0,763,764, + 5,129,0,0,764,826,1,0,0,0,765,766,5,57,0,0,766,767,3,150,75,0,767, + 768,5,79,0,0,768,769,3,152,76,0,769,770,5,128,0,0,770,771,3,140, + 70,0,771,772,3,48,24,0,772,773,3,84,42,0,773,774,5,129,0,0,774,826, + 1,0,0,0,775,776,5,39,0,0,776,777,3,150,75,0,777,778,5,79,0,0,778, + 779,3,152,76,0,779,780,5,128,0,0,780,782,3,150,75,0,781,783,3,28, + 14,0,782,781,1,0,0,0,782,783,1,0,0,0,783,785,1,0,0,0,784,786,3,68, + 34,0,785,784,1,0,0,0,785,786,1,0,0,0,786,789,1,0,0,0,787,788,5,13, + 0,0,788,790,5,48,0,0,789,787,1,0,0,0,789,790,1,0,0,0,790,791,1,0, + 0,0,791,792,5,129,0,0,792,826,1,0,0,0,793,794,5,2,0,0,794,795,3, + 150,75,0,795,796,5,79,0,0,796,797,3,152,76,0,797,798,5,128,0,0,798, + 799,3,150,75,0,799,800,5,48,0,0,800,801,3,134,67,0,801,802,5,129, + 0,0,802,826,1,0,0,0,803,804,5,46,0,0,804,805,3,150,75,0,805,806, + 5,79,0,0,806,807,3,152,76,0,807,808,5,128,0,0,808,811,3,150,75,0, + 809,810,5,48,0,0,810,812,3,134,67,0,811,809,1,0,0,0,811,812,1,0, + 0,0,812,813,1,0,0,0,813,814,5,129,0,0,814,826,1,0,0,0,815,816,5, + 17,0,0,816,817,3,150,75,0,817,818,5,79,0,0,818,819,3,152,76,0,819, + 820,5,128,0,0,820,821,3,150,75,0,821,822,5,131,0,0,822,823,3,150, + 75,0,823,824,5,129,0,0,824,826,1,0,0,0,825,747,1,0,0,0,825,756,1, + 0,0,0,825,765,1,0,0,0,825,775,1,0,0,0,825,793,1,0,0,0,825,803,1, + 0,0,0,825,815,1,0,0,0,826,83,1,0,0,0,827,828,5,134,0,0,828,833,3, + 86,43,0,829,830,5,130,0,0,830,832,3,86,43,0,831,829,1,0,0,0,832, + 835,1,0,0,0,833,831,1,0,0,0,833,834,1,0,0,0,834,836,1,0,0,0,835, + 833,1,0,0,0,836,837,5,135,0,0,837,85,1,0,0,0,838,839,7,3,0,0,839, + 87,1,0,0,0,840,841,5,55,0,0,841,842,3,90,45,0,842,89,1,0,0,0,843, + 846,3,92,46,0,844,846,3,96,48,0,845,843,1,0,0,0,845,844,1,0,0,0, + 846,91,1,0,0,0,847,848,5,56,0,0,848,849,3,150,75,0,849,850,5,79, + 0,0,850,851,3,152,76,0,851,852,5,66,0,0,852,853,3,150,75,0,853,854, + 5,128,0,0,854,855,3,134,67,0,855,856,5,67,0,0,856,859,3,94,47,0, + 857,858,5,68,0,0,858,860,3,142,71,0,859,857,1,0,0,0,859,860,1,0, + 0,0,860,861,1,0,0,0,861,862,5,129,0,0,862,93,1,0,0,0,863,870,5,101, + 0,0,864,865,5,102,0,0,865,866,5,136,0,0,866,867,3,134,67,0,867,868, + 5,137,0,0,868,870,1,0,0,0,869,863,1,0,0,0,869,864,1,0,0,0,870,95, + 1,0,0,0,871,872,5,57,0,0,872,873,3,150,75,0,873,874,5,79,0,0,874, + 875,3,152,76,0,875,876,5,132,0,0,876,877,3,98,49,0,877,878,3,98, + 49,0,878,879,5,133,0,0,879,97,1,0,0,0,880,881,3,48,24,0,881,882, + 5,58,0,0,882,883,3,150,75,0,883,884,5,79,0,0,884,885,3,152,76,0, + 885,887,3,140,70,0,886,888,5,107,0,0,887,886,1,0,0,0,887,888,1,0, + 0,0,888,891,1,0,0,0,889,890,5,74,0,0,890,892,3,152,76,0,891,889, + 1,0,0,0,891,892,1,0,0,0,892,894,1,0,0,0,893,895,5,76,0,0,894,893, + 1,0,0,0,894,895,1,0,0,0,895,898,1,0,0,0,896,897,5,77,0,0,897,899, + 3,152,76,0,898,896,1,0,0,0,898,899,1,0,0,0,899,901,1,0,0,0,900,902, + 5,78,0,0,901,900,1,0,0,0,901,902,1,0,0,0,902,903,1,0,0,0,903,904, + 5,129,0,0,904,99,1,0,0,0,905,906,5,49,0,0,906,907,3,150,75,0,907, + 908,5,50,0,0,908,910,3,150,75,0,909,911,3,28,14,0,910,909,1,0,0, + 0,910,911,1,0,0,0,911,914,1,0,0,0,912,913,5,79,0,0,913,915,3,152, + 76,0,914,912,1,0,0,0,914,915,1,0,0,0,915,918,1,0,0,0,916,917,5,73, + 0,0,917,919,5,142,0,0,918,916,1,0,0,0,918,919,1,0,0,0,919,920,1, + 0,0,0,920,924,5,132,0,0,921,923,3,102,51,0,922,921,1,0,0,0,923,926, + 1,0,0,0,924,922,1,0,0,0,924,925,1,0,0,0,925,927,1,0,0,0,926,924, + 1,0,0,0,927,928,5,133,0,0,928,101,1,0,0,0,929,930,5,54,0,0,930,936, + 3,90,45,0,931,936,3,114,57,0,932,936,3,110,55,0,933,936,3,104,52, + 0,934,936,3,112,56,0,935,929,1,0,0,0,935,931,1,0,0,0,935,932,1,0, + 0,0,935,933,1,0,0,0,935,934,1,0,0,0,936,103,1,0,0,0,937,938,5,3, + 0,0,938,942,5,132,0,0,939,941,3,106,53,0,940,939,1,0,0,0,941,944, + 1,0,0,0,942,940,1,0,0,0,942,943,1,0,0,0,943,945,1,0,0,0,944,942, + 1,0,0,0,945,946,5,133,0,0,946,947,5,129,0,0,947,105,1,0,0,0,948, + 949,3,150,75,0,949,950,5,53,0,0,950,951,5,56,0,0,951,952,3,150,75, + 0,952,953,5,129,0,0,953,963,1,0,0,0,954,955,3,150,75,0,955,956,5, + 53,0,0,956,957,5,57,0,0,957,958,3,150,75,0,958,959,5,131,0,0,959, + 960,3,150,75,0,960,961,5,129,0,0,961,963,1,0,0,0,962,948,1,0,0,0, + 962,954,1,0,0,0,963,107,1,0,0,0,964,965,3,26,13,0,965,966,5,13,0, + 0,966,971,5,48,0,0,967,968,5,131,0,0,968,970,3,150,75,0,969,967, + 1,0,0,0,970,973,1,0,0,0,971,969,1,0,0,0,971,972,1,0,0,0,972,974, + 1,0,0,0,973,971,1,0,0,0,974,975,5,129,0,0,975,109,1,0,0,0,976,977, + 5,51,0,0,977,978,3,150,75,0,978,979,5,53,0,0,979,980,5,56,0,0,980, + 981,3,150,75,0,981,982,5,129,0,0,982,111,1,0,0,0,983,984,5,63,0, + 0,984,985,3,150,75,0,985,986,5,64,0,0,986,987,5,65,0,0,987,988,5, + 60,0,0,988,989,5,46,0,0,989,990,3,150,75,0,990,991,5,62,0,0,991, + 992,5,57,0,0,992,993,3,150,75,0,993,994,5,131,0,0,994,995,3,150, + 75,0,995,996,5,129,0,0,996,113,1,0,0,0,997,998,5,51,0,0,998,999, + 3,116,58,0,999,1000,5,53,0,0,1000,1003,3,120,60,0,1001,1002,5,29, + 0,0,1002,1004,3,152,76,0,1003,1001,1,0,0,0,1003,1004,1,0,0,0,1004, + 1005,1,0,0,0,1005,1006,5,129,0,0,1006,115,1,0,0,0,1007,1008,3,150, + 75,0,1008,1009,5,131,0,0,1009,1010,3,118,59,0,1010,117,1,0,0,0,1011, + 1024,3,150,75,0,1012,1024,5,96,0,0,1013,1024,5,86,0,0,1014,1024, + 5,87,0,0,1015,1024,5,1,0,0,1016,1024,5,93,0,0,1017,1024,5,94,0,0, + 1018,1024,5,95,0,0,1019,1024,5,97,0,0,1020,1024,5,98,0,0,1021,1024, + 5,99,0,0,1022,1024,5,100,0,0,1023,1011,1,0,0,0,1023,1012,1,0,0,0, + 1023,1013,1,0,0,0,1023,1014,1,0,0,0,1023,1015,1,0,0,0,1023,1016, + 1,0,0,0,1023,1017,1,0,0,0,1023,1018,1,0,0,0,1023,1019,1,0,0,0,1023, + 1020,1,0,0,0,1023,1021,1,0,0,0,1023,1022,1,0,0,0,1024,119,1,0,0, + 0,1025,1026,5,75,0,0,1026,1027,5,131,0,0,1027,1062,3,150,75,0,1028, + 1029,5,56,0,0,1029,1030,3,150,75,0,1030,1031,5,131,0,0,1031,1032, + 3,124,62,0,1032,1062,1,0,0,0,1033,1034,5,57,0,0,1034,1035,3,150, + 75,0,1035,1036,5,131,0,0,1036,1037,3,150,75,0,1037,1038,5,131,0, + 0,1038,1039,3,126,63,0,1039,1062,1,0,0,0,1040,1041,5,39,0,0,1041, + 1043,3,150,75,0,1042,1044,3,28,14,0,1043,1042,1,0,0,0,1043,1044, + 1,0,0,0,1044,1045,1,0,0,0,1045,1046,5,131,0,0,1046,1047,3,116,58, + 0,1047,1062,1,0,0,0,1048,1049,5,41,0,0,1049,1050,3,150,75,0,1050, + 1051,5,131,0,0,1051,1053,3,150,75,0,1052,1054,3,28,14,0,1053,1052, + 1,0,0,0,1053,1054,1,0,0,0,1054,1056,1,0,0,0,1055,1057,3,128,64,0, + 1056,1055,1,0,0,0,1056,1057,1,0,0,0,1057,1059,1,0,0,0,1058,1060, + 3,122,61,0,1059,1058,1,0,0,0,1059,1060,1,0,0,0,1060,1062,1,0,0,0, + 1061,1025,1,0,0,0,1061,1028,1,0,0,0,1061,1033,1,0,0,0,1061,1040, + 1,0,0,0,1061,1048,1,0,0,0,1062,121,1,0,0,0,1063,1064,5,61,0,0,1064, + 1065,3,128,64,0,1065,123,1,0,0,0,1066,1067,7,4,0,0,1067,125,1,0, + 0,0,1068,1069,7,5,0,0,1069,127,1,0,0,0,1070,1071,5,59,0,0,1071,1075, + 5,132,0,0,1072,1074,3,130,65,0,1073,1072,1,0,0,0,1074,1077,1,0,0, + 0,1075,1073,1,0,0,0,1075,1076,1,0,0,0,1076,1078,1,0,0,0,1077,1075, + 1,0,0,0,1078,1079,5,133,0,0,1079,129,1,0,0,0,1080,1081,3,150,75, + 0,1081,1082,5,53,0,0,1082,1083,5,4,0,0,1083,1084,5,18,0,0,1084,1085, + 5,134,0,0,1085,1086,3,78,39,0,1086,1087,5,135,0,0,1087,1088,5,129, + 0,0,1088,1179,1,0,0,0,1089,1090,3,150,75,0,1090,1091,5,53,0,0,1091, + 1092,5,56,0,0,1092,1099,3,150,75,0,1093,1094,5,62,0,0,1094,1095, + 5,57,0,0,1095,1096,3,150,75,0,1096,1097,5,131,0,0,1097,1098,3,150, + 75,0,1098,1100,1,0,0,0,1099,1093,1,0,0,0,1099,1100,1,0,0,0,1100, + 1101,1,0,0,0,1101,1102,5,129,0,0,1102,1179,1,0,0,0,1103,1104,3,150, + 75,0,1104,1105,5,53,0,0,1105,1106,5,57,0,0,1106,1107,3,150,75,0, + 1107,1108,5,131,0,0,1108,1115,3,150,75,0,1109,1110,5,62,0,0,1110, + 1111,5,57,0,0,1111,1112,3,150,75,0,1112,1113,5,131,0,0,1113,1114, + 3,150,75,0,1114,1116,1,0,0,0,1115,1109,1,0,0,0,1115,1116,1,0,0,0, + 1116,1117,1,0,0,0,1117,1118,5,129,0,0,1118,1179,1,0,0,0,1119,1120, + 3,150,75,0,1120,1121,5,53,0,0,1121,1122,5,39,0,0,1122,1124,3,150, + 75,0,1123,1125,3,28,14,0,1124,1123,1,0,0,0,1124,1125,1,0,0,0,1125, + 1134,1,0,0,0,1126,1127,5,62,0,0,1127,1128,5,57,0,0,1128,1129,3,150, + 75,0,1129,1130,5,131,0,0,1130,1131,3,150,75,0,1131,1135,1,0,0,0, + 1132,1133,5,13,0,0,1133,1135,5,48,0,0,1134,1126,1,0,0,0,1134,1132, + 1,0,0,0,1134,1135,1,0,0,0,1135,1136,1,0,0,0,1136,1137,5,129,0,0, + 1137,1179,1,0,0,0,1138,1139,3,150,75,0,1139,1140,5,53,0,0,1140,1141, + 5,2,0,0,1141,1142,3,150,75,0,1142,1143,5,59,0,0,1143,1147,5,132, + 0,0,1144,1146,3,108,54,0,1145,1144,1,0,0,0,1146,1149,1,0,0,0,1147, + 1145,1,0,0,0,1147,1148,1,0,0,0,1148,1150,1,0,0,0,1149,1147,1,0,0, + 0,1150,1151,5,133,0,0,1151,1152,5,129,0,0,1152,1179,1,0,0,0,1153, + 1154,3,150,75,0,1154,1155,5,53,0,0,1155,1156,5,46,0,0,1156,1157, + 3,150,75,0,1157,1158,5,129,0,0,1158,1179,1,0,0,0,1159,1160,3,150, + 75,0,1160,1162,5,53,0,0,1161,1163,5,4,0,0,1162,1161,1,0,0,0,1162, + 1163,1,0,0,0,1163,1164,1,0,0,0,1164,1165,5,17,0,0,1165,1166,3,150, + 75,0,1166,1167,5,131,0,0,1167,1174,3,150,75,0,1168,1169,5,62,0,0, + 1169,1170,5,57,0,0,1170,1171,3,150,75,0,1171,1172,5,131,0,0,1172, + 1173,3,150,75,0,1173,1175,1,0,0,0,1174,1168,1,0,0,0,1174,1175,1, + 0,0,0,1175,1176,1,0,0,0,1176,1177,5,129,0,0,1177,1179,1,0,0,0,1178, + 1080,1,0,0,0,1178,1089,1,0,0,0,1178,1103,1,0,0,0,1178,1119,1,0,0, + 0,1178,1138,1,0,0,0,1178,1153,1,0,0,0,1178,1159,1,0,0,0,1179,131, + 1,0,0,0,1180,1181,5,46,0,0,1181,1182,3,150,75,0,1182,1183,5,53,0, + 0,1183,1184,3,150,75,0,1184,1185,5,131,0,0,1185,1187,3,150,75,0, + 1186,1188,3,128,64,0,1187,1186,1,0,0,0,1187,1188,1,0,0,0,1188,1189, + 1,0,0,0,1189,1190,5,129,0,0,1190,133,1,0,0,0,1191,1238,3,138,69, + 0,1192,1238,5,108,0,0,1193,1238,5,109,0,0,1194,1195,5,110,0,0,1195, + 1238,3,152,76,0,1196,1197,5,111,0,0,1197,1198,5,138,0,0,1198,1199, + 3,150,75,0,1199,1200,5,139,0,0,1200,1238,1,0,0,0,1201,1202,5,112, + 0,0,1202,1203,5,138,0,0,1203,1205,3,150,75,0,1204,1206,3,28,14,0, + 1205,1204,1,0,0,0,1205,1206,1,0,0,0,1206,1207,1,0,0,0,1207,1208, + 5,139,0,0,1208,1238,1,0,0,0,1209,1210,5,34,0,0,1210,1211,5,138,0, + 0,1211,1212,3,150,75,0,1212,1213,5,139,0,0,1213,1238,1,0,0,0,1214, + 1215,5,113,0,0,1215,1216,5,138,0,0,1216,1217,3,134,67,0,1217,1218, + 5,139,0,0,1218,1238,1,0,0,0,1219,1220,5,114,0,0,1220,1221,5,138, + 0,0,1221,1222,3,134,67,0,1222,1223,5,139,0,0,1223,1238,1,0,0,0,1224, + 1225,5,115,0,0,1225,1229,5,132,0,0,1226,1228,3,136,68,0,1227,1226, + 1,0,0,0,1228,1231,1,0,0,0,1229,1227,1,0,0,0,1229,1230,1,0,0,0,1230, + 1232,1,0,0,0,1231,1229,1,0,0,0,1232,1238,5,133,0,0,1233,1235,3,150, + 75,0,1234,1236,3,28,14,0,1235,1234,1,0,0,0,1235,1236,1,0,0,0,1236, + 1238,1,0,0,0,1237,1191,1,0,0,0,1237,1192,1,0,0,0,1237,1193,1,0,0, + 0,1237,1194,1,0,0,0,1237,1196,1,0,0,0,1237,1201,1,0,0,0,1237,1209, + 1,0,0,0,1237,1214,1,0,0,0,1237,1219,1,0,0,0,1237,1224,1,0,0,0,1237, + 1233,1,0,0,0,1238,135,1,0,0,0,1239,1240,3,150,75,0,1240,1241,5,128, + 0,0,1241,1242,3,134,67,0,1242,1243,5,129,0,0,1243,137,1,0,0,0,1244, + 1245,7,6,0,0,1245,139,1,0,0,0,1246,1247,7,7,0,0,1247,141,1,0,0,0, + 1248,1257,3,152,76,0,1249,1257,5,142,0,0,1250,1257,5,143,0,0,1251, + 1257,5,124,0,0,1252,1257,5,125,0,0,1253,1257,5,126,0,0,1254,1257, + 3,144,72,0,1255,1257,3,148,74,0,1256,1248,1,0,0,0,1256,1249,1,0, + 0,0,1256,1250,1,0,0,0,1256,1251,1,0,0,0,1256,1252,1,0,0,0,1256,1253, + 1,0,0,0,1256,1254,1,0,0,0,1256,1255,1,0,0,0,1257,143,1,0,0,0,1258, + 1267,5,132,0,0,1259,1264,3,146,73,0,1260,1261,5,130,0,0,1261,1263, + 3,146,73,0,1262,1260,1,0,0,0,1263,1266,1,0,0,0,1264,1262,1,0,0,0, + 1264,1265,1,0,0,0,1265,1268,1,0,0,0,1266,1264,1,0,0,0,1267,1259, + 1,0,0,0,1267,1268,1,0,0,0,1268,1269,1,0,0,0,1269,1270,5,133,0,0, + 1270,145,1,0,0,0,1271,1272,3,152,76,0,1272,1273,5,128,0,0,1273,1274, + 3,142,71,0,1274,147,1,0,0,0,1275,1284,5,134,0,0,1276,1281,3,142, + 71,0,1277,1278,5,130,0,0,1278,1280,3,142,71,0,1279,1277,1,0,0,0, + 1280,1283,1,0,0,0,1281,1279,1,0,0,0,1281,1282,1,0,0,0,1282,1285, + 1,0,0,0,1283,1281,1,0,0,0,1284,1276,1,0,0,0,1284,1285,1,0,0,0,1285, + 1286,1,0,0,0,1286,1287,5,135,0,0,1287,149,1,0,0,0,1288,1289,7,8, + 0,0,1289,151,1,0,0,0,1290,1291,5,145,0,0,1291,153,1,0,0,0,115,166, + 173,194,206,218,238,246,253,259,271,274,280,291,300,310,313,315, + 319,327,339,344,353,356,371,377,389,398,406,414,427,430,440,444, + 450,457,463,471,479,492,499,503,508,519,525,535,540,546,557,584, + 611,616,627,630,635,638,645,654,657,660,677,686,700,721,724,727, + 734,742,782,785,789,811,825,833,845,859,869,887,891,894,898,901, + 910,914,918,924,935,942,962,971,1003,1023,1043,1053,1056,1059,1061, + 1075,1099,1115,1124,1134,1147,1162,1174,1178,1187,1205,1229,1235, + 1237,1256,1264,1267,1281,1284 ]; private static __ATN: antlr.ATN; @@ -8274,8 +8288,17 @@ export class OperationProviderContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); } - public STATE(): antlr.TerminalNode | null { - return this.getToken(QuixosCapabilityParser.STATE, 0); + public LIFECYCLE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.LIFECYCLE, 0); + } + public DOT(): antlr.TerminalNode[]; + public DOT(i: number): antlr.TerminalNode | null; + public DOT(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(QuixosCapabilityParser.DOT); + } else { + return this.getToken(QuixosCapabilityParser.DOT, i); + } } public identifier(): IdentifierContext[]; public identifier(i: number): IdentifierContext | null; @@ -8286,14 +8309,8 @@ export class OperationProviderContext extends antlr.ParserRuleContext { return this.getRuleContext(i, IdentifierContext); } - public DOT(): antlr.TerminalNode[]; - public DOT(i: number): antlr.TerminalNode | null; - public DOT(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { - if (i === undefined) { - return this.getTokens(QuixosCapabilityParser.DOT); - } else { - return this.getToken(QuixosCapabilityParser.DOT, i); - } + public STATE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.STATE, 0); } public statePrimitive(): StatePrimitiveContext | null { return this.getRuleContext(0, StatePrimitiveContext); diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index fee0496..3ef4a69 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -1965,6 +1965,13 @@ const lowerConformance = ( return []; } const provider = bindingContext.operationProvider(); + if (provider.LIFECYCLE()) { + if (identifier(provider.identifier(0)) !== "delete") { + loweringIssue(state, provider, "invalid-lifecycle-binding", "Only lifecycle.delete is supported"); + return []; + } + return [{ operationId, binding: { kind: "lifecycle", primitive: "delete" } }]; + } if (provider.INTERFACE()) { const targetName = identifier(provider.identifier(0)); let target = requireSymbol(state, state.interfaces, targetName, provider, "interface"); diff --git a/src/capability-model/evolution.ts b/src/capability-model/evolution.ts index 6de2aed..0d9b0bd 100644 --- a/src/capability-model/evolution.ts +++ b/src/capability-model/evolution.ts @@ -195,6 +195,7 @@ export const runtimeContracts = (workspace: WorkspaceRevision): RuntimeContract[ } }; const binding = (parent: GraphNode, value: Binding, atomId: string, context: unknown) => { + if (value.kind === "lifecycle") return; if (value.kind !== "package") { dependency(parent, value, atomId); return; diff --git a/src/capability-model/execution.ts b/src/capability-model/execution.ts index 071b192..830cc0c 100644 --- a/src/capability-model/execution.ts +++ b/src/capability-model/execution.ts @@ -125,7 +125,7 @@ export function validateExecutionContracts(workspace: WorkspaceRevision): Capabi if (!revision) continue; for (const entry of conformance.operationBindings) { const operation = operations(entry.operationId, revision); - if (!operation?.execution || operation.execution.kind === "remote") continue; + if (!operation) continue; const path = `${conformance.atomId}/${revision.revisionId}/${entry.operationId}`; let binding; try { @@ -142,6 +142,19 @@ export function validateExecutionContracts(workspace: WorkspaceRevision): Capabi const target = interfaces.get(entry.binding.interfaceRevisionId); if (target) supports(operation.execution, operations(entry.binding.operationId, target)?.execution, path); } + if (binding.kind === "lifecycle") { + if ( + operation.execution?.kind !== "transaction" || + operation.execution.targets.length !== 1 || + operation.execution.targets[0] !== "server" + ) + fail( + path, + "Deletion requires an explicitly server-only transaction; partial replicas cannot enumerate incoming references", + ); + continue; + } + if (!operation.execution || operation.execution.kind === "remote") continue; if (binding.kind === "package") { const provider = packages.get(binding.packageRevisionId)?.exports.find((e) => e.id === binding.exportId); supports(operation.execution, provider?.execution, path); diff --git a/src/capability-model/types.ts b/src/capability-model/types.ts index 1bb0ded..2d87701 100644 --- a/src/capability-model/types.ts +++ b/src/capability-model/types.ts @@ -358,6 +358,7 @@ export interface RelationshipMaterialization { } export type Binding = + | { kind: "lifecycle"; primitive: "delete" } | { kind: "interface"; interfaceRevisionId: InterfaceRevisionId; diff --git a/src/capability-model/validation.ts b/src/capability-model/validation.ts index 3841d51..88a3e05 100644 --- a/src/capability-model/validation.ts +++ b/src/capability-model/validation.ts @@ -70,6 +70,7 @@ export type CapabilityValidationIssueCode = | "invalid-attachment" | "invalid-state-binding" | "invalid-edge-binding" + | "invalid-lifecycle-binding" | "invalid-package-binding" | "invalid-forwarding-binding" | "invalid-dependency-binding" @@ -1696,6 +1697,24 @@ const validateConformances = ( ); continue; } + if (binding.kind === "lifecycle") { + if ( + binding.primitive !== "delete" || + operationEntry.member.kind !== "operation" || + operation.mode !== "call" || + operation.inputType.kind !== "builtin" || + operation.inputType.name !== "unit" || + operation.outputType.kind !== "builtin" || + operation.outputType.name !== "unit" + ) + issue( + issues, + "invalid-lifecycle-binding", + bindingPath, + "Deletion implements an object call from unit to unit", + ); + continue; + } if (binding.kind === "state") { const attachment = findAttachment(indexes, "state", binding.slotId); if (!attachment || attachment.attachment.kind !== "state") { @@ -2324,6 +2343,7 @@ export const resolveOperationPlan = ( attachment: owned as OwnedAttachment & { attachment: EdgeDefinition }, }; } + if (binding.kind === "lifecycle") return undefined; // Old runtime has no lifecycle provider. const packageRevision = plan.packages.get(binding.packageRevisionId); const packageExport = packageRevision?.exports.find( (entry): entry is PackageOperationExport | PackageFunctionExport => @@ -2469,7 +2489,7 @@ export const computeCapabilityClosure = ( attachments.add(binding.edgeTypeId); } else if (binding.kind === "interface") { queued.push({ atomId: root.atomId, interfaceRevisionId: binding.interfaceRevisionId }); - } else { + } else if (binding.kind === "package") { packages.add(binding.packageRevisionId); includeDependencies(root.atomId, binding.dependencies); const packageRevision = plan.packages.get(binding.packageRevisionId); diff --git a/src/execution-world/kernel.ts b/src/execution-world/kernel.ts index def6a73..126aae6 100644 --- a/src/execution-world/kernel.ts +++ b/src/execution-world/kernel.ts @@ -44,16 +44,11 @@ export function compileKernelProgram(plan: ExecutionPlan): unknown { }); } else { const endpoints = storage.endpoints.map((endpoint) => { - if ( - endpoint.ordered || - endpoint.keyType || - endpoint.retainOther || - (endpoint.onDelete && endpoint.onDelete !== "restrict") - ) + if (endpoint.ordered || endpoint.keyType || endpoint.retainOther) throw new ExecutionPlanError( "UNSUPPORTED_GRAPH_FEATURE", storage.id, - "Ordered/keyed/deletion policies require LF-18", + "Ordered/keyed relations and automatic retention are not implemented", ); return { projection: endpoint.projectionId, @@ -65,6 +60,7 @@ export function compileKernelProgram(plan: ExecutionPlan): unknown { : endpoint.constraint.interfaceRevisionId, }, cardinality: endpoint.cardinality, + ...(endpoint.onDelete ? { onDelete: endpoint.onDelete } : {}), }; }); edges.push({ id: storage.id, owner: owner.id, a: endpoints[0], b: endpoints[1] }); @@ -97,7 +93,8 @@ export function compileKernelProgram(plan: ExecutionPlan): unknown { const binding = operation.binding; let target: unknown; let unsupported: string | null = null; - if (binding.kind === "state") + if (binding.kind === "lifecycle") target = { kind: "lifecycle", primitive: binding.primitive }; + else if (binding.kind === "state") target = { kind: "state", owner: slotOwner(binding.slotId), slot: binding.slotId, primitive: binding.primitive }; else if (binding.kind === "edge") target = { diff --git a/src/execution-world/plan.ts b/src/execution-world/plan.ts index 4bf128d..9d62e22 100644 --- a/src/execution-world/plan.ts +++ b/src/execution-world/plan.ts @@ -214,7 +214,7 @@ export function compileExecutionPlan(input: WorkspaceRevision): ExecutionPlan { if (binding.kind === "state") planned.dependencies.push({ kind: "state", slot: binding.slotId }); else if (binding.kind === "edge") planned.dependencies.push({ kind: "edge", edge: binding.edgeTypeId, projection: binding.projectionId }); - else { + else if (binding.kind === "package") { const entry = packages.get(binding.packageRevisionId)?.exports.find((e) => e.id === binding.exportId); if (!entry) throw new ExecutionPlanError("MISSING_EXPORT", key, "Unresolved package export"); for (const dependency of binding.dependencies) { diff --git a/test/lifecycle.test.ts b/test/lifecycle.test.ts new file mode 100644 index 0000000..c05e4a6 --- /dev/null +++ b/test/lifecycle.test.ts @@ -0,0 +1,66 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/parser.js"; +import { formatQx } from "../src/capability-language/source.js"; +import { compileExecutionPlan, compileKernelProgram } from "../src/execution-world/index.js"; +const contract = `interface Item id "item" revision "item@1" { + operation remove id "remove" : unit -> unit { + call id "remove:call" execution transaction targets [server]; + } +}`; +const workspace = `workspace Lifecycle id "workspace:lifecycle" revision "workspace:lifecycle@1" commit "${"a".repeat(40)}" { + import interface Item; + atom Node id "node"; + conform Node as Item id "node:item" { + private edge Links id "links" { + atom Node projection children id "children" many on-delete "cascade-other"; + atom Node projection parent id "parent" optional-one on-delete "detach"; + } + bind remove.call to lifecycle.delete; + } +}`; +function compile(ifaceSource = contract, workspaceSource = workspace) { + const iface = compileCapabilityResourceSource(ifaceSource, { + source: { repository: "https://example.test/lifecycle.git", commit: "a".repeat(40) }, + }); + assert.ok(iface.ok && iface.resource.kind === "interface", JSON.stringify(iface.diagnostics)); + return compileCapabilitySource(workspaceSource, "workspace.qx", { + interfaces: new Map([["Item", iface.resource.revision]]), + }); +} +test("lifecycle binding and endpoint policies survive formatting and kernel compilation", () => { + const result = compile(); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const formatted = compile(formatQx(contract), formatQx(workspace)); + assert.ok(formatted.ok, JSON.stringify(formatted.diagnostics)); + const plan = compileExecutionPlan(result.workspace); + assert.equal(compileExecutionPlan(formatted.workspace).digest, plan.digest); + const kernel = compileKernelProgram(plan) as { + operations: { binding: unknown }[]; + model: { edges: { a: { onDelete: string }; b: { onDelete: string } }[] }; + }; + assert.deepEqual(kernel.operations[0]!.binding, { kind: "lifecycle", primitive: "delete" }); + assert.equal(kernel.model.edges[0]!.a.onDelete, "cascade-other"); + assert.equal(kernel.model.edges[0]!.b.onDelete, "detach"); +}); +test("deletion rejects browser, snapshot, remote, class, payload and unknown primitive promises", () => { + for (const [iface, ws] of [ + [contract.replace("targets [server]", "targets [browser, server]"), workspace], + [contract.replace("transaction targets", "snapshot targets"), workspace], + [contract.replace("execution transaction targets [server]", "execution remote"), workspace], + [contract.replace("execution transaction targets [server]", ""), workspace], + [contract.replace("operation remove", "static operation remove"), workspace], + [contract.replace("unit -> unit", "string -> unit"), workspace], + [contract.replace("unit -> unit", "unit -> string"), workspace], + [contract, workspace.replace("lifecycle.delete", "lifecycle.resurrect")], + ]) { + const result = compile(iface, ws); + assert.equal(result.ok, false, iface + ws); + assert.ok( + result.diagnostics.some((d) => + ["invalid-execution-contract", "invalid-lifecycle-binding", "invalid-package-binding"].includes(d.code), + ), + JSON.stringify(result.diagnostics), + ); + } +}); From 33f674321b2b59d23631f375947b79282cf909fd Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 20 Sep 2026 22:48:09 -0700 Subject: [PATCH 31/91] Qualify collection compare-and-swap and explicit ensure mutations --- test/collections-fixture.ts | 23 +++++++++++++++ test/emit-portable-reader.ts | 6 ++++ .../fixtures/collections/CollectionRuntime.qx | 18 ++++++++++++ test/fixtures/collections/NodeData.qx | 26 +++++++++++++++++ test/fixtures/collections/workspace.qx | 28 +++++++++++++++++++ 5 files changed, 101 insertions(+) create mode 100644 test/collections-fixture.ts create mode 100644 test/fixtures/collections/CollectionRuntime.qx create mode 100644 test/fixtures/collections/NodeData.qx create mode 100644 test/fixtures/collections/workspace.qx diff --git a/test/collections-fixture.ts b/test/collections-fixture.ts new file mode 100644 index 0000000..921acda --- /dev/null +++ b/test/collections-fixture.ts @@ -0,0 +1,23 @@ +import assert from "node:assert/strict"; +import { readFile } from "node:fs/promises"; +import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/parser.js"; +import { compileExecutionPlan } from "../src/execution-world/plan.js"; +import type { InterfaceRevision } from "../src/capability-model/types.js"; +export async function collectionsPlan() { + const read = (name: string) => readFile(`test/fixtures/collections/${name}.qx`, "utf8"); + const source = { repository: "https://example.test/collections.git", commit: "a".repeat(40) }; + const interfaces = new Map(); + for (const name of ["NodeData"]) { + const result = compileCapabilityResourceSource(await read(name), { source, environment: { interfaces } }); + assert.ok(result.ok && result.resource.kind === "interface", JSON.stringify(result.diagnostics)); + interfaces.set(name, result.resource.revision); + } + const pkg = compileCapabilityResourceSource(await read("CollectionRuntime"), { source, environment: { interfaces } }); + assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); + const result = compileCapabilitySource(await read("workspace"), "workspace.qx", { + interfaces, + packages: new Map([["CollectionRuntime", pkg.resource.revision]]), + }); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + return compileExecutionPlan(result.workspace); +} diff --git a/test/emit-portable-reader.ts b/test/emit-portable-reader.ts index 90a413f..dba500f 100644 --- a/test/emit-portable-reader.ts +++ b/test/emit-portable-reader.ts @@ -119,3 +119,9 @@ for (const [name, revision] of [ `dist/portable-reader/async/${name}.ts`, generateRemoteTypeScriptBindings(asyncPlan.definition.bindingSchema, revision), ); + +const { collectionsPlan } = await import("./collections-fixture.js"); +const collections = await collectionsPlan(); +await mkdir("dist/portable-reader/collections", { recursive: true }); +await writeFile("dist/portable-reader/collections/plan.json", JSON.stringify(collections)); +await writeFile("dist/portable-reader/collections/kernel.json", JSON.stringify(compileKernelProgram(collections))); diff --git a/test/fixtures/collections/CollectionRuntime.qx b/test/fixtures/collections/CollectionRuntime.qx new file mode 100644 index 0000000..160601b --- /dev/null +++ b/test/fixtures/collections/CollectionRuntime.qx @@ -0,0 +1,18 @@ +type Replacement = record { expected: list; targets: list>; }; +type Seed = record { label: string; }; +external atom Node id "collection:node"; +package CollectionRuntime id "collection:runtime" revision "collection:runtime@1" { + operation version id "collection:runtime:version" : unit -> list + mode call execution snapshot targets [browser, server] receiver atom Node requires { + edge items id "collection:version:items" : many atom Node [resolve]; + }; + operation replace id "collection:runtime:replace" : Replacement -> unit + mode call execution transaction targets [browser, server] receiver atom Node requires { + edge items id "collection:replace:items" : many atom Node [resolve, connect, disconnect]; + }; + operation ensure id "collection:runtime:ensure" : unit -> atom-ref + mode call execution transaction targets [browser, server] receiver atom Node requires { + edge detail id "collection:ensure:detail" : optional-one atom Node [resolve, connect]; + creation node id "collection:ensure:node" : Node input Seed; + }; +} diff --git a/test/fixtures/collections/NodeData.qx b/test/fixtures/collections/NodeData.qx new file mode 100644 index 0000000..21eb3ce --- /dev/null +++ b/test/fixtures/collections/NodeData.qx @@ -0,0 +1,26 @@ +type Replacement = record { expected: list; targets: list>; }; +external atom Node id "collection:node"; +interface NodeData id "collection:data" revision "collection:data@1" { + queryable portable value version id "collection:version" : list { + get id "collection:version:get" execution snapshot targets [browser, server]; + } + operation replace id "collection:replace" : Replacement -> unit { + call id "collection:replace:call" execution transaction targets [browser, server]; + } + operation ensure id "collection:ensure" : unit -> atom-ref { + call id "collection:ensure:call" execution transaction targets [browser, server]; + } + queryable value label id "collection:label" : string { + get id "collection:label:get" execution snapshot targets [browser, server]; + set id "collection:label:set" execution transaction targets [browser, server]; + } + queryable relation items id "collection:items" : many atom Node { + resolve id "collection:items:resolve" execution snapshot targets [browser, server]; + } + queryable relation containers id "collection:containers" : many atom Node { + resolve id "collection:containers:resolve" execution snapshot targets [browser, server]; + } + queryable relation detail id "collection:detail" : optional-one atom Node { + resolve id "collection:detail:resolve" execution snapshot targets [browser, server]; + } +} diff --git a/test/fixtures/collections/workspace.qx b/test/fixtures/collections/workspace.qx new file mode 100644 index 0000000..8a726d5 --- /dev/null +++ b/test/fixtures/collections/workspace.qx @@ -0,0 +1,28 @@ +workspace Collections id "workspace:collections" revision "workspace:collections@1" commit "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" { + import interface NodeData; + import package CollectionRuntime; + atom Node id "collection:node"; + conform Node as NodeData id "collection:node:data" { + private state Label id "collection:label-slot" on Node : string policy register; + private edge Items id "collection:items-edge" { + atom Node projection items id "collection:items-projection" many; + atom Node projection containers id "collection:containers-projection" many; + } + private edge Detail id "collection:detail-edge" { + atom Node projection detail id "collection:detail-projection" optional-one; + atom Node projection owner id "collection:owner-projection" optional-one; + } + initialize { label to state Label; }; + bind label.get to state Label.read; + bind label.set to state Label.write; + bind items.resolve to edge Items.items.resolve; + bind containers.resolve to edge Items.containers.resolve; + bind detail.resolve to edge Detail.detail.resolve; + bind version.get to package CollectionRuntime.version with { items to edge Items.items; }; + bind replace.call to package CollectionRuntime.replace with { items to edge Items.items; }; + bind ensure.call to package CollectionRuntime.ensure with { + detail to edge Detail.detail; + node to creation Node with { NodeData from input; }; + }; + } +} From 2056c1e35236a7eb8fe8ed2afba753d51a5ef0b8 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 20 Sep 2026 22:57:27 -0700 Subject: [PATCH 32/91] Support captured CRDT changes in compound transaction contracts --- src/capability-language/generic-types.ts | 12 ++--- src/capability-model/validation.ts | 10 ++++ src/execution-world/plan.ts | 8 +-- test/compound-crdt-fixture.ts | 23 ++++++++ test/compound-crdt.test.ts | 62 ++++++++++++++++++++++ test/crdt-edit-contracts.test.ts | 12 ++--- test/emit-portable-reader.ts | 6 +++ test/fixtures/compound-crdt/EditRuntime.qx | 14 +++++ test/fixtures/compound-crdt/NoteData.qx | 18 +++++++ test/fixtures/compound-crdt/workspace.qx | 22 ++++++++ 10 files changed, 171 insertions(+), 16 deletions(-) create mode 100644 test/compound-crdt-fixture.ts create mode 100644 test/compound-crdt.test.ts create mode 100644 test/fixtures/compound-crdt/EditRuntime.qx create mode 100644 test/fixtures/compound-crdt/NoteData.qx create mode 100644 test/fixtures/compound-crdt/workspace.qx diff --git a/src/capability-language/generic-types.ts b/src/capability-language/generic-types.ts index 98fa817..94a8420 100644 --- a/src/capability-language/generic-types.ts +++ b/src/capability-language/generic-types.ts @@ -319,12 +319,12 @@ export class GenericSourceTypes { return { kind: "record", fields: Object.fromEntries(fields) }; } const name = context.identifier()!.getText(); - if (name === "change" && context.typeArguments()) - throw new GenericTypeError( - "unsupported-prepared-change", - name, - "Authored change transport values require LF-19; native edit contracts are available separately", - ); + if (name === "change" && context.typeArguments()) { + const args = this.arguments(context.typeArguments()); + if (args.length !== 1 || args[0]!.kind !== "value") + throw new GenericTypeError("invalid-change-type", name, "change requires one materialized value type"); + return { kind: "change", value: args[0]!.type }; + } if (context.ATOM_REF()) return { kind: "object-ref", expectation: this.atom(name) }; if (context.INTERFACE_REF()) return { diff --git a/src/capability-model/validation.ts b/src/capability-model/validation.ts index 88a3e05..3e0daf5 100644 --- a/src/capability-model/validation.ts +++ b/src/capability-model/validation.ts @@ -1,3 +1,4 @@ +import { isStorableType } from "./generics.js"; import { validateInitialization } from "./initialization.js"; import { validateExecutionContracts } from "./execution.js"; import { resolveForwardedBinding, type ConcreteBinding } from "./forwarding.js"; @@ -244,6 +245,15 @@ const validateValueType = ( requireText(issues, type.descriptorId, `${path}.descriptorId`, "Message descriptor identity"); return; case "change": + if (!isStorableType(type.value)) + issue( + issues, + "invalid-value-type", + path, + "change requires a storable materialized type, not references or nested changes", + ); + validateValueType(issues, type.value, path + ".value", indexes); + return; case "optional": case "list": validateValueType(issues, type.value, `${path}.value`, indexes); diff --git a/src/execution-world/plan.ts b/src/execution-world/plan.ts index 9d62e22..cc0a96b 100644 --- a/src/execution-world/plan.ts +++ b/src/execution-world/plan.ts @@ -144,8 +144,8 @@ export function compileExecutionPlan(input: WorkspaceRevision): ExecutionPlan { for (const pkg of workspace.packageImports) for (const entry of pkg.exports) if (entry.execution && entry.execution.kind !== "remote") { - checkValue(entry.inputType, `${pkg.revisionId}/${entry.id}/input`); - checkValue(entry.outputType, `${pkg.revisionId}/${entry.id}/output`); + checkValue(entry.inputType, `${pkg.revisionId}/${entry.id}/input`, true); + checkValue(entry.outputType, `${pkg.revisionId}/${entry.id}/output`, true); } for (const attachment of attachments) if (attachment.kind === "state" && attachment.storagePolicy.kind === "crdt-document") @@ -208,8 +208,8 @@ export function compileExecutionPlan(input: WorkspaceRevision): ExecutionPlan { operationMap.set(key, planned); const portable = planned.execution.kind !== "remote"; if (portable) { - checkValue(planned.input, `${key}/input`, binding.kind === "state" && binding.primitive === "edit"); - checkValue(planned.output, `${key}/output`); + checkValue(planned.input, `${key}/input`, true); + checkValue(planned.output, `${key}/output`, true); } if (binding.kind === "state") planned.dependencies.push({ kind: "state", slot: binding.slotId }); else if (binding.kind === "edge") diff --git a/test/compound-crdt-fixture.ts b/test/compound-crdt-fixture.ts new file mode 100644 index 0000000..2f22a29 --- /dev/null +++ b/test/compound-crdt-fixture.ts @@ -0,0 +1,23 @@ +import assert from "node:assert/strict"; +import { readFile } from "node:fs/promises"; +import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/parser.js"; +import { compileExecutionPlan } from "../src/execution-world/plan.js"; +import type { InterfaceRevision } from "../src/capability-model/types.js"; +export async function compoundCrdtPlan() { + const read = (name: string) => readFile(`test/fixtures/compound-crdt/${name}.qx`, "utf8"); + const source = { repository: "https://example.test/compound.git", commit: "a".repeat(40) }; + const interfaces = new Map(); + for (const name of ["NoteData"]) { + const result = compileCapabilityResourceSource(await read(name), { source, environment: { interfaces } }); + assert.ok(result.ok && result.resource.kind === "interface", JSON.stringify(result.diagnostics)); + interfaces.set(name, result.resource.revision); + } + const pkg = compileCapabilityResourceSource(await read("EditRuntime"), { source, environment: { interfaces } }); + assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); + const result = compileCapabilitySource(await read("workspace"), "workspace.qx", { + interfaces, + packages: new Map([["EditRuntime", pkg.resource.revision]]), + }); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + return compileExecutionPlan(result.workspace); +} diff --git a/test/compound-crdt.test.ts b/test/compound-crdt.test.ts new file mode 100644 index 0000000..30855cb --- /dev/null +++ b/test/compound-crdt.test.ts @@ -0,0 +1,62 @@ +import assert from "node:assert/strict"; +import { readFile } from "node:fs/promises"; +import { test } from "node:test"; +import { compoundCrdtPlan } from "./compound-crdt-fixture.js"; +import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/parser.js"; +import { compileKernelProgram } from "../src/execution-world/index.js"; +import { generatePortableTypeScriptBindings } from "../src/bindings/portable.js"; +const source = { repository: "https://example.test/change.git", commit: "a".repeat(40) }; +test("compound captured changes survive planning, transport lowering and typed edit ports", async () => { + const plan = await compoundCrdtPlan(); + const kernel = compileKernelProgram(plan) as { + operations: { operation: string; input: { fields: { change: { kind: string } } } }[]; + }; + const operation = kernel.operations.find((op) => op.operation === "compound:update:call")!; + assert.equal(operation.input.fields.change.kind, "record"); + const code = generatePortableTypeScriptBindings(plan.definition.bindingSchema, "compound:runtime@1", { + target: "browser", + }); + assert.ok(code.includes("PreparedChange<")); + assert.ok(code.includes('"edit"')); + assert.ok(!code.includes('"compound:runtime:check"')); +}); +test("prepared changes require one storable materialized type", () => { + for (const shape of ["change", "change", "change>", "change>"]) { + const result = compileCapabilityResourceSource( + `external atom N id "n"; package P id "p" revision "p@1" { + function f id "f" : ${shape} -> unit execution transaction targets [browser, server]; + }`, + { source }, + ); + assert.equal(result.ok, false, shape); + } +}); +test("captured changes cannot be persisted in a register or CRDT", async () => { + const iface = compileCapabilityResourceSource(await readFile("test/fixtures/compound-crdt/NoteData.qx", "utf8"), { + source, + }); + assert.ok(iface.ok && iface.resource.kind === "interface", JSON.stringify(iface.diagnostics)); + const pkg = compileCapabilityResourceSource(await readFile("test/fixtures/compound-crdt/EditRuntime.qx", "utf8"), { + source, + }); + assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); + const workspace = await readFile("test/fixtures/compound-crdt/workspace.qx", "utf8"); + for (const policy of ["register", "crdt(change)"]) { + const result = compileCapabilitySource( + workspace.replace( + "private state Allowed", + `private state Captured id "captured" on Note : record { captured: change; } policy ${policy};\n private state Allowed`, + ), + "workspace.qx", + { + interfaces: new Map([["NoteData", iface.resource.revision]]), + packages: new Map([["EditRuntime", pkg.resource.revision]]), + }, + ); + assert.equal(result.ok, false); + assert.ok( + result.diagnostics.some((d) => d.code === "invalid-attachment"), + JSON.stringify(result.diagnostics), + ); + } +}); diff --git a/test/crdt-edit-contracts.test.ts b/test/crdt-edit-contracts.test.ts index c97329b..ac12b99 100644 --- a/test/crdt-edit-contracts.test.ts +++ b/test/crdt-edit-contracts.test.ts @@ -53,16 +53,16 @@ test("edit cannot target a register, mismatched profile, or ordinary replacement ); } }); -test("authored prepared change transport values fail explicitly until their runtime is implemented", () => { +test("authored prepared changes retain their materialized type as transport values", () => { const result = compileCapabilityResourceSource( 'package P id "p" revision "p@1" { function applyChange id "apply" : change -> unit; }', { source }, ); - assert.equal(result.ok, false); - assert.ok( - result.diagnostics.some((d) => d.code === "unsupported-prepared-change"), - JSON.stringify(result.diagnostics), - ); + assert.ok(result.ok && result.resource.kind === "package", JSON.stringify(result.diagnostics)); + assert.deepEqual(result.resource.revision.exports[0]!.inputType, { + kind: "change", + value: { kind: "scalar", name: "string" }, + }); }); test("generic edit retains its materialized type through specialization", () => { diff --git a/test/emit-portable-reader.ts b/test/emit-portable-reader.ts index dba500f..67af83d 100644 --- a/test/emit-portable-reader.ts +++ b/test/emit-portable-reader.ts @@ -125,3 +125,9 @@ const collections = await collectionsPlan(); await mkdir("dist/portable-reader/collections", { recursive: true }); await writeFile("dist/portable-reader/collections/plan.json", JSON.stringify(collections)); await writeFile("dist/portable-reader/collections/kernel.json", JSON.stringify(compileKernelProgram(collections))); + +const { compoundCrdtPlan } = await import("./compound-crdt-fixture.js"); +const compoundCrdt = await compoundCrdtPlan(); +await mkdir("dist/portable-reader/compound-crdt", { recursive: true }); +await writeFile("dist/portable-reader/compound-crdt/plan.json", JSON.stringify(compoundCrdt)); +await writeFile("dist/portable-reader/compound-crdt/kernel.json", JSON.stringify(compileKernelProgram(compoundCrdt))); diff --git a/test/fixtures/compound-crdt/EditRuntime.qx b/test/fixtures/compound-crdt/EditRuntime.qx new file mode 100644 index 0000000..7921851 --- /dev/null +++ b/test/fixtures/compound-crdt/EditRuntime.qx @@ -0,0 +1,14 @@ +external atom Note id "compound:note"; +type Content = record { text: string; tags: list; }; +type Edit = record { change: change; resolved: bool; }; +package EditRuntime id "compound:runtime" revision "compound:runtime@1" { + operation update id "compound:runtime:update" : Edit -> unit + mode call execution transaction targets [browser, server] receiver atom Note requires { + state content id "compound:edit:content" : Content [edit]; + state resolved id "compound:edit:resolved" : bool [write]; + } accept using check; + operation check id "compound:runtime:check" : Edit -> unit + mode call execution snapshot targets [server] receiver atom Note requires { + state allowed id "compound:check:allowed" : bool [read]; + }; +} diff --git a/test/fixtures/compound-crdt/NoteData.qx b/test/fixtures/compound-crdt/NoteData.qx new file mode 100644 index 0000000..7834319 --- /dev/null +++ b/test/fixtures/compound-crdt/NoteData.qx @@ -0,0 +1,18 @@ +type Content = record { text: string; tags: list; }; +type Edit = record { change: change; resolved: bool; }; +interface NoteData id "compound:data" revision "compound:data@1" { + operation update id "compound:update" : Edit -> unit { + call id "compound:update:call" execution transaction targets [browser, server]; + } + queryable value content id "compound:content" : Content { + get id "compound:content:get" execution snapshot targets [browser, server]; + edit id "compound:content:edit" execution transaction targets [browser, server]; + } + queryable value resolved id "compound:resolved" : bool { + get id "compound:resolved:get" execution snapshot targets [browser, server]; + } + queryable value title id "compound:title" : string { + get id "compound:title:get" execution snapshot targets [browser, server]; + set id "compound:title:set" execution transaction targets [browser, server]; + } +} diff --git a/test/fixtures/compound-crdt/workspace.qx b/test/fixtures/compound-crdt/workspace.qx new file mode 100644 index 0000000..d3eb453 --- /dev/null +++ b/test/fixtures/compound-crdt/workspace.qx @@ -0,0 +1,22 @@ +workspace Compound id "workspace:compound" revision "workspace:compound@1" commit "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" { + import interface NoteData; + import package EditRuntime; + type Content = record { text: string; tags: list; }; + atom Note id "compound:note"; + conform Note as NoteData id "compound:note:data" { + private state Content id "compound:content-slot" on Note : Content policy crdt(Content); + private state Resolved id "compound:resolved-slot" on Note : bool policy register default false; + private state Title id "compound:title-slot" on Note : string policy register default "note"; + private state Allowed id "compound:allowed-slot" on Note : bool policy register default true; + initialize { content to state Content; }; + bind content.get to state Content.read; + bind content.edit to state Content.edit; + bind resolved.get to state Resolved.read; + bind title.get to state Title.read; + bind title.set to state Title.write; + bind update.call to package EditRuntime.update with { + content to state Content; + resolved to state Resolved; + } accept with { allowed to state Allowed; }; + } +} From 47a3fe9eae90c156f70227985d1022d9beaeafc2 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 20 Sep 2026 23:07:09 -0700 Subject: [PATCH 33/91] Preserve nested CRDT recovery and serialize compound editor submissions --- src/execution-world/kernel.ts | 10 ++++++++++ test/compound-crdt.test.ts | 12 +++++++++++- test/fixtures/compound-crdt/EditRuntime.qx | 9 +++++++++ test/fixtures/compound-crdt/NoteData.qx | 3 +++ test/fixtures/compound-crdt/workspace.qx | 4 ++++ 5 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/execution-world/kernel.ts b/src/execution-world/kernel.ts index 126aae6..87cc5dc 100644 --- a/src/execution-world/kernel.ts +++ b/src/execution-world/kernel.ts @@ -8,6 +8,14 @@ import type { } from "../capability-model/types.js"; import { type ExecutionPlan, ExecutionPlanError, hexDigest } from "./plan.js"; import { portableValueSchema } from "../bindings/portable.js"; +function preparedInputPaths(type: ValueType, path: (string | null)[] = []): (string | null)[][] { + if (type.kind === "change") return [path]; + if (type.kind === "optional") return preparedInputPaths(type.value, path); + if (type.kind === "list") return preparedInputPaths(type.value, [...path, null]); + if (type.kind === "record") + return Object.entries(type.fields).flatMap(([key, value]) => preparedInputPaths(value, [...path, key])); + return []; +} /** Small data-only interpreter input; no compiler, parser, Node module or SQL dependency reaches the browser. */ export function compileKernelProgram(plan: ExecutionPlan): unknown { if (hexDigest(plan.definition) !== plan.digest) @@ -172,6 +180,7 @@ export function compileKernelProgram(plan: ExecutionPlan): unknown { : {}), }; } + const inputChanges = preparedInputPaths(operation.input); const input = schema(operation.input), output = schema(operation.output); return { @@ -183,6 +192,7 @@ export function compileKernelProgram(plan: ExecutionPlan): unknown { effect: operation.execution.kind, targets: operation.execution.kind === "remote" ? [] : operation.execution.targets, input, + ...(inputChanges.length ? { inputChanges } : {}), output, unsupported: unsupported ?? (input && output ? null : "UNSUPPORTED_OPERATION_CODEC"), binding: target, diff --git a/test/compound-crdt.test.ts b/test/compound-crdt.test.ts index 30855cb..4f773b6 100644 --- a/test/compound-crdt.test.ts +++ b/test/compound-crdt.test.ts @@ -9,10 +9,20 @@ const source = { repository: "https://example.test/change.git", commit: "a".repe test("compound captured changes survive planning, transport lowering and typed edit ports", async () => { const plan = await compoundCrdtPlan(); const kernel = compileKernelProgram(plan) as { - operations: { operation: string; input: { fields: { change: { kind: string } } } }[]; + operations: { + operation: string; + inputChanges?: (string | null)[][]; + input: { fields: { change: { kind: string } } }; + }[]; }; const operation = kernel.operations.find((op) => op.operation === "compound:update:call")!; assert.equal(operation.input.fields.change.kind, "record"); + const paths = kernel.operations as unknown as { operation: string; inputChanges?: (string | null)[][] }[]; + assert.deepEqual(paths.find((op) => op.operation === "compound:update:call")!.inputChanges, [["change"]]); + assert.deepEqual(paths.find((op) => op.operation === "compound:batch:call")!.inputChanges, [ + ["edits", null, "change"], + ]); + assert.deepEqual(paths.find((op) => op.operation === "compound:content:edit")!.inputChanges, [[]]); const code = generatePortableTypeScriptBindings(plan.definition.bindingSchema, "compound:runtime@1", { target: "browser", }); diff --git a/test/fixtures/compound-crdt/EditRuntime.qx b/test/fixtures/compound-crdt/EditRuntime.qx index 7921851..be4f938 100644 --- a/test/fixtures/compound-crdt/EditRuntime.qx +++ b/test/fixtures/compound-crdt/EditRuntime.qx @@ -2,6 +2,15 @@ external atom Note id "compound:note"; type Content = record { text: string; tags: list; }; type Edit = record { change: change; resolved: bool; }; package EditRuntime id "compound:runtime" revision "compound:runtime@1" { + operation batch id "compound:runtime:batch" : record { edits: list; } -> unit + mode call execution transaction targets [browser, server] receiver atom Note requires { + state content id "compound:batch:content" : Content [edit]; + state resolved id "compound:batch:resolved" : bool [write]; + } accept using checkBatch; + operation checkBatch id "compound:runtime:check-batch" : record { edits: list; } -> unit + mode call execution snapshot targets [server] receiver atom Note requires { + state allowed id "compound:batch:allowed" : bool [read]; + }; operation update id "compound:runtime:update" : Edit -> unit mode call execution transaction targets [browser, server] receiver atom Note requires { state content id "compound:edit:content" : Content [edit]; diff --git a/test/fixtures/compound-crdt/NoteData.qx b/test/fixtures/compound-crdt/NoteData.qx index 7834319..f0e30e1 100644 --- a/test/fixtures/compound-crdt/NoteData.qx +++ b/test/fixtures/compound-crdt/NoteData.qx @@ -1,6 +1,9 @@ type Content = record { text: string; tags: list; }; type Edit = record { change: change; resolved: bool; }; interface NoteData id "compound:data" revision "compound:data@1" { + operation batch id "compound:batch" : record { edits: list; } -> unit { + call id "compound:batch:call" execution transaction targets [browser, server]; + } operation update id "compound:update" : Edit -> unit { call id "compound:update:call" execution transaction targets [browser, server]; } diff --git a/test/fixtures/compound-crdt/workspace.qx b/test/fixtures/compound-crdt/workspace.qx index d3eb453..dbe4d80 100644 --- a/test/fixtures/compound-crdt/workspace.qx +++ b/test/fixtures/compound-crdt/workspace.qx @@ -14,6 +14,10 @@ workspace Compound id "workspace:compound" revision "workspace:compound@1" commi bind resolved.get to state Resolved.read; bind title.get to state Title.read; bind title.set to state Title.write; + bind batch.call to package EditRuntime.batch with { + content to state Content; + resolved to state Resolved; + } accept with { allowed to state Allowed; }; bind update.call to package EditRuntime.update with { content to state Content; resolved to state Resolved; From 08e322e59f0c3f60876aed1fe647ded8d0c946c7 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 20 Sep 2026 23:50:52 -0700 Subject: [PATCH 34/91] Reject unsupported query operators during execution planning --- src/execution-world/plan.ts | 34 ++++++++++++++ src/execution-world/query-operators.ts | 62 ++++++++++++++++++++++++++ test/execution-world.test.ts | 24 ++++++++++ test/query-aggregation.test.ts | 12 +++++ 4 files changed, 132 insertions(+) create mode 100644 src/execution-world/query-operators.ts diff --git a/src/execution-world/plan.ts b/src/execution-world/plan.ts index cc0a96b..c5f93a2 100644 --- a/src/execution-world/plan.ts +++ b/src/execution-world/plan.ts @@ -14,6 +14,7 @@ import { canonicalJson, contentDigest } from "../capability-model/evolution.js"; import { resolveForwardedBinding } from "../capability-model/forwarding.js"; import { linkQueries, type LinkedQuery } from "../query/link.js"; import { type BindingSchema } from "../bindings/index.js"; +import { unsupportedQueryOperator } from "./query-operators.js"; export class ExecutionPlanError extends Error { constructor( @@ -305,6 +306,35 @@ export function compileExecutionPlan(input: WorkspaceRevision): ExecutionPlan { admittedOperations: [], })); for (const query of plannedQueries) { + for (const field of query.query.fields) { + const operation = operationMap.get(publicOperationKey(field.atomId, field.interfaceRevisionId, field.getter))!; + const effect = query.query.checked.effects.find( + (effect) => effect.interfaceRevisionId === field.interfaceRevisionId && effect.memberId === field.memberId, + ); + if ( + operation.execution.kind === "remote" && + (query.query.checked.declaration.placement?.kind === "replica" || effect?.uses.some((use) => use !== "select")) + ) + throw new ExecutionPlanError( + "QUERY_REMOTE_MEMBERSHIP_UNSUPPORTED", + query.id, + "Remote getters may enrich selected values after native snapshot closure; they cannot determine membership, order or canonical-input admission. Expose an accepted canonical value or split the service result into a separate query.", + ); + const member = interfaces.get(field.interfaceRevisionId)?.members.find((member) => member.id === field.memberId); + if (member?.kind === "relationship" && operation.binding.kind !== "edge") + throw new ExecutionPlanError( + "QUERY_NON_NATIVE_RELATION", + query.id, + "This query runtime traverses native graph edges. Expose an edge relationship, or return a computed service value through a value getter.", + ); + } + const unsupported = unsupportedQueryOperator(query.query.checked); + if (unsupported) + throw new ExecutionPlanError( + "QUERY_OPERATOR_UNSUPPORTED", + query.id, + `This execution world does not support ${unsupported}. Use a bounded portable getter over admitted inputs, or a server service returning the computed value. Query placement will not change automatically.`, + ); const placement = query.query.checked.declaration.placement; if (placement?.kind !== "local") continue; const source = plannedQueries.find( @@ -324,6 +354,10 @@ export function compileExecutionPlan(input: WorkspaceRevision): ExecutionPlan { const paths = new Map(); const visit = (selections: LinkedQuery["checked"]["selection"], parents: string[]) => { for (const selection of selections) { + for (const stage of selection.relational?.stages ?? []) { + if (stage.operation.kind === "source") + paths.set(JSON.stringify([...parents, stage.operation.memberId]), false); + } const member = selection.interfaceRevisionId ? interfaces.get(selection.interfaceRevisionId)?.members.find((m) => m.id === selection.memberId) : undefined; diff --git a/src/execution-world/query-operators.ts b/src/execution-world/query-operators.ts new file mode 100644 index 0000000..16e0abf --- /dev/null +++ b/src/execution-world/query-operators.ts @@ -0,0 +1,62 @@ +import type { CheckedQuery, QuerySelection } from "../query/types.js"; +import type { QueryPredicate, QueryPathStep } from "../query/relational.js"; + +/** Supported by the fresh coordinator/replica interpreters. The language parser + * can describe more operators; that does not make them executable in this world. */ +export function unsupportedQueryOperator(query: CheckedQuery): string | undefined { + const path = (steps: QueryPathStep[]) => + steps.some((step) => step.kind !== "relation") ? "expanded source/target paths" : undefined; + const predicate = (value: QueryPredicate): string | undefined => { + if (value.kind === "reduce") return "aggregate predicates"; + if (value.kind === "and" || value.kind === "or") return value.children.map(predicate).find(Boolean); + if (value.kind === "not") return predicate(value.child); + if (value.kind === "compare") + return ( + path(value.expression.path) ?? + (value.expression.leaf.kind === "mapKey" ? "keyed relationship operands" : undefined) + ); + if (value.kind === "relation") return path(value.path) ?? (value.predicate && predicate(value.predicate)); + return undefined; + }; + const conditional = (selections: readonly QuerySelection[]): boolean => + selections.some((selection) => selection.conditions.length > 0 || conditional(selection.selection)); + const walk = (selections: readonly QuerySelection[]): string | undefined => { + for (const selection of selections) { + const after = selection.arguments.after; + if (after && !(after.kind === "literal" && after.value === null)) return "cursor continuation"; + if (selection.predicate) { + const reason = predicate(selection.predicate); + if (reason) return reason; + } + if (selection.relational) { + if (query.declaration.placement?.kind === "replica") return "aggregate selections in canonical-input scopes"; + const { stages, terminals } = selection.relational; + if (stages.length !== 1 || stages[0]!.operation.kind !== "source") + return "relational expansion, filtering or distinct stages"; + if (terminals.length !== 1) return "multiple aggregate terminals"; + const terminal = terminals[0]!; + if ( + terminal.kind !== "aggregate" || + terminal.stage !== stages[0]!.id || + terminal.keys.length || + terminal.order.length || + terminal.residual || + terminal.where || + terminal.having || + terminal.first || + terminal.all || + terminal.after || + terminal.reductions.some( + (reduction) => reduction.reduction.operator !== "count" || reduction.reduction.operand, + ) + ) + return "grouping or reductions other than a direct relationship count"; + if (conditional(selection.selection)) return "conditional aggregate projections"; + } + const reason = walk(selection.selection); + if (reason) return reason; + } + return undefined; + }; + return walk(query.selection); +} diff --git a/test/execution-world.test.ts b/test/execution-world.test.ts index c22dee2..af3704e 100644 --- a/test/execution-world.test.ts +++ b/test/execution-world.test.ts @@ -284,3 +284,27 @@ test("implementation selection is explicit, target checked and independent of ma "service", ); }); + +test("execution planning rejects unsupported grouping before installing the query", async () => { + const workspace = await loadReaderWorkspace((name, text) => + name === "queries/reader-screen.graphql" + ? text.replace("aggregate { count }", "groups(by: {color: true}, first: 10) { entries { aggregate { count } } }") + : text, + ); + assert.throws(() => compileExecutionPlan(workspace), /QUERY_OPERATOR_UNSUPPORTED.*grouping/); +}); + +test("a count-only local query still requires complete relationship admission", async () => { + for (const source of [ + "query ReplicaInputs { root { sourceRevision } }", + "query ReplicaInputs { root { highlights(first: 1) { entries { node { color } } } } }", + ]) { + const workspace = await loadReaderWorkspace((name, text) => { + if (name === "queries/replica-inputs.graphql") return source; + if (name === "queries/reader-screen.graphql") + return "query ReaderScreen { root { _qx { relations { highlights { aggregate { count } } } } } }"; + return text; + }); + assert.throws(() => compileExecutionPlan(workspace), /REPLICA_TRAVERSAL_MISSING|REPLICA_RELATION_INCOMPLETE/); + } +}); diff --git a/test/query-aggregation.test.ts b/test/query-aggregation.test.ts index 142f503..91bb7b7 100644 --- a/test/query-aggregation.test.ts +++ b/test/query-aggregation.test.ts @@ -108,3 +108,15 @@ test("typed reference operands and scalar membership tests reject unbounded lite /1000 operands/, ); }); + +test("new runtime operator matrix accepts direct count and rejects unsupported relational plans", async () => { + const { unsupportedQueryOperator } = await import("../src/execution-world/query-operators.js"); + assert.equal(unsupportedQueryOperator(await compile("aggregate { count }")), undefined); + for (const expression of [ + "aggregate { sum { estimatedHours } }", + "filter(where: {estimatedHours: {gt: 0}}) { aggregate { count } }", + "distinct(by: {estimatedHours: true}) { aggregate { count } }", + "aggregate { count @skip(if: true) }", + ]) + assert.ok(unsupportedQueryOperator(await compile(expression)), expression); +}); From b4ac9700c633bf21196093ca9446303e137d555d Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Mon, 21 Sep 2026 00:10:45 -0700 Subject: [PATCH 35/91] Expose confirmed server projections through the typed replica client --- src/bindings/portable-client.ts | 57 ++++++++++++++++--- .../local-first-reader/ReaderRuntime.qx | 1 + .../queries/confirmed-color.graphql | 3 + test/local-first-reader.test.ts | 2 +- test/portable-bindings.test.ts | 24 ++++++++ 5 files changed, 77 insertions(+), 10 deletions(-) create mode 100644 test/fixtures/local-first-reader/queries/confirmed-color.graphql diff --git a/src/bindings/portable-client.ts b/src/bindings/portable-client.ts index e6ee821..1f9ac00 100644 --- a/src/bindings/portable-client.ts +++ b/src/bindings/portable-client.ts @@ -53,29 +53,68 @@ export function generatePortableClientBindings( } const queries = new Map(); const views = new Map(); + const serverProjections = new Map(); const results = new Map(); for (const query of plan.definition.queries) { const declaration = query.query.checked.declaration; - if (!declaration.placement) continue; const pkg = workspace.packageImports.find((p) => p.revisionId === query.query.packageRevisionId)!; const alias = JSON.stringify([pkg.displayName, declaration.displayName]); if (seen.has(`query:${alias}`)) throw new PortableBindingError(alias, "Ambiguous query alias"); seen.add(`query:${alias}`); - if (declaration.placement.kind === "local") { - const list = views.get(pkg.displayName) ?? []; - list.push( - `${JSON.stringify(declaration.displayName)}: ${JSON.stringify({ id: query.id, plan: plan.digest, source: JSON.stringify([query.query.packageRevisionId, declaration.placement.sourceQueryId]) })} as const satisfies LocalQueryDescriptor`, - ); - views.set(pkg.displayName, list); + const addResult = () => { if (conditional(query.query.checked.selection)) { unavailable.push({ key: query.id, reason: "CONDITIONAL_RESULT_DECODER_UNSUPPORTED" }); - continue; + return; } const decoders = results.get(pkg.displayName) ?? []; decoders.push( `${JSON.stringify(declaration.displayName)}: (data: Json): ${tsType(query.query.checked.output)} => decodeArgument(${JSON.stringify(portableValueSchema(query.query.checked.output))}, { codec: "camino-value-v1", usage: "argument", value: data }, { workspace: workspaceId(${JSON.stringify(workspace.workspaceId)}), limits: { bytes: ${declaration.budgets.resultBytes + 128}, nodes: 100000, depth: 64 } }) as ${tsType(query.query.checked.output)}`, ); results.set(pkg.displayName, decoders); + }; + if (!declaration.placement) { + const operations = query.operations.map( + (key) => plan.definition.operations.find((operation) => operation.key === key)!, + ); + const live = (selections: readonly QuerySelection[]): boolean => + selections.some((selection) => !!selection.liveSelectionId || live(selection.selection)); + if ( + operations.some( + (operation) => operation.execution.kind !== "snapshot" || !operation.execution.targets.includes("server"), + ) || + live(query.query.checked.selection) + ) { + unavailable.push({ key: query.id, reason: "QUERY_NOT_SNAPSHOT_PROJECTION" }); + continue; + } + const list = serverProjections.get(pkg.displayName) ?? []; + list.push( + JSON.stringify(declaration.displayName) + + ": " + + JSON.stringify({ + kind: "server-projection", + id: query.id, + plan: plan.digest, + root: declaration.root.interface, + rootKind: declaration.root.kind, + }) + + " as const satisfies ServerProjection<" + + JSON.stringify(declaration.root.interface) + + ", " + + JSON.stringify(declaration.root.kind) + + ">", + ); + serverProjections.set(pkg.displayName, list); + addResult(); + continue; + } + if (declaration.placement.kind === "local") { + const list = views.get(pkg.displayName) ?? []; + list.push( + `${JSON.stringify(declaration.displayName)}: ${JSON.stringify({ id: query.id, plan: plan.digest, source: JSON.stringify([query.query.packageRevisionId, declaration.placement.sourceQueryId]) })} as const satisfies LocalQueryDescriptor`, + ); + views.set(pkg.displayName, list); + addResult(); continue; } const list = queries.get(pkg.displayName) ?? []; @@ -86,5 +125,5 @@ export function generatePortableClientBindings( } const groups = (entries: Map) => [...entries].map(([name, values]) => `${JSON.stringify(name)}: {${values.join(",\n")}}`).join(",\n"); - return `// Generated application descriptors. Regenerate; do not edit.\nimport { defineOperationDescriptor, decodeArgument, workspaceId, type Json, type PreparedChange, type ManagedReference, type ReplicaProjection, type LocalQueryDescriptor } from ${JSON.stringify(options.runtimeModule ?? "@quixos/camino-replica-core")};\nexport const planDigest = ${JSON.stringify(plan.digest)};\nexport const operations = {${groups(atoms)}} as const;\nexport const queries = {${groups(queries)}} as const;\nexport const views = {${groups(views)}} as const;\nexport const results = {${groups(results)}} as const;\nexport const unavailable = ${JSON.stringify(unavailable)} as const;\n`; + return `// Generated application descriptors. Regenerate; do not edit.\nimport { defineOperationDescriptor, decodeArgument, workspaceId, type Json, type PreparedChange, type ManagedReference, type ReplicaProjection, type ServerProjection, type LocalQueryDescriptor } from ${JSON.stringify(options.runtimeModule ?? "@quixos/camino-replica-core")};\nexport const planDigest = ${JSON.stringify(plan.digest)};\nexport const operations = {${groups(atoms)}} as const;\nexport const queries = {${groups(queries)}} as const;\nexport const views = {${groups(views)}} as const;\nexport const serverProjections = {${groups(serverProjections)}} as const;\nexport const results = {${groups(results)}} as const;\nexport const unavailable = ${JSON.stringify(unavailable)} as const;\n`; } diff --git a/test/fixtures/local-first-reader/ReaderRuntime.qx b/test/fixtures/local-first-reader/ReaderRuntime.qx index f31385b..7f86b54 100644 --- a/test/fixtures/local-first-reader/ReaderRuntime.qx +++ b/test/fixtures/local-first-reader/ReaderRuntime.qx @@ -82,4 +82,5 @@ revision "package:reader-runtime@1" { query HighlightWindowList id "reader:highlight-window-list" root workspace HighlightData document "queries/highlight-list.graphql" operation "HighlightList" { view Comment as CommentData; local from HighlightWindow; max rows 200; watch; } query HighlightEditorInputs id "reader:editor-inputs" root HighlightData document "queries/editor-inputs.graphql" operation "HighlightEditorInputs" { view Comment as CommentData; replica; max rows 1; } query HighlightEditorView id "reader:editor-view" root HighlightData document "queries/editor-view.graphql" operation "HighlightEditorView" { view Comment as CommentData; local from HighlightEditorInputs; max rows 1; watch; } + query ConfirmedColor id "reader:confirmed-color" root HighlightData document "queries/confirmed-color.graphql" operation "ConfirmedColor" { view Comment as CommentData; max rows 1; watch; } } diff --git a/test/fixtures/local-first-reader/queries/confirmed-color.graphql b/test/fixtures/local-first-reader/queries/confirmed-color.graphql new file mode 100644 index 0000000..44f7cb2 --- /dev/null +++ b/test/fixtures/local-first-reader/queries/confirmed-color.graphql @@ -0,0 +1,3 @@ +query ConfirmedColor { + root { color } +} diff --git a/test/local-first-reader.test.ts b/test/local-first-reader.test.ts index 29b5b65..65beb16 100644 --- a/test/local-first-reader.test.ts +++ b/test/local-first-reader.test.ts @@ -8,7 +8,7 @@ test("complete reader contracts compose factories, portable selectors, CRDT edit assert.equal(workspace.constructors.length, 0); assert.equal(workspace.atoms.length, 3); const linked = linkQueries(workspace); - assert.equal(linked.length, 8); + assert.equal(linked.length, 9); assert.equal(linked.filter((q) => q.checked.declaration.placement?.kind === "local").length, 4); const screen = linked.find((q) => q.checked.declaration.displayName === "ReaderScreen")!; assert.ok(screen.fields.some((f) => f.memberId === "highlight:excerpt" && f.binding.kind === "package")); diff --git a/test/portable-bindings.test.ts b/test/portable-bindings.test.ts index 4373227..d2d4929 100644 --- a/test/portable-bindings.test.ts +++ b/test/portable-bindings.test.ts @@ -79,3 +79,27 @@ test("a portable subset of a mixed interface excludes remote dependencies", asyn selected.operations!.push(operation.id); assert.throws(generate, /select a portable subset/); }); + +test("server projection descriptors are distinct from canonical inputs and have result decoders", async () => { + const { generatePortableClientBindings } = await import("../src/bindings/portable-client.js"); + const plan = compileExecutionPlan(await loadReaderWorkspace()); + const source = generatePortableClientBindings(plan, { target: "browser" }); + const projections = source.slice( + source.indexOf("export const serverProjections"), + source.indexOf("export const results"), + ); + assert.match(projections, /ConfirmedColor/); + assert.match(projections, /satisfies ServerProjection/); + assert.match(source.slice(source.indexOf("export const results")), /ConfirmedColor/); + const live = compileExecutionPlan( + await loadReaderWorkspace((name, text) => + name === "queries/confirmed-color.graphql" ? text.replace("color", "color @live") : text, + ), + ); + const rejected = generatePortableClientBindings(live, { target: "browser" }); + assert.doesNotMatch( + rejected.slice(rejected.indexOf("export const serverProjections"), rejected.indexOf("export const results")), + /ConfirmedColor/, + ); + assert.match(rejected, /QUERY_NOT_SNAPSHOT_PROJECTION/); +}); From 7652b4c0b9cfddbc63157abd7981e1396dae5096 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Mon, 21 Sep 2026 00:44:47 -0700 Subject: [PATCH 36/91] Add local-first execution authoring support --- src/capability-language/execution-scaffold.ts | 158 ++++++++++++++++++ .../implementation-edit.ts | 2 +- src/capability-language/scaffold-recipes.ts | 10 +- test/emit-portable-reader.ts | 4 + test/execution-scaffold-fixture.ts | 53 ++++++ test/scaffold-recipes.test.ts | 44 +++++ 6 files changed, 269 insertions(+), 2 deletions(-) create mode 100644 src/capability-language/execution-scaffold.ts create mode 100644 test/execution-scaffold-fixture.ts diff --git a/src/capability-language/execution-scaffold.ts b/src/capability-language/execution-scaffold.ts new file mode 100644 index 0000000..befeb3b --- /dev/null +++ b/src/capability-language/execution-scaffold.ts @@ -0,0 +1,158 @@ +import fs from "node:fs/promises"; +import path from "node:path"; +import type { ScaffoldRecipe } from "./scaffold-recipes.js"; +import type { StructuralRequest } from "./structural-plan.js"; +import { parseQx, walkSyntax } from "./source.js"; +import { addImplementation } from "./implementation-edit.js"; +import { formatQuixosLock } from "../resource-lock/index.js"; +const json = (value: unknown) => JSON.stringify(value, null, 2) + "\n"; +const q = (value: string) => JSON.stringify(value); +const nixString = (value: string) => q(value).replaceAll("${", "\\${"); +export async function isExecutionScaffold(root: string, prefix: string): Promise { + try { + return JSON.parse(await fs.readFile(path.join(root, prefix, "quixos.check.json"), "utf8")).backend === "execution"; + } catch (error) { + if ((error as NodeJS.ErrnoException).code === "ENOENT") return false; + throw error; + } +} +/** Insert ordinary authored code; declarations remain the only export inventory. */ +export async function executionScaffold( + root: string, + command: string, + spec: ScaffoldRecipe, + prefix: string, + nixSource: (source: NonNullable["helpers"]) => string, +): Promise { + if (!spec.name || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(spec.name) || !spec.id) + throw new Error("Execution scaffold requires a simple name and an ID"); + if (spec.initialFiles) throw new Error("Edit execution source after scaffolding; initialFiles is not supported"); + const files: StructuralRequest["files"] = []; + const create = (file: string, content: string) => files.push({ file: prefix + file, create: content }); + if (command === "package") { + if (!spec.tools || !spec.revision) throw new Error("Execution package requires exact tool sources and a revision"); + create("package.qx", `package ${spec.name} id ${q(spec.id)} revision ${q(spec.revision)} {\n}\n`); + create( + "quixos.lock", + formatQuixosLock({ formatVersion: 1, quixos: { resolver: "git", ...spec.tools.quixos }, resources: [] }), + ); + create("quixos.check.json", json({ backend: "execution" })); + create("package.json", json({ name: `@quixos/${spec.name.toLowerCase()}`, private: true, type: "module" })); + create(".gitignore", "node_modules/\ndist/\nsrc/gen/\n.quixos/\nresult\n"); + for (const lane of ["browser", "server", "remote"]) + create( + `src/${lane}.ts`, + `import { createRegistry } from "./gen/${lane === "remote" ? "remote" : "qx"}.js";\nexport const registry = createRegistry({});\n`, + ); + create( + "flake.nix", + `{ + inputs.protocol.url = ${nixString(nixSource(spec.tools.protocol))}; + inputs.nixpkgs.follows = "protocol/nixpkgs"; + inputs.flake-utils.follows = "protocol/flake-utils"; + inputs.helpers = { url = ${nixString(nixSource(spec.tools.helpers))}; flake = false; }; + outputs = { nixpkgs, flake-utils, helpers, ... }: + flake-utils.lib.eachDefaultSystem (system: let + pkgs = import nixpkgs { inherit system; }; + in { + quixosPackages.checkedArtifacts = { plan, generator, core, sharedRuntime, typescript, packageRevisionId }: + (import (helpers + "/portable-artifacts.nix")) { + inherit pkgs plan core sharedRuntime typescript packageRevisionId; + protocol = generator; + src = ./.; + portable = { + entry = "src/server.ts"; + entries.browser = "src/browser.ts"; + bindingOutput = "src/gen/qx.ts"; + }; + remote = { entry = "src/remote.ts"; bindingOutput = "src/gen/remote.ts"; }; + }; + }); +} +`, + ); + create( + "README.md", + `# ${spec.name}\n\nThis execution package exports checked browser/server modules and a process service.\nUse scaffold function with an explicit execution contract to add a typed handler.\nSnapshot/transaction targets choose browser.ts and/or server.ts; remote handlers\nuse remote.ts. Shared helpers are ordinary imports. Generated bindings are build\noutputs, not authored source. The coordinator supplies the checked workspace plan\nand runtime dependencies to checkedArtifacts.\n\nThe execution scaffold currently requires the execution artifact build path;\nlegacy checkedServer verification and activation do not install these artifacts.\nA source-only structural check is not runtime qualification.\n`, + ); + } else if (command === "function") { + if (!spec.declaration) + throw new Error("Execution functions require a declaration with explicit execution effect and targets"); + const wrapped = `package Scaffold id "scaffold" revision "scaffold@1" { ${spec.declaration} }`; + const parsed = parseQx(wrapped); + const pkg = parsed.root.children.find((node) => node.kind === "packageResourceDecl"); + const exports = [...walkSyntax(parsed.root)].filter((node) => + ["packageFunctionExport", "packageOperationExport"].includes(node.kind), + ); + const declaration = exports[0]; + if ( + parsed.diagnostics.length || + exports.length !== 1 || + !declaration || + parsed.root.children.length !== 1 || + pkg?.children.filter((node) => node.kind === "packageExport").length !== 1 || + pkg?.children.some((node) => !["identifier", "stringLiteral", "packageExport"].includes(node.kind)) + ) + throw new Error("Expected one function or operation export with an execution contract"); + const text = (node: { start: number; end: number }) => wrapped.slice(node.start, node.end); + const name = declaration.children.find((node) => node.kind === "identifier"); + const id = declaration.children.find((node) => node.kind === "stringLiteral"); + const execution = declaration.children.find((node) => node.kind === "executionClause"); + if (!name || text(name) !== spec.name || !id || JSON.parse(text(id)) !== spec.id || !execution) + throw new Error("Declaration name/ID must match; an explicit execution contract is required"); + const tokens = parsed.tokens + .filter((token) => !token.trivia && token.start >= execution.start && token.end <= execution.end) + .map((token) => token.text); + const remote = tokens[1] === "remote"; + const targets = remote + ? ["remote"] + : [...walkSyntax(execution)].filter((node) => node.kind === "identifier").map(text); + if ( + !targets.length || + new Set(targets).size !== targets.length || + targets.some((target) => !(remote ? ["remote"] : ["browser", "server"]).includes(target)) + ) + throw new Error("Execution scaffold supports browser/server portable targets and remote service handlers"); + const authored = await fs.readFile(path.join(root, prefix, "package.qx"), "utf8"); + const syntax = parseQx(authored); + const packageNode = syntax.root.children.find((node) => node.kind === "packageResourceDecl"); + if (syntax.diagnostics.length || !packageNode) throw new Error("Fix package.qx before adding a handler"); + for (const node of [...walkSyntax(packageNode)].filter((node) => + ["packageFunctionExport", "packageOperationExport", "packageConstructorExport"].includes(node.kind), + )) { + const identifier = node.children.find((child) => child.kind === "identifier"); + const literal = node.children.find((child) => child.kind === "stringLiteral"); + if ( + (identifier && authored.slice(identifier.start, identifier.end) === spec.name) || + (literal && JSON.parse(authored.slice(literal.start, literal.end)) === spec.id) + ) + throw new Error("New export requires a unique name and ID"); + } + const packageID = packageNode.children.find((node) => node.kind === "stringLiteral")!; + files.push({ + file: prefix + "package.qx", + edits: [ + { + operation: "append", + parent: { kind: "packageResourceDecl", id: JSON.parse(authored.slice(packageID.start, packageID.end)) }, + source: spec.declaration, + }, + ], + }); + create( + `src/impl/${spec.name}.ts`, + `import type { ${remote ? "Remote" : "Portable"}Implementation } from "../gen/${remote ? "remote" : "qx"}.js";\nexport const handler: ${remote ? "Remote" : "Portable"}Implementation[${q(spec.name)}] = async (_context) => { throw new Error(${q("Implement " + spec.name)}); };\n`, + ); + for (const target of targets) { + const file = prefix + `src/${target}.ts`; + const before = await fs.readFile(path.join(root, file), "utf8"); + files.push({ + file, + expected: before, + replace: addImplementation(before, "createRegistry", spec.name, `./impl/${spec.name}.js`), + }); + } + } else + throw new Error("Execution packages use ordinary factory transactions; migration scaffolding is not supported"); + return { kind: "package", source: spec.source, resourceRoot: spec.directory, validation: "syntax", files }; +} diff --git a/src/capability-language/implementation-edit.ts b/src/capability-language/implementation-edit.ts index 85ffb9b..5b8cd53 100644 --- a/src/capability-language/implementation-edit.ts +++ b/src/capability-language/implementation-edit.ts @@ -7,7 +7,7 @@ const node = (value: unknown): value is Node => * Ambiguous/custom wiring is left alone with an actionable error. */ export function addImplementation( text: string, - factory: "createRuntime" | "serveMigration", + factory: "createRuntime" | "serveMigration" | "createRegistry", key: string, importPath: string, migrationOnly = false, diff --git a/src/capability-language/scaffold-recipes.ts b/src/capability-language/scaffold-recipes.ts index 13f6f07..1b18c97 100644 --- a/src/capability-language/scaffold-recipes.ts +++ b/src/capability-language/scaffold-recipes.ts @@ -11,6 +11,7 @@ import { parseQx, walkSyntax } from "./source.js"; import type { StructuralRequest } from "./structural-plan.js"; import { addImplementation } from "./implementation-edit.js"; import { reactPlatformTypes } from "../bindings/react-platform.js"; +import { executionScaffold, isExecutionScaffold } from "./execution-scaffold.js"; type Source = { repository: string; commit: string }; type PackageEditModel = { @@ -21,7 +22,7 @@ type PackageEditModel = { exports: { name: string; id: string; file: string; migration?: boolean }[]; }; export type ScaffoldRecipe = { - template?: "typescript" | "typescript-react"; + template?: "typescript" | "typescript-react" | "typescript-execution"; source: Source; directory?: string; name?: string; @@ -81,6 +82,13 @@ export const scaffoldRecipe = async ( if (spec.directory && !/^[A-Za-z0-9_-][A-Za-z0-9_.-]*(?:\/[A-Za-z0-9_-][A-Za-z0-9_.-]*)*$/.test(spec.directory)) throw new Error("Scaffold directory must be contained"); const prefix = spec.directory ? `${spec.directory}/` : ""; + if ( + spec.template === "typescript-execution" || + (command !== "package" && (await isExecutionScaffold(root, prefix))) + ) { + if (spec.tools) Object.values(spec.tools).forEach(source); + return executionScaffold(root, command, spec, prefix, nixSource); + } const files: StructuralRequest["files"] = []; const create = (file: string, content: string) => files.push({ file: prefix + file, create: content }); const generated = (file: string, content: string) => files.push({ file: prefix + file, generated: content }); diff --git a/test/emit-portable-reader.ts b/test/emit-portable-reader.ts index 67af83d..5b99aec 100644 --- a/test/emit-portable-reader.ts +++ b/test/emit-portable-reader.ts @@ -131,3 +131,7 @@ const compoundCrdt = await compoundCrdtPlan(); await mkdir("dist/portable-reader/compound-crdt", { recursive: true }); await writeFile("dist/portable-reader/compound-crdt/plan.json", JSON.stringify(compoundCrdt)); await writeFile("dist/portable-reader/compound-crdt/kernel.json", JSON.stringify(compileKernelProgram(compoundCrdt))); + +const { emitExecutionScaffold } = await import("./execution-scaffold-fixture.js"); +const executionScaffold = await emitExecutionScaffold("dist/portable-reader/execution-scaffold/source"); +await writeFile("dist/portable-reader/execution-scaffold/plan.json", JSON.stringify(executionScaffold)); diff --git a/test/execution-scaffold-fixture.ts b/test/execution-scaffold-fixture.ts new file mode 100644 index 0000000..a28b8e6 --- /dev/null +++ b/test/execution-scaffold-fixture.ts @@ -0,0 +1,53 @@ +import assert from "node:assert/strict"; +import fs from "node:fs/promises"; +import path from "node:path"; +import { execFileSync } from "node:child_process"; +import { scaffoldRecipe } from "../src/capability-language/scaffold-recipes.js"; +import { planStructure, applyStructure } from "../src/capability-language/structural-plan.js"; +import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/parser.js"; +import { compileExecutionPlan } from "../src/execution-world/plan.js"; + +/** Exercise the authoring insertion path, then let the Nix gate build its actual flake output. */ +export async function emitExecutionScaffold(root: string) { + await fs.mkdir(root, { recursive: true }); + execFileSync("git", ["-C", root, "init"], { stdio: "ignore" }); + const source = { repository: "https://example.test/scaffold.git", commit: "a".repeat(40) }; + const apply = async ( + command: Parameters[1], + spec: Partial[2]>, + ) => applyStructure(await planStructure(root, await scaffoldRecipe(root, command, { source, ...spec }))); + await apply("package", { + name: "Scaffold", + id: "package:scaffold", + revision: "package:scaffold@1", + template: "typescript-execution", + tools: { quixos: source, protocol: source, helpers: source, sdk: source }, + }); + for (const [name, execution] of [ + ["echo", "snapshot targets [browser, server]"], + ["serverEcho", "snapshot targets [server]"], + ["remoteEcho", "remote"], + ]) { + await apply("function", { + name, + id: "scaffold:" + name, + declaration: `function ${name} id "scaffold:${name}" : string -> string execution ${execution};`, + }); + const file = path.join(root, `src/impl/${name}.ts`); + const placeholder = await fs.readFile(file, "utf8"); + await fs.writeFile(file, placeholder.replace(/async \(_context\) => \{.*\};/, "async ({ input }) => input;")); + } + const pkg = compileCapabilityResourceSource(await fs.readFile(path.join(root, "package.qx"), "utf8"), { source }); + assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); + const workspace = compileCapabilitySource( + `workspace W id "scaffold-workspace" revision "scaffold-workspace@1" commit "${source.commit}" { import package Scaffold; }`, + "workspace.qx", + { + packages: new Map([["Scaffold", pkg.resource.revision]]), + }, + ); + assert.ok(workspace.ok, JSON.stringify(workspace.diagnostics)); + await fs.rm(path.join(root, ".quixos"), { recursive: true, force: true }); + await fs.rm(path.join(root, ".git"), { recursive: true, force: true }); + return compileExecutionPlan(workspace.workspace); +} diff --git a/test/scaffold-recipes.test.ts b/test/scaffold-recipes.test.ts index ba51e34..f1442cf 100644 --- a/test/scaffold-recipes.test.ts +++ b/test/scaffold-recipes.test.ts @@ -122,3 +122,47 @@ test("imperative scaffolds preserve authored wiring; migration sealing is explic ], }); }); + +test("execution scaffolds route typed handlers by declared effect and target without legacy lifecycle files", async (context) => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "qx-execution-recipe-")); + context.after(() => fs.rm(root, { recursive: true, force: true })); + await execFile("git", ["-C", root, "init"]); + const source = { repository: "https://example.test/execution.git", commit: "a".repeat(40) }; + const apply = async ( + command: Parameters[1], + spec: Partial[2]>, + ) => applyStructure(await planStructure(root, await scaffoldRecipe(root, command, { source, ...spec }))); + await apply("package", { + name: "Execution", + id: "package:execution", + revision: "package:execution@1", + template: "typescript-execution", + tools: { quixos: source, protocol: source, helpers: source, sdk: source }, + }); + for (const file of ["quixos.migrations.json", "src/migrate.ts", "descriptor.quixos-package.txtpb"]) + await assert.rejects(fs.access(path.join(root, file))); + await fs.appendFile(path.join(root, "src/server.ts"), "\n// Preserve authored code\n"); + const add = (name: string, execution: string) => + apply("function", { + name, + id: "export:" + name, + declaration: `function ${name} id "export:${name}" : unit -> unit execution ${execution};`, + }); + await add("both", "transaction targets [browser, server]"); + await add("serverOnly", "snapshot targets [server]"); + await add("asyncWork", "remote"); + const read = (file: string) => fs.readFile(path.join(root, file), "utf8"); + assert.match(await read("src/browser.ts"), /"both":/); + assert.doesNotMatch(await read("src/browser.ts"), /serverOnly|asyncWork/); + assert.match(await read("src/server.ts"), /"serverOnly":/); + assert.match(await read("src/server.ts"), /Preserve authored code/); + assert.match(await read("src/remote.ts"), /"asyncWork":/); + assert.match(await read("src/impl/asyncWork.ts"), /RemoteImplementation/); + assert.match(await read("src/impl/both.ts"), /PortableImplementation/); + assert.match(await read("flake.nix"), /checkedArtifacts/); + assert.match(await read("flake.nix"), /entries.browser/); + await assert.rejects(add("both", "transaction targets [browser, server]"), /unique/); + await assert.rejects(add("invalid", "snapshot targets [remote]"), /browser\/server/); + await assert.rejects(apply("function", { name: "missing", id: "export:missing" }), /explicit execution/); + await assert.rejects(apply("migration", { name: "migration", id: "export:migration" }), /not supported/); +}); From f69c81f607bf7578a52adfa9843d3d0a53cc4ed5 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Mon, 21 Sep 2026 00:57:50 -0700 Subject: [PATCH 37/91] Check execution workspace candidates with pinned artifact builders --- flake.nix | 1 + nix/check-execution.mjs | 28 +++++++++ nix/checked-candidate.nix | 71 ++++++++++++++++------ src/capability-language/authoring-check.ts | 9 ++- 4 files changed, 91 insertions(+), 18 deletions(-) create mode 100644 nix/check-execution.mjs diff --git a/flake.nix b/flake.nix index f2fcab4..f805081 100644 --- a/flake.nix +++ b/flake.nix @@ -77,6 +77,7 @@ mkdir -p "$out" install -Dm644 nix/checked-package.nix "$out/share/checked-package.nix" install -Dm644 nix/checked-artifacts.nix "$out/share/checked-artifacts.nix" + install -Dm644 nix/check-execution.mjs "$out/share/check-execution.mjs" substitute nix/checked-candidate.nix "$out/share/checked-candidate.nix" \ --replace-fail '@nixpkgs@' '${pkgs.path}' cp --reflink=auto --recursive grammar "$out/grammar" diff --git a/nix/check-execution.mjs b/nix/check-execution.mjs new file mode 100644 index 0000000..af90822 --- /dev/null +++ b/nix/check-execution.mjs @@ -0,0 +1,28 @@ +// Validate compiler-owned plans and immutable artifact receipts before publishing check outputs. +import { readFile, writeFile } from "node:fs/promises"; +import { createHash } from "node:crypto"; +import { pathToFileURL } from "node:url"; +import { join } from "node:path"; +const [compilerPath, planPath, checksPath, output] = process.argv.slice(2); +const compiler = await import(pathToFileURL(compilerPath)); +const plan = JSON.parse(await readFile(planPath, "utf8")); +const checks = JSON.parse(await readFile(checksPath, "utf8")); +const roots = Object.create(null); +for (const check of checks) { + if (Object.hasOwn(roots, check.packageRevisionId)) throw Error("Duplicate checked package revision"); + roots[check.packageRevisionId] = check.artifactPath; +} +const checked = await compiler.loadCheckedArtifactWorld( + plan, + roots, + createHash("sha256") + .update(await readFile(compilerPath)) + .digest("hex"), +); +for (const [file, value] of [ + ["execution-world.json", checked.world], + ["kernel.json", compiler.compileKernelProgram(plan)], + ["queries.json", compiler.compileQueryProgram(plan)], + ["execution-artifacts.json", { codec: "camino-checked-execution-v1", roots, manifests: checked.manifests }], +]) + await writeFile(join(output, file), JSON.stringify(value) + "\n"); diff --git a/nix/checked-candidate.nix b/nix/checked-candidate.nix index fabe5b9..7fe5a4e 100644 --- a/nix/checked-candidate.nix +++ b/nix/checked-candidate.nix @@ -37,8 +37,18 @@ let entry: load (ancestors ++ [ (sourceKey source) ]) (entry.source // { inherit (entry) kind; }) ) lock.resources; in - source // { inherit directory children; }; + source // { inherit directory children lock; }; root = load [ ] { inherit kind repository commit; }; + configuration = + if builtins.pathExists (root.directory + "/quixos.check.json") then + builtins.fromJSON (builtins.readFile (root.directory + "/quixos.check.json")) + else + { }; + execution = (configuration.backend or "typescript") == "execution"; + runtime = builtins.getFlake ( + "git+${root.lock.quixos.repository}?rev=${root.lock.quixos.commit}&ref=refs/tags/quixos-reachability/${root.lock.quixos.commit}" + ); + runtimePackages = runtime.packages.${system}; flatten = node: [ node ] ++ pkgs.lib.concatMap flatten node.children; nodes = builtins.attrValues ( builtins.listToAttrs ( @@ -70,7 +80,8 @@ let ${protocol}/bin/quixos-workspace-compile --root ${node.directory} \ --source-root-commit ${pkgs.lib.escapeShellArg node.commit} \ --checkout-root "$TMPDIR/checkouts" --snapshot-map ${snapshots} \ - --graph-out "$out/graph.json" --schemas-out "$out/package-schemas.json" > "$out/candidate.json" + --graph-out "$out/graph.json" --schemas-out "$out/package-schemas.json" \ + ${pkgs.lib.optionalString execution ''--execution-plan-out "$out/execution-plan.json"''} > "$out/candidate.json" '' else '' @@ -92,21 +103,37 @@ let "git+${node.repository}?rev=${node.commit}&ref=refs/tags/quixos-reachability/${node.commit}" ); checked = - package.quixosPackages.${system}.checkedServer - or (throw "Package ${node.repository} lacks checkedServer; use the supported package scaffold."); - artifact = checked { - schema = - if kind == "workspace" then - pkgs.writeText "package-specialization-schema.json" ( - builtins.toJSON - (builtins.fromJSON (builtins.readFile "${contract}/package-schemas.json")) - .${candidate.revision.revisionId} - ) - else - "${compiled}/bindings.json"; - generator = protocol; - packageRevisionId = candidate.revision.revisionId; - }; + if execution then + package.quixosPackages.${system}.checkedArtifacts + or (throw "Package ${node.repository} lacks checkedArtifacts; execution workspaces cannot import legacy servers.") + else + package.quixosPackages.${system}.checkedServer + or (throw "Package ${node.repository} lacks checkedServer; use the supported package scaffold."); + artifact = checked ( + if execution then + { + plan = "${contract}/execution-plan.json"; + generator = protocol; + core = runtimePackages.camino-replica-core; + sharedRuntime = runtimePackages.camino-shared-runtime; + typescript = runtimePackages.camino-replica-core.dependencies; + packageRevisionId = candidate.revision.revisionId; + } + else + { + schema = + if kind == "workspace" then + pkgs.writeText "package-specialization-schema.json" ( + builtins.toJSON + (builtins.fromJSON (builtins.readFile "${contract}/package-schemas.json")) + .${candidate.revision.revisionId} + ) + else + "${compiled}/bindings.json"; + generator = protocol; + packageRevisionId = candidate.revision.revisionId; + } + ); in { packageRevisionId = candidate.revision.revisionId; @@ -124,11 +151,21 @@ let ) ); in +assert pkgs.lib.assertMsg (!execution || kind == "workspace") + "Execution packages must be checked in their complete workspace; run qx-workspace check from the workspace root."; pkgs.runCommand (if contractOnly then "qx-contract" else "qx-checked-candidate") { } '' mkdir -p "$out" cp ${contract}/candidate.json "$out/candidate.json" cp ${contract}/graph.json "$out/graph.json" cp ${manifest} "$out/checks.json" + ${pkgs.lib.optionalString execution '' + cp ${contract}/execution-plan.json "$out/execution-plan.json" + ${pkgs.lib.optionalString (!contractOnly) '' + ${pkgs.nodejs_24}/bin/node ${./check-execution.mjs} \ + ${protocol}/libexec/quixos-protocol/execution-world.mjs \ + "$out/execution-plan.json" "$out/checks.json" "$out" + ''} + ''} ${pkgs.lib.optionalString ( kind != "workspace" ) ''cp ${contract}/bindings.json "$out/bindings.json"''} diff --git a/src/capability-language/authoring-check.ts b/src/capability-language/authoring-check.ts index eb0a94a..8c696ad 100644 --- a/src/capability-language/authoring-check.ts +++ b/src/capability-language/authoring-check.ts @@ -34,6 +34,7 @@ export async function checkAuthoring( phase: string; output: string; compilation?: "passed"; + runtime?: "execution"; activationReadiness?: "preserve" | "migration-required" | "blocked"; migrationRequired?: string[]; } = { @@ -98,7 +99,13 @@ export async function checkAuthoring( const candidateText = await fs.readFile(path.join(report.artifactPath, "candidate.json"), "utf8"); await fs.writeFile(path.join(output, "candidate.json"), candidateText); report.compilation = "passed"; - if (resource.kind === "workspace" && !options.contractOnly) { + try { + await fs.access(path.join(report.artifactPath, "execution-plan.json")); + report.runtime = "execution"; + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error; + } + if (resource.kind === "workspace" && !options.contractOnly && report.runtime !== "execution") { report.phase = "evolution"; await progress(); let baseline = options.baseline; From 20ef63007cca8f99a2ad2d1b2406bf50cef233c6 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Mon, 21 Sep 2026 01:09:31 -0700 Subject: [PATCH 38/91] Assemble generic execution installations from checked artifacts --- nix/check-execution.mjs | 8 ++ src/execution-world/index.ts | 1 + src/execution-world/installation.ts | 114 ++++++++++++++++++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 src/execution-world/installation.ts diff --git a/nix/check-execution.mjs b/nix/check-execution.mjs index af90822..d4dbe35 100644 --- a/nix/check-execution.mjs +++ b/nix/check-execution.mjs @@ -19,8 +19,16 @@ const checked = await compiler.loadCheckedArtifactWorld( .update(await readFile(compilerPath)) .digest("hex"), ); +const installation = await compiler.loadExecutionInstallation( + plan, + roots, + createHash("sha256") + .update(await readFile(compilerPath)) + .digest("hex"), +); for (const [file, value] of [ ["execution-world.json", checked.world], + ["installation.json", installation], ["kernel.json", compiler.compileKernelProgram(plan)], ["queries.json", compiler.compileQueryProgram(plan)], ["execution-artifacts.json", { codec: "camino-checked-execution-v1", roots, manifests: checked.manifests }], diff --git a/src/execution-world/index.ts b/src/execution-world/index.ts index 1bd02b3..451ff90 100644 --- a/src/execution-world/index.ts +++ b/src/execution-world/index.ts @@ -2,6 +2,7 @@ export * from "./plan.js"; export * from "./artifacts.js"; export * from "./ports.js"; export * from "./files.js"; +export * from "./installation.js"; export * from "./receipts.js"; diff --git a/src/execution-world/installation.ts b/src/execution-world/installation.ts new file mode 100644 index 0000000..fd12b55 --- /dev/null +++ b/src/execution-world/installation.ts @@ -0,0 +1,114 @@ +import path from "node:path"; +import { loadCheckedArtifactWorld } from "./receipts.js"; +import { contentArtifactUrl } from "./files.js"; +import { selectArtifactImplementation, type ArtifactImplementation } from "./artifacts.js"; +import { ExecutionPlanError, type ExecutionPlan } from "./plan.js"; + +export interface PackageInstallationSelection { + readonly browser?: { readonly id?: string }; + readonly service?: { readonly id?: string }; + /** Including a module is optional; executing it still requires host trust policy. */ + readonly module?: { readonly id?: string }; +} +export interface ExecutionInstallation { + readonly codec: "camino-execution-installation-v1"; + readonly plan: string; + readonly world: string; + readonly packages: readonly { + readonly revision: string; + readonly root: string; + readonly service: ArtifactImplementation; + readonly module?: ArtifactImplementation; + readonly browserURL?: string; + readonly browserRegistry?: string; + }[]; + readonly routes: Readonly>; + readonly coreURL?: string; + readonly engineURL?: string; +} +/** Verify candidate receipts before assembling process entrypoints and browser assets. + * This grants no authority to activate a world or run optional modules in process. */ +export async function loadExecutionInstallation( + plan: ExecutionPlan, + roots: Readonly>, + generator: string, + selections: Readonly> = {}, +): Promise { + const loaded = await loadCheckedArtifactWorld(plan, roots, generator); + const fail = (where: string, message: string): never => { + throw new ExecutionPlanError("INSTALLATION_INVALID", where, message); + }; + for (const revision of Object.keys(selections)) + if (!loaded.manifests.some((manifest) => manifest.packageRevisionId === revision)) + fail(revision, "Selection names a package outside this checked world"); + const routes: Record = Object.create(null); + const packages: ExecutionInstallation["packages"][number][] = []; + let coreURL: string | undefined, engineURL: string | undefined; + for (const manifest of loaded.manifests) { + const revision = manifest.packageRevisionId; + const root = roots[revision]!; + const selection = selections[revision] ?? {}; + const exports = plan.definition.packages.find((pkg) => pkg.revision === revision)!.exports; + const service = selectArtifactImplementation(manifest, { + ...selection.service, + target: "server", + compatibility: "quixos-service-v1", + exports: exports.map((entry) => entry.id), + }); + const module = selection.module + ? selectArtifactImplementation(manifest, { + ...selection.module, + target: "server", + compatibility: "quixos-js-module-v1", + exports: exports.map((entry) => entry.id), + }) + : undefined; + const browserExports = exports.filter( + (entry) => entry.execution.kind !== "remote" && entry.execution.targets.includes("browser"), + ); + if (!browserExports.length) { + if (selection.browser) fail(revision, "Package has no browser exports to select"); + packages.push({ revision, root, service, ...(module ? { module } : {}) }); + continue; + } + const browser = selectArtifactImplementation(manifest, { + ...selection.browser, + target: "browser", + compatibility: "quixos-js-module-v1", + exports: browserExports.map((entry) => entry.id), + }); + const entry = browser.files.find((file) => file.path === browser.path)!; + const shared = (name: string) => { + const files = browser.files.filter((file) => file.path.endsWith("/" + name)); + if (files.length !== 1) fail(revision, "Expected one shared " + name); + return contentArtifactUrl(files[0]!); + }; + const core = shared("core.mjs"), + engine = shared("engine.mjs"); + if ((coreURL && coreURL !== core) || (engineURL && engineURL !== engine)) + fail(revision, "Browser packages disagree on the shared runtime identity"); + coreURL = core; + engineURL = engine; + for (const file of browser.files) { + const url = contentArtifactUrl(file); + if (routes[url] && routes[url].mediaType !== file.mediaType) fail(url, "Conflicting artifact media types"); + routes[url] ??= { path: path.join(root, file.path), mediaType: file.mediaType }; + } + packages.push({ + revision, + root, + service, + ...(module ? { module } : {}), + browserURL: contentArtifactUrl(entry), + browserRegistry: browser.registryExport, + }); + } + return { + codec: "camino-execution-installation-v1", + plan: plan.digest, + world: loaded.digest, + packages, + routes, + ...(coreURL ? { coreURL, engineURL } : {}), + }; +} From 01a3ec5ae2c3a3d712e689c38faa249f266415d4 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Mon, 21 Sep 2026 01:25:00 -0700 Subject: [PATCH 39/91] Scaffold explicit query placement and authored GraphQL documents --- src/capability-language/query-scaffold.ts | 79 +++++++++++++++++++++ src/capability-language/scaffold-recipes.ts | 5 +- src/capability-language/tool-cli.ts | 21 ++++-- test/scaffold-recipes.test.ts | 57 +++++++++++++++ 4 files changed, 157 insertions(+), 5 deletions(-) create mode 100644 src/capability-language/query-scaffold.ts diff --git a/src/capability-language/query-scaffold.ts b/src/capability-language/query-scaffold.ts new file mode 100644 index 0000000..541941d --- /dev/null +++ b/src/capability-language/query-scaffold.ts @@ -0,0 +1,79 @@ +import fs from "node:fs/promises"; +import path from "node:path"; +import { parse } from "graphql"; +import type { ScaffoldRecipe } from "./scaffold-recipes.js"; +import type { StructuralRequest } from "./structural-plan.js"; +import { parseQx, walkSyntax } from "./source.js"; + +/** Insert the authored query and its document together; placement never changes implicitly. */ +export async function scaffoldQuery(root: string, prefix: string, spec: ScaffoldRecipe): Promise { + if ( + !spec.name || + !/^[A-Za-z_][A-Za-z0-9_]*$/.test(spec.name) || + !spec.id || + !spec.declaration || + typeof spec.queryDocument !== "string" + ) + throw new Error("Query scaffold requires name, id, declaration and queryDocument"); + const source = `package Draft id "draft" revision "draft@1" { ${spec.declaration} }`; + const syntax = parseQx(source); + const pkg = syntax.root.children.find((node) => node.kind === "packageResourceDecl"); + const queries = [...walkSyntax(syntax.root)].filter((node) => node.kind === "packageQuery"); + const query = queries[0]; + if ( + syntax.diagnostics.length || + syntax.root.children.length !== 1 || + !pkg || + queries.length !== 1 || + !query || + pkg.children.filter((node) => node.kind === "packageExport").length !== 1 || + pkg.children.some((node) => !["identifier", "stringLiteral", "packageExport"].includes(node.kind)) + ) + throw new Error("Expected one QX query declaration"); + const identifier = query.children.find((node) => node.kind === "identifier")!; + const literals = query.children + .filter((node) => node.kind === "stringLiteral") + .map((node) => JSON.parse(source.slice(node.start, node.end)) as string); + const [id, document, operation] = literals; + if (source.slice(identifier.start, identifier.end) !== spec.name || id !== spec.id) + throw new Error("Query declaration name/ID must match its registration"); + if (!document || !/^queries\/(?:[A-Za-z0-9_-]+\/)*[A-Za-z0-9_-]+\.graphql$/.test(document)) + throw new Error("Query document must be a contained queries/*.graphql path"); + const graphql = parse(spec.queryDocument); + const operations = graphql.definitions.filter((definition) => definition.kind === "OperationDefinition"); + if (operations.length !== 1 || operations[0]!.operation !== "query" || operations[0]!.name?.value !== operation) + throw new Error("GraphQL document must contain the declared named query operation"); + const authored = await fs.readFile(path.join(root, prefix, "package.qx"), "utf8"); + const existing = parseQx(authored); + const parent = existing.root.children.find((node) => node.kind === "packageResourceDecl"); + if (existing.diagnostics.length || !parent) throw new Error("Fix package.qx before adding a query"); + for (const node of parent.children.filter((node) => node.kind === "packageExport").flatMap((node) => node.children)) { + const name = node.children.find((child) => child.kind === "identifier"); + const literal = node.children.find((child) => child.kind === "stringLiteral"); + if ( + (name && authored.slice(name.start, name.end) === spec.name) || + (literal && JSON.parse(authored.slice(literal.start, literal.end)) === spec.id) + ) + throw new Error("New query requires a unique name and ID"); + } + const parentID = parent.children.find((node) => node.kind === "stringLiteral")!; + return { + kind: "package", + source: spec.source, + resourceRoot: spec.directory, + validation: "syntax", + files: [ + { + file: prefix + "package.qx", + edits: [ + { + operation: "append", + parent: { kind: "packageResourceDecl", id: JSON.parse(authored.slice(parentID.start, parentID.end)) }, + source: spec.declaration, + }, + ], + }, + { file: prefix + document, create: spec.queryDocument }, + ], + }; +} diff --git a/src/capability-language/scaffold-recipes.ts b/src/capability-language/scaffold-recipes.ts index 1b18c97..37883ec 100644 --- a/src/capability-language/scaffold-recipes.ts +++ b/src/capability-language/scaffold-recipes.ts @@ -12,6 +12,7 @@ import type { StructuralRequest } from "./structural-plan.js"; import { addImplementation } from "./implementation-edit.js"; import { reactPlatformTypes } from "../bindings/react-platform.js"; import { executionScaffold, isExecutionScaffold } from "./execution-scaffold.js"; +import { scaffoldQuery } from "./query-scaffold.js"; type Source = { repository: string; commit: string }; type PackageEditModel = { @@ -29,6 +30,7 @@ export type ScaffoldRecipe = { id?: string; revision?: string; declaration?: string; + queryDocument?: string; /** Initial authored files for a composed recipe; only used for a new package. */ initialFiles?: Record; tools?: { quixos: Source; protocol: Source; helpers: Source; sdk: Source }; @@ -71,7 +73,7 @@ const ownedJson = async (root: string, file: string): Promise => { * Implementation files are created once; later edits preserve authored wiring. */ export const scaffoldRecipe = async ( root: string, - command: "package" | "function" | "migration" | "refresh", + command: "package" | "function" | "migration" | "refresh" | "query", spec: ScaffoldRecipe, ): Promise => { if (command === "refresh") @@ -82,6 +84,7 @@ export const scaffoldRecipe = async ( if (spec.directory && !/^[A-Za-z0-9_-][A-Za-z0-9_.-]*(?:\/[A-Za-z0-9_-][A-Za-z0-9_.-]*)*$/.test(spec.directory)) throw new Error("Scaffold directory must be contained"); const prefix = spec.directory ? `${spec.directory}/` : ""; + if (command === "query") return scaffoldQuery(root, prefix, spec); if ( spec.template === "typescript-execution" || (command !== "package" && (await isExecutionScaffold(root, prefix))) diff --git a/src/capability-language/tool-cli.ts b/src/capability-language/tool-cli.ts index c407d07..257e48a 100644 --- a/src/capability-language/tool-cli.ts +++ b/src/capability-language/tool-cli.ts @@ -12,6 +12,7 @@ import os from "node:os"; import { spawnSync } from "node:child_process"; import { planStructure, applyStructure, resumeStructure, type StructuralRequest } from "./structural-plan.js"; import { scaffoldRecipe, type ScaffoldRecipe } from "./scaffold-recipes.js"; +import { isExecutionScaffold } from "./execution-scaffold.js"; import { checkBundleSources } from "../bindings/bundle-policy.js"; import { sealMigrations } from "./migration-seal.js"; import { generatePackageDescriptor } from "../bindings/index.js"; @@ -201,7 +202,7 @@ const main = async () => { } if (!command || command === "--help" || args.includes("--help")) { process.stdout.write( - "quixos-qx: author-check, author-contract, converge, worklist, inspect, resources, check-committed, source-baseline, scaffold-package, scaffold-interface, scaffold-function, scaffold-dependency, scaffold-structure, scaffold-resume, pin-upgrade, parse, lint, format\n" + + "quixos-qx: author-check, author-contract, converge, worklist, inspect, resources, check-committed, source-baseline, scaffold-package, scaffold-interface, scaffold-function, scaffold-query, scaffold-dependency, scaffold-structure, scaffold-resume, pin-upgrade, parse, lint, format\n" + "inspect WORKBENCH [RESOURCE] shows provisional contracts, with explicit historical fallback; never verification evidence.\n" + "resources WORKBENCH lists registered editable repositories. Use qx-workspace for the workspace authoring workflow.\n", ); @@ -387,7 +388,11 @@ const main = async () => { throw new Error( "Refresh is no longer required: edit declarations and typed implementation wiring, then run qx-workspace check. Dependency installation uses scaffold install.", ); - if (["scaffold-package", "scaffold-function", "scaffold-migration", "scaffold-install"].includes(command)) { + if ( + ["scaffold-package", "scaffold-function", "scaffold-query", "scaffold-migration", "scaffold-install"].includes( + command, + ) + ) { const [root, specFile, ...flags] = args; let spec: ScaffoldRecipe; if (command === "scaffold-function" && /^[A-Za-z_][A-Za-z0-9_]*$/.test(specFile ?? "")) { @@ -421,16 +426,24 @@ const main = async () => { (flags.includes("--install") && !flags.includes("--write")) ) throw new Error( - "usage: quixos-qx scaffold-package|function|migration|refresh ROOT SPEC_JSON [--write [--install]]", + "usage: quixos-qx scaffold-package|function|query|migration ROOT SPEC_JSON [--write [--install]]", ); const plan = command === "scaffold-install" ? undefined : await planStructure( root, - await scaffoldRecipe(root, command.slice(9) as "package" | "function" | "migration", spec), + await scaffoldRecipe(root, command.slice(9) as "package" | "function" | "query" | "migration", spec), process.env.QUIXOS_SNAPSHOT_MAP, ); + if ( + flags.includes("--install") && + (spec.template === "typescript-execution" || + (await isExecutionScaffold(root, spec.directory ? `${spec.directory}/` : ""))) + ) + throw new Error( + "Execution package dependencies are supplied by checkedArtifacts; omit --install and run workspace-root check after authoring.", + ); const applied = plan && flags.includes("--write") ? await applyStructure(plan) : undefined; if (flags.includes("--install")) { const cwd = path.resolve(root, spec.directory ?? ""); diff --git a/test/scaffold-recipes.test.ts b/test/scaffold-recipes.test.ts index f1442cf..478881c 100644 --- a/test/scaffold-recipes.test.ts +++ b/test/scaffold-recipes.test.ts @@ -166,3 +166,60 @@ test("execution scaffolds route typed handlers by declared effect and target wit await assert.rejects(apply("function", { name: "missing", id: "export:missing" }), /explicit execution/); await assert.rejects(apply("migration", { name: "migration", id: "export:migration" }), /not supported/); }); + +test("query scaffold preserves placement and inserts its named GraphQL document atomically", async (context) => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "qx-query-recipe-")); + context.after(() => fs.rm(root, { recursive: true, force: true })); + await execFile("git", ["-C", root, "init"]); + const source = { repository: "https://example.test/query.git", commit: "a".repeat(40) }; + await fs.writeFile( + path.join(root, "package.qx"), + 'import interface Task;\npackage Tasks id "tasks" revision "tasks@1" {}\n', + ); + const request = (name: string, placement: string) => ({ + source, + name, + id: `tasks:${name}`, + declaration: `query ${name} id "tasks:${name}" root Task document "queries/${name}.graphql" operation "${name}" { ${placement} max rows 100; }`, + queryDocument: `query ${name} { root { title } }\n`, + }); + for (const [name, placement] of [ + ["Inputs", "replica;"], + ["Screen", "local from Inputs;"], + ["Confirmed", ""], + ]) { + const spec = request(name, placement); + const recipe = await scaffoldRecipe(root, "query", spec); + const planned = await planStructure(root, recipe); + await assert.rejects(fs.access(path.join(root, `queries/${name}.graphql`)), "Preview must not write files"); + await applyStructure(planned); + assert.equal(await fs.readFile(path.join(root, `queries/${name}.graphql`), "utf8"), spec.queryDocument); + assert.ok((await fs.readFile(path.join(root, "package.qx"), "utf8")).includes(placement)); + await assert.rejects(scaffoldRecipe(root, "query", spec), /unique/); + } + const bad = request("Bad", "replica;"); + await assert.rejects( + scaffoldRecipe(root, "query", { + ...bad, + declaration: bad.declaration.replace("queries/Bad.graphql", "../Bad.graphql"), + }), + /contained/, + ); + await assert.rejects( + scaffoldRecipe(root, "query", { ...bad, queryDocument: "query Other { root { title } }" }), + /declared named query/, + ); + await assert.rejects( + scaffoldRecipe(root, "query", { ...bad, queryDocument: "mutation Bad { title }" }), + /declared named query/, + ); + await assert.rejects( + scaffoldRecipe(root, "query", { ...bad, declaration: bad.declaration + ' function x id "x" : unit -> unit;' }), + /one QX query/, + ); + await fs.mkdir(path.join(root, "queries"), { recursive: true }); + await fs.writeFile(path.join(root, "queries/Bad.graphql"), "# authored content\n"); + const before = await fs.readFile(path.join(root, "package.qx"), "utf8"); + await assert.rejects(planStructure(root, await scaffoldRecipe(root, "query", bad)), /existing file/); + assert.equal(await fs.readFile(path.join(root, "package.qx"), "utf8"), before); +}); From 70344ca06adbcdfa4088b0f6baf7f6545ef488b8 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Mon, 21 Sep 2026 01:30:57 -0700 Subject: [PATCH 40/91] Review execution semantic-major changes without storage migration planning --- src/capability-language/authoring-check.ts | 24 +++++++- src/capability-model/evolution.ts | 67 +++++++++++++++++----- test/evolution.test.ts | 37 ++++++++++++ 3 files changed, 111 insertions(+), 17 deletions(-) diff --git a/src/capability-language/authoring-check.ts b/src/capability-language/authoring-check.ts index 8c696ad..5f65355 100644 --- a/src/capability-language/authoring-check.ts +++ b/src/capability-language/authoring-check.ts @@ -7,7 +7,12 @@ import type { convergeAuthoring } from "./authoring-converge.js"; import { execFile as callback } from "node:child_process"; import { promisify } from "node:util"; import { buildImmutableCandidate, checkerIdentity } from "./checked-build.js"; -import { planEvolution, type WorkspaceRevision, type EvolutionReview } from "../capability-model/index.js"; +import { + planEvolution, + reviewSemanticMajors, + type WorkspaceRevision, + type EvolutionReview, +} from "../capability-model/index.js"; export const checkRecordName = (directory: string) => createHash("sha256").update(directory).digest("hex") + ".json"; export async function checkAuthoring( @@ -105,7 +110,20 @@ export async function checkAuthoring( } catch (error) { if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error; } - if (resource.kind === "workspace" && !options.contractOnly && report.runtime !== "execution") { + if (resource.kind === "workspace" && !options.contractOnly && report.runtime === "execution") { + report.phase = "semantic-review"; + if (options.reviews && !options.baseline) + throw new Error("Execution semantic reviews require an explicit --baseline candidate"); + const baseline = options.baseline + ? (JSON.parse(await fs.readFile(options.baseline, "utf8")) as WorkspaceRevision) + : null; + const receipts = options.reviews + ? (JSON.parse(await fs.readFile(options.reviews, "utf8")) as EvolutionReview[]) + : []; + const review = reviewSemanticMajors(baseline, JSON.parse(candidateText), receipts); + await fs.writeFile(path.join(output, "semantic-review.json"), JSON.stringify(review, null, 2)); + report.blockers.push(...review.blockers); + } else if (resource.kind === "workspace" && !options.contractOnly) { report.phase = "evolution"; await progress(); let baseline = options.baseline; @@ -154,7 +172,7 @@ export async function checkAuthoring( await fs.writeFile(temporary, JSON.stringify(value, null, 2), { flag: "wx", mode: 0o600 }); await fs.rename(temporary, filename); }; - if (report.artifactPath) { + if (report.artifactPath && report.compilation === "passed" && !report.blockers.length) { const graph = JSON.parse(await fs.readFile(path.join(report.artifactPath, "graph.json"), "utf8")); for (const checked of graph.resources) { const managed = context.resources.find( diff --git a/src/capability-model/evolution.ts b/src/capability-model/evolution.ts index 0d9b0bd..0133b80 100644 --- a/src/capability-model/evolution.ts +++ b/src/capability-model/evolution.ts @@ -367,6 +367,36 @@ export const planEvolution = ( ...(next ? { candidate: next } : {}), }); } + const semanticReview = assessSemanticReviews(baseline, candidate, options.reviews ?? [], checkerVersion, [ + ...nextRuntimes.values(), + ]); + const reviews = semanticReview.reviews; + blockers.push(...semanticReview.blockers); + return { + schemaVersion: 1, + baselineDigest: baseline ? contentDigest(baseline) : null, + candidateDigest, + checkerVersion, + runtimeActions, + storageChanges, + migrationRequired: storageChanges.filter((entry) => entry.requiresMigration).map((entry) => entry.id), + reviews, + packageChecks: runtimeActions + .filter((entry) => entry.candidate && entry.action !== "keep") + .map((entry) => ({ groupId: entry.groupId, contractDigest: entry.candidate!.digest })), + blockers, + }; +}; + +/** Review dependency contracts, without making any storage or process-placement decision. */ +function assessSemanticReviews( + baseline: WorkspaceRevision | null, + candidate: WorkspaceRevision, + receipts: readonly EvolutionReview[], + checkerVersion: string, + consumers: readonly RuntimeContract[], +): Pick { + const blockers: string[] = []; const providers = (workspace: WorkspaceRevision) => [ ...workspace.packageImports.map((entry) => ({ id: entry.packageId as string, @@ -393,7 +423,7 @@ export const planEvolution = ( } if (!old[0] || old[0].major === provider.major) continue; if (provider.major < old[0].major) blockers.push(`Semantic major decreases for ${provider.id}`); - for (const consumer of nextRuntimes.values()) { + for (const consumer of consumers) { if (consumer.packageId === provider.id || !consumer.reviewProviders.includes(provider.id)) continue; const requirement = { consumerId: consumer.groupId, @@ -408,7 +438,7 @@ export const planEvolution = ( consumer: consumer.digest, checkerVersion, }); - const accepted = (options.reviews ?? []).some( + const accepted = receipts.some( (entry) => entry.requirementDigest === requirementDigest && ["changed", "accepted-unchanged"].includes(entry.decision) && @@ -419,18 +449,27 @@ export const planEvolution = ( if (!accepted) blockers.push(`Semantic-major review required: ${consumer.groupId} consumes ${provider.id}`); } } + return { reviews, blockers }; +} + +export function reviewSemanticMajors( + baseline: WorkspaceRevision | null, + candidate: WorkspaceRevision, + receipts: readonly EvolutionReview[] = [], +) { + for (const workspace of baseline ? [baseline, candidate] : [candidate]) { + const issues = validateWorkspaceRevision(workspace); + if (issues.length) + throw new Error("Invalid semantic-review workspace: " + issues.map((issue) => issue.message).join("; ")); + } + if (baseline && baseline.workspaceId !== candidate.workspaceId) + throw new Error("Cannot review a different workspace"); + const checkerVersion = "quixos-semantic-review-v1"; + const report = assessSemanticReviews(baseline, candidate, receipts, checkerVersion, runtimeContracts(candidate)); return { - schemaVersion: 1, - baselineDigest: baseline ? contentDigest(baseline) : null, - candidateDigest, checkerVersion, - runtimeActions, - storageChanges, - migrationRequired: storageChanges.filter((entry) => entry.requiresMigration).map((entry) => entry.id), - reviews, - packageChecks: runtimeActions - .filter((entry) => entry.candidate && entry.action !== "keep") - .map((entry) => ({ groupId: entry.groupId, contractDigest: entry.candidate!.digest })), - blockers, + baselineDigest: baseline ? contentDigest(baseline) : null, + candidateDigest: contentDigest(candidate), + ...report, }; -}; +} diff --git a/test/evolution.test.ts b/test/evolution.test.ts index 93c91b1..97ccb97 100644 --- a/test/evolution.test.ts +++ b/test/evolution.test.ts @@ -4,6 +4,7 @@ import { capabilityId as id, valueType, validateWorkspaceRevision } from "../src import { contentDigest, planEvolution, + reviewSemanticMajors, runtimeContracts, storageContracts, storageChangeRequiresMigration, @@ -126,6 +127,42 @@ test("semantic review receipts cover exact consumer/provider contracts", () => { assert.equal(planEvolution(before, after, { allowLegacy: true, reviews: [receipt] }).reviews[0]!.accepted, false); }); +test("execution semantic review is independent of storage migration and process action planning", () => { + const before = makeValidCapabilityWorkspace(); + before.conformances[0]!.id = id.conformance("conformance:project:named"); + const after = structuredClone(before); + after.conformances[0]!.semanticMajor = 2; + const report = reviewSemanticMajors(before, after); + assert.equal(report.checkerVersion, "quixos-semantic-review-v1"); + assert.equal(report.reviews.length, 1); + assert.equal(report.reviews[0]!.accepted, false); + assert.equal("migrationRequired" in report, false); + assert.equal("runtimeActions" in report, false); + assert.equal(report.blockers.length, 1); + const receipt = { + requirementDigest: report.reviews[0]!.requirementDigest, + decision: "accepted-unchanged" as const, + rationale: "The consumer only displays this provider's unchanged label contract", + agentId: "fixture-agent", + }; + assert.deepEqual(reviewSemanticMajors(before, after, [receipt]).blockers, []); + const oldReceipt = { + ...receipt, + requirementDigest: planEvolution(before, after, { allowLegacy: true }).reviews[0]!.requirementDigest, + }; + assert.equal(reviewSemanticMajors(before, after, [oldReceipt]).reviews[0]!.accepted, false); + after.packageImports[0]!.source.commit = "f".repeat(40); + assert.equal(reviewSemanticMajors(before, after, [receipt]).reviews[0]!.accepted, false); + assert.deepEqual(reviewSemanticMajors(null, after).blockers, []); + assert.throws( + () => reviewSemanticMajors(before, { ...after, workspaceId: id.workspace("different") }), + /different workspace/, + ); + const earlier = structuredClone(after); + earlier.conformances[0]!.semanticMajor = 1; + assert.ok(reviewSemanticMajors(after, earlier).blockers.some((message) => message.includes("decreases"))); +}); + test("evolution enrollment is explicit and never erases legacy ownership", () => { const workspace = makeValidCapabilityWorkspace(); const report = planEvolution(workspace, workspace); From 3c0378358fef56877afc2969a6b1e1d8097cc985 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Mon, 21 Sep 2026 01:56:17 -0700 Subject: [PATCH 41/91] Run checked execution candidates in isolated development workspaces --- nix/checked-candidate.nix | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/nix/checked-candidate.nix b/nix/checked-candidate.nix index 7fe5a4e..e460047 100644 --- a/nix/checked-candidate.nix +++ b/nix/checked-candidate.nix @@ -164,6 +164,12 @@ pkgs.runCommand (if contractOnly then "qx-contract" else "qx-checked-candidate") ${pkgs.nodejs_24}/bin/node ${./check-execution.mjs} \ ${protocol}/libexec/quixos-protocol/execution-world.mjs \ "$out/execution-plan.json" "$out/checks.json" "$out" + mkdir -p "$out/bin" + cat > "$out/bin/run-isolated" < Date: Mon, 21 Sep 2026 11:23:26 -0700 Subject: [PATCH 42/91] Implement checked workspace integration contracts (WI-01) --- grammar/QuixosCapability.g4 | 20 + src/capability-language/assembly.ts | 9 + src/capability-language/authoring-inspect.ts | 4 +- .../generated/QuixosCapability.interp | 14 +- .../generated/QuixosCapability.tokens | 584 +-- .../generated/QuixosCapabilityLexer.interp | 17 +- .../generated/QuixosCapabilityLexer.tokens | 584 +-- .../generated/QuixosCapabilityLexer.ts | 1344 +++--- .../generated/QuixosCapabilityParser.ts | 3884 +++++++++-------- .../generated/QuixosCapabilityVisitor.ts | 14 + src/capability-language/parser.ts | 42 + src/capability-model/controllers.ts | 86 + src/capability-model/presentations.ts | 56 + src/capability-model/types.ts | 28 + src/capability-model/validation.ts | 11 +- src/execution-world/artifacts.ts | 131 +- src/execution-world/client-contracts.ts | 122 + src/execution-world/index.ts | 1 + src/execution-world/installation.ts | 130 +- src/execution-world/plan.ts | 6 + test/client-contracts.test.ts | 121 + test/presentations.test.ts | 230 + 22 files changed, 4349 insertions(+), 3089 deletions(-) create mode 100644 src/capability-model/controllers.ts create mode 100644 src/capability-model/presentations.ts create mode 100644 src/execution-world/client-contracts.ts create mode 100644 test/client-contracts.test.ts create mode 100644 test/presentations.test.ts diff --git a/grammar/QuixosCapability.g4 b/grammar/QuixosCapability.g4 index c2ecf03..c078096 100644 --- a/grammar/QuixosCapability.g4 +++ b/grammar/QuixosCapability.g4 @@ -27,6 +27,7 @@ workspaceItem | sharedAttachmentDecl | conformanceDecl | constructorBindingDecl + | presentationDecl | typeAliasDecl ; @@ -145,6 +146,15 @@ packageExport | packageConstructorExport | packageQuery | packageQuerySpecialization + | componentDecl + ; + +componentDecl + : COMPONENT identifier ID stringLiteral SUBJECT interfaceType RUNTIME identifier SEMI + ; + +presentationDecl + : PRESENTATION identifier ID stringLiteral FOR interfaceType USING identifier DOT identifier SEMI ; packageQuery @@ -471,6 +481,11 @@ identifier | RESULT_BYTES | RPC_CALLS | DEADLINE_MS + | COMPONENT + | PRESENTATION + | SUBJECT + | RUNTIME + | FOR ; stringLiteral @@ -478,6 +493,11 @@ stringLiteral ; EDIT: 'edit'; +COMPONENT: 'component'; +PRESENTATION: 'presentation'; +SUBJECT: 'subject'; +RUNTIME: 'runtime'; +FOR: 'for'; CREATION: 'creation'; INITIALIZE: 'initialize'; WORKSPACE: 'workspace'; diff --git a/src/capability-language/assembly.ts b/src/capability-language/assembly.ts index d388d02..05c84eb 100644 --- a/src/capability-language/assembly.ts +++ b/src/capability-language/assembly.ts @@ -4,6 +4,7 @@ import { loadQxSources, resolveQxSources } from "./source-loader.js"; import { compileRepositoryQuery } from "../query/compile.js"; import { checkQueryTemplate } from "../query/templates.js"; import { readRepositorySource } from "./source-loader.js"; +import { parseControllerCatalog } from "../capability-model/controllers.js"; import { linkQueries } from "../query/link.js"; import { capabilityId, @@ -249,6 +250,14 @@ const createResourceGraphResolver = (quixosCommit: string, resolveResource: Capa compileRepositoryQuery(snapshot.directory, query, queryInterfaces), ), ); + let controllerText: string | undefined; + try { + controllerText = await readRepositorySource(snapshot.directory, "quixos.controllers.json"); + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error; + } + if (controllerText !== undefined) + compiled.resource.revision.controllers = parseControllerCatalog(controllerText, queryInterfaces); let catalogText: string | undefined; try { catalogText = await readFile(path.join(snapshot.directory, "quixos.migrations.json"), "utf8"); diff --git a/src/capability-language/authoring-inspect.ts b/src/capability-language/authoring-inspect.ts index 980bfc8..54544f2 100644 --- a/src/capability-language/authoring-inspect.ts +++ b/src/capability-language/authoring-inspect.ts @@ -69,7 +69,9 @@ export async function inspectAuthoringRepository(root: string, historyLimit = 10 declarations: syntax ? [...walkSyntax(syntax.root)] .filter((node) => - /^(?:interface|package|atom|state|edge|method|function|event|conformance)\w*Decl$/.test(node.kind), + /^(?:interface|package|atom|state|edge|method|function|event|conformance|component|presentation)\w*Decl$/.test( + node.kind, + ), ) .map((node) => ({ kind: node.kind, source: source.slice(node.start, node.end) })) : [], diff --git a/src/capability-language/generated/QuixosCapability.interp b/src/capability-language/generated/QuixosCapability.interp index f8c4cf0..24b63f2 100644 --- a/src/capability-language/generated/QuixosCapability.interp +++ b/src/capability-language/generated/QuixosCapability.interp @@ -1,6 +1,11 @@ token literal names: null 'edit' +'component' +'presentation' +'subject' +'runtime' +'for' 'creation' 'initialize' 'workspace' @@ -152,6 +157,11 @@ null token symbolic names: null EDIT +COMPONENT +PRESENTATION +SUBJECT +RUNTIME +FOR CREATION INITIALIZE WORKSPACE @@ -328,6 +338,8 @@ relationshipOperation targetConstraint packageResourceDecl packageExport +componentDecl +presentationDecl packageQuery packageQuerySpecialization queryClause @@ -381,4 +393,4 @@ stringLiteral atn: -[4, 1, 148, 1293, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 167, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 172, 8, 1, 10, 1, 12, 1, 175, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 193, 8, 3, 10, 3, 12, 3, 196, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 207, 8, 4, 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, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 239, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 247, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 252, 8, 10, 10, 10, 12, 10, 255, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 260, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 270, 8, 10, 10, 10, 12, 10, 273, 9, 10, 3, 10, 275, 8, 10, 1, 10, 1, 10, 5, 10, 279, 8, 10, 10, 10, 12, 10, 282, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 290, 8, 11, 10, 11, 12, 11, 293, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 301, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 309, 8, 12, 10, 12, 12, 12, 312, 9, 12, 3, 12, 314, 8, 12, 3, 12, 316, 8, 12, 1, 13, 1, 13, 3, 13, 320, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 326, 8, 14, 10, 14, 12, 14, 329, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 340, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 345, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 354, 8, 17, 1, 18, 3, 18, 357, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 372, 8, 18, 1, 18, 1, 18, 1, 18, 1, 19, 3, 19, 378, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 388, 8, 19, 10, 19, 12, 19, 391, 9, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 399, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 407, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 415, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 428, 8, 20, 1, 21, 3, 21, 431, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 441, 8, 21, 1, 21, 1, 21, 3, 21, 445, 8, 21, 1, 21, 1, 21, 5, 21, 449, 8, 21, 10, 21, 12, 21, 452, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 458, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 464, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 472, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 480, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 493, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 500, 8, 24, 1, 24, 1, 24, 3, 24, 504, 8, 24, 1, 25, 5, 25, 507, 8, 25, 10, 25, 12, 25, 510, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 520, 8, 25, 1, 25, 1, 25, 5, 25, 524, 8, 25, 10, 25, 12, 25, 527, 9, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 536, 8, 26, 1, 27, 1, 27, 1, 27, 3, 27, 541, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 547, 8, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 556, 8, 27, 10, 27, 12, 27, 559, 9, 27, 1, 27, 1, 27, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 585, 8, 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, 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, 3, 29, 612, 8, 29, 1, 30, 1, 30, 1, 30, 3, 30, 617, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 628, 8, 30, 1, 30, 3, 30, 631, 8, 30, 1, 30, 1, 30, 1, 30, 3, 30, 636, 8, 30, 1, 30, 3, 30, 639, 8, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 3, 31, 646, 8, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 655, 8, 31, 1, 31, 3, 31, 658, 8, 31, 1, 31, 3, 31, 661, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 678, 8, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 5, 34, 685, 8, 34, 10, 34, 12, 34, 688, 9, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 701, 8, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 720, 8, 38, 10, 38, 12, 38, 723, 9, 38, 3, 38, 725, 8, 38, 1, 38, 3, 38, 728, 8, 38, 1, 39, 1, 39, 1, 39, 5, 39, 733, 8, 39, 10, 39, 12, 39, 736, 9, 39, 1, 40, 1, 40, 1, 40, 5, 40, 741, 8, 40, 10, 40, 12, 40, 744, 9, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 783, 8, 41, 1, 41, 3, 41, 786, 8, 41, 1, 41, 1, 41, 3, 41, 790, 8, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 812, 8, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 826, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 832, 8, 42, 10, 42, 12, 42, 835, 9, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 3, 45, 846, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 860, 8, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 870, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 888, 8, 49, 1, 49, 1, 49, 3, 49, 892, 8, 49, 1, 49, 3, 49, 895, 8, 49, 1, 49, 1, 49, 3, 49, 899, 8, 49, 1, 49, 3, 49, 902, 8, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 911, 8, 50, 1, 50, 1, 50, 3, 50, 915, 8, 50, 1, 50, 1, 50, 3, 50, 919, 8, 50, 1, 50, 1, 50, 5, 50, 923, 8, 50, 10, 50, 12, 50, 926, 9, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 936, 8, 51, 1, 52, 1, 52, 1, 52, 5, 52, 941, 8, 52, 10, 52, 12, 52, 944, 9, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 963, 8, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 5, 54, 970, 8, 54, 10, 54, 12, 54, 973, 9, 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, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 1004, 8, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 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, 1024, 8, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1044, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1054, 8, 60, 1, 60, 3, 60, 1057, 8, 60, 1, 60, 3, 60, 1060, 8, 60, 3, 60, 1062, 8, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 5, 64, 1074, 8, 64, 10, 64, 12, 64, 1077, 9, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1100, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1116, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1125, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1135, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 5, 65, 1146, 8, 65, 10, 65, 12, 65, 1149, 9, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1163, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1175, 8, 65, 1, 65, 1, 65, 3, 65, 1179, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1188, 8, 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, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1206, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 5, 67, 1228, 8, 67, 10, 67, 12, 67, 1231, 9, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1236, 8, 67, 3, 67, 1238, 8, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1257, 8, 71, 1, 72, 1, 72, 1, 72, 1, 72, 5, 72, 1263, 8, 72, 10, 72, 12, 72, 1266, 9, 72, 3, 72, 1268, 8, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 5, 74, 1280, 8, 74, 10, 74, 12, 74, 1283, 9, 74, 3, 74, 1285, 8, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 0, 0, 77, 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, 0, 9, 2, 0, 10, 10, 28, 28, 1, 0, 6, 7, 1, 0, 96, 100, 3, 0, 1, 1, 91, 95, 97, 98, 3, 0, 1, 1, 91, 92, 97, 98, 2, 0, 93, 95, 97, 98, 1, 0, 116, 123, 1, 0, 103, 106, 7, 0, 1, 3, 5, 28, 40, 40, 69, 69, 89, 90, 101, 101, 144, 144, 1400, 0, 166, 1, 0, 0, 0, 2, 168, 1, 0, 0, 0, 4, 178, 1, 0, 0, 0, 6, 182, 1, 0, 0, 0, 8, 206, 1, 0, 0, 0, 10, 218, 1, 0, 0, 0, 12, 220, 1, 0, 0, 0, 14, 227, 1, 0, 0, 0, 16, 238, 1, 0, 0, 0, 18, 240, 1, 0, 0, 0, 20, 253, 1, 0, 0, 0, 22, 285, 1, 0, 0, 0, 24, 315, 1, 0, 0, 0, 26, 317, 1, 0, 0, 0, 28, 321, 1, 0, 0, 0, 30, 339, 1, 0, 0, 0, 32, 341, 1, 0, 0, 0, 34, 353, 1, 0, 0, 0, 36, 356, 1, 0, 0, 0, 38, 377, 1, 0, 0, 0, 40, 427, 1, 0, 0, 0, 42, 430, 1, 0, 0, 0, 44, 455, 1, 0, 0, 0, 46, 492, 1, 0, 0, 0, 48, 503, 1, 0, 0, 0, 50, 508, 1, 0, 0, 0, 52, 535, 1, 0, 0, 0, 54, 537, 1, 0, 0, 0, 56, 562, 1, 0, 0, 0, 58, 611, 1, 0, 0, 0, 60, 613, 1, 0, 0, 0, 62, 642, 1, 0, 0, 0, 64, 664, 1, 0, 0, 0, 66, 677, 1, 0, 0, 0, 68, 679, 1, 0, 0, 0, 70, 691, 1, 0, 0, 0, 72, 704, 1, 0, 0, 0, 74, 707, 1, 0, 0, 0, 76, 727, 1, 0, 0, 0, 78, 729, 1, 0, 0, 0, 80, 737, 1, 0, 0, 0, 82, 825, 1, 0, 0, 0, 84, 827, 1, 0, 0, 0, 86, 838, 1, 0, 0, 0, 88, 840, 1, 0, 0, 0, 90, 845, 1, 0, 0, 0, 92, 847, 1, 0, 0, 0, 94, 869, 1, 0, 0, 0, 96, 871, 1, 0, 0, 0, 98, 880, 1, 0, 0, 0, 100, 905, 1, 0, 0, 0, 102, 935, 1, 0, 0, 0, 104, 937, 1, 0, 0, 0, 106, 962, 1, 0, 0, 0, 108, 964, 1, 0, 0, 0, 110, 976, 1, 0, 0, 0, 112, 983, 1, 0, 0, 0, 114, 997, 1, 0, 0, 0, 116, 1007, 1, 0, 0, 0, 118, 1023, 1, 0, 0, 0, 120, 1061, 1, 0, 0, 0, 122, 1063, 1, 0, 0, 0, 124, 1066, 1, 0, 0, 0, 126, 1068, 1, 0, 0, 0, 128, 1070, 1, 0, 0, 0, 130, 1178, 1, 0, 0, 0, 132, 1180, 1, 0, 0, 0, 134, 1237, 1, 0, 0, 0, 136, 1239, 1, 0, 0, 0, 138, 1244, 1, 0, 0, 0, 140, 1246, 1, 0, 0, 0, 142, 1256, 1, 0, 0, 0, 144, 1258, 1, 0, 0, 0, 146, 1271, 1, 0, 0, 0, 148, 1275, 1, 0, 0, 0, 150, 1288, 1, 0, 0, 0, 152, 1290, 1, 0, 0, 0, 154, 155, 3, 6, 3, 0, 155, 156, 5, 0, 0, 1, 156, 167, 1, 0, 0, 0, 157, 158, 3, 20, 10, 0, 158, 159, 5, 0, 0, 1, 159, 167, 1, 0, 0, 0, 160, 161, 3, 50, 25, 0, 161, 162, 5, 0, 0, 1, 162, 167, 1, 0, 0, 0, 163, 164, 3, 2, 1, 0, 164, 165, 5, 0, 0, 1, 165, 167, 1, 0, 0, 0, 166, 154, 1, 0, 0, 0, 166, 157, 1, 0, 0, 0, 166, 160, 1, 0, 0, 0, 166, 163, 1, 0, 0, 0, 167, 1, 1, 0, 0, 0, 168, 169, 5, 35, 0, 0, 169, 173, 5, 132, 0, 0, 170, 172, 3, 8, 4, 0, 171, 170, 1, 0, 0, 0, 172, 175, 1, 0, 0, 0, 173, 171, 1, 0, 0, 0, 173, 174, 1, 0, 0, 0, 174, 176, 1, 0, 0, 0, 175, 173, 1, 0, 0, 0, 176, 177, 5, 133, 0, 0, 177, 3, 1, 0, 0, 0, 178, 179, 5, 36, 0, 0, 179, 180, 3, 152, 76, 0, 180, 181, 5, 129, 0, 0, 181, 5, 1, 0, 0, 0, 182, 183, 5, 4, 0, 0, 183, 184, 3, 150, 75, 0, 184, 185, 5, 79, 0, 0, 185, 186, 3, 152, 76, 0, 186, 187, 5, 72, 0, 0, 187, 188, 3, 152, 76, 0, 188, 189, 5, 71, 0, 0, 189, 190, 3, 152, 76, 0, 190, 194, 5, 132, 0, 0, 191, 193, 3, 8, 4, 0, 192, 191, 1, 0, 0, 0, 193, 196, 1, 0, 0, 0, 194, 192, 1, 0, 0, 0, 194, 195, 1, 0, 0, 0, 195, 197, 1, 0, 0, 0, 196, 194, 1, 0, 0, 0, 197, 198, 5, 133, 0, 0, 198, 7, 1, 0, 0, 0, 199, 207, 3, 4, 2, 0, 200, 207, 3, 18, 9, 0, 201, 207, 3, 10, 5, 0, 202, 207, 3, 88, 44, 0, 203, 207, 3, 100, 50, 0, 204, 207, 3, 132, 66, 0, 205, 207, 3, 32, 16, 0, 206, 199, 1, 0, 0, 0, 206, 200, 1, 0, 0, 0, 206, 201, 1, 0, 0, 0, 206, 202, 1, 0, 0, 0, 206, 203, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 206, 205, 1, 0, 0, 0, 207, 9, 1, 0, 0, 0, 208, 209, 5, 36, 0, 0, 209, 210, 5, 39, 0, 0, 210, 211, 3, 150, 75, 0, 211, 212, 5, 129, 0, 0, 212, 219, 1, 0, 0, 0, 213, 214, 5, 36, 0, 0, 214, 215, 5, 41, 0, 0, 215, 216, 3, 150, 75, 0, 216, 217, 5, 129, 0, 0, 217, 219, 1, 0, 0, 0, 218, 208, 1, 0, 0, 0, 218, 213, 1, 0, 0, 0, 219, 11, 1, 0, 0, 0, 220, 221, 5, 37, 0, 0, 221, 222, 5, 38, 0, 0, 222, 223, 3, 150, 75, 0, 223, 224, 5, 79, 0, 0, 224, 225, 3, 152, 76, 0, 225, 226, 5, 129, 0, 0, 226, 13, 1, 0, 0, 0, 227, 228, 5, 37, 0, 0, 228, 229, 5, 39, 0, 0, 229, 230, 3, 150, 75, 0, 230, 231, 5, 72, 0, 0, 231, 232, 3, 152, 76, 0, 232, 233, 5, 129, 0, 0, 233, 15, 1, 0, 0, 0, 234, 239, 3, 10, 5, 0, 235, 239, 3, 12, 6, 0, 236, 239, 3, 14, 7, 0, 237, 239, 3, 32, 16, 0, 238, 234, 1, 0, 0, 0, 238, 235, 1, 0, 0, 0, 238, 236, 1, 0, 0, 0, 238, 237, 1, 0, 0, 0, 239, 17, 1, 0, 0, 0, 240, 241, 5, 38, 0, 0, 241, 242, 3, 150, 75, 0, 242, 243, 5, 79, 0, 0, 243, 246, 3, 152, 76, 0, 244, 245, 5, 80, 0, 0, 245, 247, 3, 152, 76, 0, 246, 244, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 247, 248, 1, 0, 0, 0, 248, 249, 5, 129, 0, 0, 249, 19, 1, 0, 0, 0, 250, 252, 3, 16, 8, 0, 251, 250, 1, 0, 0, 0, 252, 255, 1, 0, 0, 0, 253, 251, 1, 0, 0, 0, 253, 254, 1, 0, 0, 0, 254, 256, 1, 0, 0, 0, 255, 253, 1, 0, 0, 0, 256, 257, 5, 39, 0, 0, 257, 259, 3, 150, 75, 0, 258, 260, 3, 22, 11, 0, 259, 258, 1, 0, 0, 0, 259, 260, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 262, 5, 79, 0, 0, 262, 263, 3, 152, 76, 0, 263, 264, 5, 72, 0, 0, 264, 274, 3, 152, 76, 0, 265, 266, 5, 84, 0, 0, 266, 271, 3, 26, 13, 0, 267, 268, 5, 130, 0, 0, 268, 270, 3, 26, 13, 0, 269, 267, 1, 0, 0, 0, 270, 273, 1, 0, 0, 0, 271, 269, 1, 0, 0, 0, 271, 272, 1, 0, 0, 0, 272, 275, 1, 0, 0, 0, 273, 271, 1, 0, 0, 0, 274, 265, 1, 0, 0, 0, 274, 275, 1, 0, 0, 0, 275, 276, 1, 0, 0, 0, 276, 280, 5, 132, 0, 0, 277, 279, 3, 34, 17, 0, 278, 277, 1, 0, 0, 0, 279, 282, 1, 0, 0, 0, 280, 278, 1, 0, 0, 0, 280, 281, 1, 0, 0, 0, 281, 283, 1, 0, 0, 0, 282, 280, 1, 0, 0, 0, 283, 284, 5, 133, 0, 0, 284, 21, 1, 0, 0, 0, 285, 286, 5, 138, 0, 0, 286, 291, 3, 24, 12, 0, 287, 288, 5, 130, 0, 0, 288, 290, 3, 24, 12, 0, 289, 287, 1, 0, 0, 0, 290, 293, 1, 0, 0, 0, 291, 289, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 294, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 294, 295, 5, 139, 0, 0, 295, 23, 1, 0, 0, 0, 296, 297, 5, 42, 0, 0, 297, 300, 3, 150, 75, 0, 298, 299, 5, 128, 0, 0, 299, 301, 5, 32, 0, 0, 300, 298, 1, 0, 0, 0, 300, 301, 1, 0, 0, 0, 301, 316, 1, 0, 0, 0, 302, 303, 5, 31, 0, 0, 303, 313, 3, 150, 75, 0, 304, 305, 5, 33, 0, 0, 305, 310, 3, 26, 13, 0, 306, 307, 5, 140, 0, 0, 307, 309, 3, 26, 13, 0, 308, 306, 1, 0, 0, 0, 309, 312, 1, 0, 0, 0, 310, 308, 1, 0, 0, 0, 310, 311, 1, 0, 0, 0, 311, 314, 1, 0, 0, 0, 312, 310, 1, 0, 0, 0, 313, 304, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 316, 1, 0, 0, 0, 315, 296, 1, 0, 0, 0, 315, 302, 1, 0, 0, 0, 316, 25, 1, 0, 0, 0, 317, 319, 3, 150, 75, 0, 318, 320, 3, 28, 14, 0, 319, 318, 1, 0, 0, 0, 319, 320, 1, 0, 0, 0, 320, 27, 1, 0, 0, 0, 321, 322, 5, 138, 0, 0, 322, 327, 3, 30, 15, 0, 323, 324, 5, 130, 0, 0, 324, 326, 3, 30, 15, 0, 325, 323, 1, 0, 0, 0, 326, 329, 1, 0, 0, 0, 327, 325, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 330, 1, 0, 0, 0, 329, 327, 1, 0, 0, 0, 330, 331, 5, 139, 0, 0, 331, 29, 1, 0, 0, 0, 332, 333, 5, 38, 0, 0, 333, 340, 3, 150, 75, 0, 334, 335, 5, 39, 0, 0, 335, 340, 3, 26, 13, 0, 336, 337, 5, 31, 0, 0, 337, 340, 3, 150, 75, 0, 338, 340, 3, 134, 67, 0, 339, 332, 1, 0, 0, 0, 339, 334, 1, 0, 0, 0, 339, 336, 1, 0, 0, 0, 339, 338, 1, 0, 0, 0, 340, 31, 1, 0, 0, 0, 341, 342, 5, 30, 0, 0, 342, 344, 3, 150, 75, 0, 343, 345, 3, 22, 11, 0, 344, 343, 1, 0, 0, 0, 344, 345, 1, 0, 0, 0, 345, 346, 1, 0, 0, 0, 346, 347, 5, 141, 0, 0, 347, 348, 3, 134, 67, 0, 348, 349, 5, 129, 0, 0, 349, 33, 1, 0, 0, 0, 350, 354, 3, 38, 19, 0, 351, 354, 3, 42, 21, 0, 352, 354, 3, 36, 18, 0, 353, 350, 1, 0, 0, 0, 353, 351, 1, 0, 0, 0, 353, 352, 1, 0, 0, 0, 354, 35, 1, 0, 0, 0, 355, 357, 5, 52, 0, 0, 356, 355, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 358, 1, 0, 0, 0, 358, 359, 5, 44, 0, 0, 359, 360, 3, 150, 75, 0, 360, 361, 5, 79, 0, 0, 361, 362, 3, 152, 76, 0, 362, 363, 5, 128, 0, 0, 363, 364, 3, 134, 67, 0, 364, 365, 5, 127, 0, 0, 365, 366, 3, 134, 67, 0, 366, 367, 5, 132, 0, 0, 367, 368, 5, 96, 0, 0, 368, 369, 5, 79, 0, 0, 369, 371, 3, 152, 76, 0, 370, 372, 3, 66, 33, 0, 371, 370, 1, 0, 0, 0, 371, 372, 1, 0, 0, 0, 372, 373, 1, 0, 0, 0, 373, 374, 5, 129, 0, 0, 374, 375, 5, 133, 0, 0, 375, 37, 1, 0, 0, 0, 376, 378, 3, 44, 22, 0, 377, 376, 1, 0, 0, 0, 377, 378, 1, 0, 0, 0, 378, 379, 1, 0, 0, 0, 379, 380, 5, 42, 0, 0, 380, 381, 3, 150, 75, 0, 381, 382, 5, 79, 0, 0, 382, 383, 3, 152, 76, 0, 383, 384, 5, 128, 0, 0, 384, 385, 3, 134, 67, 0, 385, 389, 5, 132, 0, 0, 386, 388, 3, 40, 20, 0, 387, 386, 1, 0, 0, 0, 388, 391, 1, 0, 0, 0, 389, 387, 1, 0, 0, 0, 389, 390, 1, 0, 0, 0, 390, 392, 1, 0, 0, 0, 391, 389, 1, 0, 0, 0, 392, 393, 5, 133, 0, 0, 393, 39, 1, 0, 0, 0, 394, 395, 5, 86, 0, 0, 395, 396, 5, 79, 0, 0, 396, 398, 3, 152, 76, 0, 397, 399, 3, 66, 33, 0, 398, 397, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 401, 5, 129, 0, 0, 401, 428, 1, 0, 0, 0, 402, 403, 5, 87, 0, 0, 403, 404, 5, 79, 0, 0, 404, 406, 3, 152, 76, 0, 405, 407, 3, 66, 33, 0, 406, 405, 1, 0, 0, 0, 406, 407, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 409, 5, 129, 0, 0, 409, 428, 1, 0, 0, 0, 410, 411, 5, 1, 0, 0, 411, 412, 5, 79, 0, 0, 412, 414, 3, 152, 76, 0, 413, 415, 3, 66, 33, 0, 414, 413, 1, 0, 0, 0, 414, 415, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 417, 5, 129, 0, 0, 417, 428, 1, 0, 0, 0, 418, 419, 5, 88, 0, 0, 419, 420, 5, 89, 0, 0, 420, 421, 5, 79, 0, 0, 421, 422, 3, 152, 76, 0, 422, 423, 5, 90, 0, 0, 423, 424, 5, 79, 0, 0, 424, 425, 3, 152, 76, 0, 425, 426, 5, 129, 0, 0, 426, 428, 1, 0, 0, 0, 427, 394, 1, 0, 0, 0, 427, 402, 1, 0, 0, 0, 427, 410, 1, 0, 0, 0, 427, 418, 1, 0, 0, 0, 428, 41, 1, 0, 0, 0, 429, 431, 3, 44, 22, 0, 430, 429, 1, 0, 0, 0, 430, 431, 1, 0, 0, 0, 431, 432, 1, 0, 0, 0, 432, 433, 5, 43, 0, 0, 433, 434, 3, 150, 75, 0, 434, 435, 5, 79, 0, 0, 435, 436, 3, 152, 76, 0, 436, 437, 5, 128, 0, 0, 437, 438, 3, 140, 70, 0, 438, 440, 3, 48, 24, 0, 439, 441, 5, 107, 0, 0, 440, 439, 1, 0, 0, 0, 440, 441, 1, 0, 0, 0, 441, 444, 1, 0, 0, 0, 442, 443, 5, 77, 0, 0, 443, 445, 3, 152, 76, 0, 444, 442, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 450, 5, 132, 0, 0, 447, 449, 3, 46, 23, 0, 448, 447, 1, 0, 0, 0, 449, 452, 1, 0, 0, 0, 450, 448, 1, 0, 0, 0, 450, 451, 1, 0, 0, 0, 451, 453, 1, 0, 0, 0, 452, 450, 1, 0, 0, 0, 453, 454, 5, 133, 0, 0, 454, 43, 1, 0, 0, 0, 455, 457, 5, 27, 0, 0, 456, 458, 7, 0, 0, 0, 457, 456, 1, 0, 0, 0, 457, 458, 1, 0, 0, 0, 458, 45, 1, 0, 0, 0, 459, 460, 5, 93, 0, 0, 460, 461, 5, 79, 0, 0, 461, 463, 3, 152, 76, 0, 462, 464, 3, 66, 33, 0, 463, 462, 1, 0, 0, 0, 463, 464, 1, 0, 0, 0, 464, 465, 1, 0, 0, 0, 465, 466, 5, 129, 0, 0, 466, 493, 1, 0, 0, 0, 467, 468, 5, 94, 0, 0, 468, 469, 5, 79, 0, 0, 469, 471, 3, 152, 76, 0, 470, 472, 3, 66, 33, 0, 471, 470, 1, 0, 0, 0, 471, 472, 1, 0, 0, 0, 472, 473, 1, 0, 0, 0, 473, 474, 5, 129, 0, 0, 474, 493, 1, 0, 0, 0, 475, 476, 5, 95, 0, 0, 476, 477, 5, 79, 0, 0, 477, 479, 3, 152, 76, 0, 478, 480, 3, 66, 33, 0, 479, 478, 1, 0, 0, 0, 479, 480, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 482, 5, 129, 0, 0, 482, 493, 1, 0, 0, 0, 483, 484, 5, 88, 0, 0, 484, 485, 5, 89, 0, 0, 485, 486, 5, 79, 0, 0, 486, 487, 3, 152, 76, 0, 487, 488, 5, 90, 0, 0, 488, 489, 5, 79, 0, 0, 489, 490, 3, 152, 76, 0, 490, 491, 5, 129, 0, 0, 491, 493, 1, 0, 0, 0, 492, 459, 1, 0, 0, 0, 492, 467, 1, 0, 0, 0, 492, 475, 1, 0, 0, 0, 492, 483, 1, 0, 0, 0, 493, 47, 1, 0, 0, 0, 494, 495, 5, 38, 0, 0, 495, 504, 3, 150, 75, 0, 496, 497, 5, 39, 0, 0, 497, 499, 3, 150, 75, 0, 498, 500, 3, 28, 14, 0, 499, 498, 1, 0, 0, 0, 499, 500, 1, 0, 0, 0, 500, 504, 1, 0, 0, 0, 501, 502, 5, 31, 0, 0, 502, 504, 3, 150, 75, 0, 503, 494, 1, 0, 0, 0, 503, 496, 1, 0, 0, 0, 503, 501, 1, 0, 0, 0, 504, 49, 1, 0, 0, 0, 505, 507, 3, 16, 8, 0, 506, 505, 1, 0, 0, 0, 507, 510, 1, 0, 0, 0, 508, 506, 1, 0, 0, 0, 508, 509, 1, 0, 0, 0, 509, 511, 1, 0, 0, 0, 510, 508, 1, 0, 0, 0, 511, 512, 5, 41, 0, 0, 512, 513, 3, 150, 75, 0, 513, 514, 5, 79, 0, 0, 514, 515, 3, 152, 76, 0, 515, 516, 5, 72, 0, 0, 516, 519, 3, 152, 76, 0, 517, 518, 5, 73, 0, 0, 518, 520, 5, 142, 0, 0, 519, 517, 1, 0, 0, 0, 519, 520, 1, 0, 0, 0, 520, 521, 1, 0, 0, 0, 521, 525, 5, 132, 0, 0, 522, 524, 3, 52, 26, 0, 523, 522, 1, 0, 0, 0, 524, 527, 1, 0, 0, 0, 525, 523, 1, 0, 0, 0, 525, 526, 1, 0, 0, 0, 526, 528, 1, 0, 0, 0, 527, 525, 1, 0, 0, 0, 528, 529, 5, 133, 0, 0, 529, 51, 1, 0, 0, 0, 530, 536, 3, 60, 30, 0, 531, 536, 3, 62, 31, 0, 532, 536, 3, 70, 35, 0, 533, 536, 3, 54, 27, 0, 534, 536, 3, 56, 28, 0, 535, 530, 1, 0, 0, 0, 535, 531, 1, 0, 0, 0, 535, 532, 1, 0, 0, 0, 535, 533, 1, 0, 0, 0, 535, 534, 1, 0, 0, 0, 536, 53, 1, 0, 0, 0, 537, 538, 5, 17, 0, 0, 538, 540, 3, 150, 75, 0, 539, 541, 3, 22, 11, 0, 540, 539, 1, 0, 0, 0, 540, 541, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 543, 5, 79, 0, 0, 543, 544, 3, 152, 76, 0, 544, 546, 5, 20, 0, 0, 545, 547, 5, 4, 0, 0, 546, 545, 1, 0, 0, 0, 546, 547, 1, 0, 0, 0, 547, 548, 1, 0, 0, 0, 548, 549, 3, 26, 13, 0, 549, 550, 5, 21, 0, 0, 550, 551, 3, 152, 76, 0, 551, 552, 5, 44, 0, 0, 552, 553, 3, 152, 76, 0, 553, 557, 5, 132, 0, 0, 554, 556, 3, 58, 29, 0, 555, 554, 1, 0, 0, 0, 556, 559, 1, 0, 0, 0, 557, 555, 1, 0, 0, 0, 557, 558, 1, 0, 0, 0, 558, 560, 1, 0, 0, 0, 559, 557, 1, 0, 0, 0, 560, 561, 5, 133, 0, 0, 561, 55, 1, 0, 0, 0, 562, 563, 5, 17, 0, 0, 563, 564, 3, 150, 75, 0, 564, 565, 5, 79, 0, 0, 565, 566, 3, 152, 76, 0, 566, 567, 5, 19, 0, 0, 567, 568, 3, 150, 75, 0, 568, 569, 3, 28, 14, 0, 569, 570, 5, 129, 0, 0, 570, 57, 1, 0, 0, 0, 571, 572, 5, 11, 0, 0, 572, 612, 5, 129, 0, 0, 573, 574, 5, 12, 0, 0, 574, 575, 5, 13, 0, 0, 575, 576, 3, 150, 75, 0, 576, 577, 5, 129, 0, 0, 577, 612, 1, 0, 0, 0, 578, 579, 5, 22, 0, 0, 579, 580, 3, 152, 76, 0, 580, 581, 5, 129, 0, 0, 581, 612, 1, 0, 0, 0, 582, 584, 5, 23, 0, 0, 583, 585, 5, 31, 0, 0, 584, 583, 1, 0, 0, 0, 584, 585, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 587, 3, 150, 75, 0, 587, 588, 5, 50, 0, 0, 588, 589, 3, 26, 13, 0, 589, 590, 5, 129, 0, 0, 590, 612, 1, 0, 0, 0, 591, 592, 5, 24, 0, 0, 592, 593, 3, 150, 75, 0, 593, 594, 5, 142, 0, 0, 594, 595, 5, 129, 0, 0, 595, 612, 1, 0, 0, 0, 596, 597, 5, 25, 0, 0, 597, 598, 3, 26, 13, 0, 598, 599, 5, 131, 0, 0, 599, 600, 3, 150, 75, 0, 600, 601, 3, 150, 75, 0, 601, 602, 3, 152, 76, 0, 602, 603, 5, 129, 0, 0, 603, 612, 1, 0, 0, 0, 604, 605, 5, 88, 0, 0, 605, 612, 5, 129, 0, 0, 606, 607, 5, 26, 0, 0, 607, 608, 5, 142, 0, 0, 608, 609, 3, 152, 76, 0, 609, 610, 5, 129, 0, 0, 610, 612, 1, 0, 0, 0, 611, 571, 1, 0, 0, 0, 611, 573, 1, 0, 0, 0, 611, 578, 1, 0, 0, 0, 611, 582, 1, 0, 0, 0, 611, 591, 1, 0, 0, 0, 611, 596, 1, 0, 0, 0, 611, 604, 1, 0, 0, 0, 611, 606, 1, 0, 0, 0, 612, 59, 1, 0, 0, 0, 613, 614, 5, 44, 0, 0, 614, 616, 3, 150, 75, 0, 615, 617, 3, 22, 11, 0, 616, 615, 1, 0, 0, 0, 616, 617, 1, 0, 0, 0, 617, 618, 1, 0, 0, 0, 618, 619, 5, 79, 0, 0, 619, 620, 3, 152, 76, 0, 620, 621, 5, 128, 0, 0, 621, 622, 3, 134, 67, 0, 622, 623, 5, 127, 0, 0, 623, 624, 3, 134, 67, 0, 624, 625, 5, 81, 0, 0, 625, 627, 3, 74, 37, 0, 626, 628, 3, 66, 33, 0, 627, 626, 1, 0, 0, 0, 627, 628, 1, 0, 0, 0, 628, 630, 1, 0, 0, 0, 629, 631, 3, 72, 36, 0, 630, 629, 1, 0, 0, 0, 630, 631, 1, 0, 0, 0, 631, 632, 1, 0, 0, 0, 632, 633, 5, 83, 0, 0, 633, 635, 3, 76, 38, 0, 634, 636, 3, 80, 40, 0, 635, 634, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 638, 1, 0, 0, 0, 637, 639, 3, 64, 32, 0, 638, 637, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 640, 1, 0, 0, 0, 640, 641, 5, 129, 0, 0, 641, 61, 1, 0, 0, 0, 642, 643, 5, 45, 0, 0, 643, 645, 3, 150, 75, 0, 644, 646, 3, 22, 11, 0, 645, 644, 1, 0, 0, 0, 645, 646, 1, 0, 0, 0, 646, 647, 1, 0, 0, 0, 647, 648, 5, 79, 0, 0, 648, 649, 3, 152, 76, 0, 649, 650, 5, 128, 0, 0, 650, 651, 3, 134, 67, 0, 651, 652, 5, 127, 0, 0, 652, 654, 3, 134, 67, 0, 653, 655, 3, 66, 33, 0, 654, 653, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 657, 1, 0, 0, 0, 656, 658, 3, 80, 40, 0, 657, 656, 1, 0, 0, 0, 657, 658, 1, 0, 0, 0, 658, 660, 1, 0, 0, 0, 659, 661, 3, 64, 32, 0, 660, 659, 1, 0, 0, 0, 660, 661, 1, 0, 0, 0, 661, 662, 1, 0, 0, 0, 662, 663, 5, 129, 0, 0, 663, 63, 1, 0, 0, 0, 664, 665, 5, 61, 0, 0, 665, 666, 5, 60, 0, 0, 666, 667, 3, 150, 75, 0, 667, 65, 1, 0, 0, 0, 668, 669, 5, 5, 0, 0, 669, 678, 5, 8, 0, 0, 670, 671, 5, 5, 0, 0, 671, 672, 7, 1, 0, 0, 672, 673, 5, 9, 0, 0, 673, 674, 5, 134, 0, 0, 674, 675, 3, 78, 39, 0, 675, 676, 5, 135, 0, 0, 676, 678, 1, 0, 0, 0, 677, 668, 1, 0, 0, 0, 677, 670, 1, 0, 0, 0, 678, 67, 1, 0, 0, 0, 679, 680, 5, 60, 0, 0, 680, 681, 5, 134, 0, 0, 681, 686, 3, 116, 58, 0, 682, 683, 5, 130, 0, 0, 683, 685, 3, 116, 58, 0, 684, 682, 1, 0, 0, 0, 685, 688, 1, 0, 0, 0, 686, 684, 1, 0, 0, 0, 686, 687, 1, 0, 0, 0, 687, 689, 1, 0, 0, 0, 688, 686, 1, 0, 0, 0, 689, 690, 5, 135, 0, 0, 690, 69, 1, 0, 0, 0, 691, 692, 5, 46, 0, 0, 692, 693, 3, 150, 75, 0, 693, 694, 5, 79, 0, 0, 694, 695, 3, 152, 76, 0, 695, 696, 5, 47, 0, 0, 696, 697, 3, 150, 75, 0, 697, 698, 5, 128, 0, 0, 698, 700, 3, 134, 67, 0, 699, 701, 3, 80, 40, 0, 700, 699, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 702, 1, 0, 0, 0, 702, 703, 5, 129, 0, 0, 703, 71, 1, 0, 0, 0, 704, 705, 5, 82, 0, 0, 705, 706, 3, 134, 67, 0, 706, 73, 1, 0, 0, 0, 707, 708, 7, 2, 0, 0, 708, 75, 1, 0, 0, 0, 709, 728, 5, 85, 0, 0, 710, 711, 5, 38, 0, 0, 711, 728, 3, 150, 75, 0, 712, 713, 5, 31, 0, 0, 713, 728, 3, 150, 75, 0, 714, 715, 5, 40, 0, 0, 715, 724, 5, 134, 0, 0, 716, 721, 3, 26, 13, 0, 717, 718, 5, 130, 0, 0, 718, 720, 3, 26, 13, 0, 719, 717, 1, 0, 0, 0, 720, 723, 1, 0, 0, 0, 721, 719, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 725, 1, 0, 0, 0, 723, 721, 1, 0, 0, 0, 724, 716, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 726, 1, 0, 0, 0, 726, 728, 5, 135, 0, 0, 727, 709, 1, 0, 0, 0, 727, 710, 1, 0, 0, 0, 727, 712, 1, 0, 0, 0, 727, 714, 1, 0, 0, 0, 728, 77, 1, 0, 0, 0, 729, 734, 3, 150, 75, 0, 730, 731, 5, 130, 0, 0, 731, 733, 3, 150, 75, 0, 732, 730, 1, 0, 0, 0, 733, 736, 1, 0, 0, 0, 734, 732, 1, 0, 0, 0, 734, 735, 1, 0, 0, 0, 735, 79, 1, 0, 0, 0, 736, 734, 1, 0, 0, 0, 737, 738, 5, 84, 0, 0, 738, 742, 5, 132, 0, 0, 739, 741, 3, 82, 41, 0, 740, 739, 1, 0, 0, 0, 741, 744, 1, 0, 0, 0, 742, 740, 1, 0, 0, 0, 742, 743, 1, 0, 0, 0, 743, 745, 1, 0, 0, 0, 744, 742, 1, 0, 0, 0, 745, 746, 5, 133, 0, 0, 746, 81, 1, 0, 0, 0, 747, 748, 5, 18, 0, 0, 748, 749, 3, 150, 75, 0, 749, 750, 5, 79, 0, 0, 750, 751, 3, 152, 76, 0, 751, 752, 5, 134, 0, 0, 752, 753, 3, 78, 39, 0, 753, 754, 5, 135, 0, 0, 754, 755, 5, 129, 0, 0, 755, 826, 1, 0, 0, 0, 756, 757, 5, 56, 0, 0, 757, 758, 3, 150, 75, 0, 758, 759, 5, 79, 0, 0, 759, 760, 3, 152, 76, 0, 760, 761, 5, 128, 0, 0, 761, 762, 3, 134, 67, 0, 762, 763, 3, 84, 42, 0, 763, 764, 5, 129, 0, 0, 764, 826, 1, 0, 0, 0, 765, 766, 5, 57, 0, 0, 766, 767, 3, 150, 75, 0, 767, 768, 5, 79, 0, 0, 768, 769, 3, 152, 76, 0, 769, 770, 5, 128, 0, 0, 770, 771, 3, 140, 70, 0, 771, 772, 3, 48, 24, 0, 772, 773, 3, 84, 42, 0, 773, 774, 5, 129, 0, 0, 774, 826, 1, 0, 0, 0, 775, 776, 5, 39, 0, 0, 776, 777, 3, 150, 75, 0, 777, 778, 5, 79, 0, 0, 778, 779, 3, 152, 76, 0, 779, 780, 5, 128, 0, 0, 780, 782, 3, 150, 75, 0, 781, 783, 3, 28, 14, 0, 782, 781, 1, 0, 0, 0, 782, 783, 1, 0, 0, 0, 783, 785, 1, 0, 0, 0, 784, 786, 3, 68, 34, 0, 785, 784, 1, 0, 0, 0, 785, 786, 1, 0, 0, 0, 786, 789, 1, 0, 0, 0, 787, 788, 5, 13, 0, 0, 788, 790, 5, 48, 0, 0, 789, 787, 1, 0, 0, 0, 789, 790, 1, 0, 0, 0, 790, 791, 1, 0, 0, 0, 791, 792, 5, 129, 0, 0, 792, 826, 1, 0, 0, 0, 793, 794, 5, 2, 0, 0, 794, 795, 3, 150, 75, 0, 795, 796, 5, 79, 0, 0, 796, 797, 3, 152, 76, 0, 797, 798, 5, 128, 0, 0, 798, 799, 3, 150, 75, 0, 799, 800, 5, 48, 0, 0, 800, 801, 3, 134, 67, 0, 801, 802, 5, 129, 0, 0, 802, 826, 1, 0, 0, 0, 803, 804, 5, 46, 0, 0, 804, 805, 3, 150, 75, 0, 805, 806, 5, 79, 0, 0, 806, 807, 3, 152, 76, 0, 807, 808, 5, 128, 0, 0, 808, 811, 3, 150, 75, 0, 809, 810, 5, 48, 0, 0, 810, 812, 3, 134, 67, 0, 811, 809, 1, 0, 0, 0, 811, 812, 1, 0, 0, 0, 812, 813, 1, 0, 0, 0, 813, 814, 5, 129, 0, 0, 814, 826, 1, 0, 0, 0, 815, 816, 5, 17, 0, 0, 816, 817, 3, 150, 75, 0, 817, 818, 5, 79, 0, 0, 818, 819, 3, 152, 76, 0, 819, 820, 5, 128, 0, 0, 820, 821, 3, 150, 75, 0, 821, 822, 5, 131, 0, 0, 822, 823, 3, 150, 75, 0, 823, 824, 5, 129, 0, 0, 824, 826, 1, 0, 0, 0, 825, 747, 1, 0, 0, 0, 825, 756, 1, 0, 0, 0, 825, 765, 1, 0, 0, 0, 825, 775, 1, 0, 0, 0, 825, 793, 1, 0, 0, 0, 825, 803, 1, 0, 0, 0, 825, 815, 1, 0, 0, 0, 826, 83, 1, 0, 0, 0, 827, 828, 5, 134, 0, 0, 828, 833, 3, 86, 43, 0, 829, 830, 5, 130, 0, 0, 830, 832, 3, 86, 43, 0, 831, 829, 1, 0, 0, 0, 832, 835, 1, 0, 0, 0, 833, 831, 1, 0, 0, 0, 833, 834, 1, 0, 0, 0, 834, 836, 1, 0, 0, 0, 835, 833, 1, 0, 0, 0, 836, 837, 5, 135, 0, 0, 837, 85, 1, 0, 0, 0, 838, 839, 7, 3, 0, 0, 839, 87, 1, 0, 0, 0, 840, 841, 5, 55, 0, 0, 841, 842, 3, 90, 45, 0, 842, 89, 1, 0, 0, 0, 843, 846, 3, 92, 46, 0, 844, 846, 3, 96, 48, 0, 845, 843, 1, 0, 0, 0, 845, 844, 1, 0, 0, 0, 846, 91, 1, 0, 0, 0, 847, 848, 5, 56, 0, 0, 848, 849, 3, 150, 75, 0, 849, 850, 5, 79, 0, 0, 850, 851, 3, 152, 76, 0, 851, 852, 5, 66, 0, 0, 852, 853, 3, 150, 75, 0, 853, 854, 5, 128, 0, 0, 854, 855, 3, 134, 67, 0, 855, 856, 5, 67, 0, 0, 856, 859, 3, 94, 47, 0, 857, 858, 5, 68, 0, 0, 858, 860, 3, 142, 71, 0, 859, 857, 1, 0, 0, 0, 859, 860, 1, 0, 0, 0, 860, 861, 1, 0, 0, 0, 861, 862, 5, 129, 0, 0, 862, 93, 1, 0, 0, 0, 863, 870, 5, 101, 0, 0, 864, 865, 5, 102, 0, 0, 865, 866, 5, 136, 0, 0, 866, 867, 3, 134, 67, 0, 867, 868, 5, 137, 0, 0, 868, 870, 1, 0, 0, 0, 869, 863, 1, 0, 0, 0, 869, 864, 1, 0, 0, 0, 870, 95, 1, 0, 0, 0, 871, 872, 5, 57, 0, 0, 872, 873, 3, 150, 75, 0, 873, 874, 5, 79, 0, 0, 874, 875, 3, 152, 76, 0, 875, 876, 5, 132, 0, 0, 876, 877, 3, 98, 49, 0, 877, 878, 3, 98, 49, 0, 878, 879, 5, 133, 0, 0, 879, 97, 1, 0, 0, 0, 880, 881, 3, 48, 24, 0, 881, 882, 5, 58, 0, 0, 882, 883, 3, 150, 75, 0, 883, 884, 5, 79, 0, 0, 884, 885, 3, 152, 76, 0, 885, 887, 3, 140, 70, 0, 886, 888, 5, 107, 0, 0, 887, 886, 1, 0, 0, 0, 887, 888, 1, 0, 0, 0, 888, 891, 1, 0, 0, 0, 889, 890, 5, 74, 0, 0, 890, 892, 3, 152, 76, 0, 891, 889, 1, 0, 0, 0, 891, 892, 1, 0, 0, 0, 892, 894, 1, 0, 0, 0, 893, 895, 5, 76, 0, 0, 894, 893, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 898, 1, 0, 0, 0, 896, 897, 5, 77, 0, 0, 897, 899, 3, 152, 76, 0, 898, 896, 1, 0, 0, 0, 898, 899, 1, 0, 0, 0, 899, 901, 1, 0, 0, 0, 900, 902, 5, 78, 0, 0, 901, 900, 1, 0, 0, 0, 901, 902, 1, 0, 0, 0, 902, 903, 1, 0, 0, 0, 903, 904, 5, 129, 0, 0, 904, 99, 1, 0, 0, 0, 905, 906, 5, 49, 0, 0, 906, 907, 3, 150, 75, 0, 907, 908, 5, 50, 0, 0, 908, 910, 3, 150, 75, 0, 909, 911, 3, 28, 14, 0, 910, 909, 1, 0, 0, 0, 910, 911, 1, 0, 0, 0, 911, 914, 1, 0, 0, 0, 912, 913, 5, 79, 0, 0, 913, 915, 3, 152, 76, 0, 914, 912, 1, 0, 0, 0, 914, 915, 1, 0, 0, 0, 915, 918, 1, 0, 0, 0, 916, 917, 5, 73, 0, 0, 917, 919, 5, 142, 0, 0, 918, 916, 1, 0, 0, 0, 918, 919, 1, 0, 0, 0, 919, 920, 1, 0, 0, 0, 920, 924, 5, 132, 0, 0, 921, 923, 3, 102, 51, 0, 922, 921, 1, 0, 0, 0, 923, 926, 1, 0, 0, 0, 924, 922, 1, 0, 0, 0, 924, 925, 1, 0, 0, 0, 925, 927, 1, 0, 0, 0, 926, 924, 1, 0, 0, 0, 927, 928, 5, 133, 0, 0, 928, 101, 1, 0, 0, 0, 929, 930, 5, 54, 0, 0, 930, 936, 3, 90, 45, 0, 931, 936, 3, 114, 57, 0, 932, 936, 3, 110, 55, 0, 933, 936, 3, 104, 52, 0, 934, 936, 3, 112, 56, 0, 935, 929, 1, 0, 0, 0, 935, 931, 1, 0, 0, 0, 935, 932, 1, 0, 0, 0, 935, 933, 1, 0, 0, 0, 935, 934, 1, 0, 0, 0, 936, 103, 1, 0, 0, 0, 937, 938, 5, 3, 0, 0, 938, 942, 5, 132, 0, 0, 939, 941, 3, 106, 53, 0, 940, 939, 1, 0, 0, 0, 941, 944, 1, 0, 0, 0, 942, 940, 1, 0, 0, 0, 942, 943, 1, 0, 0, 0, 943, 945, 1, 0, 0, 0, 944, 942, 1, 0, 0, 0, 945, 946, 5, 133, 0, 0, 946, 947, 5, 129, 0, 0, 947, 105, 1, 0, 0, 0, 948, 949, 3, 150, 75, 0, 949, 950, 5, 53, 0, 0, 950, 951, 5, 56, 0, 0, 951, 952, 3, 150, 75, 0, 952, 953, 5, 129, 0, 0, 953, 963, 1, 0, 0, 0, 954, 955, 3, 150, 75, 0, 955, 956, 5, 53, 0, 0, 956, 957, 5, 57, 0, 0, 957, 958, 3, 150, 75, 0, 958, 959, 5, 131, 0, 0, 959, 960, 3, 150, 75, 0, 960, 961, 5, 129, 0, 0, 961, 963, 1, 0, 0, 0, 962, 948, 1, 0, 0, 0, 962, 954, 1, 0, 0, 0, 963, 107, 1, 0, 0, 0, 964, 965, 3, 26, 13, 0, 965, 966, 5, 13, 0, 0, 966, 971, 5, 48, 0, 0, 967, 968, 5, 131, 0, 0, 968, 970, 3, 150, 75, 0, 969, 967, 1, 0, 0, 0, 970, 973, 1, 0, 0, 0, 971, 969, 1, 0, 0, 0, 971, 972, 1, 0, 0, 0, 972, 974, 1, 0, 0, 0, 973, 971, 1, 0, 0, 0, 974, 975, 5, 129, 0, 0, 975, 109, 1, 0, 0, 0, 976, 977, 5, 51, 0, 0, 977, 978, 3, 150, 75, 0, 978, 979, 5, 53, 0, 0, 979, 980, 5, 56, 0, 0, 980, 981, 3, 150, 75, 0, 981, 982, 5, 129, 0, 0, 982, 111, 1, 0, 0, 0, 983, 984, 5, 63, 0, 0, 984, 985, 3, 150, 75, 0, 985, 986, 5, 64, 0, 0, 986, 987, 5, 65, 0, 0, 987, 988, 5, 60, 0, 0, 988, 989, 5, 46, 0, 0, 989, 990, 3, 150, 75, 0, 990, 991, 5, 62, 0, 0, 991, 992, 5, 57, 0, 0, 992, 993, 3, 150, 75, 0, 993, 994, 5, 131, 0, 0, 994, 995, 3, 150, 75, 0, 995, 996, 5, 129, 0, 0, 996, 113, 1, 0, 0, 0, 997, 998, 5, 51, 0, 0, 998, 999, 3, 116, 58, 0, 999, 1000, 5, 53, 0, 0, 1000, 1003, 3, 120, 60, 0, 1001, 1002, 5, 29, 0, 0, 1002, 1004, 3, 152, 76, 0, 1003, 1001, 1, 0, 0, 0, 1003, 1004, 1, 0, 0, 0, 1004, 1005, 1, 0, 0, 0, 1005, 1006, 5, 129, 0, 0, 1006, 115, 1, 0, 0, 0, 1007, 1008, 3, 150, 75, 0, 1008, 1009, 5, 131, 0, 0, 1009, 1010, 3, 118, 59, 0, 1010, 117, 1, 0, 0, 0, 1011, 1024, 3, 150, 75, 0, 1012, 1024, 5, 96, 0, 0, 1013, 1024, 5, 86, 0, 0, 1014, 1024, 5, 87, 0, 0, 1015, 1024, 5, 1, 0, 0, 1016, 1024, 5, 93, 0, 0, 1017, 1024, 5, 94, 0, 0, 1018, 1024, 5, 95, 0, 0, 1019, 1024, 5, 97, 0, 0, 1020, 1024, 5, 98, 0, 0, 1021, 1024, 5, 99, 0, 0, 1022, 1024, 5, 100, 0, 0, 1023, 1011, 1, 0, 0, 0, 1023, 1012, 1, 0, 0, 0, 1023, 1013, 1, 0, 0, 0, 1023, 1014, 1, 0, 0, 0, 1023, 1015, 1, 0, 0, 0, 1023, 1016, 1, 0, 0, 0, 1023, 1017, 1, 0, 0, 0, 1023, 1018, 1, 0, 0, 0, 1023, 1019, 1, 0, 0, 0, 1023, 1020, 1, 0, 0, 0, 1023, 1021, 1, 0, 0, 0, 1023, 1022, 1, 0, 0, 0, 1024, 119, 1, 0, 0, 0, 1025, 1026, 5, 75, 0, 0, 1026, 1027, 5, 131, 0, 0, 1027, 1062, 3, 150, 75, 0, 1028, 1029, 5, 56, 0, 0, 1029, 1030, 3, 150, 75, 0, 1030, 1031, 5, 131, 0, 0, 1031, 1032, 3, 124, 62, 0, 1032, 1062, 1, 0, 0, 0, 1033, 1034, 5, 57, 0, 0, 1034, 1035, 3, 150, 75, 0, 1035, 1036, 5, 131, 0, 0, 1036, 1037, 3, 150, 75, 0, 1037, 1038, 5, 131, 0, 0, 1038, 1039, 3, 126, 63, 0, 1039, 1062, 1, 0, 0, 0, 1040, 1041, 5, 39, 0, 0, 1041, 1043, 3, 150, 75, 0, 1042, 1044, 3, 28, 14, 0, 1043, 1042, 1, 0, 0, 0, 1043, 1044, 1, 0, 0, 0, 1044, 1045, 1, 0, 0, 0, 1045, 1046, 5, 131, 0, 0, 1046, 1047, 3, 116, 58, 0, 1047, 1062, 1, 0, 0, 0, 1048, 1049, 5, 41, 0, 0, 1049, 1050, 3, 150, 75, 0, 1050, 1051, 5, 131, 0, 0, 1051, 1053, 3, 150, 75, 0, 1052, 1054, 3, 28, 14, 0, 1053, 1052, 1, 0, 0, 0, 1053, 1054, 1, 0, 0, 0, 1054, 1056, 1, 0, 0, 0, 1055, 1057, 3, 128, 64, 0, 1056, 1055, 1, 0, 0, 0, 1056, 1057, 1, 0, 0, 0, 1057, 1059, 1, 0, 0, 0, 1058, 1060, 3, 122, 61, 0, 1059, 1058, 1, 0, 0, 0, 1059, 1060, 1, 0, 0, 0, 1060, 1062, 1, 0, 0, 0, 1061, 1025, 1, 0, 0, 0, 1061, 1028, 1, 0, 0, 0, 1061, 1033, 1, 0, 0, 0, 1061, 1040, 1, 0, 0, 0, 1061, 1048, 1, 0, 0, 0, 1062, 121, 1, 0, 0, 0, 1063, 1064, 5, 61, 0, 0, 1064, 1065, 3, 128, 64, 0, 1065, 123, 1, 0, 0, 0, 1066, 1067, 7, 4, 0, 0, 1067, 125, 1, 0, 0, 0, 1068, 1069, 7, 5, 0, 0, 1069, 127, 1, 0, 0, 0, 1070, 1071, 5, 59, 0, 0, 1071, 1075, 5, 132, 0, 0, 1072, 1074, 3, 130, 65, 0, 1073, 1072, 1, 0, 0, 0, 1074, 1077, 1, 0, 0, 0, 1075, 1073, 1, 0, 0, 0, 1075, 1076, 1, 0, 0, 0, 1076, 1078, 1, 0, 0, 0, 1077, 1075, 1, 0, 0, 0, 1078, 1079, 5, 133, 0, 0, 1079, 129, 1, 0, 0, 0, 1080, 1081, 3, 150, 75, 0, 1081, 1082, 5, 53, 0, 0, 1082, 1083, 5, 4, 0, 0, 1083, 1084, 5, 18, 0, 0, 1084, 1085, 5, 134, 0, 0, 1085, 1086, 3, 78, 39, 0, 1086, 1087, 5, 135, 0, 0, 1087, 1088, 5, 129, 0, 0, 1088, 1179, 1, 0, 0, 0, 1089, 1090, 3, 150, 75, 0, 1090, 1091, 5, 53, 0, 0, 1091, 1092, 5, 56, 0, 0, 1092, 1099, 3, 150, 75, 0, 1093, 1094, 5, 62, 0, 0, 1094, 1095, 5, 57, 0, 0, 1095, 1096, 3, 150, 75, 0, 1096, 1097, 5, 131, 0, 0, 1097, 1098, 3, 150, 75, 0, 1098, 1100, 1, 0, 0, 0, 1099, 1093, 1, 0, 0, 0, 1099, 1100, 1, 0, 0, 0, 1100, 1101, 1, 0, 0, 0, 1101, 1102, 5, 129, 0, 0, 1102, 1179, 1, 0, 0, 0, 1103, 1104, 3, 150, 75, 0, 1104, 1105, 5, 53, 0, 0, 1105, 1106, 5, 57, 0, 0, 1106, 1107, 3, 150, 75, 0, 1107, 1108, 5, 131, 0, 0, 1108, 1115, 3, 150, 75, 0, 1109, 1110, 5, 62, 0, 0, 1110, 1111, 5, 57, 0, 0, 1111, 1112, 3, 150, 75, 0, 1112, 1113, 5, 131, 0, 0, 1113, 1114, 3, 150, 75, 0, 1114, 1116, 1, 0, 0, 0, 1115, 1109, 1, 0, 0, 0, 1115, 1116, 1, 0, 0, 0, 1116, 1117, 1, 0, 0, 0, 1117, 1118, 5, 129, 0, 0, 1118, 1179, 1, 0, 0, 0, 1119, 1120, 3, 150, 75, 0, 1120, 1121, 5, 53, 0, 0, 1121, 1122, 5, 39, 0, 0, 1122, 1124, 3, 150, 75, 0, 1123, 1125, 3, 28, 14, 0, 1124, 1123, 1, 0, 0, 0, 1124, 1125, 1, 0, 0, 0, 1125, 1134, 1, 0, 0, 0, 1126, 1127, 5, 62, 0, 0, 1127, 1128, 5, 57, 0, 0, 1128, 1129, 3, 150, 75, 0, 1129, 1130, 5, 131, 0, 0, 1130, 1131, 3, 150, 75, 0, 1131, 1135, 1, 0, 0, 0, 1132, 1133, 5, 13, 0, 0, 1133, 1135, 5, 48, 0, 0, 1134, 1126, 1, 0, 0, 0, 1134, 1132, 1, 0, 0, 0, 1134, 1135, 1, 0, 0, 0, 1135, 1136, 1, 0, 0, 0, 1136, 1137, 5, 129, 0, 0, 1137, 1179, 1, 0, 0, 0, 1138, 1139, 3, 150, 75, 0, 1139, 1140, 5, 53, 0, 0, 1140, 1141, 5, 2, 0, 0, 1141, 1142, 3, 150, 75, 0, 1142, 1143, 5, 59, 0, 0, 1143, 1147, 5, 132, 0, 0, 1144, 1146, 3, 108, 54, 0, 1145, 1144, 1, 0, 0, 0, 1146, 1149, 1, 0, 0, 0, 1147, 1145, 1, 0, 0, 0, 1147, 1148, 1, 0, 0, 0, 1148, 1150, 1, 0, 0, 0, 1149, 1147, 1, 0, 0, 0, 1150, 1151, 5, 133, 0, 0, 1151, 1152, 5, 129, 0, 0, 1152, 1179, 1, 0, 0, 0, 1153, 1154, 3, 150, 75, 0, 1154, 1155, 5, 53, 0, 0, 1155, 1156, 5, 46, 0, 0, 1156, 1157, 3, 150, 75, 0, 1157, 1158, 5, 129, 0, 0, 1158, 1179, 1, 0, 0, 0, 1159, 1160, 3, 150, 75, 0, 1160, 1162, 5, 53, 0, 0, 1161, 1163, 5, 4, 0, 0, 1162, 1161, 1, 0, 0, 0, 1162, 1163, 1, 0, 0, 0, 1163, 1164, 1, 0, 0, 0, 1164, 1165, 5, 17, 0, 0, 1165, 1166, 3, 150, 75, 0, 1166, 1167, 5, 131, 0, 0, 1167, 1174, 3, 150, 75, 0, 1168, 1169, 5, 62, 0, 0, 1169, 1170, 5, 57, 0, 0, 1170, 1171, 3, 150, 75, 0, 1171, 1172, 5, 131, 0, 0, 1172, 1173, 3, 150, 75, 0, 1173, 1175, 1, 0, 0, 0, 1174, 1168, 1, 0, 0, 0, 1174, 1175, 1, 0, 0, 0, 1175, 1176, 1, 0, 0, 0, 1176, 1177, 5, 129, 0, 0, 1177, 1179, 1, 0, 0, 0, 1178, 1080, 1, 0, 0, 0, 1178, 1089, 1, 0, 0, 0, 1178, 1103, 1, 0, 0, 0, 1178, 1119, 1, 0, 0, 0, 1178, 1138, 1, 0, 0, 0, 1178, 1153, 1, 0, 0, 0, 1178, 1159, 1, 0, 0, 0, 1179, 131, 1, 0, 0, 0, 1180, 1181, 5, 46, 0, 0, 1181, 1182, 3, 150, 75, 0, 1182, 1183, 5, 53, 0, 0, 1183, 1184, 3, 150, 75, 0, 1184, 1185, 5, 131, 0, 0, 1185, 1187, 3, 150, 75, 0, 1186, 1188, 3, 128, 64, 0, 1187, 1186, 1, 0, 0, 0, 1187, 1188, 1, 0, 0, 0, 1188, 1189, 1, 0, 0, 0, 1189, 1190, 5, 129, 0, 0, 1190, 133, 1, 0, 0, 0, 1191, 1238, 3, 138, 69, 0, 1192, 1238, 5, 108, 0, 0, 1193, 1238, 5, 109, 0, 0, 1194, 1195, 5, 110, 0, 0, 1195, 1238, 3, 152, 76, 0, 1196, 1197, 5, 111, 0, 0, 1197, 1198, 5, 138, 0, 0, 1198, 1199, 3, 150, 75, 0, 1199, 1200, 5, 139, 0, 0, 1200, 1238, 1, 0, 0, 0, 1201, 1202, 5, 112, 0, 0, 1202, 1203, 5, 138, 0, 0, 1203, 1205, 3, 150, 75, 0, 1204, 1206, 3, 28, 14, 0, 1205, 1204, 1, 0, 0, 0, 1205, 1206, 1, 0, 0, 0, 1206, 1207, 1, 0, 0, 0, 1207, 1208, 5, 139, 0, 0, 1208, 1238, 1, 0, 0, 0, 1209, 1210, 5, 34, 0, 0, 1210, 1211, 5, 138, 0, 0, 1211, 1212, 3, 150, 75, 0, 1212, 1213, 5, 139, 0, 0, 1213, 1238, 1, 0, 0, 0, 1214, 1215, 5, 113, 0, 0, 1215, 1216, 5, 138, 0, 0, 1216, 1217, 3, 134, 67, 0, 1217, 1218, 5, 139, 0, 0, 1218, 1238, 1, 0, 0, 0, 1219, 1220, 5, 114, 0, 0, 1220, 1221, 5, 138, 0, 0, 1221, 1222, 3, 134, 67, 0, 1222, 1223, 5, 139, 0, 0, 1223, 1238, 1, 0, 0, 0, 1224, 1225, 5, 115, 0, 0, 1225, 1229, 5, 132, 0, 0, 1226, 1228, 3, 136, 68, 0, 1227, 1226, 1, 0, 0, 0, 1228, 1231, 1, 0, 0, 0, 1229, 1227, 1, 0, 0, 0, 1229, 1230, 1, 0, 0, 0, 1230, 1232, 1, 0, 0, 0, 1231, 1229, 1, 0, 0, 0, 1232, 1238, 5, 133, 0, 0, 1233, 1235, 3, 150, 75, 0, 1234, 1236, 3, 28, 14, 0, 1235, 1234, 1, 0, 0, 0, 1235, 1236, 1, 0, 0, 0, 1236, 1238, 1, 0, 0, 0, 1237, 1191, 1, 0, 0, 0, 1237, 1192, 1, 0, 0, 0, 1237, 1193, 1, 0, 0, 0, 1237, 1194, 1, 0, 0, 0, 1237, 1196, 1, 0, 0, 0, 1237, 1201, 1, 0, 0, 0, 1237, 1209, 1, 0, 0, 0, 1237, 1214, 1, 0, 0, 0, 1237, 1219, 1, 0, 0, 0, 1237, 1224, 1, 0, 0, 0, 1237, 1233, 1, 0, 0, 0, 1238, 135, 1, 0, 0, 0, 1239, 1240, 3, 150, 75, 0, 1240, 1241, 5, 128, 0, 0, 1241, 1242, 3, 134, 67, 0, 1242, 1243, 5, 129, 0, 0, 1243, 137, 1, 0, 0, 0, 1244, 1245, 7, 6, 0, 0, 1245, 139, 1, 0, 0, 0, 1246, 1247, 7, 7, 0, 0, 1247, 141, 1, 0, 0, 0, 1248, 1257, 3, 152, 76, 0, 1249, 1257, 5, 142, 0, 0, 1250, 1257, 5, 143, 0, 0, 1251, 1257, 5, 124, 0, 0, 1252, 1257, 5, 125, 0, 0, 1253, 1257, 5, 126, 0, 0, 1254, 1257, 3, 144, 72, 0, 1255, 1257, 3, 148, 74, 0, 1256, 1248, 1, 0, 0, 0, 1256, 1249, 1, 0, 0, 0, 1256, 1250, 1, 0, 0, 0, 1256, 1251, 1, 0, 0, 0, 1256, 1252, 1, 0, 0, 0, 1256, 1253, 1, 0, 0, 0, 1256, 1254, 1, 0, 0, 0, 1256, 1255, 1, 0, 0, 0, 1257, 143, 1, 0, 0, 0, 1258, 1267, 5, 132, 0, 0, 1259, 1264, 3, 146, 73, 0, 1260, 1261, 5, 130, 0, 0, 1261, 1263, 3, 146, 73, 0, 1262, 1260, 1, 0, 0, 0, 1263, 1266, 1, 0, 0, 0, 1264, 1262, 1, 0, 0, 0, 1264, 1265, 1, 0, 0, 0, 1265, 1268, 1, 0, 0, 0, 1266, 1264, 1, 0, 0, 0, 1267, 1259, 1, 0, 0, 0, 1267, 1268, 1, 0, 0, 0, 1268, 1269, 1, 0, 0, 0, 1269, 1270, 5, 133, 0, 0, 1270, 145, 1, 0, 0, 0, 1271, 1272, 3, 152, 76, 0, 1272, 1273, 5, 128, 0, 0, 1273, 1274, 3, 142, 71, 0, 1274, 147, 1, 0, 0, 0, 1275, 1284, 5, 134, 0, 0, 1276, 1281, 3, 142, 71, 0, 1277, 1278, 5, 130, 0, 0, 1278, 1280, 3, 142, 71, 0, 1279, 1277, 1, 0, 0, 0, 1280, 1283, 1, 0, 0, 0, 1281, 1279, 1, 0, 0, 0, 1281, 1282, 1, 0, 0, 0, 1282, 1285, 1, 0, 0, 0, 1283, 1281, 1, 0, 0, 0, 1284, 1276, 1, 0, 0, 0, 1284, 1285, 1, 0, 0, 0, 1285, 1286, 1, 0, 0, 0, 1286, 1287, 5, 135, 0, 0, 1287, 149, 1, 0, 0, 0, 1288, 1289, 7, 8, 0, 0, 1289, 151, 1, 0, 0, 0, 1290, 1291, 5, 145, 0, 0, 1291, 153, 1, 0, 0, 0, 115, 166, 173, 194, 206, 218, 238, 246, 253, 259, 271, 274, 280, 291, 300, 310, 313, 315, 319, 327, 339, 344, 353, 356, 371, 377, 389, 398, 406, 414, 427, 430, 440, 444, 450, 457, 463, 471, 479, 492, 499, 503, 508, 519, 525, 535, 540, 546, 557, 584, 611, 616, 627, 630, 635, 638, 645, 654, 657, 660, 677, 686, 700, 721, 724, 727, 734, 742, 782, 785, 789, 811, 825, 833, 845, 859, 869, 887, 891, 894, 898, 901, 910, 914, 918, 924, 935, 942, 962, 971, 1003, 1023, 1043, 1053, 1056, 1059, 1061, 1075, 1099, 1115, 1124, 1134, 1147, 1162, 1174, 1178, 1187, 1205, 1229, 1235, 1237, 1256, 1264, 1267, 1281, 1284] \ No newline at end of file +[4, 1, 153, 1321, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 171, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 176, 8, 1, 10, 1, 12, 1, 179, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 197, 8, 3, 10, 3, 12, 3, 200, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 212, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 224, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 244, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 252, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 257, 8, 10, 10, 10, 12, 10, 260, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 265, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 275, 8, 10, 10, 10, 12, 10, 278, 9, 10, 3, 10, 280, 8, 10, 1, 10, 1, 10, 5, 10, 284, 8, 10, 10, 10, 12, 10, 287, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 295, 8, 11, 10, 11, 12, 11, 298, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 306, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 314, 8, 12, 10, 12, 12, 12, 317, 9, 12, 3, 12, 319, 8, 12, 3, 12, 321, 8, 12, 1, 13, 1, 13, 3, 13, 325, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 331, 8, 14, 10, 14, 12, 14, 334, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 345, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 350, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 359, 8, 17, 1, 18, 3, 18, 362, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 377, 8, 18, 1, 18, 1, 18, 1, 18, 1, 19, 3, 19, 383, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 393, 8, 19, 10, 19, 12, 19, 396, 9, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 404, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 412, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 420, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 433, 8, 20, 1, 21, 3, 21, 436, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 446, 8, 21, 1, 21, 1, 21, 3, 21, 450, 8, 21, 1, 21, 1, 21, 5, 21, 454, 8, 21, 10, 21, 12, 21, 457, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 463, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 469, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 477, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 485, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 498, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 505, 8, 24, 1, 24, 1, 24, 3, 24, 509, 8, 24, 1, 25, 5, 25, 512, 8, 25, 10, 25, 12, 25, 515, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 525, 8, 25, 1, 25, 1, 25, 5, 25, 529, 8, 25, 10, 25, 12, 25, 532, 9, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 542, 8, 26, 1, 27, 1, 27, 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, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 3, 29, 569, 8, 29, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 575, 8, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 584, 8, 29, 10, 29, 12, 29, 587, 9, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 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, 31, 1, 31, 1, 31, 3, 31, 613, 8, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 640, 8, 31, 1, 32, 1, 32, 1, 32, 3, 32, 645, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 656, 8, 32, 1, 32, 3, 32, 659, 8, 32, 1, 32, 1, 32, 1, 32, 3, 32, 664, 8, 32, 1, 32, 3, 32, 667, 8, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 3, 33, 674, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 683, 8, 33, 1, 33, 3, 33, 686, 8, 33, 1, 33, 3, 33, 689, 8, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 706, 8, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 5, 36, 713, 8, 36, 10, 36, 12, 36, 716, 9, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 729, 8, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 5, 40, 748, 8, 40, 10, 40, 12, 40, 751, 9, 40, 3, 40, 753, 8, 40, 1, 40, 3, 40, 756, 8, 40, 1, 41, 1, 41, 1, 41, 5, 41, 761, 8, 41, 10, 41, 12, 41, 764, 9, 41, 1, 42, 1, 42, 1, 42, 5, 42, 769, 8, 42, 10, 42, 12, 42, 772, 9, 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, 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, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 811, 8, 43, 1, 43, 3, 43, 814, 8, 43, 1, 43, 1, 43, 3, 43, 818, 8, 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, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 840, 8, 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, 854, 8, 43, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 860, 8, 44, 10, 44, 12, 44, 863, 9, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 874, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 888, 8, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 898, 8, 49, 1, 50, 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, 51, 1, 51, 3, 51, 916, 8, 51, 1, 51, 1, 51, 3, 51, 920, 8, 51, 1, 51, 3, 51, 923, 8, 51, 1, 51, 1, 51, 3, 51, 927, 8, 51, 1, 51, 3, 51, 930, 8, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 939, 8, 52, 1, 52, 1, 52, 3, 52, 943, 8, 52, 1, 52, 1, 52, 3, 52, 947, 8, 52, 1, 52, 1, 52, 5, 52, 951, 8, 52, 10, 52, 12, 52, 954, 9, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 964, 8, 53, 1, 54, 1, 54, 1, 54, 5, 54, 969, 8, 54, 10, 54, 12, 54, 972, 9, 54, 1, 54, 1, 54, 1, 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, 1, 55, 1, 55, 3, 55, 991, 8, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 998, 8, 56, 10, 56, 12, 56, 1001, 9, 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, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1032, 8, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 1052, 8, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 3, 62, 1072, 8, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 3, 62, 1082, 8, 62, 1, 62, 3, 62, 1085, 8, 62, 1, 62, 3, 62, 1088, 8, 62, 3, 62, 1090, 8, 62, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 5, 66, 1102, 8, 66, 10, 66, 12, 66, 1105, 9, 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, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1128, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1144, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1153, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1163, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 5, 67, 1174, 8, 67, 10, 67, 12, 67, 1177, 9, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1191, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1203, 8, 67, 1, 67, 1, 67, 3, 67, 1207, 8, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 3, 68, 1216, 8, 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, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1234, 8, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 5, 69, 1256, 8, 69, 10, 69, 12, 69, 1259, 9, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1264, 8, 69, 3, 69, 1266, 8, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1285, 8, 73, 1, 74, 1, 74, 1, 74, 1, 74, 5, 74, 1291, 8, 74, 10, 74, 12, 74, 1294, 9, 74, 3, 74, 1296, 8, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 5, 76, 1308, 8, 76, 10, 76, 12, 76, 1311, 9, 76, 3, 76, 1313, 8, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 0, 0, 79, 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, 0, 9, 2, 0, 15, 15, 33, 33, 1, 0, 11, 12, 1, 0, 101, 105, 3, 0, 1, 1, 96, 100, 102, 103, 3, 0, 1, 1, 96, 97, 102, 103, 2, 0, 98, 100, 102, 103, 1, 0, 121, 128, 1, 0, 108, 111, 7, 0, 1, 8, 10, 33, 45, 45, 74, 74, 94, 95, 106, 106, 149, 149, 1428, 0, 170, 1, 0, 0, 0, 2, 172, 1, 0, 0, 0, 4, 182, 1, 0, 0, 0, 6, 186, 1, 0, 0, 0, 8, 211, 1, 0, 0, 0, 10, 223, 1, 0, 0, 0, 12, 225, 1, 0, 0, 0, 14, 232, 1, 0, 0, 0, 16, 243, 1, 0, 0, 0, 18, 245, 1, 0, 0, 0, 20, 258, 1, 0, 0, 0, 22, 290, 1, 0, 0, 0, 24, 320, 1, 0, 0, 0, 26, 322, 1, 0, 0, 0, 28, 326, 1, 0, 0, 0, 30, 344, 1, 0, 0, 0, 32, 346, 1, 0, 0, 0, 34, 358, 1, 0, 0, 0, 36, 361, 1, 0, 0, 0, 38, 382, 1, 0, 0, 0, 40, 432, 1, 0, 0, 0, 42, 435, 1, 0, 0, 0, 44, 460, 1, 0, 0, 0, 46, 497, 1, 0, 0, 0, 48, 508, 1, 0, 0, 0, 50, 513, 1, 0, 0, 0, 52, 541, 1, 0, 0, 0, 54, 543, 1, 0, 0, 0, 56, 553, 1, 0, 0, 0, 58, 565, 1, 0, 0, 0, 60, 590, 1, 0, 0, 0, 62, 639, 1, 0, 0, 0, 64, 641, 1, 0, 0, 0, 66, 670, 1, 0, 0, 0, 68, 692, 1, 0, 0, 0, 70, 705, 1, 0, 0, 0, 72, 707, 1, 0, 0, 0, 74, 719, 1, 0, 0, 0, 76, 732, 1, 0, 0, 0, 78, 735, 1, 0, 0, 0, 80, 755, 1, 0, 0, 0, 82, 757, 1, 0, 0, 0, 84, 765, 1, 0, 0, 0, 86, 853, 1, 0, 0, 0, 88, 855, 1, 0, 0, 0, 90, 866, 1, 0, 0, 0, 92, 868, 1, 0, 0, 0, 94, 873, 1, 0, 0, 0, 96, 875, 1, 0, 0, 0, 98, 897, 1, 0, 0, 0, 100, 899, 1, 0, 0, 0, 102, 908, 1, 0, 0, 0, 104, 933, 1, 0, 0, 0, 106, 963, 1, 0, 0, 0, 108, 965, 1, 0, 0, 0, 110, 990, 1, 0, 0, 0, 112, 992, 1, 0, 0, 0, 114, 1004, 1, 0, 0, 0, 116, 1011, 1, 0, 0, 0, 118, 1025, 1, 0, 0, 0, 120, 1035, 1, 0, 0, 0, 122, 1051, 1, 0, 0, 0, 124, 1089, 1, 0, 0, 0, 126, 1091, 1, 0, 0, 0, 128, 1094, 1, 0, 0, 0, 130, 1096, 1, 0, 0, 0, 132, 1098, 1, 0, 0, 0, 134, 1206, 1, 0, 0, 0, 136, 1208, 1, 0, 0, 0, 138, 1265, 1, 0, 0, 0, 140, 1267, 1, 0, 0, 0, 142, 1272, 1, 0, 0, 0, 144, 1274, 1, 0, 0, 0, 146, 1284, 1, 0, 0, 0, 148, 1286, 1, 0, 0, 0, 150, 1299, 1, 0, 0, 0, 152, 1303, 1, 0, 0, 0, 154, 1316, 1, 0, 0, 0, 156, 1318, 1, 0, 0, 0, 158, 159, 3, 6, 3, 0, 159, 160, 5, 0, 0, 1, 160, 171, 1, 0, 0, 0, 161, 162, 3, 20, 10, 0, 162, 163, 5, 0, 0, 1, 163, 171, 1, 0, 0, 0, 164, 165, 3, 50, 25, 0, 165, 166, 5, 0, 0, 1, 166, 171, 1, 0, 0, 0, 167, 168, 3, 2, 1, 0, 168, 169, 5, 0, 0, 1, 169, 171, 1, 0, 0, 0, 170, 158, 1, 0, 0, 0, 170, 161, 1, 0, 0, 0, 170, 164, 1, 0, 0, 0, 170, 167, 1, 0, 0, 0, 171, 1, 1, 0, 0, 0, 172, 173, 5, 40, 0, 0, 173, 177, 5, 137, 0, 0, 174, 176, 3, 8, 4, 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, 138, 0, 0, 181, 3, 1, 0, 0, 0, 182, 183, 5, 41, 0, 0, 183, 184, 3, 156, 78, 0, 184, 185, 5, 134, 0, 0, 185, 5, 1, 0, 0, 0, 186, 187, 5, 9, 0, 0, 187, 188, 3, 154, 77, 0, 188, 189, 5, 84, 0, 0, 189, 190, 3, 156, 78, 0, 190, 191, 5, 77, 0, 0, 191, 192, 3, 156, 78, 0, 192, 193, 5, 76, 0, 0, 193, 194, 3, 156, 78, 0, 194, 198, 5, 137, 0, 0, 195, 197, 3, 8, 4, 0, 196, 195, 1, 0, 0, 0, 197, 200, 1, 0, 0, 0, 198, 196, 1, 0, 0, 0, 198, 199, 1, 0, 0, 0, 199, 201, 1, 0, 0, 0, 200, 198, 1, 0, 0, 0, 201, 202, 5, 138, 0, 0, 202, 7, 1, 0, 0, 0, 203, 212, 3, 4, 2, 0, 204, 212, 3, 18, 9, 0, 205, 212, 3, 10, 5, 0, 206, 212, 3, 92, 46, 0, 207, 212, 3, 104, 52, 0, 208, 212, 3, 136, 68, 0, 209, 212, 3, 56, 28, 0, 210, 212, 3, 32, 16, 0, 211, 203, 1, 0, 0, 0, 211, 204, 1, 0, 0, 0, 211, 205, 1, 0, 0, 0, 211, 206, 1, 0, 0, 0, 211, 207, 1, 0, 0, 0, 211, 208, 1, 0, 0, 0, 211, 209, 1, 0, 0, 0, 211, 210, 1, 0, 0, 0, 212, 9, 1, 0, 0, 0, 213, 214, 5, 41, 0, 0, 214, 215, 5, 44, 0, 0, 215, 216, 3, 154, 77, 0, 216, 217, 5, 134, 0, 0, 217, 224, 1, 0, 0, 0, 218, 219, 5, 41, 0, 0, 219, 220, 5, 46, 0, 0, 220, 221, 3, 154, 77, 0, 221, 222, 5, 134, 0, 0, 222, 224, 1, 0, 0, 0, 223, 213, 1, 0, 0, 0, 223, 218, 1, 0, 0, 0, 224, 11, 1, 0, 0, 0, 225, 226, 5, 42, 0, 0, 226, 227, 5, 43, 0, 0, 227, 228, 3, 154, 77, 0, 228, 229, 5, 84, 0, 0, 229, 230, 3, 156, 78, 0, 230, 231, 5, 134, 0, 0, 231, 13, 1, 0, 0, 0, 232, 233, 5, 42, 0, 0, 233, 234, 5, 44, 0, 0, 234, 235, 3, 154, 77, 0, 235, 236, 5, 77, 0, 0, 236, 237, 3, 156, 78, 0, 237, 238, 5, 134, 0, 0, 238, 15, 1, 0, 0, 0, 239, 244, 3, 10, 5, 0, 240, 244, 3, 12, 6, 0, 241, 244, 3, 14, 7, 0, 242, 244, 3, 32, 16, 0, 243, 239, 1, 0, 0, 0, 243, 240, 1, 0, 0, 0, 243, 241, 1, 0, 0, 0, 243, 242, 1, 0, 0, 0, 244, 17, 1, 0, 0, 0, 245, 246, 5, 43, 0, 0, 246, 247, 3, 154, 77, 0, 247, 248, 5, 84, 0, 0, 248, 251, 3, 156, 78, 0, 249, 250, 5, 85, 0, 0, 250, 252, 3, 156, 78, 0, 251, 249, 1, 0, 0, 0, 251, 252, 1, 0, 0, 0, 252, 253, 1, 0, 0, 0, 253, 254, 5, 134, 0, 0, 254, 19, 1, 0, 0, 0, 255, 257, 3, 16, 8, 0, 256, 255, 1, 0, 0, 0, 257, 260, 1, 0, 0, 0, 258, 256, 1, 0, 0, 0, 258, 259, 1, 0, 0, 0, 259, 261, 1, 0, 0, 0, 260, 258, 1, 0, 0, 0, 261, 262, 5, 44, 0, 0, 262, 264, 3, 154, 77, 0, 263, 265, 3, 22, 11, 0, 264, 263, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 266, 1, 0, 0, 0, 266, 267, 5, 84, 0, 0, 267, 268, 3, 156, 78, 0, 268, 269, 5, 77, 0, 0, 269, 279, 3, 156, 78, 0, 270, 271, 5, 89, 0, 0, 271, 276, 3, 26, 13, 0, 272, 273, 5, 135, 0, 0, 273, 275, 3, 26, 13, 0, 274, 272, 1, 0, 0, 0, 275, 278, 1, 0, 0, 0, 276, 274, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 280, 1, 0, 0, 0, 278, 276, 1, 0, 0, 0, 279, 270, 1, 0, 0, 0, 279, 280, 1, 0, 0, 0, 280, 281, 1, 0, 0, 0, 281, 285, 5, 137, 0, 0, 282, 284, 3, 34, 17, 0, 283, 282, 1, 0, 0, 0, 284, 287, 1, 0, 0, 0, 285, 283, 1, 0, 0, 0, 285, 286, 1, 0, 0, 0, 286, 288, 1, 0, 0, 0, 287, 285, 1, 0, 0, 0, 288, 289, 5, 138, 0, 0, 289, 21, 1, 0, 0, 0, 290, 291, 5, 143, 0, 0, 291, 296, 3, 24, 12, 0, 292, 293, 5, 135, 0, 0, 293, 295, 3, 24, 12, 0, 294, 292, 1, 0, 0, 0, 295, 298, 1, 0, 0, 0, 296, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 299, 1, 0, 0, 0, 298, 296, 1, 0, 0, 0, 299, 300, 5, 144, 0, 0, 300, 23, 1, 0, 0, 0, 301, 302, 5, 47, 0, 0, 302, 305, 3, 154, 77, 0, 303, 304, 5, 133, 0, 0, 304, 306, 5, 37, 0, 0, 305, 303, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 321, 1, 0, 0, 0, 307, 308, 5, 36, 0, 0, 308, 318, 3, 154, 77, 0, 309, 310, 5, 38, 0, 0, 310, 315, 3, 26, 13, 0, 311, 312, 5, 145, 0, 0, 312, 314, 3, 26, 13, 0, 313, 311, 1, 0, 0, 0, 314, 317, 1, 0, 0, 0, 315, 313, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 319, 1, 0, 0, 0, 317, 315, 1, 0, 0, 0, 318, 309, 1, 0, 0, 0, 318, 319, 1, 0, 0, 0, 319, 321, 1, 0, 0, 0, 320, 301, 1, 0, 0, 0, 320, 307, 1, 0, 0, 0, 321, 25, 1, 0, 0, 0, 322, 324, 3, 154, 77, 0, 323, 325, 3, 28, 14, 0, 324, 323, 1, 0, 0, 0, 324, 325, 1, 0, 0, 0, 325, 27, 1, 0, 0, 0, 326, 327, 5, 143, 0, 0, 327, 332, 3, 30, 15, 0, 328, 329, 5, 135, 0, 0, 329, 331, 3, 30, 15, 0, 330, 328, 1, 0, 0, 0, 331, 334, 1, 0, 0, 0, 332, 330, 1, 0, 0, 0, 332, 333, 1, 0, 0, 0, 333, 335, 1, 0, 0, 0, 334, 332, 1, 0, 0, 0, 335, 336, 5, 144, 0, 0, 336, 29, 1, 0, 0, 0, 337, 338, 5, 43, 0, 0, 338, 345, 3, 154, 77, 0, 339, 340, 5, 44, 0, 0, 340, 345, 3, 26, 13, 0, 341, 342, 5, 36, 0, 0, 342, 345, 3, 154, 77, 0, 343, 345, 3, 138, 69, 0, 344, 337, 1, 0, 0, 0, 344, 339, 1, 0, 0, 0, 344, 341, 1, 0, 0, 0, 344, 343, 1, 0, 0, 0, 345, 31, 1, 0, 0, 0, 346, 347, 5, 35, 0, 0, 347, 349, 3, 154, 77, 0, 348, 350, 3, 22, 11, 0, 349, 348, 1, 0, 0, 0, 349, 350, 1, 0, 0, 0, 350, 351, 1, 0, 0, 0, 351, 352, 5, 146, 0, 0, 352, 353, 3, 138, 69, 0, 353, 354, 5, 134, 0, 0, 354, 33, 1, 0, 0, 0, 355, 359, 3, 38, 19, 0, 356, 359, 3, 42, 21, 0, 357, 359, 3, 36, 18, 0, 358, 355, 1, 0, 0, 0, 358, 356, 1, 0, 0, 0, 358, 357, 1, 0, 0, 0, 359, 35, 1, 0, 0, 0, 360, 362, 5, 57, 0, 0, 361, 360, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 363, 1, 0, 0, 0, 363, 364, 5, 49, 0, 0, 364, 365, 3, 154, 77, 0, 365, 366, 5, 84, 0, 0, 366, 367, 3, 156, 78, 0, 367, 368, 5, 133, 0, 0, 368, 369, 3, 138, 69, 0, 369, 370, 5, 132, 0, 0, 370, 371, 3, 138, 69, 0, 371, 372, 5, 137, 0, 0, 372, 373, 5, 101, 0, 0, 373, 374, 5, 84, 0, 0, 374, 376, 3, 156, 78, 0, 375, 377, 3, 70, 35, 0, 376, 375, 1, 0, 0, 0, 376, 377, 1, 0, 0, 0, 377, 378, 1, 0, 0, 0, 378, 379, 5, 134, 0, 0, 379, 380, 5, 138, 0, 0, 380, 37, 1, 0, 0, 0, 381, 383, 3, 44, 22, 0, 382, 381, 1, 0, 0, 0, 382, 383, 1, 0, 0, 0, 383, 384, 1, 0, 0, 0, 384, 385, 5, 47, 0, 0, 385, 386, 3, 154, 77, 0, 386, 387, 5, 84, 0, 0, 387, 388, 3, 156, 78, 0, 388, 389, 5, 133, 0, 0, 389, 390, 3, 138, 69, 0, 390, 394, 5, 137, 0, 0, 391, 393, 3, 40, 20, 0, 392, 391, 1, 0, 0, 0, 393, 396, 1, 0, 0, 0, 394, 392, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 397, 1, 0, 0, 0, 396, 394, 1, 0, 0, 0, 397, 398, 5, 138, 0, 0, 398, 39, 1, 0, 0, 0, 399, 400, 5, 91, 0, 0, 400, 401, 5, 84, 0, 0, 401, 403, 3, 156, 78, 0, 402, 404, 3, 70, 35, 0, 403, 402, 1, 0, 0, 0, 403, 404, 1, 0, 0, 0, 404, 405, 1, 0, 0, 0, 405, 406, 5, 134, 0, 0, 406, 433, 1, 0, 0, 0, 407, 408, 5, 92, 0, 0, 408, 409, 5, 84, 0, 0, 409, 411, 3, 156, 78, 0, 410, 412, 3, 70, 35, 0, 411, 410, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 413, 1, 0, 0, 0, 413, 414, 5, 134, 0, 0, 414, 433, 1, 0, 0, 0, 415, 416, 5, 1, 0, 0, 416, 417, 5, 84, 0, 0, 417, 419, 3, 156, 78, 0, 418, 420, 3, 70, 35, 0, 419, 418, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 421, 1, 0, 0, 0, 421, 422, 5, 134, 0, 0, 422, 433, 1, 0, 0, 0, 423, 424, 5, 93, 0, 0, 424, 425, 5, 94, 0, 0, 425, 426, 5, 84, 0, 0, 426, 427, 3, 156, 78, 0, 427, 428, 5, 95, 0, 0, 428, 429, 5, 84, 0, 0, 429, 430, 3, 156, 78, 0, 430, 431, 5, 134, 0, 0, 431, 433, 1, 0, 0, 0, 432, 399, 1, 0, 0, 0, 432, 407, 1, 0, 0, 0, 432, 415, 1, 0, 0, 0, 432, 423, 1, 0, 0, 0, 433, 41, 1, 0, 0, 0, 434, 436, 3, 44, 22, 0, 435, 434, 1, 0, 0, 0, 435, 436, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 438, 5, 48, 0, 0, 438, 439, 3, 154, 77, 0, 439, 440, 5, 84, 0, 0, 440, 441, 3, 156, 78, 0, 441, 442, 5, 133, 0, 0, 442, 443, 3, 144, 72, 0, 443, 445, 3, 48, 24, 0, 444, 446, 5, 112, 0, 0, 445, 444, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 449, 1, 0, 0, 0, 447, 448, 5, 82, 0, 0, 448, 450, 3, 156, 78, 0, 449, 447, 1, 0, 0, 0, 449, 450, 1, 0, 0, 0, 450, 451, 1, 0, 0, 0, 451, 455, 5, 137, 0, 0, 452, 454, 3, 46, 23, 0, 453, 452, 1, 0, 0, 0, 454, 457, 1, 0, 0, 0, 455, 453, 1, 0, 0, 0, 455, 456, 1, 0, 0, 0, 456, 458, 1, 0, 0, 0, 457, 455, 1, 0, 0, 0, 458, 459, 5, 138, 0, 0, 459, 43, 1, 0, 0, 0, 460, 462, 5, 32, 0, 0, 461, 463, 7, 0, 0, 0, 462, 461, 1, 0, 0, 0, 462, 463, 1, 0, 0, 0, 463, 45, 1, 0, 0, 0, 464, 465, 5, 98, 0, 0, 465, 466, 5, 84, 0, 0, 466, 468, 3, 156, 78, 0, 467, 469, 3, 70, 35, 0, 468, 467, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 470, 1, 0, 0, 0, 470, 471, 5, 134, 0, 0, 471, 498, 1, 0, 0, 0, 472, 473, 5, 99, 0, 0, 473, 474, 5, 84, 0, 0, 474, 476, 3, 156, 78, 0, 475, 477, 3, 70, 35, 0, 476, 475, 1, 0, 0, 0, 476, 477, 1, 0, 0, 0, 477, 478, 1, 0, 0, 0, 478, 479, 5, 134, 0, 0, 479, 498, 1, 0, 0, 0, 480, 481, 5, 100, 0, 0, 481, 482, 5, 84, 0, 0, 482, 484, 3, 156, 78, 0, 483, 485, 3, 70, 35, 0, 484, 483, 1, 0, 0, 0, 484, 485, 1, 0, 0, 0, 485, 486, 1, 0, 0, 0, 486, 487, 5, 134, 0, 0, 487, 498, 1, 0, 0, 0, 488, 489, 5, 93, 0, 0, 489, 490, 5, 94, 0, 0, 490, 491, 5, 84, 0, 0, 491, 492, 3, 156, 78, 0, 492, 493, 5, 95, 0, 0, 493, 494, 5, 84, 0, 0, 494, 495, 3, 156, 78, 0, 495, 496, 5, 134, 0, 0, 496, 498, 1, 0, 0, 0, 497, 464, 1, 0, 0, 0, 497, 472, 1, 0, 0, 0, 497, 480, 1, 0, 0, 0, 497, 488, 1, 0, 0, 0, 498, 47, 1, 0, 0, 0, 499, 500, 5, 43, 0, 0, 500, 509, 3, 154, 77, 0, 501, 502, 5, 44, 0, 0, 502, 504, 3, 154, 77, 0, 503, 505, 3, 28, 14, 0, 504, 503, 1, 0, 0, 0, 504, 505, 1, 0, 0, 0, 505, 509, 1, 0, 0, 0, 506, 507, 5, 36, 0, 0, 507, 509, 3, 154, 77, 0, 508, 499, 1, 0, 0, 0, 508, 501, 1, 0, 0, 0, 508, 506, 1, 0, 0, 0, 509, 49, 1, 0, 0, 0, 510, 512, 3, 16, 8, 0, 511, 510, 1, 0, 0, 0, 512, 515, 1, 0, 0, 0, 513, 511, 1, 0, 0, 0, 513, 514, 1, 0, 0, 0, 514, 516, 1, 0, 0, 0, 515, 513, 1, 0, 0, 0, 516, 517, 5, 46, 0, 0, 517, 518, 3, 154, 77, 0, 518, 519, 5, 84, 0, 0, 519, 520, 3, 156, 78, 0, 520, 521, 5, 77, 0, 0, 521, 524, 3, 156, 78, 0, 522, 523, 5, 78, 0, 0, 523, 525, 5, 147, 0, 0, 524, 522, 1, 0, 0, 0, 524, 525, 1, 0, 0, 0, 525, 526, 1, 0, 0, 0, 526, 530, 5, 137, 0, 0, 527, 529, 3, 52, 26, 0, 528, 527, 1, 0, 0, 0, 529, 532, 1, 0, 0, 0, 530, 528, 1, 0, 0, 0, 530, 531, 1, 0, 0, 0, 531, 533, 1, 0, 0, 0, 532, 530, 1, 0, 0, 0, 533, 534, 5, 138, 0, 0, 534, 51, 1, 0, 0, 0, 535, 542, 3, 64, 32, 0, 536, 542, 3, 66, 33, 0, 537, 542, 3, 74, 37, 0, 538, 542, 3, 58, 29, 0, 539, 542, 3, 60, 30, 0, 540, 542, 3, 54, 27, 0, 541, 535, 1, 0, 0, 0, 541, 536, 1, 0, 0, 0, 541, 537, 1, 0, 0, 0, 541, 538, 1, 0, 0, 0, 541, 539, 1, 0, 0, 0, 541, 540, 1, 0, 0, 0, 542, 53, 1, 0, 0, 0, 543, 544, 5, 2, 0, 0, 544, 545, 3, 154, 77, 0, 545, 546, 5, 84, 0, 0, 546, 547, 3, 156, 78, 0, 547, 548, 5, 4, 0, 0, 548, 549, 3, 26, 13, 0, 549, 550, 5, 5, 0, 0, 550, 551, 3, 154, 77, 0, 551, 552, 5, 134, 0, 0, 552, 55, 1, 0, 0, 0, 553, 554, 5, 3, 0, 0, 554, 555, 3, 154, 77, 0, 555, 556, 5, 84, 0, 0, 556, 557, 3, 156, 78, 0, 557, 558, 5, 6, 0, 0, 558, 559, 3, 26, 13, 0, 559, 560, 5, 65, 0, 0, 560, 561, 3, 154, 77, 0, 561, 562, 5, 136, 0, 0, 562, 563, 3, 154, 77, 0, 563, 564, 5, 134, 0, 0, 564, 57, 1, 0, 0, 0, 565, 566, 5, 22, 0, 0, 566, 568, 3, 154, 77, 0, 567, 569, 3, 22, 11, 0, 568, 567, 1, 0, 0, 0, 568, 569, 1, 0, 0, 0, 569, 570, 1, 0, 0, 0, 570, 571, 5, 84, 0, 0, 571, 572, 3, 156, 78, 0, 572, 574, 5, 25, 0, 0, 573, 575, 5, 9, 0, 0, 574, 573, 1, 0, 0, 0, 574, 575, 1, 0, 0, 0, 575, 576, 1, 0, 0, 0, 576, 577, 3, 26, 13, 0, 577, 578, 5, 26, 0, 0, 578, 579, 3, 156, 78, 0, 579, 580, 5, 49, 0, 0, 580, 581, 3, 156, 78, 0, 581, 585, 5, 137, 0, 0, 582, 584, 3, 62, 31, 0, 583, 582, 1, 0, 0, 0, 584, 587, 1, 0, 0, 0, 585, 583, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 588, 1, 0, 0, 0, 587, 585, 1, 0, 0, 0, 588, 589, 5, 138, 0, 0, 589, 59, 1, 0, 0, 0, 590, 591, 5, 22, 0, 0, 591, 592, 3, 154, 77, 0, 592, 593, 5, 84, 0, 0, 593, 594, 3, 156, 78, 0, 594, 595, 5, 24, 0, 0, 595, 596, 3, 154, 77, 0, 596, 597, 3, 28, 14, 0, 597, 598, 5, 134, 0, 0, 598, 61, 1, 0, 0, 0, 599, 600, 5, 16, 0, 0, 600, 640, 5, 134, 0, 0, 601, 602, 5, 17, 0, 0, 602, 603, 5, 18, 0, 0, 603, 604, 3, 154, 77, 0, 604, 605, 5, 134, 0, 0, 605, 640, 1, 0, 0, 0, 606, 607, 5, 27, 0, 0, 607, 608, 3, 156, 78, 0, 608, 609, 5, 134, 0, 0, 609, 640, 1, 0, 0, 0, 610, 612, 5, 28, 0, 0, 611, 613, 5, 36, 0, 0, 612, 611, 1, 0, 0, 0, 612, 613, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 615, 3, 154, 77, 0, 615, 616, 5, 55, 0, 0, 616, 617, 3, 26, 13, 0, 617, 618, 5, 134, 0, 0, 618, 640, 1, 0, 0, 0, 619, 620, 5, 29, 0, 0, 620, 621, 3, 154, 77, 0, 621, 622, 5, 147, 0, 0, 622, 623, 5, 134, 0, 0, 623, 640, 1, 0, 0, 0, 624, 625, 5, 30, 0, 0, 625, 626, 3, 26, 13, 0, 626, 627, 5, 136, 0, 0, 627, 628, 3, 154, 77, 0, 628, 629, 3, 154, 77, 0, 629, 630, 3, 156, 78, 0, 630, 631, 5, 134, 0, 0, 631, 640, 1, 0, 0, 0, 632, 633, 5, 93, 0, 0, 633, 640, 5, 134, 0, 0, 634, 635, 5, 31, 0, 0, 635, 636, 5, 147, 0, 0, 636, 637, 3, 156, 78, 0, 637, 638, 5, 134, 0, 0, 638, 640, 1, 0, 0, 0, 639, 599, 1, 0, 0, 0, 639, 601, 1, 0, 0, 0, 639, 606, 1, 0, 0, 0, 639, 610, 1, 0, 0, 0, 639, 619, 1, 0, 0, 0, 639, 624, 1, 0, 0, 0, 639, 632, 1, 0, 0, 0, 639, 634, 1, 0, 0, 0, 640, 63, 1, 0, 0, 0, 641, 642, 5, 49, 0, 0, 642, 644, 3, 154, 77, 0, 643, 645, 3, 22, 11, 0, 644, 643, 1, 0, 0, 0, 644, 645, 1, 0, 0, 0, 645, 646, 1, 0, 0, 0, 646, 647, 5, 84, 0, 0, 647, 648, 3, 156, 78, 0, 648, 649, 5, 133, 0, 0, 649, 650, 3, 138, 69, 0, 650, 651, 5, 132, 0, 0, 651, 652, 3, 138, 69, 0, 652, 653, 5, 86, 0, 0, 653, 655, 3, 78, 39, 0, 654, 656, 3, 70, 35, 0, 655, 654, 1, 0, 0, 0, 655, 656, 1, 0, 0, 0, 656, 658, 1, 0, 0, 0, 657, 659, 3, 76, 38, 0, 658, 657, 1, 0, 0, 0, 658, 659, 1, 0, 0, 0, 659, 660, 1, 0, 0, 0, 660, 661, 5, 88, 0, 0, 661, 663, 3, 80, 40, 0, 662, 664, 3, 84, 42, 0, 663, 662, 1, 0, 0, 0, 663, 664, 1, 0, 0, 0, 664, 666, 1, 0, 0, 0, 665, 667, 3, 68, 34, 0, 666, 665, 1, 0, 0, 0, 666, 667, 1, 0, 0, 0, 667, 668, 1, 0, 0, 0, 668, 669, 5, 134, 0, 0, 669, 65, 1, 0, 0, 0, 670, 671, 5, 50, 0, 0, 671, 673, 3, 154, 77, 0, 672, 674, 3, 22, 11, 0, 673, 672, 1, 0, 0, 0, 673, 674, 1, 0, 0, 0, 674, 675, 1, 0, 0, 0, 675, 676, 5, 84, 0, 0, 676, 677, 3, 156, 78, 0, 677, 678, 5, 133, 0, 0, 678, 679, 3, 138, 69, 0, 679, 680, 5, 132, 0, 0, 680, 682, 3, 138, 69, 0, 681, 683, 3, 70, 35, 0, 682, 681, 1, 0, 0, 0, 682, 683, 1, 0, 0, 0, 683, 685, 1, 0, 0, 0, 684, 686, 3, 84, 42, 0, 685, 684, 1, 0, 0, 0, 685, 686, 1, 0, 0, 0, 686, 688, 1, 0, 0, 0, 687, 689, 3, 68, 34, 0, 688, 687, 1, 0, 0, 0, 688, 689, 1, 0, 0, 0, 689, 690, 1, 0, 0, 0, 690, 691, 5, 134, 0, 0, 691, 67, 1, 0, 0, 0, 692, 693, 5, 66, 0, 0, 693, 694, 5, 65, 0, 0, 694, 695, 3, 154, 77, 0, 695, 69, 1, 0, 0, 0, 696, 697, 5, 10, 0, 0, 697, 706, 5, 13, 0, 0, 698, 699, 5, 10, 0, 0, 699, 700, 7, 1, 0, 0, 700, 701, 5, 14, 0, 0, 701, 702, 5, 139, 0, 0, 702, 703, 3, 82, 41, 0, 703, 704, 5, 140, 0, 0, 704, 706, 1, 0, 0, 0, 705, 696, 1, 0, 0, 0, 705, 698, 1, 0, 0, 0, 706, 71, 1, 0, 0, 0, 707, 708, 5, 65, 0, 0, 708, 709, 5, 139, 0, 0, 709, 714, 3, 120, 60, 0, 710, 711, 5, 135, 0, 0, 711, 713, 3, 120, 60, 0, 712, 710, 1, 0, 0, 0, 713, 716, 1, 0, 0, 0, 714, 712, 1, 0, 0, 0, 714, 715, 1, 0, 0, 0, 715, 717, 1, 0, 0, 0, 716, 714, 1, 0, 0, 0, 717, 718, 5, 140, 0, 0, 718, 73, 1, 0, 0, 0, 719, 720, 5, 51, 0, 0, 720, 721, 3, 154, 77, 0, 721, 722, 5, 84, 0, 0, 722, 723, 3, 156, 78, 0, 723, 724, 5, 52, 0, 0, 724, 725, 3, 154, 77, 0, 725, 726, 5, 133, 0, 0, 726, 728, 3, 138, 69, 0, 727, 729, 3, 84, 42, 0, 728, 727, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 1, 0, 0, 0, 730, 731, 5, 134, 0, 0, 731, 75, 1, 0, 0, 0, 732, 733, 5, 87, 0, 0, 733, 734, 3, 138, 69, 0, 734, 77, 1, 0, 0, 0, 735, 736, 7, 2, 0, 0, 736, 79, 1, 0, 0, 0, 737, 756, 5, 90, 0, 0, 738, 739, 5, 43, 0, 0, 739, 756, 3, 154, 77, 0, 740, 741, 5, 36, 0, 0, 741, 756, 3, 154, 77, 0, 742, 743, 5, 45, 0, 0, 743, 752, 5, 139, 0, 0, 744, 749, 3, 26, 13, 0, 745, 746, 5, 135, 0, 0, 746, 748, 3, 26, 13, 0, 747, 745, 1, 0, 0, 0, 748, 751, 1, 0, 0, 0, 749, 747, 1, 0, 0, 0, 749, 750, 1, 0, 0, 0, 750, 753, 1, 0, 0, 0, 751, 749, 1, 0, 0, 0, 752, 744, 1, 0, 0, 0, 752, 753, 1, 0, 0, 0, 753, 754, 1, 0, 0, 0, 754, 756, 5, 140, 0, 0, 755, 737, 1, 0, 0, 0, 755, 738, 1, 0, 0, 0, 755, 740, 1, 0, 0, 0, 755, 742, 1, 0, 0, 0, 756, 81, 1, 0, 0, 0, 757, 762, 3, 154, 77, 0, 758, 759, 5, 135, 0, 0, 759, 761, 3, 154, 77, 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, 83, 1, 0, 0, 0, 764, 762, 1, 0, 0, 0, 765, 766, 5, 89, 0, 0, 766, 770, 5, 137, 0, 0, 767, 769, 3, 86, 43, 0, 768, 767, 1, 0, 0, 0, 769, 772, 1, 0, 0, 0, 770, 768, 1, 0, 0, 0, 770, 771, 1, 0, 0, 0, 771, 773, 1, 0, 0, 0, 772, 770, 1, 0, 0, 0, 773, 774, 5, 138, 0, 0, 774, 85, 1, 0, 0, 0, 775, 776, 5, 23, 0, 0, 776, 777, 3, 154, 77, 0, 777, 778, 5, 84, 0, 0, 778, 779, 3, 156, 78, 0, 779, 780, 5, 139, 0, 0, 780, 781, 3, 82, 41, 0, 781, 782, 5, 140, 0, 0, 782, 783, 5, 134, 0, 0, 783, 854, 1, 0, 0, 0, 784, 785, 5, 61, 0, 0, 785, 786, 3, 154, 77, 0, 786, 787, 5, 84, 0, 0, 787, 788, 3, 156, 78, 0, 788, 789, 5, 133, 0, 0, 789, 790, 3, 138, 69, 0, 790, 791, 3, 88, 44, 0, 791, 792, 5, 134, 0, 0, 792, 854, 1, 0, 0, 0, 793, 794, 5, 62, 0, 0, 794, 795, 3, 154, 77, 0, 795, 796, 5, 84, 0, 0, 796, 797, 3, 156, 78, 0, 797, 798, 5, 133, 0, 0, 798, 799, 3, 144, 72, 0, 799, 800, 3, 48, 24, 0, 800, 801, 3, 88, 44, 0, 801, 802, 5, 134, 0, 0, 802, 854, 1, 0, 0, 0, 803, 804, 5, 44, 0, 0, 804, 805, 3, 154, 77, 0, 805, 806, 5, 84, 0, 0, 806, 807, 3, 156, 78, 0, 807, 808, 5, 133, 0, 0, 808, 810, 3, 154, 77, 0, 809, 811, 3, 28, 14, 0, 810, 809, 1, 0, 0, 0, 810, 811, 1, 0, 0, 0, 811, 813, 1, 0, 0, 0, 812, 814, 3, 72, 36, 0, 813, 812, 1, 0, 0, 0, 813, 814, 1, 0, 0, 0, 814, 817, 1, 0, 0, 0, 815, 816, 5, 18, 0, 0, 816, 818, 5, 53, 0, 0, 817, 815, 1, 0, 0, 0, 817, 818, 1, 0, 0, 0, 818, 819, 1, 0, 0, 0, 819, 820, 5, 134, 0, 0, 820, 854, 1, 0, 0, 0, 821, 822, 5, 7, 0, 0, 822, 823, 3, 154, 77, 0, 823, 824, 5, 84, 0, 0, 824, 825, 3, 156, 78, 0, 825, 826, 5, 133, 0, 0, 826, 827, 3, 154, 77, 0, 827, 828, 5, 53, 0, 0, 828, 829, 3, 138, 69, 0, 829, 830, 5, 134, 0, 0, 830, 854, 1, 0, 0, 0, 831, 832, 5, 51, 0, 0, 832, 833, 3, 154, 77, 0, 833, 834, 5, 84, 0, 0, 834, 835, 3, 156, 78, 0, 835, 836, 5, 133, 0, 0, 836, 839, 3, 154, 77, 0, 837, 838, 5, 53, 0, 0, 838, 840, 3, 138, 69, 0, 839, 837, 1, 0, 0, 0, 839, 840, 1, 0, 0, 0, 840, 841, 1, 0, 0, 0, 841, 842, 5, 134, 0, 0, 842, 854, 1, 0, 0, 0, 843, 844, 5, 22, 0, 0, 844, 845, 3, 154, 77, 0, 845, 846, 5, 84, 0, 0, 846, 847, 3, 156, 78, 0, 847, 848, 5, 133, 0, 0, 848, 849, 3, 154, 77, 0, 849, 850, 5, 136, 0, 0, 850, 851, 3, 154, 77, 0, 851, 852, 5, 134, 0, 0, 852, 854, 1, 0, 0, 0, 853, 775, 1, 0, 0, 0, 853, 784, 1, 0, 0, 0, 853, 793, 1, 0, 0, 0, 853, 803, 1, 0, 0, 0, 853, 821, 1, 0, 0, 0, 853, 831, 1, 0, 0, 0, 853, 843, 1, 0, 0, 0, 854, 87, 1, 0, 0, 0, 855, 856, 5, 139, 0, 0, 856, 861, 3, 90, 45, 0, 857, 858, 5, 135, 0, 0, 858, 860, 3, 90, 45, 0, 859, 857, 1, 0, 0, 0, 860, 863, 1, 0, 0, 0, 861, 859, 1, 0, 0, 0, 861, 862, 1, 0, 0, 0, 862, 864, 1, 0, 0, 0, 863, 861, 1, 0, 0, 0, 864, 865, 5, 140, 0, 0, 865, 89, 1, 0, 0, 0, 866, 867, 7, 3, 0, 0, 867, 91, 1, 0, 0, 0, 868, 869, 5, 60, 0, 0, 869, 870, 3, 94, 47, 0, 870, 93, 1, 0, 0, 0, 871, 874, 3, 96, 48, 0, 872, 874, 3, 100, 50, 0, 873, 871, 1, 0, 0, 0, 873, 872, 1, 0, 0, 0, 874, 95, 1, 0, 0, 0, 875, 876, 5, 61, 0, 0, 876, 877, 3, 154, 77, 0, 877, 878, 5, 84, 0, 0, 878, 879, 3, 156, 78, 0, 879, 880, 5, 71, 0, 0, 880, 881, 3, 154, 77, 0, 881, 882, 5, 133, 0, 0, 882, 883, 3, 138, 69, 0, 883, 884, 5, 72, 0, 0, 884, 887, 3, 98, 49, 0, 885, 886, 5, 73, 0, 0, 886, 888, 3, 146, 73, 0, 887, 885, 1, 0, 0, 0, 887, 888, 1, 0, 0, 0, 888, 889, 1, 0, 0, 0, 889, 890, 5, 134, 0, 0, 890, 97, 1, 0, 0, 0, 891, 898, 5, 106, 0, 0, 892, 893, 5, 107, 0, 0, 893, 894, 5, 141, 0, 0, 894, 895, 3, 138, 69, 0, 895, 896, 5, 142, 0, 0, 896, 898, 1, 0, 0, 0, 897, 891, 1, 0, 0, 0, 897, 892, 1, 0, 0, 0, 898, 99, 1, 0, 0, 0, 899, 900, 5, 62, 0, 0, 900, 901, 3, 154, 77, 0, 901, 902, 5, 84, 0, 0, 902, 903, 3, 156, 78, 0, 903, 904, 5, 137, 0, 0, 904, 905, 3, 102, 51, 0, 905, 906, 3, 102, 51, 0, 906, 907, 5, 138, 0, 0, 907, 101, 1, 0, 0, 0, 908, 909, 3, 48, 24, 0, 909, 910, 5, 63, 0, 0, 910, 911, 3, 154, 77, 0, 911, 912, 5, 84, 0, 0, 912, 913, 3, 156, 78, 0, 913, 915, 3, 144, 72, 0, 914, 916, 5, 112, 0, 0, 915, 914, 1, 0, 0, 0, 915, 916, 1, 0, 0, 0, 916, 919, 1, 0, 0, 0, 917, 918, 5, 79, 0, 0, 918, 920, 3, 156, 78, 0, 919, 917, 1, 0, 0, 0, 919, 920, 1, 0, 0, 0, 920, 922, 1, 0, 0, 0, 921, 923, 5, 81, 0, 0, 922, 921, 1, 0, 0, 0, 922, 923, 1, 0, 0, 0, 923, 926, 1, 0, 0, 0, 924, 925, 5, 82, 0, 0, 925, 927, 3, 156, 78, 0, 926, 924, 1, 0, 0, 0, 926, 927, 1, 0, 0, 0, 927, 929, 1, 0, 0, 0, 928, 930, 5, 83, 0, 0, 929, 928, 1, 0, 0, 0, 929, 930, 1, 0, 0, 0, 930, 931, 1, 0, 0, 0, 931, 932, 5, 134, 0, 0, 932, 103, 1, 0, 0, 0, 933, 934, 5, 54, 0, 0, 934, 935, 3, 154, 77, 0, 935, 936, 5, 55, 0, 0, 936, 938, 3, 154, 77, 0, 937, 939, 3, 28, 14, 0, 938, 937, 1, 0, 0, 0, 938, 939, 1, 0, 0, 0, 939, 942, 1, 0, 0, 0, 940, 941, 5, 84, 0, 0, 941, 943, 3, 156, 78, 0, 942, 940, 1, 0, 0, 0, 942, 943, 1, 0, 0, 0, 943, 946, 1, 0, 0, 0, 944, 945, 5, 78, 0, 0, 945, 947, 5, 147, 0, 0, 946, 944, 1, 0, 0, 0, 946, 947, 1, 0, 0, 0, 947, 948, 1, 0, 0, 0, 948, 952, 5, 137, 0, 0, 949, 951, 3, 106, 53, 0, 950, 949, 1, 0, 0, 0, 951, 954, 1, 0, 0, 0, 952, 950, 1, 0, 0, 0, 952, 953, 1, 0, 0, 0, 953, 955, 1, 0, 0, 0, 954, 952, 1, 0, 0, 0, 955, 956, 5, 138, 0, 0, 956, 105, 1, 0, 0, 0, 957, 958, 5, 59, 0, 0, 958, 964, 3, 94, 47, 0, 959, 964, 3, 118, 59, 0, 960, 964, 3, 114, 57, 0, 961, 964, 3, 108, 54, 0, 962, 964, 3, 116, 58, 0, 963, 957, 1, 0, 0, 0, 963, 959, 1, 0, 0, 0, 963, 960, 1, 0, 0, 0, 963, 961, 1, 0, 0, 0, 963, 962, 1, 0, 0, 0, 964, 107, 1, 0, 0, 0, 965, 966, 5, 8, 0, 0, 966, 970, 5, 137, 0, 0, 967, 969, 3, 110, 55, 0, 968, 967, 1, 0, 0, 0, 969, 972, 1, 0, 0, 0, 970, 968, 1, 0, 0, 0, 970, 971, 1, 0, 0, 0, 971, 973, 1, 0, 0, 0, 972, 970, 1, 0, 0, 0, 973, 974, 5, 138, 0, 0, 974, 975, 5, 134, 0, 0, 975, 109, 1, 0, 0, 0, 976, 977, 3, 154, 77, 0, 977, 978, 5, 58, 0, 0, 978, 979, 5, 61, 0, 0, 979, 980, 3, 154, 77, 0, 980, 981, 5, 134, 0, 0, 981, 991, 1, 0, 0, 0, 982, 983, 3, 154, 77, 0, 983, 984, 5, 58, 0, 0, 984, 985, 5, 62, 0, 0, 985, 986, 3, 154, 77, 0, 986, 987, 5, 136, 0, 0, 987, 988, 3, 154, 77, 0, 988, 989, 5, 134, 0, 0, 989, 991, 1, 0, 0, 0, 990, 976, 1, 0, 0, 0, 990, 982, 1, 0, 0, 0, 991, 111, 1, 0, 0, 0, 992, 993, 3, 26, 13, 0, 993, 994, 5, 18, 0, 0, 994, 999, 5, 53, 0, 0, 995, 996, 5, 136, 0, 0, 996, 998, 3, 154, 77, 0, 997, 995, 1, 0, 0, 0, 998, 1001, 1, 0, 0, 0, 999, 997, 1, 0, 0, 0, 999, 1000, 1, 0, 0, 0, 1000, 1002, 1, 0, 0, 0, 1001, 999, 1, 0, 0, 0, 1002, 1003, 5, 134, 0, 0, 1003, 113, 1, 0, 0, 0, 1004, 1005, 5, 56, 0, 0, 1005, 1006, 3, 154, 77, 0, 1006, 1007, 5, 58, 0, 0, 1007, 1008, 5, 61, 0, 0, 1008, 1009, 3, 154, 77, 0, 1009, 1010, 5, 134, 0, 0, 1010, 115, 1, 0, 0, 0, 1011, 1012, 5, 68, 0, 0, 1012, 1013, 3, 154, 77, 0, 1013, 1014, 5, 69, 0, 0, 1014, 1015, 5, 70, 0, 0, 1015, 1016, 5, 65, 0, 0, 1016, 1017, 5, 51, 0, 0, 1017, 1018, 3, 154, 77, 0, 1018, 1019, 5, 67, 0, 0, 1019, 1020, 5, 62, 0, 0, 1020, 1021, 3, 154, 77, 0, 1021, 1022, 5, 136, 0, 0, 1022, 1023, 3, 154, 77, 0, 1023, 1024, 5, 134, 0, 0, 1024, 117, 1, 0, 0, 0, 1025, 1026, 5, 56, 0, 0, 1026, 1027, 3, 120, 60, 0, 1027, 1028, 5, 58, 0, 0, 1028, 1031, 3, 124, 62, 0, 1029, 1030, 5, 34, 0, 0, 1030, 1032, 3, 156, 78, 0, 1031, 1029, 1, 0, 0, 0, 1031, 1032, 1, 0, 0, 0, 1032, 1033, 1, 0, 0, 0, 1033, 1034, 5, 134, 0, 0, 1034, 119, 1, 0, 0, 0, 1035, 1036, 3, 154, 77, 0, 1036, 1037, 5, 136, 0, 0, 1037, 1038, 3, 122, 61, 0, 1038, 121, 1, 0, 0, 0, 1039, 1052, 3, 154, 77, 0, 1040, 1052, 5, 101, 0, 0, 1041, 1052, 5, 91, 0, 0, 1042, 1052, 5, 92, 0, 0, 1043, 1052, 5, 1, 0, 0, 1044, 1052, 5, 98, 0, 0, 1045, 1052, 5, 99, 0, 0, 1046, 1052, 5, 100, 0, 0, 1047, 1052, 5, 102, 0, 0, 1048, 1052, 5, 103, 0, 0, 1049, 1052, 5, 104, 0, 0, 1050, 1052, 5, 105, 0, 0, 1051, 1039, 1, 0, 0, 0, 1051, 1040, 1, 0, 0, 0, 1051, 1041, 1, 0, 0, 0, 1051, 1042, 1, 0, 0, 0, 1051, 1043, 1, 0, 0, 0, 1051, 1044, 1, 0, 0, 0, 1051, 1045, 1, 0, 0, 0, 1051, 1046, 1, 0, 0, 0, 1051, 1047, 1, 0, 0, 0, 1051, 1048, 1, 0, 0, 0, 1051, 1049, 1, 0, 0, 0, 1051, 1050, 1, 0, 0, 0, 1052, 123, 1, 0, 0, 0, 1053, 1054, 5, 80, 0, 0, 1054, 1055, 5, 136, 0, 0, 1055, 1090, 3, 154, 77, 0, 1056, 1057, 5, 61, 0, 0, 1057, 1058, 3, 154, 77, 0, 1058, 1059, 5, 136, 0, 0, 1059, 1060, 3, 128, 64, 0, 1060, 1090, 1, 0, 0, 0, 1061, 1062, 5, 62, 0, 0, 1062, 1063, 3, 154, 77, 0, 1063, 1064, 5, 136, 0, 0, 1064, 1065, 3, 154, 77, 0, 1065, 1066, 5, 136, 0, 0, 1066, 1067, 3, 130, 65, 0, 1067, 1090, 1, 0, 0, 0, 1068, 1069, 5, 44, 0, 0, 1069, 1071, 3, 154, 77, 0, 1070, 1072, 3, 28, 14, 0, 1071, 1070, 1, 0, 0, 0, 1071, 1072, 1, 0, 0, 0, 1072, 1073, 1, 0, 0, 0, 1073, 1074, 5, 136, 0, 0, 1074, 1075, 3, 120, 60, 0, 1075, 1090, 1, 0, 0, 0, 1076, 1077, 5, 46, 0, 0, 1077, 1078, 3, 154, 77, 0, 1078, 1079, 5, 136, 0, 0, 1079, 1081, 3, 154, 77, 0, 1080, 1082, 3, 28, 14, 0, 1081, 1080, 1, 0, 0, 0, 1081, 1082, 1, 0, 0, 0, 1082, 1084, 1, 0, 0, 0, 1083, 1085, 3, 132, 66, 0, 1084, 1083, 1, 0, 0, 0, 1084, 1085, 1, 0, 0, 0, 1085, 1087, 1, 0, 0, 0, 1086, 1088, 3, 126, 63, 0, 1087, 1086, 1, 0, 0, 0, 1087, 1088, 1, 0, 0, 0, 1088, 1090, 1, 0, 0, 0, 1089, 1053, 1, 0, 0, 0, 1089, 1056, 1, 0, 0, 0, 1089, 1061, 1, 0, 0, 0, 1089, 1068, 1, 0, 0, 0, 1089, 1076, 1, 0, 0, 0, 1090, 125, 1, 0, 0, 0, 1091, 1092, 5, 66, 0, 0, 1092, 1093, 3, 132, 66, 0, 1093, 127, 1, 0, 0, 0, 1094, 1095, 7, 4, 0, 0, 1095, 129, 1, 0, 0, 0, 1096, 1097, 7, 5, 0, 0, 1097, 131, 1, 0, 0, 0, 1098, 1099, 5, 64, 0, 0, 1099, 1103, 5, 137, 0, 0, 1100, 1102, 3, 134, 67, 0, 1101, 1100, 1, 0, 0, 0, 1102, 1105, 1, 0, 0, 0, 1103, 1101, 1, 0, 0, 0, 1103, 1104, 1, 0, 0, 0, 1104, 1106, 1, 0, 0, 0, 1105, 1103, 1, 0, 0, 0, 1106, 1107, 5, 138, 0, 0, 1107, 133, 1, 0, 0, 0, 1108, 1109, 3, 154, 77, 0, 1109, 1110, 5, 58, 0, 0, 1110, 1111, 5, 9, 0, 0, 1111, 1112, 5, 23, 0, 0, 1112, 1113, 5, 139, 0, 0, 1113, 1114, 3, 82, 41, 0, 1114, 1115, 5, 140, 0, 0, 1115, 1116, 5, 134, 0, 0, 1116, 1207, 1, 0, 0, 0, 1117, 1118, 3, 154, 77, 0, 1118, 1119, 5, 58, 0, 0, 1119, 1120, 5, 61, 0, 0, 1120, 1127, 3, 154, 77, 0, 1121, 1122, 5, 67, 0, 0, 1122, 1123, 5, 62, 0, 0, 1123, 1124, 3, 154, 77, 0, 1124, 1125, 5, 136, 0, 0, 1125, 1126, 3, 154, 77, 0, 1126, 1128, 1, 0, 0, 0, 1127, 1121, 1, 0, 0, 0, 1127, 1128, 1, 0, 0, 0, 1128, 1129, 1, 0, 0, 0, 1129, 1130, 5, 134, 0, 0, 1130, 1207, 1, 0, 0, 0, 1131, 1132, 3, 154, 77, 0, 1132, 1133, 5, 58, 0, 0, 1133, 1134, 5, 62, 0, 0, 1134, 1135, 3, 154, 77, 0, 1135, 1136, 5, 136, 0, 0, 1136, 1143, 3, 154, 77, 0, 1137, 1138, 5, 67, 0, 0, 1138, 1139, 5, 62, 0, 0, 1139, 1140, 3, 154, 77, 0, 1140, 1141, 5, 136, 0, 0, 1141, 1142, 3, 154, 77, 0, 1142, 1144, 1, 0, 0, 0, 1143, 1137, 1, 0, 0, 0, 1143, 1144, 1, 0, 0, 0, 1144, 1145, 1, 0, 0, 0, 1145, 1146, 5, 134, 0, 0, 1146, 1207, 1, 0, 0, 0, 1147, 1148, 3, 154, 77, 0, 1148, 1149, 5, 58, 0, 0, 1149, 1150, 5, 44, 0, 0, 1150, 1152, 3, 154, 77, 0, 1151, 1153, 3, 28, 14, 0, 1152, 1151, 1, 0, 0, 0, 1152, 1153, 1, 0, 0, 0, 1153, 1162, 1, 0, 0, 0, 1154, 1155, 5, 67, 0, 0, 1155, 1156, 5, 62, 0, 0, 1156, 1157, 3, 154, 77, 0, 1157, 1158, 5, 136, 0, 0, 1158, 1159, 3, 154, 77, 0, 1159, 1163, 1, 0, 0, 0, 1160, 1161, 5, 18, 0, 0, 1161, 1163, 5, 53, 0, 0, 1162, 1154, 1, 0, 0, 0, 1162, 1160, 1, 0, 0, 0, 1162, 1163, 1, 0, 0, 0, 1163, 1164, 1, 0, 0, 0, 1164, 1165, 5, 134, 0, 0, 1165, 1207, 1, 0, 0, 0, 1166, 1167, 3, 154, 77, 0, 1167, 1168, 5, 58, 0, 0, 1168, 1169, 5, 7, 0, 0, 1169, 1170, 3, 154, 77, 0, 1170, 1171, 5, 64, 0, 0, 1171, 1175, 5, 137, 0, 0, 1172, 1174, 3, 112, 56, 0, 1173, 1172, 1, 0, 0, 0, 1174, 1177, 1, 0, 0, 0, 1175, 1173, 1, 0, 0, 0, 1175, 1176, 1, 0, 0, 0, 1176, 1178, 1, 0, 0, 0, 1177, 1175, 1, 0, 0, 0, 1178, 1179, 5, 138, 0, 0, 1179, 1180, 5, 134, 0, 0, 1180, 1207, 1, 0, 0, 0, 1181, 1182, 3, 154, 77, 0, 1182, 1183, 5, 58, 0, 0, 1183, 1184, 5, 51, 0, 0, 1184, 1185, 3, 154, 77, 0, 1185, 1186, 5, 134, 0, 0, 1186, 1207, 1, 0, 0, 0, 1187, 1188, 3, 154, 77, 0, 1188, 1190, 5, 58, 0, 0, 1189, 1191, 5, 9, 0, 0, 1190, 1189, 1, 0, 0, 0, 1190, 1191, 1, 0, 0, 0, 1191, 1192, 1, 0, 0, 0, 1192, 1193, 5, 22, 0, 0, 1193, 1194, 3, 154, 77, 0, 1194, 1195, 5, 136, 0, 0, 1195, 1202, 3, 154, 77, 0, 1196, 1197, 5, 67, 0, 0, 1197, 1198, 5, 62, 0, 0, 1198, 1199, 3, 154, 77, 0, 1199, 1200, 5, 136, 0, 0, 1200, 1201, 3, 154, 77, 0, 1201, 1203, 1, 0, 0, 0, 1202, 1196, 1, 0, 0, 0, 1202, 1203, 1, 0, 0, 0, 1203, 1204, 1, 0, 0, 0, 1204, 1205, 5, 134, 0, 0, 1205, 1207, 1, 0, 0, 0, 1206, 1108, 1, 0, 0, 0, 1206, 1117, 1, 0, 0, 0, 1206, 1131, 1, 0, 0, 0, 1206, 1147, 1, 0, 0, 0, 1206, 1166, 1, 0, 0, 0, 1206, 1181, 1, 0, 0, 0, 1206, 1187, 1, 0, 0, 0, 1207, 135, 1, 0, 0, 0, 1208, 1209, 5, 51, 0, 0, 1209, 1210, 3, 154, 77, 0, 1210, 1211, 5, 58, 0, 0, 1211, 1212, 3, 154, 77, 0, 1212, 1213, 5, 136, 0, 0, 1213, 1215, 3, 154, 77, 0, 1214, 1216, 3, 132, 66, 0, 1215, 1214, 1, 0, 0, 0, 1215, 1216, 1, 0, 0, 0, 1216, 1217, 1, 0, 0, 0, 1217, 1218, 5, 134, 0, 0, 1218, 137, 1, 0, 0, 0, 1219, 1266, 3, 142, 71, 0, 1220, 1266, 5, 113, 0, 0, 1221, 1266, 5, 114, 0, 0, 1222, 1223, 5, 115, 0, 0, 1223, 1266, 3, 156, 78, 0, 1224, 1225, 5, 116, 0, 0, 1225, 1226, 5, 143, 0, 0, 1226, 1227, 3, 154, 77, 0, 1227, 1228, 5, 144, 0, 0, 1228, 1266, 1, 0, 0, 0, 1229, 1230, 5, 117, 0, 0, 1230, 1231, 5, 143, 0, 0, 1231, 1233, 3, 154, 77, 0, 1232, 1234, 3, 28, 14, 0, 1233, 1232, 1, 0, 0, 0, 1233, 1234, 1, 0, 0, 0, 1234, 1235, 1, 0, 0, 0, 1235, 1236, 5, 144, 0, 0, 1236, 1266, 1, 0, 0, 0, 1237, 1238, 5, 39, 0, 0, 1238, 1239, 5, 143, 0, 0, 1239, 1240, 3, 154, 77, 0, 1240, 1241, 5, 144, 0, 0, 1241, 1266, 1, 0, 0, 0, 1242, 1243, 5, 118, 0, 0, 1243, 1244, 5, 143, 0, 0, 1244, 1245, 3, 138, 69, 0, 1245, 1246, 5, 144, 0, 0, 1246, 1266, 1, 0, 0, 0, 1247, 1248, 5, 119, 0, 0, 1248, 1249, 5, 143, 0, 0, 1249, 1250, 3, 138, 69, 0, 1250, 1251, 5, 144, 0, 0, 1251, 1266, 1, 0, 0, 0, 1252, 1253, 5, 120, 0, 0, 1253, 1257, 5, 137, 0, 0, 1254, 1256, 3, 140, 70, 0, 1255, 1254, 1, 0, 0, 0, 1256, 1259, 1, 0, 0, 0, 1257, 1255, 1, 0, 0, 0, 1257, 1258, 1, 0, 0, 0, 1258, 1260, 1, 0, 0, 0, 1259, 1257, 1, 0, 0, 0, 1260, 1266, 5, 138, 0, 0, 1261, 1263, 3, 154, 77, 0, 1262, 1264, 3, 28, 14, 0, 1263, 1262, 1, 0, 0, 0, 1263, 1264, 1, 0, 0, 0, 1264, 1266, 1, 0, 0, 0, 1265, 1219, 1, 0, 0, 0, 1265, 1220, 1, 0, 0, 0, 1265, 1221, 1, 0, 0, 0, 1265, 1222, 1, 0, 0, 0, 1265, 1224, 1, 0, 0, 0, 1265, 1229, 1, 0, 0, 0, 1265, 1237, 1, 0, 0, 0, 1265, 1242, 1, 0, 0, 0, 1265, 1247, 1, 0, 0, 0, 1265, 1252, 1, 0, 0, 0, 1265, 1261, 1, 0, 0, 0, 1266, 139, 1, 0, 0, 0, 1267, 1268, 3, 154, 77, 0, 1268, 1269, 5, 133, 0, 0, 1269, 1270, 3, 138, 69, 0, 1270, 1271, 5, 134, 0, 0, 1271, 141, 1, 0, 0, 0, 1272, 1273, 7, 6, 0, 0, 1273, 143, 1, 0, 0, 0, 1274, 1275, 7, 7, 0, 0, 1275, 145, 1, 0, 0, 0, 1276, 1285, 3, 156, 78, 0, 1277, 1285, 5, 147, 0, 0, 1278, 1285, 5, 148, 0, 0, 1279, 1285, 5, 129, 0, 0, 1280, 1285, 5, 130, 0, 0, 1281, 1285, 5, 131, 0, 0, 1282, 1285, 3, 148, 74, 0, 1283, 1285, 3, 152, 76, 0, 1284, 1276, 1, 0, 0, 0, 1284, 1277, 1, 0, 0, 0, 1284, 1278, 1, 0, 0, 0, 1284, 1279, 1, 0, 0, 0, 1284, 1280, 1, 0, 0, 0, 1284, 1281, 1, 0, 0, 0, 1284, 1282, 1, 0, 0, 0, 1284, 1283, 1, 0, 0, 0, 1285, 147, 1, 0, 0, 0, 1286, 1295, 5, 137, 0, 0, 1287, 1292, 3, 150, 75, 0, 1288, 1289, 5, 135, 0, 0, 1289, 1291, 3, 150, 75, 0, 1290, 1288, 1, 0, 0, 0, 1291, 1294, 1, 0, 0, 0, 1292, 1290, 1, 0, 0, 0, 1292, 1293, 1, 0, 0, 0, 1293, 1296, 1, 0, 0, 0, 1294, 1292, 1, 0, 0, 0, 1295, 1287, 1, 0, 0, 0, 1295, 1296, 1, 0, 0, 0, 1296, 1297, 1, 0, 0, 0, 1297, 1298, 5, 138, 0, 0, 1298, 149, 1, 0, 0, 0, 1299, 1300, 3, 156, 78, 0, 1300, 1301, 5, 133, 0, 0, 1301, 1302, 3, 146, 73, 0, 1302, 151, 1, 0, 0, 0, 1303, 1312, 5, 139, 0, 0, 1304, 1309, 3, 146, 73, 0, 1305, 1306, 5, 135, 0, 0, 1306, 1308, 3, 146, 73, 0, 1307, 1305, 1, 0, 0, 0, 1308, 1311, 1, 0, 0, 0, 1309, 1307, 1, 0, 0, 0, 1309, 1310, 1, 0, 0, 0, 1310, 1313, 1, 0, 0, 0, 1311, 1309, 1, 0, 0, 0, 1312, 1304, 1, 0, 0, 0, 1312, 1313, 1, 0, 0, 0, 1313, 1314, 1, 0, 0, 0, 1314, 1315, 5, 140, 0, 0, 1315, 153, 1, 0, 0, 0, 1316, 1317, 7, 8, 0, 0, 1317, 155, 1, 0, 0, 0, 1318, 1319, 5, 150, 0, 0, 1319, 157, 1, 0, 0, 0, 115, 170, 177, 198, 211, 223, 243, 251, 258, 264, 276, 279, 285, 296, 305, 315, 318, 320, 324, 332, 344, 349, 358, 361, 376, 382, 394, 403, 411, 419, 432, 435, 445, 449, 455, 462, 468, 476, 484, 497, 504, 508, 513, 524, 530, 541, 568, 574, 585, 612, 639, 644, 655, 658, 663, 666, 673, 682, 685, 688, 705, 714, 728, 749, 752, 755, 762, 770, 810, 813, 817, 839, 853, 861, 873, 887, 897, 915, 919, 922, 926, 929, 938, 942, 946, 952, 963, 970, 990, 999, 1031, 1051, 1071, 1081, 1084, 1087, 1089, 1103, 1127, 1143, 1152, 1162, 1175, 1190, 1202, 1206, 1215, 1233, 1257, 1263, 1265, 1284, 1292, 1295, 1309, 1312] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapability.tokens b/src/capability-language/generated/QuixosCapability.tokens index 56aff23..f1baa32 100644 --- a/src/capability-language/generated/QuixosCapability.tokens +++ b/src/capability-language/generated/QuixosCapability.tokens @@ -1,289 +1,299 @@ EDIT=1 -CREATION=2 -INITIALIZE=3 -WORKSPACE=4 -EXECUTION=5 -SNAPSHOT=6 -TRANSACTION=7 -REMOTE=8 -TARGETS=9 -PORTABLE=10 -REPLICA=11 -LOCAL=12 -FROM=13 -RESULT_BYTES=14 -RPC_CALLS=15 -DEADLINE_MS=16 -QUERY=17 -REFLECTION=18 -SPECIALIZE=19 -ROOT=20 -DOCUMENT=21 -FRAGMENTS=22 -VIEW=23 -MAX=24 -ALLOW=25 -POLL=26 -QUERYABLE=27 -RPC=28 -QUERY_REASON=29 -TYPE=30 -OBJECT=31 -STORABLE=32 -IMPLEMENTS=33 -REF=34 -FRAGMENT=35 -IMPORT=36 -EXTERNAL=37 -ATOM=38 -INTERFACE=39 -INTERFACES=40 -PACKAGE=41 -VALUE=42 -RELATION=43 -OPERATION=44 -FUNCTION=45 -CONSTRUCTOR=46 -CONSTRUCTS=47 -INPUT=48 -CONFORM=49 -AS=50 -BIND=51 -STATIC=52 -TO=53 -PRIVATE=54 -SHARED=55 -STATE=56 -EDGE=57 -PROJECTION=58 -WITH=59 -USING=60 -ACCEPT=61 -VIA=62 -MATERIALIZE=63 -IF=64 -ABSENT=65 -ON=66 -POLICY=67 -DEFAULT=68 -SOURCE=69 -REPOSITORY=70 -COMMIT=71 -REVISION=72 -SEMANTIC_MAJOR=73 -ON_DELETE=74 -LIFECYCLE=75 -RETAIN_OTHER=76 -KEYED=77 -PUBLIC_TRAVERSAL=78 -ID=79 -DOC=80 -MODE=81 -EMITS=82 -RECEIVER=83 -REQUIRES=84 -ANY=85 -GET=86 -SET=87 -WATCH=88 -START=89 -STOP=90 -READ=91 -WRITE=92 -RESOLVE=93 -CONNECT=94 -DISCONNECT=95 -CALL=96 -WATCH_START=97 -WATCH_STOP=98 -SUBSCRIBE=99 -UNSUBSCRIBE=100 -REGISTER=101 -CRDT=102 -OPTIONAL_ONE=103 -EXACTLY_ONE=104 -MANY_UNIQUE=105 -MANY=106 -ORDERED=107 -UNIT=108 -WATCH_HANDLE=109 -MESSAGE=110 -ATOM_REF=111 -INTERFACE_REF=112 -OPTIONAL=113 -LIST=114 -RECORD=115 -BOOL=116 -BYTES=117 -DOUBLE=118 -INT32=119 -INT64=120 -STRING=121 -UINT32=122 -UINT64=123 -TRUE=124 -FALSE=125 -NULL=126 -ARROW=127 -COLON=128 -SEMI=129 -COMMA=130 -DOT=131 -LBRACE=132 -RBRACE=133 -LBRACK=134 -RBRACK=135 -LPAREN=136 -RPAREN=137 -LT=138 -GT=139 -AMP=140 -EQUAL=141 -INTEGER=142 -JSON_NUMBER=143 -IDENTIFIER=144 -STRING_LITERAL=145 -LINE_COMMENT=146 -BLOCK_COMMENT=147 -WS=148 +COMPONENT=2 +PRESENTATION=3 +SUBJECT=4 +RUNTIME=5 +FOR=6 +CREATION=7 +INITIALIZE=8 +WORKSPACE=9 +EXECUTION=10 +SNAPSHOT=11 +TRANSACTION=12 +REMOTE=13 +TARGETS=14 +PORTABLE=15 +REPLICA=16 +LOCAL=17 +FROM=18 +RESULT_BYTES=19 +RPC_CALLS=20 +DEADLINE_MS=21 +QUERY=22 +REFLECTION=23 +SPECIALIZE=24 +ROOT=25 +DOCUMENT=26 +FRAGMENTS=27 +VIEW=28 +MAX=29 +ALLOW=30 +POLL=31 +QUERYABLE=32 +RPC=33 +QUERY_REASON=34 +TYPE=35 +OBJECT=36 +STORABLE=37 +IMPLEMENTS=38 +REF=39 +FRAGMENT=40 +IMPORT=41 +EXTERNAL=42 +ATOM=43 +INTERFACE=44 +INTERFACES=45 +PACKAGE=46 +VALUE=47 +RELATION=48 +OPERATION=49 +FUNCTION=50 +CONSTRUCTOR=51 +CONSTRUCTS=52 +INPUT=53 +CONFORM=54 +AS=55 +BIND=56 +STATIC=57 +TO=58 +PRIVATE=59 +SHARED=60 +STATE=61 +EDGE=62 +PROJECTION=63 +WITH=64 +USING=65 +ACCEPT=66 +VIA=67 +MATERIALIZE=68 +IF=69 +ABSENT=70 +ON=71 +POLICY=72 +DEFAULT=73 +SOURCE=74 +REPOSITORY=75 +COMMIT=76 +REVISION=77 +SEMANTIC_MAJOR=78 +ON_DELETE=79 +LIFECYCLE=80 +RETAIN_OTHER=81 +KEYED=82 +PUBLIC_TRAVERSAL=83 +ID=84 +DOC=85 +MODE=86 +EMITS=87 +RECEIVER=88 +REQUIRES=89 +ANY=90 +GET=91 +SET=92 +WATCH=93 +START=94 +STOP=95 +READ=96 +WRITE=97 +RESOLVE=98 +CONNECT=99 +DISCONNECT=100 +CALL=101 +WATCH_START=102 +WATCH_STOP=103 +SUBSCRIBE=104 +UNSUBSCRIBE=105 +REGISTER=106 +CRDT=107 +OPTIONAL_ONE=108 +EXACTLY_ONE=109 +MANY_UNIQUE=110 +MANY=111 +ORDERED=112 +UNIT=113 +WATCH_HANDLE=114 +MESSAGE=115 +ATOM_REF=116 +INTERFACE_REF=117 +OPTIONAL=118 +LIST=119 +RECORD=120 +BOOL=121 +BYTES=122 +DOUBLE=123 +INT32=124 +INT64=125 +STRING=126 +UINT32=127 +UINT64=128 +TRUE=129 +FALSE=130 +NULL=131 +ARROW=132 +COLON=133 +SEMI=134 +COMMA=135 +DOT=136 +LBRACE=137 +RBRACE=138 +LBRACK=139 +RBRACK=140 +LPAREN=141 +RPAREN=142 +LT=143 +GT=144 +AMP=145 +EQUAL=146 +INTEGER=147 +JSON_NUMBER=148 +IDENTIFIER=149 +STRING_LITERAL=150 +LINE_COMMENT=151 +BLOCK_COMMENT=152 +WS=153 'edit'=1 -'creation'=2 -'initialize'=3 -'workspace'=4 -'execution'=5 -'snapshot'=6 -'transaction'=7 -'remote'=8 -'targets'=9 -'portable'=10 -'replica'=11 -'local'=12 -'from'=13 -'result-bytes'=14 -'rpc-calls'=15 -'deadline-ms'=16 -'query'=17 -'reflection'=18 -'specialize'=19 -'root'=20 -'document'=21 -'fragments'=22 -'view'=23 -'max'=24 -'allow'=25 -'poll'=26 -'queryable'=27 -'rpc'=28 -'query-reason'=29 -'type'=30 -'object'=31 -'storable'=32 -'implements'=33 -'ref'=34 -'fragment'=35 -'import'=36 -'external'=37 -'atom'=38 -'interface'=39 -'interfaces'=40 -'package'=41 -'value'=42 -'relation'=43 -'operation'=44 -'function'=45 -'constructor'=46 -'constructs'=47 -'input'=48 -'conform'=49 -'as'=50 -'bind'=51 -'static'=52 -'to'=53 -'private'=54 -'shared'=55 -'state'=56 -'edge'=57 -'projection'=58 -'with'=59 -'using'=60 -'accept'=61 -'via'=62 -'materialize'=63 -'if'=64 -'absent'=65 -'on'=66 -'policy'=67 -'default'=68 -'source'=69 -'repository'=70 -'commit'=71 -'revision'=72 -'semantic-major'=73 -'on-delete'=74 -'lifecycle'=75 -'retain-other'=76 -'keyed'=77 -'public-traversal'=78 -'id'=79 -'doc'=80 -'mode'=81 -'emits'=82 -'receiver'=83 -'requires'=84 -'any'=85 -'get'=86 -'set'=87 -'watch'=88 -'start'=89 -'stop'=90 -'read'=91 -'write'=92 -'resolve'=93 -'connect'=94 -'disconnect'=95 -'call'=96 -'watch-start'=97 -'watch-stop'=98 -'subscribe'=99 -'unsubscribe'=100 -'register'=101 -'crdt'=102 -'optional-one'=103 -'exactly-one'=104 -'many-unique'=105 -'many'=106 -'ordered'=107 -'unit'=108 -'watch-handle'=109 -'message'=110 -'atom-ref'=111 -'interface-ref'=112 -'optional'=113 -'list'=114 -'record'=115 -'bool'=116 -'bytes'=117 -'double'=118 -'int32'=119 -'int64'=120 -'string'=121 -'uint32'=122 -'uint64'=123 -'true'=124 -'false'=125 -'null'=126 -'->'=127 -':'=128 -';'=129 -','=130 -'.'=131 -'{'=132 -'}'=133 -'['=134 -']'=135 -'('=136 -')'=137 -'<'=138 -'>'=139 -'&'=140 -'='=141 +'component'=2 +'presentation'=3 +'subject'=4 +'runtime'=5 +'for'=6 +'creation'=7 +'initialize'=8 +'workspace'=9 +'execution'=10 +'snapshot'=11 +'transaction'=12 +'remote'=13 +'targets'=14 +'portable'=15 +'replica'=16 +'local'=17 +'from'=18 +'result-bytes'=19 +'rpc-calls'=20 +'deadline-ms'=21 +'query'=22 +'reflection'=23 +'specialize'=24 +'root'=25 +'document'=26 +'fragments'=27 +'view'=28 +'max'=29 +'allow'=30 +'poll'=31 +'queryable'=32 +'rpc'=33 +'query-reason'=34 +'type'=35 +'object'=36 +'storable'=37 +'implements'=38 +'ref'=39 +'fragment'=40 +'import'=41 +'external'=42 +'atom'=43 +'interface'=44 +'interfaces'=45 +'package'=46 +'value'=47 +'relation'=48 +'operation'=49 +'function'=50 +'constructor'=51 +'constructs'=52 +'input'=53 +'conform'=54 +'as'=55 +'bind'=56 +'static'=57 +'to'=58 +'private'=59 +'shared'=60 +'state'=61 +'edge'=62 +'projection'=63 +'with'=64 +'using'=65 +'accept'=66 +'via'=67 +'materialize'=68 +'if'=69 +'absent'=70 +'on'=71 +'policy'=72 +'default'=73 +'source'=74 +'repository'=75 +'commit'=76 +'revision'=77 +'semantic-major'=78 +'on-delete'=79 +'lifecycle'=80 +'retain-other'=81 +'keyed'=82 +'public-traversal'=83 +'id'=84 +'doc'=85 +'mode'=86 +'emits'=87 +'receiver'=88 +'requires'=89 +'any'=90 +'get'=91 +'set'=92 +'watch'=93 +'start'=94 +'stop'=95 +'read'=96 +'write'=97 +'resolve'=98 +'connect'=99 +'disconnect'=100 +'call'=101 +'watch-start'=102 +'watch-stop'=103 +'subscribe'=104 +'unsubscribe'=105 +'register'=106 +'crdt'=107 +'optional-one'=108 +'exactly-one'=109 +'many-unique'=110 +'many'=111 +'ordered'=112 +'unit'=113 +'watch-handle'=114 +'message'=115 +'atom-ref'=116 +'interface-ref'=117 +'optional'=118 +'list'=119 +'record'=120 +'bool'=121 +'bytes'=122 +'double'=123 +'int32'=124 +'int64'=125 +'string'=126 +'uint32'=127 +'uint64'=128 +'true'=129 +'false'=130 +'null'=131 +'->'=132 +':'=133 +';'=134 +','=135 +'.'=136 +'{'=137 +'}'=138 +'['=139 +']'=140 +'('=141 +')'=142 +'<'=143 +'>'=144 +'&'=145 +'='=146 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.interp b/src/capability-language/generated/QuixosCapabilityLexer.interp index 4b7782b..0cf8db1 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.interp +++ b/src/capability-language/generated/QuixosCapabilityLexer.interp @@ -1,6 +1,11 @@ token literal names: null 'edit' +'component' +'presentation' +'subject' +'runtime' +'for' 'creation' 'initialize' 'workspace' @@ -152,6 +157,11 @@ null token symbolic names: null EDIT +COMPONENT +PRESENTATION +SUBJECT +RUNTIME +FOR CREATION INITIALIZE WORKSPACE @@ -302,6 +312,11 @@ WS rule names: EDIT +COMPONENT +PRESENTATION +SUBJECT +RUNTIME +FOR CREATION INITIALIZE WORKSPACE @@ -460,4 +475,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 148, 1418, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 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, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 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, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 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, 17, 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, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 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, 26, 1, 26, 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, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 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, 32, 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, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 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, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 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, 42, 1, 42, 1, 42, 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, 44, 1, 44, 1, 44, 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, 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, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 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, 1, 53, 1, 53, 1, 54, 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, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 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, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 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, 64, 1, 65, 1, 65, 1, 65, 1, 66, 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, 67, 1, 67, 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, 69, 1, 69, 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, 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, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 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, 75, 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, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 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, 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, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 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, 93, 1, 93, 1, 93, 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, 94, 1, 94, 1, 95, 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, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 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, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 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, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 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, 103, 1, 103, 1, 103, 1, 103, 1, 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, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 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, 3, 141, 1319, 8, 141, 1, 141, 4, 141, 1322, 8, 141, 11, 141, 12, 141, 1323, 1, 142, 3, 142, 1327, 8, 142, 1, 142, 1, 142, 1, 142, 5, 142, 1332, 8, 142, 10, 142, 12, 142, 1335, 9, 142, 3, 142, 1337, 8, 142, 1, 142, 1, 142, 4, 142, 1341, 8, 142, 11, 142, 12, 142, 1342, 3, 142, 1345, 8, 142, 1, 142, 1, 142, 3, 142, 1349, 8, 142, 1, 142, 4, 142, 1352, 8, 142, 11, 142, 12, 142, 1353, 3, 142, 1356, 8, 142, 1, 143, 1, 143, 5, 143, 1360, 8, 143, 10, 143, 12, 143, 1363, 9, 143, 1, 144, 1, 144, 1, 144, 5, 144, 1368, 8, 144, 10, 144, 12, 144, 1371, 9, 144, 1, 144, 1, 144, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 1, 145, 3, 145, 1383, 8, 145, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 147, 5, 147, 1391, 8, 147, 10, 147, 12, 147, 1394, 9, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 148, 1, 148, 5, 148, 1402, 8, 148, 10, 148, 12, 148, 1405, 9, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 148, 1, 149, 4, 149, 1413, 8, 149, 11, 149, 12, 149, 1414, 1, 149, 1, 149, 1, 1403, 0, 150, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 143, 287, 144, 289, 145, 291, 0, 293, 0, 295, 146, 297, 147, 299, 148, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1432, 0, 1, 1, 0, 0, 0, 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, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 1, 0, 0, 0, 0, 285, 1, 0, 0, 0, 0, 287, 1, 0, 0, 0, 0, 289, 1, 0, 0, 0, 0, 295, 1, 0, 0, 0, 0, 297, 1, 0, 0, 0, 0, 299, 1, 0, 0, 0, 1, 301, 1, 0, 0, 0, 3, 306, 1, 0, 0, 0, 5, 315, 1, 0, 0, 0, 7, 326, 1, 0, 0, 0, 9, 336, 1, 0, 0, 0, 11, 346, 1, 0, 0, 0, 13, 355, 1, 0, 0, 0, 15, 367, 1, 0, 0, 0, 17, 374, 1, 0, 0, 0, 19, 382, 1, 0, 0, 0, 21, 391, 1, 0, 0, 0, 23, 399, 1, 0, 0, 0, 25, 405, 1, 0, 0, 0, 27, 410, 1, 0, 0, 0, 29, 423, 1, 0, 0, 0, 31, 433, 1, 0, 0, 0, 33, 445, 1, 0, 0, 0, 35, 451, 1, 0, 0, 0, 37, 462, 1, 0, 0, 0, 39, 473, 1, 0, 0, 0, 41, 478, 1, 0, 0, 0, 43, 487, 1, 0, 0, 0, 45, 497, 1, 0, 0, 0, 47, 502, 1, 0, 0, 0, 49, 506, 1, 0, 0, 0, 51, 512, 1, 0, 0, 0, 53, 517, 1, 0, 0, 0, 55, 527, 1, 0, 0, 0, 57, 531, 1, 0, 0, 0, 59, 544, 1, 0, 0, 0, 61, 549, 1, 0, 0, 0, 63, 556, 1, 0, 0, 0, 65, 565, 1, 0, 0, 0, 67, 576, 1, 0, 0, 0, 69, 580, 1, 0, 0, 0, 71, 589, 1, 0, 0, 0, 73, 596, 1, 0, 0, 0, 75, 605, 1, 0, 0, 0, 77, 610, 1, 0, 0, 0, 79, 620, 1, 0, 0, 0, 81, 631, 1, 0, 0, 0, 83, 639, 1, 0, 0, 0, 85, 645, 1, 0, 0, 0, 87, 654, 1, 0, 0, 0, 89, 664, 1, 0, 0, 0, 91, 673, 1, 0, 0, 0, 93, 685, 1, 0, 0, 0, 95, 696, 1, 0, 0, 0, 97, 702, 1, 0, 0, 0, 99, 710, 1, 0, 0, 0, 101, 713, 1, 0, 0, 0, 103, 718, 1, 0, 0, 0, 105, 725, 1, 0, 0, 0, 107, 728, 1, 0, 0, 0, 109, 736, 1, 0, 0, 0, 111, 743, 1, 0, 0, 0, 113, 749, 1, 0, 0, 0, 115, 754, 1, 0, 0, 0, 117, 765, 1, 0, 0, 0, 119, 770, 1, 0, 0, 0, 121, 776, 1, 0, 0, 0, 123, 783, 1, 0, 0, 0, 125, 787, 1, 0, 0, 0, 127, 799, 1, 0, 0, 0, 129, 802, 1, 0, 0, 0, 131, 809, 1, 0, 0, 0, 133, 812, 1, 0, 0, 0, 135, 819, 1, 0, 0, 0, 137, 827, 1, 0, 0, 0, 139, 834, 1, 0, 0, 0, 141, 845, 1, 0, 0, 0, 143, 852, 1, 0, 0, 0, 145, 861, 1, 0, 0, 0, 147, 876, 1, 0, 0, 0, 149, 886, 1, 0, 0, 0, 151, 896, 1, 0, 0, 0, 153, 909, 1, 0, 0, 0, 155, 915, 1, 0, 0, 0, 157, 932, 1, 0, 0, 0, 159, 935, 1, 0, 0, 0, 161, 939, 1, 0, 0, 0, 163, 944, 1, 0, 0, 0, 165, 950, 1, 0, 0, 0, 167, 959, 1, 0, 0, 0, 169, 968, 1, 0, 0, 0, 171, 972, 1, 0, 0, 0, 173, 976, 1, 0, 0, 0, 175, 980, 1, 0, 0, 0, 177, 986, 1, 0, 0, 0, 179, 992, 1, 0, 0, 0, 181, 997, 1, 0, 0, 0, 183, 1002, 1, 0, 0, 0, 185, 1008, 1, 0, 0, 0, 187, 1016, 1, 0, 0, 0, 189, 1024, 1, 0, 0, 0, 191, 1035, 1, 0, 0, 0, 193, 1040, 1, 0, 0, 0, 195, 1052, 1, 0, 0, 0, 197, 1063, 1, 0, 0, 0, 199, 1073, 1, 0, 0, 0, 201, 1085, 1, 0, 0, 0, 203, 1094, 1, 0, 0, 0, 205, 1099, 1, 0, 0, 0, 207, 1112, 1, 0, 0, 0, 209, 1124, 1, 0, 0, 0, 211, 1136, 1, 0, 0, 0, 213, 1141, 1, 0, 0, 0, 215, 1149, 1, 0, 0, 0, 217, 1154, 1, 0, 0, 0, 219, 1167, 1, 0, 0, 0, 221, 1175, 1, 0, 0, 0, 223, 1184, 1, 0, 0, 0, 225, 1198, 1, 0, 0, 0, 227, 1207, 1, 0, 0, 0, 229, 1212, 1, 0, 0, 0, 231, 1219, 1, 0, 0, 0, 233, 1224, 1, 0, 0, 0, 235, 1230, 1, 0, 0, 0, 237, 1237, 1, 0, 0, 0, 239, 1243, 1, 0, 0, 0, 241, 1249, 1, 0, 0, 0, 243, 1256, 1, 0, 0, 0, 245, 1263, 1, 0, 0, 0, 247, 1270, 1, 0, 0, 0, 249, 1275, 1, 0, 0, 0, 251, 1281, 1, 0, 0, 0, 253, 1286, 1, 0, 0, 0, 255, 1289, 1, 0, 0, 0, 257, 1291, 1, 0, 0, 0, 259, 1293, 1, 0, 0, 0, 261, 1295, 1, 0, 0, 0, 263, 1297, 1, 0, 0, 0, 265, 1299, 1, 0, 0, 0, 267, 1301, 1, 0, 0, 0, 269, 1303, 1, 0, 0, 0, 271, 1305, 1, 0, 0, 0, 273, 1307, 1, 0, 0, 0, 275, 1309, 1, 0, 0, 0, 277, 1311, 1, 0, 0, 0, 279, 1313, 1, 0, 0, 0, 281, 1315, 1, 0, 0, 0, 283, 1318, 1, 0, 0, 0, 285, 1326, 1, 0, 0, 0, 287, 1357, 1, 0, 0, 0, 289, 1364, 1, 0, 0, 0, 291, 1374, 1, 0, 0, 0, 293, 1384, 1, 0, 0, 0, 295, 1386, 1, 0, 0, 0, 297, 1397, 1, 0, 0, 0, 299, 1412, 1, 0, 0, 0, 301, 302, 5, 101, 0, 0, 302, 303, 5, 100, 0, 0, 303, 304, 5, 105, 0, 0, 304, 305, 5, 116, 0, 0, 305, 2, 1, 0, 0, 0, 306, 307, 5, 99, 0, 0, 307, 308, 5, 114, 0, 0, 308, 309, 5, 101, 0, 0, 309, 310, 5, 97, 0, 0, 310, 311, 5, 116, 0, 0, 311, 312, 5, 105, 0, 0, 312, 313, 5, 111, 0, 0, 313, 314, 5, 110, 0, 0, 314, 4, 1, 0, 0, 0, 315, 316, 5, 105, 0, 0, 316, 317, 5, 110, 0, 0, 317, 318, 5, 105, 0, 0, 318, 319, 5, 116, 0, 0, 319, 320, 5, 105, 0, 0, 320, 321, 5, 97, 0, 0, 321, 322, 5, 108, 0, 0, 322, 323, 5, 105, 0, 0, 323, 324, 5, 122, 0, 0, 324, 325, 5, 101, 0, 0, 325, 6, 1, 0, 0, 0, 326, 327, 5, 119, 0, 0, 327, 328, 5, 111, 0, 0, 328, 329, 5, 114, 0, 0, 329, 330, 5, 107, 0, 0, 330, 331, 5, 115, 0, 0, 331, 332, 5, 112, 0, 0, 332, 333, 5, 97, 0, 0, 333, 334, 5, 99, 0, 0, 334, 335, 5, 101, 0, 0, 335, 8, 1, 0, 0, 0, 336, 337, 5, 101, 0, 0, 337, 338, 5, 120, 0, 0, 338, 339, 5, 101, 0, 0, 339, 340, 5, 99, 0, 0, 340, 341, 5, 117, 0, 0, 341, 342, 5, 116, 0, 0, 342, 343, 5, 105, 0, 0, 343, 344, 5, 111, 0, 0, 344, 345, 5, 110, 0, 0, 345, 10, 1, 0, 0, 0, 346, 347, 5, 115, 0, 0, 347, 348, 5, 110, 0, 0, 348, 349, 5, 97, 0, 0, 349, 350, 5, 112, 0, 0, 350, 351, 5, 115, 0, 0, 351, 352, 5, 104, 0, 0, 352, 353, 5, 111, 0, 0, 353, 354, 5, 116, 0, 0, 354, 12, 1, 0, 0, 0, 355, 356, 5, 116, 0, 0, 356, 357, 5, 114, 0, 0, 357, 358, 5, 97, 0, 0, 358, 359, 5, 110, 0, 0, 359, 360, 5, 115, 0, 0, 360, 361, 5, 97, 0, 0, 361, 362, 5, 99, 0, 0, 362, 363, 5, 116, 0, 0, 363, 364, 5, 105, 0, 0, 364, 365, 5, 111, 0, 0, 365, 366, 5, 110, 0, 0, 366, 14, 1, 0, 0, 0, 367, 368, 5, 114, 0, 0, 368, 369, 5, 101, 0, 0, 369, 370, 5, 109, 0, 0, 370, 371, 5, 111, 0, 0, 371, 372, 5, 116, 0, 0, 372, 373, 5, 101, 0, 0, 373, 16, 1, 0, 0, 0, 374, 375, 5, 116, 0, 0, 375, 376, 5, 97, 0, 0, 376, 377, 5, 114, 0, 0, 377, 378, 5, 103, 0, 0, 378, 379, 5, 101, 0, 0, 379, 380, 5, 116, 0, 0, 380, 381, 5, 115, 0, 0, 381, 18, 1, 0, 0, 0, 382, 383, 5, 112, 0, 0, 383, 384, 5, 111, 0, 0, 384, 385, 5, 114, 0, 0, 385, 386, 5, 116, 0, 0, 386, 387, 5, 97, 0, 0, 387, 388, 5, 98, 0, 0, 388, 389, 5, 108, 0, 0, 389, 390, 5, 101, 0, 0, 390, 20, 1, 0, 0, 0, 391, 392, 5, 114, 0, 0, 392, 393, 5, 101, 0, 0, 393, 394, 5, 112, 0, 0, 394, 395, 5, 108, 0, 0, 395, 396, 5, 105, 0, 0, 396, 397, 5, 99, 0, 0, 397, 398, 5, 97, 0, 0, 398, 22, 1, 0, 0, 0, 399, 400, 5, 108, 0, 0, 400, 401, 5, 111, 0, 0, 401, 402, 5, 99, 0, 0, 402, 403, 5, 97, 0, 0, 403, 404, 5, 108, 0, 0, 404, 24, 1, 0, 0, 0, 405, 406, 5, 102, 0, 0, 406, 407, 5, 114, 0, 0, 407, 408, 5, 111, 0, 0, 408, 409, 5, 109, 0, 0, 409, 26, 1, 0, 0, 0, 410, 411, 5, 114, 0, 0, 411, 412, 5, 101, 0, 0, 412, 413, 5, 115, 0, 0, 413, 414, 5, 117, 0, 0, 414, 415, 5, 108, 0, 0, 415, 416, 5, 116, 0, 0, 416, 417, 5, 45, 0, 0, 417, 418, 5, 98, 0, 0, 418, 419, 5, 121, 0, 0, 419, 420, 5, 116, 0, 0, 420, 421, 5, 101, 0, 0, 421, 422, 5, 115, 0, 0, 422, 28, 1, 0, 0, 0, 423, 424, 5, 114, 0, 0, 424, 425, 5, 112, 0, 0, 425, 426, 5, 99, 0, 0, 426, 427, 5, 45, 0, 0, 427, 428, 5, 99, 0, 0, 428, 429, 5, 97, 0, 0, 429, 430, 5, 108, 0, 0, 430, 431, 5, 108, 0, 0, 431, 432, 5, 115, 0, 0, 432, 30, 1, 0, 0, 0, 433, 434, 5, 100, 0, 0, 434, 435, 5, 101, 0, 0, 435, 436, 5, 97, 0, 0, 436, 437, 5, 100, 0, 0, 437, 438, 5, 108, 0, 0, 438, 439, 5, 105, 0, 0, 439, 440, 5, 110, 0, 0, 440, 441, 5, 101, 0, 0, 441, 442, 5, 45, 0, 0, 442, 443, 5, 109, 0, 0, 443, 444, 5, 115, 0, 0, 444, 32, 1, 0, 0, 0, 445, 446, 5, 113, 0, 0, 446, 447, 5, 117, 0, 0, 447, 448, 5, 101, 0, 0, 448, 449, 5, 114, 0, 0, 449, 450, 5, 121, 0, 0, 450, 34, 1, 0, 0, 0, 451, 452, 5, 114, 0, 0, 452, 453, 5, 101, 0, 0, 453, 454, 5, 102, 0, 0, 454, 455, 5, 108, 0, 0, 455, 456, 5, 101, 0, 0, 456, 457, 5, 99, 0, 0, 457, 458, 5, 116, 0, 0, 458, 459, 5, 105, 0, 0, 459, 460, 5, 111, 0, 0, 460, 461, 5, 110, 0, 0, 461, 36, 1, 0, 0, 0, 462, 463, 5, 115, 0, 0, 463, 464, 5, 112, 0, 0, 464, 465, 5, 101, 0, 0, 465, 466, 5, 99, 0, 0, 466, 467, 5, 105, 0, 0, 467, 468, 5, 97, 0, 0, 468, 469, 5, 108, 0, 0, 469, 470, 5, 105, 0, 0, 470, 471, 5, 122, 0, 0, 471, 472, 5, 101, 0, 0, 472, 38, 1, 0, 0, 0, 473, 474, 5, 114, 0, 0, 474, 475, 5, 111, 0, 0, 475, 476, 5, 111, 0, 0, 476, 477, 5, 116, 0, 0, 477, 40, 1, 0, 0, 0, 478, 479, 5, 100, 0, 0, 479, 480, 5, 111, 0, 0, 480, 481, 5, 99, 0, 0, 481, 482, 5, 117, 0, 0, 482, 483, 5, 109, 0, 0, 483, 484, 5, 101, 0, 0, 484, 485, 5, 110, 0, 0, 485, 486, 5, 116, 0, 0, 486, 42, 1, 0, 0, 0, 487, 488, 5, 102, 0, 0, 488, 489, 5, 114, 0, 0, 489, 490, 5, 97, 0, 0, 490, 491, 5, 103, 0, 0, 491, 492, 5, 109, 0, 0, 492, 493, 5, 101, 0, 0, 493, 494, 5, 110, 0, 0, 494, 495, 5, 116, 0, 0, 495, 496, 5, 115, 0, 0, 496, 44, 1, 0, 0, 0, 497, 498, 5, 118, 0, 0, 498, 499, 5, 105, 0, 0, 499, 500, 5, 101, 0, 0, 500, 501, 5, 119, 0, 0, 501, 46, 1, 0, 0, 0, 502, 503, 5, 109, 0, 0, 503, 504, 5, 97, 0, 0, 504, 505, 5, 120, 0, 0, 505, 48, 1, 0, 0, 0, 506, 507, 5, 97, 0, 0, 507, 508, 5, 108, 0, 0, 508, 509, 5, 108, 0, 0, 509, 510, 5, 111, 0, 0, 510, 511, 5, 119, 0, 0, 511, 50, 1, 0, 0, 0, 512, 513, 5, 112, 0, 0, 513, 514, 5, 111, 0, 0, 514, 515, 5, 108, 0, 0, 515, 516, 5, 108, 0, 0, 516, 52, 1, 0, 0, 0, 517, 518, 5, 113, 0, 0, 518, 519, 5, 117, 0, 0, 519, 520, 5, 101, 0, 0, 520, 521, 5, 114, 0, 0, 521, 522, 5, 121, 0, 0, 522, 523, 5, 97, 0, 0, 523, 524, 5, 98, 0, 0, 524, 525, 5, 108, 0, 0, 525, 526, 5, 101, 0, 0, 526, 54, 1, 0, 0, 0, 527, 528, 5, 114, 0, 0, 528, 529, 5, 112, 0, 0, 529, 530, 5, 99, 0, 0, 530, 56, 1, 0, 0, 0, 531, 532, 5, 113, 0, 0, 532, 533, 5, 117, 0, 0, 533, 534, 5, 101, 0, 0, 534, 535, 5, 114, 0, 0, 535, 536, 5, 121, 0, 0, 536, 537, 5, 45, 0, 0, 537, 538, 5, 114, 0, 0, 538, 539, 5, 101, 0, 0, 539, 540, 5, 97, 0, 0, 540, 541, 5, 115, 0, 0, 541, 542, 5, 111, 0, 0, 542, 543, 5, 110, 0, 0, 543, 58, 1, 0, 0, 0, 544, 545, 5, 116, 0, 0, 545, 546, 5, 121, 0, 0, 546, 547, 5, 112, 0, 0, 547, 548, 5, 101, 0, 0, 548, 60, 1, 0, 0, 0, 549, 550, 5, 111, 0, 0, 550, 551, 5, 98, 0, 0, 551, 552, 5, 106, 0, 0, 552, 553, 5, 101, 0, 0, 553, 554, 5, 99, 0, 0, 554, 555, 5, 116, 0, 0, 555, 62, 1, 0, 0, 0, 556, 557, 5, 115, 0, 0, 557, 558, 5, 116, 0, 0, 558, 559, 5, 111, 0, 0, 559, 560, 5, 114, 0, 0, 560, 561, 5, 97, 0, 0, 561, 562, 5, 98, 0, 0, 562, 563, 5, 108, 0, 0, 563, 564, 5, 101, 0, 0, 564, 64, 1, 0, 0, 0, 565, 566, 5, 105, 0, 0, 566, 567, 5, 109, 0, 0, 567, 568, 5, 112, 0, 0, 568, 569, 5, 108, 0, 0, 569, 570, 5, 101, 0, 0, 570, 571, 5, 109, 0, 0, 571, 572, 5, 101, 0, 0, 572, 573, 5, 110, 0, 0, 573, 574, 5, 116, 0, 0, 574, 575, 5, 115, 0, 0, 575, 66, 1, 0, 0, 0, 576, 577, 5, 114, 0, 0, 577, 578, 5, 101, 0, 0, 578, 579, 5, 102, 0, 0, 579, 68, 1, 0, 0, 0, 580, 581, 5, 102, 0, 0, 581, 582, 5, 114, 0, 0, 582, 583, 5, 97, 0, 0, 583, 584, 5, 103, 0, 0, 584, 585, 5, 109, 0, 0, 585, 586, 5, 101, 0, 0, 586, 587, 5, 110, 0, 0, 587, 588, 5, 116, 0, 0, 588, 70, 1, 0, 0, 0, 589, 590, 5, 105, 0, 0, 590, 591, 5, 109, 0, 0, 591, 592, 5, 112, 0, 0, 592, 593, 5, 111, 0, 0, 593, 594, 5, 114, 0, 0, 594, 595, 5, 116, 0, 0, 595, 72, 1, 0, 0, 0, 596, 597, 5, 101, 0, 0, 597, 598, 5, 120, 0, 0, 598, 599, 5, 116, 0, 0, 599, 600, 5, 101, 0, 0, 600, 601, 5, 114, 0, 0, 601, 602, 5, 110, 0, 0, 602, 603, 5, 97, 0, 0, 603, 604, 5, 108, 0, 0, 604, 74, 1, 0, 0, 0, 605, 606, 5, 97, 0, 0, 606, 607, 5, 116, 0, 0, 607, 608, 5, 111, 0, 0, 608, 609, 5, 109, 0, 0, 609, 76, 1, 0, 0, 0, 610, 611, 5, 105, 0, 0, 611, 612, 5, 110, 0, 0, 612, 613, 5, 116, 0, 0, 613, 614, 5, 101, 0, 0, 614, 615, 5, 114, 0, 0, 615, 616, 5, 102, 0, 0, 616, 617, 5, 97, 0, 0, 617, 618, 5, 99, 0, 0, 618, 619, 5, 101, 0, 0, 619, 78, 1, 0, 0, 0, 620, 621, 5, 105, 0, 0, 621, 622, 5, 110, 0, 0, 622, 623, 5, 116, 0, 0, 623, 624, 5, 101, 0, 0, 624, 625, 5, 114, 0, 0, 625, 626, 5, 102, 0, 0, 626, 627, 5, 97, 0, 0, 627, 628, 5, 99, 0, 0, 628, 629, 5, 101, 0, 0, 629, 630, 5, 115, 0, 0, 630, 80, 1, 0, 0, 0, 631, 632, 5, 112, 0, 0, 632, 633, 5, 97, 0, 0, 633, 634, 5, 99, 0, 0, 634, 635, 5, 107, 0, 0, 635, 636, 5, 97, 0, 0, 636, 637, 5, 103, 0, 0, 637, 638, 5, 101, 0, 0, 638, 82, 1, 0, 0, 0, 639, 640, 5, 118, 0, 0, 640, 641, 5, 97, 0, 0, 641, 642, 5, 108, 0, 0, 642, 643, 5, 117, 0, 0, 643, 644, 5, 101, 0, 0, 644, 84, 1, 0, 0, 0, 645, 646, 5, 114, 0, 0, 646, 647, 5, 101, 0, 0, 647, 648, 5, 108, 0, 0, 648, 649, 5, 97, 0, 0, 649, 650, 5, 116, 0, 0, 650, 651, 5, 105, 0, 0, 651, 652, 5, 111, 0, 0, 652, 653, 5, 110, 0, 0, 653, 86, 1, 0, 0, 0, 654, 655, 5, 111, 0, 0, 655, 656, 5, 112, 0, 0, 656, 657, 5, 101, 0, 0, 657, 658, 5, 114, 0, 0, 658, 659, 5, 97, 0, 0, 659, 660, 5, 116, 0, 0, 660, 661, 5, 105, 0, 0, 661, 662, 5, 111, 0, 0, 662, 663, 5, 110, 0, 0, 663, 88, 1, 0, 0, 0, 664, 665, 5, 102, 0, 0, 665, 666, 5, 117, 0, 0, 666, 667, 5, 110, 0, 0, 667, 668, 5, 99, 0, 0, 668, 669, 5, 116, 0, 0, 669, 670, 5, 105, 0, 0, 670, 671, 5, 111, 0, 0, 671, 672, 5, 110, 0, 0, 672, 90, 1, 0, 0, 0, 673, 674, 5, 99, 0, 0, 674, 675, 5, 111, 0, 0, 675, 676, 5, 110, 0, 0, 676, 677, 5, 115, 0, 0, 677, 678, 5, 116, 0, 0, 678, 679, 5, 114, 0, 0, 679, 680, 5, 117, 0, 0, 680, 681, 5, 99, 0, 0, 681, 682, 5, 116, 0, 0, 682, 683, 5, 111, 0, 0, 683, 684, 5, 114, 0, 0, 684, 92, 1, 0, 0, 0, 685, 686, 5, 99, 0, 0, 686, 687, 5, 111, 0, 0, 687, 688, 5, 110, 0, 0, 688, 689, 5, 115, 0, 0, 689, 690, 5, 116, 0, 0, 690, 691, 5, 114, 0, 0, 691, 692, 5, 117, 0, 0, 692, 693, 5, 99, 0, 0, 693, 694, 5, 116, 0, 0, 694, 695, 5, 115, 0, 0, 695, 94, 1, 0, 0, 0, 696, 697, 5, 105, 0, 0, 697, 698, 5, 110, 0, 0, 698, 699, 5, 112, 0, 0, 699, 700, 5, 117, 0, 0, 700, 701, 5, 116, 0, 0, 701, 96, 1, 0, 0, 0, 702, 703, 5, 99, 0, 0, 703, 704, 5, 111, 0, 0, 704, 705, 5, 110, 0, 0, 705, 706, 5, 102, 0, 0, 706, 707, 5, 111, 0, 0, 707, 708, 5, 114, 0, 0, 708, 709, 5, 109, 0, 0, 709, 98, 1, 0, 0, 0, 710, 711, 5, 97, 0, 0, 711, 712, 5, 115, 0, 0, 712, 100, 1, 0, 0, 0, 713, 714, 5, 98, 0, 0, 714, 715, 5, 105, 0, 0, 715, 716, 5, 110, 0, 0, 716, 717, 5, 100, 0, 0, 717, 102, 1, 0, 0, 0, 718, 719, 5, 115, 0, 0, 719, 720, 5, 116, 0, 0, 720, 721, 5, 97, 0, 0, 721, 722, 5, 116, 0, 0, 722, 723, 5, 105, 0, 0, 723, 724, 5, 99, 0, 0, 724, 104, 1, 0, 0, 0, 725, 726, 5, 116, 0, 0, 726, 727, 5, 111, 0, 0, 727, 106, 1, 0, 0, 0, 728, 729, 5, 112, 0, 0, 729, 730, 5, 114, 0, 0, 730, 731, 5, 105, 0, 0, 731, 732, 5, 118, 0, 0, 732, 733, 5, 97, 0, 0, 733, 734, 5, 116, 0, 0, 734, 735, 5, 101, 0, 0, 735, 108, 1, 0, 0, 0, 736, 737, 5, 115, 0, 0, 737, 738, 5, 104, 0, 0, 738, 739, 5, 97, 0, 0, 739, 740, 5, 114, 0, 0, 740, 741, 5, 101, 0, 0, 741, 742, 5, 100, 0, 0, 742, 110, 1, 0, 0, 0, 743, 744, 5, 115, 0, 0, 744, 745, 5, 116, 0, 0, 745, 746, 5, 97, 0, 0, 746, 747, 5, 116, 0, 0, 747, 748, 5, 101, 0, 0, 748, 112, 1, 0, 0, 0, 749, 750, 5, 101, 0, 0, 750, 751, 5, 100, 0, 0, 751, 752, 5, 103, 0, 0, 752, 753, 5, 101, 0, 0, 753, 114, 1, 0, 0, 0, 754, 755, 5, 112, 0, 0, 755, 756, 5, 114, 0, 0, 756, 757, 5, 111, 0, 0, 757, 758, 5, 106, 0, 0, 758, 759, 5, 101, 0, 0, 759, 760, 5, 99, 0, 0, 760, 761, 5, 116, 0, 0, 761, 762, 5, 105, 0, 0, 762, 763, 5, 111, 0, 0, 763, 764, 5, 110, 0, 0, 764, 116, 1, 0, 0, 0, 765, 766, 5, 119, 0, 0, 766, 767, 5, 105, 0, 0, 767, 768, 5, 116, 0, 0, 768, 769, 5, 104, 0, 0, 769, 118, 1, 0, 0, 0, 770, 771, 5, 117, 0, 0, 771, 772, 5, 115, 0, 0, 772, 773, 5, 105, 0, 0, 773, 774, 5, 110, 0, 0, 774, 775, 5, 103, 0, 0, 775, 120, 1, 0, 0, 0, 776, 777, 5, 97, 0, 0, 777, 778, 5, 99, 0, 0, 778, 779, 5, 99, 0, 0, 779, 780, 5, 101, 0, 0, 780, 781, 5, 112, 0, 0, 781, 782, 5, 116, 0, 0, 782, 122, 1, 0, 0, 0, 783, 784, 5, 118, 0, 0, 784, 785, 5, 105, 0, 0, 785, 786, 5, 97, 0, 0, 786, 124, 1, 0, 0, 0, 787, 788, 5, 109, 0, 0, 788, 789, 5, 97, 0, 0, 789, 790, 5, 116, 0, 0, 790, 791, 5, 101, 0, 0, 791, 792, 5, 114, 0, 0, 792, 793, 5, 105, 0, 0, 793, 794, 5, 97, 0, 0, 794, 795, 5, 108, 0, 0, 795, 796, 5, 105, 0, 0, 796, 797, 5, 122, 0, 0, 797, 798, 5, 101, 0, 0, 798, 126, 1, 0, 0, 0, 799, 800, 5, 105, 0, 0, 800, 801, 5, 102, 0, 0, 801, 128, 1, 0, 0, 0, 802, 803, 5, 97, 0, 0, 803, 804, 5, 98, 0, 0, 804, 805, 5, 115, 0, 0, 805, 806, 5, 101, 0, 0, 806, 807, 5, 110, 0, 0, 807, 808, 5, 116, 0, 0, 808, 130, 1, 0, 0, 0, 809, 810, 5, 111, 0, 0, 810, 811, 5, 110, 0, 0, 811, 132, 1, 0, 0, 0, 812, 813, 5, 112, 0, 0, 813, 814, 5, 111, 0, 0, 814, 815, 5, 108, 0, 0, 815, 816, 5, 105, 0, 0, 816, 817, 5, 99, 0, 0, 817, 818, 5, 121, 0, 0, 818, 134, 1, 0, 0, 0, 819, 820, 5, 100, 0, 0, 820, 821, 5, 101, 0, 0, 821, 822, 5, 102, 0, 0, 822, 823, 5, 97, 0, 0, 823, 824, 5, 117, 0, 0, 824, 825, 5, 108, 0, 0, 825, 826, 5, 116, 0, 0, 826, 136, 1, 0, 0, 0, 827, 828, 5, 115, 0, 0, 828, 829, 5, 111, 0, 0, 829, 830, 5, 117, 0, 0, 830, 831, 5, 114, 0, 0, 831, 832, 5, 99, 0, 0, 832, 833, 5, 101, 0, 0, 833, 138, 1, 0, 0, 0, 834, 835, 5, 114, 0, 0, 835, 836, 5, 101, 0, 0, 836, 837, 5, 112, 0, 0, 837, 838, 5, 111, 0, 0, 838, 839, 5, 115, 0, 0, 839, 840, 5, 105, 0, 0, 840, 841, 5, 116, 0, 0, 841, 842, 5, 111, 0, 0, 842, 843, 5, 114, 0, 0, 843, 844, 5, 121, 0, 0, 844, 140, 1, 0, 0, 0, 845, 846, 5, 99, 0, 0, 846, 847, 5, 111, 0, 0, 847, 848, 5, 109, 0, 0, 848, 849, 5, 109, 0, 0, 849, 850, 5, 105, 0, 0, 850, 851, 5, 116, 0, 0, 851, 142, 1, 0, 0, 0, 852, 853, 5, 114, 0, 0, 853, 854, 5, 101, 0, 0, 854, 855, 5, 118, 0, 0, 855, 856, 5, 105, 0, 0, 856, 857, 5, 115, 0, 0, 857, 858, 5, 105, 0, 0, 858, 859, 5, 111, 0, 0, 859, 860, 5, 110, 0, 0, 860, 144, 1, 0, 0, 0, 861, 862, 5, 115, 0, 0, 862, 863, 5, 101, 0, 0, 863, 864, 5, 109, 0, 0, 864, 865, 5, 97, 0, 0, 865, 866, 5, 110, 0, 0, 866, 867, 5, 116, 0, 0, 867, 868, 5, 105, 0, 0, 868, 869, 5, 99, 0, 0, 869, 870, 5, 45, 0, 0, 870, 871, 5, 109, 0, 0, 871, 872, 5, 97, 0, 0, 872, 873, 5, 106, 0, 0, 873, 874, 5, 111, 0, 0, 874, 875, 5, 114, 0, 0, 875, 146, 1, 0, 0, 0, 876, 877, 5, 111, 0, 0, 877, 878, 5, 110, 0, 0, 878, 879, 5, 45, 0, 0, 879, 880, 5, 100, 0, 0, 880, 881, 5, 101, 0, 0, 881, 882, 5, 108, 0, 0, 882, 883, 5, 101, 0, 0, 883, 884, 5, 116, 0, 0, 884, 885, 5, 101, 0, 0, 885, 148, 1, 0, 0, 0, 886, 887, 5, 108, 0, 0, 887, 888, 5, 105, 0, 0, 888, 889, 5, 102, 0, 0, 889, 890, 5, 101, 0, 0, 890, 891, 5, 99, 0, 0, 891, 892, 5, 121, 0, 0, 892, 893, 5, 99, 0, 0, 893, 894, 5, 108, 0, 0, 894, 895, 5, 101, 0, 0, 895, 150, 1, 0, 0, 0, 896, 897, 5, 114, 0, 0, 897, 898, 5, 101, 0, 0, 898, 899, 5, 116, 0, 0, 899, 900, 5, 97, 0, 0, 900, 901, 5, 105, 0, 0, 901, 902, 5, 110, 0, 0, 902, 903, 5, 45, 0, 0, 903, 904, 5, 111, 0, 0, 904, 905, 5, 116, 0, 0, 905, 906, 5, 104, 0, 0, 906, 907, 5, 101, 0, 0, 907, 908, 5, 114, 0, 0, 908, 152, 1, 0, 0, 0, 909, 910, 5, 107, 0, 0, 910, 911, 5, 101, 0, 0, 911, 912, 5, 121, 0, 0, 912, 913, 5, 101, 0, 0, 913, 914, 5, 100, 0, 0, 914, 154, 1, 0, 0, 0, 915, 916, 5, 112, 0, 0, 916, 917, 5, 117, 0, 0, 917, 918, 5, 98, 0, 0, 918, 919, 5, 108, 0, 0, 919, 920, 5, 105, 0, 0, 920, 921, 5, 99, 0, 0, 921, 922, 5, 45, 0, 0, 922, 923, 5, 116, 0, 0, 923, 924, 5, 114, 0, 0, 924, 925, 5, 97, 0, 0, 925, 926, 5, 118, 0, 0, 926, 927, 5, 101, 0, 0, 927, 928, 5, 114, 0, 0, 928, 929, 5, 115, 0, 0, 929, 930, 5, 97, 0, 0, 930, 931, 5, 108, 0, 0, 931, 156, 1, 0, 0, 0, 932, 933, 5, 105, 0, 0, 933, 934, 5, 100, 0, 0, 934, 158, 1, 0, 0, 0, 935, 936, 5, 100, 0, 0, 936, 937, 5, 111, 0, 0, 937, 938, 5, 99, 0, 0, 938, 160, 1, 0, 0, 0, 939, 940, 5, 109, 0, 0, 940, 941, 5, 111, 0, 0, 941, 942, 5, 100, 0, 0, 942, 943, 5, 101, 0, 0, 943, 162, 1, 0, 0, 0, 944, 945, 5, 101, 0, 0, 945, 946, 5, 109, 0, 0, 946, 947, 5, 105, 0, 0, 947, 948, 5, 116, 0, 0, 948, 949, 5, 115, 0, 0, 949, 164, 1, 0, 0, 0, 950, 951, 5, 114, 0, 0, 951, 952, 5, 101, 0, 0, 952, 953, 5, 99, 0, 0, 953, 954, 5, 101, 0, 0, 954, 955, 5, 105, 0, 0, 955, 956, 5, 118, 0, 0, 956, 957, 5, 101, 0, 0, 957, 958, 5, 114, 0, 0, 958, 166, 1, 0, 0, 0, 959, 960, 5, 114, 0, 0, 960, 961, 5, 101, 0, 0, 961, 962, 5, 113, 0, 0, 962, 963, 5, 117, 0, 0, 963, 964, 5, 105, 0, 0, 964, 965, 5, 114, 0, 0, 965, 966, 5, 101, 0, 0, 966, 967, 5, 115, 0, 0, 967, 168, 1, 0, 0, 0, 968, 969, 5, 97, 0, 0, 969, 970, 5, 110, 0, 0, 970, 971, 5, 121, 0, 0, 971, 170, 1, 0, 0, 0, 972, 973, 5, 103, 0, 0, 973, 974, 5, 101, 0, 0, 974, 975, 5, 116, 0, 0, 975, 172, 1, 0, 0, 0, 976, 977, 5, 115, 0, 0, 977, 978, 5, 101, 0, 0, 978, 979, 5, 116, 0, 0, 979, 174, 1, 0, 0, 0, 980, 981, 5, 119, 0, 0, 981, 982, 5, 97, 0, 0, 982, 983, 5, 116, 0, 0, 983, 984, 5, 99, 0, 0, 984, 985, 5, 104, 0, 0, 985, 176, 1, 0, 0, 0, 986, 987, 5, 115, 0, 0, 987, 988, 5, 116, 0, 0, 988, 989, 5, 97, 0, 0, 989, 990, 5, 114, 0, 0, 990, 991, 5, 116, 0, 0, 991, 178, 1, 0, 0, 0, 992, 993, 5, 115, 0, 0, 993, 994, 5, 116, 0, 0, 994, 995, 5, 111, 0, 0, 995, 996, 5, 112, 0, 0, 996, 180, 1, 0, 0, 0, 997, 998, 5, 114, 0, 0, 998, 999, 5, 101, 0, 0, 999, 1000, 5, 97, 0, 0, 1000, 1001, 5, 100, 0, 0, 1001, 182, 1, 0, 0, 0, 1002, 1003, 5, 119, 0, 0, 1003, 1004, 5, 114, 0, 0, 1004, 1005, 5, 105, 0, 0, 1005, 1006, 5, 116, 0, 0, 1006, 1007, 5, 101, 0, 0, 1007, 184, 1, 0, 0, 0, 1008, 1009, 5, 114, 0, 0, 1009, 1010, 5, 101, 0, 0, 1010, 1011, 5, 115, 0, 0, 1011, 1012, 5, 111, 0, 0, 1012, 1013, 5, 108, 0, 0, 1013, 1014, 5, 118, 0, 0, 1014, 1015, 5, 101, 0, 0, 1015, 186, 1, 0, 0, 0, 1016, 1017, 5, 99, 0, 0, 1017, 1018, 5, 111, 0, 0, 1018, 1019, 5, 110, 0, 0, 1019, 1020, 5, 110, 0, 0, 1020, 1021, 5, 101, 0, 0, 1021, 1022, 5, 99, 0, 0, 1022, 1023, 5, 116, 0, 0, 1023, 188, 1, 0, 0, 0, 1024, 1025, 5, 100, 0, 0, 1025, 1026, 5, 105, 0, 0, 1026, 1027, 5, 115, 0, 0, 1027, 1028, 5, 99, 0, 0, 1028, 1029, 5, 111, 0, 0, 1029, 1030, 5, 110, 0, 0, 1030, 1031, 5, 110, 0, 0, 1031, 1032, 5, 101, 0, 0, 1032, 1033, 5, 99, 0, 0, 1033, 1034, 5, 116, 0, 0, 1034, 190, 1, 0, 0, 0, 1035, 1036, 5, 99, 0, 0, 1036, 1037, 5, 97, 0, 0, 1037, 1038, 5, 108, 0, 0, 1038, 1039, 5, 108, 0, 0, 1039, 192, 1, 0, 0, 0, 1040, 1041, 5, 119, 0, 0, 1041, 1042, 5, 97, 0, 0, 1042, 1043, 5, 116, 0, 0, 1043, 1044, 5, 99, 0, 0, 1044, 1045, 5, 104, 0, 0, 1045, 1046, 5, 45, 0, 0, 1046, 1047, 5, 115, 0, 0, 1047, 1048, 5, 116, 0, 0, 1048, 1049, 5, 97, 0, 0, 1049, 1050, 5, 114, 0, 0, 1050, 1051, 5, 116, 0, 0, 1051, 194, 1, 0, 0, 0, 1052, 1053, 5, 119, 0, 0, 1053, 1054, 5, 97, 0, 0, 1054, 1055, 5, 116, 0, 0, 1055, 1056, 5, 99, 0, 0, 1056, 1057, 5, 104, 0, 0, 1057, 1058, 5, 45, 0, 0, 1058, 1059, 5, 115, 0, 0, 1059, 1060, 5, 116, 0, 0, 1060, 1061, 5, 111, 0, 0, 1061, 1062, 5, 112, 0, 0, 1062, 196, 1, 0, 0, 0, 1063, 1064, 5, 115, 0, 0, 1064, 1065, 5, 117, 0, 0, 1065, 1066, 5, 98, 0, 0, 1066, 1067, 5, 115, 0, 0, 1067, 1068, 5, 99, 0, 0, 1068, 1069, 5, 114, 0, 0, 1069, 1070, 5, 105, 0, 0, 1070, 1071, 5, 98, 0, 0, 1071, 1072, 5, 101, 0, 0, 1072, 198, 1, 0, 0, 0, 1073, 1074, 5, 117, 0, 0, 1074, 1075, 5, 110, 0, 0, 1075, 1076, 5, 115, 0, 0, 1076, 1077, 5, 117, 0, 0, 1077, 1078, 5, 98, 0, 0, 1078, 1079, 5, 115, 0, 0, 1079, 1080, 5, 99, 0, 0, 1080, 1081, 5, 114, 0, 0, 1081, 1082, 5, 105, 0, 0, 1082, 1083, 5, 98, 0, 0, 1083, 1084, 5, 101, 0, 0, 1084, 200, 1, 0, 0, 0, 1085, 1086, 5, 114, 0, 0, 1086, 1087, 5, 101, 0, 0, 1087, 1088, 5, 103, 0, 0, 1088, 1089, 5, 105, 0, 0, 1089, 1090, 5, 115, 0, 0, 1090, 1091, 5, 116, 0, 0, 1091, 1092, 5, 101, 0, 0, 1092, 1093, 5, 114, 0, 0, 1093, 202, 1, 0, 0, 0, 1094, 1095, 5, 99, 0, 0, 1095, 1096, 5, 114, 0, 0, 1096, 1097, 5, 100, 0, 0, 1097, 1098, 5, 116, 0, 0, 1098, 204, 1, 0, 0, 0, 1099, 1100, 5, 111, 0, 0, 1100, 1101, 5, 112, 0, 0, 1101, 1102, 5, 116, 0, 0, 1102, 1103, 5, 105, 0, 0, 1103, 1104, 5, 111, 0, 0, 1104, 1105, 5, 110, 0, 0, 1105, 1106, 5, 97, 0, 0, 1106, 1107, 5, 108, 0, 0, 1107, 1108, 5, 45, 0, 0, 1108, 1109, 5, 111, 0, 0, 1109, 1110, 5, 110, 0, 0, 1110, 1111, 5, 101, 0, 0, 1111, 206, 1, 0, 0, 0, 1112, 1113, 5, 101, 0, 0, 1113, 1114, 5, 120, 0, 0, 1114, 1115, 5, 97, 0, 0, 1115, 1116, 5, 99, 0, 0, 1116, 1117, 5, 116, 0, 0, 1117, 1118, 5, 108, 0, 0, 1118, 1119, 5, 121, 0, 0, 1119, 1120, 5, 45, 0, 0, 1120, 1121, 5, 111, 0, 0, 1121, 1122, 5, 110, 0, 0, 1122, 1123, 5, 101, 0, 0, 1123, 208, 1, 0, 0, 0, 1124, 1125, 5, 109, 0, 0, 1125, 1126, 5, 97, 0, 0, 1126, 1127, 5, 110, 0, 0, 1127, 1128, 5, 121, 0, 0, 1128, 1129, 5, 45, 0, 0, 1129, 1130, 5, 117, 0, 0, 1130, 1131, 5, 110, 0, 0, 1131, 1132, 5, 105, 0, 0, 1132, 1133, 5, 113, 0, 0, 1133, 1134, 5, 117, 0, 0, 1134, 1135, 5, 101, 0, 0, 1135, 210, 1, 0, 0, 0, 1136, 1137, 5, 109, 0, 0, 1137, 1138, 5, 97, 0, 0, 1138, 1139, 5, 110, 0, 0, 1139, 1140, 5, 121, 0, 0, 1140, 212, 1, 0, 0, 0, 1141, 1142, 5, 111, 0, 0, 1142, 1143, 5, 114, 0, 0, 1143, 1144, 5, 100, 0, 0, 1144, 1145, 5, 101, 0, 0, 1145, 1146, 5, 114, 0, 0, 1146, 1147, 5, 101, 0, 0, 1147, 1148, 5, 100, 0, 0, 1148, 214, 1, 0, 0, 0, 1149, 1150, 5, 117, 0, 0, 1150, 1151, 5, 110, 0, 0, 1151, 1152, 5, 105, 0, 0, 1152, 1153, 5, 116, 0, 0, 1153, 216, 1, 0, 0, 0, 1154, 1155, 5, 119, 0, 0, 1155, 1156, 5, 97, 0, 0, 1156, 1157, 5, 116, 0, 0, 1157, 1158, 5, 99, 0, 0, 1158, 1159, 5, 104, 0, 0, 1159, 1160, 5, 45, 0, 0, 1160, 1161, 5, 104, 0, 0, 1161, 1162, 5, 97, 0, 0, 1162, 1163, 5, 110, 0, 0, 1163, 1164, 5, 100, 0, 0, 1164, 1165, 5, 108, 0, 0, 1165, 1166, 5, 101, 0, 0, 1166, 218, 1, 0, 0, 0, 1167, 1168, 5, 109, 0, 0, 1168, 1169, 5, 101, 0, 0, 1169, 1170, 5, 115, 0, 0, 1170, 1171, 5, 115, 0, 0, 1171, 1172, 5, 97, 0, 0, 1172, 1173, 5, 103, 0, 0, 1173, 1174, 5, 101, 0, 0, 1174, 220, 1, 0, 0, 0, 1175, 1176, 5, 97, 0, 0, 1176, 1177, 5, 116, 0, 0, 1177, 1178, 5, 111, 0, 0, 1178, 1179, 5, 109, 0, 0, 1179, 1180, 5, 45, 0, 0, 1180, 1181, 5, 114, 0, 0, 1181, 1182, 5, 101, 0, 0, 1182, 1183, 5, 102, 0, 0, 1183, 222, 1, 0, 0, 0, 1184, 1185, 5, 105, 0, 0, 1185, 1186, 5, 110, 0, 0, 1186, 1187, 5, 116, 0, 0, 1187, 1188, 5, 101, 0, 0, 1188, 1189, 5, 114, 0, 0, 1189, 1190, 5, 102, 0, 0, 1190, 1191, 5, 97, 0, 0, 1191, 1192, 5, 99, 0, 0, 1192, 1193, 5, 101, 0, 0, 1193, 1194, 5, 45, 0, 0, 1194, 1195, 5, 114, 0, 0, 1195, 1196, 5, 101, 0, 0, 1196, 1197, 5, 102, 0, 0, 1197, 224, 1, 0, 0, 0, 1198, 1199, 5, 111, 0, 0, 1199, 1200, 5, 112, 0, 0, 1200, 1201, 5, 116, 0, 0, 1201, 1202, 5, 105, 0, 0, 1202, 1203, 5, 111, 0, 0, 1203, 1204, 5, 110, 0, 0, 1204, 1205, 5, 97, 0, 0, 1205, 1206, 5, 108, 0, 0, 1206, 226, 1, 0, 0, 0, 1207, 1208, 5, 108, 0, 0, 1208, 1209, 5, 105, 0, 0, 1209, 1210, 5, 115, 0, 0, 1210, 1211, 5, 116, 0, 0, 1211, 228, 1, 0, 0, 0, 1212, 1213, 5, 114, 0, 0, 1213, 1214, 5, 101, 0, 0, 1214, 1215, 5, 99, 0, 0, 1215, 1216, 5, 111, 0, 0, 1216, 1217, 5, 114, 0, 0, 1217, 1218, 5, 100, 0, 0, 1218, 230, 1, 0, 0, 0, 1219, 1220, 5, 98, 0, 0, 1220, 1221, 5, 111, 0, 0, 1221, 1222, 5, 111, 0, 0, 1222, 1223, 5, 108, 0, 0, 1223, 232, 1, 0, 0, 0, 1224, 1225, 5, 98, 0, 0, 1225, 1226, 5, 121, 0, 0, 1226, 1227, 5, 116, 0, 0, 1227, 1228, 5, 101, 0, 0, 1228, 1229, 5, 115, 0, 0, 1229, 234, 1, 0, 0, 0, 1230, 1231, 5, 100, 0, 0, 1231, 1232, 5, 111, 0, 0, 1232, 1233, 5, 117, 0, 0, 1233, 1234, 5, 98, 0, 0, 1234, 1235, 5, 108, 0, 0, 1235, 1236, 5, 101, 0, 0, 1236, 236, 1, 0, 0, 0, 1237, 1238, 5, 105, 0, 0, 1238, 1239, 5, 110, 0, 0, 1239, 1240, 5, 116, 0, 0, 1240, 1241, 5, 51, 0, 0, 1241, 1242, 5, 50, 0, 0, 1242, 238, 1, 0, 0, 0, 1243, 1244, 5, 105, 0, 0, 1244, 1245, 5, 110, 0, 0, 1245, 1246, 5, 116, 0, 0, 1246, 1247, 5, 54, 0, 0, 1247, 1248, 5, 52, 0, 0, 1248, 240, 1, 0, 0, 0, 1249, 1250, 5, 115, 0, 0, 1250, 1251, 5, 116, 0, 0, 1251, 1252, 5, 114, 0, 0, 1252, 1253, 5, 105, 0, 0, 1253, 1254, 5, 110, 0, 0, 1254, 1255, 5, 103, 0, 0, 1255, 242, 1, 0, 0, 0, 1256, 1257, 5, 117, 0, 0, 1257, 1258, 5, 105, 0, 0, 1258, 1259, 5, 110, 0, 0, 1259, 1260, 5, 116, 0, 0, 1260, 1261, 5, 51, 0, 0, 1261, 1262, 5, 50, 0, 0, 1262, 244, 1, 0, 0, 0, 1263, 1264, 5, 117, 0, 0, 1264, 1265, 5, 105, 0, 0, 1265, 1266, 5, 110, 0, 0, 1266, 1267, 5, 116, 0, 0, 1267, 1268, 5, 54, 0, 0, 1268, 1269, 5, 52, 0, 0, 1269, 246, 1, 0, 0, 0, 1270, 1271, 5, 116, 0, 0, 1271, 1272, 5, 114, 0, 0, 1272, 1273, 5, 117, 0, 0, 1273, 1274, 5, 101, 0, 0, 1274, 248, 1, 0, 0, 0, 1275, 1276, 5, 102, 0, 0, 1276, 1277, 5, 97, 0, 0, 1277, 1278, 5, 108, 0, 0, 1278, 1279, 5, 115, 0, 0, 1279, 1280, 5, 101, 0, 0, 1280, 250, 1, 0, 0, 0, 1281, 1282, 5, 110, 0, 0, 1282, 1283, 5, 117, 0, 0, 1283, 1284, 5, 108, 0, 0, 1284, 1285, 5, 108, 0, 0, 1285, 252, 1, 0, 0, 0, 1286, 1287, 5, 45, 0, 0, 1287, 1288, 5, 62, 0, 0, 1288, 254, 1, 0, 0, 0, 1289, 1290, 5, 58, 0, 0, 1290, 256, 1, 0, 0, 0, 1291, 1292, 5, 59, 0, 0, 1292, 258, 1, 0, 0, 0, 1293, 1294, 5, 44, 0, 0, 1294, 260, 1, 0, 0, 0, 1295, 1296, 5, 46, 0, 0, 1296, 262, 1, 0, 0, 0, 1297, 1298, 5, 123, 0, 0, 1298, 264, 1, 0, 0, 0, 1299, 1300, 5, 125, 0, 0, 1300, 266, 1, 0, 0, 0, 1301, 1302, 5, 91, 0, 0, 1302, 268, 1, 0, 0, 0, 1303, 1304, 5, 93, 0, 0, 1304, 270, 1, 0, 0, 0, 1305, 1306, 5, 40, 0, 0, 1306, 272, 1, 0, 0, 0, 1307, 1308, 5, 41, 0, 0, 1308, 274, 1, 0, 0, 0, 1309, 1310, 5, 60, 0, 0, 1310, 276, 1, 0, 0, 0, 1311, 1312, 5, 62, 0, 0, 1312, 278, 1, 0, 0, 0, 1313, 1314, 5, 38, 0, 0, 1314, 280, 1, 0, 0, 0, 1315, 1316, 5, 61, 0, 0, 1316, 282, 1, 0, 0, 0, 1317, 1319, 5, 45, 0, 0, 1318, 1317, 1, 0, 0, 0, 1318, 1319, 1, 0, 0, 0, 1319, 1321, 1, 0, 0, 0, 1320, 1322, 7, 0, 0, 0, 1321, 1320, 1, 0, 0, 0, 1322, 1323, 1, 0, 0, 0, 1323, 1321, 1, 0, 0, 0, 1323, 1324, 1, 0, 0, 0, 1324, 284, 1, 0, 0, 0, 1325, 1327, 5, 45, 0, 0, 1326, 1325, 1, 0, 0, 0, 1326, 1327, 1, 0, 0, 0, 1327, 1336, 1, 0, 0, 0, 1328, 1337, 5, 48, 0, 0, 1329, 1333, 7, 1, 0, 0, 1330, 1332, 7, 0, 0, 0, 1331, 1330, 1, 0, 0, 0, 1332, 1335, 1, 0, 0, 0, 1333, 1331, 1, 0, 0, 0, 1333, 1334, 1, 0, 0, 0, 1334, 1337, 1, 0, 0, 0, 1335, 1333, 1, 0, 0, 0, 1336, 1328, 1, 0, 0, 0, 1336, 1329, 1, 0, 0, 0, 1337, 1344, 1, 0, 0, 0, 1338, 1340, 5, 46, 0, 0, 1339, 1341, 7, 0, 0, 0, 1340, 1339, 1, 0, 0, 0, 1341, 1342, 1, 0, 0, 0, 1342, 1340, 1, 0, 0, 0, 1342, 1343, 1, 0, 0, 0, 1343, 1345, 1, 0, 0, 0, 1344, 1338, 1, 0, 0, 0, 1344, 1345, 1, 0, 0, 0, 1345, 1355, 1, 0, 0, 0, 1346, 1348, 7, 2, 0, 0, 1347, 1349, 7, 3, 0, 0, 1348, 1347, 1, 0, 0, 0, 1348, 1349, 1, 0, 0, 0, 1349, 1351, 1, 0, 0, 0, 1350, 1352, 7, 0, 0, 0, 1351, 1350, 1, 0, 0, 0, 1352, 1353, 1, 0, 0, 0, 1353, 1351, 1, 0, 0, 0, 1353, 1354, 1, 0, 0, 0, 1354, 1356, 1, 0, 0, 0, 1355, 1346, 1, 0, 0, 0, 1355, 1356, 1, 0, 0, 0, 1356, 286, 1, 0, 0, 0, 1357, 1361, 7, 4, 0, 0, 1358, 1360, 7, 5, 0, 0, 1359, 1358, 1, 0, 0, 0, 1360, 1363, 1, 0, 0, 0, 1361, 1359, 1, 0, 0, 0, 1361, 1362, 1, 0, 0, 0, 1362, 288, 1, 0, 0, 0, 1363, 1361, 1, 0, 0, 0, 1364, 1369, 5, 34, 0, 0, 1365, 1368, 3, 291, 145, 0, 1366, 1368, 8, 6, 0, 0, 1367, 1365, 1, 0, 0, 0, 1367, 1366, 1, 0, 0, 0, 1368, 1371, 1, 0, 0, 0, 1369, 1367, 1, 0, 0, 0, 1369, 1370, 1, 0, 0, 0, 1370, 1372, 1, 0, 0, 0, 1371, 1369, 1, 0, 0, 0, 1372, 1373, 5, 34, 0, 0, 1373, 290, 1, 0, 0, 0, 1374, 1382, 5, 92, 0, 0, 1375, 1383, 7, 7, 0, 0, 1376, 1377, 5, 117, 0, 0, 1377, 1378, 3, 293, 146, 0, 1378, 1379, 3, 293, 146, 0, 1379, 1380, 3, 293, 146, 0, 1380, 1381, 3, 293, 146, 0, 1381, 1383, 1, 0, 0, 0, 1382, 1375, 1, 0, 0, 0, 1382, 1376, 1, 0, 0, 0, 1383, 292, 1, 0, 0, 0, 1384, 1385, 7, 8, 0, 0, 1385, 294, 1, 0, 0, 0, 1386, 1387, 5, 47, 0, 0, 1387, 1388, 5, 47, 0, 0, 1388, 1392, 1, 0, 0, 0, 1389, 1391, 8, 9, 0, 0, 1390, 1389, 1, 0, 0, 0, 1391, 1394, 1, 0, 0, 0, 1392, 1390, 1, 0, 0, 0, 1392, 1393, 1, 0, 0, 0, 1393, 1395, 1, 0, 0, 0, 1394, 1392, 1, 0, 0, 0, 1395, 1396, 6, 147, 0, 0, 1396, 296, 1, 0, 0, 0, 1397, 1398, 5, 47, 0, 0, 1398, 1399, 5, 42, 0, 0, 1399, 1403, 1, 0, 0, 0, 1400, 1402, 9, 0, 0, 0, 1401, 1400, 1, 0, 0, 0, 1402, 1405, 1, 0, 0, 0, 1403, 1404, 1, 0, 0, 0, 1403, 1401, 1, 0, 0, 0, 1404, 1406, 1, 0, 0, 0, 1405, 1403, 1, 0, 0, 0, 1406, 1407, 5, 42, 0, 0, 1407, 1408, 5, 47, 0, 0, 1408, 1409, 1, 0, 0, 0, 1409, 1410, 6, 148, 0, 0, 1410, 298, 1, 0, 0, 0, 1411, 1413, 7, 10, 0, 0, 1412, 1411, 1, 0, 0, 0, 1413, 1414, 1, 0, 0, 0, 1414, 1412, 1, 0, 0, 0, 1414, 1415, 1, 0, 0, 0, 1415, 1416, 1, 0, 0, 0, 1416, 1417, 6, 149, 0, 0, 1417, 300, 1, 0, 0, 0, 18, 0, 1318, 1323, 1326, 1333, 1336, 1342, 1344, 1348, 1353, 1355, 1361, 1367, 1369, 1382, 1392, 1403, 1414, 1, 0, 1, 0] \ No newline at end of file +[4, 0, 153, 1471, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 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, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 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, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 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, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 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, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 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, 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, 33, 1, 33, 1, 33, 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, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 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, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 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, 44, 1, 44, 1, 44, 1, 44, 1, 44, 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, 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, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 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, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 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, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 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, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 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, 65, 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, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 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, 73, 1, 74, 1, 74, 1, 74, 1, 74, 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, 75, 1, 76, 1, 76, 1, 76, 1, 76, 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, 77, 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, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 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, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 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, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 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, 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, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 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, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 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, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 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, 103, 1, 103, 1, 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, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 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, 144, 1, 144, 1, 145, 1, 145, 1, 146, 3, 146, 1372, 8, 146, 1, 146, 4, 146, 1375, 8, 146, 11, 146, 12, 146, 1376, 1, 147, 3, 147, 1380, 8, 147, 1, 147, 1, 147, 1, 147, 5, 147, 1385, 8, 147, 10, 147, 12, 147, 1388, 9, 147, 3, 147, 1390, 8, 147, 1, 147, 1, 147, 4, 147, 1394, 8, 147, 11, 147, 12, 147, 1395, 3, 147, 1398, 8, 147, 1, 147, 1, 147, 3, 147, 1402, 8, 147, 1, 147, 4, 147, 1405, 8, 147, 11, 147, 12, 147, 1406, 3, 147, 1409, 8, 147, 1, 148, 1, 148, 5, 148, 1413, 8, 148, 10, 148, 12, 148, 1416, 9, 148, 1, 149, 1, 149, 1, 149, 5, 149, 1421, 8, 149, 10, 149, 12, 149, 1424, 9, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 3, 150, 1436, 8, 150, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 5, 152, 1444, 8, 152, 10, 152, 12, 152, 1447, 9, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 5, 153, 1455, 8, 153, 10, 153, 12, 153, 1458, 9, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 4, 154, 1466, 8, 154, 11, 154, 12, 154, 1467, 1, 154, 1, 154, 1, 1456, 0, 155, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 143, 287, 144, 289, 145, 291, 146, 293, 147, 295, 148, 297, 149, 299, 150, 301, 0, 303, 0, 305, 151, 307, 152, 309, 153, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1485, 0, 1, 1, 0, 0, 0, 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, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 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, 305, 1, 0, 0, 0, 0, 307, 1, 0, 0, 0, 0, 309, 1, 0, 0, 0, 1, 311, 1, 0, 0, 0, 3, 316, 1, 0, 0, 0, 5, 326, 1, 0, 0, 0, 7, 339, 1, 0, 0, 0, 9, 347, 1, 0, 0, 0, 11, 355, 1, 0, 0, 0, 13, 359, 1, 0, 0, 0, 15, 368, 1, 0, 0, 0, 17, 379, 1, 0, 0, 0, 19, 389, 1, 0, 0, 0, 21, 399, 1, 0, 0, 0, 23, 408, 1, 0, 0, 0, 25, 420, 1, 0, 0, 0, 27, 427, 1, 0, 0, 0, 29, 435, 1, 0, 0, 0, 31, 444, 1, 0, 0, 0, 33, 452, 1, 0, 0, 0, 35, 458, 1, 0, 0, 0, 37, 463, 1, 0, 0, 0, 39, 476, 1, 0, 0, 0, 41, 486, 1, 0, 0, 0, 43, 498, 1, 0, 0, 0, 45, 504, 1, 0, 0, 0, 47, 515, 1, 0, 0, 0, 49, 526, 1, 0, 0, 0, 51, 531, 1, 0, 0, 0, 53, 540, 1, 0, 0, 0, 55, 550, 1, 0, 0, 0, 57, 555, 1, 0, 0, 0, 59, 559, 1, 0, 0, 0, 61, 565, 1, 0, 0, 0, 63, 570, 1, 0, 0, 0, 65, 580, 1, 0, 0, 0, 67, 584, 1, 0, 0, 0, 69, 597, 1, 0, 0, 0, 71, 602, 1, 0, 0, 0, 73, 609, 1, 0, 0, 0, 75, 618, 1, 0, 0, 0, 77, 629, 1, 0, 0, 0, 79, 633, 1, 0, 0, 0, 81, 642, 1, 0, 0, 0, 83, 649, 1, 0, 0, 0, 85, 658, 1, 0, 0, 0, 87, 663, 1, 0, 0, 0, 89, 673, 1, 0, 0, 0, 91, 684, 1, 0, 0, 0, 93, 692, 1, 0, 0, 0, 95, 698, 1, 0, 0, 0, 97, 707, 1, 0, 0, 0, 99, 717, 1, 0, 0, 0, 101, 726, 1, 0, 0, 0, 103, 738, 1, 0, 0, 0, 105, 749, 1, 0, 0, 0, 107, 755, 1, 0, 0, 0, 109, 763, 1, 0, 0, 0, 111, 766, 1, 0, 0, 0, 113, 771, 1, 0, 0, 0, 115, 778, 1, 0, 0, 0, 117, 781, 1, 0, 0, 0, 119, 789, 1, 0, 0, 0, 121, 796, 1, 0, 0, 0, 123, 802, 1, 0, 0, 0, 125, 807, 1, 0, 0, 0, 127, 818, 1, 0, 0, 0, 129, 823, 1, 0, 0, 0, 131, 829, 1, 0, 0, 0, 133, 836, 1, 0, 0, 0, 135, 840, 1, 0, 0, 0, 137, 852, 1, 0, 0, 0, 139, 855, 1, 0, 0, 0, 141, 862, 1, 0, 0, 0, 143, 865, 1, 0, 0, 0, 145, 872, 1, 0, 0, 0, 147, 880, 1, 0, 0, 0, 149, 887, 1, 0, 0, 0, 151, 898, 1, 0, 0, 0, 153, 905, 1, 0, 0, 0, 155, 914, 1, 0, 0, 0, 157, 929, 1, 0, 0, 0, 159, 939, 1, 0, 0, 0, 161, 949, 1, 0, 0, 0, 163, 962, 1, 0, 0, 0, 165, 968, 1, 0, 0, 0, 167, 985, 1, 0, 0, 0, 169, 988, 1, 0, 0, 0, 171, 992, 1, 0, 0, 0, 173, 997, 1, 0, 0, 0, 175, 1003, 1, 0, 0, 0, 177, 1012, 1, 0, 0, 0, 179, 1021, 1, 0, 0, 0, 181, 1025, 1, 0, 0, 0, 183, 1029, 1, 0, 0, 0, 185, 1033, 1, 0, 0, 0, 187, 1039, 1, 0, 0, 0, 189, 1045, 1, 0, 0, 0, 191, 1050, 1, 0, 0, 0, 193, 1055, 1, 0, 0, 0, 195, 1061, 1, 0, 0, 0, 197, 1069, 1, 0, 0, 0, 199, 1077, 1, 0, 0, 0, 201, 1088, 1, 0, 0, 0, 203, 1093, 1, 0, 0, 0, 205, 1105, 1, 0, 0, 0, 207, 1116, 1, 0, 0, 0, 209, 1126, 1, 0, 0, 0, 211, 1138, 1, 0, 0, 0, 213, 1147, 1, 0, 0, 0, 215, 1152, 1, 0, 0, 0, 217, 1165, 1, 0, 0, 0, 219, 1177, 1, 0, 0, 0, 221, 1189, 1, 0, 0, 0, 223, 1194, 1, 0, 0, 0, 225, 1202, 1, 0, 0, 0, 227, 1207, 1, 0, 0, 0, 229, 1220, 1, 0, 0, 0, 231, 1228, 1, 0, 0, 0, 233, 1237, 1, 0, 0, 0, 235, 1251, 1, 0, 0, 0, 237, 1260, 1, 0, 0, 0, 239, 1265, 1, 0, 0, 0, 241, 1272, 1, 0, 0, 0, 243, 1277, 1, 0, 0, 0, 245, 1283, 1, 0, 0, 0, 247, 1290, 1, 0, 0, 0, 249, 1296, 1, 0, 0, 0, 251, 1302, 1, 0, 0, 0, 253, 1309, 1, 0, 0, 0, 255, 1316, 1, 0, 0, 0, 257, 1323, 1, 0, 0, 0, 259, 1328, 1, 0, 0, 0, 261, 1334, 1, 0, 0, 0, 263, 1339, 1, 0, 0, 0, 265, 1342, 1, 0, 0, 0, 267, 1344, 1, 0, 0, 0, 269, 1346, 1, 0, 0, 0, 271, 1348, 1, 0, 0, 0, 273, 1350, 1, 0, 0, 0, 275, 1352, 1, 0, 0, 0, 277, 1354, 1, 0, 0, 0, 279, 1356, 1, 0, 0, 0, 281, 1358, 1, 0, 0, 0, 283, 1360, 1, 0, 0, 0, 285, 1362, 1, 0, 0, 0, 287, 1364, 1, 0, 0, 0, 289, 1366, 1, 0, 0, 0, 291, 1368, 1, 0, 0, 0, 293, 1371, 1, 0, 0, 0, 295, 1379, 1, 0, 0, 0, 297, 1410, 1, 0, 0, 0, 299, 1417, 1, 0, 0, 0, 301, 1427, 1, 0, 0, 0, 303, 1437, 1, 0, 0, 0, 305, 1439, 1, 0, 0, 0, 307, 1450, 1, 0, 0, 0, 309, 1465, 1, 0, 0, 0, 311, 312, 5, 101, 0, 0, 312, 313, 5, 100, 0, 0, 313, 314, 5, 105, 0, 0, 314, 315, 5, 116, 0, 0, 315, 2, 1, 0, 0, 0, 316, 317, 5, 99, 0, 0, 317, 318, 5, 111, 0, 0, 318, 319, 5, 109, 0, 0, 319, 320, 5, 112, 0, 0, 320, 321, 5, 111, 0, 0, 321, 322, 5, 110, 0, 0, 322, 323, 5, 101, 0, 0, 323, 324, 5, 110, 0, 0, 324, 325, 5, 116, 0, 0, 325, 4, 1, 0, 0, 0, 326, 327, 5, 112, 0, 0, 327, 328, 5, 114, 0, 0, 328, 329, 5, 101, 0, 0, 329, 330, 5, 115, 0, 0, 330, 331, 5, 101, 0, 0, 331, 332, 5, 110, 0, 0, 332, 333, 5, 116, 0, 0, 333, 334, 5, 97, 0, 0, 334, 335, 5, 116, 0, 0, 335, 336, 5, 105, 0, 0, 336, 337, 5, 111, 0, 0, 337, 338, 5, 110, 0, 0, 338, 6, 1, 0, 0, 0, 339, 340, 5, 115, 0, 0, 340, 341, 5, 117, 0, 0, 341, 342, 5, 98, 0, 0, 342, 343, 5, 106, 0, 0, 343, 344, 5, 101, 0, 0, 344, 345, 5, 99, 0, 0, 345, 346, 5, 116, 0, 0, 346, 8, 1, 0, 0, 0, 347, 348, 5, 114, 0, 0, 348, 349, 5, 117, 0, 0, 349, 350, 5, 110, 0, 0, 350, 351, 5, 116, 0, 0, 351, 352, 5, 105, 0, 0, 352, 353, 5, 109, 0, 0, 353, 354, 5, 101, 0, 0, 354, 10, 1, 0, 0, 0, 355, 356, 5, 102, 0, 0, 356, 357, 5, 111, 0, 0, 357, 358, 5, 114, 0, 0, 358, 12, 1, 0, 0, 0, 359, 360, 5, 99, 0, 0, 360, 361, 5, 114, 0, 0, 361, 362, 5, 101, 0, 0, 362, 363, 5, 97, 0, 0, 363, 364, 5, 116, 0, 0, 364, 365, 5, 105, 0, 0, 365, 366, 5, 111, 0, 0, 366, 367, 5, 110, 0, 0, 367, 14, 1, 0, 0, 0, 368, 369, 5, 105, 0, 0, 369, 370, 5, 110, 0, 0, 370, 371, 5, 105, 0, 0, 371, 372, 5, 116, 0, 0, 372, 373, 5, 105, 0, 0, 373, 374, 5, 97, 0, 0, 374, 375, 5, 108, 0, 0, 375, 376, 5, 105, 0, 0, 376, 377, 5, 122, 0, 0, 377, 378, 5, 101, 0, 0, 378, 16, 1, 0, 0, 0, 379, 380, 5, 119, 0, 0, 380, 381, 5, 111, 0, 0, 381, 382, 5, 114, 0, 0, 382, 383, 5, 107, 0, 0, 383, 384, 5, 115, 0, 0, 384, 385, 5, 112, 0, 0, 385, 386, 5, 97, 0, 0, 386, 387, 5, 99, 0, 0, 387, 388, 5, 101, 0, 0, 388, 18, 1, 0, 0, 0, 389, 390, 5, 101, 0, 0, 390, 391, 5, 120, 0, 0, 391, 392, 5, 101, 0, 0, 392, 393, 5, 99, 0, 0, 393, 394, 5, 117, 0, 0, 394, 395, 5, 116, 0, 0, 395, 396, 5, 105, 0, 0, 396, 397, 5, 111, 0, 0, 397, 398, 5, 110, 0, 0, 398, 20, 1, 0, 0, 0, 399, 400, 5, 115, 0, 0, 400, 401, 5, 110, 0, 0, 401, 402, 5, 97, 0, 0, 402, 403, 5, 112, 0, 0, 403, 404, 5, 115, 0, 0, 404, 405, 5, 104, 0, 0, 405, 406, 5, 111, 0, 0, 406, 407, 5, 116, 0, 0, 407, 22, 1, 0, 0, 0, 408, 409, 5, 116, 0, 0, 409, 410, 5, 114, 0, 0, 410, 411, 5, 97, 0, 0, 411, 412, 5, 110, 0, 0, 412, 413, 5, 115, 0, 0, 413, 414, 5, 97, 0, 0, 414, 415, 5, 99, 0, 0, 415, 416, 5, 116, 0, 0, 416, 417, 5, 105, 0, 0, 417, 418, 5, 111, 0, 0, 418, 419, 5, 110, 0, 0, 419, 24, 1, 0, 0, 0, 420, 421, 5, 114, 0, 0, 421, 422, 5, 101, 0, 0, 422, 423, 5, 109, 0, 0, 423, 424, 5, 111, 0, 0, 424, 425, 5, 116, 0, 0, 425, 426, 5, 101, 0, 0, 426, 26, 1, 0, 0, 0, 427, 428, 5, 116, 0, 0, 428, 429, 5, 97, 0, 0, 429, 430, 5, 114, 0, 0, 430, 431, 5, 103, 0, 0, 431, 432, 5, 101, 0, 0, 432, 433, 5, 116, 0, 0, 433, 434, 5, 115, 0, 0, 434, 28, 1, 0, 0, 0, 435, 436, 5, 112, 0, 0, 436, 437, 5, 111, 0, 0, 437, 438, 5, 114, 0, 0, 438, 439, 5, 116, 0, 0, 439, 440, 5, 97, 0, 0, 440, 441, 5, 98, 0, 0, 441, 442, 5, 108, 0, 0, 442, 443, 5, 101, 0, 0, 443, 30, 1, 0, 0, 0, 444, 445, 5, 114, 0, 0, 445, 446, 5, 101, 0, 0, 446, 447, 5, 112, 0, 0, 447, 448, 5, 108, 0, 0, 448, 449, 5, 105, 0, 0, 449, 450, 5, 99, 0, 0, 450, 451, 5, 97, 0, 0, 451, 32, 1, 0, 0, 0, 452, 453, 5, 108, 0, 0, 453, 454, 5, 111, 0, 0, 454, 455, 5, 99, 0, 0, 455, 456, 5, 97, 0, 0, 456, 457, 5, 108, 0, 0, 457, 34, 1, 0, 0, 0, 458, 459, 5, 102, 0, 0, 459, 460, 5, 114, 0, 0, 460, 461, 5, 111, 0, 0, 461, 462, 5, 109, 0, 0, 462, 36, 1, 0, 0, 0, 463, 464, 5, 114, 0, 0, 464, 465, 5, 101, 0, 0, 465, 466, 5, 115, 0, 0, 466, 467, 5, 117, 0, 0, 467, 468, 5, 108, 0, 0, 468, 469, 5, 116, 0, 0, 469, 470, 5, 45, 0, 0, 470, 471, 5, 98, 0, 0, 471, 472, 5, 121, 0, 0, 472, 473, 5, 116, 0, 0, 473, 474, 5, 101, 0, 0, 474, 475, 5, 115, 0, 0, 475, 38, 1, 0, 0, 0, 476, 477, 5, 114, 0, 0, 477, 478, 5, 112, 0, 0, 478, 479, 5, 99, 0, 0, 479, 480, 5, 45, 0, 0, 480, 481, 5, 99, 0, 0, 481, 482, 5, 97, 0, 0, 482, 483, 5, 108, 0, 0, 483, 484, 5, 108, 0, 0, 484, 485, 5, 115, 0, 0, 485, 40, 1, 0, 0, 0, 486, 487, 5, 100, 0, 0, 487, 488, 5, 101, 0, 0, 488, 489, 5, 97, 0, 0, 489, 490, 5, 100, 0, 0, 490, 491, 5, 108, 0, 0, 491, 492, 5, 105, 0, 0, 492, 493, 5, 110, 0, 0, 493, 494, 5, 101, 0, 0, 494, 495, 5, 45, 0, 0, 495, 496, 5, 109, 0, 0, 496, 497, 5, 115, 0, 0, 497, 42, 1, 0, 0, 0, 498, 499, 5, 113, 0, 0, 499, 500, 5, 117, 0, 0, 500, 501, 5, 101, 0, 0, 501, 502, 5, 114, 0, 0, 502, 503, 5, 121, 0, 0, 503, 44, 1, 0, 0, 0, 504, 505, 5, 114, 0, 0, 505, 506, 5, 101, 0, 0, 506, 507, 5, 102, 0, 0, 507, 508, 5, 108, 0, 0, 508, 509, 5, 101, 0, 0, 509, 510, 5, 99, 0, 0, 510, 511, 5, 116, 0, 0, 511, 512, 5, 105, 0, 0, 512, 513, 5, 111, 0, 0, 513, 514, 5, 110, 0, 0, 514, 46, 1, 0, 0, 0, 515, 516, 5, 115, 0, 0, 516, 517, 5, 112, 0, 0, 517, 518, 5, 101, 0, 0, 518, 519, 5, 99, 0, 0, 519, 520, 5, 105, 0, 0, 520, 521, 5, 97, 0, 0, 521, 522, 5, 108, 0, 0, 522, 523, 5, 105, 0, 0, 523, 524, 5, 122, 0, 0, 524, 525, 5, 101, 0, 0, 525, 48, 1, 0, 0, 0, 526, 527, 5, 114, 0, 0, 527, 528, 5, 111, 0, 0, 528, 529, 5, 111, 0, 0, 529, 530, 5, 116, 0, 0, 530, 50, 1, 0, 0, 0, 531, 532, 5, 100, 0, 0, 532, 533, 5, 111, 0, 0, 533, 534, 5, 99, 0, 0, 534, 535, 5, 117, 0, 0, 535, 536, 5, 109, 0, 0, 536, 537, 5, 101, 0, 0, 537, 538, 5, 110, 0, 0, 538, 539, 5, 116, 0, 0, 539, 52, 1, 0, 0, 0, 540, 541, 5, 102, 0, 0, 541, 542, 5, 114, 0, 0, 542, 543, 5, 97, 0, 0, 543, 544, 5, 103, 0, 0, 544, 545, 5, 109, 0, 0, 545, 546, 5, 101, 0, 0, 546, 547, 5, 110, 0, 0, 547, 548, 5, 116, 0, 0, 548, 549, 5, 115, 0, 0, 549, 54, 1, 0, 0, 0, 550, 551, 5, 118, 0, 0, 551, 552, 5, 105, 0, 0, 552, 553, 5, 101, 0, 0, 553, 554, 5, 119, 0, 0, 554, 56, 1, 0, 0, 0, 555, 556, 5, 109, 0, 0, 556, 557, 5, 97, 0, 0, 557, 558, 5, 120, 0, 0, 558, 58, 1, 0, 0, 0, 559, 560, 5, 97, 0, 0, 560, 561, 5, 108, 0, 0, 561, 562, 5, 108, 0, 0, 562, 563, 5, 111, 0, 0, 563, 564, 5, 119, 0, 0, 564, 60, 1, 0, 0, 0, 565, 566, 5, 112, 0, 0, 566, 567, 5, 111, 0, 0, 567, 568, 5, 108, 0, 0, 568, 569, 5, 108, 0, 0, 569, 62, 1, 0, 0, 0, 570, 571, 5, 113, 0, 0, 571, 572, 5, 117, 0, 0, 572, 573, 5, 101, 0, 0, 573, 574, 5, 114, 0, 0, 574, 575, 5, 121, 0, 0, 575, 576, 5, 97, 0, 0, 576, 577, 5, 98, 0, 0, 577, 578, 5, 108, 0, 0, 578, 579, 5, 101, 0, 0, 579, 64, 1, 0, 0, 0, 580, 581, 5, 114, 0, 0, 581, 582, 5, 112, 0, 0, 582, 583, 5, 99, 0, 0, 583, 66, 1, 0, 0, 0, 584, 585, 5, 113, 0, 0, 585, 586, 5, 117, 0, 0, 586, 587, 5, 101, 0, 0, 587, 588, 5, 114, 0, 0, 588, 589, 5, 121, 0, 0, 589, 590, 5, 45, 0, 0, 590, 591, 5, 114, 0, 0, 591, 592, 5, 101, 0, 0, 592, 593, 5, 97, 0, 0, 593, 594, 5, 115, 0, 0, 594, 595, 5, 111, 0, 0, 595, 596, 5, 110, 0, 0, 596, 68, 1, 0, 0, 0, 597, 598, 5, 116, 0, 0, 598, 599, 5, 121, 0, 0, 599, 600, 5, 112, 0, 0, 600, 601, 5, 101, 0, 0, 601, 70, 1, 0, 0, 0, 602, 603, 5, 111, 0, 0, 603, 604, 5, 98, 0, 0, 604, 605, 5, 106, 0, 0, 605, 606, 5, 101, 0, 0, 606, 607, 5, 99, 0, 0, 607, 608, 5, 116, 0, 0, 608, 72, 1, 0, 0, 0, 609, 610, 5, 115, 0, 0, 610, 611, 5, 116, 0, 0, 611, 612, 5, 111, 0, 0, 612, 613, 5, 114, 0, 0, 613, 614, 5, 97, 0, 0, 614, 615, 5, 98, 0, 0, 615, 616, 5, 108, 0, 0, 616, 617, 5, 101, 0, 0, 617, 74, 1, 0, 0, 0, 618, 619, 5, 105, 0, 0, 619, 620, 5, 109, 0, 0, 620, 621, 5, 112, 0, 0, 621, 622, 5, 108, 0, 0, 622, 623, 5, 101, 0, 0, 623, 624, 5, 109, 0, 0, 624, 625, 5, 101, 0, 0, 625, 626, 5, 110, 0, 0, 626, 627, 5, 116, 0, 0, 627, 628, 5, 115, 0, 0, 628, 76, 1, 0, 0, 0, 629, 630, 5, 114, 0, 0, 630, 631, 5, 101, 0, 0, 631, 632, 5, 102, 0, 0, 632, 78, 1, 0, 0, 0, 633, 634, 5, 102, 0, 0, 634, 635, 5, 114, 0, 0, 635, 636, 5, 97, 0, 0, 636, 637, 5, 103, 0, 0, 637, 638, 5, 109, 0, 0, 638, 639, 5, 101, 0, 0, 639, 640, 5, 110, 0, 0, 640, 641, 5, 116, 0, 0, 641, 80, 1, 0, 0, 0, 642, 643, 5, 105, 0, 0, 643, 644, 5, 109, 0, 0, 644, 645, 5, 112, 0, 0, 645, 646, 5, 111, 0, 0, 646, 647, 5, 114, 0, 0, 647, 648, 5, 116, 0, 0, 648, 82, 1, 0, 0, 0, 649, 650, 5, 101, 0, 0, 650, 651, 5, 120, 0, 0, 651, 652, 5, 116, 0, 0, 652, 653, 5, 101, 0, 0, 653, 654, 5, 114, 0, 0, 654, 655, 5, 110, 0, 0, 655, 656, 5, 97, 0, 0, 656, 657, 5, 108, 0, 0, 657, 84, 1, 0, 0, 0, 658, 659, 5, 97, 0, 0, 659, 660, 5, 116, 0, 0, 660, 661, 5, 111, 0, 0, 661, 662, 5, 109, 0, 0, 662, 86, 1, 0, 0, 0, 663, 664, 5, 105, 0, 0, 664, 665, 5, 110, 0, 0, 665, 666, 5, 116, 0, 0, 666, 667, 5, 101, 0, 0, 667, 668, 5, 114, 0, 0, 668, 669, 5, 102, 0, 0, 669, 670, 5, 97, 0, 0, 670, 671, 5, 99, 0, 0, 671, 672, 5, 101, 0, 0, 672, 88, 1, 0, 0, 0, 673, 674, 5, 105, 0, 0, 674, 675, 5, 110, 0, 0, 675, 676, 5, 116, 0, 0, 676, 677, 5, 101, 0, 0, 677, 678, 5, 114, 0, 0, 678, 679, 5, 102, 0, 0, 679, 680, 5, 97, 0, 0, 680, 681, 5, 99, 0, 0, 681, 682, 5, 101, 0, 0, 682, 683, 5, 115, 0, 0, 683, 90, 1, 0, 0, 0, 684, 685, 5, 112, 0, 0, 685, 686, 5, 97, 0, 0, 686, 687, 5, 99, 0, 0, 687, 688, 5, 107, 0, 0, 688, 689, 5, 97, 0, 0, 689, 690, 5, 103, 0, 0, 690, 691, 5, 101, 0, 0, 691, 92, 1, 0, 0, 0, 692, 693, 5, 118, 0, 0, 693, 694, 5, 97, 0, 0, 694, 695, 5, 108, 0, 0, 695, 696, 5, 117, 0, 0, 696, 697, 5, 101, 0, 0, 697, 94, 1, 0, 0, 0, 698, 699, 5, 114, 0, 0, 699, 700, 5, 101, 0, 0, 700, 701, 5, 108, 0, 0, 701, 702, 5, 97, 0, 0, 702, 703, 5, 116, 0, 0, 703, 704, 5, 105, 0, 0, 704, 705, 5, 111, 0, 0, 705, 706, 5, 110, 0, 0, 706, 96, 1, 0, 0, 0, 707, 708, 5, 111, 0, 0, 708, 709, 5, 112, 0, 0, 709, 710, 5, 101, 0, 0, 710, 711, 5, 114, 0, 0, 711, 712, 5, 97, 0, 0, 712, 713, 5, 116, 0, 0, 713, 714, 5, 105, 0, 0, 714, 715, 5, 111, 0, 0, 715, 716, 5, 110, 0, 0, 716, 98, 1, 0, 0, 0, 717, 718, 5, 102, 0, 0, 718, 719, 5, 117, 0, 0, 719, 720, 5, 110, 0, 0, 720, 721, 5, 99, 0, 0, 721, 722, 5, 116, 0, 0, 722, 723, 5, 105, 0, 0, 723, 724, 5, 111, 0, 0, 724, 725, 5, 110, 0, 0, 725, 100, 1, 0, 0, 0, 726, 727, 5, 99, 0, 0, 727, 728, 5, 111, 0, 0, 728, 729, 5, 110, 0, 0, 729, 730, 5, 115, 0, 0, 730, 731, 5, 116, 0, 0, 731, 732, 5, 114, 0, 0, 732, 733, 5, 117, 0, 0, 733, 734, 5, 99, 0, 0, 734, 735, 5, 116, 0, 0, 735, 736, 5, 111, 0, 0, 736, 737, 5, 114, 0, 0, 737, 102, 1, 0, 0, 0, 738, 739, 5, 99, 0, 0, 739, 740, 5, 111, 0, 0, 740, 741, 5, 110, 0, 0, 741, 742, 5, 115, 0, 0, 742, 743, 5, 116, 0, 0, 743, 744, 5, 114, 0, 0, 744, 745, 5, 117, 0, 0, 745, 746, 5, 99, 0, 0, 746, 747, 5, 116, 0, 0, 747, 748, 5, 115, 0, 0, 748, 104, 1, 0, 0, 0, 749, 750, 5, 105, 0, 0, 750, 751, 5, 110, 0, 0, 751, 752, 5, 112, 0, 0, 752, 753, 5, 117, 0, 0, 753, 754, 5, 116, 0, 0, 754, 106, 1, 0, 0, 0, 755, 756, 5, 99, 0, 0, 756, 757, 5, 111, 0, 0, 757, 758, 5, 110, 0, 0, 758, 759, 5, 102, 0, 0, 759, 760, 5, 111, 0, 0, 760, 761, 5, 114, 0, 0, 761, 762, 5, 109, 0, 0, 762, 108, 1, 0, 0, 0, 763, 764, 5, 97, 0, 0, 764, 765, 5, 115, 0, 0, 765, 110, 1, 0, 0, 0, 766, 767, 5, 98, 0, 0, 767, 768, 5, 105, 0, 0, 768, 769, 5, 110, 0, 0, 769, 770, 5, 100, 0, 0, 770, 112, 1, 0, 0, 0, 771, 772, 5, 115, 0, 0, 772, 773, 5, 116, 0, 0, 773, 774, 5, 97, 0, 0, 774, 775, 5, 116, 0, 0, 775, 776, 5, 105, 0, 0, 776, 777, 5, 99, 0, 0, 777, 114, 1, 0, 0, 0, 778, 779, 5, 116, 0, 0, 779, 780, 5, 111, 0, 0, 780, 116, 1, 0, 0, 0, 781, 782, 5, 112, 0, 0, 782, 783, 5, 114, 0, 0, 783, 784, 5, 105, 0, 0, 784, 785, 5, 118, 0, 0, 785, 786, 5, 97, 0, 0, 786, 787, 5, 116, 0, 0, 787, 788, 5, 101, 0, 0, 788, 118, 1, 0, 0, 0, 789, 790, 5, 115, 0, 0, 790, 791, 5, 104, 0, 0, 791, 792, 5, 97, 0, 0, 792, 793, 5, 114, 0, 0, 793, 794, 5, 101, 0, 0, 794, 795, 5, 100, 0, 0, 795, 120, 1, 0, 0, 0, 796, 797, 5, 115, 0, 0, 797, 798, 5, 116, 0, 0, 798, 799, 5, 97, 0, 0, 799, 800, 5, 116, 0, 0, 800, 801, 5, 101, 0, 0, 801, 122, 1, 0, 0, 0, 802, 803, 5, 101, 0, 0, 803, 804, 5, 100, 0, 0, 804, 805, 5, 103, 0, 0, 805, 806, 5, 101, 0, 0, 806, 124, 1, 0, 0, 0, 807, 808, 5, 112, 0, 0, 808, 809, 5, 114, 0, 0, 809, 810, 5, 111, 0, 0, 810, 811, 5, 106, 0, 0, 811, 812, 5, 101, 0, 0, 812, 813, 5, 99, 0, 0, 813, 814, 5, 116, 0, 0, 814, 815, 5, 105, 0, 0, 815, 816, 5, 111, 0, 0, 816, 817, 5, 110, 0, 0, 817, 126, 1, 0, 0, 0, 818, 819, 5, 119, 0, 0, 819, 820, 5, 105, 0, 0, 820, 821, 5, 116, 0, 0, 821, 822, 5, 104, 0, 0, 822, 128, 1, 0, 0, 0, 823, 824, 5, 117, 0, 0, 824, 825, 5, 115, 0, 0, 825, 826, 5, 105, 0, 0, 826, 827, 5, 110, 0, 0, 827, 828, 5, 103, 0, 0, 828, 130, 1, 0, 0, 0, 829, 830, 5, 97, 0, 0, 830, 831, 5, 99, 0, 0, 831, 832, 5, 99, 0, 0, 832, 833, 5, 101, 0, 0, 833, 834, 5, 112, 0, 0, 834, 835, 5, 116, 0, 0, 835, 132, 1, 0, 0, 0, 836, 837, 5, 118, 0, 0, 837, 838, 5, 105, 0, 0, 838, 839, 5, 97, 0, 0, 839, 134, 1, 0, 0, 0, 840, 841, 5, 109, 0, 0, 841, 842, 5, 97, 0, 0, 842, 843, 5, 116, 0, 0, 843, 844, 5, 101, 0, 0, 844, 845, 5, 114, 0, 0, 845, 846, 5, 105, 0, 0, 846, 847, 5, 97, 0, 0, 847, 848, 5, 108, 0, 0, 848, 849, 5, 105, 0, 0, 849, 850, 5, 122, 0, 0, 850, 851, 5, 101, 0, 0, 851, 136, 1, 0, 0, 0, 852, 853, 5, 105, 0, 0, 853, 854, 5, 102, 0, 0, 854, 138, 1, 0, 0, 0, 855, 856, 5, 97, 0, 0, 856, 857, 5, 98, 0, 0, 857, 858, 5, 115, 0, 0, 858, 859, 5, 101, 0, 0, 859, 860, 5, 110, 0, 0, 860, 861, 5, 116, 0, 0, 861, 140, 1, 0, 0, 0, 862, 863, 5, 111, 0, 0, 863, 864, 5, 110, 0, 0, 864, 142, 1, 0, 0, 0, 865, 866, 5, 112, 0, 0, 866, 867, 5, 111, 0, 0, 867, 868, 5, 108, 0, 0, 868, 869, 5, 105, 0, 0, 869, 870, 5, 99, 0, 0, 870, 871, 5, 121, 0, 0, 871, 144, 1, 0, 0, 0, 872, 873, 5, 100, 0, 0, 873, 874, 5, 101, 0, 0, 874, 875, 5, 102, 0, 0, 875, 876, 5, 97, 0, 0, 876, 877, 5, 117, 0, 0, 877, 878, 5, 108, 0, 0, 878, 879, 5, 116, 0, 0, 879, 146, 1, 0, 0, 0, 880, 881, 5, 115, 0, 0, 881, 882, 5, 111, 0, 0, 882, 883, 5, 117, 0, 0, 883, 884, 5, 114, 0, 0, 884, 885, 5, 99, 0, 0, 885, 886, 5, 101, 0, 0, 886, 148, 1, 0, 0, 0, 887, 888, 5, 114, 0, 0, 888, 889, 5, 101, 0, 0, 889, 890, 5, 112, 0, 0, 890, 891, 5, 111, 0, 0, 891, 892, 5, 115, 0, 0, 892, 893, 5, 105, 0, 0, 893, 894, 5, 116, 0, 0, 894, 895, 5, 111, 0, 0, 895, 896, 5, 114, 0, 0, 896, 897, 5, 121, 0, 0, 897, 150, 1, 0, 0, 0, 898, 899, 5, 99, 0, 0, 899, 900, 5, 111, 0, 0, 900, 901, 5, 109, 0, 0, 901, 902, 5, 109, 0, 0, 902, 903, 5, 105, 0, 0, 903, 904, 5, 116, 0, 0, 904, 152, 1, 0, 0, 0, 905, 906, 5, 114, 0, 0, 906, 907, 5, 101, 0, 0, 907, 908, 5, 118, 0, 0, 908, 909, 5, 105, 0, 0, 909, 910, 5, 115, 0, 0, 910, 911, 5, 105, 0, 0, 911, 912, 5, 111, 0, 0, 912, 913, 5, 110, 0, 0, 913, 154, 1, 0, 0, 0, 914, 915, 5, 115, 0, 0, 915, 916, 5, 101, 0, 0, 916, 917, 5, 109, 0, 0, 917, 918, 5, 97, 0, 0, 918, 919, 5, 110, 0, 0, 919, 920, 5, 116, 0, 0, 920, 921, 5, 105, 0, 0, 921, 922, 5, 99, 0, 0, 922, 923, 5, 45, 0, 0, 923, 924, 5, 109, 0, 0, 924, 925, 5, 97, 0, 0, 925, 926, 5, 106, 0, 0, 926, 927, 5, 111, 0, 0, 927, 928, 5, 114, 0, 0, 928, 156, 1, 0, 0, 0, 929, 930, 5, 111, 0, 0, 930, 931, 5, 110, 0, 0, 931, 932, 5, 45, 0, 0, 932, 933, 5, 100, 0, 0, 933, 934, 5, 101, 0, 0, 934, 935, 5, 108, 0, 0, 935, 936, 5, 101, 0, 0, 936, 937, 5, 116, 0, 0, 937, 938, 5, 101, 0, 0, 938, 158, 1, 0, 0, 0, 939, 940, 5, 108, 0, 0, 940, 941, 5, 105, 0, 0, 941, 942, 5, 102, 0, 0, 942, 943, 5, 101, 0, 0, 943, 944, 5, 99, 0, 0, 944, 945, 5, 121, 0, 0, 945, 946, 5, 99, 0, 0, 946, 947, 5, 108, 0, 0, 947, 948, 5, 101, 0, 0, 948, 160, 1, 0, 0, 0, 949, 950, 5, 114, 0, 0, 950, 951, 5, 101, 0, 0, 951, 952, 5, 116, 0, 0, 952, 953, 5, 97, 0, 0, 953, 954, 5, 105, 0, 0, 954, 955, 5, 110, 0, 0, 955, 956, 5, 45, 0, 0, 956, 957, 5, 111, 0, 0, 957, 958, 5, 116, 0, 0, 958, 959, 5, 104, 0, 0, 959, 960, 5, 101, 0, 0, 960, 961, 5, 114, 0, 0, 961, 162, 1, 0, 0, 0, 962, 963, 5, 107, 0, 0, 963, 964, 5, 101, 0, 0, 964, 965, 5, 121, 0, 0, 965, 966, 5, 101, 0, 0, 966, 967, 5, 100, 0, 0, 967, 164, 1, 0, 0, 0, 968, 969, 5, 112, 0, 0, 969, 970, 5, 117, 0, 0, 970, 971, 5, 98, 0, 0, 971, 972, 5, 108, 0, 0, 972, 973, 5, 105, 0, 0, 973, 974, 5, 99, 0, 0, 974, 975, 5, 45, 0, 0, 975, 976, 5, 116, 0, 0, 976, 977, 5, 114, 0, 0, 977, 978, 5, 97, 0, 0, 978, 979, 5, 118, 0, 0, 979, 980, 5, 101, 0, 0, 980, 981, 5, 114, 0, 0, 981, 982, 5, 115, 0, 0, 982, 983, 5, 97, 0, 0, 983, 984, 5, 108, 0, 0, 984, 166, 1, 0, 0, 0, 985, 986, 5, 105, 0, 0, 986, 987, 5, 100, 0, 0, 987, 168, 1, 0, 0, 0, 988, 989, 5, 100, 0, 0, 989, 990, 5, 111, 0, 0, 990, 991, 5, 99, 0, 0, 991, 170, 1, 0, 0, 0, 992, 993, 5, 109, 0, 0, 993, 994, 5, 111, 0, 0, 994, 995, 5, 100, 0, 0, 995, 996, 5, 101, 0, 0, 996, 172, 1, 0, 0, 0, 997, 998, 5, 101, 0, 0, 998, 999, 5, 109, 0, 0, 999, 1000, 5, 105, 0, 0, 1000, 1001, 5, 116, 0, 0, 1001, 1002, 5, 115, 0, 0, 1002, 174, 1, 0, 0, 0, 1003, 1004, 5, 114, 0, 0, 1004, 1005, 5, 101, 0, 0, 1005, 1006, 5, 99, 0, 0, 1006, 1007, 5, 101, 0, 0, 1007, 1008, 5, 105, 0, 0, 1008, 1009, 5, 118, 0, 0, 1009, 1010, 5, 101, 0, 0, 1010, 1011, 5, 114, 0, 0, 1011, 176, 1, 0, 0, 0, 1012, 1013, 5, 114, 0, 0, 1013, 1014, 5, 101, 0, 0, 1014, 1015, 5, 113, 0, 0, 1015, 1016, 5, 117, 0, 0, 1016, 1017, 5, 105, 0, 0, 1017, 1018, 5, 114, 0, 0, 1018, 1019, 5, 101, 0, 0, 1019, 1020, 5, 115, 0, 0, 1020, 178, 1, 0, 0, 0, 1021, 1022, 5, 97, 0, 0, 1022, 1023, 5, 110, 0, 0, 1023, 1024, 5, 121, 0, 0, 1024, 180, 1, 0, 0, 0, 1025, 1026, 5, 103, 0, 0, 1026, 1027, 5, 101, 0, 0, 1027, 1028, 5, 116, 0, 0, 1028, 182, 1, 0, 0, 0, 1029, 1030, 5, 115, 0, 0, 1030, 1031, 5, 101, 0, 0, 1031, 1032, 5, 116, 0, 0, 1032, 184, 1, 0, 0, 0, 1033, 1034, 5, 119, 0, 0, 1034, 1035, 5, 97, 0, 0, 1035, 1036, 5, 116, 0, 0, 1036, 1037, 5, 99, 0, 0, 1037, 1038, 5, 104, 0, 0, 1038, 186, 1, 0, 0, 0, 1039, 1040, 5, 115, 0, 0, 1040, 1041, 5, 116, 0, 0, 1041, 1042, 5, 97, 0, 0, 1042, 1043, 5, 114, 0, 0, 1043, 1044, 5, 116, 0, 0, 1044, 188, 1, 0, 0, 0, 1045, 1046, 5, 115, 0, 0, 1046, 1047, 5, 116, 0, 0, 1047, 1048, 5, 111, 0, 0, 1048, 1049, 5, 112, 0, 0, 1049, 190, 1, 0, 0, 0, 1050, 1051, 5, 114, 0, 0, 1051, 1052, 5, 101, 0, 0, 1052, 1053, 5, 97, 0, 0, 1053, 1054, 5, 100, 0, 0, 1054, 192, 1, 0, 0, 0, 1055, 1056, 5, 119, 0, 0, 1056, 1057, 5, 114, 0, 0, 1057, 1058, 5, 105, 0, 0, 1058, 1059, 5, 116, 0, 0, 1059, 1060, 5, 101, 0, 0, 1060, 194, 1, 0, 0, 0, 1061, 1062, 5, 114, 0, 0, 1062, 1063, 5, 101, 0, 0, 1063, 1064, 5, 115, 0, 0, 1064, 1065, 5, 111, 0, 0, 1065, 1066, 5, 108, 0, 0, 1066, 1067, 5, 118, 0, 0, 1067, 1068, 5, 101, 0, 0, 1068, 196, 1, 0, 0, 0, 1069, 1070, 5, 99, 0, 0, 1070, 1071, 5, 111, 0, 0, 1071, 1072, 5, 110, 0, 0, 1072, 1073, 5, 110, 0, 0, 1073, 1074, 5, 101, 0, 0, 1074, 1075, 5, 99, 0, 0, 1075, 1076, 5, 116, 0, 0, 1076, 198, 1, 0, 0, 0, 1077, 1078, 5, 100, 0, 0, 1078, 1079, 5, 105, 0, 0, 1079, 1080, 5, 115, 0, 0, 1080, 1081, 5, 99, 0, 0, 1081, 1082, 5, 111, 0, 0, 1082, 1083, 5, 110, 0, 0, 1083, 1084, 5, 110, 0, 0, 1084, 1085, 5, 101, 0, 0, 1085, 1086, 5, 99, 0, 0, 1086, 1087, 5, 116, 0, 0, 1087, 200, 1, 0, 0, 0, 1088, 1089, 5, 99, 0, 0, 1089, 1090, 5, 97, 0, 0, 1090, 1091, 5, 108, 0, 0, 1091, 1092, 5, 108, 0, 0, 1092, 202, 1, 0, 0, 0, 1093, 1094, 5, 119, 0, 0, 1094, 1095, 5, 97, 0, 0, 1095, 1096, 5, 116, 0, 0, 1096, 1097, 5, 99, 0, 0, 1097, 1098, 5, 104, 0, 0, 1098, 1099, 5, 45, 0, 0, 1099, 1100, 5, 115, 0, 0, 1100, 1101, 5, 116, 0, 0, 1101, 1102, 5, 97, 0, 0, 1102, 1103, 5, 114, 0, 0, 1103, 1104, 5, 116, 0, 0, 1104, 204, 1, 0, 0, 0, 1105, 1106, 5, 119, 0, 0, 1106, 1107, 5, 97, 0, 0, 1107, 1108, 5, 116, 0, 0, 1108, 1109, 5, 99, 0, 0, 1109, 1110, 5, 104, 0, 0, 1110, 1111, 5, 45, 0, 0, 1111, 1112, 5, 115, 0, 0, 1112, 1113, 5, 116, 0, 0, 1113, 1114, 5, 111, 0, 0, 1114, 1115, 5, 112, 0, 0, 1115, 206, 1, 0, 0, 0, 1116, 1117, 5, 115, 0, 0, 1117, 1118, 5, 117, 0, 0, 1118, 1119, 5, 98, 0, 0, 1119, 1120, 5, 115, 0, 0, 1120, 1121, 5, 99, 0, 0, 1121, 1122, 5, 114, 0, 0, 1122, 1123, 5, 105, 0, 0, 1123, 1124, 5, 98, 0, 0, 1124, 1125, 5, 101, 0, 0, 1125, 208, 1, 0, 0, 0, 1126, 1127, 5, 117, 0, 0, 1127, 1128, 5, 110, 0, 0, 1128, 1129, 5, 115, 0, 0, 1129, 1130, 5, 117, 0, 0, 1130, 1131, 5, 98, 0, 0, 1131, 1132, 5, 115, 0, 0, 1132, 1133, 5, 99, 0, 0, 1133, 1134, 5, 114, 0, 0, 1134, 1135, 5, 105, 0, 0, 1135, 1136, 5, 98, 0, 0, 1136, 1137, 5, 101, 0, 0, 1137, 210, 1, 0, 0, 0, 1138, 1139, 5, 114, 0, 0, 1139, 1140, 5, 101, 0, 0, 1140, 1141, 5, 103, 0, 0, 1141, 1142, 5, 105, 0, 0, 1142, 1143, 5, 115, 0, 0, 1143, 1144, 5, 116, 0, 0, 1144, 1145, 5, 101, 0, 0, 1145, 1146, 5, 114, 0, 0, 1146, 212, 1, 0, 0, 0, 1147, 1148, 5, 99, 0, 0, 1148, 1149, 5, 114, 0, 0, 1149, 1150, 5, 100, 0, 0, 1150, 1151, 5, 116, 0, 0, 1151, 214, 1, 0, 0, 0, 1152, 1153, 5, 111, 0, 0, 1153, 1154, 5, 112, 0, 0, 1154, 1155, 5, 116, 0, 0, 1155, 1156, 5, 105, 0, 0, 1156, 1157, 5, 111, 0, 0, 1157, 1158, 5, 110, 0, 0, 1158, 1159, 5, 97, 0, 0, 1159, 1160, 5, 108, 0, 0, 1160, 1161, 5, 45, 0, 0, 1161, 1162, 5, 111, 0, 0, 1162, 1163, 5, 110, 0, 0, 1163, 1164, 5, 101, 0, 0, 1164, 216, 1, 0, 0, 0, 1165, 1166, 5, 101, 0, 0, 1166, 1167, 5, 120, 0, 0, 1167, 1168, 5, 97, 0, 0, 1168, 1169, 5, 99, 0, 0, 1169, 1170, 5, 116, 0, 0, 1170, 1171, 5, 108, 0, 0, 1171, 1172, 5, 121, 0, 0, 1172, 1173, 5, 45, 0, 0, 1173, 1174, 5, 111, 0, 0, 1174, 1175, 5, 110, 0, 0, 1175, 1176, 5, 101, 0, 0, 1176, 218, 1, 0, 0, 0, 1177, 1178, 5, 109, 0, 0, 1178, 1179, 5, 97, 0, 0, 1179, 1180, 5, 110, 0, 0, 1180, 1181, 5, 121, 0, 0, 1181, 1182, 5, 45, 0, 0, 1182, 1183, 5, 117, 0, 0, 1183, 1184, 5, 110, 0, 0, 1184, 1185, 5, 105, 0, 0, 1185, 1186, 5, 113, 0, 0, 1186, 1187, 5, 117, 0, 0, 1187, 1188, 5, 101, 0, 0, 1188, 220, 1, 0, 0, 0, 1189, 1190, 5, 109, 0, 0, 1190, 1191, 5, 97, 0, 0, 1191, 1192, 5, 110, 0, 0, 1192, 1193, 5, 121, 0, 0, 1193, 222, 1, 0, 0, 0, 1194, 1195, 5, 111, 0, 0, 1195, 1196, 5, 114, 0, 0, 1196, 1197, 5, 100, 0, 0, 1197, 1198, 5, 101, 0, 0, 1198, 1199, 5, 114, 0, 0, 1199, 1200, 5, 101, 0, 0, 1200, 1201, 5, 100, 0, 0, 1201, 224, 1, 0, 0, 0, 1202, 1203, 5, 117, 0, 0, 1203, 1204, 5, 110, 0, 0, 1204, 1205, 5, 105, 0, 0, 1205, 1206, 5, 116, 0, 0, 1206, 226, 1, 0, 0, 0, 1207, 1208, 5, 119, 0, 0, 1208, 1209, 5, 97, 0, 0, 1209, 1210, 5, 116, 0, 0, 1210, 1211, 5, 99, 0, 0, 1211, 1212, 5, 104, 0, 0, 1212, 1213, 5, 45, 0, 0, 1213, 1214, 5, 104, 0, 0, 1214, 1215, 5, 97, 0, 0, 1215, 1216, 5, 110, 0, 0, 1216, 1217, 5, 100, 0, 0, 1217, 1218, 5, 108, 0, 0, 1218, 1219, 5, 101, 0, 0, 1219, 228, 1, 0, 0, 0, 1220, 1221, 5, 109, 0, 0, 1221, 1222, 5, 101, 0, 0, 1222, 1223, 5, 115, 0, 0, 1223, 1224, 5, 115, 0, 0, 1224, 1225, 5, 97, 0, 0, 1225, 1226, 5, 103, 0, 0, 1226, 1227, 5, 101, 0, 0, 1227, 230, 1, 0, 0, 0, 1228, 1229, 5, 97, 0, 0, 1229, 1230, 5, 116, 0, 0, 1230, 1231, 5, 111, 0, 0, 1231, 1232, 5, 109, 0, 0, 1232, 1233, 5, 45, 0, 0, 1233, 1234, 5, 114, 0, 0, 1234, 1235, 5, 101, 0, 0, 1235, 1236, 5, 102, 0, 0, 1236, 232, 1, 0, 0, 0, 1237, 1238, 5, 105, 0, 0, 1238, 1239, 5, 110, 0, 0, 1239, 1240, 5, 116, 0, 0, 1240, 1241, 5, 101, 0, 0, 1241, 1242, 5, 114, 0, 0, 1242, 1243, 5, 102, 0, 0, 1243, 1244, 5, 97, 0, 0, 1244, 1245, 5, 99, 0, 0, 1245, 1246, 5, 101, 0, 0, 1246, 1247, 5, 45, 0, 0, 1247, 1248, 5, 114, 0, 0, 1248, 1249, 5, 101, 0, 0, 1249, 1250, 5, 102, 0, 0, 1250, 234, 1, 0, 0, 0, 1251, 1252, 5, 111, 0, 0, 1252, 1253, 5, 112, 0, 0, 1253, 1254, 5, 116, 0, 0, 1254, 1255, 5, 105, 0, 0, 1255, 1256, 5, 111, 0, 0, 1256, 1257, 5, 110, 0, 0, 1257, 1258, 5, 97, 0, 0, 1258, 1259, 5, 108, 0, 0, 1259, 236, 1, 0, 0, 0, 1260, 1261, 5, 108, 0, 0, 1261, 1262, 5, 105, 0, 0, 1262, 1263, 5, 115, 0, 0, 1263, 1264, 5, 116, 0, 0, 1264, 238, 1, 0, 0, 0, 1265, 1266, 5, 114, 0, 0, 1266, 1267, 5, 101, 0, 0, 1267, 1268, 5, 99, 0, 0, 1268, 1269, 5, 111, 0, 0, 1269, 1270, 5, 114, 0, 0, 1270, 1271, 5, 100, 0, 0, 1271, 240, 1, 0, 0, 0, 1272, 1273, 5, 98, 0, 0, 1273, 1274, 5, 111, 0, 0, 1274, 1275, 5, 111, 0, 0, 1275, 1276, 5, 108, 0, 0, 1276, 242, 1, 0, 0, 0, 1277, 1278, 5, 98, 0, 0, 1278, 1279, 5, 121, 0, 0, 1279, 1280, 5, 116, 0, 0, 1280, 1281, 5, 101, 0, 0, 1281, 1282, 5, 115, 0, 0, 1282, 244, 1, 0, 0, 0, 1283, 1284, 5, 100, 0, 0, 1284, 1285, 5, 111, 0, 0, 1285, 1286, 5, 117, 0, 0, 1286, 1287, 5, 98, 0, 0, 1287, 1288, 5, 108, 0, 0, 1288, 1289, 5, 101, 0, 0, 1289, 246, 1, 0, 0, 0, 1290, 1291, 5, 105, 0, 0, 1291, 1292, 5, 110, 0, 0, 1292, 1293, 5, 116, 0, 0, 1293, 1294, 5, 51, 0, 0, 1294, 1295, 5, 50, 0, 0, 1295, 248, 1, 0, 0, 0, 1296, 1297, 5, 105, 0, 0, 1297, 1298, 5, 110, 0, 0, 1298, 1299, 5, 116, 0, 0, 1299, 1300, 5, 54, 0, 0, 1300, 1301, 5, 52, 0, 0, 1301, 250, 1, 0, 0, 0, 1302, 1303, 5, 115, 0, 0, 1303, 1304, 5, 116, 0, 0, 1304, 1305, 5, 114, 0, 0, 1305, 1306, 5, 105, 0, 0, 1306, 1307, 5, 110, 0, 0, 1307, 1308, 5, 103, 0, 0, 1308, 252, 1, 0, 0, 0, 1309, 1310, 5, 117, 0, 0, 1310, 1311, 5, 105, 0, 0, 1311, 1312, 5, 110, 0, 0, 1312, 1313, 5, 116, 0, 0, 1313, 1314, 5, 51, 0, 0, 1314, 1315, 5, 50, 0, 0, 1315, 254, 1, 0, 0, 0, 1316, 1317, 5, 117, 0, 0, 1317, 1318, 5, 105, 0, 0, 1318, 1319, 5, 110, 0, 0, 1319, 1320, 5, 116, 0, 0, 1320, 1321, 5, 54, 0, 0, 1321, 1322, 5, 52, 0, 0, 1322, 256, 1, 0, 0, 0, 1323, 1324, 5, 116, 0, 0, 1324, 1325, 5, 114, 0, 0, 1325, 1326, 5, 117, 0, 0, 1326, 1327, 5, 101, 0, 0, 1327, 258, 1, 0, 0, 0, 1328, 1329, 5, 102, 0, 0, 1329, 1330, 5, 97, 0, 0, 1330, 1331, 5, 108, 0, 0, 1331, 1332, 5, 115, 0, 0, 1332, 1333, 5, 101, 0, 0, 1333, 260, 1, 0, 0, 0, 1334, 1335, 5, 110, 0, 0, 1335, 1336, 5, 117, 0, 0, 1336, 1337, 5, 108, 0, 0, 1337, 1338, 5, 108, 0, 0, 1338, 262, 1, 0, 0, 0, 1339, 1340, 5, 45, 0, 0, 1340, 1341, 5, 62, 0, 0, 1341, 264, 1, 0, 0, 0, 1342, 1343, 5, 58, 0, 0, 1343, 266, 1, 0, 0, 0, 1344, 1345, 5, 59, 0, 0, 1345, 268, 1, 0, 0, 0, 1346, 1347, 5, 44, 0, 0, 1347, 270, 1, 0, 0, 0, 1348, 1349, 5, 46, 0, 0, 1349, 272, 1, 0, 0, 0, 1350, 1351, 5, 123, 0, 0, 1351, 274, 1, 0, 0, 0, 1352, 1353, 5, 125, 0, 0, 1353, 276, 1, 0, 0, 0, 1354, 1355, 5, 91, 0, 0, 1355, 278, 1, 0, 0, 0, 1356, 1357, 5, 93, 0, 0, 1357, 280, 1, 0, 0, 0, 1358, 1359, 5, 40, 0, 0, 1359, 282, 1, 0, 0, 0, 1360, 1361, 5, 41, 0, 0, 1361, 284, 1, 0, 0, 0, 1362, 1363, 5, 60, 0, 0, 1363, 286, 1, 0, 0, 0, 1364, 1365, 5, 62, 0, 0, 1365, 288, 1, 0, 0, 0, 1366, 1367, 5, 38, 0, 0, 1367, 290, 1, 0, 0, 0, 1368, 1369, 5, 61, 0, 0, 1369, 292, 1, 0, 0, 0, 1370, 1372, 5, 45, 0, 0, 1371, 1370, 1, 0, 0, 0, 1371, 1372, 1, 0, 0, 0, 1372, 1374, 1, 0, 0, 0, 1373, 1375, 7, 0, 0, 0, 1374, 1373, 1, 0, 0, 0, 1375, 1376, 1, 0, 0, 0, 1376, 1374, 1, 0, 0, 0, 1376, 1377, 1, 0, 0, 0, 1377, 294, 1, 0, 0, 0, 1378, 1380, 5, 45, 0, 0, 1379, 1378, 1, 0, 0, 0, 1379, 1380, 1, 0, 0, 0, 1380, 1389, 1, 0, 0, 0, 1381, 1390, 5, 48, 0, 0, 1382, 1386, 7, 1, 0, 0, 1383, 1385, 7, 0, 0, 0, 1384, 1383, 1, 0, 0, 0, 1385, 1388, 1, 0, 0, 0, 1386, 1384, 1, 0, 0, 0, 1386, 1387, 1, 0, 0, 0, 1387, 1390, 1, 0, 0, 0, 1388, 1386, 1, 0, 0, 0, 1389, 1381, 1, 0, 0, 0, 1389, 1382, 1, 0, 0, 0, 1390, 1397, 1, 0, 0, 0, 1391, 1393, 5, 46, 0, 0, 1392, 1394, 7, 0, 0, 0, 1393, 1392, 1, 0, 0, 0, 1394, 1395, 1, 0, 0, 0, 1395, 1393, 1, 0, 0, 0, 1395, 1396, 1, 0, 0, 0, 1396, 1398, 1, 0, 0, 0, 1397, 1391, 1, 0, 0, 0, 1397, 1398, 1, 0, 0, 0, 1398, 1408, 1, 0, 0, 0, 1399, 1401, 7, 2, 0, 0, 1400, 1402, 7, 3, 0, 0, 1401, 1400, 1, 0, 0, 0, 1401, 1402, 1, 0, 0, 0, 1402, 1404, 1, 0, 0, 0, 1403, 1405, 7, 0, 0, 0, 1404, 1403, 1, 0, 0, 0, 1405, 1406, 1, 0, 0, 0, 1406, 1404, 1, 0, 0, 0, 1406, 1407, 1, 0, 0, 0, 1407, 1409, 1, 0, 0, 0, 1408, 1399, 1, 0, 0, 0, 1408, 1409, 1, 0, 0, 0, 1409, 296, 1, 0, 0, 0, 1410, 1414, 7, 4, 0, 0, 1411, 1413, 7, 5, 0, 0, 1412, 1411, 1, 0, 0, 0, 1413, 1416, 1, 0, 0, 0, 1414, 1412, 1, 0, 0, 0, 1414, 1415, 1, 0, 0, 0, 1415, 298, 1, 0, 0, 0, 1416, 1414, 1, 0, 0, 0, 1417, 1422, 5, 34, 0, 0, 1418, 1421, 3, 301, 150, 0, 1419, 1421, 8, 6, 0, 0, 1420, 1418, 1, 0, 0, 0, 1420, 1419, 1, 0, 0, 0, 1421, 1424, 1, 0, 0, 0, 1422, 1420, 1, 0, 0, 0, 1422, 1423, 1, 0, 0, 0, 1423, 1425, 1, 0, 0, 0, 1424, 1422, 1, 0, 0, 0, 1425, 1426, 5, 34, 0, 0, 1426, 300, 1, 0, 0, 0, 1427, 1435, 5, 92, 0, 0, 1428, 1436, 7, 7, 0, 0, 1429, 1430, 5, 117, 0, 0, 1430, 1431, 3, 303, 151, 0, 1431, 1432, 3, 303, 151, 0, 1432, 1433, 3, 303, 151, 0, 1433, 1434, 3, 303, 151, 0, 1434, 1436, 1, 0, 0, 0, 1435, 1428, 1, 0, 0, 0, 1435, 1429, 1, 0, 0, 0, 1436, 302, 1, 0, 0, 0, 1437, 1438, 7, 8, 0, 0, 1438, 304, 1, 0, 0, 0, 1439, 1440, 5, 47, 0, 0, 1440, 1441, 5, 47, 0, 0, 1441, 1445, 1, 0, 0, 0, 1442, 1444, 8, 9, 0, 0, 1443, 1442, 1, 0, 0, 0, 1444, 1447, 1, 0, 0, 0, 1445, 1443, 1, 0, 0, 0, 1445, 1446, 1, 0, 0, 0, 1446, 1448, 1, 0, 0, 0, 1447, 1445, 1, 0, 0, 0, 1448, 1449, 6, 152, 0, 0, 1449, 306, 1, 0, 0, 0, 1450, 1451, 5, 47, 0, 0, 1451, 1452, 5, 42, 0, 0, 1452, 1456, 1, 0, 0, 0, 1453, 1455, 9, 0, 0, 0, 1454, 1453, 1, 0, 0, 0, 1455, 1458, 1, 0, 0, 0, 1456, 1457, 1, 0, 0, 0, 1456, 1454, 1, 0, 0, 0, 1457, 1459, 1, 0, 0, 0, 1458, 1456, 1, 0, 0, 0, 1459, 1460, 5, 42, 0, 0, 1460, 1461, 5, 47, 0, 0, 1461, 1462, 1, 0, 0, 0, 1462, 1463, 6, 153, 0, 0, 1463, 308, 1, 0, 0, 0, 1464, 1466, 7, 10, 0, 0, 1465, 1464, 1, 0, 0, 0, 1466, 1467, 1, 0, 0, 0, 1467, 1465, 1, 0, 0, 0, 1467, 1468, 1, 0, 0, 0, 1468, 1469, 1, 0, 0, 0, 1469, 1470, 6, 154, 0, 0, 1470, 310, 1, 0, 0, 0, 18, 0, 1371, 1376, 1379, 1386, 1389, 1395, 1397, 1401, 1406, 1408, 1414, 1420, 1422, 1435, 1445, 1456, 1467, 1, 0, 1, 0] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapabilityLexer.tokens b/src/capability-language/generated/QuixosCapabilityLexer.tokens index 56aff23..f1baa32 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.tokens +++ b/src/capability-language/generated/QuixosCapabilityLexer.tokens @@ -1,289 +1,299 @@ EDIT=1 -CREATION=2 -INITIALIZE=3 -WORKSPACE=4 -EXECUTION=5 -SNAPSHOT=6 -TRANSACTION=7 -REMOTE=8 -TARGETS=9 -PORTABLE=10 -REPLICA=11 -LOCAL=12 -FROM=13 -RESULT_BYTES=14 -RPC_CALLS=15 -DEADLINE_MS=16 -QUERY=17 -REFLECTION=18 -SPECIALIZE=19 -ROOT=20 -DOCUMENT=21 -FRAGMENTS=22 -VIEW=23 -MAX=24 -ALLOW=25 -POLL=26 -QUERYABLE=27 -RPC=28 -QUERY_REASON=29 -TYPE=30 -OBJECT=31 -STORABLE=32 -IMPLEMENTS=33 -REF=34 -FRAGMENT=35 -IMPORT=36 -EXTERNAL=37 -ATOM=38 -INTERFACE=39 -INTERFACES=40 -PACKAGE=41 -VALUE=42 -RELATION=43 -OPERATION=44 -FUNCTION=45 -CONSTRUCTOR=46 -CONSTRUCTS=47 -INPUT=48 -CONFORM=49 -AS=50 -BIND=51 -STATIC=52 -TO=53 -PRIVATE=54 -SHARED=55 -STATE=56 -EDGE=57 -PROJECTION=58 -WITH=59 -USING=60 -ACCEPT=61 -VIA=62 -MATERIALIZE=63 -IF=64 -ABSENT=65 -ON=66 -POLICY=67 -DEFAULT=68 -SOURCE=69 -REPOSITORY=70 -COMMIT=71 -REVISION=72 -SEMANTIC_MAJOR=73 -ON_DELETE=74 -LIFECYCLE=75 -RETAIN_OTHER=76 -KEYED=77 -PUBLIC_TRAVERSAL=78 -ID=79 -DOC=80 -MODE=81 -EMITS=82 -RECEIVER=83 -REQUIRES=84 -ANY=85 -GET=86 -SET=87 -WATCH=88 -START=89 -STOP=90 -READ=91 -WRITE=92 -RESOLVE=93 -CONNECT=94 -DISCONNECT=95 -CALL=96 -WATCH_START=97 -WATCH_STOP=98 -SUBSCRIBE=99 -UNSUBSCRIBE=100 -REGISTER=101 -CRDT=102 -OPTIONAL_ONE=103 -EXACTLY_ONE=104 -MANY_UNIQUE=105 -MANY=106 -ORDERED=107 -UNIT=108 -WATCH_HANDLE=109 -MESSAGE=110 -ATOM_REF=111 -INTERFACE_REF=112 -OPTIONAL=113 -LIST=114 -RECORD=115 -BOOL=116 -BYTES=117 -DOUBLE=118 -INT32=119 -INT64=120 -STRING=121 -UINT32=122 -UINT64=123 -TRUE=124 -FALSE=125 -NULL=126 -ARROW=127 -COLON=128 -SEMI=129 -COMMA=130 -DOT=131 -LBRACE=132 -RBRACE=133 -LBRACK=134 -RBRACK=135 -LPAREN=136 -RPAREN=137 -LT=138 -GT=139 -AMP=140 -EQUAL=141 -INTEGER=142 -JSON_NUMBER=143 -IDENTIFIER=144 -STRING_LITERAL=145 -LINE_COMMENT=146 -BLOCK_COMMENT=147 -WS=148 +COMPONENT=2 +PRESENTATION=3 +SUBJECT=4 +RUNTIME=5 +FOR=6 +CREATION=7 +INITIALIZE=8 +WORKSPACE=9 +EXECUTION=10 +SNAPSHOT=11 +TRANSACTION=12 +REMOTE=13 +TARGETS=14 +PORTABLE=15 +REPLICA=16 +LOCAL=17 +FROM=18 +RESULT_BYTES=19 +RPC_CALLS=20 +DEADLINE_MS=21 +QUERY=22 +REFLECTION=23 +SPECIALIZE=24 +ROOT=25 +DOCUMENT=26 +FRAGMENTS=27 +VIEW=28 +MAX=29 +ALLOW=30 +POLL=31 +QUERYABLE=32 +RPC=33 +QUERY_REASON=34 +TYPE=35 +OBJECT=36 +STORABLE=37 +IMPLEMENTS=38 +REF=39 +FRAGMENT=40 +IMPORT=41 +EXTERNAL=42 +ATOM=43 +INTERFACE=44 +INTERFACES=45 +PACKAGE=46 +VALUE=47 +RELATION=48 +OPERATION=49 +FUNCTION=50 +CONSTRUCTOR=51 +CONSTRUCTS=52 +INPUT=53 +CONFORM=54 +AS=55 +BIND=56 +STATIC=57 +TO=58 +PRIVATE=59 +SHARED=60 +STATE=61 +EDGE=62 +PROJECTION=63 +WITH=64 +USING=65 +ACCEPT=66 +VIA=67 +MATERIALIZE=68 +IF=69 +ABSENT=70 +ON=71 +POLICY=72 +DEFAULT=73 +SOURCE=74 +REPOSITORY=75 +COMMIT=76 +REVISION=77 +SEMANTIC_MAJOR=78 +ON_DELETE=79 +LIFECYCLE=80 +RETAIN_OTHER=81 +KEYED=82 +PUBLIC_TRAVERSAL=83 +ID=84 +DOC=85 +MODE=86 +EMITS=87 +RECEIVER=88 +REQUIRES=89 +ANY=90 +GET=91 +SET=92 +WATCH=93 +START=94 +STOP=95 +READ=96 +WRITE=97 +RESOLVE=98 +CONNECT=99 +DISCONNECT=100 +CALL=101 +WATCH_START=102 +WATCH_STOP=103 +SUBSCRIBE=104 +UNSUBSCRIBE=105 +REGISTER=106 +CRDT=107 +OPTIONAL_ONE=108 +EXACTLY_ONE=109 +MANY_UNIQUE=110 +MANY=111 +ORDERED=112 +UNIT=113 +WATCH_HANDLE=114 +MESSAGE=115 +ATOM_REF=116 +INTERFACE_REF=117 +OPTIONAL=118 +LIST=119 +RECORD=120 +BOOL=121 +BYTES=122 +DOUBLE=123 +INT32=124 +INT64=125 +STRING=126 +UINT32=127 +UINT64=128 +TRUE=129 +FALSE=130 +NULL=131 +ARROW=132 +COLON=133 +SEMI=134 +COMMA=135 +DOT=136 +LBRACE=137 +RBRACE=138 +LBRACK=139 +RBRACK=140 +LPAREN=141 +RPAREN=142 +LT=143 +GT=144 +AMP=145 +EQUAL=146 +INTEGER=147 +JSON_NUMBER=148 +IDENTIFIER=149 +STRING_LITERAL=150 +LINE_COMMENT=151 +BLOCK_COMMENT=152 +WS=153 'edit'=1 -'creation'=2 -'initialize'=3 -'workspace'=4 -'execution'=5 -'snapshot'=6 -'transaction'=7 -'remote'=8 -'targets'=9 -'portable'=10 -'replica'=11 -'local'=12 -'from'=13 -'result-bytes'=14 -'rpc-calls'=15 -'deadline-ms'=16 -'query'=17 -'reflection'=18 -'specialize'=19 -'root'=20 -'document'=21 -'fragments'=22 -'view'=23 -'max'=24 -'allow'=25 -'poll'=26 -'queryable'=27 -'rpc'=28 -'query-reason'=29 -'type'=30 -'object'=31 -'storable'=32 -'implements'=33 -'ref'=34 -'fragment'=35 -'import'=36 -'external'=37 -'atom'=38 -'interface'=39 -'interfaces'=40 -'package'=41 -'value'=42 -'relation'=43 -'operation'=44 -'function'=45 -'constructor'=46 -'constructs'=47 -'input'=48 -'conform'=49 -'as'=50 -'bind'=51 -'static'=52 -'to'=53 -'private'=54 -'shared'=55 -'state'=56 -'edge'=57 -'projection'=58 -'with'=59 -'using'=60 -'accept'=61 -'via'=62 -'materialize'=63 -'if'=64 -'absent'=65 -'on'=66 -'policy'=67 -'default'=68 -'source'=69 -'repository'=70 -'commit'=71 -'revision'=72 -'semantic-major'=73 -'on-delete'=74 -'lifecycle'=75 -'retain-other'=76 -'keyed'=77 -'public-traversal'=78 -'id'=79 -'doc'=80 -'mode'=81 -'emits'=82 -'receiver'=83 -'requires'=84 -'any'=85 -'get'=86 -'set'=87 -'watch'=88 -'start'=89 -'stop'=90 -'read'=91 -'write'=92 -'resolve'=93 -'connect'=94 -'disconnect'=95 -'call'=96 -'watch-start'=97 -'watch-stop'=98 -'subscribe'=99 -'unsubscribe'=100 -'register'=101 -'crdt'=102 -'optional-one'=103 -'exactly-one'=104 -'many-unique'=105 -'many'=106 -'ordered'=107 -'unit'=108 -'watch-handle'=109 -'message'=110 -'atom-ref'=111 -'interface-ref'=112 -'optional'=113 -'list'=114 -'record'=115 -'bool'=116 -'bytes'=117 -'double'=118 -'int32'=119 -'int64'=120 -'string'=121 -'uint32'=122 -'uint64'=123 -'true'=124 -'false'=125 -'null'=126 -'->'=127 -':'=128 -';'=129 -','=130 -'.'=131 -'{'=132 -'}'=133 -'['=134 -']'=135 -'('=136 -')'=137 -'<'=138 -'>'=139 -'&'=140 -'='=141 +'component'=2 +'presentation'=3 +'subject'=4 +'runtime'=5 +'for'=6 +'creation'=7 +'initialize'=8 +'workspace'=9 +'execution'=10 +'snapshot'=11 +'transaction'=12 +'remote'=13 +'targets'=14 +'portable'=15 +'replica'=16 +'local'=17 +'from'=18 +'result-bytes'=19 +'rpc-calls'=20 +'deadline-ms'=21 +'query'=22 +'reflection'=23 +'specialize'=24 +'root'=25 +'document'=26 +'fragments'=27 +'view'=28 +'max'=29 +'allow'=30 +'poll'=31 +'queryable'=32 +'rpc'=33 +'query-reason'=34 +'type'=35 +'object'=36 +'storable'=37 +'implements'=38 +'ref'=39 +'fragment'=40 +'import'=41 +'external'=42 +'atom'=43 +'interface'=44 +'interfaces'=45 +'package'=46 +'value'=47 +'relation'=48 +'operation'=49 +'function'=50 +'constructor'=51 +'constructs'=52 +'input'=53 +'conform'=54 +'as'=55 +'bind'=56 +'static'=57 +'to'=58 +'private'=59 +'shared'=60 +'state'=61 +'edge'=62 +'projection'=63 +'with'=64 +'using'=65 +'accept'=66 +'via'=67 +'materialize'=68 +'if'=69 +'absent'=70 +'on'=71 +'policy'=72 +'default'=73 +'source'=74 +'repository'=75 +'commit'=76 +'revision'=77 +'semantic-major'=78 +'on-delete'=79 +'lifecycle'=80 +'retain-other'=81 +'keyed'=82 +'public-traversal'=83 +'id'=84 +'doc'=85 +'mode'=86 +'emits'=87 +'receiver'=88 +'requires'=89 +'any'=90 +'get'=91 +'set'=92 +'watch'=93 +'start'=94 +'stop'=95 +'read'=96 +'write'=97 +'resolve'=98 +'connect'=99 +'disconnect'=100 +'call'=101 +'watch-start'=102 +'watch-stop'=103 +'subscribe'=104 +'unsubscribe'=105 +'register'=106 +'crdt'=107 +'optional-one'=108 +'exactly-one'=109 +'many-unique'=110 +'many'=111 +'ordered'=112 +'unit'=113 +'watch-handle'=114 +'message'=115 +'atom-ref'=116 +'interface-ref'=117 +'optional'=118 +'list'=119 +'record'=120 +'bool'=121 +'bytes'=122 +'double'=123 +'int32'=124 +'int64'=125 +'string'=126 +'uint32'=127 +'uint64'=128 +'true'=129 +'false'=130 +'null'=131 +'->'=132 +':'=133 +';'=134 +','=135 +'.'=136 +'{'=137 +'}'=138 +'['=139 +']'=140 +'('=141 +')'=142 +'<'=143 +'>'=144 +'&'=145 +'='=146 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.ts b/src/capability-language/generated/QuixosCapabilityLexer.ts index 2ce2b17..cd5e441 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.ts +++ b/src/capability-language/generated/QuixosCapabilityLexer.ts @@ -5,160 +5,166 @@ import { Token } from "antlr4ng"; export class QuixosCapabilityLexer extends antlr.Lexer { public static readonly EDIT = 1; - public static readonly CREATION = 2; - public static readonly INITIALIZE = 3; - public static readonly WORKSPACE = 4; - public static readonly EXECUTION = 5; - public static readonly SNAPSHOT = 6; - public static readonly TRANSACTION = 7; - public static readonly REMOTE = 8; - public static readonly TARGETS = 9; - public static readonly PORTABLE = 10; - public static readonly REPLICA = 11; - public static readonly LOCAL = 12; - public static readonly FROM = 13; - public static readonly RESULT_BYTES = 14; - public static readonly RPC_CALLS = 15; - public static readonly DEADLINE_MS = 16; - public static readonly QUERY = 17; - public static readonly REFLECTION = 18; - public static readonly SPECIALIZE = 19; - public static readonly ROOT = 20; - public static readonly DOCUMENT = 21; - public static readonly FRAGMENTS = 22; - public static readonly VIEW = 23; - public static readonly MAX = 24; - public static readonly ALLOW = 25; - public static readonly POLL = 26; - public static readonly QUERYABLE = 27; - public static readonly RPC = 28; - public static readonly QUERY_REASON = 29; - public static readonly TYPE = 30; - public static readonly OBJECT = 31; - public static readonly STORABLE = 32; - public static readonly IMPLEMENTS = 33; - public static readonly REF = 34; - public static readonly FRAGMENT = 35; - public static readonly IMPORT = 36; - public static readonly EXTERNAL = 37; - public static readonly ATOM = 38; - public static readonly INTERFACE = 39; - public static readonly INTERFACES = 40; - public static readonly PACKAGE = 41; - public static readonly VALUE = 42; - public static readonly RELATION = 43; - public static readonly OPERATION = 44; - public static readonly FUNCTION = 45; - public static readonly CONSTRUCTOR = 46; - public static readonly CONSTRUCTS = 47; - public static readonly INPUT = 48; - public static readonly CONFORM = 49; - public static readonly AS = 50; - public static readonly BIND = 51; - public static readonly STATIC = 52; - public static readonly TO = 53; - public static readonly PRIVATE = 54; - public static readonly SHARED = 55; - public static readonly STATE = 56; - public static readonly EDGE = 57; - public static readonly PROJECTION = 58; - public static readonly WITH = 59; - public static readonly USING = 60; - public static readonly ACCEPT = 61; - public static readonly VIA = 62; - public static readonly MATERIALIZE = 63; - public static readonly IF = 64; - public static readonly ABSENT = 65; - public static readonly ON = 66; - public static readonly POLICY = 67; - public static readonly DEFAULT = 68; - public static readonly SOURCE = 69; - public static readonly REPOSITORY = 70; - public static readonly COMMIT = 71; - public static readonly REVISION = 72; - public static readonly SEMANTIC_MAJOR = 73; - public static readonly ON_DELETE = 74; - public static readonly LIFECYCLE = 75; - public static readonly RETAIN_OTHER = 76; - public static readonly KEYED = 77; - public static readonly PUBLIC_TRAVERSAL = 78; - public static readonly ID = 79; - public static readonly DOC = 80; - public static readonly MODE = 81; - public static readonly EMITS = 82; - public static readonly RECEIVER = 83; - public static readonly REQUIRES = 84; - public static readonly ANY = 85; - public static readonly GET = 86; - public static readonly SET = 87; - public static readonly WATCH = 88; - public static readonly START = 89; - public static readonly STOP = 90; - public static readonly READ = 91; - public static readonly WRITE = 92; - public static readonly RESOLVE = 93; - public static readonly CONNECT = 94; - public static readonly DISCONNECT = 95; - public static readonly CALL = 96; - public static readonly WATCH_START = 97; - public static readonly WATCH_STOP = 98; - public static readonly SUBSCRIBE = 99; - public static readonly UNSUBSCRIBE = 100; - public static readonly REGISTER = 101; - public static readonly CRDT = 102; - public static readonly OPTIONAL_ONE = 103; - public static readonly EXACTLY_ONE = 104; - public static readonly MANY_UNIQUE = 105; - public static readonly MANY = 106; - public static readonly ORDERED = 107; - public static readonly UNIT = 108; - public static readonly WATCH_HANDLE = 109; - public static readonly MESSAGE = 110; - public static readonly ATOM_REF = 111; - public static readonly INTERFACE_REF = 112; - public static readonly OPTIONAL = 113; - public static readonly LIST = 114; - public static readonly RECORD = 115; - public static readonly BOOL = 116; - public static readonly BYTES = 117; - public static readonly DOUBLE = 118; - public static readonly INT32 = 119; - public static readonly INT64 = 120; - public static readonly STRING = 121; - public static readonly UINT32 = 122; - public static readonly UINT64 = 123; - public static readonly TRUE = 124; - public static readonly FALSE = 125; - public static readonly NULL = 126; - public static readonly ARROW = 127; - public static readonly COLON = 128; - public static readonly SEMI = 129; - public static readonly COMMA = 130; - public static readonly DOT = 131; - public static readonly LBRACE = 132; - public static readonly RBRACE = 133; - public static readonly LBRACK = 134; - public static readonly RBRACK = 135; - public static readonly LPAREN = 136; - public static readonly RPAREN = 137; - public static readonly LT = 138; - public static readonly GT = 139; - public static readonly AMP = 140; - public static readonly EQUAL = 141; - public static readonly INTEGER = 142; - public static readonly JSON_NUMBER = 143; - public static readonly IDENTIFIER = 144; - public static readonly STRING_LITERAL = 145; - public static readonly LINE_COMMENT = 146; - public static readonly BLOCK_COMMENT = 147; - public static readonly WS = 148; + public static readonly COMPONENT = 2; + public static readonly PRESENTATION = 3; + public static readonly SUBJECT = 4; + public static readonly RUNTIME = 5; + public static readonly FOR = 6; + public static readonly CREATION = 7; + public static readonly INITIALIZE = 8; + public static readonly WORKSPACE = 9; + public static readonly EXECUTION = 10; + public static readonly SNAPSHOT = 11; + public static readonly TRANSACTION = 12; + public static readonly REMOTE = 13; + public static readonly TARGETS = 14; + public static readonly PORTABLE = 15; + public static readonly REPLICA = 16; + public static readonly LOCAL = 17; + public static readonly FROM = 18; + public static readonly RESULT_BYTES = 19; + public static readonly RPC_CALLS = 20; + public static readonly DEADLINE_MS = 21; + public static readonly QUERY = 22; + public static readonly REFLECTION = 23; + public static readonly SPECIALIZE = 24; + public static readonly ROOT = 25; + public static readonly DOCUMENT = 26; + public static readonly FRAGMENTS = 27; + public static readonly VIEW = 28; + public static readonly MAX = 29; + public static readonly ALLOW = 30; + public static readonly POLL = 31; + public static readonly QUERYABLE = 32; + public static readonly RPC = 33; + public static readonly QUERY_REASON = 34; + public static readonly TYPE = 35; + public static readonly OBJECT = 36; + public static readonly STORABLE = 37; + public static readonly IMPLEMENTS = 38; + public static readonly REF = 39; + public static readonly FRAGMENT = 40; + public static readonly IMPORT = 41; + public static readonly EXTERNAL = 42; + public static readonly ATOM = 43; + public static readonly INTERFACE = 44; + public static readonly INTERFACES = 45; + public static readonly PACKAGE = 46; + public static readonly VALUE = 47; + public static readonly RELATION = 48; + public static readonly OPERATION = 49; + public static readonly FUNCTION = 50; + public static readonly CONSTRUCTOR = 51; + public static readonly CONSTRUCTS = 52; + public static readonly INPUT = 53; + public static readonly CONFORM = 54; + public static readonly AS = 55; + public static readonly BIND = 56; + public static readonly STATIC = 57; + public static readonly TO = 58; + public static readonly PRIVATE = 59; + public static readonly SHARED = 60; + public static readonly STATE = 61; + public static readonly EDGE = 62; + public static readonly PROJECTION = 63; + public static readonly WITH = 64; + public static readonly USING = 65; + public static readonly ACCEPT = 66; + public static readonly VIA = 67; + public static readonly MATERIALIZE = 68; + public static readonly IF = 69; + public static readonly ABSENT = 70; + public static readonly ON = 71; + public static readonly POLICY = 72; + public static readonly DEFAULT = 73; + public static readonly SOURCE = 74; + public static readonly REPOSITORY = 75; + public static readonly COMMIT = 76; + public static readonly REVISION = 77; + public static readonly SEMANTIC_MAJOR = 78; + public static readonly ON_DELETE = 79; + public static readonly LIFECYCLE = 80; + public static readonly RETAIN_OTHER = 81; + public static readonly KEYED = 82; + public static readonly PUBLIC_TRAVERSAL = 83; + public static readonly ID = 84; + public static readonly DOC = 85; + public static readonly MODE = 86; + public static readonly EMITS = 87; + public static readonly RECEIVER = 88; + public static readonly REQUIRES = 89; + public static readonly ANY = 90; + public static readonly GET = 91; + public static readonly SET = 92; + public static readonly WATCH = 93; + public static readonly START = 94; + public static readonly STOP = 95; + public static readonly READ = 96; + public static readonly WRITE = 97; + public static readonly RESOLVE = 98; + public static readonly CONNECT = 99; + public static readonly DISCONNECT = 100; + public static readonly CALL = 101; + public static readonly WATCH_START = 102; + public static readonly WATCH_STOP = 103; + public static readonly SUBSCRIBE = 104; + public static readonly UNSUBSCRIBE = 105; + public static readonly REGISTER = 106; + public static readonly CRDT = 107; + public static readonly OPTIONAL_ONE = 108; + public static readonly EXACTLY_ONE = 109; + public static readonly MANY_UNIQUE = 110; + public static readonly MANY = 111; + public static readonly ORDERED = 112; + public static readonly UNIT = 113; + public static readonly WATCH_HANDLE = 114; + public static readonly MESSAGE = 115; + public static readonly ATOM_REF = 116; + public static readonly INTERFACE_REF = 117; + public static readonly OPTIONAL = 118; + public static readonly LIST = 119; + public static readonly RECORD = 120; + public static readonly BOOL = 121; + public static readonly BYTES = 122; + public static readonly DOUBLE = 123; + public static readonly INT32 = 124; + public static readonly INT64 = 125; + public static readonly STRING = 126; + public static readonly UINT32 = 127; + public static readonly UINT64 = 128; + public static readonly TRUE = 129; + public static readonly FALSE = 130; + public static readonly NULL = 131; + public static readonly ARROW = 132; + public static readonly COLON = 133; + public static readonly SEMI = 134; + public static readonly COMMA = 135; + public static readonly DOT = 136; + public static readonly LBRACE = 137; + public static readonly RBRACE = 138; + public static readonly LBRACK = 139; + public static readonly RBRACK = 140; + public static readonly LPAREN = 141; + public static readonly RPAREN = 142; + public static readonly LT = 143; + public static readonly GT = 144; + public static readonly AMP = 145; + public static readonly EQUAL = 146; + public static readonly INTEGER = 147; + public static readonly JSON_NUMBER = 148; + public static readonly IDENTIFIER = 149; + public static readonly STRING_LITERAL = 150; + public static readonly LINE_COMMENT = 151; + public static readonly BLOCK_COMMENT = 152; + public static readonly WS = 153; public static readonly channelNames = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" ]; public static readonly literalNames = [ - null, "'edit'", "'creation'", "'initialize'", "'workspace'", "'execution'", + null, "'edit'", "'component'", "'presentation'", "'subject'", "'runtime'", + "'for'", "'creation'", "'initialize'", "'workspace'", "'execution'", "'snapshot'", "'transaction'", "'remote'", "'targets'", "'portable'", "'replica'", "'local'", "'from'", "'result-bytes'", "'rpc-calls'", "'deadline-ms'", "'query'", "'reflection'", "'specialize'", "'root'", @@ -186,21 +192,21 @@ export class QuixosCapabilityLexer extends antlr.Lexer { ]; public static readonly symbolicNames = [ - null, "EDIT", "CREATION", "INITIALIZE", "WORKSPACE", "EXECUTION", - "SNAPSHOT", "TRANSACTION", "REMOTE", "TARGETS", "PORTABLE", "REPLICA", - "LOCAL", "FROM", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", - "REFLECTION", "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", - "MAX", "ALLOW", "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", - "OBJECT", "STORABLE", "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", - "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", - "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", - "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", "PRIVATE", "SHARED", - "STATE", "EDGE", "PROJECTION", "WITH", "USING", "ACCEPT", "VIA", - "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", - "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", - "LIFECYCLE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", - "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", - "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", + null, "EDIT", "COMPONENT", "PRESENTATION", "SUBJECT", "RUNTIME", + "FOR", "CREATION", "INITIALIZE", "WORKSPACE", "EXECUTION", "SNAPSHOT", + "TRANSACTION", "REMOTE", "TARGETS", "PORTABLE", "REPLICA", "LOCAL", + "FROM", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", "REFLECTION", + "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", "MAX", "ALLOW", + "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", "OBJECT", "STORABLE", + "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", + "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", + "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", + "TO", "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", + "USING", "ACCEPT", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", + "DEFAULT", "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", + "ON_DELETE", "LIFECYCLE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", + "ID", "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", + "SET", "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", @@ -217,7 +223,8 @@ export class QuixosCapabilityLexer extends antlr.Lexer { ]; public static readonly ruleNames = [ - "EDIT", "CREATION", "INITIALIZE", "WORKSPACE", "EXECUTION", "SNAPSHOT", + "EDIT", "COMPONENT", "PRESENTATION", "SUBJECT", "RUNTIME", "FOR", + "CREATION", "INITIALIZE", "WORKSPACE", "EXECUTION", "SNAPSHOT", "TRANSACTION", "REMOTE", "TARGETS", "PORTABLE", "REPLICA", "LOCAL", "FROM", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", "REFLECTION", "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", "MAX", "ALLOW", @@ -261,7 +268,7 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public get modeNames(): string[] { return QuixosCapabilityLexer.modeNames; } public static readonly _serializedATN: number[] = [ - 4,0,148,1418,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, + 4,0,153,1471,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, @@ -285,503 +292,524 @@ export class QuixosCapabilityLexer extends antlr.Lexer { 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,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1, - 2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1, - 4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,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,7,1,7,1,7,1,7,1,7,1,7,1, - 7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1, - 9,1,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,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,13,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14, - 1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,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,17,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,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20, - 1,20,1,20,1,20,1,20,1,20,1,20,1,21,1,21,1,21,1,21,1,21,1,21,1,21, - 1,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,23,1,24, - 1,24,1,24,1,24,1,24,1,24,1,25,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,26,1,26,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,28,1,28,1,28,1,28,1,28,1,29,1,29, - 1,29,1,29,1,29,1,30,1,30,1,30,1,30,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,32,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,34,1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,36,1,36, - 1,36,1,36,1,36,1,36,1,36,1,36,1,36,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,38,1,38,1,38,1,39,1,39,1,39,1,39, + 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,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, + 1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4, + 1,4,1,4,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7, + 1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,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,9,1,9,1,9,1,9,1,9,1,10,1,10, + 1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,11, + 1,11,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12, + 1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14, + 1,14,1,14,1,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,18,1,18,1,18,1,18,1,18,1,19,1,19,1,19, + 1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20, + 1,20,1,20,1,20,1,20,1,20,1,20,1,21,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,23,1,23,1,24,1,24,1,24,1,24,1,24, + 1,25,1,25,1,25,1,25,1,25,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,26,1,26,1,27,1,27,1,27,1,27,1,27,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,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,33,1,33,1,33,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,35,1,35,1,35, + 1,36,1,36,1,36,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,37,1,37,1,37,1,37,1,38,1,38,1,38,1,38,1,39,1,39, 1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,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,42,1,42, - 1,42,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,44,1,44,1,44,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,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,46,1,47,1,47,1,47,1,47,1,47,1,47, - 1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,50,1,50, - 1,50,1,50,1,50,1,51,1,51,1,51,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,1,53,1,53,1,54,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,56,1,56,1,56,1,56,1,56, - 1,57,1,57,1,57,1,57,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,59,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60, - 1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,62, - 1,62,1,62,1,62,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,64,1,65,1,65,1,65,1,66,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,67,1,67,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,69,1,69, - 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,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,73,1,73, - 1,73,1,73,1,74,1,74,1,74,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,75,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,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77, - 1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,78,1,78,1,78,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,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,83,1,83,1,83,1,83,1,84,1,84,1,84,1,84,1,85,1,85,1,85, - 1,85,1,86,1,86,1,86,1,86,1,87,1,87,1,87,1,87,1,87,1,87,1,88,1,88, - 1,88,1,88,1,88,1,88,1,89,1,89,1,89,1,89,1,89,1,90,1,90,1,90,1,90, - 1,90,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,93,1,93,1,93,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,94,1,94,1,95,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,96,1,96,1,97, - 1,97,1,97,1,97,1,97,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,98,1,98,1,98,1,98,1,99,1,99,1,99,1,99,1,99,1,99, - 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,100,1,100,1,100,1,101,1,101,1,101,1,101,1,101,1,102,1,102,1,102, - 1,102,1,102,1,102,1,102,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,103,1,103,1,103,1,103,1,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,105,1,105,1,105,1,105,1,105,1,106,1,106,1,106,1,106,1,106, - 1,106,1,106,1,106,1,107,1,107,1,107,1,107,1,107,1,108,1,108,1,108, + 1,40,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,42,1,42,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,44, + 1,44,1,44,1,44,1,44,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,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,48,1,48,1,48, + 1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,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,50,1,50,1,50,1,50,1,51, + 1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,52,1,52,1,52, + 1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,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,56, + 1,57,1,57,1,57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,59,1,59, + 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,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62, + 1,62,1,63,1,63,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,65,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,67,1,67,1,68,1,68,1,68,1,69, + 1,69,1,69,1,69,1,69,1,69,1,69,1,70,1,70,1,70,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,73,1,74,1,74,1,74,1,74,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,75,1,76,1,76,1,76, + 1,76,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,77,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,78,1,78,1,78,1,79,1,79,1,79,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,80,1,80,1,80,1,80, + 1,80,1,80,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,82,1,82,1,82,1,82,1,82,1,82,1,82,1,83, + 1,83,1,83,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,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,89,1,89,1,89,1,89, + 1,90,1,90,1,90,1,90,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1,92,1,92, + 1,92,1,93,1,93,1,93,1,93,1,93,1,93,1,94,1,94,1,94,1,94,1,94,1,95, + 1,95,1,95,1,95,1,95,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,97,1,97,1,98,1,98,1,98,1,98,1,98,1,98,1,98,1,98, + 1,99,1,99,1,99,1,99,1,99,1,99,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,101,1,101, + 1,101,1,101,1,101,1,101,1,102,1,102,1,102,1,102,1,102,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,103,1,103,1,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,105,1,105,1,105,1,105,1,105,1,105,1,105, + 1,105,1,105,1,106,1,106,1,106,1,106,1,106,1,107,1,107,1,107,1,107, + 1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,108,1,108, 1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,109, - 1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,110,1,110,1,110,1,110, + 1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109, 1,110,1,110,1,110,1,110,1,110,1,111,1,111,1,111,1,111,1,111,1,111, - 1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,112,1,112,1,112, - 1,112,1,112,1,112,1,112,1,112,1,112,1,113,1,113,1,113,1,113,1,113, - 1,114,1,114,1,114,1,114,1,114,1,114,1,114,1,115,1,115,1,115,1,115, - 1,115,1,116,1,116,1,116,1,116,1,116,1,116,1,117,1,117,1,117,1,117, - 1,117,1,117,1,117,1,118,1,118,1,118,1,118,1,118,1,118,1,119,1,119, - 1,119,1,119,1,119,1,119,1,120,1,120,1,120,1,120,1,120,1,120,1,120, - 1,121,1,121,1,121,1,121,1,121,1,121,1,121,1,122,1,122,1,122,1,122, - 1,122,1,122,1,122,1,123,1,123,1,123,1,123,1,123,1,124,1,124,1,124, - 1,124,1,124,1,124,1,125,1,125,1,125,1,125,1,125,1,126,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,111,1,111,1,112,1,112,1,112,1,112,1,112,1,113,1,113,1,113,1,113, + 1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,114,1,114, + 1,114,1,114,1,114,1,114,1,114,1,114,1,115,1,115,1,115,1,115,1,115, + 1,115,1,115,1,115,1,115,1,116,1,116,1,116,1,116,1,116,1,116,1,116, + 1,116,1,116,1,116,1,116,1,116,1,116,1,116,1,117,1,117,1,117,1,117, + 1,117,1,117,1,117,1,117,1,117,1,118,1,118,1,118,1,118,1,118,1,119, + 1,119,1,119,1,119,1,119,1,119,1,119,1,120,1,120,1,120,1,120,1,120, + 1,121,1,121,1,121,1,121,1,121,1,121,1,122,1,122,1,122,1,122,1,122, + 1,122,1,122,1,123,1,123,1,123,1,123,1,123,1,123,1,124,1,124,1,124, + 1,124,1,124,1,124,1,125,1,125,1,125,1,125,1,125,1,125,1,125,1,126, + 1,126,1,126,1,126,1,126,1,126,1,126,1,127,1,127,1,127,1,127,1,127, + 1,127,1,127,1,128,1,128,1,128,1,128,1,128,1,129,1,129,1,129,1,129, + 1,129,1,129,1,130,1,130,1,130,1,130,1,130,1,131,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,3,141,1319,8,141,1,141, - 4,141,1322,8,141,11,141,12,141,1323,1,142,3,142,1327,8,142,1,142, - 1,142,1,142,5,142,1332,8,142,10,142,12,142,1335,9,142,3,142,1337, - 8,142,1,142,1,142,4,142,1341,8,142,11,142,12,142,1342,3,142,1345, - 8,142,1,142,1,142,3,142,1349,8,142,1,142,4,142,1352,8,142,11,142, - 12,142,1353,3,142,1356,8,142,1,143,1,143,5,143,1360,8,143,10,143, - 12,143,1363,9,143,1,144,1,144,1,144,5,144,1368,8,144,10,144,12,144, - 1371,9,144,1,144,1,144,1,145,1,145,1,145,1,145,1,145,1,145,1,145, - 1,145,3,145,1383,8,145,1,146,1,146,1,147,1,147,1,147,1,147,5,147, - 1391,8,147,10,147,12,147,1394,9,147,1,147,1,147,1,148,1,148,1,148, - 1,148,5,148,1402,8,148,10,148,12,148,1405,9,148,1,148,1,148,1,148, - 1,148,1,148,1,149,4,149,1413,8,149,11,149,12,149,1414,1,149,1,149, - 1,1403,0,150,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11, - 23,12,25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22, - 45,23,47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33, - 67,34,69,35,71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44, - 89,45,91,46,93,47,95,48,97,49,99,50,101,51,103,52,105,53,107,54, - 109,55,111,56,113,57,115,58,117,59,119,60,121,61,123,62,125,63,127, - 64,129,65,131,66,133,67,135,68,137,69,139,70,141,71,143,72,145,73, - 147,74,149,75,151,76,153,77,155,78,157,79,159,80,161,81,163,82,165, - 83,167,84,169,85,171,86,173,87,175,88,177,89,179,90,181,91,183,92, - 185,93,187,94,189,95,191,96,193,97,195,98,197,99,199,100,201,101, - 203,102,205,103,207,104,209,105,211,106,213,107,215,108,217,109, - 219,110,221,111,223,112,225,113,227,114,229,115,231,116,233,117, - 235,118,237,119,239,120,241,121,243,122,245,123,247,124,249,125, - 251,126,253,127,255,128,257,129,259,130,261,131,263,132,265,133, - 267,134,269,135,271,136,273,137,275,138,277,139,279,140,281,141, - 283,142,285,143,287,144,289,145,291,0,293,0,295,146,297,147,299, - 148,1,0,11,1,0,48,57,1,0,49,57,2,0,69,69,101,101,2,0,43,43,45,45, - 3,0,65,90,95,95,97,122,4,0,48,57,65,90,95,95,97,122,4,0,10,10,13, - 13,34,34,92,92,8,0,34,34,47,47,92,92,98,98,102,102,110,110,114,114, - 116,116,3,0,48,57,65,70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32, - 32,1432,0,1,1,0,0,0,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, - 229,1,0,0,0,0,231,1,0,0,0,0,233,1,0,0,0,0,235,1,0,0,0,0,237,1,0, - 0,0,0,239,1,0,0,0,0,241,1,0,0,0,0,243,1,0,0,0,0,245,1,0,0,0,0,247, - 1,0,0,0,0,249,1,0,0,0,0,251,1,0,0,0,0,253,1,0,0,0,0,255,1,0,0,0, - 0,257,1,0,0,0,0,259,1,0,0,0,0,261,1,0,0,0,0,263,1,0,0,0,0,265,1, - 0,0,0,0,267,1,0,0,0,0,269,1,0,0,0,0,271,1,0,0,0,0,273,1,0,0,0,0, - 275,1,0,0,0,0,277,1,0,0,0,0,279,1,0,0,0,0,281,1,0,0,0,0,283,1,0, - 0,0,0,285,1,0,0,0,0,287,1,0,0,0,0,289,1,0,0,0,0,295,1,0,0,0,0,297, - 1,0,0,0,0,299,1,0,0,0,1,301,1,0,0,0,3,306,1,0,0,0,5,315,1,0,0,0, - 7,326,1,0,0,0,9,336,1,0,0,0,11,346,1,0,0,0,13,355,1,0,0,0,15,367, - 1,0,0,0,17,374,1,0,0,0,19,382,1,0,0,0,21,391,1,0,0,0,23,399,1,0, - 0,0,25,405,1,0,0,0,27,410,1,0,0,0,29,423,1,0,0,0,31,433,1,0,0,0, - 33,445,1,0,0,0,35,451,1,0,0,0,37,462,1,0,0,0,39,473,1,0,0,0,41,478, - 1,0,0,0,43,487,1,0,0,0,45,497,1,0,0,0,47,502,1,0,0,0,49,506,1,0, - 0,0,51,512,1,0,0,0,53,517,1,0,0,0,55,527,1,0,0,0,57,531,1,0,0,0, - 59,544,1,0,0,0,61,549,1,0,0,0,63,556,1,0,0,0,65,565,1,0,0,0,67,576, - 1,0,0,0,69,580,1,0,0,0,71,589,1,0,0,0,73,596,1,0,0,0,75,605,1,0, - 0,0,77,610,1,0,0,0,79,620,1,0,0,0,81,631,1,0,0,0,83,639,1,0,0,0, - 85,645,1,0,0,0,87,654,1,0,0,0,89,664,1,0,0,0,91,673,1,0,0,0,93,685, - 1,0,0,0,95,696,1,0,0,0,97,702,1,0,0,0,99,710,1,0,0,0,101,713,1,0, - 0,0,103,718,1,0,0,0,105,725,1,0,0,0,107,728,1,0,0,0,109,736,1,0, - 0,0,111,743,1,0,0,0,113,749,1,0,0,0,115,754,1,0,0,0,117,765,1,0, - 0,0,119,770,1,0,0,0,121,776,1,0,0,0,123,783,1,0,0,0,125,787,1,0, - 0,0,127,799,1,0,0,0,129,802,1,0,0,0,131,809,1,0,0,0,133,812,1,0, - 0,0,135,819,1,0,0,0,137,827,1,0,0,0,139,834,1,0,0,0,141,845,1,0, - 0,0,143,852,1,0,0,0,145,861,1,0,0,0,147,876,1,0,0,0,149,886,1,0, - 0,0,151,896,1,0,0,0,153,909,1,0,0,0,155,915,1,0,0,0,157,932,1,0, - 0,0,159,935,1,0,0,0,161,939,1,0,0,0,163,944,1,0,0,0,165,950,1,0, - 0,0,167,959,1,0,0,0,169,968,1,0,0,0,171,972,1,0,0,0,173,976,1,0, - 0,0,175,980,1,0,0,0,177,986,1,0,0,0,179,992,1,0,0,0,181,997,1,0, - 0,0,183,1002,1,0,0,0,185,1008,1,0,0,0,187,1016,1,0,0,0,189,1024, - 1,0,0,0,191,1035,1,0,0,0,193,1040,1,0,0,0,195,1052,1,0,0,0,197,1063, - 1,0,0,0,199,1073,1,0,0,0,201,1085,1,0,0,0,203,1094,1,0,0,0,205,1099, - 1,0,0,0,207,1112,1,0,0,0,209,1124,1,0,0,0,211,1136,1,0,0,0,213,1141, - 1,0,0,0,215,1149,1,0,0,0,217,1154,1,0,0,0,219,1167,1,0,0,0,221,1175, - 1,0,0,0,223,1184,1,0,0,0,225,1198,1,0,0,0,227,1207,1,0,0,0,229,1212, - 1,0,0,0,231,1219,1,0,0,0,233,1224,1,0,0,0,235,1230,1,0,0,0,237,1237, - 1,0,0,0,239,1243,1,0,0,0,241,1249,1,0,0,0,243,1256,1,0,0,0,245,1263, - 1,0,0,0,247,1270,1,0,0,0,249,1275,1,0,0,0,251,1281,1,0,0,0,253,1286, - 1,0,0,0,255,1289,1,0,0,0,257,1291,1,0,0,0,259,1293,1,0,0,0,261,1295, - 1,0,0,0,263,1297,1,0,0,0,265,1299,1,0,0,0,267,1301,1,0,0,0,269,1303, - 1,0,0,0,271,1305,1,0,0,0,273,1307,1,0,0,0,275,1309,1,0,0,0,277,1311, - 1,0,0,0,279,1313,1,0,0,0,281,1315,1,0,0,0,283,1318,1,0,0,0,285,1326, - 1,0,0,0,287,1357,1,0,0,0,289,1364,1,0,0,0,291,1374,1,0,0,0,293,1384, - 1,0,0,0,295,1386,1,0,0,0,297,1397,1,0,0,0,299,1412,1,0,0,0,301,302, - 5,101,0,0,302,303,5,100,0,0,303,304,5,105,0,0,304,305,5,116,0,0, - 305,2,1,0,0,0,306,307,5,99,0,0,307,308,5,114,0,0,308,309,5,101,0, - 0,309,310,5,97,0,0,310,311,5,116,0,0,311,312,5,105,0,0,312,313,5, - 111,0,0,313,314,5,110,0,0,314,4,1,0,0,0,315,316,5,105,0,0,316,317, - 5,110,0,0,317,318,5,105,0,0,318,319,5,116,0,0,319,320,5,105,0,0, - 320,321,5,97,0,0,321,322,5,108,0,0,322,323,5,105,0,0,323,324,5,122, - 0,0,324,325,5,101,0,0,325,6,1,0,0,0,326,327,5,119,0,0,327,328,5, - 111,0,0,328,329,5,114,0,0,329,330,5,107,0,0,330,331,5,115,0,0,331, - 332,5,112,0,0,332,333,5,97,0,0,333,334,5,99,0,0,334,335,5,101,0, - 0,335,8,1,0,0,0,336,337,5,101,0,0,337,338,5,120,0,0,338,339,5,101, - 0,0,339,340,5,99,0,0,340,341,5,117,0,0,341,342,5,116,0,0,342,343, - 5,105,0,0,343,344,5,111,0,0,344,345,5,110,0,0,345,10,1,0,0,0,346, - 347,5,115,0,0,347,348,5,110,0,0,348,349,5,97,0,0,349,350,5,112,0, - 0,350,351,5,115,0,0,351,352,5,104,0,0,352,353,5,111,0,0,353,354, - 5,116,0,0,354,12,1,0,0,0,355,356,5,116,0,0,356,357,5,114,0,0,357, - 358,5,97,0,0,358,359,5,110,0,0,359,360,5,115,0,0,360,361,5,97,0, - 0,361,362,5,99,0,0,362,363,5,116,0,0,363,364,5,105,0,0,364,365,5, - 111,0,0,365,366,5,110,0,0,366,14,1,0,0,0,367,368,5,114,0,0,368,369, - 5,101,0,0,369,370,5,109,0,0,370,371,5,111,0,0,371,372,5,116,0,0, - 372,373,5,101,0,0,373,16,1,0,0,0,374,375,5,116,0,0,375,376,5,97, - 0,0,376,377,5,114,0,0,377,378,5,103,0,0,378,379,5,101,0,0,379,380, - 5,116,0,0,380,381,5,115,0,0,381,18,1,0,0,0,382,383,5,112,0,0,383, - 384,5,111,0,0,384,385,5,114,0,0,385,386,5,116,0,0,386,387,5,97,0, - 0,387,388,5,98,0,0,388,389,5,108,0,0,389,390,5,101,0,0,390,20,1, - 0,0,0,391,392,5,114,0,0,392,393,5,101,0,0,393,394,5,112,0,0,394, - 395,5,108,0,0,395,396,5,105,0,0,396,397,5,99,0,0,397,398,5,97,0, - 0,398,22,1,0,0,0,399,400,5,108,0,0,400,401,5,111,0,0,401,402,5,99, - 0,0,402,403,5,97,0,0,403,404,5,108,0,0,404,24,1,0,0,0,405,406,5, - 102,0,0,406,407,5,114,0,0,407,408,5,111,0,0,408,409,5,109,0,0,409, - 26,1,0,0,0,410,411,5,114,0,0,411,412,5,101,0,0,412,413,5,115,0,0, - 413,414,5,117,0,0,414,415,5,108,0,0,415,416,5,116,0,0,416,417,5, - 45,0,0,417,418,5,98,0,0,418,419,5,121,0,0,419,420,5,116,0,0,420, - 421,5,101,0,0,421,422,5,115,0,0,422,28,1,0,0,0,423,424,5,114,0,0, - 424,425,5,112,0,0,425,426,5,99,0,0,426,427,5,45,0,0,427,428,5,99, - 0,0,428,429,5,97,0,0,429,430,5,108,0,0,430,431,5,108,0,0,431,432, - 5,115,0,0,432,30,1,0,0,0,433,434,5,100,0,0,434,435,5,101,0,0,435, - 436,5,97,0,0,436,437,5,100,0,0,437,438,5,108,0,0,438,439,5,105,0, - 0,439,440,5,110,0,0,440,441,5,101,0,0,441,442,5,45,0,0,442,443,5, - 109,0,0,443,444,5,115,0,0,444,32,1,0,0,0,445,446,5,113,0,0,446,447, - 5,117,0,0,447,448,5,101,0,0,448,449,5,114,0,0,449,450,5,121,0,0, - 450,34,1,0,0,0,451,452,5,114,0,0,452,453,5,101,0,0,453,454,5,102, - 0,0,454,455,5,108,0,0,455,456,5,101,0,0,456,457,5,99,0,0,457,458, - 5,116,0,0,458,459,5,105,0,0,459,460,5,111,0,0,460,461,5,110,0,0, - 461,36,1,0,0,0,462,463,5,115,0,0,463,464,5,112,0,0,464,465,5,101, - 0,0,465,466,5,99,0,0,466,467,5,105,0,0,467,468,5,97,0,0,468,469, - 5,108,0,0,469,470,5,105,0,0,470,471,5,122,0,0,471,472,5,101,0,0, - 472,38,1,0,0,0,473,474,5,114,0,0,474,475,5,111,0,0,475,476,5,111, - 0,0,476,477,5,116,0,0,477,40,1,0,0,0,478,479,5,100,0,0,479,480,5, - 111,0,0,480,481,5,99,0,0,481,482,5,117,0,0,482,483,5,109,0,0,483, - 484,5,101,0,0,484,485,5,110,0,0,485,486,5,116,0,0,486,42,1,0,0,0, - 487,488,5,102,0,0,488,489,5,114,0,0,489,490,5,97,0,0,490,491,5,103, - 0,0,491,492,5,109,0,0,492,493,5,101,0,0,493,494,5,110,0,0,494,495, - 5,116,0,0,495,496,5,115,0,0,496,44,1,0,0,0,497,498,5,118,0,0,498, - 499,5,105,0,0,499,500,5,101,0,0,500,501,5,119,0,0,501,46,1,0,0,0, - 502,503,5,109,0,0,503,504,5,97,0,0,504,505,5,120,0,0,505,48,1,0, - 0,0,506,507,5,97,0,0,507,508,5,108,0,0,508,509,5,108,0,0,509,510, - 5,111,0,0,510,511,5,119,0,0,511,50,1,0,0,0,512,513,5,112,0,0,513, - 514,5,111,0,0,514,515,5,108,0,0,515,516,5,108,0,0,516,52,1,0,0,0, - 517,518,5,113,0,0,518,519,5,117,0,0,519,520,5,101,0,0,520,521,5, - 114,0,0,521,522,5,121,0,0,522,523,5,97,0,0,523,524,5,98,0,0,524, - 525,5,108,0,0,525,526,5,101,0,0,526,54,1,0,0,0,527,528,5,114,0,0, - 528,529,5,112,0,0,529,530,5,99,0,0,530,56,1,0,0,0,531,532,5,113, - 0,0,532,533,5,117,0,0,533,534,5,101,0,0,534,535,5,114,0,0,535,536, - 5,121,0,0,536,537,5,45,0,0,537,538,5,114,0,0,538,539,5,101,0,0,539, - 540,5,97,0,0,540,541,5,115,0,0,541,542,5,111,0,0,542,543,5,110,0, - 0,543,58,1,0,0,0,544,545,5,116,0,0,545,546,5,121,0,0,546,547,5,112, - 0,0,547,548,5,101,0,0,548,60,1,0,0,0,549,550,5,111,0,0,550,551,5, - 98,0,0,551,552,5,106,0,0,552,553,5,101,0,0,553,554,5,99,0,0,554, - 555,5,116,0,0,555,62,1,0,0,0,556,557,5,115,0,0,557,558,5,116,0,0, - 558,559,5,111,0,0,559,560,5,114,0,0,560,561,5,97,0,0,561,562,5,98, - 0,0,562,563,5,108,0,0,563,564,5,101,0,0,564,64,1,0,0,0,565,566,5, - 105,0,0,566,567,5,109,0,0,567,568,5,112,0,0,568,569,5,108,0,0,569, - 570,5,101,0,0,570,571,5,109,0,0,571,572,5,101,0,0,572,573,5,110, - 0,0,573,574,5,116,0,0,574,575,5,115,0,0,575,66,1,0,0,0,576,577,5, - 114,0,0,577,578,5,101,0,0,578,579,5,102,0,0,579,68,1,0,0,0,580,581, - 5,102,0,0,581,582,5,114,0,0,582,583,5,97,0,0,583,584,5,103,0,0,584, - 585,5,109,0,0,585,586,5,101,0,0,586,587,5,110,0,0,587,588,5,116, - 0,0,588,70,1,0,0,0,589,590,5,105,0,0,590,591,5,109,0,0,591,592,5, - 112,0,0,592,593,5,111,0,0,593,594,5,114,0,0,594,595,5,116,0,0,595, - 72,1,0,0,0,596,597,5,101,0,0,597,598,5,120,0,0,598,599,5,116,0,0, - 599,600,5,101,0,0,600,601,5,114,0,0,601,602,5,110,0,0,602,603,5, - 97,0,0,603,604,5,108,0,0,604,74,1,0,0,0,605,606,5,97,0,0,606,607, - 5,116,0,0,607,608,5,111,0,0,608,609,5,109,0,0,609,76,1,0,0,0,610, - 611,5,105,0,0,611,612,5,110,0,0,612,613,5,116,0,0,613,614,5,101, - 0,0,614,615,5,114,0,0,615,616,5,102,0,0,616,617,5,97,0,0,617,618, - 5,99,0,0,618,619,5,101,0,0,619,78,1,0,0,0,620,621,5,105,0,0,621, - 622,5,110,0,0,622,623,5,116,0,0,623,624,5,101,0,0,624,625,5,114, - 0,0,625,626,5,102,0,0,626,627,5,97,0,0,627,628,5,99,0,0,628,629, - 5,101,0,0,629,630,5,115,0,0,630,80,1,0,0,0,631,632,5,112,0,0,632, - 633,5,97,0,0,633,634,5,99,0,0,634,635,5,107,0,0,635,636,5,97,0,0, - 636,637,5,103,0,0,637,638,5,101,0,0,638,82,1,0,0,0,639,640,5,118, - 0,0,640,641,5,97,0,0,641,642,5,108,0,0,642,643,5,117,0,0,643,644, - 5,101,0,0,644,84,1,0,0,0,645,646,5,114,0,0,646,647,5,101,0,0,647, - 648,5,108,0,0,648,649,5,97,0,0,649,650,5,116,0,0,650,651,5,105,0, - 0,651,652,5,111,0,0,652,653,5,110,0,0,653,86,1,0,0,0,654,655,5,111, - 0,0,655,656,5,112,0,0,656,657,5,101,0,0,657,658,5,114,0,0,658,659, - 5,97,0,0,659,660,5,116,0,0,660,661,5,105,0,0,661,662,5,111,0,0,662, - 663,5,110,0,0,663,88,1,0,0,0,664,665,5,102,0,0,665,666,5,117,0,0, - 666,667,5,110,0,0,667,668,5,99,0,0,668,669,5,116,0,0,669,670,5,105, - 0,0,670,671,5,111,0,0,671,672,5,110,0,0,672,90,1,0,0,0,673,674,5, - 99,0,0,674,675,5,111,0,0,675,676,5,110,0,0,676,677,5,115,0,0,677, - 678,5,116,0,0,678,679,5,114,0,0,679,680,5,117,0,0,680,681,5,99,0, - 0,681,682,5,116,0,0,682,683,5,111,0,0,683,684,5,114,0,0,684,92,1, - 0,0,0,685,686,5,99,0,0,686,687,5,111,0,0,687,688,5,110,0,0,688,689, - 5,115,0,0,689,690,5,116,0,0,690,691,5,114,0,0,691,692,5,117,0,0, - 692,693,5,99,0,0,693,694,5,116,0,0,694,695,5,115,0,0,695,94,1,0, - 0,0,696,697,5,105,0,0,697,698,5,110,0,0,698,699,5,112,0,0,699,700, - 5,117,0,0,700,701,5,116,0,0,701,96,1,0,0,0,702,703,5,99,0,0,703, - 704,5,111,0,0,704,705,5,110,0,0,705,706,5,102,0,0,706,707,5,111, - 0,0,707,708,5,114,0,0,708,709,5,109,0,0,709,98,1,0,0,0,710,711,5, - 97,0,0,711,712,5,115,0,0,712,100,1,0,0,0,713,714,5,98,0,0,714,715, - 5,105,0,0,715,716,5,110,0,0,716,717,5,100,0,0,717,102,1,0,0,0,718, - 719,5,115,0,0,719,720,5,116,0,0,720,721,5,97,0,0,721,722,5,116,0, - 0,722,723,5,105,0,0,723,724,5,99,0,0,724,104,1,0,0,0,725,726,5,116, - 0,0,726,727,5,111,0,0,727,106,1,0,0,0,728,729,5,112,0,0,729,730, - 5,114,0,0,730,731,5,105,0,0,731,732,5,118,0,0,732,733,5,97,0,0,733, - 734,5,116,0,0,734,735,5,101,0,0,735,108,1,0,0,0,736,737,5,115,0, - 0,737,738,5,104,0,0,738,739,5,97,0,0,739,740,5,114,0,0,740,741,5, - 101,0,0,741,742,5,100,0,0,742,110,1,0,0,0,743,744,5,115,0,0,744, - 745,5,116,0,0,745,746,5,97,0,0,746,747,5,116,0,0,747,748,5,101,0, - 0,748,112,1,0,0,0,749,750,5,101,0,0,750,751,5,100,0,0,751,752,5, - 103,0,0,752,753,5,101,0,0,753,114,1,0,0,0,754,755,5,112,0,0,755, - 756,5,114,0,0,756,757,5,111,0,0,757,758,5,106,0,0,758,759,5,101, - 0,0,759,760,5,99,0,0,760,761,5,116,0,0,761,762,5,105,0,0,762,763, - 5,111,0,0,763,764,5,110,0,0,764,116,1,0,0,0,765,766,5,119,0,0,766, - 767,5,105,0,0,767,768,5,116,0,0,768,769,5,104,0,0,769,118,1,0,0, - 0,770,771,5,117,0,0,771,772,5,115,0,0,772,773,5,105,0,0,773,774, - 5,110,0,0,774,775,5,103,0,0,775,120,1,0,0,0,776,777,5,97,0,0,777, - 778,5,99,0,0,778,779,5,99,0,0,779,780,5,101,0,0,780,781,5,112,0, - 0,781,782,5,116,0,0,782,122,1,0,0,0,783,784,5,118,0,0,784,785,5, - 105,0,0,785,786,5,97,0,0,786,124,1,0,0,0,787,788,5,109,0,0,788,789, - 5,97,0,0,789,790,5,116,0,0,790,791,5,101,0,0,791,792,5,114,0,0,792, - 793,5,105,0,0,793,794,5,97,0,0,794,795,5,108,0,0,795,796,5,105,0, - 0,796,797,5,122,0,0,797,798,5,101,0,0,798,126,1,0,0,0,799,800,5, - 105,0,0,800,801,5,102,0,0,801,128,1,0,0,0,802,803,5,97,0,0,803,804, - 5,98,0,0,804,805,5,115,0,0,805,806,5,101,0,0,806,807,5,110,0,0,807, - 808,5,116,0,0,808,130,1,0,0,0,809,810,5,111,0,0,810,811,5,110,0, - 0,811,132,1,0,0,0,812,813,5,112,0,0,813,814,5,111,0,0,814,815,5, - 108,0,0,815,816,5,105,0,0,816,817,5,99,0,0,817,818,5,121,0,0,818, - 134,1,0,0,0,819,820,5,100,0,0,820,821,5,101,0,0,821,822,5,102,0, - 0,822,823,5,97,0,0,823,824,5,117,0,0,824,825,5,108,0,0,825,826,5, - 116,0,0,826,136,1,0,0,0,827,828,5,115,0,0,828,829,5,111,0,0,829, - 830,5,117,0,0,830,831,5,114,0,0,831,832,5,99,0,0,832,833,5,101,0, - 0,833,138,1,0,0,0,834,835,5,114,0,0,835,836,5,101,0,0,836,837,5, - 112,0,0,837,838,5,111,0,0,838,839,5,115,0,0,839,840,5,105,0,0,840, - 841,5,116,0,0,841,842,5,111,0,0,842,843,5,114,0,0,843,844,5,121, - 0,0,844,140,1,0,0,0,845,846,5,99,0,0,846,847,5,111,0,0,847,848,5, - 109,0,0,848,849,5,109,0,0,849,850,5,105,0,0,850,851,5,116,0,0,851, - 142,1,0,0,0,852,853,5,114,0,0,853,854,5,101,0,0,854,855,5,118,0, - 0,855,856,5,105,0,0,856,857,5,115,0,0,857,858,5,105,0,0,858,859, - 5,111,0,0,859,860,5,110,0,0,860,144,1,0,0,0,861,862,5,115,0,0,862, - 863,5,101,0,0,863,864,5,109,0,0,864,865,5,97,0,0,865,866,5,110,0, - 0,866,867,5,116,0,0,867,868,5,105,0,0,868,869,5,99,0,0,869,870,5, - 45,0,0,870,871,5,109,0,0,871,872,5,97,0,0,872,873,5,106,0,0,873, - 874,5,111,0,0,874,875,5,114,0,0,875,146,1,0,0,0,876,877,5,111,0, - 0,877,878,5,110,0,0,878,879,5,45,0,0,879,880,5,100,0,0,880,881,5, - 101,0,0,881,882,5,108,0,0,882,883,5,101,0,0,883,884,5,116,0,0,884, - 885,5,101,0,0,885,148,1,0,0,0,886,887,5,108,0,0,887,888,5,105,0, - 0,888,889,5,102,0,0,889,890,5,101,0,0,890,891,5,99,0,0,891,892,5, - 121,0,0,892,893,5,99,0,0,893,894,5,108,0,0,894,895,5,101,0,0,895, - 150,1,0,0,0,896,897,5,114,0,0,897,898,5,101,0,0,898,899,5,116,0, - 0,899,900,5,97,0,0,900,901,5,105,0,0,901,902,5,110,0,0,902,903,5, - 45,0,0,903,904,5,111,0,0,904,905,5,116,0,0,905,906,5,104,0,0,906, - 907,5,101,0,0,907,908,5,114,0,0,908,152,1,0,0,0,909,910,5,107,0, - 0,910,911,5,101,0,0,911,912,5,121,0,0,912,913,5,101,0,0,913,914, - 5,100,0,0,914,154,1,0,0,0,915,916,5,112,0,0,916,917,5,117,0,0,917, - 918,5,98,0,0,918,919,5,108,0,0,919,920,5,105,0,0,920,921,5,99,0, - 0,921,922,5,45,0,0,922,923,5,116,0,0,923,924,5,114,0,0,924,925,5, - 97,0,0,925,926,5,118,0,0,926,927,5,101,0,0,927,928,5,114,0,0,928, - 929,5,115,0,0,929,930,5,97,0,0,930,931,5,108,0,0,931,156,1,0,0,0, - 932,933,5,105,0,0,933,934,5,100,0,0,934,158,1,0,0,0,935,936,5,100, - 0,0,936,937,5,111,0,0,937,938,5,99,0,0,938,160,1,0,0,0,939,940,5, - 109,0,0,940,941,5,111,0,0,941,942,5,100,0,0,942,943,5,101,0,0,943, - 162,1,0,0,0,944,945,5,101,0,0,945,946,5,109,0,0,946,947,5,105,0, - 0,947,948,5,116,0,0,948,949,5,115,0,0,949,164,1,0,0,0,950,951,5, - 114,0,0,951,952,5,101,0,0,952,953,5,99,0,0,953,954,5,101,0,0,954, - 955,5,105,0,0,955,956,5,118,0,0,956,957,5,101,0,0,957,958,5,114, - 0,0,958,166,1,0,0,0,959,960,5,114,0,0,960,961,5,101,0,0,961,962, - 5,113,0,0,962,963,5,117,0,0,963,964,5,105,0,0,964,965,5,114,0,0, - 965,966,5,101,0,0,966,967,5,115,0,0,967,168,1,0,0,0,968,969,5,97, - 0,0,969,970,5,110,0,0,970,971,5,121,0,0,971,170,1,0,0,0,972,973, - 5,103,0,0,973,974,5,101,0,0,974,975,5,116,0,0,975,172,1,0,0,0,976, - 977,5,115,0,0,977,978,5,101,0,0,978,979,5,116,0,0,979,174,1,0,0, - 0,980,981,5,119,0,0,981,982,5,97,0,0,982,983,5,116,0,0,983,984,5, - 99,0,0,984,985,5,104,0,0,985,176,1,0,0,0,986,987,5,115,0,0,987,988, - 5,116,0,0,988,989,5,97,0,0,989,990,5,114,0,0,990,991,5,116,0,0,991, - 178,1,0,0,0,992,993,5,115,0,0,993,994,5,116,0,0,994,995,5,111,0, - 0,995,996,5,112,0,0,996,180,1,0,0,0,997,998,5,114,0,0,998,999,5, - 101,0,0,999,1000,5,97,0,0,1000,1001,5,100,0,0,1001,182,1,0,0,0,1002, - 1003,5,119,0,0,1003,1004,5,114,0,0,1004,1005,5,105,0,0,1005,1006, - 5,116,0,0,1006,1007,5,101,0,0,1007,184,1,0,0,0,1008,1009,5,114,0, - 0,1009,1010,5,101,0,0,1010,1011,5,115,0,0,1011,1012,5,111,0,0,1012, - 1013,5,108,0,0,1013,1014,5,118,0,0,1014,1015,5,101,0,0,1015,186, - 1,0,0,0,1016,1017,5,99,0,0,1017,1018,5,111,0,0,1018,1019,5,110,0, - 0,1019,1020,5,110,0,0,1020,1021,5,101,0,0,1021,1022,5,99,0,0,1022, - 1023,5,116,0,0,1023,188,1,0,0,0,1024,1025,5,100,0,0,1025,1026,5, - 105,0,0,1026,1027,5,115,0,0,1027,1028,5,99,0,0,1028,1029,5,111,0, - 0,1029,1030,5,110,0,0,1030,1031,5,110,0,0,1031,1032,5,101,0,0,1032, - 1033,5,99,0,0,1033,1034,5,116,0,0,1034,190,1,0,0,0,1035,1036,5,99, - 0,0,1036,1037,5,97,0,0,1037,1038,5,108,0,0,1038,1039,5,108,0,0,1039, - 192,1,0,0,0,1040,1041,5,119,0,0,1041,1042,5,97,0,0,1042,1043,5,116, - 0,0,1043,1044,5,99,0,0,1044,1045,5,104,0,0,1045,1046,5,45,0,0,1046, - 1047,5,115,0,0,1047,1048,5,116,0,0,1048,1049,5,97,0,0,1049,1050, - 5,114,0,0,1050,1051,5,116,0,0,1051,194,1,0,0,0,1052,1053,5,119,0, - 0,1053,1054,5,97,0,0,1054,1055,5,116,0,0,1055,1056,5,99,0,0,1056, - 1057,5,104,0,0,1057,1058,5,45,0,0,1058,1059,5,115,0,0,1059,1060, - 5,116,0,0,1060,1061,5,111,0,0,1061,1062,5,112,0,0,1062,196,1,0,0, - 0,1063,1064,5,115,0,0,1064,1065,5,117,0,0,1065,1066,5,98,0,0,1066, - 1067,5,115,0,0,1067,1068,5,99,0,0,1068,1069,5,114,0,0,1069,1070, - 5,105,0,0,1070,1071,5,98,0,0,1071,1072,5,101,0,0,1072,198,1,0,0, - 0,1073,1074,5,117,0,0,1074,1075,5,110,0,0,1075,1076,5,115,0,0,1076, - 1077,5,117,0,0,1077,1078,5,98,0,0,1078,1079,5,115,0,0,1079,1080, - 5,99,0,0,1080,1081,5,114,0,0,1081,1082,5,105,0,0,1082,1083,5,98, - 0,0,1083,1084,5,101,0,0,1084,200,1,0,0,0,1085,1086,5,114,0,0,1086, - 1087,5,101,0,0,1087,1088,5,103,0,0,1088,1089,5,105,0,0,1089,1090, - 5,115,0,0,1090,1091,5,116,0,0,1091,1092,5,101,0,0,1092,1093,5,114, - 0,0,1093,202,1,0,0,0,1094,1095,5,99,0,0,1095,1096,5,114,0,0,1096, - 1097,5,100,0,0,1097,1098,5,116,0,0,1098,204,1,0,0,0,1099,1100,5, - 111,0,0,1100,1101,5,112,0,0,1101,1102,5,116,0,0,1102,1103,5,105, - 0,0,1103,1104,5,111,0,0,1104,1105,5,110,0,0,1105,1106,5,97,0,0,1106, - 1107,5,108,0,0,1107,1108,5,45,0,0,1108,1109,5,111,0,0,1109,1110, - 5,110,0,0,1110,1111,5,101,0,0,1111,206,1,0,0,0,1112,1113,5,101,0, - 0,1113,1114,5,120,0,0,1114,1115,5,97,0,0,1115,1116,5,99,0,0,1116, - 1117,5,116,0,0,1117,1118,5,108,0,0,1118,1119,5,121,0,0,1119,1120, - 5,45,0,0,1120,1121,5,111,0,0,1121,1122,5,110,0,0,1122,1123,5,101, - 0,0,1123,208,1,0,0,0,1124,1125,5,109,0,0,1125,1126,5,97,0,0,1126, - 1127,5,110,0,0,1127,1128,5,121,0,0,1128,1129,5,45,0,0,1129,1130, - 5,117,0,0,1130,1131,5,110,0,0,1131,1132,5,105,0,0,1132,1133,5,113, - 0,0,1133,1134,5,117,0,0,1134,1135,5,101,0,0,1135,210,1,0,0,0,1136, - 1137,5,109,0,0,1137,1138,5,97,0,0,1138,1139,5,110,0,0,1139,1140, - 5,121,0,0,1140,212,1,0,0,0,1141,1142,5,111,0,0,1142,1143,5,114,0, - 0,1143,1144,5,100,0,0,1144,1145,5,101,0,0,1145,1146,5,114,0,0,1146, - 1147,5,101,0,0,1147,1148,5,100,0,0,1148,214,1,0,0,0,1149,1150,5, - 117,0,0,1150,1151,5,110,0,0,1151,1152,5,105,0,0,1152,1153,5,116, - 0,0,1153,216,1,0,0,0,1154,1155,5,119,0,0,1155,1156,5,97,0,0,1156, - 1157,5,116,0,0,1157,1158,5,99,0,0,1158,1159,5,104,0,0,1159,1160, - 5,45,0,0,1160,1161,5,104,0,0,1161,1162,5,97,0,0,1162,1163,5,110, - 0,0,1163,1164,5,100,0,0,1164,1165,5,108,0,0,1165,1166,5,101,0,0, - 1166,218,1,0,0,0,1167,1168,5,109,0,0,1168,1169,5,101,0,0,1169,1170, - 5,115,0,0,1170,1171,5,115,0,0,1171,1172,5,97,0,0,1172,1173,5,103, - 0,0,1173,1174,5,101,0,0,1174,220,1,0,0,0,1175,1176,5,97,0,0,1176, - 1177,5,116,0,0,1177,1178,5,111,0,0,1178,1179,5,109,0,0,1179,1180, - 5,45,0,0,1180,1181,5,114,0,0,1181,1182,5,101,0,0,1182,1183,5,102, - 0,0,1183,222,1,0,0,0,1184,1185,5,105,0,0,1185,1186,5,110,0,0,1186, - 1187,5,116,0,0,1187,1188,5,101,0,0,1188,1189,5,114,0,0,1189,1190, - 5,102,0,0,1190,1191,5,97,0,0,1191,1192,5,99,0,0,1192,1193,5,101, - 0,0,1193,1194,5,45,0,0,1194,1195,5,114,0,0,1195,1196,5,101,0,0,1196, - 1197,5,102,0,0,1197,224,1,0,0,0,1198,1199,5,111,0,0,1199,1200,5, - 112,0,0,1200,1201,5,116,0,0,1201,1202,5,105,0,0,1202,1203,5,111, - 0,0,1203,1204,5,110,0,0,1204,1205,5,97,0,0,1205,1206,5,108,0,0,1206, - 226,1,0,0,0,1207,1208,5,108,0,0,1208,1209,5,105,0,0,1209,1210,5, - 115,0,0,1210,1211,5,116,0,0,1211,228,1,0,0,0,1212,1213,5,114,0,0, - 1213,1214,5,101,0,0,1214,1215,5,99,0,0,1215,1216,5,111,0,0,1216, - 1217,5,114,0,0,1217,1218,5,100,0,0,1218,230,1,0,0,0,1219,1220,5, - 98,0,0,1220,1221,5,111,0,0,1221,1222,5,111,0,0,1222,1223,5,108,0, - 0,1223,232,1,0,0,0,1224,1225,5,98,0,0,1225,1226,5,121,0,0,1226,1227, - 5,116,0,0,1227,1228,5,101,0,0,1228,1229,5,115,0,0,1229,234,1,0,0, - 0,1230,1231,5,100,0,0,1231,1232,5,111,0,0,1232,1233,5,117,0,0,1233, - 1234,5,98,0,0,1234,1235,5,108,0,0,1235,1236,5,101,0,0,1236,236,1, - 0,0,0,1237,1238,5,105,0,0,1238,1239,5,110,0,0,1239,1240,5,116,0, - 0,1240,1241,5,51,0,0,1241,1242,5,50,0,0,1242,238,1,0,0,0,1243,1244, - 5,105,0,0,1244,1245,5,110,0,0,1245,1246,5,116,0,0,1246,1247,5,54, - 0,0,1247,1248,5,52,0,0,1248,240,1,0,0,0,1249,1250,5,115,0,0,1250, - 1251,5,116,0,0,1251,1252,5,114,0,0,1252,1253,5,105,0,0,1253,1254, - 5,110,0,0,1254,1255,5,103,0,0,1255,242,1,0,0,0,1256,1257,5,117,0, - 0,1257,1258,5,105,0,0,1258,1259,5,110,0,0,1259,1260,5,116,0,0,1260, - 1261,5,51,0,0,1261,1262,5,50,0,0,1262,244,1,0,0,0,1263,1264,5,117, - 0,0,1264,1265,5,105,0,0,1265,1266,5,110,0,0,1266,1267,5,116,0,0, - 1267,1268,5,54,0,0,1268,1269,5,52,0,0,1269,246,1,0,0,0,1270,1271, - 5,116,0,0,1271,1272,5,114,0,0,1272,1273,5,117,0,0,1273,1274,5,101, - 0,0,1274,248,1,0,0,0,1275,1276,5,102,0,0,1276,1277,5,97,0,0,1277, - 1278,5,108,0,0,1278,1279,5,115,0,0,1279,1280,5,101,0,0,1280,250, - 1,0,0,0,1281,1282,5,110,0,0,1282,1283,5,117,0,0,1283,1284,5,108, - 0,0,1284,1285,5,108,0,0,1285,252,1,0,0,0,1286,1287,5,45,0,0,1287, - 1288,5,62,0,0,1288,254,1,0,0,0,1289,1290,5,58,0,0,1290,256,1,0,0, - 0,1291,1292,5,59,0,0,1292,258,1,0,0,0,1293,1294,5,44,0,0,1294,260, - 1,0,0,0,1295,1296,5,46,0,0,1296,262,1,0,0,0,1297,1298,5,123,0,0, - 1298,264,1,0,0,0,1299,1300,5,125,0,0,1300,266,1,0,0,0,1301,1302, - 5,91,0,0,1302,268,1,0,0,0,1303,1304,5,93,0,0,1304,270,1,0,0,0,1305, - 1306,5,40,0,0,1306,272,1,0,0,0,1307,1308,5,41,0,0,1308,274,1,0,0, - 0,1309,1310,5,60,0,0,1310,276,1,0,0,0,1311,1312,5,62,0,0,1312,278, - 1,0,0,0,1313,1314,5,38,0,0,1314,280,1,0,0,0,1315,1316,5,61,0,0,1316, - 282,1,0,0,0,1317,1319,5,45,0,0,1318,1317,1,0,0,0,1318,1319,1,0,0, - 0,1319,1321,1,0,0,0,1320,1322,7,0,0,0,1321,1320,1,0,0,0,1322,1323, - 1,0,0,0,1323,1321,1,0,0,0,1323,1324,1,0,0,0,1324,284,1,0,0,0,1325, - 1327,5,45,0,0,1326,1325,1,0,0,0,1326,1327,1,0,0,0,1327,1336,1,0, - 0,0,1328,1337,5,48,0,0,1329,1333,7,1,0,0,1330,1332,7,0,0,0,1331, - 1330,1,0,0,0,1332,1335,1,0,0,0,1333,1331,1,0,0,0,1333,1334,1,0,0, - 0,1334,1337,1,0,0,0,1335,1333,1,0,0,0,1336,1328,1,0,0,0,1336,1329, - 1,0,0,0,1337,1344,1,0,0,0,1338,1340,5,46,0,0,1339,1341,7,0,0,0,1340, - 1339,1,0,0,0,1341,1342,1,0,0,0,1342,1340,1,0,0,0,1342,1343,1,0,0, - 0,1343,1345,1,0,0,0,1344,1338,1,0,0,0,1344,1345,1,0,0,0,1345,1355, - 1,0,0,0,1346,1348,7,2,0,0,1347,1349,7,3,0,0,1348,1347,1,0,0,0,1348, - 1349,1,0,0,0,1349,1351,1,0,0,0,1350,1352,7,0,0,0,1351,1350,1,0,0, - 0,1352,1353,1,0,0,0,1353,1351,1,0,0,0,1353,1354,1,0,0,0,1354,1356, - 1,0,0,0,1355,1346,1,0,0,0,1355,1356,1,0,0,0,1356,286,1,0,0,0,1357, - 1361,7,4,0,0,1358,1360,7,5,0,0,1359,1358,1,0,0,0,1360,1363,1,0,0, - 0,1361,1359,1,0,0,0,1361,1362,1,0,0,0,1362,288,1,0,0,0,1363,1361, - 1,0,0,0,1364,1369,5,34,0,0,1365,1368,3,291,145,0,1366,1368,8,6,0, - 0,1367,1365,1,0,0,0,1367,1366,1,0,0,0,1368,1371,1,0,0,0,1369,1367, - 1,0,0,0,1369,1370,1,0,0,0,1370,1372,1,0,0,0,1371,1369,1,0,0,0,1372, - 1373,5,34,0,0,1373,290,1,0,0,0,1374,1382,5,92,0,0,1375,1383,7,7, - 0,0,1376,1377,5,117,0,0,1377,1378,3,293,146,0,1378,1379,3,293,146, - 0,1379,1380,3,293,146,0,1380,1381,3,293,146,0,1381,1383,1,0,0,0, - 1382,1375,1,0,0,0,1382,1376,1,0,0,0,1383,292,1,0,0,0,1384,1385,7, - 8,0,0,1385,294,1,0,0,0,1386,1387,5,47,0,0,1387,1388,5,47,0,0,1388, - 1392,1,0,0,0,1389,1391,8,9,0,0,1390,1389,1,0,0,0,1391,1394,1,0,0, - 0,1392,1390,1,0,0,0,1392,1393,1,0,0,0,1393,1395,1,0,0,0,1394,1392, - 1,0,0,0,1395,1396,6,147,0,0,1396,296,1,0,0,0,1397,1398,5,47,0,0, - 1398,1399,5,42,0,0,1399,1403,1,0,0,0,1400,1402,9,0,0,0,1401,1400, - 1,0,0,0,1402,1405,1,0,0,0,1403,1404,1,0,0,0,1403,1401,1,0,0,0,1404, - 1406,1,0,0,0,1405,1403,1,0,0,0,1406,1407,5,42,0,0,1407,1408,5,47, - 0,0,1408,1409,1,0,0,0,1409,1410,6,148,0,0,1410,298,1,0,0,0,1411, - 1413,7,10,0,0,1412,1411,1,0,0,0,1413,1414,1,0,0,0,1414,1412,1,0, - 0,0,1414,1415,1,0,0,0,1415,1416,1,0,0,0,1416,1417,6,149,0,0,1417, - 300,1,0,0,0,18,0,1318,1323,1326,1333,1336,1342,1344,1348,1353,1355, - 1361,1367,1369,1382,1392,1403,1414,1,0,1,0 + 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,144,1,144,1,145,1,145,1,146,3,146,1372,8,146,1,146,4,146, + 1375,8,146,11,146,12,146,1376,1,147,3,147,1380,8,147,1,147,1,147, + 1,147,5,147,1385,8,147,10,147,12,147,1388,9,147,3,147,1390,8,147, + 1,147,1,147,4,147,1394,8,147,11,147,12,147,1395,3,147,1398,8,147, + 1,147,1,147,3,147,1402,8,147,1,147,4,147,1405,8,147,11,147,12,147, + 1406,3,147,1409,8,147,1,148,1,148,5,148,1413,8,148,10,148,12,148, + 1416,9,148,1,149,1,149,1,149,5,149,1421,8,149,10,149,12,149,1424, + 9,149,1,149,1,149,1,150,1,150,1,150,1,150,1,150,1,150,1,150,1,150, + 3,150,1436,8,150,1,151,1,151,1,152,1,152,1,152,1,152,5,152,1444, + 8,152,10,152,12,152,1447,9,152,1,152,1,152,1,153,1,153,1,153,1,153, + 5,153,1455,8,153,10,153,12,153,1458,9,153,1,153,1,153,1,153,1,153, + 1,153,1,154,4,154,1466,8,154,11,154,12,154,1467,1,154,1,154,1,1456, + 0,155,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12, + 25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23, + 47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34, + 69,35,71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45, + 91,46,93,47,95,48,97,49,99,50,101,51,103,52,105,53,107,54,109,55, + 111,56,113,57,115,58,117,59,119,60,121,61,123,62,125,63,127,64,129, + 65,131,66,133,67,135,68,137,69,139,70,141,71,143,72,145,73,147,74, + 149,75,151,76,153,77,155,78,157,79,159,80,161,81,163,82,165,83,167, + 84,169,85,171,86,173,87,175,88,177,89,179,90,181,91,183,92,185,93, + 187,94,189,95,191,96,193,97,195,98,197,99,199,100,201,101,203,102, + 205,103,207,104,209,105,211,106,213,107,215,108,217,109,219,110, + 221,111,223,112,225,113,227,114,229,115,231,116,233,117,235,118, + 237,119,239,120,241,121,243,122,245,123,247,124,249,125,251,126, + 253,127,255,128,257,129,259,130,261,131,263,132,265,133,267,134, + 269,135,271,136,273,137,275,138,277,139,279,140,281,141,283,142, + 285,143,287,144,289,145,291,146,293,147,295,148,297,149,299,150, + 301,0,303,0,305,151,307,152,309,153,1,0,11,1,0,48,57,1,0,49,57,2, + 0,69,69,101,101,2,0,43,43,45,45,3,0,65,90,95,95,97,122,4,0,48,57, + 65,90,95,95,97,122,4,0,10,10,13,13,34,34,92,92,8,0,34,34,47,47,92, + 92,98,98,102,102,110,110,114,114,116,116,3,0,48,57,65,70,97,102, + 2,0,10,10,13,13,3,0,9,10,13,13,32,32,1485,0,1,1,0,0,0,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,229,1,0,0,0,0,231,1,0,0,0,0, + 233,1,0,0,0,0,235,1,0,0,0,0,237,1,0,0,0,0,239,1,0,0,0,0,241,1,0, + 0,0,0,243,1,0,0,0,0,245,1,0,0,0,0,247,1,0,0,0,0,249,1,0,0,0,0,251, + 1,0,0,0,0,253,1,0,0,0,0,255,1,0,0,0,0,257,1,0,0,0,0,259,1,0,0,0, + 0,261,1,0,0,0,0,263,1,0,0,0,0,265,1,0,0,0,0,267,1,0,0,0,0,269,1, + 0,0,0,0,271,1,0,0,0,0,273,1,0,0,0,0,275,1,0,0,0,0,277,1,0,0,0,0, + 279,1,0,0,0,0,281,1,0,0,0,0,283,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,305,1,0,0,0,0,307,1,0,0,0,0,309,1,0,0,0, + 1,311,1,0,0,0,3,316,1,0,0,0,5,326,1,0,0,0,7,339,1,0,0,0,9,347,1, + 0,0,0,11,355,1,0,0,0,13,359,1,0,0,0,15,368,1,0,0,0,17,379,1,0,0, + 0,19,389,1,0,0,0,21,399,1,0,0,0,23,408,1,0,0,0,25,420,1,0,0,0,27, + 427,1,0,0,0,29,435,1,0,0,0,31,444,1,0,0,0,33,452,1,0,0,0,35,458, + 1,0,0,0,37,463,1,0,0,0,39,476,1,0,0,0,41,486,1,0,0,0,43,498,1,0, + 0,0,45,504,1,0,0,0,47,515,1,0,0,0,49,526,1,0,0,0,51,531,1,0,0,0, + 53,540,1,0,0,0,55,550,1,0,0,0,57,555,1,0,0,0,59,559,1,0,0,0,61,565, + 1,0,0,0,63,570,1,0,0,0,65,580,1,0,0,0,67,584,1,0,0,0,69,597,1,0, + 0,0,71,602,1,0,0,0,73,609,1,0,0,0,75,618,1,0,0,0,77,629,1,0,0,0, + 79,633,1,0,0,0,81,642,1,0,0,0,83,649,1,0,0,0,85,658,1,0,0,0,87,663, + 1,0,0,0,89,673,1,0,0,0,91,684,1,0,0,0,93,692,1,0,0,0,95,698,1,0, + 0,0,97,707,1,0,0,0,99,717,1,0,0,0,101,726,1,0,0,0,103,738,1,0,0, + 0,105,749,1,0,0,0,107,755,1,0,0,0,109,763,1,0,0,0,111,766,1,0,0, + 0,113,771,1,0,0,0,115,778,1,0,0,0,117,781,1,0,0,0,119,789,1,0,0, + 0,121,796,1,0,0,0,123,802,1,0,0,0,125,807,1,0,0,0,127,818,1,0,0, + 0,129,823,1,0,0,0,131,829,1,0,0,0,133,836,1,0,0,0,135,840,1,0,0, + 0,137,852,1,0,0,0,139,855,1,0,0,0,141,862,1,0,0,0,143,865,1,0,0, + 0,145,872,1,0,0,0,147,880,1,0,0,0,149,887,1,0,0,0,151,898,1,0,0, + 0,153,905,1,0,0,0,155,914,1,0,0,0,157,929,1,0,0,0,159,939,1,0,0, + 0,161,949,1,0,0,0,163,962,1,0,0,0,165,968,1,0,0,0,167,985,1,0,0, + 0,169,988,1,0,0,0,171,992,1,0,0,0,173,997,1,0,0,0,175,1003,1,0,0, + 0,177,1012,1,0,0,0,179,1021,1,0,0,0,181,1025,1,0,0,0,183,1029,1, + 0,0,0,185,1033,1,0,0,0,187,1039,1,0,0,0,189,1045,1,0,0,0,191,1050, + 1,0,0,0,193,1055,1,0,0,0,195,1061,1,0,0,0,197,1069,1,0,0,0,199,1077, + 1,0,0,0,201,1088,1,0,0,0,203,1093,1,0,0,0,205,1105,1,0,0,0,207,1116, + 1,0,0,0,209,1126,1,0,0,0,211,1138,1,0,0,0,213,1147,1,0,0,0,215,1152, + 1,0,0,0,217,1165,1,0,0,0,219,1177,1,0,0,0,221,1189,1,0,0,0,223,1194, + 1,0,0,0,225,1202,1,0,0,0,227,1207,1,0,0,0,229,1220,1,0,0,0,231,1228, + 1,0,0,0,233,1237,1,0,0,0,235,1251,1,0,0,0,237,1260,1,0,0,0,239,1265, + 1,0,0,0,241,1272,1,0,0,0,243,1277,1,0,0,0,245,1283,1,0,0,0,247,1290, + 1,0,0,0,249,1296,1,0,0,0,251,1302,1,0,0,0,253,1309,1,0,0,0,255,1316, + 1,0,0,0,257,1323,1,0,0,0,259,1328,1,0,0,0,261,1334,1,0,0,0,263,1339, + 1,0,0,0,265,1342,1,0,0,0,267,1344,1,0,0,0,269,1346,1,0,0,0,271,1348, + 1,0,0,0,273,1350,1,0,0,0,275,1352,1,0,0,0,277,1354,1,0,0,0,279,1356, + 1,0,0,0,281,1358,1,0,0,0,283,1360,1,0,0,0,285,1362,1,0,0,0,287,1364, + 1,0,0,0,289,1366,1,0,0,0,291,1368,1,0,0,0,293,1371,1,0,0,0,295,1379, + 1,0,0,0,297,1410,1,0,0,0,299,1417,1,0,0,0,301,1427,1,0,0,0,303,1437, + 1,0,0,0,305,1439,1,0,0,0,307,1450,1,0,0,0,309,1465,1,0,0,0,311,312, + 5,101,0,0,312,313,5,100,0,0,313,314,5,105,0,0,314,315,5,116,0,0, + 315,2,1,0,0,0,316,317,5,99,0,0,317,318,5,111,0,0,318,319,5,109,0, + 0,319,320,5,112,0,0,320,321,5,111,0,0,321,322,5,110,0,0,322,323, + 5,101,0,0,323,324,5,110,0,0,324,325,5,116,0,0,325,4,1,0,0,0,326, + 327,5,112,0,0,327,328,5,114,0,0,328,329,5,101,0,0,329,330,5,115, + 0,0,330,331,5,101,0,0,331,332,5,110,0,0,332,333,5,116,0,0,333,334, + 5,97,0,0,334,335,5,116,0,0,335,336,5,105,0,0,336,337,5,111,0,0,337, + 338,5,110,0,0,338,6,1,0,0,0,339,340,5,115,0,0,340,341,5,117,0,0, + 341,342,5,98,0,0,342,343,5,106,0,0,343,344,5,101,0,0,344,345,5,99, + 0,0,345,346,5,116,0,0,346,8,1,0,0,0,347,348,5,114,0,0,348,349,5, + 117,0,0,349,350,5,110,0,0,350,351,5,116,0,0,351,352,5,105,0,0,352, + 353,5,109,0,0,353,354,5,101,0,0,354,10,1,0,0,0,355,356,5,102,0,0, + 356,357,5,111,0,0,357,358,5,114,0,0,358,12,1,0,0,0,359,360,5,99, + 0,0,360,361,5,114,0,0,361,362,5,101,0,0,362,363,5,97,0,0,363,364, + 5,116,0,0,364,365,5,105,0,0,365,366,5,111,0,0,366,367,5,110,0,0, + 367,14,1,0,0,0,368,369,5,105,0,0,369,370,5,110,0,0,370,371,5,105, + 0,0,371,372,5,116,0,0,372,373,5,105,0,0,373,374,5,97,0,0,374,375, + 5,108,0,0,375,376,5,105,0,0,376,377,5,122,0,0,377,378,5,101,0,0, + 378,16,1,0,0,0,379,380,5,119,0,0,380,381,5,111,0,0,381,382,5,114, + 0,0,382,383,5,107,0,0,383,384,5,115,0,0,384,385,5,112,0,0,385,386, + 5,97,0,0,386,387,5,99,0,0,387,388,5,101,0,0,388,18,1,0,0,0,389,390, + 5,101,0,0,390,391,5,120,0,0,391,392,5,101,0,0,392,393,5,99,0,0,393, + 394,5,117,0,0,394,395,5,116,0,0,395,396,5,105,0,0,396,397,5,111, + 0,0,397,398,5,110,0,0,398,20,1,0,0,0,399,400,5,115,0,0,400,401,5, + 110,0,0,401,402,5,97,0,0,402,403,5,112,0,0,403,404,5,115,0,0,404, + 405,5,104,0,0,405,406,5,111,0,0,406,407,5,116,0,0,407,22,1,0,0,0, + 408,409,5,116,0,0,409,410,5,114,0,0,410,411,5,97,0,0,411,412,5,110, + 0,0,412,413,5,115,0,0,413,414,5,97,0,0,414,415,5,99,0,0,415,416, + 5,116,0,0,416,417,5,105,0,0,417,418,5,111,0,0,418,419,5,110,0,0, + 419,24,1,0,0,0,420,421,5,114,0,0,421,422,5,101,0,0,422,423,5,109, + 0,0,423,424,5,111,0,0,424,425,5,116,0,0,425,426,5,101,0,0,426,26, + 1,0,0,0,427,428,5,116,0,0,428,429,5,97,0,0,429,430,5,114,0,0,430, + 431,5,103,0,0,431,432,5,101,0,0,432,433,5,116,0,0,433,434,5,115, + 0,0,434,28,1,0,0,0,435,436,5,112,0,0,436,437,5,111,0,0,437,438,5, + 114,0,0,438,439,5,116,0,0,439,440,5,97,0,0,440,441,5,98,0,0,441, + 442,5,108,0,0,442,443,5,101,0,0,443,30,1,0,0,0,444,445,5,114,0,0, + 445,446,5,101,0,0,446,447,5,112,0,0,447,448,5,108,0,0,448,449,5, + 105,0,0,449,450,5,99,0,0,450,451,5,97,0,0,451,32,1,0,0,0,452,453, + 5,108,0,0,453,454,5,111,0,0,454,455,5,99,0,0,455,456,5,97,0,0,456, + 457,5,108,0,0,457,34,1,0,0,0,458,459,5,102,0,0,459,460,5,114,0,0, + 460,461,5,111,0,0,461,462,5,109,0,0,462,36,1,0,0,0,463,464,5,114, + 0,0,464,465,5,101,0,0,465,466,5,115,0,0,466,467,5,117,0,0,467,468, + 5,108,0,0,468,469,5,116,0,0,469,470,5,45,0,0,470,471,5,98,0,0,471, + 472,5,121,0,0,472,473,5,116,0,0,473,474,5,101,0,0,474,475,5,115, + 0,0,475,38,1,0,0,0,476,477,5,114,0,0,477,478,5,112,0,0,478,479,5, + 99,0,0,479,480,5,45,0,0,480,481,5,99,0,0,481,482,5,97,0,0,482,483, + 5,108,0,0,483,484,5,108,0,0,484,485,5,115,0,0,485,40,1,0,0,0,486, + 487,5,100,0,0,487,488,5,101,0,0,488,489,5,97,0,0,489,490,5,100,0, + 0,490,491,5,108,0,0,491,492,5,105,0,0,492,493,5,110,0,0,493,494, + 5,101,0,0,494,495,5,45,0,0,495,496,5,109,0,0,496,497,5,115,0,0,497, + 42,1,0,0,0,498,499,5,113,0,0,499,500,5,117,0,0,500,501,5,101,0,0, + 501,502,5,114,0,0,502,503,5,121,0,0,503,44,1,0,0,0,504,505,5,114, + 0,0,505,506,5,101,0,0,506,507,5,102,0,0,507,508,5,108,0,0,508,509, + 5,101,0,0,509,510,5,99,0,0,510,511,5,116,0,0,511,512,5,105,0,0,512, + 513,5,111,0,0,513,514,5,110,0,0,514,46,1,0,0,0,515,516,5,115,0,0, + 516,517,5,112,0,0,517,518,5,101,0,0,518,519,5,99,0,0,519,520,5,105, + 0,0,520,521,5,97,0,0,521,522,5,108,0,0,522,523,5,105,0,0,523,524, + 5,122,0,0,524,525,5,101,0,0,525,48,1,0,0,0,526,527,5,114,0,0,527, + 528,5,111,0,0,528,529,5,111,0,0,529,530,5,116,0,0,530,50,1,0,0,0, + 531,532,5,100,0,0,532,533,5,111,0,0,533,534,5,99,0,0,534,535,5,117, + 0,0,535,536,5,109,0,0,536,537,5,101,0,0,537,538,5,110,0,0,538,539, + 5,116,0,0,539,52,1,0,0,0,540,541,5,102,0,0,541,542,5,114,0,0,542, + 543,5,97,0,0,543,544,5,103,0,0,544,545,5,109,0,0,545,546,5,101,0, + 0,546,547,5,110,0,0,547,548,5,116,0,0,548,549,5,115,0,0,549,54,1, + 0,0,0,550,551,5,118,0,0,551,552,5,105,0,0,552,553,5,101,0,0,553, + 554,5,119,0,0,554,56,1,0,0,0,555,556,5,109,0,0,556,557,5,97,0,0, + 557,558,5,120,0,0,558,58,1,0,0,0,559,560,5,97,0,0,560,561,5,108, + 0,0,561,562,5,108,0,0,562,563,5,111,0,0,563,564,5,119,0,0,564,60, + 1,0,0,0,565,566,5,112,0,0,566,567,5,111,0,0,567,568,5,108,0,0,568, + 569,5,108,0,0,569,62,1,0,0,0,570,571,5,113,0,0,571,572,5,117,0,0, + 572,573,5,101,0,0,573,574,5,114,0,0,574,575,5,121,0,0,575,576,5, + 97,0,0,576,577,5,98,0,0,577,578,5,108,0,0,578,579,5,101,0,0,579, + 64,1,0,0,0,580,581,5,114,0,0,581,582,5,112,0,0,582,583,5,99,0,0, + 583,66,1,0,0,0,584,585,5,113,0,0,585,586,5,117,0,0,586,587,5,101, + 0,0,587,588,5,114,0,0,588,589,5,121,0,0,589,590,5,45,0,0,590,591, + 5,114,0,0,591,592,5,101,0,0,592,593,5,97,0,0,593,594,5,115,0,0,594, + 595,5,111,0,0,595,596,5,110,0,0,596,68,1,0,0,0,597,598,5,116,0,0, + 598,599,5,121,0,0,599,600,5,112,0,0,600,601,5,101,0,0,601,70,1,0, + 0,0,602,603,5,111,0,0,603,604,5,98,0,0,604,605,5,106,0,0,605,606, + 5,101,0,0,606,607,5,99,0,0,607,608,5,116,0,0,608,72,1,0,0,0,609, + 610,5,115,0,0,610,611,5,116,0,0,611,612,5,111,0,0,612,613,5,114, + 0,0,613,614,5,97,0,0,614,615,5,98,0,0,615,616,5,108,0,0,616,617, + 5,101,0,0,617,74,1,0,0,0,618,619,5,105,0,0,619,620,5,109,0,0,620, + 621,5,112,0,0,621,622,5,108,0,0,622,623,5,101,0,0,623,624,5,109, + 0,0,624,625,5,101,0,0,625,626,5,110,0,0,626,627,5,116,0,0,627,628, + 5,115,0,0,628,76,1,0,0,0,629,630,5,114,0,0,630,631,5,101,0,0,631, + 632,5,102,0,0,632,78,1,0,0,0,633,634,5,102,0,0,634,635,5,114,0,0, + 635,636,5,97,0,0,636,637,5,103,0,0,637,638,5,109,0,0,638,639,5,101, + 0,0,639,640,5,110,0,0,640,641,5,116,0,0,641,80,1,0,0,0,642,643,5, + 105,0,0,643,644,5,109,0,0,644,645,5,112,0,0,645,646,5,111,0,0,646, + 647,5,114,0,0,647,648,5,116,0,0,648,82,1,0,0,0,649,650,5,101,0,0, + 650,651,5,120,0,0,651,652,5,116,0,0,652,653,5,101,0,0,653,654,5, + 114,0,0,654,655,5,110,0,0,655,656,5,97,0,0,656,657,5,108,0,0,657, + 84,1,0,0,0,658,659,5,97,0,0,659,660,5,116,0,0,660,661,5,111,0,0, + 661,662,5,109,0,0,662,86,1,0,0,0,663,664,5,105,0,0,664,665,5,110, + 0,0,665,666,5,116,0,0,666,667,5,101,0,0,667,668,5,114,0,0,668,669, + 5,102,0,0,669,670,5,97,0,0,670,671,5,99,0,0,671,672,5,101,0,0,672, + 88,1,0,0,0,673,674,5,105,0,0,674,675,5,110,0,0,675,676,5,116,0,0, + 676,677,5,101,0,0,677,678,5,114,0,0,678,679,5,102,0,0,679,680,5, + 97,0,0,680,681,5,99,0,0,681,682,5,101,0,0,682,683,5,115,0,0,683, + 90,1,0,0,0,684,685,5,112,0,0,685,686,5,97,0,0,686,687,5,99,0,0,687, + 688,5,107,0,0,688,689,5,97,0,0,689,690,5,103,0,0,690,691,5,101,0, + 0,691,92,1,0,0,0,692,693,5,118,0,0,693,694,5,97,0,0,694,695,5,108, + 0,0,695,696,5,117,0,0,696,697,5,101,0,0,697,94,1,0,0,0,698,699,5, + 114,0,0,699,700,5,101,0,0,700,701,5,108,0,0,701,702,5,97,0,0,702, + 703,5,116,0,0,703,704,5,105,0,0,704,705,5,111,0,0,705,706,5,110, + 0,0,706,96,1,0,0,0,707,708,5,111,0,0,708,709,5,112,0,0,709,710,5, + 101,0,0,710,711,5,114,0,0,711,712,5,97,0,0,712,713,5,116,0,0,713, + 714,5,105,0,0,714,715,5,111,0,0,715,716,5,110,0,0,716,98,1,0,0,0, + 717,718,5,102,0,0,718,719,5,117,0,0,719,720,5,110,0,0,720,721,5, + 99,0,0,721,722,5,116,0,0,722,723,5,105,0,0,723,724,5,111,0,0,724, + 725,5,110,0,0,725,100,1,0,0,0,726,727,5,99,0,0,727,728,5,111,0,0, + 728,729,5,110,0,0,729,730,5,115,0,0,730,731,5,116,0,0,731,732,5, + 114,0,0,732,733,5,117,0,0,733,734,5,99,0,0,734,735,5,116,0,0,735, + 736,5,111,0,0,736,737,5,114,0,0,737,102,1,0,0,0,738,739,5,99,0,0, + 739,740,5,111,0,0,740,741,5,110,0,0,741,742,5,115,0,0,742,743,5, + 116,0,0,743,744,5,114,0,0,744,745,5,117,0,0,745,746,5,99,0,0,746, + 747,5,116,0,0,747,748,5,115,0,0,748,104,1,0,0,0,749,750,5,105,0, + 0,750,751,5,110,0,0,751,752,5,112,0,0,752,753,5,117,0,0,753,754, + 5,116,0,0,754,106,1,0,0,0,755,756,5,99,0,0,756,757,5,111,0,0,757, + 758,5,110,0,0,758,759,5,102,0,0,759,760,5,111,0,0,760,761,5,114, + 0,0,761,762,5,109,0,0,762,108,1,0,0,0,763,764,5,97,0,0,764,765,5, + 115,0,0,765,110,1,0,0,0,766,767,5,98,0,0,767,768,5,105,0,0,768,769, + 5,110,0,0,769,770,5,100,0,0,770,112,1,0,0,0,771,772,5,115,0,0,772, + 773,5,116,0,0,773,774,5,97,0,0,774,775,5,116,0,0,775,776,5,105,0, + 0,776,777,5,99,0,0,777,114,1,0,0,0,778,779,5,116,0,0,779,780,5,111, + 0,0,780,116,1,0,0,0,781,782,5,112,0,0,782,783,5,114,0,0,783,784, + 5,105,0,0,784,785,5,118,0,0,785,786,5,97,0,0,786,787,5,116,0,0,787, + 788,5,101,0,0,788,118,1,0,0,0,789,790,5,115,0,0,790,791,5,104,0, + 0,791,792,5,97,0,0,792,793,5,114,0,0,793,794,5,101,0,0,794,795,5, + 100,0,0,795,120,1,0,0,0,796,797,5,115,0,0,797,798,5,116,0,0,798, + 799,5,97,0,0,799,800,5,116,0,0,800,801,5,101,0,0,801,122,1,0,0,0, + 802,803,5,101,0,0,803,804,5,100,0,0,804,805,5,103,0,0,805,806,5, + 101,0,0,806,124,1,0,0,0,807,808,5,112,0,0,808,809,5,114,0,0,809, + 810,5,111,0,0,810,811,5,106,0,0,811,812,5,101,0,0,812,813,5,99,0, + 0,813,814,5,116,0,0,814,815,5,105,0,0,815,816,5,111,0,0,816,817, + 5,110,0,0,817,126,1,0,0,0,818,819,5,119,0,0,819,820,5,105,0,0,820, + 821,5,116,0,0,821,822,5,104,0,0,822,128,1,0,0,0,823,824,5,117,0, + 0,824,825,5,115,0,0,825,826,5,105,0,0,826,827,5,110,0,0,827,828, + 5,103,0,0,828,130,1,0,0,0,829,830,5,97,0,0,830,831,5,99,0,0,831, + 832,5,99,0,0,832,833,5,101,0,0,833,834,5,112,0,0,834,835,5,116,0, + 0,835,132,1,0,0,0,836,837,5,118,0,0,837,838,5,105,0,0,838,839,5, + 97,0,0,839,134,1,0,0,0,840,841,5,109,0,0,841,842,5,97,0,0,842,843, + 5,116,0,0,843,844,5,101,0,0,844,845,5,114,0,0,845,846,5,105,0,0, + 846,847,5,97,0,0,847,848,5,108,0,0,848,849,5,105,0,0,849,850,5,122, + 0,0,850,851,5,101,0,0,851,136,1,0,0,0,852,853,5,105,0,0,853,854, + 5,102,0,0,854,138,1,0,0,0,855,856,5,97,0,0,856,857,5,98,0,0,857, + 858,5,115,0,0,858,859,5,101,0,0,859,860,5,110,0,0,860,861,5,116, + 0,0,861,140,1,0,0,0,862,863,5,111,0,0,863,864,5,110,0,0,864,142, + 1,0,0,0,865,866,5,112,0,0,866,867,5,111,0,0,867,868,5,108,0,0,868, + 869,5,105,0,0,869,870,5,99,0,0,870,871,5,121,0,0,871,144,1,0,0,0, + 872,873,5,100,0,0,873,874,5,101,0,0,874,875,5,102,0,0,875,876,5, + 97,0,0,876,877,5,117,0,0,877,878,5,108,0,0,878,879,5,116,0,0,879, + 146,1,0,0,0,880,881,5,115,0,0,881,882,5,111,0,0,882,883,5,117,0, + 0,883,884,5,114,0,0,884,885,5,99,0,0,885,886,5,101,0,0,886,148,1, + 0,0,0,887,888,5,114,0,0,888,889,5,101,0,0,889,890,5,112,0,0,890, + 891,5,111,0,0,891,892,5,115,0,0,892,893,5,105,0,0,893,894,5,116, + 0,0,894,895,5,111,0,0,895,896,5,114,0,0,896,897,5,121,0,0,897,150, + 1,0,0,0,898,899,5,99,0,0,899,900,5,111,0,0,900,901,5,109,0,0,901, + 902,5,109,0,0,902,903,5,105,0,0,903,904,5,116,0,0,904,152,1,0,0, + 0,905,906,5,114,0,0,906,907,5,101,0,0,907,908,5,118,0,0,908,909, + 5,105,0,0,909,910,5,115,0,0,910,911,5,105,0,0,911,912,5,111,0,0, + 912,913,5,110,0,0,913,154,1,0,0,0,914,915,5,115,0,0,915,916,5,101, + 0,0,916,917,5,109,0,0,917,918,5,97,0,0,918,919,5,110,0,0,919,920, + 5,116,0,0,920,921,5,105,0,0,921,922,5,99,0,0,922,923,5,45,0,0,923, + 924,5,109,0,0,924,925,5,97,0,0,925,926,5,106,0,0,926,927,5,111,0, + 0,927,928,5,114,0,0,928,156,1,0,0,0,929,930,5,111,0,0,930,931,5, + 110,0,0,931,932,5,45,0,0,932,933,5,100,0,0,933,934,5,101,0,0,934, + 935,5,108,0,0,935,936,5,101,0,0,936,937,5,116,0,0,937,938,5,101, + 0,0,938,158,1,0,0,0,939,940,5,108,0,0,940,941,5,105,0,0,941,942, + 5,102,0,0,942,943,5,101,0,0,943,944,5,99,0,0,944,945,5,121,0,0,945, + 946,5,99,0,0,946,947,5,108,0,0,947,948,5,101,0,0,948,160,1,0,0,0, + 949,950,5,114,0,0,950,951,5,101,0,0,951,952,5,116,0,0,952,953,5, + 97,0,0,953,954,5,105,0,0,954,955,5,110,0,0,955,956,5,45,0,0,956, + 957,5,111,0,0,957,958,5,116,0,0,958,959,5,104,0,0,959,960,5,101, + 0,0,960,961,5,114,0,0,961,162,1,0,0,0,962,963,5,107,0,0,963,964, + 5,101,0,0,964,965,5,121,0,0,965,966,5,101,0,0,966,967,5,100,0,0, + 967,164,1,0,0,0,968,969,5,112,0,0,969,970,5,117,0,0,970,971,5,98, + 0,0,971,972,5,108,0,0,972,973,5,105,0,0,973,974,5,99,0,0,974,975, + 5,45,0,0,975,976,5,116,0,0,976,977,5,114,0,0,977,978,5,97,0,0,978, + 979,5,118,0,0,979,980,5,101,0,0,980,981,5,114,0,0,981,982,5,115, + 0,0,982,983,5,97,0,0,983,984,5,108,0,0,984,166,1,0,0,0,985,986,5, + 105,0,0,986,987,5,100,0,0,987,168,1,0,0,0,988,989,5,100,0,0,989, + 990,5,111,0,0,990,991,5,99,0,0,991,170,1,0,0,0,992,993,5,109,0,0, + 993,994,5,111,0,0,994,995,5,100,0,0,995,996,5,101,0,0,996,172,1, + 0,0,0,997,998,5,101,0,0,998,999,5,109,0,0,999,1000,5,105,0,0,1000, + 1001,5,116,0,0,1001,1002,5,115,0,0,1002,174,1,0,0,0,1003,1004,5, + 114,0,0,1004,1005,5,101,0,0,1005,1006,5,99,0,0,1006,1007,5,101,0, + 0,1007,1008,5,105,0,0,1008,1009,5,118,0,0,1009,1010,5,101,0,0,1010, + 1011,5,114,0,0,1011,176,1,0,0,0,1012,1013,5,114,0,0,1013,1014,5, + 101,0,0,1014,1015,5,113,0,0,1015,1016,5,117,0,0,1016,1017,5,105, + 0,0,1017,1018,5,114,0,0,1018,1019,5,101,0,0,1019,1020,5,115,0,0, + 1020,178,1,0,0,0,1021,1022,5,97,0,0,1022,1023,5,110,0,0,1023,1024, + 5,121,0,0,1024,180,1,0,0,0,1025,1026,5,103,0,0,1026,1027,5,101,0, + 0,1027,1028,5,116,0,0,1028,182,1,0,0,0,1029,1030,5,115,0,0,1030, + 1031,5,101,0,0,1031,1032,5,116,0,0,1032,184,1,0,0,0,1033,1034,5, + 119,0,0,1034,1035,5,97,0,0,1035,1036,5,116,0,0,1036,1037,5,99,0, + 0,1037,1038,5,104,0,0,1038,186,1,0,0,0,1039,1040,5,115,0,0,1040, + 1041,5,116,0,0,1041,1042,5,97,0,0,1042,1043,5,114,0,0,1043,1044, + 5,116,0,0,1044,188,1,0,0,0,1045,1046,5,115,0,0,1046,1047,5,116,0, + 0,1047,1048,5,111,0,0,1048,1049,5,112,0,0,1049,190,1,0,0,0,1050, + 1051,5,114,0,0,1051,1052,5,101,0,0,1052,1053,5,97,0,0,1053,1054, + 5,100,0,0,1054,192,1,0,0,0,1055,1056,5,119,0,0,1056,1057,5,114,0, + 0,1057,1058,5,105,0,0,1058,1059,5,116,0,0,1059,1060,5,101,0,0,1060, + 194,1,0,0,0,1061,1062,5,114,0,0,1062,1063,5,101,0,0,1063,1064,5, + 115,0,0,1064,1065,5,111,0,0,1065,1066,5,108,0,0,1066,1067,5,118, + 0,0,1067,1068,5,101,0,0,1068,196,1,0,0,0,1069,1070,5,99,0,0,1070, + 1071,5,111,0,0,1071,1072,5,110,0,0,1072,1073,5,110,0,0,1073,1074, + 5,101,0,0,1074,1075,5,99,0,0,1075,1076,5,116,0,0,1076,198,1,0,0, + 0,1077,1078,5,100,0,0,1078,1079,5,105,0,0,1079,1080,5,115,0,0,1080, + 1081,5,99,0,0,1081,1082,5,111,0,0,1082,1083,5,110,0,0,1083,1084, + 5,110,0,0,1084,1085,5,101,0,0,1085,1086,5,99,0,0,1086,1087,5,116, + 0,0,1087,200,1,0,0,0,1088,1089,5,99,0,0,1089,1090,5,97,0,0,1090, + 1091,5,108,0,0,1091,1092,5,108,0,0,1092,202,1,0,0,0,1093,1094,5, + 119,0,0,1094,1095,5,97,0,0,1095,1096,5,116,0,0,1096,1097,5,99,0, + 0,1097,1098,5,104,0,0,1098,1099,5,45,0,0,1099,1100,5,115,0,0,1100, + 1101,5,116,0,0,1101,1102,5,97,0,0,1102,1103,5,114,0,0,1103,1104, + 5,116,0,0,1104,204,1,0,0,0,1105,1106,5,119,0,0,1106,1107,5,97,0, + 0,1107,1108,5,116,0,0,1108,1109,5,99,0,0,1109,1110,5,104,0,0,1110, + 1111,5,45,0,0,1111,1112,5,115,0,0,1112,1113,5,116,0,0,1113,1114, + 5,111,0,0,1114,1115,5,112,0,0,1115,206,1,0,0,0,1116,1117,5,115,0, + 0,1117,1118,5,117,0,0,1118,1119,5,98,0,0,1119,1120,5,115,0,0,1120, + 1121,5,99,0,0,1121,1122,5,114,0,0,1122,1123,5,105,0,0,1123,1124, + 5,98,0,0,1124,1125,5,101,0,0,1125,208,1,0,0,0,1126,1127,5,117,0, + 0,1127,1128,5,110,0,0,1128,1129,5,115,0,0,1129,1130,5,117,0,0,1130, + 1131,5,98,0,0,1131,1132,5,115,0,0,1132,1133,5,99,0,0,1133,1134,5, + 114,0,0,1134,1135,5,105,0,0,1135,1136,5,98,0,0,1136,1137,5,101,0, + 0,1137,210,1,0,0,0,1138,1139,5,114,0,0,1139,1140,5,101,0,0,1140, + 1141,5,103,0,0,1141,1142,5,105,0,0,1142,1143,5,115,0,0,1143,1144, + 5,116,0,0,1144,1145,5,101,0,0,1145,1146,5,114,0,0,1146,212,1,0,0, + 0,1147,1148,5,99,0,0,1148,1149,5,114,0,0,1149,1150,5,100,0,0,1150, + 1151,5,116,0,0,1151,214,1,0,0,0,1152,1153,5,111,0,0,1153,1154,5, + 112,0,0,1154,1155,5,116,0,0,1155,1156,5,105,0,0,1156,1157,5,111, + 0,0,1157,1158,5,110,0,0,1158,1159,5,97,0,0,1159,1160,5,108,0,0,1160, + 1161,5,45,0,0,1161,1162,5,111,0,0,1162,1163,5,110,0,0,1163,1164, + 5,101,0,0,1164,216,1,0,0,0,1165,1166,5,101,0,0,1166,1167,5,120,0, + 0,1167,1168,5,97,0,0,1168,1169,5,99,0,0,1169,1170,5,116,0,0,1170, + 1171,5,108,0,0,1171,1172,5,121,0,0,1172,1173,5,45,0,0,1173,1174, + 5,111,0,0,1174,1175,5,110,0,0,1175,1176,5,101,0,0,1176,218,1,0,0, + 0,1177,1178,5,109,0,0,1178,1179,5,97,0,0,1179,1180,5,110,0,0,1180, + 1181,5,121,0,0,1181,1182,5,45,0,0,1182,1183,5,117,0,0,1183,1184, + 5,110,0,0,1184,1185,5,105,0,0,1185,1186,5,113,0,0,1186,1187,5,117, + 0,0,1187,1188,5,101,0,0,1188,220,1,0,0,0,1189,1190,5,109,0,0,1190, + 1191,5,97,0,0,1191,1192,5,110,0,0,1192,1193,5,121,0,0,1193,222,1, + 0,0,0,1194,1195,5,111,0,0,1195,1196,5,114,0,0,1196,1197,5,100,0, + 0,1197,1198,5,101,0,0,1198,1199,5,114,0,0,1199,1200,5,101,0,0,1200, + 1201,5,100,0,0,1201,224,1,0,0,0,1202,1203,5,117,0,0,1203,1204,5, + 110,0,0,1204,1205,5,105,0,0,1205,1206,5,116,0,0,1206,226,1,0,0,0, + 1207,1208,5,119,0,0,1208,1209,5,97,0,0,1209,1210,5,116,0,0,1210, + 1211,5,99,0,0,1211,1212,5,104,0,0,1212,1213,5,45,0,0,1213,1214,5, + 104,0,0,1214,1215,5,97,0,0,1215,1216,5,110,0,0,1216,1217,5,100,0, + 0,1217,1218,5,108,0,0,1218,1219,5,101,0,0,1219,228,1,0,0,0,1220, + 1221,5,109,0,0,1221,1222,5,101,0,0,1222,1223,5,115,0,0,1223,1224, + 5,115,0,0,1224,1225,5,97,0,0,1225,1226,5,103,0,0,1226,1227,5,101, + 0,0,1227,230,1,0,0,0,1228,1229,5,97,0,0,1229,1230,5,116,0,0,1230, + 1231,5,111,0,0,1231,1232,5,109,0,0,1232,1233,5,45,0,0,1233,1234, + 5,114,0,0,1234,1235,5,101,0,0,1235,1236,5,102,0,0,1236,232,1,0,0, + 0,1237,1238,5,105,0,0,1238,1239,5,110,0,0,1239,1240,5,116,0,0,1240, + 1241,5,101,0,0,1241,1242,5,114,0,0,1242,1243,5,102,0,0,1243,1244, + 5,97,0,0,1244,1245,5,99,0,0,1245,1246,5,101,0,0,1246,1247,5,45,0, + 0,1247,1248,5,114,0,0,1248,1249,5,101,0,0,1249,1250,5,102,0,0,1250, + 234,1,0,0,0,1251,1252,5,111,0,0,1252,1253,5,112,0,0,1253,1254,5, + 116,0,0,1254,1255,5,105,0,0,1255,1256,5,111,0,0,1256,1257,5,110, + 0,0,1257,1258,5,97,0,0,1258,1259,5,108,0,0,1259,236,1,0,0,0,1260, + 1261,5,108,0,0,1261,1262,5,105,0,0,1262,1263,5,115,0,0,1263,1264, + 5,116,0,0,1264,238,1,0,0,0,1265,1266,5,114,0,0,1266,1267,5,101,0, + 0,1267,1268,5,99,0,0,1268,1269,5,111,0,0,1269,1270,5,114,0,0,1270, + 1271,5,100,0,0,1271,240,1,0,0,0,1272,1273,5,98,0,0,1273,1274,5,111, + 0,0,1274,1275,5,111,0,0,1275,1276,5,108,0,0,1276,242,1,0,0,0,1277, + 1278,5,98,0,0,1278,1279,5,121,0,0,1279,1280,5,116,0,0,1280,1281, + 5,101,0,0,1281,1282,5,115,0,0,1282,244,1,0,0,0,1283,1284,5,100,0, + 0,1284,1285,5,111,0,0,1285,1286,5,117,0,0,1286,1287,5,98,0,0,1287, + 1288,5,108,0,0,1288,1289,5,101,0,0,1289,246,1,0,0,0,1290,1291,5, + 105,0,0,1291,1292,5,110,0,0,1292,1293,5,116,0,0,1293,1294,5,51,0, + 0,1294,1295,5,50,0,0,1295,248,1,0,0,0,1296,1297,5,105,0,0,1297,1298, + 5,110,0,0,1298,1299,5,116,0,0,1299,1300,5,54,0,0,1300,1301,5,52, + 0,0,1301,250,1,0,0,0,1302,1303,5,115,0,0,1303,1304,5,116,0,0,1304, + 1305,5,114,0,0,1305,1306,5,105,0,0,1306,1307,5,110,0,0,1307,1308, + 5,103,0,0,1308,252,1,0,0,0,1309,1310,5,117,0,0,1310,1311,5,105,0, + 0,1311,1312,5,110,0,0,1312,1313,5,116,0,0,1313,1314,5,51,0,0,1314, + 1315,5,50,0,0,1315,254,1,0,0,0,1316,1317,5,117,0,0,1317,1318,5,105, + 0,0,1318,1319,5,110,0,0,1319,1320,5,116,0,0,1320,1321,5,54,0,0,1321, + 1322,5,52,0,0,1322,256,1,0,0,0,1323,1324,5,116,0,0,1324,1325,5,114, + 0,0,1325,1326,5,117,0,0,1326,1327,5,101,0,0,1327,258,1,0,0,0,1328, + 1329,5,102,0,0,1329,1330,5,97,0,0,1330,1331,5,108,0,0,1331,1332, + 5,115,0,0,1332,1333,5,101,0,0,1333,260,1,0,0,0,1334,1335,5,110,0, + 0,1335,1336,5,117,0,0,1336,1337,5,108,0,0,1337,1338,5,108,0,0,1338, + 262,1,0,0,0,1339,1340,5,45,0,0,1340,1341,5,62,0,0,1341,264,1,0,0, + 0,1342,1343,5,58,0,0,1343,266,1,0,0,0,1344,1345,5,59,0,0,1345,268, + 1,0,0,0,1346,1347,5,44,0,0,1347,270,1,0,0,0,1348,1349,5,46,0,0,1349, + 272,1,0,0,0,1350,1351,5,123,0,0,1351,274,1,0,0,0,1352,1353,5,125, + 0,0,1353,276,1,0,0,0,1354,1355,5,91,0,0,1355,278,1,0,0,0,1356,1357, + 5,93,0,0,1357,280,1,0,0,0,1358,1359,5,40,0,0,1359,282,1,0,0,0,1360, + 1361,5,41,0,0,1361,284,1,0,0,0,1362,1363,5,60,0,0,1363,286,1,0,0, + 0,1364,1365,5,62,0,0,1365,288,1,0,0,0,1366,1367,5,38,0,0,1367,290, + 1,0,0,0,1368,1369,5,61,0,0,1369,292,1,0,0,0,1370,1372,5,45,0,0,1371, + 1370,1,0,0,0,1371,1372,1,0,0,0,1372,1374,1,0,0,0,1373,1375,7,0,0, + 0,1374,1373,1,0,0,0,1375,1376,1,0,0,0,1376,1374,1,0,0,0,1376,1377, + 1,0,0,0,1377,294,1,0,0,0,1378,1380,5,45,0,0,1379,1378,1,0,0,0,1379, + 1380,1,0,0,0,1380,1389,1,0,0,0,1381,1390,5,48,0,0,1382,1386,7,1, + 0,0,1383,1385,7,0,0,0,1384,1383,1,0,0,0,1385,1388,1,0,0,0,1386,1384, + 1,0,0,0,1386,1387,1,0,0,0,1387,1390,1,0,0,0,1388,1386,1,0,0,0,1389, + 1381,1,0,0,0,1389,1382,1,0,0,0,1390,1397,1,0,0,0,1391,1393,5,46, + 0,0,1392,1394,7,0,0,0,1393,1392,1,0,0,0,1394,1395,1,0,0,0,1395,1393, + 1,0,0,0,1395,1396,1,0,0,0,1396,1398,1,0,0,0,1397,1391,1,0,0,0,1397, + 1398,1,0,0,0,1398,1408,1,0,0,0,1399,1401,7,2,0,0,1400,1402,7,3,0, + 0,1401,1400,1,0,0,0,1401,1402,1,0,0,0,1402,1404,1,0,0,0,1403,1405, + 7,0,0,0,1404,1403,1,0,0,0,1405,1406,1,0,0,0,1406,1404,1,0,0,0,1406, + 1407,1,0,0,0,1407,1409,1,0,0,0,1408,1399,1,0,0,0,1408,1409,1,0,0, + 0,1409,296,1,0,0,0,1410,1414,7,4,0,0,1411,1413,7,5,0,0,1412,1411, + 1,0,0,0,1413,1416,1,0,0,0,1414,1412,1,0,0,0,1414,1415,1,0,0,0,1415, + 298,1,0,0,0,1416,1414,1,0,0,0,1417,1422,5,34,0,0,1418,1421,3,301, + 150,0,1419,1421,8,6,0,0,1420,1418,1,0,0,0,1420,1419,1,0,0,0,1421, + 1424,1,0,0,0,1422,1420,1,0,0,0,1422,1423,1,0,0,0,1423,1425,1,0,0, + 0,1424,1422,1,0,0,0,1425,1426,5,34,0,0,1426,300,1,0,0,0,1427,1435, + 5,92,0,0,1428,1436,7,7,0,0,1429,1430,5,117,0,0,1430,1431,3,303,151, + 0,1431,1432,3,303,151,0,1432,1433,3,303,151,0,1433,1434,3,303,151, + 0,1434,1436,1,0,0,0,1435,1428,1,0,0,0,1435,1429,1,0,0,0,1436,302, + 1,0,0,0,1437,1438,7,8,0,0,1438,304,1,0,0,0,1439,1440,5,47,0,0,1440, + 1441,5,47,0,0,1441,1445,1,0,0,0,1442,1444,8,9,0,0,1443,1442,1,0, + 0,0,1444,1447,1,0,0,0,1445,1443,1,0,0,0,1445,1446,1,0,0,0,1446,1448, + 1,0,0,0,1447,1445,1,0,0,0,1448,1449,6,152,0,0,1449,306,1,0,0,0,1450, + 1451,5,47,0,0,1451,1452,5,42,0,0,1452,1456,1,0,0,0,1453,1455,9,0, + 0,0,1454,1453,1,0,0,0,1455,1458,1,0,0,0,1456,1457,1,0,0,0,1456,1454, + 1,0,0,0,1457,1459,1,0,0,0,1458,1456,1,0,0,0,1459,1460,5,42,0,0,1460, + 1461,5,47,0,0,1461,1462,1,0,0,0,1462,1463,6,153,0,0,1463,308,1,0, + 0,0,1464,1466,7,10,0,0,1465,1464,1,0,0,0,1466,1467,1,0,0,0,1467, + 1465,1,0,0,0,1467,1468,1,0,0,0,1468,1469,1,0,0,0,1469,1470,6,154, + 0,0,1470,310,1,0,0,0,18,0,1371,1376,1379,1386,1389,1395,1397,1401, + 1406,1408,1414,1420,1422,1435,1445,1456,1467,1,0,1,0 ]; private static __ATN: antlr.ATN; diff --git a/src/capability-language/generated/QuixosCapabilityParser.ts b/src/capability-language/generated/QuixosCapabilityParser.ts index 128b09f..854e3df 100644 --- a/src/capability-language/generated/QuixosCapabilityParser.ts +++ b/src/capability-language/generated/QuixosCapabilityParser.ts @@ -11,153 +11,158 @@ type int = number; export class QuixosCapabilityParser extends antlr.Parser { public static readonly EDIT = 1; - public static readonly CREATION = 2; - public static readonly INITIALIZE = 3; - public static readonly WORKSPACE = 4; - public static readonly EXECUTION = 5; - public static readonly SNAPSHOT = 6; - public static readonly TRANSACTION = 7; - public static readonly REMOTE = 8; - public static readonly TARGETS = 9; - public static readonly PORTABLE = 10; - public static readonly REPLICA = 11; - public static readonly LOCAL = 12; - public static readonly FROM = 13; - public static readonly RESULT_BYTES = 14; - public static readonly RPC_CALLS = 15; - public static readonly DEADLINE_MS = 16; - public static readonly QUERY = 17; - public static readonly REFLECTION = 18; - public static readonly SPECIALIZE = 19; - public static readonly ROOT = 20; - public static readonly DOCUMENT = 21; - public static readonly FRAGMENTS = 22; - public static readonly VIEW = 23; - public static readonly MAX = 24; - public static readonly ALLOW = 25; - public static readonly POLL = 26; - public static readonly QUERYABLE = 27; - public static readonly RPC = 28; - public static readonly QUERY_REASON = 29; - public static readonly TYPE = 30; - public static readonly OBJECT = 31; - public static readonly STORABLE = 32; - public static readonly IMPLEMENTS = 33; - public static readonly REF = 34; - public static readonly FRAGMENT = 35; - public static readonly IMPORT = 36; - public static readonly EXTERNAL = 37; - public static readonly ATOM = 38; - public static readonly INTERFACE = 39; - public static readonly INTERFACES = 40; - public static readonly PACKAGE = 41; - public static readonly VALUE = 42; - public static readonly RELATION = 43; - public static readonly OPERATION = 44; - public static readonly FUNCTION = 45; - public static readonly CONSTRUCTOR = 46; - public static readonly CONSTRUCTS = 47; - public static readonly INPUT = 48; - public static readonly CONFORM = 49; - public static readonly AS = 50; - public static readonly BIND = 51; - public static readonly STATIC = 52; - public static readonly TO = 53; - public static readonly PRIVATE = 54; - public static readonly SHARED = 55; - public static readonly STATE = 56; - public static readonly EDGE = 57; - public static readonly PROJECTION = 58; - public static readonly WITH = 59; - public static readonly USING = 60; - public static readonly ACCEPT = 61; - public static readonly VIA = 62; - public static readonly MATERIALIZE = 63; - public static readonly IF = 64; - public static readonly ABSENT = 65; - public static readonly ON = 66; - public static readonly POLICY = 67; - public static readonly DEFAULT = 68; - public static readonly SOURCE = 69; - public static readonly REPOSITORY = 70; - public static readonly COMMIT = 71; - public static readonly REVISION = 72; - public static readonly SEMANTIC_MAJOR = 73; - public static readonly ON_DELETE = 74; - public static readonly LIFECYCLE = 75; - public static readonly RETAIN_OTHER = 76; - public static readonly KEYED = 77; - public static readonly PUBLIC_TRAVERSAL = 78; - public static readonly ID = 79; - public static readonly DOC = 80; - public static readonly MODE = 81; - public static readonly EMITS = 82; - public static readonly RECEIVER = 83; - public static readonly REQUIRES = 84; - public static readonly ANY = 85; - public static readonly GET = 86; - public static readonly SET = 87; - public static readonly WATCH = 88; - public static readonly START = 89; - public static readonly STOP = 90; - public static readonly READ = 91; - public static readonly WRITE = 92; - public static readonly RESOLVE = 93; - public static readonly CONNECT = 94; - public static readonly DISCONNECT = 95; - public static readonly CALL = 96; - public static readonly WATCH_START = 97; - public static readonly WATCH_STOP = 98; - public static readonly SUBSCRIBE = 99; - public static readonly UNSUBSCRIBE = 100; - public static readonly REGISTER = 101; - public static readonly CRDT = 102; - public static readonly OPTIONAL_ONE = 103; - public static readonly EXACTLY_ONE = 104; - public static readonly MANY_UNIQUE = 105; - public static readonly MANY = 106; - public static readonly ORDERED = 107; - public static readonly UNIT = 108; - public static readonly WATCH_HANDLE = 109; - public static readonly MESSAGE = 110; - public static readonly ATOM_REF = 111; - public static readonly INTERFACE_REF = 112; - public static readonly OPTIONAL = 113; - public static readonly LIST = 114; - public static readonly RECORD = 115; - public static readonly BOOL = 116; - public static readonly BYTES = 117; - public static readonly DOUBLE = 118; - public static readonly INT32 = 119; - public static readonly INT64 = 120; - public static readonly STRING = 121; - public static readonly UINT32 = 122; - public static readonly UINT64 = 123; - public static readonly TRUE = 124; - public static readonly FALSE = 125; - public static readonly NULL = 126; - public static readonly ARROW = 127; - public static readonly COLON = 128; - public static readonly SEMI = 129; - public static readonly COMMA = 130; - public static readonly DOT = 131; - public static readonly LBRACE = 132; - public static readonly RBRACE = 133; - public static readonly LBRACK = 134; - public static readonly RBRACK = 135; - public static readonly LPAREN = 136; - public static readonly RPAREN = 137; - public static readonly LT = 138; - public static readonly GT = 139; - public static readonly AMP = 140; - public static readonly EQUAL = 141; - public static readonly INTEGER = 142; - public static readonly JSON_NUMBER = 143; - public static readonly IDENTIFIER = 144; - public static readonly STRING_LITERAL = 145; - public static readonly LINE_COMMENT = 146; - public static readonly BLOCK_COMMENT = 147; - public static readonly WS = 148; + public static readonly COMPONENT = 2; + public static readonly PRESENTATION = 3; + public static readonly SUBJECT = 4; + public static readonly RUNTIME = 5; + public static readonly FOR = 6; + public static readonly CREATION = 7; + public static readonly INITIALIZE = 8; + public static readonly WORKSPACE = 9; + public static readonly EXECUTION = 10; + public static readonly SNAPSHOT = 11; + public static readonly TRANSACTION = 12; + public static readonly REMOTE = 13; + public static readonly TARGETS = 14; + public static readonly PORTABLE = 15; + public static readonly REPLICA = 16; + public static readonly LOCAL = 17; + public static readonly FROM = 18; + public static readonly RESULT_BYTES = 19; + public static readonly RPC_CALLS = 20; + public static readonly DEADLINE_MS = 21; + public static readonly QUERY = 22; + public static readonly REFLECTION = 23; + public static readonly SPECIALIZE = 24; + public static readonly ROOT = 25; + public static readonly DOCUMENT = 26; + public static readonly FRAGMENTS = 27; + public static readonly VIEW = 28; + public static readonly MAX = 29; + public static readonly ALLOW = 30; + public static readonly POLL = 31; + public static readonly QUERYABLE = 32; + public static readonly RPC = 33; + public static readonly QUERY_REASON = 34; + public static readonly TYPE = 35; + public static readonly OBJECT = 36; + public static readonly STORABLE = 37; + public static readonly IMPLEMENTS = 38; + public static readonly REF = 39; + public static readonly FRAGMENT = 40; + public static readonly IMPORT = 41; + public static readonly EXTERNAL = 42; + public static readonly ATOM = 43; + public static readonly INTERFACE = 44; + public static readonly INTERFACES = 45; + public static readonly PACKAGE = 46; + public static readonly VALUE = 47; + public static readonly RELATION = 48; + public static readonly OPERATION = 49; + public static readonly FUNCTION = 50; + public static readonly CONSTRUCTOR = 51; + public static readonly CONSTRUCTS = 52; + public static readonly INPUT = 53; + public static readonly CONFORM = 54; + public static readonly AS = 55; + public static readonly BIND = 56; + public static readonly STATIC = 57; + public static readonly TO = 58; + public static readonly PRIVATE = 59; + public static readonly SHARED = 60; + public static readonly STATE = 61; + public static readonly EDGE = 62; + public static readonly PROJECTION = 63; + public static readonly WITH = 64; + public static readonly USING = 65; + public static readonly ACCEPT = 66; + public static readonly VIA = 67; + public static readonly MATERIALIZE = 68; + public static readonly IF = 69; + public static readonly ABSENT = 70; + public static readonly ON = 71; + public static readonly POLICY = 72; + public static readonly DEFAULT = 73; + public static readonly SOURCE = 74; + public static readonly REPOSITORY = 75; + public static readonly COMMIT = 76; + public static readonly REVISION = 77; + public static readonly SEMANTIC_MAJOR = 78; + public static readonly ON_DELETE = 79; + public static readonly LIFECYCLE = 80; + public static readonly RETAIN_OTHER = 81; + public static readonly KEYED = 82; + public static readonly PUBLIC_TRAVERSAL = 83; + public static readonly ID = 84; + public static readonly DOC = 85; + public static readonly MODE = 86; + public static readonly EMITS = 87; + public static readonly RECEIVER = 88; + public static readonly REQUIRES = 89; + public static readonly ANY = 90; + public static readonly GET = 91; + public static readonly SET = 92; + public static readonly WATCH = 93; + public static readonly START = 94; + public static readonly STOP = 95; + public static readonly READ = 96; + public static readonly WRITE = 97; + public static readonly RESOLVE = 98; + public static readonly CONNECT = 99; + public static readonly DISCONNECT = 100; + public static readonly CALL = 101; + public static readonly WATCH_START = 102; + public static readonly WATCH_STOP = 103; + public static readonly SUBSCRIBE = 104; + public static readonly UNSUBSCRIBE = 105; + public static readonly REGISTER = 106; + public static readonly CRDT = 107; + public static readonly OPTIONAL_ONE = 108; + public static readonly EXACTLY_ONE = 109; + public static readonly MANY_UNIQUE = 110; + public static readonly MANY = 111; + public static readonly ORDERED = 112; + public static readonly UNIT = 113; + public static readonly WATCH_HANDLE = 114; + public static readonly MESSAGE = 115; + public static readonly ATOM_REF = 116; + public static readonly INTERFACE_REF = 117; + public static readonly OPTIONAL = 118; + public static readonly LIST = 119; + public static readonly RECORD = 120; + public static readonly BOOL = 121; + public static readonly BYTES = 122; + public static readonly DOUBLE = 123; + public static readonly INT32 = 124; + public static readonly INT64 = 125; + public static readonly STRING = 126; + public static readonly UINT32 = 127; + public static readonly UINT64 = 128; + public static readonly TRUE = 129; + public static readonly FALSE = 130; + public static readonly NULL = 131; + public static readonly ARROW = 132; + public static readonly COLON = 133; + public static readonly SEMI = 134; + public static readonly COMMA = 135; + public static readonly DOT = 136; + public static readonly LBRACE = 137; + public static readonly RBRACE = 138; + public static readonly LBRACK = 139; + public static readonly RBRACK = 140; + public static readonly LPAREN = 141; + public static readonly RPAREN = 142; + public static readonly LT = 143; + public static readonly GT = 144; + public static readonly AMP = 145; + public static readonly EQUAL = 146; + public static readonly INTEGER = 147; + public static readonly JSON_NUMBER = 148; + public static readonly IDENTIFIER = 149; + public static readonly STRING_LITERAL = 150; + public static readonly LINE_COMMENT = 151; + public static readonly BLOCK_COMMENT = 152; + public static readonly WS = 153; public static readonly RULE_document = 0; public static readonly RULE_fragmentDecl = 1; public static readonly RULE_sourceImportDecl = 2; @@ -185,59 +190,62 @@ export class QuixosCapabilityParser extends antlr.Parser { public static readonly RULE_targetConstraint = 24; public static readonly RULE_packageResourceDecl = 25; public static readonly RULE_packageExport = 26; - public static readonly RULE_packageQuery = 27; - public static readonly RULE_packageQuerySpecialization = 28; - public static readonly RULE_queryClause = 29; - public static readonly RULE_packageOperationExport = 30; - public static readonly RULE_packageFunctionExport = 31; - public static readonly RULE_acceptanceClause = 32; - public static readonly RULE_executionClause = 33; - public static readonly RULE_selectedOperations = 34; - public static readonly RULE_packageConstructorExport = 35; - public static readonly RULE_eventClause = 36; - public static readonly RULE_operationMode = 37; - public static readonly RULE_receiverRequirement = 38; - public static readonly RULE_identifierList = 39; - public static readonly RULE_dependencyBlock = 40; - public static readonly RULE_dependencyPort = 41; - public static readonly RULE_primitiveList = 42; - public static readonly RULE_primitive = 43; - public static readonly RULE_sharedAttachmentDecl = 44; - public static readonly RULE_attachmentDecl = 45; - public static readonly RULE_stateDecl = 46; - public static readonly RULE_storagePolicy = 47; - public static readonly RULE_edgeDecl = 48; - public static readonly RULE_edgeEndpoint = 49; - public static readonly RULE_conformanceDecl = 50; - public static readonly RULE_conformanceItem = 51; - public static readonly RULE_initializationDecl = 52; - public static readonly RULE_initializationField = 53; - public static readonly RULE_creationOwnerMapping = 54; - public static readonly RULE_stateFieldBindingDecl = 55; - public static readonly RULE_relationshipMaterializationDecl = 56; - public static readonly RULE_operationBindingDecl = 57; - public static readonly RULE_memberOperationRef = 58; - public static readonly RULE_operationName = 59; - public static readonly RULE_operationProvider = 60; - public static readonly RULE_acceptanceBinding = 61; - public static readonly RULE_statePrimitive = 62; - public static readonly RULE_edgePrimitive = 63; - public static readonly RULE_dependencyBindingBlock = 64; - public static readonly RULE_dependencyBinding = 65; - public static readonly RULE_constructorBindingDecl = 66; - public static readonly RULE_valueType = 67; - public static readonly RULE_recordField = 68; - public static readonly RULE_scalarType = 69; - public static readonly RULE_cardinality = 70; - public static readonly RULE_jsonLiteral = 71; - public static readonly RULE_jsonObject = 72; - public static readonly RULE_jsonMember = 73; - public static readonly RULE_jsonArray = 74; - public static readonly RULE_identifier = 75; - public static readonly RULE_stringLiteral = 76; + public static readonly RULE_componentDecl = 27; + public static readonly RULE_presentationDecl = 28; + public static readonly RULE_packageQuery = 29; + public static readonly RULE_packageQuerySpecialization = 30; + public static readonly RULE_queryClause = 31; + public static readonly RULE_packageOperationExport = 32; + public static readonly RULE_packageFunctionExport = 33; + public static readonly RULE_acceptanceClause = 34; + public static readonly RULE_executionClause = 35; + public static readonly RULE_selectedOperations = 36; + public static readonly RULE_packageConstructorExport = 37; + public static readonly RULE_eventClause = 38; + public static readonly RULE_operationMode = 39; + public static readonly RULE_receiverRequirement = 40; + public static readonly RULE_identifierList = 41; + public static readonly RULE_dependencyBlock = 42; + public static readonly RULE_dependencyPort = 43; + public static readonly RULE_primitiveList = 44; + public static readonly RULE_primitive = 45; + public static readonly RULE_sharedAttachmentDecl = 46; + public static readonly RULE_attachmentDecl = 47; + public static readonly RULE_stateDecl = 48; + public static readonly RULE_storagePolicy = 49; + public static readonly RULE_edgeDecl = 50; + public static readonly RULE_edgeEndpoint = 51; + public static readonly RULE_conformanceDecl = 52; + public static readonly RULE_conformanceItem = 53; + public static readonly RULE_initializationDecl = 54; + public static readonly RULE_initializationField = 55; + public static readonly RULE_creationOwnerMapping = 56; + public static readonly RULE_stateFieldBindingDecl = 57; + public static readonly RULE_relationshipMaterializationDecl = 58; + public static readonly RULE_operationBindingDecl = 59; + public static readonly RULE_memberOperationRef = 60; + public static readonly RULE_operationName = 61; + public static readonly RULE_operationProvider = 62; + public static readonly RULE_acceptanceBinding = 63; + public static readonly RULE_statePrimitive = 64; + public static readonly RULE_edgePrimitive = 65; + public static readonly RULE_dependencyBindingBlock = 66; + public static readonly RULE_dependencyBinding = 67; + public static readonly RULE_constructorBindingDecl = 68; + public static readonly RULE_valueType = 69; + public static readonly RULE_recordField = 70; + public static readonly RULE_scalarType = 71; + public static readonly RULE_cardinality = 72; + public static readonly RULE_jsonLiteral = 73; + public static readonly RULE_jsonObject = 74; + public static readonly RULE_jsonMember = 75; + public static readonly RULE_jsonArray = 76; + public static readonly RULE_identifier = 77; + public static readonly RULE_stringLiteral = 78; public static readonly literalNames = [ - null, "'edit'", "'creation'", "'initialize'", "'workspace'", "'execution'", + null, "'edit'", "'component'", "'presentation'", "'subject'", "'runtime'", + "'for'", "'creation'", "'initialize'", "'workspace'", "'execution'", "'snapshot'", "'transaction'", "'remote'", "'targets'", "'portable'", "'replica'", "'local'", "'from'", "'result-bytes'", "'rpc-calls'", "'deadline-ms'", "'query'", "'reflection'", "'specialize'", "'root'", @@ -265,21 +273,21 @@ export class QuixosCapabilityParser extends antlr.Parser { ]; public static readonly symbolicNames = [ - null, "EDIT", "CREATION", "INITIALIZE", "WORKSPACE", "EXECUTION", - "SNAPSHOT", "TRANSACTION", "REMOTE", "TARGETS", "PORTABLE", "REPLICA", - "LOCAL", "FROM", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", - "REFLECTION", "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", - "MAX", "ALLOW", "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", - "OBJECT", "STORABLE", "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", - "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", - "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", - "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", "PRIVATE", "SHARED", - "STATE", "EDGE", "PROJECTION", "WITH", "USING", "ACCEPT", "VIA", - "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", - "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", - "LIFECYCLE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", - "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", - "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", + null, "EDIT", "COMPONENT", "PRESENTATION", "SUBJECT", "RUNTIME", + "FOR", "CREATION", "INITIALIZE", "WORKSPACE", "EXECUTION", "SNAPSHOT", + "TRANSACTION", "REMOTE", "TARGETS", "PORTABLE", "REPLICA", "LOCAL", + "FROM", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", "REFLECTION", + "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", "MAX", "ALLOW", + "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", "OBJECT", "STORABLE", + "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", + "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", + "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", + "TO", "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", + "USING", "ACCEPT", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", + "DEFAULT", "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", + "ON_DELETE", "LIFECYCLE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", + "ID", "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", + "SET", "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", @@ -298,20 +306,20 @@ export class QuixosCapabilityParser extends antlr.Parser { "typeAliasDecl", "interfaceMember", "operationMember", "valueMember", "valueMemberOperation", "relationshipMember", "queryReadContract", "relationshipOperation", "targetConstraint", "packageResourceDecl", - "packageExport", "packageQuery", "packageQuerySpecialization", "queryClause", - "packageOperationExport", "packageFunctionExport", "acceptanceClause", - "executionClause", "selectedOperations", "packageConstructorExport", - "eventClause", "operationMode", "receiverRequirement", "identifierList", - "dependencyBlock", "dependencyPort", "primitiveList", "primitive", - "sharedAttachmentDecl", "attachmentDecl", "stateDecl", "storagePolicy", - "edgeDecl", "edgeEndpoint", "conformanceDecl", "conformanceItem", - "initializationDecl", "initializationField", "creationOwnerMapping", - "stateFieldBindingDecl", "relationshipMaterializationDecl", "operationBindingDecl", - "memberOperationRef", "operationName", "operationProvider", "acceptanceBinding", - "statePrimitive", "edgePrimitive", "dependencyBindingBlock", "dependencyBinding", - "constructorBindingDecl", "valueType", "recordField", "scalarType", - "cardinality", "jsonLiteral", "jsonObject", "jsonMember", "jsonArray", - "identifier", "stringLiteral", + "packageExport", "componentDecl", "presentationDecl", "packageQuery", + "packageQuerySpecialization", "queryClause", "packageOperationExport", + "packageFunctionExport", "acceptanceClause", "executionClause", + "selectedOperations", "packageConstructorExport", "eventClause", + "operationMode", "receiverRequirement", "identifierList", "dependencyBlock", + "dependencyPort", "primitiveList", "primitive", "sharedAttachmentDecl", + "attachmentDecl", "stateDecl", "storagePolicy", "edgeDecl", "edgeEndpoint", + "conformanceDecl", "conformanceItem", "initializationDecl", "initializationField", + "creationOwnerMapping", "stateFieldBindingDecl", "relationshipMaterializationDecl", + "operationBindingDecl", "memberOperationRef", "operationName", "operationProvider", + "acceptanceBinding", "statePrimitive", "edgePrimitive", "dependencyBindingBlock", + "dependencyBinding", "constructorBindingDecl", "valueType", "recordField", + "scalarType", "cardinality", "jsonLiteral", "jsonObject", "jsonMember", + "jsonArray", "identifier", "stringLiteral", ]; public get grammarFileName(): string { return "QuixosCapability.g4"; } @@ -332,42 +340,42 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new DocumentContext(this.context, this.state); this.enterRule(localContext, 0, QuixosCapabilityParser.RULE_document); try { - this.state = 166; + this.state = 170; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 0, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 154; + this.state = 158; this.workspaceDecl(); - this.state = 155; + this.state = 159; this.match(QuixosCapabilityParser.EOF); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 157; + this.state = 161; this.interfaceResourceDecl(); - this.state = 158; + this.state = 162; this.match(QuixosCapabilityParser.EOF); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 160; + this.state = 164; this.packageResourceDecl(); - this.state = 161; + this.state = 165; this.match(QuixosCapabilityParser.EOF); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 163; + this.state = 167; this.fragmentDecl(); - this.state = 164; + this.state = 168; this.match(QuixosCapabilityParser.EOF); } break; @@ -393,25 +401,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 168; + this.state = 172; this.match(QuixosCapabilityParser.FRAGMENT); - this.state = 169; - this.match(QuixosCapabilityParser.LBRACE); this.state = 173; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 177; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 30)) & ~0x1F) === 0 && ((1 << (_la - 30)) & 34144577) !== 0)) { + while (_la === 3 || ((((_la - 35)) & ~0x1F) === 0 && ((1 << (_la - 35)) & 34144577) !== 0)) { { { - this.state = 170; + this.state = 174; this.workspaceItem(); } } - this.state = 175; + this.state = 179; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 176; + this.state = 180; this.match(QuixosCapabilityParser.RBRACE); } } @@ -434,11 +442,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 178; + this.state = 182; this.match(QuixosCapabilityParser.IMPORT); - this.state = 179; + this.state = 183; this.stringLiteral(); - this.state = 180; + this.state = 184; this.match(QuixosCapabilityParser.SEMI); } } @@ -462,39 +470,39 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 182; - this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 183; - this.identifier(); - this.state = 184; - this.match(QuixosCapabilityParser.ID); - this.state = 185; - this.stringLiteral(); this.state = 186; - this.match(QuixosCapabilityParser.REVISION); + this.match(QuixosCapabilityParser.WORKSPACE); this.state = 187; - this.stringLiteral(); + this.identifier(); this.state = 188; - this.match(QuixosCapabilityParser.COMMIT); + this.match(QuixosCapabilityParser.ID); this.state = 189; this.stringLiteral(); this.state = 190; - this.match(QuixosCapabilityParser.LBRACE); + this.match(QuixosCapabilityParser.REVISION); + this.state = 191; + this.stringLiteral(); + this.state = 192; + this.match(QuixosCapabilityParser.COMMIT); + this.state = 193; + this.stringLiteral(); this.state = 194; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 198; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 30)) & ~0x1F) === 0 && ((1 << (_la - 30)) & 34144577) !== 0)) { + while (_la === 3 || ((((_la - 35)) & ~0x1F) === 0 && ((1 << (_la - 35)) & 34144577) !== 0)) { { { - this.state = 191; + this.state = 195; this.workspaceItem(); } } - this.state = 196; + this.state = 200; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 197; + this.state = 201; this.match(QuixosCapabilityParser.RBRACE); } } @@ -515,55 +523,62 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new WorkspaceItemContext(this.context, this.state); this.enterRule(localContext, 8, QuixosCapabilityParser.RULE_workspaceItem); try { - this.state = 206; + this.state = 211; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 3, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 199; + this.state = 203; this.sourceImportDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 200; + this.state = 204; this.atomDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 201; + this.state = 205; this.resourceImportDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 202; + this.state = 206; this.sharedAttachmentDecl(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 203; + this.state = 207; this.conformanceDecl(); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 204; + this.state = 208; this.constructorBindingDecl(); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 205; + this.state = 209; + this.presentationDecl(); + } + break; + case 8: + this.enterOuterAlt(localContext, 8); + { + this.state = 210; this.typeAliasDecl(); } break; @@ -586,32 +601,32 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ResourceImportDeclContext(this.context, this.state); this.enterRule(localContext, 10, QuixosCapabilityParser.RULE_resourceImportDecl); try { - this.state = 218; + this.state = 223; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 4, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 208; + this.state = 213; this.match(QuixosCapabilityParser.IMPORT); - this.state = 209; + this.state = 214; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 210; + this.state = 215; this.identifier(); - this.state = 211; + this.state = 216; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 213; + this.state = 218; this.match(QuixosCapabilityParser.IMPORT); - this.state = 214; + this.state = 219; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 215; + this.state = 220; this.identifier(); - this.state = 216; + this.state = 221; this.match(QuixosCapabilityParser.SEMI); } break; @@ -636,17 +651,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 220; - this.match(QuixosCapabilityParser.EXTERNAL); - this.state = 221; - this.match(QuixosCapabilityParser.ATOM); - this.state = 222; - this.identifier(); - this.state = 223; - this.match(QuixosCapabilityParser.ID); - this.state = 224; - this.stringLiteral(); this.state = 225; + this.match(QuixosCapabilityParser.EXTERNAL); + this.state = 226; + this.match(QuixosCapabilityParser.ATOM); + this.state = 227; + this.identifier(); + this.state = 228; + this.match(QuixosCapabilityParser.ID); + this.state = 229; + this.stringLiteral(); + this.state = 230; this.match(QuixosCapabilityParser.SEMI); } } @@ -669,17 +684,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 227; - this.match(QuixosCapabilityParser.EXTERNAL); - this.state = 228; - this.match(QuixosCapabilityParser.INTERFACE); - this.state = 229; - this.identifier(); - this.state = 230; - this.match(QuixosCapabilityParser.REVISION); - this.state = 231; - this.stringLiteral(); this.state = 232; + this.match(QuixosCapabilityParser.EXTERNAL); + this.state = 233; + this.match(QuixosCapabilityParser.INTERFACE); + this.state = 234; + this.identifier(); + this.state = 235; + this.match(QuixosCapabilityParser.REVISION); + this.state = 236; + this.stringLiteral(); + this.state = 237; this.match(QuixosCapabilityParser.SEMI); } } @@ -700,34 +715,34 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ResourcePreambleContext(this.context, this.state); this.enterRule(localContext, 16, QuixosCapabilityParser.RULE_resourcePreamble); try { - this.state = 238; + this.state = 243; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 5, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 234; + this.state = 239; this.resourceImportDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 235; + this.state = 240; this.externalAtomDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 236; + this.state = 241; this.externalInterfaceDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 237; + this.state = 242; this.typeAliasDecl(); } break; @@ -753,27 +768,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 240; + this.state = 245; this.match(QuixosCapabilityParser.ATOM); - this.state = 241; - this.identifier(); - this.state = 242; - this.match(QuixosCapabilityParser.ID); - this.state = 243; - this.stringLiteral(); this.state = 246; + this.identifier(); + this.state = 247; + this.match(QuixosCapabilityParser.ID); + this.state = 248; + this.stringLiteral(); + this.state = 251; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 80) { + if (_la === 85) { { - this.state = 244; + this.state = 249; this.match(QuixosCapabilityParser.DOC); - this.state = 245; + this.state = 250; this.stringLiteral(); } } - this.state = 248; + this.state = 253; this.match(QuixosCapabilityParser.SEMI); } } @@ -797,87 +812,87 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 253; + this.state = 258; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 30)) & ~0x1F) === 0 && ((1 << (_la - 30)) & 193) !== 0)) { + while (((((_la - 35)) & ~0x1F) === 0 && ((1 << (_la - 35)) & 193) !== 0)) { { { - this.state = 250; + this.state = 255; this.resourcePreamble(); } } - this.state = 255; + this.state = 260; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 256; + this.state = 261; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 257; + this.state = 262; this.identifier(); - this.state = 259; + this.state = 264; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 138) { + if (_la === 143) { { - this.state = 258; + this.state = 263; this.typeParameters(); } } - this.state = 261; + this.state = 266; this.match(QuixosCapabilityParser.ID); - this.state = 262; + this.state = 267; this.stringLiteral(); - this.state = 263; + this.state = 268; this.match(QuixosCapabilityParser.REVISION); - this.state = 264; + this.state = 269; this.stringLiteral(); - this.state = 274; + this.state = 279; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 84) { + if (_la === 89) { { - this.state = 265; + this.state = 270; this.match(QuixosCapabilityParser.REQUIRES); - this.state = 266; - this.interfaceType(); this.state = 271; + this.interfaceType(); + this.state = 276; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 130) { + while (_la === 135) { { { - this.state = 267; + this.state = 272; this.match(QuixosCapabilityParser.COMMA); - this.state = 268; + this.state = 273; this.interfaceType(); } } - this.state = 273; + this.state = 278; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 276; + this.state = 281; this.match(QuixosCapabilityParser.LBRACE); - this.state = 280; + this.state = 285; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 27)) & ~0x1F) === 0 && ((1 << (_la - 27)) & 33783809) !== 0)) { + while (((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33783809) !== 0)) { { { - this.state = 277; + this.state = 282; this.interfaceMember(); } } - this.state = 282; + this.state = 287; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 283; + this.state = 288; this.match(QuixosCapabilityParser.RBRACE); } } @@ -901,27 +916,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 285; + this.state = 290; this.match(QuixosCapabilityParser.LT); - this.state = 286; - this.typeParameter(); this.state = 291; + this.typeParameter(); + this.state = 296; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 130) { + while (_la === 135) { { { - this.state = 287; + this.state = 292; this.match(QuixosCapabilityParser.COMMA); - this.state = 288; + this.state = 293; this.typeParameter(); } } - this.state = 293; + this.state = 298; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 294; + this.state = 299; this.match(QuixosCapabilityParser.GT); } } @@ -943,24 +958,24 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 24, QuixosCapabilityParser.RULE_typeParameter); let _la: number; try { - this.state = 315; + this.state = 320; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.VALUE: this.enterOuterAlt(localContext, 1); { - this.state = 296; + this.state = 301; this.match(QuixosCapabilityParser.VALUE); - this.state = 297; + this.state = 302; this.identifier(); - this.state = 300; + this.state = 305; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 128) { + if (_la === 133) { { - this.state = 298; + this.state = 303; this.match(QuixosCapabilityParser.COLON); - this.state = 299; + this.state = 304; this.match(QuixosCapabilityParser.STORABLE); } } @@ -970,32 +985,32 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 2); { - this.state = 302; + this.state = 307; this.match(QuixosCapabilityParser.OBJECT); - this.state = 303; + this.state = 308; this.identifier(); - this.state = 313; + this.state = 318; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 33) { + if (_la === 38) { { - this.state = 304; + this.state = 309; this.match(QuixosCapabilityParser.IMPLEMENTS); - this.state = 305; - this.interfaceType(); this.state = 310; + this.interfaceType(); + this.state = 315; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 140) { + while (_la === 145) { { { - this.state = 306; + this.state = 311; this.match(QuixosCapabilityParser.AMP); - this.state = 307; + this.state = 312; this.interfaceType(); } } - this.state = 312; + this.state = 317; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } @@ -1028,14 +1043,14 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 317; + this.state = 322; this.identifier(); - this.state = 319; + this.state = 324; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 138) { + if (_la === 143) { { - this.state = 318; + this.state = 323; this.typeArguments(); } } @@ -1062,27 +1077,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 321; + this.state = 326; this.match(QuixosCapabilityParser.LT); - this.state = 322; - this.typeArgument(); this.state = 327; + this.typeArgument(); + this.state = 332; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 130) { + while (_la === 135) { { { - this.state = 323; + this.state = 328; this.match(QuixosCapabilityParser.COMMA); - this.state = 324; + this.state = 329; this.typeArgument(); } } - this.state = 329; + this.state = 334; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 330; + this.state = 335; this.match(QuixosCapabilityParser.GT); } } @@ -1103,37 +1118,42 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new TypeArgumentContext(this.context, this.state); this.enterRule(localContext, 30, QuixosCapabilityParser.RULE_typeArgument); try { - this.state = 339; + this.state = 344; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 1); { - this.state = 332; + this.state = 337; this.match(QuixosCapabilityParser.ATOM); - this.state = 333; + this.state = 338; this.identifier(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 2); { - this.state = 334; + this.state = 339; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 335; + this.state = 340; this.interfaceType(); } break; case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 336; + this.state = 341; this.match(QuixosCapabilityParser.OBJECT); - this.state = 337; + this.state = 342; this.identifier(); } break; case QuixosCapabilityParser.EDIT: + case QuixosCapabilityParser.COMPONENT: + case QuixosCapabilityParser.PRESENTATION: + case QuixosCapabilityParser.SUBJECT: + case QuixosCapabilityParser.RUNTIME: + case QuixosCapabilityParser.FOR: case QuixosCapabilityParser.CREATION: case QuixosCapabilityParser.INITIALIZE: case QuixosCapabilityParser.EXECUTION: @@ -1185,7 +1205,7 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 4); { - this.state = 338; + this.state = 343; this.valueType(); } break; @@ -1213,25 +1233,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 341; + this.state = 346; this.match(QuixosCapabilityParser.TYPE); - this.state = 342; + this.state = 347; this.identifier(); - this.state = 344; + this.state = 349; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 138) { + if (_la === 143) { { - this.state = 343; + this.state = 348; this.typeParameters(); } } - this.state = 346; + this.state = 351; this.match(QuixosCapabilityParser.EQUAL); - this.state = 347; + this.state = 352; this.valueType(); - this.state = 348; + this.state = 353; this.match(QuixosCapabilityParser.SEMI); } } @@ -1252,27 +1272,27 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new InterfaceMemberContext(this.context, this.state); this.enterRule(localContext, 34, QuixosCapabilityParser.RULE_interfaceMember); try { - this.state = 353; + this.state = 358; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 21, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 350; + this.state = 355; this.valueMember(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 351; + this.state = 356; this.relationshipMember(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 352; + this.state = 357; this.operationMember(); } break; @@ -1298,53 +1318,53 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 356; + this.state = 361; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 52) { + if (_la === 57) { { - this.state = 355; + this.state = 360; this.match(QuixosCapabilityParser.STATIC); } } - this.state = 358; - this.match(QuixosCapabilityParser.OPERATION); - this.state = 359; - this.identifier(); - this.state = 360; - this.match(QuixosCapabilityParser.ID); - this.state = 361; - this.stringLiteral(); - this.state = 362; - this.match(QuixosCapabilityParser.COLON); this.state = 363; - this.valueType(); + this.match(QuixosCapabilityParser.OPERATION); this.state = 364; - this.match(QuixosCapabilityParser.ARROW); + this.identifier(); this.state = 365; - this.valueType(); - this.state = 366; - this.match(QuixosCapabilityParser.LBRACE); - this.state = 367; - this.match(QuixosCapabilityParser.CALL); - this.state = 368; this.match(QuixosCapabilityParser.ID); - this.state = 369; + this.state = 366; this.stringLiteral(); + this.state = 367; + this.match(QuixosCapabilityParser.COLON); + this.state = 368; + this.valueType(); + this.state = 369; + this.match(QuixosCapabilityParser.ARROW); + this.state = 370; + this.valueType(); this.state = 371; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 372; + this.match(QuixosCapabilityParser.CALL); + this.state = 373; + this.match(QuixosCapabilityParser.ID); + this.state = 374; + this.stringLiteral(); + this.state = 376; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 5) { + if (_la === 10) { { - this.state = 370; + this.state = 375; this.executionClause(); } } - this.state = 373; + this.state = 378; this.match(QuixosCapabilityParser.SEMI); - this.state = 374; + this.state = 379; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1368,45 +1388,45 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 377; + this.state = 382; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 27) { + if (_la === 32) { { - this.state = 376; + this.state = 381; this.queryReadContract(); } } - this.state = 379; - this.match(QuixosCapabilityParser.VALUE); - this.state = 380; - this.identifier(); - this.state = 381; - this.match(QuixosCapabilityParser.ID); - this.state = 382; - this.stringLiteral(); - this.state = 383; - this.match(QuixosCapabilityParser.COLON); this.state = 384; - this.valueType(); + this.match(QuixosCapabilityParser.VALUE); this.state = 385; - this.match(QuixosCapabilityParser.LBRACE); + this.identifier(); + this.state = 386; + this.match(QuixosCapabilityParser.ID); + this.state = 387; + this.stringLiteral(); + this.state = 388; + this.match(QuixosCapabilityParser.COLON); this.state = 389; + this.valueType(); + this.state = 390; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 394; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 1 || ((((_la - 86)) & ~0x1F) === 0 && ((1 << (_la - 86)) & 7) !== 0)) { + while (_la === 1 || ((((_la - 91)) & ~0x1F) === 0 && ((1 << (_la - 91)) & 7) !== 0)) { { { - this.state = 386; + this.state = 391; this.valueMemberOperation(); } } - this.state = 391; + this.state = 396; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 392; + this.state = 397; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1428,96 +1448,96 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 40, QuixosCapabilityParser.RULE_valueMemberOperation); let _la: number; try { - this.state = 427; + this.state = 432; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.GET: this.enterOuterAlt(localContext, 1); { - this.state = 394; + this.state = 399; this.match(QuixosCapabilityParser.GET); - this.state = 395; + this.state = 400; this.match(QuixosCapabilityParser.ID); - this.state = 396; + this.state = 401; this.stringLiteral(); - this.state = 398; + this.state = 403; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 5) { + if (_la === 10) { { - this.state = 397; + this.state = 402; this.executionClause(); } } - this.state = 400; + this.state = 405; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.SET: this.enterOuterAlt(localContext, 2); { - this.state = 402; + this.state = 407; this.match(QuixosCapabilityParser.SET); - this.state = 403; + this.state = 408; this.match(QuixosCapabilityParser.ID); - this.state = 404; + this.state = 409; this.stringLiteral(); - this.state = 406; + this.state = 411; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 5) { + if (_la === 10) { { - this.state = 405; + this.state = 410; this.executionClause(); } } - this.state = 408; + this.state = 413; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.EDIT: this.enterOuterAlt(localContext, 3); { - this.state = 410; + this.state = 415; this.match(QuixosCapabilityParser.EDIT); - this.state = 411; + this.state = 416; this.match(QuixosCapabilityParser.ID); - this.state = 412; + this.state = 417; this.stringLiteral(); - this.state = 414; + this.state = 419; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 5) { + if (_la === 10) { { - this.state = 413; + this.state = 418; this.executionClause(); } } - this.state = 416; + this.state = 421; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 4); { - this.state = 418; - this.match(QuixosCapabilityParser.WATCH); - this.state = 419; - this.match(QuixosCapabilityParser.START); - this.state = 420; - this.match(QuixosCapabilityParser.ID); - this.state = 421; - this.stringLiteral(); - this.state = 422; - this.match(QuixosCapabilityParser.STOP); this.state = 423; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.WATCH); this.state = 424; - this.stringLiteral(); + this.match(QuixosCapabilityParser.START); this.state = 425; + this.match(QuixosCapabilityParser.ID); + this.state = 426; + this.stringLiteral(); + this.state = 427; + this.match(QuixosCapabilityParser.STOP); + this.state = 428; + this.match(QuixosCapabilityParser.ID); + this.state = 429; + this.stringLiteral(); + this.state = 430; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1545,69 +1565,69 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 430; + this.state = 435; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 27) { + if (_la === 32) { { - this.state = 429; + this.state = 434; this.queryReadContract(); } } - this.state = 432; - this.match(QuixosCapabilityParser.RELATION); - this.state = 433; - this.identifier(); - this.state = 434; - this.match(QuixosCapabilityParser.ID); - this.state = 435; - this.stringLiteral(); - this.state = 436; - this.match(QuixosCapabilityParser.COLON); this.state = 437; - this.cardinality(); + this.match(QuixosCapabilityParser.RELATION); this.state = 438; - this.targetConstraint(); + this.identifier(); + this.state = 439; + this.match(QuixosCapabilityParser.ID); this.state = 440; + this.stringLiteral(); + this.state = 441; + this.match(QuixosCapabilityParser.COLON); + this.state = 442; + this.cardinality(); + this.state = 443; + this.targetConstraint(); + this.state = 445; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 107) { + if (_la === 112) { { - this.state = 439; + this.state = 444; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 444; + this.state = 449; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 77) { + if (_la === 82) { { - this.state = 442; + this.state = 447; this.match(QuixosCapabilityParser.KEYED); - this.state = 443; + this.state = 448; this.stringLiteral(); } } - this.state = 446; + this.state = 451; this.match(QuixosCapabilityParser.LBRACE); - this.state = 450; + this.state = 455; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 88)) & ~0x1F) === 0 && ((1 << (_la - 88)) & 225) !== 0)) { + while (((((_la - 93)) & ~0x1F) === 0 && ((1 << (_la - 93)) & 225) !== 0)) { { { - this.state = 447; + this.state = 452; this.relationshipOperation(); } } - this.state = 452; + this.state = 457; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 453; + this.state = 458; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1631,16 +1651,16 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 455; + this.state = 460; this.match(QuixosCapabilityParser.QUERYABLE); - this.state = 457; + this.state = 462; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 10 || _la === 28) { + if (_la === 15 || _la === 33) { { - this.state = 456; + this.state = 461; _la = this.tokenStream.LA(1); - if(!(_la === 10 || _la === 28)) { + if(!(_la === 15 || _la === 33)) { this.errorHandler.recoverInline(this); } else { @@ -1670,96 +1690,96 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 46, QuixosCapabilityParser.RULE_relationshipOperation); let _la: number; try { - this.state = 492; + this.state = 497; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.RESOLVE: this.enterOuterAlt(localContext, 1); { - this.state = 459; + this.state = 464; this.match(QuixosCapabilityParser.RESOLVE); - this.state = 460; + this.state = 465; this.match(QuixosCapabilityParser.ID); - this.state = 461; + this.state = 466; this.stringLiteral(); - this.state = 463; + this.state = 468; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 5) { + if (_la === 10) { { - this.state = 462; + this.state = 467; this.executionClause(); } } - this.state = 465; + this.state = 470; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONNECT: this.enterOuterAlt(localContext, 2); { - this.state = 467; + this.state = 472; this.match(QuixosCapabilityParser.CONNECT); - this.state = 468; + this.state = 473; this.match(QuixosCapabilityParser.ID); - this.state = 469; + this.state = 474; this.stringLiteral(); - this.state = 471; + this.state = 476; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 5) { + if (_la === 10) { { - this.state = 470; + this.state = 475; this.executionClause(); } } - this.state = 473; + this.state = 478; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.DISCONNECT: this.enterOuterAlt(localContext, 3); { - this.state = 475; + this.state = 480; this.match(QuixosCapabilityParser.DISCONNECT); - this.state = 476; + this.state = 481; this.match(QuixosCapabilityParser.ID); - this.state = 477; + this.state = 482; this.stringLiteral(); - this.state = 479; + this.state = 484; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 5) { + if (_la === 10) { { - this.state = 478; + this.state = 483; this.executionClause(); } } - this.state = 481; + this.state = 486; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 4); { - this.state = 483; - this.match(QuixosCapabilityParser.WATCH); - this.state = 484; - this.match(QuixosCapabilityParser.START); - this.state = 485; - this.match(QuixosCapabilityParser.ID); - this.state = 486; - this.stringLiteral(); - this.state = 487; - this.match(QuixosCapabilityParser.STOP); this.state = 488; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.WATCH); this.state = 489; - this.stringLiteral(); + this.match(QuixosCapabilityParser.START); this.state = 490; + this.match(QuixosCapabilityParser.ID); + this.state = 491; + this.stringLiteral(); + this.state = 492; + this.match(QuixosCapabilityParser.STOP); + this.state = 493; + this.match(QuixosCapabilityParser.ID); + this.state = 494; + this.stringLiteral(); + this.state = 495; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1785,31 +1805,31 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 48, QuixosCapabilityParser.RULE_targetConstraint); let _la: number; try { - this.state = 503; + this.state = 508; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 1); { - this.state = 494; + this.state = 499; this.match(QuixosCapabilityParser.ATOM); - this.state = 495; + this.state = 500; this.identifier(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 2); { - this.state = 496; + this.state = 501; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 497; + this.state = 502; this.identifier(); - this.state = 499; + this.state = 504; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 138) { + if (_la === 143) { { - this.state = 498; + this.state = 503; this.typeArguments(); } } @@ -1819,9 +1839,9 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 501; + this.state = 506; this.match(QuixosCapabilityParser.OBJECT); - this.state = 502; + this.state = 507; this.identifier(); } break; @@ -1849,61 +1869,61 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 508; + this.state = 513; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 30)) & ~0x1F) === 0 && ((1 << (_la - 30)) & 193) !== 0)) { + while (((((_la - 35)) & ~0x1F) === 0 && ((1 << (_la - 35)) & 193) !== 0)) { { { - this.state = 505; + this.state = 510; this.resourcePreamble(); } } - this.state = 510; + this.state = 515; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 511; - this.match(QuixosCapabilityParser.PACKAGE); - this.state = 512; - this.identifier(); - this.state = 513; - this.match(QuixosCapabilityParser.ID); - this.state = 514; - this.stringLiteral(); - this.state = 515; - this.match(QuixosCapabilityParser.REVISION); this.state = 516; - this.stringLiteral(); + this.match(QuixosCapabilityParser.PACKAGE); + this.state = 517; + this.identifier(); + this.state = 518; + this.match(QuixosCapabilityParser.ID); this.state = 519; + this.stringLiteral(); + this.state = 520; + this.match(QuixosCapabilityParser.REVISION); + this.state = 521; + this.stringLiteral(); + this.state = 524; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 73) { + if (_la === 78) { { - this.state = 517; + this.state = 522; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); - this.state = 518; + this.state = 523; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 521; + this.state = 526; this.match(QuixosCapabilityParser.LBRACE); - this.state = 525; + this.state = 530; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 17)) & ~0x1F) === 0 && ((1 << (_la - 17)) & 939524097) !== 0)) { + while (_la === 2 || _la === 22 || ((((_la - 49)) & ~0x1F) === 0 && ((1 << (_la - 49)) & 7) !== 0)) { { { - this.state = 522; + this.state = 527; this.packageExport(); } } - this.state = 527; + this.state = 532; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 528; + this.state = 533; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1924,44 +1944,133 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new PackageExportContext(this.context, this.state); this.enterRule(localContext, 52, QuixosCapabilityParser.RULE_packageExport); try { - this.state = 535; + this.state = 541; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 44, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 530; + this.state = 535; this.packageOperationExport(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 531; + this.state = 536; this.packageFunctionExport(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 532; + this.state = 537; this.packageConstructorExport(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 533; + this.state = 538; this.packageQuery(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 534; + this.state = 539; this.packageQuerySpecialization(); } break; + case 6: + this.enterOuterAlt(localContext, 6); + { + this.state = 540; + this.componentDecl(); + } + break; + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public componentDecl(): ComponentDeclContext { + let localContext = new ComponentDeclContext(this.context, this.state); + this.enterRule(localContext, 54, QuixosCapabilityParser.RULE_componentDecl); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 543; + this.match(QuixosCapabilityParser.COMPONENT); + this.state = 544; + this.identifier(); + this.state = 545; + this.match(QuixosCapabilityParser.ID); + this.state = 546; + this.stringLiteral(); + this.state = 547; + this.match(QuixosCapabilityParser.SUBJECT); + this.state = 548; + this.interfaceType(); + this.state = 549; + this.match(QuixosCapabilityParser.RUNTIME); + this.state = 550; + this.identifier(); + this.state = 551; + this.match(QuixosCapabilityParser.SEMI); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public presentationDecl(): PresentationDeclContext { + let localContext = new PresentationDeclContext(this.context, this.state); + this.enterRule(localContext, 56, QuixosCapabilityParser.RULE_presentationDecl); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 553; + this.match(QuixosCapabilityParser.PRESENTATION); + this.state = 554; + this.identifier(); + this.state = 555; + this.match(QuixosCapabilityParser.ID); + this.state = 556; + this.stringLiteral(); + this.state = 557; + this.match(QuixosCapabilityParser.FOR); + this.state = 558; + this.interfaceType(); + this.state = 559; + this.match(QuixosCapabilityParser.USING); + this.state = 560; + this.identifier(); + this.state = 561; + this.match(QuixosCapabilityParser.DOT); + this.state = 562; + this.identifier(); + this.state = 563; + this.match(QuixosCapabilityParser.SEMI); } } catch (re) { @@ -1979,68 +2088,68 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageQuery(): PackageQueryContext { let localContext = new PackageQueryContext(this.context, this.state); - this.enterRule(localContext, 54, QuixosCapabilityParser.RULE_packageQuery); + this.enterRule(localContext, 58, QuixosCapabilityParser.RULE_packageQuery); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 537; + this.state = 565; this.match(QuixosCapabilityParser.QUERY); - this.state = 538; + this.state = 566; this.identifier(); - this.state = 540; + this.state = 568; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 138) { + if (_la === 143) { { - this.state = 539; + this.state = 567; this.typeParameters(); } } - this.state = 542; + this.state = 570; this.match(QuixosCapabilityParser.ID); - this.state = 543; + this.state = 571; this.stringLiteral(); - this.state = 544; + this.state = 572; this.match(QuixosCapabilityParser.ROOT); - this.state = 546; + this.state = 574; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 4) { + if (_la === 9) { { - this.state = 545; + this.state = 573; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 548; + this.state = 576; this.interfaceType(); - this.state = 549; + this.state = 577; this.match(QuixosCapabilityParser.DOCUMENT); - this.state = 550; + this.state = 578; this.stringLiteral(); - this.state = 551; + this.state = 579; this.match(QuixosCapabilityParser.OPERATION); - this.state = 552; + this.state = 580; this.stringLiteral(); - this.state = 553; + this.state = 581; this.match(QuixosCapabilityParser.LBRACE); - this.state = 557; + this.state = 585; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 130029568) !== 0) || _la === 88) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4160946176) !== 0) || _la === 93) { { { - this.state = 554; + this.state = 582; this.queryClause(); } } - this.state = 559; + this.state = 587; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 560; + this.state = 588; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2059,25 +2168,25 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageQuerySpecialization(): PackageQuerySpecializationContext { let localContext = new PackageQuerySpecializationContext(this.context, this.state); - this.enterRule(localContext, 56, QuixosCapabilityParser.RULE_packageQuerySpecialization); + this.enterRule(localContext, 60, QuixosCapabilityParser.RULE_packageQuerySpecialization); try { this.enterOuterAlt(localContext, 1); { - this.state = 562; + this.state = 590; this.match(QuixosCapabilityParser.QUERY); - this.state = 563; + this.state = 591; this.identifier(); - this.state = 564; + this.state = 592; this.match(QuixosCapabilityParser.ID); - this.state = 565; + this.state = 593; this.stringLiteral(); - this.state = 566; + this.state = 594; this.match(QuixosCapabilityParser.SPECIALIZE); - this.state = 567; + this.state = 595; this.identifier(); - this.state = 568; + this.state = 596; this.typeArguments(); - this.state = 569; + this.state = 597; this.match(QuixosCapabilityParser.SEMI); } } @@ -2096,121 +2205,121 @@ export class QuixosCapabilityParser extends antlr.Parser { } public queryClause(): QueryClauseContext { let localContext = new QueryClauseContext(this.context, this.state); - this.enterRule(localContext, 58, QuixosCapabilityParser.RULE_queryClause); + this.enterRule(localContext, 62, QuixosCapabilityParser.RULE_queryClause); let _la: number; try { - this.state = 611; + this.state = 639; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REPLICA: this.enterOuterAlt(localContext, 1); { - this.state = 571; + this.state = 599; this.match(QuixosCapabilityParser.REPLICA); - this.state = 572; + this.state = 600; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.LOCAL: this.enterOuterAlt(localContext, 2); { - this.state = 573; + this.state = 601; this.match(QuixosCapabilityParser.LOCAL); - this.state = 574; + this.state = 602; this.match(QuixosCapabilityParser.FROM); - this.state = 575; + this.state = 603; this.identifier(); - this.state = 576; + this.state = 604; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.FRAGMENTS: this.enterOuterAlt(localContext, 3); { - this.state = 578; + this.state = 606; this.match(QuixosCapabilityParser.FRAGMENTS); - this.state = 579; + this.state = 607; this.stringLiteral(); - this.state = 580; + this.state = 608; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.VIEW: this.enterOuterAlt(localContext, 4); { - this.state = 582; + this.state = 610; this.match(QuixosCapabilityParser.VIEW); - this.state = 584; + this.state = 612; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 31) { + if (_la === 36) { { - this.state = 583; + this.state = 611; this.match(QuixosCapabilityParser.OBJECT); } } - this.state = 586; + this.state = 614; this.identifier(); - this.state = 587; + this.state = 615; this.match(QuixosCapabilityParser.AS); - this.state = 588; + this.state = 616; this.interfaceType(); - this.state = 589; + this.state = 617; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.MAX: this.enterOuterAlt(localContext, 5); { - this.state = 591; + this.state = 619; this.match(QuixosCapabilityParser.MAX); - this.state = 592; + this.state = 620; this.identifier(); - this.state = 593; + this.state = 621; this.match(QuixosCapabilityParser.INTEGER); - this.state = 594; + this.state = 622; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.ALLOW: this.enterOuterAlt(localContext, 6); { - this.state = 596; + this.state = 624; this.match(QuixosCapabilityParser.ALLOW); - this.state = 597; + this.state = 625; this.interfaceType(); - this.state = 598; + this.state = 626; this.match(QuixosCapabilityParser.DOT); - this.state = 599; + this.state = 627; this.identifier(); - this.state = 600; + this.state = 628; this.identifier(); - this.state = 601; + this.state = 629; this.stringLiteral(); - this.state = 602; + this.state = 630; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 7); { - this.state = 604; + this.state = 632; this.match(QuixosCapabilityParser.WATCH); - this.state = 605; + this.state = 633; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.POLL: this.enterOuterAlt(localContext, 8); { - this.state = 606; + this.state = 634; this.match(QuixosCapabilityParser.POLL); - this.state = 607; + this.state = 635; this.match(QuixosCapabilityParser.INTEGER); - this.state = 608; + this.state = 636; this.stringLiteral(); - this.state = 609; + this.state = 637; this.match(QuixosCapabilityParser.SEMI); } break; @@ -2233,86 +2342,86 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageOperationExport(): PackageOperationExportContext { let localContext = new PackageOperationExportContext(this.context, this.state); - this.enterRule(localContext, 60, QuixosCapabilityParser.RULE_packageOperationExport); + this.enterRule(localContext, 64, QuixosCapabilityParser.RULE_packageOperationExport); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 613; + this.state = 641; this.match(QuixosCapabilityParser.OPERATION); - this.state = 614; + this.state = 642; this.identifier(); - this.state = 616; + this.state = 644; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 138) { + if (_la === 143) { { - this.state = 615; + this.state = 643; this.typeParameters(); } } - this.state = 618; + this.state = 646; this.match(QuixosCapabilityParser.ID); - this.state = 619; + this.state = 647; this.stringLiteral(); - this.state = 620; + this.state = 648; this.match(QuixosCapabilityParser.COLON); - this.state = 621; + this.state = 649; this.valueType(); - this.state = 622; + this.state = 650; this.match(QuixosCapabilityParser.ARROW); - this.state = 623; + this.state = 651; this.valueType(); - this.state = 624; + this.state = 652; this.match(QuixosCapabilityParser.MODE); - this.state = 625; + this.state = 653; this.operationMode(); - this.state = 627; + this.state = 655; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 5) { + if (_la === 10) { { - this.state = 626; + this.state = 654; this.executionClause(); } } - this.state = 630; + this.state = 658; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 82) { + if (_la === 87) { { - this.state = 629; + this.state = 657; this.eventClause(); } } - this.state = 632; + this.state = 660; this.match(QuixosCapabilityParser.RECEIVER); - this.state = 633; + this.state = 661; this.receiverRequirement(); - this.state = 635; + this.state = 663; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 84) { + if (_la === 89) { { - this.state = 634; + this.state = 662; this.dependencyBlock(); } } - this.state = 638; + this.state = 666; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 61) { + if (_la === 66) { { - this.state = 637; + this.state = 665; this.acceptanceClause(); } } - this.state = 640; + this.state = 668; this.match(QuixosCapabilityParser.SEMI); } } @@ -2331,68 +2440,68 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageFunctionExport(): PackageFunctionExportContext { let localContext = new PackageFunctionExportContext(this.context, this.state); - this.enterRule(localContext, 62, QuixosCapabilityParser.RULE_packageFunctionExport); + this.enterRule(localContext, 66, QuixosCapabilityParser.RULE_packageFunctionExport); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 642; + this.state = 670; this.match(QuixosCapabilityParser.FUNCTION); - this.state = 643; + this.state = 671; this.identifier(); - this.state = 645; + this.state = 673; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 138) { + if (_la === 143) { { - this.state = 644; + this.state = 672; this.typeParameters(); } } - this.state = 647; + this.state = 675; this.match(QuixosCapabilityParser.ID); - this.state = 648; + this.state = 676; this.stringLiteral(); - this.state = 649; + this.state = 677; this.match(QuixosCapabilityParser.COLON); - this.state = 650; + this.state = 678; this.valueType(); - this.state = 651; + this.state = 679; this.match(QuixosCapabilityParser.ARROW); - this.state = 652; + this.state = 680; this.valueType(); - this.state = 654; + this.state = 682; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 5) { + if (_la === 10) { { - this.state = 653; + this.state = 681; this.executionClause(); } } - this.state = 657; + this.state = 685; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 84) { + if (_la === 89) { { - this.state = 656; + this.state = 684; this.dependencyBlock(); } } - this.state = 660; + this.state = 688; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 61) { + if (_la === 66) { { - this.state = 659; + this.state = 687; this.acceptanceClause(); } } - this.state = 662; + this.state = 690; this.match(QuixosCapabilityParser.SEMI); } } @@ -2411,15 +2520,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public acceptanceClause(): AcceptanceClauseContext { let localContext = new AcceptanceClauseContext(this.context, this.state); - this.enterRule(localContext, 64, QuixosCapabilityParser.RULE_acceptanceClause); + this.enterRule(localContext, 68, QuixosCapabilityParser.RULE_acceptanceClause); try { this.enterOuterAlt(localContext, 1); { - this.state = 664; + this.state = 692; this.match(QuixosCapabilityParser.ACCEPT); - this.state = 665; + this.state = 693; this.match(QuixosCapabilityParser.USING); - this.state = 666; + this.state = 694; this.identifier(); } } @@ -2438,42 +2547,42 @@ export class QuixosCapabilityParser extends antlr.Parser { } public executionClause(): ExecutionClauseContext { let localContext = new ExecutionClauseContext(this.context, this.state); - this.enterRule(localContext, 66, QuixosCapabilityParser.RULE_executionClause); + this.enterRule(localContext, 70, QuixosCapabilityParser.RULE_executionClause); let _la: number; try { - this.state = 677; + this.state = 705; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 59, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 668; + this.state = 696; this.match(QuixosCapabilityParser.EXECUTION); - this.state = 669; + this.state = 697; this.match(QuixosCapabilityParser.REMOTE); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 670; + this.state = 698; this.match(QuixosCapabilityParser.EXECUTION); - this.state = 671; + this.state = 699; _la = this.tokenStream.LA(1); - if(!(_la === 6 || _la === 7)) { + if(!(_la === 11 || _la === 12)) { this.errorHandler.recoverInline(this); } else { this.errorHandler.reportMatch(this); this.consume(); } - this.state = 672; + this.state = 700; this.match(QuixosCapabilityParser.TARGETS); - this.state = 673; + this.state = 701; this.match(QuixosCapabilityParser.LBRACK); - this.state = 674; + this.state = 702; this.identifierList(); - this.state = 675; + this.state = 703; this.match(QuixosCapabilityParser.RBRACK); } break; @@ -2494,34 +2603,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public selectedOperations(): SelectedOperationsContext { let localContext = new SelectedOperationsContext(this.context, this.state); - this.enterRule(localContext, 68, QuixosCapabilityParser.RULE_selectedOperations); + this.enterRule(localContext, 72, QuixosCapabilityParser.RULE_selectedOperations); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 679; + this.state = 707; this.match(QuixosCapabilityParser.USING); - this.state = 680; + this.state = 708; this.match(QuixosCapabilityParser.LBRACK); - this.state = 681; + this.state = 709; this.memberOperationRef(); - this.state = 686; + this.state = 714; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 130) { + while (_la === 135) { { { - this.state = 682; + this.state = 710; this.match(QuixosCapabilityParser.COMMA); - this.state = 683; + this.state = 711; this.memberOperationRef(); } } - this.state = 688; + this.state = 716; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 689; + this.state = 717; this.match(QuixosCapabilityParser.RBRACK); } } @@ -2540,38 +2649,38 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageConstructorExport(): PackageConstructorExportContext { let localContext = new PackageConstructorExportContext(this.context, this.state); - this.enterRule(localContext, 70, QuixosCapabilityParser.RULE_packageConstructorExport); + this.enterRule(localContext, 74, QuixosCapabilityParser.RULE_packageConstructorExport); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 691; + this.state = 719; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 692; + this.state = 720; this.identifier(); - this.state = 693; + this.state = 721; this.match(QuixosCapabilityParser.ID); - this.state = 694; + this.state = 722; this.stringLiteral(); - this.state = 695; + this.state = 723; this.match(QuixosCapabilityParser.CONSTRUCTS); - this.state = 696; + this.state = 724; this.identifier(); - this.state = 697; + this.state = 725; this.match(QuixosCapabilityParser.COLON); - this.state = 698; + this.state = 726; this.valueType(); - this.state = 700; + this.state = 728; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 84) { + if (_la === 89) { { - this.state = 699; + this.state = 727; this.dependencyBlock(); } } - this.state = 702; + this.state = 730; this.match(QuixosCapabilityParser.SEMI); } } @@ -2590,13 +2699,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public eventClause(): EventClauseContext { let localContext = new EventClauseContext(this.context, this.state); - this.enterRule(localContext, 72, QuixosCapabilityParser.RULE_eventClause); + this.enterRule(localContext, 76, QuixosCapabilityParser.RULE_eventClause); try { this.enterOuterAlt(localContext, 1); { - this.state = 704; + this.state = 732; this.match(QuixosCapabilityParser.EMITS); - this.state = 705; + this.state = 733; this.valueType(); } } @@ -2615,14 +2724,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationMode(): OperationModeContext { let localContext = new OperationModeContext(this.context, this.state); - this.enterRule(localContext, 74, QuixosCapabilityParser.RULE_operationMode); + this.enterRule(localContext, 78, QuixosCapabilityParser.RULE_operationMode); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 707; + this.state = 735; _la = this.tokenStream.LA(1); - if(!(((((_la - 96)) & ~0x1F) === 0 && ((1 << (_la - 96)) & 31) !== 0))) { + if(!(((((_la - 101)) & ~0x1F) === 0 && ((1 << (_la - 101)) & 31) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2646,71 +2755,71 @@ export class QuixosCapabilityParser extends antlr.Parser { } public receiverRequirement(): ReceiverRequirementContext { let localContext = new ReceiverRequirementContext(this.context, this.state); - this.enterRule(localContext, 76, QuixosCapabilityParser.RULE_receiverRequirement); + this.enterRule(localContext, 80, QuixosCapabilityParser.RULE_receiverRequirement); let _la: number; try { - this.state = 727; + this.state = 755; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ANY: this.enterOuterAlt(localContext, 1); { - this.state = 709; + this.state = 737; this.match(QuixosCapabilityParser.ANY); } break; case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 2); { - this.state = 710; + this.state = 738; this.match(QuixosCapabilityParser.ATOM); - this.state = 711; + this.state = 739; this.identifier(); } break; case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 712; + this.state = 740; this.match(QuixosCapabilityParser.OBJECT); - this.state = 713; + this.state = 741; this.identifier(); } break; case QuixosCapabilityParser.INTERFACES: this.enterOuterAlt(localContext, 4); { - this.state = 714; + this.state = 742; this.match(QuixosCapabilityParser.INTERFACES); - this.state = 715; + this.state = 743; this.match(QuixosCapabilityParser.LBRACK); - this.state = 724; + this.state = 752; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 89)) & ~0x1F) === 0 && ((1 << (_la - 89)) & 4099) !== 0) || _la === 144) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966782) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8195) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { { - this.state = 716; + this.state = 744; this.interfaceType(); - this.state = 721; + this.state = 749; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 130) { + while (_la === 135) { { { - this.state = 717; + this.state = 745; this.match(QuixosCapabilityParser.COMMA); - this.state = 718; + this.state = 746; this.interfaceType(); } } - this.state = 723; + this.state = 751; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 726; + this.state = 754; this.match(QuixosCapabilityParser.RBRACK); } break; @@ -2733,26 +2842,26 @@ export class QuixosCapabilityParser extends antlr.Parser { } public identifierList(): IdentifierListContext { let localContext = new IdentifierListContext(this.context, this.state); - this.enterRule(localContext, 78, QuixosCapabilityParser.RULE_identifierList); + this.enterRule(localContext, 82, QuixosCapabilityParser.RULE_identifierList); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 729; + this.state = 757; this.identifier(); - this.state = 734; + this.state = 762; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 130) { + while (_la === 135) { { { - this.state = 730; + this.state = 758; this.match(QuixosCapabilityParser.COMMA); - this.state = 731; + this.state = 759; this.identifier(); } } - this.state = 736; + this.state = 764; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } @@ -2773,30 +2882,30 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBlock(): DependencyBlockContext { let localContext = new DependencyBlockContext(this.context, this.state); - this.enterRule(localContext, 80, QuixosCapabilityParser.RULE_dependencyBlock); + this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_dependencyBlock); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 737; + this.state = 765; this.match(QuixosCapabilityParser.REQUIRES); - this.state = 738; + this.state = 766; this.match(QuixosCapabilityParser.LBRACE); - this.state = 742; + this.state = 770; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 393220) !== 0) || ((((_la - 39)) & ~0x1F) === 0 && ((1 << (_la - 39)) & 393345) !== 0)) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 12583040) !== 0) || ((((_la - 44)) & ~0x1F) === 0 && ((1 << (_la - 44)) & 393345) !== 0)) { { { - this.state = 739; + this.state = 767; this.dependencyPort(); } } - this.state = 744; + this.state = 772; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 745; + this.state = 773; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2815,82 +2924,17 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyPort(): DependencyPortContext { let localContext = new DependencyPortContext(this.context, this.state); - this.enterRule(localContext, 82, QuixosCapabilityParser.RULE_dependencyPort); + this.enterRule(localContext, 86, QuixosCapabilityParser.RULE_dependencyPort); let _la: number; try { - this.state = 825; + this.state = 853; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REFLECTION: this.enterOuterAlt(localContext, 1); { - this.state = 747; - this.match(QuixosCapabilityParser.REFLECTION); - this.state = 748; - this.identifier(); - this.state = 749; - this.match(QuixosCapabilityParser.ID); - this.state = 750; - this.stringLiteral(); - this.state = 751; - this.match(QuixosCapabilityParser.LBRACK); - this.state = 752; - this.identifierList(); - this.state = 753; - this.match(QuixosCapabilityParser.RBRACK); - this.state = 754; - this.match(QuixosCapabilityParser.SEMI); - } - break; - case QuixosCapabilityParser.STATE: - this.enterOuterAlt(localContext, 2); - { - this.state = 756; - this.match(QuixosCapabilityParser.STATE); - this.state = 757; - this.identifier(); - this.state = 758; - this.match(QuixosCapabilityParser.ID); - this.state = 759; - this.stringLiteral(); - this.state = 760; - this.match(QuixosCapabilityParser.COLON); - this.state = 761; - this.valueType(); - this.state = 762; - this.primitiveList(); - this.state = 763; - this.match(QuixosCapabilityParser.SEMI); - } - break; - case QuixosCapabilityParser.EDGE: - this.enterOuterAlt(localContext, 3); - { - this.state = 765; - this.match(QuixosCapabilityParser.EDGE); - this.state = 766; - this.identifier(); - this.state = 767; - this.match(QuixosCapabilityParser.ID); - this.state = 768; - this.stringLiteral(); - this.state = 769; - this.match(QuixosCapabilityParser.COLON); - this.state = 770; - this.cardinality(); - this.state = 771; - this.targetConstraint(); - this.state = 772; - this.primitiveList(); - this.state = 773; - this.match(QuixosCapabilityParser.SEMI); - } - break; - case QuixosCapabilityParser.INTERFACE: - this.enterOuterAlt(localContext, 4); - { this.state = 775; - this.match(QuixosCapabilityParser.INTERFACE); + this.match(QuixosCapabilityParser.REFLECTION); this.state = 776; this.identifier(); this.state = 777; @@ -2898,50 +2942,41 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 778; this.stringLiteral(); this.state = 779; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.LBRACK); this.state = 780; - this.identifier(); + this.identifierList(); + this.state = 781; + this.match(QuixosCapabilityParser.RBRACK); this.state = 782; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 138) { - { - this.state = 781; - this.typeArguments(); - } + this.match(QuixosCapabilityParser.SEMI); } - + break; + case QuixosCapabilityParser.STATE: + this.enterOuterAlt(localContext, 2); + { + this.state = 784; + this.match(QuixosCapabilityParser.STATE); this.state = 785; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 60) { - { - this.state = 784; - this.selectedOperations(); - } - } - + this.identifier(); + this.state = 786; + this.match(QuixosCapabilityParser.ID); + this.state = 787; + this.stringLiteral(); + this.state = 788; + this.match(QuixosCapabilityParser.COLON); this.state = 789; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 13) { - { - this.state = 787; - this.match(QuixosCapabilityParser.FROM); - this.state = 788; - this.match(QuixosCapabilityParser.INPUT); - } - } - + this.valueType(); + this.state = 790; + this.primitiveList(); this.state = 791; this.match(QuixosCapabilityParser.SEMI); } break; - case QuixosCapabilityParser.CREATION: - this.enterOuterAlt(localContext, 5); + case QuixosCapabilityParser.EDGE: + this.enterOuterAlt(localContext, 3); { this.state = 793; - this.match(QuixosCapabilityParser.CREATION); + this.match(QuixosCapabilityParser.EDGE); this.state = 794; this.identifier(); this.state = 795; @@ -2951,20 +2986,20 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 797; this.match(QuixosCapabilityParser.COLON); this.state = 798; - this.identifier(); + this.cardinality(); this.state = 799; - this.match(QuixosCapabilityParser.INPUT); + this.targetConstraint(); this.state = 800; - this.valueType(); + this.primitiveList(); this.state = 801; this.match(QuixosCapabilityParser.SEMI); } break; - case QuixosCapabilityParser.CONSTRUCTOR: - this.enterOuterAlt(localContext, 6); + case QuixosCapabilityParser.INTERFACE: + this.enterOuterAlt(localContext, 4); { this.state = 803; - this.match(QuixosCapabilityParser.CONSTRUCTOR); + this.match(QuixosCapabilityParser.INTERFACE); this.state = 804; this.identifier(); this.state = 805; @@ -2975,42 +3010,116 @@ export class QuixosCapabilityParser extends antlr.Parser { this.match(QuixosCapabilityParser.COLON); this.state = 808; this.identifier(); - this.state = 811; + this.state = 810; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 48) { + if (_la === 143) { { this.state = 809; - this.match(QuixosCapabilityParser.INPUT); - this.state = 810; - this.valueType(); + this.typeArguments(); } } this.state = 813; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 65) { + { + this.state = 812; + this.selectedOperations(); + } + } + + this.state = 817; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 18) { + { + this.state = 815; + this.match(QuixosCapabilityParser.FROM); + this.state = 816; + this.match(QuixosCapabilityParser.INPUT); + } + } + + this.state = 819; + this.match(QuixosCapabilityParser.SEMI); + } + break; + case QuixosCapabilityParser.CREATION: + this.enterOuterAlt(localContext, 5); + { + this.state = 821; + this.match(QuixosCapabilityParser.CREATION); + this.state = 822; + this.identifier(); + this.state = 823; + this.match(QuixosCapabilityParser.ID); + this.state = 824; + this.stringLiteral(); + this.state = 825; + this.match(QuixosCapabilityParser.COLON); + this.state = 826; + this.identifier(); + this.state = 827; + this.match(QuixosCapabilityParser.INPUT); + this.state = 828; + this.valueType(); + this.state = 829; + this.match(QuixosCapabilityParser.SEMI); + } + break; + case QuixosCapabilityParser.CONSTRUCTOR: + this.enterOuterAlt(localContext, 6); + { + this.state = 831; + this.match(QuixosCapabilityParser.CONSTRUCTOR); + this.state = 832; + this.identifier(); + this.state = 833; + this.match(QuixosCapabilityParser.ID); + this.state = 834; + this.stringLiteral(); + this.state = 835; + this.match(QuixosCapabilityParser.COLON); + this.state = 836; + this.identifier(); + this.state = 839; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 53) { + { + this.state = 837; + this.match(QuixosCapabilityParser.INPUT); + this.state = 838; + this.valueType(); + } + } + + this.state = 841; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.QUERY: this.enterOuterAlt(localContext, 7); { - this.state = 815; + this.state = 843; this.match(QuixosCapabilityParser.QUERY); - this.state = 816; + this.state = 844; this.identifier(); - this.state = 817; + this.state = 845; this.match(QuixosCapabilityParser.ID); - this.state = 818; + this.state = 846; this.stringLiteral(); - this.state = 819; + this.state = 847; this.match(QuixosCapabilityParser.COLON); - this.state = 820; + this.state = 848; this.identifier(); - this.state = 821; + this.state = 849; this.match(QuixosCapabilityParser.DOT); - this.state = 822; + this.state = 850; this.identifier(); - this.state = 823; + this.state = 851; this.match(QuixosCapabilityParser.SEMI); } break; @@ -3033,32 +3142,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public primitiveList(): PrimitiveListContext { let localContext = new PrimitiveListContext(this.context, this.state); - this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_primitiveList); + this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_primitiveList); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 827; + this.state = 855; this.match(QuixosCapabilityParser.LBRACK); - this.state = 828; + this.state = 856; this.primitive(); - this.state = 833; + this.state = 861; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 130) { + while (_la === 135) { { { - this.state = 829; + this.state = 857; this.match(QuixosCapabilityParser.COMMA); - this.state = 830; + this.state = 858; this.primitive(); } } - this.state = 835; + this.state = 863; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 836; + this.state = 864; this.match(QuixosCapabilityParser.RBRACK); } } @@ -3077,14 +3186,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public primitive(): PrimitiveContext { let localContext = new PrimitiveContext(this.context, this.state); - this.enterRule(localContext, 86, QuixosCapabilityParser.RULE_primitive); + this.enterRule(localContext, 90, QuixosCapabilityParser.RULE_primitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 838; + this.state = 866; _la = this.tokenStream.LA(1); - if(!(_la === 1 || ((((_la - 91)) & ~0x1F) === 0 && ((1 << (_la - 91)) & 223) !== 0))) { + if(!(_la === 1 || ((((_la - 96)) & ~0x1F) === 0 && ((1 << (_la - 96)) & 223) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -3108,13 +3217,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public sharedAttachmentDecl(): SharedAttachmentDeclContext { let localContext = new SharedAttachmentDeclContext(this.context, this.state); - this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_sharedAttachmentDecl); + this.enterRule(localContext, 92, QuixosCapabilityParser.RULE_sharedAttachmentDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 840; + this.state = 868; this.match(QuixosCapabilityParser.SHARED); - this.state = 841; + this.state = 869; this.attachmentDecl(); } } @@ -3133,22 +3242,22 @@ export class QuixosCapabilityParser extends antlr.Parser { } public attachmentDecl(): AttachmentDeclContext { let localContext = new AttachmentDeclContext(this.context, this.state); - this.enterRule(localContext, 90, QuixosCapabilityParser.RULE_attachmentDecl); + this.enterRule(localContext, 94, QuixosCapabilityParser.RULE_attachmentDecl); try { - this.state = 845; + this.state = 873; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 843; + this.state = 871; this.stateDecl(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 844; + this.state = 872; this.edgeDecl(); } break; @@ -3171,44 +3280,44 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stateDecl(): StateDeclContext { let localContext = new StateDeclContext(this.context, this.state); - this.enterRule(localContext, 92, QuixosCapabilityParser.RULE_stateDecl); + this.enterRule(localContext, 96, QuixosCapabilityParser.RULE_stateDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 847; + this.state = 875; this.match(QuixosCapabilityParser.STATE); - this.state = 848; + this.state = 876; this.identifier(); - this.state = 849; + this.state = 877; this.match(QuixosCapabilityParser.ID); - this.state = 850; + this.state = 878; this.stringLiteral(); - this.state = 851; + this.state = 879; this.match(QuixosCapabilityParser.ON); - this.state = 852; + this.state = 880; this.identifier(); - this.state = 853; + this.state = 881; this.match(QuixosCapabilityParser.COLON); - this.state = 854; + this.state = 882; this.valueType(); - this.state = 855; + this.state = 883; this.match(QuixosCapabilityParser.POLICY); - this.state = 856; + this.state = 884; this.storagePolicy(); - this.state = 859; + this.state = 887; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 68) { + if (_la === 73) { { - this.state = 857; + this.state = 885; this.match(QuixosCapabilityParser.DEFAULT); - this.state = 858; + this.state = 886; this.jsonLiteral(); } } - this.state = 861; + this.state = 889; this.match(QuixosCapabilityParser.SEMI); } } @@ -3227,28 +3336,28 @@ export class QuixosCapabilityParser extends antlr.Parser { } public storagePolicy(): StoragePolicyContext { let localContext = new StoragePolicyContext(this.context, this.state); - this.enterRule(localContext, 94, QuixosCapabilityParser.RULE_storagePolicy); + this.enterRule(localContext, 98, QuixosCapabilityParser.RULE_storagePolicy); try { - this.state = 869; + this.state = 897; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REGISTER: this.enterOuterAlt(localContext, 1); { - this.state = 863; + this.state = 891; this.match(QuixosCapabilityParser.REGISTER); } break; case QuixosCapabilityParser.CRDT: this.enterOuterAlt(localContext, 2); { - this.state = 864; + this.state = 892; this.match(QuixosCapabilityParser.CRDT); - this.state = 865; + this.state = 893; this.match(QuixosCapabilityParser.LPAREN); - this.state = 866; + this.state = 894; this.valueType(); - this.state = 867; + this.state = 895; this.match(QuixosCapabilityParser.RPAREN); } break; @@ -3271,25 +3380,25 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgeDecl(): EdgeDeclContext { let localContext = new EdgeDeclContext(this.context, this.state); - this.enterRule(localContext, 96, QuixosCapabilityParser.RULE_edgeDecl); + this.enterRule(localContext, 100, QuixosCapabilityParser.RULE_edgeDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 871; + this.state = 899; this.match(QuixosCapabilityParser.EDGE); - this.state = 872; + this.state = 900; this.identifier(); - this.state = 873; + this.state = 901; this.match(QuixosCapabilityParser.ID); - this.state = 874; + this.state = 902; this.stringLiteral(); - this.state = 875; + this.state = 903; this.match(QuixosCapabilityParser.LBRACE); - this.state = 876; + this.state = 904; this.edgeEndpoint(); - this.state = 877; + this.state = 905; this.edgeEndpoint(); - this.state = 878; + this.state = 906; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3308,78 +3417,78 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgeEndpoint(): EdgeEndpointContext { let localContext = new EdgeEndpointContext(this.context, this.state); - this.enterRule(localContext, 98, QuixosCapabilityParser.RULE_edgeEndpoint); + this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_edgeEndpoint); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 880; + this.state = 908; this.targetConstraint(); - this.state = 881; + this.state = 909; this.match(QuixosCapabilityParser.PROJECTION); - this.state = 882; + this.state = 910; this.identifier(); - this.state = 883; + this.state = 911; this.match(QuixosCapabilityParser.ID); - this.state = 884; + this.state = 912; this.stringLiteral(); - this.state = 885; + this.state = 913; this.cardinality(); - this.state = 887; + this.state = 915; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 107) { + if (_la === 112) { { - this.state = 886; + this.state = 914; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 891; + this.state = 919; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 74) { + if (_la === 79) { { - this.state = 889; + this.state = 917; this.match(QuixosCapabilityParser.ON_DELETE); - this.state = 890; + this.state = 918; this.stringLiteral(); } } - this.state = 894; + this.state = 922; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 76) { + if (_la === 81) { { - this.state = 893; + this.state = 921; this.match(QuixosCapabilityParser.RETAIN_OTHER); } } - this.state = 898; + this.state = 926; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 77) { + if (_la === 82) { { - this.state = 896; + this.state = 924; this.match(QuixosCapabilityParser.KEYED); - this.state = 897; + this.state = 925; this.stringLiteral(); } } - this.state = 901; + this.state = 929; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 78) { + if (_la === 83) { { - this.state = 900; + this.state = 928; this.match(QuixosCapabilityParser.PUBLIC_TRAVERSAL); } } - this.state = 903; + this.state = 931; this.match(QuixosCapabilityParser.SEMI); } } @@ -3398,70 +3507,70 @@ export class QuixosCapabilityParser extends antlr.Parser { } public conformanceDecl(): ConformanceDeclContext { let localContext = new ConformanceDeclContext(this.context, this.state); - this.enterRule(localContext, 100, QuixosCapabilityParser.RULE_conformanceDecl); + this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_conformanceDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 905; + this.state = 933; this.match(QuixosCapabilityParser.CONFORM); - this.state = 906; + this.state = 934; this.identifier(); - this.state = 907; + this.state = 935; this.match(QuixosCapabilityParser.AS); - this.state = 908; + this.state = 936; this.identifier(); - this.state = 910; + this.state = 938; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 138) { + if (_la === 143) { { - this.state = 909; + this.state = 937; this.typeArguments(); } } - this.state = 914; + this.state = 942; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 79) { + if (_la === 84) { { - this.state = 912; + this.state = 940; this.match(QuixosCapabilityParser.ID); - this.state = 913; + this.state = 941; this.stringLiteral(); } } - this.state = 918; + this.state = 946; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 73) { + if (_la === 78) { { - this.state = 916; + this.state = 944; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); - this.state = 917; + this.state = 945; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 920; + this.state = 948; this.match(QuixosCapabilityParser.LBRACE); - this.state = 924; + this.state = 952; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 3 || ((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & 4105) !== 0)) { + while (_la === 8 || ((((_la - 56)) & ~0x1F) === 0 && ((1 << (_la - 56)) & 4105) !== 0)) { { { - this.state = 921; + this.state = 949; this.conformanceItem(); } } - this.state = 926; + this.state = 954; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 927; + this.state = 955; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3480,45 +3589,45 @@ export class QuixosCapabilityParser extends antlr.Parser { } public conformanceItem(): ConformanceItemContext { let localContext = new ConformanceItemContext(this.context, this.state); - this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_conformanceItem); + this.enterRule(localContext, 106, QuixosCapabilityParser.RULE_conformanceItem); try { - this.state = 935; + this.state = 963; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 85, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 929; + this.state = 957; this.match(QuixosCapabilityParser.PRIVATE); - this.state = 930; + this.state = 958; this.attachmentDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 931; + this.state = 959; this.operationBindingDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 932; + this.state = 960; this.stateFieldBindingDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 933; + this.state = 961; this.initializationDecl(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 934; + this.state = 962; this.relationshipMaterializationDecl(); } break; @@ -3539,32 +3648,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public initializationDecl(): InitializationDeclContext { let localContext = new InitializationDeclContext(this.context, this.state); - this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_initializationDecl); + this.enterRule(localContext, 108, QuixosCapabilityParser.RULE_initializationDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 937; + this.state = 965; this.match(QuixosCapabilityParser.INITIALIZE); - this.state = 938; + this.state = 966; this.match(QuixosCapabilityParser.LBRACE); - this.state = 942; + this.state = 970; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 89)) & ~0x1F) === 0 && ((1 << (_la - 89)) & 4099) !== 0) || _la === 144) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966782) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8195) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { { { - this.state = 939; + this.state = 967; this.initializationField(); } } - this.state = 944; + this.state = 972; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 945; + this.state = 973; this.match(QuixosCapabilityParser.RBRACE); - this.state = 946; + this.state = 974; this.match(QuixosCapabilityParser.SEMI); } } @@ -3583,42 +3692,42 @@ export class QuixosCapabilityParser extends antlr.Parser { } public initializationField(): InitializationFieldContext { let localContext = new InitializationFieldContext(this.context, this.state); - this.enterRule(localContext, 106, QuixosCapabilityParser.RULE_initializationField); + this.enterRule(localContext, 110, QuixosCapabilityParser.RULE_initializationField); try { - this.state = 962; + this.state = 990; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 87, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 948; + this.state = 976; this.identifier(); - this.state = 949; + this.state = 977; this.match(QuixosCapabilityParser.TO); - this.state = 950; + this.state = 978; this.match(QuixosCapabilityParser.STATE); - this.state = 951; + this.state = 979; this.identifier(); - this.state = 952; + this.state = 980; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 954; + this.state = 982; this.identifier(); - this.state = 955; + this.state = 983; this.match(QuixosCapabilityParser.TO); - this.state = 956; + this.state = 984; this.match(QuixosCapabilityParser.EDGE); - this.state = 957; + this.state = 985; this.identifier(); - this.state = 958; + this.state = 986; this.match(QuixosCapabilityParser.DOT); - this.state = 959; + this.state = 987; this.identifier(); - this.state = 960; + this.state = 988; this.match(QuixosCapabilityParser.SEMI); } break; @@ -3639,34 +3748,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public creationOwnerMapping(): CreationOwnerMappingContext { let localContext = new CreationOwnerMappingContext(this.context, this.state); - this.enterRule(localContext, 108, QuixosCapabilityParser.RULE_creationOwnerMapping); + this.enterRule(localContext, 112, QuixosCapabilityParser.RULE_creationOwnerMapping); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 964; + this.state = 992; this.interfaceType(); - this.state = 965; + this.state = 993; this.match(QuixosCapabilityParser.FROM); - this.state = 966; + this.state = 994; this.match(QuixosCapabilityParser.INPUT); - this.state = 971; + this.state = 999; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 131) { + while (_la === 136) { { { - this.state = 967; + this.state = 995; this.match(QuixosCapabilityParser.DOT); - this.state = 968; + this.state = 996; this.identifier(); } } - this.state = 973; + this.state = 1001; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 974; + this.state = 1002; this.match(QuixosCapabilityParser.SEMI); } } @@ -3685,21 +3794,21 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stateFieldBindingDecl(): StateFieldBindingDeclContext { let localContext = new StateFieldBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 110, QuixosCapabilityParser.RULE_stateFieldBindingDecl); + this.enterRule(localContext, 114, QuixosCapabilityParser.RULE_stateFieldBindingDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 976; + this.state = 1004; this.match(QuixosCapabilityParser.BIND); - this.state = 977; + this.state = 1005; this.identifier(); - this.state = 978; + this.state = 1006; this.match(QuixosCapabilityParser.TO); - this.state = 979; + this.state = 1007; this.match(QuixosCapabilityParser.STATE); - this.state = 980; + this.state = 1008; this.identifier(); - this.state = 981; + this.state = 1009; this.match(QuixosCapabilityParser.SEMI); } } @@ -3718,35 +3827,35 @@ export class QuixosCapabilityParser extends antlr.Parser { } public relationshipMaterializationDecl(): RelationshipMaterializationDeclContext { let localContext = new RelationshipMaterializationDeclContext(this.context, this.state); - this.enterRule(localContext, 112, QuixosCapabilityParser.RULE_relationshipMaterializationDecl); + this.enterRule(localContext, 116, QuixosCapabilityParser.RULE_relationshipMaterializationDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 983; + this.state = 1011; this.match(QuixosCapabilityParser.MATERIALIZE); - this.state = 984; + this.state = 1012; this.identifier(); - this.state = 985; + this.state = 1013; this.match(QuixosCapabilityParser.IF); - this.state = 986; + this.state = 1014; this.match(QuixosCapabilityParser.ABSENT); - this.state = 987; + this.state = 1015; this.match(QuixosCapabilityParser.USING); - this.state = 988; + this.state = 1016; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 989; + this.state = 1017; this.identifier(); - this.state = 990; + this.state = 1018; this.match(QuixosCapabilityParser.VIA); - this.state = 991; + this.state = 1019; this.match(QuixosCapabilityParser.EDGE); - this.state = 992; + this.state = 1020; this.identifier(); - this.state = 993; + this.state = 1021; this.match(QuixosCapabilityParser.DOT); - this.state = 994; + this.state = 1022; this.identifier(); - this.state = 995; + this.state = 1023; this.match(QuixosCapabilityParser.SEMI); } } @@ -3765,32 +3874,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationBindingDecl(): OperationBindingDeclContext { let localContext = new OperationBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 114, QuixosCapabilityParser.RULE_operationBindingDecl); + this.enterRule(localContext, 118, QuixosCapabilityParser.RULE_operationBindingDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 997; + this.state = 1025; this.match(QuixosCapabilityParser.BIND); - this.state = 998; + this.state = 1026; this.memberOperationRef(); - this.state = 999; + this.state = 1027; this.match(QuixosCapabilityParser.TO); - this.state = 1000; + this.state = 1028; this.operationProvider(); - this.state = 1003; + this.state = 1031; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 29) { + if (_la === 34) { { - this.state = 1001; + this.state = 1029; this.match(QuixosCapabilityParser.QUERY_REASON); - this.state = 1002; + this.state = 1030; this.stringLiteral(); } } - this.state = 1005; + this.state = 1033; this.match(QuixosCapabilityParser.SEMI); } } @@ -3809,15 +3918,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public memberOperationRef(): MemberOperationRefContext { let localContext = new MemberOperationRefContext(this.context, this.state); - this.enterRule(localContext, 116, QuixosCapabilityParser.RULE_memberOperationRef); + this.enterRule(localContext, 120, QuixosCapabilityParser.RULE_memberOperationRef); try { this.enterOuterAlt(localContext, 1); { - this.state = 1007; + this.state = 1035; this.identifier(); - this.state = 1008; + this.state = 1036; this.match(QuixosCapabilityParser.DOT); - this.state = 1009; + this.state = 1037; this.operationName(); } } @@ -3836,92 +3945,92 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationName(): OperationNameContext { let localContext = new OperationNameContext(this.context, this.state); - this.enterRule(localContext, 118, QuixosCapabilityParser.RULE_operationName); + this.enterRule(localContext, 122, QuixosCapabilityParser.RULE_operationName); try { - this.state = 1023; + this.state = 1051; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 90, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1011; + this.state = 1039; this.identifier(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1012; + this.state = 1040; this.match(QuixosCapabilityParser.CALL); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1013; + this.state = 1041; this.match(QuixosCapabilityParser.GET); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1014; + this.state = 1042; this.match(QuixosCapabilityParser.SET); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1015; + this.state = 1043; this.match(QuixosCapabilityParser.EDIT); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1016; + this.state = 1044; this.match(QuixosCapabilityParser.RESOLVE); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 1017; + this.state = 1045; this.match(QuixosCapabilityParser.CONNECT); } break; case 8: this.enterOuterAlt(localContext, 8); { - this.state = 1018; + this.state = 1046; this.match(QuixosCapabilityParser.DISCONNECT); } break; case 9: this.enterOuterAlt(localContext, 9); { - this.state = 1019; + this.state = 1047; this.match(QuixosCapabilityParser.WATCH_START); } break; case 10: this.enterOuterAlt(localContext, 10); { - this.state = 1020; + this.state = 1048; this.match(QuixosCapabilityParser.WATCH_STOP); } break; case 11: this.enterOuterAlt(localContext, 11); { - this.state = 1021; + this.state = 1049; this.match(QuixosCapabilityParser.SUBSCRIBE); } break; case 12: this.enterOuterAlt(localContext, 12); { - this.state = 1022; + this.state = 1050; this.match(QuixosCapabilityParser.UNSUBSCRIBE); } break; @@ -3942,113 +4051,113 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationProvider(): OperationProviderContext { let localContext = new OperationProviderContext(this.context, this.state); - this.enterRule(localContext, 120, QuixosCapabilityParser.RULE_operationProvider); + this.enterRule(localContext, 124, QuixosCapabilityParser.RULE_operationProvider); let _la: number; try { - this.state = 1061; + this.state = 1089; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.LIFECYCLE: this.enterOuterAlt(localContext, 1); { - this.state = 1025; + this.state = 1053; this.match(QuixosCapabilityParser.LIFECYCLE); - this.state = 1026; + this.state = 1054; this.match(QuixosCapabilityParser.DOT); - this.state = 1027; + this.state = 1055; this.identifier(); } break; case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 2); { - this.state = 1028; + this.state = 1056; this.match(QuixosCapabilityParser.STATE); - this.state = 1029; + this.state = 1057; this.identifier(); - this.state = 1030; + this.state = 1058; this.match(QuixosCapabilityParser.DOT); - this.state = 1031; + this.state = 1059; this.statePrimitive(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 3); { - this.state = 1033; + this.state = 1061; this.match(QuixosCapabilityParser.EDGE); - this.state = 1034; + this.state = 1062; this.identifier(); - this.state = 1035; + this.state = 1063; this.match(QuixosCapabilityParser.DOT); - this.state = 1036; + this.state = 1064; this.identifier(); - this.state = 1037; + this.state = 1065; this.match(QuixosCapabilityParser.DOT); - this.state = 1038; + this.state = 1066; this.edgePrimitive(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 4); { - this.state = 1040; + this.state = 1068; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 1041; + this.state = 1069; this.identifier(); - this.state = 1043; + this.state = 1071; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 138) { + if (_la === 143) { { - this.state = 1042; + this.state = 1070; this.typeArguments(); } } - this.state = 1045; + this.state = 1073; this.match(QuixosCapabilityParser.DOT); - this.state = 1046; + this.state = 1074; this.memberOperationRef(); } break; case QuixosCapabilityParser.PACKAGE: this.enterOuterAlt(localContext, 5); { - this.state = 1048; + this.state = 1076; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 1049; + this.state = 1077; this.identifier(); - this.state = 1050; + this.state = 1078; this.match(QuixosCapabilityParser.DOT); - this.state = 1051; + this.state = 1079; this.identifier(); - this.state = 1053; + this.state = 1081; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 138) { + if (_la === 143) { { - this.state = 1052; + this.state = 1080; this.typeArguments(); } } - this.state = 1056; + this.state = 1084; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 59) { + if (_la === 64) { { - this.state = 1055; + this.state = 1083; this.dependencyBindingBlock(); } } - this.state = 1059; + this.state = 1087; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 61) { + if (_la === 66) { { - this.state = 1058; + this.state = 1086; this.acceptanceBinding(); } } @@ -4074,13 +4183,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public acceptanceBinding(): AcceptanceBindingContext { let localContext = new AcceptanceBindingContext(this.context, this.state); - this.enterRule(localContext, 122, QuixosCapabilityParser.RULE_acceptanceBinding); + this.enterRule(localContext, 126, QuixosCapabilityParser.RULE_acceptanceBinding); try { this.enterOuterAlt(localContext, 1); { - this.state = 1063; + this.state = 1091; this.match(QuixosCapabilityParser.ACCEPT); - this.state = 1064; + this.state = 1092; this.dependencyBindingBlock(); } } @@ -4099,14 +4208,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public statePrimitive(): StatePrimitiveContext { let localContext = new StatePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 124, QuixosCapabilityParser.RULE_statePrimitive); + this.enterRule(localContext, 128, QuixosCapabilityParser.RULE_statePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1066; + this.state = 1094; _la = this.tokenStream.LA(1); - if(!(_la === 1 || ((((_la - 91)) & ~0x1F) === 0 && ((1 << (_la - 91)) & 195) !== 0))) { + if(!(_la === 1 || ((((_la - 96)) & ~0x1F) === 0 && ((1 << (_la - 96)) & 195) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4130,14 +4239,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgePrimitive(): EdgePrimitiveContext { let localContext = new EdgePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 126, QuixosCapabilityParser.RULE_edgePrimitive); + this.enterRule(localContext, 130, QuixosCapabilityParser.RULE_edgePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1068; + this.state = 1096; _la = this.tokenStream.LA(1); - if(!(((((_la - 93)) & ~0x1F) === 0 && ((1 << (_la - 93)) & 55) !== 0))) { + if(!(((((_la - 98)) & ~0x1F) === 0 && ((1 << (_la - 98)) & 55) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4161,30 +4270,30 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBindingBlock(): DependencyBindingBlockContext { let localContext = new DependencyBindingBlockContext(this.context, this.state); - this.enterRule(localContext, 128, QuixosCapabilityParser.RULE_dependencyBindingBlock); + this.enterRule(localContext, 132, QuixosCapabilityParser.RULE_dependencyBindingBlock); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1070; + this.state = 1098; this.match(QuixosCapabilityParser.WITH); - this.state = 1071; + this.state = 1099; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1075; + this.state = 1103; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 89)) & ~0x1F) === 0 && ((1 << (_la - 89)) & 4099) !== 0) || _la === 144) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966782) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8195) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { { { - this.state = 1072; + this.state = 1100; this.dependencyBinding(); } } - this.state = 1077; + this.state = 1105; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1078; + this.state = 1106; this.match(QuixosCapabilityParser.RBRACE); } } @@ -4203,139 +4312,139 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBinding(): DependencyBindingContext { let localContext = new DependencyBindingContext(this.context, this.state); - this.enterRule(localContext, 130, QuixosCapabilityParser.RULE_dependencyBinding); + this.enterRule(localContext, 134, QuixosCapabilityParser.RULE_dependencyBinding); let _la: number; try { - this.state = 1178; + this.state = 1206; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 104, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1080; + this.state = 1108; this.identifier(); - this.state = 1081; + this.state = 1109; this.match(QuixosCapabilityParser.TO); - this.state = 1082; + this.state = 1110; this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 1083; + this.state = 1111; this.match(QuixosCapabilityParser.REFLECTION); - this.state = 1084; + this.state = 1112; this.match(QuixosCapabilityParser.LBRACK); - this.state = 1085; + this.state = 1113; this.identifierList(); - this.state = 1086; + this.state = 1114; this.match(QuixosCapabilityParser.RBRACK); - this.state = 1087; + this.state = 1115; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1089; + this.state = 1117; this.identifier(); - this.state = 1090; + this.state = 1118; this.match(QuixosCapabilityParser.TO); - this.state = 1091; + this.state = 1119; this.match(QuixosCapabilityParser.STATE); - this.state = 1092; + this.state = 1120; this.identifier(); - this.state = 1099; + this.state = 1127; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 62) { + if (_la === 67) { { - this.state = 1093; + this.state = 1121; this.match(QuixosCapabilityParser.VIA); - this.state = 1094; + this.state = 1122; this.match(QuixosCapabilityParser.EDGE); - this.state = 1095; + this.state = 1123; this.identifier(); - this.state = 1096; + this.state = 1124; this.match(QuixosCapabilityParser.DOT); - this.state = 1097; + this.state = 1125; this.identifier(); } } - this.state = 1101; + this.state = 1129; this.match(QuixosCapabilityParser.SEMI); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1103; + this.state = 1131; this.identifier(); - this.state = 1104; + this.state = 1132; this.match(QuixosCapabilityParser.TO); - this.state = 1105; + this.state = 1133; this.match(QuixosCapabilityParser.EDGE); - this.state = 1106; + this.state = 1134; this.identifier(); - this.state = 1107; + this.state = 1135; this.match(QuixosCapabilityParser.DOT); - this.state = 1108; + this.state = 1136; this.identifier(); - this.state = 1115; + this.state = 1143; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 62) { + if (_la === 67) { { - this.state = 1109; + this.state = 1137; this.match(QuixosCapabilityParser.VIA); - this.state = 1110; + this.state = 1138; this.match(QuixosCapabilityParser.EDGE); - this.state = 1111; + this.state = 1139; this.identifier(); - this.state = 1112; + this.state = 1140; this.match(QuixosCapabilityParser.DOT); - this.state = 1113; + this.state = 1141; this.identifier(); } } - this.state = 1117; + this.state = 1145; this.match(QuixosCapabilityParser.SEMI); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1119; + this.state = 1147; this.identifier(); - this.state = 1120; + this.state = 1148; this.match(QuixosCapabilityParser.TO); - this.state = 1121; + this.state = 1149; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 1122; + this.state = 1150; this.identifier(); - this.state = 1124; + this.state = 1152; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 138) { + if (_la === 143) { { - this.state = 1123; + this.state = 1151; this.typeArguments(); } } - this.state = 1134; + this.state = 1162; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.VIA: { { - this.state = 1126; + this.state = 1154; this.match(QuixosCapabilityParser.VIA); - this.state = 1127; + this.state = 1155; this.match(QuixosCapabilityParser.EDGE); - this.state = 1128; + this.state = 1156; this.identifier(); - this.state = 1129; + this.state = 1157; this.match(QuixosCapabilityParser.DOT); - this.state = 1130; + this.state = 1158; this.identifier(); } } @@ -4343,9 +4452,9 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.FROM: { { - this.state = 1132; + this.state = 1160; this.match(QuixosCapabilityParser.FROM); - this.state = 1133; + this.state = 1161; this.match(QuixosCapabilityParser.INPUT); } } @@ -4355,104 +4464,104 @@ export class QuixosCapabilityParser extends antlr.Parser { default: break; } - this.state = 1136; + this.state = 1164; this.match(QuixosCapabilityParser.SEMI); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1138; + this.state = 1166; this.identifier(); - this.state = 1139; + this.state = 1167; this.match(QuixosCapabilityParser.TO); - this.state = 1140; + this.state = 1168; this.match(QuixosCapabilityParser.CREATION); - this.state = 1141; + this.state = 1169; this.identifier(); - this.state = 1142; + this.state = 1170; this.match(QuixosCapabilityParser.WITH); - this.state = 1143; + this.state = 1171; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1147; + this.state = 1175; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 89)) & ~0x1F) === 0 && ((1 << (_la - 89)) & 4099) !== 0) || _la === 144) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966782) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8195) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { { { - this.state = 1144; + this.state = 1172; this.creationOwnerMapping(); } } - this.state = 1149; + this.state = 1177; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1150; + this.state = 1178; this.match(QuixosCapabilityParser.RBRACE); - this.state = 1151; + this.state = 1179; this.match(QuixosCapabilityParser.SEMI); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1153; + this.state = 1181; this.identifier(); - this.state = 1154; + this.state = 1182; this.match(QuixosCapabilityParser.TO); - this.state = 1155; + this.state = 1183; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1156; + this.state = 1184; this.identifier(); - this.state = 1157; + this.state = 1185; this.match(QuixosCapabilityParser.SEMI); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 1159; + this.state = 1187; this.identifier(); - this.state = 1160; + this.state = 1188; this.match(QuixosCapabilityParser.TO); - this.state = 1162; + this.state = 1190; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 4) { + if (_la === 9) { { - this.state = 1161; + this.state = 1189; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 1164; + this.state = 1192; this.match(QuixosCapabilityParser.QUERY); - this.state = 1165; + this.state = 1193; this.identifier(); - this.state = 1166; + this.state = 1194; this.match(QuixosCapabilityParser.DOT); - this.state = 1167; + this.state = 1195; this.identifier(); - this.state = 1174; + this.state = 1202; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 62) { + if (_la === 67) { { - this.state = 1168; + this.state = 1196; this.match(QuixosCapabilityParser.VIA); - this.state = 1169; + this.state = 1197; this.match(QuixosCapabilityParser.EDGE); - this.state = 1170; + this.state = 1198; this.identifier(); - this.state = 1171; + this.state = 1199; this.match(QuixosCapabilityParser.DOT); - this.state = 1172; + this.state = 1200; this.identifier(); } } - this.state = 1176; + this.state = 1204; this.match(QuixosCapabilityParser.SEMI); } break; @@ -4473,34 +4582,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public constructorBindingDecl(): ConstructorBindingDeclContext { let localContext = new ConstructorBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 132, QuixosCapabilityParser.RULE_constructorBindingDecl); + this.enterRule(localContext, 136, QuixosCapabilityParser.RULE_constructorBindingDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1180; + this.state = 1208; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1181; + this.state = 1209; this.identifier(); - this.state = 1182; + this.state = 1210; this.match(QuixosCapabilityParser.TO); - this.state = 1183; + this.state = 1211; this.identifier(); - this.state = 1184; + this.state = 1212; this.match(QuixosCapabilityParser.DOT); - this.state = 1185; + this.state = 1213; this.identifier(); - this.state = 1187; + this.state = 1215; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 59) { + if (_la === 64) { { - this.state = 1186; + this.state = 1214; this.dependencyBindingBlock(); } } - this.state = 1189; + this.state = 1217; this.match(QuixosCapabilityParser.SEMI); } } @@ -4519,10 +4628,10 @@ export class QuixosCapabilityParser extends antlr.Parser { } public valueType(): ValueTypeContext { let localContext = new ValueTypeContext(this.context, this.state); - this.enterRule(localContext, 134, QuixosCapabilityParser.RULE_valueType); + this.enterRule(localContext, 138, QuixosCapabilityParser.RULE_valueType); let _la: number; try { - this.state = 1237; + this.state = 1265; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.BOOL: @@ -4535,134 +4644,139 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.UINT64: this.enterOuterAlt(localContext, 1); { - this.state = 1191; + this.state = 1219; this.scalarType(); } break; case QuixosCapabilityParser.UNIT: this.enterOuterAlt(localContext, 2); { - this.state = 1192; + this.state = 1220; this.match(QuixosCapabilityParser.UNIT); } break; case QuixosCapabilityParser.WATCH_HANDLE: this.enterOuterAlt(localContext, 3); { - this.state = 1193; + this.state = 1221; this.match(QuixosCapabilityParser.WATCH_HANDLE); } break; case QuixosCapabilityParser.MESSAGE: this.enterOuterAlt(localContext, 4); { - this.state = 1194; + this.state = 1222; this.match(QuixosCapabilityParser.MESSAGE); - this.state = 1195; + this.state = 1223; this.stringLiteral(); } break; case QuixosCapabilityParser.ATOM_REF: this.enterOuterAlt(localContext, 5); { - this.state = 1196; + this.state = 1224; this.match(QuixosCapabilityParser.ATOM_REF); - this.state = 1197; + this.state = 1225; this.match(QuixosCapabilityParser.LT); - this.state = 1198; + this.state = 1226; this.identifier(); - this.state = 1199; + this.state = 1227; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.INTERFACE_REF: this.enterOuterAlt(localContext, 6); { - this.state = 1201; + this.state = 1229; this.match(QuixosCapabilityParser.INTERFACE_REF); - this.state = 1202; + this.state = 1230; this.match(QuixosCapabilityParser.LT); - this.state = 1203; + this.state = 1231; this.identifier(); - this.state = 1205; + this.state = 1233; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 138) { + if (_la === 143) { { - this.state = 1204; + this.state = 1232; this.typeArguments(); } } - this.state = 1207; + this.state = 1235; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.REF: this.enterOuterAlt(localContext, 7); { - this.state = 1209; + this.state = 1237; this.match(QuixosCapabilityParser.REF); - this.state = 1210; + this.state = 1238; this.match(QuixosCapabilityParser.LT); - this.state = 1211; + this.state = 1239; this.identifier(); - this.state = 1212; + this.state = 1240; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.OPTIONAL: this.enterOuterAlt(localContext, 8); { - this.state = 1214; + this.state = 1242; this.match(QuixosCapabilityParser.OPTIONAL); - this.state = 1215; + this.state = 1243; this.match(QuixosCapabilityParser.LT); - this.state = 1216; + this.state = 1244; this.valueType(); - this.state = 1217; + this.state = 1245; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.LIST: this.enterOuterAlt(localContext, 9); { - this.state = 1219; + this.state = 1247; this.match(QuixosCapabilityParser.LIST); - this.state = 1220; + this.state = 1248; this.match(QuixosCapabilityParser.LT); - this.state = 1221; + this.state = 1249; this.valueType(); - this.state = 1222; + this.state = 1250; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.RECORD: this.enterOuterAlt(localContext, 10); { - this.state = 1224; + this.state = 1252; this.match(QuixosCapabilityParser.RECORD); - this.state = 1225; + this.state = 1253; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1229; + this.state = 1257; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 89)) & ~0x1F) === 0 && ((1 << (_la - 89)) & 4099) !== 0) || _la === 144) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966782) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8195) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { { { - this.state = 1226; + this.state = 1254; this.recordField(); } } - this.state = 1231; + this.state = 1259; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1232; + this.state = 1260; this.match(QuixosCapabilityParser.RBRACE); } break; case QuixosCapabilityParser.EDIT: + case QuixosCapabilityParser.COMPONENT: + case QuixosCapabilityParser.PRESENTATION: + case QuixosCapabilityParser.SUBJECT: + case QuixosCapabilityParser.RUNTIME: + case QuixosCapabilityParser.FOR: case QuixosCapabilityParser.CREATION: case QuixosCapabilityParser.INITIALIZE: case QuixosCapabilityParser.EXECUTION: @@ -4697,14 +4811,14 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 11); { - this.state = 1233; + this.state = 1261; this.identifier(); - this.state = 1235; + this.state = 1263; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 138) { + if (_la === 143) { { - this.state = 1234; + this.state = 1262; this.typeArguments(); } } @@ -4730,17 +4844,17 @@ export class QuixosCapabilityParser extends antlr.Parser { } public recordField(): RecordFieldContext { let localContext = new RecordFieldContext(this.context, this.state); - this.enterRule(localContext, 136, QuixosCapabilityParser.RULE_recordField); + this.enterRule(localContext, 140, QuixosCapabilityParser.RULE_recordField); try { this.enterOuterAlt(localContext, 1); { - this.state = 1239; + this.state = 1267; this.identifier(); - this.state = 1240; + this.state = 1268; this.match(QuixosCapabilityParser.COLON); - this.state = 1241; + this.state = 1269; this.valueType(); - this.state = 1242; + this.state = 1270; this.match(QuixosCapabilityParser.SEMI); } } @@ -4759,14 +4873,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public scalarType(): ScalarTypeContext { let localContext = new ScalarTypeContext(this.context, this.state); - this.enterRule(localContext, 138, QuixosCapabilityParser.RULE_scalarType); + this.enterRule(localContext, 142, QuixosCapabilityParser.RULE_scalarType); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1244; + this.state = 1272; _la = this.tokenStream.LA(1); - if(!(((((_la - 116)) & ~0x1F) === 0 && ((1 << (_la - 116)) & 255) !== 0))) { + if(!(((((_la - 121)) & ~0x1F) === 0 && ((1 << (_la - 121)) & 255) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4790,14 +4904,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public cardinality(): CardinalityContext { let localContext = new CardinalityContext(this.context, this.state); - this.enterRule(localContext, 140, QuixosCapabilityParser.RULE_cardinality); + this.enterRule(localContext, 144, QuixosCapabilityParser.RULE_cardinality); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1246; + this.state = 1274; _la = this.tokenStream.LA(1); - if(!(((((_la - 103)) & ~0x1F) === 0 && ((1 << (_la - 103)) & 15) !== 0))) { + if(!(((((_la - 108)) & ~0x1F) === 0 && ((1 << (_la - 108)) & 15) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4821,64 +4935,64 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonLiteral(): JsonLiteralContext { let localContext = new JsonLiteralContext(this.context, this.state); - this.enterRule(localContext, 142, QuixosCapabilityParser.RULE_jsonLiteral); + this.enterRule(localContext, 146, QuixosCapabilityParser.RULE_jsonLiteral); try { - this.state = 1256; + this.state = 1284; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STRING_LITERAL: this.enterOuterAlt(localContext, 1); { - this.state = 1248; + this.state = 1276; this.stringLiteral(); } break; case QuixosCapabilityParser.INTEGER: this.enterOuterAlt(localContext, 2); { - this.state = 1249; + this.state = 1277; this.match(QuixosCapabilityParser.INTEGER); } break; case QuixosCapabilityParser.JSON_NUMBER: this.enterOuterAlt(localContext, 3); { - this.state = 1250; + this.state = 1278; this.match(QuixosCapabilityParser.JSON_NUMBER); } break; case QuixosCapabilityParser.TRUE: this.enterOuterAlt(localContext, 4); { - this.state = 1251; + this.state = 1279; this.match(QuixosCapabilityParser.TRUE); } break; case QuixosCapabilityParser.FALSE: this.enterOuterAlt(localContext, 5); { - this.state = 1252; + this.state = 1280; this.match(QuixosCapabilityParser.FALSE); } break; case QuixosCapabilityParser.NULL: this.enterOuterAlt(localContext, 6); { - this.state = 1253; + this.state = 1281; this.match(QuixosCapabilityParser.NULL); } break; case QuixosCapabilityParser.LBRACE: this.enterOuterAlt(localContext, 7); { - this.state = 1254; + this.state = 1282; this.jsonObject(); } break; case QuixosCapabilityParser.LBRACK: this.enterOuterAlt(localContext, 8); { - this.state = 1255; + this.state = 1283; this.jsonArray(); } break; @@ -4901,40 +5015,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonObject(): JsonObjectContext { let localContext = new JsonObjectContext(this.context, this.state); - this.enterRule(localContext, 144, QuixosCapabilityParser.RULE_jsonObject); + this.enterRule(localContext, 148, QuixosCapabilityParser.RULE_jsonObject); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1258; + this.state = 1286; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1267; + this.state = 1295; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 145) { + if (_la === 150) { { - this.state = 1259; + this.state = 1287; this.jsonMember(); - this.state = 1264; + this.state = 1292; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 130) { + while (_la === 135) { { { - this.state = 1260; + this.state = 1288; this.match(QuixosCapabilityParser.COMMA); - this.state = 1261; + this.state = 1289; this.jsonMember(); } } - this.state = 1266; + this.state = 1294; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1269; + this.state = 1297; this.match(QuixosCapabilityParser.RBRACE); } } @@ -4953,15 +5067,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonMember(): JsonMemberContext { let localContext = new JsonMemberContext(this.context, this.state); - this.enterRule(localContext, 146, QuixosCapabilityParser.RULE_jsonMember); + this.enterRule(localContext, 150, QuixosCapabilityParser.RULE_jsonMember); try { this.enterOuterAlt(localContext, 1); { - this.state = 1271; + this.state = 1299; this.stringLiteral(); - this.state = 1272; + this.state = 1300; this.match(QuixosCapabilityParser.COLON); - this.state = 1273; + this.state = 1301; this.jsonLiteral(); } } @@ -4980,40 +5094,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonArray(): JsonArrayContext { let localContext = new JsonArrayContext(this.context, this.state); - this.enterRule(localContext, 148, QuixosCapabilityParser.RULE_jsonArray); + this.enterRule(localContext, 152, QuixosCapabilityParser.RULE_jsonArray); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1275; + this.state = 1303; this.match(QuixosCapabilityParser.LBRACK); - this.state = 1284; + this.state = 1312; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (((((_la - 124)) & ~0x1F) === 0 && ((1 << (_la - 124)) & 2884871) !== 0)) { + if (((((_la - 129)) & ~0x1F) === 0 && ((1 << (_la - 129)) & 2884871) !== 0)) { { - this.state = 1276; + this.state = 1304; this.jsonLiteral(); - this.state = 1281; + this.state = 1309; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 130) { + while (_la === 135) { { { - this.state = 1277; + this.state = 1305; this.match(QuixosCapabilityParser.COMMA); - this.state = 1278; + this.state = 1306; this.jsonLiteral(); } } - this.state = 1283; + this.state = 1311; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1286; + this.state = 1314; this.match(QuixosCapabilityParser.RBRACK); } } @@ -5032,14 +5146,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public identifier(): IdentifierContext { let localContext = new IdentifierContext(this.context, this.state); - this.enterRule(localContext, 150, QuixosCapabilityParser.RULE_identifier); + this.enterRule(localContext, 154, QuixosCapabilityParser.RULE_identifier); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1288; + this.state = 1316; _la = this.tokenStream.LA(1); - if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 536870894) !== 0) || _la === 40 || _la === 69 || ((((_la - 89)) & ~0x1F) === 0 && ((1 << (_la - 89)) & 4099) !== 0) || _la === 144)) { + if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966782) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8195) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149)) { this.errorHandler.recoverInline(this); } else { @@ -5063,11 +5177,11 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stringLiteral(): StringLiteralContext { let localContext = new StringLiteralContext(this.context, this.state); - this.enterRule(localContext, 152, QuixosCapabilityParser.RULE_stringLiteral); + this.enterRule(localContext, 156, QuixosCapabilityParser.RULE_stringLiteral); try { this.enterOuterAlt(localContext, 1); { - this.state = 1290; + this.state = 1318; this.match(QuixosCapabilityParser.STRING_LITERAL); } } @@ -5086,7 +5200,7 @@ export class QuixosCapabilityParser extends antlr.Parser { } public static readonly _serializedATN: number[] = [ - 4,1,148,1293,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,153,1321,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, @@ -5097,493 +5211,503 @@ export class QuixosCapabilityParser extends antlr.Parser { 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,1,0,1,0,1,0,1,0, - 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,167,8,0,1,1,1,1,1,1,5,1,172, - 8,1,10,1,12,1,175,9,1,1,1,1,1,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1, - 3,1,3,1,3,1,3,1,3,1,3,5,3,193,8,3,10,3,12,3,196,9,3,1,3,1,3,1,4, - 1,4,1,4,1,4,1,4,1,4,1,4,3,4,207,8,4,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,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7, - 1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,3,8,239,8,8,1,9,1,9,1,9,1,9,1,9, - 1,9,3,9,247,8,9,1,9,1,9,1,10,5,10,252,8,10,10,10,12,10,255,9,10, - 1,10,1,10,1,10,3,10,260,8,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10, - 1,10,5,10,270,8,10,10,10,12,10,273,9,10,3,10,275,8,10,1,10,1,10, - 5,10,279,8,10,10,10,12,10,282,9,10,1,10,1,10,1,11,1,11,1,11,1,11, - 5,11,290,8,11,10,11,12,11,293,9,11,1,11,1,11,1,12,1,12,1,12,1,12, - 3,12,301,8,12,1,12,1,12,1,12,1,12,1,12,1,12,5,12,309,8,12,10,12, - 12,12,312,9,12,3,12,314,8,12,3,12,316,8,12,1,13,1,13,3,13,320,8, - 13,1,14,1,14,1,14,1,14,5,14,326,8,14,10,14,12,14,329,9,14,1,14,1, - 14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,3,15,340,8,15,1,16,1,16,1, - 16,3,16,345,8,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,3,17,354,8,17, - 1,18,3,18,357,8,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18, - 1,18,1,18,1,18,1,18,3,18,372,8,18,1,18,1,18,1,18,1,19,3,19,378,8, - 19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,5,19,388,8,19,10,19,12, - 19,391,9,19,1,19,1,19,1,20,1,20,1,20,1,20,3,20,399,8,20,1,20,1,20, - 1,20,1,20,1,20,1,20,3,20,407,8,20,1,20,1,20,1,20,1,20,1,20,1,20, - 3,20,415,8,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20, - 1,20,3,20,428,8,20,1,21,3,21,431,8,21,1,21,1,21,1,21,1,21,1,21,1, - 21,1,21,1,21,3,21,441,8,21,1,21,1,21,3,21,445,8,21,1,21,1,21,5,21, - 449,8,21,10,21,12,21,452,9,21,1,21,1,21,1,22,1,22,3,22,458,8,22, - 1,23,1,23,1,23,1,23,3,23,464,8,23,1,23,1,23,1,23,1,23,1,23,1,23, - 3,23,472,8,23,1,23,1,23,1,23,1,23,1,23,1,23,3,23,480,8,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,3,23,493,8,23,1, - 24,1,24,1,24,1,24,1,24,3,24,500,8,24,1,24,1,24,3,24,504,8,24,1,25, - 5,25,507,8,25,10,25,12,25,510,9,25,1,25,1,25,1,25,1,25,1,25,1,25, - 1,25,1,25,3,25,520,8,25,1,25,1,25,5,25,524,8,25,10,25,12,25,527, - 9,25,1,25,1,25,1,26,1,26,1,26,1,26,1,26,3,26,536,8,26,1,27,1,27, - 1,27,3,27,541,8,27,1,27,1,27,1,27,1,27,3,27,547,8,27,1,27,1,27,1, - 27,1,27,1,27,1,27,1,27,5,27,556,8,27,10,27,12,27,559,9,27,1,27,1, - 27,1,28,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,29,1,29,1,29,1,29,1,29,1,29,1,29,3,29,585,8,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,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,3,29,612, - 8,29,1,30,1,30,1,30,3,30,617,8,30,1,30,1,30,1,30,1,30,1,30,1,30, - 1,30,1,30,1,30,3,30,628,8,30,1,30,3,30,631,8,30,1,30,1,30,1,30,3, - 30,636,8,30,1,30,3,30,639,8,30,1,30,1,30,1,31,1,31,1,31,3,31,646, - 8,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,3,31,655,8,31,1,31,3,31, - 658,8,31,1,31,3,31,661,8,31,1,31,1,31,1,32,1,32,1,32,1,32,1,33,1, - 33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,3,33,678,8,33,1,34,1,34,1, - 34,1,34,1,34,5,34,685,8,34,10,34,12,34,688,9,34,1,34,1,34,1,35,1, - 35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,3,35,701,8,35,1,35,1,35,1, - 36,1,36,1,36,1,37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1, - 38,1,38,5,38,720,8,38,10,38,12,38,723,9,38,3,38,725,8,38,1,38,3, - 38,728,8,38,1,39,1,39,1,39,5,39,733,8,39,10,39,12,39,736,9,39,1, - 40,1,40,1,40,5,40,741,8,40,10,40,12,40,744,9,40,1,40,1,40,1,41,1, - 41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1, - 41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1, - 41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,3,41,783,8,41,1,41,3,41,786, - 8,41,1,41,1,41,3,41,790,8,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41, - 1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41, - 3,41,812,8,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41, - 1,41,1,41,3,41,826,8,41,1,42,1,42,1,42,1,42,5,42,832,8,42,10,42, - 12,42,835,9,42,1,42,1,42,1,43,1,43,1,44,1,44,1,44,1,45,1,45,3,45, - 846,8,45,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46, - 1,46,3,46,860,8,46,1,46,1,46,1,47,1,47,1,47,1,47,1,47,1,47,3,47, - 870,8,47,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,49,1,49, - 1,49,1,49,1,49,1,49,1,49,3,49,888,8,49,1,49,1,49,3,49,892,8,49,1, - 49,3,49,895,8,49,1,49,1,49,3,49,899,8,49,1,49,3,49,902,8,49,1,49, - 1,49,1,50,1,50,1,50,1,50,1,50,3,50,911,8,50,1,50,1,50,3,50,915,8, - 50,1,50,1,50,3,50,919,8,50,1,50,1,50,5,50,923,8,50,10,50,12,50,926, - 9,50,1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,51,3,51,936,8,51,1,52, - 1,52,1,52,5,52,941,8,52,10,52,12,52,944,9,52,1,52,1,52,1,52,1,53, - 1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53, - 3,53,963,8,53,1,54,1,54,1,54,1,54,1,54,5,54,970,8,54,10,54,12,54, - 973,9,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,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,57, - 1,57,1,57,1,57,1,57,1,57,3,57,1004,8,57,1,57,1,57,1,58,1,58,1,58, - 1,58,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,1024,8,59,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60, - 1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,3,60,1044,8,60,1,60,1,60, - 1,60,1,60,1,60,1,60,1,60,1,60,3,60,1054,8,60,1,60,3,60,1057,8,60, - 1,60,3,60,1060,8,60,3,60,1062,8,60,1,61,1,61,1,61,1,62,1,62,1,63, - 1,63,1,64,1,64,1,64,5,64,1074,8,64,10,64,12,64,1077,9,64,1,64,1, - 64,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1, - 65,1,65,1,65,1,65,1,65,1,65,1,65,3,65,1100,8,65,1,65,1,65,1,65,1, - 65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65,1116,8, - 65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65,1125,8,65,1,65,1,65,1, - 65,1,65,1,65,1,65,1,65,1,65,3,65,1135,8,65,1,65,1,65,1,65,1,65,1, - 65,1,65,1,65,1,65,1,65,5,65,1146,8,65,10,65,12,65,1149,9,65,1,65, - 1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65,1163, - 8,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65,1175, - 8,65,1,65,1,65,3,65,1179,8,65,1,66,1,66,1,66,1,66,1,66,1,66,1,66, - 3,66,1188,8,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,67,1,67,1,67,1,67,3,67,1206,8,67,1,67,1,67,1,67,1,67, - 1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67, - 1,67,1,67,1,67,5,67,1228,8,67,10,67,12,67,1231,9,67,1,67,1,67,1, - 67,3,67,1236,8,67,3,67,1238,8,67,1,68,1,68,1,68,1,68,1,68,1,69,1, - 69,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,3,71,1257,8, - 71,1,72,1,72,1,72,1,72,5,72,1263,8,72,10,72,12,72,1266,9,72,3,72, - 1268,8,72,1,72,1,72,1,73,1,73,1,73,1,73,1,74,1,74,1,74,1,74,5,74, - 1280,8,74,10,74,12,74,1283,9,74,3,74,1285,8,74,1,74,1,74,1,75,1, - 75,1,76,1,76,1,76,0,0,77,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,0,9,2,0,10,10,28,28,1,0,6,7,1,0,96,100,3,0,1,1,91, - 95,97,98,3,0,1,1,91,92,97,98,2,0,93,95,97,98,1,0,116,123,1,0,103, - 106,7,0,1,3,5,28,40,40,69,69,89,90,101,101,144,144,1400,0,166,1, - 0,0,0,2,168,1,0,0,0,4,178,1,0,0,0,6,182,1,0,0,0,8,206,1,0,0,0,10, - 218,1,0,0,0,12,220,1,0,0,0,14,227,1,0,0,0,16,238,1,0,0,0,18,240, - 1,0,0,0,20,253,1,0,0,0,22,285,1,0,0,0,24,315,1,0,0,0,26,317,1,0, - 0,0,28,321,1,0,0,0,30,339,1,0,0,0,32,341,1,0,0,0,34,353,1,0,0,0, - 36,356,1,0,0,0,38,377,1,0,0,0,40,427,1,0,0,0,42,430,1,0,0,0,44,455, - 1,0,0,0,46,492,1,0,0,0,48,503,1,0,0,0,50,508,1,0,0,0,52,535,1,0, - 0,0,54,537,1,0,0,0,56,562,1,0,0,0,58,611,1,0,0,0,60,613,1,0,0,0, - 62,642,1,0,0,0,64,664,1,0,0,0,66,677,1,0,0,0,68,679,1,0,0,0,70,691, - 1,0,0,0,72,704,1,0,0,0,74,707,1,0,0,0,76,727,1,0,0,0,78,729,1,0, - 0,0,80,737,1,0,0,0,82,825,1,0,0,0,84,827,1,0,0,0,86,838,1,0,0,0, - 88,840,1,0,0,0,90,845,1,0,0,0,92,847,1,0,0,0,94,869,1,0,0,0,96,871, - 1,0,0,0,98,880,1,0,0,0,100,905,1,0,0,0,102,935,1,0,0,0,104,937,1, - 0,0,0,106,962,1,0,0,0,108,964,1,0,0,0,110,976,1,0,0,0,112,983,1, - 0,0,0,114,997,1,0,0,0,116,1007,1,0,0,0,118,1023,1,0,0,0,120,1061, - 1,0,0,0,122,1063,1,0,0,0,124,1066,1,0,0,0,126,1068,1,0,0,0,128,1070, - 1,0,0,0,130,1178,1,0,0,0,132,1180,1,0,0,0,134,1237,1,0,0,0,136,1239, - 1,0,0,0,138,1244,1,0,0,0,140,1246,1,0,0,0,142,1256,1,0,0,0,144,1258, - 1,0,0,0,146,1271,1,0,0,0,148,1275,1,0,0,0,150,1288,1,0,0,0,152,1290, - 1,0,0,0,154,155,3,6,3,0,155,156,5,0,0,1,156,167,1,0,0,0,157,158, - 3,20,10,0,158,159,5,0,0,1,159,167,1,0,0,0,160,161,3,50,25,0,161, - 162,5,0,0,1,162,167,1,0,0,0,163,164,3,2,1,0,164,165,5,0,0,1,165, - 167,1,0,0,0,166,154,1,0,0,0,166,157,1,0,0,0,166,160,1,0,0,0,166, - 163,1,0,0,0,167,1,1,0,0,0,168,169,5,35,0,0,169,173,5,132,0,0,170, - 172,3,8,4,0,171,170,1,0,0,0,172,175,1,0,0,0,173,171,1,0,0,0,173, - 174,1,0,0,0,174,176,1,0,0,0,175,173,1,0,0,0,176,177,5,133,0,0,177, - 3,1,0,0,0,178,179,5,36,0,0,179,180,3,152,76,0,180,181,5,129,0,0, - 181,5,1,0,0,0,182,183,5,4,0,0,183,184,3,150,75,0,184,185,5,79,0, - 0,185,186,3,152,76,0,186,187,5,72,0,0,187,188,3,152,76,0,188,189, - 5,71,0,0,189,190,3,152,76,0,190,194,5,132,0,0,191,193,3,8,4,0,192, - 191,1,0,0,0,193,196,1,0,0,0,194,192,1,0,0,0,194,195,1,0,0,0,195, - 197,1,0,0,0,196,194,1,0,0,0,197,198,5,133,0,0,198,7,1,0,0,0,199, - 207,3,4,2,0,200,207,3,18,9,0,201,207,3,10,5,0,202,207,3,88,44,0, - 203,207,3,100,50,0,204,207,3,132,66,0,205,207,3,32,16,0,206,199, - 1,0,0,0,206,200,1,0,0,0,206,201,1,0,0,0,206,202,1,0,0,0,206,203, - 1,0,0,0,206,204,1,0,0,0,206,205,1,0,0,0,207,9,1,0,0,0,208,209,5, - 36,0,0,209,210,5,39,0,0,210,211,3,150,75,0,211,212,5,129,0,0,212, - 219,1,0,0,0,213,214,5,36,0,0,214,215,5,41,0,0,215,216,3,150,75,0, - 216,217,5,129,0,0,217,219,1,0,0,0,218,208,1,0,0,0,218,213,1,0,0, - 0,219,11,1,0,0,0,220,221,5,37,0,0,221,222,5,38,0,0,222,223,3,150, - 75,0,223,224,5,79,0,0,224,225,3,152,76,0,225,226,5,129,0,0,226,13, - 1,0,0,0,227,228,5,37,0,0,228,229,5,39,0,0,229,230,3,150,75,0,230, - 231,5,72,0,0,231,232,3,152,76,0,232,233,5,129,0,0,233,15,1,0,0,0, - 234,239,3,10,5,0,235,239,3,12,6,0,236,239,3,14,7,0,237,239,3,32, - 16,0,238,234,1,0,0,0,238,235,1,0,0,0,238,236,1,0,0,0,238,237,1,0, - 0,0,239,17,1,0,0,0,240,241,5,38,0,0,241,242,3,150,75,0,242,243,5, - 79,0,0,243,246,3,152,76,0,244,245,5,80,0,0,245,247,3,152,76,0,246, - 244,1,0,0,0,246,247,1,0,0,0,247,248,1,0,0,0,248,249,5,129,0,0,249, - 19,1,0,0,0,250,252,3,16,8,0,251,250,1,0,0,0,252,255,1,0,0,0,253, - 251,1,0,0,0,253,254,1,0,0,0,254,256,1,0,0,0,255,253,1,0,0,0,256, - 257,5,39,0,0,257,259,3,150,75,0,258,260,3,22,11,0,259,258,1,0,0, - 0,259,260,1,0,0,0,260,261,1,0,0,0,261,262,5,79,0,0,262,263,3,152, - 76,0,263,264,5,72,0,0,264,274,3,152,76,0,265,266,5,84,0,0,266,271, - 3,26,13,0,267,268,5,130,0,0,268,270,3,26,13,0,269,267,1,0,0,0,270, - 273,1,0,0,0,271,269,1,0,0,0,271,272,1,0,0,0,272,275,1,0,0,0,273, - 271,1,0,0,0,274,265,1,0,0,0,274,275,1,0,0,0,275,276,1,0,0,0,276, - 280,5,132,0,0,277,279,3,34,17,0,278,277,1,0,0,0,279,282,1,0,0,0, - 280,278,1,0,0,0,280,281,1,0,0,0,281,283,1,0,0,0,282,280,1,0,0,0, - 283,284,5,133,0,0,284,21,1,0,0,0,285,286,5,138,0,0,286,291,3,24, - 12,0,287,288,5,130,0,0,288,290,3,24,12,0,289,287,1,0,0,0,290,293, - 1,0,0,0,291,289,1,0,0,0,291,292,1,0,0,0,292,294,1,0,0,0,293,291, - 1,0,0,0,294,295,5,139,0,0,295,23,1,0,0,0,296,297,5,42,0,0,297,300, - 3,150,75,0,298,299,5,128,0,0,299,301,5,32,0,0,300,298,1,0,0,0,300, - 301,1,0,0,0,301,316,1,0,0,0,302,303,5,31,0,0,303,313,3,150,75,0, - 304,305,5,33,0,0,305,310,3,26,13,0,306,307,5,140,0,0,307,309,3,26, - 13,0,308,306,1,0,0,0,309,312,1,0,0,0,310,308,1,0,0,0,310,311,1,0, - 0,0,311,314,1,0,0,0,312,310,1,0,0,0,313,304,1,0,0,0,313,314,1,0, - 0,0,314,316,1,0,0,0,315,296,1,0,0,0,315,302,1,0,0,0,316,25,1,0,0, - 0,317,319,3,150,75,0,318,320,3,28,14,0,319,318,1,0,0,0,319,320,1, - 0,0,0,320,27,1,0,0,0,321,322,5,138,0,0,322,327,3,30,15,0,323,324, - 5,130,0,0,324,326,3,30,15,0,325,323,1,0,0,0,326,329,1,0,0,0,327, - 325,1,0,0,0,327,328,1,0,0,0,328,330,1,0,0,0,329,327,1,0,0,0,330, - 331,5,139,0,0,331,29,1,0,0,0,332,333,5,38,0,0,333,340,3,150,75,0, - 334,335,5,39,0,0,335,340,3,26,13,0,336,337,5,31,0,0,337,340,3,150, - 75,0,338,340,3,134,67,0,339,332,1,0,0,0,339,334,1,0,0,0,339,336, - 1,0,0,0,339,338,1,0,0,0,340,31,1,0,0,0,341,342,5,30,0,0,342,344, - 3,150,75,0,343,345,3,22,11,0,344,343,1,0,0,0,344,345,1,0,0,0,345, - 346,1,0,0,0,346,347,5,141,0,0,347,348,3,134,67,0,348,349,5,129,0, - 0,349,33,1,0,0,0,350,354,3,38,19,0,351,354,3,42,21,0,352,354,3,36, - 18,0,353,350,1,0,0,0,353,351,1,0,0,0,353,352,1,0,0,0,354,35,1,0, - 0,0,355,357,5,52,0,0,356,355,1,0,0,0,356,357,1,0,0,0,357,358,1,0, - 0,0,358,359,5,44,0,0,359,360,3,150,75,0,360,361,5,79,0,0,361,362, - 3,152,76,0,362,363,5,128,0,0,363,364,3,134,67,0,364,365,5,127,0, - 0,365,366,3,134,67,0,366,367,5,132,0,0,367,368,5,96,0,0,368,369, - 5,79,0,0,369,371,3,152,76,0,370,372,3,66,33,0,371,370,1,0,0,0,371, - 372,1,0,0,0,372,373,1,0,0,0,373,374,5,129,0,0,374,375,5,133,0,0, - 375,37,1,0,0,0,376,378,3,44,22,0,377,376,1,0,0,0,377,378,1,0,0,0, - 378,379,1,0,0,0,379,380,5,42,0,0,380,381,3,150,75,0,381,382,5,79, - 0,0,382,383,3,152,76,0,383,384,5,128,0,0,384,385,3,134,67,0,385, - 389,5,132,0,0,386,388,3,40,20,0,387,386,1,0,0,0,388,391,1,0,0,0, - 389,387,1,0,0,0,389,390,1,0,0,0,390,392,1,0,0,0,391,389,1,0,0,0, - 392,393,5,133,0,0,393,39,1,0,0,0,394,395,5,86,0,0,395,396,5,79,0, - 0,396,398,3,152,76,0,397,399,3,66,33,0,398,397,1,0,0,0,398,399,1, - 0,0,0,399,400,1,0,0,0,400,401,5,129,0,0,401,428,1,0,0,0,402,403, - 5,87,0,0,403,404,5,79,0,0,404,406,3,152,76,0,405,407,3,66,33,0,406, - 405,1,0,0,0,406,407,1,0,0,0,407,408,1,0,0,0,408,409,5,129,0,0,409, - 428,1,0,0,0,410,411,5,1,0,0,411,412,5,79,0,0,412,414,3,152,76,0, - 413,415,3,66,33,0,414,413,1,0,0,0,414,415,1,0,0,0,415,416,1,0,0, - 0,416,417,5,129,0,0,417,428,1,0,0,0,418,419,5,88,0,0,419,420,5,89, - 0,0,420,421,5,79,0,0,421,422,3,152,76,0,422,423,5,90,0,0,423,424, - 5,79,0,0,424,425,3,152,76,0,425,426,5,129,0,0,426,428,1,0,0,0,427, - 394,1,0,0,0,427,402,1,0,0,0,427,410,1,0,0,0,427,418,1,0,0,0,428, - 41,1,0,0,0,429,431,3,44,22,0,430,429,1,0,0,0,430,431,1,0,0,0,431, - 432,1,0,0,0,432,433,5,43,0,0,433,434,3,150,75,0,434,435,5,79,0,0, - 435,436,3,152,76,0,436,437,5,128,0,0,437,438,3,140,70,0,438,440, - 3,48,24,0,439,441,5,107,0,0,440,439,1,0,0,0,440,441,1,0,0,0,441, - 444,1,0,0,0,442,443,5,77,0,0,443,445,3,152,76,0,444,442,1,0,0,0, - 444,445,1,0,0,0,445,446,1,0,0,0,446,450,5,132,0,0,447,449,3,46,23, - 0,448,447,1,0,0,0,449,452,1,0,0,0,450,448,1,0,0,0,450,451,1,0,0, - 0,451,453,1,0,0,0,452,450,1,0,0,0,453,454,5,133,0,0,454,43,1,0,0, - 0,455,457,5,27,0,0,456,458,7,0,0,0,457,456,1,0,0,0,457,458,1,0,0, - 0,458,45,1,0,0,0,459,460,5,93,0,0,460,461,5,79,0,0,461,463,3,152, - 76,0,462,464,3,66,33,0,463,462,1,0,0,0,463,464,1,0,0,0,464,465,1, - 0,0,0,465,466,5,129,0,0,466,493,1,0,0,0,467,468,5,94,0,0,468,469, - 5,79,0,0,469,471,3,152,76,0,470,472,3,66,33,0,471,470,1,0,0,0,471, - 472,1,0,0,0,472,473,1,0,0,0,473,474,5,129,0,0,474,493,1,0,0,0,475, - 476,5,95,0,0,476,477,5,79,0,0,477,479,3,152,76,0,478,480,3,66,33, - 0,479,478,1,0,0,0,479,480,1,0,0,0,480,481,1,0,0,0,481,482,5,129, - 0,0,482,493,1,0,0,0,483,484,5,88,0,0,484,485,5,89,0,0,485,486,5, - 79,0,0,486,487,3,152,76,0,487,488,5,90,0,0,488,489,5,79,0,0,489, - 490,3,152,76,0,490,491,5,129,0,0,491,493,1,0,0,0,492,459,1,0,0,0, - 492,467,1,0,0,0,492,475,1,0,0,0,492,483,1,0,0,0,493,47,1,0,0,0,494, - 495,5,38,0,0,495,504,3,150,75,0,496,497,5,39,0,0,497,499,3,150,75, - 0,498,500,3,28,14,0,499,498,1,0,0,0,499,500,1,0,0,0,500,504,1,0, - 0,0,501,502,5,31,0,0,502,504,3,150,75,0,503,494,1,0,0,0,503,496, - 1,0,0,0,503,501,1,0,0,0,504,49,1,0,0,0,505,507,3,16,8,0,506,505, - 1,0,0,0,507,510,1,0,0,0,508,506,1,0,0,0,508,509,1,0,0,0,509,511, - 1,0,0,0,510,508,1,0,0,0,511,512,5,41,0,0,512,513,3,150,75,0,513, - 514,5,79,0,0,514,515,3,152,76,0,515,516,5,72,0,0,516,519,3,152,76, - 0,517,518,5,73,0,0,518,520,5,142,0,0,519,517,1,0,0,0,519,520,1,0, - 0,0,520,521,1,0,0,0,521,525,5,132,0,0,522,524,3,52,26,0,523,522, - 1,0,0,0,524,527,1,0,0,0,525,523,1,0,0,0,525,526,1,0,0,0,526,528, - 1,0,0,0,527,525,1,0,0,0,528,529,5,133,0,0,529,51,1,0,0,0,530,536, - 3,60,30,0,531,536,3,62,31,0,532,536,3,70,35,0,533,536,3,54,27,0, - 534,536,3,56,28,0,535,530,1,0,0,0,535,531,1,0,0,0,535,532,1,0,0, - 0,535,533,1,0,0,0,535,534,1,0,0,0,536,53,1,0,0,0,537,538,5,17,0, - 0,538,540,3,150,75,0,539,541,3,22,11,0,540,539,1,0,0,0,540,541,1, - 0,0,0,541,542,1,0,0,0,542,543,5,79,0,0,543,544,3,152,76,0,544,546, - 5,20,0,0,545,547,5,4,0,0,546,545,1,0,0,0,546,547,1,0,0,0,547,548, - 1,0,0,0,548,549,3,26,13,0,549,550,5,21,0,0,550,551,3,152,76,0,551, - 552,5,44,0,0,552,553,3,152,76,0,553,557,5,132,0,0,554,556,3,58,29, - 0,555,554,1,0,0,0,556,559,1,0,0,0,557,555,1,0,0,0,557,558,1,0,0, - 0,558,560,1,0,0,0,559,557,1,0,0,0,560,561,5,133,0,0,561,55,1,0,0, - 0,562,563,5,17,0,0,563,564,3,150,75,0,564,565,5,79,0,0,565,566,3, - 152,76,0,566,567,5,19,0,0,567,568,3,150,75,0,568,569,3,28,14,0,569, - 570,5,129,0,0,570,57,1,0,0,0,571,572,5,11,0,0,572,612,5,129,0,0, - 573,574,5,12,0,0,574,575,5,13,0,0,575,576,3,150,75,0,576,577,5,129, - 0,0,577,612,1,0,0,0,578,579,5,22,0,0,579,580,3,152,76,0,580,581, - 5,129,0,0,581,612,1,0,0,0,582,584,5,23,0,0,583,585,5,31,0,0,584, - 583,1,0,0,0,584,585,1,0,0,0,585,586,1,0,0,0,586,587,3,150,75,0,587, - 588,5,50,0,0,588,589,3,26,13,0,589,590,5,129,0,0,590,612,1,0,0,0, - 591,592,5,24,0,0,592,593,3,150,75,0,593,594,5,142,0,0,594,595,5, - 129,0,0,595,612,1,0,0,0,596,597,5,25,0,0,597,598,3,26,13,0,598,599, - 5,131,0,0,599,600,3,150,75,0,600,601,3,150,75,0,601,602,3,152,76, - 0,602,603,5,129,0,0,603,612,1,0,0,0,604,605,5,88,0,0,605,612,5,129, - 0,0,606,607,5,26,0,0,607,608,5,142,0,0,608,609,3,152,76,0,609,610, - 5,129,0,0,610,612,1,0,0,0,611,571,1,0,0,0,611,573,1,0,0,0,611,578, - 1,0,0,0,611,582,1,0,0,0,611,591,1,0,0,0,611,596,1,0,0,0,611,604, - 1,0,0,0,611,606,1,0,0,0,612,59,1,0,0,0,613,614,5,44,0,0,614,616, - 3,150,75,0,615,617,3,22,11,0,616,615,1,0,0,0,616,617,1,0,0,0,617, - 618,1,0,0,0,618,619,5,79,0,0,619,620,3,152,76,0,620,621,5,128,0, - 0,621,622,3,134,67,0,622,623,5,127,0,0,623,624,3,134,67,0,624,625, - 5,81,0,0,625,627,3,74,37,0,626,628,3,66,33,0,627,626,1,0,0,0,627, - 628,1,0,0,0,628,630,1,0,0,0,629,631,3,72,36,0,630,629,1,0,0,0,630, - 631,1,0,0,0,631,632,1,0,0,0,632,633,5,83,0,0,633,635,3,76,38,0,634, - 636,3,80,40,0,635,634,1,0,0,0,635,636,1,0,0,0,636,638,1,0,0,0,637, - 639,3,64,32,0,638,637,1,0,0,0,638,639,1,0,0,0,639,640,1,0,0,0,640, - 641,5,129,0,0,641,61,1,0,0,0,642,643,5,45,0,0,643,645,3,150,75,0, - 644,646,3,22,11,0,645,644,1,0,0,0,645,646,1,0,0,0,646,647,1,0,0, - 0,647,648,5,79,0,0,648,649,3,152,76,0,649,650,5,128,0,0,650,651, - 3,134,67,0,651,652,5,127,0,0,652,654,3,134,67,0,653,655,3,66,33, - 0,654,653,1,0,0,0,654,655,1,0,0,0,655,657,1,0,0,0,656,658,3,80,40, - 0,657,656,1,0,0,0,657,658,1,0,0,0,658,660,1,0,0,0,659,661,3,64,32, - 0,660,659,1,0,0,0,660,661,1,0,0,0,661,662,1,0,0,0,662,663,5,129, - 0,0,663,63,1,0,0,0,664,665,5,61,0,0,665,666,5,60,0,0,666,667,3,150, - 75,0,667,65,1,0,0,0,668,669,5,5,0,0,669,678,5,8,0,0,670,671,5,5, - 0,0,671,672,7,1,0,0,672,673,5,9,0,0,673,674,5,134,0,0,674,675,3, - 78,39,0,675,676,5,135,0,0,676,678,1,0,0,0,677,668,1,0,0,0,677,670, - 1,0,0,0,678,67,1,0,0,0,679,680,5,60,0,0,680,681,5,134,0,0,681,686, - 3,116,58,0,682,683,5,130,0,0,683,685,3,116,58,0,684,682,1,0,0,0, - 685,688,1,0,0,0,686,684,1,0,0,0,686,687,1,0,0,0,687,689,1,0,0,0, - 688,686,1,0,0,0,689,690,5,135,0,0,690,69,1,0,0,0,691,692,5,46,0, - 0,692,693,3,150,75,0,693,694,5,79,0,0,694,695,3,152,76,0,695,696, - 5,47,0,0,696,697,3,150,75,0,697,698,5,128,0,0,698,700,3,134,67,0, - 699,701,3,80,40,0,700,699,1,0,0,0,700,701,1,0,0,0,701,702,1,0,0, - 0,702,703,5,129,0,0,703,71,1,0,0,0,704,705,5,82,0,0,705,706,3,134, - 67,0,706,73,1,0,0,0,707,708,7,2,0,0,708,75,1,0,0,0,709,728,5,85, - 0,0,710,711,5,38,0,0,711,728,3,150,75,0,712,713,5,31,0,0,713,728, - 3,150,75,0,714,715,5,40,0,0,715,724,5,134,0,0,716,721,3,26,13,0, - 717,718,5,130,0,0,718,720,3,26,13,0,719,717,1,0,0,0,720,723,1,0, - 0,0,721,719,1,0,0,0,721,722,1,0,0,0,722,725,1,0,0,0,723,721,1,0, - 0,0,724,716,1,0,0,0,724,725,1,0,0,0,725,726,1,0,0,0,726,728,5,135, - 0,0,727,709,1,0,0,0,727,710,1,0,0,0,727,712,1,0,0,0,727,714,1,0, - 0,0,728,77,1,0,0,0,729,734,3,150,75,0,730,731,5,130,0,0,731,733, - 3,150,75,0,732,730,1,0,0,0,733,736,1,0,0,0,734,732,1,0,0,0,734,735, - 1,0,0,0,735,79,1,0,0,0,736,734,1,0,0,0,737,738,5,84,0,0,738,742, - 5,132,0,0,739,741,3,82,41,0,740,739,1,0,0,0,741,744,1,0,0,0,742, - 740,1,0,0,0,742,743,1,0,0,0,743,745,1,0,0,0,744,742,1,0,0,0,745, - 746,5,133,0,0,746,81,1,0,0,0,747,748,5,18,0,0,748,749,3,150,75,0, - 749,750,5,79,0,0,750,751,3,152,76,0,751,752,5,134,0,0,752,753,3, - 78,39,0,753,754,5,135,0,0,754,755,5,129,0,0,755,826,1,0,0,0,756, - 757,5,56,0,0,757,758,3,150,75,0,758,759,5,79,0,0,759,760,3,152,76, - 0,760,761,5,128,0,0,761,762,3,134,67,0,762,763,3,84,42,0,763,764, - 5,129,0,0,764,826,1,0,0,0,765,766,5,57,0,0,766,767,3,150,75,0,767, - 768,5,79,0,0,768,769,3,152,76,0,769,770,5,128,0,0,770,771,3,140, - 70,0,771,772,3,48,24,0,772,773,3,84,42,0,773,774,5,129,0,0,774,826, - 1,0,0,0,775,776,5,39,0,0,776,777,3,150,75,0,777,778,5,79,0,0,778, - 779,3,152,76,0,779,780,5,128,0,0,780,782,3,150,75,0,781,783,3,28, - 14,0,782,781,1,0,0,0,782,783,1,0,0,0,783,785,1,0,0,0,784,786,3,68, - 34,0,785,784,1,0,0,0,785,786,1,0,0,0,786,789,1,0,0,0,787,788,5,13, - 0,0,788,790,5,48,0,0,789,787,1,0,0,0,789,790,1,0,0,0,790,791,1,0, - 0,0,791,792,5,129,0,0,792,826,1,0,0,0,793,794,5,2,0,0,794,795,3, - 150,75,0,795,796,5,79,0,0,796,797,3,152,76,0,797,798,5,128,0,0,798, - 799,3,150,75,0,799,800,5,48,0,0,800,801,3,134,67,0,801,802,5,129, - 0,0,802,826,1,0,0,0,803,804,5,46,0,0,804,805,3,150,75,0,805,806, - 5,79,0,0,806,807,3,152,76,0,807,808,5,128,0,0,808,811,3,150,75,0, - 809,810,5,48,0,0,810,812,3,134,67,0,811,809,1,0,0,0,811,812,1,0, - 0,0,812,813,1,0,0,0,813,814,5,129,0,0,814,826,1,0,0,0,815,816,5, - 17,0,0,816,817,3,150,75,0,817,818,5,79,0,0,818,819,3,152,76,0,819, - 820,5,128,0,0,820,821,3,150,75,0,821,822,5,131,0,0,822,823,3,150, - 75,0,823,824,5,129,0,0,824,826,1,0,0,0,825,747,1,0,0,0,825,756,1, - 0,0,0,825,765,1,0,0,0,825,775,1,0,0,0,825,793,1,0,0,0,825,803,1, - 0,0,0,825,815,1,0,0,0,826,83,1,0,0,0,827,828,5,134,0,0,828,833,3, - 86,43,0,829,830,5,130,0,0,830,832,3,86,43,0,831,829,1,0,0,0,832, - 835,1,0,0,0,833,831,1,0,0,0,833,834,1,0,0,0,834,836,1,0,0,0,835, - 833,1,0,0,0,836,837,5,135,0,0,837,85,1,0,0,0,838,839,7,3,0,0,839, - 87,1,0,0,0,840,841,5,55,0,0,841,842,3,90,45,0,842,89,1,0,0,0,843, - 846,3,92,46,0,844,846,3,96,48,0,845,843,1,0,0,0,845,844,1,0,0,0, - 846,91,1,0,0,0,847,848,5,56,0,0,848,849,3,150,75,0,849,850,5,79, - 0,0,850,851,3,152,76,0,851,852,5,66,0,0,852,853,3,150,75,0,853,854, - 5,128,0,0,854,855,3,134,67,0,855,856,5,67,0,0,856,859,3,94,47,0, - 857,858,5,68,0,0,858,860,3,142,71,0,859,857,1,0,0,0,859,860,1,0, - 0,0,860,861,1,0,0,0,861,862,5,129,0,0,862,93,1,0,0,0,863,870,5,101, - 0,0,864,865,5,102,0,0,865,866,5,136,0,0,866,867,3,134,67,0,867,868, - 5,137,0,0,868,870,1,0,0,0,869,863,1,0,0,0,869,864,1,0,0,0,870,95, - 1,0,0,0,871,872,5,57,0,0,872,873,3,150,75,0,873,874,5,79,0,0,874, - 875,3,152,76,0,875,876,5,132,0,0,876,877,3,98,49,0,877,878,3,98, - 49,0,878,879,5,133,0,0,879,97,1,0,0,0,880,881,3,48,24,0,881,882, - 5,58,0,0,882,883,3,150,75,0,883,884,5,79,0,0,884,885,3,152,76,0, - 885,887,3,140,70,0,886,888,5,107,0,0,887,886,1,0,0,0,887,888,1,0, - 0,0,888,891,1,0,0,0,889,890,5,74,0,0,890,892,3,152,76,0,891,889, - 1,0,0,0,891,892,1,0,0,0,892,894,1,0,0,0,893,895,5,76,0,0,894,893, - 1,0,0,0,894,895,1,0,0,0,895,898,1,0,0,0,896,897,5,77,0,0,897,899, - 3,152,76,0,898,896,1,0,0,0,898,899,1,0,0,0,899,901,1,0,0,0,900,902, - 5,78,0,0,901,900,1,0,0,0,901,902,1,0,0,0,902,903,1,0,0,0,903,904, - 5,129,0,0,904,99,1,0,0,0,905,906,5,49,0,0,906,907,3,150,75,0,907, - 908,5,50,0,0,908,910,3,150,75,0,909,911,3,28,14,0,910,909,1,0,0, - 0,910,911,1,0,0,0,911,914,1,0,0,0,912,913,5,79,0,0,913,915,3,152, - 76,0,914,912,1,0,0,0,914,915,1,0,0,0,915,918,1,0,0,0,916,917,5,73, - 0,0,917,919,5,142,0,0,918,916,1,0,0,0,918,919,1,0,0,0,919,920,1, - 0,0,0,920,924,5,132,0,0,921,923,3,102,51,0,922,921,1,0,0,0,923,926, - 1,0,0,0,924,922,1,0,0,0,924,925,1,0,0,0,925,927,1,0,0,0,926,924, - 1,0,0,0,927,928,5,133,0,0,928,101,1,0,0,0,929,930,5,54,0,0,930,936, - 3,90,45,0,931,936,3,114,57,0,932,936,3,110,55,0,933,936,3,104,52, - 0,934,936,3,112,56,0,935,929,1,0,0,0,935,931,1,0,0,0,935,932,1,0, - 0,0,935,933,1,0,0,0,935,934,1,0,0,0,936,103,1,0,0,0,937,938,5,3, - 0,0,938,942,5,132,0,0,939,941,3,106,53,0,940,939,1,0,0,0,941,944, - 1,0,0,0,942,940,1,0,0,0,942,943,1,0,0,0,943,945,1,0,0,0,944,942, - 1,0,0,0,945,946,5,133,0,0,946,947,5,129,0,0,947,105,1,0,0,0,948, - 949,3,150,75,0,949,950,5,53,0,0,950,951,5,56,0,0,951,952,3,150,75, - 0,952,953,5,129,0,0,953,963,1,0,0,0,954,955,3,150,75,0,955,956,5, - 53,0,0,956,957,5,57,0,0,957,958,3,150,75,0,958,959,5,131,0,0,959, - 960,3,150,75,0,960,961,5,129,0,0,961,963,1,0,0,0,962,948,1,0,0,0, - 962,954,1,0,0,0,963,107,1,0,0,0,964,965,3,26,13,0,965,966,5,13,0, - 0,966,971,5,48,0,0,967,968,5,131,0,0,968,970,3,150,75,0,969,967, - 1,0,0,0,970,973,1,0,0,0,971,969,1,0,0,0,971,972,1,0,0,0,972,974, - 1,0,0,0,973,971,1,0,0,0,974,975,5,129,0,0,975,109,1,0,0,0,976,977, - 5,51,0,0,977,978,3,150,75,0,978,979,5,53,0,0,979,980,5,56,0,0,980, - 981,3,150,75,0,981,982,5,129,0,0,982,111,1,0,0,0,983,984,5,63,0, - 0,984,985,3,150,75,0,985,986,5,64,0,0,986,987,5,65,0,0,987,988,5, - 60,0,0,988,989,5,46,0,0,989,990,3,150,75,0,990,991,5,62,0,0,991, - 992,5,57,0,0,992,993,3,150,75,0,993,994,5,131,0,0,994,995,3,150, - 75,0,995,996,5,129,0,0,996,113,1,0,0,0,997,998,5,51,0,0,998,999, - 3,116,58,0,999,1000,5,53,0,0,1000,1003,3,120,60,0,1001,1002,5,29, - 0,0,1002,1004,3,152,76,0,1003,1001,1,0,0,0,1003,1004,1,0,0,0,1004, - 1005,1,0,0,0,1005,1006,5,129,0,0,1006,115,1,0,0,0,1007,1008,3,150, - 75,0,1008,1009,5,131,0,0,1009,1010,3,118,59,0,1010,117,1,0,0,0,1011, - 1024,3,150,75,0,1012,1024,5,96,0,0,1013,1024,5,86,0,0,1014,1024, - 5,87,0,0,1015,1024,5,1,0,0,1016,1024,5,93,0,0,1017,1024,5,94,0,0, - 1018,1024,5,95,0,0,1019,1024,5,97,0,0,1020,1024,5,98,0,0,1021,1024, - 5,99,0,0,1022,1024,5,100,0,0,1023,1011,1,0,0,0,1023,1012,1,0,0,0, - 1023,1013,1,0,0,0,1023,1014,1,0,0,0,1023,1015,1,0,0,0,1023,1016, - 1,0,0,0,1023,1017,1,0,0,0,1023,1018,1,0,0,0,1023,1019,1,0,0,0,1023, - 1020,1,0,0,0,1023,1021,1,0,0,0,1023,1022,1,0,0,0,1024,119,1,0,0, - 0,1025,1026,5,75,0,0,1026,1027,5,131,0,0,1027,1062,3,150,75,0,1028, - 1029,5,56,0,0,1029,1030,3,150,75,0,1030,1031,5,131,0,0,1031,1032, - 3,124,62,0,1032,1062,1,0,0,0,1033,1034,5,57,0,0,1034,1035,3,150, - 75,0,1035,1036,5,131,0,0,1036,1037,3,150,75,0,1037,1038,5,131,0, - 0,1038,1039,3,126,63,0,1039,1062,1,0,0,0,1040,1041,5,39,0,0,1041, - 1043,3,150,75,0,1042,1044,3,28,14,0,1043,1042,1,0,0,0,1043,1044, - 1,0,0,0,1044,1045,1,0,0,0,1045,1046,5,131,0,0,1046,1047,3,116,58, - 0,1047,1062,1,0,0,0,1048,1049,5,41,0,0,1049,1050,3,150,75,0,1050, - 1051,5,131,0,0,1051,1053,3,150,75,0,1052,1054,3,28,14,0,1053,1052, - 1,0,0,0,1053,1054,1,0,0,0,1054,1056,1,0,0,0,1055,1057,3,128,64,0, - 1056,1055,1,0,0,0,1056,1057,1,0,0,0,1057,1059,1,0,0,0,1058,1060, - 3,122,61,0,1059,1058,1,0,0,0,1059,1060,1,0,0,0,1060,1062,1,0,0,0, - 1061,1025,1,0,0,0,1061,1028,1,0,0,0,1061,1033,1,0,0,0,1061,1040, - 1,0,0,0,1061,1048,1,0,0,0,1062,121,1,0,0,0,1063,1064,5,61,0,0,1064, - 1065,3,128,64,0,1065,123,1,0,0,0,1066,1067,7,4,0,0,1067,125,1,0, - 0,0,1068,1069,7,5,0,0,1069,127,1,0,0,0,1070,1071,5,59,0,0,1071,1075, - 5,132,0,0,1072,1074,3,130,65,0,1073,1072,1,0,0,0,1074,1077,1,0,0, - 0,1075,1073,1,0,0,0,1075,1076,1,0,0,0,1076,1078,1,0,0,0,1077,1075, - 1,0,0,0,1078,1079,5,133,0,0,1079,129,1,0,0,0,1080,1081,3,150,75, - 0,1081,1082,5,53,0,0,1082,1083,5,4,0,0,1083,1084,5,18,0,0,1084,1085, - 5,134,0,0,1085,1086,3,78,39,0,1086,1087,5,135,0,0,1087,1088,5,129, - 0,0,1088,1179,1,0,0,0,1089,1090,3,150,75,0,1090,1091,5,53,0,0,1091, - 1092,5,56,0,0,1092,1099,3,150,75,0,1093,1094,5,62,0,0,1094,1095, - 5,57,0,0,1095,1096,3,150,75,0,1096,1097,5,131,0,0,1097,1098,3,150, - 75,0,1098,1100,1,0,0,0,1099,1093,1,0,0,0,1099,1100,1,0,0,0,1100, - 1101,1,0,0,0,1101,1102,5,129,0,0,1102,1179,1,0,0,0,1103,1104,3,150, - 75,0,1104,1105,5,53,0,0,1105,1106,5,57,0,0,1106,1107,3,150,75,0, - 1107,1108,5,131,0,0,1108,1115,3,150,75,0,1109,1110,5,62,0,0,1110, - 1111,5,57,0,0,1111,1112,3,150,75,0,1112,1113,5,131,0,0,1113,1114, - 3,150,75,0,1114,1116,1,0,0,0,1115,1109,1,0,0,0,1115,1116,1,0,0,0, - 1116,1117,1,0,0,0,1117,1118,5,129,0,0,1118,1179,1,0,0,0,1119,1120, - 3,150,75,0,1120,1121,5,53,0,0,1121,1122,5,39,0,0,1122,1124,3,150, - 75,0,1123,1125,3,28,14,0,1124,1123,1,0,0,0,1124,1125,1,0,0,0,1125, - 1134,1,0,0,0,1126,1127,5,62,0,0,1127,1128,5,57,0,0,1128,1129,3,150, - 75,0,1129,1130,5,131,0,0,1130,1131,3,150,75,0,1131,1135,1,0,0,0, - 1132,1133,5,13,0,0,1133,1135,5,48,0,0,1134,1126,1,0,0,0,1134,1132, - 1,0,0,0,1134,1135,1,0,0,0,1135,1136,1,0,0,0,1136,1137,5,129,0,0, - 1137,1179,1,0,0,0,1138,1139,3,150,75,0,1139,1140,5,53,0,0,1140,1141, - 5,2,0,0,1141,1142,3,150,75,0,1142,1143,5,59,0,0,1143,1147,5,132, - 0,0,1144,1146,3,108,54,0,1145,1144,1,0,0,0,1146,1149,1,0,0,0,1147, - 1145,1,0,0,0,1147,1148,1,0,0,0,1148,1150,1,0,0,0,1149,1147,1,0,0, - 0,1150,1151,5,133,0,0,1151,1152,5,129,0,0,1152,1179,1,0,0,0,1153, - 1154,3,150,75,0,1154,1155,5,53,0,0,1155,1156,5,46,0,0,1156,1157, - 3,150,75,0,1157,1158,5,129,0,0,1158,1179,1,0,0,0,1159,1160,3,150, - 75,0,1160,1162,5,53,0,0,1161,1163,5,4,0,0,1162,1161,1,0,0,0,1162, - 1163,1,0,0,0,1163,1164,1,0,0,0,1164,1165,5,17,0,0,1165,1166,3,150, - 75,0,1166,1167,5,131,0,0,1167,1174,3,150,75,0,1168,1169,5,62,0,0, - 1169,1170,5,57,0,0,1170,1171,3,150,75,0,1171,1172,5,131,0,0,1172, - 1173,3,150,75,0,1173,1175,1,0,0,0,1174,1168,1,0,0,0,1174,1175,1, - 0,0,0,1175,1176,1,0,0,0,1176,1177,5,129,0,0,1177,1179,1,0,0,0,1178, - 1080,1,0,0,0,1178,1089,1,0,0,0,1178,1103,1,0,0,0,1178,1119,1,0,0, - 0,1178,1138,1,0,0,0,1178,1153,1,0,0,0,1178,1159,1,0,0,0,1179,131, - 1,0,0,0,1180,1181,5,46,0,0,1181,1182,3,150,75,0,1182,1183,5,53,0, - 0,1183,1184,3,150,75,0,1184,1185,5,131,0,0,1185,1187,3,150,75,0, - 1186,1188,3,128,64,0,1187,1186,1,0,0,0,1187,1188,1,0,0,0,1188,1189, - 1,0,0,0,1189,1190,5,129,0,0,1190,133,1,0,0,0,1191,1238,3,138,69, - 0,1192,1238,5,108,0,0,1193,1238,5,109,0,0,1194,1195,5,110,0,0,1195, - 1238,3,152,76,0,1196,1197,5,111,0,0,1197,1198,5,138,0,0,1198,1199, - 3,150,75,0,1199,1200,5,139,0,0,1200,1238,1,0,0,0,1201,1202,5,112, - 0,0,1202,1203,5,138,0,0,1203,1205,3,150,75,0,1204,1206,3,28,14,0, - 1205,1204,1,0,0,0,1205,1206,1,0,0,0,1206,1207,1,0,0,0,1207,1208, - 5,139,0,0,1208,1238,1,0,0,0,1209,1210,5,34,0,0,1210,1211,5,138,0, - 0,1211,1212,3,150,75,0,1212,1213,5,139,0,0,1213,1238,1,0,0,0,1214, - 1215,5,113,0,0,1215,1216,5,138,0,0,1216,1217,3,134,67,0,1217,1218, - 5,139,0,0,1218,1238,1,0,0,0,1219,1220,5,114,0,0,1220,1221,5,138, - 0,0,1221,1222,3,134,67,0,1222,1223,5,139,0,0,1223,1238,1,0,0,0,1224, - 1225,5,115,0,0,1225,1229,5,132,0,0,1226,1228,3,136,68,0,1227,1226, - 1,0,0,0,1228,1231,1,0,0,0,1229,1227,1,0,0,0,1229,1230,1,0,0,0,1230, - 1232,1,0,0,0,1231,1229,1,0,0,0,1232,1238,5,133,0,0,1233,1235,3,150, - 75,0,1234,1236,3,28,14,0,1235,1234,1,0,0,0,1235,1236,1,0,0,0,1236, - 1238,1,0,0,0,1237,1191,1,0,0,0,1237,1192,1,0,0,0,1237,1193,1,0,0, - 0,1237,1194,1,0,0,0,1237,1196,1,0,0,0,1237,1201,1,0,0,0,1237,1209, - 1,0,0,0,1237,1214,1,0,0,0,1237,1219,1,0,0,0,1237,1224,1,0,0,0,1237, - 1233,1,0,0,0,1238,135,1,0,0,0,1239,1240,3,150,75,0,1240,1241,5,128, - 0,0,1241,1242,3,134,67,0,1242,1243,5,129,0,0,1243,137,1,0,0,0,1244, - 1245,7,6,0,0,1245,139,1,0,0,0,1246,1247,7,7,0,0,1247,141,1,0,0,0, - 1248,1257,3,152,76,0,1249,1257,5,142,0,0,1250,1257,5,143,0,0,1251, - 1257,5,124,0,0,1252,1257,5,125,0,0,1253,1257,5,126,0,0,1254,1257, - 3,144,72,0,1255,1257,3,148,74,0,1256,1248,1,0,0,0,1256,1249,1,0, - 0,0,1256,1250,1,0,0,0,1256,1251,1,0,0,0,1256,1252,1,0,0,0,1256,1253, - 1,0,0,0,1256,1254,1,0,0,0,1256,1255,1,0,0,0,1257,143,1,0,0,0,1258, - 1267,5,132,0,0,1259,1264,3,146,73,0,1260,1261,5,130,0,0,1261,1263, - 3,146,73,0,1262,1260,1,0,0,0,1263,1266,1,0,0,0,1264,1262,1,0,0,0, - 1264,1265,1,0,0,0,1265,1268,1,0,0,0,1266,1264,1,0,0,0,1267,1259, - 1,0,0,0,1267,1268,1,0,0,0,1268,1269,1,0,0,0,1269,1270,5,133,0,0, - 1270,145,1,0,0,0,1271,1272,3,152,76,0,1272,1273,5,128,0,0,1273,1274, - 3,142,71,0,1274,147,1,0,0,0,1275,1284,5,134,0,0,1276,1281,3,142, - 71,0,1277,1278,5,130,0,0,1278,1280,3,142,71,0,1279,1277,1,0,0,0, - 1280,1283,1,0,0,0,1281,1279,1,0,0,0,1281,1282,1,0,0,0,1282,1285, - 1,0,0,0,1283,1281,1,0,0,0,1284,1276,1,0,0,0,1284,1285,1,0,0,0,1285, - 1286,1,0,0,0,1286,1287,5,135,0,0,1287,149,1,0,0,0,1288,1289,7,8, - 0,0,1289,151,1,0,0,0,1290,1291,5,145,0,0,1291,153,1,0,0,0,115,166, - 173,194,206,218,238,246,253,259,271,274,280,291,300,310,313,315, - 319,327,339,344,353,356,371,377,389,398,406,414,427,430,440,444, - 450,457,463,471,479,492,499,503,508,519,525,535,540,546,557,584, - 611,616,627,630,635,638,645,654,657,660,677,686,700,721,724,727, - 734,742,782,785,789,811,825,833,845,859,869,887,891,894,898,901, - 910,914,918,924,935,942,962,971,1003,1023,1043,1053,1056,1059,1061, - 1075,1099,1115,1124,1134,1147,1162,1174,1178,1187,1205,1229,1235, - 1237,1256,1264,1267,1281,1284 + 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,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,171,8,0,1, + 1,1,1,1,1,5,1,176,8,1,10,1,12,1,179,9,1,1,1,1,1,1,2,1,2,1,2,1,2, + 1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,5,3,197,8,3,10,3,12,3,200, + 9,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,3,4,212,8,4,1,5,1,5, + 1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,3,5,224,8,5,1,6,1,6,1,6,1,6,1,6, + 1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,3,8,244,8,8, + 1,9,1,9,1,9,1,9,1,9,1,9,3,9,252,8,9,1,9,1,9,1,10,5,10,257,8,10,10, + 10,12,10,260,9,10,1,10,1,10,1,10,3,10,265,8,10,1,10,1,10,1,10,1, + 10,1,10,1,10,1,10,1,10,5,10,275,8,10,10,10,12,10,278,9,10,3,10,280, + 8,10,1,10,1,10,5,10,284,8,10,10,10,12,10,287,9,10,1,10,1,10,1,11, + 1,11,1,11,1,11,5,11,295,8,11,10,11,12,11,298,9,11,1,11,1,11,1,12, + 1,12,1,12,1,12,3,12,306,8,12,1,12,1,12,1,12,1,12,1,12,1,12,5,12, + 314,8,12,10,12,12,12,317,9,12,3,12,319,8,12,3,12,321,8,12,1,13,1, + 13,3,13,325,8,13,1,14,1,14,1,14,1,14,5,14,331,8,14,10,14,12,14,334, + 9,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,3,15,345,8,15, + 1,16,1,16,1,16,3,16,350,8,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17, + 3,17,359,8,17,1,18,3,18,362,8,18,1,18,1,18,1,18,1,18,1,18,1,18,1, + 18,1,18,1,18,1,18,1,18,1,18,1,18,3,18,377,8,18,1,18,1,18,1,18,1, + 19,3,19,383,8,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,5,19,393, + 8,19,10,19,12,19,396,9,19,1,19,1,19,1,20,1,20,1,20,1,20,3,20,404, + 8,20,1,20,1,20,1,20,1,20,1,20,1,20,3,20,412,8,20,1,20,1,20,1,20, + 1,20,1,20,1,20,3,20,420,8,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20, + 1,20,1,20,1,20,1,20,3,20,433,8,20,1,21,3,21,436,8,21,1,21,1,21,1, + 21,1,21,1,21,1,21,1,21,1,21,3,21,446,8,21,1,21,1,21,3,21,450,8,21, + 1,21,1,21,5,21,454,8,21,10,21,12,21,457,9,21,1,21,1,21,1,22,1,22, + 3,22,463,8,22,1,23,1,23,1,23,1,23,3,23,469,8,23,1,23,1,23,1,23,1, + 23,1,23,1,23,3,23,477,8,23,1,23,1,23,1,23,1,23,1,23,1,23,3,23,485, + 8,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,3,23, + 498,8,23,1,24,1,24,1,24,1,24,1,24,3,24,505,8,24,1,24,1,24,3,24,509, + 8,24,1,25,5,25,512,8,25,10,25,12,25,515,9,25,1,25,1,25,1,25,1,25, + 1,25,1,25,1,25,1,25,3,25,525,8,25,1,25,1,25,5,25,529,8,25,10,25, + 12,25,532,9,25,1,25,1,25,1,26,1,26,1,26,1,26,1,26,1,26,3,26,542, + 8,26,1,27,1,27,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,28,1,28,1,28,1,28,1,28,1,28,1,29,1,29,1,29, + 3,29,569,8,29,1,29,1,29,1,29,1,29,3,29,575,8,29,1,29,1,29,1,29,1, + 29,1,29,1,29,1,29,5,29,584,8,29,10,29,12,29,587,9,29,1,29,1,29,1, + 30,1,30,1,30,1,30,1,30,1,30,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,31,1,31,1,31,3,31,613,8,31,1,31,1, + 31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1, + 31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,3,31,640,8, + 31,1,32,1,32,1,32,3,32,645,8,32,1,32,1,32,1,32,1,32,1,32,1,32,1, + 32,1,32,1,32,3,32,656,8,32,1,32,3,32,659,8,32,1,32,1,32,1,32,3,32, + 664,8,32,1,32,3,32,667,8,32,1,32,1,32,1,33,1,33,1,33,3,33,674,8, + 33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,3,33,683,8,33,1,33,3,33,686, + 8,33,1,33,3,33,689,8,33,1,33,1,33,1,34,1,34,1,34,1,34,1,35,1,35, + 1,35,1,35,1,35,1,35,1,35,1,35,1,35,3,35,706,8,35,1,36,1,36,1,36, + 1,36,1,36,5,36,713,8,36,10,36,12,36,716,9,36,1,36,1,36,1,37,1,37, + 1,37,1,37,1,37,1,37,1,37,1,37,1,37,3,37,729,8,37,1,37,1,37,1,38, + 1,38,1,38,1,39,1,39,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40, + 1,40,5,40,748,8,40,10,40,12,40,751,9,40,3,40,753,8,40,1,40,3,40, + 756,8,40,1,41,1,41,1,41,5,41,761,8,41,10,41,12,41,764,9,41,1,42, + 1,42,1,42,5,42,769,8,42,10,42,12,42,772,9,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,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,1,43,1,43, + 1,43,1,43,1,43,1,43,1,43,1,43,1,43,3,43,811,8,43,1,43,3,43,814,8, + 43,1,43,1,43,3,43,818,8,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,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,3, + 43,840,8,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,854,8,43,1,44,1,44,1,44,1,44,5,44,860,8,44,10,44,12, + 44,863,9,44,1,44,1,44,1,45,1,45,1,46,1,46,1,46,1,47,1,47,3,47,874, + 8,47,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48, + 3,48,888,8,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,49,3,49,898,8, + 49,1,50,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,51,1,51,3,51,916,8,51,1,51,1,51,3,51,920,8,51,1,51,3,51, + 923,8,51,1,51,1,51,3,51,927,8,51,1,51,3,51,930,8,51,1,51,1,51,1, + 52,1,52,1,52,1,52,1,52,3,52,939,8,52,1,52,1,52,3,52,943,8,52,1,52, + 1,52,3,52,947,8,52,1,52,1,52,5,52,951,8,52,10,52,12,52,954,9,52, + 1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,53,3,53,964,8,53,1,54,1,54, + 1,54,5,54,969,8,54,10,54,12,54,972,9,54,1,54,1,54,1,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,1,55,1,55,3,55, + 991,8,55,1,56,1,56,1,56,1,56,1,56,5,56,998,8,56,10,56,12,56,1001, + 9,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,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,59,1,59, + 1,59,1,59,1,59,1,59,3,59,1032,8,59,1,59,1,59,1,60,1,60,1,60,1,60, + 1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,3,61, + 1052,8,61,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62, + 1,62,1,62,1,62,1,62,1,62,1,62,1,62,3,62,1072,8,62,1,62,1,62,1,62, + 1,62,1,62,1,62,1,62,1,62,3,62,1082,8,62,1,62,3,62,1085,8,62,1,62, + 3,62,1088,8,62,3,62,1090,8,62,1,63,1,63,1,63,1,64,1,64,1,65,1,65, + 1,66,1,66,1,66,5,66,1102,8,66,10,66,12,66,1105,9,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,67,1,67,1,67,1, + 67,1,67,1,67,1,67,1,67,1,67,3,67,1128,8,67,1,67,1,67,1,67,1,67,1, + 67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,3,67,1144,8,67,1, + 67,1,67,1,67,1,67,1,67,1,67,1,67,3,67,1153,8,67,1,67,1,67,1,67,1, + 67,1,67,1,67,1,67,1,67,3,67,1163,8,67,1,67,1,67,1,67,1,67,1,67,1, + 67,1,67,1,67,1,67,5,67,1174,8,67,10,67,12,67,1177,9,67,1,67,1,67, + 1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,3,67,1191,8,67, + 1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,3,67,1203,8,67, + 1,67,1,67,3,67,1207,8,67,1,68,1,68,1,68,1,68,1,68,1,68,1,68,3,68, + 1216,8,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,69,1,69,1,69,1,69,3,69,1234,8,69,1,69,1,69,1,69,1,69,1,69, + 1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69, + 1,69,1,69,5,69,1256,8,69,10,69,12,69,1259,9,69,1,69,1,69,1,69,3, + 69,1264,8,69,3,69,1266,8,69,1,70,1,70,1,70,1,70,1,70,1,71,1,71,1, + 72,1,72,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,3,73,1285,8,73,1, + 74,1,74,1,74,1,74,5,74,1291,8,74,10,74,12,74,1294,9,74,3,74,1296, + 8,74,1,74,1,74,1,75,1,75,1,75,1,75,1,76,1,76,1,76,1,76,5,76,1308, + 8,76,10,76,12,76,1311,9,76,3,76,1313,8,76,1,76,1,76,1,77,1,77,1, + 78,1,78,1,78,0,0,79,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,0,9,2,0,15,15,33,33,1,0,11,12,1,0,101,105,3, + 0,1,1,96,100,102,103,3,0,1,1,96,97,102,103,2,0,98,100,102,103,1, + 0,121,128,1,0,108,111,7,0,1,8,10,33,45,45,74,74,94,95,106,106,149, + 149,1428,0,170,1,0,0,0,2,172,1,0,0,0,4,182,1,0,0,0,6,186,1,0,0,0, + 8,211,1,0,0,0,10,223,1,0,0,0,12,225,1,0,0,0,14,232,1,0,0,0,16,243, + 1,0,0,0,18,245,1,0,0,0,20,258,1,0,0,0,22,290,1,0,0,0,24,320,1,0, + 0,0,26,322,1,0,0,0,28,326,1,0,0,0,30,344,1,0,0,0,32,346,1,0,0,0, + 34,358,1,0,0,0,36,361,1,0,0,0,38,382,1,0,0,0,40,432,1,0,0,0,42,435, + 1,0,0,0,44,460,1,0,0,0,46,497,1,0,0,0,48,508,1,0,0,0,50,513,1,0, + 0,0,52,541,1,0,0,0,54,543,1,0,0,0,56,553,1,0,0,0,58,565,1,0,0,0, + 60,590,1,0,0,0,62,639,1,0,0,0,64,641,1,0,0,0,66,670,1,0,0,0,68,692, + 1,0,0,0,70,705,1,0,0,0,72,707,1,0,0,0,74,719,1,0,0,0,76,732,1,0, + 0,0,78,735,1,0,0,0,80,755,1,0,0,0,82,757,1,0,0,0,84,765,1,0,0,0, + 86,853,1,0,0,0,88,855,1,0,0,0,90,866,1,0,0,0,92,868,1,0,0,0,94,873, + 1,0,0,0,96,875,1,0,0,0,98,897,1,0,0,0,100,899,1,0,0,0,102,908,1, + 0,0,0,104,933,1,0,0,0,106,963,1,0,0,0,108,965,1,0,0,0,110,990,1, + 0,0,0,112,992,1,0,0,0,114,1004,1,0,0,0,116,1011,1,0,0,0,118,1025, + 1,0,0,0,120,1035,1,0,0,0,122,1051,1,0,0,0,124,1089,1,0,0,0,126,1091, + 1,0,0,0,128,1094,1,0,0,0,130,1096,1,0,0,0,132,1098,1,0,0,0,134,1206, + 1,0,0,0,136,1208,1,0,0,0,138,1265,1,0,0,0,140,1267,1,0,0,0,142,1272, + 1,0,0,0,144,1274,1,0,0,0,146,1284,1,0,0,0,148,1286,1,0,0,0,150,1299, + 1,0,0,0,152,1303,1,0,0,0,154,1316,1,0,0,0,156,1318,1,0,0,0,158,159, + 3,6,3,0,159,160,5,0,0,1,160,171,1,0,0,0,161,162,3,20,10,0,162,163, + 5,0,0,1,163,171,1,0,0,0,164,165,3,50,25,0,165,166,5,0,0,1,166,171, + 1,0,0,0,167,168,3,2,1,0,168,169,5,0,0,1,169,171,1,0,0,0,170,158, + 1,0,0,0,170,161,1,0,0,0,170,164,1,0,0,0,170,167,1,0,0,0,171,1,1, + 0,0,0,172,173,5,40,0,0,173,177,5,137,0,0,174,176,3,8,4,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,138,0,0,181,3,1,0,0,0,182,183, + 5,41,0,0,183,184,3,156,78,0,184,185,5,134,0,0,185,5,1,0,0,0,186, + 187,5,9,0,0,187,188,3,154,77,0,188,189,5,84,0,0,189,190,3,156,78, + 0,190,191,5,77,0,0,191,192,3,156,78,0,192,193,5,76,0,0,193,194,3, + 156,78,0,194,198,5,137,0,0,195,197,3,8,4,0,196,195,1,0,0,0,197,200, + 1,0,0,0,198,196,1,0,0,0,198,199,1,0,0,0,199,201,1,0,0,0,200,198, + 1,0,0,0,201,202,5,138,0,0,202,7,1,0,0,0,203,212,3,4,2,0,204,212, + 3,18,9,0,205,212,3,10,5,0,206,212,3,92,46,0,207,212,3,104,52,0,208, + 212,3,136,68,0,209,212,3,56,28,0,210,212,3,32,16,0,211,203,1,0,0, + 0,211,204,1,0,0,0,211,205,1,0,0,0,211,206,1,0,0,0,211,207,1,0,0, + 0,211,208,1,0,0,0,211,209,1,0,0,0,211,210,1,0,0,0,212,9,1,0,0,0, + 213,214,5,41,0,0,214,215,5,44,0,0,215,216,3,154,77,0,216,217,5,134, + 0,0,217,224,1,0,0,0,218,219,5,41,0,0,219,220,5,46,0,0,220,221,3, + 154,77,0,221,222,5,134,0,0,222,224,1,0,0,0,223,213,1,0,0,0,223,218, + 1,0,0,0,224,11,1,0,0,0,225,226,5,42,0,0,226,227,5,43,0,0,227,228, + 3,154,77,0,228,229,5,84,0,0,229,230,3,156,78,0,230,231,5,134,0,0, + 231,13,1,0,0,0,232,233,5,42,0,0,233,234,5,44,0,0,234,235,3,154,77, + 0,235,236,5,77,0,0,236,237,3,156,78,0,237,238,5,134,0,0,238,15,1, + 0,0,0,239,244,3,10,5,0,240,244,3,12,6,0,241,244,3,14,7,0,242,244, + 3,32,16,0,243,239,1,0,0,0,243,240,1,0,0,0,243,241,1,0,0,0,243,242, + 1,0,0,0,244,17,1,0,0,0,245,246,5,43,0,0,246,247,3,154,77,0,247,248, + 5,84,0,0,248,251,3,156,78,0,249,250,5,85,0,0,250,252,3,156,78,0, + 251,249,1,0,0,0,251,252,1,0,0,0,252,253,1,0,0,0,253,254,5,134,0, + 0,254,19,1,0,0,0,255,257,3,16,8,0,256,255,1,0,0,0,257,260,1,0,0, + 0,258,256,1,0,0,0,258,259,1,0,0,0,259,261,1,0,0,0,260,258,1,0,0, + 0,261,262,5,44,0,0,262,264,3,154,77,0,263,265,3,22,11,0,264,263, + 1,0,0,0,264,265,1,0,0,0,265,266,1,0,0,0,266,267,5,84,0,0,267,268, + 3,156,78,0,268,269,5,77,0,0,269,279,3,156,78,0,270,271,5,89,0,0, + 271,276,3,26,13,0,272,273,5,135,0,0,273,275,3,26,13,0,274,272,1, + 0,0,0,275,278,1,0,0,0,276,274,1,0,0,0,276,277,1,0,0,0,277,280,1, + 0,0,0,278,276,1,0,0,0,279,270,1,0,0,0,279,280,1,0,0,0,280,281,1, + 0,0,0,281,285,5,137,0,0,282,284,3,34,17,0,283,282,1,0,0,0,284,287, + 1,0,0,0,285,283,1,0,0,0,285,286,1,0,0,0,286,288,1,0,0,0,287,285, + 1,0,0,0,288,289,5,138,0,0,289,21,1,0,0,0,290,291,5,143,0,0,291,296, + 3,24,12,0,292,293,5,135,0,0,293,295,3,24,12,0,294,292,1,0,0,0,295, + 298,1,0,0,0,296,294,1,0,0,0,296,297,1,0,0,0,297,299,1,0,0,0,298, + 296,1,0,0,0,299,300,5,144,0,0,300,23,1,0,0,0,301,302,5,47,0,0,302, + 305,3,154,77,0,303,304,5,133,0,0,304,306,5,37,0,0,305,303,1,0,0, + 0,305,306,1,0,0,0,306,321,1,0,0,0,307,308,5,36,0,0,308,318,3,154, + 77,0,309,310,5,38,0,0,310,315,3,26,13,0,311,312,5,145,0,0,312,314, + 3,26,13,0,313,311,1,0,0,0,314,317,1,0,0,0,315,313,1,0,0,0,315,316, + 1,0,0,0,316,319,1,0,0,0,317,315,1,0,0,0,318,309,1,0,0,0,318,319, + 1,0,0,0,319,321,1,0,0,0,320,301,1,0,0,0,320,307,1,0,0,0,321,25,1, + 0,0,0,322,324,3,154,77,0,323,325,3,28,14,0,324,323,1,0,0,0,324,325, + 1,0,0,0,325,27,1,0,0,0,326,327,5,143,0,0,327,332,3,30,15,0,328,329, + 5,135,0,0,329,331,3,30,15,0,330,328,1,0,0,0,331,334,1,0,0,0,332, + 330,1,0,0,0,332,333,1,0,0,0,333,335,1,0,0,0,334,332,1,0,0,0,335, + 336,5,144,0,0,336,29,1,0,0,0,337,338,5,43,0,0,338,345,3,154,77,0, + 339,340,5,44,0,0,340,345,3,26,13,0,341,342,5,36,0,0,342,345,3,154, + 77,0,343,345,3,138,69,0,344,337,1,0,0,0,344,339,1,0,0,0,344,341, + 1,0,0,0,344,343,1,0,0,0,345,31,1,0,0,0,346,347,5,35,0,0,347,349, + 3,154,77,0,348,350,3,22,11,0,349,348,1,0,0,0,349,350,1,0,0,0,350, + 351,1,0,0,0,351,352,5,146,0,0,352,353,3,138,69,0,353,354,5,134,0, + 0,354,33,1,0,0,0,355,359,3,38,19,0,356,359,3,42,21,0,357,359,3,36, + 18,0,358,355,1,0,0,0,358,356,1,0,0,0,358,357,1,0,0,0,359,35,1,0, + 0,0,360,362,5,57,0,0,361,360,1,0,0,0,361,362,1,0,0,0,362,363,1,0, + 0,0,363,364,5,49,0,0,364,365,3,154,77,0,365,366,5,84,0,0,366,367, + 3,156,78,0,367,368,5,133,0,0,368,369,3,138,69,0,369,370,5,132,0, + 0,370,371,3,138,69,0,371,372,5,137,0,0,372,373,5,101,0,0,373,374, + 5,84,0,0,374,376,3,156,78,0,375,377,3,70,35,0,376,375,1,0,0,0,376, + 377,1,0,0,0,377,378,1,0,0,0,378,379,5,134,0,0,379,380,5,138,0,0, + 380,37,1,0,0,0,381,383,3,44,22,0,382,381,1,0,0,0,382,383,1,0,0,0, + 383,384,1,0,0,0,384,385,5,47,0,0,385,386,3,154,77,0,386,387,5,84, + 0,0,387,388,3,156,78,0,388,389,5,133,0,0,389,390,3,138,69,0,390, + 394,5,137,0,0,391,393,3,40,20,0,392,391,1,0,0,0,393,396,1,0,0,0, + 394,392,1,0,0,0,394,395,1,0,0,0,395,397,1,0,0,0,396,394,1,0,0,0, + 397,398,5,138,0,0,398,39,1,0,0,0,399,400,5,91,0,0,400,401,5,84,0, + 0,401,403,3,156,78,0,402,404,3,70,35,0,403,402,1,0,0,0,403,404,1, + 0,0,0,404,405,1,0,0,0,405,406,5,134,0,0,406,433,1,0,0,0,407,408, + 5,92,0,0,408,409,5,84,0,0,409,411,3,156,78,0,410,412,3,70,35,0,411, + 410,1,0,0,0,411,412,1,0,0,0,412,413,1,0,0,0,413,414,5,134,0,0,414, + 433,1,0,0,0,415,416,5,1,0,0,416,417,5,84,0,0,417,419,3,156,78,0, + 418,420,3,70,35,0,419,418,1,0,0,0,419,420,1,0,0,0,420,421,1,0,0, + 0,421,422,5,134,0,0,422,433,1,0,0,0,423,424,5,93,0,0,424,425,5,94, + 0,0,425,426,5,84,0,0,426,427,3,156,78,0,427,428,5,95,0,0,428,429, + 5,84,0,0,429,430,3,156,78,0,430,431,5,134,0,0,431,433,1,0,0,0,432, + 399,1,0,0,0,432,407,1,0,0,0,432,415,1,0,0,0,432,423,1,0,0,0,433, + 41,1,0,0,0,434,436,3,44,22,0,435,434,1,0,0,0,435,436,1,0,0,0,436, + 437,1,0,0,0,437,438,5,48,0,0,438,439,3,154,77,0,439,440,5,84,0,0, + 440,441,3,156,78,0,441,442,5,133,0,0,442,443,3,144,72,0,443,445, + 3,48,24,0,444,446,5,112,0,0,445,444,1,0,0,0,445,446,1,0,0,0,446, + 449,1,0,0,0,447,448,5,82,0,0,448,450,3,156,78,0,449,447,1,0,0,0, + 449,450,1,0,0,0,450,451,1,0,0,0,451,455,5,137,0,0,452,454,3,46,23, + 0,453,452,1,0,0,0,454,457,1,0,0,0,455,453,1,0,0,0,455,456,1,0,0, + 0,456,458,1,0,0,0,457,455,1,0,0,0,458,459,5,138,0,0,459,43,1,0,0, + 0,460,462,5,32,0,0,461,463,7,0,0,0,462,461,1,0,0,0,462,463,1,0,0, + 0,463,45,1,0,0,0,464,465,5,98,0,0,465,466,5,84,0,0,466,468,3,156, + 78,0,467,469,3,70,35,0,468,467,1,0,0,0,468,469,1,0,0,0,469,470,1, + 0,0,0,470,471,5,134,0,0,471,498,1,0,0,0,472,473,5,99,0,0,473,474, + 5,84,0,0,474,476,3,156,78,0,475,477,3,70,35,0,476,475,1,0,0,0,476, + 477,1,0,0,0,477,478,1,0,0,0,478,479,5,134,0,0,479,498,1,0,0,0,480, + 481,5,100,0,0,481,482,5,84,0,0,482,484,3,156,78,0,483,485,3,70,35, + 0,484,483,1,0,0,0,484,485,1,0,0,0,485,486,1,0,0,0,486,487,5,134, + 0,0,487,498,1,0,0,0,488,489,5,93,0,0,489,490,5,94,0,0,490,491,5, + 84,0,0,491,492,3,156,78,0,492,493,5,95,0,0,493,494,5,84,0,0,494, + 495,3,156,78,0,495,496,5,134,0,0,496,498,1,0,0,0,497,464,1,0,0,0, + 497,472,1,0,0,0,497,480,1,0,0,0,497,488,1,0,0,0,498,47,1,0,0,0,499, + 500,5,43,0,0,500,509,3,154,77,0,501,502,5,44,0,0,502,504,3,154,77, + 0,503,505,3,28,14,0,504,503,1,0,0,0,504,505,1,0,0,0,505,509,1,0, + 0,0,506,507,5,36,0,0,507,509,3,154,77,0,508,499,1,0,0,0,508,501, + 1,0,0,0,508,506,1,0,0,0,509,49,1,0,0,0,510,512,3,16,8,0,511,510, + 1,0,0,0,512,515,1,0,0,0,513,511,1,0,0,0,513,514,1,0,0,0,514,516, + 1,0,0,0,515,513,1,0,0,0,516,517,5,46,0,0,517,518,3,154,77,0,518, + 519,5,84,0,0,519,520,3,156,78,0,520,521,5,77,0,0,521,524,3,156,78, + 0,522,523,5,78,0,0,523,525,5,147,0,0,524,522,1,0,0,0,524,525,1,0, + 0,0,525,526,1,0,0,0,526,530,5,137,0,0,527,529,3,52,26,0,528,527, + 1,0,0,0,529,532,1,0,0,0,530,528,1,0,0,0,530,531,1,0,0,0,531,533, + 1,0,0,0,532,530,1,0,0,0,533,534,5,138,0,0,534,51,1,0,0,0,535,542, + 3,64,32,0,536,542,3,66,33,0,537,542,3,74,37,0,538,542,3,58,29,0, + 539,542,3,60,30,0,540,542,3,54,27,0,541,535,1,0,0,0,541,536,1,0, + 0,0,541,537,1,0,0,0,541,538,1,0,0,0,541,539,1,0,0,0,541,540,1,0, + 0,0,542,53,1,0,0,0,543,544,5,2,0,0,544,545,3,154,77,0,545,546,5, + 84,0,0,546,547,3,156,78,0,547,548,5,4,0,0,548,549,3,26,13,0,549, + 550,5,5,0,0,550,551,3,154,77,0,551,552,5,134,0,0,552,55,1,0,0,0, + 553,554,5,3,0,0,554,555,3,154,77,0,555,556,5,84,0,0,556,557,3,156, + 78,0,557,558,5,6,0,0,558,559,3,26,13,0,559,560,5,65,0,0,560,561, + 3,154,77,0,561,562,5,136,0,0,562,563,3,154,77,0,563,564,5,134,0, + 0,564,57,1,0,0,0,565,566,5,22,0,0,566,568,3,154,77,0,567,569,3,22, + 11,0,568,567,1,0,0,0,568,569,1,0,0,0,569,570,1,0,0,0,570,571,5,84, + 0,0,571,572,3,156,78,0,572,574,5,25,0,0,573,575,5,9,0,0,574,573, + 1,0,0,0,574,575,1,0,0,0,575,576,1,0,0,0,576,577,3,26,13,0,577,578, + 5,26,0,0,578,579,3,156,78,0,579,580,5,49,0,0,580,581,3,156,78,0, + 581,585,5,137,0,0,582,584,3,62,31,0,583,582,1,0,0,0,584,587,1,0, + 0,0,585,583,1,0,0,0,585,586,1,0,0,0,586,588,1,0,0,0,587,585,1,0, + 0,0,588,589,5,138,0,0,589,59,1,0,0,0,590,591,5,22,0,0,591,592,3, + 154,77,0,592,593,5,84,0,0,593,594,3,156,78,0,594,595,5,24,0,0,595, + 596,3,154,77,0,596,597,3,28,14,0,597,598,5,134,0,0,598,61,1,0,0, + 0,599,600,5,16,0,0,600,640,5,134,0,0,601,602,5,17,0,0,602,603,5, + 18,0,0,603,604,3,154,77,0,604,605,5,134,0,0,605,640,1,0,0,0,606, + 607,5,27,0,0,607,608,3,156,78,0,608,609,5,134,0,0,609,640,1,0,0, + 0,610,612,5,28,0,0,611,613,5,36,0,0,612,611,1,0,0,0,612,613,1,0, + 0,0,613,614,1,0,0,0,614,615,3,154,77,0,615,616,5,55,0,0,616,617, + 3,26,13,0,617,618,5,134,0,0,618,640,1,0,0,0,619,620,5,29,0,0,620, + 621,3,154,77,0,621,622,5,147,0,0,622,623,5,134,0,0,623,640,1,0,0, + 0,624,625,5,30,0,0,625,626,3,26,13,0,626,627,5,136,0,0,627,628,3, + 154,77,0,628,629,3,154,77,0,629,630,3,156,78,0,630,631,5,134,0,0, + 631,640,1,0,0,0,632,633,5,93,0,0,633,640,5,134,0,0,634,635,5,31, + 0,0,635,636,5,147,0,0,636,637,3,156,78,0,637,638,5,134,0,0,638,640, + 1,0,0,0,639,599,1,0,0,0,639,601,1,0,0,0,639,606,1,0,0,0,639,610, + 1,0,0,0,639,619,1,0,0,0,639,624,1,0,0,0,639,632,1,0,0,0,639,634, + 1,0,0,0,640,63,1,0,0,0,641,642,5,49,0,0,642,644,3,154,77,0,643,645, + 3,22,11,0,644,643,1,0,0,0,644,645,1,0,0,0,645,646,1,0,0,0,646,647, + 5,84,0,0,647,648,3,156,78,0,648,649,5,133,0,0,649,650,3,138,69,0, + 650,651,5,132,0,0,651,652,3,138,69,0,652,653,5,86,0,0,653,655,3, + 78,39,0,654,656,3,70,35,0,655,654,1,0,0,0,655,656,1,0,0,0,656,658, + 1,0,0,0,657,659,3,76,38,0,658,657,1,0,0,0,658,659,1,0,0,0,659,660, + 1,0,0,0,660,661,5,88,0,0,661,663,3,80,40,0,662,664,3,84,42,0,663, + 662,1,0,0,0,663,664,1,0,0,0,664,666,1,0,0,0,665,667,3,68,34,0,666, + 665,1,0,0,0,666,667,1,0,0,0,667,668,1,0,0,0,668,669,5,134,0,0,669, + 65,1,0,0,0,670,671,5,50,0,0,671,673,3,154,77,0,672,674,3,22,11,0, + 673,672,1,0,0,0,673,674,1,0,0,0,674,675,1,0,0,0,675,676,5,84,0,0, + 676,677,3,156,78,0,677,678,5,133,0,0,678,679,3,138,69,0,679,680, + 5,132,0,0,680,682,3,138,69,0,681,683,3,70,35,0,682,681,1,0,0,0,682, + 683,1,0,0,0,683,685,1,0,0,0,684,686,3,84,42,0,685,684,1,0,0,0,685, + 686,1,0,0,0,686,688,1,0,0,0,687,689,3,68,34,0,688,687,1,0,0,0,688, + 689,1,0,0,0,689,690,1,0,0,0,690,691,5,134,0,0,691,67,1,0,0,0,692, + 693,5,66,0,0,693,694,5,65,0,0,694,695,3,154,77,0,695,69,1,0,0,0, + 696,697,5,10,0,0,697,706,5,13,0,0,698,699,5,10,0,0,699,700,7,1,0, + 0,700,701,5,14,0,0,701,702,5,139,0,0,702,703,3,82,41,0,703,704,5, + 140,0,0,704,706,1,0,0,0,705,696,1,0,0,0,705,698,1,0,0,0,706,71,1, + 0,0,0,707,708,5,65,0,0,708,709,5,139,0,0,709,714,3,120,60,0,710, + 711,5,135,0,0,711,713,3,120,60,0,712,710,1,0,0,0,713,716,1,0,0,0, + 714,712,1,0,0,0,714,715,1,0,0,0,715,717,1,0,0,0,716,714,1,0,0,0, + 717,718,5,140,0,0,718,73,1,0,0,0,719,720,5,51,0,0,720,721,3,154, + 77,0,721,722,5,84,0,0,722,723,3,156,78,0,723,724,5,52,0,0,724,725, + 3,154,77,0,725,726,5,133,0,0,726,728,3,138,69,0,727,729,3,84,42, + 0,728,727,1,0,0,0,728,729,1,0,0,0,729,730,1,0,0,0,730,731,5,134, + 0,0,731,75,1,0,0,0,732,733,5,87,0,0,733,734,3,138,69,0,734,77,1, + 0,0,0,735,736,7,2,0,0,736,79,1,0,0,0,737,756,5,90,0,0,738,739,5, + 43,0,0,739,756,3,154,77,0,740,741,5,36,0,0,741,756,3,154,77,0,742, + 743,5,45,0,0,743,752,5,139,0,0,744,749,3,26,13,0,745,746,5,135,0, + 0,746,748,3,26,13,0,747,745,1,0,0,0,748,751,1,0,0,0,749,747,1,0, + 0,0,749,750,1,0,0,0,750,753,1,0,0,0,751,749,1,0,0,0,752,744,1,0, + 0,0,752,753,1,0,0,0,753,754,1,0,0,0,754,756,5,140,0,0,755,737,1, + 0,0,0,755,738,1,0,0,0,755,740,1,0,0,0,755,742,1,0,0,0,756,81,1,0, + 0,0,757,762,3,154,77,0,758,759,5,135,0,0,759,761,3,154,77,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, + 83,1,0,0,0,764,762,1,0,0,0,765,766,5,89,0,0,766,770,5,137,0,0,767, + 769,3,86,43,0,768,767,1,0,0,0,769,772,1,0,0,0,770,768,1,0,0,0,770, + 771,1,0,0,0,771,773,1,0,0,0,772,770,1,0,0,0,773,774,5,138,0,0,774, + 85,1,0,0,0,775,776,5,23,0,0,776,777,3,154,77,0,777,778,5,84,0,0, + 778,779,3,156,78,0,779,780,5,139,0,0,780,781,3,82,41,0,781,782,5, + 140,0,0,782,783,5,134,0,0,783,854,1,0,0,0,784,785,5,61,0,0,785,786, + 3,154,77,0,786,787,5,84,0,0,787,788,3,156,78,0,788,789,5,133,0,0, + 789,790,3,138,69,0,790,791,3,88,44,0,791,792,5,134,0,0,792,854,1, + 0,0,0,793,794,5,62,0,0,794,795,3,154,77,0,795,796,5,84,0,0,796,797, + 3,156,78,0,797,798,5,133,0,0,798,799,3,144,72,0,799,800,3,48,24, + 0,800,801,3,88,44,0,801,802,5,134,0,0,802,854,1,0,0,0,803,804,5, + 44,0,0,804,805,3,154,77,0,805,806,5,84,0,0,806,807,3,156,78,0,807, + 808,5,133,0,0,808,810,3,154,77,0,809,811,3,28,14,0,810,809,1,0,0, + 0,810,811,1,0,0,0,811,813,1,0,0,0,812,814,3,72,36,0,813,812,1,0, + 0,0,813,814,1,0,0,0,814,817,1,0,0,0,815,816,5,18,0,0,816,818,5,53, + 0,0,817,815,1,0,0,0,817,818,1,0,0,0,818,819,1,0,0,0,819,820,5,134, + 0,0,820,854,1,0,0,0,821,822,5,7,0,0,822,823,3,154,77,0,823,824,5, + 84,0,0,824,825,3,156,78,0,825,826,5,133,0,0,826,827,3,154,77,0,827, + 828,5,53,0,0,828,829,3,138,69,0,829,830,5,134,0,0,830,854,1,0,0, + 0,831,832,5,51,0,0,832,833,3,154,77,0,833,834,5,84,0,0,834,835,3, + 156,78,0,835,836,5,133,0,0,836,839,3,154,77,0,837,838,5,53,0,0,838, + 840,3,138,69,0,839,837,1,0,0,0,839,840,1,0,0,0,840,841,1,0,0,0,841, + 842,5,134,0,0,842,854,1,0,0,0,843,844,5,22,0,0,844,845,3,154,77, + 0,845,846,5,84,0,0,846,847,3,156,78,0,847,848,5,133,0,0,848,849, + 3,154,77,0,849,850,5,136,0,0,850,851,3,154,77,0,851,852,5,134,0, + 0,852,854,1,0,0,0,853,775,1,0,0,0,853,784,1,0,0,0,853,793,1,0,0, + 0,853,803,1,0,0,0,853,821,1,0,0,0,853,831,1,0,0,0,853,843,1,0,0, + 0,854,87,1,0,0,0,855,856,5,139,0,0,856,861,3,90,45,0,857,858,5,135, + 0,0,858,860,3,90,45,0,859,857,1,0,0,0,860,863,1,0,0,0,861,859,1, + 0,0,0,861,862,1,0,0,0,862,864,1,0,0,0,863,861,1,0,0,0,864,865,5, + 140,0,0,865,89,1,0,0,0,866,867,7,3,0,0,867,91,1,0,0,0,868,869,5, + 60,0,0,869,870,3,94,47,0,870,93,1,0,0,0,871,874,3,96,48,0,872,874, + 3,100,50,0,873,871,1,0,0,0,873,872,1,0,0,0,874,95,1,0,0,0,875,876, + 5,61,0,0,876,877,3,154,77,0,877,878,5,84,0,0,878,879,3,156,78,0, + 879,880,5,71,0,0,880,881,3,154,77,0,881,882,5,133,0,0,882,883,3, + 138,69,0,883,884,5,72,0,0,884,887,3,98,49,0,885,886,5,73,0,0,886, + 888,3,146,73,0,887,885,1,0,0,0,887,888,1,0,0,0,888,889,1,0,0,0,889, + 890,5,134,0,0,890,97,1,0,0,0,891,898,5,106,0,0,892,893,5,107,0,0, + 893,894,5,141,0,0,894,895,3,138,69,0,895,896,5,142,0,0,896,898,1, + 0,0,0,897,891,1,0,0,0,897,892,1,0,0,0,898,99,1,0,0,0,899,900,5,62, + 0,0,900,901,3,154,77,0,901,902,5,84,0,0,902,903,3,156,78,0,903,904, + 5,137,0,0,904,905,3,102,51,0,905,906,3,102,51,0,906,907,5,138,0, + 0,907,101,1,0,0,0,908,909,3,48,24,0,909,910,5,63,0,0,910,911,3,154, + 77,0,911,912,5,84,0,0,912,913,3,156,78,0,913,915,3,144,72,0,914, + 916,5,112,0,0,915,914,1,0,0,0,915,916,1,0,0,0,916,919,1,0,0,0,917, + 918,5,79,0,0,918,920,3,156,78,0,919,917,1,0,0,0,919,920,1,0,0,0, + 920,922,1,0,0,0,921,923,5,81,0,0,922,921,1,0,0,0,922,923,1,0,0,0, + 923,926,1,0,0,0,924,925,5,82,0,0,925,927,3,156,78,0,926,924,1,0, + 0,0,926,927,1,0,0,0,927,929,1,0,0,0,928,930,5,83,0,0,929,928,1,0, + 0,0,929,930,1,0,0,0,930,931,1,0,0,0,931,932,5,134,0,0,932,103,1, + 0,0,0,933,934,5,54,0,0,934,935,3,154,77,0,935,936,5,55,0,0,936,938, + 3,154,77,0,937,939,3,28,14,0,938,937,1,0,0,0,938,939,1,0,0,0,939, + 942,1,0,0,0,940,941,5,84,0,0,941,943,3,156,78,0,942,940,1,0,0,0, + 942,943,1,0,0,0,943,946,1,0,0,0,944,945,5,78,0,0,945,947,5,147,0, + 0,946,944,1,0,0,0,946,947,1,0,0,0,947,948,1,0,0,0,948,952,5,137, + 0,0,949,951,3,106,53,0,950,949,1,0,0,0,951,954,1,0,0,0,952,950,1, + 0,0,0,952,953,1,0,0,0,953,955,1,0,0,0,954,952,1,0,0,0,955,956,5, + 138,0,0,956,105,1,0,0,0,957,958,5,59,0,0,958,964,3,94,47,0,959,964, + 3,118,59,0,960,964,3,114,57,0,961,964,3,108,54,0,962,964,3,116,58, + 0,963,957,1,0,0,0,963,959,1,0,0,0,963,960,1,0,0,0,963,961,1,0,0, + 0,963,962,1,0,0,0,964,107,1,0,0,0,965,966,5,8,0,0,966,970,5,137, + 0,0,967,969,3,110,55,0,968,967,1,0,0,0,969,972,1,0,0,0,970,968,1, + 0,0,0,970,971,1,0,0,0,971,973,1,0,0,0,972,970,1,0,0,0,973,974,5, + 138,0,0,974,975,5,134,0,0,975,109,1,0,0,0,976,977,3,154,77,0,977, + 978,5,58,0,0,978,979,5,61,0,0,979,980,3,154,77,0,980,981,5,134,0, + 0,981,991,1,0,0,0,982,983,3,154,77,0,983,984,5,58,0,0,984,985,5, + 62,0,0,985,986,3,154,77,0,986,987,5,136,0,0,987,988,3,154,77,0,988, + 989,5,134,0,0,989,991,1,0,0,0,990,976,1,0,0,0,990,982,1,0,0,0,991, + 111,1,0,0,0,992,993,3,26,13,0,993,994,5,18,0,0,994,999,5,53,0,0, + 995,996,5,136,0,0,996,998,3,154,77,0,997,995,1,0,0,0,998,1001,1, + 0,0,0,999,997,1,0,0,0,999,1000,1,0,0,0,1000,1002,1,0,0,0,1001,999, + 1,0,0,0,1002,1003,5,134,0,0,1003,113,1,0,0,0,1004,1005,5,56,0,0, + 1005,1006,3,154,77,0,1006,1007,5,58,0,0,1007,1008,5,61,0,0,1008, + 1009,3,154,77,0,1009,1010,5,134,0,0,1010,115,1,0,0,0,1011,1012,5, + 68,0,0,1012,1013,3,154,77,0,1013,1014,5,69,0,0,1014,1015,5,70,0, + 0,1015,1016,5,65,0,0,1016,1017,5,51,0,0,1017,1018,3,154,77,0,1018, + 1019,5,67,0,0,1019,1020,5,62,0,0,1020,1021,3,154,77,0,1021,1022, + 5,136,0,0,1022,1023,3,154,77,0,1023,1024,5,134,0,0,1024,117,1,0, + 0,0,1025,1026,5,56,0,0,1026,1027,3,120,60,0,1027,1028,5,58,0,0,1028, + 1031,3,124,62,0,1029,1030,5,34,0,0,1030,1032,3,156,78,0,1031,1029, + 1,0,0,0,1031,1032,1,0,0,0,1032,1033,1,0,0,0,1033,1034,5,134,0,0, + 1034,119,1,0,0,0,1035,1036,3,154,77,0,1036,1037,5,136,0,0,1037,1038, + 3,122,61,0,1038,121,1,0,0,0,1039,1052,3,154,77,0,1040,1052,5,101, + 0,0,1041,1052,5,91,0,0,1042,1052,5,92,0,0,1043,1052,5,1,0,0,1044, + 1052,5,98,0,0,1045,1052,5,99,0,0,1046,1052,5,100,0,0,1047,1052,5, + 102,0,0,1048,1052,5,103,0,0,1049,1052,5,104,0,0,1050,1052,5,105, + 0,0,1051,1039,1,0,0,0,1051,1040,1,0,0,0,1051,1041,1,0,0,0,1051,1042, + 1,0,0,0,1051,1043,1,0,0,0,1051,1044,1,0,0,0,1051,1045,1,0,0,0,1051, + 1046,1,0,0,0,1051,1047,1,0,0,0,1051,1048,1,0,0,0,1051,1049,1,0,0, + 0,1051,1050,1,0,0,0,1052,123,1,0,0,0,1053,1054,5,80,0,0,1054,1055, + 5,136,0,0,1055,1090,3,154,77,0,1056,1057,5,61,0,0,1057,1058,3,154, + 77,0,1058,1059,5,136,0,0,1059,1060,3,128,64,0,1060,1090,1,0,0,0, + 1061,1062,5,62,0,0,1062,1063,3,154,77,0,1063,1064,5,136,0,0,1064, + 1065,3,154,77,0,1065,1066,5,136,0,0,1066,1067,3,130,65,0,1067,1090, + 1,0,0,0,1068,1069,5,44,0,0,1069,1071,3,154,77,0,1070,1072,3,28,14, + 0,1071,1070,1,0,0,0,1071,1072,1,0,0,0,1072,1073,1,0,0,0,1073,1074, + 5,136,0,0,1074,1075,3,120,60,0,1075,1090,1,0,0,0,1076,1077,5,46, + 0,0,1077,1078,3,154,77,0,1078,1079,5,136,0,0,1079,1081,3,154,77, + 0,1080,1082,3,28,14,0,1081,1080,1,0,0,0,1081,1082,1,0,0,0,1082,1084, + 1,0,0,0,1083,1085,3,132,66,0,1084,1083,1,0,0,0,1084,1085,1,0,0,0, + 1085,1087,1,0,0,0,1086,1088,3,126,63,0,1087,1086,1,0,0,0,1087,1088, + 1,0,0,0,1088,1090,1,0,0,0,1089,1053,1,0,0,0,1089,1056,1,0,0,0,1089, + 1061,1,0,0,0,1089,1068,1,0,0,0,1089,1076,1,0,0,0,1090,125,1,0,0, + 0,1091,1092,5,66,0,0,1092,1093,3,132,66,0,1093,127,1,0,0,0,1094, + 1095,7,4,0,0,1095,129,1,0,0,0,1096,1097,7,5,0,0,1097,131,1,0,0,0, + 1098,1099,5,64,0,0,1099,1103,5,137,0,0,1100,1102,3,134,67,0,1101, + 1100,1,0,0,0,1102,1105,1,0,0,0,1103,1101,1,0,0,0,1103,1104,1,0,0, + 0,1104,1106,1,0,0,0,1105,1103,1,0,0,0,1106,1107,5,138,0,0,1107,133, + 1,0,0,0,1108,1109,3,154,77,0,1109,1110,5,58,0,0,1110,1111,5,9,0, + 0,1111,1112,5,23,0,0,1112,1113,5,139,0,0,1113,1114,3,82,41,0,1114, + 1115,5,140,0,0,1115,1116,5,134,0,0,1116,1207,1,0,0,0,1117,1118,3, + 154,77,0,1118,1119,5,58,0,0,1119,1120,5,61,0,0,1120,1127,3,154,77, + 0,1121,1122,5,67,0,0,1122,1123,5,62,0,0,1123,1124,3,154,77,0,1124, + 1125,5,136,0,0,1125,1126,3,154,77,0,1126,1128,1,0,0,0,1127,1121, + 1,0,0,0,1127,1128,1,0,0,0,1128,1129,1,0,0,0,1129,1130,5,134,0,0, + 1130,1207,1,0,0,0,1131,1132,3,154,77,0,1132,1133,5,58,0,0,1133,1134, + 5,62,0,0,1134,1135,3,154,77,0,1135,1136,5,136,0,0,1136,1143,3,154, + 77,0,1137,1138,5,67,0,0,1138,1139,5,62,0,0,1139,1140,3,154,77,0, + 1140,1141,5,136,0,0,1141,1142,3,154,77,0,1142,1144,1,0,0,0,1143, + 1137,1,0,0,0,1143,1144,1,0,0,0,1144,1145,1,0,0,0,1145,1146,5,134, + 0,0,1146,1207,1,0,0,0,1147,1148,3,154,77,0,1148,1149,5,58,0,0,1149, + 1150,5,44,0,0,1150,1152,3,154,77,0,1151,1153,3,28,14,0,1152,1151, + 1,0,0,0,1152,1153,1,0,0,0,1153,1162,1,0,0,0,1154,1155,5,67,0,0,1155, + 1156,5,62,0,0,1156,1157,3,154,77,0,1157,1158,5,136,0,0,1158,1159, + 3,154,77,0,1159,1163,1,0,0,0,1160,1161,5,18,0,0,1161,1163,5,53,0, + 0,1162,1154,1,0,0,0,1162,1160,1,0,0,0,1162,1163,1,0,0,0,1163,1164, + 1,0,0,0,1164,1165,5,134,0,0,1165,1207,1,0,0,0,1166,1167,3,154,77, + 0,1167,1168,5,58,0,0,1168,1169,5,7,0,0,1169,1170,3,154,77,0,1170, + 1171,5,64,0,0,1171,1175,5,137,0,0,1172,1174,3,112,56,0,1173,1172, + 1,0,0,0,1174,1177,1,0,0,0,1175,1173,1,0,0,0,1175,1176,1,0,0,0,1176, + 1178,1,0,0,0,1177,1175,1,0,0,0,1178,1179,5,138,0,0,1179,1180,5,134, + 0,0,1180,1207,1,0,0,0,1181,1182,3,154,77,0,1182,1183,5,58,0,0,1183, + 1184,5,51,0,0,1184,1185,3,154,77,0,1185,1186,5,134,0,0,1186,1207, + 1,0,0,0,1187,1188,3,154,77,0,1188,1190,5,58,0,0,1189,1191,5,9,0, + 0,1190,1189,1,0,0,0,1190,1191,1,0,0,0,1191,1192,1,0,0,0,1192,1193, + 5,22,0,0,1193,1194,3,154,77,0,1194,1195,5,136,0,0,1195,1202,3,154, + 77,0,1196,1197,5,67,0,0,1197,1198,5,62,0,0,1198,1199,3,154,77,0, + 1199,1200,5,136,0,0,1200,1201,3,154,77,0,1201,1203,1,0,0,0,1202, + 1196,1,0,0,0,1202,1203,1,0,0,0,1203,1204,1,0,0,0,1204,1205,5,134, + 0,0,1205,1207,1,0,0,0,1206,1108,1,0,0,0,1206,1117,1,0,0,0,1206,1131, + 1,0,0,0,1206,1147,1,0,0,0,1206,1166,1,0,0,0,1206,1181,1,0,0,0,1206, + 1187,1,0,0,0,1207,135,1,0,0,0,1208,1209,5,51,0,0,1209,1210,3,154, + 77,0,1210,1211,5,58,0,0,1211,1212,3,154,77,0,1212,1213,5,136,0,0, + 1213,1215,3,154,77,0,1214,1216,3,132,66,0,1215,1214,1,0,0,0,1215, + 1216,1,0,0,0,1216,1217,1,0,0,0,1217,1218,5,134,0,0,1218,137,1,0, + 0,0,1219,1266,3,142,71,0,1220,1266,5,113,0,0,1221,1266,5,114,0,0, + 1222,1223,5,115,0,0,1223,1266,3,156,78,0,1224,1225,5,116,0,0,1225, + 1226,5,143,0,0,1226,1227,3,154,77,0,1227,1228,5,144,0,0,1228,1266, + 1,0,0,0,1229,1230,5,117,0,0,1230,1231,5,143,0,0,1231,1233,3,154, + 77,0,1232,1234,3,28,14,0,1233,1232,1,0,0,0,1233,1234,1,0,0,0,1234, + 1235,1,0,0,0,1235,1236,5,144,0,0,1236,1266,1,0,0,0,1237,1238,5,39, + 0,0,1238,1239,5,143,0,0,1239,1240,3,154,77,0,1240,1241,5,144,0,0, + 1241,1266,1,0,0,0,1242,1243,5,118,0,0,1243,1244,5,143,0,0,1244,1245, + 3,138,69,0,1245,1246,5,144,0,0,1246,1266,1,0,0,0,1247,1248,5,119, + 0,0,1248,1249,5,143,0,0,1249,1250,3,138,69,0,1250,1251,5,144,0,0, + 1251,1266,1,0,0,0,1252,1253,5,120,0,0,1253,1257,5,137,0,0,1254,1256, + 3,140,70,0,1255,1254,1,0,0,0,1256,1259,1,0,0,0,1257,1255,1,0,0,0, + 1257,1258,1,0,0,0,1258,1260,1,0,0,0,1259,1257,1,0,0,0,1260,1266, + 5,138,0,0,1261,1263,3,154,77,0,1262,1264,3,28,14,0,1263,1262,1,0, + 0,0,1263,1264,1,0,0,0,1264,1266,1,0,0,0,1265,1219,1,0,0,0,1265,1220, + 1,0,0,0,1265,1221,1,0,0,0,1265,1222,1,0,0,0,1265,1224,1,0,0,0,1265, + 1229,1,0,0,0,1265,1237,1,0,0,0,1265,1242,1,0,0,0,1265,1247,1,0,0, + 0,1265,1252,1,0,0,0,1265,1261,1,0,0,0,1266,139,1,0,0,0,1267,1268, + 3,154,77,0,1268,1269,5,133,0,0,1269,1270,3,138,69,0,1270,1271,5, + 134,0,0,1271,141,1,0,0,0,1272,1273,7,6,0,0,1273,143,1,0,0,0,1274, + 1275,7,7,0,0,1275,145,1,0,0,0,1276,1285,3,156,78,0,1277,1285,5,147, + 0,0,1278,1285,5,148,0,0,1279,1285,5,129,0,0,1280,1285,5,130,0,0, + 1281,1285,5,131,0,0,1282,1285,3,148,74,0,1283,1285,3,152,76,0,1284, + 1276,1,0,0,0,1284,1277,1,0,0,0,1284,1278,1,0,0,0,1284,1279,1,0,0, + 0,1284,1280,1,0,0,0,1284,1281,1,0,0,0,1284,1282,1,0,0,0,1284,1283, + 1,0,0,0,1285,147,1,0,0,0,1286,1295,5,137,0,0,1287,1292,3,150,75, + 0,1288,1289,5,135,0,0,1289,1291,3,150,75,0,1290,1288,1,0,0,0,1291, + 1294,1,0,0,0,1292,1290,1,0,0,0,1292,1293,1,0,0,0,1293,1296,1,0,0, + 0,1294,1292,1,0,0,0,1295,1287,1,0,0,0,1295,1296,1,0,0,0,1296,1297, + 1,0,0,0,1297,1298,5,138,0,0,1298,149,1,0,0,0,1299,1300,3,156,78, + 0,1300,1301,5,133,0,0,1301,1302,3,146,73,0,1302,151,1,0,0,0,1303, + 1312,5,139,0,0,1304,1309,3,146,73,0,1305,1306,5,135,0,0,1306,1308, + 3,146,73,0,1307,1305,1,0,0,0,1308,1311,1,0,0,0,1309,1307,1,0,0,0, + 1309,1310,1,0,0,0,1310,1313,1,0,0,0,1311,1309,1,0,0,0,1312,1304, + 1,0,0,0,1312,1313,1,0,0,0,1313,1314,1,0,0,0,1314,1315,5,140,0,0, + 1315,153,1,0,0,0,1316,1317,7,8,0,0,1317,155,1,0,0,0,1318,1319,5, + 150,0,0,1319,157,1,0,0,0,115,170,177,198,211,223,243,251,258,264, + 276,279,285,296,305,315,318,320,324,332,344,349,358,361,376,382, + 394,403,411,419,432,435,445,449,455,462,468,476,484,497,504,508, + 513,524,530,541,568,574,585,612,639,644,655,658,663,666,673,682, + 685,688,705,714,728,749,752,755,762,770,810,813,817,839,853,861, + 873,887,897,915,919,922,926,929,938,942,946,952,963,970,990,999, + 1031,1051,1071,1081,1084,1087,1089,1103,1127,1143,1152,1162,1175, + 1190,1202,1206,1215,1233,1257,1263,1265,1284,1292,1295,1309,1312 ]; private static __ATN: antlr.ATN; @@ -5776,6 +5900,9 @@ export class WorkspaceItemContext extends antlr.ParserRuleContext { public constructorBindingDecl(): ConstructorBindingDeclContext | null { return this.getRuleContext(0, ConstructorBindingDeclContext); } + public presentationDecl(): PresentationDeclContext | null { + return this.getRuleContext(0, PresentationDeclContext); + } public typeAliasDecl(): TypeAliasDeclContext | null { return this.getRuleContext(0, TypeAliasDeclContext); } @@ -6762,6 +6889,9 @@ export class PackageExportContext extends antlr.ParserRuleContext { public packageQuerySpecialization(): PackageQuerySpecializationContext | null { return this.getRuleContext(0, PackageQuerySpecializationContext); } + public componentDecl(): ComponentDeclContext | null { + return this.getRuleContext(0, ComponentDeclContext); + } public override get ruleIndex(): number { return QuixosCapabilityParser.RULE_packageExport; } @@ -6775,6 +6905,103 @@ export class PackageExportContext extends antlr.ParserRuleContext { } +export class ComponentDeclContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public COMPONENT(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.COMPONENT, 0)!; + } + public identifier(): IdentifierContext[]; + public identifier(i: number): IdentifierContext | null; + public identifier(i?: number): IdentifierContext[] | IdentifierContext | null { + if (i === undefined) { + return this.getRuleContexts(IdentifierContext); + } + + return this.getRuleContext(i, IdentifierContext); + } + public ID(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.ID, 0)!; + } + public stringLiteral(): StringLiteralContext { + return this.getRuleContext(0, StringLiteralContext)!; + } + public SUBJECT(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.SUBJECT, 0)!; + } + public interfaceType(): InterfaceTypeContext { + return this.getRuleContext(0, InterfaceTypeContext)!; + } + public RUNTIME(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.RUNTIME, 0)!; + } + public SEMI(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.SEMI, 0)!; + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_componentDecl; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitComponentDecl) { + return visitor.visitComponentDecl(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class PresentationDeclContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public PRESENTATION(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.PRESENTATION, 0)!; + } + public identifier(): IdentifierContext[]; + public identifier(i: number): IdentifierContext | null; + public identifier(i?: number): IdentifierContext[] | IdentifierContext | null { + if (i === undefined) { + return this.getRuleContexts(IdentifierContext); + } + + return this.getRuleContext(i, IdentifierContext); + } + public ID(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.ID, 0)!; + } + public stringLiteral(): StringLiteralContext { + return this.getRuleContext(0, StringLiteralContext)!; + } + public FOR(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.FOR, 0)!; + } + public interfaceType(): InterfaceTypeContext { + return this.getRuleContext(0, InterfaceTypeContext)!; + } + public USING(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.USING, 0)!; + } + public DOT(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.DOT, 0)!; + } + public SEMI(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.SEMI, 0)!; + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_presentationDecl; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitPresentationDecl) { + return visitor.visitPresentationDecl(this); + } else { + return visitor.visitChildren(this); + } + } +} + + export class PackageQueryContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); @@ -9056,6 +9283,21 @@ export class IdentifierContext extends antlr.ParserRuleContext { public DEADLINE_MS(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.DEADLINE_MS, 0); } + public COMPONENT(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.COMPONENT, 0); + } + public PRESENTATION(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.PRESENTATION, 0); + } + public SUBJECT(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.SUBJECT, 0); + } + public RUNTIME(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.RUNTIME, 0); + } + public FOR(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.FOR, 0); + } public override get ruleIndex(): number { return QuixosCapabilityParser.RULE_identifier; } diff --git a/src/capability-language/generated/QuixosCapabilityVisitor.ts b/src/capability-language/generated/QuixosCapabilityVisitor.ts index 1861546..7be9723 100644 --- a/src/capability-language/generated/QuixosCapabilityVisitor.ts +++ b/src/capability-language/generated/QuixosCapabilityVisitor.ts @@ -29,6 +29,8 @@ import { RelationshipOperationContext } from "./QuixosCapabilityParser.js"; import { TargetConstraintContext } from "./QuixosCapabilityParser.js"; import { PackageResourceDeclContext } from "./QuixosCapabilityParser.js"; import { PackageExportContext } from "./QuixosCapabilityParser.js"; +import { ComponentDeclContext } from "./QuixosCapabilityParser.js"; +import { PresentationDeclContext } from "./QuixosCapabilityParser.js"; import { PackageQueryContext } from "./QuixosCapabilityParser.js"; import { PackageQuerySpecializationContext } from "./QuixosCapabilityParser.js"; import { QueryClauseContext } from "./QuixosCapabilityParser.js"; @@ -251,6 +253,18 @@ export class QuixosCapabilityVisitor extends AbstractParseTreeVisitor Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.componentDecl`. + * @param ctx the parse tree + * @return the visitor result + */ + visitComponentDecl?: (ctx: ComponentDeclContext) => Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.presentationDecl`. + * @param ctx the parse tree + * @return the visitor result + */ + visitPresentationDecl?: (ctx: PresentationDeclContext) => Result; /** * Visit a parse tree produced by `QuixosCapabilityParser.packageQuery`. * @param ctx the parse tree diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index 3ef4a69..240f044 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -1333,9 +1333,25 @@ const lowerPackage = ( }), ); const genericExports: GenericPackageExport[] = []; + const components: NonNullable = []; const queries: QueryDeclaration[] = []; const queryTemplates: QueryTemplate[] = []; const exports = context.packageExport().flatMap((exportContext): PackageExport[] => { + const component = exportContext.componentDecl(); + if (component) { + const runtime = identifier(component.identifier(1)); + if (runtime !== "react") + loweringIssue(state, component, "unsupported-component-runtime", `Unsupported component runtime ${runtime}`); + components.push({ + id: stringValue(component.stringLiteral()), + displayName: identifier(component.identifier(0)), + subject: new TypeSubstitution(state.types.environment()).application( + state.types.interface(component.interfaceType()), + ), + runtime: "react", + }); + return []; + } if (exportContext.packageQuerySpecialization()) return []; const query = exportContext.packageQuery(); if (query) { @@ -1595,6 +1611,7 @@ const lowerPackage = ( displayName: alias, source, exports, + ...(components.length ? { components } : {}), ...(queries.length ? { queries } : {}), ...(queryTemplates.length ? { queryTemplates } : {}), ...(queries.some((query) => query.argumentRequirements?.length) @@ -2397,6 +2414,30 @@ const lowerWorkspace = ( : []; }); + const presentations: NonNullable = items.flatMap((item) => { + const presentation = item.presentationDecl(); + if (!presentation) return []; + const packageName = identifier(presentation.identifier(1)); + const componentName = identifier(presentation.identifier(2)); + const pkg = requireSymbol(state, state.packages, packageName, presentation, "package"); + const component = pkg?.definition?.components?.find((entry) => entry.displayName === componentName); + if (!component) { + loweringIssue(state, presentation, "unknown-component", `Unknown component ${packageName}.${componentName}`); + return []; + } + return [ + { + id: stringValue(presentation.stringLiteral()), + displayName: identifier(presentation.identifier(0)), + subject: new TypeSubstitution(state.types.environment()).application( + state.types.interface(presentation.interfaceType()), + ), + packageRevisionId: pkg!.revisionId, + componentId: component.id, + }, + ]; + }); + return { imports, workspace: { @@ -2417,6 +2458,7 @@ const lowerWorkspace = ( ), conformances, constructors, + ...(presentations.length ? { presentations } : {}), }, }; }; diff --git a/src/capability-model/controllers.ts b/src/capability-model/controllers.ts new file mode 100644 index 0000000..5cf9847 --- /dev/null +++ b/src/capability-model/controllers.ts @@ -0,0 +1,86 @@ +import type { InterfaceRevision, PackageController, WorkspaceRevision } from "./types.js"; +import type { CapabilityValidationIssue } from "./validation.js"; +import { canonicalJson } from "./evolution.js"; + +export function validateControllers( + controllers: readonly PackageController[], + interfaces: readonly InterfaceRevision[], + prefix: string, +): CapabilityValidationIssue[] { + const issues: CapabilityValidationIssue[] = [], + ids = new Set(); + const fail = (path: string, message: string) => issues.push({ code: "invalid-controller" as const, path, message }); + for (const [index, controller] of controllers.entries()) { + const path = `${prefix}[${index}]`; + if (!controller.id.trim() || ids.has(controller.id)) + fail(`${path}.id`, "Controller identities must be nonempty and unique within the package"); + ids.add(controller.id); + const iface = interfaces.find((i) => i.revisionId === controller.subject && !i.template); + if (!iface) { + fail(`${path}.subject`, "Controller subject must be an imported closed interface"); + continue; + } + const operations = iface.members.flatMap((m) => m.operations); + const snapshot = operations.find((o) => o.id === controller.snapshot), + remote = operations.find((o) => o.id === controller.remote); + const unit = (value: unknown) => canonicalJson(value) === canonicalJson({ kind: "builtin", name: "unit" }); + if ( + !snapshot || + snapshot.scope === "class" || + snapshot.mode !== "call" || + snapshot.execution?.kind !== "snapshot" || + !snapshot.execution.targets.includes("server") || + !unit(snapshot.inputType) + ) + fail(`${path}.snapshot`, "Controller snapshot must be a server snapshot object call with unit input"); + if ( + !remote || + remote.scope === "class" || + remote.mode !== "call" || + (remote.execution?.kind ?? "remote") !== "remote" + ) + fail(`${path}.remote`, "Controller target must be a remote object call"); + if (controller.input !== "unit" && controller.input !== "value") + fail(`${path}.input`, "Controller input must be unit or value"); + else if ( + remote && + (controller.input === "unit" + ? !unit(remote.inputType) + : snapshot && canonicalJson(snapshot.outputType) !== canonicalJson(remote.inputType)) + ) + fail(`${path}.input`, "Controller input mapping does not match the remote operation input"); + } + return issues; +} +export function validateWorkspaceControllers(workspace: WorkspaceRevision): CapabilityValidationIssue[] { + return workspace.packageImports.flatMap((pkg, index) => + validateControllers(pkg.controllers ?? [], workspace.interfaceImports, `packageImports[${index}].controllers`), + ); +} +/** The file is declarative metadata, not an executable registration callback. */ +export function parseControllerCatalog(text: string, interfaces: readonly InterfaceRevision[]): PackageController[] { + if (Buffer.byteLength(text) > 1048576) throw new Error("Controller catalog exceeds 1 MiB"); + const value: unknown = JSON.parse(text); + const record = (value: unknown): value is Record => + !!value && typeof value === "object" && !Array.isArray(value); + if ( + !record(value) || + value.schemaVersion !== 1 || + Object.keys(value).some((k) => !["schemaVersion", "controllers"].includes(k)) || + !Array.isArray(value.controllers) || + value.controllers.length > 1000 + ) + throw new Error("Invalid controller catalog: expected schemaVersion 1 and at most 1000 controllers"); + const fields = ["id", "subject", "snapshot", "remote", "input"]; + for (const entry of value.controllers) + if ( + !record(entry) || + Object.keys(entry).length !== fields.length || + fields.some((key) => typeof entry[key] !== "string") + ) + throw new Error("Invalid controller entry: expected exactly id, subject, snapshot, remote, input strings"); + const controllers = value.controllers as PackageController[]; + const issues = validateControllers(controllers, interfaces, "controllers"); + if (issues.length) throw new Error(issues.map((i) => `${i.path}: ${i.message}`).join("\n")); + return controllers; +} diff --git a/src/capability-model/presentations.ts b/src/capability-model/presentations.ts new file mode 100644 index 0000000..8d8b147 --- /dev/null +++ b/src/capability-model/presentations.ts @@ -0,0 +1,56 @@ +import type { WorkspaceRevision } from "./types.js"; +import type { CapabilityValidationIssue } from "./validation.js"; + +/** Presentation metadata has no graph authority and cannot name arbitrary module URLs. */ +export function validatePresentations(workspace: WorkspaceRevision): CapabilityValidationIssue[] { + const issues: CapabilityValidationIssue[] = []; + const fail = (path: string, message: string) => issues.push({ code: "invalid-presentation", path, message }); + const interfaces = new Map(workspace.interfaceImports.map((entry) => [entry.revisionId, entry])); + const packages = new Map(workspace.packageImports.map((entry) => [entry.revisionId, entry])); + const text = (value: string, path: string) => { + if (!value.trim()) fail(path, "Presentation identities and names must be nonempty"); + }; + const subject = (id: string, path: string) => { + const contract = interfaces.get(id as WorkspaceRevision["interfaceImports"][number]["revisionId"]); + if (!contract || contract.template) fail(path, `Expected an imported closed subject interface: ${id}`); + }; + for (const [index, pkg] of workspace.packageImports.entries()) { + const ids = new Set(pkg.exports.map((entry) => entry.id as string)); + const names = new Set([ + ...pkg.exports.map((entry) => entry.displayName), + ...(pkg.queries ?? []).map((entry) => entry.displayName), + ...(pkg.queryTemplates ?? []).map((entry) => entry.declaration.displayName), + ...(pkg.genericExports ?? []).map((entry) => entry.displayName), + ]); + for (const [componentIndex, component] of (pkg.components ?? []).entries()) { + const path = `packageImports[${index}].components[${componentIndex}]`; + text(component.id, `${path}.id`); + text(component.displayName, `${path}.displayName`); + if (ids.has(component.id) || names.has(component.displayName)) + fail(path, "Duplicate component identity or package member name"); + ids.add(component.id); + names.add(component.displayName); + subject(component.subject, `${path}.subject`); + if (component.runtime !== "react") fail(`${path}.runtime`, "Unsupported component runtime"); + } + } + const ids = new Set(), + names = new Set(); + for (const [index, presentation] of (workspace.presentations ?? []).entries()) { + const path = `presentations[${index}]`; + text(presentation.id, `${path}.id`); + text(presentation.displayName, `${path}.displayName`); + if (ids.has(presentation.id) || names.has(presentation.displayName)) + fail(path, "Duplicate presentation identity or name"); + ids.add(presentation.id); + names.add(presentation.displayName); + subject(presentation.subject, `${path}.subject`); + const component = packages + .get(presentation.packageRevisionId) + ?.components?.find((entry) => entry.id === presentation.componentId); + if (!component) fail(`${path}.componentId`, "Presentation names no installed package component"); + else if (component.subject !== presentation.subject) + fail(`${path}.subject`, `Component requires ${component.subject}, not ${presentation.subject}`); + } + return issues; +} diff --git a/src/capability-model/types.ts b/src/capability-model/types.ts index 2d87701..01e0e89 100644 --- a/src/capability-model/types.ts +++ b/src/capability-model/types.ts @@ -288,7 +288,25 @@ export interface PackageConstructorExport extends PackageExportBase { export type PackageExport = PackageOperationExport | PackageFunctionExport | PackageConstructorExport; +/** A window presentation entry, never a graph operation or service export. */ +export interface PackageComponent { + id: string; + displayName: string; + subject: InterfaceRevisionId; + runtime: "react"; +} + +export interface WorkspacePresentation { + id: string; + displayName: string; + subject: InterfaceRevisionId; + packageRevisionId: PackageRevisionId; + componentId: string; +} + export interface PackageRevision { + controllers?: PackageController[]; + components?: PackageComponent[]; queries?: import("../query/types.js").QueryDeclaration[]; checkedQueries?: import("../query/types.js").CheckedQuery[]; queryTemplates?: import("../query/types.js").QueryTemplate[]; @@ -304,6 +322,15 @@ export interface PackageRevision { semanticMajor?: number; } +/** Checked adapter registration. Implementations remain ordinary object capabilities. */ +export interface PackageController { + id: string; + subject: InterfaceRevisionId; + snapshot: OperationId; + remote: OperationId; + input: "unit" | "value"; +} + export type DependencyBinding = | { kind: "reflection"; selectors: string[]; via?: never } | { @@ -415,6 +442,7 @@ export interface AtomConstructorBinding { } export interface WorkspaceRevision { + presentations?: WorkspacePresentation[]; linkedQueries?: import("../query/link.js").LinkedQuery[]; id: WorkspaceRevisionId; workspaceId: WorkspaceId; diff --git a/src/capability-model/validation.ts b/src/capability-model/validation.ts index 3e0daf5..22682c9 100644 --- a/src/capability-model/validation.ts +++ b/src/capability-model/validation.ts @@ -1,5 +1,7 @@ import { isStorableType } from "./generics.js"; import { validateInitialization } from "./initialization.js"; +import { validatePresentations } from "./presentations.js"; +import { validateWorkspaceControllers } from "./controllers.js"; import { validateExecutionContracts } from "./execution.js"; import { resolveForwardedBinding, type ConcreteBinding } from "./forwarding.js"; import type { @@ -44,6 +46,8 @@ import { specializePackageExport } from "./generic-packages.js"; import { isDeepStrictEqual } from "node:util"; export type CapabilityValidationIssueCode = + | "invalid-controller" + | "invalid-presentation" | "invalid-initialization" | "invalid-execution-contract" | "invalid-query-contract" @@ -2213,7 +2217,12 @@ export const validateWorkspaceRevision = (workspace: WorkspaceRevision): Capabil validatePackages(workspace, issues, indexes); validateConformances(workspace, issues, indexes); validateConstructors(workspace, issues, indexes); - issues.push(...validateExecutionContracts(workspace), ...validateInitialization(workspace)); + issues.push( + ...validateExecutionContracts(workspace), + ...validateInitialization(workspace), + ...validatePresentations(workspace), + ...validateWorkspaceControllers(workspace), + ); return issues; }; diff --git a/src/execution-world/artifacts.ts b/src/execution-world/artifacts.ts index fc0862d..37747bf 100644 --- a/src/execution-world/artifacts.ts +++ b/src/execution-world/artifacts.ts @@ -27,6 +27,24 @@ export interface PackageArtifacts { sourceDigest: string; versions: ExecutionPlan["definition"]["versions"]; implementations: ArtifactImplementation[]; + components?: ComponentArtifact[]; +} +export const componentSharedModules = [ + "react", + "react-dom", + "react-dom/client", + "react/jsx-runtime", + "@quixos/camino-react", +] as const; +export interface ComponentArtifact { + id: string; + subject: string; + compatibility: "quixos-react-component-v1"; + path: string; + exportName: string; + sharedModules: Record<(typeof componentSharedModules)[number], string>; + files: ArtifactFile[]; + contentDigest: string; } export interface ImplementationSelection { target: string; @@ -119,12 +137,73 @@ export function implementationDigest(implementation: Omit (a.path < b.path ? -1 : a.path > b.path ? 1 : 0)), }); } +export function componentArtifactDigest(component: Omit): string { + return hexDigest({ + ...component, + files: [...component.files].sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0)), + }); +} +function parseArtifactFiles(value: unknown, path: string): ArtifactFile[] { + const files = array(value, path).map((value): ArtifactFile => { + const file = object(value, path); + keys(file, ["path", "digest", "bytes", "mediaType"], [], path); + if (!Number.isSafeInteger(file.bytes) || (file.bytes as number) < 0 || (file.bytes as number) > 256 * 1024 * 1024) + fail(path, "Artifact file exceeds size bound"); + return { + path: artifactPath(file.path), + digest: digest(file.digest, path), + bytes: file.bytes as number, + mediaType: text(file.mediaType, path), + }; + }); + unique( + files.map((file) => file.path), + path, + ); + return files.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0)); +} +function parseComponent(value: unknown, index: number): ComponentArtifact { + const path = `components[${index}]`, + entry = object(value, path); + keys( + entry, + ["id", "subject", "compatibility", "path", "exportName", "sharedModules", "files", "contentDigest"], + [], + path, + ); + if (entry.compatibility !== "quixos-react-component-v1") fail(path, "Unsupported component ABI"); + const files = parseArtifactFiles(entry.files, `${path}.files`); + const shared = object(entry.sharedModules, `${path}.sharedModules`); + keys(shared, [...componentSharedModules], [], `${path}.sharedModules`); + const sharedModules = Object.fromEntries( + componentSharedModules.map((name) => [name, artifactPath(shared[name])]), + ) as ComponentArtifact["sharedModules"]; + const entryPath = artifactPath(entry.path), + exportName = text(entry.exportName, path); + if (!/^[$A-Z_a-z][$\w]*$/.test(exportName)) fail(path, "Expected a JavaScript component export name"); + for (const modulePath of [entryPath, ...Object.values(sharedModules)]) + if (!files.some((file) => file.path === modulePath && file.mediaType === "text/javascript")) + fail(path, "Component entry and shared modules require declared JavaScript files"); + const component: ComponentArtifact = { + id: text(entry.id, path), + subject: text(entry.subject, path), + compatibility: "quixos-react-component-v1", + path: entryPath, + exportName, + sharedModules, + files, + contentDigest: digest(entry.contentDigest, path), + }; + const { contentDigest, ...body } = component; + if (componentArtifactDigest(body) !== contentDigest) fail(path, "Component metadata digest mismatch"); + return component; +} export function parsePackageArtifacts(value: unknown): PackageArtifacts { const record = object(value, "manifest"); keys( record, ["schemaVersion", "packageRevisionId", "bindingDigest", "sourceDigest", "versions", "implementations"], - [], + ["components"], "manifest", ); if (record.schemaVersion !== 1) fail("manifest", "Unsupported artifact manifest version"); @@ -152,26 +231,7 @@ export function parsePackageArtifacts(value: unknown): PackageArtifacts { if (entry.compatibility === "quixos-js-module-v1") text(entry.registryExport, `${path}.registryExport`); const exports = array(entry.exports, `${path}.exports`).map((value) => text(value, `${path}.exports`)); unique(exports, `${path}.exports`); - const files = array(entry.files, `${path}.files`).map((value): ArtifactFile => { - const file = object(value, `${path}.file`); - keys(file, ["path", "digest", "bytes", "mediaType"], [], `${path}.file`); - if ( - !Number.isSafeInteger(file.bytes) || - (file.bytes as number) < 0 || - (file.bytes as number) > 256 * 1024 * 1024 - ) - fail(path, "Artifact file exceeds size bound"); - return { - path: artifactPath(file.path), - digest: digest(file.digest, path), - bytes: file.bytes as number, - mediaType: text(file.mediaType, path), - }; - }); - unique( - files.map((file) => file.path), - `${path}.files`, - ); + const files = parseArtifactFiles(entry.files, `${path}.files`); const entryPath = artifactPath(entry.path); if (!files.some((file) => file.path === entryPath)) fail(path, "Entrypoint is not covered by the file manifest"); const result: ArtifactImplementation = { @@ -194,6 +254,13 @@ export function parsePackageArtifacts(value: unknown): PackageArtifacts { implementations.map((implementation) => implementation.id), "implementations", ); + const components = + record.components === undefined ? undefined : array(record.components, "components").map(parseComponent); + if (components) + unique( + components.map((component) => component.id), + "components", + ); return { schemaVersion: 1, packageRevisionId: text(record.packageRevisionId, "packageRevisionId"), @@ -201,11 +268,20 @@ export function parsePackageArtifacts(value: unknown): PackageArtifacts { sourceDigest: digest(record.sourceDigest, "sourceDigest"), versions: versions as unknown as PackageArtifacts["versions"], implementations, + ...(components ? { components } : {}), }; } function checkCoverage(expected: PlanPackage, manifest: PackageArtifacts): void { if (expected.bindingDigest !== manifest.bindingDigest || expected.sourceDigest !== manifest.sourceDigest) fail(expected.revision, "Substituted binding schema or source revision"); + for (const component of manifest.components ?? []) { + const declaration = expected.components?.find((entry) => entry.id === component.id); + if (!declaration || declaration.subject !== component.subject || declaration.runtime !== "react") + fail(component.id, "Component differs from its declared subject/runtime contract"); + } + for (const component of expected.components ?? []) + if (!manifest.components?.some((entry) => entry.id === component.id)) + fail(component.id, "Missing component artifact"); for (const implementation of manifest.implementations) for (const id of implementation.exports) { const entry = expected.exports.find((e) => e.id === id); @@ -272,6 +348,19 @@ export async function checkExecutionWorld( digest: implementation.contentDigest, }); } + for (const component of manifest.components ?? []) { + for (const file of component.files) { + const existing = files.get(file.path); + if (existing && canonicalJson(existing) !== canonicalJson(file)) + fail(file.path, "Conflicting file descriptors"); + files.set(file.path, file); + } + artifacts.push({ + binding: JSON.stringify([expected.revision, "component", component.id]), + target: "browser-renderer", + digest: component.contentDigest, + }); + } for (const file of files.values()) { const bytes = await read(expected.revision, file.path, file.bytes); if (bytes.byteLength !== file.bytes || createHash("sha256").update(bytes).digest("hex") !== file.digest) diff --git a/src/execution-world/client-contracts.ts b/src/execution-world/client-contracts.ts new file mode 100644 index 0000000..8a9cd17 --- /dev/null +++ b/src/execution-world/client-contracts.ts @@ -0,0 +1,122 @@ +import type { + InterfaceRevision, + InterfaceOperation, + ExecutionContract, + PackageRevision, +} from "../capability-model/types.js"; +import { canonicalJson } from "../capability-model/evolution.js"; +import { portableValueSchema, tsType } from "../bindings/portable.js"; +import { type ExecutionPlan, resolvePlannedOperation, hexDigest, ExecutionPlanError } from "./plan.js"; + +/** Public shape only: no slot inventory, implementation binding, or workspace identity. */ +export interface PublicOperationContract { + interface: string; + operation: string; + scope: "object" | "class"; + execution: ExecutionContract; + input: unknown; + output: unknown; +} +export function publicOperationContract( + iface: InterfaceRevision, + operation: InterfaceOperation, +): PublicOperationContract { + if (iface.template || operation.mode !== "call" || !iface.members.some((m) => m.operations.includes(operation))) + throw new ExecutionPlanError( + "UNSUPPORTED_CLIENT_CONTRACT", + iface.revisionId, + "Expected a closed interface call operation", + ); + const execution = operation.execution ?? { kind: "remote" }; + return { + interface: iface.revisionId, + operation: operation.id, + scope: operation.scope ?? "object", + execution: execution.kind === "remote" ? execution : { ...execution, targets: [...execution.targets].sort() }, + input: portableValueSchema(operation.inputType), + output: portableValueSchema(operation.outputType), + }; +} +/** Resolve a public contract to internal dispatch. This does not authorize the receiver. */ +export function linkInterfaceOperation(plan: ExecutionPlan, atom: string, contract: PublicOperationContract) { + if (hexDigest(plan.definition) !== plan.digest) + throw new ExecutionPlanError("INVALID_PLAN", atom, "Invalid execution plan digest"); + const iface = plan.definition.workspace.interfaceImports.find((i) => i.revisionId === contract.interface); + const operation = iface?.members.flatMap((m) => m.operations).find((o) => o.id === contract.operation); + if (!iface || !operation || canonicalJson(publicOperationContract(iface, operation)) !== canonicalJson(contract)) + throw new ExecutionPlanError( + "CLIENT_CONTRACT_MISMATCH", + `${contract.interface}/${contract.operation}`, + "Installed interface differs from the imported operation contract", + ); + return resolvePlannedOperation(plan, atom, contract.interface, contract.operation); +} + +export interface PublicQueryContract { + package: string; + query: string; + definitionDigest: string; + root: { kind: "object" | "workspace-interface"; interface: string }; + placement: "server" | "replica" | "local"; + sourceQuery?: string; + input: unknown; + output: unknown; +} +export function publicQueryContract(pkg: PackageRevision, queryId: string): PublicQueryContract { + const query = pkg.checkedQueries?.find((q) => q.declaration.id === queryId); + if (!query) + throw new ExecutionPlanError("UNCHECKED_QUERY", `${pkg.revisionId}/${queryId}`, "Expected a checked package query"); + const placement = query.declaration.placement; + return { + package: pkg.revisionId, + query: queryId, + definitionDigest: query.definitionDigest, + root: query.declaration.root, + placement: placement?.kind ?? "server", + ...(placement?.kind === "local" ? { sourceQuery: placement.sourceQueryId } : {}), + input: portableValueSchema(query.variables), + output: portableValueSchema(query.output), + }; +} +export function linkPackageQuery(plan: ExecutionPlan, contract: PublicQueryContract) { + if (hexDigest(plan.definition) !== plan.digest) + throw new ExecutionPlanError("INVALID_PLAN", contract.query, "Invalid execution plan digest"); + const pkg = plan.definition.workspace.packageImports.find((p) => p.revisionId === contract.package); + if (!pkg || canonicalJson(publicQueryContract(pkg, contract.query)) !== canonicalJson(contract)) + throw new ExecutionPlanError( + "CLIENT_QUERY_MISMATCH", + `${contract.package}/${contract.query}`, + "Installed query differs from the imported query contract", + ); + const query = plan.definition.queries.find( + (q) => q.query.packageRevisionId === contract.package && q.query.checked.declaration.id === contract.query, + ); + if (!query) throw new ExecutionPlanError("UNINSTALLED_QUERY", contract.query, "No installed query binding"); + return query; +} + +/** Generate only the explicitly imported interfaces. No concrete atom inventory is needed. */ +export function generateInterfaceClientBindings( + imports: Readonly>, + runtimeModule = "@quixos/camino-replica-core", +): string { + const entries = Object.entries(imports).map(([alias, iface]) => { + if (iface.template) + throw new ExecutionPlanError( + "OPEN_CLIENT_CONTRACT", + alias, + "Specialize the interface before generating a client", + ); + const members = iface.members.map((member) => { + const operations = member.operations + .filter((op) => op.mode === "call") + .map( + (op) => + `${JSON.stringify(op.displayName)}: defineInterfaceOperation<${tsType(op.inputType)}, ${tsType(op.outputType)}>(${JSON.stringify(publicOperationContract(iface, op))})`, + ); + return `${JSON.stringify(member.displayName)}: {${operations.join(",\n")}}`; + }); + return `${JSON.stringify(alias)}: {${members.join(",\n")}}`; + }); + return `// Generated from imported interface contracts. Regenerate; do not edit.\nimport { defineInterfaceOperation, type PreparedChange, type ManagedReference } from ${JSON.stringify(runtimeModule)};\nexport const interfaces = {${entries.join(",\n")}} as const;\n`; +} diff --git a/src/execution-world/index.ts b/src/execution-world/index.ts index 451ff90..f4f31a3 100644 --- a/src/execution-world/index.ts +++ b/src/execution-world/index.ts @@ -3,6 +3,7 @@ export * from "./artifacts.js"; export * from "./ports.js"; export * from "./files.js"; export * from "./installation.js"; +export * from "./client-contracts.js"; export * from "./receipts.js"; diff --git a/src/execution-world/installation.ts b/src/execution-world/installation.ts index fd12b55..3d595a8 100644 --- a/src/execution-world/installation.ts +++ b/src/execution-world/installation.ts @@ -1,8 +1,73 @@ import path from "node:path"; import { loadCheckedArtifactWorld } from "./receipts.js"; import { contentArtifactUrl } from "./files.js"; -import { selectArtifactImplementation, type ArtifactImplementation } from "./artifacts.js"; -import { ExecutionPlanError, type ExecutionPlan } from "./plan.js"; +import { selectArtifactImplementation, type ArtifactImplementation, type ComponentArtifact } from "./artifacts.js"; +import { ExecutionPlanError, hexDigest, type ExecutionPlan } from "./plan.js"; +import { + publicOperationContract, + publicQueryContract, + type PublicOperationContract, + type PublicQueryContract, +} from "./client-contracts.js"; + +/** Activation is assigned by graph authority, never by a package artifact. */ +export interface ActiveExecutionIdentity { + readonly workspace: string; + readonly world: string; + readonly plan: string; + readonly epoch: string; +} +/** Host-owned execution selection. The lifecycle manager fills its checked inputs. */ +export interface ExecutionGroupIdentity { + readonly logicalId: string; + readonly executionDigest: string; +} +export interface ClientContractCatalog { + readonly operations: readonly PublicOperationContract[]; + readonly queries: readonly PublicQueryContract[]; + readonly components: readonly InstalledComponent[]; + readonly presentations: readonly { id: string; subject: string; packageRevision: string; component: string }[]; +} +/** Explicit projection prevents accidental spreading of filesystem roots or private bindings. */ +export function clientContractCatalog( + plan: ExecutionPlan, + installation: ExecutionInstallation, + requestedPackages: readonly string[], +): ClientContractCatalog { + if (installation.plan !== plan.digest || hexDigest(plan.definition) !== plan.digest) + throw new ExecutionPlanError( + "CATALOG_PLAN_MISMATCH", + plan.digest, + "Installation and public catalog must use the same checked plan", + ); + const packages = requestedPackages.map((revision) => { + const pkg = plan.definition.workspace.packageImports.find((p) => p.revisionId === revision); + if (!pkg) + throw new ExecutionPlanError("UNINSTALLED_PACKAGE", revision, "Requested catalog package is not installed"); + return pkg; + }); + // Interface metadata contains no authority or private implementation configuration. + // A later admission optimization can narrow this set without changing operation identities. + const operations = plan.definition.workspace.interfaceImports + .filter((i) => !i.template) + .flatMap((iface) => + iface.members.flatMap((member) => + member.operations + .filter((o) => o.mode === "call") + .map((operation) => publicOperationContract(iface, operation)), + ), + ); + return { + operations, + queries: packages.flatMap((pkg) => + (pkg.checkedQueries ?? []).map((q) => publicQueryContract(pkg, q.declaration.id)), + ), + components: installation.components.filter((c) => requestedPackages.includes(c.packageRevision)), + presentations: (plan.definition.presentations ?? []) + .filter((p) => requestedPackages.includes(p.packageRevisionId)) + .map((p) => ({ id: p.id, subject: p.subject, packageRevision: p.packageRevisionId, component: p.componentId })), + }; +} export interface PackageInstallationSelection { readonly browser?: { readonly id?: string }; @@ -17,7 +82,7 @@ export interface ExecutionInstallation { readonly packages: readonly { readonly revision: string; readonly root: string; - readonly service: ArtifactImplementation; + readonly service?: ArtifactImplementation; readonly module?: ArtifactImplementation; readonly browserURL?: string; readonly browserRegistry?: string; @@ -25,6 +90,17 @@ export interface ExecutionInstallation { readonly routes: Readonly>; readonly coreURL?: string; readonly engineURL?: string; + readonly components: readonly InstalledComponent[]; +} +/** Safe to expose in a presentation catalog: no source paths, state slots, or host configuration. */ +export interface InstalledComponent { + readonly packageRevision: string; + readonly id: string; + readonly subject: string; + readonly url: string; + readonly exportName: string; + readonly compatibility: ComponentArtifact["compatibility"]; + readonly sharedModules: Readonly>; } /** Verify candidate receipts before assembling process entrypoints and browser assets. * This grants no authority to activate a world or run optional modules in process. */ @@ -43,18 +119,49 @@ export async function loadExecutionInstallation( fail(revision, "Selection names a package outside this checked world"); const routes: Record = Object.create(null); const packages: ExecutionInstallation["packages"][number][] = []; + const components: InstalledComponent[] = []; + const sharedComponentModules = new Map(); let coreURL: string | undefined, engineURL: string | undefined; for (const manifest of loaded.manifests) { const revision = manifest.packageRevisionId; const root = roots[revision]!; const selection = selections[revision] ?? {}; const exports = plan.definition.packages.find((pkg) => pkg.revision === revision)!.exports; - const service = selectArtifactImplementation(manifest, { - ...selection.service, - target: "server", - compatibility: "quixos-service-v1", - exports: exports.map((entry) => entry.id), - }); + const service = + exports.length || selection.service + ? selectArtifactImplementation(manifest, { + ...selection.service, + target: "server", + compatibility: "quixos-service-v1", + exports: exports.map((entry) => entry.id), + }) + : undefined; + for (const component of manifest.components ?? []) { + const sharedModules = Object.fromEntries( + Object.entries(component.sharedModules).map(([name, filePath]) => { + const file = component.files.find((file) => file.path === filePath)!; + const url = contentArtifactUrl(file), + previous = sharedComponentModules.get(name); + if (previous && previous !== url) fail(component.id, `Components disagree on shared module ${name}`); + sharedComponentModules.set(name, url); + return [name, url]; + }), + ) as InstalledComponent["sharedModules"]; + for (const file of component.files) { + const url = contentArtifactUrl(file); + if (routes[url] && routes[url].mediaType !== file.mediaType) fail(url, "Conflicting artifact media types"); + routes[url] ??= { path: path.join(root, file.path), mediaType: file.mediaType }; + } + components.push({ + packageRevision: revision, + id: component.id, + subject: component.subject, + compatibility: component.compatibility, + exportName: component.exportName, + sharedModules, + url: contentArtifactUrl(component.files.find((file) => file.path === component.path)!), + }); + } const module = selection.module ? selectArtifactImplementation(manifest, { ...selection.module, @@ -68,7 +175,7 @@ export async function loadExecutionInstallation( ); if (!browserExports.length) { if (selection.browser) fail(revision, "Package has no browser exports to select"); - packages.push({ revision, root, service, ...(module ? { module } : {}) }); + packages.push({ revision, root, ...(service ? { service } : {}), ...(module ? { module } : {}) }); continue; } const browser = selectArtifactImplementation(manifest, { @@ -97,7 +204,7 @@ export async function loadExecutionInstallation( packages.push({ revision, root, - service, + ...(service ? { service } : {}), ...(module ? { module } : {}), browserURL: contentArtifactUrl(entry), browserRegistry: browser.registryExport, @@ -108,6 +215,7 @@ export async function loadExecutionInstallation( plan: plan.digest, world: loaded.digest, packages, + components, routes, ...(coreURL ? { coreURL, engineURL } : {}), }; diff --git a/src/execution-world/plan.ts b/src/execution-world/plan.ts index c5f93a2..12d30c4 100644 --- a/src/execution-world/plan.ts +++ b/src/execution-world/plan.ts @@ -58,6 +58,8 @@ export interface PlannedQuery { admittedOperations: string[]; } export interface PlanPackage { + controllers?: NonNullable; + components?: NonNullable; revision: string; source: WorkspaceRevision["packageImports"][number]["source"]; sourceDigest: string; @@ -65,6 +67,7 @@ export interface PlanPackage { exports: { id: string; execution: ExecutionContract }[]; } export interface ExecutionPlanDefinition { + presentations?: NonNullable; codec: "camino-execution-plan-v1"; workspace: WorkspaceRevision; bindingSchema: BindingSchema; @@ -421,11 +424,14 @@ export function compileExecutionPlan(input: WorkspaceRevision): ExecutionPlan { codec: "camino-execution-plan-v1", workspace, bindingSchema: normalizedSchema, + ...(workspace.presentations?.length ? { presentations: sorted(workspace.presentations, (p) => p.id) } : {}), packages: sorted(workspace.packageImports, (p) => p.revisionId).map((p) => ({ revision: p.revisionId, source: p.source, sourceDigest: hexDigest({ revision: p.revisionId, source: p.source }), bindingDigest: hexDigest(normalizedSchema), + ...(p.controllers?.length ? { controllers: sorted(p.controllers, (controller) => controller.id) } : {}), + ...(p.components?.length ? { components: sorted(p.components, (component) => component.id) } : {}), exports: sorted(p.exports, (e) => e.id).map((e) => ({ id: e.id, execution: e.execution ?? { kind: "remote" } })), })), owners: sorted(workspace.conformances, (c) => c.id ?? "").map((c) => { diff --git a/test/client-contracts.test.ts b/test/client-contracts.test.ts new file mode 100644 index 0000000..5adda40 --- /dev/null +++ b/test/client-contracts.test.ts @@ -0,0 +1,121 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/index.js"; +import { + compileExecutionPlan, + generateInterfaceClientBindings, + publicOperationContract, + linkInterfaceOperation, + publicQueryContract, + linkPackageQuery, +} from "../src/execution-world/index.js"; +import { compileQuery } from "../src/query/compile.js"; +import { parseControllerCatalog, validateControllers } from "../src/capability-model/controllers.js"; +const source = { repository: "https://example.test/contracts.git", commit: "a".repeat(40) }; +const parsed = compileCapabilityResourceSource( + `interface Data id "data" revision "data@1" { + queryable portable value label id "label" : string { get id "label:get" execution snapshot targets [browser, server]; } + operation publish id "publish" : string -> unit { call id "publish:call"; } +}`, + { source }, +); +assert.ok(parsed.ok && parsed.resource.kind === "interface", JSON.stringify(parsed.diagnostics)); +const iface = parsed.resource.revision; +const environment = { interfaces: new Map([["Data", iface]]), interfaceClosure: [iface] }; +const compile = async () => { + const pkg = compileCapabilityResourceSource( + `import interface Data; package Views id "views" revision "views@1" { + query Labels id "labels" root workspace Data document "labels.graphql" operation "Labels" { replica; } + operation publish id "export:publish" : string -> unit mode call receiver any; + }`, + { source, environment }, + ); + assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); + const revision = pkg.resource.revision; + revision.checkedQueries = [ + await compileQuery( + revision.queries![0]!, + [iface], + async () => "query Labels { root { objects(first: 10) { entries { node { label } } } } }", + ), + ]; + const result = compileCapabilitySource( + `workspace Test id "test" revision "test@1" commit "${source.commit}" { + import interface Data; import package Views; + atom One id "one"; atom Two id "two"; + ${["One", "Two"] + .map( + (atom) => `conform ${atom} as Data id "${atom}:data" { + private state ${atom}Label id "${atom}:label" on ${atom} : string policy register default ""; + bind label.get to state ${atom}Label.read; + bind publish.call to package Views.publish; + }`, + ) + .join("\n")} + }`, + "workspace.qx", + { ...environment, packages: new Map([["Views", revision]]) }, + ); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + return compileExecutionPlan(result.workspace); +}; + +test("one imported operation contract links to two atom implementations without containing either", async () => { + const plan = await compile(); + const contract = publicOperationContract(iface, iface.members[0]!.operations[0]!); + assert.equal(linkInterfaceOperation(plan, "one", contract).atomId, "one"); + assert.equal(linkInterfaceOperation(plan, "two", contract).atomId, "two"); + const generated = generateInterfaceClientBindings({ Data: iface }); + assert.ok(generated.includes("defineInterfaceOperation")); + for (const privateValue of [plan.digest, "One:label", '"atomId"', '"binding"']) + assert.equal(generated.includes(privateValue), false); + assert.throws(() => linkInterfaceOperation(plan, "absent", contract), /UNINSTALLED_OPERATION/); + for (const change of [{ scope: "class" }, { input: { kind: "string" } }, { execution: { kind: "remote" } }]) + assert.throws( + () => linkInterfaceOperation(plan, "one", { ...contract, ...change } as typeof contract), + /CLIENT_CONTRACT_MISMATCH/, + ); + assert.throws(() => linkInterfaceOperation({ ...plan, digest: "bad" }, "one", contract), /INVALID_PLAN/); +}); + +test("package query handles bind the checked definition, placement and codecs", async () => { + const plan = await compile(); + const contract = publicQueryContract(plan.definition.workspace.packageImports[0]!, "labels"); + assert.equal(linkPackageQuery(plan, contract).query.checked.declaration.id, "labels"); + for (const change of [{ placement: "local" }, { definitionDigest: "bad" }, { output: null }]) + assert.throws(() => linkPackageQuery(plan, { ...contract, ...change } as typeof contract), /CLIENT_QUERY_MISMATCH/); +}); + +test("controller templates check object capability effects and exact input mapping", () => { + const catalog = { + schemaVersion: 1, + controllers: [ + { id: "publish-label", subject: "data@1", snapshot: "label:get", remote: "publish:call", input: "value" }, + ], + }; + assert.equal(parseControllerCatalog(JSON.stringify(catalog), [iface]).length, 1); + for (const change of [ + { input: "unit" }, + { input: "callback" }, + { subject: "missing" }, + { snapshot: "publish:call" }, + { remote: "label:get" }, + { url: "https://example.test" }, + ]) { + const invalid = { ...catalog, controllers: [{ ...catalog.controllers[0], ...change }] }; + assert.throws(() => parseControllerCatalog(JSON.stringify(invalid), [iface]), /Controller|controller/); + } + assert.throws( + () => + parseControllerCatalog( + JSON.stringify({ ...catalog, controllers: [...catalog.controllers, ...catalog.controllers] }), + [iface], + ), + /unique/, + ); + const classIface = structuredClone(iface); + classIface.members[1]!.operations[0]!.scope = "class"; + assert.ok( + validateControllers(parseControllerCatalog(JSON.stringify(catalog), [iface]), [classIface], "controllers").length, + ); +}); diff --git a/test/presentations.test.ts b/test/presentations.test.ts new file mode 100644 index 0000000..9810bdd --- /dev/null +++ b/test/presentations.test.ts @@ -0,0 +1,230 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { createHash } from "node:crypto"; +import { mkdtemp, mkdir, writeFile, rm } from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import { + compileCapabilityResourceSource, + compileCapabilitySource, + formatQx, + parseQx, + walkSyntax, +} from "../src/capability-language/index.js"; +import { + compileExecutionPlan, + checkExecutionWorld, + componentArtifactDigest, + componentSharedModules, + expectedArtifactReceipt, + loadExecutionInstallation, + clientContractCatalog, + type ComponentArtifact, + type PackageArtifacts, +} from "../src/execution-world/index.js"; +import { validateWorkspaceRevision } from "../src/capability-model/index.js"; + +const source = { repository: "https://example.test/components.git", commit: "a".repeat(40) }; +const contract = (name: string) => { + const result = compileCapabilityResourceSource( + `interface ${name} id "interface:${name}" revision "interface:${name}@1" { }`, + { source }, + ); + assert.ok(result.ok && result.resource.kind === "interface", JSON.stringify(result.diagnostics)); + return result.resource.revision; +}; +const data = contract("Data"), + other = contract("Other"); +const interfaces = new Map([ + ["Data", data], + ["Other", other], +]); +const componentSource = (body = 'component Card id "component:card" subject Data runtime react;') => + `import interface Data; package UI id "package:ui" revision "package:ui@1" { ${body} }`; +const compilePackage = (body?: string) => + compileCapabilityResourceSource(componentSource(body), { + source, + environment: { interfaces, interfaceClosure: [...interfaces.values()] }, + }); +const workspace = (presentation = 'presentation Card id "presentation:card" for Data using UI.Card;') => { + const pkg = compilePackage(); + assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); + return compileCapabilitySource( + `workspace Example id "workspace:example" revision "workspace:example@1" commit "${source.commit}" { + import interface Data; import interface Other; import package UI; + atom One id "atom:one"; atom Two id "atom:two"; + conform One as Data id "conformance:one:data" { } + conform Two as Data id "conformance:two:data" { } + ${presentation} + }`, + "workspace.qx", + { + interfaces, + interfaceClosure: [...interfaces.values()], + packages: new Map([["UI", pkg.resource.revision]]), + }, + ); +}; + +test("interface-only component declarations serve multiple conforming atoms without capability exports", () => { + const result = workspace(); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const plan = compileExecutionPlan(result.workspace); + assert.equal(plan.definition.packages[0]!.exports.length, 0); + assert.deepEqual(plan.definition.packages[0]!.components, [ + { + id: "component:card", + displayName: "Card", + subject: "interface:Data@1", + runtime: "react", + }, + ]); + assert.equal(plan.definition.presentations?.[0]?.componentId, "component:card"); + assert.equal(plan.definition.workspace.conformances.length, 2); + assert.equal(plan.definition.operations.length, 0); +}); + +test("component declarations survive formatting and syntax inspection", () => { + const text = formatQx(componentSource()); + const parsed = parseQx(text); + assert.deepEqual(parsed.diagnostics, []); + assert.ok([...walkSyntax(parsed.root)].some((node) => node.kind === "componentDecl")); + assert.equal(formatQx(text), text); +}); + +test("component and presentation contracts reject wrong subjects, duplicates and unavailable runtimes", () => { + for (const [input, message] of [ + ['component Card id "component:card" subject Missing runtime react;', /Missing/], + ['component Card id "component:card" subject Data runtime arduino;', /Unsupported component runtime/], + [ + 'component Card id "component:card" subject Data runtime react; component Other id "component:card" subject Data runtime react;', + /Duplicate component/, + ], + [ + 'component Card id "component:card" subject Data runtime react; component Card id "component:other" subject Data runtime react;', + /Duplicate component/, + ], + ] as const) { + const result = compilePackage(input); + assert.equal(result.ok, false); + assert.match(JSON.stringify(result.diagnostics), message); + } + for (const [input, message] of [ + ['presentation Card id "presentation:card" for Other using UI.Card;', /Component requires/], + ['presentation Card id "presentation:card" for Data using UI.Missing;', /Unknown component/], + [ + 'presentation Card id "presentation:card" for Data using UI.Card; presentation Duplicate id "presentation:card" for Data using UI.Card;', + /Duplicate presentation/, + ], + ] as const) { + const result = workspace(input); + assert.equal(result.ok, false); + assert.match(JSON.stringify(result.diagnostics), message); + } +}); + +test("model validation rechecks presentation metadata instead of trusting the source parser", () => { + const result = workspace(); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + result.workspace.presentations![0]!.componentId = "missing"; + assert.ok(validateWorkspaceRevision(result.workspace).some((issue) => issue.code === "invalid-presentation")); + assert.throws(() => compileExecutionPlan(result.workspace), /no installed package component/); +}); + +test("checked component-only artifacts install without a service and reject missing or substituted entries", async () => { + const result = workspace(); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const plan = compileExecutionPlan(result.workspace), + pkg = plan.definition.packages[0]!; + const bytes = new TextEncoder().encode("export const Card = () => null;\n"); + const paths = [ + "components/card.mjs", + ...componentSharedModules.map((_name, i) => `share/quixos/shared/runtime-${i}.mjs`), + ]; + const files = paths.map((file) => ({ + path: file, + digest: createHash("sha256").update(bytes).digest("hex"), + bytes: bytes.length, + mediaType: "text/javascript", + })); + const body: Omit = { + id: "component:card", + subject: "interface:Data@1", + compatibility: "quixos-react-component-v1", + path: paths[0]!, + exportName: "Card", + files, + sharedModules: Object.fromEntries( + componentSharedModules.map((name, i) => [name, paths[i + 1]!]), + ) as ComponentArtifact["sharedModules"], + }; + const manifest: PackageArtifacts = { + schemaVersion: 1, + packageRevisionId: pkg.revision, + bindingDigest: pkg.bindingDigest, + sourceDigest: pkg.sourceDigest, + versions: plan.definition.versions, + implementations: [], + components: [{ ...body, contentDigest: componentArtifactDigest(body) }], + }; + const world = await checkExecutionWorld(plan, [manifest], async () => bytes); + assert.equal(world.artifacts.length, 1); + assert.equal(world.artifacts[0]!.target, "browser-renderer"); + await assert.rejects( + checkExecutionWorld(plan, [{ ...manifest, components: [] }], async () => bytes), + /Missing component artifact/, + ); + const substitute = structuredClone(manifest); + substitute.components![0]!.subject = "interface:Other@1"; + const { contentDigest: _digest, ...changed } = substitute.components![0]!; + substitute.components![0]!.contentDigest = componentArtifactDigest(changed); + await assert.rejects( + checkExecutionWorld(plan, [substitute], async () => bytes), + /declared subject/, + ); + await assert.rejects( + checkExecutionWorld(plan, [manifest], async () => new Uint8Array(bytes.length)), + /Artifact bytes/, + ); + const missingShared = structuredClone(manifest); + delete (missingShared.components![0]!.sharedModules as Partial).react; + await assert.rejects( + checkExecutionWorld(plan, [missingShared], async () => bytes), + /missing fields/, + ); + + const root = await mkdtemp(path.join(os.tmpdir(), "camino-component-contract-")); + try { + for (const file of files) { + await mkdir(path.dirname(path.join(root, file.path)), { recursive: true }); + await writeFile(path.join(root, file.path), bytes); + } + await mkdir(path.join(root, "share/quixos"), { recursive: true }); + await writeFile(path.join(root, "share/quixos/package-artifacts.json"), JSON.stringify(manifest)); + const generator = "a".repeat(64); + const { receipt, sources } = expectedArtifactReceipt(plan, manifest, generator); + for (const [file, content] of sources) { + await mkdir(path.dirname(path.join(root, file)), { recursive: true }); + await writeFile(path.join(root, file), content); + } + await writeFile(path.join(root, "share/quixos/build-receipt.json"), JSON.stringify(receipt)); + const installation = await loadExecutionInstallation(plan, { [pkg.revision]: root }, generator); + assert.equal(installation.packages[0]!.service, undefined); + assert.equal(installation.components[0]!.id, "component:card"); + assert.ok(installation.routes[installation.components[0]!.url]); + assert.equal(JSON.stringify(installation.components).includes(root), false); + assert.equal(JSON.stringify(installation.components).includes("slot:"), false); + const catalog = clientContractCatalog(plan, installation, [pkg.revision]); + assert.equal(catalog.presentations[0]!.component, "component:card"); + assert.equal(catalog.components[0]!.subject, "interface:Data@1"); + assert.equal(JSON.stringify(catalog).includes(root), false); + assert.equal(JSON.stringify(catalog).includes("bindingSchema"), false); + assert.throws(() => clientContractCatalog(plan, installation, ["absent"]), /UNINSTALLED_PACKAGE/); + assert.throws( + () => clientContractCatalog(plan, { ...installation, plan: "bad" }, [pkg.revision]), + /CATALOG_PLAN_MISMATCH/, + ); + } finally { + await rm(root, { recursive: true, force: true }); + } +}); From 89414107f9be4703960a22829e498ca413168aba Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Mon, 21 Sep 2026 12:05:50 -0700 Subject: [PATCH 43/91] Add independently owned reconnectable execution units (WI-03) --- src/bindings/portable.ts | 3 +- src/execution-world/execution-groups.ts | 255 ++++++++++++++++++++++++ src/execution-world/index.ts | 1 + test/execution-groups.test.ts | 122 ++++++++++++ test/portable-bindings.test.ts | 16 ++ 5 files changed, 395 insertions(+), 2 deletions(-) create mode 100644 src/execution-world/execution-groups.ts create mode 100644 test/execution-groups.test.ts diff --git a/src/bindings/portable.ts b/src/bindings/portable.ts index 5e5e7b3..5872fbe 100644 --- a/src/bindings/portable.ts +++ b/src/bindings/portable.ts @@ -6,7 +6,6 @@ import type { DependencyPort, ExecutionContract, } from "../capability-model/types.js"; -import { hexDigest } from "../execution-world/plan.js"; export class PortableBindingError extends Error { constructor( @@ -302,5 +301,5 @@ function generateBindings( methods: all.map((m) => ({ ...m, input: portableValueSchema(m.input), output: portableValueSchema(m.output) })), }); } - return `// Generated ${remote ? "remote" : "portable"} bindings. Regenerate from the checked capability schema; do not edit.\nimport { define${mode}Registry, type ${mode}Export, type PreparedChange, type ManagedReference, type ExactReference, type ${remote ? "ServerMutationOptions" : "MutationKey"} } from ${q(options.runtimeModule ?? "@quixos/camino-replica-core")};\nexport const bindingDigest = ${q(hexDigest(schema))};\nexport const packageRevision = ${q(revision)};\nexport const target = ${q(options.target)};\nexport type Contexts = { ${contexts.join(";\n")} };\nexport type ${mode}Implementation = { ${implementations.join(";\n")} };\nexport const declarations = ${JSON.stringify(descriptors, null, 2)} as const satisfies readonly ${mode}Export[];\nexport function createRegistry(handlers: ${mode}Implementation) { const installed = { ...handlers }; return define${mode}Registry(declarations, { ${adapters.join(",\n")} }); }\n`; + return `// Generated ${remote ? "remote" : "portable"} bindings. Regenerate from the checked capability schema; do not edit.\nimport { define${mode}Registry, type ${mode}Export, type PreparedChange, type ManagedReference, type ExactReference, type ${remote ? "ServerMutationOptions" : "MutationKey"} } from ${q(options.runtimeModule ?? "@quixos/camino-replica-core")};\nexport const target = ${q(options.target)};\nexport type Contexts = { ${contexts.join(";\n")} };\nexport type ${mode}Implementation = { ${implementations.join(";\n")} };\nexport const declarations = ${JSON.stringify(descriptors, null, 2)} as const satisfies readonly ${mode}Export[];\nexport function createRegistry(handlers: ${mode}Implementation) { const installed = { ...handlers }; return define${mode}Registry(declarations, { ${adapters.join(",\n")} }); }\n`; } diff --git a/src/execution-world/execution-groups.ts b/src/execution-world/execution-groups.ts new file mode 100644 index 0000000..6edf079 --- /dev/null +++ b/src/execution-world/execution-groups.ts @@ -0,0 +1,255 @@ +import type { + BoundDependency, + DependencyBinding, + PackageExport, + PersistentAttachment, +} from "../capability-model/types.js"; +import { type ExecutionInstallation, type ExecutionGroupIdentity } from "./installation.js"; +import { type ExecutionPlan, hexDigest, ExecutionPlanError } from "./plan.js"; + +export interface ExecutionEnvironment { + /** Explicit host placement. Merely including an optional module does not select it. */ + readonly placement: "service" | "module"; + /** Exact host executable/isolation inputs, computed by the trusted installer. */ + readonly hostDigest: string; + readonly policyDigest: string; + /** Identifier of the secret/config generation; never secret material. */ + readonly credentialGeneration: string; +} +export interface InstalledExecutionGroup extends ExecutionGroupIdentity { + readonly packageRevision: string; + readonly consumedPackages: readonly string[]; +} +/** Conservative outbound closure. Runtime graph values, reverse callers, source + * provenance and the workspace epoch are deliberately absent from this identity. */ +export function compileExecutionGroups( + plan: ExecutionPlan, + installation: ExecutionInstallation, + environments: Readonly>, +): InstalledExecutionGroup[] { + if (installation.plan !== plan.digest || hexDigest(plan.definition) !== plan.digest) + throw new ExecutionPlanError("GROUP_PLAN_MISMATCH", plan.digest, "Expected one checked installation"); + const workspace = plan.definition.workspace; + const packages = new Map(workspace.packageImports.map((p) => [p.revisionId as string, p])); + const operations = new Map(plan.definition.operations.map((op) => [op.key, op])); + const attachments = new Map( + [...workspace.sharedAttachments, ...workspace.conformances.flatMap((c) => c.privateAttachments)].map((a) => [ + a.id, + a, + ]), + ); + const logical = (revision: string) => { + const pkg = packages.get(revision); + if (!pkg) throw new ExecutionPlanError("GROUP_PACKAGE_MISSING", revision, "Uninstalled consumed package"); + return pkg.packageId; + }; + const environment = (revision: string) => { + const value = environments[revision]; + if ( + !value || + !["service", "module"].includes(value.placement) || + !/^[0-9a-f]{64}$/.test(value.hostDigest) || + !/^[0-9a-f]{64}$/.test(value.policyDigest) || + !value.credentialGeneration || + value.credentialGeneration.length > 4096 + ) + throw new ExecutionPlanError( + "GROUP_ENVIRONMENT_MISSING", + revision, + "Expected checked host/policy digests and a credential generation", + ); + return value; + }; + const implementations = new Map( + installation.packages.map((pkg) => { + if (!pkg.service && !pkg.module) return [pkg.revision, undefined] as const; + const implementation = pkg[environment(pkg.revision).placement]; + if (!implementation) + throw new ExecutionPlanError( + "GROUP_IMPLEMENTATION_MISSING", + pkg.revision, + "Host selected an unavailable implementation", + ); + return [pkg.revision, implementation] as const; + }), + ); + const attachmentContract = (value: PersistentAttachment) => { + const { displayName: _name, ...rest } = value; + return value.kind === "state" + ? rest + : { ...rest, endpoints: value.endpoints.map(({ displayName: _name, ...endpoint }) => endpoint) }; + }; + const bindingContract = (value: DependencyBinding) => + value.kind === "query" ? { ...value, packageRevisionId: logical(value.packageRevisionId) } : value; + return installation.packages + .filter((p) => !!implementations.get(p.revision)) + .map((root) => { + const consumed = new Map(), + visited = new Set(), + visitedQueries = new Set(), + consumedPackages = new Set(); + const remember = (key: string, value: unknown) => consumed.set(key, value); + const storage = (id: string) => { + const value = attachments.get(id); + if (!value) throw new ExecutionPlanError("GROUP_STORAGE_MISSING", id, "Uninstalled consumed storage"); + remember(`storage:${id}`, attachmentContract(value)); + }; + // Deletion may visit related objects and their owned state. Conservatively + // include the connected schema component, including possible future edges. + const lifecycle = (atom: string) => { + const visited = new Set(), + pending = [atom]; + const atoms = ( + constraint: Extract["endpoints"][number]["constraint"], + ) => + constraint.kind === "atom" + ? [constraint.atomId as string] + : workspace.conformances + .filter((c) => c.interfaceRevisionId === constraint.interfaceRevisionId) + .map((c) => c.atomId as string); + while (pending.length) { + const current = pending.pop()!; + if (visited.has(current)) continue; + visited.add(current); + for (const owner of workspace.conformances.filter((c) => c.atomId === current)) + for (const attachment of owner.privateAttachments) storage(attachment.id); + for (const attachment of attachments.values()) + if (attachment.kind === "edge" && attachment.endpoints.some((e) => atoms(e.constraint).includes(current))) { + storage(attachment.id); + pending.push(...attachment.endpoints.flatMap((e) => atoms(e.constraint))); + } + } + }; + const targets = (binding: DependencyBinding, atom: string): string[] => { + if (binding.kind === "interface" && binding.receiver === "input") + return workspace.conformances + .filter((c) => c.interfaceRevisionId === binding.interfaceRevisionId) + .map((c) => c.atomId); + if (!("via" in binding) || !binding.via) return [atom]; + storage(binding.via.edgeTypeId); + const edge = attachments.get(binding.via.edgeTypeId); + if (!edge || edge.kind !== "edge") + throw new ExecutionPlanError("GROUP_EDGE_MISSING", atom, "Missing traversal edge"); + const endpoint = edge.endpoints.find((e) => e.projectionId !== binding.via!.projectionId)!; + const constraint = endpoint.constraint; + return constraint.kind === "atom" + ? [constraint.atomId] + : workspace.conformances + .filter((c) => c.interfaceRevisionId === constraint.interfaceRevisionId) + .map((c) => c.atomId); + }; + const query = (revision: string, id: string) => { + const key = JSON.stringify([revision, id]); + if (visitedQueries.has(key)) return; + visitedQueries.add(key); + const value = plan.definition.queries.find((q) => q.id === key); + if (!value) throw new ExecutionPlanError("GROUP_QUERY_MISSING", key, "Missing consumed query"); + remember(`query:${JSON.stringify([logical(revision), id])}`, value.query.checked.definitionDigest); + for (const operation of value.operations) visit(operation); + }; + const dependencies = (entry: PackageExport, bindings: readonly BoundDependency[], atom: string) => { + for (const bound of bindings) { + const target = bound.binding, + port = entry.dependencyPorts.find((p) => p.id === bound.portId)!; + if ("via" in target && target.via) storage(target.via.edgeTypeId); + if (target.kind === "state") storage(target.slotId); + else if (target.kind === "edge") storage(target.edgeTypeId); + else if (target.kind === "query") query(target.packageRevisionId, target.queryId); + else if (target.kind === "interface" && port.requirement.kind === "interface") { + const iface = workspace.interfaceImports.find((i) => i.revisionId === target.interfaceRevisionId)!; + for (const targetAtom of targets(target, atom)) + for (const op of port.requirement.operations ?? + iface.members.flatMap((m) => m.operations.map((o) => o.id))) + visit(JSON.stringify([targetAtom, target.interfaceRevisionId, op])); + } else if (target.kind === "creation") { + for (const seed of target.owners) { + const owner = workspace.conformances.find( + (c) => c.atomId === target.atomId && c.interfaceRevisionId === seed.interfaceRevisionId, + )!; + remember(`birth:${owner.id}`, { + id: owner.id, + atom: owner.atomId, + interface: owner.interfaceRevisionId, + initialization: owner.initialization ?? [], + }); + for (const attachment of owner.privateAttachments) storage(attachment.id); + } + } else + throw new ExecutionPlanError( + "GROUP_DEPENDENCY_UNSUPPORTED", + bound.portId, + "Cannot establish execution reuse for this dependency", + ); + } + }; + const visit = (key: string) => { + if (visited.has(key)) return; + visited.add(key); + const operation = operations.get(key); + if (!operation) throw new ExecutionPlanError("GROUP_OPERATION_MISSING", key, "Missing consumed operation"); + const binding = operation.binding; + if (binding.kind === "package") { + const pkg = packages.get(binding.packageRevisionId)!; + const implementation = implementations.get(pkg.revisionId); + if (!implementation) + throw new ExecutionPlanError( + "GROUP_IMPLEMENTATION_MISSING", + pkg.revisionId, + "Consumed package has no selected server implementation", + ); + consumedPackages.add(pkg.packageId); + remember(`implementation:${pkg.packageId}`, { + digest: implementation.contentDigest, + environment: environment(pkg.revisionId), + }); + const entry = pkg.exports.find((e) => e.id === binding.exportId)!; + const bindings = binding.dependencies.map((d) => ({ portId: d.portId, binding: bindingContract(d.binding) })); + const acceptance = (binding.acceptanceDependencies ?? []).map((d) => ({ + portId: d.portId, + binding: bindingContract(d.binding), + })); + const contract = { + input: operation.input, + output: operation.output, + execution: operation.execution, + scope: operation.scope, + binding: { + package: pkg.packageId, + export: binding.exportId, + dependencies: bindings, + acceptanceDependencies: acceptance, + }, + }; + // Deduplicate aliases of the same bound export, rather than keying its owner by reverse callers. + remember(`binding:${hexDigest(contract)}`, contract); + dependencies(entry, binding.dependencies, operation.atomId); + if (entry.acceptanceExportId) + dependencies( + pkg.exports.find((e) => e.id === entry.acceptanceExportId)!, + binding.acceptanceDependencies ?? [], + operation.atomId, + ); + } else { + remember(`operation:${key}`, operation); + if (binding.kind === "state") storage(binding.slotId); + if (binding.kind === "edge") storage(binding.edgeTypeId); + if (binding.kind === "lifecycle") lifecycle(operation.atomId); + } + }; + for (const operation of plan.definition.operations) + if (operation.binding.kind === "package" && operation.binding.packageRevisionId === root.revision) + visit(operation.key); + const own = implementations.get(root.revision)!; + const exports = packages.get(root.revision)!.exports.map(({ displayName: _name, dependencyPorts, ...entry }) => ({ + ...entry, + dependencyPorts: dependencyPorts.map(({ displayName: _name, ...port }) => port), + })); + const entries = [...consumed].sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)); + return { + logicalId: logical(root.revision), + packageRevision: root.revision, + executionDigest: `sha256:${hexDigest({ implementation: own.contentDigest, exports, environment: environment(root.revision), versions: plan.definition.versions, consumed: entries })}`, + consumedPackages: [...consumedPackages].sort(), + }; + }); +} diff --git a/src/execution-world/index.ts b/src/execution-world/index.ts index f4f31a3..d581c31 100644 --- a/src/execution-world/index.ts +++ b/src/execution-world/index.ts @@ -4,6 +4,7 @@ export * from "./ports.js"; export * from "./files.js"; export * from "./installation.js"; export * from "./client-contracts.js"; +export * from "./execution-groups.js"; export * from "./receipts.js"; diff --git a/test/execution-groups.test.ts b/test/execution-groups.test.ts new file mode 100644 index 0000000..264c427 --- /dev/null +++ b/test/execution-groups.test.ts @@ -0,0 +1,122 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { loadReaderWorkspace } from "./reader-fixture.js"; +import { buildArtifactFixture } from "./artifact-fixture.js"; +import { capabilityId as id, type WorkspaceRevision } from "../src/capability-model/types.js"; +import { + compileExecutionPlan, + compileExecutionGroups, + checkExecutionWorld, + checkedWorldDigest, + type ExecutionInstallation, + type ExecutionEnvironment, +} from "../src/execution-world/index.js"; +const environment: ExecutionEnvironment = { + placement: "service", + hostDigest: "a".repeat(64), + policyDigest: "b".repeat(64), + credentialGeneration: "config:1", +}; +const prepare = async (workspace: WorkspaceRevision) => { + const plan = compileExecutionPlan(workspace); + const fixtures = plan.definition.packages.map((pkg) => buildArtifactFixture(plan, pkg.revision)); + const world = await checkExecutionWorld( + plan, + fixtures.map((f) => f.manifest), + fixtures[0]!.read, + ); + const installation: ExecutionInstallation = { + codec: "camino-execution-installation-v1", + plan: plan.digest, + world: checkedWorldDigest(world), + routes: {}, + components: [], + packages: fixtures.map((f) => ({ + revision: f.manifest.packageRevisionId, + root: "/fixture", + service: f.manifest.implementations[0]!, + module: f.manifest.implementations[1]!, + })), + }; + const environments = Object.fromEntries(plan.definition.packages.map((pkg) => [pkg.revision, { ...environment }])); + return { plan, installation, environments, groups: () => compileExecutionGroups(plan, installation, environments) }; +}; + +test("execution reuse ignores world/source/display changes and unrelated packages", async () => { + const workspace = await loadReaderWorkspace(), + original = await prepare(workspace); + const before = original.groups()[0]!.executionDigest; + workspace.sourceRootCommit = "f".repeat(40); + workspace.packageImports[0]!.displayName = "Renamed"; + workspace.packageImports[0]!.source.commit = "e".repeat(40); + workspace.packageImports.push({ + packageId: id.package("unrelated"), + revisionId: id.packageRevision("unrelated@1"), + displayName: "Other", + source: workspace.packageImports[0]!.source, + exports: [], + }); + const after = await prepare(workspace); + assert.notEqual(after.plan.digest, original.plan.digest); + assert.equal( + after.groups().find((g) => g.logicalId === workspace.packageImports[0]!.packageId)!.executionDigest, + before, + ); + original.environments[workspace.packageImports[0]!.revisionId]!.credentialGeneration = "config:2"; + assert.notEqual(original.groups()[0]!.executionDigest, before); + original.environments[workspace.packageImports[0]!.revisionId]!.placement = "module"; + assert.notEqual(original.groups()[0]!.executionDigest, before); +}); + +test("outbound provider changes invalidate consumers while caller changes preserve providers", async () => { + const workspace = await loadReaderWorkspace((name, text) => + name === "DocumentData.qx" ? text.replace("queryable value content", "queryable portable value content") : text, + ); + const revision = id.packageRevision("provider@1"), + exportId = id.packageExport("provider:content"), + portId = id.dependencyPort("provider:state"); + workspace.packageImports.push({ + packageId: id.package("provider"), + revisionId: revision, + displayName: "Provider", + source: workspace.packageImports[0]!.source, + exports: [ + { + kind: "operation", + id: exportId, + displayName: "content", + mode: "call", + inputType: { kind: "builtin", name: "unit" }, + outputType: { kind: "scalar", name: "string" }, + execution: { kind: "snapshot", targets: ["browser", "server"] }, + receiverRequirement: { kind: "exact-atom", atomId: id.atom("atom:reader:document") }, + dependencyPorts: [ + { + id: portId, + displayName: "state", + requirement: { kind: "state", valueType: { kind: "scalar", name: "string" }, primitives: ["read"] }, + }, + ], + }, + ], + }); + const owner = workspace.conformances.find((c) => c.interfaceRevisionId === "interface:reader:document-data@1")!; + owner.operationBindings.find((b) => b.operationId === "document:content:get")!.binding = { + kind: "package", + packageRevisionId: revision, + exportId, + dependencies: [{ portId, binding: { kind: "state", slotId: id.slot("slot:document:content") } }], + }; + const prepared = await prepare(workspace); + const values = () => new Map(prepared.groups().map((g) => [g.logicalId, g.executionDigest])); + const before = values(); + prepared.installation.packages.find((p) => p.revision === "package:reader-runtime@1")!.service!.contentDigest = + "c".repeat(64); + const callerChanged = values(); + assert.equal(callerChanged.get("provider"), before.get("provider")); + assert.notEqual(callerChanged.get("package:reader-runtime"), before.get("package:reader-runtime")); + prepared.installation.packages.find((p) => p.revision === revision)!.service!.contentDigest = "d".repeat(64); + const providerChanged = values(); + assert.notEqual(providerChanged.get("provider"), callerChanged.get("provider")); + assert.notEqual(providerChanged.get("package:reader-runtime"), callerChanged.get("package:reader-runtime")); +}); diff --git a/test/portable-bindings.test.ts b/test/portable-bindings.test.ts index d2d4929..181967f 100644 --- a/test/portable-bindings.test.ts +++ b/test/portable-bindings.test.ts @@ -4,6 +4,22 @@ import { generatePortableTypeScriptBindings } from "../src/bindings/portable.js" import { compileExecutionPlan } from "../src/execution-world/plan.js"; import { loadReaderWorkspace } from "./reader-fixture.js"; +test("service bindings depend on their consumed contract, not workspace or source provenance", async () => { + const schema = compileExecutionPlan(await loadReaderWorkspace()).definition.bindingSchema; + const pkg = schema.packages[0]!; + const before = generatePortableTypeScriptBindings(schema, pkg.revisionId, { target: "server" }); + const other = structuredClone(pkg); + other.revisionId = "unrelated@1" as typeof other.revisionId; + other.exports = []; + schema.packages.push(other); + pkg.source.commit = "b".repeat(40); + pkg.revisionId = "same-service-new-source@2" as typeof pkg.revisionId; + assert.equal(generatePortableTypeScriptBindings(schema, pkg.revisionId, { target: "server" }), before); + assert.doesNotMatch(before, /export const (bindingDigest|packageRevision)/); + pkg.exports[0]!.inputType = { kind: "scalar", name: "bool" }; + assert.notEqual(generatePortableTypeScriptBindings(schema, pkg.revisionId, { target: "server" }), before); +}); + test("reader portable bindings have selected facets, creation inputs and stable keyed calls", async () => { const schema = compileExecutionPlan(await loadReaderWorkspace()).definition.bindingSchema; const source = generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", { target: "browser" }); From 09fd6b719060d66d2ac671a57bf05890b109c3e7 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Mon, 21 Sep 2026 12:52:21 -0700 Subject: [PATCH 44/91] Commit managed activation selections and reconcile forward (WI-05) --- flake.nix | 3 +- nix/checked-candidate.nix | 3 + src/execution-world/candidate.ts | 107 +++++++++++++++++++++++++++++++ src/execution-world/index.ts | 1 + test/emit-managed.ts | 38 +++++++++++ 5 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 src/execution-world/candidate.ts create mode 100644 test/emit-managed.ts diff --git a/flake.nix b/flake.nix index f805081..2e42917 100644 --- a/flake.nix +++ b/flake.nix @@ -70,6 +70,7 @@ runHook preCheck yarn test node dist/test/emit-portable-reader.js + node dist/test/emit-managed.js runHook postCheck ''; installPhase = '' @@ -85,7 +86,7 @@ cp --reflink=auto --recursive dist "$out/dist" cp package.json "$out/package.json" mkdir -p "$out/share/quixos-protocol/qualification" - cp -r dist/portable-reader "$out/share/quixos-protocol/qualification/" + cp -r dist/portable-reader dist/managed "$out/share/quixos-protocol/qualification/" mkdir -p "$out/bin" for tool in quixos-codegen-ts quixos-codegen-client quixos-qx; do printf '#!/bin/sh\nexec ${pkgs.nodejs_24}/bin/node "%s/libexec/quixos-protocol/%s.mjs" "$@"\n' "$out" "$tool" > "$out/bin/$tool" diff --git a/nix/checked-candidate.nix b/nix/checked-candidate.nix index e460047..0cba848 100644 --- a/nix/checked-candidate.nix +++ b/nix/checked-candidate.nix @@ -155,6 +155,9 @@ assert pkgs.lib.assertMsg (!execution || kind == "workspace") "Execution packages must be checked in their complete workspace; run qx-workspace check from the workspace root."; pkgs.runCommand (if contractOnly then "qx-contract" else "qx-checked-candidate") { } '' mkdir -p "$out" + cp ${ + pkgs.writeText "qx-candidate-source.json" (builtins.toJSON { inherit repository commit kind; }) + } "$out/source.json" cp ${contract}/candidate.json "$out/candidate.json" cp ${contract}/graph.json "$out/graph.json" cp ${manifest} "$out/checks.json" diff --git a/src/execution-world/candidate.ts b/src/execution-world/candidate.ts new file mode 100644 index 0000000..24046b7 --- /dev/null +++ b/src/execution-world/candidate.ts @@ -0,0 +1,107 @@ +import { open, lstat } from "node:fs/promises"; +import { constants } from "node:fs"; +import { join } from "node:path"; +import type { WorkspaceRevision } from "../capability-model/types.js"; +import { compileExecutionPlan, hexDigest, ExecutionPlanError } from "./plan.js"; +import { loadExecutionInstallation, type PackageInstallationSelection } from "./installation.js"; +import { compileKernelProgram } from "./kernel.js"; +import { compileQueryProgram } from "./queries.js"; +const rootPattern = /^\/nix\/store\/[a-z0-9]{32}-[^/\s]+$/; +async function readJson(root: string, file: string): Promise { + const handle = await open(join(root, file), constants.O_RDONLY | constants.O_NOFOLLOW); + try { + const metadata = await handle.stat(); + if (!metadata.isFile() || metadata.size > 32 * 1024 * 1024) throw Error(`Invalid checked candidate file: ${file}`); + return JSON.parse(await handle.readFile("utf8")); + } finally { + await handle.close(); + } +} +/** Revalidate the normal checked-candidate output. This is the shared artifact + * loader, not a second managed-only executable manifest or an activation grant. */ +export async function loadCheckedInstallationCandidate( + root: string, + generator: string, + selections: Readonly> = {}, +) { + if (!rootPattern.test(root) || !(await lstat(root)).isDirectory()) + throw Error("Candidate must be an immutable Nix output directory"); + const [candidate, recordedPlan, artifacts, source] = await Promise.all([ + readJson(root, "candidate.json"), + readJson(root, "execution-plan.json"), + readJson(root, "execution-artifacts.json"), + readJson(root, "source.json"), + ]); + const { executionContracts: _legacyContracts, ...workspace } = candidate; + const plan = compileExecutionPlan(workspace as WorkspaceRevision); + if (hexDigest(plan) !== hexDigest(recordedPlan)) + throw new ExecutionPlanError( + "CANDIDATE_PLAN_MISMATCH", + root, + "Recompiled source contract differs from the stored plan", + ); + if ( + source.kind !== "workspace" || + source.commit !== plan.definition.workspace.sourceRootCommit || + typeof source.repository !== "string" + ) + throw new ExecutionPlanError("CANDIDATE_SOURCE_MISMATCH", root, "Expected exact workspace source provenance"); + const repository = new URL(source.repository); + if ( + !["https:", "ssh:"].includes(repository.protocol) || + repository.username || + repository.password || + repository.hash || + repository.search + ) + throw new ExecutionPlanError("CANDIDATE_SOURCE_INVALID", root, "Expected a source URL without credentials"); + if ( + artifacts.codec !== "camino-checked-execution-v1" || + !artifacts.roots || + typeof artifacts.roots !== "object" || + Array.isArray(artifacts.roots) + ) + throw new ExecutionPlanError("CANDIDATE_ARTIFACTS_INVALID", root, "Expected checked package roots"); + for (const entry of Object.values(artifacts.roots)) + if (typeof entry !== "string" || !rootPattern.test(entry)) + throw new ExecutionPlanError( + "CANDIDATE_ARTIFACTS_INVALID", + root, + "Package artifacts must be immutable Nix roots", + ); + const installation = await loadExecutionInstallation(plan, artifacts.roots, generator, selections); + const kernel = compileKernelProgram(plan), + queries = compileQueryProgram(plan); + // The isolated runner and managed host consume the same compiled programs. + for (const [file, expected] of [ + ["kernel.json", kernel], + ["queries.json", queries], + ] as const) + if (hexDigest(await readJson(root, file)) !== hexDigest(expected)) + throw new ExecutionPlanError( + "CANDIDATE_PROGRAM_MISMATCH", + file, + "Stored interpreter input differs from checked compilation", + ); + const provenance = { + workspaceRevision: workspace.id as string, + source: { repository: source.repository as string, commit: source.commit as string }, + generator, + packages: plan.definition.packages.map((pkg) => ({ revision: pkg.revision, source: pkg.source })), + }; + const reference = { + root, + digest: hexDigest({ plan: plan.digest, world: installation.world, provenance, roots: artifacts.roots }), + }; + return { + reference, + workspace: plan.definition.workspace.workspaceId, + world: installation.world, + plan: plan.digest, + provenance, + kernel, + queries, + installation, + executionPlan: plan, + }; +} diff --git a/src/execution-world/index.ts b/src/execution-world/index.ts index d581c31..b9acf1d 100644 --- a/src/execution-world/index.ts +++ b/src/execution-world/index.ts @@ -14,3 +14,4 @@ export * from "./kernel.js"; export * from "./projections.js"; export * from "./queries.js"; export { generatePortableClientBindings } from "../bindings/portable-client.js"; +export * from "./candidate.js"; diff --git a/test/emit-managed.ts b/test/emit-managed.ts new file mode 100644 index 0000000..22e59c8 --- /dev/null +++ b/test/emit-managed.ts @@ -0,0 +1,38 @@ +/** Protocol/process qualification only; no application fixture enters runtime code. */ +import assert from "node:assert/strict"; +import { mkdir, writeFile } from "node:fs/promises"; +import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/index.js"; +import { compileExecutionPlan } from "../src/execution-world/plan.js"; +import { compileKernelProgram } from "../src/execution-world/kernel.js"; +import { compileQueryProgram } from "../src/execution-world/queries.js"; +const source = { repository: "https://example.test/device-owner.git", commit: "a".repeat(40) }; +const pkg = compileCapabilityResourceSource( + `package Owner id "package:owner" revision "package:owner@1" { + function identity id "identity" : int32 -> record { pid: int32; child: int32; } execution remote; +}`, + { source }, +); +assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); +for (const variant of ["base", "added"]) { + const commit = (variant === "base" ? "a" : "b").repeat(40); + const result = compileCapabilitySource( + `workspace Managed id "workspace:managed-process" revision "workspace:managed-process@${variant}" commit "${commit}" { + import package Owner; + ${variant === "added" ? 'atom Independent id "atom:independent";' : ""} + }`, + "workspace.qx", + { packages: new Map([["Owner", pkg.resource.revision]]), packageClosure: [pkg.resource.revision] }, + ); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const plan = compileExecutionPlan(result.workspace), + root = `dist/managed/${variant}`; + await mkdir(root, { recursive: true }); + for (const [file, value] of Object.entries({ + "candidate.json": result.workspace, + "execution-plan.json": plan, + "kernel.json": compileKernelProgram(plan), + "queries.json": compileQueryProgram(plan), + "source.json": { kind: "workspace", repository: "https://example.test/managed.git", commit }, + })) + await writeFile(`${root}/${file}`, JSON.stringify(value)); +} From d159d9b28110bdc7b548483074614d628c22fc28 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Mon, 21 Sep 2026 13:30:33 -0700 Subject: [PATCH 45/91] Host persistent Camino services and authenticated workspace bootstrap (WI-06) --- nix/check-execution.mjs | 1 + nix/checked-candidate.nix | 10 +++++++ src/execution-world/candidate.ts | 46 ++++++++++++++++++++++++++++-- src/execution-world/receipts.ts | 6 +++- test/artifact-files.test.ts | 15 ++++++++++ test/emit-managed.ts | 49 ++++++++++++++++++++++++++------ 6 files changed, 115 insertions(+), 12 deletions(-) diff --git a/nix/check-execution.mjs b/nix/check-execution.mjs index d4dbe35..585bfc7 100644 --- a/nix/check-execution.mjs +++ b/nix/check-execution.mjs @@ -7,6 +7,7 @@ const [compilerPath, planPath, checksPath, output] = process.argv.slice(2); const compiler = await import(pathToFileURL(compilerPath)); const plan = JSON.parse(await readFile(planPath, "utf8")); const checks = JSON.parse(await readFile(checksPath, "utf8")); +compiler.compileWorkspaceEntry(plan, JSON.parse(await readFile(join(output, "entry.json"), "utf8"))); const roots = Object.create(null); for (const check of checks) { if (Object.hasOwn(roots, check.packageRevisionId)) throw Error("Duplicate checked package revision"); diff --git a/nix/checked-candidate.nix b/nix/checked-candidate.nix index 0cba848..b21a155 100644 --- a/nix/checked-candidate.nix +++ b/nix/checked-candidate.nix @@ -162,6 +162,16 @@ pkgs.runCommand (if contractOnly then "qx-contract" else "qx-checked-candidate") cp ${contract}/graph.json "$out/graph.json" cp ${manifest} "$out/checks.json" ${pkgs.lib.optionalString execution '' + ${ + if builtins.pathExists "${root.directory}/quixos.entry.json" then + '' + cp ${root.directory}/quixos.entry.json "$out/entry.json" + '' + else + '' + echo null > "$out/entry.json" + '' + } cp ${contract}/execution-plan.json "$out/execution-plan.json" ${pkgs.lib.optionalString (!contractOnly) '' ${pkgs.nodejs_24}/bin/node ${./check-execution.mjs} \ diff --git a/src/execution-world/candidate.ts b/src/execution-world/candidate.ts index 24046b7..650c3f5 100644 --- a/src/execution-world/candidate.ts +++ b/src/execution-world/candidate.ts @@ -2,7 +2,7 @@ import { open, lstat } from "node:fs/promises"; import { constants } from "node:fs"; import { join } from "node:path"; import type { WorkspaceRevision } from "../capability-model/types.js"; -import { compileExecutionPlan, hexDigest, ExecutionPlanError } from "./plan.js"; +import { compileExecutionPlan, hexDigest, ExecutionPlanError, type ExecutionPlan } from "./plan.js"; import { loadExecutionInstallation, type PackageInstallationSelection } from "./installation.js"; import { compileKernelProgram } from "./kernel.js"; import { compileQueryProgram } from "./queries.js"; @@ -26,11 +26,12 @@ export async function loadCheckedInstallationCandidate( ) { if (!rootPattern.test(root) || !(await lstat(root)).isDirectory()) throw Error("Candidate must be an immutable Nix output directory"); - const [candidate, recordedPlan, artifacts, source] = await Promise.all([ + const [candidate, recordedPlan, artifacts, source, entryRequest] = await Promise.all([ readJson(root, "candidate.json"), readJson(root, "execution-plan.json"), readJson(root, "execution-artifacts.json"), readJson(root, "source.json"), + readJson(root, "entry.json"), ]); const { executionContracts: _legacyContracts, ...workspace } = candidate; const plan = compileExecutionPlan(workspace as WorkspaceRevision); @@ -70,6 +71,7 @@ export async function loadCheckedInstallationCandidate( "Package artifacts must be immutable Nix roots", ); const installation = await loadExecutionInstallation(plan, artifacts.roots, generator, selections); + const entry = compileWorkspaceEntry(plan, entryRequest); const kernel = compileKernelProgram(plan), queries = compileQueryProgram(plan); // The isolated runner and managed host consume the same compiled programs. @@ -91,7 +93,7 @@ export async function loadCheckedInstallationCandidate( }; const reference = { root, - digest: hexDigest({ plan: plan.digest, world: installation.world, provenance, roots: artifacts.roots }), + digest: hexDigest({ plan: plan.digest, world: installation.world, provenance, roots: artifacts.roots, entry }), }; return { reference, @@ -99,9 +101,47 @@ export async function loadCheckedInstallationCandidate( world: installation.world, plan: plan.digest, provenance, + entry, kernel, queries, installation, executionPlan: plan, }; } + +export function compileWorkspaceEntry(plan: ExecutionPlan, entryRequest: unknown): { operation: string } | null { + let entry: { operation: string } | null = null; + if (entryRequest !== null) { + if ( + typeof entryRequest !== "object" || + Array.isArray(entryRequest) || + Object.keys(entryRequest).sort().join(",") !== "atom,interface,operation" + ) + throw new ExecutionPlanError( + "INVALID_ENTRY_FACTORY", + "entry", + "Entry declaration must name atom, interface and operation identities", + ); + const operation = plan.definition.operations.find( + (op) => + op.atomId === (entryRequest as Record).atom && + op.interfaceRevisionId === (entryRequest as Record).interface && + op.operationId === (entryRequest as Record).operation, + ); + if ( + !operation || + operation.scope !== "class" || + operation.execution.kind !== "transaction" || + operation.input.kind !== "builtin" || + operation.input.name !== "unit" || + operation.output.kind !== "object-ref" + ) + throw new ExecutionPlanError( + "INVALID_ENTRY_FACTORY", + "entry", + "Entry must be a checked unit-input class transaction returning one object reference", + ); + entry = { operation: operation.key }; + } + return entry; +} diff --git a/src/execution-world/receipts.ts b/src/execution-world/receipts.ts index 4dd4b90..57d2665 100644 --- a/src/execution-world/receipts.ts +++ b/src/execution-world/receipts.ts @@ -35,7 +35,11 @@ export function expectedArtifactReceipt( manifest.packageRevisionId, "Receipt package/schema/source mismatch", ); - const available = new Set(manifest.implementations.map((i) => i.target)); + // A process service may implement transactions in any language. Only the + // checked JS module path promises generated TypeScript adapter evidence. + const available = new Set( + manifest.implementations.filter((i) => i.compatibility === "quixos-js-module-v1").map((i) => i.target), + ); const targets = [ ...new Set( schemaPackage.exports.flatMap((e) => (e.execution && e.execution.kind !== "remote" ? e.execution.targets : [])), diff --git a/test/artifact-files.test.ts b/test/artifact-files.test.ts index 754ca2a..c77c55b 100644 --- a/test/artifact-files.test.ts +++ b/test/artifact-files.test.ts @@ -139,3 +139,18 @@ test("remote JS modules witness generated adapters without imposing TypeScript o ); assert.deepEqual(expectedArtifactReceipt(plan, fixture.manifest, generator).receipt.generated, []); }); + +test("transaction process services do not promise generated TypeScript modules", async () => { + const { expectedArtifactReceipt, checkArtifactReceipt } = await import("../src/execution-world/receipts.js"); + const plan = compileExecutionPlan(await loadReaderWorkspace()), + fixture = buildArtifactFixture(plan); + fixture.manifest.implementations = fixture.manifest.implementations.filter( + (i) => i.compatibility === "quixos-service-v1", + ); + const generator = "a".repeat(64), + { receipt } = expectedArtifactReceipt(plan, fixture.manifest, generator); + assert.deepEqual(receipt.generated, []); + await checkArtifactReceipt(plan, fixture.manifest, receipt, generator, async () => { + throw Error("No adapter claimed"); + }); +}); diff --git a/test/emit-managed.ts b/test/emit-managed.ts index 22e59c8..5688fde 100644 --- a/test/emit-managed.ts +++ b/test/emit-managed.ts @@ -6,22 +6,52 @@ import { compileExecutionPlan } from "../src/execution-world/plan.js"; import { compileKernelProgram } from "../src/execution-world/kernel.js"; import { compileQueryProgram } from "../src/execution-world/queries.js"; const source = { repository: "https://example.test/device-owner.git", commit: "a".repeat(40) }; -const pkg = compileCapabilityResourceSource( - `package Owner id "package:owner" revision "package:owner@1" { - function identity id "identity" : int32 -> record { pid: int32; child: int32; } execution remote; +const factory = compileCapabilityResourceSource( + `external atom Entry id "atom:entry"; +interface EntryFactory id "interface:entry-factory" revision "interface:entry-factory@1" { + static operation create id "entry:create" : unit -> atom-ref { + call id "entry:create:call" execution transaction targets [server]; + } }`, { source }, ); -assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); -for (const variant of ["base", "added"]) { - const commit = (variant === "base" ? "a" : "b").repeat(40); +assert.ok(factory.ok && factory.resource.kind === "interface", JSON.stringify(factory.diagnostics)); +for (const variant of ["base", "added", "gateway", "gateway-next"]) { + const gateway = variant.startsWith("gateway"), + commit = { base: "a", added: "b", gateway: "c", "gateway-next": "d" }[variant]!.repeat(40); + const pkg = compileCapabilityResourceSource( + `${gateway ? 'external atom Entry id "atom:entry";' : ""} +package Owner id "package:owner" revision "package:owner@1" { + function identity id "identity" : int32 -> record { pid: int32; child: int32; } execution remote; + ${gateway ? 'function create id "create" : unit -> atom-ref execution transaction targets [server] requires { creation entry id "entry:birth" : Entry input unit; };' : ""} +}`, + { source }, + ); + assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); const result = compileCapabilitySource( `workspace Managed id "workspace:managed-process" revision "workspace:managed-process@${variant}" commit "${commit}" { import package Owner; - ${variant === "added" ? 'atom Independent id "atom:independent";' : ""} + ${variant !== "base" ? 'atom Independent id "atom:independent";' : ""} + ${ + gateway + ? `import interface EntryFactory; atom Entry id "atom:entry"; + conform Entry as EntryFactory id "owner:entry-factory" { + bind create.call to package Owner.create with { entry to creation Entry with {}; }; + }` + : "" + } }`, "workspace.qx", - { packages: new Map([["Owner", pkg.resource.revision]]), packageClosure: [pkg.resource.revision] }, + { + packages: new Map([["Owner", pkg.resource.revision]]), + packageClosure: [pkg.resource.revision], + ...(gateway + ? { + interfaces: new Map([["EntryFactory", factory.resource.revision]]), + interfaceClosure: [factory.resource.revision], + } + : {}), + }, ); assert.ok(result.ok, JSON.stringify(result.diagnostics)); const plan = compileExecutionPlan(result.workspace), @@ -29,6 +59,9 @@ for (const variant of ["base", "added"]) { await mkdir(root, { recursive: true }); for (const [file, value] of Object.entries({ "candidate.json": result.workspace, + "entry.json": gateway + ? { atom: "atom:entry", interface: "interface:entry-factory@1", operation: "entry:create:call" } + : null, "execution-plan.json": plan, "kernel.json": compileKernelProgram(plan), "queries.json": compileQueryProgram(plan), From a80982a780d5bd98f41eab30fd5c96df0af9fa5d Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Mon, 21 Sep 2026 14:03:14 -0700 Subject: [PATCH 46/91] Add interface-oriented client sessions and headless capability access (WI-07) --- src/execution-world/client-contracts.ts | 13 +++- src/execution-world/installation.ts | 5 ++ test/client-contracts.test.ts | 2 +- test/emit-managed.ts | 94 +++++++++++++++++++++++-- 4 files changed, 106 insertions(+), 8 deletions(-) diff --git a/src/execution-world/client-contracts.ts b/src/execution-world/client-contracts.ts index 8a9cd17..78ce3ce 100644 --- a/src/execution-world/client-contracts.ts +++ b/src/execution-world/client-contracts.ts @@ -112,7 +112,7 @@ export function generateInterfaceClientBindings( .filter((op) => op.mode === "call") .map( (op) => - `${JSON.stringify(op.displayName)}: defineInterfaceOperation<${tsType(op.inputType)}, ${tsType(op.outputType)}>(${JSON.stringify(publicOperationContract(iface, op))})`, + `${JSON.stringify(op.displayName)}: defineInterfaceOperation<${tsType(op.inputType)}, ${tsType(op.outputType)}, ${JSON.stringify(publicOperationContract(iface, op).execution)}>(${JSON.stringify(publicOperationContract(iface, op))})`, ); return `${JSON.stringify(member.displayName)}: {${operations.join(",\n")}}`; }); @@ -120,3 +120,14 @@ export function generateInterfaceClientBindings( }); return `// Generated from imported interface contracts. Regenerate; do not edit.\nimport { defineInterfaceOperation, type PreparedChange, type ManagedReference } from ${JSON.stringify(runtimeModule)};\nexport const interfaces = {${entries.join(",\n")}} as const;\n`; } + +export function generatePackageQueryClientBindings( + pkg: PackageRevision, + runtimeModule = "@quixos/camino-replica-core", +): string { + const queries = (pkg.checkedQueries ?? []).map( + (query) => + `${JSON.stringify(query.declaration.displayName)}: definePackageQuery<${tsType(query.variables)}, ${tsType(query.output)}>(${JSON.stringify(publicQueryContract(pkg, query.declaration.id))})`, + ); + return `// Generated from checked package query contracts. Regenerate; do not edit.\nimport { definePackageQuery, type ManagedReference } from ${JSON.stringify(runtimeModule)};\nexport const queries = {${queries.join(",\n")}} as const;\n`; +} diff --git a/src/execution-world/installation.ts b/src/execution-world/installation.ts index 3d595a8..6c43ef7 100644 --- a/src/execution-world/installation.ts +++ b/src/execution-world/installation.ts @@ -9,6 +9,7 @@ import { type PublicOperationContract, type PublicQueryContract, } from "./client-contracts.js"; +import { resultInterfaces } from "./projections.js"; /** Activation is assigned by graph authority, never by a package artifact. */ export interface ActiveExecutionIdentity { @@ -23,6 +24,7 @@ export interface ExecutionGroupIdentity { readonly executionDigest: string; } export interface ClientContractCatalog { + readonly resultInterfaces: Readonly>; readonly operations: readonly PublicOperationContract[]; readonly queries: readonly PublicQueryContract[]; readonly components: readonly InstalledComponent[]; @@ -58,6 +60,9 @@ export function clientContractCatalog( ), ); return { + resultInterfaces: Object.fromEntries( + plan.definition.operations.map((operation) => [operation.key, resultInterfaces(plan, operation.key)]), + ), operations, queries: packages.flatMap((pkg) => (pkg.checkedQueries ?? []).map((q) => publicQueryContract(pkg, q.declaration.id)), diff --git a/test/client-contracts.test.ts b/test/client-contracts.test.ts index 5adda40..2af458b 100644 --- a/test/client-contracts.test.ts +++ b/test/client-contracts.test.ts @@ -66,7 +66,7 @@ test("one imported operation contract links to two atom implementations without assert.equal(linkInterfaceOperation(plan, "one", contract).atomId, "one"); assert.equal(linkInterfaceOperation(plan, "two", contract).atomId, "two"); const generated = generateInterfaceClientBindings({ Data: iface }); - assert.ok(generated.includes("defineInterfaceOperation")); + assert.ok(generated.includes("defineInterfaceOperation linkInterfaceOperation(plan, "absent", contract), /UNINSTALLED_OPERATION/); diff --git a/test/emit-managed.ts b/test/emit-managed.ts index 5688fde..69b31c8 100644 --- a/test/emit-managed.ts +++ b/test/emit-managed.ts @@ -4,6 +4,11 @@ import { mkdir, writeFile } from "node:fs/promises"; import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/index.js"; import { compileExecutionPlan } from "../src/execution-world/plan.js"; import { compileKernelProgram } from "../src/execution-world/kernel.js"; +import { compileQuery } from "../src/query/compile.js"; +import { + generateInterfaceClientBindings, + generatePackageQueryClientBindings, +} from "../src/execution-world/client-contracts.js"; import { compileQueryProgram } from "../src/execution-world/queries.js"; const source = { repository: "https://example.test/device-owner.git", commit: "a".repeat(40) }; const factory = compileCapabilityResourceSource( @@ -16,21 +21,83 @@ interface EntryFactory id "interface:entry-factory" revision "interface:entry-fa { source }, ); assert.ok(factory.ok && factory.resource.kind === "interface", JSON.stringify(factory.diagnostics)); -for (const variant of ["base", "added", "gateway", "gateway-next"]) { - const gateway = variant.startsWith("gateway"), - commit = { base: "a", added: "b", gateway: "c", "gateway-next": "d" }[variant]!.repeat(40); +const data = compileCapabilityResourceSource( + `interface Data id "interface:data" revision "interface:data@1" { + queryable value label id "label" : string { + get id "label:get" execution snapshot targets [browser, server]; + set id "label:set" execution transaction targets [browser, server]; + } +}`, + { source }, +); +const constructors = compileCapabilityResourceSource( + `external atom Entry id "atom:entry"; external atom Independent id "atom:independent"; +interface Factories id "interface:factories" revision "interface:factories@1" { + static operation createOne id "create-one" : string -> atom-ref { call id "create-one:call" execution transaction targets [browser, server]; } + static operation createTwo id "create-two" : unit -> atom-ref { call id "create-two:call" execution transaction targets [browser, server]; } +}`, + { source }, +); +assert.ok(data.ok && data.resource.kind === "interface", JSON.stringify(data.diagnostics)); +assert.ok(constructors.ok && constructors.resource.kind === "interface", JSON.stringify(constructors.diagnostics)); +const dataInterface = data.resource.revision, + factoriesInterface = constructors.resource.revision; +for (const variant of ["base", "added", "gateway", "gateway-next", "session"]) { + const session = variant === "session", + gateway = session || variant.startsWith("gateway"), + commit = { base: "a", added: "b", gateway: "c", "gateway-next": "d", session: "e" }[variant]!.repeat(40); const pkg = compileCapabilityResourceSource( `${gateway ? 'external atom Entry id "atom:entry";' : ""} +${session ? 'external atom Independent id "atom:independent"; import interface Data;' : ""} package Owner id "package:owner" revision "package:owner@1" { function identity id "identity" : int32 -> record { pid: int32; child: int32; } execution remote; ${gateway ? 'function create id "create" : unit -> atom-ref execution transaction targets [server] requires { creation entry id "entry:birth" : Entry input unit; };' : ""} + ${ + session + ? `function createOne id "create-one" : string -> atom-ref execution transaction targets [browser, server] requires { creation entry id "one:birth" : Entry input unit; }; + function createTwo id "create-two" : unit -> atom-ref execution transaction targets [browser, server] requires { creation entry id "two:birth" : Independent input unit; }; + query Inputs id "inputs" root workspace Data document "inputs.graphql" operation "Inputs" { replica; } + query View id "view" root workspace Data document "view.graphql" operation "View" { local from Inputs; watch; } + query EditorInputs id "editor-inputs" root Data document "editor.graphql" operation "Editor" { replica; }` + : "" + } }`, - { source }, + { + source, + ...(session + ? { environment: { interfaces: new Map([["Data", dataInterface]]), interfaceClosure: [dataInterface] } } + : {}), + }, ); assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); + if (session) + pkg.resource.revision.checkedQueries = await Promise.all( + pkg.resource.revision.queries!.map((query) => + compileQuery( + query, + [dataInterface], + async (name) => + ({ + "inputs.graphql": + "query Inputs($label: String!) { root { objects(all: 100, where: {label: {eq: $label}}) { entries { key node { _qx {ref} label } } } } }", + "view.graphql": + "query View { root { availableObjects(all: 100) { entries { key node { _qx {ref} label } } } } }", + "editor.graphql": "query Editor { root { _qx {ref} label } }", + })[name]!, + ), + ), + ); const result = compileCapabilitySource( `workspace Managed id "workspace:managed-process" revision "workspace:managed-process@${variant}" commit "${commit}" { import package Owner; + ${ + session + ? `import interface Data; import interface Factories; + conform Entry as Factories id "owner:factories" { bind createOne.call to package Owner.createOne with { entry to creation Entry with {}; }; bind createTwo.call to package Owner.createTwo with { entry to creation Independent with {}; }; } + ${["Entry", "Independent"].map((atom) => `conform ${atom} as Data id "owner:${atom}:data" { private state ${atom}Label id "label:${atom}" on ${atom} : string policy register default "${atom}"; bind label.get to state ${atom}Label.read; bind label.set to state ${atom}Label.write; }`).join("\n")} + ` + : "" + } ${variant !== "base" ? 'atom Independent id "atom:independent";' : ""} ${ gateway @@ -47,8 +114,16 @@ package Owner id "package:owner" revision "package:owner@1" { packageClosure: [pkg.resource.revision], ...(gateway ? { - interfaces: new Map([["EntryFactory", factory.resource.revision]]), - interfaceClosure: [factory.resource.revision], + interfaces: new Map([ + ["EntryFactory", factory.resource.revision], + ...(session + ? ([ + ["Data", dataInterface], + ["Factories", factoriesInterface], + ] as const) + : []), + ]), + interfaceClosure: [factory.resource.revision, ...(session ? [dataInterface, factoriesInterface] : [])], } : {}), }, @@ -57,6 +132,13 @@ package Owner id "package:owner" revision "package:owner@1" { const plan = compileExecutionPlan(result.workspace), root = `dist/managed/${variant}`; await mkdir(root, { recursive: true }); + if (session) { + await writeFile( + `${root}/client.ts`, + generateInterfaceClientBindings({ Data: dataInterface, Factories: factoriesInterface }), + ); + await writeFile(`${root}/queries.ts`, generatePackageQueryClientBindings(pkg.resource.revision)); + } for (const [file, value] of Object.entries({ "candidate.json": result.workspace, "entry.json": gateway From 24073d7f2ac60c267fc876d7486c7fa49de44b01 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Mon, 21 Sep 2026 14:45:58 -0700 Subject: [PATCH 47/91] Add runtime-owned replica Worker bridge and structured editing (WI-08) --- test/emit-managed.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/test/emit-managed.ts b/test/emit-managed.ts index 69b31c8..4036cef 100644 --- a/test/emit-managed.ts +++ b/test/emit-managed.ts @@ -23,6 +23,9 @@ interface EntryFactory id "interface:entry-factory" revision "interface:entry-fa assert.ok(factory.ok && factory.resource.kind === "interface", JSON.stringify(factory.diagnostics)); const data = compileCapabilityResourceSource( `interface Data id "interface:data" revision "interface:data@1" { + queryable value body id "body" : string { get id "body:get" execution snapshot targets [browser, server]; edit id "body:edit" execution transaction targets [browser, server]; } + queryable value notes id "notes" : string { get id "notes:get" execution snapshot targets [browser, server]; edit id "notes:edit" execution transaction targets [browser, server]; } + operation revise id "revise" : record {body:change; notes:change; reject:bool;} -> unit {call id "revise:call" execution transaction targets [browser, server];} queryable value label id "label" : string { get id "label:get" execution snapshot targets [browser, server]; set id "label:set" execution transaction targets [browser, server]; @@ -56,8 +59,12 @@ package Owner id "package:owner" revision "package:owner@1" { session ? `function createOne id "create-one" : string -> atom-ref execution transaction targets [browser, server] requires { creation entry id "one:birth" : Entry input unit; }; function createTwo id "create-two" : unit -> atom-ref execution transaction targets [browser, server] requires { creation entry id "two:birth" : Independent input unit; }; + operation revise id "revise" : record {body:change; notes:change; reject:bool;} -> unit mode call execution transaction targets [browser, server] receiver any requires { + state body id "revise:body" : string [edit]; state notes id "revise:notes" : string [edit]; + }; query Inputs id "inputs" root workspace Data document "inputs.graphql" operation "Inputs" { replica; } query View id "view" root workspace Data document "view.graphql" operation "View" { local from Inputs; watch; } + query EditorView id "editor-view" root Data document "editor-view.graphql" operation "EditorView" { local from EditorInputs; watch; } query EditorInputs id "editor-inputs" root Data document "editor.graphql" operation "Editor" { replica; }` : "" } @@ -82,7 +89,8 @@ package Owner id "package:owner" revision "package:owner@1" { "query Inputs($label: String!) { root { objects(all: 100, where: {label: {eq: $label}}) { entries { key node { _qx {ref} label } } } } }", "view.graphql": "query View { root { availableObjects(all: 100) { entries { key node { _qx {ref} label } } } } }", - "editor.graphql": "query Editor { root { _qx {ref} label } }", + "editor.graphql": "query Editor { root { _qx {ref} label body notes } }", + "editor-view.graphql": "query EditorView { root { label body notes } }", })[name]!, ), ), @@ -94,7 +102,7 @@ package Owner id "package:owner" revision "package:owner@1" { session ? `import interface Data; import interface Factories; conform Entry as Factories id "owner:factories" { bind createOne.call to package Owner.createOne with { entry to creation Entry with {}; }; bind createTwo.call to package Owner.createTwo with { entry to creation Independent with {}; }; } - ${["Entry", "Independent"].map((atom) => `conform ${atom} as Data id "owner:${atom}:data" { private state ${atom}Label id "label:${atom}" on ${atom} : string policy register default "${atom}"; bind label.get to state ${atom}Label.read; bind label.set to state ${atom}Label.write; }`).join("\n")} + ${["Entry", "Independent"].map((atom) => `conform ${atom} as Data id "owner:${atom}:data" { private state ${atom}Label id "label:${atom}" on ${atom} : string policy register default "${atom}"; bind label.get to state ${atom}Label.read; bind label.set to state ${atom}Label.write; private state ${atom}Body id "body:${atom}" on ${atom} : string policy crdt(string) default "hello 🌍"; private state ${atom}Notes id "notes:${atom}" on ${atom} : string policy crdt(string) default "notes"; bind body.get to state ${atom}Body.read; bind body.edit to state ${atom}Body.edit; bind notes.get to state ${atom}Notes.read; bind notes.edit to state ${atom}Notes.edit; bind revise.call to package Owner.revise with {body to state ${atom}Body; notes to state ${atom}Notes;}; }`).join("\n")} ` : "" } From 2cf53280e4fa38e14bd4f7b6ab491a57eb17eae1 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Mon, 21 Sep 2026 15:24:05 -0700 Subject: [PATCH 48/91] Build checked component artifacts and shared React session SDK (WI-09) --- nix/checked-candidate.nix | 6 ++ src/capability-language/execution-scaffold.ts | 2 +- src/capability-language/parser.ts | 9 +++ src/capability-model/presentations.ts | 4 ++ src/capability-model/types.ts | 2 + src/execution-world/client-contracts.ts | 57 ++++++++++++++++++- src/execution-world/installation.ts | 2 + src/execution-world/receipts.ts | 11 ++++ test/emit-managed.ts | 16 +++++- 9 files changed, 104 insertions(+), 5 deletions(-) diff --git a/nix/checked-candidate.nix b/nix/checked-candidate.nix index b21a155..7a9c17f 100644 --- a/nix/checked-candidate.nix +++ b/nix/checked-candidate.nix @@ -119,6 +119,12 @@ let typescript = runtimePackages.camino-replica-core.dependencies; packageRevisionId = candidate.revision.revisionId; } + // pkgs.lib.optionalAttrs ((candidate.revision.components or [ ]) != [ ]) { + react = { + sdk = runtimePackages.camino-react; + runtime = runtimePackages.camino-react-runtime; + }; + } else { schema = diff --git a/src/capability-language/execution-scaffold.ts b/src/capability-language/execution-scaffold.ts index befeb3b..64d40ba 100644 --- a/src/capability-language/execution-scaffold.ts +++ b/src/capability-language/execution-scaffold.ts @@ -56,7 +56,7 @@ export async function executionScaffold( pkgs = import nixpkgs { inherit system; }; in { quixosPackages.checkedArtifacts = { plan, generator, core, sharedRuntime, typescript, packageRevisionId }: - (import (helpers + "/portable-artifacts.nix")) { + (import (helpers + "/artifacts.nix")) { inherit pkgs plan core sharedRuntime typescript packageRevisionId; protocol = generator; src = ./.; diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index 240f044..8cf297b 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -2692,6 +2692,15 @@ const compileCapabilityResourceSourceInternal = ( externalInterfaces, revision: lowerPackage(state, context, options.source), }; + if (resource.revision.components?.length) { + resource.revision.clientInterfaces = Object.fromEntries( + imports.flatMap((entry) => { + if (entry.kind !== "interface") return []; + const contract = options.environment?.interfaces?.get(entry.binding); + return contract && !contract.template ? [[entry.binding, contract.revisionId]] : []; + }), + ); + } } if (resource.kind === "interface") { diff --git a/src/capability-model/presentations.ts b/src/capability-model/presentations.ts index 8d8b147..154133e 100644 --- a/src/capability-model/presentations.ts +++ b/src/capability-model/presentations.ts @@ -15,6 +15,10 @@ export function validatePresentations(workspace: WorkspaceRevision): CapabilityV if (!contract || contract.template) fail(path, `Expected an imported closed subject interface: ${id}`); }; for (const [index, pkg] of workspace.packageImports.entries()) { + for (const [alias, id] of Object.entries(pkg.clientInterfaces ?? {})) { + text(alias, `packageImports[${index}].clientInterfaces`); + subject(id, `packageImports[${index}].clientInterfaces.${alias}`); + } const ids = new Set(pkg.exports.map((entry) => entry.id as string)); const names = new Set([ ...pkg.exports.map((entry) => entry.displayName), diff --git a/src/capability-model/types.ts b/src/capability-model/types.ts index 01e0e89..14b53d0 100644 --- a/src/capability-model/types.ts +++ b/src/capability-model/types.ts @@ -305,6 +305,8 @@ export interface WorkspacePresentation { } export interface PackageRevision { + /** Closed interface imports exposed to this package's checked component bindings. */ + clientInterfaces?: Record; controllers?: PackageController[]; components?: PackageComponent[]; queries?: import("../query/types.js").QueryDeclaration[]; diff --git a/src/execution-world/client-contracts.ts b/src/execution-world/client-contracts.ts index 78ce3ce..5bd482a 100644 --- a/src/execution-world/client-contracts.ts +++ b/src/execution-world/client-contracts.ts @@ -127,7 +127,62 @@ export function generatePackageQueryClientBindings( ): string { const queries = (pkg.checkedQueries ?? []).map( (query) => - `${JSON.stringify(query.declaration.displayName)}: definePackageQuery<${tsType(query.variables)}, ${tsType(query.output)}>(${JSON.stringify(publicQueryContract(pkg, query.declaration.id))})`, + `${JSON.stringify(query.declaration.displayName)}: definePackageQuery<${tsType(query.variables)}, ${tsType(query.output)}, ${JSON.stringify(publicQueryContract(pkg, query.declaration.id).placement)}>(${JSON.stringify(publicQueryContract(pkg, query.declaration.id))})`, ); return `// Generated from checked package query contracts. Regenerate; do not edit.\nimport { definePackageQuery, type ManagedReference } from ${JSON.stringify(runtimeModule)};\nexport const queries = {${queries.join(",\n")}} as const;\n`; } + +/** Receipt-covered bindings expose the package's imports, component subjects and + * declared queries, never the workspace's complete atom/interface inventory. */ +export function generateComponentClientBindings(plan: ExecutionPlan, packageRevision: string): string { + const pkg = plan.definition.workspace.packageImports.find((pkg) => pkg.revisionId === packageRevision); + if (!pkg || !pkg.components?.length) + throw new ExecutionPlanError("NO_COMPONENT_CONTRACT", packageRevision, "Package declares no component entries"); + const byId = new Map(plan.definition.workspace.interfaceImports.map((iface) => [iface.revisionId as string, iface])); + const find = (id: string) => { + const contract = byId.get(id); + if (!contract || contract.template) + throw new ExecutionPlanError("OPEN_CLIENT_CONTRACT", id, "Component contracts must be closed"); + return contract; + }; + const imports = Object.fromEntries( + Object.entries(pkg.clientInterfaces ?? {}).map(([alias, id]) => [alias, find(id)]), + ); + const subjects = Object.fromEntries( + pkg.components.map((component) => [component.displayName, find(component.subject)]), + ); + const interfaces = generateInterfaceClientBindings(imports, "@quixos/camino-react"); + const subjectBindings = generateInterfaceClientBindings(subjects, "@quixos/camino-react") + .split("\n") + .filter((line) => !line.startsWith("import ")) + .join("\n") + .replace("export const interfaces =", "export const subjects ="); + const queries = generatePackageQueryClientBindings(pkg, "@quixos/camino-react") + .split("\n") + .filter((line) => !line.startsWith("import ")) + .join("\n"); + return ( + interfaces + + '\nimport {definePackageQuery,type ComponentType,type ComponentProps} from "@quixos/camino-react";\n' + + subjectBindings + + "\n" + + queries + + "\nexport interface Components {\n" + + pkg.components + .map( + (component) => + `${JSON.stringify(component.displayName)}: ComponentType>;`, + ) + .join("\n") + + "\n}\n" + ); +} +export function componentAssetDeclarations(): string { + return ( + "// Generated component asset modules. Regenerate; do not edit.\n" + + ["svg", "png", "jpg", "jpeg", "gif", "webp", "avif", "woff", "woff2", "ttf", "ico"] + .map((extension) => `declare module "*.${extension}" { const value: string; export default value; }`) + .join("\n") + + '\ndeclare module "*.css";\n' + ); +} diff --git a/src/execution-world/installation.ts b/src/execution-world/installation.ts index 6c43ef7..a18832d 100644 --- a/src/execution-world/installation.ts +++ b/src/execution-world/installation.ts @@ -104,6 +104,7 @@ export interface InstalledComponent { readonly subject: string; readonly url: string; readonly exportName: string; + readonly styles: readonly string[]; readonly compatibility: ComponentArtifact["compatibility"]; readonly sharedModules: Readonly>; } @@ -163,6 +164,7 @@ export async function loadExecutionInstallation( subject: component.subject, compatibility: component.compatibility, exportName: component.exportName, + styles: component.files.filter((file) => file.mediaType === "text/css").map(contentArtifactUrl), sharedModules, url: contentArtifactUrl(component.files.find((file) => file.path === component.path)!), }); diff --git a/src/execution-world/receipts.ts b/src/execution-world/receipts.ts index 57d2665..fcd681a 100644 --- a/src/execution-world/receipts.ts +++ b/src/execution-world/receipts.ts @@ -3,6 +3,7 @@ import { generatePortableTypeScriptBindings, generateRemoteTypeScriptBindings } import { type ExecutionPlan, ExecutionPlanError, hexDigest } from "./plan.js"; import { type ArtifactReader, type PackageArtifacts } from "./artifacts.js"; import { loadArtifactWorld, type LoadedArtifactWorld } from "./files.js"; +import { generateComponentClientBindings, componentAssetDeclarations } from "./client-contracts.js"; export interface ArtifactReceipt { schemaVersion: 1; @@ -57,6 +58,16 @@ export function expectedArtifactReceipt( sources.set(path, bytes); return { target, path, digest: hashBytes(bytes), bytes: bytes.length }; }); + if (manifest.components?.length) { + for (const [path, source] of [ + ["share/quixos/generated/client.ts", generateComponentClientBindings(plan, pkg.revision)], + ["share/quixos/generated/component-assets.d.ts", componentAssetDeclarations()], + ] as const) { + const bytes = new TextEncoder().encode(source); + sources.set(path, bytes); + generated.push({ target: "window", path, digest: hashBytes(bytes), bytes: bytes.length }); + } + } // Custom language services need no TypeScript adapter. A checked JS module // exporting remote handlers does, and must carry the exact generated source. if ( diff --git a/test/emit-managed.ts b/test/emit-managed.ts index 4036cef..7861b67 100644 --- a/test/emit-managed.ts +++ b/test/emit-managed.ts @@ -45,6 +45,11 @@ assert.ok(data.ok && data.resource.kind === "interface", JSON.stringify(data.dia assert.ok(constructors.ok && constructors.resource.kind === "interface", JSON.stringify(constructors.diagnostics)); const dataInterface = data.resource.revision, factoriesInterface = constructors.resource.revision; +const ui = compileCapabilityResourceSource( + 'import interface Data; package UI id "package:ui" revision "package:ui@1" { component Card id "component:card" subject Data runtime react; }', + { source, environment: { interfaces: new Map([["Data", dataInterface]]), interfaceClosure: [dataInterface] } }, +); +assert.ok(ui.ok && ui.resource.kind === "package", JSON.stringify(ui.diagnostics)); for (const variant of ["base", "added", "gateway", "gateway-next", "session"]) { const session = variant === "session", gateway = session || variant.startsWith("gateway"), @@ -57,7 +62,8 @@ package Owner id "package:owner" revision "package:owner@1" { ${gateway ? 'function create id "create" : unit -> atom-ref execution transaction targets [server] requires { creation entry id "entry:birth" : Entry input unit; };' : ""} ${ session - ? `function createOne id "create-one" : string -> atom-ref execution transaction targets [browser, server] requires { creation entry id "one:birth" : Entry input unit; }; + ? `component Editor id "component:owner-editor" subject Data runtime react; + function createOne id "create-one" : string -> atom-ref execution transaction targets [browser, server] requires { creation entry id "one:birth" : Entry input unit; }; function createTwo id "create-two" : unit -> atom-ref execution transaction targets [browser, server] requires { creation entry id "two:birth" : Independent input unit; }; operation revise id "revise" : record {body:change; notes:change; reject:bool;} -> unit mode call execution transaction targets [browser, server] receiver any requires { state body id "revise:body" : string [edit]; state notes id "revise:notes" : string [edit]; @@ -98,6 +104,7 @@ package Owner id "package:owner" revision "package:owner@1" { const result = compileCapabilitySource( `workspace Managed id "workspace:managed-process" revision "workspace:managed-process@${variant}" commit "${commit}" { import package Owner; + ${session ? "import package UI;" : ""} ${ session ? `import interface Data; import interface Factories; @@ -118,8 +125,11 @@ package Owner id "package:owner" revision "package:owner@1" { }`, "workspace.qx", { - packages: new Map([["Owner", pkg.resource.revision]]), - packageClosure: [pkg.resource.revision], + packages: new Map([ + ["Owner", pkg.resource.revision], + ...(session ? [["UI", ui.resource.revision] as const] : []), + ]), + packageClosure: [pkg.resource.revision, ...(session ? [ui.resource.revision] : [])], ...(gateway ? { interfaces: new Map([ From e1ad15c62015e3173208be3d34b8cd5750d979d2 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Mon, 21 Sep 2026 16:01:48 -0700 Subject: [PATCH 49/91] Implement Studio root and placement capabilities on the replica graph (WI-10) --- src/bindings/portable.ts | 36 +++++++++++++++++++++++-- src/capability-model/execution.ts | 12 ++++----- src/capability-model/validation.ts | 5 +++- src/execution-world/execution-groups.ts | 6 ++++- src/execution-world/kernel.ts | 15 +++++++++++ src/execution-world/ports.ts | 5 +++- src/execution-world/reflection.ts | 28 +++++++++++++++++++ test/portable-bindings.test.ts | 2 +- test/reference-dependencies.test.ts | 13 ++++----- 9 files changed, 103 insertions(+), 19 deletions(-) create mode 100644 src/execution-world/reflection.ts diff --git a/src/bindings/portable.ts b/src/bindings/portable.ts index 5872fbe..9fb4b42 100644 --- a/src/bindings/portable.ts +++ b/src/bindings/portable.ts @@ -1,3 +1,4 @@ +import { portableReflectionType } from "../execution-world/reflection.js"; import type { BindingSchema } from "./index.js"; import type { ValueType, @@ -98,7 +99,7 @@ interface Method { name: string; portId: string; portName: string; - action: { kind: string; primitive?: string; operationId?: string }; + action: { kind: string; primitive?: string; operationId?: string; selector?: string }; input: ValueType; output: ValueType; keyed: boolean; @@ -126,6 +127,15 @@ function methods( throw new PortableBindingError(path, "Snapshot context cannot expose mutation ports"); }; switch (req.kind) { + case "reflection": + if (remote) + throw new PortableBindingError( + path, + "Use an ordinary portable snapshot capability to read installation metadata", + ); + return req.selectors.map((selector) => + method(selector, { kind: "reflection", selector }, unit, portableReflectionType(selector)), + ); case "creation": writable(); return [ @@ -301,5 +311,27 @@ function generateBindings( methods: all.map((m) => ({ ...m, input: portableValueSchema(m.input), output: portableValueSchema(m.output) })), }); } - return `// Generated ${remote ? "remote" : "portable"} bindings. Regenerate from the checked capability schema; do not edit.\nimport { define${mode}Registry, type ${mode}Export, type PreparedChange, type ManagedReference, type ExactReference, type ${remote ? "ServerMutationOptions" : "MutationKey"} } from ${q(options.runtimeModule ?? "@quixos/camino-replica-core")};\nexport const target = ${q(options.target)};\nexport type Contexts = { ${contexts.join(";\n")} };\nexport type ${mode}Implementation = { ${implementations.join(";\n")} };\nexport const declarations = ${JSON.stringify(descriptors, null, 2)} as const satisfies readonly ${mode}Export[];\nexport function createRegistry(handlers: ${mode}Implementation) { const installed = { ...handlers }; return define${mode}Registry(declarations, { ${adapters.join(",\n")} }); }\n`; + const groups = new Map(); + for (const entry of entries) { + if (!entry.application) continue; + const template = pkg.genericExports?.find((item) => item.id === entry.application!.exportId); + if (!template) throw new PortableBindingError(entry.id, "Missing generic export template"); + groups.set(template.displayName, [...(groups.get(template.displayName) ?? []), entry]); + } + const generic = [...groups].map(([name, applications]) => { + contexts.push( + `readonly ${q(name)}: ${applications.map((entry) => `Contexts[${q(entry.displayName)}]`).join(" | ")}`, + ); + const type = applications + .map( + (entry) => + `((context: Contexts[${q(entry.displayName)}]) => ${tsType(entry.outputType)} | Promise<${tsType(entry.outputType)}>)`, + ) + .join(" & "); + const handlers = applications + .map((entry) => `${q(entry.displayName)}: (context: Contexts[${q(entry.displayName)}]) => handler(context)`) + .join(","); + return `${q(name)}: (handler: ${type}) => ({${handlers}})`; + }); + return `// Generated ${remote ? "remote" : "portable"} bindings. Regenerate from the checked capability schema; do not edit.\nimport { define${mode}Registry, type ${mode}Export, type PreparedChange, type ManagedReference, type ExactReference, type ${remote ? "ServerMutationOptions" : "MutationKey"} } from ${q(options.runtimeModule ?? "@quixos/camino-replica-core")};\nexport const target = ${q(options.target)};\nexport type Contexts = { ${contexts.join(";\n")} };\nexport type ${mode}Implementation = { ${implementations.join(";\n")} };\nexport const declarations = ${JSON.stringify(descriptors, null, 2)} as const satisfies readonly ${mode}Export[];\nexport const generic = { ${generic.join(",\n")} };\nexport function createRegistry(handlers: ${mode}Implementation) { const installed = { ...handlers }; return define${mode}Registry(declarations, { ${adapters.join(",\n")} }); }\n`; } diff --git a/src/capability-model/execution.ts b/src/capability-model/execution.ts index 830cc0c..f0def04 100644 --- a/src/capability-model/execution.ts +++ b/src/capability-model/execution.ts @@ -67,15 +67,10 @@ export function validateExecutionContracts(workspace: WorkspaceRevision): Capabi ); const selected = requirement.operations; if (requirement.receiver === "input") { - if ( - entry.execution?.kind !== "snapshot" || - entry.execution.targets.length !== 1 || - entry.execution.targets[0] !== "server" || - !selected?.length - ) + if (!entry.execution || entry.execution.kind === "remote" || !selected?.length) fail( portPath, - "Reference-selected reads currently require a server-only snapshot and an explicit selection; local acquisition of dynamic inputs is not implemented", + "Reference-selected reads require a portable snapshot or transaction and an explicit selection", ); for (const id of selected ?? []) { const operation = contract && operations(id, contract); @@ -108,6 +103,9 @@ export function validateExecutionContracts(workspace: WorkspaceRevision): Capabi fail(portPath, "Portable operations require a local query dependency"); } else if (requirement.kind === "creation") { if (entry.execution.kind !== "transaction") fail(portPath, "Object creation requires transaction execution"); + } else if (requirement.kind === "reflection") { + if (requirement.selectors.some((selector) => selector !== "presentations")) + fail(portPath, "Only checked presentation metadata is portable"); } else if (requirement.kind !== "interface") fail(portPath, `Portable execution does not support ${requirement.kind} dependencies`); } diff --git a/src/capability-model/validation.ts b/src/capability-model/validation.ts index 22682c9..99563e0 100644 --- a/src/capability-model/validation.ts +++ b/src/capability-model/validation.ts @@ -1065,7 +1065,10 @@ const validatePackages = ( !port.requirement.selectors.length || new Set(port.requirement.selectors).size !== port.requirement.selectors.length || port.requirement.selectors.some( - (kind) => !["active", "atoms", "interfaces", "conformances", "queries", "indexes"].includes(kind), + (kind) => + !["active", "atoms", "interfaces", "conformances", "queries", "indexes", "presentations"].includes( + kind, + ), ) ) issue(issues, "invalid-dependency-binding", portPath, "Reflection requires distinct supported selectors"); diff --git a/src/execution-world/execution-groups.ts b/src/execution-world/execution-groups.ts index 6edf079..2b07126 100644 --- a/src/execution-world/execution-groups.ts +++ b/src/execution-world/execution-groups.ts @@ -1,3 +1,4 @@ +import { portableReflectionValue } from "./reflection.js"; import type { BoundDependency, DependencyBinding, @@ -152,7 +153,10 @@ export function compileExecutionGroups( const target = bound.binding, port = entry.dependencyPorts.find((p) => p.id === bound.portId)!; if ("via" in target && target.via) storage(target.via.edgeTypeId); - if (target.kind === "state") storage(target.slotId); + if (target.kind === "reflection") { + for (const selector of target.selectors) + remember("reflection:" + selector, portableReflectionValue(workspace, selector)); + } else if (target.kind === "state") storage(target.slotId); else if (target.kind === "edge") storage(target.edgeTypeId); else if (target.kind === "query") query(target.packageRevisionId, target.queryId); else if (target.kind === "interface" && port.requirement.kind === "interface") { diff --git a/src/execution-world/kernel.ts b/src/execution-world/kernel.ts index 87cc5dc..fd338b7 100644 --- a/src/execution-world/kernel.ts +++ b/src/execution-world/kernel.ts @@ -1,3 +1,4 @@ +import { portableReflectionType, portableReflectionValue } from "./reflection.js"; import type { ValueType, InitializationField, @@ -119,6 +120,20 @@ export function compileKernelProgram(plan: ExecutionPlan): unknown { const requirement = entry.dependencyPorts.find((p) => p.id === dependency.portId)!.requirement; const bound = dependency.binding; const common = { id: dependency.portId, ...via(bound) }; + if (bound.kind === "reflection" && requirement.kind === "reflection") + return { + ...common, + kind: "reflection", + values: Object.fromEntries( + bound.selectors.map((selector) => [ + selector, + { + schema: portableValueSchema(portableReflectionType(selector)), + value: portableReflectionValue(workspace, selector), + }, + ]), + ), + }; if (bound.kind === "state" && requirement.kind === "state") return { ...common, diff --git a/src/execution-world/ports.ts b/src/execution-world/ports.ts index 7896193..d26e5a3 100644 --- a/src/execution-world/ports.ts +++ b/src/execution-world/ports.ts @@ -2,6 +2,7 @@ * operation/port schema by the coordinator, not trusted because this header parsed. */ export const transactionPortAbi = "quixos-transaction-ports-v1"; export type PortAction = + | { kind: "reflection"; selector: string } | { kind: "state"; primitive: "read" | "write" | "edit" } | { kind: "edge"; primitive: "resolve" | "disconnect" } | { kind: "edge"; primitive: "connect"; key: string } @@ -75,7 +76,9 @@ export function checkPortInvocation(value: unknown): PortInvocation { identifier(action.operationId) : action.kind === "creation" ? exact(["kind", "key"]) && identifier(action.key) - : action.kind === "query" && exact(["kind"]); + : action.kind === "reflection" + ? exact(["kind", "selector"]) && identifier(action.selector) + : action.kind === "query" && exact(["kind"]); if (!valid) throw new Error("Invalid port action"); return { ...fields, action: { ...action } } as unknown as PortInvocation; } diff --git a/src/execution-world/reflection.ts b/src/execution-world/reflection.ts new file mode 100644 index 0000000..d513ebe --- /dev/null +++ b/src/execution-world/reflection.ts @@ -0,0 +1,28 @@ +import type { ValueType, WorkspaceRevision } from "../capability-model/types.js"; +import { ExecutionPlanError } from "./plan.js"; +const string: ValueType = { kind: "scalar", name: "string" }; +/** Narrow immutable installation metadata. No graph enumeration or live reflection. */ +export function portableReflectionType(selector: string): ValueType { + if (selector !== "presentations") + throw new ExecutionPlanError( + "UNSUPPORTED_PORTABLE_REFLECTION", + selector, + "Only checked presentation metadata is portable", + ); + return { + kind: "list", + value: { kind: "record", fields: { id: string, subject: string, atoms: { kind: "list", value: string } } }, + }; +} +export function portableReflectionValue(workspace: WorkspaceRevision, selector: string) { + portableReflectionType(selector); + return (workspace.presentations ?? []) + .map((p) => ({ + id: p.id, + subject: p.subject, + atoms: [ + ...new Set(workspace.conformances.filter((c) => c.interfaceRevisionId === p.subject).map((c) => c.atomId)), + ].sort(), + })) + .sort((a, b) => a.id.localeCompare(b.id)); +} diff --git a/test/portable-bindings.test.ts b/test/portable-bindings.test.ts index 181967f..1f8b458 100644 --- a/test/portable-bindings.test.ts +++ b/test/portable-bindings.test.ts @@ -50,7 +50,7 @@ test("generation rejects remote dependencies, wrong effects and unsupported shap assert.throws(generate, /not an object call available in portable target browser/); getter.execution = { kind: "snapshot", targets: ["browser", "server"] }; entry.dependencyPorts[0]!.requirement = { kind: "reflection", selectors: ["active"] }; - assert.throws(generate, /Unsupported reflection port/); + assert.throws(generate, /Only checked presentation metadata is portable/); }); test("closed generic portable handlers have distinct concrete codecs and no universal casts", async () => { diff --git a/test/reference-dependencies.test.ts b/test/reference-dependencies.test.ts index cb050be..d80b2b0 100644 --- a/test/reference-dependencies.test.ts +++ b/test/reference-dependencies.test.ts @@ -23,8 +23,8 @@ const workspace = `workspace Test id "workspace:test" revision "workspace:test@1 bind peek.call to package Runtime.peek with { peers to interface Data from input; }; } }`; -function compile(packageSource = pkg, workspaceSource = workspace) { - const contract = compileCapabilityResourceSource(iface, { source }); +function compile(packageSource = pkg, workspaceSource = workspace, interfaceSource = iface) { + const contract = compileCapabilityResourceSource(interfaceSource, { source }); assert.ok(contract.ok && contract.resource.kind === "interface", JSON.stringify(contract.diagnostics)); const interfaces = new Map([["Data", contract.resource.revision]]); const runtime = compileCapabilityResourceSource(packageSource, { source, environment: { interfaces } }); @@ -82,8 +82,9 @@ test("closed generic specialization preserves reference-selected interface ports ); }); -test("dynamic reference reads do not promise an unimplemented client input closure", () => { - const result = compile(pkg.replace("targets [server]", "targets [browser, server]")); - assert.equal(result.ok, false); - assert.ok(result.diagnostics.some((diagnostic) => diagnostic.message.includes("local acquisition"))); +test("portable input-selected reads require the dependency's declared target support", () => { + const portable = pkg.replaceAll("targets [server]", "targets [browser, server]"); + assert.equal(compile(portable).ok, false); + const result = compile(portable, workspace, iface.replaceAll("targets [server]", "targets [browser, server]")); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); }); From 1e08ccd9375f84ef4919428d434f3bc83ee8daeb Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Mon, 21 Sep 2026 16:59:35 -0700 Subject: [PATCH 50/91] Build and activate checked component packages through normal source authoring (WI-12) --- src/capability-language/component-scaffold.ts | 79 ++++ .../controller-scaffold.ts | 42 ++ src/capability-language/execution-scaffold.ts | 26 +- src/capability-language/scaffold-recipes.ts | 425 ++---------------- src/capability-language/structural-plan.ts | 25 +- src/capability-language/tool-cli.ts | 64 +-- src/execution-world/index.ts | 2 + src/query/compile.ts | 11 +- test/component-scaffold.test.ts | 99 ++++ test/query-structured.test.ts | 18 + test/scaffold-recipes.test.ts | 116 +---- 11 files changed, 336 insertions(+), 571 deletions(-) create mode 100644 src/capability-language/component-scaffold.ts create mode 100644 src/capability-language/controller-scaffold.ts create mode 100644 test/component-scaffold.test.ts diff --git a/src/capability-language/component-scaffold.ts b/src/capability-language/component-scaffold.ts new file mode 100644 index 0000000..ff25544 --- /dev/null +++ b/src/capability-language/component-scaffold.ts @@ -0,0 +1,79 @@ +import fs from "node:fs/promises"; +import path from "node:path"; +import { parseQx, walkSyntax } from "./source.js"; +import type { ScaffoldRecipe } from "./scaffold-recipes.js"; +import type { StructuralRequest } from "./structural-plan.js"; + +/** Add one ordinary component entry without regenerating existing application code. */ +export async function scaffoldComponent( + root: string, + prefix: string, + spec: ScaffoldRecipe, +): Promise { + if (!spec.declaration || !spec.name || !/^[A-Z][A-Za-z0-9_]*$/.test(spec.name) || !spec.id) + throw Error("Component scaffold requires a PascalCase name, ID and QX declaration"); + const source = `package Draft id "draft" revision "draft@1" { ${spec.declaration} }`; + const syntax = parseQx(source); + const declarations = [...walkSyntax(syntax.root)].filter((node) => node.kind === "componentDecl"); + const pkg = syntax.root.children.find((node) => node.kind === "packageResourceDecl"); + if ( + syntax.diagnostics.length || + syntax.root.children.length !== 1 || + declarations.length !== 1 || + pkg?.children.filter((node) => node.kind === "packageExport").length !== 1 + ) + throw Error("Expected exactly one component declaration"); + const declaration = declarations[0]!; + const identifier = declaration.children.find((node) => node.kind === "identifier"); + const id = declaration.children.find((node) => node.kind === "stringLiteral"); + if ( + !identifier || + source.slice(identifier.start, identifier.end) !== spec.name || + !id || + JSON.parse(source.slice(id.start, id.end)) !== spec.id + ) + throw Error("Component declaration name/ID must match its registration"); + const authored = await fs.readFile(path.join(root, prefix, "package.qx"), "utf8"); + const existing = parseQx(authored); + const parent = existing.root.children.find((node) => node.kind === "packageResourceDecl"); + if (existing.diagnostics.length || !parent) throw Error("Fix package.qx before adding a component"); + for (const item of parent.children.filter((node) => node.kind === "packageExport").flatMap((node) => node.children)) { + const name = item.children.find((node) => node.kind === "identifier"); + const literal = item.children.find((node) => node.kind === "stringLiteral"); + if ( + (name && authored.slice(name.start, name.end) === spec.name) || + (literal && JSON.parse(authored.slice(literal.start, literal.end)) === spec.id) + ) + throw Error("Component requires a unique name and ID"); + } + const filename = "quixos.components.json"; + const before = await fs.readFile(path.join(root, prefix, filename), "utf8"); + const entries: Record = JSON.parse(before); + if (!entries || typeof entries !== "object" || Array.isArray(entries) || Object.hasOwn(entries, spec.id)) + throw Error("Invalid or duplicate component entry"); + entries[spec.id] = { entry: `src/components/${spec.name}.tsx`, export: spec.name }; + const parentID = parent.children.find((node) => node.kind === "stringLiteral")!; + return { + kind: "package", + source: spec.source, + resourceRoot: spec.directory, + validation: "syntax", + files: [ + { + file: prefix + "package.qx", + edits: [ + { + operation: "append", + parent: { kind: "packageResourceDecl", id: JSON.parse(authored.slice(parentID.start, parentID.end)) }, + source: spec.declaration, + }, + ], + }, + { file: prefix + filename, expected: before, replace: JSON.stringify(entries, null, 2) + "\n" }, + { + file: prefix + `src/components/${spec.name}.tsx`, + create: `import type { Components } from "../gen/client.js";\n\n// Add explicit query admission and named interface operations from the generated client.\nexport const ${spec.name}: Components[${JSON.stringify(spec.name)}] = ({subject}) =>

{subject.object}

;\n`, + }, + ], + }; +} diff --git a/src/capability-language/controller-scaffold.ts b/src/capability-language/controller-scaffold.ts new file mode 100644 index 0000000..d2e532f --- /dev/null +++ b/src/capability-language/controller-scaffold.ts @@ -0,0 +1,42 @@ +import fs from "node:fs/promises"; +import path from "node:path"; +import type { ScaffoldRecipe } from "./scaffold-recipes.js"; +import type { StructuralRequest } from "./structural-plan.js"; +export async function scaffoldController( + root: string, + prefix: string, + spec: ScaffoldRecipe, +): Promise { + const entry = { id: spec.id, ...spec.controller }; + const fields = ["id", "subject", "snapshot", "remote", "input"]; + if ( + Object.keys(entry).length !== fields.length || + fields.some((key) => typeof (entry as Record)[key] !== "string") || + !["unit", "value"].includes(entry.input ?? "") + ) + throw Error("Controller requires id, subject, snapshot, remote and input (unit/value)"); + const file = prefix + "quixos.controllers.json"; + let before: string | undefined; + try { + before = await fs.readFile(path.join(root, file), "utf8"); + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error; + } + const catalog = before ? JSON.parse(before) : { schemaVersion: 1, controllers: [] }; + if ( + catalog.schemaVersion !== 1 || + !Array.isArray(catalog.controllers) || + catalog.controllers.length >= 1000 || + catalog.controllers.some((c: { id: string }) => c.id === entry.id) + ) + throw Error("Invalid catalog or duplicate controller ID"); + catalog.controllers.push(entry); + const content = JSON.stringify(catalog, null, 2) + "\n"; + return { + kind: "package", + source: spec.source, + resourceRoot: spec.directory, + validation: "syntax", + files: [before === undefined ? { file, create: content } : { file, expected: before, replace: content }], + }; +} diff --git a/src/capability-language/execution-scaffold.ts b/src/capability-language/execution-scaffold.ts index 64d40ba..9ec6fb5 100644 --- a/src/capability-language/execution-scaffold.ts +++ b/src/capability-language/execution-scaffold.ts @@ -26,7 +26,7 @@ export async function executionScaffold( ): Promise { if (!spec.name || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(spec.name) || !spec.id) throw new Error("Execution scaffold requires a simple name and an ID"); - if (spec.initialFiles) throw new Error("Edit execution source after scaffolding; initialFiles is not supported"); + if (spec.initialFiles && command !== "package") throw new Error("Initial files are only for new packages"); const files: StructuralRequest["files"] = []; const create = (file: string, content: string) => files.push({ file: prefix + file, create: content }); if (command === "package") { @@ -37,6 +37,7 @@ export async function executionScaffold( formatQuixosLock({ formatVersion: 1, quixos: { resolver: "git", ...spec.tools.quixos }, resources: [] }), ); create("quixos.check.json", json({ backend: "execution" })); + create("quixos.components.json", "{}\n"); create("package.json", json({ name: `@quixos/${spec.name.toLowerCase()}`, private: true, type: "module" })); create(".gitignore", "node_modules/\ndist/\nsrc/gen/\n.quixos/\nresult\n"); for (const lane of ["browser", "server", "remote"]) @@ -55,11 +56,15 @@ export async function executionScaffold( flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; }; in { - quixosPackages.checkedArtifacts = { plan, generator, core, sharedRuntime, typescript, packageRevisionId }: + quixosPackages.checkedArtifacts = { plan, generator, core, sharedRuntime, typescript, packageRevisionId, react ? null }: (import (helpers + "/artifacts.nix")) { inherit pkgs plan core sharedRuntime typescript packageRevisionId; protocol = generator; src = ./.; + components = let entries = builtins.fromJSON (builtins.readFile ./quixos.components.json); in + if entries == {} then null else + if react == null then throw "Component entries require the workspace-selected React runtime" else + { inherit (react) sdk runtime; inherit entries; }; portable = { entry = "src/server.ts"; entries.browser = "src/browser.ts"; @@ -73,7 +78,7 @@ export async function executionScaffold( ); create( "README.md", - `# ${spec.name}\n\nThis execution package exports checked browser/server modules and a process service.\nUse scaffold function with an explicit execution contract to add a typed handler.\nSnapshot/transaction targets choose browser.ts and/or server.ts; remote handlers\nuse remote.ts. Shared helpers are ordinary imports. Generated bindings are build\noutputs, not authored source. The coordinator supplies the checked workspace plan\nand runtime dependencies to checkedArtifacts.\n\nThe execution scaffold currently requires the execution artifact build path;\nlegacy checkedServer verification and activation do not install these artifacts.\nA source-only structural check is not runtime qualification.\n`, + `# ${spec.name}\n\nThis execution package exports checked browser/server modules and a process service.\nUse scaffold function with an explicit execution contract to add a typed handler.\nSnapshot/transaction targets choose browser.ts and/or server.ts; remote handlers\nuse remote.ts. Shared helpers are ordinary imports. Generated bindings are build\noutputs, not authored source. The coordinator supplies the checked workspace plan\nand runtime dependencies to checkedArtifacts.\n\nRun qx-workspace check from the workspace root to compile exact source and build\nchecked artifacts. Activate the resulting report separately through the workspace\nhost. A source-only structural check is not runtime qualification.\n`, ); } else if (command === "function") { if (!spec.declaration) @@ -154,5 +159,20 @@ export async function executionScaffold( } } else throw new Error("Execution packages use ordinary factory transactions; migration scaffolding is not supported"); + if (spec.initialFiles) { + for (const [file, content] of Object.entries(spec.initialFiles)) { + if ( + typeof content !== "string" || + !/^(?:package\.qx|quixos\.components\.json|quixos\.controllers\.json|README\.md|(?:src|queries)\/(?:[A-Za-z0-9_-]+\/)*[A-Za-z0-9_.-]+)$/.test( + file, + ) || + file.split("/").some((part) => part === ".." || part === "." || part === "gen") + ) + throw new Error("Not an initial authored execution file: " + file); + const previous = files.findIndex((entry) => entry.file === prefix + file); + if (previous >= 0) files.splice(previous, 1); + create(file, content); + } + } return { kind: "package", source: spec.source, resourceRoot: spec.directory, validation: "syntax", files }; } diff --git a/src/capability-language/scaffold-recipes.ts b/src/capability-language/scaffold-recipes.ts index 37883ec..a0a8f15 100644 --- a/src/capability-language/scaffold-recipes.ts +++ b/src/capability-language/scaffold-recipes.ts @@ -1,29 +1,12 @@ -import fs from "node:fs/promises"; -import path from "node:path"; -import { contentDigest } from "../capability-model/evolution.js"; -import { - validateMigrationCatalog, - type MigrationCatalog, - type MigrationDeclaration, -} from "../capability-model/migrations.js"; -import { formatQuixosLock, type GitSource } from "../resource-lock/index.js"; -import { parseQx, walkSyntax } from "./source.js"; +import type { GitSource } from "../resource-lock/index.js"; import type { StructuralRequest } from "./structural-plan.js"; -import { addImplementation } from "./implementation-edit.js"; -import { reactPlatformTypes } from "../bindings/react-platform.js"; import { executionScaffold, isExecutionScaffold } from "./execution-scaffold.js"; +import { scaffoldController } from "./controller-scaffold.js"; +import { scaffoldComponent } from "./component-scaffold.js"; import { scaffoldQuery } from "./query-scaffold.js"; - type Source = { repository: string; commit: string }; -type PackageEditModel = { - generatedBy: "qx-scaffold-v1"; - name: string; - id: string; - revision: string; - exports: { name: string; id: string; file: string; migration?: boolean }[]; -}; export type ScaffoldRecipe = { - template?: "typescript" | "typescript-react" | "typescript-execution"; + template?: "typescript-execution" | "typescript-component"; source: Source; directory?: string; name?: string; @@ -31,16 +14,13 @@ export type ScaffoldRecipe = { revision?: string; declaration?: string; queryDocument?: string; - /** Initial authored files for a composed recipe; only used for a new package. */ initialFiles?: Record; - tools?: { quixos: Source; protocol: Source; helpers: Source; sdk: Source }; - nixifyPluginUrl?: string; - migration?: Omit & { contracts: Record }; + controller?: { subject: string; snapshot: string; remote: string; input: "unit" | "value" }; + tools?: { quixos: Source; protocol: Source; helpers: Source; sdk?: Source }; }; -const json = (value: unknown) => `${JSON.stringify(value, null, 2)}\n`; const source = (value: Source): GitSource => { if (!value || typeof value.repository !== "string" || typeof value.commit !== "string") - throw new Error("Scaffold requires an exact source identity; use qx-workspace from a registered repository"); + throw Error("Scaffold requires an exact source identity; use a registered repository"); const url = new URL(value.repository); if ( url.protocol !== "https:" || @@ -50,383 +30,36 @@ const source = (value: Source): GitSource => { url.hash || !/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/.test(value.commit) ) - throw new Error("Scaffolds require credential-free HTTPS sources and full exact commits"); + throw Error("Scaffolds require credential-free HTTPS sources and full exact commits"); return { resolver: "git", ...value }; }; const nixSource = (value: Source) => `git+${source(value).repository}?ref=refs/tags/quixos-reachability/${value.commit}&rev=${value.commit}`; -const nixString = (value: string) => JSON.stringify(value).replaceAll("${", "\\${"); -const safeName = (name: string | undefined): string => { - if (!name || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) throw new Error("Scaffold requires a simple authored name"); - return name; -}; -const ownedJson = async (root: string, file: string): Promise => { - const target = path.join(root, file); - if (!(await fs.realpath(target)).startsWith(`${await fs.realpath(root)}/`)) - throw new Error("Scaffold input escapes repository"); - const value = JSON.parse(await fs.readFile(target, "utf8")); - if (value.generatedBy !== "qx-scaffold-v1") throw new Error(`Not scaffold-owned: ${file}`); - return value; -}; - -/** Recipes describe structural edits; planStructure owns validation/journaling. - * Implementation files are created once; later edits preserve authored wiring. */ -export const scaffoldRecipe = async ( +/** One-shot edits; structural planning retains interrupted work and authored files. */ +export async function scaffoldRecipe( root: string, - command: "package" | "function" | "migration" | "refresh" | "query", + command: "package" | "function" | "component" | "controller" | "query" | "migration" | "refresh", spec: ScaffoldRecipe, -): Promise => { +): Promise { if (command === "refresh") - throw new Error( - "Scaffold refresh has been removed. Edit declarations and typed server wiring directly, then run qx-workspace check. Use scaffold function to add a declaration and handler together.", + throw Error( + "Scaffold refresh is removed. Edit authored code and run check; add entries with scaffold function/component/query.", + ); + if (command === "migration") + throw Error( + "Old-workspace migration scaffolding is retired. Current disposable workspaces do not require migration code.", ); source(spec.source); if (spec.directory && !/^[A-Za-z0-9_-][A-Za-z0-9_.-]*(?:\/[A-Za-z0-9_-][A-Za-z0-9_.-]*)*$/.test(spec.directory)) - throw new Error("Scaffold directory must be contained"); - const prefix = spec.directory ? `${spec.directory}/` : ""; + throw Error("Scaffold directory must be contained"); + if (spec.template && !["typescript-execution", "typescript-component"].includes(spec.template)) + throw Error("Use typescript-execution or typescript-component; old server/source-string presets are retired"); + const prefix = spec.directory ? spec.directory + "/" : ""; + if (command !== "package" && !(await isExecutionScaffold(root, prefix))) + throw Error("Scaffolding requires a checked execution package"); + if (spec.tools) Object.values(spec.tools).forEach(source); + if (command === "controller") return scaffoldController(root, prefix, spec); + if (command === "component") return scaffoldComponent(root, prefix, spec); if (command === "query") return scaffoldQuery(root, prefix, spec); - if ( - spec.template === "typescript-execution" || - (command !== "package" && (await isExecutionScaffold(root, prefix))) - ) { - if (spec.tools) Object.values(spec.tools).forEach(source); - return executionScaffold(root, command, spec, prefix, nixSource); - } - const files: StructuralRequest["files"] = []; - const create = (file: string, content: string) => files.push({ file: prefix + file, create: content }); - const generated = (file: string, content: string) => files.push({ file: prefix + file, generated: content }); - let packageModel: PackageEditModel; - let catalog: MigrationCatalog & { generatedBy: "qx-scaffold-v1" }; - if (command === "package") { - const name = safeName(spec.name); - if (spec.template && !["typescript", "typescript-react"].includes(spec.template)) - throw new Error("Unknown package template"); - const react = spec.template === "typescript-react"; - if (!spec.id || !spec.revision || !spec.tools) - throw new Error("Package scaffold requires id, revision, and exact quixos/protocol/helpers/sdk tool sources"); - Object.values(spec.tools).forEach(source); - packageModel = { generatedBy: "qx-scaffold-v1", name, id: spec.id, revision: spec.revision, exports: [] }; - catalog = { generatedBy: "qx-scaffold-v1", schemaVersion: 1, contracts: {}, migrations: [] }; - if (react) - packageModel.exports.push({ name: "sourceGet", id: `export:${name}:source`, file: "src/impl/sourceGet.ts" }); - create( - "package.qx", - `package ${name} id ${JSON.stringify(spec.id)} revision ${JSON.stringify(spec.revision)} {\n${react ? ` function sourceGet id ${JSON.stringify(`export:${name}:source`)} : unit -> string;\n` : ""}}\n`, - ); - create("quixos.lock", formatQuixosLock({ formatVersion: 1, quixos: source(spec.tools.quixos), resources: [] })); - create( - "package.json", - json({ - name: `@quixos/${name.toLowerCase()}`, - version: "0.1.0", - private: true, - type: "module", - packageManager: "yarn@4.18.0", - scripts: { build: "tsc -p tsconfig.json", typecheck: "tsc --noEmit" }, - dependencies: { - "@quixos/camino-package-runtime": `${spec.tools.sdk.repository}#commit=${spec.tools.sdk.commit}`, - }, - devDependencies: { - "@types/node": "^24", - typescript: "^7.0.2", - ...(react ? { react: "^18.3.1", "@types/react": "^18.3.12", esbuild: "^0.25.12" } : {}), - }, - }), - ); - create( - "tsconfig.json", - json({ - compilerOptions: { - target: "ES2023", - module: "NodeNext", - moduleResolution: "NodeNext", - strict: true, - types: ["node", ...(react ? ["react"] : [])], - outDir: "dist", - rootDir: "src", - skipLibCheck: true, - ...(react ? { jsx: "react-jsx", esModuleInterop: true } : {}), - }, - include: ["src/**/*.ts", "src/**/*.tsx"], - }), - ); - if (react) { - create( - "src/component.tsx", - `// Add a checked props export, select it in quixos.check.json options.react,\n// then use its generated ReactResults type. Scaffold bundle does this for you.\nexport default function Component(_props: {camino: Record; render: unknown; dispatch: (action: unknown) => void}) {\n return

${name}

;\n}\n`, - ); - create( - "src/impl/sourceGet.ts", - `import componentSource from "../component.js?browser-source";\nimport type {Implementation} from "../gen/qx.js";\nexport const handler: Implementation["sourceGet"] = () => componentSource;\n`, - ); - create( - "src/browser-assets.d.ts", - `declare module "*?browser-source" { const source: string; export default source; }\ndeclare module "*.css" {}\n`, - ); - create("src/gen/web-studio-react-runtime.d.ts", reactPlatformTypes); - } - create(".gitignore", "node_modules/\ndist/\n.quixos/\nresult\n.yarn/install-state.gz\n"); - create( - ".yarnrc.yml", - `nodeLinker: node-modules\nenableScripts: true\nnpmMinimalAgeGate: 0\napprovedGitRepositories:\n - ${JSON.stringify(spec.tools.sdk.repository)}\nsupportedArchitectures:\n os: [current, linux]\n cpu: [current, x64, arm64]\n libc: [current, glibc]\n`, - ); - const nixifyPluginUrl = - spec.nixifyPluginUrl ?? - "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/yarn-plugin-nixify-patched/raw/commit/4528fdd20b30d869262443b3f044549810e75fb8/dist/yarn-plugin-nixify.js"; - const plugin = new URL(nixifyPluginUrl); - if ( - plugin.protocol !== "https:" || - plugin.username || - plugin.password || - plugin.search || - plugin.hash || - !/\/commit\/[a-f0-9]{40,64}\//.test(plugin.pathname) - ) - throw new Error("Nixify plugin must have an exact credential-free HTTPS commit URL"); - generated("quixos.toolchain.json", json({ generatedBy: "qx-scaffold-v1", nixifyPluginUrl })); - create( - "quixos.check.json", - json({ - backend: "typescript", - bindingOutput: "src/gen/qx.ts", - ...(react - ? { - options: { react: { propsExports: [] } }, - } - : {}), - }), - ); - create( - "flake.nix", - `{ - inputs.protocol.url = ${nixString(nixSource(spec.tools.protocol))}; - inputs.nixpkgs.follows = "protocol/nixpkgs"; - inputs.flake-utils.follows = "protocol/flake-utils"; - inputs.helpers = { url = ${nixString(nixSource(spec.tools.helpers))}; flake = false; }; - outputs = inputs@{ self, protocol, nixpkgs, flake-utils, helpers, ... }: - (import (toString helpers + "/quixos-package-helpers.nix")).mkCaminoTsYarnNixifyFlake { - inherit inputs nixpkgs flake-utils; packageRoot = ./.; - bundle = { entry = ${JSON.stringify(react ? "src/server.ts" : "dist/server.js")}; ${react ? "browserSources = true;" : ""} }; - migrationEntrypoint = "dist/migrate.js"; - installServer = { libexecName = ${JSON.stringify(name.toLowerCase())}; descriptorPath = "descriptor.quixos-package.txtpb"; }; - }; -}\n`, - ); - } else { - catalog = await ownedJson(root, prefix + "quixos.migrations.json"); - // Derive the edit model from authored declarations; it is never persisted. - const authored = await fs.readFile(path.join(root, prefix, "package.qx"), "utf8"); - const syntax = parseQx(authored); - if (syntax.diagnostics.length) - throw new Error("Cannot scaffold into an invalid package.qx; fix the reported syntax first"); - const declaration = [...walkSyntax(syntax.root)].find((node) => node.kind === "packageResourceDecl"); - if (!declaration) throw new Error("Expected a package declaration"); - const text = (node: typeof declaration) => authored.slice(node.start, node.end); - const literals = declaration.children.filter((node) => node.kind === "stringLiteral"); - packageModel = { - generatedBy: "qx-scaffold-v1", - name: text(declaration.children.find((node) => node.kind === "identifier")!), - id: JSON.parse(text(literals[0])), - revision: JSON.parse(text(literals[1])), - exports: [], - }; - for (const node of walkSyntax(declaration)) { - if (!["packageFunctionExport", "packageOperationExport", "packageConstructorExport"].includes(node.kind)) - continue; - const name = safeName(text(node.children.find((child) => child.kind === "identifier")!)); - const id = JSON.parse(text(node.children.find((child) => child.kind === "stringLiteral")!)); - if (packageModel.exports.some((entry) => entry.id === id || entry.name === name)) - throw new Error("Duplicate package export name or ID"); - const migration = catalog.migrations.find((entry) => entry.implementation.exportId === id); - packageModel.exports.push({ - name, - id, - file: migration?.implementation.file ?? `src/impl/${name}.ts`, - ...(migration ? { migration: true } : {}), - }); - } - { - const name = safeName(spec.name); - if (!spec.id || packageModel.exports.some((entry) => entry.id === spec.id || entry.name === name)) - throw new Error("New export requires a unique name and ID"); - const declaration = spec.declaration ?? `function ${name} id ${JSON.stringify(spec.id)} : unit -> unit;`; - const parsed = parseQx(`package Scaffold id "scaffold" revision "scaffold@1" { ${declaration} }`); - const exports = [...walkSyntax(parsed.root)].filter((node) => - ["packageFunctionExport", "packageOperationExport", "packageConstructorExport"].includes(node.kind), - ); - if (parsed.diagnostics.length || exports.length !== 1) - throw new Error("Expected one valid package export declaration"); - const wrapped = `package Scaffold id "scaffold" revision "scaffold@1" { ${declaration} }`; - const node = exports[0]; - const derived = [...walkSyntax(node)].some((entry) => entry.kind === "eventClause"); - if (command === "migration" && (node.kind !== "packageFunctionExport" || spec.declaration)) - throw new Error( - "Migration exports use the scaffold's unit function declaration and dedicated migration entrypoint", - ); - if ( - wrapped.slice( - node.children.find((child) => child.kind === "identifier")!.start, - node.children.find((child) => child.kind === "identifier")!.end, - ) !== name || - JSON.parse( - wrapped.slice( - node.children.find((child) => child.kind === "stringLiteral")!.start, - node.children.find((child) => child.kind === "stringLiteral")!.end, - ), - ) !== spec.id - ) - throw new Error("Declaration name/ID must match its registration"); - files.push({ - file: prefix + "package.qx", - edits: [ - { operation: "append", parent: { kind: "packageResourceDecl", id: packageModel.id }, source: declaration }, - ], - }); - const file = `src/${command === "migration" ? "migrations" : "impl"}/${name}.ts`; - const implementation = - command === "migration" - ? `import type {MigrationContext} from "@quixos/camino-package-runtime";\nexport const handler = async (_context: MigrationContext): Promise => { throw new Error(${JSON.stringify(`Implement migration ${name}`)}); };\n` - : `import type {Implementation} from "../gen/qx.js";\nexport const handler: Implementation[${JSON.stringify(name)}] = ${derived ? '{kind: "derived", get: ' : ""}async (_context) => { throw new Error(${JSON.stringify(`Implement ${name}`)}); }${derived ? "}" : ""};\n`; - create(file, implementation); - packageModel.exports.push({ name, id: spec.id, file, ...(command === "migration" ? { migration: true } : {}) }); - if (command === "migration") { - if (!spec.migration) - throw new Error("Migration scaffold requires retained contracts and an explicit transition"); - const { contracts, ...transition } = spec.migration; - for (const [digest, contract] of Object.entries(contracts)) { - if ( - contentDigest(contract) !== digest || - (catalog.contracts[digest] && contentDigest(catalog.contracts[digest]) !== digest) - ) - throw new Error("Retained migration contract mismatch"); - catalog.contracts[digest] = contract; - } - catalog.migrations.push({ - ...transition, - implementation: { exportId: spec.id, file, digest: contentDigest(implementation) }, - }); - } - } - } - validateMigrationCatalog(catalog, new Set(packageModel.exports.map((entry) => entry.id))); - generated("quixos.migrations.json", json(catalog)); - if (command !== "package") { - const entry = packageModel.exports.at(-1)!; - const file = prefix + "src/server.ts"; - const before = await fs.readFile(path.join(root, file), "utf8"); - files.push({ - file, - expected: before, - replace: addImplementation( - before, - "createRuntime", - entry.name, - `./${entry.file.slice(4, -3)}.js`, - !!entry.migration, - ), - }); - if (entry.migration) { - const file = prefix + "src/migrate.ts"; - const before = await fs.readFile(path.join(root, file), "utf8"); - files.push({ - file, - expected: before, - replace: addImplementation(before, "serveMigration", entry.id, `./${entry.file.slice(4, -3)}.js`), - }); - } - } else { - create( - "src/server.ts", - `import {servePackageRuntime} from "@quixos/camino-package-runtime";\nimport {createRuntime} from "./gen/qx.js";\n` + - packageModel.exports - .filter((entry) => !entry.migration) - .map( - (entry, index) => - `import {handler as impl${index}} from ${JSON.stringify(`./${entry.file.slice(4, -3)}.js`)};\n`, - ) - .join("") + - `servePackageRuntime(createRuntime({\n` + - packageModel.exports - .map( - (entry) => - ` ${JSON.stringify(entry.name)}: ${entry.migration ? 'async () => { throw new Error("Migration-only export"); }' : `impl${packageModel.exports.filter((value) => !value.migration).indexOf(entry)}`},`, - ) - .join("\n") + - `\n}));\n`, - ); - const migrations = packageModel.exports.filter((entry) => entry.migration); - create( - "src/migrate.ts", - `import {serveMigration} from "@quixos/camino-package-runtime";\n` + - migrations - .map( - (entry, index) => - `import {handler as impl${index}} from ${JSON.stringify(`./${entry.file.slice(4, -3)}.js`)};\n`, - ) - .join("") + - `await serveMigration({${migrations.map((entry, index) => `${JSON.stringify(entry.id)}: impl${index}`).join(", ")}});\n`, - ); - } - generated( - "descriptor.quixos-package.txtpb", - `# Generated by qx-scaffold-v1\npackage_id: ${JSON.stringify(packageModel.id)}\npackage_revision_id: ${JSON.stringify(packageModel.revision)}\nruntime_protocol_version: "quixos-capabilities-v1"\n` + - packageModel.exports - .map( - (entry) => - `exports: { export_id: ${JSON.stringify(entry.id)} runtime_symbol: ${JSON.stringify(entry.name)} }\n`, - ) - .join(""), - ); - if (spec.initialFiles) { - if (command !== "package") throw new Error("initialFiles is only valid when creating a package"); - const authored = spec.initialFiles["package.qx"]; - if (authored !== undefined) { - const parsed = parseQx(authored); - const declaration = [...walkSyntax(parsed.root)].find((n) => n.kind === "packageResourceDecl"); - const literals = declaration?.children.filter((n) => n.kind === "stringLiteral") ?? []; - const identifier = declaration?.children.find((n) => n.kind === "identifier"); - if ( - parsed.diagnostics.length || - literals.length !== 2 || - !identifier || - authored.slice(identifier.start, identifier.end) !== spec.name || - JSON.parse(authored.slice(literals[0].start, literals[0].end)) !== spec.id || - JSON.parse(authored.slice(literals[1].start, literals[1].end)) !== spec.revision - ) - throw new Error("Initial package declaration must match the provisioned name, ID and revision"); - } - for (const [file, content] of Object.entries(spec.initialFiles)) { - if ( - typeof content !== "string" || - ["quixos.lock", "flake.nix", "quixos.toolchain.json", "package.json"].includes(file) - ) - throw new Error(`Not an initial authored file: ${file}`); - if (file === "quixos.check.json") { - const check = JSON.parse(content); - if ( - check.backend !== "typescript" || - check.bindingOutput !== "src/gen/qx.ts" || - Object.keys(check).some((key) => !["backend", "bindingOutput", "options"].includes(key)) - ) - throw new Error( - "Initial check configuration may customize binding options, not the scaffold verification backend or output", - ); - } - const existing = files.findIndex((entry) => entry.file === prefix + file); - if (existing >= 0) files.splice(existing, 1); - create(file, content); - } - // A composed React recipe supplies its own modules and complete server. - if (reactRecipe(spec)) { - for (const file of ["src/component.tsx", "src/impl/sourceGet.ts", "descriptor.quixos-package.txtpb"]) - if (!(file in spec.initialFiles)) { - const index = files.findIndex((entry) => entry.file === prefix + file); - if (index >= 0) files.splice(index, 1); - } - } - } - return { kind: "package", source: spec.source, resourceRoot: spec.directory, validation: "syntax", files }; -}; - -const reactRecipe = (spec: ScaffoldRecipe) => - spec.template === "typescript-react" && spec.initialFiles?.["package.qx"] && spec.initialFiles?.["src/server.ts"]; + return executionScaffold(root, command, spec, prefix, nixSource); +} diff --git a/src/capability-language/structural-plan.ts b/src/capability-language/structural-plan.ts index f831f1c..5759058 100644 --- a/src/capability-language/structural-plan.ts +++ b/src/capability-language/structural-plan.ts @@ -168,16 +168,21 @@ export const planStructure = async (rootPath: string, request: StructuralRequest }); if (compiled.resource.kind === "package") { const configuration = JSON.parse(await fs.readFile(path.join(resourceRoot, "quixos.check.json"), "utf8")); - const artifacts = [ - { - file: configuration.bindingOutput as string, - after: generateTypeScriptBindings( - bindingSchema(compiled), - compiled.resource.revision.revisionId, - configuration.options, - ), - }, - ]; + // Execution bindings require the complete workspace plan and are owned + // by checkedArtifacts, not a package-only structural preview. + const artifacts = + configuration.backend === "execution" + ? [] + : [ + { + file: configuration.bindingOutput as string, + after: generateTypeScriptBindings( + bindingSchema(compiled), + compiled.resource.revision.revisionId, + configuration.options, + ), + }, + ]; for (const artifact of artifacts) { const file = request.resourceRoot ? `${request.resourceRoot}/${artifact.file}` : artifact.file; safeFile(file); diff --git a/src/capability-language/tool-cli.ts b/src/capability-language/tool-cli.ts index 257e48a..fd614ee 100644 --- a/src/capability-language/tool-cli.ts +++ b/src/capability-language/tool-cli.ts @@ -12,7 +12,6 @@ import os from "node:os"; import { spawnSync } from "node:child_process"; import { planStructure, applyStructure, resumeStructure, type StructuralRequest } from "./structural-plan.js"; import { scaffoldRecipe, type ScaffoldRecipe } from "./scaffold-recipes.js"; -import { isExecutionScaffold } from "./execution-scaffold.js"; import { checkBundleSources } from "../bindings/bundle-policy.js"; import { sealMigrations } from "./migration-seal.js"; import { generatePackageDescriptor } from "../bindings/index.js"; @@ -386,12 +385,19 @@ const main = async () => { } if (command === "scaffold-refresh") throw new Error( - "Refresh is no longer required: edit declarations and typed implementation wiring, then run qx-workspace check. Dependency installation uses scaffold install.", + "Refresh is no longer required: edit declarations and typed implementation wiring, then run qx-workspace check. Dependencies are provided by checkedArtifacts.", ); + if (command === "scaffold-install") + throw Error("Execution dependencies are supplied by checkedArtifacts; run workspace-root check instead"); if ( - ["scaffold-package", "scaffold-function", "scaffold-query", "scaffold-migration", "scaffold-install"].includes( - command, - ) + [ + "scaffold-package", + "scaffold-function", + "scaffold-query", + "scaffold-component", + "scaffold-controller", + "scaffold-migration", + ].includes(command) ) { const [root, specFile, ...flags] = args; let spec: ScaffoldRecipe; @@ -425,54 +431,24 @@ const main = async () => { flags.some((flag) => !["--write", "--install"].includes(flag)) || (flags.includes("--install") && !flags.includes("--write")) ) - throw new Error( - "usage: quixos-qx scaffold-package|function|query|migration ROOT SPEC_JSON [--write [--install]]", - ); + throw new Error("usage: quixos-qx scaffold-package|function|query|component|controller ROOT SPEC_JSON [--write]"); const plan = command === "scaffold-install" ? undefined : await planStructure( root, - await scaffoldRecipe(root, command.slice(9) as "package" | "function" | "query" | "migration", spec), + await scaffoldRecipe( + root, + command.slice(9) as "package" | "function" | "query" | "component" | "controller" | "migration", + spec, + ), process.env.QUIXOS_SNAPSHOT_MAP, ); - if ( - flags.includes("--install") && - (spec.template === "typescript-execution" || - (await isExecutionScaffold(root, spec.directory ? `${spec.directory}/` : ""))) - ) - throw new Error( - "Execution package dependencies are supplied by checkedArtifacts; omit --install and run workspace-root check after authoring.", + if (flags.includes("--install")) + throw Error( + "Execution dependencies are supplied by checkedArtifacts; run workspace-root check instead of scaffold install", ); const applied = plan && flags.includes("--write") ? await applyStructure(plan) : undefined; - if (flags.includes("--install")) { - const cwd = path.resolve(root, spec.directory ?? ""); - const toolchain = JSON.parse(await readFile(path.join(cwd, "quixos.toolchain.json"), "utf8")); - if (toolchain.generatedBy !== "qx-scaffold-v1" || typeof toolchain.nixifyPluginUrl !== "string") - throw new Error("Missing scaffold toolchain"); - for (const [executable, args] of [ - ["corepack", ["yarn", "plugin", "import", toolchain.nixifyPluginUrl]], - ["corepack", ["yarn", "config", "set", "generateDefaultNix", "false"]], - ["corepack", ["yarn", "config", "set", "individualNixPackaging", "true"]], - ["corepack", ["yarn", "install"]], - ] as const) { - const result = spawnSync(executable, [...args], { cwd, stdio: ["inherit", 2, 2] }); - if (result.error || result.status !== 0) - throw new Error( - `Scaffold files retained; ${executable} ${args.join(" ")} failed: ${result.error?.message ?? result.status}`, - ); - } - try { - await readFile(path.join(cwd, "yarn-project.nix")); - } catch { - throw new Error( - "Nixify did not generate yarn-project.nix. It skips repositories under the OS temporary directory; use an ordinary workspace checkout and retry installation.", - ); - } - await snapshotCommit(cwd); - const locked = spawnSync("nix", ["flake", "lock"], { cwd, stdio: ["inherit", 2, 2] }); - if (locked.error || locked.status !== 0) throw new Error("Scaffold files retained; nix flake lock failed"); - } process.stdout.write( `${JSON.stringify({ ...(plan ? planSummary(plan) : { installed: true }), applied }, null, 2)}\n`, ); diff --git a/src/execution-world/index.ts b/src/execution-world/index.ts index b9acf1d..84752e7 100644 --- a/src/execution-world/index.ts +++ b/src/execution-world/index.ts @@ -15,3 +15,5 @@ export * from "./projections.js"; export * from "./queries.js"; export { generatePortableClientBindings } from "../bindings/portable-client.js"; export * from "./candidate.js"; + +export { reviewSemanticMajors } from "../capability-model/evolution.js"; diff --git a/src/query/compile.ts b/src/query/compile.ts index 61f9a3e..87ec603 100644 --- a/src/query/compile.ts +++ b/src/query/compile.ts @@ -462,12 +462,15 @@ export async function compileQuery( const definitionDigest = createHash("sha256") .update( canonicalJson({ - semantics: 2, + semantics: 3, declaration, normalized, - interfaces: [...generated.byName.values()].sort((a, b) => - a.revisionId < b.revisionId ? -1 : a.revisionId > b.revisionId ? 1 : 0, - ), + // Source provenance belongs to the checked installation. Identical public + // contracts keep their query identity when retained in another repository. + // Closed generic identity remains explicit in revisionId/application. + interfaces: [...generated.byName.values()] + .map(({ source: _source, ...contract }) => contract) + .sort((a, b) => (a.revisionId < b.revisionId ? -1 : a.revisionId > b.revisionId ? 1 : 0)), }), ) .digest("hex"); diff --git a/test/component-scaffold.test.ts b/test/component-scaffold.test.ts new file mode 100644 index 0000000..aa0c4c2 --- /dev/null +++ b/test/component-scaffold.test.ts @@ -0,0 +1,99 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import { execFile as callback } from "node:child_process"; +import { promisify } from "node:util"; +import { scaffoldRecipe } from "../src/capability-language/scaffold-recipes.js"; +import { planStructure, applyStructure } from "../src/capability-language/structural-plan.js"; +const execFile = promisify(callback); +test("checked component scaffolding composes with execution handlers without replacing authored files", async (context) => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "qx-component-scaffold-")); + context.after(() => fs.rm(root, { recursive: true, force: true })); + await execFile("git", ["-C", root, "init"]); + const source = { repository: "https://example.test/component.git", commit: "a".repeat(40) }; + const apply = async ( + command: Parameters[1], + spec: Omit[2], "source">, + ) => applyStructure(await planStructure(root, await scaffoldRecipe(root, command, { ...spec, source }))); + await apply("package", { + name: "Widgets", + id: "package:widgets", + revision: "package:widgets@1", + template: "typescript-component", + tools: { quixos: source, protocol: source, helpers: source, sdk: source }, + }); + const packageFile = path.join(root, "package.qx"); + await fs.writeFile(packageFile, "import interface Data;\n" + (await fs.readFile(packageFile, "utf8"))); + await apply("component", { + name: "Card", + id: "component:card", + declaration: 'component Card id "component:card" subject Data runtime react;', + }); + assert.deepEqual(JSON.parse(await fs.readFile(path.join(root, "quixos.components.json"), "utf8")), { + "component:card": { entry: "src/components/Card.tsx", export: "Card" }, + }); + const card = path.join(root, "src/components/Card.tsx"); + await fs.appendFile(card, "\n// authored extension\n"); + const retained = await fs.readFile(card, "utf8"); + await apply("function", { + name: "echo", + id: "echo", + declaration: 'function echo id "echo" : string -> string execution snapshot targets [browser,server];', + }); + await apply("component", { + name: "Details", + id: "component:details", + declaration: 'component Details id "component:details" subject Data runtime react;', + }); + assert.equal(await fs.readFile(card, "utf8"), retained); + assert.match(await fs.readFile(path.join(root, "src/server.ts"), "utf8"), /echo/); + assert.match(await fs.readFile(path.join(root, "flake.nix"), "utf8"), /react \? null/); + await assert.rejects( + apply("component", { + name: "Card", + id: "component:other", + declaration: 'component Card id "component:other" subject Data runtime react;', + }), + /unique/, + ); + await assert.rejects( + apply("component", { + name: "Injected", + id: "component:inject", + declaration: + 'component Injected id "component:inject" subject Data runtime react; function sneak id "sneak" : unit -> unit;', + }), + /exactly one/, + ); +}); + +test("controller scaffolding preserves existing registrations and rejects duplicate identities", async (context) => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "qx-controller-scaffold-")); + context.after(() => fs.rm(root, { recursive: true, force: true })); + await execFile("git", ["-C", root, "init"]); + const source = { repository: "https://example.test/adapter.git", commit: "a".repeat(40) }; + const apply = async ( + command: Parameters[1], + spec: Omit[2], "source">, + ) => applyStructure(await planStructure(root, await scaffoldRecipe(root, command, { ...spec, source }))); + await apply("package", { + name: "Adapter", + id: "adapter", + revision: "adapter@1", + tools: { quixos: source, protocol: source, helpers: source }, + }); + const controller = { + subject: "display@1", + snapshot: "display:requested", + remote: "display:apply", + input: "value" as const, + }; + await apply("controller", { id: "display:controller", controller }); + await apply("controller", { id: "display:monitor", controller: { ...controller, snapshot: "display:status" } }); + const entries = JSON.parse(await fs.readFile(path.join(root, "quixos.controllers.json"), "utf8")).controllers; + assert.equal(entries.length, 2); + assert.deepEqual(entries[0], { id: "display:controller", ...controller }); + await assert.rejects(apply("controller", { id: "display:controller", controller }), /duplicate/); +}); diff --git a/test/query-structured.test.ts b/test/query-structured.test.ts index 7709bc5..ea8f30f 100644 --- a/test/query-structured.test.ts +++ b/test/query-structured.test.ts @@ -84,3 +84,21 @@ test("explicit budgets can exceed defaults without exceeding wire bounds", () => assert.equal(result.resource.revision.queries![0]!.budgets.rows, 5000); assert.equal(compile("4294967296").ok, false); }); + +test("query identity follows public contracts, not source retention commits", async () => { + const document = async () => "query Rows {root {objects(first:10) {entries {node {range {start}}}}}}"; + const before = await compileQuery(declaration, [iface], document); + const retained = { + ...iface, + source: { ...iface.source, repository: "https://other.test/interfaces.git", commit: "b".repeat(40) }, + }; + assert.equal((await compileQuery(declaration, [retained], document)).definitionDigest, before.definitionDigest); + const changed = structuredClone(retained); + changed.members[0]!.operations[0]!.id = "changed:get" as (typeof changed.members)[0]["operations"][0]["id"]; + assert.notEqual((await compileQuery(declaration, [changed], document)).definitionDigest, before.definitionDigest); + assert.notEqual( + (await compileQuery({ ...declaration, budgets: { ...declaration.budgets, rows: 17 } }, [retained], document)) + .definitionDigest, + before.definitionDigest, + ); +}); diff --git a/test/scaffold-recipes.test.ts b/test/scaffold-recipes.test.ts index 478881c..7406b0c 100644 --- a/test/scaffold-recipes.test.ts +++ b/test/scaffold-recipes.test.ts @@ -7,122 +7,9 @@ import { execFile as callback } from "node:child_process"; import { promisify } from "node:util"; import { scaffoldRecipe } from "../src/capability-language/scaffold-recipes.js"; import { planStructure, applyStructure } from "../src/capability-language/structural-plan.js"; -import { contentDigest } from "../src/capability-model/evolution.js"; -import { sealMigrations } from "../src/capability-language/migration-seal.js"; import { reactPlatformTypes } from "../src/bindings/react-platform.js"; const execFile = promisify(callback); -test("React preset applies its browser build script and shared-platform imports", async (context) => { - const root = await fs.mkdtemp(path.join(os.tmpdir(), "qx-react-recipe-")); - context.after(() => fs.rm(root, { recursive: true, force: true })); - await execFile("git", ["-C", root, "init"]); - const source = { repository: "https://example.test/react.git", commit: "a".repeat(40) }; - const request = await scaffoldRecipe(root, "package", { - source, - name: "React", - id: "package:react", - revision: "package:react@1", - template: "typescript-react", - tools: { quixos: source, protocol: source, helpers: source, sdk: source }, - }); - await applyStructure(await planStructure(root, request)); - assert.match(await fs.readFile(path.join(root, "src/impl/sourceGet.ts"), "utf8"), /component.js\?browser-source/); - assert.match(await fs.readFile(path.join(root, "flake.nix"), "utf8"), /browserSources = true/); - assert.equal(await fs.readFile(path.join(root, "src/gen/web-studio-react-runtime.d.ts"), "utf8"), reactPlatformTypes); - assert.match(await fs.readFile(path.join(root, "src/browser-assets.d.ts"), "utf8"), /declare module "\*\.css"/); - assert.deepEqual( - JSON.parse(await fs.readFile(path.join(root, "quixos.check.json"), "utf8")).options.react.propsExports, - [], - ); - await assert.rejects(fs.access(path.join(root, "quixos.scaffold.json"))); - assert.equal( - JSON.parse(await fs.readFile(path.join(root, "tsconfig.json"), "utf8")).compilerOptions.jsx, - "react-jsx", - ); -}); - -test("imperative scaffolds preserve authored wiring; migration sealing is explicit and separate", async (context) => { - const root = await fs.mkdtemp(path.join(os.tmpdir(), "qx-recipes-")); - context.after(() => fs.rm(root, { recursive: true, force: true })); - await execFile("git", ["-C", root, "init"]); - await fs.writeFile(path.join(root, ".gitignore"), ".quixos/\n"); - const source = { repository: "https://example.test/chess.git", commit: "a".repeat(40) }; - const base = { source, directory: "packages/Chess" }; - const apply = async (command: Parameters[1], input: Parameters[2]) => - applyStructure(await planStructure(root, await scaffoldRecipe(root, command, input))); - await apply("package", { - ...base, - name: "Chess", - id: "package:chess", - revision: "package:chess@1", - tools: { quixos: source, protocol: source, helpers: source, sdk: source }, - }); - await apply("function", { ...base, name: "play", id: "export:play" }); - const filename = path.join(root, base.directory, "src/impl/play.ts"); - const edited = - 'import type {Implementation} from "../gen/qx.js";\nexport const handler: Implementation["play"] = async () => null;\n'; - await fs.writeFile(filename, edited); - const old = { version: 1 }, - next = { version: 2 }, - from = contentDigest(old), - to = contentDigest(next); - await apply("migration", { - ...base, - name: "upgrade", - id: "export:upgrade", - migration: { - id: "upgrade-v2", - scopeId: "board", - from, - to, - predecessors: [], - ports: [], - contracts: { [from]: old, [to]: next }, - }, - }); - const migrationFile = path.join(root, base.directory, "src/migrations/upgrade.ts"); - await fs.appendFile(migrationFile, "\n// authored migration change\n"); - await sealMigrations(path.join(root, base.directory)); - assert.equal(await fs.readFile(filename, "utf8"), edited); - const catalog = JSON.parse(await fs.readFile(path.join(root, base.directory, "quixos.migrations.json"), "utf8")); - assert.equal(catalog.migrations[0].implementation.digest, contentDigest(await fs.readFile(migrationFile, "utf8"))); - assert.match(await fs.readFile(path.join(root, base.directory, "src/migrate.ts"), "utf8"), /export:upgrade/); - await assert.rejects(() => apply("function", { ...base, name: "play", id: "export:play" }), /unique/); - const declarations = path.join(root, base.directory, "package.qx"); - await fs.writeFile( - declarations, - (await fs.readFile(declarations, "utf8")).replace( - /}\s*$/, - ' function authored id "export:authored" : unit -> unit;\n}\n', - ), - ); - const server = path.join(root, base.directory, "src/server.ts"); - await fs.appendFile(server, "\n// authored comment must survive\n"); - await apply("function", { ...base, name: "another", id: "export:another" }); - assert.match(await fs.readFile(server, "utf8"), /authored comment must survive/); - await assert.rejects(() => apply("refresh", base), /removed/); - await assert.rejects(fs.access(path.join(root, base.directory, "src/impl/authored.ts"))); - assert.equal(await fs.readFile(filename, "utf8"), edited); - await planStructure(root, { - kind: "package", - source, - resourceRoot: base.directory, - validation: "syntax", - files: [ - { - file: `${base.directory}/package.qx`, - edits: [ - { - operation: "replace", - target: { kind: "packageResourceDecl", id: "package:chess" }, - source: 'package Other id "package:other" revision "package:other@1" {}', - }, - ], - }, - ], - }); -}); - test("execution scaffolds route typed handlers by declared effect and target without legacy lifecycle files", async (context) => { const root = await fs.mkdtemp(path.join(os.tmpdir(), "qx-execution-recipe-")); context.after(() => fs.rm(root, { recursive: true, force: true })); @@ -164,7 +51,7 @@ test("execution scaffolds route typed handlers by declared effect and target wit await assert.rejects(add("both", "transaction targets [browser, server]"), /unique/); await assert.rejects(add("invalid", "snapshot targets [remote]"), /browser\/server/); await assert.rejects(apply("function", { name: "missing", id: "export:missing" }), /explicit execution/); - await assert.rejects(apply("migration", { name: "migration", id: "export:migration" }), /not supported/); + await assert.rejects(apply("migration", { name: "migration", id: "export:migration" }), /retired/); }); test("query scaffold preserves placement and inserts its named GraphQL document atomically", async (context) => { @@ -176,6 +63,7 @@ test("query scaffold preserves placement and inserts its named GraphQL document path.join(root, "package.qx"), 'import interface Task;\npackage Tasks id "tasks" revision "tasks@1" {}\n', ); + await fs.writeFile(path.join(root, "quixos.check.json"), JSON.stringify({ backend: "execution" })); const request = (name: string, placement: string) => ({ source, name, From d824634859e1c83eaab4a5ead59d52bafbf09b7b Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Mon, 21 Sep 2026 17:38:45 -0700 Subject: [PATCH 51/91] Host checked adapter-object controllers through bounded registries (WI-13) --- src/capability-language/assembly.ts | 6 +- .../controller-scaffold.ts | 3 +- src/capability-language/scaffold-recipes.ts | 2 +- src/capability-model/controllers.ts | 50 ++++++++++++-- src/capability-model/types.ts | 2 + test/controller-registry.test.ts | 50 ++++++++++++++ test/emit-controllers.ts | 68 +++++++++++++++++++ test/emit-managed.ts | 2 + test/fixtures/controller-device/Device.qx | 11 +++ .../controller-device/DeviceController.qx | 6 ++ test/fixtures/controller-device/Driver.qx | 15 ++++ .../controller-device/enabled.graphql | 1 + .../fixtures/controller-device/inputs.graphql | 1 + test/fixtures/controller-device/workspace.qx | 25 +++++++ 14 files changed, 235 insertions(+), 7 deletions(-) create mode 100644 test/controller-registry.test.ts create mode 100644 test/emit-controllers.ts create mode 100644 test/fixtures/controller-device/Device.qx create mode 100644 test/fixtures/controller-device/DeviceController.qx create mode 100644 test/fixtures/controller-device/Driver.qx create mode 100644 test/fixtures/controller-device/enabled.graphql create mode 100644 test/fixtures/controller-device/inputs.graphql create mode 100644 test/fixtures/controller-device/workspace.qx diff --git a/src/capability-language/assembly.ts b/src/capability-language/assembly.ts index 05c84eb..f55edab 100644 --- a/src/capability-language/assembly.ts +++ b/src/capability-language/assembly.ts @@ -257,7 +257,11 @@ const createResourceGraphResolver = (quixosCommit: string, resolveResource: Capa if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error; } if (controllerText !== undefined) - compiled.resource.revision.controllers = parseControllerCatalog(controllerText, queryInterfaces); + compiled.resource.revision.controllers = parseControllerCatalog( + controllerText, + queryInterfaces, + compiled.resource.revision.checkedQueries, + ); let catalogText: string | undefined; try { catalogText = await readFile(path.join(snapshot.directory, "quixos.migrations.json"), "utf8"); diff --git a/src/capability-language/controller-scaffold.ts b/src/capability-language/controller-scaffold.ts index d2e532f..f98df2a 100644 --- a/src/capability-language/controller-scaffold.ts +++ b/src/capability-language/controller-scaffold.ts @@ -10,7 +10,8 @@ export async function scaffoldController( const entry = { id: spec.id, ...spec.controller }; const fields = ["id", "subject", "snapshot", "remote", "input"]; if ( - Object.keys(entry).length !== fields.length || + Object.keys(entry).some((key) => ![...fields, "registry"].includes(key)) || + (entry.registry !== undefined && typeof entry.registry !== "string") || fields.some((key) => typeof (entry as Record)[key] !== "string") || !["unit", "value"].includes(entry.input ?? "") ) diff --git a/src/capability-language/scaffold-recipes.ts b/src/capability-language/scaffold-recipes.ts index a0a8f15..5906221 100644 --- a/src/capability-language/scaffold-recipes.ts +++ b/src/capability-language/scaffold-recipes.ts @@ -15,7 +15,7 @@ export type ScaffoldRecipe = { declaration?: string; queryDocument?: string; initialFiles?: Record; - controller?: { subject: string; snapshot: string; remote: string; input: "unit" | "value" }; + controller?: { registry?: string; subject: string; snapshot: string; remote: string; input: "unit" | "value" }; tools?: { quixos: Source; protocol: Source; helpers: Source; sdk?: Source }; }; const source = (value: Source): GitSource => { diff --git a/src/capability-model/controllers.ts b/src/capability-model/controllers.ts index 5cf9847..6fbc942 100644 --- a/src/capability-model/controllers.ts +++ b/src/capability-model/controllers.ts @@ -6,6 +6,7 @@ export function validateControllers( controllers: readonly PackageController[], interfaces: readonly InterfaceRevision[], prefix: string, + queries: readonly import("../query/types.js").CheckedQuery[] = [], ): CapabilityValidationIssue[] { const issues: CapabilityValidationIssue[] = [], ids = new Set(); @@ -15,6 +16,37 @@ export function validateControllers( if (!controller.id.trim() || ids.has(controller.id)) fail(`${path}.id`, "Controller identities must be nonempty and unique within the package"); ids.add(controller.id); + if (controller.registry !== undefined) { + const query = queries.find((query) => query.declaration.id === controller.registry); + const selected = (entries: import("../query/types.js").QuerySelection[] | undefined, name: string) => + entries?.find((entry) => entry.name === name && entry.key === name && !entry.conditions.length); + const root = selected(query?.selection, "root"), + objects = selected(root?.selection, "objects"), + entries = selected(objects?.selection, "entries"), + node = selected(entries?.selection, "node"), + qx = selected(node?.selection, "_qx"), + ref = selected(qx?.selection, "ref"); + const all = objects?.arguments.all; + if ( + !query || + query.declaration.root.kind !== "workspace-interface" || + query.declaration.root.interface !== controller.subject || + query.declaration.placement?.kind === "local" || + query.effects.some((effect) => effect.execution === "rpc-permitted") || + query.variables.kind !== "record" || + Object.keys(query.variables.fields).length || + !ref || + all?.kind !== "literal" || + !/^\d+$/.test(String(all.value)) || + !Number.isSafeInteger(Number(all.value)) || + Number(all.value) < 1 || + Number(all.value) > 64 + ) + fail( + `${path}.registry`, + "Controller registry requires a native/portable workspace query over its subject, no variables, and root.objects(all: 1..64).entries.node._qx.ref without aliases or conditional selections", + ); + } const iface = interfaces.find((i) => i.revisionId === controller.subject && !i.template); if (!iface) { fail(`${path}.subject`, "Controller subject must be an imported closed interface"); @@ -54,11 +86,20 @@ export function validateControllers( } export function validateWorkspaceControllers(workspace: WorkspaceRevision): CapabilityValidationIssue[] { return workspace.packageImports.flatMap((pkg, index) => - validateControllers(pkg.controllers ?? [], workspace.interfaceImports, `packageImports[${index}].controllers`), + validateControllers( + pkg.controllers ?? [], + workspace.interfaceImports, + `packageImports[${index}].controllers`, + pkg.checkedQueries, + ), ); } /** The file is declarative metadata, not an executable registration callback. */ -export function parseControllerCatalog(text: string, interfaces: readonly InterfaceRevision[]): PackageController[] { +export function parseControllerCatalog( + text: string, + interfaces: readonly InterfaceRevision[], + queries: readonly import("../query/types.js").CheckedQuery[] = [], +): PackageController[] { if (Buffer.byteLength(text) > 1048576) throw new Error("Controller catalog exceeds 1 MiB"); const value: unknown = JSON.parse(text); const record = (value: unknown): value is Record => @@ -75,12 +116,13 @@ export function parseControllerCatalog(text: string, interfaces: readonly Interf for (const entry of value.controllers) if ( !record(entry) || - Object.keys(entry).length !== fields.length || + Object.keys(entry).some((key) => ![...fields, "registry"].includes(key)) || + (entry.registry !== undefined && typeof entry.registry !== "string") || fields.some((key) => typeof entry[key] !== "string") ) throw new Error("Invalid controller entry: expected exactly id, subject, snapshot, remote, input strings"); const controllers = value.controllers as PackageController[]; - const issues = validateControllers(controllers, interfaces, "controllers"); + const issues = validateControllers(controllers, interfaces, "controllers", queries); if (issues.length) throw new Error(issues.map((i) => `${i.path}: ${i.message}`).join("\n")); return controllers; } diff --git a/src/capability-model/types.ts b/src/capability-model/types.ts index 14b53d0..3cf0f5d 100644 --- a/src/capability-model/types.ts +++ b/src/capability-model/types.ts @@ -326,6 +326,8 @@ export interface PackageRevision { /** Checked adapter registration. Implementations remain ordinary object capabilities. */ export interface PackageController { + /** Optional opt-in discovery: a bounded checked workspace query in this package. */ + registry?: string; id: string; subject: InterfaceRevisionId; snapshot: OperationId; diff --git a/test/controller-registry.test.ts b/test/controller-registry.test.ts new file mode 100644 index 0000000..a22ea98 --- /dev/null +++ b/test/controller-registry.test.ts @@ -0,0 +1,50 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { readFile } from "node:fs/promises"; +import { compileCapabilityResourceSource } from "../src/capability-language/index.js"; +import { compileQuery } from "../src/query/compile.js"; +import { parseControllerCatalog } from "../src/capability-model/controllers.js"; +const source = { repository: "https://example.test/device.git", commit: "a".repeat(40) }; +test("controller discovery requires complete bounded accepted-state membership", async () => { + const result = compileCapabilityResourceSource( + await readFile("test/fixtures/controller-device/DeviceController.qx", "utf8"), + { source }, + ); + assert.ok(result.ok && result.resource.kind === "interface", JSON.stringify(result.diagnostics)); + const iface = result.resource.revision; + const pkg = compileCapabilityResourceSource( + 'import interface DeviceController;package Driver id "driver" revision "driver@1" {query Enabled id "enabled" root workspace DeviceController document "enabled.graphql" operation "Enabled" {max rows 100;}}', + { source, environment: { interfaces: new Map([["DeviceController", iface]]), interfaceClosure: [iface] } }, + ); + assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); + const declaration = pkg.resource.revision.queries![0]!; + const metadata = JSON.stringify({ + schemaVersion: 1, + controllers: [ + { + id: "driver", + registry: "enabled", + subject: "device-controller@1", + snapshot: "device:snapshot:call", + remote: "device:apply:call", + input: "value", + }, + ], + }); + const check = async (document: string) => + parseControllerCatalog(metadata, [iface], [await compileQuery(declaration, [iface], async () => document)]); + assert.equal( + (await check("query Enabled {root {objects(all:64,where:{enabled:{eq:true}}) {entries {node {_qx {ref}}}}}}")) + .length, + 1, + ); + for (const document of [ + "query Enabled {root {objects(first:64) {entries {node {_qx {ref}}}}}}", + "query Enabled {root {objects(all:65) {entries {node {_qx {ref}}}}}}", + "query Enabled {root {devices:objects(all:64) {entries {node {_qx {ref}}}}}}", + "query Enabled {root {objects(all:64) {entries {node {enabled}}}}}", + "query Enabled($enabled:Boolean!) {root {objects(all:64,where:{enabled:{eq:$enabled}}) {entries {node {_qx {ref}}}}}}", + ]) + await assert.rejects(check(document), /registry|Controller/); + assert.throws(() => parseControllerCatalog(metadata, [iface], []), /registry/); +}); diff --git a/test/emit-controllers.ts b/test/emit-controllers.ts new file mode 100644 index 0000000..4f79820 --- /dev/null +++ b/test/emit-controllers.ts @@ -0,0 +1,68 @@ +import assert from "node:assert/strict"; +import { readFile, mkdir, writeFile } from "node:fs/promises"; +import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/index.js"; +import { compileQuery } from "../src/query/compile.js"; +import { parseControllerCatalog } from "../src/capability-model/controllers.js"; +import { + compileExecutionPlan, + generateInterfaceClientBindings, + generatePackageQueryClientBindings, +} from "../src/execution-world/index.js"; +const read = (file: string) => readFile("test/fixtures/controller-device/" + file, "utf8"); +const source = { repository: "https://example.test/device.git", commit: "a".repeat(40) }; +const device = compileCapabilityResourceSource(await read("Device.qx"), { source }); +assert.ok(device.ok && device.resource.kind === "interface", JSON.stringify(device.diagnostics)); +const control = compileCapabilityResourceSource(await read("DeviceController.qx"), { source }); +assert.ok(control.ok && control.resource.kind === "interface", JSON.stringify(control.diagnostics)); +const iface = device.resource.revision, + controllerInterface = control.resource.revision, + environment = { + interfaces: new Map([ + ["Device", iface], + ["DeviceController", controllerInterface], + ]), + interfaceClosure: [iface, controllerInterface], + }; +const driver = compileCapabilityResourceSource(await read("Driver.qx"), { source, environment }); +assert.ok(driver.ok && driver.resource.kind === "package", JSON.stringify(driver.diagnostics)); +const pkg = driver.resource.revision; +pkg.checkedQueries = await Promise.all( + pkg.queries!.map((query) => compileQuery(query, [iface, controllerInterface], read)), +); +pkg.controllers = parseControllerCatalog( + JSON.stringify({ + schemaVersion: 1, + controllers: [ + { + id: "device-driver", + registry: "enabled", + subject: "device-controller@1", + snapshot: "device:snapshot:call", + remote: "device:apply:call", + input: "value", + }, + ], + }), + [iface, controllerInterface], + pkg.checkedQueries, +); +for (const variant of ["controller", "controller-next"]) { + const extra = variant.endsWith("next") ? 'atom Dashboard id "dashboard";' : ""; + const result = compileCapabilitySource((await read("workspace.qx")).replace(/}\s*$/, extra + "\n}"), "workspace.qx", { + ...environment, + packages: new Map([["Driver", pkg]]), + }); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const plan = compileExecutionPlan(result.workspace), + root = "dist/managed/" + variant; + await mkdir(root, { recursive: true }); + await writeFile(root + "/client.ts", generateInterfaceClientBindings({ Device: iface })); + await writeFile(root + "/queries.ts", generatePackageQueryClientBindings(pkg)); + for (const [file, value] of Object.entries({ + "candidate.json": result.workspace, + "execution-plan.json": plan, + "entry.json": null, + "source.json": { kind: "workspace", ...source }, + })) + await writeFile(root + "/" + file, JSON.stringify(value)); +} diff --git a/test/emit-managed.ts b/test/emit-managed.ts index 7861b67..f627c77 100644 --- a/test/emit-managed.ts +++ b/test/emit-managed.ts @@ -169,3 +169,5 @@ package Owner id "package:owner" revision "package:owner@1" { })) await writeFile(`${root}/${file}`, JSON.stringify(value)); } + +await import("./emit-controllers.js"); diff --git a/test/fixtures/controller-device/Device.qx b/test/fixtures/controller-device/Device.qx new file mode 100644 index 0000000..2bd1c77 --- /dev/null +++ b/test/fixtures/controller-device/Device.qx @@ -0,0 +1,11 @@ +external atom Display id "device:display"; +type Request=record {url:string;text:string;version:int32;}; +interface Device id "device" revision "device@1" { + static operation create id "device:create" : string -> atom-ref {call id "device:create:call" execution transaction targets [browser,server];} + queryable value enabled id "device:enabled" : bool {get id "device:enabled:get" execution snapshot targets [browser,server];set id "device:enabled:set" execution transaction targets [browser,server];} + queryable value requested id "device:requested" : Request {get id "device:requested:get" execution snapshot targets [browser,server];} + queryable value observed id "device:observed" : optional {get id "device:observed:get" execution snapshot targets [browser,server];} + operation requestText id "device:request" : string -> unit {call id "device:request:call" execution transaction targets [browser,server];} + operation recordObservation id "device:record" : Request -> unit {call id "device:record:call" execution transaction targets [server];} + operation remove id "device:remove" : unit -> unit {call id "device:remove:call" execution transaction targets [server];} +} diff --git a/test/fixtures/controller-device/DeviceController.qx b/test/fixtures/controller-device/DeviceController.qx new file mode 100644 index 0000000..8ee3cb5 --- /dev/null +++ b/test/fixtures/controller-device/DeviceController.qx @@ -0,0 +1,6 @@ +type Request=record {url:string;text:string;version:int32;}; +interface DeviceController id "device-controller" revision "device-controller@1" { + queryable portable value enabled id "controller:enabled" : bool {get id "controller:enabled:get" execution snapshot targets [server];} + operation snapshot id "device:snapshot" : unit -> optional {call id "device:snapshot:call" execution snapshot targets [server];} + operation apply id "device:apply" : optional -> unit {call id "device:apply:call" execution remote;} +} diff --git a/test/fixtures/controller-device/Driver.qx b/test/fixtures/controller-device/Driver.qx new file mode 100644 index 0000000..575c284 --- /dev/null +++ b/test/fixtures/controller-device/Driver.qx @@ -0,0 +1,15 @@ +import interface Device; +import interface DeviceController; +external atom Display id "device:display"; +type Request=record {url:string;text:string;version:int32;}; +package Driver id "driver" revision "driver@1" { + function create id "driver:create" : string -> atom-ref execution transaction targets [browser,server] requires {creation device id "device" : Display input record {enabled:bool;requested:Request;observed:optional;};}; + operation request id "driver:request" : string -> unit mode call execution transaction targets [browser,server] receiver any requires {state requested id "requested" : Request [read,write];}; + operation snapshot id "driver:snapshot" : unit -> optional mode call execution snapshot targets [server] receiver any requires {interface data id "data" : Device using [enabled.get,requested.get,observed.get];}; + operation recordObservation id "driver:record" : Request -> unit mode call execution transaction targets [server] receiver any requires {state requested id "requested" : Request [read];state observed id "observed" : optional [write];}; + operation apply id "driver:apply" : optional -> unit mode call execution remote receiver any requires {interface device id "device" : Device using [recordObservation.call];}; + operation enabled id "driver:enabled" : unit -> bool mode call execution snapshot targets [server] receiver any requires {interface data id "data" : Device using [enabled.get];}; + query Enabled id "enabled" root workspace DeviceController document "enabled.graphql" operation "Enabled" {max rows 64;} + query Inputs id "inputs" root Device document "inputs.graphql" operation "Inputs" {replica;} + query View id "view" root Device document "inputs.graphql" operation "Inputs" {local from Inputs;watch;} +} diff --git a/test/fixtures/controller-device/enabled.graphql b/test/fixtures/controller-device/enabled.graphql new file mode 100644 index 0000000..64b56c9 --- /dev/null +++ b/test/fixtures/controller-device/enabled.graphql @@ -0,0 +1 @@ +query Enabled {root {objects(all:64, where:{enabled:{eq:true}}) {entries {node {_qx {ref}}}}}} diff --git a/test/fixtures/controller-device/inputs.graphql b/test/fixtures/controller-device/inputs.graphql new file mode 100644 index 0000000..f330a2b --- /dev/null +++ b/test/fixtures/controller-device/inputs.graphql @@ -0,0 +1 @@ +query Inputs {root {enabled requested {url text version} observed {url text version}}} diff --git a/test/fixtures/controller-device/workspace.qx b/test/fixtures/controller-device/workspace.qx new file mode 100644 index 0000000..595a63f --- /dev/null +++ b/test/fixtures/controller-device/workspace.qx @@ -0,0 +1,25 @@ +workspace Controllers id "workspace:controllers" revision "workspace:controllers@1" commit "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" { + import interface Device; + import interface DeviceController; + import package Driver; + atom Display id "device:display"; + conform Display as Device id "display:device" { + private state Enabled id "display:enabled" on Display : bool policy register; + private state Requested id "display:requested" on Display : record {url:string;text:string;version:int32;} policy register; + private state Observed id "display:observed" on Display : optional policy register; + initialize {enabled to state Enabled;requested to state Requested;observed to state Observed;}; + bind create.call to package Driver.create with {device to creation Display with {Device from input;};}; + bind enabled.get to state Enabled.read; + bind enabled.set to state Enabled.write; + bind requested.get to state Requested.read; + bind observed.get to state Observed.read; + bind requestText.call to package Driver.request with {requested to state Requested;}; + bind recordObservation.call to package Driver.recordObservation with {requested to state Requested;observed to state Observed;}; + bind remove.call to lifecycle.delete; + } + conform Display as DeviceController id "display:controller" { + bind enabled.get to package Driver.enabled with {data to interface Device;}; + bind snapshot.call to package Driver.snapshot with {data to interface Device;}; + bind apply.call to package Driver.apply with {device to interface Device;}; + } +} From e5544dde21fca8b2c224a495c1b46b1611a1851e Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Mon, 21 Sep 2026 18:31:43 -0700 Subject: [PATCH 52/91] Prove cross-package application composition through public capabilities (WI-15) --- src/bindings/portable.ts | 4 +- src/capability-model/execution.ts | 9 ++-- test/emit-controllers.ts | 18 +++++++- test/fixtures/controller-device/Viewer.qx | 7 ++++ .../fixtures/controller-device/viewer.graphql | 1 + test/reference-dependencies.test.ts | 42 ++++++++++++++++++- 6 files changed, 70 insertions(+), 11 deletions(-) create mode 100644 test/fixtures/controller-device/Viewer.qx create mode 100644 test/fixtures/controller-device/viewer.graphql diff --git a/src/bindings/portable.ts b/src/bindings/portable.ts index 9fb4b42..53f2ecb 100644 --- a/src/bindings/portable.ts +++ b/src/bindings/portable.ts @@ -192,8 +192,8 @@ function methods( `Selected operation is not an object call available in portable target ${target}; select a portable subset or move this handler to remote execution`, ); if (execution.kind === "transaction" && !remote) writable(); - if (req.receiver === "input" && (remote || execution.kind !== "snapshot")) - throw new PortableBindingError(path, "Reference-selected dependencies require portable snapshot calls"); + if (req.receiver === "input" && remote) + throw new PortableBindingError(path, "Reference-selected dependencies require portable execution"); return method( `${member.displayName}.${op.displayName}`, { kind: "interface", operationId: op.id }, diff --git a/src/capability-model/execution.ts b/src/capability-model/execution.ts index f0def04..0af462e 100644 --- a/src/capability-model/execution.ts +++ b/src/capability-model/execution.ts @@ -68,14 +68,11 @@ export function validateExecutionContracts(workspace: WorkspaceRevision): Capabi const selected = requirement.operations; if (requirement.receiver === "input") { if (!entry.execution || entry.execution.kind === "remote" || !selected?.length) - fail( - portPath, - "Reference-selected reads require a portable snapshot or transaction and an explicit selection", - ); + fail(portPath, "Reference-selected calls require portable execution and an explicit selection"); for (const id of selected ?? []) { const operation = contract && operations(id, contract); - if (operation?.execution?.kind !== "snapshot" || operation.scope === "class") - fail(portPath, "Reference-selected dependencies currently support object snapshot operations only"); + if (!operation?.execution || operation.execution.kind === "remote" || operation.scope === "class") + fail(portPath, "Reference-selected dependencies require portable object operations"); } } if (selected && (!selected.length || new Set(selected).size !== selected.length)) diff --git a/test/emit-controllers.ts b/test/emit-controllers.ts index 4f79820..1a8a0a7 100644 --- a/test/emit-controllers.ts +++ b/test/emit-controllers.ts @@ -46,11 +46,25 @@ pkg.controllers = parseControllerCatalog( [iface, controllerInterface], pkg.checkedQueries, ); +const viewer = compileCapabilityResourceSource(await read("Viewer.qx"), { + source: { ...source, repository: "https://example.test/device-viewer.git" }, + environment, +}); +assert.ok(viewer.ok && viewer.resource.kind === "package", JSON.stringify(viewer.diagnostics)); +const viewerPackage = viewer.resource.revision; +viewerPackage.checkedQueries = await Promise.all( + viewerPackage.queries!.map((query) => compileQuery(query, [iface], read)), +); for (const variant of ["controller", "controller-next"]) { - const extra = variant.endsWith("next") ? 'atom Dashboard id "dashboard";' : ""; + const extra = variant.endsWith("next") + ? 'atom Dashboard id "dashboard"; import package DeviceViewer; presentation DeviceStatus id "device:status" for Device using DeviceViewer.Status;' + : ""; const result = compileCapabilitySource((await read("workspace.qx")).replace(/}\s*$/, extra + "\n}"), "workspace.qx", { ...environment, - packages: new Map([["Driver", pkg]]), + packages: new Map([ + ["Driver", pkg], + ...(variant.endsWith("next") ? [["DeviceViewer", viewerPackage] as const] : []), + ]), }); assert.ok(result.ok, JSON.stringify(result.diagnostics)); const plan = compileExecutionPlan(result.workspace), diff --git a/test/fixtures/controller-device/Viewer.qx b/test/fixtures/controller-device/Viewer.qx new file mode 100644 index 0000000..71714eb --- /dev/null +++ b/test/fixtures/controller-device/Viewer.qx @@ -0,0 +1,7 @@ +import interface Device; +external atom Display id "device:display"; +package DeviceViewer id "device-viewer" revision "device-viewer@1" { + component Status id "component:device:status" subject Device runtime react; + query Inputs id "device-viewer:inputs" root Device document "viewer.graphql" operation "Status" {replica;} + query View id "device-viewer:view" root Device document "viewer.graphql" operation "Status" {local from Inputs;watch;} +} diff --git a/test/fixtures/controller-device/viewer.graphql b/test/fixtures/controller-device/viewer.graphql new file mode 100644 index 0000000..8511345 --- /dev/null +++ b/test/fixtures/controller-device/viewer.graphql @@ -0,0 +1 @@ +query Status {root {enabled requested {text version} observed {text version}}} diff --git a/test/reference-dependencies.test.ts b/test/reference-dependencies.test.ts index d80b2b0..e8f3531 100644 --- a/test/reference-dependencies.test.ts +++ b/test/reference-dependencies.test.ts @@ -56,7 +56,7 @@ test("reference-selected dependencies round trip and do not require a recursive assert.ok(generated.includes('ManagedReference<"interface", "data@1">')); assert.ok(generated.includes('"receiver"')); }); -test("both sides explicitly grant reference selection and only object snapshots are permitted", () => { +test("both sides explicitly grant reference selection and remote execution is excluded", () => { assert.equal(compile(pkg, workspace.replace("Data from input", "Data")).ok, false); assert.equal(compile(pkg.replace(" from input", ""), workspace).ok, false); assert.equal(compile(pkg.replace("execution snapshot targets [server]", "execution remote"), workspace).ok, false); @@ -88,3 +88,43 @@ test("portable input-selected reads require the dependency's declared target sup const result = compile(portable, workspace, iface.replaceAll("targets [server]", "targets [browser, server]")); assert.ok(result.ok, JSON.stringify(result.diagnostics)); }); + +test("input-selected transactions compose only within a compatible transaction contract", () => { + const txInterface = iface + .replace('get id "content:get" execution snapshot', 'get id "content:get" execution transaction') + .replace('call id "peek:call" execution snapshot', 'call id "peek:call" execution transaction'); + const txPackage = pkg.replace("execution snapshot targets [server]", "execution transaction targets [server]"); + // Use an operation for the selected write; value getters themselves must remain snapshots. + const contract = txInterface.replace( + 'value content id "content" : string { get id "content:get" execution transaction targets [server]; }', + 'operation update id "content" : unit -> string { call id "content:get" execution transaction targets [server]; }', + ); + const implementation = txPackage.replace("using [content.get]", "using [update.call]"); + const model = workspace.replace( + "bind content.get to state Content.read;", + "bind update.call to package Runtime.update with { data to state Content; };", + ); + const sourcePackage = implementation.replace( + /\n}$/, + '\n operation update id "runtime:update" : unit -> string mode call execution transaction targets [server] receiver atom Item requires {state data id "data" : string [read,write];};\n}', + ); + const result = compile(sourcePackage, model, contract); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const plan = compileExecutionPlan(result.workspace); + const generated = generatePortableTypeScriptBindings(plan.definition.bindingSchema, "runtime@1", { + target: "server", + }); + assert.ok(generated.includes('"receiver"')); + assert.ok(generated.includes('"update.call"')); + assert.equal( + compile( + sourcePackage.replace( + 'operation peek id "runtime:peek" : interface-ref -> string mode call execution transaction', + 'operation peek id "runtime:peek" : interface-ref -> string mode call execution snapshot', + ), + model, + contract, + ).ok, + false, + ); +}); From 60b44a6637555efadcd3a3cba1b33dec50d99d17 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Mon, 21 Sep 2026 21:49:52 -0700 Subject: [PATCH 53/91] Load checked installations independently of the running compiler (WI-16) Keep compiler-dependent checks in Nix builds; load stored plans and programs with original provenance and runtime artifact validation. Allow an identical executable world to receive a new activation epoch after a toolchain rebuild. Compiler-update/altered-program regression, coordinator and full sandboxed integration checks pass; lint and formatting pass. Default platform/source wiring remains the next task. --- nix/check-execution.mjs | 41 ++++++++++-------- src/execution-world/candidate.ts | 64 +++++++++++++++++------------ src/execution-world/installation.ts | 25 +++++++++-- src/execution-world/receipts.ts | 3 +- test/presentations.test.ts | 4 +- 5 files changed, 87 insertions(+), 50 deletions(-) diff --git a/nix/check-execution.mjs b/nix/check-execution.mjs index 585bfc7..c8ba1f0 100644 --- a/nix/check-execution.mjs +++ b/nix/check-execution.mjs @@ -13,25 +13,32 @@ for (const check of checks) { if (Object.hasOwn(roots, check.packageRevisionId)) throw Error("Duplicate checked package revision"); roots[check.packageRevisionId] = check.artifactPath; } -const checked = await compiler.loadCheckedArtifactWorld( - plan, - roots, - createHash("sha256") - .update(await readFile(compilerPath)) - .digest("hex"), -); -const installation = await compiler.loadExecutionInstallation( - plan, - roots, - createHash("sha256") - .update(await readFile(compilerPath)) - .digest("hex"), -); +const generator = createHash("sha256") + .update(await readFile(compilerPath)) + .digest("hex"); +// These compiler-dependent checks belong to the Nix build, not runtime recovery. +const candidate = JSON.parse(await readFile(join(output, "candidate.json"), "utf8")); +const { executionContracts: _legacyContracts, ...workspace } = candidate; +if (compiler.hexDigest(compiler.compileExecutionPlan(workspace)) !== compiler.hexDigest(plan)) + throw Error("CANDIDATE_PLAN_MISMATCH: build plan differs from source compilation"); +const checked = await compiler.loadCheckedArtifactWorld(plan, roots, generator); +const installation = await compiler.loadExecutionInstallation(plan, roots); +const kernel = compiler.compileKernelProgram(plan), + queries = compiler.compileQueryProgram(plan); for (const [file, value] of [ ["execution-world.json", checked.world], ["installation.json", installation], - ["kernel.json", compiler.compileKernelProgram(plan)], - ["queries.json", compiler.compileQueryProgram(plan)], - ["execution-artifacts.json", { codec: "camino-checked-execution-v1", roots, manifests: checked.manifests }], + ["kernel.json", kernel], + ["queries.json", queries], + [ + "execution-artifacts.json", + { + codec: "camino-checked-execution-v2", + generator, + roots, + manifests: checked.manifests, + programs: { kernel: compiler.hexDigest(kernel), queries: compiler.hexDigest(queries) }, + }, + ], ]) await writeFile(join(output, file), JSON.stringify(value) + "\n"); diff --git a/src/execution-world/candidate.ts b/src/execution-world/candidate.ts index 650c3f5..694ba48 100644 --- a/src/execution-world/candidate.ts +++ b/src/execution-world/candidate.ts @@ -1,11 +1,8 @@ import { open, lstat } from "node:fs/promises"; import { constants } from "node:fs"; import { join } from "node:path"; -import type { WorkspaceRevision } from "../capability-model/types.js"; -import { compileExecutionPlan, hexDigest, ExecutionPlanError, type ExecutionPlan } from "./plan.js"; +import { hexDigest, ExecutionPlanError, type ExecutionPlan } from "./plan.js"; import { loadExecutionInstallation, type PackageInstallationSelection } from "./installation.js"; -import { compileKernelProgram } from "./kernel.js"; -import { compileQueryProgram } from "./queries.js"; const rootPattern = /^\/nix\/store\/[a-z0-9]{32}-[^/\s]+$/; async function readJson(root: string, file: string): Promise { const handle = await open(join(root, file), constants.O_RDONLY | constants.O_NOFOLLOW); @@ -17,29 +14,35 @@ async function readJson(root: string, file: string): Promise { await handle.close(); } } -/** Revalidate the normal checked-candidate output. This is the shared artifact - * loader, not a second managed-only executable manifest or an activation grant. */ +/** Load the checked Nix output, preserving its original compilation and provenance. + * The selected toolchain validates generated code during the build. This loader + * checks stored identities and artifact/runtime contracts, never recompiles the + * historical candidate with whichever compiler happens to run the host. */ export async function loadCheckedInstallationCandidate( root: string, - generator: string, selections: Readonly> = {}, ) { if (!rootPattern.test(root) || !(await lstat(root)).isDirectory()) throw Error("Candidate must be an immutable Nix output directory"); - const [candidate, recordedPlan, artifacts, source, entryRequest] = await Promise.all([ + const [candidate, plan, artifacts, source, entryRequest, kernel, queries] = await Promise.all([ readJson(root, "candidate.json"), readJson(root, "execution-plan.json"), readJson(root, "execution-artifacts.json"), readJson(root, "source.json"), readJson(root, "entry.json"), + readJson(root, "kernel.json"), + readJson(root, "queries.json"), ]); const { executionContracts: _legacyContracts, ...workspace } = candidate; - const plan = compileExecutionPlan(workspace as WorkspaceRevision); - if (hexDigest(plan) !== hexDigest(recordedPlan)) + if ( + plan?.definition?.codec !== "camino-execution-plan-v1" || + hexDigest(plan.definition) !== plan.digest || + hexDigest(workspace) !== hexDigest(plan.definition.workspace) + ) throw new ExecutionPlanError( "CANDIDATE_PLAN_MISMATCH", root, - "Recompiled source contract differs from the stored plan", + "Stored plan must match its digest and exact workspace source contract", ); if ( source.kind !== "workspace" || @@ -57,7 +60,9 @@ export async function loadCheckedInstallationCandidate( ) throw new ExecutionPlanError("CANDIDATE_SOURCE_INVALID", root, "Expected a source URL without credentials"); if ( - artifacts.codec !== "camino-checked-execution-v1" || + artifacts.codec !== "camino-checked-execution-v2" || + typeof artifacts.generator !== "string" || + !/^[0-9a-f]{64}$/.test(artifacts.generator) || !artifacts.roots || typeof artifacts.roots !== "object" || Array.isArray(artifacts.roots) @@ -70,30 +75,37 @@ export async function loadCheckedInstallationCandidate( root, "Package artifacts must be immutable Nix roots", ); - const installation = await loadExecutionInstallation(plan, artifacts.roots, generator, selections); + const installation = await loadExecutionInstallation(plan, artifacts.roots, selections); const entry = compileWorkspaceEntry(plan, entryRequest); - const kernel = compileKernelProgram(plan), - queries = compileQueryProgram(plan); - // The isolated runner and managed host consume the same compiled programs. - for (const [file, expected] of [ - ["kernel.json", kernel], - ["queries.json", queries], + for (const [name, program, codec] of [ + ["kernel", kernel, "camino-kernel-program-v1"], + ["queries", queries, "camino-query-program-v1"], ] as const) - if (hexDigest(await readJson(root, file)) !== hexDigest(expected)) + if (program?.codec !== codec || program.plan !== plan.digest || hexDigest(program) !== artifacts.programs?.[name]) throw new ExecutionPlanError( "CANDIDATE_PROGRAM_MISMATCH", - file, - "Stored interpreter input differs from checked compilation", + name, + "Stored interpreter input must match the checked build and plan", ); const provenance = { workspaceRevision: workspace.id as string, source: { repository: source.repository as string, commit: source.commit as string }, - generator, - packages: plan.definition.packages.map((pkg) => ({ revision: pkg.revision, source: pkg.source })), + generator: artifacts.generator as string, + packages: (plan as ExecutionPlan).definition.packages.map((pkg) => ({ + revision: pkg.revision, + source: pkg.source, + })), }; const reference = { root, - digest: hexDigest({ plan: plan.digest, world: installation.world, provenance, roots: artifacts.roots, entry }), + digest: hexDigest({ + plan: plan.digest, + world: installation.world, + provenance, + roots: artifacts.roots, + entry, + programs: artifacts.programs, + }), }; return { reference, @@ -105,7 +117,7 @@ export async function loadCheckedInstallationCandidate( kernel, queries, installation, - executionPlan: plan, + executionPlan: plan as ExecutionPlan, }; } diff --git a/src/execution-world/installation.ts b/src/execution-world/installation.ts index a18832d..116d330 100644 --- a/src/execution-world/installation.ts +++ b/src/execution-world/installation.ts @@ -1,6 +1,6 @@ import path from "node:path"; import { loadCheckedArtifactWorld } from "./receipts.js"; -import { contentArtifactUrl } from "./files.js"; +import { contentArtifactUrl, loadArtifactWorld, type LoadedArtifactWorld } from "./files.js"; import { selectArtifactImplementation, type ArtifactImplementation, type ComponentArtifact } from "./artifacts.js"; import { ExecutionPlanError, hexDigest, type ExecutionPlan } from "./plan.js"; import { @@ -108,15 +108,32 @@ export interface InstalledComponent { readonly compatibility: ComponentArtifact["compatibility"]; readonly sharedModules: Readonly>; } -/** Verify candidate receipts before assembling process entrypoints and browser assets. - * This grants no authority to activate a world or run optional modules in process. */ -export async function loadExecutionInstallation( +/** Build-time validation uses the compiler selected by the Nix derivation. */ +export async function checkExecutionInstallation( plan: ExecutionPlan, roots: Readonly>, generator: string, selections: Readonly> = {}, ): Promise { const loaded = await loadCheckedArtifactWorld(plan, roots, generator); + return assembleExecutionInstallation(plan, roots, loaded, selections); +} +/** Load immutable artifacts without regenerating bindings with the host compiler. + * Format, coverage, content and runtime ABI checks still apply. This grants no + * authority to activate a world or run optional modules in process. */ +export async function loadExecutionInstallation( + plan: ExecutionPlan, + roots: Readonly>, + selections: Readonly> = {}, +): Promise { + return assembleExecutionInstallation(plan, roots, await loadArtifactWorld(plan, roots), selections); +} +function assembleExecutionInstallation( + plan: ExecutionPlan, + roots: Readonly>, + loaded: LoadedArtifactWorld, + selections: Readonly>, +): ExecutionInstallation { const fail = (where: string, message: string): never => { throw new ExecutionPlanError("INSTALLATION_INVALID", where, message); }; diff --git a/src/execution-world/receipts.ts b/src/execution-world/receipts.ts index fcd681a..b2de639 100644 --- a/src/execution-world/receipts.ts +++ b/src/execution-world/receipts.ts @@ -119,7 +119,8 @@ export async function checkArtifactReceipt( throw new ExecutionPlanError("INVALID_RECEIPT", file.path, "Generated bindings were replaced or omitted"); } } -/** Activation uses this entrypoint with its trusted generator identity, not the manifest-only loader. */ +/** Checked Nix builds validate generated sources with their selected compiler. + * Runtime loading uses the stored outputs instead of repeating compilation. */ export async function loadCheckedArtifactWorld( plan: ExecutionPlan, roots: Readonly>, diff --git a/test/presentations.test.ts b/test/presentations.test.ts index 9810bdd..af6b8fc 100644 --- a/test/presentations.test.ts +++ b/test/presentations.test.ts @@ -17,7 +17,7 @@ import { componentArtifactDigest, componentSharedModules, expectedArtifactReceipt, - loadExecutionInstallation, + checkExecutionInstallation, clientContractCatalog, type ComponentArtifact, type PackageArtifacts, @@ -208,7 +208,7 @@ test("checked component-only artifacts install without a service and reject miss await writeFile(path.join(root, file), content); } await writeFile(path.join(root, "share/quixos/build-receipt.json"), JSON.stringify(receipt)); - const installation = await loadExecutionInstallation(plan, { [pkg.revision]: root }, generator); + const installation = await checkExecutionInstallation(plan, { [pkg.revision]: root }, generator); assert.equal(installation.packages[0]!.service, undefined); assert.equal(installation.components[0]!.id, "component:card"); assert.ok(installation.routes[installation.components[0]!.url]); From 7173751f3738e306a4b0ce9739858724b774173f Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Tue, 22 Sep 2026 13:16:23 -0700 Subject: [PATCH 54/91] Implement typed module contracts and conformance bindings --- grammar/QuixosCapability.g4 | 22 +- nix/checked-candidate.nix | 10 +- src/capability-language/component-scaffold.ts | 2 +- .../generated/QuixosCapability.interp | 14 +- .../generated/QuixosCapability.tokens | 16 +- .../generated/QuixosCapabilityLexer.interp | 14 +- .../generated/QuixosCapabilityLexer.tokens | 16 +- .../generated/QuixosCapabilityLexer.ts | 1049 +++-- .../generated/QuixosCapabilityParser.ts | 3408 +++++++++-------- .../generated/QuixosCapabilityVisitor.ts | 20 +- src/capability-language/parser.ts | 81 +- src/capability-model/evolution.ts | 5 + src/capability-model/execution.ts | 2 +- src/capability-model/generics.ts | 7 + src/capability-model/index.ts | 1 + src/capability-model/modules.ts | 82 + src/capability-model/presentations.ts | 35 +- src/capability-model/types.ts | 29 +- src/capability-model/validation.ts | 16 +- src/execution-world/artifacts.ts | 9 +- src/execution-world/client-contracts.ts | 9 +- src/execution-world/plan.ts | 46 +- src/query/compile.ts | 2 +- src/query/link.ts | 7 +- src/query/relational-schema.ts | 2 +- src/query/schema.ts | 2 +- test/component-scaffold.test.ts | 10 +- test/emit-controllers.ts | 4 + test/emit-managed.ts | 41 +- test/fixtures/controller-device/DeviceView.qx | 5 + test/fixtures/controller-device/Viewer.qx | 3 +- test/modules.test.ts | 213 ++ test/presentations.test.ts | 42 +- 33 files changed, 2963 insertions(+), 2261 deletions(-) create mode 100644 src/capability-model/modules.ts create mode 100644 test/fixtures/controller-device/DeviceView.qx create mode 100644 test/modules.test.ts diff --git a/grammar/QuixosCapability.g4 b/grammar/QuixosCapability.g4 index c078096..9e43ccb 100644 --- a/grammar/QuixosCapability.g4 +++ b/grammar/QuixosCapability.g4 @@ -93,6 +93,11 @@ interfaceMember : valueMember | relationshipMember | operationMember + | moduleMember + ; + +moduleMember + : MODULE identifier ID stringLiteral CONTRACT stringLiteral (SUBJECT targetConstraint)? SEMI ; operationMember @@ -146,11 +151,11 @@ packageExport | packageConstructorExport | packageQuery | packageQuerySpecialization - | componentDecl + | moduleExport ; -componentDecl - : COMPONENT identifier ID stringLiteral SUBJECT interfaceType RUNTIME identifier SEMI +moduleExport + : MODULE identifier ID stringLiteral IMPLEMENTS interfaceType DOT identifier SEMI ; presentationDecl @@ -296,6 +301,11 @@ conformanceItem | stateFieldBindingDecl | initializationDecl | relationshipMaterializationDecl + | moduleBindingDecl + ; + +moduleBindingDecl + : BIND identifier TO identifier DOT identifier SEMI ; initializationDecl @@ -481,10 +491,8 @@ identifier | RESULT_BYTES | RPC_CALLS | DEADLINE_MS - | COMPONENT | PRESENTATION | SUBJECT - | RUNTIME | FOR ; @@ -493,10 +501,10 @@ stringLiteral ; EDIT: 'edit'; -COMPONENT: 'component'; +MODULE: 'module'; +CONTRACT: 'contract'; PRESENTATION: 'presentation'; SUBJECT: 'subject'; -RUNTIME: 'runtime'; FOR: 'for'; CREATION: 'creation'; INITIALIZE: 'initialize'; diff --git a/nix/checked-candidate.nix b/nix/checked-candidate.nix index 7a9c17f..fcb6fec 100644 --- a/nix/checked-candidate.nix +++ b/nix/checked-candidate.nix @@ -99,6 +99,14 @@ let let compiled = compile node; candidate = builtins.fromJSON (builtins.readFile "${compiled}/candidate.json"); + componentEntries = + if execution then + (pkgs.lib.findFirst ( + entry: entry.revision == candidate.revision.revisionId + ) { } (builtins.fromJSON (builtins.readFile "${contract}/execution-plan.json")).definition.packages) + .components or [ ] + else + [ ]; package = builtins.getFlake ( "git+${node.repository}?rev=${node.commit}&ref=refs/tags/quixos-reachability/${node.commit}" ); @@ -119,7 +127,7 @@ let typescript = runtimePackages.camino-replica-core.dependencies; packageRevisionId = candidate.revision.revisionId; } - // pkgs.lib.optionalAttrs ((candidate.revision.components or [ ]) != [ ]) { + // pkgs.lib.optionalAttrs (componentEntries != [ ]) { react = { sdk = runtimePackages.camino-react; runtime = runtimePackages.camino-react-runtime; diff --git a/src/capability-language/component-scaffold.ts b/src/capability-language/component-scaffold.ts index ff25544..9d3646b 100644 --- a/src/capability-language/component-scaffold.ts +++ b/src/capability-language/component-scaffold.ts @@ -14,7 +14,7 @@ export async function scaffoldComponent( throw Error("Component scaffold requires a PascalCase name, ID and QX declaration"); const source = `package Draft id "draft" revision "draft@1" { ${spec.declaration} }`; const syntax = parseQx(source); - const declarations = [...walkSyntax(syntax.root)].filter((node) => node.kind === "componentDecl"); + const declarations = [...walkSyntax(syntax.root)].filter((node) => node.kind === "moduleExport"); const pkg = syntax.root.children.find((node) => node.kind === "packageResourceDecl"); if ( syntax.diagnostics.length || diff --git a/src/capability-language/generated/QuixosCapability.interp b/src/capability-language/generated/QuixosCapability.interp index 24b63f2..6cdb3e6 100644 --- a/src/capability-language/generated/QuixosCapability.interp +++ b/src/capability-language/generated/QuixosCapability.interp @@ -1,10 +1,10 @@ token literal names: null 'edit' -'component' +'module' +'contract' 'presentation' 'subject' -'runtime' 'for' 'creation' 'initialize' @@ -157,10 +157,10 @@ null token symbolic names: null EDIT -COMPONENT +MODULE +CONTRACT PRESENTATION SUBJECT -RUNTIME FOR CREATION INITIALIZE @@ -329,6 +329,7 @@ typeArguments typeArgument typeAliasDecl interfaceMember +moduleMember operationMember valueMember valueMemberOperation @@ -338,7 +339,7 @@ relationshipOperation targetConstraint packageResourceDecl packageExport -componentDecl +moduleExport presentationDecl packageQuery packageQuerySpecialization @@ -365,6 +366,7 @@ edgeDecl edgeEndpoint conformanceDecl conformanceItem +moduleBindingDecl initializationDecl initializationField creationOwnerMapping @@ -393,4 +395,4 @@ stringLiteral atn: -[4, 1, 153, 1321, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 171, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 176, 8, 1, 10, 1, 12, 1, 179, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 197, 8, 3, 10, 3, 12, 3, 200, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 212, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 224, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 244, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 252, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 257, 8, 10, 10, 10, 12, 10, 260, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 265, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 275, 8, 10, 10, 10, 12, 10, 278, 9, 10, 3, 10, 280, 8, 10, 1, 10, 1, 10, 5, 10, 284, 8, 10, 10, 10, 12, 10, 287, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 295, 8, 11, 10, 11, 12, 11, 298, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 306, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 314, 8, 12, 10, 12, 12, 12, 317, 9, 12, 3, 12, 319, 8, 12, 3, 12, 321, 8, 12, 1, 13, 1, 13, 3, 13, 325, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 331, 8, 14, 10, 14, 12, 14, 334, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 345, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 350, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 359, 8, 17, 1, 18, 3, 18, 362, 8, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 377, 8, 18, 1, 18, 1, 18, 1, 18, 1, 19, 3, 19, 383, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 5, 19, 393, 8, 19, 10, 19, 12, 19, 396, 9, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 404, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 412, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 420, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 433, 8, 20, 1, 21, 3, 21, 436, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 446, 8, 21, 1, 21, 1, 21, 3, 21, 450, 8, 21, 1, 21, 1, 21, 5, 21, 454, 8, 21, 10, 21, 12, 21, 457, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 3, 22, 463, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 469, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 477, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 485, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 498, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 505, 8, 24, 1, 24, 1, 24, 3, 24, 509, 8, 24, 1, 25, 5, 25, 512, 8, 25, 10, 25, 12, 25, 515, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 525, 8, 25, 1, 25, 1, 25, 5, 25, 529, 8, 25, 10, 25, 12, 25, 532, 9, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 542, 8, 26, 1, 27, 1, 27, 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, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 3, 29, 569, 8, 29, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 575, 8, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 584, 8, 29, 10, 29, 12, 29, 587, 9, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 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, 31, 1, 31, 1, 31, 3, 31, 613, 8, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 640, 8, 31, 1, 32, 1, 32, 1, 32, 3, 32, 645, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 656, 8, 32, 1, 32, 3, 32, 659, 8, 32, 1, 32, 1, 32, 1, 32, 3, 32, 664, 8, 32, 1, 32, 3, 32, 667, 8, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 3, 33, 674, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 683, 8, 33, 1, 33, 3, 33, 686, 8, 33, 1, 33, 3, 33, 689, 8, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 706, 8, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 5, 36, 713, 8, 36, 10, 36, 12, 36, 716, 9, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 729, 8, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 5, 40, 748, 8, 40, 10, 40, 12, 40, 751, 9, 40, 3, 40, 753, 8, 40, 1, 40, 3, 40, 756, 8, 40, 1, 41, 1, 41, 1, 41, 5, 41, 761, 8, 41, 10, 41, 12, 41, 764, 9, 41, 1, 42, 1, 42, 1, 42, 5, 42, 769, 8, 42, 10, 42, 12, 42, 772, 9, 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, 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, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 811, 8, 43, 1, 43, 3, 43, 814, 8, 43, 1, 43, 1, 43, 3, 43, 818, 8, 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, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 840, 8, 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, 854, 8, 43, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 860, 8, 44, 10, 44, 12, 44, 863, 9, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 3, 47, 874, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 888, 8, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 898, 8, 49, 1, 50, 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, 51, 1, 51, 3, 51, 916, 8, 51, 1, 51, 1, 51, 3, 51, 920, 8, 51, 1, 51, 3, 51, 923, 8, 51, 1, 51, 1, 51, 3, 51, 927, 8, 51, 1, 51, 3, 51, 930, 8, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 939, 8, 52, 1, 52, 1, 52, 3, 52, 943, 8, 52, 1, 52, 1, 52, 3, 52, 947, 8, 52, 1, 52, 1, 52, 5, 52, 951, 8, 52, 10, 52, 12, 52, 954, 9, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 964, 8, 53, 1, 54, 1, 54, 1, 54, 5, 54, 969, 8, 54, 10, 54, 12, 54, 972, 9, 54, 1, 54, 1, 54, 1, 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, 1, 55, 1, 55, 3, 55, 991, 8, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 998, 8, 56, 10, 56, 12, 56, 1001, 9, 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, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1032, 8, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 1052, 8, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 3, 62, 1072, 8, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 3, 62, 1082, 8, 62, 1, 62, 3, 62, 1085, 8, 62, 1, 62, 3, 62, 1088, 8, 62, 3, 62, 1090, 8, 62, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 5, 66, 1102, 8, 66, 10, 66, 12, 66, 1105, 9, 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, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1128, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1144, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1153, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1163, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 5, 67, 1174, 8, 67, 10, 67, 12, 67, 1177, 9, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1191, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1203, 8, 67, 1, 67, 1, 67, 3, 67, 1207, 8, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 3, 68, 1216, 8, 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, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1234, 8, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 5, 69, 1256, 8, 69, 10, 69, 12, 69, 1259, 9, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1264, 8, 69, 3, 69, 1266, 8, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1285, 8, 73, 1, 74, 1, 74, 1, 74, 1, 74, 5, 74, 1291, 8, 74, 10, 74, 12, 74, 1294, 9, 74, 3, 74, 1296, 8, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 5, 76, 1308, 8, 76, 10, 76, 12, 76, 1311, 9, 76, 3, 76, 1313, 8, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 0, 0, 79, 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, 0, 9, 2, 0, 15, 15, 33, 33, 1, 0, 11, 12, 1, 0, 101, 105, 3, 0, 1, 1, 96, 100, 102, 103, 3, 0, 1, 1, 96, 97, 102, 103, 2, 0, 98, 100, 102, 103, 1, 0, 121, 128, 1, 0, 108, 111, 7, 0, 1, 8, 10, 33, 45, 45, 74, 74, 94, 95, 106, 106, 149, 149, 1428, 0, 170, 1, 0, 0, 0, 2, 172, 1, 0, 0, 0, 4, 182, 1, 0, 0, 0, 6, 186, 1, 0, 0, 0, 8, 211, 1, 0, 0, 0, 10, 223, 1, 0, 0, 0, 12, 225, 1, 0, 0, 0, 14, 232, 1, 0, 0, 0, 16, 243, 1, 0, 0, 0, 18, 245, 1, 0, 0, 0, 20, 258, 1, 0, 0, 0, 22, 290, 1, 0, 0, 0, 24, 320, 1, 0, 0, 0, 26, 322, 1, 0, 0, 0, 28, 326, 1, 0, 0, 0, 30, 344, 1, 0, 0, 0, 32, 346, 1, 0, 0, 0, 34, 358, 1, 0, 0, 0, 36, 361, 1, 0, 0, 0, 38, 382, 1, 0, 0, 0, 40, 432, 1, 0, 0, 0, 42, 435, 1, 0, 0, 0, 44, 460, 1, 0, 0, 0, 46, 497, 1, 0, 0, 0, 48, 508, 1, 0, 0, 0, 50, 513, 1, 0, 0, 0, 52, 541, 1, 0, 0, 0, 54, 543, 1, 0, 0, 0, 56, 553, 1, 0, 0, 0, 58, 565, 1, 0, 0, 0, 60, 590, 1, 0, 0, 0, 62, 639, 1, 0, 0, 0, 64, 641, 1, 0, 0, 0, 66, 670, 1, 0, 0, 0, 68, 692, 1, 0, 0, 0, 70, 705, 1, 0, 0, 0, 72, 707, 1, 0, 0, 0, 74, 719, 1, 0, 0, 0, 76, 732, 1, 0, 0, 0, 78, 735, 1, 0, 0, 0, 80, 755, 1, 0, 0, 0, 82, 757, 1, 0, 0, 0, 84, 765, 1, 0, 0, 0, 86, 853, 1, 0, 0, 0, 88, 855, 1, 0, 0, 0, 90, 866, 1, 0, 0, 0, 92, 868, 1, 0, 0, 0, 94, 873, 1, 0, 0, 0, 96, 875, 1, 0, 0, 0, 98, 897, 1, 0, 0, 0, 100, 899, 1, 0, 0, 0, 102, 908, 1, 0, 0, 0, 104, 933, 1, 0, 0, 0, 106, 963, 1, 0, 0, 0, 108, 965, 1, 0, 0, 0, 110, 990, 1, 0, 0, 0, 112, 992, 1, 0, 0, 0, 114, 1004, 1, 0, 0, 0, 116, 1011, 1, 0, 0, 0, 118, 1025, 1, 0, 0, 0, 120, 1035, 1, 0, 0, 0, 122, 1051, 1, 0, 0, 0, 124, 1089, 1, 0, 0, 0, 126, 1091, 1, 0, 0, 0, 128, 1094, 1, 0, 0, 0, 130, 1096, 1, 0, 0, 0, 132, 1098, 1, 0, 0, 0, 134, 1206, 1, 0, 0, 0, 136, 1208, 1, 0, 0, 0, 138, 1265, 1, 0, 0, 0, 140, 1267, 1, 0, 0, 0, 142, 1272, 1, 0, 0, 0, 144, 1274, 1, 0, 0, 0, 146, 1284, 1, 0, 0, 0, 148, 1286, 1, 0, 0, 0, 150, 1299, 1, 0, 0, 0, 152, 1303, 1, 0, 0, 0, 154, 1316, 1, 0, 0, 0, 156, 1318, 1, 0, 0, 0, 158, 159, 3, 6, 3, 0, 159, 160, 5, 0, 0, 1, 160, 171, 1, 0, 0, 0, 161, 162, 3, 20, 10, 0, 162, 163, 5, 0, 0, 1, 163, 171, 1, 0, 0, 0, 164, 165, 3, 50, 25, 0, 165, 166, 5, 0, 0, 1, 166, 171, 1, 0, 0, 0, 167, 168, 3, 2, 1, 0, 168, 169, 5, 0, 0, 1, 169, 171, 1, 0, 0, 0, 170, 158, 1, 0, 0, 0, 170, 161, 1, 0, 0, 0, 170, 164, 1, 0, 0, 0, 170, 167, 1, 0, 0, 0, 171, 1, 1, 0, 0, 0, 172, 173, 5, 40, 0, 0, 173, 177, 5, 137, 0, 0, 174, 176, 3, 8, 4, 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, 138, 0, 0, 181, 3, 1, 0, 0, 0, 182, 183, 5, 41, 0, 0, 183, 184, 3, 156, 78, 0, 184, 185, 5, 134, 0, 0, 185, 5, 1, 0, 0, 0, 186, 187, 5, 9, 0, 0, 187, 188, 3, 154, 77, 0, 188, 189, 5, 84, 0, 0, 189, 190, 3, 156, 78, 0, 190, 191, 5, 77, 0, 0, 191, 192, 3, 156, 78, 0, 192, 193, 5, 76, 0, 0, 193, 194, 3, 156, 78, 0, 194, 198, 5, 137, 0, 0, 195, 197, 3, 8, 4, 0, 196, 195, 1, 0, 0, 0, 197, 200, 1, 0, 0, 0, 198, 196, 1, 0, 0, 0, 198, 199, 1, 0, 0, 0, 199, 201, 1, 0, 0, 0, 200, 198, 1, 0, 0, 0, 201, 202, 5, 138, 0, 0, 202, 7, 1, 0, 0, 0, 203, 212, 3, 4, 2, 0, 204, 212, 3, 18, 9, 0, 205, 212, 3, 10, 5, 0, 206, 212, 3, 92, 46, 0, 207, 212, 3, 104, 52, 0, 208, 212, 3, 136, 68, 0, 209, 212, 3, 56, 28, 0, 210, 212, 3, 32, 16, 0, 211, 203, 1, 0, 0, 0, 211, 204, 1, 0, 0, 0, 211, 205, 1, 0, 0, 0, 211, 206, 1, 0, 0, 0, 211, 207, 1, 0, 0, 0, 211, 208, 1, 0, 0, 0, 211, 209, 1, 0, 0, 0, 211, 210, 1, 0, 0, 0, 212, 9, 1, 0, 0, 0, 213, 214, 5, 41, 0, 0, 214, 215, 5, 44, 0, 0, 215, 216, 3, 154, 77, 0, 216, 217, 5, 134, 0, 0, 217, 224, 1, 0, 0, 0, 218, 219, 5, 41, 0, 0, 219, 220, 5, 46, 0, 0, 220, 221, 3, 154, 77, 0, 221, 222, 5, 134, 0, 0, 222, 224, 1, 0, 0, 0, 223, 213, 1, 0, 0, 0, 223, 218, 1, 0, 0, 0, 224, 11, 1, 0, 0, 0, 225, 226, 5, 42, 0, 0, 226, 227, 5, 43, 0, 0, 227, 228, 3, 154, 77, 0, 228, 229, 5, 84, 0, 0, 229, 230, 3, 156, 78, 0, 230, 231, 5, 134, 0, 0, 231, 13, 1, 0, 0, 0, 232, 233, 5, 42, 0, 0, 233, 234, 5, 44, 0, 0, 234, 235, 3, 154, 77, 0, 235, 236, 5, 77, 0, 0, 236, 237, 3, 156, 78, 0, 237, 238, 5, 134, 0, 0, 238, 15, 1, 0, 0, 0, 239, 244, 3, 10, 5, 0, 240, 244, 3, 12, 6, 0, 241, 244, 3, 14, 7, 0, 242, 244, 3, 32, 16, 0, 243, 239, 1, 0, 0, 0, 243, 240, 1, 0, 0, 0, 243, 241, 1, 0, 0, 0, 243, 242, 1, 0, 0, 0, 244, 17, 1, 0, 0, 0, 245, 246, 5, 43, 0, 0, 246, 247, 3, 154, 77, 0, 247, 248, 5, 84, 0, 0, 248, 251, 3, 156, 78, 0, 249, 250, 5, 85, 0, 0, 250, 252, 3, 156, 78, 0, 251, 249, 1, 0, 0, 0, 251, 252, 1, 0, 0, 0, 252, 253, 1, 0, 0, 0, 253, 254, 5, 134, 0, 0, 254, 19, 1, 0, 0, 0, 255, 257, 3, 16, 8, 0, 256, 255, 1, 0, 0, 0, 257, 260, 1, 0, 0, 0, 258, 256, 1, 0, 0, 0, 258, 259, 1, 0, 0, 0, 259, 261, 1, 0, 0, 0, 260, 258, 1, 0, 0, 0, 261, 262, 5, 44, 0, 0, 262, 264, 3, 154, 77, 0, 263, 265, 3, 22, 11, 0, 264, 263, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 266, 1, 0, 0, 0, 266, 267, 5, 84, 0, 0, 267, 268, 3, 156, 78, 0, 268, 269, 5, 77, 0, 0, 269, 279, 3, 156, 78, 0, 270, 271, 5, 89, 0, 0, 271, 276, 3, 26, 13, 0, 272, 273, 5, 135, 0, 0, 273, 275, 3, 26, 13, 0, 274, 272, 1, 0, 0, 0, 275, 278, 1, 0, 0, 0, 276, 274, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 280, 1, 0, 0, 0, 278, 276, 1, 0, 0, 0, 279, 270, 1, 0, 0, 0, 279, 280, 1, 0, 0, 0, 280, 281, 1, 0, 0, 0, 281, 285, 5, 137, 0, 0, 282, 284, 3, 34, 17, 0, 283, 282, 1, 0, 0, 0, 284, 287, 1, 0, 0, 0, 285, 283, 1, 0, 0, 0, 285, 286, 1, 0, 0, 0, 286, 288, 1, 0, 0, 0, 287, 285, 1, 0, 0, 0, 288, 289, 5, 138, 0, 0, 289, 21, 1, 0, 0, 0, 290, 291, 5, 143, 0, 0, 291, 296, 3, 24, 12, 0, 292, 293, 5, 135, 0, 0, 293, 295, 3, 24, 12, 0, 294, 292, 1, 0, 0, 0, 295, 298, 1, 0, 0, 0, 296, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 299, 1, 0, 0, 0, 298, 296, 1, 0, 0, 0, 299, 300, 5, 144, 0, 0, 300, 23, 1, 0, 0, 0, 301, 302, 5, 47, 0, 0, 302, 305, 3, 154, 77, 0, 303, 304, 5, 133, 0, 0, 304, 306, 5, 37, 0, 0, 305, 303, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 321, 1, 0, 0, 0, 307, 308, 5, 36, 0, 0, 308, 318, 3, 154, 77, 0, 309, 310, 5, 38, 0, 0, 310, 315, 3, 26, 13, 0, 311, 312, 5, 145, 0, 0, 312, 314, 3, 26, 13, 0, 313, 311, 1, 0, 0, 0, 314, 317, 1, 0, 0, 0, 315, 313, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 319, 1, 0, 0, 0, 317, 315, 1, 0, 0, 0, 318, 309, 1, 0, 0, 0, 318, 319, 1, 0, 0, 0, 319, 321, 1, 0, 0, 0, 320, 301, 1, 0, 0, 0, 320, 307, 1, 0, 0, 0, 321, 25, 1, 0, 0, 0, 322, 324, 3, 154, 77, 0, 323, 325, 3, 28, 14, 0, 324, 323, 1, 0, 0, 0, 324, 325, 1, 0, 0, 0, 325, 27, 1, 0, 0, 0, 326, 327, 5, 143, 0, 0, 327, 332, 3, 30, 15, 0, 328, 329, 5, 135, 0, 0, 329, 331, 3, 30, 15, 0, 330, 328, 1, 0, 0, 0, 331, 334, 1, 0, 0, 0, 332, 330, 1, 0, 0, 0, 332, 333, 1, 0, 0, 0, 333, 335, 1, 0, 0, 0, 334, 332, 1, 0, 0, 0, 335, 336, 5, 144, 0, 0, 336, 29, 1, 0, 0, 0, 337, 338, 5, 43, 0, 0, 338, 345, 3, 154, 77, 0, 339, 340, 5, 44, 0, 0, 340, 345, 3, 26, 13, 0, 341, 342, 5, 36, 0, 0, 342, 345, 3, 154, 77, 0, 343, 345, 3, 138, 69, 0, 344, 337, 1, 0, 0, 0, 344, 339, 1, 0, 0, 0, 344, 341, 1, 0, 0, 0, 344, 343, 1, 0, 0, 0, 345, 31, 1, 0, 0, 0, 346, 347, 5, 35, 0, 0, 347, 349, 3, 154, 77, 0, 348, 350, 3, 22, 11, 0, 349, 348, 1, 0, 0, 0, 349, 350, 1, 0, 0, 0, 350, 351, 1, 0, 0, 0, 351, 352, 5, 146, 0, 0, 352, 353, 3, 138, 69, 0, 353, 354, 5, 134, 0, 0, 354, 33, 1, 0, 0, 0, 355, 359, 3, 38, 19, 0, 356, 359, 3, 42, 21, 0, 357, 359, 3, 36, 18, 0, 358, 355, 1, 0, 0, 0, 358, 356, 1, 0, 0, 0, 358, 357, 1, 0, 0, 0, 359, 35, 1, 0, 0, 0, 360, 362, 5, 57, 0, 0, 361, 360, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 363, 1, 0, 0, 0, 363, 364, 5, 49, 0, 0, 364, 365, 3, 154, 77, 0, 365, 366, 5, 84, 0, 0, 366, 367, 3, 156, 78, 0, 367, 368, 5, 133, 0, 0, 368, 369, 3, 138, 69, 0, 369, 370, 5, 132, 0, 0, 370, 371, 3, 138, 69, 0, 371, 372, 5, 137, 0, 0, 372, 373, 5, 101, 0, 0, 373, 374, 5, 84, 0, 0, 374, 376, 3, 156, 78, 0, 375, 377, 3, 70, 35, 0, 376, 375, 1, 0, 0, 0, 376, 377, 1, 0, 0, 0, 377, 378, 1, 0, 0, 0, 378, 379, 5, 134, 0, 0, 379, 380, 5, 138, 0, 0, 380, 37, 1, 0, 0, 0, 381, 383, 3, 44, 22, 0, 382, 381, 1, 0, 0, 0, 382, 383, 1, 0, 0, 0, 383, 384, 1, 0, 0, 0, 384, 385, 5, 47, 0, 0, 385, 386, 3, 154, 77, 0, 386, 387, 5, 84, 0, 0, 387, 388, 3, 156, 78, 0, 388, 389, 5, 133, 0, 0, 389, 390, 3, 138, 69, 0, 390, 394, 5, 137, 0, 0, 391, 393, 3, 40, 20, 0, 392, 391, 1, 0, 0, 0, 393, 396, 1, 0, 0, 0, 394, 392, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 397, 1, 0, 0, 0, 396, 394, 1, 0, 0, 0, 397, 398, 5, 138, 0, 0, 398, 39, 1, 0, 0, 0, 399, 400, 5, 91, 0, 0, 400, 401, 5, 84, 0, 0, 401, 403, 3, 156, 78, 0, 402, 404, 3, 70, 35, 0, 403, 402, 1, 0, 0, 0, 403, 404, 1, 0, 0, 0, 404, 405, 1, 0, 0, 0, 405, 406, 5, 134, 0, 0, 406, 433, 1, 0, 0, 0, 407, 408, 5, 92, 0, 0, 408, 409, 5, 84, 0, 0, 409, 411, 3, 156, 78, 0, 410, 412, 3, 70, 35, 0, 411, 410, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 413, 1, 0, 0, 0, 413, 414, 5, 134, 0, 0, 414, 433, 1, 0, 0, 0, 415, 416, 5, 1, 0, 0, 416, 417, 5, 84, 0, 0, 417, 419, 3, 156, 78, 0, 418, 420, 3, 70, 35, 0, 419, 418, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 421, 1, 0, 0, 0, 421, 422, 5, 134, 0, 0, 422, 433, 1, 0, 0, 0, 423, 424, 5, 93, 0, 0, 424, 425, 5, 94, 0, 0, 425, 426, 5, 84, 0, 0, 426, 427, 3, 156, 78, 0, 427, 428, 5, 95, 0, 0, 428, 429, 5, 84, 0, 0, 429, 430, 3, 156, 78, 0, 430, 431, 5, 134, 0, 0, 431, 433, 1, 0, 0, 0, 432, 399, 1, 0, 0, 0, 432, 407, 1, 0, 0, 0, 432, 415, 1, 0, 0, 0, 432, 423, 1, 0, 0, 0, 433, 41, 1, 0, 0, 0, 434, 436, 3, 44, 22, 0, 435, 434, 1, 0, 0, 0, 435, 436, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 438, 5, 48, 0, 0, 438, 439, 3, 154, 77, 0, 439, 440, 5, 84, 0, 0, 440, 441, 3, 156, 78, 0, 441, 442, 5, 133, 0, 0, 442, 443, 3, 144, 72, 0, 443, 445, 3, 48, 24, 0, 444, 446, 5, 112, 0, 0, 445, 444, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 449, 1, 0, 0, 0, 447, 448, 5, 82, 0, 0, 448, 450, 3, 156, 78, 0, 449, 447, 1, 0, 0, 0, 449, 450, 1, 0, 0, 0, 450, 451, 1, 0, 0, 0, 451, 455, 5, 137, 0, 0, 452, 454, 3, 46, 23, 0, 453, 452, 1, 0, 0, 0, 454, 457, 1, 0, 0, 0, 455, 453, 1, 0, 0, 0, 455, 456, 1, 0, 0, 0, 456, 458, 1, 0, 0, 0, 457, 455, 1, 0, 0, 0, 458, 459, 5, 138, 0, 0, 459, 43, 1, 0, 0, 0, 460, 462, 5, 32, 0, 0, 461, 463, 7, 0, 0, 0, 462, 461, 1, 0, 0, 0, 462, 463, 1, 0, 0, 0, 463, 45, 1, 0, 0, 0, 464, 465, 5, 98, 0, 0, 465, 466, 5, 84, 0, 0, 466, 468, 3, 156, 78, 0, 467, 469, 3, 70, 35, 0, 468, 467, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 470, 1, 0, 0, 0, 470, 471, 5, 134, 0, 0, 471, 498, 1, 0, 0, 0, 472, 473, 5, 99, 0, 0, 473, 474, 5, 84, 0, 0, 474, 476, 3, 156, 78, 0, 475, 477, 3, 70, 35, 0, 476, 475, 1, 0, 0, 0, 476, 477, 1, 0, 0, 0, 477, 478, 1, 0, 0, 0, 478, 479, 5, 134, 0, 0, 479, 498, 1, 0, 0, 0, 480, 481, 5, 100, 0, 0, 481, 482, 5, 84, 0, 0, 482, 484, 3, 156, 78, 0, 483, 485, 3, 70, 35, 0, 484, 483, 1, 0, 0, 0, 484, 485, 1, 0, 0, 0, 485, 486, 1, 0, 0, 0, 486, 487, 5, 134, 0, 0, 487, 498, 1, 0, 0, 0, 488, 489, 5, 93, 0, 0, 489, 490, 5, 94, 0, 0, 490, 491, 5, 84, 0, 0, 491, 492, 3, 156, 78, 0, 492, 493, 5, 95, 0, 0, 493, 494, 5, 84, 0, 0, 494, 495, 3, 156, 78, 0, 495, 496, 5, 134, 0, 0, 496, 498, 1, 0, 0, 0, 497, 464, 1, 0, 0, 0, 497, 472, 1, 0, 0, 0, 497, 480, 1, 0, 0, 0, 497, 488, 1, 0, 0, 0, 498, 47, 1, 0, 0, 0, 499, 500, 5, 43, 0, 0, 500, 509, 3, 154, 77, 0, 501, 502, 5, 44, 0, 0, 502, 504, 3, 154, 77, 0, 503, 505, 3, 28, 14, 0, 504, 503, 1, 0, 0, 0, 504, 505, 1, 0, 0, 0, 505, 509, 1, 0, 0, 0, 506, 507, 5, 36, 0, 0, 507, 509, 3, 154, 77, 0, 508, 499, 1, 0, 0, 0, 508, 501, 1, 0, 0, 0, 508, 506, 1, 0, 0, 0, 509, 49, 1, 0, 0, 0, 510, 512, 3, 16, 8, 0, 511, 510, 1, 0, 0, 0, 512, 515, 1, 0, 0, 0, 513, 511, 1, 0, 0, 0, 513, 514, 1, 0, 0, 0, 514, 516, 1, 0, 0, 0, 515, 513, 1, 0, 0, 0, 516, 517, 5, 46, 0, 0, 517, 518, 3, 154, 77, 0, 518, 519, 5, 84, 0, 0, 519, 520, 3, 156, 78, 0, 520, 521, 5, 77, 0, 0, 521, 524, 3, 156, 78, 0, 522, 523, 5, 78, 0, 0, 523, 525, 5, 147, 0, 0, 524, 522, 1, 0, 0, 0, 524, 525, 1, 0, 0, 0, 525, 526, 1, 0, 0, 0, 526, 530, 5, 137, 0, 0, 527, 529, 3, 52, 26, 0, 528, 527, 1, 0, 0, 0, 529, 532, 1, 0, 0, 0, 530, 528, 1, 0, 0, 0, 530, 531, 1, 0, 0, 0, 531, 533, 1, 0, 0, 0, 532, 530, 1, 0, 0, 0, 533, 534, 5, 138, 0, 0, 534, 51, 1, 0, 0, 0, 535, 542, 3, 64, 32, 0, 536, 542, 3, 66, 33, 0, 537, 542, 3, 74, 37, 0, 538, 542, 3, 58, 29, 0, 539, 542, 3, 60, 30, 0, 540, 542, 3, 54, 27, 0, 541, 535, 1, 0, 0, 0, 541, 536, 1, 0, 0, 0, 541, 537, 1, 0, 0, 0, 541, 538, 1, 0, 0, 0, 541, 539, 1, 0, 0, 0, 541, 540, 1, 0, 0, 0, 542, 53, 1, 0, 0, 0, 543, 544, 5, 2, 0, 0, 544, 545, 3, 154, 77, 0, 545, 546, 5, 84, 0, 0, 546, 547, 3, 156, 78, 0, 547, 548, 5, 4, 0, 0, 548, 549, 3, 26, 13, 0, 549, 550, 5, 5, 0, 0, 550, 551, 3, 154, 77, 0, 551, 552, 5, 134, 0, 0, 552, 55, 1, 0, 0, 0, 553, 554, 5, 3, 0, 0, 554, 555, 3, 154, 77, 0, 555, 556, 5, 84, 0, 0, 556, 557, 3, 156, 78, 0, 557, 558, 5, 6, 0, 0, 558, 559, 3, 26, 13, 0, 559, 560, 5, 65, 0, 0, 560, 561, 3, 154, 77, 0, 561, 562, 5, 136, 0, 0, 562, 563, 3, 154, 77, 0, 563, 564, 5, 134, 0, 0, 564, 57, 1, 0, 0, 0, 565, 566, 5, 22, 0, 0, 566, 568, 3, 154, 77, 0, 567, 569, 3, 22, 11, 0, 568, 567, 1, 0, 0, 0, 568, 569, 1, 0, 0, 0, 569, 570, 1, 0, 0, 0, 570, 571, 5, 84, 0, 0, 571, 572, 3, 156, 78, 0, 572, 574, 5, 25, 0, 0, 573, 575, 5, 9, 0, 0, 574, 573, 1, 0, 0, 0, 574, 575, 1, 0, 0, 0, 575, 576, 1, 0, 0, 0, 576, 577, 3, 26, 13, 0, 577, 578, 5, 26, 0, 0, 578, 579, 3, 156, 78, 0, 579, 580, 5, 49, 0, 0, 580, 581, 3, 156, 78, 0, 581, 585, 5, 137, 0, 0, 582, 584, 3, 62, 31, 0, 583, 582, 1, 0, 0, 0, 584, 587, 1, 0, 0, 0, 585, 583, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 588, 1, 0, 0, 0, 587, 585, 1, 0, 0, 0, 588, 589, 5, 138, 0, 0, 589, 59, 1, 0, 0, 0, 590, 591, 5, 22, 0, 0, 591, 592, 3, 154, 77, 0, 592, 593, 5, 84, 0, 0, 593, 594, 3, 156, 78, 0, 594, 595, 5, 24, 0, 0, 595, 596, 3, 154, 77, 0, 596, 597, 3, 28, 14, 0, 597, 598, 5, 134, 0, 0, 598, 61, 1, 0, 0, 0, 599, 600, 5, 16, 0, 0, 600, 640, 5, 134, 0, 0, 601, 602, 5, 17, 0, 0, 602, 603, 5, 18, 0, 0, 603, 604, 3, 154, 77, 0, 604, 605, 5, 134, 0, 0, 605, 640, 1, 0, 0, 0, 606, 607, 5, 27, 0, 0, 607, 608, 3, 156, 78, 0, 608, 609, 5, 134, 0, 0, 609, 640, 1, 0, 0, 0, 610, 612, 5, 28, 0, 0, 611, 613, 5, 36, 0, 0, 612, 611, 1, 0, 0, 0, 612, 613, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 615, 3, 154, 77, 0, 615, 616, 5, 55, 0, 0, 616, 617, 3, 26, 13, 0, 617, 618, 5, 134, 0, 0, 618, 640, 1, 0, 0, 0, 619, 620, 5, 29, 0, 0, 620, 621, 3, 154, 77, 0, 621, 622, 5, 147, 0, 0, 622, 623, 5, 134, 0, 0, 623, 640, 1, 0, 0, 0, 624, 625, 5, 30, 0, 0, 625, 626, 3, 26, 13, 0, 626, 627, 5, 136, 0, 0, 627, 628, 3, 154, 77, 0, 628, 629, 3, 154, 77, 0, 629, 630, 3, 156, 78, 0, 630, 631, 5, 134, 0, 0, 631, 640, 1, 0, 0, 0, 632, 633, 5, 93, 0, 0, 633, 640, 5, 134, 0, 0, 634, 635, 5, 31, 0, 0, 635, 636, 5, 147, 0, 0, 636, 637, 3, 156, 78, 0, 637, 638, 5, 134, 0, 0, 638, 640, 1, 0, 0, 0, 639, 599, 1, 0, 0, 0, 639, 601, 1, 0, 0, 0, 639, 606, 1, 0, 0, 0, 639, 610, 1, 0, 0, 0, 639, 619, 1, 0, 0, 0, 639, 624, 1, 0, 0, 0, 639, 632, 1, 0, 0, 0, 639, 634, 1, 0, 0, 0, 640, 63, 1, 0, 0, 0, 641, 642, 5, 49, 0, 0, 642, 644, 3, 154, 77, 0, 643, 645, 3, 22, 11, 0, 644, 643, 1, 0, 0, 0, 644, 645, 1, 0, 0, 0, 645, 646, 1, 0, 0, 0, 646, 647, 5, 84, 0, 0, 647, 648, 3, 156, 78, 0, 648, 649, 5, 133, 0, 0, 649, 650, 3, 138, 69, 0, 650, 651, 5, 132, 0, 0, 651, 652, 3, 138, 69, 0, 652, 653, 5, 86, 0, 0, 653, 655, 3, 78, 39, 0, 654, 656, 3, 70, 35, 0, 655, 654, 1, 0, 0, 0, 655, 656, 1, 0, 0, 0, 656, 658, 1, 0, 0, 0, 657, 659, 3, 76, 38, 0, 658, 657, 1, 0, 0, 0, 658, 659, 1, 0, 0, 0, 659, 660, 1, 0, 0, 0, 660, 661, 5, 88, 0, 0, 661, 663, 3, 80, 40, 0, 662, 664, 3, 84, 42, 0, 663, 662, 1, 0, 0, 0, 663, 664, 1, 0, 0, 0, 664, 666, 1, 0, 0, 0, 665, 667, 3, 68, 34, 0, 666, 665, 1, 0, 0, 0, 666, 667, 1, 0, 0, 0, 667, 668, 1, 0, 0, 0, 668, 669, 5, 134, 0, 0, 669, 65, 1, 0, 0, 0, 670, 671, 5, 50, 0, 0, 671, 673, 3, 154, 77, 0, 672, 674, 3, 22, 11, 0, 673, 672, 1, 0, 0, 0, 673, 674, 1, 0, 0, 0, 674, 675, 1, 0, 0, 0, 675, 676, 5, 84, 0, 0, 676, 677, 3, 156, 78, 0, 677, 678, 5, 133, 0, 0, 678, 679, 3, 138, 69, 0, 679, 680, 5, 132, 0, 0, 680, 682, 3, 138, 69, 0, 681, 683, 3, 70, 35, 0, 682, 681, 1, 0, 0, 0, 682, 683, 1, 0, 0, 0, 683, 685, 1, 0, 0, 0, 684, 686, 3, 84, 42, 0, 685, 684, 1, 0, 0, 0, 685, 686, 1, 0, 0, 0, 686, 688, 1, 0, 0, 0, 687, 689, 3, 68, 34, 0, 688, 687, 1, 0, 0, 0, 688, 689, 1, 0, 0, 0, 689, 690, 1, 0, 0, 0, 690, 691, 5, 134, 0, 0, 691, 67, 1, 0, 0, 0, 692, 693, 5, 66, 0, 0, 693, 694, 5, 65, 0, 0, 694, 695, 3, 154, 77, 0, 695, 69, 1, 0, 0, 0, 696, 697, 5, 10, 0, 0, 697, 706, 5, 13, 0, 0, 698, 699, 5, 10, 0, 0, 699, 700, 7, 1, 0, 0, 700, 701, 5, 14, 0, 0, 701, 702, 5, 139, 0, 0, 702, 703, 3, 82, 41, 0, 703, 704, 5, 140, 0, 0, 704, 706, 1, 0, 0, 0, 705, 696, 1, 0, 0, 0, 705, 698, 1, 0, 0, 0, 706, 71, 1, 0, 0, 0, 707, 708, 5, 65, 0, 0, 708, 709, 5, 139, 0, 0, 709, 714, 3, 120, 60, 0, 710, 711, 5, 135, 0, 0, 711, 713, 3, 120, 60, 0, 712, 710, 1, 0, 0, 0, 713, 716, 1, 0, 0, 0, 714, 712, 1, 0, 0, 0, 714, 715, 1, 0, 0, 0, 715, 717, 1, 0, 0, 0, 716, 714, 1, 0, 0, 0, 717, 718, 5, 140, 0, 0, 718, 73, 1, 0, 0, 0, 719, 720, 5, 51, 0, 0, 720, 721, 3, 154, 77, 0, 721, 722, 5, 84, 0, 0, 722, 723, 3, 156, 78, 0, 723, 724, 5, 52, 0, 0, 724, 725, 3, 154, 77, 0, 725, 726, 5, 133, 0, 0, 726, 728, 3, 138, 69, 0, 727, 729, 3, 84, 42, 0, 728, 727, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 1, 0, 0, 0, 730, 731, 5, 134, 0, 0, 731, 75, 1, 0, 0, 0, 732, 733, 5, 87, 0, 0, 733, 734, 3, 138, 69, 0, 734, 77, 1, 0, 0, 0, 735, 736, 7, 2, 0, 0, 736, 79, 1, 0, 0, 0, 737, 756, 5, 90, 0, 0, 738, 739, 5, 43, 0, 0, 739, 756, 3, 154, 77, 0, 740, 741, 5, 36, 0, 0, 741, 756, 3, 154, 77, 0, 742, 743, 5, 45, 0, 0, 743, 752, 5, 139, 0, 0, 744, 749, 3, 26, 13, 0, 745, 746, 5, 135, 0, 0, 746, 748, 3, 26, 13, 0, 747, 745, 1, 0, 0, 0, 748, 751, 1, 0, 0, 0, 749, 747, 1, 0, 0, 0, 749, 750, 1, 0, 0, 0, 750, 753, 1, 0, 0, 0, 751, 749, 1, 0, 0, 0, 752, 744, 1, 0, 0, 0, 752, 753, 1, 0, 0, 0, 753, 754, 1, 0, 0, 0, 754, 756, 5, 140, 0, 0, 755, 737, 1, 0, 0, 0, 755, 738, 1, 0, 0, 0, 755, 740, 1, 0, 0, 0, 755, 742, 1, 0, 0, 0, 756, 81, 1, 0, 0, 0, 757, 762, 3, 154, 77, 0, 758, 759, 5, 135, 0, 0, 759, 761, 3, 154, 77, 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, 83, 1, 0, 0, 0, 764, 762, 1, 0, 0, 0, 765, 766, 5, 89, 0, 0, 766, 770, 5, 137, 0, 0, 767, 769, 3, 86, 43, 0, 768, 767, 1, 0, 0, 0, 769, 772, 1, 0, 0, 0, 770, 768, 1, 0, 0, 0, 770, 771, 1, 0, 0, 0, 771, 773, 1, 0, 0, 0, 772, 770, 1, 0, 0, 0, 773, 774, 5, 138, 0, 0, 774, 85, 1, 0, 0, 0, 775, 776, 5, 23, 0, 0, 776, 777, 3, 154, 77, 0, 777, 778, 5, 84, 0, 0, 778, 779, 3, 156, 78, 0, 779, 780, 5, 139, 0, 0, 780, 781, 3, 82, 41, 0, 781, 782, 5, 140, 0, 0, 782, 783, 5, 134, 0, 0, 783, 854, 1, 0, 0, 0, 784, 785, 5, 61, 0, 0, 785, 786, 3, 154, 77, 0, 786, 787, 5, 84, 0, 0, 787, 788, 3, 156, 78, 0, 788, 789, 5, 133, 0, 0, 789, 790, 3, 138, 69, 0, 790, 791, 3, 88, 44, 0, 791, 792, 5, 134, 0, 0, 792, 854, 1, 0, 0, 0, 793, 794, 5, 62, 0, 0, 794, 795, 3, 154, 77, 0, 795, 796, 5, 84, 0, 0, 796, 797, 3, 156, 78, 0, 797, 798, 5, 133, 0, 0, 798, 799, 3, 144, 72, 0, 799, 800, 3, 48, 24, 0, 800, 801, 3, 88, 44, 0, 801, 802, 5, 134, 0, 0, 802, 854, 1, 0, 0, 0, 803, 804, 5, 44, 0, 0, 804, 805, 3, 154, 77, 0, 805, 806, 5, 84, 0, 0, 806, 807, 3, 156, 78, 0, 807, 808, 5, 133, 0, 0, 808, 810, 3, 154, 77, 0, 809, 811, 3, 28, 14, 0, 810, 809, 1, 0, 0, 0, 810, 811, 1, 0, 0, 0, 811, 813, 1, 0, 0, 0, 812, 814, 3, 72, 36, 0, 813, 812, 1, 0, 0, 0, 813, 814, 1, 0, 0, 0, 814, 817, 1, 0, 0, 0, 815, 816, 5, 18, 0, 0, 816, 818, 5, 53, 0, 0, 817, 815, 1, 0, 0, 0, 817, 818, 1, 0, 0, 0, 818, 819, 1, 0, 0, 0, 819, 820, 5, 134, 0, 0, 820, 854, 1, 0, 0, 0, 821, 822, 5, 7, 0, 0, 822, 823, 3, 154, 77, 0, 823, 824, 5, 84, 0, 0, 824, 825, 3, 156, 78, 0, 825, 826, 5, 133, 0, 0, 826, 827, 3, 154, 77, 0, 827, 828, 5, 53, 0, 0, 828, 829, 3, 138, 69, 0, 829, 830, 5, 134, 0, 0, 830, 854, 1, 0, 0, 0, 831, 832, 5, 51, 0, 0, 832, 833, 3, 154, 77, 0, 833, 834, 5, 84, 0, 0, 834, 835, 3, 156, 78, 0, 835, 836, 5, 133, 0, 0, 836, 839, 3, 154, 77, 0, 837, 838, 5, 53, 0, 0, 838, 840, 3, 138, 69, 0, 839, 837, 1, 0, 0, 0, 839, 840, 1, 0, 0, 0, 840, 841, 1, 0, 0, 0, 841, 842, 5, 134, 0, 0, 842, 854, 1, 0, 0, 0, 843, 844, 5, 22, 0, 0, 844, 845, 3, 154, 77, 0, 845, 846, 5, 84, 0, 0, 846, 847, 3, 156, 78, 0, 847, 848, 5, 133, 0, 0, 848, 849, 3, 154, 77, 0, 849, 850, 5, 136, 0, 0, 850, 851, 3, 154, 77, 0, 851, 852, 5, 134, 0, 0, 852, 854, 1, 0, 0, 0, 853, 775, 1, 0, 0, 0, 853, 784, 1, 0, 0, 0, 853, 793, 1, 0, 0, 0, 853, 803, 1, 0, 0, 0, 853, 821, 1, 0, 0, 0, 853, 831, 1, 0, 0, 0, 853, 843, 1, 0, 0, 0, 854, 87, 1, 0, 0, 0, 855, 856, 5, 139, 0, 0, 856, 861, 3, 90, 45, 0, 857, 858, 5, 135, 0, 0, 858, 860, 3, 90, 45, 0, 859, 857, 1, 0, 0, 0, 860, 863, 1, 0, 0, 0, 861, 859, 1, 0, 0, 0, 861, 862, 1, 0, 0, 0, 862, 864, 1, 0, 0, 0, 863, 861, 1, 0, 0, 0, 864, 865, 5, 140, 0, 0, 865, 89, 1, 0, 0, 0, 866, 867, 7, 3, 0, 0, 867, 91, 1, 0, 0, 0, 868, 869, 5, 60, 0, 0, 869, 870, 3, 94, 47, 0, 870, 93, 1, 0, 0, 0, 871, 874, 3, 96, 48, 0, 872, 874, 3, 100, 50, 0, 873, 871, 1, 0, 0, 0, 873, 872, 1, 0, 0, 0, 874, 95, 1, 0, 0, 0, 875, 876, 5, 61, 0, 0, 876, 877, 3, 154, 77, 0, 877, 878, 5, 84, 0, 0, 878, 879, 3, 156, 78, 0, 879, 880, 5, 71, 0, 0, 880, 881, 3, 154, 77, 0, 881, 882, 5, 133, 0, 0, 882, 883, 3, 138, 69, 0, 883, 884, 5, 72, 0, 0, 884, 887, 3, 98, 49, 0, 885, 886, 5, 73, 0, 0, 886, 888, 3, 146, 73, 0, 887, 885, 1, 0, 0, 0, 887, 888, 1, 0, 0, 0, 888, 889, 1, 0, 0, 0, 889, 890, 5, 134, 0, 0, 890, 97, 1, 0, 0, 0, 891, 898, 5, 106, 0, 0, 892, 893, 5, 107, 0, 0, 893, 894, 5, 141, 0, 0, 894, 895, 3, 138, 69, 0, 895, 896, 5, 142, 0, 0, 896, 898, 1, 0, 0, 0, 897, 891, 1, 0, 0, 0, 897, 892, 1, 0, 0, 0, 898, 99, 1, 0, 0, 0, 899, 900, 5, 62, 0, 0, 900, 901, 3, 154, 77, 0, 901, 902, 5, 84, 0, 0, 902, 903, 3, 156, 78, 0, 903, 904, 5, 137, 0, 0, 904, 905, 3, 102, 51, 0, 905, 906, 3, 102, 51, 0, 906, 907, 5, 138, 0, 0, 907, 101, 1, 0, 0, 0, 908, 909, 3, 48, 24, 0, 909, 910, 5, 63, 0, 0, 910, 911, 3, 154, 77, 0, 911, 912, 5, 84, 0, 0, 912, 913, 3, 156, 78, 0, 913, 915, 3, 144, 72, 0, 914, 916, 5, 112, 0, 0, 915, 914, 1, 0, 0, 0, 915, 916, 1, 0, 0, 0, 916, 919, 1, 0, 0, 0, 917, 918, 5, 79, 0, 0, 918, 920, 3, 156, 78, 0, 919, 917, 1, 0, 0, 0, 919, 920, 1, 0, 0, 0, 920, 922, 1, 0, 0, 0, 921, 923, 5, 81, 0, 0, 922, 921, 1, 0, 0, 0, 922, 923, 1, 0, 0, 0, 923, 926, 1, 0, 0, 0, 924, 925, 5, 82, 0, 0, 925, 927, 3, 156, 78, 0, 926, 924, 1, 0, 0, 0, 926, 927, 1, 0, 0, 0, 927, 929, 1, 0, 0, 0, 928, 930, 5, 83, 0, 0, 929, 928, 1, 0, 0, 0, 929, 930, 1, 0, 0, 0, 930, 931, 1, 0, 0, 0, 931, 932, 5, 134, 0, 0, 932, 103, 1, 0, 0, 0, 933, 934, 5, 54, 0, 0, 934, 935, 3, 154, 77, 0, 935, 936, 5, 55, 0, 0, 936, 938, 3, 154, 77, 0, 937, 939, 3, 28, 14, 0, 938, 937, 1, 0, 0, 0, 938, 939, 1, 0, 0, 0, 939, 942, 1, 0, 0, 0, 940, 941, 5, 84, 0, 0, 941, 943, 3, 156, 78, 0, 942, 940, 1, 0, 0, 0, 942, 943, 1, 0, 0, 0, 943, 946, 1, 0, 0, 0, 944, 945, 5, 78, 0, 0, 945, 947, 5, 147, 0, 0, 946, 944, 1, 0, 0, 0, 946, 947, 1, 0, 0, 0, 947, 948, 1, 0, 0, 0, 948, 952, 5, 137, 0, 0, 949, 951, 3, 106, 53, 0, 950, 949, 1, 0, 0, 0, 951, 954, 1, 0, 0, 0, 952, 950, 1, 0, 0, 0, 952, 953, 1, 0, 0, 0, 953, 955, 1, 0, 0, 0, 954, 952, 1, 0, 0, 0, 955, 956, 5, 138, 0, 0, 956, 105, 1, 0, 0, 0, 957, 958, 5, 59, 0, 0, 958, 964, 3, 94, 47, 0, 959, 964, 3, 118, 59, 0, 960, 964, 3, 114, 57, 0, 961, 964, 3, 108, 54, 0, 962, 964, 3, 116, 58, 0, 963, 957, 1, 0, 0, 0, 963, 959, 1, 0, 0, 0, 963, 960, 1, 0, 0, 0, 963, 961, 1, 0, 0, 0, 963, 962, 1, 0, 0, 0, 964, 107, 1, 0, 0, 0, 965, 966, 5, 8, 0, 0, 966, 970, 5, 137, 0, 0, 967, 969, 3, 110, 55, 0, 968, 967, 1, 0, 0, 0, 969, 972, 1, 0, 0, 0, 970, 968, 1, 0, 0, 0, 970, 971, 1, 0, 0, 0, 971, 973, 1, 0, 0, 0, 972, 970, 1, 0, 0, 0, 973, 974, 5, 138, 0, 0, 974, 975, 5, 134, 0, 0, 975, 109, 1, 0, 0, 0, 976, 977, 3, 154, 77, 0, 977, 978, 5, 58, 0, 0, 978, 979, 5, 61, 0, 0, 979, 980, 3, 154, 77, 0, 980, 981, 5, 134, 0, 0, 981, 991, 1, 0, 0, 0, 982, 983, 3, 154, 77, 0, 983, 984, 5, 58, 0, 0, 984, 985, 5, 62, 0, 0, 985, 986, 3, 154, 77, 0, 986, 987, 5, 136, 0, 0, 987, 988, 3, 154, 77, 0, 988, 989, 5, 134, 0, 0, 989, 991, 1, 0, 0, 0, 990, 976, 1, 0, 0, 0, 990, 982, 1, 0, 0, 0, 991, 111, 1, 0, 0, 0, 992, 993, 3, 26, 13, 0, 993, 994, 5, 18, 0, 0, 994, 999, 5, 53, 0, 0, 995, 996, 5, 136, 0, 0, 996, 998, 3, 154, 77, 0, 997, 995, 1, 0, 0, 0, 998, 1001, 1, 0, 0, 0, 999, 997, 1, 0, 0, 0, 999, 1000, 1, 0, 0, 0, 1000, 1002, 1, 0, 0, 0, 1001, 999, 1, 0, 0, 0, 1002, 1003, 5, 134, 0, 0, 1003, 113, 1, 0, 0, 0, 1004, 1005, 5, 56, 0, 0, 1005, 1006, 3, 154, 77, 0, 1006, 1007, 5, 58, 0, 0, 1007, 1008, 5, 61, 0, 0, 1008, 1009, 3, 154, 77, 0, 1009, 1010, 5, 134, 0, 0, 1010, 115, 1, 0, 0, 0, 1011, 1012, 5, 68, 0, 0, 1012, 1013, 3, 154, 77, 0, 1013, 1014, 5, 69, 0, 0, 1014, 1015, 5, 70, 0, 0, 1015, 1016, 5, 65, 0, 0, 1016, 1017, 5, 51, 0, 0, 1017, 1018, 3, 154, 77, 0, 1018, 1019, 5, 67, 0, 0, 1019, 1020, 5, 62, 0, 0, 1020, 1021, 3, 154, 77, 0, 1021, 1022, 5, 136, 0, 0, 1022, 1023, 3, 154, 77, 0, 1023, 1024, 5, 134, 0, 0, 1024, 117, 1, 0, 0, 0, 1025, 1026, 5, 56, 0, 0, 1026, 1027, 3, 120, 60, 0, 1027, 1028, 5, 58, 0, 0, 1028, 1031, 3, 124, 62, 0, 1029, 1030, 5, 34, 0, 0, 1030, 1032, 3, 156, 78, 0, 1031, 1029, 1, 0, 0, 0, 1031, 1032, 1, 0, 0, 0, 1032, 1033, 1, 0, 0, 0, 1033, 1034, 5, 134, 0, 0, 1034, 119, 1, 0, 0, 0, 1035, 1036, 3, 154, 77, 0, 1036, 1037, 5, 136, 0, 0, 1037, 1038, 3, 122, 61, 0, 1038, 121, 1, 0, 0, 0, 1039, 1052, 3, 154, 77, 0, 1040, 1052, 5, 101, 0, 0, 1041, 1052, 5, 91, 0, 0, 1042, 1052, 5, 92, 0, 0, 1043, 1052, 5, 1, 0, 0, 1044, 1052, 5, 98, 0, 0, 1045, 1052, 5, 99, 0, 0, 1046, 1052, 5, 100, 0, 0, 1047, 1052, 5, 102, 0, 0, 1048, 1052, 5, 103, 0, 0, 1049, 1052, 5, 104, 0, 0, 1050, 1052, 5, 105, 0, 0, 1051, 1039, 1, 0, 0, 0, 1051, 1040, 1, 0, 0, 0, 1051, 1041, 1, 0, 0, 0, 1051, 1042, 1, 0, 0, 0, 1051, 1043, 1, 0, 0, 0, 1051, 1044, 1, 0, 0, 0, 1051, 1045, 1, 0, 0, 0, 1051, 1046, 1, 0, 0, 0, 1051, 1047, 1, 0, 0, 0, 1051, 1048, 1, 0, 0, 0, 1051, 1049, 1, 0, 0, 0, 1051, 1050, 1, 0, 0, 0, 1052, 123, 1, 0, 0, 0, 1053, 1054, 5, 80, 0, 0, 1054, 1055, 5, 136, 0, 0, 1055, 1090, 3, 154, 77, 0, 1056, 1057, 5, 61, 0, 0, 1057, 1058, 3, 154, 77, 0, 1058, 1059, 5, 136, 0, 0, 1059, 1060, 3, 128, 64, 0, 1060, 1090, 1, 0, 0, 0, 1061, 1062, 5, 62, 0, 0, 1062, 1063, 3, 154, 77, 0, 1063, 1064, 5, 136, 0, 0, 1064, 1065, 3, 154, 77, 0, 1065, 1066, 5, 136, 0, 0, 1066, 1067, 3, 130, 65, 0, 1067, 1090, 1, 0, 0, 0, 1068, 1069, 5, 44, 0, 0, 1069, 1071, 3, 154, 77, 0, 1070, 1072, 3, 28, 14, 0, 1071, 1070, 1, 0, 0, 0, 1071, 1072, 1, 0, 0, 0, 1072, 1073, 1, 0, 0, 0, 1073, 1074, 5, 136, 0, 0, 1074, 1075, 3, 120, 60, 0, 1075, 1090, 1, 0, 0, 0, 1076, 1077, 5, 46, 0, 0, 1077, 1078, 3, 154, 77, 0, 1078, 1079, 5, 136, 0, 0, 1079, 1081, 3, 154, 77, 0, 1080, 1082, 3, 28, 14, 0, 1081, 1080, 1, 0, 0, 0, 1081, 1082, 1, 0, 0, 0, 1082, 1084, 1, 0, 0, 0, 1083, 1085, 3, 132, 66, 0, 1084, 1083, 1, 0, 0, 0, 1084, 1085, 1, 0, 0, 0, 1085, 1087, 1, 0, 0, 0, 1086, 1088, 3, 126, 63, 0, 1087, 1086, 1, 0, 0, 0, 1087, 1088, 1, 0, 0, 0, 1088, 1090, 1, 0, 0, 0, 1089, 1053, 1, 0, 0, 0, 1089, 1056, 1, 0, 0, 0, 1089, 1061, 1, 0, 0, 0, 1089, 1068, 1, 0, 0, 0, 1089, 1076, 1, 0, 0, 0, 1090, 125, 1, 0, 0, 0, 1091, 1092, 5, 66, 0, 0, 1092, 1093, 3, 132, 66, 0, 1093, 127, 1, 0, 0, 0, 1094, 1095, 7, 4, 0, 0, 1095, 129, 1, 0, 0, 0, 1096, 1097, 7, 5, 0, 0, 1097, 131, 1, 0, 0, 0, 1098, 1099, 5, 64, 0, 0, 1099, 1103, 5, 137, 0, 0, 1100, 1102, 3, 134, 67, 0, 1101, 1100, 1, 0, 0, 0, 1102, 1105, 1, 0, 0, 0, 1103, 1101, 1, 0, 0, 0, 1103, 1104, 1, 0, 0, 0, 1104, 1106, 1, 0, 0, 0, 1105, 1103, 1, 0, 0, 0, 1106, 1107, 5, 138, 0, 0, 1107, 133, 1, 0, 0, 0, 1108, 1109, 3, 154, 77, 0, 1109, 1110, 5, 58, 0, 0, 1110, 1111, 5, 9, 0, 0, 1111, 1112, 5, 23, 0, 0, 1112, 1113, 5, 139, 0, 0, 1113, 1114, 3, 82, 41, 0, 1114, 1115, 5, 140, 0, 0, 1115, 1116, 5, 134, 0, 0, 1116, 1207, 1, 0, 0, 0, 1117, 1118, 3, 154, 77, 0, 1118, 1119, 5, 58, 0, 0, 1119, 1120, 5, 61, 0, 0, 1120, 1127, 3, 154, 77, 0, 1121, 1122, 5, 67, 0, 0, 1122, 1123, 5, 62, 0, 0, 1123, 1124, 3, 154, 77, 0, 1124, 1125, 5, 136, 0, 0, 1125, 1126, 3, 154, 77, 0, 1126, 1128, 1, 0, 0, 0, 1127, 1121, 1, 0, 0, 0, 1127, 1128, 1, 0, 0, 0, 1128, 1129, 1, 0, 0, 0, 1129, 1130, 5, 134, 0, 0, 1130, 1207, 1, 0, 0, 0, 1131, 1132, 3, 154, 77, 0, 1132, 1133, 5, 58, 0, 0, 1133, 1134, 5, 62, 0, 0, 1134, 1135, 3, 154, 77, 0, 1135, 1136, 5, 136, 0, 0, 1136, 1143, 3, 154, 77, 0, 1137, 1138, 5, 67, 0, 0, 1138, 1139, 5, 62, 0, 0, 1139, 1140, 3, 154, 77, 0, 1140, 1141, 5, 136, 0, 0, 1141, 1142, 3, 154, 77, 0, 1142, 1144, 1, 0, 0, 0, 1143, 1137, 1, 0, 0, 0, 1143, 1144, 1, 0, 0, 0, 1144, 1145, 1, 0, 0, 0, 1145, 1146, 5, 134, 0, 0, 1146, 1207, 1, 0, 0, 0, 1147, 1148, 3, 154, 77, 0, 1148, 1149, 5, 58, 0, 0, 1149, 1150, 5, 44, 0, 0, 1150, 1152, 3, 154, 77, 0, 1151, 1153, 3, 28, 14, 0, 1152, 1151, 1, 0, 0, 0, 1152, 1153, 1, 0, 0, 0, 1153, 1162, 1, 0, 0, 0, 1154, 1155, 5, 67, 0, 0, 1155, 1156, 5, 62, 0, 0, 1156, 1157, 3, 154, 77, 0, 1157, 1158, 5, 136, 0, 0, 1158, 1159, 3, 154, 77, 0, 1159, 1163, 1, 0, 0, 0, 1160, 1161, 5, 18, 0, 0, 1161, 1163, 5, 53, 0, 0, 1162, 1154, 1, 0, 0, 0, 1162, 1160, 1, 0, 0, 0, 1162, 1163, 1, 0, 0, 0, 1163, 1164, 1, 0, 0, 0, 1164, 1165, 5, 134, 0, 0, 1165, 1207, 1, 0, 0, 0, 1166, 1167, 3, 154, 77, 0, 1167, 1168, 5, 58, 0, 0, 1168, 1169, 5, 7, 0, 0, 1169, 1170, 3, 154, 77, 0, 1170, 1171, 5, 64, 0, 0, 1171, 1175, 5, 137, 0, 0, 1172, 1174, 3, 112, 56, 0, 1173, 1172, 1, 0, 0, 0, 1174, 1177, 1, 0, 0, 0, 1175, 1173, 1, 0, 0, 0, 1175, 1176, 1, 0, 0, 0, 1176, 1178, 1, 0, 0, 0, 1177, 1175, 1, 0, 0, 0, 1178, 1179, 5, 138, 0, 0, 1179, 1180, 5, 134, 0, 0, 1180, 1207, 1, 0, 0, 0, 1181, 1182, 3, 154, 77, 0, 1182, 1183, 5, 58, 0, 0, 1183, 1184, 5, 51, 0, 0, 1184, 1185, 3, 154, 77, 0, 1185, 1186, 5, 134, 0, 0, 1186, 1207, 1, 0, 0, 0, 1187, 1188, 3, 154, 77, 0, 1188, 1190, 5, 58, 0, 0, 1189, 1191, 5, 9, 0, 0, 1190, 1189, 1, 0, 0, 0, 1190, 1191, 1, 0, 0, 0, 1191, 1192, 1, 0, 0, 0, 1192, 1193, 5, 22, 0, 0, 1193, 1194, 3, 154, 77, 0, 1194, 1195, 5, 136, 0, 0, 1195, 1202, 3, 154, 77, 0, 1196, 1197, 5, 67, 0, 0, 1197, 1198, 5, 62, 0, 0, 1198, 1199, 3, 154, 77, 0, 1199, 1200, 5, 136, 0, 0, 1200, 1201, 3, 154, 77, 0, 1201, 1203, 1, 0, 0, 0, 1202, 1196, 1, 0, 0, 0, 1202, 1203, 1, 0, 0, 0, 1203, 1204, 1, 0, 0, 0, 1204, 1205, 5, 134, 0, 0, 1205, 1207, 1, 0, 0, 0, 1206, 1108, 1, 0, 0, 0, 1206, 1117, 1, 0, 0, 0, 1206, 1131, 1, 0, 0, 0, 1206, 1147, 1, 0, 0, 0, 1206, 1166, 1, 0, 0, 0, 1206, 1181, 1, 0, 0, 0, 1206, 1187, 1, 0, 0, 0, 1207, 135, 1, 0, 0, 0, 1208, 1209, 5, 51, 0, 0, 1209, 1210, 3, 154, 77, 0, 1210, 1211, 5, 58, 0, 0, 1211, 1212, 3, 154, 77, 0, 1212, 1213, 5, 136, 0, 0, 1213, 1215, 3, 154, 77, 0, 1214, 1216, 3, 132, 66, 0, 1215, 1214, 1, 0, 0, 0, 1215, 1216, 1, 0, 0, 0, 1216, 1217, 1, 0, 0, 0, 1217, 1218, 5, 134, 0, 0, 1218, 137, 1, 0, 0, 0, 1219, 1266, 3, 142, 71, 0, 1220, 1266, 5, 113, 0, 0, 1221, 1266, 5, 114, 0, 0, 1222, 1223, 5, 115, 0, 0, 1223, 1266, 3, 156, 78, 0, 1224, 1225, 5, 116, 0, 0, 1225, 1226, 5, 143, 0, 0, 1226, 1227, 3, 154, 77, 0, 1227, 1228, 5, 144, 0, 0, 1228, 1266, 1, 0, 0, 0, 1229, 1230, 5, 117, 0, 0, 1230, 1231, 5, 143, 0, 0, 1231, 1233, 3, 154, 77, 0, 1232, 1234, 3, 28, 14, 0, 1233, 1232, 1, 0, 0, 0, 1233, 1234, 1, 0, 0, 0, 1234, 1235, 1, 0, 0, 0, 1235, 1236, 5, 144, 0, 0, 1236, 1266, 1, 0, 0, 0, 1237, 1238, 5, 39, 0, 0, 1238, 1239, 5, 143, 0, 0, 1239, 1240, 3, 154, 77, 0, 1240, 1241, 5, 144, 0, 0, 1241, 1266, 1, 0, 0, 0, 1242, 1243, 5, 118, 0, 0, 1243, 1244, 5, 143, 0, 0, 1244, 1245, 3, 138, 69, 0, 1245, 1246, 5, 144, 0, 0, 1246, 1266, 1, 0, 0, 0, 1247, 1248, 5, 119, 0, 0, 1248, 1249, 5, 143, 0, 0, 1249, 1250, 3, 138, 69, 0, 1250, 1251, 5, 144, 0, 0, 1251, 1266, 1, 0, 0, 0, 1252, 1253, 5, 120, 0, 0, 1253, 1257, 5, 137, 0, 0, 1254, 1256, 3, 140, 70, 0, 1255, 1254, 1, 0, 0, 0, 1256, 1259, 1, 0, 0, 0, 1257, 1255, 1, 0, 0, 0, 1257, 1258, 1, 0, 0, 0, 1258, 1260, 1, 0, 0, 0, 1259, 1257, 1, 0, 0, 0, 1260, 1266, 5, 138, 0, 0, 1261, 1263, 3, 154, 77, 0, 1262, 1264, 3, 28, 14, 0, 1263, 1262, 1, 0, 0, 0, 1263, 1264, 1, 0, 0, 0, 1264, 1266, 1, 0, 0, 0, 1265, 1219, 1, 0, 0, 0, 1265, 1220, 1, 0, 0, 0, 1265, 1221, 1, 0, 0, 0, 1265, 1222, 1, 0, 0, 0, 1265, 1224, 1, 0, 0, 0, 1265, 1229, 1, 0, 0, 0, 1265, 1237, 1, 0, 0, 0, 1265, 1242, 1, 0, 0, 0, 1265, 1247, 1, 0, 0, 0, 1265, 1252, 1, 0, 0, 0, 1265, 1261, 1, 0, 0, 0, 1266, 139, 1, 0, 0, 0, 1267, 1268, 3, 154, 77, 0, 1268, 1269, 5, 133, 0, 0, 1269, 1270, 3, 138, 69, 0, 1270, 1271, 5, 134, 0, 0, 1271, 141, 1, 0, 0, 0, 1272, 1273, 7, 6, 0, 0, 1273, 143, 1, 0, 0, 0, 1274, 1275, 7, 7, 0, 0, 1275, 145, 1, 0, 0, 0, 1276, 1285, 3, 156, 78, 0, 1277, 1285, 5, 147, 0, 0, 1278, 1285, 5, 148, 0, 0, 1279, 1285, 5, 129, 0, 0, 1280, 1285, 5, 130, 0, 0, 1281, 1285, 5, 131, 0, 0, 1282, 1285, 3, 148, 74, 0, 1283, 1285, 3, 152, 76, 0, 1284, 1276, 1, 0, 0, 0, 1284, 1277, 1, 0, 0, 0, 1284, 1278, 1, 0, 0, 0, 1284, 1279, 1, 0, 0, 0, 1284, 1280, 1, 0, 0, 0, 1284, 1281, 1, 0, 0, 0, 1284, 1282, 1, 0, 0, 0, 1284, 1283, 1, 0, 0, 0, 1285, 147, 1, 0, 0, 0, 1286, 1295, 5, 137, 0, 0, 1287, 1292, 3, 150, 75, 0, 1288, 1289, 5, 135, 0, 0, 1289, 1291, 3, 150, 75, 0, 1290, 1288, 1, 0, 0, 0, 1291, 1294, 1, 0, 0, 0, 1292, 1290, 1, 0, 0, 0, 1292, 1293, 1, 0, 0, 0, 1293, 1296, 1, 0, 0, 0, 1294, 1292, 1, 0, 0, 0, 1295, 1287, 1, 0, 0, 0, 1295, 1296, 1, 0, 0, 0, 1296, 1297, 1, 0, 0, 0, 1297, 1298, 5, 138, 0, 0, 1298, 149, 1, 0, 0, 0, 1299, 1300, 3, 156, 78, 0, 1300, 1301, 5, 133, 0, 0, 1301, 1302, 3, 146, 73, 0, 1302, 151, 1, 0, 0, 0, 1303, 1312, 5, 139, 0, 0, 1304, 1309, 3, 146, 73, 0, 1305, 1306, 5, 135, 0, 0, 1306, 1308, 3, 146, 73, 0, 1307, 1305, 1, 0, 0, 0, 1308, 1311, 1, 0, 0, 0, 1309, 1307, 1, 0, 0, 0, 1309, 1310, 1, 0, 0, 0, 1310, 1313, 1, 0, 0, 0, 1311, 1309, 1, 0, 0, 0, 1312, 1304, 1, 0, 0, 0, 1312, 1313, 1, 0, 0, 0, 1313, 1314, 1, 0, 0, 0, 1314, 1315, 5, 140, 0, 0, 1315, 153, 1, 0, 0, 0, 1316, 1317, 7, 8, 0, 0, 1317, 155, 1, 0, 0, 0, 1318, 1319, 5, 150, 0, 0, 1319, 157, 1, 0, 0, 0, 115, 170, 177, 198, 211, 223, 243, 251, 258, 264, 276, 279, 285, 296, 305, 315, 318, 320, 324, 332, 344, 349, 358, 361, 376, 382, 394, 403, 411, 419, 432, 435, 445, 449, 455, 462, 468, 476, 484, 497, 504, 508, 513, 524, 530, 541, 568, 574, 585, 612, 639, 644, 655, 658, 663, 666, 673, 682, 685, 688, 705, 714, 728, 749, 752, 755, 762, 770, 810, 813, 817, 839, 853, 861, 873, 887, 897, 915, 919, 922, 926, 929, 938, 942, 946, 952, 963, 970, 990, 999, 1031, 1051, 1071, 1081, 1084, 1087, 1089, 1103, 1127, 1143, 1152, 1162, 1175, 1190, 1202, 1206, 1215, 1233, 1257, 1263, 1265, 1284, 1292, 1295, 1309, 1312] \ No newline at end of file +[4, 1, 153, 1347, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 175, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 180, 8, 1, 10, 1, 12, 1, 183, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 201, 8, 3, 10, 3, 12, 3, 204, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 216, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 228, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 248, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 256, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 261, 8, 10, 10, 10, 12, 10, 264, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 269, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 279, 8, 10, 10, 10, 12, 10, 282, 9, 10, 3, 10, 284, 8, 10, 1, 10, 1, 10, 5, 10, 288, 8, 10, 10, 10, 12, 10, 291, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 299, 8, 11, 10, 11, 12, 11, 302, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 310, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 318, 8, 12, 10, 12, 12, 12, 321, 9, 12, 3, 12, 323, 8, 12, 3, 12, 325, 8, 12, 1, 13, 1, 13, 3, 13, 329, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 335, 8, 14, 10, 14, 12, 14, 338, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 349, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 354, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 364, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 374, 8, 18, 1, 18, 1, 18, 1, 19, 3, 19, 379, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 394, 8, 19, 1, 19, 1, 19, 1, 19, 1, 20, 3, 20, 400, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 410, 8, 20, 10, 20, 12, 20, 413, 9, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 421, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 429, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 437, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 450, 8, 21, 1, 22, 3, 22, 453, 8, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 463, 8, 22, 1, 22, 1, 22, 3, 22, 467, 8, 22, 1, 22, 1, 22, 5, 22, 471, 8, 22, 10, 22, 12, 22, 474, 9, 22, 1, 22, 1, 22, 1, 23, 1, 23, 3, 23, 480, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 486, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 494, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 502, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 515, 8, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 522, 8, 25, 1, 25, 1, 25, 3, 25, 526, 8, 25, 1, 26, 5, 26, 529, 8, 26, 10, 26, 12, 26, 532, 9, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 542, 8, 26, 1, 26, 1, 26, 5, 26, 546, 8, 26, 10, 26, 12, 26, 549, 9, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 559, 8, 27, 1, 28, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 3, 30, 586, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 592, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 5, 30, 601, 8, 30, 10, 30, 12, 30, 604, 9, 30, 1, 30, 1, 30, 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, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 630, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 657, 8, 32, 1, 33, 1, 33, 1, 33, 3, 33, 662, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 673, 8, 33, 1, 33, 3, 33, 676, 8, 33, 1, 33, 1, 33, 1, 33, 3, 33, 681, 8, 33, 1, 33, 3, 33, 684, 8, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 3, 34, 691, 8, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 700, 8, 34, 1, 34, 3, 34, 703, 8, 34, 1, 34, 3, 34, 706, 8, 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, 36, 1, 36, 1, 36, 3, 36, 723, 8, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 5, 37, 730, 8, 37, 10, 37, 12, 37, 733, 9, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 746, 8, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 5, 41, 765, 8, 41, 10, 41, 12, 41, 768, 9, 41, 3, 41, 770, 8, 41, 1, 41, 3, 41, 773, 8, 41, 1, 42, 1, 42, 1, 42, 5, 42, 778, 8, 42, 10, 42, 12, 42, 781, 9, 42, 1, 43, 1, 43, 1, 43, 5, 43, 786, 8, 43, 10, 43, 12, 43, 789, 9, 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, 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, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 828, 8, 44, 1, 44, 3, 44, 831, 8, 44, 1, 44, 1, 44, 3, 44, 835, 8, 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, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 857, 8, 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, 871, 8, 44, 1, 45, 1, 45, 1, 45, 1, 45, 5, 45, 877, 8, 45, 10, 45, 12, 45, 880, 9, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 3, 48, 891, 8, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 905, 8, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 915, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 933, 8, 52, 1, 52, 1, 52, 3, 52, 937, 8, 52, 1, 52, 3, 52, 940, 8, 52, 1, 52, 1, 52, 3, 52, 944, 8, 52, 1, 52, 3, 52, 947, 8, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 956, 8, 53, 1, 53, 1, 53, 3, 53, 960, 8, 53, 1, 53, 1, 53, 3, 53, 964, 8, 53, 1, 53, 1, 53, 5, 53, 968, 8, 53, 10, 53, 12, 53, 971, 9, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 982, 8, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 5, 56, 995, 8, 56, 10, 56, 12, 56, 998, 9, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 1017, 8, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 5, 58, 1024, 8, 58, 10, 58, 12, 58, 1027, 9, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 1058, 8, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1078, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1098, 8, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1108, 8, 64, 1, 64, 3, 64, 1111, 8, 64, 1, 64, 3, 64, 1114, 8, 64, 3, 64, 1116, 8, 64, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 5, 68, 1128, 8, 68, 10, 68, 12, 68, 1131, 9, 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, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1154, 8, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1170, 8, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1179, 8, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1189, 8, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 5, 69, 1200, 8, 69, 10, 69, 12, 69, 1203, 9, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1217, 8, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1229, 8, 69, 1, 69, 1, 69, 3, 69, 1233, 8, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 3, 70, 1242, 8, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1260, 8, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 5, 71, 1282, 8, 71, 10, 71, 12, 71, 1285, 9, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1290, 8, 71, 3, 71, 1292, 8, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 3, 75, 1311, 8, 75, 1, 76, 1, 76, 1, 76, 1, 76, 5, 76, 1317, 8, 76, 10, 76, 12, 76, 1320, 9, 76, 3, 76, 1322, 8, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 5, 78, 1334, 8, 78, 10, 78, 12, 78, 1337, 9, 78, 3, 78, 1339, 8, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 0, 0, 81, 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, 0, 9, 2, 0, 15, 15, 33, 33, 1, 0, 11, 12, 1, 0, 101, 105, 3, 0, 1, 1, 96, 100, 102, 103, 3, 0, 1, 1, 96, 97, 102, 103, 2, 0, 98, 100, 102, 103, 1, 0, 121, 128, 1, 0, 108, 111, 8, 0, 1, 1, 4, 8, 10, 33, 45, 45, 74, 74, 94, 95, 106, 106, 149, 149, 1455, 0, 174, 1, 0, 0, 0, 2, 176, 1, 0, 0, 0, 4, 186, 1, 0, 0, 0, 6, 190, 1, 0, 0, 0, 8, 215, 1, 0, 0, 0, 10, 227, 1, 0, 0, 0, 12, 229, 1, 0, 0, 0, 14, 236, 1, 0, 0, 0, 16, 247, 1, 0, 0, 0, 18, 249, 1, 0, 0, 0, 20, 262, 1, 0, 0, 0, 22, 294, 1, 0, 0, 0, 24, 324, 1, 0, 0, 0, 26, 326, 1, 0, 0, 0, 28, 330, 1, 0, 0, 0, 30, 348, 1, 0, 0, 0, 32, 350, 1, 0, 0, 0, 34, 363, 1, 0, 0, 0, 36, 365, 1, 0, 0, 0, 38, 378, 1, 0, 0, 0, 40, 399, 1, 0, 0, 0, 42, 449, 1, 0, 0, 0, 44, 452, 1, 0, 0, 0, 46, 477, 1, 0, 0, 0, 48, 514, 1, 0, 0, 0, 50, 525, 1, 0, 0, 0, 52, 530, 1, 0, 0, 0, 54, 558, 1, 0, 0, 0, 56, 560, 1, 0, 0, 0, 58, 570, 1, 0, 0, 0, 60, 582, 1, 0, 0, 0, 62, 607, 1, 0, 0, 0, 64, 656, 1, 0, 0, 0, 66, 658, 1, 0, 0, 0, 68, 687, 1, 0, 0, 0, 70, 709, 1, 0, 0, 0, 72, 722, 1, 0, 0, 0, 74, 724, 1, 0, 0, 0, 76, 736, 1, 0, 0, 0, 78, 749, 1, 0, 0, 0, 80, 752, 1, 0, 0, 0, 82, 772, 1, 0, 0, 0, 84, 774, 1, 0, 0, 0, 86, 782, 1, 0, 0, 0, 88, 870, 1, 0, 0, 0, 90, 872, 1, 0, 0, 0, 92, 883, 1, 0, 0, 0, 94, 885, 1, 0, 0, 0, 96, 890, 1, 0, 0, 0, 98, 892, 1, 0, 0, 0, 100, 914, 1, 0, 0, 0, 102, 916, 1, 0, 0, 0, 104, 925, 1, 0, 0, 0, 106, 950, 1, 0, 0, 0, 108, 981, 1, 0, 0, 0, 110, 983, 1, 0, 0, 0, 112, 991, 1, 0, 0, 0, 114, 1016, 1, 0, 0, 0, 116, 1018, 1, 0, 0, 0, 118, 1030, 1, 0, 0, 0, 120, 1037, 1, 0, 0, 0, 122, 1051, 1, 0, 0, 0, 124, 1061, 1, 0, 0, 0, 126, 1077, 1, 0, 0, 0, 128, 1115, 1, 0, 0, 0, 130, 1117, 1, 0, 0, 0, 132, 1120, 1, 0, 0, 0, 134, 1122, 1, 0, 0, 0, 136, 1124, 1, 0, 0, 0, 138, 1232, 1, 0, 0, 0, 140, 1234, 1, 0, 0, 0, 142, 1291, 1, 0, 0, 0, 144, 1293, 1, 0, 0, 0, 146, 1298, 1, 0, 0, 0, 148, 1300, 1, 0, 0, 0, 150, 1310, 1, 0, 0, 0, 152, 1312, 1, 0, 0, 0, 154, 1325, 1, 0, 0, 0, 156, 1329, 1, 0, 0, 0, 158, 1342, 1, 0, 0, 0, 160, 1344, 1, 0, 0, 0, 162, 163, 3, 6, 3, 0, 163, 164, 5, 0, 0, 1, 164, 175, 1, 0, 0, 0, 165, 166, 3, 20, 10, 0, 166, 167, 5, 0, 0, 1, 167, 175, 1, 0, 0, 0, 168, 169, 3, 52, 26, 0, 169, 170, 5, 0, 0, 1, 170, 175, 1, 0, 0, 0, 171, 172, 3, 2, 1, 0, 172, 173, 5, 0, 0, 1, 173, 175, 1, 0, 0, 0, 174, 162, 1, 0, 0, 0, 174, 165, 1, 0, 0, 0, 174, 168, 1, 0, 0, 0, 174, 171, 1, 0, 0, 0, 175, 1, 1, 0, 0, 0, 176, 177, 5, 40, 0, 0, 177, 181, 5, 137, 0, 0, 178, 180, 3, 8, 4, 0, 179, 178, 1, 0, 0, 0, 180, 183, 1, 0, 0, 0, 181, 179, 1, 0, 0, 0, 181, 182, 1, 0, 0, 0, 182, 184, 1, 0, 0, 0, 183, 181, 1, 0, 0, 0, 184, 185, 5, 138, 0, 0, 185, 3, 1, 0, 0, 0, 186, 187, 5, 41, 0, 0, 187, 188, 3, 160, 80, 0, 188, 189, 5, 134, 0, 0, 189, 5, 1, 0, 0, 0, 190, 191, 5, 9, 0, 0, 191, 192, 3, 158, 79, 0, 192, 193, 5, 84, 0, 0, 193, 194, 3, 160, 80, 0, 194, 195, 5, 77, 0, 0, 195, 196, 3, 160, 80, 0, 196, 197, 5, 76, 0, 0, 197, 198, 3, 160, 80, 0, 198, 202, 5, 137, 0, 0, 199, 201, 3, 8, 4, 0, 200, 199, 1, 0, 0, 0, 201, 204, 1, 0, 0, 0, 202, 200, 1, 0, 0, 0, 202, 203, 1, 0, 0, 0, 203, 205, 1, 0, 0, 0, 204, 202, 1, 0, 0, 0, 205, 206, 5, 138, 0, 0, 206, 7, 1, 0, 0, 0, 207, 216, 3, 4, 2, 0, 208, 216, 3, 18, 9, 0, 209, 216, 3, 10, 5, 0, 210, 216, 3, 94, 47, 0, 211, 216, 3, 106, 53, 0, 212, 216, 3, 140, 70, 0, 213, 216, 3, 58, 29, 0, 214, 216, 3, 32, 16, 0, 215, 207, 1, 0, 0, 0, 215, 208, 1, 0, 0, 0, 215, 209, 1, 0, 0, 0, 215, 210, 1, 0, 0, 0, 215, 211, 1, 0, 0, 0, 215, 212, 1, 0, 0, 0, 215, 213, 1, 0, 0, 0, 215, 214, 1, 0, 0, 0, 216, 9, 1, 0, 0, 0, 217, 218, 5, 41, 0, 0, 218, 219, 5, 44, 0, 0, 219, 220, 3, 158, 79, 0, 220, 221, 5, 134, 0, 0, 221, 228, 1, 0, 0, 0, 222, 223, 5, 41, 0, 0, 223, 224, 5, 46, 0, 0, 224, 225, 3, 158, 79, 0, 225, 226, 5, 134, 0, 0, 226, 228, 1, 0, 0, 0, 227, 217, 1, 0, 0, 0, 227, 222, 1, 0, 0, 0, 228, 11, 1, 0, 0, 0, 229, 230, 5, 42, 0, 0, 230, 231, 5, 43, 0, 0, 231, 232, 3, 158, 79, 0, 232, 233, 5, 84, 0, 0, 233, 234, 3, 160, 80, 0, 234, 235, 5, 134, 0, 0, 235, 13, 1, 0, 0, 0, 236, 237, 5, 42, 0, 0, 237, 238, 5, 44, 0, 0, 238, 239, 3, 158, 79, 0, 239, 240, 5, 77, 0, 0, 240, 241, 3, 160, 80, 0, 241, 242, 5, 134, 0, 0, 242, 15, 1, 0, 0, 0, 243, 248, 3, 10, 5, 0, 244, 248, 3, 12, 6, 0, 245, 248, 3, 14, 7, 0, 246, 248, 3, 32, 16, 0, 247, 243, 1, 0, 0, 0, 247, 244, 1, 0, 0, 0, 247, 245, 1, 0, 0, 0, 247, 246, 1, 0, 0, 0, 248, 17, 1, 0, 0, 0, 249, 250, 5, 43, 0, 0, 250, 251, 3, 158, 79, 0, 251, 252, 5, 84, 0, 0, 252, 255, 3, 160, 80, 0, 253, 254, 5, 85, 0, 0, 254, 256, 3, 160, 80, 0, 255, 253, 1, 0, 0, 0, 255, 256, 1, 0, 0, 0, 256, 257, 1, 0, 0, 0, 257, 258, 5, 134, 0, 0, 258, 19, 1, 0, 0, 0, 259, 261, 3, 16, 8, 0, 260, 259, 1, 0, 0, 0, 261, 264, 1, 0, 0, 0, 262, 260, 1, 0, 0, 0, 262, 263, 1, 0, 0, 0, 263, 265, 1, 0, 0, 0, 264, 262, 1, 0, 0, 0, 265, 266, 5, 44, 0, 0, 266, 268, 3, 158, 79, 0, 267, 269, 3, 22, 11, 0, 268, 267, 1, 0, 0, 0, 268, 269, 1, 0, 0, 0, 269, 270, 1, 0, 0, 0, 270, 271, 5, 84, 0, 0, 271, 272, 3, 160, 80, 0, 272, 273, 5, 77, 0, 0, 273, 283, 3, 160, 80, 0, 274, 275, 5, 89, 0, 0, 275, 280, 3, 26, 13, 0, 276, 277, 5, 135, 0, 0, 277, 279, 3, 26, 13, 0, 278, 276, 1, 0, 0, 0, 279, 282, 1, 0, 0, 0, 280, 278, 1, 0, 0, 0, 280, 281, 1, 0, 0, 0, 281, 284, 1, 0, 0, 0, 282, 280, 1, 0, 0, 0, 283, 274, 1, 0, 0, 0, 283, 284, 1, 0, 0, 0, 284, 285, 1, 0, 0, 0, 285, 289, 5, 137, 0, 0, 286, 288, 3, 34, 17, 0, 287, 286, 1, 0, 0, 0, 288, 291, 1, 0, 0, 0, 289, 287, 1, 0, 0, 0, 289, 290, 1, 0, 0, 0, 290, 292, 1, 0, 0, 0, 291, 289, 1, 0, 0, 0, 292, 293, 5, 138, 0, 0, 293, 21, 1, 0, 0, 0, 294, 295, 5, 143, 0, 0, 295, 300, 3, 24, 12, 0, 296, 297, 5, 135, 0, 0, 297, 299, 3, 24, 12, 0, 298, 296, 1, 0, 0, 0, 299, 302, 1, 0, 0, 0, 300, 298, 1, 0, 0, 0, 300, 301, 1, 0, 0, 0, 301, 303, 1, 0, 0, 0, 302, 300, 1, 0, 0, 0, 303, 304, 5, 144, 0, 0, 304, 23, 1, 0, 0, 0, 305, 306, 5, 47, 0, 0, 306, 309, 3, 158, 79, 0, 307, 308, 5, 133, 0, 0, 308, 310, 5, 37, 0, 0, 309, 307, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 325, 1, 0, 0, 0, 311, 312, 5, 36, 0, 0, 312, 322, 3, 158, 79, 0, 313, 314, 5, 38, 0, 0, 314, 319, 3, 26, 13, 0, 315, 316, 5, 145, 0, 0, 316, 318, 3, 26, 13, 0, 317, 315, 1, 0, 0, 0, 318, 321, 1, 0, 0, 0, 319, 317, 1, 0, 0, 0, 319, 320, 1, 0, 0, 0, 320, 323, 1, 0, 0, 0, 321, 319, 1, 0, 0, 0, 322, 313, 1, 0, 0, 0, 322, 323, 1, 0, 0, 0, 323, 325, 1, 0, 0, 0, 324, 305, 1, 0, 0, 0, 324, 311, 1, 0, 0, 0, 325, 25, 1, 0, 0, 0, 326, 328, 3, 158, 79, 0, 327, 329, 3, 28, 14, 0, 328, 327, 1, 0, 0, 0, 328, 329, 1, 0, 0, 0, 329, 27, 1, 0, 0, 0, 330, 331, 5, 143, 0, 0, 331, 336, 3, 30, 15, 0, 332, 333, 5, 135, 0, 0, 333, 335, 3, 30, 15, 0, 334, 332, 1, 0, 0, 0, 335, 338, 1, 0, 0, 0, 336, 334, 1, 0, 0, 0, 336, 337, 1, 0, 0, 0, 337, 339, 1, 0, 0, 0, 338, 336, 1, 0, 0, 0, 339, 340, 5, 144, 0, 0, 340, 29, 1, 0, 0, 0, 341, 342, 5, 43, 0, 0, 342, 349, 3, 158, 79, 0, 343, 344, 5, 44, 0, 0, 344, 349, 3, 26, 13, 0, 345, 346, 5, 36, 0, 0, 346, 349, 3, 158, 79, 0, 347, 349, 3, 142, 71, 0, 348, 341, 1, 0, 0, 0, 348, 343, 1, 0, 0, 0, 348, 345, 1, 0, 0, 0, 348, 347, 1, 0, 0, 0, 349, 31, 1, 0, 0, 0, 350, 351, 5, 35, 0, 0, 351, 353, 3, 158, 79, 0, 352, 354, 3, 22, 11, 0, 353, 352, 1, 0, 0, 0, 353, 354, 1, 0, 0, 0, 354, 355, 1, 0, 0, 0, 355, 356, 5, 146, 0, 0, 356, 357, 3, 142, 71, 0, 357, 358, 5, 134, 0, 0, 358, 33, 1, 0, 0, 0, 359, 364, 3, 40, 20, 0, 360, 364, 3, 44, 22, 0, 361, 364, 3, 38, 19, 0, 362, 364, 3, 36, 18, 0, 363, 359, 1, 0, 0, 0, 363, 360, 1, 0, 0, 0, 363, 361, 1, 0, 0, 0, 363, 362, 1, 0, 0, 0, 364, 35, 1, 0, 0, 0, 365, 366, 5, 2, 0, 0, 366, 367, 3, 158, 79, 0, 367, 368, 5, 84, 0, 0, 368, 369, 3, 160, 80, 0, 369, 370, 5, 3, 0, 0, 370, 373, 3, 160, 80, 0, 371, 372, 5, 5, 0, 0, 372, 374, 3, 50, 25, 0, 373, 371, 1, 0, 0, 0, 373, 374, 1, 0, 0, 0, 374, 375, 1, 0, 0, 0, 375, 376, 5, 134, 0, 0, 376, 37, 1, 0, 0, 0, 377, 379, 5, 57, 0, 0, 378, 377, 1, 0, 0, 0, 378, 379, 1, 0, 0, 0, 379, 380, 1, 0, 0, 0, 380, 381, 5, 49, 0, 0, 381, 382, 3, 158, 79, 0, 382, 383, 5, 84, 0, 0, 383, 384, 3, 160, 80, 0, 384, 385, 5, 133, 0, 0, 385, 386, 3, 142, 71, 0, 386, 387, 5, 132, 0, 0, 387, 388, 3, 142, 71, 0, 388, 389, 5, 137, 0, 0, 389, 390, 5, 101, 0, 0, 390, 391, 5, 84, 0, 0, 391, 393, 3, 160, 80, 0, 392, 394, 3, 72, 36, 0, 393, 392, 1, 0, 0, 0, 393, 394, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 396, 5, 134, 0, 0, 396, 397, 5, 138, 0, 0, 397, 39, 1, 0, 0, 0, 398, 400, 3, 46, 23, 0, 399, 398, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 402, 5, 47, 0, 0, 402, 403, 3, 158, 79, 0, 403, 404, 5, 84, 0, 0, 404, 405, 3, 160, 80, 0, 405, 406, 5, 133, 0, 0, 406, 407, 3, 142, 71, 0, 407, 411, 5, 137, 0, 0, 408, 410, 3, 42, 21, 0, 409, 408, 1, 0, 0, 0, 410, 413, 1, 0, 0, 0, 411, 409, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 414, 1, 0, 0, 0, 413, 411, 1, 0, 0, 0, 414, 415, 5, 138, 0, 0, 415, 41, 1, 0, 0, 0, 416, 417, 5, 91, 0, 0, 417, 418, 5, 84, 0, 0, 418, 420, 3, 160, 80, 0, 419, 421, 3, 72, 36, 0, 420, 419, 1, 0, 0, 0, 420, 421, 1, 0, 0, 0, 421, 422, 1, 0, 0, 0, 422, 423, 5, 134, 0, 0, 423, 450, 1, 0, 0, 0, 424, 425, 5, 92, 0, 0, 425, 426, 5, 84, 0, 0, 426, 428, 3, 160, 80, 0, 427, 429, 3, 72, 36, 0, 428, 427, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 430, 1, 0, 0, 0, 430, 431, 5, 134, 0, 0, 431, 450, 1, 0, 0, 0, 432, 433, 5, 1, 0, 0, 433, 434, 5, 84, 0, 0, 434, 436, 3, 160, 80, 0, 435, 437, 3, 72, 36, 0, 436, 435, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 438, 1, 0, 0, 0, 438, 439, 5, 134, 0, 0, 439, 450, 1, 0, 0, 0, 440, 441, 5, 93, 0, 0, 441, 442, 5, 94, 0, 0, 442, 443, 5, 84, 0, 0, 443, 444, 3, 160, 80, 0, 444, 445, 5, 95, 0, 0, 445, 446, 5, 84, 0, 0, 446, 447, 3, 160, 80, 0, 447, 448, 5, 134, 0, 0, 448, 450, 1, 0, 0, 0, 449, 416, 1, 0, 0, 0, 449, 424, 1, 0, 0, 0, 449, 432, 1, 0, 0, 0, 449, 440, 1, 0, 0, 0, 450, 43, 1, 0, 0, 0, 451, 453, 3, 46, 23, 0, 452, 451, 1, 0, 0, 0, 452, 453, 1, 0, 0, 0, 453, 454, 1, 0, 0, 0, 454, 455, 5, 48, 0, 0, 455, 456, 3, 158, 79, 0, 456, 457, 5, 84, 0, 0, 457, 458, 3, 160, 80, 0, 458, 459, 5, 133, 0, 0, 459, 460, 3, 148, 74, 0, 460, 462, 3, 50, 25, 0, 461, 463, 5, 112, 0, 0, 462, 461, 1, 0, 0, 0, 462, 463, 1, 0, 0, 0, 463, 466, 1, 0, 0, 0, 464, 465, 5, 82, 0, 0, 465, 467, 3, 160, 80, 0, 466, 464, 1, 0, 0, 0, 466, 467, 1, 0, 0, 0, 467, 468, 1, 0, 0, 0, 468, 472, 5, 137, 0, 0, 469, 471, 3, 48, 24, 0, 470, 469, 1, 0, 0, 0, 471, 474, 1, 0, 0, 0, 472, 470, 1, 0, 0, 0, 472, 473, 1, 0, 0, 0, 473, 475, 1, 0, 0, 0, 474, 472, 1, 0, 0, 0, 475, 476, 5, 138, 0, 0, 476, 45, 1, 0, 0, 0, 477, 479, 5, 32, 0, 0, 478, 480, 7, 0, 0, 0, 479, 478, 1, 0, 0, 0, 479, 480, 1, 0, 0, 0, 480, 47, 1, 0, 0, 0, 481, 482, 5, 98, 0, 0, 482, 483, 5, 84, 0, 0, 483, 485, 3, 160, 80, 0, 484, 486, 3, 72, 36, 0, 485, 484, 1, 0, 0, 0, 485, 486, 1, 0, 0, 0, 486, 487, 1, 0, 0, 0, 487, 488, 5, 134, 0, 0, 488, 515, 1, 0, 0, 0, 489, 490, 5, 99, 0, 0, 490, 491, 5, 84, 0, 0, 491, 493, 3, 160, 80, 0, 492, 494, 3, 72, 36, 0, 493, 492, 1, 0, 0, 0, 493, 494, 1, 0, 0, 0, 494, 495, 1, 0, 0, 0, 495, 496, 5, 134, 0, 0, 496, 515, 1, 0, 0, 0, 497, 498, 5, 100, 0, 0, 498, 499, 5, 84, 0, 0, 499, 501, 3, 160, 80, 0, 500, 502, 3, 72, 36, 0, 501, 500, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 504, 5, 134, 0, 0, 504, 515, 1, 0, 0, 0, 505, 506, 5, 93, 0, 0, 506, 507, 5, 94, 0, 0, 507, 508, 5, 84, 0, 0, 508, 509, 3, 160, 80, 0, 509, 510, 5, 95, 0, 0, 510, 511, 5, 84, 0, 0, 511, 512, 3, 160, 80, 0, 512, 513, 5, 134, 0, 0, 513, 515, 1, 0, 0, 0, 514, 481, 1, 0, 0, 0, 514, 489, 1, 0, 0, 0, 514, 497, 1, 0, 0, 0, 514, 505, 1, 0, 0, 0, 515, 49, 1, 0, 0, 0, 516, 517, 5, 43, 0, 0, 517, 526, 3, 158, 79, 0, 518, 519, 5, 44, 0, 0, 519, 521, 3, 158, 79, 0, 520, 522, 3, 28, 14, 0, 521, 520, 1, 0, 0, 0, 521, 522, 1, 0, 0, 0, 522, 526, 1, 0, 0, 0, 523, 524, 5, 36, 0, 0, 524, 526, 3, 158, 79, 0, 525, 516, 1, 0, 0, 0, 525, 518, 1, 0, 0, 0, 525, 523, 1, 0, 0, 0, 526, 51, 1, 0, 0, 0, 527, 529, 3, 16, 8, 0, 528, 527, 1, 0, 0, 0, 529, 532, 1, 0, 0, 0, 530, 528, 1, 0, 0, 0, 530, 531, 1, 0, 0, 0, 531, 533, 1, 0, 0, 0, 532, 530, 1, 0, 0, 0, 533, 534, 5, 46, 0, 0, 534, 535, 3, 158, 79, 0, 535, 536, 5, 84, 0, 0, 536, 537, 3, 160, 80, 0, 537, 538, 5, 77, 0, 0, 538, 541, 3, 160, 80, 0, 539, 540, 5, 78, 0, 0, 540, 542, 5, 147, 0, 0, 541, 539, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 543, 1, 0, 0, 0, 543, 547, 5, 137, 0, 0, 544, 546, 3, 54, 27, 0, 545, 544, 1, 0, 0, 0, 546, 549, 1, 0, 0, 0, 547, 545, 1, 0, 0, 0, 547, 548, 1, 0, 0, 0, 548, 550, 1, 0, 0, 0, 549, 547, 1, 0, 0, 0, 550, 551, 5, 138, 0, 0, 551, 53, 1, 0, 0, 0, 552, 559, 3, 66, 33, 0, 553, 559, 3, 68, 34, 0, 554, 559, 3, 76, 38, 0, 555, 559, 3, 60, 30, 0, 556, 559, 3, 62, 31, 0, 557, 559, 3, 56, 28, 0, 558, 552, 1, 0, 0, 0, 558, 553, 1, 0, 0, 0, 558, 554, 1, 0, 0, 0, 558, 555, 1, 0, 0, 0, 558, 556, 1, 0, 0, 0, 558, 557, 1, 0, 0, 0, 559, 55, 1, 0, 0, 0, 560, 561, 5, 2, 0, 0, 561, 562, 3, 158, 79, 0, 562, 563, 5, 84, 0, 0, 563, 564, 3, 160, 80, 0, 564, 565, 5, 38, 0, 0, 565, 566, 3, 26, 13, 0, 566, 567, 5, 136, 0, 0, 567, 568, 3, 158, 79, 0, 568, 569, 5, 134, 0, 0, 569, 57, 1, 0, 0, 0, 570, 571, 5, 4, 0, 0, 571, 572, 3, 158, 79, 0, 572, 573, 5, 84, 0, 0, 573, 574, 3, 160, 80, 0, 574, 575, 5, 6, 0, 0, 575, 576, 3, 26, 13, 0, 576, 577, 5, 65, 0, 0, 577, 578, 3, 158, 79, 0, 578, 579, 5, 136, 0, 0, 579, 580, 3, 158, 79, 0, 580, 581, 5, 134, 0, 0, 581, 59, 1, 0, 0, 0, 582, 583, 5, 22, 0, 0, 583, 585, 3, 158, 79, 0, 584, 586, 3, 22, 11, 0, 585, 584, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 587, 1, 0, 0, 0, 587, 588, 5, 84, 0, 0, 588, 589, 3, 160, 80, 0, 589, 591, 5, 25, 0, 0, 590, 592, 5, 9, 0, 0, 591, 590, 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 594, 3, 26, 13, 0, 594, 595, 5, 26, 0, 0, 595, 596, 3, 160, 80, 0, 596, 597, 5, 49, 0, 0, 597, 598, 3, 160, 80, 0, 598, 602, 5, 137, 0, 0, 599, 601, 3, 64, 32, 0, 600, 599, 1, 0, 0, 0, 601, 604, 1, 0, 0, 0, 602, 600, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 605, 1, 0, 0, 0, 604, 602, 1, 0, 0, 0, 605, 606, 5, 138, 0, 0, 606, 61, 1, 0, 0, 0, 607, 608, 5, 22, 0, 0, 608, 609, 3, 158, 79, 0, 609, 610, 5, 84, 0, 0, 610, 611, 3, 160, 80, 0, 611, 612, 5, 24, 0, 0, 612, 613, 3, 158, 79, 0, 613, 614, 3, 28, 14, 0, 614, 615, 5, 134, 0, 0, 615, 63, 1, 0, 0, 0, 616, 617, 5, 16, 0, 0, 617, 657, 5, 134, 0, 0, 618, 619, 5, 17, 0, 0, 619, 620, 5, 18, 0, 0, 620, 621, 3, 158, 79, 0, 621, 622, 5, 134, 0, 0, 622, 657, 1, 0, 0, 0, 623, 624, 5, 27, 0, 0, 624, 625, 3, 160, 80, 0, 625, 626, 5, 134, 0, 0, 626, 657, 1, 0, 0, 0, 627, 629, 5, 28, 0, 0, 628, 630, 5, 36, 0, 0, 629, 628, 1, 0, 0, 0, 629, 630, 1, 0, 0, 0, 630, 631, 1, 0, 0, 0, 631, 632, 3, 158, 79, 0, 632, 633, 5, 55, 0, 0, 633, 634, 3, 26, 13, 0, 634, 635, 5, 134, 0, 0, 635, 657, 1, 0, 0, 0, 636, 637, 5, 29, 0, 0, 637, 638, 3, 158, 79, 0, 638, 639, 5, 147, 0, 0, 639, 640, 5, 134, 0, 0, 640, 657, 1, 0, 0, 0, 641, 642, 5, 30, 0, 0, 642, 643, 3, 26, 13, 0, 643, 644, 5, 136, 0, 0, 644, 645, 3, 158, 79, 0, 645, 646, 3, 158, 79, 0, 646, 647, 3, 160, 80, 0, 647, 648, 5, 134, 0, 0, 648, 657, 1, 0, 0, 0, 649, 650, 5, 93, 0, 0, 650, 657, 5, 134, 0, 0, 651, 652, 5, 31, 0, 0, 652, 653, 5, 147, 0, 0, 653, 654, 3, 160, 80, 0, 654, 655, 5, 134, 0, 0, 655, 657, 1, 0, 0, 0, 656, 616, 1, 0, 0, 0, 656, 618, 1, 0, 0, 0, 656, 623, 1, 0, 0, 0, 656, 627, 1, 0, 0, 0, 656, 636, 1, 0, 0, 0, 656, 641, 1, 0, 0, 0, 656, 649, 1, 0, 0, 0, 656, 651, 1, 0, 0, 0, 657, 65, 1, 0, 0, 0, 658, 659, 5, 49, 0, 0, 659, 661, 3, 158, 79, 0, 660, 662, 3, 22, 11, 0, 661, 660, 1, 0, 0, 0, 661, 662, 1, 0, 0, 0, 662, 663, 1, 0, 0, 0, 663, 664, 5, 84, 0, 0, 664, 665, 3, 160, 80, 0, 665, 666, 5, 133, 0, 0, 666, 667, 3, 142, 71, 0, 667, 668, 5, 132, 0, 0, 668, 669, 3, 142, 71, 0, 669, 670, 5, 86, 0, 0, 670, 672, 3, 80, 40, 0, 671, 673, 3, 72, 36, 0, 672, 671, 1, 0, 0, 0, 672, 673, 1, 0, 0, 0, 673, 675, 1, 0, 0, 0, 674, 676, 3, 78, 39, 0, 675, 674, 1, 0, 0, 0, 675, 676, 1, 0, 0, 0, 676, 677, 1, 0, 0, 0, 677, 678, 5, 88, 0, 0, 678, 680, 3, 82, 41, 0, 679, 681, 3, 86, 43, 0, 680, 679, 1, 0, 0, 0, 680, 681, 1, 0, 0, 0, 681, 683, 1, 0, 0, 0, 682, 684, 3, 70, 35, 0, 683, 682, 1, 0, 0, 0, 683, 684, 1, 0, 0, 0, 684, 685, 1, 0, 0, 0, 685, 686, 5, 134, 0, 0, 686, 67, 1, 0, 0, 0, 687, 688, 5, 50, 0, 0, 688, 690, 3, 158, 79, 0, 689, 691, 3, 22, 11, 0, 690, 689, 1, 0, 0, 0, 690, 691, 1, 0, 0, 0, 691, 692, 1, 0, 0, 0, 692, 693, 5, 84, 0, 0, 693, 694, 3, 160, 80, 0, 694, 695, 5, 133, 0, 0, 695, 696, 3, 142, 71, 0, 696, 697, 5, 132, 0, 0, 697, 699, 3, 142, 71, 0, 698, 700, 3, 72, 36, 0, 699, 698, 1, 0, 0, 0, 699, 700, 1, 0, 0, 0, 700, 702, 1, 0, 0, 0, 701, 703, 3, 86, 43, 0, 702, 701, 1, 0, 0, 0, 702, 703, 1, 0, 0, 0, 703, 705, 1, 0, 0, 0, 704, 706, 3, 70, 35, 0, 705, 704, 1, 0, 0, 0, 705, 706, 1, 0, 0, 0, 706, 707, 1, 0, 0, 0, 707, 708, 5, 134, 0, 0, 708, 69, 1, 0, 0, 0, 709, 710, 5, 66, 0, 0, 710, 711, 5, 65, 0, 0, 711, 712, 3, 158, 79, 0, 712, 71, 1, 0, 0, 0, 713, 714, 5, 10, 0, 0, 714, 723, 5, 13, 0, 0, 715, 716, 5, 10, 0, 0, 716, 717, 7, 1, 0, 0, 717, 718, 5, 14, 0, 0, 718, 719, 5, 139, 0, 0, 719, 720, 3, 84, 42, 0, 720, 721, 5, 140, 0, 0, 721, 723, 1, 0, 0, 0, 722, 713, 1, 0, 0, 0, 722, 715, 1, 0, 0, 0, 723, 73, 1, 0, 0, 0, 724, 725, 5, 65, 0, 0, 725, 726, 5, 139, 0, 0, 726, 731, 3, 124, 62, 0, 727, 728, 5, 135, 0, 0, 728, 730, 3, 124, 62, 0, 729, 727, 1, 0, 0, 0, 730, 733, 1, 0, 0, 0, 731, 729, 1, 0, 0, 0, 731, 732, 1, 0, 0, 0, 732, 734, 1, 0, 0, 0, 733, 731, 1, 0, 0, 0, 734, 735, 5, 140, 0, 0, 735, 75, 1, 0, 0, 0, 736, 737, 5, 51, 0, 0, 737, 738, 3, 158, 79, 0, 738, 739, 5, 84, 0, 0, 739, 740, 3, 160, 80, 0, 740, 741, 5, 52, 0, 0, 741, 742, 3, 158, 79, 0, 742, 743, 5, 133, 0, 0, 743, 745, 3, 142, 71, 0, 744, 746, 3, 86, 43, 0, 745, 744, 1, 0, 0, 0, 745, 746, 1, 0, 0, 0, 746, 747, 1, 0, 0, 0, 747, 748, 5, 134, 0, 0, 748, 77, 1, 0, 0, 0, 749, 750, 5, 87, 0, 0, 750, 751, 3, 142, 71, 0, 751, 79, 1, 0, 0, 0, 752, 753, 7, 2, 0, 0, 753, 81, 1, 0, 0, 0, 754, 773, 5, 90, 0, 0, 755, 756, 5, 43, 0, 0, 756, 773, 3, 158, 79, 0, 757, 758, 5, 36, 0, 0, 758, 773, 3, 158, 79, 0, 759, 760, 5, 45, 0, 0, 760, 769, 5, 139, 0, 0, 761, 766, 3, 26, 13, 0, 762, 763, 5, 135, 0, 0, 763, 765, 3, 26, 13, 0, 764, 762, 1, 0, 0, 0, 765, 768, 1, 0, 0, 0, 766, 764, 1, 0, 0, 0, 766, 767, 1, 0, 0, 0, 767, 770, 1, 0, 0, 0, 768, 766, 1, 0, 0, 0, 769, 761, 1, 0, 0, 0, 769, 770, 1, 0, 0, 0, 770, 771, 1, 0, 0, 0, 771, 773, 5, 140, 0, 0, 772, 754, 1, 0, 0, 0, 772, 755, 1, 0, 0, 0, 772, 757, 1, 0, 0, 0, 772, 759, 1, 0, 0, 0, 773, 83, 1, 0, 0, 0, 774, 779, 3, 158, 79, 0, 775, 776, 5, 135, 0, 0, 776, 778, 3, 158, 79, 0, 777, 775, 1, 0, 0, 0, 778, 781, 1, 0, 0, 0, 779, 777, 1, 0, 0, 0, 779, 780, 1, 0, 0, 0, 780, 85, 1, 0, 0, 0, 781, 779, 1, 0, 0, 0, 782, 783, 5, 89, 0, 0, 783, 787, 5, 137, 0, 0, 784, 786, 3, 88, 44, 0, 785, 784, 1, 0, 0, 0, 786, 789, 1, 0, 0, 0, 787, 785, 1, 0, 0, 0, 787, 788, 1, 0, 0, 0, 788, 790, 1, 0, 0, 0, 789, 787, 1, 0, 0, 0, 790, 791, 5, 138, 0, 0, 791, 87, 1, 0, 0, 0, 792, 793, 5, 23, 0, 0, 793, 794, 3, 158, 79, 0, 794, 795, 5, 84, 0, 0, 795, 796, 3, 160, 80, 0, 796, 797, 5, 139, 0, 0, 797, 798, 3, 84, 42, 0, 798, 799, 5, 140, 0, 0, 799, 800, 5, 134, 0, 0, 800, 871, 1, 0, 0, 0, 801, 802, 5, 61, 0, 0, 802, 803, 3, 158, 79, 0, 803, 804, 5, 84, 0, 0, 804, 805, 3, 160, 80, 0, 805, 806, 5, 133, 0, 0, 806, 807, 3, 142, 71, 0, 807, 808, 3, 90, 45, 0, 808, 809, 5, 134, 0, 0, 809, 871, 1, 0, 0, 0, 810, 811, 5, 62, 0, 0, 811, 812, 3, 158, 79, 0, 812, 813, 5, 84, 0, 0, 813, 814, 3, 160, 80, 0, 814, 815, 5, 133, 0, 0, 815, 816, 3, 148, 74, 0, 816, 817, 3, 50, 25, 0, 817, 818, 3, 90, 45, 0, 818, 819, 5, 134, 0, 0, 819, 871, 1, 0, 0, 0, 820, 821, 5, 44, 0, 0, 821, 822, 3, 158, 79, 0, 822, 823, 5, 84, 0, 0, 823, 824, 3, 160, 80, 0, 824, 825, 5, 133, 0, 0, 825, 827, 3, 158, 79, 0, 826, 828, 3, 28, 14, 0, 827, 826, 1, 0, 0, 0, 827, 828, 1, 0, 0, 0, 828, 830, 1, 0, 0, 0, 829, 831, 3, 74, 37, 0, 830, 829, 1, 0, 0, 0, 830, 831, 1, 0, 0, 0, 831, 834, 1, 0, 0, 0, 832, 833, 5, 18, 0, 0, 833, 835, 5, 53, 0, 0, 834, 832, 1, 0, 0, 0, 834, 835, 1, 0, 0, 0, 835, 836, 1, 0, 0, 0, 836, 837, 5, 134, 0, 0, 837, 871, 1, 0, 0, 0, 838, 839, 5, 7, 0, 0, 839, 840, 3, 158, 79, 0, 840, 841, 5, 84, 0, 0, 841, 842, 3, 160, 80, 0, 842, 843, 5, 133, 0, 0, 843, 844, 3, 158, 79, 0, 844, 845, 5, 53, 0, 0, 845, 846, 3, 142, 71, 0, 846, 847, 5, 134, 0, 0, 847, 871, 1, 0, 0, 0, 848, 849, 5, 51, 0, 0, 849, 850, 3, 158, 79, 0, 850, 851, 5, 84, 0, 0, 851, 852, 3, 160, 80, 0, 852, 853, 5, 133, 0, 0, 853, 856, 3, 158, 79, 0, 854, 855, 5, 53, 0, 0, 855, 857, 3, 142, 71, 0, 856, 854, 1, 0, 0, 0, 856, 857, 1, 0, 0, 0, 857, 858, 1, 0, 0, 0, 858, 859, 5, 134, 0, 0, 859, 871, 1, 0, 0, 0, 860, 861, 5, 22, 0, 0, 861, 862, 3, 158, 79, 0, 862, 863, 5, 84, 0, 0, 863, 864, 3, 160, 80, 0, 864, 865, 5, 133, 0, 0, 865, 866, 3, 158, 79, 0, 866, 867, 5, 136, 0, 0, 867, 868, 3, 158, 79, 0, 868, 869, 5, 134, 0, 0, 869, 871, 1, 0, 0, 0, 870, 792, 1, 0, 0, 0, 870, 801, 1, 0, 0, 0, 870, 810, 1, 0, 0, 0, 870, 820, 1, 0, 0, 0, 870, 838, 1, 0, 0, 0, 870, 848, 1, 0, 0, 0, 870, 860, 1, 0, 0, 0, 871, 89, 1, 0, 0, 0, 872, 873, 5, 139, 0, 0, 873, 878, 3, 92, 46, 0, 874, 875, 5, 135, 0, 0, 875, 877, 3, 92, 46, 0, 876, 874, 1, 0, 0, 0, 877, 880, 1, 0, 0, 0, 878, 876, 1, 0, 0, 0, 878, 879, 1, 0, 0, 0, 879, 881, 1, 0, 0, 0, 880, 878, 1, 0, 0, 0, 881, 882, 5, 140, 0, 0, 882, 91, 1, 0, 0, 0, 883, 884, 7, 3, 0, 0, 884, 93, 1, 0, 0, 0, 885, 886, 5, 60, 0, 0, 886, 887, 3, 96, 48, 0, 887, 95, 1, 0, 0, 0, 888, 891, 3, 98, 49, 0, 889, 891, 3, 102, 51, 0, 890, 888, 1, 0, 0, 0, 890, 889, 1, 0, 0, 0, 891, 97, 1, 0, 0, 0, 892, 893, 5, 61, 0, 0, 893, 894, 3, 158, 79, 0, 894, 895, 5, 84, 0, 0, 895, 896, 3, 160, 80, 0, 896, 897, 5, 71, 0, 0, 897, 898, 3, 158, 79, 0, 898, 899, 5, 133, 0, 0, 899, 900, 3, 142, 71, 0, 900, 901, 5, 72, 0, 0, 901, 904, 3, 100, 50, 0, 902, 903, 5, 73, 0, 0, 903, 905, 3, 150, 75, 0, 904, 902, 1, 0, 0, 0, 904, 905, 1, 0, 0, 0, 905, 906, 1, 0, 0, 0, 906, 907, 5, 134, 0, 0, 907, 99, 1, 0, 0, 0, 908, 915, 5, 106, 0, 0, 909, 910, 5, 107, 0, 0, 910, 911, 5, 141, 0, 0, 911, 912, 3, 142, 71, 0, 912, 913, 5, 142, 0, 0, 913, 915, 1, 0, 0, 0, 914, 908, 1, 0, 0, 0, 914, 909, 1, 0, 0, 0, 915, 101, 1, 0, 0, 0, 916, 917, 5, 62, 0, 0, 917, 918, 3, 158, 79, 0, 918, 919, 5, 84, 0, 0, 919, 920, 3, 160, 80, 0, 920, 921, 5, 137, 0, 0, 921, 922, 3, 104, 52, 0, 922, 923, 3, 104, 52, 0, 923, 924, 5, 138, 0, 0, 924, 103, 1, 0, 0, 0, 925, 926, 3, 50, 25, 0, 926, 927, 5, 63, 0, 0, 927, 928, 3, 158, 79, 0, 928, 929, 5, 84, 0, 0, 929, 930, 3, 160, 80, 0, 930, 932, 3, 148, 74, 0, 931, 933, 5, 112, 0, 0, 932, 931, 1, 0, 0, 0, 932, 933, 1, 0, 0, 0, 933, 936, 1, 0, 0, 0, 934, 935, 5, 79, 0, 0, 935, 937, 3, 160, 80, 0, 936, 934, 1, 0, 0, 0, 936, 937, 1, 0, 0, 0, 937, 939, 1, 0, 0, 0, 938, 940, 5, 81, 0, 0, 939, 938, 1, 0, 0, 0, 939, 940, 1, 0, 0, 0, 940, 943, 1, 0, 0, 0, 941, 942, 5, 82, 0, 0, 942, 944, 3, 160, 80, 0, 943, 941, 1, 0, 0, 0, 943, 944, 1, 0, 0, 0, 944, 946, 1, 0, 0, 0, 945, 947, 5, 83, 0, 0, 946, 945, 1, 0, 0, 0, 946, 947, 1, 0, 0, 0, 947, 948, 1, 0, 0, 0, 948, 949, 5, 134, 0, 0, 949, 105, 1, 0, 0, 0, 950, 951, 5, 54, 0, 0, 951, 952, 3, 158, 79, 0, 952, 953, 5, 55, 0, 0, 953, 955, 3, 158, 79, 0, 954, 956, 3, 28, 14, 0, 955, 954, 1, 0, 0, 0, 955, 956, 1, 0, 0, 0, 956, 959, 1, 0, 0, 0, 957, 958, 5, 84, 0, 0, 958, 960, 3, 160, 80, 0, 959, 957, 1, 0, 0, 0, 959, 960, 1, 0, 0, 0, 960, 963, 1, 0, 0, 0, 961, 962, 5, 78, 0, 0, 962, 964, 5, 147, 0, 0, 963, 961, 1, 0, 0, 0, 963, 964, 1, 0, 0, 0, 964, 965, 1, 0, 0, 0, 965, 969, 5, 137, 0, 0, 966, 968, 3, 108, 54, 0, 967, 966, 1, 0, 0, 0, 968, 971, 1, 0, 0, 0, 969, 967, 1, 0, 0, 0, 969, 970, 1, 0, 0, 0, 970, 972, 1, 0, 0, 0, 971, 969, 1, 0, 0, 0, 972, 973, 5, 138, 0, 0, 973, 107, 1, 0, 0, 0, 974, 975, 5, 59, 0, 0, 975, 982, 3, 96, 48, 0, 976, 982, 3, 122, 61, 0, 977, 982, 3, 118, 59, 0, 978, 982, 3, 112, 56, 0, 979, 982, 3, 120, 60, 0, 980, 982, 3, 110, 55, 0, 981, 974, 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, 109, 1, 0, 0, 0, 983, 984, 5, 56, 0, 0, 984, 985, 3, 158, 79, 0, 985, 986, 5, 58, 0, 0, 986, 987, 3, 158, 79, 0, 987, 988, 5, 136, 0, 0, 988, 989, 3, 158, 79, 0, 989, 990, 5, 134, 0, 0, 990, 111, 1, 0, 0, 0, 991, 992, 5, 8, 0, 0, 992, 996, 5, 137, 0, 0, 993, 995, 3, 114, 57, 0, 994, 993, 1, 0, 0, 0, 995, 998, 1, 0, 0, 0, 996, 994, 1, 0, 0, 0, 996, 997, 1, 0, 0, 0, 997, 999, 1, 0, 0, 0, 998, 996, 1, 0, 0, 0, 999, 1000, 5, 138, 0, 0, 1000, 1001, 5, 134, 0, 0, 1001, 113, 1, 0, 0, 0, 1002, 1003, 3, 158, 79, 0, 1003, 1004, 5, 58, 0, 0, 1004, 1005, 5, 61, 0, 0, 1005, 1006, 3, 158, 79, 0, 1006, 1007, 5, 134, 0, 0, 1007, 1017, 1, 0, 0, 0, 1008, 1009, 3, 158, 79, 0, 1009, 1010, 5, 58, 0, 0, 1010, 1011, 5, 62, 0, 0, 1011, 1012, 3, 158, 79, 0, 1012, 1013, 5, 136, 0, 0, 1013, 1014, 3, 158, 79, 0, 1014, 1015, 5, 134, 0, 0, 1015, 1017, 1, 0, 0, 0, 1016, 1002, 1, 0, 0, 0, 1016, 1008, 1, 0, 0, 0, 1017, 115, 1, 0, 0, 0, 1018, 1019, 3, 26, 13, 0, 1019, 1020, 5, 18, 0, 0, 1020, 1025, 5, 53, 0, 0, 1021, 1022, 5, 136, 0, 0, 1022, 1024, 3, 158, 79, 0, 1023, 1021, 1, 0, 0, 0, 1024, 1027, 1, 0, 0, 0, 1025, 1023, 1, 0, 0, 0, 1025, 1026, 1, 0, 0, 0, 1026, 1028, 1, 0, 0, 0, 1027, 1025, 1, 0, 0, 0, 1028, 1029, 5, 134, 0, 0, 1029, 117, 1, 0, 0, 0, 1030, 1031, 5, 56, 0, 0, 1031, 1032, 3, 158, 79, 0, 1032, 1033, 5, 58, 0, 0, 1033, 1034, 5, 61, 0, 0, 1034, 1035, 3, 158, 79, 0, 1035, 1036, 5, 134, 0, 0, 1036, 119, 1, 0, 0, 0, 1037, 1038, 5, 68, 0, 0, 1038, 1039, 3, 158, 79, 0, 1039, 1040, 5, 69, 0, 0, 1040, 1041, 5, 70, 0, 0, 1041, 1042, 5, 65, 0, 0, 1042, 1043, 5, 51, 0, 0, 1043, 1044, 3, 158, 79, 0, 1044, 1045, 5, 67, 0, 0, 1045, 1046, 5, 62, 0, 0, 1046, 1047, 3, 158, 79, 0, 1047, 1048, 5, 136, 0, 0, 1048, 1049, 3, 158, 79, 0, 1049, 1050, 5, 134, 0, 0, 1050, 121, 1, 0, 0, 0, 1051, 1052, 5, 56, 0, 0, 1052, 1053, 3, 124, 62, 0, 1053, 1054, 5, 58, 0, 0, 1054, 1057, 3, 128, 64, 0, 1055, 1056, 5, 34, 0, 0, 1056, 1058, 3, 160, 80, 0, 1057, 1055, 1, 0, 0, 0, 1057, 1058, 1, 0, 0, 0, 1058, 1059, 1, 0, 0, 0, 1059, 1060, 5, 134, 0, 0, 1060, 123, 1, 0, 0, 0, 1061, 1062, 3, 158, 79, 0, 1062, 1063, 5, 136, 0, 0, 1063, 1064, 3, 126, 63, 0, 1064, 125, 1, 0, 0, 0, 1065, 1078, 3, 158, 79, 0, 1066, 1078, 5, 101, 0, 0, 1067, 1078, 5, 91, 0, 0, 1068, 1078, 5, 92, 0, 0, 1069, 1078, 5, 1, 0, 0, 1070, 1078, 5, 98, 0, 0, 1071, 1078, 5, 99, 0, 0, 1072, 1078, 5, 100, 0, 0, 1073, 1078, 5, 102, 0, 0, 1074, 1078, 5, 103, 0, 0, 1075, 1078, 5, 104, 0, 0, 1076, 1078, 5, 105, 0, 0, 1077, 1065, 1, 0, 0, 0, 1077, 1066, 1, 0, 0, 0, 1077, 1067, 1, 0, 0, 0, 1077, 1068, 1, 0, 0, 0, 1077, 1069, 1, 0, 0, 0, 1077, 1070, 1, 0, 0, 0, 1077, 1071, 1, 0, 0, 0, 1077, 1072, 1, 0, 0, 0, 1077, 1073, 1, 0, 0, 0, 1077, 1074, 1, 0, 0, 0, 1077, 1075, 1, 0, 0, 0, 1077, 1076, 1, 0, 0, 0, 1078, 127, 1, 0, 0, 0, 1079, 1080, 5, 80, 0, 0, 1080, 1081, 5, 136, 0, 0, 1081, 1116, 3, 158, 79, 0, 1082, 1083, 5, 61, 0, 0, 1083, 1084, 3, 158, 79, 0, 1084, 1085, 5, 136, 0, 0, 1085, 1086, 3, 132, 66, 0, 1086, 1116, 1, 0, 0, 0, 1087, 1088, 5, 62, 0, 0, 1088, 1089, 3, 158, 79, 0, 1089, 1090, 5, 136, 0, 0, 1090, 1091, 3, 158, 79, 0, 1091, 1092, 5, 136, 0, 0, 1092, 1093, 3, 134, 67, 0, 1093, 1116, 1, 0, 0, 0, 1094, 1095, 5, 44, 0, 0, 1095, 1097, 3, 158, 79, 0, 1096, 1098, 3, 28, 14, 0, 1097, 1096, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1099, 1, 0, 0, 0, 1099, 1100, 5, 136, 0, 0, 1100, 1101, 3, 124, 62, 0, 1101, 1116, 1, 0, 0, 0, 1102, 1103, 5, 46, 0, 0, 1103, 1104, 3, 158, 79, 0, 1104, 1105, 5, 136, 0, 0, 1105, 1107, 3, 158, 79, 0, 1106, 1108, 3, 28, 14, 0, 1107, 1106, 1, 0, 0, 0, 1107, 1108, 1, 0, 0, 0, 1108, 1110, 1, 0, 0, 0, 1109, 1111, 3, 136, 68, 0, 1110, 1109, 1, 0, 0, 0, 1110, 1111, 1, 0, 0, 0, 1111, 1113, 1, 0, 0, 0, 1112, 1114, 3, 130, 65, 0, 1113, 1112, 1, 0, 0, 0, 1113, 1114, 1, 0, 0, 0, 1114, 1116, 1, 0, 0, 0, 1115, 1079, 1, 0, 0, 0, 1115, 1082, 1, 0, 0, 0, 1115, 1087, 1, 0, 0, 0, 1115, 1094, 1, 0, 0, 0, 1115, 1102, 1, 0, 0, 0, 1116, 129, 1, 0, 0, 0, 1117, 1118, 5, 66, 0, 0, 1118, 1119, 3, 136, 68, 0, 1119, 131, 1, 0, 0, 0, 1120, 1121, 7, 4, 0, 0, 1121, 133, 1, 0, 0, 0, 1122, 1123, 7, 5, 0, 0, 1123, 135, 1, 0, 0, 0, 1124, 1125, 5, 64, 0, 0, 1125, 1129, 5, 137, 0, 0, 1126, 1128, 3, 138, 69, 0, 1127, 1126, 1, 0, 0, 0, 1128, 1131, 1, 0, 0, 0, 1129, 1127, 1, 0, 0, 0, 1129, 1130, 1, 0, 0, 0, 1130, 1132, 1, 0, 0, 0, 1131, 1129, 1, 0, 0, 0, 1132, 1133, 5, 138, 0, 0, 1133, 137, 1, 0, 0, 0, 1134, 1135, 3, 158, 79, 0, 1135, 1136, 5, 58, 0, 0, 1136, 1137, 5, 9, 0, 0, 1137, 1138, 5, 23, 0, 0, 1138, 1139, 5, 139, 0, 0, 1139, 1140, 3, 84, 42, 0, 1140, 1141, 5, 140, 0, 0, 1141, 1142, 5, 134, 0, 0, 1142, 1233, 1, 0, 0, 0, 1143, 1144, 3, 158, 79, 0, 1144, 1145, 5, 58, 0, 0, 1145, 1146, 5, 61, 0, 0, 1146, 1153, 3, 158, 79, 0, 1147, 1148, 5, 67, 0, 0, 1148, 1149, 5, 62, 0, 0, 1149, 1150, 3, 158, 79, 0, 1150, 1151, 5, 136, 0, 0, 1151, 1152, 3, 158, 79, 0, 1152, 1154, 1, 0, 0, 0, 1153, 1147, 1, 0, 0, 0, 1153, 1154, 1, 0, 0, 0, 1154, 1155, 1, 0, 0, 0, 1155, 1156, 5, 134, 0, 0, 1156, 1233, 1, 0, 0, 0, 1157, 1158, 3, 158, 79, 0, 1158, 1159, 5, 58, 0, 0, 1159, 1160, 5, 62, 0, 0, 1160, 1161, 3, 158, 79, 0, 1161, 1162, 5, 136, 0, 0, 1162, 1169, 3, 158, 79, 0, 1163, 1164, 5, 67, 0, 0, 1164, 1165, 5, 62, 0, 0, 1165, 1166, 3, 158, 79, 0, 1166, 1167, 5, 136, 0, 0, 1167, 1168, 3, 158, 79, 0, 1168, 1170, 1, 0, 0, 0, 1169, 1163, 1, 0, 0, 0, 1169, 1170, 1, 0, 0, 0, 1170, 1171, 1, 0, 0, 0, 1171, 1172, 5, 134, 0, 0, 1172, 1233, 1, 0, 0, 0, 1173, 1174, 3, 158, 79, 0, 1174, 1175, 5, 58, 0, 0, 1175, 1176, 5, 44, 0, 0, 1176, 1178, 3, 158, 79, 0, 1177, 1179, 3, 28, 14, 0, 1178, 1177, 1, 0, 0, 0, 1178, 1179, 1, 0, 0, 0, 1179, 1188, 1, 0, 0, 0, 1180, 1181, 5, 67, 0, 0, 1181, 1182, 5, 62, 0, 0, 1182, 1183, 3, 158, 79, 0, 1183, 1184, 5, 136, 0, 0, 1184, 1185, 3, 158, 79, 0, 1185, 1189, 1, 0, 0, 0, 1186, 1187, 5, 18, 0, 0, 1187, 1189, 5, 53, 0, 0, 1188, 1180, 1, 0, 0, 0, 1188, 1186, 1, 0, 0, 0, 1188, 1189, 1, 0, 0, 0, 1189, 1190, 1, 0, 0, 0, 1190, 1191, 5, 134, 0, 0, 1191, 1233, 1, 0, 0, 0, 1192, 1193, 3, 158, 79, 0, 1193, 1194, 5, 58, 0, 0, 1194, 1195, 5, 7, 0, 0, 1195, 1196, 3, 158, 79, 0, 1196, 1197, 5, 64, 0, 0, 1197, 1201, 5, 137, 0, 0, 1198, 1200, 3, 116, 58, 0, 1199, 1198, 1, 0, 0, 0, 1200, 1203, 1, 0, 0, 0, 1201, 1199, 1, 0, 0, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1204, 1, 0, 0, 0, 1203, 1201, 1, 0, 0, 0, 1204, 1205, 5, 138, 0, 0, 1205, 1206, 5, 134, 0, 0, 1206, 1233, 1, 0, 0, 0, 1207, 1208, 3, 158, 79, 0, 1208, 1209, 5, 58, 0, 0, 1209, 1210, 5, 51, 0, 0, 1210, 1211, 3, 158, 79, 0, 1211, 1212, 5, 134, 0, 0, 1212, 1233, 1, 0, 0, 0, 1213, 1214, 3, 158, 79, 0, 1214, 1216, 5, 58, 0, 0, 1215, 1217, 5, 9, 0, 0, 1216, 1215, 1, 0, 0, 0, 1216, 1217, 1, 0, 0, 0, 1217, 1218, 1, 0, 0, 0, 1218, 1219, 5, 22, 0, 0, 1219, 1220, 3, 158, 79, 0, 1220, 1221, 5, 136, 0, 0, 1221, 1228, 3, 158, 79, 0, 1222, 1223, 5, 67, 0, 0, 1223, 1224, 5, 62, 0, 0, 1224, 1225, 3, 158, 79, 0, 1225, 1226, 5, 136, 0, 0, 1226, 1227, 3, 158, 79, 0, 1227, 1229, 1, 0, 0, 0, 1228, 1222, 1, 0, 0, 0, 1228, 1229, 1, 0, 0, 0, 1229, 1230, 1, 0, 0, 0, 1230, 1231, 5, 134, 0, 0, 1231, 1233, 1, 0, 0, 0, 1232, 1134, 1, 0, 0, 0, 1232, 1143, 1, 0, 0, 0, 1232, 1157, 1, 0, 0, 0, 1232, 1173, 1, 0, 0, 0, 1232, 1192, 1, 0, 0, 0, 1232, 1207, 1, 0, 0, 0, 1232, 1213, 1, 0, 0, 0, 1233, 139, 1, 0, 0, 0, 1234, 1235, 5, 51, 0, 0, 1235, 1236, 3, 158, 79, 0, 1236, 1237, 5, 58, 0, 0, 1237, 1238, 3, 158, 79, 0, 1238, 1239, 5, 136, 0, 0, 1239, 1241, 3, 158, 79, 0, 1240, 1242, 3, 136, 68, 0, 1241, 1240, 1, 0, 0, 0, 1241, 1242, 1, 0, 0, 0, 1242, 1243, 1, 0, 0, 0, 1243, 1244, 5, 134, 0, 0, 1244, 141, 1, 0, 0, 0, 1245, 1292, 3, 146, 73, 0, 1246, 1292, 5, 113, 0, 0, 1247, 1292, 5, 114, 0, 0, 1248, 1249, 5, 115, 0, 0, 1249, 1292, 3, 160, 80, 0, 1250, 1251, 5, 116, 0, 0, 1251, 1252, 5, 143, 0, 0, 1252, 1253, 3, 158, 79, 0, 1253, 1254, 5, 144, 0, 0, 1254, 1292, 1, 0, 0, 0, 1255, 1256, 5, 117, 0, 0, 1256, 1257, 5, 143, 0, 0, 1257, 1259, 3, 158, 79, 0, 1258, 1260, 3, 28, 14, 0, 1259, 1258, 1, 0, 0, 0, 1259, 1260, 1, 0, 0, 0, 1260, 1261, 1, 0, 0, 0, 1261, 1262, 5, 144, 0, 0, 1262, 1292, 1, 0, 0, 0, 1263, 1264, 5, 39, 0, 0, 1264, 1265, 5, 143, 0, 0, 1265, 1266, 3, 158, 79, 0, 1266, 1267, 5, 144, 0, 0, 1267, 1292, 1, 0, 0, 0, 1268, 1269, 5, 118, 0, 0, 1269, 1270, 5, 143, 0, 0, 1270, 1271, 3, 142, 71, 0, 1271, 1272, 5, 144, 0, 0, 1272, 1292, 1, 0, 0, 0, 1273, 1274, 5, 119, 0, 0, 1274, 1275, 5, 143, 0, 0, 1275, 1276, 3, 142, 71, 0, 1276, 1277, 5, 144, 0, 0, 1277, 1292, 1, 0, 0, 0, 1278, 1279, 5, 120, 0, 0, 1279, 1283, 5, 137, 0, 0, 1280, 1282, 3, 144, 72, 0, 1281, 1280, 1, 0, 0, 0, 1282, 1285, 1, 0, 0, 0, 1283, 1281, 1, 0, 0, 0, 1283, 1284, 1, 0, 0, 0, 1284, 1286, 1, 0, 0, 0, 1285, 1283, 1, 0, 0, 0, 1286, 1292, 5, 138, 0, 0, 1287, 1289, 3, 158, 79, 0, 1288, 1290, 3, 28, 14, 0, 1289, 1288, 1, 0, 0, 0, 1289, 1290, 1, 0, 0, 0, 1290, 1292, 1, 0, 0, 0, 1291, 1245, 1, 0, 0, 0, 1291, 1246, 1, 0, 0, 0, 1291, 1247, 1, 0, 0, 0, 1291, 1248, 1, 0, 0, 0, 1291, 1250, 1, 0, 0, 0, 1291, 1255, 1, 0, 0, 0, 1291, 1263, 1, 0, 0, 0, 1291, 1268, 1, 0, 0, 0, 1291, 1273, 1, 0, 0, 0, 1291, 1278, 1, 0, 0, 0, 1291, 1287, 1, 0, 0, 0, 1292, 143, 1, 0, 0, 0, 1293, 1294, 3, 158, 79, 0, 1294, 1295, 5, 133, 0, 0, 1295, 1296, 3, 142, 71, 0, 1296, 1297, 5, 134, 0, 0, 1297, 145, 1, 0, 0, 0, 1298, 1299, 7, 6, 0, 0, 1299, 147, 1, 0, 0, 0, 1300, 1301, 7, 7, 0, 0, 1301, 149, 1, 0, 0, 0, 1302, 1311, 3, 160, 80, 0, 1303, 1311, 5, 147, 0, 0, 1304, 1311, 5, 148, 0, 0, 1305, 1311, 5, 129, 0, 0, 1306, 1311, 5, 130, 0, 0, 1307, 1311, 5, 131, 0, 0, 1308, 1311, 3, 152, 76, 0, 1309, 1311, 3, 156, 78, 0, 1310, 1302, 1, 0, 0, 0, 1310, 1303, 1, 0, 0, 0, 1310, 1304, 1, 0, 0, 0, 1310, 1305, 1, 0, 0, 0, 1310, 1306, 1, 0, 0, 0, 1310, 1307, 1, 0, 0, 0, 1310, 1308, 1, 0, 0, 0, 1310, 1309, 1, 0, 0, 0, 1311, 151, 1, 0, 0, 0, 1312, 1321, 5, 137, 0, 0, 1313, 1318, 3, 154, 77, 0, 1314, 1315, 5, 135, 0, 0, 1315, 1317, 3, 154, 77, 0, 1316, 1314, 1, 0, 0, 0, 1317, 1320, 1, 0, 0, 0, 1318, 1316, 1, 0, 0, 0, 1318, 1319, 1, 0, 0, 0, 1319, 1322, 1, 0, 0, 0, 1320, 1318, 1, 0, 0, 0, 1321, 1313, 1, 0, 0, 0, 1321, 1322, 1, 0, 0, 0, 1322, 1323, 1, 0, 0, 0, 1323, 1324, 5, 138, 0, 0, 1324, 153, 1, 0, 0, 0, 1325, 1326, 3, 160, 80, 0, 1326, 1327, 5, 133, 0, 0, 1327, 1328, 3, 150, 75, 0, 1328, 155, 1, 0, 0, 0, 1329, 1338, 5, 139, 0, 0, 1330, 1335, 3, 150, 75, 0, 1331, 1332, 5, 135, 0, 0, 1332, 1334, 3, 150, 75, 0, 1333, 1331, 1, 0, 0, 0, 1334, 1337, 1, 0, 0, 0, 1335, 1333, 1, 0, 0, 0, 1335, 1336, 1, 0, 0, 0, 1336, 1339, 1, 0, 0, 0, 1337, 1335, 1, 0, 0, 0, 1338, 1330, 1, 0, 0, 0, 1338, 1339, 1, 0, 0, 0, 1339, 1340, 1, 0, 0, 0, 1340, 1341, 5, 140, 0, 0, 1341, 157, 1, 0, 0, 0, 1342, 1343, 7, 8, 0, 0, 1343, 159, 1, 0, 0, 0, 1344, 1345, 5, 150, 0, 0, 1345, 161, 1, 0, 0, 0, 116, 174, 181, 202, 215, 227, 247, 255, 262, 268, 280, 283, 289, 300, 309, 319, 322, 324, 328, 336, 348, 353, 363, 373, 378, 393, 399, 411, 420, 428, 436, 449, 452, 462, 466, 472, 479, 485, 493, 501, 514, 521, 525, 530, 541, 547, 558, 585, 591, 602, 629, 656, 661, 672, 675, 680, 683, 690, 699, 702, 705, 722, 731, 745, 766, 769, 772, 779, 787, 827, 830, 834, 856, 870, 878, 890, 904, 914, 932, 936, 939, 943, 946, 955, 959, 963, 969, 981, 996, 1016, 1025, 1057, 1077, 1097, 1107, 1110, 1113, 1115, 1129, 1153, 1169, 1178, 1188, 1201, 1216, 1228, 1232, 1241, 1259, 1283, 1289, 1291, 1310, 1318, 1321, 1335, 1338] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapability.tokens b/src/capability-language/generated/QuixosCapability.tokens index f1baa32..c207cdc 100644 --- a/src/capability-language/generated/QuixosCapability.tokens +++ b/src/capability-language/generated/QuixosCapability.tokens @@ -1,8 +1,8 @@ EDIT=1 -COMPONENT=2 -PRESENTATION=3 -SUBJECT=4 -RUNTIME=5 +MODULE=2 +CONTRACT=3 +PRESENTATION=4 +SUBJECT=5 FOR=6 CREATION=7 INITIALIZE=8 @@ -152,10 +152,10 @@ LINE_COMMENT=151 BLOCK_COMMENT=152 WS=153 'edit'=1 -'component'=2 -'presentation'=3 -'subject'=4 -'runtime'=5 +'module'=2 +'contract'=3 +'presentation'=4 +'subject'=5 'for'=6 'creation'=7 'initialize'=8 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.interp b/src/capability-language/generated/QuixosCapabilityLexer.interp index 0cf8db1..9dcc4f5 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.interp +++ b/src/capability-language/generated/QuixosCapabilityLexer.interp @@ -1,10 +1,10 @@ token literal names: null 'edit' -'component' +'module' +'contract' 'presentation' 'subject' -'runtime' 'for' 'creation' 'initialize' @@ -157,10 +157,10 @@ null token symbolic names: null EDIT -COMPONENT +MODULE +CONTRACT PRESENTATION SUBJECT -RUNTIME FOR CREATION INITIALIZE @@ -312,10 +312,10 @@ WS rule names: EDIT -COMPONENT +MODULE +CONTRACT PRESENTATION SUBJECT -RUNTIME FOR CREATION INITIALIZE @@ -475,4 +475,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 153, 1471, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 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, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 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, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 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, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 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, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 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, 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, 33, 1, 33, 1, 33, 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, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 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, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 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, 44, 1, 44, 1, 44, 1, 44, 1, 44, 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, 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, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 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, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 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, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 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, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 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, 65, 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, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 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, 73, 1, 74, 1, 74, 1, 74, 1, 74, 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, 75, 1, 76, 1, 76, 1, 76, 1, 76, 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, 77, 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, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 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, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 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, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 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, 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, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 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, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 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, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 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, 103, 1, 103, 1, 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, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 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, 144, 1, 144, 1, 145, 1, 145, 1, 146, 3, 146, 1372, 8, 146, 1, 146, 4, 146, 1375, 8, 146, 11, 146, 12, 146, 1376, 1, 147, 3, 147, 1380, 8, 147, 1, 147, 1, 147, 1, 147, 5, 147, 1385, 8, 147, 10, 147, 12, 147, 1388, 9, 147, 3, 147, 1390, 8, 147, 1, 147, 1, 147, 4, 147, 1394, 8, 147, 11, 147, 12, 147, 1395, 3, 147, 1398, 8, 147, 1, 147, 1, 147, 3, 147, 1402, 8, 147, 1, 147, 4, 147, 1405, 8, 147, 11, 147, 12, 147, 1406, 3, 147, 1409, 8, 147, 1, 148, 1, 148, 5, 148, 1413, 8, 148, 10, 148, 12, 148, 1416, 9, 148, 1, 149, 1, 149, 1, 149, 5, 149, 1421, 8, 149, 10, 149, 12, 149, 1424, 9, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 3, 150, 1436, 8, 150, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 5, 152, 1444, 8, 152, 10, 152, 12, 152, 1447, 9, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 5, 153, 1455, 8, 153, 10, 153, 12, 153, 1458, 9, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 4, 154, 1466, 8, 154, 11, 154, 12, 154, 1467, 1, 154, 1, 154, 1, 1456, 0, 155, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 143, 287, 144, 289, 145, 291, 146, 293, 147, 295, 148, 297, 149, 299, 150, 301, 0, 303, 0, 305, 151, 307, 152, 309, 153, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1485, 0, 1, 1, 0, 0, 0, 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, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 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, 305, 1, 0, 0, 0, 0, 307, 1, 0, 0, 0, 0, 309, 1, 0, 0, 0, 1, 311, 1, 0, 0, 0, 3, 316, 1, 0, 0, 0, 5, 326, 1, 0, 0, 0, 7, 339, 1, 0, 0, 0, 9, 347, 1, 0, 0, 0, 11, 355, 1, 0, 0, 0, 13, 359, 1, 0, 0, 0, 15, 368, 1, 0, 0, 0, 17, 379, 1, 0, 0, 0, 19, 389, 1, 0, 0, 0, 21, 399, 1, 0, 0, 0, 23, 408, 1, 0, 0, 0, 25, 420, 1, 0, 0, 0, 27, 427, 1, 0, 0, 0, 29, 435, 1, 0, 0, 0, 31, 444, 1, 0, 0, 0, 33, 452, 1, 0, 0, 0, 35, 458, 1, 0, 0, 0, 37, 463, 1, 0, 0, 0, 39, 476, 1, 0, 0, 0, 41, 486, 1, 0, 0, 0, 43, 498, 1, 0, 0, 0, 45, 504, 1, 0, 0, 0, 47, 515, 1, 0, 0, 0, 49, 526, 1, 0, 0, 0, 51, 531, 1, 0, 0, 0, 53, 540, 1, 0, 0, 0, 55, 550, 1, 0, 0, 0, 57, 555, 1, 0, 0, 0, 59, 559, 1, 0, 0, 0, 61, 565, 1, 0, 0, 0, 63, 570, 1, 0, 0, 0, 65, 580, 1, 0, 0, 0, 67, 584, 1, 0, 0, 0, 69, 597, 1, 0, 0, 0, 71, 602, 1, 0, 0, 0, 73, 609, 1, 0, 0, 0, 75, 618, 1, 0, 0, 0, 77, 629, 1, 0, 0, 0, 79, 633, 1, 0, 0, 0, 81, 642, 1, 0, 0, 0, 83, 649, 1, 0, 0, 0, 85, 658, 1, 0, 0, 0, 87, 663, 1, 0, 0, 0, 89, 673, 1, 0, 0, 0, 91, 684, 1, 0, 0, 0, 93, 692, 1, 0, 0, 0, 95, 698, 1, 0, 0, 0, 97, 707, 1, 0, 0, 0, 99, 717, 1, 0, 0, 0, 101, 726, 1, 0, 0, 0, 103, 738, 1, 0, 0, 0, 105, 749, 1, 0, 0, 0, 107, 755, 1, 0, 0, 0, 109, 763, 1, 0, 0, 0, 111, 766, 1, 0, 0, 0, 113, 771, 1, 0, 0, 0, 115, 778, 1, 0, 0, 0, 117, 781, 1, 0, 0, 0, 119, 789, 1, 0, 0, 0, 121, 796, 1, 0, 0, 0, 123, 802, 1, 0, 0, 0, 125, 807, 1, 0, 0, 0, 127, 818, 1, 0, 0, 0, 129, 823, 1, 0, 0, 0, 131, 829, 1, 0, 0, 0, 133, 836, 1, 0, 0, 0, 135, 840, 1, 0, 0, 0, 137, 852, 1, 0, 0, 0, 139, 855, 1, 0, 0, 0, 141, 862, 1, 0, 0, 0, 143, 865, 1, 0, 0, 0, 145, 872, 1, 0, 0, 0, 147, 880, 1, 0, 0, 0, 149, 887, 1, 0, 0, 0, 151, 898, 1, 0, 0, 0, 153, 905, 1, 0, 0, 0, 155, 914, 1, 0, 0, 0, 157, 929, 1, 0, 0, 0, 159, 939, 1, 0, 0, 0, 161, 949, 1, 0, 0, 0, 163, 962, 1, 0, 0, 0, 165, 968, 1, 0, 0, 0, 167, 985, 1, 0, 0, 0, 169, 988, 1, 0, 0, 0, 171, 992, 1, 0, 0, 0, 173, 997, 1, 0, 0, 0, 175, 1003, 1, 0, 0, 0, 177, 1012, 1, 0, 0, 0, 179, 1021, 1, 0, 0, 0, 181, 1025, 1, 0, 0, 0, 183, 1029, 1, 0, 0, 0, 185, 1033, 1, 0, 0, 0, 187, 1039, 1, 0, 0, 0, 189, 1045, 1, 0, 0, 0, 191, 1050, 1, 0, 0, 0, 193, 1055, 1, 0, 0, 0, 195, 1061, 1, 0, 0, 0, 197, 1069, 1, 0, 0, 0, 199, 1077, 1, 0, 0, 0, 201, 1088, 1, 0, 0, 0, 203, 1093, 1, 0, 0, 0, 205, 1105, 1, 0, 0, 0, 207, 1116, 1, 0, 0, 0, 209, 1126, 1, 0, 0, 0, 211, 1138, 1, 0, 0, 0, 213, 1147, 1, 0, 0, 0, 215, 1152, 1, 0, 0, 0, 217, 1165, 1, 0, 0, 0, 219, 1177, 1, 0, 0, 0, 221, 1189, 1, 0, 0, 0, 223, 1194, 1, 0, 0, 0, 225, 1202, 1, 0, 0, 0, 227, 1207, 1, 0, 0, 0, 229, 1220, 1, 0, 0, 0, 231, 1228, 1, 0, 0, 0, 233, 1237, 1, 0, 0, 0, 235, 1251, 1, 0, 0, 0, 237, 1260, 1, 0, 0, 0, 239, 1265, 1, 0, 0, 0, 241, 1272, 1, 0, 0, 0, 243, 1277, 1, 0, 0, 0, 245, 1283, 1, 0, 0, 0, 247, 1290, 1, 0, 0, 0, 249, 1296, 1, 0, 0, 0, 251, 1302, 1, 0, 0, 0, 253, 1309, 1, 0, 0, 0, 255, 1316, 1, 0, 0, 0, 257, 1323, 1, 0, 0, 0, 259, 1328, 1, 0, 0, 0, 261, 1334, 1, 0, 0, 0, 263, 1339, 1, 0, 0, 0, 265, 1342, 1, 0, 0, 0, 267, 1344, 1, 0, 0, 0, 269, 1346, 1, 0, 0, 0, 271, 1348, 1, 0, 0, 0, 273, 1350, 1, 0, 0, 0, 275, 1352, 1, 0, 0, 0, 277, 1354, 1, 0, 0, 0, 279, 1356, 1, 0, 0, 0, 281, 1358, 1, 0, 0, 0, 283, 1360, 1, 0, 0, 0, 285, 1362, 1, 0, 0, 0, 287, 1364, 1, 0, 0, 0, 289, 1366, 1, 0, 0, 0, 291, 1368, 1, 0, 0, 0, 293, 1371, 1, 0, 0, 0, 295, 1379, 1, 0, 0, 0, 297, 1410, 1, 0, 0, 0, 299, 1417, 1, 0, 0, 0, 301, 1427, 1, 0, 0, 0, 303, 1437, 1, 0, 0, 0, 305, 1439, 1, 0, 0, 0, 307, 1450, 1, 0, 0, 0, 309, 1465, 1, 0, 0, 0, 311, 312, 5, 101, 0, 0, 312, 313, 5, 100, 0, 0, 313, 314, 5, 105, 0, 0, 314, 315, 5, 116, 0, 0, 315, 2, 1, 0, 0, 0, 316, 317, 5, 99, 0, 0, 317, 318, 5, 111, 0, 0, 318, 319, 5, 109, 0, 0, 319, 320, 5, 112, 0, 0, 320, 321, 5, 111, 0, 0, 321, 322, 5, 110, 0, 0, 322, 323, 5, 101, 0, 0, 323, 324, 5, 110, 0, 0, 324, 325, 5, 116, 0, 0, 325, 4, 1, 0, 0, 0, 326, 327, 5, 112, 0, 0, 327, 328, 5, 114, 0, 0, 328, 329, 5, 101, 0, 0, 329, 330, 5, 115, 0, 0, 330, 331, 5, 101, 0, 0, 331, 332, 5, 110, 0, 0, 332, 333, 5, 116, 0, 0, 333, 334, 5, 97, 0, 0, 334, 335, 5, 116, 0, 0, 335, 336, 5, 105, 0, 0, 336, 337, 5, 111, 0, 0, 337, 338, 5, 110, 0, 0, 338, 6, 1, 0, 0, 0, 339, 340, 5, 115, 0, 0, 340, 341, 5, 117, 0, 0, 341, 342, 5, 98, 0, 0, 342, 343, 5, 106, 0, 0, 343, 344, 5, 101, 0, 0, 344, 345, 5, 99, 0, 0, 345, 346, 5, 116, 0, 0, 346, 8, 1, 0, 0, 0, 347, 348, 5, 114, 0, 0, 348, 349, 5, 117, 0, 0, 349, 350, 5, 110, 0, 0, 350, 351, 5, 116, 0, 0, 351, 352, 5, 105, 0, 0, 352, 353, 5, 109, 0, 0, 353, 354, 5, 101, 0, 0, 354, 10, 1, 0, 0, 0, 355, 356, 5, 102, 0, 0, 356, 357, 5, 111, 0, 0, 357, 358, 5, 114, 0, 0, 358, 12, 1, 0, 0, 0, 359, 360, 5, 99, 0, 0, 360, 361, 5, 114, 0, 0, 361, 362, 5, 101, 0, 0, 362, 363, 5, 97, 0, 0, 363, 364, 5, 116, 0, 0, 364, 365, 5, 105, 0, 0, 365, 366, 5, 111, 0, 0, 366, 367, 5, 110, 0, 0, 367, 14, 1, 0, 0, 0, 368, 369, 5, 105, 0, 0, 369, 370, 5, 110, 0, 0, 370, 371, 5, 105, 0, 0, 371, 372, 5, 116, 0, 0, 372, 373, 5, 105, 0, 0, 373, 374, 5, 97, 0, 0, 374, 375, 5, 108, 0, 0, 375, 376, 5, 105, 0, 0, 376, 377, 5, 122, 0, 0, 377, 378, 5, 101, 0, 0, 378, 16, 1, 0, 0, 0, 379, 380, 5, 119, 0, 0, 380, 381, 5, 111, 0, 0, 381, 382, 5, 114, 0, 0, 382, 383, 5, 107, 0, 0, 383, 384, 5, 115, 0, 0, 384, 385, 5, 112, 0, 0, 385, 386, 5, 97, 0, 0, 386, 387, 5, 99, 0, 0, 387, 388, 5, 101, 0, 0, 388, 18, 1, 0, 0, 0, 389, 390, 5, 101, 0, 0, 390, 391, 5, 120, 0, 0, 391, 392, 5, 101, 0, 0, 392, 393, 5, 99, 0, 0, 393, 394, 5, 117, 0, 0, 394, 395, 5, 116, 0, 0, 395, 396, 5, 105, 0, 0, 396, 397, 5, 111, 0, 0, 397, 398, 5, 110, 0, 0, 398, 20, 1, 0, 0, 0, 399, 400, 5, 115, 0, 0, 400, 401, 5, 110, 0, 0, 401, 402, 5, 97, 0, 0, 402, 403, 5, 112, 0, 0, 403, 404, 5, 115, 0, 0, 404, 405, 5, 104, 0, 0, 405, 406, 5, 111, 0, 0, 406, 407, 5, 116, 0, 0, 407, 22, 1, 0, 0, 0, 408, 409, 5, 116, 0, 0, 409, 410, 5, 114, 0, 0, 410, 411, 5, 97, 0, 0, 411, 412, 5, 110, 0, 0, 412, 413, 5, 115, 0, 0, 413, 414, 5, 97, 0, 0, 414, 415, 5, 99, 0, 0, 415, 416, 5, 116, 0, 0, 416, 417, 5, 105, 0, 0, 417, 418, 5, 111, 0, 0, 418, 419, 5, 110, 0, 0, 419, 24, 1, 0, 0, 0, 420, 421, 5, 114, 0, 0, 421, 422, 5, 101, 0, 0, 422, 423, 5, 109, 0, 0, 423, 424, 5, 111, 0, 0, 424, 425, 5, 116, 0, 0, 425, 426, 5, 101, 0, 0, 426, 26, 1, 0, 0, 0, 427, 428, 5, 116, 0, 0, 428, 429, 5, 97, 0, 0, 429, 430, 5, 114, 0, 0, 430, 431, 5, 103, 0, 0, 431, 432, 5, 101, 0, 0, 432, 433, 5, 116, 0, 0, 433, 434, 5, 115, 0, 0, 434, 28, 1, 0, 0, 0, 435, 436, 5, 112, 0, 0, 436, 437, 5, 111, 0, 0, 437, 438, 5, 114, 0, 0, 438, 439, 5, 116, 0, 0, 439, 440, 5, 97, 0, 0, 440, 441, 5, 98, 0, 0, 441, 442, 5, 108, 0, 0, 442, 443, 5, 101, 0, 0, 443, 30, 1, 0, 0, 0, 444, 445, 5, 114, 0, 0, 445, 446, 5, 101, 0, 0, 446, 447, 5, 112, 0, 0, 447, 448, 5, 108, 0, 0, 448, 449, 5, 105, 0, 0, 449, 450, 5, 99, 0, 0, 450, 451, 5, 97, 0, 0, 451, 32, 1, 0, 0, 0, 452, 453, 5, 108, 0, 0, 453, 454, 5, 111, 0, 0, 454, 455, 5, 99, 0, 0, 455, 456, 5, 97, 0, 0, 456, 457, 5, 108, 0, 0, 457, 34, 1, 0, 0, 0, 458, 459, 5, 102, 0, 0, 459, 460, 5, 114, 0, 0, 460, 461, 5, 111, 0, 0, 461, 462, 5, 109, 0, 0, 462, 36, 1, 0, 0, 0, 463, 464, 5, 114, 0, 0, 464, 465, 5, 101, 0, 0, 465, 466, 5, 115, 0, 0, 466, 467, 5, 117, 0, 0, 467, 468, 5, 108, 0, 0, 468, 469, 5, 116, 0, 0, 469, 470, 5, 45, 0, 0, 470, 471, 5, 98, 0, 0, 471, 472, 5, 121, 0, 0, 472, 473, 5, 116, 0, 0, 473, 474, 5, 101, 0, 0, 474, 475, 5, 115, 0, 0, 475, 38, 1, 0, 0, 0, 476, 477, 5, 114, 0, 0, 477, 478, 5, 112, 0, 0, 478, 479, 5, 99, 0, 0, 479, 480, 5, 45, 0, 0, 480, 481, 5, 99, 0, 0, 481, 482, 5, 97, 0, 0, 482, 483, 5, 108, 0, 0, 483, 484, 5, 108, 0, 0, 484, 485, 5, 115, 0, 0, 485, 40, 1, 0, 0, 0, 486, 487, 5, 100, 0, 0, 487, 488, 5, 101, 0, 0, 488, 489, 5, 97, 0, 0, 489, 490, 5, 100, 0, 0, 490, 491, 5, 108, 0, 0, 491, 492, 5, 105, 0, 0, 492, 493, 5, 110, 0, 0, 493, 494, 5, 101, 0, 0, 494, 495, 5, 45, 0, 0, 495, 496, 5, 109, 0, 0, 496, 497, 5, 115, 0, 0, 497, 42, 1, 0, 0, 0, 498, 499, 5, 113, 0, 0, 499, 500, 5, 117, 0, 0, 500, 501, 5, 101, 0, 0, 501, 502, 5, 114, 0, 0, 502, 503, 5, 121, 0, 0, 503, 44, 1, 0, 0, 0, 504, 505, 5, 114, 0, 0, 505, 506, 5, 101, 0, 0, 506, 507, 5, 102, 0, 0, 507, 508, 5, 108, 0, 0, 508, 509, 5, 101, 0, 0, 509, 510, 5, 99, 0, 0, 510, 511, 5, 116, 0, 0, 511, 512, 5, 105, 0, 0, 512, 513, 5, 111, 0, 0, 513, 514, 5, 110, 0, 0, 514, 46, 1, 0, 0, 0, 515, 516, 5, 115, 0, 0, 516, 517, 5, 112, 0, 0, 517, 518, 5, 101, 0, 0, 518, 519, 5, 99, 0, 0, 519, 520, 5, 105, 0, 0, 520, 521, 5, 97, 0, 0, 521, 522, 5, 108, 0, 0, 522, 523, 5, 105, 0, 0, 523, 524, 5, 122, 0, 0, 524, 525, 5, 101, 0, 0, 525, 48, 1, 0, 0, 0, 526, 527, 5, 114, 0, 0, 527, 528, 5, 111, 0, 0, 528, 529, 5, 111, 0, 0, 529, 530, 5, 116, 0, 0, 530, 50, 1, 0, 0, 0, 531, 532, 5, 100, 0, 0, 532, 533, 5, 111, 0, 0, 533, 534, 5, 99, 0, 0, 534, 535, 5, 117, 0, 0, 535, 536, 5, 109, 0, 0, 536, 537, 5, 101, 0, 0, 537, 538, 5, 110, 0, 0, 538, 539, 5, 116, 0, 0, 539, 52, 1, 0, 0, 0, 540, 541, 5, 102, 0, 0, 541, 542, 5, 114, 0, 0, 542, 543, 5, 97, 0, 0, 543, 544, 5, 103, 0, 0, 544, 545, 5, 109, 0, 0, 545, 546, 5, 101, 0, 0, 546, 547, 5, 110, 0, 0, 547, 548, 5, 116, 0, 0, 548, 549, 5, 115, 0, 0, 549, 54, 1, 0, 0, 0, 550, 551, 5, 118, 0, 0, 551, 552, 5, 105, 0, 0, 552, 553, 5, 101, 0, 0, 553, 554, 5, 119, 0, 0, 554, 56, 1, 0, 0, 0, 555, 556, 5, 109, 0, 0, 556, 557, 5, 97, 0, 0, 557, 558, 5, 120, 0, 0, 558, 58, 1, 0, 0, 0, 559, 560, 5, 97, 0, 0, 560, 561, 5, 108, 0, 0, 561, 562, 5, 108, 0, 0, 562, 563, 5, 111, 0, 0, 563, 564, 5, 119, 0, 0, 564, 60, 1, 0, 0, 0, 565, 566, 5, 112, 0, 0, 566, 567, 5, 111, 0, 0, 567, 568, 5, 108, 0, 0, 568, 569, 5, 108, 0, 0, 569, 62, 1, 0, 0, 0, 570, 571, 5, 113, 0, 0, 571, 572, 5, 117, 0, 0, 572, 573, 5, 101, 0, 0, 573, 574, 5, 114, 0, 0, 574, 575, 5, 121, 0, 0, 575, 576, 5, 97, 0, 0, 576, 577, 5, 98, 0, 0, 577, 578, 5, 108, 0, 0, 578, 579, 5, 101, 0, 0, 579, 64, 1, 0, 0, 0, 580, 581, 5, 114, 0, 0, 581, 582, 5, 112, 0, 0, 582, 583, 5, 99, 0, 0, 583, 66, 1, 0, 0, 0, 584, 585, 5, 113, 0, 0, 585, 586, 5, 117, 0, 0, 586, 587, 5, 101, 0, 0, 587, 588, 5, 114, 0, 0, 588, 589, 5, 121, 0, 0, 589, 590, 5, 45, 0, 0, 590, 591, 5, 114, 0, 0, 591, 592, 5, 101, 0, 0, 592, 593, 5, 97, 0, 0, 593, 594, 5, 115, 0, 0, 594, 595, 5, 111, 0, 0, 595, 596, 5, 110, 0, 0, 596, 68, 1, 0, 0, 0, 597, 598, 5, 116, 0, 0, 598, 599, 5, 121, 0, 0, 599, 600, 5, 112, 0, 0, 600, 601, 5, 101, 0, 0, 601, 70, 1, 0, 0, 0, 602, 603, 5, 111, 0, 0, 603, 604, 5, 98, 0, 0, 604, 605, 5, 106, 0, 0, 605, 606, 5, 101, 0, 0, 606, 607, 5, 99, 0, 0, 607, 608, 5, 116, 0, 0, 608, 72, 1, 0, 0, 0, 609, 610, 5, 115, 0, 0, 610, 611, 5, 116, 0, 0, 611, 612, 5, 111, 0, 0, 612, 613, 5, 114, 0, 0, 613, 614, 5, 97, 0, 0, 614, 615, 5, 98, 0, 0, 615, 616, 5, 108, 0, 0, 616, 617, 5, 101, 0, 0, 617, 74, 1, 0, 0, 0, 618, 619, 5, 105, 0, 0, 619, 620, 5, 109, 0, 0, 620, 621, 5, 112, 0, 0, 621, 622, 5, 108, 0, 0, 622, 623, 5, 101, 0, 0, 623, 624, 5, 109, 0, 0, 624, 625, 5, 101, 0, 0, 625, 626, 5, 110, 0, 0, 626, 627, 5, 116, 0, 0, 627, 628, 5, 115, 0, 0, 628, 76, 1, 0, 0, 0, 629, 630, 5, 114, 0, 0, 630, 631, 5, 101, 0, 0, 631, 632, 5, 102, 0, 0, 632, 78, 1, 0, 0, 0, 633, 634, 5, 102, 0, 0, 634, 635, 5, 114, 0, 0, 635, 636, 5, 97, 0, 0, 636, 637, 5, 103, 0, 0, 637, 638, 5, 109, 0, 0, 638, 639, 5, 101, 0, 0, 639, 640, 5, 110, 0, 0, 640, 641, 5, 116, 0, 0, 641, 80, 1, 0, 0, 0, 642, 643, 5, 105, 0, 0, 643, 644, 5, 109, 0, 0, 644, 645, 5, 112, 0, 0, 645, 646, 5, 111, 0, 0, 646, 647, 5, 114, 0, 0, 647, 648, 5, 116, 0, 0, 648, 82, 1, 0, 0, 0, 649, 650, 5, 101, 0, 0, 650, 651, 5, 120, 0, 0, 651, 652, 5, 116, 0, 0, 652, 653, 5, 101, 0, 0, 653, 654, 5, 114, 0, 0, 654, 655, 5, 110, 0, 0, 655, 656, 5, 97, 0, 0, 656, 657, 5, 108, 0, 0, 657, 84, 1, 0, 0, 0, 658, 659, 5, 97, 0, 0, 659, 660, 5, 116, 0, 0, 660, 661, 5, 111, 0, 0, 661, 662, 5, 109, 0, 0, 662, 86, 1, 0, 0, 0, 663, 664, 5, 105, 0, 0, 664, 665, 5, 110, 0, 0, 665, 666, 5, 116, 0, 0, 666, 667, 5, 101, 0, 0, 667, 668, 5, 114, 0, 0, 668, 669, 5, 102, 0, 0, 669, 670, 5, 97, 0, 0, 670, 671, 5, 99, 0, 0, 671, 672, 5, 101, 0, 0, 672, 88, 1, 0, 0, 0, 673, 674, 5, 105, 0, 0, 674, 675, 5, 110, 0, 0, 675, 676, 5, 116, 0, 0, 676, 677, 5, 101, 0, 0, 677, 678, 5, 114, 0, 0, 678, 679, 5, 102, 0, 0, 679, 680, 5, 97, 0, 0, 680, 681, 5, 99, 0, 0, 681, 682, 5, 101, 0, 0, 682, 683, 5, 115, 0, 0, 683, 90, 1, 0, 0, 0, 684, 685, 5, 112, 0, 0, 685, 686, 5, 97, 0, 0, 686, 687, 5, 99, 0, 0, 687, 688, 5, 107, 0, 0, 688, 689, 5, 97, 0, 0, 689, 690, 5, 103, 0, 0, 690, 691, 5, 101, 0, 0, 691, 92, 1, 0, 0, 0, 692, 693, 5, 118, 0, 0, 693, 694, 5, 97, 0, 0, 694, 695, 5, 108, 0, 0, 695, 696, 5, 117, 0, 0, 696, 697, 5, 101, 0, 0, 697, 94, 1, 0, 0, 0, 698, 699, 5, 114, 0, 0, 699, 700, 5, 101, 0, 0, 700, 701, 5, 108, 0, 0, 701, 702, 5, 97, 0, 0, 702, 703, 5, 116, 0, 0, 703, 704, 5, 105, 0, 0, 704, 705, 5, 111, 0, 0, 705, 706, 5, 110, 0, 0, 706, 96, 1, 0, 0, 0, 707, 708, 5, 111, 0, 0, 708, 709, 5, 112, 0, 0, 709, 710, 5, 101, 0, 0, 710, 711, 5, 114, 0, 0, 711, 712, 5, 97, 0, 0, 712, 713, 5, 116, 0, 0, 713, 714, 5, 105, 0, 0, 714, 715, 5, 111, 0, 0, 715, 716, 5, 110, 0, 0, 716, 98, 1, 0, 0, 0, 717, 718, 5, 102, 0, 0, 718, 719, 5, 117, 0, 0, 719, 720, 5, 110, 0, 0, 720, 721, 5, 99, 0, 0, 721, 722, 5, 116, 0, 0, 722, 723, 5, 105, 0, 0, 723, 724, 5, 111, 0, 0, 724, 725, 5, 110, 0, 0, 725, 100, 1, 0, 0, 0, 726, 727, 5, 99, 0, 0, 727, 728, 5, 111, 0, 0, 728, 729, 5, 110, 0, 0, 729, 730, 5, 115, 0, 0, 730, 731, 5, 116, 0, 0, 731, 732, 5, 114, 0, 0, 732, 733, 5, 117, 0, 0, 733, 734, 5, 99, 0, 0, 734, 735, 5, 116, 0, 0, 735, 736, 5, 111, 0, 0, 736, 737, 5, 114, 0, 0, 737, 102, 1, 0, 0, 0, 738, 739, 5, 99, 0, 0, 739, 740, 5, 111, 0, 0, 740, 741, 5, 110, 0, 0, 741, 742, 5, 115, 0, 0, 742, 743, 5, 116, 0, 0, 743, 744, 5, 114, 0, 0, 744, 745, 5, 117, 0, 0, 745, 746, 5, 99, 0, 0, 746, 747, 5, 116, 0, 0, 747, 748, 5, 115, 0, 0, 748, 104, 1, 0, 0, 0, 749, 750, 5, 105, 0, 0, 750, 751, 5, 110, 0, 0, 751, 752, 5, 112, 0, 0, 752, 753, 5, 117, 0, 0, 753, 754, 5, 116, 0, 0, 754, 106, 1, 0, 0, 0, 755, 756, 5, 99, 0, 0, 756, 757, 5, 111, 0, 0, 757, 758, 5, 110, 0, 0, 758, 759, 5, 102, 0, 0, 759, 760, 5, 111, 0, 0, 760, 761, 5, 114, 0, 0, 761, 762, 5, 109, 0, 0, 762, 108, 1, 0, 0, 0, 763, 764, 5, 97, 0, 0, 764, 765, 5, 115, 0, 0, 765, 110, 1, 0, 0, 0, 766, 767, 5, 98, 0, 0, 767, 768, 5, 105, 0, 0, 768, 769, 5, 110, 0, 0, 769, 770, 5, 100, 0, 0, 770, 112, 1, 0, 0, 0, 771, 772, 5, 115, 0, 0, 772, 773, 5, 116, 0, 0, 773, 774, 5, 97, 0, 0, 774, 775, 5, 116, 0, 0, 775, 776, 5, 105, 0, 0, 776, 777, 5, 99, 0, 0, 777, 114, 1, 0, 0, 0, 778, 779, 5, 116, 0, 0, 779, 780, 5, 111, 0, 0, 780, 116, 1, 0, 0, 0, 781, 782, 5, 112, 0, 0, 782, 783, 5, 114, 0, 0, 783, 784, 5, 105, 0, 0, 784, 785, 5, 118, 0, 0, 785, 786, 5, 97, 0, 0, 786, 787, 5, 116, 0, 0, 787, 788, 5, 101, 0, 0, 788, 118, 1, 0, 0, 0, 789, 790, 5, 115, 0, 0, 790, 791, 5, 104, 0, 0, 791, 792, 5, 97, 0, 0, 792, 793, 5, 114, 0, 0, 793, 794, 5, 101, 0, 0, 794, 795, 5, 100, 0, 0, 795, 120, 1, 0, 0, 0, 796, 797, 5, 115, 0, 0, 797, 798, 5, 116, 0, 0, 798, 799, 5, 97, 0, 0, 799, 800, 5, 116, 0, 0, 800, 801, 5, 101, 0, 0, 801, 122, 1, 0, 0, 0, 802, 803, 5, 101, 0, 0, 803, 804, 5, 100, 0, 0, 804, 805, 5, 103, 0, 0, 805, 806, 5, 101, 0, 0, 806, 124, 1, 0, 0, 0, 807, 808, 5, 112, 0, 0, 808, 809, 5, 114, 0, 0, 809, 810, 5, 111, 0, 0, 810, 811, 5, 106, 0, 0, 811, 812, 5, 101, 0, 0, 812, 813, 5, 99, 0, 0, 813, 814, 5, 116, 0, 0, 814, 815, 5, 105, 0, 0, 815, 816, 5, 111, 0, 0, 816, 817, 5, 110, 0, 0, 817, 126, 1, 0, 0, 0, 818, 819, 5, 119, 0, 0, 819, 820, 5, 105, 0, 0, 820, 821, 5, 116, 0, 0, 821, 822, 5, 104, 0, 0, 822, 128, 1, 0, 0, 0, 823, 824, 5, 117, 0, 0, 824, 825, 5, 115, 0, 0, 825, 826, 5, 105, 0, 0, 826, 827, 5, 110, 0, 0, 827, 828, 5, 103, 0, 0, 828, 130, 1, 0, 0, 0, 829, 830, 5, 97, 0, 0, 830, 831, 5, 99, 0, 0, 831, 832, 5, 99, 0, 0, 832, 833, 5, 101, 0, 0, 833, 834, 5, 112, 0, 0, 834, 835, 5, 116, 0, 0, 835, 132, 1, 0, 0, 0, 836, 837, 5, 118, 0, 0, 837, 838, 5, 105, 0, 0, 838, 839, 5, 97, 0, 0, 839, 134, 1, 0, 0, 0, 840, 841, 5, 109, 0, 0, 841, 842, 5, 97, 0, 0, 842, 843, 5, 116, 0, 0, 843, 844, 5, 101, 0, 0, 844, 845, 5, 114, 0, 0, 845, 846, 5, 105, 0, 0, 846, 847, 5, 97, 0, 0, 847, 848, 5, 108, 0, 0, 848, 849, 5, 105, 0, 0, 849, 850, 5, 122, 0, 0, 850, 851, 5, 101, 0, 0, 851, 136, 1, 0, 0, 0, 852, 853, 5, 105, 0, 0, 853, 854, 5, 102, 0, 0, 854, 138, 1, 0, 0, 0, 855, 856, 5, 97, 0, 0, 856, 857, 5, 98, 0, 0, 857, 858, 5, 115, 0, 0, 858, 859, 5, 101, 0, 0, 859, 860, 5, 110, 0, 0, 860, 861, 5, 116, 0, 0, 861, 140, 1, 0, 0, 0, 862, 863, 5, 111, 0, 0, 863, 864, 5, 110, 0, 0, 864, 142, 1, 0, 0, 0, 865, 866, 5, 112, 0, 0, 866, 867, 5, 111, 0, 0, 867, 868, 5, 108, 0, 0, 868, 869, 5, 105, 0, 0, 869, 870, 5, 99, 0, 0, 870, 871, 5, 121, 0, 0, 871, 144, 1, 0, 0, 0, 872, 873, 5, 100, 0, 0, 873, 874, 5, 101, 0, 0, 874, 875, 5, 102, 0, 0, 875, 876, 5, 97, 0, 0, 876, 877, 5, 117, 0, 0, 877, 878, 5, 108, 0, 0, 878, 879, 5, 116, 0, 0, 879, 146, 1, 0, 0, 0, 880, 881, 5, 115, 0, 0, 881, 882, 5, 111, 0, 0, 882, 883, 5, 117, 0, 0, 883, 884, 5, 114, 0, 0, 884, 885, 5, 99, 0, 0, 885, 886, 5, 101, 0, 0, 886, 148, 1, 0, 0, 0, 887, 888, 5, 114, 0, 0, 888, 889, 5, 101, 0, 0, 889, 890, 5, 112, 0, 0, 890, 891, 5, 111, 0, 0, 891, 892, 5, 115, 0, 0, 892, 893, 5, 105, 0, 0, 893, 894, 5, 116, 0, 0, 894, 895, 5, 111, 0, 0, 895, 896, 5, 114, 0, 0, 896, 897, 5, 121, 0, 0, 897, 150, 1, 0, 0, 0, 898, 899, 5, 99, 0, 0, 899, 900, 5, 111, 0, 0, 900, 901, 5, 109, 0, 0, 901, 902, 5, 109, 0, 0, 902, 903, 5, 105, 0, 0, 903, 904, 5, 116, 0, 0, 904, 152, 1, 0, 0, 0, 905, 906, 5, 114, 0, 0, 906, 907, 5, 101, 0, 0, 907, 908, 5, 118, 0, 0, 908, 909, 5, 105, 0, 0, 909, 910, 5, 115, 0, 0, 910, 911, 5, 105, 0, 0, 911, 912, 5, 111, 0, 0, 912, 913, 5, 110, 0, 0, 913, 154, 1, 0, 0, 0, 914, 915, 5, 115, 0, 0, 915, 916, 5, 101, 0, 0, 916, 917, 5, 109, 0, 0, 917, 918, 5, 97, 0, 0, 918, 919, 5, 110, 0, 0, 919, 920, 5, 116, 0, 0, 920, 921, 5, 105, 0, 0, 921, 922, 5, 99, 0, 0, 922, 923, 5, 45, 0, 0, 923, 924, 5, 109, 0, 0, 924, 925, 5, 97, 0, 0, 925, 926, 5, 106, 0, 0, 926, 927, 5, 111, 0, 0, 927, 928, 5, 114, 0, 0, 928, 156, 1, 0, 0, 0, 929, 930, 5, 111, 0, 0, 930, 931, 5, 110, 0, 0, 931, 932, 5, 45, 0, 0, 932, 933, 5, 100, 0, 0, 933, 934, 5, 101, 0, 0, 934, 935, 5, 108, 0, 0, 935, 936, 5, 101, 0, 0, 936, 937, 5, 116, 0, 0, 937, 938, 5, 101, 0, 0, 938, 158, 1, 0, 0, 0, 939, 940, 5, 108, 0, 0, 940, 941, 5, 105, 0, 0, 941, 942, 5, 102, 0, 0, 942, 943, 5, 101, 0, 0, 943, 944, 5, 99, 0, 0, 944, 945, 5, 121, 0, 0, 945, 946, 5, 99, 0, 0, 946, 947, 5, 108, 0, 0, 947, 948, 5, 101, 0, 0, 948, 160, 1, 0, 0, 0, 949, 950, 5, 114, 0, 0, 950, 951, 5, 101, 0, 0, 951, 952, 5, 116, 0, 0, 952, 953, 5, 97, 0, 0, 953, 954, 5, 105, 0, 0, 954, 955, 5, 110, 0, 0, 955, 956, 5, 45, 0, 0, 956, 957, 5, 111, 0, 0, 957, 958, 5, 116, 0, 0, 958, 959, 5, 104, 0, 0, 959, 960, 5, 101, 0, 0, 960, 961, 5, 114, 0, 0, 961, 162, 1, 0, 0, 0, 962, 963, 5, 107, 0, 0, 963, 964, 5, 101, 0, 0, 964, 965, 5, 121, 0, 0, 965, 966, 5, 101, 0, 0, 966, 967, 5, 100, 0, 0, 967, 164, 1, 0, 0, 0, 968, 969, 5, 112, 0, 0, 969, 970, 5, 117, 0, 0, 970, 971, 5, 98, 0, 0, 971, 972, 5, 108, 0, 0, 972, 973, 5, 105, 0, 0, 973, 974, 5, 99, 0, 0, 974, 975, 5, 45, 0, 0, 975, 976, 5, 116, 0, 0, 976, 977, 5, 114, 0, 0, 977, 978, 5, 97, 0, 0, 978, 979, 5, 118, 0, 0, 979, 980, 5, 101, 0, 0, 980, 981, 5, 114, 0, 0, 981, 982, 5, 115, 0, 0, 982, 983, 5, 97, 0, 0, 983, 984, 5, 108, 0, 0, 984, 166, 1, 0, 0, 0, 985, 986, 5, 105, 0, 0, 986, 987, 5, 100, 0, 0, 987, 168, 1, 0, 0, 0, 988, 989, 5, 100, 0, 0, 989, 990, 5, 111, 0, 0, 990, 991, 5, 99, 0, 0, 991, 170, 1, 0, 0, 0, 992, 993, 5, 109, 0, 0, 993, 994, 5, 111, 0, 0, 994, 995, 5, 100, 0, 0, 995, 996, 5, 101, 0, 0, 996, 172, 1, 0, 0, 0, 997, 998, 5, 101, 0, 0, 998, 999, 5, 109, 0, 0, 999, 1000, 5, 105, 0, 0, 1000, 1001, 5, 116, 0, 0, 1001, 1002, 5, 115, 0, 0, 1002, 174, 1, 0, 0, 0, 1003, 1004, 5, 114, 0, 0, 1004, 1005, 5, 101, 0, 0, 1005, 1006, 5, 99, 0, 0, 1006, 1007, 5, 101, 0, 0, 1007, 1008, 5, 105, 0, 0, 1008, 1009, 5, 118, 0, 0, 1009, 1010, 5, 101, 0, 0, 1010, 1011, 5, 114, 0, 0, 1011, 176, 1, 0, 0, 0, 1012, 1013, 5, 114, 0, 0, 1013, 1014, 5, 101, 0, 0, 1014, 1015, 5, 113, 0, 0, 1015, 1016, 5, 117, 0, 0, 1016, 1017, 5, 105, 0, 0, 1017, 1018, 5, 114, 0, 0, 1018, 1019, 5, 101, 0, 0, 1019, 1020, 5, 115, 0, 0, 1020, 178, 1, 0, 0, 0, 1021, 1022, 5, 97, 0, 0, 1022, 1023, 5, 110, 0, 0, 1023, 1024, 5, 121, 0, 0, 1024, 180, 1, 0, 0, 0, 1025, 1026, 5, 103, 0, 0, 1026, 1027, 5, 101, 0, 0, 1027, 1028, 5, 116, 0, 0, 1028, 182, 1, 0, 0, 0, 1029, 1030, 5, 115, 0, 0, 1030, 1031, 5, 101, 0, 0, 1031, 1032, 5, 116, 0, 0, 1032, 184, 1, 0, 0, 0, 1033, 1034, 5, 119, 0, 0, 1034, 1035, 5, 97, 0, 0, 1035, 1036, 5, 116, 0, 0, 1036, 1037, 5, 99, 0, 0, 1037, 1038, 5, 104, 0, 0, 1038, 186, 1, 0, 0, 0, 1039, 1040, 5, 115, 0, 0, 1040, 1041, 5, 116, 0, 0, 1041, 1042, 5, 97, 0, 0, 1042, 1043, 5, 114, 0, 0, 1043, 1044, 5, 116, 0, 0, 1044, 188, 1, 0, 0, 0, 1045, 1046, 5, 115, 0, 0, 1046, 1047, 5, 116, 0, 0, 1047, 1048, 5, 111, 0, 0, 1048, 1049, 5, 112, 0, 0, 1049, 190, 1, 0, 0, 0, 1050, 1051, 5, 114, 0, 0, 1051, 1052, 5, 101, 0, 0, 1052, 1053, 5, 97, 0, 0, 1053, 1054, 5, 100, 0, 0, 1054, 192, 1, 0, 0, 0, 1055, 1056, 5, 119, 0, 0, 1056, 1057, 5, 114, 0, 0, 1057, 1058, 5, 105, 0, 0, 1058, 1059, 5, 116, 0, 0, 1059, 1060, 5, 101, 0, 0, 1060, 194, 1, 0, 0, 0, 1061, 1062, 5, 114, 0, 0, 1062, 1063, 5, 101, 0, 0, 1063, 1064, 5, 115, 0, 0, 1064, 1065, 5, 111, 0, 0, 1065, 1066, 5, 108, 0, 0, 1066, 1067, 5, 118, 0, 0, 1067, 1068, 5, 101, 0, 0, 1068, 196, 1, 0, 0, 0, 1069, 1070, 5, 99, 0, 0, 1070, 1071, 5, 111, 0, 0, 1071, 1072, 5, 110, 0, 0, 1072, 1073, 5, 110, 0, 0, 1073, 1074, 5, 101, 0, 0, 1074, 1075, 5, 99, 0, 0, 1075, 1076, 5, 116, 0, 0, 1076, 198, 1, 0, 0, 0, 1077, 1078, 5, 100, 0, 0, 1078, 1079, 5, 105, 0, 0, 1079, 1080, 5, 115, 0, 0, 1080, 1081, 5, 99, 0, 0, 1081, 1082, 5, 111, 0, 0, 1082, 1083, 5, 110, 0, 0, 1083, 1084, 5, 110, 0, 0, 1084, 1085, 5, 101, 0, 0, 1085, 1086, 5, 99, 0, 0, 1086, 1087, 5, 116, 0, 0, 1087, 200, 1, 0, 0, 0, 1088, 1089, 5, 99, 0, 0, 1089, 1090, 5, 97, 0, 0, 1090, 1091, 5, 108, 0, 0, 1091, 1092, 5, 108, 0, 0, 1092, 202, 1, 0, 0, 0, 1093, 1094, 5, 119, 0, 0, 1094, 1095, 5, 97, 0, 0, 1095, 1096, 5, 116, 0, 0, 1096, 1097, 5, 99, 0, 0, 1097, 1098, 5, 104, 0, 0, 1098, 1099, 5, 45, 0, 0, 1099, 1100, 5, 115, 0, 0, 1100, 1101, 5, 116, 0, 0, 1101, 1102, 5, 97, 0, 0, 1102, 1103, 5, 114, 0, 0, 1103, 1104, 5, 116, 0, 0, 1104, 204, 1, 0, 0, 0, 1105, 1106, 5, 119, 0, 0, 1106, 1107, 5, 97, 0, 0, 1107, 1108, 5, 116, 0, 0, 1108, 1109, 5, 99, 0, 0, 1109, 1110, 5, 104, 0, 0, 1110, 1111, 5, 45, 0, 0, 1111, 1112, 5, 115, 0, 0, 1112, 1113, 5, 116, 0, 0, 1113, 1114, 5, 111, 0, 0, 1114, 1115, 5, 112, 0, 0, 1115, 206, 1, 0, 0, 0, 1116, 1117, 5, 115, 0, 0, 1117, 1118, 5, 117, 0, 0, 1118, 1119, 5, 98, 0, 0, 1119, 1120, 5, 115, 0, 0, 1120, 1121, 5, 99, 0, 0, 1121, 1122, 5, 114, 0, 0, 1122, 1123, 5, 105, 0, 0, 1123, 1124, 5, 98, 0, 0, 1124, 1125, 5, 101, 0, 0, 1125, 208, 1, 0, 0, 0, 1126, 1127, 5, 117, 0, 0, 1127, 1128, 5, 110, 0, 0, 1128, 1129, 5, 115, 0, 0, 1129, 1130, 5, 117, 0, 0, 1130, 1131, 5, 98, 0, 0, 1131, 1132, 5, 115, 0, 0, 1132, 1133, 5, 99, 0, 0, 1133, 1134, 5, 114, 0, 0, 1134, 1135, 5, 105, 0, 0, 1135, 1136, 5, 98, 0, 0, 1136, 1137, 5, 101, 0, 0, 1137, 210, 1, 0, 0, 0, 1138, 1139, 5, 114, 0, 0, 1139, 1140, 5, 101, 0, 0, 1140, 1141, 5, 103, 0, 0, 1141, 1142, 5, 105, 0, 0, 1142, 1143, 5, 115, 0, 0, 1143, 1144, 5, 116, 0, 0, 1144, 1145, 5, 101, 0, 0, 1145, 1146, 5, 114, 0, 0, 1146, 212, 1, 0, 0, 0, 1147, 1148, 5, 99, 0, 0, 1148, 1149, 5, 114, 0, 0, 1149, 1150, 5, 100, 0, 0, 1150, 1151, 5, 116, 0, 0, 1151, 214, 1, 0, 0, 0, 1152, 1153, 5, 111, 0, 0, 1153, 1154, 5, 112, 0, 0, 1154, 1155, 5, 116, 0, 0, 1155, 1156, 5, 105, 0, 0, 1156, 1157, 5, 111, 0, 0, 1157, 1158, 5, 110, 0, 0, 1158, 1159, 5, 97, 0, 0, 1159, 1160, 5, 108, 0, 0, 1160, 1161, 5, 45, 0, 0, 1161, 1162, 5, 111, 0, 0, 1162, 1163, 5, 110, 0, 0, 1163, 1164, 5, 101, 0, 0, 1164, 216, 1, 0, 0, 0, 1165, 1166, 5, 101, 0, 0, 1166, 1167, 5, 120, 0, 0, 1167, 1168, 5, 97, 0, 0, 1168, 1169, 5, 99, 0, 0, 1169, 1170, 5, 116, 0, 0, 1170, 1171, 5, 108, 0, 0, 1171, 1172, 5, 121, 0, 0, 1172, 1173, 5, 45, 0, 0, 1173, 1174, 5, 111, 0, 0, 1174, 1175, 5, 110, 0, 0, 1175, 1176, 5, 101, 0, 0, 1176, 218, 1, 0, 0, 0, 1177, 1178, 5, 109, 0, 0, 1178, 1179, 5, 97, 0, 0, 1179, 1180, 5, 110, 0, 0, 1180, 1181, 5, 121, 0, 0, 1181, 1182, 5, 45, 0, 0, 1182, 1183, 5, 117, 0, 0, 1183, 1184, 5, 110, 0, 0, 1184, 1185, 5, 105, 0, 0, 1185, 1186, 5, 113, 0, 0, 1186, 1187, 5, 117, 0, 0, 1187, 1188, 5, 101, 0, 0, 1188, 220, 1, 0, 0, 0, 1189, 1190, 5, 109, 0, 0, 1190, 1191, 5, 97, 0, 0, 1191, 1192, 5, 110, 0, 0, 1192, 1193, 5, 121, 0, 0, 1193, 222, 1, 0, 0, 0, 1194, 1195, 5, 111, 0, 0, 1195, 1196, 5, 114, 0, 0, 1196, 1197, 5, 100, 0, 0, 1197, 1198, 5, 101, 0, 0, 1198, 1199, 5, 114, 0, 0, 1199, 1200, 5, 101, 0, 0, 1200, 1201, 5, 100, 0, 0, 1201, 224, 1, 0, 0, 0, 1202, 1203, 5, 117, 0, 0, 1203, 1204, 5, 110, 0, 0, 1204, 1205, 5, 105, 0, 0, 1205, 1206, 5, 116, 0, 0, 1206, 226, 1, 0, 0, 0, 1207, 1208, 5, 119, 0, 0, 1208, 1209, 5, 97, 0, 0, 1209, 1210, 5, 116, 0, 0, 1210, 1211, 5, 99, 0, 0, 1211, 1212, 5, 104, 0, 0, 1212, 1213, 5, 45, 0, 0, 1213, 1214, 5, 104, 0, 0, 1214, 1215, 5, 97, 0, 0, 1215, 1216, 5, 110, 0, 0, 1216, 1217, 5, 100, 0, 0, 1217, 1218, 5, 108, 0, 0, 1218, 1219, 5, 101, 0, 0, 1219, 228, 1, 0, 0, 0, 1220, 1221, 5, 109, 0, 0, 1221, 1222, 5, 101, 0, 0, 1222, 1223, 5, 115, 0, 0, 1223, 1224, 5, 115, 0, 0, 1224, 1225, 5, 97, 0, 0, 1225, 1226, 5, 103, 0, 0, 1226, 1227, 5, 101, 0, 0, 1227, 230, 1, 0, 0, 0, 1228, 1229, 5, 97, 0, 0, 1229, 1230, 5, 116, 0, 0, 1230, 1231, 5, 111, 0, 0, 1231, 1232, 5, 109, 0, 0, 1232, 1233, 5, 45, 0, 0, 1233, 1234, 5, 114, 0, 0, 1234, 1235, 5, 101, 0, 0, 1235, 1236, 5, 102, 0, 0, 1236, 232, 1, 0, 0, 0, 1237, 1238, 5, 105, 0, 0, 1238, 1239, 5, 110, 0, 0, 1239, 1240, 5, 116, 0, 0, 1240, 1241, 5, 101, 0, 0, 1241, 1242, 5, 114, 0, 0, 1242, 1243, 5, 102, 0, 0, 1243, 1244, 5, 97, 0, 0, 1244, 1245, 5, 99, 0, 0, 1245, 1246, 5, 101, 0, 0, 1246, 1247, 5, 45, 0, 0, 1247, 1248, 5, 114, 0, 0, 1248, 1249, 5, 101, 0, 0, 1249, 1250, 5, 102, 0, 0, 1250, 234, 1, 0, 0, 0, 1251, 1252, 5, 111, 0, 0, 1252, 1253, 5, 112, 0, 0, 1253, 1254, 5, 116, 0, 0, 1254, 1255, 5, 105, 0, 0, 1255, 1256, 5, 111, 0, 0, 1256, 1257, 5, 110, 0, 0, 1257, 1258, 5, 97, 0, 0, 1258, 1259, 5, 108, 0, 0, 1259, 236, 1, 0, 0, 0, 1260, 1261, 5, 108, 0, 0, 1261, 1262, 5, 105, 0, 0, 1262, 1263, 5, 115, 0, 0, 1263, 1264, 5, 116, 0, 0, 1264, 238, 1, 0, 0, 0, 1265, 1266, 5, 114, 0, 0, 1266, 1267, 5, 101, 0, 0, 1267, 1268, 5, 99, 0, 0, 1268, 1269, 5, 111, 0, 0, 1269, 1270, 5, 114, 0, 0, 1270, 1271, 5, 100, 0, 0, 1271, 240, 1, 0, 0, 0, 1272, 1273, 5, 98, 0, 0, 1273, 1274, 5, 111, 0, 0, 1274, 1275, 5, 111, 0, 0, 1275, 1276, 5, 108, 0, 0, 1276, 242, 1, 0, 0, 0, 1277, 1278, 5, 98, 0, 0, 1278, 1279, 5, 121, 0, 0, 1279, 1280, 5, 116, 0, 0, 1280, 1281, 5, 101, 0, 0, 1281, 1282, 5, 115, 0, 0, 1282, 244, 1, 0, 0, 0, 1283, 1284, 5, 100, 0, 0, 1284, 1285, 5, 111, 0, 0, 1285, 1286, 5, 117, 0, 0, 1286, 1287, 5, 98, 0, 0, 1287, 1288, 5, 108, 0, 0, 1288, 1289, 5, 101, 0, 0, 1289, 246, 1, 0, 0, 0, 1290, 1291, 5, 105, 0, 0, 1291, 1292, 5, 110, 0, 0, 1292, 1293, 5, 116, 0, 0, 1293, 1294, 5, 51, 0, 0, 1294, 1295, 5, 50, 0, 0, 1295, 248, 1, 0, 0, 0, 1296, 1297, 5, 105, 0, 0, 1297, 1298, 5, 110, 0, 0, 1298, 1299, 5, 116, 0, 0, 1299, 1300, 5, 54, 0, 0, 1300, 1301, 5, 52, 0, 0, 1301, 250, 1, 0, 0, 0, 1302, 1303, 5, 115, 0, 0, 1303, 1304, 5, 116, 0, 0, 1304, 1305, 5, 114, 0, 0, 1305, 1306, 5, 105, 0, 0, 1306, 1307, 5, 110, 0, 0, 1307, 1308, 5, 103, 0, 0, 1308, 252, 1, 0, 0, 0, 1309, 1310, 5, 117, 0, 0, 1310, 1311, 5, 105, 0, 0, 1311, 1312, 5, 110, 0, 0, 1312, 1313, 5, 116, 0, 0, 1313, 1314, 5, 51, 0, 0, 1314, 1315, 5, 50, 0, 0, 1315, 254, 1, 0, 0, 0, 1316, 1317, 5, 117, 0, 0, 1317, 1318, 5, 105, 0, 0, 1318, 1319, 5, 110, 0, 0, 1319, 1320, 5, 116, 0, 0, 1320, 1321, 5, 54, 0, 0, 1321, 1322, 5, 52, 0, 0, 1322, 256, 1, 0, 0, 0, 1323, 1324, 5, 116, 0, 0, 1324, 1325, 5, 114, 0, 0, 1325, 1326, 5, 117, 0, 0, 1326, 1327, 5, 101, 0, 0, 1327, 258, 1, 0, 0, 0, 1328, 1329, 5, 102, 0, 0, 1329, 1330, 5, 97, 0, 0, 1330, 1331, 5, 108, 0, 0, 1331, 1332, 5, 115, 0, 0, 1332, 1333, 5, 101, 0, 0, 1333, 260, 1, 0, 0, 0, 1334, 1335, 5, 110, 0, 0, 1335, 1336, 5, 117, 0, 0, 1336, 1337, 5, 108, 0, 0, 1337, 1338, 5, 108, 0, 0, 1338, 262, 1, 0, 0, 0, 1339, 1340, 5, 45, 0, 0, 1340, 1341, 5, 62, 0, 0, 1341, 264, 1, 0, 0, 0, 1342, 1343, 5, 58, 0, 0, 1343, 266, 1, 0, 0, 0, 1344, 1345, 5, 59, 0, 0, 1345, 268, 1, 0, 0, 0, 1346, 1347, 5, 44, 0, 0, 1347, 270, 1, 0, 0, 0, 1348, 1349, 5, 46, 0, 0, 1349, 272, 1, 0, 0, 0, 1350, 1351, 5, 123, 0, 0, 1351, 274, 1, 0, 0, 0, 1352, 1353, 5, 125, 0, 0, 1353, 276, 1, 0, 0, 0, 1354, 1355, 5, 91, 0, 0, 1355, 278, 1, 0, 0, 0, 1356, 1357, 5, 93, 0, 0, 1357, 280, 1, 0, 0, 0, 1358, 1359, 5, 40, 0, 0, 1359, 282, 1, 0, 0, 0, 1360, 1361, 5, 41, 0, 0, 1361, 284, 1, 0, 0, 0, 1362, 1363, 5, 60, 0, 0, 1363, 286, 1, 0, 0, 0, 1364, 1365, 5, 62, 0, 0, 1365, 288, 1, 0, 0, 0, 1366, 1367, 5, 38, 0, 0, 1367, 290, 1, 0, 0, 0, 1368, 1369, 5, 61, 0, 0, 1369, 292, 1, 0, 0, 0, 1370, 1372, 5, 45, 0, 0, 1371, 1370, 1, 0, 0, 0, 1371, 1372, 1, 0, 0, 0, 1372, 1374, 1, 0, 0, 0, 1373, 1375, 7, 0, 0, 0, 1374, 1373, 1, 0, 0, 0, 1375, 1376, 1, 0, 0, 0, 1376, 1374, 1, 0, 0, 0, 1376, 1377, 1, 0, 0, 0, 1377, 294, 1, 0, 0, 0, 1378, 1380, 5, 45, 0, 0, 1379, 1378, 1, 0, 0, 0, 1379, 1380, 1, 0, 0, 0, 1380, 1389, 1, 0, 0, 0, 1381, 1390, 5, 48, 0, 0, 1382, 1386, 7, 1, 0, 0, 1383, 1385, 7, 0, 0, 0, 1384, 1383, 1, 0, 0, 0, 1385, 1388, 1, 0, 0, 0, 1386, 1384, 1, 0, 0, 0, 1386, 1387, 1, 0, 0, 0, 1387, 1390, 1, 0, 0, 0, 1388, 1386, 1, 0, 0, 0, 1389, 1381, 1, 0, 0, 0, 1389, 1382, 1, 0, 0, 0, 1390, 1397, 1, 0, 0, 0, 1391, 1393, 5, 46, 0, 0, 1392, 1394, 7, 0, 0, 0, 1393, 1392, 1, 0, 0, 0, 1394, 1395, 1, 0, 0, 0, 1395, 1393, 1, 0, 0, 0, 1395, 1396, 1, 0, 0, 0, 1396, 1398, 1, 0, 0, 0, 1397, 1391, 1, 0, 0, 0, 1397, 1398, 1, 0, 0, 0, 1398, 1408, 1, 0, 0, 0, 1399, 1401, 7, 2, 0, 0, 1400, 1402, 7, 3, 0, 0, 1401, 1400, 1, 0, 0, 0, 1401, 1402, 1, 0, 0, 0, 1402, 1404, 1, 0, 0, 0, 1403, 1405, 7, 0, 0, 0, 1404, 1403, 1, 0, 0, 0, 1405, 1406, 1, 0, 0, 0, 1406, 1404, 1, 0, 0, 0, 1406, 1407, 1, 0, 0, 0, 1407, 1409, 1, 0, 0, 0, 1408, 1399, 1, 0, 0, 0, 1408, 1409, 1, 0, 0, 0, 1409, 296, 1, 0, 0, 0, 1410, 1414, 7, 4, 0, 0, 1411, 1413, 7, 5, 0, 0, 1412, 1411, 1, 0, 0, 0, 1413, 1416, 1, 0, 0, 0, 1414, 1412, 1, 0, 0, 0, 1414, 1415, 1, 0, 0, 0, 1415, 298, 1, 0, 0, 0, 1416, 1414, 1, 0, 0, 0, 1417, 1422, 5, 34, 0, 0, 1418, 1421, 3, 301, 150, 0, 1419, 1421, 8, 6, 0, 0, 1420, 1418, 1, 0, 0, 0, 1420, 1419, 1, 0, 0, 0, 1421, 1424, 1, 0, 0, 0, 1422, 1420, 1, 0, 0, 0, 1422, 1423, 1, 0, 0, 0, 1423, 1425, 1, 0, 0, 0, 1424, 1422, 1, 0, 0, 0, 1425, 1426, 5, 34, 0, 0, 1426, 300, 1, 0, 0, 0, 1427, 1435, 5, 92, 0, 0, 1428, 1436, 7, 7, 0, 0, 1429, 1430, 5, 117, 0, 0, 1430, 1431, 3, 303, 151, 0, 1431, 1432, 3, 303, 151, 0, 1432, 1433, 3, 303, 151, 0, 1433, 1434, 3, 303, 151, 0, 1434, 1436, 1, 0, 0, 0, 1435, 1428, 1, 0, 0, 0, 1435, 1429, 1, 0, 0, 0, 1436, 302, 1, 0, 0, 0, 1437, 1438, 7, 8, 0, 0, 1438, 304, 1, 0, 0, 0, 1439, 1440, 5, 47, 0, 0, 1440, 1441, 5, 47, 0, 0, 1441, 1445, 1, 0, 0, 0, 1442, 1444, 8, 9, 0, 0, 1443, 1442, 1, 0, 0, 0, 1444, 1447, 1, 0, 0, 0, 1445, 1443, 1, 0, 0, 0, 1445, 1446, 1, 0, 0, 0, 1446, 1448, 1, 0, 0, 0, 1447, 1445, 1, 0, 0, 0, 1448, 1449, 6, 152, 0, 0, 1449, 306, 1, 0, 0, 0, 1450, 1451, 5, 47, 0, 0, 1451, 1452, 5, 42, 0, 0, 1452, 1456, 1, 0, 0, 0, 1453, 1455, 9, 0, 0, 0, 1454, 1453, 1, 0, 0, 0, 1455, 1458, 1, 0, 0, 0, 1456, 1457, 1, 0, 0, 0, 1456, 1454, 1, 0, 0, 0, 1457, 1459, 1, 0, 0, 0, 1458, 1456, 1, 0, 0, 0, 1459, 1460, 5, 42, 0, 0, 1460, 1461, 5, 47, 0, 0, 1461, 1462, 1, 0, 0, 0, 1462, 1463, 6, 153, 0, 0, 1463, 308, 1, 0, 0, 0, 1464, 1466, 7, 10, 0, 0, 1465, 1464, 1, 0, 0, 0, 1466, 1467, 1, 0, 0, 0, 1467, 1465, 1, 0, 0, 0, 1467, 1468, 1, 0, 0, 0, 1468, 1469, 1, 0, 0, 0, 1469, 1470, 6, 154, 0, 0, 1470, 310, 1, 0, 0, 0, 18, 0, 1371, 1376, 1379, 1386, 1389, 1395, 1397, 1401, 1406, 1408, 1414, 1420, 1422, 1435, 1445, 1456, 1467, 1, 0, 1, 0] \ No newline at end of file +[4, 0, 153, 1469, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 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, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 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, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 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, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 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, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 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, 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, 33, 1, 33, 1, 33, 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, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 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, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 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, 44, 1, 44, 1, 44, 1, 44, 1, 44, 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, 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, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 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, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 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, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 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, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 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, 65, 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, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 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, 73, 1, 74, 1, 74, 1, 74, 1, 74, 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, 75, 1, 76, 1, 76, 1, 76, 1, 76, 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, 77, 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, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 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, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 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, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 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, 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, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 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, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 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, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 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, 103, 1, 103, 1, 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, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 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, 144, 1, 144, 1, 145, 1, 145, 1, 146, 3, 146, 1370, 8, 146, 1, 146, 4, 146, 1373, 8, 146, 11, 146, 12, 146, 1374, 1, 147, 3, 147, 1378, 8, 147, 1, 147, 1, 147, 1, 147, 5, 147, 1383, 8, 147, 10, 147, 12, 147, 1386, 9, 147, 3, 147, 1388, 8, 147, 1, 147, 1, 147, 4, 147, 1392, 8, 147, 11, 147, 12, 147, 1393, 3, 147, 1396, 8, 147, 1, 147, 1, 147, 3, 147, 1400, 8, 147, 1, 147, 4, 147, 1403, 8, 147, 11, 147, 12, 147, 1404, 3, 147, 1407, 8, 147, 1, 148, 1, 148, 5, 148, 1411, 8, 148, 10, 148, 12, 148, 1414, 9, 148, 1, 149, 1, 149, 1, 149, 5, 149, 1419, 8, 149, 10, 149, 12, 149, 1422, 9, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 3, 150, 1434, 8, 150, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 5, 152, 1442, 8, 152, 10, 152, 12, 152, 1445, 9, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 5, 153, 1453, 8, 153, 10, 153, 12, 153, 1456, 9, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 4, 154, 1464, 8, 154, 11, 154, 12, 154, 1465, 1, 154, 1, 154, 1, 1454, 0, 155, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 143, 287, 144, 289, 145, 291, 146, 293, 147, 295, 148, 297, 149, 299, 150, 301, 0, 303, 0, 305, 151, 307, 152, 309, 153, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1483, 0, 1, 1, 0, 0, 0, 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, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 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, 305, 1, 0, 0, 0, 0, 307, 1, 0, 0, 0, 0, 309, 1, 0, 0, 0, 1, 311, 1, 0, 0, 0, 3, 316, 1, 0, 0, 0, 5, 323, 1, 0, 0, 0, 7, 332, 1, 0, 0, 0, 9, 345, 1, 0, 0, 0, 11, 353, 1, 0, 0, 0, 13, 357, 1, 0, 0, 0, 15, 366, 1, 0, 0, 0, 17, 377, 1, 0, 0, 0, 19, 387, 1, 0, 0, 0, 21, 397, 1, 0, 0, 0, 23, 406, 1, 0, 0, 0, 25, 418, 1, 0, 0, 0, 27, 425, 1, 0, 0, 0, 29, 433, 1, 0, 0, 0, 31, 442, 1, 0, 0, 0, 33, 450, 1, 0, 0, 0, 35, 456, 1, 0, 0, 0, 37, 461, 1, 0, 0, 0, 39, 474, 1, 0, 0, 0, 41, 484, 1, 0, 0, 0, 43, 496, 1, 0, 0, 0, 45, 502, 1, 0, 0, 0, 47, 513, 1, 0, 0, 0, 49, 524, 1, 0, 0, 0, 51, 529, 1, 0, 0, 0, 53, 538, 1, 0, 0, 0, 55, 548, 1, 0, 0, 0, 57, 553, 1, 0, 0, 0, 59, 557, 1, 0, 0, 0, 61, 563, 1, 0, 0, 0, 63, 568, 1, 0, 0, 0, 65, 578, 1, 0, 0, 0, 67, 582, 1, 0, 0, 0, 69, 595, 1, 0, 0, 0, 71, 600, 1, 0, 0, 0, 73, 607, 1, 0, 0, 0, 75, 616, 1, 0, 0, 0, 77, 627, 1, 0, 0, 0, 79, 631, 1, 0, 0, 0, 81, 640, 1, 0, 0, 0, 83, 647, 1, 0, 0, 0, 85, 656, 1, 0, 0, 0, 87, 661, 1, 0, 0, 0, 89, 671, 1, 0, 0, 0, 91, 682, 1, 0, 0, 0, 93, 690, 1, 0, 0, 0, 95, 696, 1, 0, 0, 0, 97, 705, 1, 0, 0, 0, 99, 715, 1, 0, 0, 0, 101, 724, 1, 0, 0, 0, 103, 736, 1, 0, 0, 0, 105, 747, 1, 0, 0, 0, 107, 753, 1, 0, 0, 0, 109, 761, 1, 0, 0, 0, 111, 764, 1, 0, 0, 0, 113, 769, 1, 0, 0, 0, 115, 776, 1, 0, 0, 0, 117, 779, 1, 0, 0, 0, 119, 787, 1, 0, 0, 0, 121, 794, 1, 0, 0, 0, 123, 800, 1, 0, 0, 0, 125, 805, 1, 0, 0, 0, 127, 816, 1, 0, 0, 0, 129, 821, 1, 0, 0, 0, 131, 827, 1, 0, 0, 0, 133, 834, 1, 0, 0, 0, 135, 838, 1, 0, 0, 0, 137, 850, 1, 0, 0, 0, 139, 853, 1, 0, 0, 0, 141, 860, 1, 0, 0, 0, 143, 863, 1, 0, 0, 0, 145, 870, 1, 0, 0, 0, 147, 878, 1, 0, 0, 0, 149, 885, 1, 0, 0, 0, 151, 896, 1, 0, 0, 0, 153, 903, 1, 0, 0, 0, 155, 912, 1, 0, 0, 0, 157, 927, 1, 0, 0, 0, 159, 937, 1, 0, 0, 0, 161, 947, 1, 0, 0, 0, 163, 960, 1, 0, 0, 0, 165, 966, 1, 0, 0, 0, 167, 983, 1, 0, 0, 0, 169, 986, 1, 0, 0, 0, 171, 990, 1, 0, 0, 0, 173, 995, 1, 0, 0, 0, 175, 1001, 1, 0, 0, 0, 177, 1010, 1, 0, 0, 0, 179, 1019, 1, 0, 0, 0, 181, 1023, 1, 0, 0, 0, 183, 1027, 1, 0, 0, 0, 185, 1031, 1, 0, 0, 0, 187, 1037, 1, 0, 0, 0, 189, 1043, 1, 0, 0, 0, 191, 1048, 1, 0, 0, 0, 193, 1053, 1, 0, 0, 0, 195, 1059, 1, 0, 0, 0, 197, 1067, 1, 0, 0, 0, 199, 1075, 1, 0, 0, 0, 201, 1086, 1, 0, 0, 0, 203, 1091, 1, 0, 0, 0, 205, 1103, 1, 0, 0, 0, 207, 1114, 1, 0, 0, 0, 209, 1124, 1, 0, 0, 0, 211, 1136, 1, 0, 0, 0, 213, 1145, 1, 0, 0, 0, 215, 1150, 1, 0, 0, 0, 217, 1163, 1, 0, 0, 0, 219, 1175, 1, 0, 0, 0, 221, 1187, 1, 0, 0, 0, 223, 1192, 1, 0, 0, 0, 225, 1200, 1, 0, 0, 0, 227, 1205, 1, 0, 0, 0, 229, 1218, 1, 0, 0, 0, 231, 1226, 1, 0, 0, 0, 233, 1235, 1, 0, 0, 0, 235, 1249, 1, 0, 0, 0, 237, 1258, 1, 0, 0, 0, 239, 1263, 1, 0, 0, 0, 241, 1270, 1, 0, 0, 0, 243, 1275, 1, 0, 0, 0, 245, 1281, 1, 0, 0, 0, 247, 1288, 1, 0, 0, 0, 249, 1294, 1, 0, 0, 0, 251, 1300, 1, 0, 0, 0, 253, 1307, 1, 0, 0, 0, 255, 1314, 1, 0, 0, 0, 257, 1321, 1, 0, 0, 0, 259, 1326, 1, 0, 0, 0, 261, 1332, 1, 0, 0, 0, 263, 1337, 1, 0, 0, 0, 265, 1340, 1, 0, 0, 0, 267, 1342, 1, 0, 0, 0, 269, 1344, 1, 0, 0, 0, 271, 1346, 1, 0, 0, 0, 273, 1348, 1, 0, 0, 0, 275, 1350, 1, 0, 0, 0, 277, 1352, 1, 0, 0, 0, 279, 1354, 1, 0, 0, 0, 281, 1356, 1, 0, 0, 0, 283, 1358, 1, 0, 0, 0, 285, 1360, 1, 0, 0, 0, 287, 1362, 1, 0, 0, 0, 289, 1364, 1, 0, 0, 0, 291, 1366, 1, 0, 0, 0, 293, 1369, 1, 0, 0, 0, 295, 1377, 1, 0, 0, 0, 297, 1408, 1, 0, 0, 0, 299, 1415, 1, 0, 0, 0, 301, 1425, 1, 0, 0, 0, 303, 1435, 1, 0, 0, 0, 305, 1437, 1, 0, 0, 0, 307, 1448, 1, 0, 0, 0, 309, 1463, 1, 0, 0, 0, 311, 312, 5, 101, 0, 0, 312, 313, 5, 100, 0, 0, 313, 314, 5, 105, 0, 0, 314, 315, 5, 116, 0, 0, 315, 2, 1, 0, 0, 0, 316, 317, 5, 109, 0, 0, 317, 318, 5, 111, 0, 0, 318, 319, 5, 100, 0, 0, 319, 320, 5, 117, 0, 0, 320, 321, 5, 108, 0, 0, 321, 322, 5, 101, 0, 0, 322, 4, 1, 0, 0, 0, 323, 324, 5, 99, 0, 0, 324, 325, 5, 111, 0, 0, 325, 326, 5, 110, 0, 0, 326, 327, 5, 116, 0, 0, 327, 328, 5, 114, 0, 0, 328, 329, 5, 97, 0, 0, 329, 330, 5, 99, 0, 0, 330, 331, 5, 116, 0, 0, 331, 6, 1, 0, 0, 0, 332, 333, 5, 112, 0, 0, 333, 334, 5, 114, 0, 0, 334, 335, 5, 101, 0, 0, 335, 336, 5, 115, 0, 0, 336, 337, 5, 101, 0, 0, 337, 338, 5, 110, 0, 0, 338, 339, 5, 116, 0, 0, 339, 340, 5, 97, 0, 0, 340, 341, 5, 116, 0, 0, 341, 342, 5, 105, 0, 0, 342, 343, 5, 111, 0, 0, 343, 344, 5, 110, 0, 0, 344, 8, 1, 0, 0, 0, 345, 346, 5, 115, 0, 0, 346, 347, 5, 117, 0, 0, 347, 348, 5, 98, 0, 0, 348, 349, 5, 106, 0, 0, 349, 350, 5, 101, 0, 0, 350, 351, 5, 99, 0, 0, 351, 352, 5, 116, 0, 0, 352, 10, 1, 0, 0, 0, 353, 354, 5, 102, 0, 0, 354, 355, 5, 111, 0, 0, 355, 356, 5, 114, 0, 0, 356, 12, 1, 0, 0, 0, 357, 358, 5, 99, 0, 0, 358, 359, 5, 114, 0, 0, 359, 360, 5, 101, 0, 0, 360, 361, 5, 97, 0, 0, 361, 362, 5, 116, 0, 0, 362, 363, 5, 105, 0, 0, 363, 364, 5, 111, 0, 0, 364, 365, 5, 110, 0, 0, 365, 14, 1, 0, 0, 0, 366, 367, 5, 105, 0, 0, 367, 368, 5, 110, 0, 0, 368, 369, 5, 105, 0, 0, 369, 370, 5, 116, 0, 0, 370, 371, 5, 105, 0, 0, 371, 372, 5, 97, 0, 0, 372, 373, 5, 108, 0, 0, 373, 374, 5, 105, 0, 0, 374, 375, 5, 122, 0, 0, 375, 376, 5, 101, 0, 0, 376, 16, 1, 0, 0, 0, 377, 378, 5, 119, 0, 0, 378, 379, 5, 111, 0, 0, 379, 380, 5, 114, 0, 0, 380, 381, 5, 107, 0, 0, 381, 382, 5, 115, 0, 0, 382, 383, 5, 112, 0, 0, 383, 384, 5, 97, 0, 0, 384, 385, 5, 99, 0, 0, 385, 386, 5, 101, 0, 0, 386, 18, 1, 0, 0, 0, 387, 388, 5, 101, 0, 0, 388, 389, 5, 120, 0, 0, 389, 390, 5, 101, 0, 0, 390, 391, 5, 99, 0, 0, 391, 392, 5, 117, 0, 0, 392, 393, 5, 116, 0, 0, 393, 394, 5, 105, 0, 0, 394, 395, 5, 111, 0, 0, 395, 396, 5, 110, 0, 0, 396, 20, 1, 0, 0, 0, 397, 398, 5, 115, 0, 0, 398, 399, 5, 110, 0, 0, 399, 400, 5, 97, 0, 0, 400, 401, 5, 112, 0, 0, 401, 402, 5, 115, 0, 0, 402, 403, 5, 104, 0, 0, 403, 404, 5, 111, 0, 0, 404, 405, 5, 116, 0, 0, 405, 22, 1, 0, 0, 0, 406, 407, 5, 116, 0, 0, 407, 408, 5, 114, 0, 0, 408, 409, 5, 97, 0, 0, 409, 410, 5, 110, 0, 0, 410, 411, 5, 115, 0, 0, 411, 412, 5, 97, 0, 0, 412, 413, 5, 99, 0, 0, 413, 414, 5, 116, 0, 0, 414, 415, 5, 105, 0, 0, 415, 416, 5, 111, 0, 0, 416, 417, 5, 110, 0, 0, 417, 24, 1, 0, 0, 0, 418, 419, 5, 114, 0, 0, 419, 420, 5, 101, 0, 0, 420, 421, 5, 109, 0, 0, 421, 422, 5, 111, 0, 0, 422, 423, 5, 116, 0, 0, 423, 424, 5, 101, 0, 0, 424, 26, 1, 0, 0, 0, 425, 426, 5, 116, 0, 0, 426, 427, 5, 97, 0, 0, 427, 428, 5, 114, 0, 0, 428, 429, 5, 103, 0, 0, 429, 430, 5, 101, 0, 0, 430, 431, 5, 116, 0, 0, 431, 432, 5, 115, 0, 0, 432, 28, 1, 0, 0, 0, 433, 434, 5, 112, 0, 0, 434, 435, 5, 111, 0, 0, 435, 436, 5, 114, 0, 0, 436, 437, 5, 116, 0, 0, 437, 438, 5, 97, 0, 0, 438, 439, 5, 98, 0, 0, 439, 440, 5, 108, 0, 0, 440, 441, 5, 101, 0, 0, 441, 30, 1, 0, 0, 0, 442, 443, 5, 114, 0, 0, 443, 444, 5, 101, 0, 0, 444, 445, 5, 112, 0, 0, 445, 446, 5, 108, 0, 0, 446, 447, 5, 105, 0, 0, 447, 448, 5, 99, 0, 0, 448, 449, 5, 97, 0, 0, 449, 32, 1, 0, 0, 0, 450, 451, 5, 108, 0, 0, 451, 452, 5, 111, 0, 0, 452, 453, 5, 99, 0, 0, 453, 454, 5, 97, 0, 0, 454, 455, 5, 108, 0, 0, 455, 34, 1, 0, 0, 0, 456, 457, 5, 102, 0, 0, 457, 458, 5, 114, 0, 0, 458, 459, 5, 111, 0, 0, 459, 460, 5, 109, 0, 0, 460, 36, 1, 0, 0, 0, 461, 462, 5, 114, 0, 0, 462, 463, 5, 101, 0, 0, 463, 464, 5, 115, 0, 0, 464, 465, 5, 117, 0, 0, 465, 466, 5, 108, 0, 0, 466, 467, 5, 116, 0, 0, 467, 468, 5, 45, 0, 0, 468, 469, 5, 98, 0, 0, 469, 470, 5, 121, 0, 0, 470, 471, 5, 116, 0, 0, 471, 472, 5, 101, 0, 0, 472, 473, 5, 115, 0, 0, 473, 38, 1, 0, 0, 0, 474, 475, 5, 114, 0, 0, 475, 476, 5, 112, 0, 0, 476, 477, 5, 99, 0, 0, 477, 478, 5, 45, 0, 0, 478, 479, 5, 99, 0, 0, 479, 480, 5, 97, 0, 0, 480, 481, 5, 108, 0, 0, 481, 482, 5, 108, 0, 0, 482, 483, 5, 115, 0, 0, 483, 40, 1, 0, 0, 0, 484, 485, 5, 100, 0, 0, 485, 486, 5, 101, 0, 0, 486, 487, 5, 97, 0, 0, 487, 488, 5, 100, 0, 0, 488, 489, 5, 108, 0, 0, 489, 490, 5, 105, 0, 0, 490, 491, 5, 110, 0, 0, 491, 492, 5, 101, 0, 0, 492, 493, 5, 45, 0, 0, 493, 494, 5, 109, 0, 0, 494, 495, 5, 115, 0, 0, 495, 42, 1, 0, 0, 0, 496, 497, 5, 113, 0, 0, 497, 498, 5, 117, 0, 0, 498, 499, 5, 101, 0, 0, 499, 500, 5, 114, 0, 0, 500, 501, 5, 121, 0, 0, 501, 44, 1, 0, 0, 0, 502, 503, 5, 114, 0, 0, 503, 504, 5, 101, 0, 0, 504, 505, 5, 102, 0, 0, 505, 506, 5, 108, 0, 0, 506, 507, 5, 101, 0, 0, 507, 508, 5, 99, 0, 0, 508, 509, 5, 116, 0, 0, 509, 510, 5, 105, 0, 0, 510, 511, 5, 111, 0, 0, 511, 512, 5, 110, 0, 0, 512, 46, 1, 0, 0, 0, 513, 514, 5, 115, 0, 0, 514, 515, 5, 112, 0, 0, 515, 516, 5, 101, 0, 0, 516, 517, 5, 99, 0, 0, 517, 518, 5, 105, 0, 0, 518, 519, 5, 97, 0, 0, 519, 520, 5, 108, 0, 0, 520, 521, 5, 105, 0, 0, 521, 522, 5, 122, 0, 0, 522, 523, 5, 101, 0, 0, 523, 48, 1, 0, 0, 0, 524, 525, 5, 114, 0, 0, 525, 526, 5, 111, 0, 0, 526, 527, 5, 111, 0, 0, 527, 528, 5, 116, 0, 0, 528, 50, 1, 0, 0, 0, 529, 530, 5, 100, 0, 0, 530, 531, 5, 111, 0, 0, 531, 532, 5, 99, 0, 0, 532, 533, 5, 117, 0, 0, 533, 534, 5, 109, 0, 0, 534, 535, 5, 101, 0, 0, 535, 536, 5, 110, 0, 0, 536, 537, 5, 116, 0, 0, 537, 52, 1, 0, 0, 0, 538, 539, 5, 102, 0, 0, 539, 540, 5, 114, 0, 0, 540, 541, 5, 97, 0, 0, 541, 542, 5, 103, 0, 0, 542, 543, 5, 109, 0, 0, 543, 544, 5, 101, 0, 0, 544, 545, 5, 110, 0, 0, 545, 546, 5, 116, 0, 0, 546, 547, 5, 115, 0, 0, 547, 54, 1, 0, 0, 0, 548, 549, 5, 118, 0, 0, 549, 550, 5, 105, 0, 0, 550, 551, 5, 101, 0, 0, 551, 552, 5, 119, 0, 0, 552, 56, 1, 0, 0, 0, 553, 554, 5, 109, 0, 0, 554, 555, 5, 97, 0, 0, 555, 556, 5, 120, 0, 0, 556, 58, 1, 0, 0, 0, 557, 558, 5, 97, 0, 0, 558, 559, 5, 108, 0, 0, 559, 560, 5, 108, 0, 0, 560, 561, 5, 111, 0, 0, 561, 562, 5, 119, 0, 0, 562, 60, 1, 0, 0, 0, 563, 564, 5, 112, 0, 0, 564, 565, 5, 111, 0, 0, 565, 566, 5, 108, 0, 0, 566, 567, 5, 108, 0, 0, 567, 62, 1, 0, 0, 0, 568, 569, 5, 113, 0, 0, 569, 570, 5, 117, 0, 0, 570, 571, 5, 101, 0, 0, 571, 572, 5, 114, 0, 0, 572, 573, 5, 121, 0, 0, 573, 574, 5, 97, 0, 0, 574, 575, 5, 98, 0, 0, 575, 576, 5, 108, 0, 0, 576, 577, 5, 101, 0, 0, 577, 64, 1, 0, 0, 0, 578, 579, 5, 114, 0, 0, 579, 580, 5, 112, 0, 0, 580, 581, 5, 99, 0, 0, 581, 66, 1, 0, 0, 0, 582, 583, 5, 113, 0, 0, 583, 584, 5, 117, 0, 0, 584, 585, 5, 101, 0, 0, 585, 586, 5, 114, 0, 0, 586, 587, 5, 121, 0, 0, 587, 588, 5, 45, 0, 0, 588, 589, 5, 114, 0, 0, 589, 590, 5, 101, 0, 0, 590, 591, 5, 97, 0, 0, 591, 592, 5, 115, 0, 0, 592, 593, 5, 111, 0, 0, 593, 594, 5, 110, 0, 0, 594, 68, 1, 0, 0, 0, 595, 596, 5, 116, 0, 0, 596, 597, 5, 121, 0, 0, 597, 598, 5, 112, 0, 0, 598, 599, 5, 101, 0, 0, 599, 70, 1, 0, 0, 0, 600, 601, 5, 111, 0, 0, 601, 602, 5, 98, 0, 0, 602, 603, 5, 106, 0, 0, 603, 604, 5, 101, 0, 0, 604, 605, 5, 99, 0, 0, 605, 606, 5, 116, 0, 0, 606, 72, 1, 0, 0, 0, 607, 608, 5, 115, 0, 0, 608, 609, 5, 116, 0, 0, 609, 610, 5, 111, 0, 0, 610, 611, 5, 114, 0, 0, 611, 612, 5, 97, 0, 0, 612, 613, 5, 98, 0, 0, 613, 614, 5, 108, 0, 0, 614, 615, 5, 101, 0, 0, 615, 74, 1, 0, 0, 0, 616, 617, 5, 105, 0, 0, 617, 618, 5, 109, 0, 0, 618, 619, 5, 112, 0, 0, 619, 620, 5, 108, 0, 0, 620, 621, 5, 101, 0, 0, 621, 622, 5, 109, 0, 0, 622, 623, 5, 101, 0, 0, 623, 624, 5, 110, 0, 0, 624, 625, 5, 116, 0, 0, 625, 626, 5, 115, 0, 0, 626, 76, 1, 0, 0, 0, 627, 628, 5, 114, 0, 0, 628, 629, 5, 101, 0, 0, 629, 630, 5, 102, 0, 0, 630, 78, 1, 0, 0, 0, 631, 632, 5, 102, 0, 0, 632, 633, 5, 114, 0, 0, 633, 634, 5, 97, 0, 0, 634, 635, 5, 103, 0, 0, 635, 636, 5, 109, 0, 0, 636, 637, 5, 101, 0, 0, 637, 638, 5, 110, 0, 0, 638, 639, 5, 116, 0, 0, 639, 80, 1, 0, 0, 0, 640, 641, 5, 105, 0, 0, 641, 642, 5, 109, 0, 0, 642, 643, 5, 112, 0, 0, 643, 644, 5, 111, 0, 0, 644, 645, 5, 114, 0, 0, 645, 646, 5, 116, 0, 0, 646, 82, 1, 0, 0, 0, 647, 648, 5, 101, 0, 0, 648, 649, 5, 120, 0, 0, 649, 650, 5, 116, 0, 0, 650, 651, 5, 101, 0, 0, 651, 652, 5, 114, 0, 0, 652, 653, 5, 110, 0, 0, 653, 654, 5, 97, 0, 0, 654, 655, 5, 108, 0, 0, 655, 84, 1, 0, 0, 0, 656, 657, 5, 97, 0, 0, 657, 658, 5, 116, 0, 0, 658, 659, 5, 111, 0, 0, 659, 660, 5, 109, 0, 0, 660, 86, 1, 0, 0, 0, 661, 662, 5, 105, 0, 0, 662, 663, 5, 110, 0, 0, 663, 664, 5, 116, 0, 0, 664, 665, 5, 101, 0, 0, 665, 666, 5, 114, 0, 0, 666, 667, 5, 102, 0, 0, 667, 668, 5, 97, 0, 0, 668, 669, 5, 99, 0, 0, 669, 670, 5, 101, 0, 0, 670, 88, 1, 0, 0, 0, 671, 672, 5, 105, 0, 0, 672, 673, 5, 110, 0, 0, 673, 674, 5, 116, 0, 0, 674, 675, 5, 101, 0, 0, 675, 676, 5, 114, 0, 0, 676, 677, 5, 102, 0, 0, 677, 678, 5, 97, 0, 0, 678, 679, 5, 99, 0, 0, 679, 680, 5, 101, 0, 0, 680, 681, 5, 115, 0, 0, 681, 90, 1, 0, 0, 0, 682, 683, 5, 112, 0, 0, 683, 684, 5, 97, 0, 0, 684, 685, 5, 99, 0, 0, 685, 686, 5, 107, 0, 0, 686, 687, 5, 97, 0, 0, 687, 688, 5, 103, 0, 0, 688, 689, 5, 101, 0, 0, 689, 92, 1, 0, 0, 0, 690, 691, 5, 118, 0, 0, 691, 692, 5, 97, 0, 0, 692, 693, 5, 108, 0, 0, 693, 694, 5, 117, 0, 0, 694, 695, 5, 101, 0, 0, 695, 94, 1, 0, 0, 0, 696, 697, 5, 114, 0, 0, 697, 698, 5, 101, 0, 0, 698, 699, 5, 108, 0, 0, 699, 700, 5, 97, 0, 0, 700, 701, 5, 116, 0, 0, 701, 702, 5, 105, 0, 0, 702, 703, 5, 111, 0, 0, 703, 704, 5, 110, 0, 0, 704, 96, 1, 0, 0, 0, 705, 706, 5, 111, 0, 0, 706, 707, 5, 112, 0, 0, 707, 708, 5, 101, 0, 0, 708, 709, 5, 114, 0, 0, 709, 710, 5, 97, 0, 0, 710, 711, 5, 116, 0, 0, 711, 712, 5, 105, 0, 0, 712, 713, 5, 111, 0, 0, 713, 714, 5, 110, 0, 0, 714, 98, 1, 0, 0, 0, 715, 716, 5, 102, 0, 0, 716, 717, 5, 117, 0, 0, 717, 718, 5, 110, 0, 0, 718, 719, 5, 99, 0, 0, 719, 720, 5, 116, 0, 0, 720, 721, 5, 105, 0, 0, 721, 722, 5, 111, 0, 0, 722, 723, 5, 110, 0, 0, 723, 100, 1, 0, 0, 0, 724, 725, 5, 99, 0, 0, 725, 726, 5, 111, 0, 0, 726, 727, 5, 110, 0, 0, 727, 728, 5, 115, 0, 0, 728, 729, 5, 116, 0, 0, 729, 730, 5, 114, 0, 0, 730, 731, 5, 117, 0, 0, 731, 732, 5, 99, 0, 0, 732, 733, 5, 116, 0, 0, 733, 734, 5, 111, 0, 0, 734, 735, 5, 114, 0, 0, 735, 102, 1, 0, 0, 0, 736, 737, 5, 99, 0, 0, 737, 738, 5, 111, 0, 0, 738, 739, 5, 110, 0, 0, 739, 740, 5, 115, 0, 0, 740, 741, 5, 116, 0, 0, 741, 742, 5, 114, 0, 0, 742, 743, 5, 117, 0, 0, 743, 744, 5, 99, 0, 0, 744, 745, 5, 116, 0, 0, 745, 746, 5, 115, 0, 0, 746, 104, 1, 0, 0, 0, 747, 748, 5, 105, 0, 0, 748, 749, 5, 110, 0, 0, 749, 750, 5, 112, 0, 0, 750, 751, 5, 117, 0, 0, 751, 752, 5, 116, 0, 0, 752, 106, 1, 0, 0, 0, 753, 754, 5, 99, 0, 0, 754, 755, 5, 111, 0, 0, 755, 756, 5, 110, 0, 0, 756, 757, 5, 102, 0, 0, 757, 758, 5, 111, 0, 0, 758, 759, 5, 114, 0, 0, 759, 760, 5, 109, 0, 0, 760, 108, 1, 0, 0, 0, 761, 762, 5, 97, 0, 0, 762, 763, 5, 115, 0, 0, 763, 110, 1, 0, 0, 0, 764, 765, 5, 98, 0, 0, 765, 766, 5, 105, 0, 0, 766, 767, 5, 110, 0, 0, 767, 768, 5, 100, 0, 0, 768, 112, 1, 0, 0, 0, 769, 770, 5, 115, 0, 0, 770, 771, 5, 116, 0, 0, 771, 772, 5, 97, 0, 0, 772, 773, 5, 116, 0, 0, 773, 774, 5, 105, 0, 0, 774, 775, 5, 99, 0, 0, 775, 114, 1, 0, 0, 0, 776, 777, 5, 116, 0, 0, 777, 778, 5, 111, 0, 0, 778, 116, 1, 0, 0, 0, 779, 780, 5, 112, 0, 0, 780, 781, 5, 114, 0, 0, 781, 782, 5, 105, 0, 0, 782, 783, 5, 118, 0, 0, 783, 784, 5, 97, 0, 0, 784, 785, 5, 116, 0, 0, 785, 786, 5, 101, 0, 0, 786, 118, 1, 0, 0, 0, 787, 788, 5, 115, 0, 0, 788, 789, 5, 104, 0, 0, 789, 790, 5, 97, 0, 0, 790, 791, 5, 114, 0, 0, 791, 792, 5, 101, 0, 0, 792, 793, 5, 100, 0, 0, 793, 120, 1, 0, 0, 0, 794, 795, 5, 115, 0, 0, 795, 796, 5, 116, 0, 0, 796, 797, 5, 97, 0, 0, 797, 798, 5, 116, 0, 0, 798, 799, 5, 101, 0, 0, 799, 122, 1, 0, 0, 0, 800, 801, 5, 101, 0, 0, 801, 802, 5, 100, 0, 0, 802, 803, 5, 103, 0, 0, 803, 804, 5, 101, 0, 0, 804, 124, 1, 0, 0, 0, 805, 806, 5, 112, 0, 0, 806, 807, 5, 114, 0, 0, 807, 808, 5, 111, 0, 0, 808, 809, 5, 106, 0, 0, 809, 810, 5, 101, 0, 0, 810, 811, 5, 99, 0, 0, 811, 812, 5, 116, 0, 0, 812, 813, 5, 105, 0, 0, 813, 814, 5, 111, 0, 0, 814, 815, 5, 110, 0, 0, 815, 126, 1, 0, 0, 0, 816, 817, 5, 119, 0, 0, 817, 818, 5, 105, 0, 0, 818, 819, 5, 116, 0, 0, 819, 820, 5, 104, 0, 0, 820, 128, 1, 0, 0, 0, 821, 822, 5, 117, 0, 0, 822, 823, 5, 115, 0, 0, 823, 824, 5, 105, 0, 0, 824, 825, 5, 110, 0, 0, 825, 826, 5, 103, 0, 0, 826, 130, 1, 0, 0, 0, 827, 828, 5, 97, 0, 0, 828, 829, 5, 99, 0, 0, 829, 830, 5, 99, 0, 0, 830, 831, 5, 101, 0, 0, 831, 832, 5, 112, 0, 0, 832, 833, 5, 116, 0, 0, 833, 132, 1, 0, 0, 0, 834, 835, 5, 118, 0, 0, 835, 836, 5, 105, 0, 0, 836, 837, 5, 97, 0, 0, 837, 134, 1, 0, 0, 0, 838, 839, 5, 109, 0, 0, 839, 840, 5, 97, 0, 0, 840, 841, 5, 116, 0, 0, 841, 842, 5, 101, 0, 0, 842, 843, 5, 114, 0, 0, 843, 844, 5, 105, 0, 0, 844, 845, 5, 97, 0, 0, 845, 846, 5, 108, 0, 0, 846, 847, 5, 105, 0, 0, 847, 848, 5, 122, 0, 0, 848, 849, 5, 101, 0, 0, 849, 136, 1, 0, 0, 0, 850, 851, 5, 105, 0, 0, 851, 852, 5, 102, 0, 0, 852, 138, 1, 0, 0, 0, 853, 854, 5, 97, 0, 0, 854, 855, 5, 98, 0, 0, 855, 856, 5, 115, 0, 0, 856, 857, 5, 101, 0, 0, 857, 858, 5, 110, 0, 0, 858, 859, 5, 116, 0, 0, 859, 140, 1, 0, 0, 0, 860, 861, 5, 111, 0, 0, 861, 862, 5, 110, 0, 0, 862, 142, 1, 0, 0, 0, 863, 864, 5, 112, 0, 0, 864, 865, 5, 111, 0, 0, 865, 866, 5, 108, 0, 0, 866, 867, 5, 105, 0, 0, 867, 868, 5, 99, 0, 0, 868, 869, 5, 121, 0, 0, 869, 144, 1, 0, 0, 0, 870, 871, 5, 100, 0, 0, 871, 872, 5, 101, 0, 0, 872, 873, 5, 102, 0, 0, 873, 874, 5, 97, 0, 0, 874, 875, 5, 117, 0, 0, 875, 876, 5, 108, 0, 0, 876, 877, 5, 116, 0, 0, 877, 146, 1, 0, 0, 0, 878, 879, 5, 115, 0, 0, 879, 880, 5, 111, 0, 0, 880, 881, 5, 117, 0, 0, 881, 882, 5, 114, 0, 0, 882, 883, 5, 99, 0, 0, 883, 884, 5, 101, 0, 0, 884, 148, 1, 0, 0, 0, 885, 886, 5, 114, 0, 0, 886, 887, 5, 101, 0, 0, 887, 888, 5, 112, 0, 0, 888, 889, 5, 111, 0, 0, 889, 890, 5, 115, 0, 0, 890, 891, 5, 105, 0, 0, 891, 892, 5, 116, 0, 0, 892, 893, 5, 111, 0, 0, 893, 894, 5, 114, 0, 0, 894, 895, 5, 121, 0, 0, 895, 150, 1, 0, 0, 0, 896, 897, 5, 99, 0, 0, 897, 898, 5, 111, 0, 0, 898, 899, 5, 109, 0, 0, 899, 900, 5, 109, 0, 0, 900, 901, 5, 105, 0, 0, 901, 902, 5, 116, 0, 0, 902, 152, 1, 0, 0, 0, 903, 904, 5, 114, 0, 0, 904, 905, 5, 101, 0, 0, 905, 906, 5, 118, 0, 0, 906, 907, 5, 105, 0, 0, 907, 908, 5, 115, 0, 0, 908, 909, 5, 105, 0, 0, 909, 910, 5, 111, 0, 0, 910, 911, 5, 110, 0, 0, 911, 154, 1, 0, 0, 0, 912, 913, 5, 115, 0, 0, 913, 914, 5, 101, 0, 0, 914, 915, 5, 109, 0, 0, 915, 916, 5, 97, 0, 0, 916, 917, 5, 110, 0, 0, 917, 918, 5, 116, 0, 0, 918, 919, 5, 105, 0, 0, 919, 920, 5, 99, 0, 0, 920, 921, 5, 45, 0, 0, 921, 922, 5, 109, 0, 0, 922, 923, 5, 97, 0, 0, 923, 924, 5, 106, 0, 0, 924, 925, 5, 111, 0, 0, 925, 926, 5, 114, 0, 0, 926, 156, 1, 0, 0, 0, 927, 928, 5, 111, 0, 0, 928, 929, 5, 110, 0, 0, 929, 930, 5, 45, 0, 0, 930, 931, 5, 100, 0, 0, 931, 932, 5, 101, 0, 0, 932, 933, 5, 108, 0, 0, 933, 934, 5, 101, 0, 0, 934, 935, 5, 116, 0, 0, 935, 936, 5, 101, 0, 0, 936, 158, 1, 0, 0, 0, 937, 938, 5, 108, 0, 0, 938, 939, 5, 105, 0, 0, 939, 940, 5, 102, 0, 0, 940, 941, 5, 101, 0, 0, 941, 942, 5, 99, 0, 0, 942, 943, 5, 121, 0, 0, 943, 944, 5, 99, 0, 0, 944, 945, 5, 108, 0, 0, 945, 946, 5, 101, 0, 0, 946, 160, 1, 0, 0, 0, 947, 948, 5, 114, 0, 0, 948, 949, 5, 101, 0, 0, 949, 950, 5, 116, 0, 0, 950, 951, 5, 97, 0, 0, 951, 952, 5, 105, 0, 0, 952, 953, 5, 110, 0, 0, 953, 954, 5, 45, 0, 0, 954, 955, 5, 111, 0, 0, 955, 956, 5, 116, 0, 0, 956, 957, 5, 104, 0, 0, 957, 958, 5, 101, 0, 0, 958, 959, 5, 114, 0, 0, 959, 162, 1, 0, 0, 0, 960, 961, 5, 107, 0, 0, 961, 962, 5, 101, 0, 0, 962, 963, 5, 121, 0, 0, 963, 964, 5, 101, 0, 0, 964, 965, 5, 100, 0, 0, 965, 164, 1, 0, 0, 0, 966, 967, 5, 112, 0, 0, 967, 968, 5, 117, 0, 0, 968, 969, 5, 98, 0, 0, 969, 970, 5, 108, 0, 0, 970, 971, 5, 105, 0, 0, 971, 972, 5, 99, 0, 0, 972, 973, 5, 45, 0, 0, 973, 974, 5, 116, 0, 0, 974, 975, 5, 114, 0, 0, 975, 976, 5, 97, 0, 0, 976, 977, 5, 118, 0, 0, 977, 978, 5, 101, 0, 0, 978, 979, 5, 114, 0, 0, 979, 980, 5, 115, 0, 0, 980, 981, 5, 97, 0, 0, 981, 982, 5, 108, 0, 0, 982, 166, 1, 0, 0, 0, 983, 984, 5, 105, 0, 0, 984, 985, 5, 100, 0, 0, 985, 168, 1, 0, 0, 0, 986, 987, 5, 100, 0, 0, 987, 988, 5, 111, 0, 0, 988, 989, 5, 99, 0, 0, 989, 170, 1, 0, 0, 0, 990, 991, 5, 109, 0, 0, 991, 992, 5, 111, 0, 0, 992, 993, 5, 100, 0, 0, 993, 994, 5, 101, 0, 0, 994, 172, 1, 0, 0, 0, 995, 996, 5, 101, 0, 0, 996, 997, 5, 109, 0, 0, 997, 998, 5, 105, 0, 0, 998, 999, 5, 116, 0, 0, 999, 1000, 5, 115, 0, 0, 1000, 174, 1, 0, 0, 0, 1001, 1002, 5, 114, 0, 0, 1002, 1003, 5, 101, 0, 0, 1003, 1004, 5, 99, 0, 0, 1004, 1005, 5, 101, 0, 0, 1005, 1006, 5, 105, 0, 0, 1006, 1007, 5, 118, 0, 0, 1007, 1008, 5, 101, 0, 0, 1008, 1009, 5, 114, 0, 0, 1009, 176, 1, 0, 0, 0, 1010, 1011, 5, 114, 0, 0, 1011, 1012, 5, 101, 0, 0, 1012, 1013, 5, 113, 0, 0, 1013, 1014, 5, 117, 0, 0, 1014, 1015, 5, 105, 0, 0, 1015, 1016, 5, 114, 0, 0, 1016, 1017, 5, 101, 0, 0, 1017, 1018, 5, 115, 0, 0, 1018, 178, 1, 0, 0, 0, 1019, 1020, 5, 97, 0, 0, 1020, 1021, 5, 110, 0, 0, 1021, 1022, 5, 121, 0, 0, 1022, 180, 1, 0, 0, 0, 1023, 1024, 5, 103, 0, 0, 1024, 1025, 5, 101, 0, 0, 1025, 1026, 5, 116, 0, 0, 1026, 182, 1, 0, 0, 0, 1027, 1028, 5, 115, 0, 0, 1028, 1029, 5, 101, 0, 0, 1029, 1030, 5, 116, 0, 0, 1030, 184, 1, 0, 0, 0, 1031, 1032, 5, 119, 0, 0, 1032, 1033, 5, 97, 0, 0, 1033, 1034, 5, 116, 0, 0, 1034, 1035, 5, 99, 0, 0, 1035, 1036, 5, 104, 0, 0, 1036, 186, 1, 0, 0, 0, 1037, 1038, 5, 115, 0, 0, 1038, 1039, 5, 116, 0, 0, 1039, 1040, 5, 97, 0, 0, 1040, 1041, 5, 114, 0, 0, 1041, 1042, 5, 116, 0, 0, 1042, 188, 1, 0, 0, 0, 1043, 1044, 5, 115, 0, 0, 1044, 1045, 5, 116, 0, 0, 1045, 1046, 5, 111, 0, 0, 1046, 1047, 5, 112, 0, 0, 1047, 190, 1, 0, 0, 0, 1048, 1049, 5, 114, 0, 0, 1049, 1050, 5, 101, 0, 0, 1050, 1051, 5, 97, 0, 0, 1051, 1052, 5, 100, 0, 0, 1052, 192, 1, 0, 0, 0, 1053, 1054, 5, 119, 0, 0, 1054, 1055, 5, 114, 0, 0, 1055, 1056, 5, 105, 0, 0, 1056, 1057, 5, 116, 0, 0, 1057, 1058, 5, 101, 0, 0, 1058, 194, 1, 0, 0, 0, 1059, 1060, 5, 114, 0, 0, 1060, 1061, 5, 101, 0, 0, 1061, 1062, 5, 115, 0, 0, 1062, 1063, 5, 111, 0, 0, 1063, 1064, 5, 108, 0, 0, 1064, 1065, 5, 118, 0, 0, 1065, 1066, 5, 101, 0, 0, 1066, 196, 1, 0, 0, 0, 1067, 1068, 5, 99, 0, 0, 1068, 1069, 5, 111, 0, 0, 1069, 1070, 5, 110, 0, 0, 1070, 1071, 5, 110, 0, 0, 1071, 1072, 5, 101, 0, 0, 1072, 1073, 5, 99, 0, 0, 1073, 1074, 5, 116, 0, 0, 1074, 198, 1, 0, 0, 0, 1075, 1076, 5, 100, 0, 0, 1076, 1077, 5, 105, 0, 0, 1077, 1078, 5, 115, 0, 0, 1078, 1079, 5, 99, 0, 0, 1079, 1080, 5, 111, 0, 0, 1080, 1081, 5, 110, 0, 0, 1081, 1082, 5, 110, 0, 0, 1082, 1083, 5, 101, 0, 0, 1083, 1084, 5, 99, 0, 0, 1084, 1085, 5, 116, 0, 0, 1085, 200, 1, 0, 0, 0, 1086, 1087, 5, 99, 0, 0, 1087, 1088, 5, 97, 0, 0, 1088, 1089, 5, 108, 0, 0, 1089, 1090, 5, 108, 0, 0, 1090, 202, 1, 0, 0, 0, 1091, 1092, 5, 119, 0, 0, 1092, 1093, 5, 97, 0, 0, 1093, 1094, 5, 116, 0, 0, 1094, 1095, 5, 99, 0, 0, 1095, 1096, 5, 104, 0, 0, 1096, 1097, 5, 45, 0, 0, 1097, 1098, 5, 115, 0, 0, 1098, 1099, 5, 116, 0, 0, 1099, 1100, 5, 97, 0, 0, 1100, 1101, 5, 114, 0, 0, 1101, 1102, 5, 116, 0, 0, 1102, 204, 1, 0, 0, 0, 1103, 1104, 5, 119, 0, 0, 1104, 1105, 5, 97, 0, 0, 1105, 1106, 5, 116, 0, 0, 1106, 1107, 5, 99, 0, 0, 1107, 1108, 5, 104, 0, 0, 1108, 1109, 5, 45, 0, 0, 1109, 1110, 5, 115, 0, 0, 1110, 1111, 5, 116, 0, 0, 1111, 1112, 5, 111, 0, 0, 1112, 1113, 5, 112, 0, 0, 1113, 206, 1, 0, 0, 0, 1114, 1115, 5, 115, 0, 0, 1115, 1116, 5, 117, 0, 0, 1116, 1117, 5, 98, 0, 0, 1117, 1118, 5, 115, 0, 0, 1118, 1119, 5, 99, 0, 0, 1119, 1120, 5, 114, 0, 0, 1120, 1121, 5, 105, 0, 0, 1121, 1122, 5, 98, 0, 0, 1122, 1123, 5, 101, 0, 0, 1123, 208, 1, 0, 0, 0, 1124, 1125, 5, 117, 0, 0, 1125, 1126, 5, 110, 0, 0, 1126, 1127, 5, 115, 0, 0, 1127, 1128, 5, 117, 0, 0, 1128, 1129, 5, 98, 0, 0, 1129, 1130, 5, 115, 0, 0, 1130, 1131, 5, 99, 0, 0, 1131, 1132, 5, 114, 0, 0, 1132, 1133, 5, 105, 0, 0, 1133, 1134, 5, 98, 0, 0, 1134, 1135, 5, 101, 0, 0, 1135, 210, 1, 0, 0, 0, 1136, 1137, 5, 114, 0, 0, 1137, 1138, 5, 101, 0, 0, 1138, 1139, 5, 103, 0, 0, 1139, 1140, 5, 105, 0, 0, 1140, 1141, 5, 115, 0, 0, 1141, 1142, 5, 116, 0, 0, 1142, 1143, 5, 101, 0, 0, 1143, 1144, 5, 114, 0, 0, 1144, 212, 1, 0, 0, 0, 1145, 1146, 5, 99, 0, 0, 1146, 1147, 5, 114, 0, 0, 1147, 1148, 5, 100, 0, 0, 1148, 1149, 5, 116, 0, 0, 1149, 214, 1, 0, 0, 0, 1150, 1151, 5, 111, 0, 0, 1151, 1152, 5, 112, 0, 0, 1152, 1153, 5, 116, 0, 0, 1153, 1154, 5, 105, 0, 0, 1154, 1155, 5, 111, 0, 0, 1155, 1156, 5, 110, 0, 0, 1156, 1157, 5, 97, 0, 0, 1157, 1158, 5, 108, 0, 0, 1158, 1159, 5, 45, 0, 0, 1159, 1160, 5, 111, 0, 0, 1160, 1161, 5, 110, 0, 0, 1161, 1162, 5, 101, 0, 0, 1162, 216, 1, 0, 0, 0, 1163, 1164, 5, 101, 0, 0, 1164, 1165, 5, 120, 0, 0, 1165, 1166, 5, 97, 0, 0, 1166, 1167, 5, 99, 0, 0, 1167, 1168, 5, 116, 0, 0, 1168, 1169, 5, 108, 0, 0, 1169, 1170, 5, 121, 0, 0, 1170, 1171, 5, 45, 0, 0, 1171, 1172, 5, 111, 0, 0, 1172, 1173, 5, 110, 0, 0, 1173, 1174, 5, 101, 0, 0, 1174, 218, 1, 0, 0, 0, 1175, 1176, 5, 109, 0, 0, 1176, 1177, 5, 97, 0, 0, 1177, 1178, 5, 110, 0, 0, 1178, 1179, 5, 121, 0, 0, 1179, 1180, 5, 45, 0, 0, 1180, 1181, 5, 117, 0, 0, 1181, 1182, 5, 110, 0, 0, 1182, 1183, 5, 105, 0, 0, 1183, 1184, 5, 113, 0, 0, 1184, 1185, 5, 117, 0, 0, 1185, 1186, 5, 101, 0, 0, 1186, 220, 1, 0, 0, 0, 1187, 1188, 5, 109, 0, 0, 1188, 1189, 5, 97, 0, 0, 1189, 1190, 5, 110, 0, 0, 1190, 1191, 5, 121, 0, 0, 1191, 222, 1, 0, 0, 0, 1192, 1193, 5, 111, 0, 0, 1193, 1194, 5, 114, 0, 0, 1194, 1195, 5, 100, 0, 0, 1195, 1196, 5, 101, 0, 0, 1196, 1197, 5, 114, 0, 0, 1197, 1198, 5, 101, 0, 0, 1198, 1199, 5, 100, 0, 0, 1199, 224, 1, 0, 0, 0, 1200, 1201, 5, 117, 0, 0, 1201, 1202, 5, 110, 0, 0, 1202, 1203, 5, 105, 0, 0, 1203, 1204, 5, 116, 0, 0, 1204, 226, 1, 0, 0, 0, 1205, 1206, 5, 119, 0, 0, 1206, 1207, 5, 97, 0, 0, 1207, 1208, 5, 116, 0, 0, 1208, 1209, 5, 99, 0, 0, 1209, 1210, 5, 104, 0, 0, 1210, 1211, 5, 45, 0, 0, 1211, 1212, 5, 104, 0, 0, 1212, 1213, 5, 97, 0, 0, 1213, 1214, 5, 110, 0, 0, 1214, 1215, 5, 100, 0, 0, 1215, 1216, 5, 108, 0, 0, 1216, 1217, 5, 101, 0, 0, 1217, 228, 1, 0, 0, 0, 1218, 1219, 5, 109, 0, 0, 1219, 1220, 5, 101, 0, 0, 1220, 1221, 5, 115, 0, 0, 1221, 1222, 5, 115, 0, 0, 1222, 1223, 5, 97, 0, 0, 1223, 1224, 5, 103, 0, 0, 1224, 1225, 5, 101, 0, 0, 1225, 230, 1, 0, 0, 0, 1226, 1227, 5, 97, 0, 0, 1227, 1228, 5, 116, 0, 0, 1228, 1229, 5, 111, 0, 0, 1229, 1230, 5, 109, 0, 0, 1230, 1231, 5, 45, 0, 0, 1231, 1232, 5, 114, 0, 0, 1232, 1233, 5, 101, 0, 0, 1233, 1234, 5, 102, 0, 0, 1234, 232, 1, 0, 0, 0, 1235, 1236, 5, 105, 0, 0, 1236, 1237, 5, 110, 0, 0, 1237, 1238, 5, 116, 0, 0, 1238, 1239, 5, 101, 0, 0, 1239, 1240, 5, 114, 0, 0, 1240, 1241, 5, 102, 0, 0, 1241, 1242, 5, 97, 0, 0, 1242, 1243, 5, 99, 0, 0, 1243, 1244, 5, 101, 0, 0, 1244, 1245, 5, 45, 0, 0, 1245, 1246, 5, 114, 0, 0, 1246, 1247, 5, 101, 0, 0, 1247, 1248, 5, 102, 0, 0, 1248, 234, 1, 0, 0, 0, 1249, 1250, 5, 111, 0, 0, 1250, 1251, 5, 112, 0, 0, 1251, 1252, 5, 116, 0, 0, 1252, 1253, 5, 105, 0, 0, 1253, 1254, 5, 111, 0, 0, 1254, 1255, 5, 110, 0, 0, 1255, 1256, 5, 97, 0, 0, 1256, 1257, 5, 108, 0, 0, 1257, 236, 1, 0, 0, 0, 1258, 1259, 5, 108, 0, 0, 1259, 1260, 5, 105, 0, 0, 1260, 1261, 5, 115, 0, 0, 1261, 1262, 5, 116, 0, 0, 1262, 238, 1, 0, 0, 0, 1263, 1264, 5, 114, 0, 0, 1264, 1265, 5, 101, 0, 0, 1265, 1266, 5, 99, 0, 0, 1266, 1267, 5, 111, 0, 0, 1267, 1268, 5, 114, 0, 0, 1268, 1269, 5, 100, 0, 0, 1269, 240, 1, 0, 0, 0, 1270, 1271, 5, 98, 0, 0, 1271, 1272, 5, 111, 0, 0, 1272, 1273, 5, 111, 0, 0, 1273, 1274, 5, 108, 0, 0, 1274, 242, 1, 0, 0, 0, 1275, 1276, 5, 98, 0, 0, 1276, 1277, 5, 121, 0, 0, 1277, 1278, 5, 116, 0, 0, 1278, 1279, 5, 101, 0, 0, 1279, 1280, 5, 115, 0, 0, 1280, 244, 1, 0, 0, 0, 1281, 1282, 5, 100, 0, 0, 1282, 1283, 5, 111, 0, 0, 1283, 1284, 5, 117, 0, 0, 1284, 1285, 5, 98, 0, 0, 1285, 1286, 5, 108, 0, 0, 1286, 1287, 5, 101, 0, 0, 1287, 246, 1, 0, 0, 0, 1288, 1289, 5, 105, 0, 0, 1289, 1290, 5, 110, 0, 0, 1290, 1291, 5, 116, 0, 0, 1291, 1292, 5, 51, 0, 0, 1292, 1293, 5, 50, 0, 0, 1293, 248, 1, 0, 0, 0, 1294, 1295, 5, 105, 0, 0, 1295, 1296, 5, 110, 0, 0, 1296, 1297, 5, 116, 0, 0, 1297, 1298, 5, 54, 0, 0, 1298, 1299, 5, 52, 0, 0, 1299, 250, 1, 0, 0, 0, 1300, 1301, 5, 115, 0, 0, 1301, 1302, 5, 116, 0, 0, 1302, 1303, 5, 114, 0, 0, 1303, 1304, 5, 105, 0, 0, 1304, 1305, 5, 110, 0, 0, 1305, 1306, 5, 103, 0, 0, 1306, 252, 1, 0, 0, 0, 1307, 1308, 5, 117, 0, 0, 1308, 1309, 5, 105, 0, 0, 1309, 1310, 5, 110, 0, 0, 1310, 1311, 5, 116, 0, 0, 1311, 1312, 5, 51, 0, 0, 1312, 1313, 5, 50, 0, 0, 1313, 254, 1, 0, 0, 0, 1314, 1315, 5, 117, 0, 0, 1315, 1316, 5, 105, 0, 0, 1316, 1317, 5, 110, 0, 0, 1317, 1318, 5, 116, 0, 0, 1318, 1319, 5, 54, 0, 0, 1319, 1320, 5, 52, 0, 0, 1320, 256, 1, 0, 0, 0, 1321, 1322, 5, 116, 0, 0, 1322, 1323, 5, 114, 0, 0, 1323, 1324, 5, 117, 0, 0, 1324, 1325, 5, 101, 0, 0, 1325, 258, 1, 0, 0, 0, 1326, 1327, 5, 102, 0, 0, 1327, 1328, 5, 97, 0, 0, 1328, 1329, 5, 108, 0, 0, 1329, 1330, 5, 115, 0, 0, 1330, 1331, 5, 101, 0, 0, 1331, 260, 1, 0, 0, 0, 1332, 1333, 5, 110, 0, 0, 1333, 1334, 5, 117, 0, 0, 1334, 1335, 5, 108, 0, 0, 1335, 1336, 5, 108, 0, 0, 1336, 262, 1, 0, 0, 0, 1337, 1338, 5, 45, 0, 0, 1338, 1339, 5, 62, 0, 0, 1339, 264, 1, 0, 0, 0, 1340, 1341, 5, 58, 0, 0, 1341, 266, 1, 0, 0, 0, 1342, 1343, 5, 59, 0, 0, 1343, 268, 1, 0, 0, 0, 1344, 1345, 5, 44, 0, 0, 1345, 270, 1, 0, 0, 0, 1346, 1347, 5, 46, 0, 0, 1347, 272, 1, 0, 0, 0, 1348, 1349, 5, 123, 0, 0, 1349, 274, 1, 0, 0, 0, 1350, 1351, 5, 125, 0, 0, 1351, 276, 1, 0, 0, 0, 1352, 1353, 5, 91, 0, 0, 1353, 278, 1, 0, 0, 0, 1354, 1355, 5, 93, 0, 0, 1355, 280, 1, 0, 0, 0, 1356, 1357, 5, 40, 0, 0, 1357, 282, 1, 0, 0, 0, 1358, 1359, 5, 41, 0, 0, 1359, 284, 1, 0, 0, 0, 1360, 1361, 5, 60, 0, 0, 1361, 286, 1, 0, 0, 0, 1362, 1363, 5, 62, 0, 0, 1363, 288, 1, 0, 0, 0, 1364, 1365, 5, 38, 0, 0, 1365, 290, 1, 0, 0, 0, 1366, 1367, 5, 61, 0, 0, 1367, 292, 1, 0, 0, 0, 1368, 1370, 5, 45, 0, 0, 1369, 1368, 1, 0, 0, 0, 1369, 1370, 1, 0, 0, 0, 1370, 1372, 1, 0, 0, 0, 1371, 1373, 7, 0, 0, 0, 1372, 1371, 1, 0, 0, 0, 1373, 1374, 1, 0, 0, 0, 1374, 1372, 1, 0, 0, 0, 1374, 1375, 1, 0, 0, 0, 1375, 294, 1, 0, 0, 0, 1376, 1378, 5, 45, 0, 0, 1377, 1376, 1, 0, 0, 0, 1377, 1378, 1, 0, 0, 0, 1378, 1387, 1, 0, 0, 0, 1379, 1388, 5, 48, 0, 0, 1380, 1384, 7, 1, 0, 0, 1381, 1383, 7, 0, 0, 0, 1382, 1381, 1, 0, 0, 0, 1383, 1386, 1, 0, 0, 0, 1384, 1382, 1, 0, 0, 0, 1384, 1385, 1, 0, 0, 0, 1385, 1388, 1, 0, 0, 0, 1386, 1384, 1, 0, 0, 0, 1387, 1379, 1, 0, 0, 0, 1387, 1380, 1, 0, 0, 0, 1388, 1395, 1, 0, 0, 0, 1389, 1391, 5, 46, 0, 0, 1390, 1392, 7, 0, 0, 0, 1391, 1390, 1, 0, 0, 0, 1392, 1393, 1, 0, 0, 0, 1393, 1391, 1, 0, 0, 0, 1393, 1394, 1, 0, 0, 0, 1394, 1396, 1, 0, 0, 0, 1395, 1389, 1, 0, 0, 0, 1395, 1396, 1, 0, 0, 0, 1396, 1406, 1, 0, 0, 0, 1397, 1399, 7, 2, 0, 0, 1398, 1400, 7, 3, 0, 0, 1399, 1398, 1, 0, 0, 0, 1399, 1400, 1, 0, 0, 0, 1400, 1402, 1, 0, 0, 0, 1401, 1403, 7, 0, 0, 0, 1402, 1401, 1, 0, 0, 0, 1403, 1404, 1, 0, 0, 0, 1404, 1402, 1, 0, 0, 0, 1404, 1405, 1, 0, 0, 0, 1405, 1407, 1, 0, 0, 0, 1406, 1397, 1, 0, 0, 0, 1406, 1407, 1, 0, 0, 0, 1407, 296, 1, 0, 0, 0, 1408, 1412, 7, 4, 0, 0, 1409, 1411, 7, 5, 0, 0, 1410, 1409, 1, 0, 0, 0, 1411, 1414, 1, 0, 0, 0, 1412, 1410, 1, 0, 0, 0, 1412, 1413, 1, 0, 0, 0, 1413, 298, 1, 0, 0, 0, 1414, 1412, 1, 0, 0, 0, 1415, 1420, 5, 34, 0, 0, 1416, 1419, 3, 301, 150, 0, 1417, 1419, 8, 6, 0, 0, 1418, 1416, 1, 0, 0, 0, 1418, 1417, 1, 0, 0, 0, 1419, 1422, 1, 0, 0, 0, 1420, 1418, 1, 0, 0, 0, 1420, 1421, 1, 0, 0, 0, 1421, 1423, 1, 0, 0, 0, 1422, 1420, 1, 0, 0, 0, 1423, 1424, 5, 34, 0, 0, 1424, 300, 1, 0, 0, 0, 1425, 1433, 5, 92, 0, 0, 1426, 1434, 7, 7, 0, 0, 1427, 1428, 5, 117, 0, 0, 1428, 1429, 3, 303, 151, 0, 1429, 1430, 3, 303, 151, 0, 1430, 1431, 3, 303, 151, 0, 1431, 1432, 3, 303, 151, 0, 1432, 1434, 1, 0, 0, 0, 1433, 1426, 1, 0, 0, 0, 1433, 1427, 1, 0, 0, 0, 1434, 302, 1, 0, 0, 0, 1435, 1436, 7, 8, 0, 0, 1436, 304, 1, 0, 0, 0, 1437, 1438, 5, 47, 0, 0, 1438, 1439, 5, 47, 0, 0, 1439, 1443, 1, 0, 0, 0, 1440, 1442, 8, 9, 0, 0, 1441, 1440, 1, 0, 0, 0, 1442, 1445, 1, 0, 0, 0, 1443, 1441, 1, 0, 0, 0, 1443, 1444, 1, 0, 0, 0, 1444, 1446, 1, 0, 0, 0, 1445, 1443, 1, 0, 0, 0, 1446, 1447, 6, 152, 0, 0, 1447, 306, 1, 0, 0, 0, 1448, 1449, 5, 47, 0, 0, 1449, 1450, 5, 42, 0, 0, 1450, 1454, 1, 0, 0, 0, 1451, 1453, 9, 0, 0, 0, 1452, 1451, 1, 0, 0, 0, 1453, 1456, 1, 0, 0, 0, 1454, 1455, 1, 0, 0, 0, 1454, 1452, 1, 0, 0, 0, 1455, 1457, 1, 0, 0, 0, 1456, 1454, 1, 0, 0, 0, 1457, 1458, 5, 42, 0, 0, 1458, 1459, 5, 47, 0, 0, 1459, 1460, 1, 0, 0, 0, 1460, 1461, 6, 153, 0, 0, 1461, 308, 1, 0, 0, 0, 1462, 1464, 7, 10, 0, 0, 1463, 1462, 1, 0, 0, 0, 1464, 1465, 1, 0, 0, 0, 1465, 1463, 1, 0, 0, 0, 1465, 1466, 1, 0, 0, 0, 1466, 1467, 1, 0, 0, 0, 1467, 1468, 6, 154, 0, 0, 1468, 310, 1, 0, 0, 0, 18, 0, 1369, 1374, 1377, 1384, 1387, 1393, 1395, 1399, 1404, 1406, 1412, 1418, 1420, 1433, 1443, 1454, 1465, 1, 0, 1, 0] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapabilityLexer.tokens b/src/capability-language/generated/QuixosCapabilityLexer.tokens index f1baa32..c207cdc 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.tokens +++ b/src/capability-language/generated/QuixosCapabilityLexer.tokens @@ -1,8 +1,8 @@ EDIT=1 -COMPONENT=2 -PRESENTATION=3 -SUBJECT=4 -RUNTIME=5 +MODULE=2 +CONTRACT=3 +PRESENTATION=4 +SUBJECT=5 FOR=6 CREATION=7 INITIALIZE=8 @@ -152,10 +152,10 @@ LINE_COMMENT=151 BLOCK_COMMENT=152 WS=153 'edit'=1 -'component'=2 -'presentation'=3 -'subject'=4 -'runtime'=5 +'module'=2 +'contract'=3 +'presentation'=4 +'subject'=5 'for'=6 'creation'=7 'initialize'=8 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.ts b/src/capability-language/generated/QuixosCapabilityLexer.ts index cd5e441..f701c15 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.ts +++ b/src/capability-language/generated/QuixosCapabilityLexer.ts @@ -5,10 +5,10 @@ import { Token } from "antlr4ng"; export class QuixosCapabilityLexer extends antlr.Lexer { public static readonly EDIT = 1; - public static readonly COMPONENT = 2; - public static readonly PRESENTATION = 3; - public static readonly SUBJECT = 4; - public static readonly RUNTIME = 5; + public static readonly MODULE = 2; + public static readonly CONTRACT = 3; + public static readonly PRESENTATION = 4; + public static readonly SUBJECT = 5; public static readonly FOR = 6; public static readonly CREATION = 7; public static readonly INITIALIZE = 8; @@ -163,7 +163,7 @@ export class QuixosCapabilityLexer extends antlr.Lexer { ]; public static readonly literalNames = [ - null, "'edit'", "'component'", "'presentation'", "'subject'", "'runtime'", + null, "'edit'", "'module'", "'contract'", "'presentation'", "'subject'", "'for'", "'creation'", "'initialize'", "'workspace'", "'execution'", "'snapshot'", "'transaction'", "'remote'", "'targets'", "'portable'", "'replica'", "'local'", "'from'", "'result-bytes'", "'rpc-calls'", @@ -192,8 +192,8 @@ export class QuixosCapabilityLexer extends antlr.Lexer { ]; public static readonly symbolicNames = [ - null, "EDIT", "COMPONENT", "PRESENTATION", "SUBJECT", "RUNTIME", - "FOR", "CREATION", "INITIALIZE", "WORKSPACE", "EXECUTION", "SNAPSHOT", + null, "EDIT", "MODULE", "CONTRACT", "PRESENTATION", "SUBJECT", "FOR", + "CREATION", "INITIALIZE", "WORKSPACE", "EXECUTION", "SNAPSHOT", "TRANSACTION", "REMOTE", "TARGETS", "PORTABLE", "REPLICA", "LOCAL", "FROM", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", "REFLECTION", "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", "MAX", "ALLOW", @@ -223,7 +223,7 @@ export class QuixosCapabilityLexer extends antlr.Lexer { ]; public static readonly ruleNames = [ - "EDIT", "COMPONENT", "PRESENTATION", "SUBJECT", "RUNTIME", "FOR", + "EDIT", "MODULE", "CONTRACT", "PRESENTATION", "SUBJECT", "FOR", "CREATION", "INITIALIZE", "WORKSPACE", "EXECUTION", "SNAPSHOT", "TRANSACTION", "REMOTE", "TARGETS", "PORTABLE", "REPLICA", "LOCAL", "FROM", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", "REFLECTION", @@ -268,7 +268,7 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public get modeNames(): string[] { return QuixosCapabilityLexer.modeNames; } public static readonly _serializedATN: number[] = [ - 4,0,153,1471,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, + 4,0,153,1469,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, @@ -294,522 +294,521 @@ export class QuixosCapabilityLexer extends antlr.Lexer { 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,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, - 1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4, - 1,4,1,4,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7, - 1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,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,9,1,9,1,9,1,9,1,9,1,10,1,10, - 1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,11, - 1,11,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12, - 1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14, - 1,14,1,14,1,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,18,1,18,1,18,1,18,1,18,1,19,1,19,1,19, - 1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20, - 1,20,1,20,1,20,1,20,1,20,1,20,1,21,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,23,1,23,1,24,1,24,1,24,1,24,1,24, - 1,25,1,25,1,25,1,25,1,25,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,26,1,26,1,27,1,27,1,27,1,27,1,27,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,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,33,1,33,1,33,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,35,1,35,1,35, - 1,36,1,36,1,36,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,37,1,37,1,37,1,37,1,38,1,38,1,38,1,38,1,39,1,39, - 1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,1,40, - 1,40,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,42,1,42,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,44, - 1,44,1,44,1,44,1,44,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,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,48,1,48,1,48, - 1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,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,50,1,50,1,50,1,50,1,51, - 1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,52,1,52,1,52, - 1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,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,56, - 1,57,1,57,1,57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,59,1,59, - 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,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62, - 1,62,1,63,1,63,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,65,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,67,1,67,1,68,1,68,1,68,1,69, - 1,69,1,69,1,69,1,69,1,69,1,69,1,70,1,70,1,70,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,73,1,74,1,74,1,74,1,74,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,75,1,76,1,76,1,76, - 1,76,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,77,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,78,1,78,1,78,1,79,1,79,1,79,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,80,1,80,1,80,1,80, - 1,80,1,80,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,82,1,82,1,82,1,82,1,82,1,82,1,82,1,83, - 1,83,1,83,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,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,89,1,89,1,89,1,89, - 1,90,1,90,1,90,1,90,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1,92,1,92, - 1,92,1,93,1,93,1,93,1,93,1,93,1,93,1,94,1,94,1,94,1,94,1,94,1,95, - 1,95,1,95,1,95,1,95,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,97,1,97,1,98,1,98,1,98,1,98,1,98,1,98,1,98,1,98, - 1,99,1,99,1,99,1,99,1,99,1,99,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,101,1,101, - 1,101,1,101,1,101,1,101,1,102,1,102,1,102,1,102,1,102,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,103,1,103,1,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,105,1,105,1,105,1,105,1,105,1,105,1,105, - 1,105,1,105,1,106,1,106,1,106,1,106,1,106,1,107,1,107,1,107,1,107, - 1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,108,1,108, - 1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,109, - 1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109, - 1,110,1,110,1,110,1,110,1,110,1,111,1,111,1,111,1,111,1,111,1,111, - 1,111,1,111,1,112,1,112,1,112,1,112,1,112,1,113,1,113,1,113,1,113, - 1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,114,1,114, - 1,114,1,114,1,114,1,114,1,114,1,114,1,115,1,115,1,115,1,115,1,115, - 1,115,1,115,1,115,1,115,1,116,1,116,1,116,1,116,1,116,1,116,1,116, - 1,116,1,116,1,116,1,116,1,116,1,116,1,116,1,117,1,117,1,117,1,117, - 1,117,1,117,1,117,1,117,1,117,1,118,1,118,1,118,1,118,1,118,1,119, - 1,119,1,119,1,119,1,119,1,119,1,119,1,120,1,120,1,120,1,120,1,120, - 1,121,1,121,1,121,1,121,1,121,1,121,1,122,1,122,1,122,1,122,1,122, - 1,122,1,122,1,123,1,123,1,123,1,123,1,123,1,123,1,124,1,124,1,124, - 1,124,1,124,1,124,1,125,1,125,1,125,1,125,1,125,1,125,1,125,1,126, - 1,126,1,126,1,126,1,126,1,126,1,126,1,127,1,127,1,127,1,127,1,127, - 1,127,1,127,1,128,1,128,1,128,1,128,1,128,1,129,1,129,1,129,1,129, - 1,129,1,129,1,130,1,130,1,130,1,130,1,130,1,131,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,144,1,144,1,145,1,145,1,146,3,146,1372,8,146,1,146,4,146, - 1375,8,146,11,146,12,146,1376,1,147,3,147,1380,8,147,1,147,1,147, - 1,147,5,147,1385,8,147,10,147,12,147,1388,9,147,3,147,1390,8,147, - 1,147,1,147,4,147,1394,8,147,11,147,12,147,1395,3,147,1398,8,147, - 1,147,1,147,3,147,1402,8,147,1,147,4,147,1405,8,147,11,147,12,147, - 1406,3,147,1409,8,147,1,148,1,148,5,148,1413,8,148,10,148,12,148, - 1416,9,148,1,149,1,149,1,149,5,149,1421,8,149,10,149,12,149,1424, - 9,149,1,149,1,149,1,150,1,150,1,150,1,150,1,150,1,150,1,150,1,150, - 3,150,1436,8,150,1,151,1,151,1,152,1,152,1,152,1,152,5,152,1444, - 8,152,10,152,12,152,1447,9,152,1,152,1,152,1,153,1,153,1,153,1,153, - 5,153,1455,8,153,10,153,12,153,1458,9,153,1,153,1,153,1,153,1,153, - 1,153,1,154,4,154,1466,8,154,11,154,12,154,1467,1,154,1,154,1,1456, - 0,155,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12, - 25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23, - 47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34, - 69,35,71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45, - 91,46,93,47,95,48,97,49,99,50,101,51,103,52,105,53,107,54,109,55, - 111,56,113,57,115,58,117,59,119,60,121,61,123,62,125,63,127,64,129, - 65,131,66,133,67,135,68,137,69,139,70,141,71,143,72,145,73,147,74, - 149,75,151,76,153,77,155,78,157,79,159,80,161,81,163,82,165,83,167, - 84,169,85,171,86,173,87,175,88,177,89,179,90,181,91,183,92,185,93, - 187,94,189,95,191,96,193,97,195,98,197,99,199,100,201,101,203,102, - 205,103,207,104,209,105,211,106,213,107,215,108,217,109,219,110, - 221,111,223,112,225,113,227,114,229,115,231,116,233,117,235,118, - 237,119,239,120,241,121,243,122,245,123,247,124,249,125,251,126, - 253,127,255,128,257,129,259,130,261,131,263,132,265,133,267,134, - 269,135,271,136,273,137,275,138,277,139,279,140,281,141,283,142, - 285,143,287,144,289,145,291,146,293,147,295,148,297,149,299,150, - 301,0,303,0,305,151,307,152,309,153,1,0,11,1,0,48,57,1,0,49,57,2, - 0,69,69,101,101,2,0,43,43,45,45,3,0,65,90,95,95,97,122,4,0,48,57, - 65,90,95,95,97,122,4,0,10,10,13,13,34,34,92,92,8,0,34,34,47,47,92, - 92,98,98,102,102,110,110,114,114,116,116,3,0,48,57,65,70,97,102, - 2,0,10,10,13,13,3,0,9,10,13,13,32,32,1485,0,1,1,0,0,0,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,229,1,0,0,0,0,231,1,0,0,0,0, - 233,1,0,0,0,0,235,1,0,0,0,0,237,1,0,0,0,0,239,1,0,0,0,0,241,1,0, - 0,0,0,243,1,0,0,0,0,245,1,0,0,0,0,247,1,0,0,0,0,249,1,0,0,0,0,251, - 1,0,0,0,0,253,1,0,0,0,0,255,1,0,0,0,0,257,1,0,0,0,0,259,1,0,0,0, - 0,261,1,0,0,0,0,263,1,0,0,0,0,265,1,0,0,0,0,267,1,0,0,0,0,269,1, - 0,0,0,0,271,1,0,0,0,0,273,1,0,0,0,0,275,1,0,0,0,0,277,1,0,0,0,0, - 279,1,0,0,0,0,281,1,0,0,0,0,283,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,305,1,0,0,0,0,307,1,0,0,0,0,309,1,0,0,0, - 1,311,1,0,0,0,3,316,1,0,0,0,5,326,1,0,0,0,7,339,1,0,0,0,9,347,1, - 0,0,0,11,355,1,0,0,0,13,359,1,0,0,0,15,368,1,0,0,0,17,379,1,0,0, - 0,19,389,1,0,0,0,21,399,1,0,0,0,23,408,1,0,0,0,25,420,1,0,0,0,27, - 427,1,0,0,0,29,435,1,0,0,0,31,444,1,0,0,0,33,452,1,0,0,0,35,458, - 1,0,0,0,37,463,1,0,0,0,39,476,1,0,0,0,41,486,1,0,0,0,43,498,1,0, - 0,0,45,504,1,0,0,0,47,515,1,0,0,0,49,526,1,0,0,0,51,531,1,0,0,0, - 53,540,1,0,0,0,55,550,1,0,0,0,57,555,1,0,0,0,59,559,1,0,0,0,61,565, - 1,0,0,0,63,570,1,0,0,0,65,580,1,0,0,0,67,584,1,0,0,0,69,597,1,0, - 0,0,71,602,1,0,0,0,73,609,1,0,0,0,75,618,1,0,0,0,77,629,1,0,0,0, - 79,633,1,0,0,0,81,642,1,0,0,0,83,649,1,0,0,0,85,658,1,0,0,0,87,663, - 1,0,0,0,89,673,1,0,0,0,91,684,1,0,0,0,93,692,1,0,0,0,95,698,1,0, - 0,0,97,707,1,0,0,0,99,717,1,0,0,0,101,726,1,0,0,0,103,738,1,0,0, - 0,105,749,1,0,0,0,107,755,1,0,0,0,109,763,1,0,0,0,111,766,1,0,0, - 0,113,771,1,0,0,0,115,778,1,0,0,0,117,781,1,0,0,0,119,789,1,0,0, - 0,121,796,1,0,0,0,123,802,1,0,0,0,125,807,1,0,0,0,127,818,1,0,0, - 0,129,823,1,0,0,0,131,829,1,0,0,0,133,836,1,0,0,0,135,840,1,0,0, - 0,137,852,1,0,0,0,139,855,1,0,0,0,141,862,1,0,0,0,143,865,1,0,0, - 0,145,872,1,0,0,0,147,880,1,0,0,0,149,887,1,0,0,0,151,898,1,0,0, - 0,153,905,1,0,0,0,155,914,1,0,0,0,157,929,1,0,0,0,159,939,1,0,0, - 0,161,949,1,0,0,0,163,962,1,0,0,0,165,968,1,0,0,0,167,985,1,0,0, - 0,169,988,1,0,0,0,171,992,1,0,0,0,173,997,1,0,0,0,175,1003,1,0,0, - 0,177,1012,1,0,0,0,179,1021,1,0,0,0,181,1025,1,0,0,0,183,1029,1, - 0,0,0,185,1033,1,0,0,0,187,1039,1,0,0,0,189,1045,1,0,0,0,191,1050, - 1,0,0,0,193,1055,1,0,0,0,195,1061,1,0,0,0,197,1069,1,0,0,0,199,1077, - 1,0,0,0,201,1088,1,0,0,0,203,1093,1,0,0,0,205,1105,1,0,0,0,207,1116, - 1,0,0,0,209,1126,1,0,0,0,211,1138,1,0,0,0,213,1147,1,0,0,0,215,1152, - 1,0,0,0,217,1165,1,0,0,0,219,1177,1,0,0,0,221,1189,1,0,0,0,223,1194, - 1,0,0,0,225,1202,1,0,0,0,227,1207,1,0,0,0,229,1220,1,0,0,0,231,1228, - 1,0,0,0,233,1237,1,0,0,0,235,1251,1,0,0,0,237,1260,1,0,0,0,239,1265, - 1,0,0,0,241,1272,1,0,0,0,243,1277,1,0,0,0,245,1283,1,0,0,0,247,1290, - 1,0,0,0,249,1296,1,0,0,0,251,1302,1,0,0,0,253,1309,1,0,0,0,255,1316, - 1,0,0,0,257,1323,1,0,0,0,259,1328,1,0,0,0,261,1334,1,0,0,0,263,1339, - 1,0,0,0,265,1342,1,0,0,0,267,1344,1,0,0,0,269,1346,1,0,0,0,271,1348, - 1,0,0,0,273,1350,1,0,0,0,275,1352,1,0,0,0,277,1354,1,0,0,0,279,1356, - 1,0,0,0,281,1358,1,0,0,0,283,1360,1,0,0,0,285,1362,1,0,0,0,287,1364, - 1,0,0,0,289,1366,1,0,0,0,291,1368,1,0,0,0,293,1371,1,0,0,0,295,1379, - 1,0,0,0,297,1410,1,0,0,0,299,1417,1,0,0,0,301,1427,1,0,0,0,303,1437, - 1,0,0,0,305,1439,1,0,0,0,307,1450,1,0,0,0,309,1465,1,0,0,0,311,312, - 5,101,0,0,312,313,5,100,0,0,313,314,5,105,0,0,314,315,5,116,0,0, - 315,2,1,0,0,0,316,317,5,99,0,0,317,318,5,111,0,0,318,319,5,109,0, - 0,319,320,5,112,0,0,320,321,5,111,0,0,321,322,5,110,0,0,322,323, - 5,101,0,0,323,324,5,110,0,0,324,325,5,116,0,0,325,4,1,0,0,0,326, - 327,5,112,0,0,327,328,5,114,0,0,328,329,5,101,0,0,329,330,5,115, - 0,0,330,331,5,101,0,0,331,332,5,110,0,0,332,333,5,116,0,0,333,334, - 5,97,0,0,334,335,5,116,0,0,335,336,5,105,0,0,336,337,5,111,0,0,337, - 338,5,110,0,0,338,6,1,0,0,0,339,340,5,115,0,0,340,341,5,117,0,0, - 341,342,5,98,0,0,342,343,5,106,0,0,343,344,5,101,0,0,344,345,5,99, - 0,0,345,346,5,116,0,0,346,8,1,0,0,0,347,348,5,114,0,0,348,349,5, - 117,0,0,349,350,5,110,0,0,350,351,5,116,0,0,351,352,5,105,0,0,352, - 353,5,109,0,0,353,354,5,101,0,0,354,10,1,0,0,0,355,356,5,102,0,0, - 356,357,5,111,0,0,357,358,5,114,0,0,358,12,1,0,0,0,359,360,5,99, - 0,0,360,361,5,114,0,0,361,362,5,101,0,0,362,363,5,97,0,0,363,364, - 5,116,0,0,364,365,5,105,0,0,365,366,5,111,0,0,366,367,5,110,0,0, - 367,14,1,0,0,0,368,369,5,105,0,0,369,370,5,110,0,0,370,371,5,105, - 0,0,371,372,5,116,0,0,372,373,5,105,0,0,373,374,5,97,0,0,374,375, - 5,108,0,0,375,376,5,105,0,0,376,377,5,122,0,0,377,378,5,101,0,0, - 378,16,1,0,0,0,379,380,5,119,0,0,380,381,5,111,0,0,381,382,5,114, - 0,0,382,383,5,107,0,0,383,384,5,115,0,0,384,385,5,112,0,0,385,386, - 5,97,0,0,386,387,5,99,0,0,387,388,5,101,0,0,388,18,1,0,0,0,389,390, - 5,101,0,0,390,391,5,120,0,0,391,392,5,101,0,0,392,393,5,99,0,0,393, - 394,5,117,0,0,394,395,5,116,0,0,395,396,5,105,0,0,396,397,5,111, - 0,0,397,398,5,110,0,0,398,20,1,0,0,0,399,400,5,115,0,0,400,401,5, - 110,0,0,401,402,5,97,0,0,402,403,5,112,0,0,403,404,5,115,0,0,404, - 405,5,104,0,0,405,406,5,111,0,0,406,407,5,116,0,0,407,22,1,0,0,0, - 408,409,5,116,0,0,409,410,5,114,0,0,410,411,5,97,0,0,411,412,5,110, - 0,0,412,413,5,115,0,0,413,414,5,97,0,0,414,415,5,99,0,0,415,416, - 5,116,0,0,416,417,5,105,0,0,417,418,5,111,0,0,418,419,5,110,0,0, - 419,24,1,0,0,0,420,421,5,114,0,0,421,422,5,101,0,0,422,423,5,109, - 0,0,423,424,5,111,0,0,424,425,5,116,0,0,425,426,5,101,0,0,426,26, - 1,0,0,0,427,428,5,116,0,0,428,429,5,97,0,0,429,430,5,114,0,0,430, - 431,5,103,0,0,431,432,5,101,0,0,432,433,5,116,0,0,433,434,5,115, - 0,0,434,28,1,0,0,0,435,436,5,112,0,0,436,437,5,111,0,0,437,438,5, - 114,0,0,438,439,5,116,0,0,439,440,5,97,0,0,440,441,5,98,0,0,441, - 442,5,108,0,0,442,443,5,101,0,0,443,30,1,0,0,0,444,445,5,114,0,0, - 445,446,5,101,0,0,446,447,5,112,0,0,447,448,5,108,0,0,448,449,5, - 105,0,0,449,450,5,99,0,0,450,451,5,97,0,0,451,32,1,0,0,0,452,453, - 5,108,0,0,453,454,5,111,0,0,454,455,5,99,0,0,455,456,5,97,0,0,456, - 457,5,108,0,0,457,34,1,0,0,0,458,459,5,102,0,0,459,460,5,114,0,0, - 460,461,5,111,0,0,461,462,5,109,0,0,462,36,1,0,0,0,463,464,5,114, - 0,0,464,465,5,101,0,0,465,466,5,115,0,0,466,467,5,117,0,0,467,468, - 5,108,0,0,468,469,5,116,0,0,469,470,5,45,0,0,470,471,5,98,0,0,471, - 472,5,121,0,0,472,473,5,116,0,0,473,474,5,101,0,0,474,475,5,115, - 0,0,475,38,1,0,0,0,476,477,5,114,0,0,477,478,5,112,0,0,478,479,5, - 99,0,0,479,480,5,45,0,0,480,481,5,99,0,0,481,482,5,97,0,0,482,483, - 5,108,0,0,483,484,5,108,0,0,484,485,5,115,0,0,485,40,1,0,0,0,486, - 487,5,100,0,0,487,488,5,101,0,0,488,489,5,97,0,0,489,490,5,100,0, - 0,490,491,5,108,0,0,491,492,5,105,0,0,492,493,5,110,0,0,493,494, - 5,101,0,0,494,495,5,45,0,0,495,496,5,109,0,0,496,497,5,115,0,0,497, - 42,1,0,0,0,498,499,5,113,0,0,499,500,5,117,0,0,500,501,5,101,0,0, - 501,502,5,114,0,0,502,503,5,121,0,0,503,44,1,0,0,0,504,505,5,114, - 0,0,505,506,5,101,0,0,506,507,5,102,0,0,507,508,5,108,0,0,508,509, - 5,101,0,0,509,510,5,99,0,0,510,511,5,116,0,0,511,512,5,105,0,0,512, - 513,5,111,0,0,513,514,5,110,0,0,514,46,1,0,0,0,515,516,5,115,0,0, - 516,517,5,112,0,0,517,518,5,101,0,0,518,519,5,99,0,0,519,520,5,105, - 0,0,520,521,5,97,0,0,521,522,5,108,0,0,522,523,5,105,0,0,523,524, - 5,122,0,0,524,525,5,101,0,0,525,48,1,0,0,0,526,527,5,114,0,0,527, - 528,5,111,0,0,528,529,5,111,0,0,529,530,5,116,0,0,530,50,1,0,0,0, - 531,532,5,100,0,0,532,533,5,111,0,0,533,534,5,99,0,0,534,535,5,117, - 0,0,535,536,5,109,0,0,536,537,5,101,0,0,537,538,5,110,0,0,538,539, - 5,116,0,0,539,52,1,0,0,0,540,541,5,102,0,0,541,542,5,114,0,0,542, - 543,5,97,0,0,543,544,5,103,0,0,544,545,5,109,0,0,545,546,5,101,0, - 0,546,547,5,110,0,0,547,548,5,116,0,0,548,549,5,115,0,0,549,54,1, - 0,0,0,550,551,5,118,0,0,551,552,5,105,0,0,552,553,5,101,0,0,553, - 554,5,119,0,0,554,56,1,0,0,0,555,556,5,109,0,0,556,557,5,97,0,0, - 557,558,5,120,0,0,558,58,1,0,0,0,559,560,5,97,0,0,560,561,5,108, - 0,0,561,562,5,108,0,0,562,563,5,111,0,0,563,564,5,119,0,0,564,60, - 1,0,0,0,565,566,5,112,0,0,566,567,5,111,0,0,567,568,5,108,0,0,568, - 569,5,108,0,0,569,62,1,0,0,0,570,571,5,113,0,0,571,572,5,117,0,0, - 572,573,5,101,0,0,573,574,5,114,0,0,574,575,5,121,0,0,575,576,5, - 97,0,0,576,577,5,98,0,0,577,578,5,108,0,0,578,579,5,101,0,0,579, - 64,1,0,0,0,580,581,5,114,0,0,581,582,5,112,0,0,582,583,5,99,0,0, - 583,66,1,0,0,0,584,585,5,113,0,0,585,586,5,117,0,0,586,587,5,101, - 0,0,587,588,5,114,0,0,588,589,5,121,0,0,589,590,5,45,0,0,590,591, - 5,114,0,0,591,592,5,101,0,0,592,593,5,97,0,0,593,594,5,115,0,0,594, - 595,5,111,0,0,595,596,5,110,0,0,596,68,1,0,0,0,597,598,5,116,0,0, - 598,599,5,121,0,0,599,600,5,112,0,0,600,601,5,101,0,0,601,70,1,0, - 0,0,602,603,5,111,0,0,603,604,5,98,0,0,604,605,5,106,0,0,605,606, - 5,101,0,0,606,607,5,99,0,0,607,608,5,116,0,0,608,72,1,0,0,0,609, - 610,5,115,0,0,610,611,5,116,0,0,611,612,5,111,0,0,612,613,5,114, - 0,0,613,614,5,97,0,0,614,615,5,98,0,0,615,616,5,108,0,0,616,617, - 5,101,0,0,617,74,1,0,0,0,618,619,5,105,0,0,619,620,5,109,0,0,620, - 621,5,112,0,0,621,622,5,108,0,0,622,623,5,101,0,0,623,624,5,109, - 0,0,624,625,5,101,0,0,625,626,5,110,0,0,626,627,5,116,0,0,627,628, - 5,115,0,0,628,76,1,0,0,0,629,630,5,114,0,0,630,631,5,101,0,0,631, - 632,5,102,0,0,632,78,1,0,0,0,633,634,5,102,0,0,634,635,5,114,0,0, - 635,636,5,97,0,0,636,637,5,103,0,0,637,638,5,109,0,0,638,639,5,101, - 0,0,639,640,5,110,0,0,640,641,5,116,0,0,641,80,1,0,0,0,642,643,5, - 105,0,0,643,644,5,109,0,0,644,645,5,112,0,0,645,646,5,111,0,0,646, - 647,5,114,0,0,647,648,5,116,0,0,648,82,1,0,0,0,649,650,5,101,0,0, - 650,651,5,120,0,0,651,652,5,116,0,0,652,653,5,101,0,0,653,654,5, - 114,0,0,654,655,5,110,0,0,655,656,5,97,0,0,656,657,5,108,0,0,657, - 84,1,0,0,0,658,659,5,97,0,0,659,660,5,116,0,0,660,661,5,111,0,0, - 661,662,5,109,0,0,662,86,1,0,0,0,663,664,5,105,0,0,664,665,5,110, - 0,0,665,666,5,116,0,0,666,667,5,101,0,0,667,668,5,114,0,0,668,669, - 5,102,0,0,669,670,5,97,0,0,670,671,5,99,0,0,671,672,5,101,0,0,672, - 88,1,0,0,0,673,674,5,105,0,0,674,675,5,110,0,0,675,676,5,116,0,0, - 676,677,5,101,0,0,677,678,5,114,0,0,678,679,5,102,0,0,679,680,5, - 97,0,0,680,681,5,99,0,0,681,682,5,101,0,0,682,683,5,115,0,0,683, - 90,1,0,0,0,684,685,5,112,0,0,685,686,5,97,0,0,686,687,5,99,0,0,687, - 688,5,107,0,0,688,689,5,97,0,0,689,690,5,103,0,0,690,691,5,101,0, - 0,691,92,1,0,0,0,692,693,5,118,0,0,693,694,5,97,0,0,694,695,5,108, - 0,0,695,696,5,117,0,0,696,697,5,101,0,0,697,94,1,0,0,0,698,699,5, - 114,0,0,699,700,5,101,0,0,700,701,5,108,0,0,701,702,5,97,0,0,702, - 703,5,116,0,0,703,704,5,105,0,0,704,705,5,111,0,0,705,706,5,110, - 0,0,706,96,1,0,0,0,707,708,5,111,0,0,708,709,5,112,0,0,709,710,5, - 101,0,0,710,711,5,114,0,0,711,712,5,97,0,0,712,713,5,116,0,0,713, - 714,5,105,0,0,714,715,5,111,0,0,715,716,5,110,0,0,716,98,1,0,0,0, - 717,718,5,102,0,0,718,719,5,117,0,0,719,720,5,110,0,0,720,721,5, - 99,0,0,721,722,5,116,0,0,722,723,5,105,0,0,723,724,5,111,0,0,724, - 725,5,110,0,0,725,100,1,0,0,0,726,727,5,99,0,0,727,728,5,111,0,0, - 728,729,5,110,0,0,729,730,5,115,0,0,730,731,5,116,0,0,731,732,5, - 114,0,0,732,733,5,117,0,0,733,734,5,99,0,0,734,735,5,116,0,0,735, - 736,5,111,0,0,736,737,5,114,0,0,737,102,1,0,0,0,738,739,5,99,0,0, - 739,740,5,111,0,0,740,741,5,110,0,0,741,742,5,115,0,0,742,743,5, - 116,0,0,743,744,5,114,0,0,744,745,5,117,0,0,745,746,5,99,0,0,746, - 747,5,116,0,0,747,748,5,115,0,0,748,104,1,0,0,0,749,750,5,105,0, - 0,750,751,5,110,0,0,751,752,5,112,0,0,752,753,5,117,0,0,753,754, - 5,116,0,0,754,106,1,0,0,0,755,756,5,99,0,0,756,757,5,111,0,0,757, - 758,5,110,0,0,758,759,5,102,0,0,759,760,5,111,0,0,760,761,5,114, - 0,0,761,762,5,109,0,0,762,108,1,0,0,0,763,764,5,97,0,0,764,765,5, - 115,0,0,765,110,1,0,0,0,766,767,5,98,0,0,767,768,5,105,0,0,768,769, - 5,110,0,0,769,770,5,100,0,0,770,112,1,0,0,0,771,772,5,115,0,0,772, - 773,5,116,0,0,773,774,5,97,0,0,774,775,5,116,0,0,775,776,5,105,0, - 0,776,777,5,99,0,0,777,114,1,0,0,0,778,779,5,116,0,0,779,780,5,111, - 0,0,780,116,1,0,0,0,781,782,5,112,0,0,782,783,5,114,0,0,783,784, - 5,105,0,0,784,785,5,118,0,0,785,786,5,97,0,0,786,787,5,116,0,0,787, - 788,5,101,0,0,788,118,1,0,0,0,789,790,5,115,0,0,790,791,5,104,0, - 0,791,792,5,97,0,0,792,793,5,114,0,0,793,794,5,101,0,0,794,795,5, - 100,0,0,795,120,1,0,0,0,796,797,5,115,0,0,797,798,5,116,0,0,798, - 799,5,97,0,0,799,800,5,116,0,0,800,801,5,101,0,0,801,122,1,0,0,0, - 802,803,5,101,0,0,803,804,5,100,0,0,804,805,5,103,0,0,805,806,5, - 101,0,0,806,124,1,0,0,0,807,808,5,112,0,0,808,809,5,114,0,0,809, - 810,5,111,0,0,810,811,5,106,0,0,811,812,5,101,0,0,812,813,5,99,0, - 0,813,814,5,116,0,0,814,815,5,105,0,0,815,816,5,111,0,0,816,817, - 5,110,0,0,817,126,1,0,0,0,818,819,5,119,0,0,819,820,5,105,0,0,820, - 821,5,116,0,0,821,822,5,104,0,0,822,128,1,0,0,0,823,824,5,117,0, - 0,824,825,5,115,0,0,825,826,5,105,0,0,826,827,5,110,0,0,827,828, - 5,103,0,0,828,130,1,0,0,0,829,830,5,97,0,0,830,831,5,99,0,0,831, - 832,5,99,0,0,832,833,5,101,0,0,833,834,5,112,0,0,834,835,5,116,0, - 0,835,132,1,0,0,0,836,837,5,118,0,0,837,838,5,105,0,0,838,839,5, - 97,0,0,839,134,1,0,0,0,840,841,5,109,0,0,841,842,5,97,0,0,842,843, - 5,116,0,0,843,844,5,101,0,0,844,845,5,114,0,0,845,846,5,105,0,0, - 846,847,5,97,0,0,847,848,5,108,0,0,848,849,5,105,0,0,849,850,5,122, - 0,0,850,851,5,101,0,0,851,136,1,0,0,0,852,853,5,105,0,0,853,854, - 5,102,0,0,854,138,1,0,0,0,855,856,5,97,0,0,856,857,5,98,0,0,857, - 858,5,115,0,0,858,859,5,101,0,0,859,860,5,110,0,0,860,861,5,116, - 0,0,861,140,1,0,0,0,862,863,5,111,0,0,863,864,5,110,0,0,864,142, - 1,0,0,0,865,866,5,112,0,0,866,867,5,111,0,0,867,868,5,108,0,0,868, - 869,5,105,0,0,869,870,5,99,0,0,870,871,5,121,0,0,871,144,1,0,0,0, - 872,873,5,100,0,0,873,874,5,101,0,0,874,875,5,102,0,0,875,876,5, - 97,0,0,876,877,5,117,0,0,877,878,5,108,0,0,878,879,5,116,0,0,879, - 146,1,0,0,0,880,881,5,115,0,0,881,882,5,111,0,0,882,883,5,117,0, - 0,883,884,5,114,0,0,884,885,5,99,0,0,885,886,5,101,0,0,886,148,1, - 0,0,0,887,888,5,114,0,0,888,889,5,101,0,0,889,890,5,112,0,0,890, - 891,5,111,0,0,891,892,5,115,0,0,892,893,5,105,0,0,893,894,5,116, - 0,0,894,895,5,111,0,0,895,896,5,114,0,0,896,897,5,121,0,0,897,150, - 1,0,0,0,898,899,5,99,0,0,899,900,5,111,0,0,900,901,5,109,0,0,901, - 902,5,109,0,0,902,903,5,105,0,0,903,904,5,116,0,0,904,152,1,0,0, - 0,905,906,5,114,0,0,906,907,5,101,0,0,907,908,5,118,0,0,908,909, - 5,105,0,0,909,910,5,115,0,0,910,911,5,105,0,0,911,912,5,111,0,0, - 912,913,5,110,0,0,913,154,1,0,0,0,914,915,5,115,0,0,915,916,5,101, - 0,0,916,917,5,109,0,0,917,918,5,97,0,0,918,919,5,110,0,0,919,920, - 5,116,0,0,920,921,5,105,0,0,921,922,5,99,0,0,922,923,5,45,0,0,923, - 924,5,109,0,0,924,925,5,97,0,0,925,926,5,106,0,0,926,927,5,111,0, - 0,927,928,5,114,0,0,928,156,1,0,0,0,929,930,5,111,0,0,930,931,5, - 110,0,0,931,932,5,45,0,0,932,933,5,100,0,0,933,934,5,101,0,0,934, - 935,5,108,0,0,935,936,5,101,0,0,936,937,5,116,0,0,937,938,5,101, - 0,0,938,158,1,0,0,0,939,940,5,108,0,0,940,941,5,105,0,0,941,942, - 5,102,0,0,942,943,5,101,0,0,943,944,5,99,0,0,944,945,5,121,0,0,945, - 946,5,99,0,0,946,947,5,108,0,0,947,948,5,101,0,0,948,160,1,0,0,0, - 949,950,5,114,0,0,950,951,5,101,0,0,951,952,5,116,0,0,952,953,5, - 97,0,0,953,954,5,105,0,0,954,955,5,110,0,0,955,956,5,45,0,0,956, - 957,5,111,0,0,957,958,5,116,0,0,958,959,5,104,0,0,959,960,5,101, - 0,0,960,961,5,114,0,0,961,162,1,0,0,0,962,963,5,107,0,0,963,964, - 5,101,0,0,964,965,5,121,0,0,965,966,5,101,0,0,966,967,5,100,0,0, - 967,164,1,0,0,0,968,969,5,112,0,0,969,970,5,117,0,0,970,971,5,98, - 0,0,971,972,5,108,0,0,972,973,5,105,0,0,973,974,5,99,0,0,974,975, - 5,45,0,0,975,976,5,116,0,0,976,977,5,114,0,0,977,978,5,97,0,0,978, - 979,5,118,0,0,979,980,5,101,0,0,980,981,5,114,0,0,981,982,5,115, - 0,0,982,983,5,97,0,0,983,984,5,108,0,0,984,166,1,0,0,0,985,986,5, - 105,0,0,986,987,5,100,0,0,987,168,1,0,0,0,988,989,5,100,0,0,989, - 990,5,111,0,0,990,991,5,99,0,0,991,170,1,0,0,0,992,993,5,109,0,0, - 993,994,5,111,0,0,994,995,5,100,0,0,995,996,5,101,0,0,996,172,1, - 0,0,0,997,998,5,101,0,0,998,999,5,109,0,0,999,1000,5,105,0,0,1000, - 1001,5,116,0,0,1001,1002,5,115,0,0,1002,174,1,0,0,0,1003,1004,5, - 114,0,0,1004,1005,5,101,0,0,1005,1006,5,99,0,0,1006,1007,5,101,0, - 0,1007,1008,5,105,0,0,1008,1009,5,118,0,0,1009,1010,5,101,0,0,1010, - 1011,5,114,0,0,1011,176,1,0,0,0,1012,1013,5,114,0,0,1013,1014,5, - 101,0,0,1014,1015,5,113,0,0,1015,1016,5,117,0,0,1016,1017,5,105, - 0,0,1017,1018,5,114,0,0,1018,1019,5,101,0,0,1019,1020,5,115,0,0, - 1020,178,1,0,0,0,1021,1022,5,97,0,0,1022,1023,5,110,0,0,1023,1024, - 5,121,0,0,1024,180,1,0,0,0,1025,1026,5,103,0,0,1026,1027,5,101,0, - 0,1027,1028,5,116,0,0,1028,182,1,0,0,0,1029,1030,5,115,0,0,1030, - 1031,5,101,0,0,1031,1032,5,116,0,0,1032,184,1,0,0,0,1033,1034,5, - 119,0,0,1034,1035,5,97,0,0,1035,1036,5,116,0,0,1036,1037,5,99,0, - 0,1037,1038,5,104,0,0,1038,186,1,0,0,0,1039,1040,5,115,0,0,1040, - 1041,5,116,0,0,1041,1042,5,97,0,0,1042,1043,5,114,0,0,1043,1044, - 5,116,0,0,1044,188,1,0,0,0,1045,1046,5,115,0,0,1046,1047,5,116,0, - 0,1047,1048,5,111,0,0,1048,1049,5,112,0,0,1049,190,1,0,0,0,1050, - 1051,5,114,0,0,1051,1052,5,101,0,0,1052,1053,5,97,0,0,1053,1054, - 5,100,0,0,1054,192,1,0,0,0,1055,1056,5,119,0,0,1056,1057,5,114,0, - 0,1057,1058,5,105,0,0,1058,1059,5,116,0,0,1059,1060,5,101,0,0,1060, - 194,1,0,0,0,1061,1062,5,114,0,0,1062,1063,5,101,0,0,1063,1064,5, - 115,0,0,1064,1065,5,111,0,0,1065,1066,5,108,0,0,1066,1067,5,118, - 0,0,1067,1068,5,101,0,0,1068,196,1,0,0,0,1069,1070,5,99,0,0,1070, - 1071,5,111,0,0,1071,1072,5,110,0,0,1072,1073,5,110,0,0,1073,1074, - 5,101,0,0,1074,1075,5,99,0,0,1075,1076,5,116,0,0,1076,198,1,0,0, - 0,1077,1078,5,100,0,0,1078,1079,5,105,0,0,1079,1080,5,115,0,0,1080, - 1081,5,99,0,0,1081,1082,5,111,0,0,1082,1083,5,110,0,0,1083,1084, - 5,110,0,0,1084,1085,5,101,0,0,1085,1086,5,99,0,0,1086,1087,5,116, - 0,0,1087,200,1,0,0,0,1088,1089,5,99,0,0,1089,1090,5,97,0,0,1090, - 1091,5,108,0,0,1091,1092,5,108,0,0,1092,202,1,0,0,0,1093,1094,5, - 119,0,0,1094,1095,5,97,0,0,1095,1096,5,116,0,0,1096,1097,5,99,0, - 0,1097,1098,5,104,0,0,1098,1099,5,45,0,0,1099,1100,5,115,0,0,1100, - 1101,5,116,0,0,1101,1102,5,97,0,0,1102,1103,5,114,0,0,1103,1104, - 5,116,0,0,1104,204,1,0,0,0,1105,1106,5,119,0,0,1106,1107,5,97,0, - 0,1107,1108,5,116,0,0,1108,1109,5,99,0,0,1109,1110,5,104,0,0,1110, - 1111,5,45,0,0,1111,1112,5,115,0,0,1112,1113,5,116,0,0,1113,1114, - 5,111,0,0,1114,1115,5,112,0,0,1115,206,1,0,0,0,1116,1117,5,115,0, - 0,1117,1118,5,117,0,0,1118,1119,5,98,0,0,1119,1120,5,115,0,0,1120, - 1121,5,99,0,0,1121,1122,5,114,0,0,1122,1123,5,105,0,0,1123,1124, - 5,98,0,0,1124,1125,5,101,0,0,1125,208,1,0,0,0,1126,1127,5,117,0, - 0,1127,1128,5,110,0,0,1128,1129,5,115,0,0,1129,1130,5,117,0,0,1130, - 1131,5,98,0,0,1131,1132,5,115,0,0,1132,1133,5,99,0,0,1133,1134,5, - 114,0,0,1134,1135,5,105,0,0,1135,1136,5,98,0,0,1136,1137,5,101,0, - 0,1137,210,1,0,0,0,1138,1139,5,114,0,0,1139,1140,5,101,0,0,1140, - 1141,5,103,0,0,1141,1142,5,105,0,0,1142,1143,5,115,0,0,1143,1144, - 5,116,0,0,1144,1145,5,101,0,0,1145,1146,5,114,0,0,1146,212,1,0,0, - 0,1147,1148,5,99,0,0,1148,1149,5,114,0,0,1149,1150,5,100,0,0,1150, - 1151,5,116,0,0,1151,214,1,0,0,0,1152,1153,5,111,0,0,1153,1154,5, - 112,0,0,1154,1155,5,116,0,0,1155,1156,5,105,0,0,1156,1157,5,111, - 0,0,1157,1158,5,110,0,0,1158,1159,5,97,0,0,1159,1160,5,108,0,0,1160, - 1161,5,45,0,0,1161,1162,5,111,0,0,1162,1163,5,110,0,0,1163,1164, - 5,101,0,0,1164,216,1,0,0,0,1165,1166,5,101,0,0,1166,1167,5,120,0, - 0,1167,1168,5,97,0,0,1168,1169,5,99,0,0,1169,1170,5,116,0,0,1170, - 1171,5,108,0,0,1171,1172,5,121,0,0,1172,1173,5,45,0,0,1173,1174, - 5,111,0,0,1174,1175,5,110,0,0,1175,1176,5,101,0,0,1176,218,1,0,0, - 0,1177,1178,5,109,0,0,1178,1179,5,97,0,0,1179,1180,5,110,0,0,1180, - 1181,5,121,0,0,1181,1182,5,45,0,0,1182,1183,5,117,0,0,1183,1184, - 5,110,0,0,1184,1185,5,105,0,0,1185,1186,5,113,0,0,1186,1187,5,117, - 0,0,1187,1188,5,101,0,0,1188,220,1,0,0,0,1189,1190,5,109,0,0,1190, - 1191,5,97,0,0,1191,1192,5,110,0,0,1192,1193,5,121,0,0,1193,222,1, - 0,0,0,1194,1195,5,111,0,0,1195,1196,5,114,0,0,1196,1197,5,100,0, - 0,1197,1198,5,101,0,0,1198,1199,5,114,0,0,1199,1200,5,101,0,0,1200, - 1201,5,100,0,0,1201,224,1,0,0,0,1202,1203,5,117,0,0,1203,1204,5, - 110,0,0,1204,1205,5,105,0,0,1205,1206,5,116,0,0,1206,226,1,0,0,0, - 1207,1208,5,119,0,0,1208,1209,5,97,0,0,1209,1210,5,116,0,0,1210, - 1211,5,99,0,0,1211,1212,5,104,0,0,1212,1213,5,45,0,0,1213,1214,5, - 104,0,0,1214,1215,5,97,0,0,1215,1216,5,110,0,0,1216,1217,5,100,0, - 0,1217,1218,5,108,0,0,1218,1219,5,101,0,0,1219,228,1,0,0,0,1220, - 1221,5,109,0,0,1221,1222,5,101,0,0,1222,1223,5,115,0,0,1223,1224, - 5,115,0,0,1224,1225,5,97,0,0,1225,1226,5,103,0,0,1226,1227,5,101, - 0,0,1227,230,1,0,0,0,1228,1229,5,97,0,0,1229,1230,5,116,0,0,1230, - 1231,5,111,0,0,1231,1232,5,109,0,0,1232,1233,5,45,0,0,1233,1234, - 5,114,0,0,1234,1235,5,101,0,0,1235,1236,5,102,0,0,1236,232,1,0,0, - 0,1237,1238,5,105,0,0,1238,1239,5,110,0,0,1239,1240,5,116,0,0,1240, - 1241,5,101,0,0,1241,1242,5,114,0,0,1242,1243,5,102,0,0,1243,1244, - 5,97,0,0,1244,1245,5,99,0,0,1245,1246,5,101,0,0,1246,1247,5,45,0, - 0,1247,1248,5,114,0,0,1248,1249,5,101,0,0,1249,1250,5,102,0,0,1250, - 234,1,0,0,0,1251,1252,5,111,0,0,1252,1253,5,112,0,0,1253,1254,5, - 116,0,0,1254,1255,5,105,0,0,1255,1256,5,111,0,0,1256,1257,5,110, - 0,0,1257,1258,5,97,0,0,1258,1259,5,108,0,0,1259,236,1,0,0,0,1260, - 1261,5,108,0,0,1261,1262,5,105,0,0,1262,1263,5,115,0,0,1263,1264, - 5,116,0,0,1264,238,1,0,0,0,1265,1266,5,114,0,0,1266,1267,5,101,0, - 0,1267,1268,5,99,0,0,1268,1269,5,111,0,0,1269,1270,5,114,0,0,1270, - 1271,5,100,0,0,1271,240,1,0,0,0,1272,1273,5,98,0,0,1273,1274,5,111, - 0,0,1274,1275,5,111,0,0,1275,1276,5,108,0,0,1276,242,1,0,0,0,1277, - 1278,5,98,0,0,1278,1279,5,121,0,0,1279,1280,5,116,0,0,1280,1281, - 5,101,0,0,1281,1282,5,115,0,0,1282,244,1,0,0,0,1283,1284,5,100,0, - 0,1284,1285,5,111,0,0,1285,1286,5,117,0,0,1286,1287,5,98,0,0,1287, - 1288,5,108,0,0,1288,1289,5,101,0,0,1289,246,1,0,0,0,1290,1291,5, - 105,0,0,1291,1292,5,110,0,0,1292,1293,5,116,0,0,1293,1294,5,51,0, - 0,1294,1295,5,50,0,0,1295,248,1,0,0,0,1296,1297,5,105,0,0,1297,1298, - 5,110,0,0,1298,1299,5,116,0,0,1299,1300,5,54,0,0,1300,1301,5,52, - 0,0,1301,250,1,0,0,0,1302,1303,5,115,0,0,1303,1304,5,116,0,0,1304, - 1305,5,114,0,0,1305,1306,5,105,0,0,1306,1307,5,110,0,0,1307,1308, - 5,103,0,0,1308,252,1,0,0,0,1309,1310,5,117,0,0,1310,1311,5,105,0, - 0,1311,1312,5,110,0,0,1312,1313,5,116,0,0,1313,1314,5,51,0,0,1314, - 1315,5,50,0,0,1315,254,1,0,0,0,1316,1317,5,117,0,0,1317,1318,5,105, - 0,0,1318,1319,5,110,0,0,1319,1320,5,116,0,0,1320,1321,5,54,0,0,1321, - 1322,5,52,0,0,1322,256,1,0,0,0,1323,1324,5,116,0,0,1324,1325,5,114, - 0,0,1325,1326,5,117,0,0,1326,1327,5,101,0,0,1327,258,1,0,0,0,1328, - 1329,5,102,0,0,1329,1330,5,97,0,0,1330,1331,5,108,0,0,1331,1332, - 5,115,0,0,1332,1333,5,101,0,0,1333,260,1,0,0,0,1334,1335,5,110,0, - 0,1335,1336,5,117,0,0,1336,1337,5,108,0,0,1337,1338,5,108,0,0,1338, - 262,1,0,0,0,1339,1340,5,45,0,0,1340,1341,5,62,0,0,1341,264,1,0,0, - 0,1342,1343,5,58,0,0,1343,266,1,0,0,0,1344,1345,5,59,0,0,1345,268, - 1,0,0,0,1346,1347,5,44,0,0,1347,270,1,0,0,0,1348,1349,5,46,0,0,1349, - 272,1,0,0,0,1350,1351,5,123,0,0,1351,274,1,0,0,0,1352,1353,5,125, - 0,0,1353,276,1,0,0,0,1354,1355,5,91,0,0,1355,278,1,0,0,0,1356,1357, - 5,93,0,0,1357,280,1,0,0,0,1358,1359,5,40,0,0,1359,282,1,0,0,0,1360, - 1361,5,41,0,0,1361,284,1,0,0,0,1362,1363,5,60,0,0,1363,286,1,0,0, - 0,1364,1365,5,62,0,0,1365,288,1,0,0,0,1366,1367,5,38,0,0,1367,290, - 1,0,0,0,1368,1369,5,61,0,0,1369,292,1,0,0,0,1370,1372,5,45,0,0,1371, - 1370,1,0,0,0,1371,1372,1,0,0,0,1372,1374,1,0,0,0,1373,1375,7,0,0, - 0,1374,1373,1,0,0,0,1375,1376,1,0,0,0,1376,1374,1,0,0,0,1376,1377, - 1,0,0,0,1377,294,1,0,0,0,1378,1380,5,45,0,0,1379,1378,1,0,0,0,1379, - 1380,1,0,0,0,1380,1389,1,0,0,0,1381,1390,5,48,0,0,1382,1386,7,1, - 0,0,1383,1385,7,0,0,0,1384,1383,1,0,0,0,1385,1388,1,0,0,0,1386,1384, - 1,0,0,0,1386,1387,1,0,0,0,1387,1390,1,0,0,0,1388,1386,1,0,0,0,1389, - 1381,1,0,0,0,1389,1382,1,0,0,0,1390,1397,1,0,0,0,1391,1393,5,46, - 0,0,1392,1394,7,0,0,0,1393,1392,1,0,0,0,1394,1395,1,0,0,0,1395,1393, - 1,0,0,0,1395,1396,1,0,0,0,1396,1398,1,0,0,0,1397,1391,1,0,0,0,1397, - 1398,1,0,0,0,1398,1408,1,0,0,0,1399,1401,7,2,0,0,1400,1402,7,3,0, - 0,1401,1400,1,0,0,0,1401,1402,1,0,0,0,1402,1404,1,0,0,0,1403,1405, - 7,0,0,0,1404,1403,1,0,0,0,1405,1406,1,0,0,0,1406,1404,1,0,0,0,1406, - 1407,1,0,0,0,1407,1409,1,0,0,0,1408,1399,1,0,0,0,1408,1409,1,0,0, - 0,1409,296,1,0,0,0,1410,1414,7,4,0,0,1411,1413,7,5,0,0,1412,1411, - 1,0,0,0,1413,1416,1,0,0,0,1414,1412,1,0,0,0,1414,1415,1,0,0,0,1415, - 298,1,0,0,0,1416,1414,1,0,0,0,1417,1422,5,34,0,0,1418,1421,3,301, - 150,0,1419,1421,8,6,0,0,1420,1418,1,0,0,0,1420,1419,1,0,0,0,1421, - 1424,1,0,0,0,1422,1420,1,0,0,0,1422,1423,1,0,0,0,1423,1425,1,0,0, - 0,1424,1422,1,0,0,0,1425,1426,5,34,0,0,1426,300,1,0,0,0,1427,1435, - 5,92,0,0,1428,1436,7,7,0,0,1429,1430,5,117,0,0,1430,1431,3,303,151, - 0,1431,1432,3,303,151,0,1432,1433,3,303,151,0,1433,1434,3,303,151, - 0,1434,1436,1,0,0,0,1435,1428,1,0,0,0,1435,1429,1,0,0,0,1436,302, - 1,0,0,0,1437,1438,7,8,0,0,1438,304,1,0,0,0,1439,1440,5,47,0,0,1440, - 1441,5,47,0,0,1441,1445,1,0,0,0,1442,1444,8,9,0,0,1443,1442,1,0, - 0,0,1444,1447,1,0,0,0,1445,1443,1,0,0,0,1445,1446,1,0,0,0,1446,1448, - 1,0,0,0,1447,1445,1,0,0,0,1448,1449,6,152,0,0,1449,306,1,0,0,0,1450, - 1451,5,47,0,0,1451,1452,5,42,0,0,1452,1456,1,0,0,0,1453,1455,9,0, - 0,0,1454,1453,1,0,0,0,1455,1458,1,0,0,0,1456,1457,1,0,0,0,1456,1454, - 1,0,0,0,1457,1459,1,0,0,0,1458,1456,1,0,0,0,1459,1460,5,42,0,0,1460, - 1461,5,47,0,0,1461,1462,1,0,0,0,1462,1463,6,153,0,0,1463,308,1,0, - 0,0,1464,1466,7,10,0,0,1465,1464,1,0,0,0,1466,1467,1,0,0,0,1467, - 1465,1,0,0,0,1467,1468,1,0,0,0,1468,1469,1,0,0,0,1469,1470,6,154, - 0,0,1470,310,1,0,0,0,18,0,1371,1376,1379,1386,1389,1395,1397,1401, - 1406,1408,1414,1420,1422,1435,1445,1456,1467,1,0,1,0 + 1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3, + 1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4, + 1,5,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,7,1,7,1,7, + 1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8, + 1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1, + 10,1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1, + 11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1, + 13,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,1, + 14,1,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,18,1,18,1,18,1,18,1,18,1,19,1,19,1,19,1,19,1, + 19,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,21,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,23,1,23,1,24,1,24,1,24,1,24,1,24,1,25,1, + 25,1,25,1,25,1,25,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,26,1,26,1,27,1,27,1,27,1,27,1,27,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,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,33,1,33,1,33,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,35,1,35,1,35,1,36,1, + 36,1,36,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,37,1,37,1,37,1,37,1,38,1,38,1,38,1,38,1,39,1,39,1,39,1, + 39,1,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1, + 41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,42,1,42,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,44,1,44,1, + 44,1,44,1,44,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,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,48,1,48,1,48,1,48,1, + 48,1,48,1,48,1,49,1,49,1,49,1,49,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,50,1,50,1,50,1,50,1,51,1,51,1, + 51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,52,1,52,1,52,1,52,1, + 52,1,52,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,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,56,1,57,1, + 57,1,57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,59,1,59,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,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1, + 63,1,63,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,65,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,67,1,67,1,68,1,68,1,68,1,69,1,69,1, + 69,1,69,1,69,1,69,1,69,1,70,1,70,1,70,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,73,1,74,1,74,1,74,1,74,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,75,1,76,1,76,1,76,1,76,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,77,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,78,1,78,1,78,1,79,1,79,1,79,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,80,1,80,1,80,1,80,1,80,1, + 80,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,82,1,82,1,82,1,82,1,82,1,82,1,82,1,83,1,83,1, + 83,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,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,89,1,89,1,89,1,89,1,90,1, + 90,1,90,1,90,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1,92,1,92,1,92,1, + 93,1,93,1,93,1,93,1,93,1,93,1,94,1,94,1,94,1,94,1,94,1,95,1,95,1, + 95,1,95,1,95,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,97,1,97,1,98,1,98,1,98,1,98,1,98,1,98,1,98,1,98,1,99,1, + 99,1,99,1,99,1,99,1,99,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,101,1,101,1,101, + 1,101,1,101,1,101,1,102,1,102,1,102,1,102,1,102,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,103, + 1,103,1,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,105,1,105,1,105,1,105,1,105,1,105,1,105,1,105, + 1,105,1,106,1,106,1,106,1,106,1,106,1,107,1,107,1,107,1,107,1,107, + 1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,108,1,108,1,108, + 1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,109,1,109, + 1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,110, + 1,110,1,110,1,110,1,110,1,111,1,111,1,111,1,111,1,111,1,111,1,111, + 1,111,1,112,1,112,1,112,1,112,1,112,1,113,1,113,1,113,1,113,1,113, + 1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,114,1,114,1,114, + 1,114,1,114,1,114,1,114,1,114,1,115,1,115,1,115,1,115,1,115,1,115, + 1,115,1,115,1,115,1,116,1,116,1,116,1,116,1,116,1,116,1,116,1,116, + 1,116,1,116,1,116,1,116,1,116,1,116,1,117,1,117,1,117,1,117,1,117, + 1,117,1,117,1,117,1,117,1,118,1,118,1,118,1,118,1,118,1,119,1,119, + 1,119,1,119,1,119,1,119,1,119,1,120,1,120,1,120,1,120,1,120,1,121, + 1,121,1,121,1,121,1,121,1,121,1,122,1,122,1,122,1,122,1,122,1,122, + 1,122,1,123,1,123,1,123,1,123,1,123,1,123,1,124,1,124,1,124,1,124, + 1,124,1,124,1,125,1,125,1,125,1,125,1,125,1,125,1,125,1,126,1,126, + 1,126,1,126,1,126,1,126,1,126,1,127,1,127,1,127,1,127,1,127,1,127, + 1,127,1,128,1,128,1,128,1,128,1,128,1,129,1,129,1,129,1,129,1,129, + 1,129,1,130,1,130,1,130,1,130,1,130,1,131,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,144,1,144,1,145,1,145,1,146,3,146,1370,8,146,1,146,4,146,1373, + 8,146,11,146,12,146,1374,1,147,3,147,1378,8,147,1,147,1,147,1,147, + 5,147,1383,8,147,10,147,12,147,1386,9,147,3,147,1388,8,147,1,147, + 1,147,4,147,1392,8,147,11,147,12,147,1393,3,147,1396,8,147,1,147, + 1,147,3,147,1400,8,147,1,147,4,147,1403,8,147,11,147,12,147,1404, + 3,147,1407,8,147,1,148,1,148,5,148,1411,8,148,10,148,12,148,1414, + 9,148,1,149,1,149,1,149,5,149,1419,8,149,10,149,12,149,1422,9,149, + 1,149,1,149,1,150,1,150,1,150,1,150,1,150,1,150,1,150,1,150,3,150, + 1434,8,150,1,151,1,151,1,152,1,152,1,152,1,152,5,152,1442,8,152, + 10,152,12,152,1445,9,152,1,152,1,152,1,153,1,153,1,153,1,153,5,153, + 1453,8,153,10,153,12,153,1456,9,153,1,153,1,153,1,153,1,153,1,153, + 1,154,4,154,1464,8,154,11,154,12,154,1465,1,154,1,154,1,1454,0,155, + 1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13, + 27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,47,24, + 49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,69,35, + 71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45,91,46, + 93,47,95,48,97,49,99,50,101,51,103,52,105,53,107,54,109,55,111,56, + 113,57,115,58,117,59,119,60,121,61,123,62,125,63,127,64,129,65,131, + 66,133,67,135,68,137,69,139,70,141,71,143,72,145,73,147,74,149,75, + 151,76,153,77,155,78,157,79,159,80,161,81,163,82,165,83,167,84,169, + 85,171,86,173,87,175,88,177,89,179,90,181,91,183,92,185,93,187,94, + 189,95,191,96,193,97,195,98,197,99,199,100,201,101,203,102,205,103, + 207,104,209,105,211,106,213,107,215,108,217,109,219,110,221,111, + 223,112,225,113,227,114,229,115,231,116,233,117,235,118,237,119, + 239,120,241,121,243,122,245,123,247,124,249,125,251,126,253,127, + 255,128,257,129,259,130,261,131,263,132,265,133,267,134,269,135, + 271,136,273,137,275,138,277,139,279,140,281,141,283,142,285,143, + 287,144,289,145,291,146,293,147,295,148,297,149,299,150,301,0,303, + 0,305,151,307,152,309,153,1,0,11,1,0,48,57,1,0,49,57,2,0,69,69,101, + 101,2,0,43,43,45,45,3,0,65,90,95,95,97,122,4,0,48,57,65,90,95,95, + 97,122,4,0,10,10,13,13,34,34,92,92,8,0,34,34,47,47,92,92,98,98,102, + 102,110,110,114,114,116,116,3,0,48,57,65,70,97,102,2,0,10,10,13, + 13,3,0,9,10,13,13,32,32,1483,0,1,1,0,0,0,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,229,1,0,0,0,0,231,1,0,0,0,0,233,1,0,0,0,0, + 235,1,0,0,0,0,237,1,0,0,0,0,239,1,0,0,0,0,241,1,0,0,0,0,243,1,0, + 0,0,0,245,1,0,0,0,0,247,1,0,0,0,0,249,1,0,0,0,0,251,1,0,0,0,0,253, + 1,0,0,0,0,255,1,0,0,0,0,257,1,0,0,0,0,259,1,0,0,0,0,261,1,0,0,0, + 0,263,1,0,0,0,0,265,1,0,0,0,0,267,1,0,0,0,0,269,1,0,0,0,0,271,1, + 0,0,0,0,273,1,0,0,0,0,275,1,0,0,0,0,277,1,0,0,0,0,279,1,0,0,0,0, + 281,1,0,0,0,0,283,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,305,1,0,0,0,0,307,1,0,0,0,0,309,1,0,0,0,1,311,1,0,0,0, + 3,316,1,0,0,0,5,323,1,0,0,0,7,332,1,0,0,0,9,345,1,0,0,0,11,353,1, + 0,0,0,13,357,1,0,0,0,15,366,1,0,0,0,17,377,1,0,0,0,19,387,1,0,0, + 0,21,397,1,0,0,0,23,406,1,0,0,0,25,418,1,0,0,0,27,425,1,0,0,0,29, + 433,1,0,0,0,31,442,1,0,0,0,33,450,1,0,0,0,35,456,1,0,0,0,37,461, + 1,0,0,0,39,474,1,0,0,0,41,484,1,0,0,0,43,496,1,0,0,0,45,502,1,0, + 0,0,47,513,1,0,0,0,49,524,1,0,0,0,51,529,1,0,0,0,53,538,1,0,0,0, + 55,548,1,0,0,0,57,553,1,0,0,0,59,557,1,0,0,0,61,563,1,0,0,0,63,568, + 1,0,0,0,65,578,1,0,0,0,67,582,1,0,0,0,69,595,1,0,0,0,71,600,1,0, + 0,0,73,607,1,0,0,0,75,616,1,0,0,0,77,627,1,0,0,0,79,631,1,0,0,0, + 81,640,1,0,0,0,83,647,1,0,0,0,85,656,1,0,0,0,87,661,1,0,0,0,89,671, + 1,0,0,0,91,682,1,0,0,0,93,690,1,0,0,0,95,696,1,0,0,0,97,705,1,0, + 0,0,99,715,1,0,0,0,101,724,1,0,0,0,103,736,1,0,0,0,105,747,1,0,0, + 0,107,753,1,0,0,0,109,761,1,0,0,0,111,764,1,0,0,0,113,769,1,0,0, + 0,115,776,1,0,0,0,117,779,1,0,0,0,119,787,1,0,0,0,121,794,1,0,0, + 0,123,800,1,0,0,0,125,805,1,0,0,0,127,816,1,0,0,0,129,821,1,0,0, + 0,131,827,1,0,0,0,133,834,1,0,0,0,135,838,1,0,0,0,137,850,1,0,0, + 0,139,853,1,0,0,0,141,860,1,0,0,0,143,863,1,0,0,0,145,870,1,0,0, + 0,147,878,1,0,0,0,149,885,1,0,0,0,151,896,1,0,0,0,153,903,1,0,0, + 0,155,912,1,0,0,0,157,927,1,0,0,0,159,937,1,0,0,0,161,947,1,0,0, + 0,163,960,1,0,0,0,165,966,1,0,0,0,167,983,1,0,0,0,169,986,1,0,0, + 0,171,990,1,0,0,0,173,995,1,0,0,0,175,1001,1,0,0,0,177,1010,1,0, + 0,0,179,1019,1,0,0,0,181,1023,1,0,0,0,183,1027,1,0,0,0,185,1031, + 1,0,0,0,187,1037,1,0,0,0,189,1043,1,0,0,0,191,1048,1,0,0,0,193,1053, + 1,0,0,0,195,1059,1,0,0,0,197,1067,1,0,0,0,199,1075,1,0,0,0,201,1086, + 1,0,0,0,203,1091,1,0,0,0,205,1103,1,0,0,0,207,1114,1,0,0,0,209,1124, + 1,0,0,0,211,1136,1,0,0,0,213,1145,1,0,0,0,215,1150,1,0,0,0,217,1163, + 1,0,0,0,219,1175,1,0,0,0,221,1187,1,0,0,0,223,1192,1,0,0,0,225,1200, + 1,0,0,0,227,1205,1,0,0,0,229,1218,1,0,0,0,231,1226,1,0,0,0,233,1235, + 1,0,0,0,235,1249,1,0,0,0,237,1258,1,0,0,0,239,1263,1,0,0,0,241,1270, + 1,0,0,0,243,1275,1,0,0,0,245,1281,1,0,0,0,247,1288,1,0,0,0,249,1294, + 1,0,0,0,251,1300,1,0,0,0,253,1307,1,0,0,0,255,1314,1,0,0,0,257,1321, + 1,0,0,0,259,1326,1,0,0,0,261,1332,1,0,0,0,263,1337,1,0,0,0,265,1340, + 1,0,0,0,267,1342,1,0,0,0,269,1344,1,0,0,0,271,1346,1,0,0,0,273,1348, + 1,0,0,0,275,1350,1,0,0,0,277,1352,1,0,0,0,279,1354,1,0,0,0,281,1356, + 1,0,0,0,283,1358,1,0,0,0,285,1360,1,0,0,0,287,1362,1,0,0,0,289,1364, + 1,0,0,0,291,1366,1,0,0,0,293,1369,1,0,0,0,295,1377,1,0,0,0,297,1408, + 1,0,0,0,299,1415,1,0,0,0,301,1425,1,0,0,0,303,1435,1,0,0,0,305,1437, + 1,0,0,0,307,1448,1,0,0,0,309,1463,1,0,0,0,311,312,5,101,0,0,312, + 313,5,100,0,0,313,314,5,105,0,0,314,315,5,116,0,0,315,2,1,0,0,0, + 316,317,5,109,0,0,317,318,5,111,0,0,318,319,5,100,0,0,319,320,5, + 117,0,0,320,321,5,108,0,0,321,322,5,101,0,0,322,4,1,0,0,0,323,324, + 5,99,0,0,324,325,5,111,0,0,325,326,5,110,0,0,326,327,5,116,0,0,327, + 328,5,114,0,0,328,329,5,97,0,0,329,330,5,99,0,0,330,331,5,116,0, + 0,331,6,1,0,0,0,332,333,5,112,0,0,333,334,5,114,0,0,334,335,5,101, + 0,0,335,336,5,115,0,0,336,337,5,101,0,0,337,338,5,110,0,0,338,339, + 5,116,0,0,339,340,5,97,0,0,340,341,5,116,0,0,341,342,5,105,0,0,342, + 343,5,111,0,0,343,344,5,110,0,0,344,8,1,0,0,0,345,346,5,115,0,0, + 346,347,5,117,0,0,347,348,5,98,0,0,348,349,5,106,0,0,349,350,5,101, + 0,0,350,351,5,99,0,0,351,352,5,116,0,0,352,10,1,0,0,0,353,354,5, + 102,0,0,354,355,5,111,0,0,355,356,5,114,0,0,356,12,1,0,0,0,357,358, + 5,99,0,0,358,359,5,114,0,0,359,360,5,101,0,0,360,361,5,97,0,0,361, + 362,5,116,0,0,362,363,5,105,0,0,363,364,5,111,0,0,364,365,5,110, + 0,0,365,14,1,0,0,0,366,367,5,105,0,0,367,368,5,110,0,0,368,369,5, + 105,0,0,369,370,5,116,0,0,370,371,5,105,0,0,371,372,5,97,0,0,372, + 373,5,108,0,0,373,374,5,105,0,0,374,375,5,122,0,0,375,376,5,101, + 0,0,376,16,1,0,0,0,377,378,5,119,0,0,378,379,5,111,0,0,379,380,5, + 114,0,0,380,381,5,107,0,0,381,382,5,115,0,0,382,383,5,112,0,0,383, + 384,5,97,0,0,384,385,5,99,0,0,385,386,5,101,0,0,386,18,1,0,0,0,387, + 388,5,101,0,0,388,389,5,120,0,0,389,390,5,101,0,0,390,391,5,99,0, + 0,391,392,5,117,0,0,392,393,5,116,0,0,393,394,5,105,0,0,394,395, + 5,111,0,0,395,396,5,110,0,0,396,20,1,0,0,0,397,398,5,115,0,0,398, + 399,5,110,0,0,399,400,5,97,0,0,400,401,5,112,0,0,401,402,5,115,0, + 0,402,403,5,104,0,0,403,404,5,111,0,0,404,405,5,116,0,0,405,22,1, + 0,0,0,406,407,5,116,0,0,407,408,5,114,0,0,408,409,5,97,0,0,409,410, + 5,110,0,0,410,411,5,115,0,0,411,412,5,97,0,0,412,413,5,99,0,0,413, + 414,5,116,0,0,414,415,5,105,0,0,415,416,5,111,0,0,416,417,5,110, + 0,0,417,24,1,0,0,0,418,419,5,114,0,0,419,420,5,101,0,0,420,421,5, + 109,0,0,421,422,5,111,0,0,422,423,5,116,0,0,423,424,5,101,0,0,424, + 26,1,0,0,0,425,426,5,116,0,0,426,427,5,97,0,0,427,428,5,114,0,0, + 428,429,5,103,0,0,429,430,5,101,0,0,430,431,5,116,0,0,431,432,5, + 115,0,0,432,28,1,0,0,0,433,434,5,112,0,0,434,435,5,111,0,0,435,436, + 5,114,0,0,436,437,5,116,0,0,437,438,5,97,0,0,438,439,5,98,0,0,439, + 440,5,108,0,0,440,441,5,101,0,0,441,30,1,0,0,0,442,443,5,114,0,0, + 443,444,5,101,0,0,444,445,5,112,0,0,445,446,5,108,0,0,446,447,5, + 105,0,0,447,448,5,99,0,0,448,449,5,97,0,0,449,32,1,0,0,0,450,451, + 5,108,0,0,451,452,5,111,0,0,452,453,5,99,0,0,453,454,5,97,0,0,454, + 455,5,108,0,0,455,34,1,0,0,0,456,457,5,102,0,0,457,458,5,114,0,0, + 458,459,5,111,0,0,459,460,5,109,0,0,460,36,1,0,0,0,461,462,5,114, + 0,0,462,463,5,101,0,0,463,464,5,115,0,0,464,465,5,117,0,0,465,466, + 5,108,0,0,466,467,5,116,0,0,467,468,5,45,0,0,468,469,5,98,0,0,469, + 470,5,121,0,0,470,471,5,116,0,0,471,472,5,101,0,0,472,473,5,115, + 0,0,473,38,1,0,0,0,474,475,5,114,0,0,475,476,5,112,0,0,476,477,5, + 99,0,0,477,478,5,45,0,0,478,479,5,99,0,0,479,480,5,97,0,0,480,481, + 5,108,0,0,481,482,5,108,0,0,482,483,5,115,0,0,483,40,1,0,0,0,484, + 485,5,100,0,0,485,486,5,101,0,0,486,487,5,97,0,0,487,488,5,100,0, + 0,488,489,5,108,0,0,489,490,5,105,0,0,490,491,5,110,0,0,491,492, + 5,101,0,0,492,493,5,45,0,0,493,494,5,109,0,0,494,495,5,115,0,0,495, + 42,1,0,0,0,496,497,5,113,0,0,497,498,5,117,0,0,498,499,5,101,0,0, + 499,500,5,114,0,0,500,501,5,121,0,0,501,44,1,0,0,0,502,503,5,114, + 0,0,503,504,5,101,0,0,504,505,5,102,0,0,505,506,5,108,0,0,506,507, + 5,101,0,0,507,508,5,99,0,0,508,509,5,116,0,0,509,510,5,105,0,0,510, + 511,5,111,0,0,511,512,5,110,0,0,512,46,1,0,0,0,513,514,5,115,0,0, + 514,515,5,112,0,0,515,516,5,101,0,0,516,517,5,99,0,0,517,518,5,105, + 0,0,518,519,5,97,0,0,519,520,5,108,0,0,520,521,5,105,0,0,521,522, + 5,122,0,0,522,523,5,101,0,0,523,48,1,0,0,0,524,525,5,114,0,0,525, + 526,5,111,0,0,526,527,5,111,0,0,527,528,5,116,0,0,528,50,1,0,0,0, + 529,530,5,100,0,0,530,531,5,111,0,0,531,532,5,99,0,0,532,533,5,117, + 0,0,533,534,5,109,0,0,534,535,5,101,0,0,535,536,5,110,0,0,536,537, + 5,116,0,0,537,52,1,0,0,0,538,539,5,102,0,0,539,540,5,114,0,0,540, + 541,5,97,0,0,541,542,5,103,0,0,542,543,5,109,0,0,543,544,5,101,0, + 0,544,545,5,110,0,0,545,546,5,116,0,0,546,547,5,115,0,0,547,54,1, + 0,0,0,548,549,5,118,0,0,549,550,5,105,0,0,550,551,5,101,0,0,551, + 552,5,119,0,0,552,56,1,0,0,0,553,554,5,109,0,0,554,555,5,97,0,0, + 555,556,5,120,0,0,556,58,1,0,0,0,557,558,5,97,0,0,558,559,5,108, + 0,0,559,560,5,108,0,0,560,561,5,111,0,0,561,562,5,119,0,0,562,60, + 1,0,0,0,563,564,5,112,0,0,564,565,5,111,0,0,565,566,5,108,0,0,566, + 567,5,108,0,0,567,62,1,0,0,0,568,569,5,113,0,0,569,570,5,117,0,0, + 570,571,5,101,0,0,571,572,5,114,0,0,572,573,5,121,0,0,573,574,5, + 97,0,0,574,575,5,98,0,0,575,576,5,108,0,0,576,577,5,101,0,0,577, + 64,1,0,0,0,578,579,5,114,0,0,579,580,5,112,0,0,580,581,5,99,0,0, + 581,66,1,0,0,0,582,583,5,113,0,0,583,584,5,117,0,0,584,585,5,101, + 0,0,585,586,5,114,0,0,586,587,5,121,0,0,587,588,5,45,0,0,588,589, + 5,114,0,0,589,590,5,101,0,0,590,591,5,97,0,0,591,592,5,115,0,0,592, + 593,5,111,0,0,593,594,5,110,0,0,594,68,1,0,0,0,595,596,5,116,0,0, + 596,597,5,121,0,0,597,598,5,112,0,0,598,599,5,101,0,0,599,70,1,0, + 0,0,600,601,5,111,0,0,601,602,5,98,0,0,602,603,5,106,0,0,603,604, + 5,101,0,0,604,605,5,99,0,0,605,606,5,116,0,0,606,72,1,0,0,0,607, + 608,5,115,0,0,608,609,5,116,0,0,609,610,5,111,0,0,610,611,5,114, + 0,0,611,612,5,97,0,0,612,613,5,98,0,0,613,614,5,108,0,0,614,615, + 5,101,0,0,615,74,1,0,0,0,616,617,5,105,0,0,617,618,5,109,0,0,618, + 619,5,112,0,0,619,620,5,108,0,0,620,621,5,101,0,0,621,622,5,109, + 0,0,622,623,5,101,0,0,623,624,5,110,0,0,624,625,5,116,0,0,625,626, + 5,115,0,0,626,76,1,0,0,0,627,628,5,114,0,0,628,629,5,101,0,0,629, + 630,5,102,0,0,630,78,1,0,0,0,631,632,5,102,0,0,632,633,5,114,0,0, + 633,634,5,97,0,0,634,635,5,103,0,0,635,636,5,109,0,0,636,637,5,101, + 0,0,637,638,5,110,0,0,638,639,5,116,0,0,639,80,1,0,0,0,640,641,5, + 105,0,0,641,642,5,109,0,0,642,643,5,112,0,0,643,644,5,111,0,0,644, + 645,5,114,0,0,645,646,5,116,0,0,646,82,1,0,0,0,647,648,5,101,0,0, + 648,649,5,120,0,0,649,650,5,116,0,0,650,651,5,101,0,0,651,652,5, + 114,0,0,652,653,5,110,0,0,653,654,5,97,0,0,654,655,5,108,0,0,655, + 84,1,0,0,0,656,657,5,97,0,0,657,658,5,116,0,0,658,659,5,111,0,0, + 659,660,5,109,0,0,660,86,1,0,0,0,661,662,5,105,0,0,662,663,5,110, + 0,0,663,664,5,116,0,0,664,665,5,101,0,0,665,666,5,114,0,0,666,667, + 5,102,0,0,667,668,5,97,0,0,668,669,5,99,0,0,669,670,5,101,0,0,670, + 88,1,0,0,0,671,672,5,105,0,0,672,673,5,110,0,0,673,674,5,116,0,0, + 674,675,5,101,0,0,675,676,5,114,0,0,676,677,5,102,0,0,677,678,5, + 97,0,0,678,679,5,99,0,0,679,680,5,101,0,0,680,681,5,115,0,0,681, + 90,1,0,0,0,682,683,5,112,0,0,683,684,5,97,0,0,684,685,5,99,0,0,685, + 686,5,107,0,0,686,687,5,97,0,0,687,688,5,103,0,0,688,689,5,101,0, + 0,689,92,1,0,0,0,690,691,5,118,0,0,691,692,5,97,0,0,692,693,5,108, + 0,0,693,694,5,117,0,0,694,695,5,101,0,0,695,94,1,0,0,0,696,697,5, + 114,0,0,697,698,5,101,0,0,698,699,5,108,0,0,699,700,5,97,0,0,700, + 701,5,116,0,0,701,702,5,105,0,0,702,703,5,111,0,0,703,704,5,110, + 0,0,704,96,1,0,0,0,705,706,5,111,0,0,706,707,5,112,0,0,707,708,5, + 101,0,0,708,709,5,114,0,0,709,710,5,97,0,0,710,711,5,116,0,0,711, + 712,5,105,0,0,712,713,5,111,0,0,713,714,5,110,0,0,714,98,1,0,0,0, + 715,716,5,102,0,0,716,717,5,117,0,0,717,718,5,110,0,0,718,719,5, + 99,0,0,719,720,5,116,0,0,720,721,5,105,0,0,721,722,5,111,0,0,722, + 723,5,110,0,0,723,100,1,0,0,0,724,725,5,99,0,0,725,726,5,111,0,0, + 726,727,5,110,0,0,727,728,5,115,0,0,728,729,5,116,0,0,729,730,5, + 114,0,0,730,731,5,117,0,0,731,732,5,99,0,0,732,733,5,116,0,0,733, + 734,5,111,0,0,734,735,5,114,0,0,735,102,1,0,0,0,736,737,5,99,0,0, + 737,738,5,111,0,0,738,739,5,110,0,0,739,740,5,115,0,0,740,741,5, + 116,0,0,741,742,5,114,0,0,742,743,5,117,0,0,743,744,5,99,0,0,744, + 745,5,116,0,0,745,746,5,115,0,0,746,104,1,0,0,0,747,748,5,105,0, + 0,748,749,5,110,0,0,749,750,5,112,0,0,750,751,5,117,0,0,751,752, + 5,116,0,0,752,106,1,0,0,0,753,754,5,99,0,0,754,755,5,111,0,0,755, + 756,5,110,0,0,756,757,5,102,0,0,757,758,5,111,0,0,758,759,5,114, + 0,0,759,760,5,109,0,0,760,108,1,0,0,0,761,762,5,97,0,0,762,763,5, + 115,0,0,763,110,1,0,0,0,764,765,5,98,0,0,765,766,5,105,0,0,766,767, + 5,110,0,0,767,768,5,100,0,0,768,112,1,0,0,0,769,770,5,115,0,0,770, + 771,5,116,0,0,771,772,5,97,0,0,772,773,5,116,0,0,773,774,5,105,0, + 0,774,775,5,99,0,0,775,114,1,0,0,0,776,777,5,116,0,0,777,778,5,111, + 0,0,778,116,1,0,0,0,779,780,5,112,0,0,780,781,5,114,0,0,781,782, + 5,105,0,0,782,783,5,118,0,0,783,784,5,97,0,0,784,785,5,116,0,0,785, + 786,5,101,0,0,786,118,1,0,0,0,787,788,5,115,0,0,788,789,5,104,0, + 0,789,790,5,97,0,0,790,791,5,114,0,0,791,792,5,101,0,0,792,793,5, + 100,0,0,793,120,1,0,0,0,794,795,5,115,0,0,795,796,5,116,0,0,796, + 797,5,97,0,0,797,798,5,116,0,0,798,799,5,101,0,0,799,122,1,0,0,0, + 800,801,5,101,0,0,801,802,5,100,0,0,802,803,5,103,0,0,803,804,5, + 101,0,0,804,124,1,0,0,0,805,806,5,112,0,0,806,807,5,114,0,0,807, + 808,5,111,0,0,808,809,5,106,0,0,809,810,5,101,0,0,810,811,5,99,0, + 0,811,812,5,116,0,0,812,813,5,105,0,0,813,814,5,111,0,0,814,815, + 5,110,0,0,815,126,1,0,0,0,816,817,5,119,0,0,817,818,5,105,0,0,818, + 819,5,116,0,0,819,820,5,104,0,0,820,128,1,0,0,0,821,822,5,117,0, + 0,822,823,5,115,0,0,823,824,5,105,0,0,824,825,5,110,0,0,825,826, + 5,103,0,0,826,130,1,0,0,0,827,828,5,97,0,0,828,829,5,99,0,0,829, + 830,5,99,0,0,830,831,5,101,0,0,831,832,5,112,0,0,832,833,5,116,0, + 0,833,132,1,0,0,0,834,835,5,118,0,0,835,836,5,105,0,0,836,837,5, + 97,0,0,837,134,1,0,0,0,838,839,5,109,0,0,839,840,5,97,0,0,840,841, + 5,116,0,0,841,842,5,101,0,0,842,843,5,114,0,0,843,844,5,105,0,0, + 844,845,5,97,0,0,845,846,5,108,0,0,846,847,5,105,0,0,847,848,5,122, + 0,0,848,849,5,101,0,0,849,136,1,0,0,0,850,851,5,105,0,0,851,852, + 5,102,0,0,852,138,1,0,0,0,853,854,5,97,0,0,854,855,5,98,0,0,855, + 856,5,115,0,0,856,857,5,101,0,0,857,858,5,110,0,0,858,859,5,116, + 0,0,859,140,1,0,0,0,860,861,5,111,0,0,861,862,5,110,0,0,862,142, + 1,0,0,0,863,864,5,112,0,0,864,865,5,111,0,0,865,866,5,108,0,0,866, + 867,5,105,0,0,867,868,5,99,0,0,868,869,5,121,0,0,869,144,1,0,0,0, + 870,871,5,100,0,0,871,872,5,101,0,0,872,873,5,102,0,0,873,874,5, + 97,0,0,874,875,5,117,0,0,875,876,5,108,0,0,876,877,5,116,0,0,877, + 146,1,0,0,0,878,879,5,115,0,0,879,880,5,111,0,0,880,881,5,117,0, + 0,881,882,5,114,0,0,882,883,5,99,0,0,883,884,5,101,0,0,884,148,1, + 0,0,0,885,886,5,114,0,0,886,887,5,101,0,0,887,888,5,112,0,0,888, + 889,5,111,0,0,889,890,5,115,0,0,890,891,5,105,0,0,891,892,5,116, + 0,0,892,893,5,111,0,0,893,894,5,114,0,0,894,895,5,121,0,0,895,150, + 1,0,0,0,896,897,5,99,0,0,897,898,5,111,0,0,898,899,5,109,0,0,899, + 900,5,109,0,0,900,901,5,105,0,0,901,902,5,116,0,0,902,152,1,0,0, + 0,903,904,5,114,0,0,904,905,5,101,0,0,905,906,5,118,0,0,906,907, + 5,105,0,0,907,908,5,115,0,0,908,909,5,105,0,0,909,910,5,111,0,0, + 910,911,5,110,0,0,911,154,1,0,0,0,912,913,5,115,0,0,913,914,5,101, + 0,0,914,915,5,109,0,0,915,916,5,97,0,0,916,917,5,110,0,0,917,918, + 5,116,0,0,918,919,5,105,0,0,919,920,5,99,0,0,920,921,5,45,0,0,921, + 922,5,109,0,0,922,923,5,97,0,0,923,924,5,106,0,0,924,925,5,111,0, + 0,925,926,5,114,0,0,926,156,1,0,0,0,927,928,5,111,0,0,928,929,5, + 110,0,0,929,930,5,45,0,0,930,931,5,100,0,0,931,932,5,101,0,0,932, + 933,5,108,0,0,933,934,5,101,0,0,934,935,5,116,0,0,935,936,5,101, + 0,0,936,158,1,0,0,0,937,938,5,108,0,0,938,939,5,105,0,0,939,940, + 5,102,0,0,940,941,5,101,0,0,941,942,5,99,0,0,942,943,5,121,0,0,943, + 944,5,99,0,0,944,945,5,108,0,0,945,946,5,101,0,0,946,160,1,0,0,0, + 947,948,5,114,0,0,948,949,5,101,0,0,949,950,5,116,0,0,950,951,5, + 97,0,0,951,952,5,105,0,0,952,953,5,110,0,0,953,954,5,45,0,0,954, + 955,5,111,0,0,955,956,5,116,0,0,956,957,5,104,0,0,957,958,5,101, + 0,0,958,959,5,114,0,0,959,162,1,0,0,0,960,961,5,107,0,0,961,962, + 5,101,0,0,962,963,5,121,0,0,963,964,5,101,0,0,964,965,5,100,0,0, + 965,164,1,0,0,0,966,967,5,112,0,0,967,968,5,117,0,0,968,969,5,98, + 0,0,969,970,5,108,0,0,970,971,5,105,0,0,971,972,5,99,0,0,972,973, + 5,45,0,0,973,974,5,116,0,0,974,975,5,114,0,0,975,976,5,97,0,0,976, + 977,5,118,0,0,977,978,5,101,0,0,978,979,5,114,0,0,979,980,5,115, + 0,0,980,981,5,97,0,0,981,982,5,108,0,0,982,166,1,0,0,0,983,984,5, + 105,0,0,984,985,5,100,0,0,985,168,1,0,0,0,986,987,5,100,0,0,987, + 988,5,111,0,0,988,989,5,99,0,0,989,170,1,0,0,0,990,991,5,109,0,0, + 991,992,5,111,0,0,992,993,5,100,0,0,993,994,5,101,0,0,994,172,1, + 0,0,0,995,996,5,101,0,0,996,997,5,109,0,0,997,998,5,105,0,0,998, + 999,5,116,0,0,999,1000,5,115,0,0,1000,174,1,0,0,0,1001,1002,5,114, + 0,0,1002,1003,5,101,0,0,1003,1004,5,99,0,0,1004,1005,5,101,0,0,1005, + 1006,5,105,0,0,1006,1007,5,118,0,0,1007,1008,5,101,0,0,1008,1009, + 5,114,0,0,1009,176,1,0,0,0,1010,1011,5,114,0,0,1011,1012,5,101,0, + 0,1012,1013,5,113,0,0,1013,1014,5,117,0,0,1014,1015,5,105,0,0,1015, + 1016,5,114,0,0,1016,1017,5,101,0,0,1017,1018,5,115,0,0,1018,178, + 1,0,0,0,1019,1020,5,97,0,0,1020,1021,5,110,0,0,1021,1022,5,121,0, + 0,1022,180,1,0,0,0,1023,1024,5,103,0,0,1024,1025,5,101,0,0,1025, + 1026,5,116,0,0,1026,182,1,0,0,0,1027,1028,5,115,0,0,1028,1029,5, + 101,0,0,1029,1030,5,116,0,0,1030,184,1,0,0,0,1031,1032,5,119,0,0, + 1032,1033,5,97,0,0,1033,1034,5,116,0,0,1034,1035,5,99,0,0,1035,1036, + 5,104,0,0,1036,186,1,0,0,0,1037,1038,5,115,0,0,1038,1039,5,116,0, + 0,1039,1040,5,97,0,0,1040,1041,5,114,0,0,1041,1042,5,116,0,0,1042, + 188,1,0,0,0,1043,1044,5,115,0,0,1044,1045,5,116,0,0,1045,1046,5, + 111,0,0,1046,1047,5,112,0,0,1047,190,1,0,0,0,1048,1049,5,114,0,0, + 1049,1050,5,101,0,0,1050,1051,5,97,0,0,1051,1052,5,100,0,0,1052, + 192,1,0,0,0,1053,1054,5,119,0,0,1054,1055,5,114,0,0,1055,1056,5, + 105,0,0,1056,1057,5,116,0,0,1057,1058,5,101,0,0,1058,194,1,0,0,0, + 1059,1060,5,114,0,0,1060,1061,5,101,0,0,1061,1062,5,115,0,0,1062, + 1063,5,111,0,0,1063,1064,5,108,0,0,1064,1065,5,118,0,0,1065,1066, + 5,101,0,0,1066,196,1,0,0,0,1067,1068,5,99,0,0,1068,1069,5,111,0, + 0,1069,1070,5,110,0,0,1070,1071,5,110,0,0,1071,1072,5,101,0,0,1072, + 1073,5,99,0,0,1073,1074,5,116,0,0,1074,198,1,0,0,0,1075,1076,5,100, + 0,0,1076,1077,5,105,0,0,1077,1078,5,115,0,0,1078,1079,5,99,0,0,1079, + 1080,5,111,0,0,1080,1081,5,110,0,0,1081,1082,5,110,0,0,1082,1083, + 5,101,0,0,1083,1084,5,99,0,0,1084,1085,5,116,0,0,1085,200,1,0,0, + 0,1086,1087,5,99,0,0,1087,1088,5,97,0,0,1088,1089,5,108,0,0,1089, + 1090,5,108,0,0,1090,202,1,0,0,0,1091,1092,5,119,0,0,1092,1093,5, + 97,0,0,1093,1094,5,116,0,0,1094,1095,5,99,0,0,1095,1096,5,104,0, + 0,1096,1097,5,45,0,0,1097,1098,5,115,0,0,1098,1099,5,116,0,0,1099, + 1100,5,97,0,0,1100,1101,5,114,0,0,1101,1102,5,116,0,0,1102,204,1, + 0,0,0,1103,1104,5,119,0,0,1104,1105,5,97,0,0,1105,1106,5,116,0,0, + 1106,1107,5,99,0,0,1107,1108,5,104,0,0,1108,1109,5,45,0,0,1109,1110, + 5,115,0,0,1110,1111,5,116,0,0,1111,1112,5,111,0,0,1112,1113,5,112, + 0,0,1113,206,1,0,0,0,1114,1115,5,115,0,0,1115,1116,5,117,0,0,1116, + 1117,5,98,0,0,1117,1118,5,115,0,0,1118,1119,5,99,0,0,1119,1120,5, + 114,0,0,1120,1121,5,105,0,0,1121,1122,5,98,0,0,1122,1123,5,101,0, + 0,1123,208,1,0,0,0,1124,1125,5,117,0,0,1125,1126,5,110,0,0,1126, + 1127,5,115,0,0,1127,1128,5,117,0,0,1128,1129,5,98,0,0,1129,1130, + 5,115,0,0,1130,1131,5,99,0,0,1131,1132,5,114,0,0,1132,1133,5,105, + 0,0,1133,1134,5,98,0,0,1134,1135,5,101,0,0,1135,210,1,0,0,0,1136, + 1137,5,114,0,0,1137,1138,5,101,0,0,1138,1139,5,103,0,0,1139,1140, + 5,105,0,0,1140,1141,5,115,0,0,1141,1142,5,116,0,0,1142,1143,5,101, + 0,0,1143,1144,5,114,0,0,1144,212,1,0,0,0,1145,1146,5,99,0,0,1146, + 1147,5,114,0,0,1147,1148,5,100,0,0,1148,1149,5,116,0,0,1149,214, + 1,0,0,0,1150,1151,5,111,0,0,1151,1152,5,112,0,0,1152,1153,5,116, + 0,0,1153,1154,5,105,0,0,1154,1155,5,111,0,0,1155,1156,5,110,0,0, + 1156,1157,5,97,0,0,1157,1158,5,108,0,0,1158,1159,5,45,0,0,1159,1160, + 5,111,0,0,1160,1161,5,110,0,0,1161,1162,5,101,0,0,1162,216,1,0,0, + 0,1163,1164,5,101,0,0,1164,1165,5,120,0,0,1165,1166,5,97,0,0,1166, + 1167,5,99,0,0,1167,1168,5,116,0,0,1168,1169,5,108,0,0,1169,1170, + 5,121,0,0,1170,1171,5,45,0,0,1171,1172,5,111,0,0,1172,1173,5,110, + 0,0,1173,1174,5,101,0,0,1174,218,1,0,0,0,1175,1176,5,109,0,0,1176, + 1177,5,97,0,0,1177,1178,5,110,0,0,1178,1179,5,121,0,0,1179,1180, + 5,45,0,0,1180,1181,5,117,0,0,1181,1182,5,110,0,0,1182,1183,5,105, + 0,0,1183,1184,5,113,0,0,1184,1185,5,117,0,0,1185,1186,5,101,0,0, + 1186,220,1,0,0,0,1187,1188,5,109,0,0,1188,1189,5,97,0,0,1189,1190, + 5,110,0,0,1190,1191,5,121,0,0,1191,222,1,0,0,0,1192,1193,5,111,0, + 0,1193,1194,5,114,0,0,1194,1195,5,100,0,0,1195,1196,5,101,0,0,1196, + 1197,5,114,0,0,1197,1198,5,101,0,0,1198,1199,5,100,0,0,1199,224, + 1,0,0,0,1200,1201,5,117,0,0,1201,1202,5,110,0,0,1202,1203,5,105, + 0,0,1203,1204,5,116,0,0,1204,226,1,0,0,0,1205,1206,5,119,0,0,1206, + 1207,5,97,0,0,1207,1208,5,116,0,0,1208,1209,5,99,0,0,1209,1210,5, + 104,0,0,1210,1211,5,45,0,0,1211,1212,5,104,0,0,1212,1213,5,97,0, + 0,1213,1214,5,110,0,0,1214,1215,5,100,0,0,1215,1216,5,108,0,0,1216, + 1217,5,101,0,0,1217,228,1,0,0,0,1218,1219,5,109,0,0,1219,1220,5, + 101,0,0,1220,1221,5,115,0,0,1221,1222,5,115,0,0,1222,1223,5,97,0, + 0,1223,1224,5,103,0,0,1224,1225,5,101,0,0,1225,230,1,0,0,0,1226, + 1227,5,97,0,0,1227,1228,5,116,0,0,1228,1229,5,111,0,0,1229,1230, + 5,109,0,0,1230,1231,5,45,0,0,1231,1232,5,114,0,0,1232,1233,5,101, + 0,0,1233,1234,5,102,0,0,1234,232,1,0,0,0,1235,1236,5,105,0,0,1236, + 1237,5,110,0,0,1237,1238,5,116,0,0,1238,1239,5,101,0,0,1239,1240, + 5,114,0,0,1240,1241,5,102,0,0,1241,1242,5,97,0,0,1242,1243,5,99, + 0,0,1243,1244,5,101,0,0,1244,1245,5,45,0,0,1245,1246,5,114,0,0,1246, + 1247,5,101,0,0,1247,1248,5,102,0,0,1248,234,1,0,0,0,1249,1250,5, + 111,0,0,1250,1251,5,112,0,0,1251,1252,5,116,0,0,1252,1253,5,105, + 0,0,1253,1254,5,111,0,0,1254,1255,5,110,0,0,1255,1256,5,97,0,0,1256, + 1257,5,108,0,0,1257,236,1,0,0,0,1258,1259,5,108,0,0,1259,1260,5, + 105,0,0,1260,1261,5,115,0,0,1261,1262,5,116,0,0,1262,238,1,0,0,0, + 1263,1264,5,114,0,0,1264,1265,5,101,0,0,1265,1266,5,99,0,0,1266, + 1267,5,111,0,0,1267,1268,5,114,0,0,1268,1269,5,100,0,0,1269,240, + 1,0,0,0,1270,1271,5,98,0,0,1271,1272,5,111,0,0,1272,1273,5,111,0, + 0,1273,1274,5,108,0,0,1274,242,1,0,0,0,1275,1276,5,98,0,0,1276,1277, + 5,121,0,0,1277,1278,5,116,0,0,1278,1279,5,101,0,0,1279,1280,5,115, + 0,0,1280,244,1,0,0,0,1281,1282,5,100,0,0,1282,1283,5,111,0,0,1283, + 1284,5,117,0,0,1284,1285,5,98,0,0,1285,1286,5,108,0,0,1286,1287, + 5,101,0,0,1287,246,1,0,0,0,1288,1289,5,105,0,0,1289,1290,5,110,0, + 0,1290,1291,5,116,0,0,1291,1292,5,51,0,0,1292,1293,5,50,0,0,1293, + 248,1,0,0,0,1294,1295,5,105,0,0,1295,1296,5,110,0,0,1296,1297,5, + 116,0,0,1297,1298,5,54,0,0,1298,1299,5,52,0,0,1299,250,1,0,0,0,1300, + 1301,5,115,0,0,1301,1302,5,116,0,0,1302,1303,5,114,0,0,1303,1304, + 5,105,0,0,1304,1305,5,110,0,0,1305,1306,5,103,0,0,1306,252,1,0,0, + 0,1307,1308,5,117,0,0,1308,1309,5,105,0,0,1309,1310,5,110,0,0,1310, + 1311,5,116,0,0,1311,1312,5,51,0,0,1312,1313,5,50,0,0,1313,254,1, + 0,0,0,1314,1315,5,117,0,0,1315,1316,5,105,0,0,1316,1317,5,110,0, + 0,1317,1318,5,116,0,0,1318,1319,5,54,0,0,1319,1320,5,52,0,0,1320, + 256,1,0,0,0,1321,1322,5,116,0,0,1322,1323,5,114,0,0,1323,1324,5, + 117,0,0,1324,1325,5,101,0,0,1325,258,1,0,0,0,1326,1327,5,102,0,0, + 1327,1328,5,97,0,0,1328,1329,5,108,0,0,1329,1330,5,115,0,0,1330, + 1331,5,101,0,0,1331,260,1,0,0,0,1332,1333,5,110,0,0,1333,1334,5, + 117,0,0,1334,1335,5,108,0,0,1335,1336,5,108,0,0,1336,262,1,0,0,0, + 1337,1338,5,45,0,0,1338,1339,5,62,0,0,1339,264,1,0,0,0,1340,1341, + 5,58,0,0,1341,266,1,0,0,0,1342,1343,5,59,0,0,1343,268,1,0,0,0,1344, + 1345,5,44,0,0,1345,270,1,0,0,0,1346,1347,5,46,0,0,1347,272,1,0,0, + 0,1348,1349,5,123,0,0,1349,274,1,0,0,0,1350,1351,5,125,0,0,1351, + 276,1,0,0,0,1352,1353,5,91,0,0,1353,278,1,0,0,0,1354,1355,5,93,0, + 0,1355,280,1,0,0,0,1356,1357,5,40,0,0,1357,282,1,0,0,0,1358,1359, + 5,41,0,0,1359,284,1,0,0,0,1360,1361,5,60,0,0,1361,286,1,0,0,0,1362, + 1363,5,62,0,0,1363,288,1,0,0,0,1364,1365,5,38,0,0,1365,290,1,0,0, + 0,1366,1367,5,61,0,0,1367,292,1,0,0,0,1368,1370,5,45,0,0,1369,1368, + 1,0,0,0,1369,1370,1,0,0,0,1370,1372,1,0,0,0,1371,1373,7,0,0,0,1372, + 1371,1,0,0,0,1373,1374,1,0,0,0,1374,1372,1,0,0,0,1374,1375,1,0,0, + 0,1375,294,1,0,0,0,1376,1378,5,45,0,0,1377,1376,1,0,0,0,1377,1378, + 1,0,0,0,1378,1387,1,0,0,0,1379,1388,5,48,0,0,1380,1384,7,1,0,0,1381, + 1383,7,0,0,0,1382,1381,1,0,0,0,1383,1386,1,0,0,0,1384,1382,1,0,0, + 0,1384,1385,1,0,0,0,1385,1388,1,0,0,0,1386,1384,1,0,0,0,1387,1379, + 1,0,0,0,1387,1380,1,0,0,0,1388,1395,1,0,0,0,1389,1391,5,46,0,0,1390, + 1392,7,0,0,0,1391,1390,1,0,0,0,1392,1393,1,0,0,0,1393,1391,1,0,0, + 0,1393,1394,1,0,0,0,1394,1396,1,0,0,0,1395,1389,1,0,0,0,1395,1396, + 1,0,0,0,1396,1406,1,0,0,0,1397,1399,7,2,0,0,1398,1400,7,3,0,0,1399, + 1398,1,0,0,0,1399,1400,1,0,0,0,1400,1402,1,0,0,0,1401,1403,7,0,0, + 0,1402,1401,1,0,0,0,1403,1404,1,0,0,0,1404,1402,1,0,0,0,1404,1405, + 1,0,0,0,1405,1407,1,0,0,0,1406,1397,1,0,0,0,1406,1407,1,0,0,0,1407, + 296,1,0,0,0,1408,1412,7,4,0,0,1409,1411,7,5,0,0,1410,1409,1,0,0, + 0,1411,1414,1,0,0,0,1412,1410,1,0,0,0,1412,1413,1,0,0,0,1413,298, + 1,0,0,0,1414,1412,1,0,0,0,1415,1420,5,34,0,0,1416,1419,3,301,150, + 0,1417,1419,8,6,0,0,1418,1416,1,0,0,0,1418,1417,1,0,0,0,1419,1422, + 1,0,0,0,1420,1418,1,0,0,0,1420,1421,1,0,0,0,1421,1423,1,0,0,0,1422, + 1420,1,0,0,0,1423,1424,5,34,0,0,1424,300,1,0,0,0,1425,1433,5,92, + 0,0,1426,1434,7,7,0,0,1427,1428,5,117,0,0,1428,1429,3,303,151,0, + 1429,1430,3,303,151,0,1430,1431,3,303,151,0,1431,1432,3,303,151, + 0,1432,1434,1,0,0,0,1433,1426,1,0,0,0,1433,1427,1,0,0,0,1434,302, + 1,0,0,0,1435,1436,7,8,0,0,1436,304,1,0,0,0,1437,1438,5,47,0,0,1438, + 1439,5,47,0,0,1439,1443,1,0,0,0,1440,1442,8,9,0,0,1441,1440,1,0, + 0,0,1442,1445,1,0,0,0,1443,1441,1,0,0,0,1443,1444,1,0,0,0,1444,1446, + 1,0,0,0,1445,1443,1,0,0,0,1446,1447,6,152,0,0,1447,306,1,0,0,0,1448, + 1449,5,47,0,0,1449,1450,5,42,0,0,1450,1454,1,0,0,0,1451,1453,9,0, + 0,0,1452,1451,1,0,0,0,1453,1456,1,0,0,0,1454,1455,1,0,0,0,1454,1452, + 1,0,0,0,1455,1457,1,0,0,0,1456,1454,1,0,0,0,1457,1458,5,42,0,0,1458, + 1459,5,47,0,0,1459,1460,1,0,0,0,1460,1461,6,153,0,0,1461,308,1,0, + 0,0,1462,1464,7,10,0,0,1463,1462,1,0,0,0,1464,1465,1,0,0,0,1465, + 1463,1,0,0,0,1465,1466,1,0,0,0,1466,1467,1,0,0,0,1467,1468,6,154, + 0,0,1468,310,1,0,0,0,18,0,1369,1374,1377,1384,1387,1393,1395,1399, + 1404,1406,1412,1418,1420,1433,1443,1454,1465,1,0,1,0 ]; private static __ATN: antlr.ATN; diff --git a/src/capability-language/generated/QuixosCapabilityParser.ts b/src/capability-language/generated/QuixosCapabilityParser.ts index 854e3df..8a35a66 100644 --- a/src/capability-language/generated/QuixosCapabilityParser.ts +++ b/src/capability-language/generated/QuixosCapabilityParser.ts @@ -11,10 +11,10 @@ type int = number; export class QuixosCapabilityParser extends antlr.Parser { public static readonly EDIT = 1; - public static readonly COMPONENT = 2; - public static readonly PRESENTATION = 3; - public static readonly SUBJECT = 4; - public static readonly RUNTIME = 5; + public static readonly MODULE = 2; + public static readonly CONTRACT = 3; + public static readonly PRESENTATION = 4; + public static readonly SUBJECT = 5; public static readonly FOR = 6; public static readonly CREATION = 7; public static readonly INITIALIZE = 8; @@ -181,70 +181,72 @@ export class QuixosCapabilityParser extends antlr.Parser { public static readonly RULE_typeArgument = 15; public static readonly RULE_typeAliasDecl = 16; public static readonly RULE_interfaceMember = 17; - public static readonly RULE_operationMember = 18; - public static readonly RULE_valueMember = 19; - public static readonly RULE_valueMemberOperation = 20; - public static readonly RULE_relationshipMember = 21; - public static readonly RULE_queryReadContract = 22; - public static readonly RULE_relationshipOperation = 23; - public static readonly RULE_targetConstraint = 24; - public static readonly RULE_packageResourceDecl = 25; - public static readonly RULE_packageExport = 26; - public static readonly RULE_componentDecl = 27; - public static readonly RULE_presentationDecl = 28; - public static readonly RULE_packageQuery = 29; - public static readonly RULE_packageQuerySpecialization = 30; - public static readonly RULE_queryClause = 31; - public static readonly RULE_packageOperationExport = 32; - public static readonly RULE_packageFunctionExport = 33; - public static readonly RULE_acceptanceClause = 34; - public static readonly RULE_executionClause = 35; - public static readonly RULE_selectedOperations = 36; - public static readonly RULE_packageConstructorExport = 37; - public static readonly RULE_eventClause = 38; - public static readonly RULE_operationMode = 39; - public static readonly RULE_receiverRequirement = 40; - public static readonly RULE_identifierList = 41; - public static readonly RULE_dependencyBlock = 42; - public static readonly RULE_dependencyPort = 43; - public static readonly RULE_primitiveList = 44; - public static readonly RULE_primitive = 45; - public static readonly RULE_sharedAttachmentDecl = 46; - public static readonly RULE_attachmentDecl = 47; - public static readonly RULE_stateDecl = 48; - public static readonly RULE_storagePolicy = 49; - public static readonly RULE_edgeDecl = 50; - public static readonly RULE_edgeEndpoint = 51; - public static readonly RULE_conformanceDecl = 52; - public static readonly RULE_conformanceItem = 53; - public static readonly RULE_initializationDecl = 54; - public static readonly RULE_initializationField = 55; - public static readonly RULE_creationOwnerMapping = 56; - public static readonly RULE_stateFieldBindingDecl = 57; - public static readonly RULE_relationshipMaterializationDecl = 58; - public static readonly RULE_operationBindingDecl = 59; - public static readonly RULE_memberOperationRef = 60; - public static readonly RULE_operationName = 61; - public static readonly RULE_operationProvider = 62; - public static readonly RULE_acceptanceBinding = 63; - public static readonly RULE_statePrimitive = 64; - public static readonly RULE_edgePrimitive = 65; - public static readonly RULE_dependencyBindingBlock = 66; - public static readonly RULE_dependencyBinding = 67; - public static readonly RULE_constructorBindingDecl = 68; - public static readonly RULE_valueType = 69; - public static readonly RULE_recordField = 70; - public static readonly RULE_scalarType = 71; - public static readonly RULE_cardinality = 72; - public static readonly RULE_jsonLiteral = 73; - public static readonly RULE_jsonObject = 74; - public static readonly RULE_jsonMember = 75; - public static readonly RULE_jsonArray = 76; - public static readonly RULE_identifier = 77; - public static readonly RULE_stringLiteral = 78; + public static readonly RULE_moduleMember = 18; + public static readonly RULE_operationMember = 19; + public static readonly RULE_valueMember = 20; + public static readonly RULE_valueMemberOperation = 21; + public static readonly RULE_relationshipMember = 22; + public static readonly RULE_queryReadContract = 23; + public static readonly RULE_relationshipOperation = 24; + public static readonly RULE_targetConstraint = 25; + public static readonly RULE_packageResourceDecl = 26; + public static readonly RULE_packageExport = 27; + public static readonly RULE_moduleExport = 28; + public static readonly RULE_presentationDecl = 29; + public static readonly RULE_packageQuery = 30; + public static readonly RULE_packageQuerySpecialization = 31; + public static readonly RULE_queryClause = 32; + public static readonly RULE_packageOperationExport = 33; + public static readonly RULE_packageFunctionExport = 34; + public static readonly RULE_acceptanceClause = 35; + public static readonly RULE_executionClause = 36; + public static readonly RULE_selectedOperations = 37; + public static readonly RULE_packageConstructorExport = 38; + public static readonly RULE_eventClause = 39; + public static readonly RULE_operationMode = 40; + public static readonly RULE_receiverRequirement = 41; + public static readonly RULE_identifierList = 42; + public static readonly RULE_dependencyBlock = 43; + public static readonly RULE_dependencyPort = 44; + public static readonly RULE_primitiveList = 45; + public static readonly RULE_primitive = 46; + public static readonly RULE_sharedAttachmentDecl = 47; + public static readonly RULE_attachmentDecl = 48; + public static readonly RULE_stateDecl = 49; + public static readonly RULE_storagePolicy = 50; + public static readonly RULE_edgeDecl = 51; + public static readonly RULE_edgeEndpoint = 52; + public static readonly RULE_conformanceDecl = 53; + public static readonly RULE_conformanceItem = 54; + public static readonly RULE_moduleBindingDecl = 55; + public static readonly RULE_initializationDecl = 56; + public static readonly RULE_initializationField = 57; + public static readonly RULE_creationOwnerMapping = 58; + public static readonly RULE_stateFieldBindingDecl = 59; + public static readonly RULE_relationshipMaterializationDecl = 60; + public static readonly RULE_operationBindingDecl = 61; + public static readonly RULE_memberOperationRef = 62; + public static readonly RULE_operationName = 63; + public static readonly RULE_operationProvider = 64; + public static readonly RULE_acceptanceBinding = 65; + public static readonly RULE_statePrimitive = 66; + public static readonly RULE_edgePrimitive = 67; + public static readonly RULE_dependencyBindingBlock = 68; + public static readonly RULE_dependencyBinding = 69; + public static readonly RULE_constructorBindingDecl = 70; + public static readonly RULE_valueType = 71; + public static readonly RULE_recordField = 72; + public static readonly RULE_scalarType = 73; + public static readonly RULE_cardinality = 74; + public static readonly RULE_jsonLiteral = 75; + public static readonly RULE_jsonObject = 76; + public static readonly RULE_jsonMember = 77; + public static readonly RULE_jsonArray = 78; + public static readonly RULE_identifier = 79; + public static readonly RULE_stringLiteral = 80; public static readonly literalNames = [ - null, "'edit'", "'component'", "'presentation'", "'subject'", "'runtime'", + null, "'edit'", "'module'", "'contract'", "'presentation'", "'subject'", "'for'", "'creation'", "'initialize'", "'workspace'", "'execution'", "'snapshot'", "'transaction'", "'remote'", "'targets'", "'portable'", "'replica'", "'local'", "'from'", "'result-bytes'", "'rpc-calls'", @@ -273,8 +275,8 @@ export class QuixosCapabilityParser extends antlr.Parser { ]; public static readonly symbolicNames = [ - null, "EDIT", "COMPONENT", "PRESENTATION", "SUBJECT", "RUNTIME", - "FOR", "CREATION", "INITIALIZE", "WORKSPACE", "EXECUTION", "SNAPSHOT", + null, "EDIT", "MODULE", "CONTRACT", "PRESENTATION", "SUBJECT", "FOR", + "CREATION", "INITIALIZE", "WORKSPACE", "EXECUTION", "SNAPSHOT", "TRANSACTION", "REMOTE", "TARGETS", "PORTABLE", "REPLICA", "LOCAL", "FROM", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", "REFLECTION", "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", "MAX", "ALLOW", @@ -303,23 +305,24 @@ export class QuixosCapabilityParser extends antlr.Parser { "workspaceItem", "resourceImportDecl", "externalAtomDecl", "externalInterfaceDecl", "resourcePreamble", "atomDecl", "interfaceResourceDecl", "typeParameters", "typeParameter", "interfaceType", "typeArguments", "typeArgument", - "typeAliasDecl", "interfaceMember", "operationMember", "valueMember", - "valueMemberOperation", "relationshipMember", "queryReadContract", + "typeAliasDecl", "interfaceMember", "moduleMember", "operationMember", + "valueMember", "valueMemberOperation", "relationshipMember", "queryReadContract", "relationshipOperation", "targetConstraint", "packageResourceDecl", - "packageExport", "componentDecl", "presentationDecl", "packageQuery", + "packageExport", "moduleExport", "presentationDecl", "packageQuery", "packageQuerySpecialization", "queryClause", "packageOperationExport", "packageFunctionExport", "acceptanceClause", "executionClause", "selectedOperations", "packageConstructorExport", "eventClause", "operationMode", "receiverRequirement", "identifierList", "dependencyBlock", "dependencyPort", "primitiveList", "primitive", "sharedAttachmentDecl", "attachmentDecl", "stateDecl", "storagePolicy", "edgeDecl", "edgeEndpoint", - "conformanceDecl", "conformanceItem", "initializationDecl", "initializationField", - "creationOwnerMapping", "stateFieldBindingDecl", "relationshipMaterializationDecl", - "operationBindingDecl", "memberOperationRef", "operationName", "operationProvider", - "acceptanceBinding", "statePrimitive", "edgePrimitive", "dependencyBindingBlock", - "dependencyBinding", "constructorBindingDecl", "valueType", "recordField", - "scalarType", "cardinality", "jsonLiteral", "jsonObject", "jsonMember", - "jsonArray", "identifier", "stringLiteral", + "conformanceDecl", "conformanceItem", "moduleBindingDecl", "initializationDecl", + "initializationField", "creationOwnerMapping", "stateFieldBindingDecl", + "relationshipMaterializationDecl", "operationBindingDecl", "memberOperationRef", + "operationName", "operationProvider", "acceptanceBinding", "statePrimitive", + "edgePrimitive", "dependencyBindingBlock", "dependencyBinding", + "constructorBindingDecl", "valueType", "recordField", "scalarType", + "cardinality", "jsonLiteral", "jsonObject", "jsonMember", "jsonArray", + "identifier", "stringLiteral", ]; public get grammarFileName(): string { return "QuixosCapability.g4"; } @@ -340,42 +343,42 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new DocumentContext(this.context, this.state); this.enterRule(localContext, 0, QuixosCapabilityParser.RULE_document); try { - this.state = 170; + this.state = 174; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 0, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 158; + this.state = 162; this.workspaceDecl(); - this.state = 159; + this.state = 163; this.match(QuixosCapabilityParser.EOF); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 161; + this.state = 165; this.interfaceResourceDecl(); - this.state = 162; + this.state = 166; this.match(QuixosCapabilityParser.EOF); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 164; + this.state = 168; this.packageResourceDecl(); - this.state = 165; + this.state = 169; this.match(QuixosCapabilityParser.EOF); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 167; + this.state = 171; this.fragmentDecl(); - this.state = 168; + this.state = 172; this.match(QuixosCapabilityParser.EOF); } break; @@ -401,25 +404,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 172; + this.state = 176; this.match(QuixosCapabilityParser.FRAGMENT); - this.state = 173; - this.match(QuixosCapabilityParser.LBRACE); this.state = 177; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 181; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 3 || ((((_la - 35)) & ~0x1F) === 0 && ((1 << (_la - 35)) & 34144577) !== 0)) { + while (_la === 4 || ((((_la - 35)) & ~0x1F) === 0 && ((1 << (_la - 35)) & 34144577) !== 0)) { { { - this.state = 174; + this.state = 178; this.workspaceItem(); } } - this.state = 179; + this.state = 183; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 180; + this.state = 184; this.match(QuixosCapabilityParser.RBRACE); } } @@ -442,11 +445,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 182; + this.state = 186; this.match(QuixosCapabilityParser.IMPORT); - this.state = 183; + this.state = 187; this.stringLiteral(); - this.state = 184; + this.state = 188; this.match(QuixosCapabilityParser.SEMI); } } @@ -470,39 +473,39 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 186; - this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 187; - this.identifier(); - this.state = 188; - this.match(QuixosCapabilityParser.ID); - this.state = 189; - this.stringLiteral(); this.state = 190; - this.match(QuixosCapabilityParser.REVISION); + this.match(QuixosCapabilityParser.WORKSPACE); this.state = 191; - this.stringLiteral(); + this.identifier(); this.state = 192; - this.match(QuixosCapabilityParser.COMMIT); + this.match(QuixosCapabilityParser.ID); this.state = 193; this.stringLiteral(); this.state = 194; - this.match(QuixosCapabilityParser.LBRACE); + this.match(QuixosCapabilityParser.REVISION); + this.state = 195; + this.stringLiteral(); + this.state = 196; + this.match(QuixosCapabilityParser.COMMIT); + this.state = 197; + this.stringLiteral(); this.state = 198; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 202; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 3 || ((((_la - 35)) & ~0x1F) === 0 && ((1 << (_la - 35)) & 34144577) !== 0)) { + while (_la === 4 || ((((_la - 35)) & ~0x1F) === 0 && ((1 << (_la - 35)) & 34144577) !== 0)) { { { - this.state = 195; + this.state = 199; this.workspaceItem(); } } - this.state = 200; + this.state = 204; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 201; + this.state = 205; this.match(QuixosCapabilityParser.RBRACE); } } @@ -523,62 +526,62 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new WorkspaceItemContext(this.context, this.state); this.enterRule(localContext, 8, QuixosCapabilityParser.RULE_workspaceItem); try { - this.state = 211; + this.state = 215; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 3, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 203; + this.state = 207; this.sourceImportDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 204; + this.state = 208; this.atomDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 205; + this.state = 209; this.resourceImportDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 206; + this.state = 210; this.sharedAttachmentDecl(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 207; + this.state = 211; this.conformanceDecl(); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 208; + this.state = 212; this.constructorBindingDecl(); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 209; + this.state = 213; this.presentationDecl(); } break; case 8: this.enterOuterAlt(localContext, 8); { - this.state = 210; + this.state = 214; this.typeAliasDecl(); } break; @@ -601,32 +604,32 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ResourceImportDeclContext(this.context, this.state); this.enterRule(localContext, 10, QuixosCapabilityParser.RULE_resourceImportDecl); try { - this.state = 223; + this.state = 227; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 4, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 213; + this.state = 217; this.match(QuixosCapabilityParser.IMPORT); - this.state = 214; + this.state = 218; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 215; + this.state = 219; this.identifier(); - this.state = 216; + this.state = 220; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 218; + this.state = 222; this.match(QuixosCapabilityParser.IMPORT); - this.state = 219; + this.state = 223; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 220; + this.state = 224; this.identifier(); - this.state = 221; + this.state = 225; this.match(QuixosCapabilityParser.SEMI); } break; @@ -651,17 +654,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 225; - this.match(QuixosCapabilityParser.EXTERNAL); - this.state = 226; - this.match(QuixosCapabilityParser.ATOM); - this.state = 227; - this.identifier(); - this.state = 228; - this.match(QuixosCapabilityParser.ID); this.state = 229; - this.stringLiteral(); + this.match(QuixosCapabilityParser.EXTERNAL); this.state = 230; + this.match(QuixosCapabilityParser.ATOM); + this.state = 231; + this.identifier(); + this.state = 232; + this.match(QuixosCapabilityParser.ID); + this.state = 233; + this.stringLiteral(); + this.state = 234; this.match(QuixosCapabilityParser.SEMI); } } @@ -684,17 +687,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 232; - this.match(QuixosCapabilityParser.EXTERNAL); - this.state = 233; - this.match(QuixosCapabilityParser.INTERFACE); - this.state = 234; - this.identifier(); - this.state = 235; - this.match(QuixosCapabilityParser.REVISION); this.state = 236; - this.stringLiteral(); + this.match(QuixosCapabilityParser.EXTERNAL); this.state = 237; + this.match(QuixosCapabilityParser.INTERFACE); + this.state = 238; + this.identifier(); + this.state = 239; + this.match(QuixosCapabilityParser.REVISION); + this.state = 240; + this.stringLiteral(); + this.state = 241; this.match(QuixosCapabilityParser.SEMI); } } @@ -715,34 +718,34 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ResourcePreambleContext(this.context, this.state); this.enterRule(localContext, 16, QuixosCapabilityParser.RULE_resourcePreamble); try { - this.state = 243; + this.state = 247; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 5, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 239; + this.state = 243; this.resourceImportDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 240; + this.state = 244; this.externalAtomDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 241; + this.state = 245; this.externalInterfaceDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 242; + this.state = 246; this.typeAliasDecl(); } break; @@ -768,27 +771,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 245; + this.state = 249; this.match(QuixosCapabilityParser.ATOM); - this.state = 246; + this.state = 250; this.identifier(); - this.state = 247; - this.match(QuixosCapabilityParser.ID); - this.state = 248; - this.stringLiteral(); this.state = 251; + this.match(QuixosCapabilityParser.ID); + this.state = 252; + this.stringLiteral(); + this.state = 255; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 85) { { - this.state = 249; + this.state = 253; this.match(QuixosCapabilityParser.DOC); - this.state = 250; + this.state = 254; this.stringLiteral(); } } - this.state = 253; + this.state = 257; this.match(QuixosCapabilityParser.SEMI); } } @@ -812,87 +815,87 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 258; + this.state = 262; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (((((_la - 35)) & ~0x1F) === 0 && ((1 << (_la - 35)) & 193) !== 0)) { { { - this.state = 255; + this.state = 259; this.resourcePreamble(); } } - this.state = 260; + this.state = 264; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 261; + this.state = 265; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 262; + this.state = 266; this.identifier(); - this.state = 264; + this.state = 268; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 263; + this.state = 267; this.typeParameters(); } } - this.state = 266; + this.state = 270; this.match(QuixosCapabilityParser.ID); - this.state = 267; + this.state = 271; this.stringLiteral(); - this.state = 268; + this.state = 272; this.match(QuixosCapabilityParser.REVISION); - this.state = 269; + this.state = 273; this.stringLiteral(); - this.state = 279; + this.state = 283; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 89) { { - this.state = 270; + this.state = 274; this.match(QuixosCapabilityParser.REQUIRES); - this.state = 271; + this.state = 275; this.interfaceType(); - this.state = 276; + this.state = 280; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 272; + this.state = 276; this.match(QuixosCapabilityParser.COMMA); - this.state = 273; + this.state = 277; this.interfaceType(); } } - this.state = 278; + this.state = 282; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 281; - this.match(QuixosCapabilityParser.LBRACE); this.state = 285; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 289; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33783809) !== 0)) { + while (_la === 2 || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33783809) !== 0)) { { { - this.state = 282; + this.state = 286; this.interfaceMember(); } } - this.state = 287; + this.state = 291; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 288; + this.state = 292; this.match(QuixosCapabilityParser.RBRACE); } } @@ -916,27 +919,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 290; + this.state = 294; this.match(QuixosCapabilityParser.LT); - this.state = 291; + this.state = 295; this.typeParameter(); - this.state = 296; + this.state = 300; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 292; + this.state = 296; this.match(QuixosCapabilityParser.COMMA); - this.state = 293; + this.state = 297; this.typeParameter(); } } - this.state = 298; + this.state = 302; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 299; + this.state = 303; this.match(QuixosCapabilityParser.GT); } } @@ -958,24 +961,24 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 24, QuixosCapabilityParser.RULE_typeParameter); let _la: number; try { - this.state = 320; + this.state = 324; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.VALUE: this.enterOuterAlt(localContext, 1); { - this.state = 301; - this.match(QuixosCapabilityParser.VALUE); - this.state = 302; - this.identifier(); this.state = 305; + this.match(QuixosCapabilityParser.VALUE); + this.state = 306; + this.identifier(); + this.state = 309; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 133) { { - this.state = 303; + this.state = 307; this.match(QuixosCapabilityParser.COLON); - this.state = 304; + this.state = 308; this.match(QuixosCapabilityParser.STORABLE); } } @@ -985,32 +988,32 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 2); { - this.state = 307; + this.state = 311; this.match(QuixosCapabilityParser.OBJECT); - this.state = 308; + this.state = 312; this.identifier(); - this.state = 318; + this.state = 322; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 38) { { - this.state = 309; + this.state = 313; this.match(QuixosCapabilityParser.IMPLEMENTS); - this.state = 310; + this.state = 314; this.interfaceType(); - this.state = 315; + this.state = 319; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 145) { { { - this.state = 311; + this.state = 315; this.match(QuixosCapabilityParser.AMP); - this.state = 312; + this.state = 316; this.interfaceType(); } } - this.state = 317; + this.state = 321; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } @@ -1043,14 +1046,14 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 322; + this.state = 326; this.identifier(); - this.state = 324; + this.state = 328; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 323; + this.state = 327; this.typeArguments(); } } @@ -1077,27 +1080,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 326; + this.state = 330; this.match(QuixosCapabilityParser.LT); - this.state = 327; + this.state = 331; this.typeArgument(); - this.state = 332; + this.state = 336; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 328; + this.state = 332; this.match(QuixosCapabilityParser.COMMA); - this.state = 329; + this.state = 333; this.typeArgument(); } } - this.state = 334; + this.state = 338; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 335; + this.state = 339; this.match(QuixosCapabilityParser.GT); } } @@ -1118,41 +1121,39 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new TypeArgumentContext(this.context, this.state); this.enterRule(localContext, 30, QuixosCapabilityParser.RULE_typeArgument); try { - this.state = 344; + this.state = 348; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 1); { - this.state = 337; + this.state = 341; this.match(QuixosCapabilityParser.ATOM); - this.state = 338; + this.state = 342; this.identifier(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 2); { - this.state = 339; + this.state = 343; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 340; + this.state = 344; this.interfaceType(); } break; case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 341; + this.state = 345; this.match(QuixosCapabilityParser.OBJECT); - this.state = 342; + this.state = 346; this.identifier(); } break; case QuixosCapabilityParser.EDIT: - case QuixosCapabilityParser.COMPONENT: case QuixosCapabilityParser.PRESENTATION: case QuixosCapabilityParser.SUBJECT: - case QuixosCapabilityParser.RUNTIME: case QuixosCapabilityParser.FOR: case QuixosCapabilityParser.CREATION: case QuixosCapabilityParser.INITIALIZE: @@ -1205,7 +1206,7 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 4); { - this.state = 343; + this.state = 347; this.valueType(); } break; @@ -1233,25 +1234,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 346; + this.state = 350; this.match(QuixosCapabilityParser.TYPE); - this.state = 347; + this.state = 351; this.identifier(); - this.state = 349; + this.state = 353; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 348; + this.state = 352; this.typeParameters(); } } - this.state = 351; + this.state = 355; this.match(QuixosCapabilityParser.EQUAL); - this.state = 352; + this.state = 356; this.valueType(); - this.state = 353; + this.state = 357; this.match(QuixosCapabilityParser.SEMI); } } @@ -1272,30 +1273,37 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new InterfaceMemberContext(this.context, this.state); this.enterRule(localContext, 34, QuixosCapabilityParser.RULE_interfaceMember); try { - this.state = 358; + this.state = 363; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 21, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 355; + this.state = 359; this.valueMember(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 356; + this.state = 360; this.relationshipMember(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 357; + this.state = 361; this.operationMember(); } break; + case 4: + this.enterOuterAlt(localContext, 4); + { + this.state = 362; + this.moduleMember(); + } + break; } } catch (re) { @@ -1311,60 +1319,108 @@ export class QuixosCapabilityParser extends antlr.Parser { } return localContext; } - public operationMember(): OperationMemberContext { - let localContext = new OperationMemberContext(this.context, this.state); - this.enterRule(localContext, 36, QuixosCapabilityParser.RULE_operationMember); + public moduleMember(): ModuleMemberContext { + let localContext = new ModuleMemberContext(this.context, this.state); + this.enterRule(localContext, 36, QuixosCapabilityParser.RULE_moduleMember); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 361; + this.state = 365; + this.match(QuixosCapabilityParser.MODULE); + this.state = 366; + this.identifier(); + this.state = 367; + this.match(QuixosCapabilityParser.ID); + this.state = 368; + this.stringLiteral(); + this.state = 369; + this.match(QuixosCapabilityParser.CONTRACT); + this.state = 370; + this.stringLiteral(); + this.state = 373; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 5) { + { + this.state = 371; + this.match(QuixosCapabilityParser.SUBJECT); + this.state = 372; + this.targetConstraint(); + } + } + + this.state = 375; + this.match(QuixosCapabilityParser.SEMI); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public operationMember(): OperationMemberContext { + let localContext = new OperationMemberContext(this.context, this.state); + this.enterRule(localContext, 38, QuixosCapabilityParser.RULE_operationMember); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 378; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 57) { { - this.state = 360; + this.state = 377; this.match(QuixosCapabilityParser.STATIC); } } - this.state = 363; + this.state = 380; this.match(QuixosCapabilityParser.OPERATION); - this.state = 364; + this.state = 381; this.identifier(); - this.state = 365; + this.state = 382; this.match(QuixosCapabilityParser.ID); - this.state = 366; + this.state = 383; this.stringLiteral(); - this.state = 367; + this.state = 384; this.match(QuixosCapabilityParser.COLON); - this.state = 368; + this.state = 385; this.valueType(); - this.state = 369; + this.state = 386; this.match(QuixosCapabilityParser.ARROW); - this.state = 370; + this.state = 387; this.valueType(); - this.state = 371; + this.state = 388; this.match(QuixosCapabilityParser.LBRACE); - this.state = 372; + this.state = 389; this.match(QuixosCapabilityParser.CALL); - this.state = 373; + this.state = 390; this.match(QuixosCapabilityParser.ID); - this.state = 374; + this.state = 391; this.stringLiteral(); - this.state = 376; + this.state = 393; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 375; + this.state = 392; this.executionClause(); } } - this.state = 378; + this.state = 395; this.match(QuixosCapabilityParser.SEMI); - this.state = 379; + this.state = 396; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1383,50 +1439,50 @@ export class QuixosCapabilityParser extends antlr.Parser { } public valueMember(): ValueMemberContext { let localContext = new ValueMemberContext(this.context, this.state); - this.enterRule(localContext, 38, QuixosCapabilityParser.RULE_valueMember); + this.enterRule(localContext, 40, QuixosCapabilityParser.RULE_valueMember); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 382; + this.state = 399; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 32) { { - this.state = 381; + this.state = 398; this.queryReadContract(); } } - this.state = 384; + this.state = 401; this.match(QuixosCapabilityParser.VALUE); - this.state = 385; + this.state = 402; this.identifier(); - this.state = 386; + this.state = 403; this.match(QuixosCapabilityParser.ID); - this.state = 387; + this.state = 404; this.stringLiteral(); - this.state = 388; + this.state = 405; this.match(QuixosCapabilityParser.COLON); - this.state = 389; + this.state = 406; this.valueType(); - this.state = 390; + this.state = 407; this.match(QuixosCapabilityParser.LBRACE); - this.state = 394; + this.state = 411; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 1 || ((((_la - 91)) & ~0x1F) === 0 && ((1 << (_la - 91)) & 7) !== 0)) { { { - this.state = 391; + this.state = 408; this.valueMemberOperation(); } } - this.state = 396; + this.state = 413; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 397; + this.state = 414; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1445,99 +1501,99 @@ export class QuixosCapabilityParser extends antlr.Parser { } public valueMemberOperation(): ValueMemberOperationContext { let localContext = new ValueMemberOperationContext(this.context, this.state); - this.enterRule(localContext, 40, QuixosCapabilityParser.RULE_valueMemberOperation); + this.enterRule(localContext, 42, QuixosCapabilityParser.RULE_valueMemberOperation); let _la: number; try { - this.state = 432; + this.state = 449; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.GET: this.enterOuterAlt(localContext, 1); { - this.state = 399; + this.state = 416; this.match(QuixosCapabilityParser.GET); - this.state = 400; + this.state = 417; this.match(QuixosCapabilityParser.ID); - this.state = 401; + this.state = 418; this.stringLiteral(); - this.state = 403; + this.state = 420; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 402; + this.state = 419; this.executionClause(); } } - this.state = 405; + this.state = 422; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.SET: this.enterOuterAlt(localContext, 2); { - this.state = 407; + this.state = 424; this.match(QuixosCapabilityParser.SET); - this.state = 408; + this.state = 425; this.match(QuixosCapabilityParser.ID); - this.state = 409; + this.state = 426; this.stringLiteral(); - this.state = 411; + this.state = 428; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 410; + this.state = 427; this.executionClause(); } } - this.state = 413; + this.state = 430; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.EDIT: this.enterOuterAlt(localContext, 3); { - this.state = 415; + this.state = 432; this.match(QuixosCapabilityParser.EDIT); - this.state = 416; + this.state = 433; this.match(QuixosCapabilityParser.ID); - this.state = 417; + this.state = 434; this.stringLiteral(); - this.state = 419; + this.state = 436; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 418; + this.state = 435; this.executionClause(); } } - this.state = 421; + this.state = 438; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 4); { - this.state = 423; + this.state = 440; this.match(QuixosCapabilityParser.WATCH); - this.state = 424; + this.state = 441; this.match(QuixosCapabilityParser.START); - this.state = 425; + this.state = 442; this.match(QuixosCapabilityParser.ID); - this.state = 426; + this.state = 443; this.stringLiteral(); - this.state = 427; + this.state = 444; this.match(QuixosCapabilityParser.STOP); - this.state = 428; + this.state = 445; this.match(QuixosCapabilityParser.ID); - this.state = 429; + this.state = 446; this.stringLiteral(); - this.state = 430; + this.state = 447; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1560,74 +1616,74 @@ export class QuixosCapabilityParser extends antlr.Parser { } public relationshipMember(): RelationshipMemberContext { let localContext = new RelationshipMemberContext(this.context, this.state); - this.enterRule(localContext, 42, QuixosCapabilityParser.RULE_relationshipMember); + this.enterRule(localContext, 44, QuixosCapabilityParser.RULE_relationshipMember); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 435; + this.state = 452; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 32) { { - this.state = 434; + this.state = 451; this.queryReadContract(); } } - this.state = 437; + this.state = 454; this.match(QuixosCapabilityParser.RELATION); - this.state = 438; + this.state = 455; this.identifier(); - this.state = 439; + this.state = 456; this.match(QuixosCapabilityParser.ID); - this.state = 440; + this.state = 457; this.stringLiteral(); - this.state = 441; + this.state = 458; this.match(QuixosCapabilityParser.COLON); - this.state = 442; + this.state = 459; this.cardinality(); - this.state = 443; + this.state = 460; this.targetConstraint(); - this.state = 445; + this.state = 462; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 112) { { - this.state = 444; + this.state = 461; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 449; + this.state = 466; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 82) { { - this.state = 447; + this.state = 464; this.match(QuixosCapabilityParser.KEYED); - this.state = 448; + this.state = 465; this.stringLiteral(); } } - this.state = 451; + this.state = 468; this.match(QuixosCapabilityParser.LBRACE); - this.state = 455; + this.state = 472; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (((((_la - 93)) & ~0x1F) === 0 && ((1 << (_la - 93)) & 225) !== 0)) { { { - this.state = 452; + this.state = 469; this.relationshipOperation(); } } - this.state = 457; + this.state = 474; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 458; + this.state = 475; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1646,19 +1702,19 @@ export class QuixosCapabilityParser extends antlr.Parser { } public queryReadContract(): QueryReadContractContext { let localContext = new QueryReadContractContext(this.context, this.state); - this.enterRule(localContext, 44, QuixosCapabilityParser.RULE_queryReadContract); + this.enterRule(localContext, 46, QuixosCapabilityParser.RULE_queryReadContract); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 460; + this.state = 477; this.match(QuixosCapabilityParser.QUERYABLE); - this.state = 462; + this.state = 479; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 15 || _la === 33) { { - this.state = 461; + this.state = 478; _la = this.tokenStream.LA(1); if(!(_la === 15 || _la === 33)) { this.errorHandler.recoverInline(this); @@ -1687,99 +1743,99 @@ export class QuixosCapabilityParser extends antlr.Parser { } public relationshipOperation(): RelationshipOperationContext { let localContext = new RelationshipOperationContext(this.context, this.state); - this.enterRule(localContext, 46, QuixosCapabilityParser.RULE_relationshipOperation); + this.enterRule(localContext, 48, QuixosCapabilityParser.RULE_relationshipOperation); let _la: number; try { - this.state = 497; + this.state = 514; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.RESOLVE: this.enterOuterAlt(localContext, 1); { - this.state = 464; + this.state = 481; this.match(QuixosCapabilityParser.RESOLVE); - this.state = 465; + this.state = 482; this.match(QuixosCapabilityParser.ID); - this.state = 466; + this.state = 483; this.stringLiteral(); - this.state = 468; + this.state = 485; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 467; + this.state = 484; this.executionClause(); } } - this.state = 470; + this.state = 487; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONNECT: this.enterOuterAlt(localContext, 2); { - this.state = 472; + this.state = 489; this.match(QuixosCapabilityParser.CONNECT); - this.state = 473; + this.state = 490; this.match(QuixosCapabilityParser.ID); - this.state = 474; + this.state = 491; this.stringLiteral(); - this.state = 476; + this.state = 493; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 475; + this.state = 492; this.executionClause(); } } - this.state = 478; + this.state = 495; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.DISCONNECT: this.enterOuterAlt(localContext, 3); { - this.state = 480; + this.state = 497; this.match(QuixosCapabilityParser.DISCONNECT); - this.state = 481; + this.state = 498; this.match(QuixosCapabilityParser.ID); - this.state = 482; + this.state = 499; this.stringLiteral(); - this.state = 484; + this.state = 501; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 483; + this.state = 500; this.executionClause(); } } - this.state = 486; + this.state = 503; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 4); { - this.state = 488; + this.state = 505; this.match(QuixosCapabilityParser.WATCH); - this.state = 489; + this.state = 506; this.match(QuixosCapabilityParser.START); - this.state = 490; + this.state = 507; this.match(QuixosCapabilityParser.ID); - this.state = 491; + this.state = 508; this.stringLiteral(); - this.state = 492; + this.state = 509; this.match(QuixosCapabilityParser.STOP); - this.state = 493; + this.state = 510; this.match(QuixosCapabilityParser.ID); - this.state = 494; + this.state = 511; this.stringLiteral(); - this.state = 495; + this.state = 512; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1802,34 +1858,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public targetConstraint(): TargetConstraintContext { let localContext = new TargetConstraintContext(this.context, this.state); - this.enterRule(localContext, 48, QuixosCapabilityParser.RULE_targetConstraint); + this.enterRule(localContext, 50, QuixosCapabilityParser.RULE_targetConstraint); let _la: number; try { - this.state = 508; + this.state = 525; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 1); { - this.state = 499; + this.state = 516; this.match(QuixosCapabilityParser.ATOM); - this.state = 500; + this.state = 517; this.identifier(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 2); { - this.state = 501; + this.state = 518; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 502; + this.state = 519; this.identifier(); - this.state = 504; + this.state = 521; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 503; + this.state = 520; this.typeArguments(); } } @@ -1839,9 +1895,9 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 506; + this.state = 523; this.match(QuixosCapabilityParser.OBJECT); - this.state = 507; + this.state = 524; this.identifier(); } break; @@ -1864,59 +1920,19 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageResourceDecl(): PackageResourceDeclContext { let localContext = new PackageResourceDeclContext(this.context, this.state); - this.enterRule(localContext, 50, QuixosCapabilityParser.RULE_packageResourceDecl); + this.enterRule(localContext, 52, QuixosCapabilityParser.RULE_packageResourceDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 513; + this.state = 530; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (((((_la - 35)) & ~0x1F) === 0 && ((1 << (_la - 35)) & 193) !== 0)) { - { - { - this.state = 510; - this.resourcePreamble(); - } - } - this.state = 515; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - } - this.state = 516; - this.match(QuixosCapabilityParser.PACKAGE); - this.state = 517; - this.identifier(); - this.state = 518; - this.match(QuixosCapabilityParser.ID); - this.state = 519; - this.stringLiteral(); - this.state = 520; - this.match(QuixosCapabilityParser.REVISION); - this.state = 521; - this.stringLiteral(); - this.state = 524; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 78) { - { - this.state = 522; - this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); - this.state = 523; - this.match(QuixosCapabilityParser.INTEGER); - } - } - - this.state = 526; - this.match(QuixosCapabilityParser.LBRACE); - this.state = 530; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - while (_la === 2 || _la === 22 || ((((_la - 49)) & ~0x1F) === 0 && ((1 << (_la - 49)) & 7) !== 0)) { { { this.state = 527; - this.packageExport(); + this.resourcePreamble(); } } this.state = 532; @@ -1924,6 +1940,46 @@ export class QuixosCapabilityParser extends antlr.Parser { _la = this.tokenStream.LA(1); } this.state = 533; + this.match(QuixosCapabilityParser.PACKAGE); + this.state = 534; + this.identifier(); + this.state = 535; + this.match(QuixosCapabilityParser.ID); + this.state = 536; + this.stringLiteral(); + this.state = 537; + this.match(QuixosCapabilityParser.REVISION); + this.state = 538; + this.stringLiteral(); + this.state = 541; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 78) { + { + this.state = 539; + this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); + this.state = 540; + this.match(QuixosCapabilityParser.INTEGER); + } + } + + this.state = 543; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 547; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while (_la === 2 || _la === 22 || ((((_la - 49)) & ~0x1F) === 0 && ((1 << (_la - 49)) & 7) !== 0)) { + { + { + this.state = 544; + this.packageExport(); + } + } + this.state = 549; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + this.state = 550; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1942,51 +1998,51 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageExport(): PackageExportContext { let localContext = new PackageExportContext(this.context, this.state); - this.enterRule(localContext, 52, QuixosCapabilityParser.RULE_packageExport); + this.enterRule(localContext, 54, QuixosCapabilityParser.RULE_packageExport); try { - this.state = 541; + this.state = 558; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 44, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 45, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 535; + this.state = 552; this.packageOperationExport(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 536; + this.state = 553; this.packageFunctionExport(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 537; + this.state = 554; this.packageConstructorExport(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 538; + this.state = 555; this.packageQuery(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 539; + this.state = 556; this.packageQuerySpecialization(); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 540; - this.componentDecl(); + this.state = 557; + this.moduleExport(); } break; } @@ -2004,29 +2060,29 @@ export class QuixosCapabilityParser extends antlr.Parser { } return localContext; } - public componentDecl(): ComponentDeclContext { - let localContext = new ComponentDeclContext(this.context, this.state); - this.enterRule(localContext, 54, QuixosCapabilityParser.RULE_componentDecl); + public moduleExport(): ModuleExportContext { + let localContext = new ModuleExportContext(this.context, this.state); + this.enterRule(localContext, 56, QuixosCapabilityParser.RULE_moduleExport); try { this.enterOuterAlt(localContext, 1); { - this.state = 543; - this.match(QuixosCapabilityParser.COMPONENT); - this.state = 544; + this.state = 560; + this.match(QuixosCapabilityParser.MODULE); + this.state = 561; this.identifier(); - this.state = 545; + this.state = 562; this.match(QuixosCapabilityParser.ID); - this.state = 546; + this.state = 563; this.stringLiteral(); - this.state = 547; - this.match(QuixosCapabilityParser.SUBJECT); - this.state = 548; + this.state = 564; + this.match(QuixosCapabilityParser.IMPLEMENTS); + this.state = 565; this.interfaceType(); - this.state = 549; - this.match(QuixosCapabilityParser.RUNTIME); - this.state = 550; + this.state = 566; + this.match(QuixosCapabilityParser.DOT); + this.state = 567; this.identifier(); - this.state = 551; + this.state = 568; this.match(QuixosCapabilityParser.SEMI); } } @@ -2045,31 +2101,31 @@ export class QuixosCapabilityParser extends antlr.Parser { } public presentationDecl(): PresentationDeclContext { let localContext = new PresentationDeclContext(this.context, this.state); - this.enterRule(localContext, 56, QuixosCapabilityParser.RULE_presentationDecl); + this.enterRule(localContext, 58, QuixosCapabilityParser.RULE_presentationDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 553; + this.state = 570; this.match(QuixosCapabilityParser.PRESENTATION); - this.state = 554; + this.state = 571; this.identifier(); - this.state = 555; + this.state = 572; this.match(QuixosCapabilityParser.ID); - this.state = 556; + this.state = 573; this.stringLiteral(); - this.state = 557; + this.state = 574; this.match(QuixosCapabilityParser.FOR); - this.state = 558; + this.state = 575; this.interfaceType(); - this.state = 559; + this.state = 576; this.match(QuixosCapabilityParser.USING); - this.state = 560; + this.state = 577; this.identifier(); - this.state = 561; + this.state = 578; this.match(QuixosCapabilityParser.DOT); - this.state = 562; + this.state = 579; this.identifier(); - this.state = 563; + this.state = 580; this.match(QuixosCapabilityParser.SEMI); } } @@ -2088,68 +2144,68 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageQuery(): PackageQueryContext { let localContext = new PackageQueryContext(this.context, this.state); - this.enterRule(localContext, 58, QuixosCapabilityParser.RULE_packageQuery); + this.enterRule(localContext, 60, QuixosCapabilityParser.RULE_packageQuery); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 565; + this.state = 582; this.match(QuixosCapabilityParser.QUERY); - this.state = 566; + this.state = 583; this.identifier(); - this.state = 568; + this.state = 585; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 567; + this.state = 584; this.typeParameters(); } } - this.state = 570; + this.state = 587; this.match(QuixosCapabilityParser.ID); - this.state = 571; + this.state = 588; this.stringLiteral(); - this.state = 572; + this.state = 589; this.match(QuixosCapabilityParser.ROOT); - this.state = 574; + this.state = 591; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 9) { { - this.state = 573; + this.state = 590; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 576; + this.state = 593; this.interfaceType(); - this.state = 577; + this.state = 594; this.match(QuixosCapabilityParser.DOCUMENT); - this.state = 578; + this.state = 595; this.stringLiteral(); - this.state = 579; + this.state = 596; this.match(QuixosCapabilityParser.OPERATION); - this.state = 580; + this.state = 597; this.stringLiteral(); - this.state = 581; + this.state = 598; this.match(QuixosCapabilityParser.LBRACE); - this.state = 585; + this.state = 602; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4160946176) !== 0) || _la === 93) { { { - this.state = 582; + this.state = 599; this.queryClause(); } } - this.state = 587; + this.state = 604; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 588; + this.state = 605; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2168,25 +2224,25 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageQuerySpecialization(): PackageQuerySpecializationContext { let localContext = new PackageQuerySpecializationContext(this.context, this.state); - this.enterRule(localContext, 60, QuixosCapabilityParser.RULE_packageQuerySpecialization); + this.enterRule(localContext, 62, QuixosCapabilityParser.RULE_packageQuerySpecialization); try { this.enterOuterAlt(localContext, 1); { - this.state = 590; + this.state = 607; this.match(QuixosCapabilityParser.QUERY); - this.state = 591; + this.state = 608; this.identifier(); - this.state = 592; + this.state = 609; this.match(QuixosCapabilityParser.ID); - this.state = 593; + this.state = 610; this.stringLiteral(); - this.state = 594; + this.state = 611; this.match(QuixosCapabilityParser.SPECIALIZE); - this.state = 595; + this.state = 612; this.identifier(); - this.state = 596; + this.state = 613; this.typeArguments(); - this.state = 597; + this.state = 614; this.match(QuixosCapabilityParser.SEMI); } } @@ -2205,121 +2261,121 @@ export class QuixosCapabilityParser extends antlr.Parser { } public queryClause(): QueryClauseContext { let localContext = new QueryClauseContext(this.context, this.state); - this.enterRule(localContext, 62, QuixosCapabilityParser.RULE_queryClause); + this.enterRule(localContext, 64, QuixosCapabilityParser.RULE_queryClause); let _la: number; try { - this.state = 639; + this.state = 656; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REPLICA: this.enterOuterAlt(localContext, 1); { - this.state = 599; + this.state = 616; this.match(QuixosCapabilityParser.REPLICA); - this.state = 600; + this.state = 617; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.LOCAL: this.enterOuterAlt(localContext, 2); { - this.state = 601; + this.state = 618; this.match(QuixosCapabilityParser.LOCAL); - this.state = 602; + this.state = 619; this.match(QuixosCapabilityParser.FROM); - this.state = 603; + this.state = 620; this.identifier(); - this.state = 604; + this.state = 621; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.FRAGMENTS: this.enterOuterAlt(localContext, 3); { - this.state = 606; + this.state = 623; this.match(QuixosCapabilityParser.FRAGMENTS); - this.state = 607; + this.state = 624; this.stringLiteral(); - this.state = 608; + this.state = 625; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.VIEW: this.enterOuterAlt(localContext, 4); { - this.state = 610; + this.state = 627; this.match(QuixosCapabilityParser.VIEW); - this.state = 612; + this.state = 629; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 36) { { - this.state = 611; + this.state = 628; this.match(QuixosCapabilityParser.OBJECT); } } - this.state = 614; + this.state = 631; this.identifier(); - this.state = 615; + this.state = 632; this.match(QuixosCapabilityParser.AS); - this.state = 616; + this.state = 633; this.interfaceType(); - this.state = 617; + this.state = 634; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.MAX: this.enterOuterAlt(localContext, 5); { - this.state = 619; + this.state = 636; this.match(QuixosCapabilityParser.MAX); - this.state = 620; + this.state = 637; this.identifier(); - this.state = 621; + this.state = 638; this.match(QuixosCapabilityParser.INTEGER); - this.state = 622; + this.state = 639; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.ALLOW: this.enterOuterAlt(localContext, 6); { - this.state = 624; + this.state = 641; this.match(QuixosCapabilityParser.ALLOW); - this.state = 625; + this.state = 642; this.interfaceType(); - this.state = 626; + this.state = 643; this.match(QuixosCapabilityParser.DOT); - this.state = 627; + this.state = 644; this.identifier(); - this.state = 628; + this.state = 645; this.identifier(); - this.state = 629; + this.state = 646; this.stringLiteral(); - this.state = 630; + this.state = 647; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 7); { - this.state = 632; + this.state = 649; this.match(QuixosCapabilityParser.WATCH); - this.state = 633; + this.state = 650; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.POLL: this.enterOuterAlt(localContext, 8); { - this.state = 634; + this.state = 651; this.match(QuixosCapabilityParser.POLL); - this.state = 635; + this.state = 652; this.match(QuixosCapabilityParser.INTEGER); - this.state = 636; + this.state = 653; this.stringLiteral(); - this.state = 637; + this.state = 654; this.match(QuixosCapabilityParser.SEMI); } break; @@ -2342,86 +2398,86 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageOperationExport(): PackageOperationExportContext { let localContext = new PackageOperationExportContext(this.context, this.state); - this.enterRule(localContext, 64, QuixosCapabilityParser.RULE_packageOperationExport); + this.enterRule(localContext, 66, QuixosCapabilityParser.RULE_packageOperationExport); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 641; + this.state = 658; this.match(QuixosCapabilityParser.OPERATION); - this.state = 642; + this.state = 659; this.identifier(); - this.state = 644; + this.state = 661; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 643; + this.state = 660; this.typeParameters(); } } - this.state = 646; + this.state = 663; this.match(QuixosCapabilityParser.ID); - this.state = 647; + this.state = 664; this.stringLiteral(); - this.state = 648; + this.state = 665; this.match(QuixosCapabilityParser.COLON); - this.state = 649; + this.state = 666; this.valueType(); - this.state = 650; + this.state = 667; this.match(QuixosCapabilityParser.ARROW); - this.state = 651; + this.state = 668; this.valueType(); - this.state = 652; + this.state = 669; this.match(QuixosCapabilityParser.MODE); - this.state = 653; + this.state = 670; this.operationMode(); - this.state = 655; + this.state = 672; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 654; + this.state = 671; this.executionClause(); } } - this.state = 658; + this.state = 675; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 87) { { - this.state = 657; + this.state = 674; this.eventClause(); } } - this.state = 660; + this.state = 677; this.match(QuixosCapabilityParser.RECEIVER); - this.state = 661; + this.state = 678; this.receiverRequirement(); - this.state = 663; + this.state = 680; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 89) { { - this.state = 662; + this.state = 679; this.dependencyBlock(); } } - this.state = 666; + this.state = 683; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 66) { { - this.state = 665; + this.state = 682; this.acceptanceClause(); } } - this.state = 668; + this.state = 685; this.match(QuixosCapabilityParser.SEMI); } } @@ -2440,68 +2496,68 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageFunctionExport(): PackageFunctionExportContext { let localContext = new PackageFunctionExportContext(this.context, this.state); - this.enterRule(localContext, 66, QuixosCapabilityParser.RULE_packageFunctionExport); + this.enterRule(localContext, 68, QuixosCapabilityParser.RULE_packageFunctionExport); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 670; + this.state = 687; this.match(QuixosCapabilityParser.FUNCTION); - this.state = 671; + this.state = 688; this.identifier(); - this.state = 673; + this.state = 690; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 672; + this.state = 689; this.typeParameters(); } } - this.state = 675; + this.state = 692; this.match(QuixosCapabilityParser.ID); - this.state = 676; + this.state = 693; this.stringLiteral(); - this.state = 677; + this.state = 694; this.match(QuixosCapabilityParser.COLON); - this.state = 678; + this.state = 695; this.valueType(); - this.state = 679; + this.state = 696; this.match(QuixosCapabilityParser.ARROW); - this.state = 680; + this.state = 697; this.valueType(); - this.state = 682; + this.state = 699; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 681; + this.state = 698; this.executionClause(); } } - this.state = 685; + this.state = 702; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 89) { { - this.state = 684; + this.state = 701; this.dependencyBlock(); } } - this.state = 688; + this.state = 705; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 66) { { - this.state = 687; + this.state = 704; this.acceptanceClause(); } } - this.state = 690; + this.state = 707; this.match(QuixosCapabilityParser.SEMI); } } @@ -2520,15 +2576,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public acceptanceClause(): AcceptanceClauseContext { let localContext = new AcceptanceClauseContext(this.context, this.state); - this.enterRule(localContext, 68, QuixosCapabilityParser.RULE_acceptanceClause); + this.enterRule(localContext, 70, QuixosCapabilityParser.RULE_acceptanceClause); try { this.enterOuterAlt(localContext, 1); { - this.state = 692; + this.state = 709; this.match(QuixosCapabilityParser.ACCEPT); - this.state = 693; + this.state = 710; this.match(QuixosCapabilityParser.USING); - this.state = 694; + this.state = 711; this.identifier(); } } @@ -2547,27 +2603,27 @@ export class QuixosCapabilityParser extends antlr.Parser { } public executionClause(): ExecutionClauseContext { let localContext = new ExecutionClauseContext(this.context, this.state); - this.enterRule(localContext, 70, QuixosCapabilityParser.RULE_executionClause); + this.enterRule(localContext, 72, QuixosCapabilityParser.RULE_executionClause); let _la: number; try { - this.state = 705; + this.state = 722; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 59, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 60, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 696; + this.state = 713; this.match(QuixosCapabilityParser.EXECUTION); - this.state = 697; + this.state = 714; this.match(QuixosCapabilityParser.REMOTE); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 698; + this.state = 715; this.match(QuixosCapabilityParser.EXECUTION); - this.state = 699; + this.state = 716; _la = this.tokenStream.LA(1); if(!(_la === 11 || _la === 12)) { this.errorHandler.recoverInline(this); @@ -2576,13 +2632,13 @@ export class QuixosCapabilityParser extends antlr.Parser { this.errorHandler.reportMatch(this); this.consume(); } - this.state = 700; + this.state = 717; this.match(QuixosCapabilityParser.TARGETS); - this.state = 701; + this.state = 718; this.match(QuixosCapabilityParser.LBRACK); - this.state = 702; + this.state = 719; this.identifierList(); - this.state = 703; + this.state = 720; this.match(QuixosCapabilityParser.RBRACK); } break; @@ -2603,34 +2659,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public selectedOperations(): SelectedOperationsContext { let localContext = new SelectedOperationsContext(this.context, this.state); - this.enterRule(localContext, 72, QuixosCapabilityParser.RULE_selectedOperations); + this.enterRule(localContext, 74, QuixosCapabilityParser.RULE_selectedOperations); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 707; + this.state = 724; this.match(QuixosCapabilityParser.USING); - this.state = 708; + this.state = 725; this.match(QuixosCapabilityParser.LBRACK); - this.state = 709; + this.state = 726; this.memberOperationRef(); - this.state = 714; + this.state = 731; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 710; + this.state = 727; this.match(QuixosCapabilityParser.COMMA); - this.state = 711; + this.state = 728; this.memberOperationRef(); } } - this.state = 716; + this.state = 733; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 717; + this.state = 734; this.match(QuixosCapabilityParser.RBRACK); } } @@ -2649,38 +2705,38 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageConstructorExport(): PackageConstructorExportContext { let localContext = new PackageConstructorExportContext(this.context, this.state); - this.enterRule(localContext, 74, QuixosCapabilityParser.RULE_packageConstructorExport); + this.enterRule(localContext, 76, QuixosCapabilityParser.RULE_packageConstructorExport); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 719; + this.state = 736; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 720; + this.state = 737; this.identifier(); - this.state = 721; + this.state = 738; this.match(QuixosCapabilityParser.ID); - this.state = 722; + this.state = 739; this.stringLiteral(); - this.state = 723; + this.state = 740; this.match(QuixosCapabilityParser.CONSTRUCTS); - this.state = 724; + this.state = 741; this.identifier(); - this.state = 725; + this.state = 742; this.match(QuixosCapabilityParser.COLON); - this.state = 726; + this.state = 743; this.valueType(); - this.state = 728; + this.state = 745; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 89) { { - this.state = 727; + this.state = 744; this.dependencyBlock(); } } - this.state = 730; + this.state = 747; this.match(QuixosCapabilityParser.SEMI); } } @@ -2699,13 +2755,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public eventClause(): EventClauseContext { let localContext = new EventClauseContext(this.context, this.state); - this.enterRule(localContext, 76, QuixosCapabilityParser.RULE_eventClause); + this.enterRule(localContext, 78, QuixosCapabilityParser.RULE_eventClause); try { this.enterOuterAlt(localContext, 1); { - this.state = 732; + this.state = 749; this.match(QuixosCapabilityParser.EMITS); - this.state = 733; + this.state = 750; this.valueType(); } } @@ -2724,12 +2780,12 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationMode(): OperationModeContext { let localContext = new OperationModeContext(this.context, this.state); - this.enterRule(localContext, 78, QuixosCapabilityParser.RULE_operationMode); + this.enterRule(localContext, 80, QuixosCapabilityParser.RULE_operationMode); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 735; + this.state = 752; _la = this.tokenStream.LA(1); if(!(((((_la - 101)) & ~0x1F) === 0 && ((1 << (_la - 101)) & 31) !== 0))) { this.errorHandler.recoverInline(this); @@ -2755,71 +2811,71 @@ export class QuixosCapabilityParser extends antlr.Parser { } public receiverRequirement(): ReceiverRequirementContext { let localContext = new ReceiverRequirementContext(this.context, this.state); - this.enterRule(localContext, 80, QuixosCapabilityParser.RULE_receiverRequirement); + this.enterRule(localContext, 82, QuixosCapabilityParser.RULE_receiverRequirement); let _la: number; try { - this.state = 755; + this.state = 772; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ANY: this.enterOuterAlt(localContext, 1); { - this.state = 737; + this.state = 754; this.match(QuixosCapabilityParser.ANY); } break; case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 2); { - this.state = 738; + this.state = 755; this.match(QuixosCapabilityParser.ATOM); - this.state = 739; + this.state = 756; this.identifier(); } break; case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 740; + this.state = 757; this.match(QuixosCapabilityParser.OBJECT); - this.state = 741; + this.state = 758; this.identifier(); } break; case QuixosCapabilityParser.INTERFACES: this.enterOuterAlt(localContext, 4); { - this.state = 742; + this.state = 759; this.match(QuixosCapabilityParser.INTERFACES); - this.state = 743; + this.state = 760; this.match(QuixosCapabilityParser.LBRACK); - this.state = 752; + this.state = 769; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966782) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8195) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8195) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { { - this.state = 744; + this.state = 761; this.interfaceType(); - this.state = 749; + this.state = 766; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 745; + this.state = 762; this.match(QuixosCapabilityParser.COMMA); - this.state = 746; + this.state = 763; this.interfaceType(); } } - this.state = 751; + this.state = 768; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 754; + this.state = 771; this.match(QuixosCapabilityParser.RBRACK); } break; @@ -2842,26 +2898,26 @@ export class QuixosCapabilityParser extends antlr.Parser { } public identifierList(): IdentifierListContext { let localContext = new IdentifierListContext(this.context, this.state); - this.enterRule(localContext, 82, QuixosCapabilityParser.RULE_identifierList); + this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_identifierList); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 757; + this.state = 774; this.identifier(); - this.state = 762; + this.state = 779; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 758; + this.state = 775; this.match(QuixosCapabilityParser.COMMA); - this.state = 759; + this.state = 776; this.identifier(); } } - this.state = 764; + this.state = 781; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } @@ -2882,30 +2938,30 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBlock(): DependencyBlockContext { let localContext = new DependencyBlockContext(this.context, this.state); - this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_dependencyBlock); + this.enterRule(localContext, 86, QuixosCapabilityParser.RULE_dependencyBlock); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 765; + this.state = 782; this.match(QuixosCapabilityParser.REQUIRES); - this.state = 766; + this.state = 783; this.match(QuixosCapabilityParser.LBRACE); - this.state = 770; + this.state = 787; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 12583040) !== 0) || ((((_la - 44)) & ~0x1F) === 0 && ((1 << (_la - 44)) & 393345) !== 0)) { { { - this.state = 767; + this.state = 784; this.dependencyPort(); } } - this.state = 772; + this.state = 789; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 773; + this.state = 790; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2924,202 +2980,202 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyPort(): DependencyPortContext { let localContext = new DependencyPortContext(this.context, this.state); - this.enterRule(localContext, 86, QuixosCapabilityParser.RULE_dependencyPort); + this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_dependencyPort); let _la: number; try { - this.state = 853; + this.state = 870; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REFLECTION: this.enterOuterAlt(localContext, 1); { - this.state = 775; + this.state = 792; this.match(QuixosCapabilityParser.REFLECTION); - this.state = 776; + this.state = 793; this.identifier(); - this.state = 777; + this.state = 794; this.match(QuixosCapabilityParser.ID); - this.state = 778; + this.state = 795; this.stringLiteral(); - this.state = 779; + this.state = 796; this.match(QuixosCapabilityParser.LBRACK); - this.state = 780; + this.state = 797; this.identifierList(); - this.state = 781; + this.state = 798; this.match(QuixosCapabilityParser.RBRACK); - this.state = 782; + this.state = 799; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 2); { - this.state = 784; + this.state = 801; this.match(QuixosCapabilityParser.STATE); - this.state = 785; + this.state = 802; this.identifier(); - this.state = 786; + this.state = 803; this.match(QuixosCapabilityParser.ID); - this.state = 787; + this.state = 804; this.stringLiteral(); - this.state = 788; + this.state = 805; this.match(QuixosCapabilityParser.COLON); - this.state = 789; + this.state = 806; this.valueType(); - this.state = 790; + this.state = 807; this.primitiveList(); - this.state = 791; + this.state = 808; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 3); { - this.state = 793; + this.state = 810; this.match(QuixosCapabilityParser.EDGE); - this.state = 794; + this.state = 811; this.identifier(); - this.state = 795; + this.state = 812; this.match(QuixosCapabilityParser.ID); - this.state = 796; + this.state = 813; this.stringLiteral(); - this.state = 797; + this.state = 814; this.match(QuixosCapabilityParser.COLON); - this.state = 798; + this.state = 815; this.cardinality(); - this.state = 799; + this.state = 816; this.targetConstraint(); - this.state = 800; + this.state = 817; this.primitiveList(); - this.state = 801; + this.state = 818; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 4); { - this.state = 803; + this.state = 820; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 804; + this.state = 821; this.identifier(); - this.state = 805; + this.state = 822; this.match(QuixosCapabilityParser.ID); - this.state = 806; + this.state = 823; this.stringLiteral(); - this.state = 807; + this.state = 824; this.match(QuixosCapabilityParser.COLON); - this.state = 808; + this.state = 825; this.identifier(); - this.state = 810; + this.state = 827; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 809; + this.state = 826; this.typeArguments(); } } - this.state = 813; + this.state = 830; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 65) { { - this.state = 812; + this.state = 829; this.selectedOperations(); } } - this.state = 817; + this.state = 834; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 18) { { - this.state = 815; + this.state = 832; this.match(QuixosCapabilityParser.FROM); - this.state = 816; + this.state = 833; this.match(QuixosCapabilityParser.INPUT); } } - this.state = 819; + this.state = 836; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CREATION: this.enterOuterAlt(localContext, 5); { - this.state = 821; + this.state = 838; this.match(QuixosCapabilityParser.CREATION); - this.state = 822; + this.state = 839; this.identifier(); - this.state = 823; + this.state = 840; this.match(QuixosCapabilityParser.ID); - this.state = 824; + this.state = 841; this.stringLiteral(); - this.state = 825; + this.state = 842; this.match(QuixosCapabilityParser.COLON); - this.state = 826; + this.state = 843; this.identifier(); - this.state = 827; + this.state = 844; this.match(QuixosCapabilityParser.INPUT); - this.state = 828; + this.state = 845; this.valueType(); - this.state = 829; + this.state = 846; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONSTRUCTOR: this.enterOuterAlt(localContext, 6); { - this.state = 831; + this.state = 848; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 832; + this.state = 849; this.identifier(); - this.state = 833; + this.state = 850; this.match(QuixosCapabilityParser.ID); - this.state = 834; + this.state = 851; this.stringLiteral(); - this.state = 835; + this.state = 852; this.match(QuixosCapabilityParser.COLON); - this.state = 836; + this.state = 853; this.identifier(); - this.state = 839; + this.state = 856; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 53) { { - this.state = 837; + this.state = 854; this.match(QuixosCapabilityParser.INPUT); - this.state = 838; + this.state = 855; this.valueType(); } } - this.state = 841; + this.state = 858; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.QUERY: this.enterOuterAlt(localContext, 7); { - this.state = 843; + this.state = 860; this.match(QuixosCapabilityParser.QUERY); - this.state = 844; + this.state = 861; this.identifier(); - this.state = 845; + this.state = 862; this.match(QuixosCapabilityParser.ID); - this.state = 846; + this.state = 863; this.stringLiteral(); - this.state = 847; + this.state = 864; this.match(QuixosCapabilityParser.COLON); - this.state = 848; + this.state = 865; this.identifier(); - this.state = 849; + this.state = 866; this.match(QuixosCapabilityParser.DOT); - this.state = 850; + this.state = 867; this.identifier(); - this.state = 851; + this.state = 868; this.match(QuixosCapabilityParser.SEMI); } break; @@ -3142,32 +3198,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public primitiveList(): PrimitiveListContext { let localContext = new PrimitiveListContext(this.context, this.state); - this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_primitiveList); + this.enterRule(localContext, 90, QuixosCapabilityParser.RULE_primitiveList); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 855; + this.state = 872; this.match(QuixosCapabilityParser.LBRACK); - this.state = 856; + this.state = 873; this.primitive(); - this.state = 861; + this.state = 878; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 857; + this.state = 874; this.match(QuixosCapabilityParser.COMMA); - this.state = 858; + this.state = 875; this.primitive(); } } - this.state = 863; + this.state = 880; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 864; + this.state = 881; this.match(QuixosCapabilityParser.RBRACK); } } @@ -3186,12 +3242,12 @@ export class QuixosCapabilityParser extends antlr.Parser { } public primitive(): PrimitiveContext { let localContext = new PrimitiveContext(this.context, this.state); - this.enterRule(localContext, 90, QuixosCapabilityParser.RULE_primitive); + this.enterRule(localContext, 92, QuixosCapabilityParser.RULE_primitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 866; + this.state = 883; _la = this.tokenStream.LA(1); if(!(_la === 1 || ((((_la - 96)) & ~0x1F) === 0 && ((1 << (_la - 96)) & 223) !== 0))) { this.errorHandler.recoverInline(this); @@ -3217,13 +3273,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public sharedAttachmentDecl(): SharedAttachmentDeclContext { let localContext = new SharedAttachmentDeclContext(this.context, this.state); - this.enterRule(localContext, 92, QuixosCapabilityParser.RULE_sharedAttachmentDecl); + this.enterRule(localContext, 94, QuixosCapabilityParser.RULE_sharedAttachmentDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 868; + this.state = 885; this.match(QuixosCapabilityParser.SHARED); - this.state = 869; + this.state = 886; this.attachmentDecl(); } } @@ -3242,22 +3298,22 @@ export class QuixosCapabilityParser extends antlr.Parser { } public attachmentDecl(): AttachmentDeclContext { let localContext = new AttachmentDeclContext(this.context, this.state); - this.enterRule(localContext, 94, QuixosCapabilityParser.RULE_attachmentDecl); + this.enterRule(localContext, 96, QuixosCapabilityParser.RULE_attachmentDecl); try { - this.state = 873; + this.state = 890; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 871; + this.state = 888; this.stateDecl(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 872; + this.state = 889; this.edgeDecl(); } break; @@ -3280,44 +3336,44 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stateDecl(): StateDeclContext { let localContext = new StateDeclContext(this.context, this.state); - this.enterRule(localContext, 96, QuixosCapabilityParser.RULE_stateDecl); + this.enterRule(localContext, 98, QuixosCapabilityParser.RULE_stateDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 875; + this.state = 892; this.match(QuixosCapabilityParser.STATE); - this.state = 876; + this.state = 893; this.identifier(); - this.state = 877; + this.state = 894; this.match(QuixosCapabilityParser.ID); - this.state = 878; + this.state = 895; this.stringLiteral(); - this.state = 879; + this.state = 896; this.match(QuixosCapabilityParser.ON); - this.state = 880; + this.state = 897; this.identifier(); - this.state = 881; + this.state = 898; this.match(QuixosCapabilityParser.COLON); - this.state = 882; + this.state = 899; this.valueType(); - this.state = 883; + this.state = 900; this.match(QuixosCapabilityParser.POLICY); - this.state = 884; + this.state = 901; this.storagePolicy(); - this.state = 887; + this.state = 904; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 73) { { - this.state = 885; + this.state = 902; this.match(QuixosCapabilityParser.DEFAULT); - this.state = 886; + this.state = 903; this.jsonLiteral(); } } - this.state = 889; + this.state = 906; this.match(QuixosCapabilityParser.SEMI); } } @@ -3336,28 +3392,28 @@ export class QuixosCapabilityParser extends antlr.Parser { } public storagePolicy(): StoragePolicyContext { let localContext = new StoragePolicyContext(this.context, this.state); - this.enterRule(localContext, 98, QuixosCapabilityParser.RULE_storagePolicy); + this.enterRule(localContext, 100, QuixosCapabilityParser.RULE_storagePolicy); try { - this.state = 897; + this.state = 914; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REGISTER: this.enterOuterAlt(localContext, 1); { - this.state = 891; + this.state = 908; this.match(QuixosCapabilityParser.REGISTER); } break; case QuixosCapabilityParser.CRDT: this.enterOuterAlt(localContext, 2); { - this.state = 892; + this.state = 909; this.match(QuixosCapabilityParser.CRDT); - this.state = 893; + this.state = 910; this.match(QuixosCapabilityParser.LPAREN); - this.state = 894; + this.state = 911; this.valueType(); - this.state = 895; + this.state = 912; this.match(QuixosCapabilityParser.RPAREN); } break; @@ -3380,25 +3436,25 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgeDecl(): EdgeDeclContext { let localContext = new EdgeDeclContext(this.context, this.state); - this.enterRule(localContext, 100, QuixosCapabilityParser.RULE_edgeDecl); + this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_edgeDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 899; + this.state = 916; this.match(QuixosCapabilityParser.EDGE); - this.state = 900; + this.state = 917; this.identifier(); - this.state = 901; + this.state = 918; this.match(QuixosCapabilityParser.ID); - this.state = 902; + this.state = 919; this.stringLiteral(); - this.state = 903; + this.state = 920; this.match(QuixosCapabilityParser.LBRACE); - this.state = 904; + this.state = 921; this.edgeEndpoint(); - this.state = 905; + this.state = 922; this.edgeEndpoint(); - this.state = 906; + this.state = 923; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3417,78 +3473,78 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgeEndpoint(): EdgeEndpointContext { let localContext = new EdgeEndpointContext(this.context, this.state); - this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_edgeEndpoint); + this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_edgeEndpoint); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 908; + this.state = 925; this.targetConstraint(); - this.state = 909; + this.state = 926; this.match(QuixosCapabilityParser.PROJECTION); - this.state = 910; + this.state = 927; this.identifier(); - this.state = 911; + this.state = 928; this.match(QuixosCapabilityParser.ID); - this.state = 912; + this.state = 929; this.stringLiteral(); - this.state = 913; + this.state = 930; this.cardinality(); - this.state = 915; + this.state = 932; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 112) { { - this.state = 914; + this.state = 931; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 919; + this.state = 936; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 79) { { - this.state = 917; + this.state = 934; this.match(QuixosCapabilityParser.ON_DELETE); - this.state = 918; + this.state = 935; this.stringLiteral(); } } - this.state = 922; + this.state = 939; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 81) { { - this.state = 921; + this.state = 938; this.match(QuixosCapabilityParser.RETAIN_OTHER); } } - this.state = 926; + this.state = 943; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 82) { { - this.state = 924; + this.state = 941; this.match(QuixosCapabilityParser.KEYED); - this.state = 925; + this.state = 942; this.stringLiteral(); } } - this.state = 929; + this.state = 946; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 83) { { - this.state = 928; + this.state = 945; this.match(QuixosCapabilityParser.PUBLIC_TRAVERSAL); } } - this.state = 931; + this.state = 948; this.match(QuixosCapabilityParser.SEMI); } } @@ -3507,70 +3563,70 @@ export class QuixosCapabilityParser extends antlr.Parser { } public conformanceDecl(): ConformanceDeclContext { let localContext = new ConformanceDeclContext(this.context, this.state); - this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_conformanceDecl); + this.enterRule(localContext, 106, QuixosCapabilityParser.RULE_conformanceDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 933; + this.state = 950; this.match(QuixosCapabilityParser.CONFORM); - this.state = 934; + this.state = 951; this.identifier(); - this.state = 935; + this.state = 952; this.match(QuixosCapabilityParser.AS); - this.state = 936; + this.state = 953; this.identifier(); - this.state = 938; + this.state = 955; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 937; + this.state = 954; this.typeArguments(); } } - this.state = 942; + this.state = 959; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 84) { { - this.state = 940; + this.state = 957; this.match(QuixosCapabilityParser.ID); - this.state = 941; + this.state = 958; this.stringLiteral(); } } - this.state = 946; + this.state = 963; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 78) { { - this.state = 944; + this.state = 961; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); - this.state = 945; + this.state = 962; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 948; + this.state = 965; this.match(QuixosCapabilityParser.LBRACE); - this.state = 952; + this.state = 969; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 8 || ((((_la - 56)) & ~0x1F) === 0 && ((1 << (_la - 56)) & 4105) !== 0)) { { { - this.state = 949; + this.state = 966; this.conformanceItem(); } } - this.state = 954; + this.state = 971; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 955; + this.state = 972; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3589,48 +3645,90 @@ export class QuixosCapabilityParser extends antlr.Parser { } public conformanceItem(): ConformanceItemContext { let localContext = new ConformanceItemContext(this.context, this.state); - this.enterRule(localContext, 106, QuixosCapabilityParser.RULE_conformanceItem); + this.enterRule(localContext, 108, QuixosCapabilityParser.RULE_conformanceItem); try { - this.state = 963; + this.state = 981; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 85, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 86, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 957; + this.state = 974; this.match(QuixosCapabilityParser.PRIVATE); - this.state = 958; + this.state = 975; this.attachmentDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 959; + this.state = 976; this.operationBindingDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 960; + this.state = 977; this.stateFieldBindingDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 961; + this.state = 978; this.initializationDecl(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 962; + this.state = 979; this.relationshipMaterializationDecl(); } break; + case 6: + this.enterOuterAlt(localContext, 6); + { + this.state = 980; + this.moduleBindingDecl(); + } + break; + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public moduleBindingDecl(): ModuleBindingDeclContext { + let localContext = new ModuleBindingDeclContext(this.context, this.state); + this.enterRule(localContext, 110, QuixosCapabilityParser.RULE_moduleBindingDecl); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 983; + this.match(QuixosCapabilityParser.BIND); + this.state = 984; + this.identifier(); + this.state = 985; + this.match(QuixosCapabilityParser.TO); + this.state = 986; + this.identifier(); + this.state = 987; + this.match(QuixosCapabilityParser.DOT); + this.state = 988; + this.identifier(); + this.state = 989; + this.match(QuixosCapabilityParser.SEMI); } } catch (re) { @@ -3648,32 +3746,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public initializationDecl(): InitializationDeclContext { let localContext = new InitializationDeclContext(this.context, this.state); - this.enterRule(localContext, 108, QuixosCapabilityParser.RULE_initializationDecl); + this.enterRule(localContext, 112, QuixosCapabilityParser.RULE_initializationDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 965; + this.state = 991; this.match(QuixosCapabilityParser.INITIALIZE); - this.state = 966; + this.state = 992; this.match(QuixosCapabilityParser.LBRACE); - this.state = 970; + this.state = 996; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966782) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8195) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8195) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { { { - this.state = 967; + this.state = 993; this.initializationField(); } } - this.state = 972; + this.state = 998; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 973; + this.state = 999; this.match(QuixosCapabilityParser.RBRACE); - this.state = 974; + this.state = 1000; this.match(QuixosCapabilityParser.SEMI); } } @@ -3692,42 +3790,42 @@ export class QuixosCapabilityParser extends antlr.Parser { } public initializationField(): InitializationFieldContext { let localContext = new InitializationFieldContext(this.context, this.state); - this.enterRule(localContext, 110, QuixosCapabilityParser.RULE_initializationField); + this.enterRule(localContext, 114, QuixosCapabilityParser.RULE_initializationField); try { - this.state = 990; + this.state = 1016; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 87, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 88, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 976; + this.state = 1002; this.identifier(); - this.state = 977; + this.state = 1003; this.match(QuixosCapabilityParser.TO); - this.state = 978; + this.state = 1004; this.match(QuixosCapabilityParser.STATE); - this.state = 979; + this.state = 1005; this.identifier(); - this.state = 980; + this.state = 1006; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 982; + this.state = 1008; this.identifier(); - this.state = 983; + this.state = 1009; this.match(QuixosCapabilityParser.TO); - this.state = 984; + this.state = 1010; this.match(QuixosCapabilityParser.EDGE); - this.state = 985; + this.state = 1011; this.identifier(); - this.state = 986; + this.state = 1012; this.match(QuixosCapabilityParser.DOT); - this.state = 987; + this.state = 1013; this.identifier(); - this.state = 988; + this.state = 1014; this.match(QuixosCapabilityParser.SEMI); } break; @@ -3748,34 +3846,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public creationOwnerMapping(): CreationOwnerMappingContext { let localContext = new CreationOwnerMappingContext(this.context, this.state); - this.enterRule(localContext, 112, QuixosCapabilityParser.RULE_creationOwnerMapping); + this.enterRule(localContext, 116, QuixosCapabilityParser.RULE_creationOwnerMapping); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 992; + this.state = 1018; this.interfaceType(); - this.state = 993; + this.state = 1019; this.match(QuixosCapabilityParser.FROM); - this.state = 994; + this.state = 1020; this.match(QuixosCapabilityParser.INPUT); - this.state = 999; + this.state = 1025; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 136) { { { - this.state = 995; + this.state = 1021; this.match(QuixosCapabilityParser.DOT); - this.state = 996; + this.state = 1022; this.identifier(); } } - this.state = 1001; + this.state = 1027; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1002; + this.state = 1028; this.match(QuixosCapabilityParser.SEMI); } } @@ -3794,21 +3892,21 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stateFieldBindingDecl(): StateFieldBindingDeclContext { let localContext = new StateFieldBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 114, QuixosCapabilityParser.RULE_stateFieldBindingDecl); + this.enterRule(localContext, 118, QuixosCapabilityParser.RULE_stateFieldBindingDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 1004; + this.state = 1030; this.match(QuixosCapabilityParser.BIND); - this.state = 1005; + this.state = 1031; this.identifier(); - this.state = 1006; + this.state = 1032; this.match(QuixosCapabilityParser.TO); - this.state = 1007; + this.state = 1033; this.match(QuixosCapabilityParser.STATE); - this.state = 1008; + this.state = 1034; this.identifier(); - this.state = 1009; + this.state = 1035; this.match(QuixosCapabilityParser.SEMI); } } @@ -3827,35 +3925,35 @@ export class QuixosCapabilityParser extends antlr.Parser { } public relationshipMaterializationDecl(): RelationshipMaterializationDeclContext { let localContext = new RelationshipMaterializationDeclContext(this.context, this.state); - this.enterRule(localContext, 116, QuixosCapabilityParser.RULE_relationshipMaterializationDecl); + this.enterRule(localContext, 120, QuixosCapabilityParser.RULE_relationshipMaterializationDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 1011; + this.state = 1037; this.match(QuixosCapabilityParser.MATERIALIZE); - this.state = 1012; + this.state = 1038; this.identifier(); - this.state = 1013; + this.state = 1039; this.match(QuixosCapabilityParser.IF); - this.state = 1014; + this.state = 1040; this.match(QuixosCapabilityParser.ABSENT); - this.state = 1015; + this.state = 1041; this.match(QuixosCapabilityParser.USING); - this.state = 1016; + this.state = 1042; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1017; + this.state = 1043; this.identifier(); - this.state = 1018; + this.state = 1044; this.match(QuixosCapabilityParser.VIA); - this.state = 1019; + this.state = 1045; this.match(QuixosCapabilityParser.EDGE); - this.state = 1020; + this.state = 1046; this.identifier(); - this.state = 1021; + this.state = 1047; this.match(QuixosCapabilityParser.DOT); - this.state = 1022; + this.state = 1048; this.identifier(); - this.state = 1023; + this.state = 1049; this.match(QuixosCapabilityParser.SEMI); } } @@ -3874,32 +3972,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationBindingDecl(): OperationBindingDeclContext { let localContext = new OperationBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 118, QuixosCapabilityParser.RULE_operationBindingDecl); + this.enterRule(localContext, 122, QuixosCapabilityParser.RULE_operationBindingDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1025; + this.state = 1051; this.match(QuixosCapabilityParser.BIND); - this.state = 1026; + this.state = 1052; this.memberOperationRef(); - this.state = 1027; + this.state = 1053; this.match(QuixosCapabilityParser.TO); - this.state = 1028; + this.state = 1054; this.operationProvider(); - this.state = 1031; + this.state = 1057; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 34) { { - this.state = 1029; + this.state = 1055; this.match(QuixosCapabilityParser.QUERY_REASON); - this.state = 1030; + this.state = 1056; this.stringLiteral(); } } - this.state = 1033; + this.state = 1059; this.match(QuixosCapabilityParser.SEMI); } } @@ -3918,15 +4016,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public memberOperationRef(): MemberOperationRefContext { let localContext = new MemberOperationRefContext(this.context, this.state); - this.enterRule(localContext, 120, QuixosCapabilityParser.RULE_memberOperationRef); + this.enterRule(localContext, 124, QuixosCapabilityParser.RULE_memberOperationRef); try { this.enterOuterAlt(localContext, 1); { - this.state = 1035; + this.state = 1061; this.identifier(); - this.state = 1036; + this.state = 1062; this.match(QuixosCapabilityParser.DOT); - this.state = 1037; + this.state = 1063; this.operationName(); } } @@ -3945,92 +4043,92 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationName(): OperationNameContext { let localContext = new OperationNameContext(this.context, this.state); - this.enterRule(localContext, 122, QuixosCapabilityParser.RULE_operationName); + this.enterRule(localContext, 126, QuixosCapabilityParser.RULE_operationName); try { - this.state = 1051; + this.state = 1077; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 90, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 91, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1039; + this.state = 1065; this.identifier(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1040; + this.state = 1066; this.match(QuixosCapabilityParser.CALL); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1041; + this.state = 1067; this.match(QuixosCapabilityParser.GET); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1042; + this.state = 1068; this.match(QuixosCapabilityParser.SET); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1043; + this.state = 1069; this.match(QuixosCapabilityParser.EDIT); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1044; + this.state = 1070; this.match(QuixosCapabilityParser.RESOLVE); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 1045; + this.state = 1071; this.match(QuixosCapabilityParser.CONNECT); } break; case 8: this.enterOuterAlt(localContext, 8); { - this.state = 1046; + this.state = 1072; this.match(QuixosCapabilityParser.DISCONNECT); } break; case 9: this.enterOuterAlt(localContext, 9); { - this.state = 1047; + this.state = 1073; this.match(QuixosCapabilityParser.WATCH_START); } break; case 10: this.enterOuterAlt(localContext, 10); { - this.state = 1048; + this.state = 1074; this.match(QuixosCapabilityParser.WATCH_STOP); } break; case 11: this.enterOuterAlt(localContext, 11); { - this.state = 1049; + this.state = 1075; this.match(QuixosCapabilityParser.SUBSCRIBE); } break; case 12: this.enterOuterAlt(localContext, 12); { - this.state = 1050; + this.state = 1076; this.match(QuixosCapabilityParser.UNSUBSCRIBE); } break; @@ -4051,113 +4149,113 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationProvider(): OperationProviderContext { let localContext = new OperationProviderContext(this.context, this.state); - this.enterRule(localContext, 124, QuixosCapabilityParser.RULE_operationProvider); + this.enterRule(localContext, 128, QuixosCapabilityParser.RULE_operationProvider); let _la: number; try { - this.state = 1089; + this.state = 1115; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.LIFECYCLE: this.enterOuterAlt(localContext, 1); { - this.state = 1053; + this.state = 1079; this.match(QuixosCapabilityParser.LIFECYCLE); - this.state = 1054; + this.state = 1080; this.match(QuixosCapabilityParser.DOT); - this.state = 1055; + this.state = 1081; this.identifier(); } break; case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 2); { - this.state = 1056; + this.state = 1082; this.match(QuixosCapabilityParser.STATE); - this.state = 1057; + this.state = 1083; this.identifier(); - this.state = 1058; + this.state = 1084; this.match(QuixosCapabilityParser.DOT); - this.state = 1059; + this.state = 1085; this.statePrimitive(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 3); { - this.state = 1061; + this.state = 1087; this.match(QuixosCapabilityParser.EDGE); - this.state = 1062; + this.state = 1088; this.identifier(); - this.state = 1063; + this.state = 1089; this.match(QuixosCapabilityParser.DOT); - this.state = 1064; + this.state = 1090; this.identifier(); - this.state = 1065; + this.state = 1091; this.match(QuixosCapabilityParser.DOT); - this.state = 1066; + this.state = 1092; this.edgePrimitive(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 4); { - this.state = 1068; + this.state = 1094; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 1069; + this.state = 1095; this.identifier(); - this.state = 1071; + this.state = 1097; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 1070; + this.state = 1096; this.typeArguments(); } } - this.state = 1073; + this.state = 1099; this.match(QuixosCapabilityParser.DOT); - this.state = 1074; + this.state = 1100; this.memberOperationRef(); } break; case QuixosCapabilityParser.PACKAGE: this.enterOuterAlt(localContext, 5); { - this.state = 1076; + this.state = 1102; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 1077; + this.state = 1103; this.identifier(); - this.state = 1078; + this.state = 1104; this.match(QuixosCapabilityParser.DOT); - this.state = 1079; + this.state = 1105; this.identifier(); - this.state = 1081; + this.state = 1107; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 1080; + this.state = 1106; this.typeArguments(); } } - this.state = 1084; + this.state = 1110; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 64) { { - this.state = 1083; + this.state = 1109; this.dependencyBindingBlock(); } } - this.state = 1087; + this.state = 1113; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 66) { { - this.state = 1086; + this.state = 1112; this.acceptanceBinding(); } } @@ -4183,13 +4281,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public acceptanceBinding(): AcceptanceBindingContext { let localContext = new AcceptanceBindingContext(this.context, this.state); - this.enterRule(localContext, 126, QuixosCapabilityParser.RULE_acceptanceBinding); + this.enterRule(localContext, 130, QuixosCapabilityParser.RULE_acceptanceBinding); try { this.enterOuterAlt(localContext, 1); { - this.state = 1091; + this.state = 1117; this.match(QuixosCapabilityParser.ACCEPT); - this.state = 1092; + this.state = 1118; this.dependencyBindingBlock(); } } @@ -4208,12 +4306,12 @@ export class QuixosCapabilityParser extends antlr.Parser { } public statePrimitive(): StatePrimitiveContext { let localContext = new StatePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 128, QuixosCapabilityParser.RULE_statePrimitive); + this.enterRule(localContext, 132, QuixosCapabilityParser.RULE_statePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1094; + this.state = 1120; _la = this.tokenStream.LA(1); if(!(_la === 1 || ((((_la - 96)) & ~0x1F) === 0 && ((1 << (_la - 96)) & 195) !== 0))) { this.errorHandler.recoverInline(this); @@ -4239,12 +4337,12 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgePrimitive(): EdgePrimitiveContext { let localContext = new EdgePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 130, QuixosCapabilityParser.RULE_edgePrimitive); + this.enterRule(localContext, 134, QuixosCapabilityParser.RULE_edgePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1096; + this.state = 1122; _la = this.tokenStream.LA(1); if(!(((((_la - 98)) & ~0x1F) === 0 && ((1 << (_la - 98)) & 55) !== 0))) { this.errorHandler.recoverInline(this); @@ -4270,30 +4368,30 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBindingBlock(): DependencyBindingBlockContext { let localContext = new DependencyBindingBlockContext(this.context, this.state); - this.enterRule(localContext, 132, QuixosCapabilityParser.RULE_dependencyBindingBlock); + this.enterRule(localContext, 136, QuixosCapabilityParser.RULE_dependencyBindingBlock); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1098; + this.state = 1124; this.match(QuixosCapabilityParser.WITH); - this.state = 1099; + this.state = 1125; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1103; + this.state = 1129; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966782) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8195) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8195) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { { { - this.state = 1100; + this.state = 1126; this.dependencyBinding(); } } - this.state = 1105; + this.state = 1131; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1106; + this.state = 1132; this.match(QuixosCapabilityParser.RBRACE); } } @@ -4312,139 +4410,139 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBinding(): DependencyBindingContext { let localContext = new DependencyBindingContext(this.context, this.state); - this.enterRule(localContext, 134, QuixosCapabilityParser.RULE_dependencyBinding); + this.enterRule(localContext, 138, QuixosCapabilityParser.RULE_dependencyBinding); let _la: number; try { - this.state = 1206; + this.state = 1232; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 104, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 105, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1108; + this.state = 1134; this.identifier(); - this.state = 1109; + this.state = 1135; this.match(QuixosCapabilityParser.TO); - this.state = 1110; + this.state = 1136; this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 1111; + this.state = 1137; this.match(QuixosCapabilityParser.REFLECTION); - this.state = 1112; + this.state = 1138; this.match(QuixosCapabilityParser.LBRACK); - this.state = 1113; + this.state = 1139; this.identifierList(); - this.state = 1114; + this.state = 1140; this.match(QuixosCapabilityParser.RBRACK); - this.state = 1115; + this.state = 1141; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1117; + this.state = 1143; this.identifier(); - this.state = 1118; + this.state = 1144; this.match(QuixosCapabilityParser.TO); - this.state = 1119; + this.state = 1145; this.match(QuixosCapabilityParser.STATE); - this.state = 1120; + this.state = 1146; this.identifier(); - this.state = 1127; + this.state = 1153; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 67) { { - this.state = 1121; + this.state = 1147; this.match(QuixosCapabilityParser.VIA); - this.state = 1122; + this.state = 1148; this.match(QuixosCapabilityParser.EDGE); - this.state = 1123; + this.state = 1149; this.identifier(); - this.state = 1124; + this.state = 1150; this.match(QuixosCapabilityParser.DOT); - this.state = 1125; + this.state = 1151; this.identifier(); } } - this.state = 1129; + this.state = 1155; this.match(QuixosCapabilityParser.SEMI); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1131; + this.state = 1157; this.identifier(); - this.state = 1132; + this.state = 1158; this.match(QuixosCapabilityParser.TO); - this.state = 1133; + this.state = 1159; this.match(QuixosCapabilityParser.EDGE); - this.state = 1134; + this.state = 1160; this.identifier(); - this.state = 1135; + this.state = 1161; this.match(QuixosCapabilityParser.DOT); - this.state = 1136; + this.state = 1162; this.identifier(); - this.state = 1143; + this.state = 1169; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 67) { { - this.state = 1137; + this.state = 1163; this.match(QuixosCapabilityParser.VIA); - this.state = 1138; + this.state = 1164; this.match(QuixosCapabilityParser.EDGE); - this.state = 1139; + this.state = 1165; this.identifier(); - this.state = 1140; + this.state = 1166; this.match(QuixosCapabilityParser.DOT); - this.state = 1141; + this.state = 1167; this.identifier(); } } - this.state = 1145; + this.state = 1171; this.match(QuixosCapabilityParser.SEMI); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1147; + this.state = 1173; this.identifier(); - this.state = 1148; + this.state = 1174; this.match(QuixosCapabilityParser.TO); - this.state = 1149; + this.state = 1175; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 1150; + this.state = 1176; this.identifier(); - this.state = 1152; + this.state = 1178; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 1151; + this.state = 1177; this.typeArguments(); } } - this.state = 1162; + this.state = 1188; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.VIA: { { - this.state = 1154; + this.state = 1180; this.match(QuixosCapabilityParser.VIA); - this.state = 1155; + this.state = 1181; this.match(QuixosCapabilityParser.EDGE); - this.state = 1156; + this.state = 1182; this.identifier(); - this.state = 1157; + this.state = 1183; this.match(QuixosCapabilityParser.DOT); - this.state = 1158; + this.state = 1184; this.identifier(); } } @@ -4452,9 +4550,9 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.FROM: { { - this.state = 1160; + this.state = 1186; this.match(QuixosCapabilityParser.FROM); - this.state = 1161; + this.state = 1187; this.match(QuixosCapabilityParser.INPUT); } } @@ -4464,104 +4562,104 @@ export class QuixosCapabilityParser extends antlr.Parser { default: break; } - this.state = 1164; + this.state = 1190; this.match(QuixosCapabilityParser.SEMI); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1166; + this.state = 1192; this.identifier(); - this.state = 1167; + this.state = 1193; this.match(QuixosCapabilityParser.TO); - this.state = 1168; + this.state = 1194; this.match(QuixosCapabilityParser.CREATION); - this.state = 1169; + this.state = 1195; this.identifier(); - this.state = 1170; + this.state = 1196; this.match(QuixosCapabilityParser.WITH); - this.state = 1171; + this.state = 1197; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1175; + this.state = 1201; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966782) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8195) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8195) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { { { - this.state = 1172; + this.state = 1198; this.creationOwnerMapping(); } } - this.state = 1177; + this.state = 1203; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1178; + this.state = 1204; this.match(QuixosCapabilityParser.RBRACE); - this.state = 1179; + this.state = 1205; this.match(QuixosCapabilityParser.SEMI); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1181; + this.state = 1207; this.identifier(); - this.state = 1182; + this.state = 1208; this.match(QuixosCapabilityParser.TO); - this.state = 1183; + this.state = 1209; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1184; + this.state = 1210; this.identifier(); - this.state = 1185; + this.state = 1211; this.match(QuixosCapabilityParser.SEMI); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 1187; + this.state = 1213; this.identifier(); - this.state = 1188; + this.state = 1214; this.match(QuixosCapabilityParser.TO); - this.state = 1190; + this.state = 1216; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 9) { { - this.state = 1189; + this.state = 1215; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 1192; + this.state = 1218; this.match(QuixosCapabilityParser.QUERY); - this.state = 1193; + this.state = 1219; this.identifier(); - this.state = 1194; + this.state = 1220; this.match(QuixosCapabilityParser.DOT); - this.state = 1195; + this.state = 1221; this.identifier(); - this.state = 1202; + this.state = 1228; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 67) { { - this.state = 1196; + this.state = 1222; this.match(QuixosCapabilityParser.VIA); - this.state = 1197; + this.state = 1223; this.match(QuixosCapabilityParser.EDGE); - this.state = 1198; + this.state = 1224; this.identifier(); - this.state = 1199; + this.state = 1225; this.match(QuixosCapabilityParser.DOT); - this.state = 1200; + this.state = 1226; this.identifier(); } } - this.state = 1204; + this.state = 1230; this.match(QuixosCapabilityParser.SEMI); } break; @@ -4582,34 +4680,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public constructorBindingDecl(): ConstructorBindingDeclContext { let localContext = new ConstructorBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 136, QuixosCapabilityParser.RULE_constructorBindingDecl); + this.enterRule(localContext, 140, QuixosCapabilityParser.RULE_constructorBindingDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1208; + this.state = 1234; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1209; + this.state = 1235; this.identifier(); - this.state = 1210; + this.state = 1236; this.match(QuixosCapabilityParser.TO); - this.state = 1211; + this.state = 1237; this.identifier(); - this.state = 1212; + this.state = 1238; this.match(QuixosCapabilityParser.DOT); - this.state = 1213; + this.state = 1239; this.identifier(); - this.state = 1215; + this.state = 1241; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 64) { { - this.state = 1214; + this.state = 1240; this.dependencyBindingBlock(); } } - this.state = 1217; + this.state = 1243; this.match(QuixosCapabilityParser.SEMI); } } @@ -4628,10 +4726,10 @@ export class QuixosCapabilityParser extends antlr.Parser { } public valueType(): ValueTypeContext { let localContext = new ValueTypeContext(this.context, this.state); - this.enterRule(localContext, 138, QuixosCapabilityParser.RULE_valueType); + this.enterRule(localContext, 142, QuixosCapabilityParser.RULE_valueType); let _la: number; try { - this.state = 1265; + this.state = 1291; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.BOOL: @@ -4644,138 +4742,136 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.UINT64: this.enterOuterAlt(localContext, 1); { - this.state = 1219; + this.state = 1245; this.scalarType(); } break; case QuixosCapabilityParser.UNIT: this.enterOuterAlt(localContext, 2); { - this.state = 1220; + this.state = 1246; this.match(QuixosCapabilityParser.UNIT); } break; case QuixosCapabilityParser.WATCH_HANDLE: this.enterOuterAlt(localContext, 3); { - this.state = 1221; + this.state = 1247; this.match(QuixosCapabilityParser.WATCH_HANDLE); } break; case QuixosCapabilityParser.MESSAGE: this.enterOuterAlt(localContext, 4); { - this.state = 1222; + this.state = 1248; this.match(QuixosCapabilityParser.MESSAGE); - this.state = 1223; + this.state = 1249; this.stringLiteral(); } break; case QuixosCapabilityParser.ATOM_REF: this.enterOuterAlt(localContext, 5); { - this.state = 1224; + this.state = 1250; this.match(QuixosCapabilityParser.ATOM_REF); - this.state = 1225; + this.state = 1251; this.match(QuixosCapabilityParser.LT); - this.state = 1226; + this.state = 1252; this.identifier(); - this.state = 1227; + this.state = 1253; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.INTERFACE_REF: this.enterOuterAlt(localContext, 6); { - this.state = 1229; + this.state = 1255; this.match(QuixosCapabilityParser.INTERFACE_REF); - this.state = 1230; + this.state = 1256; this.match(QuixosCapabilityParser.LT); - this.state = 1231; + this.state = 1257; this.identifier(); - this.state = 1233; + this.state = 1259; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 1232; + this.state = 1258; this.typeArguments(); } } - this.state = 1235; + this.state = 1261; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.REF: this.enterOuterAlt(localContext, 7); { - this.state = 1237; + this.state = 1263; this.match(QuixosCapabilityParser.REF); - this.state = 1238; + this.state = 1264; this.match(QuixosCapabilityParser.LT); - this.state = 1239; + this.state = 1265; this.identifier(); - this.state = 1240; + this.state = 1266; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.OPTIONAL: this.enterOuterAlt(localContext, 8); { - this.state = 1242; + this.state = 1268; this.match(QuixosCapabilityParser.OPTIONAL); - this.state = 1243; + this.state = 1269; this.match(QuixosCapabilityParser.LT); - this.state = 1244; + this.state = 1270; this.valueType(); - this.state = 1245; + this.state = 1271; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.LIST: this.enterOuterAlt(localContext, 9); { - this.state = 1247; + this.state = 1273; this.match(QuixosCapabilityParser.LIST); - this.state = 1248; + this.state = 1274; this.match(QuixosCapabilityParser.LT); - this.state = 1249; + this.state = 1275; this.valueType(); - this.state = 1250; + this.state = 1276; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.RECORD: this.enterOuterAlt(localContext, 10); { - this.state = 1252; + this.state = 1278; this.match(QuixosCapabilityParser.RECORD); - this.state = 1253; + this.state = 1279; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1257; + this.state = 1283; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966782) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8195) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8195) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { { { - this.state = 1254; + this.state = 1280; this.recordField(); } } - this.state = 1259; + this.state = 1285; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1260; + this.state = 1286; this.match(QuixosCapabilityParser.RBRACE); } break; case QuixosCapabilityParser.EDIT: - case QuixosCapabilityParser.COMPONENT: case QuixosCapabilityParser.PRESENTATION: case QuixosCapabilityParser.SUBJECT: - case QuixosCapabilityParser.RUNTIME: case QuixosCapabilityParser.FOR: case QuixosCapabilityParser.CREATION: case QuixosCapabilityParser.INITIALIZE: @@ -4811,14 +4907,14 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 11); { - this.state = 1261; + this.state = 1287; this.identifier(); - this.state = 1263; + this.state = 1289; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 1262; + this.state = 1288; this.typeArguments(); } } @@ -4844,17 +4940,17 @@ export class QuixosCapabilityParser extends antlr.Parser { } public recordField(): RecordFieldContext { let localContext = new RecordFieldContext(this.context, this.state); - this.enterRule(localContext, 140, QuixosCapabilityParser.RULE_recordField); + this.enterRule(localContext, 144, QuixosCapabilityParser.RULE_recordField); try { this.enterOuterAlt(localContext, 1); { - this.state = 1267; + this.state = 1293; this.identifier(); - this.state = 1268; + this.state = 1294; this.match(QuixosCapabilityParser.COLON); - this.state = 1269; + this.state = 1295; this.valueType(); - this.state = 1270; + this.state = 1296; this.match(QuixosCapabilityParser.SEMI); } } @@ -4873,12 +4969,12 @@ export class QuixosCapabilityParser extends antlr.Parser { } public scalarType(): ScalarTypeContext { let localContext = new ScalarTypeContext(this.context, this.state); - this.enterRule(localContext, 142, QuixosCapabilityParser.RULE_scalarType); + this.enterRule(localContext, 146, QuixosCapabilityParser.RULE_scalarType); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1272; + this.state = 1298; _la = this.tokenStream.LA(1); if(!(((((_la - 121)) & ~0x1F) === 0 && ((1 << (_la - 121)) & 255) !== 0))) { this.errorHandler.recoverInline(this); @@ -4904,12 +5000,12 @@ export class QuixosCapabilityParser extends antlr.Parser { } public cardinality(): CardinalityContext { let localContext = new CardinalityContext(this.context, this.state); - this.enterRule(localContext, 144, QuixosCapabilityParser.RULE_cardinality); + this.enterRule(localContext, 148, QuixosCapabilityParser.RULE_cardinality); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1274; + this.state = 1300; _la = this.tokenStream.LA(1); if(!(((((_la - 108)) & ~0x1F) === 0 && ((1 << (_la - 108)) & 15) !== 0))) { this.errorHandler.recoverInline(this); @@ -4935,64 +5031,64 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonLiteral(): JsonLiteralContext { let localContext = new JsonLiteralContext(this.context, this.state); - this.enterRule(localContext, 146, QuixosCapabilityParser.RULE_jsonLiteral); + this.enterRule(localContext, 150, QuixosCapabilityParser.RULE_jsonLiteral); try { - this.state = 1284; + this.state = 1310; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STRING_LITERAL: this.enterOuterAlt(localContext, 1); { - this.state = 1276; + this.state = 1302; this.stringLiteral(); } break; case QuixosCapabilityParser.INTEGER: this.enterOuterAlt(localContext, 2); { - this.state = 1277; + this.state = 1303; this.match(QuixosCapabilityParser.INTEGER); } break; case QuixosCapabilityParser.JSON_NUMBER: this.enterOuterAlt(localContext, 3); { - this.state = 1278; + this.state = 1304; this.match(QuixosCapabilityParser.JSON_NUMBER); } break; case QuixosCapabilityParser.TRUE: this.enterOuterAlt(localContext, 4); { - this.state = 1279; + this.state = 1305; this.match(QuixosCapabilityParser.TRUE); } break; case QuixosCapabilityParser.FALSE: this.enterOuterAlt(localContext, 5); { - this.state = 1280; + this.state = 1306; this.match(QuixosCapabilityParser.FALSE); } break; case QuixosCapabilityParser.NULL: this.enterOuterAlt(localContext, 6); { - this.state = 1281; + this.state = 1307; this.match(QuixosCapabilityParser.NULL); } break; case QuixosCapabilityParser.LBRACE: this.enterOuterAlt(localContext, 7); { - this.state = 1282; + this.state = 1308; this.jsonObject(); } break; case QuixosCapabilityParser.LBRACK: this.enterOuterAlt(localContext, 8); { - this.state = 1283; + this.state = 1309; this.jsonArray(); } break; @@ -5015,40 +5111,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonObject(): JsonObjectContext { let localContext = new JsonObjectContext(this.context, this.state); - this.enterRule(localContext, 148, QuixosCapabilityParser.RULE_jsonObject); + this.enterRule(localContext, 152, QuixosCapabilityParser.RULE_jsonObject); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1286; + this.state = 1312; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1295; + this.state = 1321; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 150) { { - this.state = 1287; + this.state = 1313; this.jsonMember(); - this.state = 1292; + this.state = 1318; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 1288; + this.state = 1314; this.match(QuixosCapabilityParser.COMMA); - this.state = 1289; + this.state = 1315; this.jsonMember(); } } - this.state = 1294; + this.state = 1320; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1297; + this.state = 1323; this.match(QuixosCapabilityParser.RBRACE); } } @@ -5067,15 +5163,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonMember(): JsonMemberContext { let localContext = new JsonMemberContext(this.context, this.state); - this.enterRule(localContext, 150, QuixosCapabilityParser.RULE_jsonMember); + this.enterRule(localContext, 154, QuixosCapabilityParser.RULE_jsonMember); try { this.enterOuterAlt(localContext, 1); { - this.state = 1299; + this.state = 1325; this.stringLiteral(); - this.state = 1300; + this.state = 1326; this.match(QuixosCapabilityParser.COLON); - this.state = 1301; + this.state = 1327; this.jsonLiteral(); } } @@ -5094,40 +5190,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonArray(): JsonArrayContext { let localContext = new JsonArrayContext(this.context, this.state); - this.enterRule(localContext, 152, QuixosCapabilityParser.RULE_jsonArray); + this.enterRule(localContext, 156, QuixosCapabilityParser.RULE_jsonArray); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1303; + this.state = 1329; this.match(QuixosCapabilityParser.LBRACK); - this.state = 1312; + this.state = 1338; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (((((_la - 129)) & ~0x1F) === 0 && ((1 << (_la - 129)) & 2884871) !== 0)) { { - this.state = 1304; + this.state = 1330; this.jsonLiteral(); - this.state = 1309; + this.state = 1335; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 1305; + this.state = 1331; this.match(QuixosCapabilityParser.COMMA); - this.state = 1306; + this.state = 1332; this.jsonLiteral(); } } - this.state = 1311; + this.state = 1337; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1314; + this.state = 1340; this.match(QuixosCapabilityParser.RBRACK); } } @@ -5146,14 +5242,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public identifier(): IdentifierContext { let localContext = new IdentifierContext(this.context, this.state); - this.enterRule(localContext, 154, QuixosCapabilityParser.RULE_identifier); + this.enterRule(localContext, 158, QuixosCapabilityParser.RULE_identifier); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1316; + this.state = 1342; _la = this.tokenStream.LA(1); - if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966782) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8195) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149)) { + if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8195) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149)) { this.errorHandler.recoverInline(this); } else { @@ -5177,11 +5273,11 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stringLiteral(): StringLiteralContext { let localContext = new StringLiteralContext(this.context, this.state); - this.enterRule(localContext, 156, QuixosCapabilityParser.RULE_stringLiteral); + this.enterRule(localContext, 160, QuixosCapabilityParser.RULE_stringLiteral); try { this.enterOuterAlt(localContext, 1); { - this.state = 1318; + this.state = 1344; this.match(QuixosCapabilityParser.STRING_LITERAL); } } @@ -5200,7 +5296,7 @@ export class QuixosCapabilityParser extends antlr.Parser { } public static readonly _serializedATN: number[] = [ - 4,1,153,1321,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,153,1347,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, @@ -5212,502 +5308,513 @@ export class QuixosCapabilityParser extends antlr.Parser { 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,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,171,8,0,1, - 1,1,1,1,1,5,1,176,8,1,10,1,12,1,179,9,1,1,1,1,1,1,2,1,2,1,2,1,2, - 1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,5,3,197,8,3,10,3,12,3,200, - 9,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,3,4,212,8,4,1,5,1,5, - 1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,3,5,224,8,5,1,6,1,6,1,6,1,6,1,6, - 1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,3,8,244,8,8, - 1,9,1,9,1,9,1,9,1,9,1,9,3,9,252,8,9,1,9,1,9,1,10,5,10,257,8,10,10, - 10,12,10,260,9,10,1,10,1,10,1,10,3,10,265,8,10,1,10,1,10,1,10,1, - 10,1,10,1,10,1,10,1,10,5,10,275,8,10,10,10,12,10,278,9,10,3,10,280, - 8,10,1,10,1,10,5,10,284,8,10,10,10,12,10,287,9,10,1,10,1,10,1,11, - 1,11,1,11,1,11,5,11,295,8,11,10,11,12,11,298,9,11,1,11,1,11,1,12, - 1,12,1,12,1,12,3,12,306,8,12,1,12,1,12,1,12,1,12,1,12,1,12,5,12, - 314,8,12,10,12,12,12,317,9,12,3,12,319,8,12,3,12,321,8,12,1,13,1, - 13,3,13,325,8,13,1,14,1,14,1,14,1,14,5,14,331,8,14,10,14,12,14,334, - 9,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,3,15,345,8,15, - 1,16,1,16,1,16,3,16,350,8,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17, - 3,17,359,8,17,1,18,3,18,362,8,18,1,18,1,18,1,18,1,18,1,18,1,18,1, - 18,1,18,1,18,1,18,1,18,1,18,1,18,3,18,377,8,18,1,18,1,18,1,18,1, - 19,3,19,383,8,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,5,19,393, - 8,19,10,19,12,19,396,9,19,1,19,1,19,1,20,1,20,1,20,1,20,3,20,404, - 8,20,1,20,1,20,1,20,1,20,1,20,1,20,3,20,412,8,20,1,20,1,20,1,20, - 1,20,1,20,1,20,3,20,420,8,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20, - 1,20,1,20,1,20,1,20,3,20,433,8,20,1,21,3,21,436,8,21,1,21,1,21,1, - 21,1,21,1,21,1,21,1,21,1,21,3,21,446,8,21,1,21,1,21,3,21,450,8,21, - 1,21,1,21,5,21,454,8,21,10,21,12,21,457,9,21,1,21,1,21,1,22,1,22, - 3,22,463,8,22,1,23,1,23,1,23,1,23,3,23,469,8,23,1,23,1,23,1,23,1, - 23,1,23,1,23,3,23,477,8,23,1,23,1,23,1,23,1,23,1,23,1,23,3,23,485, - 8,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,3,23, - 498,8,23,1,24,1,24,1,24,1,24,1,24,3,24,505,8,24,1,24,1,24,3,24,509, - 8,24,1,25,5,25,512,8,25,10,25,12,25,515,9,25,1,25,1,25,1,25,1,25, - 1,25,1,25,1,25,1,25,3,25,525,8,25,1,25,1,25,5,25,529,8,25,10,25, - 12,25,532,9,25,1,25,1,25,1,26,1,26,1,26,1,26,1,26,1,26,3,26,542, - 8,26,1,27,1,27,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,28,1,28,1,28,1,28,1,28,1,28,1,29,1,29,1,29, - 3,29,569,8,29,1,29,1,29,1,29,1,29,3,29,575,8,29,1,29,1,29,1,29,1, - 29,1,29,1,29,1,29,5,29,584,8,29,10,29,12,29,587,9,29,1,29,1,29,1, - 30,1,30,1,30,1,30,1,30,1,30,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,31,1,31,1,31,3,31,613,8,31,1,31,1, - 31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1, - 31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,3,31,640,8, - 31,1,32,1,32,1,32,3,32,645,8,32,1,32,1,32,1,32,1,32,1,32,1,32,1, - 32,1,32,1,32,3,32,656,8,32,1,32,3,32,659,8,32,1,32,1,32,1,32,3,32, - 664,8,32,1,32,3,32,667,8,32,1,32,1,32,1,33,1,33,1,33,3,33,674,8, - 33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,3,33,683,8,33,1,33,3,33,686, - 8,33,1,33,3,33,689,8,33,1,33,1,33,1,34,1,34,1,34,1,34,1,35,1,35, - 1,35,1,35,1,35,1,35,1,35,1,35,1,35,3,35,706,8,35,1,36,1,36,1,36, - 1,36,1,36,5,36,713,8,36,10,36,12,36,716,9,36,1,36,1,36,1,37,1,37, - 1,37,1,37,1,37,1,37,1,37,1,37,1,37,3,37,729,8,37,1,37,1,37,1,38, - 1,38,1,38,1,39,1,39,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40, - 1,40,5,40,748,8,40,10,40,12,40,751,9,40,3,40,753,8,40,1,40,3,40, - 756,8,40,1,41,1,41,1,41,5,41,761,8,41,10,41,12,41,764,9,41,1,42, - 1,42,1,42,5,42,769,8,42,10,42,12,42,772,9,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,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,1,43,1,43, - 1,43,1,43,1,43,1,43,1,43,1,43,1,43,3,43,811,8,43,1,43,3,43,814,8, - 43,1,43,1,43,3,43,818,8,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,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,3, - 43,840,8,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,854,8,43,1,44,1,44,1,44,1,44,5,44,860,8,44,10,44,12, - 44,863,9,44,1,44,1,44,1,45,1,45,1,46,1,46,1,46,1,47,1,47,3,47,874, - 8,47,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48,1,48, - 3,48,888,8,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,49,3,49,898,8, - 49,1,50,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,51,1,51,3,51,916,8,51,1,51,1,51,3,51,920,8,51,1,51,3,51, - 923,8,51,1,51,1,51,3,51,927,8,51,1,51,3,51,930,8,51,1,51,1,51,1, - 52,1,52,1,52,1,52,1,52,3,52,939,8,52,1,52,1,52,3,52,943,8,52,1,52, - 1,52,3,52,947,8,52,1,52,1,52,5,52,951,8,52,10,52,12,52,954,9,52, - 1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,53,3,53,964,8,53,1,54,1,54, - 1,54,5,54,969,8,54,10,54,12,54,972,9,54,1,54,1,54,1,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,1,55,1,55,3,55, - 991,8,55,1,56,1,56,1,56,1,56,1,56,5,56,998,8,56,10,56,12,56,1001, - 9,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,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,59,1,59, - 1,59,1,59,1,59,1,59,3,59,1032,8,59,1,59,1,59,1,60,1,60,1,60,1,60, - 1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,3,61, - 1052,8,61,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62, - 1,62,1,62,1,62,1,62,1,62,1,62,1,62,3,62,1072,8,62,1,62,1,62,1,62, - 1,62,1,62,1,62,1,62,1,62,3,62,1082,8,62,1,62,3,62,1085,8,62,1,62, - 3,62,1088,8,62,3,62,1090,8,62,1,63,1,63,1,63,1,64,1,64,1,65,1,65, - 1,66,1,66,1,66,5,66,1102,8,66,10,66,12,66,1105,9,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,67,1,67,1,67,1, - 67,1,67,1,67,1,67,1,67,1,67,3,67,1128,8,67,1,67,1,67,1,67,1,67,1, - 67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,3,67,1144,8,67,1, - 67,1,67,1,67,1,67,1,67,1,67,1,67,3,67,1153,8,67,1,67,1,67,1,67,1, - 67,1,67,1,67,1,67,1,67,3,67,1163,8,67,1,67,1,67,1,67,1,67,1,67,1, - 67,1,67,1,67,1,67,5,67,1174,8,67,10,67,12,67,1177,9,67,1,67,1,67, - 1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,3,67,1191,8,67, - 1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,3,67,1203,8,67, - 1,67,1,67,3,67,1207,8,67,1,68,1,68,1,68,1,68,1,68,1,68,1,68,3,68, - 1216,8,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,69,1,69,1,69,1,69,3,69,1234,8,69,1,69,1,69,1,69,1,69,1,69, + 78,2,79,7,79,2,80,7,80,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, + 0,1,0,3,0,175,8,0,1,1,1,1,1,1,5,1,180,8,1,10,1,12,1,183,9,1,1,1, + 1,1,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,5,3, + 201,8,3,10,3,12,3,204,9,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1, + 4,3,4,216,8,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,3,5,228,8, + 5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1, + 8,1,8,1,8,3,8,248,8,8,1,9,1,9,1,9,1,9,1,9,1,9,3,9,256,8,9,1,9,1, + 9,1,10,5,10,261,8,10,10,10,12,10,264,9,10,1,10,1,10,1,10,3,10,269, + 8,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,5,10,279,8,10,10,10, + 12,10,282,9,10,3,10,284,8,10,1,10,1,10,5,10,288,8,10,10,10,12,10, + 291,9,10,1,10,1,10,1,11,1,11,1,11,1,11,5,11,299,8,11,10,11,12,11, + 302,9,11,1,11,1,11,1,12,1,12,1,12,1,12,3,12,310,8,12,1,12,1,12,1, + 12,1,12,1,12,1,12,5,12,318,8,12,10,12,12,12,321,9,12,3,12,323,8, + 12,3,12,325,8,12,1,13,1,13,3,13,329,8,13,1,14,1,14,1,14,1,14,5,14, + 335,8,14,10,14,12,14,338,9,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15, + 1,15,1,15,3,15,349,8,15,1,16,1,16,1,16,3,16,354,8,16,1,16,1,16,1, + 16,1,16,1,17,1,17,1,17,1,17,3,17,364,8,17,1,18,1,18,1,18,1,18,1, + 18,1,18,1,18,1,18,3,18,374,8,18,1,18,1,18,1,19,3,19,379,8,19,1,19, + 1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,3,19, + 394,8,19,1,19,1,19,1,19,1,20,3,20,400,8,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,20,1,20,5,20,410,8,20,10,20,12,20,413,9,20,1,20,1,20,1, + 21,1,21,1,21,1,21,3,21,421,8,21,1,21,1,21,1,21,1,21,1,21,1,21,3, + 21,429,8,21,1,21,1,21,1,21,1,21,1,21,1,21,3,21,437,8,21,1,21,1,21, + 1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,3,21,450,8,21,1,22, + 3,22,453,8,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,3,22,463,8, + 22,1,22,1,22,3,22,467,8,22,1,22,1,22,5,22,471,8,22,10,22,12,22,474, + 9,22,1,22,1,22,1,23,1,23,3,23,480,8,23,1,24,1,24,1,24,1,24,3,24, + 486,8,24,1,24,1,24,1,24,1,24,1,24,1,24,3,24,494,8,24,1,24,1,24,1, + 24,1,24,1,24,1,24,3,24,502,8,24,1,24,1,24,1,24,1,24,1,24,1,24,1, + 24,1,24,1,24,1,24,1,24,3,24,515,8,24,1,25,1,25,1,25,1,25,1,25,3, + 25,522,8,25,1,25,1,25,3,25,526,8,25,1,26,5,26,529,8,26,10,26,12, + 26,532,9,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,3,26,542,8,26, + 1,26,1,26,5,26,546,8,26,10,26,12,26,549,9,26,1,26,1,26,1,27,1,27, + 1,27,1,27,1,27,1,27,3,27,559,8,27,1,28,1,28,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,29,1,29,1,29, + 1,29,1,29,1,29,1,30,1,30,1,30,3,30,586,8,30,1,30,1,30,1,30,1,30, + 3,30,592,8,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,5,30,601,8,30,10, + 30,12,30,604,9,30,1,30,1,30,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,32,1,32,1,32,1,32,1,32,1,32,1,32,1, + 32,1,32,3,32,630,8,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1, + 32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1, + 32,1,32,1,32,1,32,3,32,657,8,32,1,33,1,33,1,33,3,33,662,8,33,1,33, + 1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,3,33,673,8,33,1,33,3,33, + 676,8,33,1,33,1,33,1,33,3,33,681,8,33,1,33,3,33,684,8,33,1,33,1, + 33,1,34,1,34,1,34,3,34,691,8,34,1,34,1,34,1,34,1,34,1,34,1,34,1, + 34,3,34,700,8,34,1,34,3,34,703,8,34,1,34,3,34,706,8,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,36,1,36,1,36, + 3,36,723,8,36,1,37,1,37,1,37,1,37,1,37,5,37,730,8,37,10,37,12,37, + 733,9,37,1,37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38, + 3,38,746,8,38,1,38,1,38,1,39,1,39,1,39,1,40,1,40,1,41,1,41,1,41, + 1,41,1,41,1,41,1,41,1,41,1,41,1,41,5,41,765,8,41,10,41,12,41,768, + 9,41,3,41,770,8,41,1,41,3,41,773,8,41,1,42,1,42,1,42,5,42,778,8, + 42,10,42,12,42,781,9,42,1,43,1,43,1,43,5,43,786,8,43,10,43,12,43, + 789,9,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,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,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44, + 3,44,828,8,44,1,44,3,44,831,8,44,1,44,1,44,3,44,835,8,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,1,44,1,44,1, + 44,1,44,1,44,1,44,1,44,1,44,3,44,857,8,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,871,8,44,1,45,1,45,1, + 45,1,45,5,45,877,8,45,10,45,12,45,880,9,45,1,45,1,45,1,46,1,46,1, + 47,1,47,1,47,1,48,1,48,3,48,891,8,48,1,49,1,49,1,49,1,49,1,49,1, + 49,1,49,1,49,1,49,1,49,1,49,1,49,3,49,905,8,49,1,49,1,49,1,50,1, + 50,1,50,1,50,1,50,1,50,3,50,915,8,50,1,51,1,51,1,51,1,51,1,51,1, + 51,1,51,1,51,1,51,1,52,1,52,1,52,1,52,1,52,1,52,1,52,3,52,933,8, + 52,1,52,1,52,3,52,937,8,52,1,52,3,52,940,8,52,1,52,1,52,3,52,944, + 8,52,1,52,3,52,947,8,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,3,53, + 956,8,53,1,53,1,53,3,53,960,8,53,1,53,1,53,3,53,964,8,53,1,53,1, + 53,5,53,968,8,53,10,53,12,53,971,9,53,1,53,1,53,1,54,1,54,1,54,1, + 54,1,54,1,54,1,54,3,54,982,8,54,1,55,1,55,1,55,1,55,1,55,1,55,1, + 55,1,55,1,56,1,56,1,56,5,56,995,8,56,10,56,12,56,998,9,56,1,56,1, + 56,1,56,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1, + 57,1,57,1,57,3,57,1017,8,57,1,58,1,58,1,58,1,58,1,58,5,58,1024,8, + 58,10,58,12,58,1027,9,58,1,58,1,58,1,59,1,59,1,59,1,59,1,59,1,59, + 1,59,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60, + 1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,61,3,61,1058,8,61,1,61,1,61, + 1,62,1,62,1,62,1,62,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63, + 1,63,1,63,1,63,3,63,1078,8,63,1,64,1,64,1,64,1,64,1,64,1,64,1,64, + 1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,3,64,1098, + 8,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,3,64,1108,8,64,1,64, + 3,64,1111,8,64,1,64,3,64,1114,8,64,3,64,1116,8,64,1,65,1,65,1,65, + 1,66,1,66,1,67,1,67,1,68,1,68,1,68,5,68,1128,8,68,10,68,12,68,1131, + 9,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,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,3,69,1154,8,69,1,69, 1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69, - 1,69,1,69,5,69,1256,8,69,10,69,12,69,1259,9,69,1,69,1,69,1,69,3, - 69,1264,8,69,3,69,1266,8,69,1,70,1,70,1,70,1,70,1,70,1,71,1,71,1, - 72,1,72,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,3,73,1285,8,73,1, - 74,1,74,1,74,1,74,5,74,1291,8,74,10,74,12,74,1294,9,74,3,74,1296, - 8,74,1,74,1,74,1,75,1,75,1,75,1,75,1,76,1,76,1,76,1,76,5,76,1308, - 8,76,10,76,12,76,1311,9,76,3,76,1313,8,76,1,76,1,76,1,77,1,77,1, - 78,1,78,1,78,0,0,79,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,0,9,2,0,15,15,33,33,1,0,11,12,1,0,101,105,3, - 0,1,1,96,100,102,103,3,0,1,1,96,97,102,103,2,0,98,100,102,103,1, - 0,121,128,1,0,108,111,7,0,1,8,10,33,45,45,74,74,94,95,106,106,149, - 149,1428,0,170,1,0,0,0,2,172,1,0,0,0,4,182,1,0,0,0,6,186,1,0,0,0, - 8,211,1,0,0,0,10,223,1,0,0,0,12,225,1,0,0,0,14,232,1,0,0,0,16,243, - 1,0,0,0,18,245,1,0,0,0,20,258,1,0,0,0,22,290,1,0,0,0,24,320,1,0, - 0,0,26,322,1,0,0,0,28,326,1,0,0,0,30,344,1,0,0,0,32,346,1,0,0,0, - 34,358,1,0,0,0,36,361,1,0,0,0,38,382,1,0,0,0,40,432,1,0,0,0,42,435, - 1,0,0,0,44,460,1,0,0,0,46,497,1,0,0,0,48,508,1,0,0,0,50,513,1,0, - 0,0,52,541,1,0,0,0,54,543,1,0,0,0,56,553,1,0,0,0,58,565,1,0,0,0, - 60,590,1,0,0,0,62,639,1,0,0,0,64,641,1,0,0,0,66,670,1,0,0,0,68,692, - 1,0,0,0,70,705,1,0,0,0,72,707,1,0,0,0,74,719,1,0,0,0,76,732,1,0, - 0,0,78,735,1,0,0,0,80,755,1,0,0,0,82,757,1,0,0,0,84,765,1,0,0,0, - 86,853,1,0,0,0,88,855,1,0,0,0,90,866,1,0,0,0,92,868,1,0,0,0,94,873, - 1,0,0,0,96,875,1,0,0,0,98,897,1,0,0,0,100,899,1,0,0,0,102,908,1, - 0,0,0,104,933,1,0,0,0,106,963,1,0,0,0,108,965,1,0,0,0,110,990,1, - 0,0,0,112,992,1,0,0,0,114,1004,1,0,0,0,116,1011,1,0,0,0,118,1025, - 1,0,0,0,120,1035,1,0,0,0,122,1051,1,0,0,0,124,1089,1,0,0,0,126,1091, - 1,0,0,0,128,1094,1,0,0,0,130,1096,1,0,0,0,132,1098,1,0,0,0,134,1206, - 1,0,0,0,136,1208,1,0,0,0,138,1265,1,0,0,0,140,1267,1,0,0,0,142,1272, - 1,0,0,0,144,1274,1,0,0,0,146,1284,1,0,0,0,148,1286,1,0,0,0,150,1299, - 1,0,0,0,152,1303,1,0,0,0,154,1316,1,0,0,0,156,1318,1,0,0,0,158,159, - 3,6,3,0,159,160,5,0,0,1,160,171,1,0,0,0,161,162,3,20,10,0,162,163, - 5,0,0,1,163,171,1,0,0,0,164,165,3,50,25,0,165,166,5,0,0,1,166,171, - 1,0,0,0,167,168,3,2,1,0,168,169,5,0,0,1,169,171,1,0,0,0,170,158, - 1,0,0,0,170,161,1,0,0,0,170,164,1,0,0,0,170,167,1,0,0,0,171,1,1, - 0,0,0,172,173,5,40,0,0,173,177,5,137,0,0,174,176,3,8,4,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,138,0,0,181,3,1,0,0,0,182,183, - 5,41,0,0,183,184,3,156,78,0,184,185,5,134,0,0,185,5,1,0,0,0,186, - 187,5,9,0,0,187,188,3,154,77,0,188,189,5,84,0,0,189,190,3,156,78, - 0,190,191,5,77,0,0,191,192,3,156,78,0,192,193,5,76,0,0,193,194,3, - 156,78,0,194,198,5,137,0,0,195,197,3,8,4,0,196,195,1,0,0,0,197,200, - 1,0,0,0,198,196,1,0,0,0,198,199,1,0,0,0,199,201,1,0,0,0,200,198, - 1,0,0,0,201,202,5,138,0,0,202,7,1,0,0,0,203,212,3,4,2,0,204,212, - 3,18,9,0,205,212,3,10,5,0,206,212,3,92,46,0,207,212,3,104,52,0,208, - 212,3,136,68,0,209,212,3,56,28,0,210,212,3,32,16,0,211,203,1,0,0, - 0,211,204,1,0,0,0,211,205,1,0,0,0,211,206,1,0,0,0,211,207,1,0,0, - 0,211,208,1,0,0,0,211,209,1,0,0,0,211,210,1,0,0,0,212,9,1,0,0,0, - 213,214,5,41,0,0,214,215,5,44,0,0,215,216,3,154,77,0,216,217,5,134, - 0,0,217,224,1,0,0,0,218,219,5,41,0,0,219,220,5,46,0,0,220,221,3, - 154,77,0,221,222,5,134,0,0,222,224,1,0,0,0,223,213,1,0,0,0,223,218, - 1,0,0,0,224,11,1,0,0,0,225,226,5,42,0,0,226,227,5,43,0,0,227,228, - 3,154,77,0,228,229,5,84,0,0,229,230,3,156,78,0,230,231,5,134,0,0, - 231,13,1,0,0,0,232,233,5,42,0,0,233,234,5,44,0,0,234,235,3,154,77, - 0,235,236,5,77,0,0,236,237,3,156,78,0,237,238,5,134,0,0,238,15,1, - 0,0,0,239,244,3,10,5,0,240,244,3,12,6,0,241,244,3,14,7,0,242,244, - 3,32,16,0,243,239,1,0,0,0,243,240,1,0,0,0,243,241,1,0,0,0,243,242, - 1,0,0,0,244,17,1,0,0,0,245,246,5,43,0,0,246,247,3,154,77,0,247,248, - 5,84,0,0,248,251,3,156,78,0,249,250,5,85,0,0,250,252,3,156,78,0, - 251,249,1,0,0,0,251,252,1,0,0,0,252,253,1,0,0,0,253,254,5,134,0, - 0,254,19,1,0,0,0,255,257,3,16,8,0,256,255,1,0,0,0,257,260,1,0,0, - 0,258,256,1,0,0,0,258,259,1,0,0,0,259,261,1,0,0,0,260,258,1,0,0, - 0,261,262,5,44,0,0,262,264,3,154,77,0,263,265,3,22,11,0,264,263, - 1,0,0,0,264,265,1,0,0,0,265,266,1,0,0,0,266,267,5,84,0,0,267,268, - 3,156,78,0,268,269,5,77,0,0,269,279,3,156,78,0,270,271,5,89,0,0, - 271,276,3,26,13,0,272,273,5,135,0,0,273,275,3,26,13,0,274,272,1, - 0,0,0,275,278,1,0,0,0,276,274,1,0,0,0,276,277,1,0,0,0,277,280,1, - 0,0,0,278,276,1,0,0,0,279,270,1,0,0,0,279,280,1,0,0,0,280,281,1, - 0,0,0,281,285,5,137,0,0,282,284,3,34,17,0,283,282,1,0,0,0,284,287, - 1,0,0,0,285,283,1,0,0,0,285,286,1,0,0,0,286,288,1,0,0,0,287,285, - 1,0,0,0,288,289,5,138,0,0,289,21,1,0,0,0,290,291,5,143,0,0,291,296, - 3,24,12,0,292,293,5,135,0,0,293,295,3,24,12,0,294,292,1,0,0,0,295, - 298,1,0,0,0,296,294,1,0,0,0,296,297,1,0,0,0,297,299,1,0,0,0,298, - 296,1,0,0,0,299,300,5,144,0,0,300,23,1,0,0,0,301,302,5,47,0,0,302, - 305,3,154,77,0,303,304,5,133,0,0,304,306,5,37,0,0,305,303,1,0,0, - 0,305,306,1,0,0,0,306,321,1,0,0,0,307,308,5,36,0,0,308,318,3,154, - 77,0,309,310,5,38,0,0,310,315,3,26,13,0,311,312,5,145,0,0,312,314, - 3,26,13,0,313,311,1,0,0,0,314,317,1,0,0,0,315,313,1,0,0,0,315,316, - 1,0,0,0,316,319,1,0,0,0,317,315,1,0,0,0,318,309,1,0,0,0,318,319, - 1,0,0,0,319,321,1,0,0,0,320,301,1,0,0,0,320,307,1,0,0,0,321,25,1, - 0,0,0,322,324,3,154,77,0,323,325,3,28,14,0,324,323,1,0,0,0,324,325, - 1,0,0,0,325,27,1,0,0,0,326,327,5,143,0,0,327,332,3,30,15,0,328,329, - 5,135,0,0,329,331,3,30,15,0,330,328,1,0,0,0,331,334,1,0,0,0,332, - 330,1,0,0,0,332,333,1,0,0,0,333,335,1,0,0,0,334,332,1,0,0,0,335, - 336,5,144,0,0,336,29,1,0,0,0,337,338,5,43,0,0,338,345,3,154,77,0, - 339,340,5,44,0,0,340,345,3,26,13,0,341,342,5,36,0,0,342,345,3,154, - 77,0,343,345,3,138,69,0,344,337,1,0,0,0,344,339,1,0,0,0,344,341, - 1,0,0,0,344,343,1,0,0,0,345,31,1,0,0,0,346,347,5,35,0,0,347,349, - 3,154,77,0,348,350,3,22,11,0,349,348,1,0,0,0,349,350,1,0,0,0,350, - 351,1,0,0,0,351,352,5,146,0,0,352,353,3,138,69,0,353,354,5,134,0, - 0,354,33,1,0,0,0,355,359,3,38,19,0,356,359,3,42,21,0,357,359,3,36, - 18,0,358,355,1,0,0,0,358,356,1,0,0,0,358,357,1,0,0,0,359,35,1,0, - 0,0,360,362,5,57,0,0,361,360,1,0,0,0,361,362,1,0,0,0,362,363,1,0, - 0,0,363,364,5,49,0,0,364,365,3,154,77,0,365,366,5,84,0,0,366,367, - 3,156,78,0,367,368,5,133,0,0,368,369,3,138,69,0,369,370,5,132,0, - 0,370,371,3,138,69,0,371,372,5,137,0,0,372,373,5,101,0,0,373,374, - 5,84,0,0,374,376,3,156,78,0,375,377,3,70,35,0,376,375,1,0,0,0,376, - 377,1,0,0,0,377,378,1,0,0,0,378,379,5,134,0,0,379,380,5,138,0,0, - 380,37,1,0,0,0,381,383,3,44,22,0,382,381,1,0,0,0,382,383,1,0,0,0, - 383,384,1,0,0,0,384,385,5,47,0,0,385,386,3,154,77,0,386,387,5,84, - 0,0,387,388,3,156,78,0,388,389,5,133,0,0,389,390,3,138,69,0,390, - 394,5,137,0,0,391,393,3,40,20,0,392,391,1,0,0,0,393,396,1,0,0,0, - 394,392,1,0,0,0,394,395,1,0,0,0,395,397,1,0,0,0,396,394,1,0,0,0, - 397,398,5,138,0,0,398,39,1,0,0,0,399,400,5,91,0,0,400,401,5,84,0, - 0,401,403,3,156,78,0,402,404,3,70,35,0,403,402,1,0,0,0,403,404,1, - 0,0,0,404,405,1,0,0,0,405,406,5,134,0,0,406,433,1,0,0,0,407,408, - 5,92,0,0,408,409,5,84,0,0,409,411,3,156,78,0,410,412,3,70,35,0,411, - 410,1,0,0,0,411,412,1,0,0,0,412,413,1,0,0,0,413,414,5,134,0,0,414, - 433,1,0,0,0,415,416,5,1,0,0,416,417,5,84,0,0,417,419,3,156,78,0, - 418,420,3,70,35,0,419,418,1,0,0,0,419,420,1,0,0,0,420,421,1,0,0, - 0,421,422,5,134,0,0,422,433,1,0,0,0,423,424,5,93,0,0,424,425,5,94, - 0,0,425,426,5,84,0,0,426,427,3,156,78,0,427,428,5,95,0,0,428,429, - 5,84,0,0,429,430,3,156,78,0,430,431,5,134,0,0,431,433,1,0,0,0,432, - 399,1,0,0,0,432,407,1,0,0,0,432,415,1,0,0,0,432,423,1,0,0,0,433, - 41,1,0,0,0,434,436,3,44,22,0,435,434,1,0,0,0,435,436,1,0,0,0,436, - 437,1,0,0,0,437,438,5,48,0,0,438,439,3,154,77,0,439,440,5,84,0,0, - 440,441,3,156,78,0,441,442,5,133,0,0,442,443,3,144,72,0,443,445, - 3,48,24,0,444,446,5,112,0,0,445,444,1,0,0,0,445,446,1,0,0,0,446, - 449,1,0,0,0,447,448,5,82,0,0,448,450,3,156,78,0,449,447,1,0,0,0, - 449,450,1,0,0,0,450,451,1,0,0,0,451,455,5,137,0,0,452,454,3,46,23, - 0,453,452,1,0,0,0,454,457,1,0,0,0,455,453,1,0,0,0,455,456,1,0,0, - 0,456,458,1,0,0,0,457,455,1,0,0,0,458,459,5,138,0,0,459,43,1,0,0, - 0,460,462,5,32,0,0,461,463,7,0,0,0,462,461,1,0,0,0,462,463,1,0,0, - 0,463,45,1,0,0,0,464,465,5,98,0,0,465,466,5,84,0,0,466,468,3,156, - 78,0,467,469,3,70,35,0,468,467,1,0,0,0,468,469,1,0,0,0,469,470,1, - 0,0,0,470,471,5,134,0,0,471,498,1,0,0,0,472,473,5,99,0,0,473,474, - 5,84,0,0,474,476,3,156,78,0,475,477,3,70,35,0,476,475,1,0,0,0,476, - 477,1,0,0,0,477,478,1,0,0,0,478,479,5,134,0,0,479,498,1,0,0,0,480, - 481,5,100,0,0,481,482,5,84,0,0,482,484,3,156,78,0,483,485,3,70,35, - 0,484,483,1,0,0,0,484,485,1,0,0,0,485,486,1,0,0,0,486,487,5,134, - 0,0,487,498,1,0,0,0,488,489,5,93,0,0,489,490,5,94,0,0,490,491,5, - 84,0,0,491,492,3,156,78,0,492,493,5,95,0,0,493,494,5,84,0,0,494, - 495,3,156,78,0,495,496,5,134,0,0,496,498,1,0,0,0,497,464,1,0,0,0, - 497,472,1,0,0,0,497,480,1,0,0,0,497,488,1,0,0,0,498,47,1,0,0,0,499, - 500,5,43,0,0,500,509,3,154,77,0,501,502,5,44,0,0,502,504,3,154,77, - 0,503,505,3,28,14,0,504,503,1,0,0,0,504,505,1,0,0,0,505,509,1,0, - 0,0,506,507,5,36,0,0,507,509,3,154,77,0,508,499,1,0,0,0,508,501, - 1,0,0,0,508,506,1,0,0,0,509,49,1,0,0,0,510,512,3,16,8,0,511,510, - 1,0,0,0,512,515,1,0,0,0,513,511,1,0,0,0,513,514,1,0,0,0,514,516, - 1,0,0,0,515,513,1,0,0,0,516,517,5,46,0,0,517,518,3,154,77,0,518, - 519,5,84,0,0,519,520,3,156,78,0,520,521,5,77,0,0,521,524,3,156,78, - 0,522,523,5,78,0,0,523,525,5,147,0,0,524,522,1,0,0,0,524,525,1,0, - 0,0,525,526,1,0,0,0,526,530,5,137,0,0,527,529,3,52,26,0,528,527, - 1,0,0,0,529,532,1,0,0,0,530,528,1,0,0,0,530,531,1,0,0,0,531,533, - 1,0,0,0,532,530,1,0,0,0,533,534,5,138,0,0,534,51,1,0,0,0,535,542, - 3,64,32,0,536,542,3,66,33,0,537,542,3,74,37,0,538,542,3,58,29,0, - 539,542,3,60,30,0,540,542,3,54,27,0,541,535,1,0,0,0,541,536,1,0, - 0,0,541,537,1,0,0,0,541,538,1,0,0,0,541,539,1,0,0,0,541,540,1,0, - 0,0,542,53,1,0,0,0,543,544,5,2,0,0,544,545,3,154,77,0,545,546,5, - 84,0,0,546,547,3,156,78,0,547,548,5,4,0,0,548,549,3,26,13,0,549, - 550,5,5,0,0,550,551,3,154,77,0,551,552,5,134,0,0,552,55,1,0,0,0, - 553,554,5,3,0,0,554,555,3,154,77,0,555,556,5,84,0,0,556,557,3,156, - 78,0,557,558,5,6,0,0,558,559,3,26,13,0,559,560,5,65,0,0,560,561, - 3,154,77,0,561,562,5,136,0,0,562,563,3,154,77,0,563,564,5,134,0, - 0,564,57,1,0,0,0,565,566,5,22,0,0,566,568,3,154,77,0,567,569,3,22, - 11,0,568,567,1,0,0,0,568,569,1,0,0,0,569,570,1,0,0,0,570,571,5,84, - 0,0,571,572,3,156,78,0,572,574,5,25,0,0,573,575,5,9,0,0,574,573, - 1,0,0,0,574,575,1,0,0,0,575,576,1,0,0,0,576,577,3,26,13,0,577,578, - 5,26,0,0,578,579,3,156,78,0,579,580,5,49,0,0,580,581,3,156,78,0, - 581,585,5,137,0,0,582,584,3,62,31,0,583,582,1,0,0,0,584,587,1,0, - 0,0,585,583,1,0,0,0,585,586,1,0,0,0,586,588,1,0,0,0,587,585,1,0, - 0,0,588,589,5,138,0,0,589,59,1,0,0,0,590,591,5,22,0,0,591,592,3, - 154,77,0,592,593,5,84,0,0,593,594,3,156,78,0,594,595,5,24,0,0,595, - 596,3,154,77,0,596,597,3,28,14,0,597,598,5,134,0,0,598,61,1,0,0, - 0,599,600,5,16,0,0,600,640,5,134,0,0,601,602,5,17,0,0,602,603,5, - 18,0,0,603,604,3,154,77,0,604,605,5,134,0,0,605,640,1,0,0,0,606, - 607,5,27,0,0,607,608,3,156,78,0,608,609,5,134,0,0,609,640,1,0,0, - 0,610,612,5,28,0,0,611,613,5,36,0,0,612,611,1,0,0,0,612,613,1,0, - 0,0,613,614,1,0,0,0,614,615,3,154,77,0,615,616,5,55,0,0,616,617, - 3,26,13,0,617,618,5,134,0,0,618,640,1,0,0,0,619,620,5,29,0,0,620, - 621,3,154,77,0,621,622,5,147,0,0,622,623,5,134,0,0,623,640,1,0,0, - 0,624,625,5,30,0,0,625,626,3,26,13,0,626,627,5,136,0,0,627,628,3, - 154,77,0,628,629,3,154,77,0,629,630,3,156,78,0,630,631,5,134,0,0, - 631,640,1,0,0,0,632,633,5,93,0,0,633,640,5,134,0,0,634,635,5,31, - 0,0,635,636,5,147,0,0,636,637,3,156,78,0,637,638,5,134,0,0,638,640, - 1,0,0,0,639,599,1,0,0,0,639,601,1,0,0,0,639,606,1,0,0,0,639,610, - 1,0,0,0,639,619,1,0,0,0,639,624,1,0,0,0,639,632,1,0,0,0,639,634, - 1,0,0,0,640,63,1,0,0,0,641,642,5,49,0,0,642,644,3,154,77,0,643,645, - 3,22,11,0,644,643,1,0,0,0,644,645,1,0,0,0,645,646,1,0,0,0,646,647, - 5,84,0,0,647,648,3,156,78,0,648,649,5,133,0,0,649,650,3,138,69,0, - 650,651,5,132,0,0,651,652,3,138,69,0,652,653,5,86,0,0,653,655,3, - 78,39,0,654,656,3,70,35,0,655,654,1,0,0,0,655,656,1,0,0,0,656,658, - 1,0,0,0,657,659,3,76,38,0,658,657,1,0,0,0,658,659,1,0,0,0,659,660, - 1,0,0,0,660,661,5,88,0,0,661,663,3,80,40,0,662,664,3,84,42,0,663, - 662,1,0,0,0,663,664,1,0,0,0,664,666,1,0,0,0,665,667,3,68,34,0,666, - 665,1,0,0,0,666,667,1,0,0,0,667,668,1,0,0,0,668,669,5,134,0,0,669, - 65,1,0,0,0,670,671,5,50,0,0,671,673,3,154,77,0,672,674,3,22,11,0, - 673,672,1,0,0,0,673,674,1,0,0,0,674,675,1,0,0,0,675,676,5,84,0,0, - 676,677,3,156,78,0,677,678,5,133,0,0,678,679,3,138,69,0,679,680, - 5,132,0,0,680,682,3,138,69,0,681,683,3,70,35,0,682,681,1,0,0,0,682, - 683,1,0,0,0,683,685,1,0,0,0,684,686,3,84,42,0,685,684,1,0,0,0,685, - 686,1,0,0,0,686,688,1,0,0,0,687,689,3,68,34,0,688,687,1,0,0,0,688, - 689,1,0,0,0,689,690,1,0,0,0,690,691,5,134,0,0,691,67,1,0,0,0,692, - 693,5,66,0,0,693,694,5,65,0,0,694,695,3,154,77,0,695,69,1,0,0,0, - 696,697,5,10,0,0,697,706,5,13,0,0,698,699,5,10,0,0,699,700,7,1,0, - 0,700,701,5,14,0,0,701,702,5,139,0,0,702,703,3,82,41,0,703,704,5, - 140,0,0,704,706,1,0,0,0,705,696,1,0,0,0,705,698,1,0,0,0,706,71,1, - 0,0,0,707,708,5,65,0,0,708,709,5,139,0,0,709,714,3,120,60,0,710, - 711,5,135,0,0,711,713,3,120,60,0,712,710,1,0,0,0,713,716,1,0,0,0, - 714,712,1,0,0,0,714,715,1,0,0,0,715,717,1,0,0,0,716,714,1,0,0,0, - 717,718,5,140,0,0,718,73,1,0,0,0,719,720,5,51,0,0,720,721,3,154, - 77,0,721,722,5,84,0,0,722,723,3,156,78,0,723,724,5,52,0,0,724,725, - 3,154,77,0,725,726,5,133,0,0,726,728,3,138,69,0,727,729,3,84,42, - 0,728,727,1,0,0,0,728,729,1,0,0,0,729,730,1,0,0,0,730,731,5,134, - 0,0,731,75,1,0,0,0,732,733,5,87,0,0,733,734,3,138,69,0,734,77,1, - 0,0,0,735,736,7,2,0,0,736,79,1,0,0,0,737,756,5,90,0,0,738,739,5, - 43,0,0,739,756,3,154,77,0,740,741,5,36,0,0,741,756,3,154,77,0,742, - 743,5,45,0,0,743,752,5,139,0,0,744,749,3,26,13,0,745,746,5,135,0, - 0,746,748,3,26,13,0,747,745,1,0,0,0,748,751,1,0,0,0,749,747,1,0, - 0,0,749,750,1,0,0,0,750,753,1,0,0,0,751,749,1,0,0,0,752,744,1,0, - 0,0,752,753,1,0,0,0,753,754,1,0,0,0,754,756,5,140,0,0,755,737,1, - 0,0,0,755,738,1,0,0,0,755,740,1,0,0,0,755,742,1,0,0,0,756,81,1,0, - 0,0,757,762,3,154,77,0,758,759,5,135,0,0,759,761,3,154,77,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, - 83,1,0,0,0,764,762,1,0,0,0,765,766,5,89,0,0,766,770,5,137,0,0,767, - 769,3,86,43,0,768,767,1,0,0,0,769,772,1,0,0,0,770,768,1,0,0,0,770, - 771,1,0,0,0,771,773,1,0,0,0,772,770,1,0,0,0,773,774,5,138,0,0,774, - 85,1,0,0,0,775,776,5,23,0,0,776,777,3,154,77,0,777,778,5,84,0,0, - 778,779,3,156,78,0,779,780,5,139,0,0,780,781,3,82,41,0,781,782,5, - 140,0,0,782,783,5,134,0,0,783,854,1,0,0,0,784,785,5,61,0,0,785,786, - 3,154,77,0,786,787,5,84,0,0,787,788,3,156,78,0,788,789,5,133,0,0, - 789,790,3,138,69,0,790,791,3,88,44,0,791,792,5,134,0,0,792,854,1, - 0,0,0,793,794,5,62,0,0,794,795,3,154,77,0,795,796,5,84,0,0,796,797, - 3,156,78,0,797,798,5,133,0,0,798,799,3,144,72,0,799,800,3,48,24, - 0,800,801,3,88,44,0,801,802,5,134,0,0,802,854,1,0,0,0,803,804,5, - 44,0,0,804,805,3,154,77,0,805,806,5,84,0,0,806,807,3,156,78,0,807, - 808,5,133,0,0,808,810,3,154,77,0,809,811,3,28,14,0,810,809,1,0,0, - 0,810,811,1,0,0,0,811,813,1,0,0,0,812,814,3,72,36,0,813,812,1,0, - 0,0,813,814,1,0,0,0,814,817,1,0,0,0,815,816,5,18,0,0,816,818,5,53, - 0,0,817,815,1,0,0,0,817,818,1,0,0,0,818,819,1,0,0,0,819,820,5,134, - 0,0,820,854,1,0,0,0,821,822,5,7,0,0,822,823,3,154,77,0,823,824,5, - 84,0,0,824,825,3,156,78,0,825,826,5,133,0,0,826,827,3,154,77,0,827, - 828,5,53,0,0,828,829,3,138,69,0,829,830,5,134,0,0,830,854,1,0,0, - 0,831,832,5,51,0,0,832,833,3,154,77,0,833,834,5,84,0,0,834,835,3, - 156,78,0,835,836,5,133,0,0,836,839,3,154,77,0,837,838,5,53,0,0,838, - 840,3,138,69,0,839,837,1,0,0,0,839,840,1,0,0,0,840,841,1,0,0,0,841, - 842,5,134,0,0,842,854,1,0,0,0,843,844,5,22,0,0,844,845,3,154,77, - 0,845,846,5,84,0,0,846,847,3,156,78,0,847,848,5,133,0,0,848,849, - 3,154,77,0,849,850,5,136,0,0,850,851,3,154,77,0,851,852,5,134,0, - 0,852,854,1,0,0,0,853,775,1,0,0,0,853,784,1,0,0,0,853,793,1,0,0, - 0,853,803,1,0,0,0,853,821,1,0,0,0,853,831,1,0,0,0,853,843,1,0,0, - 0,854,87,1,0,0,0,855,856,5,139,0,0,856,861,3,90,45,0,857,858,5,135, - 0,0,858,860,3,90,45,0,859,857,1,0,0,0,860,863,1,0,0,0,861,859,1, - 0,0,0,861,862,1,0,0,0,862,864,1,0,0,0,863,861,1,0,0,0,864,865,5, - 140,0,0,865,89,1,0,0,0,866,867,7,3,0,0,867,91,1,0,0,0,868,869,5, - 60,0,0,869,870,3,94,47,0,870,93,1,0,0,0,871,874,3,96,48,0,872,874, - 3,100,50,0,873,871,1,0,0,0,873,872,1,0,0,0,874,95,1,0,0,0,875,876, - 5,61,0,0,876,877,3,154,77,0,877,878,5,84,0,0,878,879,3,156,78,0, - 879,880,5,71,0,0,880,881,3,154,77,0,881,882,5,133,0,0,882,883,3, - 138,69,0,883,884,5,72,0,0,884,887,3,98,49,0,885,886,5,73,0,0,886, - 888,3,146,73,0,887,885,1,0,0,0,887,888,1,0,0,0,888,889,1,0,0,0,889, - 890,5,134,0,0,890,97,1,0,0,0,891,898,5,106,0,0,892,893,5,107,0,0, - 893,894,5,141,0,0,894,895,3,138,69,0,895,896,5,142,0,0,896,898,1, - 0,0,0,897,891,1,0,0,0,897,892,1,0,0,0,898,99,1,0,0,0,899,900,5,62, - 0,0,900,901,3,154,77,0,901,902,5,84,0,0,902,903,3,156,78,0,903,904, - 5,137,0,0,904,905,3,102,51,0,905,906,3,102,51,0,906,907,5,138,0, - 0,907,101,1,0,0,0,908,909,3,48,24,0,909,910,5,63,0,0,910,911,3,154, - 77,0,911,912,5,84,0,0,912,913,3,156,78,0,913,915,3,144,72,0,914, - 916,5,112,0,0,915,914,1,0,0,0,915,916,1,0,0,0,916,919,1,0,0,0,917, - 918,5,79,0,0,918,920,3,156,78,0,919,917,1,0,0,0,919,920,1,0,0,0, - 920,922,1,0,0,0,921,923,5,81,0,0,922,921,1,0,0,0,922,923,1,0,0,0, - 923,926,1,0,0,0,924,925,5,82,0,0,925,927,3,156,78,0,926,924,1,0, - 0,0,926,927,1,0,0,0,927,929,1,0,0,0,928,930,5,83,0,0,929,928,1,0, - 0,0,929,930,1,0,0,0,930,931,1,0,0,0,931,932,5,134,0,0,932,103,1, - 0,0,0,933,934,5,54,0,0,934,935,3,154,77,0,935,936,5,55,0,0,936,938, - 3,154,77,0,937,939,3,28,14,0,938,937,1,0,0,0,938,939,1,0,0,0,939, - 942,1,0,0,0,940,941,5,84,0,0,941,943,3,156,78,0,942,940,1,0,0,0, - 942,943,1,0,0,0,943,946,1,0,0,0,944,945,5,78,0,0,945,947,5,147,0, - 0,946,944,1,0,0,0,946,947,1,0,0,0,947,948,1,0,0,0,948,952,5,137, - 0,0,949,951,3,106,53,0,950,949,1,0,0,0,951,954,1,0,0,0,952,950,1, - 0,0,0,952,953,1,0,0,0,953,955,1,0,0,0,954,952,1,0,0,0,955,956,5, - 138,0,0,956,105,1,0,0,0,957,958,5,59,0,0,958,964,3,94,47,0,959,964, - 3,118,59,0,960,964,3,114,57,0,961,964,3,108,54,0,962,964,3,116,58, - 0,963,957,1,0,0,0,963,959,1,0,0,0,963,960,1,0,0,0,963,961,1,0,0, - 0,963,962,1,0,0,0,964,107,1,0,0,0,965,966,5,8,0,0,966,970,5,137, - 0,0,967,969,3,110,55,0,968,967,1,0,0,0,969,972,1,0,0,0,970,968,1, - 0,0,0,970,971,1,0,0,0,971,973,1,0,0,0,972,970,1,0,0,0,973,974,5, - 138,0,0,974,975,5,134,0,0,975,109,1,0,0,0,976,977,3,154,77,0,977, - 978,5,58,0,0,978,979,5,61,0,0,979,980,3,154,77,0,980,981,5,134,0, - 0,981,991,1,0,0,0,982,983,3,154,77,0,983,984,5,58,0,0,984,985,5, - 62,0,0,985,986,3,154,77,0,986,987,5,136,0,0,987,988,3,154,77,0,988, - 989,5,134,0,0,989,991,1,0,0,0,990,976,1,0,0,0,990,982,1,0,0,0,991, - 111,1,0,0,0,992,993,3,26,13,0,993,994,5,18,0,0,994,999,5,53,0,0, - 995,996,5,136,0,0,996,998,3,154,77,0,997,995,1,0,0,0,998,1001,1, - 0,0,0,999,997,1,0,0,0,999,1000,1,0,0,0,1000,1002,1,0,0,0,1001,999, - 1,0,0,0,1002,1003,5,134,0,0,1003,113,1,0,0,0,1004,1005,5,56,0,0, - 1005,1006,3,154,77,0,1006,1007,5,58,0,0,1007,1008,5,61,0,0,1008, - 1009,3,154,77,0,1009,1010,5,134,0,0,1010,115,1,0,0,0,1011,1012,5, - 68,0,0,1012,1013,3,154,77,0,1013,1014,5,69,0,0,1014,1015,5,70,0, - 0,1015,1016,5,65,0,0,1016,1017,5,51,0,0,1017,1018,3,154,77,0,1018, - 1019,5,67,0,0,1019,1020,5,62,0,0,1020,1021,3,154,77,0,1021,1022, - 5,136,0,0,1022,1023,3,154,77,0,1023,1024,5,134,0,0,1024,117,1,0, - 0,0,1025,1026,5,56,0,0,1026,1027,3,120,60,0,1027,1028,5,58,0,0,1028, - 1031,3,124,62,0,1029,1030,5,34,0,0,1030,1032,3,156,78,0,1031,1029, - 1,0,0,0,1031,1032,1,0,0,0,1032,1033,1,0,0,0,1033,1034,5,134,0,0, - 1034,119,1,0,0,0,1035,1036,3,154,77,0,1036,1037,5,136,0,0,1037,1038, - 3,122,61,0,1038,121,1,0,0,0,1039,1052,3,154,77,0,1040,1052,5,101, - 0,0,1041,1052,5,91,0,0,1042,1052,5,92,0,0,1043,1052,5,1,0,0,1044, - 1052,5,98,0,0,1045,1052,5,99,0,0,1046,1052,5,100,0,0,1047,1052,5, - 102,0,0,1048,1052,5,103,0,0,1049,1052,5,104,0,0,1050,1052,5,105, - 0,0,1051,1039,1,0,0,0,1051,1040,1,0,0,0,1051,1041,1,0,0,0,1051,1042, - 1,0,0,0,1051,1043,1,0,0,0,1051,1044,1,0,0,0,1051,1045,1,0,0,0,1051, - 1046,1,0,0,0,1051,1047,1,0,0,0,1051,1048,1,0,0,0,1051,1049,1,0,0, - 0,1051,1050,1,0,0,0,1052,123,1,0,0,0,1053,1054,5,80,0,0,1054,1055, - 5,136,0,0,1055,1090,3,154,77,0,1056,1057,5,61,0,0,1057,1058,3,154, - 77,0,1058,1059,5,136,0,0,1059,1060,3,128,64,0,1060,1090,1,0,0,0, - 1061,1062,5,62,0,0,1062,1063,3,154,77,0,1063,1064,5,136,0,0,1064, - 1065,3,154,77,0,1065,1066,5,136,0,0,1066,1067,3,130,65,0,1067,1090, - 1,0,0,0,1068,1069,5,44,0,0,1069,1071,3,154,77,0,1070,1072,3,28,14, - 0,1071,1070,1,0,0,0,1071,1072,1,0,0,0,1072,1073,1,0,0,0,1073,1074, - 5,136,0,0,1074,1075,3,120,60,0,1075,1090,1,0,0,0,1076,1077,5,46, - 0,0,1077,1078,3,154,77,0,1078,1079,5,136,0,0,1079,1081,3,154,77, - 0,1080,1082,3,28,14,0,1081,1080,1,0,0,0,1081,1082,1,0,0,0,1082,1084, - 1,0,0,0,1083,1085,3,132,66,0,1084,1083,1,0,0,0,1084,1085,1,0,0,0, - 1085,1087,1,0,0,0,1086,1088,3,126,63,0,1087,1086,1,0,0,0,1087,1088, - 1,0,0,0,1088,1090,1,0,0,0,1089,1053,1,0,0,0,1089,1056,1,0,0,0,1089, - 1061,1,0,0,0,1089,1068,1,0,0,0,1089,1076,1,0,0,0,1090,125,1,0,0, - 0,1091,1092,5,66,0,0,1092,1093,3,132,66,0,1093,127,1,0,0,0,1094, - 1095,7,4,0,0,1095,129,1,0,0,0,1096,1097,7,5,0,0,1097,131,1,0,0,0, - 1098,1099,5,64,0,0,1099,1103,5,137,0,0,1100,1102,3,134,67,0,1101, - 1100,1,0,0,0,1102,1105,1,0,0,0,1103,1101,1,0,0,0,1103,1104,1,0,0, - 0,1104,1106,1,0,0,0,1105,1103,1,0,0,0,1106,1107,5,138,0,0,1107,133, - 1,0,0,0,1108,1109,3,154,77,0,1109,1110,5,58,0,0,1110,1111,5,9,0, - 0,1111,1112,5,23,0,0,1112,1113,5,139,0,0,1113,1114,3,82,41,0,1114, - 1115,5,140,0,0,1115,1116,5,134,0,0,1116,1207,1,0,0,0,1117,1118,3, - 154,77,0,1118,1119,5,58,0,0,1119,1120,5,61,0,0,1120,1127,3,154,77, - 0,1121,1122,5,67,0,0,1122,1123,5,62,0,0,1123,1124,3,154,77,0,1124, - 1125,5,136,0,0,1125,1126,3,154,77,0,1126,1128,1,0,0,0,1127,1121, - 1,0,0,0,1127,1128,1,0,0,0,1128,1129,1,0,0,0,1129,1130,5,134,0,0, - 1130,1207,1,0,0,0,1131,1132,3,154,77,0,1132,1133,5,58,0,0,1133,1134, - 5,62,0,0,1134,1135,3,154,77,0,1135,1136,5,136,0,0,1136,1143,3,154, - 77,0,1137,1138,5,67,0,0,1138,1139,5,62,0,0,1139,1140,3,154,77,0, - 1140,1141,5,136,0,0,1141,1142,3,154,77,0,1142,1144,1,0,0,0,1143, - 1137,1,0,0,0,1143,1144,1,0,0,0,1144,1145,1,0,0,0,1145,1146,5,134, - 0,0,1146,1207,1,0,0,0,1147,1148,3,154,77,0,1148,1149,5,58,0,0,1149, - 1150,5,44,0,0,1150,1152,3,154,77,0,1151,1153,3,28,14,0,1152,1151, - 1,0,0,0,1152,1153,1,0,0,0,1153,1162,1,0,0,0,1154,1155,5,67,0,0,1155, - 1156,5,62,0,0,1156,1157,3,154,77,0,1157,1158,5,136,0,0,1158,1159, - 3,154,77,0,1159,1163,1,0,0,0,1160,1161,5,18,0,0,1161,1163,5,53,0, - 0,1162,1154,1,0,0,0,1162,1160,1,0,0,0,1162,1163,1,0,0,0,1163,1164, - 1,0,0,0,1164,1165,5,134,0,0,1165,1207,1,0,0,0,1166,1167,3,154,77, - 0,1167,1168,5,58,0,0,1168,1169,5,7,0,0,1169,1170,3,154,77,0,1170, - 1171,5,64,0,0,1171,1175,5,137,0,0,1172,1174,3,112,56,0,1173,1172, - 1,0,0,0,1174,1177,1,0,0,0,1175,1173,1,0,0,0,1175,1176,1,0,0,0,1176, - 1178,1,0,0,0,1177,1175,1,0,0,0,1178,1179,5,138,0,0,1179,1180,5,134, - 0,0,1180,1207,1,0,0,0,1181,1182,3,154,77,0,1182,1183,5,58,0,0,1183, - 1184,5,51,0,0,1184,1185,3,154,77,0,1185,1186,5,134,0,0,1186,1207, - 1,0,0,0,1187,1188,3,154,77,0,1188,1190,5,58,0,0,1189,1191,5,9,0, - 0,1190,1189,1,0,0,0,1190,1191,1,0,0,0,1191,1192,1,0,0,0,1192,1193, - 5,22,0,0,1193,1194,3,154,77,0,1194,1195,5,136,0,0,1195,1202,3,154, - 77,0,1196,1197,5,67,0,0,1197,1198,5,62,0,0,1198,1199,3,154,77,0, - 1199,1200,5,136,0,0,1200,1201,3,154,77,0,1201,1203,1,0,0,0,1202, - 1196,1,0,0,0,1202,1203,1,0,0,0,1203,1204,1,0,0,0,1204,1205,5,134, - 0,0,1205,1207,1,0,0,0,1206,1108,1,0,0,0,1206,1117,1,0,0,0,1206,1131, - 1,0,0,0,1206,1147,1,0,0,0,1206,1166,1,0,0,0,1206,1181,1,0,0,0,1206, - 1187,1,0,0,0,1207,135,1,0,0,0,1208,1209,5,51,0,0,1209,1210,3,154, - 77,0,1210,1211,5,58,0,0,1211,1212,3,154,77,0,1212,1213,5,136,0,0, - 1213,1215,3,154,77,0,1214,1216,3,132,66,0,1215,1214,1,0,0,0,1215, - 1216,1,0,0,0,1216,1217,1,0,0,0,1217,1218,5,134,0,0,1218,137,1,0, - 0,0,1219,1266,3,142,71,0,1220,1266,5,113,0,0,1221,1266,5,114,0,0, - 1222,1223,5,115,0,0,1223,1266,3,156,78,0,1224,1225,5,116,0,0,1225, - 1226,5,143,0,0,1226,1227,3,154,77,0,1227,1228,5,144,0,0,1228,1266, - 1,0,0,0,1229,1230,5,117,0,0,1230,1231,5,143,0,0,1231,1233,3,154, - 77,0,1232,1234,3,28,14,0,1233,1232,1,0,0,0,1233,1234,1,0,0,0,1234, - 1235,1,0,0,0,1235,1236,5,144,0,0,1236,1266,1,0,0,0,1237,1238,5,39, - 0,0,1238,1239,5,143,0,0,1239,1240,3,154,77,0,1240,1241,5,144,0,0, - 1241,1266,1,0,0,0,1242,1243,5,118,0,0,1243,1244,5,143,0,0,1244,1245, - 3,138,69,0,1245,1246,5,144,0,0,1246,1266,1,0,0,0,1247,1248,5,119, - 0,0,1248,1249,5,143,0,0,1249,1250,3,138,69,0,1250,1251,5,144,0,0, - 1251,1266,1,0,0,0,1252,1253,5,120,0,0,1253,1257,5,137,0,0,1254,1256, - 3,140,70,0,1255,1254,1,0,0,0,1256,1259,1,0,0,0,1257,1255,1,0,0,0, - 1257,1258,1,0,0,0,1258,1260,1,0,0,0,1259,1257,1,0,0,0,1260,1266, - 5,138,0,0,1261,1263,3,154,77,0,1262,1264,3,28,14,0,1263,1262,1,0, - 0,0,1263,1264,1,0,0,0,1264,1266,1,0,0,0,1265,1219,1,0,0,0,1265,1220, - 1,0,0,0,1265,1221,1,0,0,0,1265,1222,1,0,0,0,1265,1224,1,0,0,0,1265, - 1229,1,0,0,0,1265,1237,1,0,0,0,1265,1242,1,0,0,0,1265,1247,1,0,0, - 0,1265,1252,1,0,0,0,1265,1261,1,0,0,0,1266,139,1,0,0,0,1267,1268, - 3,154,77,0,1268,1269,5,133,0,0,1269,1270,3,138,69,0,1270,1271,5, - 134,0,0,1271,141,1,0,0,0,1272,1273,7,6,0,0,1273,143,1,0,0,0,1274, - 1275,7,7,0,0,1275,145,1,0,0,0,1276,1285,3,156,78,0,1277,1285,5,147, - 0,0,1278,1285,5,148,0,0,1279,1285,5,129,0,0,1280,1285,5,130,0,0, - 1281,1285,5,131,0,0,1282,1285,3,148,74,0,1283,1285,3,152,76,0,1284, - 1276,1,0,0,0,1284,1277,1,0,0,0,1284,1278,1,0,0,0,1284,1279,1,0,0, - 0,1284,1280,1,0,0,0,1284,1281,1,0,0,0,1284,1282,1,0,0,0,1284,1283, - 1,0,0,0,1285,147,1,0,0,0,1286,1295,5,137,0,0,1287,1292,3,150,75, - 0,1288,1289,5,135,0,0,1289,1291,3,150,75,0,1290,1288,1,0,0,0,1291, - 1294,1,0,0,0,1292,1290,1,0,0,0,1292,1293,1,0,0,0,1293,1296,1,0,0, - 0,1294,1292,1,0,0,0,1295,1287,1,0,0,0,1295,1296,1,0,0,0,1296,1297, - 1,0,0,0,1297,1298,5,138,0,0,1298,149,1,0,0,0,1299,1300,3,156,78, - 0,1300,1301,5,133,0,0,1301,1302,3,146,73,0,1302,151,1,0,0,0,1303, - 1312,5,139,0,0,1304,1309,3,146,73,0,1305,1306,5,135,0,0,1306,1308, - 3,146,73,0,1307,1305,1,0,0,0,1308,1311,1,0,0,0,1309,1307,1,0,0,0, - 1309,1310,1,0,0,0,1310,1313,1,0,0,0,1311,1309,1,0,0,0,1312,1304, - 1,0,0,0,1312,1313,1,0,0,0,1313,1314,1,0,0,0,1314,1315,5,140,0,0, - 1315,153,1,0,0,0,1316,1317,7,8,0,0,1317,155,1,0,0,0,1318,1319,5, - 150,0,0,1319,157,1,0,0,0,115,170,177,198,211,223,243,251,258,264, - 276,279,285,296,305,315,318,320,324,332,344,349,358,361,376,382, - 394,403,411,419,432,435,445,449,455,462,468,476,484,497,504,508, - 513,524,530,541,568,574,585,612,639,644,655,658,663,666,673,682, - 685,688,705,714,728,749,752,755,762,770,810,813,817,839,853,861, - 873,887,897,915,919,922,926,929,938,942,946,952,963,970,990,999, - 1031,1051,1071,1081,1084,1087,1089,1103,1127,1143,1152,1162,1175, - 1190,1202,1206,1215,1233,1257,1263,1265,1284,1292,1295,1309,1312 + 3,69,1170,8,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,3,69,1179,8,69, + 1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,3,69,1189,8,69,1,69,1,69, + 1,69,1,69,1,69,1,69,1,69,1,69,1,69,5,69,1200,8,69,10,69,12,69,1203, + 9,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69, + 3,69,1217,8,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69, + 3,69,1229,8,69,1,69,1,69,3,69,1233,8,69,1,70,1,70,1,70,1,70,1,70, + 1,70,1,70,3,70,1242,8,70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71, + 1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,3,71,1260,8,71,1,71,1,71, + 1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71, + 1,71,1,71,1,71,1,71,1,71,5,71,1282,8,71,10,71,12,71,1285,9,71,1, + 71,1,71,1,71,3,71,1290,8,71,3,71,1292,8,71,1,72,1,72,1,72,1,72,1, + 72,1,73,1,73,1,74,1,74,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,3, + 75,1311,8,75,1,76,1,76,1,76,1,76,5,76,1317,8,76,10,76,12,76,1320, + 9,76,3,76,1322,8,76,1,76,1,76,1,77,1,77,1,77,1,77,1,78,1,78,1,78, + 1,78,5,78,1334,8,78,10,78,12,78,1337,9,78,3,78,1339,8,78,1,78,1, + 78,1,79,1,79,1,80,1,80,1,80,0,0,81,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,0,9,2,0,15,15,33,33, + 1,0,11,12,1,0,101,105,3,0,1,1,96,100,102,103,3,0,1,1,96,97,102,103, + 2,0,98,100,102,103,1,0,121,128,1,0,108,111,8,0,1,1,4,8,10,33,45, + 45,74,74,94,95,106,106,149,149,1455,0,174,1,0,0,0,2,176,1,0,0,0, + 4,186,1,0,0,0,6,190,1,0,0,0,8,215,1,0,0,0,10,227,1,0,0,0,12,229, + 1,0,0,0,14,236,1,0,0,0,16,247,1,0,0,0,18,249,1,0,0,0,20,262,1,0, + 0,0,22,294,1,0,0,0,24,324,1,0,0,0,26,326,1,0,0,0,28,330,1,0,0,0, + 30,348,1,0,0,0,32,350,1,0,0,0,34,363,1,0,0,0,36,365,1,0,0,0,38,378, + 1,0,0,0,40,399,1,0,0,0,42,449,1,0,0,0,44,452,1,0,0,0,46,477,1,0, + 0,0,48,514,1,0,0,0,50,525,1,0,0,0,52,530,1,0,0,0,54,558,1,0,0,0, + 56,560,1,0,0,0,58,570,1,0,0,0,60,582,1,0,0,0,62,607,1,0,0,0,64,656, + 1,0,0,0,66,658,1,0,0,0,68,687,1,0,0,0,70,709,1,0,0,0,72,722,1,0, + 0,0,74,724,1,0,0,0,76,736,1,0,0,0,78,749,1,0,0,0,80,752,1,0,0,0, + 82,772,1,0,0,0,84,774,1,0,0,0,86,782,1,0,0,0,88,870,1,0,0,0,90,872, + 1,0,0,0,92,883,1,0,0,0,94,885,1,0,0,0,96,890,1,0,0,0,98,892,1,0, + 0,0,100,914,1,0,0,0,102,916,1,0,0,0,104,925,1,0,0,0,106,950,1,0, + 0,0,108,981,1,0,0,0,110,983,1,0,0,0,112,991,1,0,0,0,114,1016,1,0, + 0,0,116,1018,1,0,0,0,118,1030,1,0,0,0,120,1037,1,0,0,0,122,1051, + 1,0,0,0,124,1061,1,0,0,0,126,1077,1,0,0,0,128,1115,1,0,0,0,130,1117, + 1,0,0,0,132,1120,1,0,0,0,134,1122,1,0,0,0,136,1124,1,0,0,0,138,1232, + 1,0,0,0,140,1234,1,0,0,0,142,1291,1,0,0,0,144,1293,1,0,0,0,146,1298, + 1,0,0,0,148,1300,1,0,0,0,150,1310,1,0,0,0,152,1312,1,0,0,0,154,1325, + 1,0,0,0,156,1329,1,0,0,0,158,1342,1,0,0,0,160,1344,1,0,0,0,162,163, + 3,6,3,0,163,164,5,0,0,1,164,175,1,0,0,0,165,166,3,20,10,0,166,167, + 5,0,0,1,167,175,1,0,0,0,168,169,3,52,26,0,169,170,5,0,0,1,170,175, + 1,0,0,0,171,172,3,2,1,0,172,173,5,0,0,1,173,175,1,0,0,0,174,162, + 1,0,0,0,174,165,1,0,0,0,174,168,1,0,0,0,174,171,1,0,0,0,175,1,1, + 0,0,0,176,177,5,40,0,0,177,181,5,137,0,0,178,180,3,8,4,0,179,178, + 1,0,0,0,180,183,1,0,0,0,181,179,1,0,0,0,181,182,1,0,0,0,182,184, + 1,0,0,0,183,181,1,0,0,0,184,185,5,138,0,0,185,3,1,0,0,0,186,187, + 5,41,0,0,187,188,3,160,80,0,188,189,5,134,0,0,189,5,1,0,0,0,190, + 191,5,9,0,0,191,192,3,158,79,0,192,193,5,84,0,0,193,194,3,160,80, + 0,194,195,5,77,0,0,195,196,3,160,80,0,196,197,5,76,0,0,197,198,3, + 160,80,0,198,202,5,137,0,0,199,201,3,8,4,0,200,199,1,0,0,0,201,204, + 1,0,0,0,202,200,1,0,0,0,202,203,1,0,0,0,203,205,1,0,0,0,204,202, + 1,0,0,0,205,206,5,138,0,0,206,7,1,0,0,0,207,216,3,4,2,0,208,216, + 3,18,9,0,209,216,3,10,5,0,210,216,3,94,47,0,211,216,3,106,53,0,212, + 216,3,140,70,0,213,216,3,58,29,0,214,216,3,32,16,0,215,207,1,0,0, + 0,215,208,1,0,0,0,215,209,1,0,0,0,215,210,1,0,0,0,215,211,1,0,0, + 0,215,212,1,0,0,0,215,213,1,0,0,0,215,214,1,0,0,0,216,9,1,0,0,0, + 217,218,5,41,0,0,218,219,5,44,0,0,219,220,3,158,79,0,220,221,5,134, + 0,0,221,228,1,0,0,0,222,223,5,41,0,0,223,224,5,46,0,0,224,225,3, + 158,79,0,225,226,5,134,0,0,226,228,1,0,0,0,227,217,1,0,0,0,227,222, + 1,0,0,0,228,11,1,0,0,0,229,230,5,42,0,0,230,231,5,43,0,0,231,232, + 3,158,79,0,232,233,5,84,0,0,233,234,3,160,80,0,234,235,5,134,0,0, + 235,13,1,0,0,0,236,237,5,42,0,0,237,238,5,44,0,0,238,239,3,158,79, + 0,239,240,5,77,0,0,240,241,3,160,80,0,241,242,5,134,0,0,242,15,1, + 0,0,0,243,248,3,10,5,0,244,248,3,12,6,0,245,248,3,14,7,0,246,248, + 3,32,16,0,247,243,1,0,0,0,247,244,1,0,0,0,247,245,1,0,0,0,247,246, + 1,0,0,0,248,17,1,0,0,0,249,250,5,43,0,0,250,251,3,158,79,0,251,252, + 5,84,0,0,252,255,3,160,80,0,253,254,5,85,0,0,254,256,3,160,80,0, + 255,253,1,0,0,0,255,256,1,0,0,0,256,257,1,0,0,0,257,258,5,134,0, + 0,258,19,1,0,0,0,259,261,3,16,8,0,260,259,1,0,0,0,261,264,1,0,0, + 0,262,260,1,0,0,0,262,263,1,0,0,0,263,265,1,0,0,0,264,262,1,0,0, + 0,265,266,5,44,0,0,266,268,3,158,79,0,267,269,3,22,11,0,268,267, + 1,0,0,0,268,269,1,0,0,0,269,270,1,0,0,0,270,271,5,84,0,0,271,272, + 3,160,80,0,272,273,5,77,0,0,273,283,3,160,80,0,274,275,5,89,0,0, + 275,280,3,26,13,0,276,277,5,135,0,0,277,279,3,26,13,0,278,276,1, + 0,0,0,279,282,1,0,0,0,280,278,1,0,0,0,280,281,1,0,0,0,281,284,1, + 0,0,0,282,280,1,0,0,0,283,274,1,0,0,0,283,284,1,0,0,0,284,285,1, + 0,0,0,285,289,5,137,0,0,286,288,3,34,17,0,287,286,1,0,0,0,288,291, + 1,0,0,0,289,287,1,0,0,0,289,290,1,0,0,0,290,292,1,0,0,0,291,289, + 1,0,0,0,292,293,5,138,0,0,293,21,1,0,0,0,294,295,5,143,0,0,295,300, + 3,24,12,0,296,297,5,135,0,0,297,299,3,24,12,0,298,296,1,0,0,0,299, + 302,1,0,0,0,300,298,1,0,0,0,300,301,1,0,0,0,301,303,1,0,0,0,302, + 300,1,0,0,0,303,304,5,144,0,0,304,23,1,0,0,0,305,306,5,47,0,0,306, + 309,3,158,79,0,307,308,5,133,0,0,308,310,5,37,0,0,309,307,1,0,0, + 0,309,310,1,0,0,0,310,325,1,0,0,0,311,312,5,36,0,0,312,322,3,158, + 79,0,313,314,5,38,0,0,314,319,3,26,13,0,315,316,5,145,0,0,316,318, + 3,26,13,0,317,315,1,0,0,0,318,321,1,0,0,0,319,317,1,0,0,0,319,320, + 1,0,0,0,320,323,1,0,0,0,321,319,1,0,0,0,322,313,1,0,0,0,322,323, + 1,0,0,0,323,325,1,0,0,0,324,305,1,0,0,0,324,311,1,0,0,0,325,25,1, + 0,0,0,326,328,3,158,79,0,327,329,3,28,14,0,328,327,1,0,0,0,328,329, + 1,0,0,0,329,27,1,0,0,0,330,331,5,143,0,0,331,336,3,30,15,0,332,333, + 5,135,0,0,333,335,3,30,15,0,334,332,1,0,0,0,335,338,1,0,0,0,336, + 334,1,0,0,0,336,337,1,0,0,0,337,339,1,0,0,0,338,336,1,0,0,0,339, + 340,5,144,0,0,340,29,1,0,0,0,341,342,5,43,0,0,342,349,3,158,79,0, + 343,344,5,44,0,0,344,349,3,26,13,0,345,346,5,36,0,0,346,349,3,158, + 79,0,347,349,3,142,71,0,348,341,1,0,0,0,348,343,1,0,0,0,348,345, + 1,0,0,0,348,347,1,0,0,0,349,31,1,0,0,0,350,351,5,35,0,0,351,353, + 3,158,79,0,352,354,3,22,11,0,353,352,1,0,0,0,353,354,1,0,0,0,354, + 355,1,0,0,0,355,356,5,146,0,0,356,357,3,142,71,0,357,358,5,134,0, + 0,358,33,1,0,0,0,359,364,3,40,20,0,360,364,3,44,22,0,361,364,3,38, + 19,0,362,364,3,36,18,0,363,359,1,0,0,0,363,360,1,0,0,0,363,361,1, + 0,0,0,363,362,1,0,0,0,364,35,1,0,0,0,365,366,5,2,0,0,366,367,3,158, + 79,0,367,368,5,84,0,0,368,369,3,160,80,0,369,370,5,3,0,0,370,373, + 3,160,80,0,371,372,5,5,0,0,372,374,3,50,25,0,373,371,1,0,0,0,373, + 374,1,0,0,0,374,375,1,0,0,0,375,376,5,134,0,0,376,37,1,0,0,0,377, + 379,5,57,0,0,378,377,1,0,0,0,378,379,1,0,0,0,379,380,1,0,0,0,380, + 381,5,49,0,0,381,382,3,158,79,0,382,383,5,84,0,0,383,384,3,160,80, + 0,384,385,5,133,0,0,385,386,3,142,71,0,386,387,5,132,0,0,387,388, + 3,142,71,0,388,389,5,137,0,0,389,390,5,101,0,0,390,391,5,84,0,0, + 391,393,3,160,80,0,392,394,3,72,36,0,393,392,1,0,0,0,393,394,1,0, + 0,0,394,395,1,0,0,0,395,396,5,134,0,0,396,397,5,138,0,0,397,39,1, + 0,0,0,398,400,3,46,23,0,399,398,1,0,0,0,399,400,1,0,0,0,400,401, + 1,0,0,0,401,402,5,47,0,0,402,403,3,158,79,0,403,404,5,84,0,0,404, + 405,3,160,80,0,405,406,5,133,0,0,406,407,3,142,71,0,407,411,5,137, + 0,0,408,410,3,42,21,0,409,408,1,0,0,0,410,413,1,0,0,0,411,409,1, + 0,0,0,411,412,1,0,0,0,412,414,1,0,0,0,413,411,1,0,0,0,414,415,5, + 138,0,0,415,41,1,0,0,0,416,417,5,91,0,0,417,418,5,84,0,0,418,420, + 3,160,80,0,419,421,3,72,36,0,420,419,1,0,0,0,420,421,1,0,0,0,421, + 422,1,0,0,0,422,423,5,134,0,0,423,450,1,0,0,0,424,425,5,92,0,0,425, + 426,5,84,0,0,426,428,3,160,80,0,427,429,3,72,36,0,428,427,1,0,0, + 0,428,429,1,0,0,0,429,430,1,0,0,0,430,431,5,134,0,0,431,450,1,0, + 0,0,432,433,5,1,0,0,433,434,5,84,0,0,434,436,3,160,80,0,435,437, + 3,72,36,0,436,435,1,0,0,0,436,437,1,0,0,0,437,438,1,0,0,0,438,439, + 5,134,0,0,439,450,1,0,0,0,440,441,5,93,0,0,441,442,5,94,0,0,442, + 443,5,84,0,0,443,444,3,160,80,0,444,445,5,95,0,0,445,446,5,84,0, + 0,446,447,3,160,80,0,447,448,5,134,0,0,448,450,1,0,0,0,449,416,1, + 0,0,0,449,424,1,0,0,0,449,432,1,0,0,0,449,440,1,0,0,0,450,43,1,0, + 0,0,451,453,3,46,23,0,452,451,1,0,0,0,452,453,1,0,0,0,453,454,1, + 0,0,0,454,455,5,48,0,0,455,456,3,158,79,0,456,457,5,84,0,0,457,458, + 3,160,80,0,458,459,5,133,0,0,459,460,3,148,74,0,460,462,3,50,25, + 0,461,463,5,112,0,0,462,461,1,0,0,0,462,463,1,0,0,0,463,466,1,0, + 0,0,464,465,5,82,0,0,465,467,3,160,80,0,466,464,1,0,0,0,466,467, + 1,0,0,0,467,468,1,0,0,0,468,472,5,137,0,0,469,471,3,48,24,0,470, + 469,1,0,0,0,471,474,1,0,0,0,472,470,1,0,0,0,472,473,1,0,0,0,473, + 475,1,0,0,0,474,472,1,0,0,0,475,476,5,138,0,0,476,45,1,0,0,0,477, + 479,5,32,0,0,478,480,7,0,0,0,479,478,1,0,0,0,479,480,1,0,0,0,480, + 47,1,0,0,0,481,482,5,98,0,0,482,483,5,84,0,0,483,485,3,160,80,0, + 484,486,3,72,36,0,485,484,1,0,0,0,485,486,1,0,0,0,486,487,1,0,0, + 0,487,488,5,134,0,0,488,515,1,0,0,0,489,490,5,99,0,0,490,491,5,84, + 0,0,491,493,3,160,80,0,492,494,3,72,36,0,493,492,1,0,0,0,493,494, + 1,0,0,0,494,495,1,0,0,0,495,496,5,134,0,0,496,515,1,0,0,0,497,498, + 5,100,0,0,498,499,5,84,0,0,499,501,3,160,80,0,500,502,3,72,36,0, + 501,500,1,0,0,0,501,502,1,0,0,0,502,503,1,0,0,0,503,504,5,134,0, + 0,504,515,1,0,0,0,505,506,5,93,0,0,506,507,5,94,0,0,507,508,5,84, + 0,0,508,509,3,160,80,0,509,510,5,95,0,0,510,511,5,84,0,0,511,512, + 3,160,80,0,512,513,5,134,0,0,513,515,1,0,0,0,514,481,1,0,0,0,514, + 489,1,0,0,0,514,497,1,0,0,0,514,505,1,0,0,0,515,49,1,0,0,0,516,517, + 5,43,0,0,517,526,3,158,79,0,518,519,5,44,0,0,519,521,3,158,79,0, + 520,522,3,28,14,0,521,520,1,0,0,0,521,522,1,0,0,0,522,526,1,0,0, + 0,523,524,5,36,0,0,524,526,3,158,79,0,525,516,1,0,0,0,525,518,1, + 0,0,0,525,523,1,0,0,0,526,51,1,0,0,0,527,529,3,16,8,0,528,527,1, + 0,0,0,529,532,1,0,0,0,530,528,1,0,0,0,530,531,1,0,0,0,531,533,1, + 0,0,0,532,530,1,0,0,0,533,534,5,46,0,0,534,535,3,158,79,0,535,536, + 5,84,0,0,536,537,3,160,80,0,537,538,5,77,0,0,538,541,3,160,80,0, + 539,540,5,78,0,0,540,542,5,147,0,0,541,539,1,0,0,0,541,542,1,0,0, + 0,542,543,1,0,0,0,543,547,5,137,0,0,544,546,3,54,27,0,545,544,1, + 0,0,0,546,549,1,0,0,0,547,545,1,0,0,0,547,548,1,0,0,0,548,550,1, + 0,0,0,549,547,1,0,0,0,550,551,5,138,0,0,551,53,1,0,0,0,552,559,3, + 66,33,0,553,559,3,68,34,0,554,559,3,76,38,0,555,559,3,60,30,0,556, + 559,3,62,31,0,557,559,3,56,28,0,558,552,1,0,0,0,558,553,1,0,0,0, + 558,554,1,0,0,0,558,555,1,0,0,0,558,556,1,0,0,0,558,557,1,0,0,0, + 559,55,1,0,0,0,560,561,5,2,0,0,561,562,3,158,79,0,562,563,5,84,0, + 0,563,564,3,160,80,0,564,565,5,38,0,0,565,566,3,26,13,0,566,567, + 5,136,0,0,567,568,3,158,79,0,568,569,5,134,0,0,569,57,1,0,0,0,570, + 571,5,4,0,0,571,572,3,158,79,0,572,573,5,84,0,0,573,574,3,160,80, + 0,574,575,5,6,0,0,575,576,3,26,13,0,576,577,5,65,0,0,577,578,3,158, + 79,0,578,579,5,136,0,0,579,580,3,158,79,0,580,581,5,134,0,0,581, + 59,1,0,0,0,582,583,5,22,0,0,583,585,3,158,79,0,584,586,3,22,11,0, + 585,584,1,0,0,0,585,586,1,0,0,0,586,587,1,0,0,0,587,588,5,84,0,0, + 588,589,3,160,80,0,589,591,5,25,0,0,590,592,5,9,0,0,591,590,1,0, + 0,0,591,592,1,0,0,0,592,593,1,0,0,0,593,594,3,26,13,0,594,595,5, + 26,0,0,595,596,3,160,80,0,596,597,5,49,0,0,597,598,3,160,80,0,598, + 602,5,137,0,0,599,601,3,64,32,0,600,599,1,0,0,0,601,604,1,0,0,0, + 602,600,1,0,0,0,602,603,1,0,0,0,603,605,1,0,0,0,604,602,1,0,0,0, + 605,606,5,138,0,0,606,61,1,0,0,0,607,608,5,22,0,0,608,609,3,158, + 79,0,609,610,5,84,0,0,610,611,3,160,80,0,611,612,5,24,0,0,612,613, + 3,158,79,0,613,614,3,28,14,0,614,615,5,134,0,0,615,63,1,0,0,0,616, + 617,5,16,0,0,617,657,5,134,0,0,618,619,5,17,0,0,619,620,5,18,0,0, + 620,621,3,158,79,0,621,622,5,134,0,0,622,657,1,0,0,0,623,624,5,27, + 0,0,624,625,3,160,80,0,625,626,5,134,0,0,626,657,1,0,0,0,627,629, + 5,28,0,0,628,630,5,36,0,0,629,628,1,0,0,0,629,630,1,0,0,0,630,631, + 1,0,0,0,631,632,3,158,79,0,632,633,5,55,0,0,633,634,3,26,13,0,634, + 635,5,134,0,0,635,657,1,0,0,0,636,637,5,29,0,0,637,638,3,158,79, + 0,638,639,5,147,0,0,639,640,5,134,0,0,640,657,1,0,0,0,641,642,5, + 30,0,0,642,643,3,26,13,0,643,644,5,136,0,0,644,645,3,158,79,0,645, + 646,3,158,79,0,646,647,3,160,80,0,647,648,5,134,0,0,648,657,1,0, + 0,0,649,650,5,93,0,0,650,657,5,134,0,0,651,652,5,31,0,0,652,653, + 5,147,0,0,653,654,3,160,80,0,654,655,5,134,0,0,655,657,1,0,0,0,656, + 616,1,0,0,0,656,618,1,0,0,0,656,623,1,0,0,0,656,627,1,0,0,0,656, + 636,1,0,0,0,656,641,1,0,0,0,656,649,1,0,0,0,656,651,1,0,0,0,657, + 65,1,0,0,0,658,659,5,49,0,0,659,661,3,158,79,0,660,662,3,22,11,0, + 661,660,1,0,0,0,661,662,1,0,0,0,662,663,1,0,0,0,663,664,5,84,0,0, + 664,665,3,160,80,0,665,666,5,133,0,0,666,667,3,142,71,0,667,668, + 5,132,0,0,668,669,3,142,71,0,669,670,5,86,0,0,670,672,3,80,40,0, + 671,673,3,72,36,0,672,671,1,0,0,0,672,673,1,0,0,0,673,675,1,0,0, + 0,674,676,3,78,39,0,675,674,1,0,0,0,675,676,1,0,0,0,676,677,1,0, + 0,0,677,678,5,88,0,0,678,680,3,82,41,0,679,681,3,86,43,0,680,679, + 1,0,0,0,680,681,1,0,0,0,681,683,1,0,0,0,682,684,3,70,35,0,683,682, + 1,0,0,0,683,684,1,0,0,0,684,685,1,0,0,0,685,686,5,134,0,0,686,67, + 1,0,0,0,687,688,5,50,0,0,688,690,3,158,79,0,689,691,3,22,11,0,690, + 689,1,0,0,0,690,691,1,0,0,0,691,692,1,0,0,0,692,693,5,84,0,0,693, + 694,3,160,80,0,694,695,5,133,0,0,695,696,3,142,71,0,696,697,5,132, + 0,0,697,699,3,142,71,0,698,700,3,72,36,0,699,698,1,0,0,0,699,700, + 1,0,0,0,700,702,1,0,0,0,701,703,3,86,43,0,702,701,1,0,0,0,702,703, + 1,0,0,0,703,705,1,0,0,0,704,706,3,70,35,0,705,704,1,0,0,0,705,706, + 1,0,0,0,706,707,1,0,0,0,707,708,5,134,0,0,708,69,1,0,0,0,709,710, + 5,66,0,0,710,711,5,65,0,0,711,712,3,158,79,0,712,71,1,0,0,0,713, + 714,5,10,0,0,714,723,5,13,0,0,715,716,5,10,0,0,716,717,7,1,0,0,717, + 718,5,14,0,0,718,719,5,139,0,0,719,720,3,84,42,0,720,721,5,140,0, + 0,721,723,1,0,0,0,722,713,1,0,0,0,722,715,1,0,0,0,723,73,1,0,0,0, + 724,725,5,65,0,0,725,726,5,139,0,0,726,731,3,124,62,0,727,728,5, + 135,0,0,728,730,3,124,62,0,729,727,1,0,0,0,730,733,1,0,0,0,731,729, + 1,0,0,0,731,732,1,0,0,0,732,734,1,0,0,0,733,731,1,0,0,0,734,735, + 5,140,0,0,735,75,1,0,0,0,736,737,5,51,0,0,737,738,3,158,79,0,738, + 739,5,84,0,0,739,740,3,160,80,0,740,741,5,52,0,0,741,742,3,158,79, + 0,742,743,5,133,0,0,743,745,3,142,71,0,744,746,3,86,43,0,745,744, + 1,0,0,0,745,746,1,0,0,0,746,747,1,0,0,0,747,748,5,134,0,0,748,77, + 1,0,0,0,749,750,5,87,0,0,750,751,3,142,71,0,751,79,1,0,0,0,752,753, + 7,2,0,0,753,81,1,0,0,0,754,773,5,90,0,0,755,756,5,43,0,0,756,773, + 3,158,79,0,757,758,5,36,0,0,758,773,3,158,79,0,759,760,5,45,0,0, + 760,769,5,139,0,0,761,766,3,26,13,0,762,763,5,135,0,0,763,765,3, + 26,13,0,764,762,1,0,0,0,765,768,1,0,0,0,766,764,1,0,0,0,766,767, + 1,0,0,0,767,770,1,0,0,0,768,766,1,0,0,0,769,761,1,0,0,0,769,770, + 1,0,0,0,770,771,1,0,0,0,771,773,5,140,0,0,772,754,1,0,0,0,772,755, + 1,0,0,0,772,757,1,0,0,0,772,759,1,0,0,0,773,83,1,0,0,0,774,779,3, + 158,79,0,775,776,5,135,0,0,776,778,3,158,79,0,777,775,1,0,0,0,778, + 781,1,0,0,0,779,777,1,0,0,0,779,780,1,0,0,0,780,85,1,0,0,0,781,779, + 1,0,0,0,782,783,5,89,0,0,783,787,5,137,0,0,784,786,3,88,44,0,785, + 784,1,0,0,0,786,789,1,0,0,0,787,785,1,0,0,0,787,788,1,0,0,0,788, + 790,1,0,0,0,789,787,1,0,0,0,790,791,5,138,0,0,791,87,1,0,0,0,792, + 793,5,23,0,0,793,794,3,158,79,0,794,795,5,84,0,0,795,796,3,160,80, + 0,796,797,5,139,0,0,797,798,3,84,42,0,798,799,5,140,0,0,799,800, + 5,134,0,0,800,871,1,0,0,0,801,802,5,61,0,0,802,803,3,158,79,0,803, + 804,5,84,0,0,804,805,3,160,80,0,805,806,5,133,0,0,806,807,3,142, + 71,0,807,808,3,90,45,0,808,809,5,134,0,0,809,871,1,0,0,0,810,811, + 5,62,0,0,811,812,3,158,79,0,812,813,5,84,0,0,813,814,3,160,80,0, + 814,815,5,133,0,0,815,816,3,148,74,0,816,817,3,50,25,0,817,818,3, + 90,45,0,818,819,5,134,0,0,819,871,1,0,0,0,820,821,5,44,0,0,821,822, + 3,158,79,0,822,823,5,84,0,0,823,824,3,160,80,0,824,825,5,133,0,0, + 825,827,3,158,79,0,826,828,3,28,14,0,827,826,1,0,0,0,827,828,1,0, + 0,0,828,830,1,0,0,0,829,831,3,74,37,0,830,829,1,0,0,0,830,831,1, + 0,0,0,831,834,1,0,0,0,832,833,5,18,0,0,833,835,5,53,0,0,834,832, + 1,0,0,0,834,835,1,0,0,0,835,836,1,0,0,0,836,837,5,134,0,0,837,871, + 1,0,0,0,838,839,5,7,0,0,839,840,3,158,79,0,840,841,5,84,0,0,841, + 842,3,160,80,0,842,843,5,133,0,0,843,844,3,158,79,0,844,845,5,53, + 0,0,845,846,3,142,71,0,846,847,5,134,0,0,847,871,1,0,0,0,848,849, + 5,51,0,0,849,850,3,158,79,0,850,851,5,84,0,0,851,852,3,160,80,0, + 852,853,5,133,0,0,853,856,3,158,79,0,854,855,5,53,0,0,855,857,3, + 142,71,0,856,854,1,0,0,0,856,857,1,0,0,0,857,858,1,0,0,0,858,859, + 5,134,0,0,859,871,1,0,0,0,860,861,5,22,0,0,861,862,3,158,79,0,862, + 863,5,84,0,0,863,864,3,160,80,0,864,865,5,133,0,0,865,866,3,158, + 79,0,866,867,5,136,0,0,867,868,3,158,79,0,868,869,5,134,0,0,869, + 871,1,0,0,0,870,792,1,0,0,0,870,801,1,0,0,0,870,810,1,0,0,0,870, + 820,1,0,0,0,870,838,1,0,0,0,870,848,1,0,0,0,870,860,1,0,0,0,871, + 89,1,0,0,0,872,873,5,139,0,0,873,878,3,92,46,0,874,875,5,135,0,0, + 875,877,3,92,46,0,876,874,1,0,0,0,877,880,1,0,0,0,878,876,1,0,0, + 0,878,879,1,0,0,0,879,881,1,0,0,0,880,878,1,0,0,0,881,882,5,140, + 0,0,882,91,1,0,0,0,883,884,7,3,0,0,884,93,1,0,0,0,885,886,5,60,0, + 0,886,887,3,96,48,0,887,95,1,0,0,0,888,891,3,98,49,0,889,891,3,102, + 51,0,890,888,1,0,0,0,890,889,1,0,0,0,891,97,1,0,0,0,892,893,5,61, + 0,0,893,894,3,158,79,0,894,895,5,84,0,0,895,896,3,160,80,0,896,897, + 5,71,0,0,897,898,3,158,79,0,898,899,5,133,0,0,899,900,3,142,71,0, + 900,901,5,72,0,0,901,904,3,100,50,0,902,903,5,73,0,0,903,905,3,150, + 75,0,904,902,1,0,0,0,904,905,1,0,0,0,905,906,1,0,0,0,906,907,5,134, + 0,0,907,99,1,0,0,0,908,915,5,106,0,0,909,910,5,107,0,0,910,911,5, + 141,0,0,911,912,3,142,71,0,912,913,5,142,0,0,913,915,1,0,0,0,914, + 908,1,0,0,0,914,909,1,0,0,0,915,101,1,0,0,0,916,917,5,62,0,0,917, + 918,3,158,79,0,918,919,5,84,0,0,919,920,3,160,80,0,920,921,5,137, + 0,0,921,922,3,104,52,0,922,923,3,104,52,0,923,924,5,138,0,0,924, + 103,1,0,0,0,925,926,3,50,25,0,926,927,5,63,0,0,927,928,3,158,79, + 0,928,929,5,84,0,0,929,930,3,160,80,0,930,932,3,148,74,0,931,933, + 5,112,0,0,932,931,1,0,0,0,932,933,1,0,0,0,933,936,1,0,0,0,934,935, + 5,79,0,0,935,937,3,160,80,0,936,934,1,0,0,0,936,937,1,0,0,0,937, + 939,1,0,0,0,938,940,5,81,0,0,939,938,1,0,0,0,939,940,1,0,0,0,940, + 943,1,0,0,0,941,942,5,82,0,0,942,944,3,160,80,0,943,941,1,0,0,0, + 943,944,1,0,0,0,944,946,1,0,0,0,945,947,5,83,0,0,946,945,1,0,0,0, + 946,947,1,0,0,0,947,948,1,0,0,0,948,949,5,134,0,0,949,105,1,0,0, + 0,950,951,5,54,0,0,951,952,3,158,79,0,952,953,5,55,0,0,953,955,3, + 158,79,0,954,956,3,28,14,0,955,954,1,0,0,0,955,956,1,0,0,0,956,959, + 1,0,0,0,957,958,5,84,0,0,958,960,3,160,80,0,959,957,1,0,0,0,959, + 960,1,0,0,0,960,963,1,0,0,0,961,962,5,78,0,0,962,964,5,147,0,0,963, + 961,1,0,0,0,963,964,1,0,0,0,964,965,1,0,0,0,965,969,5,137,0,0,966, + 968,3,108,54,0,967,966,1,0,0,0,968,971,1,0,0,0,969,967,1,0,0,0,969, + 970,1,0,0,0,970,972,1,0,0,0,971,969,1,0,0,0,972,973,5,138,0,0,973, + 107,1,0,0,0,974,975,5,59,0,0,975,982,3,96,48,0,976,982,3,122,61, + 0,977,982,3,118,59,0,978,982,3,112,56,0,979,982,3,120,60,0,980,982, + 3,110,55,0,981,974,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,109,1,0,0,0,983,984, + 5,56,0,0,984,985,3,158,79,0,985,986,5,58,0,0,986,987,3,158,79,0, + 987,988,5,136,0,0,988,989,3,158,79,0,989,990,5,134,0,0,990,111,1, + 0,0,0,991,992,5,8,0,0,992,996,5,137,0,0,993,995,3,114,57,0,994,993, + 1,0,0,0,995,998,1,0,0,0,996,994,1,0,0,0,996,997,1,0,0,0,997,999, + 1,0,0,0,998,996,1,0,0,0,999,1000,5,138,0,0,1000,1001,5,134,0,0,1001, + 113,1,0,0,0,1002,1003,3,158,79,0,1003,1004,5,58,0,0,1004,1005,5, + 61,0,0,1005,1006,3,158,79,0,1006,1007,5,134,0,0,1007,1017,1,0,0, + 0,1008,1009,3,158,79,0,1009,1010,5,58,0,0,1010,1011,5,62,0,0,1011, + 1012,3,158,79,0,1012,1013,5,136,0,0,1013,1014,3,158,79,0,1014,1015, + 5,134,0,0,1015,1017,1,0,0,0,1016,1002,1,0,0,0,1016,1008,1,0,0,0, + 1017,115,1,0,0,0,1018,1019,3,26,13,0,1019,1020,5,18,0,0,1020,1025, + 5,53,0,0,1021,1022,5,136,0,0,1022,1024,3,158,79,0,1023,1021,1,0, + 0,0,1024,1027,1,0,0,0,1025,1023,1,0,0,0,1025,1026,1,0,0,0,1026,1028, + 1,0,0,0,1027,1025,1,0,0,0,1028,1029,5,134,0,0,1029,117,1,0,0,0,1030, + 1031,5,56,0,0,1031,1032,3,158,79,0,1032,1033,5,58,0,0,1033,1034, + 5,61,0,0,1034,1035,3,158,79,0,1035,1036,5,134,0,0,1036,119,1,0,0, + 0,1037,1038,5,68,0,0,1038,1039,3,158,79,0,1039,1040,5,69,0,0,1040, + 1041,5,70,0,0,1041,1042,5,65,0,0,1042,1043,5,51,0,0,1043,1044,3, + 158,79,0,1044,1045,5,67,0,0,1045,1046,5,62,0,0,1046,1047,3,158,79, + 0,1047,1048,5,136,0,0,1048,1049,3,158,79,0,1049,1050,5,134,0,0,1050, + 121,1,0,0,0,1051,1052,5,56,0,0,1052,1053,3,124,62,0,1053,1054,5, + 58,0,0,1054,1057,3,128,64,0,1055,1056,5,34,0,0,1056,1058,3,160,80, + 0,1057,1055,1,0,0,0,1057,1058,1,0,0,0,1058,1059,1,0,0,0,1059,1060, + 5,134,0,0,1060,123,1,0,0,0,1061,1062,3,158,79,0,1062,1063,5,136, + 0,0,1063,1064,3,126,63,0,1064,125,1,0,0,0,1065,1078,3,158,79,0,1066, + 1078,5,101,0,0,1067,1078,5,91,0,0,1068,1078,5,92,0,0,1069,1078,5, + 1,0,0,1070,1078,5,98,0,0,1071,1078,5,99,0,0,1072,1078,5,100,0,0, + 1073,1078,5,102,0,0,1074,1078,5,103,0,0,1075,1078,5,104,0,0,1076, + 1078,5,105,0,0,1077,1065,1,0,0,0,1077,1066,1,0,0,0,1077,1067,1,0, + 0,0,1077,1068,1,0,0,0,1077,1069,1,0,0,0,1077,1070,1,0,0,0,1077,1071, + 1,0,0,0,1077,1072,1,0,0,0,1077,1073,1,0,0,0,1077,1074,1,0,0,0,1077, + 1075,1,0,0,0,1077,1076,1,0,0,0,1078,127,1,0,0,0,1079,1080,5,80,0, + 0,1080,1081,5,136,0,0,1081,1116,3,158,79,0,1082,1083,5,61,0,0,1083, + 1084,3,158,79,0,1084,1085,5,136,0,0,1085,1086,3,132,66,0,1086,1116, + 1,0,0,0,1087,1088,5,62,0,0,1088,1089,3,158,79,0,1089,1090,5,136, + 0,0,1090,1091,3,158,79,0,1091,1092,5,136,0,0,1092,1093,3,134,67, + 0,1093,1116,1,0,0,0,1094,1095,5,44,0,0,1095,1097,3,158,79,0,1096, + 1098,3,28,14,0,1097,1096,1,0,0,0,1097,1098,1,0,0,0,1098,1099,1,0, + 0,0,1099,1100,5,136,0,0,1100,1101,3,124,62,0,1101,1116,1,0,0,0,1102, + 1103,5,46,0,0,1103,1104,3,158,79,0,1104,1105,5,136,0,0,1105,1107, + 3,158,79,0,1106,1108,3,28,14,0,1107,1106,1,0,0,0,1107,1108,1,0,0, + 0,1108,1110,1,0,0,0,1109,1111,3,136,68,0,1110,1109,1,0,0,0,1110, + 1111,1,0,0,0,1111,1113,1,0,0,0,1112,1114,3,130,65,0,1113,1112,1, + 0,0,0,1113,1114,1,0,0,0,1114,1116,1,0,0,0,1115,1079,1,0,0,0,1115, + 1082,1,0,0,0,1115,1087,1,0,0,0,1115,1094,1,0,0,0,1115,1102,1,0,0, + 0,1116,129,1,0,0,0,1117,1118,5,66,0,0,1118,1119,3,136,68,0,1119, + 131,1,0,0,0,1120,1121,7,4,0,0,1121,133,1,0,0,0,1122,1123,7,5,0,0, + 1123,135,1,0,0,0,1124,1125,5,64,0,0,1125,1129,5,137,0,0,1126,1128, + 3,138,69,0,1127,1126,1,0,0,0,1128,1131,1,0,0,0,1129,1127,1,0,0,0, + 1129,1130,1,0,0,0,1130,1132,1,0,0,0,1131,1129,1,0,0,0,1132,1133, + 5,138,0,0,1133,137,1,0,0,0,1134,1135,3,158,79,0,1135,1136,5,58,0, + 0,1136,1137,5,9,0,0,1137,1138,5,23,0,0,1138,1139,5,139,0,0,1139, + 1140,3,84,42,0,1140,1141,5,140,0,0,1141,1142,5,134,0,0,1142,1233, + 1,0,0,0,1143,1144,3,158,79,0,1144,1145,5,58,0,0,1145,1146,5,61,0, + 0,1146,1153,3,158,79,0,1147,1148,5,67,0,0,1148,1149,5,62,0,0,1149, + 1150,3,158,79,0,1150,1151,5,136,0,0,1151,1152,3,158,79,0,1152,1154, + 1,0,0,0,1153,1147,1,0,0,0,1153,1154,1,0,0,0,1154,1155,1,0,0,0,1155, + 1156,5,134,0,0,1156,1233,1,0,0,0,1157,1158,3,158,79,0,1158,1159, + 5,58,0,0,1159,1160,5,62,0,0,1160,1161,3,158,79,0,1161,1162,5,136, + 0,0,1162,1169,3,158,79,0,1163,1164,5,67,0,0,1164,1165,5,62,0,0,1165, + 1166,3,158,79,0,1166,1167,5,136,0,0,1167,1168,3,158,79,0,1168,1170, + 1,0,0,0,1169,1163,1,0,0,0,1169,1170,1,0,0,0,1170,1171,1,0,0,0,1171, + 1172,5,134,0,0,1172,1233,1,0,0,0,1173,1174,3,158,79,0,1174,1175, + 5,58,0,0,1175,1176,5,44,0,0,1176,1178,3,158,79,0,1177,1179,3,28, + 14,0,1178,1177,1,0,0,0,1178,1179,1,0,0,0,1179,1188,1,0,0,0,1180, + 1181,5,67,0,0,1181,1182,5,62,0,0,1182,1183,3,158,79,0,1183,1184, + 5,136,0,0,1184,1185,3,158,79,0,1185,1189,1,0,0,0,1186,1187,5,18, + 0,0,1187,1189,5,53,0,0,1188,1180,1,0,0,0,1188,1186,1,0,0,0,1188, + 1189,1,0,0,0,1189,1190,1,0,0,0,1190,1191,5,134,0,0,1191,1233,1,0, + 0,0,1192,1193,3,158,79,0,1193,1194,5,58,0,0,1194,1195,5,7,0,0,1195, + 1196,3,158,79,0,1196,1197,5,64,0,0,1197,1201,5,137,0,0,1198,1200, + 3,116,58,0,1199,1198,1,0,0,0,1200,1203,1,0,0,0,1201,1199,1,0,0,0, + 1201,1202,1,0,0,0,1202,1204,1,0,0,0,1203,1201,1,0,0,0,1204,1205, + 5,138,0,0,1205,1206,5,134,0,0,1206,1233,1,0,0,0,1207,1208,3,158, + 79,0,1208,1209,5,58,0,0,1209,1210,5,51,0,0,1210,1211,3,158,79,0, + 1211,1212,5,134,0,0,1212,1233,1,0,0,0,1213,1214,3,158,79,0,1214, + 1216,5,58,0,0,1215,1217,5,9,0,0,1216,1215,1,0,0,0,1216,1217,1,0, + 0,0,1217,1218,1,0,0,0,1218,1219,5,22,0,0,1219,1220,3,158,79,0,1220, + 1221,5,136,0,0,1221,1228,3,158,79,0,1222,1223,5,67,0,0,1223,1224, + 5,62,0,0,1224,1225,3,158,79,0,1225,1226,5,136,0,0,1226,1227,3,158, + 79,0,1227,1229,1,0,0,0,1228,1222,1,0,0,0,1228,1229,1,0,0,0,1229, + 1230,1,0,0,0,1230,1231,5,134,0,0,1231,1233,1,0,0,0,1232,1134,1,0, + 0,0,1232,1143,1,0,0,0,1232,1157,1,0,0,0,1232,1173,1,0,0,0,1232,1192, + 1,0,0,0,1232,1207,1,0,0,0,1232,1213,1,0,0,0,1233,139,1,0,0,0,1234, + 1235,5,51,0,0,1235,1236,3,158,79,0,1236,1237,5,58,0,0,1237,1238, + 3,158,79,0,1238,1239,5,136,0,0,1239,1241,3,158,79,0,1240,1242,3, + 136,68,0,1241,1240,1,0,0,0,1241,1242,1,0,0,0,1242,1243,1,0,0,0,1243, + 1244,5,134,0,0,1244,141,1,0,0,0,1245,1292,3,146,73,0,1246,1292,5, + 113,0,0,1247,1292,5,114,0,0,1248,1249,5,115,0,0,1249,1292,3,160, + 80,0,1250,1251,5,116,0,0,1251,1252,5,143,0,0,1252,1253,3,158,79, + 0,1253,1254,5,144,0,0,1254,1292,1,0,0,0,1255,1256,5,117,0,0,1256, + 1257,5,143,0,0,1257,1259,3,158,79,0,1258,1260,3,28,14,0,1259,1258, + 1,0,0,0,1259,1260,1,0,0,0,1260,1261,1,0,0,0,1261,1262,5,144,0,0, + 1262,1292,1,0,0,0,1263,1264,5,39,0,0,1264,1265,5,143,0,0,1265,1266, + 3,158,79,0,1266,1267,5,144,0,0,1267,1292,1,0,0,0,1268,1269,5,118, + 0,0,1269,1270,5,143,0,0,1270,1271,3,142,71,0,1271,1272,5,144,0,0, + 1272,1292,1,0,0,0,1273,1274,5,119,0,0,1274,1275,5,143,0,0,1275,1276, + 3,142,71,0,1276,1277,5,144,0,0,1277,1292,1,0,0,0,1278,1279,5,120, + 0,0,1279,1283,5,137,0,0,1280,1282,3,144,72,0,1281,1280,1,0,0,0,1282, + 1285,1,0,0,0,1283,1281,1,0,0,0,1283,1284,1,0,0,0,1284,1286,1,0,0, + 0,1285,1283,1,0,0,0,1286,1292,5,138,0,0,1287,1289,3,158,79,0,1288, + 1290,3,28,14,0,1289,1288,1,0,0,0,1289,1290,1,0,0,0,1290,1292,1,0, + 0,0,1291,1245,1,0,0,0,1291,1246,1,0,0,0,1291,1247,1,0,0,0,1291,1248, + 1,0,0,0,1291,1250,1,0,0,0,1291,1255,1,0,0,0,1291,1263,1,0,0,0,1291, + 1268,1,0,0,0,1291,1273,1,0,0,0,1291,1278,1,0,0,0,1291,1287,1,0,0, + 0,1292,143,1,0,0,0,1293,1294,3,158,79,0,1294,1295,5,133,0,0,1295, + 1296,3,142,71,0,1296,1297,5,134,0,0,1297,145,1,0,0,0,1298,1299,7, + 6,0,0,1299,147,1,0,0,0,1300,1301,7,7,0,0,1301,149,1,0,0,0,1302,1311, + 3,160,80,0,1303,1311,5,147,0,0,1304,1311,5,148,0,0,1305,1311,5,129, + 0,0,1306,1311,5,130,0,0,1307,1311,5,131,0,0,1308,1311,3,152,76,0, + 1309,1311,3,156,78,0,1310,1302,1,0,0,0,1310,1303,1,0,0,0,1310,1304, + 1,0,0,0,1310,1305,1,0,0,0,1310,1306,1,0,0,0,1310,1307,1,0,0,0,1310, + 1308,1,0,0,0,1310,1309,1,0,0,0,1311,151,1,0,0,0,1312,1321,5,137, + 0,0,1313,1318,3,154,77,0,1314,1315,5,135,0,0,1315,1317,3,154,77, + 0,1316,1314,1,0,0,0,1317,1320,1,0,0,0,1318,1316,1,0,0,0,1318,1319, + 1,0,0,0,1319,1322,1,0,0,0,1320,1318,1,0,0,0,1321,1313,1,0,0,0,1321, + 1322,1,0,0,0,1322,1323,1,0,0,0,1323,1324,5,138,0,0,1324,153,1,0, + 0,0,1325,1326,3,160,80,0,1326,1327,5,133,0,0,1327,1328,3,150,75, + 0,1328,155,1,0,0,0,1329,1338,5,139,0,0,1330,1335,3,150,75,0,1331, + 1332,5,135,0,0,1332,1334,3,150,75,0,1333,1331,1,0,0,0,1334,1337, + 1,0,0,0,1335,1333,1,0,0,0,1335,1336,1,0,0,0,1336,1339,1,0,0,0,1337, + 1335,1,0,0,0,1338,1330,1,0,0,0,1338,1339,1,0,0,0,1339,1340,1,0,0, + 0,1340,1341,5,140,0,0,1341,157,1,0,0,0,1342,1343,7,8,0,0,1343,159, + 1,0,0,0,1344,1345,5,150,0,0,1345,161,1,0,0,0,116,174,181,202,215, + 227,247,255,262,268,280,283,289,300,309,319,322,324,328,336,348, + 353,363,373,378,393,399,411,420,428,436,449,452,462,466,472,479, + 485,493,501,514,521,525,530,541,547,558,585,591,602,629,656,661, + 672,675,680,683,690,699,702,705,722,731,745,766,769,772,779,787, + 827,830,834,856,870,878,890,904,914,932,936,939,943,946,955,959, + 963,969,981,996,1016,1025,1057,1077,1097,1107,1110,1113,1115,1129, + 1153,1169,1178,1188,1201,1216,1228,1232,1241,1259,1283,1289,1291, + 1310,1318,1321,1335,1338 ]; private static __ATN: antlr.ATN; @@ -6418,6 +6525,9 @@ export class InterfaceMemberContext extends antlr.ParserRuleContext { public operationMember(): OperationMemberContext | null { return this.getRuleContext(0, OperationMemberContext); } + public moduleMember(): ModuleMemberContext | null { + return this.getRuleContext(0, ModuleMemberContext); + } public override get ruleIndex(): number { return QuixosCapabilityParser.RULE_interfaceMember; } @@ -6431,6 +6541,53 @@ export class InterfaceMemberContext extends antlr.ParserRuleContext { } +export class ModuleMemberContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public MODULE(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.MODULE, 0)!; + } + public identifier(): IdentifierContext { + return this.getRuleContext(0, IdentifierContext)!; + } + public ID(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.ID, 0)!; + } + public stringLiteral(): StringLiteralContext[]; + public stringLiteral(i: number): StringLiteralContext | null; + public stringLiteral(i?: number): StringLiteralContext[] | StringLiteralContext | null { + if (i === undefined) { + return this.getRuleContexts(StringLiteralContext); + } + + return this.getRuleContext(i, StringLiteralContext); + } + public CONTRACT(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.CONTRACT, 0)!; + } + public SEMI(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.SEMI, 0)!; + } + public SUBJECT(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.SUBJECT, 0); + } + public targetConstraint(): TargetConstraintContext | null { + return this.getRuleContext(0, TargetConstraintContext); + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_moduleMember; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitModuleMember) { + return visitor.visitModuleMember(this); + } else { + return visitor.visitChildren(this); + } + } +} + + export class OperationMemberContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); @@ -6889,8 +7046,8 @@ export class PackageExportContext extends antlr.ParserRuleContext { public packageQuerySpecialization(): PackageQuerySpecializationContext | null { return this.getRuleContext(0, PackageQuerySpecializationContext); } - public componentDecl(): ComponentDeclContext | null { - return this.getRuleContext(0, ComponentDeclContext); + public moduleExport(): ModuleExportContext | null { + return this.getRuleContext(0, ModuleExportContext); } public override get ruleIndex(): number { return QuixosCapabilityParser.RULE_packageExport; @@ -6905,12 +7062,12 @@ export class PackageExportContext extends antlr.ParserRuleContext { } -export class ComponentDeclContext extends antlr.ParserRuleContext { +export class ModuleExportContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); } - public COMPONENT(): antlr.TerminalNode { - return this.getToken(QuixosCapabilityParser.COMPONENT, 0)!; + public MODULE(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.MODULE, 0)!; } public identifier(): IdentifierContext[]; public identifier(i: number): IdentifierContext | null; @@ -6927,24 +7084,24 @@ export class ComponentDeclContext extends antlr.ParserRuleContext { public stringLiteral(): StringLiteralContext { return this.getRuleContext(0, StringLiteralContext)!; } - public SUBJECT(): antlr.TerminalNode { - return this.getToken(QuixosCapabilityParser.SUBJECT, 0)!; + public IMPLEMENTS(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.IMPLEMENTS, 0)!; } public interfaceType(): InterfaceTypeContext { return this.getRuleContext(0, InterfaceTypeContext)!; } - public RUNTIME(): antlr.TerminalNode { - return this.getToken(QuixosCapabilityParser.RUNTIME, 0)!; + public DOT(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.DOT, 0)!; } public SEMI(): antlr.TerminalNode { return this.getToken(QuixosCapabilityParser.SEMI, 0)!; } public override get ruleIndex(): number { - return QuixosCapabilityParser.RULE_componentDecl; + return QuixosCapabilityParser.RULE_moduleExport; } public override accept(visitor: QuixosCapabilityVisitor): Result | null { - if (visitor.visitComponentDecl) { - return visitor.visitComponentDecl(this); + if (visitor.visitModuleExport) { + return visitor.visitModuleExport(this); } else { return visitor.visitChildren(this); } @@ -8164,6 +8321,9 @@ export class ConformanceItemContext extends antlr.ParserRuleContext { public relationshipMaterializationDecl(): RelationshipMaterializationDeclContext | null { return this.getRuleContext(0, RelationshipMaterializationDeclContext); } + public moduleBindingDecl(): ModuleBindingDeclContext | null { + return this.getRuleContext(0, ModuleBindingDeclContext); + } public override get ruleIndex(): number { return QuixosCapabilityParser.RULE_conformanceItem; } @@ -8177,6 +8337,44 @@ export class ConformanceItemContext extends antlr.ParserRuleContext { } +export class ModuleBindingDeclContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public BIND(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.BIND, 0)!; + } + public identifier(): IdentifierContext[]; + public identifier(i: number): IdentifierContext | null; + public identifier(i?: number): IdentifierContext[] | IdentifierContext | null { + if (i === undefined) { + return this.getRuleContexts(IdentifierContext); + } + + return this.getRuleContext(i, IdentifierContext); + } + public TO(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.TO, 0)!; + } + public DOT(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.DOT, 0)!; + } + public SEMI(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.SEMI, 0)!; + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_moduleBindingDecl; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitModuleBindingDecl) { + return visitor.visitModuleBindingDecl(this); + } else { + return visitor.visitChildren(this); + } + } +} + + export class InitializationDeclContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); @@ -9283,18 +9481,12 @@ export class IdentifierContext extends antlr.ParserRuleContext { public DEADLINE_MS(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.DEADLINE_MS, 0); } - public COMPONENT(): antlr.TerminalNode | null { - return this.getToken(QuixosCapabilityParser.COMPONENT, 0); - } public PRESENTATION(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.PRESENTATION, 0); } public SUBJECT(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.SUBJECT, 0); } - public RUNTIME(): antlr.TerminalNode | null { - return this.getToken(QuixosCapabilityParser.RUNTIME, 0); - } public FOR(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.FOR, 0); } diff --git a/src/capability-language/generated/QuixosCapabilityVisitor.ts b/src/capability-language/generated/QuixosCapabilityVisitor.ts index 7be9723..6b534a2 100644 --- a/src/capability-language/generated/QuixosCapabilityVisitor.ts +++ b/src/capability-language/generated/QuixosCapabilityVisitor.ts @@ -20,6 +20,7 @@ import { TypeArgumentsContext } from "./QuixosCapabilityParser.js"; import { TypeArgumentContext } from "./QuixosCapabilityParser.js"; import { TypeAliasDeclContext } from "./QuixosCapabilityParser.js"; import { InterfaceMemberContext } from "./QuixosCapabilityParser.js"; +import { ModuleMemberContext } from "./QuixosCapabilityParser.js"; import { OperationMemberContext } from "./QuixosCapabilityParser.js"; import { ValueMemberContext } from "./QuixosCapabilityParser.js"; import { ValueMemberOperationContext } from "./QuixosCapabilityParser.js"; @@ -29,7 +30,7 @@ import { RelationshipOperationContext } from "./QuixosCapabilityParser.js"; import { TargetConstraintContext } from "./QuixosCapabilityParser.js"; import { PackageResourceDeclContext } from "./QuixosCapabilityParser.js"; import { PackageExportContext } from "./QuixosCapabilityParser.js"; -import { ComponentDeclContext } from "./QuixosCapabilityParser.js"; +import { ModuleExportContext } from "./QuixosCapabilityParser.js"; import { PresentationDeclContext } from "./QuixosCapabilityParser.js"; import { PackageQueryContext } from "./QuixosCapabilityParser.js"; import { PackageQuerySpecializationContext } from "./QuixosCapabilityParser.js"; @@ -56,6 +57,7 @@ import { EdgeDeclContext } from "./QuixosCapabilityParser.js"; import { EdgeEndpointContext } from "./QuixosCapabilityParser.js"; import { ConformanceDeclContext } from "./QuixosCapabilityParser.js"; import { ConformanceItemContext } from "./QuixosCapabilityParser.js"; +import { ModuleBindingDeclContext } from "./QuixosCapabilityParser.js"; import { InitializationDeclContext } from "./QuixosCapabilityParser.js"; import { InitializationFieldContext } from "./QuixosCapabilityParser.js"; import { CreationOwnerMappingContext } from "./QuixosCapabilityParser.js"; @@ -199,6 +201,12 @@ export class QuixosCapabilityVisitor extends AbstractParseTreeVisitor Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.moduleMember`. + * @param ctx the parse tree + * @return the visitor result + */ + visitModuleMember?: (ctx: ModuleMemberContext) => Result; /** * Visit a parse tree produced by `QuixosCapabilityParser.operationMember`. * @param ctx the parse tree @@ -254,11 +262,11 @@ export class QuixosCapabilityVisitor extends AbstractParseTreeVisitor Result; /** - * Visit a parse tree produced by `QuixosCapabilityParser.componentDecl`. + * Visit a parse tree produced by `QuixosCapabilityParser.moduleExport`. * @param ctx the parse tree * @return the visitor result */ - visitComponentDecl?: (ctx: ComponentDeclContext) => Result; + visitModuleExport?: (ctx: ModuleExportContext) => Result; /** * Visit a parse tree produced by `QuixosCapabilityParser.presentationDecl`. * @param ctx the parse tree @@ -415,6 +423,12 @@ export class QuixosCapabilityVisitor extends AbstractParseTreeVisitor Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.moduleBindingDecl`. + * @param ctx the parse tree + * @return the visitor result + */ + visitModuleBindingDecl?: (ctx: ModuleBindingDeclContext) => Result; /** * Visit a parse tree produced by `QuixosCapabilityParser.initializationDecl`. * @param ctx the parse tree diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index 8cf297b..cfaf479 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -642,7 +642,19 @@ const lowerInterface = ( source: SourceRevision, ): InterfaceRevision => { const alias = identifier(context.identifier()); - const members = context.interfaceMember().flatMap((entry) => { + const members = context.interfaceMember().flatMap((entry) => { + const module = entry.moduleMember(); + if (module) + return [ + { + kind: "module" as const, + id: capabilityId.member(stringValue(module.stringLiteral(0))), + displayName: identifier(module.identifier()), + contract: stringValue(module.stringLiteral(1)), + ...(module.targetConstraint() ? { subject: state.types.target(module.targetConstraint()!) } : {}), + operations: [], + }, + ]; const value = entry.valueMember(); if (value) { return [lowerValueMember(state, value)]; @@ -745,6 +757,16 @@ const lowerInterfaceTemplate = ( const members: InterfaceMember[] = context .interfaceMember() .map((entry) => { + const module = entry.moduleMember(); + if (module) + return { + kind: "module" as const, + id: capabilityId.member(stringValue(module.stringLiteral(0))), + displayName: identifier(module.identifier()), + contract: stringValue(module.stringLiteral(1)), + ...(module.targetConstraint() ? { subject: types.targetExpression(module.targetConstraint()!) } : {}), + operations: [], + }; const value = entry.valueMember(); if (value) { const type = types.expression(value.valueType()); @@ -1333,23 +1355,26 @@ const lowerPackage = ( }), ); const genericExports: GenericPackageExport[] = []; - const components: NonNullable = []; + const modules: NonNullable = []; const queries: QueryDeclaration[] = []; const queryTemplates: QueryTemplate[] = []; const exports = context.packageExport().flatMap((exportContext): PackageExport[] => { - const component = exportContext.componentDecl(); - if (component) { - const runtime = identifier(component.identifier(1)); - if (runtime !== "react") - loweringIssue(state, component, "unsupported-component-runtime", `Unsupported component runtime ${runtime}`); - components.push({ - id: stringValue(component.stringLiteral()), - displayName: identifier(component.identifier(0)), - subject: new TypeSubstitution(state.types.environment()).application( - state.types.interface(component.interfaceType()), - ), - runtime: "react", - }); + const module = exportContext.moduleExport(); + if (module) { + const interfaceRevisionId = new TypeSubstitution(state.types.environment()).application( + state.types.interface(module.interfaceType()), + ); + const contract = state.types.definitions.get(interfaceRevisionId); + const member = contract?.members.find((m) => m.displayName === identifier(module.identifier(1))); + if (member?.kind !== "module") + loweringIssue(state, module, "invalid-module-export", "Module export must implement an imported module member"); + else + modules.push({ + id: stringValue(module.stringLiteral()), + displayName: identifier(module.identifier(0)), + interfaceRevisionId, + memberId: member.id, + }); return []; } if (exportContext.packageQuerySpecialization()) return []; @@ -1611,7 +1636,7 @@ const lowerPackage = ( displayName: alias, source, exports, - ...(components.length ? { components } : {}), + ...(modules.length ? { modules } : {}), ...(queries.length ? { queries } : {}), ...(queryTemplates.length ? { queryTemplates } : {}), ...(queries.some((query) => query.argumentRequirements?.length) @@ -1931,6 +1956,25 @@ const lowerConformance = ( state.types.self = previousSelf; } } + const moduleBindings: NonNullable = []; + for (const item of context.conformanceItem()) { + const binding = item.moduleBindingDecl(); + if (!binding) continue; + const memberName = identifier(binding.identifier(0)); + const member = interfaceSymbol.definition?.members.find((m) => m.displayName === memberName); + const pkg = requireSymbol(state, state.packages, identifier(binding.identifier(1)), binding, "package"); + const module = pkg?.definition?.modules?.find((m) => m.displayName === identifier(binding.identifier(2))); + if (member?.kind !== "module" || !module || !pkg) { + loweringIssue( + state, + binding, + "invalid-module-binding", + "Expected a module member bound to an imported module export", + ); + continue; + } + moduleBindings.push({ memberId: member.id, packageRevisionId: pkg.revisionId, moduleId: module.id }); + } const operationBindings = context .conformanceItem() .flatMap((item) => { @@ -2182,6 +2226,7 @@ const lowerConformance = ( ...(context.INTEGER() ? { semanticMajor: Number(context.INTEGER()!.getText()) } : {}), privateAttachments, operationBindings, + ...(moduleBindings.length ? { moduleBindings } : {}), relationshipMaterializations, }; }; @@ -2420,7 +2465,7 @@ const lowerWorkspace = ( const packageName = identifier(presentation.identifier(1)); const componentName = identifier(presentation.identifier(2)); const pkg = requireSymbol(state, state.packages, packageName, presentation, "package"); - const component = pkg?.definition?.components?.find((entry) => entry.displayName === componentName); + const component = pkg?.definition?.modules?.find((entry) => entry.displayName === componentName); if (!component) { loweringIssue(state, presentation, "unknown-component", `Unknown component ${packageName}.${componentName}`); return []; @@ -2692,7 +2737,7 @@ const compileCapabilityResourceSourceInternal = ( externalInterfaces, revision: lowerPackage(state, context, options.source), }; - if (resource.revision.components?.length) { + if (resource.revision.modules?.length) { resource.revision.clientInterfaces = Object.fromEntries( imports.flatMap((entry) => { if (entry.kind !== "interface") return []; diff --git a/src/capability-model/evolution.ts b/src/capability-model/evolution.ts index 0133b80..e3503c5 100644 --- a/src/capability-model/evolution.ts +++ b/src/capability-model/evolution.ts @@ -215,12 +215,17 @@ export const runtimeContracts = (workspace: WorkspaceRevision): RuntimeContract[ atomId: conformance.atomId, interfaceRevisionId: conformance.interfaceRevisionId, operations: sorted(conformance.operationBindings, (entry) => entry.operationId), + ...(conformance.moduleBindings?.length + ? { modules: sorted(conformance.moduleBindings, (entry) => entry.memberId) } + : {}), ...(conformance.initialization ? { initialization: sorted(conformance.initialization, (entry) => entry.input) } : {}), materializations: sorted(conformance.relationshipMaterializations, (entry) => entry.memberId), }); parent.dependencies.add(`interface:${conformance.interfaceRevisionId}`); + for (const module of conformance.moduleBindings ?? []) + parent.dependencies.add(`package:${module.packageRevisionId}`); const contract = workspace.interfaceImports.find((entry) => entry.revisionId === conformance.interfaceRevisionId); for (const required of contract?.requiredInterfaces ?? []) parent.dependencies.add(conformanceKey(conformance.atomId, required)); diff --git a/src/capability-model/execution.ts b/src/capability-model/execution.ts index 0af462e..0fc0dd9 100644 --- a/src/capability-model/execution.ts +++ b/src/capability-model/execution.ts @@ -46,7 +46,7 @@ export function validateExecutionContracts(workspace: WorkspaceRevision): Capabi "Watch lifecycle operations are remote; portable reads use snapshots", ); } - if (member.kind !== "operation" && member.queryRead?.execution === "portable") { + if (member.kind !== "operation" && member.kind !== "module" && member.queryRead?.execution === "portable") { const getter = member.operations.find((o) => o.displayName === (member.kind === "value" ? "get" : "resolve")); if (getter?.execution?.kind !== "snapshot") fail(`${revision.revisionId}/${member.id}`, "Queryable portable members require a snapshot getter"); diff --git a/src/capability-model/generics.ts b/src/capability-model/generics.ts index fa6cca3..8e4501d 100644 --- a/src/capability-model/generics.ts +++ b/src/capability-model/generics.ts @@ -86,6 +86,13 @@ export const instantiateInterface = ( const members: InterfaceMember[] = template.members.map((member) => { const common = { id: member.id, displayName: member.displayName, operations: member.operations.map(operation) }; switch (member.kind) { + case "module": + return { + ...common, + kind: "module", + contract: member.contract, + ...(member.subject ? { subject: substitution.object(member.subject, member.displayName) } : {}), + }; case "value": return { ...common, diff --git a/src/capability-model/index.ts b/src/capability-model/index.ts index 30449d6..5b2da47 100644 --- a/src/capability-model/index.ts +++ b/src/capability-model/index.ts @@ -4,3 +4,4 @@ export * from "./evolution.js"; export * from "./migrations.js"; export * from "./generics.js"; export * from "./generic-packages.js"; +export * from "./modules.js"; diff --git a/src/capability-model/modules.ts b/src/capability-model/modules.ts new file mode 100644 index 0000000..2d7b001 --- /dev/null +++ b/src/capability-model/modules.ts @@ -0,0 +1,82 @@ +import type { InterfaceRevision, ModuleInterfaceMember, PackageModule, WorkspaceRevision } from "./types.js"; +import type { CapabilityValidationIssue } from "./validation.js"; + +/** Public nominal contract lookup; does not resolve an executable artifact or grant access. */ +export function moduleContract( + interfaces: readonly InterfaceRevision[], + module: PackageModule, +): ModuleInterfaceMember | undefined { + const iface = interfaces.find((entry) => entry.revisionId === module.interfaceRevisionId); + if (!iface || iface.template) return undefined; + const member = iface.members.find((entry) => entry.id === module.memberId); + return member?.kind === "module" ? member : undefined; +} + +export function validateModules(workspace: WorkspaceRevision): CapabilityValidationIssue[] { + const issues: CapabilityValidationIssue[] = []; + const fail = (path: string, message: string) => issues.push({ code: "invalid-module-contract", path, message }); + for (const iface of workspace.interfaceImports) { + for (const member of iface.template?.members ?? iface.members) { + if (member.kind !== "module") continue; + const path = `${iface.revisionId}.${member.id}`; + if (!/^[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+\/[1-9][0-9]*$/.test(member.contract)) + fail(path, "Module contracts require a namespaced, versioned identifier"); + if (member.operations.length) fail(path, "A module member cannot declare callable operations"); + } + } + for (const pkg of workspace.packageImports) { + const ids = new Set(pkg.exports.map((entry) => entry.id)); + const names = new Set([ + ...pkg.exports.map((entry) => entry.displayName), + ...(pkg.genericExports ?? []).map((entry) => entry.displayName), + ...(pkg.queries ?? []).map((entry) => entry.displayName), + ...(pkg.queryTemplates ?? []).map((entry) => entry.declaration.displayName), + ]); + for (const module of pkg.modules ?? []) { + const path = `${pkg.revisionId}.${module.id}`; + if (!module.id.trim() || !module.displayName.trim() || ids.has(module.id) || names.has(module.displayName)) + fail(path, "Duplicate or empty module identity or package member name"); + ids.add(module.id); + names.add(module.displayName); + if (!moduleContract(workspace.interfaceImports, module)) + fail(path, "Module export must implement a closed imported module member"); + } + } + for (const conformance of workspace.conformances) { + const iface = workspace.interfaceImports.find((entry) => entry.revisionId === conformance.interfaceRevisionId); + if (!iface) continue; + const bound = new Set(); + for (const binding of conformance.moduleBindings ?? []) { + const path = `${conformance.id ?? conformance.atomId}.${binding.memberId}`; + const member = iface.members.find((entry) => entry.id === binding.memberId); + const pkg = workspace.packageImports.find((entry) => entry.revisionId === binding.packageRevisionId); + const module = pkg?.modules?.find((entry) => entry.id === binding.moduleId); + if (bound.has(binding.memberId)) fail(path, "Module member is bound more than once"); + bound.add(binding.memberId); + if ( + member?.kind !== "module" || + !module || + module.interfaceRevisionId !== iface.revisionId || + module.memberId !== member.id + ) { + fail(path, "Module binding must implement this exact nominal interface member"); + continue; + } + const subject = member.subject; + if ( + subject && + !(subject.kind === "atom" + ? subject.atomId === conformance.atomId + : workspace.conformances.some( + (entry) => + entry.atomId === conformance.atomId && entry.interfaceRevisionId === subject.interfaceRevisionId, + )) + ) + fail(path, "Implementing atom does not satisfy the module subject contract"); + } + for (const member of iface.members) + if (member.kind === "module" && !bound.has(member.id)) + fail(`${conformance.id ?? conformance.atomId}.${member.id}`, "Missing module member binding"); + } + return issues; +} diff --git a/src/capability-model/presentations.ts b/src/capability-model/presentations.ts index 154133e..aed9822 100644 --- a/src/capability-model/presentations.ts +++ b/src/capability-model/presentations.ts @@ -1,5 +1,6 @@ import type { WorkspaceRevision } from "./types.js"; import type { CapabilityValidationIssue } from "./validation.js"; +import { moduleContract } from "./modules.js"; /** Presentation metadata has no graph authority and cannot name arbitrary module URLs. */ export function validatePresentations(workspace: WorkspaceRevision): CapabilityValidationIssue[] { @@ -19,24 +20,6 @@ export function validatePresentations(workspace: WorkspaceRevision): CapabilityV text(alias, `packageImports[${index}].clientInterfaces`); subject(id, `packageImports[${index}].clientInterfaces.${alias}`); } - const ids = new Set(pkg.exports.map((entry) => entry.id as string)); - const names = new Set([ - ...pkg.exports.map((entry) => entry.displayName), - ...(pkg.queries ?? []).map((entry) => entry.displayName), - ...(pkg.queryTemplates ?? []).map((entry) => entry.declaration.displayName), - ...(pkg.genericExports ?? []).map((entry) => entry.displayName), - ]); - for (const [componentIndex, component] of (pkg.components ?? []).entries()) { - const path = `packageImports[${index}].components[${componentIndex}]`; - text(component.id, `${path}.id`); - text(component.displayName, `${path}.displayName`); - if (ids.has(component.id) || names.has(component.displayName)) - fail(path, "Duplicate component identity or package member name"); - ids.add(component.id); - names.add(component.displayName); - subject(component.subject, `${path}.subject`); - if (component.runtime !== "react") fail(`${path}.runtime`, "Unsupported component runtime"); - } } const ids = new Set(), names = new Set(); @@ -49,12 +32,18 @@ export function validatePresentations(workspace: WorkspaceRevision): CapabilityV ids.add(presentation.id); names.add(presentation.displayName); subject(presentation.subject, `${path}.subject`); - const component = packages + const module = packages .get(presentation.packageRevisionId) - ?.components?.find((entry) => entry.id === presentation.componentId); - if (!component) fail(`${path}.componentId`, "Presentation names no installed package component"); - else if (component.subject !== presentation.subject) - fail(`${path}.subject`, `Component requires ${component.subject}, not ${presentation.subject}`); + ?.modules?.find((entry) => entry.id === presentation.componentId); + if (module) { + const contract = moduleContract(workspace.interfaceImports, module); + if (contract?.contract !== "org.quixos.react.subject-only/1") + fail(`${path}.componentId`, "Standalone presentation requires a subject-only module contract"); + if (contract?.subject?.kind !== "interface" || contract.subject.interfaceRevisionId !== presentation.subject) + fail(`${path}.subject`, "Component requires its exact declared subject interface"); + continue; + } + fail(`${path}.componentId`, "Presentation names no installed package component"); } return issues; } diff --git a/src/capability-model/types.ts b/src/capability-model/types.ts index 3cf0f5d..c23f68f 100644 --- a/src/capability-model/types.ts +++ b/src/capability-model/types.ts @@ -163,10 +163,21 @@ export interface OperationInterfaceMember extends InterfaceMem outputType: Type; } +/** A typed code artifact. Module bindings are neither calls nor storage fields. */ +export interface ModuleInterfaceMember< + Type = ValueType, + Target = EdgeEndpointConstraint, +> extends InterfaceMemberBase { + kind: "module"; + contract: string; + subject?: Target; +} + export type InterfaceMember = | ValueInterfaceMember | RelationshipInterfaceMember - | OperationInterfaceMember; + | OperationInterfaceMember + | ModuleInterfaceMember; export interface InterfaceRevision { interfaceId: InterfaceId; @@ -288,12 +299,17 @@ export interface PackageConstructorExport extends PackageExportBase { export type PackageExport = PackageOperationExport | PackageFunctionExport | PackageConstructorExport; -/** A window presentation entry, never a graph operation or service export. */ -export interface PackageComponent { +export interface PackageModule { id: string; displayName: string; - subject: InterfaceRevisionId; - runtime: "react"; + interfaceRevisionId: InterfaceRevisionId; + memberId: MemberId; +} + +export interface ModuleBinding { + memberId: MemberId; + packageRevisionId: PackageRevisionId; + moduleId: string; } export interface WorkspacePresentation { @@ -305,10 +321,10 @@ export interface WorkspacePresentation { } export interface PackageRevision { + modules?: PackageModule[]; /** Closed interface imports exposed to this package's checked component bindings. */ clientInterfaces?: Record; controllers?: PackageController[]; - components?: PackageComponent[]; queries?: import("../query/types.js").QueryDeclaration[]; checkedQueries?: import("../query/types.js").CheckedQuery[]; queryTemplates?: import("../query/types.js").QueryTemplate[]; @@ -427,6 +443,7 @@ export interface InitializationField { } export interface Conformance { + moduleBindings?: ModuleBinding[]; initialization?: InitializationField[]; /** Absent only for legacy assemblies awaiting explicit ownership enrollment. */ id?: ConformanceId; diff --git a/src/capability-model/validation.ts b/src/capability-model/validation.ts index 99563e0..bbf3b46 100644 --- a/src/capability-model/validation.ts +++ b/src/capability-model/validation.ts @@ -1,6 +1,7 @@ import { isStorableType } from "./generics.js"; import { validateInitialization } from "./initialization.js"; import { validatePresentations } from "./presentations.js"; +import { validateModules } from "./modules.js"; import { validateWorkspaceControllers } from "./controllers.js"; import { validateExecutionContracts } from "./execution.js"; import { resolveForwardedBinding, type ConcreteBinding } from "./forwarding.js"; @@ -48,6 +49,7 @@ import { isDeepStrictEqual } from "node:util"; export type CapabilityValidationIssueCode = | "invalid-controller" | "invalid-presentation" + | "invalid-module-contract" | "invalid-initialization" | "invalid-execution-contract" | "invalid-query-contract" @@ -543,7 +545,7 @@ const collectIdentityIndexes = ( memberPath, "Keyed relationships require many cardinality and string, boolean or int64 keys", ); - if (member.kind !== "operation" && member.queryRead) { + if (member.kind !== "operation" && member.kind !== "module" && member.queryRead) { const contract = member.queryRead.execution; const getter = member.kind === "value" ? "get" : "resolve"; if (contract !== "native" && contract !== "rpc-permitted" && contract !== "portable") @@ -841,6 +843,8 @@ const validateInterfaces = ( validateValueType(issues, member.valueType, `${memberPath}.valueType`, indexes); } else if (member.kind === "relationship") { validateConstraint(issues, member.target, `${memberPath}.target`, indexes); + } else if (member.kind === "module") { + if (member.subject) validateConstraint(issues, member.subject, `${memberPath}.subject`, indexes); } else { validateValueType(issues, member.inputType, `${memberPath}.inputType`, indexes); validateValueType(issues, member.outputType, `${memberPath}.outputType`, indexes); @@ -1671,6 +1675,7 @@ const validateConformances = ( ); if ( member.kind !== "operation" && + member.kind !== "module" && member.queryRead && operation.displayName === (member.kind === "value" ? "get" : "resolve") ) { @@ -2224,6 +2229,7 @@ export const validateWorkspaceRevision = (workspace: WorkspaceRevision): Capabil ...validateExecutionContracts(workspace), ...validateInitialization(workspace), ...validatePresentations(workspace), + ...validateModules(workspace), ...validateWorkspaceControllers(workspace), ); return issues; @@ -2504,6 +2510,14 @@ export const computeCapabilityClosure = ( for (const interfaceRevisionId of plan.interfaces.get(root.interfaceRevisionId)?.requiredInterfaces ?? []) { queued.push({ atomId: root.atomId, interfaceRevisionId }); } + for (const module of conformance.source.moduleBindings ?? []) { + packages.add(module.packageRevisionId); + const member = plan.interfaces + .get(root.interfaceRevisionId) + ?.members.find((member) => member.id === module.memberId); + if (member?.kind === "module" && member.subject?.kind === "interface") + queued.push({ atomId: root.atomId, interfaceRevisionId: member.subject.interfaceRevisionId }); + } for (const binding of conformance.operationBindings.values()) { if (binding.kind === "state") { attachments.add(binding.slotId); diff --git a/src/execution-world/artifacts.ts b/src/execution-world/artifacts.ts index 37747bf..3491046 100644 --- a/src/execution-world/artifacts.ts +++ b/src/execution-world/artifacts.ts @@ -39,7 +39,7 @@ export const componentSharedModules = [ export interface ComponentArtifact { id: string; subject: string; - compatibility: "quixos-react-component-v1"; + compatibility: "org.quixos.react.esm/1"; path: string; exportName: string; sharedModules: Record<(typeof componentSharedModules)[number], string>; @@ -171,7 +171,7 @@ function parseComponent(value: unknown, index: number): ComponentArtifact { [], path, ); - if (entry.compatibility !== "quixos-react-component-v1") fail(path, "Unsupported component ABI"); + if (entry.compatibility !== "org.quixos.react.esm/1") fail(path, "Unsupported component ABI"); const files = parseArtifactFiles(entry.files, `${path}.files`); const shared = object(entry.sharedModules, `${path}.sharedModules`); keys(shared, [...componentSharedModules], [], `${path}.sharedModules`); @@ -187,7 +187,7 @@ function parseComponent(value: unknown, index: number): ComponentArtifact { const component: ComponentArtifact = { id: text(entry.id, path), subject: text(entry.subject, path), - compatibility: "quixos-react-component-v1", + compatibility: "org.quixos.react.esm/1", path: entryPath, exportName, sharedModules, @@ -272,6 +272,9 @@ export function parsePackageArtifacts(value: unknown): PackageArtifacts { }; } function checkCoverage(expected: PlanPackage, manifest: PackageArtifacts): void { + for (const module of expected.modules ?? []) + if (!expected.components?.some((component) => component.id === module.id)) + fail(module.id, `No artifact consumer for module contract ${module.contract} and its subject`); if (expected.bindingDigest !== manifest.bindingDigest || expected.sourceDigest !== manifest.sourceDigest) fail(expected.revision, "Substituted binding schema or source revision"); for (const component of manifest.components ?? []) { diff --git a/src/execution-world/client-contracts.ts b/src/execution-world/client-contracts.ts index 5bd482a..5dc58fd 100644 --- a/src/execution-world/client-contracts.ts +++ b/src/execution-world/client-contracts.ts @@ -136,7 +136,8 @@ export function generatePackageQueryClientBindings( * declared queries, never the workspace's complete atom/interface inventory. */ export function generateComponentClientBindings(plan: ExecutionPlan, packageRevision: string): string { const pkg = plan.definition.workspace.packageImports.find((pkg) => pkg.revisionId === packageRevision); - if (!pkg || !pkg.components?.length) + const components = plan.definition.packages.find((pkg) => pkg.revision === packageRevision)?.components; + if (!pkg || !components?.length) throw new ExecutionPlanError("NO_COMPONENT_CONTRACT", packageRevision, "Package declares no component entries"); const byId = new Map(plan.definition.workspace.interfaceImports.map((iface) => [iface.revisionId as string, iface])); const find = (id: string) => { @@ -148,9 +149,7 @@ export function generateComponentClientBindings(plan: ExecutionPlan, packageRevi const imports = Object.fromEntries( Object.entries(pkg.clientInterfaces ?? {}).map(([alias, id]) => [alias, find(id)]), ); - const subjects = Object.fromEntries( - pkg.components.map((component) => [component.displayName, find(component.subject)]), - ); + const subjects = Object.fromEntries(components.map((component) => [component.displayName, find(component.subject)])); const interfaces = generateInterfaceClientBindings(imports, "@quixos/camino-react"); const subjectBindings = generateInterfaceClientBindings(subjects, "@quixos/camino-react") .split("\n") @@ -168,7 +167,7 @@ export function generateComponentClientBindings(plan: ExecutionPlan, packageRevi "\n" + queries + "\nexport interface Components {\n" + - pkg.components + components .map( (component) => `${JSON.stringify(component.displayName)}: ComponentType>;`, diff --git a/src/execution-world/plan.ts b/src/execution-world/plan.ts index 12d30c4..4fe1390 100644 --- a/src/execution-world/plan.ts +++ b/src/execution-world/plan.ts @@ -10,6 +10,7 @@ import type { OperationId, } from "../capability-model/types.js"; import { validateWorkspaceRevision } from "../capability-model/validation.js"; +import { moduleContract } from "../capability-model/modules.js"; import { canonicalJson, contentDigest } from "../capability-model/evolution.js"; import { resolveForwardedBinding } from "../capability-model/forwarding.js"; import { linkQueries, type LinkedQuery } from "../query/link.js"; @@ -58,14 +59,41 @@ export interface PlannedQuery { admittedOperations: string[]; } export interface PlanPackage { + modules?: (NonNullable[number] & { + contract: string; + subject?: import("../capability-model/types.js").ObjectExpectation; + })[]; controllers?: NonNullable; - components?: NonNullable; + components?: { id: string; displayName: string; subject: InterfaceRevisionId; runtime: "react" }[]; revision: string; source: WorkspaceRevision["packageImports"][number]["source"]; sourceDigest: string; bindingDigest: string; exports: { id: string; execution: ExecutionContract }[]; } + +/** React consumes these module contracts; other contracts remain metadata until + * an artifact consumer exists. This does not make modules callable operations. */ +function componentDeclarations(workspace: WorkspaceRevision, pkg: WorkspaceRevision["packageImports"][number]) { + return [ + ...(pkg.modules ?? []).flatMap((module) => { + const contract = moduleContract(workspace.interfaceImports, module)!; + if ( + !["org.quixos.react.component/1", "org.quixos.react.subject-only/1"].includes(contract.contract) || + contract.subject?.kind !== "interface" + ) + return []; + return [ + { + id: module.id, + displayName: module.displayName, + subject: contract.subject.interfaceRevisionId, + runtime: "react" as const, + }, + ]; + }), + ]; +} export interface ExecutionPlanDefinition { presentations?: NonNullable; codec: "camino-execution-plan-v1"; @@ -430,8 +458,22 @@ export function compileExecutionPlan(input: WorkspaceRevision): ExecutionPlan { source: p.source, sourceDigest: hexDigest({ revision: p.revisionId, source: p.source }), bindingDigest: hexDigest(normalizedSchema), + ...(p.modules?.length + ? { + modules: sorted(p.modules, (module) => module.id).map((module) => { + const contract = moduleContract(workspace.interfaceImports, module)!; + return { + ...module, + contract: contract.contract, + ...(contract.subject ? { subject: contract.subject } : {}), + }; + }), + } + : {}), ...(p.controllers?.length ? { controllers: sorted(p.controllers, (controller) => controller.id) } : {}), - ...(p.components?.length ? { components: sorted(p.components, (component) => component.id) } : {}), + ...(componentDeclarations(workspace, p).length + ? { components: sorted(componentDeclarations(workspace, p), (component) => component.id) } + : {}), exports: sorted(p.exports, (e) => e.id).map((e) => ({ id: e.id, execution: e.execution ?? { kind: "remote" } })), })), owners: sorted(workspace.conformances, (c) => c.id ?? "").map((c) => { diff --git a/src/query/compile.ts b/src/query/compile.ts index 87ec603..4fd4ee9 100644 --- a/src/query/compile.ts +++ b/src/query/compile.ts @@ -126,7 +126,7 @@ export async function compileQuery( if (id === workspaceQueryRootId) return; const contract = generated.contracts.get(id)!; const member = contract.members.find((entry) => entry.displayName === name); - if (!member || member.kind === "operation" || !member.queryRead) + if (!member || member.kind === "operation" || member.kind === "module" || !member.queryRead) return fail("QUERY_FIELD_NOT_QUERYABLE", `${contract.displayName}.${name} is not queryable`, node); if (declaration.placement?.kind === "local") { const getter = member.operations.find( diff --git a/src/query/link.ts b/src/query/link.ts index db51484..720e771 100644 --- a/src/query/link.ts +++ b/src/query/link.ts @@ -62,7 +62,12 @@ export function linkQueries(workspace: WorkspaceRevision): LinkedQuery[] { for (const effect of checked.effects) { const contract = interfaces.get(effect.interfaceRevisionId); const member = contract?.members.find((entry) => entry.id === effect.memberId); - if (!member || member.kind === "operation" || member.queryRead?.execution !== effect.execution) + if ( + !member || + member.kind === "operation" || + member.kind === "module" || + member.queryRead?.execution !== effect.execution + ) throw new QueryCompileError( "QUERY_STALE_CONTRACT", `Query field ${effect.interfaceRevisionId}.${effect.memberId} changed`, diff --git a/src/query/relational-schema.ts b/src/query/relational-schema.ts index fb004e7..ccdff64 100644 --- a/src/query/relational-schema.ts +++ b/src/query/relational-schema.ts @@ -83,7 +83,7 @@ export function relationalSchema(env: RelationalSchemaEnvironment, document?: Do ]); return new Map( env.contracts.get(row.interfaceRevisionId)!.members.flatMap((member): [string, SchemaRowField][] => { - if (member.kind === "operation" || !member.queryRead) return []; + if (member.kind === "operation" || member.kind === "module" || !member.queryRead) return []; if (member.kind === "value") return [[member.displayName, { kind: "leaf", type: member.valueType }]]; if (many(member)) return []; return [ diff --git a/src/query/schema.ts b/src/query/schema.ts index 0d5c324..45403f5 100644 --- a/src/query/schema.ts +++ b/src/query/schema.ts @@ -200,7 +200,7 @@ export function querySchema( }); const fields: GraphQLFieldConfigMap = { _qx: { type: new GraphQLNonNull(metadata) } }; for (const member of contract(id).members) { - if (member.kind === "operation" || !member.queryRead) continue; + if (member.kind === "operation" || member.kind === "module" || !member.queryRead) continue; if (!/^[_A-Za-z][_0-9A-Za-z]*$/.test(member.displayName) || member.displayName.startsWith("_")) throw new QueryCompileError("QUERY_SCHEMA_NAME", `Unsupported query field name ${member.displayName}`); if (member.kind === "value") { diff --git a/test/component-scaffold.test.ts b/test/component-scaffold.test.ts index aa0c4c2..45c7805 100644 --- a/test/component-scaffold.test.ts +++ b/test/component-scaffold.test.ts @@ -25,11 +25,11 @@ test("checked component scaffolding composes with execution handlers without rep tools: { quixos: source, protocol: source, helpers: source, sdk: source }, }); const packageFile = path.join(root, "package.qx"); - await fs.writeFile(packageFile, "import interface Data;\n" + (await fs.readFile(packageFile, "utf8"))); + await fs.writeFile(packageFile, "import interface View;\n" + (await fs.readFile(packageFile, "utf8"))); await apply("component", { name: "Card", id: "component:card", - declaration: 'component Card id "component:card" subject Data runtime react;', + declaration: 'module Card id "component:card" implements View.render;', }); assert.deepEqual(JSON.parse(await fs.readFile(path.join(root, "quixos.components.json"), "utf8")), { "component:card": { entry: "src/components/Card.tsx", export: "Card" }, @@ -45,7 +45,7 @@ test("checked component scaffolding composes with execution handlers without rep await apply("component", { name: "Details", id: "component:details", - declaration: 'component Details id "component:details" subject Data runtime react;', + declaration: 'module Details id "component:details" implements View.render;', }); assert.equal(await fs.readFile(card, "utf8"), retained); assert.match(await fs.readFile(path.join(root, "src/server.ts"), "utf8"), /echo/); @@ -54,7 +54,7 @@ test("checked component scaffolding composes with execution handlers without rep apply("component", { name: "Card", id: "component:other", - declaration: 'component Card id "component:other" subject Data runtime react;', + declaration: 'module Card id "component:other" implements View.render;', }), /unique/, ); @@ -63,7 +63,7 @@ test("checked component scaffolding composes with execution handlers without rep name: "Injected", id: "component:inject", declaration: - 'component Injected id "component:inject" subject Data runtime react; function sneak id "sneak" : unit -> unit;', + 'module Injected id "component:inject" implements View.render; function sneak id "sneak" : unit -> unit;', }), /exactly one/, ); diff --git a/test/emit-controllers.ts b/test/emit-controllers.ts index 1a8a0a7..c342f6e 100644 --- a/test/emit-controllers.ts +++ b/test/emit-controllers.ts @@ -46,6 +46,10 @@ pkg.controllers = parseControllerCatalog( [iface, controllerInterface], pkg.checkedQueries, ); +const viewRole = compileCapabilityResourceSource(await read("DeviceView.qx"), { source, environment }); +assert.ok(viewRole.ok && viewRole.resource.kind === "interface", JSON.stringify(viewRole.diagnostics)); +environment.interfaces.set("DeviceView", viewRole.resource.revision); +environment.interfaceClosure.push(viewRole.resource.revision); const viewer = compileCapabilityResourceSource(await read("Viewer.qx"), { source: { ...source, repository: "https://example.test/device-viewer.git" }, environment, diff --git a/test/emit-managed.ts b/test/emit-managed.ts index f627c77..f5de12c 100644 --- a/test/emit-managed.ts +++ b/test/emit-managed.ts @@ -45,10 +45,25 @@ assert.ok(data.ok && data.resource.kind === "interface", JSON.stringify(data.dia assert.ok(constructors.ok && constructors.resource.kind === "interface", JSON.stringify(constructors.diagnostics)); const dataInterface = data.resource.revision, factoriesInterface = constructors.resource.revision; -const ui = compileCapabilityResourceSource( - 'import interface Data; package UI id "package:ui" revision "package:ui@1" { component Card id "component:card" subject Data runtime react; }', +const view = compileCapabilityResourceSource( + 'import interface Data; interface View id "interface:device-view" revision "interface:device-view@1" { module render id "member:device-view:render" contract "org.quixos.react.subject-only/1" subject interface Data; }', { source, environment: { interfaces: new Map([["Data", dataInterface]]), interfaceClosure: [dataInterface] } }, ); +assert.ok(view.ok && view.resource.kind === "interface", JSON.stringify(view.diagnostics)); +const viewInterface = view.resource.revision; +const ui = compileCapabilityResourceSource( + 'import interface Data; import interface View; package UI id "package:ui" revision "package:ui@1" { module Card id "component:card" implements View.render; }', + { + source, + environment: { + interfaces: new Map([ + ["Data", dataInterface], + ["View", viewInterface], + ]), + interfaceClosure: [dataInterface, viewInterface], + }, + }, +); assert.ok(ui.ok && ui.resource.kind === "package", JSON.stringify(ui.diagnostics)); for (const variant of ["base", "added", "gateway", "gateway-next", "session"]) { const session = variant === "session", @@ -56,13 +71,13 @@ for (const variant of ["base", "added", "gateway", "gateway-next", "session"]) { commit = { base: "a", added: "b", gateway: "c", "gateway-next": "d", session: "e" }[variant]!.repeat(40); const pkg = compileCapabilityResourceSource( `${gateway ? 'external atom Entry id "atom:entry";' : ""} -${session ? 'external atom Independent id "atom:independent"; import interface Data;' : ""} +${session ? 'external atom Independent id "atom:independent"; import interface Data; import interface View;' : ""} package Owner id "package:owner" revision "package:owner@1" { function identity id "identity" : int32 -> record { pid: int32; child: int32; } execution remote; ${gateway ? 'function create id "create" : unit -> atom-ref execution transaction targets [server] requires { creation entry id "entry:birth" : Entry input unit; };' : ""} ${ session - ? `component Editor id "component:owner-editor" subject Data runtime react; + ? `module Editor id "component:owner-editor" implements View.render; function createOne id "create-one" : string -> atom-ref execution transaction targets [browser, server] requires { creation entry id "one:birth" : Entry input unit; }; function createTwo id "create-two" : unit -> atom-ref execution transaction targets [browser, server] requires { creation entry id "two:birth" : Independent input unit; }; operation revise id "revise" : record {body:change; notes:change; reject:bool;} -> unit mode call execution transaction targets [browser, server] receiver any requires { @@ -78,7 +93,15 @@ package Owner id "package:owner" revision "package:owner@1" { { source, ...(session - ? { environment: { interfaces: new Map([["Data", dataInterface]]), interfaceClosure: [dataInterface] } } + ? { + environment: { + interfaces: new Map([ + ["Data", dataInterface], + ["View", viewInterface], + ]), + interfaceClosure: [dataInterface, viewInterface], + }, + } : {}), }, ); @@ -107,7 +130,7 @@ package Owner id "package:owner" revision "package:owner@1" { ${session ? "import package UI;" : ""} ${ session - ? `import interface Data; import interface Factories; + ? `import interface Data; import interface View; import interface Factories; conform Entry as Factories id "owner:factories" { bind createOne.call to package Owner.createOne with { entry to creation Entry with {}; }; bind createTwo.call to package Owner.createTwo with { entry to creation Independent with {}; }; } ${["Entry", "Independent"].map((atom) => `conform ${atom} as Data id "owner:${atom}:data" { private state ${atom}Label id "label:${atom}" on ${atom} : string policy register default "${atom}"; bind label.get to state ${atom}Label.read; bind label.set to state ${atom}Label.write; private state ${atom}Body id "body:${atom}" on ${atom} : string policy crdt(string) default "hello 🌍"; private state ${atom}Notes id "notes:${atom}" on ${atom} : string policy crdt(string) default "notes"; bind body.get to state ${atom}Body.read; bind body.edit to state ${atom}Body.edit; bind notes.get to state ${atom}Notes.read; bind notes.edit to state ${atom}Notes.edit; bind revise.call to package Owner.revise with {body to state ${atom}Body; notes to state ${atom}Notes;}; }`).join("\n")} ` @@ -137,11 +160,15 @@ package Owner id "package:owner" revision "package:owner@1" { ...(session ? ([ ["Data", dataInterface], + ["View", viewInterface], ["Factories", factoriesInterface], ] as const) : []), ]), - interfaceClosure: [factory.resource.revision, ...(session ? [dataInterface, factoriesInterface] : [])], + interfaceClosure: [ + factory.resource.revision, + ...(session ? [dataInterface, viewInterface, factoriesInterface] : []), + ], } : {}), }, diff --git a/test/fixtures/controller-device/DeviceView.qx b/test/fixtures/controller-device/DeviceView.qx new file mode 100644 index 0000000..985fb0c --- /dev/null +++ b/test/fixtures/controller-device/DeviceView.qx @@ -0,0 +1,5 @@ +import interface Device; +external atom Display id "device:display"; +interface DeviceView id "device-view" revision "device-view@1" { + module render id "device-view:render" contract "org.quixos.react.subject-only/1" subject interface Device; +} diff --git a/test/fixtures/controller-device/Viewer.qx b/test/fixtures/controller-device/Viewer.qx index 71714eb..6d7897a 100644 --- a/test/fixtures/controller-device/Viewer.qx +++ b/test/fixtures/controller-device/Viewer.qx @@ -1,7 +1,8 @@ +import interface DeviceView; import interface Device; external atom Display id "device:display"; package DeviceViewer id "device-viewer" revision "device-viewer@1" { - component Status id "component:device:status" subject Device runtime react; + module Status id "component:device:status" implements DeviceView.render; query Inputs id "device-viewer:inputs" root Device document "viewer.graphql" operation "Status" {replica;} query View id "device-viewer:view" root Device document "viewer.graphql" operation "Status" {local from Inputs;watch;} } diff --git a/test/modules.test.ts b/test/modules.test.ts new file mode 100644 index 0000000..3611120 --- /dev/null +++ b/test/modules.test.ts @@ -0,0 +1,213 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { + compileCapabilityResourceSource, + compileCapabilitySource, + formatQx, +} from "../src/capability-language/index.js"; +import { + validateWorkspaceRevision, + compileWorkspaceRevision, + computeCapabilityClosure, + capabilityId, + type InterfaceRevision, +} from "../src/capability-model/index.js"; +import { compileExecutionPlan, checkExecutionWorld } from "../src/execution-world/index.js"; + +const source = { repository: "https://example.test/modules.git", commit: "a".repeat(40) }; +const interfaces = new Map(); +function define(text: string) { + const result = compileCapabilityResourceSource(text, { + source, + environment: { interfaces, interfaceClosure: [...interfaces.values()] }, + }); + assert.ok(result.ok && result.resource.kind === "interface", JSON.stringify(result.diagnostics)); + interfaces.set(result.resource.revision.displayName, result.resource.revision); +} +define('interface Data id "interface:data" revision "interface:data@1" {}'); +define('interface Other id "interface:other" revision "interface:other@1" {}'); +define(`import interface Data; +interface Row id "interface:row" revision "interface:row@1" { + module render id "member:row:render" contract "org.quixos.react.component/1" subject interface Data; +}`); +define(`interface Standalone id "interface:standalone" revision "interface:standalone@1" { + module render id "member:standalone:render" contract "org.quixos.react.subject-only/1" subject object Subject; +}`); +const packageSource = `import interface Row; import interface Data; import interface Standalone; +package UI id "package:ui" revision "package:ui@1" { + module Row id "module:row" implements Row.render; + module Editor id "module:editor" implements Standalone.render; +}`; +function compile( + body = `conform Item as Data id "owner:data" {} + conform Item as Row id "owner:row" {bind render to UI.Row;} + conform Item as Standalone id "owner:standalone" {bind render to UI.Editor;}`, +) { + const pkg = compileCapabilityResourceSource(packageSource, { + source, + environment: { interfaces, interfaceClosure: [...interfaces.values()] }, + }); + assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); + return compileCapabilitySource( + `workspace Demo id "workspace:demo" revision "workspace:demo@1" commit "${source.commit}" { + import interface Data; import interface Other; import interface Row; import interface Standalone; import package UI; + atom Item id "atom:item"; + ${body} + }`, + "workspace.qx", + { + interfaces, + interfaceClosure: [...interfaces.values()], + packages: new Map([["UI", pkg.resource.revision]]), + }, + ); +} + +test("module members bind independent roles, including closed generic subjects, without operations or storage", () => { + const result = compile(); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const pkg = result.workspace.packageImports[0]!; + assert.equal(pkg.exports.length, 0); + assert.equal(pkg.modules?.length, 2); + const roles = result.workspace.conformances.filter((entry) => entry.moduleBindings?.length); + assert.equal(roles.length, 2); + for (const role of roles) { + assert.deepEqual(role.operationBindings, []); + assert.deepEqual(role.privateAttachments, []); + const iface: InterfaceRevision = result.workspace.interfaceImports.find( + (entry) => entry.revisionId === role.interfaceRevisionId, + )!; + assert.equal(iface.members[0]!.kind, "module"); + assert.deepEqual(iface.members[0]!.operations, []); + } +}); + +test("module bindings reject missing, duplicate and wrong nominal roles and unsatisfied subjects", () => { + for (const body of [ + "conform Item as Data {} conform Item as Row {}", + "conform Item as Data {} conform Item as Row {bind render to UI.Editor;}", + "conform Item as Data {} conform Item as Row {bind render to UI.Row; bind render to UI.Row;}", + "conform Item as Other {} conform Item as Row {bind render to UI.Row;}", + "conform Item as Data {} conform Item as Row {bind render to UI.Missing;}", + ]) { + const result = compile(body); + assert.equal(result.ok, false, body); + if (!result.ok) assert.match(JSON.stringify(result.diagnostics), /module/i); + } +}); + +test("module declarations and bindings round-trip through the ordinary formatter", () => { + const formatted = formatQx(packageSource); + assert.equal(formatQx(formatted), formatted); + const result = compileCapabilityResourceSource(formatted, { + source, + environment: { interfaces, interfaceClosure: [...interfaces.values()] }, + }); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); +}); + +test("the old React-specific package declaration is no longer a public language path", () => { + const result = compileCapabilityResourceSource( + 'import interface Data; package UI id "package:ui" revision "package:ui@1" { component Card id "card" subject Data runtime react; }', + { source, environment: { interfaces, interfaceClosure: [...interfaces.values()] } }, + ); + assert.equal(result.ok, false); + assert.ok(result.diagnostics.some((diagnostic) => diagnostic.phase === "syntax")); +}); + +test("module closure retains the provider and subject but no synthetic state", () => { + const result = compile(); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const compiled = compileWorkspaceRevision(result.workspace); + assert.ok(compiled.ok); + const closure = computeCapabilityClosure(compiled.plan, [ + { + atomId: capabilityId.atom("atom:item"), + interfaceRevisionId: capabilityId.interfaceRevision("interface:row@1"), + }, + ]); + assert.deepEqual(closure.packageRevisionIds, ["package:ui@1"]); + assert.deepEqual(closure.attachmentIds, []); + assert.deepEqual( + new Set(closure.conformances.map((entry) => entry.interfaceRevisionId)), + new Set(["interface:row@1", "interface:data@1"]), + ); +}); + +test("unknown namespaced module contracts remain metadata and malformed contracts reject", () => { + const result = compile(); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const workspace = structuredClone(result.workspace); + const iface: InterfaceRevision = workspace.interfaceImports.find((entry) => entry.revisionId === "interface:row@1")!; + const member = iface.members[0]!; + assert.equal(member.kind, "module"); + if (member.kind !== "module") throw Error("Expected module"); + member.contract = "example.device.firmware/2"; + assert.deepEqual(validateWorkspaceRevision(workspace), []); + member.contract = "react"; + assert.ok(validateWorkspaceRevision(workspace).some((issue) => issue.code === "invalid-module-contract")); +}); + +test("execution plans retain nominal module contracts without synthesizing callable operations", async () => { + const result = compile(); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const plan = compileExecutionPlan(result.workspace); + assert.deepEqual(plan.definition.operations, []); + const pkg = plan.definition.packages[0]!; + assert.equal(pkg.modules?.length, 2); + assert.deepEqual(pkg.modules?.find((module) => module.id === "module:editor")?.subject, { + kind: "interface", + interfaceRevisionId: "interface:data@1", + }); + // A language declaration cannot silently pass installation without an artifact consumer. + await assert.rejects( + checkExecutionWorld( + plan, + [ + { + schemaVersion: 1, + packageRevisionId: pkg.revision, + bindingDigest: pkg.bindingDigest, + sourceDigest: pkg.sourceDigest, + versions: plan.definition.versions, + implementations: [], + }, + ], + async () => { + throw Error("Must reject before reading files"); + }, + ), + /Missing component artifact/, + ); +}); + +test("unrecognized module consumers fail before artifact execution, not during interface compilation", async () => { + const result = compile(); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const workspace = structuredClone(result.workspace); + const member = workspace.interfaceImports.find((iface) => iface.revisionId === "interface:row@1")!.members[0]!; + assert.equal(member.kind, "module"); + if (member.kind !== "module") throw Error("Expected module"); + member.contract = "example.device.firmware/2"; + const plan = compileExecutionPlan(workspace); + const pkg = plan.definition.packages[0]!; + await assert.rejects( + checkExecutionWorld( + plan, + [ + { + schemaVersion: 1, + packageRevisionId: pkg.revision, + bindingDigest: pkg.bindingDigest, + sourceDigest: pkg.sourceDigest, + versions: plan.definition.versions, + implementations: [], + }, + ], + async () => { + throw Error("Must reject before reading files"); + }, + ), + /No artifact consumer.*example.device.firmware/, + ); +}); diff --git a/test/presentations.test.ts b/test/presentations.test.ts index af6b8fc..19b26ec 100644 --- a/test/presentations.test.ts +++ b/test/presentations.test.ts @@ -39,8 +39,17 @@ const interfaces = new Map([ ["Data", data], ["Other", other], ]); -const componentSource = (body = 'component Card id "component:card" subject Data runtime react;') => - `import interface Data; package UI id "package:ui" revision "package:ui@1" { ${body} }`; +const role = compileCapabilityResourceSource( + `import interface Data; +interface View id "interface:view" revision "interface:view@1" { + module render id "member:view:render" contract "org.quixos.react.subject-only/1" subject interface Data; +}`, + { source, environment: { interfaces, interfaceClosure: [...interfaces.values()] } }, +); +assert.ok(role.ok && role.resource.kind === "interface", JSON.stringify(role.diagnostics)); +interfaces.set("View", role.resource.revision); +const componentSource = (body = 'module Card id "component:card" implements View.render;') => + `import interface Data; import interface View; package UI id "package:ui" revision "package:ui@1" { ${body} }`; const compilePackage = (body?: string) => compileCapabilityResourceSource(componentSource(body), { source, @@ -51,7 +60,7 @@ const workspace = (presentation = 'presentation Card id "presentation:card" for assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); return compileCapabilitySource( `workspace Example id "workspace:example" revision "workspace:example@1" commit "${source.commit}" { - import interface Data; import interface Other; import package UI; + import interface Data; import interface Other; import interface View; import package UI; atom One id "atom:one"; atom Two id "atom:two"; conform One as Data id "conformance:one:data" { } conform Two as Data id "conformance:two:data" { } @@ -88,21 +97,21 @@ test("component declarations survive formatting and syntax inspection", () => { const text = formatQx(componentSource()); const parsed = parseQx(text); assert.deepEqual(parsed.diagnostics, []); - assert.ok([...walkSyntax(parsed.root)].some((node) => node.kind === "componentDecl")); + assert.ok([...walkSyntax(parsed.root)].some((node) => node.kind === "moduleExport")); assert.equal(formatQx(text), text); }); test("component and presentation contracts reject wrong subjects, duplicates and unavailable runtimes", () => { for (const [input, message] of [ - ['component Card id "component:card" subject Missing runtime react;', /Missing/], - ['component Card id "component:card" subject Data runtime arduino;', /Unsupported component runtime/], + ['module Card id "component:card" implements Missing.render;', /Missing/], + ['module Card id "component:card" implements Data.missing;', /module member/], [ - 'component Card id "component:card" subject Data runtime react; component Other id "component:card" subject Data runtime react;', - /Duplicate component/, + 'module Card id "component:card" implements View.render; module Other id "component:card" implements View.render;', + /Duplicate or empty module/, ], [ - 'component Card id "component:card" subject Data runtime react; component Card id "component:other" subject Data runtime react;', - /Duplicate component/, + 'module Card id "component:card" implements View.render; module Card id "component:other" implements View.render;', + /Duplicate or empty module/, ], ] as const) { const result = compilePackage(input); @@ -131,6 +140,17 @@ test("model validation rechecks presentation metadata instead of trusting the so assert.throws(() => compileExecutionPlan(result.workspace), /no installed package component/); }); +test("standalone presentation rejects a general component contract that may require extra props", () => { + const result = workspace(); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const candidate = structuredClone(result.workspace); + const member = candidate.interfaceImports.find((iface) => iface.revisionId === "interface:view@1")!.members[0]!; + assert.equal(member.kind, "module"); + if (member.kind !== "module") throw Error("Expected module"); + member.contract = "org.quixos.react.component/1"; + assert.ok(validateWorkspaceRevision(candidate).some((issue) => /subject-only/.test(issue.message))); +}); + test("checked component-only artifacts install without a service and reject missing or substituted entries", async () => { const result = workspace(); assert.ok(result.ok, JSON.stringify(result.diagnostics)); @@ -150,7 +170,7 @@ test("checked component-only artifacts install without a service and reject miss const body: Omit = { id: "component:card", subject: "interface:Data@1", - compatibility: "quixos-react-component-v1", + compatibility: "org.quixos.react.esm/1", path: paths[0]!, exportName: "Card", files, From 82a45427465a56ae3d0faa33155aec4f59836828 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Tue, 22 Sep 2026 13:51:32 -0700 Subject: [PATCH 55/91] Build composable Camino packages with explicit type and source dependencies --- grammar/QuixosLock.g4 | 2 + nix/checked-candidate.nix | 69 ++++- src/bindings/index.ts | 15 +- src/capability-language/assembly.ts | 99 ++++--- src/capability-language/authoring-context.ts | 4 +- src/capability-language/authoring-inspect.ts | 2 +- src/capability-language/candidate-check.ts | 3 +- src/capability-language/checked-build.ts | 2 +- src/capability-language/execution-scaffold.ts | 2 +- src/capability-language/git-resolver.ts | 2 +- src/capability-language/pin-upgrades.ts | 24 +- src/capability-language/resource-cli.ts | 20 +- src/capability-language/structural-edits.ts | 6 +- src/capability-language/structural-plan.ts | 6 +- src/capability-language/tool-cli.ts | 74 ++++-- src/capability-language/workspace-cli.ts | 19 +- src/execution-world/client-contracts.ts | 14 +- src/execution-world/receipts.ts | 8 +- src/resource-lock/generated/QuixosLock.interp | 4 +- src/resource-lock/generated/QuixosLock.tokens | 58 +++-- .../generated/QuixosLockLexer.interp | 5 +- .../generated/QuixosLockLexer.tokens | 58 +++-- .../generated/QuixosLockLexer.ts | 241 +++++++++--------- .../generated/QuixosLockParser.ts | 89 ++++--- src/resource-lock/parser.ts | 6 +- src/resource-lock/types.ts | 2 +- test/artifact-files.test.ts | 19 ++ test/build-dependencies.test.ts | 76 ++++++ test/emit-managed.ts | 21 ++ test/pin-upgrades.test.ts | 206 +++++++-------- 30 files changed, 736 insertions(+), 420 deletions(-) create mode 100644 test/build-dependencies.test.ts diff --git a/grammar/QuixosLock.g4 b/grammar/QuixosLock.g4 index e8b41a1..ae2525e 100644 --- a/grammar/QuixosLock.g4 +++ b/grammar/QuixosLock.g4 @@ -20,6 +20,7 @@ importEntry resourceKind : INTERFACE | PACKAGE + | BUILD ; sourceBlock @@ -58,6 +59,7 @@ QUIXOS: 'quixos'; SOURCE: 'source'; INTERFACE: 'interface'; PACKAGE: 'package'; +BUILD: 'build'; REPOSITORY: 'repository'; COMMIT: 'commit'; POLICY: 'policy'; diff --git a/nix/checked-candidate.nix b/nix/checked-candidate.nix index fcb6fec..7e61b45 100644 --- a/nix/checked-candidate.nix +++ b/nix/checked-candidate.nix @@ -34,7 +34,8 @@ let ''; lock = builtins.fromJSON (builtins.readFile lockFile); children = map ( - entry: load (ancestors ++ [ (sourceKey source) ]) (entry.source // { inherit (entry) kind; }) + entry: + load (ancestors ++ [ (sourceKey source) ]) (entry.source // { inherit (entry) kind binding; }) ) lock.resources; in source // { inherit directory children lock; }; @@ -50,6 +51,12 @@ let ); runtimePackages = runtime.packages.${system}; flatten = node: [ node ] ++ pkgs.lib.concatMap flatten node.children; + capabilityFlatten = + node: + if node.kind == "build" then + [ ] + else + [ node ] ++ pkgs.lib.concatMap capabilityFlatten node.children; nodes = builtins.attrValues ( builtins.listToAttrs ( map (node: { @@ -94,6 +101,51 @@ let } ''; contract = compile root; + buildDependencies = + node: + builtins.listToAttrs ( + map (dependency: { + name = dependency.binding; + value = { + src = dependency.directory; + source = { inherit (dependency) repository commit; }; + flake = builtins.getFlake "git+${dependency.repository}?rev=${dependency.commit}&ref=refs/tags/quixos-reachability/${dependency.commit}"; + }; + }) (builtins.filter (dependency: dependency.kind == "build") node.children) + ); + reactContracts = + node: + let + interfaces = builtins.attrValues ( + builtins.listToAttrs ( + map (dependency: { + name = sourceKey dependency; + value = dependency; + }) (builtins.filter (dependency: dependency.kind == "interface") (capabilityFlatten node)) + ) + ); + in + pkgs.lib.concatMap ( + dependency: + if !builtins.pathExists (dependency.directory + "/flake.nix") then + [ ] + else + let + source = builtins.getFlake "git+${dependency.repository}?rev=${dependency.commit}&ref=refs/tags/quixos-reachability/${dependency.commit}"; + build = source.quixosInterfaces.${system}.reactTypes or null; + in + if build == null then + [ ] + else + [ + (build { + interface = "${compile dependency}/candidate.json"; + generator = protocol; + typescript = runtimePackages.camino-replica-core.dependencies; + dependencies = buildDependencies dependency; + }) + ] + ) interfaces; checkPackage = node: let @@ -126,11 +178,13 @@ let sharedRuntime = runtimePackages.camino-shared-runtime; typescript = runtimePackages.camino-replica-core.dependencies; packageRevisionId = candidate.revision.revisionId; + dependencies = buildDependencies node; } // pkgs.lib.optionalAttrs (componentEntries != [ ]) { react = { sdk = runtimePackages.camino-react; runtime = runtimePackages.camino-react-runtime; + contracts = reactContracts node; }; } else @@ -157,7 +211,18 @@ let if contractOnly then [ ] else - map checkPackage (builtins.filter (node: node.kind == "package") nodes); + map checkPackage ( + builtins.filter (node: node.kind == "package") ( + builtins.attrValues ( + builtins.listToAttrs ( + map (node: { + name = sourceKey node; + value = node; + }) (capabilityFlatten root) + ) + ) + ) + ); manifest = pkgs.writeText "qx-candidate-checks.json" (builtins.toJSON checks); bindingOptions = pkgs.writeText "qx-typescript-options.json" ( builtins.toJSON ( diff --git a/src/bindings/index.ts b/src/bindings/index.ts index 8290516..8afc11a 100644 --- a/src/bindings/index.ts +++ b/src/bindings/index.ts @@ -17,24 +17,29 @@ export type BindingSchema = { interfaceTemplates?: InterfaceRevision[]; packages: PackageRevision[]; }; -export const bindingSchema = (compiled: Pick): BindingSchema => ({ +export const bindingSchema = ( + compiled: Pick & + Partial>, +): BindingSchema => ({ format: "quixos-bindings", version: 1, - interfaceTemplates: compiled.resources.flatMap((node) => + interfaceTemplates: (compiled.capabilityResources ?? compiled.resources).flatMap((node) => node.resource.kind === "interface" && node.resource.revision.template ? [node.resource.revision] : [], ), interfaces: [ ...new Map( - compiled.resources + (compiled.capabilityResources ?? compiled.resources) .flatMap((node) => [ ...(node.resource.kind === "interface" ? [node.resource.revision] : []), - ...(node.resource.specializations ?? []), + ...(node.resource.kind === "build" ? [] : (node.resource.specializations ?? [])), ]) .filter((entry) => !entry.template) .map((entry) => [entry.revisionId, entry]), ).values(), ], - packages: compiled.resources.flatMap((node) => (node.resource.kind === "package" ? [node.resource.revision] : [])), + packages: (compiled.capabilityResources ?? compiled.resources).flatMap((node) => + node.resource.kind === "package" ? [node.resource.revision] : [], + ), }); export const specializeBindingSchema = ( diff --git a/src/capability-language/assembly.ts b/src/capability-language/assembly.ts index f55edab..748bcaf 100644 --- a/src/capability-language/assembly.ts +++ b/src/capability-language/assembly.ts @@ -47,7 +47,7 @@ export type ResolvedCapabilityResource = { source: GitSource; directory: string; lock: QuixosRepositoryLock; - resource: CapabilityResource; + resource: CapabilityResource | { kind: "build" }; dependencies: ReadonlyMap; }; @@ -56,13 +56,15 @@ export type CompiledWorkspaceRepository = { plan: CompiledWorkspaceRevision; lock: QuixosRepositoryLock; resources: ResolvedCapabilityResource[]; + capabilityResources: ResolvedCapabilityResource[]; directResources: ReadonlyMap; }; export type CompiledCapabilityResourceRepository = { - resource: CapabilityResource; + resource: CapabilityResource | { kind: "build" }; lock: QuixosRepositoryLock; resources: ResolvedCapabilityResource[]; + capabilityResources: ResolvedCapabilityResource[]; directResources: ReadonlyMap; }; @@ -79,7 +81,10 @@ const assertImportsMatchLock = ( resources: readonly LockedResource[], ) => { const authored = [...imports].map(importsKey).sort(); - const locked = [...resources].map(importsKey).sort(); + const locked = resources + .filter((entry) => entry.kind !== "build") + .map(importsKey) + .sort(); if (authored.length !== locked.length || authored.some((entry, index) => entry !== locked[index])) { throw new Error( `${label} imports do not match quixos.lock:\n` + @@ -137,13 +142,19 @@ const diagnosticsMessage = ( }) .join("\n")}`; -const revisionFor = (node: ResolvedCapabilityResource) => node.resource.revision; +const revisionFor = (node: ResolvedCapabilityResource) => { + if (node.resource.kind === "build") throw Error("Build sources have no capability revision"); + return node.resource.revision; +}; -const resourceClosure = (roots: readonly ResolvedCapabilityResource[]): ResolvedCapabilityResource[] => { +const resourceClosure = ( + roots: readonly ResolvedCapabilityResource[], + capabilityOnly = false, +): ResolvedCapabilityResource[] => { const result: ResolvedCapabilityResource[] = []; const seen = new Set(); const visit = (node: ResolvedCapabilityResource) => { - if (seen.has(node.key)) return; + if (seen.has(node.key) || (capabilityOnly && node.kind === "build")) return; seen.add(node.key); for (const dependency of node.dependencies.values()) visit(dependency); result.push(node); @@ -155,28 +166,36 @@ const resourceClosure = (roots: readonly ResolvedCapabilityResource[]): Resolved const environmentFor = ( direct: readonly [LockedResource, ResolvedCapabilityResource][], closure: readonly ResolvedCapabilityResource[], -): CapabilityImportEnvironment => ({ - interfaces: new Map( - direct.flatMap(([locked, node]) => - node.resource.kind === "interface" ? [[locked.binding, node.resource.revision] as const] : [], +): CapabilityImportEnvironment => { + closure = resourceClosure( + direct.map(([, node]) => node), + true, + ); + return { + interfaces: new Map( + direct.flatMap(([locked, node]) => + node.resource.kind === "interface" ? [[locked.binding, node.resource.revision] as const] : [], + ), ), - ), - packages: new Map( - direct.flatMap(([locked, node]) => - node.resource.kind === "package" ? [[locked.binding, node.resource.revision] as const] : [], + packages: new Map( + direct.flatMap(([locked, node]) => + node.resource.kind === "package" ? [[locked.binding, node.resource.revision] as const] : [], + ), ), - ), - interfaceClosure: exactRevisions( - closure.flatMap((node) => [ - ...(node.resource.kind === "interface" ? [node.resource.revision] : []), - ...(node.resource.specializations ?? []), - ]), - ), - packageClosure: exactRevisions( - closure.flatMap((node) => (node.resource.kind === "package" ? [node.resource.revision] : [])), - ), - externalAtoms: exactAtoms(closure.flatMap((node) => node.resource.externalAtoms)), -}); + interfaceClosure: exactRevisions( + closure.flatMap((node) => [ + ...(node.resource.kind === "interface" ? [node.resource.revision] : []), + ...(node.resource.kind === "build" ? [] : (node.resource.specializations ?? [])), + ]), + ), + packageClosure: exactRevisions( + closure.flatMap((node) => (node.resource.kind === "package" ? [node.resource.revision] : [])), + ), + externalAtoms: exactAtoms( + closure.flatMap((node) => (node.resource.kind === "build" ? [] : node.resource.externalAtoms)), + ), + }; +}; const createResourceGraphResolver = (quixosCommit: string, resolveResource: CapabilityRepositoryResolver) => { const resolved = new Map>(); @@ -218,6 +237,19 @@ const createResourceGraphResolver = (quixosCommit: string, resolveResource: Capa for (const dependency of lockResult.lock.resources) { directPairs.push([dependency, await visit(dependency)]); } + if (locked.kind === "build") { + return { + key, + kind: locked.kind, + source: locked.source, + directory: snapshot.directory, + lock: lockResult.lock, + resource: { kind: "build" as const }, + dependencies: new Map( + directPairs.map(([dependency, node]) => [bindingKey(dependency.kind, dependency.binding), node]), + ), + }; + } const dependencyClosure = resourceClosure(directPairs.map(([, node]) => node)); const environment = environmentFor(directPairs, dependencyClosure); const manifestName = locked.kind === "interface" ? "interface.qx" : "package.qx"; @@ -332,6 +364,7 @@ export const compileCapabilityResourceRepository = async (options: { resource: root.resource, lock: root.lock, resources: await resolver.nodes(), + capabilityResources: resourceClosure([root], true), directResources: root.dependencies, }; }; @@ -376,11 +409,13 @@ export const compileWorkspaceRepository = async (options: { ); } assertImportsMatchLock(workspacePath, compiled.imports, rootLock.resources); - const availableInterfaceIds = new Set( - nodes.flatMap((node) => (node.resource.kind === "interface" ? [node.resource.revision.revisionId] : [])), - ); + const availableInterfaceIds = new Set((environment.interfaceClosure ?? []).map((iface) => iface.revisionId)); const availableAtomIds = new Set(compiled.workspace.atoms.map((atom) => atom.id)); - for (const node of nodes) { + for (const node of resourceClosure( + directPairs.map(([, node]) => node), + true, + )) { + if (node.resource.kind === "build") continue; for (const requirement of node.resource.externalInterfaces) { if (!availableInterfaceIds.has(requirement.revisionId)) { throw new Error( @@ -430,6 +465,10 @@ export const compileWorkspaceRepository = async (options: { plan: checked.plan, lock: rootLock, resources: nodes, + capabilityResources: resourceClosure( + directPairs.map(([, node]) => node), + true, + ), directResources: new Map(directPairs.map(([locked, node]) => [bindingKey(locked.kind, locked.binding), node])), }; }; diff --git a/src/capability-language/authoring-context.ts b/src/capability-language/authoring-context.ts index f91a318..2402292 100644 --- a/src/capability-language/authoring-context.ts +++ b/src/capability-language/authoring-context.ts @@ -3,7 +3,7 @@ import path from "node:path"; import { loadQuixosLock, type GitSource } from "../resource-lock/index.js"; export type AuthoringResource = { - kind: "workspace" | "interface" | "package"; + kind: "workspace" | "interface" | "package" | "build"; directory: string; resourceId?: string; source?: GitSource; @@ -31,7 +31,7 @@ export async function authoringContext(start: string) { if (typeof entry.directory === "string" && path.isAbsolute(entry.directory)) entry.directory = path.relative(workbench, entry.directory); if ( - !["interface", "package"].includes(entry.kind) || + !["interface", "package", "build"].includes(entry.kind) || !entry.source || !/^resources\/[A-Za-z0-9][A-Za-z0-9._-]*$/.test(entry.directory) ) { diff --git a/src/capability-language/authoring-inspect.ts b/src/capability-language/authoring-inspect.ts index 54544f2..c81ae0b 100644 --- a/src/capability-language/authoring-inspect.ts +++ b/src/capability-language/authoring-inspect.ts @@ -69,7 +69,7 @@ export async function inspectAuthoringRepository(root: string, historyLimit = 10 declarations: syntax ? [...walkSyntax(syntax.root)] .filter((node) => - /^(?:interface|package|atom|state|edge|method|function|event|conformance|component|presentation)\w*Decl$/.test( + /^(?:(?:interface|package|atom|state|edge|method|function|event|conformance|presentation)\w*Decl|module(?:Member|Export))$/.test( node.kind, ), ) diff --git a/src/capability-language/candidate-check.ts b/src/capability-language/candidate-check.ts index 6a67de9..45c9ea2 100644 --- a/src/capability-language/candidate-check.ts +++ b/src/capability-language/candidate-check.ts @@ -209,7 +209,7 @@ export const checkWorkspaceCandidate = async (options: { : []; const evolution = planEvolution(baseline, compiled.workspace, { reviews }); blockers.push(...evolution.blockers); - for (const resource of compiled.resources.filter((entry) => entry.kind === "package")) { + for (const resource of compiled.capabilityResources.filter((entry) => entry.kind === "package")) { // Per-package recursive schema, identical to host activation, not unrelated // workspace declarations that would unnecessarily invalidate build caches. const candidate = await compileCapabilityResourceRepository({ @@ -218,6 +218,7 @@ export const checkWorkspaceCandidate = async (options: { source: resource.source, resolveResource, }); + if (candidate.resource.kind !== "package") throw Error("Expected checked package contract"); const schema = path.join(temporary, "bindings.json"); await fs.writeFile( schema, diff --git a/src/capability-language/checked-build.ts b/src/capability-language/checked-build.ts index d08b50a..ee04814 100644 --- a/src/capability-language/checked-build.ts +++ b/src/capability-language/checked-build.ts @@ -107,7 +107,7 @@ export async function buildCheckedPackage(source: string, schema: string, packag * nested fetches. Keep build noise in a named log, with a bounded failure tail. */ export async function buildImmutableCandidate( source: { repository: string; commit: string }, - kind: "workspace" | "interface" | "package", + kind: "workspace" | "interface" | "package" | "build", logFile: string, contractOnly = false, ): Promise { diff --git a/src/capability-language/execution-scaffold.ts b/src/capability-language/execution-scaffold.ts index 9ec6fb5..424252a 100644 --- a/src/capability-language/execution-scaffold.ts +++ b/src/capability-language/execution-scaffold.ts @@ -56,7 +56,7 @@ export async function executionScaffold( flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; }; in { - quixosPackages.checkedArtifacts = { plan, generator, core, sharedRuntime, typescript, packageRevisionId, react ? null }: + quixosPackages.checkedArtifacts = { plan, generator, core, sharedRuntime, typescript, packageRevisionId, react ? null, ... }: (import (helpers + "/artifacts.nix")) { inherit pkgs plan core sharedRuntime typescript packageRevisionId; protocol = generator; diff --git a/src/capability-language/git-resolver.ts b/src/capability-language/git-resolver.ts index c87dcfc..5175e5c 100644 --- a/src/capability-language/git-resolver.ts +++ b/src/capability-language/git-resolver.ts @@ -38,7 +38,7 @@ export const createGitCapabilityResolver = async (options: { }>; }; for (const entry of document.resources ?? []) { - if (entry.kind !== "interface" && entry.kind !== "package") { + if (entry.kind !== "interface" && entry.kind !== "package" && entry.kind !== "build") { throw new Error(`Snapshot map has unsupported resource kind ${entry.kind}`); } const key = sourceKey(entry.kind, entry.repository, entry.commit); diff --git a/src/capability-language/pin-upgrades.ts b/src/capability-language/pin-upgrades.ts index 5748d98..21b24f9 100644 --- a/src/capability-language/pin-upgrades.ts +++ b/src/capability-language/pin-upgrades.ts @@ -19,7 +19,7 @@ import { planEvolution, type WorkspaceRevision, type EvolutionReview } from "../ import { withFileLock } from "./file-lock.js"; const execFile = promisify(callback); type Source = { repository: string; commit: string }; -export type UpgradeNode = { kind: "workspace" | "package" | "interface"; directory: string; source: Source }; +export type UpgradeNode = { kind: "workspace" | "package" | "interface" | "build"; directory: string; source: Source }; export type UpgradeSpec = { nodes: UpgradeNode[]; quixos?: Source; @@ -105,7 +105,7 @@ export const discoverUpgradeSpec = async (workbench: string): Promise ({ + ...graph.resources.map((entry: { kind: "interface" | "package" | "build"; directory: string; source: Source }) => ({ kind: entry.kind, source: entry.source, directory: path.relative(workbench, path.resolve(workbench, entry.directory)), @@ -139,7 +139,7 @@ export const planPinUpgrades = async (workbenchPath: string, spec: UpgradeSpec): const keys = new Map(); for (const node of spec.nodes) { validSource(node.source); - if (!["workspace", "package", "interface"].includes(node.kind) || keys.has(sourceKey(node))) + if (!["workspace", "package", "interface", "build"].includes(node.kind) || keys.has(sourceKey(node))) throw new Error("Duplicate/invalid upgrade resource identity"); keys.set(sourceKey(node), node.directory); } @@ -423,14 +423,14 @@ export const applyPinUpgrades = async ( const directory = await location(plan.workbench, node.directory); const standalone = await compileCapabilityResourceRepository({ rootDirectory: directory, - kind: node.kind as "package" | "interface", + kind: node.kind as "package" | "interface" | "build", source, resolveResource, }); for (const dependency of standalone.resources) resources.set(dependency.key, dependency); resources.set(key, { key, - kind: node.kind as "package" | "interface", + kind: node.kind as "package" | "interface" | "build", source, directory, lock: standalone.lock, @@ -450,11 +450,15 @@ export const applyPinUpgrades = async ( kind: node.kind, source: node.source, directory: node.directory, - resourceId: - node.resource.kind === "interface" - ? node.resource.revision.interfaceId - : node.resource.revision.packageId, - revisionId: node.resource.revision.revisionId, + ...(node.resource.kind === "build" + ? {} + : { + resourceId: + node.resource.kind === "interface" + ? node.resource.revision.interfaceId + : node.resource.revision.packageId, + revisionId: node.resource.revision.revisionId, + }), dependencies: [...node.dependencies.entries()].map(([binding, dependency]) => ({ binding, resourceKey: dependency.key, diff --git a/src/capability-language/resource-cli.ts b/src/capability-language/resource-cli.ts index 77c8de3..ae67357 100644 --- a/src/capability-language/resource-cli.ts +++ b/src/capability-language/resource-cli.ts @@ -6,7 +6,7 @@ import { bindingSchema } from "../bindings/index.js"; import { compileCapabilityResourceRepository, type ResolvedCapabilityResource } from "./assembly.js"; import { createGitCapabilityResolver } from "./git-resolver.js"; -const usage = `usage: quixos-resource-compile --root DIRECTORY --kind interface|package +const usage = `usage: quixos-resource-compile --root DIRECTORY --kind interface|package|build --repository URL --commit GIT_REV --checkout-root DIRECTORY [--snapshot-map PATH] [--snapshot-only true] [--graph-out PATH] [--schema-out PATH] @@ -41,7 +41,13 @@ const parseArgs = (args: string[]) => { const repository = values.get("--repository"); const commit = values.get("--commit")?.toLowerCase(); const checkoutRoot = values.get("--checkout-root"); - if (!rootDirectory || !repository || !commit || !checkoutRoot || (kind !== "interface" && kind !== "package")) { + if ( + !rootDirectory || + !repository || + !commit || + !checkoutRoot || + (kind !== "interface" && kind !== "package" && kind !== "build") + ) { throw new Error(usage); } if (!/^([0-9a-f]{40}|[0-9a-f]{64})$/.test(commit)) { @@ -67,9 +73,13 @@ const graphEntry = (node: ResolvedCapabilityResource) => ({ kind: node.kind, source: node.source, directory: node.directory, - resourceId: - node.resource.kind === "interface" ? node.resource.revision.interfaceId : node.resource.revision.packageId, - revisionId: node.resource.revision.revisionId, + ...(node.resource.kind === "build" + ? {} + : { + resourceId: + node.resource.kind === "interface" ? node.resource.revision.interfaceId : node.resource.revision.packageId, + revisionId: node.resource.revision.revisionId, + }), dependencies: [...node.dependencies.entries()].map(([binding, dependency]) => ({ binding, resourceKey: dependency.key, diff --git a/src/capability-language/structural-edits.ts b/src/capability-language/structural-edits.ts index c73b1a7..65cab67 100644 --- a/src/capability-language/structural-edits.ts +++ b/src/capability-language/structural-edits.ts @@ -15,7 +15,7 @@ export type StructuralEdit = | { operation: "quixos-pin"; source: { repository: string; commit: string } } | { operation: "dependency"; - kind: "interface" | "package"; + kind: "interface" | "package" | "build"; name: string; source: { repository: string; commit: string } | null; }; @@ -29,6 +29,8 @@ const selectable = new Set([ "packageResourceDecl", "atomDecl", "valueMember", + "moduleMember", + "moduleExport", "relationshipMember", "operationMember", "packageOperationExport", @@ -155,7 +157,7 @@ export const editStructure = (source: string, edit: StructuralEdit): string => { if (edit.operation === "dependency") { const parsed = parseQuixosLockDocument(source); if (!parsed.ok) throw new Error("Cannot scaffold an invalid lockfile"); - if (!["interface", "package"].includes(edit.kind) || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(edit.name)) + if (!["interface", "package", "build"].includes(edit.kind) || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(edit.name)) throw new Error("Invalid dependency selector"); const parser = new QuixosLockParser(new CommonTokenStream(new QuixosLockLexer(CharStream.fromString(source)))); const tree = parser.document(); diff --git a/src/capability-language/structural-plan.ts b/src/capability-language/structural-plan.ts index 5759058..80abff8 100644 --- a/src/capability-language/structural-plan.ts +++ b/src/capability-language/structural-plan.ts @@ -13,7 +13,7 @@ import { parseQuixosLockDocument } from "../resource-lock/index.js"; import { withFileLock } from "./file-lock.js"; export type StructuralRequest = { - kind: "workspace" | "interface" | "package"; + kind: "workspace" | "interface" | "package" | "build"; source?: { repository: string; commit: string }; resourceRoot?: string; validation?: "syntax" | "resource-graph"; @@ -159,10 +159,10 @@ export const planStructure = async (rootPath: string, request: StructuralRequest const resourceRoot = path.join(snapshot.directory, request.resourceRoot ?? ""); if (request.kind === "workspace") await compileWorkspaceRepository({ rootDirectory: resourceRoot, resolveResource }); - else if (["package", "interface"].includes(request.kind) && request.source) { + else if (["package", "interface", "build"].includes(request.kind) && request.source) { const compiled = await compileCapabilityResourceRepository({ rootDirectory: resourceRoot, - kind: request.kind as "package" | "interface", + kind: request.kind as "package" | "interface" | "build", source: { resolver: "git", ...request.source }, resolveResource, }); diff --git a/src/capability-language/tool-cli.ts b/src/capability-language/tool-cli.ts index fd614ee..c86a7ac 100644 --- a/src/capability-language/tool-cli.ts +++ b/src/capability-language/tool-cli.ts @@ -192,16 +192,16 @@ const main = async () => { } if (command === "check-committed" && !args.includes("--help")) { const [kind, repository, commit, log, ...extra] = args; - if (!["workspace", "interface", "package"].includes(kind) || !log || extra.length) - throw new Error("usage: quixos-qx check-committed workspace|interface|package REPOSITORY COMMIT LOG_FILE"); + if (!["workspace", "interface", "package", "build"].includes(kind) || !log || extra.length) + throw new Error("usage: quixos-qx check-committed workspace|interface|package|build REPOSITORY COMMIT LOG_FILE"); process.stdout.write( - `${await buildImmutableCandidate({ repository, commit }, kind as "workspace" | "interface" | "package", log)}\n`, + `${await buildImmutableCandidate({ repository, commit }, kind as "workspace" | "interface" | "package" | "build", log)}\n`, ); return; } if (!command || command === "--help" || args.includes("--help")) { process.stdout.write( - "quixos-qx: author-check, author-contract, converge, worklist, inspect, resources, check-committed, source-baseline, scaffold-package, scaffold-interface, scaffold-function, scaffold-query, scaffold-dependency, scaffold-structure, scaffold-resume, pin-upgrade, parse, lint, format\n" + + "quixos-qx: author-check, author-contract, converge, worklist, inspect, resources, check-committed, source-baseline, scaffold-package, scaffold-interface, scaffold-build, scaffold-function, scaffold-query, scaffold-dependency, scaffold-structure, scaffold-resume, pin-upgrade, parse, lint, format\n" + "inspect WORKBENCH [RESOURCE] shows provisional contracts, with explicit historical fallback; never verification evidence.\n" + "resources WORKBENCH lists registered editable repositories. Use qx-workspace for the workspace authoring workflow.\n", ); @@ -226,7 +226,7 @@ const main = async () => { if (flags.length && !flags[0].startsWith("--")) { repository = flags.shift(); commit = flags.shift(); - } else if (root && ["interface", "package"].includes(kind) && name) { + } else if (root && ["interface", "package", "build"].includes(kind) && name) { const context = await authoringContext(root); const alias = await realpath(path.join(context.workbench, `${kind}s`, name)).catch(() => null); const matches = context.resources.filter( @@ -256,15 +256,17 @@ const main = async () => { } if ( !root || - !["interface", "package"].includes(kind) || + !["interface", "package", "build"].includes(kind) || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(name ?? "") || !repository || !commit || flags.some((flag) => flag !== "--write") ) - throw new Error("usage: quixos-qx scaffold-dependency ROOT interface|package NAME REPOSITORY COMMIT [--write]"); - const resourceKind = kind as "package" | "interface"; - let entrypoint: "workspace" | "package" | "interface" | undefined; + throw new Error( + "usage: quixos-qx scaffold-dependency ROOT interface|package|build NAME REPOSITORY COMMIT [--write]", + ); + const resourceKind = kind as "package" | "interface" | "build"; + let entrypoint: "workspace" | "package" | "interface" | "build" | undefined; for (const candidate of ["workspace", "package", "interface"] as const) { try { await readFile(path.join(root, `${candidate}.qx`)); @@ -274,7 +276,14 @@ const main = async () => { if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error; } } - if (!entrypoint) throw new Error("No QX repository entrypoint"); + if (!entrypoint) { + const context = await authoringContext(root); + const selected = context.resources.find( + (entry) => path.join(context.workbench, entry.directory) === path.resolve(root), + ); + if (selected?.kind !== "build") throw new Error("No QX repository entrypoint"); + entrypoint = "build"; + } const lock = await loadQuixosLock(path.join(root, "quixos.lock")); if (!lock.ok) throw new Error("Invalid resource lock"); let target = "quixos.lock"; @@ -288,7 +297,9 @@ const main = async () => { source: await authorSource(root), validation: "syntax", files: [ - { file: `${entrypoint}.qx`, edits: [{ operation: "import", kind: resourceKind, name }] }, + ...(entrypoint !== "build" && resourceKind !== "build" + ? [{ file: `${entrypoint}.qx`, edits: [{ operation: "import" as const, kind: resourceKind, name }] }] + : []), { file: target, edits: [{ operation: "dependency", kind: resourceKind, name, source: { repository, commit } }], @@ -301,26 +312,45 @@ const main = async () => { ); return; } - if (command === "scaffold-interface") { + if (command === "scaffold-interface" || command === "scaffold-build") { + const isBuild = command === "scaffold-build"; const [root, specFile, ...flags] = args; if (!root || !specFile || flags.some((flag) => flag !== "--write")) - throw new Error("usage: quixos-qx scaffold-interface ROOT SPEC_JSON [--write]"); + throw new Error("usage: quixos-qx scaffold-interface|scaffold-build ROOT SPEC_JSON [--write]"); const spec = (await readSpec(specFile)) as ScaffoldRecipe; - if (!spec.name || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(spec.name) || !spec.id || !spec.revision || !spec.tools?.quixos) - throw new Error("Interface scaffold requires name, id, revision and Quixos toolchain source"); + if ( + !spec.name || + !/^[A-Za-z_][A-Za-z0-9_]*$/.test(spec.name) || + (!isBuild && (!spec.id || !spec.revision)) || + !spec.tools?.quixos + ) + throw new Error( + isBuild + ? "Build scaffold requires name and Quixos toolchain source" + : "Interface scaffold requires name, id, revision and Quixos toolchain source", + ); const request: StructuralRequest = { - kind: "interface", + kind: isBuild ? "build" : "interface", // Like package scaffolding, declaration creation is provisional. Imports // can be attached next; the normal check verifies the complete graph. validation: "syntax", source: spec.source, files: [ - { - file: "interface.qx", - create: - spec.declaration ?? - `interface ${spec.name} id ${JSON.stringify(spec.id)} revision ${JSON.stringify(spec.revision)} {\n}\n`, - }, + ...(!isBuild + ? [ + { + file: "interface.qx", + create: + spec.declaration ?? + `interface ${spec.name} id ${JSON.stringify(spec.id)} revision ${JSON.stringify(spec.revision)} {\n}\n`, + }, + ] + : [ + { + file: "README.md", + create: `# ${spec.name}\n\nManaged build dependency. Consumers select sources or Nix outputs through context.dependencies.\n`, + }, + ]), { file: "quixos.lock", create: formatQuixosLock({ diff --git a/src/capability-language/workspace-cli.ts b/src/capability-language/workspace-cli.ts index e7ddac0..82b4ac0 100644 --- a/src/capability-language/workspace-cli.ts +++ b/src/capability-language/workspace-cli.ts @@ -83,11 +83,15 @@ const main = async () => { kind: node.kind, source: node.source, directory: node.directory, - resourceId: - node.resource.kind === "interface" - ? node.resource.revision.interfaceId - : node.resource.revision.packageId, - revisionId: node.resource.revision.revisionId, + ...(node.resource.kind === "build" + ? {} + : { + resourceId: + node.resource.kind === "interface" + ? node.resource.revision.interfaceId + : node.resource.revision.packageId, + revisionId: node.resource.revision.revisionId, + }), dependencies: [...node.dependencies.entries()].map(([binding, dependency]) => ({ binding, resourceKey: dependency.key, @@ -108,14 +112,15 @@ const main = async () => { } if (options.schemasOut) { const schemas: Record = {}; - for (const node of assembled.resources.filter((entry) => entry.kind === "package")) { + for (const node of assembled.capabilityResources.filter((entry) => entry.kind === "package")) { const closure = new Map(); const visit = (entry: typeof node) => { - if (closure.has(entry.key)) return; + if (closure.has(entry.key) || entry.kind === "build") return; closure.set(entry.key, entry); entry.dependencies.forEach(visit); }; visit(node); + if (node.resource.kind !== "package") continue; schemas[node.resource.revision.revisionId] = specializeBindingSchema( bindingSchema({ resources: [...closure.values()] }), candidate, diff --git a/src/execution-world/client-contracts.ts b/src/execution-world/client-contracts.ts index 5dc58fd..7f99735 100644 --- a/src/execution-world/client-contracts.ts +++ b/src/execution-world/client-contracts.ts @@ -137,6 +137,7 @@ export function generatePackageQueryClientBindings( export function generateComponentClientBindings(plan: ExecutionPlan, packageRevision: string): string { const pkg = plan.definition.workspace.packageImports.find((pkg) => pkg.revisionId === packageRevision); const components = plan.definition.packages.find((pkg) => pkg.revision === packageRevision)?.components; + const modules = plan.definition.packages.find((pkg) => pkg.revision === packageRevision)?.modules ?? []; if (!pkg || !components?.length) throw new ExecutionPlanError("NO_COMPONENT_CONTRACT", packageRevision, "Package declares no component entries"); const byId = new Map(plan.definition.workspace.interfaceImports.map((iface) => [iface.revisionId as string, iface])); @@ -166,12 +167,15 @@ export function generateComponentClientBindings(plan: ExecutionPlan, packageRevi subjectBindings + "\n" + queries + - "\nexport interface Components {\n" + + "\nexport interface ModuleProps {}\n" + + "export type ExtraModuleProps = K extends keyof ModuleProps ? ModuleProps[K] : {};\n" + + "export interface Modules {\n" + components - .map( - (component) => - `${JSON.stringify(component.displayName)}: ComponentType>;`, - ) + .map((component) => { + const module = modules.find((module) => module.id === component.id)!; + const key = JSON.stringify([module.interfaceRevisionId, module.memberId]); + return `${JSON.stringify(component.displayName)}: ComponentType & ExtraModuleProps<${JSON.stringify(key)}>>;`; + }) .join("\n") + "\n}\n" ); diff --git a/src/execution-world/receipts.ts b/src/execution-world/receipts.ts index b2de639..689c6af 100644 --- a/src/execution-world/receipts.ts +++ b/src/execution-world/receipts.ts @@ -39,7 +39,13 @@ export function expectedArtifactReceipt( // A process service may implement transactions in any language. Only the // checked JS module path promises generated TypeScript adapter evidence. const available = new Set( - manifest.implementations.filter((i) => i.compatibility === "quixos-js-module-v1").map((i) => i.target), + manifest.implementations + .filter( + (i) => + i.compatibility === "quixos-js-module-v1" && + i.exports.some((id) => pkg.exports.some((entry) => entry.id === id && entry.execution.kind !== "remote")), + ) + .map((i) => i.target), ); const targets = [ ...new Set( diff --git a/src/resource-lock/generated/QuixosLock.interp b/src/resource-lock/generated/QuixosLock.interp index 256f43b..083e8bf 100644 --- a/src/resource-lock/generated/QuixosLock.interp +++ b/src/resource-lock/generated/QuixosLock.interp @@ -7,6 +7,7 @@ null 'source' 'interface' 'package' +'build' 'repository' 'commit' 'policy' @@ -34,6 +35,7 @@ QUIXOS SOURCE INTERFACE PACKAGE +BUILD REPOSITORY COMMIT POLICY @@ -66,4 +68,4 @@ stringLiteral atn: -[4, 1, 24, 87, 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, 1, 0, 1, 0, 3, 0, 23, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 5, 0, 31, 8, 0, 10, 0, 12, 0, 34, 9, 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, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 74, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 0, 0, 10, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 0, 2, 1, 0, 6, 7, 1, 0, 12, 14, 81, 0, 20, 1, 0, 0, 0, 2, 38, 1, 0, 0, 0, 4, 42, 1, 0, 0, 0, 6, 47, 1, 0, 0, 0, 8, 51, 1, 0, 0, 0, 10, 53, 1, 0, 0, 0, 12, 62, 1, 0, 0, 0, 14, 80, 1, 0, 0, 0, 16, 82, 1, 0, 0, 0, 18, 84, 1, 0, 0, 0, 20, 22, 5, 1, 0, 0, 21, 23, 5, 2, 0, 0, 22, 21, 1, 0, 0, 0, 22, 23, 1, 0, 0, 0, 23, 24, 1, 0, 0, 0, 24, 25, 5, 3, 0, 0, 25, 26, 5, 19, 0, 0, 26, 32, 5, 16, 0, 0, 27, 31, 3, 2, 1, 0, 28, 31, 3, 6, 3, 0, 29, 31, 3, 4, 2, 0, 30, 27, 1, 0, 0, 0, 30, 28, 1, 0, 0, 0, 30, 29, 1, 0, 0, 0, 31, 34, 1, 0, 0, 0, 32, 30, 1, 0, 0, 0, 32, 33, 1, 0, 0, 0, 33, 35, 1, 0, 0, 0, 34, 32, 1, 0, 0, 0, 35, 36, 5, 17, 0, 0, 36, 37, 5, 0, 0, 1, 37, 1, 1, 0, 0, 0, 38, 39, 5, 4, 0, 0, 39, 40, 5, 5, 0, 0, 40, 41, 3, 12, 6, 0, 41, 3, 1, 0, 0, 0, 42, 43, 3, 8, 4, 0, 43, 44, 3, 16, 8, 0, 44, 45, 5, 5, 0, 0, 45, 46, 3, 10, 5, 0, 46, 5, 1, 0, 0, 0, 47, 48, 5, 15, 0, 0, 48, 49, 3, 18, 9, 0, 49, 50, 5, 18, 0, 0, 50, 7, 1, 0, 0, 0, 51, 52, 7, 0, 0, 0, 52, 9, 1, 0, 0, 0, 53, 54, 5, 16, 0, 0, 54, 55, 5, 8, 0, 0, 55, 56, 3, 18, 9, 0, 56, 57, 5, 18, 0, 0, 57, 58, 5, 9, 0, 0, 58, 59, 3, 18, 9, 0, 59, 60, 5, 18, 0, 0, 60, 61, 5, 17, 0, 0, 61, 11, 1, 0, 0, 0, 62, 63, 5, 16, 0, 0, 63, 64, 5, 8, 0, 0, 64, 65, 3, 18, 9, 0, 65, 73, 5, 18, 0, 0, 66, 67, 5, 10, 0, 0, 67, 68, 3, 14, 7, 0, 68, 69, 5, 18, 0, 0, 69, 70, 5, 11, 0, 0, 70, 71, 3, 18, 9, 0, 71, 72, 5, 18, 0, 0, 72, 74, 1, 0, 0, 0, 73, 66, 1, 0, 0, 0, 73, 74, 1, 0, 0, 0, 74, 75, 1, 0, 0, 0, 75, 76, 5, 9, 0, 0, 76, 77, 3, 18, 9, 0, 77, 78, 5, 18, 0, 0, 78, 79, 5, 17, 0, 0, 79, 13, 1, 0, 0, 0, 80, 81, 7, 1, 0, 0, 81, 15, 1, 0, 0, 0, 82, 83, 5, 20, 0, 0, 83, 17, 1, 0, 0, 0, 84, 85, 5, 21, 0, 0, 85, 19, 1, 0, 0, 0, 4, 22, 30, 32, 73] \ No newline at end of file +[4, 1, 25, 87, 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, 1, 0, 1, 0, 3, 0, 23, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 5, 0, 31, 8, 0, 10, 0, 12, 0, 34, 9, 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, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 74, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 0, 0, 10, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 0, 2, 1, 0, 6, 8, 1, 0, 13, 15, 81, 0, 20, 1, 0, 0, 0, 2, 38, 1, 0, 0, 0, 4, 42, 1, 0, 0, 0, 6, 47, 1, 0, 0, 0, 8, 51, 1, 0, 0, 0, 10, 53, 1, 0, 0, 0, 12, 62, 1, 0, 0, 0, 14, 80, 1, 0, 0, 0, 16, 82, 1, 0, 0, 0, 18, 84, 1, 0, 0, 0, 20, 22, 5, 1, 0, 0, 21, 23, 5, 2, 0, 0, 22, 21, 1, 0, 0, 0, 22, 23, 1, 0, 0, 0, 23, 24, 1, 0, 0, 0, 24, 25, 5, 3, 0, 0, 25, 26, 5, 20, 0, 0, 26, 32, 5, 17, 0, 0, 27, 31, 3, 2, 1, 0, 28, 31, 3, 6, 3, 0, 29, 31, 3, 4, 2, 0, 30, 27, 1, 0, 0, 0, 30, 28, 1, 0, 0, 0, 30, 29, 1, 0, 0, 0, 31, 34, 1, 0, 0, 0, 32, 30, 1, 0, 0, 0, 32, 33, 1, 0, 0, 0, 33, 35, 1, 0, 0, 0, 34, 32, 1, 0, 0, 0, 35, 36, 5, 18, 0, 0, 36, 37, 5, 0, 0, 1, 37, 1, 1, 0, 0, 0, 38, 39, 5, 4, 0, 0, 39, 40, 5, 5, 0, 0, 40, 41, 3, 12, 6, 0, 41, 3, 1, 0, 0, 0, 42, 43, 3, 8, 4, 0, 43, 44, 3, 16, 8, 0, 44, 45, 5, 5, 0, 0, 45, 46, 3, 10, 5, 0, 46, 5, 1, 0, 0, 0, 47, 48, 5, 16, 0, 0, 48, 49, 3, 18, 9, 0, 49, 50, 5, 19, 0, 0, 50, 7, 1, 0, 0, 0, 51, 52, 7, 0, 0, 0, 52, 9, 1, 0, 0, 0, 53, 54, 5, 17, 0, 0, 54, 55, 5, 9, 0, 0, 55, 56, 3, 18, 9, 0, 56, 57, 5, 19, 0, 0, 57, 58, 5, 10, 0, 0, 58, 59, 3, 18, 9, 0, 59, 60, 5, 19, 0, 0, 60, 61, 5, 18, 0, 0, 61, 11, 1, 0, 0, 0, 62, 63, 5, 17, 0, 0, 63, 64, 5, 9, 0, 0, 64, 65, 3, 18, 9, 0, 65, 73, 5, 19, 0, 0, 66, 67, 5, 11, 0, 0, 67, 68, 3, 14, 7, 0, 68, 69, 5, 19, 0, 0, 69, 70, 5, 12, 0, 0, 70, 71, 3, 18, 9, 0, 71, 72, 5, 19, 0, 0, 72, 74, 1, 0, 0, 0, 73, 66, 1, 0, 0, 0, 73, 74, 1, 0, 0, 0, 74, 75, 1, 0, 0, 0, 75, 76, 5, 10, 0, 0, 76, 77, 3, 18, 9, 0, 77, 78, 5, 19, 0, 0, 78, 79, 5, 18, 0, 0, 79, 13, 1, 0, 0, 0, 80, 81, 7, 1, 0, 0, 81, 15, 1, 0, 0, 0, 82, 83, 5, 21, 0, 0, 83, 17, 1, 0, 0, 0, 84, 85, 5, 22, 0, 0, 85, 19, 1, 0, 0, 0, 4, 22, 30, 32, 73] \ No newline at end of file diff --git a/src/resource-lock/generated/QuixosLock.tokens b/src/resource-lock/generated/QuixosLock.tokens index fe6ae89..19c20a7 100644 --- a/src/resource-lock/generated/QuixosLock.tokens +++ b/src/resource-lock/generated/QuixosLock.tokens @@ -5,23 +5,24 @@ QUIXOS=4 SOURCE=5 INTERFACE=6 PACKAGE=7 -REPOSITORY=8 -COMMIT=9 -POLICY=10 -REF=11 -PINNED=12 -TRACK_RELEASE=13 -TRACK_DEVELOPMENT=14 -IMPORT=15 -LBRACE=16 -RBRACE=17 -SEMI=18 -INTEGER=19 -IDENTIFIER=20 -STRING_LITERAL=21 -LINE_COMMENT=22 -BLOCK_COMMENT=23 -WS=24 +BUILD=8 +REPOSITORY=9 +COMMIT=10 +POLICY=11 +REF=12 +PINNED=13 +TRACK_RELEASE=14 +TRACK_DEVELOPMENT=15 +IMPORT=16 +LBRACE=17 +RBRACE=18 +SEMI=19 +INTEGER=20 +IDENTIFIER=21 +STRING_LITERAL=22 +LINE_COMMENT=23 +BLOCK_COMMENT=24 +WS=25 'quixos-lock'=1 'fragment'=2 'version'=3 @@ -29,14 +30,15 @@ WS=24 'source'=5 'interface'=6 'package'=7 -'repository'=8 -'commit'=9 -'policy'=10 -'ref'=11 -'pinned'=12 -'track-release'=13 -'track-development'=14 -'import'=15 -'{'=16 -'}'=17 -';'=18 +'build'=8 +'repository'=9 +'commit'=10 +'policy'=11 +'ref'=12 +'pinned'=13 +'track-release'=14 +'track-development'=15 +'import'=16 +'{'=17 +'}'=18 +';'=19 diff --git a/src/resource-lock/generated/QuixosLockLexer.interp b/src/resource-lock/generated/QuixosLockLexer.interp index 81c332d..9f53487 100644 --- a/src/resource-lock/generated/QuixosLockLexer.interp +++ b/src/resource-lock/generated/QuixosLockLexer.interp @@ -7,6 +7,7 @@ null 'source' 'interface' 'package' +'build' 'repository' 'commit' 'policy' @@ -34,6 +35,7 @@ QUIXOS SOURCE INTERFACE PACKAGE +BUILD REPOSITORY COMMIT POLICY @@ -60,6 +62,7 @@ QUIXOS SOURCE INTERFACE PACKAGE +BUILD REPOSITORY COMMIT POLICY @@ -88,4 +91,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 24, 261, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 4, 18, 197, 8, 18, 11, 18, 12, 18, 198, 1, 19, 1, 19, 5, 19, 203, 8, 19, 10, 19, 12, 19, 206, 9, 19, 1, 20, 1, 20, 1, 20, 5, 20, 211, 8, 20, 10, 20, 12, 20, 214, 9, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 226, 8, 21, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 234, 8, 23, 10, 23, 12, 23, 237, 9, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 5, 24, 245, 8, 24, 10, 24, 12, 24, 248, 9, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 4, 25, 256, 8, 25, 11, 25, 12, 25, 257, 1, 25, 1, 25, 1, 246, 0, 26, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 0, 45, 0, 47, 22, 49, 23, 51, 24, 1, 0, 8, 1, 0, 48, 57, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 266, 0, 1, 1, 0, 0, 0, 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, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 1, 53, 1, 0, 0, 0, 3, 65, 1, 0, 0, 0, 5, 74, 1, 0, 0, 0, 7, 82, 1, 0, 0, 0, 9, 89, 1, 0, 0, 0, 11, 96, 1, 0, 0, 0, 13, 106, 1, 0, 0, 0, 15, 114, 1, 0, 0, 0, 17, 125, 1, 0, 0, 0, 19, 132, 1, 0, 0, 0, 21, 139, 1, 0, 0, 0, 23, 143, 1, 0, 0, 0, 25, 150, 1, 0, 0, 0, 27, 164, 1, 0, 0, 0, 29, 182, 1, 0, 0, 0, 31, 189, 1, 0, 0, 0, 33, 191, 1, 0, 0, 0, 35, 193, 1, 0, 0, 0, 37, 196, 1, 0, 0, 0, 39, 200, 1, 0, 0, 0, 41, 207, 1, 0, 0, 0, 43, 217, 1, 0, 0, 0, 45, 227, 1, 0, 0, 0, 47, 229, 1, 0, 0, 0, 49, 240, 1, 0, 0, 0, 51, 255, 1, 0, 0, 0, 53, 54, 5, 113, 0, 0, 54, 55, 5, 117, 0, 0, 55, 56, 5, 105, 0, 0, 56, 57, 5, 120, 0, 0, 57, 58, 5, 111, 0, 0, 58, 59, 5, 115, 0, 0, 59, 60, 5, 45, 0, 0, 60, 61, 5, 108, 0, 0, 61, 62, 5, 111, 0, 0, 62, 63, 5, 99, 0, 0, 63, 64, 5, 107, 0, 0, 64, 2, 1, 0, 0, 0, 65, 66, 5, 102, 0, 0, 66, 67, 5, 114, 0, 0, 67, 68, 5, 97, 0, 0, 68, 69, 5, 103, 0, 0, 69, 70, 5, 109, 0, 0, 70, 71, 5, 101, 0, 0, 71, 72, 5, 110, 0, 0, 72, 73, 5, 116, 0, 0, 73, 4, 1, 0, 0, 0, 74, 75, 5, 118, 0, 0, 75, 76, 5, 101, 0, 0, 76, 77, 5, 114, 0, 0, 77, 78, 5, 115, 0, 0, 78, 79, 5, 105, 0, 0, 79, 80, 5, 111, 0, 0, 80, 81, 5, 110, 0, 0, 81, 6, 1, 0, 0, 0, 82, 83, 5, 113, 0, 0, 83, 84, 5, 117, 0, 0, 84, 85, 5, 105, 0, 0, 85, 86, 5, 120, 0, 0, 86, 87, 5, 111, 0, 0, 87, 88, 5, 115, 0, 0, 88, 8, 1, 0, 0, 0, 89, 90, 5, 115, 0, 0, 90, 91, 5, 111, 0, 0, 91, 92, 5, 117, 0, 0, 92, 93, 5, 114, 0, 0, 93, 94, 5, 99, 0, 0, 94, 95, 5, 101, 0, 0, 95, 10, 1, 0, 0, 0, 96, 97, 5, 105, 0, 0, 97, 98, 5, 110, 0, 0, 98, 99, 5, 116, 0, 0, 99, 100, 5, 101, 0, 0, 100, 101, 5, 114, 0, 0, 101, 102, 5, 102, 0, 0, 102, 103, 5, 97, 0, 0, 103, 104, 5, 99, 0, 0, 104, 105, 5, 101, 0, 0, 105, 12, 1, 0, 0, 0, 106, 107, 5, 112, 0, 0, 107, 108, 5, 97, 0, 0, 108, 109, 5, 99, 0, 0, 109, 110, 5, 107, 0, 0, 110, 111, 5, 97, 0, 0, 111, 112, 5, 103, 0, 0, 112, 113, 5, 101, 0, 0, 113, 14, 1, 0, 0, 0, 114, 115, 5, 114, 0, 0, 115, 116, 5, 101, 0, 0, 116, 117, 5, 112, 0, 0, 117, 118, 5, 111, 0, 0, 118, 119, 5, 115, 0, 0, 119, 120, 5, 105, 0, 0, 120, 121, 5, 116, 0, 0, 121, 122, 5, 111, 0, 0, 122, 123, 5, 114, 0, 0, 123, 124, 5, 121, 0, 0, 124, 16, 1, 0, 0, 0, 125, 126, 5, 99, 0, 0, 126, 127, 5, 111, 0, 0, 127, 128, 5, 109, 0, 0, 128, 129, 5, 109, 0, 0, 129, 130, 5, 105, 0, 0, 130, 131, 5, 116, 0, 0, 131, 18, 1, 0, 0, 0, 132, 133, 5, 112, 0, 0, 133, 134, 5, 111, 0, 0, 134, 135, 5, 108, 0, 0, 135, 136, 5, 105, 0, 0, 136, 137, 5, 99, 0, 0, 137, 138, 5, 121, 0, 0, 138, 20, 1, 0, 0, 0, 139, 140, 5, 114, 0, 0, 140, 141, 5, 101, 0, 0, 141, 142, 5, 102, 0, 0, 142, 22, 1, 0, 0, 0, 143, 144, 5, 112, 0, 0, 144, 145, 5, 105, 0, 0, 145, 146, 5, 110, 0, 0, 146, 147, 5, 110, 0, 0, 147, 148, 5, 101, 0, 0, 148, 149, 5, 100, 0, 0, 149, 24, 1, 0, 0, 0, 150, 151, 5, 116, 0, 0, 151, 152, 5, 114, 0, 0, 152, 153, 5, 97, 0, 0, 153, 154, 5, 99, 0, 0, 154, 155, 5, 107, 0, 0, 155, 156, 5, 45, 0, 0, 156, 157, 5, 114, 0, 0, 157, 158, 5, 101, 0, 0, 158, 159, 5, 108, 0, 0, 159, 160, 5, 101, 0, 0, 160, 161, 5, 97, 0, 0, 161, 162, 5, 115, 0, 0, 162, 163, 5, 101, 0, 0, 163, 26, 1, 0, 0, 0, 164, 165, 5, 116, 0, 0, 165, 166, 5, 114, 0, 0, 166, 167, 5, 97, 0, 0, 167, 168, 5, 99, 0, 0, 168, 169, 5, 107, 0, 0, 169, 170, 5, 45, 0, 0, 170, 171, 5, 100, 0, 0, 171, 172, 5, 101, 0, 0, 172, 173, 5, 118, 0, 0, 173, 174, 5, 101, 0, 0, 174, 175, 5, 108, 0, 0, 175, 176, 5, 111, 0, 0, 176, 177, 5, 112, 0, 0, 177, 178, 5, 109, 0, 0, 178, 179, 5, 101, 0, 0, 179, 180, 5, 110, 0, 0, 180, 181, 5, 116, 0, 0, 181, 28, 1, 0, 0, 0, 182, 183, 5, 105, 0, 0, 183, 184, 5, 109, 0, 0, 184, 185, 5, 112, 0, 0, 185, 186, 5, 111, 0, 0, 186, 187, 5, 114, 0, 0, 187, 188, 5, 116, 0, 0, 188, 30, 1, 0, 0, 0, 189, 190, 5, 123, 0, 0, 190, 32, 1, 0, 0, 0, 191, 192, 5, 125, 0, 0, 192, 34, 1, 0, 0, 0, 193, 194, 5, 59, 0, 0, 194, 36, 1, 0, 0, 0, 195, 197, 7, 0, 0, 0, 196, 195, 1, 0, 0, 0, 197, 198, 1, 0, 0, 0, 198, 196, 1, 0, 0, 0, 198, 199, 1, 0, 0, 0, 199, 38, 1, 0, 0, 0, 200, 204, 7, 1, 0, 0, 201, 203, 7, 2, 0, 0, 202, 201, 1, 0, 0, 0, 203, 206, 1, 0, 0, 0, 204, 202, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 40, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 207, 212, 5, 34, 0, 0, 208, 211, 3, 43, 21, 0, 209, 211, 8, 3, 0, 0, 210, 208, 1, 0, 0, 0, 210, 209, 1, 0, 0, 0, 211, 214, 1, 0, 0, 0, 212, 210, 1, 0, 0, 0, 212, 213, 1, 0, 0, 0, 213, 215, 1, 0, 0, 0, 214, 212, 1, 0, 0, 0, 215, 216, 5, 34, 0, 0, 216, 42, 1, 0, 0, 0, 217, 225, 5, 92, 0, 0, 218, 226, 7, 4, 0, 0, 219, 220, 5, 117, 0, 0, 220, 221, 3, 45, 22, 0, 221, 222, 3, 45, 22, 0, 222, 223, 3, 45, 22, 0, 223, 224, 3, 45, 22, 0, 224, 226, 1, 0, 0, 0, 225, 218, 1, 0, 0, 0, 225, 219, 1, 0, 0, 0, 226, 44, 1, 0, 0, 0, 227, 228, 7, 5, 0, 0, 228, 46, 1, 0, 0, 0, 229, 230, 5, 47, 0, 0, 230, 231, 5, 47, 0, 0, 231, 235, 1, 0, 0, 0, 232, 234, 8, 6, 0, 0, 233, 232, 1, 0, 0, 0, 234, 237, 1, 0, 0, 0, 235, 233, 1, 0, 0, 0, 235, 236, 1, 0, 0, 0, 236, 238, 1, 0, 0, 0, 237, 235, 1, 0, 0, 0, 238, 239, 6, 23, 0, 0, 239, 48, 1, 0, 0, 0, 240, 241, 5, 47, 0, 0, 241, 242, 5, 42, 0, 0, 242, 246, 1, 0, 0, 0, 243, 245, 9, 0, 0, 0, 244, 243, 1, 0, 0, 0, 245, 248, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 246, 244, 1, 0, 0, 0, 247, 249, 1, 0, 0, 0, 248, 246, 1, 0, 0, 0, 249, 250, 5, 42, 0, 0, 250, 251, 5, 47, 0, 0, 251, 252, 1, 0, 0, 0, 252, 253, 6, 24, 0, 0, 253, 50, 1, 0, 0, 0, 254, 256, 7, 7, 0, 0, 255, 254, 1, 0, 0, 0, 256, 257, 1, 0, 0, 0, 257, 255, 1, 0, 0, 0, 257, 258, 1, 0, 0, 0, 258, 259, 1, 0, 0, 0, 259, 260, 6, 25, 0, 0, 260, 52, 1, 0, 0, 0, 9, 0, 198, 204, 210, 212, 225, 235, 246, 257, 1, 6, 0, 0] \ No newline at end of file +[4, 0, 25, 269, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 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, 16, 1, 16, 1, 17, 1, 17, 1, 18, 1, 18, 1, 19, 4, 19, 205, 8, 19, 11, 19, 12, 19, 206, 1, 20, 1, 20, 5, 20, 211, 8, 20, 10, 20, 12, 20, 214, 9, 20, 1, 21, 1, 21, 1, 21, 5, 21, 219, 8, 21, 10, 21, 12, 21, 222, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 234, 8, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 5, 24, 242, 8, 24, 10, 24, 12, 24, 245, 9, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 5, 25, 253, 8, 25, 10, 25, 12, 25, 256, 9, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 4, 26, 264, 8, 26, 11, 26, 12, 26, 265, 1, 26, 1, 26, 1, 254, 0, 27, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 0, 47, 0, 49, 23, 51, 24, 53, 25, 1, 0, 8, 1, 0, 48, 57, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 274, 0, 1, 1, 0, 0, 0, 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, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 1, 55, 1, 0, 0, 0, 3, 67, 1, 0, 0, 0, 5, 76, 1, 0, 0, 0, 7, 84, 1, 0, 0, 0, 9, 91, 1, 0, 0, 0, 11, 98, 1, 0, 0, 0, 13, 108, 1, 0, 0, 0, 15, 116, 1, 0, 0, 0, 17, 122, 1, 0, 0, 0, 19, 133, 1, 0, 0, 0, 21, 140, 1, 0, 0, 0, 23, 147, 1, 0, 0, 0, 25, 151, 1, 0, 0, 0, 27, 158, 1, 0, 0, 0, 29, 172, 1, 0, 0, 0, 31, 190, 1, 0, 0, 0, 33, 197, 1, 0, 0, 0, 35, 199, 1, 0, 0, 0, 37, 201, 1, 0, 0, 0, 39, 204, 1, 0, 0, 0, 41, 208, 1, 0, 0, 0, 43, 215, 1, 0, 0, 0, 45, 225, 1, 0, 0, 0, 47, 235, 1, 0, 0, 0, 49, 237, 1, 0, 0, 0, 51, 248, 1, 0, 0, 0, 53, 263, 1, 0, 0, 0, 55, 56, 5, 113, 0, 0, 56, 57, 5, 117, 0, 0, 57, 58, 5, 105, 0, 0, 58, 59, 5, 120, 0, 0, 59, 60, 5, 111, 0, 0, 60, 61, 5, 115, 0, 0, 61, 62, 5, 45, 0, 0, 62, 63, 5, 108, 0, 0, 63, 64, 5, 111, 0, 0, 64, 65, 5, 99, 0, 0, 65, 66, 5, 107, 0, 0, 66, 2, 1, 0, 0, 0, 67, 68, 5, 102, 0, 0, 68, 69, 5, 114, 0, 0, 69, 70, 5, 97, 0, 0, 70, 71, 5, 103, 0, 0, 71, 72, 5, 109, 0, 0, 72, 73, 5, 101, 0, 0, 73, 74, 5, 110, 0, 0, 74, 75, 5, 116, 0, 0, 75, 4, 1, 0, 0, 0, 76, 77, 5, 118, 0, 0, 77, 78, 5, 101, 0, 0, 78, 79, 5, 114, 0, 0, 79, 80, 5, 115, 0, 0, 80, 81, 5, 105, 0, 0, 81, 82, 5, 111, 0, 0, 82, 83, 5, 110, 0, 0, 83, 6, 1, 0, 0, 0, 84, 85, 5, 113, 0, 0, 85, 86, 5, 117, 0, 0, 86, 87, 5, 105, 0, 0, 87, 88, 5, 120, 0, 0, 88, 89, 5, 111, 0, 0, 89, 90, 5, 115, 0, 0, 90, 8, 1, 0, 0, 0, 91, 92, 5, 115, 0, 0, 92, 93, 5, 111, 0, 0, 93, 94, 5, 117, 0, 0, 94, 95, 5, 114, 0, 0, 95, 96, 5, 99, 0, 0, 96, 97, 5, 101, 0, 0, 97, 10, 1, 0, 0, 0, 98, 99, 5, 105, 0, 0, 99, 100, 5, 110, 0, 0, 100, 101, 5, 116, 0, 0, 101, 102, 5, 101, 0, 0, 102, 103, 5, 114, 0, 0, 103, 104, 5, 102, 0, 0, 104, 105, 5, 97, 0, 0, 105, 106, 5, 99, 0, 0, 106, 107, 5, 101, 0, 0, 107, 12, 1, 0, 0, 0, 108, 109, 5, 112, 0, 0, 109, 110, 5, 97, 0, 0, 110, 111, 5, 99, 0, 0, 111, 112, 5, 107, 0, 0, 112, 113, 5, 97, 0, 0, 113, 114, 5, 103, 0, 0, 114, 115, 5, 101, 0, 0, 115, 14, 1, 0, 0, 0, 116, 117, 5, 98, 0, 0, 117, 118, 5, 117, 0, 0, 118, 119, 5, 105, 0, 0, 119, 120, 5, 108, 0, 0, 120, 121, 5, 100, 0, 0, 121, 16, 1, 0, 0, 0, 122, 123, 5, 114, 0, 0, 123, 124, 5, 101, 0, 0, 124, 125, 5, 112, 0, 0, 125, 126, 5, 111, 0, 0, 126, 127, 5, 115, 0, 0, 127, 128, 5, 105, 0, 0, 128, 129, 5, 116, 0, 0, 129, 130, 5, 111, 0, 0, 130, 131, 5, 114, 0, 0, 131, 132, 5, 121, 0, 0, 132, 18, 1, 0, 0, 0, 133, 134, 5, 99, 0, 0, 134, 135, 5, 111, 0, 0, 135, 136, 5, 109, 0, 0, 136, 137, 5, 109, 0, 0, 137, 138, 5, 105, 0, 0, 138, 139, 5, 116, 0, 0, 139, 20, 1, 0, 0, 0, 140, 141, 5, 112, 0, 0, 141, 142, 5, 111, 0, 0, 142, 143, 5, 108, 0, 0, 143, 144, 5, 105, 0, 0, 144, 145, 5, 99, 0, 0, 145, 146, 5, 121, 0, 0, 146, 22, 1, 0, 0, 0, 147, 148, 5, 114, 0, 0, 148, 149, 5, 101, 0, 0, 149, 150, 5, 102, 0, 0, 150, 24, 1, 0, 0, 0, 151, 152, 5, 112, 0, 0, 152, 153, 5, 105, 0, 0, 153, 154, 5, 110, 0, 0, 154, 155, 5, 110, 0, 0, 155, 156, 5, 101, 0, 0, 156, 157, 5, 100, 0, 0, 157, 26, 1, 0, 0, 0, 158, 159, 5, 116, 0, 0, 159, 160, 5, 114, 0, 0, 160, 161, 5, 97, 0, 0, 161, 162, 5, 99, 0, 0, 162, 163, 5, 107, 0, 0, 163, 164, 5, 45, 0, 0, 164, 165, 5, 114, 0, 0, 165, 166, 5, 101, 0, 0, 166, 167, 5, 108, 0, 0, 167, 168, 5, 101, 0, 0, 168, 169, 5, 97, 0, 0, 169, 170, 5, 115, 0, 0, 170, 171, 5, 101, 0, 0, 171, 28, 1, 0, 0, 0, 172, 173, 5, 116, 0, 0, 173, 174, 5, 114, 0, 0, 174, 175, 5, 97, 0, 0, 175, 176, 5, 99, 0, 0, 176, 177, 5, 107, 0, 0, 177, 178, 5, 45, 0, 0, 178, 179, 5, 100, 0, 0, 179, 180, 5, 101, 0, 0, 180, 181, 5, 118, 0, 0, 181, 182, 5, 101, 0, 0, 182, 183, 5, 108, 0, 0, 183, 184, 5, 111, 0, 0, 184, 185, 5, 112, 0, 0, 185, 186, 5, 109, 0, 0, 186, 187, 5, 101, 0, 0, 187, 188, 5, 110, 0, 0, 188, 189, 5, 116, 0, 0, 189, 30, 1, 0, 0, 0, 190, 191, 5, 105, 0, 0, 191, 192, 5, 109, 0, 0, 192, 193, 5, 112, 0, 0, 193, 194, 5, 111, 0, 0, 194, 195, 5, 114, 0, 0, 195, 196, 5, 116, 0, 0, 196, 32, 1, 0, 0, 0, 197, 198, 5, 123, 0, 0, 198, 34, 1, 0, 0, 0, 199, 200, 5, 125, 0, 0, 200, 36, 1, 0, 0, 0, 201, 202, 5, 59, 0, 0, 202, 38, 1, 0, 0, 0, 203, 205, 7, 0, 0, 0, 204, 203, 1, 0, 0, 0, 205, 206, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 206, 207, 1, 0, 0, 0, 207, 40, 1, 0, 0, 0, 208, 212, 7, 1, 0, 0, 209, 211, 7, 2, 0, 0, 210, 209, 1, 0, 0, 0, 211, 214, 1, 0, 0, 0, 212, 210, 1, 0, 0, 0, 212, 213, 1, 0, 0, 0, 213, 42, 1, 0, 0, 0, 214, 212, 1, 0, 0, 0, 215, 220, 5, 34, 0, 0, 216, 219, 3, 45, 22, 0, 217, 219, 8, 3, 0, 0, 218, 216, 1, 0, 0, 0, 218, 217, 1, 0, 0, 0, 219, 222, 1, 0, 0, 0, 220, 218, 1, 0, 0, 0, 220, 221, 1, 0, 0, 0, 221, 223, 1, 0, 0, 0, 222, 220, 1, 0, 0, 0, 223, 224, 5, 34, 0, 0, 224, 44, 1, 0, 0, 0, 225, 233, 5, 92, 0, 0, 226, 234, 7, 4, 0, 0, 227, 228, 5, 117, 0, 0, 228, 229, 3, 47, 23, 0, 229, 230, 3, 47, 23, 0, 230, 231, 3, 47, 23, 0, 231, 232, 3, 47, 23, 0, 232, 234, 1, 0, 0, 0, 233, 226, 1, 0, 0, 0, 233, 227, 1, 0, 0, 0, 234, 46, 1, 0, 0, 0, 235, 236, 7, 5, 0, 0, 236, 48, 1, 0, 0, 0, 237, 238, 5, 47, 0, 0, 238, 239, 5, 47, 0, 0, 239, 243, 1, 0, 0, 0, 240, 242, 8, 6, 0, 0, 241, 240, 1, 0, 0, 0, 242, 245, 1, 0, 0, 0, 243, 241, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 246, 1, 0, 0, 0, 245, 243, 1, 0, 0, 0, 246, 247, 6, 24, 0, 0, 247, 50, 1, 0, 0, 0, 248, 249, 5, 47, 0, 0, 249, 250, 5, 42, 0, 0, 250, 254, 1, 0, 0, 0, 251, 253, 9, 0, 0, 0, 252, 251, 1, 0, 0, 0, 253, 256, 1, 0, 0, 0, 254, 255, 1, 0, 0, 0, 254, 252, 1, 0, 0, 0, 255, 257, 1, 0, 0, 0, 256, 254, 1, 0, 0, 0, 257, 258, 5, 42, 0, 0, 258, 259, 5, 47, 0, 0, 259, 260, 1, 0, 0, 0, 260, 261, 6, 25, 0, 0, 261, 52, 1, 0, 0, 0, 262, 264, 7, 7, 0, 0, 263, 262, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 263, 1, 0, 0, 0, 265, 266, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 268, 6, 26, 0, 0, 268, 54, 1, 0, 0, 0, 9, 0, 206, 212, 218, 220, 233, 243, 254, 265, 1, 6, 0, 0] \ No newline at end of file diff --git a/src/resource-lock/generated/QuixosLockLexer.tokens b/src/resource-lock/generated/QuixosLockLexer.tokens index fe6ae89..19c20a7 100644 --- a/src/resource-lock/generated/QuixosLockLexer.tokens +++ b/src/resource-lock/generated/QuixosLockLexer.tokens @@ -5,23 +5,24 @@ QUIXOS=4 SOURCE=5 INTERFACE=6 PACKAGE=7 -REPOSITORY=8 -COMMIT=9 -POLICY=10 -REF=11 -PINNED=12 -TRACK_RELEASE=13 -TRACK_DEVELOPMENT=14 -IMPORT=15 -LBRACE=16 -RBRACE=17 -SEMI=18 -INTEGER=19 -IDENTIFIER=20 -STRING_LITERAL=21 -LINE_COMMENT=22 -BLOCK_COMMENT=23 -WS=24 +BUILD=8 +REPOSITORY=9 +COMMIT=10 +POLICY=11 +REF=12 +PINNED=13 +TRACK_RELEASE=14 +TRACK_DEVELOPMENT=15 +IMPORT=16 +LBRACE=17 +RBRACE=18 +SEMI=19 +INTEGER=20 +IDENTIFIER=21 +STRING_LITERAL=22 +LINE_COMMENT=23 +BLOCK_COMMENT=24 +WS=25 'quixos-lock'=1 'fragment'=2 'version'=3 @@ -29,14 +30,15 @@ WS=24 'source'=5 'interface'=6 'package'=7 -'repository'=8 -'commit'=9 -'policy'=10 -'ref'=11 -'pinned'=12 -'track-release'=13 -'track-development'=14 -'import'=15 -'{'=16 -'}'=17 -';'=18 +'build'=8 +'repository'=9 +'commit'=10 +'policy'=11 +'ref'=12 +'pinned'=13 +'track-release'=14 +'track-development'=15 +'import'=16 +'{'=17 +'}'=18 +';'=19 diff --git a/src/resource-lock/generated/QuixosLockLexer.ts b/src/resource-lock/generated/QuixosLockLexer.ts index 30003f3..821313f 100644 --- a/src/resource-lock/generated/QuixosLockLexer.ts +++ b/src/resource-lock/generated/QuixosLockLexer.ts @@ -11,23 +11,24 @@ export class QuixosLockLexer extends antlr.Lexer { public static readonly SOURCE = 5; public static readonly INTERFACE = 6; public static readonly PACKAGE = 7; - public static readonly REPOSITORY = 8; - public static readonly COMMIT = 9; - public static readonly POLICY = 10; - public static readonly REF = 11; - public static readonly PINNED = 12; - public static readonly TRACK_RELEASE = 13; - public static readonly TRACK_DEVELOPMENT = 14; - public static readonly IMPORT = 15; - public static readonly LBRACE = 16; - public static readonly RBRACE = 17; - public static readonly SEMI = 18; - public static readonly INTEGER = 19; - public static readonly IDENTIFIER = 20; - public static readonly STRING_LITERAL = 21; - public static readonly LINE_COMMENT = 22; - public static readonly BLOCK_COMMENT = 23; - public static readonly WS = 24; + public static readonly BUILD = 8; + public static readonly REPOSITORY = 9; + public static readonly COMMIT = 10; + public static readonly POLICY = 11; + public static readonly REF = 12; + public static readonly PINNED = 13; + public static readonly TRACK_RELEASE = 14; + public static readonly TRACK_DEVELOPMENT = 15; + public static readonly IMPORT = 16; + public static readonly LBRACE = 17; + public static readonly RBRACE = 18; + public static readonly SEMI = 19; + public static readonly INTEGER = 20; + public static readonly IDENTIFIER = 21; + public static readonly STRING_LITERAL = 22; + public static readonly LINE_COMMENT = 23; + public static readonly BLOCK_COMMENT = 24; + public static readonly WS = 25; public static readonly channelNames = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" @@ -35,17 +36,17 @@ export class QuixosLockLexer extends antlr.Lexer { public static readonly literalNames = [ null, "'quixos-lock'", "'fragment'", "'version'", "'quixos'", "'source'", - "'interface'", "'package'", "'repository'", "'commit'", "'policy'", - "'ref'", "'pinned'", "'track-release'", "'track-development'", "'import'", - "'{'", "'}'", "';'" + "'interface'", "'package'", "'build'", "'repository'", "'commit'", + "'policy'", "'ref'", "'pinned'", "'track-release'", "'track-development'", + "'import'", "'{'", "'}'", "';'" ]; public static readonly symbolicNames = [ null, "QUIXOS_LOCK", "FRAGMENT", "VERSION", "QUIXOS", "SOURCE", - "INTERFACE", "PACKAGE", "REPOSITORY", "COMMIT", "POLICY", "REF", - "PINNED", "TRACK_RELEASE", "TRACK_DEVELOPMENT", "IMPORT", "LBRACE", - "RBRACE", "SEMI", "INTEGER", "IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", - "BLOCK_COMMENT", "WS" + "INTERFACE", "PACKAGE", "BUILD", "REPOSITORY", "COMMIT", "POLICY", + "REF", "PINNED", "TRACK_RELEASE", "TRACK_DEVELOPMENT", "IMPORT", + "LBRACE", "RBRACE", "SEMI", "INTEGER", "IDENTIFIER", "STRING_LITERAL", + "LINE_COMMENT", "BLOCK_COMMENT", "WS" ]; public static readonly modeNames = [ @@ -54,10 +55,10 @@ export class QuixosLockLexer extends antlr.Lexer { public static readonly ruleNames = [ "QUIXOS_LOCK", "FRAGMENT", "VERSION", "QUIXOS", "SOURCE", "INTERFACE", - "PACKAGE", "REPOSITORY", "COMMIT", "POLICY", "REF", "PINNED", "TRACK_RELEASE", - "TRACK_DEVELOPMENT", "IMPORT", "LBRACE", "RBRACE", "SEMI", "INTEGER", - "IDENTIFIER", "STRING_LITERAL", "ESC", "HEX", "LINE_COMMENT", "BLOCK_COMMENT", - "WS", + "PACKAGE", "BUILD", "REPOSITORY", "COMMIT", "POLICY", "REF", "PINNED", + "TRACK_RELEASE", "TRACK_DEVELOPMENT", "IMPORT", "LBRACE", "RBRACE", + "SEMI", "INTEGER", "IDENTIFIER", "STRING_LITERAL", "ESC", "HEX", + "LINE_COMMENT", "BLOCK_COMMENT", "WS", ]; @@ -79,99 +80,101 @@ export class QuixosLockLexer extends antlr.Lexer { public get modeNames(): string[] { return QuixosLockLexer.modeNames; } public static readonly _serializedATN: number[] = [ - 4,0,24,261,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, + 4,0,25,269,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,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1, - 3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1, - 5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1, - 7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1, - 9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1, - 11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1, - 12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1, - 13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1, - 14,1,14,1,14,1,15,1,15,1,16,1,16,1,17,1,17,1,18,4,18,197,8,18,11, - 18,12,18,198,1,19,1,19,5,19,203,8,19,10,19,12,19,206,9,19,1,20,1, - 20,1,20,5,20,211,8,20,10,20,12,20,214,9,20,1,20,1,20,1,21,1,21,1, - 21,1,21,1,21,1,21,1,21,1,21,3,21,226,8,21,1,22,1,22,1,23,1,23,1, - 23,1,23,5,23,234,8,23,10,23,12,23,237,9,23,1,23,1,23,1,24,1,24,1, - 24,1,24,5,24,245,8,24,10,24,12,24,248,9,24,1,24,1,24,1,24,1,24,1, - 24,1,25,4,25,256,8,25,11,25,12,25,257,1,25,1,25,1,246,0,26,1,1,3, - 2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13,27,14, - 29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,0,45,0,47,22,49,23, - 51,24,1,0,8,1,0,48,57,3,0,65,90,95,95,97,122,4,0,48,57,65,90,95, - 95,97,122,4,0,10,10,13,13,34,34,92,92,8,0,34,34,47,47,92,92,98,98, - 102,102,110,110,114,114,116,116,3,0,48,57,65,70,97,102,2,0,10,10, - 13,13,3,0,9,10,13,13,32,32,266,0,1,1,0,0,0,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,47,1,0,0,0,0,49,1,0,0,0, - 0,51,1,0,0,0,1,53,1,0,0,0,3,65,1,0,0,0,5,74,1,0,0,0,7,82,1,0,0,0, - 9,89,1,0,0,0,11,96,1,0,0,0,13,106,1,0,0,0,15,114,1,0,0,0,17,125, - 1,0,0,0,19,132,1,0,0,0,21,139,1,0,0,0,23,143,1,0,0,0,25,150,1,0, - 0,0,27,164,1,0,0,0,29,182,1,0,0,0,31,189,1,0,0,0,33,191,1,0,0,0, - 35,193,1,0,0,0,37,196,1,0,0,0,39,200,1,0,0,0,41,207,1,0,0,0,43,217, - 1,0,0,0,45,227,1,0,0,0,47,229,1,0,0,0,49,240,1,0,0,0,51,255,1,0, - 0,0,53,54,5,113,0,0,54,55,5,117,0,0,55,56,5,105,0,0,56,57,5,120, - 0,0,57,58,5,111,0,0,58,59,5,115,0,0,59,60,5,45,0,0,60,61,5,108,0, - 0,61,62,5,111,0,0,62,63,5,99,0,0,63,64,5,107,0,0,64,2,1,0,0,0,65, - 66,5,102,0,0,66,67,5,114,0,0,67,68,5,97,0,0,68,69,5,103,0,0,69,70, - 5,109,0,0,70,71,5,101,0,0,71,72,5,110,0,0,72,73,5,116,0,0,73,4,1, - 0,0,0,74,75,5,118,0,0,75,76,5,101,0,0,76,77,5,114,0,0,77,78,5,115, - 0,0,78,79,5,105,0,0,79,80,5,111,0,0,80,81,5,110,0,0,81,6,1,0,0,0, - 82,83,5,113,0,0,83,84,5,117,0,0,84,85,5,105,0,0,85,86,5,120,0,0, - 86,87,5,111,0,0,87,88,5,115,0,0,88,8,1,0,0,0,89,90,5,115,0,0,90, - 91,5,111,0,0,91,92,5,117,0,0,92,93,5,114,0,0,93,94,5,99,0,0,94,95, - 5,101,0,0,95,10,1,0,0,0,96,97,5,105,0,0,97,98,5,110,0,0,98,99,5, - 116,0,0,99,100,5,101,0,0,100,101,5,114,0,0,101,102,5,102,0,0,102, - 103,5,97,0,0,103,104,5,99,0,0,104,105,5,101,0,0,105,12,1,0,0,0,106, - 107,5,112,0,0,107,108,5,97,0,0,108,109,5,99,0,0,109,110,5,107,0, - 0,110,111,5,97,0,0,111,112,5,103,0,0,112,113,5,101,0,0,113,14,1, - 0,0,0,114,115,5,114,0,0,115,116,5,101,0,0,116,117,5,112,0,0,117, - 118,5,111,0,0,118,119,5,115,0,0,119,120,5,105,0,0,120,121,5,116, - 0,0,121,122,5,111,0,0,122,123,5,114,0,0,123,124,5,121,0,0,124,16, - 1,0,0,0,125,126,5,99,0,0,126,127,5,111,0,0,127,128,5,109,0,0,128, - 129,5,109,0,0,129,130,5,105,0,0,130,131,5,116,0,0,131,18,1,0,0,0, - 132,133,5,112,0,0,133,134,5,111,0,0,134,135,5,108,0,0,135,136,5, - 105,0,0,136,137,5,99,0,0,137,138,5,121,0,0,138,20,1,0,0,0,139,140, - 5,114,0,0,140,141,5,101,0,0,141,142,5,102,0,0,142,22,1,0,0,0,143, - 144,5,112,0,0,144,145,5,105,0,0,145,146,5,110,0,0,146,147,5,110, - 0,0,147,148,5,101,0,0,148,149,5,100,0,0,149,24,1,0,0,0,150,151,5, - 116,0,0,151,152,5,114,0,0,152,153,5,97,0,0,153,154,5,99,0,0,154, - 155,5,107,0,0,155,156,5,45,0,0,156,157,5,114,0,0,157,158,5,101,0, - 0,158,159,5,108,0,0,159,160,5,101,0,0,160,161,5,97,0,0,161,162,5, - 115,0,0,162,163,5,101,0,0,163,26,1,0,0,0,164,165,5,116,0,0,165,166, - 5,114,0,0,166,167,5,97,0,0,167,168,5,99,0,0,168,169,5,107,0,0,169, - 170,5,45,0,0,170,171,5,100,0,0,171,172,5,101,0,0,172,173,5,118,0, - 0,173,174,5,101,0,0,174,175,5,108,0,0,175,176,5,111,0,0,176,177, - 5,112,0,0,177,178,5,109,0,0,178,179,5,101,0,0,179,180,5,110,0,0, - 180,181,5,116,0,0,181,28,1,0,0,0,182,183,5,105,0,0,183,184,5,109, - 0,0,184,185,5,112,0,0,185,186,5,111,0,0,186,187,5,114,0,0,187,188, - 5,116,0,0,188,30,1,0,0,0,189,190,5,123,0,0,190,32,1,0,0,0,191,192, - 5,125,0,0,192,34,1,0,0,0,193,194,5,59,0,0,194,36,1,0,0,0,195,197, - 7,0,0,0,196,195,1,0,0,0,197,198,1,0,0,0,198,196,1,0,0,0,198,199, - 1,0,0,0,199,38,1,0,0,0,200,204,7,1,0,0,201,203,7,2,0,0,202,201,1, - 0,0,0,203,206,1,0,0,0,204,202,1,0,0,0,204,205,1,0,0,0,205,40,1,0, - 0,0,206,204,1,0,0,0,207,212,5,34,0,0,208,211,3,43,21,0,209,211,8, - 3,0,0,210,208,1,0,0,0,210,209,1,0,0,0,211,214,1,0,0,0,212,210,1, - 0,0,0,212,213,1,0,0,0,213,215,1,0,0,0,214,212,1,0,0,0,215,216,5, - 34,0,0,216,42,1,0,0,0,217,225,5,92,0,0,218,226,7,4,0,0,219,220,5, - 117,0,0,220,221,3,45,22,0,221,222,3,45,22,0,222,223,3,45,22,0,223, - 224,3,45,22,0,224,226,1,0,0,0,225,218,1,0,0,0,225,219,1,0,0,0,226, - 44,1,0,0,0,227,228,7,5,0,0,228,46,1,0,0,0,229,230,5,47,0,0,230,231, - 5,47,0,0,231,235,1,0,0,0,232,234,8,6,0,0,233,232,1,0,0,0,234,237, - 1,0,0,0,235,233,1,0,0,0,235,236,1,0,0,0,236,238,1,0,0,0,237,235, - 1,0,0,0,238,239,6,23,0,0,239,48,1,0,0,0,240,241,5,47,0,0,241,242, - 5,42,0,0,242,246,1,0,0,0,243,245,9,0,0,0,244,243,1,0,0,0,245,248, - 1,0,0,0,246,247,1,0,0,0,246,244,1,0,0,0,247,249,1,0,0,0,248,246, - 1,0,0,0,249,250,5,42,0,0,250,251,5,47,0,0,251,252,1,0,0,0,252,253, - 6,24,0,0,253,50,1,0,0,0,254,256,7,7,0,0,255,254,1,0,0,0,256,257, - 1,0,0,0,257,255,1,0,0,0,257,258,1,0,0,0,258,259,1,0,0,0,259,260, - 6,25,0,0,260,52,1,0,0,0,9,0,198,204,210,212,225,235,246,257,1,6, - 0,0 + 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,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3, + 1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5, + 1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7, + 1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8, + 1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1, + 11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1,13,1, + 13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1, + 14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,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,16,1,16,1, + 17,1,17,1,18,1,18,1,19,4,19,205,8,19,11,19,12,19,206,1,20,1,20,5, + 20,211,8,20,10,20,12,20,214,9,20,1,21,1,21,1,21,5,21,219,8,21,10, + 21,12,21,222,9,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1, + 22,3,22,234,8,22,1,23,1,23,1,24,1,24,1,24,1,24,5,24,242,8,24,10, + 24,12,24,245,9,24,1,24,1,24,1,25,1,25,1,25,1,25,5,25,253,8,25,10, + 25,12,25,256,9,25,1,25,1,25,1,25,1,25,1,25,1,26,4,26,264,8,26,11, + 26,12,26,265,1,26,1,26,1,254,0,27,1,1,3,2,5,3,7,4,9,5,11,6,13,7, + 15,8,17,9,19,10,21,11,23,12,25,13,27,14,29,15,31,16,33,17,35,18, + 37,19,39,20,41,21,43,22,45,0,47,0,49,23,51,24,53,25,1,0,8,1,0,48, + 57,3,0,65,90,95,95,97,122,4,0,48,57,65,90,95,95,97,122,4,0,10,10, + 13,13,34,34,92,92,8,0,34,34,47,47,92,92,98,98,102,102,110,110,114, + 114,116,116,3,0,48,57,65,70,97,102,2,0,10,10,13,13,3,0,9,10,13,13, + 32,32,274,0,1,1,0,0,0,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,49,1,0,0,0,0,51,1,0,0,0,0,53,1, + 0,0,0,1,55,1,0,0,0,3,67,1,0,0,0,5,76,1,0,0,0,7,84,1,0,0,0,9,91,1, + 0,0,0,11,98,1,0,0,0,13,108,1,0,0,0,15,116,1,0,0,0,17,122,1,0,0,0, + 19,133,1,0,0,0,21,140,1,0,0,0,23,147,1,0,0,0,25,151,1,0,0,0,27,158, + 1,0,0,0,29,172,1,0,0,0,31,190,1,0,0,0,33,197,1,0,0,0,35,199,1,0, + 0,0,37,201,1,0,0,0,39,204,1,0,0,0,41,208,1,0,0,0,43,215,1,0,0,0, + 45,225,1,0,0,0,47,235,1,0,0,0,49,237,1,0,0,0,51,248,1,0,0,0,53,263, + 1,0,0,0,55,56,5,113,0,0,56,57,5,117,0,0,57,58,5,105,0,0,58,59,5, + 120,0,0,59,60,5,111,0,0,60,61,5,115,0,0,61,62,5,45,0,0,62,63,5,108, + 0,0,63,64,5,111,0,0,64,65,5,99,0,0,65,66,5,107,0,0,66,2,1,0,0,0, + 67,68,5,102,0,0,68,69,5,114,0,0,69,70,5,97,0,0,70,71,5,103,0,0,71, + 72,5,109,0,0,72,73,5,101,0,0,73,74,5,110,0,0,74,75,5,116,0,0,75, + 4,1,0,0,0,76,77,5,118,0,0,77,78,5,101,0,0,78,79,5,114,0,0,79,80, + 5,115,0,0,80,81,5,105,0,0,81,82,5,111,0,0,82,83,5,110,0,0,83,6,1, + 0,0,0,84,85,5,113,0,0,85,86,5,117,0,0,86,87,5,105,0,0,87,88,5,120, + 0,0,88,89,5,111,0,0,89,90,5,115,0,0,90,8,1,0,0,0,91,92,5,115,0,0, + 92,93,5,111,0,0,93,94,5,117,0,0,94,95,5,114,0,0,95,96,5,99,0,0,96, + 97,5,101,0,0,97,10,1,0,0,0,98,99,5,105,0,0,99,100,5,110,0,0,100, + 101,5,116,0,0,101,102,5,101,0,0,102,103,5,114,0,0,103,104,5,102, + 0,0,104,105,5,97,0,0,105,106,5,99,0,0,106,107,5,101,0,0,107,12,1, + 0,0,0,108,109,5,112,0,0,109,110,5,97,0,0,110,111,5,99,0,0,111,112, + 5,107,0,0,112,113,5,97,0,0,113,114,5,103,0,0,114,115,5,101,0,0,115, + 14,1,0,0,0,116,117,5,98,0,0,117,118,5,117,0,0,118,119,5,105,0,0, + 119,120,5,108,0,0,120,121,5,100,0,0,121,16,1,0,0,0,122,123,5,114, + 0,0,123,124,5,101,0,0,124,125,5,112,0,0,125,126,5,111,0,0,126,127, + 5,115,0,0,127,128,5,105,0,0,128,129,5,116,0,0,129,130,5,111,0,0, + 130,131,5,114,0,0,131,132,5,121,0,0,132,18,1,0,0,0,133,134,5,99, + 0,0,134,135,5,111,0,0,135,136,5,109,0,0,136,137,5,109,0,0,137,138, + 5,105,0,0,138,139,5,116,0,0,139,20,1,0,0,0,140,141,5,112,0,0,141, + 142,5,111,0,0,142,143,5,108,0,0,143,144,5,105,0,0,144,145,5,99,0, + 0,145,146,5,121,0,0,146,22,1,0,0,0,147,148,5,114,0,0,148,149,5,101, + 0,0,149,150,5,102,0,0,150,24,1,0,0,0,151,152,5,112,0,0,152,153,5, + 105,0,0,153,154,5,110,0,0,154,155,5,110,0,0,155,156,5,101,0,0,156, + 157,5,100,0,0,157,26,1,0,0,0,158,159,5,116,0,0,159,160,5,114,0,0, + 160,161,5,97,0,0,161,162,5,99,0,0,162,163,5,107,0,0,163,164,5,45, + 0,0,164,165,5,114,0,0,165,166,5,101,0,0,166,167,5,108,0,0,167,168, + 5,101,0,0,168,169,5,97,0,0,169,170,5,115,0,0,170,171,5,101,0,0,171, + 28,1,0,0,0,172,173,5,116,0,0,173,174,5,114,0,0,174,175,5,97,0,0, + 175,176,5,99,0,0,176,177,5,107,0,0,177,178,5,45,0,0,178,179,5,100, + 0,0,179,180,5,101,0,0,180,181,5,118,0,0,181,182,5,101,0,0,182,183, + 5,108,0,0,183,184,5,111,0,0,184,185,5,112,0,0,185,186,5,109,0,0, + 186,187,5,101,0,0,187,188,5,110,0,0,188,189,5,116,0,0,189,30,1,0, + 0,0,190,191,5,105,0,0,191,192,5,109,0,0,192,193,5,112,0,0,193,194, + 5,111,0,0,194,195,5,114,0,0,195,196,5,116,0,0,196,32,1,0,0,0,197, + 198,5,123,0,0,198,34,1,0,0,0,199,200,5,125,0,0,200,36,1,0,0,0,201, + 202,5,59,0,0,202,38,1,0,0,0,203,205,7,0,0,0,204,203,1,0,0,0,205, + 206,1,0,0,0,206,204,1,0,0,0,206,207,1,0,0,0,207,40,1,0,0,0,208,212, + 7,1,0,0,209,211,7,2,0,0,210,209,1,0,0,0,211,214,1,0,0,0,212,210, + 1,0,0,0,212,213,1,0,0,0,213,42,1,0,0,0,214,212,1,0,0,0,215,220,5, + 34,0,0,216,219,3,45,22,0,217,219,8,3,0,0,218,216,1,0,0,0,218,217, + 1,0,0,0,219,222,1,0,0,0,220,218,1,0,0,0,220,221,1,0,0,0,221,223, + 1,0,0,0,222,220,1,0,0,0,223,224,5,34,0,0,224,44,1,0,0,0,225,233, + 5,92,0,0,226,234,7,4,0,0,227,228,5,117,0,0,228,229,3,47,23,0,229, + 230,3,47,23,0,230,231,3,47,23,0,231,232,3,47,23,0,232,234,1,0,0, + 0,233,226,1,0,0,0,233,227,1,0,0,0,234,46,1,0,0,0,235,236,7,5,0,0, + 236,48,1,0,0,0,237,238,5,47,0,0,238,239,5,47,0,0,239,243,1,0,0,0, + 240,242,8,6,0,0,241,240,1,0,0,0,242,245,1,0,0,0,243,241,1,0,0,0, + 243,244,1,0,0,0,244,246,1,0,0,0,245,243,1,0,0,0,246,247,6,24,0,0, + 247,50,1,0,0,0,248,249,5,47,0,0,249,250,5,42,0,0,250,254,1,0,0,0, + 251,253,9,0,0,0,252,251,1,0,0,0,253,256,1,0,0,0,254,255,1,0,0,0, + 254,252,1,0,0,0,255,257,1,0,0,0,256,254,1,0,0,0,257,258,5,42,0,0, + 258,259,5,47,0,0,259,260,1,0,0,0,260,261,6,25,0,0,261,52,1,0,0,0, + 262,264,7,7,0,0,263,262,1,0,0,0,264,265,1,0,0,0,265,263,1,0,0,0, + 265,266,1,0,0,0,266,267,1,0,0,0,267,268,6,26,0,0,268,54,1,0,0,0, + 9,0,206,212,218,220,233,243,254,265,1,6,0,0 ]; private static __ATN: antlr.ATN; diff --git a/src/resource-lock/generated/QuixosLockParser.ts b/src/resource-lock/generated/QuixosLockParser.ts index 7f413ef..e557640 100644 --- a/src/resource-lock/generated/QuixosLockParser.ts +++ b/src/resource-lock/generated/QuixosLockParser.ts @@ -17,23 +17,24 @@ export class QuixosLockParser extends antlr.Parser { public static readonly SOURCE = 5; public static readonly INTERFACE = 6; public static readonly PACKAGE = 7; - public static readonly REPOSITORY = 8; - public static readonly COMMIT = 9; - public static readonly POLICY = 10; - public static readonly REF = 11; - public static readonly PINNED = 12; - public static readonly TRACK_RELEASE = 13; - public static readonly TRACK_DEVELOPMENT = 14; - public static readonly IMPORT = 15; - public static readonly LBRACE = 16; - public static readonly RBRACE = 17; - public static readonly SEMI = 18; - public static readonly INTEGER = 19; - public static readonly IDENTIFIER = 20; - public static readonly STRING_LITERAL = 21; - public static readonly LINE_COMMENT = 22; - public static readonly BLOCK_COMMENT = 23; - public static readonly WS = 24; + public static readonly BUILD = 8; + public static readonly REPOSITORY = 9; + public static readonly COMMIT = 10; + public static readonly POLICY = 11; + public static readonly REF = 12; + public static readonly PINNED = 13; + public static readonly TRACK_RELEASE = 14; + public static readonly TRACK_DEVELOPMENT = 15; + public static readonly IMPORT = 16; + public static readonly LBRACE = 17; + public static readonly RBRACE = 18; + public static readonly SEMI = 19; + public static readonly INTEGER = 20; + public static readonly IDENTIFIER = 21; + public static readonly STRING_LITERAL = 22; + public static readonly LINE_COMMENT = 23; + public static readonly BLOCK_COMMENT = 24; + public static readonly WS = 25; public static readonly RULE_document = 0; public static readonly RULE_quixosEntry = 1; public static readonly RULE_resourceEntry = 2; @@ -47,17 +48,17 @@ export class QuixosLockParser extends antlr.Parser { public static readonly literalNames = [ null, "'quixos-lock'", "'fragment'", "'version'", "'quixos'", "'source'", - "'interface'", "'package'", "'repository'", "'commit'", "'policy'", - "'ref'", "'pinned'", "'track-release'", "'track-development'", "'import'", - "'{'", "'}'", "';'" + "'interface'", "'package'", "'build'", "'repository'", "'commit'", + "'policy'", "'ref'", "'pinned'", "'track-release'", "'track-development'", + "'import'", "'{'", "'}'", "';'" ]; public static readonly symbolicNames = [ null, "QUIXOS_LOCK", "FRAGMENT", "VERSION", "QUIXOS", "SOURCE", - "INTERFACE", "PACKAGE", "REPOSITORY", "COMMIT", "POLICY", "REF", - "PINNED", "TRACK_RELEASE", "TRACK_DEVELOPMENT", "IMPORT", "LBRACE", - "RBRACE", "SEMI", "INTEGER", "IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", - "BLOCK_COMMENT", "WS" + "INTERFACE", "PACKAGE", "BUILD", "REPOSITORY", "COMMIT", "POLICY", + "REF", "PINNED", "TRACK_RELEASE", "TRACK_DEVELOPMENT", "IMPORT", + "LBRACE", "RBRACE", "SEMI", "INTEGER", "IDENTIFIER", "STRING_LITERAL", + "LINE_COMMENT", "BLOCK_COMMENT", "WS" ]; public static readonly ruleNames = [ "document", "quixosEntry", "resourceEntry", "importEntry", "resourceKind", @@ -107,7 +108,7 @@ export class QuixosLockParser extends antlr.Parser { this.state = 32; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 32976) !== 0)) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 66000) !== 0)) { { this.state = 30; this.errorHandler.sync(this); @@ -126,6 +127,7 @@ export class QuixosLockParser extends antlr.Parser { break; case QuixosLockParser.INTERFACE: case QuixosLockParser.PACKAGE: + case QuixosLockParser.BUILD: { this.state = 29; this.resourceEntry(); @@ -250,7 +252,7 @@ export class QuixosLockParser extends antlr.Parser { { this.state = 51; _la = this.tokenStream.LA(1); - if(!(_la === 6 || _la === 7)) { + if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 448) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -327,7 +329,7 @@ export class QuixosLockParser extends antlr.Parser { this.state = 73; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 10) { + if (_la === 11) { { this.state = 66; this.match(QuixosLockParser.POLICY); @@ -376,7 +378,7 @@ export class QuixosLockParser extends antlr.Parser { { this.state = 80; _la = this.tokenStream.LA(1); - if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 28672) !== 0))) { + if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 57344) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -446,31 +448,31 @@ export class QuixosLockParser extends antlr.Parser { } public static readonly _serializedATN: number[] = [ - 4,1,24,87,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, + 4,1,25,87,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,1,0,1,0,3,0,23,8,0,1,0,1,0,1,0,1,0,1,0, 1,0,5,0,31,8,0,10,0,12,0,34,9,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,5,1,5,1,5,1,5,1,5,1,5, 1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,3,6,74,8, 6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,8,1,8,1,9,1,9,1,9,0,0,10,0,2,4,6, - 8,10,12,14,16,18,0,2,1,0,6,7,1,0,12,14,81,0,20,1,0,0,0,2,38,1,0, + 8,10,12,14,16,18,0,2,1,0,6,8,1,0,13,15,81,0,20,1,0,0,0,2,38,1,0, 0,0,4,42,1,0,0,0,6,47,1,0,0,0,8,51,1,0,0,0,10,53,1,0,0,0,12,62,1, 0,0,0,14,80,1,0,0,0,16,82,1,0,0,0,18,84,1,0,0,0,20,22,5,1,0,0,21, 23,5,2,0,0,22,21,1,0,0,0,22,23,1,0,0,0,23,24,1,0,0,0,24,25,5,3,0, - 0,25,26,5,19,0,0,26,32,5,16,0,0,27,31,3,2,1,0,28,31,3,6,3,0,29,31, + 0,25,26,5,20,0,0,26,32,5,17,0,0,27,31,3,2,1,0,28,31,3,6,3,0,29,31, 3,4,2,0,30,27,1,0,0,0,30,28,1,0,0,0,30,29,1,0,0,0,31,34,1,0,0,0, 32,30,1,0,0,0,32,33,1,0,0,0,33,35,1,0,0,0,34,32,1,0,0,0,35,36,5, - 17,0,0,36,37,5,0,0,1,37,1,1,0,0,0,38,39,5,4,0,0,39,40,5,5,0,0,40, + 18,0,0,36,37,5,0,0,1,37,1,1,0,0,0,38,39,5,4,0,0,39,40,5,5,0,0,40, 41,3,12,6,0,41,3,1,0,0,0,42,43,3,8,4,0,43,44,3,16,8,0,44,45,5,5, - 0,0,45,46,3,10,5,0,46,5,1,0,0,0,47,48,5,15,0,0,48,49,3,18,9,0,49, - 50,5,18,0,0,50,7,1,0,0,0,51,52,7,0,0,0,52,9,1,0,0,0,53,54,5,16,0, - 0,54,55,5,8,0,0,55,56,3,18,9,0,56,57,5,18,0,0,57,58,5,9,0,0,58,59, - 3,18,9,0,59,60,5,18,0,0,60,61,5,17,0,0,61,11,1,0,0,0,62,63,5,16, - 0,0,63,64,5,8,0,0,64,65,3,18,9,0,65,73,5,18,0,0,66,67,5,10,0,0,67, - 68,3,14,7,0,68,69,5,18,0,0,69,70,5,11,0,0,70,71,3,18,9,0,71,72,5, - 18,0,0,72,74,1,0,0,0,73,66,1,0,0,0,73,74,1,0,0,0,74,75,1,0,0,0,75, - 76,5,9,0,0,76,77,3,18,9,0,77,78,5,18,0,0,78,79,5,17,0,0,79,13,1, - 0,0,0,80,81,7,1,0,0,81,15,1,0,0,0,82,83,5,20,0,0,83,17,1,0,0,0,84, - 85,5,21,0,0,85,19,1,0,0,0,4,22,30,32,73 + 0,0,45,46,3,10,5,0,46,5,1,0,0,0,47,48,5,16,0,0,48,49,3,18,9,0,49, + 50,5,19,0,0,50,7,1,0,0,0,51,52,7,0,0,0,52,9,1,0,0,0,53,54,5,17,0, + 0,54,55,5,9,0,0,55,56,3,18,9,0,56,57,5,19,0,0,57,58,5,10,0,0,58, + 59,3,18,9,0,59,60,5,19,0,0,60,61,5,18,0,0,61,11,1,0,0,0,62,63,5, + 17,0,0,63,64,5,9,0,0,64,65,3,18,9,0,65,73,5,19,0,0,66,67,5,11,0, + 0,67,68,3,14,7,0,68,69,5,19,0,0,69,70,5,12,0,0,70,71,3,18,9,0,71, + 72,5,19,0,0,72,74,1,0,0,0,73,66,1,0,0,0,73,74,1,0,0,0,74,75,1,0, + 0,0,75,76,5,10,0,0,76,77,3,18,9,0,77,78,5,19,0,0,78,79,5,18,0,0, + 79,13,1,0,0,0,80,81,7,1,0,0,81,15,1,0,0,0,82,83,5,21,0,0,83,17,1, + 0,0,0,84,85,5,22,0,0,85,19,1,0,0,0,4,22,30,32,73 ]; private static __ATN: antlr.ATN; @@ -648,6 +650,9 @@ export class ResourceKindContext extends antlr.ParserRuleContext { public PACKAGE(): antlr.TerminalNode | null { return this.getToken(QuixosLockParser.PACKAGE, 0); } + public BUILD(): antlr.TerminalNode | null { + return this.getToken(QuixosLockParser.BUILD, 0); + } public override get ruleIndex(): number { return QuixosLockParser.RULE_resourceKind; } diff --git a/src/resource-lock/parser.ts b/src/resource-lock/parser.ts index 4e633af..4242635 100644 --- a/src/resource-lock/parser.ts +++ b/src/resource-lock/parser.ts @@ -296,7 +296,11 @@ export const parseQuixosLockDocument = (source: string, fileName = ""): const resources: LockedResource[] = []; const bindings = new Set(); for (const [index, context] of tree.resourceEntry().entries()) { - const kind = context.resourceKind().INTERFACE() ? "interface" : "package"; + const kind = context.resourceKind().INTERFACE() + ? "interface" + : context.resourceKind().BUILD() + ? "build" + : "package"; const binding = context.identifier().getText(); const key = `${kind}\0${binding}`; if (bindings.has(key)) { diff --git a/src/resource-lock/types.ts b/src/resource-lock/types.ts index a7cf809..d397b75 100644 --- a/src/resource-lock/types.ts +++ b/src/resource-lock/types.ts @@ -21,7 +21,7 @@ export type QuixosSource = GitSource & } ); -export type LockedResourceKind = "interface" | "package"; +export type LockedResourceKind = "interface" | "package" | "build"; export type LockedResource = { kind: LockedResourceKind; diff --git a/test/artifact-files.test.ts b/test/artifact-files.test.ts index c77c55b..a8cf42c 100644 --- a/test/artifact-files.test.ts +++ b/test/artifact-files.test.ts @@ -154,3 +154,22 @@ test("transaction process services do not promise generated TypeScript modules", throw Error("No adapter claimed"); }); }); + +test("a remote export group in a mixed package witnesses only its own adapter", async () => { + const { asyncObjectPlan } = await import("./async-fixture.js"); + const { expectedArtifactReceipt } = await import("../src/execution-world/receipts.js"); + const plan = await asyncObjectPlan(); + const fixture = buildArtifactFixture(plan, "async:controller-runtime@1"); + const pkg = plan.definition.packages.find((entry) => entry.revision === fixture.manifest.packageRevisionId)!; + fixture.manifest.implementations = fixture.manifest.implementations.filter( + (entry) => entry.target === "server" && entry.compatibility === "quixos-js-module-v1", + ); + for (const implementation of fixture.manifest.implementations) + implementation.exports = implementation.exports.filter((id) => + pkg.exports.some((entry) => entry.id === id && entry.execution.kind === "remote"), + ); + assert.deepEqual( + expectedArtifactReceipt(plan, fixture.manifest, "a".repeat(64)).receipt.generated.map((file) => file.path), + ["share/quixos/generated/remote.ts"], + ); +}); diff --git a/test/build-dependencies.test.ts b/test/build-dependencies.test.ts new file mode 100644 index 0000000..ccd9f82 --- /dev/null +++ b/test/build-dependencies.test.ts @@ -0,0 +1,76 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import { compileWorkspaceRepository, compileCapabilityResourceRepository } from "../src/capability-language/index.js"; +import { bindingSchema } from "../src/bindings/index.js"; +import { parseQuixosLockDocument } from "../src/resource-lock/index.js"; +import { editStructure } from "../src/capability-language/structural-edits.js"; + +const commit = "a".repeat(40); +const entry = (kind: string, name: string) => + `${kind} ${name} source {repository "https://example.test/${name}.git"; commit "${commit}";}`; +const lock = (entries = "") => + `quixos-lock version 1 {quixos source {repository "https://example.test/quixos.git"; commit "${commit}";} ${entries}}`; + +test("build dependency closures are retained without installing their capability descendants", async (t) => { + const directory = await fs.mkdtemp(path.join(os.tmpdir(), "qx-build-deps-")); + t.after(() => fs.rm(directory, { recursive: true, force: true })); + const write = async (name: string, files: Record) => { + await fs.mkdir(path.join(directory, name)); + for (const [file, text] of Object.entries(files)) await fs.writeFile(path.join(directory, name, file), text); + }; + await write("root", { + "quixos.lock": lock(entry("build", "Library")), + "workspace.qx": `workspace Empty id "empty" revision "empty@1" commit "${commit}" {}`, + }); + await write("Library", { + "quixos.lock": lock(entry("package", "Hidden")), + "types.ts": "export type Label = string;", + }); + await write("Hidden", { + "quixos.lock": lock(entry("interface", "Data")), + "package.qx": 'import interface Data; package Hidden id "hidden" revision "hidden@1" {}', + }); + await write("Data", { "quixos.lock": lock(), "interface.qx": 'interface Data id "data" revision "data@1" {}' }); + const resolveResource = async (source: { repository: string }) => ({ + directory: path.join(directory, new URL(source.repository).pathname.slice(1, -4)), + }); + const compiled = await compileWorkspaceRepository({ rootDirectory: path.join(directory, "root"), resolveResource }); + assert.equal(compiled.resources.length, 3); + assert.deepEqual(compiled.capabilityResources, []); + assert.deepEqual(compiled.workspace.packageImports, []); + assert.deepEqual(compiled.workspace.interfaceImports, []); + assert.deepEqual(bindingSchema(compiled).packages, []); + const library = await compileCapabilityResourceRepository({ + rootDirectory: path.join(directory, "Library"), + kind: "build", + source: { resolver: "git", repository: "https://example.test/Library.git", commit }, + resolveResource, + }); + assert.deepEqual(library.resource, { kind: "build" }); + assert.deepEqual(bindingSchema(library).interfaces, []); + await fs.writeFile(path.join(directory, "Library/quixos.lock"), lock(entry("build", "Library"))); + await assert.rejects( + compileWorkspaceRepository({ rootDirectory: path.join(directory, "root"), resolveResource }), + /dependency cycle/, + ); +}); + +test("build pins retain their kind through parsing and structural updates", () => { + const initial = lock(entry("build", "Library")); + const parsed = parseQuixosLockDocument(initial); + assert.ok(parsed.ok); + assert.equal(parsed.document.resources[0]!.kind, "build"); + const edited = editStructure(initial, { + operation: "dependency", + kind: "build", + name: "Library", + source: { repository: "https://example.test/Library.git", commit: "b".repeat(40) }, + }); + const changed = parseQuixosLockDocument(edited); + assert.ok(changed.ok); + assert.equal(changed.document.resources[0]!.kind, "build"); + assert.equal(changed.document.resources[0]!.source.commit, "b".repeat(40)); +}); diff --git a/test/emit-managed.ts b/test/emit-managed.ts index f5de12c..59c39a7 100644 --- a/test/emit-managed.ts +++ b/test/emit-managed.ts @@ -198,3 +198,24 @@ package Owner id "package:owner" revision "package:owner@1" { } await import("./emit-controllers.js"); + +// Standalone public builder roots must work without opting into the other modes. +for (const kind of ["portable", "service"]) { + const pkg = compileCapabilityResourceSource( + `package Owner id "package:owner" revision "package:owner@1" { + function identity id "identity" : int32 -> record {pid:int32;child:int32;} + execution ${kind === "portable" ? "snapshot targets [browser,server]" : "remote"}; + }`, + { source }, + ); + assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); + const workspace = compileCapabilitySource( + `workspace Simple id "workspace:simple" revision "workspace:simple@1" commit "${source.commit}" {import package Owner;}`, + "workspace.qx", + { packages: new Map([["Owner", pkg.resource.revision]]) }, + ); + assert.ok(workspace.ok, JSON.stringify(workspace.diagnostics)); + const directory = `dist/managed/standalone-${kind}`; + await mkdir(directory, { recursive: true }); + await writeFile(`${directory}/execution-plan.json`, JSON.stringify(compileExecutionPlan(workspace.workspace))); +} diff --git a/test/pin-upgrades.test.ts b/test/pin-upgrades.test.ts index f6e30ef..026a733 100644 --- a/test/pin-upgrades.test.ts +++ b/test/pin-upgrades.test.ts @@ -76,106 +76,112 @@ test( }, ); -test("pin upgrades publish children before parent locks and resume without republishing completed nodes", async (context) => { - const workbench = await fs.mkdtemp(path.join(os.tmpdir(), "qx-upgrade-test-")); - context.after(() => fs.rm(workbench, { recursive: true, force: true })); - const from = "a".repeat(40), - to = "b".repeat(40), - framework = "c".repeat(40); - const sources = [ - { - kind: "workspace" as const, - directory: "root", - source: { repository: "https://example.test/workspace.git", commit: from }, - }, - { - kind: "interface" as const, - directory: "resources/Named", - source: { repository: "https://example.test/named.git", commit: from }, - }, - ]; - const lock = `quixos-lock version 1 { quixos source { repository "https://example.test/quixos.git"; commit "${framework}"; }`; - for (const node of sources) { - const directory = path.join(workbench, node.directory); - await fs.mkdir(directory, { recursive: true }); - await execFile("git", ["-C", directory, "init"]); - await execFile("git", ["-C", directory, "remote", "add", "origin", node.source.repository]); - await fs.writeFile(path.join(directory, ".gitignore"), ".quixos/\n"); +for (const dependencyKind of ["interface", "build"] as const) + test(`${dependencyKind} pin upgrades publish children before parent locks and resume without republishing completed nodes`, async (context) => { + const workbench = await fs.mkdtemp(path.join(os.tmpdir(), "qx-upgrade-test-")); + context.after(() => fs.rm(workbench, { recursive: true, force: true })); + const from = "a".repeat(40), + to = "b".repeat(40), + framework = "c".repeat(40); + const sources = [ + { + kind: "workspace" as const, + directory: "root", + source: { repository: "https://example.test/workspace.git", commit: from }, + }, + { + kind: dependencyKind, + directory: "resources/Named", + source: { repository: "https://example.test/named.git", commit: from }, + }, + ]; + const lock = `quixos-lock version 1 { quixos source { repository "https://example.test/quixos.git"; commit "${framework}"; }`; + for (const node of sources) { + const directory = path.join(workbench, node.directory); + await fs.mkdir(directory, { recursive: true }); + await execFile("git", ["-C", directory, "init"]); + await execFile("git", ["-C", directory, "remote", "add", "origin", node.source.repository]); + await fs.writeFile(path.join(directory, ".gitignore"), ".quixos/\n"); + await fs.writeFile( + path.join(directory, "quixos.lock"), + lock + + (node.kind === "workspace" + ? ` ${dependencyKind} Named source { repository "${sources[1].source.repository}"; commit "${from}"; }` + : "") + + " }", + ); + } await fs.writeFile( - path.join(directory, "quixos.lock"), - lock + - (node.kind === "workspace" - ? ` interface Named source { repository "${sources[1].source.repository}"; commit "${from}"; }` - : "") + - " }", + path.join( + workbench, + dependencyKind === "interface" ? "resources/Named/interface.qx" : "resources/Named/types.ts", + ), + dependencyKind === "interface" + ? 'interface Named id "interface:named" revision "interface:named@1" { value name id "member:name" : string { get id "op:get"; } }' + : "export type Name = string;", ); - } - await fs.writeFile( - path.join(workbench, "resources/Named/interface.qx"), - 'interface Named id "interface:named" revision "interface:named@1" { value name id "member:name" : string { get id "op:get"; } }', - ); - await fs.writeFile( - path.join(workbench, "root/workspace.qx"), - `workspace W id "workspace:w" revision "workspace:w@1" commit "${from}" { import interface Named; atom A id "atom:a"; }`, - ); - const snapshotMap = path.join(workbench, "snapshots.json"); - await fs.writeFile( - snapshotMap, - JSON.stringify({ - resources: [ - { - kind: "interface", - repository: sources[1].source.repository, - commit: to, - directory: path.join(workbench, "resources/Named"), - }, - ], - }), - ); - const oldMap = process.env.QUIXOS_SNAPSHOT_MAP; - process.env.QUIXOS_SNAPSHOT_MAP = snapshotMap; - context.after(() => { - if (oldMap === undefined) delete process.env.QUIXOS_SNAPSHOT_MAP; - else process.env.QUIXOS_SNAPSHOT_MAP = oldMap; + await fs.writeFile( + path.join(workbench, "root/workspace.qx"), + `workspace W id "workspace:w" revision "workspace:w@1" commit "${from}" { ${dependencyKind === "interface" ? "import interface Named;" : ""} atom A id "atom:a"; }`, + ); + const snapshotMap = path.join(workbench, "snapshots.json"); + await fs.writeFile( + snapshotMap, + JSON.stringify({ + resources: [ + { + kind: dependencyKind, + repository: sources[1].source.repository, + commit: to, + directory: path.join(workbench, "resources/Named"), + }, + ], + }), + ); + const oldMap = process.env.QUIXOS_SNAPSHOT_MAP; + process.env.QUIXOS_SNAPSHOT_MAP = snapshotMap; + context.after(() => { + if (oldMap === undefined) delete process.env.QUIXOS_SNAPSHOT_MAP; + else process.env.QUIXOS_SNAPSHOT_MAP = oldMap; + }); + const plan = await planPinUpgrades(workbench, { nodes: sources }); + await fs.mkdir(path.join(workbench, ".quixos"), { recursive: true }); + await fs.writeFile( + path.join(workbench, ".quixos/resource-graph.json"), + JSON.stringify({ resources: [{ ...sources[1], source: { resolver: "git", ...sources[1].source } }] }), + ); + assert.deepEqual( + plan.nodes.map((node) => node.directory), + ["resources/Named", "root"], + ); + let fail = true; + const published: string[] = []; + const effects: UpgradeEffects = { + check: async (node) => { + if (node.kind === "workspace" && fail) throw new Error("refactor required"); + }, + snapshot: async () => to, + publish: async (root) => { + published.push(path.relative(workbench, root)); + }, + }; + await assert.rejects(() => applyPinUpgrades(plan, undefined, effects), /refactor required/); + assert.deepEqual(published, ["resources/Named"]); + assert.match(await fs.readFile(path.join(workbench, "root/quixos.lock"), "utf8"), new RegExp(to)); + const id = (await fs.readdir(path.join(workbench, ".quixos/upgrades"))) + .find((name) => name.endsWith(".json"))! + .slice(0, -5); + fail = false; + await fs.appendFile(path.join(workbench, "root/workspace.qx"), "\n// explicit refactor\n"); + await assert.rejects(() => applyPinUpgrades(plan, id, effects), /accept-edits/); + const result = await applyPinUpgrades(plan, id, effects, { acceptEdits: true }); + assert.equal(result.activated, false); + assert.deepEqual(published, ["resources/Named", "root"]); + const graph = JSON.parse(await fs.readFile(path.join(workbench, ".quixos/resource-graph.json"), "utf8")); + assert.equal(graph.resources.length, 1); + assert.equal(graph.resources[0].source.commit, to); + const next = await planPinUpgrades(workbench, { + nodes: [sources[0], { ...sources[1], source: graph.resources[0].source }], + }); + assert.deepEqual(next.nodes.find((node) => node.kind === "workspace")!.dependencies, ["resources/Named"]); }); - const plan = await planPinUpgrades(workbench, { nodes: sources }); - await fs.mkdir(path.join(workbench, ".quixos"), { recursive: true }); - await fs.writeFile( - path.join(workbench, ".quixos/resource-graph.json"), - JSON.stringify({ resources: [{ ...sources[1], source: { resolver: "git", ...sources[1].source } }] }), - ); - assert.deepEqual( - plan.nodes.map((node) => node.directory), - ["resources/Named", "root"], - ); - let fail = true; - const published: string[] = []; - const effects: UpgradeEffects = { - check: async (node) => { - if (node.kind === "workspace" && fail) throw new Error("refactor required"); - }, - snapshot: async () => to, - publish: async (root) => { - published.push(path.relative(workbench, root)); - }, - }; - await assert.rejects(() => applyPinUpgrades(plan, undefined, effects), /refactor required/); - assert.deepEqual(published, ["resources/Named"]); - assert.match(await fs.readFile(path.join(workbench, "root/quixos.lock"), "utf8"), new RegExp(to)); - const id = (await fs.readdir(path.join(workbench, ".quixos/upgrades"))) - .find((name) => name.endsWith(".json"))! - .slice(0, -5); - fail = false; - await fs.appendFile(path.join(workbench, "root/workspace.qx"), "\n// explicit refactor\n"); - await assert.rejects(() => applyPinUpgrades(plan, id, effects), /accept-edits/); - const result = await applyPinUpgrades(plan, id, effects, { acceptEdits: true }); - assert.equal(result.activated, false); - assert.deepEqual(published, ["resources/Named", "root"]); - const graph = JSON.parse(await fs.readFile(path.join(workbench, ".quixos/resource-graph.json"), "utf8")); - assert.equal(graph.resources.length, 1); - assert.equal(graph.resources[0].source.commit, to); - const next = await planPinUpgrades(workbench, { - nodes: [sources[0], { ...sources[1], source: graph.resources[0].source }], - }); - assert.deepEqual(next.nodes.find((node) => node.kind === "workspace")!.dependencies, ["resources/Named"]); -}); From 152f58a3c6ad9aef0766c0b6f03467221afff91f Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Tue, 22 Sep 2026 14:42:54 -0700 Subject: [PATCH 56/91] Make Camino examples and scaffolds complete Yarn and Nix packages --- flake.nix | 1 + src/capability-language/component-nix.ts | 52 ++++++++++++++ src/capability-language/component-scaffold.ts | 12 ++-- src/capability-language/execution-scaffold.ts | 70 +++++++++++++------ src/capability-language/structural-plan.ts | 4 +- test/component-nix.test.ts | 27 +++++++ test/component-scaffold.test.ts | 33 +++++++-- test/scaffold-recipes.test.ts | 2 +- test/structural-plan.test.ts | 24 +++++++ 9 files changed, 193 insertions(+), 32 deletions(-) create mode 100644 src/capability-language/component-nix.ts create mode 100644 test/component-nix.test.ts diff --git a/flake.nix b/flake.nix index 2e42917..7f2a1a8 100644 --- a/flake.nix +++ b/flake.nix @@ -29,6 +29,7 @@ pkgs.jujutsu pkgs.gnutar pkgs.util-linux + pkgs.nix ]; buildPhase = '' runHook preBuild diff --git a/src/capability-language/component-nix.ts b/src/capability-language/component-nix.ts new file mode 100644 index 0000000..201eded --- /dev/null +++ b/src/capability-language/component-nix.ts @@ -0,0 +1,52 @@ +import { execFile as callback } from "node:child_process"; +import { promisify } from "node:util"; +const execFile = promisify(callback); +export const nixLiteral = (value: string): string => JSON.stringify(value).replace(/\$\{/g, "\\${"); + +/** Recognize the deliberately small scaffold edit surface, never evaluate Nix. + * Authors may replace it with arbitrary Nix; then scaffolding declines the edit. */ +export async function componentEntries(source: string): Promise> { + const { stdout } = await execFile("nix-instantiate", ["--parse", "--expr", source], { maxBuffer: 1024 * 1024 }); + const tokens = stdout.match(/"(?:\\.|[^"\\])*"|[A-Za-z_][A-Za-z0-9_-]*|[{}=;]/g) ?? []; + if (stdout.replace(/"(?:\\.|[^"\\])*"|[A-Za-z_][A-Za-z0-9_-]*|[{}=;]|\s+/g, "")) + throw Error("components.nix is outside the supported literal-entry shape"); + let cursor = 0; + const expect = (token: string) => { + if (tokens[cursor++] !== token) throw Error("components.nix is outside the supported literal-entry shape"); + }; + const string = () => { + const token = tokens[cursor++]; + if (!token?.startsWith('"')) throw Error("Component entries must use literal strings"); + const json = token.replace(/(\\*)\$\{/g, (_match, escapes: string) => { + if (escapes.length % 2 === 0) throw Error("Component entries must use literal strings"); + return escapes.slice(1) + "${"; + }); + return JSON.parse(json) as string; + }; + const entries: Record = Object.create(null); + expect("{"); + while (tokens[cursor] !== "}") { + const id = tokens[cursor]?.startsWith('"') ? string() : tokens[cursor++]; + if (!id) throw Error("Missing component identity"); + if (Object.hasOwn(entries, id)) throw Error("Duplicate component entry"); + expect("="); + expect("{"); + const properties: Record = Object.create(null); + while (tokens[cursor] !== "}") { + const key = tokens[cursor]?.startsWith('"') ? string() : tokens[cursor++]; + if (!key || !["entry", "export"].includes(key) || Object.hasOwn(properties, key)) + throw Error("Unsupported component entry property"); + expect("="); + properties[key] = string(); + expect(";"); + } + expect("}"); + expect(";"); + if (!properties.entry || !properties.export) throw Error("Component entry needs entry and export"); + entries[id] = { entry: properties.entry, export: properties.export }; + } + expect("}"); + if (cursor !== tokens.length || !/\n}\s*$/.test(source)) + throw Error("components.nix is outside the supported scaffold shape"); + return entries; +} diff --git a/src/capability-language/component-scaffold.ts b/src/capability-language/component-scaffold.ts index 9d3646b..3b317eb 100644 --- a/src/capability-language/component-scaffold.ts +++ b/src/capability-language/component-scaffold.ts @@ -3,6 +3,7 @@ import path from "node:path"; import { parseQx, walkSyntax } from "./source.js"; import type { ScaffoldRecipe } from "./scaffold-recipes.js"; import type { StructuralRequest } from "./structural-plan.js"; +import { componentEntries, nixLiteral } from "./component-nix.js"; /** Add one ordinary component entry without regenerating existing application code. */ export async function scaffoldComponent( @@ -46,12 +47,13 @@ export async function scaffoldComponent( ) throw Error("Component requires a unique name and ID"); } - const filename = "quixos.components.json"; + const filename = "components.nix"; const before = await fs.readFile(path.join(root, prefix, filename), "utf8"); - const entries: Record = JSON.parse(before); + const entries = await componentEntries(before); if (!entries || typeof entries !== "object" || Array.isArray(entries) || Object.hasOwn(entries, spec.id)) throw Error("Invalid or duplicate component entry"); - entries[spec.id] = { entry: `src/components/${spec.name}.tsx`, export: spec.name }; + const insertion = ` ${nixLiteral(spec.id)} = { entry = ${nixLiteral(`src/components/${spec.name}.tsx`)}; export = ${nixLiteral(spec.name)}; };\n`; + const after = before.replace(/\n}(\s*)$/, (_match, trailing) => "\n" + insertion + "}" + trailing); const parentID = parent.children.find((node) => node.kind === "stringLiteral")!; return { kind: "package", @@ -69,10 +71,10 @@ export async function scaffoldComponent( }, ], }, - { file: prefix + filename, expected: before, replace: JSON.stringify(entries, null, 2) + "\n" }, + { file: prefix + filename, expected: before, replace: after }, { file: prefix + `src/components/${spec.name}.tsx`, - create: `import type { Components } from "../gen/client.js";\n\n// Add explicit query admission and named interface operations from the generated client.\nexport const ${spec.name}: Components[${JSON.stringify(spec.name)}] = ({subject}) =>

{subject.object}

;\n`, + create: `import type { Modules } from "../gen/client.js";\n\n// Add explicit query admission and named interface operations from the generated client.\nexport const ${spec.name}: Modules[${JSON.stringify(spec.name)}] = ({subject}) =>

{subject.object}

;\n`, }, ], }; diff --git a/src/capability-language/execution-scaffold.ts b/src/capability-language/execution-scaffold.ts index 424252a..3a11e02 100644 --- a/src/capability-language/execution-scaffold.ts +++ b/src/capability-language/execution-scaffold.ts @@ -37,9 +37,25 @@ export async function executionScaffold( formatQuixosLock({ formatVersion: 1, quixos: { resolver: "git", ...spec.tools.quixos }, resources: [] }), ); create("quixos.check.json", json({ backend: "execution" })); - create("quixos.components.json", "{}\n"); - create("package.json", json({ name: `@quixos/${spec.name.toLowerCase()}`, private: true, type: "module" })); - create(".gitignore", "node_modules/\ndist/\nsrc/gen/\n.quixos/\nresult\n"); + create("components.nix", "{\n}\n"); + create( + "package.json", + json({ + name: `@quixos/${spec.name.toLowerCase()}`, + private: true, + type: "module", + packageManager: "yarn@4.18.0", + scripts: { typecheck: "qx-workspace check" }, + }), + ); + create( + ".gitignore", + "node_modules/\ndist/\nsrc/gen/\n.quixos/\nresult\n.yarn/cache/\n.yarn/install-state.gz\n.yarn/unplugged/\n", + ); + create( + ".yarnrc.yml", + 'enableScripts: true\n\ngenerateDefaultNix: false\n\nindividualNixPackaging: true\n\nnodeLinker: node-modules\n\nsupportedArchitectures:\n os:\n - current\n - linux\n cpu:\n - current\n - x64\n - arm64\n libc:\n - current\n - glibc\n\nplugins:\n - checksum: 271de9a785321a37c564b8e2a6b5cd689850b20572d5fee8ec0a6b8e7a5d4cfb59e533524af2b4a537e00da12828abd062eaec6978556e3dd9149a020db2591b\n path: .yarn/plugins/yarn-plugin-nixify.cjs\n spec: "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/yarn-plugin-nixify-patched/raw/commit/4528fdd20b30d869262443b3f044549810e75fb8/dist/yarn-plugin-nixify.js"\n', + ); for (const lane of ["browser", "server", "remote"]) create( `src/${lane}.ts`, @@ -56,22 +72,36 @@ export async function executionScaffold( flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; }; in { - quixosPackages.checkedArtifacts = { plan, generator, core, sharedRuntime, typescript, packageRevisionId, react ? null, ... }: - (import (helpers + "/artifacts.nix")) { - inherit pkgs plan core sharedRuntime typescript packageRevisionId; - protocol = generator; - src = ./.; - components = let entries = builtins.fromJSON (builtins.readFile ./quixos.components.json); in - if entries == {} then null else - if react == null then throw "Component entries require the workspace-selected React runtime" else - { inherit (react) sdk runtime; inherit entries; }; - portable = { - entry = "src/server.ts"; - entries.browser = "src/browser.ts"; - bindingOutput = "src/gen/qx.ts"; - }; - remote = { entry = "src/remote.ts"; bindingOutput = "src/gen/remote.ts"; }; - }; + devShells.default = (import (helpers + "/quixos-package-helpers.nix")).mkCaminoYarnShell { inherit pkgs; }; + quixosPackages.checkedArtifacts = context: + import ./package.nix { inherit pkgs context; camino = import (helpers + "/quixos-package-helpers.nix"); }; + }); +} +`, + ); + create( + "package.nix", + `{ pkgs, camino, context }: +let + plan = builtins.fromJSON (builtins.readFile context.plan); + package = pkgs.lib.findFirst (entry: entry.revision == context.packageRevisionId) + (throw "Package missing from checked plan") plan.definition.packages; + portable = builtins.filter (entry: entry.execution.kind != "remote") package.exports; + remote = builtins.filter (entry: entry.execution.kind == "remote") package.exports; + modules = import ./components.nix; + dependencies = if builtins.pathExists ./yarn-project.nix + then camino.mkCaminoYarnDependencies { inherit pkgs; src = ./.; } else null; +in camino.assembleCaminoPackage { + inherit pkgs context; + artifacts = + pkgs.lib.optional (portable != []) (camino.mkCaminoTypeScriptPackage { + inherit pkgs context dependencies; src = ./.; + entry = "src/server.ts"; entries.browser = "src/browser.ts"; + targets = pkgs.lib.unique (pkgs.lib.concatMap (entry: entry.execution.targets) portable); + }) ++ pkgs.lib.optional (remote != []) (camino.mkCaminoTypeScriptService { + inherit pkgs context dependencies; src = ./.; entry = "src/remote.ts"; + }) ++ pkgs.lib.optional (modules != {}) (camino.mkCaminoReactPackage { + inherit pkgs context dependencies modules; src = ./.; }); } `, @@ -163,7 +193,7 @@ export async function executionScaffold( for (const [file, content] of Object.entries(spec.initialFiles)) { if ( typeof content !== "string" || - !/^(?:package\.qx|quixos\.components\.json|quixos\.controllers\.json|README\.md|(?:src|queries)\/(?:[A-Za-z0-9_-]+\/)*[A-Za-z0-9_.-]+)$/.test( + !/^(?:package\.qx|(?:package|components|flake|yarn-project)\.nix|package\.json|yarn\.lock|\.yarnrc\.yml|\.gitignore|\.yarn\/plugins\/[A-Za-z0-9_.-]+\.cjs|quixos\.controllers\.json|README\.md|(?:src|queries)\/(?:[A-Za-z0-9_-]+\/)*[A-Za-z0-9_.-]+)$/.test( file, ) || file.split("/").some((part) => part === ".." || part === "." || part === "gen") diff --git a/src/capability-language/structural-plan.ts b/src/capability-language/structural-plan.ts index 80abff8..fe5cfae 100644 --- a/src/capability-language/structural-plan.ts +++ b/src/capability-language/structural-plan.ts @@ -28,7 +28,7 @@ type Change = { file: string; before: string | null; after: string; mode: number type Journal = { schemaVersion: 1; id: string; root: string; phase: "prepared" | "complete"; changes: Change[] }; const safeFile = (file: string) => { if ( - !/^(?:[A-Za-z0-9_-][A-Za-z0-9_.-]*\/)*(?:\.gitignore|\.yarnrc.yml|[A-Za-z0-9_-][A-Za-z0-9_.-]*\.(?:qx|graphql|lock|ts|tsx|css|mjs|json|nix|txtpb|md))$/.test( + !/^(?:[A-Za-z0-9_-][A-Za-z0-9_.-]*\/)*(?:\.gitignore|\.yarnrc\.yml|\.yarn\/plugins\/[A-Za-z0-9_-][A-Za-z0-9_.-]*\.cjs|[A-Za-z0-9_-][A-Za-z0-9_.-]*\.(?:qx|graphql|lock|ts|tsx|css|mjs|json|nix|txtpb|md))$/.test( file, ) || file.split("/").some((part) => [".git", ".jj", ".quixos", "node_modules"].includes(part)) @@ -141,7 +141,7 @@ export const planStructure = async (rootPath: string, request: StructuralRequest for (const change of changes) { if (change.file.endsWith(".qx") && parseQx(change.after, change.file).diagnostics.length) throw new Error(`Invalid QX syntax in ${change.file}`); - if (change.file.endsWith(".lock") && !parseQuixosLockDocument(change.after, change.file).ok) + if (path.basename(change.file) === "quixos.lock" && !parseQuixosLockDocument(change.after, change.file).ok) throw new Error(`Invalid lock syntax in ${change.file}`); } } else { diff --git a/test/component-nix.test.ts b/test/component-nix.test.ts new file mode 100644 index 0000000..6582e57 --- /dev/null +++ b/test/component-nix.test.ts @@ -0,0 +1,27 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import { componentEntries } from "../src/capability-language/component-nix.js"; +test("component edit surface parses literal Nix without evaluating arbitrary expressions", async () => { + assert.deepEqual( + { + ...(await componentEntries( + `{\n # retained author comment\n "component:card" = { export = "Card"; entry = "src/card.tsx"; };\n}\n`, + )), + }, + { "component:card": { entry: "src/card.tsx", export: "Card" } }, + ); + await assert.rejects( + componentEntries('let x = builtins.abort "must not evaluate"; in x'), + /supported literal-entry shape|literal strings|supported scaffold shape/, + ); + await assert.rejects( + componentEntries( + '{\n "component:card" = { entry = "${builtins.abort "must not evaluate"}"; export = "Card"; };\n}\n', + ), + /literal strings|supported literal-entry shape/, + ); + await assert.rejects( + componentEntries('{\n "component:card" = { entry = "src/card.tsx"; export = "Card"; extra = true; };\n}\n'), + /Unsupported component entry property/, + ); +}); diff --git a/test/component-scaffold.test.ts b/test/component-scaffold.test.ts index 45c7805..e416f41 100644 --- a/test/component-scaffold.test.ts +++ b/test/component-scaffold.test.ts @@ -5,6 +5,7 @@ import os from "node:os"; import path from "node:path"; import { execFile as callback } from "node:child_process"; import { promisify } from "node:util"; +import { componentEntries } from "../src/capability-language/component-nix.js"; import { scaffoldRecipe } from "../src/capability-language/scaffold-recipes.js"; import { planStructure, applyStructure } from "../src/capability-language/structural-plan.js"; const execFile = promisify(callback); @@ -31,12 +32,23 @@ test("checked component scaffolding composes with execution handlers without rep id: "component:card", declaration: 'module Card id "component:card" implements View.render;', }); - assert.deepEqual(JSON.parse(await fs.readFile(path.join(root, "quixos.components.json"), "utf8")), { - "component:card": { entry: "src/components/Card.tsx", export: "Card" }, - }); + assert.deepEqual( + { ...(await componentEntries(await fs.readFile(path.join(root, "components.nix"), "utf8"))) }, + { + "component:card": { entry: "src/components/Card.tsx", export: "Card" }, + }, + ); const card = path.join(root, "src/components/Card.tsx"); await fs.appendFile(card, "\n// authored extension\n"); const retained = await fs.readFile(card, "utf8"); + const flake = path.join(root, "flake.nix"); + await fs.appendFile(flake, "\n# retained authored toolchain configuration\n"); + const retainedFlake = await fs.readFile(flake, "utf8"); + const entriesFile = path.join(root, "components.nix"); + await fs.writeFile( + entriesFile, + (await fs.readFile(entriesFile, "utf8")).replace("{\n", "{\n # retained entry comment\n"), + ); await apply("function", { name: "echo", id: "echo", @@ -48,8 +60,10 @@ test("checked component scaffolding composes with execution handlers without rep declaration: 'module Details id "component:details" implements View.render;', }); assert.equal(await fs.readFile(card, "utf8"), retained); + assert.equal(await fs.readFile(flake, "utf8"), retainedFlake); + assert.match(await fs.readFile(entriesFile, "utf8"), /retained entry comment/); assert.match(await fs.readFile(path.join(root, "src/server.ts"), "utf8"), /echo/); - assert.match(await fs.readFile(path.join(root, "flake.nix"), "utf8"), /react \? null/); + assert.match(await fs.readFile(path.join(root, "flake.nix"), "utf8"), /import \.\/package\.nix/); await assert.rejects( apply("component", { name: "Card", @@ -67,6 +81,17 @@ test("checked component scaffolding composes with execution handlers without rep }), /exactly one/, ); + const beforeUnsupported = await fs.readFile(packageFile, "utf8"); + await fs.writeFile(entriesFile, '{\n custom = builtins.abort "must not evaluate";\n}\n'); + await assert.rejects( + apply("component", { + name: "Unsupported", + id: "component:unsupported", + declaration: 'module Unsupported id "component:unsupported" implements View.render;', + }), + /literal-entry shape/, + ); + assert.equal(await fs.readFile(packageFile, "utf8"), beforeUnsupported); }); test("controller scaffolding preserves existing registrations and rejects duplicate identities", async (context) => { diff --git a/test/scaffold-recipes.test.ts b/test/scaffold-recipes.test.ts index 7406b0c..ef3f61d 100644 --- a/test/scaffold-recipes.test.ts +++ b/test/scaffold-recipes.test.ts @@ -47,7 +47,7 @@ test("execution scaffolds route typed handlers by declared effect and target wit assert.match(await read("src/impl/asyncWork.ts"), /RemoteImplementation/); assert.match(await read("src/impl/both.ts"), /PortableImplementation/); assert.match(await read("flake.nix"), /checkedArtifacts/); - assert.match(await read("flake.nix"), /entries.browser/); + assert.match(await read("package.nix"), /entries.browser/); await assert.rejects(add("both", "transaction targets [browser, server]"), /unique/); await assert.rejects(add("invalid", "snapshot targets [remote]"), /browser\/server/); await assert.rejects(apply("function", { name: "missing", id: "export:missing" }), /explicit execution/); diff --git a/test/structural-plan.test.ts b/test/structural-plan.test.ts index d57c6a5..8ecaedc 100644 --- a/test/structural-plan.test.ts +++ b/test/structural-plan.test.ts @@ -61,4 +61,28 @@ test("structural plans validate the graph, journal originals, and reject stale e await applyStructure(draft); assert.match(await fs.readFile(path.join(root, "workspace.qx"), "utf8"), /import interface NotImplementedYet/); await assert.rejects(() => planStructure(root, { ...provisional, validation: "resource-graph" })); + const plugin = ".yarn/plugins/yarn-plugin-nixify.cjs"; + await applyStructure( + await planStructure(root, { + kind: "workspace", + validation: "syntax", + files: [ + { file: plugin, create: "module.exports = {};\n" }, + { file: "yarn.lock", create: "__metadata:\n version: 8\n" }, + { file: "flake.lock", create: '{"version":7}\n' }, + ], + }), + ); + assert.equal(await fs.readFile(path.join(root, plugin), "utf8"), "module.exports = {};\n"); + for (const file of [".yarn/../escape.cjs", ".yarn/cache/entry.cjs", ".git/hooks/hook.cjs"]) { + await assert.rejects( + () => + planStructure(root, { + kind: "workspace", + validation: "syntax", + files: [{ file, create: "" }], + }), + /Unsafe scaffold path/, + ); + } }); From eba85ba1584affef3460161a10bba943f88e7f6a Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Tue, 22 Sep 2026 15:31:42 -0700 Subject: [PATCH 57/91] Standardize Camino query references and retire live field sidecars --- src/bindings/portable-client.ts | 5 +- src/bindings/react.ts | 20 +------ src/capability-model/controllers.ts | 4 +- src/query/compile.ts | 40 ++++--------- src/query/presentation.ts | 58 ------------------- src/query/relational-compile.ts | 11 ++-- src/query/relational-schema.ts | 12 ++-- src/query/schema.ts | 6 +- src/query/types.ts | 1 - test/controller-registry.test.ts | 10 ++-- test/emit-managed.ts | 6 +- test/execution-world.test.ts | 2 +- .../controller-device/enabled.graphql | 2 +- .../queries/editor-inputs.graphql | 2 +- .../queries/editor-view.graphql | 2 +- .../queries/highlight-list.graphql | 2 +- .../queries/highlight-scope.graphql | 2 +- .../queries/highlight-window.graphql | 2 +- .../queries/reader-screen.graphql | 8 +-- .../queries/replica-inputs.graphql | 4 +- test/fixtures/query-aggregation.ts | 2 +- test/fixtures/query-workspace.ts | 17 +++--- test/forwarding.test.ts | 2 +- test/portable-bindings.test.ts | 11 +--- test/query-aggregation.test.ts | 10 ++-- test/query-compiler.test.ts | 46 +++++---------- test/query-workspace.test.ts | 2 +- test/react-fields.test.ts | 16 ++--- 28 files changed, 88 insertions(+), 217 deletions(-) delete mode 100644 src/query/presentation.ts diff --git a/src/bindings/portable-client.ts b/src/bindings/portable-client.ts index 1f9ac00..7ba014b 100644 --- a/src/bindings/portable-client.ts +++ b/src/bindings/portable-client.ts @@ -76,13 +76,10 @@ export function generatePortableClientBindings( const operations = query.operations.map( (key) => plan.definition.operations.find((operation) => operation.key === key)!, ); - const live = (selections: readonly QuerySelection[]): boolean => - selections.some((selection) => !!selection.liveSelectionId || live(selection.selection)); if ( operations.some( (operation) => operation.execution.kind !== "snapshot" || !operation.execution.targets.includes("server"), - ) || - live(query.query.checked.selection) + ) ) { unavailable.push({ key: query.id, reason: "QUERY_NOT_SNAPSHOT_PROJECTION" }); continue; diff --git a/src/bindings/react.ts b/src/bindings/react.ts index 237caa8..5034cd6 100644 --- a/src/bindings/react.ts +++ b/src/bindings/react.ts @@ -1,6 +1,5 @@ import type { BindingSchema } from "./index.js"; import type { ValueType } from "../capability-model/types.js"; -import { queryPresentation } from "../query/presentation.js"; /** Browser projection of the SAME checked RPC types, not a second props schema. */ export function generateReactBindings( @@ -131,25 +130,9 @@ export function generateReactBindings( return type(value); }; const queries = pkg.checkedQueries ?? []; - const presentedType = ( - value: ValueType, - fields: ReturnType, - path: string[] = [], - ): string => { - const field = fields.find((field) => JSON.stringify(field.path) === JSON.stringify(path)); - if (field) - return `${field.conditions.length ? "(" : ""}${field.setOperationId ? "WritableQueryField" : "QueryField"}<${type(field.valueType)}>${field.conditions.length ? " | null)" : ""}`; - if (value.kind === "optional") return `(${presentedType(value.value, fields, path)} | null)`; - if (value.kind === "list") return `Array<${presentedType(value.value, fields, [...path, "*"])}>`; - if (value.kind === "record") - return `{${Object.entries(value.fields) - .map(([key, child]) => `${q(key)}: ${presentedType(child, fields, [...path, key])}`) - .join(";")}}`; - return queryType(value); - }; const queryCode = `export type QueryVariables = {${queries.map((query) => `${q(query.declaration.displayName)}: ${queryType(query.variables)}`).join(";")}};\n` + - `export type QueryResults = {${queries.map((query) => `${q(query.declaration.displayName)}: ${presentedType(query.output, queryPresentation(query, schema.interfaces))}`).join(";")}};\n` + + `export type QueryResults = {${queries.map((query) => `${q(query.declaration.displayName)}: ${queryType(query.output)}`).join(";")}};\n` + `export const queries: {${queries.map((query) => `${q(query.declaration.displayName)}: QueryDescriptor`).join(";")}} = ${JSON.stringify( Object.fromEntries( queries.map((query) => [ @@ -160,7 +143,6 @@ export function generateReactBindings( root: query.declaration.root, variables: query.variables, output: query.output, - liveFields: queryPresentation(query, schema.interfaces), watch: query.declaration.watch, }, ]), diff --git a/src/capability-model/controllers.ts b/src/capability-model/controllers.ts index 6fbc942..b06acd9 100644 --- a/src/capability-model/controllers.ts +++ b/src/capability-model/controllers.ts @@ -24,7 +24,7 @@ export function validateControllers( objects = selected(root?.selection, "objects"), entries = selected(objects?.selection, "entries"), node = selected(entries?.selection, "node"), - qx = selected(node?.selection, "_qx"), + qx = selected(node?.selection, "_camino"), ref = selected(qx?.selection, "ref"); const all = objects?.arguments.all; if ( @@ -44,7 +44,7 @@ export function validateControllers( ) fail( `${path}.registry`, - "Controller registry requires a native/portable workspace query over its subject, no variables, and root.objects(all: 1..64).entries.node._qx.ref without aliases or conditional selections", + "Controller registry requires a native/portable workspace query over its subject, no variables, and root.objects(all: 1..64).entries.node._camino.ref without aliases or conditional selections", ); } const iface = interfaces.find((i) => i.revisionId === controller.subject && !i.template); diff --git a/src/query/compile.ts b/src/query/compile.ts index 4fd4ee9..e1d4be7 100644 --- a/src/query/compile.ts +++ b/src/query/compile.ts @@ -87,6 +87,16 @@ export async function compileQuery( definitions.push(...document.definitions); } const document: DocumentNode = { kind: "Document" as DocumentNode["kind"], definitions }; + visit(document, { + Directive(node) { + if (node.name.value === "live") + fail( + "QUERY_RETIRED_DIRECTIVE", + "@live is retired. Observations watch ordinary query values; use checked operations for mutations.", + node, + ); + }, + }); const generated = querySchema(declaration, interfaces, document); const operations = definitions.filter((entry) => entry.kind === "OperationDefinition"); if ( @@ -201,16 +211,7 @@ export async function compileQuery( Field(node) { const parent = info.getParentType(); const contract = parent && generated.byName.get(parent.name); - if (node.directives?.some((directive) => directive.name.value === "live")) { - const member = contract?.members.find((entry) => entry.displayName === node.name.value); - if (!member || member.kind !== "value" || member.queryRead?.execution !== "native") - fail( - "QUERY_LIVE_UNSUPPORTED", - "@live requires a direct native-queryable value field, not RPC enrichment or a synthetic result", - node, - ); - } - if (!contract || node.name.value === "_qx") return; + if (!contract || node.name.value === "_camino") return; mark(contract.revisionId, node.name.value, "select", node); const member = contract.members.find((entry) => entry.displayName === node.name.value)!; if (member.kind !== "relationship" || (member.cardinality !== "many" && member.cardinality !== "many-unique")) @@ -425,13 +426,6 @@ export async function compileQuery( { name: node.name.value, key: node.alias?.value ?? node.name.value, - ...(node.directives?.some((directive) => directive.name.value === "live") - ? { - liveSelectionId: createHash("sha256") - .update(JSON.stringify([node.loc?.source.name, node.loc?.start, contract?.revisionId, member?.id])) - .digest("hex"), - } - : {}), ...(member && contract ? { interfaceRevisionId: contract.revisionId, memberId: member.id } : {}), ...(member?.kind === "relationship" ? { targetInterfaceRevisionId: generated.target(member) } : {}), conditions: [...inherited, ...conditions(node.directives)], @@ -447,18 +441,6 @@ export async function compileQuery( const normalized = print(document), schema = printSchema(generated.schema); const selections = selection(operations[0]!.selectionSet, generated.schema.getQueryType()!); - const checkPresentation = (entries: QuerySelection[]) => { - for (const key of new Set(entries.map((entry) => entry.key))) { - const siblings = entries.filter((entry) => entry.key === key); - if (siblings.some((entry) => entry.liveSelectionId) && siblings.some((entry) => !entry.liveSelectionId)) - throw new QueryCompileError( - "QUERY_LIVE_CONFLICT", - `${key} mixes live and plain selections; use separate aliases`, - ); - checkPresentation(siblings.flatMap((entry) => entry.selection)); - } - }; - checkPresentation(selections); const definitionDigest = createHash("sha256") .update( canonicalJson({ diff --git a/src/query/presentation.ts b/src/query/presentation.ts deleted file mode 100644 index 2e9ddb5..0000000 --- a/src/query/presentation.ts +++ /dev/null @@ -1,58 +0,0 @@ -import type { InterfaceRevision, ValueType } from "../capability-model/types.js"; -import type { CheckedQuery, QuerySelection } from "./types.js"; - -/** Browser presentation is separate from the portable query value contract. */ -export function queryPresentation(query: CheckedQuery, interfaces: readonly InterfaceRevision[]) { - const result: { - path: string[]; - selectionId: string; - interfaceRevisionId: string; - getOperationId: string; - setOperationId?: string; - watchOperationId?: string; - inputKind: "value" | "fields"; - valueType: ValueType; - conditions: (QuerySelection["conditions"][number] & { defaultValue?: boolean })[]; - }[] = []; - const visit = (type: ValueType, selections: QuerySelection[], path: string[]) => { - if (type.kind === "optional") return visit(type.value, selections, path); - if (type.kind === "list") return visit(type.value, selections, [...path, "*"]); - if (type.kind !== "record") return; - for (const [name, field] of Object.entries(type.fields)) { - const matches = selections.filter((entry) => entry.key === name); - if (matches.some((entry) => entry.liveSelectionId) && matches.some((entry) => !entry.liveSelectionId)) - throw new Error(`QUERY_LIVE_CONFLICT: ${[...path, name].join(".")} mixes live and plain selections`); - for (const entry of matches) { - if (entry.liveSelectionId) { - const iface = interfaces.find((iface) => iface.revisionId === entry.interfaceRevisionId)!; - const member = iface.members.find((member) => member.id === entry.memberId)!; - if (member.kind !== "value") throw new Error("QUERY_LIVE_UNSUPPORTED"); - const get = member.operations.find((op) => op.displayName === "get")!; - const set = member.operations.find((op) => op.displayName === "set"); - result.push({ - path: [...path, name], - selectionId: entry.liveSelectionId, - interfaceRevisionId: iface.revisionId, - getOperationId: get.id, - setOperationId: set?.id, - watchOperationId: member.operations.find((op) => op.displayName === "watch-start")?.id, - inputKind: set?.inputType.kind === "record" ? "fields" : "value", - valueType: get.outputType, - conditions: entry.conditions.map((condition) => { - const fallback = - condition.value.kind === "variable" ? query.variableDefaults[condition.value.name] : undefined; - return { - ...condition, - ...(fallback?.kind === "literal" && typeof fallback.value === "boolean" - ? { defaultValue: fallback.value } - : {}), - }; - }), - }); - } else visit(field, entry.selection, [...path, name]); - } - } - }; - visit(query.output, query.selection, []); - return result; -} diff --git a/src/query/relational-compile.ts b/src/query/relational-compile.ts index c574ad1..db1fb6a 100644 --- a/src/query/relational-compile.ts +++ b/src/query/relational-compile.ts @@ -94,7 +94,8 @@ export function relationalCompiler( if (!prefix(base, path)) return false; // Object identity does not determine which incoming membership carried it. return ( - last === "entry" || !(path[base.length] === "_qx" && ["entry", "mapKey"].includes(path[base.length + 1] ?? "")) + last === "entry" || + !(path[base.length] === "_camino" && ["entry", "mapKey"].includes(path[base.length + 1] ?? "")) ); }); if (!ok) @@ -153,7 +154,7 @@ export function relationalCompiler( available?: Availability, ): QueryExpression => { requireAvailable(names, available, node); - const meta = names.at(-2) === "_qx"; + const meta = names.at(-2) === "_camino"; let fieldIndex = names.length - 1; if (!meta) { let cursor = root; @@ -334,10 +335,10 @@ export function relationalCompiler( children.push({ kind: "not", child: { kind: "and", children: children.splice(before) } }); } else if (current.kind === "pair" && (name === "source" || name === "target")) visit(current[name], field.value, [...base, name]); - else if (name === "_qx") { + else if (name === "_camino") { for (const meta of pairs(field.value)) { if (meta.name.value !== "relations") { - const expr = expression(row, [...base, "_qx", meta.name.value], ["predicate"], meta, available); + const expr = expression(row, [...base, "_camino", meta.name.value], ["predicate"], meta, available); children.push( ...(comparisons(meta.value, (operator, value) => ({ kind: "compare", @@ -531,7 +532,7 @@ export function relationalCompiler( expression: { ...k.expression, path: [{ kind: "source" as const }, ...k.expression.path] }, })), { - path: ["target", "_qx", "entry"], + path: ["target", "_camino", "entry"], expression: { path: [{ kind: "target" as const }], leaf: { kind: "entry" as const }, diff --git a/src/query/relational-schema.ts b/src/query/relational-schema.ts index ccdff64..04612ba 100644 --- a/src/query/relational-schema.ts +++ b/src/query/relational-schema.ts @@ -205,7 +205,9 @@ export function relationalSchema(env: RelationalSchemaEnvironment, document?: Do metadata[name] = { type: !operator && nullable ? t : new GraphQLNonNull(t) }; } if (Object.keys(metadata).length) - result._qx = { type: new GraphQLNonNull(out("ColumnsMeta", row, () => metadata, `${operator}:${nullable}`)) }; + result._camino = { + type: new GraphQLNonNull(out("ColumnsMeta", row, () => metadata, `${operator}:${nullable}`)), + }; // A type may have no matching scalar at this node; a private schema sentinel // keeps it valid while compiler validation forbids selecting that sentinel. if (!Object.keys(result).length) result._unavailable = { type: GraphQLBoolean }; @@ -233,7 +235,7 @@ export function relationalSchema(env: RelationalSchemaEnvironment, document?: Do else if (queryKeyType(field.type)) result[name] = { type: GraphQLBoolean }; } const meta = Object.fromEntries([...leafFields(row)].map(([name]) => [name, { type: GraphQLBoolean }])); - if (Object.keys(meta).length) result._qx = { type: inp("KeyMeta", row, () => meta) }; + if (Object.keys(meta).length) result._camino = { type: inp("KeyMeta", row, () => meta) }; return result; }); const comparisons = ( @@ -266,7 +268,7 @@ export function relationalSchema(env: RelationalSchemaEnvironment, document?: Do if (!operator || operator === "countPresent") meta[name] = { type: ordering ? env.direction : compare(operator ? aggregateType(operator, type) : type) }; if (Object.keys(meta).length) - result._qx = { type: inp("ExpressionMeta", row, () => meta, `${operator}:${ordering}`) }; + result._camino = { type: inp("ExpressionMeta", row, () => meta, `${operator}:${ordering}`) }; if (!Object.keys(result).length) result._unavailable = { type: GraphQLBoolean }; return result; }, @@ -306,7 +308,7 @@ export function relationalSchema(env: RelationalSchemaEnvironment, document?: Do if (field.kind === "leaf" && !comparableValue(field.type)) continue; result[name] = { type: field.kind === "row" ? where(field.row) : compare(field.type) }; } - result._qx = { + result._camino = { type: inp("WhereMeta", row, () => { const meta: GraphQLInputFieldConfigMap = {}; for (const [name, type] of leafFields(row)) meta[name] = { type: compare(type) }; @@ -397,7 +399,7 @@ export function relationalSchema(env: RelationalSchemaEnvironment, document?: Do const discoverObject = (row: QueryRow, set: SelectionSetNode) => { for (const node of selections(set)) if (node.selectionSet) { - if (node.name.value === "_qx") { + if (node.name.value === "_camino") { for (const meta of selections(node.selectionSet)) if (meta.name.value === "relations" && meta.selectionSet) for (const edge of selections(meta.selectionSet)) { diff --git a/src/query/schema.ts b/src/query/schema.ts index 45403f5..63a0cc5 100644 --- a/src/query/schema.ts +++ b/src/query/schema.ts @@ -11,8 +11,6 @@ import { GraphQLList, GraphQLNonNull, GraphQLSchema, - GraphQLDirective, - DirectiveLocation, specifiedDirectives, type GraphQLOutputType, type GraphQLInputType, @@ -198,7 +196,7 @@ export function querySchema( ...(helpers ? { relations: { type: new GraphQLNonNull(helpers) } } : {}), }, }); - const fields: GraphQLFieldConfigMap = { _qx: { type: new GraphQLNonNull(metadata) } }; + const fields: GraphQLFieldConfigMap = { _camino: { type: new GraphQLNonNull(metadata) } }; for (const member of contract(id).members) { if (member.kind === "operation" || member.kind === "module" || !member.queryRead) continue; if (!/^[_A-Za-z][_0-9A-Za-z]*$/.test(member.displayName) || member.displayName.startsWith("_")) @@ -258,7 +256,7 @@ export function querySchema( return result; }; const schema = new GraphQLSchema({ - directives: [...specifiedDirectives, new GraphQLDirective({ name: "live", locations: [DirectiveLocation.FIELD] })], + directives: specifiedDirectives, query: new GraphQLObjectType({ name: "QxQuery", fields: { root: { type: new GraphQLNonNull(object(root.interface)) } }, diff --git a/src/query/types.ts b/src/query/types.ts index 4c6eff3..bffbe61 100644 --- a/src/query/types.ts +++ b/src/query/types.ts @@ -102,7 +102,6 @@ export type QueryArgument = | { kind: "list"; values: QueryArgument[] } | { kind: "object"; fields: Record }; export interface QuerySelection { - liveSelectionId?: string; name: string; key: string; interfaceRevisionId?: InterfaceRevisionId; diff --git a/test/controller-registry.test.ts b/test/controller-registry.test.ts index a22ea98..177b0af 100644 --- a/test/controller-registry.test.ts +++ b/test/controller-registry.test.ts @@ -34,16 +34,16 @@ test("controller discovery requires complete bounded accepted-state membership", const check = async (document: string) => parseControllerCatalog(metadata, [iface], [await compileQuery(declaration, [iface], async () => document)]); assert.equal( - (await check("query Enabled {root {objects(all:64,where:{enabled:{eq:true}}) {entries {node {_qx {ref}}}}}}")) + (await check("query Enabled {root {objects(all:64,where:{enabled:{eq:true}}) {entries {node {_camino {ref}}}}}}")) .length, 1, ); for (const document of [ - "query Enabled {root {objects(first:64) {entries {node {_qx {ref}}}}}}", - "query Enabled {root {objects(all:65) {entries {node {_qx {ref}}}}}}", - "query Enabled {root {devices:objects(all:64) {entries {node {_qx {ref}}}}}}", + "query Enabled {root {objects(first:64) {entries {node {_camino {ref}}}}}}", + "query Enabled {root {objects(all:65) {entries {node {_camino {ref}}}}}}", + "query Enabled {root {devices:objects(all:64) {entries {node {_camino {ref}}}}}}", "query Enabled {root {objects(all:64) {entries {node {enabled}}}}}", - "query Enabled($enabled:Boolean!) {root {objects(all:64,where:{enabled:{eq:$enabled}}) {entries {node {_qx {ref}}}}}}", + "query Enabled($enabled:Boolean!) {root {objects(all:64,where:{enabled:{eq:$enabled}}) {entries {node {_camino {ref}}}}}}", ]) await assert.rejects(check(document), /registry|Controller/); assert.throws(() => parseControllerCatalog(metadata, [iface], []), /registry/); diff --git a/test/emit-managed.ts b/test/emit-managed.ts index 59c39a7..cbb255f 100644 --- a/test/emit-managed.ts +++ b/test/emit-managed.ts @@ -115,10 +115,10 @@ package Owner id "package:owner" revision "package:owner@1" { async (name) => ({ "inputs.graphql": - "query Inputs($label: String!) { root { objects(all: 100, where: {label: {eq: $label}}) { entries { key node { _qx {ref} label } } } } }", + "query Inputs($label: String!) { root { objects(all: 100, where: {label: {eq: $label}}) { entries { key node { _camino {ref} label } } } } }", "view.graphql": - "query View { root { availableObjects(all: 100) { entries { key node { _qx {ref} label } } } } }", - "editor.graphql": "query Editor { root { _qx {ref} label body notes } }", + "query View { root { availableObjects(all: 100) { entries { key node { _camino {ref} label } } } } }", + "editor.graphql": "query Editor { root { _camino {ref} label body notes } }", "editor-view.graphql": "query EditorView { root { label body notes } }", })[name]!, ), diff --git a/test/execution-world.test.ts b/test/execution-world.test.ts index af3704e..963d99f 100644 --- a/test/execution-world.test.ts +++ b/test/execution-world.test.ts @@ -302,7 +302,7 @@ test("a count-only local query still requires complete relationship admission", const workspace = await loadReaderWorkspace((name, text) => { if (name === "queries/replica-inputs.graphql") return source; if (name === "queries/reader-screen.graphql") - return "query ReaderScreen { root { _qx { relations { highlights { aggregate { count } } } } } }"; + return "query ReaderScreen { root { _camino { relations { highlights { aggregate { count } } } } } }"; return text; }); assert.throws(() => compileExecutionPlan(workspace), /REPLICA_TRAVERSAL_MISSING|REPLICA_RELATION_INCOMPLETE/); diff --git a/test/fixtures/controller-device/enabled.graphql b/test/fixtures/controller-device/enabled.graphql index 64b56c9..5911764 100644 --- a/test/fixtures/controller-device/enabled.graphql +++ b/test/fixtures/controller-device/enabled.graphql @@ -1 +1 @@ -query Enabled {root {objects(all:64, where:{enabled:{eq:true}}) {entries {node {_qx {ref}}}}}} +query Enabled {root {objects(all:64, where:{enabled:{eq:true}}) {entries {node {_camino {ref}}}}}} diff --git a/test/fixtures/local-first-reader/queries/editor-inputs.graphql b/test/fixtures/local-first-reader/queries/editor-inputs.graphql index b69323d..d506888 100644 --- a/test/fixtures/local-first-reader/queries/editor-inputs.graphql +++ b/test/fixtures/local-first-reader/queries/editor-inputs.graphql @@ -1 +1 @@ -query HighlightEditorInputs { root { _qx {ref} color range {sourceRevision start end} } } +query HighlightEditorInputs { root { _camino {ref} color range {sourceRevision start end} } } diff --git a/test/fixtures/local-first-reader/queries/editor-view.graphql b/test/fixtures/local-first-reader/queries/editor-view.graphql index 97a1cc4..f205319 100644 --- a/test/fixtures/local-first-reader/queries/editor-view.graphql +++ b/test/fixtures/local-first-reader/queries/editor-view.graphql @@ -1 +1 @@ -query HighlightEditorView { root { _qx {ref} color @live range {sourceRevision start end} } } +query HighlightEditorView { root { _camino {ref} color range {sourceRevision start end} } } diff --git a/test/fixtures/local-first-reader/queries/highlight-list.graphql b/test/fixtures/local-first-reader/queries/highlight-list.graphql index 13e0094..3fb23b7 100644 --- a/test/fixtures/local-first-reader/queries/highlight-list.graphql +++ b/test/fixtures/local-first-reader/queries/highlight-list.graphql @@ -1 +1 @@ -query HighlightList($color: String!) { root { availableObjects(all: 200, where: {color: {eq: $color}}, orderBy: {range: {start: ASC}}) { entries { key node { _qx {ref} color @live range {sourceRevision start end} } } } } } +query HighlightList($color: String!) { root { availableObjects(all: 200, where: {color: {eq: $color}}, orderBy: {range: {start: ASC}}) { entries { key node { _camino {ref} color range {sourceRevision start end} } } } } } diff --git a/test/fixtures/local-first-reader/queries/highlight-scope.graphql b/test/fixtures/local-first-reader/queries/highlight-scope.graphql index eb35067..db46a43 100644 --- a/test/fixtures/local-first-reader/queries/highlight-scope.graphql +++ b/test/fixtures/local-first-reader/queries/highlight-scope.graphql @@ -1 +1 @@ -query HighlightScope($color: String!) { root { objects(all: 200, where: {color: {eq: $color}}) { entries { key node { _qx {ref} color range {sourceRevision start end} } } } } } +query HighlightScope($color: String!) { root { objects(all: 200, where: {color: {eq: $color}}) { entries { key node { _camino {ref} color range {sourceRevision start end} } } } } } diff --git a/test/fixtures/local-first-reader/queries/highlight-window.graphql b/test/fixtures/local-first-reader/queries/highlight-window.graphql index b19d729..3fc3d1c 100644 --- a/test/fixtures/local-first-reader/queries/highlight-window.graphql +++ b/test/fixtures/local-first-reader/queries/highlight-window.graphql @@ -1,7 +1,7 @@ query HighlightWindow($color: String!) { root { objects(first: 2, where: {color: {eq: $color}}, orderBy: {range: {start: ASC}}) { - entries { key node { _qx {ref} color range {sourceRevision start end} } } + entries { key node { _camino {ref} color range {sourceRevision start end} } } pageInfo { hasNextPage endCursor } } } diff --git a/test/fixtures/local-first-reader/queries/reader-screen.graphql b/test/fixtures/local-first-reader/queries/reader-screen.graphql index 1f50d8c..3ed97d2 100644 --- a/test/fixtures/local-first-reader/queries/reader-screen.graphql +++ b/test/fixtures/local-first-reader/queries/reader-screen.graphql @@ -6,16 +6,16 @@ query ReaderScreen($color: String!) { entries { key node { - _qx { ref } + _camino { ref } range { sourceRevision start end } - color @live + color excerpt comments(all: 200) { - entries { key node { _qx { ref } content @live { text tags } } } + entries { key node { _camino { ref } content { text tags } } } } } } } - _qx { relations { highlights { aggregate { count } } } } + _camino { relations { highlights { aggregate { count } } } } } } diff --git a/test/fixtures/local-first-reader/queries/replica-inputs.graphql b/test/fixtures/local-first-reader/queries/replica-inputs.graphql index b69387b..7c8dde8 100644 --- a/test/fixtures/local-first-reader/queries/replica-inputs.graphql +++ b/test/fixtures/local-first-reader/queries/replica-inputs.graphql @@ -6,12 +6,12 @@ query ReplicaInputs { entries { key node { - _qx { ref } + _camino { ref } range { sourceRevision start end } color excerpt comments(all: 200) { - entries { key node { _qx { ref } content { text tags } } } + entries { key node { _camino { ref } content { text tags } } } } } } diff --git a/test/fixtures/query-aggregation.ts b/test/fixtures/query-aggregation.ts index 10c30e9..b107ebd 100644 --- a/test/fixtures/query-aggregation.ts +++ b/test/fixtures/query-aggregation.ts @@ -67,5 +67,5 @@ export const compileAggregation = (body: string, variables = "") => compileQuery( declaration, interfaces, - async () => `query Report${variables} { root { _qx { relations { tasks { ${body} } } } } }`, + async () => `query Report${variables} { root { _camino { relations { tasks { ${body} } } } } }`, ); diff --git a/test/fixtures/query-workspace.ts b/test/fixtures/query-workspace.ts index d2d7071..9999d65 100644 --- a/test/fixtures/query-workspace.ts +++ b/test/fixtures/query-workspace.ts @@ -76,22 +76,19 @@ export async function queryWorkspaceFixture(options: { live?: boolean } = {}) { const pkg: PackageRevision = pkgResult.resource.revision; const allInterfaces = [...interfaces.values(), ...(pkgResult.resource.specializations ?? [])]; const documents: Record = { - "extent.graphql": `query Extent($text: String! = "") {root {objects(first: 30, where: {title: {containsInsensitive: $text}}, orderBy: [{rank: ASC}]) {entries {node {_qx {ref} title rank}}}}}`, - "upcoming.graphql": `query Upcoming($first: Int!, $after: Cursor) {root {items(first: $first, after: $after, where: {done: {eq: false}}, orderBy: [{rank: ASC}]) {entries {key cursor node {_qx {ref} ...TaskRow}} pageInfo {hasNextPage endCursor}}}}`, + "extent.graphql": `query Extent($text: String! = "") {root {objects(first: 30, where: {title: {containsInsensitive: $text}}, orderBy: [{rank: ASC}]) {entries {node {_camino {ref} title rank}}}}}`, + "upcoming.graphql": `query Upcoming($first: Int!, $after: Cursor) {root {items(first: $first, after: $after, where: {done: {eq: false}}, orderBy: [{rank: ASC}]) {entries {key cursor node {_camino {ref} ...TaskRow}} pageInfo {hasNextPage endCursor}}}}`, "row.graphql": `fragment TaskRow on TaskFacts {title rank done assignee {name}}`, - "enriched.graphql": `query Enriched {root {items(first: 3) {entries {key node {_qx {ref} title score}}}}}`, - "ranked.graphql": `query Ranked {root {items(first: 3, where: {score: {gt: 0}}, orderBy: [{score: DESC}]) {entries {key node {_qx {ref} title}}}}}`, - "totals.graphql": `query Totals {root {_qx {relations {items {aggregate {count sum {rank}} groups(by: {done: true}, first: 10) {entries {group {done} aggregate {count sum {rank}}}}}}}}}`, - "score-totals.graphql": `query ScoreTotals {root {_qx {relations {items {aggregate {count sum {score}}}}}}}`, + "enriched.graphql": `query Enriched {root {items(first: 3) {entries {key node {_camino {ref} title score}}}}}`, + "ranked.graphql": `query Ranked {root {items(first: 3, where: {score: {gt: 0}}, orderBy: [{score: DESC}]) {entries {key node {_camino {ref} title}}}}}`, + "totals.graphql": `query Totals {root {_camino {relations {items {aggregate {count sum {rank}} groups(by: {done: true}, first: 10) {entries {group {done} aggregate {count sum {rank}}}}}}}}}`, + "score-totals.graphql": `query ScoreTotals {root {_camino {relations {items {aggregate {count sum {score}}}}}}}`, }; pkg.checkedQueries = await Promise.all( pkg.queries!.map((query) => compileQuery(query, allInterfaces, async (name) => options.live - ? documents[name]!.replace(/\btitle\b/g, "title @live").replace( - "title @live rank done", - "title @live rank @live done @live", - ) + ? documents[name]!.replace(/\btitle\b/g, "title").replace("title rank done", "title rank done") : documents[name]!, ), ), diff --git a/test/forwarding.test.ts b/test/forwarding.test.ts index 487d955..5674429 100644 --- a/test/forwarding.test.ts +++ b/test/forwarding.test.ts @@ -81,7 +81,7 @@ test("bind chains forward native reads, writes and watches without changing stor await compileQuery( revision.queries![0]!, [...interfaces.values()], - async () => `query Rows {root {objects(first: 10) {entries {node {title @live}}}}}`, + async () => `query Rows {root {objects(first: 10) {entries {node {title}}}}}`, ), ]; result.workspace.packageImports.push(revision); diff --git a/test/portable-bindings.test.ts b/test/portable-bindings.test.ts index 1f8b458..9e11724 100644 --- a/test/portable-bindings.test.ts +++ b/test/portable-bindings.test.ts @@ -107,15 +107,10 @@ test("server projection descriptors are distinct from canonical inputs and have assert.match(projections, /ConfirmedColor/); assert.match(projections, /satisfies ServerProjection/); assert.match(source.slice(source.indexOf("export const results")), /ConfirmedColor/); - const live = compileExecutionPlan( - await loadReaderWorkspace((name, text) => + await assert.rejects( + loadReaderWorkspace((name, text) => name === "queries/confirmed-color.graphql" ? text.replace("color", "color @live") : text, ), + /@live is retired/, ); - const rejected = generatePortableClientBindings(live, { target: "browser" }); - assert.doesNotMatch( - rejected.slice(rejected.indexOf("export const serverProjections"), rejected.indexOf("export const results")), - /ConfirmedColor/, - ); - assert.match(rejected, /QUERY_NOT_SNAPSHOT_PROJECTION/); }); diff --git a/test/query-aggregation.test.ts b/test/query-aggregation.test.ts index 91bb7b7..5a563d8 100644 --- a/test/query-aggregation.test.ts +++ b/test/query-aggregation.test.ts @@ -26,7 +26,7 @@ test("aggregate output uses exact count and sum types and nullable reductions", test("explicit expansion and identity distinct retain checked grouped operands", async () => { const checked = await compile(`expand { tags { - distinct(by: {source: {_qx: {ref: true}}, target: {color: true}}) { + distinct(by: {source: {_camino: {ref: true}}, target: {color: true}}) { groups(by: {target: {color: true}}, first: 50, having: {sum: {source: {estimatedHours: {gt: 0}}}}, orderBy: [{sum: {source: {estimatedHours: DESC}}}]) { @@ -55,7 +55,7 @@ test("distinct and grouping reject fields not determined by their selected keys" test("relationship existence predicates compile to typed plans", async () => { const checked = await compile( - `filter(where: {_qx: {relations: {tags: {some: {color: {in: ["red","blue"]}}}}}}) {aggregate {count}}`, + `filter(where: {_camino: {relations: {tags: {some: {color: {in: ["red","blue"]}}}}}}) {aggregate {count}}`, ); const plan = findPlan(checked.selection)!; assert.equal(plan.stages[1]!.operation.kind, "filter"); @@ -88,19 +88,19 @@ test("RPC continuation rejection is local to the affected membership boundary", ); const checked = await compileAggregationDocument(`query Report($after: Cursor) {root { tasks(first: 2, after: $after) {entries {node {cost}}} - _qx {relations {tasks {aggregate {sum {score}}}}} + _camino {relations {tasks {aggregate {sum {score}}}}} }}`); assert.equal(findPlan(checked.selection)!.terminals[0]!.residual, true); }); test("typed reference operands and scalar membership tests reject unbounded literal lists", async () => { const checked = await compile( - `filter(where: {_qx: {ref: {in: $tasks}}}) {aggregate {count}}`, + `filter(where: {_camino: {ref: {in: $tasks}}}) {aggregate {count}}`, "($tasks: [QxRef_Task!]!)", ); assert.match(JSON.stringify(checked.variables), /object-ref/); await assert.rejects( - compile(`filter(where: {_qx: {ref: {eq: "obj:made-up"}}}) {aggregate {count}}`), + compile(`filter(where: {_camino: {ref: {eq: "obj:made-up"}}}) {aggregate {count}}`), /typed variables/, ); await assert.rejects( diff --git a/test/query-compiler.test.ts b/test/query-compiler.test.ts index 0170666..cbdc52d 100644 --- a/test/query-compiler.test.ts +++ b/test/query-compiler.test.ts @@ -4,7 +4,6 @@ import { compileCapabilityResourceSource } from "../src/capability-language/inde import { compileQuery } from "../src/query/compile.js"; import { QueryCompileError } from "../src/query/types.js"; import { checkQueryTemplate } from "../src/query/templates.js"; -import { queryPresentation } from "../src/query/presentation.js"; import { querySelectionToWire } from "../src/query/proto.js"; import type { InterfaceRevision } from "../src/capability-model/types.js"; @@ -149,9 +148,9 @@ test("workspace roots expose a bounded interface extent, not a root object or wr async () => `query Upcoming { root { objects(first: 3, where: {done: {eq: false}}, orderBy: {title: ASC}) { - entries {key node {_qx {ref} title @live}} pageInfo {hasNextPage endCursor} + entries {key node {_camino {ref} title}} pageInfo {hasNextPage endCursor} } - _qx {relations {objects {aggregate {count sum {due}}}}} + _camino {relations {objects {aggregate {count sum {due}}}}} } }`, ); @@ -159,7 +158,7 @@ test("workspace roots expose a bounded interface extent, not a root object or wr assert.ok(!checked.effects.some((effect) => effect.memberId.includes("workspace-objects"))); assert.ok(JSON.stringify(checked.selection).includes("qx-internal-workspace-objects")); await assert.rejects( - compileQuery(declaration, [facts], async () => `query Upcoming {root {_qx {ref}}}`), + compileQuery(declaration, [facts], async () => `query Upcoming {root {_camino {ref}}}`), /QUERY_VALIDATION/, ); await assert.rejects( @@ -169,51 +168,34 @@ test("workspace roots expose a bounded interface extent, not a root object or wr }); const document = `query Upcoming($first: Int!, $before: Int64!) { root { items(first: $first, where: {done: {eq: false}, due: {lt: $before}}, orderBy: [{due: ASC}]) { - entries { key node { _qx { ref } ...Row } } pageInfo { hasNextPage endCursor } + entries { key node { _camino { ref } ...Row } } pageInfo { hasNextPage endCursor } } } }`; const compile = (query = document, row = "fragment Row on TaskFacts { title due }", clauses = "") => compileQuery(fixture(clauses), [collection, facts], async (name) => (name.endsWith("row.graphql") ? row : query)); -test("live selections preserve aliases, nullable values, fragment conditions and wire identity", async () => { +test("ordinary selections preserve aliases, fragment conditions and wire identity", async () => { const checked = await compile( `query Upcoming($show: Boolean!) {root {items(first: 3) {entries {node {plain: title ...Row @include(if: $show)}}}}}`, - `fragment Row on TaskFacts {label: title @live due @live}`, + `fragment Row on TaskFacts {label: title due}`, ); - const fields = queryPresentation(checked, [collection, facts]); + const node = checked.selection[0]!.selection[0]!.selection[0]!.selection[0]!; assert.deepEqual( - fields.map((f) => f.path), - [ - ["root", "items", "entries", "*", "node", "label"], - ["root", "items", "entries", "*", "node", "due"], - ], + node.selection.map((s) => s.key), + ["plain", "label", "due"], ); - assert.equal(fields[0]!.getOperationId, "title:get"); - assert.equal(fields[0]!.setOperationId, undefined); - assert.equal(fields[1]!.valueType.kind, "optional"); - assert.equal(fields[0]!.conditions.length, 1); - assert.ok(JSON.stringify(checked.selection.map(querySelectionToWire)).includes(fields[0]!.selectionId)); - const defaults = await compile( - `query Upcoming($show: Boolean! = true) {root {items(first: 3) {entries {node {...Row @include(if: $show)}}}}}`, - "fragment Row on TaskFacts {title @live}", - ); - assert.equal(queryPresentation(defaults, [collection, facts])[0]!.conditions[0]!.defaultValue, true); + assert.equal(node.selection[1]!.conditions.length, 1); + assert.ok(JSON.stringify(checked.selection.map(querySelectionToWire)).includes("label")); }); - -test("live selections reject RPC getters, synthetic selections and conflicting presentations", async () => { - for (const [selected, code] of [ - ["score @live", "QUERY_LIVE_UNSUPPORTED"], - ["_qx @live {ref}", "QUERY_LIVE_UNSUPPORTED"], - ["title @live title", "QUERY_LIVE_CONFLICT"], - ["title @live(unchecked: true)", "QUERY_VALIDATION"], - ]) +test("retired live syntax fails with migration guidance", async () => { + for (const selected of ["score @live", "_camino @live {ref}", "title @live title", "title @live(unchecked: true)"]) await assert.rejects( compile( `query Upcoming {root {items(first: 3) {entries {node {...Row}}}}}`, `fragment Row on TaskFacts {${selected}}`, 'allow TaskFacts.score select "bounded";', ), - (error: unknown) => error instanceof QueryCompileError && error.code === code, + (error: unknown) => error instanceof QueryCompileError && error.code === "QUERY_RETIRED_DIRECTIVE", ); }); diff --git a/test/query-workspace.test.ts b/test/query-workspace.test.ts index 0c17d5a..f04df42 100644 --- a/test/query-workspace.test.ts +++ b/test/query-workspace.test.ts @@ -39,7 +39,7 @@ test("reference-only workspace queries hash every eligible conformance, includin const checked = await compileQuery( query, workspace.interfaceImports, - async () => `query ${query.operation} {root {objects(first: 10) {entries {node {_qx {ref}}}}}}`, + async () => `query ${query.operation} {root {objects(first: 10) {entries {node {_camino {ref}}}}}}`, ); pkg.checkedQueries = pkg.checkedQueries!.map((q) => (q.declaration.id === query.id ? checked : q)); const linked = linkQueries(workspace).find((q) => q.id.endsWith(":upcoming"))!; diff --git a/test/react-fields.test.ts b/test/react-fields.test.ts index ba39d02..767f733 100644 --- a/test/react-fields.test.ts +++ b/test/react-fields.test.ts @@ -33,7 +33,7 @@ test("React bindings preserve read-only, writable and nested reference contracts await compileQuery( pkg.resource.revision.queries![0]!, [iface.resource.revision], - async () => "query Editor {root {title @live summary @live plain: title}}", + async () => "query Editor {root {title summary plain: title}}", ), ]; const schema = { @@ -79,16 +79,10 @@ test("React bindings preserve read-only, writable and nested reference contracts import {reactInterfaces} from "./react-props.gen.js"; import type {ReactResults, QueryResults} from "./react-props.gen.js"; declare const query: QueryResults["Editor"]; -useLiveField(query.root.title).set("new"); -useLiveField(detachField(query.root.title)).set("new"); -// @ts-expect-error detachment preserves readonly access -useLiveField(detachField(query.root.summary)).set("no"); -// @ts-expect-error query handles do not expose transport metadata -query.root.title.capability; -// @ts-expect-error live query fields retain exact setter types -useLiveField(query.root.title).set(123); -// @ts-expect-error readonly query fields do not acquire a setter -useLiveField(query.root.summary).set("no"); +const queryTitle: string = query.root.title; +const querySummary: string = query.root.summary; +// @ts-expect-error query values are not field mutation handles +query.root.title.set("new"); const plain: string = query.root.plain; async function lookup() { const view = await tryConform("object", reactInterfaces.Fields); From a8869e4545d333bdad3068abcfcfc93fe4d0ae67 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Tue, 22 Sep 2026 15:41:27 -0700 Subject: [PATCH 58/91] Add exported query fragments and scoped coverage observations --- grammar/QuixosCapability.g4 | 10 +- src/capability-language/assembly.ts | 37 +- .../generated/QuixosCapability.interp | 3 +- .../generated/QuixosCapabilityParser.ts | 3610 +++++++++-------- .../generated/QuixosCapabilityVisitor.ts | 7 + src/capability-language/parser.ts | 67 +- src/execution-world/client-contracts.ts | 70 +- src/execution-world/queries.ts | 9 + src/query/compile.ts | 37 +- src/query/fragments.ts | 120 + src/query/types.ts | 17 + test/capability-assembly.test.ts | 47 + test/query-fragments.test.ts | 184 + 13 files changed, 2503 insertions(+), 1715 deletions(-) create mode 100644 src/query/fragments.ts create mode 100644 test/query-fragments.test.ts diff --git a/grammar/QuixosCapability.g4 b/grammar/QuixosCapability.g4 index 9e43ccb..78f9d5b 100644 --- a/grammar/QuixosCapability.g4 +++ b/grammar/QuixosCapability.g4 @@ -163,8 +163,10 @@ presentationDecl ; packageQuery - : QUERY identifier typeParameters? ID stringLiteral ROOT WORKSPACE? interfaceType - DOCUMENT stringLiteral OPERATION stringLiteral LBRACE queryClause* RBRACE + : QUERY FRAGMENT? identifier typeParameters? ID stringLiteral ROOT WORKSPACE? interfaceType + DOCUMENT stringLiteral + (OPERATION stringLiteral LBRACE queryClause* RBRACE + | FRAGMENT stringLiteral (OPERATION stringLiteral)? (LBRACE queryClause* RBRACE | SEMI)) ; packageQuerySpecialization @@ -175,6 +177,7 @@ queryClause : REPLICA SEMI | LOCAL FROM identifier SEMI | FRAGMENTS stringLiteral SEMI + | FRAGMENTS identifier DOT identifier (WITH LBRACE fragmentVariable* RBRACE)? SEMI | VIEW OBJECT? identifier AS interfaceType SEMI | MAX identifier INTEGER SEMI | ALLOW interfaceType DOT identifier identifier stringLiteral SEMI @@ -182,6 +185,8 @@ queryClause | POLL INTEGER stringLiteral SEMI ; +fragmentVariable : identifier TO identifier SEMI; + packageOperationExport : OPERATION identifier typeParameters? ID stringLiteral COLON valueType ARROW valueType MODE operationMode executionClause? eventClause? RECEIVER receiverRequirement dependencyBlock? acceptanceClause? SEMI @@ -482,6 +487,7 @@ identifier | ROOT | DOCUMENT | FRAGMENTS + | FRAGMENT | VIEW | MAX | ALLOW diff --git a/src/capability-language/assembly.ts b/src/capability-language/assembly.ts index 748bcaf..43a4982 100644 --- a/src/capability-language/assembly.ts +++ b/src/capability-language/assembly.ts @@ -276,12 +276,37 @@ const createResourceGraphResolver = (quixosCommit: string, resolveResource: Capa await checkQueryTemplate(template, queryInterfaces, (name) => readRepositorySource(snapshot.directory, name), ); - if (compiled.resource.revision.queries?.length) - compiled.resource.revision.checkedQueries = await Promise.all( - compiled.resource.revision.queries.map((query) => - compileRepositoryQuery(snapshot.directory, query, queryInterfaces), - ), - ); + if (compiled.resource.revision.queries?.length) { + const pkg = compiled.resource.revision; + const checked = new Map(); + const compile = async ( + id: string, + parents: readonly string[] = [], + ): Promise => { + if (parents.includes(id)) throw new Error(`Query fragment cycle: ${[...parents, id].join(" -> ")}`); + const previous = checked.get(id); + if (previous) return previous; + const query = pkg.queries!.find((query) => query.id === id); + if (!query) throw new Error(`Unknown fragment ${pkg.revisionId}/${id}`); + const result = await compileRepositoryQuery( + snapshot.directory, + query, + queryInterfaces, + async (packageId, fragmentId) => { + if (packageId === pkg.revisionId) return compile(fragmentId, [...parents, id]); + const imported = environment.packageClosure + ?.find((other) => other.revisionId === packageId) + ?.checkedQueries?.find((query) => query.declaration.id === fragmentId); + if (!imported) throw new Error(`Unchecked imported fragment ${packageId}/${fragmentId}`); + return imported; + }, + ); + checked.set(id, result); + return result; + }; + pkg.checkedQueries = []; + for (const query of pkg.queries!) pkg.checkedQueries.push(await compile(query.id)); + } let controllerText: string | undefined; try { controllerText = await readRepositorySource(snapshot.directory, "quixos.controllers.json"); diff --git a/src/capability-language/generated/QuixosCapability.interp b/src/capability-language/generated/QuixosCapability.interp index 6cdb3e6..21873eb 100644 --- a/src/capability-language/generated/QuixosCapability.interp +++ b/src/capability-language/generated/QuixosCapability.interp @@ -344,6 +344,7 @@ presentationDecl packageQuery packageQuerySpecialization queryClause +fragmentVariable packageOperationExport packageFunctionExport acceptanceClause @@ -395,4 +396,4 @@ stringLiteral atn: -[4, 1, 153, 1347, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 175, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 180, 8, 1, 10, 1, 12, 1, 183, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 201, 8, 3, 10, 3, 12, 3, 204, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 216, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 228, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 248, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 256, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 261, 8, 10, 10, 10, 12, 10, 264, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 269, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 279, 8, 10, 10, 10, 12, 10, 282, 9, 10, 3, 10, 284, 8, 10, 1, 10, 1, 10, 5, 10, 288, 8, 10, 10, 10, 12, 10, 291, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 299, 8, 11, 10, 11, 12, 11, 302, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 310, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 318, 8, 12, 10, 12, 12, 12, 321, 9, 12, 3, 12, 323, 8, 12, 3, 12, 325, 8, 12, 1, 13, 1, 13, 3, 13, 329, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 335, 8, 14, 10, 14, 12, 14, 338, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 349, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 354, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 364, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 374, 8, 18, 1, 18, 1, 18, 1, 19, 3, 19, 379, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 394, 8, 19, 1, 19, 1, 19, 1, 19, 1, 20, 3, 20, 400, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 410, 8, 20, 10, 20, 12, 20, 413, 9, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 421, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 429, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 437, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 450, 8, 21, 1, 22, 3, 22, 453, 8, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 463, 8, 22, 1, 22, 1, 22, 3, 22, 467, 8, 22, 1, 22, 1, 22, 5, 22, 471, 8, 22, 10, 22, 12, 22, 474, 9, 22, 1, 22, 1, 22, 1, 23, 1, 23, 3, 23, 480, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 486, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 494, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 502, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 515, 8, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 522, 8, 25, 1, 25, 1, 25, 3, 25, 526, 8, 25, 1, 26, 5, 26, 529, 8, 26, 10, 26, 12, 26, 532, 9, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 542, 8, 26, 1, 26, 1, 26, 5, 26, 546, 8, 26, 10, 26, 12, 26, 549, 9, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 559, 8, 27, 1, 28, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 3, 30, 586, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 592, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 5, 30, 601, 8, 30, 10, 30, 12, 30, 604, 9, 30, 1, 30, 1, 30, 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, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 630, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 657, 8, 32, 1, 33, 1, 33, 1, 33, 3, 33, 662, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 673, 8, 33, 1, 33, 3, 33, 676, 8, 33, 1, 33, 1, 33, 1, 33, 3, 33, 681, 8, 33, 1, 33, 3, 33, 684, 8, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 3, 34, 691, 8, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 700, 8, 34, 1, 34, 3, 34, 703, 8, 34, 1, 34, 3, 34, 706, 8, 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, 36, 1, 36, 1, 36, 3, 36, 723, 8, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 5, 37, 730, 8, 37, 10, 37, 12, 37, 733, 9, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 746, 8, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 5, 41, 765, 8, 41, 10, 41, 12, 41, 768, 9, 41, 3, 41, 770, 8, 41, 1, 41, 3, 41, 773, 8, 41, 1, 42, 1, 42, 1, 42, 5, 42, 778, 8, 42, 10, 42, 12, 42, 781, 9, 42, 1, 43, 1, 43, 1, 43, 5, 43, 786, 8, 43, 10, 43, 12, 43, 789, 9, 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, 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, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 828, 8, 44, 1, 44, 3, 44, 831, 8, 44, 1, 44, 1, 44, 3, 44, 835, 8, 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, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 857, 8, 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, 871, 8, 44, 1, 45, 1, 45, 1, 45, 1, 45, 5, 45, 877, 8, 45, 10, 45, 12, 45, 880, 9, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 3, 48, 891, 8, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 905, 8, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 915, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 933, 8, 52, 1, 52, 1, 52, 3, 52, 937, 8, 52, 1, 52, 3, 52, 940, 8, 52, 1, 52, 1, 52, 3, 52, 944, 8, 52, 1, 52, 3, 52, 947, 8, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 956, 8, 53, 1, 53, 1, 53, 3, 53, 960, 8, 53, 1, 53, 1, 53, 3, 53, 964, 8, 53, 1, 53, 1, 53, 5, 53, 968, 8, 53, 10, 53, 12, 53, 971, 9, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 982, 8, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 5, 56, 995, 8, 56, 10, 56, 12, 56, 998, 9, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 1017, 8, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 5, 58, 1024, 8, 58, 10, 58, 12, 58, 1027, 9, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 1058, 8, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1078, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1098, 8, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1108, 8, 64, 1, 64, 3, 64, 1111, 8, 64, 1, 64, 3, 64, 1114, 8, 64, 3, 64, 1116, 8, 64, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 5, 68, 1128, 8, 68, 10, 68, 12, 68, 1131, 9, 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, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1154, 8, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1170, 8, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1179, 8, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1189, 8, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 5, 69, 1200, 8, 69, 10, 69, 12, 69, 1203, 9, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1217, 8, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 1229, 8, 69, 1, 69, 1, 69, 3, 69, 1233, 8, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 3, 70, 1242, 8, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1260, 8, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 5, 71, 1282, 8, 71, 10, 71, 12, 71, 1285, 9, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1290, 8, 71, 3, 71, 1292, 8, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 3, 75, 1311, 8, 75, 1, 76, 1, 76, 1, 76, 1, 76, 5, 76, 1317, 8, 76, 10, 76, 12, 76, 1320, 9, 76, 3, 76, 1322, 8, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 5, 78, 1334, 8, 78, 10, 78, 12, 78, 1337, 9, 78, 3, 78, 1339, 8, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 0, 0, 81, 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, 0, 9, 2, 0, 15, 15, 33, 33, 1, 0, 11, 12, 1, 0, 101, 105, 3, 0, 1, 1, 96, 100, 102, 103, 3, 0, 1, 1, 96, 97, 102, 103, 2, 0, 98, 100, 102, 103, 1, 0, 121, 128, 1, 0, 108, 111, 8, 0, 1, 1, 4, 8, 10, 33, 45, 45, 74, 74, 94, 95, 106, 106, 149, 149, 1455, 0, 174, 1, 0, 0, 0, 2, 176, 1, 0, 0, 0, 4, 186, 1, 0, 0, 0, 6, 190, 1, 0, 0, 0, 8, 215, 1, 0, 0, 0, 10, 227, 1, 0, 0, 0, 12, 229, 1, 0, 0, 0, 14, 236, 1, 0, 0, 0, 16, 247, 1, 0, 0, 0, 18, 249, 1, 0, 0, 0, 20, 262, 1, 0, 0, 0, 22, 294, 1, 0, 0, 0, 24, 324, 1, 0, 0, 0, 26, 326, 1, 0, 0, 0, 28, 330, 1, 0, 0, 0, 30, 348, 1, 0, 0, 0, 32, 350, 1, 0, 0, 0, 34, 363, 1, 0, 0, 0, 36, 365, 1, 0, 0, 0, 38, 378, 1, 0, 0, 0, 40, 399, 1, 0, 0, 0, 42, 449, 1, 0, 0, 0, 44, 452, 1, 0, 0, 0, 46, 477, 1, 0, 0, 0, 48, 514, 1, 0, 0, 0, 50, 525, 1, 0, 0, 0, 52, 530, 1, 0, 0, 0, 54, 558, 1, 0, 0, 0, 56, 560, 1, 0, 0, 0, 58, 570, 1, 0, 0, 0, 60, 582, 1, 0, 0, 0, 62, 607, 1, 0, 0, 0, 64, 656, 1, 0, 0, 0, 66, 658, 1, 0, 0, 0, 68, 687, 1, 0, 0, 0, 70, 709, 1, 0, 0, 0, 72, 722, 1, 0, 0, 0, 74, 724, 1, 0, 0, 0, 76, 736, 1, 0, 0, 0, 78, 749, 1, 0, 0, 0, 80, 752, 1, 0, 0, 0, 82, 772, 1, 0, 0, 0, 84, 774, 1, 0, 0, 0, 86, 782, 1, 0, 0, 0, 88, 870, 1, 0, 0, 0, 90, 872, 1, 0, 0, 0, 92, 883, 1, 0, 0, 0, 94, 885, 1, 0, 0, 0, 96, 890, 1, 0, 0, 0, 98, 892, 1, 0, 0, 0, 100, 914, 1, 0, 0, 0, 102, 916, 1, 0, 0, 0, 104, 925, 1, 0, 0, 0, 106, 950, 1, 0, 0, 0, 108, 981, 1, 0, 0, 0, 110, 983, 1, 0, 0, 0, 112, 991, 1, 0, 0, 0, 114, 1016, 1, 0, 0, 0, 116, 1018, 1, 0, 0, 0, 118, 1030, 1, 0, 0, 0, 120, 1037, 1, 0, 0, 0, 122, 1051, 1, 0, 0, 0, 124, 1061, 1, 0, 0, 0, 126, 1077, 1, 0, 0, 0, 128, 1115, 1, 0, 0, 0, 130, 1117, 1, 0, 0, 0, 132, 1120, 1, 0, 0, 0, 134, 1122, 1, 0, 0, 0, 136, 1124, 1, 0, 0, 0, 138, 1232, 1, 0, 0, 0, 140, 1234, 1, 0, 0, 0, 142, 1291, 1, 0, 0, 0, 144, 1293, 1, 0, 0, 0, 146, 1298, 1, 0, 0, 0, 148, 1300, 1, 0, 0, 0, 150, 1310, 1, 0, 0, 0, 152, 1312, 1, 0, 0, 0, 154, 1325, 1, 0, 0, 0, 156, 1329, 1, 0, 0, 0, 158, 1342, 1, 0, 0, 0, 160, 1344, 1, 0, 0, 0, 162, 163, 3, 6, 3, 0, 163, 164, 5, 0, 0, 1, 164, 175, 1, 0, 0, 0, 165, 166, 3, 20, 10, 0, 166, 167, 5, 0, 0, 1, 167, 175, 1, 0, 0, 0, 168, 169, 3, 52, 26, 0, 169, 170, 5, 0, 0, 1, 170, 175, 1, 0, 0, 0, 171, 172, 3, 2, 1, 0, 172, 173, 5, 0, 0, 1, 173, 175, 1, 0, 0, 0, 174, 162, 1, 0, 0, 0, 174, 165, 1, 0, 0, 0, 174, 168, 1, 0, 0, 0, 174, 171, 1, 0, 0, 0, 175, 1, 1, 0, 0, 0, 176, 177, 5, 40, 0, 0, 177, 181, 5, 137, 0, 0, 178, 180, 3, 8, 4, 0, 179, 178, 1, 0, 0, 0, 180, 183, 1, 0, 0, 0, 181, 179, 1, 0, 0, 0, 181, 182, 1, 0, 0, 0, 182, 184, 1, 0, 0, 0, 183, 181, 1, 0, 0, 0, 184, 185, 5, 138, 0, 0, 185, 3, 1, 0, 0, 0, 186, 187, 5, 41, 0, 0, 187, 188, 3, 160, 80, 0, 188, 189, 5, 134, 0, 0, 189, 5, 1, 0, 0, 0, 190, 191, 5, 9, 0, 0, 191, 192, 3, 158, 79, 0, 192, 193, 5, 84, 0, 0, 193, 194, 3, 160, 80, 0, 194, 195, 5, 77, 0, 0, 195, 196, 3, 160, 80, 0, 196, 197, 5, 76, 0, 0, 197, 198, 3, 160, 80, 0, 198, 202, 5, 137, 0, 0, 199, 201, 3, 8, 4, 0, 200, 199, 1, 0, 0, 0, 201, 204, 1, 0, 0, 0, 202, 200, 1, 0, 0, 0, 202, 203, 1, 0, 0, 0, 203, 205, 1, 0, 0, 0, 204, 202, 1, 0, 0, 0, 205, 206, 5, 138, 0, 0, 206, 7, 1, 0, 0, 0, 207, 216, 3, 4, 2, 0, 208, 216, 3, 18, 9, 0, 209, 216, 3, 10, 5, 0, 210, 216, 3, 94, 47, 0, 211, 216, 3, 106, 53, 0, 212, 216, 3, 140, 70, 0, 213, 216, 3, 58, 29, 0, 214, 216, 3, 32, 16, 0, 215, 207, 1, 0, 0, 0, 215, 208, 1, 0, 0, 0, 215, 209, 1, 0, 0, 0, 215, 210, 1, 0, 0, 0, 215, 211, 1, 0, 0, 0, 215, 212, 1, 0, 0, 0, 215, 213, 1, 0, 0, 0, 215, 214, 1, 0, 0, 0, 216, 9, 1, 0, 0, 0, 217, 218, 5, 41, 0, 0, 218, 219, 5, 44, 0, 0, 219, 220, 3, 158, 79, 0, 220, 221, 5, 134, 0, 0, 221, 228, 1, 0, 0, 0, 222, 223, 5, 41, 0, 0, 223, 224, 5, 46, 0, 0, 224, 225, 3, 158, 79, 0, 225, 226, 5, 134, 0, 0, 226, 228, 1, 0, 0, 0, 227, 217, 1, 0, 0, 0, 227, 222, 1, 0, 0, 0, 228, 11, 1, 0, 0, 0, 229, 230, 5, 42, 0, 0, 230, 231, 5, 43, 0, 0, 231, 232, 3, 158, 79, 0, 232, 233, 5, 84, 0, 0, 233, 234, 3, 160, 80, 0, 234, 235, 5, 134, 0, 0, 235, 13, 1, 0, 0, 0, 236, 237, 5, 42, 0, 0, 237, 238, 5, 44, 0, 0, 238, 239, 3, 158, 79, 0, 239, 240, 5, 77, 0, 0, 240, 241, 3, 160, 80, 0, 241, 242, 5, 134, 0, 0, 242, 15, 1, 0, 0, 0, 243, 248, 3, 10, 5, 0, 244, 248, 3, 12, 6, 0, 245, 248, 3, 14, 7, 0, 246, 248, 3, 32, 16, 0, 247, 243, 1, 0, 0, 0, 247, 244, 1, 0, 0, 0, 247, 245, 1, 0, 0, 0, 247, 246, 1, 0, 0, 0, 248, 17, 1, 0, 0, 0, 249, 250, 5, 43, 0, 0, 250, 251, 3, 158, 79, 0, 251, 252, 5, 84, 0, 0, 252, 255, 3, 160, 80, 0, 253, 254, 5, 85, 0, 0, 254, 256, 3, 160, 80, 0, 255, 253, 1, 0, 0, 0, 255, 256, 1, 0, 0, 0, 256, 257, 1, 0, 0, 0, 257, 258, 5, 134, 0, 0, 258, 19, 1, 0, 0, 0, 259, 261, 3, 16, 8, 0, 260, 259, 1, 0, 0, 0, 261, 264, 1, 0, 0, 0, 262, 260, 1, 0, 0, 0, 262, 263, 1, 0, 0, 0, 263, 265, 1, 0, 0, 0, 264, 262, 1, 0, 0, 0, 265, 266, 5, 44, 0, 0, 266, 268, 3, 158, 79, 0, 267, 269, 3, 22, 11, 0, 268, 267, 1, 0, 0, 0, 268, 269, 1, 0, 0, 0, 269, 270, 1, 0, 0, 0, 270, 271, 5, 84, 0, 0, 271, 272, 3, 160, 80, 0, 272, 273, 5, 77, 0, 0, 273, 283, 3, 160, 80, 0, 274, 275, 5, 89, 0, 0, 275, 280, 3, 26, 13, 0, 276, 277, 5, 135, 0, 0, 277, 279, 3, 26, 13, 0, 278, 276, 1, 0, 0, 0, 279, 282, 1, 0, 0, 0, 280, 278, 1, 0, 0, 0, 280, 281, 1, 0, 0, 0, 281, 284, 1, 0, 0, 0, 282, 280, 1, 0, 0, 0, 283, 274, 1, 0, 0, 0, 283, 284, 1, 0, 0, 0, 284, 285, 1, 0, 0, 0, 285, 289, 5, 137, 0, 0, 286, 288, 3, 34, 17, 0, 287, 286, 1, 0, 0, 0, 288, 291, 1, 0, 0, 0, 289, 287, 1, 0, 0, 0, 289, 290, 1, 0, 0, 0, 290, 292, 1, 0, 0, 0, 291, 289, 1, 0, 0, 0, 292, 293, 5, 138, 0, 0, 293, 21, 1, 0, 0, 0, 294, 295, 5, 143, 0, 0, 295, 300, 3, 24, 12, 0, 296, 297, 5, 135, 0, 0, 297, 299, 3, 24, 12, 0, 298, 296, 1, 0, 0, 0, 299, 302, 1, 0, 0, 0, 300, 298, 1, 0, 0, 0, 300, 301, 1, 0, 0, 0, 301, 303, 1, 0, 0, 0, 302, 300, 1, 0, 0, 0, 303, 304, 5, 144, 0, 0, 304, 23, 1, 0, 0, 0, 305, 306, 5, 47, 0, 0, 306, 309, 3, 158, 79, 0, 307, 308, 5, 133, 0, 0, 308, 310, 5, 37, 0, 0, 309, 307, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 325, 1, 0, 0, 0, 311, 312, 5, 36, 0, 0, 312, 322, 3, 158, 79, 0, 313, 314, 5, 38, 0, 0, 314, 319, 3, 26, 13, 0, 315, 316, 5, 145, 0, 0, 316, 318, 3, 26, 13, 0, 317, 315, 1, 0, 0, 0, 318, 321, 1, 0, 0, 0, 319, 317, 1, 0, 0, 0, 319, 320, 1, 0, 0, 0, 320, 323, 1, 0, 0, 0, 321, 319, 1, 0, 0, 0, 322, 313, 1, 0, 0, 0, 322, 323, 1, 0, 0, 0, 323, 325, 1, 0, 0, 0, 324, 305, 1, 0, 0, 0, 324, 311, 1, 0, 0, 0, 325, 25, 1, 0, 0, 0, 326, 328, 3, 158, 79, 0, 327, 329, 3, 28, 14, 0, 328, 327, 1, 0, 0, 0, 328, 329, 1, 0, 0, 0, 329, 27, 1, 0, 0, 0, 330, 331, 5, 143, 0, 0, 331, 336, 3, 30, 15, 0, 332, 333, 5, 135, 0, 0, 333, 335, 3, 30, 15, 0, 334, 332, 1, 0, 0, 0, 335, 338, 1, 0, 0, 0, 336, 334, 1, 0, 0, 0, 336, 337, 1, 0, 0, 0, 337, 339, 1, 0, 0, 0, 338, 336, 1, 0, 0, 0, 339, 340, 5, 144, 0, 0, 340, 29, 1, 0, 0, 0, 341, 342, 5, 43, 0, 0, 342, 349, 3, 158, 79, 0, 343, 344, 5, 44, 0, 0, 344, 349, 3, 26, 13, 0, 345, 346, 5, 36, 0, 0, 346, 349, 3, 158, 79, 0, 347, 349, 3, 142, 71, 0, 348, 341, 1, 0, 0, 0, 348, 343, 1, 0, 0, 0, 348, 345, 1, 0, 0, 0, 348, 347, 1, 0, 0, 0, 349, 31, 1, 0, 0, 0, 350, 351, 5, 35, 0, 0, 351, 353, 3, 158, 79, 0, 352, 354, 3, 22, 11, 0, 353, 352, 1, 0, 0, 0, 353, 354, 1, 0, 0, 0, 354, 355, 1, 0, 0, 0, 355, 356, 5, 146, 0, 0, 356, 357, 3, 142, 71, 0, 357, 358, 5, 134, 0, 0, 358, 33, 1, 0, 0, 0, 359, 364, 3, 40, 20, 0, 360, 364, 3, 44, 22, 0, 361, 364, 3, 38, 19, 0, 362, 364, 3, 36, 18, 0, 363, 359, 1, 0, 0, 0, 363, 360, 1, 0, 0, 0, 363, 361, 1, 0, 0, 0, 363, 362, 1, 0, 0, 0, 364, 35, 1, 0, 0, 0, 365, 366, 5, 2, 0, 0, 366, 367, 3, 158, 79, 0, 367, 368, 5, 84, 0, 0, 368, 369, 3, 160, 80, 0, 369, 370, 5, 3, 0, 0, 370, 373, 3, 160, 80, 0, 371, 372, 5, 5, 0, 0, 372, 374, 3, 50, 25, 0, 373, 371, 1, 0, 0, 0, 373, 374, 1, 0, 0, 0, 374, 375, 1, 0, 0, 0, 375, 376, 5, 134, 0, 0, 376, 37, 1, 0, 0, 0, 377, 379, 5, 57, 0, 0, 378, 377, 1, 0, 0, 0, 378, 379, 1, 0, 0, 0, 379, 380, 1, 0, 0, 0, 380, 381, 5, 49, 0, 0, 381, 382, 3, 158, 79, 0, 382, 383, 5, 84, 0, 0, 383, 384, 3, 160, 80, 0, 384, 385, 5, 133, 0, 0, 385, 386, 3, 142, 71, 0, 386, 387, 5, 132, 0, 0, 387, 388, 3, 142, 71, 0, 388, 389, 5, 137, 0, 0, 389, 390, 5, 101, 0, 0, 390, 391, 5, 84, 0, 0, 391, 393, 3, 160, 80, 0, 392, 394, 3, 72, 36, 0, 393, 392, 1, 0, 0, 0, 393, 394, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 396, 5, 134, 0, 0, 396, 397, 5, 138, 0, 0, 397, 39, 1, 0, 0, 0, 398, 400, 3, 46, 23, 0, 399, 398, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 402, 5, 47, 0, 0, 402, 403, 3, 158, 79, 0, 403, 404, 5, 84, 0, 0, 404, 405, 3, 160, 80, 0, 405, 406, 5, 133, 0, 0, 406, 407, 3, 142, 71, 0, 407, 411, 5, 137, 0, 0, 408, 410, 3, 42, 21, 0, 409, 408, 1, 0, 0, 0, 410, 413, 1, 0, 0, 0, 411, 409, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 414, 1, 0, 0, 0, 413, 411, 1, 0, 0, 0, 414, 415, 5, 138, 0, 0, 415, 41, 1, 0, 0, 0, 416, 417, 5, 91, 0, 0, 417, 418, 5, 84, 0, 0, 418, 420, 3, 160, 80, 0, 419, 421, 3, 72, 36, 0, 420, 419, 1, 0, 0, 0, 420, 421, 1, 0, 0, 0, 421, 422, 1, 0, 0, 0, 422, 423, 5, 134, 0, 0, 423, 450, 1, 0, 0, 0, 424, 425, 5, 92, 0, 0, 425, 426, 5, 84, 0, 0, 426, 428, 3, 160, 80, 0, 427, 429, 3, 72, 36, 0, 428, 427, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 430, 1, 0, 0, 0, 430, 431, 5, 134, 0, 0, 431, 450, 1, 0, 0, 0, 432, 433, 5, 1, 0, 0, 433, 434, 5, 84, 0, 0, 434, 436, 3, 160, 80, 0, 435, 437, 3, 72, 36, 0, 436, 435, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 438, 1, 0, 0, 0, 438, 439, 5, 134, 0, 0, 439, 450, 1, 0, 0, 0, 440, 441, 5, 93, 0, 0, 441, 442, 5, 94, 0, 0, 442, 443, 5, 84, 0, 0, 443, 444, 3, 160, 80, 0, 444, 445, 5, 95, 0, 0, 445, 446, 5, 84, 0, 0, 446, 447, 3, 160, 80, 0, 447, 448, 5, 134, 0, 0, 448, 450, 1, 0, 0, 0, 449, 416, 1, 0, 0, 0, 449, 424, 1, 0, 0, 0, 449, 432, 1, 0, 0, 0, 449, 440, 1, 0, 0, 0, 450, 43, 1, 0, 0, 0, 451, 453, 3, 46, 23, 0, 452, 451, 1, 0, 0, 0, 452, 453, 1, 0, 0, 0, 453, 454, 1, 0, 0, 0, 454, 455, 5, 48, 0, 0, 455, 456, 3, 158, 79, 0, 456, 457, 5, 84, 0, 0, 457, 458, 3, 160, 80, 0, 458, 459, 5, 133, 0, 0, 459, 460, 3, 148, 74, 0, 460, 462, 3, 50, 25, 0, 461, 463, 5, 112, 0, 0, 462, 461, 1, 0, 0, 0, 462, 463, 1, 0, 0, 0, 463, 466, 1, 0, 0, 0, 464, 465, 5, 82, 0, 0, 465, 467, 3, 160, 80, 0, 466, 464, 1, 0, 0, 0, 466, 467, 1, 0, 0, 0, 467, 468, 1, 0, 0, 0, 468, 472, 5, 137, 0, 0, 469, 471, 3, 48, 24, 0, 470, 469, 1, 0, 0, 0, 471, 474, 1, 0, 0, 0, 472, 470, 1, 0, 0, 0, 472, 473, 1, 0, 0, 0, 473, 475, 1, 0, 0, 0, 474, 472, 1, 0, 0, 0, 475, 476, 5, 138, 0, 0, 476, 45, 1, 0, 0, 0, 477, 479, 5, 32, 0, 0, 478, 480, 7, 0, 0, 0, 479, 478, 1, 0, 0, 0, 479, 480, 1, 0, 0, 0, 480, 47, 1, 0, 0, 0, 481, 482, 5, 98, 0, 0, 482, 483, 5, 84, 0, 0, 483, 485, 3, 160, 80, 0, 484, 486, 3, 72, 36, 0, 485, 484, 1, 0, 0, 0, 485, 486, 1, 0, 0, 0, 486, 487, 1, 0, 0, 0, 487, 488, 5, 134, 0, 0, 488, 515, 1, 0, 0, 0, 489, 490, 5, 99, 0, 0, 490, 491, 5, 84, 0, 0, 491, 493, 3, 160, 80, 0, 492, 494, 3, 72, 36, 0, 493, 492, 1, 0, 0, 0, 493, 494, 1, 0, 0, 0, 494, 495, 1, 0, 0, 0, 495, 496, 5, 134, 0, 0, 496, 515, 1, 0, 0, 0, 497, 498, 5, 100, 0, 0, 498, 499, 5, 84, 0, 0, 499, 501, 3, 160, 80, 0, 500, 502, 3, 72, 36, 0, 501, 500, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 504, 5, 134, 0, 0, 504, 515, 1, 0, 0, 0, 505, 506, 5, 93, 0, 0, 506, 507, 5, 94, 0, 0, 507, 508, 5, 84, 0, 0, 508, 509, 3, 160, 80, 0, 509, 510, 5, 95, 0, 0, 510, 511, 5, 84, 0, 0, 511, 512, 3, 160, 80, 0, 512, 513, 5, 134, 0, 0, 513, 515, 1, 0, 0, 0, 514, 481, 1, 0, 0, 0, 514, 489, 1, 0, 0, 0, 514, 497, 1, 0, 0, 0, 514, 505, 1, 0, 0, 0, 515, 49, 1, 0, 0, 0, 516, 517, 5, 43, 0, 0, 517, 526, 3, 158, 79, 0, 518, 519, 5, 44, 0, 0, 519, 521, 3, 158, 79, 0, 520, 522, 3, 28, 14, 0, 521, 520, 1, 0, 0, 0, 521, 522, 1, 0, 0, 0, 522, 526, 1, 0, 0, 0, 523, 524, 5, 36, 0, 0, 524, 526, 3, 158, 79, 0, 525, 516, 1, 0, 0, 0, 525, 518, 1, 0, 0, 0, 525, 523, 1, 0, 0, 0, 526, 51, 1, 0, 0, 0, 527, 529, 3, 16, 8, 0, 528, 527, 1, 0, 0, 0, 529, 532, 1, 0, 0, 0, 530, 528, 1, 0, 0, 0, 530, 531, 1, 0, 0, 0, 531, 533, 1, 0, 0, 0, 532, 530, 1, 0, 0, 0, 533, 534, 5, 46, 0, 0, 534, 535, 3, 158, 79, 0, 535, 536, 5, 84, 0, 0, 536, 537, 3, 160, 80, 0, 537, 538, 5, 77, 0, 0, 538, 541, 3, 160, 80, 0, 539, 540, 5, 78, 0, 0, 540, 542, 5, 147, 0, 0, 541, 539, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 543, 1, 0, 0, 0, 543, 547, 5, 137, 0, 0, 544, 546, 3, 54, 27, 0, 545, 544, 1, 0, 0, 0, 546, 549, 1, 0, 0, 0, 547, 545, 1, 0, 0, 0, 547, 548, 1, 0, 0, 0, 548, 550, 1, 0, 0, 0, 549, 547, 1, 0, 0, 0, 550, 551, 5, 138, 0, 0, 551, 53, 1, 0, 0, 0, 552, 559, 3, 66, 33, 0, 553, 559, 3, 68, 34, 0, 554, 559, 3, 76, 38, 0, 555, 559, 3, 60, 30, 0, 556, 559, 3, 62, 31, 0, 557, 559, 3, 56, 28, 0, 558, 552, 1, 0, 0, 0, 558, 553, 1, 0, 0, 0, 558, 554, 1, 0, 0, 0, 558, 555, 1, 0, 0, 0, 558, 556, 1, 0, 0, 0, 558, 557, 1, 0, 0, 0, 559, 55, 1, 0, 0, 0, 560, 561, 5, 2, 0, 0, 561, 562, 3, 158, 79, 0, 562, 563, 5, 84, 0, 0, 563, 564, 3, 160, 80, 0, 564, 565, 5, 38, 0, 0, 565, 566, 3, 26, 13, 0, 566, 567, 5, 136, 0, 0, 567, 568, 3, 158, 79, 0, 568, 569, 5, 134, 0, 0, 569, 57, 1, 0, 0, 0, 570, 571, 5, 4, 0, 0, 571, 572, 3, 158, 79, 0, 572, 573, 5, 84, 0, 0, 573, 574, 3, 160, 80, 0, 574, 575, 5, 6, 0, 0, 575, 576, 3, 26, 13, 0, 576, 577, 5, 65, 0, 0, 577, 578, 3, 158, 79, 0, 578, 579, 5, 136, 0, 0, 579, 580, 3, 158, 79, 0, 580, 581, 5, 134, 0, 0, 581, 59, 1, 0, 0, 0, 582, 583, 5, 22, 0, 0, 583, 585, 3, 158, 79, 0, 584, 586, 3, 22, 11, 0, 585, 584, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 587, 1, 0, 0, 0, 587, 588, 5, 84, 0, 0, 588, 589, 3, 160, 80, 0, 589, 591, 5, 25, 0, 0, 590, 592, 5, 9, 0, 0, 591, 590, 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 594, 3, 26, 13, 0, 594, 595, 5, 26, 0, 0, 595, 596, 3, 160, 80, 0, 596, 597, 5, 49, 0, 0, 597, 598, 3, 160, 80, 0, 598, 602, 5, 137, 0, 0, 599, 601, 3, 64, 32, 0, 600, 599, 1, 0, 0, 0, 601, 604, 1, 0, 0, 0, 602, 600, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 605, 1, 0, 0, 0, 604, 602, 1, 0, 0, 0, 605, 606, 5, 138, 0, 0, 606, 61, 1, 0, 0, 0, 607, 608, 5, 22, 0, 0, 608, 609, 3, 158, 79, 0, 609, 610, 5, 84, 0, 0, 610, 611, 3, 160, 80, 0, 611, 612, 5, 24, 0, 0, 612, 613, 3, 158, 79, 0, 613, 614, 3, 28, 14, 0, 614, 615, 5, 134, 0, 0, 615, 63, 1, 0, 0, 0, 616, 617, 5, 16, 0, 0, 617, 657, 5, 134, 0, 0, 618, 619, 5, 17, 0, 0, 619, 620, 5, 18, 0, 0, 620, 621, 3, 158, 79, 0, 621, 622, 5, 134, 0, 0, 622, 657, 1, 0, 0, 0, 623, 624, 5, 27, 0, 0, 624, 625, 3, 160, 80, 0, 625, 626, 5, 134, 0, 0, 626, 657, 1, 0, 0, 0, 627, 629, 5, 28, 0, 0, 628, 630, 5, 36, 0, 0, 629, 628, 1, 0, 0, 0, 629, 630, 1, 0, 0, 0, 630, 631, 1, 0, 0, 0, 631, 632, 3, 158, 79, 0, 632, 633, 5, 55, 0, 0, 633, 634, 3, 26, 13, 0, 634, 635, 5, 134, 0, 0, 635, 657, 1, 0, 0, 0, 636, 637, 5, 29, 0, 0, 637, 638, 3, 158, 79, 0, 638, 639, 5, 147, 0, 0, 639, 640, 5, 134, 0, 0, 640, 657, 1, 0, 0, 0, 641, 642, 5, 30, 0, 0, 642, 643, 3, 26, 13, 0, 643, 644, 5, 136, 0, 0, 644, 645, 3, 158, 79, 0, 645, 646, 3, 158, 79, 0, 646, 647, 3, 160, 80, 0, 647, 648, 5, 134, 0, 0, 648, 657, 1, 0, 0, 0, 649, 650, 5, 93, 0, 0, 650, 657, 5, 134, 0, 0, 651, 652, 5, 31, 0, 0, 652, 653, 5, 147, 0, 0, 653, 654, 3, 160, 80, 0, 654, 655, 5, 134, 0, 0, 655, 657, 1, 0, 0, 0, 656, 616, 1, 0, 0, 0, 656, 618, 1, 0, 0, 0, 656, 623, 1, 0, 0, 0, 656, 627, 1, 0, 0, 0, 656, 636, 1, 0, 0, 0, 656, 641, 1, 0, 0, 0, 656, 649, 1, 0, 0, 0, 656, 651, 1, 0, 0, 0, 657, 65, 1, 0, 0, 0, 658, 659, 5, 49, 0, 0, 659, 661, 3, 158, 79, 0, 660, 662, 3, 22, 11, 0, 661, 660, 1, 0, 0, 0, 661, 662, 1, 0, 0, 0, 662, 663, 1, 0, 0, 0, 663, 664, 5, 84, 0, 0, 664, 665, 3, 160, 80, 0, 665, 666, 5, 133, 0, 0, 666, 667, 3, 142, 71, 0, 667, 668, 5, 132, 0, 0, 668, 669, 3, 142, 71, 0, 669, 670, 5, 86, 0, 0, 670, 672, 3, 80, 40, 0, 671, 673, 3, 72, 36, 0, 672, 671, 1, 0, 0, 0, 672, 673, 1, 0, 0, 0, 673, 675, 1, 0, 0, 0, 674, 676, 3, 78, 39, 0, 675, 674, 1, 0, 0, 0, 675, 676, 1, 0, 0, 0, 676, 677, 1, 0, 0, 0, 677, 678, 5, 88, 0, 0, 678, 680, 3, 82, 41, 0, 679, 681, 3, 86, 43, 0, 680, 679, 1, 0, 0, 0, 680, 681, 1, 0, 0, 0, 681, 683, 1, 0, 0, 0, 682, 684, 3, 70, 35, 0, 683, 682, 1, 0, 0, 0, 683, 684, 1, 0, 0, 0, 684, 685, 1, 0, 0, 0, 685, 686, 5, 134, 0, 0, 686, 67, 1, 0, 0, 0, 687, 688, 5, 50, 0, 0, 688, 690, 3, 158, 79, 0, 689, 691, 3, 22, 11, 0, 690, 689, 1, 0, 0, 0, 690, 691, 1, 0, 0, 0, 691, 692, 1, 0, 0, 0, 692, 693, 5, 84, 0, 0, 693, 694, 3, 160, 80, 0, 694, 695, 5, 133, 0, 0, 695, 696, 3, 142, 71, 0, 696, 697, 5, 132, 0, 0, 697, 699, 3, 142, 71, 0, 698, 700, 3, 72, 36, 0, 699, 698, 1, 0, 0, 0, 699, 700, 1, 0, 0, 0, 700, 702, 1, 0, 0, 0, 701, 703, 3, 86, 43, 0, 702, 701, 1, 0, 0, 0, 702, 703, 1, 0, 0, 0, 703, 705, 1, 0, 0, 0, 704, 706, 3, 70, 35, 0, 705, 704, 1, 0, 0, 0, 705, 706, 1, 0, 0, 0, 706, 707, 1, 0, 0, 0, 707, 708, 5, 134, 0, 0, 708, 69, 1, 0, 0, 0, 709, 710, 5, 66, 0, 0, 710, 711, 5, 65, 0, 0, 711, 712, 3, 158, 79, 0, 712, 71, 1, 0, 0, 0, 713, 714, 5, 10, 0, 0, 714, 723, 5, 13, 0, 0, 715, 716, 5, 10, 0, 0, 716, 717, 7, 1, 0, 0, 717, 718, 5, 14, 0, 0, 718, 719, 5, 139, 0, 0, 719, 720, 3, 84, 42, 0, 720, 721, 5, 140, 0, 0, 721, 723, 1, 0, 0, 0, 722, 713, 1, 0, 0, 0, 722, 715, 1, 0, 0, 0, 723, 73, 1, 0, 0, 0, 724, 725, 5, 65, 0, 0, 725, 726, 5, 139, 0, 0, 726, 731, 3, 124, 62, 0, 727, 728, 5, 135, 0, 0, 728, 730, 3, 124, 62, 0, 729, 727, 1, 0, 0, 0, 730, 733, 1, 0, 0, 0, 731, 729, 1, 0, 0, 0, 731, 732, 1, 0, 0, 0, 732, 734, 1, 0, 0, 0, 733, 731, 1, 0, 0, 0, 734, 735, 5, 140, 0, 0, 735, 75, 1, 0, 0, 0, 736, 737, 5, 51, 0, 0, 737, 738, 3, 158, 79, 0, 738, 739, 5, 84, 0, 0, 739, 740, 3, 160, 80, 0, 740, 741, 5, 52, 0, 0, 741, 742, 3, 158, 79, 0, 742, 743, 5, 133, 0, 0, 743, 745, 3, 142, 71, 0, 744, 746, 3, 86, 43, 0, 745, 744, 1, 0, 0, 0, 745, 746, 1, 0, 0, 0, 746, 747, 1, 0, 0, 0, 747, 748, 5, 134, 0, 0, 748, 77, 1, 0, 0, 0, 749, 750, 5, 87, 0, 0, 750, 751, 3, 142, 71, 0, 751, 79, 1, 0, 0, 0, 752, 753, 7, 2, 0, 0, 753, 81, 1, 0, 0, 0, 754, 773, 5, 90, 0, 0, 755, 756, 5, 43, 0, 0, 756, 773, 3, 158, 79, 0, 757, 758, 5, 36, 0, 0, 758, 773, 3, 158, 79, 0, 759, 760, 5, 45, 0, 0, 760, 769, 5, 139, 0, 0, 761, 766, 3, 26, 13, 0, 762, 763, 5, 135, 0, 0, 763, 765, 3, 26, 13, 0, 764, 762, 1, 0, 0, 0, 765, 768, 1, 0, 0, 0, 766, 764, 1, 0, 0, 0, 766, 767, 1, 0, 0, 0, 767, 770, 1, 0, 0, 0, 768, 766, 1, 0, 0, 0, 769, 761, 1, 0, 0, 0, 769, 770, 1, 0, 0, 0, 770, 771, 1, 0, 0, 0, 771, 773, 5, 140, 0, 0, 772, 754, 1, 0, 0, 0, 772, 755, 1, 0, 0, 0, 772, 757, 1, 0, 0, 0, 772, 759, 1, 0, 0, 0, 773, 83, 1, 0, 0, 0, 774, 779, 3, 158, 79, 0, 775, 776, 5, 135, 0, 0, 776, 778, 3, 158, 79, 0, 777, 775, 1, 0, 0, 0, 778, 781, 1, 0, 0, 0, 779, 777, 1, 0, 0, 0, 779, 780, 1, 0, 0, 0, 780, 85, 1, 0, 0, 0, 781, 779, 1, 0, 0, 0, 782, 783, 5, 89, 0, 0, 783, 787, 5, 137, 0, 0, 784, 786, 3, 88, 44, 0, 785, 784, 1, 0, 0, 0, 786, 789, 1, 0, 0, 0, 787, 785, 1, 0, 0, 0, 787, 788, 1, 0, 0, 0, 788, 790, 1, 0, 0, 0, 789, 787, 1, 0, 0, 0, 790, 791, 5, 138, 0, 0, 791, 87, 1, 0, 0, 0, 792, 793, 5, 23, 0, 0, 793, 794, 3, 158, 79, 0, 794, 795, 5, 84, 0, 0, 795, 796, 3, 160, 80, 0, 796, 797, 5, 139, 0, 0, 797, 798, 3, 84, 42, 0, 798, 799, 5, 140, 0, 0, 799, 800, 5, 134, 0, 0, 800, 871, 1, 0, 0, 0, 801, 802, 5, 61, 0, 0, 802, 803, 3, 158, 79, 0, 803, 804, 5, 84, 0, 0, 804, 805, 3, 160, 80, 0, 805, 806, 5, 133, 0, 0, 806, 807, 3, 142, 71, 0, 807, 808, 3, 90, 45, 0, 808, 809, 5, 134, 0, 0, 809, 871, 1, 0, 0, 0, 810, 811, 5, 62, 0, 0, 811, 812, 3, 158, 79, 0, 812, 813, 5, 84, 0, 0, 813, 814, 3, 160, 80, 0, 814, 815, 5, 133, 0, 0, 815, 816, 3, 148, 74, 0, 816, 817, 3, 50, 25, 0, 817, 818, 3, 90, 45, 0, 818, 819, 5, 134, 0, 0, 819, 871, 1, 0, 0, 0, 820, 821, 5, 44, 0, 0, 821, 822, 3, 158, 79, 0, 822, 823, 5, 84, 0, 0, 823, 824, 3, 160, 80, 0, 824, 825, 5, 133, 0, 0, 825, 827, 3, 158, 79, 0, 826, 828, 3, 28, 14, 0, 827, 826, 1, 0, 0, 0, 827, 828, 1, 0, 0, 0, 828, 830, 1, 0, 0, 0, 829, 831, 3, 74, 37, 0, 830, 829, 1, 0, 0, 0, 830, 831, 1, 0, 0, 0, 831, 834, 1, 0, 0, 0, 832, 833, 5, 18, 0, 0, 833, 835, 5, 53, 0, 0, 834, 832, 1, 0, 0, 0, 834, 835, 1, 0, 0, 0, 835, 836, 1, 0, 0, 0, 836, 837, 5, 134, 0, 0, 837, 871, 1, 0, 0, 0, 838, 839, 5, 7, 0, 0, 839, 840, 3, 158, 79, 0, 840, 841, 5, 84, 0, 0, 841, 842, 3, 160, 80, 0, 842, 843, 5, 133, 0, 0, 843, 844, 3, 158, 79, 0, 844, 845, 5, 53, 0, 0, 845, 846, 3, 142, 71, 0, 846, 847, 5, 134, 0, 0, 847, 871, 1, 0, 0, 0, 848, 849, 5, 51, 0, 0, 849, 850, 3, 158, 79, 0, 850, 851, 5, 84, 0, 0, 851, 852, 3, 160, 80, 0, 852, 853, 5, 133, 0, 0, 853, 856, 3, 158, 79, 0, 854, 855, 5, 53, 0, 0, 855, 857, 3, 142, 71, 0, 856, 854, 1, 0, 0, 0, 856, 857, 1, 0, 0, 0, 857, 858, 1, 0, 0, 0, 858, 859, 5, 134, 0, 0, 859, 871, 1, 0, 0, 0, 860, 861, 5, 22, 0, 0, 861, 862, 3, 158, 79, 0, 862, 863, 5, 84, 0, 0, 863, 864, 3, 160, 80, 0, 864, 865, 5, 133, 0, 0, 865, 866, 3, 158, 79, 0, 866, 867, 5, 136, 0, 0, 867, 868, 3, 158, 79, 0, 868, 869, 5, 134, 0, 0, 869, 871, 1, 0, 0, 0, 870, 792, 1, 0, 0, 0, 870, 801, 1, 0, 0, 0, 870, 810, 1, 0, 0, 0, 870, 820, 1, 0, 0, 0, 870, 838, 1, 0, 0, 0, 870, 848, 1, 0, 0, 0, 870, 860, 1, 0, 0, 0, 871, 89, 1, 0, 0, 0, 872, 873, 5, 139, 0, 0, 873, 878, 3, 92, 46, 0, 874, 875, 5, 135, 0, 0, 875, 877, 3, 92, 46, 0, 876, 874, 1, 0, 0, 0, 877, 880, 1, 0, 0, 0, 878, 876, 1, 0, 0, 0, 878, 879, 1, 0, 0, 0, 879, 881, 1, 0, 0, 0, 880, 878, 1, 0, 0, 0, 881, 882, 5, 140, 0, 0, 882, 91, 1, 0, 0, 0, 883, 884, 7, 3, 0, 0, 884, 93, 1, 0, 0, 0, 885, 886, 5, 60, 0, 0, 886, 887, 3, 96, 48, 0, 887, 95, 1, 0, 0, 0, 888, 891, 3, 98, 49, 0, 889, 891, 3, 102, 51, 0, 890, 888, 1, 0, 0, 0, 890, 889, 1, 0, 0, 0, 891, 97, 1, 0, 0, 0, 892, 893, 5, 61, 0, 0, 893, 894, 3, 158, 79, 0, 894, 895, 5, 84, 0, 0, 895, 896, 3, 160, 80, 0, 896, 897, 5, 71, 0, 0, 897, 898, 3, 158, 79, 0, 898, 899, 5, 133, 0, 0, 899, 900, 3, 142, 71, 0, 900, 901, 5, 72, 0, 0, 901, 904, 3, 100, 50, 0, 902, 903, 5, 73, 0, 0, 903, 905, 3, 150, 75, 0, 904, 902, 1, 0, 0, 0, 904, 905, 1, 0, 0, 0, 905, 906, 1, 0, 0, 0, 906, 907, 5, 134, 0, 0, 907, 99, 1, 0, 0, 0, 908, 915, 5, 106, 0, 0, 909, 910, 5, 107, 0, 0, 910, 911, 5, 141, 0, 0, 911, 912, 3, 142, 71, 0, 912, 913, 5, 142, 0, 0, 913, 915, 1, 0, 0, 0, 914, 908, 1, 0, 0, 0, 914, 909, 1, 0, 0, 0, 915, 101, 1, 0, 0, 0, 916, 917, 5, 62, 0, 0, 917, 918, 3, 158, 79, 0, 918, 919, 5, 84, 0, 0, 919, 920, 3, 160, 80, 0, 920, 921, 5, 137, 0, 0, 921, 922, 3, 104, 52, 0, 922, 923, 3, 104, 52, 0, 923, 924, 5, 138, 0, 0, 924, 103, 1, 0, 0, 0, 925, 926, 3, 50, 25, 0, 926, 927, 5, 63, 0, 0, 927, 928, 3, 158, 79, 0, 928, 929, 5, 84, 0, 0, 929, 930, 3, 160, 80, 0, 930, 932, 3, 148, 74, 0, 931, 933, 5, 112, 0, 0, 932, 931, 1, 0, 0, 0, 932, 933, 1, 0, 0, 0, 933, 936, 1, 0, 0, 0, 934, 935, 5, 79, 0, 0, 935, 937, 3, 160, 80, 0, 936, 934, 1, 0, 0, 0, 936, 937, 1, 0, 0, 0, 937, 939, 1, 0, 0, 0, 938, 940, 5, 81, 0, 0, 939, 938, 1, 0, 0, 0, 939, 940, 1, 0, 0, 0, 940, 943, 1, 0, 0, 0, 941, 942, 5, 82, 0, 0, 942, 944, 3, 160, 80, 0, 943, 941, 1, 0, 0, 0, 943, 944, 1, 0, 0, 0, 944, 946, 1, 0, 0, 0, 945, 947, 5, 83, 0, 0, 946, 945, 1, 0, 0, 0, 946, 947, 1, 0, 0, 0, 947, 948, 1, 0, 0, 0, 948, 949, 5, 134, 0, 0, 949, 105, 1, 0, 0, 0, 950, 951, 5, 54, 0, 0, 951, 952, 3, 158, 79, 0, 952, 953, 5, 55, 0, 0, 953, 955, 3, 158, 79, 0, 954, 956, 3, 28, 14, 0, 955, 954, 1, 0, 0, 0, 955, 956, 1, 0, 0, 0, 956, 959, 1, 0, 0, 0, 957, 958, 5, 84, 0, 0, 958, 960, 3, 160, 80, 0, 959, 957, 1, 0, 0, 0, 959, 960, 1, 0, 0, 0, 960, 963, 1, 0, 0, 0, 961, 962, 5, 78, 0, 0, 962, 964, 5, 147, 0, 0, 963, 961, 1, 0, 0, 0, 963, 964, 1, 0, 0, 0, 964, 965, 1, 0, 0, 0, 965, 969, 5, 137, 0, 0, 966, 968, 3, 108, 54, 0, 967, 966, 1, 0, 0, 0, 968, 971, 1, 0, 0, 0, 969, 967, 1, 0, 0, 0, 969, 970, 1, 0, 0, 0, 970, 972, 1, 0, 0, 0, 971, 969, 1, 0, 0, 0, 972, 973, 5, 138, 0, 0, 973, 107, 1, 0, 0, 0, 974, 975, 5, 59, 0, 0, 975, 982, 3, 96, 48, 0, 976, 982, 3, 122, 61, 0, 977, 982, 3, 118, 59, 0, 978, 982, 3, 112, 56, 0, 979, 982, 3, 120, 60, 0, 980, 982, 3, 110, 55, 0, 981, 974, 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, 109, 1, 0, 0, 0, 983, 984, 5, 56, 0, 0, 984, 985, 3, 158, 79, 0, 985, 986, 5, 58, 0, 0, 986, 987, 3, 158, 79, 0, 987, 988, 5, 136, 0, 0, 988, 989, 3, 158, 79, 0, 989, 990, 5, 134, 0, 0, 990, 111, 1, 0, 0, 0, 991, 992, 5, 8, 0, 0, 992, 996, 5, 137, 0, 0, 993, 995, 3, 114, 57, 0, 994, 993, 1, 0, 0, 0, 995, 998, 1, 0, 0, 0, 996, 994, 1, 0, 0, 0, 996, 997, 1, 0, 0, 0, 997, 999, 1, 0, 0, 0, 998, 996, 1, 0, 0, 0, 999, 1000, 5, 138, 0, 0, 1000, 1001, 5, 134, 0, 0, 1001, 113, 1, 0, 0, 0, 1002, 1003, 3, 158, 79, 0, 1003, 1004, 5, 58, 0, 0, 1004, 1005, 5, 61, 0, 0, 1005, 1006, 3, 158, 79, 0, 1006, 1007, 5, 134, 0, 0, 1007, 1017, 1, 0, 0, 0, 1008, 1009, 3, 158, 79, 0, 1009, 1010, 5, 58, 0, 0, 1010, 1011, 5, 62, 0, 0, 1011, 1012, 3, 158, 79, 0, 1012, 1013, 5, 136, 0, 0, 1013, 1014, 3, 158, 79, 0, 1014, 1015, 5, 134, 0, 0, 1015, 1017, 1, 0, 0, 0, 1016, 1002, 1, 0, 0, 0, 1016, 1008, 1, 0, 0, 0, 1017, 115, 1, 0, 0, 0, 1018, 1019, 3, 26, 13, 0, 1019, 1020, 5, 18, 0, 0, 1020, 1025, 5, 53, 0, 0, 1021, 1022, 5, 136, 0, 0, 1022, 1024, 3, 158, 79, 0, 1023, 1021, 1, 0, 0, 0, 1024, 1027, 1, 0, 0, 0, 1025, 1023, 1, 0, 0, 0, 1025, 1026, 1, 0, 0, 0, 1026, 1028, 1, 0, 0, 0, 1027, 1025, 1, 0, 0, 0, 1028, 1029, 5, 134, 0, 0, 1029, 117, 1, 0, 0, 0, 1030, 1031, 5, 56, 0, 0, 1031, 1032, 3, 158, 79, 0, 1032, 1033, 5, 58, 0, 0, 1033, 1034, 5, 61, 0, 0, 1034, 1035, 3, 158, 79, 0, 1035, 1036, 5, 134, 0, 0, 1036, 119, 1, 0, 0, 0, 1037, 1038, 5, 68, 0, 0, 1038, 1039, 3, 158, 79, 0, 1039, 1040, 5, 69, 0, 0, 1040, 1041, 5, 70, 0, 0, 1041, 1042, 5, 65, 0, 0, 1042, 1043, 5, 51, 0, 0, 1043, 1044, 3, 158, 79, 0, 1044, 1045, 5, 67, 0, 0, 1045, 1046, 5, 62, 0, 0, 1046, 1047, 3, 158, 79, 0, 1047, 1048, 5, 136, 0, 0, 1048, 1049, 3, 158, 79, 0, 1049, 1050, 5, 134, 0, 0, 1050, 121, 1, 0, 0, 0, 1051, 1052, 5, 56, 0, 0, 1052, 1053, 3, 124, 62, 0, 1053, 1054, 5, 58, 0, 0, 1054, 1057, 3, 128, 64, 0, 1055, 1056, 5, 34, 0, 0, 1056, 1058, 3, 160, 80, 0, 1057, 1055, 1, 0, 0, 0, 1057, 1058, 1, 0, 0, 0, 1058, 1059, 1, 0, 0, 0, 1059, 1060, 5, 134, 0, 0, 1060, 123, 1, 0, 0, 0, 1061, 1062, 3, 158, 79, 0, 1062, 1063, 5, 136, 0, 0, 1063, 1064, 3, 126, 63, 0, 1064, 125, 1, 0, 0, 0, 1065, 1078, 3, 158, 79, 0, 1066, 1078, 5, 101, 0, 0, 1067, 1078, 5, 91, 0, 0, 1068, 1078, 5, 92, 0, 0, 1069, 1078, 5, 1, 0, 0, 1070, 1078, 5, 98, 0, 0, 1071, 1078, 5, 99, 0, 0, 1072, 1078, 5, 100, 0, 0, 1073, 1078, 5, 102, 0, 0, 1074, 1078, 5, 103, 0, 0, 1075, 1078, 5, 104, 0, 0, 1076, 1078, 5, 105, 0, 0, 1077, 1065, 1, 0, 0, 0, 1077, 1066, 1, 0, 0, 0, 1077, 1067, 1, 0, 0, 0, 1077, 1068, 1, 0, 0, 0, 1077, 1069, 1, 0, 0, 0, 1077, 1070, 1, 0, 0, 0, 1077, 1071, 1, 0, 0, 0, 1077, 1072, 1, 0, 0, 0, 1077, 1073, 1, 0, 0, 0, 1077, 1074, 1, 0, 0, 0, 1077, 1075, 1, 0, 0, 0, 1077, 1076, 1, 0, 0, 0, 1078, 127, 1, 0, 0, 0, 1079, 1080, 5, 80, 0, 0, 1080, 1081, 5, 136, 0, 0, 1081, 1116, 3, 158, 79, 0, 1082, 1083, 5, 61, 0, 0, 1083, 1084, 3, 158, 79, 0, 1084, 1085, 5, 136, 0, 0, 1085, 1086, 3, 132, 66, 0, 1086, 1116, 1, 0, 0, 0, 1087, 1088, 5, 62, 0, 0, 1088, 1089, 3, 158, 79, 0, 1089, 1090, 5, 136, 0, 0, 1090, 1091, 3, 158, 79, 0, 1091, 1092, 5, 136, 0, 0, 1092, 1093, 3, 134, 67, 0, 1093, 1116, 1, 0, 0, 0, 1094, 1095, 5, 44, 0, 0, 1095, 1097, 3, 158, 79, 0, 1096, 1098, 3, 28, 14, 0, 1097, 1096, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1099, 1, 0, 0, 0, 1099, 1100, 5, 136, 0, 0, 1100, 1101, 3, 124, 62, 0, 1101, 1116, 1, 0, 0, 0, 1102, 1103, 5, 46, 0, 0, 1103, 1104, 3, 158, 79, 0, 1104, 1105, 5, 136, 0, 0, 1105, 1107, 3, 158, 79, 0, 1106, 1108, 3, 28, 14, 0, 1107, 1106, 1, 0, 0, 0, 1107, 1108, 1, 0, 0, 0, 1108, 1110, 1, 0, 0, 0, 1109, 1111, 3, 136, 68, 0, 1110, 1109, 1, 0, 0, 0, 1110, 1111, 1, 0, 0, 0, 1111, 1113, 1, 0, 0, 0, 1112, 1114, 3, 130, 65, 0, 1113, 1112, 1, 0, 0, 0, 1113, 1114, 1, 0, 0, 0, 1114, 1116, 1, 0, 0, 0, 1115, 1079, 1, 0, 0, 0, 1115, 1082, 1, 0, 0, 0, 1115, 1087, 1, 0, 0, 0, 1115, 1094, 1, 0, 0, 0, 1115, 1102, 1, 0, 0, 0, 1116, 129, 1, 0, 0, 0, 1117, 1118, 5, 66, 0, 0, 1118, 1119, 3, 136, 68, 0, 1119, 131, 1, 0, 0, 0, 1120, 1121, 7, 4, 0, 0, 1121, 133, 1, 0, 0, 0, 1122, 1123, 7, 5, 0, 0, 1123, 135, 1, 0, 0, 0, 1124, 1125, 5, 64, 0, 0, 1125, 1129, 5, 137, 0, 0, 1126, 1128, 3, 138, 69, 0, 1127, 1126, 1, 0, 0, 0, 1128, 1131, 1, 0, 0, 0, 1129, 1127, 1, 0, 0, 0, 1129, 1130, 1, 0, 0, 0, 1130, 1132, 1, 0, 0, 0, 1131, 1129, 1, 0, 0, 0, 1132, 1133, 5, 138, 0, 0, 1133, 137, 1, 0, 0, 0, 1134, 1135, 3, 158, 79, 0, 1135, 1136, 5, 58, 0, 0, 1136, 1137, 5, 9, 0, 0, 1137, 1138, 5, 23, 0, 0, 1138, 1139, 5, 139, 0, 0, 1139, 1140, 3, 84, 42, 0, 1140, 1141, 5, 140, 0, 0, 1141, 1142, 5, 134, 0, 0, 1142, 1233, 1, 0, 0, 0, 1143, 1144, 3, 158, 79, 0, 1144, 1145, 5, 58, 0, 0, 1145, 1146, 5, 61, 0, 0, 1146, 1153, 3, 158, 79, 0, 1147, 1148, 5, 67, 0, 0, 1148, 1149, 5, 62, 0, 0, 1149, 1150, 3, 158, 79, 0, 1150, 1151, 5, 136, 0, 0, 1151, 1152, 3, 158, 79, 0, 1152, 1154, 1, 0, 0, 0, 1153, 1147, 1, 0, 0, 0, 1153, 1154, 1, 0, 0, 0, 1154, 1155, 1, 0, 0, 0, 1155, 1156, 5, 134, 0, 0, 1156, 1233, 1, 0, 0, 0, 1157, 1158, 3, 158, 79, 0, 1158, 1159, 5, 58, 0, 0, 1159, 1160, 5, 62, 0, 0, 1160, 1161, 3, 158, 79, 0, 1161, 1162, 5, 136, 0, 0, 1162, 1169, 3, 158, 79, 0, 1163, 1164, 5, 67, 0, 0, 1164, 1165, 5, 62, 0, 0, 1165, 1166, 3, 158, 79, 0, 1166, 1167, 5, 136, 0, 0, 1167, 1168, 3, 158, 79, 0, 1168, 1170, 1, 0, 0, 0, 1169, 1163, 1, 0, 0, 0, 1169, 1170, 1, 0, 0, 0, 1170, 1171, 1, 0, 0, 0, 1171, 1172, 5, 134, 0, 0, 1172, 1233, 1, 0, 0, 0, 1173, 1174, 3, 158, 79, 0, 1174, 1175, 5, 58, 0, 0, 1175, 1176, 5, 44, 0, 0, 1176, 1178, 3, 158, 79, 0, 1177, 1179, 3, 28, 14, 0, 1178, 1177, 1, 0, 0, 0, 1178, 1179, 1, 0, 0, 0, 1179, 1188, 1, 0, 0, 0, 1180, 1181, 5, 67, 0, 0, 1181, 1182, 5, 62, 0, 0, 1182, 1183, 3, 158, 79, 0, 1183, 1184, 5, 136, 0, 0, 1184, 1185, 3, 158, 79, 0, 1185, 1189, 1, 0, 0, 0, 1186, 1187, 5, 18, 0, 0, 1187, 1189, 5, 53, 0, 0, 1188, 1180, 1, 0, 0, 0, 1188, 1186, 1, 0, 0, 0, 1188, 1189, 1, 0, 0, 0, 1189, 1190, 1, 0, 0, 0, 1190, 1191, 5, 134, 0, 0, 1191, 1233, 1, 0, 0, 0, 1192, 1193, 3, 158, 79, 0, 1193, 1194, 5, 58, 0, 0, 1194, 1195, 5, 7, 0, 0, 1195, 1196, 3, 158, 79, 0, 1196, 1197, 5, 64, 0, 0, 1197, 1201, 5, 137, 0, 0, 1198, 1200, 3, 116, 58, 0, 1199, 1198, 1, 0, 0, 0, 1200, 1203, 1, 0, 0, 0, 1201, 1199, 1, 0, 0, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1204, 1, 0, 0, 0, 1203, 1201, 1, 0, 0, 0, 1204, 1205, 5, 138, 0, 0, 1205, 1206, 5, 134, 0, 0, 1206, 1233, 1, 0, 0, 0, 1207, 1208, 3, 158, 79, 0, 1208, 1209, 5, 58, 0, 0, 1209, 1210, 5, 51, 0, 0, 1210, 1211, 3, 158, 79, 0, 1211, 1212, 5, 134, 0, 0, 1212, 1233, 1, 0, 0, 0, 1213, 1214, 3, 158, 79, 0, 1214, 1216, 5, 58, 0, 0, 1215, 1217, 5, 9, 0, 0, 1216, 1215, 1, 0, 0, 0, 1216, 1217, 1, 0, 0, 0, 1217, 1218, 1, 0, 0, 0, 1218, 1219, 5, 22, 0, 0, 1219, 1220, 3, 158, 79, 0, 1220, 1221, 5, 136, 0, 0, 1221, 1228, 3, 158, 79, 0, 1222, 1223, 5, 67, 0, 0, 1223, 1224, 5, 62, 0, 0, 1224, 1225, 3, 158, 79, 0, 1225, 1226, 5, 136, 0, 0, 1226, 1227, 3, 158, 79, 0, 1227, 1229, 1, 0, 0, 0, 1228, 1222, 1, 0, 0, 0, 1228, 1229, 1, 0, 0, 0, 1229, 1230, 1, 0, 0, 0, 1230, 1231, 5, 134, 0, 0, 1231, 1233, 1, 0, 0, 0, 1232, 1134, 1, 0, 0, 0, 1232, 1143, 1, 0, 0, 0, 1232, 1157, 1, 0, 0, 0, 1232, 1173, 1, 0, 0, 0, 1232, 1192, 1, 0, 0, 0, 1232, 1207, 1, 0, 0, 0, 1232, 1213, 1, 0, 0, 0, 1233, 139, 1, 0, 0, 0, 1234, 1235, 5, 51, 0, 0, 1235, 1236, 3, 158, 79, 0, 1236, 1237, 5, 58, 0, 0, 1237, 1238, 3, 158, 79, 0, 1238, 1239, 5, 136, 0, 0, 1239, 1241, 3, 158, 79, 0, 1240, 1242, 3, 136, 68, 0, 1241, 1240, 1, 0, 0, 0, 1241, 1242, 1, 0, 0, 0, 1242, 1243, 1, 0, 0, 0, 1243, 1244, 5, 134, 0, 0, 1244, 141, 1, 0, 0, 0, 1245, 1292, 3, 146, 73, 0, 1246, 1292, 5, 113, 0, 0, 1247, 1292, 5, 114, 0, 0, 1248, 1249, 5, 115, 0, 0, 1249, 1292, 3, 160, 80, 0, 1250, 1251, 5, 116, 0, 0, 1251, 1252, 5, 143, 0, 0, 1252, 1253, 3, 158, 79, 0, 1253, 1254, 5, 144, 0, 0, 1254, 1292, 1, 0, 0, 0, 1255, 1256, 5, 117, 0, 0, 1256, 1257, 5, 143, 0, 0, 1257, 1259, 3, 158, 79, 0, 1258, 1260, 3, 28, 14, 0, 1259, 1258, 1, 0, 0, 0, 1259, 1260, 1, 0, 0, 0, 1260, 1261, 1, 0, 0, 0, 1261, 1262, 5, 144, 0, 0, 1262, 1292, 1, 0, 0, 0, 1263, 1264, 5, 39, 0, 0, 1264, 1265, 5, 143, 0, 0, 1265, 1266, 3, 158, 79, 0, 1266, 1267, 5, 144, 0, 0, 1267, 1292, 1, 0, 0, 0, 1268, 1269, 5, 118, 0, 0, 1269, 1270, 5, 143, 0, 0, 1270, 1271, 3, 142, 71, 0, 1271, 1272, 5, 144, 0, 0, 1272, 1292, 1, 0, 0, 0, 1273, 1274, 5, 119, 0, 0, 1274, 1275, 5, 143, 0, 0, 1275, 1276, 3, 142, 71, 0, 1276, 1277, 5, 144, 0, 0, 1277, 1292, 1, 0, 0, 0, 1278, 1279, 5, 120, 0, 0, 1279, 1283, 5, 137, 0, 0, 1280, 1282, 3, 144, 72, 0, 1281, 1280, 1, 0, 0, 0, 1282, 1285, 1, 0, 0, 0, 1283, 1281, 1, 0, 0, 0, 1283, 1284, 1, 0, 0, 0, 1284, 1286, 1, 0, 0, 0, 1285, 1283, 1, 0, 0, 0, 1286, 1292, 5, 138, 0, 0, 1287, 1289, 3, 158, 79, 0, 1288, 1290, 3, 28, 14, 0, 1289, 1288, 1, 0, 0, 0, 1289, 1290, 1, 0, 0, 0, 1290, 1292, 1, 0, 0, 0, 1291, 1245, 1, 0, 0, 0, 1291, 1246, 1, 0, 0, 0, 1291, 1247, 1, 0, 0, 0, 1291, 1248, 1, 0, 0, 0, 1291, 1250, 1, 0, 0, 0, 1291, 1255, 1, 0, 0, 0, 1291, 1263, 1, 0, 0, 0, 1291, 1268, 1, 0, 0, 0, 1291, 1273, 1, 0, 0, 0, 1291, 1278, 1, 0, 0, 0, 1291, 1287, 1, 0, 0, 0, 1292, 143, 1, 0, 0, 0, 1293, 1294, 3, 158, 79, 0, 1294, 1295, 5, 133, 0, 0, 1295, 1296, 3, 142, 71, 0, 1296, 1297, 5, 134, 0, 0, 1297, 145, 1, 0, 0, 0, 1298, 1299, 7, 6, 0, 0, 1299, 147, 1, 0, 0, 0, 1300, 1301, 7, 7, 0, 0, 1301, 149, 1, 0, 0, 0, 1302, 1311, 3, 160, 80, 0, 1303, 1311, 5, 147, 0, 0, 1304, 1311, 5, 148, 0, 0, 1305, 1311, 5, 129, 0, 0, 1306, 1311, 5, 130, 0, 0, 1307, 1311, 5, 131, 0, 0, 1308, 1311, 3, 152, 76, 0, 1309, 1311, 3, 156, 78, 0, 1310, 1302, 1, 0, 0, 0, 1310, 1303, 1, 0, 0, 0, 1310, 1304, 1, 0, 0, 0, 1310, 1305, 1, 0, 0, 0, 1310, 1306, 1, 0, 0, 0, 1310, 1307, 1, 0, 0, 0, 1310, 1308, 1, 0, 0, 0, 1310, 1309, 1, 0, 0, 0, 1311, 151, 1, 0, 0, 0, 1312, 1321, 5, 137, 0, 0, 1313, 1318, 3, 154, 77, 0, 1314, 1315, 5, 135, 0, 0, 1315, 1317, 3, 154, 77, 0, 1316, 1314, 1, 0, 0, 0, 1317, 1320, 1, 0, 0, 0, 1318, 1316, 1, 0, 0, 0, 1318, 1319, 1, 0, 0, 0, 1319, 1322, 1, 0, 0, 0, 1320, 1318, 1, 0, 0, 0, 1321, 1313, 1, 0, 0, 0, 1321, 1322, 1, 0, 0, 0, 1322, 1323, 1, 0, 0, 0, 1323, 1324, 5, 138, 0, 0, 1324, 153, 1, 0, 0, 0, 1325, 1326, 3, 160, 80, 0, 1326, 1327, 5, 133, 0, 0, 1327, 1328, 3, 150, 75, 0, 1328, 155, 1, 0, 0, 0, 1329, 1338, 5, 139, 0, 0, 1330, 1335, 3, 150, 75, 0, 1331, 1332, 5, 135, 0, 0, 1332, 1334, 3, 150, 75, 0, 1333, 1331, 1, 0, 0, 0, 1334, 1337, 1, 0, 0, 0, 1335, 1333, 1, 0, 0, 0, 1335, 1336, 1, 0, 0, 0, 1336, 1339, 1, 0, 0, 0, 1337, 1335, 1, 0, 0, 0, 1338, 1330, 1, 0, 0, 0, 1338, 1339, 1, 0, 0, 0, 1339, 1340, 1, 0, 0, 0, 1340, 1341, 5, 140, 0, 0, 1341, 157, 1, 0, 0, 0, 1342, 1343, 7, 8, 0, 0, 1343, 159, 1, 0, 0, 0, 1344, 1345, 5, 150, 0, 0, 1345, 161, 1, 0, 0, 0, 116, 174, 181, 202, 215, 227, 247, 255, 262, 268, 280, 283, 289, 300, 309, 319, 322, 324, 328, 336, 348, 353, 363, 373, 378, 393, 399, 411, 420, 428, 436, 449, 452, 462, 466, 472, 479, 485, 493, 501, 514, 521, 525, 530, 541, 547, 558, 585, 591, 602, 629, 656, 661, 672, 675, 680, 683, 690, 699, 702, 705, 722, 731, 745, 766, 769, 772, 779, 787, 827, 830, 834, 856, 870, 878, 890, 904, 914, 932, 936, 939, 943, 946, 955, 959, 963, 969, 981, 996, 1016, 1025, 1057, 1077, 1097, 1107, 1110, 1113, 1115, 1129, 1153, 1169, 1178, 1188, 1201, 1216, 1228, 1232, 1241, 1259, 1283, 1289, 1291, 1310, 1318, 1321, 1335, 1338] \ No newline at end of file +[4, 1, 153, 1393, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 177, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 182, 8, 1, 10, 1, 12, 1, 185, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 203, 8, 3, 10, 3, 12, 3, 206, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 218, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 230, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 250, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 258, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 263, 8, 10, 10, 10, 12, 10, 266, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 271, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 281, 8, 10, 10, 10, 12, 10, 284, 9, 10, 3, 10, 286, 8, 10, 1, 10, 1, 10, 5, 10, 290, 8, 10, 10, 10, 12, 10, 293, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 301, 8, 11, 10, 11, 12, 11, 304, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 312, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 320, 8, 12, 10, 12, 12, 12, 323, 9, 12, 3, 12, 325, 8, 12, 3, 12, 327, 8, 12, 1, 13, 1, 13, 3, 13, 331, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 337, 8, 14, 10, 14, 12, 14, 340, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 351, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 356, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 366, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 376, 8, 18, 1, 18, 1, 18, 1, 19, 3, 19, 381, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 396, 8, 19, 1, 19, 1, 19, 1, 19, 1, 20, 3, 20, 402, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 412, 8, 20, 10, 20, 12, 20, 415, 9, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 423, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 431, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 439, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 452, 8, 21, 1, 22, 3, 22, 455, 8, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 465, 8, 22, 1, 22, 1, 22, 3, 22, 469, 8, 22, 1, 22, 1, 22, 5, 22, 473, 8, 22, 10, 22, 12, 22, 476, 9, 22, 1, 22, 1, 22, 1, 23, 1, 23, 3, 23, 482, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 488, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 496, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 504, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 517, 8, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 524, 8, 25, 1, 25, 1, 25, 3, 25, 528, 8, 25, 1, 26, 5, 26, 531, 8, 26, 10, 26, 12, 26, 534, 9, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 544, 8, 26, 1, 26, 1, 26, 5, 26, 548, 8, 26, 10, 26, 12, 26, 551, 9, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 561, 8, 27, 1, 28, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 3, 30, 587, 8, 30, 1, 30, 1, 30, 3, 30, 591, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 597, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 5, 30, 606, 8, 30, 10, 30, 12, 30, 609, 9, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 617, 8, 30, 1, 30, 1, 30, 5, 30, 621, 8, 30, 10, 30, 12, 30, 624, 9, 30, 1, 30, 1, 30, 3, 30, 628, 8, 30, 3, 30, 630, 8, 30, 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, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 659, 8, 32, 10, 32, 12, 32, 662, 9, 32, 1, 32, 3, 32, 665, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 671, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 698, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 3, 34, 708, 8, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 719, 8, 34, 1, 34, 3, 34, 722, 8, 34, 1, 34, 1, 34, 1, 34, 3, 34, 727, 8, 34, 1, 34, 3, 34, 730, 8, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 3, 35, 737, 8, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 746, 8, 35, 1, 35, 3, 35, 749, 8, 35, 1, 35, 3, 35, 752, 8, 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, 37, 1, 37, 1, 37, 3, 37, 769, 8, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 776, 8, 38, 10, 38, 12, 38, 779, 9, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 792, 8, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 811, 8, 42, 10, 42, 12, 42, 814, 9, 42, 3, 42, 816, 8, 42, 1, 42, 3, 42, 819, 8, 42, 1, 43, 1, 43, 1, 43, 5, 43, 824, 8, 43, 10, 43, 12, 43, 827, 9, 43, 1, 44, 1, 44, 1, 44, 5, 44, 832, 8, 44, 10, 44, 12, 44, 835, 9, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 874, 8, 45, 1, 45, 3, 45, 877, 8, 45, 1, 45, 1, 45, 3, 45, 881, 8, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 903, 8, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 917, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 5, 46, 923, 8, 46, 10, 46, 12, 46, 926, 9, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 3, 49, 937, 8, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 951, 8, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 961, 8, 51, 1, 52, 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, 53, 1, 53, 3, 53, 979, 8, 53, 1, 53, 1, 53, 3, 53, 983, 8, 53, 1, 53, 3, 53, 986, 8, 53, 1, 53, 1, 53, 3, 53, 990, 8, 53, 1, 53, 3, 53, 993, 8, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 1002, 8, 54, 1, 54, 1, 54, 3, 54, 1006, 8, 54, 1, 54, 1, 54, 3, 54, 1010, 8, 54, 1, 54, 1, 54, 5, 54, 1014, 8, 54, 10, 54, 12, 54, 1017, 9, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 3, 55, 1028, 8, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 5, 57, 1041, 8, 57, 10, 57, 12, 57, 1044, 9, 57, 1, 57, 1, 57, 1, 57, 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, 1063, 8, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 5, 59, 1070, 8, 59, 10, 59, 12, 59, 1073, 9, 59, 1, 59, 1, 59, 1, 60, 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, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 3, 62, 1104, 8, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1124, 8, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1144, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1154, 8, 65, 1, 65, 3, 65, 1157, 8, 65, 1, 65, 3, 65, 1160, 8, 65, 3, 65, 1162, 8, 65, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 5, 69, 1174, 8, 69, 10, 69, 12, 69, 1177, 9, 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, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 3, 70, 1200, 8, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 3, 70, 1216, 8, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 3, 70, 1225, 8, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 3, 70, 1235, 8, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 5, 70, 1246, 8, 70, 10, 70, 12, 70, 1249, 9, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 3, 70, 1263, 8, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 3, 70, 1275, 8, 70, 1, 70, 1, 70, 3, 70, 1279, 8, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1288, 8, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1306, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 5, 72, 1328, 8, 72, 10, 72, 12, 72, 1331, 9, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1336, 8, 72, 3, 72, 1338, 8, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 3, 76, 1357, 8, 76, 1, 77, 1, 77, 1, 77, 1, 77, 5, 77, 1363, 8, 77, 10, 77, 12, 77, 1366, 9, 77, 3, 77, 1368, 8, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 5, 79, 1380, 8, 79, 10, 79, 12, 79, 1383, 9, 79, 3, 79, 1385, 8, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 0, 0, 82, 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, 0, 9, 2, 0, 15, 15, 33, 33, 1, 0, 11, 12, 1, 0, 101, 105, 3, 0, 1, 1, 96, 100, 102, 103, 3, 0, 1, 1, 96, 97, 102, 103, 2, 0, 98, 100, 102, 103, 1, 0, 121, 128, 1, 0, 108, 111, 9, 0, 1, 1, 4, 8, 10, 33, 40, 40, 45, 45, 74, 74, 94, 95, 106, 106, 149, 149, 1508, 0, 176, 1, 0, 0, 0, 2, 178, 1, 0, 0, 0, 4, 188, 1, 0, 0, 0, 6, 192, 1, 0, 0, 0, 8, 217, 1, 0, 0, 0, 10, 229, 1, 0, 0, 0, 12, 231, 1, 0, 0, 0, 14, 238, 1, 0, 0, 0, 16, 249, 1, 0, 0, 0, 18, 251, 1, 0, 0, 0, 20, 264, 1, 0, 0, 0, 22, 296, 1, 0, 0, 0, 24, 326, 1, 0, 0, 0, 26, 328, 1, 0, 0, 0, 28, 332, 1, 0, 0, 0, 30, 350, 1, 0, 0, 0, 32, 352, 1, 0, 0, 0, 34, 365, 1, 0, 0, 0, 36, 367, 1, 0, 0, 0, 38, 380, 1, 0, 0, 0, 40, 401, 1, 0, 0, 0, 42, 451, 1, 0, 0, 0, 44, 454, 1, 0, 0, 0, 46, 479, 1, 0, 0, 0, 48, 516, 1, 0, 0, 0, 50, 527, 1, 0, 0, 0, 52, 532, 1, 0, 0, 0, 54, 560, 1, 0, 0, 0, 56, 562, 1, 0, 0, 0, 58, 572, 1, 0, 0, 0, 60, 584, 1, 0, 0, 0, 62, 631, 1, 0, 0, 0, 64, 697, 1, 0, 0, 0, 66, 699, 1, 0, 0, 0, 68, 704, 1, 0, 0, 0, 70, 733, 1, 0, 0, 0, 72, 755, 1, 0, 0, 0, 74, 768, 1, 0, 0, 0, 76, 770, 1, 0, 0, 0, 78, 782, 1, 0, 0, 0, 80, 795, 1, 0, 0, 0, 82, 798, 1, 0, 0, 0, 84, 818, 1, 0, 0, 0, 86, 820, 1, 0, 0, 0, 88, 828, 1, 0, 0, 0, 90, 916, 1, 0, 0, 0, 92, 918, 1, 0, 0, 0, 94, 929, 1, 0, 0, 0, 96, 931, 1, 0, 0, 0, 98, 936, 1, 0, 0, 0, 100, 938, 1, 0, 0, 0, 102, 960, 1, 0, 0, 0, 104, 962, 1, 0, 0, 0, 106, 971, 1, 0, 0, 0, 108, 996, 1, 0, 0, 0, 110, 1027, 1, 0, 0, 0, 112, 1029, 1, 0, 0, 0, 114, 1037, 1, 0, 0, 0, 116, 1062, 1, 0, 0, 0, 118, 1064, 1, 0, 0, 0, 120, 1076, 1, 0, 0, 0, 122, 1083, 1, 0, 0, 0, 124, 1097, 1, 0, 0, 0, 126, 1107, 1, 0, 0, 0, 128, 1123, 1, 0, 0, 0, 130, 1161, 1, 0, 0, 0, 132, 1163, 1, 0, 0, 0, 134, 1166, 1, 0, 0, 0, 136, 1168, 1, 0, 0, 0, 138, 1170, 1, 0, 0, 0, 140, 1278, 1, 0, 0, 0, 142, 1280, 1, 0, 0, 0, 144, 1337, 1, 0, 0, 0, 146, 1339, 1, 0, 0, 0, 148, 1344, 1, 0, 0, 0, 150, 1346, 1, 0, 0, 0, 152, 1356, 1, 0, 0, 0, 154, 1358, 1, 0, 0, 0, 156, 1371, 1, 0, 0, 0, 158, 1375, 1, 0, 0, 0, 160, 1388, 1, 0, 0, 0, 162, 1390, 1, 0, 0, 0, 164, 165, 3, 6, 3, 0, 165, 166, 5, 0, 0, 1, 166, 177, 1, 0, 0, 0, 167, 168, 3, 20, 10, 0, 168, 169, 5, 0, 0, 1, 169, 177, 1, 0, 0, 0, 170, 171, 3, 52, 26, 0, 171, 172, 5, 0, 0, 1, 172, 177, 1, 0, 0, 0, 173, 174, 3, 2, 1, 0, 174, 175, 5, 0, 0, 1, 175, 177, 1, 0, 0, 0, 176, 164, 1, 0, 0, 0, 176, 167, 1, 0, 0, 0, 176, 170, 1, 0, 0, 0, 176, 173, 1, 0, 0, 0, 177, 1, 1, 0, 0, 0, 178, 179, 5, 40, 0, 0, 179, 183, 5, 137, 0, 0, 180, 182, 3, 8, 4, 0, 181, 180, 1, 0, 0, 0, 182, 185, 1, 0, 0, 0, 183, 181, 1, 0, 0, 0, 183, 184, 1, 0, 0, 0, 184, 186, 1, 0, 0, 0, 185, 183, 1, 0, 0, 0, 186, 187, 5, 138, 0, 0, 187, 3, 1, 0, 0, 0, 188, 189, 5, 41, 0, 0, 189, 190, 3, 162, 81, 0, 190, 191, 5, 134, 0, 0, 191, 5, 1, 0, 0, 0, 192, 193, 5, 9, 0, 0, 193, 194, 3, 160, 80, 0, 194, 195, 5, 84, 0, 0, 195, 196, 3, 162, 81, 0, 196, 197, 5, 77, 0, 0, 197, 198, 3, 162, 81, 0, 198, 199, 5, 76, 0, 0, 199, 200, 3, 162, 81, 0, 200, 204, 5, 137, 0, 0, 201, 203, 3, 8, 4, 0, 202, 201, 1, 0, 0, 0, 203, 206, 1, 0, 0, 0, 204, 202, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 207, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 207, 208, 5, 138, 0, 0, 208, 7, 1, 0, 0, 0, 209, 218, 3, 4, 2, 0, 210, 218, 3, 18, 9, 0, 211, 218, 3, 10, 5, 0, 212, 218, 3, 96, 48, 0, 213, 218, 3, 108, 54, 0, 214, 218, 3, 142, 71, 0, 215, 218, 3, 58, 29, 0, 216, 218, 3, 32, 16, 0, 217, 209, 1, 0, 0, 0, 217, 210, 1, 0, 0, 0, 217, 211, 1, 0, 0, 0, 217, 212, 1, 0, 0, 0, 217, 213, 1, 0, 0, 0, 217, 214, 1, 0, 0, 0, 217, 215, 1, 0, 0, 0, 217, 216, 1, 0, 0, 0, 218, 9, 1, 0, 0, 0, 219, 220, 5, 41, 0, 0, 220, 221, 5, 44, 0, 0, 221, 222, 3, 160, 80, 0, 222, 223, 5, 134, 0, 0, 223, 230, 1, 0, 0, 0, 224, 225, 5, 41, 0, 0, 225, 226, 5, 46, 0, 0, 226, 227, 3, 160, 80, 0, 227, 228, 5, 134, 0, 0, 228, 230, 1, 0, 0, 0, 229, 219, 1, 0, 0, 0, 229, 224, 1, 0, 0, 0, 230, 11, 1, 0, 0, 0, 231, 232, 5, 42, 0, 0, 232, 233, 5, 43, 0, 0, 233, 234, 3, 160, 80, 0, 234, 235, 5, 84, 0, 0, 235, 236, 3, 162, 81, 0, 236, 237, 5, 134, 0, 0, 237, 13, 1, 0, 0, 0, 238, 239, 5, 42, 0, 0, 239, 240, 5, 44, 0, 0, 240, 241, 3, 160, 80, 0, 241, 242, 5, 77, 0, 0, 242, 243, 3, 162, 81, 0, 243, 244, 5, 134, 0, 0, 244, 15, 1, 0, 0, 0, 245, 250, 3, 10, 5, 0, 246, 250, 3, 12, 6, 0, 247, 250, 3, 14, 7, 0, 248, 250, 3, 32, 16, 0, 249, 245, 1, 0, 0, 0, 249, 246, 1, 0, 0, 0, 249, 247, 1, 0, 0, 0, 249, 248, 1, 0, 0, 0, 250, 17, 1, 0, 0, 0, 251, 252, 5, 43, 0, 0, 252, 253, 3, 160, 80, 0, 253, 254, 5, 84, 0, 0, 254, 257, 3, 162, 81, 0, 255, 256, 5, 85, 0, 0, 256, 258, 3, 162, 81, 0, 257, 255, 1, 0, 0, 0, 257, 258, 1, 0, 0, 0, 258, 259, 1, 0, 0, 0, 259, 260, 5, 134, 0, 0, 260, 19, 1, 0, 0, 0, 261, 263, 3, 16, 8, 0, 262, 261, 1, 0, 0, 0, 263, 266, 1, 0, 0, 0, 264, 262, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 267, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 267, 268, 5, 44, 0, 0, 268, 270, 3, 160, 80, 0, 269, 271, 3, 22, 11, 0, 270, 269, 1, 0, 0, 0, 270, 271, 1, 0, 0, 0, 271, 272, 1, 0, 0, 0, 272, 273, 5, 84, 0, 0, 273, 274, 3, 162, 81, 0, 274, 275, 5, 77, 0, 0, 275, 285, 3, 162, 81, 0, 276, 277, 5, 89, 0, 0, 277, 282, 3, 26, 13, 0, 278, 279, 5, 135, 0, 0, 279, 281, 3, 26, 13, 0, 280, 278, 1, 0, 0, 0, 281, 284, 1, 0, 0, 0, 282, 280, 1, 0, 0, 0, 282, 283, 1, 0, 0, 0, 283, 286, 1, 0, 0, 0, 284, 282, 1, 0, 0, 0, 285, 276, 1, 0, 0, 0, 285, 286, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 291, 5, 137, 0, 0, 288, 290, 3, 34, 17, 0, 289, 288, 1, 0, 0, 0, 290, 293, 1, 0, 0, 0, 291, 289, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 294, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 294, 295, 5, 138, 0, 0, 295, 21, 1, 0, 0, 0, 296, 297, 5, 143, 0, 0, 297, 302, 3, 24, 12, 0, 298, 299, 5, 135, 0, 0, 299, 301, 3, 24, 12, 0, 300, 298, 1, 0, 0, 0, 301, 304, 1, 0, 0, 0, 302, 300, 1, 0, 0, 0, 302, 303, 1, 0, 0, 0, 303, 305, 1, 0, 0, 0, 304, 302, 1, 0, 0, 0, 305, 306, 5, 144, 0, 0, 306, 23, 1, 0, 0, 0, 307, 308, 5, 47, 0, 0, 308, 311, 3, 160, 80, 0, 309, 310, 5, 133, 0, 0, 310, 312, 5, 37, 0, 0, 311, 309, 1, 0, 0, 0, 311, 312, 1, 0, 0, 0, 312, 327, 1, 0, 0, 0, 313, 314, 5, 36, 0, 0, 314, 324, 3, 160, 80, 0, 315, 316, 5, 38, 0, 0, 316, 321, 3, 26, 13, 0, 317, 318, 5, 145, 0, 0, 318, 320, 3, 26, 13, 0, 319, 317, 1, 0, 0, 0, 320, 323, 1, 0, 0, 0, 321, 319, 1, 0, 0, 0, 321, 322, 1, 0, 0, 0, 322, 325, 1, 0, 0, 0, 323, 321, 1, 0, 0, 0, 324, 315, 1, 0, 0, 0, 324, 325, 1, 0, 0, 0, 325, 327, 1, 0, 0, 0, 326, 307, 1, 0, 0, 0, 326, 313, 1, 0, 0, 0, 327, 25, 1, 0, 0, 0, 328, 330, 3, 160, 80, 0, 329, 331, 3, 28, 14, 0, 330, 329, 1, 0, 0, 0, 330, 331, 1, 0, 0, 0, 331, 27, 1, 0, 0, 0, 332, 333, 5, 143, 0, 0, 333, 338, 3, 30, 15, 0, 334, 335, 5, 135, 0, 0, 335, 337, 3, 30, 15, 0, 336, 334, 1, 0, 0, 0, 337, 340, 1, 0, 0, 0, 338, 336, 1, 0, 0, 0, 338, 339, 1, 0, 0, 0, 339, 341, 1, 0, 0, 0, 340, 338, 1, 0, 0, 0, 341, 342, 5, 144, 0, 0, 342, 29, 1, 0, 0, 0, 343, 344, 5, 43, 0, 0, 344, 351, 3, 160, 80, 0, 345, 346, 5, 44, 0, 0, 346, 351, 3, 26, 13, 0, 347, 348, 5, 36, 0, 0, 348, 351, 3, 160, 80, 0, 349, 351, 3, 144, 72, 0, 350, 343, 1, 0, 0, 0, 350, 345, 1, 0, 0, 0, 350, 347, 1, 0, 0, 0, 350, 349, 1, 0, 0, 0, 351, 31, 1, 0, 0, 0, 352, 353, 5, 35, 0, 0, 353, 355, 3, 160, 80, 0, 354, 356, 3, 22, 11, 0, 355, 354, 1, 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 358, 5, 146, 0, 0, 358, 359, 3, 144, 72, 0, 359, 360, 5, 134, 0, 0, 360, 33, 1, 0, 0, 0, 361, 366, 3, 40, 20, 0, 362, 366, 3, 44, 22, 0, 363, 366, 3, 38, 19, 0, 364, 366, 3, 36, 18, 0, 365, 361, 1, 0, 0, 0, 365, 362, 1, 0, 0, 0, 365, 363, 1, 0, 0, 0, 365, 364, 1, 0, 0, 0, 366, 35, 1, 0, 0, 0, 367, 368, 5, 2, 0, 0, 368, 369, 3, 160, 80, 0, 369, 370, 5, 84, 0, 0, 370, 371, 3, 162, 81, 0, 371, 372, 5, 3, 0, 0, 372, 375, 3, 162, 81, 0, 373, 374, 5, 5, 0, 0, 374, 376, 3, 50, 25, 0, 375, 373, 1, 0, 0, 0, 375, 376, 1, 0, 0, 0, 376, 377, 1, 0, 0, 0, 377, 378, 5, 134, 0, 0, 378, 37, 1, 0, 0, 0, 379, 381, 5, 57, 0, 0, 380, 379, 1, 0, 0, 0, 380, 381, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 383, 5, 49, 0, 0, 383, 384, 3, 160, 80, 0, 384, 385, 5, 84, 0, 0, 385, 386, 3, 162, 81, 0, 386, 387, 5, 133, 0, 0, 387, 388, 3, 144, 72, 0, 388, 389, 5, 132, 0, 0, 389, 390, 3, 144, 72, 0, 390, 391, 5, 137, 0, 0, 391, 392, 5, 101, 0, 0, 392, 393, 5, 84, 0, 0, 393, 395, 3, 162, 81, 0, 394, 396, 3, 74, 37, 0, 395, 394, 1, 0, 0, 0, 395, 396, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 398, 5, 134, 0, 0, 398, 399, 5, 138, 0, 0, 399, 39, 1, 0, 0, 0, 400, 402, 3, 46, 23, 0, 401, 400, 1, 0, 0, 0, 401, 402, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 404, 5, 47, 0, 0, 404, 405, 3, 160, 80, 0, 405, 406, 5, 84, 0, 0, 406, 407, 3, 162, 81, 0, 407, 408, 5, 133, 0, 0, 408, 409, 3, 144, 72, 0, 409, 413, 5, 137, 0, 0, 410, 412, 3, 42, 21, 0, 411, 410, 1, 0, 0, 0, 412, 415, 1, 0, 0, 0, 413, 411, 1, 0, 0, 0, 413, 414, 1, 0, 0, 0, 414, 416, 1, 0, 0, 0, 415, 413, 1, 0, 0, 0, 416, 417, 5, 138, 0, 0, 417, 41, 1, 0, 0, 0, 418, 419, 5, 91, 0, 0, 419, 420, 5, 84, 0, 0, 420, 422, 3, 162, 81, 0, 421, 423, 3, 74, 37, 0, 422, 421, 1, 0, 0, 0, 422, 423, 1, 0, 0, 0, 423, 424, 1, 0, 0, 0, 424, 425, 5, 134, 0, 0, 425, 452, 1, 0, 0, 0, 426, 427, 5, 92, 0, 0, 427, 428, 5, 84, 0, 0, 428, 430, 3, 162, 81, 0, 429, 431, 3, 74, 37, 0, 430, 429, 1, 0, 0, 0, 430, 431, 1, 0, 0, 0, 431, 432, 1, 0, 0, 0, 432, 433, 5, 134, 0, 0, 433, 452, 1, 0, 0, 0, 434, 435, 5, 1, 0, 0, 435, 436, 5, 84, 0, 0, 436, 438, 3, 162, 81, 0, 437, 439, 3, 74, 37, 0, 438, 437, 1, 0, 0, 0, 438, 439, 1, 0, 0, 0, 439, 440, 1, 0, 0, 0, 440, 441, 5, 134, 0, 0, 441, 452, 1, 0, 0, 0, 442, 443, 5, 93, 0, 0, 443, 444, 5, 94, 0, 0, 444, 445, 5, 84, 0, 0, 445, 446, 3, 162, 81, 0, 446, 447, 5, 95, 0, 0, 447, 448, 5, 84, 0, 0, 448, 449, 3, 162, 81, 0, 449, 450, 5, 134, 0, 0, 450, 452, 1, 0, 0, 0, 451, 418, 1, 0, 0, 0, 451, 426, 1, 0, 0, 0, 451, 434, 1, 0, 0, 0, 451, 442, 1, 0, 0, 0, 452, 43, 1, 0, 0, 0, 453, 455, 3, 46, 23, 0, 454, 453, 1, 0, 0, 0, 454, 455, 1, 0, 0, 0, 455, 456, 1, 0, 0, 0, 456, 457, 5, 48, 0, 0, 457, 458, 3, 160, 80, 0, 458, 459, 5, 84, 0, 0, 459, 460, 3, 162, 81, 0, 460, 461, 5, 133, 0, 0, 461, 462, 3, 150, 75, 0, 462, 464, 3, 50, 25, 0, 463, 465, 5, 112, 0, 0, 464, 463, 1, 0, 0, 0, 464, 465, 1, 0, 0, 0, 465, 468, 1, 0, 0, 0, 466, 467, 5, 82, 0, 0, 467, 469, 3, 162, 81, 0, 468, 466, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 470, 1, 0, 0, 0, 470, 474, 5, 137, 0, 0, 471, 473, 3, 48, 24, 0, 472, 471, 1, 0, 0, 0, 473, 476, 1, 0, 0, 0, 474, 472, 1, 0, 0, 0, 474, 475, 1, 0, 0, 0, 475, 477, 1, 0, 0, 0, 476, 474, 1, 0, 0, 0, 477, 478, 5, 138, 0, 0, 478, 45, 1, 0, 0, 0, 479, 481, 5, 32, 0, 0, 480, 482, 7, 0, 0, 0, 481, 480, 1, 0, 0, 0, 481, 482, 1, 0, 0, 0, 482, 47, 1, 0, 0, 0, 483, 484, 5, 98, 0, 0, 484, 485, 5, 84, 0, 0, 485, 487, 3, 162, 81, 0, 486, 488, 3, 74, 37, 0, 487, 486, 1, 0, 0, 0, 487, 488, 1, 0, 0, 0, 488, 489, 1, 0, 0, 0, 489, 490, 5, 134, 0, 0, 490, 517, 1, 0, 0, 0, 491, 492, 5, 99, 0, 0, 492, 493, 5, 84, 0, 0, 493, 495, 3, 162, 81, 0, 494, 496, 3, 74, 37, 0, 495, 494, 1, 0, 0, 0, 495, 496, 1, 0, 0, 0, 496, 497, 1, 0, 0, 0, 497, 498, 5, 134, 0, 0, 498, 517, 1, 0, 0, 0, 499, 500, 5, 100, 0, 0, 500, 501, 5, 84, 0, 0, 501, 503, 3, 162, 81, 0, 502, 504, 3, 74, 37, 0, 503, 502, 1, 0, 0, 0, 503, 504, 1, 0, 0, 0, 504, 505, 1, 0, 0, 0, 505, 506, 5, 134, 0, 0, 506, 517, 1, 0, 0, 0, 507, 508, 5, 93, 0, 0, 508, 509, 5, 94, 0, 0, 509, 510, 5, 84, 0, 0, 510, 511, 3, 162, 81, 0, 511, 512, 5, 95, 0, 0, 512, 513, 5, 84, 0, 0, 513, 514, 3, 162, 81, 0, 514, 515, 5, 134, 0, 0, 515, 517, 1, 0, 0, 0, 516, 483, 1, 0, 0, 0, 516, 491, 1, 0, 0, 0, 516, 499, 1, 0, 0, 0, 516, 507, 1, 0, 0, 0, 517, 49, 1, 0, 0, 0, 518, 519, 5, 43, 0, 0, 519, 528, 3, 160, 80, 0, 520, 521, 5, 44, 0, 0, 521, 523, 3, 160, 80, 0, 522, 524, 3, 28, 14, 0, 523, 522, 1, 0, 0, 0, 523, 524, 1, 0, 0, 0, 524, 528, 1, 0, 0, 0, 525, 526, 5, 36, 0, 0, 526, 528, 3, 160, 80, 0, 527, 518, 1, 0, 0, 0, 527, 520, 1, 0, 0, 0, 527, 525, 1, 0, 0, 0, 528, 51, 1, 0, 0, 0, 529, 531, 3, 16, 8, 0, 530, 529, 1, 0, 0, 0, 531, 534, 1, 0, 0, 0, 532, 530, 1, 0, 0, 0, 532, 533, 1, 0, 0, 0, 533, 535, 1, 0, 0, 0, 534, 532, 1, 0, 0, 0, 535, 536, 5, 46, 0, 0, 536, 537, 3, 160, 80, 0, 537, 538, 5, 84, 0, 0, 538, 539, 3, 162, 81, 0, 539, 540, 5, 77, 0, 0, 540, 543, 3, 162, 81, 0, 541, 542, 5, 78, 0, 0, 542, 544, 5, 147, 0, 0, 543, 541, 1, 0, 0, 0, 543, 544, 1, 0, 0, 0, 544, 545, 1, 0, 0, 0, 545, 549, 5, 137, 0, 0, 546, 548, 3, 54, 27, 0, 547, 546, 1, 0, 0, 0, 548, 551, 1, 0, 0, 0, 549, 547, 1, 0, 0, 0, 549, 550, 1, 0, 0, 0, 550, 552, 1, 0, 0, 0, 551, 549, 1, 0, 0, 0, 552, 553, 5, 138, 0, 0, 553, 53, 1, 0, 0, 0, 554, 561, 3, 68, 34, 0, 555, 561, 3, 70, 35, 0, 556, 561, 3, 78, 39, 0, 557, 561, 3, 60, 30, 0, 558, 561, 3, 62, 31, 0, 559, 561, 3, 56, 28, 0, 560, 554, 1, 0, 0, 0, 560, 555, 1, 0, 0, 0, 560, 556, 1, 0, 0, 0, 560, 557, 1, 0, 0, 0, 560, 558, 1, 0, 0, 0, 560, 559, 1, 0, 0, 0, 561, 55, 1, 0, 0, 0, 562, 563, 5, 2, 0, 0, 563, 564, 3, 160, 80, 0, 564, 565, 5, 84, 0, 0, 565, 566, 3, 162, 81, 0, 566, 567, 5, 38, 0, 0, 567, 568, 3, 26, 13, 0, 568, 569, 5, 136, 0, 0, 569, 570, 3, 160, 80, 0, 570, 571, 5, 134, 0, 0, 571, 57, 1, 0, 0, 0, 572, 573, 5, 4, 0, 0, 573, 574, 3, 160, 80, 0, 574, 575, 5, 84, 0, 0, 575, 576, 3, 162, 81, 0, 576, 577, 5, 6, 0, 0, 577, 578, 3, 26, 13, 0, 578, 579, 5, 65, 0, 0, 579, 580, 3, 160, 80, 0, 580, 581, 5, 136, 0, 0, 581, 582, 3, 160, 80, 0, 582, 583, 5, 134, 0, 0, 583, 59, 1, 0, 0, 0, 584, 586, 5, 22, 0, 0, 585, 587, 5, 40, 0, 0, 586, 585, 1, 0, 0, 0, 586, 587, 1, 0, 0, 0, 587, 588, 1, 0, 0, 0, 588, 590, 3, 160, 80, 0, 589, 591, 3, 22, 11, 0, 590, 589, 1, 0, 0, 0, 590, 591, 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, 592, 593, 5, 84, 0, 0, 593, 594, 3, 162, 81, 0, 594, 596, 5, 25, 0, 0, 595, 597, 5, 9, 0, 0, 596, 595, 1, 0, 0, 0, 596, 597, 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 599, 3, 26, 13, 0, 599, 600, 5, 26, 0, 0, 600, 629, 3, 162, 81, 0, 601, 602, 5, 49, 0, 0, 602, 603, 3, 162, 81, 0, 603, 607, 5, 137, 0, 0, 604, 606, 3, 64, 32, 0, 605, 604, 1, 0, 0, 0, 606, 609, 1, 0, 0, 0, 607, 605, 1, 0, 0, 0, 607, 608, 1, 0, 0, 0, 608, 610, 1, 0, 0, 0, 609, 607, 1, 0, 0, 0, 610, 611, 5, 138, 0, 0, 611, 630, 1, 0, 0, 0, 612, 613, 5, 40, 0, 0, 613, 616, 3, 162, 81, 0, 614, 615, 5, 49, 0, 0, 615, 617, 3, 162, 81, 0, 616, 614, 1, 0, 0, 0, 616, 617, 1, 0, 0, 0, 617, 627, 1, 0, 0, 0, 618, 622, 5, 137, 0, 0, 619, 621, 3, 64, 32, 0, 620, 619, 1, 0, 0, 0, 621, 624, 1, 0, 0, 0, 622, 620, 1, 0, 0, 0, 622, 623, 1, 0, 0, 0, 623, 625, 1, 0, 0, 0, 624, 622, 1, 0, 0, 0, 625, 628, 5, 138, 0, 0, 626, 628, 5, 134, 0, 0, 627, 618, 1, 0, 0, 0, 627, 626, 1, 0, 0, 0, 628, 630, 1, 0, 0, 0, 629, 601, 1, 0, 0, 0, 629, 612, 1, 0, 0, 0, 630, 61, 1, 0, 0, 0, 631, 632, 5, 22, 0, 0, 632, 633, 3, 160, 80, 0, 633, 634, 5, 84, 0, 0, 634, 635, 3, 162, 81, 0, 635, 636, 5, 24, 0, 0, 636, 637, 3, 160, 80, 0, 637, 638, 3, 28, 14, 0, 638, 639, 5, 134, 0, 0, 639, 63, 1, 0, 0, 0, 640, 641, 5, 16, 0, 0, 641, 698, 5, 134, 0, 0, 642, 643, 5, 17, 0, 0, 643, 644, 5, 18, 0, 0, 644, 645, 3, 160, 80, 0, 645, 646, 5, 134, 0, 0, 646, 698, 1, 0, 0, 0, 647, 648, 5, 27, 0, 0, 648, 649, 3, 162, 81, 0, 649, 650, 5, 134, 0, 0, 650, 698, 1, 0, 0, 0, 651, 652, 5, 27, 0, 0, 652, 653, 3, 160, 80, 0, 653, 654, 5, 136, 0, 0, 654, 664, 3, 160, 80, 0, 655, 656, 5, 64, 0, 0, 656, 660, 5, 137, 0, 0, 657, 659, 3, 66, 33, 0, 658, 657, 1, 0, 0, 0, 659, 662, 1, 0, 0, 0, 660, 658, 1, 0, 0, 0, 660, 661, 1, 0, 0, 0, 661, 663, 1, 0, 0, 0, 662, 660, 1, 0, 0, 0, 663, 665, 5, 138, 0, 0, 664, 655, 1, 0, 0, 0, 664, 665, 1, 0, 0, 0, 665, 666, 1, 0, 0, 0, 666, 667, 5, 134, 0, 0, 667, 698, 1, 0, 0, 0, 668, 670, 5, 28, 0, 0, 669, 671, 5, 36, 0, 0, 670, 669, 1, 0, 0, 0, 670, 671, 1, 0, 0, 0, 671, 672, 1, 0, 0, 0, 672, 673, 3, 160, 80, 0, 673, 674, 5, 55, 0, 0, 674, 675, 3, 26, 13, 0, 675, 676, 5, 134, 0, 0, 676, 698, 1, 0, 0, 0, 677, 678, 5, 29, 0, 0, 678, 679, 3, 160, 80, 0, 679, 680, 5, 147, 0, 0, 680, 681, 5, 134, 0, 0, 681, 698, 1, 0, 0, 0, 682, 683, 5, 30, 0, 0, 683, 684, 3, 26, 13, 0, 684, 685, 5, 136, 0, 0, 685, 686, 3, 160, 80, 0, 686, 687, 3, 160, 80, 0, 687, 688, 3, 162, 81, 0, 688, 689, 5, 134, 0, 0, 689, 698, 1, 0, 0, 0, 690, 691, 5, 93, 0, 0, 691, 698, 5, 134, 0, 0, 692, 693, 5, 31, 0, 0, 693, 694, 5, 147, 0, 0, 694, 695, 3, 162, 81, 0, 695, 696, 5, 134, 0, 0, 696, 698, 1, 0, 0, 0, 697, 640, 1, 0, 0, 0, 697, 642, 1, 0, 0, 0, 697, 647, 1, 0, 0, 0, 697, 651, 1, 0, 0, 0, 697, 668, 1, 0, 0, 0, 697, 677, 1, 0, 0, 0, 697, 682, 1, 0, 0, 0, 697, 690, 1, 0, 0, 0, 697, 692, 1, 0, 0, 0, 698, 65, 1, 0, 0, 0, 699, 700, 3, 160, 80, 0, 700, 701, 5, 58, 0, 0, 701, 702, 3, 160, 80, 0, 702, 703, 5, 134, 0, 0, 703, 67, 1, 0, 0, 0, 704, 705, 5, 49, 0, 0, 705, 707, 3, 160, 80, 0, 706, 708, 3, 22, 11, 0, 707, 706, 1, 0, 0, 0, 707, 708, 1, 0, 0, 0, 708, 709, 1, 0, 0, 0, 709, 710, 5, 84, 0, 0, 710, 711, 3, 162, 81, 0, 711, 712, 5, 133, 0, 0, 712, 713, 3, 144, 72, 0, 713, 714, 5, 132, 0, 0, 714, 715, 3, 144, 72, 0, 715, 716, 5, 86, 0, 0, 716, 718, 3, 82, 41, 0, 717, 719, 3, 74, 37, 0, 718, 717, 1, 0, 0, 0, 718, 719, 1, 0, 0, 0, 719, 721, 1, 0, 0, 0, 720, 722, 3, 80, 40, 0, 721, 720, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 723, 1, 0, 0, 0, 723, 724, 5, 88, 0, 0, 724, 726, 3, 84, 42, 0, 725, 727, 3, 88, 44, 0, 726, 725, 1, 0, 0, 0, 726, 727, 1, 0, 0, 0, 727, 729, 1, 0, 0, 0, 728, 730, 3, 72, 36, 0, 729, 728, 1, 0, 0, 0, 729, 730, 1, 0, 0, 0, 730, 731, 1, 0, 0, 0, 731, 732, 5, 134, 0, 0, 732, 69, 1, 0, 0, 0, 733, 734, 5, 50, 0, 0, 734, 736, 3, 160, 80, 0, 735, 737, 3, 22, 11, 0, 736, 735, 1, 0, 0, 0, 736, 737, 1, 0, 0, 0, 737, 738, 1, 0, 0, 0, 738, 739, 5, 84, 0, 0, 739, 740, 3, 162, 81, 0, 740, 741, 5, 133, 0, 0, 741, 742, 3, 144, 72, 0, 742, 743, 5, 132, 0, 0, 743, 745, 3, 144, 72, 0, 744, 746, 3, 74, 37, 0, 745, 744, 1, 0, 0, 0, 745, 746, 1, 0, 0, 0, 746, 748, 1, 0, 0, 0, 747, 749, 3, 88, 44, 0, 748, 747, 1, 0, 0, 0, 748, 749, 1, 0, 0, 0, 749, 751, 1, 0, 0, 0, 750, 752, 3, 72, 36, 0, 751, 750, 1, 0, 0, 0, 751, 752, 1, 0, 0, 0, 752, 753, 1, 0, 0, 0, 753, 754, 5, 134, 0, 0, 754, 71, 1, 0, 0, 0, 755, 756, 5, 66, 0, 0, 756, 757, 5, 65, 0, 0, 757, 758, 3, 160, 80, 0, 758, 73, 1, 0, 0, 0, 759, 760, 5, 10, 0, 0, 760, 769, 5, 13, 0, 0, 761, 762, 5, 10, 0, 0, 762, 763, 7, 1, 0, 0, 763, 764, 5, 14, 0, 0, 764, 765, 5, 139, 0, 0, 765, 766, 3, 86, 43, 0, 766, 767, 5, 140, 0, 0, 767, 769, 1, 0, 0, 0, 768, 759, 1, 0, 0, 0, 768, 761, 1, 0, 0, 0, 769, 75, 1, 0, 0, 0, 770, 771, 5, 65, 0, 0, 771, 772, 5, 139, 0, 0, 772, 777, 3, 126, 63, 0, 773, 774, 5, 135, 0, 0, 774, 776, 3, 126, 63, 0, 775, 773, 1, 0, 0, 0, 776, 779, 1, 0, 0, 0, 777, 775, 1, 0, 0, 0, 777, 778, 1, 0, 0, 0, 778, 780, 1, 0, 0, 0, 779, 777, 1, 0, 0, 0, 780, 781, 5, 140, 0, 0, 781, 77, 1, 0, 0, 0, 782, 783, 5, 51, 0, 0, 783, 784, 3, 160, 80, 0, 784, 785, 5, 84, 0, 0, 785, 786, 3, 162, 81, 0, 786, 787, 5, 52, 0, 0, 787, 788, 3, 160, 80, 0, 788, 789, 5, 133, 0, 0, 789, 791, 3, 144, 72, 0, 790, 792, 3, 88, 44, 0, 791, 790, 1, 0, 0, 0, 791, 792, 1, 0, 0, 0, 792, 793, 1, 0, 0, 0, 793, 794, 5, 134, 0, 0, 794, 79, 1, 0, 0, 0, 795, 796, 5, 87, 0, 0, 796, 797, 3, 144, 72, 0, 797, 81, 1, 0, 0, 0, 798, 799, 7, 2, 0, 0, 799, 83, 1, 0, 0, 0, 800, 819, 5, 90, 0, 0, 801, 802, 5, 43, 0, 0, 802, 819, 3, 160, 80, 0, 803, 804, 5, 36, 0, 0, 804, 819, 3, 160, 80, 0, 805, 806, 5, 45, 0, 0, 806, 815, 5, 139, 0, 0, 807, 812, 3, 26, 13, 0, 808, 809, 5, 135, 0, 0, 809, 811, 3, 26, 13, 0, 810, 808, 1, 0, 0, 0, 811, 814, 1, 0, 0, 0, 812, 810, 1, 0, 0, 0, 812, 813, 1, 0, 0, 0, 813, 816, 1, 0, 0, 0, 814, 812, 1, 0, 0, 0, 815, 807, 1, 0, 0, 0, 815, 816, 1, 0, 0, 0, 816, 817, 1, 0, 0, 0, 817, 819, 5, 140, 0, 0, 818, 800, 1, 0, 0, 0, 818, 801, 1, 0, 0, 0, 818, 803, 1, 0, 0, 0, 818, 805, 1, 0, 0, 0, 819, 85, 1, 0, 0, 0, 820, 825, 3, 160, 80, 0, 821, 822, 5, 135, 0, 0, 822, 824, 3, 160, 80, 0, 823, 821, 1, 0, 0, 0, 824, 827, 1, 0, 0, 0, 825, 823, 1, 0, 0, 0, 825, 826, 1, 0, 0, 0, 826, 87, 1, 0, 0, 0, 827, 825, 1, 0, 0, 0, 828, 829, 5, 89, 0, 0, 829, 833, 5, 137, 0, 0, 830, 832, 3, 90, 45, 0, 831, 830, 1, 0, 0, 0, 832, 835, 1, 0, 0, 0, 833, 831, 1, 0, 0, 0, 833, 834, 1, 0, 0, 0, 834, 836, 1, 0, 0, 0, 835, 833, 1, 0, 0, 0, 836, 837, 5, 138, 0, 0, 837, 89, 1, 0, 0, 0, 838, 839, 5, 23, 0, 0, 839, 840, 3, 160, 80, 0, 840, 841, 5, 84, 0, 0, 841, 842, 3, 162, 81, 0, 842, 843, 5, 139, 0, 0, 843, 844, 3, 86, 43, 0, 844, 845, 5, 140, 0, 0, 845, 846, 5, 134, 0, 0, 846, 917, 1, 0, 0, 0, 847, 848, 5, 61, 0, 0, 848, 849, 3, 160, 80, 0, 849, 850, 5, 84, 0, 0, 850, 851, 3, 162, 81, 0, 851, 852, 5, 133, 0, 0, 852, 853, 3, 144, 72, 0, 853, 854, 3, 92, 46, 0, 854, 855, 5, 134, 0, 0, 855, 917, 1, 0, 0, 0, 856, 857, 5, 62, 0, 0, 857, 858, 3, 160, 80, 0, 858, 859, 5, 84, 0, 0, 859, 860, 3, 162, 81, 0, 860, 861, 5, 133, 0, 0, 861, 862, 3, 150, 75, 0, 862, 863, 3, 50, 25, 0, 863, 864, 3, 92, 46, 0, 864, 865, 5, 134, 0, 0, 865, 917, 1, 0, 0, 0, 866, 867, 5, 44, 0, 0, 867, 868, 3, 160, 80, 0, 868, 869, 5, 84, 0, 0, 869, 870, 3, 162, 81, 0, 870, 871, 5, 133, 0, 0, 871, 873, 3, 160, 80, 0, 872, 874, 3, 28, 14, 0, 873, 872, 1, 0, 0, 0, 873, 874, 1, 0, 0, 0, 874, 876, 1, 0, 0, 0, 875, 877, 3, 76, 38, 0, 876, 875, 1, 0, 0, 0, 876, 877, 1, 0, 0, 0, 877, 880, 1, 0, 0, 0, 878, 879, 5, 18, 0, 0, 879, 881, 5, 53, 0, 0, 880, 878, 1, 0, 0, 0, 880, 881, 1, 0, 0, 0, 881, 882, 1, 0, 0, 0, 882, 883, 5, 134, 0, 0, 883, 917, 1, 0, 0, 0, 884, 885, 5, 7, 0, 0, 885, 886, 3, 160, 80, 0, 886, 887, 5, 84, 0, 0, 887, 888, 3, 162, 81, 0, 888, 889, 5, 133, 0, 0, 889, 890, 3, 160, 80, 0, 890, 891, 5, 53, 0, 0, 891, 892, 3, 144, 72, 0, 892, 893, 5, 134, 0, 0, 893, 917, 1, 0, 0, 0, 894, 895, 5, 51, 0, 0, 895, 896, 3, 160, 80, 0, 896, 897, 5, 84, 0, 0, 897, 898, 3, 162, 81, 0, 898, 899, 5, 133, 0, 0, 899, 902, 3, 160, 80, 0, 900, 901, 5, 53, 0, 0, 901, 903, 3, 144, 72, 0, 902, 900, 1, 0, 0, 0, 902, 903, 1, 0, 0, 0, 903, 904, 1, 0, 0, 0, 904, 905, 5, 134, 0, 0, 905, 917, 1, 0, 0, 0, 906, 907, 5, 22, 0, 0, 907, 908, 3, 160, 80, 0, 908, 909, 5, 84, 0, 0, 909, 910, 3, 162, 81, 0, 910, 911, 5, 133, 0, 0, 911, 912, 3, 160, 80, 0, 912, 913, 5, 136, 0, 0, 913, 914, 3, 160, 80, 0, 914, 915, 5, 134, 0, 0, 915, 917, 1, 0, 0, 0, 916, 838, 1, 0, 0, 0, 916, 847, 1, 0, 0, 0, 916, 856, 1, 0, 0, 0, 916, 866, 1, 0, 0, 0, 916, 884, 1, 0, 0, 0, 916, 894, 1, 0, 0, 0, 916, 906, 1, 0, 0, 0, 917, 91, 1, 0, 0, 0, 918, 919, 5, 139, 0, 0, 919, 924, 3, 94, 47, 0, 920, 921, 5, 135, 0, 0, 921, 923, 3, 94, 47, 0, 922, 920, 1, 0, 0, 0, 923, 926, 1, 0, 0, 0, 924, 922, 1, 0, 0, 0, 924, 925, 1, 0, 0, 0, 925, 927, 1, 0, 0, 0, 926, 924, 1, 0, 0, 0, 927, 928, 5, 140, 0, 0, 928, 93, 1, 0, 0, 0, 929, 930, 7, 3, 0, 0, 930, 95, 1, 0, 0, 0, 931, 932, 5, 60, 0, 0, 932, 933, 3, 98, 49, 0, 933, 97, 1, 0, 0, 0, 934, 937, 3, 100, 50, 0, 935, 937, 3, 104, 52, 0, 936, 934, 1, 0, 0, 0, 936, 935, 1, 0, 0, 0, 937, 99, 1, 0, 0, 0, 938, 939, 5, 61, 0, 0, 939, 940, 3, 160, 80, 0, 940, 941, 5, 84, 0, 0, 941, 942, 3, 162, 81, 0, 942, 943, 5, 71, 0, 0, 943, 944, 3, 160, 80, 0, 944, 945, 5, 133, 0, 0, 945, 946, 3, 144, 72, 0, 946, 947, 5, 72, 0, 0, 947, 950, 3, 102, 51, 0, 948, 949, 5, 73, 0, 0, 949, 951, 3, 152, 76, 0, 950, 948, 1, 0, 0, 0, 950, 951, 1, 0, 0, 0, 951, 952, 1, 0, 0, 0, 952, 953, 5, 134, 0, 0, 953, 101, 1, 0, 0, 0, 954, 961, 5, 106, 0, 0, 955, 956, 5, 107, 0, 0, 956, 957, 5, 141, 0, 0, 957, 958, 3, 144, 72, 0, 958, 959, 5, 142, 0, 0, 959, 961, 1, 0, 0, 0, 960, 954, 1, 0, 0, 0, 960, 955, 1, 0, 0, 0, 961, 103, 1, 0, 0, 0, 962, 963, 5, 62, 0, 0, 963, 964, 3, 160, 80, 0, 964, 965, 5, 84, 0, 0, 965, 966, 3, 162, 81, 0, 966, 967, 5, 137, 0, 0, 967, 968, 3, 106, 53, 0, 968, 969, 3, 106, 53, 0, 969, 970, 5, 138, 0, 0, 970, 105, 1, 0, 0, 0, 971, 972, 3, 50, 25, 0, 972, 973, 5, 63, 0, 0, 973, 974, 3, 160, 80, 0, 974, 975, 5, 84, 0, 0, 975, 976, 3, 162, 81, 0, 976, 978, 3, 150, 75, 0, 977, 979, 5, 112, 0, 0, 978, 977, 1, 0, 0, 0, 978, 979, 1, 0, 0, 0, 979, 982, 1, 0, 0, 0, 980, 981, 5, 79, 0, 0, 981, 983, 3, 162, 81, 0, 982, 980, 1, 0, 0, 0, 982, 983, 1, 0, 0, 0, 983, 985, 1, 0, 0, 0, 984, 986, 5, 81, 0, 0, 985, 984, 1, 0, 0, 0, 985, 986, 1, 0, 0, 0, 986, 989, 1, 0, 0, 0, 987, 988, 5, 82, 0, 0, 988, 990, 3, 162, 81, 0, 989, 987, 1, 0, 0, 0, 989, 990, 1, 0, 0, 0, 990, 992, 1, 0, 0, 0, 991, 993, 5, 83, 0, 0, 992, 991, 1, 0, 0, 0, 992, 993, 1, 0, 0, 0, 993, 994, 1, 0, 0, 0, 994, 995, 5, 134, 0, 0, 995, 107, 1, 0, 0, 0, 996, 997, 5, 54, 0, 0, 997, 998, 3, 160, 80, 0, 998, 999, 5, 55, 0, 0, 999, 1001, 3, 160, 80, 0, 1000, 1002, 3, 28, 14, 0, 1001, 1000, 1, 0, 0, 0, 1001, 1002, 1, 0, 0, 0, 1002, 1005, 1, 0, 0, 0, 1003, 1004, 5, 84, 0, 0, 1004, 1006, 3, 162, 81, 0, 1005, 1003, 1, 0, 0, 0, 1005, 1006, 1, 0, 0, 0, 1006, 1009, 1, 0, 0, 0, 1007, 1008, 5, 78, 0, 0, 1008, 1010, 5, 147, 0, 0, 1009, 1007, 1, 0, 0, 0, 1009, 1010, 1, 0, 0, 0, 1010, 1011, 1, 0, 0, 0, 1011, 1015, 5, 137, 0, 0, 1012, 1014, 3, 110, 55, 0, 1013, 1012, 1, 0, 0, 0, 1014, 1017, 1, 0, 0, 0, 1015, 1013, 1, 0, 0, 0, 1015, 1016, 1, 0, 0, 0, 1016, 1018, 1, 0, 0, 0, 1017, 1015, 1, 0, 0, 0, 1018, 1019, 5, 138, 0, 0, 1019, 109, 1, 0, 0, 0, 1020, 1021, 5, 59, 0, 0, 1021, 1028, 3, 98, 49, 0, 1022, 1028, 3, 124, 62, 0, 1023, 1028, 3, 120, 60, 0, 1024, 1028, 3, 114, 57, 0, 1025, 1028, 3, 122, 61, 0, 1026, 1028, 3, 112, 56, 0, 1027, 1020, 1, 0, 0, 0, 1027, 1022, 1, 0, 0, 0, 1027, 1023, 1, 0, 0, 0, 1027, 1024, 1, 0, 0, 0, 1027, 1025, 1, 0, 0, 0, 1027, 1026, 1, 0, 0, 0, 1028, 111, 1, 0, 0, 0, 1029, 1030, 5, 56, 0, 0, 1030, 1031, 3, 160, 80, 0, 1031, 1032, 5, 58, 0, 0, 1032, 1033, 3, 160, 80, 0, 1033, 1034, 5, 136, 0, 0, 1034, 1035, 3, 160, 80, 0, 1035, 1036, 5, 134, 0, 0, 1036, 113, 1, 0, 0, 0, 1037, 1038, 5, 8, 0, 0, 1038, 1042, 5, 137, 0, 0, 1039, 1041, 3, 116, 58, 0, 1040, 1039, 1, 0, 0, 0, 1041, 1044, 1, 0, 0, 0, 1042, 1040, 1, 0, 0, 0, 1042, 1043, 1, 0, 0, 0, 1043, 1045, 1, 0, 0, 0, 1044, 1042, 1, 0, 0, 0, 1045, 1046, 5, 138, 0, 0, 1046, 1047, 5, 134, 0, 0, 1047, 115, 1, 0, 0, 0, 1048, 1049, 3, 160, 80, 0, 1049, 1050, 5, 58, 0, 0, 1050, 1051, 5, 61, 0, 0, 1051, 1052, 3, 160, 80, 0, 1052, 1053, 5, 134, 0, 0, 1053, 1063, 1, 0, 0, 0, 1054, 1055, 3, 160, 80, 0, 1055, 1056, 5, 58, 0, 0, 1056, 1057, 5, 62, 0, 0, 1057, 1058, 3, 160, 80, 0, 1058, 1059, 5, 136, 0, 0, 1059, 1060, 3, 160, 80, 0, 1060, 1061, 5, 134, 0, 0, 1061, 1063, 1, 0, 0, 0, 1062, 1048, 1, 0, 0, 0, 1062, 1054, 1, 0, 0, 0, 1063, 117, 1, 0, 0, 0, 1064, 1065, 3, 26, 13, 0, 1065, 1066, 5, 18, 0, 0, 1066, 1071, 5, 53, 0, 0, 1067, 1068, 5, 136, 0, 0, 1068, 1070, 3, 160, 80, 0, 1069, 1067, 1, 0, 0, 0, 1070, 1073, 1, 0, 0, 0, 1071, 1069, 1, 0, 0, 0, 1071, 1072, 1, 0, 0, 0, 1072, 1074, 1, 0, 0, 0, 1073, 1071, 1, 0, 0, 0, 1074, 1075, 5, 134, 0, 0, 1075, 119, 1, 0, 0, 0, 1076, 1077, 5, 56, 0, 0, 1077, 1078, 3, 160, 80, 0, 1078, 1079, 5, 58, 0, 0, 1079, 1080, 5, 61, 0, 0, 1080, 1081, 3, 160, 80, 0, 1081, 1082, 5, 134, 0, 0, 1082, 121, 1, 0, 0, 0, 1083, 1084, 5, 68, 0, 0, 1084, 1085, 3, 160, 80, 0, 1085, 1086, 5, 69, 0, 0, 1086, 1087, 5, 70, 0, 0, 1087, 1088, 5, 65, 0, 0, 1088, 1089, 5, 51, 0, 0, 1089, 1090, 3, 160, 80, 0, 1090, 1091, 5, 67, 0, 0, 1091, 1092, 5, 62, 0, 0, 1092, 1093, 3, 160, 80, 0, 1093, 1094, 5, 136, 0, 0, 1094, 1095, 3, 160, 80, 0, 1095, 1096, 5, 134, 0, 0, 1096, 123, 1, 0, 0, 0, 1097, 1098, 5, 56, 0, 0, 1098, 1099, 3, 126, 63, 0, 1099, 1100, 5, 58, 0, 0, 1100, 1103, 3, 130, 65, 0, 1101, 1102, 5, 34, 0, 0, 1102, 1104, 3, 162, 81, 0, 1103, 1101, 1, 0, 0, 0, 1103, 1104, 1, 0, 0, 0, 1104, 1105, 1, 0, 0, 0, 1105, 1106, 5, 134, 0, 0, 1106, 125, 1, 0, 0, 0, 1107, 1108, 3, 160, 80, 0, 1108, 1109, 5, 136, 0, 0, 1109, 1110, 3, 128, 64, 0, 1110, 127, 1, 0, 0, 0, 1111, 1124, 3, 160, 80, 0, 1112, 1124, 5, 101, 0, 0, 1113, 1124, 5, 91, 0, 0, 1114, 1124, 5, 92, 0, 0, 1115, 1124, 5, 1, 0, 0, 1116, 1124, 5, 98, 0, 0, 1117, 1124, 5, 99, 0, 0, 1118, 1124, 5, 100, 0, 0, 1119, 1124, 5, 102, 0, 0, 1120, 1124, 5, 103, 0, 0, 1121, 1124, 5, 104, 0, 0, 1122, 1124, 5, 105, 0, 0, 1123, 1111, 1, 0, 0, 0, 1123, 1112, 1, 0, 0, 0, 1123, 1113, 1, 0, 0, 0, 1123, 1114, 1, 0, 0, 0, 1123, 1115, 1, 0, 0, 0, 1123, 1116, 1, 0, 0, 0, 1123, 1117, 1, 0, 0, 0, 1123, 1118, 1, 0, 0, 0, 1123, 1119, 1, 0, 0, 0, 1123, 1120, 1, 0, 0, 0, 1123, 1121, 1, 0, 0, 0, 1123, 1122, 1, 0, 0, 0, 1124, 129, 1, 0, 0, 0, 1125, 1126, 5, 80, 0, 0, 1126, 1127, 5, 136, 0, 0, 1127, 1162, 3, 160, 80, 0, 1128, 1129, 5, 61, 0, 0, 1129, 1130, 3, 160, 80, 0, 1130, 1131, 5, 136, 0, 0, 1131, 1132, 3, 134, 67, 0, 1132, 1162, 1, 0, 0, 0, 1133, 1134, 5, 62, 0, 0, 1134, 1135, 3, 160, 80, 0, 1135, 1136, 5, 136, 0, 0, 1136, 1137, 3, 160, 80, 0, 1137, 1138, 5, 136, 0, 0, 1138, 1139, 3, 136, 68, 0, 1139, 1162, 1, 0, 0, 0, 1140, 1141, 5, 44, 0, 0, 1141, 1143, 3, 160, 80, 0, 1142, 1144, 3, 28, 14, 0, 1143, 1142, 1, 0, 0, 0, 1143, 1144, 1, 0, 0, 0, 1144, 1145, 1, 0, 0, 0, 1145, 1146, 5, 136, 0, 0, 1146, 1147, 3, 126, 63, 0, 1147, 1162, 1, 0, 0, 0, 1148, 1149, 5, 46, 0, 0, 1149, 1150, 3, 160, 80, 0, 1150, 1151, 5, 136, 0, 0, 1151, 1153, 3, 160, 80, 0, 1152, 1154, 3, 28, 14, 0, 1153, 1152, 1, 0, 0, 0, 1153, 1154, 1, 0, 0, 0, 1154, 1156, 1, 0, 0, 0, 1155, 1157, 3, 138, 69, 0, 1156, 1155, 1, 0, 0, 0, 1156, 1157, 1, 0, 0, 0, 1157, 1159, 1, 0, 0, 0, 1158, 1160, 3, 132, 66, 0, 1159, 1158, 1, 0, 0, 0, 1159, 1160, 1, 0, 0, 0, 1160, 1162, 1, 0, 0, 0, 1161, 1125, 1, 0, 0, 0, 1161, 1128, 1, 0, 0, 0, 1161, 1133, 1, 0, 0, 0, 1161, 1140, 1, 0, 0, 0, 1161, 1148, 1, 0, 0, 0, 1162, 131, 1, 0, 0, 0, 1163, 1164, 5, 66, 0, 0, 1164, 1165, 3, 138, 69, 0, 1165, 133, 1, 0, 0, 0, 1166, 1167, 7, 4, 0, 0, 1167, 135, 1, 0, 0, 0, 1168, 1169, 7, 5, 0, 0, 1169, 137, 1, 0, 0, 0, 1170, 1171, 5, 64, 0, 0, 1171, 1175, 5, 137, 0, 0, 1172, 1174, 3, 140, 70, 0, 1173, 1172, 1, 0, 0, 0, 1174, 1177, 1, 0, 0, 0, 1175, 1173, 1, 0, 0, 0, 1175, 1176, 1, 0, 0, 0, 1176, 1178, 1, 0, 0, 0, 1177, 1175, 1, 0, 0, 0, 1178, 1179, 5, 138, 0, 0, 1179, 139, 1, 0, 0, 0, 1180, 1181, 3, 160, 80, 0, 1181, 1182, 5, 58, 0, 0, 1182, 1183, 5, 9, 0, 0, 1183, 1184, 5, 23, 0, 0, 1184, 1185, 5, 139, 0, 0, 1185, 1186, 3, 86, 43, 0, 1186, 1187, 5, 140, 0, 0, 1187, 1188, 5, 134, 0, 0, 1188, 1279, 1, 0, 0, 0, 1189, 1190, 3, 160, 80, 0, 1190, 1191, 5, 58, 0, 0, 1191, 1192, 5, 61, 0, 0, 1192, 1199, 3, 160, 80, 0, 1193, 1194, 5, 67, 0, 0, 1194, 1195, 5, 62, 0, 0, 1195, 1196, 3, 160, 80, 0, 1196, 1197, 5, 136, 0, 0, 1197, 1198, 3, 160, 80, 0, 1198, 1200, 1, 0, 0, 0, 1199, 1193, 1, 0, 0, 0, 1199, 1200, 1, 0, 0, 0, 1200, 1201, 1, 0, 0, 0, 1201, 1202, 5, 134, 0, 0, 1202, 1279, 1, 0, 0, 0, 1203, 1204, 3, 160, 80, 0, 1204, 1205, 5, 58, 0, 0, 1205, 1206, 5, 62, 0, 0, 1206, 1207, 3, 160, 80, 0, 1207, 1208, 5, 136, 0, 0, 1208, 1215, 3, 160, 80, 0, 1209, 1210, 5, 67, 0, 0, 1210, 1211, 5, 62, 0, 0, 1211, 1212, 3, 160, 80, 0, 1212, 1213, 5, 136, 0, 0, 1213, 1214, 3, 160, 80, 0, 1214, 1216, 1, 0, 0, 0, 1215, 1209, 1, 0, 0, 0, 1215, 1216, 1, 0, 0, 0, 1216, 1217, 1, 0, 0, 0, 1217, 1218, 5, 134, 0, 0, 1218, 1279, 1, 0, 0, 0, 1219, 1220, 3, 160, 80, 0, 1220, 1221, 5, 58, 0, 0, 1221, 1222, 5, 44, 0, 0, 1222, 1224, 3, 160, 80, 0, 1223, 1225, 3, 28, 14, 0, 1224, 1223, 1, 0, 0, 0, 1224, 1225, 1, 0, 0, 0, 1225, 1234, 1, 0, 0, 0, 1226, 1227, 5, 67, 0, 0, 1227, 1228, 5, 62, 0, 0, 1228, 1229, 3, 160, 80, 0, 1229, 1230, 5, 136, 0, 0, 1230, 1231, 3, 160, 80, 0, 1231, 1235, 1, 0, 0, 0, 1232, 1233, 5, 18, 0, 0, 1233, 1235, 5, 53, 0, 0, 1234, 1226, 1, 0, 0, 0, 1234, 1232, 1, 0, 0, 0, 1234, 1235, 1, 0, 0, 0, 1235, 1236, 1, 0, 0, 0, 1236, 1237, 5, 134, 0, 0, 1237, 1279, 1, 0, 0, 0, 1238, 1239, 3, 160, 80, 0, 1239, 1240, 5, 58, 0, 0, 1240, 1241, 5, 7, 0, 0, 1241, 1242, 3, 160, 80, 0, 1242, 1243, 5, 64, 0, 0, 1243, 1247, 5, 137, 0, 0, 1244, 1246, 3, 118, 59, 0, 1245, 1244, 1, 0, 0, 0, 1246, 1249, 1, 0, 0, 0, 1247, 1245, 1, 0, 0, 0, 1247, 1248, 1, 0, 0, 0, 1248, 1250, 1, 0, 0, 0, 1249, 1247, 1, 0, 0, 0, 1250, 1251, 5, 138, 0, 0, 1251, 1252, 5, 134, 0, 0, 1252, 1279, 1, 0, 0, 0, 1253, 1254, 3, 160, 80, 0, 1254, 1255, 5, 58, 0, 0, 1255, 1256, 5, 51, 0, 0, 1256, 1257, 3, 160, 80, 0, 1257, 1258, 5, 134, 0, 0, 1258, 1279, 1, 0, 0, 0, 1259, 1260, 3, 160, 80, 0, 1260, 1262, 5, 58, 0, 0, 1261, 1263, 5, 9, 0, 0, 1262, 1261, 1, 0, 0, 0, 1262, 1263, 1, 0, 0, 0, 1263, 1264, 1, 0, 0, 0, 1264, 1265, 5, 22, 0, 0, 1265, 1266, 3, 160, 80, 0, 1266, 1267, 5, 136, 0, 0, 1267, 1274, 3, 160, 80, 0, 1268, 1269, 5, 67, 0, 0, 1269, 1270, 5, 62, 0, 0, 1270, 1271, 3, 160, 80, 0, 1271, 1272, 5, 136, 0, 0, 1272, 1273, 3, 160, 80, 0, 1273, 1275, 1, 0, 0, 0, 1274, 1268, 1, 0, 0, 0, 1274, 1275, 1, 0, 0, 0, 1275, 1276, 1, 0, 0, 0, 1276, 1277, 5, 134, 0, 0, 1277, 1279, 1, 0, 0, 0, 1278, 1180, 1, 0, 0, 0, 1278, 1189, 1, 0, 0, 0, 1278, 1203, 1, 0, 0, 0, 1278, 1219, 1, 0, 0, 0, 1278, 1238, 1, 0, 0, 0, 1278, 1253, 1, 0, 0, 0, 1278, 1259, 1, 0, 0, 0, 1279, 141, 1, 0, 0, 0, 1280, 1281, 5, 51, 0, 0, 1281, 1282, 3, 160, 80, 0, 1282, 1283, 5, 58, 0, 0, 1283, 1284, 3, 160, 80, 0, 1284, 1285, 5, 136, 0, 0, 1285, 1287, 3, 160, 80, 0, 1286, 1288, 3, 138, 69, 0, 1287, 1286, 1, 0, 0, 0, 1287, 1288, 1, 0, 0, 0, 1288, 1289, 1, 0, 0, 0, 1289, 1290, 5, 134, 0, 0, 1290, 143, 1, 0, 0, 0, 1291, 1338, 3, 148, 74, 0, 1292, 1338, 5, 113, 0, 0, 1293, 1338, 5, 114, 0, 0, 1294, 1295, 5, 115, 0, 0, 1295, 1338, 3, 162, 81, 0, 1296, 1297, 5, 116, 0, 0, 1297, 1298, 5, 143, 0, 0, 1298, 1299, 3, 160, 80, 0, 1299, 1300, 5, 144, 0, 0, 1300, 1338, 1, 0, 0, 0, 1301, 1302, 5, 117, 0, 0, 1302, 1303, 5, 143, 0, 0, 1303, 1305, 3, 160, 80, 0, 1304, 1306, 3, 28, 14, 0, 1305, 1304, 1, 0, 0, 0, 1305, 1306, 1, 0, 0, 0, 1306, 1307, 1, 0, 0, 0, 1307, 1308, 5, 144, 0, 0, 1308, 1338, 1, 0, 0, 0, 1309, 1310, 5, 39, 0, 0, 1310, 1311, 5, 143, 0, 0, 1311, 1312, 3, 160, 80, 0, 1312, 1313, 5, 144, 0, 0, 1313, 1338, 1, 0, 0, 0, 1314, 1315, 5, 118, 0, 0, 1315, 1316, 5, 143, 0, 0, 1316, 1317, 3, 144, 72, 0, 1317, 1318, 5, 144, 0, 0, 1318, 1338, 1, 0, 0, 0, 1319, 1320, 5, 119, 0, 0, 1320, 1321, 5, 143, 0, 0, 1321, 1322, 3, 144, 72, 0, 1322, 1323, 5, 144, 0, 0, 1323, 1338, 1, 0, 0, 0, 1324, 1325, 5, 120, 0, 0, 1325, 1329, 5, 137, 0, 0, 1326, 1328, 3, 146, 73, 0, 1327, 1326, 1, 0, 0, 0, 1328, 1331, 1, 0, 0, 0, 1329, 1327, 1, 0, 0, 0, 1329, 1330, 1, 0, 0, 0, 1330, 1332, 1, 0, 0, 0, 1331, 1329, 1, 0, 0, 0, 1332, 1338, 5, 138, 0, 0, 1333, 1335, 3, 160, 80, 0, 1334, 1336, 3, 28, 14, 0, 1335, 1334, 1, 0, 0, 0, 1335, 1336, 1, 0, 0, 0, 1336, 1338, 1, 0, 0, 0, 1337, 1291, 1, 0, 0, 0, 1337, 1292, 1, 0, 0, 0, 1337, 1293, 1, 0, 0, 0, 1337, 1294, 1, 0, 0, 0, 1337, 1296, 1, 0, 0, 0, 1337, 1301, 1, 0, 0, 0, 1337, 1309, 1, 0, 0, 0, 1337, 1314, 1, 0, 0, 0, 1337, 1319, 1, 0, 0, 0, 1337, 1324, 1, 0, 0, 0, 1337, 1333, 1, 0, 0, 0, 1338, 145, 1, 0, 0, 0, 1339, 1340, 3, 160, 80, 0, 1340, 1341, 5, 133, 0, 0, 1341, 1342, 3, 144, 72, 0, 1342, 1343, 5, 134, 0, 0, 1343, 147, 1, 0, 0, 0, 1344, 1345, 7, 6, 0, 0, 1345, 149, 1, 0, 0, 0, 1346, 1347, 7, 7, 0, 0, 1347, 151, 1, 0, 0, 0, 1348, 1357, 3, 162, 81, 0, 1349, 1357, 5, 147, 0, 0, 1350, 1357, 5, 148, 0, 0, 1351, 1357, 5, 129, 0, 0, 1352, 1357, 5, 130, 0, 0, 1353, 1357, 5, 131, 0, 0, 1354, 1357, 3, 154, 77, 0, 1355, 1357, 3, 158, 79, 0, 1356, 1348, 1, 0, 0, 0, 1356, 1349, 1, 0, 0, 0, 1356, 1350, 1, 0, 0, 0, 1356, 1351, 1, 0, 0, 0, 1356, 1352, 1, 0, 0, 0, 1356, 1353, 1, 0, 0, 0, 1356, 1354, 1, 0, 0, 0, 1356, 1355, 1, 0, 0, 0, 1357, 153, 1, 0, 0, 0, 1358, 1367, 5, 137, 0, 0, 1359, 1364, 3, 156, 78, 0, 1360, 1361, 5, 135, 0, 0, 1361, 1363, 3, 156, 78, 0, 1362, 1360, 1, 0, 0, 0, 1363, 1366, 1, 0, 0, 0, 1364, 1362, 1, 0, 0, 0, 1364, 1365, 1, 0, 0, 0, 1365, 1368, 1, 0, 0, 0, 1366, 1364, 1, 0, 0, 0, 1367, 1359, 1, 0, 0, 0, 1367, 1368, 1, 0, 0, 0, 1368, 1369, 1, 0, 0, 0, 1369, 1370, 5, 138, 0, 0, 1370, 155, 1, 0, 0, 0, 1371, 1372, 3, 162, 81, 0, 1372, 1373, 5, 133, 0, 0, 1373, 1374, 3, 152, 76, 0, 1374, 157, 1, 0, 0, 0, 1375, 1384, 5, 139, 0, 0, 1376, 1381, 3, 152, 76, 0, 1377, 1378, 5, 135, 0, 0, 1378, 1380, 3, 152, 76, 0, 1379, 1377, 1, 0, 0, 0, 1380, 1383, 1, 0, 0, 0, 1381, 1379, 1, 0, 0, 0, 1381, 1382, 1, 0, 0, 0, 1382, 1385, 1, 0, 0, 0, 1383, 1381, 1, 0, 0, 0, 1384, 1376, 1, 0, 0, 0, 1384, 1385, 1, 0, 0, 0, 1385, 1386, 1, 0, 0, 0, 1386, 1387, 5, 140, 0, 0, 1387, 159, 1, 0, 0, 0, 1388, 1389, 7, 8, 0, 0, 1389, 161, 1, 0, 0, 0, 1390, 1391, 5, 150, 0, 0, 1391, 163, 1, 0, 0, 0, 123, 176, 183, 204, 217, 229, 249, 257, 264, 270, 282, 285, 291, 302, 311, 321, 324, 326, 330, 338, 350, 355, 365, 375, 380, 395, 401, 413, 422, 430, 438, 451, 454, 464, 468, 474, 481, 487, 495, 503, 516, 523, 527, 532, 543, 549, 560, 586, 590, 596, 607, 616, 622, 627, 629, 660, 664, 670, 697, 707, 718, 721, 726, 729, 736, 745, 748, 751, 768, 777, 791, 812, 815, 818, 825, 833, 873, 876, 880, 902, 916, 924, 936, 950, 960, 978, 982, 985, 989, 992, 1001, 1005, 1009, 1015, 1027, 1042, 1062, 1071, 1103, 1123, 1143, 1153, 1156, 1159, 1161, 1175, 1199, 1215, 1224, 1234, 1247, 1262, 1274, 1278, 1287, 1305, 1329, 1335, 1337, 1356, 1364, 1367, 1381, 1384] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapabilityParser.ts b/src/capability-language/generated/QuixosCapabilityParser.ts index 8a35a66..21c08f0 100644 --- a/src/capability-language/generated/QuixosCapabilityParser.ts +++ b/src/capability-language/generated/QuixosCapabilityParser.ts @@ -196,54 +196,55 @@ export class QuixosCapabilityParser extends antlr.Parser { public static readonly RULE_packageQuery = 30; public static readonly RULE_packageQuerySpecialization = 31; public static readonly RULE_queryClause = 32; - public static readonly RULE_packageOperationExport = 33; - public static readonly RULE_packageFunctionExport = 34; - public static readonly RULE_acceptanceClause = 35; - public static readonly RULE_executionClause = 36; - public static readonly RULE_selectedOperations = 37; - public static readonly RULE_packageConstructorExport = 38; - public static readonly RULE_eventClause = 39; - public static readonly RULE_operationMode = 40; - public static readonly RULE_receiverRequirement = 41; - public static readonly RULE_identifierList = 42; - public static readonly RULE_dependencyBlock = 43; - public static readonly RULE_dependencyPort = 44; - public static readonly RULE_primitiveList = 45; - public static readonly RULE_primitive = 46; - public static readonly RULE_sharedAttachmentDecl = 47; - public static readonly RULE_attachmentDecl = 48; - public static readonly RULE_stateDecl = 49; - public static readonly RULE_storagePolicy = 50; - public static readonly RULE_edgeDecl = 51; - public static readonly RULE_edgeEndpoint = 52; - public static readonly RULE_conformanceDecl = 53; - public static readonly RULE_conformanceItem = 54; - public static readonly RULE_moduleBindingDecl = 55; - public static readonly RULE_initializationDecl = 56; - public static readonly RULE_initializationField = 57; - public static readonly RULE_creationOwnerMapping = 58; - public static readonly RULE_stateFieldBindingDecl = 59; - public static readonly RULE_relationshipMaterializationDecl = 60; - public static readonly RULE_operationBindingDecl = 61; - public static readonly RULE_memberOperationRef = 62; - public static readonly RULE_operationName = 63; - public static readonly RULE_operationProvider = 64; - public static readonly RULE_acceptanceBinding = 65; - public static readonly RULE_statePrimitive = 66; - public static readonly RULE_edgePrimitive = 67; - public static readonly RULE_dependencyBindingBlock = 68; - public static readonly RULE_dependencyBinding = 69; - public static readonly RULE_constructorBindingDecl = 70; - public static readonly RULE_valueType = 71; - public static readonly RULE_recordField = 72; - public static readonly RULE_scalarType = 73; - public static readonly RULE_cardinality = 74; - public static readonly RULE_jsonLiteral = 75; - public static readonly RULE_jsonObject = 76; - public static readonly RULE_jsonMember = 77; - public static readonly RULE_jsonArray = 78; - public static readonly RULE_identifier = 79; - public static readonly RULE_stringLiteral = 80; + public static readonly RULE_fragmentVariable = 33; + public static readonly RULE_packageOperationExport = 34; + public static readonly RULE_packageFunctionExport = 35; + public static readonly RULE_acceptanceClause = 36; + public static readonly RULE_executionClause = 37; + public static readonly RULE_selectedOperations = 38; + public static readonly RULE_packageConstructorExport = 39; + public static readonly RULE_eventClause = 40; + public static readonly RULE_operationMode = 41; + public static readonly RULE_receiverRequirement = 42; + public static readonly RULE_identifierList = 43; + public static readonly RULE_dependencyBlock = 44; + public static readonly RULE_dependencyPort = 45; + public static readonly RULE_primitiveList = 46; + public static readonly RULE_primitive = 47; + public static readonly RULE_sharedAttachmentDecl = 48; + public static readonly RULE_attachmentDecl = 49; + public static readonly RULE_stateDecl = 50; + public static readonly RULE_storagePolicy = 51; + public static readonly RULE_edgeDecl = 52; + public static readonly RULE_edgeEndpoint = 53; + public static readonly RULE_conformanceDecl = 54; + public static readonly RULE_conformanceItem = 55; + public static readonly RULE_moduleBindingDecl = 56; + public static readonly RULE_initializationDecl = 57; + public static readonly RULE_initializationField = 58; + public static readonly RULE_creationOwnerMapping = 59; + public static readonly RULE_stateFieldBindingDecl = 60; + public static readonly RULE_relationshipMaterializationDecl = 61; + public static readonly RULE_operationBindingDecl = 62; + public static readonly RULE_memberOperationRef = 63; + public static readonly RULE_operationName = 64; + public static readonly RULE_operationProvider = 65; + public static readonly RULE_acceptanceBinding = 66; + public static readonly RULE_statePrimitive = 67; + public static readonly RULE_edgePrimitive = 68; + public static readonly RULE_dependencyBindingBlock = 69; + public static readonly RULE_dependencyBinding = 70; + public static readonly RULE_constructorBindingDecl = 71; + public static readonly RULE_valueType = 72; + public static readonly RULE_recordField = 73; + public static readonly RULE_scalarType = 74; + public static readonly RULE_cardinality = 75; + public static readonly RULE_jsonLiteral = 76; + public static readonly RULE_jsonObject = 77; + public static readonly RULE_jsonMember = 78; + public static readonly RULE_jsonArray = 79; + public static readonly RULE_identifier = 80; + public static readonly RULE_stringLiteral = 81; public static readonly literalNames = [ null, "'edit'", "'module'", "'contract'", "'presentation'", "'subject'", @@ -309,20 +310,20 @@ export class QuixosCapabilityParser extends antlr.Parser { "valueMember", "valueMemberOperation", "relationshipMember", "queryReadContract", "relationshipOperation", "targetConstraint", "packageResourceDecl", "packageExport", "moduleExport", "presentationDecl", "packageQuery", - "packageQuerySpecialization", "queryClause", "packageOperationExport", - "packageFunctionExport", "acceptanceClause", "executionClause", - "selectedOperations", "packageConstructorExport", "eventClause", - "operationMode", "receiverRequirement", "identifierList", "dependencyBlock", - "dependencyPort", "primitiveList", "primitive", "sharedAttachmentDecl", - "attachmentDecl", "stateDecl", "storagePolicy", "edgeDecl", "edgeEndpoint", - "conformanceDecl", "conformanceItem", "moduleBindingDecl", "initializationDecl", - "initializationField", "creationOwnerMapping", "stateFieldBindingDecl", - "relationshipMaterializationDecl", "operationBindingDecl", "memberOperationRef", - "operationName", "operationProvider", "acceptanceBinding", "statePrimitive", - "edgePrimitive", "dependencyBindingBlock", "dependencyBinding", - "constructorBindingDecl", "valueType", "recordField", "scalarType", - "cardinality", "jsonLiteral", "jsonObject", "jsonMember", "jsonArray", - "identifier", "stringLiteral", + "packageQuerySpecialization", "queryClause", "fragmentVariable", + "packageOperationExport", "packageFunctionExport", "acceptanceClause", + "executionClause", "selectedOperations", "packageConstructorExport", + "eventClause", "operationMode", "receiverRequirement", "identifierList", + "dependencyBlock", "dependencyPort", "primitiveList", "primitive", + "sharedAttachmentDecl", "attachmentDecl", "stateDecl", "storagePolicy", + "edgeDecl", "edgeEndpoint", "conformanceDecl", "conformanceItem", + "moduleBindingDecl", "initializationDecl", "initializationField", + "creationOwnerMapping", "stateFieldBindingDecl", "relationshipMaterializationDecl", + "operationBindingDecl", "memberOperationRef", "operationName", "operationProvider", + "acceptanceBinding", "statePrimitive", "edgePrimitive", "dependencyBindingBlock", + "dependencyBinding", "constructorBindingDecl", "valueType", "recordField", + "scalarType", "cardinality", "jsonLiteral", "jsonObject", "jsonMember", + "jsonArray", "identifier", "stringLiteral", ]; public get grammarFileName(): string { return "QuixosCapability.g4"; } @@ -343,42 +344,42 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new DocumentContext(this.context, this.state); this.enterRule(localContext, 0, QuixosCapabilityParser.RULE_document); try { - this.state = 174; + this.state = 176; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 0, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 162; + this.state = 164; this.workspaceDecl(); - this.state = 163; + this.state = 165; this.match(QuixosCapabilityParser.EOF); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 165; + this.state = 167; this.interfaceResourceDecl(); - this.state = 166; + this.state = 168; this.match(QuixosCapabilityParser.EOF); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 168; + this.state = 170; this.packageResourceDecl(); - this.state = 169; + this.state = 171; this.match(QuixosCapabilityParser.EOF); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 171; + this.state = 173; this.fragmentDecl(); - this.state = 172; + this.state = 174; this.match(QuixosCapabilityParser.EOF); } break; @@ -404,25 +405,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 176; + this.state = 178; this.match(QuixosCapabilityParser.FRAGMENT); - this.state = 177; + this.state = 179; this.match(QuixosCapabilityParser.LBRACE); - this.state = 181; + this.state = 183; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 4 || ((((_la - 35)) & ~0x1F) === 0 && ((1 << (_la - 35)) & 34144577) !== 0)) { { { - this.state = 178; + this.state = 180; this.workspaceItem(); } } - this.state = 183; + this.state = 185; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 184; + this.state = 186; this.match(QuixosCapabilityParser.RBRACE); } } @@ -445,11 +446,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 186; - this.match(QuixosCapabilityParser.IMPORT); - this.state = 187; - this.stringLiteral(); this.state = 188; + this.match(QuixosCapabilityParser.IMPORT); + this.state = 189; + this.stringLiteral(); + this.state = 190; this.match(QuixosCapabilityParser.SEMI); } } @@ -473,39 +474,39 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 190; - this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 191; - this.identifier(); this.state = 192; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.WORKSPACE); this.state = 193; - this.stringLiteral(); + this.identifier(); this.state = 194; - this.match(QuixosCapabilityParser.REVISION); + this.match(QuixosCapabilityParser.ID); this.state = 195; this.stringLiteral(); this.state = 196; - this.match(QuixosCapabilityParser.COMMIT); + this.match(QuixosCapabilityParser.REVISION); this.state = 197; this.stringLiteral(); this.state = 198; + this.match(QuixosCapabilityParser.COMMIT); + this.state = 199; + this.stringLiteral(); + this.state = 200; this.match(QuixosCapabilityParser.LBRACE); - this.state = 202; + this.state = 204; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 4 || ((((_la - 35)) & ~0x1F) === 0 && ((1 << (_la - 35)) & 34144577) !== 0)) { { { - this.state = 199; + this.state = 201; this.workspaceItem(); } } - this.state = 204; + this.state = 206; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 205; + this.state = 207; this.match(QuixosCapabilityParser.RBRACE); } } @@ -526,62 +527,62 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new WorkspaceItemContext(this.context, this.state); this.enterRule(localContext, 8, QuixosCapabilityParser.RULE_workspaceItem); try { - this.state = 215; + this.state = 217; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 3, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 207; + this.state = 209; this.sourceImportDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 208; + this.state = 210; this.atomDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 209; + this.state = 211; this.resourceImportDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 210; + this.state = 212; this.sharedAttachmentDecl(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 211; + this.state = 213; this.conformanceDecl(); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 212; + this.state = 214; this.constructorBindingDecl(); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 213; + this.state = 215; this.presentationDecl(); } break; case 8: this.enterOuterAlt(localContext, 8); { - this.state = 214; + this.state = 216; this.typeAliasDecl(); } break; @@ -604,32 +605,32 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ResourceImportDeclContext(this.context, this.state); this.enterRule(localContext, 10, QuixosCapabilityParser.RULE_resourceImportDecl); try { - this.state = 227; + this.state = 229; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 4, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 217; - this.match(QuixosCapabilityParser.IMPORT); - this.state = 218; - this.match(QuixosCapabilityParser.INTERFACE); this.state = 219; - this.identifier(); + this.match(QuixosCapabilityParser.IMPORT); this.state = 220; + this.match(QuixosCapabilityParser.INTERFACE); + this.state = 221; + this.identifier(); + this.state = 222; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 222; - this.match(QuixosCapabilityParser.IMPORT); - this.state = 223; - this.match(QuixosCapabilityParser.PACKAGE); this.state = 224; - this.identifier(); + this.match(QuixosCapabilityParser.IMPORT); this.state = 225; + this.match(QuixosCapabilityParser.PACKAGE); + this.state = 226; + this.identifier(); + this.state = 227; this.match(QuixosCapabilityParser.SEMI); } break; @@ -654,17 +655,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 229; - this.match(QuixosCapabilityParser.EXTERNAL); - this.state = 230; - this.match(QuixosCapabilityParser.ATOM); this.state = 231; - this.identifier(); + this.match(QuixosCapabilityParser.EXTERNAL); this.state = 232; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.ATOM); this.state = 233; - this.stringLiteral(); + this.identifier(); this.state = 234; + this.match(QuixosCapabilityParser.ID); + this.state = 235; + this.stringLiteral(); + this.state = 236; this.match(QuixosCapabilityParser.SEMI); } } @@ -687,17 +688,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 236; - this.match(QuixosCapabilityParser.EXTERNAL); - this.state = 237; - this.match(QuixosCapabilityParser.INTERFACE); this.state = 238; - this.identifier(); + this.match(QuixosCapabilityParser.EXTERNAL); this.state = 239; - this.match(QuixosCapabilityParser.REVISION); + this.match(QuixosCapabilityParser.INTERFACE); this.state = 240; - this.stringLiteral(); + this.identifier(); this.state = 241; + this.match(QuixosCapabilityParser.REVISION); + this.state = 242; + this.stringLiteral(); + this.state = 243; this.match(QuixosCapabilityParser.SEMI); } } @@ -718,34 +719,34 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ResourcePreambleContext(this.context, this.state); this.enterRule(localContext, 16, QuixosCapabilityParser.RULE_resourcePreamble); try { - this.state = 247; + this.state = 249; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 5, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 243; + this.state = 245; this.resourceImportDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 244; + this.state = 246; this.externalAtomDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 245; + this.state = 247; this.externalInterfaceDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 246; + this.state = 248; this.typeAliasDecl(); } break; @@ -771,27 +772,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 249; - this.match(QuixosCapabilityParser.ATOM); - this.state = 250; - this.identifier(); this.state = 251; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.ATOM); this.state = 252; + this.identifier(); + this.state = 253; + this.match(QuixosCapabilityParser.ID); + this.state = 254; this.stringLiteral(); - this.state = 255; + this.state = 257; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 85) { { - this.state = 253; + this.state = 255; this.match(QuixosCapabilityParser.DOC); - this.state = 254; + this.state = 256; this.stringLiteral(); } } - this.state = 257; + this.state = 259; this.match(QuixosCapabilityParser.SEMI); } } @@ -815,87 +816,87 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 262; + this.state = 264; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (((((_la - 35)) & ~0x1F) === 0 && ((1 << (_la - 35)) & 193) !== 0)) { { { - this.state = 259; + this.state = 261; this.resourcePreamble(); } } - this.state = 264; + this.state = 266; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 265; + this.state = 267; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 266; - this.identifier(); this.state = 268; + this.identifier(); + this.state = 270; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 267; + this.state = 269; this.typeParameters(); } } - this.state = 270; - this.match(QuixosCapabilityParser.ID); - this.state = 271; - this.stringLiteral(); this.state = 272; - this.match(QuixosCapabilityParser.REVISION); + this.match(QuixosCapabilityParser.ID); this.state = 273; this.stringLiteral(); - this.state = 283; + this.state = 274; + this.match(QuixosCapabilityParser.REVISION); + this.state = 275; + this.stringLiteral(); + this.state = 285; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 89) { { - this.state = 274; + this.state = 276; this.match(QuixosCapabilityParser.REQUIRES); - this.state = 275; + this.state = 277; this.interfaceType(); - this.state = 280; + this.state = 282; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 276; + this.state = 278; this.match(QuixosCapabilityParser.COMMA); - this.state = 277; + this.state = 279; this.interfaceType(); } } - this.state = 282; + this.state = 284; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 285; + this.state = 287; this.match(QuixosCapabilityParser.LBRACE); - this.state = 289; + this.state = 291; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 2 || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33783809) !== 0)) { { { - this.state = 286; + this.state = 288; this.interfaceMember(); } } - this.state = 291; + this.state = 293; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 292; + this.state = 294; this.match(QuixosCapabilityParser.RBRACE); } } @@ -919,27 +920,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 294; + this.state = 296; this.match(QuixosCapabilityParser.LT); - this.state = 295; + this.state = 297; this.typeParameter(); - this.state = 300; + this.state = 302; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 296; + this.state = 298; this.match(QuixosCapabilityParser.COMMA); - this.state = 297; + this.state = 299; this.typeParameter(); } } - this.state = 302; + this.state = 304; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 303; + this.state = 305; this.match(QuixosCapabilityParser.GT); } } @@ -961,24 +962,24 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 24, QuixosCapabilityParser.RULE_typeParameter); let _la: number; try { - this.state = 324; + this.state = 326; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.VALUE: this.enterOuterAlt(localContext, 1); { - this.state = 305; + this.state = 307; this.match(QuixosCapabilityParser.VALUE); - this.state = 306; + this.state = 308; this.identifier(); - this.state = 309; + this.state = 311; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 133) { { - this.state = 307; + this.state = 309; this.match(QuixosCapabilityParser.COLON); - this.state = 308; + this.state = 310; this.match(QuixosCapabilityParser.STORABLE); } } @@ -988,32 +989,32 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 2); { - this.state = 311; + this.state = 313; this.match(QuixosCapabilityParser.OBJECT); - this.state = 312; + this.state = 314; this.identifier(); - this.state = 322; + this.state = 324; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 38) { { - this.state = 313; + this.state = 315; this.match(QuixosCapabilityParser.IMPLEMENTS); - this.state = 314; + this.state = 316; this.interfaceType(); - this.state = 319; + this.state = 321; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 145) { { { - this.state = 315; + this.state = 317; this.match(QuixosCapabilityParser.AMP); - this.state = 316; + this.state = 318; this.interfaceType(); } } - this.state = 321; + this.state = 323; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } @@ -1046,14 +1047,14 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 326; - this.identifier(); this.state = 328; + this.identifier(); + this.state = 330; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 327; + this.state = 329; this.typeArguments(); } } @@ -1080,27 +1081,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 330; + this.state = 332; this.match(QuixosCapabilityParser.LT); - this.state = 331; + this.state = 333; this.typeArgument(); - this.state = 336; + this.state = 338; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 332; + this.state = 334; this.match(QuixosCapabilityParser.COMMA); - this.state = 333; + this.state = 335; this.typeArgument(); } } - this.state = 338; + this.state = 340; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 339; + this.state = 341; this.match(QuixosCapabilityParser.GT); } } @@ -1121,33 +1122,33 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new TypeArgumentContext(this.context, this.state); this.enterRule(localContext, 30, QuixosCapabilityParser.RULE_typeArgument); try { - this.state = 348; + this.state = 350; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 1); { - this.state = 341; + this.state = 343; this.match(QuixosCapabilityParser.ATOM); - this.state = 342; + this.state = 344; this.identifier(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 2); { - this.state = 343; + this.state = 345; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 344; + this.state = 346; this.interfaceType(); } break; case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 345; + this.state = 347; this.match(QuixosCapabilityParser.OBJECT); - this.state = 346; + this.state = 348; this.identifier(); } break; @@ -1182,6 +1183,7 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.QUERYABLE: case QuixosCapabilityParser.RPC: case QuixosCapabilityParser.REF: + case QuixosCapabilityParser.FRAGMENT: case QuixosCapabilityParser.INTERFACES: case QuixosCapabilityParser.SOURCE: case QuixosCapabilityParser.START: @@ -1206,7 +1208,7 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 4); { - this.state = 347; + this.state = 349; this.valueType(); } break; @@ -1234,25 +1236,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 350; + this.state = 352; this.match(QuixosCapabilityParser.TYPE); - this.state = 351; - this.identifier(); this.state = 353; + this.identifier(); + this.state = 355; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 352; + this.state = 354; this.typeParameters(); } } - this.state = 355; - this.match(QuixosCapabilityParser.EQUAL); - this.state = 356; - this.valueType(); this.state = 357; + this.match(QuixosCapabilityParser.EQUAL); + this.state = 358; + this.valueType(); + this.state = 359; this.match(QuixosCapabilityParser.SEMI); } } @@ -1273,34 +1275,34 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new InterfaceMemberContext(this.context, this.state); this.enterRule(localContext, 34, QuixosCapabilityParser.RULE_interfaceMember); try { - this.state = 363; + this.state = 365; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 21, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 359; + this.state = 361; this.valueMember(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 360; + this.state = 362; this.relationshipMember(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 361; + this.state = 363; this.operationMember(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 362; + this.state = 364; this.moduleMember(); } break; @@ -1326,31 +1328,31 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 365; - this.match(QuixosCapabilityParser.MODULE); - this.state = 366; - this.identifier(); this.state = 367; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.MODULE); this.state = 368; - this.stringLiteral(); + this.identifier(); this.state = 369; - this.match(QuixosCapabilityParser.CONTRACT); + this.match(QuixosCapabilityParser.ID); this.state = 370; this.stringLiteral(); - this.state = 373; + this.state = 371; + this.match(QuixosCapabilityParser.CONTRACT); + this.state = 372; + this.stringLiteral(); + this.state = 375; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 5) { { - this.state = 371; + this.state = 373; this.match(QuixosCapabilityParser.SUBJECT); - this.state = 372; + this.state = 374; this.targetConstraint(); } } - this.state = 375; + this.state = 377; this.match(QuixosCapabilityParser.SEMI); } } @@ -1374,53 +1376,53 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 378; + this.state = 380; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 57) { { - this.state = 377; + this.state = 379; this.match(QuixosCapabilityParser.STATIC); } } - this.state = 380; - this.match(QuixosCapabilityParser.OPERATION); - this.state = 381; - this.identifier(); this.state = 382; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.OPERATION); this.state = 383; - this.stringLiteral(); + this.identifier(); this.state = 384; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.ID); this.state = 385; - this.valueType(); + this.stringLiteral(); this.state = 386; - this.match(QuixosCapabilityParser.ARROW); + this.match(QuixosCapabilityParser.COLON); this.state = 387; this.valueType(); this.state = 388; - this.match(QuixosCapabilityParser.LBRACE); + this.match(QuixosCapabilityParser.ARROW); this.state = 389; - this.match(QuixosCapabilityParser.CALL); + this.valueType(); this.state = 390; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.LBRACE); this.state = 391; - this.stringLiteral(); + this.match(QuixosCapabilityParser.CALL); + this.state = 392; + this.match(QuixosCapabilityParser.ID); this.state = 393; + this.stringLiteral(); + this.state = 395; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 392; + this.state = 394; this.executionClause(); } } - this.state = 395; + this.state = 397; this.match(QuixosCapabilityParser.SEMI); - this.state = 396; + this.state = 398; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1444,45 +1446,45 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 399; + this.state = 401; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 32) { { - this.state = 398; + this.state = 400; this.queryReadContract(); } } - this.state = 401; - this.match(QuixosCapabilityParser.VALUE); - this.state = 402; - this.identifier(); this.state = 403; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.VALUE); this.state = 404; - this.stringLiteral(); + this.identifier(); this.state = 405; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.ID); this.state = 406; - this.valueType(); + this.stringLiteral(); this.state = 407; + this.match(QuixosCapabilityParser.COLON); + this.state = 408; + this.valueType(); + this.state = 409; this.match(QuixosCapabilityParser.LBRACE); - this.state = 411; + this.state = 413; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 1 || ((((_la - 91)) & ~0x1F) === 0 && ((1 << (_la - 91)) & 7) !== 0)) { { { - this.state = 408; + this.state = 410; this.valueMemberOperation(); } } - this.state = 413; + this.state = 415; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 414; + this.state = 416; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1504,96 +1506,96 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 42, QuixosCapabilityParser.RULE_valueMemberOperation); let _la: number; try { - this.state = 449; + this.state = 451; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.GET: this.enterOuterAlt(localContext, 1); { - this.state = 416; - this.match(QuixosCapabilityParser.GET); - this.state = 417; - this.match(QuixosCapabilityParser.ID); this.state = 418; - this.stringLiteral(); + this.match(QuixosCapabilityParser.GET); + this.state = 419; + this.match(QuixosCapabilityParser.ID); this.state = 420; + this.stringLiteral(); + this.state = 422; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 419; + this.state = 421; this.executionClause(); } } - this.state = 422; + this.state = 424; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.SET: this.enterOuterAlt(localContext, 2); { - this.state = 424; - this.match(QuixosCapabilityParser.SET); - this.state = 425; - this.match(QuixosCapabilityParser.ID); this.state = 426; - this.stringLiteral(); + this.match(QuixosCapabilityParser.SET); + this.state = 427; + this.match(QuixosCapabilityParser.ID); this.state = 428; + this.stringLiteral(); + this.state = 430; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 427; + this.state = 429; this.executionClause(); } } - this.state = 430; + this.state = 432; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.EDIT: this.enterOuterAlt(localContext, 3); { - this.state = 432; - this.match(QuixosCapabilityParser.EDIT); - this.state = 433; - this.match(QuixosCapabilityParser.ID); this.state = 434; - this.stringLiteral(); + this.match(QuixosCapabilityParser.EDIT); + this.state = 435; + this.match(QuixosCapabilityParser.ID); this.state = 436; + this.stringLiteral(); + this.state = 438; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 435; + this.state = 437; this.executionClause(); } } - this.state = 438; + this.state = 440; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 4); { - this.state = 440; - this.match(QuixosCapabilityParser.WATCH); - this.state = 441; - this.match(QuixosCapabilityParser.START); this.state = 442; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.WATCH); this.state = 443; - this.stringLiteral(); + this.match(QuixosCapabilityParser.START); this.state = 444; - this.match(QuixosCapabilityParser.STOP); - this.state = 445; this.match(QuixosCapabilityParser.ID); - this.state = 446; + this.state = 445; this.stringLiteral(); + this.state = 446; + this.match(QuixosCapabilityParser.STOP); this.state = 447; + this.match(QuixosCapabilityParser.ID); + this.state = 448; + this.stringLiteral(); + this.state = 449; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1621,69 +1623,69 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 452; + this.state = 454; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 32) { { - this.state = 451; + this.state = 453; this.queryReadContract(); } } - this.state = 454; - this.match(QuixosCapabilityParser.RELATION); - this.state = 455; - this.identifier(); this.state = 456; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.RELATION); this.state = 457; - this.stringLiteral(); + this.identifier(); this.state = 458; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.ID); this.state = 459; - this.cardinality(); + this.stringLiteral(); this.state = 460; - this.targetConstraint(); + this.match(QuixosCapabilityParser.COLON); + this.state = 461; + this.cardinality(); this.state = 462; + this.targetConstraint(); + this.state = 464; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 112) { { - this.state = 461; + this.state = 463; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 466; + this.state = 468; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 82) { { - this.state = 464; + this.state = 466; this.match(QuixosCapabilityParser.KEYED); - this.state = 465; + this.state = 467; this.stringLiteral(); } } - this.state = 468; + this.state = 470; this.match(QuixosCapabilityParser.LBRACE); - this.state = 472; + this.state = 474; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (((((_la - 93)) & ~0x1F) === 0 && ((1 << (_la - 93)) & 225) !== 0)) { { { - this.state = 469; + this.state = 471; this.relationshipOperation(); } } - this.state = 474; + this.state = 476; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 475; + this.state = 477; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1707,14 +1709,14 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 477; - this.match(QuixosCapabilityParser.QUERYABLE); this.state = 479; + this.match(QuixosCapabilityParser.QUERYABLE); + this.state = 481; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 15 || _la === 33) { { - this.state = 478; + this.state = 480; _la = this.tokenStream.LA(1); if(!(_la === 15 || _la === 33)) { this.errorHandler.recoverInline(this); @@ -1746,96 +1748,96 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 48, QuixosCapabilityParser.RULE_relationshipOperation); let _la: number; try { - this.state = 514; + this.state = 516; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.RESOLVE: this.enterOuterAlt(localContext, 1); { - this.state = 481; - this.match(QuixosCapabilityParser.RESOLVE); - this.state = 482; - this.match(QuixosCapabilityParser.ID); this.state = 483; - this.stringLiteral(); + this.match(QuixosCapabilityParser.RESOLVE); + this.state = 484; + this.match(QuixosCapabilityParser.ID); this.state = 485; + this.stringLiteral(); + this.state = 487; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 484; + this.state = 486; this.executionClause(); } } - this.state = 487; + this.state = 489; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONNECT: this.enterOuterAlt(localContext, 2); { - this.state = 489; - this.match(QuixosCapabilityParser.CONNECT); - this.state = 490; - this.match(QuixosCapabilityParser.ID); this.state = 491; - this.stringLiteral(); + this.match(QuixosCapabilityParser.CONNECT); + this.state = 492; + this.match(QuixosCapabilityParser.ID); this.state = 493; + this.stringLiteral(); + this.state = 495; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 492; + this.state = 494; this.executionClause(); } } - this.state = 495; + this.state = 497; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.DISCONNECT: this.enterOuterAlt(localContext, 3); { - this.state = 497; - this.match(QuixosCapabilityParser.DISCONNECT); - this.state = 498; - this.match(QuixosCapabilityParser.ID); this.state = 499; - this.stringLiteral(); + this.match(QuixosCapabilityParser.DISCONNECT); + this.state = 500; + this.match(QuixosCapabilityParser.ID); this.state = 501; + this.stringLiteral(); + this.state = 503; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 500; + this.state = 502; this.executionClause(); } } - this.state = 503; + this.state = 505; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 4); { - this.state = 505; - this.match(QuixosCapabilityParser.WATCH); - this.state = 506; - this.match(QuixosCapabilityParser.START); this.state = 507; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.WATCH); this.state = 508; - this.stringLiteral(); + this.match(QuixosCapabilityParser.START); this.state = 509; - this.match(QuixosCapabilityParser.STOP); - this.state = 510; this.match(QuixosCapabilityParser.ID); - this.state = 511; + this.state = 510; this.stringLiteral(); + this.state = 511; + this.match(QuixosCapabilityParser.STOP); this.state = 512; + this.match(QuixosCapabilityParser.ID); + this.state = 513; + this.stringLiteral(); + this.state = 514; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1861,31 +1863,31 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 50, QuixosCapabilityParser.RULE_targetConstraint); let _la: number; try { - this.state = 525; + this.state = 527; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 1); { - this.state = 516; + this.state = 518; this.match(QuixosCapabilityParser.ATOM); - this.state = 517; + this.state = 519; this.identifier(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 2); { - this.state = 518; + this.state = 520; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 519; - this.identifier(); this.state = 521; + this.identifier(); + this.state = 523; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 520; + this.state = 522; this.typeArguments(); } } @@ -1895,9 +1897,9 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 523; + this.state = 525; this.match(QuixosCapabilityParser.OBJECT); - this.state = 524; + this.state = 526; this.identifier(); } break; @@ -1925,61 +1927,61 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 530; + this.state = 532; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (((((_la - 35)) & ~0x1F) === 0 && ((1 << (_la - 35)) & 193) !== 0)) { { { - this.state = 527; + this.state = 529; this.resourcePreamble(); } } - this.state = 532; + this.state = 534; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 533; - this.match(QuixosCapabilityParser.PACKAGE); - this.state = 534; - this.identifier(); this.state = 535; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.PACKAGE); this.state = 536; - this.stringLiteral(); + this.identifier(); this.state = 537; - this.match(QuixosCapabilityParser.REVISION); + this.match(QuixosCapabilityParser.ID); this.state = 538; this.stringLiteral(); - this.state = 541; + this.state = 539; + this.match(QuixosCapabilityParser.REVISION); + this.state = 540; + this.stringLiteral(); + this.state = 543; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 78) { { - this.state = 539; + this.state = 541; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); - this.state = 540; + this.state = 542; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 543; + this.state = 545; this.match(QuixosCapabilityParser.LBRACE); - this.state = 547; + this.state = 549; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 2 || _la === 22 || ((((_la - 49)) & ~0x1F) === 0 && ((1 << (_la - 49)) & 7) !== 0)) { { { - this.state = 544; + this.state = 546; this.packageExport(); } } - this.state = 549; + this.state = 551; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 550; + this.state = 552; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2000,48 +2002,48 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new PackageExportContext(this.context, this.state); this.enterRule(localContext, 54, QuixosCapabilityParser.RULE_packageExport); try { - this.state = 558; + this.state = 560; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 45, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 552; + this.state = 554; this.packageOperationExport(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 553; + this.state = 555; this.packageFunctionExport(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 554; + this.state = 556; this.packageConstructorExport(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 555; + this.state = 557; this.packageQuery(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 556; + this.state = 558; this.packageQuerySpecialization(); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 557; + this.state = 559; this.moduleExport(); } break; @@ -2066,23 +2068,23 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 560; - this.match(QuixosCapabilityParser.MODULE); - this.state = 561; - this.identifier(); this.state = 562; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.MODULE); this.state = 563; - this.stringLiteral(); - this.state = 564; - this.match(QuixosCapabilityParser.IMPLEMENTS); - this.state = 565; - this.interfaceType(); - this.state = 566; - this.match(QuixosCapabilityParser.DOT); - this.state = 567; this.identifier(); + this.state = 564; + this.match(QuixosCapabilityParser.ID); + this.state = 565; + this.stringLiteral(); + this.state = 566; + this.match(QuixosCapabilityParser.IMPLEMENTS); + this.state = 567; + this.interfaceType(); this.state = 568; + this.match(QuixosCapabilityParser.DOT); + this.state = 569; + this.identifier(); + this.state = 570; this.match(QuixosCapabilityParser.SEMI); } } @@ -2105,27 +2107,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 570; - this.match(QuixosCapabilityParser.PRESENTATION); - this.state = 571; - this.identifier(); this.state = 572; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.PRESENTATION); this.state = 573; - this.stringLiteral(); - this.state = 574; - this.match(QuixosCapabilityParser.FOR); - this.state = 575; - this.interfaceType(); - this.state = 576; - this.match(QuixosCapabilityParser.USING); - this.state = 577; this.identifier(); + this.state = 574; + this.match(QuixosCapabilityParser.ID); + this.state = 575; + this.stringLiteral(); + this.state = 576; + this.match(QuixosCapabilityParser.FOR); + this.state = 577; + this.interfaceType(); this.state = 578; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.USING); this.state = 579; this.identifier(); this.state = 580; + this.match(QuixosCapabilityParser.DOT); + this.state = 581; + this.identifier(); + this.state = 582; this.match(QuixosCapabilityParser.SEMI); } } @@ -2149,64 +2151,138 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 582; + this.state = 584; this.match(QuixosCapabilityParser.QUERY); - this.state = 583; + this.state = 586; + this.errorHandler.sync(this); + switch (this.interpreter.adaptivePredict(this.tokenStream, 46, this.context) ) { + case 1: + { + this.state = 585; + this.match(QuixosCapabilityParser.FRAGMENT); + } + break; + } + this.state = 588; this.identifier(); - this.state = 585; + this.state = 590; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 584; + this.state = 589; this.typeParameters(); } } - this.state = 587; + this.state = 592; this.match(QuixosCapabilityParser.ID); - this.state = 588; + this.state = 593; this.stringLiteral(); - this.state = 589; + this.state = 594; this.match(QuixosCapabilityParser.ROOT); - this.state = 591; + this.state = 596; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 9) { { - this.state = 590; + this.state = 595; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 593; - this.interfaceType(); - this.state = 594; - this.match(QuixosCapabilityParser.DOCUMENT); - this.state = 595; - this.stringLiteral(); - this.state = 596; - this.match(QuixosCapabilityParser.OPERATION); - this.state = 597; - this.stringLiteral(); this.state = 598; - this.match(QuixosCapabilityParser.LBRACE); - this.state = 602; + this.interfaceType(); + this.state = 599; + this.match(QuixosCapabilityParser.DOCUMENT); + this.state = 600; + this.stringLiteral(); + this.state = 629; this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4160946176) !== 0) || _la === 93) { + switch (this.tokenStream.LA(1)) { + case QuixosCapabilityParser.OPERATION: { - { - this.state = 599; - this.queryClause(); - } - } - this.state = 604; + this.state = 601; + this.match(QuixosCapabilityParser.OPERATION); + this.state = 602; + this.stringLiteral(); + this.state = 603; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 607; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4160946176) !== 0) || _la === 93) { + { + { + this.state = 604; + this.queryClause(); + } + } + this.state = 609; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + this.state = 610; + this.match(QuixosCapabilityParser.RBRACE); + } + break; + case QuixosCapabilityParser.FRAGMENT: + { + this.state = 612; + this.match(QuixosCapabilityParser.FRAGMENT); + this.state = 613; + this.stringLiteral(); + this.state = 616; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 49) { + { + this.state = 614; + this.match(QuixosCapabilityParser.OPERATION); + this.state = 615; + this.stringLiteral(); + } + } + + this.state = 627; + this.errorHandler.sync(this); + switch (this.tokenStream.LA(1)) { + case QuixosCapabilityParser.LBRACE: + { + this.state = 618; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 622; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4160946176) !== 0) || _la === 93) { + { + { + this.state = 619; + this.queryClause(); + } + } + this.state = 624; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + this.state = 625; + this.match(QuixosCapabilityParser.RBRACE); + } + break; + case QuixosCapabilityParser.SEMI: + { + this.state = 626; + this.match(QuixosCapabilityParser.SEMI); + } + break; + default: + throw new antlr.NoViableAltException(this); + } + } + break; + default: + throw new antlr.NoViableAltException(this); } - this.state = 605; - this.match(QuixosCapabilityParser.RBRACE); } } catch (re) { @@ -2228,21 +2304,21 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 607; + this.state = 631; this.match(QuixosCapabilityParser.QUERY); - this.state = 608; + this.state = 632; this.identifier(); - this.state = 609; + this.state = 633; this.match(QuixosCapabilityParser.ID); - this.state = 610; + this.state = 634; this.stringLiteral(); - this.state = 611; + this.state = 635; this.match(QuixosCapabilityParser.SPECIALIZE); - this.state = 612; + this.state = 636; this.identifier(); - this.state = 613; + this.state = 637; this.typeArguments(); - this.state = 614; + this.state = 638; this.match(QuixosCapabilityParser.SEMI); } } @@ -2264,123 +2340,193 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 64, QuixosCapabilityParser.RULE_queryClause); let _la: number; try { - this.state = 656; + this.state = 697; this.errorHandler.sync(this); - switch (this.tokenStream.LA(1)) { - case QuixosCapabilityParser.REPLICA: + switch (this.interpreter.adaptivePredict(this.tokenStream, 57, this.context) ) { + case 1: this.enterOuterAlt(localContext, 1); { - this.state = 616; + this.state = 640; this.match(QuixosCapabilityParser.REPLICA); - this.state = 617; + this.state = 641; this.match(QuixosCapabilityParser.SEMI); } break; - case QuixosCapabilityParser.LOCAL: + case 2: this.enterOuterAlt(localContext, 2); { - this.state = 618; + this.state = 642; this.match(QuixosCapabilityParser.LOCAL); - this.state = 619; + this.state = 643; this.match(QuixosCapabilityParser.FROM); - this.state = 620; + this.state = 644; this.identifier(); - this.state = 621; + this.state = 645; this.match(QuixosCapabilityParser.SEMI); } break; - case QuixosCapabilityParser.FRAGMENTS: + case 3: this.enterOuterAlt(localContext, 3); { - this.state = 623; + this.state = 647; this.match(QuixosCapabilityParser.FRAGMENTS); - this.state = 624; + this.state = 648; this.stringLiteral(); - this.state = 625; + this.state = 649; this.match(QuixosCapabilityParser.SEMI); } break; - case QuixosCapabilityParser.VIEW: + case 4: this.enterOuterAlt(localContext, 4); { - this.state = 627; + this.state = 651; + this.match(QuixosCapabilityParser.FRAGMENTS); + this.state = 652; + this.identifier(); + this.state = 653; + this.match(QuixosCapabilityParser.DOT); + this.state = 654; + this.identifier(); + this.state = 664; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 64) { + { + this.state = 655; + this.match(QuixosCapabilityParser.WITH); + this.state = 656; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 660; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { + { + { + this.state = 657; + this.fragmentVariable(); + } + } + this.state = 662; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + this.state = 663; + this.match(QuixosCapabilityParser.RBRACE); + } + } + + this.state = 666; + this.match(QuixosCapabilityParser.SEMI); + } + break; + case 5: + this.enterOuterAlt(localContext, 5); + { + this.state = 668; this.match(QuixosCapabilityParser.VIEW); - this.state = 629; + this.state = 670; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 36) { { - this.state = 628; + this.state = 669; this.match(QuixosCapabilityParser.OBJECT); } } - this.state = 631; + this.state = 672; this.identifier(); - this.state = 632; + this.state = 673; this.match(QuixosCapabilityParser.AS); - this.state = 633; + this.state = 674; this.interfaceType(); - this.state = 634; + this.state = 675; this.match(QuixosCapabilityParser.SEMI); } break; - case QuixosCapabilityParser.MAX: - this.enterOuterAlt(localContext, 5); - { - this.state = 636; - this.match(QuixosCapabilityParser.MAX); - this.state = 637; - this.identifier(); - this.state = 638; - this.match(QuixosCapabilityParser.INTEGER); - this.state = 639; - this.match(QuixosCapabilityParser.SEMI); - } - break; - case QuixosCapabilityParser.ALLOW: + case 6: this.enterOuterAlt(localContext, 6); { - this.state = 641; - this.match(QuixosCapabilityParser.ALLOW); - this.state = 642; - this.interfaceType(); - this.state = 643; - this.match(QuixosCapabilityParser.DOT); - this.state = 644; + this.state = 677; + this.match(QuixosCapabilityParser.MAX); + this.state = 678; this.identifier(); - this.state = 645; - this.identifier(); - this.state = 646; - this.stringLiteral(); - this.state = 647; + this.state = 679; + this.match(QuixosCapabilityParser.INTEGER); + this.state = 680; this.match(QuixosCapabilityParser.SEMI); } break; - case QuixosCapabilityParser.WATCH: + case 7: this.enterOuterAlt(localContext, 7); { - this.state = 649; - this.match(QuixosCapabilityParser.WATCH); - this.state = 650; + this.state = 682; + this.match(QuixosCapabilityParser.ALLOW); + this.state = 683; + this.interfaceType(); + this.state = 684; + this.match(QuixosCapabilityParser.DOT); + this.state = 685; + this.identifier(); + this.state = 686; + this.identifier(); + this.state = 687; + this.stringLiteral(); + this.state = 688; this.match(QuixosCapabilityParser.SEMI); } break; - case QuixosCapabilityParser.POLL: + case 8: this.enterOuterAlt(localContext, 8); { - this.state = 651; - this.match(QuixosCapabilityParser.POLL); - this.state = 652; - this.match(QuixosCapabilityParser.INTEGER); - this.state = 653; - this.stringLiteral(); - this.state = 654; + this.state = 690; + this.match(QuixosCapabilityParser.WATCH); + this.state = 691; this.match(QuixosCapabilityParser.SEMI); } break; - default: - throw new antlr.NoViableAltException(this); + case 9: + this.enterOuterAlt(localContext, 9); + { + this.state = 692; + this.match(QuixosCapabilityParser.POLL); + this.state = 693; + this.match(QuixosCapabilityParser.INTEGER); + this.state = 694; + this.stringLiteral(); + this.state = 695; + this.match(QuixosCapabilityParser.SEMI); + } + break; + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public fragmentVariable(): FragmentVariableContext { + let localContext = new FragmentVariableContext(this.context, this.state); + this.enterRule(localContext, 66, QuixosCapabilityParser.RULE_fragmentVariable); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 699; + this.identifier(); + this.state = 700; + this.match(QuixosCapabilityParser.TO); + this.state = 701; + this.identifier(); + this.state = 702; + this.match(QuixosCapabilityParser.SEMI); } } catch (re) { @@ -2398,86 +2544,86 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageOperationExport(): PackageOperationExportContext { let localContext = new PackageOperationExportContext(this.context, this.state); - this.enterRule(localContext, 66, QuixosCapabilityParser.RULE_packageOperationExport); + this.enterRule(localContext, 68, QuixosCapabilityParser.RULE_packageOperationExport); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 658; + this.state = 704; this.match(QuixosCapabilityParser.OPERATION); - this.state = 659; + this.state = 705; this.identifier(); - this.state = 661; + this.state = 707; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 660; + this.state = 706; this.typeParameters(); } } - this.state = 663; + this.state = 709; this.match(QuixosCapabilityParser.ID); - this.state = 664; + this.state = 710; this.stringLiteral(); - this.state = 665; + this.state = 711; this.match(QuixosCapabilityParser.COLON); - this.state = 666; + this.state = 712; this.valueType(); - this.state = 667; + this.state = 713; this.match(QuixosCapabilityParser.ARROW); - this.state = 668; + this.state = 714; this.valueType(); - this.state = 669; + this.state = 715; this.match(QuixosCapabilityParser.MODE); - this.state = 670; + this.state = 716; this.operationMode(); - this.state = 672; + this.state = 718; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 671; + this.state = 717; this.executionClause(); } } - this.state = 675; + this.state = 721; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 87) { { - this.state = 674; + this.state = 720; this.eventClause(); } } - this.state = 677; + this.state = 723; this.match(QuixosCapabilityParser.RECEIVER); - this.state = 678; + this.state = 724; this.receiverRequirement(); - this.state = 680; + this.state = 726; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 89) { { - this.state = 679; + this.state = 725; this.dependencyBlock(); } } - this.state = 683; + this.state = 729; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 66) { { - this.state = 682; + this.state = 728; this.acceptanceClause(); } } - this.state = 685; + this.state = 731; this.match(QuixosCapabilityParser.SEMI); } } @@ -2496,68 +2642,68 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageFunctionExport(): PackageFunctionExportContext { let localContext = new PackageFunctionExportContext(this.context, this.state); - this.enterRule(localContext, 68, QuixosCapabilityParser.RULE_packageFunctionExport); + this.enterRule(localContext, 70, QuixosCapabilityParser.RULE_packageFunctionExport); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 687; + this.state = 733; this.match(QuixosCapabilityParser.FUNCTION); - this.state = 688; + this.state = 734; this.identifier(); - this.state = 690; + this.state = 736; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 689; + this.state = 735; this.typeParameters(); } } - this.state = 692; + this.state = 738; this.match(QuixosCapabilityParser.ID); - this.state = 693; + this.state = 739; this.stringLiteral(); - this.state = 694; + this.state = 740; this.match(QuixosCapabilityParser.COLON); - this.state = 695; + this.state = 741; this.valueType(); - this.state = 696; + this.state = 742; this.match(QuixosCapabilityParser.ARROW); - this.state = 697; + this.state = 743; this.valueType(); - this.state = 699; + this.state = 745; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 698; + this.state = 744; this.executionClause(); } } - this.state = 702; + this.state = 748; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 89) { { - this.state = 701; + this.state = 747; this.dependencyBlock(); } } - this.state = 705; + this.state = 751; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 66) { { - this.state = 704; + this.state = 750; this.acceptanceClause(); } } - this.state = 707; + this.state = 753; this.match(QuixosCapabilityParser.SEMI); } } @@ -2576,15 +2722,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public acceptanceClause(): AcceptanceClauseContext { let localContext = new AcceptanceClauseContext(this.context, this.state); - this.enterRule(localContext, 70, QuixosCapabilityParser.RULE_acceptanceClause); + this.enterRule(localContext, 72, QuixosCapabilityParser.RULE_acceptanceClause); try { this.enterOuterAlt(localContext, 1); { - this.state = 709; + this.state = 755; this.match(QuixosCapabilityParser.ACCEPT); - this.state = 710; + this.state = 756; this.match(QuixosCapabilityParser.USING); - this.state = 711; + this.state = 757; this.identifier(); } } @@ -2603,27 +2749,27 @@ export class QuixosCapabilityParser extends antlr.Parser { } public executionClause(): ExecutionClauseContext { let localContext = new ExecutionClauseContext(this.context, this.state); - this.enterRule(localContext, 72, QuixosCapabilityParser.RULE_executionClause); + this.enterRule(localContext, 74, QuixosCapabilityParser.RULE_executionClause); let _la: number; try { - this.state = 722; + this.state = 768; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 60, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 67, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 713; + this.state = 759; this.match(QuixosCapabilityParser.EXECUTION); - this.state = 714; + this.state = 760; this.match(QuixosCapabilityParser.REMOTE); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 715; + this.state = 761; this.match(QuixosCapabilityParser.EXECUTION); - this.state = 716; + this.state = 762; _la = this.tokenStream.LA(1); if(!(_la === 11 || _la === 12)) { this.errorHandler.recoverInline(this); @@ -2632,13 +2778,13 @@ export class QuixosCapabilityParser extends antlr.Parser { this.errorHandler.reportMatch(this); this.consume(); } - this.state = 717; + this.state = 763; this.match(QuixosCapabilityParser.TARGETS); - this.state = 718; + this.state = 764; this.match(QuixosCapabilityParser.LBRACK); - this.state = 719; + this.state = 765; this.identifierList(); - this.state = 720; + this.state = 766; this.match(QuixosCapabilityParser.RBRACK); } break; @@ -2659,34 +2805,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public selectedOperations(): SelectedOperationsContext { let localContext = new SelectedOperationsContext(this.context, this.state); - this.enterRule(localContext, 74, QuixosCapabilityParser.RULE_selectedOperations); + this.enterRule(localContext, 76, QuixosCapabilityParser.RULE_selectedOperations); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 724; + this.state = 770; this.match(QuixosCapabilityParser.USING); - this.state = 725; + this.state = 771; this.match(QuixosCapabilityParser.LBRACK); - this.state = 726; + this.state = 772; this.memberOperationRef(); - this.state = 731; + this.state = 777; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 727; + this.state = 773; this.match(QuixosCapabilityParser.COMMA); - this.state = 728; + this.state = 774; this.memberOperationRef(); } } - this.state = 733; + this.state = 779; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 734; + this.state = 780; this.match(QuixosCapabilityParser.RBRACK); } } @@ -2705,38 +2851,38 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageConstructorExport(): PackageConstructorExportContext { let localContext = new PackageConstructorExportContext(this.context, this.state); - this.enterRule(localContext, 76, QuixosCapabilityParser.RULE_packageConstructorExport); + this.enterRule(localContext, 78, QuixosCapabilityParser.RULE_packageConstructorExport); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 736; + this.state = 782; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 737; + this.state = 783; this.identifier(); - this.state = 738; + this.state = 784; this.match(QuixosCapabilityParser.ID); - this.state = 739; + this.state = 785; this.stringLiteral(); - this.state = 740; + this.state = 786; this.match(QuixosCapabilityParser.CONSTRUCTS); - this.state = 741; + this.state = 787; this.identifier(); - this.state = 742; + this.state = 788; this.match(QuixosCapabilityParser.COLON); - this.state = 743; + this.state = 789; this.valueType(); - this.state = 745; + this.state = 791; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 89) { { - this.state = 744; + this.state = 790; this.dependencyBlock(); } } - this.state = 747; + this.state = 793; this.match(QuixosCapabilityParser.SEMI); } } @@ -2755,13 +2901,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public eventClause(): EventClauseContext { let localContext = new EventClauseContext(this.context, this.state); - this.enterRule(localContext, 78, QuixosCapabilityParser.RULE_eventClause); + this.enterRule(localContext, 80, QuixosCapabilityParser.RULE_eventClause); try { this.enterOuterAlt(localContext, 1); { - this.state = 749; + this.state = 795; this.match(QuixosCapabilityParser.EMITS); - this.state = 750; + this.state = 796; this.valueType(); } } @@ -2780,12 +2926,12 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationMode(): OperationModeContext { let localContext = new OperationModeContext(this.context, this.state); - this.enterRule(localContext, 80, QuixosCapabilityParser.RULE_operationMode); + this.enterRule(localContext, 82, QuixosCapabilityParser.RULE_operationMode); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 752; + this.state = 798; _la = this.tokenStream.LA(1); if(!(((((_la - 101)) & ~0x1F) === 0 && ((1 << (_la - 101)) & 31) !== 0))) { this.errorHandler.recoverInline(this); @@ -2811,71 +2957,71 @@ export class QuixosCapabilityParser extends antlr.Parser { } public receiverRequirement(): ReceiverRequirementContext { let localContext = new ReceiverRequirementContext(this.context, this.state); - this.enterRule(localContext, 82, QuixosCapabilityParser.RULE_receiverRequirement); + this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_receiverRequirement); let _la: number; try { - this.state = 772; + this.state = 818; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ANY: this.enterOuterAlt(localContext, 1); { - this.state = 754; + this.state = 800; this.match(QuixosCapabilityParser.ANY); } break; case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 2); { - this.state = 755; + this.state = 801; this.match(QuixosCapabilityParser.ATOM); - this.state = 756; + this.state = 802; this.identifier(); } break; case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 757; + this.state = 803; this.match(QuixosCapabilityParser.OBJECT); - this.state = 758; + this.state = 804; this.identifier(); } break; case QuixosCapabilityParser.INTERFACES: this.enterOuterAlt(localContext, 4); { - this.state = 759; + this.state = 805; this.match(QuixosCapabilityParser.INTERFACES); - this.state = 760; + this.state = 806; this.match(QuixosCapabilityParser.LBRACK); - this.state = 769; + this.state = 815; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8195) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { { - this.state = 761; + this.state = 807; this.interfaceType(); - this.state = 766; + this.state = 812; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 762; + this.state = 808; this.match(QuixosCapabilityParser.COMMA); - this.state = 763; + this.state = 809; this.interfaceType(); } } - this.state = 768; + this.state = 814; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 771; + this.state = 817; this.match(QuixosCapabilityParser.RBRACK); } break; @@ -2898,26 +3044,26 @@ export class QuixosCapabilityParser extends antlr.Parser { } public identifierList(): IdentifierListContext { let localContext = new IdentifierListContext(this.context, this.state); - this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_identifierList); + this.enterRule(localContext, 86, QuixosCapabilityParser.RULE_identifierList); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 774; + this.state = 820; this.identifier(); - this.state = 779; + this.state = 825; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 775; + this.state = 821; this.match(QuixosCapabilityParser.COMMA); - this.state = 776; + this.state = 822; this.identifier(); } } - this.state = 781; + this.state = 827; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } @@ -2938,30 +3084,30 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBlock(): DependencyBlockContext { let localContext = new DependencyBlockContext(this.context, this.state); - this.enterRule(localContext, 86, QuixosCapabilityParser.RULE_dependencyBlock); + this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_dependencyBlock); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 782; + this.state = 828; this.match(QuixosCapabilityParser.REQUIRES); - this.state = 783; + this.state = 829; this.match(QuixosCapabilityParser.LBRACE); - this.state = 787; + this.state = 833; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 12583040) !== 0) || ((((_la - 44)) & ~0x1F) === 0 && ((1 << (_la - 44)) & 393345) !== 0)) { { { - this.state = 784; + this.state = 830; this.dependencyPort(); } } - this.state = 789; + this.state = 835; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 790; + this.state = 836; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2980,133 +3126,17 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyPort(): DependencyPortContext { let localContext = new DependencyPortContext(this.context, this.state); - this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_dependencyPort); + this.enterRule(localContext, 90, QuixosCapabilityParser.RULE_dependencyPort); let _la: number; try { - this.state = 870; + this.state = 916; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REFLECTION: this.enterOuterAlt(localContext, 1); { - this.state = 792; - this.match(QuixosCapabilityParser.REFLECTION); - this.state = 793; - this.identifier(); - this.state = 794; - this.match(QuixosCapabilityParser.ID); - this.state = 795; - this.stringLiteral(); - this.state = 796; - this.match(QuixosCapabilityParser.LBRACK); - this.state = 797; - this.identifierList(); - this.state = 798; - this.match(QuixosCapabilityParser.RBRACK); - this.state = 799; - this.match(QuixosCapabilityParser.SEMI); - } - break; - case QuixosCapabilityParser.STATE: - this.enterOuterAlt(localContext, 2); - { - this.state = 801; - this.match(QuixosCapabilityParser.STATE); - this.state = 802; - this.identifier(); - this.state = 803; - this.match(QuixosCapabilityParser.ID); - this.state = 804; - this.stringLiteral(); - this.state = 805; - this.match(QuixosCapabilityParser.COLON); - this.state = 806; - this.valueType(); - this.state = 807; - this.primitiveList(); - this.state = 808; - this.match(QuixosCapabilityParser.SEMI); - } - break; - case QuixosCapabilityParser.EDGE: - this.enterOuterAlt(localContext, 3); - { - this.state = 810; - this.match(QuixosCapabilityParser.EDGE); - this.state = 811; - this.identifier(); - this.state = 812; - this.match(QuixosCapabilityParser.ID); - this.state = 813; - this.stringLiteral(); - this.state = 814; - this.match(QuixosCapabilityParser.COLON); - this.state = 815; - this.cardinality(); - this.state = 816; - this.targetConstraint(); - this.state = 817; - this.primitiveList(); - this.state = 818; - this.match(QuixosCapabilityParser.SEMI); - } - break; - case QuixosCapabilityParser.INTERFACE: - this.enterOuterAlt(localContext, 4); - { - this.state = 820; - this.match(QuixosCapabilityParser.INTERFACE); - this.state = 821; - this.identifier(); - this.state = 822; - this.match(QuixosCapabilityParser.ID); - this.state = 823; - this.stringLiteral(); - this.state = 824; - this.match(QuixosCapabilityParser.COLON); - this.state = 825; - this.identifier(); - this.state = 827; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 143) { - { - this.state = 826; - this.typeArguments(); - } - } - - this.state = 830; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 65) { - { - this.state = 829; - this.selectedOperations(); - } - } - - this.state = 834; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 18) { - { - this.state = 832; - this.match(QuixosCapabilityParser.FROM); - this.state = 833; - this.match(QuixosCapabilityParser.INPUT); - } - } - - this.state = 836; - this.match(QuixosCapabilityParser.SEMI); - } - break; - case QuixosCapabilityParser.CREATION: - this.enterOuterAlt(localContext, 5); - { this.state = 838; - this.match(QuixosCapabilityParser.CREATION); + this.match(QuixosCapabilityParser.REFLECTION); this.state = 839; this.identifier(); this.state = 840; @@ -3114,68 +3144,184 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 841; this.stringLiteral(); this.state = 842; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.LBRACK); this.state = 843; - this.identifier(); + this.identifierList(); this.state = 844; - this.match(QuixosCapabilityParser.INPUT); + this.match(QuixosCapabilityParser.RBRACK); this.state = 845; + this.match(QuixosCapabilityParser.SEMI); + } + break; + case QuixosCapabilityParser.STATE: + this.enterOuterAlt(localContext, 2); + { + this.state = 847; + this.match(QuixosCapabilityParser.STATE); + this.state = 848; + this.identifier(); + this.state = 849; + this.match(QuixosCapabilityParser.ID); + this.state = 850; + this.stringLiteral(); + this.state = 851; + this.match(QuixosCapabilityParser.COLON); + this.state = 852; this.valueType(); - this.state = 846; + this.state = 853; + this.primitiveList(); + this.state = 854; + this.match(QuixosCapabilityParser.SEMI); + } + break; + case QuixosCapabilityParser.EDGE: + this.enterOuterAlt(localContext, 3); + { + this.state = 856; + this.match(QuixosCapabilityParser.EDGE); + this.state = 857; + this.identifier(); + this.state = 858; + this.match(QuixosCapabilityParser.ID); + this.state = 859; + this.stringLiteral(); + this.state = 860; + this.match(QuixosCapabilityParser.COLON); + this.state = 861; + this.cardinality(); + this.state = 862; + this.targetConstraint(); + this.state = 863; + this.primitiveList(); + this.state = 864; + this.match(QuixosCapabilityParser.SEMI); + } + break; + case QuixosCapabilityParser.INTERFACE: + this.enterOuterAlt(localContext, 4); + { + this.state = 866; + this.match(QuixosCapabilityParser.INTERFACE); + this.state = 867; + this.identifier(); + this.state = 868; + this.match(QuixosCapabilityParser.ID); + this.state = 869; + this.stringLiteral(); + this.state = 870; + this.match(QuixosCapabilityParser.COLON); + this.state = 871; + this.identifier(); + this.state = 873; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 143) { + { + this.state = 872; + this.typeArguments(); + } + } + + this.state = 876; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 65) { + { + this.state = 875; + this.selectedOperations(); + } + } + + this.state = 880; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 18) { + { + this.state = 878; + this.match(QuixosCapabilityParser.FROM); + this.state = 879; + this.match(QuixosCapabilityParser.INPUT); + } + } + + this.state = 882; + this.match(QuixosCapabilityParser.SEMI); + } + break; + case QuixosCapabilityParser.CREATION: + this.enterOuterAlt(localContext, 5); + { + this.state = 884; + this.match(QuixosCapabilityParser.CREATION); + this.state = 885; + this.identifier(); + this.state = 886; + this.match(QuixosCapabilityParser.ID); + this.state = 887; + this.stringLiteral(); + this.state = 888; + this.match(QuixosCapabilityParser.COLON); + this.state = 889; + this.identifier(); + this.state = 890; + this.match(QuixosCapabilityParser.INPUT); + this.state = 891; + this.valueType(); + this.state = 892; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONSTRUCTOR: this.enterOuterAlt(localContext, 6); { - this.state = 848; + this.state = 894; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 849; + this.state = 895; this.identifier(); - this.state = 850; + this.state = 896; this.match(QuixosCapabilityParser.ID); - this.state = 851; + this.state = 897; this.stringLiteral(); - this.state = 852; + this.state = 898; this.match(QuixosCapabilityParser.COLON); - this.state = 853; + this.state = 899; this.identifier(); - this.state = 856; + this.state = 902; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 53) { { - this.state = 854; + this.state = 900; this.match(QuixosCapabilityParser.INPUT); - this.state = 855; + this.state = 901; this.valueType(); } } - this.state = 858; + this.state = 904; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.QUERY: this.enterOuterAlt(localContext, 7); { - this.state = 860; + this.state = 906; this.match(QuixosCapabilityParser.QUERY); - this.state = 861; + this.state = 907; this.identifier(); - this.state = 862; + this.state = 908; this.match(QuixosCapabilityParser.ID); - this.state = 863; + this.state = 909; this.stringLiteral(); - this.state = 864; + this.state = 910; this.match(QuixosCapabilityParser.COLON); - this.state = 865; + this.state = 911; this.identifier(); - this.state = 866; + this.state = 912; this.match(QuixosCapabilityParser.DOT); - this.state = 867; + this.state = 913; this.identifier(); - this.state = 868; + this.state = 914; this.match(QuixosCapabilityParser.SEMI); } break; @@ -3198,32 +3344,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public primitiveList(): PrimitiveListContext { let localContext = new PrimitiveListContext(this.context, this.state); - this.enterRule(localContext, 90, QuixosCapabilityParser.RULE_primitiveList); + this.enterRule(localContext, 92, QuixosCapabilityParser.RULE_primitiveList); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 872; + this.state = 918; this.match(QuixosCapabilityParser.LBRACK); - this.state = 873; + this.state = 919; this.primitive(); - this.state = 878; + this.state = 924; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 874; + this.state = 920; this.match(QuixosCapabilityParser.COMMA); - this.state = 875; + this.state = 921; this.primitive(); } } - this.state = 880; + this.state = 926; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 881; + this.state = 927; this.match(QuixosCapabilityParser.RBRACK); } } @@ -3242,12 +3388,12 @@ export class QuixosCapabilityParser extends antlr.Parser { } public primitive(): PrimitiveContext { let localContext = new PrimitiveContext(this.context, this.state); - this.enterRule(localContext, 92, QuixosCapabilityParser.RULE_primitive); + this.enterRule(localContext, 94, QuixosCapabilityParser.RULE_primitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 883; + this.state = 929; _la = this.tokenStream.LA(1); if(!(_la === 1 || ((((_la - 96)) & ~0x1F) === 0 && ((1 << (_la - 96)) & 223) !== 0))) { this.errorHandler.recoverInline(this); @@ -3273,13 +3419,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public sharedAttachmentDecl(): SharedAttachmentDeclContext { let localContext = new SharedAttachmentDeclContext(this.context, this.state); - this.enterRule(localContext, 94, QuixosCapabilityParser.RULE_sharedAttachmentDecl); + this.enterRule(localContext, 96, QuixosCapabilityParser.RULE_sharedAttachmentDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 885; + this.state = 931; this.match(QuixosCapabilityParser.SHARED); - this.state = 886; + this.state = 932; this.attachmentDecl(); } } @@ -3298,22 +3444,22 @@ export class QuixosCapabilityParser extends antlr.Parser { } public attachmentDecl(): AttachmentDeclContext { let localContext = new AttachmentDeclContext(this.context, this.state); - this.enterRule(localContext, 96, QuixosCapabilityParser.RULE_attachmentDecl); + this.enterRule(localContext, 98, QuixosCapabilityParser.RULE_attachmentDecl); try { - this.state = 890; + this.state = 936; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 888; + this.state = 934; this.stateDecl(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 889; + this.state = 935; this.edgeDecl(); } break; @@ -3336,44 +3482,44 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stateDecl(): StateDeclContext { let localContext = new StateDeclContext(this.context, this.state); - this.enterRule(localContext, 98, QuixosCapabilityParser.RULE_stateDecl); + this.enterRule(localContext, 100, QuixosCapabilityParser.RULE_stateDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 892; + this.state = 938; this.match(QuixosCapabilityParser.STATE); - this.state = 893; + this.state = 939; this.identifier(); - this.state = 894; + this.state = 940; this.match(QuixosCapabilityParser.ID); - this.state = 895; + this.state = 941; this.stringLiteral(); - this.state = 896; + this.state = 942; this.match(QuixosCapabilityParser.ON); - this.state = 897; + this.state = 943; this.identifier(); - this.state = 898; + this.state = 944; this.match(QuixosCapabilityParser.COLON); - this.state = 899; + this.state = 945; this.valueType(); - this.state = 900; + this.state = 946; this.match(QuixosCapabilityParser.POLICY); - this.state = 901; + this.state = 947; this.storagePolicy(); - this.state = 904; + this.state = 950; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 73) { { - this.state = 902; + this.state = 948; this.match(QuixosCapabilityParser.DEFAULT); - this.state = 903; + this.state = 949; this.jsonLiteral(); } } - this.state = 906; + this.state = 952; this.match(QuixosCapabilityParser.SEMI); } } @@ -3392,28 +3538,28 @@ export class QuixosCapabilityParser extends antlr.Parser { } public storagePolicy(): StoragePolicyContext { let localContext = new StoragePolicyContext(this.context, this.state); - this.enterRule(localContext, 100, QuixosCapabilityParser.RULE_storagePolicy); + this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_storagePolicy); try { - this.state = 914; + this.state = 960; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REGISTER: this.enterOuterAlt(localContext, 1); { - this.state = 908; + this.state = 954; this.match(QuixosCapabilityParser.REGISTER); } break; case QuixosCapabilityParser.CRDT: this.enterOuterAlt(localContext, 2); { - this.state = 909; + this.state = 955; this.match(QuixosCapabilityParser.CRDT); - this.state = 910; + this.state = 956; this.match(QuixosCapabilityParser.LPAREN); - this.state = 911; + this.state = 957; this.valueType(); - this.state = 912; + this.state = 958; this.match(QuixosCapabilityParser.RPAREN); } break; @@ -3436,25 +3582,25 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgeDecl(): EdgeDeclContext { let localContext = new EdgeDeclContext(this.context, this.state); - this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_edgeDecl); + this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_edgeDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 916; + this.state = 962; this.match(QuixosCapabilityParser.EDGE); - this.state = 917; + this.state = 963; this.identifier(); - this.state = 918; + this.state = 964; this.match(QuixosCapabilityParser.ID); - this.state = 919; + this.state = 965; this.stringLiteral(); - this.state = 920; + this.state = 966; this.match(QuixosCapabilityParser.LBRACE); - this.state = 921; + this.state = 967; this.edgeEndpoint(); - this.state = 922; + this.state = 968; this.edgeEndpoint(); - this.state = 923; + this.state = 969; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3473,78 +3619,78 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgeEndpoint(): EdgeEndpointContext { let localContext = new EdgeEndpointContext(this.context, this.state); - this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_edgeEndpoint); + this.enterRule(localContext, 106, QuixosCapabilityParser.RULE_edgeEndpoint); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 925; + this.state = 971; this.targetConstraint(); - this.state = 926; + this.state = 972; this.match(QuixosCapabilityParser.PROJECTION); - this.state = 927; + this.state = 973; this.identifier(); - this.state = 928; + this.state = 974; this.match(QuixosCapabilityParser.ID); - this.state = 929; + this.state = 975; this.stringLiteral(); - this.state = 930; + this.state = 976; this.cardinality(); - this.state = 932; + this.state = 978; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 112) { { - this.state = 931; + this.state = 977; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 936; + this.state = 982; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 79) { { - this.state = 934; + this.state = 980; this.match(QuixosCapabilityParser.ON_DELETE); - this.state = 935; + this.state = 981; this.stringLiteral(); } } - this.state = 939; + this.state = 985; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 81) { { - this.state = 938; + this.state = 984; this.match(QuixosCapabilityParser.RETAIN_OTHER); } } - this.state = 943; + this.state = 989; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 82) { { - this.state = 941; + this.state = 987; this.match(QuixosCapabilityParser.KEYED); - this.state = 942; + this.state = 988; this.stringLiteral(); } } - this.state = 946; + this.state = 992; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 83) { { - this.state = 945; + this.state = 991; this.match(QuixosCapabilityParser.PUBLIC_TRAVERSAL); } } - this.state = 948; + this.state = 994; this.match(QuixosCapabilityParser.SEMI); } } @@ -3563,70 +3709,70 @@ export class QuixosCapabilityParser extends antlr.Parser { } public conformanceDecl(): ConformanceDeclContext { let localContext = new ConformanceDeclContext(this.context, this.state); - this.enterRule(localContext, 106, QuixosCapabilityParser.RULE_conformanceDecl); + this.enterRule(localContext, 108, QuixosCapabilityParser.RULE_conformanceDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 950; + this.state = 996; this.match(QuixosCapabilityParser.CONFORM); - this.state = 951; + this.state = 997; this.identifier(); - this.state = 952; + this.state = 998; this.match(QuixosCapabilityParser.AS); - this.state = 953; + this.state = 999; this.identifier(); - this.state = 955; + this.state = 1001; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 954; + this.state = 1000; this.typeArguments(); } } - this.state = 959; + this.state = 1005; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 84) { { - this.state = 957; + this.state = 1003; this.match(QuixosCapabilityParser.ID); - this.state = 958; + this.state = 1004; this.stringLiteral(); } } - this.state = 963; + this.state = 1009; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 78) { { - this.state = 961; + this.state = 1007; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); - this.state = 962; + this.state = 1008; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 965; + this.state = 1011; this.match(QuixosCapabilityParser.LBRACE); - this.state = 969; + this.state = 1015; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 8 || ((((_la - 56)) & ~0x1F) === 0 && ((1 << (_la - 56)) & 4105) !== 0)) { { { - this.state = 966; + this.state = 1012; this.conformanceItem(); } } - this.state = 971; + this.state = 1017; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 972; + this.state = 1018; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3645,52 +3791,52 @@ export class QuixosCapabilityParser extends antlr.Parser { } public conformanceItem(): ConformanceItemContext { let localContext = new ConformanceItemContext(this.context, this.state); - this.enterRule(localContext, 108, QuixosCapabilityParser.RULE_conformanceItem); + this.enterRule(localContext, 110, QuixosCapabilityParser.RULE_conformanceItem); try { - this.state = 981; + this.state = 1027; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 86, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 93, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 974; + this.state = 1020; this.match(QuixosCapabilityParser.PRIVATE); - this.state = 975; + this.state = 1021; this.attachmentDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 976; + this.state = 1022; this.operationBindingDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 977; + this.state = 1023; this.stateFieldBindingDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 978; + this.state = 1024; this.initializationDecl(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 979; + this.state = 1025; this.relationshipMaterializationDecl(); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 980; + this.state = 1026; this.moduleBindingDecl(); } break; @@ -3711,23 +3857,23 @@ export class QuixosCapabilityParser extends antlr.Parser { } public moduleBindingDecl(): ModuleBindingDeclContext { let localContext = new ModuleBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 110, QuixosCapabilityParser.RULE_moduleBindingDecl); + this.enterRule(localContext, 112, QuixosCapabilityParser.RULE_moduleBindingDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 983; + this.state = 1029; this.match(QuixosCapabilityParser.BIND); - this.state = 984; + this.state = 1030; this.identifier(); - this.state = 985; + this.state = 1031; this.match(QuixosCapabilityParser.TO); - this.state = 986; + this.state = 1032; this.identifier(); - this.state = 987; + this.state = 1033; this.match(QuixosCapabilityParser.DOT); - this.state = 988; + this.state = 1034; this.identifier(); - this.state = 989; + this.state = 1035; this.match(QuixosCapabilityParser.SEMI); } } @@ -3746,32 +3892,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public initializationDecl(): InitializationDeclContext { let localContext = new InitializationDeclContext(this.context, this.state); - this.enterRule(localContext, 112, QuixosCapabilityParser.RULE_initializationDecl); + this.enterRule(localContext, 114, QuixosCapabilityParser.RULE_initializationDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 991; + this.state = 1037; this.match(QuixosCapabilityParser.INITIALIZE); - this.state = 992; + this.state = 1038; this.match(QuixosCapabilityParser.LBRACE); - this.state = 996; + this.state = 1042; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8195) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { { { - this.state = 993; + this.state = 1039; this.initializationField(); } } - this.state = 998; + this.state = 1044; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 999; + this.state = 1045; this.match(QuixosCapabilityParser.RBRACE); - this.state = 1000; + this.state = 1046; this.match(QuixosCapabilityParser.SEMI); } } @@ -3790,42 +3936,42 @@ export class QuixosCapabilityParser extends antlr.Parser { } public initializationField(): InitializationFieldContext { let localContext = new InitializationFieldContext(this.context, this.state); - this.enterRule(localContext, 114, QuixosCapabilityParser.RULE_initializationField); + this.enterRule(localContext, 116, QuixosCapabilityParser.RULE_initializationField); try { - this.state = 1016; + this.state = 1062; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 88, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 95, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1002; + this.state = 1048; this.identifier(); - this.state = 1003; + this.state = 1049; this.match(QuixosCapabilityParser.TO); - this.state = 1004; + this.state = 1050; this.match(QuixosCapabilityParser.STATE); - this.state = 1005; + this.state = 1051; this.identifier(); - this.state = 1006; + this.state = 1052; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1008; + this.state = 1054; this.identifier(); - this.state = 1009; + this.state = 1055; this.match(QuixosCapabilityParser.TO); - this.state = 1010; + this.state = 1056; this.match(QuixosCapabilityParser.EDGE); - this.state = 1011; + this.state = 1057; this.identifier(); - this.state = 1012; + this.state = 1058; this.match(QuixosCapabilityParser.DOT); - this.state = 1013; + this.state = 1059; this.identifier(); - this.state = 1014; + this.state = 1060; this.match(QuixosCapabilityParser.SEMI); } break; @@ -3846,34 +3992,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public creationOwnerMapping(): CreationOwnerMappingContext { let localContext = new CreationOwnerMappingContext(this.context, this.state); - this.enterRule(localContext, 116, QuixosCapabilityParser.RULE_creationOwnerMapping); + this.enterRule(localContext, 118, QuixosCapabilityParser.RULE_creationOwnerMapping); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1018; + this.state = 1064; this.interfaceType(); - this.state = 1019; + this.state = 1065; this.match(QuixosCapabilityParser.FROM); - this.state = 1020; + this.state = 1066; this.match(QuixosCapabilityParser.INPUT); - this.state = 1025; + this.state = 1071; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 136) { { { - this.state = 1021; + this.state = 1067; this.match(QuixosCapabilityParser.DOT); - this.state = 1022; + this.state = 1068; this.identifier(); } } - this.state = 1027; + this.state = 1073; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1028; + this.state = 1074; this.match(QuixosCapabilityParser.SEMI); } } @@ -3892,21 +4038,21 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stateFieldBindingDecl(): StateFieldBindingDeclContext { let localContext = new StateFieldBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 118, QuixosCapabilityParser.RULE_stateFieldBindingDecl); + this.enterRule(localContext, 120, QuixosCapabilityParser.RULE_stateFieldBindingDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 1030; + this.state = 1076; this.match(QuixosCapabilityParser.BIND); - this.state = 1031; + this.state = 1077; this.identifier(); - this.state = 1032; + this.state = 1078; this.match(QuixosCapabilityParser.TO); - this.state = 1033; + this.state = 1079; this.match(QuixosCapabilityParser.STATE); - this.state = 1034; + this.state = 1080; this.identifier(); - this.state = 1035; + this.state = 1081; this.match(QuixosCapabilityParser.SEMI); } } @@ -3925,35 +4071,35 @@ export class QuixosCapabilityParser extends antlr.Parser { } public relationshipMaterializationDecl(): RelationshipMaterializationDeclContext { let localContext = new RelationshipMaterializationDeclContext(this.context, this.state); - this.enterRule(localContext, 120, QuixosCapabilityParser.RULE_relationshipMaterializationDecl); + this.enterRule(localContext, 122, QuixosCapabilityParser.RULE_relationshipMaterializationDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 1037; + this.state = 1083; this.match(QuixosCapabilityParser.MATERIALIZE); - this.state = 1038; + this.state = 1084; this.identifier(); - this.state = 1039; + this.state = 1085; this.match(QuixosCapabilityParser.IF); - this.state = 1040; + this.state = 1086; this.match(QuixosCapabilityParser.ABSENT); - this.state = 1041; + this.state = 1087; this.match(QuixosCapabilityParser.USING); - this.state = 1042; + this.state = 1088; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1043; + this.state = 1089; this.identifier(); - this.state = 1044; + this.state = 1090; this.match(QuixosCapabilityParser.VIA); - this.state = 1045; + this.state = 1091; this.match(QuixosCapabilityParser.EDGE); - this.state = 1046; + this.state = 1092; this.identifier(); - this.state = 1047; + this.state = 1093; this.match(QuixosCapabilityParser.DOT); - this.state = 1048; + this.state = 1094; this.identifier(); - this.state = 1049; + this.state = 1095; this.match(QuixosCapabilityParser.SEMI); } } @@ -3972,32 +4118,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationBindingDecl(): OperationBindingDeclContext { let localContext = new OperationBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 122, QuixosCapabilityParser.RULE_operationBindingDecl); + this.enterRule(localContext, 124, QuixosCapabilityParser.RULE_operationBindingDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1051; + this.state = 1097; this.match(QuixosCapabilityParser.BIND); - this.state = 1052; + this.state = 1098; this.memberOperationRef(); - this.state = 1053; + this.state = 1099; this.match(QuixosCapabilityParser.TO); - this.state = 1054; + this.state = 1100; this.operationProvider(); - this.state = 1057; + this.state = 1103; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 34) { { - this.state = 1055; + this.state = 1101; this.match(QuixosCapabilityParser.QUERY_REASON); - this.state = 1056; + this.state = 1102; this.stringLiteral(); } } - this.state = 1059; + this.state = 1105; this.match(QuixosCapabilityParser.SEMI); } } @@ -4016,15 +4162,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public memberOperationRef(): MemberOperationRefContext { let localContext = new MemberOperationRefContext(this.context, this.state); - this.enterRule(localContext, 124, QuixosCapabilityParser.RULE_memberOperationRef); + this.enterRule(localContext, 126, QuixosCapabilityParser.RULE_memberOperationRef); try { this.enterOuterAlt(localContext, 1); { - this.state = 1061; + this.state = 1107; this.identifier(); - this.state = 1062; + this.state = 1108; this.match(QuixosCapabilityParser.DOT); - this.state = 1063; + this.state = 1109; this.operationName(); } } @@ -4043,92 +4189,92 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationName(): OperationNameContext { let localContext = new OperationNameContext(this.context, this.state); - this.enterRule(localContext, 126, QuixosCapabilityParser.RULE_operationName); + this.enterRule(localContext, 128, QuixosCapabilityParser.RULE_operationName); try { - this.state = 1077; + this.state = 1123; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 91, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 98, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1065; + this.state = 1111; this.identifier(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1066; + this.state = 1112; this.match(QuixosCapabilityParser.CALL); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1067; + this.state = 1113; this.match(QuixosCapabilityParser.GET); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1068; + this.state = 1114; this.match(QuixosCapabilityParser.SET); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1069; + this.state = 1115; this.match(QuixosCapabilityParser.EDIT); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1070; + this.state = 1116; this.match(QuixosCapabilityParser.RESOLVE); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 1071; + this.state = 1117; this.match(QuixosCapabilityParser.CONNECT); } break; case 8: this.enterOuterAlt(localContext, 8); { - this.state = 1072; + this.state = 1118; this.match(QuixosCapabilityParser.DISCONNECT); } break; case 9: this.enterOuterAlt(localContext, 9); { - this.state = 1073; + this.state = 1119; this.match(QuixosCapabilityParser.WATCH_START); } break; case 10: this.enterOuterAlt(localContext, 10); { - this.state = 1074; + this.state = 1120; this.match(QuixosCapabilityParser.WATCH_STOP); } break; case 11: this.enterOuterAlt(localContext, 11); { - this.state = 1075; + this.state = 1121; this.match(QuixosCapabilityParser.SUBSCRIBE); } break; case 12: this.enterOuterAlt(localContext, 12); { - this.state = 1076; + this.state = 1122; this.match(QuixosCapabilityParser.UNSUBSCRIBE); } break; @@ -4149,113 +4295,113 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationProvider(): OperationProviderContext { let localContext = new OperationProviderContext(this.context, this.state); - this.enterRule(localContext, 128, QuixosCapabilityParser.RULE_operationProvider); + this.enterRule(localContext, 130, QuixosCapabilityParser.RULE_operationProvider); let _la: number; try { - this.state = 1115; + this.state = 1161; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.LIFECYCLE: this.enterOuterAlt(localContext, 1); { - this.state = 1079; + this.state = 1125; this.match(QuixosCapabilityParser.LIFECYCLE); - this.state = 1080; + this.state = 1126; this.match(QuixosCapabilityParser.DOT); - this.state = 1081; + this.state = 1127; this.identifier(); } break; case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 2); { - this.state = 1082; + this.state = 1128; this.match(QuixosCapabilityParser.STATE); - this.state = 1083; + this.state = 1129; this.identifier(); - this.state = 1084; + this.state = 1130; this.match(QuixosCapabilityParser.DOT); - this.state = 1085; + this.state = 1131; this.statePrimitive(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 3); { - this.state = 1087; + this.state = 1133; this.match(QuixosCapabilityParser.EDGE); - this.state = 1088; + this.state = 1134; this.identifier(); - this.state = 1089; + this.state = 1135; this.match(QuixosCapabilityParser.DOT); - this.state = 1090; + this.state = 1136; this.identifier(); - this.state = 1091; + this.state = 1137; this.match(QuixosCapabilityParser.DOT); - this.state = 1092; + this.state = 1138; this.edgePrimitive(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 4); { - this.state = 1094; + this.state = 1140; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 1095; + this.state = 1141; this.identifier(); - this.state = 1097; + this.state = 1143; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 1096; + this.state = 1142; this.typeArguments(); } } - this.state = 1099; + this.state = 1145; this.match(QuixosCapabilityParser.DOT); - this.state = 1100; + this.state = 1146; this.memberOperationRef(); } break; case QuixosCapabilityParser.PACKAGE: this.enterOuterAlt(localContext, 5); { - this.state = 1102; + this.state = 1148; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 1103; + this.state = 1149; this.identifier(); - this.state = 1104; + this.state = 1150; this.match(QuixosCapabilityParser.DOT); - this.state = 1105; + this.state = 1151; this.identifier(); - this.state = 1107; + this.state = 1153; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 1106; + this.state = 1152; this.typeArguments(); } } - this.state = 1110; + this.state = 1156; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 64) { { - this.state = 1109; + this.state = 1155; this.dependencyBindingBlock(); } } - this.state = 1113; + this.state = 1159; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 66) { { - this.state = 1112; + this.state = 1158; this.acceptanceBinding(); } } @@ -4281,13 +4427,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public acceptanceBinding(): AcceptanceBindingContext { let localContext = new AcceptanceBindingContext(this.context, this.state); - this.enterRule(localContext, 130, QuixosCapabilityParser.RULE_acceptanceBinding); + this.enterRule(localContext, 132, QuixosCapabilityParser.RULE_acceptanceBinding); try { this.enterOuterAlt(localContext, 1); { - this.state = 1117; + this.state = 1163; this.match(QuixosCapabilityParser.ACCEPT); - this.state = 1118; + this.state = 1164; this.dependencyBindingBlock(); } } @@ -4306,12 +4452,12 @@ export class QuixosCapabilityParser extends antlr.Parser { } public statePrimitive(): StatePrimitiveContext { let localContext = new StatePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 132, QuixosCapabilityParser.RULE_statePrimitive); + this.enterRule(localContext, 134, QuixosCapabilityParser.RULE_statePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1120; + this.state = 1166; _la = this.tokenStream.LA(1); if(!(_la === 1 || ((((_la - 96)) & ~0x1F) === 0 && ((1 << (_la - 96)) & 195) !== 0))) { this.errorHandler.recoverInline(this); @@ -4337,12 +4483,12 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgePrimitive(): EdgePrimitiveContext { let localContext = new EdgePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 134, QuixosCapabilityParser.RULE_edgePrimitive); + this.enterRule(localContext, 136, QuixosCapabilityParser.RULE_edgePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1122; + this.state = 1168; _la = this.tokenStream.LA(1); if(!(((((_la - 98)) & ~0x1F) === 0 && ((1 << (_la - 98)) & 55) !== 0))) { this.errorHandler.recoverInline(this); @@ -4368,30 +4514,30 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBindingBlock(): DependencyBindingBlockContext { let localContext = new DependencyBindingBlockContext(this.context, this.state); - this.enterRule(localContext, 136, QuixosCapabilityParser.RULE_dependencyBindingBlock); + this.enterRule(localContext, 138, QuixosCapabilityParser.RULE_dependencyBindingBlock); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1124; + this.state = 1170; this.match(QuixosCapabilityParser.WITH); - this.state = 1125; + this.state = 1171; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1129; + this.state = 1175; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8195) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { { { - this.state = 1126; + this.state = 1172; this.dependencyBinding(); } } - this.state = 1131; + this.state = 1177; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1132; + this.state = 1178; this.match(QuixosCapabilityParser.RBRACE); } } @@ -4410,139 +4556,139 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBinding(): DependencyBindingContext { let localContext = new DependencyBindingContext(this.context, this.state); - this.enterRule(localContext, 138, QuixosCapabilityParser.RULE_dependencyBinding); + this.enterRule(localContext, 140, QuixosCapabilityParser.RULE_dependencyBinding); let _la: number; try { - this.state = 1232; + this.state = 1278; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 105, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 112, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1134; + this.state = 1180; this.identifier(); - this.state = 1135; + this.state = 1181; this.match(QuixosCapabilityParser.TO); - this.state = 1136; + this.state = 1182; this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 1137; + this.state = 1183; this.match(QuixosCapabilityParser.REFLECTION); - this.state = 1138; + this.state = 1184; this.match(QuixosCapabilityParser.LBRACK); - this.state = 1139; + this.state = 1185; this.identifierList(); - this.state = 1140; + this.state = 1186; this.match(QuixosCapabilityParser.RBRACK); - this.state = 1141; + this.state = 1187; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1143; + this.state = 1189; this.identifier(); - this.state = 1144; + this.state = 1190; this.match(QuixosCapabilityParser.TO); - this.state = 1145; + this.state = 1191; this.match(QuixosCapabilityParser.STATE); - this.state = 1146; + this.state = 1192; this.identifier(); - this.state = 1153; + this.state = 1199; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 67) { { - this.state = 1147; + this.state = 1193; this.match(QuixosCapabilityParser.VIA); - this.state = 1148; + this.state = 1194; this.match(QuixosCapabilityParser.EDGE); - this.state = 1149; + this.state = 1195; this.identifier(); - this.state = 1150; + this.state = 1196; this.match(QuixosCapabilityParser.DOT); - this.state = 1151; + this.state = 1197; this.identifier(); } } - this.state = 1155; + this.state = 1201; this.match(QuixosCapabilityParser.SEMI); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1157; + this.state = 1203; this.identifier(); - this.state = 1158; + this.state = 1204; this.match(QuixosCapabilityParser.TO); - this.state = 1159; + this.state = 1205; this.match(QuixosCapabilityParser.EDGE); - this.state = 1160; + this.state = 1206; this.identifier(); - this.state = 1161; + this.state = 1207; this.match(QuixosCapabilityParser.DOT); - this.state = 1162; + this.state = 1208; this.identifier(); - this.state = 1169; + this.state = 1215; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 67) { { - this.state = 1163; + this.state = 1209; this.match(QuixosCapabilityParser.VIA); - this.state = 1164; + this.state = 1210; this.match(QuixosCapabilityParser.EDGE); - this.state = 1165; + this.state = 1211; this.identifier(); - this.state = 1166; + this.state = 1212; this.match(QuixosCapabilityParser.DOT); - this.state = 1167; + this.state = 1213; this.identifier(); } } - this.state = 1171; + this.state = 1217; this.match(QuixosCapabilityParser.SEMI); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1173; + this.state = 1219; this.identifier(); - this.state = 1174; + this.state = 1220; this.match(QuixosCapabilityParser.TO); - this.state = 1175; + this.state = 1221; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 1176; + this.state = 1222; this.identifier(); - this.state = 1178; + this.state = 1224; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 1177; + this.state = 1223; this.typeArguments(); } } - this.state = 1188; + this.state = 1234; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.VIA: { { - this.state = 1180; + this.state = 1226; this.match(QuixosCapabilityParser.VIA); - this.state = 1181; + this.state = 1227; this.match(QuixosCapabilityParser.EDGE); - this.state = 1182; + this.state = 1228; this.identifier(); - this.state = 1183; + this.state = 1229; this.match(QuixosCapabilityParser.DOT); - this.state = 1184; + this.state = 1230; this.identifier(); } } @@ -4550,9 +4696,9 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.FROM: { { - this.state = 1186; + this.state = 1232; this.match(QuixosCapabilityParser.FROM); - this.state = 1187; + this.state = 1233; this.match(QuixosCapabilityParser.INPUT); } } @@ -4562,104 +4708,104 @@ export class QuixosCapabilityParser extends antlr.Parser { default: break; } - this.state = 1190; + this.state = 1236; this.match(QuixosCapabilityParser.SEMI); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1192; + this.state = 1238; this.identifier(); - this.state = 1193; + this.state = 1239; this.match(QuixosCapabilityParser.TO); - this.state = 1194; + this.state = 1240; this.match(QuixosCapabilityParser.CREATION); - this.state = 1195; + this.state = 1241; this.identifier(); - this.state = 1196; + this.state = 1242; this.match(QuixosCapabilityParser.WITH); - this.state = 1197; + this.state = 1243; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1201; + this.state = 1247; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8195) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { { { - this.state = 1198; + this.state = 1244; this.creationOwnerMapping(); } } - this.state = 1203; + this.state = 1249; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1204; + this.state = 1250; this.match(QuixosCapabilityParser.RBRACE); - this.state = 1205; + this.state = 1251; this.match(QuixosCapabilityParser.SEMI); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1207; + this.state = 1253; this.identifier(); - this.state = 1208; + this.state = 1254; this.match(QuixosCapabilityParser.TO); - this.state = 1209; + this.state = 1255; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1210; + this.state = 1256; this.identifier(); - this.state = 1211; + this.state = 1257; this.match(QuixosCapabilityParser.SEMI); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 1213; + this.state = 1259; this.identifier(); - this.state = 1214; + this.state = 1260; this.match(QuixosCapabilityParser.TO); - this.state = 1216; + this.state = 1262; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 9) { { - this.state = 1215; + this.state = 1261; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 1218; + this.state = 1264; this.match(QuixosCapabilityParser.QUERY); - this.state = 1219; + this.state = 1265; this.identifier(); - this.state = 1220; + this.state = 1266; this.match(QuixosCapabilityParser.DOT); - this.state = 1221; + this.state = 1267; this.identifier(); - this.state = 1228; + this.state = 1274; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 67) { { - this.state = 1222; + this.state = 1268; this.match(QuixosCapabilityParser.VIA); - this.state = 1223; + this.state = 1269; this.match(QuixosCapabilityParser.EDGE); - this.state = 1224; + this.state = 1270; this.identifier(); - this.state = 1225; + this.state = 1271; this.match(QuixosCapabilityParser.DOT); - this.state = 1226; + this.state = 1272; this.identifier(); } } - this.state = 1230; + this.state = 1276; this.match(QuixosCapabilityParser.SEMI); } break; @@ -4680,34 +4826,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public constructorBindingDecl(): ConstructorBindingDeclContext { let localContext = new ConstructorBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 140, QuixosCapabilityParser.RULE_constructorBindingDecl); + this.enterRule(localContext, 142, QuixosCapabilityParser.RULE_constructorBindingDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1234; + this.state = 1280; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1235; + this.state = 1281; this.identifier(); - this.state = 1236; + this.state = 1282; this.match(QuixosCapabilityParser.TO); - this.state = 1237; + this.state = 1283; this.identifier(); - this.state = 1238; + this.state = 1284; this.match(QuixosCapabilityParser.DOT); - this.state = 1239; + this.state = 1285; this.identifier(); - this.state = 1241; + this.state = 1287; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 64) { { - this.state = 1240; + this.state = 1286; this.dependencyBindingBlock(); } } - this.state = 1243; + this.state = 1289; this.match(QuixosCapabilityParser.SEMI); } } @@ -4726,10 +4872,10 @@ export class QuixosCapabilityParser extends antlr.Parser { } public valueType(): ValueTypeContext { let localContext = new ValueTypeContext(this.context, this.state); - this.enterRule(localContext, 142, QuixosCapabilityParser.RULE_valueType); + this.enterRule(localContext, 144, QuixosCapabilityParser.RULE_valueType); let _la: number; try { - this.state = 1291; + this.state = 1337; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.BOOL: @@ -4742,130 +4888,130 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.UINT64: this.enterOuterAlt(localContext, 1); { - this.state = 1245; + this.state = 1291; this.scalarType(); } break; case QuixosCapabilityParser.UNIT: this.enterOuterAlt(localContext, 2); { - this.state = 1246; + this.state = 1292; this.match(QuixosCapabilityParser.UNIT); } break; case QuixosCapabilityParser.WATCH_HANDLE: this.enterOuterAlt(localContext, 3); { - this.state = 1247; + this.state = 1293; this.match(QuixosCapabilityParser.WATCH_HANDLE); } break; case QuixosCapabilityParser.MESSAGE: this.enterOuterAlt(localContext, 4); { - this.state = 1248; + this.state = 1294; this.match(QuixosCapabilityParser.MESSAGE); - this.state = 1249; + this.state = 1295; this.stringLiteral(); } break; case QuixosCapabilityParser.ATOM_REF: this.enterOuterAlt(localContext, 5); { - this.state = 1250; + this.state = 1296; this.match(QuixosCapabilityParser.ATOM_REF); - this.state = 1251; + this.state = 1297; this.match(QuixosCapabilityParser.LT); - this.state = 1252; + this.state = 1298; this.identifier(); - this.state = 1253; + this.state = 1299; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.INTERFACE_REF: this.enterOuterAlt(localContext, 6); { - this.state = 1255; + this.state = 1301; this.match(QuixosCapabilityParser.INTERFACE_REF); - this.state = 1256; + this.state = 1302; this.match(QuixosCapabilityParser.LT); - this.state = 1257; + this.state = 1303; this.identifier(); - this.state = 1259; + this.state = 1305; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 1258; + this.state = 1304; this.typeArguments(); } } - this.state = 1261; + this.state = 1307; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.REF: this.enterOuterAlt(localContext, 7); { - this.state = 1263; + this.state = 1309; this.match(QuixosCapabilityParser.REF); - this.state = 1264; + this.state = 1310; this.match(QuixosCapabilityParser.LT); - this.state = 1265; + this.state = 1311; this.identifier(); - this.state = 1266; + this.state = 1312; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.OPTIONAL: this.enterOuterAlt(localContext, 8); { - this.state = 1268; + this.state = 1314; this.match(QuixosCapabilityParser.OPTIONAL); - this.state = 1269; + this.state = 1315; this.match(QuixosCapabilityParser.LT); - this.state = 1270; + this.state = 1316; this.valueType(); - this.state = 1271; + this.state = 1317; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.LIST: this.enterOuterAlt(localContext, 9); { - this.state = 1273; + this.state = 1319; this.match(QuixosCapabilityParser.LIST); - this.state = 1274; + this.state = 1320; this.match(QuixosCapabilityParser.LT); - this.state = 1275; + this.state = 1321; this.valueType(); - this.state = 1276; + this.state = 1322; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.RECORD: this.enterOuterAlt(localContext, 10); { - this.state = 1278; + this.state = 1324; this.match(QuixosCapabilityParser.RECORD); - this.state = 1279; + this.state = 1325; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1283; + this.state = 1329; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8195) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { { { - this.state = 1280; + this.state = 1326; this.recordField(); } } - this.state = 1285; + this.state = 1331; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1286; + this.state = 1332; this.match(QuixosCapabilityParser.RBRACE); } break; @@ -4899,6 +5045,7 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.POLL: case QuixosCapabilityParser.QUERYABLE: case QuixosCapabilityParser.RPC: + case QuixosCapabilityParser.FRAGMENT: case QuixosCapabilityParser.INTERFACES: case QuixosCapabilityParser.SOURCE: case QuixosCapabilityParser.START: @@ -4907,14 +5054,14 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 11); { - this.state = 1287; + this.state = 1333; this.identifier(); - this.state = 1289; + this.state = 1335; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 1288; + this.state = 1334; this.typeArguments(); } } @@ -4940,17 +5087,17 @@ export class QuixosCapabilityParser extends antlr.Parser { } public recordField(): RecordFieldContext { let localContext = new RecordFieldContext(this.context, this.state); - this.enterRule(localContext, 144, QuixosCapabilityParser.RULE_recordField); + this.enterRule(localContext, 146, QuixosCapabilityParser.RULE_recordField); try { this.enterOuterAlt(localContext, 1); { - this.state = 1293; + this.state = 1339; this.identifier(); - this.state = 1294; + this.state = 1340; this.match(QuixosCapabilityParser.COLON); - this.state = 1295; + this.state = 1341; this.valueType(); - this.state = 1296; + this.state = 1342; this.match(QuixosCapabilityParser.SEMI); } } @@ -4969,12 +5116,12 @@ export class QuixosCapabilityParser extends antlr.Parser { } public scalarType(): ScalarTypeContext { let localContext = new ScalarTypeContext(this.context, this.state); - this.enterRule(localContext, 146, QuixosCapabilityParser.RULE_scalarType); + this.enterRule(localContext, 148, QuixosCapabilityParser.RULE_scalarType); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1298; + this.state = 1344; _la = this.tokenStream.LA(1); if(!(((((_la - 121)) & ~0x1F) === 0 && ((1 << (_la - 121)) & 255) !== 0))) { this.errorHandler.recoverInline(this); @@ -5000,12 +5147,12 @@ export class QuixosCapabilityParser extends antlr.Parser { } public cardinality(): CardinalityContext { let localContext = new CardinalityContext(this.context, this.state); - this.enterRule(localContext, 148, QuixosCapabilityParser.RULE_cardinality); + this.enterRule(localContext, 150, QuixosCapabilityParser.RULE_cardinality); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1300; + this.state = 1346; _la = this.tokenStream.LA(1); if(!(((((_la - 108)) & ~0x1F) === 0 && ((1 << (_la - 108)) & 15) !== 0))) { this.errorHandler.recoverInline(this); @@ -5031,64 +5178,64 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonLiteral(): JsonLiteralContext { let localContext = new JsonLiteralContext(this.context, this.state); - this.enterRule(localContext, 150, QuixosCapabilityParser.RULE_jsonLiteral); + this.enterRule(localContext, 152, QuixosCapabilityParser.RULE_jsonLiteral); try { - this.state = 1310; + this.state = 1356; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STRING_LITERAL: this.enterOuterAlt(localContext, 1); { - this.state = 1302; + this.state = 1348; this.stringLiteral(); } break; case QuixosCapabilityParser.INTEGER: this.enterOuterAlt(localContext, 2); { - this.state = 1303; + this.state = 1349; this.match(QuixosCapabilityParser.INTEGER); } break; case QuixosCapabilityParser.JSON_NUMBER: this.enterOuterAlt(localContext, 3); { - this.state = 1304; + this.state = 1350; this.match(QuixosCapabilityParser.JSON_NUMBER); } break; case QuixosCapabilityParser.TRUE: this.enterOuterAlt(localContext, 4); { - this.state = 1305; + this.state = 1351; this.match(QuixosCapabilityParser.TRUE); } break; case QuixosCapabilityParser.FALSE: this.enterOuterAlt(localContext, 5); { - this.state = 1306; + this.state = 1352; this.match(QuixosCapabilityParser.FALSE); } break; case QuixosCapabilityParser.NULL: this.enterOuterAlt(localContext, 6); { - this.state = 1307; + this.state = 1353; this.match(QuixosCapabilityParser.NULL); } break; case QuixosCapabilityParser.LBRACE: this.enterOuterAlt(localContext, 7); { - this.state = 1308; + this.state = 1354; this.jsonObject(); } break; case QuixosCapabilityParser.LBRACK: this.enterOuterAlt(localContext, 8); { - this.state = 1309; + this.state = 1355; this.jsonArray(); } break; @@ -5111,40 +5258,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonObject(): JsonObjectContext { let localContext = new JsonObjectContext(this.context, this.state); - this.enterRule(localContext, 152, QuixosCapabilityParser.RULE_jsonObject); + this.enterRule(localContext, 154, QuixosCapabilityParser.RULE_jsonObject); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1312; + this.state = 1358; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1321; + this.state = 1367; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 150) { { - this.state = 1313; + this.state = 1359; this.jsonMember(); - this.state = 1318; + this.state = 1364; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 1314; + this.state = 1360; this.match(QuixosCapabilityParser.COMMA); - this.state = 1315; + this.state = 1361; this.jsonMember(); } } - this.state = 1320; + this.state = 1366; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1323; + this.state = 1369; this.match(QuixosCapabilityParser.RBRACE); } } @@ -5163,15 +5310,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonMember(): JsonMemberContext { let localContext = new JsonMemberContext(this.context, this.state); - this.enterRule(localContext, 154, QuixosCapabilityParser.RULE_jsonMember); + this.enterRule(localContext, 156, QuixosCapabilityParser.RULE_jsonMember); try { this.enterOuterAlt(localContext, 1); { - this.state = 1325; + this.state = 1371; this.stringLiteral(); - this.state = 1326; + this.state = 1372; this.match(QuixosCapabilityParser.COLON); - this.state = 1327; + this.state = 1373; this.jsonLiteral(); } } @@ -5190,40 +5337,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonArray(): JsonArrayContext { let localContext = new JsonArrayContext(this.context, this.state); - this.enterRule(localContext, 156, QuixosCapabilityParser.RULE_jsonArray); + this.enterRule(localContext, 158, QuixosCapabilityParser.RULE_jsonArray); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1329; + this.state = 1375; this.match(QuixosCapabilityParser.LBRACK); - this.state = 1338; + this.state = 1384; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (((((_la - 129)) & ~0x1F) === 0 && ((1 << (_la - 129)) & 2884871) !== 0)) { { - this.state = 1330; + this.state = 1376; this.jsonLiteral(); - this.state = 1335; + this.state = 1381; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 1331; + this.state = 1377; this.match(QuixosCapabilityParser.COMMA); - this.state = 1332; + this.state = 1378; this.jsonLiteral(); } } - this.state = 1337; + this.state = 1383; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1340; + this.state = 1386; this.match(QuixosCapabilityParser.RBRACK); } } @@ -5242,14 +5389,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public identifier(): IdentifierContext { let localContext = new IdentifierContext(this.context, this.state); - this.enterRule(localContext, 158, QuixosCapabilityParser.RULE_identifier); + this.enterRule(localContext, 160, QuixosCapabilityParser.RULE_identifier); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1342; + this.state = 1388; _la = this.tokenStream.LA(1); - if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8195) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149)) { + if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149)) { this.errorHandler.recoverInline(this); } else { @@ -5273,11 +5420,11 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stringLiteral(): StringLiteralContext { let localContext = new StringLiteralContext(this.context, this.state); - this.enterRule(localContext, 160, QuixosCapabilityParser.RULE_stringLiteral); + this.enterRule(localContext, 162, QuixosCapabilityParser.RULE_stringLiteral); try { this.enterOuterAlt(localContext, 1); { - this.state = 1344; + this.state = 1390; this.match(QuixosCapabilityParser.STRING_LITERAL); } } @@ -5296,7 +5443,7 @@ export class QuixosCapabilityParser extends antlr.Parser { } public static readonly _serializedATN: number[] = [ - 4,1,153,1347,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,153,1393,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, @@ -5308,513 +5455,533 @@ export class QuixosCapabilityParser extends antlr.Parser { 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,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,3,0,175,8,0,1,1,1,1,1,1,5,1,180,8,1,10,1,12,1,183,9,1,1,1, - 1,1,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,5,3, - 201,8,3,10,3,12,3,204,9,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1, - 4,3,4,216,8,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,3,5,228,8, - 5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1, - 8,1,8,1,8,3,8,248,8,8,1,9,1,9,1,9,1,9,1,9,1,9,3,9,256,8,9,1,9,1, - 9,1,10,5,10,261,8,10,10,10,12,10,264,9,10,1,10,1,10,1,10,3,10,269, - 8,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,5,10,279,8,10,10,10, - 12,10,282,9,10,3,10,284,8,10,1,10,1,10,5,10,288,8,10,10,10,12,10, - 291,9,10,1,10,1,10,1,11,1,11,1,11,1,11,5,11,299,8,11,10,11,12,11, - 302,9,11,1,11,1,11,1,12,1,12,1,12,1,12,3,12,310,8,12,1,12,1,12,1, - 12,1,12,1,12,1,12,5,12,318,8,12,10,12,12,12,321,9,12,3,12,323,8, - 12,3,12,325,8,12,1,13,1,13,3,13,329,8,13,1,14,1,14,1,14,1,14,5,14, - 335,8,14,10,14,12,14,338,9,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15, - 1,15,1,15,3,15,349,8,15,1,16,1,16,1,16,3,16,354,8,16,1,16,1,16,1, - 16,1,16,1,17,1,17,1,17,1,17,3,17,364,8,17,1,18,1,18,1,18,1,18,1, - 18,1,18,1,18,1,18,3,18,374,8,18,1,18,1,18,1,19,3,19,379,8,19,1,19, - 1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,3,19, - 394,8,19,1,19,1,19,1,19,1,20,3,20,400,8,20,1,20,1,20,1,20,1,20,1, - 20,1,20,1,20,1,20,5,20,410,8,20,10,20,12,20,413,9,20,1,20,1,20,1, - 21,1,21,1,21,1,21,3,21,421,8,21,1,21,1,21,1,21,1,21,1,21,1,21,3, - 21,429,8,21,1,21,1,21,1,21,1,21,1,21,1,21,3,21,437,8,21,1,21,1,21, - 1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,3,21,450,8,21,1,22, - 3,22,453,8,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,3,22,463,8, - 22,1,22,1,22,3,22,467,8,22,1,22,1,22,5,22,471,8,22,10,22,12,22,474, - 9,22,1,22,1,22,1,23,1,23,3,23,480,8,23,1,24,1,24,1,24,1,24,3,24, - 486,8,24,1,24,1,24,1,24,1,24,1,24,1,24,3,24,494,8,24,1,24,1,24,1, - 24,1,24,1,24,1,24,3,24,502,8,24,1,24,1,24,1,24,1,24,1,24,1,24,1, - 24,1,24,1,24,1,24,1,24,3,24,515,8,24,1,25,1,25,1,25,1,25,1,25,3, - 25,522,8,25,1,25,1,25,3,25,526,8,25,1,26,5,26,529,8,26,10,26,12, - 26,532,9,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,3,26,542,8,26, - 1,26,1,26,5,26,546,8,26,10,26,12,26,549,9,26,1,26,1,26,1,27,1,27, - 1,27,1,27,1,27,1,27,3,27,559,8,27,1,28,1,28,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,29,1,29,1,29, - 1,29,1,29,1,29,1,30,1,30,1,30,3,30,586,8,30,1,30,1,30,1,30,1,30, - 3,30,592,8,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,5,30,601,8,30,10, - 30,12,30,604,9,30,1,30,1,30,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,32,1,32,1,32,1,32,1,32,1,32,1,32,1, - 32,1,32,3,32,630,8,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1, - 32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1, - 32,1,32,1,32,1,32,3,32,657,8,32,1,33,1,33,1,33,3,33,662,8,33,1,33, - 1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,3,33,673,8,33,1,33,3,33, - 676,8,33,1,33,1,33,1,33,3,33,681,8,33,1,33,3,33,684,8,33,1,33,1, - 33,1,34,1,34,1,34,3,34,691,8,34,1,34,1,34,1,34,1,34,1,34,1,34,1, - 34,3,34,700,8,34,1,34,3,34,703,8,34,1,34,3,34,706,8,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,36,1,36,1,36, - 3,36,723,8,36,1,37,1,37,1,37,1,37,1,37,5,37,730,8,37,10,37,12,37, - 733,9,37,1,37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38, - 3,38,746,8,38,1,38,1,38,1,39,1,39,1,39,1,40,1,40,1,41,1,41,1,41, - 1,41,1,41,1,41,1,41,1,41,1,41,1,41,5,41,765,8,41,10,41,12,41,768, - 9,41,3,41,770,8,41,1,41,3,41,773,8,41,1,42,1,42,1,42,5,42,778,8, - 42,10,42,12,42,781,9,42,1,43,1,43,1,43,5,43,786,8,43,10,43,12,43, - 789,9,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,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,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44, - 3,44,828,8,44,1,44,3,44,831,8,44,1,44,1,44,3,44,835,8,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,1,44,1,44,1, - 44,1,44,1,44,1,44,1,44,1,44,3,44,857,8,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,871,8,44,1,45,1,45,1, - 45,1,45,5,45,877,8,45,10,45,12,45,880,9,45,1,45,1,45,1,46,1,46,1, - 47,1,47,1,47,1,48,1,48,3,48,891,8,48,1,49,1,49,1,49,1,49,1,49,1, - 49,1,49,1,49,1,49,1,49,1,49,1,49,3,49,905,8,49,1,49,1,49,1,50,1, - 50,1,50,1,50,1,50,1,50,3,50,915,8,50,1,51,1,51,1,51,1,51,1,51,1, - 51,1,51,1,51,1,51,1,52,1,52,1,52,1,52,1,52,1,52,1,52,3,52,933,8, - 52,1,52,1,52,3,52,937,8,52,1,52,3,52,940,8,52,1,52,1,52,3,52,944, - 8,52,1,52,3,52,947,8,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,3,53, - 956,8,53,1,53,1,53,3,53,960,8,53,1,53,1,53,3,53,964,8,53,1,53,1, - 53,5,53,968,8,53,10,53,12,53,971,9,53,1,53,1,53,1,54,1,54,1,54,1, - 54,1,54,1,54,1,54,3,54,982,8,54,1,55,1,55,1,55,1,55,1,55,1,55,1, - 55,1,55,1,56,1,56,1,56,5,56,995,8,56,10,56,12,56,998,9,56,1,56,1, - 56,1,56,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1, - 57,1,57,1,57,3,57,1017,8,57,1,58,1,58,1,58,1,58,1,58,5,58,1024,8, - 58,10,58,12,58,1027,9,58,1,58,1,58,1,59,1,59,1,59,1,59,1,59,1,59, - 1,59,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60, - 1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,61,3,61,1058,8,61,1,61,1,61, - 1,62,1,62,1,62,1,62,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63, - 1,63,1,63,1,63,3,63,1078,8,63,1,64,1,64,1,64,1,64,1,64,1,64,1,64, - 1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,3,64,1098, - 8,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,3,64,1108,8,64,1,64, - 3,64,1111,8,64,1,64,3,64,1114,8,64,3,64,1116,8,64,1,65,1,65,1,65, - 1,66,1,66,1,67,1,67,1,68,1,68,1,68,5,68,1128,8,68,10,68,12,68,1131, - 9,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,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,3,69,1154,8,69,1,69, - 1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69, - 3,69,1170,8,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,3,69,1179,8,69, - 1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,3,69,1189,8,69,1,69,1,69, - 1,69,1,69,1,69,1,69,1,69,1,69,1,69,5,69,1200,8,69,10,69,12,69,1203, - 9,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69, - 3,69,1217,8,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69, - 3,69,1229,8,69,1,69,1,69,3,69,1233,8,69,1,70,1,70,1,70,1,70,1,70, - 1,70,1,70,3,70,1242,8,70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71, - 1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,3,71,1260,8,71,1,71,1,71, - 1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71, - 1,71,1,71,1,71,1,71,1,71,5,71,1282,8,71,10,71,12,71,1285,9,71,1, - 71,1,71,1,71,3,71,1290,8,71,3,71,1292,8,71,1,72,1,72,1,72,1,72,1, - 72,1,73,1,73,1,74,1,74,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,3, - 75,1311,8,75,1,76,1,76,1,76,1,76,5,76,1317,8,76,10,76,12,76,1320, - 9,76,3,76,1322,8,76,1,76,1,76,1,77,1,77,1,77,1,77,1,78,1,78,1,78, - 1,78,5,78,1334,8,78,10,78,12,78,1337,9,78,3,78,1339,8,78,1,78,1, - 78,1,79,1,79,1,80,1,80,1,80,0,0,81,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,0,9,2,0,15,15,33,33, - 1,0,11,12,1,0,101,105,3,0,1,1,96,100,102,103,3,0,1,1,96,97,102,103, - 2,0,98,100,102,103,1,0,121,128,1,0,108,111,8,0,1,1,4,8,10,33,45, - 45,74,74,94,95,106,106,149,149,1455,0,174,1,0,0,0,2,176,1,0,0,0, - 4,186,1,0,0,0,6,190,1,0,0,0,8,215,1,0,0,0,10,227,1,0,0,0,12,229, - 1,0,0,0,14,236,1,0,0,0,16,247,1,0,0,0,18,249,1,0,0,0,20,262,1,0, - 0,0,22,294,1,0,0,0,24,324,1,0,0,0,26,326,1,0,0,0,28,330,1,0,0,0, - 30,348,1,0,0,0,32,350,1,0,0,0,34,363,1,0,0,0,36,365,1,0,0,0,38,378, - 1,0,0,0,40,399,1,0,0,0,42,449,1,0,0,0,44,452,1,0,0,0,46,477,1,0, - 0,0,48,514,1,0,0,0,50,525,1,0,0,0,52,530,1,0,0,0,54,558,1,0,0,0, - 56,560,1,0,0,0,58,570,1,0,0,0,60,582,1,0,0,0,62,607,1,0,0,0,64,656, - 1,0,0,0,66,658,1,0,0,0,68,687,1,0,0,0,70,709,1,0,0,0,72,722,1,0, - 0,0,74,724,1,0,0,0,76,736,1,0,0,0,78,749,1,0,0,0,80,752,1,0,0,0, - 82,772,1,0,0,0,84,774,1,0,0,0,86,782,1,0,0,0,88,870,1,0,0,0,90,872, - 1,0,0,0,92,883,1,0,0,0,94,885,1,0,0,0,96,890,1,0,0,0,98,892,1,0, - 0,0,100,914,1,0,0,0,102,916,1,0,0,0,104,925,1,0,0,0,106,950,1,0, - 0,0,108,981,1,0,0,0,110,983,1,0,0,0,112,991,1,0,0,0,114,1016,1,0, - 0,0,116,1018,1,0,0,0,118,1030,1,0,0,0,120,1037,1,0,0,0,122,1051, - 1,0,0,0,124,1061,1,0,0,0,126,1077,1,0,0,0,128,1115,1,0,0,0,130,1117, - 1,0,0,0,132,1120,1,0,0,0,134,1122,1,0,0,0,136,1124,1,0,0,0,138,1232, - 1,0,0,0,140,1234,1,0,0,0,142,1291,1,0,0,0,144,1293,1,0,0,0,146,1298, - 1,0,0,0,148,1300,1,0,0,0,150,1310,1,0,0,0,152,1312,1,0,0,0,154,1325, - 1,0,0,0,156,1329,1,0,0,0,158,1342,1,0,0,0,160,1344,1,0,0,0,162,163, - 3,6,3,0,163,164,5,0,0,1,164,175,1,0,0,0,165,166,3,20,10,0,166,167, - 5,0,0,1,167,175,1,0,0,0,168,169,3,52,26,0,169,170,5,0,0,1,170,175, - 1,0,0,0,171,172,3,2,1,0,172,173,5,0,0,1,173,175,1,0,0,0,174,162, - 1,0,0,0,174,165,1,0,0,0,174,168,1,0,0,0,174,171,1,0,0,0,175,1,1, - 0,0,0,176,177,5,40,0,0,177,181,5,137,0,0,178,180,3,8,4,0,179,178, - 1,0,0,0,180,183,1,0,0,0,181,179,1,0,0,0,181,182,1,0,0,0,182,184, - 1,0,0,0,183,181,1,0,0,0,184,185,5,138,0,0,185,3,1,0,0,0,186,187, - 5,41,0,0,187,188,3,160,80,0,188,189,5,134,0,0,189,5,1,0,0,0,190, - 191,5,9,0,0,191,192,3,158,79,0,192,193,5,84,0,0,193,194,3,160,80, - 0,194,195,5,77,0,0,195,196,3,160,80,0,196,197,5,76,0,0,197,198,3, - 160,80,0,198,202,5,137,0,0,199,201,3,8,4,0,200,199,1,0,0,0,201,204, - 1,0,0,0,202,200,1,0,0,0,202,203,1,0,0,0,203,205,1,0,0,0,204,202, - 1,0,0,0,205,206,5,138,0,0,206,7,1,0,0,0,207,216,3,4,2,0,208,216, - 3,18,9,0,209,216,3,10,5,0,210,216,3,94,47,0,211,216,3,106,53,0,212, - 216,3,140,70,0,213,216,3,58,29,0,214,216,3,32,16,0,215,207,1,0,0, - 0,215,208,1,0,0,0,215,209,1,0,0,0,215,210,1,0,0,0,215,211,1,0,0, - 0,215,212,1,0,0,0,215,213,1,0,0,0,215,214,1,0,0,0,216,9,1,0,0,0, - 217,218,5,41,0,0,218,219,5,44,0,0,219,220,3,158,79,0,220,221,5,134, - 0,0,221,228,1,0,0,0,222,223,5,41,0,0,223,224,5,46,0,0,224,225,3, - 158,79,0,225,226,5,134,0,0,226,228,1,0,0,0,227,217,1,0,0,0,227,222, - 1,0,0,0,228,11,1,0,0,0,229,230,5,42,0,0,230,231,5,43,0,0,231,232, - 3,158,79,0,232,233,5,84,0,0,233,234,3,160,80,0,234,235,5,134,0,0, - 235,13,1,0,0,0,236,237,5,42,0,0,237,238,5,44,0,0,238,239,3,158,79, - 0,239,240,5,77,0,0,240,241,3,160,80,0,241,242,5,134,0,0,242,15,1, - 0,0,0,243,248,3,10,5,0,244,248,3,12,6,0,245,248,3,14,7,0,246,248, - 3,32,16,0,247,243,1,0,0,0,247,244,1,0,0,0,247,245,1,0,0,0,247,246, - 1,0,0,0,248,17,1,0,0,0,249,250,5,43,0,0,250,251,3,158,79,0,251,252, - 5,84,0,0,252,255,3,160,80,0,253,254,5,85,0,0,254,256,3,160,80,0, - 255,253,1,0,0,0,255,256,1,0,0,0,256,257,1,0,0,0,257,258,5,134,0, - 0,258,19,1,0,0,0,259,261,3,16,8,0,260,259,1,0,0,0,261,264,1,0,0, - 0,262,260,1,0,0,0,262,263,1,0,0,0,263,265,1,0,0,0,264,262,1,0,0, - 0,265,266,5,44,0,0,266,268,3,158,79,0,267,269,3,22,11,0,268,267, - 1,0,0,0,268,269,1,0,0,0,269,270,1,0,0,0,270,271,5,84,0,0,271,272, - 3,160,80,0,272,273,5,77,0,0,273,283,3,160,80,0,274,275,5,89,0,0, - 275,280,3,26,13,0,276,277,5,135,0,0,277,279,3,26,13,0,278,276,1, - 0,0,0,279,282,1,0,0,0,280,278,1,0,0,0,280,281,1,0,0,0,281,284,1, - 0,0,0,282,280,1,0,0,0,283,274,1,0,0,0,283,284,1,0,0,0,284,285,1, - 0,0,0,285,289,5,137,0,0,286,288,3,34,17,0,287,286,1,0,0,0,288,291, - 1,0,0,0,289,287,1,0,0,0,289,290,1,0,0,0,290,292,1,0,0,0,291,289, - 1,0,0,0,292,293,5,138,0,0,293,21,1,0,0,0,294,295,5,143,0,0,295,300, - 3,24,12,0,296,297,5,135,0,0,297,299,3,24,12,0,298,296,1,0,0,0,299, - 302,1,0,0,0,300,298,1,0,0,0,300,301,1,0,0,0,301,303,1,0,0,0,302, - 300,1,0,0,0,303,304,5,144,0,0,304,23,1,0,0,0,305,306,5,47,0,0,306, - 309,3,158,79,0,307,308,5,133,0,0,308,310,5,37,0,0,309,307,1,0,0, - 0,309,310,1,0,0,0,310,325,1,0,0,0,311,312,5,36,0,0,312,322,3,158, - 79,0,313,314,5,38,0,0,314,319,3,26,13,0,315,316,5,145,0,0,316,318, - 3,26,13,0,317,315,1,0,0,0,318,321,1,0,0,0,319,317,1,0,0,0,319,320, - 1,0,0,0,320,323,1,0,0,0,321,319,1,0,0,0,322,313,1,0,0,0,322,323, - 1,0,0,0,323,325,1,0,0,0,324,305,1,0,0,0,324,311,1,0,0,0,325,25,1, - 0,0,0,326,328,3,158,79,0,327,329,3,28,14,0,328,327,1,0,0,0,328,329, - 1,0,0,0,329,27,1,0,0,0,330,331,5,143,0,0,331,336,3,30,15,0,332,333, - 5,135,0,0,333,335,3,30,15,0,334,332,1,0,0,0,335,338,1,0,0,0,336, - 334,1,0,0,0,336,337,1,0,0,0,337,339,1,0,0,0,338,336,1,0,0,0,339, - 340,5,144,0,0,340,29,1,0,0,0,341,342,5,43,0,0,342,349,3,158,79,0, - 343,344,5,44,0,0,344,349,3,26,13,0,345,346,5,36,0,0,346,349,3,158, - 79,0,347,349,3,142,71,0,348,341,1,0,0,0,348,343,1,0,0,0,348,345, - 1,0,0,0,348,347,1,0,0,0,349,31,1,0,0,0,350,351,5,35,0,0,351,353, - 3,158,79,0,352,354,3,22,11,0,353,352,1,0,0,0,353,354,1,0,0,0,354, - 355,1,0,0,0,355,356,5,146,0,0,356,357,3,142,71,0,357,358,5,134,0, - 0,358,33,1,0,0,0,359,364,3,40,20,0,360,364,3,44,22,0,361,364,3,38, - 19,0,362,364,3,36,18,0,363,359,1,0,0,0,363,360,1,0,0,0,363,361,1, - 0,0,0,363,362,1,0,0,0,364,35,1,0,0,0,365,366,5,2,0,0,366,367,3,158, - 79,0,367,368,5,84,0,0,368,369,3,160,80,0,369,370,5,3,0,0,370,373, - 3,160,80,0,371,372,5,5,0,0,372,374,3,50,25,0,373,371,1,0,0,0,373, - 374,1,0,0,0,374,375,1,0,0,0,375,376,5,134,0,0,376,37,1,0,0,0,377, - 379,5,57,0,0,378,377,1,0,0,0,378,379,1,0,0,0,379,380,1,0,0,0,380, - 381,5,49,0,0,381,382,3,158,79,0,382,383,5,84,0,0,383,384,3,160,80, - 0,384,385,5,133,0,0,385,386,3,142,71,0,386,387,5,132,0,0,387,388, - 3,142,71,0,388,389,5,137,0,0,389,390,5,101,0,0,390,391,5,84,0,0, - 391,393,3,160,80,0,392,394,3,72,36,0,393,392,1,0,0,0,393,394,1,0, - 0,0,394,395,1,0,0,0,395,396,5,134,0,0,396,397,5,138,0,0,397,39,1, - 0,0,0,398,400,3,46,23,0,399,398,1,0,0,0,399,400,1,0,0,0,400,401, - 1,0,0,0,401,402,5,47,0,0,402,403,3,158,79,0,403,404,5,84,0,0,404, - 405,3,160,80,0,405,406,5,133,0,0,406,407,3,142,71,0,407,411,5,137, - 0,0,408,410,3,42,21,0,409,408,1,0,0,0,410,413,1,0,0,0,411,409,1, - 0,0,0,411,412,1,0,0,0,412,414,1,0,0,0,413,411,1,0,0,0,414,415,5, - 138,0,0,415,41,1,0,0,0,416,417,5,91,0,0,417,418,5,84,0,0,418,420, - 3,160,80,0,419,421,3,72,36,0,420,419,1,0,0,0,420,421,1,0,0,0,421, - 422,1,0,0,0,422,423,5,134,0,0,423,450,1,0,0,0,424,425,5,92,0,0,425, - 426,5,84,0,0,426,428,3,160,80,0,427,429,3,72,36,0,428,427,1,0,0, - 0,428,429,1,0,0,0,429,430,1,0,0,0,430,431,5,134,0,0,431,450,1,0, - 0,0,432,433,5,1,0,0,433,434,5,84,0,0,434,436,3,160,80,0,435,437, - 3,72,36,0,436,435,1,0,0,0,436,437,1,0,0,0,437,438,1,0,0,0,438,439, - 5,134,0,0,439,450,1,0,0,0,440,441,5,93,0,0,441,442,5,94,0,0,442, - 443,5,84,0,0,443,444,3,160,80,0,444,445,5,95,0,0,445,446,5,84,0, - 0,446,447,3,160,80,0,447,448,5,134,0,0,448,450,1,0,0,0,449,416,1, - 0,0,0,449,424,1,0,0,0,449,432,1,0,0,0,449,440,1,0,0,0,450,43,1,0, - 0,0,451,453,3,46,23,0,452,451,1,0,0,0,452,453,1,0,0,0,453,454,1, - 0,0,0,454,455,5,48,0,0,455,456,3,158,79,0,456,457,5,84,0,0,457,458, - 3,160,80,0,458,459,5,133,0,0,459,460,3,148,74,0,460,462,3,50,25, - 0,461,463,5,112,0,0,462,461,1,0,0,0,462,463,1,0,0,0,463,466,1,0, - 0,0,464,465,5,82,0,0,465,467,3,160,80,0,466,464,1,0,0,0,466,467, - 1,0,0,0,467,468,1,0,0,0,468,472,5,137,0,0,469,471,3,48,24,0,470, - 469,1,0,0,0,471,474,1,0,0,0,472,470,1,0,0,0,472,473,1,0,0,0,473, - 475,1,0,0,0,474,472,1,0,0,0,475,476,5,138,0,0,476,45,1,0,0,0,477, - 479,5,32,0,0,478,480,7,0,0,0,479,478,1,0,0,0,479,480,1,0,0,0,480, - 47,1,0,0,0,481,482,5,98,0,0,482,483,5,84,0,0,483,485,3,160,80,0, - 484,486,3,72,36,0,485,484,1,0,0,0,485,486,1,0,0,0,486,487,1,0,0, - 0,487,488,5,134,0,0,488,515,1,0,0,0,489,490,5,99,0,0,490,491,5,84, - 0,0,491,493,3,160,80,0,492,494,3,72,36,0,493,492,1,0,0,0,493,494, - 1,0,0,0,494,495,1,0,0,0,495,496,5,134,0,0,496,515,1,0,0,0,497,498, - 5,100,0,0,498,499,5,84,0,0,499,501,3,160,80,0,500,502,3,72,36,0, - 501,500,1,0,0,0,501,502,1,0,0,0,502,503,1,0,0,0,503,504,5,134,0, - 0,504,515,1,0,0,0,505,506,5,93,0,0,506,507,5,94,0,0,507,508,5,84, - 0,0,508,509,3,160,80,0,509,510,5,95,0,0,510,511,5,84,0,0,511,512, - 3,160,80,0,512,513,5,134,0,0,513,515,1,0,0,0,514,481,1,0,0,0,514, - 489,1,0,0,0,514,497,1,0,0,0,514,505,1,0,0,0,515,49,1,0,0,0,516,517, - 5,43,0,0,517,526,3,158,79,0,518,519,5,44,0,0,519,521,3,158,79,0, - 520,522,3,28,14,0,521,520,1,0,0,0,521,522,1,0,0,0,522,526,1,0,0, - 0,523,524,5,36,0,0,524,526,3,158,79,0,525,516,1,0,0,0,525,518,1, - 0,0,0,525,523,1,0,0,0,526,51,1,0,0,0,527,529,3,16,8,0,528,527,1, - 0,0,0,529,532,1,0,0,0,530,528,1,0,0,0,530,531,1,0,0,0,531,533,1, - 0,0,0,532,530,1,0,0,0,533,534,5,46,0,0,534,535,3,158,79,0,535,536, - 5,84,0,0,536,537,3,160,80,0,537,538,5,77,0,0,538,541,3,160,80,0, - 539,540,5,78,0,0,540,542,5,147,0,0,541,539,1,0,0,0,541,542,1,0,0, - 0,542,543,1,0,0,0,543,547,5,137,0,0,544,546,3,54,27,0,545,544,1, - 0,0,0,546,549,1,0,0,0,547,545,1,0,0,0,547,548,1,0,0,0,548,550,1, - 0,0,0,549,547,1,0,0,0,550,551,5,138,0,0,551,53,1,0,0,0,552,559,3, - 66,33,0,553,559,3,68,34,0,554,559,3,76,38,0,555,559,3,60,30,0,556, - 559,3,62,31,0,557,559,3,56,28,0,558,552,1,0,0,0,558,553,1,0,0,0, - 558,554,1,0,0,0,558,555,1,0,0,0,558,556,1,0,0,0,558,557,1,0,0,0, - 559,55,1,0,0,0,560,561,5,2,0,0,561,562,3,158,79,0,562,563,5,84,0, - 0,563,564,3,160,80,0,564,565,5,38,0,0,565,566,3,26,13,0,566,567, - 5,136,0,0,567,568,3,158,79,0,568,569,5,134,0,0,569,57,1,0,0,0,570, - 571,5,4,0,0,571,572,3,158,79,0,572,573,5,84,0,0,573,574,3,160,80, - 0,574,575,5,6,0,0,575,576,3,26,13,0,576,577,5,65,0,0,577,578,3,158, - 79,0,578,579,5,136,0,0,579,580,3,158,79,0,580,581,5,134,0,0,581, - 59,1,0,0,0,582,583,5,22,0,0,583,585,3,158,79,0,584,586,3,22,11,0, - 585,584,1,0,0,0,585,586,1,0,0,0,586,587,1,0,0,0,587,588,5,84,0,0, - 588,589,3,160,80,0,589,591,5,25,0,0,590,592,5,9,0,0,591,590,1,0, - 0,0,591,592,1,0,0,0,592,593,1,0,0,0,593,594,3,26,13,0,594,595,5, - 26,0,0,595,596,3,160,80,0,596,597,5,49,0,0,597,598,3,160,80,0,598, - 602,5,137,0,0,599,601,3,64,32,0,600,599,1,0,0,0,601,604,1,0,0,0, - 602,600,1,0,0,0,602,603,1,0,0,0,603,605,1,0,0,0,604,602,1,0,0,0, - 605,606,5,138,0,0,606,61,1,0,0,0,607,608,5,22,0,0,608,609,3,158, - 79,0,609,610,5,84,0,0,610,611,3,160,80,0,611,612,5,24,0,0,612,613, - 3,158,79,0,613,614,3,28,14,0,614,615,5,134,0,0,615,63,1,0,0,0,616, - 617,5,16,0,0,617,657,5,134,0,0,618,619,5,17,0,0,619,620,5,18,0,0, - 620,621,3,158,79,0,621,622,5,134,0,0,622,657,1,0,0,0,623,624,5,27, - 0,0,624,625,3,160,80,0,625,626,5,134,0,0,626,657,1,0,0,0,627,629, - 5,28,0,0,628,630,5,36,0,0,629,628,1,0,0,0,629,630,1,0,0,0,630,631, - 1,0,0,0,631,632,3,158,79,0,632,633,5,55,0,0,633,634,3,26,13,0,634, - 635,5,134,0,0,635,657,1,0,0,0,636,637,5,29,0,0,637,638,3,158,79, - 0,638,639,5,147,0,0,639,640,5,134,0,0,640,657,1,0,0,0,641,642,5, - 30,0,0,642,643,3,26,13,0,643,644,5,136,0,0,644,645,3,158,79,0,645, - 646,3,158,79,0,646,647,3,160,80,0,647,648,5,134,0,0,648,657,1,0, - 0,0,649,650,5,93,0,0,650,657,5,134,0,0,651,652,5,31,0,0,652,653, - 5,147,0,0,653,654,3,160,80,0,654,655,5,134,0,0,655,657,1,0,0,0,656, - 616,1,0,0,0,656,618,1,0,0,0,656,623,1,0,0,0,656,627,1,0,0,0,656, - 636,1,0,0,0,656,641,1,0,0,0,656,649,1,0,0,0,656,651,1,0,0,0,657, - 65,1,0,0,0,658,659,5,49,0,0,659,661,3,158,79,0,660,662,3,22,11,0, - 661,660,1,0,0,0,661,662,1,0,0,0,662,663,1,0,0,0,663,664,5,84,0,0, - 664,665,3,160,80,0,665,666,5,133,0,0,666,667,3,142,71,0,667,668, - 5,132,0,0,668,669,3,142,71,0,669,670,5,86,0,0,670,672,3,80,40,0, - 671,673,3,72,36,0,672,671,1,0,0,0,672,673,1,0,0,0,673,675,1,0,0, - 0,674,676,3,78,39,0,675,674,1,0,0,0,675,676,1,0,0,0,676,677,1,0, - 0,0,677,678,5,88,0,0,678,680,3,82,41,0,679,681,3,86,43,0,680,679, - 1,0,0,0,680,681,1,0,0,0,681,683,1,0,0,0,682,684,3,70,35,0,683,682, - 1,0,0,0,683,684,1,0,0,0,684,685,1,0,0,0,685,686,5,134,0,0,686,67, - 1,0,0,0,687,688,5,50,0,0,688,690,3,158,79,0,689,691,3,22,11,0,690, - 689,1,0,0,0,690,691,1,0,0,0,691,692,1,0,0,0,692,693,5,84,0,0,693, - 694,3,160,80,0,694,695,5,133,0,0,695,696,3,142,71,0,696,697,5,132, - 0,0,697,699,3,142,71,0,698,700,3,72,36,0,699,698,1,0,0,0,699,700, - 1,0,0,0,700,702,1,0,0,0,701,703,3,86,43,0,702,701,1,0,0,0,702,703, - 1,0,0,0,703,705,1,0,0,0,704,706,3,70,35,0,705,704,1,0,0,0,705,706, - 1,0,0,0,706,707,1,0,0,0,707,708,5,134,0,0,708,69,1,0,0,0,709,710, - 5,66,0,0,710,711,5,65,0,0,711,712,3,158,79,0,712,71,1,0,0,0,713, - 714,5,10,0,0,714,723,5,13,0,0,715,716,5,10,0,0,716,717,7,1,0,0,717, - 718,5,14,0,0,718,719,5,139,0,0,719,720,3,84,42,0,720,721,5,140,0, - 0,721,723,1,0,0,0,722,713,1,0,0,0,722,715,1,0,0,0,723,73,1,0,0,0, - 724,725,5,65,0,0,725,726,5,139,0,0,726,731,3,124,62,0,727,728,5, - 135,0,0,728,730,3,124,62,0,729,727,1,0,0,0,730,733,1,0,0,0,731,729, - 1,0,0,0,731,732,1,0,0,0,732,734,1,0,0,0,733,731,1,0,0,0,734,735, - 5,140,0,0,735,75,1,0,0,0,736,737,5,51,0,0,737,738,3,158,79,0,738, - 739,5,84,0,0,739,740,3,160,80,0,740,741,5,52,0,0,741,742,3,158,79, - 0,742,743,5,133,0,0,743,745,3,142,71,0,744,746,3,86,43,0,745,744, - 1,0,0,0,745,746,1,0,0,0,746,747,1,0,0,0,747,748,5,134,0,0,748,77, - 1,0,0,0,749,750,5,87,0,0,750,751,3,142,71,0,751,79,1,0,0,0,752,753, - 7,2,0,0,753,81,1,0,0,0,754,773,5,90,0,0,755,756,5,43,0,0,756,773, - 3,158,79,0,757,758,5,36,0,0,758,773,3,158,79,0,759,760,5,45,0,0, - 760,769,5,139,0,0,761,766,3,26,13,0,762,763,5,135,0,0,763,765,3, - 26,13,0,764,762,1,0,0,0,765,768,1,0,0,0,766,764,1,0,0,0,766,767, - 1,0,0,0,767,770,1,0,0,0,768,766,1,0,0,0,769,761,1,0,0,0,769,770, - 1,0,0,0,770,771,1,0,0,0,771,773,5,140,0,0,772,754,1,0,0,0,772,755, - 1,0,0,0,772,757,1,0,0,0,772,759,1,0,0,0,773,83,1,0,0,0,774,779,3, - 158,79,0,775,776,5,135,0,0,776,778,3,158,79,0,777,775,1,0,0,0,778, - 781,1,0,0,0,779,777,1,0,0,0,779,780,1,0,0,0,780,85,1,0,0,0,781,779, - 1,0,0,0,782,783,5,89,0,0,783,787,5,137,0,0,784,786,3,88,44,0,785, - 784,1,0,0,0,786,789,1,0,0,0,787,785,1,0,0,0,787,788,1,0,0,0,788, - 790,1,0,0,0,789,787,1,0,0,0,790,791,5,138,0,0,791,87,1,0,0,0,792, - 793,5,23,0,0,793,794,3,158,79,0,794,795,5,84,0,0,795,796,3,160,80, - 0,796,797,5,139,0,0,797,798,3,84,42,0,798,799,5,140,0,0,799,800, - 5,134,0,0,800,871,1,0,0,0,801,802,5,61,0,0,802,803,3,158,79,0,803, - 804,5,84,0,0,804,805,3,160,80,0,805,806,5,133,0,0,806,807,3,142, - 71,0,807,808,3,90,45,0,808,809,5,134,0,0,809,871,1,0,0,0,810,811, - 5,62,0,0,811,812,3,158,79,0,812,813,5,84,0,0,813,814,3,160,80,0, - 814,815,5,133,0,0,815,816,3,148,74,0,816,817,3,50,25,0,817,818,3, - 90,45,0,818,819,5,134,0,0,819,871,1,0,0,0,820,821,5,44,0,0,821,822, - 3,158,79,0,822,823,5,84,0,0,823,824,3,160,80,0,824,825,5,133,0,0, - 825,827,3,158,79,0,826,828,3,28,14,0,827,826,1,0,0,0,827,828,1,0, - 0,0,828,830,1,0,0,0,829,831,3,74,37,0,830,829,1,0,0,0,830,831,1, - 0,0,0,831,834,1,0,0,0,832,833,5,18,0,0,833,835,5,53,0,0,834,832, - 1,0,0,0,834,835,1,0,0,0,835,836,1,0,0,0,836,837,5,134,0,0,837,871, - 1,0,0,0,838,839,5,7,0,0,839,840,3,158,79,0,840,841,5,84,0,0,841, - 842,3,160,80,0,842,843,5,133,0,0,843,844,3,158,79,0,844,845,5,53, - 0,0,845,846,3,142,71,0,846,847,5,134,0,0,847,871,1,0,0,0,848,849, - 5,51,0,0,849,850,3,158,79,0,850,851,5,84,0,0,851,852,3,160,80,0, - 852,853,5,133,0,0,853,856,3,158,79,0,854,855,5,53,0,0,855,857,3, - 142,71,0,856,854,1,0,0,0,856,857,1,0,0,0,857,858,1,0,0,0,858,859, - 5,134,0,0,859,871,1,0,0,0,860,861,5,22,0,0,861,862,3,158,79,0,862, - 863,5,84,0,0,863,864,3,160,80,0,864,865,5,133,0,0,865,866,3,158, - 79,0,866,867,5,136,0,0,867,868,3,158,79,0,868,869,5,134,0,0,869, - 871,1,0,0,0,870,792,1,0,0,0,870,801,1,0,0,0,870,810,1,0,0,0,870, - 820,1,0,0,0,870,838,1,0,0,0,870,848,1,0,0,0,870,860,1,0,0,0,871, - 89,1,0,0,0,872,873,5,139,0,0,873,878,3,92,46,0,874,875,5,135,0,0, - 875,877,3,92,46,0,876,874,1,0,0,0,877,880,1,0,0,0,878,876,1,0,0, - 0,878,879,1,0,0,0,879,881,1,0,0,0,880,878,1,0,0,0,881,882,5,140, - 0,0,882,91,1,0,0,0,883,884,7,3,0,0,884,93,1,0,0,0,885,886,5,60,0, - 0,886,887,3,96,48,0,887,95,1,0,0,0,888,891,3,98,49,0,889,891,3,102, - 51,0,890,888,1,0,0,0,890,889,1,0,0,0,891,97,1,0,0,0,892,893,5,61, - 0,0,893,894,3,158,79,0,894,895,5,84,0,0,895,896,3,160,80,0,896,897, - 5,71,0,0,897,898,3,158,79,0,898,899,5,133,0,0,899,900,3,142,71,0, - 900,901,5,72,0,0,901,904,3,100,50,0,902,903,5,73,0,0,903,905,3,150, - 75,0,904,902,1,0,0,0,904,905,1,0,0,0,905,906,1,0,0,0,906,907,5,134, - 0,0,907,99,1,0,0,0,908,915,5,106,0,0,909,910,5,107,0,0,910,911,5, - 141,0,0,911,912,3,142,71,0,912,913,5,142,0,0,913,915,1,0,0,0,914, - 908,1,0,0,0,914,909,1,0,0,0,915,101,1,0,0,0,916,917,5,62,0,0,917, - 918,3,158,79,0,918,919,5,84,0,0,919,920,3,160,80,0,920,921,5,137, - 0,0,921,922,3,104,52,0,922,923,3,104,52,0,923,924,5,138,0,0,924, - 103,1,0,0,0,925,926,3,50,25,0,926,927,5,63,0,0,927,928,3,158,79, - 0,928,929,5,84,0,0,929,930,3,160,80,0,930,932,3,148,74,0,931,933, - 5,112,0,0,932,931,1,0,0,0,932,933,1,0,0,0,933,936,1,0,0,0,934,935, - 5,79,0,0,935,937,3,160,80,0,936,934,1,0,0,0,936,937,1,0,0,0,937, - 939,1,0,0,0,938,940,5,81,0,0,939,938,1,0,0,0,939,940,1,0,0,0,940, - 943,1,0,0,0,941,942,5,82,0,0,942,944,3,160,80,0,943,941,1,0,0,0, - 943,944,1,0,0,0,944,946,1,0,0,0,945,947,5,83,0,0,946,945,1,0,0,0, - 946,947,1,0,0,0,947,948,1,0,0,0,948,949,5,134,0,0,949,105,1,0,0, - 0,950,951,5,54,0,0,951,952,3,158,79,0,952,953,5,55,0,0,953,955,3, - 158,79,0,954,956,3,28,14,0,955,954,1,0,0,0,955,956,1,0,0,0,956,959, - 1,0,0,0,957,958,5,84,0,0,958,960,3,160,80,0,959,957,1,0,0,0,959, - 960,1,0,0,0,960,963,1,0,0,0,961,962,5,78,0,0,962,964,5,147,0,0,963, - 961,1,0,0,0,963,964,1,0,0,0,964,965,1,0,0,0,965,969,5,137,0,0,966, - 968,3,108,54,0,967,966,1,0,0,0,968,971,1,0,0,0,969,967,1,0,0,0,969, - 970,1,0,0,0,970,972,1,0,0,0,971,969,1,0,0,0,972,973,5,138,0,0,973, - 107,1,0,0,0,974,975,5,59,0,0,975,982,3,96,48,0,976,982,3,122,61, - 0,977,982,3,118,59,0,978,982,3,112,56,0,979,982,3,120,60,0,980,982, - 3,110,55,0,981,974,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,109,1,0,0,0,983,984, - 5,56,0,0,984,985,3,158,79,0,985,986,5,58,0,0,986,987,3,158,79,0, - 987,988,5,136,0,0,988,989,3,158,79,0,989,990,5,134,0,0,990,111,1, - 0,0,0,991,992,5,8,0,0,992,996,5,137,0,0,993,995,3,114,57,0,994,993, - 1,0,0,0,995,998,1,0,0,0,996,994,1,0,0,0,996,997,1,0,0,0,997,999, - 1,0,0,0,998,996,1,0,0,0,999,1000,5,138,0,0,1000,1001,5,134,0,0,1001, - 113,1,0,0,0,1002,1003,3,158,79,0,1003,1004,5,58,0,0,1004,1005,5, - 61,0,0,1005,1006,3,158,79,0,1006,1007,5,134,0,0,1007,1017,1,0,0, - 0,1008,1009,3,158,79,0,1009,1010,5,58,0,0,1010,1011,5,62,0,0,1011, - 1012,3,158,79,0,1012,1013,5,136,0,0,1013,1014,3,158,79,0,1014,1015, - 5,134,0,0,1015,1017,1,0,0,0,1016,1002,1,0,0,0,1016,1008,1,0,0,0, - 1017,115,1,0,0,0,1018,1019,3,26,13,0,1019,1020,5,18,0,0,1020,1025, - 5,53,0,0,1021,1022,5,136,0,0,1022,1024,3,158,79,0,1023,1021,1,0, - 0,0,1024,1027,1,0,0,0,1025,1023,1,0,0,0,1025,1026,1,0,0,0,1026,1028, - 1,0,0,0,1027,1025,1,0,0,0,1028,1029,5,134,0,0,1029,117,1,0,0,0,1030, - 1031,5,56,0,0,1031,1032,3,158,79,0,1032,1033,5,58,0,0,1033,1034, - 5,61,0,0,1034,1035,3,158,79,0,1035,1036,5,134,0,0,1036,119,1,0,0, - 0,1037,1038,5,68,0,0,1038,1039,3,158,79,0,1039,1040,5,69,0,0,1040, - 1041,5,70,0,0,1041,1042,5,65,0,0,1042,1043,5,51,0,0,1043,1044,3, - 158,79,0,1044,1045,5,67,0,0,1045,1046,5,62,0,0,1046,1047,3,158,79, - 0,1047,1048,5,136,0,0,1048,1049,3,158,79,0,1049,1050,5,134,0,0,1050, - 121,1,0,0,0,1051,1052,5,56,0,0,1052,1053,3,124,62,0,1053,1054,5, - 58,0,0,1054,1057,3,128,64,0,1055,1056,5,34,0,0,1056,1058,3,160,80, - 0,1057,1055,1,0,0,0,1057,1058,1,0,0,0,1058,1059,1,0,0,0,1059,1060, - 5,134,0,0,1060,123,1,0,0,0,1061,1062,3,158,79,0,1062,1063,5,136, - 0,0,1063,1064,3,126,63,0,1064,125,1,0,0,0,1065,1078,3,158,79,0,1066, - 1078,5,101,0,0,1067,1078,5,91,0,0,1068,1078,5,92,0,0,1069,1078,5, - 1,0,0,1070,1078,5,98,0,0,1071,1078,5,99,0,0,1072,1078,5,100,0,0, - 1073,1078,5,102,0,0,1074,1078,5,103,0,0,1075,1078,5,104,0,0,1076, - 1078,5,105,0,0,1077,1065,1,0,0,0,1077,1066,1,0,0,0,1077,1067,1,0, - 0,0,1077,1068,1,0,0,0,1077,1069,1,0,0,0,1077,1070,1,0,0,0,1077,1071, - 1,0,0,0,1077,1072,1,0,0,0,1077,1073,1,0,0,0,1077,1074,1,0,0,0,1077, - 1075,1,0,0,0,1077,1076,1,0,0,0,1078,127,1,0,0,0,1079,1080,5,80,0, - 0,1080,1081,5,136,0,0,1081,1116,3,158,79,0,1082,1083,5,61,0,0,1083, - 1084,3,158,79,0,1084,1085,5,136,0,0,1085,1086,3,132,66,0,1086,1116, - 1,0,0,0,1087,1088,5,62,0,0,1088,1089,3,158,79,0,1089,1090,5,136, - 0,0,1090,1091,3,158,79,0,1091,1092,5,136,0,0,1092,1093,3,134,67, - 0,1093,1116,1,0,0,0,1094,1095,5,44,0,0,1095,1097,3,158,79,0,1096, - 1098,3,28,14,0,1097,1096,1,0,0,0,1097,1098,1,0,0,0,1098,1099,1,0, - 0,0,1099,1100,5,136,0,0,1100,1101,3,124,62,0,1101,1116,1,0,0,0,1102, - 1103,5,46,0,0,1103,1104,3,158,79,0,1104,1105,5,136,0,0,1105,1107, - 3,158,79,0,1106,1108,3,28,14,0,1107,1106,1,0,0,0,1107,1108,1,0,0, - 0,1108,1110,1,0,0,0,1109,1111,3,136,68,0,1110,1109,1,0,0,0,1110, - 1111,1,0,0,0,1111,1113,1,0,0,0,1112,1114,3,130,65,0,1113,1112,1, - 0,0,0,1113,1114,1,0,0,0,1114,1116,1,0,0,0,1115,1079,1,0,0,0,1115, - 1082,1,0,0,0,1115,1087,1,0,0,0,1115,1094,1,0,0,0,1115,1102,1,0,0, - 0,1116,129,1,0,0,0,1117,1118,5,66,0,0,1118,1119,3,136,68,0,1119, - 131,1,0,0,0,1120,1121,7,4,0,0,1121,133,1,0,0,0,1122,1123,7,5,0,0, - 1123,135,1,0,0,0,1124,1125,5,64,0,0,1125,1129,5,137,0,0,1126,1128, - 3,138,69,0,1127,1126,1,0,0,0,1128,1131,1,0,0,0,1129,1127,1,0,0,0, - 1129,1130,1,0,0,0,1130,1132,1,0,0,0,1131,1129,1,0,0,0,1132,1133, - 5,138,0,0,1133,137,1,0,0,0,1134,1135,3,158,79,0,1135,1136,5,58,0, - 0,1136,1137,5,9,0,0,1137,1138,5,23,0,0,1138,1139,5,139,0,0,1139, - 1140,3,84,42,0,1140,1141,5,140,0,0,1141,1142,5,134,0,0,1142,1233, - 1,0,0,0,1143,1144,3,158,79,0,1144,1145,5,58,0,0,1145,1146,5,61,0, - 0,1146,1153,3,158,79,0,1147,1148,5,67,0,0,1148,1149,5,62,0,0,1149, - 1150,3,158,79,0,1150,1151,5,136,0,0,1151,1152,3,158,79,0,1152,1154, - 1,0,0,0,1153,1147,1,0,0,0,1153,1154,1,0,0,0,1154,1155,1,0,0,0,1155, - 1156,5,134,0,0,1156,1233,1,0,0,0,1157,1158,3,158,79,0,1158,1159, - 5,58,0,0,1159,1160,5,62,0,0,1160,1161,3,158,79,0,1161,1162,5,136, - 0,0,1162,1169,3,158,79,0,1163,1164,5,67,0,0,1164,1165,5,62,0,0,1165, - 1166,3,158,79,0,1166,1167,5,136,0,0,1167,1168,3,158,79,0,1168,1170, - 1,0,0,0,1169,1163,1,0,0,0,1169,1170,1,0,0,0,1170,1171,1,0,0,0,1171, - 1172,5,134,0,0,1172,1233,1,0,0,0,1173,1174,3,158,79,0,1174,1175, - 5,58,0,0,1175,1176,5,44,0,0,1176,1178,3,158,79,0,1177,1179,3,28, - 14,0,1178,1177,1,0,0,0,1178,1179,1,0,0,0,1179,1188,1,0,0,0,1180, - 1181,5,67,0,0,1181,1182,5,62,0,0,1182,1183,3,158,79,0,1183,1184, - 5,136,0,0,1184,1185,3,158,79,0,1185,1189,1,0,0,0,1186,1187,5,18, - 0,0,1187,1189,5,53,0,0,1188,1180,1,0,0,0,1188,1186,1,0,0,0,1188, - 1189,1,0,0,0,1189,1190,1,0,0,0,1190,1191,5,134,0,0,1191,1233,1,0, - 0,0,1192,1193,3,158,79,0,1193,1194,5,58,0,0,1194,1195,5,7,0,0,1195, - 1196,3,158,79,0,1196,1197,5,64,0,0,1197,1201,5,137,0,0,1198,1200, - 3,116,58,0,1199,1198,1,0,0,0,1200,1203,1,0,0,0,1201,1199,1,0,0,0, - 1201,1202,1,0,0,0,1202,1204,1,0,0,0,1203,1201,1,0,0,0,1204,1205, - 5,138,0,0,1205,1206,5,134,0,0,1206,1233,1,0,0,0,1207,1208,3,158, - 79,0,1208,1209,5,58,0,0,1209,1210,5,51,0,0,1210,1211,3,158,79,0, - 1211,1212,5,134,0,0,1212,1233,1,0,0,0,1213,1214,3,158,79,0,1214, - 1216,5,58,0,0,1215,1217,5,9,0,0,1216,1215,1,0,0,0,1216,1217,1,0, - 0,0,1217,1218,1,0,0,0,1218,1219,5,22,0,0,1219,1220,3,158,79,0,1220, - 1221,5,136,0,0,1221,1228,3,158,79,0,1222,1223,5,67,0,0,1223,1224, - 5,62,0,0,1224,1225,3,158,79,0,1225,1226,5,136,0,0,1226,1227,3,158, - 79,0,1227,1229,1,0,0,0,1228,1222,1,0,0,0,1228,1229,1,0,0,0,1229, - 1230,1,0,0,0,1230,1231,5,134,0,0,1231,1233,1,0,0,0,1232,1134,1,0, - 0,0,1232,1143,1,0,0,0,1232,1157,1,0,0,0,1232,1173,1,0,0,0,1232,1192, - 1,0,0,0,1232,1207,1,0,0,0,1232,1213,1,0,0,0,1233,139,1,0,0,0,1234, - 1235,5,51,0,0,1235,1236,3,158,79,0,1236,1237,5,58,0,0,1237,1238, - 3,158,79,0,1238,1239,5,136,0,0,1239,1241,3,158,79,0,1240,1242,3, - 136,68,0,1241,1240,1,0,0,0,1241,1242,1,0,0,0,1242,1243,1,0,0,0,1243, - 1244,5,134,0,0,1244,141,1,0,0,0,1245,1292,3,146,73,0,1246,1292,5, - 113,0,0,1247,1292,5,114,0,0,1248,1249,5,115,0,0,1249,1292,3,160, - 80,0,1250,1251,5,116,0,0,1251,1252,5,143,0,0,1252,1253,3,158,79, - 0,1253,1254,5,144,0,0,1254,1292,1,0,0,0,1255,1256,5,117,0,0,1256, - 1257,5,143,0,0,1257,1259,3,158,79,0,1258,1260,3,28,14,0,1259,1258, - 1,0,0,0,1259,1260,1,0,0,0,1260,1261,1,0,0,0,1261,1262,5,144,0,0, - 1262,1292,1,0,0,0,1263,1264,5,39,0,0,1264,1265,5,143,0,0,1265,1266, - 3,158,79,0,1266,1267,5,144,0,0,1267,1292,1,0,0,0,1268,1269,5,118, - 0,0,1269,1270,5,143,0,0,1270,1271,3,142,71,0,1271,1272,5,144,0,0, - 1272,1292,1,0,0,0,1273,1274,5,119,0,0,1274,1275,5,143,0,0,1275,1276, - 3,142,71,0,1276,1277,5,144,0,0,1277,1292,1,0,0,0,1278,1279,5,120, - 0,0,1279,1283,5,137,0,0,1280,1282,3,144,72,0,1281,1280,1,0,0,0,1282, - 1285,1,0,0,0,1283,1281,1,0,0,0,1283,1284,1,0,0,0,1284,1286,1,0,0, - 0,1285,1283,1,0,0,0,1286,1292,5,138,0,0,1287,1289,3,158,79,0,1288, - 1290,3,28,14,0,1289,1288,1,0,0,0,1289,1290,1,0,0,0,1290,1292,1,0, - 0,0,1291,1245,1,0,0,0,1291,1246,1,0,0,0,1291,1247,1,0,0,0,1291,1248, - 1,0,0,0,1291,1250,1,0,0,0,1291,1255,1,0,0,0,1291,1263,1,0,0,0,1291, - 1268,1,0,0,0,1291,1273,1,0,0,0,1291,1278,1,0,0,0,1291,1287,1,0,0, - 0,1292,143,1,0,0,0,1293,1294,3,158,79,0,1294,1295,5,133,0,0,1295, - 1296,3,142,71,0,1296,1297,5,134,0,0,1297,145,1,0,0,0,1298,1299,7, - 6,0,0,1299,147,1,0,0,0,1300,1301,7,7,0,0,1301,149,1,0,0,0,1302,1311, - 3,160,80,0,1303,1311,5,147,0,0,1304,1311,5,148,0,0,1305,1311,5,129, - 0,0,1306,1311,5,130,0,0,1307,1311,5,131,0,0,1308,1311,3,152,76,0, - 1309,1311,3,156,78,0,1310,1302,1,0,0,0,1310,1303,1,0,0,0,1310,1304, - 1,0,0,0,1310,1305,1,0,0,0,1310,1306,1,0,0,0,1310,1307,1,0,0,0,1310, - 1308,1,0,0,0,1310,1309,1,0,0,0,1311,151,1,0,0,0,1312,1321,5,137, - 0,0,1313,1318,3,154,77,0,1314,1315,5,135,0,0,1315,1317,3,154,77, - 0,1316,1314,1,0,0,0,1317,1320,1,0,0,0,1318,1316,1,0,0,0,1318,1319, - 1,0,0,0,1319,1322,1,0,0,0,1320,1318,1,0,0,0,1321,1313,1,0,0,0,1321, - 1322,1,0,0,0,1322,1323,1,0,0,0,1323,1324,5,138,0,0,1324,153,1,0, - 0,0,1325,1326,3,160,80,0,1326,1327,5,133,0,0,1327,1328,3,150,75, - 0,1328,155,1,0,0,0,1329,1338,5,139,0,0,1330,1335,3,150,75,0,1331, - 1332,5,135,0,0,1332,1334,3,150,75,0,1333,1331,1,0,0,0,1334,1337, - 1,0,0,0,1335,1333,1,0,0,0,1335,1336,1,0,0,0,1336,1339,1,0,0,0,1337, - 1335,1,0,0,0,1338,1330,1,0,0,0,1338,1339,1,0,0,0,1339,1340,1,0,0, - 0,1340,1341,5,140,0,0,1341,157,1,0,0,0,1342,1343,7,8,0,0,1343,159, - 1,0,0,0,1344,1345,5,150,0,0,1345,161,1,0,0,0,116,174,181,202,215, - 227,247,255,262,268,280,283,289,300,309,319,322,324,328,336,348, - 353,363,373,378,393,399,411,420,428,436,449,452,462,466,472,479, - 485,493,501,514,521,525,530,541,547,558,585,591,602,629,656,661, - 672,675,680,683,690,699,702,705,722,731,745,766,769,772,779,787, - 827,830,834,856,870,878,890,904,914,932,936,939,943,946,955,959, - 963,969,981,996,1016,1025,1057,1077,1097,1107,1110,1113,1115,1129, - 1153,1169,1178,1188,1201,1216,1228,1232,1241,1259,1283,1289,1291, - 1310,1318,1321,1335,1338 + 78,2,79,7,79,2,80,7,80,2,81,7,81,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, + 1,0,1,0,1,0,1,0,3,0,177,8,0,1,1,1,1,1,1,5,1,182,8,1,10,1,12,1,185, + 9,1,1,1,1,1,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3, + 1,3,5,3,203,8,3,10,3,12,3,206,9,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1, + 4,1,4,1,4,3,4,218,8,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,3, + 5,230,8,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1, + 7,1,8,1,8,1,8,1,8,3,8,250,8,8,1,9,1,9,1,9,1,9,1,9,1,9,3,9,258,8, + 9,1,9,1,9,1,10,5,10,263,8,10,10,10,12,10,266,9,10,1,10,1,10,1,10, + 3,10,271,8,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,5,10,281,8, + 10,10,10,12,10,284,9,10,3,10,286,8,10,1,10,1,10,5,10,290,8,10,10, + 10,12,10,293,9,10,1,10,1,10,1,11,1,11,1,11,1,11,5,11,301,8,11,10, + 11,12,11,304,9,11,1,11,1,11,1,12,1,12,1,12,1,12,3,12,312,8,12,1, + 12,1,12,1,12,1,12,1,12,1,12,5,12,320,8,12,10,12,12,12,323,9,12,3, + 12,325,8,12,3,12,327,8,12,1,13,1,13,3,13,331,8,13,1,14,1,14,1,14, + 1,14,5,14,337,8,14,10,14,12,14,340,9,14,1,14,1,14,1,15,1,15,1,15, + 1,15,1,15,1,15,1,15,3,15,351,8,15,1,16,1,16,1,16,3,16,356,8,16,1, + 16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,3,17,366,8,17,1,18,1,18,1, + 18,1,18,1,18,1,18,1,18,1,18,3,18,376,8,18,1,18,1,18,1,19,3,19,381, + 8,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19, + 1,19,3,19,396,8,19,1,19,1,19,1,19,1,20,3,20,402,8,20,1,20,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,5,20,412,8,20,10,20,12,20,415,9,20,1, + 20,1,20,1,21,1,21,1,21,1,21,3,21,423,8,21,1,21,1,21,1,21,1,21,1, + 21,1,21,3,21,431,8,21,1,21,1,21,1,21,1,21,1,21,1,21,3,21,439,8,21, + 1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,3,21,452, + 8,21,1,22,3,22,455,8,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22, + 3,22,465,8,22,1,22,1,22,3,22,469,8,22,1,22,1,22,5,22,473,8,22,10, + 22,12,22,476,9,22,1,22,1,22,1,23,1,23,3,23,482,8,23,1,24,1,24,1, + 24,1,24,3,24,488,8,24,1,24,1,24,1,24,1,24,1,24,1,24,3,24,496,8,24, + 1,24,1,24,1,24,1,24,1,24,1,24,3,24,504,8,24,1,24,1,24,1,24,1,24, + 1,24,1,24,1,24,1,24,1,24,1,24,1,24,3,24,517,8,24,1,25,1,25,1,25, + 1,25,1,25,3,25,524,8,25,1,25,1,25,3,25,528,8,25,1,26,5,26,531,8, + 26,10,26,12,26,534,9,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26, + 3,26,544,8,26,1,26,1,26,5,26,548,8,26,10,26,12,26,551,9,26,1,26, + 1,26,1,27,1,27,1,27,1,27,1,27,1,27,3,27,561,8,27,1,28,1,28,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,29,1,29,1,29,1,29,1,29,1,29,1,30,1,30,3,30,587,8,30,1,30,1,30, + 3,30,591,8,30,1,30,1,30,1,30,1,30,3,30,597,8,30,1,30,1,30,1,30,1, + 30,1,30,1,30,1,30,5,30,606,8,30,10,30,12,30,609,9,30,1,30,1,30,1, + 30,1,30,1,30,1,30,3,30,617,8,30,1,30,1,30,5,30,621,8,30,10,30,12, + 30,624,9,30,1,30,1,30,3,30,628,8,30,3,30,630,8,30,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,32,1,32,1,32, + 1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,5,32,659, + 8,32,10,32,12,32,662,9,32,1,32,3,32,665,8,32,1,32,1,32,1,32,1,32, + 3,32,671,8,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32, + 1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32, + 1,32,1,32,3,32,698,8,32,1,33,1,33,1,33,1,33,1,33,1,34,1,34,1,34, + 3,34,708,8,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,3,34, + 719,8,34,1,34,3,34,722,8,34,1,34,1,34,1,34,3,34,727,8,34,1,34,3, + 34,730,8,34,1,34,1,34,1,35,1,35,1,35,3,35,737,8,35,1,35,1,35,1,35, + 1,35,1,35,1,35,1,35,3,35,746,8,35,1,35,3,35,749,8,35,1,35,3,35,752, + 8,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,37,1,37,1,37,3,37,769,8,37,1,38,1,38,1,38,1,38,1,38,5,38,776,8, + 38,10,38,12,38,779,9,38,1,38,1,38,1,39,1,39,1,39,1,39,1,39,1,39, + 1,39,1,39,1,39,3,39,792,8,39,1,39,1,39,1,40,1,40,1,40,1,41,1,41, + 1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,5,42,811,8,42, + 10,42,12,42,814,9,42,3,42,816,8,42,1,42,3,42,819,8,42,1,43,1,43, + 1,43,5,43,824,8,43,10,43,12,43,827,9,43,1,44,1,44,1,44,5,44,832, + 8,44,10,44,12,44,835,9,44,1,44,1,44,1,45,1,45,1,45,1,45,1,45,1,45, + 1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45, + 1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45, + 1,45,1,45,1,45,3,45,874,8,45,1,45,3,45,877,8,45,1,45,1,45,3,45,881, + 8,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45, + 1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,3,45,903,8,45,1,45,1,45, + 1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,3,45,917,8,45, + 1,46,1,46,1,46,1,46,5,46,923,8,46,10,46,12,46,926,9,46,1,46,1,46, + 1,47,1,47,1,48,1,48,1,48,1,49,1,49,3,49,937,8,49,1,50,1,50,1,50, + 1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,3,50,951,8,50,1,50, + 1,50,1,51,1,51,1,51,1,51,1,51,1,51,3,51,961,8,51,1,52,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,53,1,53, + 3,53,979,8,53,1,53,1,53,3,53,983,8,53,1,53,3,53,986,8,53,1,53,1, + 53,3,53,990,8,53,1,53,3,53,993,8,53,1,53,1,53,1,54,1,54,1,54,1,54, + 1,54,3,54,1002,8,54,1,54,1,54,3,54,1006,8,54,1,54,1,54,3,54,1010, + 8,54,1,54,1,54,5,54,1014,8,54,10,54,12,54,1017,9,54,1,54,1,54,1, + 55,1,55,1,55,1,55,1,55,1,55,1,55,3,55,1028,8,55,1,56,1,56,1,56,1, + 56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,5,57,1041,8,57,10,57,12,57, + 1044,9,57,1,57,1,57,1,57,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,1063,8,58,1,59,1,59,1,59,1,59, + 1,59,5,59,1070,8,59,10,59,12,59,1073,9,59,1,59,1,59,1,60,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,61,1, + 61,1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,62,3,62,1104, + 8,62,1,62,1,62,1,63,1,63,1,63,1,63,1,64,1,64,1,64,1,64,1,64,1,64, + 1,64,1,64,1,64,1,64,1,64,1,64,3,64,1124,8,64,1,65,1,65,1,65,1,65, + 1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65, + 1,65,3,65,1144,8,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65, + 1154,8,65,1,65,3,65,1157,8,65,1,65,3,65,1160,8,65,3,65,1162,8,65, + 1,66,1,66,1,66,1,67,1,67,1,68,1,68,1,69,1,69,1,69,5,69,1174,8,69, + 10,69,12,69,1177,9,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,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,3, + 70,1200,8,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1, + 70,1,70,1,70,1,70,3,70,1216,8,70,1,70,1,70,1,70,1,70,1,70,1,70,1, + 70,3,70,1225,8,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,3,70,1235, + 8,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,5,70,1246,8,70, + 10,70,12,70,1249,9,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1, + 70,1,70,1,70,1,70,3,70,1263,8,70,1,70,1,70,1,70,1,70,1,70,1,70,1, + 70,1,70,1,70,1,70,3,70,1275,8,70,1,70,1,70,3,70,1279,8,70,1,71,1, + 71,1,71,1,71,1,71,1,71,1,71,3,71,1288,8,71,1,71,1,71,1,72,1,72,1, + 72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,3,72,1306, + 8,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72, + 1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,5,72,1328,8,72,10,72,12, + 72,1331,9,72,1,72,1,72,1,72,3,72,1336,8,72,3,72,1338,8,72,1,73,1, + 73,1,73,1,73,1,73,1,74,1,74,1,75,1,75,1,76,1,76,1,76,1,76,1,76,1, + 76,1,76,1,76,3,76,1357,8,76,1,77,1,77,1,77,1,77,5,77,1363,8,77,10, + 77,12,77,1366,9,77,3,77,1368,8,77,1,77,1,77,1,78,1,78,1,78,1,78, + 1,79,1,79,1,79,1,79,5,79,1380,8,79,10,79,12,79,1383,9,79,3,79,1385, + 8,79,1,79,1,79,1,80,1,80,1,81,1,81,1,81,0,0,82,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,0,9, + 2,0,15,15,33,33,1,0,11,12,1,0,101,105,3,0,1,1,96,100,102,103,3,0, + 1,1,96,97,102,103,2,0,98,100,102,103,1,0,121,128,1,0,108,111,9,0, + 1,1,4,8,10,33,40,40,45,45,74,74,94,95,106,106,149,149,1508,0,176, + 1,0,0,0,2,178,1,0,0,0,4,188,1,0,0,0,6,192,1,0,0,0,8,217,1,0,0,0, + 10,229,1,0,0,0,12,231,1,0,0,0,14,238,1,0,0,0,16,249,1,0,0,0,18,251, + 1,0,0,0,20,264,1,0,0,0,22,296,1,0,0,0,24,326,1,0,0,0,26,328,1,0, + 0,0,28,332,1,0,0,0,30,350,1,0,0,0,32,352,1,0,0,0,34,365,1,0,0,0, + 36,367,1,0,0,0,38,380,1,0,0,0,40,401,1,0,0,0,42,451,1,0,0,0,44,454, + 1,0,0,0,46,479,1,0,0,0,48,516,1,0,0,0,50,527,1,0,0,0,52,532,1,0, + 0,0,54,560,1,0,0,0,56,562,1,0,0,0,58,572,1,0,0,0,60,584,1,0,0,0, + 62,631,1,0,0,0,64,697,1,0,0,0,66,699,1,0,0,0,68,704,1,0,0,0,70,733, + 1,0,0,0,72,755,1,0,0,0,74,768,1,0,0,0,76,770,1,0,0,0,78,782,1,0, + 0,0,80,795,1,0,0,0,82,798,1,0,0,0,84,818,1,0,0,0,86,820,1,0,0,0, + 88,828,1,0,0,0,90,916,1,0,0,0,92,918,1,0,0,0,94,929,1,0,0,0,96,931, + 1,0,0,0,98,936,1,0,0,0,100,938,1,0,0,0,102,960,1,0,0,0,104,962,1, + 0,0,0,106,971,1,0,0,0,108,996,1,0,0,0,110,1027,1,0,0,0,112,1029, + 1,0,0,0,114,1037,1,0,0,0,116,1062,1,0,0,0,118,1064,1,0,0,0,120,1076, + 1,0,0,0,122,1083,1,0,0,0,124,1097,1,0,0,0,126,1107,1,0,0,0,128,1123, + 1,0,0,0,130,1161,1,0,0,0,132,1163,1,0,0,0,134,1166,1,0,0,0,136,1168, + 1,0,0,0,138,1170,1,0,0,0,140,1278,1,0,0,0,142,1280,1,0,0,0,144,1337, + 1,0,0,0,146,1339,1,0,0,0,148,1344,1,0,0,0,150,1346,1,0,0,0,152,1356, + 1,0,0,0,154,1358,1,0,0,0,156,1371,1,0,0,0,158,1375,1,0,0,0,160,1388, + 1,0,0,0,162,1390,1,0,0,0,164,165,3,6,3,0,165,166,5,0,0,1,166,177, + 1,0,0,0,167,168,3,20,10,0,168,169,5,0,0,1,169,177,1,0,0,0,170,171, + 3,52,26,0,171,172,5,0,0,1,172,177,1,0,0,0,173,174,3,2,1,0,174,175, + 5,0,0,1,175,177,1,0,0,0,176,164,1,0,0,0,176,167,1,0,0,0,176,170, + 1,0,0,0,176,173,1,0,0,0,177,1,1,0,0,0,178,179,5,40,0,0,179,183,5, + 137,0,0,180,182,3,8,4,0,181,180,1,0,0,0,182,185,1,0,0,0,183,181, + 1,0,0,0,183,184,1,0,0,0,184,186,1,0,0,0,185,183,1,0,0,0,186,187, + 5,138,0,0,187,3,1,0,0,0,188,189,5,41,0,0,189,190,3,162,81,0,190, + 191,5,134,0,0,191,5,1,0,0,0,192,193,5,9,0,0,193,194,3,160,80,0,194, + 195,5,84,0,0,195,196,3,162,81,0,196,197,5,77,0,0,197,198,3,162,81, + 0,198,199,5,76,0,0,199,200,3,162,81,0,200,204,5,137,0,0,201,203, + 3,8,4,0,202,201,1,0,0,0,203,206,1,0,0,0,204,202,1,0,0,0,204,205, + 1,0,0,0,205,207,1,0,0,0,206,204,1,0,0,0,207,208,5,138,0,0,208,7, + 1,0,0,0,209,218,3,4,2,0,210,218,3,18,9,0,211,218,3,10,5,0,212,218, + 3,96,48,0,213,218,3,108,54,0,214,218,3,142,71,0,215,218,3,58,29, + 0,216,218,3,32,16,0,217,209,1,0,0,0,217,210,1,0,0,0,217,211,1,0, + 0,0,217,212,1,0,0,0,217,213,1,0,0,0,217,214,1,0,0,0,217,215,1,0, + 0,0,217,216,1,0,0,0,218,9,1,0,0,0,219,220,5,41,0,0,220,221,5,44, + 0,0,221,222,3,160,80,0,222,223,5,134,0,0,223,230,1,0,0,0,224,225, + 5,41,0,0,225,226,5,46,0,0,226,227,3,160,80,0,227,228,5,134,0,0,228, + 230,1,0,0,0,229,219,1,0,0,0,229,224,1,0,0,0,230,11,1,0,0,0,231,232, + 5,42,0,0,232,233,5,43,0,0,233,234,3,160,80,0,234,235,5,84,0,0,235, + 236,3,162,81,0,236,237,5,134,0,0,237,13,1,0,0,0,238,239,5,42,0,0, + 239,240,5,44,0,0,240,241,3,160,80,0,241,242,5,77,0,0,242,243,3,162, + 81,0,243,244,5,134,0,0,244,15,1,0,0,0,245,250,3,10,5,0,246,250,3, + 12,6,0,247,250,3,14,7,0,248,250,3,32,16,0,249,245,1,0,0,0,249,246, + 1,0,0,0,249,247,1,0,0,0,249,248,1,0,0,0,250,17,1,0,0,0,251,252,5, + 43,0,0,252,253,3,160,80,0,253,254,5,84,0,0,254,257,3,162,81,0,255, + 256,5,85,0,0,256,258,3,162,81,0,257,255,1,0,0,0,257,258,1,0,0,0, + 258,259,1,0,0,0,259,260,5,134,0,0,260,19,1,0,0,0,261,263,3,16,8, + 0,262,261,1,0,0,0,263,266,1,0,0,0,264,262,1,0,0,0,264,265,1,0,0, + 0,265,267,1,0,0,0,266,264,1,0,0,0,267,268,5,44,0,0,268,270,3,160, + 80,0,269,271,3,22,11,0,270,269,1,0,0,0,270,271,1,0,0,0,271,272,1, + 0,0,0,272,273,5,84,0,0,273,274,3,162,81,0,274,275,5,77,0,0,275,285, + 3,162,81,0,276,277,5,89,0,0,277,282,3,26,13,0,278,279,5,135,0,0, + 279,281,3,26,13,0,280,278,1,0,0,0,281,284,1,0,0,0,282,280,1,0,0, + 0,282,283,1,0,0,0,283,286,1,0,0,0,284,282,1,0,0,0,285,276,1,0,0, + 0,285,286,1,0,0,0,286,287,1,0,0,0,287,291,5,137,0,0,288,290,3,34, + 17,0,289,288,1,0,0,0,290,293,1,0,0,0,291,289,1,0,0,0,291,292,1,0, + 0,0,292,294,1,0,0,0,293,291,1,0,0,0,294,295,5,138,0,0,295,21,1,0, + 0,0,296,297,5,143,0,0,297,302,3,24,12,0,298,299,5,135,0,0,299,301, + 3,24,12,0,300,298,1,0,0,0,301,304,1,0,0,0,302,300,1,0,0,0,302,303, + 1,0,0,0,303,305,1,0,0,0,304,302,1,0,0,0,305,306,5,144,0,0,306,23, + 1,0,0,0,307,308,5,47,0,0,308,311,3,160,80,0,309,310,5,133,0,0,310, + 312,5,37,0,0,311,309,1,0,0,0,311,312,1,0,0,0,312,327,1,0,0,0,313, + 314,5,36,0,0,314,324,3,160,80,0,315,316,5,38,0,0,316,321,3,26,13, + 0,317,318,5,145,0,0,318,320,3,26,13,0,319,317,1,0,0,0,320,323,1, + 0,0,0,321,319,1,0,0,0,321,322,1,0,0,0,322,325,1,0,0,0,323,321,1, + 0,0,0,324,315,1,0,0,0,324,325,1,0,0,0,325,327,1,0,0,0,326,307,1, + 0,0,0,326,313,1,0,0,0,327,25,1,0,0,0,328,330,3,160,80,0,329,331, + 3,28,14,0,330,329,1,0,0,0,330,331,1,0,0,0,331,27,1,0,0,0,332,333, + 5,143,0,0,333,338,3,30,15,0,334,335,5,135,0,0,335,337,3,30,15,0, + 336,334,1,0,0,0,337,340,1,0,0,0,338,336,1,0,0,0,338,339,1,0,0,0, + 339,341,1,0,0,0,340,338,1,0,0,0,341,342,5,144,0,0,342,29,1,0,0,0, + 343,344,5,43,0,0,344,351,3,160,80,0,345,346,5,44,0,0,346,351,3,26, + 13,0,347,348,5,36,0,0,348,351,3,160,80,0,349,351,3,144,72,0,350, + 343,1,0,0,0,350,345,1,0,0,0,350,347,1,0,0,0,350,349,1,0,0,0,351, + 31,1,0,0,0,352,353,5,35,0,0,353,355,3,160,80,0,354,356,3,22,11,0, + 355,354,1,0,0,0,355,356,1,0,0,0,356,357,1,0,0,0,357,358,5,146,0, + 0,358,359,3,144,72,0,359,360,5,134,0,0,360,33,1,0,0,0,361,366,3, + 40,20,0,362,366,3,44,22,0,363,366,3,38,19,0,364,366,3,36,18,0,365, + 361,1,0,0,0,365,362,1,0,0,0,365,363,1,0,0,0,365,364,1,0,0,0,366, + 35,1,0,0,0,367,368,5,2,0,0,368,369,3,160,80,0,369,370,5,84,0,0,370, + 371,3,162,81,0,371,372,5,3,0,0,372,375,3,162,81,0,373,374,5,5,0, + 0,374,376,3,50,25,0,375,373,1,0,0,0,375,376,1,0,0,0,376,377,1,0, + 0,0,377,378,5,134,0,0,378,37,1,0,0,0,379,381,5,57,0,0,380,379,1, + 0,0,0,380,381,1,0,0,0,381,382,1,0,0,0,382,383,5,49,0,0,383,384,3, + 160,80,0,384,385,5,84,0,0,385,386,3,162,81,0,386,387,5,133,0,0,387, + 388,3,144,72,0,388,389,5,132,0,0,389,390,3,144,72,0,390,391,5,137, + 0,0,391,392,5,101,0,0,392,393,5,84,0,0,393,395,3,162,81,0,394,396, + 3,74,37,0,395,394,1,0,0,0,395,396,1,0,0,0,396,397,1,0,0,0,397,398, + 5,134,0,0,398,399,5,138,0,0,399,39,1,0,0,0,400,402,3,46,23,0,401, + 400,1,0,0,0,401,402,1,0,0,0,402,403,1,0,0,0,403,404,5,47,0,0,404, + 405,3,160,80,0,405,406,5,84,0,0,406,407,3,162,81,0,407,408,5,133, + 0,0,408,409,3,144,72,0,409,413,5,137,0,0,410,412,3,42,21,0,411,410, + 1,0,0,0,412,415,1,0,0,0,413,411,1,0,0,0,413,414,1,0,0,0,414,416, + 1,0,0,0,415,413,1,0,0,0,416,417,5,138,0,0,417,41,1,0,0,0,418,419, + 5,91,0,0,419,420,5,84,0,0,420,422,3,162,81,0,421,423,3,74,37,0,422, + 421,1,0,0,0,422,423,1,0,0,0,423,424,1,0,0,0,424,425,5,134,0,0,425, + 452,1,0,0,0,426,427,5,92,0,0,427,428,5,84,0,0,428,430,3,162,81,0, + 429,431,3,74,37,0,430,429,1,0,0,0,430,431,1,0,0,0,431,432,1,0,0, + 0,432,433,5,134,0,0,433,452,1,0,0,0,434,435,5,1,0,0,435,436,5,84, + 0,0,436,438,3,162,81,0,437,439,3,74,37,0,438,437,1,0,0,0,438,439, + 1,0,0,0,439,440,1,0,0,0,440,441,5,134,0,0,441,452,1,0,0,0,442,443, + 5,93,0,0,443,444,5,94,0,0,444,445,5,84,0,0,445,446,3,162,81,0,446, + 447,5,95,0,0,447,448,5,84,0,0,448,449,3,162,81,0,449,450,5,134,0, + 0,450,452,1,0,0,0,451,418,1,0,0,0,451,426,1,0,0,0,451,434,1,0,0, + 0,451,442,1,0,0,0,452,43,1,0,0,0,453,455,3,46,23,0,454,453,1,0,0, + 0,454,455,1,0,0,0,455,456,1,0,0,0,456,457,5,48,0,0,457,458,3,160, + 80,0,458,459,5,84,0,0,459,460,3,162,81,0,460,461,5,133,0,0,461,462, + 3,150,75,0,462,464,3,50,25,0,463,465,5,112,0,0,464,463,1,0,0,0,464, + 465,1,0,0,0,465,468,1,0,0,0,466,467,5,82,0,0,467,469,3,162,81,0, + 468,466,1,0,0,0,468,469,1,0,0,0,469,470,1,0,0,0,470,474,5,137,0, + 0,471,473,3,48,24,0,472,471,1,0,0,0,473,476,1,0,0,0,474,472,1,0, + 0,0,474,475,1,0,0,0,475,477,1,0,0,0,476,474,1,0,0,0,477,478,5,138, + 0,0,478,45,1,0,0,0,479,481,5,32,0,0,480,482,7,0,0,0,481,480,1,0, + 0,0,481,482,1,0,0,0,482,47,1,0,0,0,483,484,5,98,0,0,484,485,5,84, + 0,0,485,487,3,162,81,0,486,488,3,74,37,0,487,486,1,0,0,0,487,488, + 1,0,0,0,488,489,1,0,0,0,489,490,5,134,0,0,490,517,1,0,0,0,491,492, + 5,99,0,0,492,493,5,84,0,0,493,495,3,162,81,0,494,496,3,74,37,0,495, + 494,1,0,0,0,495,496,1,0,0,0,496,497,1,0,0,0,497,498,5,134,0,0,498, + 517,1,0,0,0,499,500,5,100,0,0,500,501,5,84,0,0,501,503,3,162,81, + 0,502,504,3,74,37,0,503,502,1,0,0,0,503,504,1,0,0,0,504,505,1,0, + 0,0,505,506,5,134,0,0,506,517,1,0,0,0,507,508,5,93,0,0,508,509,5, + 94,0,0,509,510,5,84,0,0,510,511,3,162,81,0,511,512,5,95,0,0,512, + 513,5,84,0,0,513,514,3,162,81,0,514,515,5,134,0,0,515,517,1,0,0, + 0,516,483,1,0,0,0,516,491,1,0,0,0,516,499,1,0,0,0,516,507,1,0,0, + 0,517,49,1,0,0,0,518,519,5,43,0,0,519,528,3,160,80,0,520,521,5,44, + 0,0,521,523,3,160,80,0,522,524,3,28,14,0,523,522,1,0,0,0,523,524, + 1,0,0,0,524,528,1,0,0,0,525,526,5,36,0,0,526,528,3,160,80,0,527, + 518,1,0,0,0,527,520,1,0,0,0,527,525,1,0,0,0,528,51,1,0,0,0,529,531, + 3,16,8,0,530,529,1,0,0,0,531,534,1,0,0,0,532,530,1,0,0,0,532,533, + 1,0,0,0,533,535,1,0,0,0,534,532,1,0,0,0,535,536,5,46,0,0,536,537, + 3,160,80,0,537,538,5,84,0,0,538,539,3,162,81,0,539,540,5,77,0,0, + 540,543,3,162,81,0,541,542,5,78,0,0,542,544,5,147,0,0,543,541,1, + 0,0,0,543,544,1,0,0,0,544,545,1,0,0,0,545,549,5,137,0,0,546,548, + 3,54,27,0,547,546,1,0,0,0,548,551,1,0,0,0,549,547,1,0,0,0,549,550, + 1,0,0,0,550,552,1,0,0,0,551,549,1,0,0,0,552,553,5,138,0,0,553,53, + 1,0,0,0,554,561,3,68,34,0,555,561,3,70,35,0,556,561,3,78,39,0,557, + 561,3,60,30,0,558,561,3,62,31,0,559,561,3,56,28,0,560,554,1,0,0, + 0,560,555,1,0,0,0,560,556,1,0,0,0,560,557,1,0,0,0,560,558,1,0,0, + 0,560,559,1,0,0,0,561,55,1,0,0,0,562,563,5,2,0,0,563,564,3,160,80, + 0,564,565,5,84,0,0,565,566,3,162,81,0,566,567,5,38,0,0,567,568,3, + 26,13,0,568,569,5,136,0,0,569,570,3,160,80,0,570,571,5,134,0,0,571, + 57,1,0,0,0,572,573,5,4,0,0,573,574,3,160,80,0,574,575,5,84,0,0,575, + 576,3,162,81,0,576,577,5,6,0,0,577,578,3,26,13,0,578,579,5,65,0, + 0,579,580,3,160,80,0,580,581,5,136,0,0,581,582,3,160,80,0,582,583, + 5,134,0,0,583,59,1,0,0,0,584,586,5,22,0,0,585,587,5,40,0,0,586,585, + 1,0,0,0,586,587,1,0,0,0,587,588,1,0,0,0,588,590,3,160,80,0,589,591, + 3,22,11,0,590,589,1,0,0,0,590,591,1,0,0,0,591,592,1,0,0,0,592,593, + 5,84,0,0,593,594,3,162,81,0,594,596,5,25,0,0,595,597,5,9,0,0,596, + 595,1,0,0,0,596,597,1,0,0,0,597,598,1,0,0,0,598,599,3,26,13,0,599, + 600,5,26,0,0,600,629,3,162,81,0,601,602,5,49,0,0,602,603,3,162,81, + 0,603,607,5,137,0,0,604,606,3,64,32,0,605,604,1,0,0,0,606,609,1, + 0,0,0,607,605,1,0,0,0,607,608,1,0,0,0,608,610,1,0,0,0,609,607,1, + 0,0,0,610,611,5,138,0,0,611,630,1,0,0,0,612,613,5,40,0,0,613,616, + 3,162,81,0,614,615,5,49,0,0,615,617,3,162,81,0,616,614,1,0,0,0,616, + 617,1,0,0,0,617,627,1,0,0,0,618,622,5,137,0,0,619,621,3,64,32,0, + 620,619,1,0,0,0,621,624,1,0,0,0,622,620,1,0,0,0,622,623,1,0,0,0, + 623,625,1,0,0,0,624,622,1,0,0,0,625,628,5,138,0,0,626,628,5,134, + 0,0,627,618,1,0,0,0,627,626,1,0,0,0,628,630,1,0,0,0,629,601,1,0, + 0,0,629,612,1,0,0,0,630,61,1,0,0,0,631,632,5,22,0,0,632,633,3,160, + 80,0,633,634,5,84,0,0,634,635,3,162,81,0,635,636,5,24,0,0,636,637, + 3,160,80,0,637,638,3,28,14,0,638,639,5,134,0,0,639,63,1,0,0,0,640, + 641,5,16,0,0,641,698,5,134,0,0,642,643,5,17,0,0,643,644,5,18,0,0, + 644,645,3,160,80,0,645,646,5,134,0,0,646,698,1,0,0,0,647,648,5,27, + 0,0,648,649,3,162,81,0,649,650,5,134,0,0,650,698,1,0,0,0,651,652, + 5,27,0,0,652,653,3,160,80,0,653,654,5,136,0,0,654,664,3,160,80,0, + 655,656,5,64,0,0,656,660,5,137,0,0,657,659,3,66,33,0,658,657,1,0, + 0,0,659,662,1,0,0,0,660,658,1,0,0,0,660,661,1,0,0,0,661,663,1,0, + 0,0,662,660,1,0,0,0,663,665,5,138,0,0,664,655,1,0,0,0,664,665,1, + 0,0,0,665,666,1,0,0,0,666,667,5,134,0,0,667,698,1,0,0,0,668,670, + 5,28,0,0,669,671,5,36,0,0,670,669,1,0,0,0,670,671,1,0,0,0,671,672, + 1,0,0,0,672,673,3,160,80,0,673,674,5,55,0,0,674,675,3,26,13,0,675, + 676,5,134,0,0,676,698,1,0,0,0,677,678,5,29,0,0,678,679,3,160,80, + 0,679,680,5,147,0,0,680,681,5,134,0,0,681,698,1,0,0,0,682,683,5, + 30,0,0,683,684,3,26,13,0,684,685,5,136,0,0,685,686,3,160,80,0,686, + 687,3,160,80,0,687,688,3,162,81,0,688,689,5,134,0,0,689,698,1,0, + 0,0,690,691,5,93,0,0,691,698,5,134,0,0,692,693,5,31,0,0,693,694, + 5,147,0,0,694,695,3,162,81,0,695,696,5,134,0,0,696,698,1,0,0,0,697, + 640,1,0,0,0,697,642,1,0,0,0,697,647,1,0,0,0,697,651,1,0,0,0,697, + 668,1,0,0,0,697,677,1,0,0,0,697,682,1,0,0,0,697,690,1,0,0,0,697, + 692,1,0,0,0,698,65,1,0,0,0,699,700,3,160,80,0,700,701,5,58,0,0,701, + 702,3,160,80,0,702,703,5,134,0,0,703,67,1,0,0,0,704,705,5,49,0,0, + 705,707,3,160,80,0,706,708,3,22,11,0,707,706,1,0,0,0,707,708,1,0, + 0,0,708,709,1,0,0,0,709,710,5,84,0,0,710,711,3,162,81,0,711,712, + 5,133,0,0,712,713,3,144,72,0,713,714,5,132,0,0,714,715,3,144,72, + 0,715,716,5,86,0,0,716,718,3,82,41,0,717,719,3,74,37,0,718,717,1, + 0,0,0,718,719,1,0,0,0,719,721,1,0,0,0,720,722,3,80,40,0,721,720, + 1,0,0,0,721,722,1,0,0,0,722,723,1,0,0,0,723,724,5,88,0,0,724,726, + 3,84,42,0,725,727,3,88,44,0,726,725,1,0,0,0,726,727,1,0,0,0,727, + 729,1,0,0,0,728,730,3,72,36,0,729,728,1,0,0,0,729,730,1,0,0,0,730, + 731,1,0,0,0,731,732,5,134,0,0,732,69,1,0,0,0,733,734,5,50,0,0,734, + 736,3,160,80,0,735,737,3,22,11,0,736,735,1,0,0,0,736,737,1,0,0,0, + 737,738,1,0,0,0,738,739,5,84,0,0,739,740,3,162,81,0,740,741,5,133, + 0,0,741,742,3,144,72,0,742,743,5,132,0,0,743,745,3,144,72,0,744, + 746,3,74,37,0,745,744,1,0,0,0,745,746,1,0,0,0,746,748,1,0,0,0,747, + 749,3,88,44,0,748,747,1,0,0,0,748,749,1,0,0,0,749,751,1,0,0,0,750, + 752,3,72,36,0,751,750,1,0,0,0,751,752,1,0,0,0,752,753,1,0,0,0,753, + 754,5,134,0,0,754,71,1,0,0,0,755,756,5,66,0,0,756,757,5,65,0,0,757, + 758,3,160,80,0,758,73,1,0,0,0,759,760,5,10,0,0,760,769,5,13,0,0, + 761,762,5,10,0,0,762,763,7,1,0,0,763,764,5,14,0,0,764,765,5,139, + 0,0,765,766,3,86,43,0,766,767,5,140,0,0,767,769,1,0,0,0,768,759, + 1,0,0,0,768,761,1,0,0,0,769,75,1,0,0,0,770,771,5,65,0,0,771,772, + 5,139,0,0,772,777,3,126,63,0,773,774,5,135,0,0,774,776,3,126,63, + 0,775,773,1,0,0,0,776,779,1,0,0,0,777,775,1,0,0,0,777,778,1,0,0, + 0,778,780,1,0,0,0,779,777,1,0,0,0,780,781,5,140,0,0,781,77,1,0,0, + 0,782,783,5,51,0,0,783,784,3,160,80,0,784,785,5,84,0,0,785,786,3, + 162,81,0,786,787,5,52,0,0,787,788,3,160,80,0,788,789,5,133,0,0,789, + 791,3,144,72,0,790,792,3,88,44,0,791,790,1,0,0,0,791,792,1,0,0,0, + 792,793,1,0,0,0,793,794,5,134,0,0,794,79,1,0,0,0,795,796,5,87,0, + 0,796,797,3,144,72,0,797,81,1,0,0,0,798,799,7,2,0,0,799,83,1,0,0, + 0,800,819,5,90,0,0,801,802,5,43,0,0,802,819,3,160,80,0,803,804,5, + 36,0,0,804,819,3,160,80,0,805,806,5,45,0,0,806,815,5,139,0,0,807, + 812,3,26,13,0,808,809,5,135,0,0,809,811,3,26,13,0,810,808,1,0,0, + 0,811,814,1,0,0,0,812,810,1,0,0,0,812,813,1,0,0,0,813,816,1,0,0, + 0,814,812,1,0,0,0,815,807,1,0,0,0,815,816,1,0,0,0,816,817,1,0,0, + 0,817,819,5,140,0,0,818,800,1,0,0,0,818,801,1,0,0,0,818,803,1,0, + 0,0,818,805,1,0,0,0,819,85,1,0,0,0,820,825,3,160,80,0,821,822,5, + 135,0,0,822,824,3,160,80,0,823,821,1,0,0,0,824,827,1,0,0,0,825,823, + 1,0,0,0,825,826,1,0,0,0,826,87,1,0,0,0,827,825,1,0,0,0,828,829,5, + 89,0,0,829,833,5,137,0,0,830,832,3,90,45,0,831,830,1,0,0,0,832,835, + 1,0,0,0,833,831,1,0,0,0,833,834,1,0,0,0,834,836,1,0,0,0,835,833, + 1,0,0,0,836,837,5,138,0,0,837,89,1,0,0,0,838,839,5,23,0,0,839,840, + 3,160,80,0,840,841,5,84,0,0,841,842,3,162,81,0,842,843,5,139,0,0, + 843,844,3,86,43,0,844,845,5,140,0,0,845,846,5,134,0,0,846,917,1, + 0,0,0,847,848,5,61,0,0,848,849,3,160,80,0,849,850,5,84,0,0,850,851, + 3,162,81,0,851,852,5,133,0,0,852,853,3,144,72,0,853,854,3,92,46, + 0,854,855,5,134,0,0,855,917,1,0,0,0,856,857,5,62,0,0,857,858,3,160, + 80,0,858,859,5,84,0,0,859,860,3,162,81,0,860,861,5,133,0,0,861,862, + 3,150,75,0,862,863,3,50,25,0,863,864,3,92,46,0,864,865,5,134,0,0, + 865,917,1,0,0,0,866,867,5,44,0,0,867,868,3,160,80,0,868,869,5,84, + 0,0,869,870,3,162,81,0,870,871,5,133,0,0,871,873,3,160,80,0,872, + 874,3,28,14,0,873,872,1,0,0,0,873,874,1,0,0,0,874,876,1,0,0,0,875, + 877,3,76,38,0,876,875,1,0,0,0,876,877,1,0,0,0,877,880,1,0,0,0,878, + 879,5,18,0,0,879,881,5,53,0,0,880,878,1,0,0,0,880,881,1,0,0,0,881, + 882,1,0,0,0,882,883,5,134,0,0,883,917,1,0,0,0,884,885,5,7,0,0,885, + 886,3,160,80,0,886,887,5,84,0,0,887,888,3,162,81,0,888,889,5,133, + 0,0,889,890,3,160,80,0,890,891,5,53,0,0,891,892,3,144,72,0,892,893, + 5,134,0,0,893,917,1,0,0,0,894,895,5,51,0,0,895,896,3,160,80,0,896, + 897,5,84,0,0,897,898,3,162,81,0,898,899,5,133,0,0,899,902,3,160, + 80,0,900,901,5,53,0,0,901,903,3,144,72,0,902,900,1,0,0,0,902,903, + 1,0,0,0,903,904,1,0,0,0,904,905,5,134,0,0,905,917,1,0,0,0,906,907, + 5,22,0,0,907,908,3,160,80,0,908,909,5,84,0,0,909,910,3,162,81,0, + 910,911,5,133,0,0,911,912,3,160,80,0,912,913,5,136,0,0,913,914,3, + 160,80,0,914,915,5,134,0,0,915,917,1,0,0,0,916,838,1,0,0,0,916,847, + 1,0,0,0,916,856,1,0,0,0,916,866,1,0,0,0,916,884,1,0,0,0,916,894, + 1,0,0,0,916,906,1,0,0,0,917,91,1,0,0,0,918,919,5,139,0,0,919,924, + 3,94,47,0,920,921,5,135,0,0,921,923,3,94,47,0,922,920,1,0,0,0,923, + 926,1,0,0,0,924,922,1,0,0,0,924,925,1,0,0,0,925,927,1,0,0,0,926, + 924,1,0,0,0,927,928,5,140,0,0,928,93,1,0,0,0,929,930,7,3,0,0,930, + 95,1,0,0,0,931,932,5,60,0,0,932,933,3,98,49,0,933,97,1,0,0,0,934, + 937,3,100,50,0,935,937,3,104,52,0,936,934,1,0,0,0,936,935,1,0,0, + 0,937,99,1,0,0,0,938,939,5,61,0,0,939,940,3,160,80,0,940,941,5,84, + 0,0,941,942,3,162,81,0,942,943,5,71,0,0,943,944,3,160,80,0,944,945, + 5,133,0,0,945,946,3,144,72,0,946,947,5,72,0,0,947,950,3,102,51,0, + 948,949,5,73,0,0,949,951,3,152,76,0,950,948,1,0,0,0,950,951,1,0, + 0,0,951,952,1,0,0,0,952,953,5,134,0,0,953,101,1,0,0,0,954,961,5, + 106,0,0,955,956,5,107,0,0,956,957,5,141,0,0,957,958,3,144,72,0,958, + 959,5,142,0,0,959,961,1,0,0,0,960,954,1,0,0,0,960,955,1,0,0,0,961, + 103,1,0,0,0,962,963,5,62,0,0,963,964,3,160,80,0,964,965,5,84,0,0, + 965,966,3,162,81,0,966,967,5,137,0,0,967,968,3,106,53,0,968,969, + 3,106,53,0,969,970,5,138,0,0,970,105,1,0,0,0,971,972,3,50,25,0,972, + 973,5,63,0,0,973,974,3,160,80,0,974,975,5,84,0,0,975,976,3,162,81, + 0,976,978,3,150,75,0,977,979,5,112,0,0,978,977,1,0,0,0,978,979,1, + 0,0,0,979,982,1,0,0,0,980,981,5,79,0,0,981,983,3,162,81,0,982,980, + 1,0,0,0,982,983,1,0,0,0,983,985,1,0,0,0,984,986,5,81,0,0,985,984, + 1,0,0,0,985,986,1,0,0,0,986,989,1,0,0,0,987,988,5,82,0,0,988,990, + 3,162,81,0,989,987,1,0,0,0,989,990,1,0,0,0,990,992,1,0,0,0,991,993, + 5,83,0,0,992,991,1,0,0,0,992,993,1,0,0,0,993,994,1,0,0,0,994,995, + 5,134,0,0,995,107,1,0,0,0,996,997,5,54,0,0,997,998,3,160,80,0,998, + 999,5,55,0,0,999,1001,3,160,80,0,1000,1002,3,28,14,0,1001,1000,1, + 0,0,0,1001,1002,1,0,0,0,1002,1005,1,0,0,0,1003,1004,5,84,0,0,1004, + 1006,3,162,81,0,1005,1003,1,0,0,0,1005,1006,1,0,0,0,1006,1009,1, + 0,0,0,1007,1008,5,78,0,0,1008,1010,5,147,0,0,1009,1007,1,0,0,0,1009, + 1010,1,0,0,0,1010,1011,1,0,0,0,1011,1015,5,137,0,0,1012,1014,3,110, + 55,0,1013,1012,1,0,0,0,1014,1017,1,0,0,0,1015,1013,1,0,0,0,1015, + 1016,1,0,0,0,1016,1018,1,0,0,0,1017,1015,1,0,0,0,1018,1019,5,138, + 0,0,1019,109,1,0,0,0,1020,1021,5,59,0,0,1021,1028,3,98,49,0,1022, + 1028,3,124,62,0,1023,1028,3,120,60,0,1024,1028,3,114,57,0,1025,1028, + 3,122,61,0,1026,1028,3,112,56,0,1027,1020,1,0,0,0,1027,1022,1,0, + 0,0,1027,1023,1,0,0,0,1027,1024,1,0,0,0,1027,1025,1,0,0,0,1027,1026, + 1,0,0,0,1028,111,1,0,0,0,1029,1030,5,56,0,0,1030,1031,3,160,80,0, + 1031,1032,5,58,0,0,1032,1033,3,160,80,0,1033,1034,5,136,0,0,1034, + 1035,3,160,80,0,1035,1036,5,134,0,0,1036,113,1,0,0,0,1037,1038,5, + 8,0,0,1038,1042,5,137,0,0,1039,1041,3,116,58,0,1040,1039,1,0,0,0, + 1041,1044,1,0,0,0,1042,1040,1,0,0,0,1042,1043,1,0,0,0,1043,1045, + 1,0,0,0,1044,1042,1,0,0,0,1045,1046,5,138,0,0,1046,1047,5,134,0, + 0,1047,115,1,0,0,0,1048,1049,3,160,80,0,1049,1050,5,58,0,0,1050, + 1051,5,61,0,0,1051,1052,3,160,80,0,1052,1053,5,134,0,0,1053,1063, + 1,0,0,0,1054,1055,3,160,80,0,1055,1056,5,58,0,0,1056,1057,5,62,0, + 0,1057,1058,3,160,80,0,1058,1059,5,136,0,0,1059,1060,3,160,80,0, + 1060,1061,5,134,0,0,1061,1063,1,0,0,0,1062,1048,1,0,0,0,1062,1054, + 1,0,0,0,1063,117,1,0,0,0,1064,1065,3,26,13,0,1065,1066,5,18,0,0, + 1066,1071,5,53,0,0,1067,1068,5,136,0,0,1068,1070,3,160,80,0,1069, + 1067,1,0,0,0,1070,1073,1,0,0,0,1071,1069,1,0,0,0,1071,1072,1,0,0, + 0,1072,1074,1,0,0,0,1073,1071,1,0,0,0,1074,1075,5,134,0,0,1075,119, + 1,0,0,0,1076,1077,5,56,0,0,1077,1078,3,160,80,0,1078,1079,5,58,0, + 0,1079,1080,5,61,0,0,1080,1081,3,160,80,0,1081,1082,5,134,0,0,1082, + 121,1,0,0,0,1083,1084,5,68,0,0,1084,1085,3,160,80,0,1085,1086,5, + 69,0,0,1086,1087,5,70,0,0,1087,1088,5,65,0,0,1088,1089,5,51,0,0, + 1089,1090,3,160,80,0,1090,1091,5,67,0,0,1091,1092,5,62,0,0,1092, + 1093,3,160,80,0,1093,1094,5,136,0,0,1094,1095,3,160,80,0,1095,1096, + 5,134,0,0,1096,123,1,0,0,0,1097,1098,5,56,0,0,1098,1099,3,126,63, + 0,1099,1100,5,58,0,0,1100,1103,3,130,65,0,1101,1102,5,34,0,0,1102, + 1104,3,162,81,0,1103,1101,1,0,0,0,1103,1104,1,0,0,0,1104,1105,1, + 0,0,0,1105,1106,5,134,0,0,1106,125,1,0,0,0,1107,1108,3,160,80,0, + 1108,1109,5,136,0,0,1109,1110,3,128,64,0,1110,127,1,0,0,0,1111,1124, + 3,160,80,0,1112,1124,5,101,0,0,1113,1124,5,91,0,0,1114,1124,5,92, + 0,0,1115,1124,5,1,0,0,1116,1124,5,98,0,0,1117,1124,5,99,0,0,1118, + 1124,5,100,0,0,1119,1124,5,102,0,0,1120,1124,5,103,0,0,1121,1124, + 5,104,0,0,1122,1124,5,105,0,0,1123,1111,1,0,0,0,1123,1112,1,0,0, + 0,1123,1113,1,0,0,0,1123,1114,1,0,0,0,1123,1115,1,0,0,0,1123,1116, + 1,0,0,0,1123,1117,1,0,0,0,1123,1118,1,0,0,0,1123,1119,1,0,0,0,1123, + 1120,1,0,0,0,1123,1121,1,0,0,0,1123,1122,1,0,0,0,1124,129,1,0,0, + 0,1125,1126,5,80,0,0,1126,1127,5,136,0,0,1127,1162,3,160,80,0,1128, + 1129,5,61,0,0,1129,1130,3,160,80,0,1130,1131,5,136,0,0,1131,1132, + 3,134,67,0,1132,1162,1,0,0,0,1133,1134,5,62,0,0,1134,1135,3,160, + 80,0,1135,1136,5,136,0,0,1136,1137,3,160,80,0,1137,1138,5,136,0, + 0,1138,1139,3,136,68,0,1139,1162,1,0,0,0,1140,1141,5,44,0,0,1141, + 1143,3,160,80,0,1142,1144,3,28,14,0,1143,1142,1,0,0,0,1143,1144, + 1,0,0,0,1144,1145,1,0,0,0,1145,1146,5,136,0,0,1146,1147,3,126,63, + 0,1147,1162,1,0,0,0,1148,1149,5,46,0,0,1149,1150,3,160,80,0,1150, + 1151,5,136,0,0,1151,1153,3,160,80,0,1152,1154,3,28,14,0,1153,1152, + 1,0,0,0,1153,1154,1,0,0,0,1154,1156,1,0,0,0,1155,1157,3,138,69,0, + 1156,1155,1,0,0,0,1156,1157,1,0,0,0,1157,1159,1,0,0,0,1158,1160, + 3,132,66,0,1159,1158,1,0,0,0,1159,1160,1,0,0,0,1160,1162,1,0,0,0, + 1161,1125,1,0,0,0,1161,1128,1,0,0,0,1161,1133,1,0,0,0,1161,1140, + 1,0,0,0,1161,1148,1,0,0,0,1162,131,1,0,0,0,1163,1164,5,66,0,0,1164, + 1165,3,138,69,0,1165,133,1,0,0,0,1166,1167,7,4,0,0,1167,135,1,0, + 0,0,1168,1169,7,5,0,0,1169,137,1,0,0,0,1170,1171,5,64,0,0,1171,1175, + 5,137,0,0,1172,1174,3,140,70,0,1173,1172,1,0,0,0,1174,1177,1,0,0, + 0,1175,1173,1,0,0,0,1175,1176,1,0,0,0,1176,1178,1,0,0,0,1177,1175, + 1,0,0,0,1178,1179,5,138,0,0,1179,139,1,0,0,0,1180,1181,3,160,80, + 0,1181,1182,5,58,0,0,1182,1183,5,9,0,0,1183,1184,5,23,0,0,1184,1185, + 5,139,0,0,1185,1186,3,86,43,0,1186,1187,5,140,0,0,1187,1188,5,134, + 0,0,1188,1279,1,0,0,0,1189,1190,3,160,80,0,1190,1191,5,58,0,0,1191, + 1192,5,61,0,0,1192,1199,3,160,80,0,1193,1194,5,67,0,0,1194,1195, + 5,62,0,0,1195,1196,3,160,80,0,1196,1197,5,136,0,0,1197,1198,3,160, + 80,0,1198,1200,1,0,0,0,1199,1193,1,0,0,0,1199,1200,1,0,0,0,1200, + 1201,1,0,0,0,1201,1202,5,134,0,0,1202,1279,1,0,0,0,1203,1204,3,160, + 80,0,1204,1205,5,58,0,0,1205,1206,5,62,0,0,1206,1207,3,160,80,0, + 1207,1208,5,136,0,0,1208,1215,3,160,80,0,1209,1210,5,67,0,0,1210, + 1211,5,62,0,0,1211,1212,3,160,80,0,1212,1213,5,136,0,0,1213,1214, + 3,160,80,0,1214,1216,1,0,0,0,1215,1209,1,0,0,0,1215,1216,1,0,0,0, + 1216,1217,1,0,0,0,1217,1218,5,134,0,0,1218,1279,1,0,0,0,1219,1220, + 3,160,80,0,1220,1221,5,58,0,0,1221,1222,5,44,0,0,1222,1224,3,160, + 80,0,1223,1225,3,28,14,0,1224,1223,1,0,0,0,1224,1225,1,0,0,0,1225, + 1234,1,0,0,0,1226,1227,5,67,0,0,1227,1228,5,62,0,0,1228,1229,3,160, + 80,0,1229,1230,5,136,0,0,1230,1231,3,160,80,0,1231,1235,1,0,0,0, + 1232,1233,5,18,0,0,1233,1235,5,53,0,0,1234,1226,1,0,0,0,1234,1232, + 1,0,0,0,1234,1235,1,0,0,0,1235,1236,1,0,0,0,1236,1237,5,134,0,0, + 1237,1279,1,0,0,0,1238,1239,3,160,80,0,1239,1240,5,58,0,0,1240,1241, + 5,7,0,0,1241,1242,3,160,80,0,1242,1243,5,64,0,0,1243,1247,5,137, + 0,0,1244,1246,3,118,59,0,1245,1244,1,0,0,0,1246,1249,1,0,0,0,1247, + 1245,1,0,0,0,1247,1248,1,0,0,0,1248,1250,1,0,0,0,1249,1247,1,0,0, + 0,1250,1251,5,138,0,0,1251,1252,5,134,0,0,1252,1279,1,0,0,0,1253, + 1254,3,160,80,0,1254,1255,5,58,0,0,1255,1256,5,51,0,0,1256,1257, + 3,160,80,0,1257,1258,5,134,0,0,1258,1279,1,0,0,0,1259,1260,3,160, + 80,0,1260,1262,5,58,0,0,1261,1263,5,9,0,0,1262,1261,1,0,0,0,1262, + 1263,1,0,0,0,1263,1264,1,0,0,0,1264,1265,5,22,0,0,1265,1266,3,160, + 80,0,1266,1267,5,136,0,0,1267,1274,3,160,80,0,1268,1269,5,67,0,0, + 1269,1270,5,62,0,0,1270,1271,3,160,80,0,1271,1272,5,136,0,0,1272, + 1273,3,160,80,0,1273,1275,1,0,0,0,1274,1268,1,0,0,0,1274,1275,1, + 0,0,0,1275,1276,1,0,0,0,1276,1277,5,134,0,0,1277,1279,1,0,0,0,1278, + 1180,1,0,0,0,1278,1189,1,0,0,0,1278,1203,1,0,0,0,1278,1219,1,0,0, + 0,1278,1238,1,0,0,0,1278,1253,1,0,0,0,1278,1259,1,0,0,0,1279,141, + 1,0,0,0,1280,1281,5,51,0,0,1281,1282,3,160,80,0,1282,1283,5,58,0, + 0,1283,1284,3,160,80,0,1284,1285,5,136,0,0,1285,1287,3,160,80,0, + 1286,1288,3,138,69,0,1287,1286,1,0,0,0,1287,1288,1,0,0,0,1288,1289, + 1,0,0,0,1289,1290,5,134,0,0,1290,143,1,0,0,0,1291,1338,3,148,74, + 0,1292,1338,5,113,0,0,1293,1338,5,114,0,0,1294,1295,5,115,0,0,1295, + 1338,3,162,81,0,1296,1297,5,116,0,0,1297,1298,5,143,0,0,1298,1299, + 3,160,80,0,1299,1300,5,144,0,0,1300,1338,1,0,0,0,1301,1302,5,117, + 0,0,1302,1303,5,143,0,0,1303,1305,3,160,80,0,1304,1306,3,28,14,0, + 1305,1304,1,0,0,0,1305,1306,1,0,0,0,1306,1307,1,0,0,0,1307,1308, + 5,144,0,0,1308,1338,1,0,0,0,1309,1310,5,39,0,0,1310,1311,5,143,0, + 0,1311,1312,3,160,80,0,1312,1313,5,144,0,0,1313,1338,1,0,0,0,1314, + 1315,5,118,0,0,1315,1316,5,143,0,0,1316,1317,3,144,72,0,1317,1318, + 5,144,0,0,1318,1338,1,0,0,0,1319,1320,5,119,0,0,1320,1321,5,143, + 0,0,1321,1322,3,144,72,0,1322,1323,5,144,0,0,1323,1338,1,0,0,0,1324, + 1325,5,120,0,0,1325,1329,5,137,0,0,1326,1328,3,146,73,0,1327,1326, + 1,0,0,0,1328,1331,1,0,0,0,1329,1327,1,0,0,0,1329,1330,1,0,0,0,1330, + 1332,1,0,0,0,1331,1329,1,0,0,0,1332,1338,5,138,0,0,1333,1335,3,160, + 80,0,1334,1336,3,28,14,0,1335,1334,1,0,0,0,1335,1336,1,0,0,0,1336, + 1338,1,0,0,0,1337,1291,1,0,0,0,1337,1292,1,0,0,0,1337,1293,1,0,0, + 0,1337,1294,1,0,0,0,1337,1296,1,0,0,0,1337,1301,1,0,0,0,1337,1309, + 1,0,0,0,1337,1314,1,0,0,0,1337,1319,1,0,0,0,1337,1324,1,0,0,0,1337, + 1333,1,0,0,0,1338,145,1,0,0,0,1339,1340,3,160,80,0,1340,1341,5,133, + 0,0,1341,1342,3,144,72,0,1342,1343,5,134,0,0,1343,147,1,0,0,0,1344, + 1345,7,6,0,0,1345,149,1,0,0,0,1346,1347,7,7,0,0,1347,151,1,0,0,0, + 1348,1357,3,162,81,0,1349,1357,5,147,0,0,1350,1357,5,148,0,0,1351, + 1357,5,129,0,0,1352,1357,5,130,0,0,1353,1357,5,131,0,0,1354,1357, + 3,154,77,0,1355,1357,3,158,79,0,1356,1348,1,0,0,0,1356,1349,1,0, + 0,0,1356,1350,1,0,0,0,1356,1351,1,0,0,0,1356,1352,1,0,0,0,1356,1353, + 1,0,0,0,1356,1354,1,0,0,0,1356,1355,1,0,0,0,1357,153,1,0,0,0,1358, + 1367,5,137,0,0,1359,1364,3,156,78,0,1360,1361,5,135,0,0,1361,1363, + 3,156,78,0,1362,1360,1,0,0,0,1363,1366,1,0,0,0,1364,1362,1,0,0,0, + 1364,1365,1,0,0,0,1365,1368,1,0,0,0,1366,1364,1,0,0,0,1367,1359, + 1,0,0,0,1367,1368,1,0,0,0,1368,1369,1,0,0,0,1369,1370,5,138,0,0, + 1370,155,1,0,0,0,1371,1372,3,162,81,0,1372,1373,5,133,0,0,1373,1374, + 3,152,76,0,1374,157,1,0,0,0,1375,1384,5,139,0,0,1376,1381,3,152, + 76,0,1377,1378,5,135,0,0,1378,1380,3,152,76,0,1379,1377,1,0,0,0, + 1380,1383,1,0,0,0,1381,1379,1,0,0,0,1381,1382,1,0,0,0,1382,1385, + 1,0,0,0,1383,1381,1,0,0,0,1384,1376,1,0,0,0,1384,1385,1,0,0,0,1385, + 1386,1,0,0,0,1386,1387,5,140,0,0,1387,159,1,0,0,0,1388,1389,7,8, + 0,0,1389,161,1,0,0,0,1390,1391,5,150,0,0,1391,163,1,0,0,0,123,176, + 183,204,217,229,249,257,264,270,282,285,291,302,311,321,324,326, + 330,338,350,355,365,375,380,395,401,413,422,430,438,451,454,464, + 468,474,481,487,495,503,516,523,527,532,543,549,560,586,590,596, + 607,616,622,627,629,660,664,670,697,707,718,721,726,729,736,745, + 748,751,768,777,791,812,815,818,825,833,873,876,880,902,916,924, + 936,950,960,978,982,985,989,992,1001,1005,1009,1015,1027,1042,1062, + 1071,1103,1123,1143,1153,1156,1159,1161,1175,1199,1215,1224,1234, + 1247,1262,1274,1278,1287,1305,1329,1335,1337,1356,1364,1367,1381, + 1384 ]; private static __ATN: antlr.ATN; @@ -7190,14 +7357,23 @@ export class PackageQueryContext extends antlr.ParserRuleContext { public DOCUMENT(): antlr.TerminalNode { return this.getToken(QuixosCapabilityParser.DOCUMENT, 0)!; } - public OPERATION(): antlr.TerminalNode { - return this.getToken(QuixosCapabilityParser.OPERATION, 0)!; + public OPERATION(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.OPERATION, 0); } - public LBRACE(): antlr.TerminalNode { - return this.getToken(QuixosCapabilityParser.LBRACE, 0)!; + public LBRACE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.LBRACE, 0); } - public RBRACE(): antlr.TerminalNode { - return this.getToken(QuixosCapabilityParser.RBRACE, 0)!; + public RBRACE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.RBRACE, 0); + } + public FRAGMENT(): antlr.TerminalNode[]; + public FRAGMENT(i: number): antlr.TerminalNode | null; + public FRAGMENT(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(QuixosCapabilityParser.FRAGMENT); + } else { + return this.getToken(QuixosCapabilityParser.FRAGMENT, i); + } } public typeParameters(): TypeParametersContext | null { return this.getRuleContext(0, TypeParametersContext); @@ -7205,6 +7381,9 @@ export class PackageQueryContext extends antlr.ParserRuleContext { public WORKSPACE(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.WORKSPACE, 0); } + public SEMI(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.SEMI, 0); + } public queryClause(): QueryClauseContext[]; public queryClause(i: number): QueryClauseContext | null; public queryClause(i?: number): QueryClauseContext[] | QueryClauseContext | null { @@ -7302,6 +7481,27 @@ export class QueryClauseContext extends antlr.ParserRuleContext { public stringLiteral(): StringLiteralContext | null { return this.getRuleContext(0, StringLiteralContext); } + public DOT(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.DOT, 0); + } + public WITH(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.WITH, 0); + } + public LBRACE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.LBRACE, 0); + } + public RBRACE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.RBRACE, 0); + } + public fragmentVariable(): FragmentVariableContext[]; + public fragmentVariable(i: number): FragmentVariableContext | null; + public fragmentVariable(i?: number): FragmentVariableContext[] | FragmentVariableContext | null { + if (i === undefined) { + return this.getRuleContexts(FragmentVariableContext); + } + + return this.getRuleContext(i, FragmentVariableContext); + } public VIEW(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.VIEW, 0); } @@ -7323,9 +7523,6 @@ export class QueryClauseContext extends antlr.ParserRuleContext { public ALLOW(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.ALLOW, 0); } - public DOT(): antlr.TerminalNode | null { - return this.getToken(QuixosCapabilityParser.DOT, 0); - } public WATCH(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.WATCH, 0); } @@ -7345,6 +7542,38 @@ export class QueryClauseContext extends antlr.ParserRuleContext { } +export class FragmentVariableContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public identifier(): IdentifierContext[]; + public identifier(i: number): IdentifierContext | null; + public identifier(i?: number): IdentifierContext[] | IdentifierContext | null { + if (i === undefined) { + return this.getRuleContexts(IdentifierContext); + } + + return this.getRuleContext(i, IdentifierContext); + } + public TO(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.TO, 0)!; + } + public SEMI(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.SEMI, 0)!; + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_fragmentVariable; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitFragmentVariable) { + return visitor.visitFragmentVariable(this); + } else { + return visitor.visitChildren(this); + } + } +} + + export class PackageOperationExportContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); @@ -9454,6 +9683,9 @@ export class IdentifierContext extends antlr.ParserRuleContext { public FRAGMENTS(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.FRAGMENTS, 0); } + public FRAGMENT(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.FRAGMENT, 0); + } public VIEW(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.VIEW, 0); } diff --git a/src/capability-language/generated/QuixosCapabilityVisitor.ts b/src/capability-language/generated/QuixosCapabilityVisitor.ts index 6b534a2..b8d49b0 100644 --- a/src/capability-language/generated/QuixosCapabilityVisitor.ts +++ b/src/capability-language/generated/QuixosCapabilityVisitor.ts @@ -35,6 +35,7 @@ import { PresentationDeclContext } from "./QuixosCapabilityParser.js"; import { PackageQueryContext } from "./QuixosCapabilityParser.js"; import { PackageQuerySpecializationContext } from "./QuixosCapabilityParser.js"; import { QueryClauseContext } from "./QuixosCapabilityParser.js"; +import { FragmentVariableContext } from "./QuixosCapabilityParser.js"; import { PackageOperationExportContext } from "./QuixosCapabilityParser.js"; import { PackageFunctionExportContext } from "./QuixosCapabilityParser.js"; import { AcceptanceClauseContext } from "./QuixosCapabilityParser.js"; @@ -291,6 +292,12 @@ export class QuixosCapabilityVisitor extends AbstractParseTreeVisitor Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.fragmentVariable`. + * @param ctx the parse tree + * @return the visitor result + */ + visitFragmentVariable?: (ctx: FragmentVariableContext) => Result; /** * Visit a parse tree produced by `QuixosCapabilityParser.packageOperationExport`. * @param ctx the parse tree diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index cfaf479..8550a6d 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -1380,6 +1380,14 @@ const lowerPackage = ( if (exportContext.packageQuerySpecialization()) return []; const query = exportContext.packageQuery(); if (query) { + const isFragment = query.FRAGMENT().length > 0; + if (isFragment && (query.FRAGMENT().length !== 2 || query.typeParameters() || query.WORKSPACE())) + loweringIssue( + state, + query, + "invalid-query-fragment", + "Export a fragment on an exact object interface; generic fragments and workspace fragment roots are not supported", + ); const previousParameters = state.types.parameters; state.types.parameters = new Map(); try { @@ -1403,7 +1411,19 @@ const lowerPackage = ( displayName: identifier(query.identifier()), root: { kind: query.WORKSPACE() ? "workspace-interface" : "object", interface: close(query.interfaceType()) }, document: stringValue(query.stringLiteral(1)), - operation: stringValue(query.stringLiteral(2)), + operation: isFragment + ? query.stringLiteral(3) + ? stringValue(query.stringLiteral(3)) + : "QuixosFragment" + : stringValue(query.stringLiteral(2)), + ...(isFragment + ? { + fragment: { + name: stringValue(query.stringLiteral(2)), + ...(query.stringLiteral(3) ? { operation: stringValue(query.stringLiteral(3)) } : {}), + }, + } + : {}), fragments: [], views: [], allowances: [], @@ -1436,8 +1456,32 @@ const lowerPackage = ( ); if (sourceQueryId) declaration.placement = { kind: "local", sourceQueryId }; } - } else if (clause.FRAGMENTS()) declaration.fragments.push(stringValue(clause.stringLiteral()!)); - else if (clause.VIEW()) { + } else if (clause.FRAGMENTS()) { + if (clause.stringLiteral()) declaration.fragments.push(stringValue(clause.stringLiteral()!)); + else { + const imported = lowerQueryReference( + state, + identifier(clause.identifier(0)), + identifier(clause.identifier(1)), + clause, + ); + if (imported) { + const variables: Record = {}; + for (const mapping of clause.fragmentVariable()) { + const name = identifier(mapping.identifier(0)); + if (Object.hasOwn(variables, name)) + loweringIssue(state, mapping, "duplicate-fragment-variable", `Repeated fragment variable ${name}`); + variables[name] = identifier(mapping.identifier(1)); + } + (declaration.importedFragments ??= []).push({ + packageRevisionId: imported.packageRevisionId, + packageAlias: identifier(clause.identifier(0)), + fragmentId: imported.queryId, + variables, + }); + } + } + } else if (clause.VIEW()) { const name = identifier(clause.identifier(0)); if (parameters.length) { const parameter = state.types.parameters.get(name); @@ -1548,6 +1592,23 @@ const lowerPackage = ( views: templateViews, allowances: templateAllowances, }); + } else if (isFragment) { + if (declaration.placement || declaration.polling || declaration.allowances.length) + loweringIssue( + state, + query, + "invalid-query-fragment", + "Fragments are local projections with generated admission; remote allowances, polling and explicit placement are not supported", + ); + const sourceQueryId = `${declaration.id}:fragment-inputs`; + queries.push({ + ...structuredClone(declaration), + id: sourceQueryId, + displayName: `${declaration.displayName}$inputs`, + placement: { kind: "replica" }, + fragment: { ...declaration.fragment!, admission: true }, + }); + queries.push({ ...declaration, placement: { kind: "local", sourceQueryId } }); } else queries.push(declaration); return []; } finally { diff --git a/src/execution-world/client-contracts.ts b/src/execution-world/client-contracts.ts index 7f99735..3dceb32 100644 --- a/src/execution-world/client-contracts.ts +++ b/src/execution-world/client-contracts.ts @@ -124,12 +124,64 @@ export function generateInterfaceClientBindings( export function generatePackageQueryClientBindings( pkg: PackageRevision, runtimeModule = "@quixos/camino-replica-core", + packages: readonly PackageRevision[] = [pkg], ): string { - const queries = (pkg.checkedQueries ?? []).map( - (query) => - `${JSON.stringify(query.declaration.displayName)}: definePackageQuery<${tsType(query.variables)}, ${tsType(query.output)}, ${JSON.stringify(publicQueryContract(pkg, query.declaration.id).placement)}>(${JSON.stringify(publicQueryContract(pkg, query.declaration.id))})`, - ); - return `// Generated from checked package query contracts. Regenerate; do not edit.\nimport { definePackageQuery, type ManagedReference } from ${JSON.stringify(runtimeModule)};\nexport const queries = {${queries.join(",\n")}} as const;\n`; + const queries = (pkg.checkedQueries ?? []) + .filter((query) => !query.declaration.fragment) + .map( + (query) => + `${JSON.stringify(query.declaration.displayName)}: definePackageQuery<${tsType(query.variables)}, ${tsType(query.output)}, ${JSON.stringify(publicQueryContract(pkg, query.declaration.id).placement)}>(${JSON.stringify(publicQueryContract(pkg, query.declaration.id))})`, + ); + const emitFragment = (provider: PackageRevision, id: string) => { + const query = provider.checkedQueries?.find((query) => query.declaration.id === id); + if ( + !query?.declaration.fragment || + query.declaration.fragment.admission || + query.declaration.placement?.kind !== "local" || + query.output.kind !== "record" || + !query.output.fields.root + ) + throw new ExecutionPlanError("UNCHECKED_FRAGMENT", id, "Expected a checked local fragment export"); + const output = query.output.fields.root; + const descriptor = { + package: provider.revisionId, + fragment: id, + digest: query.definitionDigest, + subject: query.declaration.root.interface, + input: portableValueSchema(query.variables), + output: portableValueSchema(output), + admission: publicQueryContract(provider, query.declaration.placement.sourceQueryId), + view: publicQueryContract(provider, id), + }; + return `definePackageFragment<${tsType(query.variables)}, ${tsType(output)}, ${JSON.stringify(query.declaration.root.interface)}>(${JSON.stringify(descriptor)})`; + }; + const fragments = (pkg.checkedQueries ?? []) + .filter((query) => query.declaration.fragment && !query.declaration.fragment.admission) + .map((query) => `${JSON.stringify(query.declaration.displayName)}: ${emitFragment(pkg, query.declaration.id)}`); + const imports = new Map>(); + for (const query of pkg.queries ?? []) + for (const imported of query.importedFragments ?? []) { + if (imported.packageRevisionId === pkg.revisionId) continue; + const provider = packages.find((provider) => provider.revisionId === imported.packageRevisionId); + const name = provider?.queries?.find((query) => query.id === imported.fragmentId)?.displayName; + if (!provider || !name) + throw new ExecutionPlanError("UNCHECKED_FRAGMENT", imported.fragmentId, "Missing imported fragment provider"); + const alias = imported.packageAlias ?? provider.displayName; + if (pkg.queries?.some((query) => query.fragment && query.displayName === alias)) + throw new ExecutionPlanError( + "FRAGMENT_ALIAS_COLLISION", + alias, + "Imported fragment namespace conflicts with a local fragment export", + ); + const entries = imports.get(alias) ?? new Map(); + entries.set(name, emitFragment(provider, imported.fragmentId)); + imports.set(alias, entries); + } + for (const [alias, entries] of imports) + fragments.push( + `${JSON.stringify(alias)}: {${[...entries].map(([name, value]) => `${JSON.stringify(name)}: ${value}`).join(",")}}`, + ); + return `// Generated from checked package query contracts. Regenerate; do not edit.\nimport { definePackageQuery, definePackageFragment, type ManagedReference } from ${JSON.stringify(runtimeModule)};\nexport const queries = {${queries.join(",\n")}} as const;\nexport const fragments = {${fragments.join(",\n")}} as const;\n`; } /** Receipt-covered bindings expose the package's imports, component subjects and @@ -157,13 +209,17 @@ export function generateComponentClientBindings(plan: ExecutionPlan, packageRevi .filter((line) => !line.startsWith("import ")) .join("\n") .replace("export const interfaces =", "export const subjects ="); - const queries = generatePackageQueryClientBindings(pkg, "@quixos/camino-react") + const queries = generatePackageQueryClientBindings( + pkg, + "@quixos/camino-react", + plan.definition.workspace.packageImports, + ) .split("\n") .filter((line) => !line.startsWith("import ")) .join("\n"); return ( interfaces + - '\nimport {definePackageQuery,type ComponentType,type ComponentProps} from "@quixos/camino-react";\n' + + '\nimport {definePackageQuery,definePackageFragment,type ComponentType,type ComponentProps} from "@quixos/camino-react";\n' + subjectBindings + "\n" + queries + diff --git a/src/execution-world/queries.ts b/src/execution-world/queries.ts index c737b04..07d54f3 100644 --- a/src/execution-world/queries.ts +++ b/src/execution-world/queries.ts @@ -30,6 +30,15 @@ export function compileQueryProgram(plan: ExecutionPlan): unknown { const checked = query.checked; return { id, + ...(checked.declaration.fragment && !checked.declaration.fragment.admission + ? { + fragment: { + package: query.packageRevisionId, + id: checked.declaration.id, + digest: checked.definitionDigest, + }, + } + : {}), placement: checked.declaration.placement?.kind ?? "remote", source: checked.declaration.placement?.kind === "local" diff --git a/src/query/compile.ts b/src/query/compile.ts index e1d4be7..6ac0e6d 100644 --- a/src/query/compile.ts +++ b/src/query/compile.ts @@ -37,6 +37,7 @@ import { querySchema } from "./schema.js"; import { objectRow } from "./relational-schema.js"; import { workspaceQueryRootId } from "./root.js"; import { relationalCompiler } from "./relational-compile.js"; +import { fragmentSources, type FragmentResolver } from "./fragments.js"; import { QueryCompileError, type QueryDeclaration, @@ -67,6 +68,7 @@ export async function compileQuery( declaration: QueryDeclaration, interfaces: readonly InterfaceRevision[], read: (name: string) => Promise, + resolveFragment?: FragmentResolver, ): Promise { const paths = [declaration.document, ...declaration.fragments]; if (paths.length > 128 || new Set(paths).size !== paths.length) @@ -86,7 +88,10 @@ export async function compileQuery( const document = parse(new Source(text, path), { maxTokens: 10000 }); definitions.push(...document.definitions); } + const fragmentContracts = await fragmentSources(declaration, definitions, resolveFragment); const document: DocumentNode = { kind: "Document" as DocumentNode["kind"], definitions }; + if (definitions.length > 256 || Buffer.byteLength(print(document)) > 262144) + fail("QUERY_SOURCE_LIMIT", "Expanded fragment sources exceed the query source budget"); visit(document, { Directive(node) { if (node.name.value === "live") @@ -112,7 +117,7 @@ export async function compileQuery( if (node.name.value.startsWith("__")) fail("QUERY_UNSUPPORTED_FEATURE", "Introspection is not supported", node); }, Directive(node) { - if (!["include", "skip", "live"].includes(node.name.value)) + if (!["include", "skip"].includes(node.name.value)) fail("QUERY_UNSUPPORTED_FEATURE", `Unsupported directive ${node.name.value}`, node); }, InlineFragment(node) { @@ -400,11 +405,27 @@ export async function compileQuery( inherited: QuerySelection["conditions"] = [], ): QuerySelection[] => set.selections.flatMap((node): QuerySelection[] => { - if (node.kind === "FragmentSpread") - return selection(fragments.get(node.name.value)!.selectionSet, parent, [ - ...inherited, - ...conditions(node.directives), - ]); + if (node.kind === "FragmentSpread") { + const inheritedConditions = [...inherited, ...conditions(node.directives)]; + const contract = fragmentContracts.get(node.name.value); + if (contract && generated.byName.get(parent.name)?.revisionId !== contract.root) + fail("FRAGMENT_ROOT_MISMATCH", "Imported fragment requires its exact nominal root interface", node); + return [ + ...(contract + ? [ + { + name: "$fragment", + key: "", + selection: [], + arguments: {}, + conditions: inheritedConditions, + fragmentSpread: contract, + }, + ] + : []), + ...selection(fragments.get(node.name.value)!.selectionSet, parent, inheritedConditions), + ]; + } if (node.kind !== "Field") return []; const contract = generated.byName.get(parent.name); const member = contract?.members.find((entry) => entry.displayName === node.name.value); @@ -471,6 +492,7 @@ export async function compileQuery( .map((entry) => [entry.variable.name.value, argument(entry.defaultValue!)]), ), sourceFiles: paths, + ...(fragmentContracts.size ? { fragmentContracts: Object.fromEntries(fragmentContracts) } : {}), }; } @@ -478,10 +500,11 @@ export const compileRepositoryQuery = async ( root: string, declaration: QueryDeclaration, interfaces: readonly InterfaceRevision[], + resolveFragment?: FragmentResolver, ) => { const started = performance.now(); try { - return await compileQuery(declaration, interfaces, (name) => readRepositorySource(root, name)); + return await compileQuery(declaration, interfaces, (name) => readRepositorySource(root, name), resolveFragment); } finally { // Timing belongs in check logs, never in immutable artifact identities. console.error( diff --git a/src/query/fragments.ts b/src/query/fragments.ts new file mode 100644 index 0000000..02e76f5 --- /dev/null +++ b/src/query/fragments.ts @@ -0,0 +1,120 @@ +import { parse, print, visit, type DocumentNode, type FragmentDefinitionNode } from "graphql"; +import { QueryCompileError, type CheckedQuery, type QueryDeclaration, type QuerySelection } from "./types.js"; + +export type FragmentResolver = (packageRevisionId: string, fragmentId: string) => Promise; +/** Expand only explicitly imported exports. Each variable mapping is checked by + * GraphQL against the consuming operation, rather than silently inheriting names. */ +export async function fragmentSources( + declaration: QueryDeclaration, + definitions: DocumentNode["definitions"][number][], + resolve?: FragmentResolver, +) { + const markers = new Map>(); + for (const imported of declaration.importedFragments ?? []) { + if (!resolve) + throw new QueryCompileError( + "FRAGMENT_RESOLVER_REQUIRED", + "Resolve imported fragments through package dependencies", + ); + const checked = await resolve(imported.packageRevisionId, imported.fragmentId); + const exported = checked.declaration.fragment; + if (!exported || exported.admission) throw new QueryCompileError("NOT_EXPORTED_FRAGMENT", imported.fragmentId); + const variables = checked.variables.kind === "record" ? Object.keys(checked.variables.fields) : []; + if (JSON.stringify(Object.keys(imported.variables).sort()) !== JSON.stringify(variables.sort())) + throw new QueryCompileError( + "FRAGMENT_VARIABLE_MAPPING", + `Map every variable of ${checked.declaration.displayName} explicitly`, + ); + const source = parse(checked.document); + const sourceOperation = source.definitions.find( + (node) => node.kind === "OperationDefinition" && node.name?.value === checked.declaration.operation, + ); + const consumingOperation = definitions.find( + (node) => node.kind === "OperationDefinition" && node.name?.value === declaration.operation, + ); + for (const variable of sourceOperation?.kind === "OperationDefinition" + ? (sourceOperation.variableDefinitions ?? []) + : []) { + const name = imported.variables[variable.variable.name.value]; + const target = + consumingOperation?.kind === "OperationDefinition" + ? consumingOperation.variableDefinitions?.find((v) => v.variable.name.value === name) + : undefined; + if (!target || print(target.type) !== print(variable.type)) + throw new QueryCompileError( + "FRAGMENT_VARIABLE_TYPE", + `Mapped variable ${name} must have type ${print(variable.type)}`, + ); + } + const fragments = source.definitions.filter( + (node): node is FragmentDefinitionNode => node.kind === "FragmentDefinition", + ); + if (definitions.some((node) => "name" in node && node.name?.value === exported.name)) + throw new QueryCompileError("FRAGMENT_NAME_COLLISION", exported.name); + const privateNames = new Map( + fragments.map((node) => [ + node.name.value, + node.name.value === exported.name ? exported.name : `${exported.name}__${node.name.value}`, + ]), + ); + for (const fragment of fragments) { + definitions.push( + visit(fragment, { + FragmentDefinition(node) { + return { ...node, name: { ...node.name, value: privateNames.get(node.name.value)! } }; + }, + FragmentSpread(node) { + return { ...node, name: { ...node.name, value: privateNames.get(node.name.value) ?? node.name.value } }; + }, + Variable(node) { + return { ...node, name: { ...node.name, value: imported.variables[node.name.value] ?? node.name.value } }; + }, + }), + ); + } + markers.set(exported.name, { + package: imported.packageRevisionId, + fragment: imported.fragmentId, + digest: checked.definitionDigest, + root: checked.declaration.root.interface, + variables: imported.variables, + }); + for (const [name, contract] of Object.entries(checked.fragmentContracts ?? {})) { + markers.set(privateNames.get(name) ?? name, { + ...contract, + variables: Object.fromEntries( + Object.entries(contract.variables).map(([inner, outer]) => [inner, imported.variables[outer] ?? outer]), + ), + }); + } + } + if (declaration.fragment) { + const exported = declaration.fragment; + if (!definitions.some((node) => node.kind === "FragmentDefinition" && node.name.value === exported.name)) + throw new QueryCompileError("FRAGMENT_MISSING", exported.name); + const operations = definitions.filter((node) => node.kind === "OperationDefinition"); + if (!exported.operation) { + if (operations.length) + throw new QueryCompileError( + "FRAGMENT_OPERATION_REQUIRED", + "Name the standalone operation explicitly when a fragment document includes variables or an operation", + ); + definitions.push(...parse(`query ${declaration.operation} { root { ...${exported.name} } }`).definitions); + } else { + const operation = operations.find( + (node) => node.kind === "OperationDefinition" && node.name?.value === exported.operation, + ); + if (!operation || operation.kind !== "OperationDefinition") + throw new QueryCompileError("FRAGMENT_OPERATION_MISSING", exported.operation); + // The standalone operation specifies variables only. Its result must be the + // exact exported fragment, not additional fields or a different window. + const expected = parse(`query ${declaration.operation} { root { ...${exported.name} } }`).definitions[0]!; + if (expected.kind !== "OperationDefinition" || print(operation.selectionSet) !== print(expected.selectionSet)) + throw new QueryCompileError( + "FRAGMENT_STANDALONE_SHAPE", + "Standalone operation must select root { ...ExportedFragment }", + ); + } + } + return markers; +} diff --git a/src/query/types.ts b/src/query/types.ts index bffbe61..41279c6 100644 --- a/src/query/types.ts +++ b/src/query/types.ts @@ -35,6 +35,14 @@ export type QueryRoot = | { kind: "object"; interface: Interface } | { kind: "workspace-interface"; interface: Interface }; export interface QueryDeclaration { + /** Exported local projection; compilation also creates its direct admission. */ + fragment?: { name: string; operation?: string; admission?: boolean }; + importedFragments?: { + packageRevisionId: string; + packageAlias?: string; + fragmentId: string; + variables: Record; + }[]; placement?: { kind: "replica" } | { kind: "local"; sourceQueryId: string }; id: string; displayName: string; @@ -83,6 +91,7 @@ export class QueryCompileError extends Error { } } export interface CheckedQuery { + fragmentContracts?: Record>; declaration: QueryDeclaration; definitionDigest: string; /** Fixed, validated document: never supplied by runtime callers. */ @@ -102,6 +111,14 @@ export type QueryArgument = | { kind: "list"; values: QueryArgument[] } | { kind: "object"; fields: Record }; export interface QuerySelection { + /** A checked occurrence marker, not an output field or storage capability. */ + fragmentSpread?: { + package: string; + fragment: string; + digest: string; + root: InterfaceRevisionId; + variables: Record; + }; name: string; key: string; interfaceRevisionId?: InterfaceRevisionId; diff --git a/test/capability-assembly.test.ts b/test/capability-assembly.test.ts index 84f72b5..94dad83 100644 --- a/test/capability-assembly.test.ts +++ b/test/capability-assembly.test.ts @@ -218,3 +218,50 @@ package Runtime id "package:runtime" revision "package:runtime@1" { } /requires external interface Named \(interface:named@1\)/, ); }); + +test("resource-owned fragment imports compile through the locked package closure", async (context) => { + const directory = await mkdtemp(path.join(os.tmpdir(), "quixos-fragment-assembly-")); + context.after(() => rm(directory, { recursive: true, force: true })); + const dirs = Object.fromEntries(["item", "rows", "screen"].map((name) => [name, path.join(directory, name)])); + await Promise.all(Object.values(dirs).map((dir) => mkdir(dir))); + const dependency = (kind: string, name: string) => + `${kind} ${name} source {repository "https://example.test/${name.toLowerCase()}.git"; commit "${namedCommit}";}`; + await writeFile(path.join(dirs.item!, "quixos.lock"), lock()); + await writeFile( + path.join(dirs.item!, "interface.qx"), + `interface Item id "item" revision "item@1" {queryable value title id "title" : string {get id "title:get" execution snapshot targets [browser,server];}}`, + ); + await writeFile(path.join(dirs.rows!, "quixos.lock"), lock(dependency("interface", "Item"))); + await writeFile( + path.join(dirs.rows!, "package.qx"), + `import interface Item; package Rows id "rows" revision "rows@1" {query fragment Row id "row" root Item document "row.graphql" fragment "Row";}`, + ); + await writeFile(path.join(dirs.rows!, "row.graphql"), "fragment Row on Item {_camino {ref} title}"); + await writeFile( + path.join(dirs.screen!, "quixos.lock"), + lock(dependency("interface", "Item") + dependency("package", "Rows")), + ); + await writeFile( + path.join(dirs.screen!, "package.qx"), + `import interface Item; import package Rows; package Screen id "screen" revision "screen@1" { + query Inputs id "inputs" root Item document "screen.graphql" operation "Screen" {replica; fragments Rows.Row;} + query View id "view" root Item document "screen.graphql" operation "Screen" {local from Inputs; fragments Rows.Row;} + }`, + ); + await writeFile(path.join(dirs.screen!, "screen.graphql"), "query Screen {root {...Row}}"); + const result = await compileCapabilityResourceRepository({ + rootDirectory: dirs.screen!, + kind: "package", + source: { resolver: "git", repository: "https://example.test/screen.git", commit: packageCommit }, + resolveResource: async (source) => { + const name = new URL(source.repository).pathname.slice(1, -4); + assert.ok(dirs[name], name); + return { directory: dirs[name]! }; + }, + }); + assert.equal(result.resource.kind, "package"); + if (result.resource.kind !== "package") throw Error("expected package"); + const view = result.resource.revision.checkedQueries!.find((q) => q.declaration.id === "view")!; + assert.equal(view.selection[0]!.selection[0]!.fragmentSpread?.package, "rows@1"); + assert.equal(result.resources.length, 3); +}); diff --git a/test/query-fragments.test.ts b/test/query-fragments.test.ts new file mode 100644 index 0000000..c202af9 --- /dev/null +++ b/test/query-fragments.test.ts @@ -0,0 +1,184 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import { compileCapabilityResourceSource } from "../src/capability-language/parser.js"; +import { compileQuery } from "../src/query/compile.js"; +import type { PackageRevision } from "../src/capability-model/types.js"; +const source = { repository: "https://example.test/fragments", commit: "a".repeat(40) }; +const compiled = compileCapabilityResourceSource( + `interface Item id "item" revision "item@1" { + queryable value title id "title" : string {get id "title:get" execution snapshot targets [browser,server];} + queryable rpc value remote id "remote" : string {get id "remote:get";} +}`, + { source }, +); +if (!compiled.ok || compiled.resource.kind !== "interface") throw Error(JSON.stringify(compiled.diagnostics)); +const item = compiled.resource.revision; +function pkg(body: string, imports: PackageRevision[] = [], name = "Views") { + const result = compileCapabilityResourceSource( + `import interface Item; ${imports.map((p) => `import package ${p.displayName};`).join(" ")} package ${name} id "${name}" revision "${name}@1" {${body}}`, + { + source, + environment: { + interfaces: new Map([["Item", item]]), + interfaceClosure: [item], + packages: new Map(imports.map((p) => [p.displayName, p])), + }, + }, + ); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + if (result.resource.kind !== "package") throw Error("package required"); + return result.resource.revision; +} +test("exported fragments generate local projection and direct admission", async () => { + const p = pkg('query fragment Row id "row" root Item document "row.graphql" fragment "Row";'); + assert.equal(p.queries!.length, 2); + const local = p.queries!.find((q) => !q.fragment?.admission)!; + assert.equal(local.placement?.kind, "local"); + const checked = await compileQuery(local, [item], async () => "fragment Row on Item {_camino {ref} title}"); + assert.equal(checked.output.kind, "record"); + assert.match(checked.document, /query QuixosFragment/); + await assert.rejects( + compileQuery(local, [item], async () => "fragment Row on Item {remote}"), + /QUERY_LOCAL_DEPENDENCY/, + ); +}); +test("imported fragments retain checked occurrences and require exact roots", async () => { + const provider = pkg('query fragment Row id "row" root Item document "row.graphql" fragment "Row";', [], "Provider"); + const checked = await compileQuery( + provider.queries!.find((q) => !q.fragment?.admission)!, + [item], + async () => "fragment Row on Item {_camino {ref} title}", + ); + const consumer = pkg( + 'query Screen id "screen" root Item document "screen.graphql" operation "Screen" {replica; fragments Provider.Row;}', + [provider], + ); + const result = await compileQuery( + consumer.queries![0]!, + [item], + async () => "query Screen {root {...Row}}", + async () => checked, + ); + assert.equal(result.selection[0]!.selection[0]!.fragmentSpread?.digest, checked.definitionDigest); + assert.equal(result.selection[0]!.selection[0]!.fragmentSpread?.root, item.revisionId); + assert.ok(result.effects.some((e) => e.memberId === "title")); + const wrong = { + ...checked, + declaration: { + ...checked.declaration, + root: { ...checked.declaration.root, interface: "different@1" as typeof item.revisionId }, + }, + }; + await assert.rejects( + compileQuery( + consumer.queries![0]!, + [item], + async () => "query Screen {root {...Row}}", + async () => wrong, + ), + /FRAGMENT_ROOT_MISMATCH/, + ); +}); +test("fragment variable mappings are explicit and checked", async () => { + const provider = pkg( + 'query fragment Row id "row" root Item document "row.graphql" fragment "Row" operation "Inputs";', + [], + "Provider", + ); + const checked = await compileQuery( + provider.queries!.find((q) => !q.fragment?.admission)!, + [item], + async () => + "query Inputs($show: Boolean!) {root {...Row}} fragment Row on Item {_camino {ref} title @include(if:$show)}", + ); + const build = (mapping: string) => + pkg( + `query Screen id "screen" root Item document "screen.graphql" operation "Screen" {replica; fragments Provider.Row ${mapping};}`, + [provider], + ).queries![0]!; + const document = "query Screen($visible: Boolean!) {root {...Row}}"; + await assert.rejects( + compileQuery( + build(""), + [item], + async () => document, + async () => checked, + ), + /FRAGMENT_VARIABLE_MAPPING/, + ); + const result = await compileQuery( + build("with {show to visible;}"), + [item], + async () => document, + async () => checked, + ); + assert.deepEqual(result.selection[0]!.selection[0]!.fragmentSpread?.variables, { show: "visible" }); + await assert.rejects( + compileQuery( + build("with {show to visible;}"), + [item], + async () => document.replace("Boolean!", "Boolean"), + async () => checked, + ), + /FRAGMENT_VARIABLE_TYPE/, + ); +}); + +test("independent fragment package survives execution lowering and typed client generation", async () => { + const { loadReaderWorkspace, readReaderFixture } = await import("./reader-fixture.js"); + const { compileExecutionPlan } = await import("../src/execution-world/plan.js"); + const { compileQueryProgram } = await import("../src/execution-world/queries.js"); + const { generatePackageQueryClientBindings } = await import("../src/execution-world/client-contracts.js"); + const workspace = await loadReaderWorkspace(); + const comment = workspace.interfaceImports.find((i) => i.displayName === "CommentData")!; + const parsed = compileCapabilityResourceSource( + `import interface CommentData; package CommentRows id "comment-rows" revision "comment-rows@1" { + query fragment Row id "row" root CommentData document "row.graphql" fragment "CommentRow"; + }`, + { source, environment: { interfaces: new Map([["CommentData", comment]]), interfaceClosure: [comment] } }, + ); + assert.ok(parsed.ok, JSON.stringify(parsed.diagnostics)); + if (parsed.resource.kind !== "package") throw Error("expected package"); + const provider = parsed.resource.revision; + provider.checkedQueries = await Promise.all( + provider.queries!.map((q) => + compileQuery( + q, + workspace.interfaceImports, + async () => "fragment CommentRow on CommentData {_camino {ref} content {text tags}}", + ), + ), + ); + workspace.packageImports.push(provider); + const consumer = workspace.packageImports.find((p) => p.displayName === "ReaderRuntime")!; + const declaration = consumer.queries!.find((q) => q.displayName === "ReaderScreen")!; + declaration.importedFragments = [ + { packageRevisionId: provider.revisionId, packageAlias: "CommentRows", fragmentId: "row", variables: {} }, + ]; + const document = (await readReaderFixture("queries/reader-screen.graphql")).replace( + "_camino { ref } content { text tags }", + "...CommentRow", + ); + const checked = await compileQuery( + declaration, + workspace.interfaceImports, + async () => document, + async () => provider.checkedQueries!.find((q) => q.declaration.id === "row")!, + ); + consumer.checkedQueries = consumer.checkedQueries!.map((q) => (q.declaration.id === declaration.id ? checked : q)); + const plan = compileExecutionPlan(workspace); + const program = compileQueryProgram(plan) as { + queries: { id: string; fragment?: { package: string; id: string }; selection: unknown }[]; + }; + assert.deepEqual(program.queries.find((q) => q.fragment)?.fragment, { + package: provider.revisionId, + id: "row", + digest: provider.checkedQueries!.find((q) => q.declaration.id === "row")!.definitionDigest, + }); + const screen = program.queries.find((q) => q.id === JSON.stringify([consumer.revisionId, declaration.id]))!; + assert.match(JSON.stringify(screen.selection), /fragmentSpread/); + const generated = generatePackageQueryClientBindings(consumer, undefined, workspace.packageImports); + assert.match(generated, /"CommentRows": \{"Row": definePackageFragment/); + assert.ok(generated.includes(JSON.stringify(comment.revisionId))); + assert.ok(!generated.includes('"Row$inputs": definePackageQuery')); +}); From b8571d054bb93ae1854065266b5a3465e62f992e Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Tue, 22 Sep 2026 16:19:05 -0700 Subject: [PATCH 59/91] Build reusable React component hosting and typed fragment composition --- src/capability-language/parser.ts | 7 +++++ src/capability-model/types.ts | 2 ++ src/execution-world/client-contracts.ts | 25 +++++++++++++++--- src/execution-world/installation.ts | 35 +++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 4 deletions(-) diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index 8550a6d..66fca08 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -2799,6 +2799,13 @@ const compileCapabilityResourceSourceInternal = ( revision: lowerPackage(state, context, options.source), }; if (resource.revision.modules?.length) { + resource.revision.clientPackages = Object.fromEntries( + imports.flatMap((entry) => { + if (entry.kind !== "package") return []; + const imported = options.environment?.packages?.get(entry.binding); + return imported ? [[entry.binding, imported.revisionId]] : []; + }), + ); resource.revision.clientInterfaces = Object.fromEntries( imports.flatMap((entry) => { if (entry.kind !== "interface") return []; diff --git a/src/capability-model/types.ts b/src/capability-model/types.ts index c23f68f..58d4690 100644 --- a/src/capability-model/types.ts +++ b/src/capability-model/types.ts @@ -324,6 +324,8 @@ export interface PackageRevision { modules?: PackageModule[]; /** Closed interface imports exposed to this package's checked component bindings. */ clientInterfaces?: Record; + /** Explicit package imports supplying module selections, never the whole workspace. */ + clientPackages?: Record; controllers?: PackageController[]; queries?: import("../query/types.js").QueryDeclaration[]; checkedQueries?: import("../query/types.js").CheckedQuery[]; diff --git a/src/execution-world/client-contracts.ts b/src/execution-world/client-contracts.ts index 3dceb32..bbcbb67 100644 --- a/src/execution-world/client-contracts.ts +++ b/src/execution-world/client-contracts.ts @@ -99,6 +99,7 @@ export function linkPackageQuery(plan: ExecutionPlan, contract: PublicQueryContr export function generateInterfaceClientBindings( imports: Readonly>, runtimeModule = "@quixos/camino-replica-core", + moduleProps?: (interfaceId: string, memberId: string) => string, ): string { const entries = Object.entries(imports).map(([alias, iface]) => { if (iface.template) @@ -108,6 +109,10 @@ export function generateInterfaceClientBindings( "Specialize the interface before generating a client", ); const members = iface.members.map((member) => { + if (member.kind === "module" && member.subject?.kind === "interface") { + const subject = member.subject.interfaceRevisionId; + return `${JSON.stringify(member.displayName)}: defineModuleMember<${JSON.stringify(subject)}, ${moduleProps?.(iface.revisionId, member.id) ?? "{}"}>(${JSON.stringify({ interface: iface.revisionId, member: member.id, subject, contract: member.contract })})`; + } const operations = member.operations .filter((op) => op.mode === "call") .map( @@ -118,7 +123,7 @@ export function generateInterfaceClientBindings( }); return `${JSON.stringify(alias)}: {${members.join(",\n")}}`; }); - return `// Generated from imported interface contracts. Regenerate; do not edit.\nimport { defineInterfaceOperation, type PreparedChange, type ManagedReference } from ${JSON.stringify(runtimeModule)};\nexport const interfaces = {${entries.join(",\n")}} as const;\n`; + return `// Generated from imported interface contracts. Regenerate; do not edit.\nimport { defineModuleMember, defineInterfaceOperation, type PreparedChange, type ManagedReference } from ${JSON.stringify(runtimeModule)};\nexport const interfaces = {${entries.join(",\n")}} as const;\n`; } export function generatePackageQueryClientBindings( @@ -203,8 +208,10 @@ export function generateComponentClientBindings(plan: ExecutionPlan, packageRevi Object.entries(pkg.clientInterfaces ?? {}).map(([alias, id]) => [alias, find(id)]), ); const subjects = Object.fromEntries(components.map((component) => [component.displayName, find(component.subject)])); - const interfaces = generateInterfaceClientBindings(imports, "@quixos/camino-react"); - const subjectBindings = generateInterfaceClientBindings(subjects, "@quixos/camino-react") + const props = (iface: string, member: string) => + `ExtraModuleProps<${JSON.stringify(JSON.stringify([iface, member]))}>`; + const interfaces = generateInterfaceClientBindings(imports, "@quixos/camino-react", props); + const subjectBindings = generateInterfaceClientBindings(subjects, "@quixos/camino-react", props) .split("\n") .filter((line) => !line.startsWith("import ")) .join("\n") @@ -219,10 +226,20 @@ export function generateComponentClientBindings(plan: ExecutionPlan, packageRevi .join("\n"); return ( interfaces + - '\nimport {definePackageQuery,definePackageFragment,type ComponentType,type ComponentProps} from "@quixos/camino-react";\n' + + '\nimport {createObjectRenderer,definePackageQuery,definePackageFragment,type ComponentType,type ComponentProps} from "@quixos/camino-react";\n' + subjectBindings + "\n" + queries + + `\nexport const providers = {${Object.entries(pkg.clientPackages ?? {}) + .map(([alias, id]) => { + const imported = plan.definition.workspace.packageImports.find((entry) => entry.revisionId === id); + if (!imported) throw new ExecutionPlanError("UNINSTALLED_PACKAGE", id, "Missing imported module provider"); + return `${JSON.stringify(alias)}:{${(imported.modules ?? []).map((module) => `${JSON.stringify(module.displayName)}:${JSON.stringify({ packageRevision: id, id: module.id })}`).join(",")}}`; + }) + .join(",")}} as const;\n` + + `\nexport const renderers = {${Object.entries(imports) + .map(([name, iface]) => `${JSON.stringify(name)}:createObjectRenderer(${JSON.stringify(iface.revisionId)})`) + .join(",\n")}} as const;\n` + "\nexport interface ModuleProps {}\n" + "export type ExtraModuleProps = K extends keyof ModuleProps ? ModuleProps[K] : {};\n" + "export interface Modules {\n" + diff --git a/src/execution-world/installation.ts b/src/execution-world/installation.ts index 116d330..0adc7f5 100644 --- a/src/execution-world/installation.ts +++ b/src/execution-world/installation.ts @@ -29,6 +29,13 @@ export interface ClientContractCatalog { readonly queries: readonly PublicQueryContract[]; readonly components: readonly InstalledComponent[]; readonly presentations: readonly { id: string; subject: string; packageRevision: string; component: string }[]; + readonly moduleBindings: readonly { + atom: string; + interface: string; + member: string; + packageRevision: string; + id: string; + }[]; } /** Explicit projection prevents accidental spreading of filesystem roots or private bindings. */ export function clientContractCatalog( @@ -68,6 +75,17 @@ export function clientContractCatalog( (pkg.checkedQueries ?? []).map((q) => publicQueryContract(pkg, q.declaration.id)), ), components: installation.components.filter((c) => requestedPackages.includes(c.packageRevision)), + moduleBindings: plan.definition.workspace.conformances.flatMap((c) => + (c.moduleBindings ?? []) + .filter((b) => requestedPackages.includes(b.packageRevisionId)) + .map((b) => ({ + atom: c.atomId, + interface: c.interfaceRevisionId, + member: b.memberId, + packageRevision: b.packageRevisionId, + id: b.moduleId, + })), + ), presentations: (plan.definition.presentations ?? []) .filter((p) => requestedPackages.includes(p.packageRevisionId)) .map((p) => ({ id: p.id, subject: p.subject, packageRevision: p.packageRevisionId, component: p.componentId })), @@ -99,6 +117,12 @@ export interface ExecutionInstallation { } /** Safe to expose in a presentation catalog: no source paths, state slots, or host configuration. */ export interface InstalledComponent { + readonly role: { + readonly interface: string; + readonly member: string; + readonly subject: string; + readonly contract: string; + }; readonly packageRevision: string; readonly id: string; readonly subject: string; @@ -176,6 +200,17 @@ function assembleExecutionInstallation( routes[url] ??= { path: path.join(root, file.path), mediaType: file.mediaType }; } components.push({ + role: (() => { + const module = plan.definition.packages + .find((p) => p.revision === revision)! + .modules!.find((m) => m.id === component.id)!; + return { + interface: module.interfaceRevisionId, + member: module.memberId, + subject: component.subject, + contract: module.contract, + }; + })(), packageRevision: revision, id: component.id, subject: component.subject, From ca83dbd1a7daadf151ea71c62c3cd144b5bff547 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Tue, 22 Sep 2026 16:48:16 -0700 Subject: [PATCH 60/91] Add bounded live query cursor continuation --- src/execution-world/plan.ts | 29 ++++++++++++++++++++------ src/execution-world/query-operators.ts | 2 -- test/query-aggregation.test.ts | 8 +++++++ test/query-cursor-validation.test.ts | 20 ++++++++++++++++++ 4 files changed, 51 insertions(+), 8 deletions(-) create mode 100644 test/query-cursor-validation.test.ts diff --git a/src/execution-world/plan.ts b/src/execution-world/plan.ts index 4fe1390..22a0ef1 100644 --- a/src/execution-world/plan.ts +++ b/src/execution-world/plan.ts @@ -382,12 +382,20 @@ export function compileExecutionPlan(input: WorkspaceRevision): ExecutionPlan { "Local and replica queries must use the same root contract", ); const traversals = (linked: LinkedQuery) => { - const paths = new Map(); + const paths = new Map }>(); + const entry = (key: string) => { + let value = paths.get(key); + if (!value) { + value = { complete: false, requiresComplete: false, windows: new Set() }; + paths.set(key, value); + } + return value; + }; const visit = (selections: LinkedQuery["checked"]["selection"], parents: string[]) => { for (const selection of selections) { for (const stage of selection.relational?.stages ?? []) { if (stage.operation.kind === "source") - paths.set(JSON.stringify([...parents, stage.operation.memberId]), false); + entry(JSON.stringify([...parents, stage.operation.memberId])).requiresComplete = true; } const member = selection.interfaceRevisionId ? interfaces.get(selection.interfaceRevisionId)?.members.find((m) => m.id === selection.memberId) @@ -397,7 +405,11 @@ export function compileExecutionPlan(input: WorkspaceRevision): ExecutionPlan { const many = member.cardinality === "many" || member.cardinality === "many-unique"; const complete = !selection.predicate && (!many || !!selection.arguments.all); const key = JSON.stringify(path); - paths.set(key, complete || paths.get(key) === true); + const value = entry(key); + value.complete ||= complete; + if (selection.arguments.first) + value.windows.add(canonicalJson({ arguments: selection.arguments, conditions: selection.conditions })); + else value.requiresComplete = true; } visit(selection.selection, path); } @@ -406,18 +418,23 @@ export function compileExecutionPlan(input: WorkspaceRevision): ExecutionPlan { return paths; }; const admittedTraversals = traversals(source.query); - for (const traversal of traversals(query.query).keys()) { + for (const [traversal, needed] of traversals(query.query)) { if (!admittedTraversals.has(traversal)) throw new ExecutionPlanError( "REPLICA_TRAVERSAL_MISSING", query.id, `Replica source does not admit relationship path ${traversal}`, ); - if (!admittedTraversals.get(traversal)) + if ( + !admittedTraversals.get(traversal)!.complete && + (needed.requiresComplete || + !needed.windows.size || + [...needed.windows].some((window) => !admittedTraversals.get(traversal)!.windows.has(window))) + ) throw new ExecutionPlanError( "REPLICA_RELATION_INCOMPLETE", query.id, - `Local relationship ${traversal} needs an unfiltered bounded all selection in its replica source; a filtered/windowed source cannot supply unseen matches`, + `Local relationship ${traversal} needs either complete source candidates or the identical confirmed first window; a window cannot supply unseen matches`, ); } // The admission executor follows these canonical dependencies on the admitted roots. diff --git a/src/execution-world/query-operators.ts b/src/execution-world/query-operators.ts index 16e0abf..3555478 100644 --- a/src/execution-world/query-operators.ts +++ b/src/execution-world/query-operators.ts @@ -22,8 +22,6 @@ export function unsupportedQueryOperator(query: CheckedQuery): string | undefine selections.some((selection) => selection.conditions.length > 0 || conditional(selection.selection)); const walk = (selections: readonly QuerySelection[]): string | undefined => { for (const selection of selections) { - const after = selection.arguments.after; - if (after && !(after.kind === "literal" && after.value === null)) return "cursor continuation"; if (selection.predicate) { const reason = predicate(selection.predicate); if (reason) return reason; diff --git a/test/query-aggregation.test.ts b/test/query-aggregation.test.ts index 5a563d8..1ecd2b8 100644 --- a/test/query-aggregation.test.ts +++ b/test/query-aggregation.test.ts @@ -112,6 +112,14 @@ test("typed reference operands and scalar membership tests reject unbounded lite test("new runtime operator matrix accepts direct count and rejects unsupported relational plans", async () => { const { unsupportedQueryOperator } = await import("../src/execution-world/query-operators.js"); assert.equal(unsupportedQueryOperator(await compile("aggregate { count }")), undefined); + assert.equal( + unsupportedQueryOperator( + await compileAggregationDocument( + `query Report($after: Cursor) {root {tasks(first: 30, after: $after, orderBy: [{cost: ASC}]) {entries {cursor node {cost}} pageInfo {hasNextPage endCursor}}}}`, + ), + ), + undefined, + ); for (const expression of [ "aggregate { sum { estimatedHours } }", "filter(where: {estimatedHours: {gt: 0}}) { aggregate { count } }", diff --git a/test/query-cursor-validation.test.ts b/test/query-cursor-validation.test.ts new file mode 100644 index 0000000..0fc6df2 --- /dev/null +++ b/test/query-cursor-validation.test.ts @@ -0,0 +1,20 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { loadReaderWorkspace } from "./reader-fixture.js"; +import { compileExecutionPlan } from "../src/execution-world/index.js"; +test("local relationship pages may reuse exactly the confirmed source window", async () => { + const workspace = await loadReaderWorkspace((name, text) => { + if (name === "queries/replica-inputs.graphql") + return text.replace("highlights(all: 1000)", "highlights(first: 10)"); + if (name === "queries/reader-screen.graphql") + return text + .replace("ReaderScreen($color: String!)", "ReaderScreen") + .replace( + "highlights(all: 1000, where: {color: {eq: $color}}, orderBy: [{range: {start: ASC}}])", + "highlights(first: 10)", + ) + .replace("_camino { relations { highlights { aggregate { count } } } }", ""); + return text; + }); + assert.doesNotThrow(() => compileExecutionPlan(workspace)); +}); From bcc915d597ff7dd587d12cda97bddec41e340190 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Tue, 22 Sep 2026 17:05:36 -0700 Subject: [PATCH 61/91] Expose bounded public reflection and presentation discovery --- src/execution-world/index.ts | 2 + src/execution-world/public-reflection.ts | 94 ++++++++++++++++++++++++ test/execution-world.test.ts | 32 ++++++++ 3 files changed, 128 insertions(+) create mode 100644 src/execution-world/public-reflection.ts diff --git a/src/execution-world/index.ts b/src/execution-world/index.ts index 84752e7..b60b9f4 100644 --- a/src/execution-world/index.ts +++ b/src/execution-world/index.ts @@ -17,3 +17,5 @@ export { generatePortableClientBindings } from "../bindings/portable-client.js"; export * from "./candidate.js"; export { reviewSemanticMajors } from "../capability-model/evolution.js"; + +export * from "./public-reflection.js"; diff --git a/src/execution-world/public-reflection.ts b/src/execution-world/public-reflection.ts new file mode 100644 index 0000000..f8b5fa2 --- /dev/null +++ b/src/execution-world/public-reflection.ts @@ -0,0 +1,94 @@ +import { compileKernelProgram } from "./kernel.js"; +import { hexDigest, type ExecutionPlan } from "./plan.js"; +import { clientContractCatalog, type ExecutionInstallation } from "./installation.js"; +import { publicOperationContract, publicQueryContract } from "./client-contracts.js"; + +/** Explicit public projection. Never serialize conformance storage or package ports. */ +export function publicDefinitionSnapshot(plan: ExecutionPlan, installation: ExecutionInstallation) { + const workspace = plan.definition.workspace; + const kernel = compileKernelProgram(plan) as { + operations: { + atom: string; + interface: string; + operation: string; + unsupported: string | null; + effect: string; + targets: string[]; + }[]; + }; + const catalog = clientContractCatalog( + plan, + installation, + installation.packages.map((pkg) => pkg.revision), + ); + const rows = { + atoms: workspace.atoms.map((atom) => ({ id: atom.id, name: atom.displayName, documentation: atom.documentation })), + interfaces: workspace.interfaceImports.map((iface) => ({ + id: iface.revisionId, + interface: iface.interfaceId, + name: iface.displayName, + source: iface.source, + template: iface.template, + application: iface.application, + requiredInterfaces: iface.requiredInterfaces ?? [], + argumentRequirements: iface.argumentRequirements ?? [], + members: iface.members.map((member) => ({ + ...member, + operations: member.operations.map((operation) => ({ + ...operation, + ...(operation.mode === "call" && !iface.template + ? { descriptor: publicOperationContract(iface, operation) } + : {}), + })), + })), + })), + conformances: workspace.conformances.map((c) => ({ + id: JSON.stringify([c.atomId, c.interfaceRevisionId]), + atom: c.atomId, + interface: c.interfaceRevisionId, + semanticMajor: c.semanticMajor ?? 0, + operations: ( + workspace.interfaceImports.find((iface) => iface.revisionId === c.interfaceRevisionId)?.members ?? [] + ).flatMap((member) => + member.operations.map((operation) => { + const installed = kernel.operations.find( + (op) => op.atom === c.atomId && op.interface === c.interfaceRevisionId && op.operation === operation.id, + ); + return { + operation: operation.id, + available: !!installed && !installed.unsupported, + unavailable: installed?.unsupported ?? (installed ? null : "NOT_CALLABLE"), + execution: installed ? { kind: installed.effect, targets: installed.targets } : null, + }; + }), + ), + modules: catalog.moduleBindings.filter( + (binding) => binding.atom === c.atomId && binding.interface === c.interfaceRevisionId, + ), + })), + queries: workspace.packageImports.flatMap((pkg) => + (pkg.checkedQueries ?? []).map((query) => ({ + id: JSON.stringify([pkg.revisionId, query.declaration.id]), + name: query.declaration.displayName, + package: pkg.revisionId, + descriptor: publicQueryContract(pkg, query.declaration.id), + fragment: query.declaration.fragment, + limits: query.declaration.budgets, + watch: query.declaration.watch, + })), + ), + presentations: catalog.components.map((component) => ({ + id: JSON.stringify([component.packageRevision, component.id]), + component, + registrations: catalog.presentations.filter( + (p) => p.packageRevision === component.packageRevision && p.component === component.id, + ), + })), + }; + const publicRows = JSON.parse(JSON.stringify(rows)) as Record< + keyof typeof rows, + { id: string; [key: string]: unknown }[] + >; + for (const entries of Object.values(publicRows)) entries.sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0)); + return { codec: "camino-definitions-v1" as const, id: hexDigest(publicRows), rows: publicRows }; +} diff --git a/test/execution-world.test.ts b/test/execution-world.test.ts index 963d99f..9fe4eaf 100644 --- a/test/execution-world.test.ts +++ b/test/execution-world.test.ts @@ -308,3 +308,35 @@ test("a count-only local query still requires complete relationship admission", assert.throws(() => compileExecutionPlan(workspace), /REPLICA_TRAVERSAL_MISSING|REPLICA_RELATION_INCOMPLETE/); } }); + +test("public reflection contains nominal contracts and callable descriptors without private bindings", async () => { + const { publicDefinitionSnapshot } = await import("../src/execution-world/public-reflection.js"); + const plan = compileExecutionPlan(await loadReaderWorkspace()); + const installation = { + codec: "camino-execution-installation-v1" as const, + plan: plan.digest, + world: "test", + packages: plan.definition.workspace.packageImports.map((pkg) => ({ + revision: pkg.revisionId, + root: "private-installation-root", + })), + components: [], + routes: {}, + }; + const snapshot = publicDefinitionSnapshot(plan, installation); + assert.ok(snapshot.rows.interfaces.length); + assert.ok(snapshot.rows.queries.length); + assert.ok(snapshot.rows.conformances.length); + const publicText = JSON.stringify(snapshot); + for (const privateKey of [ + "privateAttachments", + "operationBindings", + "relationshipMaterializations", + "storagePolicy", + "ports", + ]) + assert.ok(!publicText.includes('"' + privateKey + '"'), privateKey); + assert.ok(publicText.includes('"descriptor"')); + assert.ok(publicText.includes('"scope":"class"')); + assert.equal(snapshot.id, publicDefinitionSnapshot(plan, installation).id); +}); From c5e79ae3c9fcf3ba4420f2fdb5e3f7317965530e Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Tue, 22 Sep 2026 17:22:48 -0700 Subject: [PATCH 62/91] Add bounded public member inspection through shared query scopes --- src/execution-world/inspection.ts | 176 +++++++++++++++++++++++ src/execution-world/installation.ts | 11 +- src/execution-world/public-reflection.ts | 30 ++-- src/execution-world/queries.ts | 82 ++++++----- test/inspection.test.ts | 35 +++++ 5 files changed, 282 insertions(+), 52 deletions(-) create mode 100644 src/execution-world/inspection.ts create mode 100644 test/inspection.test.ts diff --git a/src/execution-world/inspection.ts b/src/execution-world/inspection.ts new file mode 100644 index 0000000..d2b879e --- /dev/null +++ b/src/execution-world/inspection.ts @@ -0,0 +1,176 @@ +import { compileKernelProgram } from "./kernel.js"; +import { hexDigest, type ExecutionPlan } from "./plan.js"; +import type { PublicQueryContract } from "./client-contracts.js"; +import { portableValueSchema } from "../bindings/portable.js"; +const scalar = (name: string) => ({ kind: "scalar", name }); +const record = (fields: Record) => ({ kind: "record", fields }); +const optional = (value: unknown) => ({ kind: "optional", value }); +const selection = (name: string, extra: Record = {}) => ({ + name, + key: name, + arguments: {}, + conditions: [], + selection: [], + ...extra, +}); +const variable = (name: string) => ({ kind: "variable", name }); +const meta = () => selection("_camino", { selection: [selection("ref")] }); +export const inspectionPackage = "org.quixos.inspection/1"; +export interface InspectionTemplate { + interface: string; + members: { id: string; name: string; key: string; flag: string; lane: "local" | "server"; many: boolean }[]; + inputs?: PublicQueryContract; + view?: PublicQueryContract; + server?: PublicQueryContract; +} +/** A finite installed template per interface/lane, not a per-client query compiler. + * Flags select public cache boundaries; normal scope identity bounds specialization. */ +export function compileInspectionTemplates(plan: ExecutionPlan) { + const kernel = compileKernelProgram(plan) as { + operations: { + key: string; + atom: string; + interface: string; + operation: string; + effect: string; + targets: string[]; + unsupported: string | null; + output: unknown; + binding: { kind: string }; + }[]; + }; + const queries: unknown[] = [], + contracts: PublicQueryContract[] = [], + templates: InspectionTemplate[] = []; + for (const iface of plan.definition.workspace.interfaceImports) { + if (iface.template) continue; + const atoms = plan.definition.workspace.conformances + .filter((c) => c.interfaceRevisionId === iface.revisionId) + .map((c) => c.atomId) + .sort(); + if (!atoms.length) continue; + const members = iface.members + .filter((member) => (member.kind === "value" || member.kind === "relationship") && member.queryRead) + .sort((a, b) => (a.id < b.id ? -1 : 1)); + if (!members.length || members.length > 128) continue; + const template: InspectionTemplate = { interface: iface.revisionId, members: [] }; + for (const lane of ["local", "server"] as const) { + const fields: unknown[] = [], + selections: unknown[] = [], + inputFields: Record = {}, + outputFields: Record = {}; + for (const [index, member] of members.entries()) { + if (member.kind !== "value" && member.kind !== "relationship") continue; + const getter = member.operations.find((op) => op.displayName === (member.kind === "value" ? "get" : "resolve")); + if (!getter) continue; + const providers = atoms.map((atom) => + kernel.operations.find( + (op) => op.atom === atom && op.interface === iface.revisionId && op.operation === getter.id, + ), + ); + if (providers.some((op) => !op || op.unsupported || !["snapshot", "remote"].includes(op.effect))) continue; + const portable = providers.every((op) => op!.effect === "snapshot" && op!.targets.includes("browser")); + if (lane === "local" && !portable) continue; + const key = "m" + index, + flag = "s" + index; + const many = member.kind === "relationship" && ["many", "many-unique"].includes(member.cardinality); + // Only native edges promise the relationship traversal used by the interpreter. + if (member.kind === "relationship" && providers.some((op) => op!.binding.kind !== "edge")) continue; + if (lane === "local" || !portable) + template.members.push({ id: member.id, name: member.displayName, key, flag, lane, many }); + inputFields[flag] = scalar("bool"); + const field = selection(member.displayName, { + key, + interfaceRevisionId: iface.revisionId, + memberId: member.id, + conditions: [{ include: true, value: variable(flag) }], + }); + let output = portableValueSchema(getter.outputType); + if (member.kind === "relationship") { + const expectation = + member.target.kind === "atom" + ? { kind: "atom", id: member.target.atomId } + : { kind: "interface", id: member.target.interfaceRevisionId }; + const node = record({ _camino: record({ ref: { kind: "object-ref", expectation } }) }); + if (member.target.kind === "interface") + Object.assign(field, { targetInterfaceRevisionId: member.target.interfaceRevisionId }); + if (many) { + inputFields[key + "First"] = scalar("int32"); + inputFields[key + "After"] = optional(scalar("string")); + Object.assign(field, { + arguments: { first: variable(key + "First"), after: variable(key + "After") }, + selection: [ + selection("entries", { selection: [selection("key"), selection("node", { selection: [meta()] })] }), + selection("pageInfo", { selection: [selection("hasNextPage"), selection("endCursor")] }), + ], + }); + output = record({ + entries: { kind: "list", value: record({ key: scalar("string"), node }) }, + pageInfo: record({ hasNextPage: scalar("bool"), endCursor: optional(scalar("string")) }), + }); + } else { + Object.assign(field, { selection: [meta()] }); + output = node; + } + } + outputFields[key] = optional(output); + selections.push(field); + for (const op of providers) + fields.push({ + atom: op!.atom, + interface: iface.revisionId, + member: member.id, + name: member.displayName, + operation: op!.key, + }); + } + if (!selections.length) continue; + const root = { kind: "object" as const, interface: iface.revisionId }; + const input = record(inputFields), + output = record({ root: record(outputFields) }); + const base = { + root, + atoms, + variables: input, + defaults: {}, + selection: [selection("root", { selection: selections })], + fields, + admittedOperations: [], + budgets: { + rows: 512, + depth: 8, + resultBytes: 8 * 1024 * 1024, + candidates: 1000, + rpcCalls: 128, + concurrency: 8, + deadlineMs: 10000, + }, + }; + for (const kind of lane === "local" ? (["inputs", "view"] as const) : (["server"] as const)) { + const query = JSON.stringify([iface.revisionId, kind]); + const sourceQuery = JSON.stringify([iface.revisionId, "inputs"]); + const program = { + ...base, + id: JSON.stringify([inspectionPackage, query]), + placement: kind === "inputs" ? "replica" : kind === "view" ? "local" : "remote", + source: kind === "view" ? JSON.stringify([inspectionPackage, sourceQuery]) : null, + }; + const contract: PublicQueryContract = { + package: inspectionPackage, + query, + definitionDigest: hexDigest(program), + root, + placement: kind === "inputs" ? "replica" : kind === "view" ? "local" : "server", + ...(kind === "view" ? { sourceQuery } : {}), + input, + output, + }; + queries.push(program); + contracts.push(contract); + template[kind] = contract; + } + } + if (template.members.length) templates.push(template); + } + return { queries, contracts, templates }; +} diff --git a/src/execution-world/installation.ts b/src/execution-world/installation.ts index 0adc7f5..fce93a4 100644 --- a/src/execution-world/installation.ts +++ b/src/execution-world/installation.ts @@ -1,3 +1,4 @@ +import { compileInspectionTemplates, type InspectionTemplate } from "./inspection.js"; import path from "node:path"; import { loadCheckedArtifactWorld } from "./receipts.js"; import { contentArtifactUrl, loadArtifactWorld, type LoadedArtifactWorld } from "./files.js"; @@ -24,6 +25,7 @@ export interface ExecutionGroupIdentity { readonly executionDigest: string; } export interface ClientContractCatalog { + readonly inspections: readonly InspectionTemplate[]; readonly resultInterfaces: Readonly>; readonly operations: readonly PublicOperationContract[]; readonly queries: readonly PublicQueryContract[]; @@ -66,14 +68,17 @@ export function clientContractCatalog( .map((operation) => publicOperationContract(iface, operation)), ), ); + const inspection = compileInspectionTemplates(plan); return { + inspections: inspection.templates, resultInterfaces: Object.fromEntries( plan.definition.operations.map((operation) => [operation.key, resultInterfaces(plan, operation.key)]), ), operations, - queries: packages.flatMap((pkg) => - (pkg.checkedQueries ?? []).map((q) => publicQueryContract(pkg, q.declaration.id)), - ), + queries: [ + ...inspection.contracts, + ...packages.flatMap((pkg) => (pkg.checkedQueries ?? []).map((q) => publicQueryContract(pkg, q.declaration.id))), + ], components: installation.components.filter((c) => requestedPackages.includes(c.packageRevision)), moduleBindings: plan.definition.workspace.conformances.flatMap((c) => (c.moduleBindings ?? []) diff --git a/src/execution-world/public-reflection.ts b/src/execution-world/public-reflection.ts index f8b5fa2..d828670 100644 --- a/src/execution-world/public-reflection.ts +++ b/src/execution-world/public-reflection.ts @@ -1,3 +1,4 @@ +import { compileInspectionTemplates } from "./inspection.js"; import { compileKernelProgram } from "./kernel.js"; import { hexDigest, type ExecutionPlan } from "./plan.js"; import { clientContractCatalog, type ExecutionInstallation } from "./installation.js"; @@ -66,17 +67,26 @@ export function publicDefinitionSnapshot(plan: ExecutionPlan, installation: Exec (binding) => binding.atom === c.atomId && binding.interface === c.interfaceRevisionId, ), })), - queries: workspace.packageImports.flatMap((pkg) => - (pkg.checkedQueries ?? []).map((query) => ({ - id: JSON.stringify([pkg.revisionId, query.declaration.id]), - name: query.declaration.displayName, - package: pkg.revisionId, - descriptor: publicQueryContract(pkg, query.declaration.id), - fragment: query.declaration.fragment, - limits: query.declaration.budgets, - watch: query.declaration.watch, + queries: [ + ...compileInspectionTemplates(plan).contracts.map((descriptor) => ({ + id: JSON.stringify([descriptor.package, descriptor.query]), + name: "Public inspection", + package: descriptor.package, + descriptor, + system: true, })), - ), + ...workspace.packageImports.flatMap((pkg) => + (pkg.checkedQueries ?? []).map((query) => ({ + id: JSON.stringify([pkg.revisionId, query.declaration.id]), + name: query.declaration.displayName, + package: pkg.revisionId, + descriptor: publicQueryContract(pkg, query.declaration.id), + fragment: query.declaration.fragment, + limits: query.declaration.budgets, + watch: query.declaration.watch, + })), + ), + ], presentations: catalog.components.map((component) => ({ id: JSON.stringify([component.packageRevision, component.id]), component, diff --git a/src/execution-world/queries.ts b/src/execution-world/queries.ts index 07d54f3..aff4ac9 100644 --- a/src/execution-world/queries.ts +++ b/src/execution-world/queries.ts @@ -1,3 +1,4 @@ +import { compileInspectionTemplates } from "./inspection.js"; import { portableValueSchema } from "../bindings/portable.js"; import { ExecutionPlanError, hexDigest, type ExecutionPlan } from "./plan.js"; import type { ValueType } from "../capability-model/types.js"; @@ -26,44 +27,47 @@ export function compileQueryProgram(plan: ExecutionPlan): unknown { return { codec: "camino-query-program-v1", plan: plan.digest, - queries: plan.definition.queries.map(({ id, query, admittedOperations }) => { - const checked = query.checked; - return { - id, - ...(checked.declaration.fragment && !checked.declaration.fragment.admission - ? { - fragment: { - package: query.packageRevisionId, - id: checked.declaration.id, - digest: checked.definitionDigest, - }, - } - : {}), - placement: checked.declaration.placement?.kind ?? "remote", - source: - checked.declaration.placement?.kind === "local" - ? JSON.stringify([query.packageRevisionId, checked.declaration.placement.sourceQueryId]) - : null, - root: checked.declaration.root, - atoms: query.rootAtoms, - variables: portableValueSchema(checked.variables), - defaults: checked.variableDefaults, - selection: lowerTypes(checked.selection), - budgets: checked.declaration.budgets, - fields: query.fields.map((field) => { - const member = interfaces - .find((i) => i.revisionId === field.interfaceRevisionId)! - .members.find((m) => m.id === field.memberId)!; - return { - atom: field.atomId, - interface: field.interfaceRevisionId, - member: field.memberId, - name: member.displayName, - operation: JSON.stringify([field.atomId, field.interfaceRevisionId, field.getter]), - }; - }), - admittedOperations, - }; - }), + queries: [ + ...compileInspectionTemplates(plan).queries, + ...plan.definition.queries.map(({ id, query, admittedOperations }) => { + const checked = query.checked; + return { + id, + ...(checked.declaration.fragment && !checked.declaration.fragment.admission + ? { + fragment: { + package: query.packageRevisionId, + id: checked.declaration.id, + digest: checked.definitionDigest, + }, + } + : {}), + placement: checked.declaration.placement?.kind ?? "remote", + source: + checked.declaration.placement?.kind === "local" + ? JSON.stringify([query.packageRevisionId, checked.declaration.placement.sourceQueryId]) + : null, + root: checked.declaration.root, + atoms: query.rootAtoms, + variables: portableValueSchema(checked.variables), + defaults: checked.variableDefaults, + selection: lowerTypes(checked.selection), + budgets: checked.declaration.budgets, + fields: query.fields.map((field) => { + const member = interfaces + .find((i) => i.revisionId === field.interfaceRevisionId)! + .members.find((m) => m.id === field.memberId)!; + return { + atom: field.atomId, + interface: field.interfaceRevisionId, + member: field.memberId, + name: member.displayName, + operation: JSON.stringify([field.atomId, field.interfaceRevisionId, field.getter]), + }; + }), + admittedOperations, + }; + }), + ], }; } diff --git a/test/inspection.test.ts b/test/inspection.test.ts new file mode 100644 index 0000000..4f416d7 --- /dev/null +++ b/test/inspection.test.ts @@ -0,0 +1,35 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { loadReaderWorkspace } from "./reader-fixture.js"; +import { compileExecutionPlan, compileQueryProgram } from "../src/execution-world/index.js"; +import { compileInspectionTemplates } from "../src/execution-world/inspection.js"; +test("public member inspection installs a finite set of typed lazy templates", async () => { + const plan = compileExecutionPlan(await loadReaderWorkspace()); + const result = compileInspectionTemplates(plan); + assert.ok(result.templates.length); + const document = result.templates.find( + (template) => + template.members.some((member) => member.name === "content") && + template.members.some((member) => member.name === "highlights"), + )!; + assert.ok(document.inputs && document.view && document.server); + assert.equal(document.view.sourceQuery, document.inputs.query); + assert.ok(document.members.find((member) => member.name === "highlights")?.many); + assert.ok(!document.members.some((member) => member.name === "revise")); + const compiled = compileQueryProgram(plan) as { + queries: { id: string; selection: { selection: { conditions: unknown[] }[] }[] }[]; + }; + for (const descriptor of result.contracts) { + const query = compiled.queries.find( + (query) => query.id === JSON.stringify([descriptor.package, descriptor.query]), + )!; + assert.ok(query); + assert.ok( + query.selection[0]!.selection.every((field) => field.conditions.length === 1), + "Each field admission is independently selected", + ); + } + assert.ok(!JSON.stringify(result.templates).includes("slot:")); + assert.equal(result.queries.length, result.contracts.length); + assert.ok(result.queries.length <= plan.definition.workspace.interfaceImports.length * 3); +}); From 1b296daf426d005d32976daef8a85dbe32c7008c Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Tue, 22 Sep 2026 18:11:54 -0700 Subject: [PATCH 63/91] Separate graph execution identity from installation provenance --- nix/check-execution.mjs | 3 + src/bindings/portable-client.ts | 12 +-- src/capability-model/generic-packages.ts | 3 +- src/capability-model/generics.ts | 4 +- src/execution-world/candidate.ts | 18 +++- src/execution-world/graph-execution.ts | 59 +++++++++++++ src/execution-world/index.ts | 2 + src/execution-world/installation.ts | 2 + src/execution-world/kernel.ts | 21 ++++- src/execution-world/queries.ts | 3 +- test/generic-packages.test.ts | 23 +++++ test/generics.test.ts | 6 +- test/graph-execution.test.ts | 107 +++++++++++++++++++++++ 13 files changed, 243 insertions(+), 20 deletions(-) create mode 100644 src/execution-world/graph-execution.ts create mode 100644 test/graph-execution.test.ts diff --git a/nix/check-execution.mjs b/nix/check-execution.mjs index c8ba1f0..698f3de 100644 --- a/nix/check-execution.mjs +++ b/nix/check-execution.mjs @@ -25,7 +25,9 @@ const checked = await compiler.loadCheckedArtifactWorld(plan, roots, generator); const installation = await compiler.loadExecutionInstallation(plan, roots); const kernel = compiler.compileKernelProgram(plan), queries = compiler.compileQueryProgram(plan); +const graph = compiler.graphExecutionRepresentation(plan, installation, kernel, queries); for (const [file, value] of [ + ["graph-execution.json", graph], ["execution-world.json", checked.world], ["installation.json", installation], ["kernel.json", kernel], @@ -37,6 +39,7 @@ for (const [file, value] of [ generator, roots, manifests: checked.manifests, + execution: compiler.hexDigest(graph), programs: { kernel: compiler.hexDigest(kernel), queries: compiler.hexDigest(queries) }, }, ], diff --git a/src/bindings/portable-client.ts b/src/bindings/portable-client.ts index 7ba014b..e2c8bc7 100644 --- a/src/bindings/portable-client.ts +++ b/src/bindings/portable-client.ts @@ -1,3 +1,4 @@ +import { compileKernelProgram } from "../execution-world/kernel.js"; import { hexDigest, type ExecutionPlan } from "../execution-world/plan.js"; import { resultInterfaces } from "../execution-world/projections.js"; import { portableValueSchema, tsType, PortableBindingError } from "./portable.js"; @@ -10,6 +11,7 @@ export function generatePortableClientBindings( options: { target: string; runtimeModule?: string }, ): string { if (hexDigest(plan.definition) !== plan.digest) throw new PortableBindingError("client", "Invalid plan digest"); + const executionPlan = (compileKernelProgram(plan) as { plan: string }).plan; const workspace = plan.definition.workspace, atoms = new Map(), unavailable: { key: string; reason: string }[] = []; @@ -39,7 +41,7 @@ export function generatePortableClientBindings( const roots = resultInterfaces(plan, operation.key); const descriptor = { key: operation.key, - plan: plan.digest, + plan: executionPlan, effect: operation.execution.kind, input: portableValueSchema(operation.input), output: portableValueSchema(operation.output), @@ -91,7 +93,7 @@ export function generatePortableClientBindings( JSON.stringify({ kind: "server-projection", id: query.id, - plan: plan.digest, + plan: executionPlan, root: declaration.root.interface, rootKind: declaration.root.kind, }) + @@ -108,7 +110,7 @@ export function generatePortableClientBindings( if (declaration.placement.kind === "local") { const list = views.get(pkg.displayName) ?? []; list.push( - `${JSON.stringify(declaration.displayName)}: ${JSON.stringify({ id: query.id, plan: plan.digest, source: JSON.stringify([query.query.packageRevisionId, declaration.placement.sourceQueryId]) })} as const satisfies LocalQueryDescriptor`, + `${JSON.stringify(declaration.displayName)}: ${JSON.stringify({ id: query.id, plan: executionPlan, source: JSON.stringify([query.query.packageRevisionId, declaration.placement.sourceQueryId]) })} as const satisfies LocalQueryDescriptor`, ); views.set(pkg.displayName, list); addResult(); @@ -116,11 +118,11 @@ export function generatePortableClientBindings( } const list = queries.get(pkg.displayName) ?? []; list.push( - `${JSON.stringify(declaration.displayName)}: { id: ${JSON.stringify(query.id)}, plan: ${JSON.stringify(plan.digest)}, root: ${JSON.stringify(declaration.root.interface)}, rootKind: ${JSON.stringify(declaration.root.kind)} } as const satisfies ReplicaProjection<${JSON.stringify(declaration.root.interface)}, ${JSON.stringify(declaration.root.kind)}>`, + `${JSON.stringify(declaration.displayName)}: { id: ${JSON.stringify(query.id)}, plan: ${JSON.stringify(executionPlan)}, root: ${JSON.stringify(declaration.root.interface)}, rootKind: ${JSON.stringify(declaration.root.kind)} } as const satisfies ReplicaProjection<${JSON.stringify(declaration.root.interface)}, ${JSON.stringify(declaration.root.kind)}>`, ); queries.set(pkg.displayName, list); } const groups = (entries: Map) => [...entries].map(([name, values]) => `${JSON.stringify(name)}: {${values.join(",\n")}}`).join(",\n"); - return `// Generated application descriptors. Regenerate; do not edit.\nimport { defineOperationDescriptor, decodeArgument, workspaceId, type Json, type PreparedChange, type ManagedReference, type ReplicaProjection, type ServerProjection, type LocalQueryDescriptor } from ${JSON.stringify(options.runtimeModule ?? "@quixos/camino-replica-core")};\nexport const planDigest = ${JSON.stringify(plan.digest)};\nexport const operations = {${groups(atoms)}} as const;\nexport const queries = {${groups(queries)}} as const;\nexport const views = {${groups(views)}} as const;\nexport const serverProjections = {${groups(serverProjections)}} as const;\nexport const results = {${groups(results)}} as const;\nexport const unavailable = ${JSON.stringify(unavailable)} as const;\n`; + return `// Generated application descriptors. Regenerate; do not edit.\nimport { defineOperationDescriptor, decodeArgument, workspaceId, type Json, type PreparedChange, type ManagedReference, type ReplicaProjection, type ServerProjection, type LocalQueryDescriptor } from ${JSON.stringify(options.runtimeModule ?? "@quixos/camino-replica-core")};\nexport const planDigest = ${JSON.stringify(executionPlan)};\nexport const operations = {${groups(atoms)}} as const;\nexport const queries = {${groups(queries)}} as const;\nexport const views = {${groups(views)}} as const;\nexport const serverProjections = {${groups(serverProjections)}} as const;\nexport const results = {${groups(results)}} as const;\nexport const unavailable = ${JSON.stringify(unavailable)} as const;\n`; } diff --git a/src/capability-model/generic-packages.ts b/src/capability-model/generic-packages.ts index a71f0e7..ac3e953 100644 --- a/src/capability-model/generic-packages.ts +++ b/src/capability-model/generic-packages.ts @@ -75,9 +75,8 @@ export const specializePackageExport = ( const digest = createHash("sha256") .update( JSON.stringify([ - "quixos-package-specialization-v1", + "quixos-package-specialization-v2", pkg.revisionId, - [pkg.source.repository, pkg.source.commit], definition.id, arguments_.map(canonicalTypeArgument), environment.self ?? null, diff --git a/src/capability-model/generics.ts b/src/capability-model/generics.ts index 8e4501d..9be1e74 100644 --- a/src/capability-model/generics.ts +++ b/src/capability-model/generics.ts @@ -258,10 +258,8 @@ export interface AppliedInterfaceIdentity { export const appliedInterfaceId = (application: AppliedInterfaceIdentity): InterfaceRevisionId => { const encoding = JSON.stringify([ - "quixos-applied-interface-v1", + "quixos-applied-interface-v2", application.definitionId, - application.source.repository, - application.source.commit.toLowerCase(), application.arguments.map(canonicalTypeArgument), application.self ?? null, ]); diff --git a/src/execution-world/candidate.ts b/src/execution-world/candidate.ts index 694ba48..1be6d37 100644 --- a/src/execution-world/candidate.ts +++ b/src/execution-world/candidate.ts @@ -1,3 +1,4 @@ +import { graphExecutionRepresentation } from "./graph-execution.js"; import { open, lstat } from "node:fs/promises"; import { constants } from "node:fs"; import { join } from "node:path"; @@ -24,7 +25,7 @@ export async function loadCheckedInstallationCandidate( ) { if (!rootPattern.test(root) || !(await lstat(root)).isDirectory()) throw Error("Candidate must be an immutable Nix output directory"); - const [candidate, plan, artifacts, source, entryRequest, kernel, queries] = await Promise.all([ + const [candidate, plan, artifacts, source, entryRequest, kernel, queries, graph] = await Promise.all([ readJson(root, "candidate.json"), readJson(root, "execution-plan.json"), readJson(root, "execution-artifacts.json"), @@ -32,6 +33,7 @@ export async function loadCheckedInstallationCandidate( readJson(root, "entry.json"), readJson(root, "kernel.json"), readJson(root, "queries.json"), + readJson(root, "graph-execution.json"), ]); const { executionContracts: _legacyContracts, ...workspace } = candidate; if ( @@ -81,12 +83,19 @@ export async function loadCheckedInstallationCandidate( ["kernel", kernel, "camino-kernel-program-v1"], ["queries", queries, "camino-query-program-v1"], ] as const) - if (program?.codec !== codec || program.plan !== plan.digest || hexDigest(program) !== artifacts.programs?.[name]) + if (program?.codec !== codec || program.plan !== kernel.plan || hexDigest(program) !== artifacts.programs?.[name]) throw new ExecutionPlanError( "CANDIDATE_PROGRAM_MISMATCH", name, "Stored interpreter input must match the checked build and plan", ); + const expectedGraph = graphExecutionRepresentation(plan, installation, kernel, queries); + if (hexDigest(graph) !== hexDigest(expectedGraph) || artifacts.execution !== hexDigest(graph)) + throw new ExecutionPlanError( + "CANDIDATE_EXECUTION_MISMATCH", + root, + "Stored graph execution differs from checked inputs", + ); const provenance = { workspaceRevision: workspace.id as string, source: { repository: source.repository as string, commit: source.commit as string }, @@ -110,8 +119,9 @@ export async function loadCheckedInstallationCandidate( return { reference, workspace: plan.definition.workspace.workspaceId, - world: installation.world, - plan: plan.digest, + world: hexDigest(graph), + plan: kernel.plan as string, + graphExecution: graph, provenance, entry, kernel, diff --git a/src/execution-world/graph-execution.ts b/src/execution-world/graph-execution.ts new file mode 100644 index 0000000..93fb031 --- /dev/null +++ b/src/execution-world/graph-execution.ts @@ -0,0 +1,59 @@ +import { ExecutionPlanError, hexDigest, type ExecutionPlan } from "./plan.js"; +import type { ExecutionInstallation } from "./installation.js"; + +/** Execution inputs, not build evidence. Nominal revision IDs remain dispatch + * keys: replacing a contract with a structurally similar one is not continuity. + * Host placement/policy/credentials are compared separately by execution groups. */ +export function graphExecutionRepresentation( + plan: ExecutionPlan, + installation: ExecutionInstallation, + kernel: unknown, + queries: unknown, +) { + if (installation.plan !== plan.digest || hexDigest(plan.definition) !== plan.digest) + throw new ExecutionPlanError("GRAPH_PLAN_MISMATCH", "graph", "Expected one checked installation"); + if ( + !kernel || + typeof kernel !== "object" || + Array.isArray(kernel) || + !queries || + typeof queries !== "object" || + Array.isArray(queries) + ) + throw new ExecutionPlanError("GRAPH_PROGRAM_MISMATCH", "graph", "Expected interpreter program records"); + const input = kernel as Record, + queryInput = queries as Record; + const { plan: key, ...program } = input; + if ( + input.codec !== "camino-kernel-program-v1" || + queryInput.codec !== "camino-query-program-v1" || + queryInput.plan !== key || + key !== hexDigest({ versions: plan.definition.versions, program }) + ) + throw new ExecutionPlanError("GRAPH_PROGRAM_MISMATCH", "graph", "Interpreter inputs do not match execution key"); + return { + codec: "camino-graph-execution-v1", + versions: plan.definition.versions, + kernel, + queries, + // Include every selected implementation, including acceptance/remote code + // and the browser dependency closure, not merely the public export names. + packages: installation.packages.map((pkg) => ({ + revision: pkg.revision, + service: pkg.service ?? null, + module: pkg.module ?? null, + browser: pkg.browserImplementation ?? null, + })), + controllers: plan.definition.packages.map((pkg) => ({ + revision: pkg.revision, + controllers: pkg.controllers ?? [], + })), + shared: { + core: installation.coreURL ?? null, + engine: installation.engineURL ?? null, + components: [ + ...new Map(installation.components.flatMap((component) => Object.entries(component.sharedModules))).entries(), + ].sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)), + }, + }; +} diff --git a/src/execution-world/index.ts b/src/execution-world/index.ts index b60b9f4..dd25a52 100644 --- a/src/execution-world/index.ts +++ b/src/execution-world/index.ts @@ -19,3 +19,5 @@ export * from "./candidate.js"; export { reviewSemanticMajors } from "../capability-model/evolution.js"; export * from "./public-reflection.js"; + +export * from "./graph-execution.js"; diff --git a/src/execution-world/installation.ts b/src/execution-world/installation.ts index fce93a4..5d41ec4 100644 --- a/src/execution-world/installation.ts +++ b/src/execution-world/installation.ts @@ -112,6 +112,7 @@ export interface ExecutionInstallation { readonly root: string; readonly service?: ArtifactImplementation; readonly module?: ArtifactImplementation; + readonly browserImplementation?: ArtifactImplementation; readonly browserURL?: string; readonly browserRegistry?: string; }[]; @@ -270,6 +271,7 @@ function assembleExecutionInstallation( root, ...(service ? { service } : {}), ...(module ? { module } : {}), + browserImplementation: browser, browserURL: contentArtifactUrl(entry), browserRegistry: browser.registryExport, }); diff --git a/src/execution-world/kernel.ts b/src/execution-world/kernel.ts index fd338b7..df82847 100644 --- a/src/execution-world/kernel.ts +++ b/src/execution-world/kernel.ts @@ -36,7 +36,7 @@ export function compileKernelProgram(plan: ExecutionPlan): unknown { } }; const ownerBySlot = new Map(); - const edges: unknown[] = []; + const edges: { id: string; owner: string; a: unknown; b: unknown }[] = []; const owners = plan.definition.owners.map((owner) => { const slots: unknown[] = []; for (const storage of owner.storage as PersistentAttachment[]) { @@ -166,7 +166,19 @@ export function compileKernelProgram(plan: ExecutionPlan): unknown { kind: "creation", atom: bound.atomId, schema: portableValueSchema(requirement.inputType), - recipe: hexDigest({ plan: plan.digest, operation: operation.key, port: dependency.portId }), + recipe: hexDigest({ + codec: "camino-creation-recipe-v1", + versions: plan.definition.versions, + operation: operation.key, + export: entry.id, + port: dependency.portId, + requirement, + binding: bound, + owners: owners.filter((owner) => owner.atom === bound.atomId), + edges: edges.filter((edge) => + owners.some((owner) => owner.atom === bound.atomId && owner.id === edge.owner), + ), + }), owners: bound.owners.map((seed) => { const owner = owners.find((o) => o.atom === bound.atomId && o.interface === seed.interfaceRevisionId); if (!owner) @@ -230,11 +242,12 @@ export function compileKernelProgram(plan: ExecutionPlan): unknown { output: schema(entry.outputType), })), })); - return { + const body = { codec: "camino-kernel-program-v1", - plan: plan.digest, model: { workspace: workspace.workspaceId, atoms: workspace.atoms.map((atom) => atom.id), owners, edges }, operations, packages, }; + // The interpreter's plan key covers its real input, not source/build evidence. + return { ...body, plan: hexDigest({ versions: plan.definition.versions, program: body }) }; } diff --git a/src/execution-world/queries.ts b/src/execution-world/queries.ts index aff4ac9..fdf62d0 100644 --- a/src/execution-world/queries.ts +++ b/src/execution-world/queries.ts @@ -1,3 +1,4 @@ +import { compileKernelProgram } from "./kernel.js"; import { compileInspectionTemplates } from "./inspection.js"; import { portableValueSchema } from "../bindings/portable.js"; import { ExecutionPlanError, hexDigest, type ExecutionPlan } from "./plan.js"; @@ -26,7 +27,7 @@ export function compileQueryProgram(plan: ExecutionPlan): unknown { const interfaces = plan.definition.workspace.interfaceImports; return { codec: "camino-query-program-v1", - plan: plan.digest, + plan: (compileKernelProgram(plan) as { plan: string }).plan, queries: [ ...compileInspectionTemplates(plan).queries, ...plan.definition.queries.map(({ id, query, admittedOperations }) => { diff --git a/test/generic-packages.test.ts b/test/generic-packages.test.ts index 650d50c..994b622 100644 --- a/test/generic-packages.test.ts +++ b/test/generic-packages.test.ts @@ -1,3 +1,4 @@ +import { specializePackageExport } from "../src/capability-model/generic-packages.js"; import assert from "node:assert/strict"; import test from "node:test"; import fs from "node:fs/promises"; @@ -297,3 +298,25 @@ test("typed presentation and factory consumers preserve distinct closed applicat await fs.rm(directory, { recursive: true, force: true }); } }); + +test("specialized dispatch keys retain nominal arguments, not build provenance", () => { + const pkg = definition(); + const generic = pkg.genericExports![0]!; + const environment = { + arguments: new Map(), + applyInterface: () => { + throw Error("unused"); + }, + implementsInterface: () => false, + }; + const arguments_ = [{ kind: "value" as const, type: { kind: "scalar" as const, name: "string" as const } }]; + const original = specializePackageExport(pkg, generic, arguments_, environment); + const rebuilt = structuredClone(pkg); + rebuilt.source.commit = "f".repeat(40); + assert.deepEqual(specializePackageExport(rebuilt, generic, arguments_, environment), original); + assert.notEqual( + specializePackageExport(rebuilt, generic, [{ kind: "value", type: { kind: "scalar", name: "bool" } }], environment) + .id, + original.id, + ); +}); diff --git a/test/generics.test.ts b/test/generics.test.ts index 8cef6b4..6eadb45 100644 --- a/test/generics.test.ts +++ b/test/generics.test.ts @@ -165,7 +165,7 @@ test("bounds require evidence and storable constraints inspect nested values", ( ); }); -test("closed applications canonicalize records without erasing nominal identity or provenance", () => { +test("closed applications preserve nominal identity while separating source provenance", () => { const a: ClosedTypeArgument = { kind: "value", type: { kind: "record", fields: { b: valueType.int64, a: valueType.string } }, @@ -183,6 +183,10 @@ test("closed applications canonicalize records without erasing nominal identity assert.equal(appliedInterfaceId(application), appliedInterfaceId({ ...application, arguments: [b] })); assert.notEqual(appliedInterfaceId(application), appliedInterfaceId({ ...application, self: note })); assert.notEqual( + appliedInterfaceId(application), + appliedInterfaceId({ ...application, definitionId: capabilityId.interfaceRevision("other@1") }), + ); + assert.equal( appliedInterfaceId(application), appliedInterfaceId({ ...application, source: { ...application.source, commit: "b".repeat(40) } }), ); diff --git a/test/graph-execution.test.ts b/test/graph-execution.test.ts new file mode 100644 index 0000000..ba6f8ac --- /dev/null +++ b/test/graph-execution.test.ts @@ -0,0 +1,107 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { loadReaderWorkspace } from "./reader-fixture.js"; +import { buildArtifactFixture } from "./artifact-fixture.js"; +import { + generatePortableClientBindings, + compileExecutionPlan, + compileKernelProgram, + compileQueryProgram, + graphExecutionRepresentation, + hexDigest, + type ExecutionPlan, + type ExecutionInstallation, +} from "../src/execution-world/index.js"; + +function prepare(plan: ExecutionPlan) { + const installation: ExecutionInstallation = { + codec: "camino-execution-installation-v1", + plan: plan.digest, + world: "0".repeat(64), + routes: {}, + components: [], + packages: plan.definition.packages.map((pkg) => { + const { manifest } = buildArtifactFixture(plan, pkg.revision); + return { + revision: pkg.revision, + root: "/build/provenance", + service: manifest.implementations[0]!, + browserImplementation: manifest.implementations[2]!, + }; + }), + }; + const kernel = compileKernelProgram(plan) as any, + queries = compileQueryProgram(plan) as any; + return { + installation, + kernel, + queries, + graph: () => graphExecutionRepresentation(plan, installation, kernel, queries), + }; +} + +test("actual interpreter inputs and creation recipes exclude source provenance", async () => { + const workspace = await loadReaderWorkspace(); + const originalPlan = compileExecutionPlan(workspace); + const before = prepare(originalPlan); + workspace.sourceRootCommit = "f".repeat(40); + for (const pkg of workspace.packageImports) pkg.source.commit = "e".repeat(40); + const nextPlan = compileExecutionPlan(workspace); + const after = prepare(nextPlan); + assert.equal( + generatePortableClientBindings(originalPlan, { target: "browser" }), + generatePortableClientBindings(nextPlan, { target: "browser" }), + ); + assert.notEqual(before.installation.plan, after.installation.plan); + assert.deepEqual(before.kernel, after.kernel); + assert.deepEqual(before.queries, after.queries); + assert.deepEqual(before.graph(), after.graph()); + assert.ok(JSON.stringify(before.kernel).includes('"recipe"')); +}); + +test("graph identity covers executable closures, query semantics and real interpreter input", async () => { + const plan = compileExecutionPlan(await loadReaderWorkspace()); + const fixture = prepare(plan), + baseline = hexDigest(fixture.graph()); + fixture.installation.packages[0]!.service!.files[0]!.digest = "c".repeat(64); + assert.notEqual(hexDigest(fixture.graph()), baseline); + const query = prepare(plan); + query.queries.queries[0].budgets.rows++; + assert.notEqual(hexDigest(query.graph()), baseline); + query.kernel.operations[0].output = { kind: "scalar", name: "string" }; + assert.throws(() => query.graph(), /GRAPH_PROGRAM_MISMATCH/); + const shared = prepare(plan); + (shared.installation as any).engineURL = "/changed-engine.mjs"; + assert.notEqual(hexDigest(shared.graph()), baseline); + const future = prepare(plan); + future.kernel.codec = "future-kernel"; + assert.throws(() => future.graph(), /GRAPH_PROGRAM_MISMATCH/); +}); + +test("initialization, storage, nominal contracts and bound ports affect executed kernel identity", async () => { + const workspace = await loadReaderWorkspace(), + plan = compileExecutionPlan(workspace); + const original = prepare(plan); + for (const change of [ + (p: ExecutionPlan) => { + (p.definition.owners[0]!.initialization as any[]).push({ + input: "extra", + binding: { kind: "state", slotId: "extra" }, + }); + }, + (p: ExecutionPlan) => { + p.definition.owners[0]!.id += ":different"; + }, + (p: ExecutionPlan) => { + p.definition.operations[0]!.operationId += ":different"; + }, + (p: ExecutionPlan) => { + p.definition.versions.crdt = "future-genesis" as any; + }, + ]) { + const changed = structuredClone(plan); + change(changed); + changed.digest = hexDigest(changed.definition); + assert.notEqual((compileKernelProgram(changed) as any).plan, original.kernel.plan); + } +}); From 595eda834f70f463a3d806078811dd3378e57073 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Tue, 22 Sep 2026 18:27:59 -0700 Subject: [PATCH 64/91] Restore generic Studio object navigation and discovery --- src/execution-world/plan.ts | 21 +++++++++++++++++++++ src/query/root.ts | 5 ++++- test/execution-contracts.test.ts | 8 +++----- test/query-cursor-validation.test.ts | 14 ++++++++++++++ 4 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/execution-world/plan.ts b/src/execution-world/plan.ts index 22a0ef1..e72aa42 100644 --- a/src/execution-world/plan.ts +++ b/src/execution-world/plan.ts @@ -381,6 +381,27 @@ export function compileExecutionPlan(input: WorkspaceRevision): ExecutionPlan { query.id, "Local and replica queries must use the same root contract", ); + if (localRoot.kind === "workspace-interface") { + const sourceWindows = source.query.checked.selection + .flatMap((root) => root.selection) + .filter((s) => s.name === "objects"); + for (const selection of query.query.checked.selection + .flatMap((root) => root.selection) + .filter((s) => s.name === "objects")) { + if ( + !sourceWindows.some( + (window) => + canonicalJson({ arguments: window.arguments, conditions: window.conditions }) === + canonicalJson({ arguments: selection.arguments, conditions: selection.conditions }), + ) + ) + throw new ExecutionPlanError( + "REPLICA_WINDOW_MISMATCH", + query.id, + "Local objects must observe the identical confirmed source window; use availableObjects for a local candidate view", + ); + } + } const traversals = (linked: LinkedQuery) => { const paths = new Map }>(); const entry = (key: string) => { diff --git a/src/query/root.ts b/src/query/root.ts index 7d3c244..5a1b604 100644 --- a/src/query/root.ts +++ b/src/query/root.ts @@ -27,7 +27,7 @@ export function queryRootSchema(root: QueryRoot, interfaces: readonly InterfaceR { kind: "relationship", id: workspaceObjectsMemberId, - displayName: local ? "availableObjects" : "objects", + displayName: "objects", target: { kind: "interface", interfaceRevisionId: root.interface }, cardinality: "many-unique", ordered: false, @@ -36,5 +36,8 @@ export function queryRootSchema(root: QueryRoot, interfaces: readonly InterfaceR }, ], }; + // Local objects observes the confirmed server window. availableObjects is the + // separate opt-in view that also includes pending local candidates. + if (local) synthetic.members.push({ ...synthetic.members[0]!, displayName: "availableObjects" }); return { interface: synthetic.revisionId, interfaces: [...interfaces, synthetic] }; } diff --git a/test/execution-contracts.test.ts b/test/execution-contracts.test.ts index 35b3f06..a80e263 100644 --- a/test/execution-contracts.test.ts +++ b/test/execution-contracts.test.ts @@ -89,7 +89,7 @@ package Reader id "package:reader" revision "package:reader@1" { assert.ok(transaction.ok, JSON.stringify(transaction.diagnostics)); }); -test("query placement round-trips and local extents never claim complete membership", async () => { +test("query placement distinguishes confirmed windows from local candidate extents", async () => { const { compileQuery } = await import("../src/query/compile.js"); const { linkQueries } = await import("../src/query/link.js"); const { toBinary, fromBinary, fromJson } = await import("@bufbuild/protobuf"); @@ -125,10 +125,8 @@ package Reader id "package:reader" revision "package:reader@1" { await compileQuery(admission, [iface], async () => document("Visible", "objects")), await compileQuery(local, [iface], async () => document("Presentation", "availableObjects")), ]; - await assert.rejects( - compileQuery(local, [iface], async () => document("Presentation", "objects")), - /Cannot query field "objects"/, - ); + const confirmed = await compileQuery(local, [iface], async () => document("Presentation", "objects")); + assert.equal(confirmed.selection[0]!.selection[0]!.name, "objects"); const remote = structuredClone(iface); delete remote.members[0]!.operations[0]!.execution; await assert.rejects( diff --git a/test/query-cursor-validation.test.ts b/test/query-cursor-validation.test.ts index 0fc6df2..2e23986 100644 --- a/test/query-cursor-validation.test.ts +++ b/test/query-cursor-validation.test.ts @@ -18,3 +18,17 @@ test("local relationship pages may reuse exactly the confirmed source window", a }); assert.doesNotThrow(() => compileExecutionPlan(workspace)); }); + +test("local workspace objects reads the exact server window without adding local candidates", async () => { + const load = (first: number) => + loadReaderWorkspace((name, text) => { + if (name === "ReaderRuntime.qx") return text.replace(/^.*query HighlightList id.*$/m, ""); + if (name === "queries/highlight-list.graphql") + return text.replace("availableObjects(all: 200", `objects(first: ${first}`); + return text; + }); + const workspace = await load(2); + assert.doesNotThrow(() => compileExecutionPlan(workspace)); + const wrong = await load(3); + assert.throws(() => compileExecutionPlan(wrong), /REPLICA_WINDOW_MISMATCH/); +}); From 20e9f4b056b68f1461beb2e5286e0d9fc50f92b7 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Tue, 22 Sep 2026 21:57:35 -0700 Subject: [PATCH 65/91] Restore the workspace canvas and atomic Studio creation workflow --- src/bindings/portable.ts | 47 ++++++++++++++++++------------ src/capability-model/validation.ts | 31 ++++++++++++++++++-- src/execution-world/kernel.ts | 7 +++++ test/portable-bindings.test.ts | 17 +++++++++++ 4 files changed, 81 insertions(+), 21 deletions(-) diff --git a/src/bindings/portable.ts b/src/bindings/portable.ts index 53f2ecb..4ca3634 100644 --- a/src/bindings/portable.ts +++ b/src/bindings/portable.ts @@ -103,6 +103,7 @@ interface Method { input: ValueType; output: ValueType; keyed: boolean; + explicitInput?: boolean; } function methods( schema: BindingSchema, @@ -185,7 +186,7 @@ function methods( if ( (execution.kind === "remote" ? !remote : !execution.targets.includes(target)) || op.mode !== "call" || - op.scope === "class" + (op.scope === "class" && (remote || req.receiver === "input")) ) throw new PortableBindingError( `${path}.${member.displayName}.${op.displayName}`, @@ -194,24 +195,27 @@ function methods( if (execution.kind === "transaction" && !remote) writable(); if (req.receiver === "input" && remote) throw new PortableBindingError(path, "Reference-selected dependencies require portable execution"); - return method( - `${member.displayName}.${op.displayName}`, - { kind: "interface", operationId: op.id }, - req.receiver === "input" - ? { - kind: "record", - fields: { - receiver: { - kind: "object-ref", - expectation: { kind: "interface", interfaceRevisionId: req.interfaceRevisionId }, + return { + ...method( + `${member.displayName}.${op.displayName}`, + { kind: "interface", operationId: op.id }, + req.receiver === "input" + ? { + kind: "record", + fields: { + receiver: { + kind: "object-ref", + expectation: { kind: "interface", interfaceRevisionId: req.interfaceRevisionId }, + }, + input: op.inputType, }, - input: op.inputType, - }, - } - : op.inputType, - op.outputType, - execution.kind === "transaction", - ); + } + : op.inputType, + op.outputType, + execution.kind === "transaction", + ), + ...(op.scope === "class" ? { explicitInput: true } : {}), + }; }); } default: @@ -276,7 +280,7 @@ function generateBindings( throw new PortableBindingError(port.id, "Duplicate method name"); all.push(...selected); facets.push( - `readonly ${q(port.displayName)}: { ${selected.map((m) => `readonly ${q(m.name)}: (${[...(isUnit(m.input) ? [] : [`input: ${tsType(m.input)}`]), ...(m.keyed ? [remote ? "options: ServerMutationOptions" : "options: MutationKey"] : [])].join(", ")}) => Promise<${tsType(m.output)}>`).join("; ")} }`, + `readonly ${q(port.displayName)}: { ${selected.map((m) => `readonly ${q(m.name)}: (${[...(isUnit(m.input) && !m.explicitInput ? [] : [`input: ${tsType(m.input)}`]), ...(m.keyed ? [remote ? "options: ServerMutationOptions" : "options: MutationKey"] : [])].join(", ")}) => Promise<${tsType(m.output)}>`).join("; ")} }`, ); } const receiver = @@ -312,6 +316,10 @@ function generateBindings( }); } const groups = new Map(); + for (const template of pkg.genericExports ?? []) { + if (template.execution?.kind !== "remote" && template.execution?.targets.includes(options.target)) + groups.set(template.displayName, []); + } for (const entry of entries) { if (!entry.application) continue; const template = pkg.genericExports?.find((item) => item.id === entry.application!.exportId); @@ -319,6 +327,7 @@ function generateBindings( groups.set(template.displayName, [...(groups.get(template.displayName) ?? []), entry]); } const generic = [...groups].map(([name, applications]) => { + if (!applications.length) return `${q(name)}: (_handler: unknown) => ({})`; contexts.push( `readonly ${q(name)}: ${applications.map((entry) => `Contexts[${q(entry.displayName)}]`).join(" | ")}`, ); diff --git a/src/capability-model/validation.ts b/src/capability-model/validation.ts index bbf3b46..46008e6 100644 --- a/src/capability-model/validation.ts +++ b/src/capability-model/validation.ts @@ -1458,6 +1458,21 @@ const validateBoundDependencies = ( ); break; } + const selected = requirement.operations?.map( + (id) => params.indexes.interfaces.get(requirement.interfaceRevisionId)?.operations.get(id)?.operation, + ); + if ( + selected?.some((op) => op?.scope === "class") && + (interfaceBinding.via || interfaceBinding.receiver || selected.some((op) => op?.scope !== "class")) + ) { + issue( + issues, + "invalid-dependency-binding", + path, + "Static interface dependencies require a receiverless selection of class operations on the bound atom", + ); + break; + } // The reference supplies its own checked witness at invocation time. // This is not a requirement that the current receiver implements the interface. if (interfaceBinding.receiver === "input") break; @@ -1921,8 +1936,20 @@ const validateConformances = ( }); if ( operation.scope === "class" && - (binding.dependencies.some((entry) => !["constructor", "creation"].includes(entry.binding.kind)) || - packageExport.dependencyPorts.some((entry) => !["constructor", "creation"].includes(entry.requirement.kind))) + packageExport.dependencyPorts.some(({ requirement }) => { + if (["constructor", "creation", "reflection"].includes(requirement.kind)) return false; + if (requirement.kind !== "interface") return true; + if (requirement.receiver === "input") return false; + const contract = indexes.interfaces.get(requirement.interfaceRevisionId); + return ( + !requirement.operations?.length || + !requirement.operations.every((id) => + contract?.revision.members + .flatMap((m) => m.operations) + .some((op) => op.id === id && op.scope === "class"), + ) + ); + }) ) { issue( issues, diff --git a/src/execution-world/kernel.ts b/src/execution-world/kernel.ts index df82847..ca9db0e 100644 --- a/src/execution-world/kernel.ts +++ b/src/execution-world/kernel.ts @@ -156,6 +156,13 @@ export function compileKernelProgram(plan: ExecutionPlan): unknown { ...common, kind: "interface", interface: bound.interfaceRevisionId, + ...(!bound.receiver && + !bound.via && + (requirement.operations ?? iface.members.flatMap(m=>m.operations.map(o=>o.id))).every( + (id) => iface.members.flatMap((m) => m.operations).find((o) => o.id === id)?.scope === "class", + ) + ? { staticAtom: operation.atomId } + : {}), ...(bound.receiver ? { receiver: bound.receiver } : {}), operations: requirement.operations ?? iface.members.flatMap((m) => m.operations.map((o) => o.id)), }; diff --git a/test/portable-bindings.test.ts b/test/portable-bindings.test.ts index 9e11724..e7b7ed8 100644 --- a/test/portable-bindings.test.ts +++ b/test/portable-bindings.test.ts @@ -114,3 +114,20 @@ test("server projection descriptors are distinct from canonical inputs and have /@live is retired/, ); }); + +test("static interface ports keep unit arguments explicit for generic factory composition", async () => { + const schema = compileExecutionPlan(await loadReaderWorkspace()).definition.bindingSchema; + const entry = schema.packages.flatMap((p) => p.exports).find((e) => e.displayName === "addHighlight")!; + const port = entry.dependencyPorts.find((p) => p.requirement.kind === "interface")!; + if (port.requirement.kind !== "interface") throw Error("interface required"); + const requirement = port.requirement; + const iface = schema.interfaces.find((i) => i.revisionId === requirement.interfaceRevisionId)!; + const op = iface.members.flatMap((m) => m.operations).find((o) => o.id === requirement.operations![0])!; + op.scope = "class"; + op.inputType = { kind: "builtin", name: "unit" }; + port.requirement.operations = [op.id]; + delete port.requirement.receiver; + const generated = generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", { target: "browser" }); + assert.match(generated, /"explicitInput": true/); + assert.match(generated, /input: null/); +}); From 8455599c3c8b19b7d702b2355b36906d5f6b225f Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Wed, 23 Sep 2026 00:01:03 -0700 Subject: [PATCH 66/91] Implement reusable interface conformance rules --- grammar/QuixosCapability.g4 | 6 +- .../generated/QuixosCapability.interp | 3 +- .../generated/QuixosCapabilityParser.ts | 3315 +++++++++-------- .../generated/QuixosCapabilityVisitor.ts | 7 + src/capability-language/generic-types.ts | 3 +- src/capability-language/parser.ts | 225 +- src/capability-language/source-loader.ts | 18 + src/capability-language/tool-cli.ts | 7 +- src/capability-model/conformance-rules.ts | 208 ++ src/capability-model/types.ts | 2 + src/capability-model/validation.ts | 9 +- test/conformance-rules.test.ts | 197 + test/crdt-edit-contracts.test.ts | 6 +- test/qx-source.test.ts | 19 + 14 files changed, 2387 insertions(+), 1638 deletions(-) create mode 100644 src/capability-model/conformance-rules.ts create mode 100644 test/conformance-rules.test.ts diff --git a/grammar/QuixosCapability.g4 b/grammar/QuixosCapability.g4 index 78f9d5b..b27330e 100644 --- a/grammar/QuixosCapability.g4 +++ b/grammar/QuixosCapability.g4 @@ -296,10 +296,14 @@ edgeEndpoint ; conformanceDecl - : CONFORM identifier AS identifier typeArguments? (ID stringLiteral)? (SEMANTIC_MAJOR INTEGER)? + : CONFORM typeParameters? identifier conformanceSourceArguments? AS identifier typeArguments? (ID stringLiteral)? (SEMANTIC_MAJOR INTEGER)? LBRACE conformanceItem* RBRACE ; +conformanceSourceArguments + : typeArguments + ; + conformanceItem : PRIVATE attachmentDecl | operationBindingDecl diff --git a/src/capability-language/generated/QuixosCapability.interp b/src/capability-language/generated/QuixosCapability.interp index 21873eb..a7cdacc 100644 --- a/src/capability-language/generated/QuixosCapability.interp +++ b/src/capability-language/generated/QuixosCapability.interp @@ -366,6 +366,7 @@ storagePolicy edgeDecl edgeEndpoint conformanceDecl +conformanceSourceArguments conformanceItem moduleBindingDecl initializationDecl @@ -396,4 +397,4 @@ stringLiteral atn: -[4, 1, 153, 1393, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 177, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 182, 8, 1, 10, 1, 12, 1, 185, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 203, 8, 3, 10, 3, 12, 3, 206, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 218, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 230, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 250, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 258, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 263, 8, 10, 10, 10, 12, 10, 266, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 271, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 281, 8, 10, 10, 10, 12, 10, 284, 9, 10, 3, 10, 286, 8, 10, 1, 10, 1, 10, 5, 10, 290, 8, 10, 10, 10, 12, 10, 293, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 301, 8, 11, 10, 11, 12, 11, 304, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 312, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 320, 8, 12, 10, 12, 12, 12, 323, 9, 12, 3, 12, 325, 8, 12, 3, 12, 327, 8, 12, 1, 13, 1, 13, 3, 13, 331, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 337, 8, 14, 10, 14, 12, 14, 340, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 351, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 356, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 366, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 376, 8, 18, 1, 18, 1, 18, 1, 19, 3, 19, 381, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 396, 8, 19, 1, 19, 1, 19, 1, 19, 1, 20, 3, 20, 402, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 412, 8, 20, 10, 20, 12, 20, 415, 9, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 423, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 431, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 439, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 452, 8, 21, 1, 22, 3, 22, 455, 8, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 465, 8, 22, 1, 22, 1, 22, 3, 22, 469, 8, 22, 1, 22, 1, 22, 5, 22, 473, 8, 22, 10, 22, 12, 22, 476, 9, 22, 1, 22, 1, 22, 1, 23, 1, 23, 3, 23, 482, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 488, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 496, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 504, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 517, 8, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 524, 8, 25, 1, 25, 1, 25, 3, 25, 528, 8, 25, 1, 26, 5, 26, 531, 8, 26, 10, 26, 12, 26, 534, 9, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 544, 8, 26, 1, 26, 1, 26, 5, 26, 548, 8, 26, 10, 26, 12, 26, 551, 9, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 561, 8, 27, 1, 28, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 3, 30, 587, 8, 30, 1, 30, 1, 30, 3, 30, 591, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 597, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 5, 30, 606, 8, 30, 10, 30, 12, 30, 609, 9, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 617, 8, 30, 1, 30, 1, 30, 5, 30, 621, 8, 30, 10, 30, 12, 30, 624, 9, 30, 1, 30, 1, 30, 3, 30, 628, 8, 30, 3, 30, 630, 8, 30, 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, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 659, 8, 32, 10, 32, 12, 32, 662, 9, 32, 1, 32, 3, 32, 665, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 671, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 698, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 3, 34, 708, 8, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 719, 8, 34, 1, 34, 3, 34, 722, 8, 34, 1, 34, 1, 34, 1, 34, 3, 34, 727, 8, 34, 1, 34, 3, 34, 730, 8, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 3, 35, 737, 8, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 746, 8, 35, 1, 35, 3, 35, 749, 8, 35, 1, 35, 3, 35, 752, 8, 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, 37, 1, 37, 1, 37, 3, 37, 769, 8, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 776, 8, 38, 10, 38, 12, 38, 779, 9, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 792, 8, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 811, 8, 42, 10, 42, 12, 42, 814, 9, 42, 3, 42, 816, 8, 42, 1, 42, 3, 42, 819, 8, 42, 1, 43, 1, 43, 1, 43, 5, 43, 824, 8, 43, 10, 43, 12, 43, 827, 9, 43, 1, 44, 1, 44, 1, 44, 5, 44, 832, 8, 44, 10, 44, 12, 44, 835, 9, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 874, 8, 45, 1, 45, 3, 45, 877, 8, 45, 1, 45, 1, 45, 3, 45, 881, 8, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 903, 8, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 917, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 5, 46, 923, 8, 46, 10, 46, 12, 46, 926, 9, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 3, 49, 937, 8, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 951, 8, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 961, 8, 51, 1, 52, 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, 53, 1, 53, 3, 53, 979, 8, 53, 1, 53, 1, 53, 3, 53, 983, 8, 53, 1, 53, 3, 53, 986, 8, 53, 1, 53, 1, 53, 3, 53, 990, 8, 53, 1, 53, 3, 53, 993, 8, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 1002, 8, 54, 1, 54, 1, 54, 3, 54, 1006, 8, 54, 1, 54, 1, 54, 3, 54, 1010, 8, 54, 1, 54, 1, 54, 5, 54, 1014, 8, 54, 10, 54, 12, 54, 1017, 9, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 3, 55, 1028, 8, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 5, 57, 1041, 8, 57, 10, 57, 12, 57, 1044, 9, 57, 1, 57, 1, 57, 1, 57, 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, 1063, 8, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 5, 59, 1070, 8, 59, 10, 59, 12, 59, 1073, 9, 59, 1, 59, 1, 59, 1, 60, 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, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 3, 62, 1104, 8, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1124, 8, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1144, 8, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1154, 8, 65, 1, 65, 3, 65, 1157, 8, 65, 1, 65, 3, 65, 1160, 8, 65, 3, 65, 1162, 8, 65, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 5, 69, 1174, 8, 69, 10, 69, 12, 69, 1177, 9, 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, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 3, 70, 1200, 8, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 3, 70, 1216, 8, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 3, 70, 1225, 8, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 3, 70, 1235, 8, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 5, 70, 1246, 8, 70, 10, 70, 12, 70, 1249, 9, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 3, 70, 1263, 8, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 3, 70, 1275, 8, 70, 1, 70, 1, 70, 3, 70, 1279, 8, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1288, 8, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1306, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 5, 72, 1328, 8, 72, 10, 72, 12, 72, 1331, 9, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1336, 8, 72, 3, 72, 1338, 8, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 3, 76, 1357, 8, 76, 1, 77, 1, 77, 1, 77, 1, 77, 5, 77, 1363, 8, 77, 10, 77, 12, 77, 1366, 9, 77, 3, 77, 1368, 8, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 5, 79, 1380, 8, 79, 10, 79, 12, 79, 1383, 9, 79, 3, 79, 1385, 8, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 0, 0, 82, 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, 0, 9, 2, 0, 15, 15, 33, 33, 1, 0, 11, 12, 1, 0, 101, 105, 3, 0, 1, 1, 96, 100, 102, 103, 3, 0, 1, 1, 96, 97, 102, 103, 2, 0, 98, 100, 102, 103, 1, 0, 121, 128, 1, 0, 108, 111, 9, 0, 1, 1, 4, 8, 10, 33, 40, 40, 45, 45, 74, 74, 94, 95, 106, 106, 149, 149, 1508, 0, 176, 1, 0, 0, 0, 2, 178, 1, 0, 0, 0, 4, 188, 1, 0, 0, 0, 6, 192, 1, 0, 0, 0, 8, 217, 1, 0, 0, 0, 10, 229, 1, 0, 0, 0, 12, 231, 1, 0, 0, 0, 14, 238, 1, 0, 0, 0, 16, 249, 1, 0, 0, 0, 18, 251, 1, 0, 0, 0, 20, 264, 1, 0, 0, 0, 22, 296, 1, 0, 0, 0, 24, 326, 1, 0, 0, 0, 26, 328, 1, 0, 0, 0, 28, 332, 1, 0, 0, 0, 30, 350, 1, 0, 0, 0, 32, 352, 1, 0, 0, 0, 34, 365, 1, 0, 0, 0, 36, 367, 1, 0, 0, 0, 38, 380, 1, 0, 0, 0, 40, 401, 1, 0, 0, 0, 42, 451, 1, 0, 0, 0, 44, 454, 1, 0, 0, 0, 46, 479, 1, 0, 0, 0, 48, 516, 1, 0, 0, 0, 50, 527, 1, 0, 0, 0, 52, 532, 1, 0, 0, 0, 54, 560, 1, 0, 0, 0, 56, 562, 1, 0, 0, 0, 58, 572, 1, 0, 0, 0, 60, 584, 1, 0, 0, 0, 62, 631, 1, 0, 0, 0, 64, 697, 1, 0, 0, 0, 66, 699, 1, 0, 0, 0, 68, 704, 1, 0, 0, 0, 70, 733, 1, 0, 0, 0, 72, 755, 1, 0, 0, 0, 74, 768, 1, 0, 0, 0, 76, 770, 1, 0, 0, 0, 78, 782, 1, 0, 0, 0, 80, 795, 1, 0, 0, 0, 82, 798, 1, 0, 0, 0, 84, 818, 1, 0, 0, 0, 86, 820, 1, 0, 0, 0, 88, 828, 1, 0, 0, 0, 90, 916, 1, 0, 0, 0, 92, 918, 1, 0, 0, 0, 94, 929, 1, 0, 0, 0, 96, 931, 1, 0, 0, 0, 98, 936, 1, 0, 0, 0, 100, 938, 1, 0, 0, 0, 102, 960, 1, 0, 0, 0, 104, 962, 1, 0, 0, 0, 106, 971, 1, 0, 0, 0, 108, 996, 1, 0, 0, 0, 110, 1027, 1, 0, 0, 0, 112, 1029, 1, 0, 0, 0, 114, 1037, 1, 0, 0, 0, 116, 1062, 1, 0, 0, 0, 118, 1064, 1, 0, 0, 0, 120, 1076, 1, 0, 0, 0, 122, 1083, 1, 0, 0, 0, 124, 1097, 1, 0, 0, 0, 126, 1107, 1, 0, 0, 0, 128, 1123, 1, 0, 0, 0, 130, 1161, 1, 0, 0, 0, 132, 1163, 1, 0, 0, 0, 134, 1166, 1, 0, 0, 0, 136, 1168, 1, 0, 0, 0, 138, 1170, 1, 0, 0, 0, 140, 1278, 1, 0, 0, 0, 142, 1280, 1, 0, 0, 0, 144, 1337, 1, 0, 0, 0, 146, 1339, 1, 0, 0, 0, 148, 1344, 1, 0, 0, 0, 150, 1346, 1, 0, 0, 0, 152, 1356, 1, 0, 0, 0, 154, 1358, 1, 0, 0, 0, 156, 1371, 1, 0, 0, 0, 158, 1375, 1, 0, 0, 0, 160, 1388, 1, 0, 0, 0, 162, 1390, 1, 0, 0, 0, 164, 165, 3, 6, 3, 0, 165, 166, 5, 0, 0, 1, 166, 177, 1, 0, 0, 0, 167, 168, 3, 20, 10, 0, 168, 169, 5, 0, 0, 1, 169, 177, 1, 0, 0, 0, 170, 171, 3, 52, 26, 0, 171, 172, 5, 0, 0, 1, 172, 177, 1, 0, 0, 0, 173, 174, 3, 2, 1, 0, 174, 175, 5, 0, 0, 1, 175, 177, 1, 0, 0, 0, 176, 164, 1, 0, 0, 0, 176, 167, 1, 0, 0, 0, 176, 170, 1, 0, 0, 0, 176, 173, 1, 0, 0, 0, 177, 1, 1, 0, 0, 0, 178, 179, 5, 40, 0, 0, 179, 183, 5, 137, 0, 0, 180, 182, 3, 8, 4, 0, 181, 180, 1, 0, 0, 0, 182, 185, 1, 0, 0, 0, 183, 181, 1, 0, 0, 0, 183, 184, 1, 0, 0, 0, 184, 186, 1, 0, 0, 0, 185, 183, 1, 0, 0, 0, 186, 187, 5, 138, 0, 0, 187, 3, 1, 0, 0, 0, 188, 189, 5, 41, 0, 0, 189, 190, 3, 162, 81, 0, 190, 191, 5, 134, 0, 0, 191, 5, 1, 0, 0, 0, 192, 193, 5, 9, 0, 0, 193, 194, 3, 160, 80, 0, 194, 195, 5, 84, 0, 0, 195, 196, 3, 162, 81, 0, 196, 197, 5, 77, 0, 0, 197, 198, 3, 162, 81, 0, 198, 199, 5, 76, 0, 0, 199, 200, 3, 162, 81, 0, 200, 204, 5, 137, 0, 0, 201, 203, 3, 8, 4, 0, 202, 201, 1, 0, 0, 0, 203, 206, 1, 0, 0, 0, 204, 202, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 207, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 207, 208, 5, 138, 0, 0, 208, 7, 1, 0, 0, 0, 209, 218, 3, 4, 2, 0, 210, 218, 3, 18, 9, 0, 211, 218, 3, 10, 5, 0, 212, 218, 3, 96, 48, 0, 213, 218, 3, 108, 54, 0, 214, 218, 3, 142, 71, 0, 215, 218, 3, 58, 29, 0, 216, 218, 3, 32, 16, 0, 217, 209, 1, 0, 0, 0, 217, 210, 1, 0, 0, 0, 217, 211, 1, 0, 0, 0, 217, 212, 1, 0, 0, 0, 217, 213, 1, 0, 0, 0, 217, 214, 1, 0, 0, 0, 217, 215, 1, 0, 0, 0, 217, 216, 1, 0, 0, 0, 218, 9, 1, 0, 0, 0, 219, 220, 5, 41, 0, 0, 220, 221, 5, 44, 0, 0, 221, 222, 3, 160, 80, 0, 222, 223, 5, 134, 0, 0, 223, 230, 1, 0, 0, 0, 224, 225, 5, 41, 0, 0, 225, 226, 5, 46, 0, 0, 226, 227, 3, 160, 80, 0, 227, 228, 5, 134, 0, 0, 228, 230, 1, 0, 0, 0, 229, 219, 1, 0, 0, 0, 229, 224, 1, 0, 0, 0, 230, 11, 1, 0, 0, 0, 231, 232, 5, 42, 0, 0, 232, 233, 5, 43, 0, 0, 233, 234, 3, 160, 80, 0, 234, 235, 5, 84, 0, 0, 235, 236, 3, 162, 81, 0, 236, 237, 5, 134, 0, 0, 237, 13, 1, 0, 0, 0, 238, 239, 5, 42, 0, 0, 239, 240, 5, 44, 0, 0, 240, 241, 3, 160, 80, 0, 241, 242, 5, 77, 0, 0, 242, 243, 3, 162, 81, 0, 243, 244, 5, 134, 0, 0, 244, 15, 1, 0, 0, 0, 245, 250, 3, 10, 5, 0, 246, 250, 3, 12, 6, 0, 247, 250, 3, 14, 7, 0, 248, 250, 3, 32, 16, 0, 249, 245, 1, 0, 0, 0, 249, 246, 1, 0, 0, 0, 249, 247, 1, 0, 0, 0, 249, 248, 1, 0, 0, 0, 250, 17, 1, 0, 0, 0, 251, 252, 5, 43, 0, 0, 252, 253, 3, 160, 80, 0, 253, 254, 5, 84, 0, 0, 254, 257, 3, 162, 81, 0, 255, 256, 5, 85, 0, 0, 256, 258, 3, 162, 81, 0, 257, 255, 1, 0, 0, 0, 257, 258, 1, 0, 0, 0, 258, 259, 1, 0, 0, 0, 259, 260, 5, 134, 0, 0, 260, 19, 1, 0, 0, 0, 261, 263, 3, 16, 8, 0, 262, 261, 1, 0, 0, 0, 263, 266, 1, 0, 0, 0, 264, 262, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 267, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 267, 268, 5, 44, 0, 0, 268, 270, 3, 160, 80, 0, 269, 271, 3, 22, 11, 0, 270, 269, 1, 0, 0, 0, 270, 271, 1, 0, 0, 0, 271, 272, 1, 0, 0, 0, 272, 273, 5, 84, 0, 0, 273, 274, 3, 162, 81, 0, 274, 275, 5, 77, 0, 0, 275, 285, 3, 162, 81, 0, 276, 277, 5, 89, 0, 0, 277, 282, 3, 26, 13, 0, 278, 279, 5, 135, 0, 0, 279, 281, 3, 26, 13, 0, 280, 278, 1, 0, 0, 0, 281, 284, 1, 0, 0, 0, 282, 280, 1, 0, 0, 0, 282, 283, 1, 0, 0, 0, 283, 286, 1, 0, 0, 0, 284, 282, 1, 0, 0, 0, 285, 276, 1, 0, 0, 0, 285, 286, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 291, 5, 137, 0, 0, 288, 290, 3, 34, 17, 0, 289, 288, 1, 0, 0, 0, 290, 293, 1, 0, 0, 0, 291, 289, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 294, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 294, 295, 5, 138, 0, 0, 295, 21, 1, 0, 0, 0, 296, 297, 5, 143, 0, 0, 297, 302, 3, 24, 12, 0, 298, 299, 5, 135, 0, 0, 299, 301, 3, 24, 12, 0, 300, 298, 1, 0, 0, 0, 301, 304, 1, 0, 0, 0, 302, 300, 1, 0, 0, 0, 302, 303, 1, 0, 0, 0, 303, 305, 1, 0, 0, 0, 304, 302, 1, 0, 0, 0, 305, 306, 5, 144, 0, 0, 306, 23, 1, 0, 0, 0, 307, 308, 5, 47, 0, 0, 308, 311, 3, 160, 80, 0, 309, 310, 5, 133, 0, 0, 310, 312, 5, 37, 0, 0, 311, 309, 1, 0, 0, 0, 311, 312, 1, 0, 0, 0, 312, 327, 1, 0, 0, 0, 313, 314, 5, 36, 0, 0, 314, 324, 3, 160, 80, 0, 315, 316, 5, 38, 0, 0, 316, 321, 3, 26, 13, 0, 317, 318, 5, 145, 0, 0, 318, 320, 3, 26, 13, 0, 319, 317, 1, 0, 0, 0, 320, 323, 1, 0, 0, 0, 321, 319, 1, 0, 0, 0, 321, 322, 1, 0, 0, 0, 322, 325, 1, 0, 0, 0, 323, 321, 1, 0, 0, 0, 324, 315, 1, 0, 0, 0, 324, 325, 1, 0, 0, 0, 325, 327, 1, 0, 0, 0, 326, 307, 1, 0, 0, 0, 326, 313, 1, 0, 0, 0, 327, 25, 1, 0, 0, 0, 328, 330, 3, 160, 80, 0, 329, 331, 3, 28, 14, 0, 330, 329, 1, 0, 0, 0, 330, 331, 1, 0, 0, 0, 331, 27, 1, 0, 0, 0, 332, 333, 5, 143, 0, 0, 333, 338, 3, 30, 15, 0, 334, 335, 5, 135, 0, 0, 335, 337, 3, 30, 15, 0, 336, 334, 1, 0, 0, 0, 337, 340, 1, 0, 0, 0, 338, 336, 1, 0, 0, 0, 338, 339, 1, 0, 0, 0, 339, 341, 1, 0, 0, 0, 340, 338, 1, 0, 0, 0, 341, 342, 5, 144, 0, 0, 342, 29, 1, 0, 0, 0, 343, 344, 5, 43, 0, 0, 344, 351, 3, 160, 80, 0, 345, 346, 5, 44, 0, 0, 346, 351, 3, 26, 13, 0, 347, 348, 5, 36, 0, 0, 348, 351, 3, 160, 80, 0, 349, 351, 3, 144, 72, 0, 350, 343, 1, 0, 0, 0, 350, 345, 1, 0, 0, 0, 350, 347, 1, 0, 0, 0, 350, 349, 1, 0, 0, 0, 351, 31, 1, 0, 0, 0, 352, 353, 5, 35, 0, 0, 353, 355, 3, 160, 80, 0, 354, 356, 3, 22, 11, 0, 355, 354, 1, 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 358, 5, 146, 0, 0, 358, 359, 3, 144, 72, 0, 359, 360, 5, 134, 0, 0, 360, 33, 1, 0, 0, 0, 361, 366, 3, 40, 20, 0, 362, 366, 3, 44, 22, 0, 363, 366, 3, 38, 19, 0, 364, 366, 3, 36, 18, 0, 365, 361, 1, 0, 0, 0, 365, 362, 1, 0, 0, 0, 365, 363, 1, 0, 0, 0, 365, 364, 1, 0, 0, 0, 366, 35, 1, 0, 0, 0, 367, 368, 5, 2, 0, 0, 368, 369, 3, 160, 80, 0, 369, 370, 5, 84, 0, 0, 370, 371, 3, 162, 81, 0, 371, 372, 5, 3, 0, 0, 372, 375, 3, 162, 81, 0, 373, 374, 5, 5, 0, 0, 374, 376, 3, 50, 25, 0, 375, 373, 1, 0, 0, 0, 375, 376, 1, 0, 0, 0, 376, 377, 1, 0, 0, 0, 377, 378, 5, 134, 0, 0, 378, 37, 1, 0, 0, 0, 379, 381, 5, 57, 0, 0, 380, 379, 1, 0, 0, 0, 380, 381, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 383, 5, 49, 0, 0, 383, 384, 3, 160, 80, 0, 384, 385, 5, 84, 0, 0, 385, 386, 3, 162, 81, 0, 386, 387, 5, 133, 0, 0, 387, 388, 3, 144, 72, 0, 388, 389, 5, 132, 0, 0, 389, 390, 3, 144, 72, 0, 390, 391, 5, 137, 0, 0, 391, 392, 5, 101, 0, 0, 392, 393, 5, 84, 0, 0, 393, 395, 3, 162, 81, 0, 394, 396, 3, 74, 37, 0, 395, 394, 1, 0, 0, 0, 395, 396, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 398, 5, 134, 0, 0, 398, 399, 5, 138, 0, 0, 399, 39, 1, 0, 0, 0, 400, 402, 3, 46, 23, 0, 401, 400, 1, 0, 0, 0, 401, 402, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 404, 5, 47, 0, 0, 404, 405, 3, 160, 80, 0, 405, 406, 5, 84, 0, 0, 406, 407, 3, 162, 81, 0, 407, 408, 5, 133, 0, 0, 408, 409, 3, 144, 72, 0, 409, 413, 5, 137, 0, 0, 410, 412, 3, 42, 21, 0, 411, 410, 1, 0, 0, 0, 412, 415, 1, 0, 0, 0, 413, 411, 1, 0, 0, 0, 413, 414, 1, 0, 0, 0, 414, 416, 1, 0, 0, 0, 415, 413, 1, 0, 0, 0, 416, 417, 5, 138, 0, 0, 417, 41, 1, 0, 0, 0, 418, 419, 5, 91, 0, 0, 419, 420, 5, 84, 0, 0, 420, 422, 3, 162, 81, 0, 421, 423, 3, 74, 37, 0, 422, 421, 1, 0, 0, 0, 422, 423, 1, 0, 0, 0, 423, 424, 1, 0, 0, 0, 424, 425, 5, 134, 0, 0, 425, 452, 1, 0, 0, 0, 426, 427, 5, 92, 0, 0, 427, 428, 5, 84, 0, 0, 428, 430, 3, 162, 81, 0, 429, 431, 3, 74, 37, 0, 430, 429, 1, 0, 0, 0, 430, 431, 1, 0, 0, 0, 431, 432, 1, 0, 0, 0, 432, 433, 5, 134, 0, 0, 433, 452, 1, 0, 0, 0, 434, 435, 5, 1, 0, 0, 435, 436, 5, 84, 0, 0, 436, 438, 3, 162, 81, 0, 437, 439, 3, 74, 37, 0, 438, 437, 1, 0, 0, 0, 438, 439, 1, 0, 0, 0, 439, 440, 1, 0, 0, 0, 440, 441, 5, 134, 0, 0, 441, 452, 1, 0, 0, 0, 442, 443, 5, 93, 0, 0, 443, 444, 5, 94, 0, 0, 444, 445, 5, 84, 0, 0, 445, 446, 3, 162, 81, 0, 446, 447, 5, 95, 0, 0, 447, 448, 5, 84, 0, 0, 448, 449, 3, 162, 81, 0, 449, 450, 5, 134, 0, 0, 450, 452, 1, 0, 0, 0, 451, 418, 1, 0, 0, 0, 451, 426, 1, 0, 0, 0, 451, 434, 1, 0, 0, 0, 451, 442, 1, 0, 0, 0, 452, 43, 1, 0, 0, 0, 453, 455, 3, 46, 23, 0, 454, 453, 1, 0, 0, 0, 454, 455, 1, 0, 0, 0, 455, 456, 1, 0, 0, 0, 456, 457, 5, 48, 0, 0, 457, 458, 3, 160, 80, 0, 458, 459, 5, 84, 0, 0, 459, 460, 3, 162, 81, 0, 460, 461, 5, 133, 0, 0, 461, 462, 3, 150, 75, 0, 462, 464, 3, 50, 25, 0, 463, 465, 5, 112, 0, 0, 464, 463, 1, 0, 0, 0, 464, 465, 1, 0, 0, 0, 465, 468, 1, 0, 0, 0, 466, 467, 5, 82, 0, 0, 467, 469, 3, 162, 81, 0, 468, 466, 1, 0, 0, 0, 468, 469, 1, 0, 0, 0, 469, 470, 1, 0, 0, 0, 470, 474, 5, 137, 0, 0, 471, 473, 3, 48, 24, 0, 472, 471, 1, 0, 0, 0, 473, 476, 1, 0, 0, 0, 474, 472, 1, 0, 0, 0, 474, 475, 1, 0, 0, 0, 475, 477, 1, 0, 0, 0, 476, 474, 1, 0, 0, 0, 477, 478, 5, 138, 0, 0, 478, 45, 1, 0, 0, 0, 479, 481, 5, 32, 0, 0, 480, 482, 7, 0, 0, 0, 481, 480, 1, 0, 0, 0, 481, 482, 1, 0, 0, 0, 482, 47, 1, 0, 0, 0, 483, 484, 5, 98, 0, 0, 484, 485, 5, 84, 0, 0, 485, 487, 3, 162, 81, 0, 486, 488, 3, 74, 37, 0, 487, 486, 1, 0, 0, 0, 487, 488, 1, 0, 0, 0, 488, 489, 1, 0, 0, 0, 489, 490, 5, 134, 0, 0, 490, 517, 1, 0, 0, 0, 491, 492, 5, 99, 0, 0, 492, 493, 5, 84, 0, 0, 493, 495, 3, 162, 81, 0, 494, 496, 3, 74, 37, 0, 495, 494, 1, 0, 0, 0, 495, 496, 1, 0, 0, 0, 496, 497, 1, 0, 0, 0, 497, 498, 5, 134, 0, 0, 498, 517, 1, 0, 0, 0, 499, 500, 5, 100, 0, 0, 500, 501, 5, 84, 0, 0, 501, 503, 3, 162, 81, 0, 502, 504, 3, 74, 37, 0, 503, 502, 1, 0, 0, 0, 503, 504, 1, 0, 0, 0, 504, 505, 1, 0, 0, 0, 505, 506, 5, 134, 0, 0, 506, 517, 1, 0, 0, 0, 507, 508, 5, 93, 0, 0, 508, 509, 5, 94, 0, 0, 509, 510, 5, 84, 0, 0, 510, 511, 3, 162, 81, 0, 511, 512, 5, 95, 0, 0, 512, 513, 5, 84, 0, 0, 513, 514, 3, 162, 81, 0, 514, 515, 5, 134, 0, 0, 515, 517, 1, 0, 0, 0, 516, 483, 1, 0, 0, 0, 516, 491, 1, 0, 0, 0, 516, 499, 1, 0, 0, 0, 516, 507, 1, 0, 0, 0, 517, 49, 1, 0, 0, 0, 518, 519, 5, 43, 0, 0, 519, 528, 3, 160, 80, 0, 520, 521, 5, 44, 0, 0, 521, 523, 3, 160, 80, 0, 522, 524, 3, 28, 14, 0, 523, 522, 1, 0, 0, 0, 523, 524, 1, 0, 0, 0, 524, 528, 1, 0, 0, 0, 525, 526, 5, 36, 0, 0, 526, 528, 3, 160, 80, 0, 527, 518, 1, 0, 0, 0, 527, 520, 1, 0, 0, 0, 527, 525, 1, 0, 0, 0, 528, 51, 1, 0, 0, 0, 529, 531, 3, 16, 8, 0, 530, 529, 1, 0, 0, 0, 531, 534, 1, 0, 0, 0, 532, 530, 1, 0, 0, 0, 532, 533, 1, 0, 0, 0, 533, 535, 1, 0, 0, 0, 534, 532, 1, 0, 0, 0, 535, 536, 5, 46, 0, 0, 536, 537, 3, 160, 80, 0, 537, 538, 5, 84, 0, 0, 538, 539, 3, 162, 81, 0, 539, 540, 5, 77, 0, 0, 540, 543, 3, 162, 81, 0, 541, 542, 5, 78, 0, 0, 542, 544, 5, 147, 0, 0, 543, 541, 1, 0, 0, 0, 543, 544, 1, 0, 0, 0, 544, 545, 1, 0, 0, 0, 545, 549, 5, 137, 0, 0, 546, 548, 3, 54, 27, 0, 547, 546, 1, 0, 0, 0, 548, 551, 1, 0, 0, 0, 549, 547, 1, 0, 0, 0, 549, 550, 1, 0, 0, 0, 550, 552, 1, 0, 0, 0, 551, 549, 1, 0, 0, 0, 552, 553, 5, 138, 0, 0, 553, 53, 1, 0, 0, 0, 554, 561, 3, 68, 34, 0, 555, 561, 3, 70, 35, 0, 556, 561, 3, 78, 39, 0, 557, 561, 3, 60, 30, 0, 558, 561, 3, 62, 31, 0, 559, 561, 3, 56, 28, 0, 560, 554, 1, 0, 0, 0, 560, 555, 1, 0, 0, 0, 560, 556, 1, 0, 0, 0, 560, 557, 1, 0, 0, 0, 560, 558, 1, 0, 0, 0, 560, 559, 1, 0, 0, 0, 561, 55, 1, 0, 0, 0, 562, 563, 5, 2, 0, 0, 563, 564, 3, 160, 80, 0, 564, 565, 5, 84, 0, 0, 565, 566, 3, 162, 81, 0, 566, 567, 5, 38, 0, 0, 567, 568, 3, 26, 13, 0, 568, 569, 5, 136, 0, 0, 569, 570, 3, 160, 80, 0, 570, 571, 5, 134, 0, 0, 571, 57, 1, 0, 0, 0, 572, 573, 5, 4, 0, 0, 573, 574, 3, 160, 80, 0, 574, 575, 5, 84, 0, 0, 575, 576, 3, 162, 81, 0, 576, 577, 5, 6, 0, 0, 577, 578, 3, 26, 13, 0, 578, 579, 5, 65, 0, 0, 579, 580, 3, 160, 80, 0, 580, 581, 5, 136, 0, 0, 581, 582, 3, 160, 80, 0, 582, 583, 5, 134, 0, 0, 583, 59, 1, 0, 0, 0, 584, 586, 5, 22, 0, 0, 585, 587, 5, 40, 0, 0, 586, 585, 1, 0, 0, 0, 586, 587, 1, 0, 0, 0, 587, 588, 1, 0, 0, 0, 588, 590, 3, 160, 80, 0, 589, 591, 3, 22, 11, 0, 590, 589, 1, 0, 0, 0, 590, 591, 1, 0, 0, 0, 591, 592, 1, 0, 0, 0, 592, 593, 5, 84, 0, 0, 593, 594, 3, 162, 81, 0, 594, 596, 5, 25, 0, 0, 595, 597, 5, 9, 0, 0, 596, 595, 1, 0, 0, 0, 596, 597, 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 599, 3, 26, 13, 0, 599, 600, 5, 26, 0, 0, 600, 629, 3, 162, 81, 0, 601, 602, 5, 49, 0, 0, 602, 603, 3, 162, 81, 0, 603, 607, 5, 137, 0, 0, 604, 606, 3, 64, 32, 0, 605, 604, 1, 0, 0, 0, 606, 609, 1, 0, 0, 0, 607, 605, 1, 0, 0, 0, 607, 608, 1, 0, 0, 0, 608, 610, 1, 0, 0, 0, 609, 607, 1, 0, 0, 0, 610, 611, 5, 138, 0, 0, 611, 630, 1, 0, 0, 0, 612, 613, 5, 40, 0, 0, 613, 616, 3, 162, 81, 0, 614, 615, 5, 49, 0, 0, 615, 617, 3, 162, 81, 0, 616, 614, 1, 0, 0, 0, 616, 617, 1, 0, 0, 0, 617, 627, 1, 0, 0, 0, 618, 622, 5, 137, 0, 0, 619, 621, 3, 64, 32, 0, 620, 619, 1, 0, 0, 0, 621, 624, 1, 0, 0, 0, 622, 620, 1, 0, 0, 0, 622, 623, 1, 0, 0, 0, 623, 625, 1, 0, 0, 0, 624, 622, 1, 0, 0, 0, 625, 628, 5, 138, 0, 0, 626, 628, 5, 134, 0, 0, 627, 618, 1, 0, 0, 0, 627, 626, 1, 0, 0, 0, 628, 630, 1, 0, 0, 0, 629, 601, 1, 0, 0, 0, 629, 612, 1, 0, 0, 0, 630, 61, 1, 0, 0, 0, 631, 632, 5, 22, 0, 0, 632, 633, 3, 160, 80, 0, 633, 634, 5, 84, 0, 0, 634, 635, 3, 162, 81, 0, 635, 636, 5, 24, 0, 0, 636, 637, 3, 160, 80, 0, 637, 638, 3, 28, 14, 0, 638, 639, 5, 134, 0, 0, 639, 63, 1, 0, 0, 0, 640, 641, 5, 16, 0, 0, 641, 698, 5, 134, 0, 0, 642, 643, 5, 17, 0, 0, 643, 644, 5, 18, 0, 0, 644, 645, 3, 160, 80, 0, 645, 646, 5, 134, 0, 0, 646, 698, 1, 0, 0, 0, 647, 648, 5, 27, 0, 0, 648, 649, 3, 162, 81, 0, 649, 650, 5, 134, 0, 0, 650, 698, 1, 0, 0, 0, 651, 652, 5, 27, 0, 0, 652, 653, 3, 160, 80, 0, 653, 654, 5, 136, 0, 0, 654, 664, 3, 160, 80, 0, 655, 656, 5, 64, 0, 0, 656, 660, 5, 137, 0, 0, 657, 659, 3, 66, 33, 0, 658, 657, 1, 0, 0, 0, 659, 662, 1, 0, 0, 0, 660, 658, 1, 0, 0, 0, 660, 661, 1, 0, 0, 0, 661, 663, 1, 0, 0, 0, 662, 660, 1, 0, 0, 0, 663, 665, 5, 138, 0, 0, 664, 655, 1, 0, 0, 0, 664, 665, 1, 0, 0, 0, 665, 666, 1, 0, 0, 0, 666, 667, 5, 134, 0, 0, 667, 698, 1, 0, 0, 0, 668, 670, 5, 28, 0, 0, 669, 671, 5, 36, 0, 0, 670, 669, 1, 0, 0, 0, 670, 671, 1, 0, 0, 0, 671, 672, 1, 0, 0, 0, 672, 673, 3, 160, 80, 0, 673, 674, 5, 55, 0, 0, 674, 675, 3, 26, 13, 0, 675, 676, 5, 134, 0, 0, 676, 698, 1, 0, 0, 0, 677, 678, 5, 29, 0, 0, 678, 679, 3, 160, 80, 0, 679, 680, 5, 147, 0, 0, 680, 681, 5, 134, 0, 0, 681, 698, 1, 0, 0, 0, 682, 683, 5, 30, 0, 0, 683, 684, 3, 26, 13, 0, 684, 685, 5, 136, 0, 0, 685, 686, 3, 160, 80, 0, 686, 687, 3, 160, 80, 0, 687, 688, 3, 162, 81, 0, 688, 689, 5, 134, 0, 0, 689, 698, 1, 0, 0, 0, 690, 691, 5, 93, 0, 0, 691, 698, 5, 134, 0, 0, 692, 693, 5, 31, 0, 0, 693, 694, 5, 147, 0, 0, 694, 695, 3, 162, 81, 0, 695, 696, 5, 134, 0, 0, 696, 698, 1, 0, 0, 0, 697, 640, 1, 0, 0, 0, 697, 642, 1, 0, 0, 0, 697, 647, 1, 0, 0, 0, 697, 651, 1, 0, 0, 0, 697, 668, 1, 0, 0, 0, 697, 677, 1, 0, 0, 0, 697, 682, 1, 0, 0, 0, 697, 690, 1, 0, 0, 0, 697, 692, 1, 0, 0, 0, 698, 65, 1, 0, 0, 0, 699, 700, 3, 160, 80, 0, 700, 701, 5, 58, 0, 0, 701, 702, 3, 160, 80, 0, 702, 703, 5, 134, 0, 0, 703, 67, 1, 0, 0, 0, 704, 705, 5, 49, 0, 0, 705, 707, 3, 160, 80, 0, 706, 708, 3, 22, 11, 0, 707, 706, 1, 0, 0, 0, 707, 708, 1, 0, 0, 0, 708, 709, 1, 0, 0, 0, 709, 710, 5, 84, 0, 0, 710, 711, 3, 162, 81, 0, 711, 712, 5, 133, 0, 0, 712, 713, 3, 144, 72, 0, 713, 714, 5, 132, 0, 0, 714, 715, 3, 144, 72, 0, 715, 716, 5, 86, 0, 0, 716, 718, 3, 82, 41, 0, 717, 719, 3, 74, 37, 0, 718, 717, 1, 0, 0, 0, 718, 719, 1, 0, 0, 0, 719, 721, 1, 0, 0, 0, 720, 722, 3, 80, 40, 0, 721, 720, 1, 0, 0, 0, 721, 722, 1, 0, 0, 0, 722, 723, 1, 0, 0, 0, 723, 724, 5, 88, 0, 0, 724, 726, 3, 84, 42, 0, 725, 727, 3, 88, 44, 0, 726, 725, 1, 0, 0, 0, 726, 727, 1, 0, 0, 0, 727, 729, 1, 0, 0, 0, 728, 730, 3, 72, 36, 0, 729, 728, 1, 0, 0, 0, 729, 730, 1, 0, 0, 0, 730, 731, 1, 0, 0, 0, 731, 732, 5, 134, 0, 0, 732, 69, 1, 0, 0, 0, 733, 734, 5, 50, 0, 0, 734, 736, 3, 160, 80, 0, 735, 737, 3, 22, 11, 0, 736, 735, 1, 0, 0, 0, 736, 737, 1, 0, 0, 0, 737, 738, 1, 0, 0, 0, 738, 739, 5, 84, 0, 0, 739, 740, 3, 162, 81, 0, 740, 741, 5, 133, 0, 0, 741, 742, 3, 144, 72, 0, 742, 743, 5, 132, 0, 0, 743, 745, 3, 144, 72, 0, 744, 746, 3, 74, 37, 0, 745, 744, 1, 0, 0, 0, 745, 746, 1, 0, 0, 0, 746, 748, 1, 0, 0, 0, 747, 749, 3, 88, 44, 0, 748, 747, 1, 0, 0, 0, 748, 749, 1, 0, 0, 0, 749, 751, 1, 0, 0, 0, 750, 752, 3, 72, 36, 0, 751, 750, 1, 0, 0, 0, 751, 752, 1, 0, 0, 0, 752, 753, 1, 0, 0, 0, 753, 754, 5, 134, 0, 0, 754, 71, 1, 0, 0, 0, 755, 756, 5, 66, 0, 0, 756, 757, 5, 65, 0, 0, 757, 758, 3, 160, 80, 0, 758, 73, 1, 0, 0, 0, 759, 760, 5, 10, 0, 0, 760, 769, 5, 13, 0, 0, 761, 762, 5, 10, 0, 0, 762, 763, 7, 1, 0, 0, 763, 764, 5, 14, 0, 0, 764, 765, 5, 139, 0, 0, 765, 766, 3, 86, 43, 0, 766, 767, 5, 140, 0, 0, 767, 769, 1, 0, 0, 0, 768, 759, 1, 0, 0, 0, 768, 761, 1, 0, 0, 0, 769, 75, 1, 0, 0, 0, 770, 771, 5, 65, 0, 0, 771, 772, 5, 139, 0, 0, 772, 777, 3, 126, 63, 0, 773, 774, 5, 135, 0, 0, 774, 776, 3, 126, 63, 0, 775, 773, 1, 0, 0, 0, 776, 779, 1, 0, 0, 0, 777, 775, 1, 0, 0, 0, 777, 778, 1, 0, 0, 0, 778, 780, 1, 0, 0, 0, 779, 777, 1, 0, 0, 0, 780, 781, 5, 140, 0, 0, 781, 77, 1, 0, 0, 0, 782, 783, 5, 51, 0, 0, 783, 784, 3, 160, 80, 0, 784, 785, 5, 84, 0, 0, 785, 786, 3, 162, 81, 0, 786, 787, 5, 52, 0, 0, 787, 788, 3, 160, 80, 0, 788, 789, 5, 133, 0, 0, 789, 791, 3, 144, 72, 0, 790, 792, 3, 88, 44, 0, 791, 790, 1, 0, 0, 0, 791, 792, 1, 0, 0, 0, 792, 793, 1, 0, 0, 0, 793, 794, 5, 134, 0, 0, 794, 79, 1, 0, 0, 0, 795, 796, 5, 87, 0, 0, 796, 797, 3, 144, 72, 0, 797, 81, 1, 0, 0, 0, 798, 799, 7, 2, 0, 0, 799, 83, 1, 0, 0, 0, 800, 819, 5, 90, 0, 0, 801, 802, 5, 43, 0, 0, 802, 819, 3, 160, 80, 0, 803, 804, 5, 36, 0, 0, 804, 819, 3, 160, 80, 0, 805, 806, 5, 45, 0, 0, 806, 815, 5, 139, 0, 0, 807, 812, 3, 26, 13, 0, 808, 809, 5, 135, 0, 0, 809, 811, 3, 26, 13, 0, 810, 808, 1, 0, 0, 0, 811, 814, 1, 0, 0, 0, 812, 810, 1, 0, 0, 0, 812, 813, 1, 0, 0, 0, 813, 816, 1, 0, 0, 0, 814, 812, 1, 0, 0, 0, 815, 807, 1, 0, 0, 0, 815, 816, 1, 0, 0, 0, 816, 817, 1, 0, 0, 0, 817, 819, 5, 140, 0, 0, 818, 800, 1, 0, 0, 0, 818, 801, 1, 0, 0, 0, 818, 803, 1, 0, 0, 0, 818, 805, 1, 0, 0, 0, 819, 85, 1, 0, 0, 0, 820, 825, 3, 160, 80, 0, 821, 822, 5, 135, 0, 0, 822, 824, 3, 160, 80, 0, 823, 821, 1, 0, 0, 0, 824, 827, 1, 0, 0, 0, 825, 823, 1, 0, 0, 0, 825, 826, 1, 0, 0, 0, 826, 87, 1, 0, 0, 0, 827, 825, 1, 0, 0, 0, 828, 829, 5, 89, 0, 0, 829, 833, 5, 137, 0, 0, 830, 832, 3, 90, 45, 0, 831, 830, 1, 0, 0, 0, 832, 835, 1, 0, 0, 0, 833, 831, 1, 0, 0, 0, 833, 834, 1, 0, 0, 0, 834, 836, 1, 0, 0, 0, 835, 833, 1, 0, 0, 0, 836, 837, 5, 138, 0, 0, 837, 89, 1, 0, 0, 0, 838, 839, 5, 23, 0, 0, 839, 840, 3, 160, 80, 0, 840, 841, 5, 84, 0, 0, 841, 842, 3, 162, 81, 0, 842, 843, 5, 139, 0, 0, 843, 844, 3, 86, 43, 0, 844, 845, 5, 140, 0, 0, 845, 846, 5, 134, 0, 0, 846, 917, 1, 0, 0, 0, 847, 848, 5, 61, 0, 0, 848, 849, 3, 160, 80, 0, 849, 850, 5, 84, 0, 0, 850, 851, 3, 162, 81, 0, 851, 852, 5, 133, 0, 0, 852, 853, 3, 144, 72, 0, 853, 854, 3, 92, 46, 0, 854, 855, 5, 134, 0, 0, 855, 917, 1, 0, 0, 0, 856, 857, 5, 62, 0, 0, 857, 858, 3, 160, 80, 0, 858, 859, 5, 84, 0, 0, 859, 860, 3, 162, 81, 0, 860, 861, 5, 133, 0, 0, 861, 862, 3, 150, 75, 0, 862, 863, 3, 50, 25, 0, 863, 864, 3, 92, 46, 0, 864, 865, 5, 134, 0, 0, 865, 917, 1, 0, 0, 0, 866, 867, 5, 44, 0, 0, 867, 868, 3, 160, 80, 0, 868, 869, 5, 84, 0, 0, 869, 870, 3, 162, 81, 0, 870, 871, 5, 133, 0, 0, 871, 873, 3, 160, 80, 0, 872, 874, 3, 28, 14, 0, 873, 872, 1, 0, 0, 0, 873, 874, 1, 0, 0, 0, 874, 876, 1, 0, 0, 0, 875, 877, 3, 76, 38, 0, 876, 875, 1, 0, 0, 0, 876, 877, 1, 0, 0, 0, 877, 880, 1, 0, 0, 0, 878, 879, 5, 18, 0, 0, 879, 881, 5, 53, 0, 0, 880, 878, 1, 0, 0, 0, 880, 881, 1, 0, 0, 0, 881, 882, 1, 0, 0, 0, 882, 883, 5, 134, 0, 0, 883, 917, 1, 0, 0, 0, 884, 885, 5, 7, 0, 0, 885, 886, 3, 160, 80, 0, 886, 887, 5, 84, 0, 0, 887, 888, 3, 162, 81, 0, 888, 889, 5, 133, 0, 0, 889, 890, 3, 160, 80, 0, 890, 891, 5, 53, 0, 0, 891, 892, 3, 144, 72, 0, 892, 893, 5, 134, 0, 0, 893, 917, 1, 0, 0, 0, 894, 895, 5, 51, 0, 0, 895, 896, 3, 160, 80, 0, 896, 897, 5, 84, 0, 0, 897, 898, 3, 162, 81, 0, 898, 899, 5, 133, 0, 0, 899, 902, 3, 160, 80, 0, 900, 901, 5, 53, 0, 0, 901, 903, 3, 144, 72, 0, 902, 900, 1, 0, 0, 0, 902, 903, 1, 0, 0, 0, 903, 904, 1, 0, 0, 0, 904, 905, 5, 134, 0, 0, 905, 917, 1, 0, 0, 0, 906, 907, 5, 22, 0, 0, 907, 908, 3, 160, 80, 0, 908, 909, 5, 84, 0, 0, 909, 910, 3, 162, 81, 0, 910, 911, 5, 133, 0, 0, 911, 912, 3, 160, 80, 0, 912, 913, 5, 136, 0, 0, 913, 914, 3, 160, 80, 0, 914, 915, 5, 134, 0, 0, 915, 917, 1, 0, 0, 0, 916, 838, 1, 0, 0, 0, 916, 847, 1, 0, 0, 0, 916, 856, 1, 0, 0, 0, 916, 866, 1, 0, 0, 0, 916, 884, 1, 0, 0, 0, 916, 894, 1, 0, 0, 0, 916, 906, 1, 0, 0, 0, 917, 91, 1, 0, 0, 0, 918, 919, 5, 139, 0, 0, 919, 924, 3, 94, 47, 0, 920, 921, 5, 135, 0, 0, 921, 923, 3, 94, 47, 0, 922, 920, 1, 0, 0, 0, 923, 926, 1, 0, 0, 0, 924, 922, 1, 0, 0, 0, 924, 925, 1, 0, 0, 0, 925, 927, 1, 0, 0, 0, 926, 924, 1, 0, 0, 0, 927, 928, 5, 140, 0, 0, 928, 93, 1, 0, 0, 0, 929, 930, 7, 3, 0, 0, 930, 95, 1, 0, 0, 0, 931, 932, 5, 60, 0, 0, 932, 933, 3, 98, 49, 0, 933, 97, 1, 0, 0, 0, 934, 937, 3, 100, 50, 0, 935, 937, 3, 104, 52, 0, 936, 934, 1, 0, 0, 0, 936, 935, 1, 0, 0, 0, 937, 99, 1, 0, 0, 0, 938, 939, 5, 61, 0, 0, 939, 940, 3, 160, 80, 0, 940, 941, 5, 84, 0, 0, 941, 942, 3, 162, 81, 0, 942, 943, 5, 71, 0, 0, 943, 944, 3, 160, 80, 0, 944, 945, 5, 133, 0, 0, 945, 946, 3, 144, 72, 0, 946, 947, 5, 72, 0, 0, 947, 950, 3, 102, 51, 0, 948, 949, 5, 73, 0, 0, 949, 951, 3, 152, 76, 0, 950, 948, 1, 0, 0, 0, 950, 951, 1, 0, 0, 0, 951, 952, 1, 0, 0, 0, 952, 953, 5, 134, 0, 0, 953, 101, 1, 0, 0, 0, 954, 961, 5, 106, 0, 0, 955, 956, 5, 107, 0, 0, 956, 957, 5, 141, 0, 0, 957, 958, 3, 144, 72, 0, 958, 959, 5, 142, 0, 0, 959, 961, 1, 0, 0, 0, 960, 954, 1, 0, 0, 0, 960, 955, 1, 0, 0, 0, 961, 103, 1, 0, 0, 0, 962, 963, 5, 62, 0, 0, 963, 964, 3, 160, 80, 0, 964, 965, 5, 84, 0, 0, 965, 966, 3, 162, 81, 0, 966, 967, 5, 137, 0, 0, 967, 968, 3, 106, 53, 0, 968, 969, 3, 106, 53, 0, 969, 970, 5, 138, 0, 0, 970, 105, 1, 0, 0, 0, 971, 972, 3, 50, 25, 0, 972, 973, 5, 63, 0, 0, 973, 974, 3, 160, 80, 0, 974, 975, 5, 84, 0, 0, 975, 976, 3, 162, 81, 0, 976, 978, 3, 150, 75, 0, 977, 979, 5, 112, 0, 0, 978, 977, 1, 0, 0, 0, 978, 979, 1, 0, 0, 0, 979, 982, 1, 0, 0, 0, 980, 981, 5, 79, 0, 0, 981, 983, 3, 162, 81, 0, 982, 980, 1, 0, 0, 0, 982, 983, 1, 0, 0, 0, 983, 985, 1, 0, 0, 0, 984, 986, 5, 81, 0, 0, 985, 984, 1, 0, 0, 0, 985, 986, 1, 0, 0, 0, 986, 989, 1, 0, 0, 0, 987, 988, 5, 82, 0, 0, 988, 990, 3, 162, 81, 0, 989, 987, 1, 0, 0, 0, 989, 990, 1, 0, 0, 0, 990, 992, 1, 0, 0, 0, 991, 993, 5, 83, 0, 0, 992, 991, 1, 0, 0, 0, 992, 993, 1, 0, 0, 0, 993, 994, 1, 0, 0, 0, 994, 995, 5, 134, 0, 0, 995, 107, 1, 0, 0, 0, 996, 997, 5, 54, 0, 0, 997, 998, 3, 160, 80, 0, 998, 999, 5, 55, 0, 0, 999, 1001, 3, 160, 80, 0, 1000, 1002, 3, 28, 14, 0, 1001, 1000, 1, 0, 0, 0, 1001, 1002, 1, 0, 0, 0, 1002, 1005, 1, 0, 0, 0, 1003, 1004, 5, 84, 0, 0, 1004, 1006, 3, 162, 81, 0, 1005, 1003, 1, 0, 0, 0, 1005, 1006, 1, 0, 0, 0, 1006, 1009, 1, 0, 0, 0, 1007, 1008, 5, 78, 0, 0, 1008, 1010, 5, 147, 0, 0, 1009, 1007, 1, 0, 0, 0, 1009, 1010, 1, 0, 0, 0, 1010, 1011, 1, 0, 0, 0, 1011, 1015, 5, 137, 0, 0, 1012, 1014, 3, 110, 55, 0, 1013, 1012, 1, 0, 0, 0, 1014, 1017, 1, 0, 0, 0, 1015, 1013, 1, 0, 0, 0, 1015, 1016, 1, 0, 0, 0, 1016, 1018, 1, 0, 0, 0, 1017, 1015, 1, 0, 0, 0, 1018, 1019, 5, 138, 0, 0, 1019, 109, 1, 0, 0, 0, 1020, 1021, 5, 59, 0, 0, 1021, 1028, 3, 98, 49, 0, 1022, 1028, 3, 124, 62, 0, 1023, 1028, 3, 120, 60, 0, 1024, 1028, 3, 114, 57, 0, 1025, 1028, 3, 122, 61, 0, 1026, 1028, 3, 112, 56, 0, 1027, 1020, 1, 0, 0, 0, 1027, 1022, 1, 0, 0, 0, 1027, 1023, 1, 0, 0, 0, 1027, 1024, 1, 0, 0, 0, 1027, 1025, 1, 0, 0, 0, 1027, 1026, 1, 0, 0, 0, 1028, 111, 1, 0, 0, 0, 1029, 1030, 5, 56, 0, 0, 1030, 1031, 3, 160, 80, 0, 1031, 1032, 5, 58, 0, 0, 1032, 1033, 3, 160, 80, 0, 1033, 1034, 5, 136, 0, 0, 1034, 1035, 3, 160, 80, 0, 1035, 1036, 5, 134, 0, 0, 1036, 113, 1, 0, 0, 0, 1037, 1038, 5, 8, 0, 0, 1038, 1042, 5, 137, 0, 0, 1039, 1041, 3, 116, 58, 0, 1040, 1039, 1, 0, 0, 0, 1041, 1044, 1, 0, 0, 0, 1042, 1040, 1, 0, 0, 0, 1042, 1043, 1, 0, 0, 0, 1043, 1045, 1, 0, 0, 0, 1044, 1042, 1, 0, 0, 0, 1045, 1046, 5, 138, 0, 0, 1046, 1047, 5, 134, 0, 0, 1047, 115, 1, 0, 0, 0, 1048, 1049, 3, 160, 80, 0, 1049, 1050, 5, 58, 0, 0, 1050, 1051, 5, 61, 0, 0, 1051, 1052, 3, 160, 80, 0, 1052, 1053, 5, 134, 0, 0, 1053, 1063, 1, 0, 0, 0, 1054, 1055, 3, 160, 80, 0, 1055, 1056, 5, 58, 0, 0, 1056, 1057, 5, 62, 0, 0, 1057, 1058, 3, 160, 80, 0, 1058, 1059, 5, 136, 0, 0, 1059, 1060, 3, 160, 80, 0, 1060, 1061, 5, 134, 0, 0, 1061, 1063, 1, 0, 0, 0, 1062, 1048, 1, 0, 0, 0, 1062, 1054, 1, 0, 0, 0, 1063, 117, 1, 0, 0, 0, 1064, 1065, 3, 26, 13, 0, 1065, 1066, 5, 18, 0, 0, 1066, 1071, 5, 53, 0, 0, 1067, 1068, 5, 136, 0, 0, 1068, 1070, 3, 160, 80, 0, 1069, 1067, 1, 0, 0, 0, 1070, 1073, 1, 0, 0, 0, 1071, 1069, 1, 0, 0, 0, 1071, 1072, 1, 0, 0, 0, 1072, 1074, 1, 0, 0, 0, 1073, 1071, 1, 0, 0, 0, 1074, 1075, 5, 134, 0, 0, 1075, 119, 1, 0, 0, 0, 1076, 1077, 5, 56, 0, 0, 1077, 1078, 3, 160, 80, 0, 1078, 1079, 5, 58, 0, 0, 1079, 1080, 5, 61, 0, 0, 1080, 1081, 3, 160, 80, 0, 1081, 1082, 5, 134, 0, 0, 1082, 121, 1, 0, 0, 0, 1083, 1084, 5, 68, 0, 0, 1084, 1085, 3, 160, 80, 0, 1085, 1086, 5, 69, 0, 0, 1086, 1087, 5, 70, 0, 0, 1087, 1088, 5, 65, 0, 0, 1088, 1089, 5, 51, 0, 0, 1089, 1090, 3, 160, 80, 0, 1090, 1091, 5, 67, 0, 0, 1091, 1092, 5, 62, 0, 0, 1092, 1093, 3, 160, 80, 0, 1093, 1094, 5, 136, 0, 0, 1094, 1095, 3, 160, 80, 0, 1095, 1096, 5, 134, 0, 0, 1096, 123, 1, 0, 0, 0, 1097, 1098, 5, 56, 0, 0, 1098, 1099, 3, 126, 63, 0, 1099, 1100, 5, 58, 0, 0, 1100, 1103, 3, 130, 65, 0, 1101, 1102, 5, 34, 0, 0, 1102, 1104, 3, 162, 81, 0, 1103, 1101, 1, 0, 0, 0, 1103, 1104, 1, 0, 0, 0, 1104, 1105, 1, 0, 0, 0, 1105, 1106, 5, 134, 0, 0, 1106, 125, 1, 0, 0, 0, 1107, 1108, 3, 160, 80, 0, 1108, 1109, 5, 136, 0, 0, 1109, 1110, 3, 128, 64, 0, 1110, 127, 1, 0, 0, 0, 1111, 1124, 3, 160, 80, 0, 1112, 1124, 5, 101, 0, 0, 1113, 1124, 5, 91, 0, 0, 1114, 1124, 5, 92, 0, 0, 1115, 1124, 5, 1, 0, 0, 1116, 1124, 5, 98, 0, 0, 1117, 1124, 5, 99, 0, 0, 1118, 1124, 5, 100, 0, 0, 1119, 1124, 5, 102, 0, 0, 1120, 1124, 5, 103, 0, 0, 1121, 1124, 5, 104, 0, 0, 1122, 1124, 5, 105, 0, 0, 1123, 1111, 1, 0, 0, 0, 1123, 1112, 1, 0, 0, 0, 1123, 1113, 1, 0, 0, 0, 1123, 1114, 1, 0, 0, 0, 1123, 1115, 1, 0, 0, 0, 1123, 1116, 1, 0, 0, 0, 1123, 1117, 1, 0, 0, 0, 1123, 1118, 1, 0, 0, 0, 1123, 1119, 1, 0, 0, 0, 1123, 1120, 1, 0, 0, 0, 1123, 1121, 1, 0, 0, 0, 1123, 1122, 1, 0, 0, 0, 1124, 129, 1, 0, 0, 0, 1125, 1126, 5, 80, 0, 0, 1126, 1127, 5, 136, 0, 0, 1127, 1162, 3, 160, 80, 0, 1128, 1129, 5, 61, 0, 0, 1129, 1130, 3, 160, 80, 0, 1130, 1131, 5, 136, 0, 0, 1131, 1132, 3, 134, 67, 0, 1132, 1162, 1, 0, 0, 0, 1133, 1134, 5, 62, 0, 0, 1134, 1135, 3, 160, 80, 0, 1135, 1136, 5, 136, 0, 0, 1136, 1137, 3, 160, 80, 0, 1137, 1138, 5, 136, 0, 0, 1138, 1139, 3, 136, 68, 0, 1139, 1162, 1, 0, 0, 0, 1140, 1141, 5, 44, 0, 0, 1141, 1143, 3, 160, 80, 0, 1142, 1144, 3, 28, 14, 0, 1143, 1142, 1, 0, 0, 0, 1143, 1144, 1, 0, 0, 0, 1144, 1145, 1, 0, 0, 0, 1145, 1146, 5, 136, 0, 0, 1146, 1147, 3, 126, 63, 0, 1147, 1162, 1, 0, 0, 0, 1148, 1149, 5, 46, 0, 0, 1149, 1150, 3, 160, 80, 0, 1150, 1151, 5, 136, 0, 0, 1151, 1153, 3, 160, 80, 0, 1152, 1154, 3, 28, 14, 0, 1153, 1152, 1, 0, 0, 0, 1153, 1154, 1, 0, 0, 0, 1154, 1156, 1, 0, 0, 0, 1155, 1157, 3, 138, 69, 0, 1156, 1155, 1, 0, 0, 0, 1156, 1157, 1, 0, 0, 0, 1157, 1159, 1, 0, 0, 0, 1158, 1160, 3, 132, 66, 0, 1159, 1158, 1, 0, 0, 0, 1159, 1160, 1, 0, 0, 0, 1160, 1162, 1, 0, 0, 0, 1161, 1125, 1, 0, 0, 0, 1161, 1128, 1, 0, 0, 0, 1161, 1133, 1, 0, 0, 0, 1161, 1140, 1, 0, 0, 0, 1161, 1148, 1, 0, 0, 0, 1162, 131, 1, 0, 0, 0, 1163, 1164, 5, 66, 0, 0, 1164, 1165, 3, 138, 69, 0, 1165, 133, 1, 0, 0, 0, 1166, 1167, 7, 4, 0, 0, 1167, 135, 1, 0, 0, 0, 1168, 1169, 7, 5, 0, 0, 1169, 137, 1, 0, 0, 0, 1170, 1171, 5, 64, 0, 0, 1171, 1175, 5, 137, 0, 0, 1172, 1174, 3, 140, 70, 0, 1173, 1172, 1, 0, 0, 0, 1174, 1177, 1, 0, 0, 0, 1175, 1173, 1, 0, 0, 0, 1175, 1176, 1, 0, 0, 0, 1176, 1178, 1, 0, 0, 0, 1177, 1175, 1, 0, 0, 0, 1178, 1179, 5, 138, 0, 0, 1179, 139, 1, 0, 0, 0, 1180, 1181, 3, 160, 80, 0, 1181, 1182, 5, 58, 0, 0, 1182, 1183, 5, 9, 0, 0, 1183, 1184, 5, 23, 0, 0, 1184, 1185, 5, 139, 0, 0, 1185, 1186, 3, 86, 43, 0, 1186, 1187, 5, 140, 0, 0, 1187, 1188, 5, 134, 0, 0, 1188, 1279, 1, 0, 0, 0, 1189, 1190, 3, 160, 80, 0, 1190, 1191, 5, 58, 0, 0, 1191, 1192, 5, 61, 0, 0, 1192, 1199, 3, 160, 80, 0, 1193, 1194, 5, 67, 0, 0, 1194, 1195, 5, 62, 0, 0, 1195, 1196, 3, 160, 80, 0, 1196, 1197, 5, 136, 0, 0, 1197, 1198, 3, 160, 80, 0, 1198, 1200, 1, 0, 0, 0, 1199, 1193, 1, 0, 0, 0, 1199, 1200, 1, 0, 0, 0, 1200, 1201, 1, 0, 0, 0, 1201, 1202, 5, 134, 0, 0, 1202, 1279, 1, 0, 0, 0, 1203, 1204, 3, 160, 80, 0, 1204, 1205, 5, 58, 0, 0, 1205, 1206, 5, 62, 0, 0, 1206, 1207, 3, 160, 80, 0, 1207, 1208, 5, 136, 0, 0, 1208, 1215, 3, 160, 80, 0, 1209, 1210, 5, 67, 0, 0, 1210, 1211, 5, 62, 0, 0, 1211, 1212, 3, 160, 80, 0, 1212, 1213, 5, 136, 0, 0, 1213, 1214, 3, 160, 80, 0, 1214, 1216, 1, 0, 0, 0, 1215, 1209, 1, 0, 0, 0, 1215, 1216, 1, 0, 0, 0, 1216, 1217, 1, 0, 0, 0, 1217, 1218, 5, 134, 0, 0, 1218, 1279, 1, 0, 0, 0, 1219, 1220, 3, 160, 80, 0, 1220, 1221, 5, 58, 0, 0, 1221, 1222, 5, 44, 0, 0, 1222, 1224, 3, 160, 80, 0, 1223, 1225, 3, 28, 14, 0, 1224, 1223, 1, 0, 0, 0, 1224, 1225, 1, 0, 0, 0, 1225, 1234, 1, 0, 0, 0, 1226, 1227, 5, 67, 0, 0, 1227, 1228, 5, 62, 0, 0, 1228, 1229, 3, 160, 80, 0, 1229, 1230, 5, 136, 0, 0, 1230, 1231, 3, 160, 80, 0, 1231, 1235, 1, 0, 0, 0, 1232, 1233, 5, 18, 0, 0, 1233, 1235, 5, 53, 0, 0, 1234, 1226, 1, 0, 0, 0, 1234, 1232, 1, 0, 0, 0, 1234, 1235, 1, 0, 0, 0, 1235, 1236, 1, 0, 0, 0, 1236, 1237, 5, 134, 0, 0, 1237, 1279, 1, 0, 0, 0, 1238, 1239, 3, 160, 80, 0, 1239, 1240, 5, 58, 0, 0, 1240, 1241, 5, 7, 0, 0, 1241, 1242, 3, 160, 80, 0, 1242, 1243, 5, 64, 0, 0, 1243, 1247, 5, 137, 0, 0, 1244, 1246, 3, 118, 59, 0, 1245, 1244, 1, 0, 0, 0, 1246, 1249, 1, 0, 0, 0, 1247, 1245, 1, 0, 0, 0, 1247, 1248, 1, 0, 0, 0, 1248, 1250, 1, 0, 0, 0, 1249, 1247, 1, 0, 0, 0, 1250, 1251, 5, 138, 0, 0, 1251, 1252, 5, 134, 0, 0, 1252, 1279, 1, 0, 0, 0, 1253, 1254, 3, 160, 80, 0, 1254, 1255, 5, 58, 0, 0, 1255, 1256, 5, 51, 0, 0, 1256, 1257, 3, 160, 80, 0, 1257, 1258, 5, 134, 0, 0, 1258, 1279, 1, 0, 0, 0, 1259, 1260, 3, 160, 80, 0, 1260, 1262, 5, 58, 0, 0, 1261, 1263, 5, 9, 0, 0, 1262, 1261, 1, 0, 0, 0, 1262, 1263, 1, 0, 0, 0, 1263, 1264, 1, 0, 0, 0, 1264, 1265, 5, 22, 0, 0, 1265, 1266, 3, 160, 80, 0, 1266, 1267, 5, 136, 0, 0, 1267, 1274, 3, 160, 80, 0, 1268, 1269, 5, 67, 0, 0, 1269, 1270, 5, 62, 0, 0, 1270, 1271, 3, 160, 80, 0, 1271, 1272, 5, 136, 0, 0, 1272, 1273, 3, 160, 80, 0, 1273, 1275, 1, 0, 0, 0, 1274, 1268, 1, 0, 0, 0, 1274, 1275, 1, 0, 0, 0, 1275, 1276, 1, 0, 0, 0, 1276, 1277, 5, 134, 0, 0, 1277, 1279, 1, 0, 0, 0, 1278, 1180, 1, 0, 0, 0, 1278, 1189, 1, 0, 0, 0, 1278, 1203, 1, 0, 0, 0, 1278, 1219, 1, 0, 0, 0, 1278, 1238, 1, 0, 0, 0, 1278, 1253, 1, 0, 0, 0, 1278, 1259, 1, 0, 0, 0, 1279, 141, 1, 0, 0, 0, 1280, 1281, 5, 51, 0, 0, 1281, 1282, 3, 160, 80, 0, 1282, 1283, 5, 58, 0, 0, 1283, 1284, 3, 160, 80, 0, 1284, 1285, 5, 136, 0, 0, 1285, 1287, 3, 160, 80, 0, 1286, 1288, 3, 138, 69, 0, 1287, 1286, 1, 0, 0, 0, 1287, 1288, 1, 0, 0, 0, 1288, 1289, 1, 0, 0, 0, 1289, 1290, 5, 134, 0, 0, 1290, 143, 1, 0, 0, 0, 1291, 1338, 3, 148, 74, 0, 1292, 1338, 5, 113, 0, 0, 1293, 1338, 5, 114, 0, 0, 1294, 1295, 5, 115, 0, 0, 1295, 1338, 3, 162, 81, 0, 1296, 1297, 5, 116, 0, 0, 1297, 1298, 5, 143, 0, 0, 1298, 1299, 3, 160, 80, 0, 1299, 1300, 5, 144, 0, 0, 1300, 1338, 1, 0, 0, 0, 1301, 1302, 5, 117, 0, 0, 1302, 1303, 5, 143, 0, 0, 1303, 1305, 3, 160, 80, 0, 1304, 1306, 3, 28, 14, 0, 1305, 1304, 1, 0, 0, 0, 1305, 1306, 1, 0, 0, 0, 1306, 1307, 1, 0, 0, 0, 1307, 1308, 5, 144, 0, 0, 1308, 1338, 1, 0, 0, 0, 1309, 1310, 5, 39, 0, 0, 1310, 1311, 5, 143, 0, 0, 1311, 1312, 3, 160, 80, 0, 1312, 1313, 5, 144, 0, 0, 1313, 1338, 1, 0, 0, 0, 1314, 1315, 5, 118, 0, 0, 1315, 1316, 5, 143, 0, 0, 1316, 1317, 3, 144, 72, 0, 1317, 1318, 5, 144, 0, 0, 1318, 1338, 1, 0, 0, 0, 1319, 1320, 5, 119, 0, 0, 1320, 1321, 5, 143, 0, 0, 1321, 1322, 3, 144, 72, 0, 1322, 1323, 5, 144, 0, 0, 1323, 1338, 1, 0, 0, 0, 1324, 1325, 5, 120, 0, 0, 1325, 1329, 5, 137, 0, 0, 1326, 1328, 3, 146, 73, 0, 1327, 1326, 1, 0, 0, 0, 1328, 1331, 1, 0, 0, 0, 1329, 1327, 1, 0, 0, 0, 1329, 1330, 1, 0, 0, 0, 1330, 1332, 1, 0, 0, 0, 1331, 1329, 1, 0, 0, 0, 1332, 1338, 5, 138, 0, 0, 1333, 1335, 3, 160, 80, 0, 1334, 1336, 3, 28, 14, 0, 1335, 1334, 1, 0, 0, 0, 1335, 1336, 1, 0, 0, 0, 1336, 1338, 1, 0, 0, 0, 1337, 1291, 1, 0, 0, 0, 1337, 1292, 1, 0, 0, 0, 1337, 1293, 1, 0, 0, 0, 1337, 1294, 1, 0, 0, 0, 1337, 1296, 1, 0, 0, 0, 1337, 1301, 1, 0, 0, 0, 1337, 1309, 1, 0, 0, 0, 1337, 1314, 1, 0, 0, 0, 1337, 1319, 1, 0, 0, 0, 1337, 1324, 1, 0, 0, 0, 1337, 1333, 1, 0, 0, 0, 1338, 145, 1, 0, 0, 0, 1339, 1340, 3, 160, 80, 0, 1340, 1341, 5, 133, 0, 0, 1341, 1342, 3, 144, 72, 0, 1342, 1343, 5, 134, 0, 0, 1343, 147, 1, 0, 0, 0, 1344, 1345, 7, 6, 0, 0, 1345, 149, 1, 0, 0, 0, 1346, 1347, 7, 7, 0, 0, 1347, 151, 1, 0, 0, 0, 1348, 1357, 3, 162, 81, 0, 1349, 1357, 5, 147, 0, 0, 1350, 1357, 5, 148, 0, 0, 1351, 1357, 5, 129, 0, 0, 1352, 1357, 5, 130, 0, 0, 1353, 1357, 5, 131, 0, 0, 1354, 1357, 3, 154, 77, 0, 1355, 1357, 3, 158, 79, 0, 1356, 1348, 1, 0, 0, 0, 1356, 1349, 1, 0, 0, 0, 1356, 1350, 1, 0, 0, 0, 1356, 1351, 1, 0, 0, 0, 1356, 1352, 1, 0, 0, 0, 1356, 1353, 1, 0, 0, 0, 1356, 1354, 1, 0, 0, 0, 1356, 1355, 1, 0, 0, 0, 1357, 153, 1, 0, 0, 0, 1358, 1367, 5, 137, 0, 0, 1359, 1364, 3, 156, 78, 0, 1360, 1361, 5, 135, 0, 0, 1361, 1363, 3, 156, 78, 0, 1362, 1360, 1, 0, 0, 0, 1363, 1366, 1, 0, 0, 0, 1364, 1362, 1, 0, 0, 0, 1364, 1365, 1, 0, 0, 0, 1365, 1368, 1, 0, 0, 0, 1366, 1364, 1, 0, 0, 0, 1367, 1359, 1, 0, 0, 0, 1367, 1368, 1, 0, 0, 0, 1368, 1369, 1, 0, 0, 0, 1369, 1370, 5, 138, 0, 0, 1370, 155, 1, 0, 0, 0, 1371, 1372, 3, 162, 81, 0, 1372, 1373, 5, 133, 0, 0, 1373, 1374, 3, 152, 76, 0, 1374, 157, 1, 0, 0, 0, 1375, 1384, 5, 139, 0, 0, 1376, 1381, 3, 152, 76, 0, 1377, 1378, 5, 135, 0, 0, 1378, 1380, 3, 152, 76, 0, 1379, 1377, 1, 0, 0, 0, 1380, 1383, 1, 0, 0, 0, 1381, 1379, 1, 0, 0, 0, 1381, 1382, 1, 0, 0, 0, 1382, 1385, 1, 0, 0, 0, 1383, 1381, 1, 0, 0, 0, 1384, 1376, 1, 0, 0, 0, 1384, 1385, 1, 0, 0, 0, 1385, 1386, 1, 0, 0, 0, 1386, 1387, 5, 140, 0, 0, 1387, 159, 1, 0, 0, 0, 1388, 1389, 7, 8, 0, 0, 1389, 161, 1, 0, 0, 0, 1390, 1391, 5, 150, 0, 0, 1391, 163, 1, 0, 0, 0, 123, 176, 183, 204, 217, 229, 249, 257, 264, 270, 282, 285, 291, 302, 311, 321, 324, 326, 330, 338, 350, 355, 365, 375, 380, 395, 401, 413, 422, 430, 438, 451, 454, 464, 468, 474, 481, 487, 495, 503, 516, 523, 527, 532, 543, 549, 560, 586, 590, 596, 607, 616, 622, 627, 629, 660, 664, 670, 697, 707, 718, 721, 726, 729, 736, 745, 748, 751, 768, 777, 791, 812, 815, 818, 825, 833, 873, 876, 880, 902, 916, 924, 936, 950, 960, 978, 982, 985, 989, 992, 1001, 1005, 1009, 1015, 1027, 1042, 1062, 1071, 1103, 1123, 1143, 1153, 1156, 1159, 1161, 1175, 1199, 1215, 1224, 1234, 1247, 1262, 1274, 1278, 1287, 1305, 1329, 1335, 1337, 1356, 1364, 1367, 1381, 1384] \ No newline at end of file +[4, 1, 153, 1403, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 179, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 184, 8, 1, 10, 1, 12, 1, 187, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 205, 8, 3, 10, 3, 12, 3, 208, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 220, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 232, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 252, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 260, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 265, 8, 10, 10, 10, 12, 10, 268, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 273, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 283, 8, 10, 10, 10, 12, 10, 286, 9, 10, 3, 10, 288, 8, 10, 1, 10, 1, 10, 5, 10, 292, 8, 10, 10, 10, 12, 10, 295, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 303, 8, 11, 10, 11, 12, 11, 306, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 314, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 322, 8, 12, 10, 12, 12, 12, 325, 9, 12, 3, 12, 327, 8, 12, 3, 12, 329, 8, 12, 1, 13, 1, 13, 3, 13, 333, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 339, 8, 14, 10, 14, 12, 14, 342, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 353, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 358, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 368, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 378, 8, 18, 1, 18, 1, 18, 1, 19, 3, 19, 383, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 398, 8, 19, 1, 19, 1, 19, 1, 19, 1, 20, 3, 20, 404, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 414, 8, 20, 10, 20, 12, 20, 417, 9, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 425, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 433, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 441, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 454, 8, 21, 1, 22, 3, 22, 457, 8, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 467, 8, 22, 1, 22, 1, 22, 3, 22, 471, 8, 22, 1, 22, 1, 22, 5, 22, 475, 8, 22, 10, 22, 12, 22, 478, 9, 22, 1, 22, 1, 22, 1, 23, 1, 23, 3, 23, 484, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 490, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 498, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 506, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 519, 8, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 526, 8, 25, 1, 25, 1, 25, 3, 25, 530, 8, 25, 1, 26, 5, 26, 533, 8, 26, 10, 26, 12, 26, 536, 9, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 546, 8, 26, 1, 26, 1, 26, 5, 26, 550, 8, 26, 10, 26, 12, 26, 553, 9, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 563, 8, 27, 1, 28, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 3, 30, 589, 8, 30, 1, 30, 1, 30, 3, 30, 593, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 599, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 5, 30, 608, 8, 30, 10, 30, 12, 30, 611, 9, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 619, 8, 30, 1, 30, 1, 30, 5, 30, 623, 8, 30, 10, 30, 12, 30, 626, 9, 30, 1, 30, 1, 30, 3, 30, 630, 8, 30, 3, 30, 632, 8, 30, 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, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 661, 8, 32, 10, 32, 12, 32, 664, 9, 32, 1, 32, 3, 32, 667, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 673, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 700, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 3, 34, 710, 8, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 721, 8, 34, 1, 34, 3, 34, 724, 8, 34, 1, 34, 1, 34, 1, 34, 3, 34, 729, 8, 34, 1, 34, 3, 34, 732, 8, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 3, 35, 739, 8, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 748, 8, 35, 1, 35, 3, 35, 751, 8, 35, 1, 35, 3, 35, 754, 8, 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, 37, 1, 37, 1, 37, 3, 37, 771, 8, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 778, 8, 38, 10, 38, 12, 38, 781, 9, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 794, 8, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 813, 8, 42, 10, 42, 12, 42, 816, 9, 42, 3, 42, 818, 8, 42, 1, 42, 3, 42, 821, 8, 42, 1, 43, 1, 43, 1, 43, 5, 43, 826, 8, 43, 10, 43, 12, 43, 829, 9, 43, 1, 44, 1, 44, 1, 44, 5, 44, 834, 8, 44, 10, 44, 12, 44, 837, 9, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 876, 8, 45, 1, 45, 3, 45, 879, 8, 45, 1, 45, 1, 45, 3, 45, 883, 8, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 905, 8, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 919, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 5, 46, 925, 8, 46, 10, 46, 12, 46, 928, 9, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 3, 49, 939, 8, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 953, 8, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 963, 8, 51, 1, 52, 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, 53, 1, 53, 3, 53, 981, 8, 53, 1, 53, 1, 53, 3, 53, 985, 8, 53, 1, 53, 3, 53, 988, 8, 53, 1, 53, 1, 53, 3, 53, 992, 8, 53, 1, 53, 3, 53, 995, 8, 53, 1, 53, 1, 53, 1, 54, 1, 54, 3, 54, 1001, 8, 54, 1, 54, 1, 54, 3, 54, 1005, 8, 54, 1, 54, 1, 54, 1, 54, 3, 54, 1010, 8, 54, 1, 54, 1, 54, 3, 54, 1014, 8, 54, 1, 54, 1, 54, 3, 54, 1018, 8, 54, 1, 54, 1, 54, 5, 54, 1022, 8, 54, 10, 54, 12, 54, 1025, 9, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 1038, 8, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 5, 58, 1051, 8, 58, 10, 58, 12, 58, 1054, 9, 58, 1, 58, 1, 58, 1, 58, 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, 1073, 8, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 1080, 8, 60, 10, 60, 12, 60, 1083, 9, 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, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1114, 8, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1134, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1154, 8, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1164, 8, 66, 1, 66, 3, 66, 1167, 8, 66, 1, 66, 3, 66, 1170, 8, 66, 3, 66, 1172, 8, 66, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 5, 70, 1184, 8, 70, 10, 70, 12, 70, 1187, 9, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1210, 8, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1226, 8, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1235, 8, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1245, 8, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 5, 71, 1256, 8, 71, 10, 71, 12, 71, 1259, 9, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1273, 8, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1285, 8, 71, 1, 71, 1, 71, 3, 71, 1289, 8, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1298, 8, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1316, 8, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 5, 73, 1338, 8, 73, 10, 73, 12, 73, 1341, 9, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1346, 8, 73, 3, 73, 1348, 8, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 3, 77, 1367, 8, 77, 1, 78, 1, 78, 1, 78, 1, 78, 5, 78, 1373, 8, 78, 10, 78, 12, 78, 1376, 9, 78, 3, 78, 1378, 8, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 5, 80, 1390, 8, 80, 10, 80, 12, 80, 1393, 9, 80, 3, 80, 1395, 8, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 0, 0, 83, 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, 0, 9, 2, 0, 15, 15, 33, 33, 1, 0, 11, 12, 1, 0, 101, 105, 3, 0, 1, 1, 96, 100, 102, 103, 3, 0, 1, 1, 96, 97, 102, 103, 2, 0, 98, 100, 102, 103, 1, 0, 121, 128, 1, 0, 108, 111, 9, 0, 1, 1, 4, 8, 10, 33, 40, 40, 45, 45, 74, 74, 94, 95, 106, 106, 149, 149, 1519, 0, 178, 1, 0, 0, 0, 2, 180, 1, 0, 0, 0, 4, 190, 1, 0, 0, 0, 6, 194, 1, 0, 0, 0, 8, 219, 1, 0, 0, 0, 10, 231, 1, 0, 0, 0, 12, 233, 1, 0, 0, 0, 14, 240, 1, 0, 0, 0, 16, 251, 1, 0, 0, 0, 18, 253, 1, 0, 0, 0, 20, 266, 1, 0, 0, 0, 22, 298, 1, 0, 0, 0, 24, 328, 1, 0, 0, 0, 26, 330, 1, 0, 0, 0, 28, 334, 1, 0, 0, 0, 30, 352, 1, 0, 0, 0, 32, 354, 1, 0, 0, 0, 34, 367, 1, 0, 0, 0, 36, 369, 1, 0, 0, 0, 38, 382, 1, 0, 0, 0, 40, 403, 1, 0, 0, 0, 42, 453, 1, 0, 0, 0, 44, 456, 1, 0, 0, 0, 46, 481, 1, 0, 0, 0, 48, 518, 1, 0, 0, 0, 50, 529, 1, 0, 0, 0, 52, 534, 1, 0, 0, 0, 54, 562, 1, 0, 0, 0, 56, 564, 1, 0, 0, 0, 58, 574, 1, 0, 0, 0, 60, 586, 1, 0, 0, 0, 62, 633, 1, 0, 0, 0, 64, 699, 1, 0, 0, 0, 66, 701, 1, 0, 0, 0, 68, 706, 1, 0, 0, 0, 70, 735, 1, 0, 0, 0, 72, 757, 1, 0, 0, 0, 74, 770, 1, 0, 0, 0, 76, 772, 1, 0, 0, 0, 78, 784, 1, 0, 0, 0, 80, 797, 1, 0, 0, 0, 82, 800, 1, 0, 0, 0, 84, 820, 1, 0, 0, 0, 86, 822, 1, 0, 0, 0, 88, 830, 1, 0, 0, 0, 90, 918, 1, 0, 0, 0, 92, 920, 1, 0, 0, 0, 94, 931, 1, 0, 0, 0, 96, 933, 1, 0, 0, 0, 98, 938, 1, 0, 0, 0, 100, 940, 1, 0, 0, 0, 102, 962, 1, 0, 0, 0, 104, 964, 1, 0, 0, 0, 106, 973, 1, 0, 0, 0, 108, 998, 1, 0, 0, 0, 110, 1028, 1, 0, 0, 0, 112, 1037, 1, 0, 0, 0, 114, 1039, 1, 0, 0, 0, 116, 1047, 1, 0, 0, 0, 118, 1072, 1, 0, 0, 0, 120, 1074, 1, 0, 0, 0, 122, 1086, 1, 0, 0, 0, 124, 1093, 1, 0, 0, 0, 126, 1107, 1, 0, 0, 0, 128, 1117, 1, 0, 0, 0, 130, 1133, 1, 0, 0, 0, 132, 1171, 1, 0, 0, 0, 134, 1173, 1, 0, 0, 0, 136, 1176, 1, 0, 0, 0, 138, 1178, 1, 0, 0, 0, 140, 1180, 1, 0, 0, 0, 142, 1288, 1, 0, 0, 0, 144, 1290, 1, 0, 0, 0, 146, 1347, 1, 0, 0, 0, 148, 1349, 1, 0, 0, 0, 150, 1354, 1, 0, 0, 0, 152, 1356, 1, 0, 0, 0, 154, 1366, 1, 0, 0, 0, 156, 1368, 1, 0, 0, 0, 158, 1381, 1, 0, 0, 0, 160, 1385, 1, 0, 0, 0, 162, 1398, 1, 0, 0, 0, 164, 1400, 1, 0, 0, 0, 166, 167, 3, 6, 3, 0, 167, 168, 5, 0, 0, 1, 168, 179, 1, 0, 0, 0, 169, 170, 3, 20, 10, 0, 170, 171, 5, 0, 0, 1, 171, 179, 1, 0, 0, 0, 172, 173, 3, 52, 26, 0, 173, 174, 5, 0, 0, 1, 174, 179, 1, 0, 0, 0, 175, 176, 3, 2, 1, 0, 176, 177, 5, 0, 0, 1, 177, 179, 1, 0, 0, 0, 178, 166, 1, 0, 0, 0, 178, 169, 1, 0, 0, 0, 178, 172, 1, 0, 0, 0, 178, 175, 1, 0, 0, 0, 179, 1, 1, 0, 0, 0, 180, 181, 5, 40, 0, 0, 181, 185, 5, 137, 0, 0, 182, 184, 3, 8, 4, 0, 183, 182, 1, 0, 0, 0, 184, 187, 1, 0, 0, 0, 185, 183, 1, 0, 0, 0, 185, 186, 1, 0, 0, 0, 186, 188, 1, 0, 0, 0, 187, 185, 1, 0, 0, 0, 188, 189, 5, 138, 0, 0, 189, 3, 1, 0, 0, 0, 190, 191, 5, 41, 0, 0, 191, 192, 3, 164, 82, 0, 192, 193, 5, 134, 0, 0, 193, 5, 1, 0, 0, 0, 194, 195, 5, 9, 0, 0, 195, 196, 3, 162, 81, 0, 196, 197, 5, 84, 0, 0, 197, 198, 3, 164, 82, 0, 198, 199, 5, 77, 0, 0, 199, 200, 3, 164, 82, 0, 200, 201, 5, 76, 0, 0, 201, 202, 3, 164, 82, 0, 202, 206, 5, 137, 0, 0, 203, 205, 3, 8, 4, 0, 204, 203, 1, 0, 0, 0, 205, 208, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 206, 207, 1, 0, 0, 0, 207, 209, 1, 0, 0, 0, 208, 206, 1, 0, 0, 0, 209, 210, 5, 138, 0, 0, 210, 7, 1, 0, 0, 0, 211, 220, 3, 4, 2, 0, 212, 220, 3, 18, 9, 0, 213, 220, 3, 10, 5, 0, 214, 220, 3, 96, 48, 0, 215, 220, 3, 108, 54, 0, 216, 220, 3, 144, 72, 0, 217, 220, 3, 58, 29, 0, 218, 220, 3, 32, 16, 0, 219, 211, 1, 0, 0, 0, 219, 212, 1, 0, 0, 0, 219, 213, 1, 0, 0, 0, 219, 214, 1, 0, 0, 0, 219, 215, 1, 0, 0, 0, 219, 216, 1, 0, 0, 0, 219, 217, 1, 0, 0, 0, 219, 218, 1, 0, 0, 0, 220, 9, 1, 0, 0, 0, 221, 222, 5, 41, 0, 0, 222, 223, 5, 44, 0, 0, 223, 224, 3, 162, 81, 0, 224, 225, 5, 134, 0, 0, 225, 232, 1, 0, 0, 0, 226, 227, 5, 41, 0, 0, 227, 228, 5, 46, 0, 0, 228, 229, 3, 162, 81, 0, 229, 230, 5, 134, 0, 0, 230, 232, 1, 0, 0, 0, 231, 221, 1, 0, 0, 0, 231, 226, 1, 0, 0, 0, 232, 11, 1, 0, 0, 0, 233, 234, 5, 42, 0, 0, 234, 235, 5, 43, 0, 0, 235, 236, 3, 162, 81, 0, 236, 237, 5, 84, 0, 0, 237, 238, 3, 164, 82, 0, 238, 239, 5, 134, 0, 0, 239, 13, 1, 0, 0, 0, 240, 241, 5, 42, 0, 0, 241, 242, 5, 44, 0, 0, 242, 243, 3, 162, 81, 0, 243, 244, 5, 77, 0, 0, 244, 245, 3, 164, 82, 0, 245, 246, 5, 134, 0, 0, 246, 15, 1, 0, 0, 0, 247, 252, 3, 10, 5, 0, 248, 252, 3, 12, 6, 0, 249, 252, 3, 14, 7, 0, 250, 252, 3, 32, 16, 0, 251, 247, 1, 0, 0, 0, 251, 248, 1, 0, 0, 0, 251, 249, 1, 0, 0, 0, 251, 250, 1, 0, 0, 0, 252, 17, 1, 0, 0, 0, 253, 254, 5, 43, 0, 0, 254, 255, 3, 162, 81, 0, 255, 256, 5, 84, 0, 0, 256, 259, 3, 164, 82, 0, 257, 258, 5, 85, 0, 0, 258, 260, 3, 164, 82, 0, 259, 257, 1, 0, 0, 0, 259, 260, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 262, 5, 134, 0, 0, 262, 19, 1, 0, 0, 0, 263, 265, 3, 16, 8, 0, 264, 263, 1, 0, 0, 0, 265, 268, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 269, 1, 0, 0, 0, 268, 266, 1, 0, 0, 0, 269, 270, 5, 44, 0, 0, 270, 272, 3, 162, 81, 0, 271, 273, 3, 22, 11, 0, 272, 271, 1, 0, 0, 0, 272, 273, 1, 0, 0, 0, 273, 274, 1, 0, 0, 0, 274, 275, 5, 84, 0, 0, 275, 276, 3, 164, 82, 0, 276, 277, 5, 77, 0, 0, 277, 287, 3, 164, 82, 0, 278, 279, 5, 89, 0, 0, 279, 284, 3, 26, 13, 0, 280, 281, 5, 135, 0, 0, 281, 283, 3, 26, 13, 0, 282, 280, 1, 0, 0, 0, 283, 286, 1, 0, 0, 0, 284, 282, 1, 0, 0, 0, 284, 285, 1, 0, 0, 0, 285, 288, 1, 0, 0, 0, 286, 284, 1, 0, 0, 0, 287, 278, 1, 0, 0, 0, 287, 288, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 293, 5, 137, 0, 0, 290, 292, 3, 34, 17, 0, 291, 290, 1, 0, 0, 0, 292, 295, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 293, 294, 1, 0, 0, 0, 294, 296, 1, 0, 0, 0, 295, 293, 1, 0, 0, 0, 296, 297, 5, 138, 0, 0, 297, 21, 1, 0, 0, 0, 298, 299, 5, 143, 0, 0, 299, 304, 3, 24, 12, 0, 300, 301, 5, 135, 0, 0, 301, 303, 3, 24, 12, 0, 302, 300, 1, 0, 0, 0, 303, 306, 1, 0, 0, 0, 304, 302, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 307, 1, 0, 0, 0, 306, 304, 1, 0, 0, 0, 307, 308, 5, 144, 0, 0, 308, 23, 1, 0, 0, 0, 309, 310, 5, 47, 0, 0, 310, 313, 3, 162, 81, 0, 311, 312, 5, 133, 0, 0, 312, 314, 5, 37, 0, 0, 313, 311, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 329, 1, 0, 0, 0, 315, 316, 5, 36, 0, 0, 316, 326, 3, 162, 81, 0, 317, 318, 5, 38, 0, 0, 318, 323, 3, 26, 13, 0, 319, 320, 5, 145, 0, 0, 320, 322, 3, 26, 13, 0, 321, 319, 1, 0, 0, 0, 322, 325, 1, 0, 0, 0, 323, 321, 1, 0, 0, 0, 323, 324, 1, 0, 0, 0, 324, 327, 1, 0, 0, 0, 325, 323, 1, 0, 0, 0, 326, 317, 1, 0, 0, 0, 326, 327, 1, 0, 0, 0, 327, 329, 1, 0, 0, 0, 328, 309, 1, 0, 0, 0, 328, 315, 1, 0, 0, 0, 329, 25, 1, 0, 0, 0, 330, 332, 3, 162, 81, 0, 331, 333, 3, 28, 14, 0, 332, 331, 1, 0, 0, 0, 332, 333, 1, 0, 0, 0, 333, 27, 1, 0, 0, 0, 334, 335, 5, 143, 0, 0, 335, 340, 3, 30, 15, 0, 336, 337, 5, 135, 0, 0, 337, 339, 3, 30, 15, 0, 338, 336, 1, 0, 0, 0, 339, 342, 1, 0, 0, 0, 340, 338, 1, 0, 0, 0, 340, 341, 1, 0, 0, 0, 341, 343, 1, 0, 0, 0, 342, 340, 1, 0, 0, 0, 343, 344, 5, 144, 0, 0, 344, 29, 1, 0, 0, 0, 345, 346, 5, 43, 0, 0, 346, 353, 3, 162, 81, 0, 347, 348, 5, 44, 0, 0, 348, 353, 3, 26, 13, 0, 349, 350, 5, 36, 0, 0, 350, 353, 3, 162, 81, 0, 351, 353, 3, 146, 73, 0, 352, 345, 1, 0, 0, 0, 352, 347, 1, 0, 0, 0, 352, 349, 1, 0, 0, 0, 352, 351, 1, 0, 0, 0, 353, 31, 1, 0, 0, 0, 354, 355, 5, 35, 0, 0, 355, 357, 3, 162, 81, 0, 356, 358, 3, 22, 11, 0, 357, 356, 1, 0, 0, 0, 357, 358, 1, 0, 0, 0, 358, 359, 1, 0, 0, 0, 359, 360, 5, 146, 0, 0, 360, 361, 3, 146, 73, 0, 361, 362, 5, 134, 0, 0, 362, 33, 1, 0, 0, 0, 363, 368, 3, 40, 20, 0, 364, 368, 3, 44, 22, 0, 365, 368, 3, 38, 19, 0, 366, 368, 3, 36, 18, 0, 367, 363, 1, 0, 0, 0, 367, 364, 1, 0, 0, 0, 367, 365, 1, 0, 0, 0, 367, 366, 1, 0, 0, 0, 368, 35, 1, 0, 0, 0, 369, 370, 5, 2, 0, 0, 370, 371, 3, 162, 81, 0, 371, 372, 5, 84, 0, 0, 372, 373, 3, 164, 82, 0, 373, 374, 5, 3, 0, 0, 374, 377, 3, 164, 82, 0, 375, 376, 5, 5, 0, 0, 376, 378, 3, 50, 25, 0, 377, 375, 1, 0, 0, 0, 377, 378, 1, 0, 0, 0, 378, 379, 1, 0, 0, 0, 379, 380, 5, 134, 0, 0, 380, 37, 1, 0, 0, 0, 381, 383, 5, 57, 0, 0, 382, 381, 1, 0, 0, 0, 382, 383, 1, 0, 0, 0, 383, 384, 1, 0, 0, 0, 384, 385, 5, 49, 0, 0, 385, 386, 3, 162, 81, 0, 386, 387, 5, 84, 0, 0, 387, 388, 3, 164, 82, 0, 388, 389, 5, 133, 0, 0, 389, 390, 3, 146, 73, 0, 390, 391, 5, 132, 0, 0, 391, 392, 3, 146, 73, 0, 392, 393, 5, 137, 0, 0, 393, 394, 5, 101, 0, 0, 394, 395, 5, 84, 0, 0, 395, 397, 3, 164, 82, 0, 396, 398, 3, 74, 37, 0, 397, 396, 1, 0, 0, 0, 397, 398, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 400, 5, 134, 0, 0, 400, 401, 5, 138, 0, 0, 401, 39, 1, 0, 0, 0, 402, 404, 3, 46, 23, 0, 403, 402, 1, 0, 0, 0, 403, 404, 1, 0, 0, 0, 404, 405, 1, 0, 0, 0, 405, 406, 5, 47, 0, 0, 406, 407, 3, 162, 81, 0, 407, 408, 5, 84, 0, 0, 408, 409, 3, 164, 82, 0, 409, 410, 5, 133, 0, 0, 410, 411, 3, 146, 73, 0, 411, 415, 5, 137, 0, 0, 412, 414, 3, 42, 21, 0, 413, 412, 1, 0, 0, 0, 414, 417, 1, 0, 0, 0, 415, 413, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 418, 1, 0, 0, 0, 417, 415, 1, 0, 0, 0, 418, 419, 5, 138, 0, 0, 419, 41, 1, 0, 0, 0, 420, 421, 5, 91, 0, 0, 421, 422, 5, 84, 0, 0, 422, 424, 3, 164, 82, 0, 423, 425, 3, 74, 37, 0, 424, 423, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 427, 5, 134, 0, 0, 427, 454, 1, 0, 0, 0, 428, 429, 5, 92, 0, 0, 429, 430, 5, 84, 0, 0, 430, 432, 3, 164, 82, 0, 431, 433, 3, 74, 37, 0, 432, 431, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 434, 1, 0, 0, 0, 434, 435, 5, 134, 0, 0, 435, 454, 1, 0, 0, 0, 436, 437, 5, 1, 0, 0, 437, 438, 5, 84, 0, 0, 438, 440, 3, 164, 82, 0, 439, 441, 3, 74, 37, 0, 440, 439, 1, 0, 0, 0, 440, 441, 1, 0, 0, 0, 441, 442, 1, 0, 0, 0, 442, 443, 5, 134, 0, 0, 443, 454, 1, 0, 0, 0, 444, 445, 5, 93, 0, 0, 445, 446, 5, 94, 0, 0, 446, 447, 5, 84, 0, 0, 447, 448, 3, 164, 82, 0, 448, 449, 5, 95, 0, 0, 449, 450, 5, 84, 0, 0, 450, 451, 3, 164, 82, 0, 451, 452, 5, 134, 0, 0, 452, 454, 1, 0, 0, 0, 453, 420, 1, 0, 0, 0, 453, 428, 1, 0, 0, 0, 453, 436, 1, 0, 0, 0, 453, 444, 1, 0, 0, 0, 454, 43, 1, 0, 0, 0, 455, 457, 3, 46, 23, 0, 456, 455, 1, 0, 0, 0, 456, 457, 1, 0, 0, 0, 457, 458, 1, 0, 0, 0, 458, 459, 5, 48, 0, 0, 459, 460, 3, 162, 81, 0, 460, 461, 5, 84, 0, 0, 461, 462, 3, 164, 82, 0, 462, 463, 5, 133, 0, 0, 463, 464, 3, 152, 76, 0, 464, 466, 3, 50, 25, 0, 465, 467, 5, 112, 0, 0, 466, 465, 1, 0, 0, 0, 466, 467, 1, 0, 0, 0, 467, 470, 1, 0, 0, 0, 468, 469, 5, 82, 0, 0, 469, 471, 3, 164, 82, 0, 470, 468, 1, 0, 0, 0, 470, 471, 1, 0, 0, 0, 471, 472, 1, 0, 0, 0, 472, 476, 5, 137, 0, 0, 473, 475, 3, 48, 24, 0, 474, 473, 1, 0, 0, 0, 475, 478, 1, 0, 0, 0, 476, 474, 1, 0, 0, 0, 476, 477, 1, 0, 0, 0, 477, 479, 1, 0, 0, 0, 478, 476, 1, 0, 0, 0, 479, 480, 5, 138, 0, 0, 480, 45, 1, 0, 0, 0, 481, 483, 5, 32, 0, 0, 482, 484, 7, 0, 0, 0, 483, 482, 1, 0, 0, 0, 483, 484, 1, 0, 0, 0, 484, 47, 1, 0, 0, 0, 485, 486, 5, 98, 0, 0, 486, 487, 5, 84, 0, 0, 487, 489, 3, 164, 82, 0, 488, 490, 3, 74, 37, 0, 489, 488, 1, 0, 0, 0, 489, 490, 1, 0, 0, 0, 490, 491, 1, 0, 0, 0, 491, 492, 5, 134, 0, 0, 492, 519, 1, 0, 0, 0, 493, 494, 5, 99, 0, 0, 494, 495, 5, 84, 0, 0, 495, 497, 3, 164, 82, 0, 496, 498, 3, 74, 37, 0, 497, 496, 1, 0, 0, 0, 497, 498, 1, 0, 0, 0, 498, 499, 1, 0, 0, 0, 499, 500, 5, 134, 0, 0, 500, 519, 1, 0, 0, 0, 501, 502, 5, 100, 0, 0, 502, 503, 5, 84, 0, 0, 503, 505, 3, 164, 82, 0, 504, 506, 3, 74, 37, 0, 505, 504, 1, 0, 0, 0, 505, 506, 1, 0, 0, 0, 506, 507, 1, 0, 0, 0, 507, 508, 5, 134, 0, 0, 508, 519, 1, 0, 0, 0, 509, 510, 5, 93, 0, 0, 510, 511, 5, 94, 0, 0, 511, 512, 5, 84, 0, 0, 512, 513, 3, 164, 82, 0, 513, 514, 5, 95, 0, 0, 514, 515, 5, 84, 0, 0, 515, 516, 3, 164, 82, 0, 516, 517, 5, 134, 0, 0, 517, 519, 1, 0, 0, 0, 518, 485, 1, 0, 0, 0, 518, 493, 1, 0, 0, 0, 518, 501, 1, 0, 0, 0, 518, 509, 1, 0, 0, 0, 519, 49, 1, 0, 0, 0, 520, 521, 5, 43, 0, 0, 521, 530, 3, 162, 81, 0, 522, 523, 5, 44, 0, 0, 523, 525, 3, 162, 81, 0, 524, 526, 3, 28, 14, 0, 525, 524, 1, 0, 0, 0, 525, 526, 1, 0, 0, 0, 526, 530, 1, 0, 0, 0, 527, 528, 5, 36, 0, 0, 528, 530, 3, 162, 81, 0, 529, 520, 1, 0, 0, 0, 529, 522, 1, 0, 0, 0, 529, 527, 1, 0, 0, 0, 530, 51, 1, 0, 0, 0, 531, 533, 3, 16, 8, 0, 532, 531, 1, 0, 0, 0, 533, 536, 1, 0, 0, 0, 534, 532, 1, 0, 0, 0, 534, 535, 1, 0, 0, 0, 535, 537, 1, 0, 0, 0, 536, 534, 1, 0, 0, 0, 537, 538, 5, 46, 0, 0, 538, 539, 3, 162, 81, 0, 539, 540, 5, 84, 0, 0, 540, 541, 3, 164, 82, 0, 541, 542, 5, 77, 0, 0, 542, 545, 3, 164, 82, 0, 543, 544, 5, 78, 0, 0, 544, 546, 5, 147, 0, 0, 545, 543, 1, 0, 0, 0, 545, 546, 1, 0, 0, 0, 546, 547, 1, 0, 0, 0, 547, 551, 5, 137, 0, 0, 548, 550, 3, 54, 27, 0, 549, 548, 1, 0, 0, 0, 550, 553, 1, 0, 0, 0, 551, 549, 1, 0, 0, 0, 551, 552, 1, 0, 0, 0, 552, 554, 1, 0, 0, 0, 553, 551, 1, 0, 0, 0, 554, 555, 5, 138, 0, 0, 555, 53, 1, 0, 0, 0, 556, 563, 3, 68, 34, 0, 557, 563, 3, 70, 35, 0, 558, 563, 3, 78, 39, 0, 559, 563, 3, 60, 30, 0, 560, 563, 3, 62, 31, 0, 561, 563, 3, 56, 28, 0, 562, 556, 1, 0, 0, 0, 562, 557, 1, 0, 0, 0, 562, 558, 1, 0, 0, 0, 562, 559, 1, 0, 0, 0, 562, 560, 1, 0, 0, 0, 562, 561, 1, 0, 0, 0, 563, 55, 1, 0, 0, 0, 564, 565, 5, 2, 0, 0, 565, 566, 3, 162, 81, 0, 566, 567, 5, 84, 0, 0, 567, 568, 3, 164, 82, 0, 568, 569, 5, 38, 0, 0, 569, 570, 3, 26, 13, 0, 570, 571, 5, 136, 0, 0, 571, 572, 3, 162, 81, 0, 572, 573, 5, 134, 0, 0, 573, 57, 1, 0, 0, 0, 574, 575, 5, 4, 0, 0, 575, 576, 3, 162, 81, 0, 576, 577, 5, 84, 0, 0, 577, 578, 3, 164, 82, 0, 578, 579, 5, 6, 0, 0, 579, 580, 3, 26, 13, 0, 580, 581, 5, 65, 0, 0, 581, 582, 3, 162, 81, 0, 582, 583, 5, 136, 0, 0, 583, 584, 3, 162, 81, 0, 584, 585, 5, 134, 0, 0, 585, 59, 1, 0, 0, 0, 586, 588, 5, 22, 0, 0, 587, 589, 5, 40, 0, 0, 588, 587, 1, 0, 0, 0, 588, 589, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 590, 592, 3, 162, 81, 0, 591, 593, 3, 22, 11, 0, 592, 591, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 595, 5, 84, 0, 0, 595, 596, 3, 164, 82, 0, 596, 598, 5, 25, 0, 0, 597, 599, 5, 9, 0, 0, 598, 597, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 600, 1, 0, 0, 0, 600, 601, 3, 26, 13, 0, 601, 602, 5, 26, 0, 0, 602, 631, 3, 164, 82, 0, 603, 604, 5, 49, 0, 0, 604, 605, 3, 164, 82, 0, 605, 609, 5, 137, 0, 0, 606, 608, 3, 64, 32, 0, 607, 606, 1, 0, 0, 0, 608, 611, 1, 0, 0, 0, 609, 607, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 612, 1, 0, 0, 0, 611, 609, 1, 0, 0, 0, 612, 613, 5, 138, 0, 0, 613, 632, 1, 0, 0, 0, 614, 615, 5, 40, 0, 0, 615, 618, 3, 164, 82, 0, 616, 617, 5, 49, 0, 0, 617, 619, 3, 164, 82, 0, 618, 616, 1, 0, 0, 0, 618, 619, 1, 0, 0, 0, 619, 629, 1, 0, 0, 0, 620, 624, 5, 137, 0, 0, 621, 623, 3, 64, 32, 0, 622, 621, 1, 0, 0, 0, 623, 626, 1, 0, 0, 0, 624, 622, 1, 0, 0, 0, 624, 625, 1, 0, 0, 0, 625, 627, 1, 0, 0, 0, 626, 624, 1, 0, 0, 0, 627, 630, 5, 138, 0, 0, 628, 630, 5, 134, 0, 0, 629, 620, 1, 0, 0, 0, 629, 628, 1, 0, 0, 0, 630, 632, 1, 0, 0, 0, 631, 603, 1, 0, 0, 0, 631, 614, 1, 0, 0, 0, 632, 61, 1, 0, 0, 0, 633, 634, 5, 22, 0, 0, 634, 635, 3, 162, 81, 0, 635, 636, 5, 84, 0, 0, 636, 637, 3, 164, 82, 0, 637, 638, 5, 24, 0, 0, 638, 639, 3, 162, 81, 0, 639, 640, 3, 28, 14, 0, 640, 641, 5, 134, 0, 0, 641, 63, 1, 0, 0, 0, 642, 643, 5, 16, 0, 0, 643, 700, 5, 134, 0, 0, 644, 645, 5, 17, 0, 0, 645, 646, 5, 18, 0, 0, 646, 647, 3, 162, 81, 0, 647, 648, 5, 134, 0, 0, 648, 700, 1, 0, 0, 0, 649, 650, 5, 27, 0, 0, 650, 651, 3, 164, 82, 0, 651, 652, 5, 134, 0, 0, 652, 700, 1, 0, 0, 0, 653, 654, 5, 27, 0, 0, 654, 655, 3, 162, 81, 0, 655, 656, 5, 136, 0, 0, 656, 666, 3, 162, 81, 0, 657, 658, 5, 64, 0, 0, 658, 662, 5, 137, 0, 0, 659, 661, 3, 66, 33, 0, 660, 659, 1, 0, 0, 0, 661, 664, 1, 0, 0, 0, 662, 660, 1, 0, 0, 0, 662, 663, 1, 0, 0, 0, 663, 665, 1, 0, 0, 0, 664, 662, 1, 0, 0, 0, 665, 667, 5, 138, 0, 0, 666, 657, 1, 0, 0, 0, 666, 667, 1, 0, 0, 0, 667, 668, 1, 0, 0, 0, 668, 669, 5, 134, 0, 0, 669, 700, 1, 0, 0, 0, 670, 672, 5, 28, 0, 0, 671, 673, 5, 36, 0, 0, 672, 671, 1, 0, 0, 0, 672, 673, 1, 0, 0, 0, 673, 674, 1, 0, 0, 0, 674, 675, 3, 162, 81, 0, 675, 676, 5, 55, 0, 0, 676, 677, 3, 26, 13, 0, 677, 678, 5, 134, 0, 0, 678, 700, 1, 0, 0, 0, 679, 680, 5, 29, 0, 0, 680, 681, 3, 162, 81, 0, 681, 682, 5, 147, 0, 0, 682, 683, 5, 134, 0, 0, 683, 700, 1, 0, 0, 0, 684, 685, 5, 30, 0, 0, 685, 686, 3, 26, 13, 0, 686, 687, 5, 136, 0, 0, 687, 688, 3, 162, 81, 0, 688, 689, 3, 162, 81, 0, 689, 690, 3, 164, 82, 0, 690, 691, 5, 134, 0, 0, 691, 700, 1, 0, 0, 0, 692, 693, 5, 93, 0, 0, 693, 700, 5, 134, 0, 0, 694, 695, 5, 31, 0, 0, 695, 696, 5, 147, 0, 0, 696, 697, 3, 164, 82, 0, 697, 698, 5, 134, 0, 0, 698, 700, 1, 0, 0, 0, 699, 642, 1, 0, 0, 0, 699, 644, 1, 0, 0, 0, 699, 649, 1, 0, 0, 0, 699, 653, 1, 0, 0, 0, 699, 670, 1, 0, 0, 0, 699, 679, 1, 0, 0, 0, 699, 684, 1, 0, 0, 0, 699, 692, 1, 0, 0, 0, 699, 694, 1, 0, 0, 0, 700, 65, 1, 0, 0, 0, 701, 702, 3, 162, 81, 0, 702, 703, 5, 58, 0, 0, 703, 704, 3, 162, 81, 0, 704, 705, 5, 134, 0, 0, 705, 67, 1, 0, 0, 0, 706, 707, 5, 49, 0, 0, 707, 709, 3, 162, 81, 0, 708, 710, 3, 22, 11, 0, 709, 708, 1, 0, 0, 0, 709, 710, 1, 0, 0, 0, 710, 711, 1, 0, 0, 0, 711, 712, 5, 84, 0, 0, 712, 713, 3, 164, 82, 0, 713, 714, 5, 133, 0, 0, 714, 715, 3, 146, 73, 0, 715, 716, 5, 132, 0, 0, 716, 717, 3, 146, 73, 0, 717, 718, 5, 86, 0, 0, 718, 720, 3, 82, 41, 0, 719, 721, 3, 74, 37, 0, 720, 719, 1, 0, 0, 0, 720, 721, 1, 0, 0, 0, 721, 723, 1, 0, 0, 0, 722, 724, 3, 80, 40, 0, 723, 722, 1, 0, 0, 0, 723, 724, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 726, 5, 88, 0, 0, 726, 728, 3, 84, 42, 0, 727, 729, 3, 88, 44, 0, 728, 727, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 731, 1, 0, 0, 0, 730, 732, 3, 72, 36, 0, 731, 730, 1, 0, 0, 0, 731, 732, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 734, 5, 134, 0, 0, 734, 69, 1, 0, 0, 0, 735, 736, 5, 50, 0, 0, 736, 738, 3, 162, 81, 0, 737, 739, 3, 22, 11, 0, 738, 737, 1, 0, 0, 0, 738, 739, 1, 0, 0, 0, 739, 740, 1, 0, 0, 0, 740, 741, 5, 84, 0, 0, 741, 742, 3, 164, 82, 0, 742, 743, 5, 133, 0, 0, 743, 744, 3, 146, 73, 0, 744, 745, 5, 132, 0, 0, 745, 747, 3, 146, 73, 0, 746, 748, 3, 74, 37, 0, 747, 746, 1, 0, 0, 0, 747, 748, 1, 0, 0, 0, 748, 750, 1, 0, 0, 0, 749, 751, 3, 88, 44, 0, 750, 749, 1, 0, 0, 0, 750, 751, 1, 0, 0, 0, 751, 753, 1, 0, 0, 0, 752, 754, 3, 72, 36, 0, 753, 752, 1, 0, 0, 0, 753, 754, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 756, 5, 134, 0, 0, 756, 71, 1, 0, 0, 0, 757, 758, 5, 66, 0, 0, 758, 759, 5, 65, 0, 0, 759, 760, 3, 162, 81, 0, 760, 73, 1, 0, 0, 0, 761, 762, 5, 10, 0, 0, 762, 771, 5, 13, 0, 0, 763, 764, 5, 10, 0, 0, 764, 765, 7, 1, 0, 0, 765, 766, 5, 14, 0, 0, 766, 767, 5, 139, 0, 0, 767, 768, 3, 86, 43, 0, 768, 769, 5, 140, 0, 0, 769, 771, 1, 0, 0, 0, 770, 761, 1, 0, 0, 0, 770, 763, 1, 0, 0, 0, 771, 75, 1, 0, 0, 0, 772, 773, 5, 65, 0, 0, 773, 774, 5, 139, 0, 0, 774, 779, 3, 128, 64, 0, 775, 776, 5, 135, 0, 0, 776, 778, 3, 128, 64, 0, 777, 775, 1, 0, 0, 0, 778, 781, 1, 0, 0, 0, 779, 777, 1, 0, 0, 0, 779, 780, 1, 0, 0, 0, 780, 782, 1, 0, 0, 0, 781, 779, 1, 0, 0, 0, 782, 783, 5, 140, 0, 0, 783, 77, 1, 0, 0, 0, 784, 785, 5, 51, 0, 0, 785, 786, 3, 162, 81, 0, 786, 787, 5, 84, 0, 0, 787, 788, 3, 164, 82, 0, 788, 789, 5, 52, 0, 0, 789, 790, 3, 162, 81, 0, 790, 791, 5, 133, 0, 0, 791, 793, 3, 146, 73, 0, 792, 794, 3, 88, 44, 0, 793, 792, 1, 0, 0, 0, 793, 794, 1, 0, 0, 0, 794, 795, 1, 0, 0, 0, 795, 796, 5, 134, 0, 0, 796, 79, 1, 0, 0, 0, 797, 798, 5, 87, 0, 0, 798, 799, 3, 146, 73, 0, 799, 81, 1, 0, 0, 0, 800, 801, 7, 2, 0, 0, 801, 83, 1, 0, 0, 0, 802, 821, 5, 90, 0, 0, 803, 804, 5, 43, 0, 0, 804, 821, 3, 162, 81, 0, 805, 806, 5, 36, 0, 0, 806, 821, 3, 162, 81, 0, 807, 808, 5, 45, 0, 0, 808, 817, 5, 139, 0, 0, 809, 814, 3, 26, 13, 0, 810, 811, 5, 135, 0, 0, 811, 813, 3, 26, 13, 0, 812, 810, 1, 0, 0, 0, 813, 816, 1, 0, 0, 0, 814, 812, 1, 0, 0, 0, 814, 815, 1, 0, 0, 0, 815, 818, 1, 0, 0, 0, 816, 814, 1, 0, 0, 0, 817, 809, 1, 0, 0, 0, 817, 818, 1, 0, 0, 0, 818, 819, 1, 0, 0, 0, 819, 821, 5, 140, 0, 0, 820, 802, 1, 0, 0, 0, 820, 803, 1, 0, 0, 0, 820, 805, 1, 0, 0, 0, 820, 807, 1, 0, 0, 0, 821, 85, 1, 0, 0, 0, 822, 827, 3, 162, 81, 0, 823, 824, 5, 135, 0, 0, 824, 826, 3, 162, 81, 0, 825, 823, 1, 0, 0, 0, 826, 829, 1, 0, 0, 0, 827, 825, 1, 0, 0, 0, 827, 828, 1, 0, 0, 0, 828, 87, 1, 0, 0, 0, 829, 827, 1, 0, 0, 0, 830, 831, 5, 89, 0, 0, 831, 835, 5, 137, 0, 0, 832, 834, 3, 90, 45, 0, 833, 832, 1, 0, 0, 0, 834, 837, 1, 0, 0, 0, 835, 833, 1, 0, 0, 0, 835, 836, 1, 0, 0, 0, 836, 838, 1, 0, 0, 0, 837, 835, 1, 0, 0, 0, 838, 839, 5, 138, 0, 0, 839, 89, 1, 0, 0, 0, 840, 841, 5, 23, 0, 0, 841, 842, 3, 162, 81, 0, 842, 843, 5, 84, 0, 0, 843, 844, 3, 164, 82, 0, 844, 845, 5, 139, 0, 0, 845, 846, 3, 86, 43, 0, 846, 847, 5, 140, 0, 0, 847, 848, 5, 134, 0, 0, 848, 919, 1, 0, 0, 0, 849, 850, 5, 61, 0, 0, 850, 851, 3, 162, 81, 0, 851, 852, 5, 84, 0, 0, 852, 853, 3, 164, 82, 0, 853, 854, 5, 133, 0, 0, 854, 855, 3, 146, 73, 0, 855, 856, 3, 92, 46, 0, 856, 857, 5, 134, 0, 0, 857, 919, 1, 0, 0, 0, 858, 859, 5, 62, 0, 0, 859, 860, 3, 162, 81, 0, 860, 861, 5, 84, 0, 0, 861, 862, 3, 164, 82, 0, 862, 863, 5, 133, 0, 0, 863, 864, 3, 152, 76, 0, 864, 865, 3, 50, 25, 0, 865, 866, 3, 92, 46, 0, 866, 867, 5, 134, 0, 0, 867, 919, 1, 0, 0, 0, 868, 869, 5, 44, 0, 0, 869, 870, 3, 162, 81, 0, 870, 871, 5, 84, 0, 0, 871, 872, 3, 164, 82, 0, 872, 873, 5, 133, 0, 0, 873, 875, 3, 162, 81, 0, 874, 876, 3, 28, 14, 0, 875, 874, 1, 0, 0, 0, 875, 876, 1, 0, 0, 0, 876, 878, 1, 0, 0, 0, 877, 879, 3, 76, 38, 0, 878, 877, 1, 0, 0, 0, 878, 879, 1, 0, 0, 0, 879, 882, 1, 0, 0, 0, 880, 881, 5, 18, 0, 0, 881, 883, 5, 53, 0, 0, 882, 880, 1, 0, 0, 0, 882, 883, 1, 0, 0, 0, 883, 884, 1, 0, 0, 0, 884, 885, 5, 134, 0, 0, 885, 919, 1, 0, 0, 0, 886, 887, 5, 7, 0, 0, 887, 888, 3, 162, 81, 0, 888, 889, 5, 84, 0, 0, 889, 890, 3, 164, 82, 0, 890, 891, 5, 133, 0, 0, 891, 892, 3, 162, 81, 0, 892, 893, 5, 53, 0, 0, 893, 894, 3, 146, 73, 0, 894, 895, 5, 134, 0, 0, 895, 919, 1, 0, 0, 0, 896, 897, 5, 51, 0, 0, 897, 898, 3, 162, 81, 0, 898, 899, 5, 84, 0, 0, 899, 900, 3, 164, 82, 0, 900, 901, 5, 133, 0, 0, 901, 904, 3, 162, 81, 0, 902, 903, 5, 53, 0, 0, 903, 905, 3, 146, 73, 0, 904, 902, 1, 0, 0, 0, 904, 905, 1, 0, 0, 0, 905, 906, 1, 0, 0, 0, 906, 907, 5, 134, 0, 0, 907, 919, 1, 0, 0, 0, 908, 909, 5, 22, 0, 0, 909, 910, 3, 162, 81, 0, 910, 911, 5, 84, 0, 0, 911, 912, 3, 164, 82, 0, 912, 913, 5, 133, 0, 0, 913, 914, 3, 162, 81, 0, 914, 915, 5, 136, 0, 0, 915, 916, 3, 162, 81, 0, 916, 917, 5, 134, 0, 0, 917, 919, 1, 0, 0, 0, 918, 840, 1, 0, 0, 0, 918, 849, 1, 0, 0, 0, 918, 858, 1, 0, 0, 0, 918, 868, 1, 0, 0, 0, 918, 886, 1, 0, 0, 0, 918, 896, 1, 0, 0, 0, 918, 908, 1, 0, 0, 0, 919, 91, 1, 0, 0, 0, 920, 921, 5, 139, 0, 0, 921, 926, 3, 94, 47, 0, 922, 923, 5, 135, 0, 0, 923, 925, 3, 94, 47, 0, 924, 922, 1, 0, 0, 0, 925, 928, 1, 0, 0, 0, 926, 924, 1, 0, 0, 0, 926, 927, 1, 0, 0, 0, 927, 929, 1, 0, 0, 0, 928, 926, 1, 0, 0, 0, 929, 930, 5, 140, 0, 0, 930, 93, 1, 0, 0, 0, 931, 932, 7, 3, 0, 0, 932, 95, 1, 0, 0, 0, 933, 934, 5, 60, 0, 0, 934, 935, 3, 98, 49, 0, 935, 97, 1, 0, 0, 0, 936, 939, 3, 100, 50, 0, 937, 939, 3, 104, 52, 0, 938, 936, 1, 0, 0, 0, 938, 937, 1, 0, 0, 0, 939, 99, 1, 0, 0, 0, 940, 941, 5, 61, 0, 0, 941, 942, 3, 162, 81, 0, 942, 943, 5, 84, 0, 0, 943, 944, 3, 164, 82, 0, 944, 945, 5, 71, 0, 0, 945, 946, 3, 162, 81, 0, 946, 947, 5, 133, 0, 0, 947, 948, 3, 146, 73, 0, 948, 949, 5, 72, 0, 0, 949, 952, 3, 102, 51, 0, 950, 951, 5, 73, 0, 0, 951, 953, 3, 154, 77, 0, 952, 950, 1, 0, 0, 0, 952, 953, 1, 0, 0, 0, 953, 954, 1, 0, 0, 0, 954, 955, 5, 134, 0, 0, 955, 101, 1, 0, 0, 0, 956, 963, 5, 106, 0, 0, 957, 958, 5, 107, 0, 0, 958, 959, 5, 141, 0, 0, 959, 960, 3, 146, 73, 0, 960, 961, 5, 142, 0, 0, 961, 963, 1, 0, 0, 0, 962, 956, 1, 0, 0, 0, 962, 957, 1, 0, 0, 0, 963, 103, 1, 0, 0, 0, 964, 965, 5, 62, 0, 0, 965, 966, 3, 162, 81, 0, 966, 967, 5, 84, 0, 0, 967, 968, 3, 164, 82, 0, 968, 969, 5, 137, 0, 0, 969, 970, 3, 106, 53, 0, 970, 971, 3, 106, 53, 0, 971, 972, 5, 138, 0, 0, 972, 105, 1, 0, 0, 0, 973, 974, 3, 50, 25, 0, 974, 975, 5, 63, 0, 0, 975, 976, 3, 162, 81, 0, 976, 977, 5, 84, 0, 0, 977, 978, 3, 164, 82, 0, 978, 980, 3, 152, 76, 0, 979, 981, 5, 112, 0, 0, 980, 979, 1, 0, 0, 0, 980, 981, 1, 0, 0, 0, 981, 984, 1, 0, 0, 0, 982, 983, 5, 79, 0, 0, 983, 985, 3, 164, 82, 0, 984, 982, 1, 0, 0, 0, 984, 985, 1, 0, 0, 0, 985, 987, 1, 0, 0, 0, 986, 988, 5, 81, 0, 0, 987, 986, 1, 0, 0, 0, 987, 988, 1, 0, 0, 0, 988, 991, 1, 0, 0, 0, 989, 990, 5, 82, 0, 0, 990, 992, 3, 164, 82, 0, 991, 989, 1, 0, 0, 0, 991, 992, 1, 0, 0, 0, 992, 994, 1, 0, 0, 0, 993, 995, 5, 83, 0, 0, 994, 993, 1, 0, 0, 0, 994, 995, 1, 0, 0, 0, 995, 996, 1, 0, 0, 0, 996, 997, 5, 134, 0, 0, 997, 107, 1, 0, 0, 0, 998, 1000, 5, 54, 0, 0, 999, 1001, 3, 22, 11, 0, 1000, 999, 1, 0, 0, 0, 1000, 1001, 1, 0, 0, 0, 1001, 1002, 1, 0, 0, 0, 1002, 1004, 3, 162, 81, 0, 1003, 1005, 3, 110, 55, 0, 1004, 1003, 1, 0, 0, 0, 1004, 1005, 1, 0, 0, 0, 1005, 1006, 1, 0, 0, 0, 1006, 1007, 5, 55, 0, 0, 1007, 1009, 3, 162, 81, 0, 1008, 1010, 3, 28, 14, 0, 1009, 1008, 1, 0, 0, 0, 1009, 1010, 1, 0, 0, 0, 1010, 1013, 1, 0, 0, 0, 1011, 1012, 5, 84, 0, 0, 1012, 1014, 3, 164, 82, 0, 1013, 1011, 1, 0, 0, 0, 1013, 1014, 1, 0, 0, 0, 1014, 1017, 1, 0, 0, 0, 1015, 1016, 5, 78, 0, 0, 1016, 1018, 5, 147, 0, 0, 1017, 1015, 1, 0, 0, 0, 1017, 1018, 1, 0, 0, 0, 1018, 1019, 1, 0, 0, 0, 1019, 1023, 5, 137, 0, 0, 1020, 1022, 3, 112, 56, 0, 1021, 1020, 1, 0, 0, 0, 1022, 1025, 1, 0, 0, 0, 1023, 1021, 1, 0, 0, 0, 1023, 1024, 1, 0, 0, 0, 1024, 1026, 1, 0, 0, 0, 1025, 1023, 1, 0, 0, 0, 1026, 1027, 5, 138, 0, 0, 1027, 109, 1, 0, 0, 0, 1028, 1029, 3, 28, 14, 0, 1029, 111, 1, 0, 0, 0, 1030, 1031, 5, 59, 0, 0, 1031, 1038, 3, 98, 49, 0, 1032, 1038, 3, 126, 63, 0, 1033, 1038, 3, 122, 61, 0, 1034, 1038, 3, 116, 58, 0, 1035, 1038, 3, 124, 62, 0, 1036, 1038, 3, 114, 57, 0, 1037, 1030, 1, 0, 0, 0, 1037, 1032, 1, 0, 0, 0, 1037, 1033, 1, 0, 0, 0, 1037, 1034, 1, 0, 0, 0, 1037, 1035, 1, 0, 0, 0, 1037, 1036, 1, 0, 0, 0, 1038, 113, 1, 0, 0, 0, 1039, 1040, 5, 56, 0, 0, 1040, 1041, 3, 162, 81, 0, 1041, 1042, 5, 58, 0, 0, 1042, 1043, 3, 162, 81, 0, 1043, 1044, 5, 136, 0, 0, 1044, 1045, 3, 162, 81, 0, 1045, 1046, 5, 134, 0, 0, 1046, 115, 1, 0, 0, 0, 1047, 1048, 5, 8, 0, 0, 1048, 1052, 5, 137, 0, 0, 1049, 1051, 3, 118, 59, 0, 1050, 1049, 1, 0, 0, 0, 1051, 1054, 1, 0, 0, 0, 1052, 1050, 1, 0, 0, 0, 1052, 1053, 1, 0, 0, 0, 1053, 1055, 1, 0, 0, 0, 1054, 1052, 1, 0, 0, 0, 1055, 1056, 5, 138, 0, 0, 1056, 1057, 5, 134, 0, 0, 1057, 117, 1, 0, 0, 0, 1058, 1059, 3, 162, 81, 0, 1059, 1060, 5, 58, 0, 0, 1060, 1061, 5, 61, 0, 0, 1061, 1062, 3, 162, 81, 0, 1062, 1063, 5, 134, 0, 0, 1063, 1073, 1, 0, 0, 0, 1064, 1065, 3, 162, 81, 0, 1065, 1066, 5, 58, 0, 0, 1066, 1067, 5, 62, 0, 0, 1067, 1068, 3, 162, 81, 0, 1068, 1069, 5, 136, 0, 0, 1069, 1070, 3, 162, 81, 0, 1070, 1071, 5, 134, 0, 0, 1071, 1073, 1, 0, 0, 0, 1072, 1058, 1, 0, 0, 0, 1072, 1064, 1, 0, 0, 0, 1073, 119, 1, 0, 0, 0, 1074, 1075, 3, 26, 13, 0, 1075, 1076, 5, 18, 0, 0, 1076, 1081, 5, 53, 0, 0, 1077, 1078, 5, 136, 0, 0, 1078, 1080, 3, 162, 81, 0, 1079, 1077, 1, 0, 0, 0, 1080, 1083, 1, 0, 0, 0, 1081, 1079, 1, 0, 0, 0, 1081, 1082, 1, 0, 0, 0, 1082, 1084, 1, 0, 0, 0, 1083, 1081, 1, 0, 0, 0, 1084, 1085, 5, 134, 0, 0, 1085, 121, 1, 0, 0, 0, 1086, 1087, 5, 56, 0, 0, 1087, 1088, 3, 162, 81, 0, 1088, 1089, 5, 58, 0, 0, 1089, 1090, 5, 61, 0, 0, 1090, 1091, 3, 162, 81, 0, 1091, 1092, 5, 134, 0, 0, 1092, 123, 1, 0, 0, 0, 1093, 1094, 5, 68, 0, 0, 1094, 1095, 3, 162, 81, 0, 1095, 1096, 5, 69, 0, 0, 1096, 1097, 5, 70, 0, 0, 1097, 1098, 5, 65, 0, 0, 1098, 1099, 5, 51, 0, 0, 1099, 1100, 3, 162, 81, 0, 1100, 1101, 5, 67, 0, 0, 1101, 1102, 5, 62, 0, 0, 1102, 1103, 3, 162, 81, 0, 1103, 1104, 5, 136, 0, 0, 1104, 1105, 3, 162, 81, 0, 1105, 1106, 5, 134, 0, 0, 1106, 125, 1, 0, 0, 0, 1107, 1108, 5, 56, 0, 0, 1108, 1109, 3, 128, 64, 0, 1109, 1110, 5, 58, 0, 0, 1110, 1113, 3, 132, 66, 0, 1111, 1112, 5, 34, 0, 0, 1112, 1114, 3, 164, 82, 0, 1113, 1111, 1, 0, 0, 0, 1113, 1114, 1, 0, 0, 0, 1114, 1115, 1, 0, 0, 0, 1115, 1116, 5, 134, 0, 0, 1116, 127, 1, 0, 0, 0, 1117, 1118, 3, 162, 81, 0, 1118, 1119, 5, 136, 0, 0, 1119, 1120, 3, 130, 65, 0, 1120, 129, 1, 0, 0, 0, 1121, 1134, 3, 162, 81, 0, 1122, 1134, 5, 101, 0, 0, 1123, 1134, 5, 91, 0, 0, 1124, 1134, 5, 92, 0, 0, 1125, 1134, 5, 1, 0, 0, 1126, 1134, 5, 98, 0, 0, 1127, 1134, 5, 99, 0, 0, 1128, 1134, 5, 100, 0, 0, 1129, 1134, 5, 102, 0, 0, 1130, 1134, 5, 103, 0, 0, 1131, 1134, 5, 104, 0, 0, 1132, 1134, 5, 105, 0, 0, 1133, 1121, 1, 0, 0, 0, 1133, 1122, 1, 0, 0, 0, 1133, 1123, 1, 0, 0, 0, 1133, 1124, 1, 0, 0, 0, 1133, 1125, 1, 0, 0, 0, 1133, 1126, 1, 0, 0, 0, 1133, 1127, 1, 0, 0, 0, 1133, 1128, 1, 0, 0, 0, 1133, 1129, 1, 0, 0, 0, 1133, 1130, 1, 0, 0, 0, 1133, 1131, 1, 0, 0, 0, 1133, 1132, 1, 0, 0, 0, 1134, 131, 1, 0, 0, 0, 1135, 1136, 5, 80, 0, 0, 1136, 1137, 5, 136, 0, 0, 1137, 1172, 3, 162, 81, 0, 1138, 1139, 5, 61, 0, 0, 1139, 1140, 3, 162, 81, 0, 1140, 1141, 5, 136, 0, 0, 1141, 1142, 3, 136, 68, 0, 1142, 1172, 1, 0, 0, 0, 1143, 1144, 5, 62, 0, 0, 1144, 1145, 3, 162, 81, 0, 1145, 1146, 5, 136, 0, 0, 1146, 1147, 3, 162, 81, 0, 1147, 1148, 5, 136, 0, 0, 1148, 1149, 3, 138, 69, 0, 1149, 1172, 1, 0, 0, 0, 1150, 1151, 5, 44, 0, 0, 1151, 1153, 3, 162, 81, 0, 1152, 1154, 3, 28, 14, 0, 1153, 1152, 1, 0, 0, 0, 1153, 1154, 1, 0, 0, 0, 1154, 1155, 1, 0, 0, 0, 1155, 1156, 5, 136, 0, 0, 1156, 1157, 3, 128, 64, 0, 1157, 1172, 1, 0, 0, 0, 1158, 1159, 5, 46, 0, 0, 1159, 1160, 3, 162, 81, 0, 1160, 1161, 5, 136, 0, 0, 1161, 1163, 3, 162, 81, 0, 1162, 1164, 3, 28, 14, 0, 1163, 1162, 1, 0, 0, 0, 1163, 1164, 1, 0, 0, 0, 1164, 1166, 1, 0, 0, 0, 1165, 1167, 3, 140, 70, 0, 1166, 1165, 1, 0, 0, 0, 1166, 1167, 1, 0, 0, 0, 1167, 1169, 1, 0, 0, 0, 1168, 1170, 3, 134, 67, 0, 1169, 1168, 1, 0, 0, 0, 1169, 1170, 1, 0, 0, 0, 1170, 1172, 1, 0, 0, 0, 1171, 1135, 1, 0, 0, 0, 1171, 1138, 1, 0, 0, 0, 1171, 1143, 1, 0, 0, 0, 1171, 1150, 1, 0, 0, 0, 1171, 1158, 1, 0, 0, 0, 1172, 133, 1, 0, 0, 0, 1173, 1174, 5, 66, 0, 0, 1174, 1175, 3, 140, 70, 0, 1175, 135, 1, 0, 0, 0, 1176, 1177, 7, 4, 0, 0, 1177, 137, 1, 0, 0, 0, 1178, 1179, 7, 5, 0, 0, 1179, 139, 1, 0, 0, 0, 1180, 1181, 5, 64, 0, 0, 1181, 1185, 5, 137, 0, 0, 1182, 1184, 3, 142, 71, 0, 1183, 1182, 1, 0, 0, 0, 1184, 1187, 1, 0, 0, 0, 1185, 1183, 1, 0, 0, 0, 1185, 1186, 1, 0, 0, 0, 1186, 1188, 1, 0, 0, 0, 1187, 1185, 1, 0, 0, 0, 1188, 1189, 5, 138, 0, 0, 1189, 141, 1, 0, 0, 0, 1190, 1191, 3, 162, 81, 0, 1191, 1192, 5, 58, 0, 0, 1192, 1193, 5, 9, 0, 0, 1193, 1194, 5, 23, 0, 0, 1194, 1195, 5, 139, 0, 0, 1195, 1196, 3, 86, 43, 0, 1196, 1197, 5, 140, 0, 0, 1197, 1198, 5, 134, 0, 0, 1198, 1289, 1, 0, 0, 0, 1199, 1200, 3, 162, 81, 0, 1200, 1201, 5, 58, 0, 0, 1201, 1202, 5, 61, 0, 0, 1202, 1209, 3, 162, 81, 0, 1203, 1204, 5, 67, 0, 0, 1204, 1205, 5, 62, 0, 0, 1205, 1206, 3, 162, 81, 0, 1206, 1207, 5, 136, 0, 0, 1207, 1208, 3, 162, 81, 0, 1208, 1210, 1, 0, 0, 0, 1209, 1203, 1, 0, 0, 0, 1209, 1210, 1, 0, 0, 0, 1210, 1211, 1, 0, 0, 0, 1211, 1212, 5, 134, 0, 0, 1212, 1289, 1, 0, 0, 0, 1213, 1214, 3, 162, 81, 0, 1214, 1215, 5, 58, 0, 0, 1215, 1216, 5, 62, 0, 0, 1216, 1217, 3, 162, 81, 0, 1217, 1218, 5, 136, 0, 0, 1218, 1225, 3, 162, 81, 0, 1219, 1220, 5, 67, 0, 0, 1220, 1221, 5, 62, 0, 0, 1221, 1222, 3, 162, 81, 0, 1222, 1223, 5, 136, 0, 0, 1223, 1224, 3, 162, 81, 0, 1224, 1226, 1, 0, 0, 0, 1225, 1219, 1, 0, 0, 0, 1225, 1226, 1, 0, 0, 0, 1226, 1227, 1, 0, 0, 0, 1227, 1228, 5, 134, 0, 0, 1228, 1289, 1, 0, 0, 0, 1229, 1230, 3, 162, 81, 0, 1230, 1231, 5, 58, 0, 0, 1231, 1232, 5, 44, 0, 0, 1232, 1234, 3, 162, 81, 0, 1233, 1235, 3, 28, 14, 0, 1234, 1233, 1, 0, 0, 0, 1234, 1235, 1, 0, 0, 0, 1235, 1244, 1, 0, 0, 0, 1236, 1237, 5, 67, 0, 0, 1237, 1238, 5, 62, 0, 0, 1238, 1239, 3, 162, 81, 0, 1239, 1240, 5, 136, 0, 0, 1240, 1241, 3, 162, 81, 0, 1241, 1245, 1, 0, 0, 0, 1242, 1243, 5, 18, 0, 0, 1243, 1245, 5, 53, 0, 0, 1244, 1236, 1, 0, 0, 0, 1244, 1242, 1, 0, 0, 0, 1244, 1245, 1, 0, 0, 0, 1245, 1246, 1, 0, 0, 0, 1246, 1247, 5, 134, 0, 0, 1247, 1289, 1, 0, 0, 0, 1248, 1249, 3, 162, 81, 0, 1249, 1250, 5, 58, 0, 0, 1250, 1251, 5, 7, 0, 0, 1251, 1252, 3, 162, 81, 0, 1252, 1253, 5, 64, 0, 0, 1253, 1257, 5, 137, 0, 0, 1254, 1256, 3, 120, 60, 0, 1255, 1254, 1, 0, 0, 0, 1256, 1259, 1, 0, 0, 0, 1257, 1255, 1, 0, 0, 0, 1257, 1258, 1, 0, 0, 0, 1258, 1260, 1, 0, 0, 0, 1259, 1257, 1, 0, 0, 0, 1260, 1261, 5, 138, 0, 0, 1261, 1262, 5, 134, 0, 0, 1262, 1289, 1, 0, 0, 0, 1263, 1264, 3, 162, 81, 0, 1264, 1265, 5, 58, 0, 0, 1265, 1266, 5, 51, 0, 0, 1266, 1267, 3, 162, 81, 0, 1267, 1268, 5, 134, 0, 0, 1268, 1289, 1, 0, 0, 0, 1269, 1270, 3, 162, 81, 0, 1270, 1272, 5, 58, 0, 0, 1271, 1273, 5, 9, 0, 0, 1272, 1271, 1, 0, 0, 0, 1272, 1273, 1, 0, 0, 0, 1273, 1274, 1, 0, 0, 0, 1274, 1275, 5, 22, 0, 0, 1275, 1276, 3, 162, 81, 0, 1276, 1277, 5, 136, 0, 0, 1277, 1284, 3, 162, 81, 0, 1278, 1279, 5, 67, 0, 0, 1279, 1280, 5, 62, 0, 0, 1280, 1281, 3, 162, 81, 0, 1281, 1282, 5, 136, 0, 0, 1282, 1283, 3, 162, 81, 0, 1283, 1285, 1, 0, 0, 0, 1284, 1278, 1, 0, 0, 0, 1284, 1285, 1, 0, 0, 0, 1285, 1286, 1, 0, 0, 0, 1286, 1287, 5, 134, 0, 0, 1287, 1289, 1, 0, 0, 0, 1288, 1190, 1, 0, 0, 0, 1288, 1199, 1, 0, 0, 0, 1288, 1213, 1, 0, 0, 0, 1288, 1229, 1, 0, 0, 0, 1288, 1248, 1, 0, 0, 0, 1288, 1263, 1, 0, 0, 0, 1288, 1269, 1, 0, 0, 0, 1289, 143, 1, 0, 0, 0, 1290, 1291, 5, 51, 0, 0, 1291, 1292, 3, 162, 81, 0, 1292, 1293, 5, 58, 0, 0, 1293, 1294, 3, 162, 81, 0, 1294, 1295, 5, 136, 0, 0, 1295, 1297, 3, 162, 81, 0, 1296, 1298, 3, 140, 70, 0, 1297, 1296, 1, 0, 0, 0, 1297, 1298, 1, 0, 0, 0, 1298, 1299, 1, 0, 0, 0, 1299, 1300, 5, 134, 0, 0, 1300, 145, 1, 0, 0, 0, 1301, 1348, 3, 150, 75, 0, 1302, 1348, 5, 113, 0, 0, 1303, 1348, 5, 114, 0, 0, 1304, 1305, 5, 115, 0, 0, 1305, 1348, 3, 164, 82, 0, 1306, 1307, 5, 116, 0, 0, 1307, 1308, 5, 143, 0, 0, 1308, 1309, 3, 162, 81, 0, 1309, 1310, 5, 144, 0, 0, 1310, 1348, 1, 0, 0, 0, 1311, 1312, 5, 117, 0, 0, 1312, 1313, 5, 143, 0, 0, 1313, 1315, 3, 162, 81, 0, 1314, 1316, 3, 28, 14, 0, 1315, 1314, 1, 0, 0, 0, 1315, 1316, 1, 0, 0, 0, 1316, 1317, 1, 0, 0, 0, 1317, 1318, 5, 144, 0, 0, 1318, 1348, 1, 0, 0, 0, 1319, 1320, 5, 39, 0, 0, 1320, 1321, 5, 143, 0, 0, 1321, 1322, 3, 162, 81, 0, 1322, 1323, 5, 144, 0, 0, 1323, 1348, 1, 0, 0, 0, 1324, 1325, 5, 118, 0, 0, 1325, 1326, 5, 143, 0, 0, 1326, 1327, 3, 146, 73, 0, 1327, 1328, 5, 144, 0, 0, 1328, 1348, 1, 0, 0, 0, 1329, 1330, 5, 119, 0, 0, 1330, 1331, 5, 143, 0, 0, 1331, 1332, 3, 146, 73, 0, 1332, 1333, 5, 144, 0, 0, 1333, 1348, 1, 0, 0, 0, 1334, 1335, 5, 120, 0, 0, 1335, 1339, 5, 137, 0, 0, 1336, 1338, 3, 148, 74, 0, 1337, 1336, 1, 0, 0, 0, 1338, 1341, 1, 0, 0, 0, 1339, 1337, 1, 0, 0, 0, 1339, 1340, 1, 0, 0, 0, 1340, 1342, 1, 0, 0, 0, 1341, 1339, 1, 0, 0, 0, 1342, 1348, 5, 138, 0, 0, 1343, 1345, 3, 162, 81, 0, 1344, 1346, 3, 28, 14, 0, 1345, 1344, 1, 0, 0, 0, 1345, 1346, 1, 0, 0, 0, 1346, 1348, 1, 0, 0, 0, 1347, 1301, 1, 0, 0, 0, 1347, 1302, 1, 0, 0, 0, 1347, 1303, 1, 0, 0, 0, 1347, 1304, 1, 0, 0, 0, 1347, 1306, 1, 0, 0, 0, 1347, 1311, 1, 0, 0, 0, 1347, 1319, 1, 0, 0, 0, 1347, 1324, 1, 0, 0, 0, 1347, 1329, 1, 0, 0, 0, 1347, 1334, 1, 0, 0, 0, 1347, 1343, 1, 0, 0, 0, 1348, 147, 1, 0, 0, 0, 1349, 1350, 3, 162, 81, 0, 1350, 1351, 5, 133, 0, 0, 1351, 1352, 3, 146, 73, 0, 1352, 1353, 5, 134, 0, 0, 1353, 149, 1, 0, 0, 0, 1354, 1355, 7, 6, 0, 0, 1355, 151, 1, 0, 0, 0, 1356, 1357, 7, 7, 0, 0, 1357, 153, 1, 0, 0, 0, 1358, 1367, 3, 164, 82, 0, 1359, 1367, 5, 147, 0, 0, 1360, 1367, 5, 148, 0, 0, 1361, 1367, 5, 129, 0, 0, 1362, 1367, 5, 130, 0, 0, 1363, 1367, 5, 131, 0, 0, 1364, 1367, 3, 156, 78, 0, 1365, 1367, 3, 160, 80, 0, 1366, 1358, 1, 0, 0, 0, 1366, 1359, 1, 0, 0, 0, 1366, 1360, 1, 0, 0, 0, 1366, 1361, 1, 0, 0, 0, 1366, 1362, 1, 0, 0, 0, 1366, 1363, 1, 0, 0, 0, 1366, 1364, 1, 0, 0, 0, 1366, 1365, 1, 0, 0, 0, 1367, 155, 1, 0, 0, 0, 1368, 1377, 5, 137, 0, 0, 1369, 1374, 3, 158, 79, 0, 1370, 1371, 5, 135, 0, 0, 1371, 1373, 3, 158, 79, 0, 1372, 1370, 1, 0, 0, 0, 1373, 1376, 1, 0, 0, 0, 1374, 1372, 1, 0, 0, 0, 1374, 1375, 1, 0, 0, 0, 1375, 1378, 1, 0, 0, 0, 1376, 1374, 1, 0, 0, 0, 1377, 1369, 1, 0, 0, 0, 1377, 1378, 1, 0, 0, 0, 1378, 1379, 1, 0, 0, 0, 1379, 1380, 5, 138, 0, 0, 1380, 157, 1, 0, 0, 0, 1381, 1382, 3, 164, 82, 0, 1382, 1383, 5, 133, 0, 0, 1383, 1384, 3, 154, 77, 0, 1384, 159, 1, 0, 0, 0, 1385, 1394, 5, 139, 0, 0, 1386, 1391, 3, 154, 77, 0, 1387, 1388, 5, 135, 0, 0, 1388, 1390, 3, 154, 77, 0, 1389, 1387, 1, 0, 0, 0, 1390, 1393, 1, 0, 0, 0, 1391, 1389, 1, 0, 0, 0, 1391, 1392, 1, 0, 0, 0, 1392, 1395, 1, 0, 0, 0, 1393, 1391, 1, 0, 0, 0, 1394, 1386, 1, 0, 0, 0, 1394, 1395, 1, 0, 0, 0, 1395, 1396, 1, 0, 0, 0, 1396, 1397, 5, 140, 0, 0, 1397, 161, 1, 0, 0, 0, 1398, 1399, 7, 8, 0, 0, 1399, 163, 1, 0, 0, 0, 1400, 1401, 5, 150, 0, 0, 1401, 165, 1, 0, 0, 0, 125, 178, 185, 206, 219, 231, 251, 259, 266, 272, 284, 287, 293, 304, 313, 323, 326, 328, 332, 340, 352, 357, 367, 377, 382, 397, 403, 415, 424, 432, 440, 453, 456, 466, 470, 476, 483, 489, 497, 505, 518, 525, 529, 534, 545, 551, 562, 588, 592, 598, 609, 618, 624, 629, 631, 662, 666, 672, 699, 709, 720, 723, 728, 731, 738, 747, 750, 753, 770, 779, 793, 814, 817, 820, 827, 835, 875, 878, 882, 904, 918, 926, 938, 952, 962, 980, 984, 987, 991, 994, 1000, 1004, 1009, 1013, 1017, 1023, 1037, 1052, 1072, 1081, 1113, 1133, 1153, 1163, 1166, 1169, 1171, 1185, 1209, 1225, 1234, 1244, 1257, 1272, 1284, 1288, 1297, 1315, 1339, 1345, 1347, 1366, 1374, 1377, 1391, 1394] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapabilityParser.ts b/src/capability-language/generated/QuixosCapabilityParser.ts index 21c08f0..629df05 100644 --- a/src/capability-language/generated/QuixosCapabilityParser.ts +++ b/src/capability-language/generated/QuixosCapabilityParser.ts @@ -218,33 +218,34 @@ export class QuixosCapabilityParser extends antlr.Parser { public static readonly RULE_edgeDecl = 52; public static readonly RULE_edgeEndpoint = 53; public static readonly RULE_conformanceDecl = 54; - public static readonly RULE_conformanceItem = 55; - public static readonly RULE_moduleBindingDecl = 56; - public static readonly RULE_initializationDecl = 57; - public static readonly RULE_initializationField = 58; - public static readonly RULE_creationOwnerMapping = 59; - public static readonly RULE_stateFieldBindingDecl = 60; - public static readonly RULE_relationshipMaterializationDecl = 61; - public static readonly RULE_operationBindingDecl = 62; - public static readonly RULE_memberOperationRef = 63; - public static readonly RULE_operationName = 64; - public static readonly RULE_operationProvider = 65; - public static readonly RULE_acceptanceBinding = 66; - public static readonly RULE_statePrimitive = 67; - public static readonly RULE_edgePrimitive = 68; - public static readonly RULE_dependencyBindingBlock = 69; - public static readonly RULE_dependencyBinding = 70; - public static readonly RULE_constructorBindingDecl = 71; - public static readonly RULE_valueType = 72; - public static readonly RULE_recordField = 73; - public static readonly RULE_scalarType = 74; - public static readonly RULE_cardinality = 75; - public static readonly RULE_jsonLiteral = 76; - public static readonly RULE_jsonObject = 77; - public static readonly RULE_jsonMember = 78; - public static readonly RULE_jsonArray = 79; - public static readonly RULE_identifier = 80; - public static readonly RULE_stringLiteral = 81; + public static readonly RULE_conformanceSourceArguments = 55; + public static readonly RULE_conformanceItem = 56; + public static readonly RULE_moduleBindingDecl = 57; + public static readonly RULE_initializationDecl = 58; + public static readonly RULE_initializationField = 59; + public static readonly RULE_creationOwnerMapping = 60; + public static readonly RULE_stateFieldBindingDecl = 61; + public static readonly RULE_relationshipMaterializationDecl = 62; + public static readonly RULE_operationBindingDecl = 63; + public static readonly RULE_memberOperationRef = 64; + public static readonly RULE_operationName = 65; + public static readonly RULE_operationProvider = 66; + public static readonly RULE_acceptanceBinding = 67; + public static readonly RULE_statePrimitive = 68; + public static readonly RULE_edgePrimitive = 69; + public static readonly RULE_dependencyBindingBlock = 70; + public static readonly RULE_dependencyBinding = 71; + public static readonly RULE_constructorBindingDecl = 72; + public static readonly RULE_valueType = 73; + public static readonly RULE_recordField = 74; + public static readonly RULE_scalarType = 75; + public static readonly RULE_cardinality = 76; + public static readonly RULE_jsonLiteral = 77; + public static readonly RULE_jsonObject = 78; + public static readonly RULE_jsonMember = 79; + public static readonly RULE_jsonArray = 80; + public static readonly RULE_identifier = 81; + public static readonly RULE_stringLiteral = 82; public static readonly literalNames = [ null, "'edit'", "'module'", "'contract'", "'presentation'", "'subject'", @@ -316,8 +317,8 @@ export class QuixosCapabilityParser extends antlr.Parser { "eventClause", "operationMode", "receiverRequirement", "identifierList", "dependencyBlock", "dependencyPort", "primitiveList", "primitive", "sharedAttachmentDecl", "attachmentDecl", "stateDecl", "storagePolicy", - "edgeDecl", "edgeEndpoint", "conformanceDecl", "conformanceItem", - "moduleBindingDecl", "initializationDecl", "initializationField", + "edgeDecl", "edgeEndpoint", "conformanceDecl", "conformanceSourceArguments", + "conformanceItem", "moduleBindingDecl", "initializationDecl", "initializationField", "creationOwnerMapping", "stateFieldBindingDecl", "relationshipMaterializationDecl", "operationBindingDecl", "memberOperationRef", "operationName", "operationProvider", "acceptanceBinding", "statePrimitive", "edgePrimitive", "dependencyBindingBlock", @@ -344,42 +345,42 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new DocumentContext(this.context, this.state); this.enterRule(localContext, 0, QuixosCapabilityParser.RULE_document); try { - this.state = 176; + this.state = 178; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 0, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 164; + this.state = 166; this.workspaceDecl(); - this.state = 165; + this.state = 167; this.match(QuixosCapabilityParser.EOF); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 167; + this.state = 169; this.interfaceResourceDecl(); - this.state = 168; + this.state = 170; this.match(QuixosCapabilityParser.EOF); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 170; + this.state = 172; this.packageResourceDecl(); - this.state = 171; + this.state = 173; this.match(QuixosCapabilityParser.EOF); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 173; + this.state = 175; this.fragmentDecl(); - this.state = 174; + this.state = 176; this.match(QuixosCapabilityParser.EOF); } break; @@ -405,25 +406,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 178; + this.state = 180; this.match(QuixosCapabilityParser.FRAGMENT); - this.state = 179; + this.state = 181; this.match(QuixosCapabilityParser.LBRACE); - this.state = 183; + this.state = 185; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 4 || ((((_la - 35)) & ~0x1F) === 0 && ((1 << (_la - 35)) & 34144577) !== 0)) { { { - this.state = 180; + this.state = 182; this.workspaceItem(); } } - this.state = 185; + this.state = 187; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 186; + this.state = 188; this.match(QuixosCapabilityParser.RBRACE); } } @@ -446,11 +447,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 188; - this.match(QuixosCapabilityParser.IMPORT); - this.state = 189; - this.stringLiteral(); this.state = 190; + this.match(QuixosCapabilityParser.IMPORT); + this.state = 191; + this.stringLiteral(); + this.state = 192; this.match(QuixosCapabilityParser.SEMI); } } @@ -474,39 +475,39 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 192; - this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 193; - this.identifier(); this.state = 194; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.WORKSPACE); this.state = 195; - this.stringLiteral(); + this.identifier(); this.state = 196; - this.match(QuixosCapabilityParser.REVISION); + this.match(QuixosCapabilityParser.ID); this.state = 197; this.stringLiteral(); this.state = 198; - this.match(QuixosCapabilityParser.COMMIT); + this.match(QuixosCapabilityParser.REVISION); this.state = 199; this.stringLiteral(); this.state = 200; + this.match(QuixosCapabilityParser.COMMIT); + this.state = 201; + this.stringLiteral(); + this.state = 202; this.match(QuixosCapabilityParser.LBRACE); - this.state = 204; + this.state = 206; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 4 || ((((_la - 35)) & ~0x1F) === 0 && ((1 << (_la - 35)) & 34144577) !== 0)) { { { - this.state = 201; + this.state = 203; this.workspaceItem(); } } - this.state = 206; + this.state = 208; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 207; + this.state = 209; this.match(QuixosCapabilityParser.RBRACE); } } @@ -527,62 +528,62 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new WorkspaceItemContext(this.context, this.state); this.enterRule(localContext, 8, QuixosCapabilityParser.RULE_workspaceItem); try { - this.state = 217; + this.state = 219; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 3, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 209; + this.state = 211; this.sourceImportDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 210; + this.state = 212; this.atomDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 211; + this.state = 213; this.resourceImportDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 212; + this.state = 214; this.sharedAttachmentDecl(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 213; + this.state = 215; this.conformanceDecl(); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 214; + this.state = 216; this.constructorBindingDecl(); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 215; + this.state = 217; this.presentationDecl(); } break; case 8: this.enterOuterAlt(localContext, 8); { - this.state = 216; + this.state = 218; this.typeAliasDecl(); } break; @@ -605,32 +606,32 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ResourceImportDeclContext(this.context, this.state); this.enterRule(localContext, 10, QuixosCapabilityParser.RULE_resourceImportDecl); try { - this.state = 229; + this.state = 231; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 4, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 219; - this.match(QuixosCapabilityParser.IMPORT); - this.state = 220; - this.match(QuixosCapabilityParser.INTERFACE); this.state = 221; - this.identifier(); + this.match(QuixosCapabilityParser.IMPORT); this.state = 222; + this.match(QuixosCapabilityParser.INTERFACE); + this.state = 223; + this.identifier(); + this.state = 224; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 224; - this.match(QuixosCapabilityParser.IMPORT); - this.state = 225; - this.match(QuixosCapabilityParser.PACKAGE); this.state = 226; - this.identifier(); + this.match(QuixosCapabilityParser.IMPORT); this.state = 227; + this.match(QuixosCapabilityParser.PACKAGE); + this.state = 228; + this.identifier(); + this.state = 229; this.match(QuixosCapabilityParser.SEMI); } break; @@ -655,17 +656,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 231; - this.match(QuixosCapabilityParser.EXTERNAL); - this.state = 232; - this.match(QuixosCapabilityParser.ATOM); this.state = 233; - this.identifier(); + this.match(QuixosCapabilityParser.EXTERNAL); this.state = 234; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.ATOM); this.state = 235; - this.stringLiteral(); + this.identifier(); this.state = 236; + this.match(QuixosCapabilityParser.ID); + this.state = 237; + this.stringLiteral(); + this.state = 238; this.match(QuixosCapabilityParser.SEMI); } } @@ -688,17 +689,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 238; - this.match(QuixosCapabilityParser.EXTERNAL); - this.state = 239; - this.match(QuixosCapabilityParser.INTERFACE); this.state = 240; - this.identifier(); + this.match(QuixosCapabilityParser.EXTERNAL); this.state = 241; - this.match(QuixosCapabilityParser.REVISION); + this.match(QuixosCapabilityParser.INTERFACE); this.state = 242; - this.stringLiteral(); + this.identifier(); this.state = 243; + this.match(QuixosCapabilityParser.REVISION); + this.state = 244; + this.stringLiteral(); + this.state = 245; this.match(QuixosCapabilityParser.SEMI); } } @@ -719,34 +720,34 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ResourcePreambleContext(this.context, this.state); this.enterRule(localContext, 16, QuixosCapabilityParser.RULE_resourcePreamble); try { - this.state = 249; + this.state = 251; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 5, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 245; + this.state = 247; this.resourceImportDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 246; + this.state = 248; this.externalAtomDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 247; + this.state = 249; this.externalInterfaceDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 248; + this.state = 250; this.typeAliasDecl(); } break; @@ -772,27 +773,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 251; - this.match(QuixosCapabilityParser.ATOM); - this.state = 252; - this.identifier(); this.state = 253; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.ATOM); this.state = 254; + this.identifier(); + this.state = 255; + this.match(QuixosCapabilityParser.ID); + this.state = 256; this.stringLiteral(); - this.state = 257; + this.state = 259; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 85) { { - this.state = 255; + this.state = 257; this.match(QuixosCapabilityParser.DOC); - this.state = 256; + this.state = 258; this.stringLiteral(); } } - this.state = 259; + this.state = 261; this.match(QuixosCapabilityParser.SEMI); } } @@ -816,87 +817,87 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 264; + this.state = 266; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (((((_la - 35)) & ~0x1F) === 0 && ((1 << (_la - 35)) & 193) !== 0)) { { { - this.state = 261; + this.state = 263; this.resourcePreamble(); } } - this.state = 266; + this.state = 268; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 267; + this.state = 269; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 268; - this.identifier(); this.state = 270; + this.identifier(); + this.state = 272; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 269; + this.state = 271; this.typeParameters(); } } - this.state = 272; - this.match(QuixosCapabilityParser.ID); - this.state = 273; - this.stringLiteral(); this.state = 274; - this.match(QuixosCapabilityParser.REVISION); + this.match(QuixosCapabilityParser.ID); this.state = 275; this.stringLiteral(); - this.state = 285; + this.state = 276; + this.match(QuixosCapabilityParser.REVISION); + this.state = 277; + this.stringLiteral(); + this.state = 287; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 89) { { - this.state = 276; + this.state = 278; this.match(QuixosCapabilityParser.REQUIRES); - this.state = 277; + this.state = 279; this.interfaceType(); - this.state = 282; + this.state = 284; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 278; + this.state = 280; this.match(QuixosCapabilityParser.COMMA); - this.state = 279; + this.state = 281; this.interfaceType(); } } - this.state = 284; + this.state = 286; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 287; + this.state = 289; this.match(QuixosCapabilityParser.LBRACE); - this.state = 291; + this.state = 293; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 2 || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33783809) !== 0)) { { { - this.state = 288; + this.state = 290; this.interfaceMember(); } } - this.state = 293; + this.state = 295; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 294; + this.state = 296; this.match(QuixosCapabilityParser.RBRACE); } } @@ -920,27 +921,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 296; + this.state = 298; this.match(QuixosCapabilityParser.LT); - this.state = 297; + this.state = 299; this.typeParameter(); - this.state = 302; + this.state = 304; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 298; + this.state = 300; this.match(QuixosCapabilityParser.COMMA); - this.state = 299; + this.state = 301; this.typeParameter(); } } - this.state = 304; + this.state = 306; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 305; + this.state = 307; this.match(QuixosCapabilityParser.GT); } } @@ -962,24 +963,24 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 24, QuixosCapabilityParser.RULE_typeParameter); let _la: number; try { - this.state = 326; + this.state = 328; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.VALUE: this.enterOuterAlt(localContext, 1); { - this.state = 307; + this.state = 309; this.match(QuixosCapabilityParser.VALUE); - this.state = 308; + this.state = 310; this.identifier(); - this.state = 311; + this.state = 313; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 133) { { - this.state = 309; + this.state = 311; this.match(QuixosCapabilityParser.COLON); - this.state = 310; + this.state = 312; this.match(QuixosCapabilityParser.STORABLE); } } @@ -989,32 +990,32 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 2); { - this.state = 313; + this.state = 315; this.match(QuixosCapabilityParser.OBJECT); - this.state = 314; + this.state = 316; this.identifier(); - this.state = 324; + this.state = 326; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 38) { { - this.state = 315; + this.state = 317; this.match(QuixosCapabilityParser.IMPLEMENTS); - this.state = 316; + this.state = 318; this.interfaceType(); - this.state = 321; + this.state = 323; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 145) { { { - this.state = 317; + this.state = 319; this.match(QuixosCapabilityParser.AMP); - this.state = 318; + this.state = 320; this.interfaceType(); } } - this.state = 323; + this.state = 325; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } @@ -1047,14 +1048,14 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 328; - this.identifier(); this.state = 330; + this.identifier(); + this.state = 332; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 329; + this.state = 331; this.typeArguments(); } } @@ -1081,27 +1082,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 332; + this.state = 334; this.match(QuixosCapabilityParser.LT); - this.state = 333; + this.state = 335; this.typeArgument(); - this.state = 338; + this.state = 340; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 334; + this.state = 336; this.match(QuixosCapabilityParser.COMMA); - this.state = 335; + this.state = 337; this.typeArgument(); } } - this.state = 340; + this.state = 342; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 341; + this.state = 343; this.match(QuixosCapabilityParser.GT); } } @@ -1122,33 +1123,33 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new TypeArgumentContext(this.context, this.state); this.enterRule(localContext, 30, QuixosCapabilityParser.RULE_typeArgument); try { - this.state = 350; + this.state = 352; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 1); { - this.state = 343; + this.state = 345; this.match(QuixosCapabilityParser.ATOM); - this.state = 344; + this.state = 346; this.identifier(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 2); { - this.state = 345; + this.state = 347; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 346; + this.state = 348; this.interfaceType(); } break; case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 347; + this.state = 349; this.match(QuixosCapabilityParser.OBJECT); - this.state = 348; + this.state = 350; this.identifier(); } break; @@ -1208,7 +1209,7 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 4); { - this.state = 349; + this.state = 351; this.valueType(); } break; @@ -1236,25 +1237,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 352; + this.state = 354; this.match(QuixosCapabilityParser.TYPE); - this.state = 353; - this.identifier(); this.state = 355; + this.identifier(); + this.state = 357; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 354; + this.state = 356; this.typeParameters(); } } - this.state = 357; - this.match(QuixosCapabilityParser.EQUAL); - this.state = 358; - this.valueType(); this.state = 359; + this.match(QuixosCapabilityParser.EQUAL); + this.state = 360; + this.valueType(); + this.state = 361; this.match(QuixosCapabilityParser.SEMI); } } @@ -1275,34 +1276,34 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new InterfaceMemberContext(this.context, this.state); this.enterRule(localContext, 34, QuixosCapabilityParser.RULE_interfaceMember); try { - this.state = 365; + this.state = 367; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 21, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 361; + this.state = 363; this.valueMember(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 362; + this.state = 364; this.relationshipMember(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 363; + this.state = 365; this.operationMember(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 364; + this.state = 366; this.moduleMember(); } break; @@ -1328,31 +1329,31 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 367; - this.match(QuixosCapabilityParser.MODULE); - this.state = 368; - this.identifier(); this.state = 369; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.MODULE); this.state = 370; - this.stringLiteral(); + this.identifier(); this.state = 371; - this.match(QuixosCapabilityParser.CONTRACT); + this.match(QuixosCapabilityParser.ID); this.state = 372; this.stringLiteral(); - this.state = 375; + this.state = 373; + this.match(QuixosCapabilityParser.CONTRACT); + this.state = 374; + this.stringLiteral(); + this.state = 377; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 5) { { - this.state = 373; + this.state = 375; this.match(QuixosCapabilityParser.SUBJECT); - this.state = 374; + this.state = 376; this.targetConstraint(); } } - this.state = 377; + this.state = 379; this.match(QuixosCapabilityParser.SEMI); } } @@ -1376,53 +1377,53 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 380; + this.state = 382; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 57) { { - this.state = 379; + this.state = 381; this.match(QuixosCapabilityParser.STATIC); } } - this.state = 382; - this.match(QuixosCapabilityParser.OPERATION); - this.state = 383; - this.identifier(); this.state = 384; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.OPERATION); this.state = 385; - this.stringLiteral(); + this.identifier(); this.state = 386; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.ID); this.state = 387; - this.valueType(); + this.stringLiteral(); this.state = 388; - this.match(QuixosCapabilityParser.ARROW); + this.match(QuixosCapabilityParser.COLON); this.state = 389; this.valueType(); this.state = 390; - this.match(QuixosCapabilityParser.LBRACE); + this.match(QuixosCapabilityParser.ARROW); this.state = 391; - this.match(QuixosCapabilityParser.CALL); + this.valueType(); this.state = 392; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.LBRACE); this.state = 393; - this.stringLiteral(); + this.match(QuixosCapabilityParser.CALL); + this.state = 394; + this.match(QuixosCapabilityParser.ID); this.state = 395; + this.stringLiteral(); + this.state = 397; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 394; + this.state = 396; this.executionClause(); } } - this.state = 397; + this.state = 399; this.match(QuixosCapabilityParser.SEMI); - this.state = 398; + this.state = 400; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1446,45 +1447,45 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 401; + this.state = 403; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 32) { { - this.state = 400; + this.state = 402; this.queryReadContract(); } } - this.state = 403; - this.match(QuixosCapabilityParser.VALUE); - this.state = 404; - this.identifier(); this.state = 405; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.VALUE); this.state = 406; - this.stringLiteral(); + this.identifier(); this.state = 407; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.ID); this.state = 408; - this.valueType(); + this.stringLiteral(); this.state = 409; + this.match(QuixosCapabilityParser.COLON); + this.state = 410; + this.valueType(); + this.state = 411; this.match(QuixosCapabilityParser.LBRACE); - this.state = 413; + this.state = 415; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 1 || ((((_la - 91)) & ~0x1F) === 0 && ((1 << (_la - 91)) & 7) !== 0)) { { { - this.state = 410; + this.state = 412; this.valueMemberOperation(); } } - this.state = 415; + this.state = 417; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 416; + this.state = 418; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1506,96 +1507,96 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 42, QuixosCapabilityParser.RULE_valueMemberOperation); let _la: number; try { - this.state = 451; + this.state = 453; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.GET: this.enterOuterAlt(localContext, 1); { - this.state = 418; - this.match(QuixosCapabilityParser.GET); - this.state = 419; - this.match(QuixosCapabilityParser.ID); this.state = 420; - this.stringLiteral(); + this.match(QuixosCapabilityParser.GET); + this.state = 421; + this.match(QuixosCapabilityParser.ID); this.state = 422; + this.stringLiteral(); + this.state = 424; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 421; + this.state = 423; this.executionClause(); } } - this.state = 424; + this.state = 426; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.SET: this.enterOuterAlt(localContext, 2); { - this.state = 426; - this.match(QuixosCapabilityParser.SET); - this.state = 427; - this.match(QuixosCapabilityParser.ID); this.state = 428; - this.stringLiteral(); + this.match(QuixosCapabilityParser.SET); + this.state = 429; + this.match(QuixosCapabilityParser.ID); this.state = 430; + this.stringLiteral(); + this.state = 432; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 429; + this.state = 431; this.executionClause(); } } - this.state = 432; + this.state = 434; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.EDIT: this.enterOuterAlt(localContext, 3); { - this.state = 434; - this.match(QuixosCapabilityParser.EDIT); - this.state = 435; - this.match(QuixosCapabilityParser.ID); this.state = 436; - this.stringLiteral(); + this.match(QuixosCapabilityParser.EDIT); + this.state = 437; + this.match(QuixosCapabilityParser.ID); this.state = 438; + this.stringLiteral(); + this.state = 440; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 437; + this.state = 439; this.executionClause(); } } - this.state = 440; + this.state = 442; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 4); { - this.state = 442; - this.match(QuixosCapabilityParser.WATCH); - this.state = 443; - this.match(QuixosCapabilityParser.START); this.state = 444; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.WATCH); this.state = 445; - this.stringLiteral(); + this.match(QuixosCapabilityParser.START); this.state = 446; - this.match(QuixosCapabilityParser.STOP); - this.state = 447; this.match(QuixosCapabilityParser.ID); - this.state = 448; + this.state = 447; this.stringLiteral(); + this.state = 448; + this.match(QuixosCapabilityParser.STOP); this.state = 449; + this.match(QuixosCapabilityParser.ID); + this.state = 450; + this.stringLiteral(); + this.state = 451; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1623,69 +1624,69 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 454; + this.state = 456; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 32) { { - this.state = 453; + this.state = 455; this.queryReadContract(); } } - this.state = 456; - this.match(QuixosCapabilityParser.RELATION); - this.state = 457; - this.identifier(); this.state = 458; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.RELATION); this.state = 459; - this.stringLiteral(); + this.identifier(); this.state = 460; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.ID); this.state = 461; - this.cardinality(); + this.stringLiteral(); this.state = 462; - this.targetConstraint(); + this.match(QuixosCapabilityParser.COLON); + this.state = 463; + this.cardinality(); this.state = 464; + this.targetConstraint(); + this.state = 466; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 112) { { - this.state = 463; + this.state = 465; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 468; + this.state = 470; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 82) { { - this.state = 466; + this.state = 468; this.match(QuixosCapabilityParser.KEYED); - this.state = 467; + this.state = 469; this.stringLiteral(); } } - this.state = 470; + this.state = 472; this.match(QuixosCapabilityParser.LBRACE); - this.state = 474; + this.state = 476; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (((((_la - 93)) & ~0x1F) === 0 && ((1 << (_la - 93)) & 225) !== 0)) { { { - this.state = 471; + this.state = 473; this.relationshipOperation(); } } - this.state = 476; + this.state = 478; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 477; + this.state = 479; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1709,14 +1710,14 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 479; - this.match(QuixosCapabilityParser.QUERYABLE); this.state = 481; + this.match(QuixosCapabilityParser.QUERYABLE); + this.state = 483; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 15 || _la === 33) { { - this.state = 480; + this.state = 482; _la = this.tokenStream.LA(1); if(!(_la === 15 || _la === 33)) { this.errorHandler.recoverInline(this); @@ -1748,96 +1749,96 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 48, QuixosCapabilityParser.RULE_relationshipOperation); let _la: number; try { - this.state = 516; + this.state = 518; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.RESOLVE: this.enterOuterAlt(localContext, 1); { - this.state = 483; - this.match(QuixosCapabilityParser.RESOLVE); - this.state = 484; - this.match(QuixosCapabilityParser.ID); this.state = 485; - this.stringLiteral(); + this.match(QuixosCapabilityParser.RESOLVE); + this.state = 486; + this.match(QuixosCapabilityParser.ID); this.state = 487; + this.stringLiteral(); + this.state = 489; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 486; + this.state = 488; this.executionClause(); } } - this.state = 489; + this.state = 491; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONNECT: this.enterOuterAlt(localContext, 2); { - this.state = 491; - this.match(QuixosCapabilityParser.CONNECT); - this.state = 492; - this.match(QuixosCapabilityParser.ID); this.state = 493; - this.stringLiteral(); + this.match(QuixosCapabilityParser.CONNECT); + this.state = 494; + this.match(QuixosCapabilityParser.ID); this.state = 495; + this.stringLiteral(); + this.state = 497; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 494; + this.state = 496; this.executionClause(); } } - this.state = 497; + this.state = 499; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.DISCONNECT: this.enterOuterAlt(localContext, 3); { - this.state = 499; - this.match(QuixosCapabilityParser.DISCONNECT); - this.state = 500; - this.match(QuixosCapabilityParser.ID); this.state = 501; - this.stringLiteral(); + this.match(QuixosCapabilityParser.DISCONNECT); + this.state = 502; + this.match(QuixosCapabilityParser.ID); this.state = 503; + this.stringLiteral(); + this.state = 505; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 502; + this.state = 504; this.executionClause(); } } - this.state = 505; + this.state = 507; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 4); { - this.state = 507; - this.match(QuixosCapabilityParser.WATCH); - this.state = 508; - this.match(QuixosCapabilityParser.START); this.state = 509; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.WATCH); this.state = 510; - this.stringLiteral(); + this.match(QuixosCapabilityParser.START); this.state = 511; - this.match(QuixosCapabilityParser.STOP); - this.state = 512; this.match(QuixosCapabilityParser.ID); - this.state = 513; + this.state = 512; this.stringLiteral(); + this.state = 513; + this.match(QuixosCapabilityParser.STOP); this.state = 514; + this.match(QuixosCapabilityParser.ID); + this.state = 515; + this.stringLiteral(); + this.state = 516; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1863,31 +1864,31 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 50, QuixosCapabilityParser.RULE_targetConstraint); let _la: number; try { - this.state = 527; + this.state = 529; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 1); { - this.state = 518; + this.state = 520; this.match(QuixosCapabilityParser.ATOM); - this.state = 519; + this.state = 521; this.identifier(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 2); { - this.state = 520; + this.state = 522; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 521; - this.identifier(); this.state = 523; + this.identifier(); + this.state = 525; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 522; + this.state = 524; this.typeArguments(); } } @@ -1897,9 +1898,9 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 525; + this.state = 527; this.match(QuixosCapabilityParser.OBJECT); - this.state = 526; + this.state = 528; this.identifier(); } break; @@ -1927,61 +1928,61 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 532; + this.state = 534; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (((((_la - 35)) & ~0x1F) === 0 && ((1 << (_la - 35)) & 193) !== 0)) { { { - this.state = 529; + this.state = 531; this.resourcePreamble(); } } - this.state = 534; + this.state = 536; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 535; - this.match(QuixosCapabilityParser.PACKAGE); - this.state = 536; - this.identifier(); this.state = 537; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.PACKAGE); this.state = 538; - this.stringLiteral(); + this.identifier(); this.state = 539; - this.match(QuixosCapabilityParser.REVISION); + this.match(QuixosCapabilityParser.ID); this.state = 540; this.stringLiteral(); - this.state = 543; + this.state = 541; + this.match(QuixosCapabilityParser.REVISION); + this.state = 542; + this.stringLiteral(); + this.state = 545; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 78) { { - this.state = 541; + this.state = 543; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); - this.state = 542; + this.state = 544; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 545; + this.state = 547; this.match(QuixosCapabilityParser.LBRACE); - this.state = 549; + this.state = 551; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 2 || _la === 22 || ((((_la - 49)) & ~0x1F) === 0 && ((1 << (_la - 49)) & 7) !== 0)) { { { - this.state = 546; + this.state = 548; this.packageExport(); } } - this.state = 551; + this.state = 553; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 552; + this.state = 554; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2002,48 +2003,48 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new PackageExportContext(this.context, this.state); this.enterRule(localContext, 54, QuixosCapabilityParser.RULE_packageExport); try { - this.state = 560; + this.state = 562; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 45, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 554; + this.state = 556; this.packageOperationExport(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 555; + this.state = 557; this.packageFunctionExport(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 556; + this.state = 558; this.packageConstructorExport(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 557; + this.state = 559; this.packageQuery(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 558; + this.state = 560; this.packageQuerySpecialization(); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 559; + this.state = 561; this.moduleExport(); } break; @@ -2068,23 +2069,23 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 562; - this.match(QuixosCapabilityParser.MODULE); - this.state = 563; - this.identifier(); this.state = 564; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.MODULE); this.state = 565; - this.stringLiteral(); - this.state = 566; - this.match(QuixosCapabilityParser.IMPLEMENTS); - this.state = 567; - this.interfaceType(); - this.state = 568; - this.match(QuixosCapabilityParser.DOT); - this.state = 569; this.identifier(); + this.state = 566; + this.match(QuixosCapabilityParser.ID); + this.state = 567; + this.stringLiteral(); + this.state = 568; + this.match(QuixosCapabilityParser.IMPLEMENTS); + this.state = 569; + this.interfaceType(); this.state = 570; + this.match(QuixosCapabilityParser.DOT); + this.state = 571; + this.identifier(); + this.state = 572; this.match(QuixosCapabilityParser.SEMI); } } @@ -2107,27 +2108,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 572; - this.match(QuixosCapabilityParser.PRESENTATION); - this.state = 573; - this.identifier(); this.state = 574; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.PRESENTATION); this.state = 575; - this.stringLiteral(); - this.state = 576; - this.match(QuixosCapabilityParser.FOR); - this.state = 577; - this.interfaceType(); - this.state = 578; - this.match(QuixosCapabilityParser.USING); - this.state = 579; this.identifier(); + this.state = 576; + this.match(QuixosCapabilityParser.ID); + this.state = 577; + this.stringLiteral(); + this.state = 578; + this.match(QuixosCapabilityParser.FOR); + this.state = 579; + this.interfaceType(); this.state = 580; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.USING); this.state = 581; this.identifier(); this.state = 582; + this.match(QuixosCapabilityParser.DOT); + this.state = 583; + this.identifier(); + this.state = 584; this.match(QuixosCapabilityParser.SEMI); } } @@ -2151,127 +2152,127 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 584; - this.match(QuixosCapabilityParser.QUERY); this.state = 586; + this.match(QuixosCapabilityParser.QUERY); + this.state = 588; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 46, this.context) ) { case 1: { - this.state = 585; + this.state = 587; this.match(QuixosCapabilityParser.FRAGMENT); } break; } - this.state = 588; - this.identifier(); this.state = 590; + this.identifier(); + this.state = 592; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 589; + this.state = 591; this.typeParameters(); } } - this.state = 592; - this.match(QuixosCapabilityParser.ID); - this.state = 593; - this.stringLiteral(); this.state = 594; - this.match(QuixosCapabilityParser.ROOT); + this.match(QuixosCapabilityParser.ID); + this.state = 595; + this.stringLiteral(); this.state = 596; + this.match(QuixosCapabilityParser.ROOT); + this.state = 598; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 9) { { - this.state = 595; + this.state = 597; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 598; - this.interfaceType(); - this.state = 599; - this.match(QuixosCapabilityParser.DOCUMENT); this.state = 600; + this.interfaceType(); + this.state = 601; + this.match(QuixosCapabilityParser.DOCUMENT); + this.state = 602; this.stringLiteral(); - this.state = 629; + this.state = 631; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.OPERATION: { - this.state = 601; - this.match(QuixosCapabilityParser.OPERATION); - this.state = 602; - this.stringLiteral(); this.state = 603; + this.match(QuixosCapabilityParser.OPERATION); + this.state = 604; + this.stringLiteral(); + this.state = 605; this.match(QuixosCapabilityParser.LBRACE); - this.state = 607; + this.state = 609; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4160946176) !== 0) || _la === 93) { { { - this.state = 604; + this.state = 606; this.queryClause(); } } - this.state = 609; + this.state = 611; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 610; + this.state = 612; this.match(QuixosCapabilityParser.RBRACE); } break; case QuixosCapabilityParser.FRAGMENT: { - this.state = 612; + this.state = 614; this.match(QuixosCapabilityParser.FRAGMENT); - this.state = 613; + this.state = 615; this.stringLiteral(); - this.state = 616; + this.state = 618; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 49) { { - this.state = 614; + this.state = 616; this.match(QuixosCapabilityParser.OPERATION); - this.state = 615; + this.state = 617; this.stringLiteral(); } } - this.state = 627; + this.state = 629; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.LBRACE: { - this.state = 618; + this.state = 620; this.match(QuixosCapabilityParser.LBRACE); - this.state = 622; + this.state = 624; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4160946176) !== 0) || _la === 93) { { { - this.state = 619; + this.state = 621; this.queryClause(); } } - this.state = 624; + this.state = 626; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 625; + this.state = 627; this.match(QuixosCapabilityParser.RBRACE); } break; case QuixosCapabilityParser.SEMI: { - this.state = 626; + this.state = 628; this.match(QuixosCapabilityParser.SEMI); } break; @@ -2304,21 +2305,21 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 631; - this.match(QuixosCapabilityParser.QUERY); - this.state = 632; - this.identifier(); this.state = 633; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.QUERY); this.state = 634; - this.stringLiteral(); - this.state = 635; - this.match(QuixosCapabilityParser.SPECIALIZE); - this.state = 636; this.identifier(); + this.state = 635; + this.match(QuixosCapabilityParser.ID); + this.state = 636; + this.stringLiteral(); this.state = 637; - this.typeArguments(); + this.match(QuixosCapabilityParser.SPECIALIZE); this.state = 638; + this.identifier(); + this.state = 639; + this.typeArguments(); + this.state = 640; this.match(QuixosCapabilityParser.SEMI); } } @@ -2340,161 +2341,161 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 64, QuixosCapabilityParser.RULE_queryClause); let _la: number; try { - this.state = 697; + this.state = 699; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 57, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 640; + this.state = 642; this.match(QuixosCapabilityParser.REPLICA); - this.state = 641; + this.state = 643; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 642; - this.match(QuixosCapabilityParser.LOCAL); - this.state = 643; - this.match(QuixosCapabilityParser.FROM); this.state = 644; - this.identifier(); + this.match(QuixosCapabilityParser.LOCAL); this.state = 645; + this.match(QuixosCapabilityParser.FROM); + this.state = 646; + this.identifier(); + this.state = 647; this.match(QuixosCapabilityParser.SEMI); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 647; - this.match(QuixosCapabilityParser.FRAGMENTS); - this.state = 648; - this.stringLiteral(); this.state = 649; + this.match(QuixosCapabilityParser.FRAGMENTS); + this.state = 650; + this.stringLiteral(); + this.state = 651; this.match(QuixosCapabilityParser.SEMI); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 651; - this.match(QuixosCapabilityParser.FRAGMENTS); - this.state = 652; - this.identifier(); this.state = 653; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.FRAGMENTS); this.state = 654; this.identifier(); - this.state = 664; + this.state = 655; + this.match(QuixosCapabilityParser.DOT); + this.state = 656; + this.identifier(); + this.state = 666; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 64) { { - this.state = 655; + this.state = 657; this.match(QuixosCapabilityParser.WITH); - this.state = 656; + this.state = 658; this.match(QuixosCapabilityParser.LBRACE); - this.state = 660; + this.state = 662; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { { { - this.state = 657; + this.state = 659; this.fragmentVariable(); } } - this.state = 662; + this.state = 664; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 663; + this.state = 665; this.match(QuixosCapabilityParser.RBRACE); } } - this.state = 666; + this.state = 668; this.match(QuixosCapabilityParser.SEMI); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 668; - this.match(QuixosCapabilityParser.VIEW); this.state = 670; + this.match(QuixosCapabilityParser.VIEW); + this.state = 672; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 36) { { - this.state = 669; + this.state = 671; this.match(QuixosCapabilityParser.OBJECT); } } - this.state = 672; - this.identifier(); - this.state = 673; - this.match(QuixosCapabilityParser.AS); this.state = 674; - this.interfaceType(); + this.identifier(); this.state = 675; + this.match(QuixosCapabilityParser.AS); + this.state = 676; + this.interfaceType(); + this.state = 677; this.match(QuixosCapabilityParser.SEMI); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 677; - this.match(QuixosCapabilityParser.MAX); - this.state = 678; - this.identifier(); this.state = 679; - this.match(QuixosCapabilityParser.INTEGER); + this.match(QuixosCapabilityParser.MAX); this.state = 680; + this.identifier(); + this.state = 681; + this.match(QuixosCapabilityParser.INTEGER); + this.state = 682; this.match(QuixosCapabilityParser.SEMI); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 682; - this.match(QuixosCapabilityParser.ALLOW); - this.state = 683; - this.interfaceType(); this.state = 684; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.ALLOW); this.state = 685; - this.identifier(); + this.interfaceType(); this.state = 686; - this.identifier(); + this.match(QuixosCapabilityParser.DOT); this.state = 687; - this.stringLiteral(); + this.identifier(); this.state = 688; + this.identifier(); + this.state = 689; + this.stringLiteral(); + this.state = 690; this.match(QuixosCapabilityParser.SEMI); } break; case 8: this.enterOuterAlt(localContext, 8); { - this.state = 690; + this.state = 692; this.match(QuixosCapabilityParser.WATCH); - this.state = 691; + this.state = 693; this.match(QuixosCapabilityParser.SEMI); } break; case 9: this.enterOuterAlt(localContext, 9); { - this.state = 692; - this.match(QuixosCapabilityParser.POLL); - this.state = 693; - this.match(QuixosCapabilityParser.INTEGER); this.state = 694; - this.stringLiteral(); + this.match(QuixosCapabilityParser.POLL); this.state = 695; + this.match(QuixosCapabilityParser.INTEGER); + this.state = 696; + this.stringLiteral(); + this.state = 697; this.match(QuixosCapabilityParser.SEMI); } break; @@ -2519,13 +2520,13 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 699; - this.identifier(); - this.state = 700; - this.match(QuixosCapabilityParser.TO); this.state = 701; this.identifier(); this.state = 702; + this.match(QuixosCapabilityParser.TO); + this.state = 703; + this.identifier(); + this.state = 704; this.match(QuixosCapabilityParser.SEMI); } } @@ -2549,81 +2550,81 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 704; + this.state = 706; this.match(QuixosCapabilityParser.OPERATION); - this.state = 705; - this.identifier(); this.state = 707; + this.identifier(); + this.state = 709; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 706; + this.state = 708; this.typeParameters(); } } - this.state = 709; - this.match(QuixosCapabilityParser.ID); - this.state = 710; - this.stringLiteral(); this.state = 711; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.ID); this.state = 712; - this.valueType(); + this.stringLiteral(); this.state = 713; - this.match(QuixosCapabilityParser.ARROW); + this.match(QuixosCapabilityParser.COLON); this.state = 714; this.valueType(); this.state = 715; - this.match(QuixosCapabilityParser.MODE); + this.match(QuixosCapabilityParser.ARROW); this.state = 716; - this.operationMode(); + this.valueType(); + this.state = 717; + this.match(QuixosCapabilityParser.MODE); this.state = 718; + this.operationMode(); + this.state = 720; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 717; + this.state = 719; this.executionClause(); } } - this.state = 721; + this.state = 723; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 87) { { - this.state = 720; + this.state = 722; this.eventClause(); } } - this.state = 723; + this.state = 725; this.match(QuixosCapabilityParser.RECEIVER); - this.state = 724; - this.receiverRequirement(); this.state = 726; + this.receiverRequirement(); + this.state = 728; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 89) { { - this.state = 725; + this.state = 727; this.dependencyBlock(); } } - this.state = 729; + this.state = 731; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 66) { { - this.state = 728; + this.state = 730; this.acceptanceClause(); } } - this.state = 731; + this.state = 733; this.match(QuixosCapabilityParser.SEMI); } } @@ -2647,63 +2648,63 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 733; + this.state = 735; this.match(QuixosCapabilityParser.FUNCTION); - this.state = 734; - this.identifier(); this.state = 736; + this.identifier(); + this.state = 738; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 735; + this.state = 737; this.typeParameters(); } } - this.state = 738; - this.match(QuixosCapabilityParser.ID); - this.state = 739; - this.stringLiteral(); this.state = 740; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.ID); this.state = 741; - this.valueType(); + this.stringLiteral(); this.state = 742; - this.match(QuixosCapabilityParser.ARROW); + this.match(QuixosCapabilityParser.COLON); this.state = 743; this.valueType(); + this.state = 744; + this.match(QuixosCapabilityParser.ARROW); this.state = 745; + this.valueType(); + this.state = 747; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 10) { { - this.state = 744; + this.state = 746; this.executionClause(); } } - this.state = 748; + this.state = 750; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 89) { { - this.state = 747; + this.state = 749; this.dependencyBlock(); } } - this.state = 751; + this.state = 753; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 66) { { - this.state = 750; + this.state = 752; this.acceptanceClause(); } } - this.state = 753; + this.state = 755; this.match(QuixosCapabilityParser.SEMI); } } @@ -2726,11 +2727,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 755; - this.match(QuixosCapabilityParser.ACCEPT); - this.state = 756; - this.match(QuixosCapabilityParser.USING); this.state = 757; + this.match(QuixosCapabilityParser.ACCEPT); + this.state = 758; + this.match(QuixosCapabilityParser.USING); + this.state = 759; this.identifier(); } } @@ -2752,24 +2753,24 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 74, QuixosCapabilityParser.RULE_executionClause); let _la: number; try { - this.state = 768; + this.state = 770; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 67, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 759; + this.state = 761; this.match(QuixosCapabilityParser.EXECUTION); - this.state = 760; + this.state = 762; this.match(QuixosCapabilityParser.REMOTE); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 761; + this.state = 763; this.match(QuixosCapabilityParser.EXECUTION); - this.state = 762; + this.state = 764; _la = this.tokenStream.LA(1); if(!(_la === 11 || _la === 12)) { this.errorHandler.recoverInline(this); @@ -2778,13 +2779,13 @@ export class QuixosCapabilityParser extends antlr.Parser { this.errorHandler.reportMatch(this); this.consume(); } - this.state = 763; - this.match(QuixosCapabilityParser.TARGETS); - this.state = 764; - this.match(QuixosCapabilityParser.LBRACK); this.state = 765; - this.identifierList(); + this.match(QuixosCapabilityParser.TARGETS); this.state = 766; + this.match(QuixosCapabilityParser.LBRACK); + this.state = 767; + this.identifierList(); + this.state = 768; this.match(QuixosCapabilityParser.RBRACK); } break; @@ -2810,29 +2811,29 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 770; - this.match(QuixosCapabilityParser.USING); - this.state = 771; - this.match(QuixosCapabilityParser.LBRACK); this.state = 772; + this.match(QuixosCapabilityParser.USING); + this.state = 773; + this.match(QuixosCapabilityParser.LBRACK); + this.state = 774; this.memberOperationRef(); - this.state = 777; + this.state = 779; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 773; + this.state = 775; this.match(QuixosCapabilityParser.COMMA); - this.state = 774; + this.state = 776; this.memberOperationRef(); } } - this.state = 779; + this.state = 781; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 780; + this.state = 782; this.match(QuixosCapabilityParser.RBRACK); } } @@ -2856,33 +2857,33 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 782; - this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 783; - this.identifier(); this.state = 784; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.CONSTRUCTOR); this.state = 785; - this.stringLiteral(); - this.state = 786; - this.match(QuixosCapabilityParser.CONSTRUCTS); - this.state = 787; this.identifier(); + this.state = 786; + this.match(QuixosCapabilityParser.ID); + this.state = 787; + this.stringLiteral(); this.state = 788; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.CONSTRUCTS); this.state = 789; - this.valueType(); + this.identifier(); + this.state = 790; + this.match(QuixosCapabilityParser.COLON); this.state = 791; + this.valueType(); + this.state = 793; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 89) { { - this.state = 790; + this.state = 792; this.dependencyBlock(); } } - this.state = 793; + this.state = 795; this.match(QuixosCapabilityParser.SEMI); } } @@ -2905,9 +2906,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 795; + this.state = 797; this.match(QuixosCapabilityParser.EMITS); - this.state = 796; + this.state = 798; this.valueType(); } } @@ -2931,7 +2932,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 798; + this.state = 800; _la = this.tokenStream.LA(1); if(!(((((_la - 101)) & ~0x1F) === 0 && ((1 << (_la - 101)) & 31) !== 0))) { this.errorHandler.recoverInline(this); @@ -2960,68 +2961,68 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_receiverRequirement); let _la: number; try { - this.state = 818; + this.state = 820; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ANY: this.enterOuterAlt(localContext, 1); { - this.state = 800; + this.state = 802; this.match(QuixosCapabilityParser.ANY); } break; case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 2); { - this.state = 801; + this.state = 803; this.match(QuixosCapabilityParser.ATOM); - this.state = 802; + this.state = 804; this.identifier(); } break; case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 803; + this.state = 805; this.match(QuixosCapabilityParser.OBJECT); - this.state = 804; + this.state = 806; this.identifier(); } break; case QuixosCapabilityParser.INTERFACES: this.enterOuterAlt(localContext, 4); { - this.state = 805; + this.state = 807; this.match(QuixosCapabilityParser.INTERFACES); - this.state = 806; + this.state = 808; this.match(QuixosCapabilityParser.LBRACK); - this.state = 815; + this.state = 817; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { { - this.state = 807; + this.state = 809; this.interfaceType(); - this.state = 812; + this.state = 814; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 808; + this.state = 810; this.match(QuixosCapabilityParser.COMMA); - this.state = 809; + this.state = 811; this.interfaceType(); } } - this.state = 814; + this.state = 816; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 817; + this.state = 819; this.match(QuixosCapabilityParser.RBRACK); } break; @@ -3049,21 +3050,21 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 820; + this.state = 822; this.identifier(); - this.state = 825; + this.state = 827; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 821; + this.state = 823; this.match(QuixosCapabilityParser.COMMA); - this.state = 822; + this.state = 824; this.identifier(); } } - this.state = 827; + this.state = 829; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } @@ -3089,25 +3090,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 828; + this.state = 830; this.match(QuixosCapabilityParser.REQUIRES); - this.state = 829; + this.state = 831; this.match(QuixosCapabilityParser.LBRACE); - this.state = 833; + this.state = 835; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 12583040) !== 0) || ((((_la - 44)) & ~0x1F) === 0 && ((1 << (_la - 44)) & 393345) !== 0)) { { { - this.state = 830; + this.state = 832; this.dependencyPort(); } } - this.state = 835; + this.state = 837; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 836; + this.state = 838; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3129,199 +3130,199 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 90, QuixosCapabilityParser.RULE_dependencyPort); let _la: number; try { - this.state = 916; + this.state = 918; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REFLECTION: this.enterOuterAlt(localContext, 1); { - this.state = 838; - this.match(QuixosCapabilityParser.REFLECTION); - this.state = 839; - this.identifier(); this.state = 840; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.REFLECTION); this.state = 841; - this.stringLiteral(); + this.identifier(); this.state = 842; - this.match(QuixosCapabilityParser.LBRACK); + this.match(QuixosCapabilityParser.ID); this.state = 843; - this.identifierList(); + this.stringLiteral(); this.state = 844; - this.match(QuixosCapabilityParser.RBRACK); + this.match(QuixosCapabilityParser.LBRACK); this.state = 845; + this.identifierList(); + this.state = 846; + this.match(QuixosCapabilityParser.RBRACK); + this.state = 847; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 2); { - this.state = 847; - this.match(QuixosCapabilityParser.STATE); - this.state = 848; - this.identifier(); this.state = 849; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.STATE); this.state = 850; - this.stringLiteral(); + this.identifier(); this.state = 851; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.ID); this.state = 852; - this.valueType(); + this.stringLiteral(); this.state = 853; - this.primitiveList(); + this.match(QuixosCapabilityParser.COLON); this.state = 854; + this.valueType(); + this.state = 855; + this.primitiveList(); + this.state = 856; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 3); { - this.state = 856; - this.match(QuixosCapabilityParser.EDGE); - this.state = 857; - this.identifier(); this.state = 858; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.EDGE); this.state = 859; - this.stringLiteral(); + this.identifier(); this.state = 860; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.ID); this.state = 861; - this.cardinality(); + this.stringLiteral(); this.state = 862; - this.targetConstraint(); + this.match(QuixosCapabilityParser.COLON); this.state = 863; - this.primitiveList(); + this.cardinality(); this.state = 864; + this.targetConstraint(); + this.state = 865; + this.primitiveList(); + this.state = 866; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 4); { - this.state = 866; - this.match(QuixosCapabilityParser.INTERFACE); - this.state = 867; - this.identifier(); this.state = 868; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.INTERFACE); this.state = 869; - this.stringLiteral(); - this.state = 870; - this.match(QuixosCapabilityParser.COLON); - this.state = 871; this.identifier(); + this.state = 870; + this.match(QuixosCapabilityParser.ID); + this.state = 871; + this.stringLiteral(); + this.state = 872; + this.match(QuixosCapabilityParser.COLON); this.state = 873; + this.identifier(); + this.state = 875; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 872; + this.state = 874; this.typeArguments(); } } - this.state = 876; + this.state = 878; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 65) { { - this.state = 875; + this.state = 877; this.selectedOperations(); } } - this.state = 880; + this.state = 882; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 18) { { - this.state = 878; + this.state = 880; this.match(QuixosCapabilityParser.FROM); - this.state = 879; + this.state = 881; this.match(QuixosCapabilityParser.INPUT); } } - this.state = 882; + this.state = 884; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CREATION: this.enterOuterAlt(localContext, 5); { - this.state = 884; - this.match(QuixosCapabilityParser.CREATION); - this.state = 885; - this.identifier(); this.state = 886; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.CREATION); this.state = 887; - this.stringLiteral(); - this.state = 888; - this.match(QuixosCapabilityParser.COLON); - this.state = 889; this.identifier(); + this.state = 888; + this.match(QuixosCapabilityParser.ID); + this.state = 889; + this.stringLiteral(); this.state = 890; - this.match(QuixosCapabilityParser.INPUT); + this.match(QuixosCapabilityParser.COLON); this.state = 891; - this.valueType(); + this.identifier(); this.state = 892; + this.match(QuixosCapabilityParser.INPUT); + this.state = 893; + this.valueType(); + this.state = 894; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONSTRUCTOR: this.enterOuterAlt(localContext, 6); { - this.state = 894; - this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 895; - this.identifier(); this.state = 896; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.CONSTRUCTOR); this.state = 897; - this.stringLiteral(); - this.state = 898; - this.match(QuixosCapabilityParser.COLON); - this.state = 899; this.identifier(); - this.state = 902; + this.state = 898; + this.match(QuixosCapabilityParser.ID); + this.state = 899; + this.stringLiteral(); + this.state = 900; + this.match(QuixosCapabilityParser.COLON); + this.state = 901; + this.identifier(); + this.state = 904; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 53) { { - this.state = 900; + this.state = 902; this.match(QuixosCapabilityParser.INPUT); - this.state = 901; + this.state = 903; this.valueType(); } } - this.state = 904; + this.state = 906; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.QUERY: this.enterOuterAlt(localContext, 7); { - this.state = 906; - this.match(QuixosCapabilityParser.QUERY); - this.state = 907; - this.identifier(); this.state = 908; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.QUERY); this.state = 909; - this.stringLiteral(); - this.state = 910; - this.match(QuixosCapabilityParser.COLON); - this.state = 911; this.identifier(); + this.state = 910; + this.match(QuixosCapabilityParser.ID); + this.state = 911; + this.stringLiteral(); this.state = 912; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.COLON); this.state = 913; this.identifier(); this.state = 914; + this.match(QuixosCapabilityParser.DOT); + this.state = 915; + this.identifier(); + this.state = 916; this.match(QuixosCapabilityParser.SEMI); } break; @@ -3349,27 +3350,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 918; + this.state = 920; this.match(QuixosCapabilityParser.LBRACK); - this.state = 919; + this.state = 921; this.primitive(); - this.state = 924; + this.state = 926; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 920; + this.state = 922; this.match(QuixosCapabilityParser.COMMA); - this.state = 921; + this.state = 923; this.primitive(); } } - this.state = 926; + this.state = 928; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 927; + this.state = 929; this.match(QuixosCapabilityParser.RBRACK); } } @@ -3393,7 +3394,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 929; + this.state = 931; _la = this.tokenStream.LA(1); if(!(_la === 1 || ((((_la - 96)) & ~0x1F) === 0 && ((1 << (_la - 96)) & 223) !== 0))) { this.errorHandler.recoverInline(this); @@ -3423,9 +3424,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 931; + this.state = 933; this.match(QuixosCapabilityParser.SHARED); - this.state = 932; + this.state = 934; this.attachmentDecl(); } } @@ -3446,20 +3447,20 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new AttachmentDeclContext(this.context, this.state); this.enterRule(localContext, 98, QuixosCapabilityParser.RULE_attachmentDecl); try { - this.state = 936; + this.state = 938; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 934; + this.state = 936; this.stateDecl(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 935; + this.state = 937; this.edgeDecl(); } break; @@ -3487,39 +3488,39 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 938; - this.match(QuixosCapabilityParser.STATE); - this.state = 939; - this.identifier(); this.state = 940; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.STATE); this.state = 941; - this.stringLiteral(); - this.state = 942; - this.match(QuixosCapabilityParser.ON); - this.state = 943; this.identifier(); + this.state = 942; + this.match(QuixosCapabilityParser.ID); + this.state = 943; + this.stringLiteral(); this.state = 944; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.ON); this.state = 945; - this.valueType(); + this.identifier(); this.state = 946; - this.match(QuixosCapabilityParser.POLICY); + this.match(QuixosCapabilityParser.COLON); this.state = 947; + this.valueType(); + this.state = 948; + this.match(QuixosCapabilityParser.POLICY); + this.state = 949; this.storagePolicy(); - this.state = 950; + this.state = 952; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 73) { { - this.state = 948; + this.state = 950; this.match(QuixosCapabilityParser.DEFAULT); - this.state = 949; + this.state = 951; this.jsonLiteral(); } } - this.state = 952; + this.state = 954; this.match(QuixosCapabilityParser.SEMI); } } @@ -3540,26 +3541,26 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new StoragePolicyContext(this.context, this.state); this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_storagePolicy); try { - this.state = 960; + this.state = 962; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REGISTER: this.enterOuterAlt(localContext, 1); { - this.state = 954; + this.state = 956; this.match(QuixosCapabilityParser.REGISTER); } break; case QuixosCapabilityParser.CRDT: this.enterOuterAlt(localContext, 2); { - this.state = 955; - this.match(QuixosCapabilityParser.CRDT); - this.state = 956; - this.match(QuixosCapabilityParser.LPAREN); this.state = 957; - this.valueType(); + this.match(QuixosCapabilityParser.CRDT); this.state = 958; + this.match(QuixosCapabilityParser.LPAREN); + this.state = 959; + this.valueType(); + this.state = 960; this.match(QuixosCapabilityParser.RPAREN); } break; @@ -3586,21 +3587,21 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 962; - this.match(QuixosCapabilityParser.EDGE); - this.state = 963; - this.identifier(); this.state = 964; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.EDGE); this.state = 965; - this.stringLiteral(); + this.identifier(); this.state = 966; - this.match(QuixosCapabilityParser.LBRACE); + this.match(QuixosCapabilityParser.ID); this.state = 967; - this.edgeEndpoint(); + this.stringLiteral(); this.state = 968; - this.edgeEndpoint(); + this.match(QuixosCapabilityParser.LBRACE); this.state = 969; + this.edgeEndpoint(); + this.state = 970; + this.edgeEndpoint(); + this.state = 971; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3624,73 +3625,73 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 971; - this.targetConstraint(); - this.state = 972; - this.match(QuixosCapabilityParser.PROJECTION); this.state = 973; - this.identifier(); + this.targetConstraint(); this.state = 974; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.PROJECTION); this.state = 975; - this.stringLiteral(); + this.identifier(); this.state = 976; - this.cardinality(); + this.match(QuixosCapabilityParser.ID); + this.state = 977; + this.stringLiteral(); this.state = 978; + this.cardinality(); + this.state = 980; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 112) { { - this.state = 977; + this.state = 979; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 982; + this.state = 984; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 79) { { - this.state = 980; + this.state = 982; this.match(QuixosCapabilityParser.ON_DELETE); - this.state = 981; + this.state = 983; this.stringLiteral(); } } - this.state = 985; + this.state = 987; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 81) { { - this.state = 984; + this.state = 986; this.match(QuixosCapabilityParser.RETAIN_OTHER); } } - this.state = 989; + this.state = 991; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 82) { { - this.state = 987; + this.state = 989; this.match(QuixosCapabilityParser.KEYED); - this.state = 988; + this.state = 990; this.stringLiteral(); } } - this.state = 992; + this.state = 994; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 83) { { - this.state = 991; + this.state = 993; this.match(QuixosCapabilityParser.PUBLIC_TRAVERSAL); } } - this.state = 994; + this.state = 996; this.match(QuixosCapabilityParser.SEMI); } } @@ -3714,65 +3715,85 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 996; - this.match(QuixosCapabilityParser.CONFORM); - this.state = 997; - this.identifier(); this.state = 998; - this.match(QuixosCapabilityParser.AS); - this.state = 999; - this.identifier(); - this.state = 1001; + this.match(QuixosCapabilityParser.CONFORM); + this.state = 1000; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 1000; + this.state = 999; + this.typeParameters(); + } + } + + this.state = 1002; + this.identifier(); + this.state = 1004; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 143) { + { + this.state = 1003; + this.conformanceSourceArguments(); + } + } + + this.state = 1006; + this.match(QuixosCapabilityParser.AS); + this.state = 1007; + this.identifier(); + this.state = 1009; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 143) { + { + this.state = 1008; this.typeArguments(); } } - this.state = 1005; + this.state = 1013; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 84) { { - this.state = 1003; + this.state = 1011; this.match(QuixosCapabilityParser.ID); - this.state = 1004; + this.state = 1012; this.stringLiteral(); } } - this.state = 1009; + this.state = 1017; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 78) { { - this.state = 1007; + this.state = 1015; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); - this.state = 1008; + this.state = 1016; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 1011; + this.state = 1019; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1015; + this.state = 1023; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 8 || ((((_la - 56)) & ~0x1F) === 0 && ((1 << (_la - 56)) & 4105) !== 0)) { { { - this.state = 1012; + this.state = 1020; this.conformanceItem(); } } - this.state = 1017; + this.state = 1025; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1018; + this.state = 1026; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3789,54 +3810,77 @@ export class QuixosCapabilityParser extends antlr.Parser { } return localContext; } + public conformanceSourceArguments(): ConformanceSourceArgumentsContext { + let localContext = new ConformanceSourceArgumentsContext(this.context, this.state); + this.enterRule(localContext, 110, QuixosCapabilityParser.RULE_conformanceSourceArguments); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 1028; + this.typeArguments(); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } public conformanceItem(): ConformanceItemContext { let localContext = new ConformanceItemContext(this.context, this.state); - this.enterRule(localContext, 110, QuixosCapabilityParser.RULE_conformanceItem); + this.enterRule(localContext, 112, QuixosCapabilityParser.RULE_conformanceItem); try { - this.state = 1027; + this.state = 1037; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 93, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 95, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1020; + this.state = 1030; this.match(QuixosCapabilityParser.PRIVATE); - this.state = 1021; + this.state = 1031; this.attachmentDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1022; + this.state = 1032; this.operationBindingDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1023; + this.state = 1033; this.stateFieldBindingDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1024; + this.state = 1034; this.initializationDecl(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1025; + this.state = 1035; this.relationshipMaterializationDecl(); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1026; + this.state = 1036; this.moduleBindingDecl(); } break; @@ -3857,23 +3901,23 @@ export class QuixosCapabilityParser extends antlr.Parser { } public moduleBindingDecl(): ModuleBindingDeclContext { let localContext = new ModuleBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 112, QuixosCapabilityParser.RULE_moduleBindingDecl); + this.enterRule(localContext, 114, QuixosCapabilityParser.RULE_moduleBindingDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 1029; + this.state = 1039; this.match(QuixosCapabilityParser.BIND); - this.state = 1030; + this.state = 1040; this.identifier(); - this.state = 1031; + this.state = 1041; this.match(QuixosCapabilityParser.TO); - this.state = 1032; + this.state = 1042; this.identifier(); - this.state = 1033; + this.state = 1043; this.match(QuixosCapabilityParser.DOT); - this.state = 1034; + this.state = 1044; this.identifier(); - this.state = 1035; + this.state = 1045; this.match(QuixosCapabilityParser.SEMI); } } @@ -3892,32 +3936,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public initializationDecl(): InitializationDeclContext { let localContext = new InitializationDeclContext(this.context, this.state); - this.enterRule(localContext, 114, QuixosCapabilityParser.RULE_initializationDecl); + this.enterRule(localContext, 116, QuixosCapabilityParser.RULE_initializationDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1037; + this.state = 1047; this.match(QuixosCapabilityParser.INITIALIZE); - this.state = 1038; + this.state = 1048; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1042; + this.state = 1052; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { { { - this.state = 1039; + this.state = 1049; this.initializationField(); } } - this.state = 1044; + this.state = 1054; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1045; + this.state = 1055; this.match(QuixosCapabilityParser.RBRACE); - this.state = 1046; + this.state = 1056; this.match(QuixosCapabilityParser.SEMI); } } @@ -3936,42 +3980,42 @@ export class QuixosCapabilityParser extends antlr.Parser { } public initializationField(): InitializationFieldContext { let localContext = new InitializationFieldContext(this.context, this.state); - this.enterRule(localContext, 116, QuixosCapabilityParser.RULE_initializationField); + this.enterRule(localContext, 118, QuixosCapabilityParser.RULE_initializationField); try { - this.state = 1062; + this.state = 1072; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 95, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 97, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1048; + this.state = 1058; this.identifier(); - this.state = 1049; + this.state = 1059; this.match(QuixosCapabilityParser.TO); - this.state = 1050; + this.state = 1060; this.match(QuixosCapabilityParser.STATE); - this.state = 1051; + this.state = 1061; this.identifier(); - this.state = 1052; + this.state = 1062; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1054; + this.state = 1064; this.identifier(); - this.state = 1055; + this.state = 1065; this.match(QuixosCapabilityParser.TO); - this.state = 1056; + this.state = 1066; this.match(QuixosCapabilityParser.EDGE); - this.state = 1057; + this.state = 1067; this.identifier(); - this.state = 1058; + this.state = 1068; this.match(QuixosCapabilityParser.DOT); - this.state = 1059; + this.state = 1069; this.identifier(); - this.state = 1060; + this.state = 1070; this.match(QuixosCapabilityParser.SEMI); } break; @@ -3992,34 +4036,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public creationOwnerMapping(): CreationOwnerMappingContext { let localContext = new CreationOwnerMappingContext(this.context, this.state); - this.enterRule(localContext, 118, QuixosCapabilityParser.RULE_creationOwnerMapping); + this.enterRule(localContext, 120, QuixosCapabilityParser.RULE_creationOwnerMapping); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1064; + this.state = 1074; this.interfaceType(); - this.state = 1065; + this.state = 1075; this.match(QuixosCapabilityParser.FROM); - this.state = 1066; + this.state = 1076; this.match(QuixosCapabilityParser.INPUT); - this.state = 1071; + this.state = 1081; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 136) { { { - this.state = 1067; + this.state = 1077; this.match(QuixosCapabilityParser.DOT); - this.state = 1068; + this.state = 1078; this.identifier(); } } - this.state = 1073; + this.state = 1083; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1074; + this.state = 1084; this.match(QuixosCapabilityParser.SEMI); } } @@ -4038,21 +4082,21 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stateFieldBindingDecl(): StateFieldBindingDeclContext { let localContext = new StateFieldBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 120, QuixosCapabilityParser.RULE_stateFieldBindingDecl); + this.enterRule(localContext, 122, QuixosCapabilityParser.RULE_stateFieldBindingDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 1076; + this.state = 1086; this.match(QuixosCapabilityParser.BIND); - this.state = 1077; + this.state = 1087; this.identifier(); - this.state = 1078; + this.state = 1088; this.match(QuixosCapabilityParser.TO); - this.state = 1079; + this.state = 1089; this.match(QuixosCapabilityParser.STATE); - this.state = 1080; + this.state = 1090; this.identifier(); - this.state = 1081; + this.state = 1091; this.match(QuixosCapabilityParser.SEMI); } } @@ -4071,35 +4115,35 @@ export class QuixosCapabilityParser extends antlr.Parser { } public relationshipMaterializationDecl(): RelationshipMaterializationDeclContext { let localContext = new RelationshipMaterializationDeclContext(this.context, this.state); - this.enterRule(localContext, 122, QuixosCapabilityParser.RULE_relationshipMaterializationDecl); + this.enterRule(localContext, 124, QuixosCapabilityParser.RULE_relationshipMaterializationDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 1083; - this.match(QuixosCapabilityParser.MATERIALIZE); - this.state = 1084; - this.identifier(); - this.state = 1085; - this.match(QuixosCapabilityParser.IF); - this.state = 1086; - this.match(QuixosCapabilityParser.ABSENT); - this.state = 1087; - this.match(QuixosCapabilityParser.USING); - this.state = 1088; - this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1089; - this.identifier(); - this.state = 1090; - this.match(QuixosCapabilityParser.VIA); - this.state = 1091; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1092; - this.identifier(); this.state = 1093; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.MATERIALIZE); this.state = 1094; this.identifier(); this.state = 1095; + this.match(QuixosCapabilityParser.IF); + this.state = 1096; + this.match(QuixosCapabilityParser.ABSENT); + this.state = 1097; + this.match(QuixosCapabilityParser.USING); + this.state = 1098; + this.match(QuixosCapabilityParser.CONSTRUCTOR); + this.state = 1099; + this.identifier(); + this.state = 1100; + this.match(QuixosCapabilityParser.VIA); + this.state = 1101; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1102; + this.identifier(); + this.state = 1103; + this.match(QuixosCapabilityParser.DOT); + this.state = 1104; + this.identifier(); + this.state = 1105; this.match(QuixosCapabilityParser.SEMI); } } @@ -4118,32 +4162,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationBindingDecl(): OperationBindingDeclContext { let localContext = new OperationBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 124, QuixosCapabilityParser.RULE_operationBindingDecl); + this.enterRule(localContext, 126, QuixosCapabilityParser.RULE_operationBindingDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1097; + this.state = 1107; this.match(QuixosCapabilityParser.BIND); - this.state = 1098; + this.state = 1108; this.memberOperationRef(); - this.state = 1099; + this.state = 1109; this.match(QuixosCapabilityParser.TO); - this.state = 1100; + this.state = 1110; this.operationProvider(); - this.state = 1103; + this.state = 1113; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 34) { { - this.state = 1101; + this.state = 1111; this.match(QuixosCapabilityParser.QUERY_REASON); - this.state = 1102; + this.state = 1112; this.stringLiteral(); } } - this.state = 1105; + this.state = 1115; this.match(QuixosCapabilityParser.SEMI); } } @@ -4162,15 +4206,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public memberOperationRef(): MemberOperationRefContext { let localContext = new MemberOperationRefContext(this.context, this.state); - this.enterRule(localContext, 126, QuixosCapabilityParser.RULE_memberOperationRef); + this.enterRule(localContext, 128, QuixosCapabilityParser.RULE_memberOperationRef); try { this.enterOuterAlt(localContext, 1); { - this.state = 1107; + this.state = 1117; this.identifier(); - this.state = 1108; + this.state = 1118; this.match(QuixosCapabilityParser.DOT); - this.state = 1109; + this.state = 1119; this.operationName(); } } @@ -4189,92 +4233,92 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationName(): OperationNameContext { let localContext = new OperationNameContext(this.context, this.state); - this.enterRule(localContext, 128, QuixosCapabilityParser.RULE_operationName); + this.enterRule(localContext, 130, QuixosCapabilityParser.RULE_operationName); try { - this.state = 1123; + this.state = 1133; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 98, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 100, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1111; + this.state = 1121; this.identifier(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1112; + this.state = 1122; this.match(QuixosCapabilityParser.CALL); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1113; + this.state = 1123; this.match(QuixosCapabilityParser.GET); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1114; + this.state = 1124; this.match(QuixosCapabilityParser.SET); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1115; + this.state = 1125; this.match(QuixosCapabilityParser.EDIT); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1116; + this.state = 1126; this.match(QuixosCapabilityParser.RESOLVE); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 1117; + this.state = 1127; this.match(QuixosCapabilityParser.CONNECT); } break; case 8: this.enterOuterAlt(localContext, 8); { - this.state = 1118; + this.state = 1128; this.match(QuixosCapabilityParser.DISCONNECT); } break; case 9: this.enterOuterAlt(localContext, 9); { - this.state = 1119; + this.state = 1129; this.match(QuixosCapabilityParser.WATCH_START); } break; case 10: this.enterOuterAlt(localContext, 10); { - this.state = 1120; + this.state = 1130; this.match(QuixosCapabilityParser.WATCH_STOP); } break; case 11: this.enterOuterAlt(localContext, 11); { - this.state = 1121; + this.state = 1131; this.match(QuixosCapabilityParser.SUBSCRIBE); } break; case 12: this.enterOuterAlt(localContext, 12); { - this.state = 1122; + this.state = 1132; this.match(QuixosCapabilityParser.UNSUBSCRIBE); } break; @@ -4295,85 +4339,58 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationProvider(): OperationProviderContext { let localContext = new OperationProviderContext(this.context, this.state); - this.enterRule(localContext, 130, QuixosCapabilityParser.RULE_operationProvider); + this.enterRule(localContext, 132, QuixosCapabilityParser.RULE_operationProvider); let _la: number; try { - this.state = 1161; + this.state = 1171; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.LIFECYCLE: this.enterOuterAlt(localContext, 1); { - this.state = 1125; + this.state = 1135; this.match(QuixosCapabilityParser.LIFECYCLE); - this.state = 1126; + this.state = 1136; this.match(QuixosCapabilityParser.DOT); - this.state = 1127; + this.state = 1137; this.identifier(); } break; case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 2); { - this.state = 1128; + this.state = 1138; this.match(QuixosCapabilityParser.STATE); - this.state = 1129; + this.state = 1139; this.identifier(); - this.state = 1130; + this.state = 1140; this.match(QuixosCapabilityParser.DOT); - this.state = 1131; + this.state = 1141; this.statePrimitive(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 3); { - this.state = 1133; + this.state = 1143; this.match(QuixosCapabilityParser.EDGE); - this.state = 1134; + this.state = 1144; this.identifier(); - this.state = 1135; + this.state = 1145; this.match(QuixosCapabilityParser.DOT); - this.state = 1136; + this.state = 1146; this.identifier(); - this.state = 1137; + this.state = 1147; this.match(QuixosCapabilityParser.DOT); - this.state = 1138; + this.state = 1148; this.edgePrimitive(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 4); { - this.state = 1140; - this.match(QuixosCapabilityParser.INTERFACE); - this.state = 1141; - this.identifier(); - this.state = 1143; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 143) { - { - this.state = 1142; - this.typeArguments(); - } - } - - this.state = 1145; - this.match(QuixosCapabilityParser.DOT); - this.state = 1146; - this.memberOperationRef(); - } - break; - case QuixosCapabilityParser.PACKAGE: - this.enterOuterAlt(localContext, 5); - { - this.state = 1148; - this.match(QuixosCapabilityParser.PACKAGE); - this.state = 1149; - this.identifier(); this.state = 1150; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.INTERFACE); this.state = 1151; this.identifier(); this.state = 1153; @@ -4386,22 +4403,49 @@ export class QuixosCapabilityParser extends antlr.Parser { } } + this.state = 1155; + this.match(QuixosCapabilityParser.DOT); this.state = 1156; + this.memberOperationRef(); + } + break; + case QuixosCapabilityParser.PACKAGE: + this.enterOuterAlt(localContext, 5); + { + this.state = 1158; + this.match(QuixosCapabilityParser.PACKAGE); + this.state = 1159; + this.identifier(); + this.state = 1160; + this.match(QuixosCapabilityParser.DOT); + this.state = 1161; + this.identifier(); + this.state = 1163; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 143) { + { + this.state = 1162; + this.typeArguments(); + } + } + + this.state = 1166; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 64) { { - this.state = 1155; + this.state = 1165; this.dependencyBindingBlock(); } } - this.state = 1159; + this.state = 1169; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 66) { { - this.state = 1158; + this.state = 1168; this.acceptanceBinding(); } } @@ -4427,13 +4471,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public acceptanceBinding(): AcceptanceBindingContext { let localContext = new AcceptanceBindingContext(this.context, this.state); - this.enterRule(localContext, 132, QuixosCapabilityParser.RULE_acceptanceBinding); + this.enterRule(localContext, 134, QuixosCapabilityParser.RULE_acceptanceBinding); try { this.enterOuterAlt(localContext, 1); { - this.state = 1163; + this.state = 1173; this.match(QuixosCapabilityParser.ACCEPT); - this.state = 1164; + this.state = 1174; this.dependencyBindingBlock(); } } @@ -4452,12 +4496,12 @@ export class QuixosCapabilityParser extends antlr.Parser { } public statePrimitive(): StatePrimitiveContext { let localContext = new StatePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 134, QuixosCapabilityParser.RULE_statePrimitive); + this.enterRule(localContext, 136, QuixosCapabilityParser.RULE_statePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1166; + this.state = 1176; _la = this.tokenStream.LA(1); if(!(_la === 1 || ((((_la - 96)) & ~0x1F) === 0 && ((1 << (_la - 96)) & 195) !== 0))) { this.errorHandler.recoverInline(this); @@ -4483,12 +4527,12 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgePrimitive(): EdgePrimitiveContext { let localContext = new EdgePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 136, QuixosCapabilityParser.RULE_edgePrimitive); + this.enterRule(localContext, 138, QuixosCapabilityParser.RULE_edgePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1168; + this.state = 1178; _la = this.tokenStream.LA(1); if(!(((((_la - 98)) & ~0x1F) === 0 && ((1 << (_la - 98)) & 55) !== 0))) { this.errorHandler.recoverInline(this); @@ -4514,30 +4558,30 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBindingBlock(): DependencyBindingBlockContext { let localContext = new DependencyBindingBlockContext(this.context, this.state); - this.enterRule(localContext, 138, QuixosCapabilityParser.RULE_dependencyBindingBlock); + this.enterRule(localContext, 140, QuixosCapabilityParser.RULE_dependencyBindingBlock); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1170; + this.state = 1180; this.match(QuixosCapabilityParser.WITH); - this.state = 1171; + this.state = 1181; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1175; + this.state = 1185; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { { { - this.state = 1172; + this.state = 1182; this.dependencyBinding(); } } - this.state = 1177; + this.state = 1187; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1178; + this.state = 1188; this.match(QuixosCapabilityParser.RBRACE); } } @@ -4556,139 +4600,139 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBinding(): DependencyBindingContext { let localContext = new DependencyBindingContext(this.context, this.state); - this.enterRule(localContext, 140, QuixosCapabilityParser.RULE_dependencyBinding); + this.enterRule(localContext, 142, QuixosCapabilityParser.RULE_dependencyBinding); let _la: number; try { - this.state = 1278; + this.state = 1288; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 112, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 114, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1180; + this.state = 1190; this.identifier(); - this.state = 1181; + this.state = 1191; this.match(QuixosCapabilityParser.TO); - this.state = 1182; + this.state = 1192; this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 1183; + this.state = 1193; this.match(QuixosCapabilityParser.REFLECTION); - this.state = 1184; + this.state = 1194; this.match(QuixosCapabilityParser.LBRACK); - this.state = 1185; + this.state = 1195; this.identifierList(); - this.state = 1186; + this.state = 1196; this.match(QuixosCapabilityParser.RBRACK); - this.state = 1187; + this.state = 1197; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1189; - this.identifier(); - this.state = 1190; - this.match(QuixosCapabilityParser.TO); - this.state = 1191; - this.match(QuixosCapabilityParser.STATE); - this.state = 1192; - this.identifier(); this.state = 1199; + this.identifier(); + this.state = 1200; + this.match(QuixosCapabilityParser.TO); + this.state = 1201; + this.match(QuixosCapabilityParser.STATE); + this.state = 1202; + this.identifier(); + this.state = 1209; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 67) { { - this.state = 1193; + this.state = 1203; this.match(QuixosCapabilityParser.VIA); - this.state = 1194; + this.state = 1204; this.match(QuixosCapabilityParser.EDGE); - this.state = 1195; + this.state = 1205; this.identifier(); - this.state = 1196; + this.state = 1206; this.match(QuixosCapabilityParser.DOT); - this.state = 1197; + this.state = 1207; this.identifier(); } } - this.state = 1201; + this.state = 1211; this.match(QuixosCapabilityParser.SEMI); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1203; + this.state = 1213; this.identifier(); - this.state = 1204; + this.state = 1214; this.match(QuixosCapabilityParser.TO); - this.state = 1205; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1206; - this.identifier(); - this.state = 1207; - this.match(QuixosCapabilityParser.DOT); - this.state = 1208; - this.identifier(); this.state = 1215; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1216; + this.identifier(); + this.state = 1217; + this.match(QuixosCapabilityParser.DOT); + this.state = 1218; + this.identifier(); + this.state = 1225; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 67) { { - this.state = 1209; + this.state = 1219; this.match(QuixosCapabilityParser.VIA); - this.state = 1210; + this.state = 1220; this.match(QuixosCapabilityParser.EDGE); - this.state = 1211; + this.state = 1221; this.identifier(); - this.state = 1212; + this.state = 1222; this.match(QuixosCapabilityParser.DOT); - this.state = 1213; + this.state = 1223; this.identifier(); } } - this.state = 1217; + this.state = 1227; this.match(QuixosCapabilityParser.SEMI); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1219; + this.state = 1229; this.identifier(); - this.state = 1220; + this.state = 1230; this.match(QuixosCapabilityParser.TO); - this.state = 1221; + this.state = 1231; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 1222; + this.state = 1232; this.identifier(); - this.state = 1224; + this.state = 1234; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 1223; + this.state = 1233; this.typeArguments(); } } - this.state = 1234; + this.state = 1244; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.VIA: { { - this.state = 1226; + this.state = 1236; this.match(QuixosCapabilityParser.VIA); - this.state = 1227; + this.state = 1237; this.match(QuixosCapabilityParser.EDGE); - this.state = 1228; + this.state = 1238; this.identifier(); - this.state = 1229; + this.state = 1239; this.match(QuixosCapabilityParser.DOT); - this.state = 1230; + this.state = 1240; this.identifier(); } } @@ -4696,9 +4740,9 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.FROM: { { - this.state = 1232; + this.state = 1242; this.match(QuixosCapabilityParser.FROM); - this.state = 1233; + this.state = 1243; this.match(QuixosCapabilityParser.INPUT); } } @@ -4708,104 +4752,104 @@ export class QuixosCapabilityParser extends antlr.Parser { default: break; } - this.state = 1236; + this.state = 1246; this.match(QuixosCapabilityParser.SEMI); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1238; + this.state = 1248; this.identifier(); - this.state = 1239; + this.state = 1249; this.match(QuixosCapabilityParser.TO); - this.state = 1240; + this.state = 1250; this.match(QuixosCapabilityParser.CREATION); - this.state = 1241; + this.state = 1251; this.identifier(); - this.state = 1242; + this.state = 1252; this.match(QuixosCapabilityParser.WITH); - this.state = 1243; + this.state = 1253; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1247; + this.state = 1257; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { { { - this.state = 1244; + this.state = 1254; this.creationOwnerMapping(); } } - this.state = 1249; + this.state = 1259; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1250; + this.state = 1260; this.match(QuixosCapabilityParser.RBRACE); - this.state = 1251; + this.state = 1261; this.match(QuixosCapabilityParser.SEMI); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1253; + this.state = 1263; this.identifier(); - this.state = 1254; + this.state = 1264; this.match(QuixosCapabilityParser.TO); - this.state = 1255; + this.state = 1265; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1256; + this.state = 1266; this.identifier(); - this.state = 1257; + this.state = 1267; this.match(QuixosCapabilityParser.SEMI); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 1259; + this.state = 1269; this.identifier(); - this.state = 1260; + this.state = 1270; this.match(QuixosCapabilityParser.TO); - this.state = 1262; + this.state = 1272; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 9) { { - this.state = 1261; + this.state = 1271; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 1264; - this.match(QuixosCapabilityParser.QUERY); - this.state = 1265; - this.identifier(); - this.state = 1266; - this.match(QuixosCapabilityParser.DOT); - this.state = 1267; - this.identifier(); this.state = 1274; + this.match(QuixosCapabilityParser.QUERY); + this.state = 1275; + this.identifier(); + this.state = 1276; + this.match(QuixosCapabilityParser.DOT); + this.state = 1277; + this.identifier(); + this.state = 1284; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 67) { { - this.state = 1268; + this.state = 1278; this.match(QuixosCapabilityParser.VIA); - this.state = 1269; + this.state = 1279; this.match(QuixosCapabilityParser.EDGE); - this.state = 1270; + this.state = 1280; this.identifier(); - this.state = 1271; + this.state = 1281; this.match(QuixosCapabilityParser.DOT); - this.state = 1272; + this.state = 1282; this.identifier(); } } - this.state = 1276; + this.state = 1286; this.match(QuixosCapabilityParser.SEMI); } break; @@ -4826,34 +4870,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public constructorBindingDecl(): ConstructorBindingDeclContext { let localContext = new ConstructorBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 142, QuixosCapabilityParser.RULE_constructorBindingDecl); + this.enterRule(localContext, 144, QuixosCapabilityParser.RULE_constructorBindingDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1280; + this.state = 1290; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1281; + this.state = 1291; this.identifier(); - this.state = 1282; + this.state = 1292; this.match(QuixosCapabilityParser.TO); - this.state = 1283; + this.state = 1293; this.identifier(); - this.state = 1284; + this.state = 1294; this.match(QuixosCapabilityParser.DOT); - this.state = 1285; + this.state = 1295; this.identifier(); - this.state = 1287; + this.state = 1297; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 64) { { - this.state = 1286; + this.state = 1296; this.dependencyBindingBlock(); } } - this.state = 1289; + this.state = 1299; this.match(QuixosCapabilityParser.SEMI); } } @@ -4872,10 +4916,10 @@ export class QuixosCapabilityParser extends antlr.Parser { } public valueType(): ValueTypeContext { let localContext = new ValueTypeContext(this.context, this.state); - this.enterRule(localContext, 144, QuixosCapabilityParser.RULE_valueType); + this.enterRule(localContext, 146, QuixosCapabilityParser.RULE_valueType); let _la: number; try { - this.state = 1337; + this.state = 1347; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.BOOL: @@ -4888,130 +4932,130 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.UINT64: this.enterOuterAlt(localContext, 1); { - this.state = 1291; + this.state = 1301; this.scalarType(); } break; case QuixosCapabilityParser.UNIT: this.enterOuterAlt(localContext, 2); { - this.state = 1292; + this.state = 1302; this.match(QuixosCapabilityParser.UNIT); } break; case QuixosCapabilityParser.WATCH_HANDLE: this.enterOuterAlt(localContext, 3); { - this.state = 1293; + this.state = 1303; this.match(QuixosCapabilityParser.WATCH_HANDLE); } break; case QuixosCapabilityParser.MESSAGE: this.enterOuterAlt(localContext, 4); { - this.state = 1294; + this.state = 1304; this.match(QuixosCapabilityParser.MESSAGE); - this.state = 1295; + this.state = 1305; this.stringLiteral(); } break; case QuixosCapabilityParser.ATOM_REF: this.enterOuterAlt(localContext, 5); { - this.state = 1296; + this.state = 1306; this.match(QuixosCapabilityParser.ATOM_REF); - this.state = 1297; + this.state = 1307; this.match(QuixosCapabilityParser.LT); - this.state = 1298; + this.state = 1308; this.identifier(); - this.state = 1299; + this.state = 1309; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.INTERFACE_REF: this.enterOuterAlt(localContext, 6); { - this.state = 1301; + this.state = 1311; this.match(QuixosCapabilityParser.INTERFACE_REF); - this.state = 1302; + this.state = 1312; this.match(QuixosCapabilityParser.LT); - this.state = 1303; + this.state = 1313; this.identifier(); - this.state = 1305; + this.state = 1315; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 1304; + this.state = 1314; this.typeArguments(); } } - this.state = 1307; + this.state = 1317; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.REF: this.enterOuterAlt(localContext, 7); { - this.state = 1309; + this.state = 1319; this.match(QuixosCapabilityParser.REF); - this.state = 1310; + this.state = 1320; this.match(QuixosCapabilityParser.LT); - this.state = 1311; + this.state = 1321; this.identifier(); - this.state = 1312; + this.state = 1322; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.OPTIONAL: this.enterOuterAlt(localContext, 8); { - this.state = 1314; + this.state = 1324; this.match(QuixosCapabilityParser.OPTIONAL); - this.state = 1315; + this.state = 1325; this.match(QuixosCapabilityParser.LT); - this.state = 1316; + this.state = 1326; this.valueType(); - this.state = 1317; + this.state = 1327; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.LIST: this.enterOuterAlt(localContext, 9); { - this.state = 1319; + this.state = 1329; this.match(QuixosCapabilityParser.LIST); - this.state = 1320; + this.state = 1330; this.match(QuixosCapabilityParser.LT); - this.state = 1321; + this.state = 1331; this.valueType(); - this.state = 1322; + this.state = 1332; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.RECORD: this.enterOuterAlt(localContext, 10); { - this.state = 1324; + this.state = 1334; this.match(QuixosCapabilityParser.RECORD); - this.state = 1325; + this.state = 1335; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1329; + this.state = 1339; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { { { - this.state = 1326; + this.state = 1336; this.recordField(); } } - this.state = 1331; + this.state = 1341; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1332; + this.state = 1342; this.match(QuixosCapabilityParser.RBRACE); } break; @@ -5054,14 +5098,14 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 11); { - this.state = 1333; + this.state = 1343; this.identifier(); - this.state = 1335; + this.state = 1345; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 1334; + this.state = 1344; this.typeArguments(); } } @@ -5087,17 +5131,17 @@ export class QuixosCapabilityParser extends antlr.Parser { } public recordField(): RecordFieldContext { let localContext = new RecordFieldContext(this.context, this.state); - this.enterRule(localContext, 146, QuixosCapabilityParser.RULE_recordField); + this.enterRule(localContext, 148, QuixosCapabilityParser.RULE_recordField); try { this.enterOuterAlt(localContext, 1); { - this.state = 1339; + this.state = 1349; this.identifier(); - this.state = 1340; + this.state = 1350; this.match(QuixosCapabilityParser.COLON); - this.state = 1341; + this.state = 1351; this.valueType(); - this.state = 1342; + this.state = 1352; this.match(QuixosCapabilityParser.SEMI); } } @@ -5116,12 +5160,12 @@ export class QuixosCapabilityParser extends antlr.Parser { } public scalarType(): ScalarTypeContext { let localContext = new ScalarTypeContext(this.context, this.state); - this.enterRule(localContext, 148, QuixosCapabilityParser.RULE_scalarType); + this.enterRule(localContext, 150, QuixosCapabilityParser.RULE_scalarType); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1344; + this.state = 1354; _la = this.tokenStream.LA(1); if(!(((((_la - 121)) & ~0x1F) === 0 && ((1 << (_la - 121)) & 255) !== 0))) { this.errorHandler.recoverInline(this); @@ -5147,12 +5191,12 @@ export class QuixosCapabilityParser extends antlr.Parser { } public cardinality(): CardinalityContext { let localContext = new CardinalityContext(this.context, this.state); - this.enterRule(localContext, 150, QuixosCapabilityParser.RULE_cardinality); + this.enterRule(localContext, 152, QuixosCapabilityParser.RULE_cardinality); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1346; + this.state = 1356; _la = this.tokenStream.LA(1); if(!(((((_la - 108)) & ~0x1F) === 0 && ((1 << (_la - 108)) & 15) !== 0))) { this.errorHandler.recoverInline(this); @@ -5178,64 +5222,64 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonLiteral(): JsonLiteralContext { let localContext = new JsonLiteralContext(this.context, this.state); - this.enterRule(localContext, 152, QuixosCapabilityParser.RULE_jsonLiteral); + this.enterRule(localContext, 154, QuixosCapabilityParser.RULE_jsonLiteral); try { - this.state = 1356; + this.state = 1366; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STRING_LITERAL: this.enterOuterAlt(localContext, 1); { - this.state = 1348; + this.state = 1358; this.stringLiteral(); } break; case QuixosCapabilityParser.INTEGER: this.enterOuterAlt(localContext, 2); { - this.state = 1349; + this.state = 1359; this.match(QuixosCapabilityParser.INTEGER); } break; case QuixosCapabilityParser.JSON_NUMBER: this.enterOuterAlt(localContext, 3); { - this.state = 1350; + this.state = 1360; this.match(QuixosCapabilityParser.JSON_NUMBER); } break; case QuixosCapabilityParser.TRUE: this.enterOuterAlt(localContext, 4); { - this.state = 1351; + this.state = 1361; this.match(QuixosCapabilityParser.TRUE); } break; case QuixosCapabilityParser.FALSE: this.enterOuterAlt(localContext, 5); { - this.state = 1352; + this.state = 1362; this.match(QuixosCapabilityParser.FALSE); } break; case QuixosCapabilityParser.NULL: this.enterOuterAlt(localContext, 6); { - this.state = 1353; + this.state = 1363; this.match(QuixosCapabilityParser.NULL); } break; case QuixosCapabilityParser.LBRACE: this.enterOuterAlt(localContext, 7); { - this.state = 1354; + this.state = 1364; this.jsonObject(); } break; case QuixosCapabilityParser.LBRACK: this.enterOuterAlt(localContext, 8); { - this.state = 1355; + this.state = 1365; this.jsonArray(); } break; @@ -5258,40 +5302,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonObject(): JsonObjectContext { let localContext = new JsonObjectContext(this.context, this.state); - this.enterRule(localContext, 154, QuixosCapabilityParser.RULE_jsonObject); + this.enterRule(localContext, 156, QuixosCapabilityParser.RULE_jsonObject); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1358; + this.state = 1368; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1367; + this.state = 1377; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 150) { { - this.state = 1359; + this.state = 1369; this.jsonMember(); - this.state = 1364; + this.state = 1374; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 1360; + this.state = 1370; this.match(QuixosCapabilityParser.COMMA); - this.state = 1361; + this.state = 1371; this.jsonMember(); } } - this.state = 1366; + this.state = 1376; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1369; + this.state = 1379; this.match(QuixosCapabilityParser.RBRACE); } } @@ -5310,15 +5354,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonMember(): JsonMemberContext { let localContext = new JsonMemberContext(this.context, this.state); - this.enterRule(localContext, 156, QuixosCapabilityParser.RULE_jsonMember); + this.enterRule(localContext, 158, QuixosCapabilityParser.RULE_jsonMember); try { this.enterOuterAlt(localContext, 1); { - this.state = 1371; + this.state = 1381; this.stringLiteral(); - this.state = 1372; + this.state = 1382; this.match(QuixosCapabilityParser.COLON); - this.state = 1373; + this.state = 1383; this.jsonLiteral(); } } @@ -5337,40 +5381,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonArray(): JsonArrayContext { let localContext = new JsonArrayContext(this.context, this.state); - this.enterRule(localContext, 158, QuixosCapabilityParser.RULE_jsonArray); + this.enterRule(localContext, 160, QuixosCapabilityParser.RULE_jsonArray); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1375; + this.state = 1385; this.match(QuixosCapabilityParser.LBRACK); - this.state = 1384; + this.state = 1394; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (((((_la - 129)) & ~0x1F) === 0 && ((1 << (_la - 129)) & 2884871) !== 0)) { { - this.state = 1376; + this.state = 1386; this.jsonLiteral(); - this.state = 1381; + this.state = 1391; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 1377; + this.state = 1387; this.match(QuixosCapabilityParser.COMMA); - this.state = 1378; + this.state = 1388; this.jsonLiteral(); } } - this.state = 1383; + this.state = 1393; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1386; + this.state = 1396; this.match(QuixosCapabilityParser.RBRACK); } } @@ -5389,12 +5433,12 @@ export class QuixosCapabilityParser extends antlr.Parser { } public identifier(): IdentifierContext { let localContext = new IdentifierContext(this.context, this.state); - this.enterRule(localContext, 160, QuixosCapabilityParser.RULE_identifier); + this.enterRule(localContext, 162, QuixosCapabilityParser.RULE_identifier); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1388; + this.state = 1398; _la = this.tokenStream.LA(1); if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149)) { this.errorHandler.recoverInline(this); @@ -5420,11 +5464,11 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stringLiteral(): StringLiteralContext { let localContext = new StringLiteralContext(this.context, this.state); - this.enterRule(localContext, 162, QuixosCapabilityParser.RULE_stringLiteral); + this.enterRule(localContext, 164, QuixosCapabilityParser.RULE_stringLiteral); try { this.enterOuterAlt(localContext, 1); { - this.state = 1390; + this.state = 1400; this.match(QuixosCapabilityParser.STRING_LITERAL); } } @@ -5443,7 +5487,7 @@ export class QuixosCapabilityParser extends antlr.Parser { } public static readonly _serializedATN: number[] = [ - 4,1,153,1393,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,153,1403,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, @@ -5455,533 +5499,538 @@ export class QuixosCapabilityParser extends antlr.Parser { 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,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, - 1,0,1,0,1,0,1,0,3,0,177,8,0,1,1,1,1,1,1,5,1,182,8,1,10,1,12,1,185, - 9,1,1,1,1,1,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3, - 1,3,5,3,203,8,3,10,3,12,3,206,9,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1, - 4,1,4,1,4,3,4,218,8,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,3, - 5,230,8,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1, - 7,1,8,1,8,1,8,1,8,3,8,250,8,8,1,9,1,9,1,9,1,9,1,9,1,9,3,9,258,8, - 9,1,9,1,9,1,10,5,10,263,8,10,10,10,12,10,266,9,10,1,10,1,10,1,10, - 3,10,271,8,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,5,10,281,8, - 10,10,10,12,10,284,9,10,3,10,286,8,10,1,10,1,10,5,10,290,8,10,10, - 10,12,10,293,9,10,1,10,1,10,1,11,1,11,1,11,1,11,5,11,301,8,11,10, - 11,12,11,304,9,11,1,11,1,11,1,12,1,12,1,12,1,12,3,12,312,8,12,1, - 12,1,12,1,12,1,12,1,12,1,12,5,12,320,8,12,10,12,12,12,323,9,12,3, - 12,325,8,12,3,12,327,8,12,1,13,1,13,3,13,331,8,13,1,14,1,14,1,14, - 1,14,5,14,337,8,14,10,14,12,14,340,9,14,1,14,1,14,1,15,1,15,1,15, - 1,15,1,15,1,15,1,15,3,15,351,8,15,1,16,1,16,1,16,3,16,356,8,16,1, - 16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,3,17,366,8,17,1,18,1,18,1, - 18,1,18,1,18,1,18,1,18,1,18,3,18,376,8,18,1,18,1,18,1,19,3,19,381, - 8,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19, - 1,19,3,19,396,8,19,1,19,1,19,1,19,1,20,3,20,402,8,20,1,20,1,20,1, - 20,1,20,1,20,1,20,1,20,1,20,5,20,412,8,20,10,20,12,20,415,9,20,1, - 20,1,20,1,21,1,21,1,21,1,21,3,21,423,8,21,1,21,1,21,1,21,1,21,1, - 21,1,21,3,21,431,8,21,1,21,1,21,1,21,1,21,1,21,1,21,3,21,439,8,21, - 1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,3,21,452, - 8,21,1,22,3,22,455,8,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22, - 3,22,465,8,22,1,22,1,22,3,22,469,8,22,1,22,1,22,5,22,473,8,22,10, - 22,12,22,476,9,22,1,22,1,22,1,23,1,23,3,23,482,8,23,1,24,1,24,1, - 24,1,24,3,24,488,8,24,1,24,1,24,1,24,1,24,1,24,1,24,3,24,496,8,24, - 1,24,1,24,1,24,1,24,1,24,1,24,3,24,504,8,24,1,24,1,24,1,24,1,24, - 1,24,1,24,1,24,1,24,1,24,1,24,1,24,3,24,517,8,24,1,25,1,25,1,25, - 1,25,1,25,3,25,524,8,25,1,25,1,25,3,25,528,8,25,1,26,5,26,531,8, - 26,10,26,12,26,534,9,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26, - 3,26,544,8,26,1,26,1,26,5,26,548,8,26,10,26,12,26,551,9,26,1,26, - 1,26,1,27,1,27,1,27,1,27,1,27,1,27,3,27,561,8,27,1,28,1,28,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,29,1,29,1,29,1,29,1,29,1,29,1,30,1,30,3,30,587,8,30,1,30,1,30, - 3,30,591,8,30,1,30,1,30,1,30,1,30,3,30,597,8,30,1,30,1,30,1,30,1, - 30,1,30,1,30,1,30,5,30,606,8,30,10,30,12,30,609,9,30,1,30,1,30,1, - 30,1,30,1,30,1,30,3,30,617,8,30,1,30,1,30,5,30,621,8,30,10,30,12, - 30,624,9,30,1,30,1,30,3,30,628,8,30,3,30,630,8,30,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,32,1,32,1,32, - 1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,5,32,659, - 8,32,10,32,12,32,662,9,32,1,32,3,32,665,8,32,1,32,1,32,1,32,1,32, - 3,32,671,8,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32, + 78,2,79,7,79,2,80,7,80,2,81,7,81,2,82,7,82,1,0,1,0,1,0,1,0,1,0,1, + 0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,179,8,0,1,1,1,1,1,1,5,1,184,8,1,10, + 1,12,1,187,9,1,1,1,1,1,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1, + 3,1,3,1,3,1,3,5,3,205,8,3,10,3,12,3,208,9,3,1,3,1,3,1,4,1,4,1,4, + 1,4,1,4,1,4,1,4,1,4,3,4,220,8,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5, + 1,5,1,5,3,5,232,8,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7, + 1,7,1,7,1,7,1,8,1,8,1,8,1,8,3,8,252,8,8,1,9,1,9,1,9,1,9,1,9,1,9, + 3,9,260,8,9,1,9,1,9,1,10,5,10,265,8,10,10,10,12,10,268,9,10,1,10, + 1,10,1,10,3,10,273,8,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10, + 5,10,283,8,10,10,10,12,10,286,9,10,3,10,288,8,10,1,10,1,10,5,10, + 292,8,10,10,10,12,10,295,9,10,1,10,1,10,1,11,1,11,1,11,1,11,5,11, + 303,8,11,10,11,12,11,306,9,11,1,11,1,11,1,12,1,12,1,12,1,12,3,12, + 314,8,12,1,12,1,12,1,12,1,12,1,12,1,12,5,12,322,8,12,10,12,12,12, + 325,9,12,3,12,327,8,12,3,12,329,8,12,1,13,1,13,3,13,333,8,13,1,14, + 1,14,1,14,1,14,5,14,339,8,14,10,14,12,14,342,9,14,1,14,1,14,1,15, + 1,15,1,15,1,15,1,15,1,15,1,15,3,15,353,8,15,1,16,1,16,1,16,3,16, + 358,8,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,3,17,368,8,17,1, + 18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,3,18,378,8,18,1,18,1,18,1, + 19,3,19,383,8,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1, + 19,1,19,1,19,1,19,3,19,398,8,19,1,19,1,19,1,19,1,20,3,20,404,8,20, + 1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,5,20,414,8,20,10,20,12,20, + 417,9,20,1,20,1,20,1,21,1,21,1,21,1,21,3,21,425,8,21,1,21,1,21,1, + 21,1,21,1,21,1,21,3,21,433,8,21,1,21,1,21,1,21,1,21,1,21,1,21,3, + 21,441,8,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1, + 21,3,21,454,8,21,1,22,3,22,457,8,22,1,22,1,22,1,22,1,22,1,22,1,22, + 1,22,1,22,3,22,467,8,22,1,22,1,22,3,22,471,8,22,1,22,1,22,5,22,475, + 8,22,10,22,12,22,478,9,22,1,22,1,22,1,23,1,23,3,23,484,8,23,1,24, + 1,24,1,24,1,24,3,24,490,8,24,1,24,1,24,1,24,1,24,1,24,1,24,3,24, + 498,8,24,1,24,1,24,1,24,1,24,1,24,1,24,3,24,506,8,24,1,24,1,24,1, + 24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,3,24,519,8,24,1,25,1, + 25,1,25,1,25,1,25,3,25,526,8,25,1,25,1,25,3,25,530,8,25,1,26,5,26, + 533,8,26,10,26,12,26,536,9,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26, + 1,26,3,26,546,8,26,1,26,1,26,5,26,550,8,26,10,26,12,26,553,9,26, + 1,26,1,26,1,27,1,27,1,27,1,27,1,27,1,27,3,27,563,8,27,1,28,1,28, + 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,29,1,29,1,29,1,29,1,29,1,29,1,30,1,30,3,30,589,8,30,1,30, + 1,30,3,30,593,8,30,1,30,1,30,1,30,1,30,3,30,599,8,30,1,30,1,30,1, + 30,1,30,1,30,1,30,1,30,5,30,608,8,30,10,30,12,30,611,9,30,1,30,1, + 30,1,30,1,30,1,30,1,30,3,30,619,8,30,1,30,1,30,5,30,623,8,30,10, + 30,12,30,626,9,30,1,30,1,30,3,30,630,8,30,3,30,632,8,30,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,32,1,32, + 1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,5,32, + 661,8,32,10,32,12,32,664,9,32,1,32,3,32,667,8,32,1,32,1,32,1,32, + 1,32,3,32,673,8,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32, 1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32, - 1,32,1,32,3,32,698,8,32,1,33,1,33,1,33,1,33,1,33,1,34,1,34,1,34, - 3,34,708,8,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,3,34, - 719,8,34,1,34,3,34,722,8,34,1,34,1,34,1,34,3,34,727,8,34,1,34,3, - 34,730,8,34,1,34,1,34,1,35,1,35,1,35,3,35,737,8,35,1,35,1,35,1,35, - 1,35,1,35,1,35,1,35,3,35,746,8,35,1,35,3,35,749,8,35,1,35,3,35,752, - 8,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,37,1,37,1,37,3,37,769,8,37,1,38,1,38,1,38,1,38,1,38,5,38,776,8, - 38,10,38,12,38,779,9,38,1,38,1,38,1,39,1,39,1,39,1,39,1,39,1,39, - 1,39,1,39,1,39,3,39,792,8,39,1,39,1,39,1,40,1,40,1,40,1,41,1,41, - 1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,5,42,811,8,42, - 10,42,12,42,814,9,42,3,42,816,8,42,1,42,3,42,819,8,42,1,43,1,43, - 1,43,5,43,824,8,43,10,43,12,43,827,9,43,1,44,1,44,1,44,5,44,832, - 8,44,10,44,12,44,835,9,44,1,44,1,44,1,45,1,45,1,45,1,45,1,45,1,45, + 1,32,1,32,1,32,3,32,700,8,32,1,33,1,33,1,33,1,33,1,33,1,34,1,34, + 1,34,3,34,710,8,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34, + 3,34,721,8,34,1,34,3,34,724,8,34,1,34,1,34,1,34,3,34,729,8,34,1, + 34,3,34,732,8,34,1,34,1,34,1,35,1,35,1,35,3,35,739,8,35,1,35,1,35, + 1,35,1,35,1,35,1,35,1,35,3,35,748,8,35,1,35,3,35,751,8,35,1,35,3, + 35,754,8,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,37,1,37,1,37,3,37,771,8,37,1,38,1,38,1,38,1,38,1,38,5, + 38,778,8,38,10,38,12,38,781,9,38,1,38,1,38,1,39,1,39,1,39,1,39,1, + 39,1,39,1,39,1,39,1,39,3,39,794,8,39,1,39,1,39,1,40,1,40,1,40,1, + 41,1,41,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,5,42,813, + 8,42,10,42,12,42,816,9,42,3,42,818,8,42,1,42,3,42,821,8,42,1,43, + 1,43,1,43,5,43,826,8,43,10,43,12,43,829,9,43,1,44,1,44,1,44,5,44, + 834,8,44,10,44,12,44,837,9,44,1,44,1,44,1,45,1,45,1,45,1,45,1,45, 1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45, 1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45, - 1,45,1,45,1,45,3,45,874,8,45,1,45,3,45,877,8,45,1,45,1,45,3,45,881, - 8,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45, - 1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,3,45,903,8,45,1,45,1,45, - 1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,3,45,917,8,45, - 1,46,1,46,1,46,1,46,5,46,923,8,46,10,46,12,46,926,9,46,1,46,1,46, - 1,47,1,47,1,48,1,48,1,48,1,49,1,49,3,49,937,8,49,1,50,1,50,1,50, - 1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,3,50,951,8,50,1,50, - 1,50,1,51,1,51,1,51,1,51,1,51,1,51,3,51,961,8,51,1,52,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,53,1,53, - 3,53,979,8,53,1,53,1,53,3,53,983,8,53,1,53,3,53,986,8,53,1,53,1, - 53,3,53,990,8,53,1,53,3,53,993,8,53,1,53,1,53,1,54,1,54,1,54,1,54, - 1,54,3,54,1002,8,54,1,54,1,54,3,54,1006,8,54,1,54,1,54,3,54,1010, - 8,54,1,54,1,54,5,54,1014,8,54,10,54,12,54,1017,9,54,1,54,1,54,1, - 55,1,55,1,55,1,55,1,55,1,55,1,55,3,55,1028,8,55,1,56,1,56,1,56,1, - 56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,5,57,1041,8,57,10,57,12,57, - 1044,9,57,1,57,1,57,1,57,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,1063,8,58,1,59,1,59,1,59,1,59, - 1,59,5,59,1070,8,59,10,59,12,59,1073,9,59,1,59,1,59,1,60,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,61,1, - 61,1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,62,3,62,1104, - 8,62,1,62,1,62,1,63,1,63,1,63,1,63,1,64,1,64,1,64,1,64,1,64,1,64, - 1,64,1,64,1,64,1,64,1,64,1,64,3,64,1124,8,64,1,65,1,65,1,65,1,65, - 1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65, - 1,65,3,65,1144,8,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65, - 1154,8,65,1,65,3,65,1157,8,65,1,65,3,65,1160,8,65,3,65,1162,8,65, - 1,66,1,66,1,66,1,67,1,67,1,68,1,68,1,69,1,69,1,69,5,69,1174,8,69, - 10,69,12,69,1177,9,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,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,3, - 70,1200,8,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1, - 70,1,70,1,70,1,70,3,70,1216,8,70,1,70,1,70,1,70,1,70,1,70,1,70,1, - 70,3,70,1225,8,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,3,70,1235, - 8,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,5,70,1246,8,70, - 10,70,12,70,1249,9,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1, - 70,1,70,1,70,1,70,3,70,1263,8,70,1,70,1,70,1,70,1,70,1,70,1,70,1, - 70,1,70,1,70,1,70,3,70,1275,8,70,1,70,1,70,3,70,1279,8,70,1,71,1, - 71,1,71,1,71,1,71,1,71,1,71,3,71,1288,8,71,1,71,1,71,1,72,1,72,1, - 72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,3,72,1306, - 8,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72, - 1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,5,72,1328,8,72,10,72,12, - 72,1331,9,72,1,72,1,72,1,72,3,72,1336,8,72,3,72,1338,8,72,1,73,1, - 73,1,73,1,73,1,73,1,74,1,74,1,75,1,75,1,76,1,76,1,76,1,76,1,76,1, - 76,1,76,1,76,3,76,1357,8,76,1,77,1,77,1,77,1,77,5,77,1363,8,77,10, - 77,12,77,1366,9,77,3,77,1368,8,77,1,77,1,77,1,78,1,78,1,78,1,78, - 1,79,1,79,1,79,1,79,5,79,1380,8,79,10,79,12,79,1383,9,79,3,79,1385, - 8,79,1,79,1,79,1,80,1,80,1,81,1,81,1,81,0,0,82,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,0,9, + 1,45,1,45,1,45,1,45,3,45,876,8,45,1,45,3,45,879,8,45,1,45,1,45,3, + 45,883,8,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1, + 45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,3,45,905,8,45,1, + 45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,3,45,919, + 8,45,1,46,1,46,1,46,1,46,5,46,925,8,46,10,46,12,46,928,9,46,1,46, + 1,46,1,47,1,47,1,48,1,48,1,48,1,49,1,49,3,49,939,8,49,1,50,1,50, + 1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,3,50,953,8,50, + 1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,51,3,51,963,8,51,1,52,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,53, + 1,53,3,53,981,8,53,1,53,1,53,3,53,985,8,53,1,53,3,53,988,8,53,1, + 53,1,53,3,53,992,8,53,1,53,3,53,995,8,53,1,53,1,53,1,54,1,54,3,54, + 1001,8,54,1,54,1,54,3,54,1005,8,54,1,54,1,54,1,54,3,54,1010,8,54, + 1,54,1,54,3,54,1014,8,54,1,54,1,54,3,54,1018,8,54,1,54,1,54,5,54, + 1022,8,54,10,54,12,54,1025,9,54,1,54,1,54,1,55,1,55,1,56,1,56,1, + 56,1,56,1,56,1,56,1,56,3,56,1038,8,56,1,57,1,57,1,57,1,57,1,57,1, + 57,1,57,1,57,1,58,1,58,1,58,5,58,1051,8,58,10,58,12,58,1054,9,58, + 1,58,1,58,1,58,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,1073,8,59,1,60,1,60,1,60,1,60,1,60,5,60, + 1080,8,60,10,60,12,60,1083,9,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,62,1,62,1,62,1,62,1,62,1,62,1,62,1, + 62,1,62,1,62,1,62,1,63,1,63,1,63,1,63,1,63,1,63,3,63,1114,8,63,1, + 63,1,63,1,64,1,64,1,64,1,64,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1, + 65,1,65,1,65,1,65,1,65,3,65,1134,8,65,1,66,1,66,1,66,1,66,1,66,1, + 66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,3, + 66,1154,8,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,3,66,1164,8, + 66,1,66,3,66,1167,8,66,1,66,3,66,1170,8,66,3,66,1172,8,66,1,67,1, + 67,1,67,1,68,1,68,1,69,1,69,1,70,1,70,1,70,5,70,1184,8,70,10,70, + 12,70,1187,9,70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71, + 1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,3,71,1210, + 8,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71, + 1,71,1,71,3,71,1226,8,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,3,71, + 1235,8,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,3,71,1245,8,71, + 1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,5,71,1256,8,71,10,71, + 12,71,1259,9,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71, + 1,71,1,71,3,71,1273,8,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71, + 1,71,1,71,3,71,1285,8,71,1,71,1,71,3,71,1289,8,71,1,72,1,72,1,72, + 1,72,1,72,1,72,1,72,3,72,1298,8,72,1,72,1,72,1,73,1,73,1,73,1,73, + 1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,3,73,1316,8,73, + 1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73, + 1,73,1,73,1,73,1,73,1,73,1,73,1,73,5,73,1338,8,73,10,73,12,73,1341, + 9,73,1,73,1,73,1,73,3,73,1346,8,73,3,73,1348,8,73,1,74,1,74,1,74, + 1,74,1,74,1,75,1,75,1,76,1,76,1,77,1,77,1,77,1,77,1,77,1,77,1,77, + 1,77,3,77,1367,8,77,1,78,1,78,1,78,1,78,5,78,1373,8,78,10,78,12, + 78,1376,9,78,3,78,1378,8,78,1,78,1,78,1,79,1,79,1,79,1,79,1,80,1, + 80,1,80,1,80,5,80,1390,8,80,10,80,12,80,1393,9,80,3,80,1395,8,80, + 1,80,1,80,1,81,1,81,1,82,1,82,1,82,0,0,83,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,0,9, 2,0,15,15,33,33,1,0,11,12,1,0,101,105,3,0,1,1,96,100,102,103,3,0, 1,1,96,97,102,103,2,0,98,100,102,103,1,0,121,128,1,0,108,111,9,0, - 1,1,4,8,10,33,40,40,45,45,74,74,94,95,106,106,149,149,1508,0,176, - 1,0,0,0,2,178,1,0,0,0,4,188,1,0,0,0,6,192,1,0,0,0,8,217,1,0,0,0, - 10,229,1,0,0,0,12,231,1,0,0,0,14,238,1,0,0,0,16,249,1,0,0,0,18,251, - 1,0,0,0,20,264,1,0,0,0,22,296,1,0,0,0,24,326,1,0,0,0,26,328,1,0, - 0,0,28,332,1,0,0,0,30,350,1,0,0,0,32,352,1,0,0,0,34,365,1,0,0,0, - 36,367,1,0,0,0,38,380,1,0,0,0,40,401,1,0,0,0,42,451,1,0,0,0,44,454, - 1,0,0,0,46,479,1,0,0,0,48,516,1,0,0,0,50,527,1,0,0,0,52,532,1,0, - 0,0,54,560,1,0,0,0,56,562,1,0,0,0,58,572,1,0,0,0,60,584,1,0,0,0, - 62,631,1,0,0,0,64,697,1,0,0,0,66,699,1,0,0,0,68,704,1,0,0,0,70,733, - 1,0,0,0,72,755,1,0,0,0,74,768,1,0,0,0,76,770,1,0,0,0,78,782,1,0, - 0,0,80,795,1,0,0,0,82,798,1,0,0,0,84,818,1,0,0,0,86,820,1,0,0,0, - 88,828,1,0,0,0,90,916,1,0,0,0,92,918,1,0,0,0,94,929,1,0,0,0,96,931, - 1,0,0,0,98,936,1,0,0,0,100,938,1,0,0,0,102,960,1,0,0,0,104,962,1, - 0,0,0,106,971,1,0,0,0,108,996,1,0,0,0,110,1027,1,0,0,0,112,1029, - 1,0,0,0,114,1037,1,0,0,0,116,1062,1,0,0,0,118,1064,1,0,0,0,120,1076, - 1,0,0,0,122,1083,1,0,0,0,124,1097,1,0,0,0,126,1107,1,0,0,0,128,1123, - 1,0,0,0,130,1161,1,0,0,0,132,1163,1,0,0,0,134,1166,1,0,0,0,136,1168, - 1,0,0,0,138,1170,1,0,0,0,140,1278,1,0,0,0,142,1280,1,0,0,0,144,1337, - 1,0,0,0,146,1339,1,0,0,0,148,1344,1,0,0,0,150,1346,1,0,0,0,152,1356, - 1,0,0,0,154,1358,1,0,0,0,156,1371,1,0,0,0,158,1375,1,0,0,0,160,1388, - 1,0,0,0,162,1390,1,0,0,0,164,165,3,6,3,0,165,166,5,0,0,1,166,177, - 1,0,0,0,167,168,3,20,10,0,168,169,5,0,0,1,169,177,1,0,0,0,170,171, - 3,52,26,0,171,172,5,0,0,1,172,177,1,0,0,0,173,174,3,2,1,0,174,175, - 5,0,0,1,175,177,1,0,0,0,176,164,1,0,0,0,176,167,1,0,0,0,176,170, - 1,0,0,0,176,173,1,0,0,0,177,1,1,0,0,0,178,179,5,40,0,0,179,183,5, - 137,0,0,180,182,3,8,4,0,181,180,1,0,0,0,182,185,1,0,0,0,183,181, - 1,0,0,0,183,184,1,0,0,0,184,186,1,0,0,0,185,183,1,0,0,0,186,187, - 5,138,0,0,187,3,1,0,0,0,188,189,5,41,0,0,189,190,3,162,81,0,190, - 191,5,134,0,0,191,5,1,0,0,0,192,193,5,9,0,0,193,194,3,160,80,0,194, - 195,5,84,0,0,195,196,3,162,81,0,196,197,5,77,0,0,197,198,3,162,81, - 0,198,199,5,76,0,0,199,200,3,162,81,0,200,204,5,137,0,0,201,203, - 3,8,4,0,202,201,1,0,0,0,203,206,1,0,0,0,204,202,1,0,0,0,204,205, - 1,0,0,0,205,207,1,0,0,0,206,204,1,0,0,0,207,208,5,138,0,0,208,7, - 1,0,0,0,209,218,3,4,2,0,210,218,3,18,9,0,211,218,3,10,5,0,212,218, - 3,96,48,0,213,218,3,108,54,0,214,218,3,142,71,0,215,218,3,58,29, - 0,216,218,3,32,16,0,217,209,1,0,0,0,217,210,1,0,0,0,217,211,1,0, - 0,0,217,212,1,0,0,0,217,213,1,0,0,0,217,214,1,0,0,0,217,215,1,0, - 0,0,217,216,1,0,0,0,218,9,1,0,0,0,219,220,5,41,0,0,220,221,5,44, - 0,0,221,222,3,160,80,0,222,223,5,134,0,0,223,230,1,0,0,0,224,225, - 5,41,0,0,225,226,5,46,0,0,226,227,3,160,80,0,227,228,5,134,0,0,228, - 230,1,0,0,0,229,219,1,0,0,0,229,224,1,0,0,0,230,11,1,0,0,0,231,232, - 5,42,0,0,232,233,5,43,0,0,233,234,3,160,80,0,234,235,5,84,0,0,235, - 236,3,162,81,0,236,237,5,134,0,0,237,13,1,0,0,0,238,239,5,42,0,0, - 239,240,5,44,0,0,240,241,3,160,80,0,241,242,5,77,0,0,242,243,3,162, - 81,0,243,244,5,134,0,0,244,15,1,0,0,0,245,250,3,10,5,0,246,250,3, - 12,6,0,247,250,3,14,7,0,248,250,3,32,16,0,249,245,1,0,0,0,249,246, - 1,0,0,0,249,247,1,0,0,0,249,248,1,0,0,0,250,17,1,0,0,0,251,252,5, - 43,0,0,252,253,3,160,80,0,253,254,5,84,0,0,254,257,3,162,81,0,255, - 256,5,85,0,0,256,258,3,162,81,0,257,255,1,0,0,0,257,258,1,0,0,0, - 258,259,1,0,0,0,259,260,5,134,0,0,260,19,1,0,0,0,261,263,3,16,8, - 0,262,261,1,0,0,0,263,266,1,0,0,0,264,262,1,0,0,0,264,265,1,0,0, - 0,265,267,1,0,0,0,266,264,1,0,0,0,267,268,5,44,0,0,268,270,3,160, - 80,0,269,271,3,22,11,0,270,269,1,0,0,0,270,271,1,0,0,0,271,272,1, - 0,0,0,272,273,5,84,0,0,273,274,3,162,81,0,274,275,5,77,0,0,275,285, - 3,162,81,0,276,277,5,89,0,0,277,282,3,26,13,0,278,279,5,135,0,0, - 279,281,3,26,13,0,280,278,1,0,0,0,281,284,1,0,0,0,282,280,1,0,0, - 0,282,283,1,0,0,0,283,286,1,0,0,0,284,282,1,0,0,0,285,276,1,0,0, - 0,285,286,1,0,0,0,286,287,1,0,0,0,287,291,5,137,0,0,288,290,3,34, - 17,0,289,288,1,0,0,0,290,293,1,0,0,0,291,289,1,0,0,0,291,292,1,0, - 0,0,292,294,1,0,0,0,293,291,1,0,0,0,294,295,5,138,0,0,295,21,1,0, - 0,0,296,297,5,143,0,0,297,302,3,24,12,0,298,299,5,135,0,0,299,301, - 3,24,12,0,300,298,1,0,0,0,301,304,1,0,0,0,302,300,1,0,0,0,302,303, - 1,0,0,0,303,305,1,0,0,0,304,302,1,0,0,0,305,306,5,144,0,0,306,23, - 1,0,0,0,307,308,5,47,0,0,308,311,3,160,80,0,309,310,5,133,0,0,310, - 312,5,37,0,0,311,309,1,0,0,0,311,312,1,0,0,0,312,327,1,0,0,0,313, - 314,5,36,0,0,314,324,3,160,80,0,315,316,5,38,0,0,316,321,3,26,13, - 0,317,318,5,145,0,0,318,320,3,26,13,0,319,317,1,0,0,0,320,323,1, - 0,0,0,321,319,1,0,0,0,321,322,1,0,0,0,322,325,1,0,0,0,323,321,1, - 0,0,0,324,315,1,0,0,0,324,325,1,0,0,0,325,327,1,0,0,0,326,307,1, - 0,0,0,326,313,1,0,0,0,327,25,1,0,0,0,328,330,3,160,80,0,329,331, - 3,28,14,0,330,329,1,0,0,0,330,331,1,0,0,0,331,27,1,0,0,0,332,333, - 5,143,0,0,333,338,3,30,15,0,334,335,5,135,0,0,335,337,3,30,15,0, - 336,334,1,0,0,0,337,340,1,0,0,0,338,336,1,0,0,0,338,339,1,0,0,0, - 339,341,1,0,0,0,340,338,1,0,0,0,341,342,5,144,0,0,342,29,1,0,0,0, - 343,344,5,43,0,0,344,351,3,160,80,0,345,346,5,44,0,0,346,351,3,26, - 13,0,347,348,5,36,0,0,348,351,3,160,80,0,349,351,3,144,72,0,350, - 343,1,0,0,0,350,345,1,0,0,0,350,347,1,0,0,0,350,349,1,0,0,0,351, - 31,1,0,0,0,352,353,5,35,0,0,353,355,3,160,80,0,354,356,3,22,11,0, - 355,354,1,0,0,0,355,356,1,0,0,0,356,357,1,0,0,0,357,358,5,146,0, - 0,358,359,3,144,72,0,359,360,5,134,0,0,360,33,1,0,0,0,361,366,3, - 40,20,0,362,366,3,44,22,0,363,366,3,38,19,0,364,366,3,36,18,0,365, - 361,1,0,0,0,365,362,1,0,0,0,365,363,1,0,0,0,365,364,1,0,0,0,366, - 35,1,0,0,0,367,368,5,2,0,0,368,369,3,160,80,0,369,370,5,84,0,0,370, - 371,3,162,81,0,371,372,5,3,0,0,372,375,3,162,81,0,373,374,5,5,0, - 0,374,376,3,50,25,0,375,373,1,0,0,0,375,376,1,0,0,0,376,377,1,0, - 0,0,377,378,5,134,0,0,378,37,1,0,0,0,379,381,5,57,0,0,380,379,1, - 0,0,0,380,381,1,0,0,0,381,382,1,0,0,0,382,383,5,49,0,0,383,384,3, - 160,80,0,384,385,5,84,0,0,385,386,3,162,81,0,386,387,5,133,0,0,387, - 388,3,144,72,0,388,389,5,132,0,0,389,390,3,144,72,0,390,391,5,137, - 0,0,391,392,5,101,0,0,392,393,5,84,0,0,393,395,3,162,81,0,394,396, - 3,74,37,0,395,394,1,0,0,0,395,396,1,0,0,0,396,397,1,0,0,0,397,398, - 5,134,0,0,398,399,5,138,0,0,399,39,1,0,0,0,400,402,3,46,23,0,401, - 400,1,0,0,0,401,402,1,0,0,0,402,403,1,0,0,0,403,404,5,47,0,0,404, - 405,3,160,80,0,405,406,5,84,0,0,406,407,3,162,81,0,407,408,5,133, - 0,0,408,409,3,144,72,0,409,413,5,137,0,0,410,412,3,42,21,0,411,410, - 1,0,0,0,412,415,1,0,0,0,413,411,1,0,0,0,413,414,1,0,0,0,414,416, - 1,0,0,0,415,413,1,0,0,0,416,417,5,138,0,0,417,41,1,0,0,0,418,419, - 5,91,0,0,419,420,5,84,0,0,420,422,3,162,81,0,421,423,3,74,37,0,422, - 421,1,0,0,0,422,423,1,0,0,0,423,424,1,0,0,0,424,425,5,134,0,0,425, - 452,1,0,0,0,426,427,5,92,0,0,427,428,5,84,0,0,428,430,3,162,81,0, - 429,431,3,74,37,0,430,429,1,0,0,0,430,431,1,0,0,0,431,432,1,0,0, - 0,432,433,5,134,0,0,433,452,1,0,0,0,434,435,5,1,0,0,435,436,5,84, - 0,0,436,438,3,162,81,0,437,439,3,74,37,0,438,437,1,0,0,0,438,439, - 1,0,0,0,439,440,1,0,0,0,440,441,5,134,0,0,441,452,1,0,0,0,442,443, - 5,93,0,0,443,444,5,94,0,0,444,445,5,84,0,0,445,446,3,162,81,0,446, - 447,5,95,0,0,447,448,5,84,0,0,448,449,3,162,81,0,449,450,5,134,0, - 0,450,452,1,0,0,0,451,418,1,0,0,0,451,426,1,0,0,0,451,434,1,0,0, - 0,451,442,1,0,0,0,452,43,1,0,0,0,453,455,3,46,23,0,454,453,1,0,0, - 0,454,455,1,0,0,0,455,456,1,0,0,0,456,457,5,48,0,0,457,458,3,160, - 80,0,458,459,5,84,0,0,459,460,3,162,81,0,460,461,5,133,0,0,461,462, - 3,150,75,0,462,464,3,50,25,0,463,465,5,112,0,0,464,463,1,0,0,0,464, - 465,1,0,0,0,465,468,1,0,0,0,466,467,5,82,0,0,467,469,3,162,81,0, - 468,466,1,0,0,0,468,469,1,0,0,0,469,470,1,0,0,0,470,474,5,137,0, - 0,471,473,3,48,24,0,472,471,1,0,0,0,473,476,1,0,0,0,474,472,1,0, - 0,0,474,475,1,0,0,0,475,477,1,0,0,0,476,474,1,0,0,0,477,478,5,138, - 0,0,478,45,1,0,0,0,479,481,5,32,0,0,480,482,7,0,0,0,481,480,1,0, - 0,0,481,482,1,0,0,0,482,47,1,0,0,0,483,484,5,98,0,0,484,485,5,84, - 0,0,485,487,3,162,81,0,486,488,3,74,37,0,487,486,1,0,0,0,487,488, - 1,0,0,0,488,489,1,0,0,0,489,490,5,134,0,0,490,517,1,0,0,0,491,492, - 5,99,0,0,492,493,5,84,0,0,493,495,3,162,81,0,494,496,3,74,37,0,495, - 494,1,0,0,0,495,496,1,0,0,0,496,497,1,0,0,0,497,498,5,134,0,0,498, - 517,1,0,0,0,499,500,5,100,0,0,500,501,5,84,0,0,501,503,3,162,81, - 0,502,504,3,74,37,0,503,502,1,0,0,0,503,504,1,0,0,0,504,505,1,0, - 0,0,505,506,5,134,0,0,506,517,1,0,0,0,507,508,5,93,0,0,508,509,5, - 94,0,0,509,510,5,84,0,0,510,511,3,162,81,0,511,512,5,95,0,0,512, - 513,5,84,0,0,513,514,3,162,81,0,514,515,5,134,0,0,515,517,1,0,0, - 0,516,483,1,0,0,0,516,491,1,0,0,0,516,499,1,0,0,0,516,507,1,0,0, - 0,517,49,1,0,0,0,518,519,5,43,0,0,519,528,3,160,80,0,520,521,5,44, - 0,0,521,523,3,160,80,0,522,524,3,28,14,0,523,522,1,0,0,0,523,524, - 1,0,0,0,524,528,1,0,0,0,525,526,5,36,0,0,526,528,3,160,80,0,527, - 518,1,0,0,0,527,520,1,0,0,0,527,525,1,0,0,0,528,51,1,0,0,0,529,531, - 3,16,8,0,530,529,1,0,0,0,531,534,1,0,0,0,532,530,1,0,0,0,532,533, - 1,0,0,0,533,535,1,0,0,0,534,532,1,0,0,0,535,536,5,46,0,0,536,537, - 3,160,80,0,537,538,5,84,0,0,538,539,3,162,81,0,539,540,5,77,0,0, - 540,543,3,162,81,0,541,542,5,78,0,0,542,544,5,147,0,0,543,541,1, - 0,0,0,543,544,1,0,0,0,544,545,1,0,0,0,545,549,5,137,0,0,546,548, - 3,54,27,0,547,546,1,0,0,0,548,551,1,0,0,0,549,547,1,0,0,0,549,550, - 1,0,0,0,550,552,1,0,0,0,551,549,1,0,0,0,552,553,5,138,0,0,553,53, - 1,0,0,0,554,561,3,68,34,0,555,561,3,70,35,0,556,561,3,78,39,0,557, - 561,3,60,30,0,558,561,3,62,31,0,559,561,3,56,28,0,560,554,1,0,0, - 0,560,555,1,0,0,0,560,556,1,0,0,0,560,557,1,0,0,0,560,558,1,0,0, - 0,560,559,1,0,0,0,561,55,1,0,0,0,562,563,5,2,0,0,563,564,3,160,80, - 0,564,565,5,84,0,0,565,566,3,162,81,0,566,567,5,38,0,0,567,568,3, - 26,13,0,568,569,5,136,0,0,569,570,3,160,80,0,570,571,5,134,0,0,571, - 57,1,0,0,0,572,573,5,4,0,0,573,574,3,160,80,0,574,575,5,84,0,0,575, - 576,3,162,81,0,576,577,5,6,0,0,577,578,3,26,13,0,578,579,5,65,0, - 0,579,580,3,160,80,0,580,581,5,136,0,0,581,582,3,160,80,0,582,583, - 5,134,0,0,583,59,1,0,0,0,584,586,5,22,0,0,585,587,5,40,0,0,586,585, - 1,0,0,0,586,587,1,0,0,0,587,588,1,0,0,0,588,590,3,160,80,0,589,591, - 3,22,11,0,590,589,1,0,0,0,590,591,1,0,0,0,591,592,1,0,0,0,592,593, - 5,84,0,0,593,594,3,162,81,0,594,596,5,25,0,0,595,597,5,9,0,0,596, - 595,1,0,0,0,596,597,1,0,0,0,597,598,1,0,0,0,598,599,3,26,13,0,599, - 600,5,26,0,0,600,629,3,162,81,0,601,602,5,49,0,0,602,603,3,162,81, - 0,603,607,5,137,0,0,604,606,3,64,32,0,605,604,1,0,0,0,606,609,1, - 0,0,0,607,605,1,0,0,0,607,608,1,0,0,0,608,610,1,0,0,0,609,607,1, - 0,0,0,610,611,5,138,0,0,611,630,1,0,0,0,612,613,5,40,0,0,613,616, - 3,162,81,0,614,615,5,49,0,0,615,617,3,162,81,0,616,614,1,0,0,0,616, - 617,1,0,0,0,617,627,1,0,0,0,618,622,5,137,0,0,619,621,3,64,32,0, - 620,619,1,0,0,0,621,624,1,0,0,0,622,620,1,0,0,0,622,623,1,0,0,0, - 623,625,1,0,0,0,624,622,1,0,0,0,625,628,5,138,0,0,626,628,5,134, - 0,0,627,618,1,0,0,0,627,626,1,0,0,0,628,630,1,0,0,0,629,601,1,0, - 0,0,629,612,1,0,0,0,630,61,1,0,0,0,631,632,5,22,0,0,632,633,3,160, - 80,0,633,634,5,84,0,0,634,635,3,162,81,0,635,636,5,24,0,0,636,637, - 3,160,80,0,637,638,3,28,14,0,638,639,5,134,0,0,639,63,1,0,0,0,640, - 641,5,16,0,0,641,698,5,134,0,0,642,643,5,17,0,0,643,644,5,18,0,0, - 644,645,3,160,80,0,645,646,5,134,0,0,646,698,1,0,0,0,647,648,5,27, - 0,0,648,649,3,162,81,0,649,650,5,134,0,0,650,698,1,0,0,0,651,652, - 5,27,0,0,652,653,3,160,80,0,653,654,5,136,0,0,654,664,3,160,80,0, - 655,656,5,64,0,0,656,660,5,137,0,0,657,659,3,66,33,0,658,657,1,0, - 0,0,659,662,1,0,0,0,660,658,1,0,0,0,660,661,1,0,0,0,661,663,1,0, - 0,0,662,660,1,0,0,0,663,665,5,138,0,0,664,655,1,0,0,0,664,665,1, - 0,0,0,665,666,1,0,0,0,666,667,5,134,0,0,667,698,1,0,0,0,668,670, - 5,28,0,0,669,671,5,36,0,0,670,669,1,0,0,0,670,671,1,0,0,0,671,672, - 1,0,0,0,672,673,3,160,80,0,673,674,5,55,0,0,674,675,3,26,13,0,675, - 676,5,134,0,0,676,698,1,0,0,0,677,678,5,29,0,0,678,679,3,160,80, - 0,679,680,5,147,0,0,680,681,5,134,0,0,681,698,1,0,0,0,682,683,5, - 30,0,0,683,684,3,26,13,0,684,685,5,136,0,0,685,686,3,160,80,0,686, - 687,3,160,80,0,687,688,3,162,81,0,688,689,5,134,0,0,689,698,1,0, - 0,0,690,691,5,93,0,0,691,698,5,134,0,0,692,693,5,31,0,0,693,694, - 5,147,0,0,694,695,3,162,81,0,695,696,5,134,0,0,696,698,1,0,0,0,697, - 640,1,0,0,0,697,642,1,0,0,0,697,647,1,0,0,0,697,651,1,0,0,0,697, - 668,1,0,0,0,697,677,1,0,0,0,697,682,1,0,0,0,697,690,1,0,0,0,697, - 692,1,0,0,0,698,65,1,0,0,0,699,700,3,160,80,0,700,701,5,58,0,0,701, - 702,3,160,80,0,702,703,5,134,0,0,703,67,1,0,0,0,704,705,5,49,0,0, - 705,707,3,160,80,0,706,708,3,22,11,0,707,706,1,0,0,0,707,708,1,0, - 0,0,708,709,1,0,0,0,709,710,5,84,0,0,710,711,3,162,81,0,711,712, - 5,133,0,0,712,713,3,144,72,0,713,714,5,132,0,0,714,715,3,144,72, - 0,715,716,5,86,0,0,716,718,3,82,41,0,717,719,3,74,37,0,718,717,1, - 0,0,0,718,719,1,0,0,0,719,721,1,0,0,0,720,722,3,80,40,0,721,720, - 1,0,0,0,721,722,1,0,0,0,722,723,1,0,0,0,723,724,5,88,0,0,724,726, - 3,84,42,0,725,727,3,88,44,0,726,725,1,0,0,0,726,727,1,0,0,0,727, - 729,1,0,0,0,728,730,3,72,36,0,729,728,1,0,0,0,729,730,1,0,0,0,730, - 731,1,0,0,0,731,732,5,134,0,0,732,69,1,0,0,0,733,734,5,50,0,0,734, - 736,3,160,80,0,735,737,3,22,11,0,736,735,1,0,0,0,736,737,1,0,0,0, - 737,738,1,0,0,0,738,739,5,84,0,0,739,740,3,162,81,0,740,741,5,133, - 0,0,741,742,3,144,72,0,742,743,5,132,0,0,743,745,3,144,72,0,744, - 746,3,74,37,0,745,744,1,0,0,0,745,746,1,0,0,0,746,748,1,0,0,0,747, - 749,3,88,44,0,748,747,1,0,0,0,748,749,1,0,0,0,749,751,1,0,0,0,750, - 752,3,72,36,0,751,750,1,0,0,0,751,752,1,0,0,0,752,753,1,0,0,0,753, - 754,5,134,0,0,754,71,1,0,0,0,755,756,5,66,0,0,756,757,5,65,0,0,757, - 758,3,160,80,0,758,73,1,0,0,0,759,760,5,10,0,0,760,769,5,13,0,0, - 761,762,5,10,0,0,762,763,7,1,0,0,763,764,5,14,0,0,764,765,5,139, - 0,0,765,766,3,86,43,0,766,767,5,140,0,0,767,769,1,0,0,0,768,759, - 1,0,0,0,768,761,1,0,0,0,769,75,1,0,0,0,770,771,5,65,0,0,771,772, - 5,139,0,0,772,777,3,126,63,0,773,774,5,135,0,0,774,776,3,126,63, - 0,775,773,1,0,0,0,776,779,1,0,0,0,777,775,1,0,0,0,777,778,1,0,0, - 0,778,780,1,0,0,0,779,777,1,0,0,0,780,781,5,140,0,0,781,77,1,0,0, - 0,782,783,5,51,0,0,783,784,3,160,80,0,784,785,5,84,0,0,785,786,3, - 162,81,0,786,787,5,52,0,0,787,788,3,160,80,0,788,789,5,133,0,0,789, - 791,3,144,72,0,790,792,3,88,44,0,791,790,1,0,0,0,791,792,1,0,0,0, - 792,793,1,0,0,0,793,794,5,134,0,0,794,79,1,0,0,0,795,796,5,87,0, - 0,796,797,3,144,72,0,797,81,1,0,0,0,798,799,7,2,0,0,799,83,1,0,0, - 0,800,819,5,90,0,0,801,802,5,43,0,0,802,819,3,160,80,0,803,804,5, - 36,0,0,804,819,3,160,80,0,805,806,5,45,0,0,806,815,5,139,0,0,807, - 812,3,26,13,0,808,809,5,135,0,0,809,811,3,26,13,0,810,808,1,0,0, - 0,811,814,1,0,0,0,812,810,1,0,0,0,812,813,1,0,0,0,813,816,1,0,0, - 0,814,812,1,0,0,0,815,807,1,0,0,0,815,816,1,0,0,0,816,817,1,0,0, - 0,817,819,5,140,0,0,818,800,1,0,0,0,818,801,1,0,0,0,818,803,1,0, - 0,0,818,805,1,0,0,0,819,85,1,0,0,0,820,825,3,160,80,0,821,822,5, - 135,0,0,822,824,3,160,80,0,823,821,1,0,0,0,824,827,1,0,0,0,825,823, - 1,0,0,0,825,826,1,0,0,0,826,87,1,0,0,0,827,825,1,0,0,0,828,829,5, - 89,0,0,829,833,5,137,0,0,830,832,3,90,45,0,831,830,1,0,0,0,832,835, - 1,0,0,0,833,831,1,0,0,0,833,834,1,0,0,0,834,836,1,0,0,0,835,833, - 1,0,0,0,836,837,5,138,0,0,837,89,1,0,0,0,838,839,5,23,0,0,839,840, - 3,160,80,0,840,841,5,84,0,0,841,842,3,162,81,0,842,843,5,139,0,0, - 843,844,3,86,43,0,844,845,5,140,0,0,845,846,5,134,0,0,846,917,1, - 0,0,0,847,848,5,61,0,0,848,849,3,160,80,0,849,850,5,84,0,0,850,851, - 3,162,81,0,851,852,5,133,0,0,852,853,3,144,72,0,853,854,3,92,46, - 0,854,855,5,134,0,0,855,917,1,0,0,0,856,857,5,62,0,0,857,858,3,160, - 80,0,858,859,5,84,0,0,859,860,3,162,81,0,860,861,5,133,0,0,861,862, - 3,150,75,0,862,863,3,50,25,0,863,864,3,92,46,0,864,865,5,134,0,0, - 865,917,1,0,0,0,866,867,5,44,0,0,867,868,3,160,80,0,868,869,5,84, - 0,0,869,870,3,162,81,0,870,871,5,133,0,0,871,873,3,160,80,0,872, - 874,3,28,14,0,873,872,1,0,0,0,873,874,1,0,0,0,874,876,1,0,0,0,875, - 877,3,76,38,0,876,875,1,0,0,0,876,877,1,0,0,0,877,880,1,0,0,0,878, - 879,5,18,0,0,879,881,5,53,0,0,880,878,1,0,0,0,880,881,1,0,0,0,881, - 882,1,0,0,0,882,883,5,134,0,0,883,917,1,0,0,0,884,885,5,7,0,0,885, - 886,3,160,80,0,886,887,5,84,0,0,887,888,3,162,81,0,888,889,5,133, - 0,0,889,890,3,160,80,0,890,891,5,53,0,0,891,892,3,144,72,0,892,893, - 5,134,0,0,893,917,1,0,0,0,894,895,5,51,0,0,895,896,3,160,80,0,896, - 897,5,84,0,0,897,898,3,162,81,0,898,899,5,133,0,0,899,902,3,160, - 80,0,900,901,5,53,0,0,901,903,3,144,72,0,902,900,1,0,0,0,902,903, - 1,0,0,0,903,904,1,0,0,0,904,905,5,134,0,0,905,917,1,0,0,0,906,907, - 5,22,0,0,907,908,3,160,80,0,908,909,5,84,0,0,909,910,3,162,81,0, - 910,911,5,133,0,0,911,912,3,160,80,0,912,913,5,136,0,0,913,914,3, - 160,80,0,914,915,5,134,0,0,915,917,1,0,0,0,916,838,1,0,0,0,916,847, - 1,0,0,0,916,856,1,0,0,0,916,866,1,0,0,0,916,884,1,0,0,0,916,894, - 1,0,0,0,916,906,1,0,0,0,917,91,1,0,0,0,918,919,5,139,0,0,919,924, - 3,94,47,0,920,921,5,135,0,0,921,923,3,94,47,0,922,920,1,0,0,0,923, - 926,1,0,0,0,924,922,1,0,0,0,924,925,1,0,0,0,925,927,1,0,0,0,926, - 924,1,0,0,0,927,928,5,140,0,0,928,93,1,0,0,0,929,930,7,3,0,0,930, - 95,1,0,0,0,931,932,5,60,0,0,932,933,3,98,49,0,933,97,1,0,0,0,934, - 937,3,100,50,0,935,937,3,104,52,0,936,934,1,0,0,0,936,935,1,0,0, - 0,937,99,1,0,0,0,938,939,5,61,0,0,939,940,3,160,80,0,940,941,5,84, - 0,0,941,942,3,162,81,0,942,943,5,71,0,0,943,944,3,160,80,0,944,945, - 5,133,0,0,945,946,3,144,72,0,946,947,5,72,0,0,947,950,3,102,51,0, - 948,949,5,73,0,0,949,951,3,152,76,0,950,948,1,0,0,0,950,951,1,0, - 0,0,951,952,1,0,0,0,952,953,5,134,0,0,953,101,1,0,0,0,954,961,5, - 106,0,0,955,956,5,107,0,0,956,957,5,141,0,0,957,958,3,144,72,0,958, - 959,5,142,0,0,959,961,1,0,0,0,960,954,1,0,0,0,960,955,1,0,0,0,961, - 103,1,0,0,0,962,963,5,62,0,0,963,964,3,160,80,0,964,965,5,84,0,0, - 965,966,3,162,81,0,966,967,5,137,0,0,967,968,3,106,53,0,968,969, - 3,106,53,0,969,970,5,138,0,0,970,105,1,0,0,0,971,972,3,50,25,0,972, - 973,5,63,0,0,973,974,3,160,80,0,974,975,5,84,0,0,975,976,3,162,81, - 0,976,978,3,150,75,0,977,979,5,112,0,0,978,977,1,0,0,0,978,979,1, - 0,0,0,979,982,1,0,0,0,980,981,5,79,0,0,981,983,3,162,81,0,982,980, - 1,0,0,0,982,983,1,0,0,0,983,985,1,0,0,0,984,986,5,81,0,0,985,984, - 1,0,0,0,985,986,1,0,0,0,986,989,1,0,0,0,987,988,5,82,0,0,988,990, - 3,162,81,0,989,987,1,0,0,0,989,990,1,0,0,0,990,992,1,0,0,0,991,993, - 5,83,0,0,992,991,1,0,0,0,992,993,1,0,0,0,993,994,1,0,0,0,994,995, - 5,134,0,0,995,107,1,0,0,0,996,997,5,54,0,0,997,998,3,160,80,0,998, - 999,5,55,0,0,999,1001,3,160,80,0,1000,1002,3,28,14,0,1001,1000,1, - 0,0,0,1001,1002,1,0,0,0,1002,1005,1,0,0,0,1003,1004,5,84,0,0,1004, - 1006,3,162,81,0,1005,1003,1,0,0,0,1005,1006,1,0,0,0,1006,1009,1, - 0,0,0,1007,1008,5,78,0,0,1008,1010,5,147,0,0,1009,1007,1,0,0,0,1009, - 1010,1,0,0,0,1010,1011,1,0,0,0,1011,1015,5,137,0,0,1012,1014,3,110, - 55,0,1013,1012,1,0,0,0,1014,1017,1,0,0,0,1015,1013,1,0,0,0,1015, - 1016,1,0,0,0,1016,1018,1,0,0,0,1017,1015,1,0,0,0,1018,1019,5,138, - 0,0,1019,109,1,0,0,0,1020,1021,5,59,0,0,1021,1028,3,98,49,0,1022, - 1028,3,124,62,0,1023,1028,3,120,60,0,1024,1028,3,114,57,0,1025,1028, - 3,122,61,0,1026,1028,3,112,56,0,1027,1020,1,0,0,0,1027,1022,1,0, - 0,0,1027,1023,1,0,0,0,1027,1024,1,0,0,0,1027,1025,1,0,0,0,1027,1026, - 1,0,0,0,1028,111,1,0,0,0,1029,1030,5,56,0,0,1030,1031,3,160,80,0, - 1031,1032,5,58,0,0,1032,1033,3,160,80,0,1033,1034,5,136,0,0,1034, - 1035,3,160,80,0,1035,1036,5,134,0,0,1036,113,1,0,0,0,1037,1038,5, - 8,0,0,1038,1042,5,137,0,0,1039,1041,3,116,58,0,1040,1039,1,0,0,0, - 1041,1044,1,0,0,0,1042,1040,1,0,0,0,1042,1043,1,0,0,0,1043,1045, - 1,0,0,0,1044,1042,1,0,0,0,1045,1046,5,138,0,0,1046,1047,5,134,0, - 0,1047,115,1,0,0,0,1048,1049,3,160,80,0,1049,1050,5,58,0,0,1050, - 1051,5,61,0,0,1051,1052,3,160,80,0,1052,1053,5,134,0,0,1053,1063, - 1,0,0,0,1054,1055,3,160,80,0,1055,1056,5,58,0,0,1056,1057,5,62,0, - 0,1057,1058,3,160,80,0,1058,1059,5,136,0,0,1059,1060,3,160,80,0, - 1060,1061,5,134,0,0,1061,1063,1,0,0,0,1062,1048,1,0,0,0,1062,1054, - 1,0,0,0,1063,117,1,0,0,0,1064,1065,3,26,13,0,1065,1066,5,18,0,0, - 1066,1071,5,53,0,0,1067,1068,5,136,0,0,1068,1070,3,160,80,0,1069, - 1067,1,0,0,0,1070,1073,1,0,0,0,1071,1069,1,0,0,0,1071,1072,1,0,0, - 0,1072,1074,1,0,0,0,1073,1071,1,0,0,0,1074,1075,5,134,0,0,1075,119, - 1,0,0,0,1076,1077,5,56,0,0,1077,1078,3,160,80,0,1078,1079,5,58,0, - 0,1079,1080,5,61,0,0,1080,1081,3,160,80,0,1081,1082,5,134,0,0,1082, - 121,1,0,0,0,1083,1084,5,68,0,0,1084,1085,3,160,80,0,1085,1086,5, - 69,0,0,1086,1087,5,70,0,0,1087,1088,5,65,0,0,1088,1089,5,51,0,0, - 1089,1090,3,160,80,0,1090,1091,5,67,0,0,1091,1092,5,62,0,0,1092, - 1093,3,160,80,0,1093,1094,5,136,0,0,1094,1095,3,160,80,0,1095,1096, - 5,134,0,0,1096,123,1,0,0,0,1097,1098,5,56,0,0,1098,1099,3,126,63, - 0,1099,1100,5,58,0,0,1100,1103,3,130,65,0,1101,1102,5,34,0,0,1102, - 1104,3,162,81,0,1103,1101,1,0,0,0,1103,1104,1,0,0,0,1104,1105,1, - 0,0,0,1105,1106,5,134,0,0,1106,125,1,0,0,0,1107,1108,3,160,80,0, - 1108,1109,5,136,0,0,1109,1110,3,128,64,0,1110,127,1,0,0,0,1111,1124, - 3,160,80,0,1112,1124,5,101,0,0,1113,1124,5,91,0,0,1114,1124,5,92, - 0,0,1115,1124,5,1,0,0,1116,1124,5,98,0,0,1117,1124,5,99,0,0,1118, - 1124,5,100,0,0,1119,1124,5,102,0,0,1120,1124,5,103,0,0,1121,1124, - 5,104,0,0,1122,1124,5,105,0,0,1123,1111,1,0,0,0,1123,1112,1,0,0, - 0,1123,1113,1,0,0,0,1123,1114,1,0,0,0,1123,1115,1,0,0,0,1123,1116, - 1,0,0,0,1123,1117,1,0,0,0,1123,1118,1,0,0,0,1123,1119,1,0,0,0,1123, - 1120,1,0,0,0,1123,1121,1,0,0,0,1123,1122,1,0,0,0,1124,129,1,0,0, - 0,1125,1126,5,80,0,0,1126,1127,5,136,0,0,1127,1162,3,160,80,0,1128, - 1129,5,61,0,0,1129,1130,3,160,80,0,1130,1131,5,136,0,0,1131,1132, - 3,134,67,0,1132,1162,1,0,0,0,1133,1134,5,62,0,0,1134,1135,3,160, - 80,0,1135,1136,5,136,0,0,1136,1137,3,160,80,0,1137,1138,5,136,0, - 0,1138,1139,3,136,68,0,1139,1162,1,0,0,0,1140,1141,5,44,0,0,1141, - 1143,3,160,80,0,1142,1144,3,28,14,0,1143,1142,1,0,0,0,1143,1144, - 1,0,0,0,1144,1145,1,0,0,0,1145,1146,5,136,0,0,1146,1147,3,126,63, - 0,1147,1162,1,0,0,0,1148,1149,5,46,0,0,1149,1150,3,160,80,0,1150, - 1151,5,136,0,0,1151,1153,3,160,80,0,1152,1154,3,28,14,0,1153,1152, - 1,0,0,0,1153,1154,1,0,0,0,1154,1156,1,0,0,0,1155,1157,3,138,69,0, - 1156,1155,1,0,0,0,1156,1157,1,0,0,0,1157,1159,1,0,0,0,1158,1160, - 3,132,66,0,1159,1158,1,0,0,0,1159,1160,1,0,0,0,1160,1162,1,0,0,0, - 1161,1125,1,0,0,0,1161,1128,1,0,0,0,1161,1133,1,0,0,0,1161,1140, - 1,0,0,0,1161,1148,1,0,0,0,1162,131,1,0,0,0,1163,1164,5,66,0,0,1164, - 1165,3,138,69,0,1165,133,1,0,0,0,1166,1167,7,4,0,0,1167,135,1,0, - 0,0,1168,1169,7,5,0,0,1169,137,1,0,0,0,1170,1171,5,64,0,0,1171,1175, - 5,137,0,0,1172,1174,3,140,70,0,1173,1172,1,0,0,0,1174,1177,1,0,0, - 0,1175,1173,1,0,0,0,1175,1176,1,0,0,0,1176,1178,1,0,0,0,1177,1175, - 1,0,0,0,1178,1179,5,138,0,0,1179,139,1,0,0,0,1180,1181,3,160,80, - 0,1181,1182,5,58,0,0,1182,1183,5,9,0,0,1183,1184,5,23,0,0,1184,1185, - 5,139,0,0,1185,1186,3,86,43,0,1186,1187,5,140,0,0,1187,1188,5,134, - 0,0,1188,1279,1,0,0,0,1189,1190,3,160,80,0,1190,1191,5,58,0,0,1191, - 1192,5,61,0,0,1192,1199,3,160,80,0,1193,1194,5,67,0,0,1194,1195, - 5,62,0,0,1195,1196,3,160,80,0,1196,1197,5,136,0,0,1197,1198,3,160, - 80,0,1198,1200,1,0,0,0,1199,1193,1,0,0,0,1199,1200,1,0,0,0,1200, - 1201,1,0,0,0,1201,1202,5,134,0,0,1202,1279,1,0,0,0,1203,1204,3,160, - 80,0,1204,1205,5,58,0,0,1205,1206,5,62,0,0,1206,1207,3,160,80,0, - 1207,1208,5,136,0,0,1208,1215,3,160,80,0,1209,1210,5,67,0,0,1210, - 1211,5,62,0,0,1211,1212,3,160,80,0,1212,1213,5,136,0,0,1213,1214, - 3,160,80,0,1214,1216,1,0,0,0,1215,1209,1,0,0,0,1215,1216,1,0,0,0, - 1216,1217,1,0,0,0,1217,1218,5,134,0,0,1218,1279,1,0,0,0,1219,1220, - 3,160,80,0,1220,1221,5,58,0,0,1221,1222,5,44,0,0,1222,1224,3,160, - 80,0,1223,1225,3,28,14,0,1224,1223,1,0,0,0,1224,1225,1,0,0,0,1225, - 1234,1,0,0,0,1226,1227,5,67,0,0,1227,1228,5,62,0,0,1228,1229,3,160, - 80,0,1229,1230,5,136,0,0,1230,1231,3,160,80,0,1231,1235,1,0,0,0, - 1232,1233,5,18,0,0,1233,1235,5,53,0,0,1234,1226,1,0,0,0,1234,1232, - 1,0,0,0,1234,1235,1,0,0,0,1235,1236,1,0,0,0,1236,1237,5,134,0,0, - 1237,1279,1,0,0,0,1238,1239,3,160,80,0,1239,1240,5,58,0,0,1240,1241, - 5,7,0,0,1241,1242,3,160,80,0,1242,1243,5,64,0,0,1243,1247,5,137, - 0,0,1244,1246,3,118,59,0,1245,1244,1,0,0,0,1246,1249,1,0,0,0,1247, - 1245,1,0,0,0,1247,1248,1,0,0,0,1248,1250,1,0,0,0,1249,1247,1,0,0, - 0,1250,1251,5,138,0,0,1251,1252,5,134,0,0,1252,1279,1,0,0,0,1253, - 1254,3,160,80,0,1254,1255,5,58,0,0,1255,1256,5,51,0,0,1256,1257, - 3,160,80,0,1257,1258,5,134,0,0,1258,1279,1,0,0,0,1259,1260,3,160, - 80,0,1260,1262,5,58,0,0,1261,1263,5,9,0,0,1262,1261,1,0,0,0,1262, - 1263,1,0,0,0,1263,1264,1,0,0,0,1264,1265,5,22,0,0,1265,1266,3,160, - 80,0,1266,1267,5,136,0,0,1267,1274,3,160,80,0,1268,1269,5,67,0,0, - 1269,1270,5,62,0,0,1270,1271,3,160,80,0,1271,1272,5,136,0,0,1272, - 1273,3,160,80,0,1273,1275,1,0,0,0,1274,1268,1,0,0,0,1274,1275,1, - 0,0,0,1275,1276,1,0,0,0,1276,1277,5,134,0,0,1277,1279,1,0,0,0,1278, - 1180,1,0,0,0,1278,1189,1,0,0,0,1278,1203,1,0,0,0,1278,1219,1,0,0, - 0,1278,1238,1,0,0,0,1278,1253,1,0,0,0,1278,1259,1,0,0,0,1279,141, - 1,0,0,0,1280,1281,5,51,0,0,1281,1282,3,160,80,0,1282,1283,5,58,0, - 0,1283,1284,3,160,80,0,1284,1285,5,136,0,0,1285,1287,3,160,80,0, - 1286,1288,3,138,69,0,1287,1286,1,0,0,0,1287,1288,1,0,0,0,1288,1289, - 1,0,0,0,1289,1290,5,134,0,0,1290,143,1,0,0,0,1291,1338,3,148,74, - 0,1292,1338,5,113,0,0,1293,1338,5,114,0,0,1294,1295,5,115,0,0,1295, - 1338,3,162,81,0,1296,1297,5,116,0,0,1297,1298,5,143,0,0,1298,1299, - 3,160,80,0,1299,1300,5,144,0,0,1300,1338,1,0,0,0,1301,1302,5,117, - 0,0,1302,1303,5,143,0,0,1303,1305,3,160,80,0,1304,1306,3,28,14,0, - 1305,1304,1,0,0,0,1305,1306,1,0,0,0,1306,1307,1,0,0,0,1307,1308, - 5,144,0,0,1308,1338,1,0,0,0,1309,1310,5,39,0,0,1310,1311,5,143,0, - 0,1311,1312,3,160,80,0,1312,1313,5,144,0,0,1313,1338,1,0,0,0,1314, - 1315,5,118,0,0,1315,1316,5,143,0,0,1316,1317,3,144,72,0,1317,1318, - 5,144,0,0,1318,1338,1,0,0,0,1319,1320,5,119,0,0,1320,1321,5,143, - 0,0,1321,1322,3,144,72,0,1322,1323,5,144,0,0,1323,1338,1,0,0,0,1324, - 1325,5,120,0,0,1325,1329,5,137,0,0,1326,1328,3,146,73,0,1327,1326, - 1,0,0,0,1328,1331,1,0,0,0,1329,1327,1,0,0,0,1329,1330,1,0,0,0,1330, - 1332,1,0,0,0,1331,1329,1,0,0,0,1332,1338,5,138,0,0,1333,1335,3,160, - 80,0,1334,1336,3,28,14,0,1335,1334,1,0,0,0,1335,1336,1,0,0,0,1336, - 1338,1,0,0,0,1337,1291,1,0,0,0,1337,1292,1,0,0,0,1337,1293,1,0,0, - 0,1337,1294,1,0,0,0,1337,1296,1,0,0,0,1337,1301,1,0,0,0,1337,1309, - 1,0,0,0,1337,1314,1,0,0,0,1337,1319,1,0,0,0,1337,1324,1,0,0,0,1337, - 1333,1,0,0,0,1338,145,1,0,0,0,1339,1340,3,160,80,0,1340,1341,5,133, - 0,0,1341,1342,3,144,72,0,1342,1343,5,134,0,0,1343,147,1,0,0,0,1344, - 1345,7,6,0,0,1345,149,1,0,0,0,1346,1347,7,7,0,0,1347,151,1,0,0,0, - 1348,1357,3,162,81,0,1349,1357,5,147,0,0,1350,1357,5,148,0,0,1351, - 1357,5,129,0,0,1352,1357,5,130,0,0,1353,1357,5,131,0,0,1354,1357, - 3,154,77,0,1355,1357,3,158,79,0,1356,1348,1,0,0,0,1356,1349,1,0, - 0,0,1356,1350,1,0,0,0,1356,1351,1,0,0,0,1356,1352,1,0,0,0,1356,1353, - 1,0,0,0,1356,1354,1,0,0,0,1356,1355,1,0,0,0,1357,153,1,0,0,0,1358, - 1367,5,137,0,0,1359,1364,3,156,78,0,1360,1361,5,135,0,0,1361,1363, - 3,156,78,0,1362,1360,1,0,0,0,1363,1366,1,0,0,0,1364,1362,1,0,0,0, - 1364,1365,1,0,0,0,1365,1368,1,0,0,0,1366,1364,1,0,0,0,1367,1359, - 1,0,0,0,1367,1368,1,0,0,0,1368,1369,1,0,0,0,1369,1370,5,138,0,0, - 1370,155,1,0,0,0,1371,1372,3,162,81,0,1372,1373,5,133,0,0,1373,1374, - 3,152,76,0,1374,157,1,0,0,0,1375,1384,5,139,0,0,1376,1381,3,152, - 76,0,1377,1378,5,135,0,0,1378,1380,3,152,76,0,1379,1377,1,0,0,0, - 1380,1383,1,0,0,0,1381,1379,1,0,0,0,1381,1382,1,0,0,0,1382,1385, - 1,0,0,0,1383,1381,1,0,0,0,1384,1376,1,0,0,0,1384,1385,1,0,0,0,1385, - 1386,1,0,0,0,1386,1387,5,140,0,0,1387,159,1,0,0,0,1388,1389,7,8, - 0,0,1389,161,1,0,0,0,1390,1391,5,150,0,0,1391,163,1,0,0,0,123,176, - 183,204,217,229,249,257,264,270,282,285,291,302,311,321,324,326, - 330,338,350,355,365,375,380,395,401,413,422,430,438,451,454,464, - 468,474,481,487,495,503,516,523,527,532,543,549,560,586,590,596, - 607,616,622,627,629,660,664,670,697,707,718,721,726,729,736,745, - 748,751,768,777,791,812,815,818,825,833,873,876,880,902,916,924, - 936,950,960,978,982,985,989,992,1001,1005,1009,1015,1027,1042,1062, - 1071,1103,1123,1143,1153,1156,1159,1161,1175,1199,1215,1224,1234, - 1247,1262,1274,1278,1287,1305,1329,1335,1337,1356,1364,1367,1381, - 1384 + 1,1,4,8,10,33,40,40,45,45,74,74,94,95,106,106,149,149,1519,0,178, + 1,0,0,0,2,180,1,0,0,0,4,190,1,0,0,0,6,194,1,0,0,0,8,219,1,0,0,0, + 10,231,1,0,0,0,12,233,1,0,0,0,14,240,1,0,0,0,16,251,1,0,0,0,18,253, + 1,0,0,0,20,266,1,0,0,0,22,298,1,0,0,0,24,328,1,0,0,0,26,330,1,0, + 0,0,28,334,1,0,0,0,30,352,1,0,0,0,32,354,1,0,0,0,34,367,1,0,0,0, + 36,369,1,0,0,0,38,382,1,0,0,0,40,403,1,0,0,0,42,453,1,0,0,0,44,456, + 1,0,0,0,46,481,1,0,0,0,48,518,1,0,0,0,50,529,1,0,0,0,52,534,1,0, + 0,0,54,562,1,0,0,0,56,564,1,0,0,0,58,574,1,0,0,0,60,586,1,0,0,0, + 62,633,1,0,0,0,64,699,1,0,0,0,66,701,1,0,0,0,68,706,1,0,0,0,70,735, + 1,0,0,0,72,757,1,0,0,0,74,770,1,0,0,0,76,772,1,0,0,0,78,784,1,0, + 0,0,80,797,1,0,0,0,82,800,1,0,0,0,84,820,1,0,0,0,86,822,1,0,0,0, + 88,830,1,0,0,0,90,918,1,0,0,0,92,920,1,0,0,0,94,931,1,0,0,0,96,933, + 1,0,0,0,98,938,1,0,0,0,100,940,1,0,0,0,102,962,1,0,0,0,104,964,1, + 0,0,0,106,973,1,0,0,0,108,998,1,0,0,0,110,1028,1,0,0,0,112,1037, + 1,0,0,0,114,1039,1,0,0,0,116,1047,1,0,0,0,118,1072,1,0,0,0,120,1074, + 1,0,0,0,122,1086,1,0,0,0,124,1093,1,0,0,0,126,1107,1,0,0,0,128,1117, + 1,0,0,0,130,1133,1,0,0,0,132,1171,1,0,0,0,134,1173,1,0,0,0,136,1176, + 1,0,0,0,138,1178,1,0,0,0,140,1180,1,0,0,0,142,1288,1,0,0,0,144,1290, + 1,0,0,0,146,1347,1,0,0,0,148,1349,1,0,0,0,150,1354,1,0,0,0,152,1356, + 1,0,0,0,154,1366,1,0,0,0,156,1368,1,0,0,0,158,1381,1,0,0,0,160,1385, + 1,0,0,0,162,1398,1,0,0,0,164,1400,1,0,0,0,166,167,3,6,3,0,167,168, + 5,0,0,1,168,179,1,0,0,0,169,170,3,20,10,0,170,171,5,0,0,1,171,179, + 1,0,0,0,172,173,3,52,26,0,173,174,5,0,0,1,174,179,1,0,0,0,175,176, + 3,2,1,0,176,177,5,0,0,1,177,179,1,0,0,0,178,166,1,0,0,0,178,169, + 1,0,0,0,178,172,1,0,0,0,178,175,1,0,0,0,179,1,1,0,0,0,180,181,5, + 40,0,0,181,185,5,137,0,0,182,184,3,8,4,0,183,182,1,0,0,0,184,187, + 1,0,0,0,185,183,1,0,0,0,185,186,1,0,0,0,186,188,1,0,0,0,187,185, + 1,0,0,0,188,189,5,138,0,0,189,3,1,0,0,0,190,191,5,41,0,0,191,192, + 3,164,82,0,192,193,5,134,0,0,193,5,1,0,0,0,194,195,5,9,0,0,195,196, + 3,162,81,0,196,197,5,84,0,0,197,198,3,164,82,0,198,199,5,77,0,0, + 199,200,3,164,82,0,200,201,5,76,0,0,201,202,3,164,82,0,202,206,5, + 137,0,0,203,205,3,8,4,0,204,203,1,0,0,0,205,208,1,0,0,0,206,204, + 1,0,0,0,206,207,1,0,0,0,207,209,1,0,0,0,208,206,1,0,0,0,209,210, + 5,138,0,0,210,7,1,0,0,0,211,220,3,4,2,0,212,220,3,18,9,0,213,220, + 3,10,5,0,214,220,3,96,48,0,215,220,3,108,54,0,216,220,3,144,72,0, + 217,220,3,58,29,0,218,220,3,32,16,0,219,211,1,0,0,0,219,212,1,0, + 0,0,219,213,1,0,0,0,219,214,1,0,0,0,219,215,1,0,0,0,219,216,1,0, + 0,0,219,217,1,0,0,0,219,218,1,0,0,0,220,9,1,0,0,0,221,222,5,41,0, + 0,222,223,5,44,0,0,223,224,3,162,81,0,224,225,5,134,0,0,225,232, + 1,0,0,0,226,227,5,41,0,0,227,228,5,46,0,0,228,229,3,162,81,0,229, + 230,5,134,0,0,230,232,1,0,0,0,231,221,1,0,0,0,231,226,1,0,0,0,232, + 11,1,0,0,0,233,234,5,42,0,0,234,235,5,43,0,0,235,236,3,162,81,0, + 236,237,5,84,0,0,237,238,3,164,82,0,238,239,5,134,0,0,239,13,1,0, + 0,0,240,241,5,42,0,0,241,242,5,44,0,0,242,243,3,162,81,0,243,244, + 5,77,0,0,244,245,3,164,82,0,245,246,5,134,0,0,246,15,1,0,0,0,247, + 252,3,10,5,0,248,252,3,12,6,0,249,252,3,14,7,0,250,252,3,32,16,0, + 251,247,1,0,0,0,251,248,1,0,0,0,251,249,1,0,0,0,251,250,1,0,0,0, + 252,17,1,0,0,0,253,254,5,43,0,0,254,255,3,162,81,0,255,256,5,84, + 0,0,256,259,3,164,82,0,257,258,5,85,0,0,258,260,3,164,82,0,259,257, + 1,0,0,0,259,260,1,0,0,0,260,261,1,0,0,0,261,262,5,134,0,0,262,19, + 1,0,0,0,263,265,3,16,8,0,264,263,1,0,0,0,265,268,1,0,0,0,266,264, + 1,0,0,0,266,267,1,0,0,0,267,269,1,0,0,0,268,266,1,0,0,0,269,270, + 5,44,0,0,270,272,3,162,81,0,271,273,3,22,11,0,272,271,1,0,0,0,272, + 273,1,0,0,0,273,274,1,0,0,0,274,275,5,84,0,0,275,276,3,164,82,0, + 276,277,5,77,0,0,277,287,3,164,82,0,278,279,5,89,0,0,279,284,3,26, + 13,0,280,281,5,135,0,0,281,283,3,26,13,0,282,280,1,0,0,0,283,286, + 1,0,0,0,284,282,1,0,0,0,284,285,1,0,0,0,285,288,1,0,0,0,286,284, + 1,0,0,0,287,278,1,0,0,0,287,288,1,0,0,0,288,289,1,0,0,0,289,293, + 5,137,0,0,290,292,3,34,17,0,291,290,1,0,0,0,292,295,1,0,0,0,293, + 291,1,0,0,0,293,294,1,0,0,0,294,296,1,0,0,0,295,293,1,0,0,0,296, + 297,5,138,0,0,297,21,1,0,0,0,298,299,5,143,0,0,299,304,3,24,12,0, + 300,301,5,135,0,0,301,303,3,24,12,0,302,300,1,0,0,0,303,306,1,0, + 0,0,304,302,1,0,0,0,304,305,1,0,0,0,305,307,1,0,0,0,306,304,1,0, + 0,0,307,308,5,144,0,0,308,23,1,0,0,0,309,310,5,47,0,0,310,313,3, + 162,81,0,311,312,5,133,0,0,312,314,5,37,0,0,313,311,1,0,0,0,313, + 314,1,0,0,0,314,329,1,0,0,0,315,316,5,36,0,0,316,326,3,162,81,0, + 317,318,5,38,0,0,318,323,3,26,13,0,319,320,5,145,0,0,320,322,3,26, + 13,0,321,319,1,0,0,0,322,325,1,0,0,0,323,321,1,0,0,0,323,324,1,0, + 0,0,324,327,1,0,0,0,325,323,1,0,0,0,326,317,1,0,0,0,326,327,1,0, + 0,0,327,329,1,0,0,0,328,309,1,0,0,0,328,315,1,0,0,0,329,25,1,0,0, + 0,330,332,3,162,81,0,331,333,3,28,14,0,332,331,1,0,0,0,332,333,1, + 0,0,0,333,27,1,0,0,0,334,335,5,143,0,0,335,340,3,30,15,0,336,337, + 5,135,0,0,337,339,3,30,15,0,338,336,1,0,0,0,339,342,1,0,0,0,340, + 338,1,0,0,0,340,341,1,0,0,0,341,343,1,0,0,0,342,340,1,0,0,0,343, + 344,5,144,0,0,344,29,1,0,0,0,345,346,5,43,0,0,346,353,3,162,81,0, + 347,348,5,44,0,0,348,353,3,26,13,0,349,350,5,36,0,0,350,353,3,162, + 81,0,351,353,3,146,73,0,352,345,1,0,0,0,352,347,1,0,0,0,352,349, + 1,0,0,0,352,351,1,0,0,0,353,31,1,0,0,0,354,355,5,35,0,0,355,357, + 3,162,81,0,356,358,3,22,11,0,357,356,1,0,0,0,357,358,1,0,0,0,358, + 359,1,0,0,0,359,360,5,146,0,0,360,361,3,146,73,0,361,362,5,134,0, + 0,362,33,1,0,0,0,363,368,3,40,20,0,364,368,3,44,22,0,365,368,3,38, + 19,0,366,368,3,36,18,0,367,363,1,0,0,0,367,364,1,0,0,0,367,365,1, + 0,0,0,367,366,1,0,0,0,368,35,1,0,0,0,369,370,5,2,0,0,370,371,3,162, + 81,0,371,372,5,84,0,0,372,373,3,164,82,0,373,374,5,3,0,0,374,377, + 3,164,82,0,375,376,5,5,0,0,376,378,3,50,25,0,377,375,1,0,0,0,377, + 378,1,0,0,0,378,379,1,0,0,0,379,380,5,134,0,0,380,37,1,0,0,0,381, + 383,5,57,0,0,382,381,1,0,0,0,382,383,1,0,0,0,383,384,1,0,0,0,384, + 385,5,49,0,0,385,386,3,162,81,0,386,387,5,84,0,0,387,388,3,164,82, + 0,388,389,5,133,0,0,389,390,3,146,73,0,390,391,5,132,0,0,391,392, + 3,146,73,0,392,393,5,137,0,0,393,394,5,101,0,0,394,395,5,84,0,0, + 395,397,3,164,82,0,396,398,3,74,37,0,397,396,1,0,0,0,397,398,1,0, + 0,0,398,399,1,0,0,0,399,400,5,134,0,0,400,401,5,138,0,0,401,39,1, + 0,0,0,402,404,3,46,23,0,403,402,1,0,0,0,403,404,1,0,0,0,404,405, + 1,0,0,0,405,406,5,47,0,0,406,407,3,162,81,0,407,408,5,84,0,0,408, + 409,3,164,82,0,409,410,5,133,0,0,410,411,3,146,73,0,411,415,5,137, + 0,0,412,414,3,42,21,0,413,412,1,0,0,0,414,417,1,0,0,0,415,413,1, + 0,0,0,415,416,1,0,0,0,416,418,1,0,0,0,417,415,1,0,0,0,418,419,5, + 138,0,0,419,41,1,0,0,0,420,421,5,91,0,0,421,422,5,84,0,0,422,424, + 3,164,82,0,423,425,3,74,37,0,424,423,1,0,0,0,424,425,1,0,0,0,425, + 426,1,0,0,0,426,427,5,134,0,0,427,454,1,0,0,0,428,429,5,92,0,0,429, + 430,5,84,0,0,430,432,3,164,82,0,431,433,3,74,37,0,432,431,1,0,0, + 0,432,433,1,0,0,0,433,434,1,0,0,0,434,435,5,134,0,0,435,454,1,0, + 0,0,436,437,5,1,0,0,437,438,5,84,0,0,438,440,3,164,82,0,439,441, + 3,74,37,0,440,439,1,0,0,0,440,441,1,0,0,0,441,442,1,0,0,0,442,443, + 5,134,0,0,443,454,1,0,0,0,444,445,5,93,0,0,445,446,5,94,0,0,446, + 447,5,84,0,0,447,448,3,164,82,0,448,449,5,95,0,0,449,450,5,84,0, + 0,450,451,3,164,82,0,451,452,5,134,0,0,452,454,1,0,0,0,453,420,1, + 0,0,0,453,428,1,0,0,0,453,436,1,0,0,0,453,444,1,0,0,0,454,43,1,0, + 0,0,455,457,3,46,23,0,456,455,1,0,0,0,456,457,1,0,0,0,457,458,1, + 0,0,0,458,459,5,48,0,0,459,460,3,162,81,0,460,461,5,84,0,0,461,462, + 3,164,82,0,462,463,5,133,0,0,463,464,3,152,76,0,464,466,3,50,25, + 0,465,467,5,112,0,0,466,465,1,0,0,0,466,467,1,0,0,0,467,470,1,0, + 0,0,468,469,5,82,0,0,469,471,3,164,82,0,470,468,1,0,0,0,470,471, + 1,0,0,0,471,472,1,0,0,0,472,476,5,137,0,0,473,475,3,48,24,0,474, + 473,1,0,0,0,475,478,1,0,0,0,476,474,1,0,0,0,476,477,1,0,0,0,477, + 479,1,0,0,0,478,476,1,0,0,0,479,480,5,138,0,0,480,45,1,0,0,0,481, + 483,5,32,0,0,482,484,7,0,0,0,483,482,1,0,0,0,483,484,1,0,0,0,484, + 47,1,0,0,0,485,486,5,98,0,0,486,487,5,84,0,0,487,489,3,164,82,0, + 488,490,3,74,37,0,489,488,1,0,0,0,489,490,1,0,0,0,490,491,1,0,0, + 0,491,492,5,134,0,0,492,519,1,0,0,0,493,494,5,99,0,0,494,495,5,84, + 0,0,495,497,3,164,82,0,496,498,3,74,37,0,497,496,1,0,0,0,497,498, + 1,0,0,0,498,499,1,0,0,0,499,500,5,134,0,0,500,519,1,0,0,0,501,502, + 5,100,0,0,502,503,5,84,0,0,503,505,3,164,82,0,504,506,3,74,37,0, + 505,504,1,0,0,0,505,506,1,0,0,0,506,507,1,0,0,0,507,508,5,134,0, + 0,508,519,1,0,0,0,509,510,5,93,0,0,510,511,5,94,0,0,511,512,5,84, + 0,0,512,513,3,164,82,0,513,514,5,95,0,0,514,515,5,84,0,0,515,516, + 3,164,82,0,516,517,5,134,0,0,517,519,1,0,0,0,518,485,1,0,0,0,518, + 493,1,0,0,0,518,501,1,0,0,0,518,509,1,0,0,0,519,49,1,0,0,0,520,521, + 5,43,0,0,521,530,3,162,81,0,522,523,5,44,0,0,523,525,3,162,81,0, + 524,526,3,28,14,0,525,524,1,0,0,0,525,526,1,0,0,0,526,530,1,0,0, + 0,527,528,5,36,0,0,528,530,3,162,81,0,529,520,1,0,0,0,529,522,1, + 0,0,0,529,527,1,0,0,0,530,51,1,0,0,0,531,533,3,16,8,0,532,531,1, + 0,0,0,533,536,1,0,0,0,534,532,1,0,0,0,534,535,1,0,0,0,535,537,1, + 0,0,0,536,534,1,0,0,0,537,538,5,46,0,0,538,539,3,162,81,0,539,540, + 5,84,0,0,540,541,3,164,82,0,541,542,5,77,0,0,542,545,3,164,82,0, + 543,544,5,78,0,0,544,546,5,147,0,0,545,543,1,0,0,0,545,546,1,0,0, + 0,546,547,1,0,0,0,547,551,5,137,0,0,548,550,3,54,27,0,549,548,1, + 0,0,0,550,553,1,0,0,0,551,549,1,0,0,0,551,552,1,0,0,0,552,554,1, + 0,0,0,553,551,1,0,0,0,554,555,5,138,0,0,555,53,1,0,0,0,556,563,3, + 68,34,0,557,563,3,70,35,0,558,563,3,78,39,0,559,563,3,60,30,0,560, + 563,3,62,31,0,561,563,3,56,28,0,562,556,1,0,0,0,562,557,1,0,0,0, + 562,558,1,0,0,0,562,559,1,0,0,0,562,560,1,0,0,0,562,561,1,0,0,0, + 563,55,1,0,0,0,564,565,5,2,0,0,565,566,3,162,81,0,566,567,5,84,0, + 0,567,568,3,164,82,0,568,569,5,38,0,0,569,570,3,26,13,0,570,571, + 5,136,0,0,571,572,3,162,81,0,572,573,5,134,0,0,573,57,1,0,0,0,574, + 575,5,4,0,0,575,576,3,162,81,0,576,577,5,84,0,0,577,578,3,164,82, + 0,578,579,5,6,0,0,579,580,3,26,13,0,580,581,5,65,0,0,581,582,3,162, + 81,0,582,583,5,136,0,0,583,584,3,162,81,0,584,585,5,134,0,0,585, + 59,1,0,0,0,586,588,5,22,0,0,587,589,5,40,0,0,588,587,1,0,0,0,588, + 589,1,0,0,0,589,590,1,0,0,0,590,592,3,162,81,0,591,593,3,22,11,0, + 592,591,1,0,0,0,592,593,1,0,0,0,593,594,1,0,0,0,594,595,5,84,0,0, + 595,596,3,164,82,0,596,598,5,25,0,0,597,599,5,9,0,0,598,597,1,0, + 0,0,598,599,1,0,0,0,599,600,1,0,0,0,600,601,3,26,13,0,601,602,5, + 26,0,0,602,631,3,164,82,0,603,604,5,49,0,0,604,605,3,164,82,0,605, + 609,5,137,0,0,606,608,3,64,32,0,607,606,1,0,0,0,608,611,1,0,0,0, + 609,607,1,0,0,0,609,610,1,0,0,0,610,612,1,0,0,0,611,609,1,0,0,0, + 612,613,5,138,0,0,613,632,1,0,0,0,614,615,5,40,0,0,615,618,3,164, + 82,0,616,617,5,49,0,0,617,619,3,164,82,0,618,616,1,0,0,0,618,619, + 1,0,0,0,619,629,1,0,0,0,620,624,5,137,0,0,621,623,3,64,32,0,622, + 621,1,0,0,0,623,626,1,0,0,0,624,622,1,0,0,0,624,625,1,0,0,0,625, + 627,1,0,0,0,626,624,1,0,0,0,627,630,5,138,0,0,628,630,5,134,0,0, + 629,620,1,0,0,0,629,628,1,0,0,0,630,632,1,0,0,0,631,603,1,0,0,0, + 631,614,1,0,0,0,632,61,1,0,0,0,633,634,5,22,0,0,634,635,3,162,81, + 0,635,636,5,84,0,0,636,637,3,164,82,0,637,638,5,24,0,0,638,639,3, + 162,81,0,639,640,3,28,14,0,640,641,5,134,0,0,641,63,1,0,0,0,642, + 643,5,16,0,0,643,700,5,134,0,0,644,645,5,17,0,0,645,646,5,18,0,0, + 646,647,3,162,81,0,647,648,5,134,0,0,648,700,1,0,0,0,649,650,5,27, + 0,0,650,651,3,164,82,0,651,652,5,134,0,0,652,700,1,0,0,0,653,654, + 5,27,0,0,654,655,3,162,81,0,655,656,5,136,0,0,656,666,3,162,81,0, + 657,658,5,64,0,0,658,662,5,137,0,0,659,661,3,66,33,0,660,659,1,0, + 0,0,661,664,1,0,0,0,662,660,1,0,0,0,662,663,1,0,0,0,663,665,1,0, + 0,0,664,662,1,0,0,0,665,667,5,138,0,0,666,657,1,0,0,0,666,667,1, + 0,0,0,667,668,1,0,0,0,668,669,5,134,0,0,669,700,1,0,0,0,670,672, + 5,28,0,0,671,673,5,36,0,0,672,671,1,0,0,0,672,673,1,0,0,0,673,674, + 1,0,0,0,674,675,3,162,81,0,675,676,5,55,0,0,676,677,3,26,13,0,677, + 678,5,134,0,0,678,700,1,0,0,0,679,680,5,29,0,0,680,681,3,162,81, + 0,681,682,5,147,0,0,682,683,5,134,0,0,683,700,1,0,0,0,684,685,5, + 30,0,0,685,686,3,26,13,0,686,687,5,136,0,0,687,688,3,162,81,0,688, + 689,3,162,81,0,689,690,3,164,82,0,690,691,5,134,0,0,691,700,1,0, + 0,0,692,693,5,93,0,0,693,700,5,134,0,0,694,695,5,31,0,0,695,696, + 5,147,0,0,696,697,3,164,82,0,697,698,5,134,0,0,698,700,1,0,0,0,699, + 642,1,0,0,0,699,644,1,0,0,0,699,649,1,0,0,0,699,653,1,0,0,0,699, + 670,1,0,0,0,699,679,1,0,0,0,699,684,1,0,0,0,699,692,1,0,0,0,699, + 694,1,0,0,0,700,65,1,0,0,0,701,702,3,162,81,0,702,703,5,58,0,0,703, + 704,3,162,81,0,704,705,5,134,0,0,705,67,1,0,0,0,706,707,5,49,0,0, + 707,709,3,162,81,0,708,710,3,22,11,0,709,708,1,0,0,0,709,710,1,0, + 0,0,710,711,1,0,0,0,711,712,5,84,0,0,712,713,3,164,82,0,713,714, + 5,133,0,0,714,715,3,146,73,0,715,716,5,132,0,0,716,717,3,146,73, + 0,717,718,5,86,0,0,718,720,3,82,41,0,719,721,3,74,37,0,720,719,1, + 0,0,0,720,721,1,0,0,0,721,723,1,0,0,0,722,724,3,80,40,0,723,722, + 1,0,0,0,723,724,1,0,0,0,724,725,1,0,0,0,725,726,5,88,0,0,726,728, + 3,84,42,0,727,729,3,88,44,0,728,727,1,0,0,0,728,729,1,0,0,0,729, + 731,1,0,0,0,730,732,3,72,36,0,731,730,1,0,0,0,731,732,1,0,0,0,732, + 733,1,0,0,0,733,734,5,134,0,0,734,69,1,0,0,0,735,736,5,50,0,0,736, + 738,3,162,81,0,737,739,3,22,11,0,738,737,1,0,0,0,738,739,1,0,0,0, + 739,740,1,0,0,0,740,741,5,84,0,0,741,742,3,164,82,0,742,743,5,133, + 0,0,743,744,3,146,73,0,744,745,5,132,0,0,745,747,3,146,73,0,746, + 748,3,74,37,0,747,746,1,0,0,0,747,748,1,0,0,0,748,750,1,0,0,0,749, + 751,3,88,44,0,750,749,1,0,0,0,750,751,1,0,0,0,751,753,1,0,0,0,752, + 754,3,72,36,0,753,752,1,0,0,0,753,754,1,0,0,0,754,755,1,0,0,0,755, + 756,5,134,0,0,756,71,1,0,0,0,757,758,5,66,0,0,758,759,5,65,0,0,759, + 760,3,162,81,0,760,73,1,0,0,0,761,762,5,10,0,0,762,771,5,13,0,0, + 763,764,5,10,0,0,764,765,7,1,0,0,765,766,5,14,0,0,766,767,5,139, + 0,0,767,768,3,86,43,0,768,769,5,140,0,0,769,771,1,0,0,0,770,761, + 1,0,0,0,770,763,1,0,0,0,771,75,1,0,0,0,772,773,5,65,0,0,773,774, + 5,139,0,0,774,779,3,128,64,0,775,776,5,135,0,0,776,778,3,128,64, + 0,777,775,1,0,0,0,778,781,1,0,0,0,779,777,1,0,0,0,779,780,1,0,0, + 0,780,782,1,0,0,0,781,779,1,0,0,0,782,783,5,140,0,0,783,77,1,0,0, + 0,784,785,5,51,0,0,785,786,3,162,81,0,786,787,5,84,0,0,787,788,3, + 164,82,0,788,789,5,52,0,0,789,790,3,162,81,0,790,791,5,133,0,0,791, + 793,3,146,73,0,792,794,3,88,44,0,793,792,1,0,0,0,793,794,1,0,0,0, + 794,795,1,0,0,0,795,796,5,134,0,0,796,79,1,0,0,0,797,798,5,87,0, + 0,798,799,3,146,73,0,799,81,1,0,0,0,800,801,7,2,0,0,801,83,1,0,0, + 0,802,821,5,90,0,0,803,804,5,43,0,0,804,821,3,162,81,0,805,806,5, + 36,0,0,806,821,3,162,81,0,807,808,5,45,0,0,808,817,5,139,0,0,809, + 814,3,26,13,0,810,811,5,135,0,0,811,813,3,26,13,0,812,810,1,0,0, + 0,813,816,1,0,0,0,814,812,1,0,0,0,814,815,1,0,0,0,815,818,1,0,0, + 0,816,814,1,0,0,0,817,809,1,0,0,0,817,818,1,0,0,0,818,819,1,0,0, + 0,819,821,5,140,0,0,820,802,1,0,0,0,820,803,1,0,0,0,820,805,1,0, + 0,0,820,807,1,0,0,0,821,85,1,0,0,0,822,827,3,162,81,0,823,824,5, + 135,0,0,824,826,3,162,81,0,825,823,1,0,0,0,826,829,1,0,0,0,827,825, + 1,0,0,0,827,828,1,0,0,0,828,87,1,0,0,0,829,827,1,0,0,0,830,831,5, + 89,0,0,831,835,5,137,0,0,832,834,3,90,45,0,833,832,1,0,0,0,834,837, + 1,0,0,0,835,833,1,0,0,0,835,836,1,0,0,0,836,838,1,0,0,0,837,835, + 1,0,0,0,838,839,5,138,0,0,839,89,1,0,0,0,840,841,5,23,0,0,841,842, + 3,162,81,0,842,843,5,84,0,0,843,844,3,164,82,0,844,845,5,139,0,0, + 845,846,3,86,43,0,846,847,5,140,0,0,847,848,5,134,0,0,848,919,1, + 0,0,0,849,850,5,61,0,0,850,851,3,162,81,0,851,852,5,84,0,0,852,853, + 3,164,82,0,853,854,5,133,0,0,854,855,3,146,73,0,855,856,3,92,46, + 0,856,857,5,134,0,0,857,919,1,0,0,0,858,859,5,62,0,0,859,860,3,162, + 81,0,860,861,5,84,0,0,861,862,3,164,82,0,862,863,5,133,0,0,863,864, + 3,152,76,0,864,865,3,50,25,0,865,866,3,92,46,0,866,867,5,134,0,0, + 867,919,1,0,0,0,868,869,5,44,0,0,869,870,3,162,81,0,870,871,5,84, + 0,0,871,872,3,164,82,0,872,873,5,133,0,0,873,875,3,162,81,0,874, + 876,3,28,14,0,875,874,1,0,0,0,875,876,1,0,0,0,876,878,1,0,0,0,877, + 879,3,76,38,0,878,877,1,0,0,0,878,879,1,0,0,0,879,882,1,0,0,0,880, + 881,5,18,0,0,881,883,5,53,0,0,882,880,1,0,0,0,882,883,1,0,0,0,883, + 884,1,0,0,0,884,885,5,134,0,0,885,919,1,0,0,0,886,887,5,7,0,0,887, + 888,3,162,81,0,888,889,5,84,0,0,889,890,3,164,82,0,890,891,5,133, + 0,0,891,892,3,162,81,0,892,893,5,53,0,0,893,894,3,146,73,0,894,895, + 5,134,0,0,895,919,1,0,0,0,896,897,5,51,0,0,897,898,3,162,81,0,898, + 899,5,84,0,0,899,900,3,164,82,0,900,901,5,133,0,0,901,904,3,162, + 81,0,902,903,5,53,0,0,903,905,3,146,73,0,904,902,1,0,0,0,904,905, + 1,0,0,0,905,906,1,0,0,0,906,907,5,134,0,0,907,919,1,0,0,0,908,909, + 5,22,0,0,909,910,3,162,81,0,910,911,5,84,0,0,911,912,3,164,82,0, + 912,913,5,133,0,0,913,914,3,162,81,0,914,915,5,136,0,0,915,916,3, + 162,81,0,916,917,5,134,0,0,917,919,1,0,0,0,918,840,1,0,0,0,918,849, + 1,0,0,0,918,858,1,0,0,0,918,868,1,0,0,0,918,886,1,0,0,0,918,896, + 1,0,0,0,918,908,1,0,0,0,919,91,1,0,0,0,920,921,5,139,0,0,921,926, + 3,94,47,0,922,923,5,135,0,0,923,925,3,94,47,0,924,922,1,0,0,0,925, + 928,1,0,0,0,926,924,1,0,0,0,926,927,1,0,0,0,927,929,1,0,0,0,928, + 926,1,0,0,0,929,930,5,140,0,0,930,93,1,0,0,0,931,932,7,3,0,0,932, + 95,1,0,0,0,933,934,5,60,0,0,934,935,3,98,49,0,935,97,1,0,0,0,936, + 939,3,100,50,0,937,939,3,104,52,0,938,936,1,0,0,0,938,937,1,0,0, + 0,939,99,1,0,0,0,940,941,5,61,0,0,941,942,3,162,81,0,942,943,5,84, + 0,0,943,944,3,164,82,0,944,945,5,71,0,0,945,946,3,162,81,0,946,947, + 5,133,0,0,947,948,3,146,73,0,948,949,5,72,0,0,949,952,3,102,51,0, + 950,951,5,73,0,0,951,953,3,154,77,0,952,950,1,0,0,0,952,953,1,0, + 0,0,953,954,1,0,0,0,954,955,5,134,0,0,955,101,1,0,0,0,956,963,5, + 106,0,0,957,958,5,107,0,0,958,959,5,141,0,0,959,960,3,146,73,0,960, + 961,5,142,0,0,961,963,1,0,0,0,962,956,1,0,0,0,962,957,1,0,0,0,963, + 103,1,0,0,0,964,965,5,62,0,0,965,966,3,162,81,0,966,967,5,84,0,0, + 967,968,3,164,82,0,968,969,5,137,0,0,969,970,3,106,53,0,970,971, + 3,106,53,0,971,972,5,138,0,0,972,105,1,0,0,0,973,974,3,50,25,0,974, + 975,5,63,0,0,975,976,3,162,81,0,976,977,5,84,0,0,977,978,3,164,82, + 0,978,980,3,152,76,0,979,981,5,112,0,0,980,979,1,0,0,0,980,981,1, + 0,0,0,981,984,1,0,0,0,982,983,5,79,0,0,983,985,3,164,82,0,984,982, + 1,0,0,0,984,985,1,0,0,0,985,987,1,0,0,0,986,988,5,81,0,0,987,986, + 1,0,0,0,987,988,1,0,0,0,988,991,1,0,0,0,989,990,5,82,0,0,990,992, + 3,164,82,0,991,989,1,0,0,0,991,992,1,0,0,0,992,994,1,0,0,0,993,995, + 5,83,0,0,994,993,1,0,0,0,994,995,1,0,0,0,995,996,1,0,0,0,996,997, + 5,134,0,0,997,107,1,0,0,0,998,1000,5,54,0,0,999,1001,3,22,11,0,1000, + 999,1,0,0,0,1000,1001,1,0,0,0,1001,1002,1,0,0,0,1002,1004,3,162, + 81,0,1003,1005,3,110,55,0,1004,1003,1,0,0,0,1004,1005,1,0,0,0,1005, + 1006,1,0,0,0,1006,1007,5,55,0,0,1007,1009,3,162,81,0,1008,1010,3, + 28,14,0,1009,1008,1,0,0,0,1009,1010,1,0,0,0,1010,1013,1,0,0,0,1011, + 1012,5,84,0,0,1012,1014,3,164,82,0,1013,1011,1,0,0,0,1013,1014,1, + 0,0,0,1014,1017,1,0,0,0,1015,1016,5,78,0,0,1016,1018,5,147,0,0,1017, + 1015,1,0,0,0,1017,1018,1,0,0,0,1018,1019,1,0,0,0,1019,1023,5,137, + 0,0,1020,1022,3,112,56,0,1021,1020,1,0,0,0,1022,1025,1,0,0,0,1023, + 1021,1,0,0,0,1023,1024,1,0,0,0,1024,1026,1,0,0,0,1025,1023,1,0,0, + 0,1026,1027,5,138,0,0,1027,109,1,0,0,0,1028,1029,3,28,14,0,1029, + 111,1,0,0,0,1030,1031,5,59,0,0,1031,1038,3,98,49,0,1032,1038,3,126, + 63,0,1033,1038,3,122,61,0,1034,1038,3,116,58,0,1035,1038,3,124,62, + 0,1036,1038,3,114,57,0,1037,1030,1,0,0,0,1037,1032,1,0,0,0,1037, + 1033,1,0,0,0,1037,1034,1,0,0,0,1037,1035,1,0,0,0,1037,1036,1,0,0, + 0,1038,113,1,0,0,0,1039,1040,5,56,0,0,1040,1041,3,162,81,0,1041, + 1042,5,58,0,0,1042,1043,3,162,81,0,1043,1044,5,136,0,0,1044,1045, + 3,162,81,0,1045,1046,5,134,0,0,1046,115,1,0,0,0,1047,1048,5,8,0, + 0,1048,1052,5,137,0,0,1049,1051,3,118,59,0,1050,1049,1,0,0,0,1051, + 1054,1,0,0,0,1052,1050,1,0,0,0,1052,1053,1,0,0,0,1053,1055,1,0,0, + 0,1054,1052,1,0,0,0,1055,1056,5,138,0,0,1056,1057,5,134,0,0,1057, + 117,1,0,0,0,1058,1059,3,162,81,0,1059,1060,5,58,0,0,1060,1061,5, + 61,0,0,1061,1062,3,162,81,0,1062,1063,5,134,0,0,1063,1073,1,0,0, + 0,1064,1065,3,162,81,0,1065,1066,5,58,0,0,1066,1067,5,62,0,0,1067, + 1068,3,162,81,0,1068,1069,5,136,0,0,1069,1070,3,162,81,0,1070,1071, + 5,134,0,0,1071,1073,1,0,0,0,1072,1058,1,0,0,0,1072,1064,1,0,0,0, + 1073,119,1,0,0,0,1074,1075,3,26,13,0,1075,1076,5,18,0,0,1076,1081, + 5,53,0,0,1077,1078,5,136,0,0,1078,1080,3,162,81,0,1079,1077,1,0, + 0,0,1080,1083,1,0,0,0,1081,1079,1,0,0,0,1081,1082,1,0,0,0,1082,1084, + 1,0,0,0,1083,1081,1,0,0,0,1084,1085,5,134,0,0,1085,121,1,0,0,0,1086, + 1087,5,56,0,0,1087,1088,3,162,81,0,1088,1089,5,58,0,0,1089,1090, + 5,61,0,0,1090,1091,3,162,81,0,1091,1092,5,134,0,0,1092,123,1,0,0, + 0,1093,1094,5,68,0,0,1094,1095,3,162,81,0,1095,1096,5,69,0,0,1096, + 1097,5,70,0,0,1097,1098,5,65,0,0,1098,1099,5,51,0,0,1099,1100,3, + 162,81,0,1100,1101,5,67,0,0,1101,1102,5,62,0,0,1102,1103,3,162,81, + 0,1103,1104,5,136,0,0,1104,1105,3,162,81,0,1105,1106,5,134,0,0,1106, + 125,1,0,0,0,1107,1108,5,56,0,0,1108,1109,3,128,64,0,1109,1110,5, + 58,0,0,1110,1113,3,132,66,0,1111,1112,5,34,0,0,1112,1114,3,164,82, + 0,1113,1111,1,0,0,0,1113,1114,1,0,0,0,1114,1115,1,0,0,0,1115,1116, + 5,134,0,0,1116,127,1,0,0,0,1117,1118,3,162,81,0,1118,1119,5,136, + 0,0,1119,1120,3,130,65,0,1120,129,1,0,0,0,1121,1134,3,162,81,0,1122, + 1134,5,101,0,0,1123,1134,5,91,0,0,1124,1134,5,92,0,0,1125,1134,5, + 1,0,0,1126,1134,5,98,0,0,1127,1134,5,99,0,0,1128,1134,5,100,0,0, + 1129,1134,5,102,0,0,1130,1134,5,103,0,0,1131,1134,5,104,0,0,1132, + 1134,5,105,0,0,1133,1121,1,0,0,0,1133,1122,1,0,0,0,1133,1123,1,0, + 0,0,1133,1124,1,0,0,0,1133,1125,1,0,0,0,1133,1126,1,0,0,0,1133,1127, + 1,0,0,0,1133,1128,1,0,0,0,1133,1129,1,0,0,0,1133,1130,1,0,0,0,1133, + 1131,1,0,0,0,1133,1132,1,0,0,0,1134,131,1,0,0,0,1135,1136,5,80,0, + 0,1136,1137,5,136,0,0,1137,1172,3,162,81,0,1138,1139,5,61,0,0,1139, + 1140,3,162,81,0,1140,1141,5,136,0,0,1141,1142,3,136,68,0,1142,1172, + 1,0,0,0,1143,1144,5,62,0,0,1144,1145,3,162,81,0,1145,1146,5,136, + 0,0,1146,1147,3,162,81,0,1147,1148,5,136,0,0,1148,1149,3,138,69, + 0,1149,1172,1,0,0,0,1150,1151,5,44,0,0,1151,1153,3,162,81,0,1152, + 1154,3,28,14,0,1153,1152,1,0,0,0,1153,1154,1,0,0,0,1154,1155,1,0, + 0,0,1155,1156,5,136,0,0,1156,1157,3,128,64,0,1157,1172,1,0,0,0,1158, + 1159,5,46,0,0,1159,1160,3,162,81,0,1160,1161,5,136,0,0,1161,1163, + 3,162,81,0,1162,1164,3,28,14,0,1163,1162,1,0,0,0,1163,1164,1,0,0, + 0,1164,1166,1,0,0,0,1165,1167,3,140,70,0,1166,1165,1,0,0,0,1166, + 1167,1,0,0,0,1167,1169,1,0,0,0,1168,1170,3,134,67,0,1169,1168,1, + 0,0,0,1169,1170,1,0,0,0,1170,1172,1,0,0,0,1171,1135,1,0,0,0,1171, + 1138,1,0,0,0,1171,1143,1,0,0,0,1171,1150,1,0,0,0,1171,1158,1,0,0, + 0,1172,133,1,0,0,0,1173,1174,5,66,0,0,1174,1175,3,140,70,0,1175, + 135,1,0,0,0,1176,1177,7,4,0,0,1177,137,1,0,0,0,1178,1179,7,5,0,0, + 1179,139,1,0,0,0,1180,1181,5,64,0,0,1181,1185,5,137,0,0,1182,1184, + 3,142,71,0,1183,1182,1,0,0,0,1184,1187,1,0,0,0,1185,1183,1,0,0,0, + 1185,1186,1,0,0,0,1186,1188,1,0,0,0,1187,1185,1,0,0,0,1188,1189, + 5,138,0,0,1189,141,1,0,0,0,1190,1191,3,162,81,0,1191,1192,5,58,0, + 0,1192,1193,5,9,0,0,1193,1194,5,23,0,0,1194,1195,5,139,0,0,1195, + 1196,3,86,43,0,1196,1197,5,140,0,0,1197,1198,5,134,0,0,1198,1289, + 1,0,0,0,1199,1200,3,162,81,0,1200,1201,5,58,0,0,1201,1202,5,61,0, + 0,1202,1209,3,162,81,0,1203,1204,5,67,0,0,1204,1205,5,62,0,0,1205, + 1206,3,162,81,0,1206,1207,5,136,0,0,1207,1208,3,162,81,0,1208,1210, + 1,0,0,0,1209,1203,1,0,0,0,1209,1210,1,0,0,0,1210,1211,1,0,0,0,1211, + 1212,5,134,0,0,1212,1289,1,0,0,0,1213,1214,3,162,81,0,1214,1215, + 5,58,0,0,1215,1216,5,62,0,0,1216,1217,3,162,81,0,1217,1218,5,136, + 0,0,1218,1225,3,162,81,0,1219,1220,5,67,0,0,1220,1221,5,62,0,0,1221, + 1222,3,162,81,0,1222,1223,5,136,0,0,1223,1224,3,162,81,0,1224,1226, + 1,0,0,0,1225,1219,1,0,0,0,1225,1226,1,0,0,0,1226,1227,1,0,0,0,1227, + 1228,5,134,0,0,1228,1289,1,0,0,0,1229,1230,3,162,81,0,1230,1231, + 5,58,0,0,1231,1232,5,44,0,0,1232,1234,3,162,81,0,1233,1235,3,28, + 14,0,1234,1233,1,0,0,0,1234,1235,1,0,0,0,1235,1244,1,0,0,0,1236, + 1237,5,67,0,0,1237,1238,5,62,0,0,1238,1239,3,162,81,0,1239,1240, + 5,136,0,0,1240,1241,3,162,81,0,1241,1245,1,0,0,0,1242,1243,5,18, + 0,0,1243,1245,5,53,0,0,1244,1236,1,0,0,0,1244,1242,1,0,0,0,1244, + 1245,1,0,0,0,1245,1246,1,0,0,0,1246,1247,5,134,0,0,1247,1289,1,0, + 0,0,1248,1249,3,162,81,0,1249,1250,5,58,0,0,1250,1251,5,7,0,0,1251, + 1252,3,162,81,0,1252,1253,5,64,0,0,1253,1257,5,137,0,0,1254,1256, + 3,120,60,0,1255,1254,1,0,0,0,1256,1259,1,0,0,0,1257,1255,1,0,0,0, + 1257,1258,1,0,0,0,1258,1260,1,0,0,0,1259,1257,1,0,0,0,1260,1261, + 5,138,0,0,1261,1262,5,134,0,0,1262,1289,1,0,0,0,1263,1264,3,162, + 81,0,1264,1265,5,58,0,0,1265,1266,5,51,0,0,1266,1267,3,162,81,0, + 1267,1268,5,134,0,0,1268,1289,1,0,0,0,1269,1270,3,162,81,0,1270, + 1272,5,58,0,0,1271,1273,5,9,0,0,1272,1271,1,0,0,0,1272,1273,1,0, + 0,0,1273,1274,1,0,0,0,1274,1275,5,22,0,0,1275,1276,3,162,81,0,1276, + 1277,5,136,0,0,1277,1284,3,162,81,0,1278,1279,5,67,0,0,1279,1280, + 5,62,0,0,1280,1281,3,162,81,0,1281,1282,5,136,0,0,1282,1283,3,162, + 81,0,1283,1285,1,0,0,0,1284,1278,1,0,0,0,1284,1285,1,0,0,0,1285, + 1286,1,0,0,0,1286,1287,5,134,0,0,1287,1289,1,0,0,0,1288,1190,1,0, + 0,0,1288,1199,1,0,0,0,1288,1213,1,0,0,0,1288,1229,1,0,0,0,1288,1248, + 1,0,0,0,1288,1263,1,0,0,0,1288,1269,1,0,0,0,1289,143,1,0,0,0,1290, + 1291,5,51,0,0,1291,1292,3,162,81,0,1292,1293,5,58,0,0,1293,1294, + 3,162,81,0,1294,1295,5,136,0,0,1295,1297,3,162,81,0,1296,1298,3, + 140,70,0,1297,1296,1,0,0,0,1297,1298,1,0,0,0,1298,1299,1,0,0,0,1299, + 1300,5,134,0,0,1300,145,1,0,0,0,1301,1348,3,150,75,0,1302,1348,5, + 113,0,0,1303,1348,5,114,0,0,1304,1305,5,115,0,0,1305,1348,3,164, + 82,0,1306,1307,5,116,0,0,1307,1308,5,143,0,0,1308,1309,3,162,81, + 0,1309,1310,5,144,0,0,1310,1348,1,0,0,0,1311,1312,5,117,0,0,1312, + 1313,5,143,0,0,1313,1315,3,162,81,0,1314,1316,3,28,14,0,1315,1314, + 1,0,0,0,1315,1316,1,0,0,0,1316,1317,1,0,0,0,1317,1318,5,144,0,0, + 1318,1348,1,0,0,0,1319,1320,5,39,0,0,1320,1321,5,143,0,0,1321,1322, + 3,162,81,0,1322,1323,5,144,0,0,1323,1348,1,0,0,0,1324,1325,5,118, + 0,0,1325,1326,5,143,0,0,1326,1327,3,146,73,0,1327,1328,5,144,0,0, + 1328,1348,1,0,0,0,1329,1330,5,119,0,0,1330,1331,5,143,0,0,1331,1332, + 3,146,73,0,1332,1333,5,144,0,0,1333,1348,1,0,0,0,1334,1335,5,120, + 0,0,1335,1339,5,137,0,0,1336,1338,3,148,74,0,1337,1336,1,0,0,0,1338, + 1341,1,0,0,0,1339,1337,1,0,0,0,1339,1340,1,0,0,0,1340,1342,1,0,0, + 0,1341,1339,1,0,0,0,1342,1348,5,138,0,0,1343,1345,3,162,81,0,1344, + 1346,3,28,14,0,1345,1344,1,0,0,0,1345,1346,1,0,0,0,1346,1348,1,0, + 0,0,1347,1301,1,0,0,0,1347,1302,1,0,0,0,1347,1303,1,0,0,0,1347,1304, + 1,0,0,0,1347,1306,1,0,0,0,1347,1311,1,0,0,0,1347,1319,1,0,0,0,1347, + 1324,1,0,0,0,1347,1329,1,0,0,0,1347,1334,1,0,0,0,1347,1343,1,0,0, + 0,1348,147,1,0,0,0,1349,1350,3,162,81,0,1350,1351,5,133,0,0,1351, + 1352,3,146,73,0,1352,1353,5,134,0,0,1353,149,1,0,0,0,1354,1355,7, + 6,0,0,1355,151,1,0,0,0,1356,1357,7,7,0,0,1357,153,1,0,0,0,1358,1367, + 3,164,82,0,1359,1367,5,147,0,0,1360,1367,5,148,0,0,1361,1367,5,129, + 0,0,1362,1367,5,130,0,0,1363,1367,5,131,0,0,1364,1367,3,156,78,0, + 1365,1367,3,160,80,0,1366,1358,1,0,0,0,1366,1359,1,0,0,0,1366,1360, + 1,0,0,0,1366,1361,1,0,0,0,1366,1362,1,0,0,0,1366,1363,1,0,0,0,1366, + 1364,1,0,0,0,1366,1365,1,0,0,0,1367,155,1,0,0,0,1368,1377,5,137, + 0,0,1369,1374,3,158,79,0,1370,1371,5,135,0,0,1371,1373,3,158,79, + 0,1372,1370,1,0,0,0,1373,1376,1,0,0,0,1374,1372,1,0,0,0,1374,1375, + 1,0,0,0,1375,1378,1,0,0,0,1376,1374,1,0,0,0,1377,1369,1,0,0,0,1377, + 1378,1,0,0,0,1378,1379,1,0,0,0,1379,1380,5,138,0,0,1380,157,1,0, + 0,0,1381,1382,3,164,82,0,1382,1383,5,133,0,0,1383,1384,3,154,77, + 0,1384,159,1,0,0,0,1385,1394,5,139,0,0,1386,1391,3,154,77,0,1387, + 1388,5,135,0,0,1388,1390,3,154,77,0,1389,1387,1,0,0,0,1390,1393, + 1,0,0,0,1391,1389,1,0,0,0,1391,1392,1,0,0,0,1392,1395,1,0,0,0,1393, + 1391,1,0,0,0,1394,1386,1,0,0,0,1394,1395,1,0,0,0,1395,1396,1,0,0, + 0,1396,1397,5,140,0,0,1397,161,1,0,0,0,1398,1399,7,8,0,0,1399,163, + 1,0,0,0,1400,1401,5,150,0,0,1401,165,1,0,0,0,125,178,185,206,219, + 231,251,259,266,272,284,287,293,304,313,323,326,328,332,340,352, + 357,367,377,382,397,403,415,424,432,440,453,456,466,470,476,483, + 489,497,505,518,525,529,534,545,551,562,588,592,598,609,618,624, + 629,631,662,666,672,699,709,720,723,728,731,738,747,750,753,770, + 779,793,814,817,820,827,835,875,878,882,904,918,926,938,952,962, + 980,984,987,991,994,1000,1004,1009,1013,1017,1023,1037,1052,1072, + 1081,1113,1133,1153,1163,1166,1169,1171,1185,1209,1225,1234,1244, + 1257,1272,1284,1288,1297,1315,1339,1345,1347,1366,1374,1377,1391, + 1394 ]; private static __ATN: antlr.ATN; @@ -8491,6 +8540,12 @@ export class ConformanceDeclContext extends antlr.ParserRuleContext { public RBRACE(): antlr.TerminalNode { return this.getToken(QuixosCapabilityParser.RBRACE, 0)!; } + public typeParameters(): TypeParametersContext | null { + return this.getRuleContext(0, TypeParametersContext); + } + public conformanceSourceArguments(): ConformanceSourceArgumentsContext | null { + return this.getRuleContext(0, ConformanceSourceArgumentsContext); + } public typeArguments(): TypeArgumentsContext | null { return this.getRuleContext(0, TypeArgumentsContext); } @@ -8528,6 +8583,26 @@ export class ConformanceDeclContext extends antlr.ParserRuleContext { } +export class ConformanceSourceArgumentsContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public typeArguments(): TypeArgumentsContext { + return this.getRuleContext(0, TypeArgumentsContext)!; + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_conformanceSourceArguments; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitConformanceSourceArguments) { + return visitor.visitConformanceSourceArguments(this); + } else { + return visitor.visitChildren(this); + } + } +} + + export class ConformanceItemContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); diff --git a/src/capability-language/generated/QuixosCapabilityVisitor.ts b/src/capability-language/generated/QuixosCapabilityVisitor.ts index b8d49b0..89688e3 100644 --- a/src/capability-language/generated/QuixosCapabilityVisitor.ts +++ b/src/capability-language/generated/QuixosCapabilityVisitor.ts @@ -57,6 +57,7 @@ import { StoragePolicyContext } from "./QuixosCapabilityParser.js"; import { EdgeDeclContext } from "./QuixosCapabilityParser.js"; import { EdgeEndpointContext } from "./QuixosCapabilityParser.js"; import { ConformanceDeclContext } from "./QuixosCapabilityParser.js"; +import { ConformanceSourceArgumentsContext } from "./QuixosCapabilityParser.js"; import { ConformanceItemContext } from "./QuixosCapabilityParser.js"; import { ModuleBindingDeclContext } from "./QuixosCapabilityParser.js"; import { InitializationDeclContext } from "./QuixosCapabilityParser.js"; @@ -424,6 +425,12 @@ export class QuixosCapabilityVisitor extends AbstractParseTreeVisitor Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.conformanceSourceArguments`. + * @param ctx the parse tree + * @return the visitor result + */ + visitConformanceSourceArguments?: (ctx: ConformanceSourceArgumentsContext) => Result; /** * Visit a parse tree produced by `QuixosCapabilityParser.conformanceItem`. * @param ctx the parse tree diff --git a/src/capability-language/generic-types.ts b/src/capability-language/generic-types.ts index 94a8420..e3303f2 100644 --- a/src/capability-language/generic-types.ts +++ b/src/capability-language/generic-types.ts @@ -34,6 +34,7 @@ export class GenericSourceTypes { readonly applications = new Map(); readonly aliases = new Map(); parameters = new Map(); + bindings = new Map(); self?: AtomId; private active: string[] = []; private applicationCount = 0; @@ -42,7 +43,7 @@ export class GenericSourceTypes { environment(): GenericTypeEnvironment { return { - arguments: new Map(), + arguments: this.bindings, aliases: this.aliases, self: this.self, applyInterface: (id, args) => this.apply(id, args).revisionId, diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index 66fca08..029d843 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -46,6 +46,8 @@ import { type GenericDependencyPort, specializePackageExport, } from "../capability-model/index.js"; +import { expandConformanceRules, type ConformanceRule } from "../capability-model/conformance-rules.js"; +import type { ClosedTypeArgument, TypeParameter } from "../capability-model/generics.js"; import { GenericSourceTypes } from "./generic-types.js"; import { defaultQueryBudgets, @@ -1992,14 +1994,140 @@ const lowerRelationshipMaterialization = ( : undefined; }; -const lowerConformance = ( +const withConformanceTypes = ( state: LoweringState, + atom: AtomId | undefined, + parameters: TypeParameter[], + bindings: Map, + run: () => T, +): T => { + const previous = { self: state.types.self, parameters: state.types.parameters, bindings: state.types.bindings }; + state.types.self = atom; + state.types.parameters = new Map(parameters.map((p) => [p.name, p])); + state.types.bindings = bindings; + try { + return run(); + } finally { + Object.assign(state.types, previous); + } +}; + +const lowerConformanceRule = (state: LoweringState, context: ConformanceDeclContext): ConformanceRule | undefined => { + if (!context.stringLiteral()) { + loweringIssue(state, context, "missing-rule-id", "Interface conformance rules require a stable ID"); + return undefined; + } + return withConformanceTypes(state, undefined, [], new Map(), () => { + const id = stringValue(context.stringLiteral()!); + const parameters = state.types.declareParameters( + context.typeParameters(), + JSON.stringify(["conformance-rule", id]), + ); + const source = state.types.interfaceByName( + identifier(context.identifier(0)), + context.conformanceSourceArguments()?.typeArguments() ?? null, + ); + const target = state.types.interfaceByName(identifier(context.identifier(1)), context.typeArguments()); + const targetDefinition = state.types.definitions.get(target.definitionId)!; + const applications = [source, target]; + const members = targetDefinition.template?.members ?? targetDefinition.members; + for (const item of context.conformanceItem()) { + if ( + item.attachmentDecl() || + item.initializationDecl() || + item.relationshipMaterializationDecl() || + item.stateFieldBindingDecl() + ) { + loweringIssue( + state, + item, + "unsupported-rule-storage", + "Rules support operation and module bindings, not private storage, initialization or materialization", + ); + continue; + } + const module = item.moduleBindingDecl(); + if (module) { + const pkg = requireSymbol(state, state.packages, identifier(module.identifier(1)), module, "package"); + const member = members.find((m) => m.displayName === identifier(module.identifier(0))); + if ( + member?.kind !== "module" || + !pkg?.definition?.modules?.some((m) => m.displayName === identifier(module.identifier(2))) + ) + loweringIssue(state, module, "invalid-module-binding", "Expected a module member and imported module export"); + } + const binding = item.operationBindingDecl(); + if (!binding) continue; + const ref = binding.memberOperationRef(); + const member = members.find((m) => m.displayName === identifier(ref.identifier())); + if (!member?.operations.some((op) => op.displayName === text(ref.operationName()))) + loweringIssue(state, ref, "unknown-operation", "Unknown target interface member operation"); + const provider = binding.operationProvider(); + if (provider.INTERFACE()) { + const application = state.types.interfaceByName(identifier(provider.identifier(0)), provider.typeArguments()); + applications.push(application); + const definition = state.types.definitions.get(application.definitionId)!; + const targetRef = provider.memberOperationRef()!; + if ( + !(definition.template?.members ?? definition.members) + .find((m) => m.displayName === identifier(targetRef.identifier())) + ?.operations.some((op) => op.displayName === text(targetRef.operationName())) + ) + loweringIssue(state, provider, "unknown-operation", "Unknown forwarding member operation"); + } else if (provider.PACKAGE()) { + const pkg = requireSymbol(state, state.packages, identifier(provider.identifier(0)), provider, "package"); + const name = identifier(provider.identifier(1)); + if (pkg && !pkg.exports.has(name)) + loweringIssue(state, provider, "unknown-export", `Unknown package export ${name}`); + const arguments_ = state.types.arguments(provider.typeArguments()); + const exportDefinition = pkg?.definition?.genericExports?.find((entry) => entry.displayName === name); + const expected = exportDefinition?.parameters ?? []; + if (expected.length !== arguments_.length || expected.some((p, i) => p.kind !== arguments_[i]?.kind)) + loweringIssue(state, provider, "parameter-kind", "Package export argument kinds or arity do not match"); + for (const block of [ + provider.dependencyBindingBlock(), + provider.acceptanceBinding()?.dependencyBindingBlock(), + ]) { + for (const dependency of block?.dependencyBinding() ?? []) { + if (dependency.INTERFACE()) + applications.push( + state.types.interfaceByName(identifier(dependency.identifier(1)), dependency.typeArguments()), + ); + } + } + } else { + loweringIssue( + state, + provider, + "unsupported-rule-provider", + "Rule operations forward an interface or bind a package export", + ); + } + } + state.types.validateTemplate({ + ...targetDefinition, + template: { + parameters, + members: [], + requires: applications, + usesSelf: false, + aliases: [...state.types.aliases.values()], + }, + }); + return { id, parameters, source, target }; + }); +}; + +const lowerConformanceBody = ( + parent: LoweringState, context: ConformanceDeclContext, privateAttachments: PersistentAttachment[], + implementingAtom?: AtomId, ): WorkspaceRevision["conformances"][number] | undefined => { + const state = { ...parent, interfaces: new Map(parent.interfaces) }; const atomName = identifier(context.identifier(0)); const interfaceName = identifier(context.identifier(1)); - const atomId = requireSymbol(state, state.atoms, atomName, context, "atom"); + const atomId = implementingAtom ?? requireSymbol(state, state.atoms, atomName, context, "atom"); let interfaceSymbol = requireSymbol(state, state.interfaces, interfaceName, context, "interface"); if (!atomId || !interfaceSymbol) { return undefined; @@ -2461,7 +2589,7 @@ const lowerWorkspace = ( } } const conformance = item.conformanceDecl(); - if (conformance) { + if (conformance && !state.interfaces.has(identifier(conformance.identifier(0)))) { state.types.self = state.atoms.get(identifier(conformance.identifier(0))); const attachments = conformance.conformanceItem().flatMap((entry) => { const declaration = entry.attachmentDecl(); @@ -2480,16 +2608,93 @@ const lowerWorkspace = ( } } - const conformances = items.flatMap((item) => { - const context = item.conformanceDecl(); - if (!context) { - return []; + const contexts = items.flatMap((item) => item.conformanceDecl() ?? []); + const rules = new Map(); + const direct: ConformanceDeclContext[] = []; + for (const declaration of contexts) { + const name = identifier(declaration.identifier(0)); + if (state.interfaces.has(name) && state.atoms.has(name)) { + loweringIssue(state, declaration, "ambiguous-conformance-source", name + " names both an atom and an interface"); + continue; } - const conformance = atGenericSource(context, () => - lowerConformance(state, context, privateAttachments.get(context) ?? []), + if (state.interfaces.has(name)) { + const rule = atGenericSource(declaration, () => lowerConformanceRule(state, declaration)); + if (rule) rules.set(rule, declaration); + } else { + if (declaration.typeParameters() || declaration.conformanceSourceArguments()) + loweringIssue(state, declaration, "invalid-conformance-source", "Only interface rules take source parameters"); + direct.push(declaration); + } + } + const origins = new Map(); + const conformances = direct.flatMap((declaration) => { + const atom = state.atoms.get(identifier(declaration.identifier(0))); + const result = atGenericSource(declaration, () => + withConformanceTypes(state, atom, [], new Map(), () => + lowerConformanceBody(state, declaration, privateAttachments.get(declaration) ?? []), + ), ); - return conformance ? [conformance] : []; + if (result) origins.set(result, declaration); + return result ? [result] : []; }); + if (!state.diagnostics.length) { + const applications = expandConformanceRules( + [...rules.keys()], + conformances, + state.types.definitions, + (atom, bindings) => ({ + ...state.types.environment(), + self: atom, + arguments: bindings, + applyInterface: (id, args) => + withConformanceTypes(state, atom, [], bindings, () => state.types.apply(id, args).revisionId), + }), + ); + for (const application of applications) { + const declaration = rules.get(application.rule)!; + const result = atGenericSource(declaration, () => + withConformanceTypes(state, application.atomId, application.rule.parameters, application.bindings, () => + lowerConformanceBody(state, declaration, [], application.atomId), + ), + ); + if (result) { + const generated = { + ...result, + id: application.id, + ruleOrigin: { + ruleId: application.rule.id, + sourceInterfaceRevisionId: application.sourceId, + line: declaration.start?.line ?? 0, + column: declaration.start?.column ?? 0, + }, + }; + conformances.push(generated); + origins.set(generated, declaration); + } + } + } + const candidates = new Map(); + for (const conformance of conformances) { + const key = JSON.stringify([conformance.atomId, conformance.interfaceRevisionId]); + const previous = candidates.get(key); + if (previous) { + const describe = (c: typeof conformance) => + c.ruleOrigin + ? "rule " + c.ruleOrigin.ruleId + " from " + c.ruleOrigin.sourceInterfaceRevisionId + : "conformance " + (c.id ?? "(unnamed)"); + const message = + "Duplicate conformance for " + + conformance.atomId + + " as " + + conformance.interfaceRevisionId + + ": " + + describe(previous) + + " conflicts with " + + describe(conformance); + for (const candidate of [previous, conformance]) + loweringIssue(state, origins.get(candidate)!, "duplicate-conformance", message); + } else candidates.set(key, conformance); + } const constructors = items.flatMap((item) => { const constructor = item.constructorBindingDecl(); diff --git a/src/capability-language/source-loader.ts b/src/capability-language/source-loader.ts index 89d63e5..01f086e 100644 --- a/src/capability-language/source-loader.ts +++ b/src/capability-language/source-loader.ts @@ -86,3 +86,21 @@ export const resolveQxSources = async (read: (name: string) => Promise, }; export const loadQxSources = (root: string) => resolveQxSources((name) => readQxSource(root, name)); + +/** The same validated closure used by compilation, for installation and pinning. */ +export const qxSourceManifest = async (root: string) => { + const resolved = await loadQxSources(root); + const syntax = parseQx(resolved.source); + const imports = [...walkSyntax(syntax.root)] + .filter((node) => node.kind === "resourceImportDecl") + .map((node) => { + const name = node.children.find((child) => child.kind === "identifier")!; + const kind = syntax.tokens.some( + (token) => token.start >= node.start && token.end <= node.end && token.kind === "INTERFACE", + ) + ? ("interface" as const) + : ("package" as const); + return { kind, binding: resolved.source.slice(name.start, name.end) }; + }); + return { sourceFiles: resolved.sourceFiles, imports }; +}; diff --git a/src/capability-language/tool-cli.ts b/src/capability-language/tool-cli.ts index c86a7ac..9e85703 100644 --- a/src/capability-language/tool-cli.ts +++ b/src/capability-language/tool-cli.ts @@ -2,7 +2,7 @@ import { readFile, writeFile, mkdtemp, rm, realpath } from "node:fs/promises"; import { parseQx, formatQx, lintQx } from "./source.js"; import { scaffoldAtom } from "./scaffold.js"; -import { loadQxSources } from "./source-loader.js"; +import { loadQxSources, qxSourceManifest } from "./source-loader.js"; import { createGitCapabilityResolver } from "./git-resolver.js"; import { planEvolution } from "../capability-model/index.js"; import { snapshotRepository } from "./candidate-check.js"; @@ -54,6 +54,11 @@ const planSummary = (plan: Awaited>) => ({ const main = async () => { const [command, ...args] = process.argv.slice(2); + if (command === "source-manifest") { + if (args.length !== 1) throw new Error("source-manifest WORKSPACE_ROOT"); + process.stdout.write(JSON.stringify(await qxSourceManifest(args[0])) + "\n"); + return; + } if (command === "scaffold-validate-qx") { if (args.length !== 1) throw new Error("scaffold-validate-qx SOURCES_JSON"); const sources = JSON.parse(args[0]); diff --git a/src/capability-model/conformance-rules.ts b/src/capability-model/conformance-rules.ts new file mode 100644 index 0000000..841e6b4 --- /dev/null +++ b/src/capability-model/conformance-rules.ts @@ -0,0 +1,208 @@ +import { createHash } from "node:crypto"; +import { + capabilityId, + type AtomId, + type Conformance, + type InterfaceRevision, + type InterfaceRevisionId, +} from "./types.js"; +import { + GenericTypeError, + TypeSubstitution, + bindTypeParameters, + canonicalTypeArgument, + type ClosedTypeArgument, + type GenericTypeEnvironment, + type InterfaceApplicationExpression, + type TypeParameter, +} from "./generics.js"; + +/** Compiler input only. Runtime plans contain ordinary closed conformances. */ +export interface ConformanceRule { + id: string; + parameters: TypeParameter[]; + source: InterfaceApplicationExpression; + target: InterfaceApplicationExpression; +} +export interface RuleApplication { + rule: ConformanceRule; + atomId: AtomId; + sourceId: InterfaceRevisionId; + targetId: InterfaceRevisionId; + bindings: Map; + id: Conformance["id"]; +} +const parameterId = (argument: ConformanceRule["source"]["arguments"][number]) => { + const value = argument.kind === "value" ? argument.type : argument.target; + return value.kind === "parameter" ? value.parameterId : undefined; +}; +const hasParameter = (node: unknown): boolean => + !!node && + typeof node === "object" && + (("kind" in node && node.kind === "parameter") || Object.values(node).some(hasParameter)); + +export function validateConformanceRules( + rules: readonly ConformanceRule[], + definitions: ReadonlyMap, +) { + const ids = new Set(); + const graph = new Map(); + for (const rule of rules) { + if (ids.has(rule.id)) throw new GenericTypeError("duplicate-rule-id", rule.id, `Duplicate rule ID ${rule.id}`); + ids.add(rule.id); + for (const application of [ + rule.source, + rule.target, + ...rule.parameters.flatMap((p) => (p.kind === "object" ? p.implements : [])), + ]) { + const definition = definitions.get(application.definitionId); + if (!definition) + throw new GenericTypeError("unknown-interface", rule.id, `Unknown interface ${application.definitionId}`); + const parameters = definition.template?.parameters ?? []; + if (parameters.length !== application.arguments.length) + throw new GenericTypeError("type-arity", rule.id, `Wrong arity for ${definition.displayName}`); + parameters.forEach((p, i) => { + if (p.kind !== application.arguments[i].kind) + throw new GenericTypeError( + "parameter-kind", + rule.id, + `Wrong argument kind for ${definition.displayName}.${p.name}`, + ); + }); + } + const captured = new Set(); + for (const argument of rule.source.arguments) { + const id = parameterId(argument); + if (id) captured.add(id); + else if (hasParameter(argument)) + throw new GenericTypeError( + "unsupported-rule-pattern", + rule.id, + "Capture whole source arguments, not nested type patterns", + ); + } + for (const p of rule.parameters) + if (!captured.has(p.id)) + throw new GenericTypeError( + "uncaptured-rule-parameter", + rule.id, + `Parameter ${p.name} must occur in the source application`, + ); + graph.set(rule.source.definitionId, [...(graph.get(rule.source.definitionId) ?? []), rule]); + } + const visited = new Set(); + const active = new Set(); + const visit = (id: string, trail: string[]) => { + if (active.has(id)) + throw new GenericTypeError( + "recursive-conformance-rule", + trail.at(-1) ?? id, + `Recursive conformance rules: ${trail.join(" -> ")}`, + ); + if (visited.has(id)) return; + active.add(id); + for (const rule of graph.get(id) ?? []) visit(rule.target.definitionId, [...trail, rule.id]); + active.delete(id); + visited.add(id); + }; + for (const id of graph.keys()) visit(id, []); +} + +/** Monotone closure: bounds only enable applications, never invent evidence. */ +export function expandConformanceRules( + rules: readonly ConformanceRule[], + initial: readonly Pick[], + definitions: ReadonlyMap, + environment: (atom: AtomId, bindings: Map) => GenericTypeEnvironment, +): RuleApplication[] { + validateConformanceRules(rules, definitions); + const key = (atom: string, iface: string) => JSON.stringify([atom, iface]); + const facts = new Map(initial.map((f) => [key(f.atomId, f.interfaceRevisionId), f])); + const applications = new Map(); + const implies = (actual: InterfaceRevisionId, required: InterfaceRevisionId, seen = new Set()): boolean => { + if (actual === required) return true; + if (seen.has(actual)) return false; + seen.add(actual); + return (definitions.get(actual)?.requiredInterfaces ?? []).some((id) => implies(id, required, seen)); + }; + const bySource = new Map(); + for (const rule of [...rules].sort((a, b) => a.id.localeCompare(b.id))) + bySource.set(rule.source.definitionId, [...(bySource.get(rule.source.definitionId) ?? []), rule]); + let changed = true; + while (changed) { + changed = false; + for (const fact of [...facts.values()].sort((a, b) => + key(a.atomId, a.interfaceRevisionId).localeCompare(key(b.atomId, b.interfaceRevisionId)), + )) { + const definition = definitions.get(fact.interfaceRevisionId); + if (!definition) continue; + for (const rule of bySource.get(definition.application?.definitionId ?? definition.revisionId) ?? []) { + const arguments_ = definition.application?.arguments ?? []; + const bindings = new Map(); + const env = environment(fact.atomId, bindings); + const substitution = new TypeSubstitution(env); + if ( + !rule.source.arguments.every((pattern, i) => { + const actual = arguments_[i]; + if (!actual || actual.kind !== pattern.kind) return false; + const id = parameterId(pattern); + if (!id) return canonicalTypeArgument(substitution.argument(pattern)) === canonicalTypeArgument(actual); + const previous = bindings.get(id); + if (previous && canonicalTypeArgument(previous) !== canonicalTypeArgument(actual)) return false; + bindings.set(id, actual); + return true; + }) + ) + continue; + try { + bindTypeParameters( + rule.parameters, + rule.parameters.map((p) => bindings.get(p.id)!), + { + ...env, + implementsInterface: (target, required) => + target.kind === "atom" + ? facts.has(key(target.atomId, required)) + : implies(target.interfaceRevisionId, required), + }, + rule.id, + ); + } catch (error) { + if (error instanceof GenericTypeError && ["unsatisfied-bound", "non-storable-argument"].includes(error.code)) + continue; + throw error; + } + const applicationKey = JSON.stringify([rule.id, fact.atomId, fact.interfaceRevisionId]); + if (applications.has(applicationKey)) continue; + if (applications.size >= 10000) + throw new GenericTypeError( + "rule-expansion-limit", + rule.id, + "Conformance rule expansion exceeds 10000 applications", + ); + const targetId = substitution.application(rule.target); + const id = capabilityId.conformance( + `conformance-rule:sha256:${createHash("sha256") + .update( + JSON.stringify(["quixos-conformance-rule-v1", rule.id, fact.atomId, fact.interfaceRevisionId, targetId]), + ) + .digest("hex")}`, + ); + applications.set(applicationKey, { + rule, + atomId: fact.atomId, + sourceId: fact.interfaceRevisionId, + targetId, + bindings, + id, + }); + const targetKey = key(fact.atomId, targetId); + if (!facts.has(targetKey)) { + facts.set(targetKey, { atomId: fact.atomId, interfaceRevisionId: targetId }); + changed = true; + } + } + } + } + return [...applications.values()]; +} diff --git a/src/capability-model/types.ts b/src/capability-model/types.ts index 58d4690..f9a4fc5 100644 --- a/src/capability-model/types.ts +++ b/src/capability-model/types.ts @@ -445,6 +445,8 @@ export interface InitializationField { } export interface Conformance { + /** Source provenance of a compiler-expanded rule, never runtime dispatch input. */ + ruleOrigin?: { ruleId: string; sourceInterfaceRevisionId: InterfaceRevisionId; line: number; column: number }; moduleBindings?: ModuleBinding[]; initialization?: InitializationField[]; /** Absent only for legacy assemblies awaiting explicit ownership enrollment. */ diff --git a/src/capability-model/validation.ts b/src/capability-model/validation.ts index 46008e6..0d3fcae 100644 --- a/src/capability-model/validation.ts +++ b/src/capability-model/validation.ts @@ -708,7 +708,14 @@ const collectIdentityIndexes = ( issues, "duplicate-conformance", path, - `Duplicate conformance for ${conformance.atomId} as ${conformance.interfaceRevisionId}`, + `Duplicate conformance for ${conformance.atomId} as ${conformance.interfaceRevisionId}: ` + + [conformances.get(key)!, conformance] + .map((candidate) => + candidate.ruleOrigin + ? `rule ${candidate.ruleOrigin.ruleId} from ${candidate.ruleOrigin.sourceInterfaceRevisionId} at line ${candidate.ruleOrigin.line}` + : `conformance ${candidate.id ?? "(unnamed)"}`, + ) + .join(" conflicts with "), ); } else { conformances.set(key, conformance); diff --git a/test/conformance-rules.test.ts b/test/conformance-rules.test.ts new file mode 100644 index 0000000..b4208dd --- /dev/null +++ b/test/conformance-rules.test.ts @@ -0,0 +1,197 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import { + compileCapabilityResourceSource, + compileCapabilitySource, + type CapabilityImportEnvironment, +} from "../src/capability-language/parser.js"; +import type { InterfaceRevision, PackageRevision } from "../src/capability-model/types.js"; + +function fixture(declarations: string[]) { + const interfaces = new Map(); + const packages = new Map(); + const environment: CapabilityImportEnvironment = { interfaces, packages }; + for (const sourceText of declarations) { + const result = compileCapabilityResourceSource(sourceText, { + source: { repository: "https://example.test/rules.git", commit: "a".repeat(40) }, + environment, + }); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + if (result.resource.kind === "interface") + interfaces.set(result.resource.revision.displayName, result.resource.revision); + else packages.set(result.resource.revision.displayName, result.resource.revision); + } + return (body: string) => + compileCapabilitySource( + `workspace W id "w" revision "w@1" commit "${"a".repeat(40)}" { + ${[...interfaces.keys()].map((name) => `import interface ${name};`).join("\n")} + ${[...packages.keys()].map((name) => `import package ${name};`).join("\n")} + ${body} + }`, + "rules.qx", + environment, + ); +} +const ok = (result: ReturnType>) => { + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + return result; +}; +const nameResources = [ + 'interface Person id "person" revision "person@1" {value name id "p:name" : string {get id "p:get";set id "p:set";}}', + 'interface HasName id "name" revision "name@1" {value name id "n:name" : string {get id "n:get";set id "n:set";}}', +]; +const person = (name: string) => `atom ${name} id "${name}"; conform ${name} as Person id "${name}:person" { + private state Name${name} id "${name}:name" on ${name} : string policy register default "hello"; + bind name.get to state Name${name}.read; bind name.set to state Name${name}.write; +}`; +const namedRule = + 'conform Person as HasName id "person-name" {bind name.get to interface Person.name.get;bind name.set to interface Person.name.set;}'; + +test("interface rules are order independent and preserve each original storage owner", () => { + const compile = fixture(nameResources); + const first = ok(compile(namedRule + person("Living") + person("Avatar"))); + const second = ok(compile(person("Avatar") + person("Living") + namedRule)); + const generated = (result: typeof first) => + result.workspace.conformances + .filter((c) => c.ruleOrigin) + .map((c) => [c.atomId, c.id]) + .sort(); + assert.deepEqual(generated(first), generated(second)); + for (const atom of ["Living", "Avatar"]) { + const c = first.workspace.conformances.find((c) => c.atomId === atom && c.interfaceRevisionId === "name@1")!; + assert(c); + assert.equal(c.privateAttachments.length, 0); + assert( + c.operationBindings.every((b) => b.binding.kind === "interface" && b.binding.interfaceRevisionId === "person@1"), + ); + } +}); + +test("rule conflicts identify competing implementations", () => { + const result = fixture(nameResources)( + person("Living") + namedRule + namedRule.replace('id "person-name"', 'id "other-rule"'), + ); + assert.equal(result.ok, false); + assert.match(JSON.stringify(result.diagnostics), /duplicate-conformance/); +}); + +test("rules validate unused bodies and reject storage and ambiguous names", () => { + const compile = fixture(nameResources); + for (const [body, code] of [ + ["conform Person as HasName { }", "missing-rule-id"], + ['conform Person as HasName id "r" {bind name.get to interface Person.missing.get;}', "unknown-operation"], + ['conform Person as HasName id "r" { initialize {}; }', "unsupported-rule-storage"], + ['atom Person id "p";' + namedRule, "ambiguous-conformance-source"], + [namedRule + namedRule, "duplicate-rule-id"], + ]) { + const result = compile(body); + assert.equal(result.ok, false, body); + assert.match(JSON.stringify(result.diagnostics), new RegExp(code)); + } +}); + +const genericResources = [ + 'interface Placeable id "placeable" revision "placeable@1" {}', + 'interface Eligible id "eligible" revision "eligible@1" {}', + 'interface Factory id "factory" revision "factory@1" {}', + 'import interface Placeable; interface CanvasFactory id "canvas-factory" revision "canvas-factory@1" {}', +]; +const factoryRule = + 'conform Factory as CanvasFactory id "factory-canvas" {}'; +test("generic bounds filter factories and can be supplied by later rules", () => { + const result = ok( + fixture(genericResources)(` + ${factoryRule} + atom Owner id "owner"; atom Product id "product"; atom Other id "other"; + conform Owner as Factory id "unit-factory" {} + conform Owner as Factory id "record-factory" {} + conform Owner as Factory id "ineligible" {} + conform Product as Eligible id "eligible-product" {} + conform Eligible as Placeable id "eligible-placeable" {} + `), + ); + const generated = result.workspace.conformances.filter((c) => c.ruleOrigin?.ruleId === "factory-canvas"); + assert.equal(generated.length, 2); + assert(generated.every((c) => c.atomId === "owner")); + for (const c of generated) { + const iface = result.workspace.interfaceImports.find((i) => i.revisionId === c.interfaceRevisionId)!; + assert.deepEqual(iface.application?.arguments[1], { kind: "object", target: { kind: "atom", atomId: "product" } }); + } +}); + +test("rules reject recursive graphs, nested capture, wrong kinds and unbound parameters", () => { + const compile = fixture([ + 'interface A id "a" revision "a@1" {}', + 'interface B id "b" revision "b@1" {}', + ]); + for (const [body, code] of [ + ['conform A as A> id "grow" {}', "recursive-conformance-rule"], + ['conform A as B id "ab" {} conform B as A id "ba" {}', "recursive-conformance-rule"], + ['conform A> as B id "nested" {}', "unsupported-rule-pattern"], + ['conform A as B id "uncaptured" {}', "uncaptured-rule-parameter"], + ['conform A as B id "kind" {}', "parameter-kind"], + ]) { + const result = compile(body); + assert.equal(result.ok, false, body); + assert.match(JSON.stringify(result.diagnostics), new RegExp(code)); + } +}); + +test("package-backed rules retain declared interface dependencies", () => { + const result = ok( + fixture([ + ...nameResources, + 'import interface Person; package Names id "names" revision "names@1" {operation displayName id "read" : unit -> string mode call receiver any requires {interface person id "person-port" : Person using [name.get];};}', + ])( + person("Living") + + `conform Person as HasName id "formatted" { + bind name.get to package Names.displayName with {person to interface Person;}; + bind name.set to interface Person.name.set; + }`, + ), + ); + const generated = result.workspace.conformances.find((c) => c.ruleOrigin)!; + const binding = generated.operationBindings[0].binding; + assert.equal(binding.kind, "package"); + if (binding.kind === "package") + assert.deepEqual(binding.dependencies[0].binding, { kind: "interface", interfaceRevisionId: "person@1" }); +}); + +test("repeated arguments, closed patterns, Self and seedless bounds remain exact", () => { + const compile = fixture([ + 'interface Pair id "pair" revision "pair@1" {}', + 'interface Same id "same" revision "same@1" {}', + ...genericResources, + ]); + const result = ok( + compile(` + atom A id "atom-a"; + conform A as Pair id "equal" {} + conform A as Pair id "unequal" {} + conform Pair as Same id "same-rule" {} + conform A as Factory id "factory" {} + ${factoryRule} + conform Factory as Placeable id "seedless" {} + conform Factory as Eligible id "seedless-other" {} + `), + ); + const generated = result.workspace.conformances.filter((c) => c.ruleOrigin); + assert.equal(generated.length, 1); + const target = result.workspace.interfaceImports.find((i) => i.revisionId === generated[0].interfaceRevisionId)!; + assert.deepEqual(target.application?.arguments[1], { kind: "object", target: { kind: "atom", atomId: "atom-a" } }); +}); + +test("chains do not duplicate an application and explicit targets conflict", () => { + const compile = fixture([ + 'interface A id "a" revision "a@1" {}', + 'interface B id "b" revision "b@1" {}', + 'interface C id "c" revision "c@1" {}', + ]); + const source = `atom Item id "item"; conform Item as A id "a-impl" {} + conform B as C id "bc" {} conform A as B id "ab" {}`; + assert.equal(ok(compile(source)).workspace.conformances.length, 3); + const conflict = compile(source + 'conform Item as C id "explicit-c" {}'); + assert.equal(conflict.ok, false); + assert.match(JSON.stringify(conflict.diagnostics), /explicit-c/); + assert.match(JSON.stringify(conflict.diagnostics), /rule bc/); +}); diff --git a/test/crdt-edit-contracts.test.ts b/test/crdt-edit-contracts.test.ts index ac12b99..14ef54a 100644 --- a/test/crdt-edit-contracts.test.ts +++ b/test/crdt-edit-contracts.test.ts @@ -19,9 +19,9 @@ const compile = (policy = `crdt(${content})`, binding = "edit") => ` workspace Comments id "w" revision "w@1" commit "${"a".repeat(40)}" { import interface Comment; - atom Comment id "comment"; - conform Comment as Comment id "owner:comment" { - private state Content id "content" on Comment : ${content} policy ${policy}; + atom CommentAtom id "comment"; + conform CommentAtom as Comment id "owner:comment" { + private state Content id "content" on CommentAtom : ${content} policy ${policy}; initialize { content to state Content; }; bind content.get to state Content.read; bind content.edit to state Content.${binding}; diff --git a/test/qx-source.test.ts b/test/qx-source.test.ts index 9b9d2db..8a81ce2 100644 --- a/test/qx-source.test.ts +++ b/test/qx-source.test.ts @@ -1,3 +1,4 @@ +import { qxSourceManifest } from "../src/capability-language/source-loader.js"; import assert from "node:assert/strict"; import test from "node:test"; import { mkdtemp, writeFile, readFile, rm, symlink } from "node:fs/promises"; @@ -119,3 +120,21 @@ test("lowering diagnostics map to the imported file", async () => { assert.equal(position.fileName, "bad.qx"); assert.equal(position.line, 2); }); + +test("source manifests include resource imports in deduplicated workspace fragments", async (t) => { + const root = await mkdtemp(path.join(os.tmpdir(), "qx-source-manifest-")); + t.after(() => rm(root, { recursive: true, force: true })); + await writeFile( + path.join(root, "workspace.qx"), + addWorkspaceImport(addWorkspaceImport(workspace, "left.qx"), "right.qx"), + ); + await writeFile(path.join(root, "left.qx"), 'fragment {import "rules.qx";}'); + await writeFile(path.join(root, "right.qx"), 'fragment {import "rules.qx";}'); + await writeFile(path.join(root, "rules.qx"), "fragment {import interface Person; import package Runtime;}"); + const manifest = await qxSourceManifest(root); + assert.deepEqual(manifest.imports, [ + { kind: "interface", binding: "Person" }, + { kind: "package", binding: "Runtime" }, + ]); + assert.deepEqual([...manifest.sourceFiles].sort(), ["left.qx", "right.qx", "rules.qx", "workspace.qx"]); +}); From abd5d57fb9138b4f272db496f854c5f35843169b Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Wed, 23 Sep 2026 00:17:13 -0700 Subject: [PATCH 67/91] Implement rule-based Studio creation, usable canvas and Reader, and consolidated package authoring --- src/capability-language/execution-scaffold.ts | 11 +++-------- src/capability-language/structural-edits.ts | 3 ++- src/execution-world/kernel.ts | 2 +- test/component-scaffold.test.ts | 2 +- test/scaffold-recipes.test.ts | 2 +- test/structural-edits.test.ts | 14 ++++++++++++++ 6 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/capability-language/execution-scaffold.ts b/src/capability-language/execution-scaffold.ts index 3a11e02..05025ae 100644 --- a/src/capability-language/execution-scaffold.ts +++ b/src/capability-language/execution-scaffold.ts @@ -71,17 +71,10 @@ export async function executionScaffold( outputs = { nixpkgs, flake-utils, helpers, ... }: flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; }; + camino = import (helpers + "/quixos-package-helpers.nix"); in { devShells.default = (import (helpers + "/quixos-package-helpers.nix")).mkCaminoYarnShell { inherit pkgs; }; quixosPackages.checkedArtifacts = context: - import ./package.nix { inherit pkgs context; camino = import (helpers + "/quixos-package-helpers.nix"); }; - }); -} -`, - ); - create( - "package.nix", - `{ pkgs, camino, context }: let plan = builtins.fromJSON (builtins.readFile context.plan); package = pkgs.lib.findFirst (entry: entry.revision == context.packageRevisionId) @@ -103,6 +96,8 @@ in camino.assembleCaminoPackage { }) ++ pkgs.lib.optional (modules != {}) (camino.mkCaminoReactPackage { inherit pkgs context dependencies modules; src = ./.; }); +}; + }); } `, ); diff --git a/src/capability-language/structural-edits.ts b/src/capability-language/structural-edits.ts index 65cab67..2dcc38d 100644 --- a/src/capability-language/structural-edits.ts +++ b/src/capability-language/structural-edits.ts @@ -210,7 +210,8 @@ export const editStructure = (source: string, edit: StructuralEdit): string => { return source; } const identifiers = node.children.filter((entry) => entry.kind === "identifier"); - const position = identifiers[identifiers.length - 1].end; + const targetArguments = node.children.find((entry) => entry.kind === "typeArguments"); + const position = targetArguments?.end ?? identifiers[identifiers.length - 1].end; result = applySourceEdits(source, [{ start: position, end: position, text: ` id ${JSON.stringify(edit.id)}` }]); } else if (edit.operation === "append") { const closing = syntax.tokens.find((token) => token.kind === "RBRACE" && token.end === node.end); diff --git a/src/execution-world/kernel.ts b/src/execution-world/kernel.ts index ca9db0e..fbc6bf7 100644 --- a/src/execution-world/kernel.ts +++ b/src/execution-world/kernel.ts @@ -158,7 +158,7 @@ export function compileKernelProgram(plan: ExecutionPlan): unknown { interface: bound.interfaceRevisionId, ...(!bound.receiver && !bound.via && - (requirement.operations ?? iface.members.flatMap(m=>m.operations.map(o=>o.id))).every( + (requirement.operations ?? iface.members.flatMap((m) => m.operations.map((o) => o.id))).every( (id) => iface.members.flatMap((m) => m.operations).find((o) => o.id === id)?.scope === "class", ) ? { staticAtom: operation.atomId } diff --git a/test/component-scaffold.test.ts b/test/component-scaffold.test.ts index e416f41..a4d9578 100644 --- a/test/component-scaffold.test.ts +++ b/test/component-scaffold.test.ts @@ -63,7 +63,7 @@ test("checked component scaffolding composes with execution handlers without rep assert.equal(await fs.readFile(flake, "utf8"), retainedFlake); assert.match(await fs.readFile(entriesFile, "utf8"), /retained entry comment/); assert.match(await fs.readFile(path.join(root, "src/server.ts"), "utf8"), /echo/); - assert.match(await fs.readFile(path.join(root, "flake.nix"), "utf8"), /import \.\/package\.nix/); + assert.match(await fs.readFile(path.join(root, "flake.nix"), "utf8"), /mkCaminoReactPackage/); await assert.rejects( apply("component", { name: "Card", diff --git a/test/scaffold-recipes.test.ts b/test/scaffold-recipes.test.ts index ef3f61d..7406b0c 100644 --- a/test/scaffold-recipes.test.ts +++ b/test/scaffold-recipes.test.ts @@ -47,7 +47,7 @@ test("execution scaffolds route typed handlers by declared effect and target wit assert.match(await read("src/impl/asyncWork.ts"), /RemoteImplementation/); assert.match(await read("src/impl/both.ts"), /PortableImplementation/); assert.match(await read("flake.nix"), /checkedArtifacts/); - assert.match(await read("package.nix"), /entries.browser/); + assert.match(await read("flake.nix"), /entries.browser/); await assert.rejects(add("both", "transaction targets [browser, server]"), /unique/); await assert.rejects(add("invalid", "snapshot targets [remote]"), /browser\/server/); await assert.rejects(apply("function", { name: "missing", id: "export:missing" }), /explicit execution/); diff --git a/test/structural-edits.test.ts b/test/structural-edits.test.ts index 2f6d389..42ced41 100644 --- a/test/structural-edits.test.ts +++ b/test/structural-edits.test.ts @@ -101,3 +101,17 @@ test("conformance enrollment, major edits, imports, and private attachment remov const imported = editStructure(removed, { operation: "import", kind: "interface", name: "Playable" }); assert.equal(editStructure(imported, { operation: "import", kind: "interface", name: "Playable" }), imported); }); + +test("enrolling a generic conformance or rule places its identity after target arguments", () => { + for (const source of [ + "fragment { conform Game as View {} }", + "fragment { conform Source as View {} }", + ]) { + const enrolled = editStructure(source, { + operation: "conformance-id", + target: { kind: "conformanceDecl" }, + id: "rule:view", + }); + assert.match(enrolled, /as View<[^>]+> id "rule:view"/); + } +}); From 902739b284f8a2b1a1862a29abe8a5ad953b83d2 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Thu, 24 Sep 2026 11:52:17 -0700 Subject: [PATCH 68/91] Add shared Quixos React controls and delayed component fallback --- src/execution-world/artifacts.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/execution-world/artifacts.ts b/src/execution-world/artifacts.ts index 3491046..9a99f21 100644 --- a/src/execution-world/artifacts.ts +++ b/src/execution-world/artifacts.ts @@ -35,6 +35,7 @@ export const componentSharedModules = [ "react-dom/client", "react/jsx-runtime", "@quixos/camino-react", + "@quixos/camino-react/ui", ] as const; export interface ComponentArtifact { id: string; From 73148d76e1305bfb0eaa1271dc7d455130a20704 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Fri, 25 Sep 2026 10:53:19 -0700 Subject: [PATCH 69/91] Add checked private storage to reusable conformance rules Scope attachments and projections by stable rule-application identity; keep lexical names private to each application. Lower ordinary initialization mappings and concrete captured creation targets through existing checking. Preserve stateless forwarding, conflict detection, and the materialization fence. Add tests for multiple same-atom specializations, name isolation, generic edges, factory seeds, and storage evolution. Full protocol Nix build and tests pass. --- src/capability-language/parser.ts | 171 +++++++++++++++++++++++++++--- test/conformance-rules.test.ts | 128 +++++++++++++++++++++- test/creation-contracts.test.ts | 21 ++++ 3 files changed, 303 insertions(+), 17 deletions(-) diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index 029d843..102b950 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -1,3 +1,4 @@ +import { createHash } from "node:crypto"; import { BaseErrorListener, CharStream, @@ -1712,7 +1713,8 @@ const lowerPackage = ( const lowerState = (state: LoweringState, context: StateDeclContext): StateSlotDefinition => { const atomName = identifier(context.identifier(1)); const atomId = - requireSymbol(state, state.atoms, atomName, context, "atom") ?? capabilityId.atom(`unresolved:${atomName}`); + (atomName === "Self" ? state.types.self : requireSymbol(state, state.atoms, atomName, context, "atom")) ?? + capabilityId.atom(`unresolved:${atomName}`); const policy = context.storagePolicy(); const defaultContext = context.jsonLiteral(); let defaultValue: unknown; @@ -1932,7 +1934,18 @@ const lowerBoundDependencies = ( : []; } const atomName = identifier(entry.identifier(1)); - const atomId = requireSymbol(state, state.atoms, atomName, entry, "atom"); + const parameter = state.types.parameters.get(atomName); + const argument = parameter && state.types.bindings.get(parameter.id); + const atomId = + atomName === "Self" + ? state.types.self + : argument?.kind === "object" && argument.target.kind === "atom" + ? argument.target.atomId + : parameter + ? undefined + : requireSymbol(state, state.atoms, atomName, entry, "atom"); + if (!atomId && (parameter || atomName === "Self")) + loweringIssue(state, entry, "invalid-creation-target", "Creation requires a concrete atom argument"); if (entry.CREATION()) return atomId ? [ @@ -2031,19 +2044,90 @@ const lowerConformanceRule = (state: LoweringState, context: ConformanceDeclCont const targetDefinition = state.types.definitions.get(target.definitionId)!; const applications = [source, target]; const members = targetDefinition.template?.members ?? targetDefinition.members; + const privateStorage = new Map(); + const privateIds = new Set(); for (const item of context.conformanceItem()) { + const declaration = item.attachmentDecl(); + if (!declaration) continue; + const stateDeclaration = declaration.stateDecl(); + const edgeDeclaration = declaration.edgeDecl(); + const name = identifier(stateDeclaration ? stateDeclaration.identifier(0) : edgeDeclaration!.identifier()); + const authoredId = stringValue((stateDeclaration ?? edgeDeclaration)!.stringLiteral()); + if (privateStorage.has(name)) + loweringIssue(state, declaration, "duplicate-symbol", `Duplicate private attachment ${name}`); + if (privateIds.has(authoredId)) + loweringIssue(state, declaration, "duplicate-attachment", `Duplicate private attachment ID ${authoredId}`); + privateStorage.set(name, stateDeclaration ? "state" : "edge"); + privateIds.add(authoredId); + if (stateDeclaration && identifier(stateDeclaration.identifier(1)) !== "Self") + loweringIssue(state, stateDeclaration, "invalid-rule-storage", "Rule private state must attach to Self"); + if (stateDeclaration) { + try { + state.types.expression(stateDeclaration.valueType()); + if (stateDeclaration.storagePolicy().valueType()) + state.types.expression(stateDeclaration.storagePolicy().valueType()!); + } catch (error) { + if (error instanceof GenericTypeError) loweringIssue(state, stateDeclaration, error.code, error.message); + else throw error; + } + } if ( - item.attachmentDecl() || - item.initializationDecl() || - item.relationshipMaterializationDecl() || - item.stateFieldBindingDecl() - ) { - loweringIssue( - state, - item, - "unsupported-rule-storage", - "Rules support operation and module bindings, not private storage, initialization or materialization", - ); + edgeDeclaration && + !edgeDeclaration + .edgeEndpoint() + .some((endpoint) => identifier(endpoint.targetConstraint().identifier()) === "Self") + ) + loweringIssue(state, edgeDeclaration, "invalid-rule-storage", "Rule private edge must have a Self endpoint"); + for (const endpoint of edgeDeclaration?.edgeEndpoint() ?? []) { + try { + state.types.targetExpression(endpoint.targetConstraint()); + } catch (error) { + if (error instanceof GenericTypeError) loweringIssue(state, endpoint, error.code, error.message); + else throw error; + } + } + } + if (context.conformanceItem().filter((item) => item.initializationDecl()).length > 1) + loweringIssue(state, context, "duplicate-initialization", "Declare one initialization mapping per rule owner"); + for (const item of context.conformanceItem()) { + const field = item.stateFieldBindingDecl(); + if (field) { + const member = members.find((entry) => entry.displayName === identifier(field.identifier(0))); + if (member?.kind !== "value" || privateStorage.get(identifier(field.identifier(1))) !== "state") + loweringIssue( + state, + field, + "invalid-state-field-binding", + "Field shorthand requires a value member and rule-private state", + ); + } + const initialization = item.initializationDecl(); + for (const entry of initialization?.initializationField() ?? []) { + const kind = privateStorage.get(identifier(entry.identifier(1))); + if (!kind || (entry.STATE() && kind !== "state") || (entry.EDGE() && kind !== "edge")) + loweringIssue( + state, + entry, + "invalid-initialization", + "Initialization must name matching rule-private storage", + ); + if (kind === "edge" && entry.EDGE()) { + const edge = context + .conformanceItem() + .flatMap((candidate) => candidate.attachmentDecl()?.edgeDecl() ?? []) + .find((candidate) => identifier(candidate.identifier()) === identifier(entry.identifier(1))); + if ( + !edge + ?.edgeEndpoint() + .some((endpoint) => identifier(endpoint.identifier()) === identifier(entry.identifier(2))) + ) + loweringIssue(state, entry, "unknown-symbol", "Unknown rule-private edge projection"); + } + } + } + for (const item of context.conformanceItem()) { + if (item.relationshipMaterializationDecl()) { + loweringIssue(state, item, "unsupported-rule-storage", "Rule relationship materialization is not supported"); continue; } const module = item.moduleBindingDecl(); @@ -2095,6 +2179,28 @@ const lowerConformanceRule = (state: LoweringState, context: ConformanceDeclCont ); } } + } else if (provider.STATE() || provider.EDGE()) { + const name = identifier(provider.identifier(0)); + const expected = provider.STATE() ? "state" : "edge"; + if (privateStorage.get(name) !== expected) + loweringIssue( + state, + provider, + "invalid-rule-storage-binding", + `Rule provider must name private ${expected} ${name}`, + ); + if (provider.EDGE()) { + const edge = context + .conformanceItem() + .flatMap((candidate) => candidate.attachmentDecl()?.edgeDecl() ?? []) + .find((candidate) => identifier(candidate.identifier()) === name); + if ( + !edge + ?.edgeEndpoint() + .some((endpoint) => identifier(endpoint.identifier()) === identifier(provider.identifier(1))) + ) + loweringIssue(state, provider, "unknown-symbol", "Unknown rule-private edge projection"); + } } else { loweringIssue( state, @@ -2123,8 +2229,13 @@ const lowerConformanceBody = ( context: ConformanceDeclContext, privateAttachments: PersistentAttachment[], implementingAtom?: AtomId, + ruleApplicationId?: string, ): WorkspaceRevision["conformances"][number] | undefined => { - const state = { ...parent, interfaces: new Map(parent.interfaces) }; + const state = { + ...parent, + interfaces: new Map(parent.interfaces), + attachments: ruleApplicationId ? new Map(parent.attachments) : parent.attachments, + }; const atomName = identifier(context.identifier(0)); const interfaceName = identifier(context.identifier(1)); const atomId = implementingAtom ?? requireSymbol(state, state.atoms, atomName, context, "atom"); @@ -2132,6 +2243,36 @@ const lowerConformanceBody = ( if (!atomId || !interfaceSymbol) { return undefined; } + if (ruleApplicationId) { + privateAttachments = []; + for (const item of context.conformanceItem()) { + const declaration = item.attachmentDecl(); + if (!declaration) continue; + const attachment = lowerAttachment(state, declaration); + if (!attachment) continue; + const authoredId = attachment.id; + const scopedId = createHash("sha256") + .update(JSON.stringify(["quixos-rule-attachment-v1", ruleApplicationId, authoredId])) + .digest("hex"); + if (attachment.kind === "state") { + attachment.id = capabilityId.slot(`rule:sha256:${scopedId}`); + } else { + attachment.id = capabilityId.edgeType(`rule:sha256:${scopedId}`); + for (const endpoint of attachment.endpoints) { + const projectionHash = createHash("sha256") + .update(JSON.stringify(["quixos-rule-projection-v1", ruleApplicationId, authoredId, endpoint.projectionId])) + .digest("hex"); + endpoint.projectionId = capabilityId.edgeProjection(`rule:sha256:${projectionHash}`); + } + } + privateAttachments.push(attachment); + // A rule application owns a lexical scope. A same-named attachment in + // another owner must neither prevent this declaration nor receive bindings. + const name = identifier(declaration.stateDecl()?.identifier(0) ?? declaration.edgeDecl()!.identifier()); + state.attachments.delete(name); + registerAttachment(state, declaration, attachment); + } + } const originalSymbol = interfaceSymbol; if (context.typeArguments() || interfaceSymbol.definition?.template) { const previousSelf = state.types.self; @@ -2654,7 +2795,7 @@ const lowerWorkspace = ( const declaration = rules.get(application.rule)!; const result = atGenericSource(declaration, () => withConformanceTypes(state, application.atomId, application.rule.parameters, application.bindings, () => - lowerConformanceBody(state, declaration, [], application.atomId), + lowerConformanceBody(state, declaration, [], application.atomId, application.id), ), ); if (result) { diff --git a/test/conformance-rules.test.ts b/test/conformance-rules.test.ts index b4208dd..dfda342 100644 --- a/test/conformance-rules.test.ts +++ b/test/conformance-rules.test.ts @@ -75,12 +75,17 @@ test("rule conflicts identify competing implementations", () => { assert.match(JSON.stringify(result.diagnostics), /duplicate-conformance/); }); -test("rules validate unused bodies and reject storage and ambiguous names", () => { +test("rules validate unused bodies and ambiguous names", () => { const compile = fixture(nameResources); for (const [body, code] of [ ["conform Person as HasName { }", "missing-rule-id"], ['conform Person as HasName id "r" {bind name.get to interface Person.missing.get;}', "unknown-operation"], - ['conform Person as HasName id "r" { initialize {}; }', "unsupported-rule-storage"], + ['conform Person as HasName id "r" { initialize { content to state Missing; }; }', "invalid-initialization"], + ['conform Person as HasName id "r" { bind name to state Missing; }', "invalid-state-field-binding"], + [ + 'conform Person as HasName id "r" {private state Bad id "bad" on Self : Missing policy register;}', + "unknown-type", + ], ['atom Person id "p";' + namedRule, "ambiguous-conformance-source"], [namedRule + namedRule, "duplicate-rule-id"], ]) { @@ -90,6 +95,125 @@ test("rules validate unused bodies and reject storage and ambiguous names", () = } }); +test("rule storage is scoped per application, including repeated specializations on one atom", async () => { + const compile = fixture([ + 'interface Source id "source" revision "source@1" {}', + 'interface Stored id "stored" revision "stored@1" {value content id "value" : optional {get id "get";set id "set";}}', + ]); + const rule = `conform Source as Stored id "store-rule" { + private state Value id "stored:value" on Self : optional policy register default null; + bind content to state Value; + }`; + const atoms = `atom A id "a"; atom B id "b"; + conform A as Source id "a-string" {} + conform A as Source id "a-number" {} + conform B as Source id "b-string" {}`; + const first = ok(compile(rule + atoms)).workspace; + const second = ok(compile(atoms + rule)).workspace; + const storage = (workspace: typeof first) => + workspace.conformances + .filter((c) => c.ruleOrigin) + .map((c) => [c.id, c.privateAttachments, c.operationBindings]) + .sort((a, b) => String(a[0]).localeCompare(String(b[0]))); + assert.deepEqual(storage(first), storage(second)); + const owners = first.conformances.filter((c) => c.ruleOrigin); + assert.equal(owners.length, 3); + assert.equal(new Set(owners.map((c) => c.privateAttachments[0]!.id)).size, 3); + for (const owner of owners) { + const state = owner.privateAttachments[0]!; + assert.equal(state.kind, "state"); + if (state.kind !== "state") throw Error("state expected"); + assert.equal(state.attachedTo, owner.atomId); + assert(owner.operationBindings.every((b) => b.binding.kind === "state" && b.binding.slotId === state.id)); + } + const { storageContracts, storageChangeRequiresMigration } = await import("../src/capability-model/evolution.js"); + const before = storageContracts(first); + const changed = ok( + compile( + atoms.replace('conform A as Source id "a-number" {}', "") + + rule.replace("default null", 'default "new default"'), + ), + ).workspace; + // Use the string specialization for default evolution; all nominal identities + // remain stable, and changing a default must not rewrite existing state. + const oldSlot = before.find((s) => s.id === owners.find((c) => c.atomId === "b")!.privateAttachments[0]!.id)!; + const newSlot = storageContracts(changed).find((s) => s.id === oldSlot.id)!; + assert.equal(storageChangeRequiresMigration(oldSlot, newSlot, new Set(["a", "b"])), false); + assert.equal(storageChangeRequiresMigration(oldSlot, undefined, new Set(["a", "b"])), true); +}); + +test("rule attachments shadow outside names without leaking into another owner", () => { + const rule = `conform Person as HasName id "r" { + private state NameLiving id "rule:name" on Self : string policy register default "rule"; + bind name to state NameLiving; + }`; + const workspace = ok(fixture(nameResources)(rule + person("Living"))).workspace; + const original = workspace.conformances.find((c) => c.interfaceRevisionId === "person@1")!; + const derived = workspace.conformances.find((c) => c.interfaceRevisionId === "name@1")!; + assert.notEqual(original.privateAttachments[0]!.id, derived.privateAttachments[0]!.id); + assert( + derived.operationBindings.every( + (b) => b.binding.kind === "state" && b.binding.slotId === derived.privateAttachments[0]!.id, + ), + ); + assert( + original.operationBindings.every( + (b) => b.binding.kind === "state" && b.binding.slotId === original.privateAttachments[0]!.id, + ), + ); +}); + +test("rule private edges substitute Self and captured endpoints with stable projection IDs", () => { + const compile = fixture([ + 'interface Linkable id "linkable" revision "linkable@1" {}', + 'interface Links id "links" revision "links@1" {relation items id "items" : many object T {resolve id "resolve";}}', + ]); + const source = `atom A id "a"; atom B id "b"; atom Target id "target"; + conform A as Linkable id "a-link" {} conform B as Linkable id "b-link" {} + conform Linkable as Links id "links" { + private edge Items id "items" { + object Self projection items id "forward" many; + object T projection owners id "inverse" many; + } + bind items.resolve to edge Items.items.resolve; + }`; + const workspace = ok(compile(source)).workspace; + const edges = workspace.conformances.filter((c) => c.ruleOrigin).map((c) => c.privateAttachments[0]!); + assert.equal(edges.length, 2); + assert.notEqual(edges[0]!.id, edges[1]!.id); + const projections = edges.flatMap((edge) => { + assert.equal(edge.kind, "edge"); + if (edge.kind !== "edge") throw Error("edge expected"); + assert.deepEqual(edge.endpoints[1].constraint, { kind: "atom", atomId: "target" }); + return edge.endpoints.map((e) => e.projectionId); + }); + assert.equal(new Set(projections).size, 4); +}); + +test("rule creation ports close captured atom parameters and retain initialization checking", () => { + const compile = fixture([ + 'interface Factory id "factory" revision "factory@1" {operation create id "create" : unit -> ref {call id "call" execution transaction targets [browser,server];}}', + 'interface Creates id "creates" revision "creates@1" {}', + 'package Runtime id "runtime" revision "runtime@1" {operation create id "create" : unit -> ref mode call execution transaction targets [browser,server] receiver any requires {creation result id "result" : T input unit;};}', + ]); + const rule = `conform Creates as Factory id "factory-rule" { + bind create.call to package Runtime.create with {result to creation T with {};}; + }`; + const result = ok( + compile(`atom Subject id "subject"; atom Product id "product"; + conform Subject as Creates id "creates-product" {} ${rule}`), + ); + const owner = result.workspace.conformances.find((c) => c.ruleOrigin)!; + const binding = owner.operationBindings[0]!.binding; + assert.equal(binding.kind, "package"); + if (binding.kind !== "package") throw Error("package expected"); + assert.deepEqual(binding.dependencies[0]!.binding, { kind: "creation", atomId: "product", owners: [] }); + const invalid = compile(`atom Subject id "subject"; + conform Subject as Creates> id "creates-interface" {} ${rule}`); + assert.equal(invalid.ok, false); + assert.match(JSON.stringify(invalid.diagnostics), /concrete atom/); +}); + const genericResources = [ 'interface Placeable id "placeable" revision "placeable@1" {}', 'interface Eligible id "eligible" revision "eligible@1" {}', diff --git a/test/creation-contracts.test.ts b/test/creation-contracts.test.ts index 88f07de..5373722 100644 --- a/test/creation-contracts.test.ts +++ b/test/creation-contracts.test.ts @@ -87,6 +87,27 @@ test("two factories initialize two independent state owners without constructors ]); } }); + +test("rule-owned state uses the same checked initialization and creation obligations", () => { + const source = text + .replace('conform Note as Data id "owner:data"', 'conform Tagged as Data id "rule:data"') + .replace("on Note : string", "on Self : string"); + const result = compile(source); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const owner = result.workspace.conformances.find((c) => c.ruleOrigin?.ruleId === "rule:data")!; + assert.equal(owner.initialization?.[0]?.binding.kind, "state"); + assert(owner.privateAttachments[0]!.id.startsWith("rule:sha256:")); + for (const [invalid, diagnostic] of [ + [source.replaceAll("Data from input.data;", ""), "Required state"], + [source.replace("initialize { title to state Title; };", ""), "no declared initialization mapping"], + [source.replace("title to state Title;", "title to state Tags;"), "rule-private storage"], + [source.replaceAll("Data from input.data;", "Data from input.tags;"), "does not match"], + ]) { + const failure = compile(invalid!); + assert.equal(failure.ok, false); + assert.match(JSON.stringify(failure.diagnostics), new RegExp(diagnostic!)); + } +}); test("creation rejects missing seeds, wrong input shapes, and private initialization laundering", () => { for (const [edit, message] of [ [text.replaceAll("Tagged from input.tags;", ""), "Required state tags-state"], From a83239892c7000421c8f1c7c15eae1e2129c91de Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Fri, 25 Sep 2026 11:04:23 -0700 Subject: [PATCH 70/91] Prove PresentationMount with authored generic graph operations --- src/capability-language/parser.ts | 4 + test/conformance-rules.test.ts | 26 ++++++ test/emit-portable-reader.ts | 15 ++++ .../presentation-mount/DocumentNavigation.qx | 7 ++ .../presentation-mount/Presentation.qx | 2 + .../presentation-mount/PresentationMount.qx | 15 ++++ .../presentation-mount/PresentationRuntime.qx | 23 ++++++ .../presentation-mount/PresentationState.qx | 12 +++ .../presentation-mount/PresentationStates.qx | 10 +++ .../presentation-mount/ReaderNavigation.qx | 7 ++ .../presentation-mount/StateFactory.qx | 6 ++ .../presentation-mount/StateRecord.qx | 1 + test/fixtures/presentation-mount/workspace.qx | 81 +++++++++++++++++++ test/presentation-mount-fixture.ts | 35 ++++++++ 14 files changed, 244 insertions(+) create mode 100644 test/fixtures/presentation-mount/DocumentNavigation.qx create mode 100644 test/fixtures/presentation-mount/Presentation.qx create mode 100644 test/fixtures/presentation-mount/PresentationMount.qx create mode 100644 test/fixtures/presentation-mount/PresentationRuntime.qx create mode 100644 test/fixtures/presentation-mount/PresentationState.qx create mode 100644 test/fixtures/presentation-mount/PresentationStates.qx create mode 100644 test/fixtures/presentation-mount/ReaderNavigation.qx create mode 100644 test/fixtures/presentation-mount/StateFactory.qx create mode 100644 test/fixtures/presentation-mount/StateRecord.qx create mode 100644 test/fixtures/presentation-mount/workspace.qx create mode 100644 test/presentation-mount-fixture.ts diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index 102b950..dd8a39b 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -2182,6 +2182,10 @@ const lowerConformanceRule = (state: LoweringState, context: ConformanceDeclCont } else if (provider.STATE() || provider.EDGE()) { const name = identifier(provider.identifier(0)); const expected = provider.STATE() ? "state" : "edge"; + // A rule may traverse another owner's public inverse projection, just as + // a concrete conformance may. Resolve external edges after specialization; + // ordinary ownership validation still permits only public resolve access. + if (provider.EDGE() && !privateStorage.has(name)) continue; if (privateStorage.get(name) !== expected) loweringIssue( state, diff --git a/test/conformance-rules.test.ts b/test/conformance-rules.test.ts index dfda342..b274720 100644 --- a/test/conformance-rules.test.ts +++ b/test/conformance-rules.test.ts @@ -319,3 +319,29 @@ test("chains do not duplicate an application and explicit targets conflict", () assert.match(JSON.stringify(conflict.diagnostics), /explicit-c/); assert.match(JSON.stringify(conflict.diagnostics), /rule bc/); }); + +test("rule inverse reads retain the concrete conformance ownership checks", () => { + const compile = fixture([ + 'interface Parent id "parent" revision "parent@1" {}', + 'interface Child id "child" revision "child@1" {}', + 'import interface Parent; interface Owned id "owned" revision "owned@1" {queryable relation parent id "parent-ref" : optional-one interface Parent {resolve id "parent-read" execution snapshot targets [browser,server];}}', + ]); + const source = ` + atom P id "p"; atom C id "c"; + conform P as Parent id "parent-impl" { + private edge Membership id "membership" { + atom P projection children id "children" many-unique; + interface Child projection parent id "parent" optional-one public-traversal; + } + } + conform C as Child id "child-impl" {} + conform Child as Owned id "owned-rule" {bind parent.resolve to edge Membership.parent.resolve;} + `; + ok(compile(source)); + const hidden = compile(source.replace(" public-traversal", "")); + assert.equal(hidden.ok, false); + assert.match(JSON.stringify(hidden.diagnostics), /private|public|own/i); + const missing = compile(source.replace("Membership.parent.resolve", "Missing.parent.resolve")); + assert.equal(missing.ok, false); + assert.match(JSON.stringify(missing.diagnostics), /Unknown attachment/); +}); diff --git a/test/emit-portable-reader.ts b/test/emit-portable-reader.ts index 5b99aec..92d90d9 100644 --- a/test/emit-portable-reader.ts +++ b/test/emit-portable-reader.ts @@ -126,6 +126,21 @@ await mkdir("dist/portable-reader/collections", { recursive: true }); await writeFile("dist/portable-reader/collections/plan.json", JSON.stringify(collections)); await writeFile("dist/portable-reader/collections/kernel.json", JSON.stringify(compileKernelProgram(collections))); +const { presentationMountPlan } = await import("./presentation-mount-fixture.js"); +const presentationMount = await presentationMountPlan(); +await mkdir("dist/portable-reader/presentation-mount", { recursive: true }); +await writeFile("dist/portable-reader/presentation-mount/plan.json", JSON.stringify(presentationMount)); +await writeFile( + "dist/portable-reader/presentation-mount/kernel.json", + JSON.stringify(compileKernelProgram(presentationMount)), +); +await writeFile( + "dist/portable-reader/presentation-mount/browser.ts", + generatePortableTypeScriptBindings(presentationMount.definition.bindingSchema, "presentation-runtime@1", { + target: "browser", + }), +); + const { compoundCrdtPlan } = await import("./compound-crdt-fixture.js"); const compoundCrdt = await compoundCrdtPlan(); await mkdir("dist/portable-reader/compound-crdt", { recursive: true }); diff --git a/test/fixtures/presentation-mount/DocumentNavigation.qx b/test/fixtures/presentation-mount/DocumentNavigation.qx new file mode 100644 index 0000000..a0e7da7 --- /dev/null +++ b/test/fixtures/presentation-mount/DocumentNavigation.qx @@ -0,0 +1,7 @@ +import interface PresentationState; +interface DocumentNavigation id "document-navigation" revision "document-navigation@1" requires PresentationState { + queryable value compact id "document-navigation:compact" : bool { + get id "document-navigation:compact:get" execution snapshot targets [browser,server]; + set id "document-navigation:compact:set" execution transaction targets [browser,server]; + } +} diff --git a/test/fixtures/presentation-mount/Presentation.qx b/test/fixtures/presentation-mount/Presentation.qx new file mode 100644 index 0000000..7bae9c6 --- /dev/null +++ b/test/fixtures/presentation-mount/Presentation.qx @@ -0,0 +1,2 @@ +import interface PresentationState; +interface Presentation id "presentation" revision "presentation@1" {} diff --git a/test/fixtures/presentation-mount/PresentationMount.qx b/test/fixtures/presentation-mount/PresentationMount.qx new file mode 100644 index 0000000..a74a683 --- /dev/null +++ b/test/fixtures/presentation-mount/PresentationMount.qx @@ -0,0 +1,15 @@ +import interface PresentationState; +interface PresentationMount id "presentation-mount" revision "presentation-mount@1" { + static operation create id "presentation-mount:create" : unit -> interface-ref { + call id "presentation-mount:create:call" execution transaction targets [browser,server]; + } + queryable relation members id "presentation-mount:members" : many-unique interface PresentationState { + resolve id "presentation-mount:members:resolve" execution snapshot targets [browser,server]; + } + queryable relation root id "presentation-mount:root" : optional-one interface PresentationState { + resolve id "presentation-mount:root:resolve" execution snapshot targets [browser,server]; + } + operation attach id "presentation-mount:attach" : interface-ref -> unit { + call id "presentation-mount:attach:call" execution transaction targets [browser,server]; + } +} diff --git a/test/fixtures/presentation-mount/PresentationRuntime.qx b/test/fixtures/presentation-mount/PresentationRuntime.qx new file mode 100644 index 0000000..d7f9788 --- /dev/null +++ b/test/fixtures/presentation-mount/PresentationRuntime.qx @@ -0,0 +1,23 @@ +import interface PresentationState; +import interface PresentationMount; +import interface StateFactory; +external atom PresentationMountRecord id "presentation-mount-record"; +package PresentationRuntime id "presentation-runtime" revision "presentation-runtime@1" { + function createPresentationMount id "presentation-runtime:create" : unit -> interface-ref execution transaction targets [browser,server] requires { + creation presentationMount id "presentationMount" : PresentationMountRecord input unit; + }; + operation attach id "presentation-runtime:attach" : interface-ref -> unit mode call execution transaction targets [browser,server] receiver any requires { + edge members id "members" : many-unique interface PresentationState [resolve,connect]; + edge root id "root" : optional-one interface PresentationState [resolve,connect]; + interface metadata id "state" : PresentationState using [presentationMount.resolve,parent.resolve] from input; + }; + operation ensure id "presentation-runtime:ensure" : record {presentationMount:interface-ref;occurrence:string;parent:optional>;} -> ref mode call execution transaction targets [browser,server] receiver any requires { + edge states id "states" : many-unique object Navigation [resolve,connect]; + interface metadata id "state" : PresentationState using [occurrence.get,presentationMount.resolve,parent.resolve] from input; + interface presentationMount id "presentationMount" : PresentationMount using [attach.call] from input; + interface factory id "factory" : StateFactory using [create.call]; + }; + function createState id "presentation-runtime:create-state" : record {occurrence:string;parent:optional>;} -> ref execution transaction targets [browser,server] requires { + creation navigation id "navigation" : Navigation input record {occurrence:string;parent:optional>;}; + }; +} diff --git a/test/fixtures/presentation-mount/PresentationState.qx b/test/fixtures/presentation-mount/PresentationState.qx new file mode 100644 index 0000000..ac2f30f --- /dev/null +++ b/test/fixtures/presentation-mount/PresentationState.qx @@ -0,0 +1,12 @@ +external interface PresentationMount revision "presentation-mount@1"; +interface PresentationState id "presentation-state" revision "presentation-state@1" { + queryable value occurrence id "state:occurrence" : string { + get id "state:occurrence:get" execution snapshot targets [browser,server]; + } + queryable relation presentationMount id "state:presentation-mount" : optional-one interface PresentationMount { + resolve id "state:presentation-mount:resolve" execution snapshot targets [browser,server]; + } + queryable relation parent id "state:parent" : optional-one interface PresentationState { + resolve id "state:parent:resolve" execution snapshot targets [browser,server]; + } +} diff --git a/test/fixtures/presentation-mount/PresentationStates.qx b/test/fixtures/presentation-mount/PresentationStates.qx new file mode 100644 index 0000000..55eac33 --- /dev/null +++ b/test/fixtures/presentation-mount/PresentationStates.qx @@ -0,0 +1,10 @@ +import interface PresentationState; +import interface PresentationMount; +interface PresentationStates id "presentation-states" revision "presentation-states@1" { + queryable relation states id "presentation-states:states" : many-unique object Navigation { + resolve id "presentation-states:states:resolve" execution snapshot targets [browser,server]; + } + operation ensure id "presentation-states:ensure" : record {presentationMount:interface-ref;occurrence:string;parent:optional>;} -> ref { + call id "presentation-states:ensure:call" execution transaction targets [browser,server]; + } +} diff --git a/test/fixtures/presentation-mount/ReaderNavigation.qx b/test/fixtures/presentation-mount/ReaderNavigation.qx new file mode 100644 index 0000000..e255880 --- /dev/null +++ b/test/fixtures/presentation-mount/ReaderNavigation.qx @@ -0,0 +1,7 @@ +import interface PresentationState; +interface ReaderNavigation id "reader-navigation" revision "reader-navigation@1" requires PresentationState { + queryable value page id "reader-navigation:mode" : string { + get id "reader-navigation:mode:get" execution snapshot targets [browser,server]; + set id "reader-navigation:mode:set" execution transaction targets [browser,server]; + } +} diff --git a/test/fixtures/presentation-mount/StateFactory.qx b/test/fixtures/presentation-mount/StateFactory.qx new file mode 100644 index 0000000..c764532 --- /dev/null +++ b/test/fixtures/presentation-mount/StateFactory.qx @@ -0,0 +1,6 @@ +import interface PresentationState; +interface StateFactory id "state-factory" revision "state-factory@1" { + static operation create id "state-factory:create" : record {occurrence:string;parent:optional>;} -> ref { + call id "state-factory:create:call" execution transaction targets [browser,server]; + } +} diff --git a/test/fixtures/presentation-mount/StateRecord.qx b/test/fixtures/presentation-mount/StateRecord.qx new file mode 100644 index 0000000..3088af6 --- /dev/null +++ b/test/fixtures/presentation-mount/StateRecord.qx @@ -0,0 +1 @@ +interface StateRecord id "state-record" revision "state-record@1" {} diff --git a/test/fixtures/presentation-mount/workspace.qx b/test/fixtures/presentation-mount/workspace.qx new file mode 100644 index 0000000..debd2a9 --- /dev/null +++ b/test/fixtures/presentation-mount/workspace.qx @@ -0,0 +1,81 @@ +workspace Example id "presentation-example" revision "presentation-example@1" commit "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" { + import interface PresentationState; + import interface StateRecord; + import interface PresentationMount; + import interface Presentation; + import interface PresentationStates; + import interface StateFactory; + import interface ReaderNavigation; + import interface DocumentNavigation; + import package PresentationRuntime; + atom PresentationMountRecord id "presentation-mount-record"; + atom Library id "library"; + atom Document id "document"; + atom ReaderNavigationRecord id "reader-navigation-record"; + atom DocumentNavigationRecord id "document-navigation-record"; + + conform PresentationMountRecord as PresentationMount id "presentation-mount-record:implementation" { + private edge Membership id "presentation-mount:membership" { + atom PresentationMountRecord projection members id "presentation-mount:members-projection" many-unique public-traversal; + interface PresentationState projection presentationMount id "presentation-mount:owner-projection" optional-one public-traversal; + } + private edge Root id "presentation-mount:root-edge" { + atom PresentationMountRecord projection root id "presentation-mount:root-projection" optional-one; + interface PresentationState projection rootOf id "presentation-mount:root-of-projection" optional-one; + } + bind members.resolve to edge Membership.members.resolve; + bind root.resolve to edge Root.root.resolve; + bind create.call to package PresentationRuntime.createPresentationMount with {presentationMount to creation PresentationMountRecord with {};}; + bind attach.call to package PresentationRuntime.attach with { + members to edge Membership.members; + root to edge Root.root; + metadata to interface PresentationState from input; + }; + } + conform Presentation as PresentationStates id "presentation:state-association" { + private edge States id "presentation:states-edge" { + atom Self projection states id "presentation:states-projection" many-unique; + object Navigation projection subject id "presentation:subject-projection" exactly-one; + } + bind states.resolve to edge States.states.resolve; + bind ensure.call to package PresentationRuntime.ensure with { + states to edge States.states; + metadata to interface PresentationState from input; + presentationMount to interface PresentationMount from input; + factory to interface StateFactory; + }; + } + conform StateRecord as PresentationState id "state-record:metadata" { + private state Occurrence id "metadata:occurrence" on Self : string policy register; + private edge Parent id "metadata:parent" { + atom Self projection parent id "metadata:parent-projection" optional-one; + interface PresentationState projection children id "metadata:children-projection" many-unique; + } + initialize {occurrence to state Occurrence;parent to edge Parent.parent;}; + bind occurrence.get to state Occurrence.read; + bind parent.resolve to edge Parent.parent.resolve; + bind presentationMount.resolve to edge Membership.presentationMount.resolve; + } + conform ReaderNavigationRecord as StateRecord id "reader:state-record" {} + conform DocumentNavigationRecord as StateRecord id "document:state-record" {} + conform ReaderNavigationRecord as ReaderNavigation id "reader:navigation" { + private state Mode id "reader:mode" on Self : string policy register default "library"; + bind page to state Mode; + } + conform DocumentNavigationRecord as DocumentNavigation id "document:navigation" { + private state Compact id "document:compact" on Self : bool policy register default false; + bind compact to state Compact; + } + conform Library as StateFactory id "reader:factory" { + bind create.call to package PresentationRuntime.createState with { + navigation to creation ReaderNavigationRecord with {PresentationState from input;}; + }; + } + conform Document as StateFactory id "document:factory" { + bind create.call to package PresentationRuntime.createState with { + navigation to creation DocumentNavigationRecord with {PresentationState from input;}; + }; + } + conform Library as Presentation id "library:presentation" {} + conform Document as Presentation id "document:presentation" {} +} diff --git a/test/presentation-mount-fixture.ts b/test/presentation-mount-fixture.ts new file mode 100644 index 0000000..16a5c06 --- /dev/null +++ b/test/presentation-mount-fixture.ts @@ -0,0 +1,35 @@ +import assert from "node:assert/strict"; +import { readFile } from "node:fs/promises"; +import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/parser.js"; +import { compileExecutionPlan } from "../src/execution-world/plan.js"; +import type { InterfaceRevision } from "../src/capability-model/types.js"; +export async function presentationMountPlan() { + const read = (name: string) => readFile(`test/fixtures/presentation-mount/${name}.qx`, "utf8"); + const source = { repository: "https://example.test/presentation-mount.git", commit: "a".repeat(40) }; + const interfaces = new Map(); + for (const name of [ + "StateRecord", + "PresentationState", + "PresentationMount", + "StateFactory", + "Presentation", + "PresentationStates", + "ReaderNavigation", + "DocumentNavigation", + ]) { + const result = compileCapabilityResourceSource(await read(name), { source, environment: { interfaces } }); + assert.ok(result.ok && result.resource.kind === "interface", JSON.stringify(result.diagnostics)); + interfaces.set(name, result.resource.revision); + } + const pkg = compileCapabilityResourceSource(await read("PresentationRuntime"), { + source, + environment: { interfaces }, + }); + assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); + const result = compileCapabilitySource(await read("workspace"), "workspace.qx", { + interfaces, + packages: new Map([["PresentationRuntime", pkg.resource.revision]]), + }); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + return compileExecutionPlan(result.workspace); +} From e0e8563224b67cb182dfe4746ca1ca03e733b076 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Fri, 25 Sep 2026 11:30:37 -0700 Subject: [PATCH 71/91] Expose closed module types and define stable presentation occurrences --- src/execution-world/client-contracts.ts | 3 ++- src/execution-world/installation.ts | 4 ++++ src/execution-world/module-contracts.ts | 17 +++++++++++++++++ src/execution-world/plan.ts | 6 ++++++ test/modules.test.ts | 25 +++++++++++++++++++++++++ 5 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 src/execution-world/module-contracts.ts diff --git a/src/execution-world/client-contracts.ts b/src/execution-world/client-contracts.ts index bbcbb67..fe974f3 100644 --- a/src/execution-world/client-contracts.ts +++ b/src/execution-world/client-contracts.ts @@ -7,6 +7,7 @@ import type { import { canonicalJson } from "../capability-model/evolution.js"; import { portableValueSchema, tsType } from "../bindings/portable.js"; import { type ExecutionPlan, resolvePlannedOperation, hexDigest, ExecutionPlanError } from "./plan.js"; +import { moduleTypeContext } from "./module-contracts.js"; /** Public shape only: no slot inventory, implementation binding, or workspace identity. */ export interface PublicOperationContract { @@ -111,7 +112,7 @@ export function generateInterfaceClientBindings( const members = iface.members.map((member) => { if (member.kind === "module" && member.subject?.kind === "interface") { const subject = member.subject.interfaceRevisionId; - return `${JSON.stringify(member.displayName)}: defineModuleMember<${JSON.stringify(subject)}, ${moduleProps?.(iface.revisionId, member.id) ?? "{}"}>(${JSON.stringify({ interface: iface.revisionId, member: member.id, subject, contract: member.contract })})`; + return `${JSON.stringify(member.displayName)}: defineModuleMember<${JSON.stringify(subject)}, ${moduleProps?.(iface.revisionId, member.id) ?? "{}"}>(${JSON.stringify({ interface: iface.revisionId, member: member.id, subject, contract: member.contract, ...moduleTypeContext(iface) })})`; } const operations = member.operations .filter((op) => op.mode === "call") diff --git a/src/execution-world/installation.ts b/src/execution-world/installation.ts index 5d41ec4..34d9f5e 100644 --- a/src/execution-world/installation.ts +++ b/src/execution-world/installation.ts @@ -128,6 +128,8 @@ export interface InstalledComponent { readonly member: string; readonly subject: string; readonly contract: string; + readonly typeArguments?: readonly unknown[]; + readonly requiredInterfaces?: readonly string[]; }; readonly packageRevision: string; readonly id: string; @@ -215,6 +217,8 @@ function assembleExecutionInstallation( member: module.memberId, subject: component.subject, contract: module.contract, + ...(module.typeArguments ? { typeArguments: module.typeArguments } : {}), + ...(module.requiredInterfaces ? { requiredInterfaces: module.requiredInterfaces } : {}), }; })(), packageRevision: revision, diff --git a/src/execution-world/module-contracts.ts b/src/execution-world/module-contracts.ts new file mode 100644 index 0000000..2105713 --- /dev/null +++ b/src/execution-world/module-contracts.ts @@ -0,0 +1,17 @@ +import type { InterfaceRevision } from "../capability-model/types.js"; + +/** Public, checked type information for artifact consumers. It describes the + * nominal role, without exposing implementations or synthesizing any storage. */ +export function moduleTypeContext(iface: InterfaceRevision): { + typeArguments?: readonly unknown[]; + requiredInterfaces?: readonly string[]; +} { + return { + ...(iface.application?.arguments.length + ? { + typeArguments: structuredClone(iface.application.arguments), + } + : {}), + ...(iface.requiredInterfaces?.length ? { requiredInterfaces: [...iface.requiredInterfaces].sort() } : {}), + }; +} diff --git a/src/execution-world/plan.ts b/src/execution-world/plan.ts index e72aa42..ae543f3 100644 --- a/src/execution-world/plan.ts +++ b/src/execution-world/plan.ts @@ -16,6 +16,7 @@ import { resolveForwardedBinding } from "../capability-model/forwarding.js"; import { linkQueries, type LinkedQuery } from "../query/link.js"; import { type BindingSchema } from "../bindings/index.js"; import { unsupportedQueryOperator } from "./query-operators.js"; +import { moduleTypeContext } from "./module-contracts.js"; export class ExecutionPlanError extends Error { constructor( @@ -62,6 +63,8 @@ export interface PlanPackage { modules?: (NonNullable[number] & { contract: string; subject?: import("../capability-model/types.js").ObjectExpectation; + typeArguments?: readonly unknown[]; + requiredInterfaces?: readonly string[]; })[]; controllers?: NonNullable; components?: { id: string; displayName: string; subject: InterfaceRevisionId; runtime: "react" }[]; @@ -504,6 +507,9 @@ export function compileExecutionPlan(input: WorkspaceRevision): ExecutionPlan { ...module, contract: contract.contract, ...(contract.subject ? { subject: contract.subject } : {}), + ...moduleTypeContext( + workspace.interfaceImports.find((iface) => iface.revisionId === module.interfaceRevisionId)!, + ), }; }), } diff --git a/test/modules.test.ts b/test/modules.test.ts index 3611120..12d0516 100644 --- a/test/modules.test.ts +++ b/test/modules.test.ts @@ -211,3 +211,28 @@ test("unrecognized module consumers fail before artifact execution, not during i /No artifact consumer.*example.device.firmware/, ); }); + +test("artifact consumers receive checked closed role arguments and prerequisites", async () => { + const { moduleTypeContext } = await import("../src/execution-world/module-contracts.js"); + const { generateInterfaceClientBindings } = await import("../src/execution-world/client-contracts.js"); + const result = compile(); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const role = result.workspace.interfaceImports.find((iface) => iface.application)!; + const expected = [{ kind: "object", target: { kind: "interface", interfaceRevisionId: "interface:data@1" } }]; + assert.deepEqual(moduleTypeContext(role), { typeArguments: expected }); + const plan = compileExecutionPlan(result.workspace); + assert.deepEqual( + plan.definition.packages[0]!.modules!.find((module) => module.displayName === "Editor")!.typeArguments, + expected, + ); + assert.match(generateInterfaceClientBindings({ Editor: role }), /"typeArguments":\[/); + assert.deepEqual(moduleTypeContext(interfaces.get("Row")!), {}); + // Prerequisites are public nominal contracts, never private storage inventory. + assert.deepEqual( + moduleTypeContext({ + ...role, + requiredInterfaces: [capabilityId.interfaceRevision("z"), capabilityId.interfaceRevision("a")], + }).requiredInterfaces, + ["a", "z"], + ); +}); From 1bc3c69de35e6c2e764afa7f103ba68002885fda Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Fri, 25 Sep 2026 11:37:27 -0700 Subject: [PATCH 72/91] Support checked keyed relationships across portable operations and queries --- grammar/QuixosCapability.g4 | 2 +- src/bindings/portable.ts | 8 +- .../generated/QuixosCapability.interp | 2 +- .../generated/QuixosCapabilityParser.ts | 1864 +++++++++-------- src/capability-language/parser.ts | 68 +- src/capability-model/generic-packages.ts | 1 + src/capability-model/initialization.ts | 7 + src/capability-model/types.ts | 1 + src/capability-model/validation.ts | 33 +- src/execution-world/kernel.ts | 5 +- src/execution-world/query-operators.ts | 6 +- src/query/compile.ts | 8 +- src/query/schema.ts | 6 +- test/conformance-rules.test.ts | 7 + test/emit-portable-reader.ts | 4 + .../presentation-mount/PresentationRuntime.qx | 9 +- .../presentation-mount/PresentationStates.qx | 2 +- .../queries/reader-inputs.graphql | 7 + .../queries/reader-state.graphql | 7 + .../queries/reader-window.graphql | 7 + test/fixtures/presentation-mount/workspace.qx | 11 +- test/keyed-relationships.test.ts | 78 + test/presentation-mount-fixture.ts | 9 + 23 files changed, 1203 insertions(+), 949 deletions(-) create mode 100644 test/fixtures/presentation-mount/queries/reader-inputs.graphql create mode 100644 test/fixtures/presentation-mount/queries/reader-state.graphql create mode 100644 test/fixtures/presentation-mount/queries/reader-window.graphql create mode 100644 test/keyed-relationships.test.ts diff --git a/grammar/QuixosCapability.g4 b/grammar/QuixosCapability.g4 index b27330e..d4c77f6 100644 --- a/grammar/QuixosCapability.g4 +++ b/grammar/QuixosCapability.g4 @@ -245,7 +245,7 @@ dependencyBlock dependencyPort : REFLECTION identifier ID stringLiteral LBRACK identifierList RBRACK SEMI | STATE identifier ID stringLiteral COLON valueType primitiveList SEMI - | EDGE identifier ID stringLiteral COLON cardinality targetConstraint primitiveList SEMI + | EDGE identifier ID stringLiteral COLON cardinality targetConstraint (KEYED stringLiteral)? primitiveList SEMI | INTERFACE identifier ID stringLiteral COLON identifier typeArguments? selectedOperations? (FROM INPUT)? SEMI | CREATION identifier ID stringLiteral COLON identifier INPUT valueType SEMI | CONSTRUCTOR identifier ID stringLiteral COLON identifier (INPUT valueType)? SEMI diff --git a/src/bindings/portable.ts b/src/bindings/portable.ts index 4ca3634..a195625 100644 --- a/src/bindings/portable.ts +++ b/src/bindings/portable.ts @@ -163,12 +163,16 @@ function methods( }); case "edge": { const ref: ValueType = { kind: "object-ref", expectation: req.target }; - const item: ValueType = { kind: "record", fields: { entry: string, target: ref } }; + const mapKey: ValueType | undefined = req.keyType + ? { kind: "scalar", name: req.keyType === "boolean" ? "bool" : req.keyType } + : undefined; + const item: ValueType = { kind: "record", fields: { entry: string, target: ref, ...(mapKey ? { mapKey } : {}) } }; + const connectInput: ValueType = mapKey ? { kind: "record", fields: { mapKey, target: ref } } : ref; return req.primitives.map((primitive) => { if (primitive === "resolve") return method("resolve", { kind: "edge", primitive }, unit, { kind: "list", value: item }); writable(); - if (primitive === "connect") return method("connect", { kind: "edge", primitive }, ref, string, true); + if (primitive === "connect") return method("connect", { kind: "edge", primitive }, connectInput, string, true); if (primitive === "disconnect") return method("disconnect", { kind: "edge", primitive }, string, bool); throw new PortableBindingError(path, `Edge ${primitive} is not supported by this portable adapter yet`); }); diff --git a/src/capability-language/generated/QuixosCapability.interp b/src/capability-language/generated/QuixosCapability.interp index a7cdacc..ba1c860 100644 --- a/src/capability-language/generated/QuixosCapability.interp +++ b/src/capability-language/generated/QuixosCapability.interp @@ -397,4 +397,4 @@ stringLiteral atn: -[4, 1, 153, 1403, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 179, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 184, 8, 1, 10, 1, 12, 1, 187, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 205, 8, 3, 10, 3, 12, 3, 208, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 220, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 232, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 252, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 260, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 265, 8, 10, 10, 10, 12, 10, 268, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 273, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 283, 8, 10, 10, 10, 12, 10, 286, 9, 10, 3, 10, 288, 8, 10, 1, 10, 1, 10, 5, 10, 292, 8, 10, 10, 10, 12, 10, 295, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 303, 8, 11, 10, 11, 12, 11, 306, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 314, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 322, 8, 12, 10, 12, 12, 12, 325, 9, 12, 3, 12, 327, 8, 12, 3, 12, 329, 8, 12, 1, 13, 1, 13, 3, 13, 333, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 339, 8, 14, 10, 14, 12, 14, 342, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 353, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 358, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 368, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 378, 8, 18, 1, 18, 1, 18, 1, 19, 3, 19, 383, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 398, 8, 19, 1, 19, 1, 19, 1, 19, 1, 20, 3, 20, 404, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 414, 8, 20, 10, 20, 12, 20, 417, 9, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 425, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 433, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 441, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 454, 8, 21, 1, 22, 3, 22, 457, 8, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 467, 8, 22, 1, 22, 1, 22, 3, 22, 471, 8, 22, 1, 22, 1, 22, 5, 22, 475, 8, 22, 10, 22, 12, 22, 478, 9, 22, 1, 22, 1, 22, 1, 23, 1, 23, 3, 23, 484, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 490, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 498, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 506, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 519, 8, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 526, 8, 25, 1, 25, 1, 25, 3, 25, 530, 8, 25, 1, 26, 5, 26, 533, 8, 26, 10, 26, 12, 26, 536, 9, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 546, 8, 26, 1, 26, 1, 26, 5, 26, 550, 8, 26, 10, 26, 12, 26, 553, 9, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 563, 8, 27, 1, 28, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 3, 30, 589, 8, 30, 1, 30, 1, 30, 3, 30, 593, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 599, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 5, 30, 608, 8, 30, 10, 30, 12, 30, 611, 9, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 619, 8, 30, 1, 30, 1, 30, 5, 30, 623, 8, 30, 10, 30, 12, 30, 626, 9, 30, 1, 30, 1, 30, 3, 30, 630, 8, 30, 3, 30, 632, 8, 30, 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, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 661, 8, 32, 10, 32, 12, 32, 664, 9, 32, 1, 32, 3, 32, 667, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 673, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 700, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 3, 34, 710, 8, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 721, 8, 34, 1, 34, 3, 34, 724, 8, 34, 1, 34, 1, 34, 1, 34, 3, 34, 729, 8, 34, 1, 34, 3, 34, 732, 8, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 3, 35, 739, 8, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 748, 8, 35, 1, 35, 3, 35, 751, 8, 35, 1, 35, 3, 35, 754, 8, 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, 37, 1, 37, 1, 37, 3, 37, 771, 8, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 778, 8, 38, 10, 38, 12, 38, 781, 9, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 794, 8, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 813, 8, 42, 10, 42, 12, 42, 816, 9, 42, 3, 42, 818, 8, 42, 1, 42, 3, 42, 821, 8, 42, 1, 43, 1, 43, 1, 43, 5, 43, 826, 8, 43, 10, 43, 12, 43, 829, 9, 43, 1, 44, 1, 44, 1, 44, 5, 44, 834, 8, 44, 10, 44, 12, 44, 837, 9, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 876, 8, 45, 1, 45, 3, 45, 879, 8, 45, 1, 45, 1, 45, 3, 45, 883, 8, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 905, 8, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 919, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 5, 46, 925, 8, 46, 10, 46, 12, 46, 928, 9, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 3, 49, 939, 8, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 953, 8, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 963, 8, 51, 1, 52, 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, 53, 1, 53, 3, 53, 981, 8, 53, 1, 53, 1, 53, 3, 53, 985, 8, 53, 1, 53, 3, 53, 988, 8, 53, 1, 53, 1, 53, 3, 53, 992, 8, 53, 1, 53, 3, 53, 995, 8, 53, 1, 53, 1, 53, 1, 54, 1, 54, 3, 54, 1001, 8, 54, 1, 54, 1, 54, 3, 54, 1005, 8, 54, 1, 54, 1, 54, 1, 54, 3, 54, 1010, 8, 54, 1, 54, 1, 54, 3, 54, 1014, 8, 54, 1, 54, 1, 54, 3, 54, 1018, 8, 54, 1, 54, 1, 54, 5, 54, 1022, 8, 54, 10, 54, 12, 54, 1025, 9, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 1038, 8, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 5, 58, 1051, 8, 58, 10, 58, 12, 58, 1054, 9, 58, 1, 58, 1, 58, 1, 58, 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, 1073, 8, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 1080, 8, 60, 10, 60, 12, 60, 1083, 9, 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, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1114, 8, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1134, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1154, 8, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1164, 8, 66, 1, 66, 3, 66, 1167, 8, 66, 1, 66, 3, 66, 1170, 8, 66, 3, 66, 1172, 8, 66, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 5, 70, 1184, 8, 70, 10, 70, 12, 70, 1187, 9, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1210, 8, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1226, 8, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1235, 8, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1245, 8, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 5, 71, 1256, 8, 71, 10, 71, 12, 71, 1259, 9, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1273, 8, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1285, 8, 71, 1, 71, 1, 71, 3, 71, 1289, 8, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1298, 8, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1316, 8, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 5, 73, 1338, 8, 73, 10, 73, 12, 73, 1341, 9, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1346, 8, 73, 3, 73, 1348, 8, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 3, 77, 1367, 8, 77, 1, 78, 1, 78, 1, 78, 1, 78, 5, 78, 1373, 8, 78, 10, 78, 12, 78, 1376, 9, 78, 3, 78, 1378, 8, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 5, 80, 1390, 8, 80, 10, 80, 12, 80, 1393, 9, 80, 3, 80, 1395, 8, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 0, 0, 83, 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, 0, 9, 2, 0, 15, 15, 33, 33, 1, 0, 11, 12, 1, 0, 101, 105, 3, 0, 1, 1, 96, 100, 102, 103, 3, 0, 1, 1, 96, 97, 102, 103, 2, 0, 98, 100, 102, 103, 1, 0, 121, 128, 1, 0, 108, 111, 9, 0, 1, 1, 4, 8, 10, 33, 40, 40, 45, 45, 74, 74, 94, 95, 106, 106, 149, 149, 1519, 0, 178, 1, 0, 0, 0, 2, 180, 1, 0, 0, 0, 4, 190, 1, 0, 0, 0, 6, 194, 1, 0, 0, 0, 8, 219, 1, 0, 0, 0, 10, 231, 1, 0, 0, 0, 12, 233, 1, 0, 0, 0, 14, 240, 1, 0, 0, 0, 16, 251, 1, 0, 0, 0, 18, 253, 1, 0, 0, 0, 20, 266, 1, 0, 0, 0, 22, 298, 1, 0, 0, 0, 24, 328, 1, 0, 0, 0, 26, 330, 1, 0, 0, 0, 28, 334, 1, 0, 0, 0, 30, 352, 1, 0, 0, 0, 32, 354, 1, 0, 0, 0, 34, 367, 1, 0, 0, 0, 36, 369, 1, 0, 0, 0, 38, 382, 1, 0, 0, 0, 40, 403, 1, 0, 0, 0, 42, 453, 1, 0, 0, 0, 44, 456, 1, 0, 0, 0, 46, 481, 1, 0, 0, 0, 48, 518, 1, 0, 0, 0, 50, 529, 1, 0, 0, 0, 52, 534, 1, 0, 0, 0, 54, 562, 1, 0, 0, 0, 56, 564, 1, 0, 0, 0, 58, 574, 1, 0, 0, 0, 60, 586, 1, 0, 0, 0, 62, 633, 1, 0, 0, 0, 64, 699, 1, 0, 0, 0, 66, 701, 1, 0, 0, 0, 68, 706, 1, 0, 0, 0, 70, 735, 1, 0, 0, 0, 72, 757, 1, 0, 0, 0, 74, 770, 1, 0, 0, 0, 76, 772, 1, 0, 0, 0, 78, 784, 1, 0, 0, 0, 80, 797, 1, 0, 0, 0, 82, 800, 1, 0, 0, 0, 84, 820, 1, 0, 0, 0, 86, 822, 1, 0, 0, 0, 88, 830, 1, 0, 0, 0, 90, 918, 1, 0, 0, 0, 92, 920, 1, 0, 0, 0, 94, 931, 1, 0, 0, 0, 96, 933, 1, 0, 0, 0, 98, 938, 1, 0, 0, 0, 100, 940, 1, 0, 0, 0, 102, 962, 1, 0, 0, 0, 104, 964, 1, 0, 0, 0, 106, 973, 1, 0, 0, 0, 108, 998, 1, 0, 0, 0, 110, 1028, 1, 0, 0, 0, 112, 1037, 1, 0, 0, 0, 114, 1039, 1, 0, 0, 0, 116, 1047, 1, 0, 0, 0, 118, 1072, 1, 0, 0, 0, 120, 1074, 1, 0, 0, 0, 122, 1086, 1, 0, 0, 0, 124, 1093, 1, 0, 0, 0, 126, 1107, 1, 0, 0, 0, 128, 1117, 1, 0, 0, 0, 130, 1133, 1, 0, 0, 0, 132, 1171, 1, 0, 0, 0, 134, 1173, 1, 0, 0, 0, 136, 1176, 1, 0, 0, 0, 138, 1178, 1, 0, 0, 0, 140, 1180, 1, 0, 0, 0, 142, 1288, 1, 0, 0, 0, 144, 1290, 1, 0, 0, 0, 146, 1347, 1, 0, 0, 0, 148, 1349, 1, 0, 0, 0, 150, 1354, 1, 0, 0, 0, 152, 1356, 1, 0, 0, 0, 154, 1366, 1, 0, 0, 0, 156, 1368, 1, 0, 0, 0, 158, 1381, 1, 0, 0, 0, 160, 1385, 1, 0, 0, 0, 162, 1398, 1, 0, 0, 0, 164, 1400, 1, 0, 0, 0, 166, 167, 3, 6, 3, 0, 167, 168, 5, 0, 0, 1, 168, 179, 1, 0, 0, 0, 169, 170, 3, 20, 10, 0, 170, 171, 5, 0, 0, 1, 171, 179, 1, 0, 0, 0, 172, 173, 3, 52, 26, 0, 173, 174, 5, 0, 0, 1, 174, 179, 1, 0, 0, 0, 175, 176, 3, 2, 1, 0, 176, 177, 5, 0, 0, 1, 177, 179, 1, 0, 0, 0, 178, 166, 1, 0, 0, 0, 178, 169, 1, 0, 0, 0, 178, 172, 1, 0, 0, 0, 178, 175, 1, 0, 0, 0, 179, 1, 1, 0, 0, 0, 180, 181, 5, 40, 0, 0, 181, 185, 5, 137, 0, 0, 182, 184, 3, 8, 4, 0, 183, 182, 1, 0, 0, 0, 184, 187, 1, 0, 0, 0, 185, 183, 1, 0, 0, 0, 185, 186, 1, 0, 0, 0, 186, 188, 1, 0, 0, 0, 187, 185, 1, 0, 0, 0, 188, 189, 5, 138, 0, 0, 189, 3, 1, 0, 0, 0, 190, 191, 5, 41, 0, 0, 191, 192, 3, 164, 82, 0, 192, 193, 5, 134, 0, 0, 193, 5, 1, 0, 0, 0, 194, 195, 5, 9, 0, 0, 195, 196, 3, 162, 81, 0, 196, 197, 5, 84, 0, 0, 197, 198, 3, 164, 82, 0, 198, 199, 5, 77, 0, 0, 199, 200, 3, 164, 82, 0, 200, 201, 5, 76, 0, 0, 201, 202, 3, 164, 82, 0, 202, 206, 5, 137, 0, 0, 203, 205, 3, 8, 4, 0, 204, 203, 1, 0, 0, 0, 205, 208, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 206, 207, 1, 0, 0, 0, 207, 209, 1, 0, 0, 0, 208, 206, 1, 0, 0, 0, 209, 210, 5, 138, 0, 0, 210, 7, 1, 0, 0, 0, 211, 220, 3, 4, 2, 0, 212, 220, 3, 18, 9, 0, 213, 220, 3, 10, 5, 0, 214, 220, 3, 96, 48, 0, 215, 220, 3, 108, 54, 0, 216, 220, 3, 144, 72, 0, 217, 220, 3, 58, 29, 0, 218, 220, 3, 32, 16, 0, 219, 211, 1, 0, 0, 0, 219, 212, 1, 0, 0, 0, 219, 213, 1, 0, 0, 0, 219, 214, 1, 0, 0, 0, 219, 215, 1, 0, 0, 0, 219, 216, 1, 0, 0, 0, 219, 217, 1, 0, 0, 0, 219, 218, 1, 0, 0, 0, 220, 9, 1, 0, 0, 0, 221, 222, 5, 41, 0, 0, 222, 223, 5, 44, 0, 0, 223, 224, 3, 162, 81, 0, 224, 225, 5, 134, 0, 0, 225, 232, 1, 0, 0, 0, 226, 227, 5, 41, 0, 0, 227, 228, 5, 46, 0, 0, 228, 229, 3, 162, 81, 0, 229, 230, 5, 134, 0, 0, 230, 232, 1, 0, 0, 0, 231, 221, 1, 0, 0, 0, 231, 226, 1, 0, 0, 0, 232, 11, 1, 0, 0, 0, 233, 234, 5, 42, 0, 0, 234, 235, 5, 43, 0, 0, 235, 236, 3, 162, 81, 0, 236, 237, 5, 84, 0, 0, 237, 238, 3, 164, 82, 0, 238, 239, 5, 134, 0, 0, 239, 13, 1, 0, 0, 0, 240, 241, 5, 42, 0, 0, 241, 242, 5, 44, 0, 0, 242, 243, 3, 162, 81, 0, 243, 244, 5, 77, 0, 0, 244, 245, 3, 164, 82, 0, 245, 246, 5, 134, 0, 0, 246, 15, 1, 0, 0, 0, 247, 252, 3, 10, 5, 0, 248, 252, 3, 12, 6, 0, 249, 252, 3, 14, 7, 0, 250, 252, 3, 32, 16, 0, 251, 247, 1, 0, 0, 0, 251, 248, 1, 0, 0, 0, 251, 249, 1, 0, 0, 0, 251, 250, 1, 0, 0, 0, 252, 17, 1, 0, 0, 0, 253, 254, 5, 43, 0, 0, 254, 255, 3, 162, 81, 0, 255, 256, 5, 84, 0, 0, 256, 259, 3, 164, 82, 0, 257, 258, 5, 85, 0, 0, 258, 260, 3, 164, 82, 0, 259, 257, 1, 0, 0, 0, 259, 260, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 262, 5, 134, 0, 0, 262, 19, 1, 0, 0, 0, 263, 265, 3, 16, 8, 0, 264, 263, 1, 0, 0, 0, 265, 268, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 269, 1, 0, 0, 0, 268, 266, 1, 0, 0, 0, 269, 270, 5, 44, 0, 0, 270, 272, 3, 162, 81, 0, 271, 273, 3, 22, 11, 0, 272, 271, 1, 0, 0, 0, 272, 273, 1, 0, 0, 0, 273, 274, 1, 0, 0, 0, 274, 275, 5, 84, 0, 0, 275, 276, 3, 164, 82, 0, 276, 277, 5, 77, 0, 0, 277, 287, 3, 164, 82, 0, 278, 279, 5, 89, 0, 0, 279, 284, 3, 26, 13, 0, 280, 281, 5, 135, 0, 0, 281, 283, 3, 26, 13, 0, 282, 280, 1, 0, 0, 0, 283, 286, 1, 0, 0, 0, 284, 282, 1, 0, 0, 0, 284, 285, 1, 0, 0, 0, 285, 288, 1, 0, 0, 0, 286, 284, 1, 0, 0, 0, 287, 278, 1, 0, 0, 0, 287, 288, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 293, 5, 137, 0, 0, 290, 292, 3, 34, 17, 0, 291, 290, 1, 0, 0, 0, 292, 295, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 293, 294, 1, 0, 0, 0, 294, 296, 1, 0, 0, 0, 295, 293, 1, 0, 0, 0, 296, 297, 5, 138, 0, 0, 297, 21, 1, 0, 0, 0, 298, 299, 5, 143, 0, 0, 299, 304, 3, 24, 12, 0, 300, 301, 5, 135, 0, 0, 301, 303, 3, 24, 12, 0, 302, 300, 1, 0, 0, 0, 303, 306, 1, 0, 0, 0, 304, 302, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 307, 1, 0, 0, 0, 306, 304, 1, 0, 0, 0, 307, 308, 5, 144, 0, 0, 308, 23, 1, 0, 0, 0, 309, 310, 5, 47, 0, 0, 310, 313, 3, 162, 81, 0, 311, 312, 5, 133, 0, 0, 312, 314, 5, 37, 0, 0, 313, 311, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 329, 1, 0, 0, 0, 315, 316, 5, 36, 0, 0, 316, 326, 3, 162, 81, 0, 317, 318, 5, 38, 0, 0, 318, 323, 3, 26, 13, 0, 319, 320, 5, 145, 0, 0, 320, 322, 3, 26, 13, 0, 321, 319, 1, 0, 0, 0, 322, 325, 1, 0, 0, 0, 323, 321, 1, 0, 0, 0, 323, 324, 1, 0, 0, 0, 324, 327, 1, 0, 0, 0, 325, 323, 1, 0, 0, 0, 326, 317, 1, 0, 0, 0, 326, 327, 1, 0, 0, 0, 327, 329, 1, 0, 0, 0, 328, 309, 1, 0, 0, 0, 328, 315, 1, 0, 0, 0, 329, 25, 1, 0, 0, 0, 330, 332, 3, 162, 81, 0, 331, 333, 3, 28, 14, 0, 332, 331, 1, 0, 0, 0, 332, 333, 1, 0, 0, 0, 333, 27, 1, 0, 0, 0, 334, 335, 5, 143, 0, 0, 335, 340, 3, 30, 15, 0, 336, 337, 5, 135, 0, 0, 337, 339, 3, 30, 15, 0, 338, 336, 1, 0, 0, 0, 339, 342, 1, 0, 0, 0, 340, 338, 1, 0, 0, 0, 340, 341, 1, 0, 0, 0, 341, 343, 1, 0, 0, 0, 342, 340, 1, 0, 0, 0, 343, 344, 5, 144, 0, 0, 344, 29, 1, 0, 0, 0, 345, 346, 5, 43, 0, 0, 346, 353, 3, 162, 81, 0, 347, 348, 5, 44, 0, 0, 348, 353, 3, 26, 13, 0, 349, 350, 5, 36, 0, 0, 350, 353, 3, 162, 81, 0, 351, 353, 3, 146, 73, 0, 352, 345, 1, 0, 0, 0, 352, 347, 1, 0, 0, 0, 352, 349, 1, 0, 0, 0, 352, 351, 1, 0, 0, 0, 353, 31, 1, 0, 0, 0, 354, 355, 5, 35, 0, 0, 355, 357, 3, 162, 81, 0, 356, 358, 3, 22, 11, 0, 357, 356, 1, 0, 0, 0, 357, 358, 1, 0, 0, 0, 358, 359, 1, 0, 0, 0, 359, 360, 5, 146, 0, 0, 360, 361, 3, 146, 73, 0, 361, 362, 5, 134, 0, 0, 362, 33, 1, 0, 0, 0, 363, 368, 3, 40, 20, 0, 364, 368, 3, 44, 22, 0, 365, 368, 3, 38, 19, 0, 366, 368, 3, 36, 18, 0, 367, 363, 1, 0, 0, 0, 367, 364, 1, 0, 0, 0, 367, 365, 1, 0, 0, 0, 367, 366, 1, 0, 0, 0, 368, 35, 1, 0, 0, 0, 369, 370, 5, 2, 0, 0, 370, 371, 3, 162, 81, 0, 371, 372, 5, 84, 0, 0, 372, 373, 3, 164, 82, 0, 373, 374, 5, 3, 0, 0, 374, 377, 3, 164, 82, 0, 375, 376, 5, 5, 0, 0, 376, 378, 3, 50, 25, 0, 377, 375, 1, 0, 0, 0, 377, 378, 1, 0, 0, 0, 378, 379, 1, 0, 0, 0, 379, 380, 5, 134, 0, 0, 380, 37, 1, 0, 0, 0, 381, 383, 5, 57, 0, 0, 382, 381, 1, 0, 0, 0, 382, 383, 1, 0, 0, 0, 383, 384, 1, 0, 0, 0, 384, 385, 5, 49, 0, 0, 385, 386, 3, 162, 81, 0, 386, 387, 5, 84, 0, 0, 387, 388, 3, 164, 82, 0, 388, 389, 5, 133, 0, 0, 389, 390, 3, 146, 73, 0, 390, 391, 5, 132, 0, 0, 391, 392, 3, 146, 73, 0, 392, 393, 5, 137, 0, 0, 393, 394, 5, 101, 0, 0, 394, 395, 5, 84, 0, 0, 395, 397, 3, 164, 82, 0, 396, 398, 3, 74, 37, 0, 397, 396, 1, 0, 0, 0, 397, 398, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 400, 5, 134, 0, 0, 400, 401, 5, 138, 0, 0, 401, 39, 1, 0, 0, 0, 402, 404, 3, 46, 23, 0, 403, 402, 1, 0, 0, 0, 403, 404, 1, 0, 0, 0, 404, 405, 1, 0, 0, 0, 405, 406, 5, 47, 0, 0, 406, 407, 3, 162, 81, 0, 407, 408, 5, 84, 0, 0, 408, 409, 3, 164, 82, 0, 409, 410, 5, 133, 0, 0, 410, 411, 3, 146, 73, 0, 411, 415, 5, 137, 0, 0, 412, 414, 3, 42, 21, 0, 413, 412, 1, 0, 0, 0, 414, 417, 1, 0, 0, 0, 415, 413, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 418, 1, 0, 0, 0, 417, 415, 1, 0, 0, 0, 418, 419, 5, 138, 0, 0, 419, 41, 1, 0, 0, 0, 420, 421, 5, 91, 0, 0, 421, 422, 5, 84, 0, 0, 422, 424, 3, 164, 82, 0, 423, 425, 3, 74, 37, 0, 424, 423, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 427, 5, 134, 0, 0, 427, 454, 1, 0, 0, 0, 428, 429, 5, 92, 0, 0, 429, 430, 5, 84, 0, 0, 430, 432, 3, 164, 82, 0, 431, 433, 3, 74, 37, 0, 432, 431, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 434, 1, 0, 0, 0, 434, 435, 5, 134, 0, 0, 435, 454, 1, 0, 0, 0, 436, 437, 5, 1, 0, 0, 437, 438, 5, 84, 0, 0, 438, 440, 3, 164, 82, 0, 439, 441, 3, 74, 37, 0, 440, 439, 1, 0, 0, 0, 440, 441, 1, 0, 0, 0, 441, 442, 1, 0, 0, 0, 442, 443, 5, 134, 0, 0, 443, 454, 1, 0, 0, 0, 444, 445, 5, 93, 0, 0, 445, 446, 5, 94, 0, 0, 446, 447, 5, 84, 0, 0, 447, 448, 3, 164, 82, 0, 448, 449, 5, 95, 0, 0, 449, 450, 5, 84, 0, 0, 450, 451, 3, 164, 82, 0, 451, 452, 5, 134, 0, 0, 452, 454, 1, 0, 0, 0, 453, 420, 1, 0, 0, 0, 453, 428, 1, 0, 0, 0, 453, 436, 1, 0, 0, 0, 453, 444, 1, 0, 0, 0, 454, 43, 1, 0, 0, 0, 455, 457, 3, 46, 23, 0, 456, 455, 1, 0, 0, 0, 456, 457, 1, 0, 0, 0, 457, 458, 1, 0, 0, 0, 458, 459, 5, 48, 0, 0, 459, 460, 3, 162, 81, 0, 460, 461, 5, 84, 0, 0, 461, 462, 3, 164, 82, 0, 462, 463, 5, 133, 0, 0, 463, 464, 3, 152, 76, 0, 464, 466, 3, 50, 25, 0, 465, 467, 5, 112, 0, 0, 466, 465, 1, 0, 0, 0, 466, 467, 1, 0, 0, 0, 467, 470, 1, 0, 0, 0, 468, 469, 5, 82, 0, 0, 469, 471, 3, 164, 82, 0, 470, 468, 1, 0, 0, 0, 470, 471, 1, 0, 0, 0, 471, 472, 1, 0, 0, 0, 472, 476, 5, 137, 0, 0, 473, 475, 3, 48, 24, 0, 474, 473, 1, 0, 0, 0, 475, 478, 1, 0, 0, 0, 476, 474, 1, 0, 0, 0, 476, 477, 1, 0, 0, 0, 477, 479, 1, 0, 0, 0, 478, 476, 1, 0, 0, 0, 479, 480, 5, 138, 0, 0, 480, 45, 1, 0, 0, 0, 481, 483, 5, 32, 0, 0, 482, 484, 7, 0, 0, 0, 483, 482, 1, 0, 0, 0, 483, 484, 1, 0, 0, 0, 484, 47, 1, 0, 0, 0, 485, 486, 5, 98, 0, 0, 486, 487, 5, 84, 0, 0, 487, 489, 3, 164, 82, 0, 488, 490, 3, 74, 37, 0, 489, 488, 1, 0, 0, 0, 489, 490, 1, 0, 0, 0, 490, 491, 1, 0, 0, 0, 491, 492, 5, 134, 0, 0, 492, 519, 1, 0, 0, 0, 493, 494, 5, 99, 0, 0, 494, 495, 5, 84, 0, 0, 495, 497, 3, 164, 82, 0, 496, 498, 3, 74, 37, 0, 497, 496, 1, 0, 0, 0, 497, 498, 1, 0, 0, 0, 498, 499, 1, 0, 0, 0, 499, 500, 5, 134, 0, 0, 500, 519, 1, 0, 0, 0, 501, 502, 5, 100, 0, 0, 502, 503, 5, 84, 0, 0, 503, 505, 3, 164, 82, 0, 504, 506, 3, 74, 37, 0, 505, 504, 1, 0, 0, 0, 505, 506, 1, 0, 0, 0, 506, 507, 1, 0, 0, 0, 507, 508, 5, 134, 0, 0, 508, 519, 1, 0, 0, 0, 509, 510, 5, 93, 0, 0, 510, 511, 5, 94, 0, 0, 511, 512, 5, 84, 0, 0, 512, 513, 3, 164, 82, 0, 513, 514, 5, 95, 0, 0, 514, 515, 5, 84, 0, 0, 515, 516, 3, 164, 82, 0, 516, 517, 5, 134, 0, 0, 517, 519, 1, 0, 0, 0, 518, 485, 1, 0, 0, 0, 518, 493, 1, 0, 0, 0, 518, 501, 1, 0, 0, 0, 518, 509, 1, 0, 0, 0, 519, 49, 1, 0, 0, 0, 520, 521, 5, 43, 0, 0, 521, 530, 3, 162, 81, 0, 522, 523, 5, 44, 0, 0, 523, 525, 3, 162, 81, 0, 524, 526, 3, 28, 14, 0, 525, 524, 1, 0, 0, 0, 525, 526, 1, 0, 0, 0, 526, 530, 1, 0, 0, 0, 527, 528, 5, 36, 0, 0, 528, 530, 3, 162, 81, 0, 529, 520, 1, 0, 0, 0, 529, 522, 1, 0, 0, 0, 529, 527, 1, 0, 0, 0, 530, 51, 1, 0, 0, 0, 531, 533, 3, 16, 8, 0, 532, 531, 1, 0, 0, 0, 533, 536, 1, 0, 0, 0, 534, 532, 1, 0, 0, 0, 534, 535, 1, 0, 0, 0, 535, 537, 1, 0, 0, 0, 536, 534, 1, 0, 0, 0, 537, 538, 5, 46, 0, 0, 538, 539, 3, 162, 81, 0, 539, 540, 5, 84, 0, 0, 540, 541, 3, 164, 82, 0, 541, 542, 5, 77, 0, 0, 542, 545, 3, 164, 82, 0, 543, 544, 5, 78, 0, 0, 544, 546, 5, 147, 0, 0, 545, 543, 1, 0, 0, 0, 545, 546, 1, 0, 0, 0, 546, 547, 1, 0, 0, 0, 547, 551, 5, 137, 0, 0, 548, 550, 3, 54, 27, 0, 549, 548, 1, 0, 0, 0, 550, 553, 1, 0, 0, 0, 551, 549, 1, 0, 0, 0, 551, 552, 1, 0, 0, 0, 552, 554, 1, 0, 0, 0, 553, 551, 1, 0, 0, 0, 554, 555, 5, 138, 0, 0, 555, 53, 1, 0, 0, 0, 556, 563, 3, 68, 34, 0, 557, 563, 3, 70, 35, 0, 558, 563, 3, 78, 39, 0, 559, 563, 3, 60, 30, 0, 560, 563, 3, 62, 31, 0, 561, 563, 3, 56, 28, 0, 562, 556, 1, 0, 0, 0, 562, 557, 1, 0, 0, 0, 562, 558, 1, 0, 0, 0, 562, 559, 1, 0, 0, 0, 562, 560, 1, 0, 0, 0, 562, 561, 1, 0, 0, 0, 563, 55, 1, 0, 0, 0, 564, 565, 5, 2, 0, 0, 565, 566, 3, 162, 81, 0, 566, 567, 5, 84, 0, 0, 567, 568, 3, 164, 82, 0, 568, 569, 5, 38, 0, 0, 569, 570, 3, 26, 13, 0, 570, 571, 5, 136, 0, 0, 571, 572, 3, 162, 81, 0, 572, 573, 5, 134, 0, 0, 573, 57, 1, 0, 0, 0, 574, 575, 5, 4, 0, 0, 575, 576, 3, 162, 81, 0, 576, 577, 5, 84, 0, 0, 577, 578, 3, 164, 82, 0, 578, 579, 5, 6, 0, 0, 579, 580, 3, 26, 13, 0, 580, 581, 5, 65, 0, 0, 581, 582, 3, 162, 81, 0, 582, 583, 5, 136, 0, 0, 583, 584, 3, 162, 81, 0, 584, 585, 5, 134, 0, 0, 585, 59, 1, 0, 0, 0, 586, 588, 5, 22, 0, 0, 587, 589, 5, 40, 0, 0, 588, 587, 1, 0, 0, 0, 588, 589, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 590, 592, 3, 162, 81, 0, 591, 593, 3, 22, 11, 0, 592, 591, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 595, 5, 84, 0, 0, 595, 596, 3, 164, 82, 0, 596, 598, 5, 25, 0, 0, 597, 599, 5, 9, 0, 0, 598, 597, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 600, 1, 0, 0, 0, 600, 601, 3, 26, 13, 0, 601, 602, 5, 26, 0, 0, 602, 631, 3, 164, 82, 0, 603, 604, 5, 49, 0, 0, 604, 605, 3, 164, 82, 0, 605, 609, 5, 137, 0, 0, 606, 608, 3, 64, 32, 0, 607, 606, 1, 0, 0, 0, 608, 611, 1, 0, 0, 0, 609, 607, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 612, 1, 0, 0, 0, 611, 609, 1, 0, 0, 0, 612, 613, 5, 138, 0, 0, 613, 632, 1, 0, 0, 0, 614, 615, 5, 40, 0, 0, 615, 618, 3, 164, 82, 0, 616, 617, 5, 49, 0, 0, 617, 619, 3, 164, 82, 0, 618, 616, 1, 0, 0, 0, 618, 619, 1, 0, 0, 0, 619, 629, 1, 0, 0, 0, 620, 624, 5, 137, 0, 0, 621, 623, 3, 64, 32, 0, 622, 621, 1, 0, 0, 0, 623, 626, 1, 0, 0, 0, 624, 622, 1, 0, 0, 0, 624, 625, 1, 0, 0, 0, 625, 627, 1, 0, 0, 0, 626, 624, 1, 0, 0, 0, 627, 630, 5, 138, 0, 0, 628, 630, 5, 134, 0, 0, 629, 620, 1, 0, 0, 0, 629, 628, 1, 0, 0, 0, 630, 632, 1, 0, 0, 0, 631, 603, 1, 0, 0, 0, 631, 614, 1, 0, 0, 0, 632, 61, 1, 0, 0, 0, 633, 634, 5, 22, 0, 0, 634, 635, 3, 162, 81, 0, 635, 636, 5, 84, 0, 0, 636, 637, 3, 164, 82, 0, 637, 638, 5, 24, 0, 0, 638, 639, 3, 162, 81, 0, 639, 640, 3, 28, 14, 0, 640, 641, 5, 134, 0, 0, 641, 63, 1, 0, 0, 0, 642, 643, 5, 16, 0, 0, 643, 700, 5, 134, 0, 0, 644, 645, 5, 17, 0, 0, 645, 646, 5, 18, 0, 0, 646, 647, 3, 162, 81, 0, 647, 648, 5, 134, 0, 0, 648, 700, 1, 0, 0, 0, 649, 650, 5, 27, 0, 0, 650, 651, 3, 164, 82, 0, 651, 652, 5, 134, 0, 0, 652, 700, 1, 0, 0, 0, 653, 654, 5, 27, 0, 0, 654, 655, 3, 162, 81, 0, 655, 656, 5, 136, 0, 0, 656, 666, 3, 162, 81, 0, 657, 658, 5, 64, 0, 0, 658, 662, 5, 137, 0, 0, 659, 661, 3, 66, 33, 0, 660, 659, 1, 0, 0, 0, 661, 664, 1, 0, 0, 0, 662, 660, 1, 0, 0, 0, 662, 663, 1, 0, 0, 0, 663, 665, 1, 0, 0, 0, 664, 662, 1, 0, 0, 0, 665, 667, 5, 138, 0, 0, 666, 657, 1, 0, 0, 0, 666, 667, 1, 0, 0, 0, 667, 668, 1, 0, 0, 0, 668, 669, 5, 134, 0, 0, 669, 700, 1, 0, 0, 0, 670, 672, 5, 28, 0, 0, 671, 673, 5, 36, 0, 0, 672, 671, 1, 0, 0, 0, 672, 673, 1, 0, 0, 0, 673, 674, 1, 0, 0, 0, 674, 675, 3, 162, 81, 0, 675, 676, 5, 55, 0, 0, 676, 677, 3, 26, 13, 0, 677, 678, 5, 134, 0, 0, 678, 700, 1, 0, 0, 0, 679, 680, 5, 29, 0, 0, 680, 681, 3, 162, 81, 0, 681, 682, 5, 147, 0, 0, 682, 683, 5, 134, 0, 0, 683, 700, 1, 0, 0, 0, 684, 685, 5, 30, 0, 0, 685, 686, 3, 26, 13, 0, 686, 687, 5, 136, 0, 0, 687, 688, 3, 162, 81, 0, 688, 689, 3, 162, 81, 0, 689, 690, 3, 164, 82, 0, 690, 691, 5, 134, 0, 0, 691, 700, 1, 0, 0, 0, 692, 693, 5, 93, 0, 0, 693, 700, 5, 134, 0, 0, 694, 695, 5, 31, 0, 0, 695, 696, 5, 147, 0, 0, 696, 697, 3, 164, 82, 0, 697, 698, 5, 134, 0, 0, 698, 700, 1, 0, 0, 0, 699, 642, 1, 0, 0, 0, 699, 644, 1, 0, 0, 0, 699, 649, 1, 0, 0, 0, 699, 653, 1, 0, 0, 0, 699, 670, 1, 0, 0, 0, 699, 679, 1, 0, 0, 0, 699, 684, 1, 0, 0, 0, 699, 692, 1, 0, 0, 0, 699, 694, 1, 0, 0, 0, 700, 65, 1, 0, 0, 0, 701, 702, 3, 162, 81, 0, 702, 703, 5, 58, 0, 0, 703, 704, 3, 162, 81, 0, 704, 705, 5, 134, 0, 0, 705, 67, 1, 0, 0, 0, 706, 707, 5, 49, 0, 0, 707, 709, 3, 162, 81, 0, 708, 710, 3, 22, 11, 0, 709, 708, 1, 0, 0, 0, 709, 710, 1, 0, 0, 0, 710, 711, 1, 0, 0, 0, 711, 712, 5, 84, 0, 0, 712, 713, 3, 164, 82, 0, 713, 714, 5, 133, 0, 0, 714, 715, 3, 146, 73, 0, 715, 716, 5, 132, 0, 0, 716, 717, 3, 146, 73, 0, 717, 718, 5, 86, 0, 0, 718, 720, 3, 82, 41, 0, 719, 721, 3, 74, 37, 0, 720, 719, 1, 0, 0, 0, 720, 721, 1, 0, 0, 0, 721, 723, 1, 0, 0, 0, 722, 724, 3, 80, 40, 0, 723, 722, 1, 0, 0, 0, 723, 724, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 726, 5, 88, 0, 0, 726, 728, 3, 84, 42, 0, 727, 729, 3, 88, 44, 0, 728, 727, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 731, 1, 0, 0, 0, 730, 732, 3, 72, 36, 0, 731, 730, 1, 0, 0, 0, 731, 732, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 734, 5, 134, 0, 0, 734, 69, 1, 0, 0, 0, 735, 736, 5, 50, 0, 0, 736, 738, 3, 162, 81, 0, 737, 739, 3, 22, 11, 0, 738, 737, 1, 0, 0, 0, 738, 739, 1, 0, 0, 0, 739, 740, 1, 0, 0, 0, 740, 741, 5, 84, 0, 0, 741, 742, 3, 164, 82, 0, 742, 743, 5, 133, 0, 0, 743, 744, 3, 146, 73, 0, 744, 745, 5, 132, 0, 0, 745, 747, 3, 146, 73, 0, 746, 748, 3, 74, 37, 0, 747, 746, 1, 0, 0, 0, 747, 748, 1, 0, 0, 0, 748, 750, 1, 0, 0, 0, 749, 751, 3, 88, 44, 0, 750, 749, 1, 0, 0, 0, 750, 751, 1, 0, 0, 0, 751, 753, 1, 0, 0, 0, 752, 754, 3, 72, 36, 0, 753, 752, 1, 0, 0, 0, 753, 754, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 756, 5, 134, 0, 0, 756, 71, 1, 0, 0, 0, 757, 758, 5, 66, 0, 0, 758, 759, 5, 65, 0, 0, 759, 760, 3, 162, 81, 0, 760, 73, 1, 0, 0, 0, 761, 762, 5, 10, 0, 0, 762, 771, 5, 13, 0, 0, 763, 764, 5, 10, 0, 0, 764, 765, 7, 1, 0, 0, 765, 766, 5, 14, 0, 0, 766, 767, 5, 139, 0, 0, 767, 768, 3, 86, 43, 0, 768, 769, 5, 140, 0, 0, 769, 771, 1, 0, 0, 0, 770, 761, 1, 0, 0, 0, 770, 763, 1, 0, 0, 0, 771, 75, 1, 0, 0, 0, 772, 773, 5, 65, 0, 0, 773, 774, 5, 139, 0, 0, 774, 779, 3, 128, 64, 0, 775, 776, 5, 135, 0, 0, 776, 778, 3, 128, 64, 0, 777, 775, 1, 0, 0, 0, 778, 781, 1, 0, 0, 0, 779, 777, 1, 0, 0, 0, 779, 780, 1, 0, 0, 0, 780, 782, 1, 0, 0, 0, 781, 779, 1, 0, 0, 0, 782, 783, 5, 140, 0, 0, 783, 77, 1, 0, 0, 0, 784, 785, 5, 51, 0, 0, 785, 786, 3, 162, 81, 0, 786, 787, 5, 84, 0, 0, 787, 788, 3, 164, 82, 0, 788, 789, 5, 52, 0, 0, 789, 790, 3, 162, 81, 0, 790, 791, 5, 133, 0, 0, 791, 793, 3, 146, 73, 0, 792, 794, 3, 88, 44, 0, 793, 792, 1, 0, 0, 0, 793, 794, 1, 0, 0, 0, 794, 795, 1, 0, 0, 0, 795, 796, 5, 134, 0, 0, 796, 79, 1, 0, 0, 0, 797, 798, 5, 87, 0, 0, 798, 799, 3, 146, 73, 0, 799, 81, 1, 0, 0, 0, 800, 801, 7, 2, 0, 0, 801, 83, 1, 0, 0, 0, 802, 821, 5, 90, 0, 0, 803, 804, 5, 43, 0, 0, 804, 821, 3, 162, 81, 0, 805, 806, 5, 36, 0, 0, 806, 821, 3, 162, 81, 0, 807, 808, 5, 45, 0, 0, 808, 817, 5, 139, 0, 0, 809, 814, 3, 26, 13, 0, 810, 811, 5, 135, 0, 0, 811, 813, 3, 26, 13, 0, 812, 810, 1, 0, 0, 0, 813, 816, 1, 0, 0, 0, 814, 812, 1, 0, 0, 0, 814, 815, 1, 0, 0, 0, 815, 818, 1, 0, 0, 0, 816, 814, 1, 0, 0, 0, 817, 809, 1, 0, 0, 0, 817, 818, 1, 0, 0, 0, 818, 819, 1, 0, 0, 0, 819, 821, 5, 140, 0, 0, 820, 802, 1, 0, 0, 0, 820, 803, 1, 0, 0, 0, 820, 805, 1, 0, 0, 0, 820, 807, 1, 0, 0, 0, 821, 85, 1, 0, 0, 0, 822, 827, 3, 162, 81, 0, 823, 824, 5, 135, 0, 0, 824, 826, 3, 162, 81, 0, 825, 823, 1, 0, 0, 0, 826, 829, 1, 0, 0, 0, 827, 825, 1, 0, 0, 0, 827, 828, 1, 0, 0, 0, 828, 87, 1, 0, 0, 0, 829, 827, 1, 0, 0, 0, 830, 831, 5, 89, 0, 0, 831, 835, 5, 137, 0, 0, 832, 834, 3, 90, 45, 0, 833, 832, 1, 0, 0, 0, 834, 837, 1, 0, 0, 0, 835, 833, 1, 0, 0, 0, 835, 836, 1, 0, 0, 0, 836, 838, 1, 0, 0, 0, 837, 835, 1, 0, 0, 0, 838, 839, 5, 138, 0, 0, 839, 89, 1, 0, 0, 0, 840, 841, 5, 23, 0, 0, 841, 842, 3, 162, 81, 0, 842, 843, 5, 84, 0, 0, 843, 844, 3, 164, 82, 0, 844, 845, 5, 139, 0, 0, 845, 846, 3, 86, 43, 0, 846, 847, 5, 140, 0, 0, 847, 848, 5, 134, 0, 0, 848, 919, 1, 0, 0, 0, 849, 850, 5, 61, 0, 0, 850, 851, 3, 162, 81, 0, 851, 852, 5, 84, 0, 0, 852, 853, 3, 164, 82, 0, 853, 854, 5, 133, 0, 0, 854, 855, 3, 146, 73, 0, 855, 856, 3, 92, 46, 0, 856, 857, 5, 134, 0, 0, 857, 919, 1, 0, 0, 0, 858, 859, 5, 62, 0, 0, 859, 860, 3, 162, 81, 0, 860, 861, 5, 84, 0, 0, 861, 862, 3, 164, 82, 0, 862, 863, 5, 133, 0, 0, 863, 864, 3, 152, 76, 0, 864, 865, 3, 50, 25, 0, 865, 866, 3, 92, 46, 0, 866, 867, 5, 134, 0, 0, 867, 919, 1, 0, 0, 0, 868, 869, 5, 44, 0, 0, 869, 870, 3, 162, 81, 0, 870, 871, 5, 84, 0, 0, 871, 872, 3, 164, 82, 0, 872, 873, 5, 133, 0, 0, 873, 875, 3, 162, 81, 0, 874, 876, 3, 28, 14, 0, 875, 874, 1, 0, 0, 0, 875, 876, 1, 0, 0, 0, 876, 878, 1, 0, 0, 0, 877, 879, 3, 76, 38, 0, 878, 877, 1, 0, 0, 0, 878, 879, 1, 0, 0, 0, 879, 882, 1, 0, 0, 0, 880, 881, 5, 18, 0, 0, 881, 883, 5, 53, 0, 0, 882, 880, 1, 0, 0, 0, 882, 883, 1, 0, 0, 0, 883, 884, 1, 0, 0, 0, 884, 885, 5, 134, 0, 0, 885, 919, 1, 0, 0, 0, 886, 887, 5, 7, 0, 0, 887, 888, 3, 162, 81, 0, 888, 889, 5, 84, 0, 0, 889, 890, 3, 164, 82, 0, 890, 891, 5, 133, 0, 0, 891, 892, 3, 162, 81, 0, 892, 893, 5, 53, 0, 0, 893, 894, 3, 146, 73, 0, 894, 895, 5, 134, 0, 0, 895, 919, 1, 0, 0, 0, 896, 897, 5, 51, 0, 0, 897, 898, 3, 162, 81, 0, 898, 899, 5, 84, 0, 0, 899, 900, 3, 164, 82, 0, 900, 901, 5, 133, 0, 0, 901, 904, 3, 162, 81, 0, 902, 903, 5, 53, 0, 0, 903, 905, 3, 146, 73, 0, 904, 902, 1, 0, 0, 0, 904, 905, 1, 0, 0, 0, 905, 906, 1, 0, 0, 0, 906, 907, 5, 134, 0, 0, 907, 919, 1, 0, 0, 0, 908, 909, 5, 22, 0, 0, 909, 910, 3, 162, 81, 0, 910, 911, 5, 84, 0, 0, 911, 912, 3, 164, 82, 0, 912, 913, 5, 133, 0, 0, 913, 914, 3, 162, 81, 0, 914, 915, 5, 136, 0, 0, 915, 916, 3, 162, 81, 0, 916, 917, 5, 134, 0, 0, 917, 919, 1, 0, 0, 0, 918, 840, 1, 0, 0, 0, 918, 849, 1, 0, 0, 0, 918, 858, 1, 0, 0, 0, 918, 868, 1, 0, 0, 0, 918, 886, 1, 0, 0, 0, 918, 896, 1, 0, 0, 0, 918, 908, 1, 0, 0, 0, 919, 91, 1, 0, 0, 0, 920, 921, 5, 139, 0, 0, 921, 926, 3, 94, 47, 0, 922, 923, 5, 135, 0, 0, 923, 925, 3, 94, 47, 0, 924, 922, 1, 0, 0, 0, 925, 928, 1, 0, 0, 0, 926, 924, 1, 0, 0, 0, 926, 927, 1, 0, 0, 0, 927, 929, 1, 0, 0, 0, 928, 926, 1, 0, 0, 0, 929, 930, 5, 140, 0, 0, 930, 93, 1, 0, 0, 0, 931, 932, 7, 3, 0, 0, 932, 95, 1, 0, 0, 0, 933, 934, 5, 60, 0, 0, 934, 935, 3, 98, 49, 0, 935, 97, 1, 0, 0, 0, 936, 939, 3, 100, 50, 0, 937, 939, 3, 104, 52, 0, 938, 936, 1, 0, 0, 0, 938, 937, 1, 0, 0, 0, 939, 99, 1, 0, 0, 0, 940, 941, 5, 61, 0, 0, 941, 942, 3, 162, 81, 0, 942, 943, 5, 84, 0, 0, 943, 944, 3, 164, 82, 0, 944, 945, 5, 71, 0, 0, 945, 946, 3, 162, 81, 0, 946, 947, 5, 133, 0, 0, 947, 948, 3, 146, 73, 0, 948, 949, 5, 72, 0, 0, 949, 952, 3, 102, 51, 0, 950, 951, 5, 73, 0, 0, 951, 953, 3, 154, 77, 0, 952, 950, 1, 0, 0, 0, 952, 953, 1, 0, 0, 0, 953, 954, 1, 0, 0, 0, 954, 955, 5, 134, 0, 0, 955, 101, 1, 0, 0, 0, 956, 963, 5, 106, 0, 0, 957, 958, 5, 107, 0, 0, 958, 959, 5, 141, 0, 0, 959, 960, 3, 146, 73, 0, 960, 961, 5, 142, 0, 0, 961, 963, 1, 0, 0, 0, 962, 956, 1, 0, 0, 0, 962, 957, 1, 0, 0, 0, 963, 103, 1, 0, 0, 0, 964, 965, 5, 62, 0, 0, 965, 966, 3, 162, 81, 0, 966, 967, 5, 84, 0, 0, 967, 968, 3, 164, 82, 0, 968, 969, 5, 137, 0, 0, 969, 970, 3, 106, 53, 0, 970, 971, 3, 106, 53, 0, 971, 972, 5, 138, 0, 0, 972, 105, 1, 0, 0, 0, 973, 974, 3, 50, 25, 0, 974, 975, 5, 63, 0, 0, 975, 976, 3, 162, 81, 0, 976, 977, 5, 84, 0, 0, 977, 978, 3, 164, 82, 0, 978, 980, 3, 152, 76, 0, 979, 981, 5, 112, 0, 0, 980, 979, 1, 0, 0, 0, 980, 981, 1, 0, 0, 0, 981, 984, 1, 0, 0, 0, 982, 983, 5, 79, 0, 0, 983, 985, 3, 164, 82, 0, 984, 982, 1, 0, 0, 0, 984, 985, 1, 0, 0, 0, 985, 987, 1, 0, 0, 0, 986, 988, 5, 81, 0, 0, 987, 986, 1, 0, 0, 0, 987, 988, 1, 0, 0, 0, 988, 991, 1, 0, 0, 0, 989, 990, 5, 82, 0, 0, 990, 992, 3, 164, 82, 0, 991, 989, 1, 0, 0, 0, 991, 992, 1, 0, 0, 0, 992, 994, 1, 0, 0, 0, 993, 995, 5, 83, 0, 0, 994, 993, 1, 0, 0, 0, 994, 995, 1, 0, 0, 0, 995, 996, 1, 0, 0, 0, 996, 997, 5, 134, 0, 0, 997, 107, 1, 0, 0, 0, 998, 1000, 5, 54, 0, 0, 999, 1001, 3, 22, 11, 0, 1000, 999, 1, 0, 0, 0, 1000, 1001, 1, 0, 0, 0, 1001, 1002, 1, 0, 0, 0, 1002, 1004, 3, 162, 81, 0, 1003, 1005, 3, 110, 55, 0, 1004, 1003, 1, 0, 0, 0, 1004, 1005, 1, 0, 0, 0, 1005, 1006, 1, 0, 0, 0, 1006, 1007, 5, 55, 0, 0, 1007, 1009, 3, 162, 81, 0, 1008, 1010, 3, 28, 14, 0, 1009, 1008, 1, 0, 0, 0, 1009, 1010, 1, 0, 0, 0, 1010, 1013, 1, 0, 0, 0, 1011, 1012, 5, 84, 0, 0, 1012, 1014, 3, 164, 82, 0, 1013, 1011, 1, 0, 0, 0, 1013, 1014, 1, 0, 0, 0, 1014, 1017, 1, 0, 0, 0, 1015, 1016, 5, 78, 0, 0, 1016, 1018, 5, 147, 0, 0, 1017, 1015, 1, 0, 0, 0, 1017, 1018, 1, 0, 0, 0, 1018, 1019, 1, 0, 0, 0, 1019, 1023, 5, 137, 0, 0, 1020, 1022, 3, 112, 56, 0, 1021, 1020, 1, 0, 0, 0, 1022, 1025, 1, 0, 0, 0, 1023, 1021, 1, 0, 0, 0, 1023, 1024, 1, 0, 0, 0, 1024, 1026, 1, 0, 0, 0, 1025, 1023, 1, 0, 0, 0, 1026, 1027, 5, 138, 0, 0, 1027, 109, 1, 0, 0, 0, 1028, 1029, 3, 28, 14, 0, 1029, 111, 1, 0, 0, 0, 1030, 1031, 5, 59, 0, 0, 1031, 1038, 3, 98, 49, 0, 1032, 1038, 3, 126, 63, 0, 1033, 1038, 3, 122, 61, 0, 1034, 1038, 3, 116, 58, 0, 1035, 1038, 3, 124, 62, 0, 1036, 1038, 3, 114, 57, 0, 1037, 1030, 1, 0, 0, 0, 1037, 1032, 1, 0, 0, 0, 1037, 1033, 1, 0, 0, 0, 1037, 1034, 1, 0, 0, 0, 1037, 1035, 1, 0, 0, 0, 1037, 1036, 1, 0, 0, 0, 1038, 113, 1, 0, 0, 0, 1039, 1040, 5, 56, 0, 0, 1040, 1041, 3, 162, 81, 0, 1041, 1042, 5, 58, 0, 0, 1042, 1043, 3, 162, 81, 0, 1043, 1044, 5, 136, 0, 0, 1044, 1045, 3, 162, 81, 0, 1045, 1046, 5, 134, 0, 0, 1046, 115, 1, 0, 0, 0, 1047, 1048, 5, 8, 0, 0, 1048, 1052, 5, 137, 0, 0, 1049, 1051, 3, 118, 59, 0, 1050, 1049, 1, 0, 0, 0, 1051, 1054, 1, 0, 0, 0, 1052, 1050, 1, 0, 0, 0, 1052, 1053, 1, 0, 0, 0, 1053, 1055, 1, 0, 0, 0, 1054, 1052, 1, 0, 0, 0, 1055, 1056, 5, 138, 0, 0, 1056, 1057, 5, 134, 0, 0, 1057, 117, 1, 0, 0, 0, 1058, 1059, 3, 162, 81, 0, 1059, 1060, 5, 58, 0, 0, 1060, 1061, 5, 61, 0, 0, 1061, 1062, 3, 162, 81, 0, 1062, 1063, 5, 134, 0, 0, 1063, 1073, 1, 0, 0, 0, 1064, 1065, 3, 162, 81, 0, 1065, 1066, 5, 58, 0, 0, 1066, 1067, 5, 62, 0, 0, 1067, 1068, 3, 162, 81, 0, 1068, 1069, 5, 136, 0, 0, 1069, 1070, 3, 162, 81, 0, 1070, 1071, 5, 134, 0, 0, 1071, 1073, 1, 0, 0, 0, 1072, 1058, 1, 0, 0, 0, 1072, 1064, 1, 0, 0, 0, 1073, 119, 1, 0, 0, 0, 1074, 1075, 3, 26, 13, 0, 1075, 1076, 5, 18, 0, 0, 1076, 1081, 5, 53, 0, 0, 1077, 1078, 5, 136, 0, 0, 1078, 1080, 3, 162, 81, 0, 1079, 1077, 1, 0, 0, 0, 1080, 1083, 1, 0, 0, 0, 1081, 1079, 1, 0, 0, 0, 1081, 1082, 1, 0, 0, 0, 1082, 1084, 1, 0, 0, 0, 1083, 1081, 1, 0, 0, 0, 1084, 1085, 5, 134, 0, 0, 1085, 121, 1, 0, 0, 0, 1086, 1087, 5, 56, 0, 0, 1087, 1088, 3, 162, 81, 0, 1088, 1089, 5, 58, 0, 0, 1089, 1090, 5, 61, 0, 0, 1090, 1091, 3, 162, 81, 0, 1091, 1092, 5, 134, 0, 0, 1092, 123, 1, 0, 0, 0, 1093, 1094, 5, 68, 0, 0, 1094, 1095, 3, 162, 81, 0, 1095, 1096, 5, 69, 0, 0, 1096, 1097, 5, 70, 0, 0, 1097, 1098, 5, 65, 0, 0, 1098, 1099, 5, 51, 0, 0, 1099, 1100, 3, 162, 81, 0, 1100, 1101, 5, 67, 0, 0, 1101, 1102, 5, 62, 0, 0, 1102, 1103, 3, 162, 81, 0, 1103, 1104, 5, 136, 0, 0, 1104, 1105, 3, 162, 81, 0, 1105, 1106, 5, 134, 0, 0, 1106, 125, 1, 0, 0, 0, 1107, 1108, 5, 56, 0, 0, 1108, 1109, 3, 128, 64, 0, 1109, 1110, 5, 58, 0, 0, 1110, 1113, 3, 132, 66, 0, 1111, 1112, 5, 34, 0, 0, 1112, 1114, 3, 164, 82, 0, 1113, 1111, 1, 0, 0, 0, 1113, 1114, 1, 0, 0, 0, 1114, 1115, 1, 0, 0, 0, 1115, 1116, 5, 134, 0, 0, 1116, 127, 1, 0, 0, 0, 1117, 1118, 3, 162, 81, 0, 1118, 1119, 5, 136, 0, 0, 1119, 1120, 3, 130, 65, 0, 1120, 129, 1, 0, 0, 0, 1121, 1134, 3, 162, 81, 0, 1122, 1134, 5, 101, 0, 0, 1123, 1134, 5, 91, 0, 0, 1124, 1134, 5, 92, 0, 0, 1125, 1134, 5, 1, 0, 0, 1126, 1134, 5, 98, 0, 0, 1127, 1134, 5, 99, 0, 0, 1128, 1134, 5, 100, 0, 0, 1129, 1134, 5, 102, 0, 0, 1130, 1134, 5, 103, 0, 0, 1131, 1134, 5, 104, 0, 0, 1132, 1134, 5, 105, 0, 0, 1133, 1121, 1, 0, 0, 0, 1133, 1122, 1, 0, 0, 0, 1133, 1123, 1, 0, 0, 0, 1133, 1124, 1, 0, 0, 0, 1133, 1125, 1, 0, 0, 0, 1133, 1126, 1, 0, 0, 0, 1133, 1127, 1, 0, 0, 0, 1133, 1128, 1, 0, 0, 0, 1133, 1129, 1, 0, 0, 0, 1133, 1130, 1, 0, 0, 0, 1133, 1131, 1, 0, 0, 0, 1133, 1132, 1, 0, 0, 0, 1134, 131, 1, 0, 0, 0, 1135, 1136, 5, 80, 0, 0, 1136, 1137, 5, 136, 0, 0, 1137, 1172, 3, 162, 81, 0, 1138, 1139, 5, 61, 0, 0, 1139, 1140, 3, 162, 81, 0, 1140, 1141, 5, 136, 0, 0, 1141, 1142, 3, 136, 68, 0, 1142, 1172, 1, 0, 0, 0, 1143, 1144, 5, 62, 0, 0, 1144, 1145, 3, 162, 81, 0, 1145, 1146, 5, 136, 0, 0, 1146, 1147, 3, 162, 81, 0, 1147, 1148, 5, 136, 0, 0, 1148, 1149, 3, 138, 69, 0, 1149, 1172, 1, 0, 0, 0, 1150, 1151, 5, 44, 0, 0, 1151, 1153, 3, 162, 81, 0, 1152, 1154, 3, 28, 14, 0, 1153, 1152, 1, 0, 0, 0, 1153, 1154, 1, 0, 0, 0, 1154, 1155, 1, 0, 0, 0, 1155, 1156, 5, 136, 0, 0, 1156, 1157, 3, 128, 64, 0, 1157, 1172, 1, 0, 0, 0, 1158, 1159, 5, 46, 0, 0, 1159, 1160, 3, 162, 81, 0, 1160, 1161, 5, 136, 0, 0, 1161, 1163, 3, 162, 81, 0, 1162, 1164, 3, 28, 14, 0, 1163, 1162, 1, 0, 0, 0, 1163, 1164, 1, 0, 0, 0, 1164, 1166, 1, 0, 0, 0, 1165, 1167, 3, 140, 70, 0, 1166, 1165, 1, 0, 0, 0, 1166, 1167, 1, 0, 0, 0, 1167, 1169, 1, 0, 0, 0, 1168, 1170, 3, 134, 67, 0, 1169, 1168, 1, 0, 0, 0, 1169, 1170, 1, 0, 0, 0, 1170, 1172, 1, 0, 0, 0, 1171, 1135, 1, 0, 0, 0, 1171, 1138, 1, 0, 0, 0, 1171, 1143, 1, 0, 0, 0, 1171, 1150, 1, 0, 0, 0, 1171, 1158, 1, 0, 0, 0, 1172, 133, 1, 0, 0, 0, 1173, 1174, 5, 66, 0, 0, 1174, 1175, 3, 140, 70, 0, 1175, 135, 1, 0, 0, 0, 1176, 1177, 7, 4, 0, 0, 1177, 137, 1, 0, 0, 0, 1178, 1179, 7, 5, 0, 0, 1179, 139, 1, 0, 0, 0, 1180, 1181, 5, 64, 0, 0, 1181, 1185, 5, 137, 0, 0, 1182, 1184, 3, 142, 71, 0, 1183, 1182, 1, 0, 0, 0, 1184, 1187, 1, 0, 0, 0, 1185, 1183, 1, 0, 0, 0, 1185, 1186, 1, 0, 0, 0, 1186, 1188, 1, 0, 0, 0, 1187, 1185, 1, 0, 0, 0, 1188, 1189, 5, 138, 0, 0, 1189, 141, 1, 0, 0, 0, 1190, 1191, 3, 162, 81, 0, 1191, 1192, 5, 58, 0, 0, 1192, 1193, 5, 9, 0, 0, 1193, 1194, 5, 23, 0, 0, 1194, 1195, 5, 139, 0, 0, 1195, 1196, 3, 86, 43, 0, 1196, 1197, 5, 140, 0, 0, 1197, 1198, 5, 134, 0, 0, 1198, 1289, 1, 0, 0, 0, 1199, 1200, 3, 162, 81, 0, 1200, 1201, 5, 58, 0, 0, 1201, 1202, 5, 61, 0, 0, 1202, 1209, 3, 162, 81, 0, 1203, 1204, 5, 67, 0, 0, 1204, 1205, 5, 62, 0, 0, 1205, 1206, 3, 162, 81, 0, 1206, 1207, 5, 136, 0, 0, 1207, 1208, 3, 162, 81, 0, 1208, 1210, 1, 0, 0, 0, 1209, 1203, 1, 0, 0, 0, 1209, 1210, 1, 0, 0, 0, 1210, 1211, 1, 0, 0, 0, 1211, 1212, 5, 134, 0, 0, 1212, 1289, 1, 0, 0, 0, 1213, 1214, 3, 162, 81, 0, 1214, 1215, 5, 58, 0, 0, 1215, 1216, 5, 62, 0, 0, 1216, 1217, 3, 162, 81, 0, 1217, 1218, 5, 136, 0, 0, 1218, 1225, 3, 162, 81, 0, 1219, 1220, 5, 67, 0, 0, 1220, 1221, 5, 62, 0, 0, 1221, 1222, 3, 162, 81, 0, 1222, 1223, 5, 136, 0, 0, 1223, 1224, 3, 162, 81, 0, 1224, 1226, 1, 0, 0, 0, 1225, 1219, 1, 0, 0, 0, 1225, 1226, 1, 0, 0, 0, 1226, 1227, 1, 0, 0, 0, 1227, 1228, 5, 134, 0, 0, 1228, 1289, 1, 0, 0, 0, 1229, 1230, 3, 162, 81, 0, 1230, 1231, 5, 58, 0, 0, 1231, 1232, 5, 44, 0, 0, 1232, 1234, 3, 162, 81, 0, 1233, 1235, 3, 28, 14, 0, 1234, 1233, 1, 0, 0, 0, 1234, 1235, 1, 0, 0, 0, 1235, 1244, 1, 0, 0, 0, 1236, 1237, 5, 67, 0, 0, 1237, 1238, 5, 62, 0, 0, 1238, 1239, 3, 162, 81, 0, 1239, 1240, 5, 136, 0, 0, 1240, 1241, 3, 162, 81, 0, 1241, 1245, 1, 0, 0, 0, 1242, 1243, 5, 18, 0, 0, 1243, 1245, 5, 53, 0, 0, 1244, 1236, 1, 0, 0, 0, 1244, 1242, 1, 0, 0, 0, 1244, 1245, 1, 0, 0, 0, 1245, 1246, 1, 0, 0, 0, 1246, 1247, 5, 134, 0, 0, 1247, 1289, 1, 0, 0, 0, 1248, 1249, 3, 162, 81, 0, 1249, 1250, 5, 58, 0, 0, 1250, 1251, 5, 7, 0, 0, 1251, 1252, 3, 162, 81, 0, 1252, 1253, 5, 64, 0, 0, 1253, 1257, 5, 137, 0, 0, 1254, 1256, 3, 120, 60, 0, 1255, 1254, 1, 0, 0, 0, 1256, 1259, 1, 0, 0, 0, 1257, 1255, 1, 0, 0, 0, 1257, 1258, 1, 0, 0, 0, 1258, 1260, 1, 0, 0, 0, 1259, 1257, 1, 0, 0, 0, 1260, 1261, 5, 138, 0, 0, 1261, 1262, 5, 134, 0, 0, 1262, 1289, 1, 0, 0, 0, 1263, 1264, 3, 162, 81, 0, 1264, 1265, 5, 58, 0, 0, 1265, 1266, 5, 51, 0, 0, 1266, 1267, 3, 162, 81, 0, 1267, 1268, 5, 134, 0, 0, 1268, 1289, 1, 0, 0, 0, 1269, 1270, 3, 162, 81, 0, 1270, 1272, 5, 58, 0, 0, 1271, 1273, 5, 9, 0, 0, 1272, 1271, 1, 0, 0, 0, 1272, 1273, 1, 0, 0, 0, 1273, 1274, 1, 0, 0, 0, 1274, 1275, 5, 22, 0, 0, 1275, 1276, 3, 162, 81, 0, 1276, 1277, 5, 136, 0, 0, 1277, 1284, 3, 162, 81, 0, 1278, 1279, 5, 67, 0, 0, 1279, 1280, 5, 62, 0, 0, 1280, 1281, 3, 162, 81, 0, 1281, 1282, 5, 136, 0, 0, 1282, 1283, 3, 162, 81, 0, 1283, 1285, 1, 0, 0, 0, 1284, 1278, 1, 0, 0, 0, 1284, 1285, 1, 0, 0, 0, 1285, 1286, 1, 0, 0, 0, 1286, 1287, 5, 134, 0, 0, 1287, 1289, 1, 0, 0, 0, 1288, 1190, 1, 0, 0, 0, 1288, 1199, 1, 0, 0, 0, 1288, 1213, 1, 0, 0, 0, 1288, 1229, 1, 0, 0, 0, 1288, 1248, 1, 0, 0, 0, 1288, 1263, 1, 0, 0, 0, 1288, 1269, 1, 0, 0, 0, 1289, 143, 1, 0, 0, 0, 1290, 1291, 5, 51, 0, 0, 1291, 1292, 3, 162, 81, 0, 1292, 1293, 5, 58, 0, 0, 1293, 1294, 3, 162, 81, 0, 1294, 1295, 5, 136, 0, 0, 1295, 1297, 3, 162, 81, 0, 1296, 1298, 3, 140, 70, 0, 1297, 1296, 1, 0, 0, 0, 1297, 1298, 1, 0, 0, 0, 1298, 1299, 1, 0, 0, 0, 1299, 1300, 5, 134, 0, 0, 1300, 145, 1, 0, 0, 0, 1301, 1348, 3, 150, 75, 0, 1302, 1348, 5, 113, 0, 0, 1303, 1348, 5, 114, 0, 0, 1304, 1305, 5, 115, 0, 0, 1305, 1348, 3, 164, 82, 0, 1306, 1307, 5, 116, 0, 0, 1307, 1308, 5, 143, 0, 0, 1308, 1309, 3, 162, 81, 0, 1309, 1310, 5, 144, 0, 0, 1310, 1348, 1, 0, 0, 0, 1311, 1312, 5, 117, 0, 0, 1312, 1313, 5, 143, 0, 0, 1313, 1315, 3, 162, 81, 0, 1314, 1316, 3, 28, 14, 0, 1315, 1314, 1, 0, 0, 0, 1315, 1316, 1, 0, 0, 0, 1316, 1317, 1, 0, 0, 0, 1317, 1318, 5, 144, 0, 0, 1318, 1348, 1, 0, 0, 0, 1319, 1320, 5, 39, 0, 0, 1320, 1321, 5, 143, 0, 0, 1321, 1322, 3, 162, 81, 0, 1322, 1323, 5, 144, 0, 0, 1323, 1348, 1, 0, 0, 0, 1324, 1325, 5, 118, 0, 0, 1325, 1326, 5, 143, 0, 0, 1326, 1327, 3, 146, 73, 0, 1327, 1328, 5, 144, 0, 0, 1328, 1348, 1, 0, 0, 0, 1329, 1330, 5, 119, 0, 0, 1330, 1331, 5, 143, 0, 0, 1331, 1332, 3, 146, 73, 0, 1332, 1333, 5, 144, 0, 0, 1333, 1348, 1, 0, 0, 0, 1334, 1335, 5, 120, 0, 0, 1335, 1339, 5, 137, 0, 0, 1336, 1338, 3, 148, 74, 0, 1337, 1336, 1, 0, 0, 0, 1338, 1341, 1, 0, 0, 0, 1339, 1337, 1, 0, 0, 0, 1339, 1340, 1, 0, 0, 0, 1340, 1342, 1, 0, 0, 0, 1341, 1339, 1, 0, 0, 0, 1342, 1348, 5, 138, 0, 0, 1343, 1345, 3, 162, 81, 0, 1344, 1346, 3, 28, 14, 0, 1345, 1344, 1, 0, 0, 0, 1345, 1346, 1, 0, 0, 0, 1346, 1348, 1, 0, 0, 0, 1347, 1301, 1, 0, 0, 0, 1347, 1302, 1, 0, 0, 0, 1347, 1303, 1, 0, 0, 0, 1347, 1304, 1, 0, 0, 0, 1347, 1306, 1, 0, 0, 0, 1347, 1311, 1, 0, 0, 0, 1347, 1319, 1, 0, 0, 0, 1347, 1324, 1, 0, 0, 0, 1347, 1329, 1, 0, 0, 0, 1347, 1334, 1, 0, 0, 0, 1347, 1343, 1, 0, 0, 0, 1348, 147, 1, 0, 0, 0, 1349, 1350, 3, 162, 81, 0, 1350, 1351, 5, 133, 0, 0, 1351, 1352, 3, 146, 73, 0, 1352, 1353, 5, 134, 0, 0, 1353, 149, 1, 0, 0, 0, 1354, 1355, 7, 6, 0, 0, 1355, 151, 1, 0, 0, 0, 1356, 1357, 7, 7, 0, 0, 1357, 153, 1, 0, 0, 0, 1358, 1367, 3, 164, 82, 0, 1359, 1367, 5, 147, 0, 0, 1360, 1367, 5, 148, 0, 0, 1361, 1367, 5, 129, 0, 0, 1362, 1367, 5, 130, 0, 0, 1363, 1367, 5, 131, 0, 0, 1364, 1367, 3, 156, 78, 0, 1365, 1367, 3, 160, 80, 0, 1366, 1358, 1, 0, 0, 0, 1366, 1359, 1, 0, 0, 0, 1366, 1360, 1, 0, 0, 0, 1366, 1361, 1, 0, 0, 0, 1366, 1362, 1, 0, 0, 0, 1366, 1363, 1, 0, 0, 0, 1366, 1364, 1, 0, 0, 0, 1366, 1365, 1, 0, 0, 0, 1367, 155, 1, 0, 0, 0, 1368, 1377, 5, 137, 0, 0, 1369, 1374, 3, 158, 79, 0, 1370, 1371, 5, 135, 0, 0, 1371, 1373, 3, 158, 79, 0, 1372, 1370, 1, 0, 0, 0, 1373, 1376, 1, 0, 0, 0, 1374, 1372, 1, 0, 0, 0, 1374, 1375, 1, 0, 0, 0, 1375, 1378, 1, 0, 0, 0, 1376, 1374, 1, 0, 0, 0, 1377, 1369, 1, 0, 0, 0, 1377, 1378, 1, 0, 0, 0, 1378, 1379, 1, 0, 0, 0, 1379, 1380, 5, 138, 0, 0, 1380, 157, 1, 0, 0, 0, 1381, 1382, 3, 164, 82, 0, 1382, 1383, 5, 133, 0, 0, 1383, 1384, 3, 154, 77, 0, 1384, 159, 1, 0, 0, 0, 1385, 1394, 5, 139, 0, 0, 1386, 1391, 3, 154, 77, 0, 1387, 1388, 5, 135, 0, 0, 1388, 1390, 3, 154, 77, 0, 1389, 1387, 1, 0, 0, 0, 1390, 1393, 1, 0, 0, 0, 1391, 1389, 1, 0, 0, 0, 1391, 1392, 1, 0, 0, 0, 1392, 1395, 1, 0, 0, 0, 1393, 1391, 1, 0, 0, 0, 1394, 1386, 1, 0, 0, 0, 1394, 1395, 1, 0, 0, 0, 1395, 1396, 1, 0, 0, 0, 1396, 1397, 5, 140, 0, 0, 1397, 161, 1, 0, 0, 0, 1398, 1399, 7, 8, 0, 0, 1399, 163, 1, 0, 0, 0, 1400, 1401, 5, 150, 0, 0, 1401, 165, 1, 0, 0, 0, 125, 178, 185, 206, 219, 231, 251, 259, 266, 272, 284, 287, 293, 304, 313, 323, 326, 328, 332, 340, 352, 357, 367, 377, 382, 397, 403, 415, 424, 432, 440, 453, 456, 466, 470, 476, 483, 489, 497, 505, 518, 525, 529, 534, 545, 551, 562, 588, 592, 598, 609, 618, 624, 629, 631, 662, 666, 672, 699, 709, 720, 723, 728, 731, 738, 747, 750, 753, 770, 779, 793, 814, 817, 820, 827, 835, 875, 878, 882, 904, 918, 926, 938, 952, 962, 980, 984, 987, 991, 994, 1000, 1004, 1009, 1013, 1017, 1023, 1037, 1052, 1072, 1081, 1113, 1133, 1153, 1163, 1166, 1169, 1171, 1185, 1209, 1225, 1234, 1244, 1257, 1272, 1284, 1288, 1297, 1315, 1339, 1345, 1347, 1366, 1374, 1377, 1391, 1394] \ No newline at end of file +[4, 1, 153, 1407, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 179, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 184, 8, 1, 10, 1, 12, 1, 187, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 205, 8, 3, 10, 3, 12, 3, 208, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 220, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 232, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 252, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 260, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 265, 8, 10, 10, 10, 12, 10, 268, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 273, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 283, 8, 10, 10, 10, 12, 10, 286, 9, 10, 3, 10, 288, 8, 10, 1, 10, 1, 10, 5, 10, 292, 8, 10, 10, 10, 12, 10, 295, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 303, 8, 11, 10, 11, 12, 11, 306, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 314, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 322, 8, 12, 10, 12, 12, 12, 325, 9, 12, 3, 12, 327, 8, 12, 3, 12, 329, 8, 12, 1, 13, 1, 13, 3, 13, 333, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 339, 8, 14, 10, 14, 12, 14, 342, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 353, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 358, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 368, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 378, 8, 18, 1, 18, 1, 18, 1, 19, 3, 19, 383, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 398, 8, 19, 1, 19, 1, 19, 1, 19, 1, 20, 3, 20, 404, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 414, 8, 20, 10, 20, 12, 20, 417, 9, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 425, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 433, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 441, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 454, 8, 21, 1, 22, 3, 22, 457, 8, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 467, 8, 22, 1, 22, 1, 22, 3, 22, 471, 8, 22, 1, 22, 1, 22, 5, 22, 475, 8, 22, 10, 22, 12, 22, 478, 9, 22, 1, 22, 1, 22, 1, 23, 1, 23, 3, 23, 484, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 490, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 498, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 506, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 519, 8, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 526, 8, 25, 1, 25, 1, 25, 3, 25, 530, 8, 25, 1, 26, 5, 26, 533, 8, 26, 10, 26, 12, 26, 536, 9, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 546, 8, 26, 1, 26, 1, 26, 5, 26, 550, 8, 26, 10, 26, 12, 26, 553, 9, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 563, 8, 27, 1, 28, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 3, 30, 589, 8, 30, 1, 30, 1, 30, 3, 30, 593, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 599, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 5, 30, 608, 8, 30, 10, 30, 12, 30, 611, 9, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 619, 8, 30, 1, 30, 1, 30, 5, 30, 623, 8, 30, 10, 30, 12, 30, 626, 9, 30, 1, 30, 1, 30, 3, 30, 630, 8, 30, 3, 30, 632, 8, 30, 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, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 661, 8, 32, 10, 32, 12, 32, 664, 9, 32, 1, 32, 3, 32, 667, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 673, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 700, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 3, 34, 710, 8, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 721, 8, 34, 1, 34, 3, 34, 724, 8, 34, 1, 34, 1, 34, 1, 34, 3, 34, 729, 8, 34, 1, 34, 3, 34, 732, 8, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 3, 35, 739, 8, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 748, 8, 35, 1, 35, 3, 35, 751, 8, 35, 1, 35, 3, 35, 754, 8, 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, 37, 1, 37, 1, 37, 3, 37, 771, 8, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 778, 8, 38, 10, 38, 12, 38, 781, 9, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 794, 8, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 813, 8, 42, 10, 42, 12, 42, 816, 9, 42, 3, 42, 818, 8, 42, 1, 42, 3, 42, 821, 8, 42, 1, 43, 1, 43, 1, 43, 5, 43, 826, 8, 43, 10, 43, 12, 43, 829, 9, 43, 1, 44, 1, 44, 1, 44, 5, 44, 834, 8, 44, 10, 44, 12, 44, 837, 9, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 868, 8, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 880, 8, 45, 1, 45, 3, 45, 883, 8, 45, 1, 45, 1, 45, 3, 45, 887, 8, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 909, 8, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 923, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 5, 46, 929, 8, 46, 10, 46, 12, 46, 932, 9, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 3, 49, 943, 8, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 957, 8, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 967, 8, 51, 1, 52, 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, 53, 1, 53, 3, 53, 985, 8, 53, 1, 53, 1, 53, 3, 53, 989, 8, 53, 1, 53, 3, 53, 992, 8, 53, 1, 53, 1, 53, 3, 53, 996, 8, 53, 1, 53, 3, 53, 999, 8, 53, 1, 53, 1, 53, 1, 54, 1, 54, 3, 54, 1005, 8, 54, 1, 54, 1, 54, 3, 54, 1009, 8, 54, 1, 54, 1, 54, 1, 54, 3, 54, 1014, 8, 54, 1, 54, 1, 54, 3, 54, 1018, 8, 54, 1, 54, 1, 54, 3, 54, 1022, 8, 54, 1, 54, 1, 54, 5, 54, 1026, 8, 54, 10, 54, 12, 54, 1029, 9, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 1042, 8, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 5, 58, 1055, 8, 58, 10, 58, 12, 58, 1058, 9, 58, 1, 58, 1, 58, 1, 58, 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, 1077, 8, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 1084, 8, 60, 10, 60, 12, 60, 1087, 9, 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, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1118, 8, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1138, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1158, 8, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1168, 8, 66, 1, 66, 3, 66, 1171, 8, 66, 1, 66, 3, 66, 1174, 8, 66, 3, 66, 1176, 8, 66, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 5, 70, 1188, 8, 70, 10, 70, 12, 70, 1191, 9, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1214, 8, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1230, 8, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1239, 8, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1249, 8, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 5, 71, 1260, 8, 71, 10, 71, 12, 71, 1263, 9, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1277, 8, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1289, 8, 71, 1, 71, 1, 71, 3, 71, 1293, 8, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1302, 8, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1320, 8, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 5, 73, 1342, 8, 73, 10, 73, 12, 73, 1345, 9, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1350, 8, 73, 3, 73, 1352, 8, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 3, 77, 1371, 8, 77, 1, 78, 1, 78, 1, 78, 1, 78, 5, 78, 1377, 8, 78, 10, 78, 12, 78, 1380, 9, 78, 3, 78, 1382, 8, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 5, 80, 1394, 8, 80, 10, 80, 12, 80, 1397, 9, 80, 3, 80, 1399, 8, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 0, 0, 83, 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, 0, 9, 2, 0, 15, 15, 33, 33, 1, 0, 11, 12, 1, 0, 101, 105, 3, 0, 1, 1, 96, 100, 102, 103, 3, 0, 1, 1, 96, 97, 102, 103, 2, 0, 98, 100, 102, 103, 1, 0, 121, 128, 1, 0, 108, 111, 9, 0, 1, 1, 4, 8, 10, 33, 40, 40, 45, 45, 74, 74, 94, 95, 106, 106, 149, 149, 1524, 0, 178, 1, 0, 0, 0, 2, 180, 1, 0, 0, 0, 4, 190, 1, 0, 0, 0, 6, 194, 1, 0, 0, 0, 8, 219, 1, 0, 0, 0, 10, 231, 1, 0, 0, 0, 12, 233, 1, 0, 0, 0, 14, 240, 1, 0, 0, 0, 16, 251, 1, 0, 0, 0, 18, 253, 1, 0, 0, 0, 20, 266, 1, 0, 0, 0, 22, 298, 1, 0, 0, 0, 24, 328, 1, 0, 0, 0, 26, 330, 1, 0, 0, 0, 28, 334, 1, 0, 0, 0, 30, 352, 1, 0, 0, 0, 32, 354, 1, 0, 0, 0, 34, 367, 1, 0, 0, 0, 36, 369, 1, 0, 0, 0, 38, 382, 1, 0, 0, 0, 40, 403, 1, 0, 0, 0, 42, 453, 1, 0, 0, 0, 44, 456, 1, 0, 0, 0, 46, 481, 1, 0, 0, 0, 48, 518, 1, 0, 0, 0, 50, 529, 1, 0, 0, 0, 52, 534, 1, 0, 0, 0, 54, 562, 1, 0, 0, 0, 56, 564, 1, 0, 0, 0, 58, 574, 1, 0, 0, 0, 60, 586, 1, 0, 0, 0, 62, 633, 1, 0, 0, 0, 64, 699, 1, 0, 0, 0, 66, 701, 1, 0, 0, 0, 68, 706, 1, 0, 0, 0, 70, 735, 1, 0, 0, 0, 72, 757, 1, 0, 0, 0, 74, 770, 1, 0, 0, 0, 76, 772, 1, 0, 0, 0, 78, 784, 1, 0, 0, 0, 80, 797, 1, 0, 0, 0, 82, 800, 1, 0, 0, 0, 84, 820, 1, 0, 0, 0, 86, 822, 1, 0, 0, 0, 88, 830, 1, 0, 0, 0, 90, 922, 1, 0, 0, 0, 92, 924, 1, 0, 0, 0, 94, 935, 1, 0, 0, 0, 96, 937, 1, 0, 0, 0, 98, 942, 1, 0, 0, 0, 100, 944, 1, 0, 0, 0, 102, 966, 1, 0, 0, 0, 104, 968, 1, 0, 0, 0, 106, 977, 1, 0, 0, 0, 108, 1002, 1, 0, 0, 0, 110, 1032, 1, 0, 0, 0, 112, 1041, 1, 0, 0, 0, 114, 1043, 1, 0, 0, 0, 116, 1051, 1, 0, 0, 0, 118, 1076, 1, 0, 0, 0, 120, 1078, 1, 0, 0, 0, 122, 1090, 1, 0, 0, 0, 124, 1097, 1, 0, 0, 0, 126, 1111, 1, 0, 0, 0, 128, 1121, 1, 0, 0, 0, 130, 1137, 1, 0, 0, 0, 132, 1175, 1, 0, 0, 0, 134, 1177, 1, 0, 0, 0, 136, 1180, 1, 0, 0, 0, 138, 1182, 1, 0, 0, 0, 140, 1184, 1, 0, 0, 0, 142, 1292, 1, 0, 0, 0, 144, 1294, 1, 0, 0, 0, 146, 1351, 1, 0, 0, 0, 148, 1353, 1, 0, 0, 0, 150, 1358, 1, 0, 0, 0, 152, 1360, 1, 0, 0, 0, 154, 1370, 1, 0, 0, 0, 156, 1372, 1, 0, 0, 0, 158, 1385, 1, 0, 0, 0, 160, 1389, 1, 0, 0, 0, 162, 1402, 1, 0, 0, 0, 164, 1404, 1, 0, 0, 0, 166, 167, 3, 6, 3, 0, 167, 168, 5, 0, 0, 1, 168, 179, 1, 0, 0, 0, 169, 170, 3, 20, 10, 0, 170, 171, 5, 0, 0, 1, 171, 179, 1, 0, 0, 0, 172, 173, 3, 52, 26, 0, 173, 174, 5, 0, 0, 1, 174, 179, 1, 0, 0, 0, 175, 176, 3, 2, 1, 0, 176, 177, 5, 0, 0, 1, 177, 179, 1, 0, 0, 0, 178, 166, 1, 0, 0, 0, 178, 169, 1, 0, 0, 0, 178, 172, 1, 0, 0, 0, 178, 175, 1, 0, 0, 0, 179, 1, 1, 0, 0, 0, 180, 181, 5, 40, 0, 0, 181, 185, 5, 137, 0, 0, 182, 184, 3, 8, 4, 0, 183, 182, 1, 0, 0, 0, 184, 187, 1, 0, 0, 0, 185, 183, 1, 0, 0, 0, 185, 186, 1, 0, 0, 0, 186, 188, 1, 0, 0, 0, 187, 185, 1, 0, 0, 0, 188, 189, 5, 138, 0, 0, 189, 3, 1, 0, 0, 0, 190, 191, 5, 41, 0, 0, 191, 192, 3, 164, 82, 0, 192, 193, 5, 134, 0, 0, 193, 5, 1, 0, 0, 0, 194, 195, 5, 9, 0, 0, 195, 196, 3, 162, 81, 0, 196, 197, 5, 84, 0, 0, 197, 198, 3, 164, 82, 0, 198, 199, 5, 77, 0, 0, 199, 200, 3, 164, 82, 0, 200, 201, 5, 76, 0, 0, 201, 202, 3, 164, 82, 0, 202, 206, 5, 137, 0, 0, 203, 205, 3, 8, 4, 0, 204, 203, 1, 0, 0, 0, 205, 208, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 206, 207, 1, 0, 0, 0, 207, 209, 1, 0, 0, 0, 208, 206, 1, 0, 0, 0, 209, 210, 5, 138, 0, 0, 210, 7, 1, 0, 0, 0, 211, 220, 3, 4, 2, 0, 212, 220, 3, 18, 9, 0, 213, 220, 3, 10, 5, 0, 214, 220, 3, 96, 48, 0, 215, 220, 3, 108, 54, 0, 216, 220, 3, 144, 72, 0, 217, 220, 3, 58, 29, 0, 218, 220, 3, 32, 16, 0, 219, 211, 1, 0, 0, 0, 219, 212, 1, 0, 0, 0, 219, 213, 1, 0, 0, 0, 219, 214, 1, 0, 0, 0, 219, 215, 1, 0, 0, 0, 219, 216, 1, 0, 0, 0, 219, 217, 1, 0, 0, 0, 219, 218, 1, 0, 0, 0, 220, 9, 1, 0, 0, 0, 221, 222, 5, 41, 0, 0, 222, 223, 5, 44, 0, 0, 223, 224, 3, 162, 81, 0, 224, 225, 5, 134, 0, 0, 225, 232, 1, 0, 0, 0, 226, 227, 5, 41, 0, 0, 227, 228, 5, 46, 0, 0, 228, 229, 3, 162, 81, 0, 229, 230, 5, 134, 0, 0, 230, 232, 1, 0, 0, 0, 231, 221, 1, 0, 0, 0, 231, 226, 1, 0, 0, 0, 232, 11, 1, 0, 0, 0, 233, 234, 5, 42, 0, 0, 234, 235, 5, 43, 0, 0, 235, 236, 3, 162, 81, 0, 236, 237, 5, 84, 0, 0, 237, 238, 3, 164, 82, 0, 238, 239, 5, 134, 0, 0, 239, 13, 1, 0, 0, 0, 240, 241, 5, 42, 0, 0, 241, 242, 5, 44, 0, 0, 242, 243, 3, 162, 81, 0, 243, 244, 5, 77, 0, 0, 244, 245, 3, 164, 82, 0, 245, 246, 5, 134, 0, 0, 246, 15, 1, 0, 0, 0, 247, 252, 3, 10, 5, 0, 248, 252, 3, 12, 6, 0, 249, 252, 3, 14, 7, 0, 250, 252, 3, 32, 16, 0, 251, 247, 1, 0, 0, 0, 251, 248, 1, 0, 0, 0, 251, 249, 1, 0, 0, 0, 251, 250, 1, 0, 0, 0, 252, 17, 1, 0, 0, 0, 253, 254, 5, 43, 0, 0, 254, 255, 3, 162, 81, 0, 255, 256, 5, 84, 0, 0, 256, 259, 3, 164, 82, 0, 257, 258, 5, 85, 0, 0, 258, 260, 3, 164, 82, 0, 259, 257, 1, 0, 0, 0, 259, 260, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 262, 5, 134, 0, 0, 262, 19, 1, 0, 0, 0, 263, 265, 3, 16, 8, 0, 264, 263, 1, 0, 0, 0, 265, 268, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 269, 1, 0, 0, 0, 268, 266, 1, 0, 0, 0, 269, 270, 5, 44, 0, 0, 270, 272, 3, 162, 81, 0, 271, 273, 3, 22, 11, 0, 272, 271, 1, 0, 0, 0, 272, 273, 1, 0, 0, 0, 273, 274, 1, 0, 0, 0, 274, 275, 5, 84, 0, 0, 275, 276, 3, 164, 82, 0, 276, 277, 5, 77, 0, 0, 277, 287, 3, 164, 82, 0, 278, 279, 5, 89, 0, 0, 279, 284, 3, 26, 13, 0, 280, 281, 5, 135, 0, 0, 281, 283, 3, 26, 13, 0, 282, 280, 1, 0, 0, 0, 283, 286, 1, 0, 0, 0, 284, 282, 1, 0, 0, 0, 284, 285, 1, 0, 0, 0, 285, 288, 1, 0, 0, 0, 286, 284, 1, 0, 0, 0, 287, 278, 1, 0, 0, 0, 287, 288, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 293, 5, 137, 0, 0, 290, 292, 3, 34, 17, 0, 291, 290, 1, 0, 0, 0, 292, 295, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 293, 294, 1, 0, 0, 0, 294, 296, 1, 0, 0, 0, 295, 293, 1, 0, 0, 0, 296, 297, 5, 138, 0, 0, 297, 21, 1, 0, 0, 0, 298, 299, 5, 143, 0, 0, 299, 304, 3, 24, 12, 0, 300, 301, 5, 135, 0, 0, 301, 303, 3, 24, 12, 0, 302, 300, 1, 0, 0, 0, 303, 306, 1, 0, 0, 0, 304, 302, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 307, 1, 0, 0, 0, 306, 304, 1, 0, 0, 0, 307, 308, 5, 144, 0, 0, 308, 23, 1, 0, 0, 0, 309, 310, 5, 47, 0, 0, 310, 313, 3, 162, 81, 0, 311, 312, 5, 133, 0, 0, 312, 314, 5, 37, 0, 0, 313, 311, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 329, 1, 0, 0, 0, 315, 316, 5, 36, 0, 0, 316, 326, 3, 162, 81, 0, 317, 318, 5, 38, 0, 0, 318, 323, 3, 26, 13, 0, 319, 320, 5, 145, 0, 0, 320, 322, 3, 26, 13, 0, 321, 319, 1, 0, 0, 0, 322, 325, 1, 0, 0, 0, 323, 321, 1, 0, 0, 0, 323, 324, 1, 0, 0, 0, 324, 327, 1, 0, 0, 0, 325, 323, 1, 0, 0, 0, 326, 317, 1, 0, 0, 0, 326, 327, 1, 0, 0, 0, 327, 329, 1, 0, 0, 0, 328, 309, 1, 0, 0, 0, 328, 315, 1, 0, 0, 0, 329, 25, 1, 0, 0, 0, 330, 332, 3, 162, 81, 0, 331, 333, 3, 28, 14, 0, 332, 331, 1, 0, 0, 0, 332, 333, 1, 0, 0, 0, 333, 27, 1, 0, 0, 0, 334, 335, 5, 143, 0, 0, 335, 340, 3, 30, 15, 0, 336, 337, 5, 135, 0, 0, 337, 339, 3, 30, 15, 0, 338, 336, 1, 0, 0, 0, 339, 342, 1, 0, 0, 0, 340, 338, 1, 0, 0, 0, 340, 341, 1, 0, 0, 0, 341, 343, 1, 0, 0, 0, 342, 340, 1, 0, 0, 0, 343, 344, 5, 144, 0, 0, 344, 29, 1, 0, 0, 0, 345, 346, 5, 43, 0, 0, 346, 353, 3, 162, 81, 0, 347, 348, 5, 44, 0, 0, 348, 353, 3, 26, 13, 0, 349, 350, 5, 36, 0, 0, 350, 353, 3, 162, 81, 0, 351, 353, 3, 146, 73, 0, 352, 345, 1, 0, 0, 0, 352, 347, 1, 0, 0, 0, 352, 349, 1, 0, 0, 0, 352, 351, 1, 0, 0, 0, 353, 31, 1, 0, 0, 0, 354, 355, 5, 35, 0, 0, 355, 357, 3, 162, 81, 0, 356, 358, 3, 22, 11, 0, 357, 356, 1, 0, 0, 0, 357, 358, 1, 0, 0, 0, 358, 359, 1, 0, 0, 0, 359, 360, 5, 146, 0, 0, 360, 361, 3, 146, 73, 0, 361, 362, 5, 134, 0, 0, 362, 33, 1, 0, 0, 0, 363, 368, 3, 40, 20, 0, 364, 368, 3, 44, 22, 0, 365, 368, 3, 38, 19, 0, 366, 368, 3, 36, 18, 0, 367, 363, 1, 0, 0, 0, 367, 364, 1, 0, 0, 0, 367, 365, 1, 0, 0, 0, 367, 366, 1, 0, 0, 0, 368, 35, 1, 0, 0, 0, 369, 370, 5, 2, 0, 0, 370, 371, 3, 162, 81, 0, 371, 372, 5, 84, 0, 0, 372, 373, 3, 164, 82, 0, 373, 374, 5, 3, 0, 0, 374, 377, 3, 164, 82, 0, 375, 376, 5, 5, 0, 0, 376, 378, 3, 50, 25, 0, 377, 375, 1, 0, 0, 0, 377, 378, 1, 0, 0, 0, 378, 379, 1, 0, 0, 0, 379, 380, 5, 134, 0, 0, 380, 37, 1, 0, 0, 0, 381, 383, 5, 57, 0, 0, 382, 381, 1, 0, 0, 0, 382, 383, 1, 0, 0, 0, 383, 384, 1, 0, 0, 0, 384, 385, 5, 49, 0, 0, 385, 386, 3, 162, 81, 0, 386, 387, 5, 84, 0, 0, 387, 388, 3, 164, 82, 0, 388, 389, 5, 133, 0, 0, 389, 390, 3, 146, 73, 0, 390, 391, 5, 132, 0, 0, 391, 392, 3, 146, 73, 0, 392, 393, 5, 137, 0, 0, 393, 394, 5, 101, 0, 0, 394, 395, 5, 84, 0, 0, 395, 397, 3, 164, 82, 0, 396, 398, 3, 74, 37, 0, 397, 396, 1, 0, 0, 0, 397, 398, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 400, 5, 134, 0, 0, 400, 401, 5, 138, 0, 0, 401, 39, 1, 0, 0, 0, 402, 404, 3, 46, 23, 0, 403, 402, 1, 0, 0, 0, 403, 404, 1, 0, 0, 0, 404, 405, 1, 0, 0, 0, 405, 406, 5, 47, 0, 0, 406, 407, 3, 162, 81, 0, 407, 408, 5, 84, 0, 0, 408, 409, 3, 164, 82, 0, 409, 410, 5, 133, 0, 0, 410, 411, 3, 146, 73, 0, 411, 415, 5, 137, 0, 0, 412, 414, 3, 42, 21, 0, 413, 412, 1, 0, 0, 0, 414, 417, 1, 0, 0, 0, 415, 413, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 418, 1, 0, 0, 0, 417, 415, 1, 0, 0, 0, 418, 419, 5, 138, 0, 0, 419, 41, 1, 0, 0, 0, 420, 421, 5, 91, 0, 0, 421, 422, 5, 84, 0, 0, 422, 424, 3, 164, 82, 0, 423, 425, 3, 74, 37, 0, 424, 423, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 427, 5, 134, 0, 0, 427, 454, 1, 0, 0, 0, 428, 429, 5, 92, 0, 0, 429, 430, 5, 84, 0, 0, 430, 432, 3, 164, 82, 0, 431, 433, 3, 74, 37, 0, 432, 431, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 434, 1, 0, 0, 0, 434, 435, 5, 134, 0, 0, 435, 454, 1, 0, 0, 0, 436, 437, 5, 1, 0, 0, 437, 438, 5, 84, 0, 0, 438, 440, 3, 164, 82, 0, 439, 441, 3, 74, 37, 0, 440, 439, 1, 0, 0, 0, 440, 441, 1, 0, 0, 0, 441, 442, 1, 0, 0, 0, 442, 443, 5, 134, 0, 0, 443, 454, 1, 0, 0, 0, 444, 445, 5, 93, 0, 0, 445, 446, 5, 94, 0, 0, 446, 447, 5, 84, 0, 0, 447, 448, 3, 164, 82, 0, 448, 449, 5, 95, 0, 0, 449, 450, 5, 84, 0, 0, 450, 451, 3, 164, 82, 0, 451, 452, 5, 134, 0, 0, 452, 454, 1, 0, 0, 0, 453, 420, 1, 0, 0, 0, 453, 428, 1, 0, 0, 0, 453, 436, 1, 0, 0, 0, 453, 444, 1, 0, 0, 0, 454, 43, 1, 0, 0, 0, 455, 457, 3, 46, 23, 0, 456, 455, 1, 0, 0, 0, 456, 457, 1, 0, 0, 0, 457, 458, 1, 0, 0, 0, 458, 459, 5, 48, 0, 0, 459, 460, 3, 162, 81, 0, 460, 461, 5, 84, 0, 0, 461, 462, 3, 164, 82, 0, 462, 463, 5, 133, 0, 0, 463, 464, 3, 152, 76, 0, 464, 466, 3, 50, 25, 0, 465, 467, 5, 112, 0, 0, 466, 465, 1, 0, 0, 0, 466, 467, 1, 0, 0, 0, 467, 470, 1, 0, 0, 0, 468, 469, 5, 82, 0, 0, 469, 471, 3, 164, 82, 0, 470, 468, 1, 0, 0, 0, 470, 471, 1, 0, 0, 0, 471, 472, 1, 0, 0, 0, 472, 476, 5, 137, 0, 0, 473, 475, 3, 48, 24, 0, 474, 473, 1, 0, 0, 0, 475, 478, 1, 0, 0, 0, 476, 474, 1, 0, 0, 0, 476, 477, 1, 0, 0, 0, 477, 479, 1, 0, 0, 0, 478, 476, 1, 0, 0, 0, 479, 480, 5, 138, 0, 0, 480, 45, 1, 0, 0, 0, 481, 483, 5, 32, 0, 0, 482, 484, 7, 0, 0, 0, 483, 482, 1, 0, 0, 0, 483, 484, 1, 0, 0, 0, 484, 47, 1, 0, 0, 0, 485, 486, 5, 98, 0, 0, 486, 487, 5, 84, 0, 0, 487, 489, 3, 164, 82, 0, 488, 490, 3, 74, 37, 0, 489, 488, 1, 0, 0, 0, 489, 490, 1, 0, 0, 0, 490, 491, 1, 0, 0, 0, 491, 492, 5, 134, 0, 0, 492, 519, 1, 0, 0, 0, 493, 494, 5, 99, 0, 0, 494, 495, 5, 84, 0, 0, 495, 497, 3, 164, 82, 0, 496, 498, 3, 74, 37, 0, 497, 496, 1, 0, 0, 0, 497, 498, 1, 0, 0, 0, 498, 499, 1, 0, 0, 0, 499, 500, 5, 134, 0, 0, 500, 519, 1, 0, 0, 0, 501, 502, 5, 100, 0, 0, 502, 503, 5, 84, 0, 0, 503, 505, 3, 164, 82, 0, 504, 506, 3, 74, 37, 0, 505, 504, 1, 0, 0, 0, 505, 506, 1, 0, 0, 0, 506, 507, 1, 0, 0, 0, 507, 508, 5, 134, 0, 0, 508, 519, 1, 0, 0, 0, 509, 510, 5, 93, 0, 0, 510, 511, 5, 94, 0, 0, 511, 512, 5, 84, 0, 0, 512, 513, 3, 164, 82, 0, 513, 514, 5, 95, 0, 0, 514, 515, 5, 84, 0, 0, 515, 516, 3, 164, 82, 0, 516, 517, 5, 134, 0, 0, 517, 519, 1, 0, 0, 0, 518, 485, 1, 0, 0, 0, 518, 493, 1, 0, 0, 0, 518, 501, 1, 0, 0, 0, 518, 509, 1, 0, 0, 0, 519, 49, 1, 0, 0, 0, 520, 521, 5, 43, 0, 0, 521, 530, 3, 162, 81, 0, 522, 523, 5, 44, 0, 0, 523, 525, 3, 162, 81, 0, 524, 526, 3, 28, 14, 0, 525, 524, 1, 0, 0, 0, 525, 526, 1, 0, 0, 0, 526, 530, 1, 0, 0, 0, 527, 528, 5, 36, 0, 0, 528, 530, 3, 162, 81, 0, 529, 520, 1, 0, 0, 0, 529, 522, 1, 0, 0, 0, 529, 527, 1, 0, 0, 0, 530, 51, 1, 0, 0, 0, 531, 533, 3, 16, 8, 0, 532, 531, 1, 0, 0, 0, 533, 536, 1, 0, 0, 0, 534, 532, 1, 0, 0, 0, 534, 535, 1, 0, 0, 0, 535, 537, 1, 0, 0, 0, 536, 534, 1, 0, 0, 0, 537, 538, 5, 46, 0, 0, 538, 539, 3, 162, 81, 0, 539, 540, 5, 84, 0, 0, 540, 541, 3, 164, 82, 0, 541, 542, 5, 77, 0, 0, 542, 545, 3, 164, 82, 0, 543, 544, 5, 78, 0, 0, 544, 546, 5, 147, 0, 0, 545, 543, 1, 0, 0, 0, 545, 546, 1, 0, 0, 0, 546, 547, 1, 0, 0, 0, 547, 551, 5, 137, 0, 0, 548, 550, 3, 54, 27, 0, 549, 548, 1, 0, 0, 0, 550, 553, 1, 0, 0, 0, 551, 549, 1, 0, 0, 0, 551, 552, 1, 0, 0, 0, 552, 554, 1, 0, 0, 0, 553, 551, 1, 0, 0, 0, 554, 555, 5, 138, 0, 0, 555, 53, 1, 0, 0, 0, 556, 563, 3, 68, 34, 0, 557, 563, 3, 70, 35, 0, 558, 563, 3, 78, 39, 0, 559, 563, 3, 60, 30, 0, 560, 563, 3, 62, 31, 0, 561, 563, 3, 56, 28, 0, 562, 556, 1, 0, 0, 0, 562, 557, 1, 0, 0, 0, 562, 558, 1, 0, 0, 0, 562, 559, 1, 0, 0, 0, 562, 560, 1, 0, 0, 0, 562, 561, 1, 0, 0, 0, 563, 55, 1, 0, 0, 0, 564, 565, 5, 2, 0, 0, 565, 566, 3, 162, 81, 0, 566, 567, 5, 84, 0, 0, 567, 568, 3, 164, 82, 0, 568, 569, 5, 38, 0, 0, 569, 570, 3, 26, 13, 0, 570, 571, 5, 136, 0, 0, 571, 572, 3, 162, 81, 0, 572, 573, 5, 134, 0, 0, 573, 57, 1, 0, 0, 0, 574, 575, 5, 4, 0, 0, 575, 576, 3, 162, 81, 0, 576, 577, 5, 84, 0, 0, 577, 578, 3, 164, 82, 0, 578, 579, 5, 6, 0, 0, 579, 580, 3, 26, 13, 0, 580, 581, 5, 65, 0, 0, 581, 582, 3, 162, 81, 0, 582, 583, 5, 136, 0, 0, 583, 584, 3, 162, 81, 0, 584, 585, 5, 134, 0, 0, 585, 59, 1, 0, 0, 0, 586, 588, 5, 22, 0, 0, 587, 589, 5, 40, 0, 0, 588, 587, 1, 0, 0, 0, 588, 589, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 590, 592, 3, 162, 81, 0, 591, 593, 3, 22, 11, 0, 592, 591, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 595, 5, 84, 0, 0, 595, 596, 3, 164, 82, 0, 596, 598, 5, 25, 0, 0, 597, 599, 5, 9, 0, 0, 598, 597, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 600, 1, 0, 0, 0, 600, 601, 3, 26, 13, 0, 601, 602, 5, 26, 0, 0, 602, 631, 3, 164, 82, 0, 603, 604, 5, 49, 0, 0, 604, 605, 3, 164, 82, 0, 605, 609, 5, 137, 0, 0, 606, 608, 3, 64, 32, 0, 607, 606, 1, 0, 0, 0, 608, 611, 1, 0, 0, 0, 609, 607, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 612, 1, 0, 0, 0, 611, 609, 1, 0, 0, 0, 612, 613, 5, 138, 0, 0, 613, 632, 1, 0, 0, 0, 614, 615, 5, 40, 0, 0, 615, 618, 3, 164, 82, 0, 616, 617, 5, 49, 0, 0, 617, 619, 3, 164, 82, 0, 618, 616, 1, 0, 0, 0, 618, 619, 1, 0, 0, 0, 619, 629, 1, 0, 0, 0, 620, 624, 5, 137, 0, 0, 621, 623, 3, 64, 32, 0, 622, 621, 1, 0, 0, 0, 623, 626, 1, 0, 0, 0, 624, 622, 1, 0, 0, 0, 624, 625, 1, 0, 0, 0, 625, 627, 1, 0, 0, 0, 626, 624, 1, 0, 0, 0, 627, 630, 5, 138, 0, 0, 628, 630, 5, 134, 0, 0, 629, 620, 1, 0, 0, 0, 629, 628, 1, 0, 0, 0, 630, 632, 1, 0, 0, 0, 631, 603, 1, 0, 0, 0, 631, 614, 1, 0, 0, 0, 632, 61, 1, 0, 0, 0, 633, 634, 5, 22, 0, 0, 634, 635, 3, 162, 81, 0, 635, 636, 5, 84, 0, 0, 636, 637, 3, 164, 82, 0, 637, 638, 5, 24, 0, 0, 638, 639, 3, 162, 81, 0, 639, 640, 3, 28, 14, 0, 640, 641, 5, 134, 0, 0, 641, 63, 1, 0, 0, 0, 642, 643, 5, 16, 0, 0, 643, 700, 5, 134, 0, 0, 644, 645, 5, 17, 0, 0, 645, 646, 5, 18, 0, 0, 646, 647, 3, 162, 81, 0, 647, 648, 5, 134, 0, 0, 648, 700, 1, 0, 0, 0, 649, 650, 5, 27, 0, 0, 650, 651, 3, 164, 82, 0, 651, 652, 5, 134, 0, 0, 652, 700, 1, 0, 0, 0, 653, 654, 5, 27, 0, 0, 654, 655, 3, 162, 81, 0, 655, 656, 5, 136, 0, 0, 656, 666, 3, 162, 81, 0, 657, 658, 5, 64, 0, 0, 658, 662, 5, 137, 0, 0, 659, 661, 3, 66, 33, 0, 660, 659, 1, 0, 0, 0, 661, 664, 1, 0, 0, 0, 662, 660, 1, 0, 0, 0, 662, 663, 1, 0, 0, 0, 663, 665, 1, 0, 0, 0, 664, 662, 1, 0, 0, 0, 665, 667, 5, 138, 0, 0, 666, 657, 1, 0, 0, 0, 666, 667, 1, 0, 0, 0, 667, 668, 1, 0, 0, 0, 668, 669, 5, 134, 0, 0, 669, 700, 1, 0, 0, 0, 670, 672, 5, 28, 0, 0, 671, 673, 5, 36, 0, 0, 672, 671, 1, 0, 0, 0, 672, 673, 1, 0, 0, 0, 673, 674, 1, 0, 0, 0, 674, 675, 3, 162, 81, 0, 675, 676, 5, 55, 0, 0, 676, 677, 3, 26, 13, 0, 677, 678, 5, 134, 0, 0, 678, 700, 1, 0, 0, 0, 679, 680, 5, 29, 0, 0, 680, 681, 3, 162, 81, 0, 681, 682, 5, 147, 0, 0, 682, 683, 5, 134, 0, 0, 683, 700, 1, 0, 0, 0, 684, 685, 5, 30, 0, 0, 685, 686, 3, 26, 13, 0, 686, 687, 5, 136, 0, 0, 687, 688, 3, 162, 81, 0, 688, 689, 3, 162, 81, 0, 689, 690, 3, 164, 82, 0, 690, 691, 5, 134, 0, 0, 691, 700, 1, 0, 0, 0, 692, 693, 5, 93, 0, 0, 693, 700, 5, 134, 0, 0, 694, 695, 5, 31, 0, 0, 695, 696, 5, 147, 0, 0, 696, 697, 3, 164, 82, 0, 697, 698, 5, 134, 0, 0, 698, 700, 1, 0, 0, 0, 699, 642, 1, 0, 0, 0, 699, 644, 1, 0, 0, 0, 699, 649, 1, 0, 0, 0, 699, 653, 1, 0, 0, 0, 699, 670, 1, 0, 0, 0, 699, 679, 1, 0, 0, 0, 699, 684, 1, 0, 0, 0, 699, 692, 1, 0, 0, 0, 699, 694, 1, 0, 0, 0, 700, 65, 1, 0, 0, 0, 701, 702, 3, 162, 81, 0, 702, 703, 5, 58, 0, 0, 703, 704, 3, 162, 81, 0, 704, 705, 5, 134, 0, 0, 705, 67, 1, 0, 0, 0, 706, 707, 5, 49, 0, 0, 707, 709, 3, 162, 81, 0, 708, 710, 3, 22, 11, 0, 709, 708, 1, 0, 0, 0, 709, 710, 1, 0, 0, 0, 710, 711, 1, 0, 0, 0, 711, 712, 5, 84, 0, 0, 712, 713, 3, 164, 82, 0, 713, 714, 5, 133, 0, 0, 714, 715, 3, 146, 73, 0, 715, 716, 5, 132, 0, 0, 716, 717, 3, 146, 73, 0, 717, 718, 5, 86, 0, 0, 718, 720, 3, 82, 41, 0, 719, 721, 3, 74, 37, 0, 720, 719, 1, 0, 0, 0, 720, 721, 1, 0, 0, 0, 721, 723, 1, 0, 0, 0, 722, 724, 3, 80, 40, 0, 723, 722, 1, 0, 0, 0, 723, 724, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 726, 5, 88, 0, 0, 726, 728, 3, 84, 42, 0, 727, 729, 3, 88, 44, 0, 728, 727, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 731, 1, 0, 0, 0, 730, 732, 3, 72, 36, 0, 731, 730, 1, 0, 0, 0, 731, 732, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 734, 5, 134, 0, 0, 734, 69, 1, 0, 0, 0, 735, 736, 5, 50, 0, 0, 736, 738, 3, 162, 81, 0, 737, 739, 3, 22, 11, 0, 738, 737, 1, 0, 0, 0, 738, 739, 1, 0, 0, 0, 739, 740, 1, 0, 0, 0, 740, 741, 5, 84, 0, 0, 741, 742, 3, 164, 82, 0, 742, 743, 5, 133, 0, 0, 743, 744, 3, 146, 73, 0, 744, 745, 5, 132, 0, 0, 745, 747, 3, 146, 73, 0, 746, 748, 3, 74, 37, 0, 747, 746, 1, 0, 0, 0, 747, 748, 1, 0, 0, 0, 748, 750, 1, 0, 0, 0, 749, 751, 3, 88, 44, 0, 750, 749, 1, 0, 0, 0, 750, 751, 1, 0, 0, 0, 751, 753, 1, 0, 0, 0, 752, 754, 3, 72, 36, 0, 753, 752, 1, 0, 0, 0, 753, 754, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 756, 5, 134, 0, 0, 756, 71, 1, 0, 0, 0, 757, 758, 5, 66, 0, 0, 758, 759, 5, 65, 0, 0, 759, 760, 3, 162, 81, 0, 760, 73, 1, 0, 0, 0, 761, 762, 5, 10, 0, 0, 762, 771, 5, 13, 0, 0, 763, 764, 5, 10, 0, 0, 764, 765, 7, 1, 0, 0, 765, 766, 5, 14, 0, 0, 766, 767, 5, 139, 0, 0, 767, 768, 3, 86, 43, 0, 768, 769, 5, 140, 0, 0, 769, 771, 1, 0, 0, 0, 770, 761, 1, 0, 0, 0, 770, 763, 1, 0, 0, 0, 771, 75, 1, 0, 0, 0, 772, 773, 5, 65, 0, 0, 773, 774, 5, 139, 0, 0, 774, 779, 3, 128, 64, 0, 775, 776, 5, 135, 0, 0, 776, 778, 3, 128, 64, 0, 777, 775, 1, 0, 0, 0, 778, 781, 1, 0, 0, 0, 779, 777, 1, 0, 0, 0, 779, 780, 1, 0, 0, 0, 780, 782, 1, 0, 0, 0, 781, 779, 1, 0, 0, 0, 782, 783, 5, 140, 0, 0, 783, 77, 1, 0, 0, 0, 784, 785, 5, 51, 0, 0, 785, 786, 3, 162, 81, 0, 786, 787, 5, 84, 0, 0, 787, 788, 3, 164, 82, 0, 788, 789, 5, 52, 0, 0, 789, 790, 3, 162, 81, 0, 790, 791, 5, 133, 0, 0, 791, 793, 3, 146, 73, 0, 792, 794, 3, 88, 44, 0, 793, 792, 1, 0, 0, 0, 793, 794, 1, 0, 0, 0, 794, 795, 1, 0, 0, 0, 795, 796, 5, 134, 0, 0, 796, 79, 1, 0, 0, 0, 797, 798, 5, 87, 0, 0, 798, 799, 3, 146, 73, 0, 799, 81, 1, 0, 0, 0, 800, 801, 7, 2, 0, 0, 801, 83, 1, 0, 0, 0, 802, 821, 5, 90, 0, 0, 803, 804, 5, 43, 0, 0, 804, 821, 3, 162, 81, 0, 805, 806, 5, 36, 0, 0, 806, 821, 3, 162, 81, 0, 807, 808, 5, 45, 0, 0, 808, 817, 5, 139, 0, 0, 809, 814, 3, 26, 13, 0, 810, 811, 5, 135, 0, 0, 811, 813, 3, 26, 13, 0, 812, 810, 1, 0, 0, 0, 813, 816, 1, 0, 0, 0, 814, 812, 1, 0, 0, 0, 814, 815, 1, 0, 0, 0, 815, 818, 1, 0, 0, 0, 816, 814, 1, 0, 0, 0, 817, 809, 1, 0, 0, 0, 817, 818, 1, 0, 0, 0, 818, 819, 1, 0, 0, 0, 819, 821, 5, 140, 0, 0, 820, 802, 1, 0, 0, 0, 820, 803, 1, 0, 0, 0, 820, 805, 1, 0, 0, 0, 820, 807, 1, 0, 0, 0, 821, 85, 1, 0, 0, 0, 822, 827, 3, 162, 81, 0, 823, 824, 5, 135, 0, 0, 824, 826, 3, 162, 81, 0, 825, 823, 1, 0, 0, 0, 826, 829, 1, 0, 0, 0, 827, 825, 1, 0, 0, 0, 827, 828, 1, 0, 0, 0, 828, 87, 1, 0, 0, 0, 829, 827, 1, 0, 0, 0, 830, 831, 5, 89, 0, 0, 831, 835, 5, 137, 0, 0, 832, 834, 3, 90, 45, 0, 833, 832, 1, 0, 0, 0, 834, 837, 1, 0, 0, 0, 835, 833, 1, 0, 0, 0, 835, 836, 1, 0, 0, 0, 836, 838, 1, 0, 0, 0, 837, 835, 1, 0, 0, 0, 838, 839, 5, 138, 0, 0, 839, 89, 1, 0, 0, 0, 840, 841, 5, 23, 0, 0, 841, 842, 3, 162, 81, 0, 842, 843, 5, 84, 0, 0, 843, 844, 3, 164, 82, 0, 844, 845, 5, 139, 0, 0, 845, 846, 3, 86, 43, 0, 846, 847, 5, 140, 0, 0, 847, 848, 5, 134, 0, 0, 848, 923, 1, 0, 0, 0, 849, 850, 5, 61, 0, 0, 850, 851, 3, 162, 81, 0, 851, 852, 5, 84, 0, 0, 852, 853, 3, 164, 82, 0, 853, 854, 5, 133, 0, 0, 854, 855, 3, 146, 73, 0, 855, 856, 3, 92, 46, 0, 856, 857, 5, 134, 0, 0, 857, 923, 1, 0, 0, 0, 858, 859, 5, 62, 0, 0, 859, 860, 3, 162, 81, 0, 860, 861, 5, 84, 0, 0, 861, 862, 3, 164, 82, 0, 862, 863, 5, 133, 0, 0, 863, 864, 3, 152, 76, 0, 864, 867, 3, 50, 25, 0, 865, 866, 5, 82, 0, 0, 866, 868, 3, 164, 82, 0, 867, 865, 1, 0, 0, 0, 867, 868, 1, 0, 0, 0, 868, 869, 1, 0, 0, 0, 869, 870, 3, 92, 46, 0, 870, 871, 5, 134, 0, 0, 871, 923, 1, 0, 0, 0, 872, 873, 5, 44, 0, 0, 873, 874, 3, 162, 81, 0, 874, 875, 5, 84, 0, 0, 875, 876, 3, 164, 82, 0, 876, 877, 5, 133, 0, 0, 877, 879, 3, 162, 81, 0, 878, 880, 3, 28, 14, 0, 879, 878, 1, 0, 0, 0, 879, 880, 1, 0, 0, 0, 880, 882, 1, 0, 0, 0, 881, 883, 3, 76, 38, 0, 882, 881, 1, 0, 0, 0, 882, 883, 1, 0, 0, 0, 883, 886, 1, 0, 0, 0, 884, 885, 5, 18, 0, 0, 885, 887, 5, 53, 0, 0, 886, 884, 1, 0, 0, 0, 886, 887, 1, 0, 0, 0, 887, 888, 1, 0, 0, 0, 888, 889, 5, 134, 0, 0, 889, 923, 1, 0, 0, 0, 890, 891, 5, 7, 0, 0, 891, 892, 3, 162, 81, 0, 892, 893, 5, 84, 0, 0, 893, 894, 3, 164, 82, 0, 894, 895, 5, 133, 0, 0, 895, 896, 3, 162, 81, 0, 896, 897, 5, 53, 0, 0, 897, 898, 3, 146, 73, 0, 898, 899, 5, 134, 0, 0, 899, 923, 1, 0, 0, 0, 900, 901, 5, 51, 0, 0, 901, 902, 3, 162, 81, 0, 902, 903, 5, 84, 0, 0, 903, 904, 3, 164, 82, 0, 904, 905, 5, 133, 0, 0, 905, 908, 3, 162, 81, 0, 906, 907, 5, 53, 0, 0, 907, 909, 3, 146, 73, 0, 908, 906, 1, 0, 0, 0, 908, 909, 1, 0, 0, 0, 909, 910, 1, 0, 0, 0, 910, 911, 5, 134, 0, 0, 911, 923, 1, 0, 0, 0, 912, 913, 5, 22, 0, 0, 913, 914, 3, 162, 81, 0, 914, 915, 5, 84, 0, 0, 915, 916, 3, 164, 82, 0, 916, 917, 5, 133, 0, 0, 917, 918, 3, 162, 81, 0, 918, 919, 5, 136, 0, 0, 919, 920, 3, 162, 81, 0, 920, 921, 5, 134, 0, 0, 921, 923, 1, 0, 0, 0, 922, 840, 1, 0, 0, 0, 922, 849, 1, 0, 0, 0, 922, 858, 1, 0, 0, 0, 922, 872, 1, 0, 0, 0, 922, 890, 1, 0, 0, 0, 922, 900, 1, 0, 0, 0, 922, 912, 1, 0, 0, 0, 923, 91, 1, 0, 0, 0, 924, 925, 5, 139, 0, 0, 925, 930, 3, 94, 47, 0, 926, 927, 5, 135, 0, 0, 927, 929, 3, 94, 47, 0, 928, 926, 1, 0, 0, 0, 929, 932, 1, 0, 0, 0, 930, 928, 1, 0, 0, 0, 930, 931, 1, 0, 0, 0, 931, 933, 1, 0, 0, 0, 932, 930, 1, 0, 0, 0, 933, 934, 5, 140, 0, 0, 934, 93, 1, 0, 0, 0, 935, 936, 7, 3, 0, 0, 936, 95, 1, 0, 0, 0, 937, 938, 5, 60, 0, 0, 938, 939, 3, 98, 49, 0, 939, 97, 1, 0, 0, 0, 940, 943, 3, 100, 50, 0, 941, 943, 3, 104, 52, 0, 942, 940, 1, 0, 0, 0, 942, 941, 1, 0, 0, 0, 943, 99, 1, 0, 0, 0, 944, 945, 5, 61, 0, 0, 945, 946, 3, 162, 81, 0, 946, 947, 5, 84, 0, 0, 947, 948, 3, 164, 82, 0, 948, 949, 5, 71, 0, 0, 949, 950, 3, 162, 81, 0, 950, 951, 5, 133, 0, 0, 951, 952, 3, 146, 73, 0, 952, 953, 5, 72, 0, 0, 953, 956, 3, 102, 51, 0, 954, 955, 5, 73, 0, 0, 955, 957, 3, 154, 77, 0, 956, 954, 1, 0, 0, 0, 956, 957, 1, 0, 0, 0, 957, 958, 1, 0, 0, 0, 958, 959, 5, 134, 0, 0, 959, 101, 1, 0, 0, 0, 960, 967, 5, 106, 0, 0, 961, 962, 5, 107, 0, 0, 962, 963, 5, 141, 0, 0, 963, 964, 3, 146, 73, 0, 964, 965, 5, 142, 0, 0, 965, 967, 1, 0, 0, 0, 966, 960, 1, 0, 0, 0, 966, 961, 1, 0, 0, 0, 967, 103, 1, 0, 0, 0, 968, 969, 5, 62, 0, 0, 969, 970, 3, 162, 81, 0, 970, 971, 5, 84, 0, 0, 971, 972, 3, 164, 82, 0, 972, 973, 5, 137, 0, 0, 973, 974, 3, 106, 53, 0, 974, 975, 3, 106, 53, 0, 975, 976, 5, 138, 0, 0, 976, 105, 1, 0, 0, 0, 977, 978, 3, 50, 25, 0, 978, 979, 5, 63, 0, 0, 979, 980, 3, 162, 81, 0, 980, 981, 5, 84, 0, 0, 981, 982, 3, 164, 82, 0, 982, 984, 3, 152, 76, 0, 983, 985, 5, 112, 0, 0, 984, 983, 1, 0, 0, 0, 984, 985, 1, 0, 0, 0, 985, 988, 1, 0, 0, 0, 986, 987, 5, 79, 0, 0, 987, 989, 3, 164, 82, 0, 988, 986, 1, 0, 0, 0, 988, 989, 1, 0, 0, 0, 989, 991, 1, 0, 0, 0, 990, 992, 5, 81, 0, 0, 991, 990, 1, 0, 0, 0, 991, 992, 1, 0, 0, 0, 992, 995, 1, 0, 0, 0, 993, 994, 5, 82, 0, 0, 994, 996, 3, 164, 82, 0, 995, 993, 1, 0, 0, 0, 995, 996, 1, 0, 0, 0, 996, 998, 1, 0, 0, 0, 997, 999, 5, 83, 0, 0, 998, 997, 1, 0, 0, 0, 998, 999, 1, 0, 0, 0, 999, 1000, 1, 0, 0, 0, 1000, 1001, 5, 134, 0, 0, 1001, 107, 1, 0, 0, 0, 1002, 1004, 5, 54, 0, 0, 1003, 1005, 3, 22, 11, 0, 1004, 1003, 1, 0, 0, 0, 1004, 1005, 1, 0, 0, 0, 1005, 1006, 1, 0, 0, 0, 1006, 1008, 3, 162, 81, 0, 1007, 1009, 3, 110, 55, 0, 1008, 1007, 1, 0, 0, 0, 1008, 1009, 1, 0, 0, 0, 1009, 1010, 1, 0, 0, 0, 1010, 1011, 5, 55, 0, 0, 1011, 1013, 3, 162, 81, 0, 1012, 1014, 3, 28, 14, 0, 1013, 1012, 1, 0, 0, 0, 1013, 1014, 1, 0, 0, 0, 1014, 1017, 1, 0, 0, 0, 1015, 1016, 5, 84, 0, 0, 1016, 1018, 3, 164, 82, 0, 1017, 1015, 1, 0, 0, 0, 1017, 1018, 1, 0, 0, 0, 1018, 1021, 1, 0, 0, 0, 1019, 1020, 5, 78, 0, 0, 1020, 1022, 5, 147, 0, 0, 1021, 1019, 1, 0, 0, 0, 1021, 1022, 1, 0, 0, 0, 1022, 1023, 1, 0, 0, 0, 1023, 1027, 5, 137, 0, 0, 1024, 1026, 3, 112, 56, 0, 1025, 1024, 1, 0, 0, 0, 1026, 1029, 1, 0, 0, 0, 1027, 1025, 1, 0, 0, 0, 1027, 1028, 1, 0, 0, 0, 1028, 1030, 1, 0, 0, 0, 1029, 1027, 1, 0, 0, 0, 1030, 1031, 5, 138, 0, 0, 1031, 109, 1, 0, 0, 0, 1032, 1033, 3, 28, 14, 0, 1033, 111, 1, 0, 0, 0, 1034, 1035, 5, 59, 0, 0, 1035, 1042, 3, 98, 49, 0, 1036, 1042, 3, 126, 63, 0, 1037, 1042, 3, 122, 61, 0, 1038, 1042, 3, 116, 58, 0, 1039, 1042, 3, 124, 62, 0, 1040, 1042, 3, 114, 57, 0, 1041, 1034, 1, 0, 0, 0, 1041, 1036, 1, 0, 0, 0, 1041, 1037, 1, 0, 0, 0, 1041, 1038, 1, 0, 0, 0, 1041, 1039, 1, 0, 0, 0, 1041, 1040, 1, 0, 0, 0, 1042, 113, 1, 0, 0, 0, 1043, 1044, 5, 56, 0, 0, 1044, 1045, 3, 162, 81, 0, 1045, 1046, 5, 58, 0, 0, 1046, 1047, 3, 162, 81, 0, 1047, 1048, 5, 136, 0, 0, 1048, 1049, 3, 162, 81, 0, 1049, 1050, 5, 134, 0, 0, 1050, 115, 1, 0, 0, 0, 1051, 1052, 5, 8, 0, 0, 1052, 1056, 5, 137, 0, 0, 1053, 1055, 3, 118, 59, 0, 1054, 1053, 1, 0, 0, 0, 1055, 1058, 1, 0, 0, 0, 1056, 1054, 1, 0, 0, 0, 1056, 1057, 1, 0, 0, 0, 1057, 1059, 1, 0, 0, 0, 1058, 1056, 1, 0, 0, 0, 1059, 1060, 5, 138, 0, 0, 1060, 1061, 5, 134, 0, 0, 1061, 117, 1, 0, 0, 0, 1062, 1063, 3, 162, 81, 0, 1063, 1064, 5, 58, 0, 0, 1064, 1065, 5, 61, 0, 0, 1065, 1066, 3, 162, 81, 0, 1066, 1067, 5, 134, 0, 0, 1067, 1077, 1, 0, 0, 0, 1068, 1069, 3, 162, 81, 0, 1069, 1070, 5, 58, 0, 0, 1070, 1071, 5, 62, 0, 0, 1071, 1072, 3, 162, 81, 0, 1072, 1073, 5, 136, 0, 0, 1073, 1074, 3, 162, 81, 0, 1074, 1075, 5, 134, 0, 0, 1075, 1077, 1, 0, 0, 0, 1076, 1062, 1, 0, 0, 0, 1076, 1068, 1, 0, 0, 0, 1077, 119, 1, 0, 0, 0, 1078, 1079, 3, 26, 13, 0, 1079, 1080, 5, 18, 0, 0, 1080, 1085, 5, 53, 0, 0, 1081, 1082, 5, 136, 0, 0, 1082, 1084, 3, 162, 81, 0, 1083, 1081, 1, 0, 0, 0, 1084, 1087, 1, 0, 0, 0, 1085, 1083, 1, 0, 0, 0, 1085, 1086, 1, 0, 0, 0, 1086, 1088, 1, 0, 0, 0, 1087, 1085, 1, 0, 0, 0, 1088, 1089, 5, 134, 0, 0, 1089, 121, 1, 0, 0, 0, 1090, 1091, 5, 56, 0, 0, 1091, 1092, 3, 162, 81, 0, 1092, 1093, 5, 58, 0, 0, 1093, 1094, 5, 61, 0, 0, 1094, 1095, 3, 162, 81, 0, 1095, 1096, 5, 134, 0, 0, 1096, 123, 1, 0, 0, 0, 1097, 1098, 5, 68, 0, 0, 1098, 1099, 3, 162, 81, 0, 1099, 1100, 5, 69, 0, 0, 1100, 1101, 5, 70, 0, 0, 1101, 1102, 5, 65, 0, 0, 1102, 1103, 5, 51, 0, 0, 1103, 1104, 3, 162, 81, 0, 1104, 1105, 5, 67, 0, 0, 1105, 1106, 5, 62, 0, 0, 1106, 1107, 3, 162, 81, 0, 1107, 1108, 5, 136, 0, 0, 1108, 1109, 3, 162, 81, 0, 1109, 1110, 5, 134, 0, 0, 1110, 125, 1, 0, 0, 0, 1111, 1112, 5, 56, 0, 0, 1112, 1113, 3, 128, 64, 0, 1113, 1114, 5, 58, 0, 0, 1114, 1117, 3, 132, 66, 0, 1115, 1116, 5, 34, 0, 0, 1116, 1118, 3, 164, 82, 0, 1117, 1115, 1, 0, 0, 0, 1117, 1118, 1, 0, 0, 0, 1118, 1119, 1, 0, 0, 0, 1119, 1120, 5, 134, 0, 0, 1120, 127, 1, 0, 0, 0, 1121, 1122, 3, 162, 81, 0, 1122, 1123, 5, 136, 0, 0, 1123, 1124, 3, 130, 65, 0, 1124, 129, 1, 0, 0, 0, 1125, 1138, 3, 162, 81, 0, 1126, 1138, 5, 101, 0, 0, 1127, 1138, 5, 91, 0, 0, 1128, 1138, 5, 92, 0, 0, 1129, 1138, 5, 1, 0, 0, 1130, 1138, 5, 98, 0, 0, 1131, 1138, 5, 99, 0, 0, 1132, 1138, 5, 100, 0, 0, 1133, 1138, 5, 102, 0, 0, 1134, 1138, 5, 103, 0, 0, 1135, 1138, 5, 104, 0, 0, 1136, 1138, 5, 105, 0, 0, 1137, 1125, 1, 0, 0, 0, 1137, 1126, 1, 0, 0, 0, 1137, 1127, 1, 0, 0, 0, 1137, 1128, 1, 0, 0, 0, 1137, 1129, 1, 0, 0, 0, 1137, 1130, 1, 0, 0, 0, 1137, 1131, 1, 0, 0, 0, 1137, 1132, 1, 0, 0, 0, 1137, 1133, 1, 0, 0, 0, 1137, 1134, 1, 0, 0, 0, 1137, 1135, 1, 0, 0, 0, 1137, 1136, 1, 0, 0, 0, 1138, 131, 1, 0, 0, 0, 1139, 1140, 5, 80, 0, 0, 1140, 1141, 5, 136, 0, 0, 1141, 1176, 3, 162, 81, 0, 1142, 1143, 5, 61, 0, 0, 1143, 1144, 3, 162, 81, 0, 1144, 1145, 5, 136, 0, 0, 1145, 1146, 3, 136, 68, 0, 1146, 1176, 1, 0, 0, 0, 1147, 1148, 5, 62, 0, 0, 1148, 1149, 3, 162, 81, 0, 1149, 1150, 5, 136, 0, 0, 1150, 1151, 3, 162, 81, 0, 1151, 1152, 5, 136, 0, 0, 1152, 1153, 3, 138, 69, 0, 1153, 1176, 1, 0, 0, 0, 1154, 1155, 5, 44, 0, 0, 1155, 1157, 3, 162, 81, 0, 1156, 1158, 3, 28, 14, 0, 1157, 1156, 1, 0, 0, 0, 1157, 1158, 1, 0, 0, 0, 1158, 1159, 1, 0, 0, 0, 1159, 1160, 5, 136, 0, 0, 1160, 1161, 3, 128, 64, 0, 1161, 1176, 1, 0, 0, 0, 1162, 1163, 5, 46, 0, 0, 1163, 1164, 3, 162, 81, 0, 1164, 1165, 5, 136, 0, 0, 1165, 1167, 3, 162, 81, 0, 1166, 1168, 3, 28, 14, 0, 1167, 1166, 1, 0, 0, 0, 1167, 1168, 1, 0, 0, 0, 1168, 1170, 1, 0, 0, 0, 1169, 1171, 3, 140, 70, 0, 1170, 1169, 1, 0, 0, 0, 1170, 1171, 1, 0, 0, 0, 1171, 1173, 1, 0, 0, 0, 1172, 1174, 3, 134, 67, 0, 1173, 1172, 1, 0, 0, 0, 1173, 1174, 1, 0, 0, 0, 1174, 1176, 1, 0, 0, 0, 1175, 1139, 1, 0, 0, 0, 1175, 1142, 1, 0, 0, 0, 1175, 1147, 1, 0, 0, 0, 1175, 1154, 1, 0, 0, 0, 1175, 1162, 1, 0, 0, 0, 1176, 133, 1, 0, 0, 0, 1177, 1178, 5, 66, 0, 0, 1178, 1179, 3, 140, 70, 0, 1179, 135, 1, 0, 0, 0, 1180, 1181, 7, 4, 0, 0, 1181, 137, 1, 0, 0, 0, 1182, 1183, 7, 5, 0, 0, 1183, 139, 1, 0, 0, 0, 1184, 1185, 5, 64, 0, 0, 1185, 1189, 5, 137, 0, 0, 1186, 1188, 3, 142, 71, 0, 1187, 1186, 1, 0, 0, 0, 1188, 1191, 1, 0, 0, 0, 1189, 1187, 1, 0, 0, 0, 1189, 1190, 1, 0, 0, 0, 1190, 1192, 1, 0, 0, 0, 1191, 1189, 1, 0, 0, 0, 1192, 1193, 5, 138, 0, 0, 1193, 141, 1, 0, 0, 0, 1194, 1195, 3, 162, 81, 0, 1195, 1196, 5, 58, 0, 0, 1196, 1197, 5, 9, 0, 0, 1197, 1198, 5, 23, 0, 0, 1198, 1199, 5, 139, 0, 0, 1199, 1200, 3, 86, 43, 0, 1200, 1201, 5, 140, 0, 0, 1201, 1202, 5, 134, 0, 0, 1202, 1293, 1, 0, 0, 0, 1203, 1204, 3, 162, 81, 0, 1204, 1205, 5, 58, 0, 0, 1205, 1206, 5, 61, 0, 0, 1206, 1213, 3, 162, 81, 0, 1207, 1208, 5, 67, 0, 0, 1208, 1209, 5, 62, 0, 0, 1209, 1210, 3, 162, 81, 0, 1210, 1211, 5, 136, 0, 0, 1211, 1212, 3, 162, 81, 0, 1212, 1214, 1, 0, 0, 0, 1213, 1207, 1, 0, 0, 0, 1213, 1214, 1, 0, 0, 0, 1214, 1215, 1, 0, 0, 0, 1215, 1216, 5, 134, 0, 0, 1216, 1293, 1, 0, 0, 0, 1217, 1218, 3, 162, 81, 0, 1218, 1219, 5, 58, 0, 0, 1219, 1220, 5, 62, 0, 0, 1220, 1221, 3, 162, 81, 0, 1221, 1222, 5, 136, 0, 0, 1222, 1229, 3, 162, 81, 0, 1223, 1224, 5, 67, 0, 0, 1224, 1225, 5, 62, 0, 0, 1225, 1226, 3, 162, 81, 0, 1226, 1227, 5, 136, 0, 0, 1227, 1228, 3, 162, 81, 0, 1228, 1230, 1, 0, 0, 0, 1229, 1223, 1, 0, 0, 0, 1229, 1230, 1, 0, 0, 0, 1230, 1231, 1, 0, 0, 0, 1231, 1232, 5, 134, 0, 0, 1232, 1293, 1, 0, 0, 0, 1233, 1234, 3, 162, 81, 0, 1234, 1235, 5, 58, 0, 0, 1235, 1236, 5, 44, 0, 0, 1236, 1238, 3, 162, 81, 0, 1237, 1239, 3, 28, 14, 0, 1238, 1237, 1, 0, 0, 0, 1238, 1239, 1, 0, 0, 0, 1239, 1248, 1, 0, 0, 0, 1240, 1241, 5, 67, 0, 0, 1241, 1242, 5, 62, 0, 0, 1242, 1243, 3, 162, 81, 0, 1243, 1244, 5, 136, 0, 0, 1244, 1245, 3, 162, 81, 0, 1245, 1249, 1, 0, 0, 0, 1246, 1247, 5, 18, 0, 0, 1247, 1249, 5, 53, 0, 0, 1248, 1240, 1, 0, 0, 0, 1248, 1246, 1, 0, 0, 0, 1248, 1249, 1, 0, 0, 0, 1249, 1250, 1, 0, 0, 0, 1250, 1251, 5, 134, 0, 0, 1251, 1293, 1, 0, 0, 0, 1252, 1253, 3, 162, 81, 0, 1253, 1254, 5, 58, 0, 0, 1254, 1255, 5, 7, 0, 0, 1255, 1256, 3, 162, 81, 0, 1256, 1257, 5, 64, 0, 0, 1257, 1261, 5, 137, 0, 0, 1258, 1260, 3, 120, 60, 0, 1259, 1258, 1, 0, 0, 0, 1260, 1263, 1, 0, 0, 0, 1261, 1259, 1, 0, 0, 0, 1261, 1262, 1, 0, 0, 0, 1262, 1264, 1, 0, 0, 0, 1263, 1261, 1, 0, 0, 0, 1264, 1265, 5, 138, 0, 0, 1265, 1266, 5, 134, 0, 0, 1266, 1293, 1, 0, 0, 0, 1267, 1268, 3, 162, 81, 0, 1268, 1269, 5, 58, 0, 0, 1269, 1270, 5, 51, 0, 0, 1270, 1271, 3, 162, 81, 0, 1271, 1272, 5, 134, 0, 0, 1272, 1293, 1, 0, 0, 0, 1273, 1274, 3, 162, 81, 0, 1274, 1276, 5, 58, 0, 0, 1275, 1277, 5, 9, 0, 0, 1276, 1275, 1, 0, 0, 0, 1276, 1277, 1, 0, 0, 0, 1277, 1278, 1, 0, 0, 0, 1278, 1279, 5, 22, 0, 0, 1279, 1280, 3, 162, 81, 0, 1280, 1281, 5, 136, 0, 0, 1281, 1288, 3, 162, 81, 0, 1282, 1283, 5, 67, 0, 0, 1283, 1284, 5, 62, 0, 0, 1284, 1285, 3, 162, 81, 0, 1285, 1286, 5, 136, 0, 0, 1286, 1287, 3, 162, 81, 0, 1287, 1289, 1, 0, 0, 0, 1288, 1282, 1, 0, 0, 0, 1288, 1289, 1, 0, 0, 0, 1289, 1290, 1, 0, 0, 0, 1290, 1291, 5, 134, 0, 0, 1291, 1293, 1, 0, 0, 0, 1292, 1194, 1, 0, 0, 0, 1292, 1203, 1, 0, 0, 0, 1292, 1217, 1, 0, 0, 0, 1292, 1233, 1, 0, 0, 0, 1292, 1252, 1, 0, 0, 0, 1292, 1267, 1, 0, 0, 0, 1292, 1273, 1, 0, 0, 0, 1293, 143, 1, 0, 0, 0, 1294, 1295, 5, 51, 0, 0, 1295, 1296, 3, 162, 81, 0, 1296, 1297, 5, 58, 0, 0, 1297, 1298, 3, 162, 81, 0, 1298, 1299, 5, 136, 0, 0, 1299, 1301, 3, 162, 81, 0, 1300, 1302, 3, 140, 70, 0, 1301, 1300, 1, 0, 0, 0, 1301, 1302, 1, 0, 0, 0, 1302, 1303, 1, 0, 0, 0, 1303, 1304, 5, 134, 0, 0, 1304, 145, 1, 0, 0, 0, 1305, 1352, 3, 150, 75, 0, 1306, 1352, 5, 113, 0, 0, 1307, 1352, 5, 114, 0, 0, 1308, 1309, 5, 115, 0, 0, 1309, 1352, 3, 164, 82, 0, 1310, 1311, 5, 116, 0, 0, 1311, 1312, 5, 143, 0, 0, 1312, 1313, 3, 162, 81, 0, 1313, 1314, 5, 144, 0, 0, 1314, 1352, 1, 0, 0, 0, 1315, 1316, 5, 117, 0, 0, 1316, 1317, 5, 143, 0, 0, 1317, 1319, 3, 162, 81, 0, 1318, 1320, 3, 28, 14, 0, 1319, 1318, 1, 0, 0, 0, 1319, 1320, 1, 0, 0, 0, 1320, 1321, 1, 0, 0, 0, 1321, 1322, 5, 144, 0, 0, 1322, 1352, 1, 0, 0, 0, 1323, 1324, 5, 39, 0, 0, 1324, 1325, 5, 143, 0, 0, 1325, 1326, 3, 162, 81, 0, 1326, 1327, 5, 144, 0, 0, 1327, 1352, 1, 0, 0, 0, 1328, 1329, 5, 118, 0, 0, 1329, 1330, 5, 143, 0, 0, 1330, 1331, 3, 146, 73, 0, 1331, 1332, 5, 144, 0, 0, 1332, 1352, 1, 0, 0, 0, 1333, 1334, 5, 119, 0, 0, 1334, 1335, 5, 143, 0, 0, 1335, 1336, 3, 146, 73, 0, 1336, 1337, 5, 144, 0, 0, 1337, 1352, 1, 0, 0, 0, 1338, 1339, 5, 120, 0, 0, 1339, 1343, 5, 137, 0, 0, 1340, 1342, 3, 148, 74, 0, 1341, 1340, 1, 0, 0, 0, 1342, 1345, 1, 0, 0, 0, 1343, 1341, 1, 0, 0, 0, 1343, 1344, 1, 0, 0, 0, 1344, 1346, 1, 0, 0, 0, 1345, 1343, 1, 0, 0, 0, 1346, 1352, 5, 138, 0, 0, 1347, 1349, 3, 162, 81, 0, 1348, 1350, 3, 28, 14, 0, 1349, 1348, 1, 0, 0, 0, 1349, 1350, 1, 0, 0, 0, 1350, 1352, 1, 0, 0, 0, 1351, 1305, 1, 0, 0, 0, 1351, 1306, 1, 0, 0, 0, 1351, 1307, 1, 0, 0, 0, 1351, 1308, 1, 0, 0, 0, 1351, 1310, 1, 0, 0, 0, 1351, 1315, 1, 0, 0, 0, 1351, 1323, 1, 0, 0, 0, 1351, 1328, 1, 0, 0, 0, 1351, 1333, 1, 0, 0, 0, 1351, 1338, 1, 0, 0, 0, 1351, 1347, 1, 0, 0, 0, 1352, 147, 1, 0, 0, 0, 1353, 1354, 3, 162, 81, 0, 1354, 1355, 5, 133, 0, 0, 1355, 1356, 3, 146, 73, 0, 1356, 1357, 5, 134, 0, 0, 1357, 149, 1, 0, 0, 0, 1358, 1359, 7, 6, 0, 0, 1359, 151, 1, 0, 0, 0, 1360, 1361, 7, 7, 0, 0, 1361, 153, 1, 0, 0, 0, 1362, 1371, 3, 164, 82, 0, 1363, 1371, 5, 147, 0, 0, 1364, 1371, 5, 148, 0, 0, 1365, 1371, 5, 129, 0, 0, 1366, 1371, 5, 130, 0, 0, 1367, 1371, 5, 131, 0, 0, 1368, 1371, 3, 156, 78, 0, 1369, 1371, 3, 160, 80, 0, 1370, 1362, 1, 0, 0, 0, 1370, 1363, 1, 0, 0, 0, 1370, 1364, 1, 0, 0, 0, 1370, 1365, 1, 0, 0, 0, 1370, 1366, 1, 0, 0, 0, 1370, 1367, 1, 0, 0, 0, 1370, 1368, 1, 0, 0, 0, 1370, 1369, 1, 0, 0, 0, 1371, 155, 1, 0, 0, 0, 1372, 1381, 5, 137, 0, 0, 1373, 1378, 3, 158, 79, 0, 1374, 1375, 5, 135, 0, 0, 1375, 1377, 3, 158, 79, 0, 1376, 1374, 1, 0, 0, 0, 1377, 1380, 1, 0, 0, 0, 1378, 1376, 1, 0, 0, 0, 1378, 1379, 1, 0, 0, 0, 1379, 1382, 1, 0, 0, 0, 1380, 1378, 1, 0, 0, 0, 1381, 1373, 1, 0, 0, 0, 1381, 1382, 1, 0, 0, 0, 1382, 1383, 1, 0, 0, 0, 1383, 1384, 5, 138, 0, 0, 1384, 157, 1, 0, 0, 0, 1385, 1386, 3, 164, 82, 0, 1386, 1387, 5, 133, 0, 0, 1387, 1388, 3, 154, 77, 0, 1388, 159, 1, 0, 0, 0, 1389, 1398, 5, 139, 0, 0, 1390, 1395, 3, 154, 77, 0, 1391, 1392, 5, 135, 0, 0, 1392, 1394, 3, 154, 77, 0, 1393, 1391, 1, 0, 0, 0, 1394, 1397, 1, 0, 0, 0, 1395, 1393, 1, 0, 0, 0, 1395, 1396, 1, 0, 0, 0, 1396, 1399, 1, 0, 0, 0, 1397, 1395, 1, 0, 0, 0, 1398, 1390, 1, 0, 0, 0, 1398, 1399, 1, 0, 0, 0, 1399, 1400, 1, 0, 0, 0, 1400, 1401, 5, 140, 0, 0, 1401, 161, 1, 0, 0, 0, 1402, 1403, 7, 8, 0, 0, 1403, 163, 1, 0, 0, 0, 1404, 1405, 5, 150, 0, 0, 1405, 165, 1, 0, 0, 0, 126, 178, 185, 206, 219, 231, 251, 259, 266, 272, 284, 287, 293, 304, 313, 323, 326, 328, 332, 340, 352, 357, 367, 377, 382, 397, 403, 415, 424, 432, 440, 453, 456, 466, 470, 476, 483, 489, 497, 505, 518, 525, 529, 534, 545, 551, 562, 588, 592, 598, 609, 618, 624, 629, 631, 662, 666, 672, 699, 709, 720, 723, 728, 731, 738, 747, 750, 753, 770, 779, 793, 814, 817, 820, 827, 835, 867, 879, 882, 886, 908, 922, 930, 942, 956, 966, 984, 988, 991, 995, 998, 1004, 1008, 1013, 1017, 1021, 1027, 1041, 1056, 1076, 1085, 1117, 1137, 1157, 1167, 1170, 1173, 1175, 1189, 1213, 1229, 1238, 1248, 1261, 1276, 1288, 1292, 1301, 1319, 1343, 1349, 1351, 1370, 1378, 1381, 1395, 1398] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapabilityParser.ts b/src/capability-language/generated/QuixosCapabilityParser.ts index 629df05..e956b15 100644 --- a/src/capability-language/generated/QuixosCapabilityParser.ts +++ b/src/capability-language/generated/QuixosCapabilityParser.ts @@ -3130,7 +3130,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 90, QuixosCapabilityParser.RULE_dependencyPort); let _la: number; try { - this.state = 918; + this.state = 922; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REFLECTION: @@ -3192,137 +3192,149 @@ export class QuixosCapabilityParser extends antlr.Parser { this.cardinality(); this.state = 864; this.targetConstraint(); - this.state = 865; + this.state = 867; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 82) { + { + this.state = 865; + this.match(QuixosCapabilityParser.KEYED); + this.state = 866; + this.stringLiteral(); + } + } + + this.state = 869; this.primitiveList(); - this.state = 866; + this.state = 870; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 4); { - this.state = 868; - this.match(QuixosCapabilityParser.INTERFACE); - this.state = 869; - this.identifier(); - this.state = 870; - this.match(QuixosCapabilityParser.ID); - this.state = 871; - this.stringLiteral(); this.state = 872; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.INTERFACE); this.state = 873; this.identifier(); + this.state = 874; + this.match(QuixosCapabilityParser.ID); this.state = 875; + this.stringLiteral(); + this.state = 876; + this.match(QuixosCapabilityParser.COLON); + this.state = 877; + this.identifier(); + this.state = 879; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 874; + this.state = 878; this.typeArguments(); } } - this.state = 878; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 65) { - { - this.state = 877; - this.selectedOperations(); - } - } - this.state = 882; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); + if (_la === 65) { + { + this.state = 881; + this.selectedOperations(); + } + } + + this.state = 886; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); if (_la === 18) { { - this.state = 880; + this.state = 884; this.match(QuixosCapabilityParser.FROM); - this.state = 881; + this.state = 885; this.match(QuixosCapabilityParser.INPUT); } } - this.state = 884; + this.state = 888; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CREATION: this.enterOuterAlt(localContext, 5); { - this.state = 886; - this.match(QuixosCapabilityParser.CREATION); - this.state = 887; - this.identifier(); - this.state = 888; - this.match(QuixosCapabilityParser.ID); - this.state = 889; - this.stringLiteral(); this.state = 890; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.CREATION); this.state = 891; this.identifier(); this.state = 892; - this.match(QuixosCapabilityParser.INPUT); + this.match(QuixosCapabilityParser.ID); this.state = 893; - this.valueType(); + this.stringLiteral(); this.state = 894; + this.match(QuixosCapabilityParser.COLON); + this.state = 895; + this.identifier(); + this.state = 896; + this.match(QuixosCapabilityParser.INPUT); + this.state = 897; + this.valueType(); + this.state = 898; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONSTRUCTOR: this.enterOuterAlt(localContext, 6); { - this.state = 896; - this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 897; - this.identifier(); - this.state = 898; - this.match(QuixosCapabilityParser.ID); - this.state = 899; - this.stringLiteral(); this.state = 900; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.CONSTRUCTOR); this.state = 901; this.identifier(); + this.state = 902; + this.match(QuixosCapabilityParser.ID); + this.state = 903; + this.stringLiteral(); this.state = 904; + this.match(QuixosCapabilityParser.COLON); + this.state = 905; + this.identifier(); + this.state = 908; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 53) { { - this.state = 902; + this.state = 906; this.match(QuixosCapabilityParser.INPUT); - this.state = 903; + this.state = 907; this.valueType(); } } - this.state = 906; + this.state = 910; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.QUERY: this.enterOuterAlt(localContext, 7); { - this.state = 908; - this.match(QuixosCapabilityParser.QUERY); - this.state = 909; - this.identifier(); - this.state = 910; - this.match(QuixosCapabilityParser.ID); - this.state = 911; - this.stringLiteral(); this.state = 912; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.QUERY); this.state = 913; this.identifier(); this.state = 914; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.ID); this.state = 915; - this.identifier(); + this.stringLiteral(); this.state = 916; + this.match(QuixosCapabilityParser.COLON); + this.state = 917; + this.identifier(); + this.state = 918; + this.match(QuixosCapabilityParser.DOT); + this.state = 919; + this.identifier(); + this.state = 920; this.match(QuixosCapabilityParser.SEMI); } break; @@ -3350,27 +3362,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 920; + this.state = 924; this.match(QuixosCapabilityParser.LBRACK); - this.state = 921; + this.state = 925; this.primitive(); - this.state = 926; + this.state = 930; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 922; + this.state = 926; this.match(QuixosCapabilityParser.COMMA); - this.state = 923; + this.state = 927; this.primitive(); } } - this.state = 928; + this.state = 932; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 929; + this.state = 933; this.match(QuixosCapabilityParser.RBRACK); } } @@ -3394,7 +3406,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 931; + this.state = 935; _la = this.tokenStream.LA(1); if(!(_la === 1 || ((((_la - 96)) & ~0x1F) === 0 && ((1 << (_la - 96)) & 223) !== 0))) { this.errorHandler.recoverInline(this); @@ -3424,9 +3436,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 933; + this.state = 937; this.match(QuixosCapabilityParser.SHARED); - this.state = 934; + this.state = 938; this.attachmentDecl(); } } @@ -3447,20 +3459,20 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new AttachmentDeclContext(this.context, this.state); this.enterRule(localContext, 98, QuixosCapabilityParser.RULE_attachmentDecl); try { - this.state = 938; + this.state = 942; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 936; + this.state = 940; this.stateDecl(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 937; + this.state = 941; this.edgeDecl(); } break; @@ -3488,39 +3500,39 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 940; - this.match(QuixosCapabilityParser.STATE); - this.state = 941; - this.identifier(); - this.state = 942; - this.match(QuixosCapabilityParser.ID); - this.state = 943; - this.stringLiteral(); this.state = 944; - this.match(QuixosCapabilityParser.ON); + this.match(QuixosCapabilityParser.STATE); this.state = 945; this.identifier(); this.state = 946; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.ID); this.state = 947; - this.valueType(); + this.stringLiteral(); this.state = 948; - this.match(QuixosCapabilityParser.POLICY); + this.match(QuixosCapabilityParser.ON); this.state = 949; - this.storagePolicy(); + this.identifier(); + this.state = 950; + this.match(QuixosCapabilityParser.COLON); + this.state = 951; + this.valueType(); this.state = 952; + this.match(QuixosCapabilityParser.POLICY); + this.state = 953; + this.storagePolicy(); + this.state = 956; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 73) { { - this.state = 950; + this.state = 954; this.match(QuixosCapabilityParser.DEFAULT); - this.state = 951; + this.state = 955; this.jsonLiteral(); } } - this.state = 954; + this.state = 958; this.match(QuixosCapabilityParser.SEMI); } } @@ -3541,26 +3553,26 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new StoragePolicyContext(this.context, this.state); this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_storagePolicy); try { - this.state = 962; + this.state = 966; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REGISTER: this.enterOuterAlt(localContext, 1); { - this.state = 956; + this.state = 960; this.match(QuixosCapabilityParser.REGISTER); } break; case QuixosCapabilityParser.CRDT: this.enterOuterAlt(localContext, 2); { - this.state = 957; + this.state = 961; this.match(QuixosCapabilityParser.CRDT); - this.state = 958; + this.state = 962; this.match(QuixosCapabilityParser.LPAREN); - this.state = 959; + this.state = 963; this.valueType(); - this.state = 960; + this.state = 964; this.match(QuixosCapabilityParser.RPAREN); } break; @@ -3587,21 +3599,21 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 964; - this.match(QuixosCapabilityParser.EDGE); - this.state = 965; - this.identifier(); - this.state = 966; - this.match(QuixosCapabilityParser.ID); - this.state = 967; - this.stringLiteral(); this.state = 968; - this.match(QuixosCapabilityParser.LBRACE); + this.match(QuixosCapabilityParser.EDGE); this.state = 969; - this.edgeEndpoint(); + this.identifier(); this.state = 970; - this.edgeEndpoint(); + this.match(QuixosCapabilityParser.ID); this.state = 971; + this.stringLiteral(); + this.state = 972; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 973; + this.edgeEndpoint(); + this.state = 974; + this.edgeEndpoint(); + this.state = 975; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3625,73 +3637,73 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 973; - this.targetConstraint(); - this.state = 974; - this.match(QuixosCapabilityParser.PROJECTION); - this.state = 975; - this.identifier(); - this.state = 976; - this.match(QuixosCapabilityParser.ID); this.state = 977; - this.stringLiteral(); + this.targetConstraint(); this.state = 978; - this.cardinality(); + this.match(QuixosCapabilityParser.PROJECTION); + this.state = 979; + this.identifier(); this.state = 980; + this.match(QuixosCapabilityParser.ID); + this.state = 981; + this.stringLiteral(); + this.state = 982; + this.cardinality(); + this.state = 984; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 112) { { - this.state = 979; + this.state = 983; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 984; + this.state = 988; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 79) { - { - this.state = 982; - this.match(QuixosCapabilityParser.ON_DELETE); - this.state = 983; - this.stringLiteral(); - } - } - - this.state = 987; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 81) { { this.state = 986; - this.match(QuixosCapabilityParser.RETAIN_OTHER); + this.match(QuixosCapabilityParser.ON_DELETE); + this.state = 987; + this.stringLiteral(); } } this.state = 991; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); + if (_la === 81) { + { + this.state = 990; + this.match(QuixosCapabilityParser.RETAIN_OTHER); + } + } + + this.state = 995; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); if (_la === 82) { { - this.state = 989; + this.state = 993; this.match(QuixosCapabilityParser.KEYED); - this.state = 990; + this.state = 994; this.stringLiteral(); } } - this.state = 994; + this.state = 998; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 83) { { - this.state = 993; + this.state = 997; this.match(QuixosCapabilityParser.PUBLIC_TRAVERSAL); } } - this.state = 996; + this.state = 1000; this.match(QuixosCapabilityParser.SEMI); } } @@ -3715,85 +3727,85 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 998; - this.match(QuixosCapabilityParser.CONFORM); - this.state = 1000; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 143) { - { - this.state = 999; - this.typeParameters(); - } - } - this.state = 1002; - this.identifier(); + this.match(QuixosCapabilityParser.CONFORM); this.state = 1004; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { this.state = 1003; - this.conformanceSourceArguments(); + this.typeParameters(); } } this.state = 1006; - this.match(QuixosCapabilityParser.AS); - this.state = 1007; this.identifier(); - this.state = 1009; + this.state = 1008; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 1008; - this.typeArguments(); + this.state = 1007; + this.conformanceSourceArguments(); } } + this.state = 1010; + this.match(QuixosCapabilityParser.AS); + this.state = 1011; + this.identifier(); this.state = 1013; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 84) { + if (_la === 143) { { - this.state = 1011; - this.match(QuixosCapabilityParser.ID); this.state = 1012; - this.stringLiteral(); + this.typeArguments(); } } this.state = 1017; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 78) { + if (_la === 84) { { this.state = 1015; - this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); + this.match(QuixosCapabilityParser.ID); this.state = 1016; + this.stringLiteral(); + } + } + + this.state = 1021; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 78) { + { + this.state = 1019; + this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); + this.state = 1020; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 1019; - this.match(QuixosCapabilityParser.LBRACE); this.state = 1023; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 1027; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 8 || ((((_la - 56)) & ~0x1F) === 0 && ((1 << (_la - 56)) & 4105) !== 0)) { { { - this.state = 1020; + this.state = 1024; this.conformanceItem(); } } - this.state = 1025; + this.state = 1029; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1026; + this.state = 1030; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3816,7 +3828,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1028; + this.state = 1032; this.typeArguments(); } } @@ -3837,50 +3849,50 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ConformanceItemContext(this.context, this.state); this.enterRule(localContext, 112, QuixosCapabilityParser.RULE_conformanceItem); try { - this.state = 1037; + this.state = 1041; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 95, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 96, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1030; + this.state = 1034; this.match(QuixosCapabilityParser.PRIVATE); - this.state = 1031; + this.state = 1035; this.attachmentDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1032; + this.state = 1036; this.operationBindingDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1033; + this.state = 1037; this.stateFieldBindingDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1034; + this.state = 1038; this.initializationDecl(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1035; + this.state = 1039; this.relationshipMaterializationDecl(); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1036; + this.state = 1040; this.moduleBindingDecl(); } break; @@ -3905,19 +3917,19 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1039; - this.match(QuixosCapabilityParser.BIND); - this.state = 1040; - this.identifier(); - this.state = 1041; - this.match(QuixosCapabilityParser.TO); - this.state = 1042; - this.identifier(); this.state = 1043; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.BIND); this.state = 1044; this.identifier(); this.state = 1045; + this.match(QuixosCapabilityParser.TO); + this.state = 1046; + this.identifier(); + this.state = 1047; + this.match(QuixosCapabilityParser.DOT); + this.state = 1048; + this.identifier(); + this.state = 1049; this.match(QuixosCapabilityParser.SEMI); } } @@ -3941,27 +3953,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1047; + this.state = 1051; this.match(QuixosCapabilityParser.INITIALIZE); - this.state = 1048; - this.match(QuixosCapabilityParser.LBRACE); this.state = 1052; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 1056; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { { { - this.state = 1049; + this.state = 1053; this.initializationField(); } } - this.state = 1054; + this.state = 1058; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1055; + this.state = 1059; this.match(QuixosCapabilityParser.RBRACE); - this.state = 1056; + this.state = 1060; this.match(QuixosCapabilityParser.SEMI); } } @@ -3982,40 +3994,40 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new InitializationFieldContext(this.context, this.state); this.enterRule(localContext, 118, QuixosCapabilityParser.RULE_initializationField); try { - this.state = 1072; + this.state = 1076; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 97, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 98, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1058; - this.identifier(); - this.state = 1059; - this.match(QuixosCapabilityParser.TO); - this.state = 1060; - this.match(QuixosCapabilityParser.STATE); - this.state = 1061; - this.identifier(); this.state = 1062; + this.identifier(); + this.state = 1063; + this.match(QuixosCapabilityParser.TO); + this.state = 1064; + this.match(QuixosCapabilityParser.STATE); + this.state = 1065; + this.identifier(); + this.state = 1066; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1064; - this.identifier(); - this.state = 1065; - this.match(QuixosCapabilityParser.TO); - this.state = 1066; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1067; - this.identifier(); this.state = 1068; - this.match(QuixosCapabilityParser.DOT); - this.state = 1069; this.identifier(); + this.state = 1069; + this.match(QuixosCapabilityParser.TO); this.state = 1070; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1071; + this.identifier(); + this.state = 1072; + this.match(QuixosCapabilityParser.DOT); + this.state = 1073; + this.identifier(); + this.state = 1074; this.match(QuixosCapabilityParser.SEMI); } break; @@ -4041,29 +4053,29 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1074; + this.state = 1078; this.interfaceType(); - this.state = 1075; + this.state = 1079; this.match(QuixosCapabilityParser.FROM); - this.state = 1076; + this.state = 1080; this.match(QuixosCapabilityParser.INPUT); - this.state = 1081; + this.state = 1085; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 136) { { { - this.state = 1077; + this.state = 1081; this.match(QuixosCapabilityParser.DOT); - this.state = 1078; + this.state = 1082; this.identifier(); } } - this.state = 1083; + this.state = 1087; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1084; + this.state = 1088; this.match(QuixosCapabilityParser.SEMI); } } @@ -4086,17 +4098,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1086; - this.match(QuixosCapabilityParser.BIND); - this.state = 1087; - this.identifier(); - this.state = 1088; - this.match(QuixosCapabilityParser.TO); - this.state = 1089; - this.match(QuixosCapabilityParser.STATE); this.state = 1090; - this.identifier(); + this.match(QuixosCapabilityParser.BIND); this.state = 1091; + this.identifier(); + this.state = 1092; + this.match(QuixosCapabilityParser.TO); + this.state = 1093; + this.match(QuixosCapabilityParser.STATE); + this.state = 1094; + this.identifier(); + this.state = 1095; this.match(QuixosCapabilityParser.SEMI); } } @@ -4119,31 +4131,31 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1093; - this.match(QuixosCapabilityParser.MATERIALIZE); - this.state = 1094; - this.identifier(); - this.state = 1095; - this.match(QuixosCapabilityParser.IF); - this.state = 1096; - this.match(QuixosCapabilityParser.ABSENT); this.state = 1097; - this.match(QuixosCapabilityParser.USING); + this.match(QuixosCapabilityParser.MATERIALIZE); this.state = 1098; - this.match(QuixosCapabilityParser.CONSTRUCTOR); + this.identifier(); this.state = 1099; - this.identifier(); + this.match(QuixosCapabilityParser.IF); this.state = 1100; - this.match(QuixosCapabilityParser.VIA); + this.match(QuixosCapabilityParser.ABSENT); this.state = 1101; - this.match(QuixosCapabilityParser.EDGE); + this.match(QuixosCapabilityParser.USING); this.state = 1102; - this.identifier(); + this.match(QuixosCapabilityParser.CONSTRUCTOR); this.state = 1103; - this.match(QuixosCapabilityParser.DOT); - this.state = 1104; this.identifier(); + this.state = 1104; + this.match(QuixosCapabilityParser.VIA); this.state = 1105; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1106; + this.identifier(); + this.state = 1107; + this.match(QuixosCapabilityParser.DOT); + this.state = 1108; + this.identifier(); + this.state = 1109; this.match(QuixosCapabilityParser.SEMI); } } @@ -4167,27 +4179,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1107; + this.state = 1111; this.match(QuixosCapabilityParser.BIND); - this.state = 1108; + this.state = 1112; this.memberOperationRef(); - this.state = 1109; - this.match(QuixosCapabilityParser.TO); - this.state = 1110; - this.operationProvider(); this.state = 1113; + this.match(QuixosCapabilityParser.TO); + this.state = 1114; + this.operationProvider(); + this.state = 1117; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 34) { { - this.state = 1111; + this.state = 1115; this.match(QuixosCapabilityParser.QUERY_REASON); - this.state = 1112; + this.state = 1116; this.stringLiteral(); } } - this.state = 1115; + this.state = 1119; this.match(QuixosCapabilityParser.SEMI); } } @@ -4210,11 +4222,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1117; + this.state = 1121; this.identifier(); - this.state = 1118; + this.state = 1122; this.match(QuixosCapabilityParser.DOT); - this.state = 1119; + this.state = 1123; this.operationName(); } } @@ -4235,90 +4247,90 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new OperationNameContext(this.context, this.state); this.enterRule(localContext, 130, QuixosCapabilityParser.RULE_operationName); try { - this.state = 1133; + this.state = 1137; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 100, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 101, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1121; + this.state = 1125; this.identifier(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1122; + this.state = 1126; this.match(QuixosCapabilityParser.CALL); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1123; + this.state = 1127; this.match(QuixosCapabilityParser.GET); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1124; + this.state = 1128; this.match(QuixosCapabilityParser.SET); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1125; + this.state = 1129; this.match(QuixosCapabilityParser.EDIT); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1126; + this.state = 1130; this.match(QuixosCapabilityParser.RESOLVE); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 1127; + this.state = 1131; this.match(QuixosCapabilityParser.CONNECT); } break; case 8: this.enterOuterAlt(localContext, 8); { - this.state = 1128; + this.state = 1132; this.match(QuixosCapabilityParser.DISCONNECT); } break; case 9: this.enterOuterAlt(localContext, 9); { - this.state = 1129; + this.state = 1133; this.match(QuixosCapabilityParser.WATCH_START); } break; case 10: this.enterOuterAlt(localContext, 10); { - this.state = 1130; + this.state = 1134; this.match(QuixosCapabilityParser.WATCH_STOP); } break; case 11: this.enterOuterAlt(localContext, 11); { - this.state = 1131; + this.state = 1135; this.match(QuixosCapabilityParser.SUBSCRIBE); } break; case 12: this.enterOuterAlt(localContext, 12); { - this.state = 1132; + this.state = 1136; this.match(QuixosCapabilityParser.UNSUBSCRIBE); } break; @@ -4342,110 +4354,110 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 132, QuixosCapabilityParser.RULE_operationProvider); let _la: number; try { - this.state = 1171; + this.state = 1175; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.LIFECYCLE: this.enterOuterAlt(localContext, 1); { - this.state = 1135; + this.state = 1139; this.match(QuixosCapabilityParser.LIFECYCLE); - this.state = 1136; + this.state = 1140; this.match(QuixosCapabilityParser.DOT); - this.state = 1137; + this.state = 1141; this.identifier(); } break; case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 2); { - this.state = 1138; + this.state = 1142; this.match(QuixosCapabilityParser.STATE); - this.state = 1139; + this.state = 1143; this.identifier(); - this.state = 1140; + this.state = 1144; this.match(QuixosCapabilityParser.DOT); - this.state = 1141; + this.state = 1145; this.statePrimitive(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 3); { - this.state = 1143; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1144; - this.identifier(); - this.state = 1145; - this.match(QuixosCapabilityParser.DOT); - this.state = 1146; - this.identifier(); this.state = 1147; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.EDGE); this.state = 1148; + this.identifier(); + this.state = 1149; + this.match(QuixosCapabilityParser.DOT); + this.state = 1150; + this.identifier(); + this.state = 1151; + this.match(QuixosCapabilityParser.DOT); + this.state = 1152; this.edgePrimitive(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 4); { - this.state = 1150; + this.state = 1154; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 1151; + this.state = 1155; this.identifier(); - this.state = 1153; + this.state = 1157; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 1152; + this.state = 1156; this.typeArguments(); } } - this.state = 1155; + this.state = 1159; this.match(QuixosCapabilityParser.DOT); - this.state = 1156; + this.state = 1160; this.memberOperationRef(); } break; case QuixosCapabilityParser.PACKAGE: this.enterOuterAlt(localContext, 5); { - this.state = 1158; + this.state = 1162; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 1159; - this.identifier(); - this.state = 1160; - this.match(QuixosCapabilityParser.DOT); - this.state = 1161; - this.identifier(); this.state = 1163; + this.identifier(); + this.state = 1164; + this.match(QuixosCapabilityParser.DOT); + this.state = 1165; + this.identifier(); + this.state = 1167; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 1162; + this.state = 1166; this.typeArguments(); } } - this.state = 1166; + this.state = 1170; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 64) { { - this.state = 1165; + this.state = 1169; this.dependencyBindingBlock(); } } - this.state = 1169; + this.state = 1173; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 66) { { - this.state = 1168; + this.state = 1172; this.acceptanceBinding(); } } @@ -4475,9 +4487,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1173; + this.state = 1177; this.match(QuixosCapabilityParser.ACCEPT); - this.state = 1174; + this.state = 1178; this.dependencyBindingBlock(); } } @@ -4501,7 +4513,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1176; + this.state = 1180; _la = this.tokenStream.LA(1); if(!(_la === 1 || ((((_la - 96)) & ~0x1F) === 0 && ((1 << (_la - 96)) & 195) !== 0))) { this.errorHandler.recoverInline(this); @@ -4532,7 +4544,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1178; + this.state = 1182; _la = this.tokenStream.LA(1); if(!(((((_la - 98)) & ~0x1F) === 0 && ((1 << (_la - 98)) & 55) !== 0))) { this.errorHandler.recoverInline(this); @@ -4563,25 +4575,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1180; + this.state = 1184; this.match(QuixosCapabilityParser.WITH); - this.state = 1181; - this.match(QuixosCapabilityParser.LBRACE); this.state = 1185; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 1189; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { { { - this.state = 1182; + this.state = 1186; this.dependencyBinding(); } } - this.state = 1187; + this.state = 1191; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1188; + this.state = 1192; this.match(QuixosCapabilityParser.RBRACE); } } @@ -4603,136 +4615,136 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 142, QuixosCapabilityParser.RULE_dependencyBinding); let _la: number; try { - this.state = 1288; + this.state = 1292; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 114, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 115, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1190; - this.identifier(); - this.state = 1191; - this.match(QuixosCapabilityParser.TO); - this.state = 1192; - this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 1193; - this.match(QuixosCapabilityParser.REFLECTION); this.state = 1194; - this.match(QuixosCapabilityParser.LBRACK); + this.identifier(); this.state = 1195; - this.identifierList(); + this.match(QuixosCapabilityParser.TO); this.state = 1196; - this.match(QuixosCapabilityParser.RBRACK); + this.match(QuixosCapabilityParser.WORKSPACE); this.state = 1197; + this.match(QuixosCapabilityParser.REFLECTION); + this.state = 1198; + this.match(QuixosCapabilityParser.LBRACK); + this.state = 1199; + this.identifierList(); + this.state = 1200; + this.match(QuixosCapabilityParser.RBRACK); + this.state = 1201; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1199; + this.state = 1203; this.identifier(); - this.state = 1200; + this.state = 1204; this.match(QuixosCapabilityParser.TO); - this.state = 1201; + this.state = 1205; this.match(QuixosCapabilityParser.STATE); - this.state = 1202; + this.state = 1206; this.identifier(); - this.state = 1209; + this.state = 1213; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 67) { { - this.state = 1203; - this.match(QuixosCapabilityParser.VIA); - this.state = 1204; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1205; - this.identifier(); - this.state = 1206; - this.match(QuixosCapabilityParser.DOT); this.state = 1207; + this.match(QuixosCapabilityParser.VIA); + this.state = 1208; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1209; + this.identifier(); + this.state = 1210; + this.match(QuixosCapabilityParser.DOT); + this.state = 1211; this.identifier(); } } - this.state = 1211; + this.state = 1215; this.match(QuixosCapabilityParser.SEMI); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1213; - this.identifier(); - this.state = 1214; - this.match(QuixosCapabilityParser.TO); - this.state = 1215; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1216; - this.identifier(); this.state = 1217; - this.match(QuixosCapabilityParser.DOT); - this.state = 1218; this.identifier(); - this.state = 1225; + this.state = 1218; + this.match(QuixosCapabilityParser.TO); + this.state = 1219; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1220; + this.identifier(); + this.state = 1221; + this.match(QuixosCapabilityParser.DOT); + this.state = 1222; + this.identifier(); + this.state = 1229; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 67) { { - this.state = 1219; - this.match(QuixosCapabilityParser.VIA); - this.state = 1220; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1221; - this.identifier(); - this.state = 1222; - this.match(QuixosCapabilityParser.DOT); this.state = 1223; + this.match(QuixosCapabilityParser.VIA); + this.state = 1224; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1225; + this.identifier(); + this.state = 1226; + this.match(QuixosCapabilityParser.DOT); + this.state = 1227; this.identifier(); } } - this.state = 1227; + this.state = 1231; this.match(QuixosCapabilityParser.SEMI); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1229; - this.identifier(); - this.state = 1230; - this.match(QuixosCapabilityParser.TO); - this.state = 1231; - this.match(QuixosCapabilityParser.INTERFACE); - this.state = 1232; + this.state = 1233; this.identifier(); this.state = 1234; + this.match(QuixosCapabilityParser.TO); + this.state = 1235; + this.match(QuixosCapabilityParser.INTERFACE); + this.state = 1236; + this.identifier(); + this.state = 1238; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 1233; + this.state = 1237; this.typeArguments(); } } - this.state = 1244; + this.state = 1248; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.VIA: { { - this.state = 1236; - this.match(QuixosCapabilityParser.VIA); - this.state = 1237; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1238; - this.identifier(); - this.state = 1239; - this.match(QuixosCapabilityParser.DOT); this.state = 1240; + this.match(QuixosCapabilityParser.VIA); + this.state = 1241; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1242; + this.identifier(); + this.state = 1243; + this.match(QuixosCapabilityParser.DOT); + this.state = 1244; this.identifier(); } } @@ -4740,9 +4752,9 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.FROM: { { - this.state = 1242; + this.state = 1246; this.match(QuixosCapabilityParser.FROM); - this.state = 1243; + this.state = 1247; this.match(QuixosCapabilityParser.INPUT); } } @@ -4752,104 +4764,104 @@ export class QuixosCapabilityParser extends antlr.Parser { default: break; } - this.state = 1246; + this.state = 1250; this.match(QuixosCapabilityParser.SEMI); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1248; - this.identifier(); - this.state = 1249; - this.match(QuixosCapabilityParser.TO); - this.state = 1250; - this.match(QuixosCapabilityParser.CREATION); - this.state = 1251; - this.identifier(); this.state = 1252; - this.match(QuixosCapabilityParser.WITH); + this.identifier(); this.state = 1253; - this.match(QuixosCapabilityParser.LBRACE); + this.match(QuixosCapabilityParser.TO); + this.state = 1254; + this.match(QuixosCapabilityParser.CREATION); + this.state = 1255; + this.identifier(); + this.state = 1256; + this.match(QuixosCapabilityParser.WITH); this.state = 1257; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 1261; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { { { - this.state = 1254; + this.state = 1258; this.creationOwnerMapping(); } } - this.state = 1259; + this.state = 1263; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1260; + this.state = 1264; this.match(QuixosCapabilityParser.RBRACE); - this.state = 1261; + this.state = 1265; this.match(QuixosCapabilityParser.SEMI); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1263; - this.identifier(); - this.state = 1264; - this.match(QuixosCapabilityParser.TO); - this.state = 1265; - this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1266; - this.identifier(); this.state = 1267; + this.identifier(); + this.state = 1268; + this.match(QuixosCapabilityParser.TO); + this.state = 1269; + this.match(QuixosCapabilityParser.CONSTRUCTOR); + this.state = 1270; + this.identifier(); + this.state = 1271; this.match(QuixosCapabilityParser.SEMI); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 1269; + this.state = 1273; this.identifier(); - this.state = 1270; + this.state = 1274; this.match(QuixosCapabilityParser.TO); - this.state = 1272; + this.state = 1276; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 9) { { - this.state = 1271; + this.state = 1275; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 1274; + this.state = 1278; this.match(QuixosCapabilityParser.QUERY); - this.state = 1275; + this.state = 1279; this.identifier(); - this.state = 1276; + this.state = 1280; this.match(QuixosCapabilityParser.DOT); - this.state = 1277; + this.state = 1281; this.identifier(); - this.state = 1284; + this.state = 1288; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 67) { { - this.state = 1278; - this.match(QuixosCapabilityParser.VIA); - this.state = 1279; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1280; - this.identifier(); - this.state = 1281; - this.match(QuixosCapabilityParser.DOT); this.state = 1282; + this.match(QuixosCapabilityParser.VIA); + this.state = 1283; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1284; + this.identifier(); + this.state = 1285; + this.match(QuixosCapabilityParser.DOT); + this.state = 1286; this.identifier(); } } - this.state = 1286; + this.state = 1290; this.match(QuixosCapabilityParser.SEMI); } break; @@ -4875,29 +4887,29 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1290; - this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1291; - this.identifier(); - this.state = 1292; - this.match(QuixosCapabilityParser.TO); - this.state = 1293; - this.identifier(); this.state = 1294; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.CONSTRUCTOR); this.state = 1295; this.identifier(); + this.state = 1296; + this.match(QuixosCapabilityParser.TO); this.state = 1297; + this.identifier(); + this.state = 1298; + this.match(QuixosCapabilityParser.DOT); + this.state = 1299; + this.identifier(); + this.state = 1301; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 64) { { - this.state = 1296; + this.state = 1300; this.dependencyBindingBlock(); } } - this.state = 1299; + this.state = 1303; this.match(QuixosCapabilityParser.SEMI); } } @@ -4919,7 +4931,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 146, QuixosCapabilityParser.RULE_valueType); let _la: number; try { - this.state = 1347; + this.state = 1351; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.BOOL: @@ -4932,130 +4944,130 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.UINT64: this.enterOuterAlt(localContext, 1); { - this.state = 1301; + this.state = 1305; this.scalarType(); } break; case QuixosCapabilityParser.UNIT: this.enterOuterAlt(localContext, 2); { - this.state = 1302; + this.state = 1306; this.match(QuixosCapabilityParser.UNIT); } break; case QuixosCapabilityParser.WATCH_HANDLE: this.enterOuterAlt(localContext, 3); { - this.state = 1303; + this.state = 1307; this.match(QuixosCapabilityParser.WATCH_HANDLE); } break; case QuixosCapabilityParser.MESSAGE: this.enterOuterAlt(localContext, 4); { - this.state = 1304; + this.state = 1308; this.match(QuixosCapabilityParser.MESSAGE); - this.state = 1305; + this.state = 1309; this.stringLiteral(); } break; case QuixosCapabilityParser.ATOM_REF: this.enterOuterAlt(localContext, 5); { - this.state = 1306; + this.state = 1310; this.match(QuixosCapabilityParser.ATOM_REF); - this.state = 1307; + this.state = 1311; this.match(QuixosCapabilityParser.LT); - this.state = 1308; + this.state = 1312; this.identifier(); - this.state = 1309; + this.state = 1313; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.INTERFACE_REF: this.enterOuterAlt(localContext, 6); { - this.state = 1311; - this.match(QuixosCapabilityParser.INTERFACE_REF); - this.state = 1312; - this.match(QuixosCapabilityParser.LT); - this.state = 1313; - this.identifier(); this.state = 1315; + this.match(QuixosCapabilityParser.INTERFACE_REF); + this.state = 1316; + this.match(QuixosCapabilityParser.LT); + this.state = 1317; + this.identifier(); + this.state = 1319; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 1314; + this.state = 1318; this.typeArguments(); } } - this.state = 1317; + this.state = 1321; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.REF: this.enterOuterAlt(localContext, 7); { - this.state = 1319; + this.state = 1323; this.match(QuixosCapabilityParser.REF); - this.state = 1320; + this.state = 1324; this.match(QuixosCapabilityParser.LT); - this.state = 1321; + this.state = 1325; this.identifier(); - this.state = 1322; + this.state = 1326; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.OPTIONAL: this.enterOuterAlt(localContext, 8); { - this.state = 1324; + this.state = 1328; this.match(QuixosCapabilityParser.OPTIONAL); - this.state = 1325; + this.state = 1329; this.match(QuixosCapabilityParser.LT); - this.state = 1326; + this.state = 1330; this.valueType(); - this.state = 1327; + this.state = 1331; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.LIST: this.enterOuterAlt(localContext, 9); { - this.state = 1329; + this.state = 1333; this.match(QuixosCapabilityParser.LIST); - this.state = 1330; + this.state = 1334; this.match(QuixosCapabilityParser.LT); - this.state = 1331; + this.state = 1335; this.valueType(); - this.state = 1332; + this.state = 1336; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.RECORD: this.enterOuterAlt(localContext, 10); { - this.state = 1334; + this.state = 1338; this.match(QuixosCapabilityParser.RECORD); - this.state = 1335; - this.match(QuixosCapabilityParser.LBRACE); this.state = 1339; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 1343; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { { { - this.state = 1336; + this.state = 1340; this.recordField(); } } - this.state = 1341; + this.state = 1345; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1342; + this.state = 1346; this.match(QuixosCapabilityParser.RBRACE); } break; @@ -5098,14 +5110,14 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 11); { - this.state = 1343; + this.state = 1347; this.identifier(); - this.state = 1345; + this.state = 1349; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 143) { { - this.state = 1344; + this.state = 1348; this.typeArguments(); } } @@ -5135,13 +5147,13 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1349; + this.state = 1353; this.identifier(); - this.state = 1350; + this.state = 1354; this.match(QuixosCapabilityParser.COLON); - this.state = 1351; + this.state = 1355; this.valueType(); - this.state = 1352; + this.state = 1356; this.match(QuixosCapabilityParser.SEMI); } } @@ -5165,7 +5177,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1354; + this.state = 1358; _la = this.tokenStream.LA(1); if(!(((((_la - 121)) & ~0x1F) === 0 && ((1 << (_la - 121)) & 255) !== 0))) { this.errorHandler.recoverInline(this); @@ -5196,7 +5208,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1356; + this.state = 1360; _la = this.tokenStream.LA(1); if(!(((((_la - 108)) & ~0x1F) === 0 && ((1 << (_la - 108)) & 15) !== 0))) { this.errorHandler.recoverInline(this); @@ -5224,62 +5236,62 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new JsonLiteralContext(this.context, this.state); this.enterRule(localContext, 154, QuixosCapabilityParser.RULE_jsonLiteral); try { - this.state = 1366; + this.state = 1370; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STRING_LITERAL: this.enterOuterAlt(localContext, 1); { - this.state = 1358; + this.state = 1362; this.stringLiteral(); } break; case QuixosCapabilityParser.INTEGER: this.enterOuterAlt(localContext, 2); { - this.state = 1359; + this.state = 1363; this.match(QuixosCapabilityParser.INTEGER); } break; case QuixosCapabilityParser.JSON_NUMBER: this.enterOuterAlt(localContext, 3); { - this.state = 1360; + this.state = 1364; this.match(QuixosCapabilityParser.JSON_NUMBER); } break; case QuixosCapabilityParser.TRUE: this.enterOuterAlt(localContext, 4); { - this.state = 1361; + this.state = 1365; this.match(QuixosCapabilityParser.TRUE); } break; case QuixosCapabilityParser.FALSE: this.enterOuterAlt(localContext, 5); { - this.state = 1362; + this.state = 1366; this.match(QuixosCapabilityParser.FALSE); } break; case QuixosCapabilityParser.NULL: this.enterOuterAlt(localContext, 6); { - this.state = 1363; + this.state = 1367; this.match(QuixosCapabilityParser.NULL); } break; case QuixosCapabilityParser.LBRACE: this.enterOuterAlt(localContext, 7); { - this.state = 1364; + this.state = 1368; this.jsonObject(); } break; case QuixosCapabilityParser.LBRACK: this.enterOuterAlt(localContext, 8); { - this.state = 1365; + this.state = 1369; this.jsonArray(); } break; @@ -5307,35 +5319,35 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1368; + this.state = 1372; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1377; + this.state = 1381; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 150) { { - this.state = 1369; + this.state = 1373; this.jsonMember(); - this.state = 1374; + this.state = 1378; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 1370; + this.state = 1374; this.match(QuixosCapabilityParser.COMMA); - this.state = 1371; + this.state = 1375; this.jsonMember(); } } - this.state = 1376; + this.state = 1380; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1379; + this.state = 1383; this.match(QuixosCapabilityParser.RBRACE); } } @@ -5358,11 +5370,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1381; + this.state = 1385; this.stringLiteral(); - this.state = 1382; + this.state = 1386; this.match(QuixosCapabilityParser.COLON); - this.state = 1383; + this.state = 1387; this.jsonLiteral(); } } @@ -5386,35 +5398,35 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1385; + this.state = 1389; this.match(QuixosCapabilityParser.LBRACK); - this.state = 1394; + this.state = 1398; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (((((_la - 129)) & ~0x1F) === 0 && ((1 << (_la - 129)) & 2884871) !== 0)) { { - this.state = 1386; + this.state = 1390; this.jsonLiteral(); - this.state = 1391; + this.state = 1395; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 135) { { { - this.state = 1387; + this.state = 1391; this.match(QuixosCapabilityParser.COMMA); - this.state = 1388; + this.state = 1392; this.jsonLiteral(); } } - this.state = 1393; + this.state = 1397; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1396; + this.state = 1400; this.match(QuixosCapabilityParser.RBRACK); } } @@ -5438,7 +5450,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1398; + this.state = 1402; _la = this.tokenStream.LA(1); if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149)) { this.errorHandler.recoverInline(this); @@ -5468,7 +5480,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1400; + this.state = 1404; this.match(QuixosCapabilityParser.STRING_LITERAL); } } @@ -5487,7 +5499,7 @@ export class QuixosCapabilityParser extends antlr.Parser { } public static readonly _serializedATN: number[] = [ - 4,1,153,1403,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,153,1407,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, @@ -5558,224 +5570,224 @@ export class QuixosCapabilityParser extends antlr.Parser { 1,43,1,43,5,43,826,8,43,10,43,12,43,829,9,43,1,44,1,44,1,44,5,44, 834,8,44,10,44,12,44,837,9,44,1,44,1,44,1,45,1,45,1,45,1,45,1,45, 1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45, - 1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45, - 1,45,1,45,1,45,1,45,3,45,876,8,45,1,45,3,45,879,8,45,1,45,1,45,3, - 45,883,8,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1, - 45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,3,45,905,8,45,1, - 45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,3,45,919, - 8,45,1,46,1,46,1,46,1,46,5,46,925,8,46,10,46,12,46,928,9,46,1,46, - 1,46,1,47,1,47,1,48,1,48,1,48,1,49,1,49,3,49,939,8,49,1,50,1,50, - 1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,3,50,953,8,50, - 1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,51,3,51,963,8,51,1,52,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,53, - 1,53,3,53,981,8,53,1,53,1,53,3,53,985,8,53,1,53,3,53,988,8,53,1, - 53,1,53,3,53,992,8,53,1,53,3,53,995,8,53,1,53,1,53,1,54,1,54,3,54, - 1001,8,54,1,54,1,54,3,54,1005,8,54,1,54,1,54,1,54,3,54,1010,8,54, - 1,54,1,54,3,54,1014,8,54,1,54,1,54,3,54,1018,8,54,1,54,1,54,5,54, - 1022,8,54,10,54,12,54,1025,9,54,1,54,1,54,1,55,1,55,1,56,1,56,1, - 56,1,56,1,56,1,56,1,56,3,56,1038,8,56,1,57,1,57,1,57,1,57,1,57,1, - 57,1,57,1,57,1,58,1,58,1,58,5,58,1051,8,58,10,58,12,58,1054,9,58, - 1,58,1,58,1,58,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,1073,8,59,1,60,1,60,1,60,1,60,1,60,5,60, - 1080,8,60,10,60,12,60,1083,9,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,62,1,62,1,62,1,62,1,62,1,62,1,62,1, - 62,1,62,1,62,1,62,1,63,1,63,1,63,1,63,1,63,1,63,3,63,1114,8,63,1, - 63,1,63,1,64,1,64,1,64,1,64,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1, - 65,1,65,1,65,1,65,1,65,3,65,1134,8,65,1,66,1,66,1,66,1,66,1,66,1, - 66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,3, - 66,1154,8,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,3,66,1164,8, - 66,1,66,3,66,1167,8,66,1,66,3,66,1170,8,66,3,66,1172,8,66,1,67,1, - 67,1,67,1,68,1,68,1,69,1,69,1,70,1,70,1,70,5,70,1184,8,70,10,70, - 12,70,1187,9,70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71, - 1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,3,71,1210, - 8,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71, - 1,71,1,71,3,71,1226,8,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,3,71, - 1235,8,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,3,71,1245,8,71, - 1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,5,71,1256,8,71,10,71, - 12,71,1259,9,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71, - 1,71,1,71,3,71,1273,8,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71, - 1,71,1,71,3,71,1285,8,71,1,71,1,71,3,71,1289,8,71,1,72,1,72,1,72, - 1,72,1,72,1,72,1,72,3,72,1298,8,72,1,72,1,72,1,73,1,73,1,73,1,73, - 1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,3,73,1316,8,73, - 1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73, - 1,73,1,73,1,73,1,73,1,73,1,73,1,73,5,73,1338,8,73,10,73,12,73,1341, - 9,73,1,73,1,73,1,73,3,73,1346,8,73,3,73,1348,8,73,1,74,1,74,1,74, - 1,74,1,74,1,75,1,75,1,76,1,76,1,77,1,77,1,77,1,77,1,77,1,77,1,77, - 1,77,3,77,1367,8,77,1,78,1,78,1,78,1,78,5,78,1373,8,78,10,78,12, - 78,1376,9,78,3,78,1378,8,78,1,78,1,78,1,79,1,79,1,79,1,79,1,80,1, - 80,1,80,1,80,5,80,1390,8,80,10,80,12,80,1393,9,80,3,80,1395,8,80, - 1,80,1,80,1,81,1,81,1,82,1,82,1,82,0,0,83,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,0,9, - 2,0,15,15,33,33,1,0,11,12,1,0,101,105,3,0,1,1,96,100,102,103,3,0, - 1,1,96,97,102,103,2,0,98,100,102,103,1,0,121,128,1,0,108,111,9,0, - 1,1,4,8,10,33,40,40,45,45,74,74,94,95,106,106,149,149,1519,0,178, - 1,0,0,0,2,180,1,0,0,0,4,190,1,0,0,0,6,194,1,0,0,0,8,219,1,0,0,0, - 10,231,1,0,0,0,12,233,1,0,0,0,14,240,1,0,0,0,16,251,1,0,0,0,18,253, - 1,0,0,0,20,266,1,0,0,0,22,298,1,0,0,0,24,328,1,0,0,0,26,330,1,0, - 0,0,28,334,1,0,0,0,30,352,1,0,0,0,32,354,1,0,0,0,34,367,1,0,0,0, - 36,369,1,0,0,0,38,382,1,0,0,0,40,403,1,0,0,0,42,453,1,0,0,0,44,456, - 1,0,0,0,46,481,1,0,0,0,48,518,1,0,0,0,50,529,1,0,0,0,52,534,1,0, - 0,0,54,562,1,0,0,0,56,564,1,0,0,0,58,574,1,0,0,0,60,586,1,0,0,0, - 62,633,1,0,0,0,64,699,1,0,0,0,66,701,1,0,0,0,68,706,1,0,0,0,70,735, - 1,0,0,0,72,757,1,0,0,0,74,770,1,0,0,0,76,772,1,0,0,0,78,784,1,0, - 0,0,80,797,1,0,0,0,82,800,1,0,0,0,84,820,1,0,0,0,86,822,1,0,0,0, - 88,830,1,0,0,0,90,918,1,0,0,0,92,920,1,0,0,0,94,931,1,0,0,0,96,933, - 1,0,0,0,98,938,1,0,0,0,100,940,1,0,0,0,102,962,1,0,0,0,104,964,1, - 0,0,0,106,973,1,0,0,0,108,998,1,0,0,0,110,1028,1,0,0,0,112,1037, - 1,0,0,0,114,1039,1,0,0,0,116,1047,1,0,0,0,118,1072,1,0,0,0,120,1074, - 1,0,0,0,122,1086,1,0,0,0,124,1093,1,0,0,0,126,1107,1,0,0,0,128,1117, - 1,0,0,0,130,1133,1,0,0,0,132,1171,1,0,0,0,134,1173,1,0,0,0,136,1176, - 1,0,0,0,138,1178,1,0,0,0,140,1180,1,0,0,0,142,1288,1,0,0,0,144,1290, - 1,0,0,0,146,1347,1,0,0,0,148,1349,1,0,0,0,150,1354,1,0,0,0,152,1356, - 1,0,0,0,154,1366,1,0,0,0,156,1368,1,0,0,0,158,1381,1,0,0,0,160,1385, - 1,0,0,0,162,1398,1,0,0,0,164,1400,1,0,0,0,166,167,3,6,3,0,167,168, - 5,0,0,1,168,179,1,0,0,0,169,170,3,20,10,0,170,171,5,0,0,1,171,179, - 1,0,0,0,172,173,3,52,26,0,173,174,5,0,0,1,174,179,1,0,0,0,175,176, - 3,2,1,0,176,177,5,0,0,1,177,179,1,0,0,0,178,166,1,0,0,0,178,169, - 1,0,0,0,178,172,1,0,0,0,178,175,1,0,0,0,179,1,1,0,0,0,180,181,5, - 40,0,0,181,185,5,137,0,0,182,184,3,8,4,0,183,182,1,0,0,0,184,187, - 1,0,0,0,185,183,1,0,0,0,185,186,1,0,0,0,186,188,1,0,0,0,187,185, - 1,0,0,0,188,189,5,138,0,0,189,3,1,0,0,0,190,191,5,41,0,0,191,192, - 3,164,82,0,192,193,5,134,0,0,193,5,1,0,0,0,194,195,5,9,0,0,195,196, - 3,162,81,0,196,197,5,84,0,0,197,198,3,164,82,0,198,199,5,77,0,0, - 199,200,3,164,82,0,200,201,5,76,0,0,201,202,3,164,82,0,202,206,5, - 137,0,0,203,205,3,8,4,0,204,203,1,0,0,0,205,208,1,0,0,0,206,204, - 1,0,0,0,206,207,1,0,0,0,207,209,1,0,0,0,208,206,1,0,0,0,209,210, - 5,138,0,0,210,7,1,0,0,0,211,220,3,4,2,0,212,220,3,18,9,0,213,220, - 3,10,5,0,214,220,3,96,48,0,215,220,3,108,54,0,216,220,3,144,72,0, - 217,220,3,58,29,0,218,220,3,32,16,0,219,211,1,0,0,0,219,212,1,0, - 0,0,219,213,1,0,0,0,219,214,1,0,0,0,219,215,1,0,0,0,219,216,1,0, - 0,0,219,217,1,0,0,0,219,218,1,0,0,0,220,9,1,0,0,0,221,222,5,41,0, - 0,222,223,5,44,0,0,223,224,3,162,81,0,224,225,5,134,0,0,225,232, - 1,0,0,0,226,227,5,41,0,0,227,228,5,46,0,0,228,229,3,162,81,0,229, - 230,5,134,0,0,230,232,1,0,0,0,231,221,1,0,0,0,231,226,1,0,0,0,232, - 11,1,0,0,0,233,234,5,42,0,0,234,235,5,43,0,0,235,236,3,162,81,0, - 236,237,5,84,0,0,237,238,3,164,82,0,238,239,5,134,0,0,239,13,1,0, - 0,0,240,241,5,42,0,0,241,242,5,44,0,0,242,243,3,162,81,0,243,244, - 5,77,0,0,244,245,3,164,82,0,245,246,5,134,0,0,246,15,1,0,0,0,247, - 252,3,10,5,0,248,252,3,12,6,0,249,252,3,14,7,0,250,252,3,32,16,0, - 251,247,1,0,0,0,251,248,1,0,0,0,251,249,1,0,0,0,251,250,1,0,0,0, - 252,17,1,0,0,0,253,254,5,43,0,0,254,255,3,162,81,0,255,256,5,84, - 0,0,256,259,3,164,82,0,257,258,5,85,0,0,258,260,3,164,82,0,259,257, - 1,0,0,0,259,260,1,0,0,0,260,261,1,0,0,0,261,262,5,134,0,0,262,19, - 1,0,0,0,263,265,3,16,8,0,264,263,1,0,0,0,265,268,1,0,0,0,266,264, - 1,0,0,0,266,267,1,0,0,0,267,269,1,0,0,0,268,266,1,0,0,0,269,270, - 5,44,0,0,270,272,3,162,81,0,271,273,3,22,11,0,272,271,1,0,0,0,272, - 273,1,0,0,0,273,274,1,0,0,0,274,275,5,84,0,0,275,276,3,164,82,0, - 276,277,5,77,0,0,277,287,3,164,82,0,278,279,5,89,0,0,279,284,3,26, - 13,0,280,281,5,135,0,0,281,283,3,26,13,0,282,280,1,0,0,0,283,286, - 1,0,0,0,284,282,1,0,0,0,284,285,1,0,0,0,285,288,1,0,0,0,286,284, - 1,0,0,0,287,278,1,0,0,0,287,288,1,0,0,0,288,289,1,0,0,0,289,293, - 5,137,0,0,290,292,3,34,17,0,291,290,1,0,0,0,292,295,1,0,0,0,293, - 291,1,0,0,0,293,294,1,0,0,0,294,296,1,0,0,0,295,293,1,0,0,0,296, - 297,5,138,0,0,297,21,1,0,0,0,298,299,5,143,0,0,299,304,3,24,12,0, - 300,301,5,135,0,0,301,303,3,24,12,0,302,300,1,0,0,0,303,306,1,0, - 0,0,304,302,1,0,0,0,304,305,1,0,0,0,305,307,1,0,0,0,306,304,1,0, - 0,0,307,308,5,144,0,0,308,23,1,0,0,0,309,310,5,47,0,0,310,313,3, - 162,81,0,311,312,5,133,0,0,312,314,5,37,0,0,313,311,1,0,0,0,313, - 314,1,0,0,0,314,329,1,0,0,0,315,316,5,36,0,0,316,326,3,162,81,0, - 317,318,5,38,0,0,318,323,3,26,13,0,319,320,5,145,0,0,320,322,3,26, - 13,0,321,319,1,0,0,0,322,325,1,0,0,0,323,321,1,0,0,0,323,324,1,0, - 0,0,324,327,1,0,0,0,325,323,1,0,0,0,326,317,1,0,0,0,326,327,1,0, - 0,0,327,329,1,0,0,0,328,309,1,0,0,0,328,315,1,0,0,0,329,25,1,0,0, - 0,330,332,3,162,81,0,331,333,3,28,14,0,332,331,1,0,0,0,332,333,1, - 0,0,0,333,27,1,0,0,0,334,335,5,143,0,0,335,340,3,30,15,0,336,337, - 5,135,0,0,337,339,3,30,15,0,338,336,1,0,0,0,339,342,1,0,0,0,340, - 338,1,0,0,0,340,341,1,0,0,0,341,343,1,0,0,0,342,340,1,0,0,0,343, - 344,5,144,0,0,344,29,1,0,0,0,345,346,5,43,0,0,346,353,3,162,81,0, - 347,348,5,44,0,0,348,353,3,26,13,0,349,350,5,36,0,0,350,353,3,162, - 81,0,351,353,3,146,73,0,352,345,1,0,0,0,352,347,1,0,0,0,352,349, - 1,0,0,0,352,351,1,0,0,0,353,31,1,0,0,0,354,355,5,35,0,0,355,357, - 3,162,81,0,356,358,3,22,11,0,357,356,1,0,0,0,357,358,1,0,0,0,358, - 359,1,0,0,0,359,360,5,146,0,0,360,361,3,146,73,0,361,362,5,134,0, - 0,362,33,1,0,0,0,363,368,3,40,20,0,364,368,3,44,22,0,365,368,3,38, - 19,0,366,368,3,36,18,0,367,363,1,0,0,0,367,364,1,0,0,0,367,365,1, - 0,0,0,367,366,1,0,0,0,368,35,1,0,0,0,369,370,5,2,0,0,370,371,3,162, - 81,0,371,372,5,84,0,0,372,373,3,164,82,0,373,374,5,3,0,0,374,377, - 3,164,82,0,375,376,5,5,0,0,376,378,3,50,25,0,377,375,1,0,0,0,377, - 378,1,0,0,0,378,379,1,0,0,0,379,380,5,134,0,0,380,37,1,0,0,0,381, - 383,5,57,0,0,382,381,1,0,0,0,382,383,1,0,0,0,383,384,1,0,0,0,384, - 385,5,49,0,0,385,386,3,162,81,0,386,387,5,84,0,0,387,388,3,164,82, - 0,388,389,5,133,0,0,389,390,3,146,73,0,390,391,5,132,0,0,391,392, - 3,146,73,0,392,393,5,137,0,0,393,394,5,101,0,0,394,395,5,84,0,0, - 395,397,3,164,82,0,396,398,3,74,37,0,397,396,1,0,0,0,397,398,1,0, - 0,0,398,399,1,0,0,0,399,400,5,134,0,0,400,401,5,138,0,0,401,39,1, - 0,0,0,402,404,3,46,23,0,403,402,1,0,0,0,403,404,1,0,0,0,404,405, - 1,0,0,0,405,406,5,47,0,0,406,407,3,162,81,0,407,408,5,84,0,0,408, - 409,3,164,82,0,409,410,5,133,0,0,410,411,3,146,73,0,411,415,5,137, - 0,0,412,414,3,42,21,0,413,412,1,0,0,0,414,417,1,0,0,0,415,413,1, - 0,0,0,415,416,1,0,0,0,416,418,1,0,0,0,417,415,1,0,0,0,418,419,5, - 138,0,0,419,41,1,0,0,0,420,421,5,91,0,0,421,422,5,84,0,0,422,424, - 3,164,82,0,423,425,3,74,37,0,424,423,1,0,0,0,424,425,1,0,0,0,425, - 426,1,0,0,0,426,427,5,134,0,0,427,454,1,0,0,0,428,429,5,92,0,0,429, - 430,5,84,0,0,430,432,3,164,82,0,431,433,3,74,37,0,432,431,1,0,0, - 0,432,433,1,0,0,0,433,434,1,0,0,0,434,435,5,134,0,0,435,454,1,0, - 0,0,436,437,5,1,0,0,437,438,5,84,0,0,438,440,3,164,82,0,439,441, - 3,74,37,0,440,439,1,0,0,0,440,441,1,0,0,0,441,442,1,0,0,0,442,443, - 5,134,0,0,443,454,1,0,0,0,444,445,5,93,0,0,445,446,5,94,0,0,446, - 447,5,84,0,0,447,448,3,164,82,0,448,449,5,95,0,0,449,450,5,84,0, - 0,450,451,3,164,82,0,451,452,5,134,0,0,452,454,1,0,0,0,453,420,1, - 0,0,0,453,428,1,0,0,0,453,436,1,0,0,0,453,444,1,0,0,0,454,43,1,0, - 0,0,455,457,3,46,23,0,456,455,1,0,0,0,456,457,1,0,0,0,457,458,1, - 0,0,0,458,459,5,48,0,0,459,460,3,162,81,0,460,461,5,84,0,0,461,462, - 3,164,82,0,462,463,5,133,0,0,463,464,3,152,76,0,464,466,3,50,25, - 0,465,467,5,112,0,0,466,465,1,0,0,0,466,467,1,0,0,0,467,470,1,0, - 0,0,468,469,5,82,0,0,469,471,3,164,82,0,470,468,1,0,0,0,470,471, - 1,0,0,0,471,472,1,0,0,0,472,476,5,137,0,0,473,475,3,48,24,0,474, - 473,1,0,0,0,475,478,1,0,0,0,476,474,1,0,0,0,476,477,1,0,0,0,477, - 479,1,0,0,0,478,476,1,0,0,0,479,480,5,138,0,0,480,45,1,0,0,0,481, - 483,5,32,0,0,482,484,7,0,0,0,483,482,1,0,0,0,483,484,1,0,0,0,484, - 47,1,0,0,0,485,486,5,98,0,0,486,487,5,84,0,0,487,489,3,164,82,0, - 488,490,3,74,37,0,489,488,1,0,0,0,489,490,1,0,0,0,490,491,1,0,0, - 0,491,492,5,134,0,0,492,519,1,0,0,0,493,494,5,99,0,0,494,495,5,84, - 0,0,495,497,3,164,82,0,496,498,3,74,37,0,497,496,1,0,0,0,497,498, - 1,0,0,0,498,499,1,0,0,0,499,500,5,134,0,0,500,519,1,0,0,0,501,502, - 5,100,0,0,502,503,5,84,0,0,503,505,3,164,82,0,504,506,3,74,37,0, - 505,504,1,0,0,0,505,506,1,0,0,0,506,507,1,0,0,0,507,508,5,134,0, - 0,508,519,1,0,0,0,509,510,5,93,0,0,510,511,5,94,0,0,511,512,5,84, - 0,0,512,513,3,164,82,0,513,514,5,95,0,0,514,515,5,84,0,0,515,516, - 3,164,82,0,516,517,5,134,0,0,517,519,1,0,0,0,518,485,1,0,0,0,518, - 493,1,0,0,0,518,501,1,0,0,0,518,509,1,0,0,0,519,49,1,0,0,0,520,521, - 5,43,0,0,521,530,3,162,81,0,522,523,5,44,0,0,523,525,3,162,81,0, - 524,526,3,28,14,0,525,524,1,0,0,0,525,526,1,0,0,0,526,530,1,0,0, - 0,527,528,5,36,0,0,528,530,3,162,81,0,529,520,1,0,0,0,529,522,1, - 0,0,0,529,527,1,0,0,0,530,51,1,0,0,0,531,533,3,16,8,0,532,531,1, - 0,0,0,533,536,1,0,0,0,534,532,1,0,0,0,534,535,1,0,0,0,535,537,1, - 0,0,0,536,534,1,0,0,0,537,538,5,46,0,0,538,539,3,162,81,0,539,540, - 5,84,0,0,540,541,3,164,82,0,541,542,5,77,0,0,542,545,3,164,82,0, - 543,544,5,78,0,0,544,546,5,147,0,0,545,543,1,0,0,0,545,546,1,0,0, - 0,546,547,1,0,0,0,547,551,5,137,0,0,548,550,3,54,27,0,549,548,1, - 0,0,0,550,553,1,0,0,0,551,549,1,0,0,0,551,552,1,0,0,0,552,554,1, - 0,0,0,553,551,1,0,0,0,554,555,5,138,0,0,555,53,1,0,0,0,556,563,3, - 68,34,0,557,563,3,70,35,0,558,563,3,78,39,0,559,563,3,60,30,0,560, - 563,3,62,31,0,561,563,3,56,28,0,562,556,1,0,0,0,562,557,1,0,0,0, - 562,558,1,0,0,0,562,559,1,0,0,0,562,560,1,0,0,0,562,561,1,0,0,0, - 563,55,1,0,0,0,564,565,5,2,0,0,565,566,3,162,81,0,566,567,5,84,0, - 0,567,568,3,164,82,0,568,569,5,38,0,0,569,570,3,26,13,0,570,571, - 5,136,0,0,571,572,3,162,81,0,572,573,5,134,0,0,573,57,1,0,0,0,574, - 575,5,4,0,0,575,576,3,162,81,0,576,577,5,84,0,0,577,578,3,164,82, - 0,578,579,5,6,0,0,579,580,3,26,13,0,580,581,5,65,0,0,581,582,3,162, - 81,0,582,583,5,136,0,0,583,584,3,162,81,0,584,585,5,134,0,0,585, - 59,1,0,0,0,586,588,5,22,0,0,587,589,5,40,0,0,588,587,1,0,0,0,588, - 589,1,0,0,0,589,590,1,0,0,0,590,592,3,162,81,0,591,593,3,22,11,0, - 592,591,1,0,0,0,592,593,1,0,0,0,593,594,1,0,0,0,594,595,5,84,0,0, - 595,596,3,164,82,0,596,598,5,25,0,0,597,599,5,9,0,0,598,597,1,0, - 0,0,598,599,1,0,0,0,599,600,1,0,0,0,600,601,3,26,13,0,601,602,5, - 26,0,0,602,631,3,164,82,0,603,604,5,49,0,0,604,605,3,164,82,0,605, - 609,5,137,0,0,606,608,3,64,32,0,607,606,1,0,0,0,608,611,1,0,0,0, - 609,607,1,0,0,0,609,610,1,0,0,0,610,612,1,0,0,0,611,609,1,0,0,0, - 612,613,5,138,0,0,613,632,1,0,0,0,614,615,5,40,0,0,615,618,3,164, - 82,0,616,617,5,49,0,0,617,619,3,164,82,0,618,616,1,0,0,0,618,619, - 1,0,0,0,619,629,1,0,0,0,620,624,5,137,0,0,621,623,3,64,32,0,622, - 621,1,0,0,0,623,626,1,0,0,0,624,622,1,0,0,0,624,625,1,0,0,0,625, - 627,1,0,0,0,626,624,1,0,0,0,627,630,5,138,0,0,628,630,5,134,0,0, - 629,620,1,0,0,0,629,628,1,0,0,0,630,632,1,0,0,0,631,603,1,0,0,0, - 631,614,1,0,0,0,632,61,1,0,0,0,633,634,5,22,0,0,634,635,3,162,81, - 0,635,636,5,84,0,0,636,637,3,164,82,0,637,638,5,24,0,0,638,639,3, - 162,81,0,639,640,3,28,14,0,640,641,5,134,0,0,641,63,1,0,0,0,642, + 1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,3,45,868,8,45,1,45, + 1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,3,45,880,8,45,1,45, + 3,45,883,8,45,1,45,1,45,3,45,887,8,45,1,45,1,45,1,45,1,45,1,45,1, + 45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1, + 45,1,45,3,45,909,8,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1, + 45,1,45,1,45,1,45,3,45,923,8,45,1,46,1,46,1,46,1,46,5,46,929,8,46, + 10,46,12,46,932,9,46,1,46,1,46,1,47,1,47,1,48,1,48,1,48,1,49,1,49, + 3,49,943,8,49,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50, + 1,50,1,50,3,50,957,8,50,1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,51, + 3,51,967,8,51,1,52,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,53,1,53,3,53,985,8,53,1,53,1,53,3,53,989,8, + 53,1,53,3,53,992,8,53,1,53,1,53,3,53,996,8,53,1,53,3,53,999,8,53, + 1,53,1,53,1,54,1,54,3,54,1005,8,54,1,54,1,54,3,54,1009,8,54,1,54, + 1,54,1,54,3,54,1014,8,54,1,54,1,54,3,54,1018,8,54,1,54,1,54,3,54, + 1022,8,54,1,54,1,54,5,54,1026,8,54,10,54,12,54,1029,9,54,1,54,1, + 54,1,55,1,55,1,56,1,56,1,56,1,56,1,56,1,56,1,56,3,56,1042,8,56,1, + 57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,58,1,58,1,58,5,58,1055,8, + 58,10,58,12,58,1058,9,58,1,58,1,58,1,58,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,1077,8,59,1,60, + 1,60,1,60,1,60,1,60,5,60,1084,8,60,10,60,12,60,1087,9,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,62,1,62,1, + 62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,63,1,63,1,63,1,63,1, + 63,1,63,3,63,1118,8,63,1,63,1,63,1,64,1,64,1,64,1,64,1,65,1,65,1, + 65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65,1138,8,65,1, + 66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1, + 66,1,66,1,66,1,66,1,66,3,66,1158,8,66,1,66,1,66,1,66,1,66,1,66,1, + 66,1,66,1,66,3,66,1168,8,66,1,66,3,66,1171,8,66,1,66,3,66,1174,8, + 66,3,66,1176,8,66,1,67,1,67,1,67,1,68,1,68,1,69,1,69,1,70,1,70,1, + 70,5,70,1188,8,70,10,70,12,70,1191,9,70,1,70,1,70,1,71,1,71,1,71, + 1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71, + 1,71,1,71,1,71,3,71,1214,8,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71, + 1,71,1,71,1,71,1,71,1,71,1,71,1,71,3,71,1230,8,71,1,71,1,71,1,71, + 1,71,1,71,1,71,1,71,3,71,1239,8,71,1,71,1,71,1,71,1,71,1,71,1,71, + 1,71,1,71,3,71,1249,8,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71, + 1,71,5,71,1260,8,71,10,71,12,71,1263,9,71,1,71,1,71,1,71,1,71,1, + 71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,3,71,1277,8,71,1,71,1,71,1, + 71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,3,71,1289,8,71,1,71,1,71,3, + 71,1293,8,71,1,72,1,72,1,72,1,72,1,72,1,72,1,72,3,72,1302,8,72,1, + 72,1,72,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1, + 73,1,73,1,73,3,73,1320,8,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1, + 73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,5, + 73,1342,8,73,10,73,12,73,1345,9,73,1,73,1,73,1,73,3,73,1350,8,73, + 3,73,1352,8,73,1,74,1,74,1,74,1,74,1,74,1,75,1,75,1,76,1,76,1,77, + 1,77,1,77,1,77,1,77,1,77,1,77,1,77,3,77,1371,8,77,1,78,1,78,1,78, + 1,78,5,78,1377,8,78,10,78,12,78,1380,9,78,3,78,1382,8,78,1,78,1, + 78,1,79,1,79,1,79,1,79,1,80,1,80,1,80,1,80,5,80,1394,8,80,10,80, + 12,80,1397,9,80,3,80,1399,8,80,1,80,1,80,1,81,1,81,1,82,1,82,1,82, + 0,0,83,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,0,9,2,0,15,15,33,33,1,0,11,12,1,0,101,105, + 3,0,1,1,96,100,102,103,3,0,1,1,96,97,102,103,2,0,98,100,102,103, + 1,0,121,128,1,0,108,111,9,0,1,1,4,8,10,33,40,40,45,45,74,74,94,95, + 106,106,149,149,1524,0,178,1,0,0,0,2,180,1,0,0,0,4,190,1,0,0,0,6, + 194,1,0,0,0,8,219,1,0,0,0,10,231,1,0,0,0,12,233,1,0,0,0,14,240,1, + 0,0,0,16,251,1,0,0,0,18,253,1,0,0,0,20,266,1,0,0,0,22,298,1,0,0, + 0,24,328,1,0,0,0,26,330,1,0,0,0,28,334,1,0,0,0,30,352,1,0,0,0,32, + 354,1,0,0,0,34,367,1,0,0,0,36,369,1,0,0,0,38,382,1,0,0,0,40,403, + 1,0,0,0,42,453,1,0,0,0,44,456,1,0,0,0,46,481,1,0,0,0,48,518,1,0, + 0,0,50,529,1,0,0,0,52,534,1,0,0,0,54,562,1,0,0,0,56,564,1,0,0,0, + 58,574,1,0,0,0,60,586,1,0,0,0,62,633,1,0,0,0,64,699,1,0,0,0,66,701, + 1,0,0,0,68,706,1,0,0,0,70,735,1,0,0,0,72,757,1,0,0,0,74,770,1,0, + 0,0,76,772,1,0,0,0,78,784,1,0,0,0,80,797,1,0,0,0,82,800,1,0,0,0, + 84,820,1,0,0,0,86,822,1,0,0,0,88,830,1,0,0,0,90,922,1,0,0,0,92,924, + 1,0,0,0,94,935,1,0,0,0,96,937,1,0,0,0,98,942,1,0,0,0,100,944,1,0, + 0,0,102,966,1,0,0,0,104,968,1,0,0,0,106,977,1,0,0,0,108,1002,1,0, + 0,0,110,1032,1,0,0,0,112,1041,1,0,0,0,114,1043,1,0,0,0,116,1051, + 1,0,0,0,118,1076,1,0,0,0,120,1078,1,0,0,0,122,1090,1,0,0,0,124,1097, + 1,0,0,0,126,1111,1,0,0,0,128,1121,1,0,0,0,130,1137,1,0,0,0,132,1175, + 1,0,0,0,134,1177,1,0,0,0,136,1180,1,0,0,0,138,1182,1,0,0,0,140,1184, + 1,0,0,0,142,1292,1,0,0,0,144,1294,1,0,0,0,146,1351,1,0,0,0,148,1353, + 1,0,0,0,150,1358,1,0,0,0,152,1360,1,0,0,0,154,1370,1,0,0,0,156,1372, + 1,0,0,0,158,1385,1,0,0,0,160,1389,1,0,0,0,162,1402,1,0,0,0,164,1404, + 1,0,0,0,166,167,3,6,3,0,167,168,5,0,0,1,168,179,1,0,0,0,169,170, + 3,20,10,0,170,171,5,0,0,1,171,179,1,0,0,0,172,173,3,52,26,0,173, + 174,5,0,0,1,174,179,1,0,0,0,175,176,3,2,1,0,176,177,5,0,0,1,177, + 179,1,0,0,0,178,166,1,0,0,0,178,169,1,0,0,0,178,172,1,0,0,0,178, + 175,1,0,0,0,179,1,1,0,0,0,180,181,5,40,0,0,181,185,5,137,0,0,182, + 184,3,8,4,0,183,182,1,0,0,0,184,187,1,0,0,0,185,183,1,0,0,0,185, + 186,1,0,0,0,186,188,1,0,0,0,187,185,1,0,0,0,188,189,5,138,0,0,189, + 3,1,0,0,0,190,191,5,41,0,0,191,192,3,164,82,0,192,193,5,134,0,0, + 193,5,1,0,0,0,194,195,5,9,0,0,195,196,3,162,81,0,196,197,5,84,0, + 0,197,198,3,164,82,0,198,199,5,77,0,0,199,200,3,164,82,0,200,201, + 5,76,0,0,201,202,3,164,82,0,202,206,5,137,0,0,203,205,3,8,4,0,204, + 203,1,0,0,0,205,208,1,0,0,0,206,204,1,0,0,0,206,207,1,0,0,0,207, + 209,1,0,0,0,208,206,1,0,0,0,209,210,5,138,0,0,210,7,1,0,0,0,211, + 220,3,4,2,0,212,220,3,18,9,0,213,220,3,10,5,0,214,220,3,96,48,0, + 215,220,3,108,54,0,216,220,3,144,72,0,217,220,3,58,29,0,218,220, + 3,32,16,0,219,211,1,0,0,0,219,212,1,0,0,0,219,213,1,0,0,0,219,214, + 1,0,0,0,219,215,1,0,0,0,219,216,1,0,0,0,219,217,1,0,0,0,219,218, + 1,0,0,0,220,9,1,0,0,0,221,222,5,41,0,0,222,223,5,44,0,0,223,224, + 3,162,81,0,224,225,5,134,0,0,225,232,1,0,0,0,226,227,5,41,0,0,227, + 228,5,46,0,0,228,229,3,162,81,0,229,230,5,134,0,0,230,232,1,0,0, + 0,231,221,1,0,0,0,231,226,1,0,0,0,232,11,1,0,0,0,233,234,5,42,0, + 0,234,235,5,43,0,0,235,236,3,162,81,0,236,237,5,84,0,0,237,238,3, + 164,82,0,238,239,5,134,0,0,239,13,1,0,0,0,240,241,5,42,0,0,241,242, + 5,44,0,0,242,243,3,162,81,0,243,244,5,77,0,0,244,245,3,164,82,0, + 245,246,5,134,0,0,246,15,1,0,0,0,247,252,3,10,5,0,248,252,3,12,6, + 0,249,252,3,14,7,0,250,252,3,32,16,0,251,247,1,0,0,0,251,248,1,0, + 0,0,251,249,1,0,0,0,251,250,1,0,0,0,252,17,1,0,0,0,253,254,5,43, + 0,0,254,255,3,162,81,0,255,256,5,84,0,0,256,259,3,164,82,0,257,258, + 5,85,0,0,258,260,3,164,82,0,259,257,1,0,0,0,259,260,1,0,0,0,260, + 261,1,0,0,0,261,262,5,134,0,0,262,19,1,0,0,0,263,265,3,16,8,0,264, + 263,1,0,0,0,265,268,1,0,0,0,266,264,1,0,0,0,266,267,1,0,0,0,267, + 269,1,0,0,0,268,266,1,0,0,0,269,270,5,44,0,0,270,272,3,162,81,0, + 271,273,3,22,11,0,272,271,1,0,0,0,272,273,1,0,0,0,273,274,1,0,0, + 0,274,275,5,84,0,0,275,276,3,164,82,0,276,277,5,77,0,0,277,287,3, + 164,82,0,278,279,5,89,0,0,279,284,3,26,13,0,280,281,5,135,0,0,281, + 283,3,26,13,0,282,280,1,0,0,0,283,286,1,0,0,0,284,282,1,0,0,0,284, + 285,1,0,0,0,285,288,1,0,0,0,286,284,1,0,0,0,287,278,1,0,0,0,287, + 288,1,0,0,0,288,289,1,0,0,0,289,293,5,137,0,0,290,292,3,34,17,0, + 291,290,1,0,0,0,292,295,1,0,0,0,293,291,1,0,0,0,293,294,1,0,0,0, + 294,296,1,0,0,0,295,293,1,0,0,0,296,297,5,138,0,0,297,21,1,0,0,0, + 298,299,5,143,0,0,299,304,3,24,12,0,300,301,5,135,0,0,301,303,3, + 24,12,0,302,300,1,0,0,0,303,306,1,0,0,0,304,302,1,0,0,0,304,305, + 1,0,0,0,305,307,1,0,0,0,306,304,1,0,0,0,307,308,5,144,0,0,308,23, + 1,0,0,0,309,310,5,47,0,0,310,313,3,162,81,0,311,312,5,133,0,0,312, + 314,5,37,0,0,313,311,1,0,0,0,313,314,1,0,0,0,314,329,1,0,0,0,315, + 316,5,36,0,0,316,326,3,162,81,0,317,318,5,38,0,0,318,323,3,26,13, + 0,319,320,5,145,0,0,320,322,3,26,13,0,321,319,1,0,0,0,322,325,1, + 0,0,0,323,321,1,0,0,0,323,324,1,0,0,0,324,327,1,0,0,0,325,323,1, + 0,0,0,326,317,1,0,0,0,326,327,1,0,0,0,327,329,1,0,0,0,328,309,1, + 0,0,0,328,315,1,0,0,0,329,25,1,0,0,0,330,332,3,162,81,0,331,333, + 3,28,14,0,332,331,1,0,0,0,332,333,1,0,0,0,333,27,1,0,0,0,334,335, + 5,143,0,0,335,340,3,30,15,0,336,337,5,135,0,0,337,339,3,30,15,0, + 338,336,1,0,0,0,339,342,1,0,0,0,340,338,1,0,0,0,340,341,1,0,0,0, + 341,343,1,0,0,0,342,340,1,0,0,0,343,344,5,144,0,0,344,29,1,0,0,0, + 345,346,5,43,0,0,346,353,3,162,81,0,347,348,5,44,0,0,348,353,3,26, + 13,0,349,350,5,36,0,0,350,353,3,162,81,0,351,353,3,146,73,0,352, + 345,1,0,0,0,352,347,1,0,0,0,352,349,1,0,0,0,352,351,1,0,0,0,353, + 31,1,0,0,0,354,355,5,35,0,0,355,357,3,162,81,0,356,358,3,22,11,0, + 357,356,1,0,0,0,357,358,1,0,0,0,358,359,1,0,0,0,359,360,5,146,0, + 0,360,361,3,146,73,0,361,362,5,134,0,0,362,33,1,0,0,0,363,368,3, + 40,20,0,364,368,3,44,22,0,365,368,3,38,19,0,366,368,3,36,18,0,367, + 363,1,0,0,0,367,364,1,0,0,0,367,365,1,0,0,0,367,366,1,0,0,0,368, + 35,1,0,0,0,369,370,5,2,0,0,370,371,3,162,81,0,371,372,5,84,0,0,372, + 373,3,164,82,0,373,374,5,3,0,0,374,377,3,164,82,0,375,376,5,5,0, + 0,376,378,3,50,25,0,377,375,1,0,0,0,377,378,1,0,0,0,378,379,1,0, + 0,0,379,380,5,134,0,0,380,37,1,0,0,0,381,383,5,57,0,0,382,381,1, + 0,0,0,382,383,1,0,0,0,383,384,1,0,0,0,384,385,5,49,0,0,385,386,3, + 162,81,0,386,387,5,84,0,0,387,388,3,164,82,0,388,389,5,133,0,0,389, + 390,3,146,73,0,390,391,5,132,0,0,391,392,3,146,73,0,392,393,5,137, + 0,0,393,394,5,101,0,0,394,395,5,84,0,0,395,397,3,164,82,0,396,398, + 3,74,37,0,397,396,1,0,0,0,397,398,1,0,0,0,398,399,1,0,0,0,399,400, + 5,134,0,0,400,401,5,138,0,0,401,39,1,0,0,0,402,404,3,46,23,0,403, + 402,1,0,0,0,403,404,1,0,0,0,404,405,1,0,0,0,405,406,5,47,0,0,406, + 407,3,162,81,0,407,408,5,84,0,0,408,409,3,164,82,0,409,410,5,133, + 0,0,410,411,3,146,73,0,411,415,5,137,0,0,412,414,3,42,21,0,413,412, + 1,0,0,0,414,417,1,0,0,0,415,413,1,0,0,0,415,416,1,0,0,0,416,418, + 1,0,0,0,417,415,1,0,0,0,418,419,5,138,0,0,419,41,1,0,0,0,420,421, + 5,91,0,0,421,422,5,84,0,0,422,424,3,164,82,0,423,425,3,74,37,0,424, + 423,1,0,0,0,424,425,1,0,0,0,425,426,1,0,0,0,426,427,5,134,0,0,427, + 454,1,0,0,0,428,429,5,92,0,0,429,430,5,84,0,0,430,432,3,164,82,0, + 431,433,3,74,37,0,432,431,1,0,0,0,432,433,1,0,0,0,433,434,1,0,0, + 0,434,435,5,134,0,0,435,454,1,0,0,0,436,437,5,1,0,0,437,438,5,84, + 0,0,438,440,3,164,82,0,439,441,3,74,37,0,440,439,1,0,0,0,440,441, + 1,0,0,0,441,442,1,0,0,0,442,443,5,134,0,0,443,454,1,0,0,0,444,445, + 5,93,0,0,445,446,5,94,0,0,446,447,5,84,0,0,447,448,3,164,82,0,448, + 449,5,95,0,0,449,450,5,84,0,0,450,451,3,164,82,0,451,452,5,134,0, + 0,452,454,1,0,0,0,453,420,1,0,0,0,453,428,1,0,0,0,453,436,1,0,0, + 0,453,444,1,0,0,0,454,43,1,0,0,0,455,457,3,46,23,0,456,455,1,0,0, + 0,456,457,1,0,0,0,457,458,1,0,0,0,458,459,5,48,0,0,459,460,3,162, + 81,0,460,461,5,84,0,0,461,462,3,164,82,0,462,463,5,133,0,0,463,464, + 3,152,76,0,464,466,3,50,25,0,465,467,5,112,0,0,466,465,1,0,0,0,466, + 467,1,0,0,0,467,470,1,0,0,0,468,469,5,82,0,0,469,471,3,164,82,0, + 470,468,1,0,0,0,470,471,1,0,0,0,471,472,1,0,0,0,472,476,5,137,0, + 0,473,475,3,48,24,0,474,473,1,0,0,0,475,478,1,0,0,0,476,474,1,0, + 0,0,476,477,1,0,0,0,477,479,1,0,0,0,478,476,1,0,0,0,479,480,5,138, + 0,0,480,45,1,0,0,0,481,483,5,32,0,0,482,484,7,0,0,0,483,482,1,0, + 0,0,483,484,1,0,0,0,484,47,1,0,0,0,485,486,5,98,0,0,486,487,5,84, + 0,0,487,489,3,164,82,0,488,490,3,74,37,0,489,488,1,0,0,0,489,490, + 1,0,0,0,490,491,1,0,0,0,491,492,5,134,0,0,492,519,1,0,0,0,493,494, + 5,99,0,0,494,495,5,84,0,0,495,497,3,164,82,0,496,498,3,74,37,0,497, + 496,1,0,0,0,497,498,1,0,0,0,498,499,1,0,0,0,499,500,5,134,0,0,500, + 519,1,0,0,0,501,502,5,100,0,0,502,503,5,84,0,0,503,505,3,164,82, + 0,504,506,3,74,37,0,505,504,1,0,0,0,505,506,1,0,0,0,506,507,1,0, + 0,0,507,508,5,134,0,0,508,519,1,0,0,0,509,510,5,93,0,0,510,511,5, + 94,0,0,511,512,5,84,0,0,512,513,3,164,82,0,513,514,5,95,0,0,514, + 515,5,84,0,0,515,516,3,164,82,0,516,517,5,134,0,0,517,519,1,0,0, + 0,518,485,1,0,0,0,518,493,1,0,0,0,518,501,1,0,0,0,518,509,1,0,0, + 0,519,49,1,0,0,0,520,521,5,43,0,0,521,530,3,162,81,0,522,523,5,44, + 0,0,523,525,3,162,81,0,524,526,3,28,14,0,525,524,1,0,0,0,525,526, + 1,0,0,0,526,530,1,0,0,0,527,528,5,36,0,0,528,530,3,162,81,0,529, + 520,1,0,0,0,529,522,1,0,0,0,529,527,1,0,0,0,530,51,1,0,0,0,531,533, + 3,16,8,0,532,531,1,0,0,0,533,536,1,0,0,0,534,532,1,0,0,0,534,535, + 1,0,0,0,535,537,1,0,0,0,536,534,1,0,0,0,537,538,5,46,0,0,538,539, + 3,162,81,0,539,540,5,84,0,0,540,541,3,164,82,0,541,542,5,77,0,0, + 542,545,3,164,82,0,543,544,5,78,0,0,544,546,5,147,0,0,545,543,1, + 0,0,0,545,546,1,0,0,0,546,547,1,0,0,0,547,551,5,137,0,0,548,550, + 3,54,27,0,549,548,1,0,0,0,550,553,1,0,0,0,551,549,1,0,0,0,551,552, + 1,0,0,0,552,554,1,0,0,0,553,551,1,0,0,0,554,555,5,138,0,0,555,53, + 1,0,0,0,556,563,3,68,34,0,557,563,3,70,35,0,558,563,3,78,39,0,559, + 563,3,60,30,0,560,563,3,62,31,0,561,563,3,56,28,0,562,556,1,0,0, + 0,562,557,1,0,0,0,562,558,1,0,0,0,562,559,1,0,0,0,562,560,1,0,0, + 0,562,561,1,0,0,0,563,55,1,0,0,0,564,565,5,2,0,0,565,566,3,162,81, + 0,566,567,5,84,0,0,567,568,3,164,82,0,568,569,5,38,0,0,569,570,3, + 26,13,0,570,571,5,136,0,0,571,572,3,162,81,0,572,573,5,134,0,0,573, + 57,1,0,0,0,574,575,5,4,0,0,575,576,3,162,81,0,576,577,5,84,0,0,577, + 578,3,164,82,0,578,579,5,6,0,0,579,580,3,26,13,0,580,581,5,65,0, + 0,581,582,3,162,81,0,582,583,5,136,0,0,583,584,3,162,81,0,584,585, + 5,134,0,0,585,59,1,0,0,0,586,588,5,22,0,0,587,589,5,40,0,0,588,587, + 1,0,0,0,588,589,1,0,0,0,589,590,1,0,0,0,590,592,3,162,81,0,591,593, + 3,22,11,0,592,591,1,0,0,0,592,593,1,0,0,0,593,594,1,0,0,0,594,595, + 5,84,0,0,595,596,3,164,82,0,596,598,5,25,0,0,597,599,5,9,0,0,598, + 597,1,0,0,0,598,599,1,0,0,0,599,600,1,0,0,0,600,601,3,26,13,0,601, + 602,5,26,0,0,602,631,3,164,82,0,603,604,5,49,0,0,604,605,3,164,82, + 0,605,609,5,137,0,0,606,608,3,64,32,0,607,606,1,0,0,0,608,611,1, + 0,0,0,609,607,1,0,0,0,609,610,1,0,0,0,610,612,1,0,0,0,611,609,1, + 0,0,0,612,613,5,138,0,0,613,632,1,0,0,0,614,615,5,40,0,0,615,618, + 3,164,82,0,616,617,5,49,0,0,617,619,3,164,82,0,618,616,1,0,0,0,618, + 619,1,0,0,0,619,629,1,0,0,0,620,624,5,137,0,0,621,623,3,64,32,0, + 622,621,1,0,0,0,623,626,1,0,0,0,624,622,1,0,0,0,624,625,1,0,0,0, + 625,627,1,0,0,0,626,624,1,0,0,0,627,630,5,138,0,0,628,630,5,134, + 0,0,629,620,1,0,0,0,629,628,1,0,0,0,630,632,1,0,0,0,631,603,1,0, + 0,0,631,614,1,0,0,0,632,61,1,0,0,0,633,634,5,22,0,0,634,635,3,162, + 81,0,635,636,5,84,0,0,636,637,3,164,82,0,637,638,5,24,0,0,638,639, + 3,162,81,0,639,640,3,28,14,0,640,641,5,134,0,0,641,63,1,0,0,0,642, 643,5,16,0,0,643,700,5,134,0,0,644,645,5,17,0,0,645,646,5,18,0,0, 646,647,3,162,81,0,647,648,5,134,0,0,648,700,1,0,0,0,649,650,5,27, 0,0,650,651,3,164,82,0,651,652,5,134,0,0,652,700,1,0,0,0,653,654, @@ -5837,200 +5849,201 @@ export class QuixosCapabilityParser extends antlr.Parser { 1,0,0,0,835,833,1,0,0,0,835,836,1,0,0,0,836,838,1,0,0,0,837,835, 1,0,0,0,838,839,5,138,0,0,839,89,1,0,0,0,840,841,5,23,0,0,841,842, 3,162,81,0,842,843,5,84,0,0,843,844,3,164,82,0,844,845,5,139,0,0, - 845,846,3,86,43,0,846,847,5,140,0,0,847,848,5,134,0,0,848,919,1, + 845,846,3,86,43,0,846,847,5,140,0,0,847,848,5,134,0,0,848,923,1, 0,0,0,849,850,5,61,0,0,850,851,3,162,81,0,851,852,5,84,0,0,852,853, 3,164,82,0,853,854,5,133,0,0,854,855,3,146,73,0,855,856,3,92,46, - 0,856,857,5,134,0,0,857,919,1,0,0,0,858,859,5,62,0,0,859,860,3,162, + 0,856,857,5,134,0,0,857,923,1,0,0,0,858,859,5,62,0,0,859,860,3,162, 81,0,860,861,5,84,0,0,861,862,3,164,82,0,862,863,5,133,0,0,863,864, - 3,152,76,0,864,865,3,50,25,0,865,866,3,92,46,0,866,867,5,134,0,0, - 867,919,1,0,0,0,868,869,5,44,0,0,869,870,3,162,81,0,870,871,5,84, - 0,0,871,872,3,164,82,0,872,873,5,133,0,0,873,875,3,162,81,0,874, - 876,3,28,14,0,875,874,1,0,0,0,875,876,1,0,0,0,876,878,1,0,0,0,877, - 879,3,76,38,0,878,877,1,0,0,0,878,879,1,0,0,0,879,882,1,0,0,0,880, - 881,5,18,0,0,881,883,5,53,0,0,882,880,1,0,0,0,882,883,1,0,0,0,883, - 884,1,0,0,0,884,885,5,134,0,0,885,919,1,0,0,0,886,887,5,7,0,0,887, - 888,3,162,81,0,888,889,5,84,0,0,889,890,3,164,82,0,890,891,5,133, - 0,0,891,892,3,162,81,0,892,893,5,53,0,0,893,894,3,146,73,0,894,895, - 5,134,0,0,895,919,1,0,0,0,896,897,5,51,0,0,897,898,3,162,81,0,898, - 899,5,84,0,0,899,900,3,164,82,0,900,901,5,133,0,0,901,904,3,162, - 81,0,902,903,5,53,0,0,903,905,3,146,73,0,904,902,1,0,0,0,904,905, - 1,0,0,0,905,906,1,0,0,0,906,907,5,134,0,0,907,919,1,0,0,0,908,909, - 5,22,0,0,909,910,3,162,81,0,910,911,5,84,0,0,911,912,3,164,82,0, - 912,913,5,133,0,0,913,914,3,162,81,0,914,915,5,136,0,0,915,916,3, - 162,81,0,916,917,5,134,0,0,917,919,1,0,0,0,918,840,1,0,0,0,918,849, - 1,0,0,0,918,858,1,0,0,0,918,868,1,0,0,0,918,886,1,0,0,0,918,896, - 1,0,0,0,918,908,1,0,0,0,919,91,1,0,0,0,920,921,5,139,0,0,921,926, - 3,94,47,0,922,923,5,135,0,0,923,925,3,94,47,0,924,922,1,0,0,0,925, - 928,1,0,0,0,926,924,1,0,0,0,926,927,1,0,0,0,927,929,1,0,0,0,928, - 926,1,0,0,0,929,930,5,140,0,0,930,93,1,0,0,0,931,932,7,3,0,0,932, - 95,1,0,0,0,933,934,5,60,0,0,934,935,3,98,49,0,935,97,1,0,0,0,936, - 939,3,100,50,0,937,939,3,104,52,0,938,936,1,0,0,0,938,937,1,0,0, - 0,939,99,1,0,0,0,940,941,5,61,0,0,941,942,3,162,81,0,942,943,5,84, - 0,0,943,944,3,164,82,0,944,945,5,71,0,0,945,946,3,162,81,0,946,947, - 5,133,0,0,947,948,3,146,73,0,948,949,5,72,0,0,949,952,3,102,51,0, - 950,951,5,73,0,0,951,953,3,154,77,0,952,950,1,0,0,0,952,953,1,0, - 0,0,953,954,1,0,0,0,954,955,5,134,0,0,955,101,1,0,0,0,956,963,5, - 106,0,0,957,958,5,107,0,0,958,959,5,141,0,0,959,960,3,146,73,0,960, - 961,5,142,0,0,961,963,1,0,0,0,962,956,1,0,0,0,962,957,1,0,0,0,963, - 103,1,0,0,0,964,965,5,62,0,0,965,966,3,162,81,0,966,967,5,84,0,0, - 967,968,3,164,82,0,968,969,5,137,0,0,969,970,3,106,53,0,970,971, - 3,106,53,0,971,972,5,138,0,0,972,105,1,0,0,0,973,974,3,50,25,0,974, - 975,5,63,0,0,975,976,3,162,81,0,976,977,5,84,0,0,977,978,3,164,82, - 0,978,980,3,152,76,0,979,981,5,112,0,0,980,979,1,0,0,0,980,981,1, - 0,0,0,981,984,1,0,0,0,982,983,5,79,0,0,983,985,3,164,82,0,984,982, - 1,0,0,0,984,985,1,0,0,0,985,987,1,0,0,0,986,988,5,81,0,0,987,986, - 1,0,0,0,987,988,1,0,0,0,988,991,1,0,0,0,989,990,5,82,0,0,990,992, - 3,164,82,0,991,989,1,0,0,0,991,992,1,0,0,0,992,994,1,0,0,0,993,995, - 5,83,0,0,994,993,1,0,0,0,994,995,1,0,0,0,995,996,1,0,0,0,996,997, - 5,134,0,0,997,107,1,0,0,0,998,1000,5,54,0,0,999,1001,3,22,11,0,1000, - 999,1,0,0,0,1000,1001,1,0,0,0,1001,1002,1,0,0,0,1002,1004,3,162, - 81,0,1003,1005,3,110,55,0,1004,1003,1,0,0,0,1004,1005,1,0,0,0,1005, - 1006,1,0,0,0,1006,1007,5,55,0,0,1007,1009,3,162,81,0,1008,1010,3, - 28,14,0,1009,1008,1,0,0,0,1009,1010,1,0,0,0,1010,1013,1,0,0,0,1011, - 1012,5,84,0,0,1012,1014,3,164,82,0,1013,1011,1,0,0,0,1013,1014,1, - 0,0,0,1014,1017,1,0,0,0,1015,1016,5,78,0,0,1016,1018,5,147,0,0,1017, - 1015,1,0,0,0,1017,1018,1,0,0,0,1018,1019,1,0,0,0,1019,1023,5,137, - 0,0,1020,1022,3,112,56,0,1021,1020,1,0,0,0,1022,1025,1,0,0,0,1023, - 1021,1,0,0,0,1023,1024,1,0,0,0,1024,1026,1,0,0,0,1025,1023,1,0,0, - 0,1026,1027,5,138,0,0,1027,109,1,0,0,0,1028,1029,3,28,14,0,1029, - 111,1,0,0,0,1030,1031,5,59,0,0,1031,1038,3,98,49,0,1032,1038,3,126, - 63,0,1033,1038,3,122,61,0,1034,1038,3,116,58,0,1035,1038,3,124,62, - 0,1036,1038,3,114,57,0,1037,1030,1,0,0,0,1037,1032,1,0,0,0,1037, - 1033,1,0,0,0,1037,1034,1,0,0,0,1037,1035,1,0,0,0,1037,1036,1,0,0, - 0,1038,113,1,0,0,0,1039,1040,5,56,0,0,1040,1041,3,162,81,0,1041, - 1042,5,58,0,0,1042,1043,3,162,81,0,1043,1044,5,136,0,0,1044,1045, - 3,162,81,0,1045,1046,5,134,0,0,1046,115,1,0,0,0,1047,1048,5,8,0, - 0,1048,1052,5,137,0,0,1049,1051,3,118,59,0,1050,1049,1,0,0,0,1051, - 1054,1,0,0,0,1052,1050,1,0,0,0,1052,1053,1,0,0,0,1053,1055,1,0,0, - 0,1054,1052,1,0,0,0,1055,1056,5,138,0,0,1056,1057,5,134,0,0,1057, - 117,1,0,0,0,1058,1059,3,162,81,0,1059,1060,5,58,0,0,1060,1061,5, - 61,0,0,1061,1062,3,162,81,0,1062,1063,5,134,0,0,1063,1073,1,0,0, - 0,1064,1065,3,162,81,0,1065,1066,5,58,0,0,1066,1067,5,62,0,0,1067, - 1068,3,162,81,0,1068,1069,5,136,0,0,1069,1070,3,162,81,0,1070,1071, - 5,134,0,0,1071,1073,1,0,0,0,1072,1058,1,0,0,0,1072,1064,1,0,0,0, - 1073,119,1,0,0,0,1074,1075,3,26,13,0,1075,1076,5,18,0,0,1076,1081, - 5,53,0,0,1077,1078,5,136,0,0,1078,1080,3,162,81,0,1079,1077,1,0, - 0,0,1080,1083,1,0,0,0,1081,1079,1,0,0,0,1081,1082,1,0,0,0,1082,1084, - 1,0,0,0,1083,1081,1,0,0,0,1084,1085,5,134,0,0,1085,121,1,0,0,0,1086, - 1087,5,56,0,0,1087,1088,3,162,81,0,1088,1089,5,58,0,0,1089,1090, - 5,61,0,0,1090,1091,3,162,81,0,1091,1092,5,134,0,0,1092,123,1,0,0, - 0,1093,1094,5,68,0,0,1094,1095,3,162,81,0,1095,1096,5,69,0,0,1096, - 1097,5,70,0,0,1097,1098,5,65,0,0,1098,1099,5,51,0,0,1099,1100,3, - 162,81,0,1100,1101,5,67,0,0,1101,1102,5,62,0,0,1102,1103,3,162,81, - 0,1103,1104,5,136,0,0,1104,1105,3,162,81,0,1105,1106,5,134,0,0,1106, - 125,1,0,0,0,1107,1108,5,56,0,0,1108,1109,3,128,64,0,1109,1110,5, - 58,0,0,1110,1113,3,132,66,0,1111,1112,5,34,0,0,1112,1114,3,164,82, - 0,1113,1111,1,0,0,0,1113,1114,1,0,0,0,1114,1115,1,0,0,0,1115,1116, - 5,134,0,0,1116,127,1,0,0,0,1117,1118,3,162,81,0,1118,1119,5,136, - 0,0,1119,1120,3,130,65,0,1120,129,1,0,0,0,1121,1134,3,162,81,0,1122, - 1134,5,101,0,0,1123,1134,5,91,0,0,1124,1134,5,92,0,0,1125,1134,5, - 1,0,0,1126,1134,5,98,0,0,1127,1134,5,99,0,0,1128,1134,5,100,0,0, - 1129,1134,5,102,0,0,1130,1134,5,103,0,0,1131,1134,5,104,0,0,1132, - 1134,5,105,0,0,1133,1121,1,0,0,0,1133,1122,1,0,0,0,1133,1123,1,0, - 0,0,1133,1124,1,0,0,0,1133,1125,1,0,0,0,1133,1126,1,0,0,0,1133,1127, - 1,0,0,0,1133,1128,1,0,0,0,1133,1129,1,0,0,0,1133,1130,1,0,0,0,1133, - 1131,1,0,0,0,1133,1132,1,0,0,0,1134,131,1,0,0,0,1135,1136,5,80,0, - 0,1136,1137,5,136,0,0,1137,1172,3,162,81,0,1138,1139,5,61,0,0,1139, - 1140,3,162,81,0,1140,1141,5,136,0,0,1141,1142,3,136,68,0,1142,1172, - 1,0,0,0,1143,1144,5,62,0,0,1144,1145,3,162,81,0,1145,1146,5,136, - 0,0,1146,1147,3,162,81,0,1147,1148,5,136,0,0,1148,1149,3,138,69, - 0,1149,1172,1,0,0,0,1150,1151,5,44,0,0,1151,1153,3,162,81,0,1152, - 1154,3,28,14,0,1153,1152,1,0,0,0,1153,1154,1,0,0,0,1154,1155,1,0, - 0,0,1155,1156,5,136,0,0,1156,1157,3,128,64,0,1157,1172,1,0,0,0,1158, - 1159,5,46,0,0,1159,1160,3,162,81,0,1160,1161,5,136,0,0,1161,1163, - 3,162,81,0,1162,1164,3,28,14,0,1163,1162,1,0,0,0,1163,1164,1,0,0, - 0,1164,1166,1,0,0,0,1165,1167,3,140,70,0,1166,1165,1,0,0,0,1166, - 1167,1,0,0,0,1167,1169,1,0,0,0,1168,1170,3,134,67,0,1169,1168,1, - 0,0,0,1169,1170,1,0,0,0,1170,1172,1,0,0,0,1171,1135,1,0,0,0,1171, - 1138,1,0,0,0,1171,1143,1,0,0,0,1171,1150,1,0,0,0,1171,1158,1,0,0, - 0,1172,133,1,0,0,0,1173,1174,5,66,0,0,1174,1175,3,140,70,0,1175, - 135,1,0,0,0,1176,1177,7,4,0,0,1177,137,1,0,0,0,1178,1179,7,5,0,0, - 1179,139,1,0,0,0,1180,1181,5,64,0,0,1181,1185,5,137,0,0,1182,1184, - 3,142,71,0,1183,1182,1,0,0,0,1184,1187,1,0,0,0,1185,1183,1,0,0,0, - 1185,1186,1,0,0,0,1186,1188,1,0,0,0,1187,1185,1,0,0,0,1188,1189, - 5,138,0,0,1189,141,1,0,0,0,1190,1191,3,162,81,0,1191,1192,5,58,0, - 0,1192,1193,5,9,0,0,1193,1194,5,23,0,0,1194,1195,5,139,0,0,1195, - 1196,3,86,43,0,1196,1197,5,140,0,0,1197,1198,5,134,0,0,1198,1289, - 1,0,0,0,1199,1200,3,162,81,0,1200,1201,5,58,0,0,1201,1202,5,61,0, - 0,1202,1209,3,162,81,0,1203,1204,5,67,0,0,1204,1205,5,62,0,0,1205, - 1206,3,162,81,0,1206,1207,5,136,0,0,1207,1208,3,162,81,0,1208,1210, - 1,0,0,0,1209,1203,1,0,0,0,1209,1210,1,0,0,0,1210,1211,1,0,0,0,1211, - 1212,5,134,0,0,1212,1289,1,0,0,0,1213,1214,3,162,81,0,1214,1215, - 5,58,0,0,1215,1216,5,62,0,0,1216,1217,3,162,81,0,1217,1218,5,136, - 0,0,1218,1225,3,162,81,0,1219,1220,5,67,0,0,1220,1221,5,62,0,0,1221, - 1222,3,162,81,0,1222,1223,5,136,0,0,1223,1224,3,162,81,0,1224,1226, - 1,0,0,0,1225,1219,1,0,0,0,1225,1226,1,0,0,0,1226,1227,1,0,0,0,1227, - 1228,5,134,0,0,1228,1289,1,0,0,0,1229,1230,3,162,81,0,1230,1231, - 5,58,0,0,1231,1232,5,44,0,0,1232,1234,3,162,81,0,1233,1235,3,28, - 14,0,1234,1233,1,0,0,0,1234,1235,1,0,0,0,1235,1244,1,0,0,0,1236, - 1237,5,67,0,0,1237,1238,5,62,0,0,1238,1239,3,162,81,0,1239,1240, - 5,136,0,0,1240,1241,3,162,81,0,1241,1245,1,0,0,0,1242,1243,5,18, - 0,0,1243,1245,5,53,0,0,1244,1236,1,0,0,0,1244,1242,1,0,0,0,1244, - 1245,1,0,0,0,1245,1246,1,0,0,0,1246,1247,5,134,0,0,1247,1289,1,0, - 0,0,1248,1249,3,162,81,0,1249,1250,5,58,0,0,1250,1251,5,7,0,0,1251, - 1252,3,162,81,0,1252,1253,5,64,0,0,1253,1257,5,137,0,0,1254,1256, - 3,120,60,0,1255,1254,1,0,0,0,1256,1259,1,0,0,0,1257,1255,1,0,0,0, - 1257,1258,1,0,0,0,1258,1260,1,0,0,0,1259,1257,1,0,0,0,1260,1261, - 5,138,0,0,1261,1262,5,134,0,0,1262,1289,1,0,0,0,1263,1264,3,162, - 81,0,1264,1265,5,58,0,0,1265,1266,5,51,0,0,1266,1267,3,162,81,0, - 1267,1268,5,134,0,0,1268,1289,1,0,0,0,1269,1270,3,162,81,0,1270, - 1272,5,58,0,0,1271,1273,5,9,0,0,1272,1271,1,0,0,0,1272,1273,1,0, - 0,0,1273,1274,1,0,0,0,1274,1275,5,22,0,0,1275,1276,3,162,81,0,1276, - 1277,5,136,0,0,1277,1284,3,162,81,0,1278,1279,5,67,0,0,1279,1280, - 5,62,0,0,1280,1281,3,162,81,0,1281,1282,5,136,0,0,1282,1283,3,162, - 81,0,1283,1285,1,0,0,0,1284,1278,1,0,0,0,1284,1285,1,0,0,0,1285, - 1286,1,0,0,0,1286,1287,5,134,0,0,1287,1289,1,0,0,0,1288,1190,1,0, - 0,0,1288,1199,1,0,0,0,1288,1213,1,0,0,0,1288,1229,1,0,0,0,1288,1248, - 1,0,0,0,1288,1263,1,0,0,0,1288,1269,1,0,0,0,1289,143,1,0,0,0,1290, - 1291,5,51,0,0,1291,1292,3,162,81,0,1292,1293,5,58,0,0,1293,1294, - 3,162,81,0,1294,1295,5,136,0,0,1295,1297,3,162,81,0,1296,1298,3, - 140,70,0,1297,1296,1,0,0,0,1297,1298,1,0,0,0,1298,1299,1,0,0,0,1299, - 1300,5,134,0,0,1300,145,1,0,0,0,1301,1348,3,150,75,0,1302,1348,5, - 113,0,0,1303,1348,5,114,0,0,1304,1305,5,115,0,0,1305,1348,3,164, - 82,0,1306,1307,5,116,0,0,1307,1308,5,143,0,0,1308,1309,3,162,81, - 0,1309,1310,5,144,0,0,1310,1348,1,0,0,0,1311,1312,5,117,0,0,1312, - 1313,5,143,0,0,1313,1315,3,162,81,0,1314,1316,3,28,14,0,1315,1314, - 1,0,0,0,1315,1316,1,0,0,0,1316,1317,1,0,0,0,1317,1318,5,144,0,0, - 1318,1348,1,0,0,0,1319,1320,5,39,0,0,1320,1321,5,143,0,0,1321,1322, - 3,162,81,0,1322,1323,5,144,0,0,1323,1348,1,0,0,0,1324,1325,5,118, - 0,0,1325,1326,5,143,0,0,1326,1327,3,146,73,0,1327,1328,5,144,0,0, - 1328,1348,1,0,0,0,1329,1330,5,119,0,0,1330,1331,5,143,0,0,1331,1332, - 3,146,73,0,1332,1333,5,144,0,0,1333,1348,1,0,0,0,1334,1335,5,120, - 0,0,1335,1339,5,137,0,0,1336,1338,3,148,74,0,1337,1336,1,0,0,0,1338, - 1341,1,0,0,0,1339,1337,1,0,0,0,1339,1340,1,0,0,0,1340,1342,1,0,0, - 0,1341,1339,1,0,0,0,1342,1348,5,138,0,0,1343,1345,3,162,81,0,1344, - 1346,3,28,14,0,1345,1344,1,0,0,0,1345,1346,1,0,0,0,1346,1348,1,0, - 0,0,1347,1301,1,0,0,0,1347,1302,1,0,0,0,1347,1303,1,0,0,0,1347,1304, - 1,0,0,0,1347,1306,1,0,0,0,1347,1311,1,0,0,0,1347,1319,1,0,0,0,1347, - 1324,1,0,0,0,1347,1329,1,0,0,0,1347,1334,1,0,0,0,1347,1343,1,0,0, - 0,1348,147,1,0,0,0,1349,1350,3,162,81,0,1350,1351,5,133,0,0,1351, - 1352,3,146,73,0,1352,1353,5,134,0,0,1353,149,1,0,0,0,1354,1355,7, - 6,0,0,1355,151,1,0,0,0,1356,1357,7,7,0,0,1357,153,1,0,0,0,1358,1367, - 3,164,82,0,1359,1367,5,147,0,0,1360,1367,5,148,0,0,1361,1367,5,129, - 0,0,1362,1367,5,130,0,0,1363,1367,5,131,0,0,1364,1367,3,156,78,0, - 1365,1367,3,160,80,0,1366,1358,1,0,0,0,1366,1359,1,0,0,0,1366,1360, - 1,0,0,0,1366,1361,1,0,0,0,1366,1362,1,0,0,0,1366,1363,1,0,0,0,1366, - 1364,1,0,0,0,1366,1365,1,0,0,0,1367,155,1,0,0,0,1368,1377,5,137, - 0,0,1369,1374,3,158,79,0,1370,1371,5,135,0,0,1371,1373,3,158,79, - 0,1372,1370,1,0,0,0,1373,1376,1,0,0,0,1374,1372,1,0,0,0,1374,1375, - 1,0,0,0,1375,1378,1,0,0,0,1376,1374,1,0,0,0,1377,1369,1,0,0,0,1377, - 1378,1,0,0,0,1378,1379,1,0,0,0,1379,1380,5,138,0,0,1380,157,1,0, - 0,0,1381,1382,3,164,82,0,1382,1383,5,133,0,0,1383,1384,3,154,77, - 0,1384,159,1,0,0,0,1385,1394,5,139,0,0,1386,1391,3,154,77,0,1387, - 1388,5,135,0,0,1388,1390,3,154,77,0,1389,1387,1,0,0,0,1390,1393, - 1,0,0,0,1391,1389,1,0,0,0,1391,1392,1,0,0,0,1392,1395,1,0,0,0,1393, - 1391,1,0,0,0,1394,1386,1,0,0,0,1394,1395,1,0,0,0,1395,1396,1,0,0, - 0,1396,1397,5,140,0,0,1397,161,1,0,0,0,1398,1399,7,8,0,0,1399,163, - 1,0,0,0,1400,1401,5,150,0,0,1401,165,1,0,0,0,125,178,185,206,219, - 231,251,259,266,272,284,287,293,304,313,323,326,328,332,340,352, - 357,367,377,382,397,403,415,424,432,440,453,456,466,470,476,483, - 489,497,505,518,525,529,534,545,551,562,588,592,598,609,618,624, - 629,631,662,666,672,699,709,720,723,728,731,738,747,750,753,770, - 779,793,814,817,820,827,835,875,878,882,904,918,926,938,952,962, - 980,984,987,991,994,1000,1004,1009,1013,1017,1023,1037,1052,1072, - 1081,1113,1133,1153,1163,1166,1169,1171,1185,1209,1225,1234,1244, - 1257,1272,1284,1288,1297,1315,1339,1345,1347,1366,1374,1377,1391, - 1394 + 3,152,76,0,864,867,3,50,25,0,865,866,5,82,0,0,866,868,3,164,82,0, + 867,865,1,0,0,0,867,868,1,0,0,0,868,869,1,0,0,0,869,870,3,92,46, + 0,870,871,5,134,0,0,871,923,1,0,0,0,872,873,5,44,0,0,873,874,3,162, + 81,0,874,875,5,84,0,0,875,876,3,164,82,0,876,877,5,133,0,0,877,879, + 3,162,81,0,878,880,3,28,14,0,879,878,1,0,0,0,879,880,1,0,0,0,880, + 882,1,0,0,0,881,883,3,76,38,0,882,881,1,0,0,0,882,883,1,0,0,0,883, + 886,1,0,0,0,884,885,5,18,0,0,885,887,5,53,0,0,886,884,1,0,0,0,886, + 887,1,0,0,0,887,888,1,0,0,0,888,889,5,134,0,0,889,923,1,0,0,0,890, + 891,5,7,0,0,891,892,3,162,81,0,892,893,5,84,0,0,893,894,3,164,82, + 0,894,895,5,133,0,0,895,896,3,162,81,0,896,897,5,53,0,0,897,898, + 3,146,73,0,898,899,5,134,0,0,899,923,1,0,0,0,900,901,5,51,0,0,901, + 902,3,162,81,0,902,903,5,84,0,0,903,904,3,164,82,0,904,905,5,133, + 0,0,905,908,3,162,81,0,906,907,5,53,0,0,907,909,3,146,73,0,908,906, + 1,0,0,0,908,909,1,0,0,0,909,910,1,0,0,0,910,911,5,134,0,0,911,923, + 1,0,0,0,912,913,5,22,0,0,913,914,3,162,81,0,914,915,5,84,0,0,915, + 916,3,164,82,0,916,917,5,133,0,0,917,918,3,162,81,0,918,919,5,136, + 0,0,919,920,3,162,81,0,920,921,5,134,0,0,921,923,1,0,0,0,922,840, + 1,0,0,0,922,849,1,0,0,0,922,858,1,0,0,0,922,872,1,0,0,0,922,890, + 1,0,0,0,922,900,1,0,0,0,922,912,1,0,0,0,923,91,1,0,0,0,924,925,5, + 139,0,0,925,930,3,94,47,0,926,927,5,135,0,0,927,929,3,94,47,0,928, + 926,1,0,0,0,929,932,1,0,0,0,930,928,1,0,0,0,930,931,1,0,0,0,931, + 933,1,0,0,0,932,930,1,0,0,0,933,934,5,140,0,0,934,93,1,0,0,0,935, + 936,7,3,0,0,936,95,1,0,0,0,937,938,5,60,0,0,938,939,3,98,49,0,939, + 97,1,0,0,0,940,943,3,100,50,0,941,943,3,104,52,0,942,940,1,0,0,0, + 942,941,1,0,0,0,943,99,1,0,0,0,944,945,5,61,0,0,945,946,3,162,81, + 0,946,947,5,84,0,0,947,948,3,164,82,0,948,949,5,71,0,0,949,950,3, + 162,81,0,950,951,5,133,0,0,951,952,3,146,73,0,952,953,5,72,0,0,953, + 956,3,102,51,0,954,955,5,73,0,0,955,957,3,154,77,0,956,954,1,0,0, + 0,956,957,1,0,0,0,957,958,1,0,0,0,958,959,5,134,0,0,959,101,1,0, + 0,0,960,967,5,106,0,0,961,962,5,107,0,0,962,963,5,141,0,0,963,964, + 3,146,73,0,964,965,5,142,0,0,965,967,1,0,0,0,966,960,1,0,0,0,966, + 961,1,0,0,0,967,103,1,0,0,0,968,969,5,62,0,0,969,970,3,162,81,0, + 970,971,5,84,0,0,971,972,3,164,82,0,972,973,5,137,0,0,973,974,3, + 106,53,0,974,975,3,106,53,0,975,976,5,138,0,0,976,105,1,0,0,0,977, + 978,3,50,25,0,978,979,5,63,0,0,979,980,3,162,81,0,980,981,5,84,0, + 0,981,982,3,164,82,0,982,984,3,152,76,0,983,985,5,112,0,0,984,983, + 1,0,0,0,984,985,1,0,0,0,985,988,1,0,0,0,986,987,5,79,0,0,987,989, + 3,164,82,0,988,986,1,0,0,0,988,989,1,0,0,0,989,991,1,0,0,0,990,992, + 5,81,0,0,991,990,1,0,0,0,991,992,1,0,0,0,992,995,1,0,0,0,993,994, + 5,82,0,0,994,996,3,164,82,0,995,993,1,0,0,0,995,996,1,0,0,0,996, + 998,1,0,0,0,997,999,5,83,0,0,998,997,1,0,0,0,998,999,1,0,0,0,999, + 1000,1,0,0,0,1000,1001,5,134,0,0,1001,107,1,0,0,0,1002,1004,5,54, + 0,0,1003,1005,3,22,11,0,1004,1003,1,0,0,0,1004,1005,1,0,0,0,1005, + 1006,1,0,0,0,1006,1008,3,162,81,0,1007,1009,3,110,55,0,1008,1007, + 1,0,0,0,1008,1009,1,0,0,0,1009,1010,1,0,0,0,1010,1011,5,55,0,0,1011, + 1013,3,162,81,0,1012,1014,3,28,14,0,1013,1012,1,0,0,0,1013,1014, + 1,0,0,0,1014,1017,1,0,0,0,1015,1016,5,84,0,0,1016,1018,3,164,82, + 0,1017,1015,1,0,0,0,1017,1018,1,0,0,0,1018,1021,1,0,0,0,1019,1020, + 5,78,0,0,1020,1022,5,147,0,0,1021,1019,1,0,0,0,1021,1022,1,0,0,0, + 1022,1023,1,0,0,0,1023,1027,5,137,0,0,1024,1026,3,112,56,0,1025, + 1024,1,0,0,0,1026,1029,1,0,0,0,1027,1025,1,0,0,0,1027,1028,1,0,0, + 0,1028,1030,1,0,0,0,1029,1027,1,0,0,0,1030,1031,5,138,0,0,1031,109, + 1,0,0,0,1032,1033,3,28,14,0,1033,111,1,0,0,0,1034,1035,5,59,0,0, + 1035,1042,3,98,49,0,1036,1042,3,126,63,0,1037,1042,3,122,61,0,1038, + 1042,3,116,58,0,1039,1042,3,124,62,0,1040,1042,3,114,57,0,1041,1034, + 1,0,0,0,1041,1036,1,0,0,0,1041,1037,1,0,0,0,1041,1038,1,0,0,0,1041, + 1039,1,0,0,0,1041,1040,1,0,0,0,1042,113,1,0,0,0,1043,1044,5,56,0, + 0,1044,1045,3,162,81,0,1045,1046,5,58,0,0,1046,1047,3,162,81,0,1047, + 1048,5,136,0,0,1048,1049,3,162,81,0,1049,1050,5,134,0,0,1050,115, + 1,0,0,0,1051,1052,5,8,0,0,1052,1056,5,137,0,0,1053,1055,3,118,59, + 0,1054,1053,1,0,0,0,1055,1058,1,0,0,0,1056,1054,1,0,0,0,1056,1057, + 1,0,0,0,1057,1059,1,0,0,0,1058,1056,1,0,0,0,1059,1060,5,138,0,0, + 1060,1061,5,134,0,0,1061,117,1,0,0,0,1062,1063,3,162,81,0,1063,1064, + 5,58,0,0,1064,1065,5,61,0,0,1065,1066,3,162,81,0,1066,1067,5,134, + 0,0,1067,1077,1,0,0,0,1068,1069,3,162,81,0,1069,1070,5,58,0,0,1070, + 1071,5,62,0,0,1071,1072,3,162,81,0,1072,1073,5,136,0,0,1073,1074, + 3,162,81,0,1074,1075,5,134,0,0,1075,1077,1,0,0,0,1076,1062,1,0,0, + 0,1076,1068,1,0,0,0,1077,119,1,0,0,0,1078,1079,3,26,13,0,1079,1080, + 5,18,0,0,1080,1085,5,53,0,0,1081,1082,5,136,0,0,1082,1084,3,162, + 81,0,1083,1081,1,0,0,0,1084,1087,1,0,0,0,1085,1083,1,0,0,0,1085, + 1086,1,0,0,0,1086,1088,1,0,0,0,1087,1085,1,0,0,0,1088,1089,5,134, + 0,0,1089,121,1,0,0,0,1090,1091,5,56,0,0,1091,1092,3,162,81,0,1092, + 1093,5,58,0,0,1093,1094,5,61,0,0,1094,1095,3,162,81,0,1095,1096, + 5,134,0,0,1096,123,1,0,0,0,1097,1098,5,68,0,0,1098,1099,3,162,81, + 0,1099,1100,5,69,0,0,1100,1101,5,70,0,0,1101,1102,5,65,0,0,1102, + 1103,5,51,0,0,1103,1104,3,162,81,0,1104,1105,5,67,0,0,1105,1106, + 5,62,0,0,1106,1107,3,162,81,0,1107,1108,5,136,0,0,1108,1109,3,162, + 81,0,1109,1110,5,134,0,0,1110,125,1,0,0,0,1111,1112,5,56,0,0,1112, + 1113,3,128,64,0,1113,1114,5,58,0,0,1114,1117,3,132,66,0,1115,1116, + 5,34,0,0,1116,1118,3,164,82,0,1117,1115,1,0,0,0,1117,1118,1,0,0, + 0,1118,1119,1,0,0,0,1119,1120,5,134,0,0,1120,127,1,0,0,0,1121,1122, + 3,162,81,0,1122,1123,5,136,0,0,1123,1124,3,130,65,0,1124,129,1,0, + 0,0,1125,1138,3,162,81,0,1126,1138,5,101,0,0,1127,1138,5,91,0,0, + 1128,1138,5,92,0,0,1129,1138,5,1,0,0,1130,1138,5,98,0,0,1131,1138, + 5,99,0,0,1132,1138,5,100,0,0,1133,1138,5,102,0,0,1134,1138,5,103, + 0,0,1135,1138,5,104,0,0,1136,1138,5,105,0,0,1137,1125,1,0,0,0,1137, + 1126,1,0,0,0,1137,1127,1,0,0,0,1137,1128,1,0,0,0,1137,1129,1,0,0, + 0,1137,1130,1,0,0,0,1137,1131,1,0,0,0,1137,1132,1,0,0,0,1137,1133, + 1,0,0,0,1137,1134,1,0,0,0,1137,1135,1,0,0,0,1137,1136,1,0,0,0,1138, + 131,1,0,0,0,1139,1140,5,80,0,0,1140,1141,5,136,0,0,1141,1176,3,162, + 81,0,1142,1143,5,61,0,0,1143,1144,3,162,81,0,1144,1145,5,136,0,0, + 1145,1146,3,136,68,0,1146,1176,1,0,0,0,1147,1148,5,62,0,0,1148,1149, + 3,162,81,0,1149,1150,5,136,0,0,1150,1151,3,162,81,0,1151,1152,5, + 136,0,0,1152,1153,3,138,69,0,1153,1176,1,0,0,0,1154,1155,5,44,0, + 0,1155,1157,3,162,81,0,1156,1158,3,28,14,0,1157,1156,1,0,0,0,1157, + 1158,1,0,0,0,1158,1159,1,0,0,0,1159,1160,5,136,0,0,1160,1161,3,128, + 64,0,1161,1176,1,0,0,0,1162,1163,5,46,0,0,1163,1164,3,162,81,0,1164, + 1165,5,136,0,0,1165,1167,3,162,81,0,1166,1168,3,28,14,0,1167,1166, + 1,0,0,0,1167,1168,1,0,0,0,1168,1170,1,0,0,0,1169,1171,3,140,70,0, + 1170,1169,1,0,0,0,1170,1171,1,0,0,0,1171,1173,1,0,0,0,1172,1174, + 3,134,67,0,1173,1172,1,0,0,0,1173,1174,1,0,0,0,1174,1176,1,0,0,0, + 1175,1139,1,0,0,0,1175,1142,1,0,0,0,1175,1147,1,0,0,0,1175,1154, + 1,0,0,0,1175,1162,1,0,0,0,1176,133,1,0,0,0,1177,1178,5,66,0,0,1178, + 1179,3,140,70,0,1179,135,1,0,0,0,1180,1181,7,4,0,0,1181,137,1,0, + 0,0,1182,1183,7,5,0,0,1183,139,1,0,0,0,1184,1185,5,64,0,0,1185,1189, + 5,137,0,0,1186,1188,3,142,71,0,1187,1186,1,0,0,0,1188,1191,1,0,0, + 0,1189,1187,1,0,0,0,1189,1190,1,0,0,0,1190,1192,1,0,0,0,1191,1189, + 1,0,0,0,1192,1193,5,138,0,0,1193,141,1,0,0,0,1194,1195,3,162,81, + 0,1195,1196,5,58,0,0,1196,1197,5,9,0,0,1197,1198,5,23,0,0,1198,1199, + 5,139,0,0,1199,1200,3,86,43,0,1200,1201,5,140,0,0,1201,1202,5,134, + 0,0,1202,1293,1,0,0,0,1203,1204,3,162,81,0,1204,1205,5,58,0,0,1205, + 1206,5,61,0,0,1206,1213,3,162,81,0,1207,1208,5,67,0,0,1208,1209, + 5,62,0,0,1209,1210,3,162,81,0,1210,1211,5,136,0,0,1211,1212,3,162, + 81,0,1212,1214,1,0,0,0,1213,1207,1,0,0,0,1213,1214,1,0,0,0,1214, + 1215,1,0,0,0,1215,1216,5,134,0,0,1216,1293,1,0,0,0,1217,1218,3,162, + 81,0,1218,1219,5,58,0,0,1219,1220,5,62,0,0,1220,1221,3,162,81,0, + 1221,1222,5,136,0,0,1222,1229,3,162,81,0,1223,1224,5,67,0,0,1224, + 1225,5,62,0,0,1225,1226,3,162,81,0,1226,1227,5,136,0,0,1227,1228, + 3,162,81,0,1228,1230,1,0,0,0,1229,1223,1,0,0,0,1229,1230,1,0,0,0, + 1230,1231,1,0,0,0,1231,1232,5,134,0,0,1232,1293,1,0,0,0,1233,1234, + 3,162,81,0,1234,1235,5,58,0,0,1235,1236,5,44,0,0,1236,1238,3,162, + 81,0,1237,1239,3,28,14,0,1238,1237,1,0,0,0,1238,1239,1,0,0,0,1239, + 1248,1,0,0,0,1240,1241,5,67,0,0,1241,1242,5,62,0,0,1242,1243,3,162, + 81,0,1243,1244,5,136,0,0,1244,1245,3,162,81,0,1245,1249,1,0,0,0, + 1246,1247,5,18,0,0,1247,1249,5,53,0,0,1248,1240,1,0,0,0,1248,1246, + 1,0,0,0,1248,1249,1,0,0,0,1249,1250,1,0,0,0,1250,1251,5,134,0,0, + 1251,1293,1,0,0,0,1252,1253,3,162,81,0,1253,1254,5,58,0,0,1254,1255, + 5,7,0,0,1255,1256,3,162,81,0,1256,1257,5,64,0,0,1257,1261,5,137, + 0,0,1258,1260,3,120,60,0,1259,1258,1,0,0,0,1260,1263,1,0,0,0,1261, + 1259,1,0,0,0,1261,1262,1,0,0,0,1262,1264,1,0,0,0,1263,1261,1,0,0, + 0,1264,1265,5,138,0,0,1265,1266,5,134,0,0,1266,1293,1,0,0,0,1267, + 1268,3,162,81,0,1268,1269,5,58,0,0,1269,1270,5,51,0,0,1270,1271, + 3,162,81,0,1271,1272,5,134,0,0,1272,1293,1,0,0,0,1273,1274,3,162, + 81,0,1274,1276,5,58,0,0,1275,1277,5,9,0,0,1276,1275,1,0,0,0,1276, + 1277,1,0,0,0,1277,1278,1,0,0,0,1278,1279,5,22,0,0,1279,1280,3,162, + 81,0,1280,1281,5,136,0,0,1281,1288,3,162,81,0,1282,1283,5,67,0,0, + 1283,1284,5,62,0,0,1284,1285,3,162,81,0,1285,1286,5,136,0,0,1286, + 1287,3,162,81,0,1287,1289,1,0,0,0,1288,1282,1,0,0,0,1288,1289,1, + 0,0,0,1289,1290,1,0,0,0,1290,1291,5,134,0,0,1291,1293,1,0,0,0,1292, + 1194,1,0,0,0,1292,1203,1,0,0,0,1292,1217,1,0,0,0,1292,1233,1,0,0, + 0,1292,1252,1,0,0,0,1292,1267,1,0,0,0,1292,1273,1,0,0,0,1293,143, + 1,0,0,0,1294,1295,5,51,0,0,1295,1296,3,162,81,0,1296,1297,5,58,0, + 0,1297,1298,3,162,81,0,1298,1299,5,136,0,0,1299,1301,3,162,81,0, + 1300,1302,3,140,70,0,1301,1300,1,0,0,0,1301,1302,1,0,0,0,1302,1303, + 1,0,0,0,1303,1304,5,134,0,0,1304,145,1,0,0,0,1305,1352,3,150,75, + 0,1306,1352,5,113,0,0,1307,1352,5,114,0,0,1308,1309,5,115,0,0,1309, + 1352,3,164,82,0,1310,1311,5,116,0,0,1311,1312,5,143,0,0,1312,1313, + 3,162,81,0,1313,1314,5,144,0,0,1314,1352,1,0,0,0,1315,1316,5,117, + 0,0,1316,1317,5,143,0,0,1317,1319,3,162,81,0,1318,1320,3,28,14,0, + 1319,1318,1,0,0,0,1319,1320,1,0,0,0,1320,1321,1,0,0,0,1321,1322, + 5,144,0,0,1322,1352,1,0,0,0,1323,1324,5,39,0,0,1324,1325,5,143,0, + 0,1325,1326,3,162,81,0,1326,1327,5,144,0,0,1327,1352,1,0,0,0,1328, + 1329,5,118,0,0,1329,1330,5,143,0,0,1330,1331,3,146,73,0,1331,1332, + 5,144,0,0,1332,1352,1,0,0,0,1333,1334,5,119,0,0,1334,1335,5,143, + 0,0,1335,1336,3,146,73,0,1336,1337,5,144,0,0,1337,1352,1,0,0,0,1338, + 1339,5,120,0,0,1339,1343,5,137,0,0,1340,1342,3,148,74,0,1341,1340, + 1,0,0,0,1342,1345,1,0,0,0,1343,1341,1,0,0,0,1343,1344,1,0,0,0,1344, + 1346,1,0,0,0,1345,1343,1,0,0,0,1346,1352,5,138,0,0,1347,1349,3,162, + 81,0,1348,1350,3,28,14,0,1349,1348,1,0,0,0,1349,1350,1,0,0,0,1350, + 1352,1,0,0,0,1351,1305,1,0,0,0,1351,1306,1,0,0,0,1351,1307,1,0,0, + 0,1351,1308,1,0,0,0,1351,1310,1,0,0,0,1351,1315,1,0,0,0,1351,1323, + 1,0,0,0,1351,1328,1,0,0,0,1351,1333,1,0,0,0,1351,1338,1,0,0,0,1351, + 1347,1,0,0,0,1352,147,1,0,0,0,1353,1354,3,162,81,0,1354,1355,5,133, + 0,0,1355,1356,3,146,73,0,1356,1357,5,134,0,0,1357,149,1,0,0,0,1358, + 1359,7,6,0,0,1359,151,1,0,0,0,1360,1361,7,7,0,0,1361,153,1,0,0,0, + 1362,1371,3,164,82,0,1363,1371,5,147,0,0,1364,1371,5,148,0,0,1365, + 1371,5,129,0,0,1366,1371,5,130,0,0,1367,1371,5,131,0,0,1368,1371, + 3,156,78,0,1369,1371,3,160,80,0,1370,1362,1,0,0,0,1370,1363,1,0, + 0,0,1370,1364,1,0,0,0,1370,1365,1,0,0,0,1370,1366,1,0,0,0,1370,1367, + 1,0,0,0,1370,1368,1,0,0,0,1370,1369,1,0,0,0,1371,155,1,0,0,0,1372, + 1381,5,137,0,0,1373,1378,3,158,79,0,1374,1375,5,135,0,0,1375,1377, + 3,158,79,0,1376,1374,1,0,0,0,1377,1380,1,0,0,0,1378,1376,1,0,0,0, + 1378,1379,1,0,0,0,1379,1382,1,0,0,0,1380,1378,1,0,0,0,1381,1373, + 1,0,0,0,1381,1382,1,0,0,0,1382,1383,1,0,0,0,1383,1384,5,138,0,0, + 1384,157,1,0,0,0,1385,1386,3,164,82,0,1386,1387,5,133,0,0,1387,1388, + 3,154,77,0,1388,159,1,0,0,0,1389,1398,5,139,0,0,1390,1395,3,154, + 77,0,1391,1392,5,135,0,0,1392,1394,3,154,77,0,1393,1391,1,0,0,0, + 1394,1397,1,0,0,0,1395,1393,1,0,0,0,1395,1396,1,0,0,0,1396,1399, + 1,0,0,0,1397,1395,1,0,0,0,1398,1390,1,0,0,0,1398,1399,1,0,0,0,1399, + 1400,1,0,0,0,1400,1401,5,140,0,0,1401,161,1,0,0,0,1402,1403,7,8, + 0,0,1403,163,1,0,0,0,1404,1405,5,150,0,0,1405,165,1,0,0,0,126,178, + 185,206,219,231,251,259,266,272,284,287,293,304,313,323,326,328, + 332,340,352,357,367,377,382,397,403,415,424,432,440,453,456,466, + 470,476,483,489,497,505,518,525,529,534,545,551,562,588,592,598, + 609,618,624,629,631,662,666,672,699,709,720,723,728,731,738,747, + 750,753,770,779,793,814,817,820,827,835,867,879,882,886,908,922, + 930,942,956,966,984,988,991,995,998,1004,1008,1013,1017,1021,1027, + 1041,1056,1076,1085,1117,1137,1157,1167,1170,1173,1175,1189,1213, + 1229,1238,1248,1261,1276,1288,1292,1301,1319,1343,1349,1351,1370, + 1378,1381,1395,1398 ]; private static __ATN: antlr.ATN; @@ -8117,8 +8130,14 @@ export class DependencyPortContext extends antlr.ParserRuleContext { public ID(): antlr.TerminalNode { return this.getToken(QuixosCapabilityParser.ID, 0)!; } - public stringLiteral(): StringLiteralContext { - return this.getRuleContext(0, StringLiteralContext)!; + public stringLiteral(): StringLiteralContext[]; + public stringLiteral(i: number): StringLiteralContext | null; + public stringLiteral(i?: number): StringLiteralContext[] | StringLiteralContext | null { + if (i === undefined) { + return this.getRuleContexts(StringLiteralContext); + } + + return this.getRuleContext(i, StringLiteralContext); } public LBRACK(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.LBRACK, 0); @@ -8153,6 +8172,9 @@ export class DependencyPortContext extends antlr.ParserRuleContext { public targetConstraint(): TargetConstraintContext | null { return this.getRuleContext(0, TargetConstraintContext); } + public KEYED(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.KEYED, 0); + } public INTERFACE(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.INTERFACE, 0); } diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index dd8a39b..3f3d135 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -445,6 +445,7 @@ const relationshipOperation = ( id: InterfaceOperation["id"], target: EdgeEndpointConstraint, cardinality: EdgeCardinality, + keyType?: "string" | "boolean" | "int64", ): InterfaceOperation => { const targetType = target.kind === "atom" ? valueType.atomRef(target.atomId) : valueType.interfaceRef(target.interfaceRevisionId); @@ -463,7 +464,16 @@ const relationshipOperation = ( return { id, displayName, - inputType: targetType, + inputType: + keyType && displayName === "connect" + ? { + kind: "record", + fields: { + mapKey: { kind: "scalar", name: keyType === "boolean" ? "bool" : keyType }, + target: targetType, + }, + } + : targetType, outputType: valueType.unit, mode: "call", }; @@ -545,6 +555,9 @@ const lowerRelationshipMember = ( return undefined; } const cardinality = lowerCardinality(context.cardinality()); + const keyType = context.KEYED() + ? (stringValue(context.stringLiteral(1)) as "string" | "boolean" | "int64") + : undefined; const operations: InterfaceOperation[] = []; for (const operation of context.relationshipOperation()) { if (operation.RESOLVE()) { @@ -554,6 +567,7 @@ const lowerRelationshipMember = ( capabilityId.operation(stringValue(operation.stringLiteral(0))), target, cardinality, + keyType, ), ); } else if (operation.CONNECT()) { @@ -563,6 +577,7 @@ const lowerRelationshipMember = ( capabilityId.operation(stringValue(operation.stringLiteral(0))), target, cardinality, + keyType, ), ); } else if (operation.DISCONNECT()) { @@ -572,6 +587,7 @@ const lowerRelationshipMember = ( capabilityId.operation(stringValue(operation.stringLiteral(0))), target, cardinality, + keyType, ), ); } else { @@ -581,12 +597,14 @@ const lowerRelationshipMember = ( capabilityId.operation(stringValue(operation.stringLiteral(0))), target, cardinality, + keyType, ), relationshipOperation( "watch-stop", capabilityId.operation(stringValue(operation.stringLiteral(1))), target, cardinality, + keyType, ), ); } @@ -847,6 +865,15 @@ const lowerInterfaceTemplate = ( const target = types.targetExpression(relationship.targetConstraint()); const targetType: ValueTypeExpression = { kind: "object-ref", expectation: target }; const cardinality = lowerCardinality(relationship.cardinality()); + const keyType = relationship.KEYED() + ? (stringValue(relationship.stringLiteral(1)) as "string" | "boolean" | "int64") + : undefined; + const keyedTarget: ValueTypeExpression = keyType + ? { + kind: "record", + fields: { mapKey: { kind: "scalar", name: keyType === "boolean" ? "bool" : keyType }, target: targetType }, + } + : targetType; const resolved: ValueTypeExpression = cardinality === "exactly-one" ? targetType @@ -872,6 +899,7 @@ const lowerInterfaceTemplate = ( target, cardinality, ordered: Boolean(relationship.ORDERED()), + ...(keyType ? { keyType } : {}), operations: relationship.relationshipOperation().flatMap((operation) => { const id = capabilityId.operation(stringValue(operation.stringLiteral(0))); if (operation.RESOLVE()) @@ -881,7 +909,12 @@ const lowerInterfaceTemplate = ( if (operation.CONNECT() || operation.DISCONNECT()) return [ { - ...signature(operation.CONNECT() ? "connect" : "disconnect", id, targetType, valueType.unit), + ...signature( + operation.CONNECT() ? "connect" : "disconnect", + id, + operation.CONNECT() ? keyedTarget : targetType, + valueType.unit, + ), ...lowerExecution(operation.executionClause()), }, ]; @@ -957,7 +990,7 @@ const lowerQueryReference = ( const lowerDependencyPort = (state: LoweringState, context: DependencyPortContext): DependencyPort | undefined => { const name = identifier(context.identifier(0)); - const id = capabilityId.dependencyPort(stringValue(context.stringLiteral())); + const id = capabilityId.dependencyPort(stringValue(context.stringLiteral(0))); if (context.REFLECTION()) return { id, @@ -1016,6 +1049,9 @@ const lowerDependencyPort = (state: LoweringState, context: DependencyPortContex kind: "edge", target, cardinality: lowerCardinality(context.cardinality()), + ...(context.KEYED() + ? { keyType: stringValue(context.stringLiteral(1)) as "string" | "boolean" | "int64" } + : {}), primitives: primitives.filter((entry) => !invalid.includes(entry)) as EdgePrimitive[], }, }; @@ -1218,7 +1254,7 @@ const lowerGenericPackageExport = ( const parameters = state.types.declareParameters(context.typeParameters(), JSON.stringify(["export", id])); const dependencyPorts = (context.dependencyBlock()?.dependencyPort() ?? []).map((port): GenericDependencyPort => { const base = { - id: capabilityId.dependencyPort(stringValue(port.stringLiteral())), + id: capabilityId.dependencyPort(stringValue(port.stringLiteral(0))), displayName: identifier(port.identifier(0)), }; const primitives = @@ -1257,6 +1293,7 @@ const lowerGenericPackageExport = ( kind: "edge", target: state.types.targetExpression(port.targetConstraint()!), cardinality: lowerCardinality(port.cardinality()!), + ...(port.KEYED() ? { keyType: stringValue(port.stringLiteral(1)) as "string" | "boolean" | "int64" } : {}), primitives: primitives as EdgePrimitive[], }, }; @@ -2182,10 +2219,25 @@ const lowerConformanceRule = (state: LoweringState, context: ConformanceDeclCont } else if (provider.STATE() || provider.EDGE()) { const name = identifier(provider.identifier(0)); const expected = provider.STATE() ? "state" : "edge"; - // A rule may traverse another owner's public inverse projection, just as - // a concrete conformance may. Resolve external edges after specialization; - // ordinary ownership validation still permits only public resolve access. - if (provider.EDGE() && !privateStorage.has(name)) continue; + // Concrete attachments are registered before rules, so unused rules can + // also check public traversal without waiting for an application. + if (provider.EDGE() && !privateStorage.has(name)) { + const external = requireSymbol(state, state.attachments, name, provider, "attachment"); + const projection = + external?.attachment.kind === "edge" + ? external.attachment.endpoints.find( + (endpoint) => endpoint.displayName === identifier(provider.identifier(1)), + ) + : undefined; + if (external && (!projection?.publicTraversal || text(provider.edgePrimitive()) !== "resolve")) + loweringIssue( + state, + provider, + "invalid-rule-storage-binding", + "External rule storage access requires a public edge resolve projection", + ); + continue; + } if (privateStorage.get(name) !== expected) loweringIssue( state, diff --git a/src/capability-model/generic-packages.ts b/src/capability-model/generic-packages.ts index ac3e953..648923a 100644 --- a/src/capability-model/generic-packages.ts +++ b/src/capability-model/generic-packages.ts @@ -32,6 +32,7 @@ export type GenericDependencyPort = Omit & { kind: "edge"; target: ObjectTypeExpression; cardinality: Extract["cardinality"]; + keyType?: "string" | "boolean" | "int64"; primitives: Extract["primitives"]; } | { diff --git a/src/capability-model/initialization.ts b/src/capability-model/initialization.ts index 65204a9..1206066 100644 --- a/src/capability-model/initialization.ts +++ b/src/capability-model/initialization.ts @@ -33,6 +33,13 @@ export function validateInitialization(workspace: WorkspaceRevision): Capability fail(ownerKey(owner), `Initialization input ${field.input} must name an edge projection on the newborn atom`); return; } + if (target.keyType) { + fail( + ownerKey(owner), + "Initialize a keyed relationship through its keyed projection; inverse seeds cannot supply a map key", + ); + return; + } if (endpoint.cardinality === "many" || endpoint.cardinality === "many-unique") { const fields: Record = { key: { kind: "scalar", name: "string" }, diff --git a/src/capability-model/types.ts b/src/capability-model/types.ts index f9a4fc5..b3002af 100644 --- a/src/capability-model/types.ts +++ b/src/capability-model/types.ts @@ -250,6 +250,7 @@ export type DependencyPortRequirement = kind: "edge"; target: EdgeEndpointConstraint; cardinality: EdgeCardinality; + keyType?: "string" | "boolean" | "int64"; primitives: EdgePrimitive[]; } | { diff --git a/src/capability-model/validation.ts b/src/capability-model/validation.ts index 0d3fcae..0f59f4e 100644 --- a/src/capability-model/validation.ts +++ b/src/capability-model/validation.ts @@ -439,7 +439,19 @@ export const edgePrimitiveSignature = ( case "disconnect": return { mode: "call", - inputType: targetType, + inputType: + primitive === "connect" && projection.endpoint.keyType + ? { + kind: "record", + fields: { + mapKey: { + kind: "scalar", + name: projection.endpoint.keyType === "boolean" ? "bool" : projection.endpoint.keyType, + }, + target: targetType, + }, + } + : targetType, outputType: valueType.unit, }; case "watch-start": @@ -1398,6 +1410,13 @@ const validateBoundDependencies = ( ); break; } + if (projection.target.keyType && requirement.primitives.includes("connect")) + issue( + issues, + "invalid-dependency-binding", + path, + "Connect through the keyed projection so the caller supplies a map key", + ); const traversal = edgeBinding.via ? validateTraversal( issues, @@ -1434,13 +1453,14 @@ const validateBoundDependencies = ( requirement.target, params.indexes.conformances, ) || - requirement.cardinality !== projection.endpoint.cardinality + requirement.cardinality !== projection.endpoint.cardinality || + requirement.keyType !== projection.endpoint.keyType ) { issue( issues, "invalid-dependency-binding", `${path}.binding`, - `Edge port target or cardinality does not match projection ${edgeBinding.projectionId}`, + `Edge port target, cardinality or key type does not match projection ${edgeBinding.projectionId}`, ); } break; @@ -1822,6 +1842,13 @@ const validateConformances = ( continue; } const projection = edgeProjection(attachment.attachment, binding.projectionId); + if (projection?.target.keyType && binding.primitive === "connect") + issue( + issues, + "invalid-edge-binding", + bindingPath, + "Connect through the keyed projection so the caller supplies a map key", + ); // An owned endpoint may explicitly export read-only traversal, including // a native inverse relationship view. This never exports mutation rights. if (!(binding.primitive === "resolve" && projection?.endpoint.publicTraversal)) { diff --git a/src/execution-world/kernel.ts b/src/execution-world/kernel.ts index fbc6bf7..52f3082 100644 --- a/src/execution-world/kernel.ts +++ b/src/execution-world/kernel.ts @@ -53,11 +53,11 @@ export function compileKernelProgram(plan: ExecutionPlan): unknown { }); } else { const endpoints = storage.endpoints.map((endpoint) => { - if (endpoint.ordered || endpoint.keyType || endpoint.retainOther) + if (endpoint.ordered || (endpoint.keyType && endpoint.keyType !== "string") || endpoint.retainOther) throw new ExecutionPlanError( "UNSUPPORTED_GRAPH_FEATURE", storage.id, - "Ordered/keyed relations and automatic retention are not implemented", + "Ordered relations, non-string keys and automatic retention are not implemented", ); return { projection: endpoint.projectionId, @@ -69,6 +69,7 @@ export function compileKernelProgram(plan: ExecutionPlan): unknown { : endpoint.constraint.interfaceRevisionId, }, cardinality: endpoint.cardinality, + ...(endpoint.keyType ? { keyType: endpoint.keyType } : {}), ...(endpoint.onDelete ? { onDelete: endpoint.onDelete } : {}), }; }); diff --git a/src/execution-world/query-operators.ts b/src/execution-world/query-operators.ts index 3555478..713eec9 100644 --- a/src/execution-world/query-operators.ts +++ b/src/execution-world/query-operators.ts @@ -10,11 +10,7 @@ export function unsupportedQueryOperator(query: CheckedQuery): string | undefine if (value.kind === "reduce") return "aggregate predicates"; if (value.kind === "and" || value.kind === "or") return value.children.map(predicate).find(Boolean); if (value.kind === "not") return predicate(value.child); - if (value.kind === "compare") - return ( - path(value.expression.path) ?? - (value.expression.leaf.kind === "mapKey" ? "keyed relationship operands" : undefined) - ); + if (value.kind === "compare") return path(value.expression.path); if (value.kind === "relation") return path(value.path) ?? (value.predicate && predicate(value.predicate)); return undefined; }; diff --git a/src/query/compile.ts b/src/query/compile.ts index 6ac0e6d..d9b6ec1 100644 --- a/src/query/compile.ts +++ b/src/query/compile.ts @@ -230,7 +230,13 @@ export async function compileQuery( fail("QUERY_UNSUPPORTED_FEATURE", "Bounded-all does not accept a continuation", node); for (const argument of node.arguments ?? []) { if (argument.name.value === "where") - compiledPredicates.set(node, relational.predicate(objectRow(target), argument.value)); + compiledPredicates.set( + node, + relational.predicate( + objectRow(target, member.keyType ? { keyType: member.keyType } : undefined), + argument.value, + ), + ); if (argument.name.value === "orderBy") inputEffects(target, argument.value, "order"); if ( ["first", "all"].includes(argument.name.value) && diff --git a/src/query/schema.ts b/src/query/schema.ts index 63a0cc5..ea9e2a1 100644 --- a/src/query/schema.ts +++ b/src/query/schema.ts @@ -242,7 +242,11 @@ export function querySchema( first: { type: GraphQLInt }, all: { type: GraphQLInt }, after: { type: cursorScalar }, - where: { type: filter(targetId) }, + where: { + type: member.keyType + ? relational.where(objectRow(targetId, { keyType: member.keyType })) + : filter(targetId), + }, ...(ordering ? { orderBy: { type: new GraphQLList(new GraphQLNonNull(ordering)) } } : {}), }, }; diff --git a/test/conformance-rules.test.ts b/test/conformance-rules.test.ts index b274720..dd87d88 100644 --- a/test/conformance-rules.test.ts +++ b/test/conformance-rules.test.ts @@ -344,4 +344,11 @@ test("rule inverse reads retain the concrete conformance ownership checks", () = const missing = compile(source.replace("Membership.parent.resolve", "Missing.parent.resolve")); assert.equal(missing.ok, false); assert.match(JSON.stringify(missing.diagnostics), /Unknown attachment/); + const unused = compile( + source + .replace('conform C as Child id "child-impl" {}', "") + .replace("Membership.parent.resolve", "Missing.parent.resolve"), + ); + assert.equal(unused.ok, false); + assert.match(JSON.stringify(unused.diagnostics), /Unknown attachment/); }); diff --git a/test/emit-portable-reader.ts b/test/emit-portable-reader.ts index 92d90d9..6ba595a 100644 --- a/test/emit-portable-reader.ts +++ b/test/emit-portable-reader.ts @@ -129,6 +129,10 @@ await writeFile("dist/portable-reader/collections/kernel.json", JSON.stringify(c const { presentationMountPlan } = await import("./presentation-mount-fixture.js"); const presentationMount = await presentationMountPlan(); await mkdir("dist/portable-reader/presentation-mount", { recursive: true }); +await writeFile( + "dist/portable-reader/presentation-mount/queries.json", + JSON.stringify(compileQueryProgram(presentationMount)), +); await writeFile("dist/portable-reader/presentation-mount/plan.json", JSON.stringify(presentationMount)); await writeFile( "dist/portable-reader/presentation-mount/kernel.json", diff --git a/test/fixtures/presentation-mount/PresentationRuntime.qx b/test/fixtures/presentation-mount/PresentationRuntime.qx index d7f9788..37137bb 100644 --- a/test/fixtures/presentation-mount/PresentationRuntime.qx +++ b/test/fixtures/presentation-mount/PresentationRuntime.qx @@ -1,3 +1,6 @@ +import interface PresentationStates; +import interface ReaderNavigation; +external atom ReaderNavigationRecord id "reader-navigation-record"; import interface PresentationState; import interface PresentationMount; import interface StateFactory; @@ -12,7 +15,7 @@ package PresentationRuntime id "presentation-runtime" revision "presentation-run interface metadata id "state" : PresentationState using [presentationMount.resolve,parent.resolve] from input; }; operation ensure id "presentation-runtime:ensure" : record {presentationMount:interface-ref;occurrence:string;parent:optional>;} -> ref mode call execution transaction targets [browser,server] receiver any requires { - edge states id "states" : many-unique object Navigation [resolve,connect]; + edge states id "states" : many-unique object Navigation keyed "string" [resolve,connect]; interface metadata id "state" : PresentationState using [occurrence.get,presentationMount.resolve,parent.resolve] from input; interface presentationMount id "presentationMount" : PresentationMount using [attach.call] from input; interface factory id "factory" : StateFactory using [create.call]; @@ -20,4 +23,8 @@ package PresentationRuntime id "presentation-runtime" revision "presentation-run function createState id "presentation-runtime:create-state" : record {occurrence:string;parent:optional>;} -> ref execution transaction targets [browser,server] requires { creation navigation id "navigation" : Navigation input record {occurrence:string;parent:optional>;}; }; + query ReaderStateInputs id "reader-state:inputs" root PresentationStates document "queries/reader-inputs.graphql" operation "ReaderState" { replica; view ReaderNavigationRecord as ReaderNavigation; max rows 100; } + query ReaderStateView id "reader-state:view" root PresentationStates document "queries/reader-state.graphql" operation "ReaderState" { local from ReaderStateInputs; watch; view ReaderNavigationRecord as ReaderNavigation; max rows 100; } + query ReaderWindowInputs id "reader-state:window-inputs" root PresentationStates document "queries/reader-window.graphql" operation "ReaderState" { replica; view ReaderNavigationRecord as ReaderNavigation; max rows 100; } + query ReaderWindowView id "reader-state:window-view" root PresentationStates document "queries/reader-window.graphql" operation "ReaderState" { local from ReaderWindowInputs; watch; view ReaderNavigationRecord as ReaderNavigation; max rows 100; } } diff --git a/test/fixtures/presentation-mount/PresentationStates.qx b/test/fixtures/presentation-mount/PresentationStates.qx index 55eac33..a5153af 100644 --- a/test/fixtures/presentation-mount/PresentationStates.qx +++ b/test/fixtures/presentation-mount/PresentationStates.qx @@ -1,7 +1,7 @@ import interface PresentationState; import interface PresentationMount; interface PresentationStates id "presentation-states" revision "presentation-states@1" { - queryable relation states id "presentation-states:states" : many-unique object Navigation { + queryable relation states id "presentation-states:states" : many-unique object Navigation keyed "string" { resolve id "presentation-states:states:resolve" execution snapshot targets [browser,server]; } operation ensure id "presentation-states:ensure" : record {presentationMount:interface-ref;occurrence:string;parent:optional>;} -> ref { diff --git a/test/fixtures/presentation-mount/queries/reader-inputs.graphql b/test/fixtures/presentation-mount/queries/reader-inputs.graphql new file mode 100644 index 0000000..e586c15 --- /dev/null +++ b/test/fixtures/presentation-mount/queries/reader-inputs.graphql @@ -0,0 +1,7 @@ +query ReaderState { + root { + states(all: 100) { + entries { key mapKey node { _camino { ref } page } } + } + } +} diff --git a/test/fixtures/presentation-mount/queries/reader-state.graphql b/test/fixtures/presentation-mount/queries/reader-state.graphql new file mode 100644 index 0000000..7de27cf --- /dev/null +++ b/test/fixtures/presentation-mount/queries/reader-state.graphql @@ -0,0 +1,7 @@ +query ReaderState($key: String!) { + root { + states(all: 100, where: {_camino: {mapKey: {eq: $key}}}) { + entries { key mapKey node { _camino { ref } page } } + } + } +} diff --git a/test/fixtures/presentation-mount/queries/reader-window.graphql b/test/fixtures/presentation-mount/queries/reader-window.graphql new file mode 100644 index 0000000..a76550c --- /dev/null +++ b/test/fixtures/presentation-mount/queries/reader-window.graphql @@ -0,0 +1,7 @@ +query ReaderState($key: String!) { + root { + states(first: 100, where: {_camino: {mapKey: {eq: $key}}}) { + entries { key mapKey node { _camino { ref } page } } + } + } +} diff --git a/test/fixtures/presentation-mount/workspace.qx b/test/fixtures/presentation-mount/workspace.qx index debd2a9..41d37c6 100644 --- a/test/fixtures/presentation-mount/workspace.qx +++ b/test/fixtures/presentation-mount/workspace.qx @@ -10,6 +10,7 @@ workspace Example id "presentation-example" revision "presentation-example@1" co import package PresentationRuntime; atom PresentationMountRecord id "presentation-mount-record"; atom Library id "library"; + atom OtherLibrary id "other-library"; atom Document id "document"; atom ReaderNavigationRecord id "reader-navigation-record"; atom DocumentNavigationRecord id "document-navigation-record"; @@ -34,8 +35,8 @@ workspace Example id "presentation-example" revision "presentation-example@1" co } conform Presentation as PresentationStates id "presentation:state-association" { private edge States id "presentation:states-edge" { - atom Self projection states id "presentation:states-projection" many-unique; - object Navigation projection subject id "presentation:subject-projection" exactly-one; + atom Self projection states id "presentation:states-projection" many-unique keyed "string"; + object Navigation projection subject id "presentation:subject-projection" optional-one; } bind states.resolve to edge States.states.resolve; bind ensure.call to package PresentationRuntime.ensure with { @@ -78,4 +79,10 @@ workspace Example id "presentation-example" revision "presentation-example@1" co } conform Library as Presentation id "library:presentation" {} conform Document as Presentation id "document:presentation" {} + conform OtherLibrary as StateFactory id "other-reader:factory" { + bind create.call to package PresentationRuntime.createState with { + navigation to creation ReaderNavigationRecord with {PresentationState from input;}; + }; + } + conform OtherLibrary as Presentation id "other-library:presentation" {} } diff --git a/test/keyed-relationships.test.ts b/test/keyed-relationships.test.ts new file mode 100644 index 0000000..6827552 --- /dev/null +++ b/test/keyed-relationships.test.ts @@ -0,0 +1,78 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { + compileCapabilityResourceSource, + compileCapabilitySource, + formatQx, +} from "../src/capability-language/index.js"; +import { compileExecutionPlan } from "../src/execution-world/plan.js"; +import { compileKernelProgram } from "../src/execution-world/kernel.js"; +import { generatePortableTypeScriptBindings } from "../src/bindings/portable.js"; +const source = { repository: "https://example.test/keyed.git", commit: "a".repeat(40) }; +const iface = compileCapabilityResourceSource( + `interface Index id "index" revision "index@1" { + queryable relation entries id "entries" : many object Item keyed "string" { + resolve id "resolve" execution snapshot targets [browser,server]; + connect id "connect" execution transaction targets [browser,server]; + } + operation add id "add" : record {mapKey:string;target:ref;} -> unit { + call id "add-call" execution transaction targets [browser,server]; + } +}`, + { source }, +); +assert.ok(iface.ok && iface.resource.kind === "interface", JSON.stringify(iface.diagnostics)); +const pkg = compileCapabilityResourceSource( + `package Runtime id "runtime" revision "runtime@1" { + operation add id "add" : record {mapKey:string;target:ref;} -> unit mode call execution transaction targets [browser,server] receiver any requires { + edge entries id "entries" : many object Item keyed "string" [resolve,connect]; + }; +}`, + { source }, +); +assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); +const indexContract = iface.resource.revision, + runtimeContract = pkg.resource.revision; +const declarations = `workspace W id "w" revision "w@1" commit "${source.commit}" { + import interface Index; import package Runtime; atom Node id "node"; + conform Node as Index id "node:index" { + private edge Entries id "entries" { + atom Node projection entries id "entries" many keyed "string"; + atom Node projection parent id "parent" optional-one; + } + bind entries.resolve to edge Entries.entries.resolve; + bind entries.connect to edge Entries.entries.connect; + bind add.call to package Runtime.add with {entries to edge Entries.entries;}; + } +}`; +const compile = (text = declarations) => + compileCapabilitySource(formatQx(text), "workspace.qx", { + interfaces: new Map([["Index", indexContract]]), + packages: new Map([["Runtime", runtimeContract]]), + }); +test("generic keyed relationships and portable ports have matching checked shapes", () => { + const result = compile(); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const closed = result.workspace.interfaceImports.find((i) => i.application)!; + assert.equal(closed.members[0]!.kind, "relationship"); + assert.equal("keyType" in closed.members[0]! && closed.members[0]!.keyType, "string"); + const operation = closed.members[0]!.operations.find((o) => o.displayName === "connect")!; + assert.equal(operation.inputType.kind, "record"); + const plan = compileExecutionPlan(result.workspace); + assert.doesNotThrow(() => compileKernelProgram(plan)); + const bindings = generatePortableTypeScriptBindings(plan.definition.bindingSchema, "runtime@1", { + target: "browser", + }); + assert.match(bindings, /readonly "mapKey": string/); + assert.match(bindings, /readonly "connect": \(input: \{ readonly "mapKey": string;/); +}); +test("key contracts cannot silently bind to unkeyed storage or the inverse projection", () => { + for (const text of [ + declarations.replace('many keyed "string";', "many;"), + declarations.replace("entries to edge Entries.entries", "entries to edge Entries.parent"), + ]) { + const result = compile(text); + assert.equal(result.ok, false); + assert.match(JSON.stringify(result.diagnostics), /key type|keyed projection|signature/i); + } +}); diff --git a/test/presentation-mount-fixture.ts b/test/presentation-mount-fixture.ts index 16a5c06..57dc309 100644 --- a/test/presentation-mount-fixture.ts +++ b/test/presentation-mount-fixture.ts @@ -3,6 +3,7 @@ import { readFile } from "node:fs/promises"; import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/parser.js"; import { compileExecutionPlan } from "../src/execution-world/plan.js"; import type { InterfaceRevision } from "../src/capability-model/types.js"; +import { compileQuery } from "../src/query/compile.js"; export async function presentationMountPlan() { const read = (name: string) => readFile(`test/fixtures/presentation-mount/${name}.qx`, "utf8"); const source = { repository: "https://example.test/presentation-mount.git", commit: "a".repeat(40) }; @@ -31,5 +32,13 @@ export async function presentationMountPlan() { packages: new Map([["PresentationRuntime", pkg.resource.revision]]), }); assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const runtime = result.workspace.packageImports[0]!; + runtime.checkedQueries = await Promise.all( + runtime.queries!.map((query) => + compileQuery(query, result.workspace.interfaceImports, (path) => + readFile(`test/fixtures/presentation-mount/${path}`, "utf8"), + ), + ), + ); return compileExecutionPlan(result.workspace); } From 76d5cff6fb1bd18984f1998cf8629b2acecd54f2 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Fri, 25 Sep 2026 12:02:05 -0700 Subject: [PATCH 73/91] Support complete public relationship observations for optimistic presentation hosting --- src/execution-world/inspection.ts | 38 +++++++++++++++++++++---------- test/inspection.test.ts | 5 ++-- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/execution-world/inspection.ts b/src/execution-world/inspection.ts index d2b879e..7667b2f 100644 --- a/src/execution-world/inspection.ts +++ b/src/execution-world/inspection.ts @@ -22,6 +22,8 @@ export interface InspectionTemplate { inputs?: PublicQueryContract; view?: PublicQueryContract; server?: PublicQueryContract; + completeInputs?: PublicQueryContract; + completeView?: PublicQueryContract; } /** A finite installed template per interface/lane, not a per-client query compiler. * Flags select public cache boundaries; normal scope identity bounds specialization. */ @@ -54,7 +56,9 @@ export function compileInspectionTemplates(plan: ExecutionPlan) { .sort((a, b) => (a.id < b.id ? -1 : 1)); if (!members.length || members.length > 128) continue; const template: InspectionTemplate = { interface: iface.revisionId, members: [] }; - for (const lane of ["local", "server"] as const) { + for (const mode of ["local", "complete", "server"] as const) { + const lane = mode === "server" ? "server" : "local"; + const complete = mode === "complete"; const fields: unknown[] = [], selections: unknown[] = [], inputFields: Record = {}, @@ -76,7 +80,7 @@ export function compileInspectionTemplates(plan: ExecutionPlan) { const many = member.kind === "relationship" && ["many", "many-unique"].includes(member.cardinality); // Only native edges promise the relationship traversal used by the interpreter. if (member.kind === "relationship" && providers.some((op) => op!.binding.kind !== "edge")) continue; - if (lane === "local" || !portable) + if (!complete && (lane === "local" || !portable)) template.members.push({ id: member.id, name: member.displayName, key, flag, lane, many }); inputFields[flag] = scalar("bool"); const field = selection(member.displayName, { @@ -95,18 +99,27 @@ export function compileInspectionTemplates(plan: ExecutionPlan) { if (member.target.kind === "interface") Object.assign(field, { targetInterfaceRevisionId: member.target.interfaceRevisionId }); if (many) { - inputFields[key + "First"] = scalar("int32"); - inputFields[key + "After"] = optional(scalar("string")); + const bound = key + (complete ? "All" : "First"); + inputFields[bound] = scalar("int32"); + if (!complete) inputFields[key + "After"] = optional(scalar("string")); + const keyFields = { key: scalar("string"), ...(member.keyType ? { mapKey: scalar(member.keyType) } : {}) }; + const keySelections = [selection("key"), ...(member.keyType ? [selection("mapKey")] : [])]; Object.assign(field, { - arguments: { first: variable(key + "First"), after: variable(key + "After") }, + arguments: complete + ? { all: variable(bound) } + : { first: variable(bound), after: variable(key + "After") }, selection: [ - selection("entries", { selection: [selection("key"), selection("node", { selection: [meta()] })] }), - selection("pageInfo", { selection: [selection("hasNextPage"), selection("endCursor")] }), + selection("entries", { selection: [...keySelections, selection("node", { selection: [meta()] })] }), + ...(complete + ? [] + : [selection("pageInfo", { selection: [selection("hasNextPage"), selection("endCursor")] })]), ], }); output = record({ - entries: { kind: "list", value: record({ key: scalar("string"), node }) }, - pageInfo: record({ hasNextPage: scalar("bool"), endCursor: optional(scalar("string")) }), + entries: { kind: "list", value: record({ ...keyFields, node }) }, + ...(complete + ? {} + : { pageInfo: record({ hasNextPage: scalar("bool"), endCursor: optional(scalar("string")) }) }), }); } else { Object.assign(field, { selection: [meta()] }); @@ -147,8 +160,9 @@ export function compileInspectionTemplates(plan: ExecutionPlan) { }, }; for (const kind of lane === "local" ? (["inputs", "view"] as const) : (["server"] as const)) { - const query = JSON.stringify([iface.revisionId, kind]); - const sourceQuery = JSON.stringify([iface.revisionId, "inputs"]); + const templateKey = complete ? (kind === "inputs" ? "completeInputs" : "completeView") : kind; + const query = JSON.stringify([iface.revisionId, templateKey]); + const sourceQuery = JSON.stringify([iface.revisionId, complete ? "completeInputs" : "inputs"]); const program = { ...base, id: JSON.stringify([inspectionPackage, query]), @@ -167,7 +181,7 @@ export function compileInspectionTemplates(plan: ExecutionPlan) { }; queries.push(program); contracts.push(contract); - template[kind] = contract; + template[templateKey] = contract; } } if (template.members.length) templates.push(template); diff --git a/test/inspection.test.ts b/test/inspection.test.ts index 4f416d7..062f9d8 100644 --- a/test/inspection.test.ts +++ b/test/inspection.test.ts @@ -12,7 +12,8 @@ test("public member inspection installs a finite set of typed lazy templates", a template.members.some((member) => member.name === "content") && template.members.some((member) => member.name === "highlights"), )!; - assert.ok(document.inputs && document.view && document.server); + assert.ok(document.inputs && document.view && document.server && document.completeInputs && document.completeView); + assert.equal(document.completeView.sourceQuery, document.completeInputs.query); assert.equal(document.view.sourceQuery, document.inputs.query); assert.ok(document.members.find((member) => member.name === "highlights")?.many); assert.ok(!document.members.some((member) => member.name === "revise")); @@ -31,5 +32,5 @@ test("public member inspection installs a finite set of typed lazy templates", a } assert.ok(!JSON.stringify(result.templates).includes("slot:")); assert.equal(result.queries.length, result.contracts.length); - assert.ok(result.queries.length <= plan.definition.workspace.interfaceImports.length * 3); + assert.ok(result.queries.length <= plan.definition.workspace.interfaceImports.length * 5); }); From e7778b35181ec5dd0feac49feaea27d4d37d8bd4 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Fri, 25 Sep 2026 12:09:10 -0700 Subject: [PATCH 74/91] Qualify typed presentation factories through public state interfaces --- test/fixtures/presentation-mount/PresentationRuntime.qx | 3 +++ test/fixtures/presentation-mount/workspace.qx | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/test/fixtures/presentation-mount/PresentationRuntime.qx b/test/fixtures/presentation-mount/PresentationRuntime.qx index 37137bb..d00e076 100644 --- a/test/fixtures/presentation-mount/PresentationRuntime.qx +++ b/test/fixtures/presentation-mount/PresentationRuntime.qx @@ -6,6 +6,9 @@ import interface PresentationMount; import interface StateFactory; external atom PresentationMountRecord id "presentation-mount-record"; package PresentationRuntime id "presentation-runtime" revision "presentation-runtime@1" { + function createReaderState id "presentation-runtime:create-reader-state" : record {occurrence:string;parent:optional>;} -> interface-ref execution transaction targets [browser,server] requires { + creation navigation id "navigation" : ReaderNavigationRecord input record {occurrence:string;parent:optional>;}; + }; function createPresentationMount id "presentation-runtime:create" : unit -> interface-ref execution transaction targets [browser,server] requires { creation presentationMount id "presentationMount" : PresentationMountRecord input unit; }; diff --git a/test/fixtures/presentation-mount/workspace.qx b/test/fixtures/presentation-mount/workspace.qx index 41d37c6..18ff3fe 100644 --- a/test/fixtures/presentation-mount/workspace.qx +++ b/test/fixtures/presentation-mount/workspace.qx @@ -11,6 +11,7 @@ workspace Example id "presentation-example" revision "presentation-example@1" co atom PresentationMountRecord id "presentation-mount-record"; atom Library id "library"; atom OtherLibrary id "other-library"; + atom PublicLibrary id "public-library"; atom Document id "document"; atom ReaderNavigationRecord id "reader-navigation-record"; atom DocumentNavigationRecord id "document-navigation-record"; @@ -85,4 +86,10 @@ workspace Example id "presentation-example" revision "presentation-example@1" co }; } conform OtherLibrary as Presentation id "other-library:presentation" {} + conform PublicLibrary as StateFactory id "public-reader:factory" { + bind create.call to package PresentationRuntime.createReaderState with { + navigation to creation ReaderNavigationRecord with {PresentationState from input;}; + }; + } + conform PublicLibrary as Presentation id "public-library:presentation" {} } From c482a99acab14a81d2a643e2dfc15ee2f35c9c7b Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Fri, 25 Sep 2026 12:11:01 -0700 Subject: [PATCH 75/91] Package ordinary PresentationMount contracts and typed React hosting --- src/capability-model/presentations.ts | 4 ++-- src/execution-world/client-contracts.ts | 15 ++++++++++++++- src/execution-world/inspection.ts | 4 ++-- src/execution-world/plan.ts | 2 +- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/capability-model/presentations.ts b/src/capability-model/presentations.ts index aed9822..b454b31 100644 --- a/src/capability-model/presentations.ts +++ b/src/capability-model/presentations.ts @@ -37,8 +37,8 @@ export function validatePresentations(workspace: WorkspaceRevision): CapabilityV ?.modules?.find((entry) => entry.id === presentation.componentId); if (module) { const contract = moduleContract(workspace.interfaceImports, module); - if (contract?.contract !== "org.quixos.react.subject-only/1") - fail(`${path}.componentId`, "Standalone presentation requires a subject-only module contract"); + if (!contract || !["org.quixos.react.subject-only/1", "org.quixos.react.component/2"].includes(contract.contract)) + fail(`${path}.componentId`, "Standalone presentation requires a supported React presentation contract"); if (contract?.subject?.kind !== "interface" || contract.subject.interfaceRevisionId !== presentation.subject) fail(`${path}.subject`, "Component requires its exact declared subject interface"); continue; diff --git a/src/execution-world/client-contracts.ts b/src/execution-world/client-contracts.ts index fe974f3..d96161f 100644 --- a/src/execution-world/client-contracts.ts +++ b/src/execution-world/client-contracts.ts @@ -211,6 +211,19 @@ export function generateComponentClientBindings(plan: ExecutionPlan, packageRevi const subjects = Object.fromEntries(components.map((component) => [component.displayName, find(component.subject)])); const props = (iface: string, member: string) => `ExtraModuleProps<${JSON.stringify(JSON.stringify([iface, member]))}>`; + // Preserve closed type arguments for the artifact consumer. Interpretation of + // a particular module contract belongs to that consumer, not this compiler. + const moduleArguments = (iface: InterfaceRevision) => `[${(iface.application?.arguments ?? []).map(argument => { + if (argument.kind === "value") return tsType(argument.type); + const target = argument.target; + const reference = target.kind === "atom" ? `ManagedReference<"atom", ${JSON.stringify(target.atomId)}>` : `ManagedReference<"interface", ${JSON.stringify(target.interfaceRevisionId)}>`; + const fields = target.kind === "interface" ? find(target.interfaceRevisionId).members.flatMap(member => { + if ((member.kind !== "value" && member.kind !== "relationship") || !member.queryRead) return []; + const getter = member.operations.find(operation => operation.displayName === (member.kind === "value" ? "get" : "resolve")); + return getter ? [`readonly ${JSON.stringify(member.displayName)}: ${tsType(getter.outputType)}`] : []; + }) : []; + return `{readonly reference: ${reference}; readonly values: {${fields.join(";")}}}`; + }).join(",")}]`; const interfaces = generateInterfaceClientBindings(imports, "@quixos/camino-react", props); const subjectBindings = generateInterfaceClientBindings(subjects, "@quixos/camino-react", props) .split("\n") @@ -248,7 +261,7 @@ export function generateComponentClientBindings(plan: ExecutionPlan, packageRevi .map((component) => { const module = modules.find((module) => module.id === component.id)!; const key = JSON.stringify([module.interfaceRevisionId, module.memberId]); - return `${JSON.stringify(component.displayName)}: ComponentType & ExtraModuleProps<${JSON.stringify(key)}>>;`; + return `${JSON.stringify(component.displayName)}: ComponentType & ExtraModuleProps<${JSON.stringify(key)}>>;`; }) .join("\n") + "\n}\n" diff --git a/src/execution-world/inspection.ts b/src/execution-world/inspection.ts index 7667b2f..e75e84d 100644 --- a/src/execution-world/inspection.ts +++ b/src/execution-world/inspection.ts @@ -18,7 +18,7 @@ const meta = () => selection("_camino", { selection: [selection("ref")] }); export const inspectionPackage = "org.quixos.inspection/1"; export interface InspectionTemplate { interface: string; - members: { id: string; name: string; key: string; flag: string; lane: "local" | "server"; many: boolean }[]; + members: { id: string; name: string; key: string; flag: string; lane: "local" | "server"; many: boolean; relationship: boolean }[]; inputs?: PublicQueryContract; view?: PublicQueryContract; server?: PublicQueryContract; @@ -81,7 +81,7 @@ export function compileInspectionTemplates(plan: ExecutionPlan) { // Only native edges promise the relationship traversal used by the interpreter. if (member.kind === "relationship" && providers.some((op) => op!.binding.kind !== "edge")) continue; if (!complete && (lane === "local" || !portable)) - template.members.push({ id: member.id, name: member.displayName, key, flag, lane, many }); + template.members.push({ id: member.id, name: member.displayName, key, flag, lane, many, relationship: member.kind === "relationship" }); inputFields[flag] = scalar("bool"); const field = selection(member.displayName, { key, diff --git a/src/execution-world/plan.ts b/src/execution-world/plan.ts index ae543f3..0e155d3 100644 --- a/src/execution-world/plan.ts +++ b/src/execution-world/plan.ts @@ -82,7 +82,7 @@ function componentDeclarations(workspace: WorkspaceRevision, pkg: WorkspaceRevis ...(pkg.modules ?? []).flatMap((module) => { const contract = moduleContract(workspace.interfaceImports, module)!; if ( - !["org.quixos.react.component/1", "org.quixos.react.subject-only/1"].includes(contract.contract) || + !["org.quixos.react.component/1", "org.quixos.react.component/2", "org.quixos.react.subject-only/1"].includes(contract.contract) || contract.subject?.kind !== "interface" ) return []; From 58a75da83f9a6128d5385d1d11ca99322205e41a Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Fri, 25 Sep 2026 12:26:34 -0700 Subject: [PATCH 76/91] Lower checked shared edges into the portable graph model --- src/execution-world/client-contracts.ts | 33 ++++++++++----- src/execution-world/inspection.ts | 20 ++++++++- src/execution-world/kernel.ts | 54 ++++++++++++------------- src/execution-world/plan.ts | 4 +- test/keyed-relationships.test.ts | 32 +++++++++++++++ test/presentations.test.ts | 4 +- 6 files changed, 105 insertions(+), 42 deletions(-) diff --git a/src/execution-world/client-contracts.ts b/src/execution-world/client-contracts.ts index d96161f..5f7cae6 100644 --- a/src/execution-world/client-contracts.ts +++ b/src/execution-world/client-contracts.ts @@ -213,17 +213,28 @@ export function generateComponentClientBindings(plan: ExecutionPlan, packageRevi `ExtraModuleProps<${JSON.stringify(JSON.stringify([iface, member]))}>`; // Preserve closed type arguments for the artifact consumer. Interpretation of // a particular module contract belongs to that consumer, not this compiler. - const moduleArguments = (iface: InterfaceRevision) => `[${(iface.application?.arguments ?? []).map(argument => { - if (argument.kind === "value") return tsType(argument.type); - const target = argument.target; - const reference = target.kind === "atom" ? `ManagedReference<"atom", ${JSON.stringify(target.atomId)}>` : `ManagedReference<"interface", ${JSON.stringify(target.interfaceRevisionId)}>`; - const fields = target.kind === "interface" ? find(target.interfaceRevisionId).members.flatMap(member => { - if ((member.kind !== "value" && member.kind !== "relationship") || !member.queryRead) return []; - const getter = member.operations.find(operation => operation.displayName === (member.kind === "value" ? "get" : "resolve")); - return getter ? [`readonly ${JSON.stringify(member.displayName)}: ${tsType(getter.outputType)}`] : []; - }) : []; - return `{readonly reference: ${reference}; readonly values: {${fields.join(";")}}}`; - }).join(",")}]`; + const moduleArguments = (iface: InterfaceRevision) => + `[${(iface.application?.arguments ?? []) + .map((argument) => { + if (argument.kind === "value") return tsType(argument.type); + const target = argument.target; + const reference = + target.kind === "atom" + ? `ManagedReference<"atom", ${JSON.stringify(target.atomId)}>` + : `ManagedReference<"interface", ${JSON.stringify(target.interfaceRevisionId)}>`; + const fields = + target.kind === "interface" + ? find(target.interfaceRevisionId).members.flatMap((member) => { + if ((member.kind !== "value" && member.kind !== "relationship") || !member.queryRead) return []; + const getter = member.operations.find( + (operation) => operation.displayName === (member.kind === "value" ? "get" : "resolve"), + ); + return getter ? [`readonly ${JSON.stringify(member.displayName)}: ${tsType(getter.outputType)}`] : []; + }) + : []; + return `{readonly reference: ${reference}; readonly values: {${fields.join(";")}}}`; + }) + .join(",")}]`; const interfaces = generateInterfaceClientBindings(imports, "@quixos/camino-react", props); const subjectBindings = generateInterfaceClientBindings(subjects, "@quixos/camino-react", props) .split("\n") diff --git a/src/execution-world/inspection.ts b/src/execution-world/inspection.ts index e75e84d..88a28b2 100644 --- a/src/execution-world/inspection.ts +++ b/src/execution-world/inspection.ts @@ -18,7 +18,15 @@ const meta = () => selection("_camino", { selection: [selection("ref")] }); export const inspectionPackage = "org.quixos.inspection/1"; export interface InspectionTemplate { interface: string; - members: { id: string; name: string; key: string; flag: string; lane: "local" | "server"; many: boolean; relationship: boolean }[]; + members: { + id: string; + name: string; + key: string; + flag: string; + lane: "local" | "server"; + many: boolean; + relationship: boolean; + }[]; inputs?: PublicQueryContract; view?: PublicQueryContract; server?: PublicQueryContract; @@ -81,7 +89,15 @@ export function compileInspectionTemplates(plan: ExecutionPlan) { // Only native edges promise the relationship traversal used by the interpreter. if (member.kind === "relationship" && providers.some((op) => op!.binding.kind !== "edge")) continue; if (!complete && (lane === "local" || !portable)) - template.members.push({ id: member.id, name: member.displayName, key, flag, lane, many, relationship: member.kind === "relationship" }); + template.members.push({ + id: member.id, + name: member.displayName, + key, + flag, + lane, + many, + relationship: member.kind === "relationship", + }); inputFields[flag] = scalar("bool"); const field = selection(member.displayName, { key, diff --git a/src/execution-world/kernel.ts b/src/execution-world/kernel.ts index 52f3082..5e12355 100644 --- a/src/execution-world/kernel.ts +++ b/src/execution-world/kernel.ts @@ -22,11 +22,11 @@ export function compileKernelProgram(plan: ExecutionPlan): unknown { if (hexDigest(plan.definition) !== plan.digest) throw new ExecutionPlanError("INVALID_PLAN", "kernel", "Plan digest mismatch"); const workspace = plan.definition.workspace; - if (workspace.sharedAttachments.length) + if (workspace.sharedAttachments.some((attachment) => attachment.kind !== "edge")) throw new ExecutionPlanError( "UNSUPPORTED_SHARED_STORAGE", "kernel", - "Stage 0 requires explicit conformance-owned storage", + "Shared scalar storage is not implemented; use conformance-owned state", ); const schema = (type: ValueType): unknown | null => { try { @@ -36,7 +36,30 @@ export function compileKernelProgram(plan: ExecutionPlan): unknown { } }; const ownerBySlot = new Map(); - const edges: { id: string; owner: string; a: unknown; b: unknown }[] = []; + const edges: { id: string; owner: string | null; a: unknown; b: unknown }[] = []; + const lowerEdge = (storage: Extract, owner: string | null) => { + const endpoints = storage.endpoints.map((endpoint) => { + if (endpoint.ordered || (endpoint.keyType && endpoint.keyType !== "string") || endpoint.retainOther) + throw new ExecutionPlanError( + "UNSUPPORTED_GRAPH_FEATURE", + storage.id, + "Ordered relations, non-string keys and automatic retention are not implemented", + ); + return { + projection: endpoint.projectionId, + constraint: { + kind: endpoint.constraint.kind, + id: + endpoint.constraint.kind === "atom" ? endpoint.constraint.atomId : endpoint.constraint.interfaceRevisionId, + }, + cardinality: endpoint.cardinality, + ...(endpoint.keyType ? { keyType: endpoint.keyType } : {}), + ...(endpoint.onDelete ? { onDelete: endpoint.onDelete } : {}), + }; + }); + edges.push({ id: storage.id, owner, a: endpoints[0], b: endpoints[1] }); + }; + for (const storage of workspace.sharedAttachments) if (storage.kind === "edge") lowerEdge(storage, null); const owners = plan.definition.owners.map((owner) => { const slots: unknown[] = []; for (const storage of owner.storage as PersistentAttachment[]) { @@ -51,30 +74,7 @@ export function compileKernelProgram(plan: ExecutionPlan): unknown { policy: storage.storagePolicy.kind === "register" ? "register" : "crdt", ...(Object.hasOwn(storage, "defaultValue") ? { defaultLiteral: storage.defaultValue } : {}), }); - } else { - const endpoints = storage.endpoints.map((endpoint) => { - if (endpoint.ordered || (endpoint.keyType && endpoint.keyType !== "string") || endpoint.retainOther) - throw new ExecutionPlanError( - "UNSUPPORTED_GRAPH_FEATURE", - storage.id, - "Ordered relations, non-string keys and automatic retention are not implemented", - ); - return { - projection: endpoint.projectionId, - constraint: { - kind: endpoint.constraint.kind, - id: - endpoint.constraint.kind === "atom" - ? endpoint.constraint.atomId - : endpoint.constraint.interfaceRevisionId, - }, - cardinality: endpoint.cardinality, - ...(endpoint.keyType ? { keyType: endpoint.keyType } : {}), - ...(endpoint.onDelete ? { onDelete: endpoint.onDelete } : {}), - }; - }); - edges.push({ id: storage.id, owner: owner.id, a: endpoints[0], b: endpoints[1] }); - } + } else lowerEdge(storage, owner.id); } return { id: owner.id, diff --git a/src/execution-world/plan.ts b/src/execution-world/plan.ts index 0e155d3..9f23f7e 100644 --- a/src/execution-world/plan.ts +++ b/src/execution-world/plan.ts @@ -82,7 +82,9 @@ function componentDeclarations(workspace: WorkspaceRevision, pkg: WorkspaceRevis ...(pkg.modules ?? []).flatMap((module) => { const contract = moduleContract(workspace.interfaceImports, module)!; if ( - !["org.quixos.react.component/1", "org.quixos.react.component/2", "org.quixos.react.subject-only/1"].includes(contract.contract) || + !["org.quixos.react.component/1", "org.quixos.react.component/2", "org.quixos.react.subject-only/1"].includes( + contract.contract, + ) || contract.subject?.kind !== "interface" ) return []; diff --git a/test/keyed-relationships.test.ts b/test/keyed-relationships.test.ts index 6827552..079bf67 100644 --- a/test/keyed-relationships.test.ts +++ b/test/keyed-relationships.test.ts @@ -76,3 +76,35 @@ test("key contracts cannot silently bind to unkeyed storage or the inverse proje assert.match(JSON.stringify(result.diagnostics), /key type|keyed projection|signature/i); } }); + +test("checked shared edges lower without granting conformance initialization ownership", () => { + const edge = declarations.match(/ private edge Entries[\s\S]*?\n }/)![0]; + const shared = declarations + .replace(edge, "") + .replace(" conform Node as", edge.replace("private edge", "shared edge") + "\n conform Node as"); + const result = compile(shared); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const program = compileKernelProgram(compileExecutionPlan(result.workspace)) as { + model: { edges: { id: string; owner: string | null }[] }; + }; + assert.deepEqual( + program.model.edges.map((edge) => ({ id: edge.id, owner: edge.owner })), + [{ id: "entries", owner: null }], + ); + const seeded = compile( + shared.replace( + " bind entries.resolve", + " initialize { initial to edge Entries.entries; };\n bind entries.resolve", + ), + ); + assert.ok(!seeded.ok); + assert.ok(seeded.diagnostics.some((issue) => issue.code === "invalid-initialization")); + const scalar = compile( + shared.replace( + ' atom Node id "node";', + ' atom Node id "node"; shared state Shared id "shared" on Node : string policy register default "";', + ), + ); + assert.ok(scalar.ok, JSON.stringify(scalar.diagnostics)); + assert.throws(() => compileKernelProgram(compileExecutionPlan(scalar.workspace)), /UNSUPPORTED_SHARED_STORAGE/); +}); diff --git a/test/presentations.test.ts b/test/presentations.test.ts index 19b26ec..ab69e70 100644 --- a/test/presentations.test.ts +++ b/test/presentations.test.ts @@ -148,7 +148,9 @@ test("standalone presentation rejects a general component contract that may requ assert.equal(member.kind, "module"); if (member.kind !== "module") throw Error("Expected module"); member.contract = "org.quixos.react.component/1"; - assert.ok(validateWorkspaceRevision(candidate).some((issue) => /subject-only/.test(issue.message))); + assert.ok( + validateWorkspaceRevision(candidate).some((issue) => /supported React presentation contract/.test(issue.message)), + ); }); test("checked component-only artifacts install without a service and reject missing or substituted entries", async () => { From 3728612e8cef7d799d84c18543328d2f547a2060 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sat, 26 Sep 2026 11:16:46 -0700 Subject: [PATCH 77/91] Implement implicit object references and capability query foundations --- proto/camino/schema.proto | 5 + src/execution-world/query-operators.ts | 1 + src/gen/camino/schema_pb.ts | 64 +++++++--- src/query/compile.ts | 161 ++++++++++++++++++++++--- src/query/link.ts | 12 ++ src/query/relational-compile.ts | 30 +++++ src/query/relational-proto.ts | 7 ++ src/query/relational-schema.ts | 39 +++++- src/query/relational.ts | 1 + src/query/schema.ts | 14 +++ test/controller-registry.test.ts | 2 +- test/query-compiler.test.ts | 89 +++++++++++++- test/query-structured.test.ts | 11 ++ 13 files changed, 401 insertions(+), 35 deletions(-) diff --git a/proto/camino/schema.proto b/proto/camino/schema.proto index 7b4cef9..1e2e123 100644 --- a/proto/camino/schema.proto +++ b/proto/camino/schema.proto @@ -196,6 +196,10 @@ message QueryReductionPredicate { QueryPredicate where = 3; QueryPredicate having = 4; } +message QueryInterfacePredicate { + string interface_revision_id = 1; + QueryPredicate predicate = 2; +} message QueryPredicate { oneof predicate { QueryPredicateList and = 1; @@ -204,6 +208,7 @@ message QueryPredicate { QueryComparison compare = 4; QueryRelationPredicate relation = 5; QueryReductionPredicate reduce = 6; + QueryInterfacePredicate as = 7; } } message QueryRow { diff --git a/src/execution-world/query-operators.ts b/src/execution-world/query-operators.ts index 713eec9..4682306 100644 --- a/src/execution-world/query-operators.ts +++ b/src/execution-world/query-operators.ts @@ -10,6 +10,7 @@ export function unsupportedQueryOperator(query: CheckedQuery): string | undefine if (value.kind === "reduce") return "aggregate predicates"; if (value.kind === "and" || value.kind === "or") return value.children.map(predicate).find(Boolean); if (value.kind === "not") return predicate(value.child); + if (value.kind === "as") return predicate(value.predicate); if (value.kind === "compare") return path(value.expression.path); if (value.kind === "relation") return path(value.path) ?? (value.predicate && predicate(value.predicate)); return undefined; diff --git a/src/gen/camino/schema_pb.ts b/src/gen/camino/schema_pb.ts index 3c05ed7..c239c35 100644 --- a/src/gen/camino/schema_pb.ts +++ b/src/gen/camino/schema_pb.ts @@ -10,7 +10,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file camino/schema.proto. */ export const file_camino_schema: GenFile = /*@__PURE__*/ - fileDesc("ChNjYW1pbm8vc2NoZW1hLnByb3RvEgZjYW1pbm8iNwoOQXRvbURlZmluaXRpb24SDwoHYXRvbV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkiWQoPQXRvbUNvbmZvcm1hbmNlEg8KB2F0b21faWQYASABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAIgASgJEhYKDmNvbmZvcm1hbmNlX2lkGAMgASgJIsIBCg9TdGF0ZUF0dGFjaG1lbnQSDwoHc2xvdF9pZBgBIAEoCRIYChBhdHRhY2hlZF9hdG9tX2lkGAIgASgJEhQKDGRpc3BsYXlfbmFtZRgDIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YBCABKAkSGwoTc3RvcmFnZV9wb2xpY3lfanNvbhgFIAEoCRIaChJkZWZhdWx0X3ZhbHVlX2pzb24YBiABKAkSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYByABKAkiUAoSRW5kcG9pbnRDb25zdHJhaW50EhEKB2F0b21faWQYASABKAlIABIfChVpbnRlcmZhY2VfcmV2aXNpb25faWQYAiABKAlIAEIGCgRraW5kIvsBCgxFZGdlRW5kcG9pbnQSFQoNcHJvamVjdGlvbl9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSLgoKY29uc3RyYWludBgDIAEoCzIaLmNhbWluby5FbmRwb2ludENvbnN0cmFpbnQSKAoLY2FyZGluYWxpdHkYBCABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSDwoHb3JkZXJlZBgFIAEoCBIRCglvbl9kZWxldGUYBiABKAkSFAoMcmV0YWluX290aGVyGAcgASgIEhAKCGtleV90eXBlGAggASgJEhgKEHB1YmxpY190cmF2ZXJzYWwYCSABKAgipQEKDkVkZ2VBdHRhY2htZW50EhQKDGVkZ2VfdHlwZV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSIwoFZmlyc3QYAyABKAsyFC5jYW1pbm8uRWRnZUVuZHBvaW50EiQKBnNlY29uZBgEIAEoCzIULmNhbWluby5FZGdlRW5kcG9pbnQSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYBSABKAkilQIKD1BlcnNpc3RlbmNlUGxhbhIUCgx3b3Jrc3BhY2VfaWQYASABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAIgASgJEiUKBWF0b21zGAMgAygLMhYuY2FtaW5vLkF0b21EZWZpbml0aW9uEi0KDGNvbmZvcm1hbmNlcxgEIAMoCzIXLmNhbWluby5BdG9tQ29uZm9ybWFuY2USJwoGc3RhdGVzGAUgAygLMhcuY2FtaW5vLlN0YXRlQXR0YWNobWVudBIlCgVlZGdlcxgGIAMoCzIWLmNhbWluby5FZGdlQXR0YWNobWVudBInCgdxdWVyaWVzGAcgAygLMhYuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5Ip4BCg1RdWVyeUFyZ3VtZW50EhIKCHZhcmlhYmxlGAEgASgJSAASFgoMbGl0ZXJhbF9qc29uGAIgASgJSAASKQoEbGlzdBgDIAEoCzIZLmNhbWluby5RdWVyeUFyZ3VtZW50TGlzdEgAEi0KBm9iamVjdBgEIAEoCzIbLmNhbWluby5RdWVyeUFyZ3VtZW50T2JqZWN0SABCBwoFdmFsdWUiOgoRUXVlcnlBcmd1bWVudExpc3QSJQoGdmFsdWVzGAEgAygLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQilAEKE1F1ZXJ5QXJndW1lbnRPYmplY3QSNwoGZmllbGRzGAEgAygLMicuY2FtaW5vLlF1ZXJ5QXJndW1lbnRPYmplY3QuRmllbGRzRW50cnkaRAoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQ6AjgBIkcKDlF1ZXJ5Q29uZGl0aW9uEg8KB2luY2x1ZGUYASABKAgSJAoFdmFsdWUYAiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCLUAwoOUXVlcnlTZWxlY3Rpb24SDAoEbmFtZRgBIAEoCRILCgNrZXkYAiABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAMgASgJEhEKCW1lbWJlcl9pZBgEIAEoCRIkChx0YXJnZXRfaW50ZXJmYWNlX3JldmlzaW9uX2lkGAUgASgJEioKCmNvbmRpdGlvbnMYBiADKAsyFi5jYW1pbm8uUXVlcnlDb25kaXRpb24SOAoJYXJndW1lbnRzGAcgAygLMiUuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uLkFyZ3VtZW50c0VudHJ5EikKCXNlbGVjdGlvbhgIIAMoCzIWLmNhbWluby5RdWVyeVNlbGVjdGlvbhIvCgpyZWxhdGlvbmFsGAkgASgLMhsuY2FtaW5vLlF1ZXJ5UmVsYXRpb25hbFBsYW4SKQoJcHJlZGljYXRlGAogASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEhkKEWxpdmVfc2VsZWN0aW9uX2lkGAsgASgJGkcKDkFyZ3VtZW50c0VudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50OgI4ASJqCg1RdWVyeVBhdGhTdGVwEhAKBnNvdXJjZRgBIAEoCEgAEhAKBnRhcmdldBgCIAEoCEgAEi0KCHJlbGF0aW9uGAMgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoSABCBgoEc3RlcCJ9ChFRdWVyeVJlbGF0aW9uUGF0aBIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEQoJbWVtYmVyX2lkGAIgASgJEiQKHHRhcmdldF9pbnRlcmZhY2VfcmV2aXNpb25faWQYAyABKAkSEAoIb3B0aW9uYWwYBCABKAgiWQoRUXVlcnlGaWVsZE9wZXJhbmQSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhEKCW1lbWJlcl9pZBgCIAEoCRISCgp2YWx1ZV9wYXRoGAMgAygJIrYBCg9RdWVyeUV4cHJlc3Npb24SIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhTdGVwEioKBWZpZWxkGAIgASgLMhkuY2FtaW5vLlF1ZXJ5RmllbGRPcGVyYW5kSAASDQoDcmVmGAMgASgJSAASDwoFZW50cnkYBCABKAhIABIRCgdtYXBfa2V5GAUgASgISAASFwoPdmFsdWVfdHlwZV9qc29uGAYgASgJQgYKBGxlYWYihQEKDlF1ZXJ5UmVkdWN0aW9uEjAKCG9wZXJhdG9yGAEgASgOMh4uY2FtaW5vLlF1ZXJ5QWdncmVnYXRlT3BlcmF0b3ISKAoHb3BlcmFuZBgCIAEoCzIXLmNhbWluby5RdWVyeUV4cHJlc3Npb24SFwoPdmFsdWVfdHlwZV9qc29uGAMgASgJInUKDFF1ZXJ5T3BlcmFuZBItCgpleHByZXNzaW9uGAEgASgLMhcuY2FtaW5vLlF1ZXJ5RXhwcmVzc2lvbkgAEisKCXJlZHVjdGlvbhgCIAEoCzIWLmNhbWluby5RdWVyeVJlZHVjdGlvbkgAQgkKB29wZXJhbmQikQEKD1F1ZXJ5Q29tcGFyaXNvbhIlCgdvcGVyYW5kGAEgASgLMhQuY2FtaW5vLlF1ZXJ5T3BlcmFuZBIxCghvcGVyYXRvchgCIAEoDjIfLmNhbWluby5RdWVyeUNvbXBhcmlzb25PcGVyYXRvchIkCgV2YWx1ZRgDIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50Ij4KElF1ZXJ5UHJlZGljYXRlTGlzdBIoCghjaGlsZHJlbhgBIAMoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZSL1AQoWUXVlcnlSZWxhdGlvblByZWRpY2F0ZRIjCgRwYXRoGAEgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFN0ZXASKwoIcmVsYXRpb24YAiABKAsyGS5jYW1pbm8uUXVlcnlSZWxhdGlvblBhdGgSOAoIb3BlcmF0b3IYAyABKA4yJi5jYW1pbm8uUXVlcnlSZWxhdGlvblByZWRpY2F0ZU9wZXJhdG9yEikKCXByZWRpY2F0ZRgEIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZRIkCgV2YWx1ZRgFIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50IroBChdRdWVyeVJlZHVjdGlvblByZWRpY2F0ZRIjCgRwYXRoGAEgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFN0ZXASKwoIcmVsYXRpb24YAiABKAsyGS5jYW1pbm8uUXVlcnlSZWxhdGlvblBhdGgSJQoFd2hlcmUYAyABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUSJgoGaGF2aW5nGAQgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlIqwCCg5RdWVyeVByZWRpY2F0ZRIpCgNhbmQYASABKAsyGi5jYW1pbm8uUXVlcnlQcmVkaWNhdGVMaXN0SAASKAoCb3IYAiABKAsyGi5jYW1pbm8uUXVlcnlQcmVkaWNhdGVMaXN0SAASJQoDbm90GAMgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlSAASKgoHY29tcGFyZRgEIAEoCzIXLmNhbWluby5RdWVyeUNvbXBhcmlzb25IABIyCghyZWxhdGlvbhgFIAEoCzIeLmNhbWluby5RdWVyeVJlbGF0aW9uUHJlZGljYXRlSAASMQoGcmVkdWNlGAYgASgLMh8uY2FtaW5vLlF1ZXJ5UmVkdWN0aW9uUHJlZGljYXRlSABCCwoJcHJlZGljYXRlImEKCFF1ZXJ5Um93EigKBm9iamVjdBgBIAEoCzIWLmNhbWluby5RdWVyeU9iamVjdFJvd0gAEiQKBHBhaXIYAiABKAsyFC5jYW1pbm8uUXVlcnlQYWlyUm93SABCBQoDcm93IlUKDlF1ZXJ5T2JqZWN0Um93Eh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgBIAEoCRISCgptZW1iZXJzaGlwGAIgASgIEhAKCGtleV90eXBlGAMgASgJIlIKDFF1ZXJ5UGFpclJvdxIgCgZzb3VyY2UYASABKAsyEC5jYW1pbm8uUXVlcnlSb3cSIAoGdGFyZ2V0GAIgASgLMhAuY2FtaW5vLlF1ZXJ5Um93IkUKCFF1ZXJ5S2V5EgwKBHBhdGgYASADKAkSKwoKZXhwcmVzc2lvbhgCIAEoCzIXLmNhbWluby5RdWVyeUV4cHJlc3Npb24iLwoNUXVlcnlEaXN0aW5jdBIeCgRrZXlzGAEgAygLMhAuY2FtaW5vLlF1ZXJ5S2V5ImIKDlF1ZXJ5RXhwYW5zaW9uEiMKBHBhdGgYASADKAsyFS5jYW1pbm8uUXVlcnlQYXRoU3RlcBIrCghyZWxhdGlvbhgCIAEoCzIZLmNhbWluby5RdWVyeVJlbGF0aW9uUGF0aCKYAgoUUXVlcnlSZWxhdGlvbmFsU3RhZ2USCgoCaWQYASABKA0SEgoFaW5wdXQYAiABKA1IAYgBARIdCgNyb3cYAyABKAsyEC5jYW1pbm8uUXVlcnlSb3cSKwoGc291cmNlGAQgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoSAASKAoGZmlsdGVyGAUgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlSAASKAoGZXhwYW5kGAYgASgLMhYuY2FtaW5vLlF1ZXJ5RXhwYW5zaW9uSAASKQoIZGlzdGluY3QYByABKAsyFS5jYW1pbm8uUXVlcnlEaXN0aW5jdEgAQgsKCW9wZXJhdGlvbkIICgZfaW5wdXQiUwoYUXVlcnlSZWR1Y3Rpb25Qcm9qZWN0aW9uEgwKBHBhdGgYASADKAkSKQoJcmVkdWN0aW9uGAIgASgLMhYuY2FtaW5vLlF1ZXJ5UmVkdWN0aW9uIlAKE1F1ZXJ5QWdncmVnYXRlT3JkZXISJQoHb3BlcmFuZBgBIAEoCzIULmNhbWluby5RdWVyeU9wZXJhbmQSEgoKZGVzY2VuZGluZxgCIAEoCCLSAwoXUXVlcnlSZWxhdGlvbmFsVGVybWluYWwSDQoFc3RhZ2UYASABKA0SDAoEcGF0aBgCIAMoCRIOCgZncm91cHMYAyABKAgSHgoEa2V5cxgEIAMoCzIQLmNhbWluby5RdWVyeUtleRI0CgpyZWR1Y3Rpb25zGAUgAygLMiAuY2FtaW5vLlF1ZXJ5UmVkdWN0aW9uUHJvamVjdGlvbhIlCgV3aGVyZRgGIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZRImCgZoYXZpbmcYByABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUSKgoFb3JkZXIYCCADKAsyGy5jYW1pbm8uUXVlcnlBZ2dyZWdhdGVPcmRlchIkCgVmaXJzdBgJIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50EiIKA2FsbBgKIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50EiQKBWFmdGVyGAsgASgLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQSKQoJc2VsZWN0aW9uGAwgAygLMhYuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uEhAKCHJlc2lkdWFsGA0gASgIEgwKBHJvd3MYDiABKAgidwoTUXVlcnlSZWxhdGlvbmFsUGxhbhIsCgZzdGFnZXMYASADKAsyHC5jYW1pbm8uUXVlcnlSZWxhdGlvbmFsU3RhZ2USMgoJdGVybWluYWxzGAIgAygLMh8uY2FtaW5vLlF1ZXJ5UmVsYXRpb25hbFRlcm1pbmFsIukCChBRdWVyeVJlYWRCaW5kaW5nEg8KB2F0b21faWQYASABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAIgASgJEhEKCW1lbWJlcl9pZBgDIAEoCRIbChNnZXR0ZXJfb3BlcmF0aW9uX2lkGAQgASgJEg8KB3Nsb3RfaWQYBSABKAkSFAoMZWRnZV90eXBlX2lkGAYgASgJEhUKDXByb2plY3Rpb25faWQYByABKAkSCwoDcnBjGAggASgIEiAKGHdhdGNoX3N0YXJ0X29wZXJhdGlvbl9pZBgJIAEoCRIfChd3YXRjaF9zdG9wX29wZXJhdGlvbl9pZBgKIAEoCRISCgpmaWVsZF9uYW1lGAsgASgJEhcKD3ZhbHVlX3R5cGVfanNvbhgMIAEoCRIoCgtjYXJkaW5hbGl0eRgNIAEoDjITLmNhbWluby5DYXJkaW5hbGl0eRIQCghrZXlfdHlwZRgOIAEoCSKvAQoSUXVlcnlGaWVsZENvbnRyYWN0Eh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgBIAEoCRIRCgltZW1iZXJfaWQYAiABKAkSEgoKZmllbGRfbmFtZRgDIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YBCABKAkSKAoLY2FyZGluYWxpdHkYBSABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSEAoIa2V5X3R5cGUYBiABKAkikgEKDFF1ZXJ5QnVkZ2V0cxIMCgRyb3dzGAEgASgNEg0KBWRlcHRoGAIgASgNEhQKDHJlc3VsdF9ieXRlcxgDIAEoDRISCgpjYW5kaWRhdGVzGAQgASgNEhEKCXJwY19jYWxscxgFIAEoDRITCgtjb25jdXJyZW5jeRgGIAEoDRITCgtkZWFkbGluZV9tcxgHIAEoDSJMCg5RdWVyeVBsYWNlbWVudBIRCgdyZXBsaWNhGAEgASgISAASHwoVbG9jYWxfc291cmNlX3F1ZXJ5X2lkGAIgASgJSABCBgoEa2luZCKaBQoOSW5zdGFsbGVkUXVlcnkSCgoCaWQYASABKAkSGQoRZGVmaW5pdGlvbl9kaWdlc3QYAiABKAkSFgoOYmluZGluZ19kaWdlc3QYAyABKAkSGgoQb2JqZWN0X2ludGVyZmFjZRgEIAEoCUgAEh0KE3dvcmtzcGFjZV9pbnRlcmZhY2UYDiABKAlIABIpCglzZWxlY3Rpb24YBSADKAsyFi5jYW1pbm8uUXVlcnlTZWxlY3Rpb24SKgoIYmluZGluZ3MYBiADKAsyGC5jYW1pbm8uUXVlcnlSZWFkQmluZGluZxIlCgdidWRnZXRzGAcgASgLMhQuY2FtaW5vLlF1ZXJ5QnVkZ2V0cxIbChN2YXJpYWJsZXNfdHlwZV9qc29uGAggASgJEhgKEG91dHB1dF90eXBlX2pzb24YCSABKAkSRwoRdmFyaWFibGVfZGVmYXVsdHMYCiADKAsyLC5jYW1pbm8uSW5zdGFsbGVkUXVlcnkuVmFyaWFibGVEZWZhdWx0c0VudHJ5Eg0KBXdhdGNoGAsgASgIEhsKE3BvbGxpbmdfaW50ZXJ2YWxfbXMYDCABKA0SHgoWcnBjX3ByZWRpY2F0ZV9vcl9vcmRlchgNIAEoCBIVCg1yb290X2F0b21faWRzGA8gAygJEioKBmZpZWxkcxgQIAMoCzIaLmNhbWluby5RdWVyeUZpZWxkQ29udHJhY3QSKQoJcGxhY2VtZW50GBEgASgLMhYuY2FtaW5vLlF1ZXJ5UGxhY2VtZW50Gk4KFVZhcmlhYmxlRGVmYXVsdHNFbnRyeRILCgNrZXkYASABKAkSJAoFdmFsdWUYAiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudDoCOAFCBgoEcm9vdCpoCgtDYXJkaW5hbGl0eRIbChdDQVJESU5BTElUWV9VTlNQRUNJRklFRBAAEhAKDE9QVElPTkFMX09ORRABEg8KC0VYQUNUTFlfT05FEAISCAoETUFOWRADEg8KC01BTllfVU5JUVVFEAQqmgIKFlF1ZXJ5QWdncmVnYXRlT3BlcmF0b3ISKAokUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX1VOU1BFQ0lGSUVEEAASIgoeUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0NPVU5UEAESKgomUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0NPVU5UX1BSRVNFTlQQAhIgChxRVUVSWV9BR0dSRUdBVEVfT1BFUkFUT1JfU1VNEAMSIAocUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX0FWRxAEEiAKHFFVRVJZX0FHR1JFR0FURV9PUEVSQVRPUl9NSU4QBRIgChxRVUVSWV9BR0dSRUdBVEVfT1BFUkFUT1JfTUFYEAYq7QIKF1F1ZXJ5Q29tcGFyaXNvbk9wZXJhdG9yEikKJVFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfVU5TUEVDSUZJRUQQABIgChxRVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0VREAESIAocUVVFUllfQ09NUEFSSVNPTl9PUEVSQVRPUl9JThACEiUKIVFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfSVNfTlVMTBADEiAKHFFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfTFQQBBIhCh1RVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0xURRAFEiAKHFFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfR1QQBhIhCh1RVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0dURRAHEjIKLlFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfQ09OVEFJTlNfSU5TRU5TSVRJVkUQCCqEAgoeUXVlcnlSZWxhdGlvblByZWRpY2F0ZU9wZXJhdG9yEjEKLVFVRVJZX1JFTEFUSU9OX1BSRURJQ0FURV9PUEVSQVRPUl9VTlNQRUNJRklFRBAAEioKJlFVRVJZX1JFTEFUSU9OX1BSRURJQ0FURV9PUEVSQVRPUl9TT01FEAESKgomUVVFUllfUkVMQVRJT05fUFJFRElDQVRFX09QRVJBVE9SX05PTkUQAhIoCiRRVUVSWV9SRUxBVElPTl9QUkVESUNBVEVfT1BFUkFUT1JfSVMQAxItCilRVUVSWV9SRUxBVElPTl9QUkVESUNBVEVfT1BFUkFUT1JfSVNfTlVMTBAEYgZwcm90bzM"); + fileDesc("ChNjYW1pbm8vc2NoZW1hLnByb3RvEgZjYW1pbm8iNwoOQXRvbURlZmluaXRpb24SDwoHYXRvbV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkiWQoPQXRvbUNvbmZvcm1hbmNlEg8KB2F0b21faWQYASABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAIgASgJEhYKDmNvbmZvcm1hbmNlX2lkGAMgASgJIsIBCg9TdGF0ZUF0dGFjaG1lbnQSDwoHc2xvdF9pZBgBIAEoCRIYChBhdHRhY2hlZF9hdG9tX2lkGAIgASgJEhQKDGRpc3BsYXlfbmFtZRgDIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YBCABKAkSGwoTc3RvcmFnZV9wb2xpY3lfanNvbhgFIAEoCRIaChJkZWZhdWx0X3ZhbHVlX2pzb24YBiABKAkSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYByABKAkiUAoSRW5kcG9pbnRDb25zdHJhaW50EhEKB2F0b21faWQYASABKAlIABIfChVpbnRlcmZhY2VfcmV2aXNpb25faWQYAiABKAlIAEIGCgRraW5kIvsBCgxFZGdlRW5kcG9pbnQSFQoNcHJvamVjdGlvbl9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSLgoKY29uc3RyYWludBgDIAEoCzIaLmNhbWluby5FbmRwb2ludENvbnN0cmFpbnQSKAoLY2FyZGluYWxpdHkYBCABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSDwoHb3JkZXJlZBgFIAEoCBIRCglvbl9kZWxldGUYBiABKAkSFAoMcmV0YWluX290aGVyGAcgASgIEhAKCGtleV90eXBlGAggASgJEhgKEHB1YmxpY190cmF2ZXJzYWwYCSABKAgipQEKDkVkZ2VBdHRhY2htZW50EhQKDGVkZ2VfdHlwZV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSIwoFZmlyc3QYAyABKAsyFC5jYW1pbm8uRWRnZUVuZHBvaW50EiQKBnNlY29uZBgEIAEoCzIULmNhbWluby5FZGdlRW5kcG9pbnQSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYBSABKAkilQIKD1BlcnNpc3RlbmNlUGxhbhIUCgx3b3Jrc3BhY2VfaWQYASABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAIgASgJEiUKBWF0b21zGAMgAygLMhYuY2FtaW5vLkF0b21EZWZpbml0aW9uEi0KDGNvbmZvcm1hbmNlcxgEIAMoCzIXLmNhbWluby5BdG9tQ29uZm9ybWFuY2USJwoGc3RhdGVzGAUgAygLMhcuY2FtaW5vLlN0YXRlQXR0YWNobWVudBIlCgVlZGdlcxgGIAMoCzIWLmNhbWluby5FZGdlQXR0YWNobWVudBInCgdxdWVyaWVzGAcgAygLMhYuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5Ip4BCg1RdWVyeUFyZ3VtZW50EhIKCHZhcmlhYmxlGAEgASgJSAASFgoMbGl0ZXJhbF9qc29uGAIgASgJSAASKQoEbGlzdBgDIAEoCzIZLmNhbWluby5RdWVyeUFyZ3VtZW50TGlzdEgAEi0KBm9iamVjdBgEIAEoCzIbLmNhbWluby5RdWVyeUFyZ3VtZW50T2JqZWN0SABCBwoFdmFsdWUiOgoRUXVlcnlBcmd1bWVudExpc3QSJQoGdmFsdWVzGAEgAygLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQilAEKE1F1ZXJ5QXJndW1lbnRPYmplY3QSNwoGZmllbGRzGAEgAygLMicuY2FtaW5vLlF1ZXJ5QXJndW1lbnRPYmplY3QuRmllbGRzRW50cnkaRAoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQ6AjgBIkcKDlF1ZXJ5Q29uZGl0aW9uEg8KB2luY2x1ZGUYASABKAgSJAoFdmFsdWUYAiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudCLUAwoOUXVlcnlTZWxlY3Rpb24SDAoEbmFtZRgBIAEoCRILCgNrZXkYAiABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAMgASgJEhEKCW1lbWJlcl9pZBgEIAEoCRIkChx0YXJnZXRfaW50ZXJmYWNlX3JldmlzaW9uX2lkGAUgASgJEioKCmNvbmRpdGlvbnMYBiADKAsyFi5jYW1pbm8uUXVlcnlDb25kaXRpb24SOAoJYXJndW1lbnRzGAcgAygLMiUuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uLkFyZ3VtZW50c0VudHJ5EikKCXNlbGVjdGlvbhgIIAMoCzIWLmNhbWluby5RdWVyeVNlbGVjdGlvbhIvCgpyZWxhdGlvbmFsGAkgASgLMhsuY2FtaW5vLlF1ZXJ5UmVsYXRpb25hbFBsYW4SKQoJcHJlZGljYXRlGAogASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEhkKEWxpdmVfc2VsZWN0aW9uX2lkGAsgASgJGkcKDkFyZ3VtZW50c0VudHJ5EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50OgI4ASJqCg1RdWVyeVBhdGhTdGVwEhAKBnNvdXJjZRgBIAEoCEgAEhAKBnRhcmdldBgCIAEoCEgAEi0KCHJlbGF0aW9uGAMgASgLMhkuY2FtaW5vLlF1ZXJ5UmVsYXRpb25QYXRoSABCBgoEc3RlcCJ9ChFRdWVyeVJlbGF0aW9uUGF0aBIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEQoJbWVtYmVyX2lkGAIgASgJEiQKHHRhcmdldF9pbnRlcmZhY2VfcmV2aXNpb25faWQYAyABKAkSEAoIb3B0aW9uYWwYBCABKAgiWQoRUXVlcnlGaWVsZE9wZXJhbmQSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhEKCW1lbWJlcl9pZBgCIAEoCRISCgp2YWx1ZV9wYXRoGAMgAygJIrYBCg9RdWVyeUV4cHJlc3Npb24SIwoEcGF0aBgBIAMoCzIVLmNhbWluby5RdWVyeVBhdGhTdGVwEioKBWZpZWxkGAIgASgLMhkuY2FtaW5vLlF1ZXJ5RmllbGRPcGVyYW5kSAASDQoDcmVmGAMgASgJSAASDwoFZW50cnkYBCABKAhIABIRCgdtYXBfa2V5GAUgASgISAASFwoPdmFsdWVfdHlwZV9qc29uGAYgASgJQgYKBGxlYWYihQEKDlF1ZXJ5UmVkdWN0aW9uEjAKCG9wZXJhdG9yGAEgASgOMh4uY2FtaW5vLlF1ZXJ5QWdncmVnYXRlT3BlcmF0b3ISKAoHb3BlcmFuZBgCIAEoCzIXLmNhbWluby5RdWVyeUV4cHJlc3Npb24SFwoPdmFsdWVfdHlwZV9qc29uGAMgASgJInUKDFF1ZXJ5T3BlcmFuZBItCgpleHByZXNzaW9uGAEgASgLMhcuY2FtaW5vLlF1ZXJ5RXhwcmVzc2lvbkgAEisKCXJlZHVjdGlvbhgCIAEoCzIWLmNhbWluby5RdWVyeVJlZHVjdGlvbkgAQgkKB29wZXJhbmQikQEKD1F1ZXJ5Q29tcGFyaXNvbhIlCgdvcGVyYW5kGAEgASgLMhQuY2FtaW5vLlF1ZXJ5T3BlcmFuZBIxCghvcGVyYXRvchgCIAEoDjIfLmNhbWluby5RdWVyeUNvbXBhcmlzb25PcGVyYXRvchIkCgV2YWx1ZRgDIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50Ij4KElF1ZXJ5UHJlZGljYXRlTGlzdBIoCghjaGlsZHJlbhgBIAMoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZSL1AQoWUXVlcnlSZWxhdGlvblByZWRpY2F0ZRIjCgRwYXRoGAEgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFN0ZXASKwoIcmVsYXRpb24YAiABKAsyGS5jYW1pbm8uUXVlcnlSZWxhdGlvblBhdGgSOAoIb3BlcmF0b3IYAyABKA4yJi5jYW1pbm8uUXVlcnlSZWxhdGlvblByZWRpY2F0ZU9wZXJhdG9yEikKCXByZWRpY2F0ZRgEIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZRIkCgV2YWx1ZRgFIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50IroBChdRdWVyeVJlZHVjdGlvblByZWRpY2F0ZRIjCgRwYXRoGAEgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFN0ZXASKwoIcmVsYXRpb24YAiABKAsyGS5jYW1pbm8uUXVlcnlSZWxhdGlvblBhdGgSJQoFd2hlcmUYAyABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUSJgoGaGF2aW5nGAQgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlImMKF1F1ZXJ5SW50ZXJmYWNlUHJlZGljYXRlEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgBIAEoCRIpCglwcmVkaWNhdGUYAiABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUi2wIKDlF1ZXJ5UHJlZGljYXRlEikKA2FuZBgBIAEoCzIaLmNhbWluby5RdWVyeVByZWRpY2F0ZUxpc3RIABIoCgJvchgCIAEoCzIaLmNhbWluby5RdWVyeVByZWRpY2F0ZUxpc3RIABIlCgNub3QYAyABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGVIABIqCgdjb21wYXJlGAQgASgLMhcuY2FtaW5vLlF1ZXJ5Q29tcGFyaXNvbkgAEjIKCHJlbGF0aW9uGAUgASgLMh4uY2FtaW5vLlF1ZXJ5UmVsYXRpb25QcmVkaWNhdGVIABIxCgZyZWR1Y2UYBiABKAsyHy5jYW1pbm8uUXVlcnlSZWR1Y3Rpb25QcmVkaWNhdGVIABItCgJhcxgHIAEoCzIfLmNhbWluby5RdWVyeUludGVyZmFjZVByZWRpY2F0ZUgAQgsKCXByZWRpY2F0ZSJhCghRdWVyeVJvdxIoCgZvYmplY3QYASABKAsyFi5jYW1pbm8uUXVlcnlPYmplY3RSb3dIABIkCgRwYWlyGAIgASgLMhQuY2FtaW5vLlF1ZXJ5UGFpclJvd0gAQgUKA3JvdyJVCg5RdWVyeU9iamVjdFJvdxIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEgoKbWVtYmVyc2hpcBgCIAEoCBIQCghrZXlfdHlwZRgDIAEoCSJSCgxRdWVyeVBhaXJSb3cSIAoGc291cmNlGAEgASgLMhAuY2FtaW5vLlF1ZXJ5Um93EiAKBnRhcmdldBgCIAEoCzIQLmNhbWluby5RdWVyeVJvdyJFCghRdWVyeUtleRIMCgRwYXRoGAEgAygJEisKCmV4cHJlc3Npb24YAiABKAsyFy5jYW1pbm8uUXVlcnlFeHByZXNzaW9uIi8KDVF1ZXJ5RGlzdGluY3QSHgoEa2V5cxgBIAMoCzIQLmNhbWluby5RdWVyeUtleSJiCg5RdWVyeUV4cGFuc2lvbhIjCgRwYXRoGAEgAygLMhUuY2FtaW5vLlF1ZXJ5UGF0aFN0ZXASKwoIcmVsYXRpb24YAiABKAsyGS5jYW1pbm8uUXVlcnlSZWxhdGlvblBhdGgimAIKFFF1ZXJ5UmVsYXRpb25hbFN0YWdlEgoKAmlkGAEgASgNEhIKBWlucHV0GAIgASgNSAGIAQESHQoDcm93GAMgASgLMhAuY2FtaW5vLlF1ZXJ5Um93EisKBnNvdXJjZRgEIAEoCzIZLmNhbWluby5RdWVyeVJlbGF0aW9uUGF0aEgAEigKBmZpbHRlchgFIAEoCzIWLmNhbWluby5RdWVyeVByZWRpY2F0ZUgAEigKBmV4cGFuZBgGIAEoCzIWLmNhbWluby5RdWVyeUV4cGFuc2lvbkgAEikKCGRpc3RpbmN0GAcgASgLMhUuY2FtaW5vLlF1ZXJ5RGlzdGluY3RIAEILCglvcGVyYXRpb25CCAoGX2lucHV0IlMKGFF1ZXJ5UmVkdWN0aW9uUHJvamVjdGlvbhIMCgRwYXRoGAEgAygJEikKCXJlZHVjdGlvbhgCIAEoCzIWLmNhbWluby5RdWVyeVJlZHVjdGlvbiJQChNRdWVyeUFnZ3JlZ2F0ZU9yZGVyEiUKB29wZXJhbmQYASABKAsyFC5jYW1pbm8uUXVlcnlPcGVyYW5kEhIKCmRlc2NlbmRpbmcYAiABKAgi0gMKF1F1ZXJ5UmVsYXRpb25hbFRlcm1pbmFsEg0KBXN0YWdlGAEgASgNEgwKBHBhdGgYAiADKAkSDgoGZ3JvdXBzGAMgASgIEh4KBGtleXMYBCADKAsyEC5jYW1pbm8uUXVlcnlLZXkSNAoKcmVkdWN0aW9ucxgFIAMoCzIgLmNhbWluby5RdWVyeVJlZHVjdGlvblByb2plY3Rpb24SJQoFd2hlcmUYBiABKAsyFi5jYW1pbm8uUXVlcnlQcmVkaWNhdGUSJgoGaGF2aW5nGAcgASgLMhYuY2FtaW5vLlF1ZXJ5UHJlZGljYXRlEioKBW9yZGVyGAggAygLMhsuY2FtaW5vLlF1ZXJ5QWdncmVnYXRlT3JkZXISJAoFZmlyc3QYCSABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudBIiCgNhbGwYCiABKAsyFS5jYW1pbm8uUXVlcnlBcmd1bWVudBIkCgVhZnRlchgLIAEoCzIVLmNhbWluby5RdWVyeUFyZ3VtZW50EikKCXNlbGVjdGlvbhgMIAMoCzIWLmNhbWluby5RdWVyeVNlbGVjdGlvbhIQCghyZXNpZHVhbBgNIAEoCBIMCgRyb3dzGA4gASgIIncKE1F1ZXJ5UmVsYXRpb25hbFBsYW4SLAoGc3RhZ2VzGAEgAygLMhwuY2FtaW5vLlF1ZXJ5UmVsYXRpb25hbFN0YWdlEjIKCXRlcm1pbmFscxgCIAMoCzIfLmNhbWluby5RdWVyeVJlbGF0aW9uYWxUZXJtaW5hbCLpAgoQUXVlcnlSZWFkQmluZGluZxIPCgdhdG9tX2lkGAEgASgJEh0KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgCIAEoCRIRCgltZW1iZXJfaWQYAyABKAkSGwoTZ2V0dGVyX29wZXJhdGlvbl9pZBgEIAEoCRIPCgdzbG90X2lkGAUgASgJEhQKDGVkZ2VfdHlwZV9pZBgGIAEoCRIVCg1wcm9qZWN0aW9uX2lkGAcgASgJEgsKA3JwYxgIIAEoCBIgChh3YXRjaF9zdGFydF9vcGVyYXRpb25faWQYCSABKAkSHwoXd2F0Y2hfc3RvcF9vcGVyYXRpb25faWQYCiABKAkSEgoKZmllbGRfbmFtZRgLIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YDCABKAkSKAoLY2FyZGluYWxpdHkYDSABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSEAoIa2V5X3R5cGUYDiABKAkirwEKElF1ZXJ5RmllbGRDb250cmFjdBIdChVpbnRlcmZhY2VfcmV2aXNpb25faWQYASABKAkSEQoJbWVtYmVyX2lkGAIgASgJEhIKCmZpZWxkX25hbWUYAyABKAkSFwoPdmFsdWVfdHlwZV9qc29uGAQgASgJEigKC2NhcmRpbmFsaXR5GAUgASgOMhMuY2FtaW5vLkNhcmRpbmFsaXR5EhAKCGtleV90eXBlGAYgASgJIpIBCgxRdWVyeUJ1ZGdldHMSDAoEcm93cxgBIAEoDRINCgVkZXB0aBgCIAEoDRIUCgxyZXN1bHRfYnl0ZXMYAyABKA0SEgoKY2FuZGlkYXRlcxgEIAEoDRIRCglycGNfY2FsbHMYBSABKA0SEwoLY29uY3VycmVuY3kYBiABKA0SEwoLZGVhZGxpbmVfbXMYByABKA0iTAoOUXVlcnlQbGFjZW1lbnQSEQoHcmVwbGljYRgBIAEoCEgAEh8KFWxvY2FsX3NvdXJjZV9xdWVyeV9pZBgCIAEoCUgAQgYKBGtpbmQimgUKDkluc3RhbGxlZFF1ZXJ5EgoKAmlkGAEgASgJEhkKEWRlZmluaXRpb25fZGlnZXN0GAIgASgJEhYKDmJpbmRpbmdfZGlnZXN0GAMgASgJEhoKEG9iamVjdF9pbnRlcmZhY2UYBCABKAlIABIdChN3b3Jrc3BhY2VfaW50ZXJmYWNlGA4gASgJSAASKQoJc2VsZWN0aW9uGAUgAygLMhYuY2FtaW5vLlF1ZXJ5U2VsZWN0aW9uEioKCGJpbmRpbmdzGAYgAygLMhguY2FtaW5vLlF1ZXJ5UmVhZEJpbmRpbmcSJQoHYnVkZ2V0cxgHIAEoCzIULmNhbWluby5RdWVyeUJ1ZGdldHMSGwoTdmFyaWFibGVzX3R5cGVfanNvbhgIIAEoCRIYChBvdXRwdXRfdHlwZV9qc29uGAkgASgJEkcKEXZhcmlhYmxlX2RlZmF1bHRzGAogAygLMiwuY2FtaW5vLkluc3RhbGxlZFF1ZXJ5LlZhcmlhYmxlRGVmYXVsdHNFbnRyeRINCgV3YXRjaBgLIAEoCBIbChNwb2xsaW5nX2ludGVydmFsX21zGAwgASgNEh4KFnJwY19wcmVkaWNhdGVfb3Jfb3JkZXIYDSABKAgSFQoNcm9vdF9hdG9tX2lkcxgPIAMoCRIqCgZmaWVsZHMYECADKAsyGi5jYW1pbm8uUXVlcnlGaWVsZENvbnRyYWN0EikKCXBsYWNlbWVudBgRIAEoCzIWLmNhbWluby5RdWVyeVBsYWNlbWVudBpOChVWYXJpYWJsZURlZmF1bHRzRW50cnkSCwoDa2V5GAEgASgJEiQKBXZhbHVlGAIgASgLMhUuY2FtaW5vLlF1ZXJ5QXJndW1lbnQ6AjgBQgYKBHJvb3QqaAoLQ2FyZGluYWxpdHkSGwoXQ0FSRElOQUxJVFlfVU5TUEVDSUZJRUQQABIQCgxPUFRJT05BTF9PTkUQARIPCgtFWEFDVExZX09ORRACEggKBE1BTlkQAxIPCgtNQU5ZX1VOSVFVRRAEKpoCChZRdWVyeUFnZ3JlZ2F0ZU9wZXJhdG9yEigKJFFVRVJZX0FHR1JFR0FURV9PUEVSQVRPUl9VTlNQRUNJRklFRBAAEiIKHlFVRVJZX0FHR1JFR0FURV9PUEVSQVRPUl9DT1VOVBABEioKJlFVRVJZX0FHR1JFR0FURV9PUEVSQVRPUl9DT1VOVF9QUkVTRU5UEAISIAocUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX1NVTRADEiAKHFFVRVJZX0FHR1JFR0FURV9PUEVSQVRPUl9BVkcQBBIgChxRVUVSWV9BR0dSRUdBVEVfT1BFUkFUT1JfTUlOEAUSIAocUVVFUllfQUdHUkVHQVRFX09QRVJBVE9SX01BWBAGKu0CChdRdWVyeUNvbXBhcmlzb25PcGVyYXRvchIpCiVRVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX1VOU1BFQ0lGSUVEEAASIAocUVVFUllfQ09NUEFSSVNPTl9PUEVSQVRPUl9FURABEiAKHFFVRVJZX0NPTVBBUklTT05fT1BFUkFUT1JfSU4QAhIlCiFRVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0lTX05VTEwQAxIgChxRVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0xUEAQSIQodUVVFUllfQ09NUEFSSVNPTl9PUEVSQVRPUl9MVEUQBRIgChxRVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0dUEAYSIQodUVVFUllfQ09NUEFSSVNPTl9PUEVSQVRPUl9HVEUQBxIyCi5RVUVSWV9DT01QQVJJU09OX09QRVJBVE9SX0NPTlRBSU5TX0lOU0VOU0lUSVZFEAgqhAIKHlF1ZXJ5UmVsYXRpb25QcmVkaWNhdGVPcGVyYXRvchIxCi1RVUVSWV9SRUxBVElPTl9QUkVESUNBVEVfT1BFUkFUT1JfVU5TUEVDSUZJRUQQABIqCiZRVUVSWV9SRUxBVElPTl9QUkVESUNBVEVfT1BFUkFUT1JfU09NRRABEioKJlFVRVJZX1JFTEFUSU9OX1BSRURJQ0FURV9PUEVSQVRPUl9OT05FEAISKAokUVVFUllfUkVMQVRJT05fUFJFRElDQVRFX09QRVJBVE9SX0lTEAMSLQopUVVFUllfUkVMQVRJT05fUFJFRElDQVRFX09QRVJBVE9SX0lTX05VTEwQBGIGcHJvdG8z"); /** * @generated from message camino.AtomDefinition @@ -773,6 +773,28 @@ export type QueryReductionPredicate = Message<"camino.QueryReductionPredicate"> export const QueryReductionPredicateSchema: GenMessage = /*@__PURE__*/ messageDesc(file_camino_schema, 21); +/** + * @generated from message camino.QueryInterfacePredicate + */ +export type QueryInterfacePredicate = Message<"camino.QueryInterfacePredicate"> & { + /** + * @generated from field: string interface_revision_id = 1; + */ + interfaceRevisionId: string; + + /** + * @generated from field: camino.QueryPredicate predicate = 2; + */ + predicate?: QueryPredicate | undefined; +}; + +/** + * Describes the message camino.QueryInterfacePredicate. + * Use `create(QueryInterfacePredicateSchema)` to create a new message. + */ +export const QueryInterfacePredicateSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_camino_schema, 22); + /** * @generated from message camino.QueryPredicate */ @@ -816,6 +838,12 @@ export type QueryPredicate = Message<"camino.QueryPredicate"> & { */ value: QueryReductionPredicate; case: "reduce"; + } | { + /** + * @generated from field: camino.QueryInterfacePredicate as = 7; + */ + value: QueryInterfacePredicate; + case: "as"; } | { case: undefined; value?: undefined }; }; @@ -824,7 +852,7 @@ export type QueryPredicate = Message<"camino.QueryPredicate"> & { * Use `create(QueryPredicateSchema)` to create a new message. */ export const QueryPredicateSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_schema, 22); + messageDesc(file_camino_schema, 23); /** * @generated from message camino.QueryRow @@ -853,7 +881,7 @@ export type QueryRow = Message<"camino.QueryRow"> & { * Use `create(QueryRowSchema)` to create a new message. */ export const QueryRowSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_schema, 23); + messageDesc(file_camino_schema, 24); /** * @generated from message camino.QueryObjectRow @@ -880,7 +908,7 @@ export type QueryObjectRow = Message<"camino.QueryObjectRow"> & { * Use `create(QueryObjectRowSchema)` to create a new message. */ export const QueryObjectRowSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_schema, 24); + messageDesc(file_camino_schema, 25); /** * @generated from message camino.QueryPairRow @@ -902,7 +930,7 @@ export type QueryPairRow = Message<"camino.QueryPairRow"> & { * Use `create(QueryPairRowSchema)` to create a new message. */ export const QueryPairRowSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_schema, 25); + messageDesc(file_camino_schema, 26); /** * @generated from message camino.QueryKey @@ -924,7 +952,7 @@ export type QueryKey = Message<"camino.QueryKey"> & { * Use `create(QueryKeySchema)` to create a new message. */ export const QueryKeySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_schema, 26); + messageDesc(file_camino_schema, 27); /** * @generated from message camino.QueryDistinct @@ -941,7 +969,7 @@ export type QueryDistinct = Message<"camino.QueryDistinct"> & { * Use `create(QueryDistinctSchema)` to create a new message. */ export const QueryDistinctSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_schema, 27); + messageDesc(file_camino_schema, 28); /** * @generated from message camino.QueryExpansion @@ -963,7 +991,7 @@ export type QueryExpansion = Message<"camino.QueryExpansion"> & { * Use `create(QueryExpansionSchema)` to create a new message. */ export const QueryExpansionSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_schema, 28); + messageDesc(file_camino_schema, 29); /** * @generated from message camino.QueryRelationalStage @@ -1019,7 +1047,7 @@ export type QueryRelationalStage = Message<"camino.QueryRelationalStage"> & { * Use `create(QueryRelationalStageSchema)` to create a new message. */ export const QueryRelationalStageSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_schema, 29); + messageDesc(file_camino_schema, 30); /** * @generated from message camino.QueryReductionProjection @@ -1041,7 +1069,7 @@ export type QueryReductionProjection = Message<"camino.QueryReductionProjection" * Use `create(QueryReductionProjectionSchema)` to create a new message. */ export const QueryReductionProjectionSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_schema, 30); + messageDesc(file_camino_schema, 31); /** * @generated from message camino.QueryAggregateOrder @@ -1063,7 +1091,7 @@ export type QueryAggregateOrder = Message<"camino.QueryAggregateOrder"> & { * Use `create(QueryAggregateOrderSchema)` to create a new message. */ export const QueryAggregateOrderSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_schema, 31); + messageDesc(file_camino_schema, 32); /** * @generated from message camino.QueryRelationalTerminal @@ -1147,7 +1175,7 @@ export type QueryRelationalTerminal = Message<"camino.QueryRelationalTerminal"> * Use `create(QueryRelationalTerminalSchema)` to create a new message. */ export const QueryRelationalTerminalSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_schema, 32); + messageDesc(file_camino_schema, 33); /** * @generated from message camino.QueryRelationalPlan @@ -1169,7 +1197,7 @@ export type QueryRelationalPlan = Message<"camino.QueryRelationalPlan"> & { * Use `create(QueryRelationalPlanSchema)` to create a new message. */ export const QueryRelationalPlanSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_schema, 33); + messageDesc(file_camino_schema, 34); /** * @generated from message camino.QueryReadBinding @@ -1251,7 +1279,7 @@ export type QueryReadBinding = Message<"camino.QueryReadBinding"> & { * Use `create(QueryReadBindingSchema)` to create a new message. */ export const QueryReadBindingSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_schema, 34); + messageDesc(file_camino_schema, 35); /** * Checked schema survives even when no atom currently implements an interface. @@ -1295,7 +1323,7 @@ export type QueryFieldContract = Message<"camino.QueryFieldContract"> & { * Use `create(QueryFieldContractSchema)` to create a new message. */ export const QueryFieldContractSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_schema, 35); + messageDesc(file_camino_schema, 36); /** * @generated from message camino.QueryBudgets @@ -1342,7 +1370,7 @@ export type QueryBudgets = Message<"camino.QueryBudgets"> & { * Use `create(QueryBudgetsSchema)` to create a new message. */ export const QueryBudgetsSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_schema, 36); + messageDesc(file_camino_schema, 37); /** * @generated from message camino.QueryPlacement @@ -1371,7 +1399,7 @@ export type QueryPlacement = Message<"camino.QueryPlacement"> & { * Use `create(QueryPlacementSchema)` to create a new message. */ export const QueryPlacementSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_schema, 37); + messageDesc(file_camino_schema, 38); /** * @generated from message camino.InstalledQuery @@ -1475,7 +1503,7 @@ export type InstalledQuery = Message<"camino.InstalledQuery"> & { * Use `create(InstalledQuerySchema)` to create a new message. */ export const InstalledQuerySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_schema, 38); + messageDesc(file_camino_schema, 39); /** * @generated from enum camino.Cardinality diff --git a/src/query/compile.ts b/src/query/compile.ts index d9b6ec1..bf754a1 100644 --- a/src/query/compile.ts +++ b/src/query/compile.ts @@ -3,6 +3,7 @@ import { Source, validate, specifiedRules, + PossibleFragmentSpreadsRule, print, printSchema, visit, @@ -89,7 +90,7 @@ export async function compileQuery( definitions.push(...document.definitions); } const fragmentContracts = await fragmentSources(declaration, definitions, resolveFragment); - const document: DocumentNode = { kind: "Document" as DocumentNode["kind"], definitions }; + let document: DocumentNode = { kind: "Document" as DocumentNode["kind"], definitions }; if (definitions.length > 256 || Buffer.byteLength(print(document)) > 262144) fail("QUERY_SOURCE_LIMIT", "Expanded fragment sources exceed the query source budget"); visit(document, { @@ -103,7 +104,44 @@ export async function compileQuery( }, }); const generated = querySchema(declaration, interfaces, document); - const operations = definitions.filter((entry) => entry.kind === "OperationDefinition"); + // Identity belongs to the checked object result, including fragment results. + // Schema membership deliberately excludes structured values and query wrappers. + const identity = parse("query Identity { _camino { ref } }", { noLocation: true }).definitions[0]!; + if (identity.kind !== "OperationDefinition") throw new Error("Invalid identity selection"); + const identitySelection = identity.selectionSet.selections[0]!; + const identityTypes = new TypeInfo(generated.schema); + document = visit( + document, + visitWithTypeInfo(identityTypes, { + SelectionSet: { + leave(node, _key, parentNode) { + // An inline projection is part of its containing object. Its identity + // remains that object's base interface, not the projected interface. + if (parentNode && !Array.isArray(parentNode) && "kind" in parentNode && parentNode.kind === "InlineFragment") + return; + const parent = identityTypes.getParentType(); + const contract = parent && generated.byName.get(parent.name); + if (!contract || contract.revisionId === workspaceQueryRootId) return; + const hasIdentity = node.selections.some( + (field) => + field.kind === "Field" && + field.name.value === "_camino" && + !field.alias && + !field.directives?.length && + field.selectionSet?.selections.some( + (child) => + child.kind === "Field" && child.name.value === "ref" && !child.alias && !child.directives?.length, + ), + ); + // GraphQL validation caches comparisons by AST identity. Each nominal + // object must get its own metadata subtree, even though the spelling is + // identical (its reference scalar can be different). + if (!hasIdentity) return { ...node, selections: [...node.selections, structuredClone(identitySelection)] }; + }, + }, + }), + ); + const operations = document.definitions.filter((entry) => entry.kind === "OperationDefinition"); if ( operations.length !== 1 || operations[0]!.operation !== "query" || @@ -120,18 +158,56 @@ export async function compileQuery( if (!["include", "skip"].includes(node.name.value)) fail("QUERY_UNSUPPORTED_FEATURE", `Unsupported directive ${node.name.value}`, node); }, - InlineFragment(node) { - fail("QUERY_UNSUPPORTED_FEATURE", "Use named fragments on the exact selected type", node); - }, }); - const errors = validate(generated.schema, document, specifiedRules, { maxErrors: 20 }); + // Capability interfaces are nominal views of one graph object, not mutually + // exclusive GraphQL object variants. Check overlap using declared requirements. + const projectionTypes = new TypeInfo(generated.schema); + const requires = (from: InterfaceRevisionId, to: InterfaceRevisionId, seen = new Set()): boolean => { + if (from === to) return true; + if (seen.has(from)) return false; + seen.add(from); + return generated.contracts.get(from)?.requiredInterfaces?.some((id) => requires(id, to, seen)) ?? false; + }; + visit( + document, + visitWithTypeInfo(projectionTypes, { + InlineFragment(node) { + if (!node.typeCondition) return; + const from = projectionTypes.getParentType(); + const a = from && generated.byName.get(from.name); + const b = generated.byName.get(node.typeCondition.name.value); + if (!a || !b || !requires(a.revisionId, b.revisionId)) + fail( + "QUERY_UNSUPPORTED_FEATURE", + "Inline interface projections currently require a declared interface requirement", + node, + ); + }, + FragmentSpread(node) { + const fragment = document.definitions.find( + (entry) => entry.kind === "FragmentDefinition" && entry.name.value === node.name.value, + ); + if ( + fragment?.kind === "FragmentDefinition" && + fragment.typeCondition.name.value !== projectionTypes.getParentType()?.name + ) + fail("QUERY_UNSUPPORTED_FEATURE", "Named fragments currently require the exact nominal root interface", node); + }, + }), + ); + const errors = validate( + generated.schema, + document, + specifiedRules.filter((rule) => rule !== PossibleFragmentSpreadsRule), + { maxErrors: 20 }, + ); if (errors.length) { const error = errors[0]!; fail("QUERY_VALIDATION", error.message, error.nodes?.[0]); } const effects = new Map(); const fragments = new Map( - definitions + document.definitions .filter((entry): entry is FragmentDefinitionNode => entry.kind === "FragmentDefinition") .map((entry) => [entry.name.value, entry]), ); @@ -313,16 +389,28 @@ export async function compileQuery( if (isListType(type)) return valueType.list(output(type.ofType, selections, depth, conditional)); if (isObjectType(type)) { const fields: Record = {}; - const add = (set: SelectionSetNode, conditional = false) => { + const add = (set: SelectionSetNode, conditional = false, selectedType = type) => { for (const selection of set.selections) { if (++expandedFields > 10000) fail("QUERY_WORK_LIMIT", "Expanded query exceeds 10000 fields", selection); if (selection.kind === "FragmentSpread") { - add(fragments.get(selection.name.value)!.selectionSet, conditional || !!selection.directives?.length); + add( + fragments.get(selection.name.value)!.selectionSet, + conditional || !!selection.directives?.length, + selectedType, + ); + continue; + } + if (selection.kind === "InlineFragment") { + const projected = selection.typeCondition + ? generated.schema.getType(selection.typeCondition.name.value) + : selectedType; + if (!isObjectType(projected)) return fail("QUERY_TYPE", "Expected an object projection", selection); + add(selection.selectionSet, conditional || !!selection.directives?.length, projected); continue; } if (selection.kind !== "Field") continue; const key = selection.alias?.value ?? selection.name.value; - const field = type.getFields()[selection.name.value]!; + const field = selectedType.getFields()[selection.name.value]!; const previous = fields[key]; fields[key] = output( field.type, @@ -338,7 +426,9 @@ export async function compileQuery( if (previous) fields[key] = mergeOutput(previous, fields[key]!); } }; - if (selections) add(selections, conditional); + // A condition on this object makes the object optional, not every child + // of the object when it is present. Fragment conditions are handled by add. + if (selections) add(selections); return { kind: "record", fields }; } return ( @@ -409,8 +499,13 @@ export async function compileQuery( set: SelectionSetNode, parent: import("graphql").GraphQLObjectType, inherited: QuerySelection["conditions"] = [], - ): QuerySelection[] => - set.selections.flatMap((node): QuerySelection[] => { + ): QuerySelection[] => { + const selections = set.selections.flatMap((node): QuerySelection[] => { + if (node.kind === "InlineFragment") { + const projected = node.typeCondition ? generated.schema.getType(node.typeCondition.name.value) : parent; + if (!isObjectType(projected)) return fail("QUERY_TYPE", "Expected an object projection", node); + return selection(node.selectionSet, projected, [...inherited, ...conditions(node.directives)]); + } if (node.kind === "FragmentSpread") { const inheritedConditions = [...inherited, ...conditions(node.directives)]; const contract = fragmentContracts.get(node.name.value); @@ -436,6 +531,7 @@ export async function compileQuery( const contract = generated.byName.get(parent.name); const member = contract?.members.find((entry) => entry.displayName === node.name.value); const type = getNamedType(parent.getFields()[node.name.value]!.type); + const referenceType = type && generated.scalarTypes.get(type.name); const role = generated.relational.roles.get(parent.name); const relationship = role?.kind === "relations" @@ -455,6 +551,11 @@ export async function compileQuery( key: node.alias?.value ?? node.name.value, ...(member && contract ? { interfaceRevisionId: contract.revisionId, memberId: member.id } : {}), ...(member?.kind === "relationship" ? { targetInterfaceRevisionId: generated.target(member) } : {}), + ...(node.name.value === "ref" && + referenceType?.kind === "object-ref" && + referenceType.expectation.kind === "interface" + ? { targetInterfaceRevisionId: referenceType.expectation.interfaceRevisionId } + : {}), conditions: [...inherited, ...conditions(node.directives)], arguments: Object.fromEntries( (node.arguments ?? []).map((entry) => [entry.name.value, argument(entry.value)]), @@ -465,13 +566,45 @@ export async function compileQuery( }, ]; }); + const contract = generated.byName.get(parent.name); + if (!contract || contract.revisionId === workspaceQueryRootId) return selections; + // Fragment expansion may repeat metadata. Combine its children so a later + // implicit reference cannot overwrite an explicitly selected aggregate. + const metadata = selections.filter((field) => field.key === "_camino" && field.name === "_camino"); + const responseFields = new Map(); + for (const field of selections.filter((field) => field.memberId)) { + const previous = responseFields.get(field.key); + if ( + previous && + (previous.interfaceRevisionId !== field.interfaceRevisionId || previous.memberId !== field.memberId) + ) + fail("QUERY_PROJECTION_CONFLICT", `Alias distinct interface fields selected as ${field.key}`); + responseFields.set(field.key, field); + } + if (!metadata.length) return selections; + const children = metadata.flatMap((field) => + field.selection.map((child) => ({ + ...child, + conditions: [...field.conditions, ...child.conditions], + })), + ); + const ref = children.find((child) => child.key === "ref" && child.name === "ref")!; + return [ + ...selections.filter((field) => !metadata.includes(field)), + { + ...metadata[0]!, + conditions: [], + selection: [...children.filter((child) => child.key !== "ref"), { ...ref, conditions: [] }], + }, + ]; + }; const normalized = print(document), schema = printSchema(generated.schema); const selections = selection(operations[0]!.selectionSet, generated.schema.getQueryType()!); const definitionDigest = createHash("sha256") .update( canonicalJson({ - semantics: 3, + semantics: 4, declaration, normalized, // Source provenance belongs to the checked installation. Identical public diff --git a/src/query/link.ts b/src/query/link.ts index 720e771..fa81959 100644 --- a/src/query/link.ts +++ b/src/query/link.ts @@ -147,10 +147,22 @@ export function linkQueries(workspace: WorkspaceRevision): LinkedQuery[] { (entry) => entry.interfaceRevisionId === declaration.root.interface, ); const rootAtoms = [...new Set(rootConformances.map((entry) => entry.atomId))].sort(); + const qualifiedInterfaces = new Set(); + const qualifications = (node: unknown): void => { + if (!node || typeof node !== "object") return; + if ("kind" in node && node.kind === "as" && "interfaceRevisionId" in node) + qualifiedInterfaces.add(String(node.interfaceRevisionId)); + for (const child of Object.values(node)) qualifications(child); + }; + qualifications(checked.selection); const bindingDigest = createHash("sha256") .update( canonicalJson({ definition: checked.definitionDigest, + qualifiedConformances: workspace.conformances + .filter((entry) => qualifiedInterfaces.has(entry.interfaceRevisionId)) + .map((entry) => ({ atomId: entry.atomId, id: entry.id, interfaceRevisionId: entry.interfaceRevisionId })) + .sort((a, b) => canonicalJson(a).localeCompare(canonicalJson(b))), rootConformances: rootConformances .map((entry) => ({ atomId: entry.atomId, id: entry.id, interfaceRevisionId: entry.interfaceRevisionId })) .sort((a, b) => canonicalJson(a).localeCompare(canonicalJson(b))), diff --git a/src/query/relational-compile.ts b/src/query/relational-compile.ts index db1fb6a..3860b58 100644 --- a/src/query/relational-compile.ts +++ b/src/query/relational-compile.ts @@ -337,6 +337,23 @@ export function relationalCompiler( visit(current[name], field.value, [...base, name]); else if (name === "_camino") { for (const meta of pairs(field.value)) { + if (meta.name.value === "as") { + if (current.kind !== "object" || base.length || available) + fail( + "QUERY_UNSUPPORTED_FEATURE", + "Interface predicates require an object row before distinct/grouping", + meta, + ); + for (const branch of pairs(meta.value)) { + const contract = env.byName.get(branch.name.value)!; + children.push({ + kind: "as", + interfaceRevisionId: contract.revisionId, + predicate: predicate(objectRow(contract.revisionId), branch.value), + }); + } + continue; + } if (meta.name.value !== "relations") { const expr = expression(row, [...base, "_camino", meta.name.value], ["predicate"], meta, available); children.push( @@ -385,6 +402,19 @@ export function relationalCompiler( } } } else { + const member = current.kind === "object" && relationships(current).find((m) => m.displayName === name); + if (member) { + const expr = expression(row, [...base, name, "_camino", "ref"], ["predicate"], field, available); + children.push( + ...(comparisons(field.value, (operator, value) => ({ + kind: "compare", + expression: expr, + operator, + value, + })) as QueryPredicate[]), + ); + continue; + } const valuePredicate = (names: string[], value: ValueNode) => { const expr = expression(row, names, ["predicate"], field, available); const type = expr.type.kind === "optional" ? expr.type.value : expr.type; diff --git a/src/query/relational-proto.ts b/src/query/relational-proto.ts index 157cb65..5cd12f8 100644 --- a/src/query/relational-proto.ts +++ b/src/query/relational-proto.ts @@ -50,6 +50,13 @@ export function relationalWire( }); const predicate = (p: QueryPredicate | QueryAggregatePredicate): wire.QueryPredicate => { switch (p.kind) { + case "as": + return create(wire.QueryPredicateSchema, { + predicate: { + case: "as", + value: { interfaceRevisionId: p.interfaceRevisionId, predicate: predicate(p.predicate) }, + }, + }); case "and": case "or": return create(wire.QueryPredicateSchema, { diff --git a/src/query/relational-schema.ts b/src/query/relational-schema.ts index 04612ba..7b0f41e 100644 --- a/src/query/relational-schema.ts +++ b/src/query/relational-schema.ts @@ -8,6 +8,7 @@ import { GraphQLInputObjectType, GraphQLList, GraphQLNonNull, + visit, type GraphQLInputType, type GraphQLOutputType, type GraphQLInputFieldConfigMap, @@ -54,6 +55,16 @@ export interface RelationalSchemaEnvironment { } export function relationalSchema(env: RelationalSchemaEnvironment, document?: DocumentNode) { + const requestedInterfaces = new Set(); + if (document) + visit(document, { + ObjectField(node) { + if (node.name.value !== "_camino" || node.value.kind !== "ObjectValue") return; + const qualified = node.value.fields.find((field) => field.name.value === "as"); + if (qualified?.value.kind === "ObjectValue") + for (const field of qualified.value.fields) requestedInterfaces.add(field.name.value); + }, + }); const outputCache = new Map(); const inputCache = new Map(); const referenceCache = new Map(); @@ -303,14 +314,40 @@ export function relationalSchema(env: RelationalSchemaEnvironment, document?: Do not: { type: where(row) }, }; for (const [name, field] of fields(row)) { - if (row.kind === "object" && field.kind === "row") continue; if (name in result) throw new QueryCompileError("QUERY_SCHEMA_NAME", `Reserved predicate name ${name}`); + if (row.kind === "object" && field.kind === "row") { + result[name] = { + type: compare( + valueType.interfaceRef( + field.row.kind === "object" + ? field.row.interfaceRevisionId + : (() => { + throw new Error("Expected relationship object"); + })(), + ), + ), + }; + continue; + } if (field.kind === "leaf" && !comparableValue(field.type)) continue; result[name] = { type: field.kind === "row" ? where(field.row) : compare(field.type) }; } result._camino = { type: inp("WhereMeta", row, () => { const meta: GraphQLInputFieldConfigMap = {}; + if (row.kind === "object" && requestedInterfaces.size) + meta.as = { + type: inp("Interfaces", row, () => + Object.fromEntries( + [...env.contracts.values()] + .filter((contract) => !contract.template && requestedInterfaces.has(env.name(contract.revisionId))) + .map((contract) => [ + env.name(contract.revisionId), + { type: where(objectRow(contract.revisionId)) }, + ]), + ), + ), + }; for (const [name, type] of leafFields(row)) meta[name] = { type: compare(type) }; const edges = relations(row); if (edges.length) diff --git a/src/query/relational.ts b/src/query/relational.ts index 5f1886a..0e7b2a8 100644 --- a/src/query/relational.ts +++ b/src/query/relational.ts @@ -60,6 +60,7 @@ export interface QueryReduction { type: ValueType; } export type QueryPredicate = + | { kind: "as"; interfaceRevisionId: InterfaceRevisionId; predicate: QueryPredicate } | { kind: "and" | "or"; children: QueryPredicate[] } | { kind: "not"; child: QueryPredicate } | { diff --git a/src/query/schema.ts b/src/query/schema.ts index ea9e2a1..948ab25 100644 --- a/src/query/schema.ts +++ b/src/query/schema.ts @@ -12,6 +12,7 @@ import { GraphQLNonNull, GraphQLSchema, specifiedDirectives, + visit, type GraphQLOutputType, type GraphQLInputType, type GraphQLFieldConfigMap, @@ -261,6 +262,19 @@ export function querySchema( }; const schema = new GraphQLSchema({ directives: specifiedDirectives, + // Nominal projections can mention an interface not reached by a relation. + types: (() => { + const requested = new Set(); + if (document) + visit(document, { + NamedType(node) { + requested.add(node.name.value); + }, + }); + return [...contracts.values()] + .filter((contract) => !contract.template && requested.has(name(contract.revisionId))) + .map((contract) => object(contract.revisionId)); + })(), query: new GraphQLObjectType({ name: "QxQuery", fields: { root: { type: new GraphQLNonNull(object(root.interface)) } }, diff --git a/test/controller-registry.test.ts b/test/controller-registry.test.ts index 177b0af..de7cc84 100644 --- a/test/controller-registry.test.ts +++ b/test/controller-registry.test.ts @@ -38,11 +38,11 @@ test("controller discovery requires complete bounded accepted-state membership", .length, 1, ); + assert.equal((await check("query Enabled {root {objects(all:64) {entries {node {enabled}}}}}")).length, 1); for (const document of [ "query Enabled {root {objects(first:64) {entries {node {_camino {ref}}}}}}", "query Enabled {root {objects(all:65) {entries {node {_camino {ref}}}}}}", "query Enabled {root {devices:objects(all:64) {entries {node {_camino {ref}}}}}}", - "query Enabled {root {objects(all:64) {entries {node {enabled}}}}}", "query Enabled($enabled:Boolean!) {root {objects(all:64,where:{enabled:{eq:$enabled}}) {entries {node {_camino {ref}}}}}}", ]) await assert.rejects(check(document), /registry|Controller/); diff --git a/test/query-compiler.test.ts b/test/query-compiler.test.ts index cbdc52d..9304918 100644 --- a/test/query-compiler.test.ts +++ b/test/query-compiler.test.ts @@ -182,11 +182,36 @@ test("ordinary selections preserve aliases, fragment conditions and wire identit const node = checked.selection[0]!.selection[0]!.selection[0]!.selection[0]!; assert.deepEqual( node.selection.map((s) => s.key), - ["plain", "label", "due"], + ["plain", "label", "due", "_camino"], ); assert.equal(node.selection[1]!.conditions.length, 1); assert.ok(JSON.stringify(checked.selection.map(querySelectionToWire)).includes("label")); }); +test("object references are unconditional, canonical and idempotent through fragments", async () => { + const checked = await compile( + `query Upcoming($show: Boolean!) {root {items(first: 3) {entries {node {...Row @include(if: $show)}}}}}`, + `fragment Row on TaskFacts {label: title identity: _camino {alias: ref} _camino @include(if: $show) {ref}}`, + ); + const root = checked.selection[0]!; + const node = root.selection.find((s) => s.name === "items")!.selection[0]!.selection[0]!; + for (const object of [root, node]) { + const metadata = object.selection.filter((s) => s.key === "_camino"); + assert.equal(metadata.length, 1); + assert.deepEqual(metadata[0]!.conditions, []); + assert.deepEqual( + metadata[0]!.selection.filter((s) => s.key === "ref").map((s) => s.conditions), + [[]], + ); + } + assert.equal(node.selection.find((s) => s.key === "identity")!.conditions.length, 1); + const recompiled = await compileQuery( + { ...checked.declaration, fragments: [] }, + [collection, facts], + async () => checked.document, + ); + assert.deepEqual(recompiled.selection, checked.selection); + assert.deepEqual(recompiled.output, checked.output); +}); test("retired live syntax fails with migration guidance", async () => { for (const selected of ["score @live", "_camino @live {ref}", "title @live title", "title @live(unchecked: true)"]) await assert.rejects( @@ -199,6 +224,68 @@ test("retired live syntax fails with migration guidance", async () => { ); }); +test("implicit references reject aliases which occupy the canonical metadata path", async () => { + for (const invalid of ["_camino: title", "_camino {ref: __typename}"]) + await assert.rejects(compile(`query Upcoming {root {items(first: 3) {entries {node {...Row}}}}}`, `fragment Row on TaskFacts {${invalid}}`), /QUERY_VALIDATION|Introspection/); +}); + +test("implicit reference merges with conditional aggregate metadata", async () => { + const checked = await compileQuery({ ...fixture(""), fragments: [] }, [collection, facts], async () => + `query Upcoming($show: Boolean!) {root {_camino @include(if: $show) {relations {items {aggregate {count}}}}}}`); + const metadata = checked.selection[0]!.selection.filter((field) => field.key === "_camino"); + assert.equal(metadata.length, 1); + assert.deepEqual(metadata[0]!.conditions, []); + assert.equal(metadata[0]!.selection.find((field) => field.name === "relations")!.conditions.length, 1); + assert.deepEqual(metadata[0]!.selection.find((field) => field.name === "ref")!.conditions, []); + assert.equal(metadata[0]!.selection.find((field) => field.name === "relations")!.selection[0]!.selection[0]!.selection.some((field) => field.name === "_camino"), false); +}); + +test("qualified interface predicates and guaranteed inline projections retain nominal reads", async () => { + const owner = iface( + `interface Owner id "owner" revision "owner@1" { queryable value name id "name" : string {get id "name:get";} }`, + ); + const owned = iface( + `import interface Owner; + interface Owned id "owned" revision "owned@1" { + queryable relation owner id "owner" : optional-one interface Owner {resolve id "owner:resolve";} + queryable value label id "owned:label" : string {get id "owned:label:get";} + }`, + [owner], + ); + const item = iface( + `import interface Owned; + interface Item id "item" revision "item@1" requires Owned { + queryable value label id "item:label" : string {get id "item:label:get";} + }`, + [owned, owner], + ); + const declaration = { + ...fixture(""), + root: { kind: "workspace-interface" as const, interface: item.revisionId }, + fragments: [], + }; + const document = `query Upcoming($owner: QxRef_Owner!) {root {objects(all: 10, where: {_camino: {as: {Owned: {owner: {eq: $owner}}}}}) {entries {node {label ... on Owned {owner {name} ownerLabel: label}}}}}}`; + const checked = await compileQuery(declaration, [item, owned, owner], async () => document); + assert.ok( + checked.effects.some( + (effect) => + effect.interfaceRevisionId === owned.revisionId && + effect.memberId === "owner" && + effect.uses.includes("predicate"), + ), + ); + const objects = checked.selection[0]!.selection[0]!; + assert.equal(objects.predicate?.kind, "and"); + assert.ok(JSON.stringify(objects.predicate).includes('"kind":"as"')); + const node = objects.selection[0]!.selection[0]!; + assert.equal(node.selection.find((s) => s.key === "ownerLabel")!.interfaceRevisionId, owned.revisionId); + assert.equal(node.selection.filter((s) => s.key === "_camino").length, 1); + await assert.rejects( + compileQuery(declaration, [item, owned, owner], async () => document.replace("ownerLabel: label", "label")), + /QUERY_PROJECTION_CONFLICT|QUERY_VALIDATION/, + ); +}); + test("query dependency ports resolve exact exports without declaration ordering constraints", () => { const result = compileCapabilityResourceSource( `import interface Tasks; diff --git a/test/query-structured.test.ts b/test/query-structured.test.ts index ea8f30f..7b3697f 100644 --- a/test/query-structured.test.ts +++ b/test/query-structured.test.ts @@ -61,6 +61,17 @@ test("record/list query values preserve nested projections and leaf predicates", } } const raw = JSON.stringify(checked.output); + const node = extent.selection[0]!.selection[0]!; + assert.equal(node.selection.filter((field) => field.key === "_camino").length, 1); + const assertValuesOnly = (fields: typeof node.selection): void => { + for (const field of fields) { + assert.notEqual(field.name, "_camino", "Structured values do not acquire graph identity"); + assertValuesOnly(field.selection); + } + }; + assertValuesOnly(node.selection.filter((field) => field.key !== "_camino")); + assert.equal(checked.selection[0]!.selection.some((field) => field.key === "_camino"), false); + assert.equal(extent.selection.some((field) => field.key === "_camino"), false); assert.match(raw, /"begin"/); assert.match(raw, /"tags":\{"kind":"list"/); assert.equal(checked.effects.filter((e) => e.memberId === "range").length, 1); From ad64ba532fec4281f403e6cf1d3671a13da06f8d Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sat, 26 Sep 2026 11:44:50 -0700 Subject: [PATCH 78/91] Scope presentation associations to PresentationMount and retain navigation queries Generate checked navigation query pairs from closed React contracts before package checking. Retain per-type subscriptions under the logical PresentationMount and resolve cold component metadata independently of code. Keep scoped occurrence membership and idempotent local preparation in the presentation library; copy directly through state contracts without reading other PresentationMounts' source associations. Preserve normal transaction creation, pending references, portal synchronization and detach. Exercise automatic object refs in Reader queries, imported fragments and structured/aggregate results. Add heterogeneous owner-index, live dependency, cold metadata, browser ownership and latency coverage. Document measured improvements, supported query limits and qualification evidence. --- src/bindings/presentation-queries.ts | 83 +++++++++++++++++ src/capability-language/assembly.ts | 34 ++++--- src/query/compile.ts | 6 ++ src/query/relational-schema.ts | 5 +- src/query/schema.ts | 7 ++ test/query-compiler.test.ts | 133 ++++++++++++++++++++++++++- test/query-fragments.test.ts | 6 +- test/query-structured.test.ts | 10 +- 8 files changed, 260 insertions(+), 24 deletions(-) create mode 100644 src/bindings/presentation-queries.ts diff --git a/src/bindings/presentation-queries.ts b/src/bindings/presentation-queries.ts new file mode 100644 index 0000000..ec793e7 --- /dev/null +++ b/src/bindings/presentation-queries.ts @@ -0,0 +1,83 @@ +import { createHash } from "node:crypto"; +import type { InterfaceRevision, PackageRevision, ValueType } from "../capability-model/types.js"; +import { defaultQueryBudgets, type QueryDeclaration } from "../query/types.js"; + +/** React contract tooling generates ordinary queries before normal checking. + * Neither the query language nor its execution planner knows presentation IDs. */ +export function presentationQueries(pkg: PackageRevision, interfaces: readonly InterfaceRevision[]) { + const documents = new Map(); + const generated: QueryDeclaration[] = []; + const contracts = new Map(interfaces.map((contract) => [contract.revisionId, contract])); + const navigation = new Set(); + for (const module of pkg.modules ?? []) { + const contract = contracts.get(module.interfaceRevisionId); + const member = contract?.members.find((member) => member.id === module.memberId); + if (member?.kind !== "module" || member.contract !== "org.quixos.react.component/2") continue; + const argument = contract?.application?.arguments[1]; + if (argument?.kind !== "object" || argument.target.kind !== "interface") + throw Error("Stateful React presentations require a closed navigation interface"); + navigation.add(argument.target.interfaceRevisionId); + } + const valueSelection = (type: ValueType): string => { + if (type.kind === "optional" || type.kind === "list") return valueSelection(type.value); + return type.kind === "record" + ? `{${Object.entries(type.fields) + .map(([name, type]) => `${name} ${valueSelection(type)}`) + .join(" ")}}` + : ""; + }; + for (const id of [...navigation].sort()) { + const contract = contracts.get(id as InterfaceRevision["revisionId"]); + if (!contract || contract.template) throw Error(`Missing closed presentation navigation ${id}`); + const fields = contract.members.flatMap((member) => { + if ((member.kind !== "value" && member.kind !== "relationship") || !member.queryRead) return []; + if (member.kind === "value") return [`${member.displayName} ${valueSelection(member.valueType)}`]; + if (member.target.kind !== "interface") + throw Error(`Navigation relationship ${member.displayName} must declare an interface view`); + return [ + member.cardinality === "many" || member.cardinality === "many-unique" + ? `${member.displayName}(all:512) {entries {node {_camino {ref}}}}` + : `${member.displayName} {_camino {ref}}`, + ]; + }); + const stem = `PresentationNavigation${createHash("sha256").update(id).digest("hex").slice(0, 12)}`; + const inputs = `presentation:navigation:${id}:inputs`; + for (const local of [false, true]) { + const name = `${stem}${local ? "View" : "Inputs"}`; + const document = `generated/${name}.graphql`; + documents.set( + document, + `query ${name}($presentationMount: QxRef_PresentationMount!) { + root { ${local ? "availableObjects" : "objects"}(all:512, where:{_camino:{as:{PresentationState:{presentationMount:{eq:$presentationMount}}}}}) { + entries { node { ${fields.join("\n")} + ... on PresentationState { + _presentationOccurrence: occurrence + _presentationSource: source {_camino {ref}} + _presentationParent: parent {_camino {ref}} + _presentationMount: presentationMount {_camino {ref}} + } + } } + } } + }`, + ); + generated.push({ + id: local ? `presentation:navigation:${id}:view` : inputs, + displayName: name, + root: { kind: "workspace-interface", interface: contract.revisionId }, + document, + operation: name, + fragments: [], + views: [], + allowances: [], + budgets: { ...defaultQueryBudgets, rows: 5000, candidates: 5000, resultBytes: 8388608 }, + watch: local, + placement: local ? { kind: "local", sourceQueryId: inputs } : { kind: "replica" }, + }); + } + } + for (const query of generated) + if (pkg.queries?.some((existing) => existing.id === query.id || existing.displayName === query.displayName)) + throw Error(`Presentation query conflicts with an authored query: ${query.id}`); + pkg.queries = [...(pkg.queries ?? []), ...generated]; + return documents; +} diff --git a/src/capability-language/assembly.ts b/src/capability-language/assembly.ts index 43a4982..6399662 100644 --- a/src/capability-language/assembly.ts +++ b/src/capability-language/assembly.ts @@ -1,7 +1,8 @@ import { readFile, realpath } from "node:fs/promises"; import path from "node:path"; import { loadQxSources, resolveQxSources } from "./source-loader.js"; -import { compileRepositoryQuery } from "../query/compile.js"; +import { compileQuery, compileRepositoryQuery } from "../query/compile.js"; +import { presentationQueries } from "../bindings/presentation-queries.js"; import { checkQueryTemplate } from "../query/templates.js"; import { readRepositorySource } from "./source-loader.js"; import { parseControllerCatalog } from "../capability-model/controllers.js"; @@ -272,6 +273,7 @@ const createResourceGraphResolver = (quixosCommit: string, resolveResource: Capa ...(environment.interfaceClosure ?? []), ...(compiled.resource.specializations ?? []), ]; + const presentationDocuments = presentationQueries(compiled.resource.revision, queryInterfaces); for (const template of compiled.resource.revision.queryTemplates ?? []) await checkQueryTemplate(template, queryInterfaces, (name) => readRepositorySource(snapshot.directory, name), @@ -288,19 +290,23 @@ const createResourceGraphResolver = (quixosCommit: string, resolveResource: Capa if (previous) return previous; const query = pkg.queries!.find((query) => query.id === id); if (!query) throw new Error(`Unknown fragment ${pkg.revisionId}/${id}`); - const result = await compileRepositoryQuery( - snapshot.directory, - query, - queryInterfaces, - async (packageId, fragmentId) => { - if (packageId === pkg.revisionId) return compile(fragmentId, [...parents, id]); - const imported = environment.packageClosure - ?.find((other) => other.revisionId === packageId) - ?.checkedQueries?.find((query) => query.declaration.id === fragmentId); - if (!imported) throw new Error(`Unchecked imported fragment ${packageId}/${fragmentId}`); - return imported; - }, - ); + const generatedDocument = presentationDocuments.get(query.document); + const result = + generatedDocument !== undefined + ? await compileQuery(query, queryInterfaces, async () => generatedDocument) + : await compileRepositoryQuery( + snapshot.directory, + query, + queryInterfaces, + async (packageId, fragmentId) => { + if (packageId === pkg.revisionId) return compile(fragmentId, [...parents, id]); + const imported = environment.packageClosure + ?.find((other) => other.revisionId === packageId) + ?.checkedQueries?.find((query) => query.declaration.id === fragmentId); + if (!imported) throw new Error(`Unchecked imported fragment ${packageId}/${fragmentId}`); + return imported; + }, + ); checked.set(id, result); return result; }; diff --git a/src/query/compile.ts b/src/query/compile.ts index bf754a1..29e83d5 100644 --- a/src/query/compile.ts +++ b/src/query/compile.ts @@ -171,6 +171,12 @@ export async function compileQuery( visit( document, visitWithTypeInfo(projectionTypes, { + Field(node) { + const parent = projectionTypes.getParentType(); + const member = + parent && generated.byName.get(parent.name)?.members.find((member) => member.displayName === node.name.value); + if (member?.kind === "relationship") generated.target(member); + }, InlineFragment(node) { if (!node.typeCondition) return; const from = projectionTypes.getParentType(); diff --git a/src/query/relational-schema.ts b/src/query/relational-schema.ts index 7b0f41e..8cc0435 100644 --- a/src/query/relational-schema.ts +++ b/src/query/relational-schema.ts @@ -44,6 +44,7 @@ export type SchemaRowField = { kind: "leaf"; type: ValueType } | { kind: "row"; export interface RelationalSchemaEnvironment { contracts: Map; target(member: RelationshipInterfaceMember): InterfaceRevisionId; + viewable(member: RelationshipInterfaceMember): boolean; name(id: InterfaceRevisionId): string; scalar(type: ValueType): GraphQLInputType & GraphQLOutputType; comparison(type: ValueType): GraphQLInputObjectType; @@ -83,7 +84,8 @@ export function relationalSchema(env: RelationalSchemaEnvironment, document?: Do ? env.contracts .get(row.interfaceRevisionId)! .members.filter( - (member): member is RelationshipInterfaceMember => member.kind === "relationship" && !!member.queryRead, + (member): member is RelationshipInterfaceMember => + member.kind === "relationship" && !!member.queryRead && env.viewable(member), ) : []; const fields = (row: QueryRow): Map => { @@ -96,6 +98,7 @@ export function relationalSchema(env: RelationalSchemaEnvironment, document?: Do env.contracts.get(row.interfaceRevisionId)!.members.flatMap((member): [string, SchemaRowField][] => { if (member.kind === "operation" || member.kind === "module" || !member.queryRead) return []; if (member.kind === "value") return [[member.displayName, { kind: "leaf", type: member.valueType }]]; + if (!env.viewable(member)) return []; if (many(member)) return []; return [ [ diff --git a/src/query/schema.ts b/src/query/schema.ts index 948ab25..afa307f 100644 --- a/src/query/schema.ts +++ b/src/query/schema.ts @@ -150,11 +150,15 @@ export function querySchema( return result; }; const structured = structuredQueryTypes(scalar, scalarComparison, direction); + const viewable = (member: RelationshipInterfaceMember) => + member.target.kind === "interface" || + declaration.views.some((view) => member.target.kind === "atom" && view.atomId === member.target.atomId); const comparison = (type: ValueType) => structured.input(type) as GraphQLInputObjectType; const relational = relationalSchema( { contracts, target, + viewable, name, scalar, comparison, @@ -205,6 +209,9 @@ export function querySchema( if (member.kind === "value") { fields[member.displayName] = { type: structured.output(member.valueType) }; } else { + // Reference-only projections need no views for unselected outgoing + // atom relationships. Selecting one still requires its explicit view. + if (!viewable(member)) continue; const targetId = target(member), node = object(targetId); if (member.cardinality === "exactly-one" || member.cardinality === "optional-one") diff --git a/test/query-compiler.test.ts b/test/query-compiler.test.ts index 9304918..649d15b 100644 --- a/test/query-compiler.test.ts +++ b/test/query-compiler.test.ts @@ -226,18 +226,33 @@ test("retired live syntax fails with migration guidance", async () => { test("implicit references reject aliases which occupy the canonical metadata path", async () => { for (const invalid of ["_camino: title", "_camino {ref: __typename}"]) - await assert.rejects(compile(`query Upcoming {root {items(first: 3) {entries {node {...Row}}}}}`, `fragment Row on TaskFacts {${invalid}}`), /QUERY_VALIDATION|Introspection/); + await assert.rejects( + compile( + `query Upcoming {root {items(first: 3) {entries {node {...Row}}}}}`, + `fragment Row on TaskFacts {${invalid}}`, + ), + /QUERY_VALIDATION|Introspection/, + ); }); test("implicit reference merges with conditional aggregate metadata", async () => { - const checked = await compileQuery({ ...fixture(""), fragments: [] }, [collection, facts], async () => - `query Upcoming($show: Boolean!) {root {_camino @include(if: $show) {relations {items {aggregate {count}}}}}}`); + const checked = await compileQuery( + { ...fixture(""), fragments: [] }, + [collection, facts], + async () => + `query Upcoming($show: Boolean!) {root {_camino @include(if: $show) {relations {items {aggregate {count}}}}}}`, + ); const metadata = checked.selection[0]!.selection.filter((field) => field.key === "_camino"); assert.equal(metadata.length, 1); assert.deepEqual(metadata[0]!.conditions, []); assert.equal(metadata[0]!.selection.find((field) => field.name === "relations")!.conditions.length, 1); assert.deepEqual(metadata[0]!.selection.find((field) => field.name === "ref")!.conditions, []); - assert.equal(metadata[0]!.selection.find((field) => field.name === "relations")!.selection[0]!.selection[0]!.selection.some((field) => field.name === "_camino"), false); + assert.equal( + metadata[0]!.selection + .find((field) => field.name === "relations")! + .selection[0]!.selection[0]!.selection.some((field) => field.name === "_camino"), + false, + ); }); test("qualified interface predicates and guaranteed inline projections retain nominal reads", async () => { @@ -280,6 +295,21 @@ test("qualified interface predicates and guaranteed inline projections retain no const node = objects.selection[0]!.selection[0]!; assert.equal(node.selection.find((s) => s.key === "ownerLabel")!.interfaceRevisionId, owned.revisionId); assert.equal(node.selection.filter((s) => s.key === "_camino").length, 1); + await assert.rejects( + compileQuery(declaration, [item, owned, owner], async () => + document.replace("ownerLabel: label", "ownerLabel: label _camino {ref}"), + ), + /QUERY_VALIDATION/, + ); + const explicitProjectionRef = await compileQuery(declaration, [item, owned, owner], async () => + document.replace("ownerLabel: label", "ownerLabel: label ownedIdentity: _camino {ref}"), + ); + const projectedNode = explicitProjectionRef.selection[0]!.selection[0]!.selection[0]!.selection[0]!; + assert.equal( + projectedNode.selection.find((field) => field.key === "_camino")!.selection.find((field) => field.key === "ref")! + .targetInterfaceRevisionId, + item.revisionId, + ); await assert.rejects( compileQuery(declaration, [item, owned, owner], async () => document.replace("ownerLabel: label", "label")), /QUERY_PROJECTION_CONFLICT|QUERY_VALIDATION/, @@ -369,3 +399,98 @@ test("query allowlist and two-sided RPC effects fail during compilation", async await rejects(compile(document.replace("...Row", "__typename ...Row")), "QUERY_UNSUPPORTED_FEATURE"); await rejects(compile(document, "fragment Row on TaskFacts { ...Row }"), "QUERY_VALIDATION"); }); + +test("unselected atom relationships do not require views on reference-only targets", async () => { + const target = iface(`external atom Detail id "detail"; + interface Referenced id "referenced" revision "referenced@1" { + queryable relation details id "details" : many atom Detail {resolve id "details:resolve";} + }`); + const subject = iface( + `external atom Detail id "detail"; import interface Referenced; + interface Subject id "subject" revision "subject@1" { + queryable relation selected id "selected" : optional-one interface Referenced {resolve id "selected:resolve";} + }`, + [target], + ); + const declaration = { + ...fixture(""), + root: { kind: "object" as const, interface: subject.revisionId }, + fragments: [], + }; + const document = "query Upcoming {root {selected {_camino {ref}}}}"; + const checked = await compileQuery(declaration, [subject, target], async () => document); + assert.match(JSON.stringify(checked.output), /referenced@1/); + await assert.rejects( + compileQuery( + declaration, + [subject, target], + async () => "query Upcoming {root {selected {details(all: 3) {entries {node {_camino {ref}}}}}}}", + ), + /QUERY_VIEW_REQUIRED/, + ); +}); + +test("React tooling generates checked owner queries from imported closed navigation fields", async () => { + const { presentationQueries } = await import("../src/bindings/presentation-queries.js"); + const mount = iface('interface PresentationMount id "mount" revision "mount@1" {}'); + const subject = iface('interface Subject id "subject" revision "subject@1" {}'); + const state = iface( + `import interface PresentationMount; import interface Subject; + interface PresentationState id "state" revision "state@1" { + queryable value occurrence id "occurrence" : string {get id "occurrence:get" execution snapshot targets [browser,server];} + queryable relation presentationMount id "mount" : optional-one interface PresentationMount {resolve id "mount:resolve" execution snapshot targets [browser,server];} + queryable relation parent id "parent" : optional-one interface PresentationState {resolve id "parent:resolve" execution snapshot targets [browser,server];} + queryable relation source id "source" : exactly-one interface Subject {resolve id "source:resolve" execution snapshot targets [browser,server];} + }`, + [mount, subject], + ); + const navigation = iface( + `import interface PresentationState; + interface Navigation id "navigation" revision "navigation@1" requires PresentationState { + queryable value custom id "custom" : T {get id "custom:get" execution snapshot targets [browser,server];} + }`, + [mount, subject, state], + ); + const react = iface( + `import interface PresentationState; + interface ReactComponent id "react" revision "react@1" { + module render id "render" contract "org.quixos.react.component/2" subject object Subject; + }`, + [mount, subject, state], + ); + const dependencies = [mount, subject, state, navigation, react]; + const parsed = compileCapabilityResourceSource( + `import interface ReactComponent; import interface Navigation; import interface Subject; + package Example id "example" revision "example@1" { + module Screen id "screen" implements ReactComponent>.render; + }`, + { + source, + environment: { + interfaces: new Map(dependencies.map((entry) => [entry.displayName, entry])), + interfaceClosure: dependencies, + }, + }, + ); + assert.ok(parsed.ok, JSON.stringify(parsed.diagnostics)); + if (parsed.resource.kind !== "package") throw Error("package required"); + const contracts = [...dependencies, ...(parsed.resource.specializations ?? [])]; + const documents = presentationQueries(parsed.resource.revision, contracts); + assert.equal(documents.size, 2); + const checked = await Promise.all( + parsed.resource.revision.queries!.map((query) => + compileQuery(query, contracts, async (name) => documents.get(name)!), + ), + ); + assert.deepEqual( + checked.map((query) => query.declaration.placement?.kind), + ["replica", "local"], + ); + assert.match(JSON.stringify(checked[0]!.output), /"custom":\{"kind":"record","fields":\{"label"/); + assert.match(JSON.stringify(checked[0]!.selection), /"kind":"as"/); + assert( + checked.every((query) => + query.effects.some((effect) => effect.memberId === "mount" && effect.uses.includes("predicate")), + ), + ); +}); diff --git a/test/query-fragments.test.ts b/test/query-fragments.test.ts index c202af9..880f0e9 100644 --- a/test/query-fragments.test.ts +++ b/test/query-fragments.test.ts @@ -34,7 +34,7 @@ test("exported fragments generate local projection and direct admission", async assert.equal(p.queries!.length, 2); const local = p.queries!.find((q) => !q.fragment?.admission)!; assert.equal(local.placement?.kind, "local"); - const checked = await compileQuery(local, [item], async () => "fragment Row on Item {_camino {ref} title}"); + const checked = await compileQuery(local, [item], async () => "fragment Row on Item {title}"); assert.equal(checked.output.kind, "record"); assert.match(checked.document, /query QuixosFragment/); await assert.rejects( @@ -47,7 +47,7 @@ test("imported fragments retain checked occurrences and require exact roots", as const checked = await compileQuery( provider.queries!.find((q) => !q.fragment?.admission)!, [item], - async () => "fragment Row on Item {_camino {ref} title}", + async () => "fragment Row on Item {title}", ); const consumer = pkg( 'query Screen id "screen" root Item document "screen.graphql" operation "Screen" {replica; fragments Provider.Row;}', @@ -145,7 +145,7 @@ test("independent fragment package survives execution lowering and typed client compileQuery( q, workspace.interfaceImports, - async () => "fragment CommentRow on CommentData {_camino {ref} content {text tags}}", + async () => "fragment CommentRow on CommentData {content {text tags}}", ), ), ); diff --git a/test/query-structured.test.ts b/test/query-structured.test.ts index 7b3697f..a53c735 100644 --- a/test/query-structured.test.ts +++ b/test/query-structured.test.ts @@ -70,8 +70,14 @@ test("record/list query values preserve nested projections and leaf predicates", } }; assertValuesOnly(node.selection.filter((field) => field.key !== "_camino")); - assert.equal(checked.selection[0]!.selection.some((field) => field.key === "_camino"), false); - assert.equal(extent.selection.some((field) => field.key === "_camino"), false); + assert.equal( + checked.selection[0]!.selection.some((field) => field.key === "_camino"), + false, + ); + assert.equal( + extent.selection.some((field) => field.key === "_camino"), + false, + ); assert.match(raw, /"begin"/); assert.match(raw, /"tags":\{"kind":"list"/); assert.equal(checked.effects.filter((e) => e.memberId === "range").length, 1); From fdb7cd3f6ffd96e74eb479003d33e6611f08af48 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 27 Sep 2026 15:53:34 -0700 Subject: [PATCH 79/91] Add checked query composition foundations for prepared presentations Move React navigation query generation behind an explicit build frontend. Add checked result-dependent query bindings and pure composition evaluation, including one-snapshot server execution. Preserve the existing rendering path while the React manifest, worker preparation, and replica admission integration remain pending; see docs/PREPARED_PRESENTATIONS_PROGRESS.md. --- flake.nix | 2 + nix/checked-candidate.nix | 23 +++ src/capability-language/assembly.ts | 100 ++++++++--- src/capability-language/component-scaffold.ts | 5 + src/capability-language/query-generator.ts | 13 ++ src/capability-language/resource-cli.ts | 5 + src/capability-language/workspace-cli.ts | 4 + src/capability-model/types.ts | 1 + src/execution-world/queries.ts | 32 ++++ src/query/composition.ts | 139 +++++++++++++++ src/query/schema.ts | 7 +- src/react-build/package-queries.ts | 11 ++ test/query-composition.test.ts | 117 +++++++++++++ test/query-source-generation.test.ts | 159 ++++++++++++++++++ 14 files changed, 595 insertions(+), 23 deletions(-) create mode 100644 src/capability-language/query-generator.ts create mode 100644 src/query/composition.ts create mode 100644 src/react-build/package-queries.ts create mode 100644 test/query-composition.test.ts create mode 100644 test/query-source-generation.test.ts diff --git a/flake.nix b/flake.nix index 7f2a1a8..efac4b1 100644 --- a/flake.nix +++ b/flake.nix @@ -41,6 +41,7 @@ patchShebangs node_modules/.bin node_modules/@bufbuild/protoc-gen-es/bin yarn build esbuild dist/src/execution-world/index.js --bundle --platform=node --target=node24 --format=esm --outfile=execution-world.mjs + esbuild dist/src/react-build/package-queries.js --bundle --platform=node --target=node24 --format=esm --outfile=react-query-generator.mjs esbuild dist/src/bindings/client.js --bundle --platform=node --target=node24 --format=esm --outfile=client-codegen.mjs diff --recursive --unified "$TMPDIR/generated-before/proto" src/gen diff --recursive --unified "$TMPDIR/generated-before/capability" src/capability-language/generated @@ -122,6 +123,7 @@ chmod +x "$out/bin/quixos-lock-check" mkdir -p "$out/libexec/quixos-protocol" install -m644 execution-world.mjs "$out/libexec/quixos-protocol/execution-world.mjs" + install -m644 react-query-generator.mjs "$out/libexec/quixos-protocol/react-query-generator.mjs" install -m644 client-codegen.mjs "$out/libexec/quixos-protocol/client-codegen.mjs" install -m644 react-platform.mjs "$out/libexec/quixos-protocol/react-platform.mjs" install -m644 quixos-codegen-ts.mjs quixos-qx.mjs "$out/libexec/quixos-protocol/" diff --git a/nix/checked-candidate.nix b/nix/checked-candidate.nix index 7e61b45..8fc6be4 100644 --- a/nix/checked-candidate.nix +++ b/nix/checked-candidate.nix @@ -65,6 +65,27 @@ let }) (flatten root) ) ); + # Frontends are an explicit build choice. The capability assembler itself + # neither discovers React contracts nor loads executable package code. + queryFrontends = pkgs.lib.unique ( + pkgs.lib.concatMap ( + node: + let + config = node.directory + "/quixos.check.json"; + in + if builtins.pathExists config then + (builtins.fromJSON (builtins.readFile config)).queryFrontends or [ ] + else + [ ] + ) (capabilityFlatten root) + ); + queryGeneratorFlags = + if queryFrontends == [ ] then + "" + else if queryFrontends == [ "react" ] then + "--query-generator ${protocol}/libexec/quixos-protocol/react-query-generator.mjs" + else + throw "Unsupported query frontend selection: ${builtins.toJSON queryFrontends}"; snapshots = pkgs.writeText "qx-nix-source-graph.json" ( builtins.toJSON { resources = map (node: { @@ -85,6 +106,7 @@ let if node.kind == "workspace" then '' ${protocol}/bin/quixos-workspace-compile --root ${node.directory} \ + ${queryGeneratorFlags} \ --source-root-commit ${pkgs.lib.escapeShellArg node.commit} \ --checkout-root "$TMPDIR/checkouts" --snapshot-map ${snapshots} \ --graph-out "$out/graph.json" --schemas-out "$out/package-schemas.json" \ @@ -93,6 +115,7 @@ let else '' ${protocol}/bin/quixos-resource-compile --root ${node.directory} \ + ${queryGeneratorFlags} \ --kind ${node.kind} --repository ${pkgs.lib.escapeShellArg node.repository} \ --commit ${pkgs.lib.escapeShellArg node.commit} \ --checkout-root "$TMPDIR/checkouts" --snapshot-map ${snapshots} --snapshot-only true \ diff --git a/src/capability-language/assembly.ts b/src/capability-language/assembly.ts index 6399662..14c878c 100644 --- a/src/capability-language/assembly.ts +++ b/src/capability-language/assembly.ts @@ -2,7 +2,8 @@ import { readFile, realpath } from "node:fs/promises"; import path from "node:path"; import { loadQxSources, resolveQxSources } from "./source-loader.js"; import { compileQuery, compileRepositoryQuery } from "../query/compile.js"; -import { presentationQueries } from "../bindings/presentation-queries.js"; +import type { QueryDeclaration } from "../query/types.js"; +import { compileQueryComposition, type QueryComposition } from "../query/composition.js"; import { checkQueryTemplate } from "../query/templates.js"; import { readRepositorySource } from "./source-loader.js"; import { parseControllerCatalog } from "../capability-model/controllers.js"; @@ -42,6 +43,19 @@ export type CapabilityRepositoryResolver = ( kind: LockedResource["kind"], ) => Promise; +/** An explicitly selected build frontend supplies ordinary query sources. The + * assembler never chooses a frontend by inspecting an interface/contract ID. + * Generated sources go through the same query and imported-fragment checks. */ +export type PackageQueryGenerator = (input: { + readonly package: Readonly; + readonly interfaces: readonly InterfaceRevision[]; + readonly readSource: (name: string) => Promise; +}) => Promise<{ + readonly queries: readonly QueryDeclaration[]; + readonly documents: ReadonlyMap; + readonly compositions?: readonly QueryComposition[]; +}>; + export type ResolvedCapabilityResource = { key: string; kind: LockedResource["kind"]; @@ -198,7 +212,11 @@ const environmentFor = ( }; }; -const createResourceGraphResolver = (quixosCommit: string, resolveResource: CapabilityRepositoryResolver) => { +const createResourceGraphResolver = ( + quixosCommit: string, + resolveResource: CapabilityRepositoryResolver, + generateQueries?: PackageQueryGenerator, +) => { const resolved = new Map>(); const active: string[] = []; @@ -273,7 +291,22 @@ const createResourceGraphResolver = (quixosCommit: string, resolveResource: Capa ...(environment.interfaceClosure ?? []), ...(compiled.resource.specializations ?? []), ]; - const presentationDocuments = presentationQueries(compiled.resource.revision, queryInterfaces); + const generated = await generateQueries?.({ + package: structuredClone(compiled.resource.revision), + interfaces: structuredClone(queryInterfaces), + readSource: (name) => readRepositorySource(snapshot.directory, name), + }); + if (generated) { + const queries = [...(compiled.resource.revision.queries ?? [])]; + for (const query of generated.queries) { + if (queries.some((entry) => entry.id === query.id || entry.displayName === query.displayName)) + throw new Error(`Generated query conflicts with an authored query: ${query.id}`); + if (!generated.documents.has(query.document)) + throw new Error(`Generated query has no source: ${query.document}`); + queries.push(structuredClone(query)); + } + compiled.resource.revision.queries = queries; + } for (const template of compiled.resource.revision.queryTemplates ?? []) await checkQueryTemplate(template, queryInterfaces, (name) => readRepositorySource(snapshot.directory, name), @@ -290,29 +323,42 @@ const createResourceGraphResolver = (quixosCommit: string, resolveResource: Capa if (previous) return previous; const query = pkg.queries!.find((query) => query.id === id); if (!query) throw new Error(`Unknown fragment ${pkg.revisionId}/${id}`); - const generatedDocument = presentationDocuments.get(query.document); - const result = - generatedDocument !== undefined - ? await compileQuery(query, queryInterfaces, async () => generatedDocument) - : await compileRepositoryQuery( - snapshot.directory, - query, - queryInterfaces, - async (packageId, fragmentId) => { - if (packageId === pkg.revisionId) return compile(fragmentId, [...parents, id]); - const imported = environment.packageClosure - ?.find((other) => other.revisionId === packageId) - ?.checkedQueries?.find((query) => query.declaration.id === fragmentId); - if (!imported) throw new Error(`Unchecked imported fragment ${packageId}/${fragmentId}`); - return imported; - }, - ); + const resolveFragment = async (packageId: string, fragmentId: string) => { + if (packageId === pkg.revisionId) return compile(fragmentId, [...parents, id]); + const imported = environment.packageClosure + ?.find((other) => other.revisionId === packageId) + ?.checkedQueries?.find((query) => query.declaration.id === fragmentId); + if (!imported) throw new Error(`Unchecked imported fragment ${packageId}/${fragmentId}`); + return imported; + }; + const result = generated?.documents.has(query.document) + ? await compileQuery( + query, + queryInterfaces, + async (name) => + generated.documents.get(name) ?? (await readRepositorySource(snapshot.directory, name)), + resolveFragment, + ) + : await compileRepositoryQuery(snapshot.directory, query, queryInterfaces, resolveFragment); checked.set(id, result); return result; }; pkg.checkedQueries = []; for (const query of pkg.queries!) pkg.checkedQueries.push(await compile(query.id)); } + if (generated?.compositions?.length) { + const pkg = compiled.resource.revision; + const queries = new Map((pkg.checkedQueries ?? []).map((query) => [query.declaration.id, query])); + for (const dependency of environment.packageClosure ?? []) + for (const query of dependency.checkedQueries ?? []) + queries.set(JSON.stringify([dependency.revisionId, query.declaration.id]), query); + const ids = new Set(); + pkg.queryCompositions = generated.compositions.map((composition) => { + if (ids.has(composition.id)) throw new Error(`Duplicate query composition: ${composition.id}`); + ids.add(composition.id); + return compileQueryComposition(composition, queries); + }); + } let controllerText: string | undefined; try { controllerText = await readRepositorySource(snapshot.directory, "quixos.controllers.json"); @@ -377,12 +423,17 @@ export const compileCapabilityResourceRepository = async (options: { kind: LockedResource["kind"]; source: GitSource; resolveResource: CapabilityRepositoryResolver; + generateQueries?: PackageQueryGenerator; }): Promise => { const lockResult = await loadQuixosLock(path.join(options.rootDirectory, "quixos.lock")); if (!lockResult.ok) { throw new Error(diagnosticsMessage("Resource lock", lockResult.diagnostics)); } - const resolver = createResourceGraphResolver(lockResult.lock.quixos.commit, options.resolveResource); + const resolver = createResourceGraphResolver( + lockResult.lock.quixos.commit, + options.resolveResource, + options.generateQueries, + ); const root = await resolver.visit( { kind: options.kind, @@ -408,13 +459,18 @@ export const compileWorkspaceRepository = async (options: { sourceRootCommit?: string; /** An editor's proposed source snapshot; locks and dependency revisions remain exact. */ readSource?: (name: string) => Promise; + generateQueries?: PackageQueryGenerator; }): Promise => { const rootLockResult = await loadQuixosLock(path.join(options.rootDirectory, "quixos.lock")); if (!rootLockResult.ok) { throw new Error(diagnosticsMessage("Workspace lock", rootLockResult.diagnostics)); } const rootLock = rootLockResult.lock; - const resolver = createResourceGraphResolver(rootLock.quixos.commit, options.resolveResource); + const resolver = createResourceGraphResolver( + rootLock.quixos.commit, + options.resolveResource, + options.generateQueries, + ); const directPairs: Array<[LockedResource, ResolvedCapabilityResource]> = []; for (const locked of rootLock.resources) { diff --git a/src/capability-language/component-scaffold.ts b/src/capability-language/component-scaffold.ts index 3b317eb..a5bacb9 100644 --- a/src/capability-language/component-scaffold.ts +++ b/src/capability-language/component-scaffold.ts @@ -55,12 +55,17 @@ export async function scaffoldComponent( const insertion = ` ${nixLiteral(spec.id)} = { entry = ${nixLiteral(`src/components/${spec.name}.tsx`)}; export = ${nixLiteral(spec.name)}; };\n`; const after = before.replace(/\n}(\s*)$/, (_match, trailing) => "\n" + insertion + "}" + trailing); const parentID = parent.children.find((node) => node.kind === "stringLiteral")!; + const configFile = prefix + "quixos.check.json"; + const configBefore = await fs.readFile(path.join(root, configFile), "utf8"); + const config = JSON.parse(configBefore); + config.queryFrontends = [...new Set([...(config.queryFrontends ?? []), "react"])]; return { kind: "package", source: spec.source, resourceRoot: spec.directory, validation: "syntax", files: [ + { file: configFile, expected: configBefore, replace: JSON.stringify(config, null, 2) + "\n" }, { file: prefix + "package.qx", edits: [ diff --git a/src/capability-language/query-generator.ts b/src/capability-language/query-generator.ts new file mode 100644 index 0000000..ab7ce45 --- /dev/null +++ b/src/capability-language/query-generator.ts @@ -0,0 +1,13 @@ +import path from "node:path"; +import { pathToFileURL } from "node:url"; +import type { PackageQueryGenerator } from "./assembly.js"; + +/** The build invoker selects this executable explicitly. Never resolve a + * generator by a capability name or execute a module discovered in user QX. */ +export async function loadQueryGenerator(filename?: string): Promise { + if (!filename) return undefined; + const module = await import(pathToFileURL(path.resolve(filename)).href); + if (typeof module.generatePackageQueries !== "function") + throw new Error("Query generator must export generatePackageQueries"); + return module.generatePackageQueries; +} diff --git a/src/capability-language/resource-cli.ts b/src/capability-language/resource-cli.ts index ae67357..836419a 100644 --- a/src/capability-language/resource-cli.ts +++ b/src/capability-language/resource-cli.ts @@ -5,10 +5,12 @@ import process from "node:process"; import { bindingSchema } from "../bindings/index.js"; import { compileCapabilityResourceRepository, type ResolvedCapabilityResource } from "./assembly.js"; import { createGitCapabilityResolver } from "./git-resolver.js"; +import { loadQueryGenerator } from "./query-generator.js"; const usage = `usage: quixos-resource-compile --root DIRECTORY --kind interface|package|build --repository URL --commit GIT_REV --checkout-root DIRECTORY [--snapshot-map PATH] [--snapshot-only true] [--graph-out PATH] [--schema-out PATH] + [--query-generator BUILD_MODULE_PATH] Resolves a standalone resource's recursive dependency-lock graph, validates its interface.qx or package.qx manifest, and emits the checked resource as JSON.`; @@ -30,6 +32,7 @@ const parseArgs = (args: string[]) => { "--snapshot-only", "--graph-out", "--schema-out", + "--query-generator", ].includes(key) || values.has(key) ) @@ -65,6 +68,7 @@ const parseArgs = (args: string[]) => { snapshotOnly: values.get("--snapshot-only") === "true", graphOut: values.get("--graph-out"), schemaOut: values.get("--schema-out"), + queryGenerator: values.get("--query-generator"), } as const; }; @@ -106,6 +110,7 @@ const main = async () => { commit: options.commit, }, resolveResource, + generateQueries: await loadQueryGenerator(options.queryGenerator), }); if (options.graphOut) { await writeFile( diff --git a/src/capability-language/workspace-cli.ts b/src/capability-language/workspace-cli.ts index 82b4ac0..ffe57e4 100644 --- a/src/capability-language/workspace-cli.ts +++ b/src/capability-language/workspace-cli.ts @@ -4,6 +4,7 @@ import { readFile, writeFile } from "node:fs/promises"; import process from "node:process"; import { compileWorkspaceRepository } from "./assembly.js"; import { createGitCapabilityResolver } from "./git-resolver.js"; +import { loadQueryGenerator } from "./query-generator.js"; import { compileExecutionPlan } from "../execution-world/index.js"; import { bindingSchema, specializeBindingSchema } from "../bindings/index.js"; import { @@ -17,6 +18,7 @@ const usage = `usage: quixos-workspace-compile --root DIRECTORY --checkout-root [--snapshot-map PATH] [--graph-out PATH] [--workspace-id ID] [--workspace-revision-id ID] [--source-root-commit GIT_REV] [--baseline PLAN_JSON] [--evolution-out PATH] [--reviews REVIEW_JSON] [--schemas-out PATH] [--execution-plan-out PATH] + [--query-generator BUILD_MODULE_PATH] Resolves a workspace's recursive resource-lock graph, clones every exact resource revision, validates standalone interface/package manifests, and emits @@ -46,6 +48,7 @@ const parseArgs = (args: string[]) => { baseline: values.get("--baseline"), evolutionOut: values.get("--evolution-out"), reviews: values.get("--reviews"), + queryGenerator: values.get("--query-generator"), }; }; @@ -65,6 +68,7 @@ const main = async () => { workspaceRevisionId: options.workspaceRevisionId, sourceRootCommit: options.sourceRootCommit, resolveResource, + generateQueries: await loadQueryGenerator(options.queryGenerator), }); if (options.graphOut) { diff --git a/src/capability-model/types.ts b/src/capability-model/types.ts index b3002af..6e8607e 100644 --- a/src/capability-model/types.ts +++ b/src/capability-model/types.ts @@ -330,6 +330,7 @@ export interface PackageRevision { controllers?: PackageController[]; queries?: import("../query/types.js").QueryDeclaration[]; checkedQueries?: import("../query/types.js").CheckedQuery[]; + queryCompositions?: import("../query/composition.js").CheckedQueryComposition[]; queryTemplates?: import("../query/types.js").QueryTemplate[]; genericExports?: import("./generic-packages.js").GenericPackageExport[]; argumentRequirements?: { target: ObjectExpectation; required: InterfaceRevisionId }[]; diff --git a/src/execution-world/queries.ts b/src/execution-world/queries.ts index fdf62d0..8ddf438 100644 --- a/src/execution-world/queries.ts +++ b/src/execution-world/queries.ts @@ -3,6 +3,7 @@ import { compileInspectionTemplates } from "./inspection.js"; import { portableValueSchema } from "../bindings/portable.js"; import { ExecutionPlanError, hexDigest, type ExecutionPlan } from "./plan.js"; import type { ValueType } from "../capability-model/types.js"; +import { compileQueryComposition } from "../query/composition.js"; const lowerTypes = (value: unknown): unknown => JSON.parse( @@ -25,9 +26,40 @@ export function compileQueryProgram(plan: ExecutionPlan): unknown { if (hexDigest(plan.definition) !== plan.digest) throw new ExecutionPlanError("INVALID_PLAN", "queries", "Plan digest mismatch"); const interfaces = plan.definition.workspace.interfaceImports; + const allQueries = new Map(plan.definition.queries.map(({ id, query }) => [id, query.checked])); + const compositions = plan.definition.workspace.packageImports.flatMap((pkg) => + (pkg.queryCompositions ?? []).map((composition) => { + const scoped = new Map(allQueries); + for (const query of pkg.checkedQueries ?? []) scoped.set(query.declaration.id, query); + const checked = compileQueryComposition( + { + id: composition.id, + input: composition.input, + steps: composition.steps, + maxQueries: composition.maxQueries, + }, + scoped, + ); + if (checked.definitionDigest !== composition.definitionDigest) + throw new ExecutionPlanError("INVALID_QUERY_COMPOSITION", composition.id, "Checked dependencies changed"); + return { + id: JSON.stringify([pkg.revisionId, composition.id]), + input: portableValueSchema(checked.input), + output: portableValueSchema(checked.output), + maxQueries: checked.maxQueries, + steps: checked.steps.map((step) => ({ + ...step, + query: (pkg.checkedQueries ?? []).some((query) => query.declaration.id === step.query) + ? JSON.stringify([pkg.revisionId, step.query]) + : step.query, + })), + }; + }), + ); return { codec: "camino-query-program-v1", plan: (compileKernelProgram(plan) as { plan: string }).plan, + ...(compositions.length ? { compositions } : {}), queries: [ ...compileInspectionTemplates(plan).queries, ...plan.definition.queries.map(({ id, query, admittedOperations }) => { diff --git a/src/query/composition.ts b/src/query/composition.ts new file mode 100644 index 0000000..bcfa0e5 --- /dev/null +++ b/src/query/composition.ts @@ -0,0 +1,139 @@ +import { createHash } from "node:crypto"; +import type { ValueType } from "../capability-model/types.js"; +import { canonicalJson } from "../capability-model/evolution.js"; +import { QueryCompileError, type CheckedQuery } from "./types.js"; + +/** Bindings refer to checked values, never executable callbacks. A path cannot + * silently cross a nullable value or expand an unbounded collection. */ +export type QueryBinding = + | { literal: string | boolean } + | { equal: [QueryBinding, QueryBinding] } + | { from: "input"; path: string[] } + | { from: "item"; path: string[] } + | { from: "result"; name: string; path: string[] } + | { record: Record }; + +export interface QueryCompositionStep { + name: string; + query: string; + root: QueryBinding | null; + arguments: QueryBinding; + /** Null roots skip this step and produce null, rather than querying an + * arbitrary object or treating unavailable query inputs as absence. */ + optional?: boolean; + when?: QueryBinding; + /** An optional object is unwrapped as item; absence skips the query. */ + with?: QueryBinding; + each?: { source: QueryBinding; limit: number }; +} + +export interface QueryComposition { + id: string; + input: ValueType; + steps: QueryCompositionStep[]; + maxQueries: number; +} + +export interface CheckedQueryComposition extends QueryComposition { + output: ValueType; + definitionDigest: string; + dependencies: { query: string; digest: string }[]; +} + +/** Checks a finite dependency graph. Query identities are resolved by the + * caller's package/workspace scope; no presentation concepts participate. */ +export function compileQueryComposition( + source: QueryComposition, + queries: ReadonlyMap, +): CheckedQueryComposition { + const fail = (message: string): never => { + throw new QueryCompileError("QUERY_COMPOSITION", `${source.id}: ${message}`); + }; + if (!Number.isSafeInteger(source.maxQueries) || source.maxQueries < 1) fail("maxQueries must be a positive integer"); + if (source.input.kind !== "record") fail("input must be a record"); + const outputs = new Map(); + const dependencies = new Map(); + let count = 0; + function binding(expression: QueryBinding, item?: ValueType): ValueType { + if ("literal" in expression) + return { kind: "scalar", name: typeof expression.literal === "string" ? "string" : "bool" }; + if ("equal" in expression) { + const left = binding(expression.equal[0], item); + const right = binding(expression.equal[1], item); + if (left.kind !== "scalar" || !equal(left, right)) fail("equal requires matching scalar operands"); + return { kind: "scalar", name: "bool" }; + } + if ("record" in expression) + return { + kind: "record", + fields: Object.fromEntries( + Object.entries(expression.record).map(([key, value]) => [key, binding(value, item)]), + ), + }; + let type = + expression.from === "input" ? source.input : expression.from === "item" ? item : outputs.get(expression.name); + if (!type) + return fail( + expression.from === "result" + ? `result ${expression.name} must name an earlier step (forward references and cycles are unsupported)` + : "item is only available within a bounded each step", + ); + for (const key of expression.path) { + if (type.kind !== "record" || !Object.hasOwn(type.fields, key)) + return fail(`cannot select ${key} from ${type.kind}; nulls and collections need an explicit boundary`); + type = type.fields[key]!; + } + return type; + } + const equal = (a: ValueType, b: ValueType) => canonicalJson(a) === canonicalJson(b); + for (const step of source.steps) { + if (!step.name || outputs.has(step.name)) fail(`duplicate or empty step name ${step.name}`); + const query = queries.get(step.query); + if (!query) return fail(`unknown query ${step.query}`); + let item: ValueType | undefined; + if (step.with) { + if (step.each) fail(`${step.name} cannot combine with and each`); + const value = binding(step.with); + item = value.kind === "optional" ? value.value : value; + } + if (step.each) { + const collection = binding(step.each.source); + if (collection.kind !== "list") return fail(`${step.name}.each requires a list`); + if (!Number.isSafeInteger(step.each.limit) || step.each.limit < 1) + fail(`${step.name}.each.limit must be a positive integer`); + item = collection.value; + } + count += step.each?.limit ?? 1; + if (!Number.isSafeInteger(count) || count > source.maxQueries) fail("declared steps exceed maxQueries"); + if (step.when && !equal(binding(step.when, item), { kind: "scalar", name: "bool" })) + fail(`${step.name}.when requires a boolean`); + if (query.declaration.root.kind === "workspace-interface") { + if (step.root !== null) fail(`${step.name} workspace query takes no object root`); + } else { + if (step.root === null) return fail(`${step.name} requires an object root`); + let root = binding(step.root, item); + if (root.kind === "optional" && step.optional) root = root.value; + const expected: ValueType = { + kind: "object-ref", + expectation: { + kind: "interface", + interfaceRevisionId: query.declaration.root.interface, + }, + }; + if (!equal(root, expected)) fail(`${step.name} root must be a reference to ${query.declaration.root.interface}`); + } + if (!equal(binding(step.arguments, item), query.variables)) + fail(`${step.name} arguments do not match ${step.query}`); + let output = query.output; + if (step.optional || step.with || step.when) output = { kind: "optional", value: output }; + if (step.each) output = { kind: "list", value: output }; + outputs.set(step.name, output); + dependencies.set(step.query, query.definitionDigest); + } + const result = { + ...structuredClone(source), + output: { kind: "record" as const, fields: Object.fromEntries(outputs) }, + dependencies: [...dependencies].map(([query, digest]) => ({ query, digest })), + }; + return { ...result, definitionDigest: createHash("sha256").update(canonicalJson(result)).digest("hex") }; +} diff --git a/src/query/schema.ts b/src/query/schema.ts index afa307f..c663e8a 100644 --- a/src/query/schema.ts +++ b/src/query/schema.ts @@ -197,7 +197,12 @@ export function querySchema( const metadata = new GraphQLObjectType({ name: `QxMetadata_${name(id)}`, fields: { - ...(id === workspaceQueryRootId ? {} : { ref: { type: new GraphQLNonNull(relational.refs(id)) } }), + ...(id === workspaceQueryRootId + ? {} + : { + ref: { type: new GraphQLNonNull(relational.refs(id)) }, + atom: { type: new GraphQLNonNull(GraphQLString) }, + }), ...(helpers ? { relations: { type: new GraphQLNonNull(helpers) } } : {}), }, }); diff --git a/src/react-build/package-queries.ts b/src/react-build/package-queries.ts new file mode 100644 index 0000000..a205eef --- /dev/null +++ b/src/react-build/package-queries.ts @@ -0,0 +1,11 @@ +import type { PackageQueryGenerator } from "../capability-language/assembly.js"; +import { presentationQueries } from "../bindings/presentation-queries.js"; + +/** Selected explicitly by the React build. Its output is checked as ordinary + * Camino queries; no React identifiers are interpreted by package assembly. */ +export const generatePackageQueries: PackageQueryGenerator = async (input) => { + const pkg = structuredClone(input.package); + const before = new Set(pkg.queries?.map((query) => query.id)); + const documents = presentationQueries(pkg, input.interfaces); + return { queries: (pkg.queries ?? []).filter((query) => !before.has(query.id)), documents }; +}; diff --git a/test/query-composition.test.ts b/test/query-composition.test.ts new file mode 100644 index 0000000..6f9d38b --- /dev/null +++ b/test/query-composition.test.ts @@ -0,0 +1,117 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { compileCapabilityResourceSource } from "../src/capability-language/index.js"; +import type { InterfaceRevision } from "../src/capability-model/types.js"; +import { valueType } from "../src/capability-model/types.js"; +import { compileQuery } from "../src/query/compile.js"; +import { compileQueryComposition, type QueryComposition } from "../src/query/composition.js"; +import { defaultQueryBudgets } from "../src/query/types.js"; + +const iface = (text: string, dependencies: InterfaceRevision[] = []) => { + const result = compileCapabilityResourceSource(text, { + source: { repository: "https://example.test/devices", commit: "a".repeat(40) }, + environment: { + interfaces: new Map(dependencies.map((entry) => [entry.displayName, entry])), + interfaceClosure: dependencies, + }, + }); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + if (result.resource.kind !== "interface") throw Error("Expected interface"); + return result.resource.revision; +}; + +test("dependent query roots and arguments are checked without a presentation library", async () => { + const sensor = iface(`interface Sensor id "sensor" revision "sensor@1" { + queryable value reading id "reading" : int64 { get id "reading:get"; } + }`); + const control = iface( + `import interface Sensor; + interface Control id "control" revision "control@1" { + queryable value enabled id "enabled" : bool { get id "enabled:get"; } + queryable relation selected id "selected" : optional-one interface Sensor { resolve id "selected:get"; } + }`, + [sensor], + ); + const query = (id: string, root: InterfaceRevision["revisionId"], text: string) => + compileQuery( + { + id, + displayName: id, + document: `${id}.graphql`, + operation: id, + root: { kind: "object", interface: root }, + fragments: [], + views: [], + allowances: [], + budgets: { ...defaultQueryBudgets }, + watch: false, + placement: { kind: "replica" }, + }, + [control, sensor], + async () => text, + ); + const selection = await query( + "Selection", + control.revisionId, + "query Selection { root { enabled selected { _camino { ref atom } } } }", + ); + const reading = await query( + "Reading", + sensor.revisionId, + "query Reading($enabled: Boolean!) { root { reading @include(if: $enabled) } }", + ); + const queries = new Map([ + ["Selection", selection], + ["Reading", reading], + ]); + const source: QueryComposition = { + id: "device-display", + input: { kind: "record", fields: { controller: valueType.interfaceRef(control.revisionId) } }, + maxQueries: 2, + steps: [ + { + name: "selection", + query: "Selection", + root: { from: "input", path: ["controller"] }, + arguments: { record: {} }, + }, + { + name: "reading", + query: "Reading", + with: { from: "result", name: "selection", path: ["root", "selected"] }, + root: { from: "item", path: ["_camino", "ref"] }, + arguments: { record: { enabled: { from: "result", name: "selection", path: ["root", "enabled"] } } }, + }, + ], + }; + const checked = compileQueryComposition(source, queries); + assert.equal(checked.output.kind, "record"); + assert.equal(checked.dependencies.length, 2); + assert.ok(checked.definitionDigest); + const changed = new Map(queries); + changed.set("Reading", { ...reading, definitionDigest: "different-source" }); + assert.notEqual(compileQueryComposition(source, changed).definitionDigest, checked.definitionDigest); + assert.throws(() => compileQueryComposition({ ...source, maxQueries: 1 }, queries), /exceed maxQueries/); + assert.throws( + () => compileQueryComposition({ ...source, steps: [...source.steps].reverse() }, queries), + /earlier step/, + ); + const wrongArguments = structuredClone(source); + wrongArguments.steps[1]!.arguments = { record: { enabled: { from: "input", path: ["controller"] } } }; + assert.throws(() => compileQueryComposition(wrongArguments, queries), /arguments do not match/); + const wrongRoot = structuredClone(source); + wrongRoot.steps[1]!.root = { from: "input", path: ["controller"] }; + assert.throws(() => compileQueryComposition(wrongRoot, queries), /reference to sensor@1/); + const nullableTraversal = structuredClone(source); + nullableTraversal.steps[1]!.root = { + from: "result", + name: "selection", + path: ["root", "selected", "_camino", "ref"], + }; + assert.throws(() => compileQueryComposition(nullableTraversal, queries), /explicit boundary/); + const branch = structuredClone(source); + branch.steps[1]!.when = { equal: [{ from: "item", path: ["_camino", "atom"] }, { literal: "thermometer" }] }; + assert.ok(compileQueryComposition(branch, queries).definitionDigest); + branch.steps[1]!.when = { literal: "not a boolean" }; + assert.throws(() => compileQueryComposition(branch, queries), /when requires a boolean/); +}); diff --git a/test/query-source-generation.test.ts b/test/query-source-generation.test.ts new file mode 100644 index 0000000..b2b38dc --- /dev/null +++ b/test/query-source-generation.test.ts @@ -0,0 +1,159 @@ +import assert from "node:assert/strict"; +import { mkdtemp, mkdir, writeFile, rm } from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import test from "node:test"; +import { + compileCapabilityResourceRepository, + type PackageQueryGenerator, +} from "../src/capability-language/assembly.js"; +import { defaultQueryBudgets } from "../src/query/types.js"; + +test("an explicit non-React frontend emits checked queries for its own selection model", async (context) => { + const directory = await mkdtemp(path.join(os.tmpdir(), "qx-query-generator-")); + context.after(() => rm(directory, { recursive: true, force: true })); + const commit = "a".repeat(40); + const source = (name: string) => ({ + resolver: "git" as const, + repository: `https://example.test/${name}.git`, + commit, + }); + const lock = (imports: string) => `quixos-lock version 1 { + quixos source { repository "https://example.test/quixos.git"; commit "${commit}"; } + ${imports} + }`; + const dependency = (name: string) => + `interface ${name} source { repository "${source(name).repository}"; commit "${commit}"; }`; + for (const name of ["Sensor", "DeviceSelection", "Device"]) await mkdir(path.join(directory, name)); + await writeFile(path.join(directory, "Sensor", "quixos.lock"), lock("")); + await writeFile( + path.join(directory, "Sensor", "interface.qx"), + ` + interface Sensor id "sensor" revision "sensor@1" { + queryable value reading id "reading" : int64 { get id "reading:get"; } + } + `, + ); + await writeFile(path.join(directory, "DeviceSelection", "quixos.lock"), lock(dependency("Sensor"))); + await writeFile( + path.join(directory, "DeviceSelection", "interface.qx"), + ` + import interface Sensor; + interface DeviceSelection id "device-selection" revision "device-selection@1" { + queryable relation selectedSensor id "selected-sensor" : optional-one interface Sensor { + resolve id "selected-sensor:resolve"; + } + } + `, + ); + await writeFile(path.join(directory, "Device", "quixos.lock"), lock(dependency("DeviceSelection"))); + await writeFile( + path.join(directory, "Device", "package.qx"), + ` + import interface DeviceSelection; + package Device id "device" revision "device@1" {} + `, + ); + await writeFile( + path.join(directory, "Device", "inputs.graphql"), + `query Selected { root { selectedSensor { reading } } }`, + ); + const options = { + rootDirectory: path.join(directory, "Device"), + kind: "package" as const, + source: source("Device"), + resolveResource: async (ref: { repository: string }) => ({ + directory: path.join(directory, new URL(ref.repository).pathname.slice(1, -4)), + }), + }; + const plain = await compileCapabilityResourceRepository(options); + assert.equal(plain.resource.kind, "package"); + if (plain.resource.kind !== "package") throw Error("Expected package"); + assert.equal(plain.resource.revision.queries?.length ?? 0, 0); + + const generateQueries: PackageQueryGenerator = async ({ interfaces, readSource }) => ({ + queries: [ + { + id: "selected-inputs", + displayName: "SelectedInputs", + root: { + kind: "object", + interface: interfaces.find((iface) => iface.displayName === "DeviceSelection")!.revisionId, + }, + document: "generated/selected.graphql", + operation: "Selected", + fragments: [], + views: [], + allowances: [], + budgets: { ...defaultQueryBudgets }, + watch: false, + placement: { kind: "replica" }, + }, + ], + documents: new Map([["generated/selected.graphql", await readSource("inputs.graphql")]]), + compositions: [ + { + id: "display", + maxQueries: 1, + input: { + kind: "record", + fields: { + device: { + kind: "object-ref", + expectation: { + kind: "interface", + interfaceRevisionId: interfaces.find((iface) => iface.displayName === "DeviceSelection")!.revisionId, + }, + }, + }, + }, + steps: [ + { + name: "selection", + query: "selected-inputs", + root: { from: "input", path: ["device"] }, + arguments: { record: {} }, + }, + ], + }, + ], + }); + const built = await compileCapabilityResourceRepository({ ...options, generateQueries }); + assert.equal(built.resource.kind, "package"); + if (built.resource.kind !== "package") throw Error("Expected package"); + assert.equal(built.resource.revision.checkedQueries?.length, 1); + const checked = built.resource.revision.checkedQueries![0]!; + assert.equal(checked.declaration.root.interface, "device-selection@1"); + assert.ok(checked.effects.some((effect) => effect.memberId === "reading")); + assert.ok(checked.effects.some((effect) => effect.memberId === "selected-sensor")); + assert.ok(checked.definitionDigest); + assert.equal(built.resource.revision.queryCompositions?.[0]?.dependencies[0]?.digest, checked.definitionDigest); + assert.equal( + built.resources.some((resource) => /React|PresentationMount/.test(resource.key)), + false, + ); + + await assert.rejects( + compileCapabilityResourceRepository({ + ...options, + generateQueries: async (input) => { + const result = await generateQueries(input); + return { + ...result, + documents: new Map([["generated/selected.graphql", "query Selected { root { invented } }"]]), + }; + }, + }), + /invented/, + ); + await assert.rejects( + compileCapabilityResourceRepository({ + ...options, + generateQueries: async (input) => { + const result = await generateQueries(input); + return { ...result, queries: [...result.queries, ...result.queries] }; + }, + }), + /Generated query conflicts/, + ); +}); From b4992982997156e3eefc1ed38dfa25e5761a56d6 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 27 Sep 2026 16:34:53 -0700 Subject: [PATCH 80/91] Complete prepared presentation build and runtime integration --- src/capability-language/assembly.ts | 11 +- src/capability-language/component-scaffold.ts | 16 +- src/capability-language/query-generator.ts | 7 +- src/capability-model/types.ts | 3 + src/execution-world/client-contracts.ts | 24 +- src/execution-world/installation.ts | 10 + src/query/composition.ts | 80 ++-- src/react-build/declarations.ts | 127 ++++++ src/react-build/expansion.ts | 420 ++++++++++++++++++ src/react-build/package-queries.ts | 21 +- src/react-build/workspace.ts | 150 +++++++ test/prepared-presentations.test.ts | 173 ++++++++ test/presentations.test.ts | 9 + 13 files changed, 1013 insertions(+), 38 deletions(-) create mode 100644 src/react-build/declarations.ts create mode 100644 src/react-build/expansion.ts create mode 100644 src/react-build/workspace.ts create mode 100644 test/prepared-presentations.test.ts diff --git a/src/capability-language/assembly.ts b/src/capability-language/assembly.ts index 14c878c..332bca0 100644 --- a/src/capability-language/assembly.ts +++ b/src/capability-language/assembly.ts @@ -46,7 +46,7 @@ export type CapabilityRepositoryResolver = ( /** An explicitly selected build frontend supplies ordinary query sources. The * assembler never chooses a frontend by inspecting an interface/contract ID. * Generated sources go through the same query and imported-fragment checks. */ -export type PackageQueryGenerator = (input: { +export type PackageQueryGenerator = ((input: { readonly package: Readonly; readonly interfaces: readonly InterfaceRevision[]; readonly readSource: (name: string) => Promise; @@ -54,7 +54,12 @@ export type PackageQueryGenerator = (input: { readonly queries: readonly QueryDeclaration[]; readonly documents: ReadonlyMap; readonly compositions?: readonly QueryComposition[]; -}>; + readonly artifacts?: Readonly>; +}>) & { + /** Optional explicit frontend stage after workspace binding resolution. + * Its output still passes normal workspace/query validation. */ + completeWorkspace?: (workspace: WorkspaceRevision) => Promise; +}; export type ResolvedCapabilityResource = { key: string; @@ -297,6 +302,7 @@ const createResourceGraphResolver = ( readSource: (name) => readRepositorySource(snapshot.directory, name), }); if (generated) { + if (generated.artifacts) compiled.resource.revision.buildArtifacts = structuredClone(generated.artifacts); const queries = [...(compiled.resource.revision.queries ?? [])]; for (const query of generated.queries) { if (queries.some((entry) => entry.id === query.id || entry.displayName === query.displayName)) @@ -534,6 +540,7 @@ export const compileWorkspaceRepository = async (options: { : {}), ...(options.sourceRootCommit ? { sourceRootCommit: options.sourceRootCommit } : {}), }; + await options.generateQueries?.completeWorkspace?.(workspace); const checked = compileWorkspaceRevision(workspace); if (!checked.ok) { throw new Error( diff --git a/src/capability-language/component-scaffold.ts b/src/capability-language/component-scaffold.ts index a5bacb9..7d1723b 100644 --- a/src/capability-language/component-scaffold.ts +++ b/src/capability-language/component-scaffold.ts @@ -59,12 +59,26 @@ export async function scaffoldComponent( const configBefore = await fs.readFile(path.join(root, configFile), "utf8"); const config = JSON.parse(configBefore); config.queryFrontends = [...new Set([...(config.queryFrontends ?? []), "react"])]; + const preparationFile = prefix + "quixos.react.json"; + let preparationBefore: string | undefined; + try { + preparationBefore = await fs.readFile(path.join(root, preparationFile), "utf8"); + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error; + } + const preparation = preparationBefore ? JSON.parse(preparationBefore) : { modules: {} }; + if (Object.hasOwn(preparation.modules, spec.name)) throw Error("Duplicate presentation preparation"); + preparation.modules[spec.name] = { inputs: [] }; + const preparationText = JSON.stringify(preparation, null, 2) + "\n"; return { kind: "package", source: spec.source, resourceRoot: spec.directory, validation: "syntax", files: [ + preparationBefore === undefined + ? { file: preparationFile, create: preparationText } + : { file: preparationFile, expected: preparationBefore, replace: preparationText }, { file: configFile, expected: configBefore, replace: JSON.stringify(config, null, 2) + "\n" }, { file: prefix + "package.qx", @@ -79,7 +93,7 @@ export async function scaffoldComponent( { file: prefix + filename, expected: before, replace: after }, { file: prefix + `src/components/${spec.name}.tsx`, - create: `import type { Modules } from "../gen/client.js";\n\n// Add explicit query admission and named interface operations from the generated client.\nexport const ${spec.name}: Modules[${JSON.stringify(spec.name)}] = ({subject}) =>

{subject.object}

;\n`, + create: `import type { Modules } from "../gen/client.js";\n\n// Declare initial query inputs in quixos.react.json; use interfaces for actions.\nexport const ${spec.name}: Modules[${JSON.stringify(spec.name)}] = ({subject}) =>

{subject.object}

;\n`, }, ], }; diff --git a/src/capability-language/query-generator.ts b/src/capability-language/query-generator.ts index ab7ce45..25d57fe 100644 --- a/src/capability-language/query-generator.ts +++ b/src/capability-language/query-generator.ts @@ -9,5 +9,10 @@ export async function loadQueryGenerator(filename?: string): Promise; modules?: PackageModule[]; /** Closed interface imports exposed to this package's checked component bindings. */ clientInterfaces?: Record; diff --git a/src/execution-world/client-contracts.ts b/src/execution-world/client-contracts.ts index 5f7cae6..cd0b676 100644 --- a/src/execution-world/client-contracts.ts +++ b/src/execution-world/client-contracts.ts @@ -251,7 +251,7 @@ export function generateComponentClientBindings(plan: ExecutionPlan, packageRevi .join("\n"); return ( interfaces + - '\nimport {createObjectRenderer,definePackageQuery,definePackageFragment,type ComponentType,type ComponentProps} from "@quixos/camino-react";\n' + + '\nimport {createObjectRenderer,definePackageQuery,definePackageFragment,type ComponentType,type ComponentProps,type PreparedPresentation} from "@quixos/camino-react";\n' + subjectBindings + "\n" + queries + @@ -272,7 +272,27 @@ export function generateComponentClientBindings(plan: ExecutionPlan, packageRevi .map((component) => { const module = modules.find((module) => module.id === component.id)!; const key = JSON.stringify([module.interfaceRevisionId, module.memberId]); - return `${JSON.stringify(component.displayName)}: ComponentType & ExtraModuleProps<${JSON.stringify(key)}>>;`; + const artifact = pkg.buildArtifacts?.["org.quixos.react.preparation/1"] as + | import("../react-build/declarations.js").ReactPreparationArtifact + | undefined; + const preparation = artifact?.modules.find((entry) => entry.module === module.id); + const composition = pkg.queryCompositions?.find((entry) => entry.id === preparation?.composition); + if (!preparation || !composition) + throw new ExecutionPlanError("MISSING_PRESENTATION_INPUTS", module.id, "Declare inputs in quixos.react.json"); + const children = preparation.children.map((child) => { + let extra = "{}"; + if (child.role) { + const iface = find(child.role.interface); + const member = iface.members.find( + (entry) => entry.id === child.role!.member || entry.displayName === child.role!.member, + )!; + extra = props(iface.revisionId, member.id); + } + const handle = `PreparedPresentation<${JSON.stringify(child.subject)}, ${extra}>`; + return `readonly ${JSON.stringify(child.name)}: ${child.each ? `readonly ${handle}[]` : child.with || child.when ? `${handle} | null` : handle}`; + }); + const input = `${tsType(composition.output)} & {readonly children: {${children.join(";")}}}`; + return `${JSON.stringify(component.displayName)}: ComponentType & ExtraModuleProps<${JSON.stringify(key)}>>;`; }) .join("\n") + "\n}\n" diff --git a/src/execution-world/installation.ts b/src/execution-world/installation.ts index 34d9f5e..4787af7 100644 --- a/src/execution-world/installation.ts +++ b/src/execution-world/installation.ts @@ -138,6 +138,8 @@ export interface InstalledComponent { readonly exportName: string; readonly styles: readonly string[]; readonly compatibility: ComponentArtifact["compatibility"]; + /** Owned and interpreted by the React artifact consumer. */ + readonly preparation?: unknown; readonly sharedModules: Readonly>; } /** Build-time validation uses the compiler selected by the Nix derivation. */ @@ -208,6 +210,14 @@ function assembleExecutionInstallation( routes[url] ??= { path: path.join(root, file.path), mediaType: file.mediaType }; } components.push({ + ...(() => { + const pkg = plan.definition.workspace.packageImports.find((entry) => entry.revisionId === revision); + const artifact = pkg?.buildArtifacts?.["org.quixos.react.preparation/1"] as + | { modules: { module: string }[] } + | undefined; + const preparation = artifact?.modules.find((entry) => entry.module === component.id); + return preparation ? { preparation } : {}; + })(), role: (() => { const module = plan.definition.packages .find((p) => p.revision === revision)! diff --git a/src/query/composition.ts b/src/query/composition.ts index bcfa0e5..5c472a7 100644 --- a/src/query/composition.ts +++ b/src/query/composition.ts @@ -6,6 +6,7 @@ import { QueryCompileError, type CheckedQuery } from "./types.js"; /** Bindings refer to checked values, never executable callbacks. A path cannot * silently cross a nullable value or expand an unbounded collection. */ export type QueryBinding = + | { flatMap: { source: QueryBinding; path: string[] } } | { literal: string | boolean } | { equal: [QueryBinding, QueryBinding] } | { from: "input"; path: string[] } @@ -54,37 +55,8 @@ export function compileQueryComposition( const outputs = new Map(); const dependencies = new Map(); let count = 0; - function binding(expression: QueryBinding, item?: ValueType): ValueType { - if ("literal" in expression) - return { kind: "scalar", name: typeof expression.literal === "string" ? "string" : "bool" }; - if ("equal" in expression) { - const left = binding(expression.equal[0], item); - const right = binding(expression.equal[1], item); - if (left.kind !== "scalar" || !equal(left, right)) fail("equal requires matching scalar operands"); - return { kind: "scalar", name: "bool" }; - } - if ("record" in expression) - return { - kind: "record", - fields: Object.fromEntries( - Object.entries(expression.record).map(([key, value]) => [key, binding(value, item)]), - ), - }; - let type = - expression.from === "input" ? source.input : expression.from === "item" ? item : outputs.get(expression.name); - if (!type) - return fail( - expression.from === "result" - ? `result ${expression.name} must name an earlier step (forward references and cycles are unsupported)` - : "item is only available within a bounded each step", - ); - for (const key of expression.path) { - if (type.kind !== "record" || !Object.hasOwn(type.fields, key)) - return fail(`cannot select ${key} from ${type.kind}; nulls and collections need an explicit boundary`); - type = type.fields[key]!; - } - return type; - } + const binding = (expression: QueryBinding, item?: ValueType) => + queryBindingType(expression, source.input, outputs, item); const equal = (a: ValueType, b: ValueType) => canonicalJson(a) === canonicalJson(b); for (const step of source.steps) { if (!step.name || outputs.has(step.name)) fail(`duplicate or empty step name ${step.name}`); @@ -137,3 +109,49 @@ export function compileQueryComposition( }; return { ...result, definitionDigest: createHash("sha256").update(canonicalJson(result)).digest("hex") }; } + +export function queryBindingType( + expression: QueryBinding, + input: ValueType, + outputs: ReadonlyMap, + item?: ValueType, +): ValueType { + const fail = (message: string): never => { + throw new QueryCompileError("QUERY_COMPOSITION", message); + }; + const binding = (expression: QueryBinding, item?: ValueType) => queryBindingType(expression, input, outputs, item); + const equal = (a: ValueType, b: ValueType) => canonicalJson(a) === canonicalJson(b); + if ("flatMap" in expression) { + const rows = binding(expression.flatMap.source, item); + if (rows.kind !== "list") return fail("flatMap requires a list"); + const children = binding({ from: "item", path: expression.flatMap.path }, rows.value); + if (children.kind !== "list") return fail("flatMap path requires a list"); + return children; + } + if ("literal" in expression) + return { kind: "scalar", name: typeof expression.literal === "string" ? "string" : "bool" }; + if ("equal" in expression) { + const left = binding(expression.equal[0], item); + const right = binding(expression.equal[1], item); + if (left.kind !== "scalar" || !equal(left, right)) fail("equal requires matching scalar operands"); + return { kind: "scalar", name: "bool" }; + } + if ("record" in expression) + return { + kind: "record", + fields: Object.fromEntries(Object.entries(expression.record).map(([key, value]) => [key, binding(value, item)])), + }; + let type = expression.from === "input" ? input : expression.from === "item" ? item : outputs.get(expression.name); + if (!type) + return fail( + expression.from === "result" + ? `result ${expression.name} must name an earlier step (forward references and cycles are unsupported)` + : "item is only available within a bounded each step", + ); + for (const key of expression.path) { + if (type.kind !== "record" || !Object.hasOwn(type.fields, key)) + return fail(`cannot select ${key} from ${type.kind}; nulls and collections need an explicit boundary`); + type = type.fields[key]!; + } + return type; +} diff --git a/src/react-build/declarations.ts b/src/react-build/declarations.ts new file mode 100644 index 0000000..42fd8ab --- /dev/null +++ b/src/react-build/declarations.ts @@ -0,0 +1,127 @@ +import type { InterfaceRevision, PackageRevision, ValueType } from "../capability-model/types.js"; +import type { QueryBinding, QueryComposition, QueryCompositionStep } from "../query/composition.js"; + +/** This is an artifact of the explicitly selected React frontend, not QX IR. */ +export const preparationArtifact = "org.quixos.react.preparation/1"; +export interface ReactChildDeclaration { + name: string; + subject: string; + root: QueryBinding; + slot: string; + with?: QueryBinding; + each?: { source: QueryBinding; limit: number }; + when?: QueryBinding; + role?: { interface: string; member: string }; + provider?: { package: string; module: string }; +} +export interface ReactModulePreparation { + module: string; + composition: string; + discoveryComposition?: string; + children: ReactChildDeclaration[]; +} +export interface ReactPreparationArtifact { + modules: ReactModulePreparation[]; +} + +/** Names are package imports/module declarations. All query bindings are passed + * to Camino's ordinary composition checker after generated queries are checked. */ +export function presentationDeclarations( + text: string, + pkg: PackageRevision, + interfaces: readonly InterfaceRevision[], +): { compositions: QueryComposition[]; artifact: ReactPreparationArtifact } { + const source: unknown = JSON.parse(text); + const object = (value: unknown, label: string): Record => { + if (!value || typeof value !== "object" || Array.isArray(value)) throw Error(`${label}: expected an object`); + return value as Record; + }; + const top = object(source, "quixos.react.json"); + if (Object.keys(top).some((key) => key !== "modules")) throw Error("quixos.react.json: unknown field"); + const modules = object(top.modules, "modules"); + const compositions: QueryComposition[] = []; + const artifact: ReactPreparationArtifact = { modules: [] }; + const imported = (name: string) => { + const id = pkg.clientInterfaces?.[name]; + if (!id) throw Error(`React declaration: unknown imported interface ${name}`); + return id; + }; + for (const [name, value] of Object.entries(modules)) { + const declaration = object(value, `module ${name}`); + if (Object.keys(declaration).some((key) => !["inputs", "children"].includes(key))) + throw Error(`${name}: unknown preparation field`); + const module = pkg.modules?.find((entry) => entry.displayName === name); + if (!module) throw Error(`React declaration: unknown module ${name}`); + const contract = interfaces.find((entry) => entry.revisionId === module.interfaceRevisionId); + const member = contract?.members.find((entry) => entry.id === module.memberId); + if ( + member?.kind !== "module" || + member.subject?.kind !== "interface" || + !["org.quixos.react.component/1", "org.quixos.react.component/2", "org.quixos.react.subject-only/1"].includes( + member.contract, + ) + ) + throw Error(`${name}: preparation requires a React module contract`); + const fields: Record = { + subject: { + kind: "object-ref", + expectation: { kind: "interface", interfaceRevisionId: member.subject.interfaceRevisionId }, + }, + }; + if (member.contract === "org.quixos.react.component/2") { + const state = contract?.application?.arguments[1]; + if (state?.kind !== "object" || state.target.kind !== "interface") + throw Error(`${name}: expected a closed state interface`); + fields.navigation = { + kind: "object-ref", + expectation: { kind: "interface", interfaceRevisionId: state.target.interfaceRevisionId }, + }; + } + if (!Array.isArray(declaration.inputs)) throw Error(`${name}: inputs must be an array of query bindings`); + const steps = declaration.inputs.map((value) => { + const step = object(value, `${name} input`) as unknown as QueryCompositionStep; + if (step.name === "children") throw Error(`${name}: children is reserved for prepared child inputs`); + const query = pkg.queries?.find((entry) => entry.displayName === step.query); + if (!query) throw Error(`${name}.${step.name}: unknown query ${step.query}`); + if (query.placement?.kind !== "local" && !query.fragment) + throw Error(`${name}.${step.name}: requires a local projection or fragment`); + return { ...step, query: query.id }; + }); + const composition = `react:inputs:${module.id}`; + compositions.push({ + id: composition, + input: { kind: "record", fields }, + steps, + maxQueries: steps.reduce((count, step) => count + (step.each?.limit ?? 1), 0) || 1, + }); + const children = declaration.children ?? []; + if (!Array.isArray(children)) throw Error(`${name}: children must be an array`); + const names = new Set(); + const parsed = children.map((value) => { + const child = object(value, `${name} child`) as unknown as ReactChildDeclaration; + if (!child.name || names.has(child.name) || !child.slot || !child.root) + throw Error(`${name}: child requires a unique name, slot and root`); + names.add(child.name); + if (child.each && child.with) throw Error(`${name}.${child.name}: cannot combine each and with`); + if (child.each && (!Number.isSafeInteger(child.each.limit) || child.each.limit < 1)) + throw Error(`${name}.${child.name}: finite positive collection limit required`); + return { + ...child, + subject: imported(child.subject), + ...(child.role ? { role: { ...child.role, interface: imported(child.role.interface) } } : {}), + }; + }); + artifact.modules.push({ module: module.id, composition, children: parsed }); + } + for (const module of pkg.modules ?? []) { + const contract = interfaces.find((entry) => entry.revisionId === module.interfaceRevisionId); + const member = contract?.members.find((entry) => entry.id === module.memberId); + if ( + member?.kind === "module" && + member.contract.startsWith("org.quixos.react.") && + !artifact.modules.some((entry) => entry.module === module.id) + ) + throw Error(`React module ${module.displayName} has no preparation declaration`); + } + return { compositions, artifact }; +} diff --git a/src/react-build/expansion.ts b/src/react-build/expansion.ts new file mode 100644 index 0000000..823b74b --- /dev/null +++ b/src/react-build/expansion.ts @@ -0,0 +1,420 @@ +import { createHash } from "node:crypto"; +import { + parse, + print, + visit, + Kind, + type SelectionSetNode, + type FragmentDefinitionNode, + type SelectionNode, + type DocumentNode, +} from "graphql"; +import type { PackageRevision, WorkspaceRevision } from "../capability-model/types.js"; +import { compileQuery } from "../query/compile.js"; +import { compileQueryComposition, type QueryBinding } from "../query/composition.js"; +import type { CheckedQuery, QueryDeclaration } from "../query/types.js"; +import { preparationArtifact, type ReactModulePreparation, type ReactPreparationArtifact } from "./declarations.js"; + +interface Branch { + packageRevision: string; + id: string; +} +type Child = ReactModulePreparation["children"][number] & { branches: Branch[] }; +interface Module { + pkg: PackageRevision; + preparation: ReactModulePreparation; +} +const identity = (pkg: string, id: string) => JSON.stringify([pkg, id]); +const suffix = (value: string) => createHash("sha256").update(value).digest("hex").slice(0, 20); + +/** Lower bounded, statically bound subject projections into ordinary fragments. + * The generated query still passes the normal GraphQL/QX checker. Stateful + * lookups remain independent ordinary root-scoped queries owned by the adapter. */ +export async function expandPresentationQueries(workspace: WorkspaceRevision): Promise { + const modules = new Map(); + for (const pkg of workspace.packageImports) { + const artifact = pkg.buildArtifacts?.[preparationArtifact] as ReactPreparationArtifact | undefined; + for (const preparation of artifact?.modules ?? []) + modules.set(identity(pkg.revisionId, preparation.module), { pkg, preparation }); + } + const query = (pkg: string, id: string) => { + const result = workspace.packageImports + .find((entry) => entry.revisionId === pkg) + ?.checkedQueries?.find((entry) => entry.declaration.id === id); + if (!result) throw Error(`Missing checked preparation query ${pkg}/${id}`); + return result; + }; + const resolver = async (pkg: string, id: string) => query(pkg, id); + const install = async (pkg: PackageRevision, declaration: QueryDeclaration, document: string) => { + const views = new Map(declaration.views.map((view) => [view.atomId, view])); + const allowances = [...declaration.allowances]; + for (const imported of declaration.importedFragments ?? []) { + const dependency = query(imported.packageRevisionId, imported.fragmentId).declaration; + for (const view of dependency.views) { + const previous = views.get(view.atomId); + if (previous && previous.interfaceRevisionId !== view.interfaceRevisionId) + throw Error(`${declaration.displayName}: conflicting interface views for ${view.atomId}`); + views.set(view.atomId, view); + } + for (const allowance of dependency.allowances) + if (!allowances.some((entry) => JSON.stringify(entry) === JSON.stringify(allowance))) + allowances.push(allowance); + } + declaration = { ...declaration, views: [...views.values()], allowances }; + const checked = await compileQuery(declaration, workspace.interfaceImports, async () => document, resolver); + pkg.queries = [...(pkg.queries ?? []).filter((entry) => entry.id !== declaration.id), declaration]; + pkg.checkedQueries = [ + ...(pkg.checkedQueries ?? []).filter((entry) => entry.declaration.id !== declaration.id), + checked, + ]; + return checked; + }; + function expanded(source: CheckedQuery): SelectionSetNode { + const document = parse(source.document); + const fragments = new Map( + document.definitions + .filter((entry): entry is FragmentDefinitionNode => entry.kind === Kind.FRAGMENT_DEFINITION) + .map((entry) => [entry.name.value, entry]), + ); + const operation = document.definitions.find((entry) => entry.kind === Kind.OPERATION_DEFINITION); + if (!operation || operation.kind !== Kind.OPERATION_DEFINITION) + throw Error(`Missing query operation ${source.declaration.id}`); + const expand = (selection: SelectionSetNode, parents: string[] = []): SelectionSetNode => ({ + ...selection, + selections: selection.selections.flatMap((entry): SelectionNode[] => { + if (entry.kind === Kind.FRAGMENT_SPREAD) { + if (parents.includes(entry.name.value)) throw Error("Cyclic query fragment"); + const fragment = fragments.get(entry.name.value); + if (!fragment) throw Error(`Missing query fragment ${entry.name.value}`); + return [ + { + kind: Kind.INLINE_FRAGMENT, + typeCondition: fragment.typeCondition, + directives: entry.directives ?? [], + selectionSet: expand(fragment.selectionSet, [...parents, entry.name.value]), + }, + ]; + } + return [{ ...entry, ...(entry.selectionSet ? { selectionSet: expand(entry.selectionSet, parents) } : {}) }]; + }), + }); + return expand(operation.selectionSet); + } + function insert(selection: SelectionSetNode, path: readonly string[], spread: string): SelectionSetNode { + if (!path.length) + return { + ...selection, + selections: [...selection.selections, { kind: Kind.FRAGMENT_SPREAD, name: { kind: Kind.NAME, value: spread } }], + }; + let found = false; + const selections = selection.selections.map((entry): SelectionNode => { + if (entry.kind === Kind.INLINE_FRAGMENT) { + try { + const nested = insert(entry.selectionSet, path, spread); + found = true; + return { ...entry, selectionSet: nested }; + } catch (error) { + if (!(error instanceof Error) || error.message !== "REACT_SELECTION_PATH") throw error; + } + } + if (entry.kind === Kind.FIELD && (entry.alias?.value ?? entry.name.value) === path[0] && entry.selectionSet) { + found = true; + return { ...entry, selectionSet: insert(entry.selectionSet, path.slice(1), spread) }; + } + return entry; + }); + if (!found) throw Error("REACT_SELECTION_PATH"); + return { ...selection, selections }; + } + function location(binding: QueryBinding): { name: string; path: string[] } | undefined { + if ("from" in binding && binding.from === "result") return { name: binding.name, path: [...binding.path] }; + if ("flatMap" in binding) { + const root = location(binding.flatMap.source); + return root ? { name: root.name, path: [...root.path, ...binding.flatMap.path] } : undefined; + } + return undefined; + } + const done = new Set(); + const eager = new Map(); + const admissionFragments = new Map(); + const stateInputs = new Map(); + async function expandModule(key: string): Promise { + if (done.has(key)) return; + const module = modules.get(key); + if (!module) throw Error(`Missing preparation module ${key}`); + const { pkg, preparation } = module; + const children = preparation.children as Child[]; + for (const child of children) + for (const branch of child.branches) await expandModule(identity(branch.packageRevision, branch.id)); + const composition = pkg.queryCompositions!.find((entry) => entry.id === preparation.composition)!; + const discovery = { ...composition, id: composition.id + ":discovery" }; + preparation.discoveryComposition = discovery.id; + pkg.queryCompositions!.push(discovery); + const steps = structuredClone(composition.steps); + const exported: { step: string; query: CheckedQuery }[] = []; + for (const step of steps) { + const original = query(pkg.revisionId, step.query); + // Variable roots/arguments remain checked dependent steps. Constants can + // be substituted without requesting new runtime parameters from a parent. + if (!("record" in step.arguments) || Object.values(step.arguments.record).some((value) => !("literal" in value))) + continue; + const constants = step.arguments.record; + let selection = expanded(original); + if (original.declaration.placement?.kind !== "local") + throw Error(key + "." + step.name + ": expected checked local input"); + const source = query(pkg.revisionId, original.declaration.placement.sourceQueryId); + let admissionSelection = expanded(source); + const admissionImports: NonNullable = []; + const imports: NonNullable = []; + for (const child of children) { + const selected = child.with + ? location(child.with) + : child.each + ? location(child.each.source) + : location(child.root); + if (!selected || selected.name !== step.name) continue; + const rootPath = "from" in child.root && child.root.from === "item" ? child.root.path : []; + const path = [...selected.path, ...rootPath]; + if (path.slice(-2).join(".") !== "_camino.ref") { + if (!rootPath.length && (child.with || child.each)) + throw Error(`${key}.${child.name}: child root must select the item's reference`); + } else path.splice(-2); + for (const branch of child.branches) { + for (const input of eager.get(identity(branch.packageRevision, branch.id)) ?? []) { + const declaration = input.query.declaration; + if ( + !imports.some( + (entry) => entry.packageRevisionId === branch.packageRevision && entry.fragmentId === declaration.id, + ) + ) { + imports.push({ packageRevisionId: branch.packageRevision, fragmentId: declaration.id, variables: {} }); + } + selection = insert(selection, path, declaration.fragment!.name); + const admission = admissionFragments.get(identity(branch.packageRevision, declaration.id))!; + if ( + !admissionImports.some( + (entry) => + entry.packageRevisionId === branch.packageRevision && entry.fragmentId === admission.declaration.id, + ) + ) + admissionImports.push({ + packageRevisionId: branch.packageRevision, + fragmentId: admission.declaration.id, + variables: {}, + }); + admissionSelection = insert(admissionSelection, path, admission.declaration.fragment!.name); + } + } + } + const token = suffix(identity(pkg.revisionId, `${preparation.module}/${step.name}`)); + const name = `ReactInput${token}`, + id = `react:input:${preparation.module}:${step.name}`; + const base: QueryDeclaration = { + ...original.declaration, + id, + displayName: name, + document: `generated/react/${name}.graphql`, + operation: name, + fragments: [], + importedFragments: imports, + watch: true, + budgets: { + ...original.declaration.budgets, + depth: Math.max(original.declaration.budgets.depth, 32), + rows: Math.max(original.declaration.budgets.rows, 5000), + }, + }; + delete base.fragment; + function documentFor(selection: SelectionSetNode, fragmentName: string): DocumentNode { + const substituted = visit(selection, { + Variable(node) { + const constant = constants[node.name.value]; + if (!constant || !("literal" in constant)) + throw Error(key + "." + step.name + ": unbound query variable " + node.name.value); + return typeof constant.literal === "boolean" + ? { kind: Kind.BOOLEAN, value: constant.literal } + : { kind: Kind.STRING, value: constant.literal }; + }, + }); + if (original.declaration.root.kind === "object") { + const root = substituted.selections.find((entry) => entry.kind === Kind.FIELD && entry.name.value === "root"); + if (!root || root.kind !== Kind.FIELD || !root.selectionSet) + throw Error(key + ": expected object-rooted query"); + const contract = workspace.interfaceImports.find( + (entry) => entry.revisionId === original.declaration.root.interface, + )!; + return { + kind: Kind.DOCUMENT, + definitions: [ + { + kind: Kind.FRAGMENT_DEFINITION, + name: { kind: Kind.NAME, value: fragmentName }, + typeCondition: { kind: Kind.NAMED_TYPE, name: { kind: Kind.NAME, value: contract.displayName } }, + selectionSet: root.selectionSet, + }, + ], + }; + } + return { + kind: Kind.DOCUMENT, + definitions: [ + { + kind: Kind.OPERATION_DEFINITION, + operation: "query" as import("graphql").OperationTypeNode, + name: { kind: Kind.NAME, value: name }, + selectionSet: substituted, + }, + ], + }; + } + if (original.declaration.root.kind === "object") base.fragment = { name }; + const sourceId = id + ":fragment-inputs"; + const admissionName = name + "Admission"; + const admissionBase: QueryDeclaration = { + ...base, + views: source.declaration.views, + allowances: source.declaration.allowances, + importedFragments: admissionImports, + ...(base.fragment ? { fragment: { name: admissionName } } : {}), + }; + const admissionDocument = documentFor(admissionSelection, admissionName); + await install( + pkg, + { + ...admissionBase, + id: sourceId, + displayName: name + "$inputs", + placement: { kind: "replica" }, + watch: false, + ...(base.fragment ? { fragment: { name: admissionName, admission: true } } : {}), + }, + print(admissionDocument), + ); + const admissionFragment = await install( + pkg, + { + ...admissionBase, + id: id + ":admission-projection", + displayName: name + "$admission", + placement: { kind: "local", sourceQueryId: sourceId }, + }, + print(admissionDocument), + ); + const local = await install( + pkg, + { ...base, placement: { kind: "local", sourceQueryId: sourceId } }, + print(documentFor(selection, name)), + ); + admissionFragments.set(identity(pkg.revisionId, local.declaration.id), admissionFragment); + step.query = local.declaration.id; + step.arguments = { record: {} }; + if ( + local.declaration.fragment && + step.root && + "from" in step.root && + step.root.from === "input" && + step.root.path.join(".") === "subject" + ) + exported.push({ step: step.name, query: local }); + if ( + local.declaration.fragment && + step.root && + "from" in step.root && + step.root.from === "input" && + step.root.path.join(".") === "navigation" + ) { + const iface = local.declaration.root.interface; + stateInputs.set(iface, [...(stateInputs.get(iface) ?? []), { pkg, query: local }]); + } + } + const available = new Map( + workspace.packageImports.flatMap((pkg) => + (pkg.checkedQueries ?? []).map((query) => [identity(pkg.revisionId, query.declaration.id), query] as const), + ), + ); + for (const query of pkg.checkedQueries ?? []) available.set(query.declaration.id, query); + const checked = compileQueryComposition( + { id: composition.id, input: composition.input, steps, maxQueries: composition.maxQueries }, + available, + ); + const checkedDiscovery = compileQueryComposition( + { id: discovery.id, input: discovery.input, steps: discovery.steps, maxQueries: discovery.maxQueries }, + available, + ); + pkg.queryCompositions = pkg.queryCompositions!.map((entry) => + entry.id === composition.id ? checked : entry.id === discovery.id ? checkedDiscovery : entry, + ); + eager.set(key, exported); + done.add(key); + } + for (const key of modules.keys()) await expandModule(key); + // Retention queries are ordinary checked queries too. They carry the declared + // state projections, including any subject fragments reached through state. + // This is specific to this frontend; no navigation operator enters Camino. + for (const pkg of workspace.packageImports) { + for (const original of [...(pkg.checkedQueries ?? [])]) { + if (!original.declaration.id.startsWith("presentation:navigation:")) continue; + const inputs = (stateInputs.get(original.declaration.root.interface) ?? []).map((input) => ({ + ...input, + query: + original.declaration.placement?.kind === "replica" + ? admissionFragments.get(identity(input.pkg.revisionId, input.query.declaration.id))! + : input.query, + })); + if (!inputs.length) continue; + const document = parse(original.document); + const collection = original.declaration.placement?.kind === "local" ? "availableObjects" : "objects"; + const definitions = document.definitions.map((definition) => { + if (definition.kind !== Kind.OPERATION_DEFINITION) return definition; + return visit(definition, { + Field(node) { + if (node.name.value !== "root" || !node.selectionSet) return; + const source = node.selectionSet.selections.find( + (entry) => entry.kind === Kind.FIELD && entry.name.value === collection, + ); + if (!source || source.kind !== Kind.FIELD) throw Error("Missing navigation collection"); + return { + ...node, + selectionSet: { + ...node.selectionSet, + selections: [ + ...node.selectionSet.selections, + ...inputs.map((input) => ({ + ...source, + alias: { + kind: Kind.NAME as const, + value: `prepared${suffix(identity(input.pkg.revisionId, input.query.declaration.id))}`, + }, + selectionSet: parse( + `{ entries { node { ...${input.query.declaration.fragment!.name} } } }`, + ).definitions.flatMap((entry) => + entry.kind === Kind.OPERATION_DEFINITION ? [entry.selectionSet] : [], + )[0]!, + })), + ], + }, + }; + }, + }); + }); + await install( + pkg, + { + ...original.declaration, + ...(original.declaration.placement?.kind === "local" + ? { + id: original.declaration.id.replace(/:view$/, ":prepared-view"), + displayName: original.declaration.displayName + "Prepared", + } + : {}), + importedFragments: inputs.map((input) => ({ + packageRevisionId: input.pkg.revisionId, + fragmentId: input.query.declaration.id, + variables: {}, + })), + }, + print({ ...document, definitions }), + ); + } + } +} diff --git a/src/react-build/package-queries.ts b/src/react-build/package-queries.ts index a205eef..3442230 100644 --- a/src/react-build/package-queries.ts +++ b/src/react-build/package-queries.ts @@ -1,5 +1,7 @@ import type { PackageQueryGenerator } from "../capability-language/assembly.js"; import { presentationQueries } from "../bindings/presentation-queries.js"; +import { presentationDeclarations, preparationArtifact } from "./declarations.js"; +export { completeWorkspace } from "./workspace.js"; /** Selected explicitly by the React build. Its output is checked as ordinary * Camino queries; no React identifiers are interpreted by package assembly. */ @@ -7,5 +9,22 @@ export const generatePackageQueries: PackageQueryGenerator = async (input) => { const pkg = structuredClone(input.package); const before = new Set(pkg.queries?.map((query) => query.id)); const documents = presentationQueries(pkg, input.interfaces); - return { queries: (pkg.queries ?? []).filter((query) => !before.has(query.id)), documents }; + const reactModules = (pkg.modules ?? []).filter((module) => + input.interfaces + .find((entry) => entry.revisionId === module.interfaceRevisionId) + ?.members.some( + (entry) => + entry.id === module.memberId && entry.kind === "module" && entry.contract.startsWith("org.quixos.react."), + ), + ); + const declarations = reactModules.length + ? presentationDeclarations(await input.readSource("quixos.react.json"), pkg, input.interfaces) + : undefined; + return { + queries: (pkg.queries ?? []).filter((query) => !before.has(query.id)), + documents, + ...(declarations + ? { compositions: declarations.compositions, artifacts: { [preparationArtifact]: declarations.artifact } } + : {}), + }; }; diff --git a/src/react-build/workspace.ts b/src/react-build/workspace.ts new file mode 100644 index 0000000..f0baba0 --- /dev/null +++ b/src/react-build/workspace.ts @@ -0,0 +1,150 @@ +import type { WorkspaceRevision, ValueType } from "../capability-model/types.js"; +import { moduleContract } from "../capability-model/modules.js"; +import { canonicalJson } from "../capability-model/evolution.js"; +import { queryBindingType } from "../query/composition.js"; +import { moduleTypeContext } from "../execution-world/module-contracts.js"; +import { preparationArtifact, type ReactPreparationArtifact } from "./declarations.js"; +import { expandPresentationQueries } from "./expansion.js"; + +/** Explicit frontend stage. Resolve finite provider branches after workspace + * bindings exist; the generic workspace compiler does not invoke this itself. */ +export async function completeWorkspace(workspace: WorkspaceRevision): Promise { + const modules = workspace.packageImports.flatMap((pkg) => { + const artifact = pkg.buildArtifacts?.[preparationArtifact] as ReactPreparationArtifact | undefined; + return (artifact?.modules ?? []).map((preparation) => { + const module = pkg.modules?.find((entry) => entry.id === preparation.module); + if (!module) throw Error(`React preparation has no module ${preparation.module}`); + const contract = moduleContract(workspace.interfaceImports, module)!; + return { pkg, module, contract, preparation }; + }); + }); + const graph = new Map(); + const key = (pkg: string, id: string) => JSON.stringify([pkg, id]); + for (const parent of modules) { + const composition = parent.pkg.queryCompositions?.find((entry) => entry.id === parent.preparation.composition); + if (!composition || composition.output.kind !== "record") + throw Error(`Missing checked inputs for ${parent.module.displayName}`); + const outputs = new Map(Object.entries(composition.output.fields)); + const dependencies: string[] = []; + const children = parent.preparation.children.map((child) => { + const at = `${parent.module.displayName}.${child.name}`; + let item: ValueType | undefined; + if (child.with) { + const type = queryBindingType(child.with, composition.input, outputs); + item = type.kind === "optional" ? type.value : type; + } + if (child.each) { + const type = queryBindingType(child.each.source, composition.input, outputs); + if (type.kind !== "list") throw Error(`${at}: each requires a list`); + item = type.value; + } + const root = queryBindingType(child.root, composition.input, outputs, item); + if ( + root.kind !== "object-ref" || + root.expectation.kind !== "interface" || + root.expectation.interfaceRevisionId !== child.subject + ) + throw Error(`${at}: child root must be a ${child.subject} reference; unwrap nulls and lists explicitly`); + if ( + child.when && + canonicalJson(queryBindingType(child.when, composition.input, outputs, item)) !== + canonicalJson({ kind: "scalar", name: "bool" }) + ) + throw Error(`${at}: when requires a boolean`); + const atoms = workspace.atoms.filter((atom) => + workspace.conformances.some((entry) => entry.atomId === atom.id && entry.interfaceRevisionId === child.subject), + ); + if (!atoms.length) throw Error(`${at}: no installed subject atoms`); + const branches = atoms.map((atom) => { + let candidates = modules.filter( + (entry) => + entry.contract.subject?.kind === "interface" && + entry.contract.subject.interfaceRevisionId === child.subject, + ); + if (child.role) { + const iface = workspace.interfaceImports.find((entry) => entry.revisionId === child.role!.interface); + const member = iface?.members.find( + (entry) => entry.displayName === child.role!.member || entry.id === child.role!.member, + ); + if (member?.kind !== "module") throw Error(`${at}: unknown rendering role`); + if ( + !workspace.conformances.some( + (entry) => entry.atomId === atom.id && entry.interfaceRevisionId === iface!.revisionId, + ) + ) + throw Error(`${at}: ${atom.id} does not implement the requested role`); + candidates = candidates.filter( + (entry) => entry.module.interfaceRevisionId === iface!.revisionId && entry.module.memberId === member.id, + ); + } else { + candidates = candidates.filter((entry) => + ["org.quixos.react.subject-only/1", "org.quixos.react.component/2"].includes(entry.contract.contract), + ); + } + if (child.provider) { + const pkg = parent.pkg.clientPackages?.[child.provider.package]; + if (!pkg) throw Error(`${at}: provider package is not imported`); + candidates = candidates.filter( + (entry) => entry.pkg.revisionId === pkg && entry.module.displayName === child.provider!.module, + ); + } else { + const bound = candidates.filter((entry) => + workspace.conformances.some( + (conformance) => + conformance.atomId === atom.id && + conformance.interfaceRevisionId === entry.module.interfaceRevisionId && + conformance.moduleBindings?.some( + (binding) => + binding.memberId === entry.module.memberId && + binding.packageRevisionId === entry.pkg.revisionId && + binding.moduleId === entry.module.id, + ), + ), + ); + candidates = bound.length + ? bound + : child.role + ? [] + : candidates.filter((entry) => + workspace.presentations?.some( + (presentation) => + presentation.subject === child.subject && + presentation.packageRevisionId === entry.pkg.revisionId && + presentation.componentId === entry.module.id, + ), + ); + } + if (candidates.length !== 1) + throw Error(`${at}: ${atom.id} has ${candidates.length} compatible providers; select one explicitly`); + const selected = candidates[0]!; + dependencies.push(key(selected.pkg.revisionId, selected.module.id)); + return { + atom: atom.id, + packageRevision: selected.pkg.revisionId, + id: selected.module.id, + role: { + interface: selected.module.interfaceRevisionId, + member: selected.module.memberId, + subject: child.subject, + contract: selected.contract.contract, + ...moduleTypeContext( + workspace.interfaceImports.find((entry) => entry.revisionId === selected.module.interfaceRevisionId)!, + ), + }, + }; + }); + return { ...child, branches }; + }); + graph.set(key(parent.pkg.revisionId, parent.module.id), dependencies); + Object.assign(parent.preparation, { children }); + } + const visited = new Set(); + const visit = (node: string, ancestors: string[]) => { + if (ancestors.includes(node)) throw Error(`Eager React preparation cycle: ${[...ancestors, node].join(" -> ")}`); + if (visited.has(node)) return; + for (const child of graph.get(node) ?? []) visit(child, [...ancestors, node]); + visited.add(node); + }; + for (const node of graph.keys()) visit(node, []); + await expandPresentationQueries(workspace); +} diff --git a/test/prepared-presentations.test.ts b/test/prepared-presentations.test.ts new file mode 100644 index 0000000..ae901cc --- /dev/null +++ b/test/prepared-presentations.test.ts @@ -0,0 +1,173 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/index.js"; +import type { InterfaceRevision, PackageRevision } from "../src/capability-model/types.js"; +import { compileQuery } from "../src/query/compile.js"; +import { compileQueryComposition } from "../src/query/composition.js"; +import { defaultQueryBudgets, type CheckedQuery } from "../src/query/types.js"; +import { + presentationDeclarations, + preparationArtifact, + type ReactPreparationArtifact, +} from "../src/react-build/declarations.js"; +import { completeWorkspace } from "../src/react-build/workspace.js"; + +const source = { repository: "https://example.test/prepared", commit: "a".repeat(40) }; +async function fixture(replacement = "First", change?: (artifact: ReactPreparationArtifact) => void) { + const interfaces = new Map(); + const resource = (text: string) => { + const result = compileCapabilityResourceSource(text, { + source, + environment: { interfaces, interfaceClosure: [...interfaces.values()] }, + }); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + return result.resource; + }; + for (const text of [ + 'interface Row id "row" revision "row@1" { queryable value title id "title" : string {get id "title:get" execution snapshot targets [browser, server];} queryable value detail id "detail" : string {get id "detail:get" execution snapshot targets [browser, server];} }', + 'import interface Row; interface Library id "library" revision "library@1" { queryable relation selected id "selected" : optional-one interface Row {resolve id "selected:get" execution snapshot targets [browser, server];} }', + 'import interface Row; interface RowRole id "row-role" revision "row-role@1" { module render id "row-render" contract "org.quixos.react.subject-only/1" subject interface Row; }', + 'import interface Library; interface LibraryRole id "library-role" revision "library-role@1" { module render id "library-render" contract "org.quixos.react.subject-only/1" subject interface Library; }', + ]) { + const result = resource(text); + assert.equal(result.kind, "interface"); + if (result.kind === "interface") interfaces.set(result.revision.displayName, result.revision); + } + const result = resource( + 'import interface Row; import interface Library; import interface RowRole; import interface LibraryRole; package UI id "ui" revision "ui@1" { module LibraryCard id "library-card" implements LibraryRole.render; module First id "first" implements RowRole.render; module Second id "second" implements RowRole.render; }', + ); + assert.equal(result.kind, "package"); + if (result.kind !== "package") throw Error("package expected"); + const pkg: PackageRevision = result.revision; + const checked: CheckedQuery[] = []; + for (const [name, iface, fields] of [ + ["LibraryData", "library@1", "selected {_camino {ref atom}}"], + ["Title", "row@1", "title"], + ["Detail", "row@1", "detail"], + ]) { + for (const local of [false, true]) { + const id = name + (local ? "" : "Inputs"); + checked.push( + await compileQuery( + { + id, + displayName: id, + root: { + kind: "object", + interface: [...interfaces.values()].find((entry) => entry.revisionId === iface)!.revisionId, + }, + document: id + ".graphql", + operation: id, + fragments: [], + views: [], + allowances: [], + budgets: { ...defaultQueryBudgets }, + watch: local, + placement: local ? { kind: "local", sourceQueryId: name + "Inputs" } : { kind: "replica" }, + }, + [...interfaces.values()], + async () => `query ${id} {root {${fields}}}`, + ), + ); + } + } + pkg.checkedQueries = checked; + pkg.queries = checked.map((query) => query.declaration); + const input = (query: string) => ({ + name: "data", + query, + root: { from: "input", path: ["subject"] }, + arguments: { record: {} }, + }); + const authored = { + modules: { + LibraryCard: { + inputs: [input("LibraryData")], + children: [ + { + name: "selected", + subject: "Row", + slot: "selected", + with: { from: "result", name: "data", path: ["root", "selected"] }, + root: { from: "item", path: ["_camino", "ref"] }, + role: { interface: "RowRole", member: "render" }, + }, + ], + }, + First: { inputs: [input("Title")] }, + Second: { inputs: [input("Detail")] }, + }, + }; + const declarations = presentationDeclarations(JSON.stringify(authored), pkg, [...interfaces.values()]); + change?.(declarations.artifact); + pkg.buildArtifacts = { [preparationArtifact]: declarations.artifact }; + pkg.queryCompositions = declarations.compositions.map((composition) => + compileQueryComposition(composition, new Map(checked.map((query) => [query.declaration.id, query]))), + ); + const workspace = compileCapabilitySource( + `workspace Example id "example" revision "example@1" commit "${source.commit}" { + import interface Row; import interface Library; import interface RowRole; import interface LibraryRole; import package UI; + atom A id "a"; atom B id "b"; + conform A as Row id "a-row" {private state TitleA id "title-A" on A : string policy register default "title"; private state DetailA id "detail-A" on A : string policy register default "detail"; bind title.get to state TitleA.read; bind detail.get to state DetailA.read;} + conform B as Row id "b-row" {private state TitleB id "title-B" on B : string policy register default "title"; private state DetailB id "detail-B" on B : string policy register default "detail"; bind title.get to state TitleB.read; bind detail.get to state DetailB.read;} + conform A as RowRole id "a-role" {bind render to UI.${replacement};} + conform B as RowRole id "b-role" {bind render to UI.Second;} + }`, + "workspace.qx", + { interfaces, interfaceClosure: [...interfaces.values()], packages: new Map([["UI", pkg]]) }, + ); + assert.ok(workspace.ok, JSON.stringify(workspace.diagnostics)); + await completeWorkspace(workspace.workspace); + return { workspace: workspace.workspace, pkg: workspace.workspace.packageImports[0]!, authored, interfaces }; +} + +test("workspace expands distinct providers' private inputs without parent field declarations", async () => { + const { pkg } = await fixture(); + const parent = pkg.checkedQueries!.find((query) => query.declaration.id === "react:input:library-card:data")!; + assert.match(parent.document, /title/); + assert.match(parent.document, /detail/); + const plan = pkg.queryCompositions!.find((composition) => composition.id === "react:inputs:library-card")!; + assert.equal(plan.steps[0]!.query, parent.declaration.id); + assert.equal(Object.keys(parent.fragmentContracts ?? {}).length, 2); + const discovery = pkg.queryCompositions!.find( + (composition) => composition.id === "react:inputs:library-card:discovery", + )!; + assert.equal( + discovery.steps[0]!.query, + "LibraryData", + "Cold child data cannot block discovering its selected reference", + ); +}); + +test("eager cycles and wrongly typed child bindings fail before runtime", async () => { + await assert.rejects( + fixture("First", (artifact) => { + artifact.modules + .find((module) => module.module === "first")! + .children.push({ + name: "again", + subject: "row@1", + slot: "again", + root: { from: "input", path: ["subject"] }, + role: { interface: "row-role@1", member: "render" }, + }); + }), + /Eager React preparation cycle/, + ); + await assert.rejects( + fixture("First", (artifact) => { + artifact.modules.find((module) => module.module === "library-card")!.children[0]!.root = { + literal: "not a reference", + }; + }), + /child root must be/, + ); +}); + +test("workspace replacement changes acquisition requirements without changing the parent", async () => { + const { pkg } = await fixture("Second"); + const parent = pkg.checkedQueries!.find((query) => query.declaration.id === "react:input:library-card:data")!; + assert.doesNotMatch(parent.document, /\btitle\b/); + assert.match(parent.document, /detail/); + assert.equal(Object.keys(parent.fragmentContracts ?? {}).length, 1); +}); diff --git a/test/presentations.test.ts b/test/presentations.test.ts index ab69e70..c908779 100644 --- a/test/presentations.test.ts +++ b/test/presentations.test.ts @@ -23,6 +23,8 @@ import { type PackageArtifacts, } from "../src/execution-world/index.js"; import { validateWorkspaceRevision } from "../src/capability-model/index.js"; +import { presentationDeclarations, preparationArtifact } from "../src/react-build/declarations.js"; +import { compileQueryComposition } from "../src/query/composition.js"; const source = { repository: "https://example.test/components.git", commit: "a".repeat(40) }; const contract = (name: string) => { @@ -58,6 +60,13 @@ const compilePackage = (body?: string) => const workspace = (presentation = 'presentation Card id "presentation:card" for Data using UI.Card;') => { const pkg = compilePackage(); assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); + const preparation = presentationDeclarations('{"modules":{"Card":{"inputs":[]}}}', pkg.resource.revision, [ + ...interfaces.values(), + ]); + pkg.resource.revision.buildArtifacts = { [preparationArtifact]: preparation.artifact }; + pkg.resource.revision.queryCompositions = preparation.compositions.map((entry) => + compileQueryComposition(entry, new Map()), + ); return compileCapabilitySource( `workspace Example id "workspace:example" revision "workspace:example@1" commit "${source.commit}" { import interface Data; import interface Other; import interface View; import package UI; From ad72185a6cb200bb80a60157e2d8c9797eb56085 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 27 Sep 2026 19:21:05 -0700 Subject: [PATCH 81/91] Implement independent presentation readiness boundaries --- src/execution-world/client-contracts.ts | 4 +-- src/query/compile.ts | 31 ++++++++++++++-- src/query/fragments.ts | 18 ++++++++-- src/query/types.ts | 4 +++ src/react-build/declarations.ts | 1 - src/react-build/expansion.ts | 31 ++++++++++------ test/prepared-presentations.test.ts | 34 +++++++++++------- test/query-fragments.test.ts | 48 +++++++++++++++++++++++++ 8 files changed, 140 insertions(+), 31 deletions(-) diff --git a/src/execution-world/client-contracts.ts b/src/execution-world/client-contracts.ts index cd0b676..6977abe 100644 --- a/src/execution-world/client-contracts.ts +++ b/src/execution-world/client-contracts.ts @@ -251,7 +251,7 @@ export function generateComponentClientBindings(plan: ExecutionPlan, packageRevi .join("\n"); return ( interfaces + - '\nimport {createObjectRenderer,definePackageQuery,definePackageFragment,type ComponentType,type ComponentProps,type PreparedPresentation} from "@quixos/camino-react";\n' + + '\nimport {createObjectRenderer,definePackageQuery,definePackageFragment,type ComponentType,type ComponentProps,type PresentationHandle} from "@quixos/camino-react";\n' + subjectBindings + "\n" + queries + @@ -288,7 +288,7 @@ export function generateComponentClientBindings(plan: ExecutionPlan, packageRevi )!; extra = props(iface.revisionId, member.id); } - const handle = `PreparedPresentation<${JSON.stringify(child.subject)}, ${extra}>`; + const handle = `PresentationHandle<${JSON.stringify(child.subject)}, ${extra}>`; return `readonly ${JSON.stringify(child.name)}: ${child.each ? `readonly ${handle}[]` : child.with || child.when ? `${handle} | null` : handle}`; }); const input = `${tsType(composition.output)} & {readonly children: {${children.join(";")}}}`; diff --git a/src/query/compile.ts b/src/query/compile.ts index 29e83d5..1a38c24 100644 --- a/src/query/compile.ts +++ b/src/query/compile.ts @@ -4,6 +4,8 @@ import { validate, specifiedRules, PossibleFragmentSpreadsRule, + NoUnusedVariablesRule, + GraphQLError, print, printSchema, visit, @@ -201,10 +203,29 @@ export async function compileQuery( }, }), ); + const bindingVariables = new Set( + [...fragmentContracts.values()] + .filter((entry) => entry.mode === "reference") + .flatMap((entry) => Object.values(entry.variables)), + ); const errors = validate( generated.schema, document, - specifiedRules.filter((rule) => rule !== PossibleFragmentSpreadsRule), + [ + ...specifiedRules.filter((rule) => rule !== PossibleFragmentSpreadsRule && rule !== NoUnusedVariablesRule), + (context) => ({ + OperationDefinition: { + leave(operation) { + const used = new Set(context.getRecursiveVariableUsages(operation).map(({ node }) => node.name.value)); + for (const variable of operation.variableDefinitions ?? []) { + const name = variable.variable.name.value; + if (!used.has(name) && !bindingVariables.has(name)) + context.reportError(new GraphQLError(`Variable "$${name}" is never used.`, { nodes: variable })); + } + }, + }, + }), + ], { maxErrors: 20 }, ); if (errors.length) { @@ -399,6 +420,7 @@ export async function compileQuery( for (const selection of set.selections) { if (++expandedFields > 10000) fail("QUERY_WORK_LIMIT", "Expanded query exceeds 10000 fields", selection); if (selection.kind === "FragmentSpread") { + if (fragmentContracts.get(selection.name.value)?.mode === "reference") continue; add( fragments.get(selection.name.value)!.selectionSet, conditional || !!selection.directives?.length, @@ -530,7 +552,9 @@ export async function compileQuery( }, ] : []), - ...selection(fragments.get(node.name.value)!.selectionSet, parent, inheritedConditions), + ...(contract?.mode === "reference" + ? [] + : selection(fragments.get(node.name.value)!.selectionSet, parent, inheritedConditions)), ]; } if (node.kind !== "Field") return []; @@ -610,9 +634,10 @@ export async function compileQuery( const definitionDigest = createHash("sha256") .update( canonicalJson({ - semantics: 4, + semantics: 5, declaration, normalized, + fragmentContracts: Object.fromEntries(fragmentContracts), // Source provenance belongs to the checked installation. Identical public // contracts keep their query identity when retained in another repository. // Closed generic identity remains explicit in revisionId/application. diff --git a/src/query/fragments.ts b/src/query/fragments.ts index 02e76f5..3fe3867 100644 --- a/src/query/fragments.ts +++ b/src/query/fragments.ts @@ -11,6 +11,8 @@ export async function fragmentSources( ) { const markers = new Map>(); for (const imported of declaration.importedFragments ?? []) { + if (imported.mode !== undefined && imported.mode !== "reference") + throw new QueryCompileError("FRAGMENT_IMPORT_MODE", "Unknown fragment import mode"); if (!resolve) throw new QueryCompileError( "FRAGMENT_RESOLVER_REQUIRED", @@ -57,7 +59,16 @@ export async function fragmentSources( node.name.value === exported.name ? exported.name : `${exported.name}__${node.name.value}`, ]), ); - for (const fragment of fragments) { + // A reference import binds the checked export, rather than spreading its + // fields into this operation. Keep a nominal stub for GraphQL root checking; + // the independently checked export supplies the actual projection contract. + const referenced = parse("fragment Binding on Placeholder { _camino { ref } }") + .definitions[0] as FragmentDefinitionNode; + for (const sourceFragment of imported.mode === "reference" + ? fragments.filter((entry) => entry.name.value === exported.name) + : fragments) { + const fragment = + imported.mode === "reference" ? { ...sourceFragment, selectionSet: referenced.selectionSet } : sourceFragment; definitions.push( visit(fragment, { FragmentDefinition(node) { @@ -73,13 +84,16 @@ export async function fragmentSources( ); } markers.set(exported.name, { + ...(imported.mode ? { mode: imported.mode } : {}), package: imported.packageRevisionId, fragment: imported.fragmentId, digest: checked.definitionDigest, root: checked.declaration.root.interface, variables: imported.variables, }); - for (const [name, contract] of Object.entries(checked.fragmentContracts ?? {})) { + for (const [name, contract] of Object.entries( + imported.mode === "reference" ? {} : (checked.fragmentContracts ?? {}), + )) { markers.set(privateNames.get(name) ?? name, { ...contract, variables: Object.fromEntries( diff --git a/src/query/types.ts b/src/query/types.ts index 41279c6..2afa27e 100644 --- a/src/query/types.ts +++ b/src/query/types.ts @@ -38,6 +38,9 @@ export interface QueryDeclaration { /** Exported local projection; compilation also creates its direct admission. */ fragment?: { name: string; operation?: string; admission?: boolean }; importedFragments?: { + /** Bind an independently observed fragment without including its fields in + * this projection. Its acquisition is still an explicit replica source. */ + mode?: "reference"; packageRevisionId: string; packageAlias?: string; fragmentId: string; @@ -113,6 +116,7 @@ export type QueryArgument = export interface QuerySelection { /** A checked occurrence marker, not an output field or storage capability. */ fragmentSpread?: { + mode?: "reference"; package: string; fragment: string; digest: string; diff --git a/src/react-build/declarations.ts b/src/react-build/declarations.ts index 42fd8ab..72635ae 100644 --- a/src/react-build/declarations.ts +++ b/src/react-build/declarations.ts @@ -17,7 +17,6 @@ export interface ReactChildDeclaration { export interface ReactModulePreparation { module: string; composition: string; - discoveryComposition?: string; children: ReactChildDeclaration[]; } export interface ReactPreparationArtifact { diff --git a/src/react-build/expansion.ts b/src/react-build/expansion.ts index 823b74b..177d8ba 100644 --- a/src/react-build/expansion.ts +++ b/src/react-build/expansion.ts @@ -147,9 +147,6 @@ export async function expandPresentationQueries(workspace: WorkspaceRevision): P for (const child of children) for (const branch of child.branches) await expandModule(identity(branch.packageRevision, branch.id)); const composition = pkg.queryCompositions!.find((entry) => entry.id === preparation.composition)!; - const discovery = { ...composition, id: composition.id + ":discovery" }; - preparation.discoveryComposition = discovery.id; - pkg.queryCompositions!.push(discovery); const steps = structuredClone(composition.steps); const exported: { step: string; query: CheckedQuery }[] = []; for (const step of steps) { @@ -187,7 +184,12 @@ export async function expandPresentationQueries(workspace: WorkspaceRevision): P (entry) => entry.packageRevisionId === branch.packageRevision && entry.fragmentId === declaration.id, ) ) { - imports.push({ packageRevisionId: branch.packageRevision, fragmentId: declaration.id, variables: {} }); + imports.push({ + packageRevisionId: branch.packageRevision, + fragmentId: declaration.id, + variables: {}, + mode: "reference", + }); } selection = insert(selection, path, declaration.fragment!.name); const admission = admissionFragments.get(identity(branch.packageRevision, declaration.id))!; @@ -203,6 +205,18 @@ export async function expandPresentationQueries(workspace: WorkspaceRevision): P variables: {}, }); admissionSelection = insert(admissionSelection, path, admission.declaration.fragment!.name); + if ( + !admissionImports.some( + (entry) => entry.packageRevisionId === branch.packageRevision && entry.fragmentId === declaration.id, + ) + ) + admissionImports.push({ + packageRevisionId: branch.packageRevision, + fragmentId: declaration.id, + variables: {}, + mode: "reference", + }); + admissionSelection = insert(admissionSelection, path, declaration.fragment!.name); } } } @@ -337,13 +351,7 @@ export async function expandPresentationQueries(workspace: WorkspaceRevision): P { id: composition.id, input: composition.input, steps, maxQueries: composition.maxQueries }, available, ); - const checkedDiscovery = compileQueryComposition( - { id: discovery.id, input: discovery.input, steps: discovery.steps, maxQueries: discovery.maxQueries }, - available, - ); - pkg.queryCompositions = pkg.queryCompositions!.map((entry) => - entry.id === composition.id ? checked : entry.id === discovery.id ? checkedDiscovery : entry, - ); + pkg.queryCompositions = pkg.queryCompositions!.map((entry) => (entry.id === composition.id ? checked : entry)); eager.set(key, exported); done.add(key); } @@ -411,6 +419,7 @@ export async function expandPresentationQueries(workspace: WorkspaceRevision): P packageRevisionId: input.pkg.revisionId, fragmentId: input.query.declaration.id, variables: {}, + ...(original.declaration.placement?.kind === "local" ? { mode: "reference" as const } : {}), })), }, print({ ...document, definitions }), diff --git a/test/prepared-presentations.test.ts b/test/prepared-presentations.test.ts index ae901cc..d9afea5 100644 --- a/test/prepared-presentations.test.ts +++ b/test/prepared-presentations.test.ts @@ -124,19 +124,20 @@ async function fixture(replacement = "First", change?: (artifact: ReactPreparati test("workspace expands distinct providers' private inputs without parent field declarations", async () => { const { pkg } = await fixture(); const parent = pkg.checkedQueries!.find((query) => query.declaration.id === "react:input:library-card:data")!; - assert.match(parent.document, /title/); - assert.match(parent.document, /detail/); + const acquisition = pkg.checkedQueries!.find( + (query) => + query.declaration.id === + (parent.declaration.placement?.kind === "local" ? parent.declaration.placement.sourceQueryId : ""), + )!; + assert.match(acquisition.document, /title/); + assert.match(acquisition.document, /detail/); const plan = pkg.queryCompositions!.find((composition) => composition.id === "react:inputs:library-card")!; assert.equal(plan.steps[0]!.query, parent.declaration.id); assert.equal(Object.keys(parent.fragmentContracts ?? {}).length, 2); - const discovery = pkg.queryCompositions!.find( - (composition) => composition.id === "react:inputs:library-card:discovery", - )!; - assert.equal( - discovery.steps[0]!.query, - "LibraryData", - "Cold child data cannot block discovering its selected reference", - ); + assert(!pkg.queryCompositions!.some((composition) => composition.id.endsWith(":discovery"))); + const original = pkg.checkedQueries!.find((query) => query.declaration.id === "LibraryData")!; + assert.deepEqual(parent.output, original.output, "Acquisition-only child fields are not parent requirements"); + assert(Object.values(parent.fragmentContracts!).every((entry) => entry.mode === "reference")); }); test("eager cycles and wrongly typed child bindings fail before runtime", async () => { @@ -167,7 +168,16 @@ test("eager cycles and wrongly typed child bindings fail before runtime", async test("workspace replacement changes acquisition requirements without changing the parent", async () => { const { pkg } = await fixture("Second"); const parent = pkg.checkedQueries!.find((query) => query.declaration.id === "react:input:library-card:data")!; - assert.doesNotMatch(parent.document, /\btitle\b/); - assert.match(parent.document, /detail/); + const acquisition = pkg.checkedQueries!.find( + (query) => + query.declaration.id === + (parent.declaration.placement?.kind === "local" ? parent.declaration.placement.sourceQueryId : ""), + )!; + assert.doesNotMatch(acquisition.document, /\btitle\b/); + assert.match(acquisition.document, /detail/); assert.equal(Object.keys(parent.fragmentContracts ?? {}).length, 1); + const previous = (await fixture()).pkg.checkedQueries!.find( + (query) => query.declaration.id === parent.declaration.id, + )!; + assert.deepEqual(parent.output, previous.output); }); diff --git a/test/query-fragments.test.ts b/test/query-fragments.test.ts index 880f0e9..c4e38a2 100644 --- a/test/query-fragments.test.ts +++ b/test/query-fragments.test.ts @@ -62,6 +62,21 @@ test("imported fragments retain checked occurrences and require exact roots", as assert.equal(result.selection[0]!.selection[0]!.fragmentSpread?.digest, checked.definitionDigest); assert.equal(result.selection[0]!.selection[0]!.fragmentSpread?.root, item.revisionId); assert.ok(result.effects.some((e) => e.memberId === "title")); + const bound = await compileQuery( + { + ...consumer.queries![0]!, + importedFragments: consumer.queries![0]!.importedFragments!.map((entry) => ({ ...entry, mode: "reference" })), + }, + [item], + async () => "query Screen {root {...Row}}", + async () => checked, + ); + assert.equal(bound.selection[0]!.selection.find((entry) => entry.fragmentSpread)?.fragmentSpread?.mode, "reference"); + assert( + !bound.selection[0]!.selection.some((entry) => entry.memberId === "title"), + "A fragment binding does not evaluate its fields in the parent", + ); + assert(!JSON.stringify(bound.output).includes('"title"'), "Parent output excludes separately observed fields"); const wrong = { ...checked, declaration: { @@ -113,6 +128,39 @@ test("fragment variable mappings are explicit and checked", async () => { async () => checked, ); assert.deepEqual(result.selection[0]!.selection[0]!.fragmentSpread?.variables, { show: "visible" }); + const referenceDeclaration = build("with {show to visible;}"); + referenceDeclaration.importedFragments = referenceDeclaration.importedFragments!.map((entry) => ({ + ...entry, + mode: "reference", + })); + const binding = await compileQuery( + referenceDeclaration, + [item], + async () => document, + async () => checked, + ); + assert.deepEqual(binding.selection[0]!.selection[0]!.fragmentSpread?.variables, { show: "visible" }); + assert.notEqual(binding.definitionDigest, result.definitionDigest); + await assert.rejects( + compileQuery( + referenceDeclaration, + [item], + async () => document.replace("$visible: Boolean!", "$visible: Boolean!, $unused: Boolean!"), + async () => checked, + ), + /never used/, + ); + const changedDigest = await compileQuery( + referenceDeclaration, + [item], + async () => document, + async () => ({ ...checked, definitionDigest: "b".repeat(64) }), + ); + assert.notEqual( + changedDigest.definitionDigest, + binding.definitionDigest, + "A bound fragment's identity remains in the parent contract digest", + ); await assert.rejects( compileQuery( build("with {show to visible;}"), From 696023b4baf4736922776528d6c885925c551f8b Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sun, 27 Sep 2026 22:06:12 -0700 Subject: [PATCH 82/91] Implement main-thread Camino sessions and synchronous CRDT editing --- grammar/QuixosCapability.g4 | 15 +- src/bindings/client.ts | 2 + src/bindings/generics.ts | 2 + src/bindings/index.ts | 3 + src/bindings/portable.ts | 15 + src/bindings/react.ts | 3 + .../generated/QuixosCapability.interp | 8 +- .../generated/QuixosCapability.tokens | 574 +-- .../generated/QuixosCapabilityLexer.interp | 8 +- .../generated/QuixosCapabilityLexer.tokens | 574 +-- .../generated/QuixosCapabilityLexer.ts | 1375 +++--- .../generated/QuixosCapabilityParser.ts | 4146 +++++++++-------- .../generated/QuixosCapabilityVisitor.ts | 14 + src/capability-language/generic-types.ts | 19 + src/capability-language/parser.ts | 21 + src/capability-model/generics.ts | 22 + src/capability-model/types.ts | 3 + src/capability-model/validation.ts | 54 + src/execution-world/kernel.ts | 9 +- src/execution-world/plan.ts | 3 + src/query/schema.ts | 21 + test/emit-portable-reader.ts | 17 + test/fixtures/canvas-content.qx | 12 + test/variants.test.ts | 82 + 24 files changed, 3784 insertions(+), 3218 deletions(-) create mode 100644 test/fixtures/canvas-content.qx create mode 100644 test/variants.test.ts diff --git a/grammar/QuixosCapability.g4 b/grammar/QuixosCapability.g4 index d4c77f6..af6a61a 100644 --- a/grammar/QuixosCapability.g4 +++ b/grammar/QuixosCapability.g4 @@ -189,18 +189,22 @@ fragmentVariable : identifier TO identifier SEMI; packageOperationExport : OPERATION identifier typeParameters? ID stringLiteral COLON valueType ARROW valueType - MODE operationMode executionClause? eventClause? RECEIVER receiverRequirement dependencyBlock? acceptanceClause? SEMI + MODE operationMode executionClause? eventClause? RECEIVER receiverRequirement dependencyBlock? preparationClause? acceptanceClause? SEMI ; packageFunctionExport : FUNCTION identifier typeParameters? ID stringLiteral COLON valueType ARROW valueType - executionClause? dependencyBlock? acceptanceClause? SEMI + executionClause? dependencyBlock? preparationClause? acceptanceClause? SEMI ; acceptanceClause : ACCEPT USING identifier ; +preparationClause + : PREPARES CREATION identifier USING stringLiteral + ; + executionClause : EXECUTION REMOTE | EXECUTION (SNAPSHOT | TRANSACTION) TARGETS LBRACK identifierList RBRACK @@ -418,6 +422,7 @@ valueType | OPTIONAL LT valueType GT | LIST LT valueType GT | RECORD LBRACE recordField* RBRACE + | VARIANT ID stringLiteral LBRACE variantCase+ RBRACE | identifier typeArguments? ; @@ -425,6 +430,10 @@ recordField : identifier COLON valueType SEMI ; +variantCase + : identifier ID stringLiteral COLON valueType SEMI + ; + scalarType : BOOL | BYTES @@ -517,6 +526,8 @@ PRESENTATION: 'presentation'; SUBJECT: 'subject'; FOR: 'for'; CREATION: 'creation'; +VARIANT: 'variant'; +PREPARES: 'prepares'; INITIALIZE: 'initialize'; WORKSPACE: 'workspace'; EXECUTION: 'execution'; diff --git a/src/bindings/client.ts b/src/bindings/client.ts index f397b41..c3fd941 100644 --- a/src/bindings/client.ts +++ b/src/bindings/client.ts @@ -11,6 +11,8 @@ export const generateClientContracts = ( throw new Error("Host contracts require closed interface applications, not generic definitions"); const type = (value: ValueType): string => { switch (value.kind) { + case "variant": + throw new Error("Variants require the Camino portable value runtime; legacy RPC bindings are unsupported"); case "builtin": return value.name === "unit" ? "undefined" : "string"; case "scalar": diff --git a/src/bindings/generics.ts b/src/bindings/generics.ts index d4e8714..e3ec258 100644 --- a/src/bindings/generics.ts +++ b/src/bindings/generics.ts @@ -49,6 +49,8 @@ export const genericImplementationType = ( const value = (type: ValueTypeExpression, scope: Scope, depth = 0): string => { if (depth > 128) throw new Error("Generic type expansion exceeds depth limit"); switch (type.kind) { + case "variant": + throw new Error("Variants require the Camino portable value runtime; legacy RPC bindings are unsupported"); case "parameter": { const bound = scope.arguments.get(type.parameterId); if (bound) return bound; diff --git a/src/bindings/index.ts b/src/bindings/index.ts index 8afc11a..e65b3c0 100644 --- a/src/bindings/index.ts +++ b/src/bindings/index.ts @@ -112,6 +112,8 @@ export const generateTypeScriptBindings = ( const messages = new Map(); const type = (value: ValueType): string => { switch (value.kind) { + case "variant": + throw new Error("Variants require the Camino portable value runtime; legacy RPC bindings are unsupported"); case "builtin": return value.name === "unit" ? "null" : "QxWatchHandle"; case "scalar": @@ -340,6 +342,7 @@ export const generateTypeScriptBindings = ( // A used port still fails above if its own required codec is missing. const hasCodec = (value: ValueType): boolean => { if (value.kind === "message") return !!options.messages?.[value.descriptorId]; + if (value.kind === "variant") return false; if (value.kind === "record") return Object.values(value.fields).every(hasCodec); if (value.kind === "list" || value.kind === "optional") return hasCodec(value.value); return true; diff --git a/src/bindings/portable.ts b/src/bindings/portable.ts index a195625..aeb24c6 100644 --- a/src/bindings/portable.ts +++ b/src/bindings/portable.ts @@ -29,6 +29,17 @@ const expectation = (e: ObjectExpectation) => ({ /** The protocol IR and replica wire schema intentionally share structure, not reference identity. */ export function portableValueSchema(type: ValueType): unknown { switch (type.kind) { + case "variant": + return { + kind: "variant", + id: type.id, + cases: Object.fromEntries( + Object.entries(type.cases).map(([label, entry]) => [ + label, + { id: entry.id, value: portableValueSchema(entry.value) }, + ]), + ), + }; case "change": return { kind: "record", @@ -65,6 +76,10 @@ export function portableValueSchema(type: ValueType): unknown { export function tsType(type: ValueType): string { portableValueSchema(type); switch (type.kind) { + case "variant": + return `(${Object.entries(type.cases) + .map(([label, entry]) => `{ readonly kind: ${q(label)}; readonly value: ${tsType(entry.value)} }`) + .join(" | ")})`; case "change": return `PreparedChange<${tsType(type.value)}>`; case "scalar": diff --git a/src/bindings/react.ts b/src/bindings/react.ts index 5034cd6..2f2f869 100644 --- a/src/bindings/react.ts +++ b/src/bindings/react.ts @@ -15,6 +15,8 @@ export function generateReactBindings( const declarations: string[] = []; const type = (value: ValueType): string => { switch (value.kind) { + case "variant": + throw new Error("Variants require the Camino portable value runtime; legacy RPC bindings are unsupported"); case "builtin": if (value.name !== "unit") throw new Error(`Unsupported React props builtin ${value.name}`); return "null"; @@ -85,6 +87,7 @@ export function generateReactBindings( const browserValue = (value: ValueType, seen: Set): boolean => { if (value.kind === "message") return false; if (value.kind === "builtin") return value.name === "unit"; + if (value.kind === "variant") return false; if (value.kind === "record") return Object.values(value.fields).every((field) => browserValue(field, seen)); if (value.kind === "list" || value.kind === "optional") return browserValue(value.value, seen); if (value.kind === "object-ref" && value.expectation.kind === "interface") { diff --git a/src/capability-language/generated/QuixosCapability.interp b/src/capability-language/generated/QuixosCapability.interp index ba1c860..ed7cd9b 100644 --- a/src/capability-language/generated/QuixosCapability.interp +++ b/src/capability-language/generated/QuixosCapability.interp @@ -7,6 +7,8 @@ null 'subject' 'for' 'creation' +'variant' +'prepares' 'initialize' 'workspace' 'execution' @@ -163,6 +165,8 @@ PRESENTATION SUBJECT FOR CREATION +VARIANT +PREPARES INITIALIZE WORKSPACE EXECUTION @@ -348,6 +352,7 @@ fragmentVariable packageOperationExport packageFunctionExport acceptanceClause +preparationClause executionClause selectedOperations packageConstructorExport @@ -386,6 +391,7 @@ dependencyBinding constructorBindingDecl valueType recordField +variantCase scalarType cardinality jsonLiteral @@ -397,4 +403,4 @@ stringLiteral atn: -[4, 1, 153, 1407, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 179, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 184, 8, 1, 10, 1, 12, 1, 187, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 205, 8, 3, 10, 3, 12, 3, 208, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 220, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 232, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 252, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 260, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 265, 8, 10, 10, 10, 12, 10, 268, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 273, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 283, 8, 10, 10, 10, 12, 10, 286, 9, 10, 3, 10, 288, 8, 10, 1, 10, 1, 10, 5, 10, 292, 8, 10, 10, 10, 12, 10, 295, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 303, 8, 11, 10, 11, 12, 11, 306, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 314, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 322, 8, 12, 10, 12, 12, 12, 325, 9, 12, 3, 12, 327, 8, 12, 3, 12, 329, 8, 12, 1, 13, 1, 13, 3, 13, 333, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 339, 8, 14, 10, 14, 12, 14, 342, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 353, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 358, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 368, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 378, 8, 18, 1, 18, 1, 18, 1, 19, 3, 19, 383, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 398, 8, 19, 1, 19, 1, 19, 1, 19, 1, 20, 3, 20, 404, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 414, 8, 20, 10, 20, 12, 20, 417, 9, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 425, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 433, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 441, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 454, 8, 21, 1, 22, 3, 22, 457, 8, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 467, 8, 22, 1, 22, 1, 22, 3, 22, 471, 8, 22, 1, 22, 1, 22, 5, 22, 475, 8, 22, 10, 22, 12, 22, 478, 9, 22, 1, 22, 1, 22, 1, 23, 1, 23, 3, 23, 484, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 490, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 498, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 506, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 519, 8, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 526, 8, 25, 1, 25, 1, 25, 3, 25, 530, 8, 25, 1, 26, 5, 26, 533, 8, 26, 10, 26, 12, 26, 536, 9, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 546, 8, 26, 1, 26, 1, 26, 5, 26, 550, 8, 26, 10, 26, 12, 26, 553, 9, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 563, 8, 27, 1, 28, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 3, 30, 589, 8, 30, 1, 30, 1, 30, 3, 30, 593, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 599, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 5, 30, 608, 8, 30, 10, 30, 12, 30, 611, 9, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 619, 8, 30, 1, 30, 1, 30, 5, 30, 623, 8, 30, 10, 30, 12, 30, 626, 9, 30, 1, 30, 1, 30, 3, 30, 630, 8, 30, 3, 30, 632, 8, 30, 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, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 661, 8, 32, 10, 32, 12, 32, 664, 9, 32, 1, 32, 3, 32, 667, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 673, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 700, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 3, 34, 710, 8, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 721, 8, 34, 1, 34, 3, 34, 724, 8, 34, 1, 34, 1, 34, 1, 34, 3, 34, 729, 8, 34, 1, 34, 3, 34, 732, 8, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 3, 35, 739, 8, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 748, 8, 35, 1, 35, 3, 35, 751, 8, 35, 1, 35, 3, 35, 754, 8, 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, 37, 1, 37, 1, 37, 3, 37, 771, 8, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 5, 38, 778, 8, 38, 10, 38, 12, 38, 781, 9, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 794, 8, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 5, 42, 813, 8, 42, 10, 42, 12, 42, 816, 9, 42, 3, 42, 818, 8, 42, 1, 42, 3, 42, 821, 8, 42, 1, 43, 1, 43, 1, 43, 5, 43, 826, 8, 43, 10, 43, 12, 43, 829, 9, 43, 1, 44, 1, 44, 1, 44, 5, 44, 834, 8, 44, 10, 44, 12, 44, 837, 9, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 868, 8, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 880, 8, 45, 1, 45, 3, 45, 883, 8, 45, 1, 45, 1, 45, 3, 45, 887, 8, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 909, 8, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 923, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 5, 46, 929, 8, 46, 10, 46, 12, 46, 932, 9, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 3, 49, 943, 8, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 957, 8, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 967, 8, 51, 1, 52, 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, 53, 1, 53, 3, 53, 985, 8, 53, 1, 53, 1, 53, 3, 53, 989, 8, 53, 1, 53, 3, 53, 992, 8, 53, 1, 53, 1, 53, 3, 53, 996, 8, 53, 1, 53, 3, 53, 999, 8, 53, 1, 53, 1, 53, 1, 54, 1, 54, 3, 54, 1005, 8, 54, 1, 54, 1, 54, 3, 54, 1009, 8, 54, 1, 54, 1, 54, 1, 54, 3, 54, 1014, 8, 54, 1, 54, 1, 54, 3, 54, 1018, 8, 54, 1, 54, 1, 54, 3, 54, 1022, 8, 54, 1, 54, 1, 54, 5, 54, 1026, 8, 54, 10, 54, 12, 54, 1029, 9, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 1042, 8, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 5, 58, 1055, 8, 58, 10, 58, 12, 58, 1058, 9, 58, 1, 58, 1, 58, 1, 58, 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, 1077, 8, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 1084, 8, 60, 10, 60, 12, 60, 1087, 9, 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, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1118, 8, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1138, 8, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1158, 8, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1168, 8, 66, 1, 66, 3, 66, 1171, 8, 66, 1, 66, 3, 66, 1174, 8, 66, 3, 66, 1176, 8, 66, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 5, 70, 1188, 8, 70, 10, 70, 12, 70, 1191, 9, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1214, 8, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1230, 8, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1239, 8, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1249, 8, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 5, 71, 1260, 8, 71, 10, 71, 12, 71, 1263, 9, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1277, 8, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1289, 8, 71, 1, 71, 1, 71, 3, 71, 1293, 8, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1302, 8, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1320, 8, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 5, 73, 1342, 8, 73, 10, 73, 12, 73, 1345, 9, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1350, 8, 73, 3, 73, 1352, 8, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 3, 77, 1371, 8, 77, 1, 78, 1, 78, 1, 78, 1, 78, 5, 78, 1377, 8, 78, 10, 78, 12, 78, 1380, 9, 78, 3, 78, 1382, 8, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 5, 80, 1394, 8, 80, 10, 80, 12, 80, 1397, 9, 80, 3, 80, 1399, 8, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 0, 0, 83, 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, 0, 9, 2, 0, 15, 15, 33, 33, 1, 0, 11, 12, 1, 0, 101, 105, 3, 0, 1, 1, 96, 100, 102, 103, 3, 0, 1, 1, 96, 97, 102, 103, 2, 0, 98, 100, 102, 103, 1, 0, 121, 128, 1, 0, 108, 111, 9, 0, 1, 1, 4, 8, 10, 33, 40, 40, 45, 45, 74, 74, 94, 95, 106, 106, 149, 149, 1524, 0, 178, 1, 0, 0, 0, 2, 180, 1, 0, 0, 0, 4, 190, 1, 0, 0, 0, 6, 194, 1, 0, 0, 0, 8, 219, 1, 0, 0, 0, 10, 231, 1, 0, 0, 0, 12, 233, 1, 0, 0, 0, 14, 240, 1, 0, 0, 0, 16, 251, 1, 0, 0, 0, 18, 253, 1, 0, 0, 0, 20, 266, 1, 0, 0, 0, 22, 298, 1, 0, 0, 0, 24, 328, 1, 0, 0, 0, 26, 330, 1, 0, 0, 0, 28, 334, 1, 0, 0, 0, 30, 352, 1, 0, 0, 0, 32, 354, 1, 0, 0, 0, 34, 367, 1, 0, 0, 0, 36, 369, 1, 0, 0, 0, 38, 382, 1, 0, 0, 0, 40, 403, 1, 0, 0, 0, 42, 453, 1, 0, 0, 0, 44, 456, 1, 0, 0, 0, 46, 481, 1, 0, 0, 0, 48, 518, 1, 0, 0, 0, 50, 529, 1, 0, 0, 0, 52, 534, 1, 0, 0, 0, 54, 562, 1, 0, 0, 0, 56, 564, 1, 0, 0, 0, 58, 574, 1, 0, 0, 0, 60, 586, 1, 0, 0, 0, 62, 633, 1, 0, 0, 0, 64, 699, 1, 0, 0, 0, 66, 701, 1, 0, 0, 0, 68, 706, 1, 0, 0, 0, 70, 735, 1, 0, 0, 0, 72, 757, 1, 0, 0, 0, 74, 770, 1, 0, 0, 0, 76, 772, 1, 0, 0, 0, 78, 784, 1, 0, 0, 0, 80, 797, 1, 0, 0, 0, 82, 800, 1, 0, 0, 0, 84, 820, 1, 0, 0, 0, 86, 822, 1, 0, 0, 0, 88, 830, 1, 0, 0, 0, 90, 922, 1, 0, 0, 0, 92, 924, 1, 0, 0, 0, 94, 935, 1, 0, 0, 0, 96, 937, 1, 0, 0, 0, 98, 942, 1, 0, 0, 0, 100, 944, 1, 0, 0, 0, 102, 966, 1, 0, 0, 0, 104, 968, 1, 0, 0, 0, 106, 977, 1, 0, 0, 0, 108, 1002, 1, 0, 0, 0, 110, 1032, 1, 0, 0, 0, 112, 1041, 1, 0, 0, 0, 114, 1043, 1, 0, 0, 0, 116, 1051, 1, 0, 0, 0, 118, 1076, 1, 0, 0, 0, 120, 1078, 1, 0, 0, 0, 122, 1090, 1, 0, 0, 0, 124, 1097, 1, 0, 0, 0, 126, 1111, 1, 0, 0, 0, 128, 1121, 1, 0, 0, 0, 130, 1137, 1, 0, 0, 0, 132, 1175, 1, 0, 0, 0, 134, 1177, 1, 0, 0, 0, 136, 1180, 1, 0, 0, 0, 138, 1182, 1, 0, 0, 0, 140, 1184, 1, 0, 0, 0, 142, 1292, 1, 0, 0, 0, 144, 1294, 1, 0, 0, 0, 146, 1351, 1, 0, 0, 0, 148, 1353, 1, 0, 0, 0, 150, 1358, 1, 0, 0, 0, 152, 1360, 1, 0, 0, 0, 154, 1370, 1, 0, 0, 0, 156, 1372, 1, 0, 0, 0, 158, 1385, 1, 0, 0, 0, 160, 1389, 1, 0, 0, 0, 162, 1402, 1, 0, 0, 0, 164, 1404, 1, 0, 0, 0, 166, 167, 3, 6, 3, 0, 167, 168, 5, 0, 0, 1, 168, 179, 1, 0, 0, 0, 169, 170, 3, 20, 10, 0, 170, 171, 5, 0, 0, 1, 171, 179, 1, 0, 0, 0, 172, 173, 3, 52, 26, 0, 173, 174, 5, 0, 0, 1, 174, 179, 1, 0, 0, 0, 175, 176, 3, 2, 1, 0, 176, 177, 5, 0, 0, 1, 177, 179, 1, 0, 0, 0, 178, 166, 1, 0, 0, 0, 178, 169, 1, 0, 0, 0, 178, 172, 1, 0, 0, 0, 178, 175, 1, 0, 0, 0, 179, 1, 1, 0, 0, 0, 180, 181, 5, 40, 0, 0, 181, 185, 5, 137, 0, 0, 182, 184, 3, 8, 4, 0, 183, 182, 1, 0, 0, 0, 184, 187, 1, 0, 0, 0, 185, 183, 1, 0, 0, 0, 185, 186, 1, 0, 0, 0, 186, 188, 1, 0, 0, 0, 187, 185, 1, 0, 0, 0, 188, 189, 5, 138, 0, 0, 189, 3, 1, 0, 0, 0, 190, 191, 5, 41, 0, 0, 191, 192, 3, 164, 82, 0, 192, 193, 5, 134, 0, 0, 193, 5, 1, 0, 0, 0, 194, 195, 5, 9, 0, 0, 195, 196, 3, 162, 81, 0, 196, 197, 5, 84, 0, 0, 197, 198, 3, 164, 82, 0, 198, 199, 5, 77, 0, 0, 199, 200, 3, 164, 82, 0, 200, 201, 5, 76, 0, 0, 201, 202, 3, 164, 82, 0, 202, 206, 5, 137, 0, 0, 203, 205, 3, 8, 4, 0, 204, 203, 1, 0, 0, 0, 205, 208, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 206, 207, 1, 0, 0, 0, 207, 209, 1, 0, 0, 0, 208, 206, 1, 0, 0, 0, 209, 210, 5, 138, 0, 0, 210, 7, 1, 0, 0, 0, 211, 220, 3, 4, 2, 0, 212, 220, 3, 18, 9, 0, 213, 220, 3, 10, 5, 0, 214, 220, 3, 96, 48, 0, 215, 220, 3, 108, 54, 0, 216, 220, 3, 144, 72, 0, 217, 220, 3, 58, 29, 0, 218, 220, 3, 32, 16, 0, 219, 211, 1, 0, 0, 0, 219, 212, 1, 0, 0, 0, 219, 213, 1, 0, 0, 0, 219, 214, 1, 0, 0, 0, 219, 215, 1, 0, 0, 0, 219, 216, 1, 0, 0, 0, 219, 217, 1, 0, 0, 0, 219, 218, 1, 0, 0, 0, 220, 9, 1, 0, 0, 0, 221, 222, 5, 41, 0, 0, 222, 223, 5, 44, 0, 0, 223, 224, 3, 162, 81, 0, 224, 225, 5, 134, 0, 0, 225, 232, 1, 0, 0, 0, 226, 227, 5, 41, 0, 0, 227, 228, 5, 46, 0, 0, 228, 229, 3, 162, 81, 0, 229, 230, 5, 134, 0, 0, 230, 232, 1, 0, 0, 0, 231, 221, 1, 0, 0, 0, 231, 226, 1, 0, 0, 0, 232, 11, 1, 0, 0, 0, 233, 234, 5, 42, 0, 0, 234, 235, 5, 43, 0, 0, 235, 236, 3, 162, 81, 0, 236, 237, 5, 84, 0, 0, 237, 238, 3, 164, 82, 0, 238, 239, 5, 134, 0, 0, 239, 13, 1, 0, 0, 0, 240, 241, 5, 42, 0, 0, 241, 242, 5, 44, 0, 0, 242, 243, 3, 162, 81, 0, 243, 244, 5, 77, 0, 0, 244, 245, 3, 164, 82, 0, 245, 246, 5, 134, 0, 0, 246, 15, 1, 0, 0, 0, 247, 252, 3, 10, 5, 0, 248, 252, 3, 12, 6, 0, 249, 252, 3, 14, 7, 0, 250, 252, 3, 32, 16, 0, 251, 247, 1, 0, 0, 0, 251, 248, 1, 0, 0, 0, 251, 249, 1, 0, 0, 0, 251, 250, 1, 0, 0, 0, 252, 17, 1, 0, 0, 0, 253, 254, 5, 43, 0, 0, 254, 255, 3, 162, 81, 0, 255, 256, 5, 84, 0, 0, 256, 259, 3, 164, 82, 0, 257, 258, 5, 85, 0, 0, 258, 260, 3, 164, 82, 0, 259, 257, 1, 0, 0, 0, 259, 260, 1, 0, 0, 0, 260, 261, 1, 0, 0, 0, 261, 262, 5, 134, 0, 0, 262, 19, 1, 0, 0, 0, 263, 265, 3, 16, 8, 0, 264, 263, 1, 0, 0, 0, 265, 268, 1, 0, 0, 0, 266, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 269, 1, 0, 0, 0, 268, 266, 1, 0, 0, 0, 269, 270, 5, 44, 0, 0, 270, 272, 3, 162, 81, 0, 271, 273, 3, 22, 11, 0, 272, 271, 1, 0, 0, 0, 272, 273, 1, 0, 0, 0, 273, 274, 1, 0, 0, 0, 274, 275, 5, 84, 0, 0, 275, 276, 3, 164, 82, 0, 276, 277, 5, 77, 0, 0, 277, 287, 3, 164, 82, 0, 278, 279, 5, 89, 0, 0, 279, 284, 3, 26, 13, 0, 280, 281, 5, 135, 0, 0, 281, 283, 3, 26, 13, 0, 282, 280, 1, 0, 0, 0, 283, 286, 1, 0, 0, 0, 284, 282, 1, 0, 0, 0, 284, 285, 1, 0, 0, 0, 285, 288, 1, 0, 0, 0, 286, 284, 1, 0, 0, 0, 287, 278, 1, 0, 0, 0, 287, 288, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 293, 5, 137, 0, 0, 290, 292, 3, 34, 17, 0, 291, 290, 1, 0, 0, 0, 292, 295, 1, 0, 0, 0, 293, 291, 1, 0, 0, 0, 293, 294, 1, 0, 0, 0, 294, 296, 1, 0, 0, 0, 295, 293, 1, 0, 0, 0, 296, 297, 5, 138, 0, 0, 297, 21, 1, 0, 0, 0, 298, 299, 5, 143, 0, 0, 299, 304, 3, 24, 12, 0, 300, 301, 5, 135, 0, 0, 301, 303, 3, 24, 12, 0, 302, 300, 1, 0, 0, 0, 303, 306, 1, 0, 0, 0, 304, 302, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 307, 1, 0, 0, 0, 306, 304, 1, 0, 0, 0, 307, 308, 5, 144, 0, 0, 308, 23, 1, 0, 0, 0, 309, 310, 5, 47, 0, 0, 310, 313, 3, 162, 81, 0, 311, 312, 5, 133, 0, 0, 312, 314, 5, 37, 0, 0, 313, 311, 1, 0, 0, 0, 313, 314, 1, 0, 0, 0, 314, 329, 1, 0, 0, 0, 315, 316, 5, 36, 0, 0, 316, 326, 3, 162, 81, 0, 317, 318, 5, 38, 0, 0, 318, 323, 3, 26, 13, 0, 319, 320, 5, 145, 0, 0, 320, 322, 3, 26, 13, 0, 321, 319, 1, 0, 0, 0, 322, 325, 1, 0, 0, 0, 323, 321, 1, 0, 0, 0, 323, 324, 1, 0, 0, 0, 324, 327, 1, 0, 0, 0, 325, 323, 1, 0, 0, 0, 326, 317, 1, 0, 0, 0, 326, 327, 1, 0, 0, 0, 327, 329, 1, 0, 0, 0, 328, 309, 1, 0, 0, 0, 328, 315, 1, 0, 0, 0, 329, 25, 1, 0, 0, 0, 330, 332, 3, 162, 81, 0, 331, 333, 3, 28, 14, 0, 332, 331, 1, 0, 0, 0, 332, 333, 1, 0, 0, 0, 333, 27, 1, 0, 0, 0, 334, 335, 5, 143, 0, 0, 335, 340, 3, 30, 15, 0, 336, 337, 5, 135, 0, 0, 337, 339, 3, 30, 15, 0, 338, 336, 1, 0, 0, 0, 339, 342, 1, 0, 0, 0, 340, 338, 1, 0, 0, 0, 340, 341, 1, 0, 0, 0, 341, 343, 1, 0, 0, 0, 342, 340, 1, 0, 0, 0, 343, 344, 5, 144, 0, 0, 344, 29, 1, 0, 0, 0, 345, 346, 5, 43, 0, 0, 346, 353, 3, 162, 81, 0, 347, 348, 5, 44, 0, 0, 348, 353, 3, 26, 13, 0, 349, 350, 5, 36, 0, 0, 350, 353, 3, 162, 81, 0, 351, 353, 3, 146, 73, 0, 352, 345, 1, 0, 0, 0, 352, 347, 1, 0, 0, 0, 352, 349, 1, 0, 0, 0, 352, 351, 1, 0, 0, 0, 353, 31, 1, 0, 0, 0, 354, 355, 5, 35, 0, 0, 355, 357, 3, 162, 81, 0, 356, 358, 3, 22, 11, 0, 357, 356, 1, 0, 0, 0, 357, 358, 1, 0, 0, 0, 358, 359, 1, 0, 0, 0, 359, 360, 5, 146, 0, 0, 360, 361, 3, 146, 73, 0, 361, 362, 5, 134, 0, 0, 362, 33, 1, 0, 0, 0, 363, 368, 3, 40, 20, 0, 364, 368, 3, 44, 22, 0, 365, 368, 3, 38, 19, 0, 366, 368, 3, 36, 18, 0, 367, 363, 1, 0, 0, 0, 367, 364, 1, 0, 0, 0, 367, 365, 1, 0, 0, 0, 367, 366, 1, 0, 0, 0, 368, 35, 1, 0, 0, 0, 369, 370, 5, 2, 0, 0, 370, 371, 3, 162, 81, 0, 371, 372, 5, 84, 0, 0, 372, 373, 3, 164, 82, 0, 373, 374, 5, 3, 0, 0, 374, 377, 3, 164, 82, 0, 375, 376, 5, 5, 0, 0, 376, 378, 3, 50, 25, 0, 377, 375, 1, 0, 0, 0, 377, 378, 1, 0, 0, 0, 378, 379, 1, 0, 0, 0, 379, 380, 5, 134, 0, 0, 380, 37, 1, 0, 0, 0, 381, 383, 5, 57, 0, 0, 382, 381, 1, 0, 0, 0, 382, 383, 1, 0, 0, 0, 383, 384, 1, 0, 0, 0, 384, 385, 5, 49, 0, 0, 385, 386, 3, 162, 81, 0, 386, 387, 5, 84, 0, 0, 387, 388, 3, 164, 82, 0, 388, 389, 5, 133, 0, 0, 389, 390, 3, 146, 73, 0, 390, 391, 5, 132, 0, 0, 391, 392, 3, 146, 73, 0, 392, 393, 5, 137, 0, 0, 393, 394, 5, 101, 0, 0, 394, 395, 5, 84, 0, 0, 395, 397, 3, 164, 82, 0, 396, 398, 3, 74, 37, 0, 397, 396, 1, 0, 0, 0, 397, 398, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 400, 5, 134, 0, 0, 400, 401, 5, 138, 0, 0, 401, 39, 1, 0, 0, 0, 402, 404, 3, 46, 23, 0, 403, 402, 1, 0, 0, 0, 403, 404, 1, 0, 0, 0, 404, 405, 1, 0, 0, 0, 405, 406, 5, 47, 0, 0, 406, 407, 3, 162, 81, 0, 407, 408, 5, 84, 0, 0, 408, 409, 3, 164, 82, 0, 409, 410, 5, 133, 0, 0, 410, 411, 3, 146, 73, 0, 411, 415, 5, 137, 0, 0, 412, 414, 3, 42, 21, 0, 413, 412, 1, 0, 0, 0, 414, 417, 1, 0, 0, 0, 415, 413, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 418, 1, 0, 0, 0, 417, 415, 1, 0, 0, 0, 418, 419, 5, 138, 0, 0, 419, 41, 1, 0, 0, 0, 420, 421, 5, 91, 0, 0, 421, 422, 5, 84, 0, 0, 422, 424, 3, 164, 82, 0, 423, 425, 3, 74, 37, 0, 424, 423, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 427, 5, 134, 0, 0, 427, 454, 1, 0, 0, 0, 428, 429, 5, 92, 0, 0, 429, 430, 5, 84, 0, 0, 430, 432, 3, 164, 82, 0, 431, 433, 3, 74, 37, 0, 432, 431, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 434, 1, 0, 0, 0, 434, 435, 5, 134, 0, 0, 435, 454, 1, 0, 0, 0, 436, 437, 5, 1, 0, 0, 437, 438, 5, 84, 0, 0, 438, 440, 3, 164, 82, 0, 439, 441, 3, 74, 37, 0, 440, 439, 1, 0, 0, 0, 440, 441, 1, 0, 0, 0, 441, 442, 1, 0, 0, 0, 442, 443, 5, 134, 0, 0, 443, 454, 1, 0, 0, 0, 444, 445, 5, 93, 0, 0, 445, 446, 5, 94, 0, 0, 446, 447, 5, 84, 0, 0, 447, 448, 3, 164, 82, 0, 448, 449, 5, 95, 0, 0, 449, 450, 5, 84, 0, 0, 450, 451, 3, 164, 82, 0, 451, 452, 5, 134, 0, 0, 452, 454, 1, 0, 0, 0, 453, 420, 1, 0, 0, 0, 453, 428, 1, 0, 0, 0, 453, 436, 1, 0, 0, 0, 453, 444, 1, 0, 0, 0, 454, 43, 1, 0, 0, 0, 455, 457, 3, 46, 23, 0, 456, 455, 1, 0, 0, 0, 456, 457, 1, 0, 0, 0, 457, 458, 1, 0, 0, 0, 458, 459, 5, 48, 0, 0, 459, 460, 3, 162, 81, 0, 460, 461, 5, 84, 0, 0, 461, 462, 3, 164, 82, 0, 462, 463, 5, 133, 0, 0, 463, 464, 3, 152, 76, 0, 464, 466, 3, 50, 25, 0, 465, 467, 5, 112, 0, 0, 466, 465, 1, 0, 0, 0, 466, 467, 1, 0, 0, 0, 467, 470, 1, 0, 0, 0, 468, 469, 5, 82, 0, 0, 469, 471, 3, 164, 82, 0, 470, 468, 1, 0, 0, 0, 470, 471, 1, 0, 0, 0, 471, 472, 1, 0, 0, 0, 472, 476, 5, 137, 0, 0, 473, 475, 3, 48, 24, 0, 474, 473, 1, 0, 0, 0, 475, 478, 1, 0, 0, 0, 476, 474, 1, 0, 0, 0, 476, 477, 1, 0, 0, 0, 477, 479, 1, 0, 0, 0, 478, 476, 1, 0, 0, 0, 479, 480, 5, 138, 0, 0, 480, 45, 1, 0, 0, 0, 481, 483, 5, 32, 0, 0, 482, 484, 7, 0, 0, 0, 483, 482, 1, 0, 0, 0, 483, 484, 1, 0, 0, 0, 484, 47, 1, 0, 0, 0, 485, 486, 5, 98, 0, 0, 486, 487, 5, 84, 0, 0, 487, 489, 3, 164, 82, 0, 488, 490, 3, 74, 37, 0, 489, 488, 1, 0, 0, 0, 489, 490, 1, 0, 0, 0, 490, 491, 1, 0, 0, 0, 491, 492, 5, 134, 0, 0, 492, 519, 1, 0, 0, 0, 493, 494, 5, 99, 0, 0, 494, 495, 5, 84, 0, 0, 495, 497, 3, 164, 82, 0, 496, 498, 3, 74, 37, 0, 497, 496, 1, 0, 0, 0, 497, 498, 1, 0, 0, 0, 498, 499, 1, 0, 0, 0, 499, 500, 5, 134, 0, 0, 500, 519, 1, 0, 0, 0, 501, 502, 5, 100, 0, 0, 502, 503, 5, 84, 0, 0, 503, 505, 3, 164, 82, 0, 504, 506, 3, 74, 37, 0, 505, 504, 1, 0, 0, 0, 505, 506, 1, 0, 0, 0, 506, 507, 1, 0, 0, 0, 507, 508, 5, 134, 0, 0, 508, 519, 1, 0, 0, 0, 509, 510, 5, 93, 0, 0, 510, 511, 5, 94, 0, 0, 511, 512, 5, 84, 0, 0, 512, 513, 3, 164, 82, 0, 513, 514, 5, 95, 0, 0, 514, 515, 5, 84, 0, 0, 515, 516, 3, 164, 82, 0, 516, 517, 5, 134, 0, 0, 517, 519, 1, 0, 0, 0, 518, 485, 1, 0, 0, 0, 518, 493, 1, 0, 0, 0, 518, 501, 1, 0, 0, 0, 518, 509, 1, 0, 0, 0, 519, 49, 1, 0, 0, 0, 520, 521, 5, 43, 0, 0, 521, 530, 3, 162, 81, 0, 522, 523, 5, 44, 0, 0, 523, 525, 3, 162, 81, 0, 524, 526, 3, 28, 14, 0, 525, 524, 1, 0, 0, 0, 525, 526, 1, 0, 0, 0, 526, 530, 1, 0, 0, 0, 527, 528, 5, 36, 0, 0, 528, 530, 3, 162, 81, 0, 529, 520, 1, 0, 0, 0, 529, 522, 1, 0, 0, 0, 529, 527, 1, 0, 0, 0, 530, 51, 1, 0, 0, 0, 531, 533, 3, 16, 8, 0, 532, 531, 1, 0, 0, 0, 533, 536, 1, 0, 0, 0, 534, 532, 1, 0, 0, 0, 534, 535, 1, 0, 0, 0, 535, 537, 1, 0, 0, 0, 536, 534, 1, 0, 0, 0, 537, 538, 5, 46, 0, 0, 538, 539, 3, 162, 81, 0, 539, 540, 5, 84, 0, 0, 540, 541, 3, 164, 82, 0, 541, 542, 5, 77, 0, 0, 542, 545, 3, 164, 82, 0, 543, 544, 5, 78, 0, 0, 544, 546, 5, 147, 0, 0, 545, 543, 1, 0, 0, 0, 545, 546, 1, 0, 0, 0, 546, 547, 1, 0, 0, 0, 547, 551, 5, 137, 0, 0, 548, 550, 3, 54, 27, 0, 549, 548, 1, 0, 0, 0, 550, 553, 1, 0, 0, 0, 551, 549, 1, 0, 0, 0, 551, 552, 1, 0, 0, 0, 552, 554, 1, 0, 0, 0, 553, 551, 1, 0, 0, 0, 554, 555, 5, 138, 0, 0, 555, 53, 1, 0, 0, 0, 556, 563, 3, 68, 34, 0, 557, 563, 3, 70, 35, 0, 558, 563, 3, 78, 39, 0, 559, 563, 3, 60, 30, 0, 560, 563, 3, 62, 31, 0, 561, 563, 3, 56, 28, 0, 562, 556, 1, 0, 0, 0, 562, 557, 1, 0, 0, 0, 562, 558, 1, 0, 0, 0, 562, 559, 1, 0, 0, 0, 562, 560, 1, 0, 0, 0, 562, 561, 1, 0, 0, 0, 563, 55, 1, 0, 0, 0, 564, 565, 5, 2, 0, 0, 565, 566, 3, 162, 81, 0, 566, 567, 5, 84, 0, 0, 567, 568, 3, 164, 82, 0, 568, 569, 5, 38, 0, 0, 569, 570, 3, 26, 13, 0, 570, 571, 5, 136, 0, 0, 571, 572, 3, 162, 81, 0, 572, 573, 5, 134, 0, 0, 573, 57, 1, 0, 0, 0, 574, 575, 5, 4, 0, 0, 575, 576, 3, 162, 81, 0, 576, 577, 5, 84, 0, 0, 577, 578, 3, 164, 82, 0, 578, 579, 5, 6, 0, 0, 579, 580, 3, 26, 13, 0, 580, 581, 5, 65, 0, 0, 581, 582, 3, 162, 81, 0, 582, 583, 5, 136, 0, 0, 583, 584, 3, 162, 81, 0, 584, 585, 5, 134, 0, 0, 585, 59, 1, 0, 0, 0, 586, 588, 5, 22, 0, 0, 587, 589, 5, 40, 0, 0, 588, 587, 1, 0, 0, 0, 588, 589, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 590, 592, 3, 162, 81, 0, 591, 593, 3, 22, 11, 0, 592, 591, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 595, 5, 84, 0, 0, 595, 596, 3, 164, 82, 0, 596, 598, 5, 25, 0, 0, 597, 599, 5, 9, 0, 0, 598, 597, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 600, 1, 0, 0, 0, 600, 601, 3, 26, 13, 0, 601, 602, 5, 26, 0, 0, 602, 631, 3, 164, 82, 0, 603, 604, 5, 49, 0, 0, 604, 605, 3, 164, 82, 0, 605, 609, 5, 137, 0, 0, 606, 608, 3, 64, 32, 0, 607, 606, 1, 0, 0, 0, 608, 611, 1, 0, 0, 0, 609, 607, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 612, 1, 0, 0, 0, 611, 609, 1, 0, 0, 0, 612, 613, 5, 138, 0, 0, 613, 632, 1, 0, 0, 0, 614, 615, 5, 40, 0, 0, 615, 618, 3, 164, 82, 0, 616, 617, 5, 49, 0, 0, 617, 619, 3, 164, 82, 0, 618, 616, 1, 0, 0, 0, 618, 619, 1, 0, 0, 0, 619, 629, 1, 0, 0, 0, 620, 624, 5, 137, 0, 0, 621, 623, 3, 64, 32, 0, 622, 621, 1, 0, 0, 0, 623, 626, 1, 0, 0, 0, 624, 622, 1, 0, 0, 0, 624, 625, 1, 0, 0, 0, 625, 627, 1, 0, 0, 0, 626, 624, 1, 0, 0, 0, 627, 630, 5, 138, 0, 0, 628, 630, 5, 134, 0, 0, 629, 620, 1, 0, 0, 0, 629, 628, 1, 0, 0, 0, 630, 632, 1, 0, 0, 0, 631, 603, 1, 0, 0, 0, 631, 614, 1, 0, 0, 0, 632, 61, 1, 0, 0, 0, 633, 634, 5, 22, 0, 0, 634, 635, 3, 162, 81, 0, 635, 636, 5, 84, 0, 0, 636, 637, 3, 164, 82, 0, 637, 638, 5, 24, 0, 0, 638, 639, 3, 162, 81, 0, 639, 640, 3, 28, 14, 0, 640, 641, 5, 134, 0, 0, 641, 63, 1, 0, 0, 0, 642, 643, 5, 16, 0, 0, 643, 700, 5, 134, 0, 0, 644, 645, 5, 17, 0, 0, 645, 646, 5, 18, 0, 0, 646, 647, 3, 162, 81, 0, 647, 648, 5, 134, 0, 0, 648, 700, 1, 0, 0, 0, 649, 650, 5, 27, 0, 0, 650, 651, 3, 164, 82, 0, 651, 652, 5, 134, 0, 0, 652, 700, 1, 0, 0, 0, 653, 654, 5, 27, 0, 0, 654, 655, 3, 162, 81, 0, 655, 656, 5, 136, 0, 0, 656, 666, 3, 162, 81, 0, 657, 658, 5, 64, 0, 0, 658, 662, 5, 137, 0, 0, 659, 661, 3, 66, 33, 0, 660, 659, 1, 0, 0, 0, 661, 664, 1, 0, 0, 0, 662, 660, 1, 0, 0, 0, 662, 663, 1, 0, 0, 0, 663, 665, 1, 0, 0, 0, 664, 662, 1, 0, 0, 0, 665, 667, 5, 138, 0, 0, 666, 657, 1, 0, 0, 0, 666, 667, 1, 0, 0, 0, 667, 668, 1, 0, 0, 0, 668, 669, 5, 134, 0, 0, 669, 700, 1, 0, 0, 0, 670, 672, 5, 28, 0, 0, 671, 673, 5, 36, 0, 0, 672, 671, 1, 0, 0, 0, 672, 673, 1, 0, 0, 0, 673, 674, 1, 0, 0, 0, 674, 675, 3, 162, 81, 0, 675, 676, 5, 55, 0, 0, 676, 677, 3, 26, 13, 0, 677, 678, 5, 134, 0, 0, 678, 700, 1, 0, 0, 0, 679, 680, 5, 29, 0, 0, 680, 681, 3, 162, 81, 0, 681, 682, 5, 147, 0, 0, 682, 683, 5, 134, 0, 0, 683, 700, 1, 0, 0, 0, 684, 685, 5, 30, 0, 0, 685, 686, 3, 26, 13, 0, 686, 687, 5, 136, 0, 0, 687, 688, 3, 162, 81, 0, 688, 689, 3, 162, 81, 0, 689, 690, 3, 164, 82, 0, 690, 691, 5, 134, 0, 0, 691, 700, 1, 0, 0, 0, 692, 693, 5, 93, 0, 0, 693, 700, 5, 134, 0, 0, 694, 695, 5, 31, 0, 0, 695, 696, 5, 147, 0, 0, 696, 697, 3, 164, 82, 0, 697, 698, 5, 134, 0, 0, 698, 700, 1, 0, 0, 0, 699, 642, 1, 0, 0, 0, 699, 644, 1, 0, 0, 0, 699, 649, 1, 0, 0, 0, 699, 653, 1, 0, 0, 0, 699, 670, 1, 0, 0, 0, 699, 679, 1, 0, 0, 0, 699, 684, 1, 0, 0, 0, 699, 692, 1, 0, 0, 0, 699, 694, 1, 0, 0, 0, 700, 65, 1, 0, 0, 0, 701, 702, 3, 162, 81, 0, 702, 703, 5, 58, 0, 0, 703, 704, 3, 162, 81, 0, 704, 705, 5, 134, 0, 0, 705, 67, 1, 0, 0, 0, 706, 707, 5, 49, 0, 0, 707, 709, 3, 162, 81, 0, 708, 710, 3, 22, 11, 0, 709, 708, 1, 0, 0, 0, 709, 710, 1, 0, 0, 0, 710, 711, 1, 0, 0, 0, 711, 712, 5, 84, 0, 0, 712, 713, 3, 164, 82, 0, 713, 714, 5, 133, 0, 0, 714, 715, 3, 146, 73, 0, 715, 716, 5, 132, 0, 0, 716, 717, 3, 146, 73, 0, 717, 718, 5, 86, 0, 0, 718, 720, 3, 82, 41, 0, 719, 721, 3, 74, 37, 0, 720, 719, 1, 0, 0, 0, 720, 721, 1, 0, 0, 0, 721, 723, 1, 0, 0, 0, 722, 724, 3, 80, 40, 0, 723, 722, 1, 0, 0, 0, 723, 724, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 726, 5, 88, 0, 0, 726, 728, 3, 84, 42, 0, 727, 729, 3, 88, 44, 0, 728, 727, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 731, 1, 0, 0, 0, 730, 732, 3, 72, 36, 0, 731, 730, 1, 0, 0, 0, 731, 732, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 734, 5, 134, 0, 0, 734, 69, 1, 0, 0, 0, 735, 736, 5, 50, 0, 0, 736, 738, 3, 162, 81, 0, 737, 739, 3, 22, 11, 0, 738, 737, 1, 0, 0, 0, 738, 739, 1, 0, 0, 0, 739, 740, 1, 0, 0, 0, 740, 741, 5, 84, 0, 0, 741, 742, 3, 164, 82, 0, 742, 743, 5, 133, 0, 0, 743, 744, 3, 146, 73, 0, 744, 745, 5, 132, 0, 0, 745, 747, 3, 146, 73, 0, 746, 748, 3, 74, 37, 0, 747, 746, 1, 0, 0, 0, 747, 748, 1, 0, 0, 0, 748, 750, 1, 0, 0, 0, 749, 751, 3, 88, 44, 0, 750, 749, 1, 0, 0, 0, 750, 751, 1, 0, 0, 0, 751, 753, 1, 0, 0, 0, 752, 754, 3, 72, 36, 0, 753, 752, 1, 0, 0, 0, 753, 754, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 756, 5, 134, 0, 0, 756, 71, 1, 0, 0, 0, 757, 758, 5, 66, 0, 0, 758, 759, 5, 65, 0, 0, 759, 760, 3, 162, 81, 0, 760, 73, 1, 0, 0, 0, 761, 762, 5, 10, 0, 0, 762, 771, 5, 13, 0, 0, 763, 764, 5, 10, 0, 0, 764, 765, 7, 1, 0, 0, 765, 766, 5, 14, 0, 0, 766, 767, 5, 139, 0, 0, 767, 768, 3, 86, 43, 0, 768, 769, 5, 140, 0, 0, 769, 771, 1, 0, 0, 0, 770, 761, 1, 0, 0, 0, 770, 763, 1, 0, 0, 0, 771, 75, 1, 0, 0, 0, 772, 773, 5, 65, 0, 0, 773, 774, 5, 139, 0, 0, 774, 779, 3, 128, 64, 0, 775, 776, 5, 135, 0, 0, 776, 778, 3, 128, 64, 0, 777, 775, 1, 0, 0, 0, 778, 781, 1, 0, 0, 0, 779, 777, 1, 0, 0, 0, 779, 780, 1, 0, 0, 0, 780, 782, 1, 0, 0, 0, 781, 779, 1, 0, 0, 0, 782, 783, 5, 140, 0, 0, 783, 77, 1, 0, 0, 0, 784, 785, 5, 51, 0, 0, 785, 786, 3, 162, 81, 0, 786, 787, 5, 84, 0, 0, 787, 788, 3, 164, 82, 0, 788, 789, 5, 52, 0, 0, 789, 790, 3, 162, 81, 0, 790, 791, 5, 133, 0, 0, 791, 793, 3, 146, 73, 0, 792, 794, 3, 88, 44, 0, 793, 792, 1, 0, 0, 0, 793, 794, 1, 0, 0, 0, 794, 795, 1, 0, 0, 0, 795, 796, 5, 134, 0, 0, 796, 79, 1, 0, 0, 0, 797, 798, 5, 87, 0, 0, 798, 799, 3, 146, 73, 0, 799, 81, 1, 0, 0, 0, 800, 801, 7, 2, 0, 0, 801, 83, 1, 0, 0, 0, 802, 821, 5, 90, 0, 0, 803, 804, 5, 43, 0, 0, 804, 821, 3, 162, 81, 0, 805, 806, 5, 36, 0, 0, 806, 821, 3, 162, 81, 0, 807, 808, 5, 45, 0, 0, 808, 817, 5, 139, 0, 0, 809, 814, 3, 26, 13, 0, 810, 811, 5, 135, 0, 0, 811, 813, 3, 26, 13, 0, 812, 810, 1, 0, 0, 0, 813, 816, 1, 0, 0, 0, 814, 812, 1, 0, 0, 0, 814, 815, 1, 0, 0, 0, 815, 818, 1, 0, 0, 0, 816, 814, 1, 0, 0, 0, 817, 809, 1, 0, 0, 0, 817, 818, 1, 0, 0, 0, 818, 819, 1, 0, 0, 0, 819, 821, 5, 140, 0, 0, 820, 802, 1, 0, 0, 0, 820, 803, 1, 0, 0, 0, 820, 805, 1, 0, 0, 0, 820, 807, 1, 0, 0, 0, 821, 85, 1, 0, 0, 0, 822, 827, 3, 162, 81, 0, 823, 824, 5, 135, 0, 0, 824, 826, 3, 162, 81, 0, 825, 823, 1, 0, 0, 0, 826, 829, 1, 0, 0, 0, 827, 825, 1, 0, 0, 0, 827, 828, 1, 0, 0, 0, 828, 87, 1, 0, 0, 0, 829, 827, 1, 0, 0, 0, 830, 831, 5, 89, 0, 0, 831, 835, 5, 137, 0, 0, 832, 834, 3, 90, 45, 0, 833, 832, 1, 0, 0, 0, 834, 837, 1, 0, 0, 0, 835, 833, 1, 0, 0, 0, 835, 836, 1, 0, 0, 0, 836, 838, 1, 0, 0, 0, 837, 835, 1, 0, 0, 0, 838, 839, 5, 138, 0, 0, 839, 89, 1, 0, 0, 0, 840, 841, 5, 23, 0, 0, 841, 842, 3, 162, 81, 0, 842, 843, 5, 84, 0, 0, 843, 844, 3, 164, 82, 0, 844, 845, 5, 139, 0, 0, 845, 846, 3, 86, 43, 0, 846, 847, 5, 140, 0, 0, 847, 848, 5, 134, 0, 0, 848, 923, 1, 0, 0, 0, 849, 850, 5, 61, 0, 0, 850, 851, 3, 162, 81, 0, 851, 852, 5, 84, 0, 0, 852, 853, 3, 164, 82, 0, 853, 854, 5, 133, 0, 0, 854, 855, 3, 146, 73, 0, 855, 856, 3, 92, 46, 0, 856, 857, 5, 134, 0, 0, 857, 923, 1, 0, 0, 0, 858, 859, 5, 62, 0, 0, 859, 860, 3, 162, 81, 0, 860, 861, 5, 84, 0, 0, 861, 862, 3, 164, 82, 0, 862, 863, 5, 133, 0, 0, 863, 864, 3, 152, 76, 0, 864, 867, 3, 50, 25, 0, 865, 866, 5, 82, 0, 0, 866, 868, 3, 164, 82, 0, 867, 865, 1, 0, 0, 0, 867, 868, 1, 0, 0, 0, 868, 869, 1, 0, 0, 0, 869, 870, 3, 92, 46, 0, 870, 871, 5, 134, 0, 0, 871, 923, 1, 0, 0, 0, 872, 873, 5, 44, 0, 0, 873, 874, 3, 162, 81, 0, 874, 875, 5, 84, 0, 0, 875, 876, 3, 164, 82, 0, 876, 877, 5, 133, 0, 0, 877, 879, 3, 162, 81, 0, 878, 880, 3, 28, 14, 0, 879, 878, 1, 0, 0, 0, 879, 880, 1, 0, 0, 0, 880, 882, 1, 0, 0, 0, 881, 883, 3, 76, 38, 0, 882, 881, 1, 0, 0, 0, 882, 883, 1, 0, 0, 0, 883, 886, 1, 0, 0, 0, 884, 885, 5, 18, 0, 0, 885, 887, 5, 53, 0, 0, 886, 884, 1, 0, 0, 0, 886, 887, 1, 0, 0, 0, 887, 888, 1, 0, 0, 0, 888, 889, 5, 134, 0, 0, 889, 923, 1, 0, 0, 0, 890, 891, 5, 7, 0, 0, 891, 892, 3, 162, 81, 0, 892, 893, 5, 84, 0, 0, 893, 894, 3, 164, 82, 0, 894, 895, 5, 133, 0, 0, 895, 896, 3, 162, 81, 0, 896, 897, 5, 53, 0, 0, 897, 898, 3, 146, 73, 0, 898, 899, 5, 134, 0, 0, 899, 923, 1, 0, 0, 0, 900, 901, 5, 51, 0, 0, 901, 902, 3, 162, 81, 0, 902, 903, 5, 84, 0, 0, 903, 904, 3, 164, 82, 0, 904, 905, 5, 133, 0, 0, 905, 908, 3, 162, 81, 0, 906, 907, 5, 53, 0, 0, 907, 909, 3, 146, 73, 0, 908, 906, 1, 0, 0, 0, 908, 909, 1, 0, 0, 0, 909, 910, 1, 0, 0, 0, 910, 911, 5, 134, 0, 0, 911, 923, 1, 0, 0, 0, 912, 913, 5, 22, 0, 0, 913, 914, 3, 162, 81, 0, 914, 915, 5, 84, 0, 0, 915, 916, 3, 164, 82, 0, 916, 917, 5, 133, 0, 0, 917, 918, 3, 162, 81, 0, 918, 919, 5, 136, 0, 0, 919, 920, 3, 162, 81, 0, 920, 921, 5, 134, 0, 0, 921, 923, 1, 0, 0, 0, 922, 840, 1, 0, 0, 0, 922, 849, 1, 0, 0, 0, 922, 858, 1, 0, 0, 0, 922, 872, 1, 0, 0, 0, 922, 890, 1, 0, 0, 0, 922, 900, 1, 0, 0, 0, 922, 912, 1, 0, 0, 0, 923, 91, 1, 0, 0, 0, 924, 925, 5, 139, 0, 0, 925, 930, 3, 94, 47, 0, 926, 927, 5, 135, 0, 0, 927, 929, 3, 94, 47, 0, 928, 926, 1, 0, 0, 0, 929, 932, 1, 0, 0, 0, 930, 928, 1, 0, 0, 0, 930, 931, 1, 0, 0, 0, 931, 933, 1, 0, 0, 0, 932, 930, 1, 0, 0, 0, 933, 934, 5, 140, 0, 0, 934, 93, 1, 0, 0, 0, 935, 936, 7, 3, 0, 0, 936, 95, 1, 0, 0, 0, 937, 938, 5, 60, 0, 0, 938, 939, 3, 98, 49, 0, 939, 97, 1, 0, 0, 0, 940, 943, 3, 100, 50, 0, 941, 943, 3, 104, 52, 0, 942, 940, 1, 0, 0, 0, 942, 941, 1, 0, 0, 0, 943, 99, 1, 0, 0, 0, 944, 945, 5, 61, 0, 0, 945, 946, 3, 162, 81, 0, 946, 947, 5, 84, 0, 0, 947, 948, 3, 164, 82, 0, 948, 949, 5, 71, 0, 0, 949, 950, 3, 162, 81, 0, 950, 951, 5, 133, 0, 0, 951, 952, 3, 146, 73, 0, 952, 953, 5, 72, 0, 0, 953, 956, 3, 102, 51, 0, 954, 955, 5, 73, 0, 0, 955, 957, 3, 154, 77, 0, 956, 954, 1, 0, 0, 0, 956, 957, 1, 0, 0, 0, 957, 958, 1, 0, 0, 0, 958, 959, 5, 134, 0, 0, 959, 101, 1, 0, 0, 0, 960, 967, 5, 106, 0, 0, 961, 962, 5, 107, 0, 0, 962, 963, 5, 141, 0, 0, 963, 964, 3, 146, 73, 0, 964, 965, 5, 142, 0, 0, 965, 967, 1, 0, 0, 0, 966, 960, 1, 0, 0, 0, 966, 961, 1, 0, 0, 0, 967, 103, 1, 0, 0, 0, 968, 969, 5, 62, 0, 0, 969, 970, 3, 162, 81, 0, 970, 971, 5, 84, 0, 0, 971, 972, 3, 164, 82, 0, 972, 973, 5, 137, 0, 0, 973, 974, 3, 106, 53, 0, 974, 975, 3, 106, 53, 0, 975, 976, 5, 138, 0, 0, 976, 105, 1, 0, 0, 0, 977, 978, 3, 50, 25, 0, 978, 979, 5, 63, 0, 0, 979, 980, 3, 162, 81, 0, 980, 981, 5, 84, 0, 0, 981, 982, 3, 164, 82, 0, 982, 984, 3, 152, 76, 0, 983, 985, 5, 112, 0, 0, 984, 983, 1, 0, 0, 0, 984, 985, 1, 0, 0, 0, 985, 988, 1, 0, 0, 0, 986, 987, 5, 79, 0, 0, 987, 989, 3, 164, 82, 0, 988, 986, 1, 0, 0, 0, 988, 989, 1, 0, 0, 0, 989, 991, 1, 0, 0, 0, 990, 992, 5, 81, 0, 0, 991, 990, 1, 0, 0, 0, 991, 992, 1, 0, 0, 0, 992, 995, 1, 0, 0, 0, 993, 994, 5, 82, 0, 0, 994, 996, 3, 164, 82, 0, 995, 993, 1, 0, 0, 0, 995, 996, 1, 0, 0, 0, 996, 998, 1, 0, 0, 0, 997, 999, 5, 83, 0, 0, 998, 997, 1, 0, 0, 0, 998, 999, 1, 0, 0, 0, 999, 1000, 1, 0, 0, 0, 1000, 1001, 5, 134, 0, 0, 1001, 107, 1, 0, 0, 0, 1002, 1004, 5, 54, 0, 0, 1003, 1005, 3, 22, 11, 0, 1004, 1003, 1, 0, 0, 0, 1004, 1005, 1, 0, 0, 0, 1005, 1006, 1, 0, 0, 0, 1006, 1008, 3, 162, 81, 0, 1007, 1009, 3, 110, 55, 0, 1008, 1007, 1, 0, 0, 0, 1008, 1009, 1, 0, 0, 0, 1009, 1010, 1, 0, 0, 0, 1010, 1011, 5, 55, 0, 0, 1011, 1013, 3, 162, 81, 0, 1012, 1014, 3, 28, 14, 0, 1013, 1012, 1, 0, 0, 0, 1013, 1014, 1, 0, 0, 0, 1014, 1017, 1, 0, 0, 0, 1015, 1016, 5, 84, 0, 0, 1016, 1018, 3, 164, 82, 0, 1017, 1015, 1, 0, 0, 0, 1017, 1018, 1, 0, 0, 0, 1018, 1021, 1, 0, 0, 0, 1019, 1020, 5, 78, 0, 0, 1020, 1022, 5, 147, 0, 0, 1021, 1019, 1, 0, 0, 0, 1021, 1022, 1, 0, 0, 0, 1022, 1023, 1, 0, 0, 0, 1023, 1027, 5, 137, 0, 0, 1024, 1026, 3, 112, 56, 0, 1025, 1024, 1, 0, 0, 0, 1026, 1029, 1, 0, 0, 0, 1027, 1025, 1, 0, 0, 0, 1027, 1028, 1, 0, 0, 0, 1028, 1030, 1, 0, 0, 0, 1029, 1027, 1, 0, 0, 0, 1030, 1031, 5, 138, 0, 0, 1031, 109, 1, 0, 0, 0, 1032, 1033, 3, 28, 14, 0, 1033, 111, 1, 0, 0, 0, 1034, 1035, 5, 59, 0, 0, 1035, 1042, 3, 98, 49, 0, 1036, 1042, 3, 126, 63, 0, 1037, 1042, 3, 122, 61, 0, 1038, 1042, 3, 116, 58, 0, 1039, 1042, 3, 124, 62, 0, 1040, 1042, 3, 114, 57, 0, 1041, 1034, 1, 0, 0, 0, 1041, 1036, 1, 0, 0, 0, 1041, 1037, 1, 0, 0, 0, 1041, 1038, 1, 0, 0, 0, 1041, 1039, 1, 0, 0, 0, 1041, 1040, 1, 0, 0, 0, 1042, 113, 1, 0, 0, 0, 1043, 1044, 5, 56, 0, 0, 1044, 1045, 3, 162, 81, 0, 1045, 1046, 5, 58, 0, 0, 1046, 1047, 3, 162, 81, 0, 1047, 1048, 5, 136, 0, 0, 1048, 1049, 3, 162, 81, 0, 1049, 1050, 5, 134, 0, 0, 1050, 115, 1, 0, 0, 0, 1051, 1052, 5, 8, 0, 0, 1052, 1056, 5, 137, 0, 0, 1053, 1055, 3, 118, 59, 0, 1054, 1053, 1, 0, 0, 0, 1055, 1058, 1, 0, 0, 0, 1056, 1054, 1, 0, 0, 0, 1056, 1057, 1, 0, 0, 0, 1057, 1059, 1, 0, 0, 0, 1058, 1056, 1, 0, 0, 0, 1059, 1060, 5, 138, 0, 0, 1060, 1061, 5, 134, 0, 0, 1061, 117, 1, 0, 0, 0, 1062, 1063, 3, 162, 81, 0, 1063, 1064, 5, 58, 0, 0, 1064, 1065, 5, 61, 0, 0, 1065, 1066, 3, 162, 81, 0, 1066, 1067, 5, 134, 0, 0, 1067, 1077, 1, 0, 0, 0, 1068, 1069, 3, 162, 81, 0, 1069, 1070, 5, 58, 0, 0, 1070, 1071, 5, 62, 0, 0, 1071, 1072, 3, 162, 81, 0, 1072, 1073, 5, 136, 0, 0, 1073, 1074, 3, 162, 81, 0, 1074, 1075, 5, 134, 0, 0, 1075, 1077, 1, 0, 0, 0, 1076, 1062, 1, 0, 0, 0, 1076, 1068, 1, 0, 0, 0, 1077, 119, 1, 0, 0, 0, 1078, 1079, 3, 26, 13, 0, 1079, 1080, 5, 18, 0, 0, 1080, 1085, 5, 53, 0, 0, 1081, 1082, 5, 136, 0, 0, 1082, 1084, 3, 162, 81, 0, 1083, 1081, 1, 0, 0, 0, 1084, 1087, 1, 0, 0, 0, 1085, 1083, 1, 0, 0, 0, 1085, 1086, 1, 0, 0, 0, 1086, 1088, 1, 0, 0, 0, 1087, 1085, 1, 0, 0, 0, 1088, 1089, 5, 134, 0, 0, 1089, 121, 1, 0, 0, 0, 1090, 1091, 5, 56, 0, 0, 1091, 1092, 3, 162, 81, 0, 1092, 1093, 5, 58, 0, 0, 1093, 1094, 5, 61, 0, 0, 1094, 1095, 3, 162, 81, 0, 1095, 1096, 5, 134, 0, 0, 1096, 123, 1, 0, 0, 0, 1097, 1098, 5, 68, 0, 0, 1098, 1099, 3, 162, 81, 0, 1099, 1100, 5, 69, 0, 0, 1100, 1101, 5, 70, 0, 0, 1101, 1102, 5, 65, 0, 0, 1102, 1103, 5, 51, 0, 0, 1103, 1104, 3, 162, 81, 0, 1104, 1105, 5, 67, 0, 0, 1105, 1106, 5, 62, 0, 0, 1106, 1107, 3, 162, 81, 0, 1107, 1108, 5, 136, 0, 0, 1108, 1109, 3, 162, 81, 0, 1109, 1110, 5, 134, 0, 0, 1110, 125, 1, 0, 0, 0, 1111, 1112, 5, 56, 0, 0, 1112, 1113, 3, 128, 64, 0, 1113, 1114, 5, 58, 0, 0, 1114, 1117, 3, 132, 66, 0, 1115, 1116, 5, 34, 0, 0, 1116, 1118, 3, 164, 82, 0, 1117, 1115, 1, 0, 0, 0, 1117, 1118, 1, 0, 0, 0, 1118, 1119, 1, 0, 0, 0, 1119, 1120, 5, 134, 0, 0, 1120, 127, 1, 0, 0, 0, 1121, 1122, 3, 162, 81, 0, 1122, 1123, 5, 136, 0, 0, 1123, 1124, 3, 130, 65, 0, 1124, 129, 1, 0, 0, 0, 1125, 1138, 3, 162, 81, 0, 1126, 1138, 5, 101, 0, 0, 1127, 1138, 5, 91, 0, 0, 1128, 1138, 5, 92, 0, 0, 1129, 1138, 5, 1, 0, 0, 1130, 1138, 5, 98, 0, 0, 1131, 1138, 5, 99, 0, 0, 1132, 1138, 5, 100, 0, 0, 1133, 1138, 5, 102, 0, 0, 1134, 1138, 5, 103, 0, 0, 1135, 1138, 5, 104, 0, 0, 1136, 1138, 5, 105, 0, 0, 1137, 1125, 1, 0, 0, 0, 1137, 1126, 1, 0, 0, 0, 1137, 1127, 1, 0, 0, 0, 1137, 1128, 1, 0, 0, 0, 1137, 1129, 1, 0, 0, 0, 1137, 1130, 1, 0, 0, 0, 1137, 1131, 1, 0, 0, 0, 1137, 1132, 1, 0, 0, 0, 1137, 1133, 1, 0, 0, 0, 1137, 1134, 1, 0, 0, 0, 1137, 1135, 1, 0, 0, 0, 1137, 1136, 1, 0, 0, 0, 1138, 131, 1, 0, 0, 0, 1139, 1140, 5, 80, 0, 0, 1140, 1141, 5, 136, 0, 0, 1141, 1176, 3, 162, 81, 0, 1142, 1143, 5, 61, 0, 0, 1143, 1144, 3, 162, 81, 0, 1144, 1145, 5, 136, 0, 0, 1145, 1146, 3, 136, 68, 0, 1146, 1176, 1, 0, 0, 0, 1147, 1148, 5, 62, 0, 0, 1148, 1149, 3, 162, 81, 0, 1149, 1150, 5, 136, 0, 0, 1150, 1151, 3, 162, 81, 0, 1151, 1152, 5, 136, 0, 0, 1152, 1153, 3, 138, 69, 0, 1153, 1176, 1, 0, 0, 0, 1154, 1155, 5, 44, 0, 0, 1155, 1157, 3, 162, 81, 0, 1156, 1158, 3, 28, 14, 0, 1157, 1156, 1, 0, 0, 0, 1157, 1158, 1, 0, 0, 0, 1158, 1159, 1, 0, 0, 0, 1159, 1160, 5, 136, 0, 0, 1160, 1161, 3, 128, 64, 0, 1161, 1176, 1, 0, 0, 0, 1162, 1163, 5, 46, 0, 0, 1163, 1164, 3, 162, 81, 0, 1164, 1165, 5, 136, 0, 0, 1165, 1167, 3, 162, 81, 0, 1166, 1168, 3, 28, 14, 0, 1167, 1166, 1, 0, 0, 0, 1167, 1168, 1, 0, 0, 0, 1168, 1170, 1, 0, 0, 0, 1169, 1171, 3, 140, 70, 0, 1170, 1169, 1, 0, 0, 0, 1170, 1171, 1, 0, 0, 0, 1171, 1173, 1, 0, 0, 0, 1172, 1174, 3, 134, 67, 0, 1173, 1172, 1, 0, 0, 0, 1173, 1174, 1, 0, 0, 0, 1174, 1176, 1, 0, 0, 0, 1175, 1139, 1, 0, 0, 0, 1175, 1142, 1, 0, 0, 0, 1175, 1147, 1, 0, 0, 0, 1175, 1154, 1, 0, 0, 0, 1175, 1162, 1, 0, 0, 0, 1176, 133, 1, 0, 0, 0, 1177, 1178, 5, 66, 0, 0, 1178, 1179, 3, 140, 70, 0, 1179, 135, 1, 0, 0, 0, 1180, 1181, 7, 4, 0, 0, 1181, 137, 1, 0, 0, 0, 1182, 1183, 7, 5, 0, 0, 1183, 139, 1, 0, 0, 0, 1184, 1185, 5, 64, 0, 0, 1185, 1189, 5, 137, 0, 0, 1186, 1188, 3, 142, 71, 0, 1187, 1186, 1, 0, 0, 0, 1188, 1191, 1, 0, 0, 0, 1189, 1187, 1, 0, 0, 0, 1189, 1190, 1, 0, 0, 0, 1190, 1192, 1, 0, 0, 0, 1191, 1189, 1, 0, 0, 0, 1192, 1193, 5, 138, 0, 0, 1193, 141, 1, 0, 0, 0, 1194, 1195, 3, 162, 81, 0, 1195, 1196, 5, 58, 0, 0, 1196, 1197, 5, 9, 0, 0, 1197, 1198, 5, 23, 0, 0, 1198, 1199, 5, 139, 0, 0, 1199, 1200, 3, 86, 43, 0, 1200, 1201, 5, 140, 0, 0, 1201, 1202, 5, 134, 0, 0, 1202, 1293, 1, 0, 0, 0, 1203, 1204, 3, 162, 81, 0, 1204, 1205, 5, 58, 0, 0, 1205, 1206, 5, 61, 0, 0, 1206, 1213, 3, 162, 81, 0, 1207, 1208, 5, 67, 0, 0, 1208, 1209, 5, 62, 0, 0, 1209, 1210, 3, 162, 81, 0, 1210, 1211, 5, 136, 0, 0, 1211, 1212, 3, 162, 81, 0, 1212, 1214, 1, 0, 0, 0, 1213, 1207, 1, 0, 0, 0, 1213, 1214, 1, 0, 0, 0, 1214, 1215, 1, 0, 0, 0, 1215, 1216, 5, 134, 0, 0, 1216, 1293, 1, 0, 0, 0, 1217, 1218, 3, 162, 81, 0, 1218, 1219, 5, 58, 0, 0, 1219, 1220, 5, 62, 0, 0, 1220, 1221, 3, 162, 81, 0, 1221, 1222, 5, 136, 0, 0, 1222, 1229, 3, 162, 81, 0, 1223, 1224, 5, 67, 0, 0, 1224, 1225, 5, 62, 0, 0, 1225, 1226, 3, 162, 81, 0, 1226, 1227, 5, 136, 0, 0, 1227, 1228, 3, 162, 81, 0, 1228, 1230, 1, 0, 0, 0, 1229, 1223, 1, 0, 0, 0, 1229, 1230, 1, 0, 0, 0, 1230, 1231, 1, 0, 0, 0, 1231, 1232, 5, 134, 0, 0, 1232, 1293, 1, 0, 0, 0, 1233, 1234, 3, 162, 81, 0, 1234, 1235, 5, 58, 0, 0, 1235, 1236, 5, 44, 0, 0, 1236, 1238, 3, 162, 81, 0, 1237, 1239, 3, 28, 14, 0, 1238, 1237, 1, 0, 0, 0, 1238, 1239, 1, 0, 0, 0, 1239, 1248, 1, 0, 0, 0, 1240, 1241, 5, 67, 0, 0, 1241, 1242, 5, 62, 0, 0, 1242, 1243, 3, 162, 81, 0, 1243, 1244, 5, 136, 0, 0, 1244, 1245, 3, 162, 81, 0, 1245, 1249, 1, 0, 0, 0, 1246, 1247, 5, 18, 0, 0, 1247, 1249, 5, 53, 0, 0, 1248, 1240, 1, 0, 0, 0, 1248, 1246, 1, 0, 0, 0, 1248, 1249, 1, 0, 0, 0, 1249, 1250, 1, 0, 0, 0, 1250, 1251, 5, 134, 0, 0, 1251, 1293, 1, 0, 0, 0, 1252, 1253, 3, 162, 81, 0, 1253, 1254, 5, 58, 0, 0, 1254, 1255, 5, 7, 0, 0, 1255, 1256, 3, 162, 81, 0, 1256, 1257, 5, 64, 0, 0, 1257, 1261, 5, 137, 0, 0, 1258, 1260, 3, 120, 60, 0, 1259, 1258, 1, 0, 0, 0, 1260, 1263, 1, 0, 0, 0, 1261, 1259, 1, 0, 0, 0, 1261, 1262, 1, 0, 0, 0, 1262, 1264, 1, 0, 0, 0, 1263, 1261, 1, 0, 0, 0, 1264, 1265, 5, 138, 0, 0, 1265, 1266, 5, 134, 0, 0, 1266, 1293, 1, 0, 0, 0, 1267, 1268, 3, 162, 81, 0, 1268, 1269, 5, 58, 0, 0, 1269, 1270, 5, 51, 0, 0, 1270, 1271, 3, 162, 81, 0, 1271, 1272, 5, 134, 0, 0, 1272, 1293, 1, 0, 0, 0, 1273, 1274, 3, 162, 81, 0, 1274, 1276, 5, 58, 0, 0, 1275, 1277, 5, 9, 0, 0, 1276, 1275, 1, 0, 0, 0, 1276, 1277, 1, 0, 0, 0, 1277, 1278, 1, 0, 0, 0, 1278, 1279, 5, 22, 0, 0, 1279, 1280, 3, 162, 81, 0, 1280, 1281, 5, 136, 0, 0, 1281, 1288, 3, 162, 81, 0, 1282, 1283, 5, 67, 0, 0, 1283, 1284, 5, 62, 0, 0, 1284, 1285, 3, 162, 81, 0, 1285, 1286, 5, 136, 0, 0, 1286, 1287, 3, 162, 81, 0, 1287, 1289, 1, 0, 0, 0, 1288, 1282, 1, 0, 0, 0, 1288, 1289, 1, 0, 0, 0, 1289, 1290, 1, 0, 0, 0, 1290, 1291, 5, 134, 0, 0, 1291, 1293, 1, 0, 0, 0, 1292, 1194, 1, 0, 0, 0, 1292, 1203, 1, 0, 0, 0, 1292, 1217, 1, 0, 0, 0, 1292, 1233, 1, 0, 0, 0, 1292, 1252, 1, 0, 0, 0, 1292, 1267, 1, 0, 0, 0, 1292, 1273, 1, 0, 0, 0, 1293, 143, 1, 0, 0, 0, 1294, 1295, 5, 51, 0, 0, 1295, 1296, 3, 162, 81, 0, 1296, 1297, 5, 58, 0, 0, 1297, 1298, 3, 162, 81, 0, 1298, 1299, 5, 136, 0, 0, 1299, 1301, 3, 162, 81, 0, 1300, 1302, 3, 140, 70, 0, 1301, 1300, 1, 0, 0, 0, 1301, 1302, 1, 0, 0, 0, 1302, 1303, 1, 0, 0, 0, 1303, 1304, 5, 134, 0, 0, 1304, 145, 1, 0, 0, 0, 1305, 1352, 3, 150, 75, 0, 1306, 1352, 5, 113, 0, 0, 1307, 1352, 5, 114, 0, 0, 1308, 1309, 5, 115, 0, 0, 1309, 1352, 3, 164, 82, 0, 1310, 1311, 5, 116, 0, 0, 1311, 1312, 5, 143, 0, 0, 1312, 1313, 3, 162, 81, 0, 1313, 1314, 5, 144, 0, 0, 1314, 1352, 1, 0, 0, 0, 1315, 1316, 5, 117, 0, 0, 1316, 1317, 5, 143, 0, 0, 1317, 1319, 3, 162, 81, 0, 1318, 1320, 3, 28, 14, 0, 1319, 1318, 1, 0, 0, 0, 1319, 1320, 1, 0, 0, 0, 1320, 1321, 1, 0, 0, 0, 1321, 1322, 5, 144, 0, 0, 1322, 1352, 1, 0, 0, 0, 1323, 1324, 5, 39, 0, 0, 1324, 1325, 5, 143, 0, 0, 1325, 1326, 3, 162, 81, 0, 1326, 1327, 5, 144, 0, 0, 1327, 1352, 1, 0, 0, 0, 1328, 1329, 5, 118, 0, 0, 1329, 1330, 5, 143, 0, 0, 1330, 1331, 3, 146, 73, 0, 1331, 1332, 5, 144, 0, 0, 1332, 1352, 1, 0, 0, 0, 1333, 1334, 5, 119, 0, 0, 1334, 1335, 5, 143, 0, 0, 1335, 1336, 3, 146, 73, 0, 1336, 1337, 5, 144, 0, 0, 1337, 1352, 1, 0, 0, 0, 1338, 1339, 5, 120, 0, 0, 1339, 1343, 5, 137, 0, 0, 1340, 1342, 3, 148, 74, 0, 1341, 1340, 1, 0, 0, 0, 1342, 1345, 1, 0, 0, 0, 1343, 1341, 1, 0, 0, 0, 1343, 1344, 1, 0, 0, 0, 1344, 1346, 1, 0, 0, 0, 1345, 1343, 1, 0, 0, 0, 1346, 1352, 5, 138, 0, 0, 1347, 1349, 3, 162, 81, 0, 1348, 1350, 3, 28, 14, 0, 1349, 1348, 1, 0, 0, 0, 1349, 1350, 1, 0, 0, 0, 1350, 1352, 1, 0, 0, 0, 1351, 1305, 1, 0, 0, 0, 1351, 1306, 1, 0, 0, 0, 1351, 1307, 1, 0, 0, 0, 1351, 1308, 1, 0, 0, 0, 1351, 1310, 1, 0, 0, 0, 1351, 1315, 1, 0, 0, 0, 1351, 1323, 1, 0, 0, 0, 1351, 1328, 1, 0, 0, 0, 1351, 1333, 1, 0, 0, 0, 1351, 1338, 1, 0, 0, 0, 1351, 1347, 1, 0, 0, 0, 1352, 147, 1, 0, 0, 0, 1353, 1354, 3, 162, 81, 0, 1354, 1355, 5, 133, 0, 0, 1355, 1356, 3, 146, 73, 0, 1356, 1357, 5, 134, 0, 0, 1357, 149, 1, 0, 0, 0, 1358, 1359, 7, 6, 0, 0, 1359, 151, 1, 0, 0, 0, 1360, 1361, 7, 7, 0, 0, 1361, 153, 1, 0, 0, 0, 1362, 1371, 3, 164, 82, 0, 1363, 1371, 5, 147, 0, 0, 1364, 1371, 5, 148, 0, 0, 1365, 1371, 5, 129, 0, 0, 1366, 1371, 5, 130, 0, 0, 1367, 1371, 5, 131, 0, 0, 1368, 1371, 3, 156, 78, 0, 1369, 1371, 3, 160, 80, 0, 1370, 1362, 1, 0, 0, 0, 1370, 1363, 1, 0, 0, 0, 1370, 1364, 1, 0, 0, 0, 1370, 1365, 1, 0, 0, 0, 1370, 1366, 1, 0, 0, 0, 1370, 1367, 1, 0, 0, 0, 1370, 1368, 1, 0, 0, 0, 1370, 1369, 1, 0, 0, 0, 1371, 155, 1, 0, 0, 0, 1372, 1381, 5, 137, 0, 0, 1373, 1378, 3, 158, 79, 0, 1374, 1375, 5, 135, 0, 0, 1375, 1377, 3, 158, 79, 0, 1376, 1374, 1, 0, 0, 0, 1377, 1380, 1, 0, 0, 0, 1378, 1376, 1, 0, 0, 0, 1378, 1379, 1, 0, 0, 0, 1379, 1382, 1, 0, 0, 0, 1380, 1378, 1, 0, 0, 0, 1381, 1373, 1, 0, 0, 0, 1381, 1382, 1, 0, 0, 0, 1382, 1383, 1, 0, 0, 0, 1383, 1384, 5, 138, 0, 0, 1384, 157, 1, 0, 0, 0, 1385, 1386, 3, 164, 82, 0, 1386, 1387, 5, 133, 0, 0, 1387, 1388, 3, 154, 77, 0, 1388, 159, 1, 0, 0, 0, 1389, 1398, 5, 139, 0, 0, 1390, 1395, 3, 154, 77, 0, 1391, 1392, 5, 135, 0, 0, 1392, 1394, 3, 154, 77, 0, 1393, 1391, 1, 0, 0, 0, 1394, 1397, 1, 0, 0, 0, 1395, 1393, 1, 0, 0, 0, 1395, 1396, 1, 0, 0, 0, 1396, 1399, 1, 0, 0, 0, 1397, 1395, 1, 0, 0, 0, 1398, 1390, 1, 0, 0, 0, 1398, 1399, 1, 0, 0, 0, 1399, 1400, 1, 0, 0, 0, 1400, 1401, 5, 140, 0, 0, 1401, 161, 1, 0, 0, 0, 1402, 1403, 7, 8, 0, 0, 1403, 163, 1, 0, 0, 0, 1404, 1405, 5, 150, 0, 0, 1405, 165, 1, 0, 0, 0, 126, 178, 185, 206, 219, 231, 251, 259, 266, 272, 284, 287, 293, 304, 313, 323, 326, 328, 332, 340, 352, 357, 367, 377, 382, 397, 403, 415, 424, 432, 440, 453, 456, 466, 470, 476, 483, 489, 497, 505, 518, 525, 529, 534, 545, 551, 562, 588, 592, 598, 609, 618, 624, 629, 631, 662, 666, 672, 699, 709, 720, 723, 728, 731, 738, 747, 750, 753, 770, 779, 793, 814, 817, 820, 827, 835, 867, 879, 882, 886, 908, 922, 930, 942, 956, 966, 984, 988, 991, 995, 998, 1004, 1008, 1013, 1017, 1021, 1027, 1041, 1056, 1076, 1085, 1117, 1137, 1157, 1167, 1170, 1173, 1175, 1189, 1213, 1229, 1238, 1248, 1261, 1276, 1288, 1292, 1301, 1319, 1343, 1349, 1351, 1370, 1378, 1381, 1395, 1398] \ No newline at end of file +[4, 1, 155, 1441, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 183, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 188, 8, 1, 10, 1, 12, 1, 191, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 209, 8, 3, 10, 3, 12, 3, 212, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 224, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 236, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 256, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 264, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 269, 8, 10, 10, 10, 12, 10, 272, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 277, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 287, 8, 10, 10, 10, 12, 10, 290, 9, 10, 3, 10, 292, 8, 10, 1, 10, 1, 10, 5, 10, 296, 8, 10, 10, 10, 12, 10, 299, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 307, 8, 11, 10, 11, 12, 11, 310, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 318, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 326, 8, 12, 10, 12, 12, 12, 329, 9, 12, 3, 12, 331, 8, 12, 3, 12, 333, 8, 12, 1, 13, 1, 13, 3, 13, 337, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 343, 8, 14, 10, 14, 12, 14, 346, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 357, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 362, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 372, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 382, 8, 18, 1, 18, 1, 18, 1, 19, 3, 19, 387, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 402, 8, 19, 1, 19, 1, 19, 1, 19, 1, 20, 3, 20, 408, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 418, 8, 20, 10, 20, 12, 20, 421, 9, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 429, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 437, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 445, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 458, 8, 21, 1, 22, 3, 22, 461, 8, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 471, 8, 22, 1, 22, 1, 22, 3, 22, 475, 8, 22, 1, 22, 1, 22, 5, 22, 479, 8, 22, 10, 22, 12, 22, 482, 9, 22, 1, 22, 1, 22, 1, 23, 1, 23, 3, 23, 488, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 494, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 502, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 510, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 523, 8, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 530, 8, 25, 1, 25, 1, 25, 3, 25, 534, 8, 25, 1, 26, 5, 26, 537, 8, 26, 10, 26, 12, 26, 540, 9, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 550, 8, 26, 1, 26, 1, 26, 5, 26, 554, 8, 26, 10, 26, 12, 26, 557, 9, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 567, 8, 27, 1, 28, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 3, 30, 593, 8, 30, 1, 30, 1, 30, 3, 30, 597, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 603, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 5, 30, 612, 8, 30, 10, 30, 12, 30, 615, 9, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 623, 8, 30, 1, 30, 1, 30, 5, 30, 627, 8, 30, 10, 30, 12, 30, 630, 9, 30, 1, 30, 1, 30, 3, 30, 634, 8, 30, 3, 30, 636, 8, 30, 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, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 665, 8, 32, 10, 32, 12, 32, 668, 9, 32, 1, 32, 3, 32, 671, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 677, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 704, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 3, 34, 714, 8, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 725, 8, 34, 1, 34, 3, 34, 728, 8, 34, 1, 34, 1, 34, 1, 34, 3, 34, 733, 8, 34, 1, 34, 3, 34, 736, 8, 34, 1, 34, 3, 34, 739, 8, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 3, 35, 746, 8, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 755, 8, 35, 1, 35, 3, 35, 758, 8, 35, 1, 35, 3, 35, 761, 8, 35, 1, 35, 3, 35, 764, 8, 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, 38, 1, 38, 3, 38, 787, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 794, 8, 39, 10, 39, 12, 39, 797, 9, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 810, 8, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 5, 43, 829, 8, 43, 10, 43, 12, 43, 832, 9, 43, 3, 43, 834, 8, 43, 1, 43, 3, 43, 837, 8, 43, 1, 44, 1, 44, 1, 44, 5, 44, 842, 8, 44, 10, 44, 12, 44, 845, 9, 44, 1, 45, 1, 45, 1, 45, 5, 45, 850, 8, 45, 10, 45, 12, 45, 853, 9, 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, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 884, 8, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 896, 8, 46, 1, 46, 3, 46, 899, 8, 46, 1, 46, 1, 46, 3, 46, 903, 8, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 925, 8, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 939, 8, 46, 1, 47, 1, 47, 1, 47, 1, 47, 5, 47, 945, 8, 47, 10, 47, 12, 47, 948, 9, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 3, 50, 959, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 973, 8, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 983, 8, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 1001, 8, 54, 1, 54, 1, 54, 3, 54, 1005, 8, 54, 1, 54, 3, 54, 1008, 8, 54, 1, 54, 1, 54, 3, 54, 1012, 8, 54, 1, 54, 3, 54, 1015, 8, 54, 1, 54, 1, 54, 1, 55, 1, 55, 3, 55, 1021, 8, 55, 1, 55, 1, 55, 3, 55, 1025, 8, 55, 1, 55, 1, 55, 1, 55, 3, 55, 1030, 8, 55, 1, 55, 1, 55, 3, 55, 1034, 8, 55, 1, 55, 1, 55, 3, 55, 1038, 8, 55, 1, 55, 1, 55, 5, 55, 1042, 8, 55, 10, 55, 12, 55, 1045, 9, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 1058, 8, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 5, 59, 1071, 8, 59, 10, 59, 12, 59, 1074, 9, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1093, 8, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 5, 61, 1100, 8, 61, 10, 61, 12, 61, 1103, 9, 61, 1, 61, 1, 61, 1, 62, 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, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1134, 8, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1154, 8, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1174, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1184, 8, 67, 1, 67, 3, 67, 1187, 8, 67, 1, 67, 3, 67, 1190, 8, 67, 3, 67, 1192, 8, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 5, 71, 1204, 8, 71, 10, 71, 12, 71, 1207, 9, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1230, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1246, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1255, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1265, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 5, 72, 1276, 8, 72, 10, 72, 12, 72, 1279, 9, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1293, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1305, 8, 72, 1, 72, 1, 72, 3, 72, 1309, 8, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1318, 8, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 3, 74, 1336, 8, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 5, 74, 1358, 8, 74, 10, 74, 12, 74, 1361, 9, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 4, 74, 1369, 8, 74, 11, 74, 12, 74, 1370, 1, 74, 1, 74, 1, 74, 1, 74, 3, 74, 1377, 8, 74, 3, 74, 1379, 8, 74, 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, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 3, 79, 1405, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 5, 80, 1411, 8, 80, 10, 80, 12, 80, 1414, 9, 80, 3, 80, 1416, 8, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 5, 82, 1428, 8, 82, 10, 82, 12, 82, 1431, 9, 82, 3, 82, 1433, 8, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 0, 0, 85, 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, 0, 9, 2, 0, 17, 17, 35, 35, 1, 0, 13, 14, 1, 0, 103, 107, 3, 0, 1, 1, 98, 102, 104, 105, 3, 0, 1, 1, 98, 99, 104, 105, 2, 0, 100, 102, 104, 105, 1, 0, 123, 130, 1, 0, 110, 113, 10, 0, 1, 1, 4, 7, 10, 10, 12, 35, 42, 42, 47, 47, 76, 76, 96, 97, 108, 108, 151, 151, 1560, 0, 182, 1, 0, 0, 0, 2, 184, 1, 0, 0, 0, 4, 194, 1, 0, 0, 0, 6, 198, 1, 0, 0, 0, 8, 223, 1, 0, 0, 0, 10, 235, 1, 0, 0, 0, 12, 237, 1, 0, 0, 0, 14, 244, 1, 0, 0, 0, 16, 255, 1, 0, 0, 0, 18, 257, 1, 0, 0, 0, 20, 270, 1, 0, 0, 0, 22, 302, 1, 0, 0, 0, 24, 332, 1, 0, 0, 0, 26, 334, 1, 0, 0, 0, 28, 338, 1, 0, 0, 0, 30, 356, 1, 0, 0, 0, 32, 358, 1, 0, 0, 0, 34, 371, 1, 0, 0, 0, 36, 373, 1, 0, 0, 0, 38, 386, 1, 0, 0, 0, 40, 407, 1, 0, 0, 0, 42, 457, 1, 0, 0, 0, 44, 460, 1, 0, 0, 0, 46, 485, 1, 0, 0, 0, 48, 522, 1, 0, 0, 0, 50, 533, 1, 0, 0, 0, 52, 538, 1, 0, 0, 0, 54, 566, 1, 0, 0, 0, 56, 568, 1, 0, 0, 0, 58, 578, 1, 0, 0, 0, 60, 590, 1, 0, 0, 0, 62, 637, 1, 0, 0, 0, 64, 703, 1, 0, 0, 0, 66, 705, 1, 0, 0, 0, 68, 710, 1, 0, 0, 0, 70, 742, 1, 0, 0, 0, 72, 767, 1, 0, 0, 0, 74, 771, 1, 0, 0, 0, 76, 786, 1, 0, 0, 0, 78, 788, 1, 0, 0, 0, 80, 800, 1, 0, 0, 0, 82, 813, 1, 0, 0, 0, 84, 816, 1, 0, 0, 0, 86, 836, 1, 0, 0, 0, 88, 838, 1, 0, 0, 0, 90, 846, 1, 0, 0, 0, 92, 938, 1, 0, 0, 0, 94, 940, 1, 0, 0, 0, 96, 951, 1, 0, 0, 0, 98, 953, 1, 0, 0, 0, 100, 958, 1, 0, 0, 0, 102, 960, 1, 0, 0, 0, 104, 982, 1, 0, 0, 0, 106, 984, 1, 0, 0, 0, 108, 993, 1, 0, 0, 0, 110, 1018, 1, 0, 0, 0, 112, 1048, 1, 0, 0, 0, 114, 1057, 1, 0, 0, 0, 116, 1059, 1, 0, 0, 0, 118, 1067, 1, 0, 0, 0, 120, 1092, 1, 0, 0, 0, 122, 1094, 1, 0, 0, 0, 124, 1106, 1, 0, 0, 0, 126, 1113, 1, 0, 0, 0, 128, 1127, 1, 0, 0, 0, 130, 1137, 1, 0, 0, 0, 132, 1153, 1, 0, 0, 0, 134, 1191, 1, 0, 0, 0, 136, 1193, 1, 0, 0, 0, 138, 1196, 1, 0, 0, 0, 140, 1198, 1, 0, 0, 0, 142, 1200, 1, 0, 0, 0, 144, 1308, 1, 0, 0, 0, 146, 1310, 1, 0, 0, 0, 148, 1378, 1, 0, 0, 0, 150, 1380, 1, 0, 0, 0, 152, 1385, 1, 0, 0, 0, 154, 1392, 1, 0, 0, 0, 156, 1394, 1, 0, 0, 0, 158, 1404, 1, 0, 0, 0, 160, 1406, 1, 0, 0, 0, 162, 1419, 1, 0, 0, 0, 164, 1423, 1, 0, 0, 0, 166, 1436, 1, 0, 0, 0, 168, 1438, 1, 0, 0, 0, 170, 171, 3, 6, 3, 0, 171, 172, 5, 0, 0, 1, 172, 183, 1, 0, 0, 0, 173, 174, 3, 20, 10, 0, 174, 175, 5, 0, 0, 1, 175, 183, 1, 0, 0, 0, 176, 177, 3, 52, 26, 0, 177, 178, 5, 0, 0, 1, 178, 183, 1, 0, 0, 0, 179, 180, 3, 2, 1, 0, 180, 181, 5, 0, 0, 1, 181, 183, 1, 0, 0, 0, 182, 170, 1, 0, 0, 0, 182, 173, 1, 0, 0, 0, 182, 176, 1, 0, 0, 0, 182, 179, 1, 0, 0, 0, 183, 1, 1, 0, 0, 0, 184, 185, 5, 42, 0, 0, 185, 189, 5, 139, 0, 0, 186, 188, 3, 8, 4, 0, 187, 186, 1, 0, 0, 0, 188, 191, 1, 0, 0, 0, 189, 187, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, 192, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 192, 193, 5, 140, 0, 0, 193, 3, 1, 0, 0, 0, 194, 195, 5, 43, 0, 0, 195, 196, 3, 168, 84, 0, 196, 197, 5, 136, 0, 0, 197, 5, 1, 0, 0, 0, 198, 199, 5, 11, 0, 0, 199, 200, 3, 166, 83, 0, 200, 201, 5, 86, 0, 0, 201, 202, 3, 168, 84, 0, 202, 203, 5, 79, 0, 0, 203, 204, 3, 168, 84, 0, 204, 205, 5, 78, 0, 0, 205, 206, 3, 168, 84, 0, 206, 210, 5, 139, 0, 0, 207, 209, 3, 8, 4, 0, 208, 207, 1, 0, 0, 0, 209, 212, 1, 0, 0, 0, 210, 208, 1, 0, 0, 0, 210, 211, 1, 0, 0, 0, 211, 213, 1, 0, 0, 0, 212, 210, 1, 0, 0, 0, 213, 214, 5, 140, 0, 0, 214, 7, 1, 0, 0, 0, 215, 224, 3, 4, 2, 0, 216, 224, 3, 18, 9, 0, 217, 224, 3, 10, 5, 0, 218, 224, 3, 98, 49, 0, 219, 224, 3, 110, 55, 0, 220, 224, 3, 146, 73, 0, 221, 224, 3, 58, 29, 0, 222, 224, 3, 32, 16, 0, 223, 215, 1, 0, 0, 0, 223, 216, 1, 0, 0, 0, 223, 217, 1, 0, 0, 0, 223, 218, 1, 0, 0, 0, 223, 219, 1, 0, 0, 0, 223, 220, 1, 0, 0, 0, 223, 221, 1, 0, 0, 0, 223, 222, 1, 0, 0, 0, 224, 9, 1, 0, 0, 0, 225, 226, 5, 43, 0, 0, 226, 227, 5, 46, 0, 0, 227, 228, 3, 166, 83, 0, 228, 229, 5, 136, 0, 0, 229, 236, 1, 0, 0, 0, 230, 231, 5, 43, 0, 0, 231, 232, 5, 48, 0, 0, 232, 233, 3, 166, 83, 0, 233, 234, 5, 136, 0, 0, 234, 236, 1, 0, 0, 0, 235, 225, 1, 0, 0, 0, 235, 230, 1, 0, 0, 0, 236, 11, 1, 0, 0, 0, 237, 238, 5, 44, 0, 0, 238, 239, 5, 45, 0, 0, 239, 240, 3, 166, 83, 0, 240, 241, 5, 86, 0, 0, 241, 242, 3, 168, 84, 0, 242, 243, 5, 136, 0, 0, 243, 13, 1, 0, 0, 0, 244, 245, 5, 44, 0, 0, 245, 246, 5, 46, 0, 0, 246, 247, 3, 166, 83, 0, 247, 248, 5, 79, 0, 0, 248, 249, 3, 168, 84, 0, 249, 250, 5, 136, 0, 0, 250, 15, 1, 0, 0, 0, 251, 256, 3, 10, 5, 0, 252, 256, 3, 12, 6, 0, 253, 256, 3, 14, 7, 0, 254, 256, 3, 32, 16, 0, 255, 251, 1, 0, 0, 0, 255, 252, 1, 0, 0, 0, 255, 253, 1, 0, 0, 0, 255, 254, 1, 0, 0, 0, 256, 17, 1, 0, 0, 0, 257, 258, 5, 45, 0, 0, 258, 259, 3, 166, 83, 0, 259, 260, 5, 86, 0, 0, 260, 263, 3, 168, 84, 0, 261, 262, 5, 87, 0, 0, 262, 264, 3, 168, 84, 0, 263, 261, 1, 0, 0, 0, 263, 264, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 266, 5, 136, 0, 0, 266, 19, 1, 0, 0, 0, 267, 269, 3, 16, 8, 0, 268, 267, 1, 0, 0, 0, 269, 272, 1, 0, 0, 0, 270, 268, 1, 0, 0, 0, 270, 271, 1, 0, 0, 0, 271, 273, 1, 0, 0, 0, 272, 270, 1, 0, 0, 0, 273, 274, 5, 46, 0, 0, 274, 276, 3, 166, 83, 0, 275, 277, 3, 22, 11, 0, 276, 275, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 279, 5, 86, 0, 0, 279, 280, 3, 168, 84, 0, 280, 281, 5, 79, 0, 0, 281, 291, 3, 168, 84, 0, 282, 283, 5, 91, 0, 0, 283, 288, 3, 26, 13, 0, 284, 285, 5, 137, 0, 0, 285, 287, 3, 26, 13, 0, 286, 284, 1, 0, 0, 0, 287, 290, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 292, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 291, 282, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 293, 1, 0, 0, 0, 293, 297, 5, 139, 0, 0, 294, 296, 3, 34, 17, 0, 295, 294, 1, 0, 0, 0, 296, 299, 1, 0, 0, 0, 297, 295, 1, 0, 0, 0, 297, 298, 1, 0, 0, 0, 298, 300, 1, 0, 0, 0, 299, 297, 1, 0, 0, 0, 300, 301, 5, 140, 0, 0, 301, 21, 1, 0, 0, 0, 302, 303, 5, 145, 0, 0, 303, 308, 3, 24, 12, 0, 304, 305, 5, 137, 0, 0, 305, 307, 3, 24, 12, 0, 306, 304, 1, 0, 0, 0, 307, 310, 1, 0, 0, 0, 308, 306, 1, 0, 0, 0, 308, 309, 1, 0, 0, 0, 309, 311, 1, 0, 0, 0, 310, 308, 1, 0, 0, 0, 311, 312, 5, 146, 0, 0, 312, 23, 1, 0, 0, 0, 313, 314, 5, 49, 0, 0, 314, 317, 3, 166, 83, 0, 315, 316, 5, 135, 0, 0, 316, 318, 5, 39, 0, 0, 317, 315, 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 333, 1, 0, 0, 0, 319, 320, 5, 38, 0, 0, 320, 330, 3, 166, 83, 0, 321, 322, 5, 40, 0, 0, 322, 327, 3, 26, 13, 0, 323, 324, 5, 147, 0, 0, 324, 326, 3, 26, 13, 0, 325, 323, 1, 0, 0, 0, 326, 329, 1, 0, 0, 0, 327, 325, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 331, 1, 0, 0, 0, 329, 327, 1, 0, 0, 0, 330, 321, 1, 0, 0, 0, 330, 331, 1, 0, 0, 0, 331, 333, 1, 0, 0, 0, 332, 313, 1, 0, 0, 0, 332, 319, 1, 0, 0, 0, 333, 25, 1, 0, 0, 0, 334, 336, 3, 166, 83, 0, 335, 337, 3, 28, 14, 0, 336, 335, 1, 0, 0, 0, 336, 337, 1, 0, 0, 0, 337, 27, 1, 0, 0, 0, 338, 339, 5, 145, 0, 0, 339, 344, 3, 30, 15, 0, 340, 341, 5, 137, 0, 0, 341, 343, 3, 30, 15, 0, 342, 340, 1, 0, 0, 0, 343, 346, 1, 0, 0, 0, 344, 342, 1, 0, 0, 0, 344, 345, 1, 0, 0, 0, 345, 347, 1, 0, 0, 0, 346, 344, 1, 0, 0, 0, 347, 348, 5, 146, 0, 0, 348, 29, 1, 0, 0, 0, 349, 350, 5, 45, 0, 0, 350, 357, 3, 166, 83, 0, 351, 352, 5, 46, 0, 0, 352, 357, 3, 26, 13, 0, 353, 354, 5, 38, 0, 0, 354, 357, 3, 166, 83, 0, 355, 357, 3, 148, 74, 0, 356, 349, 1, 0, 0, 0, 356, 351, 1, 0, 0, 0, 356, 353, 1, 0, 0, 0, 356, 355, 1, 0, 0, 0, 357, 31, 1, 0, 0, 0, 358, 359, 5, 37, 0, 0, 359, 361, 3, 166, 83, 0, 360, 362, 3, 22, 11, 0, 361, 360, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 363, 1, 0, 0, 0, 363, 364, 5, 148, 0, 0, 364, 365, 3, 148, 74, 0, 365, 366, 5, 136, 0, 0, 366, 33, 1, 0, 0, 0, 367, 372, 3, 40, 20, 0, 368, 372, 3, 44, 22, 0, 369, 372, 3, 38, 19, 0, 370, 372, 3, 36, 18, 0, 371, 367, 1, 0, 0, 0, 371, 368, 1, 0, 0, 0, 371, 369, 1, 0, 0, 0, 371, 370, 1, 0, 0, 0, 372, 35, 1, 0, 0, 0, 373, 374, 5, 2, 0, 0, 374, 375, 3, 166, 83, 0, 375, 376, 5, 86, 0, 0, 376, 377, 3, 168, 84, 0, 377, 378, 5, 3, 0, 0, 378, 381, 3, 168, 84, 0, 379, 380, 5, 5, 0, 0, 380, 382, 3, 50, 25, 0, 381, 379, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 383, 1, 0, 0, 0, 383, 384, 5, 136, 0, 0, 384, 37, 1, 0, 0, 0, 385, 387, 5, 59, 0, 0, 386, 385, 1, 0, 0, 0, 386, 387, 1, 0, 0, 0, 387, 388, 1, 0, 0, 0, 388, 389, 5, 51, 0, 0, 389, 390, 3, 166, 83, 0, 390, 391, 5, 86, 0, 0, 391, 392, 3, 168, 84, 0, 392, 393, 5, 135, 0, 0, 393, 394, 3, 148, 74, 0, 394, 395, 5, 134, 0, 0, 395, 396, 3, 148, 74, 0, 396, 397, 5, 139, 0, 0, 397, 398, 5, 103, 0, 0, 398, 399, 5, 86, 0, 0, 399, 401, 3, 168, 84, 0, 400, 402, 3, 76, 38, 0, 401, 400, 1, 0, 0, 0, 401, 402, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 404, 5, 136, 0, 0, 404, 405, 5, 140, 0, 0, 405, 39, 1, 0, 0, 0, 406, 408, 3, 46, 23, 0, 407, 406, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 409, 1, 0, 0, 0, 409, 410, 5, 49, 0, 0, 410, 411, 3, 166, 83, 0, 411, 412, 5, 86, 0, 0, 412, 413, 3, 168, 84, 0, 413, 414, 5, 135, 0, 0, 414, 415, 3, 148, 74, 0, 415, 419, 5, 139, 0, 0, 416, 418, 3, 42, 21, 0, 417, 416, 1, 0, 0, 0, 418, 421, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 419, 1, 0, 0, 0, 422, 423, 5, 140, 0, 0, 423, 41, 1, 0, 0, 0, 424, 425, 5, 93, 0, 0, 425, 426, 5, 86, 0, 0, 426, 428, 3, 168, 84, 0, 427, 429, 3, 76, 38, 0, 428, 427, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 430, 1, 0, 0, 0, 430, 431, 5, 136, 0, 0, 431, 458, 1, 0, 0, 0, 432, 433, 5, 94, 0, 0, 433, 434, 5, 86, 0, 0, 434, 436, 3, 168, 84, 0, 435, 437, 3, 76, 38, 0, 436, 435, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 438, 1, 0, 0, 0, 438, 439, 5, 136, 0, 0, 439, 458, 1, 0, 0, 0, 440, 441, 5, 1, 0, 0, 441, 442, 5, 86, 0, 0, 442, 444, 3, 168, 84, 0, 443, 445, 3, 76, 38, 0, 444, 443, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 447, 5, 136, 0, 0, 447, 458, 1, 0, 0, 0, 448, 449, 5, 95, 0, 0, 449, 450, 5, 96, 0, 0, 450, 451, 5, 86, 0, 0, 451, 452, 3, 168, 84, 0, 452, 453, 5, 97, 0, 0, 453, 454, 5, 86, 0, 0, 454, 455, 3, 168, 84, 0, 455, 456, 5, 136, 0, 0, 456, 458, 1, 0, 0, 0, 457, 424, 1, 0, 0, 0, 457, 432, 1, 0, 0, 0, 457, 440, 1, 0, 0, 0, 457, 448, 1, 0, 0, 0, 458, 43, 1, 0, 0, 0, 459, 461, 3, 46, 23, 0, 460, 459, 1, 0, 0, 0, 460, 461, 1, 0, 0, 0, 461, 462, 1, 0, 0, 0, 462, 463, 5, 50, 0, 0, 463, 464, 3, 166, 83, 0, 464, 465, 5, 86, 0, 0, 465, 466, 3, 168, 84, 0, 466, 467, 5, 135, 0, 0, 467, 468, 3, 156, 78, 0, 468, 470, 3, 50, 25, 0, 469, 471, 5, 114, 0, 0, 470, 469, 1, 0, 0, 0, 470, 471, 1, 0, 0, 0, 471, 474, 1, 0, 0, 0, 472, 473, 5, 84, 0, 0, 473, 475, 3, 168, 84, 0, 474, 472, 1, 0, 0, 0, 474, 475, 1, 0, 0, 0, 475, 476, 1, 0, 0, 0, 476, 480, 5, 139, 0, 0, 477, 479, 3, 48, 24, 0, 478, 477, 1, 0, 0, 0, 479, 482, 1, 0, 0, 0, 480, 478, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 483, 1, 0, 0, 0, 482, 480, 1, 0, 0, 0, 483, 484, 5, 140, 0, 0, 484, 45, 1, 0, 0, 0, 485, 487, 5, 34, 0, 0, 486, 488, 7, 0, 0, 0, 487, 486, 1, 0, 0, 0, 487, 488, 1, 0, 0, 0, 488, 47, 1, 0, 0, 0, 489, 490, 5, 100, 0, 0, 490, 491, 5, 86, 0, 0, 491, 493, 3, 168, 84, 0, 492, 494, 3, 76, 38, 0, 493, 492, 1, 0, 0, 0, 493, 494, 1, 0, 0, 0, 494, 495, 1, 0, 0, 0, 495, 496, 5, 136, 0, 0, 496, 523, 1, 0, 0, 0, 497, 498, 5, 101, 0, 0, 498, 499, 5, 86, 0, 0, 499, 501, 3, 168, 84, 0, 500, 502, 3, 76, 38, 0, 501, 500, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 504, 5, 136, 0, 0, 504, 523, 1, 0, 0, 0, 505, 506, 5, 102, 0, 0, 506, 507, 5, 86, 0, 0, 507, 509, 3, 168, 84, 0, 508, 510, 3, 76, 38, 0, 509, 508, 1, 0, 0, 0, 509, 510, 1, 0, 0, 0, 510, 511, 1, 0, 0, 0, 511, 512, 5, 136, 0, 0, 512, 523, 1, 0, 0, 0, 513, 514, 5, 95, 0, 0, 514, 515, 5, 96, 0, 0, 515, 516, 5, 86, 0, 0, 516, 517, 3, 168, 84, 0, 517, 518, 5, 97, 0, 0, 518, 519, 5, 86, 0, 0, 519, 520, 3, 168, 84, 0, 520, 521, 5, 136, 0, 0, 521, 523, 1, 0, 0, 0, 522, 489, 1, 0, 0, 0, 522, 497, 1, 0, 0, 0, 522, 505, 1, 0, 0, 0, 522, 513, 1, 0, 0, 0, 523, 49, 1, 0, 0, 0, 524, 525, 5, 45, 0, 0, 525, 534, 3, 166, 83, 0, 526, 527, 5, 46, 0, 0, 527, 529, 3, 166, 83, 0, 528, 530, 3, 28, 14, 0, 529, 528, 1, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 534, 1, 0, 0, 0, 531, 532, 5, 38, 0, 0, 532, 534, 3, 166, 83, 0, 533, 524, 1, 0, 0, 0, 533, 526, 1, 0, 0, 0, 533, 531, 1, 0, 0, 0, 534, 51, 1, 0, 0, 0, 535, 537, 3, 16, 8, 0, 536, 535, 1, 0, 0, 0, 537, 540, 1, 0, 0, 0, 538, 536, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 541, 1, 0, 0, 0, 540, 538, 1, 0, 0, 0, 541, 542, 5, 48, 0, 0, 542, 543, 3, 166, 83, 0, 543, 544, 5, 86, 0, 0, 544, 545, 3, 168, 84, 0, 545, 546, 5, 79, 0, 0, 546, 549, 3, 168, 84, 0, 547, 548, 5, 80, 0, 0, 548, 550, 5, 149, 0, 0, 549, 547, 1, 0, 0, 0, 549, 550, 1, 0, 0, 0, 550, 551, 1, 0, 0, 0, 551, 555, 5, 139, 0, 0, 552, 554, 3, 54, 27, 0, 553, 552, 1, 0, 0, 0, 554, 557, 1, 0, 0, 0, 555, 553, 1, 0, 0, 0, 555, 556, 1, 0, 0, 0, 556, 558, 1, 0, 0, 0, 557, 555, 1, 0, 0, 0, 558, 559, 5, 140, 0, 0, 559, 53, 1, 0, 0, 0, 560, 567, 3, 68, 34, 0, 561, 567, 3, 70, 35, 0, 562, 567, 3, 80, 40, 0, 563, 567, 3, 60, 30, 0, 564, 567, 3, 62, 31, 0, 565, 567, 3, 56, 28, 0, 566, 560, 1, 0, 0, 0, 566, 561, 1, 0, 0, 0, 566, 562, 1, 0, 0, 0, 566, 563, 1, 0, 0, 0, 566, 564, 1, 0, 0, 0, 566, 565, 1, 0, 0, 0, 567, 55, 1, 0, 0, 0, 568, 569, 5, 2, 0, 0, 569, 570, 3, 166, 83, 0, 570, 571, 5, 86, 0, 0, 571, 572, 3, 168, 84, 0, 572, 573, 5, 40, 0, 0, 573, 574, 3, 26, 13, 0, 574, 575, 5, 138, 0, 0, 575, 576, 3, 166, 83, 0, 576, 577, 5, 136, 0, 0, 577, 57, 1, 0, 0, 0, 578, 579, 5, 4, 0, 0, 579, 580, 3, 166, 83, 0, 580, 581, 5, 86, 0, 0, 581, 582, 3, 168, 84, 0, 582, 583, 5, 6, 0, 0, 583, 584, 3, 26, 13, 0, 584, 585, 5, 67, 0, 0, 585, 586, 3, 166, 83, 0, 586, 587, 5, 138, 0, 0, 587, 588, 3, 166, 83, 0, 588, 589, 5, 136, 0, 0, 589, 59, 1, 0, 0, 0, 590, 592, 5, 24, 0, 0, 591, 593, 5, 42, 0, 0, 592, 591, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 596, 3, 166, 83, 0, 595, 597, 3, 22, 11, 0, 596, 595, 1, 0, 0, 0, 596, 597, 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 599, 5, 86, 0, 0, 599, 600, 3, 168, 84, 0, 600, 602, 5, 27, 0, 0, 601, 603, 5, 11, 0, 0, 602, 601, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 604, 1, 0, 0, 0, 604, 605, 3, 26, 13, 0, 605, 606, 5, 28, 0, 0, 606, 635, 3, 168, 84, 0, 607, 608, 5, 51, 0, 0, 608, 609, 3, 168, 84, 0, 609, 613, 5, 139, 0, 0, 610, 612, 3, 64, 32, 0, 611, 610, 1, 0, 0, 0, 612, 615, 1, 0, 0, 0, 613, 611, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 616, 1, 0, 0, 0, 615, 613, 1, 0, 0, 0, 616, 617, 5, 140, 0, 0, 617, 636, 1, 0, 0, 0, 618, 619, 5, 42, 0, 0, 619, 622, 3, 168, 84, 0, 620, 621, 5, 51, 0, 0, 621, 623, 3, 168, 84, 0, 622, 620, 1, 0, 0, 0, 622, 623, 1, 0, 0, 0, 623, 633, 1, 0, 0, 0, 624, 628, 5, 139, 0, 0, 625, 627, 3, 64, 32, 0, 626, 625, 1, 0, 0, 0, 627, 630, 1, 0, 0, 0, 628, 626, 1, 0, 0, 0, 628, 629, 1, 0, 0, 0, 629, 631, 1, 0, 0, 0, 630, 628, 1, 0, 0, 0, 631, 634, 5, 140, 0, 0, 632, 634, 5, 136, 0, 0, 633, 624, 1, 0, 0, 0, 633, 632, 1, 0, 0, 0, 634, 636, 1, 0, 0, 0, 635, 607, 1, 0, 0, 0, 635, 618, 1, 0, 0, 0, 636, 61, 1, 0, 0, 0, 637, 638, 5, 24, 0, 0, 638, 639, 3, 166, 83, 0, 639, 640, 5, 86, 0, 0, 640, 641, 3, 168, 84, 0, 641, 642, 5, 26, 0, 0, 642, 643, 3, 166, 83, 0, 643, 644, 3, 28, 14, 0, 644, 645, 5, 136, 0, 0, 645, 63, 1, 0, 0, 0, 646, 647, 5, 18, 0, 0, 647, 704, 5, 136, 0, 0, 648, 649, 5, 19, 0, 0, 649, 650, 5, 20, 0, 0, 650, 651, 3, 166, 83, 0, 651, 652, 5, 136, 0, 0, 652, 704, 1, 0, 0, 0, 653, 654, 5, 29, 0, 0, 654, 655, 3, 168, 84, 0, 655, 656, 5, 136, 0, 0, 656, 704, 1, 0, 0, 0, 657, 658, 5, 29, 0, 0, 658, 659, 3, 166, 83, 0, 659, 660, 5, 138, 0, 0, 660, 670, 3, 166, 83, 0, 661, 662, 5, 66, 0, 0, 662, 666, 5, 139, 0, 0, 663, 665, 3, 66, 33, 0, 664, 663, 1, 0, 0, 0, 665, 668, 1, 0, 0, 0, 666, 664, 1, 0, 0, 0, 666, 667, 1, 0, 0, 0, 667, 669, 1, 0, 0, 0, 668, 666, 1, 0, 0, 0, 669, 671, 5, 140, 0, 0, 670, 661, 1, 0, 0, 0, 670, 671, 1, 0, 0, 0, 671, 672, 1, 0, 0, 0, 672, 673, 5, 136, 0, 0, 673, 704, 1, 0, 0, 0, 674, 676, 5, 30, 0, 0, 675, 677, 5, 38, 0, 0, 676, 675, 1, 0, 0, 0, 676, 677, 1, 0, 0, 0, 677, 678, 1, 0, 0, 0, 678, 679, 3, 166, 83, 0, 679, 680, 5, 57, 0, 0, 680, 681, 3, 26, 13, 0, 681, 682, 5, 136, 0, 0, 682, 704, 1, 0, 0, 0, 683, 684, 5, 31, 0, 0, 684, 685, 3, 166, 83, 0, 685, 686, 5, 149, 0, 0, 686, 687, 5, 136, 0, 0, 687, 704, 1, 0, 0, 0, 688, 689, 5, 32, 0, 0, 689, 690, 3, 26, 13, 0, 690, 691, 5, 138, 0, 0, 691, 692, 3, 166, 83, 0, 692, 693, 3, 166, 83, 0, 693, 694, 3, 168, 84, 0, 694, 695, 5, 136, 0, 0, 695, 704, 1, 0, 0, 0, 696, 697, 5, 95, 0, 0, 697, 704, 5, 136, 0, 0, 698, 699, 5, 33, 0, 0, 699, 700, 5, 149, 0, 0, 700, 701, 3, 168, 84, 0, 701, 702, 5, 136, 0, 0, 702, 704, 1, 0, 0, 0, 703, 646, 1, 0, 0, 0, 703, 648, 1, 0, 0, 0, 703, 653, 1, 0, 0, 0, 703, 657, 1, 0, 0, 0, 703, 674, 1, 0, 0, 0, 703, 683, 1, 0, 0, 0, 703, 688, 1, 0, 0, 0, 703, 696, 1, 0, 0, 0, 703, 698, 1, 0, 0, 0, 704, 65, 1, 0, 0, 0, 705, 706, 3, 166, 83, 0, 706, 707, 5, 60, 0, 0, 707, 708, 3, 166, 83, 0, 708, 709, 5, 136, 0, 0, 709, 67, 1, 0, 0, 0, 710, 711, 5, 51, 0, 0, 711, 713, 3, 166, 83, 0, 712, 714, 3, 22, 11, 0, 713, 712, 1, 0, 0, 0, 713, 714, 1, 0, 0, 0, 714, 715, 1, 0, 0, 0, 715, 716, 5, 86, 0, 0, 716, 717, 3, 168, 84, 0, 717, 718, 5, 135, 0, 0, 718, 719, 3, 148, 74, 0, 719, 720, 5, 134, 0, 0, 720, 721, 3, 148, 74, 0, 721, 722, 5, 88, 0, 0, 722, 724, 3, 84, 42, 0, 723, 725, 3, 76, 38, 0, 724, 723, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 727, 1, 0, 0, 0, 726, 728, 3, 82, 41, 0, 727, 726, 1, 0, 0, 0, 727, 728, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 5, 90, 0, 0, 730, 732, 3, 86, 43, 0, 731, 733, 3, 90, 45, 0, 732, 731, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 735, 1, 0, 0, 0, 734, 736, 3, 74, 37, 0, 735, 734, 1, 0, 0, 0, 735, 736, 1, 0, 0, 0, 736, 738, 1, 0, 0, 0, 737, 739, 3, 72, 36, 0, 738, 737, 1, 0, 0, 0, 738, 739, 1, 0, 0, 0, 739, 740, 1, 0, 0, 0, 740, 741, 5, 136, 0, 0, 741, 69, 1, 0, 0, 0, 742, 743, 5, 52, 0, 0, 743, 745, 3, 166, 83, 0, 744, 746, 3, 22, 11, 0, 745, 744, 1, 0, 0, 0, 745, 746, 1, 0, 0, 0, 746, 747, 1, 0, 0, 0, 747, 748, 5, 86, 0, 0, 748, 749, 3, 168, 84, 0, 749, 750, 5, 135, 0, 0, 750, 751, 3, 148, 74, 0, 751, 752, 5, 134, 0, 0, 752, 754, 3, 148, 74, 0, 753, 755, 3, 76, 38, 0, 754, 753, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 757, 1, 0, 0, 0, 756, 758, 3, 90, 45, 0, 757, 756, 1, 0, 0, 0, 757, 758, 1, 0, 0, 0, 758, 760, 1, 0, 0, 0, 759, 761, 3, 74, 37, 0, 760, 759, 1, 0, 0, 0, 760, 761, 1, 0, 0, 0, 761, 763, 1, 0, 0, 0, 762, 764, 3, 72, 36, 0, 763, 762, 1, 0, 0, 0, 763, 764, 1, 0, 0, 0, 764, 765, 1, 0, 0, 0, 765, 766, 5, 136, 0, 0, 766, 71, 1, 0, 0, 0, 767, 768, 5, 68, 0, 0, 768, 769, 5, 67, 0, 0, 769, 770, 3, 166, 83, 0, 770, 73, 1, 0, 0, 0, 771, 772, 5, 9, 0, 0, 772, 773, 5, 7, 0, 0, 773, 774, 3, 166, 83, 0, 774, 775, 5, 67, 0, 0, 775, 776, 3, 168, 84, 0, 776, 75, 1, 0, 0, 0, 777, 778, 5, 12, 0, 0, 778, 787, 5, 15, 0, 0, 779, 780, 5, 12, 0, 0, 780, 781, 7, 1, 0, 0, 781, 782, 5, 16, 0, 0, 782, 783, 5, 141, 0, 0, 783, 784, 3, 88, 44, 0, 784, 785, 5, 142, 0, 0, 785, 787, 1, 0, 0, 0, 786, 777, 1, 0, 0, 0, 786, 779, 1, 0, 0, 0, 787, 77, 1, 0, 0, 0, 788, 789, 5, 67, 0, 0, 789, 790, 5, 141, 0, 0, 790, 795, 3, 130, 65, 0, 791, 792, 5, 137, 0, 0, 792, 794, 3, 130, 65, 0, 793, 791, 1, 0, 0, 0, 794, 797, 1, 0, 0, 0, 795, 793, 1, 0, 0, 0, 795, 796, 1, 0, 0, 0, 796, 798, 1, 0, 0, 0, 797, 795, 1, 0, 0, 0, 798, 799, 5, 142, 0, 0, 799, 79, 1, 0, 0, 0, 800, 801, 5, 53, 0, 0, 801, 802, 3, 166, 83, 0, 802, 803, 5, 86, 0, 0, 803, 804, 3, 168, 84, 0, 804, 805, 5, 54, 0, 0, 805, 806, 3, 166, 83, 0, 806, 807, 5, 135, 0, 0, 807, 809, 3, 148, 74, 0, 808, 810, 3, 90, 45, 0, 809, 808, 1, 0, 0, 0, 809, 810, 1, 0, 0, 0, 810, 811, 1, 0, 0, 0, 811, 812, 5, 136, 0, 0, 812, 81, 1, 0, 0, 0, 813, 814, 5, 89, 0, 0, 814, 815, 3, 148, 74, 0, 815, 83, 1, 0, 0, 0, 816, 817, 7, 2, 0, 0, 817, 85, 1, 0, 0, 0, 818, 837, 5, 92, 0, 0, 819, 820, 5, 45, 0, 0, 820, 837, 3, 166, 83, 0, 821, 822, 5, 38, 0, 0, 822, 837, 3, 166, 83, 0, 823, 824, 5, 47, 0, 0, 824, 833, 5, 141, 0, 0, 825, 830, 3, 26, 13, 0, 826, 827, 5, 137, 0, 0, 827, 829, 3, 26, 13, 0, 828, 826, 1, 0, 0, 0, 829, 832, 1, 0, 0, 0, 830, 828, 1, 0, 0, 0, 830, 831, 1, 0, 0, 0, 831, 834, 1, 0, 0, 0, 832, 830, 1, 0, 0, 0, 833, 825, 1, 0, 0, 0, 833, 834, 1, 0, 0, 0, 834, 835, 1, 0, 0, 0, 835, 837, 5, 142, 0, 0, 836, 818, 1, 0, 0, 0, 836, 819, 1, 0, 0, 0, 836, 821, 1, 0, 0, 0, 836, 823, 1, 0, 0, 0, 837, 87, 1, 0, 0, 0, 838, 843, 3, 166, 83, 0, 839, 840, 5, 137, 0, 0, 840, 842, 3, 166, 83, 0, 841, 839, 1, 0, 0, 0, 842, 845, 1, 0, 0, 0, 843, 841, 1, 0, 0, 0, 843, 844, 1, 0, 0, 0, 844, 89, 1, 0, 0, 0, 845, 843, 1, 0, 0, 0, 846, 847, 5, 91, 0, 0, 847, 851, 5, 139, 0, 0, 848, 850, 3, 92, 46, 0, 849, 848, 1, 0, 0, 0, 850, 853, 1, 0, 0, 0, 851, 849, 1, 0, 0, 0, 851, 852, 1, 0, 0, 0, 852, 854, 1, 0, 0, 0, 853, 851, 1, 0, 0, 0, 854, 855, 5, 140, 0, 0, 855, 91, 1, 0, 0, 0, 856, 857, 5, 25, 0, 0, 857, 858, 3, 166, 83, 0, 858, 859, 5, 86, 0, 0, 859, 860, 3, 168, 84, 0, 860, 861, 5, 141, 0, 0, 861, 862, 3, 88, 44, 0, 862, 863, 5, 142, 0, 0, 863, 864, 5, 136, 0, 0, 864, 939, 1, 0, 0, 0, 865, 866, 5, 63, 0, 0, 866, 867, 3, 166, 83, 0, 867, 868, 5, 86, 0, 0, 868, 869, 3, 168, 84, 0, 869, 870, 5, 135, 0, 0, 870, 871, 3, 148, 74, 0, 871, 872, 3, 94, 47, 0, 872, 873, 5, 136, 0, 0, 873, 939, 1, 0, 0, 0, 874, 875, 5, 64, 0, 0, 875, 876, 3, 166, 83, 0, 876, 877, 5, 86, 0, 0, 877, 878, 3, 168, 84, 0, 878, 879, 5, 135, 0, 0, 879, 880, 3, 156, 78, 0, 880, 883, 3, 50, 25, 0, 881, 882, 5, 84, 0, 0, 882, 884, 3, 168, 84, 0, 883, 881, 1, 0, 0, 0, 883, 884, 1, 0, 0, 0, 884, 885, 1, 0, 0, 0, 885, 886, 3, 94, 47, 0, 886, 887, 5, 136, 0, 0, 887, 939, 1, 0, 0, 0, 888, 889, 5, 46, 0, 0, 889, 890, 3, 166, 83, 0, 890, 891, 5, 86, 0, 0, 891, 892, 3, 168, 84, 0, 892, 893, 5, 135, 0, 0, 893, 895, 3, 166, 83, 0, 894, 896, 3, 28, 14, 0, 895, 894, 1, 0, 0, 0, 895, 896, 1, 0, 0, 0, 896, 898, 1, 0, 0, 0, 897, 899, 3, 78, 39, 0, 898, 897, 1, 0, 0, 0, 898, 899, 1, 0, 0, 0, 899, 902, 1, 0, 0, 0, 900, 901, 5, 20, 0, 0, 901, 903, 5, 55, 0, 0, 902, 900, 1, 0, 0, 0, 902, 903, 1, 0, 0, 0, 903, 904, 1, 0, 0, 0, 904, 905, 5, 136, 0, 0, 905, 939, 1, 0, 0, 0, 906, 907, 5, 7, 0, 0, 907, 908, 3, 166, 83, 0, 908, 909, 5, 86, 0, 0, 909, 910, 3, 168, 84, 0, 910, 911, 5, 135, 0, 0, 911, 912, 3, 166, 83, 0, 912, 913, 5, 55, 0, 0, 913, 914, 3, 148, 74, 0, 914, 915, 5, 136, 0, 0, 915, 939, 1, 0, 0, 0, 916, 917, 5, 53, 0, 0, 917, 918, 3, 166, 83, 0, 918, 919, 5, 86, 0, 0, 919, 920, 3, 168, 84, 0, 920, 921, 5, 135, 0, 0, 921, 924, 3, 166, 83, 0, 922, 923, 5, 55, 0, 0, 923, 925, 3, 148, 74, 0, 924, 922, 1, 0, 0, 0, 924, 925, 1, 0, 0, 0, 925, 926, 1, 0, 0, 0, 926, 927, 5, 136, 0, 0, 927, 939, 1, 0, 0, 0, 928, 929, 5, 24, 0, 0, 929, 930, 3, 166, 83, 0, 930, 931, 5, 86, 0, 0, 931, 932, 3, 168, 84, 0, 932, 933, 5, 135, 0, 0, 933, 934, 3, 166, 83, 0, 934, 935, 5, 138, 0, 0, 935, 936, 3, 166, 83, 0, 936, 937, 5, 136, 0, 0, 937, 939, 1, 0, 0, 0, 938, 856, 1, 0, 0, 0, 938, 865, 1, 0, 0, 0, 938, 874, 1, 0, 0, 0, 938, 888, 1, 0, 0, 0, 938, 906, 1, 0, 0, 0, 938, 916, 1, 0, 0, 0, 938, 928, 1, 0, 0, 0, 939, 93, 1, 0, 0, 0, 940, 941, 5, 141, 0, 0, 941, 946, 3, 96, 48, 0, 942, 943, 5, 137, 0, 0, 943, 945, 3, 96, 48, 0, 944, 942, 1, 0, 0, 0, 945, 948, 1, 0, 0, 0, 946, 944, 1, 0, 0, 0, 946, 947, 1, 0, 0, 0, 947, 949, 1, 0, 0, 0, 948, 946, 1, 0, 0, 0, 949, 950, 5, 142, 0, 0, 950, 95, 1, 0, 0, 0, 951, 952, 7, 3, 0, 0, 952, 97, 1, 0, 0, 0, 953, 954, 5, 62, 0, 0, 954, 955, 3, 100, 50, 0, 955, 99, 1, 0, 0, 0, 956, 959, 3, 102, 51, 0, 957, 959, 3, 106, 53, 0, 958, 956, 1, 0, 0, 0, 958, 957, 1, 0, 0, 0, 959, 101, 1, 0, 0, 0, 960, 961, 5, 63, 0, 0, 961, 962, 3, 166, 83, 0, 962, 963, 5, 86, 0, 0, 963, 964, 3, 168, 84, 0, 964, 965, 5, 73, 0, 0, 965, 966, 3, 166, 83, 0, 966, 967, 5, 135, 0, 0, 967, 968, 3, 148, 74, 0, 968, 969, 5, 74, 0, 0, 969, 972, 3, 104, 52, 0, 970, 971, 5, 75, 0, 0, 971, 973, 3, 158, 79, 0, 972, 970, 1, 0, 0, 0, 972, 973, 1, 0, 0, 0, 973, 974, 1, 0, 0, 0, 974, 975, 5, 136, 0, 0, 975, 103, 1, 0, 0, 0, 976, 983, 5, 108, 0, 0, 977, 978, 5, 109, 0, 0, 978, 979, 5, 143, 0, 0, 979, 980, 3, 148, 74, 0, 980, 981, 5, 144, 0, 0, 981, 983, 1, 0, 0, 0, 982, 976, 1, 0, 0, 0, 982, 977, 1, 0, 0, 0, 983, 105, 1, 0, 0, 0, 984, 985, 5, 64, 0, 0, 985, 986, 3, 166, 83, 0, 986, 987, 5, 86, 0, 0, 987, 988, 3, 168, 84, 0, 988, 989, 5, 139, 0, 0, 989, 990, 3, 108, 54, 0, 990, 991, 3, 108, 54, 0, 991, 992, 5, 140, 0, 0, 992, 107, 1, 0, 0, 0, 993, 994, 3, 50, 25, 0, 994, 995, 5, 65, 0, 0, 995, 996, 3, 166, 83, 0, 996, 997, 5, 86, 0, 0, 997, 998, 3, 168, 84, 0, 998, 1000, 3, 156, 78, 0, 999, 1001, 5, 114, 0, 0, 1000, 999, 1, 0, 0, 0, 1000, 1001, 1, 0, 0, 0, 1001, 1004, 1, 0, 0, 0, 1002, 1003, 5, 81, 0, 0, 1003, 1005, 3, 168, 84, 0, 1004, 1002, 1, 0, 0, 0, 1004, 1005, 1, 0, 0, 0, 1005, 1007, 1, 0, 0, 0, 1006, 1008, 5, 83, 0, 0, 1007, 1006, 1, 0, 0, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1011, 1, 0, 0, 0, 1009, 1010, 5, 84, 0, 0, 1010, 1012, 3, 168, 84, 0, 1011, 1009, 1, 0, 0, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1014, 1, 0, 0, 0, 1013, 1015, 5, 85, 0, 0, 1014, 1013, 1, 0, 0, 0, 1014, 1015, 1, 0, 0, 0, 1015, 1016, 1, 0, 0, 0, 1016, 1017, 5, 136, 0, 0, 1017, 109, 1, 0, 0, 0, 1018, 1020, 5, 56, 0, 0, 1019, 1021, 3, 22, 11, 0, 1020, 1019, 1, 0, 0, 0, 1020, 1021, 1, 0, 0, 0, 1021, 1022, 1, 0, 0, 0, 1022, 1024, 3, 166, 83, 0, 1023, 1025, 3, 112, 56, 0, 1024, 1023, 1, 0, 0, 0, 1024, 1025, 1, 0, 0, 0, 1025, 1026, 1, 0, 0, 0, 1026, 1027, 5, 57, 0, 0, 1027, 1029, 3, 166, 83, 0, 1028, 1030, 3, 28, 14, 0, 1029, 1028, 1, 0, 0, 0, 1029, 1030, 1, 0, 0, 0, 1030, 1033, 1, 0, 0, 0, 1031, 1032, 5, 86, 0, 0, 1032, 1034, 3, 168, 84, 0, 1033, 1031, 1, 0, 0, 0, 1033, 1034, 1, 0, 0, 0, 1034, 1037, 1, 0, 0, 0, 1035, 1036, 5, 80, 0, 0, 1036, 1038, 5, 149, 0, 0, 1037, 1035, 1, 0, 0, 0, 1037, 1038, 1, 0, 0, 0, 1038, 1039, 1, 0, 0, 0, 1039, 1043, 5, 139, 0, 0, 1040, 1042, 3, 114, 57, 0, 1041, 1040, 1, 0, 0, 0, 1042, 1045, 1, 0, 0, 0, 1043, 1041, 1, 0, 0, 0, 1043, 1044, 1, 0, 0, 0, 1044, 1046, 1, 0, 0, 0, 1045, 1043, 1, 0, 0, 0, 1046, 1047, 5, 140, 0, 0, 1047, 111, 1, 0, 0, 0, 1048, 1049, 3, 28, 14, 0, 1049, 113, 1, 0, 0, 0, 1050, 1051, 5, 61, 0, 0, 1051, 1058, 3, 100, 50, 0, 1052, 1058, 3, 128, 64, 0, 1053, 1058, 3, 124, 62, 0, 1054, 1058, 3, 118, 59, 0, 1055, 1058, 3, 126, 63, 0, 1056, 1058, 3, 116, 58, 0, 1057, 1050, 1, 0, 0, 0, 1057, 1052, 1, 0, 0, 0, 1057, 1053, 1, 0, 0, 0, 1057, 1054, 1, 0, 0, 0, 1057, 1055, 1, 0, 0, 0, 1057, 1056, 1, 0, 0, 0, 1058, 115, 1, 0, 0, 0, 1059, 1060, 5, 58, 0, 0, 1060, 1061, 3, 166, 83, 0, 1061, 1062, 5, 60, 0, 0, 1062, 1063, 3, 166, 83, 0, 1063, 1064, 5, 138, 0, 0, 1064, 1065, 3, 166, 83, 0, 1065, 1066, 5, 136, 0, 0, 1066, 117, 1, 0, 0, 0, 1067, 1068, 5, 10, 0, 0, 1068, 1072, 5, 139, 0, 0, 1069, 1071, 3, 120, 60, 0, 1070, 1069, 1, 0, 0, 0, 1071, 1074, 1, 0, 0, 0, 1072, 1070, 1, 0, 0, 0, 1072, 1073, 1, 0, 0, 0, 1073, 1075, 1, 0, 0, 0, 1074, 1072, 1, 0, 0, 0, 1075, 1076, 5, 140, 0, 0, 1076, 1077, 5, 136, 0, 0, 1077, 119, 1, 0, 0, 0, 1078, 1079, 3, 166, 83, 0, 1079, 1080, 5, 60, 0, 0, 1080, 1081, 5, 63, 0, 0, 1081, 1082, 3, 166, 83, 0, 1082, 1083, 5, 136, 0, 0, 1083, 1093, 1, 0, 0, 0, 1084, 1085, 3, 166, 83, 0, 1085, 1086, 5, 60, 0, 0, 1086, 1087, 5, 64, 0, 0, 1087, 1088, 3, 166, 83, 0, 1088, 1089, 5, 138, 0, 0, 1089, 1090, 3, 166, 83, 0, 1090, 1091, 5, 136, 0, 0, 1091, 1093, 1, 0, 0, 0, 1092, 1078, 1, 0, 0, 0, 1092, 1084, 1, 0, 0, 0, 1093, 121, 1, 0, 0, 0, 1094, 1095, 3, 26, 13, 0, 1095, 1096, 5, 20, 0, 0, 1096, 1101, 5, 55, 0, 0, 1097, 1098, 5, 138, 0, 0, 1098, 1100, 3, 166, 83, 0, 1099, 1097, 1, 0, 0, 0, 1100, 1103, 1, 0, 0, 0, 1101, 1099, 1, 0, 0, 0, 1101, 1102, 1, 0, 0, 0, 1102, 1104, 1, 0, 0, 0, 1103, 1101, 1, 0, 0, 0, 1104, 1105, 5, 136, 0, 0, 1105, 123, 1, 0, 0, 0, 1106, 1107, 5, 58, 0, 0, 1107, 1108, 3, 166, 83, 0, 1108, 1109, 5, 60, 0, 0, 1109, 1110, 5, 63, 0, 0, 1110, 1111, 3, 166, 83, 0, 1111, 1112, 5, 136, 0, 0, 1112, 125, 1, 0, 0, 0, 1113, 1114, 5, 70, 0, 0, 1114, 1115, 3, 166, 83, 0, 1115, 1116, 5, 71, 0, 0, 1116, 1117, 5, 72, 0, 0, 1117, 1118, 5, 67, 0, 0, 1118, 1119, 5, 53, 0, 0, 1119, 1120, 3, 166, 83, 0, 1120, 1121, 5, 69, 0, 0, 1121, 1122, 5, 64, 0, 0, 1122, 1123, 3, 166, 83, 0, 1123, 1124, 5, 138, 0, 0, 1124, 1125, 3, 166, 83, 0, 1125, 1126, 5, 136, 0, 0, 1126, 127, 1, 0, 0, 0, 1127, 1128, 5, 58, 0, 0, 1128, 1129, 3, 130, 65, 0, 1129, 1130, 5, 60, 0, 0, 1130, 1133, 3, 134, 67, 0, 1131, 1132, 5, 36, 0, 0, 1132, 1134, 3, 168, 84, 0, 1133, 1131, 1, 0, 0, 0, 1133, 1134, 1, 0, 0, 0, 1134, 1135, 1, 0, 0, 0, 1135, 1136, 5, 136, 0, 0, 1136, 129, 1, 0, 0, 0, 1137, 1138, 3, 166, 83, 0, 1138, 1139, 5, 138, 0, 0, 1139, 1140, 3, 132, 66, 0, 1140, 131, 1, 0, 0, 0, 1141, 1154, 3, 166, 83, 0, 1142, 1154, 5, 103, 0, 0, 1143, 1154, 5, 93, 0, 0, 1144, 1154, 5, 94, 0, 0, 1145, 1154, 5, 1, 0, 0, 1146, 1154, 5, 100, 0, 0, 1147, 1154, 5, 101, 0, 0, 1148, 1154, 5, 102, 0, 0, 1149, 1154, 5, 104, 0, 0, 1150, 1154, 5, 105, 0, 0, 1151, 1154, 5, 106, 0, 0, 1152, 1154, 5, 107, 0, 0, 1153, 1141, 1, 0, 0, 0, 1153, 1142, 1, 0, 0, 0, 1153, 1143, 1, 0, 0, 0, 1153, 1144, 1, 0, 0, 0, 1153, 1145, 1, 0, 0, 0, 1153, 1146, 1, 0, 0, 0, 1153, 1147, 1, 0, 0, 0, 1153, 1148, 1, 0, 0, 0, 1153, 1149, 1, 0, 0, 0, 1153, 1150, 1, 0, 0, 0, 1153, 1151, 1, 0, 0, 0, 1153, 1152, 1, 0, 0, 0, 1154, 133, 1, 0, 0, 0, 1155, 1156, 5, 82, 0, 0, 1156, 1157, 5, 138, 0, 0, 1157, 1192, 3, 166, 83, 0, 1158, 1159, 5, 63, 0, 0, 1159, 1160, 3, 166, 83, 0, 1160, 1161, 5, 138, 0, 0, 1161, 1162, 3, 138, 69, 0, 1162, 1192, 1, 0, 0, 0, 1163, 1164, 5, 64, 0, 0, 1164, 1165, 3, 166, 83, 0, 1165, 1166, 5, 138, 0, 0, 1166, 1167, 3, 166, 83, 0, 1167, 1168, 5, 138, 0, 0, 1168, 1169, 3, 140, 70, 0, 1169, 1192, 1, 0, 0, 0, 1170, 1171, 5, 46, 0, 0, 1171, 1173, 3, 166, 83, 0, 1172, 1174, 3, 28, 14, 0, 1173, 1172, 1, 0, 0, 0, 1173, 1174, 1, 0, 0, 0, 1174, 1175, 1, 0, 0, 0, 1175, 1176, 5, 138, 0, 0, 1176, 1177, 3, 130, 65, 0, 1177, 1192, 1, 0, 0, 0, 1178, 1179, 5, 48, 0, 0, 1179, 1180, 3, 166, 83, 0, 1180, 1181, 5, 138, 0, 0, 1181, 1183, 3, 166, 83, 0, 1182, 1184, 3, 28, 14, 0, 1183, 1182, 1, 0, 0, 0, 1183, 1184, 1, 0, 0, 0, 1184, 1186, 1, 0, 0, 0, 1185, 1187, 3, 142, 71, 0, 1186, 1185, 1, 0, 0, 0, 1186, 1187, 1, 0, 0, 0, 1187, 1189, 1, 0, 0, 0, 1188, 1190, 3, 136, 68, 0, 1189, 1188, 1, 0, 0, 0, 1189, 1190, 1, 0, 0, 0, 1190, 1192, 1, 0, 0, 0, 1191, 1155, 1, 0, 0, 0, 1191, 1158, 1, 0, 0, 0, 1191, 1163, 1, 0, 0, 0, 1191, 1170, 1, 0, 0, 0, 1191, 1178, 1, 0, 0, 0, 1192, 135, 1, 0, 0, 0, 1193, 1194, 5, 68, 0, 0, 1194, 1195, 3, 142, 71, 0, 1195, 137, 1, 0, 0, 0, 1196, 1197, 7, 4, 0, 0, 1197, 139, 1, 0, 0, 0, 1198, 1199, 7, 5, 0, 0, 1199, 141, 1, 0, 0, 0, 1200, 1201, 5, 66, 0, 0, 1201, 1205, 5, 139, 0, 0, 1202, 1204, 3, 144, 72, 0, 1203, 1202, 1, 0, 0, 0, 1204, 1207, 1, 0, 0, 0, 1205, 1203, 1, 0, 0, 0, 1205, 1206, 1, 0, 0, 0, 1206, 1208, 1, 0, 0, 0, 1207, 1205, 1, 0, 0, 0, 1208, 1209, 5, 140, 0, 0, 1209, 143, 1, 0, 0, 0, 1210, 1211, 3, 166, 83, 0, 1211, 1212, 5, 60, 0, 0, 1212, 1213, 5, 11, 0, 0, 1213, 1214, 5, 25, 0, 0, 1214, 1215, 5, 141, 0, 0, 1215, 1216, 3, 88, 44, 0, 1216, 1217, 5, 142, 0, 0, 1217, 1218, 5, 136, 0, 0, 1218, 1309, 1, 0, 0, 0, 1219, 1220, 3, 166, 83, 0, 1220, 1221, 5, 60, 0, 0, 1221, 1222, 5, 63, 0, 0, 1222, 1229, 3, 166, 83, 0, 1223, 1224, 5, 69, 0, 0, 1224, 1225, 5, 64, 0, 0, 1225, 1226, 3, 166, 83, 0, 1226, 1227, 5, 138, 0, 0, 1227, 1228, 3, 166, 83, 0, 1228, 1230, 1, 0, 0, 0, 1229, 1223, 1, 0, 0, 0, 1229, 1230, 1, 0, 0, 0, 1230, 1231, 1, 0, 0, 0, 1231, 1232, 5, 136, 0, 0, 1232, 1309, 1, 0, 0, 0, 1233, 1234, 3, 166, 83, 0, 1234, 1235, 5, 60, 0, 0, 1235, 1236, 5, 64, 0, 0, 1236, 1237, 3, 166, 83, 0, 1237, 1238, 5, 138, 0, 0, 1238, 1245, 3, 166, 83, 0, 1239, 1240, 5, 69, 0, 0, 1240, 1241, 5, 64, 0, 0, 1241, 1242, 3, 166, 83, 0, 1242, 1243, 5, 138, 0, 0, 1243, 1244, 3, 166, 83, 0, 1244, 1246, 1, 0, 0, 0, 1245, 1239, 1, 0, 0, 0, 1245, 1246, 1, 0, 0, 0, 1246, 1247, 1, 0, 0, 0, 1247, 1248, 5, 136, 0, 0, 1248, 1309, 1, 0, 0, 0, 1249, 1250, 3, 166, 83, 0, 1250, 1251, 5, 60, 0, 0, 1251, 1252, 5, 46, 0, 0, 1252, 1254, 3, 166, 83, 0, 1253, 1255, 3, 28, 14, 0, 1254, 1253, 1, 0, 0, 0, 1254, 1255, 1, 0, 0, 0, 1255, 1264, 1, 0, 0, 0, 1256, 1257, 5, 69, 0, 0, 1257, 1258, 5, 64, 0, 0, 1258, 1259, 3, 166, 83, 0, 1259, 1260, 5, 138, 0, 0, 1260, 1261, 3, 166, 83, 0, 1261, 1265, 1, 0, 0, 0, 1262, 1263, 5, 20, 0, 0, 1263, 1265, 5, 55, 0, 0, 1264, 1256, 1, 0, 0, 0, 1264, 1262, 1, 0, 0, 0, 1264, 1265, 1, 0, 0, 0, 1265, 1266, 1, 0, 0, 0, 1266, 1267, 5, 136, 0, 0, 1267, 1309, 1, 0, 0, 0, 1268, 1269, 3, 166, 83, 0, 1269, 1270, 5, 60, 0, 0, 1270, 1271, 5, 7, 0, 0, 1271, 1272, 3, 166, 83, 0, 1272, 1273, 5, 66, 0, 0, 1273, 1277, 5, 139, 0, 0, 1274, 1276, 3, 122, 61, 0, 1275, 1274, 1, 0, 0, 0, 1276, 1279, 1, 0, 0, 0, 1277, 1275, 1, 0, 0, 0, 1277, 1278, 1, 0, 0, 0, 1278, 1280, 1, 0, 0, 0, 1279, 1277, 1, 0, 0, 0, 1280, 1281, 5, 140, 0, 0, 1281, 1282, 5, 136, 0, 0, 1282, 1309, 1, 0, 0, 0, 1283, 1284, 3, 166, 83, 0, 1284, 1285, 5, 60, 0, 0, 1285, 1286, 5, 53, 0, 0, 1286, 1287, 3, 166, 83, 0, 1287, 1288, 5, 136, 0, 0, 1288, 1309, 1, 0, 0, 0, 1289, 1290, 3, 166, 83, 0, 1290, 1292, 5, 60, 0, 0, 1291, 1293, 5, 11, 0, 0, 1292, 1291, 1, 0, 0, 0, 1292, 1293, 1, 0, 0, 0, 1293, 1294, 1, 0, 0, 0, 1294, 1295, 5, 24, 0, 0, 1295, 1296, 3, 166, 83, 0, 1296, 1297, 5, 138, 0, 0, 1297, 1304, 3, 166, 83, 0, 1298, 1299, 5, 69, 0, 0, 1299, 1300, 5, 64, 0, 0, 1300, 1301, 3, 166, 83, 0, 1301, 1302, 5, 138, 0, 0, 1302, 1303, 3, 166, 83, 0, 1303, 1305, 1, 0, 0, 0, 1304, 1298, 1, 0, 0, 0, 1304, 1305, 1, 0, 0, 0, 1305, 1306, 1, 0, 0, 0, 1306, 1307, 5, 136, 0, 0, 1307, 1309, 1, 0, 0, 0, 1308, 1210, 1, 0, 0, 0, 1308, 1219, 1, 0, 0, 0, 1308, 1233, 1, 0, 0, 0, 1308, 1249, 1, 0, 0, 0, 1308, 1268, 1, 0, 0, 0, 1308, 1283, 1, 0, 0, 0, 1308, 1289, 1, 0, 0, 0, 1309, 145, 1, 0, 0, 0, 1310, 1311, 5, 53, 0, 0, 1311, 1312, 3, 166, 83, 0, 1312, 1313, 5, 60, 0, 0, 1313, 1314, 3, 166, 83, 0, 1314, 1315, 5, 138, 0, 0, 1315, 1317, 3, 166, 83, 0, 1316, 1318, 3, 142, 71, 0, 1317, 1316, 1, 0, 0, 0, 1317, 1318, 1, 0, 0, 0, 1318, 1319, 1, 0, 0, 0, 1319, 1320, 5, 136, 0, 0, 1320, 147, 1, 0, 0, 0, 1321, 1379, 3, 154, 77, 0, 1322, 1379, 5, 115, 0, 0, 1323, 1379, 5, 116, 0, 0, 1324, 1325, 5, 117, 0, 0, 1325, 1379, 3, 168, 84, 0, 1326, 1327, 5, 118, 0, 0, 1327, 1328, 5, 145, 0, 0, 1328, 1329, 3, 166, 83, 0, 1329, 1330, 5, 146, 0, 0, 1330, 1379, 1, 0, 0, 0, 1331, 1332, 5, 119, 0, 0, 1332, 1333, 5, 145, 0, 0, 1333, 1335, 3, 166, 83, 0, 1334, 1336, 3, 28, 14, 0, 1335, 1334, 1, 0, 0, 0, 1335, 1336, 1, 0, 0, 0, 1336, 1337, 1, 0, 0, 0, 1337, 1338, 5, 146, 0, 0, 1338, 1379, 1, 0, 0, 0, 1339, 1340, 5, 41, 0, 0, 1340, 1341, 5, 145, 0, 0, 1341, 1342, 3, 166, 83, 0, 1342, 1343, 5, 146, 0, 0, 1343, 1379, 1, 0, 0, 0, 1344, 1345, 5, 120, 0, 0, 1345, 1346, 5, 145, 0, 0, 1346, 1347, 3, 148, 74, 0, 1347, 1348, 5, 146, 0, 0, 1348, 1379, 1, 0, 0, 0, 1349, 1350, 5, 121, 0, 0, 1350, 1351, 5, 145, 0, 0, 1351, 1352, 3, 148, 74, 0, 1352, 1353, 5, 146, 0, 0, 1353, 1379, 1, 0, 0, 0, 1354, 1355, 5, 122, 0, 0, 1355, 1359, 5, 139, 0, 0, 1356, 1358, 3, 150, 75, 0, 1357, 1356, 1, 0, 0, 0, 1358, 1361, 1, 0, 0, 0, 1359, 1357, 1, 0, 0, 0, 1359, 1360, 1, 0, 0, 0, 1360, 1362, 1, 0, 0, 0, 1361, 1359, 1, 0, 0, 0, 1362, 1379, 5, 140, 0, 0, 1363, 1364, 5, 8, 0, 0, 1364, 1365, 5, 86, 0, 0, 1365, 1366, 3, 168, 84, 0, 1366, 1368, 5, 139, 0, 0, 1367, 1369, 3, 152, 76, 0, 1368, 1367, 1, 0, 0, 0, 1369, 1370, 1, 0, 0, 0, 1370, 1368, 1, 0, 0, 0, 1370, 1371, 1, 0, 0, 0, 1371, 1372, 1, 0, 0, 0, 1372, 1373, 5, 140, 0, 0, 1373, 1379, 1, 0, 0, 0, 1374, 1376, 3, 166, 83, 0, 1375, 1377, 3, 28, 14, 0, 1376, 1375, 1, 0, 0, 0, 1376, 1377, 1, 0, 0, 0, 1377, 1379, 1, 0, 0, 0, 1378, 1321, 1, 0, 0, 0, 1378, 1322, 1, 0, 0, 0, 1378, 1323, 1, 0, 0, 0, 1378, 1324, 1, 0, 0, 0, 1378, 1326, 1, 0, 0, 0, 1378, 1331, 1, 0, 0, 0, 1378, 1339, 1, 0, 0, 0, 1378, 1344, 1, 0, 0, 0, 1378, 1349, 1, 0, 0, 0, 1378, 1354, 1, 0, 0, 0, 1378, 1363, 1, 0, 0, 0, 1378, 1374, 1, 0, 0, 0, 1379, 149, 1, 0, 0, 0, 1380, 1381, 3, 166, 83, 0, 1381, 1382, 5, 135, 0, 0, 1382, 1383, 3, 148, 74, 0, 1383, 1384, 5, 136, 0, 0, 1384, 151, 1, 0, 0, 0, 1385, 1386, 3, 166, 83, 0, 1386, 1387, 5, 86, 0, 0, 1387, 1388, 3, 168, 84, 0, 1388, 1389, 5, 135, 0, 0, 1389, 1390, 3, 148, 74, 0, 1390, 1391, 5, 136, 0, 0, 1391, 153, 1, 0, 0, 0, 1392, 1393, 7, 6, 0, 0, 1393, 155, 1, 0, 0, 0, 1394, 1395, 7, 7, 0, 0, 1395, 157, 1, 0, 0, 0, 1396, 1405, 3, 168, 84, 0, 1397, 1405, 5, 149, 0, 0, 1398, 1405, 5, 150, 0, 0, 1399, 1405, 5, 131, 0, 0, 1400, 1405, 5, 132, 0, 0, 1401, 1405, 5, 133, 0, 0, 1402, 1405, 3, 160, 80, 0, 1403, 1405, 3, 164, 82, 0, 1404, 1396, 1, 0, 0, 0, 1404, 1397, 1, 0, 0, 0, 1404, 1398, 1, 0, 0, 0, 1404, 1399, 1, 0, 0, 0, 1404, 1400, 1, 0, 0, 0, 1404, 1401, 1, 0, 0, 0, 1404, 1402, 1, 0, 0, 0, 1404, 1403, 1, 0, 0, 0, 1405, 159, 1, 0, 0, 0, 1406, 1415, 5, 139, 0, 0, 1407, 1412, 3, 162, 81, 0, 1408, 1409, 5, 137, 0, 0, 1409, 1411, 3, 162, 81, 0, 1410, 1408, 1, 0, 0, 0, 1411, 1414, 1, 0, 0, 0, 1412, 1410, 1, 0, 0, 0, 1412, 1413, 1, 0, 0, 0, 1413, 1416, 1, 0, 0, 0, 1414, 1412, 1, 0, 0, 0, 1415, 1407, 1, 0, 0, 0, 1415, 1416, 1, 0, 0, 0, 1416, 1417, 1, 0, 0, 0, 1417, 1418, 5, 140, 0, 0, 1418, 161, 1, 0, 0, 0, 1419, 1420, 3, 168, 84, 0, 1420, 1421, 5, 135, 0, 0, 1421, 1422, 3, 158, 79, 0, 1422, 163, 1, 0, 0, 0, 1423, 1432, 5, 141, 0, 0, 1424, 1429, 3, 158, 79, 0, 1425, 1426, 5, 137, 0, 0, 1426, 1428, 3, 158, 79, 0, 1427, 1425, 1, 0, 0, 0, 1428, 1431, 1, 0, 0, 0, 1429, 1427, 1, 0, 0, 0, 1429, 1430, 1, 0, 0, 0, 1430, 1433, 1, 0, 0, 0, 1431, 1429, 1, 0, 0, 0, 1432, 1424, 1, 0, 0, 0, 1432, 1433, 1, 0, 0, 0, 1433, 1434, 1, 0, 0, 0, 1434, 1435, 5, 142, 0, 0, 1435, 165, 1, 0, 0, 0, 1436, 1437, 7, 8, 0, 0, 1437, 167, 1, 0, 0, 0, 1438, 1439, 5, 152, 0, 0, 1439, 169, 1, 0, 0, 0, 129, 182, 189, 210, 223, 235, 255, 263, 270, 276, 288, 291, 297, 308, 317, 327, 330, 332, 336, 344, 356, 361, 371, 381, 386, 401, 407, 419, 428, 436, 444, 457, 460, 470, 474, 480, 487, 493, 501, 509, 522, 529, 533, 538, 549, 555, 566, 592, 596, 602, 613, 622, 628, 633, 635, 666, 670, 676, 703, 713, 724, 727, 732, 735, 738, 745, 754, 757, 760, 763, 786, 795, 809, 830, 833, 836, 843, 851, 883, 895, 898, 902, 924, 938, 946, 958, 972, 982, 1000, 1004, 1007, 1011, 1014, 1020, 1024, 1029, 1033, 1037, 1043, 1057, 1072, 1092, 1101, 1133, 1153, 1173, 1183, 1186, 1189, 1191, 1205, 1229, 1245, 1254, 1264, 1277, 1292, 1304, 1308, 1317, 1335, 1359, 1370, 1376, 1378, 1404, 1412, 1415, 1429, 1432] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapability.tokens b/src/capability-language/generated/QuixosCapability.tokens index c207cdc..548a5b5 100644 --- a/src/capability-language/generated/QuixosCapability.tokens +++ b/src/capability-language/generated/QuixosCapability.tokens @@ -5,152 +5,154 @@ PRESENTATION=4 SUBJECT=5 FOR=6 CREATION=7 -INITIALIZE=8 -WORKSPACE=9 -EXECUTION=10 -SNAPSHOT=11 -TRANSACTION=12 -REMOTE=13 -TARGETS=14 -PORTABLE=15 -REPLICA=16 -LOCAL=17 -FROM=18 -RESULT_BYTES=19 -RPC_CALLS=20 -DEADLINE_MS=21 -QUERY=22 -REFLECTION=23 -SPECIALIZE=24 -ROOT=25 -DOCUMENT=26 -FRAGMENTS=27 -VIEW=28 -MAX=29 -ALLOW=30 -POLL=31 -QUERYABLE=32 -RPC=33 -QUERY_REASON=34 -TYPE=35 -OBJECT=36 -STORABLE=37 -IMPLEMENTS=38 -REF=39 -FRAGMENT=40 -IMPORT=41 -EXTERNAL=42 -ATOM=43 -INTERFACE=44 -INTERFACES=45 -PACKAGE=46 -VALUE=47 -RELATION=48 -OPERATION=49 -FUNCTION=50 -CONSTRUCTOR=51 -CONSTRUCTS=52 -INPUT=53 -CONFORM=54 -AS=55 -BIND=56 -STATIC=57 -TO=58 -PRIVATE=59 -SHARED=60 -STATE=61 -EDGE=62 -PROJECTION=63 -WITH=64 -USING=65 -ACCEPT=66 -VIA=67 -MATERIALIZE=68 -IF=69 -ABSENT=70 -ON=71 -POLICY=72 -DEFAULT=73 -SOURCE=74 -REPOSITORY=75 -COMMIT=76 -REVISION=77 -SEMANTIC_MAJOR=78 -ON_DELETE=79 -LIFECYCLE=80 -RETAIN_OTHER=81 -KEYED=82 -PUBLIC_TRAVERSAL=83 -ID=84 -DOC=85 -MODE=86 -EMITS=87 -RECEIVER=88 -REQUIRES=89 -ANY=90 -GET=91 -SET=92 -WATCH=93 -START=94 -STOP=95 -READ=96 -WRITE=97 -RESOLVE=98 -CONNECT=99 -DISCONNECT=100 -CALL=101 -WATCH_START=102 -WATCH_STOP=103 -SUBSCRIBE=104 -UNSUBSCRIBE=105 -REGISTER=106 -CRDT=107 -OPTIONAL_ONE=108 -EXACTLY_ONE=109 -MANY_UNIQUE=110 -MANY=111 -ORDERED=112 -UNIT=113 -WATCH_HANDLE=114 -MESSAGE=115 -ATOM_REF=116 -INTERFACE_REF=117 -OPTIONAL=118 -LIST=119 -RECORD=120 -BOOL=121 -BYTES=122 -DOUBLE=123 -INT32=124 -INT64=125 -STRING=126 -UINT32=127 -UINT64=128 -TRUE=129 -FALSE=130 -NULL=131 -ARROW=132 -COLON=133 -SEMI=134 -COMMA=135 -DOT=136 -LBRACE=137 -RBRACE=138 -LBRACK=139 -RBRACK=140 -LPAREN=141 -RPAREN=142 -LT=143 -GT=144 -AMP=145 -EQUAL=146 -INTEGER=147 -JSON_NUMBER=148 -IDENTIFIER=149 -STRING_LITERAL=150 -LINE_COMMENT=151 -BLOCK_COMMENT=152 -WS=153 +VARIANT=8 +PREPARES=9 +INITIALIZE=10 +WORKSPACE=11 +EXECUTION=12 +SNAPSHOT=13 +TRANSACTION=14 +REMOTE=15 +TARGETS=16 +PORTABLE=17 +REPLICA=18 +LOCAL=19 +FROM=20 +RESULT_BYTES=21 +RPC_CALLS=22 +DEADLINE_MS=23 +QUERY=24 +REFLECTION=25 +SPECIALIZE=26 +ROOT=27 +DOCUMENT=28 +FRAGMENTS=29 +VIEW=30 +MAX=31 +ALLOW=32 +POLL=33 +QUERYABLE=34 +RPC=35 +QUERY_REASON=36 +TYPE=37 +OBJECT=38 +STORABLE=39 +IMPLEMENTS=40 +REF=41 +FRAGMENT=42 +IMPORT=43 +EXTERNAL=44 +ATOM=45 +INTERFACE=46 +INTERFACES=47 +PACKAGE=48 +VALUE=49 +RELATION=50 +OPERATION=51 +FUNCTION=52 +CONSTRUCTOR=53 +CONSTRUCTS=54 +INPUT=55 +CONFORM=56 +AS=57 +BIND=58 +STATIC=59 +TO=60 +PRIVATE=61 +SHARED=62 +STATE=63 +EDGE=64 +PROJECTION=65 +WITH=66 +USING=67 +ACCEPT=68 +VIA=69 +MATERIALIZE=70 +IF=71 +ABSENT=72 +ON=73 +POLICY=74 +DEFAULT=75 +SOURCE=76 +REPOSITORY=77 +COMMIT=78 +REVISION=79 +SEMANTIC_MAJOR=80 +ON_DELETE=81 +LIFECYCLE=82 +RETAIN_OTHER=83 +KEYED=84 +PUBLIC_TRAVERSAL=85 +ID=86 +DOC=87 +MODE=88 +EMITS=89 +RECEIVER=90 +REQUIRES=91 +ANY=92 +GET=93 +SET=94 +WATCH=95 +START=96 +STOP=97 +READ=98 +WRITE=99 +RESOLVE=100 +CONNECT=101 +DISCONNECT=102 +CALL=103 +WATCH_START=104 +WATCH_STOP=105 +SUBSCRIBE=106 +UNSUBSCRIBE=107 +REGISTER=108 +CRDT=109 +OPTIONAL_ONE=110 +EXACTLY_ONE=111 +MANY_UNIQUE=112 +MANY=113 +ORDERED=114 +UNIT=115 +WATCH_HANDLE=116 +MESSAGE=117 +ATOM_REF=118 +INTERFACE_REF=119 +OPTIONAL=120 +LIST=121 +RECORD=122 +BOOL=123 +BYTES=124 +DOUBLE=125 +INT32=126 +INT64=127 +STRING=128 +UINT32=129 +UINT64=130 +TRUE=131 +FALSE=132 +NULL=133 +ARROW=134 +COLON=135 +SEMI=136 +COMMA=137 +DOT=138 +LBRACE=139 +RBRACE=140 +LBRACK=141 +RBRACK=142 +LPAREN=143 +RPAREN=144 +LT=145 +GT=146 +AMP=147 +EQUAL=148 +INTEGER=149 +JSON_NUMBER=150 +IDENTIFIER=151 +STRING_LITERAL=152 +LINE_COMMENT=153 +BLOCK_COMMENT=154 +WS=155 'edit'=1 'module'=2 'contract'=3 @@ -158,142 +160,144 @@ WS=153 'subject'=5 'for'=6 'creation'=7 -'initialize'=8 -'workspace'=9 -'execution'=10 -'snapshot'=11 -'transaction'=12 -'remote'=13 -'targets'=14 -'portable'=15 -'replica'=16 -'local'=17 -'from'=18 -'result-bytes'=19 -'rpc-calls'=20 -'deadline-ms'=21 -'query'=22 -'reflection'=23 -'specialize'=24 -'root'=25 -'document'=26 -'fragments'=27 -'view'=28 -'max'=29 -'allow'=30 -'poll'=31 -'queryable'=32 -'rpc'=33 -'query-reason'=34 -'type'=35 -'object'=36 -'storable'=37 -'implements'=38 -'ref'=39 -'fragment'=40 -'import'=41 -'external'=42 -'atom'=43 -'interface'=44 -'interfaces'=45 -'package'=46 -'value'=47 -'relation'=48 -'operation'=49 -'function'=50 -'constructor'=51 -'constructs'=52 -'input'=53 -'conform'=54 -'as'=55 -'bind'=56 -'static'=57 -'to'=58 -'private'=59 -'shared'=60 -'state'=61 -'edge'=62 -'projection'=63 -'with'=64 -'using'=65 -'accept'=66 -'via'=67 -'materialize'=68 -'if'=69 -'absent'=70 -'on'=71 -'policy'=72 -'default'=73 -'source'=74 -'repository'=75 -'commit'=76 -'revision'=77 -'semantic-major'=78 -'on-delete'=79 -'lifecycle'=80 -'retain-other'=81 -'keyed'=82 -'public-traversal'=83 -'id'=84 -'doc'=85 -'mode'=86 -'emits'=87 -'receiver'=88 -'requires'=89 -'any'=90 -'get'=91 -'set'=92 -'watch'=93 -'start'=94 -'stop'=95 -'read'=96 -'write'=97 -'resolve'=98 -'connect'=99 -'disconnect'=100 -'call'=101 -'watch-start'=102 -'watch-stop'=103 -'subscribe'=104 -'unsubscribe'=105 -'register'=106 -'crdt'=107 -'optional-one'=108 -'exactly-one'=109 -'many-unique'=110 -'many'=111 -'ordered'=112 -'unit'=113 -'watch-handle'=114 -'message'=115 -'atom-ref'=116 -'interface-ref'=117 -'optional'=118 -'list'=119 -'record'=120 -'bool'=121 -'bytes'=122 -'double'=123 -'int32'=124 -'int64'=125 -'string'=126 -'uint32'=127 -'uint64'=128 -'true'=129 -'false'=130 -'null'=131 -'->'=132 -':'=133 -';'=134 -','=135 -'.'=136 -'{'=137 -'}'=138 -'['=139 -']'=140 -'('=141 -')'=142 -'<'=143 -'>'=144 -'&'=145 -'='=146 +'variant'=8 +'prepares'=9 +'initialize'=10 +'workspace'=11 +'execution'=12 +'snapshot'=13 +'transaction'=14 +'remote'=15 +'targets'=16 +'portable'=17 +'replica'=18 +'local'=19 +'from'=20 +'result-bytes'=21 +'rpc-calls'=22 +'deadline-ms'=23 +'query'=24 +'reflection'=25 +'specialize'=26 +'root'=27 +'document'=28 +'fragments'=29 +'view'=30 +'max'=31 +'allow'=32 +'poll'=33 +'queryable'=34 +'rpc'=35 +'query-reason'=36 +'type'=37 +'object'=38 +'storable'=39 +'implements'=40 +'ref'=41 +'fragment'=42 +'import'=43 +'external'=44 +'atom'=45 +'interface'=46 +'interfaces'=47 +'package'=48 +'value'=49 +'relation'=50 +'operation'=51 +'function'=52 +'constructor'=53 +'constructs'=54 +'input'=55 +'conform'=56 +'as'=57 +'bind'=58 +'static'=59 +'to'=60 +'private'=61 +'shared'=62 +'state'=63 +'edge'=64 +'projection'=65 +'with'=66 +'using'=67 +'accept'=68 +'via'=69 +'materialize'=70 +'if'=71 +'absent'=72 +'on'=73 +'policy'=74 +'default'=75 +'source'=76 +'repository'=77 +'commit'=78 +'revision'=79 +'semantic-major'=80 +'on-delete'=81 +'lifecycle'=82 +'retain-other'=83 +'keyed'=84 +'public-traversal'=85 +'id'=86 +'doc'=87 +'mode'=88 +'emits'=89 +'receiver'=90 +'requires'=91 +'any'=92 +'get'=93 +'set'=94 +'watch'=95 +'start'=96 +'stop'=97 +'read'=98 +'write'=99 +'resolve'=100 +'connect'=101 +'disconnect'=102 +'call'=103 +'watch-start'=104 +'watch-stop'=105 +'subscribe'=106 +'unsubscribe'=107 +'register'=108 +'crdt'=109 +'optional-one'=110 +'exactly-one'=111 +'many-unique'=112 +'many'=113 +'ordered'=114 +'unit'=115 +'watch-handle'=116 +'message'=117 +'atom-ref'=118 +'interface-ref'=119 +'optional'=120 +'list'=121 +'record'=122 +'bool'=123 +'bytes'=124 +'double'=125 +'int32'=126 +'int64'=127 +'string'=128 +'uint32'=129 +'uint64'=130 +'true'=131 +'false'=132 +'null'=133 +'->'=134 +':'=135 +';'=136 +','=137 +'.'=138 +'{'=139 +'}'=140 +'['=141 +']'=142 +'('=143 +')'=144 +'<'=145 +'>'=146 +'&'=147 +'='=148 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.interp b/src/capability-language/generated/QuixosCapabilityLexer.interp index 9dcc4f5..3354218 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.interp +++ b/src/capability-language/generated/QuixosCapabilityLexer.interp @@ -7,6 +7,8 @@ null 'subject' 'for' 'creation' +'variant' +'prepares' 'initialize' 'workspace' 'execution' @@ -163,6 +165,8 @@ PRESENTATION SUBJECT FOR CREATION +VARIANT +PREPARES INITIALIZE WORKSPACE EXECUTION @@ -318,6 +322,8 @@ PRESENTATION SUBJECT FOR CREATION +VARIANT +PREPARES INITIALIZE WORKSPACE EXECUTION @@ -475,4 +481,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 153, 1469, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 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, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 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, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 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, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 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, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 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, 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, 33, 1, 33, 1, 33, 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, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 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, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 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, 44, 1, 44, 1, 44, 1, 44, 1, 44, 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, 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, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 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, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 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, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 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, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 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, 65, 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, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 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, 73, 1, 74, 1, 74, 1, 74, 1, 74, 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, 75, 1, 76, 1, 76, 1, 76, 1, 76, 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, 77, 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, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 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, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 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, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 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, 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, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 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, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 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, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 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, 103, 1, 103, 1, 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, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 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, 144, 1, 144, 1, 145, 1, 145, 1, 146, 3, 146, 1370, 8, 146, 1, 146, 4, 146, 1373, 8, 146, 11, 146, 12, 146, 1374, 1, 147, 3, 147, 1378, 8, 147, 1, 147, 1, 147, 1, 147, 5, 147, 1383, 8, 147, 10, 147, 12, 147, 1386, 9, 147, 3, 147, 1388, 8, 147, 1, 147, 1, 147, 4, 147, 1392, 8, 147, 11, 147, 12, 147, 1393, 3, 147, 1396, 8, 147, 1, 147, 1, 147, 3, 147, 1400, 8, 147, 1, 147, 4, 147, 1403, 8, 147, 11, 147, 12, 147, 1404, 3, 147, 1407, 8, 147, 1, 148, 1, 148, 5, 148, 1411, 8, 148, 10, 148, 12, 148, 1414, 9, 148, 1, 149, 1, 149, 1, 149, 5, 149, 1419, 8, 149, 10, 149, 12, 149, 1422, 9, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 1, 150, 3, 150, 1434, 8, 150, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 5, 152, 1442, 8, 152, 10, 152, 12, 152, 1445, 9, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 5, 153, 1453, 8, 153, 10, 153, 12, 153, 1456, 9, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 154, 4, 154, 1464, 8, 154, 11, 154, 12, 154, 1465, 1, 154, 1, 154, 1, 1454, 0, 155, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 143, 287, 144, 289, 145, 291, 146, 293, 147, 295, 148, 297, 149, 299, 150, 301, 0, 303, 0, 305, 151, 307, 152, 309, 153, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1483, 0, 1, 1, 0, 0, 0, 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, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 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, 305, 1, 0, 0, 0, 0, 307, 1, 0, 0, 0, 0, 309, 1, 0, 0, 0, 1, 311, 1, 0, 0, 0, 3, 316, 1, 0, 0, 0, 5, 323, 1, 0, 0, 0, 7, 332, 1, 0, 0, 0, 9, 345, 1, 0, 0, 0, 11, 353, 1, 0, 0, 0, 13, 357, 1, 0, 0, 0, 15, 366, 1, 0, 0, 0, 17, 377, 1, 0, 0, 0, 19, 387, 1, 0, 0, 0, 21, 397, 1, 0, 0, 0, 23, 406, 1, 0, 0, 0, 25, 418, 1, 0, 0, 0, 27, 425, 1, 0, 0, 0, 29, 433, 1, 0, 0, 0, 31, 442, 1, 0, 0, 0, 33, 450, 1, 0, 0, 0, 35, 456, 1, 0, 0, 0, 37, 461, 1, 0, 0, 0, 39, 474, 1, 0, 0, 0, 41, 484, 1, 0, 0, 0, 43, 496, 1, 0, 0, 0, 45, 502, 1, 0, 0, 0, 47, 513, 1, 0, 0, 0, 49, 524, 1, 0, 0, 0, 51, 529, 1, 0, 0, 0, 53, 538, 1, 0, 0, 0, 55, 548, 1, 0, 0, 0, 57, 553, 1, 0, 0, 0, 59, 557, 1, 0, 0, 0, 61, 563, 1, 0, 0, 0, 63, 568, 1, 0, 0, 0, 65, 578, 1, 0, 0, 0, 67, 582, 1, 0, 0, 0, 69, 595, 1, 0, 0, 0, 71, 600, 1, 0, 0, 0, 73, 607, 1, 0, 0, 0, 75, 616, 1, 0, 0, 0, 77, 627, 1, 0, 0, 0, 79, 631, 1, 0, 0, 0, 81, 640, 1, 0, 0, 0, 83, 647, 1, 0, 0, 0, 85, 656, 1, 0, 0, 0, 87, 661, 1, 0, 0, 0, 89, 671, 1, 0, 0, 0, 91, 682, 1, 0, 0, 0, 93, 690, 1, 0, 0, 0, 95, 696, 1, 0, 0, 0, 97, 705, 1, 0, 0, 0, 99, 715, 1, 0, 0, 0, 101, 724, 1, 0, 0, 0, 103, 736, 1, 0, 0, 0, 105, 747, 1, 0, 0, 0, 107, 753, 1, 0, 0, 0, 109, 761, 1, 0, 0, 0, 111, 764, 1, 0, 0, 0, 113, 769, 1, 0, 0, 0, 115, 776, 1, 0, 0, 0, 117, 779, 1, 0, 0, 0, 119, 787, 1, 0, 0, 0, 121, 794, 1, 0, 0, 0, 123, 800, 1, 0, 0, 0, 125, 805, 1, 0, 0, 0, 127, 816, 1, 0, 0, 0, 129, 821, 1, 0, 0, 0, 131, 827, 1, 0, 0, 0, 133, 834, 1, 0, 0, 0, 135, 838, 1, 0, 0, 0, 137, 850, 1, 0, 0, 0, 139, 853, 1, 0, 0, 0, 141, 860, 1, 0, 0, 0, 143, 863, 1, 0, 0, 0, 145, 870, 1, 0, 0, 0, 147, 878, 1, 0, 0, 0, 149, 885, 1, 0, 0, 0, 151, 896, 1, 0, 0, 0, 153, 903, 1, 0, 0, 0, 155, 912, 1, 0, 0, 0, 157, 927, 1, 0, 0, 0, 159, 937, 1, 0, 0, 0, 161, 947, 1, 0, 0, 0, 163, 960, 1, 0, 0, 0, 165, 966, 1, 0, 0, 0, 167, 983, 1, 0, 0, 0, 169, 986, 1, 0, 0, 0, 171, 990, 1, 0, 0, 0, 173, 995, 1, 0, 0, 0, 175, 1001, 1, 0, 0, 0, 177, 1010, 1, 0, 0, 0, 179, 1019, 1, 0, 0, 0, 181, 1023, 1, 0, 0, 0, 183, 1027, 1, 0, 0, 0, 185, 1031, 1, 0, 0, 0, 187, 1037, 1, 0, 0, 0, 189, 1043, 1, 0, 0, 0, 191, 1048, 1, 0, 0, 0, 193, 1053, 1, 0, 0, 0, 195, 1059, 1, 0, 0, 0, 197, 1067, 1, 0, 0, 0, 199, 1075, 1, 0, 0, 0, 201, 1086, 1, 0, 0, 0, 203, 1091, 1, 0, 0, 0, 205, 1103, 1, 0, 0, 0, 207, 1114, 1, 0, 0, 0, 209, 1124, 1, 0, 0, 0, 211, 1136, 1, 0, 0, 0, 213, 1145, 1, 0, 0, 0, 215, 1150, 1, 0, 0, 0, 217, 1163, 1, 0, 0, 0, 219, 1175, 1, 0, 0, 0, 221, 1187, 1, 0, 0, 0, 223, 1192, 1, 0, 0, 0, 225, 1200, 1, 0, 0, 0, 227, 1205, 1, 0, 0, 0, 229, 1218, 1, 0, 0, 0, 231, 1226, 1, 0, 0, 0, 233, 1235, 1, 0, 0, 0, 235, 1249, 1, 0, 0, 0, 237, 1258, 1, 0, 0, 0, 239, 1263, 1, 0, 0, 0, 241, 1270, 1, 0, 0, 0, 243, 1275, 1, 0, 0, 0, 245, 1281, 1, 0, 0, 0, 247, 1288, 1, 0, 0, 0, 249, 1294, 1, 0, 0, 0, 251, 1300, 1, 0, 0, 0, 253, 1307, 1, 0, 0, 0, 255, 1314, 1, 0, 0, 0, 257, 1321, 1, 0, 0, 0, 259, 1326, 1, 0, 0, 0, 261, 1332, 1, 0, 0, 0, 263, 1337, 1, 0, 0, 0, 265, 1340, 1, 0, 0, 0, 267, 1342, 1, 0, 0, 0, 269, 1344, 1, 0, 0, 0, 271, 1346, 1, 0, 0, 0, 273, 1348, 1, 0, 0, 0, 275, 1350, 1, 0, 0, 0, 277, 1352, 1, 0, 0, 0, 279, 1354, 1, 0, 0, 0, 281, 1356, 1, 0, 0, 0, 283, 1358, 1, 0, 0, 0, 285, 1360, 1, 0, 0, 0, 287, 1362, 1, 0, 0, 0, 289, 1364, 1, 0, 0, 0, 291, 1366, 1, 0, 0, 0, 293, 1369, 1, 0, 0, 0, 295, 1377, 1, 0, 0, 0, 297, 1408, 1, 0, 0, 0, 299, 1415, 1, 0, 0, 0, 301, 1425, 1, 0, 0, 0, 303, 1435, 1, 0, 0, 0, 305, 1437, 1, 0, 0, 0, 307, 1448, 1, 0, 0, 0, 309, 1463, 1, 0, 0, 0, 311, 312, 5, 101, 0, 0, 312, 313, 5, 100, 0, 0, 313, 314, 5, 105, 0, 0, 314, 315, 5, 116, 0, 0, 315, 2, 1, 0, 0, 0, 316, 317, 5, 109, 0, 0, 317, 318, 5, 111, 0, 0, 318, 319, 5, 100, 0, 0, 319, 320, 5, 117, 0, 0, 320, 321, 5, 108, 0, 0, 321, 322, 5, 101, 0, 0, 322, 4, 1, 0, 0, 0, 323, 324, 5, 99, 0, 0, 324, 325, 5, 111, 0, 0, 325, 326, 5, 110, 0, 0, 326, 327, 5, 116, 0, 0, 327, 328, 5, 114, 0, 0, 328, 329, 5, 97, 0, 0, 329, 330, 5, 99, 0, 0, 330, 331, 5, 116, 0, 0, 331, 6, 1, 0, 0, 0, 332, 333, 5, 112, 0, 0, 333, 334, 5, 114, 0, 0, 334, 335, 5, 101, 0, 0, 335, 336, 5, 115, 0, 0, 336, 337, 5, 101, 0, 0, 337, 338, 5, 110, 0, 0, 338, 339, 5, 116, 0, 0, 339, 340, 5, 97, 0, 0, 340, 341, 5, 116, 0, 0, 341, 342, 5, 105, 0, 0, 342, 343, 5, 111, 0, 0, 343, 344, 5, 110, 0, 0, 344, 8, 1, 0, 0, 0, 345, 346, 5, 115, 0, 0, 346, 347, 5, 117, 0, 0, 347, 348, 5, 98, 0, 0, 348, 349, 5, 106, 0, 0, 349, 350, 5, 101, 0, 0, 350, 351, 5, 99, 0, 0, 351, 352, 5, 116, 0, 0, 352, 10, 1, 0, 0, 0, 353, 354, 5, 102, 0, 0, 354, 355, 5, 111, 0, 0, 355, 356, 5, 114, 0, 0, 356, 12, 1, 0, 0, 0, 357, 358, 5, 99, 0, 0, 358, 359, 5, 114, 0, 0, 359, 360, 5, 101, 0, 0, 360, 361, 5, 97, 0, 0, 361, 362, 5, 116, 0, 0, 362, 363, 5, 105, 0, 0, 363, 364, 5, 111, 0, 0, 364, 365, 5, 110, 0, 0, 365, 14, 1, 0, 0, 0, 366, 367, 5, 105, 0, 0, 367, 368, 5, 110, 0, 0, 368, 369, 5, 105, 0, 0, 369, 370, 5, 116, 0, 0, 370, 371, 5, 105, 0, 0, 371, 372, 5, 97, 0, 0, 372, 373, 5, 108, 0, 0, 373, 374, 5, 105, 0, 0, 374, 375, 5, 122, 0, 0, 375, 376, 5, 101, 0, 0, 376, 16, 1, 0, 0, 0, 377, 378, 5, 119, 0, 0, 378, 379, 5, 111, 0, 0, 379, 380, 5, 114, 0, 0, 380, 381, 5, 107, 0, 0, 381, 382, 5, 115, 0, 0, 382, 383, 5, 112, 0, 0, 383, 384, 5, 97, 0, 0, 384, 385, 5, 99, 0, 0, 385, 386, 5, 101, 0, 0, 386, 18, 1, 0, 0, 0, 387, 388, 5, 101, 0, 0, 388, 389, 5, 120, 0, 0, 389, 390, 5, 101, 0, 0, 390, 391, 5, 99, 0, 0, 391, 392, 5, 117, 0, 0, 392, 393, 5, 116, 0, 0, 393, 394, 5, 105, 0, 0, 394, 395, 5, 111, 0, 0, 395, 396, 5, 110, 0, 0, 396, 20, 1, 0, 0, 0, 397, 398, 5, 115, 0, 0, 398, 399, 5, 110, 0, 0, 399, 400, 5, 97, 0, 0, 400, 401, 5, 112, 0, 0, 401, 402, 5, 115, 0, 0, 402, 403, 5, 104, 0, 0, 403, 404, 5, 111, 0, 0, 404, 405, 5, 116, 0, 0, 405, 22, 1, 0, 0, 0, 406, 407, 5, 116, 0, 0, 407, 408, 5, 114, 0, 0, 408, 409, 5, 97, 0, 0, 409, 410, 5, 110, 0, 0, 410, 411, 5, 115, 0, 0, 411, 412, 5, 97, 0, 0, 412, 413, 5, 99, 0, 0, 413, 414, 5, 116, 0, 0, 414, 415, 5, 105, 0, 0, 415, 416, 5, 111, 0, 0, 416, 417, 5, 110, 0, 0, 417, 24, 1, 0, 0, 0, 418, 419, 5, 114, 0, 0, 419, 420, 5, 101, 0, 0, 420, 421, 5, 109, 0, 0, 421, 422, 5, 111, 0, 0, 422, 423, 5, 116, 0, 0, 423, 424, 5, 101, 0, 0, 424, 26, 1, 0, 0, 0, 425, 426, 5, 116, 0, 0, 426, 427, 5, 97, 0, 0, 427, 428, 5, 114, 0, 0, 428, 429, 5, 103, 0, 0, 429, 430, 5, 101, 0, 0, 430, 431, 5, 116, 0, 0, 431, 432, 5, 115, 0, 0, 432, 28, 1, 0, 0, 0, 433, 434, 5, 112, 0, 0, 434, 435, 5, 111, 0, 0, 435, 436, 5, 114, 0, 0, 436, 437, 5, 116, 0, 0, 437, 438, 5, 97, 0, 0, 438, 439, 5, 98, 0, 0, 439, 440, 5, 108, 0, 0, 440, 441, 5, 101, 0, 0, 441, 30, 1, 0, 0, 0, 442, 443, 5, 114, 0, 0, 443, 444, 5, 101, 0, 0, 444, 445, 5, 112, 0, 0, 445, 446, 5, 108, 0, 0, 446, 447, 5, 105, 0, 0, 447, 448, 5, 99, 0, 0, 448, 449, 5, 97, 0, 0, 449, 32, 1, 0, 0, 0, 450, 451, 5, 108, 0, 0, 451, 452, 5, 111, 0, 0, 452, 453, 5, 99, 0, 0, 453, 454, 5, 97, 0, 0, 454, 455, 5, 108, 0, 0, 455, 34, 1, 0, 0, 0, 456, 457, 5, 102, 0, 0, 457, 458, 5, 114, 0, 0, 458, 459, 5, 111, 0, 0, 459, 460, 5, 109, 0, 0, 460, 36, 1, 0, 0, 0, 461, 462, 5, 114, 0, 0, 462, 463, 5, 101, 0, 0, 463, 464, 5, 115, 0, 0, 464, 465, 5, 117, 0, 0, 465, 466, 5, 108, 0, 0, 466, 467, 5, 116, 0, 0, 467, 468, 5, 45, 0, 0, 468, 469, 5, 98, 0, 0, 469, 470, 5, 121, 0, 0, 470, 471, 5, 116, 0, 0, 471, 472, 5, 101, 0, 0, 472, 473, 5, 115, 0, 0, 473, 38, 1, 0, 0, 0, 474, 475, 5, 114, 0, 0, 475, 476, 5, 112, 0, 0, 476, 477, 5, 99, 0, 0, 477, 478, 5, 45, 0, 0, 478, 479, 5, 99, 0, 0, 479, 480, 5, 97, 0, 0, 480, 481, 5, 108, 0, 0, 481, 482, 5, 108, 0, 0, 482, 483, 5, 115, 0, 0, 483, 40, 1, 0, 0, 0, 484, 485, 5, 100, 0, 0, 485, 486, 5, 101, 0, 0, 486, 487, 5, 97, 0, 0, 487, 488, 5, 100, 0, 0, 488, 489, 5, 108, 0, 0, 489, 490, 5, 105, 0, 0, 490, 491, 5, 110, 0, 0, 491, 492, 5, 101, 0, 0, 492, 493, 5, 45, 0, 0, 493, 494, 5, 109, 0, 0, 494, 495, 5, 115, 0, 0, 495, 42, 1, 0, 0, 0, 496, 497, 5, 113, 0, 0, 497, 498, 5, 117, 0, 0, 498, 499, 5, 101, 0, 0, 499, 500, 5, 114, 0, 0, 500, 501, 5, 121, 0, 0, 501, 44, 1, 0, 0, 0, 502, 503, 5, 114, 0, 0, 503, 504, 5, 101, 0, 0, 504, 505, 5, 102, 0, 0, 505, 506, 5, 108, 0, 0, 506, 507, 5, 101, 0, 0, 507, 508, 5, 99, 0, 0, 508, 509, 5, 116, 0, 0, 509, 510, 5, 105, 0, 0, 510, 511, 5, 111, 0, 0, 511, 512, 5, 110, 0, 0, 512, 46, 1, 0, 0, 0, 513, 514, 5, 115, 0, 0, 514, 515, 5, 112, 0, 0, 515, 516, 5, 101, 0, 0, 516, 517, 5, 99, 0, 0, 517, 518, 5, 105, 0, 0, 518, 519, 5, 97, 0, 0, 519, 520, 5, 108, 0, 0, 520, 521, 5, 105, 0, 0, 521, 522, 5, 122, 0, 0, 522, 523, 5, 101, 0, 0, 523, 48, 1, 0, 0, 0, 524, 525, 5, 114, 0, 0, 525, 526, 5, 111, 0, 0, 526, 527, 5, 111, 0, 0, 527, 528, 5, 116, 0, 0, 528, 50, 1, 0, 0, 0, 529, 530, 5, 100, 0, 0, 530, 531, 5, 111, 0, 0, 531, 532, 5, 99, 0, 0, 532, 533, 5, 117, 0, 0, 533, 534, 5, 109, 0, 0, 534, 535, 5, 101, 0, 0, 535, 536, 5, 110, 0, 0, 536, 537, 5, 116, 0, 0, 537, 52, 1, 0, 0, 0, 538, 539, 5, 102, 0, 0, 539, 540, 5, 114, 0, 0, 540, 541, 5, 97, 0, 0, 541, 542, 5, 103, 0, 0, 542, 543, 5, 109, 0, 0, 543, 544, 5, 101, 0, 0, 544, 545, 5, 110, 0, 0, 545, 546, 5, 116, 0, 0, 546, 547, 5, 115, 0, 0, 547, 54, 1, 0, 0, 0, 548, 549, 5, 118, 0, 0, 549, 550, 5, 105, 0, 0, 550, 551, 5, 101, 0, 0, 551, 552, 5, 119, 0, 0, 552, 56, 1, 0, 0, 0, 553, 554, 5, 109, 0, 0, 554, 555, 5, 97, 0, 0, 555, 556, 5, 120, 0, 0, 556, 58, 1, 0, 0, 0, 557, 558, 5, 97, 0, 0, 558, 559, 5, 108, 0, 0, 559, 560, 5, 108, 0, 0, 560, 561, 5, 111, 0, 0, 561, 562, 5, 119, 0, 0, 562, 60, 1, 0, 0, 0, 563, 564, 5, 112, 0, 0, 564, 565, 5, 111, 0, 0, 565, 566, 5, 108, 0, 0, 566, 567, 5, 108, 0, 0, 567, 62, 1, 0, 0, 0, 568, 569, 5, 113, 0, 0, 569, 570, 5, 117, 0, 0, 570, 571, 5, 101, 0, 0, 571, 572, 5, 114, 0, 0, 572, 573, 5, 121, 0, 0, 573, 574, 5, 97, 0, 0, 574, 575, 5, 98, 0, 0, 575, 576, 5, 108, 0, 0, 576, 577, 5, 101, 0, 0, 577, 64, 1, 0, 0, 0, 578, 579, 5, 114, 0, 0, 579, 580, 5, 112, 0, 0, 580, 581, 5, 99, 0, 0, 581, 66, 1, 0, 0, 0, 582, 583, 5, 113, 0, 0, 583, 584, 5, 117, 0, 0, 584, 585, 5, 101, 0, 0, 585, 586, 5, 114, 0, 0, 586, 587, 5, 121, 0, 0, 587, 588, 5, 45, 0, 0, 588, 589, 5, 114, 0, 0, 589, 590, 5, 101, 0, 0, 590, 591, 5, 97, 0, 0, 591, 592, 5, 115, 0, 0, 592, 593, 5, 111, 0, 0, 593, 594, 5, 110, 0, 0, 594, 68, 1, 0, 0, 0, 595, 596, 5, 116, 0, 0, 596, 597, 5, 121, 0, 0, 597, 598, 5, 112, 0, 0, 598, 599, 5, 101, 0, 0, 599, 70, 1, 0, 0, 0, 600, 601, 5, 111, 0, 0, 601, 602, 5, 98, 0, 0, 602, 603, 5, 106, 0, 0, 603, 604, 5, 101, 0, 0, 604, 605, 5, 99, 0, 0, 605, 606, 5, 116, 0, 0, 606, 72, 1, 0, 0, 0, 607, 608, 5, 115, 0, 0, 608, 609, 5, 116, 0, 0, 609, 610, 5, 111, 0, 0, 610, 611, 5, 114, 0, 0, 611, 612, 5, 97, 0, 0, 612, 613, 5, 98, 0, 0, 613, 614, 5, 108, 0, 0, 614, 615, 5, 101, 0, 0, 615, 74, 1, 0, 0, 0, 616, 617, 5, 105, 0, 0, 617, 618, 5, 109, 0, 0, 618, 619, 5, 112, 0, 0, 619, 620, 5, 108, 0, 0, 620, 621, 5, 101, 0, 0, 621, 622, 5, 109, 0, 0, 622, 623, 5, 101, 0, 0, 623, 624, 5, 110, 0, 0, 624, 625, 5, 116, 0, 0, 625, 626, 5, 115, 0, 0, 626, 76, 1, 0, 0, 0, 627, 628, 5, 114, 0, 0, 628, 629, 5, 101, 0, 0, 629, 630, 5, 102, 0, 0, 630, 78, 1, 0, 0, 0, 631, 632, 5, 102, 0, 0, 632, 633, 5, 114, 0, 0, 633, 634, 5, 97, 0, 0, 634, 635, 5, 103, 0, 0, 635, 636, 5, 109, 0, 0, 636, 637, 5, 101, 0, 0, 637, 638, 5, 110, 0, 0, 638, 639, 5, 116, 0, 0, 639, 80, 1, 0, 0, 0, 640, 641, 5, 105, 0, 0, 641, 642, 5, 109, 0, 0, 642, 643, 5, 112, 0, 0, 643, 644, 5, 111, 0, 0, 644, 645, 5, 114, 0, 0, 645, 646, 5, 116, 0, 0, 646, 82, 1, 0, 0, 0, 647, 648, 5, 101, 0, 0, 648, 649, 5, 120, 0, 0, 649, 650, 5, 116, 0, 0, 650, 651, 5, 101, 0, 0, 651, 652, 5, 114, 0, 0, 652, 653, 5, 110, 0, 0, 653, 654, 5, 97, 0, 0, 654, 655, 5, 108, 0, 0, 655, 84, 1, 0, 0, 0, 656, 657, 5, 97, 0, 0, 657, 658, 5, 116, 0, 0, 658, 659, 5, 111, 0, 0, 659, 660, 5, 109, 0, 0, 660, 86, 1, 0, 0, 0, 661, 662, 5, 105, 0, 0, 662, 663, 5, 110, 0, 0, 663, 664, 5, 116, 0, 0, 664, 665, 5, 101, 0, 0, 665, 666, 5, 114, 0, 0, 666, 667, 5, 102, 0, 0, 667, 668, 5, 97, 0, 0, 668, 669, 5, 99, 0, 0, 669, 670, 5, 101, 0, 0, 670, 88, 1, 0, 0, 0, 671, 672, 5, 105, 0, 0, 672, 673, 5, 110, 0, 0, 673, 674, 5, 116, 0, 0, 674, 675, 5, 101, 0, 0, 675, 676, 5, 114, 0, 0, 676, 677, 5, 102, 0, 0, 677, 678, 5, 97, 0, 0, 678, 679, 5, 99, 0, 0, 679, 680, 5, 101, 0, 0, 680, 681, 5, 115, 0, 0, 681, 90, 1, 0, 0, 0, 682, 683, 5, 112, 0, 0, 683, 684, 5, 97, 0, 0, 684, 685, 5, 99, 0, 0, 685, 686, 5, 107, 0, 0, 686, 687, 5, 97, 0, 0, 687, 688, 5, 103, 0, 0, 688, 689, 5, 101, 0, 0, 689, 92, 1, 0, 0, 0, 690, 691, 5, 118, 0, 0, 691, 692, 5, 97, 0, 0, 692, 693, 5, 108, 0, 0, 693, 694, 5, 117, 0, 0, 694, 695, 5, 101, 0, 0, 695, 94, 1, 0, 0, 0, 696, 697, 5, 114, 0, 0, 697, 698, 5, 101, 0, 0, 698, 699, 5, 108, 0, 0, 699, 700, 5, 97, 0, 0, 700, 701, 5, 116, 0, 0, 701, 702, 5, 105, 0, 0, 702, 703, 5, 111, 0, 0, 703, 704, 5, 110, 0, 0, 704, 96, 1, 0, 0, 0, 705, 706, 5, 111, 0, 0, 706, 707, 5, 112, 0, 0, 707, 708, 5, 101, 0, 0, 708, 709, 5, 114, 0, 0, 709, 710, 5, 97, 0, 0, 710, 711, 5, 116, 0, 0, 711, 712, 5, 105, 0, 0, 712, 713, 5, 111, 0, 0, 713, 714, 5, 110, 0, 0, 714, 98, 1, 0, 0, 0, 715, 716, 5, 102, 0, 0, 716, 717, 5, 117, 0, 0, 717, 718, 5, 110, 0, 0, 718, 719, 5, 99, 0, 0, 719, 720, 5, 116, 0, 0, 720, 721, 5, 105, 0, 0, 721, 722, 5, 111, 0, 0, 722, 723, 5, 110, 0, 0, 723, 100, 1, 0, 0, 0, 724, 725, 5, 99, 0, 0, 725, 726, 5, 111, 0, 0, 726, 727, 5, 110, 0, 0, 727, 728, 5, 115, 0, 0, 728, 729, 5, 116, 0, 0, 729, 730, 5, 114, 0, 0, 730, 731, 5, 117, 0, 0, 731, 732, 5, 99, 0, 0, 732, 733, 5, 116, 0, 0, 733, 734, 5, 111, 0, 0, 734, 735, 5, 114, 0, 0, 735, 102, 1, 0, 0, 0, 736, 737, 5, 99, 0, 0, 737, 738, 5, 111, 0, 0, 738, 739, 5, 110, 0, 0, 739, 740, 5, 115, 0, 0, 740, 741, 5, 116, 0, 0, 741, 742, 5, 114, 0, 0, 742, 743, 5, 117, 0, 0, 743, 744, 5, 99, 0, 0, 744, 745, 5, 116, 0, 0, 745, 746, 5, 115, 0, 0, 746, 104, 1, 0, 0, 0, 747, 748, 5, 105, 0, 0, 748, 749, 5, 110, 0, 0, 749, 750, 5, 112, 0, 0, 750, 751, 5, 117, 0, 0, 751, 752, 5, 116, 0, 0, 752, 106, 1, 0, 0, 0, 753, 754, 5, 99, 0, 0, 754, 755, 5, 111, 0, 0, 755, 756, 5, 110, 0, 0, 756, 757, 5, 102, 0, 0, 757, 758, 5, 111, 0, 0, 758, 759, 5, 114, 0, 0, 759, 760, 5, 109, 0, 0, 760, 108, 1, 0, 0, 0, 761, 762, 5, 97, 0, 0, 762, 763, 5, 115, 0, 0, 763, 110, 1, 0, 0, 0, 764, 765, 5, 98, 0, 0, 765, 766, 5, 105, 0, 0, 766, 767, 5, 110, 0, 0, 767, 768, 5, 100, 0, 0, 768, 112, 1, 0, 0, 0, 769, 770, 5, 115, 0, 0, 770, 771, 5, 116, 0, 0, 771, 772, 5, 97, 0, 0, 772, 773, 5, 116, 0, 0, 773, 774, 5, 105, 0, 0, 774, 775, 5, 99, 0, 0, 775, 114, 1, 0, 0, 0, 776, 777, 5, 116, 0, 0, 777, 778, 5, 111, 0, 0, 778, 116, 1, 0, 0, 0, 779, 780, 5, 112, 0, 0, 780, 781, 5, 114, 0, 0, 781, 782, 5, 105, 0, 0, 782, 783, 5, 118, 0, 0, 783, 784, 5, 97, 0, 0, 784, 785, 5, 116, 0, 0, 785, 786, 5, 101, 0, 0, 786, 118, 1, 0, 0, 0, 787, 788, 5, 115, 0, 0, 788, 789, 5, 104, 0, 0, 789, 790, 5, 97, 0, 0, 790, 791, 5, 114, 0, 0, 791, 792, 5, 101, 0, 0, 792, 793, 5, 100, 0, 0, 793, 120, 1, 0, 0, 0, 794, 795, 5, 115, 0, 0, 795, 796, 5, 116, 0, 0, 796, 797, 5, 97, 0, 0, 797, 798, 5, 116, 0, 0, 798, 799, 5, 101, 0, 0, 799, 122, 1, 0, 0, 0, 800, 801, 5, 101, 0, 0, 801, 802, 5, 100, 0, 0, 802, 803, 5, 103, 0, 0, 803, 804, 5, 101, 0, 0, 804, 124, 1, 0, 0, 0, 805, 806, 5, 112, 0, 0, 806, 807, 5, 114, 0, 0, 807, 808, 5, 111, 0, 0, 808, 809, 5, 106, 0, 0, 809, 810, 5, 101, 0, 0, 810, 811, 5, 99, 0, 0, 811, 812, 5, 116, 0, 0, 812, 813, 5, 105, 0, 0, 813, 814, 5, 111, 0, 0, 814, 815, 5, 110, 0, 0, 815, 126, 1, 0, 0, 0, 816, 817, 5, 119, 0, 0, 817, 818, 5, 105, 0, 0, 818, 819, 5, 116, 0, 0, 819, 820, 5, 104, 0, 0, 820, 128, 1, 0, 0, 0, 821, 822, 5, 117, 0, 0, 822, 823, 5, 115, 0, 0, 823, 824, 5, 105, 0, 0, 824, 825, 5, 110, 0, 0, 825, 826, 5, 103, 0, 0, 826, 130, 1, 0, 0, 0, 827, 828, 5, 97, 0, 0, 828, 829, 5, 99, 0, 0, 829, 830, 5, 99, 0, 0, 830, 831, 5, 101, 0, 0, 831, 832, 5, 112, 0, 0, 832, 833, 5, 116, 0, 0, 833, 132, 1, 0, 0, 0, 834, 835, 5, 118, 0, 0, 835, 836, 5, 105, 0, 0, 836, 837, 5, 97, 0, 0, 837, 134, 1, 0, 0, 0, 838, 839, 5, 109, 0, 0, 839, 840, 5, 97, 0, 0, 840, 841, 5, 116, 0, 0, 841, 842, 5, 101, 0, 0, 842, 843, 5, 114, 0, 0, 843, 844, 5, 105, 0, 0, 844, 845, 5, 97, 0, 0, 845, 846, 5, 108, 0, 0, 846, 847, 5, 105, 0, 0, 847, 848, 5, 122, 0, 0, 848, 849, 5, 101, 0, 0, 849, 136, 1, 0, 0, 0, 850, 851, 5, 105, 0, 0, 851, 852, 5, 102, 0, 0, 852, 138, 1, 0, 0, 0, 853, 854, 5, 97, 0, 0, 854, 855, 5, 98, 0, 0, 855, 856, 5, 115, 0, 0, 856, 857, 5, 101, 0, 0, 857, 858, 5, 110, 0, 0, 858, 859, 5, 116, 0, 0, 859, 140, 1, 0, 0, 0, 860, 861, 5, 111, 0, 0, 861, 862, 5, 110, 0, 0, 862, 142, 1, 0, 0, 0, 863, 864, 5, 112, 0, 0, 864, 865, 5, 111, 0, 0, 865, 866, 5, 108, 0, 0, 866, 867, 5, 105, 0, 0, 867, 868, 5, 99, 0, 0, 868, 869, 5, 121, 0, 0, 869, 144, 1, 0, 0, 0, 870, 871, 5, 100, 0, 0, 871, 872, 5, 101, 0, 0, 872, 873, 5, 102, 0, 0, 873, 874, 5, 97, 0, 0, 874, 875, 5, 117, 0, 0, 875, 876, 5, 108, 0, 0, 876, 877, 5, 116, 0, 0, 877, 146, 1, 0, 0, 0, 878, 879, 5, 115, 0, 0, 879, 880, 5, 111, 0, 0, 880, 881, 5, 117, 0, 0, 881, 882, 5, 114, 0, 0, 882, 883, 5, 99, 0, 0, 883, 884, 5, 101, 0, 0, 884, 148, 1, 0, 0, 0, 885, 886, 5, 114, 0, 0, 886, 887, 5, 101, 0, 0, 887, 888, 5, 112, 0, 0, 888, 889, 5, 111, 0, 0, 889, 890, 5, 115, 0, 0, 890, 891, 5, 105, 0, 0, 891, 892, 5, 116, 0, 0, 892, 893, 5, 111, 0, 0, 893, 894, 5, 114, 0, 0, 894, 895, 5, 121, 0, 0, 895, 150, 1, 0, 0, 0, 896, 897, 5, 99, 0, 0, 897, 898, 5, 111, 0, 0, 898, 899, 5, 109, 0, 0, 899, 900, 5, 109, 0, 0, 900, 901, 5, 105, 0, 0, 901, 902, 5, 116, 0, 0, 902, 152, 1, 0, 0, 0, 903, 904, 5, 114, 0, 0, 904, 905, 5, 101, 0, 0, 905, 906, 5, 118, 0, 0, 906, 907, 5, 105, 0, 0, 907, 908, 5, 115, 0, 0, 908, 909, 5, 105, 0, 0, 909, 910, 5, 111, 0, 0, 910, 911, 5, 110, 0, 0, 911, 154, 1, 0, 0, 0, 912, 913, 5, 115, 0, 0, 913, 914, 5, 101, 0, 0, 914, 915, 5, 109, 0, 0, 915, 916, 5, 97, 0, 0, 916, 917, 5, 110, 0, 0, 917, 918, 5, 116, 0, 0, 918, 919, 5, 105, 0, 0, 919, 920, 5, 99, 0, 0, 920, 921, 5, 45, 0, 0, 921, 922, 5, 109, 0, 0, 922, 923, 5, 97, 0, 0, 923, 924, 5, 106, 0, 0, 924, 925, 5, 111, 0, 0, 925, 926, 5, 114, 0, 0, 926, 156, 1, 0, 0, 0, 927, 928, 5, 111, 0, 0, 928, 929, 5, 110, 0, 0, 929, 930, 5, 45, 0, 0, 930, 931, 5, 100, 0, 0, 931, 932, 5, 101, 0, 0, 932, 933, 5, 108, 0, 0, 933, 934, 5, 101, 0, 0, 934, 935, 5, 116, 0, 0, 935, 936, 5, 101, 0, 0, 936, 158, 1, 0, 0, 0, 937, 938, 5, 108, 0, 0, 938, 939, 5, 105, 0, 0, 939, 940, 5, 102, 0, 0, 940, 941, 5, 101, 0, 0, 941, 942, 5, 99, 0, 0, 942, 943, 5, 121, 0, 0, 943, 944, 5, 99, 0, 0, 944, 945, 5, 108, 0, 0, 945, 946, 5, 101, 0, 0, 946, 160, 1, 0, 0, 0, 947, 948, 5, 114, 0, 0, 948, 949, 5, 101, 0, 0, 949, 950, 5, 116, 0, 0, 950, 951, 5, 97, 0, 0, 951, 952, 5, 105, 0, 0, 952, 953, 5, 110, 0, 0, 953, 954, 5, 45, 0, 0, 954, 955, 5, 111, 0, 0, 955, 956, 5, 116, 0, 0, 956, 957, 5, 104, 0, 0, 957, 958, 5, 101, 0, 0, 958, 959, 5, 114, 0, 0, 959, 162, 1, 0, 0, 0, 960, 961, 5, 107, 0, 0, 961, 962, 5, 101, 0, 0, 962, 963, 5, 121, 0, 0, 963, 964, 5, 101, 0, 0, 964, 965, 5, 100, 0, 0, 965, 164, 1, 0, 0, 0, 966, 967, 5, 112, 0, 0, 967, 968, 5, 117, 0, 0, 968, 969, 5, 98, 0, 0, 969, 970, 5, 108, 0, 0, 970, 971, 5, 105, 0, 0, 971, 972, 5, 99, 0, 0, 972, 973, 5, 45, 0, 0, 973, 974, 5, 116, 0, 0, 974, 975, 5, 114, 0, 0, 975, 976, 5, 97, 0, 0, 976, 977, 5, 118, 0, 0, 977, 978, 5, 101, 0, 0, 978, 979, 5, 114, 0, 0, 979, 980, 5, 115, 0, 0, 980, 981, 5, 97, 0, 0, 981, 982, 5, 108, 0, 0, 982, 166, 1, 0, 0, 0, 983, 984, 5, 105, 0, 0, 984, 985, 5, 100, 0, 0, 985, 168, 1, 0, 0, 0, 986, 987, 5, 100, 0, 0, 987, 988, 5, 111, 0, 0, 988, 989, 5, 99, 0, 0, 989, 170, 1, 0, 0, 0, 990, 991, 5, 109, 0, 0, 991, 992, 5, 111, 0, 0, 992, 993, 5, 100, 0, 0, 993, 994, 5, 101, 0, 0, 994, 172, 1, 0, 0, 0, 995, 996, 5, 101, 0, 0, 996, 997, 5, 109, 0, 0, 997, 998, 5, 105, 0, 0, 998, 999, 5, 116, 0, 0, 999, 1000, 5, 115, 0, 0, 1000, 174, 1, 0, 0, 0, 1001, 1002, 5, 114, 0, 0, 1002, 1003, 5, 101, 0, 0, 1003, 1004, 5, 99, 0, 0, 1004, 1005, 5, 101, 0, 0, 1005, 1006, 5, 105, 0, 0, 1006, 1007, 5, 118, 0, 0, 1007, 1008, 5, 101, 0, 0, 1008, 1009, 5, 114, 0, 0, 1009, 176, 1, 0, 0, 0, 1010, 1011, 5, 114, 0, 0, 1011, 1012, 5, 101, 0, 0, 1012, 1013, 5, 113, 0, 0, 1013, 1014, 5, 117, 0, 0, 1014, 1015, 5, 105, 0, 0, 1015, 1016, 5, 114, 0, 0, 1016, 1017, 5, 101, 0, 0, 1017, 1018, 5, 115, 0, 0, 1018, 178, 1, 0, 0, 0, 1019, 1020, 5, 97, 0, 0, 1020, 1021, 5, 110, 0, 0, 1021, 1022, 5, 121, 0, 0, 1022, 180, 1, 0, 0, 0, 1023, 1024, 5, 103, 0, 0, 1024, 1025, 5, 101, 0, 0, 1025, 1026, 5, 116, 0, 0, 1026, 182, 1, 0, 0, 0, 1027, 1028, 5, 115, 0, 0, 1028, 1029, 5, 101, 0, 0, 1029, 1030, 5, 116, 0, 0, 1030, 184, 1, 0, 0, 0, 1031, 1032, 5, 119, 0, 0, 1032, 1033, 5, 97, 0, 0, 1033, 1034, 5, 116, 0, 0, 1034, 1035, 5, 99, 0, 0, 1035, 1036, 5, 104, 0, 0, 1036, 186, 1, 0, 0, 0, 1037, 1038, 5, 115, 0, 0, 1038, 1039, 5, 116, 0, 0, 1039, 1040, 5, 97, 0, 0, 1040, 1041, 5, 114, 0, 0, 1041, 1042, 5, 116, 0, 0, 1042, 188, 1, 0, 0, 0, 1043, 1044, 5, 115, 0, 0, 1044, 1045, 5, 116, 0, 0, 1045, 1046, 5, 111, 0, 0, 1046, 1047, 5, 112, 0, 0, 1047, 190, 1, 0, 0, 0, 1048, 1049, 5, 114, 0, 0, 1049, 1050, 5, 101, 0, 0, 1050, 1051, 5, 97, 0, 0, 1051, 1052, 5, 100, 0, 0, 1052, 192, 1, 0, 0, 0, 1053, 1054, 5, 119, 0, 0, 1054, 1055, 5, 114, 0, 0, 1055, 1056, 5, 105, 0, 0, 1056, 1057, 5, 116, 0, 0, 1057, 1058, 5, 101, 0, 0, 1058, 194, 1, 0, 0, 0, 1059, 1060, 5, 114, 0, 0, 1060, 1061, 5, 101, 0, 0, 1061, 1062, 5, 115, 0, 0, 1062, 1063, 5, 111, 0, 0, 1063, 1064, 5, 108, 0, 0, 1064, 1065, 5, 118, 0, 0, 1065, 1066, 5, 101, 0, 0, 1066, 196, 1, 0, 0, 0, 1067, 1068, 5, 99, 0, 0, 1068, 1069, 5, 111, 0, 0, 1069, 1070, 5, 110, 0, 0, 1070, 1071, 5, 110, 0, 0, 1071, 1072, 5, 101, 0, 0, 1072, 1073, 5, 99, 0, 0, 1073, 1074, 5, 116, 0, 0, 1074, 198, 1, 0, 0, 0, 1075, 1076, 5, 100, 0, 0, 1076, 1077, 5, 105, 0, 0, 1077, 1078, 5, 115, 0, 0, 1078, 1079, 5, 99, 0, 0, 1079, 1080, 5, 111, 0, 0, 1080, 1081, 5, 110, 0, 0, 1081, 1082, 5, 110, 0, 0, 1082, 1083, 5, 101, 0, 0, 1083, 1084, 5, 99, 0, 0, 1084, 1085, 5, 116, 0, 0, 1085, 200, 1, 0, 0, 0, 1086, 1087, 5, 99, 0, 0, 1087, 1088, 5, 97, 0, 0, 1088, 1089, 5, 108, 0, 0, 1089, 1090, 5, 108, 0, 0, 1090, 202, 1, 0, 0, 0, 1091, 1092, 5, 119, 0, 0, 1092, 1093, 5, 97, 0, 0, 1093, 1094, 5, 116, 0, 0, 1094, 1095, 5, 99, 0, 0, 1095, 1096, 5, 104, 0, 0, 1096, 1097, 5, 45, 0, 0, 1097, 1098, 5, 115, 0, 0, 1098, 1099, 5, 116, 0, 0, 1099, 1100, 5, 97, 0, 0, 1100, 1101, 5, 114, 0, 0, 1101, 1102, 5, 116, 0, 0, 1102, 204, 1, 0, 0, 0, 1103, 1104, 5, 119, 0, 0, 1104, 1105, 5, 97, 0, 0, 1105, 1106, 5, 116, 0, 0, 1106, 1107, 5, 99, 0, 0, 1107, 1108, 5, 104, 0, 0, 1108, 1109, 5, 45, 0, 0, 1109, 1110, 5, 115, 0, 0, 1110, 1111, 5, 116, 0, 0, 1111, 1112, 5, 111, 0, 0, 1112, 1113, 5, 112, 0, 0, 1113, 206, 1, 0, 0, 0, 1114, 1115, 5, 115, 0, 0, 1115, 1116, 5, 117, 0, 0, 1116, 1117, 5, 98, 0, 0, 1117, 1118, 5, 115, 0, 0, 1118, 1119, 5, 99, 0, 0, 1119, 1120, 5, 114, 0, 0, 1120, 1121, 5, 105, 0, 0, 1121, 1122, 5, 98, 0, 0, 1122, 1123, 5, 101, 0, 0, 1123, 208, 1, 0, 0, 0, 1124, 1125, 5, 117, 0, 0, 1125, 1126, 5, 110, 0, 0, 1126, 1127, 5, 115, 0, 0, 1127, 1128, 5, 117, 0, 0, 1128, 1129, 5, 98, 0, 0, 1129, 1130, 5, 115, 0, 0, 1130, 1131, 5, 99, 0, 0, 1131, 1132, 5, 114, 0, 0, 1132, 1133, 5, 105, 0, 0, 1133, 1134, 5, 98, 0, 0, 1134, 1135, 5, 101, 0, 0, 1135, 210, 1, 0, 0, 0, 1136, 1137, 5, 114, 0, 0, 1137, 1138, 5, 101, 0, 0, 1138, 1139, 5, 103, 0, 0, 1139, 1140, 5, 105, 0, 0, 1140, 1141, 5, 115, 0, 0, 1141, 1142, 5, 116, 0, 0, 1142, 1143, 5, 101, 0, 0, 1143, 1144, 5, 114, 0, 0, 1144, 212, 1, 0, 0, 0, 1145, 1146, 5, 99, 0, 0, 1146, 1147, 5, 114, 0, 0, 1147, 1148, 5, 100, 0, 0, 1148, 1149, 5, 116, 0, 0, 1149, 214, 1, 0, 0, 0, 1150, 1151, 5, 111, 0, 0, 1151, 1152, 5, 112, 0, 0, 1152, 1153, 5, 116, 0, 0, 1153, 1154, 5, 105, 0, 0, 1154, 1155, 5, 111, 0, 0, 1155, 1156, 5, 110, 0, 0, 1156, 1157, 5, 97, 0, 0, 1157, 1158, 5, 108, 0, 0, 1158, 1159, 5, 45, 0, 0, 1159, 1160, 5, 111, 0, 0, 1160, 1161, 5, 110, 0, 0, 1161, 1162, 5, 101, 0, 0, 1162, 216, 1, 0, 0, 0, 1163, 1164, 5, 101, 0, 0, 1164, 1165, 5, 120, 0, 0, 1165, 1166, 5, 97, 0, 0, 1166, 1167, 5, 99, 0, 0, 1167, 1168, 5, 116, 0, 0, 1168, 1169, 5, 108, 0, 0, 1169, 1170, 5, 121, 0, 0, 1170, 1171, 5, 45, 0, 0, 1171, 1172, 5, 111, 0, 0, 1172, 1173, 5, 110, 0, 0, 1173, 1174, 5, 101, 0, 0, 1174, 218, 1, 0, 0, 0, 1175, 1176, 5, 109, 0, 0, 1176, 1177, 5, 97, 0, 0, 1177, 1178, 5, 110, 0, 0, 1178, 1179, 5, 121, 0, 0, 1179, 1180, 5, 45, 0, 0, 1180, 1181, 5, 117, 0, 0, 1181, 1182, 5, 110, 0, 0, 1182, 1183, 5, 105, 0, 0, 1183, 1184, 5, 113, 0, 0, 1184, 1185, 5, 117, 0, 0, 1185, 1186, 5, 101, 0, 0, 1186, 220, 1, 0, 0, 0, 1187, 1188, 5, 109, 0, 0, 1188, 1189, 5, 97, 0, 0, 1189, 1190, 5, 110, 0, 0, 1190, 1191, 5, 121, 0, 0, 1191, 222, 1, 0, 0, 0, 1192, 1193, 5, 111, 0, 0, 1193, 1194, 5, 114, 0, 0, 1194, 1195, 5, 100, 0, 0, 1195, 1196, 5, 101, 0, 0, 1196, 1197, 5, 114, 0, 0, 1197, 1198, 5, 101, 0, 0, 1198, 1199, 5, 100, 0, 0, 1199, 224, 1, 0, 0, 0, 1200, 1201, 5, 117, 0, 0, 1201, 1202, 5, 110, 0, 0, 1202, 1203, 5, 105, 0, 0, 1203, 1204, 5, 116, 0, 0, 1204, 226, 1, 0, 0, 0, 1205, 1206, 5, 119, 0, 0, 1206, 1207, 5, 97, 0, 0, 1207, 1208, 5, 116, 0, 0, 1208, 1209, 5, 99, 0, 0, 1209, 1210, 5, 104, 0, 0, 1210, 1211, 5, 45, 0, 0, 1211, 1212, 5, 104, 0, 0, 1212, 1213, 5, 97, 0, 0, 1213, 1214, 5, 110, 0, 0, 1214, 1215, 5, 100, 0, 0, 1215, 1216, 5, 108, 0, 0, 1216, 1217, 5, 101, 0, 0, 1217, 228, 1, 0, 0, 0, 1218, 1219, 5, 109, 0, 0, 1219, 1220, 5, 101, 0, 0, 1220, 1221, 5, 115, 0, 0, 1221, 1222, 5, 115, 0, 0, 1222, 1223, 5, 97, 0, 0, 1223, 1224, 5, 103, 0, 0, 1224, 1225, 5, 101, 0, 0, 1225, 230, 1, 0, 0, 0, 1226, 1227, 5, 97, 0, 0, 1227, 1228, 5, 116, 0, 0, 1228, 1229, 5, 111, 0, 0, 1229, 1230, 5, 109, 0, 0, 1230, 1231, 5, 45, 0, 0, 1231, 1232, 5, 114, 0, 0, 1232, 1233, 5, 101, 0, 0, 1233, 1234, 5, 102, 0, 0, 1234, 232, 1, 0, 0, 0, 1235, 1236, 5, 105, 0, 0, 1236, 1237, 5, 110, 0, 0, 1237, 1238, 5, 116, 0, 0, 1238, 1239, 5, 101, 0, 0, 1239, 1240, 5, 114, 0, 0, 1240, 1241, 5, 102, 0, 0, 1241, 1242, 5, 97, 0, 0, 1242, 1243, 5, 99, 0, 0, 1243, 1244, 5, 101, 0, 0, 1244, 1245, 5, 45, 0, 0, 1245, 1246, 5, 114, 0, 0, 1246, 1247, 5, 101, 0, 0, 1247, 1248, 5, 102, 0, 0, 1248, 234, 1, 0, 0, 0, 1249, 1250, 5, 111, 0, 0, 1250, 1251, 5, 112, 0, 0, 1251, 1252, 5, 116, 0, 0, 1252, 1253, 5, 105, 0, 0, 1253, 1254, 5, 111, 0, 0, 1254, 1255, 5, 110, 0, 0, 1255, 1256, 5, 97, 0, 0, 1256, 1257, 5, 108, 0, 0, 1257, 236, 1, 0, 0, 0, 1258, 1259, 5, 108, 0, 0, 1259, 1260, 5, 105, 0, 0, 1260, 1261, 5, 115, 0, 0, 1261, 1262, 5, 116, 0, 0, 1262, 238, 1, 0, 0, 0, 1263, 1264, 5, 114, 0, 0, 1264, 1265, 5, 101, 0, 0, 1265, 1266, 5, 99, 0, 0, 1266, 1267, 5, 111, 0, 0, 1267, 1268, 5, 114, 0, 0, 1268, 1269, 5, 100, 0, 0, 1269, 240, 1, 0, 0, 0, 1270, 1271, 5, 98, 0, 0, 1271, 1272, 5, 111, 0, 0, 1272, 1273, 5, 111, 0, 0, 1273, 1274, 5, 108, 0, 0, 1274, 242, 1, 0, 0, 0, 1275, 1276, 5, 98, 0, 0, 1276, 1277, 5, 121, 0, 0, 1277, 1278, 5, 116, 0, 0, 1278, 1279, 5, 101, 0, 0, 1279, 1280, 5, 115, 0, 0, 1280, 244, 1, 0, 0, 0, 1281, 1282, 5, 100, 0, 0, 1282, 1283, 5, 111, 0, 0, 1283, 1284, 5, 117, 0, 0, 1284, 1285, 5, 98, 0, 0, 1285, 1286, 5, 108, 0, 0, 1286, 1287, 5, 101, 0, 0, 1287, 246, 1, 0, 0, 0, 1288, 1289, 5, 105, 0, 0, 1289, 1290, 5, 110, 0, 0, 1290, 1291, 5, 116, 0, 0, 1291, 1292, 5, 51, 0, 0, 1292, 1293, 5, 50, 0, 0, 1293, 248, 1, 0, 0, 0, 1294, 1295, 5, 105, 0, 0, 1295, 1296, 5, 110, 0, 0, 1296, 1297, 5, 116, 0, 0, 1297, 1298, 5, 54, 0, 0, 1298, 1299, 5, 52, 0, 0, 1299, 250, 1, 0, 0, 0, 1300, 1301, 5, 115, 0, 0, 1301, 1302, 5, 116, 0, 0, 1302, 1303, 5, 114, 0, 0, 1303, 1304, 5, 105, 0, 0, 1304, 1305, 5, 110, 0, 0, 1305, 1306, 5, 103, 0, 0, 1306, 252, 1, 0, 0, 0, 1307, 1308, 5, 117, 0, 0, 1308, 1309, 5, 105, 0, 0, 1309, 1310, 5, 110, 0, 0, 1310, 1311, 5, 116, 0, 0, 1311, 1312, 5, 51, 0, 0, 1312, 1313, 5, 50, 0, 0, 1313, 254, 1, 0, 0, 0, 1314, 1315, 5, 117, 0, 0, 1315, 1316, 5, 105, 0, 0, 1316, 1317, 5, 110, 0, 0, 1317, 1318, 5, 116, 0, 0, 1318, 1319, 5, 54, 0, 0, 1319, 1320, 5, 52, 0, 0, 1320, 256, 1, 0, 0, 0, 1321, 1322, 5, 116, 0, 0, 1322, 1323, 5, 114, 0, 0, 1323, 1324, 5, 117, 0, 0, 1324, 1325, 5, 101, 0, 0, 1325, 258, 1, 0, 0, 0, 1326, 1327, 5, 102, 0, 0, 1327, 1328, 5, 97, 0, 0, 1328, 1329, 5, 108, 0, 0, 1329, 1330, 5, 115, 0, 0, 1330, 1331, 5, 101, 0, 0, 1331, 260, 1, 0, 0, 0, 1332, 1333, 5, 110, 0, 0, 1333, 1334, 5, 117, 0, 0, 1334, 1335, 5, 108, 0, 0, 1335, 1336, 5, 108, 0, 0, 1336, 262, 1, 0, 0, 0, 1337, 1338, 5, 45, 0, 0, 1338, 1339, 5, 62, 0, 0, 1339, 264, 1, 0, 0, 0, 1340, 1341, 5, 58, 0, 0, 1341, 266, 1, 0, 0, 0, 1342, 1343, 5, 59, 0, 0, 1343, 268, 1, 0, 0, 0, 1344, 1345, 5, 44, 0, 0, 1345, 270, 1, 0, 0, 0, 1346, 1347, 5, 46, 0, 0, 1347, 272, 1, 0, 0, 0, 1348, 1349, 5, 123, 0, 0, 1349, 274, 1, 0, 0, 0, 1350, 1351, 5, 125, 0, 0, 1351, 276, 1, 0, 0, 0, 1352, 1353, 5, 91, 0, 0, 1353, 278, 1, 0, 0, 0, 1354, 1355, 5, 93, 0, 0, 1355, 280, 1, 0, 0, 0, 1356, 1357, 5, 40, 0, 0, 1357, 282, 1, 0, 0, 0, 1358, 1359, 5, 41, 0, 0, 1359, 284, 1, 0, 0, 0, 1360, 1361, 5, 60, 0, 0, 1361, 286, 1, 0, 0, 0, 1362, 1363, 5, 62, 0, 0, 1363, 288, 1, 0, 0, 0, 1364, 1365, 5, 38, 0, 0, 1365, 290, 1, 0, 0, 0, 1366, 1367, 5, 61, 0, 0, 1367, 292, 1, 0, 0, 0, 1368, 1370, 5, 45, 0, 0, 1369, 1368, 1, 0, 0, 0, 1369, 1370, 1, 0, 0, 0, 1370, 1372, 1, 0, 0, 0, 1371, 1373, 7, 0, 0, 0, 1372, 1371, 1, 0, 0, 0, 1373, 1374, 1, 0, 0, 0, 1374, 1372, 1, 0, 0, 0, 1374, 1375, 1, 0, 0, 0, 1375, 294, 1, 0, 0, 0, 1376, 1378, 5, 45, 0, 0, 1377, 1376, 1, 0, 0, 0, 1377, 1378, 1, 0, 0, 0, 1378, 1387, 1, 0, 0, 0, 1379, 1388, 5, 48, 0, 0, 1380, 1384, 7, 1, 0, 0, 1381, 1383, 7, 0, 0, 0, 1382, 1381, 1, 0, 0, 0, 1383, 1386, 1, 0, 0, 0, 1384, 1382, 1, 0, 0, 0, 1384, 1385, 1, 0, 0, 0, 1385, 1388, 1, 0, 0, 0, 1386, 1384, 1, 0, 0, 0, 1387, 1379, 1, 0, 0, 0, 1387, 1380, 1, 0, 0, 0, 1388, 1395, 1, 0, 0, 0, 1389, 1391, 5, 46, 0, 0, 1390, 1392, 7, 0, 0, 0, 1391, 1390, 1, 0, 0, 0, 1392, 1393, 1, 0, 0, 0, 1393, 1391, 1, 0, 0, 0, 1393, 1394, 1, 0, 0, 0, 1394, 1396, 1, 0, 0, 0, 1395, 1389, 1, 0, 0, 0, 1395, 1396, 1, 0, 0, 0, 1396, 1406, 1, 0, 0, 0, 1397, 1399, 7, 2, 0, 0, 1398, 1400, 7, 3, 0, 0, 1399, 1398, 1, 0, 0, 0, 1399, 1400, 1, 0, 0, 0, 1400, 1402, 1, 0, 0, 0, 1401, 1403, 7, 0, 0, 0, 1402, 1401, 1, 0, 0, 0, 1403, 1404, 1, 0, 0, 0, 1404, 1402, 1, 0, 0, 0, 1404, 1405, 1, 0, 0, 0, 1405, 1407, 1, 0, 0, 0, 1406, 1397, 1, 0, 0, 0, 1406, 1407, 1, 0, 0, 0, 1407, 296, 1, 0, 0, 0, 1408, 1412, 7, 4, 0, 0, 1409, 1411, 7, 5, 0, 0, 1410, 1409, 1, 0, 0, 0, 1411, 1414, 1, 0, 0, 0, 1412, 1410, 1, 0, 0, 0, 1412, 1413, 1, 0, 0, 0, 1413, 298, 1, 0, 0, 0, 1414, 1412, 1, 0, 0, 0, 1415, 1420, 5, 34, 0, 0, 1416, 1419, 3, 301, 150, 0, 1417, 1419, 8, 6, 0, 0, 1418, 1416, 1, 0, 0, 0, 1418, 1417, 1, 0, 0, 0, 1419, 1422, 1, 0, 0, 0, 1420, 1418, 1, 0, 0, 0, 1420, 1421, 1, 0, 0, 0, 1421, 1423, 1, 0, 0, 0, 1422, 1420, 1, 0, 0, 0, 1423, 1424, 5, 34, 0, 0, 1424, 300, 1, 0, 0, 0, 1425, 1433, 5, 92, 0, 0, 1426, 1434, 7, 7, 0, 0, 1427, 1428, 5, 117, 0, 0, 1428, 1429, 3, 303, 151, 0, 1429, 1430, 3, 303, 151, 0, 1430, 1431, 3, 303, 151, 0, 1431, 1432, 3, 303, 151, 0, 1432, 1434, 1, 0, 0, 0, 1433, 1426, 1, 0, 0, 0, 1433, 1427, 1, 0, 0, 0, 1434, 302, 1, 0, 0, 0, 1435, 1436, 7, 8, 0, 0, 1436, 304, 1, 0, 0, 0, 1437, 1438, 5, 47, 0, 0, 1438, 1439, 5, 47, 0, 0, 1439, 1443, 1, 0, 0, 0, 1440, 1442, 8, 9, 0, 0, 1441, 1440, 1, 0, 0, 0, 1442, 1445, 1, 0, 0, 0, 1443, 1441, 1, 0, 0, 0, 1443, 1444, 1, 0, 0, 0, 1444, 1446, 1, 0, 0, 0, 1445, 1443, 1, 0, 0, 0, 1446, 1447, 6, 152, 0, 0, 1447, 306, 1, 0, 0, 0, 1448, 1449, 5, 47, 0, 0, 1449, 1450, 5, 42, 0, 0, 1450, 1454, 1, 0, 0, 0, 1451, 1453, 9, 0, 0, 0, 1452, 1451, 1, 0, 0, 0, 1453, 1456, 1, 0, 0, 0, 1454, 1455, 1, 0, 0, 0, 1454, 1452, 1, 0, 0, 0, 1455, 1457, 1, 0, 0, 0, 1456, 1454, 1, 0, 0, 0, 1457, 1458, 5, 42, 0, 0, 1458, 1459, 5, 47, 0, 0, 1459, 1460, 1, 0, 0, 0, 1460, 1461, 6, 153, 0, 0, 1461, 308, 1, 0, 0, 0, 1462, 1464, 7, 10, 0, 0, 1463, 1462, 1, 0, 0, 0, 1464, 1465, 1, 0, 0, 0, 1465, 1463, 1, 0, 0, 0, 1465, 1466, 1, 0, 0, 0, 1466, 1467, 1, 0, 0, 0, 1467, 1468, 6, 154, 0, 0, 1468, 310, 1, 0, 0, 0, 18, 0, 1369, 1374, 1377, 1384, 1387, 1393, 1395, 1399, 1404, 1406, 1412, 1418, 1420, 1433, 1443, 1454, 1465, 1, 0, 1, 0] \ No newline at end of file +[4, 0, 155, 1490, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 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, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 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, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 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, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 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, 27, 1, 28, 1, 28, 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, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 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, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 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, 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, 45, 1, 46, 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, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 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, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 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, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 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, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 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, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 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, 67, 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, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 73, 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, 74, 1, 75, 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, 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, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 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, 80, 1, 80, 1, 80, 1, 81, 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, 82, 1, 82, 1, 82, 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, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 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, 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, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 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, 98, 1, 99, 1, 99, 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, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 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, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 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, 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, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 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, 144, 1, 144, 1, 145, 1, 145, 1, 146, 1, 146, 1, 147, 1, 147, 1, 148, 3, 148, 1391, 8, 148, 1, 148, 4, 148, 1394, 8, 148, 11, 148, 12, 148, 1395, 1, 149, 3, 149, 1399, 8, 149, 1, 149, 1, 149, 1, 149, 5, 149, 1404, 8, 149, 10, 149, 12, 149, 1407, 9, 149, 3, 149, 1409, 8, 149, 1, 149, 1, 149, 4, 149, 1413, 8, 149, 11, 149, 12, 149, 1414, 3, 149, 1417, 8, 149, 1, 149, 1, 149, 3, 149, 1421, 8, 149, 1, 149, 4, 149, 1424, 8, 149, 11, 149, 12, 149, 1425, 3, 149, 1428, 8, 149, 1, 150, 1, 150, 5, 150, 1432, 8, 150, 10, 150, 12, 150, 1435, 9, 150, 1, 151, 1, 151, 1, 151, 5, 151, 1440, 8, 151, 10, 151, 12, 151, 1443, 9, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 3, 152, 1455, 8, 152, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 5, 154, 1463, 8, 154, 10, 154, 12, 154, 1466, 9, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 5, 155, 1474, 8, 155, 10, 155, 12, 155, 1477, 9, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 4, 156, 1485, 8, 156, 11, 156, 12, 156, 1486, 1, 156, 1, 156, 1, 1475, 0, 157, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 143, 287, 144, 289, 145, 291, 146, 293, 147, 295, 148, 297, 149, 299, 150, 301, 151, 303, 152, 305, 0, 307, 0, 309, 153, 311, 154, 313, 155, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1504, 0, 1, 1, 0, 0, 0, 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, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 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, 309, 1, 0, 0, 0, 0, 311, 1, 0, 0, 0, 0, 313, 1, 0, 0, 0, 1, 315, 1, 0, 0, 0, 3, 320, 1, 0, 0, 0, 5, 327, 1, 0, 0, 0, 7, 336, 1, 0, 0, 0, 9, 349, 1, 0, 0, 0, 11, 357, 1, 0, 0, 0, 13, 361, 1, 0, 0, 0, 15, 370, 1, 0, 0, 0, 17, 378, 1, 0, 0, 0, 19, 387, 1, 0, 0, 0, 21, 398, 1, 0, 0, 0, 23, 408, 1, 0, 0, 0, 25, 418, 1, 0, 0, 0, 27, 427, 1, 0, 0, 0, 29, 439, 1, 0, 0, 0, 31, 446, 1, 0, 0, 0, 33, 454, 1, 0, 0, 0, 35, 463, 1, 0, 0, 0, 37, 471, 1, 0, 0, 0, 39, 477, 1, 0, 0, 0, 41, 482, 1, 0, 0, 0, 43, 495, 1, 0, 0, 0, 45, 505, 1, 0, 0, 0, 47, 517, 1, 0, 0, 0, 49, 523, 1, 0, 0, 0, 51, 534, 1, 0, 0, 0, 53, 545, 1, 0, 0, 0, 55, 550, 1, 0, 0, 0, 57, 559, 1, 0, 0, 0, 59, 569, 1, 0, 0, 0, 61, 574, 1, 0, 0, 0, 63, 578, 1, 0, 0, 0, 65, 584, 1, 0, 0, 0, 67, 589, 1, 0, 0, 0, 69, 599, 1, 0, 0, 0, 71, 603, 1, 0, 0, 0, 73, 616, 1, 0, 0, 0, 75, 621, 1, 0, 0, 0, 77, 628, 1, 0, 0, 0, 79, 637, 1, 0, 0, 0, 81, 648, 1, 0, 0, 0, 83, 652, 1, 0, 0, 0, 85, 661, 1, 0, 0, 0, 87, 668, 1, 0, 0, 0, 89, 677, 1, 0, 0, 0, 91, 682, 1, 0, 0, 0, 93, 692, 1, 0, 0, 0, 95, 703, 1, 0, 0, 0, 97, 711, 1, 0, 0, 0, 99, 717, 1, 0, 0, 0, 101, 726, 1, 0, 0, 0, 103, 736, 1, 0, 0, 0, 105, 745, 1, 0, 0, 0, 107, 757, 1, 0, 0, 0, 109, 768, 1, 0, 0, 0, 111, 774, 1, 0, 0, 0, 113, 782, 1, 0, 0, 0, 115, 785, 1, 0, 0, 0, 117, 790, 1, 0, 0, 0, 119, 797, 1, 0, 0, 0, 121, 800, 1, 0, 0, 0, 123, 808, 1, 0, 0, 0, 125, 815, 1, 0, 0, 0, 127, 821, 1, 0, 0, 0, 129, 826, 1, 0, 0, 0, 131, 837, 1, 0, 0, 0, 133, 842, 1, 0, 0, 0, 135, 848, 1, 0, 0, 0, 137, 855, 1, 0, 0, 0, 139, 859, 1, 0, 0, 0, 141, 871, 1, 0, 0, 0, 143, 874, 1, 0, 0, 0, 145, 881, 1, 0, 0, 0, 147, 884, 1, 0, 0, 0, 149, 891, 1, 0, 0, 0, 151, 899, 1, 0, 0, 0, 153, 906, 1, 0, 0, 0, 155, 917, 1, 0, 0, 0, 157, 924, 1, 0, 0, 0, 159, 933, 1, 0, 0, 0, 161, 948, 1, 0, 0, 0, 163, 958, 1, 0, 0, 0, 165, 968, 1, 0, 0, 0, 167, 981, 1, 0, 0, 0, 169, 987, 1, 0, 0, 0, 171, 1004, 1, 0, 0, 0, 173, 1007, 1, 0, 0, 0, 175, 1011, 1, 0, 0, 0, 177, 1016, 1, 0, 0, 0, 179, 1022, 1, 0, 0, 0, 181, 1031, 1, 0, 0, 0, 183, 1040, 1, 0, 0, 0, 185, 1044, 1, 0, 0, 0, 187, 1048, 1, 0, 0, 0, 189, 1052, 1, 0, 0, 0, 191, 1058, 1, 0, 0, 0, 193, 1064, 1, 0, 0, 0, 195, 1069, 1, 0, 0, 0, 197, 1074, 1, 0, 0, 0, 199, 1080, 1, 0, 0, 0, 201, 1088, 1, 0, 0, 0, 203, 1096, 1, 0, 0, 0, 205, 1107, 1, 0, 0, 0, 207, 1112, 1, 0, 0, 0, 209, 1124, 1, 0, 0, 0, 211, 1135, 1, 0, 0, 0, 213, 1145, 1, 0, 0, 0, 215, 1157, 1, 0, 0, 0, 217, 1166, 1, 0, 0, 0, 219, 1171, 1, 0, 0, 0, 221, 1184, 1, 0, 0, 0, 223, 1196, 1, 0, 0, 0, 225, 1208, 1, 0, 0, 0, 227, 1213, 1, 0, 0, 0, 229, 1221, 1, 0, 0, 0, 231, 1226, 1, 0, 0, 0, 233, 1239, 1, 0, 0, 0, 235, 1247, 1, 0, 0, 0, 237, 1256, 1, 0, 0, 0, 239, 1270, 1, 0, 0, 0, 241, 1279, 1, 0, 0, 0, 243, 1284, 1, 0, 0, 0, 245, 1291, 1, 0, 0, 0, 247, 1296, 1, 0, 0, 0, 249, 1302, 1, 0, 0, 0, 251, 1309, 1, 0, 0, 0, 253, 1315, 1, 0, 0, 0, 255, 1321, 1, 0, 0, 0, 257, 1328, 1, 0, 0, 0, 259, 1335, 1, 0, 0, 0, 261, 1342, 1, 0, 0, 0, 263, 1347, 1, 0, 0, 0, 265, 1353, 1, 0, 0, 0, 267, 1358, 1, 0, 0, 0, 269, 1361, 1, 0, 0, 0, 271, 1363, 1, 0, 0, 0, 273, 1365, 1, 0, 0, 0, 275, 1367, 1, 0, 0, 0, 277, 1369, 1, 0, 0, 0, 279, 1371, 1, 0, 0, 0, 281, 1373, 1, 0, 0, 0, 283, 1375, 1, 0, 0, 0, 285, 1377, 1, 0, 0, 0, 287, 1379, 1, 0, 0, 0, 289, 1381, 1, 0, 0, 0, 291, 1383, 1, 0, 0, 0, 293, 1385, 1, 0, 0, 0, 295, 1387, 1, 0, 0, 0, 297, 1390, 1, 0, 0, 0, 299, 1398, 1, 0, 0, 0, 301, 1429, 1, 0, 0, 0, 303, 1436, 1, 0, 0, 0, 305, 1446, 1, 0, 0, 0, 307, 1456, 1, 0, 0, 0, 309, 1458, 1, 0, 0, 0, 311, 1469, 1, 0, 0, 0, 313, 1484, 1, 0, 0, 0, 315, 316, 5, 101, 0, 0, 316, 317, 5, 100, 0, 0, 317, 318, 5, 105, 0, 0, 318, 319, 5, 116, 0, 0, 319, 2, 1, 0, 0, 0, 320, 321, 5, 109, 0, 0, 321, 322, 5, 111, 0, 0, 322, 323, 5, 100, 0, 0, 323, 324, 5, 117, 0, 0, 324, 325, 5, 108, 0, 0, 325, 326, 5, 101, 0, 0, 326, 4, 1, 0, 0, 0, 327, 328, 5, 99, 0, 0, 328, 329, 5, 111, 0, 0, 329, 330, 5, 110, 0, 0, 330, 331, 5, 116, 0, 0, 331, 332, 5, 114, 0, 0, 332, 333, 5, 97, 0, 0, 333, 334, 5, 99, 0, 0, 334, 335, 5, 116, 0, 0, 335, 6, 1, 0, 0, 0, 336, 337, 5, 112, 0, 0, 337, 338, 5, 114, 0, 0, 338, 339, 5, 101, 0, 0, 339, 340, 5, 115, 0, 0, 340, 341, 5, 101, 0, 0, 341, 342, 5, 110, 0, 0, 342, 343, 5, 116, 0, 0, 343, 344, 5, 97, 0, 0, 344, 345, 5, 116, 0, 0, 345, 346, 5, 105, 0, 0, 346, 347, 5, 111, 0, 0, 347, 348, 5, 110, 0, 0, 348, 8, 1, 0, 0, 0, 349, 350, 5, 115, 0, 0, 350, 351, 5, 117, 0, 0, 351, 352, 5, 98, 0, 0, 352, 353, 5, 106, 0, 0, 353, 354, 5, 101, 0, 0, 354, 355, 5, 99, 0, 0, 355, 356, 5, 116, 0, 0, 356, 10, 1, 0, 0, 0, 357, 358, 5, 102, 0, 0, 358, 359, 5, 111, 0, 0, 359, 360, 5, 114, 0, 0, 360, 12, 1, 0, 0, 0, 361, 362, 5, 99, 0, 0, 362, 363, 5, 114, 0, 0, 363, 364, 5, 101, 0, 0, 364, 365, 5, 97, 0, 0, 365, 366, 5, 116, 0, 0, 366, 367, 5, 105, 0, 0, 367, 368, 5, 111, 0, 0, 368, 369, 5, 110, 0, 0, 369, 14, 1, 0, 0, 0, 370, 371, 5, 118, 0, 0, 371, 372, 5, 97, 0, 0, 372, 373, 5, 114, 0, 0, 373, 374, 5, 105, 0, 0, 374, 375, 5, 97, 0, 0, 375, 376, 5, 110, 0, 0, 376, 377, 5, 116, 0, 0, 377, 16, 1, 0, 0, 0, 378, 379, 5, 112, 0, 0, 379, 380, 5, 114, 0, 0, 380, 381, 5, 101, 0, 0, 381, 382, 5, 112, 0, 0, 382, 383, 5, 97, 0, 0, 383, 384, 5, 114, 0, 0, 384, 385, 5, 101, 0, 0, 385, 386, 5, 115, 0, 0, 386, 18, 1, 0, 0, 0, 387, 388, 5, 105, 0, 0, 388, 389, 5, 110, 0, 0, 389, 390, 5, 105, 0, 0, 390, 391, 5, 116, 0, 0, 391, 392, 5, 105, 0, 0, 392, 393, 5, 97, 0, 0, 393, 394, 5, 108, 0, 0, 394, 395, 5, 105, 0, 0, 395, 396, 5, 122, 0, 0, 396, 397, 5, 101, 0, 0, 397, 20, 1, 0, 0, 0, 398, 399, 5, 119, 0, 0, 399, 400, 5, 111, 0, 0, 400, 401, 5, 114, 0, 0, 401, 402, 5, 107, 0, 0, 402, 403, 5, 115, 0, 0, 403, 404, 5, 112, 0, 0, 404, 405, 5, 97, 0, 0, 405, 406, 5, 99, 0, 0, 406, 407, 5, 101, 0, 0, 407, 22, 1, 0, 0, 0, 408, 409, 5, 101, 0, 0, 409, 410, 5, 120, 0, 0, 410, 411, 5, 101, 0, 0, 411, 412, 5, 99, 0, 0, 412, 413, 5, 117, 0, 0, 413, 414, 5, 116, 0, 0, 414, 415, 5, 105, 0, 0, 415, 416, 5, 111, 0, 0, 416, 417, 5, 110, 0, 0, 417, 24, 1, 0, 0, 0, 418, 419, 5, 115, 0, 0, 419, 420, 5, 110, 0, 0, 420, 421, 5, 97, 0, 0, 421, 422, 5, 112, 0, 0, 422, 423, 5, 115, 0, 0, 423, 424, 5, 104, 0, 0, 424, 425, 5, 111, 0, 0, 425, 426, 5, 116, 0, 0, 426, 26, 1, 0, 0, 0, 427, 428, 5, 116, 0, 0, 428, 429, 5, 114, 0, 0, 429, 430, 5, 97, 0, 0, 430, 431, 5, 110, 0, 0, 431, 432, 5, 115, 0, 0, 432, 433, 5, 97, 0, 0, 433, 434, 5, 99, 0, 0, 434, 435, 5, 116, 0, 0, 435, 436, 5, 105, 0, 0, 436, 437, 5, 111, 0, 0, 437, 438, 5, 110, 0, 0, 438, 28, 1, 0, 0, 0, 439, 440, 5, 114, 0, 0, 440, 441, 5, 101, 0, 0, 441, 442, 5, 109, 0, 0, 442, 443, 5, 111, 0, 0, 443, 444, 5, 116, 0, 0, 444, 445, 5, 101, 0, 0, 445, 30, 1, 0, 0, 0, 446, 447, 5, 116, 0, 0, 447, 448, 5, 97, 0, 0, 448, 449, 5, 114, 0, 0, 449, 450, 5, 103, 0, 0, 450, 451, 5, 101, 0, 0, 451, 452, 5, 116, 0, 0, 452, 453, 5, 115, 0, 0, 453, 32, 1, 0, 0, 0, 454, 455, 5, 112, 0, 0, 455, 456, 5, 111, 0, 0, 456, 457, 5, 114, 0, 0, 457, 458, 5, 116, 0, 0, 458, 459, 5, 97, 0, 0, 459, 460, 5, 98, 0, 0, 460, 461, 5, 108, 0, 0, 461, 462, 5, 101, 0, 0, 462, 34, 1, 0, 0, 0, 463, 464, 5, 114, 0, 0, 464, 465, 5, 101, 0, 0, 465, 466, 5, 112, 0, 0, 466, 467, 5, 108, 0, 0, 467, 468, 5, 105, 0, 0, 468, 469, 5, 99, 0, 0, 469, 470, 5, 97, 0, 0, 470, 36, 1, 0, 0, 0, 471, 472, 5, 108, 0, 0, 472, 473, 5, 111, 0, 0, 473, 474, 5, 99, 0, 0, 474, 475, 5, 97, 0, 0, 475, 476, 5, 108, 0, 0, 476, 38, 1, 0, 0, 0, 477, 478, 5, 102, 0, 0, 478, 479, 5, 114, 0, 0, 479, 480, 5, 111, 0, 0, 480, 481, 5, 109, 0, 0, 481, 40, 1, 0, 0, 0, 482, 483, 5, 114, 0, 0, 483, 484, 5, 101, 0, 0, 484, 485, 5, 115, 0, 0, 485, 486, 5, 117, 0, 0, 486, 487, 5, 108, 0, 0, 487, 488, 5, 116, 0, 0, 488, 489, 5, 45, 0, 0, 489, 490, 5, 98, 0, 0, 490, 491, 5, 121, 0, 0, 491, 492, 5, 116, 0, 0, 492, 493, 5, 101, 0, 0, 493, 494, 5, 115, 0, 0, 494, 42, 1, 0, 0, 0, 495, 496, 5, 114, 0, 0, 496, 497, 5, 112, 0, 0, 497, 498, 5, 99, 0, 0, 498, 499, 5, 45, 0, 0, 499, 500, 5, 99, 0, 0, 500, 501, 5, 97, 0, 0, 501, 502, 5, 108, 0, 0, 502, 503, 5, 108, 0, 0, 503, 504, 5, 115, 0, 0, 504, 44, 1, 0, 0, 0, 505, 506, 5, 100, 0, 0, 506, 507, 5, 101, 0, 0, 507, 508, 5, 97, 0, 0, 508, 509, 5, 100, 0, 0, 509, 510, 5, 108, 0, 0, 510, 511, 5, 105, 0, 0, 511, 512, 5, 110, 0, 0, 512, 513, 5, 101, 0, 0, 513, 514, 5, 45, 0, 0, 514, 515, 5, 109, 0, 0, 515, 516, 5, 115, 0, 0, 516, 46, 1, 0, 0, 0, 517, 518, 5, 113, 0, 0, 518, 519, 5, 117, 0, 0, 519, 520, 5, 101, 0, 0, 520, 521, 5, 114, 0, 0, 521, 522, 5, 121, 0, 0, 522, 48, 1, 0, 0, 0, 523, 524, 5, 114, 0, 0, 524, 525, 5, 101, 0, 0, 525, 526, 5, 102, 0, 0, 526, 527, 5, 108, 0, 0, 527, 528, 5, 101, 0, 0, 528, 529, 5, 99, 0, 0, 529, 530, 5, 116, 0, 0, 530, 531, 5, 105, 0, 0, 531, 532, 5, 111, 0, 0, 532, 533, 5, 110, 0, 0, 533, 50, 1, 0, 0, 0, 534, 535, 5, 115, 0, 0, 535, 536, 5, 112, 0, 0, 536, 537, 5, 101, 0, 0, 537, 538, 5, 99, 0, 0, 538, 539, 5, 105, 0, 0, 539, 540, 5, 97, 0, 0, 540, 541, 5, 108, 0, 0, 541, 542, 5, 105, 0, 0, 542, 543, 5, 122, 0, 0, 543, 544, 5, 101, 0, 0, 544, 52, 1, 0, 0, 0, 545, 546, 5, 114, 0, 0, 546, 547, 5, 111, 0, 0, 547, 548, 5, 111, 0, 0, 548, 549, 5, 116, 0, 0, 549, 54, 1, 0, 0, 0, 550, 551, 5, 100, 0, 0, 551, 552, 5, 111, 0, 0, 552, 553, 5, 99, 0, 0, 553, 554, 5, 117, 0, 0, 554, 555, 5, 109, 0, 0, 555, 556, 5, 101, 0, 0, 556, 557, 5, 110, 0, 0, 557, 558, 5, 116, 0, 0, 558, 56, 1, 0, 0, 0, 559, 560, 5, 102, 0, 0, 560, 561, 5, 114, 0, 0, 561, 562, 5, 97, 0, 0, 562, 563, 5, 103, 0, 0, 563, 564, 5, 109, 0, 0, 564, 565, 5, 101, 0, 0, 565, 566, 5, 110, 0, 0, 566, 567, 5, 116, 0, 0, 567, 568, 5, 115, 0, 0, 568, 58, 1, 0, 0, 0, 569, 570, 5, 118, 0, 0, 570, 571, 5, 105, 0, 0, 571, 572, 5, 101, 0, 0, 572, 573, 5, 119, 0, 0, 573, 60, 1, 0, 0, 0, 574, 575, 5, 109, 0, 0, 575, 576, 5, 97, 0, 0, 576, 577, 5, 120, 0, 0, 577, 62, 1, 0, 0, 0, 578, 579, 5, 97, 0, 0, 579, 580, 5, 108, 0, 0, 580, 581, 5, 108, 0, 0, 581, 582, 5, 111, 0, 0, 582, 583, 5, 119, 0, 0, 583, 64, 1, 0, 0, 0, 584, 585, 5, 112, 0, 0, 585, 586, 5, 111, 0, 0, 586, 587, 5, 108, 0, 0, 587, 588, 5, 108, 0, 0, 588, 66, 1, 0, 0, 0, 589, 590, 5, 113, 0, 0, 590, 591, 5, 117, 0, 0, 591, 592, 5, 101, 0, 0, 592, 593, 5, 114, 0, 0, 593, 594, 5, 121, 0, 0, 594, 595, 5, 97, 0, 0, 595, 596, 5, 98, 0, 0, 596, 597, 5, 108, 0, 0, 597, 598, 5, 101, 0, 0, 598, 68, 1, 0, 0, 0, 599, 600, 5, 114, 0, 0, 600, 601, 5, 112, 0, 0, 601, 602, 5, 99, 0, 0, 602, 70, 1, 0, 0, 0, 603, 604, 5, 113, 0, 0, 604, 605, 5, 117, 0, 0, 605, 606, 5, 101, 0, 0, 606, 607, 5, 114, 0, 0, 607, 608, 5, 121, 0, 0, 608, 609, 5, 45, 0, 0, 609, 610, 5, 114, 0, 0, 610, 611, 5, 101, 0, 0, 611, 612, 5, 97, 0, 0, 612, 613, 5, 115, 0, 0, 613, 614, 5, 111, 0, 0, 614, 615, 5, 110, 0, 0, 615, 72, 1, 0, 0, 0, 616, 617, 5, 116, 0, 0, 617, 618, 5, 121, 0, 0, 618, 619, 5, 112, 0, 0, 619, 620, 5, 101, 0, 0, 620, 74, 1, 0, 0, 0, 621, 622, 5, 111, 0, 0, 622, 623, 5, 98, 0, 0, 623, 624, 5, 106, 0, 0, 624, 625, 5, 101, 0, 0, 625, 626, 5, 99, 0, 0, 626, 627, 5, 116, 0, 0, 627, 76, 1, 0, 0, 0, 628, 629, 5, 115, 0, 0, 629, 630, 5, 116, 0, 0, 630, 631, 5, 111, 0, 0, 631, 632, 5, 114, 0, 0, 632, 633, 5, 97, 0, 0, 633, 634, 5, 98, 0, 0, 634, 635, 5, 108, 0, 0, 635, 636, 5, 101, 0, 0, 636, 78, 1, 0, 0, 0, 637, 638, 5, 105, 0, 0, 638, 639, 5, 109, 0, 0, 639, 640, 5, 112, 0, 0, 640, 641, 5, 108, 0, 0, 641, 642, 5, 101, 0, 0, 642, 643, 5, 109, 0, 0, 643, 644, 5, 101, 0, 0, 644, 645, 5, 110, 0, 0, 645, 646, 5, 116, 0, 0, 646, 647, 5, 115, 0, 0, 647, 80, 1, 0, 0, 0, 648, 649, 5, 114, 0, 0, 649, 650, 5, 101, 0, 0, 650, 651, 5, 102, 0, 0, 651, 82, 1, 0, 0, 0, 652, 653, 5, 102, 0, 0, 653, 654, 5, 114, 0, 0, 654, 655, 5, 97, 0, 0, 655, 656, 5, 103, 0, 0, 656, 657, 5, 109, 0, 0, 657, 658, 5, 101, 0, 0, 658, 659, 5, 110, 0, 0, 659, 660, 5, 116, 0, 0, 660, 84, 1, 0, 0, 0, 661, 662, 5, 105, 0, 0, 662, 663, 5, 109, 0, 0, 663, 664, 5, 112, 0, 0, 664, 665, 5, 111, 0, 0, 665, 666, 5, 114, 0, 0, 666, 667, 5, 116, 0, 0, 667, 86, 1, 0, 0, 0, 668, 669, 5, 101, 0, 0, 669, 670, 5, 120, 0, 0, 670, 671, 5, 116, 0, 0, 671, 672, 5, 101, 0, 0, 672, 673, 5, 114, 0, 0, 673, 674, 5, 110, 0, 0, 674, 675, 5, 97, 0, 0, 675, 676, 5, 108, 0, 0, 676, 88, 1, 0, 0, 0, 677, 678, 5, 97, 0, 0, 678, 679, 5, 116, 0, 0, 679, 680, 5, 111, 0, 0, 680, 681, 5, 109, 0, 0, 681, 90, 1, 0, 0, 0, 682, 683, 5, 105, 0, 0, 683, 684, 5, 110, 0, 0, 684, 685, 5, 116, 0, 0, 685, 686, 5, 101, 0, 0, 686, 687, 5, 114, 0, 0, 687, 688, 5, 102, 0, 0, 688, 689, 5, 97, 0, 0, 689, 690, 5, 99, 0, 0, 690, 691, 5, 101, 0, 0, 691, 92, 1, 0, 0, 0, 692, 693, 5, 105, 0, 0, 693, 694, 5, 110, 0, 0, 694, 695, 5, 116, 0, 0, 695, 696, 5, 101, 0, 0, 696, 697, 5, 114, 0, 0, 697, 698, 5, 102, 0, 0, 698, 699, 5, 97, 0, 0, 699, 700, 5, 99, 0, 0, 700, 701, 5, 101, 0, 0, 701, 702, 5, 115, 0, 0, 702, 94, 1, 0, 0, 0, 703, 704, 5, 112, 0, 0, 704, 705, 5, 97, 0, 0, 705, 706, 5, 99, 0, 0, 706, 707, 5, 107, 0, 0, 707, 708, 5, 97, 0, 0, 708, 709, 5, 103, 0, 0, 709, 710, 5, 101, 0, 0, 710, 96, 1, 0, 0, 0, 711, 712, 5, 118, 0, 0, 712, 713, 5, 97, 0, 0, 713, 714, 5, 108, 0, 0, 714, 715, 5, 117, 0, 0, 715, 716, 5, 101, 0, 0, 716, 98, 1, 0, 0, 0, 717, 718, 5, 114, 0, 0, 718, 719, 5, 101, 0, 0, 719, 720, 5, 108, 0, 0, 720, 721, 5, 97, 0, 0, 721, 722, 5, 116, 0, 0, 722, 723, 5, 105, 0, 0, 723, 724, 5, 111, 0, 0, 724, 725, 5, 110, 0, 0, 725, 100, 1, 0, 0, 0, 726, 727, 5, 111, 0, 0, 727, 728, 5, 112, 0, 0, 728, 729, 5, 101, 0, 0, 729, 730, 5, 114, 0, 0, 730, 731, 5, 97, 0, 0, 731, 732, 5, 116, 0, 0, 732, 733, 5, 105, 0, 0, 733, 734, 5, 111, 0, 0, 734, 735, 5, 110, 0, 0, 735, 102, 1, 0, 0, 0, 736, 737, 5, 102, 0, 0, 737, 738, 5, 117, 0, 0, 738, 739, 5, 110, 0, 0, 739, 740, 5, 99, 0, 0, 740, 741, 5, 116, 0, 0, 741, 742, 5, 105, 0, 0, 742, 743, 5, 111, 0, 0, 743, 744, 5, 110, 0, 0, 744, 104, 1, 0, 0, 0, 745, 746, 5, 99, 0, 0, 746, 747, 5, 111, 0, 0, 747, 748, 5, 110, 0, 0, 748, 749, 5, 115, 0, 0, 749, 750, 5, 116, 0, 0, 750, 751, 5, 114, 0, 0, 751, 752, 5, 117, 0, 0, 752, 753, 5, 99, 0, 0, 753, 754, 5, 116, 0, 0, 754, 755, 5, 111, 0, 0, 755, 756, 5, 114, 0, 0, 756, 106, 1, 0, 0, 0, 757, 758, 5, 99, 0, 0, 758, 759, 5, 111, 0, 0, 759, 760, 5, 110, 0, 0, 760, 761, 5, 115, 0, 0, 761, 762, 5, 116, 0, 0, 762, 763, 5, 114, 0, 0, 763, 764, 5, 117, 0, 0, 764, 765, 5, 99, 0, 0, 765, 766, 5, 116, 0, 0, 766, 767, 5, 115, 0, 0, 767, 108, 1, 0, 0, 0, 768, 769, 5, 105, 0, 0, 769, 770, 5, 110, 0, 0, 770, 771, 5, 112, 0, 0, 771, 772, 5, 117, 0, 0, 772, 773, 5, 116, 0, 0, 773, 110, 1, 0, 0, 0, 774, 775, 5, 99, 0, 0, 775, 776, 5, 111, 0, 0, 776, 777, 5, 110, 0, 0, 777, 778, 5, 102, 0, 0, 778, 779, 5, 111, 0, 0, 779, 780, 5, 114, 0, 0, 780, 781, 5, 109, 0, 0, 781, 112, 1, 0, 0, 0, 782, 783, 5, 97, 0, 0, 783, 784, 5, 115, 0, 0, 784, 114, 1, 0, 0, 0, 785, 786, 5, 98, 0, 0, 786, 787, 5, 105, 0, 0, 787, 788, 5, 110, 0, 0, 788, 789, 5, 100, 0, 0, 789, 116, 1, 0, 0, 0, 790, 791, 5, 115, 0, 0, 791, 792, 5, 116, 0, 0, 792, 793, 5, 97, 0, 0, 793, 794, 5, 116, 0, 0, 794, 795, 5, 105, 0, 0, 795, 796, 5, 99, 0, 0, 796, 118, 1, 0, 0, 0, 797, 798, 5, 116, 0, 0, 798, 799, 5, 111, 0, 0, 799, 120, 1, 0, 0, 0, 800, 801, 5, 112, 0, 0, 801, 802, 5, 114, 0, 0, 802, 803, 5, 105, 0, 0, 803, 804, 5, 118, 0, 0, 804, 805, 5, 97, 0, 0, 805, 806, 5, 116, 0, 0, 806, 807, 5, 101, 0, 0, 807, 122, 1, 0, 0, 0, 808, 809, 5, 115, 0, 0, 809, 810, 5, 104, 0, 0, 810, 811, 5, 97, 0, 0, 811, 812, 5, 114, 0, 0, 812, 813, 5, 101, 0, 0, 813, 814, 5, 100, 0, 0, 814, 124, 1, 0, 0, 0, 815, 816, 5, 115, 0, 0, 816, 817, 5, 116, 0, 0, 817, 818, 5, 97, 0, 0, 818, 819, 5, 116, 0, 0, 819, 820, 5, 101, 0, 0, 820, 126, 1, 0, 0, 0, 821, 822, 5, 101, 0, 0, 822, 823, 5, 100, 0, 0, 823, 824, 5, 103, 0, 0, 824, 825, 5, 101, 0, 0, 825, 128, 1, 0, 0, 0, 826, 827, 5, 112, 0, 0, 827, 828, 5, 114, 0, 0, 828, 829, 5, 111, 0, 0, 829, 830, 5, 106, 0, 0, 830, 831, 5, 101, 0, 0, 831, 832, 5, 99, 0, 0, 832, 833, 5, 116, 0, 0, 833, 834, 5, 105, 0, 0, 834, 835, 5, 111, 0, 0, 835, 836, 5, 110, 0, 0, 836, 130, 1, 0, 0, 0, 837, 838, 5, 119, 0, 0, 838, 839, 5, 105, 0, 0, 839, 840, 5, 116, 0, 0, 840, 841, 5, 104, 0, 0, 841, 132, 1, 0, 0, 0, 842, 843, 5, 117, 0, 0, 843, 844, 5, 115, 0, 0, 844, 845, 5, 105, 0, 0, 845, 846, 5, 110, 0, 0, 846, 847, 5, 103, 0, 0, 847, 134, 1, 0, 0, 0, 848, 849, 5, 97, 0, 0, 849, 850, 5, 99, 0, 0, 850, 851, 5, 99, 0, 0, 851, 852, 5, 101, 0, 0, 852, 853, 5, 112, 0, 0, 853, 854, 5, 116, 0, 0, 854, 136, 1, 0, 0, 0, 855, 856, 5, 118, 0, 0, 856, 857, 5, 105, 0, 0, 857, 858, 5, 97, 0, 0, 858, 138, 1, 0, 0, 0, 859, 860, 5, 109, 0, 0, 860, 861, 5, 97, 0, 0, 861, 862, 5, 116, 0, 0, 862, 863, 5, 101, 0, 0, 863, 864, 5, 114, 0, 0, 864, 865, 5, 105, 0, 0, 865, 866, 5, 97, 0, 0, 866, 867, 5, 108, 0, 0, 867, 868, 5, 105, 0, 0, 868, 869, 5, 122, 0, 0, 869, 870, 5, 101, 0, 0, 870, 140, 1, 0, 0, 0, 871, 872, 5, 105, 0, 0, 872, 873, 5, 102, 0, 0, 873, 142, 1, 0, 0, 0, 874, 875, 5, 97, 0, 0, 875, 876, 5, 98, 0, 0, 876, 877, 5, 115, 0, 0, 877, 878, 5, 101, 0, 0, 878, 879, 5, 110, 0, 0, 879, 880, 5, 116, 0, 0, 880, 144, 1, 0, 0, 0, 881, 882, 5, 111, 0, 0, 882, 883, 5, 110, 0, 0, 883, 146, 1, 0, 0, 0, 884, 885, 5, 112, 0, 0, 885, 886, 5, 111, 0, 0, 886, 887, 5, 108, 0, 0, 887, 888, 5, 105, 0, 0, 888, 889, 5, 99, 0, 0, 889, 890, 5, 121, 0, 0, 890, 148, 1, 0, 0, 0, 891, 892, 5, 100, 0, 0, 892, 893, 5, 101, 0, 0, 893, 894, 5, 102, 0, 0, 894, 895, 5, 97, 0, 0, 895, 896, 5, 117, 0, 0, 896, 897, 5, 108, 0, 0, 897, 898, 5, 116, 0, 0, 898, 150, 1, 0, 0, 0, 899, 900, 5, 115, 0, 0, 900, 901, 5, 111, 0, 0, 901, 902, 5, 117, 0, 0, 902, 903, 5, 114, 0, 0, 903, 904, 5, 99, 0, 0, 904, 905, 5, 101, 0, 0, 905, 152, 1, 0, 0, 0, 906, 907, 5, 114, 0, 0, 907, 908, 5, 101, 0, 0, 908, 909, 5, 112, 0, 0, 909, 910, 5, 111, 0, 0, 910, 911, 5, 115, 0, 0, 911, 912, 5, 105, 0, 0, 912, 913, 5, 116, 0, 0, 913, 914, 5, 111, 0, 0, 914, 915, 5, 114, 0, 0, 915, 916, 5, 121, 0, 0, 916, 154, 1, 0, 0, 0, 917, 918, 5, 99, 0, 0, 918, 919, 5, 111, 0, 0, 919, 920, 5, 109, 0, 0, 920, 921, 5, 109, 0, 0, 921, 922, 5, 105, 0, 0, 922, 923, 5, 116, 0, 0, 923, 156, 1, 0, 0, 0, 924, 925, 5, 114, 0, 0, 925, 926, 5, 101, 0, 0, 926, 927, 5, 118, 0, 0, 927, 928, 5, 105, 0, 0, 928, 929, 5, 115, 0, 0, 929, 930, 5, 105, 0, 0, 930, 931, 5, 111, 0, 0, 931, 932, 5, 110, 0, 0, 932, 158, 1, 0, 0, 0, 933, 934, 5, 115, 0, 0, 934, 935, 5, 101, 0, 0, 935, 936, 5, 109, 0, 0, 936, 937, 5, 97, 0, 0, 937, 938, 5, 110, 0, 0, 938, 939, 5, 116, 0, 0, 939, 940, 5, 105, 0, 0, 940, 941, 5, 99, 0, 0, 941, 942, 5, 45, 0, 0, 942, 943, 5, 109, 0, 0, 943, 944, 5, 97, 0, 0, 944, 945, 5, 106, 0, 0, 945, 946, 5, 111, 0, 0, 946, 947, 5, 114, 0, 0, 947, 160, 1, 0, 0, 0, 948, 949, 5, 111, 0, 0, 949, 950, 5, 110, 0, 0, 950, 951, 5, 45, 0, 0, 951, 952, 5, 100, 0, 0, 952, 953, 5, 101, 0, 0, 953, 954, 5, 108, 0, 0, 954, 955, 5, 101, 0, 0, 955, 956, 5, 116, 0, 0, 956, 957, 5, 101, 0, 0, 957, 162, 1, 0, 0, 0, 958, 959, 5, 108, 0, 0, 959, 960, 5, 105, 0, 0, 960, 961, 5, 102, 0, 0, 961, 962, 5, 101, 0, 0, 962, 963, 5, 99, 0, 0, 963, 964, 5, 121, 0, 0, 964, 965, 5, 99, 0, 0, 965, 966, 5, 108, 0, 0, 966, 967, 5, 101, 0, 0, 967, 164, 1, 0, 0, 0, 968, 969, 5, 114, 0, 0, 969, 970, 5, 101, 0, 0, 970, 971, 5, 116, 0, 0, 971, 972, 5, 97, 0, 0, 972, 973, 5, 105, 0, 0, 973, 974, 5, 110, 0, 0, 974, 975, 5, 45, 0, 0, 975, 976, 5, 111, 0, 0, 976, 977, 5, 116, 0, 0, 977, 978, 5, 104, 0, 0, 978, 979, 5, 101, 0, 0, 979, 980, 5, 114, 0, 0, 980, 166, 1, 0, 0, 0, 981, 982, 5, 107, 0, 0, 982, 983, 5, 101, 0, 0, 983, 984, 5, 121, 0, 0, 984, 985, 5, 101, 0, 0, 985, 986, 5, 100, 0, 0, 986, 168, 1, 0, 0, 0, 987, 988, 5, 112, 0, 0, 988, 989, 5, 117, 0, 0, 989, 990, 5, 98, 0, 0, 990, 991, 5, 108, 0, 0, 991, 992, 5, 105, 0, 0, 992, 993, 5, 99, 0, 0, 993, 994, 5, 45, 0, 0, 994, 995, 5, 116, 0, 0, 995, 996, 5, 114, 0, 0, 996, 997, 5, 97, 0, 0, 997, 998, 5, 118, 0, 0, 998, 999, 5, 101, 0, 0, 999, 1000, 5, 114, 0, 0, 1000, 1001, 5, 115, 0, 0, 1001, 1002, 5, 97, 0, 0, 1002, 1003, 5, 108, 0, 0, 1003, 170, 1, 0, 0, 0, 1004, 1005, 5, 105, 0, 0, 1005, 1006, 5, 100, 0, 0, 1006, 172, 1, 0, 0, 0, 1007, 1008, 5, 100, 0, 0, 1008, 1009, 5, 111, 0, 0, 1009, 1010, 5, 99, 0, 0, 1010, 174, 1, 0, 0, 0, 1011, 1012, 5, 109, 0, 0, 1012, 1013, 5, 111, 0, 0, 1013, 1014, 5, 100, 0, 0, 1014, 1015, 5, 101, 0, 0, 1015, 176, 1, 0, 0, 0, 1016, 1017, 5, 101, 0, 0, 1017, 1018, 5, 109, 0, 0, 1018, 1019, 5, 105, 0, 0, 1019, 1020, 5, 116, 0, 0, 1020, 1021, 5, 115, 0, 0, 1021, 178, 1, 0, 0, 0, 1022, 1023, 5, 114, 0, 0, 1023, 1024, 5, 101, 0, 0, 1024, 1025, 5, 99, 0, 0, 1025, 1026, 5, 101, 0, 0, 1026, 1027, 5, 105, 0, 0, 1027, 1028, 5, 118, 0, 0, 1028, 1029, 5, 101, 0, 0, 1029, 1030, 5, 114, 0, 0, 1030, 180, 1, 0, 0, 0, 1031, 1032, 5, 114, 0, 0, 1032, 1033, 5, 101, 0, 0, 1033, 1034, 5, 113, 0, 0, 1034, 1035, 5, 117, 0, 0, 1035, 1036, 5, 105, 0, 0, 1036, 1037, 5, 114, 0, 0, 1037, 1038, 5, 101, 0, 0, 1038, 1039, 5, 115, 0, 0, 1039, 182, 1, 0, 0, 0, 1040, 1041, 5, 97, 0, 0, 1041, 1042, 5, 110, 0, 0, 1042, 1043, 5, 121, 0, 0, 1043, 184, 1, 0, 0, 0, 1044, 1045, 5, 103, 0, 0, 1045, 1046, 5, 101, 0, 0, 1046, 1047, 5, 116, 0, 0, 1047, 186, 1, 0, 0, 0, 1048, 1049, 5, 115, 0, 0, 1049, 1050, 5, 101, 0, 0, 1050, 1051, 5, 116, 0, 0, 1051, 188, 1, 0, 0, 0, 1052, 1053, 5, 119, 0, 0, 1053, 1054, 5, 97, 0, 0, 1054, 1055, 5, 116, 0, 0, 1055, 1056, 5, 99, 0, 0, 1056, 1057, 5, 104, 0, 0, 1057, 190, 1, 0, 0, 0, 1058, 1059, 5, 115, 0, 0, 1059, 1060, 5, 116, 0, 0, 1060, 1061, 5, 97, 0, 0, 1061, 1062, 5, 114, 0, 0, 1062, 1063, 5, 116, 0, 0, 1063, 192, 1, 0, 0, 0, 1064, 1065, 5, 115, 0, 0, 1065, 1066, 5, 116, 0, 0, 1066, 1067, 5, 111, 0, 0, 1067, 1068, 5, 112, 0, 0, 1068, 194, 1, 0, 0, 0, 1069, 1070, 5, 114, 0, 0, 1070, 1071, 5, 101, 0, 0, 1071, 1072, 5, 97, 0, 0, 1072, 1073, 5, 100, 0, 0, 1073, 196, 1, 0, 0, 0, 1074, 1075, 5, 119, 0, 0, 1075, 1076, 5, 114, 0, 0, 1076, 1077, 5, 105, 0, 0, 1077, 1078, 5, 116, 0, 0, 1078, 1079, 5, 101, 0, 0, 1079, 198, 1, 0, 0, 0, 1080, 1081, 5, 114, 0, 0, 1081, 1082, 5, 101, 0, 0, 1082, 1083, 5, 115, 0, 0, 1083, 1084, 5, 111, 0, 0, 1084, 1085, 5, 108, 0, 0, 1085, 1086, 5, 118, 0, 0, 1086, 1087, 5, 101, 0, 0, 1087, 200, 1, 0, 0, 0, 1088, 1089, 5, 99, 0, 0, 1089, 1090, 5, 111, 0, 0, 1090, 1091, 5, 110, 0, 0, 1091, 1092, 5, 110, 0, 0, 1092, 1093, 5, 101, 0, 0, 1093, 1094, 5, 99, 0, 0, 1094, 1095, 5, 116, 0, 0, 1095, 202, 1, 0, 0, 0, 1096, 1097, 5, 100, 0, 0, 1097, 1098, 5, 105, 0, 0, 1098, 1099, 5, 115, 0, 0, 1099, 1100, 5, 99, 0, 0, 1100, 1101, 5, 111, 0, 0, 1101, 1102, 5, 110, 0, 0, 1102, 1103, 5, 110, 0, 0, 1103, 1104, 5, 101, 0, 0, 1104, 1105, 5, 99, 0, 0, 1105, 1106, 5, 116, 0, 0, 1106, 204, 1, 0, 0, 0, 1107, 1108, 5, 99, 0, 0, 1108, 1109, 5, 97, 0, 0, 1109, 1110, 5, 108, 0, 0, 1110, 1111, 5, 108, 0, 0, 1111, 206, 1, 0, 0, 0, 1112, 1113, 5, 119, 0, 0, 1113, 1114, 5, 97, 0, 0, 1114, 1115, 5, 116, 0, 0, 1115, 1116, 5, 99, 0, 0, 1116, 1117, 5, 104, 0, 0, 1117, 1118, 5, 45, 0, 0, 1118, 1119, 5, 115, 0, 0, 1119, 1120, 5, 116, 0, 0, 1120, 1121, 5, 97, 0, 0, 1121, 1122, 5, 114, 0, 0, 1122, 1123, 5, 116, 0, 0, 1123, 208, 1, 0, 0, 0, 1124, 1125, 5, 119, 0, 0, 1125, 1126, 5, 97, 0, 0, 1126, 1127, 5, 116, 0, 0, 1127, 1128, 5, 99, 0, 0, 1128, 1129, 5, 104, 0, 0, 1129, 1130, 5, 45, 0, 0, 1130, 1131, 5, 115, 0, 0, 1131, 1132, 5, 116, 0, 0, 1132, 1133, 5, 111, 0, 0, 1133, 1134, 5, 112, 0, 0, 1134, 210, 1, 0, 0, 0, 1135, 1136, 5, 115, 0, 0, 1136, 1137, 5, 117, 0, 0, 1137, 1138, 5, 98, 0, 0, 1138, 1139, 5, 115, 0, 0, 1139, 1140, 5, 99, 0, 0, 1140, 1141, 5, 114, 0, 0, 1141, 1142, 5, 105, 0, 0, 1142, 1143, 5, 98, 0, 0, 1143, 1144, 5, 101, 0, 0, 1144, 212, 1, 0, 0, 0, 1145, 1146, 5, 117, 0, 0, 1146, 1147, 5, 110, 0, 0, 1147, 1148, 5, 115, 0, 0, 1148, 1149, 5, 117, 0, 0, 1149, 1150, 5, 98, 0, 0, 1150, 1151, 5, 115, 0, 0, 1151, 1152, 5, 99, 0, 0, 1152, 1153, 5, 114, 0, 0, 1153, 1154, 5, 105, 0, 0, 1154, 1155, 5, 98, 0, 0, 1155, 1156, 5, 101, 0, 0, 1156, 214, 1, 0, 0, 0, 1157, 1158, 5, 114, 0, 0, 1158, 1159, 5, 101, 0, 0, 1159, 1160, 5, 103, 0, 0, 1160, 1161, 5, 105, 0, 0, 1161, 1162, 5, 115, 0, 0, 1162, 1163, 5, 116, 0, 0, 1163, 1164, 5, 101, 0, 0, 1164, 1165, 5, 114, 0, 0, 1165, 216, 1, 0, 0, 0, 1166, 1167, 5, 99, 0, 0, 1167, 1168, 5, 114, 0, 0, 1168, 1169, 5, 100, 0, 0, 1169, 1170, 5, 116, 0, 0, 1170, 218, 1, 0, 0, 0, 1171, 1172, 5, 111, 0, 0, 1172, 1173, 5, 112, 0, 0, 1173, 1174, 5, 116, 0, 0, 1174, 1175, 5, 105, 0, 0, 1175, 1176, 5, 111, 0, 0, 1176, 1177, 5, 110, 0, 0, 1177, 1178, 5, 97, 0, 0, 1178, 1179, 5, 108, 0, 0, 1179, 1180, 5, 45, 0, 0, 1180, 1181, 5, 111, 0, 0, 1181, 1182, 5, 110, 0, 0, 1182, 1183, 5, 101, 0, 0, 1183, 220, 1, 0, 0, 0, 1184, 1185, 5, 101, 0, 0, 1185, 1186, 5, 120, 0, 0, 1186, 1187, 5, 97, 0, 0, 1187, 1188, 5, 99, 0, 0, 1188, 1189, 5, 116, 0, 0, 1189, 1190, 5, 108, 0, 0, 1190, 1191, 5, 121, 0, 0, 1191, 1192, 5, 45, 0, 0, 1192, 1193, 5, 111, 0, 0, 1193, 1194, 5, 110, 0, 0, 1194, 1195, 5, 101, 0, 0, 1195, 222, 1, 0, 0, 0, 1196, 1197, 5, 109, 0, 0, 1197, 1198, 5, 97, 0, 0, 1198, 1199, 5, 110, 0, 0, 1199, 1200, 5, 121, 0, 0, 1200, 1201, 5, 45, 0, 0, 1201, 1202, 5, 117, 0, 0, 1202, 1203, 5, 110, 0, 0, 1203, 1204, 5, 105, 0, 0, 1204, 1205, 5, 113, 0, 0, 1205, 1206, 5, 117, 0, 0, 1206, 1207, 5, 101, 0, 0, 1207, 224, 1, 0, 0, 0, 1208, 1209, 5, 109, 0, 0, 1209, 1210, 5, 97, 0, 0, 1210, 1211, 5, 110, 0, 0, 1211, 1212, 5, 121, 0, 0, 1212, 226, 1, 0, 0, 0, 1213, 1214, 5, 111, 0, 0, 1214, 1215, 5, 114, 0, 0, 1215, 1216, 5, 100, 0, 0, 1216, 1217, 5, 101, 0, 0, 1217, 1218, 5, 114, 0, 0, 1218, 1219, 5, 101, 0, 0, 1219, 1220, 5, 100, 0, 0, 1220, 228, 1, 0, 0, 0, 1221, 1222, 5, 117, 0, 0, 1222, 1223, 5, 110, 0, 0, 1223, 1224, 5, 105, 0, 0, 1224, 1225, 5, 116, 0, 0, 1225, 230, 1, 0, 0, 0, 1226, 1227, 5, 119, 0, 0, 1227, 1228, 5, 97, 0, 0, 1228, 1229, 5, 116, 0, 0, 1229, 1230, 5, 99, 0, 0, 1230, 1231, 5, 104, 0, 0, 1231, 1232, 5, 45, 0, 0, 1232, 1233, 5, 104, 0, 0, 1233, 1234, 5, 97, 0, 0, 1234, 1235, 5, 110, 0, 0, 1235, 1236, 5, 100, 0, 0, 1236, 1237, 5, 108, 0, 0, 1237, 1238, 5, 101, 0, 0, 1238, 232, 1, 0, 0, 0, 1239, 1240, 5, 109, 0, 0, 1240, 1241, 5, 101, 0, 0, 1241, 1242, 5, 115, 0, 0, 1242, 1243, 5, 115, 0, 0, 1243, 1244, 5, 97, 0, 0, 1244, 1245, 5, 103, 0, 0, 1245, 1246, 5, 101, 0, 0, 1246, 234, 1, 0, 0, 0, 1247, 1248, 5, 97, 0, 0, 1248, 1249, 5, 116, 0, 0, 1249, 1250, 5, 111, 0, 0, 1250, 1251, 5, 109, 0, 0, 1251, 1252, 5, 45, 0, 0, 1252, 1253, 5, 114, 0, 0, 1253, 1254, 5, 101, 0, 0, 1254, 1255, 5, 102, 0, 0, 1255, 236, 1, 0, 0, 0, 1256, 1257, 5, 105, 0, 0, 1257, 1258, 5, 110, 0, 0, 1258, 1259, 5, 116, 0, 0, 1259, 1260, 5, 101, 0, 0, 1260, 1261, 5, 114, 0, 0, 1261, 1262, 5, 102, 0, 0, 1262, 1263, 5, 97, 0, 0, 1263, 1264, 5, 99, 0, 0, 1264, 1265, 5, 101, 0, 0, 1265, 1266, 5, 45, 0, 0, 1266, 1267, 5, 114, 0, 0, 1267, 1268, 5, 101, 0, 0, 1268, 1269, 5, 102, 0, 0, 1269, 238, 1, 0, 0, 0, 1270, 1271, 5, 111, 0, 0, 1271, 1272, 5, 112, 0, 0, 1272, 1273, 5, 116, 0, 0, 1273, 1274, 5, 105, 0, 0, 1274, 1275, 5, 111, 0, 0, 1275, 1276, 5, 110, 0, 0, 1276, 1277, 5, 97, 0, 0, 1277, 1278, 5, 108, 0, 0, 1278, 240, 1, 0, 0, 0, 1279, 1280, 5, 108, 0, 0, 1280, 1281, 5, 105, 0, 0, 1281, 1282, 5, 115, 0, 0, 1282, 1283, 5, 116, 0, 0, 1283, 242, 1, 0, 0, 0, 1284, 1285, 5, 114, 0, 0, 1285, 1286, 5, 101, 0, 0, 1286, 1287, 5, 99, 0, 0, 1287, 1288, 5, 111, 0, 0, 1288, 1289, 5, 114, 0, 0, 1289, 1290, 5, 100, 0, 0, 1290, 244, 1, 0, 0, 0, 1291, 1292, 5, 98, 0, 0, 1292, 1293, 5, 111, 0, 0, 1293, 1294, 5, 111, 0, 0, 1294, 1295, 5, 108, 0, 0, 1295, 246, 1, 0, 0, 0, 1296, 1297, 5, 98, 0, 0, 1297, 1298, 5, 121, 0, 0, 1298, 1299, 5, 116, 0, 0, 1299, 1300, 5, 101, 0, 0, 1300, 1301, 5, 115, 0, 0, 1301, 248, 1, 0, 0, 0, 1302, 1303, 5, 100, 0, 0, 1303, 1304, 5, 111, 0, 0, 1304, 1305, 5, 117, 0, 0, 1305, 1306, 5, 98, 0, 0, 1306, 1307, 5, 108, 0, 0, 1307, 1308, 5, 101, 0, 0, 1308, 250, 1, 0, 0, 0, 1309, 1310, 5, 105, 0, 0, 1310, 1311, 5, 110, 0, 0, 1311, 1312, 5, 116, 0, 0, 1312, 1313, 5, 51, 0, 0, 1313, 1314, 5, 50, 0, 0, 1314, 252, 1, 0, 0, 0, 1315, 1316, 5, 105, 0, 0, 1316, 1317, 5, 110, 0, 0, 1317, 1318, 5, 116, 0, 0, 1318, 1319, 5, 54, 0, 0, 1319, 1320, 5, 52, 0, 0, 1320, 254, 1, 0, 0, 0, 1321, 1322, 5, 115, 0, 0, 1322, 1323, 5, 116, 0, 0, 1323, 1324, 5, 114, 0, 0, 1324, 1325, 5, 105, 0, 0, 1325, 1326, 5, 110, 0, 0, 1326, 1327, 5, 103, 0, 0, 1327, 256, 1, 0, 0, 0, 1328, 1329, 5, 117, 0, 0, 1329, 1330, 5, 105, 0, 0, 1330, 1331, 5, 110, 0, 0, 1331, 1332, 5, 116, 0, 0, 1332, 1333, 5, 51, 0, 0, 1333, 1334, 5, 50, 0, 0, 1334, 258, 1, 0, 0, 0, 1335, 1336, 5, 117, 0, 0, 1336, 1337, 5, 105, 0, 0, 1337, 1338, 5, 110, 0, 0, 1338, 1339, 5, 116, 0, 0, 1339, 1340, 5, 54, 0, 0, 1340, 1341, 5, 52, 0, 0, 1341, 260, 1, 0, 0, 0, 1342, 1343, 5, 116, 0, 0, 1343, 1344, 5, 114, 0, 0, 1344, 1345, 5, 117, 0, 0, 1345, 1346, 5, 101, 0, 0, 1346, 262, 1, 0, 0, 0, 1347, 1348, 5, 102, 0, 0, 1348, 1349, 5, 97, 0, 0, 1349, 1350, 5, 108, 0, 0, 1350, 1351, 5, 115, 0, 0, 1351, 1352, 5, 101, 0, 0, 1352, 264, 1, 0, 0, 0, 1353, 1354, 5, 110, 0, 0, 1354, 1355, 5, 117, 0, 0, 1355, 1356, 5, 108, 0, 0, 1356, 1357, 5, 108, 0, 0, 1357, 266, 1, 0, 0, 0, 1358, 1359, 5, 45, 0, 0, 1359, 1360, 5, 62, 0, 0, 1360, 268, 1, 0, 0, 0, 1361, 1362, 5, 58, 0, 0, 1362, 270, 1, 0, 0, 0, 1363, 1364, 5, 59, 0, 0, 1364, 272, 1, 0, 0, 0, 1365, 1366, 5, 44, 0, 0, 1366, 274, 1, 0, 0, 0, 1367, 1368, 5, 46, 0, 0, 1368, 276, 1, 0, 0, 0, 1369, 1370, 5, 123, 0, 0, 1370, 278, 1, 0, 0, 0, 1371, 1372, 5, 125, 0, 0, 1372, 280, 1, 0, 0, 0, 1373, 1374, 5, 91, 0, 0, 1374, 282, 1, 0, 0, 0, 1375, 1376, 5, 93, 0, 0, 1376, 284, 1, 0, 0, 0, 1377, 1378, 5, 40, 0, 0, 1378, 286, 1, 0, 0, 0, 1379, 1380, 5, 41, 0, 0, 1380, 288, 1, 0, 0, 0, 1381, 1382, 5, 60, 0, 0, 1382, 290, 1, 0, 0, 0, 1383, 1384, 5, 62, 0, 0, 1384, 292, 1, 0, 0, 0, 1385, 1386, 5, 38, 0, 0, 1386, 294, 1, 0, 0, 0, 1387, 1388, 5, 61, 0, 0, 1388, 296, 1, 0, 0, 0, 1389, 1391, 5, 45, 0, 0, 1390, 1389, 1, 0, 0, 0, 1390, 1391, 1, 0, 0, 0, 1391, 1393, 1, 0, 0, 0, 1392, 1394, 7, 0, 0, 0, 1393, 1392, 1, 0, 0, 0, 1394, 1395, 1, 0, 0, 0, 1395, 1393, 1, 0, 0, 0, 1395, 1396, 1, 0, 0, 0, 1396, 298, 1, 0, 0, 0, 1397, 1399, 5, 45, 0, 0, 1398, 1397, 1, 0, 0, 0, 1398, 1399, 1, 0, 0, 0, 1399, 1408, 1, 0, 0, 0, 1400, 1409, 5, 48, 0, 0, 1401, 1405, 7, 1, 0, 0, 1402, 1404, 7, 0, 0, 0, 1403, 1402, 1, 0, 0, 0, 1404, 1407, 1, 0, 0, 0, 1405, 1403, 1, 0, 0, 0, 1405, 1406, 1, 0, 0, 0, 1406, 1409, 1, 0, 0, 0, 1407, 1405, 1, 0, 0, 0, 1408, 1400, 1, 0, 0, 0, 1408, 1401, 1, 0, 0, 0, 1409, 1416, 1, 0, 0, 0, 1410, 1412, 5, 46, 0, 0, 1411, 1413, 7, 0, 0, 0, 1412, 1411, 1, 0, 0, 0, 1413, 1414, 1, 0, 0, 0, 1414, 1412, 1, 0, 0, 0, 1414, 1415, 1, 0, 0, 0, 1415, 1417, 1, 0, 0, 0, 1416, 1410, 1, 0, 0, 0, 1416, 1417, 1, 0, 0, 0, 1417, 1427, 1, 0, 0, 0, 1418, 1420, 7, 2, 0, 0, 1419, 1421, 7, 3, 0, 0, 1420, 1419, 1, 0, 0, 0, 1420, 1421, 1, 0, 0, 0, 1421, 1423, 1, 0, 0, 0, 1422, 1424, 7, 0, 0, 0, 1423, 1422, 1, 0, 0, 0, 1424, 1425, 1, 0, 0, 0, 1425, 1423, 1, 0, 0, 0, 1425, 1426, 1, 0, 0, 0, 1426, 1428, 1, 0, 0, 0, 1427, 1418, 1, 0, 0, 0, 1427, 1428, 1, 0, 0, 0, 1428, 300, 1, 0, 0, 0, 1429, 1433, 7, 4, 0, 0, 1430, 1432, 7, 5, 0, 0, 1431, 1430, 1, 0, 0, 0, 1432, 1435, 1, 0, 0, 0, 1433, 1431, 1, 0, 0, 0, 1433, 1434, 1, 0, 0, 0, 1434, 302, 1, 0, 0, 0, 1435, 1433, 1, 0, 0, 0, 1436, 1441, 5, 34, 0, 0, 1437, 1440, 3, 305, 152, 0, 1438, 1440, 8, 6, 0, 0, 1439, 1437, 1, 0, 0, 0, 1439, 1438, 1, 0, 0, 0, 1440, 1443, 1, 0, 0, 0, 1441, 1439, 1, 0, 0, 0, 1441, 1442, 1, 0, 0, 0, 1442, 1444, 1, 0, 0, 0, 1443, 1441, 1, 0, 0, 0, 1444, 1445, 5, 34, 0, 0, 1445, 304, 1, 0, 0, 0, 1446, 1454, 5, 92, 0, 0, 1447, 1455, 7, 7, 0, 0, 1448, 1449, 5, 117, 0, 0, 1449, 1450, 3, 307, 153, 0, 1450, 1451, 3, 307, 153, 0, 1451, 1452, 3, 307, 153, 0, 1452, 1453, 3, 307, 153, 0, 1453, 1455, 1, 0, 0, 0, 1454, 1447, 1, 0, 0, 0, 1454, 1448, 1, 0, 0, 0, 1455, 306, 1, 0, 0, 0, 1456, 1457, 7, 8, 0, 0, 1457, 308, 1, 0, 0, 0, 1458, 1459, 5, 47, 0, 0, 1459, 1460, 5, 47, 0, 0, 1460, 1464, 1, 0, 0, 0, 1461, 1463, 8, 9, 0, 0, 1462, 1461, 1, 0, 0, 0, 1463, 1466, 1, 0, 0, 0, 1464, 1462, 1, 0, 0, 0, 1464, 1465, 1, 0, 0, 0, 1465, 1467, 1, 0, 0, 0, 1466, 1464, 1, 0, 0, 0, 1467, 1468, 6, 154, 0, 0, 1468, 310, 1, 0, 0, 0, 1469, 1470, 5, 47, 0, 0, 1470, 1471, 5, 42, 0, 0, 1471, 1475, 1, 0, 0, 0, 1472, 1474, 9, 0, 0, 0, 1473, 1472, 1, 0, 0, 0, 1474, 1477, 1, 0, 0, 0, 1475, 1476, 1, 0, 0, 0, 1475, 1473, 1, 0, 0, 0, 1476, 1478, 1, 0, 0, 0, 1477, 1475, 1, 0, 0, 0, 1478, 1479, 5, 42, 0, 0, 1479, 1480, 5, 47, 0, 0, 1480, 1481, 1, 0, 0, 0, 1481, 1482, 6, 155, 0, 0, 1482, 312, 1, 0, 0, 0, 1483, 1485, 7, 10, 0, 0, 1484, 1483, 1, 0, 0, 0, 1485, 1486, 1, 0, 0, 0, 1486, 1484, 1, 0, 0, 0, 1486, 1487, 1, 0, 0, 0, 1487, 1488, 1, 0, 0, 0, 1488, 1489, 6, 156, 0, 0, 1489, 314, 1, 0, 0, 0, 18, 0, 1390, 1395, 1398, 1405, 1408, 1414, 1416, 1420, 1425, 1427, 1433, 1439, 1441, 1454, 1464, 1475, 1486, 1, 0, 1, 0] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapabilityLexer.tokens b/src/capability-language/generated/QuixosCapabilityLexer.tokens index c207cdc..548a5b5 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.tokens +++ b/src/capability-language/generated/QuixosCapabilityLexer.tokens @@ -5,152 +5,154 @@ PRESENTATION=4 SUBJECT=5 FOR=6 CREATION=7 -INITIALIZE=8 -WORKSPACE=9 -EXECUTION=10 -SNAPSHOT=11 -TRANSACTION=12 -REMOTE=13 -TARGETS=14 -PORTABLE=15 -REPLICA=16 -LOCAL=17 -FROM=18 -RESULT_BYTES=19 -RPC_CALLS=20 -DEADLINE_MS=21 -QUERY=22 -REFLECTION=23 -SPECIALIZE=24 -ROOT=25 -DOCUMENT=26 -FRAGMENTS=27 -VIEW=28 -MAX=29 -ALLOW=30 -POLL=31 -QUERYABLE=32 -RPC=33 -QUERY_REASON=34 -TYPE=35 -OBJECT=36 -STORABLE=37 -IMPLEMENTS=38 -REF=39 -FRAGMENT=40 -IMPORT=41 -EXTERNAL=42 -ATOM=43 -INTERFACE=44 -INTERFACES=45 -PACKAGE=46 -VALUE=47 -RELATION=48 -OPERATION=49 -FUNCTION=50 -CONSTRUCTOR=51 -CONSTRUCTS=52 -INPUT=53 -CONFORM=54 -AS=55 -BIND=56 -STATIC=57 -TO=58 -PRIVATE=59 -SHARED=60 -STATE=61 -EDGE=62 -PROJECTION=63 -WITH=64 -USING=65 -ACCEPT=66 -VIA=67 -MATERIALIZE=68 -IF=69 -ABSENT=70 -ON=71 -POLICY=72 -DEFAULT=73 -SOURCE=74 -REPOSITORY=75 -COMMIT=76 -REVISION=77 -SEMANTIC_MAJOR=78 -ON_DELETE=79 -LIFECYCLE=80 -RETAIN_OTHER=81 -KEYED=82 -PUBLIC_TRAVERSAL=83 -ID=84 -DOC=85 -MODE=86 -EMITS=87 -RECEIVER=88 -REQUIRES=89 -ANY=90 -GET=91 -SET=92 -WATCH=93 -START=94 -STOP=95 -READ=96 -WRITE=97 -RESOLVE=98 -CONNECT=99 -DISCONNECT=100 -CALL=101 -WATCH_START=102 -WATCH_STOP=103 -SUBSCRIBE=104 -UNSUBSCRIBE=105 -REGISTER=106 -CRDT=107 -OPTIONAL_ONE=108 -EXACTLY_ONE=109 -MANY_UNIQUE=110 -MANY=111 -ORDERED=112 -UNIT=113 -WATCH_HANDLE=114 -MESSAGE=115 -ATOM_REF=116 -INTERFACE_REF=117 -OPTIONAL=118 -LIST=119 -RECORD=120 -BOOL=121 -BYTES=122 -DOUBLE=123 -INT32=124 -INT64=125 -STRING=126 -UINT32=127 -UINT64=128 -TRUE=129 -FALSE=130 -NULL=131 -ARROW=132 -COLON=133 -SEMI=134 -COMMA=135 -DOT=136 -LBRACE=137 -RBRACE=138 -LBRACK=139 -RBRACK=140 -LPAREN=141 -RPAREN=142 -LT=143 -GT=144 -AMP=145 -EQUAL=146 -INTEGER=147 -JSON_NUMBER=148 -IDENTIFIER=149 -STRING_LITERAL=150 -LINE_COMMENT=151 -BLOCK_COMMENT=152 -WS=153 +VARIANT=8 +PREPARES=9 +INITIALIZE=10 +WORKSPACE=11 +EXECUTION=12 +SNAPSHOT=13 +TRANSACTION=14 +REMOTE=15 +TARGETS=16 +PORTABLE=17 +REPLICA=18 +LOCAL=19 +FROM=20 +RESULT_BYTES=21 +RPC_CALLS=22 +DEADLINE_MS=23 +QUERY=24 +REFLECTION=25 +SPECIALIZE=26 +ROOT=27 +DOCUMENT=28 +FRAGMENTS=29 +VIEW=30 +MAX=31 +ALLOW=32 +POLL=33 +QUERYABLE=34 +RPC=35 +QUERY_REASON=36 +TYPE=37 +OBJECT=38 +STORABLE=39 +IMPLEMENTS=40 +REF=41 +FRAGMENT=42 +IMPORT=43 +EXTERNAL=44 +ATOM=45 +INTERFACE=46 +INTERFACES=47 +PACKAGE=48 +VALUE=49 +RELATION=50 +OPERATION=51 +FUNCTION=52 +CONSTRUCTOR=53 +CONSTRUCTS=54 +INPUT=55 +CONFORM=56 +AS=57 +BIND=58 +STATIC=59 +TO=60 +PRIVATE=61 +SHARED=62 +STATE=63 +EDGE=64 +PROJECTION=65 +WITH=66 +USING=67 +ACCEPT=68 +VIA=69 +MATERIALIZE=70 +IF=71 +ABSENT=72 +ON=73 +POLICY=74 +DEFAULT=75 +SOURCE=76 +REPOSITORY=77 +COMMIT=78 +REVISION=79 +SEMANTIC_MAJOR=80 +ON_DELETE=81 +LIFECYCLE=82 +RETAIN_OTHER=83 +KEYED=84 +PUBLIC_TRAVERSAL=85 +ID=86 +DOC=87 +MODE=88 +EMITS=89 +RECEIVER=90 +REQUIRES=91 +ANY=92 +GET=93 +SET=94 +WATCH=95 +START=96 +STOP=97 +READ=98 +WRITE=99 +RESOLVE=100 +CONNECT=101 +DISCONNECT=102 +CALL=103 +WATCH_START=104 +WATCH_STOP=105 +SUBSCRIBE=106 +UNSUBSCRIBE=107 +REGISTER=108 +CRDT=109 +OPTIONAL_ONE=110 +EXACTLY_ONE=111 +MANY_UNIQUE=112 +MANY=113 +ORDERED=114 +UNIT=115 +WATCH_HANDLE=116 +MESSAGE=117 +ATOM_REF=118 +INTERFACE_REF=119 +OPTIONAL=120 +LIST=121 +RECORD=122 +BOOL=123 +BYTES=124 +DOUBLE=125 +INT32=126 +INT64=127 +STRING=128 +UINT32=129 +UINT64=130 +TRUE=131 +FALSE=132 +NULL=133 +ARROW=134 +COLON=135 +SEMI=136 +COMMA=137 +DOT=138 +LBRACE=139 +RBRACE=140 +LBRACK=141 +RBRACK=142 +LPAREN=143 +RPAREN=144 +LT=145 +GT=146 +AMP=147 +EQUAL=148 +INTEGER=149 +JSON_NUMBER=150 +IDENTIFIER=151 +STRING_LITERAL=152 +LINE_COMMENT=153 +BLOCK_COMMENT=154 +WS=155 'edit'=1 'module'=2 'contract'=3 @@ -158,142 +160,144 @@ WS=153 'subject'=5 'for'=6 'creation'=7 -'initialize'=8 -'workspace'=9 -'execution'=10 -'snapshot'=11 -'transaction'=12 -'remote'=13 -'targets'=14 -'portable'=15 -'replica'=16 -'local'=17 -'from'=18 -'result-bytes'=19 -'rpc-calls'=20 -'deadline-ms'=21 -'query'=22 -'reflection'=23 -'specialize'=24 -'root'=25 -'document'=26 -'fragments'=27 -'view'=28 -'max'=29 -'allow'=30 -'poll'=31 -'queryable'=32 -'rpc'=33 -'query-reason'=34 -'type'=35 -'object'=36 -'storable'=37 -'implements'=38 -'ref'=39 -'fragment'=40 -'import'=41 -'external'=42 -'atom'=43 -'interface'=44 -'interfaces'=45 -'package'=46 -'value'=47 -'relation'=48 -'operation'=49 -'function'=50 -'constructor'=51 -'constructs'=52 -'input'=53 -'conform'=54 -'as'=55 -'bind'=56 -'static'=57 -'to'=58 -'private'=59 -'shared'=60 -'state'=61 -'edge'=62 -'projection'=63 -'with'=64 -'using'=65 -'accept'=66 -'via'=67 -'materialize'=68 -'if'=69 -'absent'=70 -'on'=71 -'policy'=72 -'default'=73 -'source'=74 -'repository'=75 -'commit'=76 -'revision'=77 -'semantic-major'=78 -'on-delete'=79 -'lifecycle'=80 -'retain-other'=81 -'keyed'=82 -'public-traversal'=83 -'id'=84 -'doc'=85 -'mode'=86 -'emits'=87 -'receiver'=88 -'requires'=89 -'any'=90 -'get'=91 -'set'=92 -'watch'=93 -'start'=94 -'stop'=95 -'read'=96 -'write'=97 -'resolve'=98 -'connect'=99 -'disconnect'=100 -'call'=101 -'watch-start'=102 -'watch-stop'=103 -'subscribe'=104 -'unsubscribe'=105 -'register'=106 -'crdt'=107 -'optional-one'=108 -'exactly-one'=109 -'many-unique'=110 -'many'=111 -'ordered'=112 -'unit'=113 -'watch-handle'=114 -'message'=115 -'atom-ref'=116 -'interface-ref'=117 -'optional'=118 -'list'=119 -'record'=120 -'bool'=121 -'bytes'=122 -'double'=123 -'int32'=124 -'int64'=125 -'string'=126 -'uint32'=127 -'uint64'=128 -'true'=129 -'false'=130 -'null'=131 -'->'=132 -':'=133 -';'=134 -','=135 -'.'=136 -'{'=137 -'}'=138 -'['=139 -']'=140 -'('=141 -')'=142 -'<'=143 -'>'=144 -'&'=145 -'='=146 +'variant'=8 +'prepares'=9 +'initialize'=10 +'workspace'=11 +'execution'=12 +'snapshot'=13 +'transaction'=14 +'remote'=15 +'targets'=16 +'portable'=17 +'replica'=18 +'local'=19 +'from'=20 +'result-bytes'=21 +'rpc-calls'=22 +'deadline-ms'=23 +'query'=24 +'reflection'=25 +'specialize'=26 +'root'=27 +'document'=28 +'fragments'=29 +'view'=30 +'max'=31 +'allow'=32 +'poll'=33 +'queryable'=34 +'rpc'=35 +'query-reason'=36 +'type'=37 +'object'=38 +'storable'=39 +'implements'=40 +'ref'=41 +'fragment'=42 +'import'=43 +'external'=44 +'atom'=45 +'interface'=46 +'interfaces'=47 +'package'=48 +'value'=49 +'relation'=50 +'operation'=51 +'function'=52 +'constructor'=53 +'constructs'=54 +'input'=55 +'conform'=56 +'as'=57 +'bind'=58 +'static'=59 +'to'=60 +'private'=61 +'shared'=62 +'state'=63 +'edge'=64 +'projection'=65 +'with'=66 +'using'=67 +'accept'=68 +'via'=69 +'materialize'=70 +'if'=71 +'absent'=72 +'on'=73 +'policy'=74 +'default'=75 +'source'=76 +'repository'=77 +'commit'=78 +'revision'=79 +'semantic-major'=80 +'on-delete'=81 +'lifecycle'=82 +'retain-other'=83 +'keyed'=84 +'public-traversal'=85 +'id'=86 +'doc'=87 +'mode'=88 +'emits'=89 +'receiver'=90 +'requires'=91 +'any'=92 +'get'=93 +'set'=94 +'watch'=95 +'start'=96 +'stop'=97 +'read'=98 +'write'=99 +'resolve'=100 +'connect'=101 +'disconnect'=102 +'call'=103 +'watch-start'=104 +'watch-stop'=105 +'subscribe'=106 +'unsubscribe'=107 +'register'=108 +'crdt'=109 +'optional-one'=110 +'exactly-one'=111 +'many-unique'=112 +'many'=113 +'ordered'=114 +'unit'=115 +'watch-handle'=116 +'message'=117 +'atom-ref'=118 +'interface-ref'=119 +'optional'=120 +'list'=121 +'record'=122 +'bool'=123 +'bytes'=124 +'double'=125 +'int32'=126 +'int64'=127 +'string'=128 +'uint32'=129 +'uint64'=130 +'true'=131 +'false'=132 +'null'=133 +'->'=134 +':'=135 +';'=136 +','=137 +'.'=138 +'{'=139 +'}'=140 +'['=141 +']'=142 +'('=143 +')'=144 +'<'=145 +'>'=146 +'&'=147 +'='=148 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.ts b/src/capability-language/generated/QuixosCapabilityLexer.ts index f701c15..0d9d2cd 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.ts +++ b/src/capability-language/generated/QuixosCapabilityLexer.ts @@ -11,152 +11,154 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public static readonly SUBJECT = 5; public static readonly FOR = 6; public static readonly CREATION = 7; - public static readonly INITIALIZE = 8; - public static readonly WORKSPACE = 9; - public static readonly EXECUTION = 10; - public static readonly SNAPSHOT = 11; - public static readonly TRANSACTION = 12; - public static readonly REMOTE = 13; - public static readonly TARGETS = 14; - public static readonly PORTABLE = 15; - public static readonly REPLICA = 16; - public static readonly LOCAL = 17; - public static readonly FROM = 18; - public static readonly RESULT_BYTES = 19; - public static readonly RPC_CALLS = 20; - public static readonly DEADLINE_MS = 21; - public static readonly QUERY = 22; - public static readonly REFLECTION = 23; - public static readonly SPECIALIZE = 24; - public static readonly ROOT = 25; - public static readonly DOCUMENT = 26; - public static readonly FRAGMENTS = 27; - public static readonly VIEW = 28; - public static readonly MAX = 29; - public static readonly ALLOW = 30; - public static readonly POLL = 31; - public static readonly QUERYABLE = 32; - public static readonly RPC = 33; - public static readonly QUERY_REASON = 34; - public static readonly TYPE = 35; - public static readonly OBJECT = 36; - public static readonly STORABLE = 37; - public static readonly IMPLEMENTS = 38; - public static readonly REF = 39; - public static readonly FRAGMENT = 40; - public static readonly IMPORT = 41; - public static readonly EXTERNAL = 42; - public static readonly ATOM = 43; - public static readonly INTERFACE = 44; - public static readonly INTERFACES = 45; - public static readonly PACKAGE = 46; - public static readonly VALUE = 47; - public static readonly RELATION = 48; - public static readonly OPERATION = 49; - public static readonly FUNCTION = 50; - public static readonly CONSTRUCTOR = 51; - public static readonly CONSTRUCTS = 52; - public static readonly INPUT = 53; - public static readonly CONFORM = 54; - public static readonly AS = 55; - public static readonly BIND = 56; - public static readonly STATIC = 57; - public static readonly TO = 58; - public static readonly PRIVATE = 59; - public static readonly SHARED = 60; - public static readonly STATE = 61; - public static readonly EDGE = 62; - public static readonly PROJECTION = 63; - public static readonly WITH = 64; - public static readonly USING = 65; - public static readonly ACCEPT = 66; - public static readonly VIA = 67; - public static readonly MATERIALIZE = 68; - public static readonly IF = 69; - public static readonly ABSENT = 70; - public static readonly ON = 71; - public static readonly POLICY = 72; - public static readonly DEFAULT = 73; - public static readonly SOURCE = 74; - public static readonly REPOSITORY = 75; - public static readonly COMMIT = 76; - public static readonly REVISION = 77; - public static readonly SEMANTIC_MAJOR = 78; - public static readonly ON_DELETE = 79; - public static readonly LIFECYCLE = 80; - public static readonly RETAIN_OTHER = 81; - public static readonly KEYED = 82; - public static readonly PUBLIC_TRAVERSAL = 83; - public static readonly ID = 84; - public static readonly DOC = 85; - public static readonly MODE = 86; - public static readonly EMITS = 87; - public static readonly RECEIVER = 88; - public static readonly REQUIRES = 89; - public static readonly ANY = 90; - public static readonly GET = 91; - public static readonly SET = 92; - public static readonly WATCH = 93; - public static readonly START = 94; - public static readonly STOP = 95; - public static readonly READ = 96; - public static readonly WRITE = 97; - public static readonly RESOLVE = 98; - public static readonly CONNECT = 99; - public static readonly DISCONNECT = 100; - public static readonly CALL = 101; - public static readonly WATCH_START = 102; - public static readonly WATCH_STOP = 103; - public static readonly SUBSCRIBE = 104; - public static readonly UNSUBSCRIBE = 105; - public static readonly REGISTER = 106; - public static readonly CRDT = 107; - public static readonly OPTIONAL_ONE = 108; - public static readonly EXACTLY_ONE = 109; - public static readonly MANY_UNIQUE = 110; - public static readonly MANY = 111; - public static readonly ORDERED = 112; - public static readonly UNIT = 113; - public static readonly WATCH_HANDLE = 114; - public static readonly MESSAGE = 115; - public static readonly ATOM_REF = 116; - public static readonly INTERFACE_REF = 117; - public static readonly OPTIONAL = 118; - public static readonly LIST = 119; - public static readonly RECORD = 120; - public static readonly BOOL = 121; - public static readonly BYTES = 122; - public static readonly DOUBLE = 123; - public static readonly INT32 = 124; - public static readonly INT64 = 125; - public static readonly STRING = 126; - public static readonly UINT32 = 127; - public static readonly UINT64 = 128; - public static readonly TRUE = 129; - public static readonly FALSE = 130; - public static readonly NULL = 131; - public static readonly ARROW = 132; - public static readonly COLON = 133; - public static readonly SEMI = 134; - public static readonly COMMA = 135; - public static readonly DOT = 136; - public static readonly LBRACE = 137; - public static readonly RBRACE = 138; - public static readonly LBRACK = 139; - public static readonly RBRACK = 140; - public static readonly LPAREN = 141; - public static readonly RPAREN = 142; - public static readonly LT = 143; - public static readonly GT = 144; - public static readonly AMP = 145; - public static readonly EQUAL = 146; - public static readonly INTEGER = 147; - public static readonly JSON_NUMBER = 148; - public static readonly IDENTIFIER = 149; - public static readonly STRING_LITERAL = 150; - public static readonly LINE_COMMENT = 151; - public static readonly BLOCK_COMMENT = 152; - public static readonly WS = 153; + public static readonly VARIANT = 8; + public static readonly PREPARES = 9; + public static readonly INITIALIZE = 10; + public static readonly WORKSPACE = 11; + public static readonly EXECUTION = 12; + public static readonly SNAPSHOT = 13; + public static readonly TRANSACTION = 14; + public static readonly REMOTE = 15; + public static readonly TARGETS = 16; + public static readonly PORTABLE = 17; + public static readonly REPLICA = 18; + public static readonly LOCAL = 19; + public static readonly FROM = 20; + public static readonly RESULT_BYTES = 21; + public static readonly RPC_CALLS = 22; + public static readonly DEADLINE_MS = 23; + public static readonly QUERY = 24; + public static readonly REFLECTION = 25; + public static readonly SPECIALIZE = 26; + public static readonly ROOT = 27; + public static readonly DOCUMENT = 28; + public static readonly FRAGMENTS = 29; + public static readonly VIEW = 30; + public static readonly MAX = 31; + public static readonly ALLOW = 32; + public static readonly POLL = 33; + public static readonly QUERYABLE = 34; + public static readonly RPC = 35; + public static readonly QUERY_REASON = 36; + public static readonly TYPE = 37; + public static readonly OBJECT = 38; + public static readonly STORABLE = 39; + public static readonly IMPLEMENTS = 40; + public static readonly REF = 41; + public static readonly FRAGMENT = 42; + public static readonly IMPORT = 43; + public static readonly EXTERNAL = 44; + public static readonly ATOM = 45; + public static readonly INTERFACE = 46; + public static readonly INTERFACES = 47; + public static readonly PACKAGE = 48; + public static readonly VALUE = 49; + public static readonly RELATION = 50; + public static readonly OPERATION = 51; + public static readonly FUNCTION = 52; + public static readonly CONSTRUCTOR = 53; + public static readonly CONSTRUCTS = 54; + public static readonly INPUT = 55; + public static readonly CONFORM = 56; + public static readonly AS = 57; + public static readonly BIND = 58; + public static readonly STATIC = 59; + public static readonly TO = 60; + public static readonly PRIVATE = 61; + public static readonly SHARED = 62; + public static readonly STATE = 63; + public static readonly EDGE = 64; + public static readonly PROJECTION = 65; + public static readonly WITH = 66; + public static readonly USING = 67; + public static readonly ACCEPT = 68; + public static readonly VIA = 69; + public static readonly MATERIALIZE = 70; + public static readonly IF = 71; + public static readonly ABSENT = 72; + public static readonly ON = 73; + public static readonly POLICY = 74; + public static readonly DEFAULT = 75; + public static readonly SOURCE = 76; + public static readonly REPOSITORY = 77; + public static readonly COMMIT = 78; + public static readonly REVISION = 79; + public static readonly SEMANTIC_MAJOR = 80; + public static readonly ON_DELETE = 81; + public static readonly LIFECYCLE = 82; + public static readonly RETAIN_OTHER = 83; + public static readonly KEYED = 84; + public static readonly PUBLIC_TRAVERSAL = 85; + public static readonly ID = 86; + public static readonly DOC = 87; + public static readonly MODE = 88; + public static readonly EMITS = 89; + public static readonly RECEIVER = 90; + public static readonly REQUIRES = 91; + public static readonly ANY = 92; + public static readonly GET = 93; + public static readonly SET = 94; + public static readonly WATCH = 95; + public static readonly START = 96; + public static readonly STOP = 97; + public static readonly READ = 98; + public static readonly WRITE = 99; + public static readonly RESOLVE = 100; + public static readonly CONNECT = 101; + public static readonly DISCONNECT = 102; + public static readonly CALL = 103; + public static readonly WATCH_START = 104; + public static readonly WATCH_STOP = 105; + public static readonly SUBSCRIBE = 106; + public static readonly UNSUBSCRIBE = 107; + public static readonly REGISTER = 108; + public static readonly CRDT = 109; + public static readonly OPTIONAL_ONE = 110; + public static readonly EXACTLY_ONE = 111; + public static readonly MANY_UNIQUE = 112; + public static readonly MANY = 113; + public static readonly ORDERED = 114; + public static readonly UNIT = 115; + public static readonly WATCH_HANDLE = 116; + public static readonly MESSAGE = 117; + public static readonly ATOM_REF = 118; + public static readonly INTERFACE_REF = 119; + public static readonly OPTIONAL = 120; + public static readonly LIST = 121; + public static readonly RECORD = 122; + public static readonly BOOL = 123; + public static readonly BYTES = 124; + public static readonly DOUBLE = 125; + public static readonly INT32 = 126; + public static readonly INT64 = 127; + public static readonly STRING = 128; + public static readonly UINT32 = 129; + public static readonly UINT64 = 130; + public static readonly TRUE = 131; + public static readonly FALSE = 132; + public static readonly NULL = 133; + public static readonly ARROW = 134; + public static readonly COLON = 135; + public static readonly SEMI = 136; + public static readonly COMMA = 137; + public static readonly DOT = 138; + public static readonly LBRACE = 139; + public static readonly RBRACE = 140; + public static readonly LBRACK = 141; + public static readonly RBRACK = 142; + public static readonly LPAREN = 143; + public static readonly RPAREN = 144; + public static readonly LT = 145; + public static readonly GT = 146; + public static readonly AMP = 147; + public static readonly EQUAL = 148; + public static readonly INTEGER = 149; + public static readonly JSON_NUMBER = 150; + public static readonly IDENTIFIER = 151; + public static readonly STRING_LITERAL = 152; + public static readonly LINE_COMMENT = 153; + public static readonly BLOCK_COMMENT = 154; + public static readonly WS = 155; public static readonly channelNames = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" @@ -164,12 +166,12 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public static readonly literalNames = [ null, "'edit'", "'module'", "'contract'", "'presentation'", "'subject'", - "'for'", "'creation'", "'initialize'", "'workspace'", "'execution'", - "'snapshot'", "'transaction'", "'remote'", "'targets'", "'portable'", - "'replica'", "'local'", "'from'", "'result-bytes'", "'rpc-calls'", - "'deadline-ms'", "'query'", "'reflection'", "'specialize'", "'root'", - "'document'", "'fragments'", "'view'", "'max'", "'allow'", "'poll'", - "'queryable'", "'rpc'", "'query-reason'", "'type'", "'object'", + "'for'", "'creation'", "'variant'", "'prepares'", "'initialize'", + "'workspace'", "'execution'", "'snapshot'", "'transaction'", "'remote'", + "'targets'", "'portable'", "'replica'", "'local'", "'from'", "'result-bytes'", + "'rpc-calls'", "'deadline-ms'", "'query'", "'reflection'", "'specialize'", + "'root'", "'document'", "'fragments'", "'view'", "'max'", "'allow'", + "'poll'", "'queryable'", "'rpc'", "'query-reason'", "'type'", "'object'", "'storable'", "'implements'", "'ref'", "'fragment'", "'import'", "'external'", "'atom'", "'interface'", "'interfaces'", "'package'", "'value'", "'relation'", "'operation'", "'function'", "'constructor'", @@ -193,20 +195,21 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public static readonly symbolicNames = [ null, "EDIT", "MODULE", "CONTRACT", "PRESENTATION", "SUBJECT", "FOR", - "CREATION", "INITIALIZE", "WORKSPACE", "EXECUTION", "SNAPSHOT", - "TRANSACTION", "REMOTE", "TARGETS", "PORTABLE", "REPLICA", "LOCAL", - "FROM", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", "REFLECTION", - "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", "MAX", "ALLOW", - "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", "OBJECT", "STORABLE", - "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", - "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", - "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", - "TO", "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", - "USING", "ACCEPT", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", - "DEFAULT", "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", - "ON_DELETE", "LIFECYCLE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", - "ID", "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", - "SET", "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", + "CREATION", "VARIANT", "PREPARES", "INITIALIZE", "WORKSPACE", "EXECUTION", + "SNAPSHOT", "TRANSACTION", "REMOTE", "TARGETS", "PORTABLE", "REPLICA", + "LOCAL", "FROM", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", + "REFLECTION", "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", + "MAX", "ALLOW", "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", + "OBJECT", "STORABLE", "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", + "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", + "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", + "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", "PRIVATE", "SHARED", + "STATE", "EDGE", "PROJECTION", "WITH", "USING", "ACCEPT", "VIA", + "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", + "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", + "LIFECYCLE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", + "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", + "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", @@ -224,20 +227,21 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public static readonly ruleNames = [ "EDIT", "MODULE", "CONTRACT", "PRESENTATION", "SUBJECT", "FOR", - "CREATION", "INITIALIZE", "WORKSPACE", "EXECUTION", "SNAPSHOT", - "TRANSACTION", "REMOTE", "TARGETS", "PORTABLE", "REPLICA", "LOCAL", - "FROM", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", "REFLECTION", - "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", "MAX", "ALLOW", - "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", "OBJECT", "STORABLE", - "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", - "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", - "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", - "TO", "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", - "USING", "ACCEPT", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", - "DEFAULT", "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", - "ON_DELETE", "LIFECYCLE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", - "ID", "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", - "SET", "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", + "CREATION", "VARIANT", "PREPARES", "INITIALIZE", "WORKSPACE", "EXECUTION", + "SNAPSHOT", "TRANSACTION", "REMOTE", "TARGETS", "PORTABLE", "REPLICA", + "LOCAL", "FROM", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", + "REFLECTION", "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", + "MAX", "ALLOW", "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", + "OBJECT", "STORABLE", "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", + "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", + "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", + "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", "PRIVATE", "SHARED", + "STATE", "EDGE", "PROJECTION", "WITH", "USING", "ACCEPT", "VIA", + "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", + "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", + "LIFECYCLE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", + "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", + "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", @@ -268,7 +272,7 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public get modeNames(): string[] { return QuixosCapabilityLexer.modeNames; } public static readonly _serializedATN: number[] = [ - 4,0,153,1469,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, + 4,0,155,1490,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, @@ -293,102 +297,104 @@ export class QuixosCapabilityLexer extends antlr.Lexer { 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,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3, - 1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4, - 1,5,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,7,1,7,1,7, - 1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8, - 1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1, - 10,1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1, - 11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1, - 13,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,1, - 14,1,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,18,1,18,1,18,1,18,1,18,1,19,1,19,1,19,1,19,1, - 19,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1, - 20,1,20,1,20,1,20,1,20,1,21,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,23,1,23,1,24,1,24,1,24,1,24,1,24,1,25,1, - 25,1,25,1,25,1,25,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,26,1,26,1,27,1,27,1,27,1,27,1,27,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,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,33,1,33,1,33,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,35,1,35,1,35,1,36,1, - 36,1,36,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,37,1,37,1,37,1,37,1,38,1,38,1,38,1,38,1,39,1,39,1,39,1, - 39,1,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1, - 41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,42,1,42,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,44,1,44,1, - 44,1,44,1,44,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,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,48,1,48,1,48,1,48,1, - 48,1,48,1,48,1,49,1,49,1,49,1,49,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,50,1,50,1,50,1,50,1,51,1,51,1, - 51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,52,1,52,1,52,1,52,1, - 52,1,52,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,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,56,1,57,1, - 57,1,57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,59,1,59,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,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1, - 63,1,63,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,65,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,67,1,67,1,68,1,68,1,68,1,69,1,69,1, - 69,1,69,1,69,1,69,1,69,1,70,1,70,1,70,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,73,1,74,1,74,1,74,1,74,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,75,1,76,1,76,1,76,1,76,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,77,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,78,1,78,1,78,1,79,1,79,1,79,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,80,1,80,1,80,1,80,1,80,1, - 80,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,82,1,82,1,82,1,82,1,82,1,82,1,82,1,83,1,83,1, - 83,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,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,89,1,89,1,89,1,89,1,90,1, - 90,1,90,1,90,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1,92,1,92,1,92,1, - 93,1,93,1,93,1,93,1,93,1,93,1,94,1,94,1,94,1,94,1,94,1,95,1,95,1, - 95,1,95,1,95,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,97,1,97,1,98,1,98,1,98,1,98,1,98,1,98,1,98,1,98,1,99,1, - 99,1,99,1,99,1,99,1,99,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,101,1,101,1,101, - 1,101,1,101,1,101,1,102,1,102,1,102,1,102,1,102,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,103, - 1,103,1,103,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104, + 2,153,7,153,2,154,7,154,2,155,7,155,2,156,7,156,1,0,1,0,1,0,1,0, + 1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, + 1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4, + 1,4,1,4,1,4,1,4,1,4,1,4,1,5,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,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8, + 1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10, + 1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11, + 1,11,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12, + 1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13, + 1,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15, + 1,15,1,15,1,15,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,17, + 1,17,1,17,1,17,1,17,1,17,1,17,1,17,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,20,1,20,1,20,1,20, + 1,20,1,20,1,20,1,20,1,20,1,21,1,21,1,21,1,21,1,21,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,22,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24,1,24, + 1,24,1,24,1,24,1,24,1,24,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25, + 1,25,1,25,1,25,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,27,1,28,1,28,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,30,1,30,1,30,1,30,1,31,1,31,1,31, + 1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,33,1,33,1,33,1,33,1,33, + 1,33,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,35,1,35,1,35,1,35, + 1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,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,38,1,38,1,38,1,38,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39, + 1,39,1,39,1,40,1,40,1,40,1,40,1,41,1,41,1,41,1,41,1,41,1,41,1,41, + 1,41,1,41,1,42,1,42,1,42,1,42,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,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,45,1,46,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,48,1,48,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,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,50,1,50,1,51, + 1,51,1,51,1,51,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,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,53, + 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,55,1,56,1,56,1,56,1,57,1,57,1,57,1,57, + 1,57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,59,1,59,1,59,1,60,1,60, + 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,62,1,62,1,62,1,63,1,63,1,63,1,63,1,63,1,64,1,64, + 1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,65,1,65,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,67,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,69,1,69,1,70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71, + 1,71,1,72,1,72,1,72,1,73,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,74,1,75,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,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,78, + 1,78,1,79,1,79,1,79,1,79,1,79,1,79,1,79,1,79,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,80,1,80,1,80, + 1,81,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,82,1,82,1,82,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,84,1,84,1,84,1,84,1,84,1,84,1,84,1,85,1,85,1,85,1,86,1,86,1,86, + 1,86,1,87,1,87,1,87,1,87,1,87,1,88,1,88,1,88,1,88,1,88,1,88,1,89, + 1,89,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,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,95,1,95,1,95,1,95, + 1,95,1,95,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,98,1,99,1,99,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,100,1,100,1,101,1,101,1,101, + 1,101,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,1,103,1,103,1,104,1,104,1,104,1,104,1,104,1,104,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,106,1,106,1,106,1,106,1,106,1,107,1,107,1,107,1,107,1,107, - 1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,108,1,108,1,108, - 1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,109,1,109, - 1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,110, - 1,110,1,110,1,110,1,110,1,111,1,111,1,111,1,111,1,111,1,111,1,111, - 1,111,1,112,1,112,1,112,1,112,1,112,1,113,1,113,1,113,1,113,1,113, - 1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,114,1,114,1,114, - 1,114,1,114,1,114,1,114,1,114,1,115,1,115,1,115,1,115,1,115,1,115, - 1,115,1,115,1,115,1,116,1,116,1,116,1,116,1,116,1,116,1,116,1,116, - 1,116,1,116,1,116,1,116,1,116,1,116,1,117,1,117,1,117,1,117,1,117, - 1,117,1,117,1,117,1,117,1,118,1,118,1,118,1,118,1,118,1,119,1,119, - 1,119,1,119,1,119,1,119,1,119,1,120,1,120,1,120,1,120,1,120,1,121, - 1,121,1,121,1,121,1,121,1,121,1,122,1,122,1,122,1,122,1,122,1,122, - 1,122,1,123,1,123,1,123,1,123,1,123,1,123,1,124,1,124,1,124,1,124, - 1,124,1,124,1,125,1,125,1,125,1,125,1,125,1,125,1,125,1,126,1,126, - 1,126,1,126,1,126,1,126,1,126,1,127,1,127,1,127,1,127,1,127,1,127, - 1,127,1,128,1,128,1,128,1,128,1,128,1,129,1,129,1,129,1,129,1,129, - 1,129,1,130,1,130,1,130,1,130,1,130,1,131,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,144,1,144,1,145,1,145,1,146,3,146,1370,8,146,1,146,4,146,1373, - 8,146,11,146,12,146,1374,1,147,3,147,1378,8,147,1,147,1,147,1,147, - 5,147,1383,8,147,10,147,12,147,1386,9,147,3,147,1388,8,147,1,147, - 1,147,4,147,1392,8,147,11,147,12,147,1393,3,147,1396,8,147,1,147, - 1,147,3,147,1400,8,147,1,147,4,147,1403,8,147,11,147,12,147,1404, - 3,147,1407,8,147,1,148,1,148,5,148,1411,8,148,10,148,12,148,1414, - 9,148,1,149,1,149,1,149,5,149,1419,8,149,10,149,12,149,1422,9,149, - 1,149,1,149,1,150,1,150,1,150,1,150,1,150,1,150,1,150,1,150,3,150, - 1434,8,150,1,151,1,151,1,152,1,152,1,152,1,152,5,152,1442,8,152, - 10,152,12,152,1445,9,152,1,152,1,152,1,153,1,153,1,153,1,153,5,153, - 1453,8,153,10,153,12,153,1456,9,153,1,153,1,153,1,153,1,153,1,153, - 1,154,4,154,1464,8,154,11,154,12,154,1465,1,154,1,154,1,1454,0,155, + 1,105,1,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,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107, + 1,107,1,108,1,108,1,108,1,108,1,108,1,109,1,109,1,109,1,109,1,109, + 1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,110,1,110,1,110, + 1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,111,1,111, + 1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,112, + 1,112,1,112,1,112,1,112,1,113,1,113,1,113,1,113,1,113,1,113,1,113, + 1,113,1,114,1,114,1,114,1,114,1,114,1,115,1,115,1,115,1,115,1,115, + 1,115,1,115,1,115,1,115,1,115,1,115,1,115,1,115,1,116,1,116,1,116, + 1,116,1,116,1,116,1,116,1,116,1,117,1,117,1,117,1,117,1,117,1,117, + 1,117,1,117,1,117,1,118,1,118,1,118,1,118,1,118,1,118,1,118,1,118, + 1,118,1,118,1,118,1,118,1,118,1,118,1,119,1,119,1,119,1,119,1,119, + 1,119,1,119,1,119,1,119,1,120,1,120,1,120,1,120,1,120,1,121,1,121, + 1,121,1,121,1,121,1,121,1,121,1,122,1,122,1,122,1,122,1,122,1,123, + 1,123,1,123,1,123,1,123,1,123,1,124,1,124,1,124,1,124,1,124,1,124, + 1,124,1,125,1,125,1,125,1,125,1,125,1,125,1,126,1,126,1,126,1,126, + 1,126,1,126,1,127,1,127,1,127,1,127,1,127,1,127,1,127,1,128,1,128, + 1,128,1,128,1,128,1,128,1,128,1,129,1,129,1,129,1,129,1,129,1,129, + 1,129,1,130,1,130,1,130,1,130,1,130,1,131,1,131,1,131,1,131,1,131, + 1,131,1,132,1,132,1,132,1,132,1,132,1,133,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,144,1,144,1,145,1,145, + 1,146,1,146,1,147,1,147,1,148,3,148,1391,8,148,1,148,4,148,1394, + 8,148,11,148,12,148,1395,1,149,3,149,1399,8,149,1,149,1,149,1,149, + 5,149,1404,8,149,10,149,12,149,1407,9,149,3,149,1409,8,149,1,149, + 1,149,4,149,1413,8,149,11,149,12,149,1414,3,149,1417,8,149,1,149, + 1,149,3,149,1421,8,149,1,149,4,149,1424,8,149,11,149,12,149,1425, + 3,149,1428,8,149,1,150,1,150,5,150,1432,8,150,10,150,12,150,1435, + 9,150,1,151,1,151,1,151,5,151,1440,8,151,10,151,12,151,1443,9,151, + 1,151,1,151,1,152,1,152,1,152,1,152,1,152,1,152,1,152,1,152,3,152, + 1455,8,152,1,153,1,153,1,154,1,154,1,154,1,154,5,154,1463,8,154, + 10,154,12,154,1466,9,154,1,154,1,154,1,155,1,155,1,155,1,155,5,155, + 1474,8,155,10,155,12,155,1477,9,155,1,155,1,155,1,155,1,155,1,155, + 1,156,4,156,1485,8,156,11,156,12,156,1486,1,156,1,156,1,1475,0,157, 1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13, 27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,47,24, 49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,69,35, @@ -404,411 +410,418 @@ export class QuixosCapabilityLexer extends antlr.Lexer { 239,120,241,121,243,122,245,123,247,124,249,125,251,126,253,127, 255,128,257,129,259,130,261,131,263,132,265,133,267,134,269,135, 271,136,273,137,275,138,277,139,279,140,281,141,283,142,285,143, - 287,144,289,145,291,146,293,147,295,148,297,149,299,150,301,0,303, - 0,305,151,307,152,309,153,1,0,11,1,0,48,57,1,0,49,57,2,0,69,69,101, - 101,2,0,43,43,45,45,3,0,65,90,95,95,97,122,4,0,48,57,65,90,95,95, - 97,122,4,0,10,10,13,13,34,34,92,92,8,0,34,34,47,47,92,92,98,98,102, - 102,110,110,114,114,116,116,3,0,48,57,65,70,97,102,2,0,10,10,13, - 13,3,0,9,10,13,13,32,32,1483,0,1,1,0,0,0,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,229,1,0,0,0,0,231,1,0,0,0,0,233,1,0,0,0,0, - 235,1,0,0,0,0,237,1,0,0,0,0,239,1,0,0,0,0,241,1,0,0,0,0,243,1,0, - 0,0,0,245,1,0,0,0,0,247,1,0,0,0,0,249,1,0,0,0,0,251,1,0,0,0,0,253, - 1,0,0,0,0,255,1,0,0,0,0,257,1,0,0,0,0,259,1,0,0,0,0,261,1,0,0,0, - 0,263,1,0,0,0,0,265,1,0,0,0,0,267,1,0,0,0,0,269,1,0,0,0,0,271,1, - 0,0,0,0,273,1,0,0,0,0,275,1,0,0,0,0,277,1,0,0,0,0,279,1,0,0,0,0, - 281,1,0,0,0,0,283,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,305,1,0,0,0,0,307,1,0,0,0,0,309,1,0,0,0,1,311,1,0,0,0, - 3,316,1,0,0,0,5,323,1,0,0,0,7,332,1,0,0,0,9,345,1,0,0,0,11,353,1, - 0,0,0,13,357,1,0,0,0,15,366,1,0,0,0,17,377,1,0,0,0,19,387,1,0,0, - 0,21,397,1,0,0,0,23,406,1,0,0,0,25,418,1,0,0,0,27,425,1,0,0,0,29, - 433,1,0,0,0,31,442,1,0,0,0,33,450,1,0,0,0,35,456,1,0,0,0,37,461, - 1,0,0,0,39,474,1,0,0,0,41,484,1,0,0,0,43,496,1,0,0,0,45,502,1,0, - 0,0,47,513,1,0,0,0,49,524,1,0,0,0,51,529,1,0,0,0,53,538,1,0,0,0, - 55,548,1,0,0,0,57,553,1,0,0,0,59,557,1,0,0,0,61,563,1,0,0,0,63,568, - 1,0,0,0,65,578,1,0,0,0,67,582,1,0,0,0,69,595,1,0,0,0,71,600,1,0, - 0,0,73,607,1,0,0,0,75,616,1,0,0,0,77,627,1,0,0,0,79,631,1,0,0,0, - 81,640,1,0,0,0,83,647,1,0,0,0,85,656,1,0,0,0,87,661,1,0,0,0,89,671, - 1,0,0,0,91,682,1,0,0,0,93,690,1,0,0,0,95,696,1,0,0,0,97,705,1,0, - 0,0,99,715,1,0,0,0,101,724,1,0,0,0,103,736,1,0,0,0,105,747,1,0,0, - 0,107,753,1,0,0,0,109,761,1,0,0,0,111,764,1,0,0,0,113,769,1,0,0, - 0,115,776,1,0,0,0,117,779,1,0,0,0,119,787,1,0,0,0,121,794,1,0,0, - 0,123,800,1,0,0,0,125,805,1,0,0,0,127,816,1,0,0,0,129,821,1,0,0, - 0,131,827,1,0,0,0,133,834,1,0,0,0,135,838,1,0,0,0,137,850,1,0,0, - 0,139,853,1,0,0,0,141,860,1,0,0,0,143,863,1,0,0,0,145,870,1,0,0, - 0,147,878,1,0,0,0,149,885,1,0,0,0,151,896,1,0,0,0,153,903,1,0,0, - 0,155,912,1,0,0,0,157,927,1,0,0,0,159,937,1,0,0,0,161,947,1,0,0, - 0,163,960,1,0,0,0,165,966,1,0,0,0,167,983,1,0,0,0,169,986,1,0,0, - 0,171,990,1,0,0,0,173,995,1,0,0,0,175,1001,1,0,0,0,177,1010,1,0, - 0,0,179,1019,1,0,0,0,181,1023,1,0,0,0,183,1027,1,0,0,0,185,1031, - 1,0,0,0,187,1037,1,0,0,0,189,1043,1,0,0,0,191,1048,1,0,0,0,193,1053, - 1,0,0,0,195,1059,1,0,0,0,197,1067,1,0,0,0,199,1075,1,0,0,0,201,1086, - 1,0,0,0,203,1091,1,0,0,0,205,1103,1,0,0,0,207,1114,1,0,0,0,209,1124, - 1,0,0,0,211,1136,1,0,0,0,213,1145,1,0,0,0,215,1150,1,0,0,0,217,1163, - 1,0,0,0,219,1175,1,0,0,0,221,1187,1,0,0,0,223,1192,1,0,0,0,225,1200, - 1,0,0,0,227,1205,1,0,0,0,229,1218,1,0,0,0,231,1226,1,0,0,0,233,1235, - 1,0,0,0,235,1249,1,0,0,0,237,1258,1,0,0,0,239,1263,1,0,0,0,241,1270, - 1,0,0,0,243,1275,1,0,0,0,245,1281,1,0,0,0,247,1288,1,0,0,0,249,1294, - 1,0,0,0,251,1300,1,0,0,0,253,1307,1,0,0,0,255,1314,1,0,0,0,257,1321, - 1,0,0,0,259,1326,1,0,0,0,261,1332,1,0,0,0,263,1337,1,0,0,0,265,1340, - 1,0,0,0,267,1342,1,0,0,0,269,1344,1,0,0,0,271,1346,1,0,0,0,273,1348, - 1,0,0,0,275,1350,1,0,0,0,277,1352,1,0,0,0,279,1354,1,0,0,0,281,1356, - 1,0,0,0,283,1358,1,0,0,0,285,1360,1,0,0,0,287,1362,1,0,0,0,289,1364, - 1,0,0,0,291,1366,1,0,0,0,293,1369,1,0,0,0,295,1377,1,0,0,0,297,1408, - 1,0,0,0,299,1415,1,0,0,0,301,1425,1,0,0,0,303,1435,1,0,0,0,305,1437, - 1,0,0,0,307,1448,1,0,0,0,309,1463,1,0,0,0,311,312,5,101,0,0,312, - 313,5,100,0,0,313,314,5,105,0,0,314,315,5,116,0,0,315,2,1,0,0,0, - 316,317,5,109,0,0,317,318,5,111,0,0,318,319,5,100,0,0,319,320,5, - 117,0,0,320,321,5,108,0,0,321,322,5,101,0,0,322,4,1,0,0,0,323,324, - 5,99,0,0,324,325,5,111,0,0,325,326,5,110,0,0,326,327,5,116,0,0,327, - 328,5,114,0,0,328,329,5,97,0,0,329,330,5,99,0,0,330,331,5,116,0, - 0,331,6,1,0,0,0,332,333,5,112,0,0,333,334,5,114,0,0,334,335,5,101, - 0,0,335,336,5,115,0,0,336,337,5,101,0,0,337,338,5,110,0,0,338,339, - 5,116,0,0,339,340,5,97,0,0,340,341,5,116,0,0,341,342,5,105,0,0,342, - 343,5,111,0,0,343,344,5,110,0,0,344,8,1,0,0,0,345,346,5,115,0,0, - 346,347,5,117,0,0,347,348,5,98,0,0,348,349,5,106,0,0,349,350,5,101, - 0,0,350,351,5,99,0,0,351,352,5,116,0,0,352,10,1,0,0,0,353,354,5, - 102,0,0,354,355,5,111,0,0,355,356,5,114,0,0,356,12,1,0,0,0,357,358, - 5,99,0,0,358,359,5,114,0,0,359,360,5,101,0,0,360,361,5,97,0,0,361, - 362,5,116,0,0,362,363,5,105,0,0,363,364,5,111,0,0,364,365,5,110, - 0,0,365,14,1,0,0,0,366,367,5,105,0,0,367,368,5,110,0,0,368,369,5, - 105,0,0,369,370,5,116,0,0,370,371,5,105,0,0,371,372,5,97,0,0,372, - 373,5,108,0,0,373,374,5,105,0,0,374,375,5,122,0,0,375,376,5,101, - 0,0,376,16,1,0,0,0,377,378,5,119,0,0,378,379,5,111,0,0,379,380,5, - 114,0,0,380,381,5,107,0,0,381,382,5,115,0,0,382,383,5,112,0,0,383, - 384,5,97,0,0,384,385,5,99,0,0,385,386,5,101,0,0,386,18,1,0,0,0,387, - 388,5,101,0,0,388,389,5,120,0,0,389,390,5,101,0,0,390,391,5,99,0, - 0,391,392,5,117,0,0,392,393,5,116,0,0,393,394,5,105,0,0,394,395, - 5,111,0,0,395,396,5,110,0,0,396,20,1,0,0,0,397,398,5,115,0,0,398, - 399,5,110,0,0,399,400,5,97,0,0,400,401,5,112,0,0,401,402,5,115,0, - 0,402,403,5,104,0,0,403,404,5,111,0,0,404,405,5,116,0,0,405,22,1, - 0,0,0,406,407,5,116,0,0,407,408,5,114,0,0,408,409,5,97,0,0,409,410, - 5,110,0,0,410,411,5,115,0,0,411,412,5,97,0,0,412,413,5,99,0,0,413, - 414,5,116,0,0,414,415,5,105,0,0,415,416,5,111,0,0,416,417,5,110, - 0,0,417,24,1,0,0,0,418,419,5,114,0,0,419,420,5,101,0,0,420,421,5, - 109,0,0,421,422,5,111,0,0,422,423,5,116,0,0,423,424,5,101,0,0,424, - 26,1,0,0,0,425,426,5,116,0,0,426,427,5,97,0,0,427,428,5,114,0,0, - 428,429,5,103,0,0,429,430,5,101,0,0,430,431,5,116,0,0,431,432,5, - 115,0,0,432,28,1,0,0,0,433,434,5,112,0,0,434,435,5,111,0,0,435,436, - 5,114,0,0,436,437,5,116,0,0,437,438,5,97,0,0,438,439,5,98,0,0,439, - 440,5,108,0,0,440,441,5,101,0,0,441,30,1,0,0,0,442,443,5,114,0,0, - 443,444,5,101,0,0,444,445,5,112,0,0,445,446,5,108,0,0,446,447,5, - 105,0,0,447,448,5,99,0,0,448,449,5,97,0,0,449,32,1,0,0,0,450,451, - 5,108,0,0,451,452,5,111,0,0,452,453,5,99,0,0,453,454,5,97,0,0,454, - 455,5,108,0,0,455,34,1,0,0,0,456,457,5,102,0,0,457,458,5,114,0,0, - 458,459,5,111,0,0,459,460,5,109,0,0,460,36,1,0,0,0,461,462,5,114, - 0,0,462,463,5,101,0,0,463,464,5,115,0,0,464,465,5,117,0,0,465,466, - 5,108,0,0,466,467,5,116,0,0,467,468,5,45,0,0,468,469,5,98,0,0,469, - 470,5,121,0,0,470,471,5,116,0,0,471,472,5,101,0,0,472,473,5,115, - 0,0,473,38,1,0,0,0,474,475,5,114,0,0,475,476,5,112,0,0,476,477,5, - 99,0,0,477,478,5,45,0,0,478,479,5,99,0,0,479,480,5,97,0,0,480,481, - 5,108,0,0,481,482,5,108,0,0,482,483,5,115,0,0,483,40,1,0,0,0,484, - 485,5,100,0,0,485,486,5,101,0,0,486,487,5,97,0,0,487,488,5,100,0, - 0,488,489,5,108,0,0,489,490,5,105,0,0,490,491,5,110,0,0,491,492, - 5,101,0,0,492,493,5,45,0,0,493,494,5,109,0,0,494,495,5,115,0,0,495, - 42,1,0,0,0,496,497,5,113,0,0,497,498,5,117,0,0,498,499,5,101,0,0, - 499,500,5,114,0,0,500,501,5,121,0,0,501,44,1,0,0,0,502,503,5,114, - 0,0,503,504,5,101,0,0,504,505,5,102,0,0,505,506,5,108,0,0,506,507, - 5,101,0,0,507,508,5,99,0,0,508,509,5,116,0,0,509,510,5,105,0,0,510, - 511,5,111,0,0,511,512,5,110,0,0,512,46,1,0,0,0,513,514,5,115,0,0, - 514,515,5,112,0,0,515,516,5,101,0,0,516,517,5,99,0,0,517,518,5,105, - 0,0,518,519,5,97,0,0,519,520,5,108,0,0,520,521,5,105,0,0,521,522, - 5,122,0,0,522,523,5,101,0,0,523,48,1,0,0,0,524,525,5,114,0,0,525, - 526,5,111,0,0,526,527,5,111,0,0,527,528,5,116,0,0,528,50,1,0,0,0, - 529,530,5,100,0,0,530,531,5,111,0,0,531,532,5,99,0,0,532,533,5,117, - 0,0,533,534,5,109,0,0,534,535,5,101,0,0,535,536,5,110,0,0,536,537, - 5,116,0,0,537,52,1,0,0,0,538,539,5,102,0,0,539,540,5,114,0,0,540, - 541,5,97,0,0,541,542,5,103,0,0,542,543,5,109,0,0,543,544,5,101,0, - 0,544,545,5,110,0,0,545,546,5,116,0,0,546,547,5,115,0,0,547,54,1, - 0,0,0,548,549,5,118,0,0,549,550,5,105,0,0,550,551,5,101,0,0,551, - 552,5,119,0,0,552,56,1,0,0,0,553,554,5,109,0,0,554,555,5,97,0,0, - 555,556,5,120,0,0,556,58,1,0,0,0,557,558,5,97,0,0,558,559,5,108, - 0,0,559,560,5,108,0,0,560,561,5,111,0,0,561,562,5,119,0,0,562,60, - 1,0,0,0,563,564,5,112,0,0,564,565,5,111,0,0,565,566,5,108,0,0,566, - 567,5,108,0,0,567,62,1,0,0,0,568,569,5,113,0,0,569,570,5,117,0,0, - 570,571,5,101,0,0,571,572,5,114,0,0,572,573,5,121,0,0,573,574,5, - 97,0,0,574,575,5,98,0,0,575,576,5,108,0,0,576,577,5,101,0,0,577, - 64,1,0,0,0,578,579,5,114,0,0,579,580,5,112,0,0,580,581,5,99,0,0, - 581,66,1,0,0,0,582,583,5,113,0,0,583,584,5,117,0,0,584,585,5,101, - 0,0,585,586,5,114,0,0,586,587,5,121,0,0,587,588,5,45,0,0,588,589, - 5,114,0,0,589,590,5,101,0,0,590,591,5,97,0,0,591,592,5,115,0,0,592, - 593,5,111,0,0,593,594,5,110,0,0,594,68,1,0,0,0,595,596,5,116,0,0, - 596,597,5,121,0,0,597,598,5,112,0,0,598,599,5,101,0,0,599,70,1,0, - 0,0,600,601,5,111,0,0,601,602,5,98,0,0,602,603,5,106,0,0,603,604, - 5,101,0,0,604,605,5,99,0,0,605,606,5,116,0,0,606,72,1,0,0,0,607, - 608,5,115,0,0,608,609,5,116,0,0,609,610,5,111,0,0,610,611,5,114, - 0,0,611,612,5,97,0,0,612,613,5,98,0,0,613,614,5,108,0,0,614,615, - 5,101,0,0,615,74,1,0,0,0,616,617,5,105,0,0,617,618,5,109,0,0,618, - 619,5,112,0,0,619,620,5,108,0,0,620,621,5,101,0,0,621,622,5,109, - 0,0,622,623,5,101,0,0,623,624,5,110,0,0,624,625,5,116,0,0,625,626, - 5,115,0,0,626,76,1,0,0,0,627,628,5,114,0,0,628,629,5,101,0,0,629, - 630,5,102,0,0,630,78,1,0,0,0,631,632,5,102,0,0,632,633,5,114,0,0, - 633,634,5,97,0,0,634,635,5,103,0,0,635,636,5,109,0,0,636,637,5,101, - 0,0,637,638,5,110,0,0,638,639,5,116,0,0,639,80,1,0,0,0,640,641,5, - 105,0,0,641,642,5,109,0,0,642,643,5,112,0,0,643,644,5,111,0,0,644, - 645,5,114,0,0,645,646,5,116,0,0,646,82,1,0,0,0,647,648,5,101,0,0, - 648,649,5,120,0,0,649,650,5,116,0,0,650,651,5,101,0,0,651,652,5, - 114,0,0,652,653,5,110,0,0,653,654,5,97,0,0,654,655,5,108,0,0,655, - 84,1,0,0,0,656,657,5,97,0,0,657,658,5,116,0,0,658,659,5,111,0,0, - 659,660,5,109,0,0,660,86,1,0,0,0,661,662,5,105,0,0,662,663,5,110, - 0,0,663,664,5,116,0,0,664,665,5,101,0,0,665,666,5,114,0,0,666,667, - 5,102,0,0,667,668,5,97,0,0,668,669,5,99,0,0,669,670,5,101,0,0,670, - 88,1,0,0,0,671,672,5,105,0,0,672,673,5,110,0,0,673,674,5,116,0,0, - 674,675,5,101,0,0,675,676,5,114,0,0,676,677,5,102,0,0,677,678,5, - 97,0,0,678,679,5,99,0,0,679,680,5,101,0,0,680,681,5,115,0,0,681, - 90,1,0,0,0,682,683,5,112,0,0,683,684,5,97,0,0,684,685,5,99,0,0,685, - 686,5,107,0,0,686,687,5,97,0,0,687,688,5,103,0,0,688,689,5,101,0, - 0,689,92,1,0,0,0,690,691,5,118,0,0,691,692,5,97,0,0,692,693,5,108, - 0,0,693,694,5,117,0,0,694,695,5,101,0,0,695,94,1,0,0,0,696,697,5, - 114,0,0,697,698,5,101,0,0,698,699,5,108,0,0,699,700,5,97,0,0,700, - 701,5,116,0,0,701,702,5,105,0,0,702,703,5,111,0,0,703,704,5,110, - 0,0,704,96,1,0,0,0,705,706,5,111,0,0,706,707,5,112,0,0,707,708,5, - 101,0,0,708,709,5,114,0,0,709,710,5,97,0,0,710,711,5,116,0,0,711, - 712,5,105,0,0,712,713,5,111,0,0,713,714,5,110,0,0,714,98,1,0,0,0, - 715,716,5,102,0,0,716,717,5,117,0,0,717,718,5,110,0,0,718,719,5, - 99,0,0,719,720,5,116,0,0,720,721,5,105,0,0,721,722,5,111,0,0,722, - 723,5,110,0,0,723,100,1,0,0,0,724,725,5,99,0,0,725,726,5,111,0,0, - 726,727,5,110,0,0,727,728,5,115,0,0,728,729,5,116,0,0,729,730,5, - 114,0,0,730,731,5,117,0,0,731,732,5,99,0,0,732,733,5,116,0,0,733, - 734,5,111,0,0,734,735,5,114,0,0,735,102,1,0,0,0,736,737,5,99,0,0, - 737,738,5,111,0,0,738,739,5,110,0,0,739,740,5,115,0,0,740,741,5, - 116,0,0,741,742,5,114,0,0,742,743,5,117,0,0,743,744,5,99,0,0,744, - 745,5,116,0,0,745,746,5,115,0,0,746,104,1,0,0,0,747,748,5,105,0, - 0,748,749,5,110,0,0,749,750,5,112,0,0,750,751,5,117,0,0,751,752, - 5,116,0,0,752,106,1,0,0,0,753,754,5,99,0,0,754,755,5,111,0,0,755, - 756,5,110,0,0,756,757,5,102,0,0,757,758,5,111,0,0,758,759,5,114, - 0,0,759,760,5,109,0,0,760,108,1,0,0,0,761,762,5,97,0,0,762,763,5, - 115,0,0,763,110,1,0,0,0,764,765,5,98,0,0,765,766,5,105,0,0,766,767, - 5,110,0,0,767,768,5,100,0,0,768,112,1,0,0,0,769,770,5,115,0,0,770, - 771,5,116,0,0,771,772,5,97,0,0,772,773,5,116,0,0,773,774,5,105,0, - 0,774,775,5,99,0,0,775,114,1,0,0,0,776,777,5,116,0,0,777,778,5,111, - 0,0,778,116,1,0,0,0,779,780,5,112,0,0,780,781,5,114,0,0,781,782, - 5,105,0,0,782,783,5,118,0,0,783,784,5,97,0,0,784,785,5,116,0,0,785, - 786,5,101,0,0,786,118,1,0,0,0,787,788,5,115,0,0,788,789,5,104,0, - 0,789,790,5,97,0,0,790,791,5,114,0,0,791,792,5,101,0,0,792,793,5, - 100,0,0,793,120,1,0,0,0,794,795,5,115,0,0,795,796,5,116,0,0,796, - 797,5,97,0,0,797,798,5,116,0,0,798,799,5,101,0,0,799,122,1,0,0,0, - 800,801,5,101,0,0,801,802,5,100,0,0,802,803,5,103,0,0,803,804,5, - 101,0,0,804,124,1,0,0,0,805,806,5,112,0,0,806,807,5,114,0,0,807, - 808,5,111,0,0,808,809,5,106,0,0,809,810,5,101,0,0,810,811,5,99,0, - 0,811,812,5,116,0,0,812,813,5,105,0,0,813,814,5,111,0,0,814,815, - 5,110,0,0,815,126,1,0,0,0,816,817,5,119,0,0,817,818,5,105,0,0,818, - 819,5,116,0,0,819,820,5,104,0,0,820,128,1,0,0,0,821,822,5,117,0, - 0,822,823,5,115,0,0,823,824,5,105,0,0,824,825,5,110,0,0,825,826, - 5,103,0,0,826,130,1,0,0,0,827,828,5,97,0,0,828,829,5,99,0,0,829, - 830,5,99,0,0,830,831,5,101,0,0,831,832,5,112,0,0,832,833,5,116,0, - 0,833,132,1,0,0,0,834,835,5,118,0,0,835,836,5,105,0,0,836,837,5, - 97,0,0,837,134,1,0,0,0,838,839,5,109,0,0,839,840,5,97,0,0,840,841, - 5,116,0,0,841,842,5,101,0,0,842,843,5,114,0,0,843,844,5,105,0,0, - 844,845,5,97,0,0,845,846,5,108,0,0,846,847,5,105,0,0,847,848,5,122, - 0,0,848,849,5,101,0,0,849,136,1,0,0,0,850,851,5,105,0,0,851,852, - 5,102,0,0,852,138,1,0,0,0,853,854,5,97,0,0,854,855,5,98,0,0,855, - 856,5,115,0,0,856,857,5,101,0,0,857,858,5,110,0,0,858,859,5,116, - 0,0,859,140,1,0,0,0,860,861,5,111,0,0,861,862,5,110,0,0,862,142, - 1,0,0,0,863,864,5,112,0,0,864,865,5,111,0,0,865,866,5,108,0,0,866, - 867,5,105,0,0,867,868,5,99,0,0,868,869,5,121,0,0,869,144,1,0,0,0, - 870,871,5,100,0,0,871,872,5,101,0,0,872,873,5,102,0,0,873,874,5, - 97,0,0,874,875,5,117,0,0,875,876,5,108,0,0,876,877,5,116,0,0,877, - 146,1,0,0,0,878,879,5,115,0,0,879,880,5,111,0,0,880,881,5,117,0, - 0,881,882,5,114,0,0,882,883,5,99,0,0,883,884,5,101,0,0,884,148,1, - 0,0,0,885,886,5,114,0,0,886,887,5,101,0,0,887,888,5,112,0,0,888, - 889,5,111,0,0,889,890,5,115,0,0,890,891,5,105,0,0,891,892,5,116, - 0,0,892,893,5,111,0,0,893,894,5,114,0,0,894,895,5,121,0,0,895,150, - 1,0,0,0,896,897,5,99,0,0,897,898,5,111,0,0,898,899,5,109,0,0,899, - 900,5,109,0,0,900,901,5,105,0,0,901,902,5,116,0,0,902,152,1,0,0, - 0,903,904,5,114,0,0,904,905,5,101,0,0,905,906,5,118,0,0,906,907, - 5,105,0,0,907,908,5,115,0,0,908,909,5,105,0,0,909,910,5,111,0,0, - 910,911,5,110,0,0,911,154,1,0,0,0,912,913,5,115,0,0,913,914,5,101, - 0,0,914,915,5,109,0,0,915,916,5,97,0,0,916,917,5,110,0,0,917,918, - 5,116,0,0,918,919,5,105,0,0,919,920,5,99,0,0,920,921,5,45,0,0,921, - 922,5,109,0,0,922,923,5,97,0,0,923,924,5,106,0,0,924,925,5,111,0, - 0,925,926,5,114,0,0,926,156,1,0,0,0,927,928,5,111,0,0,928,929,5, - 110,0,0,929,930,5,45,0,0,930,931,5,100,0,0,931,932,5,101,0,0,932, - 933,5,108,0,0,933,934,5,101,0,0,934,935,5,116,0,0,935,936,5,101, - 0,0,936,158,1,0,0,0,937,938,5,108,0,0,938,939,5,105,0,0,939,940, - 5,102,0,0,940,941,5,101,0,0,941,942,5,99,0,0,942,943,5,121,0,0,943, - 944,5,99,0,0,944,945,5,108,0,0,945,946,5,101,0,0,946,160,1,0,0,0, - 947,948,5,114,0,0,948,949,5,101,0,0,949,950,5,116,0,0,950,951,5, - 97,0,0,951,952,5,105,0,0,952,953,5,110,0,0,953,954,5,45,0,0,954, - 955,5,111,0,0,955,956,5,116,0,0,956,957,5,104,0,0,957,958,5,101, - 0,0,958,959,5,114,0,0,959,162,1,0,0,0,960,961,5,107,0,0,961,962, - 5,101,0,0,962,963,5,121,0,0,963,964,5,101,0,0,964,965,5,100,0,0, - 965,164,1,0,0,0,966,967,5,112,0,0,967,968,5,117,0,0,968,969,5,98, - 0,0,969,970,5,108,0,0,970,971,5,105,0,0,971,972,5,99,0,0,972,973, - 5,45,0,0,973,974,5,116,0,0,974,975,5,114,0,0,975,976,5,97,0,0,976, - 977,5,118,0,0,977,978,5,101,0,0,978,979,5,114,0,0,979,980,5,115, - 0,0,980,981,5,97,0,0,981,982,5,108,0,0,982,166,1,0,0,0,983,984,5, - 105,0,0,984,985,5,100,0,0,985,168,1,0,0,0,986,987,5,100,0,0,987, - 988,5,111,0,0,988,989,5,99,0,0,989,170,1,0,0,0,990,991,5,109,0,0, - 991,992,5,111,0,0,992,993,5,100,0,0,993,994,5,101,0,0,994,172,1, - 0,0,0,995,996,5,101,0,0,996,997,5,109,0,0,997,998,5,105,0,0,998, - 999,5,116,0,0,999,1000,5,115,0,0,1000,174,1,0,0,0,1001,1002,5,114, - 0,0,1002,1003,5,101,0,0,1003,1004,5,99,0,0,1004,1005,5,101,0,0,1005, - 1006,5,105,0,0,1006,1007,5,118,0,0,1007,1008,5,101,0,0,1008,1009, - 5,114,0,0,1009,176,1,0,0,0,1010,1011,5,114,0,0,1011,1012,5,101,0, - 0,1012,1013,5,113,0,0,1013,1014,5,117,0,0,1014,1015,5,105,0,0,1015, - 1016,5,114,0,0,1016,1017,5,101,0,0,1017,1018,5,115,0,0,1018,178, - 1,0,0,0,1019,1020,5,97,0,0,1020,1021,5,110,0,0,1021,1022,5,121,0, - 0,1022,180,1,0,0,0,1023,1024,5,103,0,0,1024,1025,5,101,0,0,1025, - 1026,5,116,0,0,1026,182,1,0,0,0,1027,1028,5,115,0,0,1028,1029,5, - 101,0,0,1029,1030,5,116,0,0,1030,184,1,0,0,0,1031,1032,5,119,0,0, - 1032,1033,5,97,0,0,1033,1034,5,116,0,0,1034,1035,5,99,0,0,1035,1036, - 5,104,0,0,1036,186,1,0,0,0,1037,1038,5,115,0,0,1038,1039,5,116,0, - 0,1039,1040,5,97,0,0,1040,1041,5,114,0,0,1041,1042,5,116,0,0,1042, - 188,1,0,0,0,1043,1044,5,115,0,0,1044,1045,5,116,0,0,1045,1046,5, - 111,0,0,1046,1047,5,112,0,0,1047,190,1,0,0,0,1048,1049,5,114,0,0, - 1049,1050,5,101,0,0,1050,1051,5,97,0,0,1051,1052,5,100,0,0,1052, - 192,1,0,0,0,1053,1054,5,119,0,0,1054,1055,5,114,0,0,1055,1056,5, - 105,0,0,1056,1057,5,116,0,0,1057,1058,5,101,0,0,1058,194,1,0,0,0, - 1059,1060,5,114,0,0,1060,1061,5,101,0,0,1061,1062,5,115,0,0,1062, - 1063,5,111,0,0,1063,1064,5,108,0,0,1064,1065,5,118,0,0,1065,1066, - 5,101,0,0,1066,196,1,0,0,0,1067,1068,5,99,0,0,1068,1069,5,111,0, - 0,1069,1070,5,110,0,0,1070,1071,5,110,0,0,1071,1072,5,101,0,0,1072, - 1073,5,99,0,0,1073,1074,5,116,0,0,1074,198,1,0,0,0,1075,1076,5,100, - 0,0,1076,1077,5,105,0,0,1077,1078,5,115,0,0,1078,1079,5,99,0,0,1079, - 1080,5,111,0,0,1080,1081,5,110,0,0,1081,1082,5,110,0,0,1082,1083, - 5,101,0,0,1083,1084,5,99,0,0,1084,1085,5,116,0,0,1085,200,1,0,0, - 0,1086,1087,5,99,0,0,1087,1088,5,97,0,0,1088,1089,5,108,0,0,1089, - 1090,5,108,0,0,1090,202,1,0,0,0,1091,1092,5,119,0,0,1092,1093,5, - 97,0,0,1093,1094,5,116,0,0,1094,1095,5,99,0,0,1095,1096,5,104,0, - 0,1096,1097,5,45,0,0,1097,1098,5,115,0,0,1098,1099,5,116,0,0,1099, - 1100,5,97,0,0,1100,1101,5,114,0,0,1101,1102,5,116,0,0,1102,204,1, - 0,0,0,1103,1104,5,119,0,0,1104,1105,5,97,0,0,1105,1106,5,116,0,0, - 1106,1107,5,99,0,0,1107,1108,5,104,0,0,1108,1109,5,45,0,0,1109,1110, - 5,115,0,0,1110,1111,5,116,0,0,1111,1112,5,111,0,0,1112,1113,5,112, - 0,0,1113,206,1,0,0,0,1114,1115,5,115,0,0,1115,1116,5,117,0,0,1116, - 1117,5,98,0,0,1117,1118,5,115,0,0,1118,1119,5,99,0,0,1119,1120,5, - 114,0,0,1120,1121,5,105,0,0,1121,1122,5,98,0,0,1122,1123,5,101,0, - 0,1123,208,1,0,0,0,1124,1125,5,117,0,0,1125,1126,5,110,0,0,1126, - 1127,5,115,0,0,1127,1128,5,117,0,0,1128,1129,5,98,0,0,1129,1130, - 5,115,0,0,1130,1131,5,99,0,0,1131,1132,5,114,0,0,1132,1133,5,105, - 0,0,1133,1134,5,98,0,0,1134,1135,5,101,0,0,1135,210,1,0,0,0,1136, - 1137,5,114,0,0,1137,1138,5,101,0,0,1138,1139,5,103,0,0,1139,1140, - 5,105,0,0,1140,1141,5,115,0,0,1141,1142,5,116,0,0,1142,1143,5,101, - 0,0,1143,1144,5,114,0,0,1144,212,1,0,0,0,1145,1146,5,99,0,0,1146, - 1147,5,114,0,0,1147,1148,5,100,0,0,1148,1149,5,116,0,0,1149,214, - 1,0,0,0,1150,1151,5,111,0,0,1151,1152,5,112,0,0,1152,1153,5,116, - 0,0,1153,1154,5,105,0,0,1154,1155,5,111,0,0,1155,1156,5,110,0,0, - 1156,1157,5,97,0,0,1157,1158,5,108,0,0,1158,1159,5,45,0,0,1159,1160, - 5,111,0,0,1160,1161,5,110,0,0,1161,1162,5,101,0,0,1162,216,1,0,0, - 0,1163,1164,5,101,0,0,1164,1165,5,120,0,0,1165,1166,5,97,0,0,1166, - 1167,5,99,0,0,1167,1168,5,116,0,0,1168,1169,5,108,0,0,1169,1170, - 5,121,0,0,1170,1171,5,45,0,0,1171,1172,5,111,0,0,1172,1173,5,110, - 0,0,1173,1174,5,101,0,0,1174,218,1,0,0,0,1175,1176,5,109,0,0,1176, - 1177,5,97,0,0,1177,1178,5,110,0,0,1178,1179,5,121,0,0,1179,1180, - 5,45,0,0,1180,1181,5,117,0,0,1181,1182,5,110,0,0,1182,1183,5,105, - 0,0,1183,1184,5,113,0,0,1184,1185,5,117,0,0,1185,1186,5,101,0,0, - 1186,220,1,0,0,0,1187,1188,5,109,0,0,1188,1189,5,97,0,0,1189,1190, - 5,110,0,0,1190,1191,5,121,0,0,1191,222,1,0,0,0,1192,1193,5,111,0, - 0,1193,1194,5,114,0,0,1194,1195,5,100,0,0,1195,1196,5,101,0,0,1196, - 1197,5,114,0,0,1197,1198,5,101,0,0,1198,1199,5,100,0,0,1199,224, - 1,0,0,0,1200,1201,5,117,0,0,1201,1202,5,110,0,0,1202,1203,5,105, - 0,0,1203,1204,5,116,0,0,1204,226,1,0,0,0,1205,1206,5,119,0,0,1206, - 1207,5,97,0,0,1207,1208,5,116,0,0,1208,1209,5,99,0,0,1209,1210,5, - 104,0,0,1210,1211,5,45,0,0,1211,1212,5,104,0,0,1212,1213,5,97,0, - 0,1213,1214,5,110,0,0,1214,1215,5,100,0,0,1215,1216,5,108,0,0,1216, - 1217,5,101,0,0,1217,228,1,0,0,0,1218,1219,5,109,0,0,1219,1220,5, - 101,0,0,1220,1221,5,115,0,0,1221,1222,5,115,0,0,1222,1223,5,97,0, - 0,1223,1224,5,103,0,0,1224,1225,5,101,0,0,1225,230,1,0,0,0,1226, - 1227,5,97,0,0,1227,1228,5,116,0,0,1228,1229,5,111,0,0,1229,1230, - 5,109,0,0,1230,1231,5,45,0,0,1231,1232,5,114,0,0,1232,1233,5,101, - 0,0,1233,1234,5,102,0,0,1234,232,1,0,0,0,1235,1236,5,105,0,0,1236, - 1237,5,110,0,0,1237,1238,5,116,0,0,1238,1239,5,101,0,0,1239,1240, - 5,114,0,0,1240,1241,5,102,0,0,1241,1242,5,97,0,0,1242,1243,5,99, - 0,0,1243,1244,5,101,0,0,1244,1245,5,45,0,0,1245,1246,5,114,0,0,1246, - 1247,5,101,0,0,1247,1248,5,102,0,0,1248,234,1,0,0,0,1249,1250,5, - 111,0,0,1250,1251,5,112,0,0,1251,1252,5,116,0,0,1252,1253,5,105, - 0,0,1253,1254,5,111,0,0,1254,1255,5,110,0,0,1255,1256,5,97,0,0,1256, - 1257,5,108,0,0,1257,236,1,0,0,0,1258,1259,5,108,0,0,1259,1260,5, - 105,0,0,1260,1261,5,115,0,0,1261,1262,5,116,0,0,1262,238,1,0,0,0, - 1263,1264,5,114,0,0,1264,1265,5,101,0,0,1265,1266,5,99,0,0,1266, - 1267,5,111,0,0,1267,1268,5,114,0,0,1268,1269,5,100,0,0,1269,240, - 1,0,0,0,1270,1271,5,98,0,0,1271,1272,5,111,0,0,1272,1273,5,111,0, - 0,1273,1274,5,108,0,0,1274,242,1,0,0,0,1275,1276,5,98,0,0,1276,1277, - 5,121,0,0,1277,1278,5,116,0,0,1278,1279,5,101,0,0,1279,1280,5,115, - 0,0,1280,244,1,0,0,0,1281,1282,5,100,0,0,1282,1283,5,111,0,0,1283, - 1284,5,117,0,0,1284,1285,5,98,0,0,1285,1286,5,108,0,0,1286,1287, - 5,101,0,0,1287,246,1,0,0,0,1288,1289,5,105,0,0,1289,1290,5,110,0, - 0,1290,1291,5,116,0,0,1291,1292,5,51,0,0,1292,1293,5,50,0,0,1293, - 248,1,0,0,0,1294,1295,5,105,0,0,1295,1296,5,110,0,0,1296,1297,5, - 116,0,0,1297,1298,5,54,0,0,1298,1299,5,52,0,0,1299,250,1,0,0,0,1300, - 1301,5,115,0,0,1301,1302,5,116,0,0,1302,1303,5,114,0,0,1303,1304, - 5,105,0,0,1304,1305,5,110,0,0,1305,1306,5,103,0,0,1306,252,1,0,0, - 0,1307,1308,5,117,0,0,1308,1309,5,105,0,0,1309,1310,5,110,0,0,1310, - 1311,5,116,0,0,1311,1312,5,51,0,0,1312,1313,5,50,0,0,1313,254,1, - 0,0,0,1314,1315,5,117,0,0,1315,1316,5,105,0,0,1316,1317,5,110,0, - 0,1317,1318,5,116,0,0,1318,1319,5,54,0,0,1319,1320,5,52,0,0,1320, - 256,1,0,0,0,1321,1322,5,116,0,0,1322,1323,5,114,0,0,1323,1324,5, - 117,0,0,1324,1325,5,101,0,0,1325,258,1,0,0,0,1326,1327,5,102,0,0, - 1327,1328,5,97,0,0,1328,1329,5,108,0,0,1329,1330,5,115,0,0,1330, - 1331,5,101,0,0,1331,260,1,0,0,0,1332,1333,5,110,0,0,1333,1334,5, - 117,0,0,1334,1335,5,108,0,0,1335,1336,5,108,0,0,1336,262,1,0,0,0, - 1337,1338,5,45,0,0,1338,1339,5,62,0,0,1339,264,1,0,0,0,1340,1341, - 5,58,0,0,1341,266,1,0,0,0,1342,1343,5,59,0,0,1343,268,1,0,0,0,1344, - 1345,5,44,0,0,1345,270,1,0,0,0,1346,1347,5,46,0,0,1347,272,1,0,0, - 0,1348,1349,5,123,0,0,1349,274,1,0,0,0,1350,1351,5,125,0,0,1351, - 276,1,0,0,0,1352,1353,5,91,0,0,1353,278,1,0,0,0,1354,1355,5,93,0, - 0,1355,280,1,0,0,0,1356,1357,5,40,0,0,1357,282,1,0,0,0,1358,1359, - 5,41,0,0,1359,284,1,0,0,0,1360,1361,5,60,0,0,1361,286,1,0,0,0,1362, - 1363,5,62,0,0,1363,288,1,0,0,0,1364,1365,5,38,0,0,1365,290,1,0,0, - 0,1366,1367,5,61,0,0,1367,292,1,0,0,0,1368,1370,5,45,0,0,1369,1368, - 1,0,0,0,1369,1370,1,0,0,0,1370,1372,1,0,0,0,1371,1373,7,0,0,0,1372, - 1371,1,0,0,0,1373,1374,1,0,0,0,1374,1372,1,0,0,0,1374,1375,1,0,0, - 0,1375,294,1,0,0,0,1376,1378,5,45,0,0,1377,1376,1,0,0,0,1377,1378, - 1,0,0,0,1378,1387,1,0,0,0,1379,1388,5,48,0,0,1380,1384,7,1,0,0,1381, - 1383,7,0,0,0,1382,1381,1,0,0,0,1383,1386,1,0,0,0,1384,1382,1,0,0, - 0,1384,1385,1,0,0,0,1385,1388,1,0,0,0,1386,1384,1,0,0,0,1387,1379, - 1,0,0,0,1387,1380,1,0,0,0,1388,1395,1,0,0,0,1389,1391,5,46,0,0,1390, - 1392,7,0,0,0,1391,1390,1,0,0,0,1392,1393,1,0,0,0,1393,1391,1,0,0, - 0,1393,1394,1,0,0,0,1394,1396,1,0,0,0,1395,1389,1,0,0,0,1395,1396, - 1,0,0,0,1396,1406,1,0,0,0,1397,1399,7,2,0,0,1398,1400,7,3,0,0,1399, - 1398,1,0,0,0,1399,1400,1,0,0,0,1400,1402,1,0,0,0,1401,1403,7,0,0, - 0,1402,1401,1,0,0,0,1403,1404,1,0,0,0,1404,1402,1,0,0,0,1404,1405, - 1,0,0,0,1405,1407,1,0,0,0,1406,1397,1,0,0,0,1406,1407,1,0,0,0,1407, - 296,1,0,0,0,1408,1412,7,4,0,0,1409,1411,7,5,0,0,1410,1409,1,0,0, - 0,1411,1414,1,0,0,0,1412,1410,1,0,0,0,1412,1413,1,0,0,0,1413,298, - 1,0,0,0,1414,1412,1,0,0,0,1415,1420,5,34,0,0,1416,1419,3,301,150, - 0,1417,1419,8,6,0,0,1418,1416,1,0,0,0,1418,1417,1,0,0,0,1419,1422, - 1,0,0,0,1420,1418,1,0,0,0,1420,1421,1,0,0,0,1421,1423,1,0,0,0,1422, - 1420,1,0,0,0,1423,1424,5,34,0,0,1424,300,1,0,0,0,1425,1433,5,92, - 0,0,1426,1434,7,7,0,0,1427,1428,5,117,0,0,1428,1429,3,303,151,0, - 1429,1430,3,303,151,0,1430,1431,3,303,151,0,1431,1432,3,303,151, - 0,1432,1434,1,0,0,0,1433,1426,1,0,0,0,1433,1427,1,0,0,0,1434,302, - 1,0,0,0,1435,1436,7,8,0,0,1436,304,1,0,0,0,1437,1438,5,47,0,0,1438, - 1439,5,47,0,0,1439,1443,1,0,0,0,1440,1442,8,9,0,0,1441,1440,1,0, - 0,0,1442,1445,1,0,0,0,1443,1441,1,0,0,0,1443,1444,1,0,0,0,1444,1446, - 1,0,0,0,1445,1443,1,0,0,0,1446,1447,6,152,0,0,1447,306,1,0,0,0,1448, - 1449,5,47,0,0,1449,1450,5,42,0,0,1450,1454,1,0,0,0,1451,1453,9,0, - 0,0,1452,1451,1,0,0,0,1453,1456,1,0,0,0,1454,1455,1,0,0,0,1454,1452, - 1,0,0,0,1455,1457,1,0,0,0,1456,1454,1,0,0,0,1457,1458,5,42,0,0,1458, - 1459,5,47,0,0,1459,1460,1,0,0,0,1460,1461,6,153,0,0,1461,308,1,0, - 0,0,1462,1464,7,10,0,0,1463,1462,1,0,0,0,1464,1465,1,0,0,0,1465, - 1463,1,0,0,0,1465,1466,1,0,0,0,1466,1467,1,0,0,0,1467,1468,6,154, - 0,0,1468,310,1,0,0,0,18,0,1369,1374,1377,1384,1387,1393,1395,1399, - 1404,1406,1412,1418,1420,1433,1443,1454,1465,1,0,1,0 + 287,144,289,145,291,146,293,147,295,148,297,149,299,150,301,151, + 303,152,305,0,307,0,309,153,311,154,313,155,1,0,11,1,0,48,57,1,0, + 49,57,2,0,69,69,101,101,2,0,43,43,45,45,3,0,65,90,95,95,97,122,4, + 0,48,57,65,90,95,95,97,122,4,0,10,10,13,13,34,34,92,92,8,0,34,34, + 47,47,92,92,98,98,102,102,110,110,114,114,116,116,3,0,48,57,65,70, + 97,102,2,0,10,10,13,13,3,0,9,10,13,13,32,32,1504,0,1,1,0,0,0,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,229,1,0,0,0,0,231,1,0, + 0,0,0,233,1,0,0,0,0,235,1,0,0,0,0,237,1,0,0,0,0,239,1,0,0,0,0,241, + 1,0,0,0,0,243,1,0,0,0,0,245,1,0,0,0,0,247,1,0,0,0,0,249,1,0,0,0, + 0,251,1,0,0,0,0,253,1,0,0,0,0,255,1,0,0,0,0,257,1,0,0,0,0,259,1, + 0,0,0,0,261,1,0,0,0,0,263,1,0,0,0,0,265,1,0,0,0,0,267,1,0,0,0,0, + 269,1,0,0,0,0,271,1,0,0,0,0,273,1,0,0,0,0,275,1,0,0,0,0,277,1,0, + 0,0,0,279,1,0,0,0,0,281,1,0,0,0,0,283,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,309,1, + 0,0,0,0,311,1,0,0,0,0,313,1,0,0,0,1,315,1,0,0,0,3,320,1,0,0,0,5, + 327,1,0,0,0,7,336,1,0,0,0,9,349,1,0,0,0,11,357,1,0,0,0,13,361,1, + 0,0,0,15,370,1,0,0,0,17,378,1,0,0,0,19,387,1,0,0,0,21,398,1,0,0, + 0,23,408,1,0,0,0,25,418,1,0,0,0,27,427,1,0,0,0,29,439,1,0,0,0,31, + 446,1,0,0,0,33,454,1,0,0,0,35,463,1,0,0,0,37,471,1,0,0,0,39,477, + 1,0,0,0,41,482,1,0,0,0,43,495,1,0,0,0,45,505,1,0,0,0,47,517,1,0, + 0,0,49,523,1,0,0,0,51,534,1,0,0,0,53,545,1,0,0,0,55,550,1,0,0,0, + 57,559,1,0,0,0,59,569,1,0,0,0,61,574,1,0,0,0,63,578,1,0,0,0,65,584, + 1,0,0,0,67,589,1,0,0,0,69,599,1,0,0,0,71,603,1,0,0,0,73,616,1,0, + 0,0,75,621,1,0,0,0,77,628,1,0,0,0,79,637,1,0,0,0,81,648,1,0,0,0, + 83,652,1,0,0,0,85,661,1,0,0,0,87,668,1,0,0,0,89,677,1,0,0,0,91,682, + 1,0,0,0,93,692,1,0,0,0,95,703,1,0,0,0,97,711,1,0,0,0,99,717,1,0, + 0,0,101,726,1,0,0,0,103,736,1,0,0,0,105,745,1,0,0,0,107,757,1,0, + 0,0,109,768,1,0,0,0,111,774,1,0,0,0,113,782,1,0,0,0,115,785,1,0, + 0,0,117,790,1,0,0,0,119,797,1,0,0,0,121,800,1,0,0,0,123,808,1,0, + 0,0,125,815,1,0,0,0,127,821,1,0,0,0,129,826,1,0,0,0,131,837,1,0, + 0,0,133,842,1,0,0,0,135,848,1,0,0,0,137,855,1,0,0,0,139,859,1,0, + 0,0,141,871,1,0,0,0,143,874,1,0,0,0,145,881,1,0,0,0,147,884,1,0, + 0,0,149,891,1,0,0,0,151,899,1,0,0,0,153,906,1,0,0,0,155,917,1,0, + 0,0,157,924,1,0,0,0,159,933,1,0,0,0,161,948,1,0,0,0,163,958,1,0, + 0,0,165,968,1,0,0,0,167,981,1,0,0,0,169,987,1,0,0,0,171,1004,1,0, + 0,0,173,1007,1,0,0,0,175,1011,1,0,0,0,177,1016,1,0,0,0,179,1022, + 1,0,0,0,181,1031,1,0,0,0,183,1040,1,0,0,0,185,1044,1,0,0,0,187,1048, + 1,0,0,0,189,1052,1,0,0,0,191,1058,1,0,0,0,193,1064,1,0,0,0,195,1069, + 1,0,0,0,197,1074,1,0,0,0,199,1080,1,0,0,0,201,1088,1,0,0,0,203,1096, + 1,0,0,0,205,1107,1,0,0,0,207,1112,1,0,0,0,209,1124,1,0,0,0,211,1135, + 1,0,0,0,213,1145,1,0,0,0,215,1157,1,0,0,0,217,1166,1,0,0,0,219,1171, + 1,0,0,0,221,1184,1,0,0,0,223,1196,1,0,0,0,225,1208,1,0,0,0,227,1213, + 1,0,0,0,229,1221,1,0,0,0,231,1226,1,0,0,0,233,1239,1,0,0,0,235,1247, + 1,0,0,0,237,1256,1,0,0,0,239,1270,1,0,0,0,241,1279,1,0,0,0,243,1284, + 1,0,0,0,245,1291,1,0,0,0,247,1296,1,0,0,0,249,1302,1,0,0,0,251,1309, + 1,0,0,0,253,1315,1,0,0,0,255,1321,1,0,0,0,257,1328,1,0,0,0,259,1335, + 1,0,0,0,261,1342,1,0,0,0,263,1347,1,0,0,0,265,1353,1,0,0,0,267,1358, + 1,0,0,0,269,1361,1,0,0,0,271,1363,1,0,0,0,273,1365,1,0,0,0,275,1367, + 1,0,0,0,277,1369,1,0,0,0,279,1371,1,0,0,0,281,1373,1,0,0,0,283,1375, + 1,0,0,0,285,1377,1,0,0,0,287,1379,1,0,0,0,289,1381,1,0,0,0,291,1383, + 1,0,0,0,293,1385,1,0,0,0,295,1387,1,0,0,0,297,1390,1,0,0,0,299,1398, + 1,0,0,0,301,1429,1,0,0,0,303,1436,1,0,0,0,305,1446,1,0,0,0,307,1456, + 1,0,0,0,309,1458,1,0,0,0,311,1469,1,0,0,0,313,1484,1,0,0,0,315,316, + 5,101,0,0,316,317,5,100,0,0,317,318,5,105,0,0,318,319,5,116,0,0, + 319,2,1,0,0,0,320,321,5,109,0,0,321,322,5,111,0,0,322,323,5,100, + 0,0,323,324,5,117,0,0,324,325,5,108,0,0,325,326,5,101,0,0,326,4, + 1,0,0,0,327,328,5,99,0,0,328,329,5,111,0,0,329,330,5,110,0,0,330, + 331,5,116,0,0,331,332,5,114,0,0,332,333,5,97,0,0,333,334,5,99,0, + 0,334,335,5,116,0,0,335,6,1,0,0,0,336,337,5,112,0,0,337,338,5,114, + 0,0,338,339,5,101,0,0,339,340,5,115,0,0,340,341,5,101,0,0,341,342, + 5,110,0,0,342,343,5,116,0,0,343,344,5,97,0,0,344,345,5,116,0,0,345, + 346,5,105,0,0,346,347,5,111,0,0,347,348,5,110,0,0,348,8,1,0,0,0, + 349,350,5,115,0,0,350,351,5,117,0,0,351,352,5,98,0,0,352,353,5,106, + 0,0,353,354,5,101,0,0,354,355,5,99,0,0,355,356,5,116,0,0,356,10, + 1,0,0,0,357,358,5,102,0,0,358,359,5,111,0,0,359,360,5,114,0,0,360, + 12,1,0,0,0,361,362,5,99,0,0,362,363,5,114,0,0,363,364,5,101,0,0, + 364,365,5,97,0,0,365,366,5,116,0,0,366,367,5,105,0,0,367,368,5,111, + 0,0,368,369,5,110,0,0,369,14,1,0,0,0,370,371,5,118,0,0,371,372,5, + 97,0,0,372,373,5,114,0,0,373,374,5,105,0,0,374,375,5,97,0,0,375, + 376,5,110,0,0,376,377,5,116,0,0,377,16,1,0,0,0,378,379,5,112,0,0, + 379,380,5,114,0,0,380,381,5,101,0,0,381,382,5,112,0,0,382,383,5, + 97,0,0,383,384,5,114,0,0,384,385,5,101,0,0,385,386,5,115,0,0,386, + 18,1,0,0,0,387,388,5,105,0,0,388,389,5,110,0,0,389,390,5,105,0,0, + 390,391,5,116,0,0,391,392,5,105,0,0,392,393,5,97,0,0,393,394,5,108, + 0,0,394,395,5,105,0,0,395,396,5,122,0,0,396,397,5,101,0,0,397,20, + 1,0,0,0,398,399,5,119,0,0,399,400,5,111,0,0,400,401,5,114,0,0,401, + 402,5,107,0,0,402,403,5,115,0,0,403,404,5,112,0,0,404,405,5,97,0, + 0,405,406,5,99,0,0,406,407,5,101,0,0,407,22,1,0,0,0,408,409,5,101, + 0,0,409,410,5,120,0,0,410,411,5,101,0,0,411,412,5,99,0,0,412,413, + 5,117,0,0,413,414,5,116,0,0,414,415,5,105,0,0,415,416,5,111,0,0, + 416,417,5,110,0,0,417,24,1,0,0,0,418,419,5,115,0,0,419,420,5,110, + 0,0,420,421,5,97,0,0,421,422,5,112,0,0,422,423,5,115,0,0,423,424, + 5,104,0,0,424,425,5,111,0,0,425,426,5,116,0,0,426,26,1,0,0,0,427, + 428,5,116,0,0,428,429,5,114,0,0,429,430,5,97,0,0,430,431,5,110,0, + 0,431,432,5,115,0,0,432,433,5,97,0,0,433,434,5,99,0,0,434,435,5, + 116,0,0,435,436,5,105,0,0,436,437,5,111,0,0,437,438,5,110,0,0,438, + 28,1,0,0,0,439,440,5,114,0,0,440,441,5,101,0,0,441,442,5,109,0,0, + 442,443,5,111,0,0,443,444,5,116,0,0,444,445,5,101,0,0,445,30,1,0, + 0,0,446,447,5,116,0,0,447,448,5,97,0,0,448,449,5,114,0,0,449,450, + 5,103,0,0,450,451,5,101,0,0,451,452,5,116,0,0,452,453,5,115,0,0, + 453,32,1,0,0,0,454,455,5,112,0,0,455,456,5,111,0,0,456,457,5,114, + 0,0,457,458,5,116,0,0,458,459,5,97,0,0,459,460,5,98,0,0,460,461, + 5,108,0,0,461,462,5,101,0,0,462,34,1,0,0,0,463,464,5,114,0,0,464, + 465,5,101,0,0,465,466,5,112,0,0,466,467,5,108,0,0,467,468,5,105, + 0,0,468,469,5,99,0,0,469,470,5,97,0,0,470,36,1,0,0,0,471,472,5,108, + 0,0,472,473,5,111,0,0,473,474,5,99,0,0,474,475,5,97,0,0,475,476, + 5,108,0,0,476,38,1,0,0,0,477,478,5,102,0,0,478,479,5,114,0,0,479, + 480,5,111,0,0,480,481,5,109,0,0,481,40,1,0,0,0,482,483,5,114,0,0, + 483,484,5,101,0,0,484,485,5,115,0,0,485,486,5,117,0,0,486,487,5, + 108,0,0,487,488,5,116,0,0,488,489,5,45,0,0,489,490,5,98,0,0,490, + 491,5,121,0,0,491,492,5,116,0,0,492,493,5,101,0,0,493,494,5,115, + 0,0,494,42,1,0,0,0,495,496,5,114,0,0,496,497,5,112,0,0,497,498,5, + 99,0,0,498,499,5,45,0,0,499,500,5,99,0,0,500,501,5,97,0,0,501,502, + 5,108,0,0,502,503,5,108,0,0,503,504,5,115,0,0,504,44,1,0,0,0,505, + 506,5,100,0,0,506,507,5,101,0,0,507,508,5,97,0,0,508,509,5,100,0, + 0,509,510,5,108,0,0,510,511,5,105,0,0,511,512,5,110,0,0,512,513, + 5,101,0,0,513,514,5,45,0,0,514,515,5,109,0,0,515,516,5,115,0,0,516, + 46,1,0,0,0,517,518,5,113,0,0,518,519,5,117,0,0,519,520,5,101,0,0, + 520,521,5,114,0,0,521,522,5,121,0,0,522,48,1,0,0,0,523,524,5,114, + 0,0,524,525,5,101,0,0,525,526,5,102,0,0,526,527,5,108,0,0,527,528, + 5,101,0,0,528,529,5,99,0,0,529,530,5,116,0,0,530,531,5,105,0,0,531, + 532,5,111,0,0,532,533,5,110,0,0,533,50,1,0,0,0,534,535,5,115,0,0, + 535,536,5,112,0,0,536,537,5,101,0,0,537,538,5,99,0,0,538,539,5,105, + 0,0,539,540,5,97,0,0,540,541,5,108,0,0,541,542,5,105,0,0,542,543, + 5,122,0,0,543,544,5,101,0,0,544,52,1,0,0,0,545,546,5,114,0,0,546, + 547,5,111,0,0,547,548,5,111,0,0,548,549,5,116,0,0,549,54,1,0,0,0, + 550,551,5,100,0,0,551,552,5,111,0,0,552,553,5,99,0,0,553,554,5,117, + 0,0,554,555,5,109,0,0,555,556,5,101,0,0,556,557,5,110,0,0,557,558, + 5,116,0,0,558,56,1,0,0,0,559,560,5,102,0,0,560,561,5,114,0,0,561, + 562,5,97,0,0,562,563,5,103,0,0,563,564,5,109,0,0,564,565,5,101,0, + 0,565,566,5,110,0,0,566,567,5,116,0,0,567,568,5,115,0,0,568,58,1, + 0,0,0,569,570,5,118,0,0,570,571,5,105,0,0,571,572,5,101,0,0,572, + 573,5,119,0,0,573,60,1,0,0,0,574,575,5,109,0,0,575,576,5,97,0,0, + 576,577,5,120,0,0,577,62,1,0,0,0,578,579,5,97,0,0,579,580,5,108, + 0,0,580,581,5,108,0,0,581,582,5,111,0,0,582,583,5,119,0,0,583,64, + 1,0,0,0,584,585,5,112,0,0,585,586,5,111,0,0,586,587,5,108,0,0,587, + 588,5,108,0,0,588,66,1,0,0,0,589,590,5,113,0,0,590,591,5,117,0,0, + 591,592,5,101,0,0,592,593,5,114,0,0,593,594,5,121,0,0,594,595,5, + 97,0,0,595,596,5,98,0,0,596,597,5,108,0,0,597,598,5,101,0,0,598, + 68,1,0,0,0,599,600,5,114,0,0,600,601,5,112,0,0,601,602,5,99,0,0, + 602,70,1,0,0,0,603,604,5,113,0,0,604,605,5,117,0,0,605,606,5,101, + 0,0,606,607,5,114,0,0,607,608,5,121,0,0,608,609,5,45,0,0,609,610, + 5,114,0,0,610,611,5,101,0,0,611,612,5,97,0,0,612,613,5,115,0,0,613, + 614,5,111,0,0,614,615,5,110,0,0,615,72,1,0,0,0,616,617,5,116,0,0, + 617,618,5,121,0,0,618,619,5,112,0,0,619,620,5,101,0,0,620,74,1,0, + 0,0,621,622,5,111,0,0,622,623,5,98,0,0,623,624,5,106,0,0,624,625, + 5,101,0,0,625,626,5,99,0,0,626,627,5,116,0,0,627,76,1,0,0,0,628, + 629,5,115,0,0,629,630,5,116,0,0,630,631,5,111,0,0,631,632,5,114, + 0,0,632,633,5,97,0,0,633,634,5,98,0,0,634,635,5,108,0,0,635,636, + 5,101,0,0,636,78,1,0,0,0,637,638,5,105,0,0,638,639,5,109,0,0,639, + 640,5,112,0,0,640,641,5,108,0,0,641,642,5,101,0,0,642,643,5,109, + 0,0,643,644,5,101,0,0,644,645,5,110,0,0,645,646,5,116,0,0,646,647, + 5,115,0,0,647,80,1,0,0,0,648,649,5,114,0,0,649,650,5,101,0,0,650, + 651,5,102,0,0,651,82,1,0,0,0,652,653,5,102,0,0,653,654,5,114,0,0, + 654,655,5,97,0,0,655,656,5,103,0,0,656,657,5,109,0,0,657,658,5,101, + 0,0,658,659,5,110,0,0,659,660,5,116,0,0,660,84,1,0,0,0,661,662,5, + 105,0,0,662,663,5,109,0,0,663,664,5,112,0,0,664,665,5,111,0,0,665, + 666,5,114,0,0,666,667,5,116,0,0,667,86,1,0,0,0,668,669,5,101,0,0, + 669,670,5,120,0,0,670,671,5,116,0,0,671,672,5,101,0,0,672,673,5, + 114,0,0,673,674,5,110,0,0,674,675,5,97,0,0,675,676,5,108,0,0,676, + 88,1,0,0,0,677,678,5,97,0,0,678,679,5,116,0,0,679,680,5,111,0,0, + 680,681,5,109,0,0,681,90,1,0,0,0,682,683,5,105,0,0,683,684,5,110, + 0,0,684,685,5,116,0,0,685,686,5,101,0,0,686,687,5,114,0,0,687,688, + 5,102,0,0,688,689,5,97,0,0,689,690,5,99,0,0,690,691,5,101,0,0,691, + 92,1,0,0,0,692,693,5,105,0,0,693,694,5,110,0,0,694,695,5,116,0,0, + 695,696,5,101,0,0,696,697,5,114,0,0,697,698,5,102,0,0,698,699,5, + 97,0,0,699,700,5,99,0,0,700,701,5,101,0,0,701,702,5,115,0,0,702, + 94,1,0,0,0,703,704,5,112,0,0,704,705,5,97,0,0,705,706,5,99,0,0,706, + 707,5,107,0,0,707,708,5,97,0,0,708,709,5,103,0,0,709,710,5,101,0, + 0,710,96,1,0,0,0,711,712,5,118,0,0,712,713,5,97,0,0,713,714,5,108, + 0,0,714,715,5,117,0,0,715,716,5,101,0,0,716,98,1,0,0,0,717,718,5, + 114,0,0,718,719,5,101,0,0,719,720,5,108,0,0,720,721,5,97,0,0,721, + 722,5,116,0,0,722,723,5,105,0,0,723,724,5,111,0,0,724,725,5,110, + 0,0,725,100,1,0,0,0,726,727,5,111,0,0,727,728,5,112,0,0,728,729, + 5,101,0,0,729,730,5,114,0,0,730,731,5,97,0,0,731,732,5,116,0,0,732, + 733,5,105,0,0,733,734,5,111,0,0,734,735,5,110,0,0,735,102,1,0,0, + 0,736,737,5,102,0,0,737,738,5,117,0,0,738,739,5,110,0,0,739,740, + 5,99,0,0,740,741,5,116,0,0,741,742,5,105,0,0,742,743,5,111,0,0,743, + 744,5,110,0,0,744,104,1,0,0,0,745,746,5,99,0,0,746,747,5,111,0,0, + 747,748,5,110,0,0,748,749,5,115,0,0,749,750,5,116,0,0,750,751,5, + 114,0,0,751,752,5,117,0,0,752,753,5,99,0,0,753,754,5,116,0,0,754, + 755,5,111,0,0,755,756,5,114,0,0,756,106,1,0,0,0,757,758,5,99,0,0, + 758,759,5,111,0,0,759,760,5,110,0,0,760,761,5,115,0,0,761,762,5, + 116,0,0,762,763,5,114,0,0,763,764,5,117,0,0,764,765,5,99,0,0,765, + 766,5,116,0,0,766,767,5,115,0,0,767,108,1,0,0,0,768,769,5,105,0, + 0,769,770,5,110,0,0,770,771,5,112,0,0,771,772,5,117,0,0,772,773, + 5,116,0,0,773,110,1,0,0,0,774,775,5,99,0,0,775,776,5,111,0,0,776, + 777,5,110,0,0,777,778,5,102,0,0,778,779,5,111,0,0,779,780,5,114, + 0,0,780,781,5,109,0,0,781,112,1,0,0,0,782,783,5,97,0,0,783,784,5, + 115,0,0,784,114,1,0,0,0,785,786,5,98,0,0,786,787,5,105,0,0,787,788, + 5,110,0,0,788,789,5,100,0,0,789,116,1,0,0,0,790,791,5,115,0,0,791, + 792,5,116,0,0,792,793,5,97,0,0,793,794,5,116,0,0,794,795,5,105,0, + 0,795,796,5,99,0,0,796,118,1,0,0,0,797,798,5,116,0,0,798,799,5,111, + 0,0,799,120,1,0,0,0,800,801,5,112,0,0,801,802,5,114,0,0,802,803, + 5,105,0,0,803,804,5,118,0,0,804,805,5,97,0,0,805,806,5,116,0,0,806, + 807,5,101,0,0,807,122,1,0,0,0,808,809,5,115,0,0,809,810,5,104,0, + 0,810,811,5,97,0,0,811,812,5,114,0,0,812,813,5,101,0,0,813,814,5, + 100,0,0,814,124,1,0,0,0,815,816,5,115,0,0,816,817,5,116,0,0,817, + 818,5,97,0,0,818,819,5,116,0,0,819,820,5,101,0,0,820,126,1,0,0,0, + 821,822,5,101,0,0,822,823,5,100,0,0,823,824,5,103,0,0,824,825,5, + 101,0,0,825,128,1,0,0,0,826,827,5,112,0,0,827,828,5,114,0,0,828, + 829,5,111,0,0,829,830,5,106,0,0,830,831,5,101,0,0,831,832,5,99,0, + 0,832,833,5,116,0,0,833,834,5,105,0,0,834,835,5,111,0,0,835,836, + 5,110,0,0,836,130,1,0,0,0,837,838,5,119,0,0,838,839,5,105,0,0,839, + 840,5,116,0,0,840,841,5,104,0,0,841,132,1,0,0,0,842,843,5,117,0, + 0,843,844,5,115,0,0,844,845,5,105,0,0,845,846,5,110,0,0,846,847, + 5,103,0,0,847,134,1,0,0,0,848,849,5,97,0,0,849,850,5,99,0,0,850, + 851,5,99,0,0,851,852,5,101,0,0,852,853,5,112,0,0,853,854,5,116,0, + 0,854,136,1,0,0,0,855,856,5,118,0,0,856,857,5,105,0,0,857,858,5, + 97,0,0,858,138,1,0,0,0,859,860,5,109,0,0,860,861,5,97,0,0,861,862, + 5,116,0,0,862,863,5,101,0,0,863,864,5,114,0,0,864,865,5,105,0,0, + 865,866,5,97,0,0,866,867,5,108,0,0,867,868,5,105,0,0,868,869,5,122, + 0,0,869,870,5,101,0,0,870,140,1,0,0,0,871,872,5,105,0,0,872,873, + 5,102,0,0,873,142,1,0,0,0,874,875,5,97,0,0,875,876,5,98,0,0,876, + 877,5,115,0,0,877,878,5,101,0,0,878,879,5,110,0,0,879,880,5,116, + 0,0,880,144,1,0,0,0,881,882,5,111,0,0,882,883,5,110,0,0,883,146, + 1,0,0,0,884,885,5,112,0,0,885,886,5,111,0,0,886,887,5,108,0,0,887, + 888,5,105,0,0,888,889,5,99,0,0,889,890,5,121,0,0,890,148,1,0,0,0, + 891,892,5,100,0,0,892,893,5,101,0,0,893,894,5,102,0,0,894,895,5, + 97,0,0,895,896,5,117,0,0,896,897,5,108,0,0,897,898,5,116,0,0,898, + 150,1,0,0,0,899,900,5,115,0,0,900,901,5,111,0,0,901,902,5,117,0, + 0,902,903,5,114,0,0,903,904,5,99,0,0,904,905,5,101,0,0,905,152,1, + 0,0,0,906,907,5,114,0,0,907,908,5,101,0,0,908,909,5,112,0,0,909, + 910,5,111,0,0,910,911,5,115,0,0,911,912,5,105,0,0,912,913,5,116, + 0,0,913,914,5,111,0,0,914,915,5,114,0,0,915,916,5,121,0,0,916,154, + 1,0,0,0,917,918,5,99,0,0,918,919,5,111,0,0,919,920,5,109,0,0,920, + 921,5,109,0,0,921,922,5,105,0,0,922,923,5,116,0,0,923,156,1,0,0, + 0,924,925,5,114,0,0,925,926,5,101,0,0,926,927,5,118,0,0,927,928, + 5,105,0,0,928,929,5,115,0,0,929,930,5,105,0,0,930,931,5,111,0,0, + 931,932,5,110,0,0,932,158,1,0,0,0,933,934,5,115,0,0,934,935,5,101, + 0,0,935,936,5,109,0,0,936,937,5,97,0,0,937,938,5,110,0,0,938,939, + 5,116,0,0,939,940,5,105,0,0,940,941,5,99,0,0,941,942,5,45,0,0,942, + 943,5,109,0,0,943,944,5,97,0,0,944,945,5,106,0,0,945,946,5,111,0, + 0,946,947,5,114,0,0,947,160,1,0,0,0,948,949,5,111,0,0,949,950,5, + 110,0,0,950,951,5,45,0,0,951,952,5,100,0,0,952,953,5,101,0,0,953, + 954,5,108,0,0,954,955,5,101,0,0,955,956,5,116,0,0,956,957,5,101, + 0,0,957,162,1,0,0,0,958,959,5,108,0,0,959,960,5,105,0,0,960,961, + 5,102,0,0,961,962,5,101,0,0,962,963,5,99,0,0,963,964,5,121,0,0,964, + 965,5,99,0,0,965,966,5,108,0,0,966,967,5,101,0,0,967,164,1,0,0,0, + 968,969,5,114,0,0,969,970,5,101,0,0,970,971,5,116,0,0,971,972,5, + 97,0,0,972,973,5,105,0,0,973,974,5,110,0,0,974,975,5,45,0,0,975, + 976,5,111,0,0,976,977,5,116,0,0,977,978,5,104,0,0,978,979,5,101, + 0,0,979,980,5,114,0,0,980,166,1,0,0,0,981,982,5,107,0,0,982,983, + 5,101,0,0,983,984,5,121,0,0,984,985,5,101,0,0,985,986,5,100,0,0, + 986,168,1,0,0,0,987,988,5,112,0,0,988,989,5,117,0,0,989,990,5,98, + 0,0,990,991,5,108,0,0,991,992,5,105,0,0,992,993,5,99,0,0,993,994, + 5,45,0,0,994,995,5,116,0,0,995,996,5,114,0,0,996,997,5,97,0,0,997, + 998,5,118,0,0,998,999,5,101,0,0,999,1000,5,114,0,0,1000,1001,5,115, + 0,0,1001,1002,5,97,0,0,1002,1003,5,108,0,0,1003,170,1,0,0,0,1004, + 1005,5,105,0,0,1005,1006,5,100,0,0,1006,172,1,0,0,0,1007,1008,5, + 100,0,0,1008,1009,5,111,0,0,1009,1010,5,99,0,0,1010,174,1,0,0,0, + 1011,1012,5,109,0,0,1012,1013,5,111,0,0,1013,1014,5,100,0,0,1014, + 1015,5,101,0,0,1015,176,1,0,0,0,1016,1017,5,101,0,0,1017,1018,5, + 109,0,0,1018,1019,5,105,0,0,1019,1020,5,116,0,0,1020,1021,5,115, + 0,0,1021,178,1,0,0,0,1022,1023,5,114,0,0,1023,1024,5,101,0,0,1024, + 1025,5,99,0,0,1025,1026,5,101,0,0,1026,1027,5,105,0,0,1027,1028, + 5,118,0,0,1028,1029,5,101,0,0,1029,1030,5,114,0,0,1030,180,1,0,0, + 0,1031,1032,5,114,0,0,1032,1033,5,101,0,0,1033,1034,5,113,0,0,1034, + 1035,5,117,0,0,1035,1036,5,105,0,0,1036,1037,5,114,0,0,1037,1038, + 5,101,0,0,1038,1039,5,115,0,0,1039,182,1,0,0,0,1040,1041,5,97,0, + 0,1041,1042,5,110,0,0,1042,1043,5,121,0,0,1043,184,1,0,0,0,1044, + 1045,5,103,0,0,1045,1046,5,101,0,0,1046,1047,5,116,0,0,1047,186, + 1,0,0,0,1048,1049,5,115,0,0,1049,1050,5,101,0,0,1050,1051,5,116, + 0,0,1051,188,1,0,0,0,1052,1053,5,119,0,0,1053,1054,5,97,0,0,1054, + 1055,5,116,0,0,1055,1056,5,99,0,0,1056,1057,5,104,0,0,1057,190,1, + 0,0,0,1058,1059,5,115,0,0,1059,1060,5,116,0,0,1060,1061,5,97,0,0, + 1061,1062,5,114,0,0,1062,1063,5,116,0,0,1063,192,1,0,0,0,1064,1065, + 5,115,0,0,1065,1066,5,116,0,0,1066,1067,5,111,0,0,1067,1068,5,112, + 0,0,1068,194,1,0,0,0,1069,1070,5,114,0,0,1070,1071,5,101,0,0,1071, + 1072,5,97,0,0,1072,1073,5,100,0,0,1073,196,1,0,0,0,1074,1075,5,119, + 0,0,1075,1076,5,114,0,0,1076,1077,5,105,0,0,1077,1078,5,116,0,0, + 1078,1079,5,101,0,0,1079,198,1,0,0,0,1080,1081,5,114,0,0,1081,1082, + 5,101,0,0,1082,1083,5,115,0,0,1083,1084,5,111,0,0,1084,1085,5,108, + 0,0,1085,1086,5,118,0,0,1086,1087,5,101,0,0,1087,200,1,0,0,0,1088, + 1089,5,99,0,0,1089,1090,5,111,0,0,1090,1091,5,110,0,0,1091,1092, + 5,110,0,0,1092,1093,5,101,0,0,1093,1094,5,99,0,0,1094,1095,5,116, + 0,0,1095,202,1,0,0,0,1096,1097,5,100,0,0,1097,1098,5,105,0,0,1098, + 1099,5,115,0,0,1099,1100,5,99,0,0,1100,1101,5,111,0,0,1101,1102, + 5,110,0,0,1102,1103,5,110,0,0,1103,1104,5,101,0,0,1104,1105,5,99, + 0,0,1105,1106,5,116,0,0,1106,204,1,0,0,0,1107,1108,5,99,0,0,1108, + 1109,5,97,0,0,1109,1110,5,108,0,0,1110,1111,5,108,0,0,1111,206,1, + 0,0,0,1112,1113,5,119,0,0,1113,1114,5,97,0,0,1114,1115,5,116,0,0, + 1115,1116,5,99,0,0,1116,1117,5,104,0,0,1117,1118,5,45,0,0,1118,1119, + 5,115,0,0,1119,1120,5,116,0,0,1120,1121,5,97,0,0,1121,1122,5,114, + 0,0,1122,1123,5,116,0,0,1123,208,1,0,0,0,1124,1125,5,119,0,0,1125, + 1126,5,97,0,0,1126,1127,5,116,0,0,1127,1128,5,99,0,0,1128,1129,5, + 104,0,0,1129,1130,5,45,0,0,1130,1131,5,115,0,0,1131,1132,5,116,0, + 0,1132,1133,5,111,0,0,1133,1134,5,112,0,0,1134,210,1,0,0,0,1135, + 1136,5,115,0,0,1136,1137,5,117,0,0,1137,1138,5,98,0,0,1138,1139, + 5,115,0,0,1139,1140,5,99,0,0,1140,1141,5,114,0,0,1141,1142,5,105, + 0,0,1142,1143,5,98,0,0,1143,1144,5,101,0,0,1144,212,1,0,0,0,1145, + 1146,5,117,0,0,1146,1147,5,110,0,0,1147,1148,5,115,0,0,1148,1149, + 5,117,0,0,1149,1150,5,98,0,0,1150,1151,5,115,0,0,1151,1152,5,99, + 0,0,1152,1153,5,114,0,0,1153,1154,5,105,0,0,1154,1155,5,98,0,0,1155, + 1156,5,101,0,0,1156,214,1,0,0,0,1157,1158,5,114,0,0,1158,1159,5, + 101,0,0,1159,1160,5,103,0,0,1160,1161,5,105,0,0,1161,1162,5,115, + 0,0,1162,1163,5,116,0,0,1163,1164,5,101,0,0,1164,1165,5,114,0,0, + 1165,216,1,0,0,0,1166,1167,5,99,0,0,1167,1168,5,114,0,0,1168,1169, + 5,100,0,0,1169,1170,5,116,0,0,1170,218,1,0,0,0,1171,1172,5,111,0, + 0,1172,1173,5,112,0,0,1173,1174,5,116,0,0,1174,1175,5,105,0,0,1175, + 1176,5,111,0,0,1176,1177,5,110,0,0,1177,1178,5,97,0,0,1178,1179, + 5,108,0,0,1179,1180,5,45,0,0,1180,1181,5,111,0,0,1181,1182,5,110, + 0,0,1182,1183,5,101,0,0,1183,220,1,0,0,0,1184,1185,5,101,0,0,1185, + 1186,5,120,0,0,1186,1187,5,97,0,0,1187,1188,5,99,0,0,1188,1189,5, + 116,0,0,1189,1190,5,108,0,0,1190,1191,5,121,0,0,1191,1192,5,45,0, + 0,1192,1193,5,111,0,0,1193,1194,5,110,0,0,1194,1195,5,101,0,0,1195, + 222,1,0,0,0,1196,1197,5,109,0,0,1197,1198,5,97,0,0,1198,1199,5,110, + 0,0,1199,1200,5,121,0,0,1200,1201,5,45,0,0,1201,1202,5,117,0,0,1202, + 1203,5,110,0,0,1203,1204,5,105,0,0,1204,1205,5,113,0,0,1205,1206, + 5,117,0,0,1206,1207,5,101,0,0,1207,224,1,0,0,0,1208,1209,5,109,0, + 0,1209,1210,5,97,0,0,1210,1211,5,110,0,0,1211,1212,5,121,0,0,1212, + 226,1,0,0,0,1213,1214,5,111,0,0,1214,1215,5,114,0,0,1215,1216,5, + 100,0,0,1216,1217,5,101,0,0,1217,1218,5,114,0,0,1218,1219,5,101, + 0,0,1219,1220,5,100,0,0,1220,228,1,0,0,0,1221,1222,5,117,0,0,1222, + 1223,5,110,0,0,1223,1224,5,105,0,0,1224,1225,5,116,0,0,1225,230, + 1,0,0,0,1226,1227,5,119,0,0,1227,1228,5,97,0,0,1228,1229,5,116,0, + 0,1229,1230,5,99,0,0,1230,1231,5,104,0,0,1231,1232,5,45,0,0,1232, + 1233,5,104,0,0,1233,1234,5,97,0,0,1234,1235,5,110,0,0,1235,1236, + 5,100,0,0,1236,1237,5,108,0,0,1237,1238,5,101,0,0,1238,232,1,0,0, + 0,1239,1240,5,109,0,0,1240,1241,5,101,0,0,1241,1242,5,115,0,0,1242, + 1243,5,115,0,0,1243,1244,5,97,0,0,1244,1245,5,103,0,0,1245,1246, + 5,101,0,0,1246,234,1,0,0,0,1247,1248,5,97,0,0,1248,1249,5,116,0, + 0,1249,1250,5,111,0,0,1250,1251,5,109,0,0,1251,1252,5,45,0,0,1252, + 1253,5,114,0,0,1253,1254,5,101,0,0,1254,1255,5,102,0,0,1255,236, + 1,0,0,0,1256,1257,5,105,0,0,1257,1258,5,110,0,0,1258,1259,5,116, + 0,0,1259,1260,5,101,0,0,1260,1261,5,114,0,0,1261,1262,5,102,0,0, + 1262,1263,5,97,0,0,1263,1264,5,99,0,0,1264,1265,5,101,0,0,1265,1266, + 5,45,0,0,1266,1267,5,114,0,0,1267,1268,5,101,0,0,1268,1269,5,102, + 0,0,1269,238,1,0,0,0,1270,1271,5,111,0,0,1271,1272,5,112,0,0,1272, + 1273,5,116,0,0,1273,1274,5,105,0,0,1274,1275,5,111,0,0,1275,1276, + 5,110,0,0,1276,1277,5,97,0,0,1277,1278,5,108,0,0,1278,240,1,0,0, + 0,1279,1280,5,108,0,0,1280,1281,5,105,0,0,1281,1282,5,115,0,0,1282, + 1283,5,116,0,0,1283,242,1,0,0,0,1284,1285,5,114,0,0,1285,1286,5, + 101,0,0,1286,1287,5,99,0,0,1287,1288,5,111,0,0,1288,1289,5,114,0, + 0,1289,1290,5,100,0,0,1290,244,1,0,0,0,1291,1292,5,98,0,0,1292,1293, + 5,111,0,0,1293,1294,5,111,0,0,1294,1295,5,108,0,0,1295,246,1,0,0, + 0,1296,1297,5,98,0,0,1297,1298,5,121,0,0,1298,1299,5,116,0,0,1299, + 1300,5,101,0,0,1300,1301,5,115,0,0,1301,248,1,0,0,0,1302,1303,5, + 100,0,0,1303,1304,5,111,0,0,1304,1305,5,117,0,0,1305,1306,5,98,0, + 0,1306,1307,5,108,0,0,1307,1308,5,101,0,0,1308,250,1,0,0,0,1309, + 1310,5,105,0,0,1310,1311,5,110,0,0,1311,1312,5,116,0,0,1312,1313, + 5,51,0,0,1313,1314,5,50,0,0,1314,252,1,0,0,0,1315,1316,5,105,0,0, + 1316,1317,5,110,0,0,1317,1318,5,116,0,0,1318,1319,5,54,0,0,1319, + 1320,5,52,0,0,1320,254,1,0,0,0,1321,1322,5,115,0,0,1322,1323,5,116, + 0,0,1323,1324,5,114,0,0,1324,1325,5,105,0,0,1325,1326,5,110,0,0, + 1326,1327,5,103,0,0,1327,256,1,0,0,0,1328,1329,5,117,0,0,1329,1330, + 5,105,0,0,1330,1331,5,110,0,0,1331,1332,5,116,0,0,1332,1333,5,51, + 0,0,1333,1334,5,50,0,0,1334,258,1,0,0,0,1335,1336,5,117,0,0,1336, + 1337,5,105,0,0,1337,1338,5,110,0,0,1338,1339,5,116,0,0,1339,1340, + 5,54,0,0,1340,1341,5,52,0,0,1341,260,1,0,0,0,1342,1343,5,116,0,0, + 1343,1344,5,114,0,0,1344,1345,5,117,0,0,1345,1346,5,101,0,0,1346, + 262,1,0,0,0,1347,1348,5,102,0,0,1348,1349,5,97,0,0,1349,1350,5,108, + 0,0,1350,1351,5,115,0,0,1351,1352,5,101,0,0,1352,264,1,0,0,0,1353, + 1354,5,110,0,0,1354,1355,5,117,0,0,1355,1356,5,108,0,0,1356,1357, + 5,108,0,0,1357,266,1,0,0,0,1358,1359,5,45,0,0,1359,1360,5,62,0,0, + 1360,268,1,0,0,0,1361,1362,5,58,0,0,1362,270,1,0,0,0,1363,1364,5, + 59,0,0,1364,272,1,0,0,0,1365,1366,5,44,0,0,1366,274,1,0,0,0,1367, + 1368,5,46,0,0,1368,276,1,0,0,0,1369,1370,5,123,0,0,1370,278,1,0, + 0,0,1371,1372,5,125,0,0,1372,280,1,0,0,0,1373,1374,5,91,0,0,1374, + 282,1,0,0,0,1375,1376,5,93,0,0,1376,284,1,0,0,0,1377,1378,5,40,0, + 0,1378,286,1,0,0,0,1379,1380,5,41,0,0,1380,288,1,0,0,0,1381,1382, + 5,60,0,0,1382,290,1,0,0,0,1383,1384,5,62,0,0,1384,292,1,0,0,0,1385, + 1386,5,38,0,0,1386,294,1,0,0,0,1387,1388,5,61,0,0,1388,296,1,0,0, + 0,1389,1391,5,45,0,0,1390,1389,1,0,0,0,1390,1391,1,0,0,0,1391,1393, + 1,0,0,0,1392,1394,7,0,0,0,1393,1392,1,0,0,0,1394,1395,1,0,0,0,1395, + 1393,1,0,0,0,1395,1396,1,0,0,0,1396,298,1,0,0,0,1397,1399,5,45,0, + 0,1398,1397,1,0,0,0,1398,1399,1,0,0,0,1399,1408,1,0,0,0,1400,1409, + 5,48,0,0,1401,1405,7,1,0,0,1402,1404,7,0,0,0,1403,1402,1,0,0,0,1404, + 1407,1,0,0,0,1405,1403,1,0,0,0,1405,1406,1,0,0,0,1406,1409,1,0,0, + 0,1407,1405,1,0,0,0,1408,1400,1,0,0,0,1408,1401,1,0,0,0,1409,1416, + 1,0,0,0,1410,1412,5,46,0,0,1411,1413,7,0,0,0,1412,1411,1,0,0,0,1413, + 1414,1,0,0,0,1414,1412,1,0,0,0,1414,1415,1,0,0,0,1415,1417,1,0,0, + 0,1416,1410,1,0,0,0,1416,1417,1,0,0,0,1417,1427,1,0,0,0,1418,1420, + 7,2,0,0,1419,1421,7,3,0,0,1420,1419,1,0,0,0,1420,1421,1,0,0,0,1421, + 1423,1,0,0,0,1422,1424,7,0,0,0,1423,1422,1,0,0,0,1424,1425,1,0,0, + 0,1425,1423,1,0,0,0,1425,1426,1,0,0,0,1426,1428,1,0,0,0,1427,1418, + 1,0,0,0,1427,1428,1,0,0,0,1428,300,1,0,0,0,1429,1433,7,4,0,0,1430, + 1432,7,5,0,0,1431,1430,1,0,0,0,1432,1435,1,0,0,0,1433,1431,1,0,0, + 0,1433,1434,1,0,0,0,1434,302,1,0,0,0,1435,1433,1,0,0,0,1436,1441, + 5,34,0,0,1437,1440,3,305,152,0,1438,1440,8,6,0,0,1439,1437,1,0,0, + 0,1439,1438,1,0,0,0,1440,1443,1,0,0,0,1441,1439,1,0,0,0,1441,1442, + 1,0,0,0,1442,1444,1,0,0,0,1443,1441,1,0,0,0,1444,1445,5,34,0,0,1445, + 304,1,0,0,0,1446,1454,5,92,0,0,1447,1455,7,7,0,0,1448,1449,5,117, + 0,0,1449,1450,3,307,153,0,1450,1451,3,307,153,0,1451,1452,3,307, + 153,0,1452,1453,3,307,153,0,1453,1455,1,0,0,0,1454,1447,1,0,0,0, + 1454,1448,1,0,0,0,1455,306,1,0,0,0,1456,1457,7,8,0,0,1457,308,1, + 0,0,0,1458,1459,5,47,0,0,1459,1460,5,47,0,0,1460,1464,1,0,0,0,1461, + 1463,8,9,0,0,1462,1461,1,0,0,0,1463,1466,1,0,0,0,1464,1462,1,0,0, + 0,1464,1465,1,0,0,0,1465,1467,1,0,0,0,1466,1464,1,0,0,0,1467,1468, + 6,154,0,0,1468,310,1,0,0,0,1469,1470,5,47,0,0,1470,1471,5,42,0,0, + 1471,1475,1,0,0,0,1472,1474,9,0,0,0,1473,1472,1,0,0,0,1474,1477, + 1,0,0,0,1475,1476,1,0,0,0,1475,1473,1,0,0,0,1476,1478,1,0,0,0,1477, + 1475,1,0,0,0,1478,1479,5,42,0,0,1479,1480,5,47,0,0,1480,1481,1,0, + 0,0,1481,1482,6,155,0,0,1482,312,1,0,0,0,1483,1485,7,10,0,0,1484, + 1483,1,0,0,0,1485,1486,1,0,0,0,1486,1484,1,0,0,0,1486,1487,1,0,0, + 0,1487,1488,1,0,0,0,1488,1489,6,156,0,0,1489,314,1,0,0,0,18,0,1390, + 1395,1398,1405,1408,1414,1416,1420,1425,1427,1433,1439,1441,1454, + 1464,1475,1486,1,0,1,0 ]; private static __ATN: antlr.ATN; diff --git a/src/capability-language/generated/QuixosCapabilityParser.ts b/src/capability-language/generated/QuixosCapabilityParser.ts index e956b15..1a152ea 100644 --- a/src/capability-language/generated/QuixosCapabilityParser.ts +++ b/src/capability-language/generated/QuixosCapabilityParser.ts @@ -17,152 +17,154 @@ export class QuixosCapabilityParser extends antlr.Parser { public static readonly SUBJECT = 5; public static readonly FOR = 6; public static readonly CREATION = 7; - public static readonly INITIALIZE = 8; - public static readonly WORKSPACE = 9; - public static readonly EXECUTION = 10; - public static readonly SNAPSHOT = 11; - public static readonly TRANSACTION = 12; - public static readonly REMOTE = 13; - public static readonly TARGETS = 14; - public static readonly PORTABLE = 15; - public static readonly REPLICA = 16; - public static readonly LOCAL = 17; - public static readonly FROM = 18; - public static readonly RESULT_BYTES = 19; - public static readonly RPC_CALLS = 20; - public static readonly DEADLINE_MS = 21; - public static readonly QUERY = 22; - public static readonly REFLECTION = 23; - public static readonly SPECIALIZE = 24; - public static readonly ROOT = 25; - public static readonly DOCUMENT = 26; - public static readonly FRAGMENTS = 27; - public static readonly VIEW = 28; - public static readonly MAX = 29; - public static readonly ALLOW = 30; - public static readonly POLL = 31; - public static readonly QUERYABLE = 32; - public static readonly RPC = 33; - public static readonly QUERY_REASON = 34; - public static readonly TYPE = 35; - public static readonly OBJECT = 36; - public static readonly STORABLE = 37; - public static readonly IMPLEMENTS = 38; - public static readonly REF = 39; - public static readonly FRAGMENT = 40; - public static readonly IMPORT = 41; - public static readonly EXTERNAL = 42; - public static readonly ATOM = 43; - public static readonly INTERFACE = 44; - public static readonly INTERFACES = 45; - public static readonly PACKAGE = 46; - public static readonly VALUE = 47; - public static readonly RELATION = 48; - public static readonly OPERATION = 49; - public static readonly FUNCTION = 50; - public static readonly CONSTRUCTOR = 51; - public static readonly CONSTRUCTS = 52; - public static readonly INPUT = 53; - public static readonly CONFORM = 54; - public static readonly AS = 55; - public static readonly BIND = 56; - public static readonly STATIC = 57; - public static readonly TO = 58; - public static readonly PRIVATE = 59; - public static readonly SHARED = 60; - public static readonly STATE = 61; - public static readonly EDGE = 62; - public static readonly PROJECTION = 63; - public static readonly WITH = 64; - public static readonly USING = 65; - public static readonly ACCEPT = 66; - public static readonly VIA = 67; - public static readonly MATERIALIZE = 68; - public static readonly IF = 69; - public static readonly ABSENT = 70; - public static readonly ON = 71; - public static readonly POLICY = 72; - public static readonly DEFAULT = 73; - public static readonly SOURCE = 74; - public static readonly REPOSITORY = 75; - public static readonly COMMIT = 76; - public static readonly REVISION = 77; - public static readonly SEMANTIC_MAJOR = 78; - public static readonly ON_DELETE = 79; - public static readonly LIFECYCLE = 80; - public static readonly RETAIN_OTHER = 81; - public static readonly KEYED = 82; - public static readonly PUBLIC_TRAVERSAL = 83; - public static readonly ID = 84; - public static readonly DOC = 85; - public static readonly MODE = 86; - public static readonly EMITS = 87; - public static readonly RECEIVER = 88; - public static readonly REQUIRES = 89; - public static readonly ANY = 90; - public static readonly GET = 91; - public static readonly SET = 92; - public static readonly WATCH = 93; - public static readonly START = 94; - public static readonly STOP = 95; - public static readonly READ = 96; - public static readonly WRITE = 97; - public static readonly RESOLVE = 98; - public static readonly CONNECT = 99; - public static readonly DISCONNECT = 100; - public static readonly CALL = 101; - public static readonly WATCH_START = 102; - public static readonly WATCH_STOP = 103; - public static readonly SUBSCRIBE = 104; - public static readonly UNSUBSCRIBE = 105; - public static readonly REGISTER = 106; - public static readonly CRDT = 107; - public static readonly OPTIONAL_ONE = 108; - public static readonly EXACTLY_ONE = 109; - public static readonly MANY_UNIQUE = 110; - public static readonly MANY = 111; - public static readonly ORDERED = 112; - public static readonly UNIT = 113; - public static readonly WATCH_HANDLE = 114; - public static readonly MESSAGE = 115; - public static readonly ATOM_REF = 116; - public static readonly INTERFACE_REF = 117; - public static readonly OPTIONAL = 118; - public static readonly LIST = 119; - public static readonly RECORD = 120; - public static readonly BOOL = 121; - public static readonly BYTES = 122; - public static readonly DOUBLE = 123; - public static readonly INT32 = 124; - public static readonly INT64 = 125; - public static readonly STRING = 126; - public static readonly UINT32 = 127; - public static readonly UINT64 = 128; - public static readonly TRUE = 129; - public static readonly FALSE = 130; - public static readonly NULL = 131; - public static readonly ARROW = 132; - public static readonly COLON = 133; - public static readonly SEMI = 134; - public static readonly COMMA = 135; - public static readonly DOT = 136; - public static readonly LBRACE = 137; - public static readonly RBRACE = 138; - public static readonly LBRACK = 139; - public static readonly RBRACK = 140; - public static readonly LPAREN = 141; - public static readonly RPAREN = 142; - public static readonly LT = 143; - public static readonly GT = 144; - public static readonly AMP = 145; - public static readonly EQUAL = 146; - public static readonly INTEGER = 147; - public static readonly JSON_NUMBER = 148; - public static readonly IDENTIFIER = 149; - public static readonly STRING_LITERAL = 150; - public static readonly LINE_COMMENT = 151; - public static readonly BLOCK_COMMENT = 152; - public static readonly WS = 153; + public static readonly VARIANT = 8; + public static readonly PREPARES = 9; + public static readonly INITIALIZE = 10; + public static readonly WORKSPACE = 11; + public static readonly EXECUTION = 12; + public static readonly SNAPSHOT = 13; + public static readonly TRANSACTION = 14; + public static readonly REMOTE = 15; + public static readonly TARGETS = 16; + public static readonly PORTABLE = 17; + public static readonly REPLICA = 18; + public static readonly LOCAL = 19; + public static readonly FROM = 20; + public static readonly RESULT_BYTES = 21; + public static readonly RPC_CALLS = 22; + public static readonly DEADLINE_MS = 23; + public static readonly QUERY = 24; + public static readonly REFLECTION = 25; + public static readonly SPECIALIZE = 26; + public static readonly ROOT = 27; + public static readonly DOCUMENT = 28; + public static readonly FRAGMENTS = 29; + public static readonly VIEW = 30; + public static readonly MAX = 31; + public static readonly ALLOW = 32; + public static readonly POLL = 33; + public static readonly QUERYABLE = 34; + public static readonly RPC = 35; + public static readonly QUERY_REASON = 36; + public static readonly TYPE = 37; + public static readonly OBJECT = 38; + public static readonly STORABLE = 39; + public static readonly IMPLEMENTS = 40; + public static readonly REF = 41; + public static readonly FRAGMENT = 42; + public static readonly IMPORT = 43; + public static readonly EXTERNAL = 44; + public static readonly ATOM = 45; + public static readonly INTERFACE = 46; + public static readonly INTERFACES = 47; + public static readonly PACKAGE = 48; + public static readonly VALUE = 49; + public static readonly RELATION = 50; + public static readonly OPERATION = 51; + public static readonly FUNCTION = 52; + public static readonly CONSTRUCTOR = 53; + public static readonly CONSTRUCTS = 54; + public static readonly INPUT = 55; + public static readonly CONFORM = 56; + public static readonly AS = 57; + public static readonly BIND = 58; + public static readonly STATIC = 59; + public static readonly TO = 60; + public static readonly PRIVATE = 61; + public static readonly SHARED = 62; + public static readonly STATE = 63; + public static readonly EDGE = 64; + public static readonly PROJECTION = 65; + public static readonly WITH = 66; + public static readonly USING = 67; + public static readonly ACCEPT = 68; + public static readonly VIA = 69; + public static readonly MATERIALIZE = 70; + public static readonly IF = 71; + public static readonly ABSENT = 72; + public static readonly ON = 73; + public static readonly POLICY = 74; + public static readonly DEFAULT = 75; + public static readonly SOURCE = 76; + public static readonly REPOSITORY = 77; + public static readonly COMMIT = 78; + public static readonly REVISION = 79; + public static readonly SEMANTIC_MAJOR = 80; + public static readonly ON_DELETE = 81; + public static readonly LIFECYCLE = 82; + public static readonly RETAIN_OTHER = 83; + public static readonly KEYED = 84; + public static readonly PUBLIC_TRAVERSAL = 85; + public static readonly ID = 86; + public static readonly DOC = 87; + public static readonly MODE = 88; + public static readonly EMITS = 89; + public static readonly RECEIVER = 90; + public static readonly REQUIRES = 91; + public static readonly ANY = 92; + public static readonly GET = 93; + public static readonly SET = 94; + public static readonly WATCH = 95; + public static readonly START = 96; + public static readonly STOP = 97; + public static readonly READ = 98; + public static readonly WRITE = 99; + public static readonly RESOLVE = 100; + public static readonly CONNECT = 101; + public static readonly DISCONNECT = 102; + public static readonly CALL = 103; + public static readonly WATCH_START = 104; + public static readonly WATCH_STOP = 105; + public static readonly SUBSCRIBE = 106; + public static readonly UNSUBSCRIBE = 107; + public static readonly REGISTER = 108; + public static readonly CRDT = 109; + public static readonly OPTIONAL_ONE = 110; + public static readonly EXACTLY_ONE = 111; + public static readonly MANY_UNIQUE = 112; + public static readonly MANY = 113; + public static readonly ORDERED = 114; + public static readonly UNIT = 115; + public static readonly WATCH_HANDLE = 116; + public static readonly MESSAGE = 117; + public static readonly ATOM_REF = 118; + public static readonly INTERFACE_REF = 119; + public static readonly OPTIONAL = 120; + public static readonly LIST = 121; + public static readonly RECORD = 122; + public static readonly BOOL = 123; + public static readonly BYTES = 124; + public static readonly DOUBLE = 125; + public static readonly INT32 = 126; + public static readonly INT64 = 127; + public static readonly STRING = 128; + public static readonly UINT32 = 129; + public static readonly UINT64 = 130; + public static readonly TRUE = 131; + public static readonly FALSE = 132; + public static readonly NULL = 133; + public static readonly ARROW = 134; + public static readonly COLON = 135; + public static readonly SEMI = 136; + public static readonly COMMA = 137; + public static readonly DOT = 138; + public static readonly LBRACE = 139; + public static readonly RBRACE = 140; + public static readonly LBRACK = 141; + public static readonly RBRACK = 142; + public static readonly LPAREN = 143; + public static readonly RPAREN = 144; + public static readonly LT = 145; + public static readonly GT = 146; + public static readonly AMP = 147; + public static readonly EQUAL = 148; + public static readonly INTEGER = 149; + public static readonly JSON_NUMBER = 150; + public static readonly IDENTIFIER = 151; + public static readonly STRING_LITERAL = 152; + public static readonly LINE_COMMENT = 153; + public static readonly BLOCK_COMMENT = 154; + public static readonly WS = 155; public static readonly RULE_document = 0; public static readonly RULE_fragmentDecl = 1; public static readonly RULE_sourceImportDecl = 2; @@ -200,61 +202,63 @@ export class QuixosCapabilityParser extends antlr.Parser { public static readonly RULE_packageOperationExport = 34; public static readonly RULE_packageFunctionExport = 35; public static readonly RULE_acceptanceClause = 36; - public static readonly RULE_executionClause = 37; - public static readonly RULE_selectedOperations = 38; - public static readonly RULE_packageConstructorExport = 39; - public static readonly RULE_eventClause = 40; - public static readonly RULE_operationMode = 41; - public static readonly RULE_receiverRequirement = 42; - public static readonly RULE_identifierList = 43; - public static readonly RULE_dependencyBlock = 44; - public static readonly RULE_dependencyPort = 45; - public static readonly RULE_primitiveList = 46; - public static readonly RULE_primitive = 47; - public static readonly RULE_sharedAttachmentDecl = 48; - public static readonly RULE_attachmentDecl = 49; - public static readonly RULE_stateDecl = 50; - public static readonly RULE_storagePolicy = 51; - public static readonly RULE_edgeDecl = 52; - public static readonly RULE_edgeEndpoint = 53; - public static readonly RULE_conformanceDecl = 54; - public static readonly RULE_conformanceSourceArguments = 55; - public static readonly RULE_conformanceItem = 56; - public static readonly RULE_moduleBindingDecl = 57; - public static readonly RULE_initializationDecl = 58; - public static readonly RULE_initializationField = 59; - public static readonly RULE_creationOwnerMapping = 60; - public static readonly RULE_stateFieldBindingDecl = 61; - public static readonly RULE_relationshipMaterializationDecl = 62; - public static readonly RULE_operationBindingDecl = 63; - public static readonly RULE_memberOperationRef = 64; - public static readonly RULE_operationName = 65; - public static readonly RULE_operationProvider = 66; - public static readonly RULE_acceptanceBinding = 67; - public static readonly RULE_statePrimitive = 68; - public static readonly RULE_edgePrimitive = 69; - public static readonly RULE_dependencyBindingBlock = 70; - public static readonly RULE_dependencyBinding = 71; - public static readonly RULE_constructorBindingDecl = 72; - public static readonly RULE_valueType = 73; - public static readonly RULE_recordField = 74; - public static readonly RULE_scalarType = 75; - public static readonly RULE_cardinality = 76; - public static readonly RULE_jsonLiteral = 77; - public static readonly RULE_jsonObject = 78; - public static readonly RULE_jsonMember = 79; - public static readonly RULE_jsonArray = 80; - public static readonly RULE_identifier = 81; - public static readonly RULE_stringLiteral = 82; + public static readonly RULE_preparationClause = 37; + public static readonly RULE_executionClause = 38; + public static readonly RULE_selectedOperations = 39; + public static readonly RULE_packageConstructorExport = 40; + public static readonly RULE_eventClause = 41; + public static readonly RULE_operationMode = 42; + public static readonly RULE_receiverRequirement = 43; + public static readonly RULE_identifierList = 44; + public static readonly RULE_dependencyBlock = 45; + public static readonly RULE_dependencyPort = 46; + public static readonly RULE_primitiveList = 47; + public static readonly RULE_primitive = 48; + public static readonly RULE_sharedAttachmentDecl = 49; + public static readonly RULE_attachmentDecl = 50; + public static readonly RULE_stateDecl = 51; + public static readonly RULE_storagePolicy = 52; + public static readonly RULE_edgeDecl = 53; + public static readonly RULE_edgeEndpoint = 54; + public static readonly RULE_conformanceDecl = 55; + public static readonly RULE_conformanceSourceArguments = 56; + public static readonly RULE_conformanceItem = 57; + public static readonly RULE_moduleBindingDecl = 58; + public static readonly RULE_initializationDecl = 59; + public static readonly RULE_initializationField = 60; + public static readonly RULE_creationOwnerMapping = 61; + public static readonly RULE_stateFieldBindingDecl = 62; + public static readonly RULE_relationshipMaterializationDecl = 63; + public static readonly RULE_operationBindingDecl = 64; + public static readonly RULE_memberOperationRef = 65; + public static readonly RULE_operationName = 66; + public static readonly RULE_operationProvider = 67; + public static readonly RULE_acceptanceBinding = 68; + public static readonly RULE_statePrimitive = 69; + public static readonly RULE_edgePrimitive = 70; + public static readonly RULE_dependencyBindingBlock = 71; + public static readonly RULE_dependencyBinding = 72; + public static readonly RULE_constructorBindingDecl = 73; + public static readonly RULE_valueType = 74; + public static readonly RULE_recordField = 75; + public static readonly RULE_variantCase = 76; + public static readonly RULE_scalarType = 77; + public static readonly RULE_cardinality = 78; + public static readonly RULE_jsonLiteral = 79; + public static readonly RULE_jsonObject = 80; + public static readonly RULE_jsonMember = 81; + public static readonly RULE_jsonArray = 82; + public static readonly RULE_identifier = 83; + public static readonly RULE_stringLiteral = 84; public static readonly literalNames = [ null, "'edit'", "'module'", "'contract'", "'presentation'", "'subject'", - "'for'", "'creation'", "'initialize'", "'workspace'", "'execution'", - "'snapshot'", "'transaction'", "'remote'", "'targets'", "'portable'", - "'replica'", "'local'", "'from'", "'result-bytes'", "'rpc-calls'", - "'deadline-ms'", "'query'", "'reflection'", "'specialize'", "'root'", - "'document'", "'fragments'", "'view'", "'max'", "'allow'", "'poll'", - "'queryable'", "'rpc'", "'query-reason'", "'type'", "'object'", + "'for'", "'creation'", "'variant'", "'prepares'", "'initialize'", + "'workspace'", "'execution'", "'snapshot'", "'transaction'", "'remote'", + "'targets'", "'portable'", "'replica'", "'local'", "'from'", "'result-bytes'", + "'rpc-calls'", "'deadline-ms'", "'query'", "'reflection'", "'specialize'", + "'root'", "'document'", "'fragments'", "'view'", "'max'", "'allow'", + "'poll'", "'queryable'", "'rpc'", "'query-reason'", "'type'", "'object'", "'storable'", "'implements'", "'ref'", "'fragment'", "'import'", "'external'", "'atom'", "'interface'", "'interfaces'", "'package'", "'value'", "'relation'", "'operation'", "'function'", "'constructor'", @@ -278,20 +282,21 @@ export class QuixosCapabilityParser extends antlr.Parser { public static readonly symbolicNames = [ null, "EDIT", "MODULE", "CONTRACT", "PRESENTATION", "SUBJECT", "FOR", - "CREATION", "INITIALIZE", "WORKSPACE", "EXECUTION", "SNAPSHOT", - "TRANSACTION", "REMOTE", "TARGETS", "PORTABLE", "REPLICA", "LOCAL", - "FROM", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", "REFLECTION", - "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", "MAX", "ALLOW", - "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", "OBJECT", "STORABLE", - "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", - "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", - "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", - "TO", "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", - "USING", "ACCEPT", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", - "DEFAULT", "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", - "ON_DELETE", "LIFECYCLE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", - "ID", "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", - "SET", "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", + "CREATION", "VARIANT", "PREPARES", "INITIALIZE", "WORKSPACE", "EXECUTION", + "SNAPSHOT", "TRANSACTION", "REMOTE", "TARGETS", "PORTABLE", "REPLICA", + "LOCAL", "FROM", "RESULT_BYTES", "RPC_CALLS", "DEADLINE_MS", "QUERY", + "REFLECTION", "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", + "MAX", "ALLOW", "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", + "OBJECT", "STORABLE", "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", + "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", + "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", + "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", "PRIVATE", "SHARED", + "STATE", "EDGE", "PROJECTION", "WITH", "USING", "ACCEPT", "VIA", + "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", + "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", + "LIFECYCLE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", + "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", + "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", @@ -313,7 +318,7 @@ export class QuixosCapabilityParser extends antlr.Parser { "packageExport", "moduleExport", "presentationDecl", "packageQuery", "packageQuerySpecialization", "queryClause", "fragmentVariable", "packageOperationExport", "packageFunctionExport", "acceptanceClause", - "executionClause", "selectedOperations", "packageConstructorExport", + "preparationClause", "executionClause", "selectedOperations", "packageConstructorExport", "eventClause", "operationMode", "receiverRequirement", "identifierList", "dependencyBlock", "dependencyPort", "primitiveList", "primitive", "sharedAttachmentDecl", "attachmentDecl", "stateDecl", "storagePolicy", @@ -323,8 +328,8 @@ export class QuixosCapabilityParser extends antlr.Parser { "operationBindingDecl", "memberOperationRef", "operationName", "operationProvider", "acceptanceBinding", "statePrimitive", "edgePrimitive", "dependencyBindingBlock", "dependencyBinding", "constructorBindingDecl", "valueType", "recordField", - "scalarType", "cardinality", "jsonLiteral", "jsonObject", "jsonMember", - "jsonArray", "identifier", "stringLiteral", + "variantCase", "scalarType", "cardinality", "jsonLiteral", "jsonObject", + "jsonMember", "jsonArray", "identifier", "stringLiteral", ]; public get grammarFileName(): string { return "QuixosCapability.g4"; } @@ -345,42 +350,42 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new DocumentContext(this.context, this.state); this.enterRule(localContext, 0, QuixosCapabilityParser.RULE_document); try { - this.state = 178; + this.state = 182; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 0, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 166; + this.state = 170; this.workspaceDecl(); - this.state = 167; + this.state = 171; this.match(QuixosCapabilityParser.EOF); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 169; + this.state = 173; this.interfaceResourceDecl(); - this.state = 170; + this.state = 174; this.match(QuixosCapabilityParser.EOF); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 172; + this.state = 176; this.packageResourceDecl(); - this.state = 173; + this.state = 177; this.match(QuixosCapabilityParser.EOF); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 175; + this.state = 179; this.fragmentDecl(); - this.state = 176; + this.state = 180; this.match(QuixosCapabilityParser.EOF); } break; @@ -406,25 +411,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 180; + this.state = 184; this.match(QuixosCapabilityParser.FRAGMENT); - this.state = 181; - this.match(QuixosCapabilityParser.LBRACE); this.state = 185; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 189; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 4 || ((((_la - 35)) & ~0x1F) === 0 && ((1 << (_la - 35)) & 34144577) !== 0)) { + while (_la === 4 || ((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & 34144577) !== 0)) { { { - this.state = 182; + this.state = 186; this.workspaceItem(); } } - this.state = 187; + this.state = 191; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 188; + this.state = 192; this.match(QuixosCapabilityParser.RBRACE); } } @@ -447,11 +452,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 190; + this.state = 194; this.match(QuixosCapabilityParser.IMPORT); - this.state = 191; + this.state = 195; this.stringLiteral(); - this.state = 192; + this.state = 196; this.match(QuixosCapabilityParser.SEMI); } } @@ -475,39 +480,39 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 194; - this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 195; - this.identifier(); - this.state = 196; - this.match(QuixosCapabilityParser.ID); - this.state = 197; - this.stringLiteral(); this.state = 198; - this.match(QuixosCapabilityParser.REVISION); + this.match(QuixosCapabilityParser.WORKSPACE); this.state = 199; - this.stringLiteral(); + this.identifier(); this.state = 200; - this.match(QuixosCapabilityParser.COMMIT); + this.match(QuixosCapabilityParser.ID); this.state = 201; this.stringLiteral(); this.state = 202; - this.match(QuixosCapabilityParser.LBRACE); + this.match(QuixosCapabilityParser.REVISION); + this.state = 203; + this.stringLiteral(); + this.state = 204; + this.match(QuixosCapabilityParser.COMMIT); + this.state = 205; + this.stringLiteral(); this.state = 206; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 210; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 4 || ((((_la - 35)) & ~0x1F) === 0 && ((1 << (_la - 35)) & 34144577) !== 0)) { + while (_la === 4 || ((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & 34144577) !== 0)) { { { - this.state = 203; + this.state = 207; this.workspaceItem(); } } - this.state = 208; + this.state = 212; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 209; + this.state = 213; this.match(QuixosCapabilityParser.RBRACE); } } @@ -528,62 +533,62 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new WorkspaceItemContext(this.context, this.state); this.enterRule(localContext, 8, QuixosCapabilityParser.RULE_workspaceItem); try { - this.state = 219; + this.state = 223; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 3, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 211; + this.state = 215; this.sourceImportDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 212; + this.state = 216; this.atomDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 213; + this.state = 217; this.resourceImportDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 214; + this.state = 218; this.sharedAttachmentDecl(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 215; + this.state = 219; this.conformanceDecl(); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 216; + this.state = 220; this.constructorBindingDecl(); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 217; + this.state = 221; this.presentationDecl(); } break; case 8: this.enterOuterAlt(localContext, 8); { - this.state = 218; + this.state = 222; this.typeAliasDecl(); } break; @@ -606,32 +611,32 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ResourceImportDeclContext(this.context, this.state); this.enterRule(localContext, 10, QuixosCapabilityParser.RULE_resourceImportDecl); try { - this.state = 231; + this.state = 235; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 4, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 221; + this.state = 225; this.match(QuixosCapabilityParser.IMPORT); - this.state = 222; + this.state = 226; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 223; + this.state = 227; this.identifier(); - this.state = 224; + this.state = 228; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 226; + this.state = 230; this.match(QuixosCapabilityParser.IMPORT); - this.state = 227; + this.state = 231; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 228; + this.state = 232; this.identifier(); - this.state = 229; + this.state = 233; this.match(QuixosCapabilityParser.SEMI); } break; @@ -656,17 +661,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 233; - this.match(QuixosCapabilityParser.EXTERNAL); - this.state = 234; - this.match(QuixosCapabilityParser.ATOM); - this.state = 235; - this.identifier(); - this.state = 236; - this.match(QuixosCapabilityParser.ID); this.state = 237; - this.stringLiteral(); + this.match(QuixosCapabilityParser.EXTERNAL); this.state = 238; + this.match(QuixosCapabilityParser.ATOM); + this.state = 239; + this.identifier(); + this.state = 240; + this.match(QuixosCapabilityParser.ID); + this.state = 241; + this.stringLiteral(); + this.state = 242; this.match(QuixosCapabilityParser.SEMI); } } @@ -689,17 +694,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 240; - this.match(QuixosCapabilityParser.EXTERNAL); - this.state = 241; - this.match(QuixosCapabilityParser.INTERFACE); - this.state = 242; - this.identifier(); - this.state = 243; - this.match(QuixosCapabilityParser.REVISION); this.state = 244; - this.stringLiteral(); + this.match(QuixosCapabilityParser.EXTERNAL); this.state = 245; + this.match(QuixosCapabilityParser.INTERFACE); + this.state = 246; + this.identifier(); + this.state = 247; + this.match(QuixosCapabilityParser.REVISION); + this.state = 248; + this.stringLiteral(); + this.state = 249; this.match(QuixosCapabilityParser.SEMI); } } @@ -720,34 +725,34 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ResourcePreambleContext(this.context, this.state); this.enterRule(localContext, 16, QuixosCapabilityParser.RULE_resourcePreamble); try { - this.state = 251; + this.state = 255; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 5, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 247; + this.state = 251; this.resourceImportDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 248; + this.state = 252; this.externalAtomDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 249; + this.state = 253; this.externalInterfaceDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 250; + this.state = 254; this.typeAliasDecl(); } break; @@ -773,27 +778,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 253; + this.state = 257; this.match(QuixosCapabilityParser.ATOM); - this.state = 254; + this.state = 258; this.identifier(); - this.state = 255; - this.match(QuixosCapabilityParser.ID); - this.state = 256; - this.stringLiteral(); this.state = 259; + this.match(QuixosCapabilityParser.ID); + this.state = 260; + this.stringLiteral(); + this.state = 263; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 85) { + if (_la === 87) { { - this.state = 257; + this.state = 261; this.match(QuixosCapabilityParser.DOC); - this.state = 258; + this.state = 262; this.stringLiteral(); } } - this.state = 261; + this.state = 265; this.match(QuixosCapabilityParser.SEMI); } } @@ -817,87 +822,87 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 266; + this.state = 270; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 35)) & ~0x1F) === 0 && ((1 << (_la - 35)) & 193) !== 0)) { + while (((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & 193) !== 0)) { { { - this.state = 263; + this.state = 267; this.resourcePreamble(); } } - this.state = 268; + this.state = 272; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 269; + this.state = 273; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 270; + this.state = 274; this.identifier(); - this.state = 272; + this.state = 276; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 143) { + if (_la === 145) { { - this.state = 271; + this.state = 275; this.typeParameters(); } } - this.state = 274; + this.state = 278; this.match(QuixosCapabilityParser.ID); - this.state = 275; + this.state = 279; this.stringLiteral(); - this.state = 276; + this.state = 280; this.match(QuixosCapabilityParser.REVISION); - this.state = 277; + this.state = 281; this.stringLiteral(); - this.state = 287; + this.state = 291; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 89) { + if (_la === 91) { { - this.state = 278; + this.state = 282; this.match(QuixosCapabilityParser.REQUIRES); - this.state = 279; + this.state = 283; this.interfaceType(); - this.state = 284; + this.state = 288; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 135) { + while (_la === 137) { { { - this.state = 280; + this.state = 284; this.match(QuixosCapabilityParser.COMMA); - this.state = 281; + this.state = 285; this.interfaceType(); } } - this.state = 286; + this.state = 290; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 289; - this.match(QuixosCapabilityParser.LBRACE); this.state = 293; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 297; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 2 || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33783809) !== 0)) { + while (_la === 2 || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & 33783809) !== 0)) { { { - this.state = 290; + this.state = 294; this.interfaceMember(); } } - this.state = 295; + this.state = 299; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 296; + this.state = 300; this.match(QuixosCapabilityParser.RBRACE); } } @@ -921,27 +926,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 298; + this.state = 302; this.match(QuixosCapabilityParser.LT); - this.state = 299; + this.state = 303; this.typeParameter(); - this.state = 304; + this.state = 308; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 135) { + while (_la === 137) { { { - this.state = 300; + this.state = 304; this.match(QuixosCapabilityParser.COMMA); - this.state = 301; + this.state = 305; this.typeParameter(); } } - this.state = 306; + this.state = 310; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 307; + this.state = 311; this.match(QuixosCapabilityParser.GT); } } @@ -963,24 +968,24 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 24, QuixosCapabilityParser.RULE_typeParameter); let _la: number; try { - this.state = 328; + this.state = 332; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.VALUE: this.enterOuterAlt(localContext, 1); { - this.state = 309; - this.match(QuixosCapabilityParser.VALUE); - this.state = 310; - this.identifier(); this.state = 313; + this.match(QuixosCapabilityParser.VALUE); + this.state = 314; + this.identifier(); + this.state = 317; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 133) { + if (_la === 135) { { - this.state = 311; + this.state = 315; this.match(QuixosCapabilityParser.COLON); - this.state = 312; + this.state = 316; this.match(QuixosCapabilityParser.STORABLE); } } @@ -990,32 +995,32 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 2); { - this.state = 315; + this.state = 319; this.match(QuixosCapabilityParser.OBJECT); - this.state = 316; + this.state = 320; this.identifier(); - this.state = 326; + this.state = 330; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 38) { + if (_la === 40) { { - this.state = 317; + this.state = 321; this.match(QuixosCapabilityParser.IMPLEMENTS); - this.state = 318; + this.state = 322; this.interfaceType(); - this.state = 323; + this.state = 327; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 145) { + while (_la === 147) { { { - this.state = 319; + this.state = 323; this.match(QuixosCapabilityParser.AMP); - this.state = 320; + this.state = 324; this.interfaceType(); } } - this.state = 325; + this.state = 329; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } @@ -1048,14 +1053,14 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 330; + this.state = 334; this.identifier(); - this.state = 332; + this.state = 336; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 143) { + if (_la === 145) { { - this.state = 331; + this.state = 335; this.typeArguments(); } } @@ -1082,27 +1087,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 334; + this.state = 338; this.match(QuixosCapabilityParser.LT); - this.state = 335; + this.state = 339; this.typeArgument(); - this.state = 340; + this.state = 344; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 135) { + while (_la === 137) { { { - this.state = 336; + this.state = 340; this.match(QuixosCapabilityParser.COMMA); - this.state = 337; + this.state = 341; this.typeArgument(); } } - this.state = 342; + this.state = 346; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 343; + this.state = 347; this.match(QuixosCapabilityParser.GT); } } @@ -1123,33 +1128,33 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new TypeArgumentContext(this.context, this.state); this.enterRule(localContext, 30, QuixosCapabilityParser.RULE_typeArgument); try { - this.state = 352; + this.state = 356; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 1); { - this.state = 345; + this.state = 349; this.match(QuixosCapabilityParser.ATOM); - this.state = 346; + this.state = 350; this.identifier(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 2); { - this.state = 347; + this.state = 351; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 348; + this.state = 352; this.interfaceType(); } break; case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 349; + this.state = 353; this.match(QuixosCapabilityParser.OBJECT); - this.state = 350; + this.state = 354; this.identifier(); } break; @@ -1158,6 +1163,7 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.SUBJECT: case QuixosCapabilityParser.FOR: case QuixosCapabilityParser.CREATION: + case QuixosCapabilityParser.VARIANT: case QuixosCapabilityParser.INITIALIZE: case QuixosCapabilityParser.EXECUTION: case QuixosCapabilityParser.SNAPSHOT: @@ -1209,7 +1215,7 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 4); { - this.state = 351; + this.state = 355; this.valueType(); } break; @@ -1237,25 +1243,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 354; + this.state = 358; this.match(QuixosCapabilityParser.TYPE); - this.state = 355; + this.state = 359; this.identifier(); - this.state = 357; + this.state = 361; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 143) { + if (_la === 145) { { - this.state = 356; + this.state = 360; this.typeParameters(); } } - this.state = 359; + this.state = 363; this.match(QuixosCapabilityParser.EQUAL); - this.state = 360; + this.state = 364; this.valueType(); - this.state = 361; + this.state = 365; this.match(QuixosCapabilityParser.SEMI); } } @@ -1276,34 +1282,34 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new InterfaceMemberContext(this.context, this.state); this.enterRule(localContext, 34, QuixosCapabilityParser.RULE_interfaceMember); try { - this.state = 367; + this.state = 371; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 21, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 363; + this.state = 367; this.valueMember(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 364; + this.state = 368; this.relationshipMember(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 365; + this.state = 369; this.operationMember(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 366; + this.state = 370; this.moduleMember(); } break; @@ -1329,31 +1335,31 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 369; - this.match(QuixosCapabilityParser.MODULE); - this.state = 370; - this.identifier(); - this.state = 371; - this.match(QuixosCapabilityParser.ID); - this.state = 372; - this.stringLiteral(); this.state = 373; - this.match(QuixosCapabilityParser.CONTRACT); + this.match(QuixosCapabilityParser.MODULE); this.state = 374; + this.identifier(); + this.state = 375; + this.match(QuixosCapabilityParser.ID); + this.state = 376; this.stringLiteral(); this.state = 377; + this.match(QuixosCapabilityParser.CONTRACT); + this.state = 378; + this.stringLiteral(); + this.state = 381; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 5) { { - this.state = 375; + this.state = 379; this.match(QuixosCapabilityParser.SUBJECT); - this.state = 376; + this.state = 380; this.targetConstraint(); } } - this.state = 379; + this.state = 383; this.match(QuixosCapabilityParser.SEMI); } } @@ -1377,53 +1383,53 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 382; + this.state = 386; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 57) { + if (_la === 59) { { - this.state = 381; + this.state = 385; this.match(QuixosCapabilityParser.STATIC); } } - this.state = 384; - this.match(QuixosCapabilityParser.OPERATION); - this.state = 385; - this.identifier(); - this.state = 386; - this.match(QuixosCapabilityParser.ID); - this.state = 387; - this.stringLiteral(); this.state = 388; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.OPERATION); this.state = 389; - this.valueType(); + this.identifier(); this.state = 390; - this.match(QuixosCapabilityParser.ARROW); - this.state = 391; - this.valueType(); - this.state = 392; - this.match(QuixosCapabilityParser.LBRACE); - this.state = 393; - this.match(QuixosCapabilityParser.CALL); - this.state = 394; this.match(QuixosCapabilityParser.ID); - this.state = 395; + this.state = 391; this.stringLiteral(); + this.state = 392; + this.match(QuixosCapabilityParser.COLON); + this.state = 393; + this.valueType(); + this.state = 394; + this.match(QuixosCapabilityParser.ARROW); + this.state = 395; + this.valueType(); + this.state = 396; + this.match(QuixosCapabilityParser.LBRACE); this.state = 397; + this.match(QuixosCapabilityParser.CALL); + this.state = 398; + this.match(QuixosCapabilityParser.ID); + this.state = 399; + this.stringLiteral(); + this.state = 401; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 10) { + if (_la === 12) { { - this.state = 396; + this.state = 400; this.executionClause(); } } - this.state = 399; + this.state = 403; this.match(QuixosCapabilityParser.SEMI); - this.state = 400; + this.state = 404; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1447,45 +1453,45 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 403; + this.state = 407; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 32) { + if (_la === 34) { { - this.state = 402; + this.state = 406; this.queryReadContract(); } } - this.state = 405; - this.match(QuixosCapabilityParser.VALUE); - this.state = 406; - this.identifier(); - this.state = 407; - this.match(QuixosCapabilityParser.ID); - this.state = 408; - this.stringLiteral(); this.state = 409; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.VALUE); this.state = 410; - this.valueType(); + this.identifier(); this.state = 411; - this.match(QuixosCapabilityParser.LBRACE); + this.match(QuixosCapabilityParser.ID); + this.state = 412; + this.stringLiteral(); + this.state = 413; + this.match(QuixosCapabilityParser.COLON); + this.state = 414; + this.valueType(); this.state = 415; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 419; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 1 || ((((_la - 91)) & ~0x1F) === 0 && ((1 << (_la - 91)) & 7) !== 0)) { + while (_la === 1 || ((((_la - 93)) & ~0x1F) === 0 && ((1 << (_la - 93)) & 7) !== 0)) { { { - this.state = 412; + this.state = 416; this.valueMemberOperation(); } } - this.state = 417; + this.state = 421; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 418; + this.state = 422; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1507,96 +1513,96 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 42, QuixosCapabilityParser.RULE_valueMemberOperation); let _la: number; try { - this.state = 453; + this.state = 457; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.GET: this.enterOuterAlt(localContext, 1); { - this.state = 420; - this.match(QuixosCapabilityParser.GET); - this.state = 421; - this.match(QuixosCapabilityParser.ID); - this.state = 422; - this.stringLiteral(); this.state = 424; + this.match(QuixosCapabilityParser.GET); + this.state = 425; + this.match(QuixosCapabilityParser.ID); + this.state = 426; + this.stringLiteral(); + this.state = 428; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 10) { + if (_la === 12) { { - this.state = 423; + this.state = 427; this.executionClause(); } } - this.state = 426; + this.state = 430; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.SET: this.enterOuterAlt(localContext, 2); { - this.state = 428; - this.match(QuixosCapabilityParser.SET); - this.state = 429; - this.match(QuixosCapabilityParser.ID); - this.state = 430; - this.stringLiteral(); this.state = 432; + this.match(QuixosCapabilityParser.SET); + this.state = 433; + this.match(QuixosCapabilityParser.ID); + this.state = 434; + this.stringLiteral(); + this.state = 436; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 10) { + if (_la === 12) { { - this.state = 431; + this.state = 435; this.executionClause(); } } - this.state = 434; + this.state = 438; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.EDIT: this.enterOuterAlt(localContext, 3); { - this.state = 436; - this.match(QuixosCapabilityParser.EDIT); - this.state = 437; - this.match(QuixosCapabilityParser.ID); - this.state = 438; - this.stringLiteral(); this.state = 440; + this.match(QuixosCapabilityParser.EDIT); + this.state = 441; + this.match(QuixosCapabilityParser.ID); + this.state = 442; + this.stringLiteral(); + this.state = 444; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 10) { + if (_la === 12) { { - this.state = 439; + this.state = 443; this.executionClause(); } } - this.state = 442; + this.state = 446; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 4); { - this.state = 444; - this.match(QuixosCapabilityParser.WATCH); - this.state = 445; - this.match(QuixosCapabilityParser.START); - this.state = 446; - this.match(QuixosCapabilityParser.ID); - this.state = 447; - this.stringLiteral(); this.state = 448; - this.match(QuixosCapabilityParser.STOP); + this.match(QuixosCapabilityParser.WATCH); this.state = 449; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.START); this.state = 450; - this.stringLiteral(); + this.match(QuixosCapabilityParser.ID); this.state = 451; + this.stringLiteral(); + this.state = 452; + this.match(QuixosCapabilityParser.STOP); + this.state = 453; + this.match(QuixosCapabilityParser.ID); + this.state = 454; + this.stringLiteral(); + this.state = 455; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1624,69 +1630,69 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 456; + this.state = 460; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 32) { + if (_la === 34) { { - this.state = 455; + this.state = 459; this.queryReadContract(); } } - this.state = 458; - this.match(QuixosCapabilityParser.RELATION); - this.state = 459; - this.identifier(); - this.state = 460; - this.match(QuixosCapabilityParser.ID); - this.state = 461; - this.stringLiteral(); this.state = 462; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.RELATION); this.state = 463; - this.cardinality(); + this.identifier(); this.state = 464; - this.targetConstraint(); + this.match(QuixosCapabilityParser.ID); + this.state = 465; + this.stringLiteral(); this.state = 466; + this.match(QuixosCapabilityParser.COLON); + this.state = 467; + this.cardinality(); + this.state = 468; + this.targetConstraint(); + this.state = 470; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 112) { + if (_la === 114) { { - this.state = 465; + this.state = 469; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 470; + this.state = 474; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 82) { + if (_la === 84) { { - this.state = 468; + this.state = 472; this.match(QuixosCapabilityParser.KEYED); - this.state = 469; + this.state = 473; this.stringLiteral(); } } - this.state = 472; - this.match(QuixosCapabilityParser.LBRACE); this.state = 476; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 480; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 93)) & ~0x1F) === 0 && ((1 << (_la - 93)) & 225) !== 0)) { + while (((((_la - 95)) & ~0x1F) === 0 && ((1 << (_la - 95)) & 225) !== 0)) { { { - this.state = 473; + this.state = 477; this.relationshipOperation(); } } - this.state = 478; + this.state = 482; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 479; + this.state = 483; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1710,16 +1716,16 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 481; + this.state = 485; this.match(QuixosCapabilityParser.QUERYABLE); - this.state = 483; + this.state = 487; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 15 || _la === 33) { + if (_la === 17 || _la === 35) { { - this.state = 482; + this.state = 486; _la = this.tokenStream.LA(1); - if(!(_la === 15 || _la === 33)) { + if(!(_la === 17 || _la === 35)) { this.errorHandler.recoverInline(this); } else { @@ -1749,96 +1755,96 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 48, QuixosCapabilityParser.RULE_relationshipOperation); let _la: number; try { - this.state = 518; + this.state = 522; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.RESOLVE: this.enterOuterAlt(localContext, 1); { - this.state = 485; - this.match(QuixosCapabilityParser.RESOLVE); - this.state = 486; - this.match(QuixosCapabilityParser.ID); - this.state = 487; - this.stringLiteral(); this.state = 489; + this.match(QuixosCapabilityParser.RESOLVE); + this.state = 490; + this.match(QuixosCapabilityParser.ID); + this.state = 491; + this.stringLiteral(); + this.state = 493; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 10) { + if (_la === 12) { { - this.state = 488; + this.state = 492; this.executionClause(); } } - this.state = 491; + this.state = 495; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONNECT: this.enterOuterAlt(localContext, 2); { - this.state = 493; - this.match(QuixosCapabilityParser.CONNECT); - this.state = 494; - this.match(QuixosCapabilityParser.ID); - this.state = 495; - this.stringLiteral(); this.state = 497; + this.match(QuixosCapabilityParser.CONNECT); + this.state = 498; + this.match(QuixosCapabilityParser.ID); + this.state = 499; + this.stringLiteral(); + this.state = 501; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 10) { + if (_la === 12) { { - this.state = 496; + this.state = 500; this.executionClause(); } } - this.state = 499; + this.state = 503; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.DISCONNECT: this.enterOuterAlt(localContext, 3); { - this.state = 501; - this.match(QuixosCapabilityParser.DISCONNECT); - this.state = 502; - this.match(QuixosCapabilityParser.ID); - this.state = 503; - this.stringLiteral(); this.state = 505; + this.match(QuixosCapabilityParser.DISCONNECT); + this.state = 506; + this.match(QuixosCapabilityParser.ID); + this.state = 507; + this.stringLiteral(); + this.state = 509; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 10) { + if (_la === 12) { { - this.state = 504; + this.state = 508; this.executionClause(); } } - this.state = 507; + this.state = 511; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 4); { - this.state = 509; - this.match(QuixosCapabilityParser.WATCH); - this.state = 510; - this.match(QuixosCapabilityParser.START); - this.state = 511; - this.match(QuixosCapabilityParser.ID); - this.state = 512; - this.stringLiteral(); this.state = 513; - this.match(QuixosCapabilityParser.STOP); + this.match(QuixosCapabilityParser.WATCH); this.state = 514; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.START); this.state = 515; - this.stringLiteral(); + this.match(QuixosCapabilityParser.ID); this.state = 516; + this.stringLiteral(); + this.state = 517; + this.match(QuixosCapabilityParser.STOP); + this.state = 518; + this.match(QuixosCapabilityParser.ID); + this.state = 519; + this.stringLiteral(); + this.state = 520; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1864,31 +1870,31 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 50, QuixosCapabilityParser.RULE_targetConstraint); let _la: number; try { - this.state = 529; + this.state = 533; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 1); { - this.state = 520; + this.state = 524; this.match(QuixosCapabilityParser.ATOM); - this.state = 521; + this.state = 525; this.identifier(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 2); { - this.state = 522; + this.state = 526; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 523; + this.state = 527; this.identifier(); - this.state = 525; + this.state = 529; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 143) { + if (_la === 145) { { - this.state = 524; + this.state = 528; this.typeArguments(); } } @@ -1898,9 +1904,9 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 527; + this.state = 531; this.match(QuixosCapabilityParser.OBJECT); - this.state = 528; + this.state = 532; this.identifier(); } break; @@ -1928,61 +1934,61 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 534; + this.state = 538; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 35)) & ~0x1F) === 0 && ((1 << (_la - 35)) & 193) !== 0)) { + while (((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & 193) !== 0)) { { { - this.state = 531; + this.state = 535; this.resourcePreamble(); } } - this.state = 536; + this.state = 540; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 537; - this.match(QuixosCapabilityParser.PACKAGE); - this.state = 538; - this.identifier(); - this.state = 539; - this.match(QuixosCapabilityParser.ID); - this.state = 540; - this.stringLiteral(); this.state = 541; - this.match(QuixosCapabilityParser.REVISION); + this.match(QuixosCapabilityParser.PACKAGE); this.state = 542; + this.identifier(); + this.state = 543; + this.match(QuixosCapabilityParser.ID); + this.state = 544; this.stringLiteral(); this.state = 545; + this.match(QuixosCapabilityParser.REVISION); + this.state = 546; + this.stringLiteral(); + this.state = 549; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 78) { + if (_la === 80) { { - this.state = 543; + this.state = 547; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); - this.state = 544; + this.state = 548; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 547; - this.match(QuixosCapabilityParser.LBRACE); this.state = 551; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 555; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 2 || _la === 22 || ((((_la - 49)) & ~0x1F) === 0 && ((1 << (_la - 49)) & 7) !== 0)) { + while (_la === 2 || _la === 24 || ((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & 7) !== 0)) { { { - this.state = 548; + this.state = 552; this.packageExport(); } } - this.state = 553; + this.state = 557; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 554; + this.state = 558; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2003,48 +2009,48 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new PackageExportContext(this.context, this.state); this.enterRule(localContext, 54, QuixosCapabilityParser.RULE_packageExport); try { - this.state = 562; + this.state = 566; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 45, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 556; + this.state = 560; this.packageOperationExport(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 557; + this.state = 561; this.packageFunctionExport(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 558; + this.state = 562; this.packageConstructorExport(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 559; + this.state = 563; this.packageQuery(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 560; + this.state = 564; this.packageQuerySpecialization(); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 561; + this.state = 565; this.moduleExport(); } break; @@ -2069,23 +2075,23 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 564; - this.match(QuixosCapabilityParser.MODULE); - this.state = 565; - this.identifier(); - this.state = 566; - this.match(QuixosCapabilityParser.ID); - this.state = 567; - this.stringLiteral(); this.state = 568; - this.match(QuixosCapabilityParser.IMPLEMENTS); + this.match(QuixosCapabilityParser.MODULE); this.state = 569; - this.interfaceType(); - this.state = 570; - this.match(QuixosCapabilityParser.DOT); - this.state = 571; this.identifier(); + this.state = 570; + this.match(QuixosCapabilityParser.ID); + this.state = 571; + this.stringLiteral(); this.state = 572; + this.match(QuixosCapabilityParser.IMPLEMENTS); + this.state = 573; + this.interfaceType(); + this.state = 574; + this.match(QuixosCapabilityParser.DOT); + this.state = 575; + this.identifier(); + this.state = 576; this.match(QuixosCapabilityParser.SEMI); } } @@ -2108,27 +2114,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 574; - this.match(QuixosCapabilityParser.PRESENTATION); - this.state = 575; - this.identifier(); - this.state = 576; - this.match(QuixosCapabilityParser.ID); - this.state = 577; - this.stringLiteral(); this.state = 578; - this.match(QuixosCapabilityParser.FOR); + this.match(QuixosCapabilityParser.PRESENTATION); this.state = 579; - this.interfaceType(); + this.identifier(); this.state = 580; - this.match(QuixosCapabilityParser.USING); + this.match(QuixosCapabilityParser.ID); this.state = 581; - this.identifier(); + this.stringLiteral(); this.state = 582; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.FOR); this.state = 583; - this.identifier(); + this.interfaceType(); this.state = 584; + this.match(QuixosCapabilityParser.USING); + this.state = 585; + this.identifier(); + this.state = 586; + this.match(QuixosCapabilityParser.DOT); + this.state = 587; + this.identifier(); + this.state = 588; this.match(QuixosCapabilityParser.SEMI); } } @@ -2152,127 +2158,127 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 586; + this.state = 590; this.match(QuixosCapabilityParser.QUERY); - this.state = 588; + this.state = 592; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 46, this.context) ) { case 1: { - this.state = 587; + this.state = 591; this.match(QuixosCapabilityParser.FRAGMENT); } break; } - this.state = 590; + this.state = 594; this.identifier(); - this.state = 592; + this.state = 596; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 143) { + if (_la === 145) { { - this.state = 591; + this.state = 595; this.typeParameters(); } } - this.state = 594; - this.match(QuixosCapabilityParser.ID); - this.state = 595; - this.stringLiteral(); - this.state = 596; - this.match(QuixosCapabilityParser.ROOT); this.state = 598; + this.match(QuixosCapabilityParser.ID); + this.state = 599; + this.stringLiteral(); + this.state = 600; + this.match(QuixosCapabilityParser.ROOT); + this.state = 602; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 9) { + if (_la === 11) { { - this.state = 597; + this.state = 601; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 600; + this.state = 604; this.interfaceType(); - this.state = 601; + this.state = 605; this.match(QuixosCapabilityParser.DOCUMENT); - this.state = 602; + this.state = 606; this.stringLiteral(); - this.state = 631; + this.state = 635; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.OPERATION: { - this.state = 603; + this.state = 607; this.match(QuixosCapabilityParser.OPERATION); - this.state = 604; + this.state = 608; this.stringLiteral(); - this.state = 605; - this.match(QuixosCapabilityParser.LBRACE); this.state = 609; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 613; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4160946176) !== 0) || _la === 93) { + while (((((_la - 18)) & ~0x1F) === 0 && ((1 << (_la - 18)) & 63491) !== 0) || _la === 95) { { { - this.state = 606; + this.state = 610; this.queryClause(); } } - this.state = 611; + this.state = 615; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 612; + this.state = 616; this.match(QuixosCapabilityParser.RBRACE); } break; case QuixosCapabilityParser.FRAGMENT: { - this.state = 614; - this.match(QuixosCapabilityParser.FRAGMENT); - this.state = 615; - this.stringLiteral(); this.state = 618; + this.match(QuixosCapabilityParser.FRAGMENT); + this.state = 619; + this.stringLiteral(); + this.state = 622; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 49) { + if (_la === 51) { { - this.state = 616; + this.state = 620; this.match(QuixosCapabilityParser.OPERATION); - this.state = 617; + this.state = 621; this.stringLiteral(); } } - this.state = 629; + this.state = 633; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.LBRACE: { - this.state = 620; - this.match(QuixosCapabilityParser.LBRACE); this.state = 624; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 628; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4160946176) !== 0) || _la === 93) { + while (((((_la - 18)) & ~0x1F) === 0 && ((1 << (_la - 18)) & 63491) !== 0) || _la === 95) { { { - this.state = 621; + this.state = 625; this.queryClause(); } } - this.state = 626; + this.state = 630; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 627; + this.state = 631; this.match(QuixosCapabilityParser.RBRACE); } break; case QuixosCapabilityParser.SEMI: { - this.state = 628; + this.state = 632; this.match(QuixosCapabilityParser.SEMI); } break; @@ -2305,21 +2311,21 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 633; - this.match(QuixosCapabilityParser.QUERY); - this.state = 634; - this.identifier(); - this.state = 635; - this.match(QuixosCapabilityParser.ID); - this.state = 636; - this.stringLiteral(); this.state = 637; - this.match(QuixosCapabilityParser.SPECIALIZE); + this.match(QuixosCapabilityParser.QUERY); this.state = 638; this.identifier(); this.state = 639; - this.typeArguments(); + this.match(QuixosCapabilityParser.ID); this.state = 640; + this.stringLiteral(); + this.state = 641; + this.match(QuixosCapabilityParser.SPECIALIZE); + this.state = 642; + this.identifier(); + this.state = 643; + this.typeArguments(); + this.state = 644; this.match(QuixosCapabilityParser.SEMI); } } @@ -2341,161 +2347,161 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 64, QuixosCapabilityParser.RULE_queryClause); let _la: number; try { - this.state = 699; + this.state = 703; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 57, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 642; + this.state = 646; this.match(QuixosCapabilityParser.REPLICA); - this.state = 643; + this.state = 647; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 644; + this.state = 648; this.match(QuixosCapabilityParser.LOCAL); - this.state = 645; + this.state = 649; this.match(QuixosCapabilityParser.FROM); - this.state = 646; + this.state = 650; this.identifier(); - this.state = 647; + this.state = 651; this.match(QuixosCapabilityParser.SEMI); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 649; + this.state = 653; this.match(QuixosCapabilityParser.FRAGMENTS); - this.state = 650; + this.state = 654; this.stringLiteral(); - this.state = 651; + this.state = 655; this.match(QuixosCapabilityParser.SEMI); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 653; + this.state = 657; this.match(QuixosCapabilityParser.FRAGMENTS); - this.state = 654; + this.state = 658; this.identifier(); - this.state = 655; + this.state = 659; this.match(QuixosCapabilityParser.DOT); - this.state = 656; + this.state = 660; this.identifier(); - this.state = 666; + this.state = 670; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 64) { + if (_la === 66) { { - this.state = 657; + this.state = 661; this.match(QuixosCapabilityParser.WITH); - this.state = 658; - this.match(QuixosCapabilityParser.LBRACE); this.state = 662; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 666; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 76)) & ~0x1F) === 0 && ((1 << (_la - 76)) & 3145729) !== 0) || _la === 108 || _la === 151) { { { - this.state = 659; + this.state = 663; this.fragmentVariable(); } } - this.state = 664; + this.state = 668; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 665; + this.state = 669; this.match(QuixosCapabilityParser.RBRACE); } } - this.state = 668; + this.state = 672; this.match(QuixosCapabilityParser.SEMI); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 670; + this.state = 674; this.match(QuixosCapabilityParser.VIEW); - this.state = 672; + this.state = 676; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 36) { + if (_la === 38) { { - this.state = 671; + this.state = 675; this.match(QuixosCapabilityParser.OBJECT); } } - this.state = 674; + this.state = 678; this.identifier(); - this.state = 675; + this.state = 679; this.match(QuixosCapabilityParser.AS); - this.state = 676; + this.state = 680; this.interfaceType(); - this.state = 677; + this.state = 681; this.match(QuixosCapabilityParser.SEMI); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 679; + this.state = 683; this.match(QuixosCapabilityParser.MAX); - this.state = 680; + this.state = 684; this.identifier(); - this.state = 681; + this.state = 685; this.match(QuixosCapabilityParser.INTEGER); - this.state = 682; + this.state = 686; this.match(QuixosCapabilityParser.SEMI); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 684; - this.match(QuixosCapabilityParser.ALLOW); - this.state = 685; - this.interfaceType(); - this.state = 686; - this.match(QuixosCapabilityParser.DOT); - this.state = 687; - this.identifier(); this.state = 688; - this.identifier(); + this.match(QuixosCapabilityParser.ALLOW); this.state = 689; - this.stringLiteral(); + this.interfaceType(); this.state = 690; + this.match(QuixosCapabilityParser.DOT); + this.state = 691; + this.identifier(); + this.state = 692; + this.identifier(); + this.state = 693; + this.stringLiteral(); + this.state = 694; this.match(QuixosCapabilityParser.SEMI); } break; case 8: this.enterOuterAlt(localContext, 8); { - this.state = 692; + this.state = 696; this.match(QuixosCapabilityParser.WATCH); - this.state = 693; + this.state = 697; this.match(QuixosCapabilityParser.SEMI); } break; case 9: this.enterOuterAlt(localContext, 9); { - this.state = 694; + this.state = 698; this.match(QuixosCapabilityParser.POLL); - this.state = 695; + this.state = 699; this.match(QuixosCapabilityParser.INTEGER); - this.state = 696; + this.state = 700; this.stringLiteral(); - this.state = 697; + this.state = 701; this.match(QuixosCapabilityParser.SEMI); } break; @@ -2520,13 +2526,13 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 701; + this.state = 705; this.identifier(); - this.state = 702; + this.state = 706; this.match(QuixosCapabilityParser.TO); - this.state = 703; + this.state = 707; this.identifier(); - this.state = 704; + this.state = 708; this.match(QuixosCapabilityParser.SEMI); } } @@ -2550,81 +2556,91 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 706; + this.state = 710; this.match(QuixosCapabilityParser.OPERATION); - this.state = 707; + this.state = 711; this.identifier(); - this.state = 709; + this.state = 713; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 143) { + if (_la === 145) { { - this.state = 708; + this.state = 712; this.typeParameters(); } } - this.state = 711; - this.match(QuixosCapabilityParser.ID); - this.state = 712; - this.stringLiteral(); - this.state = 713; - this.match(QuixosCapabilityParser.COLON); - this.state = 714; - this.valueType(); this.state = 715; - this.match(QuixosCapabilityParser.ARROW); + this.match(QuixosCapabilityParser.ID); this.state = 716; - this.valueType(); + this.stringLiteral(); this.state = 717; - this.match(QuixosCapabilityParser.MODE); + this.match(QuixosCapabilityParser.COLON); this.state = 718; - this.operationMode(); + this.valueType(); + this.state = 719; + this.match(QuixosCapabilityParser.ARROW); this.state = 720; + this.valueType(); + this.state = 721; + this.match(QuixosCapabilityParser.MODE); + this.state = 722; + this.operationMode(); + this.state = 724; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 10) { + if (_la === 12) { { - this.state = 719; + this.state = 723; this.executionClause(); } } - this.state = 723; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 87) { - { - this.state = 722; - this.eventClause(); - } - } - - this.state = 725; - this.match(QuixosCapabilityParser.RECEIVER); - this.state = 726; - this.receiverRequirement(); - this.state = 728; + this.state = 727; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 89) { { - this.state = 727; + this.state = 726; + this.eventClause(); + } + } + + this.state = 729; + this.match(QuixosCapabilityParser.RECEIVER); + this.state = 730; + this.receiverRequirement(); + this.state = 732; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 91) { + { + this.state = 731; this.dependencyBlock(); } } - this.state = 731; + this.state = 735; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 66) { + if (_la === 9) { { - this.state = 730; + this.state = 734; + this.preparationClause(); + } + } + + this.state = 738; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 68) { + { + this.state = 737; this.acceptanceClause(); } } - this.state = 733; + this.state = 740; this.match(QuixosCapabilityParser.SEMI); } } @@ -2648,63 +2664,73 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 735; + this.state = 742; this.match(QuixosCapabilityParser.FUNCTION); - this.state = 736; + this.state = 743; this.identifier(); - this.state = 738; + this.state = 745; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 143) { + if (_la === 145) { { - this.state = 737; + this.state = 744; this.typeParameters(); } } - this.state = 740; - this.match(QuixosCapabilityParser.ID); - this.state = 741; - this.stringLiteral(); - this.state = 742; - this.match(QuixosCapabilityParser.COLON); - this.state = 743; - this.valueType(); - this.state = 744; - this.match(QuixosCapabilityParser.ARROW); - this.state = 745; - this.valueType(); this.state = 747; + this.match(QuixosCapabilityParser.ID); + this.state = 748; + this.stringLiteral(); + this.state = 749; + this.match(QuixosCapabilityParser.COLON); + this.state = 750; + this.valueType(); + this.state = 751; + this.match(QuixosCapabilityParser.ARROW); + this.state = 752; + this.valueType(); + this.state = 754; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 10) { + if (_la === 12) { { - this.state = 746; + this.state = 753; this.executionClause(); } } - this.state = 750; + this.state = 757; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 89) { + if (_la === 91) { { - this.state = 749; + this.state = 756; this.dependencyBlock(); } } - this.state = 753; + this.state = 760; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 66) { + if (_la === 9) { { - this.state = 752; + this.state = 759; + this.preparationClause(); + } + } + + this.state = 763; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 68) { + { + this.state = 762; this.acceptanceClause(); } } - this.state = 755; + this.state = 765; this.match(QuixosCapabilityParser.SEMI); } } @@ -2727,11 +2753,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 757; + this.state = 767; this.match(QuixosCapabilityParser.ACCEPT); - this.state = 758; + this.state = 768; this.match(QuixosCapabilityParser.USING); - this.state = 759; + this.state = 769; this.identifier(); } } @@ -2748,44 +2774,75 @@ export class QuixosCapabilityParser extends antlr.Parser { } return localContext; } + public preparationClause(): PreparationClauseContext { + let localContext = new PreparationClauseContext(this.context, this.state); + this.enterRule(localContext, 74, QuixosCapabilityParser.RULE_preparationClause); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 771; + this.match(QuixosCapabilityParser.PREPARES); + this.state = 772; + this.match(QuixosCapabilityParser.CREATION); + this.state = 773; + this.identifier(); + this.state = 774; + this.match(QuixosCapabilityParser.USING); + this.state = 775; + this.stringLiteral(); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } public executionClause(): ExecutionClauseContext { let localContext = new ExecutionClauseContext(this.context, this.state); - this.enterRule(localContext, 74, QuixosCapabilityParser.RULE_executionClause); + this.enterRule(localContext, 76, QuixosCapabilityParser.RULE_executionClause); let _la: number; try { - this.state = 770; + this.state = 786; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 67, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 69, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 761; + this.state = 777; this.match(QuixosCapabilityParser.EXECUTION); - this.state = 762; + this.state = 778; this.match(QuixosCapabilityParser.REMOTE); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 763; + this.state = 779; this.match(QuixosCapabilityParser.EXECUTION); - this.state = 764; + this.state = 780; _la = this.tokenStream.LA(1); - if(!(_la === 11 || _la === 12)) { + if(!(_la === 13 || _la === 14)) { this.errorHandler.recoverInline(this); } else { this.errorHandler.reportMatch(this); this.consume(); } - this.state = 765; + this.state = 781; this.match(QuixosCapabilityParser.TARGETS); - this.state = 766; + this.state = 782; this.match(QuixosCapabilityParser.LBRACK); - this.state = 767; + this.state = 783; this.identifierList(); - this.state = 768; + this.state = 784; this.match(QuixosCapabilityParser.RBRACK); } break; @@ -2806,34 +2863,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public selectedOperations(): SelectedOperationsContext { let localContext = new SelectedOperationsContext(this.context, this.state); - this.enterRule(localContext, 76, QuixosCapabilityParser.RULE_selectedOperations); + this.enterRule(localContext, 78, QuixosCapabilityParser.RULE_selectedOperations); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 772; + this.state = 788; this.match(QuixosCapabilityParser.USING); - this.state = 773; + this.state = 789; this.match(QuixosCapabilityParser.LBRACK); - this.state = 774; + this.state = 790; this.memberOperationRef(); - this.state = 779; + this.state = 795; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 135) { + while (_la === 137) { { { - this.state = 775; + this.state = 791; this.match(QuixosCapabilityParser.COMMA); - this.state = 776; + this.state = 792; this.memberOperationRef(); } } - this.state = 781; + this.state = 797; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 782; + this.state = 798; this.match(QuixosCapabilityParser.RBRACK); } } @@ -2852,38 +2909,38 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageConstructorExport(): PackageConstructorExportContext { let localContext = new PackageConstructorExportContext(this.context, this.state); - this.enterRule(localContext, 78, QuixosCapabilityParser.RULE_packageConstructorExport); + this.enterRule(localContext, 80, QuixosCapabilityParser.RULE_packageConstructorExport); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 784; + this.state = 800; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 785; + this.state = 801; this.identifier(); - this.state = 786; + this.state = 802; this.match(QuixosCapabilityParser.ID); - this.state = 787; + this.state = 803; this.stringLiteral(); - this.state = 788; + this.state = 804; this.match(QuixosCapabilityParser.CONSTRUCTS); - this.state = 789; + this.state = 805; this.identifier(); - this.state = 790; + this.state = 806; this.match(QuixosCapabilityParser.COLON); - this.state = 791; + this.state = 807; this.valueType(); - this.state = 793; + this.state = 809; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 89) { + if (_la === 91) { { - this.state = 792; + this.state = 808; this.dependencyBlock(); } } - this.state = 795; + this.state = 811; this.match(QuixosCapabilityParser.SEMI); } } @@ -2902,13 +2959,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public eventClause(): EventClauseContext { let localContext = new EventClauseContext(this.context, this.state); - this.enterRule(localContext, 80, QuixosCapabilityParser.RULE_eventClause); + this.enterRule(localContext, 82, QuixosCapabilityParser.RULE_eventClause); try { this.enterOuterAlt(localContext, 1); { - this.state = 797; + this.state = 813; this.match(QuixosCapabilityParser.EMITS); - this.state = 798; + this.state = 814; this.valueType(); } } @@ -2927,14 +2984,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationMode(): OperationModeContext { let localContext = new OperationModeContext(this.context, this.state); - this.enterRule(localContext, 82, QuixosCapabilityParser.RULE_operationMode); + this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_operationMode); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 800; + this.state = 816; _la = this.tokenStream.LA(1); - if(!(((((_la - 101)) & ~0x1F) === 0 && ((1 << (_la - 101)) & 31) !== 0))) { + if(!(((((_la - 103)) & ~0x1F) === 0 && ((1 << (_la - 103)) & 31) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2958,71 +3015,71 @@ export class QuixosCapabilityParser extends antlr.Parser { } public receiverRequirement(): ReceiverRequirementContext { let localContext = new ReceiverRequirementContext(this.context, this.state); - this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_receiverRequirement); + this.enterRule(localContext, 86, QuixosCapabilityParser.RULE_receiverRequirement); let _la: number; try { - this.state = 820; + this.state = 836; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ANY: this.enterOuterAlt(localContext, 1); { - this.state = 802; + this.state = 818; this.match(QuixosCapabilityParser.ANY); } break; case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 2); { - this.state = 803; + this.state = 819; this.match(QuixosCapabilityParser.ATOM); - this.state = 804; + this.state = 820; this.identifier(); } break; case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 805; + this.state = 821; this.match(QuixosCapabilityParser.OBJECT); - this.state = 806; + this.state = 822; this.identifier(); } break; case QuixosCapabilityParser.INTERFACES: this.enterOuterAlt(localContext, 4); { - this.state = 807; + this.state = 823; this.match(QuixosCapabilityParser.INTERFACES); - this.state = 808; + this.state = 824; this.match(QuixosCapabilityParser.LBRACK); - this.state = 817; + this.state = 833; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 76)) & ~0x1F) === 0 && ((1 << (_la - 76)) & 3145729) !== 0) || _la === 108 || _la === 151) { { - this.state = 809; + this.state = 825; this.interfaceType(); - this.state = 814; + this.state = 830; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 135) { + while (_la === 137) { { { - this.state = 810; + this.state = 826; this.match(QuixosCapabilityParser.COMMA); - this.state = 811; + this.state = 827; this.interfaceType(); } } - this.state = 816; + this.state = 832; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 819; + this.state = 835; this.match(QuixosCapabilityParser.RBRACK); } break; @@ -3045,26 +3102,26 @@ export class QuixosCapabilityParser extends antlr.Parser { } public identifierList(): IdentifierListContext { let localContext = new IdentifierListContext(this.context, this.state); - this.enterRule(localContext, 86, QuixosCapabilityParser.RULE_identifierList); + this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_identifierList); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 822; + this.state = 838; this.identifier(); - this.state = 827; + this.state = 843; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 135) { + while (_la === 137) { { { - this.state = 823; + this.state = 839; this.match(QuixosCapabilityParser.COMMA); - this.state = 824; + this.state = 840; this.identifier(); } } - this.state = 829; + this.state = 845; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } @@ -3085,30 +3142,30 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBlock(): DependencyBlockContext { let localContext = new DependencyBlockContext(this.context, this.state); - this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_dependencyBlock); + this.enterRule(localContext, 90, QuixosCapabilityParser.RULE_dependencyBlock); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 830; + this.state = 846; this.match(QuixosCapabilityParser.REQUIRES); - this.state = 831; + this.state = 847; this.match(QuixosCapabilityParser.LBRACE); - this.state = 835; + this.state = 851; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 12583040) !== 0) || ((((_la - 44)) & ~0x1F) === 0 && ((1 << (_la - 44)) & 393345) !== 0)) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 50331776) !== 0) || ((((_la - 46)) & ~0x1F) === 0 && ((1 << (_la - 46)) & 393345) !== 0)) { { { - this.state = 832; + this.state = 848; this.dependencyPort(); } } - this.state = 837; + this.state = 853; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 838; + this.state = 854; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3127,214 +3184,214 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyPort(): DependencyPortContext { let localContext = new DependencyPortContext(this.context, this.state); - this.enterRule(localContext, 90, QuixosCapabilityParser.RULE_dependencyPort); + this.enterRule(localContext, 92, QuixosCapabilityParser.RULE_dependencyPort); let _la: number; try { - this.state = 922; + this.state = 938; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REFLECTION: this.enterOuterAlt(localContext, 1); { - this.state = 840; + this.state = 856; this.match(QuixosCapabilityParser.REFLECTION); - this.state = 841; + this.state = 857; this.identifier(); - this.state = 842; + this.state = 858; this.match(QuixosCapabilityParser.ID); - this.state = 843; + this.state = 859; this.stringLiteral(); - this.state = 844; + this.state = 860; this.match(QuixosCapabilityParser.LBRACK); - this.state = 845; + this.state = 861; this.identifierList(); - this.state = 846; + this.state = 862; this.match(QuixosCapabilityParser.RBRACK); - this.state = 847; + this.state = 863; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 2); { - this.state = 849; + this.state = 865; this.match(QuixosCapabilityParser.STATE); - this.state = 850; + this.state = 866; this.identifier(); - this.state = 851; + this.state = 867; this.match(QuixosCapabilityParser.ID); - this.state = 852; + this.state = 868; this.stringLiteral(); - this.state = 853; + this.state = 869; this.match(QuixosCapabilityParser.COLON); - this.state = 854; + this.state = 870; this.valueType(); - this.state = 855; + this.state = 871; this.primitiveList(); - this.state = 856; + this.state = 872; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 3); { - this.state = 858; + this.state = 874; this.match(QuixosCapabilityParser.EDGE); - this.state = 859; + this.state = 875; this.identifier(); - this.state = 860; + this.state = 876; this.match(QuixosCapabilityParser.ID); - this.state = 861; + this.state = 877; this.stringLiteral(); - this.state = 862; + this.state = 878; this.match(QuixosCapabilityParser.COLON); - this.state = 863; + this.state = 879; this.cardinality(); - this.state = 864; + this.state = 880; this.targetConstraint(); - this.state = 867; + this.state = 883; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 82) { + if (_la === 84) { { - this.state = 865; + this.state = 881; this.match(QuixosCapabilityParser.KEYED); - this.state = 866; + this.state = 882; this.stringLiteral(); } } - this.state = 869; + this.state = 885; this.primitiveList(); - this.state = 870; + this.state = 886; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 4); { - this.state = 872; + this.state = 888; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 873; + this.state = 889; this.identifier(); - this.state = 874; + this.state = 890; this.match(QuixosCapabilityParser.ID); - this.state = 875; + this.state = 891; this.stringLiteral(); - this.state = 876; + this.state = 892; this.match(QuixosCapabilityParser.COLON); - this.state = 877; + this.state = 893; this.identifier(); - this.state = 879; + this.state = 895; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 143) { + if (_la === 145) { { - this.state = 878; + this.state = 894; this.typeArguments(); } } - this.state = 882; + this.state = 898; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 65) { + if (_la === 67) { { - this.state = 881; + this.state = 897; this.selectedOperations(); } } - this.state = 886; + this.state = 902; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 18) { + if (_la === 20) { { - this.state = 884; + this.state = 900; this.match(QuixosCapabilityParser.FROM); - this.state = 885; + this.state = 901; this.match(QuixosCapabilityParser.INPUT); } } - this.state = 888; + this.state = 904; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CREATION: this.enterOuterAlt(localContext, 5); { - this.state = 890; + this.state = 906; this.match(QuixosCapabilityParser.CREATION); - this.state = 891; + this.state = 907; this.identifier(); - this.state = 892; + this.state = 908; this.match(QuixosCapabilityParser.ID); - this.state = 893; + this.state = 909; this.stringLiteral(); - this.state = 894; + this.state = 910; this.match(QuixosCapabilityParser.COLON); - this.state = 895; + this.state = 911; this.identifier(); - this.state = 896; + this.state = 912; this.match(QuixosCapabilityParser.INPUT); - this.state = 897; + this.state = 913; this.valueType(); - this.state = 898; + this.state = 914; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONSTRUCTOR: this.enterOuterAlt(localContext, 6); { - this.state = 900; + this.state = 916; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 901; + this.state = 917; this.identifier(); - this.state = 902; + this.state = 918; this.match(QuixosCapabilityParser.ID); - this.state = 903; + this.state = 919; this.stringLiteral(); - this.state = 904; + this.state = 920; this.match(QuixosCapabilityParser.COLON); - this.state = 905; + this.state = 921; this.identifier(); - this.state = 908; + this.state = 924; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 53) { + if (_la === 55) { { - this.state = 906; + this.state = 922; this.match(QuixosCapabilityParser.INPUT); - this.state = 907; + this.state = 923; this.valueType(); } } - this.state = 910; + this.state = 926; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.QUERY: this.enterOuterAlt(localContext, 7); { - this.state = 912; + this.state = 928; this.match(QuixosCapabilityParser.QUERY); - this.state = 913; + this.state = 929; this.identifier(); - this.state = 914; + this.state = 930; this.match(QuixosCapabilityParser.ID); - this.state = 915; + this.state = 931; this.stringLiteral(); - this.state = 916; + this.state = 932; this.match(QuixosCapabilityParser.COLON); - this.state = 917; + this.state = 933; this.identifier(); - this.state = 918; + this.state = 934; this.match(QuixosCapabilityParser.DOT); - this.state = 919; + this.state = 935; this.identifier(); - this.state = 920; + this.state = 936; this.match(QuixosCapabilityParser.SEMI); } break; @@ -3357,32 +3414,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public primitiveList(): PrimitiveListContext { let localContext = new PrimitiveListContext(this.context, this.state); - this.enterRule(localContext, 92, QuixosCapabilityParser.RULE_primitiveList); + this.enterRule(localContext, 94, QuixosCapabilityParser.RULE_primitiveList); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 924; + this.state = 940; this.match(QuixosCapabilityParser.LBRACK); - this.state = 925; + this.state = 941; this.primitive(); - this.state = 930; + this.state = 946; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 135) { + while (_la === 137) { { { - this.state = 926; + this.state = 942; this.match(QuixosCapabilityParser.COMMA); - this.state = 927; + this.state = 943; this.primitive(); } } - this.state = 932; + this.state = 948; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 933; + this.state = 949; this.match(QuixosCapabilityParser.RBRACK); } } @@ -3401,14 +3458,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public primitive(): PrimitiveContext { let localContext = new PrimitiveContext(this.context, this.state); - this.enterRule(localContext, 94, QuixosCapabilityParser.RULE_primitive); + this.enterRule(localContext, 96, QuixosCapabilityParser.RULE_primitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 935; + this.state = 951; _la = this.tokenStream.LA(1); - if(!(_la === 1 || ((((_la - 96)) & ~0x1F) === 0 && ((1 << (_la - 96)) & 223) !== 0))) { + if(!(_la === 1 || ((((_la - 98)) & ~0x1F) === 0 && ((1 << (_la - 98)) & 223) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -3432,13 +3489,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public sharedAttachmentDecl(): SharedAttachmentDeclContext { let localContext = new SharedAttachmentDeclContext(this.context, this.state); - this.enterRule(localContext, 96, QuixosCapabilityParser.RULE_sharedAttachmentDecl); + this.enterRule(localContext, 98, QuixosCapabilityParser.RULE_sharedAttachmentDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 937; + this.state = 953; this.match(QuixosCapabilityParser.SHARED); - this.state = 938; + this.state = 954; this.attachmentDecl(); } } @@ -3457,22 +3514,22 @@ export class QuixosCapabilityParser extends antlr.Parser { } public attachmentDecl(): AttachmentDeclContext { let localContext = new AttachmentDeclContext(this.context, this.state); - this.enterRule(localContext, 98, QuixosCapabilityParser.RULE_attachmentDecl); + this.enterRule(localContext, 100, QuixosCapabilityParser.RULE_attachmentDecl); try { - this.state = 942; + this.state = 958; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 940; + this.state = 956; this.stateDecl(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 941; + this.state = 957; this.edgeDecl(); } break; @@ -3495,44 +3552,44 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stateDecl(): StateDeclContext { let localContext = new StateDeclContext(this.context, this.state); - this.enterRule(localContext, 100, QuixosCapabilityParser.RULE_stateDecl); + this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_stateDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 944; + this.state = 960; this.match(QuixosCapabilityParser.STATE); - this.state = 945; + this.state = 961; this.identifier(); - this.state = 946; + this.state = 962; this.match(QuixosCapabilityParser.ID); - this.state = 947; + this.state = 963; this.stringLiteral(); - this.state = 948; + this.state = 964; this.match(QuixosCapabilityParser.ON); - this.state = 949; + this.state = 965; this.identifier(); - this.state = 950; + this.state = 966; this.match(QuixosCapabilityParser.COLON); - this.state = 951; + this.state = 967; this.valueType(); - this.state = 952; + this.state = 968; this.match(QuixosCapabilityParser.POLICY); - this.state = 953; + this.state = 969; this.storagePolicy(); - this.state = 956; + this.state = 972; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 73) { + if (_la === 75) { { - this.state = 954; + this.state = 970; this.match(QuixosCapabilityParser.DEFAULT); - this.state = 955; + this.state = 971; this.jsonLiteral(); } } - this.state = 958; + this.state = 974; this.match(QuixosCapabilityParser.SEMI); } } @@ -3551,28 +3608,28 @@ export class QuixosCapabilityParser extends antlr.Parser { } public storagePolicy(): StoragePolicyContext { let localContext = new StoragePolicyContext(this.context, this.state); - this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_storagePolicy); + this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_storagePolicy); try { - this.state = 966; + this.state = 982; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REGISTER: this.enterOuterAlt(localContext, 1); { - this.state = 960; + this.state = 976; this.match(QuixosCapabilityParser.REGISTER); } break; case QuixosCapabilityParser.CRDT: this.enterOuterAlt(localContext, 2); { - this.state = 961; + this.state = 977; this.match(QuixosCapabilityParser.CRDT); - this.state = 962; + this.state = 978; this.match(QuixosCapabilityParser.LPAREN); - this.state = 963; + this.state = 979; this.valueType(); - this.state = 964; + this.state = 980; this.match(QuixosCapabilityParser.RPAREN); } break; @@ -3595,25 +3652,25 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgeDecl(): EdgeDeclContext { let localContext = new EdgeDeclContext(this.context, this.state); - this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_edgeDecl); + this.enterRule(localContext, 106, QuixosCapabilityParser.RULE_edgeDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 968; + this.state = 984; this.match(QuixosCapabilityParser.EDGE); - this.state = 969; + this.state = 985; this.identifier(); - this.state = 970; + this.state = 986; this.match(QuixosCapabilityParser.ID); - this.state = 971; + this.state = 987; this.stringLiteral(); - this.state = 972; + this.state = 988; this.match(QuixosCapabilityParser.LBRACE); - this.state = 973; + this.state = 989; this.edgeEndpoint(); - this.state = 974; + this.state = 990; this.edgeEndpoint(); - this.state = 975; + this.state = 991; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3632,78 +3689,78 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgeEndpoint(): EdgeEndpointContext { let localContext = new EdgeEndpointContext(this.context, this.state); - this.enterRule(localContext, 106, QuixosCapabilityParser.RULE_edgeEndpoint); + this.enterRule(localContext, 108, QuixosCapabilityParser.RULE_edgeEndpoint); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 977; + this.state = 993; this.targetConstraint(); - this.state = 978; + this.state = 994; this.match(QuixosCapabilityParser.PROJECTION); - this.state = 979; + this.state = 995; this.identifier(); - this.state = 980; + this.state = 996; this.match(QuixosCapabilityParser.ID); - this.state = 981; + this.state = 997; this.stringLiteral(); - this.state = 982; + this.state = 998; this.cardinality(); - this.state = 984; + this.state = 1000; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 112) { + if (_la === 114) { { - this.state = 983; + this.state = 999; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 988; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 79) { - { - this.state = 986; - this.match(QuixosCapabilityParser.ON_DELETE); - this.state = 987; - this.stringLiteral(); - } - } - - this.state = 991; + this.state = 1004; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 81) { { - this.state = 990; - this.match(QuixosCapabilityParser.RETAIN_OTHER); - } - } - - this.state = 995; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 82) { - { - this.state = 993; - this.match(QuixosCapabilityParser.KEYED); - this.state = 994; + this.state = 1002; + this.match(QuixosCapabilityParser.ON_DELETE); + this.state = 1003; this.stringLiteral(); } } - this.state = 998; + this.state = 1007; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 83) { { - this.state = 997; + this.state = 1006; + this.match(QuixosCapabilityParser.RETAIN_OTHER); + } + } + + this.state = 1011; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 84) { + { + this.state = 1009; + this.match(QuixosCapabilityParser.KEYED); + this.state = 1010; + this.stringLiteral(); + } + } + + this.state = 1014; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 85) { + { + this.state = 1013; this.match(QuixosCapabilityParser.PUBLIC_TRAVERSAL); } } - this.state = 1000; + this.state = 1016; this.match(QuixosCapabilityParser.SEMI); } } @@ -3722,90 +3779,90 @@ export class QuixosCapabilityParser extends antlr.Parser { } public conformanceDecl(): ConformanceDeclContext { let localContext = new ConformanceDeclContext(this.context, this.state); - this.enterRule(localContext, 108, QuixosCapabilityParser.RULE_conformanceDecl); + this.enterRule(localContext, 110, QuixosCapabilityParser.RULE_conformanceDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1002; + this.state = 1018; this.match(QuixosCapabilityParser.CONFORM); - this.state = 1004; + this.state = 1020; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 143) { + if (_la === 145) { { - this.state = 1003; + this.state = 1019; this.typeParameters(); } } - this.state = 1006; + this.state = 1022; this.identifier(); - this.state = 1008; + this.state = 1024; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 143) { + if (_la === 145) { { - this.state = 1007; + this.state = 1023; this.conformanceSourceArguments(); } } - this.state = 1010; + this.state = 1026; this.match(QuixosCapabilityParser.AS); - this.state = 1011; + this.state = 1027; this.identifier(); - this.state = 1013; + this.state = 1029; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 143) { + if (_la === 145) { { - this.state = 1012; + this.state = 1028; this.typeArguments(); } } - this.state = 1017; + this.state = 1033; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 84) { + if (_la === 86) { { - this.state = 1015; + this.state = 1031; this.match(QuixosCapabilityParser.ID); - this.state = 1016; + this.state = 1032; this.stringLiteral(); } } - this.state = 1021; + this.state = 1037; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 78) { + if (_la === 80) { { - this.state = 1019; + this.state = 1035; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); - this.state = 1020; + this.state = 1036; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 1023; + this.state = 1039; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1027; + this.state = 1043; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 8 || ((((_la - 56)) & ~0x1F) === 0 && ((1 << (_la - 56)) & 4105) !== 0)) { + while (_la === 10 || ((((_la - 58)) & ~0x1F) === 0 && ((1 << (_la - 58)) & 4105) !== 0)) { { { - this.state = 1024; + this.state = 1040; this.conformanceItem(); } } - this.state = 1029; + this.state = 1045; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1030; + this.state = 1046; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3824,11 +3881,11 @@ export class QuixosCapabilityParser extends antlr.Parser { } public conformanceSourceArguments(): ConformanceSourceArgumentsContext { let localContext = new ConformanceSourceArgumentsContext(this.context, this.state); - this.enterRule(localContext, 110, QuixosCapabilityParser.RULE_conformanceSourceArguments); + this.enterRule(localContext, 112, QuixosCapabilityParser.RULE_conformanceSourceArguments); try { this.enterOuterAlt(localContext, 1); { - this.state = 1032; + this.state = 1048; this.typeArguments(); } } @@ -3847,52 +3904,52 @@ export class QuixosCapabilityParser extends antlr.Parser { } public conformanceItem(): ConformanceItemContext { let localContext = new ConformanceItemContext(this.context, this.state); - this.enterRule(localContext, 112, QuixosCapabilityParser.RULE_conformanceItem); + this.enterRule(localContext, 114, QuixosCapabilityParser.RULE_conformanceItem); try { - this.state = 1041; + this.state = 1057; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 96, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 98, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1034; + this.state = 1050; this.match(QuixosCapabilityParser.PRIVATE); - this.state = 1035; + this.state = 1051; this.attachmentDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1036; + this.state = 1052; this.operationBindingDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1037; + this.state = 1053; this.stateFieldBindingDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1038; + this.state = 1054; this.initializationDecl(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1039; + this.state = 1055; this.relationshipMaterializationDecl(); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1040; + this.state = 1056; this.moduleBindingDecl(); } break; @@ -3913,23 +3970,23 @@ export class QuixosCapabilityParser extends antlr.Parser { } public moduleBindingDecl(): ModuleBindingDeclContext { let localContext = new ModuleBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 114, QuixosCapabilityParser.RULE_moduleBindingDecl); + this.enterRule(localContext, 116, QuixosCapabilityParser.RULE_moduleBindingDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 1043; + this.state = 1059; this.match(QuixosCapabilityParser.BIND); - this.state = 1044; + this.state = 1060; this.identifier(); - this.state = 1045; + this.state = 1061; this.match(QuixosCapabilityParser.TO); - this.state = 1046; + this.state = 1062; this.identifier(); - this.state = 1047; + this.state = 1063; this.match(QuixosCapabilityParser.DOT); - this.state = 1048; + this.state = 1064; this.identifier(); - this.state = 1049; + this.state = 1065; this.match(QuixosCapabilityParser.SEMI); } } @@ -3948,32 +4005,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public initializationDecl(): InitializationDeclContext { let localContext = new InitializationDeclContext(this.context, this.state); - this.enterRule(localContext, 116, QuixosCapabilityParser.RULE_initializationDecl); + this.enterRule(localContext, 118, QuixosCapabilityParser.RULE_initializationDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1051; + this.state = 1067; this.match(QuixosCapabilityParser.INITIALIZE); - this.state = 1052; + this.state = 1068; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1056; + this.state = 1072; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 76)) & ~0x1F) === 0 && ((1 << (_la - 76)) & 3145729) !== 0) || _la === 108 || _la === 151) { { { - this.state = 1053; + this.state = 1069; this.initializationField(); } } - this.state = 1058; + this.state = 1074; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1059; + this.state = 1075; this.match(QuixosCapabilityParser.RBRACE); - this.state = 1060; + this.state = 1076; this.match(QuixosCapabilityParser.SEMI); } } @@ -3992,42 +4049,42 @@ export class QuixosCapabilityParser extends antlr.Parser { } public initializationField(): InitializationFieldContext { let localContext = new InitializationFieldContext(this.context, this.state); - this.enterRule(localContext, 118, QuixosCapabilityParser.RULE_initializationField); + this.enterRule(localContext, 120, QuixosCapabilityParser.RULE_initializationField); try { - this.state = 1076; + this.state = 1092; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 98, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 100, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1062; + this.state = 1078; this.identifier(); - this.state = 1063; + this.state = 1079; this.match(QuixosCapabilityParser.TO); - this.state = 1064; + this.state = 1080; this.match(QuixosCapabilityParser.STATE); - this.state = 1065; + this.state = 1081; this.identifier(); - this.state = 1066; + this.state = 1082; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1068; + this.state = 1084; this.identifier(); - this.state = 1069; + this.state = 1085; this.match(QuixosCapabilityParser.TO); - this.state = 1070; + this.state = 1086; this.match(QuixosCapabilityParser.EDGE); - this.state = 1071; + this.state = 1087; this.identifier(); - this.state = 1072; + this.state = 1088; this.match(QuixosCapabilityParser.DOT); - this.state = 1073; + this.state = 1089; this.identifier(); - this.state = 1074; + this.state = 1090; this.match(QuixosCapabilityParser.SEMI); } break; @@ -4048,34 +4105,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public creationOwnerMapping(): CreationOwnerMappingContext { let localContext = new CreationOwnerMappingContext(this.context, this.state); - this.enterRule(localContext, 120, QuixosCapabilityParser.RULE_creationOwnerMapping); + this.enterRule(localContext, 122, QuixosCapabilityParser.RULE_creationOwnerMapping); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1078; + this.state = 1094; this.interfaceType(); - this.state = 1079; + this.state = 1095; this.match(QuixosCapabilityParser.FROM); - this.state = 1080; + this.state = 1096; this.match(QuixosCapabilityParser.INPUT); - this.state = 1085; + this.state = 1101; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 136) { + while (_la === 138) { { { - this.state = 1081; + this.state = 1097; this.match(QuixosCapabilityParser.DOT); - this.state = 1082; + this.state = 1098; this.identifier(); } } - this.state = 1087; + this.state = 1103; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1088; + this.state = 1104; this.match(QuixosCapabilityParser.SEMI); } } @@ -4094,21 +4151,21 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stateFieldBindingDecl(): StateFieldBindingDeclContext { let localContext = new StateFieldBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 122, QuixosCapabilityParser.RULE_stateFieldBindingDecl); + this.enterRule(localContext, 124, QuixosCapabilityParser.RULE_stateFieldBindingDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 1090; + this.state = 1106; this.match(QuixosCapabilityParser.BIND); - this.state = 1091; + this.state = 1107; this.identifier(); - this.state = 1092; + this.state = 1108; this.match(QuixosCapabilityParser.TO); - this.state = 1093; + this.state = 1109; this.match(QuixosCapabilityParser.STATE); - this.state = 1094; + this.state = 1110; this.identifier(); - this.state = 1095; + this.state = 1111; this.match(QuixosCapabilityParser.SEMI); } } @@ -4127,35 +4184,35 @@ export class QuixosCapabilityParser extends antlr.Parser { } public relationshipMaterializationDecl(): RelationshipMaterializationDeclContext { let localContext = new RelationshipMaterializationDeclContext(this.context, this.state); - this.enterRule(localContext, 124, QuixosCapabilityParser.RULE_relationshipMaterializationDecl); + this.enterRule(localContext, 126, QuixosCapabilityParser.RULE_relationshipMaterializationDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 1097; + this.state = 1113; this.match(QuixosCapabilityParser.MATERIALIZE); - this.state = 1098; + this.state = 1114; this.identifier(); - this.state = 1099; + this.state = 1115; this.match(QuixosCapabilityParser.IF); - this.state = 1100; + this.state = 1116; this.match(QuixosCapabilityParser.ABSENT); - this.state = 1101; + this.state = 1117; this.match(QuixosCapabilityParser.USING); - this.state = 1102; + this.state = 1118; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1103; + this.state = 1119; this.identifier(); - this.state = 1104; + this.state = 1120; this.match(QuixosCapabilityParser.VIA); - this.state = 1105; + this.state = 1121; this.match(QuixosCapabilityParser.EDGE); - this.state = 1106; + this.state = 1122; this.identifier(); - this.state = 1107; + this.state = 1123; this.match(QuixosCapabilityParser.DOT); - this.state = 1108; + this.state = 1124; this.identifier(); - this.state = 1109; + this.state = 1125; this.match(QuixosCapabilityParser.SEMI); } } @@ -4174,32 +4231,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationBindingDecl(): OperationBindingDeclContext { let localContext = new OperationBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 126, QuixosCapabilityParser.RULE_operationBindingDecl); + this.enterRule(localContext, 128, QuixosCapabilityParser.RULE_operationBindingDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1111; + this.state = 1127; this.match(QuixosCapabilityParser.BIND); - this.state = 1112; + this.state = 1128; this.memberOperationRef(); - this.state = 1113; + this.state = 1129; this.match(QuixosCapabilityParser.TO); - this.state = 1114; + this.state = 1130; this.operationProvider(); - this.state = 1117; + this.state = 1133; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 34) { + if (_la === 36) { { - this.state = 1115; + this.state = 1131; this.match(QuixosCapabilityParser.QUERY_REASON); - this.state = 1116; + this.state = 1132; this.stringLiteral(); } } - this.state = 1119; + this.state = 1135; this.match(QuixosCapabilityParser.SEMI); } } @@ -4218,15 +4275,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public memberOperationRef(): MemberOperationRefContext { let localContext = new MemberOperationRefContext(this.context, this.state); - this.enterRule(localContext, 128, QuixosCapabilityParser.RULE_memberOperationRef); + this.enterRule(localContext, 130, QuixosCapabilityParser.RULE_memberOperationRef); try { this.enterOuterAlt(localContext, 1); { - this.state = 1121; + this.state = 1137; this.identifier(); - this.state = 1122; + this.state = 1138; this.match(QuixosCapabilityParser.DOT); - this.state = 1123; + this.state = 1139; this.operationName(); } } @@ -4245,92 +4302,92 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationName(): OperationNameContext { let localContext = new OperationNameContext(this.context, this.state); - this.enterRule(localContext, 130, QuixosCapabilityParser.RULE_operationName); + this.enterRule(localContext, 132, QuixosCapabilityParser.RULE_operationName); try { - this.state = 1137; + this.state = 1153; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 101, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 103, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1125; + this.state = 1141; this.identifier(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1126; + this.state = 1142; this.match(QuixosCapabilityParser.CALL); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1127; + this.state = 1143; this.match(QuixosCapabilityParser.GET); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1128; + this.state = 1144; this.match(QuixosCapabilityParser.SET); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1129; + this.state = 1145; this.match(QuixosCapabilityParser.EDIT); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1130; + this.state = 1146; this.match(QuixosCapabilityParser.RESOLVE); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 1131; + this.state = 1147; this.match(QuixosCapabilityParser.CONNECT); } break; case 8: this.enterOuterAlt(localContext, 8); { - this.state = 1132; + this.state = 1148; this.match(QuixosCapabilityParser.DISCONNECT); } break; case 9: this.enterOuterAlt(localContext, 9); { - this.state = 1133; + this.state = 1149; this.match(QuixosCapabilityParser.WATCH_START); } break; case 10: this.enterOuterAlt(localContext, 10); { - this.state = 1134; + this.state = 1150; this.match(QuixosCapabilityParser.WATCH_STOP); } break; case 11: this.enterOuterAlt(localContext, 11); { - this.state = 1135; + this.state = 1151; this.match(QuixosCapabilityParser.SUBSCRIBE); } break; case 12: this.enterOuterAlt(localContext, 12); { - this.state = 1136; + this.state = 1152; this.match(QuixosCapabilityParser.UNSUBSCRIBE); } break; @@ -4351,113 +4408,113 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationProvider(): OperationProviderContext { let localContext = new OperationProviderContext(this.context, this.state); - this.enterRule(localContext, 132, QuixosCapabilityParser.RULE_operationProvider); + this.enterRule(localContext, 134, QuixosCapabilityParser.RULE_operationProvider); let _la: number; try { - this.state = 1175; + this.state = 1191; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.LIFECYCLE: this.enterOuterAlt(localContext, 1); { - this.state = 1139; + this.state = 1155; this.match(QuixosCapabilityParser.LIFECYCLE); - this.state = 1140; + this.state = 1156; this.match(QuixosCapabilityParser.DOT); - this.state = 1141; + this.state = 1157; this.identifier(); } break; case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 2); { - this.state = 1142; + this.state = 1158; this.match(QuixosCapabilityParser.STATE); - this.state = 1143; + this.state = 1159; this.identifier(); - this.state = 1144; + this.state = 1160; this.match(QuixosCapabilityParser.DOT); - this.state = 1145; + this.state = 1161; this.statePrimitive(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 3); { - this.state = 1147; + this.state = 1163; this.match(QuixosCapabilityParser.EDGE); - this.state = 1148; + this.state = 1164; this.identifier(); - this.state = 1149; + this.state = 1165; this.match(QuixosCapabilityParser.DOT); - this.state = 1150; + this.state = 1166; this.identifier(); - this.state = 1151; + this.state = 1167; this.match(QuixosCapabilityParser.DOT); - this.state = 1152; + this.state = 1168; this.edgePrimitive(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 4); { - this.state = 1154; + this.state = 1170; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 1155; + this.state = 1171; this.identifier(); - this.state = 1157; + this.state = 1173; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 143) { + if (_la === 145) { { - this.state = 1156; + this.state = 1172; this.typeArguments(); } } - this.state = 1159; + this.state = 1175; this.match(QuixosCapabilityParser.DOT); - this.state = 1160; + this.state = 1176; this.memberOperationRef(); } break; case QuixosCapabilityParser.PACKAGE: this.enterOuterAlt(localContext, 5); { - this.state = 1162; + this.state = 1178; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 1163; + this.state = 1179; this.identifier(); - this.state = 1164; + this.state = 1180; this.match(QuixosCapabilityParser.DOT); - this.state = 1165; + this.state = 1181; this.identifier(); - this.state = 1167; + this.state = 1183; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 143) { + if (_la === 145) { { - this.state = 1166; + this.state = 1182; this.typeArguments(); } } - this.state = 1170; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 64) { - { - this.state = 1169; - this.dependencyBindingBlock(); - } - } - - this.state = 1173; + this.state = 1186; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 66) { { - this.state = 1172; + this.state = 1185; + this.dependencyBindingBlock(); + } + } + + this.state = 1189; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 68) { + { + this.state = 1188; this.acceptanceBinding(); } } @@ -4483,13 +4540,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public acceptanceBinding(): AcceptanceBindingContext { let localContext = new AcceptanceBindingContext(this.context, this.state); - this.enterRule(localContext, 134, QuixosCapabilityParser.RULE_acceptanceBinding); + this.enterRule(localContext, 136, QuixosCapabilityParser.RULE_acceptanceBinding); try { this.enterOuterAlt(localContext, 1); { - this.state = 1177; + this.state = 1193; this.match(QuixosCapabilityParser.ACCEPT); - this.state = 1178; + this.state = 1194; this.dependencyBindingBlock(); } } @@ -4508,14 +4565,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public statePrimitive(): StatePrimitiveContext { let localContext = new StatePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 136, QuixosCapabilityParser.RULE_statePrimitive); + this.enterRule(localContext, 138, QuixosCapabilityParser.RULE_statePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1180; + this.state = 1196; _la = this.tokenStream.LA(1); - if(!(_la === 1 || ((((_la - 96)) & ~0x1F) === 0 && ((1 << (_la - 96)) & 195) !== 0))) { + if(!(_la === 1 || ((((_la - 98)) & ~0x1F) === 0 && ((1 << (_la - 98)) & 195) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4539,14 +4596,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgePrimitive(): EdgePrimitiveContext { let localContext = new EdgePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 138, QuixosCapabilityParser.RULE_edgePrimitive); + this.enterRule(localContext, 140, QuixosCapabilityParser.RULE_edgePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1182; + this.state = 1198; _la = this.tokenStream.LA(1); - if(!(((((_la - 98)) & ~0x1F) === 0 && ((1 << (_la - 98)) & 55) !== 0))) { + if(!(((((_la - 100)) & ~0x1F) === 0 && ((1 << (_la - 100)) & 55) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4570,30 +4627,30 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBindingBlock(): DependencyBindingBlockContext { let localContext = new DependencyBindingBlockContext(this.context, this.state); - this.enterRule(localContext, 140, QuixosCapabilityParser.RULE_dependencyBindingBlock); + this.enterRule(localContext, 142, QuixosCapabilityParser.RULE_dependencyBindingBlock); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1184; + this.state = 1200; this.match(QuixosCapabilityParser.WITH); - this.state = 1185; + this.state = 1201; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1189; + this.state = 1205; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 76)) & ~0x1F) === 0 && ((1 << (_la - 76)) & 3145729) !== 0) || _la === 108 || _la === 151) { { { - this.state = 1186; + this.state = 1202; this.dependencyBinding(); } } - this.state = 1191; + this.state = 1207; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1192; + this.state = 1208; this.match(QuixosCapabilityParser.RBRACE); } } @@ -4612,85 +4669,48 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBinding(): DependencyBindingContext { let localContext = new DependencyBindingContext(this.context, this.state); - this.enterRule(localContext, 142, QuixosCapabilityParser.RULE_dependencyBinding); + this.enterRule(localContext, 144, QuixosCapabilityParser.RULE_dependencyBinding); let _la: number; try { - this.state = 1292; + this.state = 1308; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 115, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 117, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1194; + this.state = 1210; this.identifier(); - this.state = 1195; + this.state = 1211; this.match(QuixosCapabilityParser.TO); - this.state = 1196; + this.state = 1212; this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 1197; + this.state = 1213; this.match(QuixosCapabilityParser.REFLECTION); - this.state = 1198; + this.state = 1214; this.match(QuixosCapabilityParser.LBRACK); - this.state = 1199; + this.state = 1215; this.identifierList(); - this.state = 1200; + this.state = 1216; this.match(QuixosCapabilityParser.RBRACK); - this.state = 1201; + this.state = 1217; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1203; - this.identifier(); - this.state = 1204; - this.match(QuixosCapabilityParser.TO); - this.state = 1205; - this.match(QuixosCapabilityParser.STATE); - this.state = 1206; - this.identifier(); - this.state = 1213; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 67) { - { - this.state = 1207; - this.match(QuixosCapabilityParser.VIA); - this.state = 1208; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1209; - this.identifier(); - this.state = 1210; - this.match(QuixosCapabilityParser.DOT); - this.state = 1211; - this.identifier(); - } - } - - this.state = 1215; - this.match(QuixosCapabilityParser.SEMI); - } - break; - case 3: - this.enterOuterAlt(localContext, 3); - { - this.state = 1217; - this.identifier(); - this.state = 1218; - this.match(QuixosCapabilityParser.TO); this.state = 1219; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1220; this.identifier(); + this.state = 1220; + this.match(QuixosCapabilityParser.TO); this.state = 1221; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.STATE); this.state = 1222; this.identifier(); this.state = 1229; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 67) { + if (_la === 69) { { this.state = 1223; this.match(QuixosCapabilityParser.VIA); @@ -4709,42 +4729,79 @@ export class QuixosCapabilityParser extends antlr.Parser { this.match(QuixosCapabilityParser.SEMI); } break; - case 4: - this.enterOuterAlt(localContext, 4); + case 3: + this.enterOuterAlt(localContext, 3); { this.state = 1233; this.identifier(); this.state = 1234; this.match(QuixosCapabilityParser.TO); this.state = 1235; - this.match(QuixosCapabilityParser.INTERFACE); + this.match(QuixosCapabilityParser.EDGE); this.state = 1236; this.identifier(); + this.state = 1237; + this.match(QuixosCapabilityParser.DOT); this.state = 1238; + this.identifier(); + this.state = 1245; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 143) { + if (_la === 69) { { - this.state = 1237; + this.state = 1239; + this.match(QuixosCapabilityParser.VIA); + this.state = 1240; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1241; + this.identifier(); + this.state = 1242; + this.match(QuixosCapabilityParser.DOT); + this.state = 1243; + this.identifier(); + } + } + + this.state = 1247; + this.match(QuixosCapabilityParser.SEMI); + } + break; + case 4: + this.enterOuterAlt(localContext, 4); + { + this.state = 1249; + this.identifier(); + this.state = 1250; + this.match(QuixosCapabilityParser.TO); + this.state = 1251; + this.match(QuixosCapabilityParser.INTERFACE); + this.state = 1252; + this.identifier(); + this.state = 1254; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 145) { + { + this.state = 1253; this.typeArguments(); } } - this.state = 1248; + this.state = 1264; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.VIA: { { - this.state = 1240; + this.state = 1256; this.match(QuixosCapabilityParser.VIA); - this.state = 1241; + this.state = 1257; this.match(QuixosCapabilityParser.EDGE); - this.state = 1242; + this.state = 1258; this.identifier(); - this.state = 1243; + this.state = 1259; this.match(QuixosCapabilityParser.DOT); - this.state = 1244; + this.state = 1260; this.identifier(); } } @@ -4752,9 +4809,9 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.FROM: { { - this.state = 1246; + this.state = 1262; this.match(QuixosCapabilityParser.FROM); - this.state = 1247; + this.state = 1263; this.match(QuixosCapabilityParser.INPUT); } } @@ -4764,104 +4821,104 @@ export class QuixosCapabilityParser extends antlr.Parser { default: break; } - this.state = 1250; + this.state = 1266; this.match(QuixosCapabilityParser.SEMI); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1252; + this.state = 1268; this.identifier(); - this.state = 1253; + this.state = 1269; this.match(QuixosCapabilityParser.TO); - this.state = 1254; + this.state = 1270; this.match(QuixosCapabilityParser.CREATION); - this.state = 1255; + this.state = 1271; this.identifier(); - this.state = 1256; + this.state = 1272; this.match(QuixosCapabilityParser.WITH); - this.state = 1257; + this.state = 1273; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1261; + this.state = 1277; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 76)) & ~0x1F) === 0 && ((1 << (_la - 76)) & 3145729) !== 0) || _la === 108 || _la === 151) { { { - this.state = 1258; + this.state = 1274; this.creationOwnerMapping(); } } - this.state = 1263; + this.state = 1279; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1264; + this.state = 1280; this.match(QuixosCapabilityParser.RBRACE); - this.state = 1265; + this.state = 1281; this.match(QuixosCapabilityParser.SEMI); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1267; + this.state = 1283; this.identifier(); - this.state = 1268; + this.state = 1284; this.match(QuixosCapabilityParser.TO); - this.state = 1269; + this.state = 1285; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1270; + this.state = 1286; this.identifier(); - this.state = 1271; + this.state = 1287; this.match(QuixosCapabilityParser.SEMI); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 1273; + this.state = 1289; this.identifier(); - this.state = 1274; + this.state = 1290; this.match(QuixosCapabilityParser.TO); - this.state = 1276; + this.state = 1292; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 9) { + if (_la === 11) { { - this.state = 1275; + this.state = 1291; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 1278; + this.state = 1294; this.match(QuixosCapabilityParser.QUERY); - this.state = 1279; + this.state = 1295; this.identifier(); - this.state = 1280; + this.state = 1296; this.match(QuixosCapabilityParser.DOT); - this.state = 1281; + this.state = 1297; this.identifier(); - this.state = 1288; + this.state = 1304; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 67) { + if (_la === 69) { { - this.state = 1282; + this.state = 1298; this.match(QuixosCapabilityParser.VIA); - this.state = 1283; + this.state = 1299; this.match(QuixosCapabilityParser.EDGE); - this.state = 1284; + this.state = 1300; this.identifier(); - this.state = 1285; + this.state = 1301; this.match(QuixosCapabilityParser.DOT); - this.state = 1286; + this.state = 1302; this.identifier(); } } - this.state = 1290; + this.state = 1306; this.match(QuixosCapabilityParser.SEMI); } break; @@ -4882,34 +4939,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public constructorBindingDecl(): ConstructorBindingDeclContext { let localContext = new ConstructorBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 144, QuixosCapabilityParser.RULE_constructorBindingDecl); + this.enterRule(localContext, 146, QuixosCapabilityParser.RULE_constructorBindingDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1294; + this.state = 1310; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1295; + this.state = 1311; this.identifier(); - this.state = 1296; + this.state = 1312; this.match(QuixosCapabilityParser.TO); - this.state = 1297; + this.state = 1313; this.identifier(); - this.state = 1298; + this.state = 1314; this.match(QuixosCapabilityParser.DOT); - this.state = 1299; + this.state = 1315; this.identifier(); - this.state = 1301; + this.state = 1317; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 64) { + if (_la === 66) { { - this.state = 1300; + this.state = 1316; this.dependencyBindingBlock(); } } - this.state = 1303; + this.state = 1319; this.match(QuixosCapabilityParser.SEMI); } } @@ -4928,10 +4985,10 @@ export class QuixosCapabilityParser extends antlr.Parser { } public valueType(): ValueTypeContext { let localContext = new ValueTypeContext(this.context, this.state); - this.enterRule(localContext, 146, QuixosCapabilityParser.RULE_valueType); + this.enterRule(localContext, 148, QuixosCapabilityParser.RULE_valueType); let _la: number; try { - this.state = 1351; + this.state = 1378; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.BOOL: @@ -4944,130 +5001,159 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.UINT64: this.enterOuterAlt(localContext, 1); { - this.state = 1305; + this.state = 1321; this.scalarType(); } break; case QuixosCapabilityParser.UNIT: this.enterOuterAlt(localContext, 2); { - this.state = 1306; + this.state = 1322; this.match(QuixosCapabilityParser.UNIT); } break; case QuixosCapabilityParser.WATCH_HANDLE: this.enterOuterAlt(localContext, 3); { - this.state = 1307; + this.state = 1323; this.match(QuixosCapabilityParser.WATCH_HANDLE); } break; case QuixosCapabilityParser.MESSAGE: this.enterOuterAlt(localContext, 4); { - this.state = 1308; + this.state = 1324; this.match(QuixosCapabilityParser.MESSAGE); - this.state = 1309; + this.state = 1325; this.stringLiteral(); } break; case QuixosCapabilityParser.ATOM_REF: this.enterOuterAlt(localContext, 5); { - this.state = 1310; + this.state = 1326; this.match(QuixosCapabilityParser.ATOM_REF); - this.state = 1311; + this.state = 1327; this.match(QuixosCapabilityParser.LT); - this.state = 1312; + this.state = 1328; this.identifier(); - this.state = 1313; + this.state = 1329; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.INTERFACE_REF: this.enterOuterAlt(localContext, 6); { - this.state = 1315; + this.state = 1331; this.match(QuixosCapabilityParser.INTERFACE_REF); - this.state = 1316; + this.state = 1332; this.match(QuixosCapabilityParser.LT); - this.state = 1317; + this.state = 1333; this.identifier(); - this.state = 1319; + this.state = 1335; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 143) { + if (_la === 145) { { - this.state = 1318; + this.state = 1334; this.typeArguments(); } } - this.state = 1321; + this.state = 1337; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.REF: this.enterOuterAlt(localContext, 7); { - this.state = 1323; + this.state = 1339; this.match(QuixosCapabilityParser.REF); - this.state = 1324; + this.state = 1340; this.match(QuixosCapabilityParser.LT); - this.state = 1325; + this.state = 1341; this.identifier(); - this.state = 1326; + this.state = 1342; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.OPTIONAL: this.enterOuterAlt(localContext, 8); { - this.state = 1328; + this.state = 1344; this.match(QuixosCapabilityParser.OPTIONAL); - this.state = 1329; + this.state = 1345; this.match(QuixosCapabilityParser.LT); - this.state = 1330; + this.state = 1346; this.valueType(); - this.state = 1331; + this.state = 1347; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.LIST: this.enterOuterAlt(localContext, 9); { - this.state = 1333; + this.state = 1349; this.match(QuixosCapabilityParser.LIST); - this.state = 1334; + this.state = 1350; this.match(QuixosCapabilityParser.LT); - this.state = 1335; + this.state = 1351; this.valueType(); - this.state = 1336; + this.state = 1352; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.RECORD: this.enterOuterAlt(localContext, 10); { - this.state = 1338; + this.state = 1354; this.match(QuixosCapabilityParser.RECORD); - this.state = 1339; + this.state = 1355; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1343; + this.state = 1359; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 76)) & ~0x1F) === 0 && ((1 << (_la - 76)) & 3145729) !== 0) || _la === 108 || _la === 151) { { { - this.state = 1340; + this.state = 1356; this.recordField(); } } - this.state = 1345; + this.state = 1361; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1346; + this.state = 1362; + this.match(QuixosCapabilityParser.RBRACE); + } + break; + case QuixosCapabilityParser.VARIANT: + this.enterOuterAlt(localContext, 11); + { + this.state = 1363; + this.match(QuixosCapabilityParser.VARIANT); + this.state = 1364; + this.match(QuixosCapabilityParser.ID); + this.state = 1365; + this.stringLiteral(); + this.state = 1366; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 1368; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + do { + { + { + this.state = 1367; + this.variantCase(); + } + } + this.state = 1370; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 76)) & ~0x1F) === 0 && ((1 << (_la - 76)) & 3145729) !== 0) || _la === 108 || _la === 151); + this.state = 1372; this.match(QuixosCapabilityParser.RBRACE); } break; @@ -5108,16 +5194,16 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.STOP: case QuixosCapabilityParser.REGISTER: case QuixosCapabilityParser.IDENTIFIER: - this.enterOuterAlt(localContext, 11); + this.enterOuterAlt(localContext, 12); { - this.state = 1347; + this.state = 1374; this.identifier(); - this.state = 1349; + this.state = 1376; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 143) { + if (_la === 145) { { - this.state = 1348; + this.state = 1375; this.typeArguments(); } } @@ -5143,17 +5229,50 @@ export class QuixosCapabilityParser extends antlr.Parser { } public recordField(): RecordFieldContext { let localContext = new RecordFieldContext(this.context, this.state); - this.enterRule(localContext, 148, QuixosCapabilityParser.RULE_recordField); + this.enterRule(localContext, 150, QuixosCapabilityParser.RULE_recordField); try { this.enterOuterAlt(localContext, 1); { - this.state = 1353; + this.state = 1380; this.identifier(); - this.state = 1354; + this.state = 1381; this.match(QuixosCapabilityParser.COLON); - this.state = 1355; + this.state = 1382; this.valueType(); - this.state = 1356; + this.state = 1383; + this.match(QuixosCapabilityParser.SEMI); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public variantCase(): VariantCaseContext { + let localContext = new VariantCaseContext(this.context, this.state); + this.enterRule(localContext, 152, QuixosCapabilityParser.RULE_variantCase); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 1385; + this.identifier(); + this.state = 1386; + this.match(QuixosCapabilityParser.ID); + this.state = 1387; + this.stringLiteral(); + this.state = 1388; + this.match(QuixosCapabilityParser.COLON); + this.state = 1389; + this.valueType(); + this.state = 1390; this.match(QuixosCapabilityParser.SEMI); } } @@ -5172,14 +5291,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public scalarType(): ScalarTypeContext { let localContext = new ScalarTypeContext(this.context, this.state); - this.enterRule(localContext, 150, QuixosCapabilityParser.RULE_scalarType); + this.enterRule(localContext, 154, QuixosCapabilityParser.RULE_scalarType); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1358; + this.state = 1392; _la = this.tokenStream.LA(1); - if(!(((((_la - 121)) & ~0x1F) === 0 && ((1 << (_la - 121)) & 255) !== 0))) { + if(!(((((_la - 123)) & ~0x1F) === 0 && ((1 << (_la - 123)) & 255) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -5203,14 +5322,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public cardinality(): CardinalityContext { let localContext = new CardinalityContext(this.context, this.state); - this.enterRule(localContext, 152, QuixosCapabilityParser.RULE_cardinality); + this.enterRule(localContext, 156, QuixosCapabilityParser.RULE_cardinality); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1360; + this.state = 1394; _la = this.tokenStream.LA(1); - if(!(((((_la - 108)) & ~0x1F) === 0 && ((1 << (_la - 108)) & 15) !== 0))) { + if(!(((((_la - 110)) & ~0x1F) === 0 && ((1 << (_la - 110)) & 15) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -5234,64 +5353,64 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonLiteral(): JsonLiteralContext { let localContext = new JsonLiteralContext(this.context, this.state); - this.enterRule(localContext, 154, QuixosCapabilityParser.RULE_jsonLiteral); + this.enterRule(localContext, 158, QuixosCapabilityParser.RULE_jsonLiteral); try { - this.state = 1370; + this.state = 1404; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STRING_LITERAL: this.enterOuterAlt(localContext, 1); { - this.state = 1362; + this.state = 1396; this.stringLiteral(); } break; case QuixosCapabilityParser.INTEGER: this.enterOuterAlt(localContext, 2); { - this.state = 1363; + this.state = 1397; this.match(QuixosCapabilityParser.INTEGER); } break; case QuixosCapabilityParser.JSON_NUMBER: this.enterOuterAlt(localContext, 3); { - this.state = 1364; + this.state = 1398; this.match(QuixosCapabilityParser.JSON_NUMBER); } break; case QuixosCapabilityParser.TRUE: this.enterOuterAlt(localContext, 4); { - this.state = 1365; + this.state = 1399; this.match(QuixosCapabilityParser.TRUE); } break; case QuixosCapabilityParser.FALSE: this.enterOuterAlt(localContext, 5); { - this.state = 1366; + this.state = 1400; this.match(QuixosCapabilityParser.FALSE); } break; case QuixosCapabilityParser.NULL: this.enterOuterAlt(localContext, 6); { - this.state = 1367; + this.state = 1401; this.match(QuixosCapabilityParser.NULL); } break; case QuixosCapabilityParser.LBRACE: this.enterOuterAlt(localContext, 7); { - this.state = 1368; + this.state = 1402; this.jsonObject(); } break; case QuixosCapabilityParser.LBRACK: this.enterOuterAlt(localContext, 8); { - this.state = 1369; + this.state = 1403; this.jsonArray(); } break; @@ -5314,40 +5433,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonObject(): JsonObjectContext { let localContext = new JsonObjectContext(this.context, this.state); - this.enterRule(localContext, 156, QuixosCapabilityParser.RULE_jsonObject); + this.enterRule(localContext, 160, QuixosCapabilityParser.RULE_jsonObject); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1372; + this.state = 1406; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1381; + this.state = 1415; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 150) { + if (_la === 152) { { - this.state = 1373; + this.state = 1407; this.jsonMember(); - this.state = 1378; + this.state = 1412; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 135) { + while (_la === 137) { { { - this.state = 1374; + this.state = 1408; this.match(QuixosCapabilityParser.COMMA); - this.state = 1375; + this.state = 1409; this.jsonMember(); } } - this.state = 1380; + this.state = 1414; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1383; + this.state = 1417; this.match(QuixosCapabilityParser.RBRACE); } } @@ -5366,15 +5485,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonMember(): JsonMemberContext { let localContext = new JsonMemberContext(this.context, this.state); - this.enterRule(localContext, 158, QuixosCapabilityParser.RULE_jsonMember); + this.enterRule(localContext, 162, QuixosCapabilityParser.RULE_jsonMember); try { this.enterOuterAlt(localContext, 1); { - this.state = 1385; + this.state = 1419; this.stringLiteral(); - this.state = 1386; + this.state = 1420; this.match(QuixosCapabilityParser.COLON); - this.state = 1387; + this.state = 1421; this.jsonLiteral(); } } @@ -5393,40 +5512,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonArray(): JsonArrayContext { let localContext = new JsonArrayContext(this.context, this.state); - this.enterRule(localContext, 160, QuixosCapabilityParser.RULE_jsonArray); + this.enterRule(localContext, 164, QuixosCapabilityParser.RULE_jsonArray); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1389; + this.state = 1423; this.match(QuixosCapabilityParser.LBRACK); - this.state = 1398; + this.state = 1432; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (((((_la - 129)) & ~0x1F) === 0 && ((1 << (_la - 129)) & 2884871) !== 0)) { + if (((((_la - 131)) & ~0x1F) === 0 && ((1 << (_la - 131)) & 2884871) !== 0)) { { - this.state = 1390; + this.state = 1424; this.jsonLiteral(); - this.state = 1395; + this.state = 1429; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 135) { + while (_la === 137) { { { - this.state = 1391; + this.state = 1425; this.match(QuixosCapabilityParser.COMMA); - this.state = 1392; + this.state = 1426; this.jsonLiteral(); } } - this.state = 1397; + this.state = 1431; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1400; + this.state = 1434; this.match(QuixosCapabilityParser.RBRACK); } } @@ -5445,14 +5564,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public identifier(): IdentifierContext { let localContext = new IdentifierContext(this.context, this.state); - this.enterRule(localContext, 162, QuixosCapabilityParser.RULE_identifier); + this.enterRule(localContext, 166, QuixosCapabilityParser.RULE_identifier); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1402; + this.state = 1436; _la = this.tokenStream.LA(1); - if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294966770) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 8451) !== 0) || ((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 3145729) !== 0) || _la === 106 || _la === 149)) { + if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 76)) & ~0x1F) === 0 && ((1 << (_la - 76)) & 3145729) !== 0) || _la === 108 || _la === 151)) { this.errorHandler.recoverInline(this); } else { @@ -5476,11 +5595,11 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stringLiteral(): StringLiteralContext { let localContext = new StringLiteralContext(this.context, this.state); - this.enterRule(localContext, 164, QuixosCapabilityParser.RULE_stringLiteral); + this.enterRule(localContext, 168, QuixosCapabilityParser.RULE_stringLiteral); try { this.enterOuterAlt(localContext, 1); { - this.state = 1404; + this.state = 1438; this.match(QuixosCapabilityParser.STRING_LITERAL); } } @@ -5499,7 +5618,7 @@ export class QuixosCapabilityParser extends antlr.Parser { } public static readonly _serializedATN: number[] = [ - 4,1,153,1407,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,155,1441,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, @@ -5511,539 +5630,554 @@ export class QuixosCapabilityParser extends antlr.Parser { 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,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,179,8,0,1,1,1,1,1,1,5,1,184,8,1,10, - 1,12,1,187,9,1,1,1,1,1,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1, - 3,1,3,1,3,1,3,5,3,205,8,3,10,3,12,3,208,9,3,1,3,1,3,1,4,1,4,1,4, - 1,4,1,4,1,4,1,4,1,4,3,4,220,8,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5, - 1,5,1,5,3,5,232,8,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7, - 1,7,1,7,1,7,1,8,1,8,1,8,1,8,3,8,252,8,8,1,9,1,9,1,9,1,9,1,9,1,9, - 3,9,260,8,9,1,9,1,9,1,10,5,10,265,8,10,10,10,12,10,268,9,10,1,10, - 1,10,1,10,3,10,273,8,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10, - 5,10,283,8,10,10,10,12,10,286,9,10,3,10,288,8,10,1,10,1,10,5,10, - 292,8,10,10,10,12,10,295,9,10,1,10,1,10,1,11,1,11,1,11,1,11,5,11, - 303,8,11,10,11,12,11,306,9,11,1,11,1,11,1,12,1,12,1,12,1,12,3,12, - 314,8,12,1,12,1,12,1,12,1,12,1,12,1,12,5,12,322,8,12,10,12,12,12, - 325,9,12,3,12,327,8,12,3,12,329,8,12,1,13,1,13,3,13,333,8,13,1,14, - 1,14,1,14,1,14,5,14,339,8,14,10,14,12,14,342,9,14,1,14,1,14,1,15, - 1,15,1,15,1,15,1,15,1,15,1,15,3,15,353,8,15,1,16,1,16,1,16,3,16, - 358,8,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,3,17,368,8,17,1, - 18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,3,18,378,8,18,1,18,1,18,1, - 19,3,19,383,8,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1, - 19,1,19,1,19,1,19,3,19,398,8,19,1,19,1,19,1,19,1,20,3,20,404,8,20, - 1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,5,20,414,8,20,10,20,12,20, - 417,9,20,1,20,1,20,1,21,1,21,1,21,1,21,3,21,425,8,21,1,21,1,21,1, - 21,1,21,1,21,1,21,3,21,433,8,21,1,21,1,21,1,21,1,21,1,21,1,21,3, - 21,441,8,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1, - 21,3,21,454,8,21,1,22,3,22,457,8,22,1,22,1,22,1,22,1,22,1,22,1,22, - 1,22,1,22,3,22,467,8,22,1,22,1,22,3,22,471,8,22,1,22,1,22,5,22,475, - 8,22,10,22,12,22,478,9,22,1,22,1,22,1,23,1,23,3,23,484,8,23,1,24, - 1,24,1,24,1,24,3,24,490,8,24,1,24,1,24,1,24,1,24,1,24,1,24,3,24, - 498,8,24,1,24,1,24,1,24,1,24,1,24,1,24,3,24,506,8,24,1,24,1,24,1, - 24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,3,24,519,8,24,1,25,1, - 25,1,25,1,25,1,25,3,25,526,8,25,1,25,1,25,3,25,530,8,25,1,26,5,26, - 533,8,26,10,26,12,26,536,9,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26, - 1,26,3,26,546,8,26,1,26,1,26,5,26,550,8,26,10,26,12,26,553,9,26, - 1,26,1,26,1,27,1,27,1,27,1,27,1,27,1,27,3,27,563,8,27,1,28,1,28, - 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,29,1,29,1,29,1,29,1,29,1,29,1,30,1,30,3,30,589,8,30,1,30, - 1,30,3,30,593,8,30,1,30,1,30,1,30,1,30,3,30,599,8,30,1,30,1,30,1, - 30,1,30,1,30,1,30,1,30,5,30,608,8,30,10,30,12,30,611,9,30,1,30,1, - 30,1,30,1,30,1,30,1,30,3,30,619,8,30,1,30,1,30,5,30,623,8,30,10, - 30,12,30,626,9,30,1,30,1,30,3,30,630,8,30,3,30,632,8,30,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,32,1,32, - 1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,5,32, - 661,8,32,10,32,12,32,664,9,32,1,32,3,32,667,8,32,1,32,1,32,1,32, - 1,32,3,32,673,8,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32, + 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,1, + 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,183,8,0,1,1,1, + 1,1,1,5,1,188,8,1,10,1,12,1,191,9,1,1,1,1,1,1,2,1,2,1,2,1,2,1,3, + 1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,5,3,209,8,3,10,3,12,3,212,9, + 3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,3,4,224,8,4,1,5,1,5,1, + 5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,3,5,236,8,5,1,6,1,6,1,6,1,6,1,6,1, + 6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,3,8,256,8,8,1, + 9,1,9,1,9,1,9,1,9,1,9,3,9,264,8,9,1,9,1,9,1,10,5,10,269,8,10,10, + 10,12,10,272,9,10,1,10,1,10,1,10,3,10,277,8,10,1,10,1,10,1,10,1, + 10,1,10,1,10,1,10,1,10,5,10,287,8,10,10,10,12,10,290,9,10,3,10,292, + 8,10,1,10,1,10,5,10,296,8,10,10,10,12,10,299,9,10,1,10,1,10,1,11, + 1,11,1,11,1,11,5,11,307,8,11,10,11,12,11,310,9,11,1,11,1,11,1,12, + 1,12,1,12,1,12,3,12,318,8,12,1,12,1,12,1,12,1,12,1,12,1,12,5,12, + 326,8,12,10,12,12,12,329,9,12,3,12,331,8,12,3,12,333,8,12,1,13,1, + 13,3,13,337,8,13,1,14,1,14,1,14,1,14,5,14,343,8,14,10,14,12,14,346, + 9,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,3,15,357,8,15, + 1,16,1,16,1,16,3,16,362,8,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17, + 1,17,3,17,372,8,17,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,3,18, + 382,8,18,1,18,1,18,1,19,3,19,387,8,19,1,19,1,19,1,19,1,19,1,19,1, + 19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,3,19,402,8,19,1,19,1,19,1, + 19,1,20,3,20,408,8,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,5, + 20,418,8,20,10,20,12,20,421,9,20,1,20,1,20,1,21,1,21,1,21,1,21,3, + 21,429,8,21,1,21,1,21,1,21,1,21,1,21,1,21,3,21,437,8,21,1,21,1,21, + 1,21,1,21,1,21,1,21,3,21,445,8,21,1,21,1,21,1,21,1,21,1,21,1,21, + 1,21,1,21,1,21,1,21,1,21,3,21,458,8,21,1,22,3,22,461,8,22,1,22,1, + 22,1,22,1,22,1,22,1,22,1,22,1,22,3,22,471,8,22,1,22,1,22,3,22,475, + 8,22,1,22,1,22,5,22,479,8,22,10,22,12,22,482,9,22,1,22,1,22,1,23, + 1,23,3,23,488,8,23,1,24,1,24,1,24,1,24,3,24,494,8,24,1,24,1,24,1, + 24,1,24,1,24,1,24,3,24,502,8,24,1,24,1,24,1,24,1,24,1,24,1,24,3, + 24,510,8,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1, + 24,3,24,523,8,24,1,25,1,25,1,25,1,25,1,25,3,25,530,8,25,1,25,1,25, + 3,25,534,8,25,1,26,5,26,537,8,26,10,26,12,26,540,9,26,1,26,1,26, + 1,26,1,26,1,26,1,26,1,26,1,26,3,26,550,8,26,1,26,1,26,5,26,554,8, + 26,10,26,12,26,557,9,26,1,26,1,26,1,27,1,27,1,27,1,27,1,27,1,27, + 3,27,567,8,27,1,28,1,28,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,29,1,29,1,29,1,29,1,29,1,29,1,30, + 1,30,3,30,593,8,30,1,30,1,30,3,30,597,8,30,1,30,1,30,1,30,1,30,3, + 30,603,8,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,5,30,612,8,30,10, + 30,12,30,615,9,30,1,30,1,30,1,30,1,30,1,30,1,30,3,30,623,8,30,1, + 30,1,30,5,30,627,8,30,10,30,12,30,630,9,30,1,30,1,30,3,30,634,8, + 30,3,30,636,8,30,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,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1, + 32,1,32,1,32,1,32,1,32,5,32,665,8,32,10,32,12,32,668,9,32,1,32,3, + 32,671,8,32,1,32,1,32,1,32,1,32,3,32,677,8,32,1,32,1,32,1,32,1,32, 1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32, - 1,32,1,32,1,32,3,32,700,8,32,1,33,1,33,1,33,1,33,1,33,1,34,1,34, - 1,34,3,34,710,8,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34, - 3,34,721,8,34,1,34,3,34,724,8,34,1,34,1,34,1,34,3,34,729,8,34,1, - 34,3,34,732,8,34,1,34,1,34,1,35,1,35,1,35,3,35,739,8,35,1,35,1,35, - 1,35,1,35,1,35,1,35,1,35,3,35,748,8,35,1,35,3,35,751,8,35,1,35,3, - 35,754,8,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,37,1,37,1,37,3,37,771,8,37,1,38,1,38,1,38,1,38,1,38,5, - 38,778,8,38,10,38,12,38,781,9,38,1,38,1,38,1,39,1,39,1,39,1,39,1, - 39,1,39,1,39,1,39,1,39,3,39,794,8,39,1,39,1,39,1,40,1,40,1,40,1, - 41,1,41,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,5,42,813, - 8,42,10,42,12,42,816,9,42,3,42,818,8,42,1,42,3,42,821,8,42,1,43, - 1,43,1,43,5,43,826,8,43,10,43,12,43,829,9,43,1,44,1,44,1,44,5,44, - 834,8,44,10,44,12,44,837,9,44,1,44,1,44,1,45,1,45,1,45,1,45,1,45, - 1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45, - 1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,3,45,868,8,45,1,45, - 1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,3,45,880,8,45,1,45, - 3,45,883,8,45,1,45,1,45,3,45,887,8,45,1,45,1,45,1,45,1,45,1,45,1, - 45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1, - 45,1,45,3,45,909,8,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1, - 45,1,45,1,45,1,45,3,45,923,8,45,1,46,1,46,1,46,1,46,5,46,929,8,46, - 10,46,12,46,932,9,46,1,46,1,46,1,47,1,47,1,48,1,48,1,48,1,49,1,49, - 3,49,943,8,49,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50, - 1,50,1,50,3,50,957,8,50,1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,51, - 3,51,967,8,51,1,52,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,53,1,53,3,53,985,8,53,1,53,1,53,3,53,989,8, - 53,1,53,3,53,992,8,53,1,53,1,53,3,53,996,8,53,1,53,3,53,999,8,53, - 1,53,1,53,1,54,1,54,3,54,1005,8,54,1,54,1,54,3,54,1009,8,54,1,54, - 1,54,1,54,3,54,1014,8,54,1,54,1,54,3,54,1018,8,54,1,54,1,54,3,54, - 1022,8,54,1,54,1,54,5,54,1026,8,54,10,54,12,54,1029,9,54,1,54,1, - 54,1,55,1,55,1,56,1,56,1,56,1,56,1,56,1,56,1,56,3,56,1042,8,56,1, - 57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,58,1,58,1,58,5,58,1055,8, - 58,10,58,12,58,1058,9,58,1,58,1,58,1,58,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,1077,8,59,1,60, - 1,60,1,60,1,60,1,60,5,60,1084,8,60,10,60,12,60,1087,9,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,62,1,62,1, - 62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,63,1,63,1,63,1,63,1, - 63,1,63,3,63,1118,8,63,1,63,1,63,1,64,1,64,1,64,1,64,1,65,1,65,1, - 65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,3,65,1138,8,65,1, - 66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1, - 66,1,66,1,66,1,66,1,66,3,66,1158,8,66,1,66,1,66,1,66,1,66,1,66,1, - 66,1,66,1,66,3,66,1168,8,66,1,66,3,66,1171,8,66,1,66,3,66,1174,8, - 66,3,66,1176,8,66,1,67,1,67,1,67,1,68,1,68,1,69,1,69,1,70,1,70,1, - 70,5,70,1188,8,70,10,70,12,70,1191,9,70,1,70,1,70,1,71,1,71,1,71, - 1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71, - 1,71,1,71,1,71,3,71,1214,8,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71, - 1,71,1,71,1,71,1,71,1,71,1,71,1,71,3,71,1230,8,71,1,71,1,71,1,71, - 1,71,1,71,1,71,1,71,3,71,1239,8,71,1,71,1,71,1,71,1,71,1,71,1,71, - 1,71,1,71,3,71,1249,8,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71, - 1,71,5,71,1260,8,71,10,71,12,71,1263,9,71,1,71,1,71,1,71,1,71,1, - 71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,3,71,1277,8,71,1,71,1,71,1, - 71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,3,71,1289,8,71,1,71,1,71,3, - 71,1293,8,71,1,72,1,72,1,72,1,72,1,72,1,72,1,72,3,72,1302,8,72,1, - 72,1,72,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1, - 73,1,73,1,73,3,73,1320,8,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1, - 73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,5, - 73,1342,8,73,10,73,12,73,1345,9,73,1,73,1,73,1,73,3,73,1350,8,73, - 3,73,1352,8,73,1,74,1,74,1,74,1,74,1,74,1,75,1,75,1,76,1,76,1,77, - 1,77,1,77,1,77,1,77,1,77,1,77,1,77,3,77,1371,8,77,1,78,1,78,1,78, - 1,78,5,78,1377,8,78,10,78,12,78,1380,9,78,3,78,1382,8,78,1,78,1, - 78,1,79,1,79,1,79,1,79,1,80,1,80,1,80,1,80,5,80,1394,8,80,10,80, - 12,80,1397,9,80,3,80,1399,8,80,1,80,1,80,1,81,1,81,1,82,1,82,1,82, - 0,0,83,0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40, + 1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,3,32,704,8,32,1,33,1,33, + 1,33,1,33,1,33,1,34,1,34,1,34,3,34,714,8,34,1,34,1,34,1,34,1,34, + 1,34,1,34,1,34,1,34,1,34,3,34,725,8,34,1,34,3,34,728,8,34,1,34,1, + 34,1,34,3,34,733,8,34,1,34,3,34,736,8,34,1,34,3,34,739,8,34,1,34, + 1,34,1,35,1,35,1,35,3,35,746,8,35,1,35,1,35,1,35,1,35,1,35,1,35, + 1,35,3,35,755,8,35,1,35,3,35,758,8,35,1,35,3,35,761,8,35,1,35,3, + 35,764,8,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,38,1,38,3,38,787,8, + 38,1,39,1,39,1,39,1,39,1,39,5,39,794,8,39,10,39,12,39,797,9,39,1, + 39,1,39,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,3,40,810,8, + 40,1,40,1,40,1,41,1,41,1,41,1,42,1,42,1,43,1,43,1,43,1,43,1,43,1, + 43,1,43,1,43,1,43,1,43,5,43,829,8,43,10,43,12,43,832,9,43,3,43,834, + 8,43,1,43,3,43,837,8,43,1,44,1,44,1,44,5,44,842,8,44,10,44,12,44, + 845,9,44,1,45,1,45,1,45,5,45,850,8,45,10,45,12,45,853,9,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,46,1,46, + 1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46, + 1,46,1,46,3,46,884,8,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46, + 1,46,1,46,3,46,896,8,46,1,46,3,46,899,8,46,1,46,1,46,3,46,903,8, + 46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1, + 46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,3,46,925,8,46,1,46,1,46,1, + 46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,3,46,939,8,46,1, + 47,1,47,1,47,1,47,5,47,945,8,47,10,47,12,47,948,9,47,1,47,1,47,1, + 48,1,48,1,49,1,49,1,49,1,50,1,50,3,50,959,8,50,1,51,1,51,1,51,1, + 51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,3,51,973,8,51,1,51,1, + 51,1,52,1,52,1,52,1,52,1,52,1,52,3,52,983,8,52,1,53,1,53,1,53,1, + 53,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,54,1,54,3, + 54,1001,8,54,1,54,1,54,3,54,1005,8,54,1,54,3,54,1008,8,54,1,54,1, + 54,3,54,1012,8,54,1,54,3,54,1015,8,54,1,54,1,54,1,55,1,55,3,55,1021, + 8,55,1,55,1,55,3,55,1025,8,55,1,55,1,55,1,55,3,55,1030,8,55,1,55, + 1,55,3,55,1034,8,55,1,55,1,55,3,55,1038,8,55,1,55,1,55,5,55,1042, + 8,55,10,55,12,55,1045,9,55,1,55,1,55,1,56,1,56,1,57,1,57,1,57,1, + 57,1,57,1,57,1,57,3,57,1058,8,57,1,58,1,58,1,58,1,58,1,58,1,58,1, + 58,1,58,1,59,1,59,1,59,5,59,1071,8,59,10,59,12,59,1074,9,59,1,59, + 1,59,1,59,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60, + 1,60,1,60,1,60,3,60,1093,8,60,1,61,1,61,1,61,1,61,1,61,5,61,1100, + 8,61,10,61,12,61,1103,9,61,1,61,1,61,1,62,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,63,1,63,1,63,1,63,1, + 63,1,63,1,63,1,64,1,64,1,64,1,64,1,64,1,64,3,64,1134,8,64,1,64,1, + 64,1,65,1,65,1,65,1,65,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1, + 66,1,66,1,66,1,66,3,66,1154,8,66,1,67,1,67,1,67,1,67,1,67,1,67,1, + 67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,3,67,1174, + 8,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,3,67,1184,8,67,1,67, + 3,67,1187,8,67,1,67,3,67,1190,8,67,3,67,1192,8,67,1,68,1,68,1,68, + 1,69,1,69,1,70,1,70,1,71,1,71,1,71,5,71,1204,8,71,10,71,12,71,1207, + 9,71,1,71,1,71,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72, + 1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,3,72,1230,8,72,1,72, + 1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72, + 3,72,1246,8,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,3,72,1255,8,72, + 1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,3,72,1265,8,72,1,72,1,72, + 1,72,1,72,1,72,1,72,1,72,1,72,1,72,5,72,1276,8,72,10,72,12,72,1279, + 9,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72, + 3,72,1293,8,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72, + 3,72,1305,8,72,1,72,1,72,3,72,1309,8,72,1,73,1,73,1,73,1,73,1,73, + 1,73,1,73,3,73,1318,8,73,1,73,1,73,1,74,1,74,1,74,1,74,1,74,1,74, + 1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,3,74,1336,8,74,1,74,1,74, + 1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74, + 1,74,1,74,1,74,1,74,1,74,5,74,1358,8,74,10,74,12,74,1361,9,74,1, + 74,1,74,1,74,1,74,1,74,1,74,4,74,1369,8,74,11,74,12,74,1370,1,74, + 1,74,1,74,1,74,3,74,1377,8,74,3,74,1379,8,74,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,78,1,78,1,79, + 1,79,1,79,1,79,1,79,1,79,1,79,1,79,3,79,1405,8,79,1,80,1,80,1,80, + 1,80,5,80,1411,8,80,10,80,12,80,1414,9,80,3,80,1416,8,80,1,80,1, + 80,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,5,82,1428,8,82,10,82, + 12,82,1431,9,82,3,82,1433,8,82,1,82,1,82,1,83,1,83,1,84,1,84,1,84, + 0,0,85,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,0,9,2,0,15,15,33,33,1,0,11,12,1,0,101,105, - 3,0,1,1,96,100,102,103,3,0,1,1,96,97,102,103,2,0,98,100,102,103, - 1,0,121,128,1,0,108,111,9,0,1,1,4,8,10,33,40,40,45,45,74,74,94,95, - 106,106,149,149,1524,0,178,1,0,0,0,2,180,1,0,0,0,4,190,1,0,0,0,6, - 194,1,0,0,0,8,219,1,0,0,0,10,231,1,0,0,0,12,233,1,0,0,0,14,240,1, - 0,0,0,16,251,1,0,0,0,18,253,1,0,0,0,20,266,1,0,0,0,22,298,1,0,0, - 0,24,328,1,0,0,0,26,330,1,0,0,0,28,334,1,0,0,0,30,352,1,0,0,0,32, - 354,1,0,0,0,34,367,1,0,0,0,36,369,1,0,0,0,38,382,1,0,0,0,40,403, - 1,0,0,0,42,453,1,0,0,0,44,456,1,0,0,0,46,481,1,0,0,0,48,518,1,0, - 0,0,50,529,1,0,0,0,52,534,1,0,0,0,54,562,1,0,0,0,56,564,1,0,0,0, - 58,574,1,0,0,0,60,586,1,0,0,0,62,633,1,0,0,0,64,699,1,0,0,0,66,701, - 1,0,0,0,68,706,1,0,0,0,70,735,1,0,0,0,72,757,1,0,0,0,74,770,1,0, - 0,0,76,772,1,0,0,0,78,784,1,0,0,0,80,797,1,0,0,0,82,800,1,0,0,0, - 84,820,1,0,0,0,86,822,1,0,0,0,88,830,1,0,0,0,90,922,1,0,0,0,92,924, - 1,0,0,0,94,935,1,0,0,0,96,937,1,0,0,0,98,942,1,0,0,0,100,944,1,0, - 0,0,102,966,1,0,0,0,104,968,1,0,0,0,106,977,1,0,0,0,108,1002,1,0, - 0,0,110,1032,1,0,0,0,112,1041,1,0,0,0,114,1043,1,0,0,0,116,1051, - 1,0,0,0,118,1076,1,0,0,0,120,1078,1,0,0,0,122,1090,1,0,0,0,124,1097, - 1,0,0,0,126,1111,1,0,0,0,128,1121,1,0,0,0,130,1137,1,0,0,0,132,1175, - 1,0,0,0,134,1177,1,0,0,0,136,1180,1,0,0,0,138,1182,1,0,0,0,140,1184, - 1,0,0,0,142,1292,1,0,0,0,144,1294,1,0,0,0,146,1351,1,0,0,0,148,1353, - 1,0,0,0,150,1358,1,0,0,0,152,1360,1,0,0,0,154,1370,1,0,0,0,156,1372, - 1,0,0,0,158,1385,1,0,0,0,160,1389,1,0,0,0,162,1402,1,0,0,0,164,1404, - 1,0,0,0,166,167,3,6,3,0,167,168,5,0,0,1,168,179,1,0,0,0,169,170, - 3,20,10,0,170,171,5,0,0,1,171,179,1,0,0,0,172,173,3,52,26,0,173, - 174,5,0,0,1,174,179,1,0,0,0,175,176,3,2,1,0,176,177,5,0,0,1,177, - 179,1,0,0,0,178,166,1,0,0,0,178,169,1,0,0,0,178,172,1,0,0,0,178, - 175,1,0,0,0,179,1,1,0,0,0,180,181,5,40,0,0,181,185,5,137,0,0,182, - 184,3,8,4,0,183,182,1,0,0,0,184,187,1,0,0,0,185,183,1,0,0,0,185, - 186,1,0,0,0,186,188,1,0,0,0,187,185,1,0,0,0,188,189,5,138,0,0,189, - 3,1,0,0,0,190,191,5,41,0,0,191,192,3,164,82,0,192,193,5,134,0,0, - 193,5,1,0,0,0,194,195,5,9,0,0,195,196,3,162,81,0,196,197,5,84,0, - 0,197,198,3,164,82,0,198,199,5,77,0,0,199,200,3,164,82,0,200,201, - 5,76,0,0,201,202,3,164,82,0,202,206,5,137,0,0,203,205,3,8,4,0,204, - 203,1,0,0,0,205,208,1,0,0,0,206,204,1,0,0,0,206,207,1,0,0,0,207, - 209,1,0,0,0,208,206,1,0,0,0,209,210,5,138,0,0,210,7,1,0,0,0,211, - 220,3,4,2,0,212,220,3,18,9,0,213,220,3,10,5,0,214,220,3,96,48,0, - 215,220,3,108,54,0,216,220,3,144,72,0,217,220,3,58,29,0,218,220, - 3,32,16,0,219,211,1,0,0,0,219,212,1,0,0,0,219,213,1,0,0,0,219,214, - 1,0,0,0,219,215,1,0,0,0,219,216,1,0,0,0,219,217,1,0,0,0,219,218, - 1,0,0,0,220,9,1,0,0,0,221,222,5,41,0,0,222,223,5,44,0,0,223,224, - 3,162,81,0,224,225,5,134,0,0,225,232,1,0,0,0,226,227,5,41,0,0,227, - 228,5,46,0,0,228,229,3,162,81,0,229,230,5,134,0,0,230,232,1,0,0, - 0,231,221,1,0,0,0,231,226,1,0,0,0,232,11,1,0,0,0,233,234,5,42,0, - 0,234,235,5,43,0,0,235,236,3,162,81,0,236,237,5,84,0,0,237,238,3, - 164,82,0,238,239,5,134,0,0,239,13,1,0,0,0,240,241,5,42,0,0,241,242, - 5,44,0,0,242,243,3,162,81,0,243,244,5,77,0,0,244,245,3,164,82,0, - 245,246,5,134,0,0,246,15,1,0,0,0,247,252,3,10,5,0,248,252,3,12,6, - 0,249,252,3,14,7,0,250,252,3,32,16,0,251,247,1,0,0,0,251,248,1,0, - 0,0,251,249,1,0,0,0,251,250,1,0,0,0,252,17,1,0,0,0,253,254,5,43, - 0,0,254,255,3,162,81,0,255,256,5,84,0,0,256,259,3,164,82,0,257,258, - 5,85,0,0,258,260,3,164,82,0,259,257,1,0,0,0,259,260,1,0,0,0,260, - 261,1,0,0,0,261,262,5,134,0,0,262,19,1,0,0,0,263,265,3,16,8,0,264, - 263,1,0,0,0,265,268,1,0,0,0,266,264,1,0,0,0,266,267,1,0,0,0,267, - 269,1,0,0,0,268,266,1,0,0,0,269,270,5,44,0,0,270,272,3,162,81,0, - 271,273,3,22,11,0,272,271,1,0,0,0,272,273,1,0,0,0,273,274,1,0,0, - 0,274,275,5,84,0,0,275,276,3,164,82,0,276,277,5,77,0,0,277,287,3, - 164,82,0,278,279,5,89,0,0,279,284,3,26,13,0,280,281,5,135,0,0,281, - 283,3,26,13,0,282,280,1,0,0,0,283,286,1,0,0,0,284,282,1,0,0,0,284, - 285,1,0,0,0,285,288,1,0,0,0,286,284,1,0,0,0,287,278,1,0,0,0,287, - 288,1,0,0,0,288,289,1,0,0,0,289,293,5,137,0,0,290,292,3,34,17,0, - 291,290,1,0,0,0,292,295,1,0,0,0,293,291,1,0,0,0,293,294,1,0,0,0, - 294,296,1,0,0,0,295,293,1,0,0,0,296,297,5,138,0,0,297,21,1,0,0,0, - 298,299,5,143,0,0,299,304,3,24,12,0,300,301,5,135,0,0,301,303,3, - 24,12,0,302,300,1,0,0,0,303,306,1,0,0,0,304,302,1,0,0,0,304,305, - 1,0,0,0,305,307,1,0,0,0,306,304,1,0,0,0,307,308,5,144,0,0,308,23, - 1,0,0,0,309,310,5,47,0,0,310,313,3,162,81,0,311,312,5,133,0,0,312, - 314,5,37,0,0,313,311,1,0,0,0,313,314,1,0,0,0,314,329,1,0,0,0,315, - 316,5,36,0,0,316,326,3,162,81,0,317,318,5,38,0,0,318,323,3,26,13, - 0,319,320,5,145,0,0,320,322,3,26,13,0,321,319,1,0,0,0,322,325,1, - 0,0,0,323,321,1,0,0,0,323,324,1,0,0,0,324,327,1,0,0,0,325,323,1, - 0,0,0,326,317,1,0,0,0,326,327,1,0,0,0,327,329,1,0,0,0,328,309,1, - 0,0,0,328,315,1,0,0,0,329,25,1,0,0,0,330,332,3,162,81,0,331,333, - 3,28,14,0,332,331,1,0,0,0,332,333,1,0,0,0,333,27,1,0,0,0,334,335, - 5,143,0,0,335,340,3,30,15,0,336,337,5,135,0,0,337,339,3,30,15,0, - 338,336,1,0,0,0,339,342,1,0,0,0,340,338,1,0,0,0,340,341,1,0,0,0, - 341,343,1,0,0,0,342,340,1,0,0,0,343,344,5,144,0,0,344,29,1,0,0,0, - 345,346,5,43,0,0,346,353,3,162,81,0,347,348,5,44,0,0,348,353,3,26, - 13,0,349,350,5,36,0,0,350,353,3,162,81,0,351,353,3,146,73,0,352, - 345,1,0,0,0,352,347,1,0,0,0,352,349,1,0,0,0,352,351,1,0,0,0,353, - 31,1,0,0,0,354,355,5,35,0,0,355,357,3,162,81,0,356,358,3,22,11,0, - 357,356,1,0,0,0,357,358,1,0,0,0,358,359,1,0,0,0,359,360,5,146,0, - 0,360,361,3,146,73,0,361,362,5,134,0,0,362,33,1,0,0,0,363,368,3, - 40,20,0,364,368,3,44,22,0,365,368,3,38,19,0,366,368,3,36,18,0,367, - 363,1,0,0,0,367,364,1,0,0,0,367,365,1,0,0,0,367,366,1,0,0,0,368, - 35,1,0,0,0,369,370,5,2,0,0,370,371,3,162,81,0,371,372,5,84,0,0,372, - 373,3,164,82,0,373,374,5,3,0,0,374,377,3,164,82,0,375,376,5,5,0, - 0,376,378,3,50,25,0,377,375,1,0,0,0,377,378,1,0,0,0,378,379,1,0, - 0,0,379,380,5,134,0,0,380,37,1,0,0,0,381,383,5,57,0,0,382,381,1, - 0,0,0,382,383,1,0,0,0,383,384,1,0,0,0,384,385,5,49,0,0,385,386,3, - 162,81,0,386,387,5,84,0,0,387,388,3,164,82,0,388,389,5,133,0,0,389, - 390,3,146,73,0,390,391,5,132,0,0,391,392,3,146,73,0,392,393,5,137, - 0,0,393,394,5,101,0,0,394,395,5,84,0,0,395,397,3,164,82,0,396,398, - 3,74,37,0,397,396,1,0,0,0,397,398,1,0,0,0,398,399,1,0,0,0,399,400, - 5,134,0,0,400,401,5,138,0,0,401,39,1,0,0,0,402,404,3,46,23,0,403, - 402,1,0,0,0,403,404,1,0,0,0,404,405,1,0,0,0,405,406,5,47,0,0,406, - 407,3,162,81,0,407,408,5,84,0,0,408,409,3,164,82,0,409,410,5,133, - 0,0,410,411,3,146,73,0,411,415,5,137,0,0,412,414,3,42,21,0,413,412, - 1,0,0,0,414,417,1,0,0,0,415,413,1,0,0,0,415,416,1,0,0,0,416,418, - 1,0,0,0,417,415,1,0,0,0,418,419,5,138,0,0,419,41,1,0,0,0,420,421, - 5,91,0,0,421,422,5,84,0,0,422,424,3,164,82,0,423,425,3,74,37,0,424, - 423,1,0,0,0,424,425,1,0,0,0,425,426,1,0,0,0,426,427,5,134,0,0,427, - 454,1,0,0,0,428,429,5,92,0,0,429,430,5,84,0,0,430,432,3,164,82,0, - 431,433,3,74,37,0,432,431,1,0,0,0,432,433,1,0,0,0,433,434,1,0,0, - 0,434,435,5,134,0,0,435,454,1,0,0,0,436,437,5,1,0,0,437,438,5,84, - 0,0,438,440,3,164,82,0,439,441,3,74,37,0,440,439,1,0,0,0,440,441, - 1,0,0,0,441,442,1,0,0,0,442,443,5,134,0,0,443,454,1,0,0,0,444,445, - 5,93,0,0,445,446,5,94,0,0,446,447,5,84,0,0,447,448,3,164,82,0,448, - 449,5,95,0,0,449,450,5,84,0,0,450,451,3,164,82,0,451,452,5,134,0, - 0,452,454,1,0,0,0,453,420,1,0,0,0,453,428,1,0,0,0,453,436,1,0,0, - 0,453,444,1,0,0,0,454,43,1,0,0,0,455,457,3,46,23,0,456,455,1,0,0, - 0,456,457,1,0,0,0,457,458,1,0,0,0,458,459,5,48,0,0,459,460,3,162, - 81,0,460,461,5,84,0,0,461,462,3,164,82,0,462,463,5,133,0,0,463,464, - 3,152,76,0,464,466,3,50,25,0,465,467,5,112,0,0,466,465,1,0,0,0,466, - 467,1,0,0,0,467,470,1,0,0,0,468,469,5,82,0,0,469,471,3,164,82,0, - 470,468,1,0,0,0,470,471,1,0,0,0,471,472,1,0,0,0,472,476,5,137,0, - 0,473,475,3,48,24,0,474,473,1,0,0,0,475,478,1,0,0,0,476,474,1,0, - 0,0,476,477,1,0,0,0,477,479,1,0,0,0,478,476,1,0,0,0,479,480,5,138, - 0,0,480,45,1,0,0,0,481,483,5,32,0,0,482,484,7,0,0,0,483,482,1,0, - 0,0,483,484,1,0,0,0,484,47,1,0,0,0,485,486,5,98,0,0,486,487,5,84, - 0,0,487,489,3,164,82,0,488,490,3,74,37,0,489,488,1,0,0,0,489,490, - 1,0,0,0,490,491,1,0,0,0,491,492,5,134,0,0,492,519,1,0,0,0,493,494, - 5,99,0,0,494,495,5,84,0,0,495,497,3,164,82,0,496,498,3,74,37,0,497, - 496,1,0,0,0,497,498,1,0,0,0,498,499,1,0,0,0,499,500,5,134,0,0,500, - 519,1,0,0,0,501,502,5,100,0,0,502,503,5,84,0,0,503,505,3,164,82, - 0,504,506,3,74,37,0,505,504,1,0,0,0,505,506,1,0,0,0,506,507,1,0, - 0,0,507,508,5,134,0,0,508,519,1,0,0,0,509,510,5,93,0,0,510,511,5, - 94,0,0,511,512,5,84,0,0,512,513,3,164,82,0,513,514,5,95,0,0,514, - 515,5,84,0,0,515,516,3,164,82,0,516,517,5,134,0,0,517,519,1,0,0, - 0,518,485,1,0,0,0,518,493,1,0,0,0,518,501,1,0,0,0,518,509,1,0,0, - 0,519,49,1,0,0,0,520,521,5,43,0,0,521,530,3,162,81,0,522,523,5,44, - 0,0,523,525,3,162,81,0,524,526,3,28,14,0,525,524,1,0,0,0,525,526, - 1,0,0,0,526,530,1,0,0,0,527,528,5,36,0,0,528,530,3,162,81,0,529, - 520,1,0,0,0,529,522,1,0,0,0,529,527,1,0,0,0,530,51,1,0,0,0,531,533, - 3,16,8,0,532,531,1,0,0,0,533,536,1,0,0,0,534,532,1,0,0,0,534,535, - 1,0,0,0,535,537,1,0,0,0,536,534,1,0,0,0,537,538,5,46,0,0,538,539, - 3,162,81,0,539,540,5,84,0,0,540,541,3,164,82,0,541,542,5,77,0,0, - 542,545,3,164,82,0,543,544,5,78,0,0,544,546,5,147,0,0,545,543,1, - 0,0,0,545,546,1,0,0,0,546,547,1,0,0,0,547,551,5,137,0,0,548,550, - 3,54,27,0,549,548,1,0,0,0,550,553,1,0,0,0,551,549,1,0,0,0,551,552, - 1,0,0,0,552,554,1,0,0,0,553,551,1,0,0,0,554,555,5,138,0,0,555,53, - 1,0,0,0,556,563,3,68,34,0,557,563,3,70,35,0,558,563,3,78,39,0,559, - 563,3,60,30,0,560,563,3,62,31,0,561,563,3,56,28,0,562,556,1,0,0, - 0,562,557,1,0,0,0,562,558,1,0,0,0,562,559,1,0,0,0,562,560,1,0,0, - 0,562,561,1,0,0,0,563,55,1,0,0,0,564,565,5,2,0,0,565,566,3,162,81, - 0,566,567,5,84,0,0,567,568,3,164,82,0,568,569,5,38,0,0,569,570,3, - 26,13,0,570,571,5,136,0,0,571,572,3,162,81,0,572,573,5,134,0,0,573, - 57,1,0,0,0,574,575,5,4,0,0,575,576,3,162,81,0,576,577,5,84,0,0,577, - 578,3,164,82,0,578,579,5,6,0,0,579,580,3,26,13,0,580,581,5,65,0, - 0,581,582,3,162,81,0,582,583,5,136,0,0,583,584,3,162,81,0,584,585, - 5,134,0,0,585,59,1,0,0,0,586,588,5,22,0,0,587,589,5,40,0,0,588,587, - 1,0,0,0,588,589,1,0,0,0,589,590,1,0,0,0,590,592,3,162,81,0,591,593, - 3,22,11,0,592,591,1,0,0,0,592,593,1,0,0,0,593,594,1,0,0,0,594,595, - 5,84,0,0,595,596,3,164,82,0,596,598,5,25,0,0,597,599,5,9,0,0,598, - 597,1,0,0,0,598,599,1,0,0,0,599,600,1,0,0,0,600,601,3,26,13,0,601, - 602,5,26,0,0,602,631,3,164,82,0,603,604,5,49,0,0,604,605,3,164,82, - 0,605,609,5,137,0,0,606,608,3,64,32,0,607,606,1,0,0,0,608,611,1, - 0,0,0,609,607,1,0,0,0,609,610,1,0,0,0,610,612,1,0,0,0,611,609,1, - 0,0,0,612,613,5,138,0,0,613,632,1,0,0,0,614,615,5,40,0,0,615,618, - 3,164,82,0,616,617,5,49,0,0,617,619,3,164,82,0,618,616,1,0,0,0,618, - 619,1,0,0,0,619,629,1,0,0,0,620,624,5,137,0,0,621,623,3,64,32,0, - 622,621,1,0,0,0,623,626,1,0,0,0,624,622,1,0,0,0,624,625,1,0,0,0, - 625,627,1,0,0,0,626,624,1,0,0,0,627,630,5,138,0,0,628,630,5,134, - 0,0,629,620,1,0,0,0,629,628,1,0,0,0,630,632,1,0,0,0,631,603,1,0, - 0,0,631,614,1,0,0,0,632,61,1,0,0,0,633,634,5,22,0,0,634,635,3,162, - 81,0,635,636,5,84,0,0,636,637,3,164,82,0,637,638,5,24,0,0,638,639, - 3,162,81,0,639,640,3,28,14,0,640,641,5,134,0,0,641,63,1,0,0,0,642, - 643,5,16,0,0,643,700,5,134,0,0,644,645,5,17,0,0,645,646,5,18,0,0, - 646,647,3,162,81,0,647,648,5,134,0,0,648,700,1,0,0,0,649,650,5,27, - 0,0,650,651,3,164,82,0,651,652,5,134,0,0,652,700,1,0,0,0,653,654, - 5,27,0,0,654,655,3,162,81,0,655,656,5,136,0,0,656,666,3,162,81,0, - 657,658,5,64,0,0,658,662,5,137,0,0,659,661,3,66,33,0,660,659,1,0, - 0,0,661,664,1,0,0,0,662,660,1,0,0,0,662,663,1,0,0,0,663,665,1,0, - 0,0,664,662,1,0,0,0,665,667,5,138,0,0,666,657,1,0,0,0,666,667,1, - 0,0,0,667,668,1,0,0,0,668,669,5,134,0,0,669,700,1,0,0,0,670,672, - 5,28,0,0,671,673,5,36,0,0,672,671,1,0,0,0,672,673,1,0,0,0,673,674, - 1,0,0,0,674,675,3,162,81,0,675,676,5,55,0,0,676,677,3,26,13,0,677, - 678,5,134,0,0,678,700,1,0,0,0,679,680,5,29,0,0,680,681,3,162,81, - 0,681,682,5,147,0,0,682,683,5,134,0,0,683,700,1,0,0,0,684,685,5, - 30,0,0,685,686,3,26,13,0,686,687,5,136,0,0,687,688,3,162,81,0,688, - 689,3,162,81,0,689,690,3,164,82,0,690,691,5,134,0,0,691,700,1,0, - 0,0,692,693,5,93,0,0,693,700,5,134,0,0,694,695,5,31,0,0,695,696, - 5,147,0,0,696,697,3,164,82,0,697,698,5,134,0,0,698,700,1,0,0,0,699, - 642,1,0,0,0,699,644,1,0,0,0,699,649,1,0,0,0,699,653,1,0,0,0,699, - 670,1,0,0,0,699,679,1,0,0,0,699,684,1,0,0,0,699,692,1,0,0,0,699, - 694,1,0,0,0,700,65,1,0,0,0,701,702,3,162,81,0,702,703,5,58,0,0,703, - 704,3,162,81,0,704,705,5,134,0,0,705,67,1,0,0,0,706,707,5,49,0,0, - 707,709,3,162,81,0,708,710,3,22,11,0,709,708,1,0,0,0,709,710,1,0, - 0,0,710,711,1,0,0,0,711,712,5,84,0,0,712,713,3,164,82,0,713,714, - 5,133,0,0,714,715,3,146,73,0,715,716,5,132,0,0,716,717,3,146,73, - 0,717,718,5,86,0,0,718,720,3,82,41,0,719,721,3,74,37,0,720,719,1, - 0,0,0,720,721,1,0,0,0,721,723,1,0,0,0,722,724,3,80,40,0,723,722, - 1,0,0,0,723,724,1,0,0,0,724,725,1,0,0,0,725,726,5,88,0,0,726,728, - 3,84,42,0,727,729,3,88,44,0,728,727,1,0,0,0,728,729,1,0,0,0,729, - 731,1,0,0,0,730,732,3,72,36,0,731,730,1,0,0,0,731,732,1,0,0,0,732, - 733,1,0,0,0,733,734,5,134,0,0,734,69,1,0,0,0,735,736,5,50,0,0,736, - 738,3,162,81,0,737,739,3,22,11,0,738,737,1,0,0,0,738,739,1,0,0,0, - 739,740,1,0,0,0,740,741,5,84,0,0,741,742,3,164,82,0,742,743,5,133, - 0,0,743,744,3,146,73,0,744,745,5,132,0,0,745,747,3,146,73,0,746, - 748,3,74,37,0,747,746,1,0,0,0,747,748,1,0,0,0,748,750,1,0,0,0,749, - 751,3,88,44,0,750,749,1,0,0,0,750,751,1,0,0,0,751,753,1,0,0,0,752, - 754,3,72,36,0,753,752,1,0,0,0,753,754,1,0,0,0,754,755,1,0,0,0,755, - 756,5,134,0,0,756,71,1,0,0,0,757,758,5,66,0,0,758,759,5,65,0,0,759, - 760,3,162,81,0,760,73,1,0,0,0,761,762,5,10,0,0,762,771,5,13,0,0, - 763,764,5,10,0,0,764,765,7,1,0,0,765,766,5,14,0,0,766,767,5,139, - 0,0,767,768,3,86,43,0,768,769,5,140,0,0,769,771,1,0,0,0,770,761, - 1,0,0,0,770,763,1,0,0,0,771,75,1,0,0,0,772,773,5,65,0,0,773,774, - 5,139,0,0,774,779,3,128,64,0,775,776,5,135,0,0,776,778,3,128,64, - 0,777,775,1,0,0,0,778,781,1,0,0,0,779,777,1,0,0,0,779,780,1,0,0, - 0,780,782,1,0,0,0,781,779,1,0,0,0,782,783,5,140,0,0,783,77,1,0,0, - 0,784,785,5,51,0,0,785,786,3,162,81,0,786,787,5,84,0,0,787,788,3, - 164,82,0,788,789,5,52,0,0,789,790,3,162,81,0,790,791,5,133,0,0,791, - 793,3,146,73,0,792,794,3,88,44,0,793,792,1,0,0,0,793,794,1,0,0,0, - 794,795,1,0,0,0,795,796,5,134,0,0,796,79,1,0,0,0,797,798,5,87,0, - 0,798,799,3,146,73,0,799,81,1,0,0,0,800,801,7,2,0,0,801,83,1,0,0, - 0,802,821,5,90,0,0,803,804,5,43,0,0,804,821,3,162,81,0,805,806,5, - 36,0,0,806,821,3,162,81,0,807,808,5,45,0,0,808,817,5,139,0,0,809, - 814,3,26,13,0,810,811,5,135,0,0,811,813,3,26,13,0,812,810,1,0,0, - 0,813,816,1,0,0,0,814,812,1,0,0,0,814,815,1,0,0,0,815,818,1,0,0, - 0,816,814,1,0,0,0,817,809,1,0,0,0,817,818,1,0,0,0,818,819,1,0,0, - 0,819,821,5,140,0,0,820,802,1,0,0,0,820,803,1,0,0,0,820,805,1,0, - 0,0,820,807,1,0,0,0,821,85,1,0,0,0,822,827,3,162,81,0,823,824,5, - 135,0,0,824,826,3,162,81,0,825,823,1,0,0,0,826,829,1,0,0,0,827,825, - 1,0,0,0,827,828,1,0,0,0,828,87,1,0,0,0,829,827,1,0,0,0,830,831,5, - 89,0,0,831,835,5,137,0,0,832,834,3,90,45,0,833,832,1,0,0,0,834,837, - 1,0,0,0,835,833,1,0,0,0,835,836,1,0,0,0,836,838,1,0,0,0,837,835, - 1,0,0,0,838,839,5,138,0,0,839,89,1,0,0,0,840,841,5,23,0,0,841,842, - 3,162,81,0,842,843,5,84,0,0,843,844,3,164,82,0,844,845,5,139,0,0, - 845,846,3,86,43,0,846,847,5,140,0,0,847,848,5,134,0,0,848,923,1, - 0,0,0,849,850,5,61,0,0,850,851,3,162,81,0,851,852,5,84,0,0,852,853, - 3,164,82,0,853,854,5,133,0,0,854,855,3,146,73,0,855,856,3,92,46, - 0,856,857,5,134,0,0,857,923,1,0,0,0,858,859,5,62,0,0,859,860,3,162, - 81,0,860,861,5,84,0,0,861,862,3,164,82,0,862,863,5,133,0,0,863,864, - 3,152,76,0,864,867,3,50,25,0,865,866,5,82,0,0,866,868,3,164,82,0, - 867,865,1,0,0,0,867,868,1,0,0,0,868,869,1,0,0,0,869,870,3,92,46, - 0,870,871,5,134,0,0,871,923,1,0,0,0,872,873,5,44,0,0,873,874,3,162, - 81,0,874,875,5,84,0,0,875,876,3,164,82,0,876,877,5,133,0,0,877,879, - 3,162,81,0,878,880,3,28,14,0,879,878,1,0,0,0,879,880,1,0,0,0,880, - 882,1,0,0,0,881,883,3,76,38,0,882,881,1,0,0,0,882,883,1,0,0,0,883, - 886,1,0,0,0,884,885,5,18,0,0,885,887,5,53,0,0,886,884,1,0,0,0,886, - 887,1,0,0,0,887,888,1,0,0,0,888,889,5,134,0,0,889,923,1,0,0,0,890, - 891,5,7,0,0,891,892,3,162,81,0,892,893,5,84,0,0,893,894,3,164,82, - 0,894,895,5,133,0,0,895,896,3,162,81,0,896,897,5,53,0,0,897,898, - 3,146,73,0,898,899,5,134,0,0,899,923,1,0,0,0,900,901,5,51,0,0,901, - 902,3,162,81,0,902,903,5,84,0,0,903,904,3,164,82,0,904,905,5,133, - 0,0,905,908,3,162,81,0,906,907,5,53,0,0,907,909,3,146,73,0,908,906, - 1,0,0,0,908,909,1,0,0,0,909,910,1,0,0,0,910,911,5,134,0,0,911,923, - 1,0,0,0,912,913,5,22,0,0,913,914,3,162,81,0,914,915,5,84,0,0,915, - 916,3,164,82,0,916,917,5,133,0,0,917,918,3,162,81,0,918,919,5,136, - 0,0,919,920,3,162,81,0,920,921,5,134,0,0,921,923,1,0,0,0,922,840, - 1,0,0,0,922,849,1,0,0,0,922,858,1,0,0,0,922,872,1,0,0,0,922,890, - 1,0,0,0,922,900,1,0,0,0,922,912,1,0,0,0,923,91,1,0,0,0,924,925,5, - 139,0,0,925,930,3,94,47,0,926,927,5,135,0,0,927,929,3,94,47,0,928, - 926,1,0,0,0,929,932,1,0,0,0,930,928,1,0,0,0,930,931,1,0,0,0,931, - 933,1,0,0,0,932,930,1,0,0,0,933,934,5,140,0,0,934,93,1,0,0,0,935, - 936,7,3,0,0,936,95,1,0,0,0,937,938,5,60,0,0,938,939,3,98,49,0,939, - 97,1,0,0,0,940,943,3,100,50,0,941,943,3,104,52,0,942,940,1,0,0,0, - 942,941,1,0,0,0,943,99,1,0,0,0,944,945,5,61,0,0,945,946,3,162,81, - 0,946,947,5,84,0,0,947,948,3,164,82,0,948,949,5,71,0,0,949,950,3, - 162,81,0,950,951,5,133,0,0,951,952,3,146,73,0,952,953,5,72,0,0,953, - 956,3,102,51,0,954,955,5,73,0,0,955,957,3,154,77,0,956,954,1,0,0, - 0,956,957,1,0,0,0,957,958,1,0,0,0,958,959,5,134,0,0,959,101,1,0, - 0,0,960,967,5,106,0,0,961,962,5,107,0,0,962,963,5,141,0,0,963,964, - 3,146,73,0,964,965,5,142,0,0,965,967,1,0,0,0,966,960,1,0,0,0,966, - 961,1,0,0,0,967,103,1,0,0,0,968,969,5,62,0,0,969,970,3,162,81,0, - 970,971,5,84,0,0,971,972,3,164,82,0,972,973,5,137,0,0,973,974,3, - 106,53,0,974,975,3,106,53,0,975,976,5,138,0,0,976,105,1,0,0,0,977, - 978,3,50,25,0,978,979,5,63,0,0,979,980,3,162,81,0,980,981,5,84,0, - 0,981,982,3,164,82,0,982,984,3,152,76,0,983,985,5,112,0,0,984,983, - 1,0,0,0,984,985,1,0,0,0,985,988,1,0,0,0,986,987,5,79,0,0,987,989, - 3,164,82,0,988,986,1,0,0,0,988,989,1,0,0,0,989,991,1,0,0,0,990,992, - 5,81,0,0,991,990,1,0,0,0,991,992,1,0,0,0,992,995,1,0,0,0,993,994, - 5,82,0,0,994,996,3,164,82,0,995,993,1,0,0,0,995,996,1,0,0,0,996, - 998,1,0,0,0,997,999,5,83,0,0,998,997,1,0,0,0,998,999,1,0,0,0,999, - 1000,1,0,0,0,1000,1001,5,134,0,0,1001,107,1,0,0,0,1002,1004,5,54, - 0,0,1003,1005,3,22,11,0,1004,1003,1,0,0,0,1004,1005,1,0,0,0,1005, - 1006,1,0,0,0,1006,1008,3,162,81,0,1007,1009,3,110,55,0,1008,1007, - 1,0,0,0,1008,1009,1,0,0,0,1009,1010,1,0,0,0,1010,1011,5,55,0,0,1011, - 1013,3,162,81,0,1012,1014,3,28,14,0,1013,1012,1,0,0,0,1013,1014, - 1,0,0,0,1014,1017,1,0,0,0,1015,1016,5,84,0,0,1016,1018,3,164,82, - 0,1017,1015,1,0,0,0,1017,1018,1,0,0,0,1018,1021,1,0,0,0,1019,1020, - 5,78,0,0,1020,1022,5,147,0,0,1021,1019,1,0,0,0,1021,1022,1,0,0,0, - 1022,1023,1,0,0,0,1023,1027,5,137,0,0,1024,1026,3,112,56,0,1025, - 1024,1,0,0,0,1026,1029,1,0,0,0,1027,1025,1,0,0,0,1027,1028,1,0,0, - 0,1028,1030,1,0,0,0,1029,1027,1,0,0,0,1030,1031,5,138,0,0,1031,109, - 1,0,0,0,1032,1033,3,28,14,0,1033,111,1,0,0,0,1034,1035,5,59,0,0, - 1035,1042,3,98,49,0,1036,1042,3,126,63,0,1037,1042,3,122,61,0,1038, - 1042,3,116,58,0,1039,1042,3,124,62,0,1040,1042,3,114,57,0,1041,1034, - 1,0,0,0,1041,1036,1,0,0,0,1041,1037,1,0,0,0,1041,1038,1,0,0,0,1041, - 1039,1,0,0,0,1041,1040,1,0,0,0,1042,113,1,0,0,0,1043,1044,5,56,0, - 0,1044,1045,3,162,81,0,1045,1046,5,58,0,0,1046,1047,3,162,81,0,1047, - 1048,5,136,0,0,1048,1049,3,162,81,0,1049,1050,5,134,0,0,1050,115, - 1,0,0,0,1051,1052,5,8,0,0,1052,1056,5,137,0,0,1053,1055,3,118,59, - 0,1054,1053,1,0,0,0,1055,1058,1,0,0,0,1056,1054,1,0,0,0,1056,1057, - 1,0,0,0,1057,1059,1,0,0,0,1058,1056,1,0,0,0,1059,1060,5,138,0,0, - 1060,1061,5,134,0,0,1061,117,1,0,0,0,1062,1063,3,162,81,0,1063,1064, - 5,58,0,0,1064,1065,5,61,0,0,1065,1066,3,162,81,0,1066,1067,5,134, - 0,0,1067,1077,1,0,0,0,1068,1069,3,162,81,0,1069,1070,5,58,0,0,1070, - 1071,5,62,0,0,1071,1072,3,162,81,0,1072,1073,5,136,0,0,1073,1074, - 3,162,81,0,1074,1075,5,134,0,0,1075,1077,1,0,0,0,1076,1062,1,0,0, - 0,1076,1068,1,0,0,0,1077,119,1,0,0,0,1078,1079,3,26,13,0,1079,1080, - 5,18,0,0,1080,1085,5,53,0,0,1081,1082,5,136,0,0,1082,1084,3,162, - 81,0,1083,1081,1,0,0,0,1084,1087,1,0,0,0,1085,1083,1,0,0,0,1085, - 1086,1,0,0,0,1086,1088,1,0,0,0,1087,1085,1,0,0,0,1088,1089,5,134, - 0,0,1089,121,1,0,0,0,1090,1091,5,56,0,0,1091,1092,3,162,81,0,1092, - 1093,5,58,0,0,1093,1094,5,61,0,0,1094,1095,3,162,81,0,1095,1096, - 5,134,0,0,1096,123,1,0,0,0,1097,1098,5,68,0,0,1098,1099,3,162,81, - 0,1099,1100,5,69,0,0,1100,1101,5,70,0,0,1101,1102,5,65,0,0,1102, - 1103,5,51,0,0,1103,1104,3,162,81,0,1104,1105,5,67,0,0,1105,1106, - 5,62,0,0,1106,1107,3,162,81,0,1107,1108,5,136,0,0,1108,1109,3,162, - 81,0,1109,1110,5,134,0,0,1110,125,1,0,0,0,1111,1112,5,56,0,0,1112, - 1113,3,128,64,0,1113,1114,5,58,0,0,1114,1117,3,132,66,0,1115,1116, - 5,34,0,0,1116,1118,3,164,82,0,1117,1115,1,0,0,0,1117,1118,1,0,0, - 0,1118,1119,1,0,0,0,1119,1120,5,134,0,0,1120,127,1,0,0,0,1121,1122, - 3,162,81,0,1122,1123,5,136,0,0,1123,1124,3,130,65,0,1124,129,1,0, - 0,0,1125,1138,3,162,81,0,1126,1138,5,101,0,0,1127,1138,5,91,0,0, - 1128,1138,5,92,0,0,1129,1138,5,1,0,0,1130,1138,5,98,0,0,1131,1138, - 5,99,0,0,1132,1138,5,100,0,0,1133,1138,5,102,0,0,1134,1138,5,103, - 0,0,1135,1138,5,104,0,0,1136,1138,5,105,0,0,1137,1125,1,0,0,0,1137, - 1126,1,0,0,0,1137,1127,1,0,0,0,1137,1128,1,0,0,0,1137,1129,1,0,0, - 0,1137,1130,1,0,0,0,1137,1131,1,0,0,0,1137,1132,1,0,0,0,1137,1133, - 1,0,0,0,1137,1134,1,0,0,0,1137,1135,1,0,0,0,1137,1136,1,0,0,0,1138, - 131,1,0,0,0,1139,1140,5,80,0,0,1140,1141,5,136,0,0,1141,1176,3,162, - 81,0,1142,1143,5,61,0,0,1143,1144,3,162,81,0,1144,1145,5,136,0,0, - 1145,1146,3,136,68,0,1146,1176,1,0,0,0,1147,1148,5,62,0,0,1148,1149, - 3,162,81,0,1149,1150,5,136,0,0,1150,1151,3,162,81,0,1151,1152,5, - 136,0,0,1152,1153,3,138,69,0,1153,1176,1,0,0,0,1154,1155,5,44,0, - 0,1155,1157,3,162,81,0,1156,1158,3,28,14,0,1157,1156,1,0,0,0,1157, - 1158,1,0,0,0,1158,1159,1,0,0,0,1159,1160,5,136,0,0,1160,1161,3,128, - 64,0,1161,1176,1,0,0,0,1162,1163,5,46,0,0,1163,1164,3,162,81,0,1164, - 1165,5,136,0,0,1165,1167,3,162,81,0,1166,1168,3,28,14,0,1167,1166, - 1,0,0,0,1167,1168,1,0,0,0,1168,1170,1,0,0,0,1169,1171,3,140,70,0, - 1170,1169,1,0,0,0,1170,1171,1,0,0,0,1171,1173,1,0,0,0,1172,1174, - 3,134,67,0,1173,1172,1,0,0,0,1173,1174,1,0,0,0,1174,1176,1,0,0,0, - 1175,1139,1,0,0,0,1175,1142,1,0,0,0,1175,1147,1,0,0,0,1175,1154, - 1,0,0,0,1175,1162,1,0,0,0,1176,133,1,0,0,0,1177,1178,5,66,0,0,1178, - 1179,3,140,70,0,1179,135,1,0,0,0,1180,1181,7,4,0,0,1181,137,1,0, - 0,0,1182,1183,7,5,0,0,1183,139,1,0,0,0,1184,1185,5,64,0,0,1185,1189, - 5,137,0,0,1186,1188,3,142,71,0,1187,1186,1,0,0,0,1188,1191,1,0,0, - 0,1189,1187,1,0,0,0,1189,1190,1,0,0,0,1190,1192,1,0,0,0,1191,1189, - 1,0,0,0,1192,1193,5,138,0,0,1193,141,1,0,0,0,1194,1195,3,162,81, - 0,1195,1196,5,58,0,0,1196,1197,5,9,0,0,1197,1198,5,23,0,0,1198,1199, - 5,139,0,0,1199,1200,3,86,43,0,1200,1201,5,140,0,0,1201,1202,5,134, - 0,0,1202,1293,1,0,0,0,1203,1204,3,162,81,0,1204,1205,5,58,0,0,1205, - 1206,5,61,0,0,1206,1213,3,162,81,0,1207,1208,5,67,0,0,1208,1209, - 5,62,0,0,1209,1210,3,162,81,0,1210,1211,5,136,0,0,1211,1212,3,162, - 81,0,1212,1214,1,0,0,0,1213,1207,1,0,0,0,1213,1214,1,0,0,0,1214, - 1215,1,0,0,0,1215,1216,5,134,0,0,1216,1293,1,0,0,0,1217,1218,3,162, - 81,0,1218,1219,5,58,0,0,1219,1220,5,62,0,0,1220,1221,3,162,81,0, - 1221,1222,5,136,0,0,1222,1229,3,162,81,0,1223,1224,5,67,0,0,1224, - 1225,5,62,0,0,1225,1226,3,162,81,0,1226,1227,5,136,0,0,1227,1228, - 3,162,81,0,1228,1230,1,0,0,0,1229,1223,1,0,0,0,1229,1230,1,0,0,0, - 1230,1231,1,0,0,0,1231,1232,5,134,0,0,1232,1293,1,0,0,0,1233,1234, - 3,162,81,0,1234,1235,5,58,0,0,1235,1236,5,44,0,0,1236,1238,3,162, - 81,0,1237,1239,3,28,14,0,1238,1237,1,0,0,0,1238,1239,1,0,0,0,1239, - 1248,1,0,0,0,1240,1241,5,67,0,0,1241,1242,5,62,0,0,1242,1243,3,162, - 81,0,1243,1244,5,136,0,0,1244,1245,3,162,81,0,1245,1249,1,0,0,0, - 1246,1247,5,18,0,0,1247,1249,5,53,0,0,1248,1240,1,0,0,0,1248,1246, - 1,0,0,0,1248,1249,1,0,0,0,1249,1250,1,0,0,0,1250,1251,5,134,0,0, - 1251,1293,1,0,0,0,1252,1253,3,162,81,0,1253,1254,5,58,0,0,1254,1255, - 5,7,0,0,1255,1256,3,162,81,0,1256,1257,5,64,0,0,1257,1261,5,137, - 0,0,1258,1260,3,120,60,0,1259,1258,1,0,0,0,1260,1263,1,0,0,0,1261, - 1259,1,0,0,0,1261,1262,1,0,0,0,1262,1264,1,0,0,0,1263,1261,1,0,0, - 0,1264,1265,5,138,0,0,1265,1266,5,134,0,0,1266,1293,1,0,0,0,1267, - 1268,3,162,81,0,1268,1269,5,58,0,0,1269,1270,5,51,0,0,1270,1271, - 3,162,81,0,1271,1272,5,134,0,0,1272,1293,1,0,0,0,1273,1274,3,162, - 81,0,1274,1276,5,58,0,0,1275,1277,5,9,0,0,1276,1275,1,0,0,0,1276, - 1277,1,0,0,0,1277,1278,1,0,0,0,1278,1279,5,22,0,0,1279,1280,3,162, - 81,0,1280,1281,5,136,0,0,1281,1288,3,162,81,0,1282,1283,5,67,0,0, - 1283,1284,5,62,0,0,1284,1285,3,162,81,0,1285,1286,5,136,0,0,1286, - 1287,3,162,81,0,1287,1289,1,0,0,0,1288,1282,1,0,0,0,1288,1289,1, - 0,0,0,1289,1290,1,0,0,0,1290,1291,5,134,0,0,1291,1293,1,0,0,0,1292, - 1194,1,0,0,0,1292,1203,1,0,0,0,1292,1217,1,0,0,0,1292,1233,1,0,0, - 0,1292,1252,1,0,0,0,1292,1267,1,0,0,0,1292,1273,1,0,0,0,1293,143, - 1,0,0,0,1294,1295,5,51,0,0,1295,1296,3,162,81,0,1296,1297,5,58,0, - 0,1297,1298,3,162,81,0,1298,1299,5,136,0,0,1299,1301,3,162,81,0, - 1300,1302,3,140,70,0,1301,1300,1,0,0,0,1301,1302,1,0,0,0,1302,1303, - 1,0,0,0,1303,1304,5,134,0,0,1304,145,1,0,0,0,1305,1352,3,150,75, - 0,1306,1352,5,113,0,0,1307,1352,5,114,0,0,1308,1309,5,115,0,0,1309, - 1352,3,164,82,0,1310,1311,5,116,0,0,1311,1312,5,143,0,0,1312,1313, - 3,162,81,0,1313,1314,5,144,0,0,1314,1352,1,0,0,0,1315,1316,5,117, - 0,0,1316,1317,5,143,0,0,1317,1319,3,162,81,0,1318,1320,3,28,14,0, - 1319,1318,1,0,0,0,1319,1320,1,0,0,0,1320,1321,1,0,0,0,1321,1322, - 5,144,0,0,1322,1352,1,0,0,0,1323,1324,5,39,0,0,1324,1325,5,143,0, - 0,1325,1326,3,162,81,0,1326,1327,5,144,0,0,1327,1352,1,0,0,0,1328, - 1329,5,118,0,0,1329,1330,5,143,0,0,1330,1331,3,146,73,0,1331,1332, - 5,144,0,0,1332,1352,1,0,0,0,1333,1334,5,119,0,0,1334,1335,5,143, - 0,0,1335,1336,3,146,73,0,1336,1337,5,144,0,0,1337,1352,1,0,0,0,1338, - 1339,5,120,0,0,1339,1343,5,137,0,0,1340,1342,3,148,74,0,1341,1340, - 1,0,0,0,1342,1345,1,0,0,0,1343,1341,1,0,0,0,1343,1344,1,0,0,0,1344, - 1346,1,0,0,0,1345,1343,1,0,0,0,1346,1352,5,138,0,0,1347,1349,3,162, - 81,0,1348,1350,3,28,14,0,1349,1348,1,0,0,0,1349,1350,1,0,0,0,1350, - 1352,1,0,0,0,1351,1305,1,0,0,0,1351,1306,1,0,0,0,1351,1307,1,0,0, - 0,1351,1308,1,0,0,0,1351,1310,1,0,0,0,1351,1315,1,0,0,0,1351,1323, - 1,0,0,0,1351,1328,1,0,0,0,1351,1333,1,0,0,0,1351,1338,1,0,0,0,1351, - 1347,1,0,0,0,1352,147,1,0,0,0,1353,1354,3,162,81,0,1354,1355,5,133, - 0,0,1355,1356,3,146,73,0,1356,1357,5,134,0,0,1357,149,1,0,0,0,1358, - 1359,7,6,0,0,1359,151,1,0,0,0,1360,1361,7,7,0,0,1361,153,1,0,0,0, - 1362,1371,3,164,82,0,1363,1371,5,147,0,0,1364,1371,5,148,0,0,1365, - 1371,5,129,0,0,1366,1371,5,130,0,0,1367,1371,5,131,0,0,1368,1371, - 3,156,78,0,1369,1371,3,160,80,0,1370,1362,1,0,0,0,1370,1363,1,0, - 0,0,1370,1364,1,0,0,0,1370,1365,1,0,0,0,1370,1366,1,0,0,0,1370,1367, - 1,0,0,0,1370,1368,1,0,0,0,1370,1369,1,0,0,0,1371,155,1,0,0,0,1372, - 1381,5,137,0,0,1373,1378,3,158,79,0,1374,1375,5,135,0,0,1375,1377, - 3,158,79,0,1376,1374,1,0,0,0,1377,1380,1,0,0,0,1378,1376,1,0,0,0, - 1378,1379,1,0,0,0,1379,1382,1,0,0,0,1380,1378,1,0,0,0,1381,1373, - 1,0,0,0,1381,1382,1,0,0,0,1382,1383,1,0,0,0,1383,1384,5,138,0,0, - 1384,157,1,0,0,0,1385,1386,3,164,82,0,1386,1387,5,133,0,0,1387,1388, - 3,154,77,0,1388,159,1,0,0,0,1389,1398,5,139,0,0,1390,1395,3,154, - 77,0,1391,1392,5,135,0,0,1392,1394,3,154,77,0,1393,1391,1,0,0,0, - 1394,1397,1,0,0,0,1395,1393,1,0,0,0,1395,1396,1,0,0,0,1396,1399, - 1,0,0,0,1397,1395,1,0,0,0,1398,1390,1,0,0,0,1398,1399,1,0,0,0,1399, - 1400,1,0,0,0,1400,1401,5,140,0,0,1401,161,1,0,0,0,1402,1403,7,8, - 0,0,1403,163,1,0,0,0,1404,1405,5,150,0,0,1405,165,1,0,0,0,126,178, - 185,206,219,231,251,259,266,272,284,287,293,304,313,323,326,328, - 332,340,352,357,367,377,382,397,403,415,424,432,440,453,456,466, - 470,476,483,489,497,505,518,525,529,534,545,551,562,588,592,598, - 609,618,624,629,631,662,666,672,699,709,720,723,728,731,738,747, - 750,753,770,779,793,814,817,820,827,835,867,879,882,886,908,922, - 930,942,956,966,984,988,991,995,998,1004,1008,1013,1017,1021,1027, - 1041,1056,1076,1085,1117,1137,1157,1167,1170,1173,1175,1189,1213, - 1229,1238,1248,1261,1276,1288,1292,1301,1319,1343,1349,1351,1370, - 1378,1381,1395,1398 + 154,156,158,160,162,164,166,168,0,9,2,0,17,17,35,35,1,0,13,14,1, + 0,103,107,3,0,1,1,98,102,104,105,3,0,1,1,98,99,104,105,2,0,100,102, + 104,105,1,0,123,130,1,0,110,113,10,0,1,1,4,7,10,10,12,35,42,42,47, + 47,76,76,96,97,108,108,151,151,1560,0,182,1,0,0,0,2,184,1,0,0,0, + 4,194,1,0,0,0,6,198,1,0,0,0,8,223,1,0,0,0,10,235,1,0,0,0,12,237, + 1,0,0,0,14,244,1,0,0,0,16,255,1,0,0,0,18,257,1,0,0,0,20,270,1,0, + 0,0,22,302,1,0,0,0,24,332,1,0,0,0,26,334,1,0,0,0,28,338,1,0,0,0, + 30,356,1,0,0,0,32,358,1,0,0,0,34,371,1,0,0,0,36,373,1,0,0,0,38,386, + 1,0,0,0,40,407,1,0,0,0,42,457,1,0,0,0,44,460,1,0,0,0,46,485,1,0, + 0,0,48,522,1,0,0,0,50,533,1,0,0,0,52,538,1,0,0,0,54,566,1,0,0,0, + 56,568,1,0,0,0,58,578,1,0,0,0,60,590,1,0,0,0,62,637,1,0,0,0,64,703, + 1,0,0,0,66,705,1,0,0,0,68,710,1,0,0,0,70,742,1,0,0,0,72,767,1,0, + 0,0,74,771,1,0,0,0,76,786,1,0,0,0,78,788,1,0,0,0,80,800,1,0,0,0, + 82,813,1,0,0,0,84,816,1,0,0,0,86,836,1,0,0,0,88,838,1,0,0,0,90,846, + 1,0,0,0,92,938,1,0,0,0,94,940,1,0,0,0,96,951,1,0,0,0,98,953,1,0, + 0,0,100,958,1,0,0,0,102,960,1,0,0,0,104,982,1,0,0,0,106,984,1,0, + 0,0,108,993,1,0,0,0,110,1018,1,0,0,0,112,1048,1,0,0,0,114,1057,1, + 0,0,0,116,1059,1,0,0,0,118,1067,1,0,0,0,120,1092,1,0,0,0,122,1094, + 1,0,0,0,124,1106,1,0,0,0,126,1113,1,0,0,0,128,1127,1,0,0,0,130,1137, + 1,0,0,0,132,1153,1,0,0,0,134,1191,1,0,0,0,136,1193,1,0,0,0,138,1196, + 1,0,0,0,140,1198,1,0,0,0,142,1200,1,0,0,0,144,1308,1,0,0,0,146,1310, + 1,0,0,0,148,1378,1,0,0,0,150,1380,1,0,0,0,152,1385,1,0,0,0,154,1392, + 1,0,0,0,156,1394,1,0,0,0,158,1404,1,0,0,0,160,1406,1,0,0,0,162,1419, + 1,0,0,0,164,1423,1,0,0,0,166,1436,1,0,0,0,168,1438,1,0,0,0,170,171, + 3,6,3,0,171,172,5,0,0,1,172,183,1,0,0,0,173,174,3,20,10,0,174,175, + 5,0,0,1,175,183,1,0,0,0,176,177,3,52,26,0,177,178,5,0,0,1,178,183, + 1,0,0,0,179,180,3,2,1,0,180,181,5,0,0,1,181,183,1,0,0,0,182,170, + 1,0,0,0,182,173,1,0,0,0,182,176,1,0,0,0,182,179,1,0,0,0,183,1,1, + 0,0,0,184,185,5,42,0,0,185,189,5,139,0,0,186,188,3,8,4,0,187,186, + 1,0,0,0,188,191,1,0,0,0,189,187,1,0,0,0,189,190,1,0,0,0,190,192, + 1,0,0,0,191,189,1,0,0,0,192,193,5,140,0,0,193,3,1,0,0,0,194,195, + 5,43,0,0,195,196,3,168,84,0,196,197,5,136,0,0,197,5,1,0,0,0,198, + 199,5,11,0,0,199,200,3,166,83,0,200,201,5,86,0,0,201,202,3,168,84, + 0,202,203,5,79,0,0,203,204,3,168,84,0,204,205,5,78,0,0,205,206,3, + 168,84,0,206,210,5,139,0,0,207,209,3,8,4,0,208,207,1,0,0,0,209,212, + 1,0,0,0,210,208,1,0,0,0,210,211,1,0,0,0,211,213,1,0,0,0,212,210, + 1,0,0,0,213,214,5,140,0,0,214,7,1,0,0,0,215,224,3,4,2,0,216,224, + 3,18,9,0,217,224,3,10,5,0,218,224,3,98,49,0,219,224,3,110,55,0,220, + 224,3,146,73,0,221,224,3,58,29,0,222,224,3,32,16,0,223,215,1,0,0, + 0,223,216,1,0,0,0,223,217,1,0,0,0,223,218,1,0,0,0,223,219,1,0,0, + 0,223,220,1,0,0,0,223,221,1,0,0,0,223,222,1,0,0,0,224,9,1,0,0,0, + 225,226,5,43,0,0,226,227,5,46,0,0,227,228,3,166,83,0,228,229,5,136, + 0,0,229,236,1,0,0,0,230,231,5,43,0,0,231,232,5,48,0,0,232,233,3, + 166,83,0,233,234,5,136,0,0,234,236,1,0,0,0,235,225,1,0,0,0,235,230, + 1,0,0,0,236,11,1,0,0,0,237,238,5,44,0,0,238,239,5,45,0,0,239,240, + 3,166,83,0,240,241,5,86,0,0,241,242,3,168,84,0,242,243,5,136,0,0, + 243,13,1,0,0,0,244,245,5,44,0,0,245,246,5,46,0,0,246,247,3,166,83, + 0,247,248,5,79,0,0,248,249,3,168,84,0,249,250,5,136,0,0,250,15,1, + 0,0,0,251,256,3,10,5,0,252,256,3,12,6,0,253,256,3,14,7,0,254,256, + 3,32,16,0,255,251,1,0,0,0,255,252,1,0,0,0,255,253,1,0,0,0,255,254, + 1,0,0,0,256,17,1,0,0,0,257,258,5,45,0,0,258,259,3,166,83,0,259,260, + 5,86,0,0,260,263,3,168,84,0,261,262,5,87,0,0,262,264,3,168,84,0, + 263,261,1,0,0,0,263,264,1,0,0,0,264,265,1,0,0,0,265,266,5,136,0, + 0,266,19,1,0,0,0,267,269,3,16,8,0,268,267,1,0,0,0,269,272,1,0,0, + 0,270,268,1,0,0,0,270,271,1,0,0,0,271,273,1,0,0,0,272,270,1,0,0, + 0,273,274,5,46,0,0,274,276,3,166,83,0,275,277,3,22,11,0,276,275, + 1,0,0,0,276,277,1,0,0,0,277,278,1,0,0,0,278,279,5,86,0,0,279,280, + 3,168,84,0,280,281,5,79,0,0,281,291,3,168,84,0,282,283,5,91,0,0, + 283,288,3,26,13,0,284,285,5,137,0,0,285,287,3,26,13,0,286,284,1, + 0,0,0,287,290,1,0,0,0,288,286,1,0,0,0,288,289,1,0,0,0,289,292,1, + 0,0,0,290,288,1,0,0,0,291,282,1,0,0,0,291,292,1,0,0,0,292,293,1, + 0,0,0,293,297,5,139,0,0,294,296,3,34,17,0,295,294,1,0,0,0,296,299, + 1,0,0,0,297,295,1,0,0,0,297,298,1,0,0,0,298,300,1,0,0,0,299,297, + 1,0,0,0,300,301,5,140,0,0,301,21,1,0,0,0,302,303,5,145,0,0,303,308, + 3,24,12,0,304,305,5,137,0,0,305,307,3,24,12,0,306,304,1,0,0,0,307, + 310,1,0,0,0,308,306,1,0,0,0,308,309,1,0,0,0,309,311,1,0,0,0,310, + 308,1,0,0,0,311,312,5,146,0,0,312,23,1,0,0,0,313,314,5,49,0,0,314, + 317,3,166,83,0,315,316,5,135,0,0,316,318,5,39,0,0,317,315,1,0,0, + 0,317,318,1,0,0,0,318,333,1,0,0,0,319,320,5,38,0,0,320,330,3,166, + 83,0,321,322,5,40,0,0,322,327,3,26,13,0,323,324,5,147,0,0,324,326, + 3,26,13,0,325,323,1,0,0,0,326,329,1,0,0,0,327,325,1,0,0,0,327,328, + 1,0,0,0,328,331,1,0,0,0,329,327,1,0,0,0,330,321,1,0,0,0,330,331, + 1,0,0,0,331,333,1,0,0,0,332,313,1,0,0,0,332,319,1,0,0,0,333,25,1, + 0,0,0,334,336,3,166,83,0,335,337,3,28,14,0,336,335,1,0,0,0,336,337, + 1,0,0,0,337,27,1,0,0,0,338,339,5,145,0,0,339,344,3,30,15,0,340,341, + 5,137,0,0,341,343,3,30,15,0,342,340,1,0,0,0,343,346,1,0,0,0,344, + 342,1,0,0,0,344,345,1,0,0,0,345,347,1,0,0,0,346,344,1,0,0,0,347, + 348,5,146,0,0,348,29,1,0,0,0,349,350,5,45,0,0,350,357,3,166,83,0, + 351,352,5,46,0,0,352,357,3,26,13,0,353,354,5,38,0,0,354,357,3,166, + 83,0,355,357,3,148,74,0,356,349,1,0,0,0,356,351,1,0,0,0,356,353, + 1,0,0,0,356,355,1,0,0,0,357,31,1,0,0,0,358,359,5,37,0,0,359,361, + 3,166,83,0,360,362,3,22,11,0,361,360,1,0,0,0,361,362,1,0,0,0,362, + 363,1,0,0,0,363,364,5,148,0,0,364,365,3,148,74,0,365,366,5,136,0, + 0,366,33,1,0,0,0,367,372,3,40,20,0,368,372,3,44,22,0,369,372,3,38, + 19,0,370,372,3,36,18,0,371,367,1,0,0,0,371,368,1,0,0,0,371,369,1, + 0,0,0,371,370,1,0,0,0,372,35,1,0,0,0,373,374,5,2,0,0,374,375,3,166, + 83,0,375,376,5,86,0,0,376,377,3,168,84,0,377,378,5,3,0,0,378,381, + 3,168,84,0,379,380,5,5,0,0,380,382,3,50,25,0,381,379,1,0,0,0,381, + 382,1,0,0,0,382,383,1,0,0,0,383,384,5,136,0,0,384,37,1,0,0,0,385, + 387,5,59,0,0,386,385,1,0,0,0,386,387,1,0,0,0,387,388,1,0,0,0,388, + 389,5,51,0,0,389,390,3,166,83,0,390,391,5,86,0,0,391,392,3,168,84, + 0,392,393,5,135,0,0,393,394,3,148,74,0,394,395,5,134,0,0,395,396, + 3,148,74,0,396,397,5,139,0,0,397,398,5,103,0,0,398,399,5,86,0,0, + 399,401,3,168,84,0,400,402,3,76,38,0,401,400,1,0,0,0,401,402,1,0, + 0,0,402,403,1,0,0,0,403,404,5,136,0,0,404,405,5,140,0,0,405,39,1, + 0,0,0,406,408,3,46,23,0,407,406,1,0,0,0,407,408,1,0,0,0,408,409, + 1,0,0,0,409,410,5,49,0,0,410,411,3,166,83,0,411,412,5,86,0,0,412, + 413,3,168,84,0,413,414,5,135,0,0,414,415,3,148,74,0,415,419,5,139, + 0,0,416,418,3,42,21,0,417,416,1,0,0,0,418,421,1,0,0,0,419,417,1, + 0,0,0,419,420,1,0,0,0,420,422,1,0,0,0,421,419,1,0,0,0,422,423,5, + 140,0,0,423,41,1,0,0,0,424,425,5,93,0,0,425,426,5,86,0,0,426,428, + 3,168,84,0,427,429,3,76,38,0,428,427,1,0,0,0,428,429,1,0,0,0,429, + 430,1,0,0,0,430,431,5,136,0,0,431,458,1,0,0,0,432,433,5,94,0,0,433, + 434,5,86,0,0,434,436,3,168,84,0,435,437,3,76,38,0,436,435,1,0,0, + 0,436,437,1,0,0,0,437,438,1,0,0,0,438,439,5,136,0,0,439,458,1,0, + 0,0,440,441,5,1,0,0,441,442,5,86,0,0,442,444,3,168,84,0,443,445, + 3,76,38,0,444,443,1,0,0,0,444,445,1,0,0,0,445,446,1,0,0,0,446,447, + 5,136,0,0,447,458,1,0,0,0,448,449,5,95,0,0,449,450,5,96,0,0,450, + 451,5,86,0,0,451,452,3,168,84,0,452,453,5,97,0,0,453,454,5,86,0, + 0,454,455,3,168,84,0,455,456,5,136,0,0,456,458,1,0,0,0,457,424,1, + 0,0,0,457,432,1,0,0,0,457,440,1,0,0,0,457,448,1,0,0,0,458,43,1,0, + 0,0,459,461,3,46,23,0,460,459,1,0,0,0,460,461,1,0,0,0,461,462,1, + 0,0,0,462,463,5,50,0,0,463,464,3,166,83,0,464,465,5,86,0,0,465,466, + 3,168,84,0,466,467,5,135,0,0,467,468,3,156,78,0,468,470,3,50,25, + 0,469,471,5,114,0,0,470,469,1,0,0,0,470,471,1,0,0,0,471,474,1,0, + 0,0,472,473,5,84,0,0,473,475,3,168,84,0,474,472,1,0,0,0,474,475, + 1,0,0,0,475,476,1,0,0,0,476,480,5,139,0,0,477,479,3,48,24,0,478, + 477,1,0,0,0,479,482,1,0,0,0,480,478,1,0,0,0,480,481,1,0,0,0,481, + 483,1,0,0,0,482,480,1,0,0,0,483,484,5,140,0,0,484,45,1,0,0,0,485, + 487,5,34,0,0,486,488,7,0,0,0,487,486,1,0,0,0,487,488,1,0,0,0,488, + 47,1,0,0,0,489,490,5,100,0,0,490,491,5,86,0,0,491,493,3,168,84,0, + 492,494,3,76,38,0,493,492,1,0,0,0,493,494,1,0,0,0,494,495,1,0,0, + 0,495,496,5,136,0,0,496,523,1,0,0,0,497,498,5,101,0,0,498,499,5, + 86,0,0,499,501,3,168,84,0,500,502,3,76,38,0,501,500,1,0,0,0,501, + 502,1,0,0,0,502,503,1,0,0,0,503,504,5,136,0,0,504,523,1,0,0,0,505, + 506,5,102,0,0,506,507,5,86,0,0,507,509,3,168,84,0,508,510,3,76,38, + 0,509,508,1,0,0,0,509,510,1,0,0,0,510,511,1,0,0,0,511,512,5,136, + 0,0,512,523,1,0,0,0,513,514,5,95,0,0,514,515,5,96,0,0,515,516,5, + 86,0,0,516,517,3,168,84,0,517,518,5,97,0,0,518,519,5,86,0,0,519, + 520,3,168,84,0,520,521,5,136,0,0,521,523,1,0,0,0,522,489,1,0,0,0, + 522,497,1,0,0,0,522,505,1,0,0,0,522,513,1,0,0,0,523,49,1,0,0,0,524, + 525,5,45,0,0,525,534,3,166,83,0,526,527,5,46,0,0,527,529,3,166,83, + 0,528,530,3,28,14,0,529,528,1,0,0,0,529,530,1,0,0,0,530,534,1,0, + 0,0,531,532,5,38,0,0,532,534,3,166,83,0,533,524,1,0,0,0,533,526, + 1,0,0,0,533,531,1,0,0,0,534,51,1,0,0,0,535,537,3,16,8,0,536,535, + 1,0,0,0,537,540,1,0,0,0,538,536,1,0,0,0,538,539,1,0,0,0,539,541, + 1,0,0,0,540,538,1,0,0,0,541,542,5,48,0,0,542,543,3,166,83,0,543, + 544,5,86,0,0,544,545,3,168,84,0,545,546,5,79,0,0,546,549,3,168,84, + 0,547,548,5,80,0,0,548,550,5,149,0,0,549,547,1,0,0,0,549,550,1,0, + 0,0,550,551,1,0,0,0,551,555,5,139,0,0,552,554,3,54,27,0,553,552, + 1,0,0,0,554,557,1,0,0,0,555,553,1,0,0,0,555,556,1,0,0,0,556,558, + 1,0,0,0,557,555,1,0,0,0,558,559,5,140,0,0,559,53,1,0,0,0,560,567, + 3,68,34,0,561,567,3,70,35,0,562,567,3,80,40,0,563,567,3,60,30,0, + 564,567,3,62,31,0,565,567,3,56,28,0,566,560,1,0,0,0,566,561,1,0, + 0,0,566,562,1,0,0,0,566,563,1,0,0,0,566,564,1,0,0,0,566,565,1,0, + 0,0,567,55,1,0,0,0,568,569,5,2,0,0,569,570,3,166,83,0,570,571,5, + 86,0,0,571,572,3,168,84,0,572,573,5,40,0,0,573,574,3,26,13,0,574, + 575,5,138,0,0,575,576,3,166,83,0,576,577,5,136,0,0,577,57,1,0,0, + 0,578,579,5,4,0,0,579,580,3,166,83,0,580,581,5,86,0,0,581,582,3, + 168,84,0,582,583,5,6,0,0,583,584,3,26,13,0,584,585,5,67,0,0,585, + 586,3,166,83,0,586,587,5,138,0,0,587,588,3,166,83,0,588,589,5,136, + 0,0,589,59,1,0,0,0,590,592,5,24,0,0,591,593,5,42,0,0,592,591,1,0, + 0,0,592,593,1,0,0,0,593,594,1,0,0,0,594,596,3,166,83,0,595,597,3, + 22,11,0,596,595,1,0,0,0,596,597,1,0,0,0,597,598,1,0,0,0,598,599, + 5,86,0,0,599,600,3,168,84,0,600,602,5,27,0,0,601,603,5,11,0,0,602, + 601,1,0,0,0,602,603,1,0,0,0,603,604,1,0,0,0,604,605,3,26,13,0,605, + 606,5,28,0,0,606,635,3,168,84,0,607,608,5,51,0,0,608,609,3,168,84, + 0,609,613,5,139,0,0,610,612,3,64,32,0,611,610,1,0,0,0,612,615,1, + 0,0,0,613,611,1,0,0,0,613,614,1,0,0,0,614,616,1,0,0,0,615,613,1, + 0,0,0,616,617,5,140,0,0,617,636,1,0,0,0,618,619,5,42,0,0,619,622, + 3,168,84,0,620,621,5,51,0,0,621,623,3,168,84,0,622,620,1,0,0,0,622, + 623,1,0,0,0,623,633,1,0,0,0,624,628,5,139,0,0,625,627,3,64,32,0, + 626,625,1,0,0,0,627,630,1,0,0,0,628,626,1,0,0,0,628,629,1,0,0,0, + 629,631,1,0,0,0,630,628,1,0,0,0,631,634,5,140,0,0,632,634,5,136, + 0,0,633,624,1,0,0,0,633,632,1,0,0,0,634,636,1,0,0,0,635,607,1,0, + 0,0,635,618,1,0,0,0,636,61,1,0,0,0,637,638,5,24,0,0,638,639,3,166, + 83,0,639,640,5,86,0,0,640,641,3,168,84,0,641,642,5,26,0,0,642,643, + 3,166,83,0,643,644,3,28,14,0,644,645,5,136,0,0,645,63,1,0,0,0,646, + 647,5,18,0,0,647,704,5,136,0,0,648,649,5,19,0,0,649,650,5,20,0,0, + 650,651,3,166,83,0,651,652,5,136,0,0,652,704,1,0,0,0,653,654,5,29, + 0,0,654,655,3,168,84,0,655,656,5,136,0,0,656,704,1,0,0,0,657,658, + 5,29,0,0,658,659,3,166,83,0,659,660,5,138,0,0,660,670,3,166,83,0, + 661,662,5,66,0,0,662,666,5,139,0,0,663,665,3,66,33,0,664,663,1,0, + 0,0,665,668,1,0,0,0,666,664,1,0,0,0,666,667,1,0,0,0,667,669,1,0, + 0,0,668,666,1,0,0,0,669,671,5,140,0,0,670,661,1,0,0,0,670,671,1, + 0,0,0,671,672,1,0,0,0,672,673,5,136,0,0,673,704,1,0,0,0,674,676, + 5,30,0,0,675,677,5,38,0,0,676,675,1,0,0,0,676,677,1,0,0,0,677,678, + 1,0,0,0,678,679,3,166,83,0,679,680,5,57,0,0,680,681,3,26,13,0,681, + 682,5,136,0,0,682,704,1,0,0,0,683,684,5,31,0,0,684,685,3,166,83, + 0,685,686,5,149,0,0,686,687,5,136,0,0,687,704,1,0,0,0,688,689,5, + 32,0,0,689,690,3,26,13,0,690,691,5,138,0,0,691,692,3,166,83,0,692, + 693,3,166,83,0,693,694,3,168,84,0,694,695,5,136,0,0,695,704,1,0, + 0,0,696,697,5,95,0,0,697,704,5,136,0,0,698,699,5,33,0,0,699,700, + 5,149,0,0,700,701,3,168,84,0,701,702,5,136,0,0,702,704,1,0,0,0,703, + 646,1,0,0,0,703,648,1,0,0,0,703,653,1,0,0,0,703,657,1,0,0,0,703, + 674,1,0,0,0,703,683,1,0,0,0,703,688,1,0,0,0,703,696,1,0,0,0,703, + 698,1,0,0,0,704,65,1,0,0,0,705,706,3,166,83,0,706,707,5,60,0,0,707, + 708,3,166,83,0,708,709,5,136,0,0,709,67,1,0,0,0,710,711,5,51,0,0, + 711,713,3,166,83,0,712,714,3,22,11,0,713,712,1,0,0,0,713,714,1,0, + 0,0,714,715,1,0,0,0,715,716,5,86,0,0,716,717,3,168,84,0,717,718, + 5,135,0,0,718,719,3,148,74,0,719,720,5,134,0,0,720,721,3,148,74, + 0,721,722,5,88,0,0,722,724,3,84,42,0,723,725,3,76,38,0,724,723,1, + 0,0,0,724,725,1,0,0,0,725,727,1,0,0,0,726,728,3,82,41,0,727,726, + 1,0,0,0,727,728,1,0,0,0,728,729,1,0,0,0,729,730,5,90,0,0,730,732, + 3,86,43,0,731,733,3,90,45,0,732,731,1,0,0,0,732,733,1,0,0,0,733, + 735,1,0,0,0,734,736,3,74,37,0,735,734,1,0,0,0,735,736,1,0,0,0,736, + 738,1,0,0,0,737,739,3,72,36,0,738,737,1,0,0,0,738,739,1,0,0,0,739, + 740,1,0,0,0,740,741,5,136,0,0,741,69,1,0,0,0,742,743,5,52,0,0,743, + 745,3,166,83,0,744,746,3,22,11,0,745,744,1,0,0,0,745,746,1,0,0,0, + 746,747,1,0,0,0,747,748,5,86,0,0,748,749,3,168,84,0,749,750,5,135, + 0,0,750,751,3,148,74,0,751,752,5,134,0,0,752,754,3,148,74,0,753, + 755,3,76,38,0,754,753,1,0,0,0,754,755,1,0,0,0,755,757,1,0,0,0,756, + 758,3,90,45,0,757,756,1,0,0,0,757,758,1,0,0,0,758,760,1,0,0,0,759, + 761,3,74,37,0,760,759,1,0,0,0,760,761,1,0,0,0,761,763,1,0,0,0,762, + 764,3,72,36,0,763,762,1,0,0,0,763,764,1,0,0,0,764,765,1,0,0,0,765, + 766,5,136,0,0,766,71,1,0,0,0,767,768,5,68,0,0,768,769,5,67,0,0,769, + 770,3,166,83,0,770,73,1,0,0,0,771,772,5,9,0,0,772,773,5,7,0,0,773, + 774,3,166,83,0,774,775,5,67,0,0,775,776,3,168,84,0,776,75,1,0,0, + 0,777,778,5,12,0,0,778,787,5,15,0,0,779,780,5,12,0,0,780,781,7,1, + 0,0,781,782,5,16,0,0,782,783,5,141,0,0,783,784,3,88,44,0,784,785, + 5,142,0,0,785,787,1,0,0,0,786,777,1,0,0,0,786,779,1,0,0,0,787,77, + 1,0,0,0,788,789,5,67,0,0,789,790,5,141,0,0,790,795,3,130,65,0,791, + 792,5,137,0,0,792,794,3,130,65,0,793,791,1,0,0,0,794,797,1,0,0,0, + 795,793,1,0,0,0,795,796,1,0,0,0,796,798,1,0,0,0,797,795,1,0,0,0, + 798,799,5,142,0,0,799,79,1,0,0,0,800,801,5,53,0,0,801,802,3,166, + 83,0,802,803,5,86,0,0,803,804,3,168,84,0,804,805,5,54,0,0,805,806, + 3,166,83,0,806,807,5,135,0,0,807,809,3,148,74,0,808,810,3,90,45, + 0,809,808,1,0,0,0,809,810,1,0,0,0,810,811,1,0,0,0,811,812,5,136, + 0,0,812,81,1,0,0,0,813,814,5,89,0,0,814,815,3,148,74,0,815,83,1, + 0,0,0,816,817,7,2,0,0,817,85,1,0,0,0,818,837,5,92,0,0,819,820,5, + 45,0,0,820,837,3,166,83,0,821,822,5,38,0,0,822,837,3,166,83,0,823, + 824,5,47,0,0,824,833,5,141,0,0,825,830,3,26,13,0,826,827,5,137,0, + 0,827,829,3,26,13,0,828,826,1,0,0,0,829,832,1,0,0,0,830,828,1,0, + 0,0,830,831,1,0,0,0,831,834,1,0,0,0,832,830,1,0,0,0,833,825,1,0, + 0,0,833,834,1,0,0,0,834,835,1,0,0,0,835,837,5,142,0,0,836,818,1, + 0,0,0,836,819,1,0,0,0,836,821,1,0,0,0,836,823,1,0,0,0,837,87,1,0, + 0,0,838,843,3,166,83,0,839,840,5,137,0,0,840,842,3,166,83,0,841, + 839,1,0,0,0,842,845,1,0,0,0,843,841,1,0,0,0,843,844,1,0,0,0,844, + 89,1,0,0,0,845,843,1,0,0,0,846,847,5,91,0,0,847,851,5,139,0,0,848, + 850,3,92,46,0,849,848,1,0,0,0,850,853,1,0,0,0,851,849,1,0,0,0,851, + 852,1,0,0,0,852,854,1,0,0,0,853,851,1,0,0,0,854,855,5,140,0,0,855, + 91,1,0,0,0,856,857,5,25,0,0,857,858,3,166,83,0,858,859,5,86,0,0, + 859,860,3,168,84,0,860,861,5,141,0,0,861,862,3,88,44,0,862,863,5, + 142,0,0,863,864,5,136,0,0,864,939,1,0,0,0,865,866,5,63,0,0,866,867, + 3,166,83,0,867,868,5,86,0,0,868,869,3,168,84,0,869,870,5,135,0,0, + 870,871,3,148,74,0,871,872,3,94,47,0,872,873,5,136,0,0,873,939,1, + 0,0,0,874,875,5,64,0,0,875,876,3,166,83,0,876,877,5,86,0,0,877,878, + 3,168,84,0,878,879,5,135,0,0,879,880,3,156,78,0,880,883,3,50,25, + 0,881,882,5,84,0,0,882,884,3,168,84,0,883,881,1,0,0,0,883,884,1, + 0,0,0,884,885,1,0,0,0,885,886,3,94,47,0,886,887,5,136,0,0,887,939, + 1,0,0,0,888,889,5,46,0,0,889,890,3,166,83,0,890,891,5,86,0,0,891, + 892,3,168,84,0,892,893,5,135,0,0,893,895,3,166,83,0,894,896,3,28, + 14,0,895,894,1,0,0,0,895,896,1,0,0,0,896,898,1,0,0,0,897,899,3,78, + 39,0,898,897,1,0,0,0,898,899,1,0,0,0,899,902,1,0,0,0,900,901,5,20, + 0,0,901,903,5,55,0,0,902,900,1,0,0,0,902,903,1,0,0,0,903,904,1,0, + 0,0,904,905,5,136,0,0,905,939,1,0,0,0,906,907,5,7,0,0,907,908,3, + 166,83,0,908,909,5,86,0,0,909,910,3,168,84,0,910,911,5,135,0,0,911, + 912,3,166,83,0,912,913,5,55,0,0,913,914,3,148,74,0,914,915,5,136, + 0,0,915,939,1,0,0,0,916,917,5,53,0,0,917,918,3,166,83,0,918,919, + 5,86,0,0,919,920,3,168,84,0,920,921,5,135,0,0,921,924,3,166,83,0, + 922,923,5,55,0,0,923,925,3,148,74,0,924,922,1,0,0,0,924,925,1,0, + 0,0,925,926,1,0,0,0,926,927,5,136,0,0,927,939,1,0,0,0,928,929,5, + 24,0,0,929,930,3,166,83,0,930,931,5,86,0,0,931,932,3,168,84,0,932, + 933,5,135,0,0,933,934,3,166,83,0,934,935,5,138,0,0,935,936,3,166, + 83,0,936,937,5,136,0,0,937,939,1,0,0,0,938,856,1,0,0,0,938,865,1, + 0,0,0,938,874,1,0,0,0,938,888,1,0,0,0,938,906,1,0,0,0,938,916,1, + 0,0,0,938,928,1,0,0,0,939,93,1,0,0,0,940,941,5,141,0,0,941,946,3, + 96,48,0,942,943,5,137,0,0,943,945,3,96,48,0,944,942,1,0,0,0,945, + 948,1,0,0,0,946,944,1,0,0,0,946,947,1,0,0,0,947,949,1,0,0,0,948, + 946,1,0,0,0,949,950,5,142,0,0,950,95,1,0,0,0,951,952,7,3,0,0,952, + 97,1,0,0,0,953,954,5,62,0,0,954,955,3,100,50,0,955,99,1,0,0,0,956, + 959,3,102,51,0,957,959,3,106,53,0,958,956,1,0,0,0,958,957,1,0,0, + 0,959,101,1,0,0,0,960,961,5,63,0,0,961,962,3,166,83,0,962,963,5, + 86,0,0,963,964,3,168,84,0,964,965,5,73,0,0,965,966,3,166,83,0,966, + 967,5,135,0,0,967,968,3,148,74,0,968,969,5,74,0,0,969,972,3,104, + 52,0,970,971,5,75,0,0,971,973,3,158,79,0,972,970,1,0,0,0,972,973, + 1,0,0,0,973,974,1,0,0,0,974,975,5,136,0,0,975,103,1,0,0,0,976,983, + 5,108,0,0,977,978,5,109,0,0,978,979,5,143,0,0,979,980,3,148,74,0, + 980,981,5,144,0,0,981,983,1,0,0,0,982,976,1,0,0,0,982,977,1,0,0, + 0,983,105,1,0,0,0,984,985,5,64,0,0,985,986,3,166,83,0,986,987,5, + 86,0,0,987,988,3,168,84,0,988,989,5,139,0,0,989,990,3,108,54,0,990, + 991,3,108,54,0,991,992,5,140,0,0,992,107,1,0,0,0,993,994,3,50,25, + 0,994,995,5,65,0,0,995,996,3,166,83,0,996,997,5,86,0,0,997,998,3, + 168,84,0,998,1000,3,156,78,0,999,1001,5,114,0,0,1000,999,1,0,0,0, + 1000,1001,1,0,0,0,1001,1004,1,0,0,0,1002,1003,5,81,0,0,1003,1005, + 3,168,84,0,1004,1002,1,0,0,0,1004,1005,1,0,0,0,1005,1007,1,0,0,0, + 1006,1008,5,83,0,0,1007,1006,1,0,0,0,1007,1008,1,0,0,0,1008,1011, + 1,0,0,0,1009,1010,5,84,0,0,1010,1012,3,168,84,0,1011,1009,1,0,0, + 0,1011,1012,1,0,0,0,1012,1014,1,0,0,0,1013,1015,5,85,0,0,1014,1013, + 1,0,0,0,1014,1015,1,0,0,0,1015,1016,1,0,0,0,1016,1017,5,136,0,0, + 1017,109,1,0,0,0,1018,1020,5,56,0,0,1019,1021,3,22,11,0,1020,1019, + 1,0,0,0,1020,1021,1,0,0,0,1021,1022,1,0,0,0,1022,1024,3,166,83,0, + 1023,1025,3,112,56,0,1024,1023,1,0,0,0,1024,1025,1,0,0,0,1025,1026, + 1,0,0,0,1026,1027,5,57,0,0,1027,1029,3,166,83,0,1028,1030,3,28,14, + 0,1029,1028,1,0,0,0,1029,1030,1,0,0,0,1030,1033,1,0,0,0,1031,1032, + 5,86,0,0,1032,1034,3,168,84,0,1033,1031,1,0,0,0,1033,1034,1,0,0, + 0,1034,1037,1,0,0,0,1035,1036,5,80,0,0,1036,1038,5,149,0,0,1037, + 1035,1,0,0,0,1037,1038,1,0,0,0,1038,1039,1,0,0,0,1039,1043,5,139, + 0,0,1040,1042,3,114,57,0,1041,1040,1,0,0,0,1042,1045,1,0,0,0,1043, + 1041,1,0,0,0,1043,1044,1,0,0,0,1044,1046,1,0,0,0,1045,1043,1,0,0, + 0,1046,1047,5,140,0,0,1047,111,1,0,0,0,1048,1049,3,28,14,0,1049, + 113,1,0,0,0,1050,1051,5,61,0,0,1051,1058,3,100,50,0,1052,1058,3, + 128,64,0,1053,1058,3,124,62,0,1054,1058,3,118,59,0,1055,1058,3,126, + 63,0,1056,1058,3,116,58,0,1057,1050,1,0,0,0,1057,1052,1,0,0,0,1057, + 1053,1,0,0,0,1057,1054,1,0,0,0,1057,1055,1,0,0,0,1057,1056,1,0,0, + 0,1058,115,1,0,0,0,1059,1060,5,58,0,0,1060,1061,3,166,83,0,1061, + 1062,5,60,0,0,1062,1063,3,166,83,0,1063,1064,5,138,0,0,1064,1065, + 3,166,83,0,1065,1066,5,136,0,0,1066,117,1,0,0,0,1067,1068,5,10,0, + 0,1068,1072,5,139,0,0,1069,1071,3,120,60,0,1070,1069,1,0,0,0,1071, + 1074,1,0,0,0,1072,1070,1,0,0,0,1072,1073,1,0,0,0,1073,1075,1,0,0, + 0,1074,1072,1,0,0,0,1075,1076,5,140,0,0,1076,1077,5,136,0,0,1077, + 119,1,0,0,0,1078,1079,3,166,83,0,1079,1080,5,60,0,0,1080,1081,5, + 63,0,0,1081,1082,3,166,83,0,1082,1083,5,136,0,0,1083,1093,1,0,0, + 0,1084,1085,3,166,83,0,1085,1086,5,60,0,0,1086,1087,5,64,0,0,1087, + 1088,3,166,83,0,1088,1089,5,138,0,0,1089,1090,3,166,83,0,1090,1091, + 5,136,0,0,1091,1093,1,0,0,0,1092,1078,1,0,0,0,1092,1084,1,0,0,0, + 1093,121,1,0,0,0,1094,1095,3,26,13,0,1095,1096,5,20,0,0,1096,1101, + 5,55,0,0,1097,1098,5,138,0,0,1098,1100,3,166,83,0,1099,1097,1,0, + 0,0,1100,1103,1,0,0,0,1101,1099,1,0,0,0,1101,1102,1,0,0,0,1102,1104, + 1,0,0,0,1103,1101,1,0,0,0,1104,1105,5,136,0,0,1105,123,1,0,0,0,1106, + 1107,5,58,0,0,1107,1108,3,166,83,0,1108,1109,5,60,0,0,1109,1110, + 5,63,0,0,1110,1111,3,166,83,0,1111,1112,5,136,0,0,1112,125,1,0,0, + 0,1113,1114,5,70,0,0,1114,1115,3,166,83,0,1115,1116,5,71,0,0,1116, + 1117,5,72,0,0,1117,1118,5,67,0,0,1118,1119,5,53,0,0,1119,1120,3, + 166,83,0,1120,1121,5,69,0,0,1121,1122,5,64,0,0,1122,1123,3,166,83, + 0,1123,1124,5,138,0,0,1124,1125,3,166,83,0,1125,1126,5,136,0,0,1126, + 127,1,0,0,0,1127,1128,5,58,0,0,1128,1129,3,130,65,0,1129,1130,5, + 60,0,0,1130,1133,3,134,67,0,1131,1132,5,36,0,0,1132,1134,3,168,84, + 0,1133,1131,1,0,0,0,1133,1134,1,0,0,0,1134,1135,1,0,0,0,1135,1136, + 5,136,0,0,1136,129,1,0,0,0,1137,1138,3,166,83,0,1138,1139,5,138, + 0,0,1139,1140,3,132,66,0,1140,131,1,0,0,0,1141,1154,3,166,83,0,1142, + 1154,5,103,0,0,1143,1154,5,93,0,0,1144,1154,5,94,0,0,1145,1154,5, + 1,0,0,1146,1154,5,100,0,0,1147,1154,5,101,0,0,1148,1154,5,102,0, + 0,1149,1154,5,104,0,0,1150,1154,5,105,0,0,1151,1154,5,106,0,0,1152, + 1154,5,107,0,0,1153,1141,1,0,0,0,1153,1142,1,0,0,0,1153,1143,1,0, + 0,0,1153,1144,1,0,0,0,1153,1145,1,0,0,0,1153,1146,1,0,0,0,1153,1147, + 1,0,0,0,1153,1148,1,0,0,0,1153,1149,1,0,0,0,1153,1150,1,0,0,0,1153, + 1151,1,0,0,0,1153,1152,1,0,0,0,1154,133,1,0,0,0,1155,1156,5,82,0, + 0,1156,1157,5,138,0,0,1157,1192,3,166,83,0,1158,1159,5,63,0,0,1159, + 1160,3,166,83,0,1160,1161,5,138,0,0,1161,1162,3,138,69,0,1162,1192, + 1,0,0,0,1163,1164,5,64,0,0,1164,1165,3,166,83,0,1165,1166,5,138, + 0,0,1166,1167,3,166,83,0,1167,1168,5,138,0,0,1168,1169,3,140,70, + 0,1169,1192,1,0,0,0,1170,1171,5,46,0,0,1171,1173,3,166,83,0,1172, + 1174,3,28,14,0,1173,1172,1,0,0,0,1173,1174,1,0,0,0,1174,1175,1,0, + 0,0,1175,1176,5,138,0,0,1176,1177,3,130,65,0,1177,1192,1,0,0,0,1178, + 1179,5,48,0,0,1179,1180,3,166,83,0,1180,1181,5,138,0,0,1181,1183, + 3,166,83,0,1182,1184,3,28,14,0,1183,1182,1,0,0,0,1183,1184,1,0,0, + 0,1184,1186,1,0,0,0,1185,1187,3,142,71,0,1186,1185,1,0,0,0,1186, + 1187,1,0,0,0,1187,1189,1,0,0,0,1188,1190,3,136,68,0,1189,1188,1, + 0,0,0,1189,1190,1,0,0,0,1190,1192,1,0,0,0,1191,1155,1,0,0,0,1191, + 1158,1,0,0,0,1191,1163,1,0,0,0,1191,1170,1,0,0,0,1191,1178,1,0,0, + 0,1192,135,1,0,0,0,1193,1194,5,68,0,0,1194,1195,3,142,71,0,1195, + 137,1,0,0,0,1196,1197,7,4,0,0,1197,139,1,0,0,0,1198,1199,7,5,0,0, + 1199,141,1,0,0,0,1200,1201,5,66,0,0,1201,1205,5,139,0,0,1202,1204, + 3,144,72,0,1203,1202,1,0,0,0,1204,1207,1,0,0,0,1205,1203,1,0,0,0, + 1205,1206,1,0,0,0,1206,1208,1,0,0,0,1207,1205,1,0,0,0,1208,1209, + 5,140,0,0,1209,143,1,0,0,0,1210,1211,3,166,83,0,1211,1212,5,60,0, + 0,1212,1213,5,11,0,0,1213,1214,5,25,0,0,1214,1215,5,141,0,0,1215, + 1216,3,88,44,0,1216,1217,5,142,0,0,1217,1218,5,136,0,0,1218,1309, + 1,0,0,0,1219,1220,3,166,83,0,1220,1221,5,60,0,0,1221,1222,5,63,0, + 0,1222,1229,3,166,83,0,1223,1224,5,69,0,0,1224,1225,5,64,0,0,1225, + 1226,3,166,83,0,1226,1227,5,138,0,0,1227,1228,3,166,83,0,1228,1230, + 1,0,0,0,1229,1223,1,0,0,0,1229,1230,1,0,0,0,1230,1231,1,0,0,0,1231, + 1232,5,136,0,0,1232,1309,1,0,0,0,1233,1234,3,166,83,0,1234,1235, + 5,60,0,0,1235,1236,5,64,0,0,1236,1237,3,166,83,0,1237,1238,5,138, + 0,0,1238,1245,3,166,83,0,1239,1240,5,69,0,0,1240,1241,5,64,0,0,1241, + 1242,3,166,83,0,1242,1243,5,138,0,0,1243,1244,3,166,83,0,1244,1246, + 1,0,0,0,1245,1239,1,0,0,0,1245,1246,1,0,0,0,1246,1247,1,0,0,0,1247, + 1248,5,136,0,0,1248,1309,1,0,0,0,1249,1250,3,166,83,0,1250,1251, + 5,60,0,0,1251,1252,5,46,0,0,1252,1254,3,166,83,0,1253,1255,3,28, + 14,0,1254,1253,1,0,0,0,1254,1255,1,0,0,0,1255,1264,1,0,0,0,1256, + 1257,5,69,0,0,1257,1258,5,64,0,0,1258,1259,3,166,83,0,1259,1260, + 5,138,0,0,1260,1261,3,166,83,0,1261,1265,1,0,0,0,1262,1263,5,20, + 0,0,1263,1265,5,55,0,0,1264,1256,1,0,0,0,1264,1262,1,0,0,0,1264, + 1265,1,0,0,0,1265,1266,1,0,0,0,1266,1267,5,136,0,0,1267,1309,1,0, + 0,0,1268,1269,3,166,83,0,1269,1270,5,60,0,0,1270,1271,5,7,0,0,1271, + 1272,3,166,83,0,1272,1273,5,66,0,0,1273,1277,5,139,0,0,1274,1276, + 3,122,61,0,1275,1274,1,0,0,0,1276,1279,1,0,0,0,1277,1275,1,0,0,0, + 1277,1278,1,0,0,0,1278,1280,1,0,0,0,1279,1277,1,0,0,0,1280,1281, + 5,140,0,0,1281,1282,5,136,0,0,1282,1309,1,0,0,0,1283,1284,3,166, + 83,0,1284,1285,5,60,0,0,1285,1286,5,53,0,0,1286,1287,3,166,83,0, + 1287,1288,5,136,0,0,1288,1309,1,0,0,0,1289,1290,3,166,83,0,1290, + 1292,5,60,0,0,1291,1293,5,11,0,0,1292,1291,1,0,0,0,1292,1293,1,0, + 0,0,1293,1294,1,0,0,0,1294,1295,5,24,0,0,1295,1296,3,166,83,0,1296, + 1297,5,138,0,0,1297,1304,3,166,83,0,1298,1299,5,69,0,0,1299,1300, + 5,64,0,0,1300,1301,3,166,83,0,1301,1302,5,138,0,0,1302,1303,3,166, + 83,0,1303,1305,1,0,0,0,1304,1298,1,0,0,0,1304,1305,1,0,0,0,1305, + 1306,1,0,0,0,1306,1307,5,136,0,0,1307,1309,1,0,0,0,1308,1210,1,0, + 0,0,1308,1219,1,0,0,0,1308,1233,1,0,0,0,1308,1249,1,0,0,0,1308,1268, + 1,0,0,0,1308,1283,1,0,0,0,1308,1289,1,0,0,0,1309,145,1,0,0,0,1310, + 1311,5,53,0,0,1311,1312,3,166,83,0,1312,1313,5,60,0,0,1313,1314, + 3,166,83,0,1314,1315,5,138,0,0,1315,1317,3,166,83,0,1316,1318,3, + 142,71,0,1317,1316,1,0,0,0,1317,1318,1,0,0,0,1318,1319,1,0,0,0,1319, + 1320,5,136,0,0,1320,147,1,0,0,0,1321,1379,3,154,77,0,1322,1379,5, + 115,0,0,1323,1379,5,116,0,0,1324,1325,5,117,0,0,1325,1379,3,168, + 84,0,1326,1327,5,118,0,0,1327,1328,5,145,0,0,1328,1329,3,166,83, + 0,1329,1330,5,146,0,0,1330,1379,1,0,0,0,1331,1332,5,119,0,0,1332, + 1333,5,145,0,0,1333,1335,3,166,83,0,1334,1336,3,28,14,0,1335,1334, + 1,0,0,0,1335,1336,1,0,0,0,1336,1337,1,0,0,0,1337,1338,5,146,0,0, + 1338,1379,1,0,0,0,1339,1340,5,41,0,0,1340,1341,5,145,0,0,1341,1342, + 3,166,83,0,1342,1343,5,146,0,0,1343,1379,1,0,0,0,1344,1345,5,120, + 0,0,1345,1346,5,145,0,0,1346,1347,3,148,74,0,1347,1348,5,146,0,0, + 1348,1379,1,0,0,0,1349,1350,5,121,0,0,1350,1351,5,145,0,0,1351,1352, + 3,148,74,0,1352,1353,5,146,0,0,1353,1379,1,0,0,0,1354,1355,5,122, + 0,0,1355,1359,5,139,0,0,1356,1358,3,150,75,0,1357,1356,1,0,0,0,1358, + 1361,1,0,0,0,1359,1357,1,0,0,0,1359,1360,1,0,0,0,1360,1362,1,0,0, + 0,1361,1359,1,0,0,0,1362,1379,5,140,0,0,1363,1364,5,8,0,0,1364,1365, + 5,86,0,0,1365,1366,3,168,84,0,1366,1368,5,139,0,0,1367,1369,3,152, + 76,0,1368,1367,1,0,0,0,1369,1370,1,0,0,0,1370,1368,1,0,0,0,1370, + 1371,1,0,0,0,1371,1372,1,0,0,0,1372,1373,5,140,0,0,1373,1379,1,0, + 0,0,1374,1376,3,166,83,0,1375,1377,3,28,14,0,1376,1375,1,0,0,0,1376, + 1377,1,0,0,0,1377,1379,1,0,0,0,1378,1321,1,0,0,0,1378,1322,1,0,0, + 0,1378,1323,1,0,0,0,1378,1324,1,0,0,0,1378,1326,1,0,0,0,1378,1331, + 1,0,0,0,1378,1339,1,0,0,0,1378,1344,1,0,0,0,1378,1349,1,0,0,0,1378, + 1354,1,0,0,0,1378,1363,1,0,0,0,1378,1374,1,0,0,0,1379,149,1,0,0, + 0,1380,1381,3,166,83,0,1381,1382,5,135,0,0,1382,1383,3,148,74,0, + 1383,1384,5,136,0,0,1384,151,1,0,0,0,1385,1386,3,166,83,0,1386,1387, + 5,86,0,0,1387,1388,3,168,84,0,1388,1389,5,135,0,0,1389,1390,3,148, + 74,0,1390,1391,5,136,0,0,1391,153,1,0,0,0,1392,1393,7,6,0,0,1393, + 155,1,0,0,0,1394,1395,7,7,0,0,1395,157,1,0,0,0,1396,1405,3,168,84, + 0,1397,1405,5,149,0,0,1398,1405,5,150,0,0,1399,1405,5,131,0,0,1400, + 1405,5,132,0,0,1401,1405,5,133,0,0,1402,1405,3,160,80,0,1403,1405, + 3,164,82,0,1404,1396,1,0,0,0,1404,1397,1,0,0,0,1404,1398,1,0,0,0, + 1404,1399,1,0,0,0,1404,1400,1,0,0,0,1404,1401,1,0,0,0,1404,1402, + 1,0,0,0,1404,1403,1,0,0,0,1405,159,1,0,0,0,1406,1415,5,139,0,0,1407, + 1412,3,162,81,0,1408,1409,5,137,0,0,1409,1411,3,162,81,0,1410,1408, + 1,0,0,0,1411,1414,1,0,0,0,1412,1410,1,0,0,0,1412,1413,1,0,0,0,1413, + 1416,1,0,0,0,1414,1412,1,0,0,0,1415,1407,1,0,0,0,1415,1416,1,0,0, + 0,1416,1417,1,0,0,0,1417,1418,5,140,0,0,1418,161,1,0,0,0,1419,1420, + 3,168,84,0,1420,1421,5,135,0,0,1421,1422,3,158,79,0,1422,163,1,0, + 0,0,1423,1432,5,141,0,0,1424,1429,3,158,79,0,1425,1426,5,137,0,0, + 1426,1428,3,158,79,0,1427,1425,1,0,0,0,1428,1431,1,0,0,0,1429,1427, + 1,0,0,0,1429,1430,1,0,0,0,1430,1433,1,0,0,0,1431,1429,1,0,0,0,1432, + 1424,1,0,0,0,1432,1433,1,0,0,0,1433,1434,1,0,0,0,1434,1435,5,142, + 0,0,1435,165,1,0,0,0,1436,1437,7,8,0,0,1437,167,1,0,0,0,1438,1439, + 5,152,0,0,1439,169,1,0,0,0,129,182,189,210,223,235,255,263,270,276, + 288,291,297,308,317,327,330,332,336,344,356,361,371,381,386,401, + 407,419,428,436,444,457,460,470,474,480,487,493,501,509,522,529, + 533,538,549,555,566,592,596,602,613,622,628,633,635,666,670,676, + 703,713,724,727,732,735,738,745,754,757,760,763,786,795,809,830, + 833,836,843,851,883,895,898,902,924,938,946,958,972,982,1000,1004, + 1007,1011,1014,1020,1024,1029,1033,1037,1043,1057,1072,1092,1101, + 1133,1153,1173,1183,1186,1189,1191,1205,1229,1245,1254,1264,1277, + 1292,1304,1308,1317,1335,1359,1370,1376,1378,1404,1412,1415,1429, + 1432 ]; private static __ATN: antlr.ATN; @@ -7694,6 +7828,9 @@ export class PackageOperationExportContext extends antlr.ParserRuleContext { public dependencyBlock(): DependencyBlockContext | null { return this.getRuleContext(0, DependencyBlockContext); } + public preparationClause(): PreparationClauseContext | null { + return this.getRuleContext(0, PreparationClauseContext); + } public acceptanceClause(): AcceptanceClauseContext | null { return this.getRuleContext(0, AcceptanceClauseContext); } @@ -7753,6 +7890,9 @@ export class PackageFunctionExportContext extends antlr.ParserRuleContext { public dependencyBlock(): DependencyBlockContext | null { return this.getRuleContext(0, DependencyBlockContext); } + public preparationClause(): PreparationClauseContext | null { + return this.getRuleContext(0, PreparationClauseContext); + } public acceptanceClause(): AcceptanceClauseContext | null { return this.getRuleContext(0, AcceptanceClauseContext); } @@ -7795,6 +7935,38 @@ export class AcceptanceClauseContext extends antlr.ParserRuleContext { } +export class PreparationClauseContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public PREPARES(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.PREPARES, 0)!; + } + public CREATION(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.CREATION, 0)!; + } + public identifier(): IdentifierContext { + return this.getRuleContext(0, IdentifierContext)!; + } + public USING(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.USING, 0)!; + } + public stringLiteral(): StringLiteralContext { + return this.getRuleContext(0, StringLiteralContext)!; + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_preparationClause; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitPreparationClause) { + return visitor.visitPreparationClause(this); + } else { + return visitor.visitChildren(this); + } + } +} + + export class ExecutionClauseContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); @@ -9443,6 +9615,21 @@ export class ValueTypeContext extends antlr.ParserRuleContext { return this.getRuleContext(i, RecordFieldContext); } + public VARIANT(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.VARIANT, 0); + } + public ID(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.ID, 0); + } + public variantCase(): VariantCaseContext[]; + public variantCase(i: number): VariantCaseContext | null; + public variantCase(i?: number): VariantCaseContext[] | VariantCaseContext | null { + if (i === undefined) { + return this.getRuleContexts(VariantCaseContext); + } + + return this.getRuleContext(i, VariantCaseContext); + } public override get ruleIndex(): number { return QuixosCapabilityParser.RULE_valueType; } @@ -9485,6 +9672,41 @@ export class RecordFieldContext extends antlr.ParserRuleContext { } +export class VariantCaseContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public identifier(): IdentifierContext { + return this.getRuleContext(0, IdentifierContext)!; + } + public ID(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.ID, 0)!; + } + public stringLiteral(): StringLiteralContext { + return this.getRuleContext(0, StringLiteralContext)!; + } + public COLON(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.COLON, 0)!; + } + public valueType(): ValueTypeContext { + return this.getRuleContext(0, ValueTypeContext)!; + } + public SEMI(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.SEMI, 0)!; + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_variantCase; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitVariantCase) { + return visitor.visitVariantCase(this); + } else { + return visitor.visitChildren(this); + } + } +} + + export class ScalarTypeContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); diff --git a/src/capability-language/generated/QuixosCapabilityVisitor.ts b/src/capability-language/generated/QuixosCapabilityVisitor.ts index 89688e3..d55d575 100644 --- a/src/capability-language/generated/QuixosCapabilityVisitor.ts +++ b/src/capability-language/generated/QuixosCapabilityVisitor.ts @@ -39,6 +39,7 @@ import { FragmentVariableContext } from "./QuixosCapabilityParser.js"; import { PackageOperationExportContext } from "./QuixosCapabilityParser.js"; import { PackageFunctionExportContext } from "./QuixosCapabilityParser.js"; import { AcceptanceClauseContext } from "./QuixosCapabilityParser.js"; +import { PreparationClauseContext } from "./QuixosCapabilityParser.js"; import { ExecutionClauseContext } from "./QuixosCapabilityParser.js"; import { SelectedOperationsContext } from "./QuixosCapabilityParser.js"; import { PackageConstructorExportContext } from "./QuixosCapabilityParser.js"; @@ -77,6 +78,7 @@ import { DependencyBindingContext } from "./QuixosCapabilityParser.js"; import { ConstructorBindingDeclContext } from "./QuixosCapabilityParser.js"; import { ValueTypeContext } from "./QuixosCapabilityParser.js"; import { RecordFieldContext } from "./QuixosCapabilityParser.js"; +import { VariantCaseContext } from "./QuixosCapabilityParser.js"; import { ScalarTypeContext } from "./QuixosCapabilityParser.js"; import { CardinalityContext } from "./QuixosCapabilityParser.js"; import { JsonLiteralContext } from "./QuixosCapabilityParser.js"; @@ -317,6 +319,12 @@ export class QuixosCapabilityVisitor extends AbstractParseTreeVisitor Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.preparationClause`. + * @param ctx the parse tree + * @return the visitor result + */ + visitPreparationClause?: (ctx: PreparationClauseContext) => Result; /** * Visit a parse tree produced by `QuixosCapabilityParser.executionClause`. * @param ctx the parse tree @@ -545,6 +553,12 @@ export class QuixosCapabilityVisitor extends AbstractParseTreeVisitor Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.variantCase`. + * @param ctx the parse tree + * @return the visitor result + */ + visitVariantCase?: (ctx: VariantCaseContext) => Result; /** * Visit a parse tree produced by `QuixosCapabilityParser.scalarType`. * @param ctx the parse tree diff --git a/src/capability-language/generic-types.ts b/src/capability-language/generic-types.ts index e3303f2..f220304 100644 --- a/src/capability-language/generic-types.ts +++ b/src/capability-language/generic-types.ts @@ -110,6 +110,7 @@ export class GenericSourceTypes { } if (type.kind === "list" || type.kind === "optional") return storable(type.value, depth + 1); if (type.kind === "record") return Object.values(type.fields).every((field) => storable(field, depth + 1)); + if (type.kind === "variant") return Object.values(type.cases).every((entry) => storable(entry.value, depth + 1)); if (type.kind === "alias") { const alias = aliases.get(type.definitionId); if (!alias || alias.parameters.length !== type.arguments.length) return false; @@ -301,6 +302,24 @@ export class GenericSourceTypes { } expression(context: ValueTypeContext): ValueTypeExpression { + if (context.VARIANT()) { + const entries = context.variantCase().map( + (entry) => + [ + entry.identifier().getText(), + { + id: literal(entry.stringLiteral()), + value: this.expression(entry.valueType()), + }, + ] as const, + ); + if ( + new Set(entries.map(([label]) => label)).size !== entries.length || + new Set(entries.map(([, entry]) => entry.id)).size !== entries.length + ) + throw new GenericTypeError("duplicate-variant-case", "variant", "Variant labels and case IDs must be unique"); + return { kind: "variant", id: literal(context.stringLiteral()!), cases: Object.fromEntries(entries) }; + } if (context.scalarType()) return { kind: "scalar", diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index 3f3d135..d243077 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -316,6 +316,7 @@ const lowerValueType = (state: LoweringState, context: ValueTypeContext | null): throw new Error("Missing value type after a successful parse"); } if ( + context.VARIANT() || context.REF() || context.typeArguments() || (context.identifier() && !context.ATOM_REF() && !context.INTERFACE_REF()) @@ -1658,6 +1659,13 @@ const lowerPackage = ( const operation = exportContext.packageOperationExport(); const generic = operation ?? exportContext.packageFunctionExport(); if (generic?.typeParameters()) { + if (generic.preparationClause()) + loweringIssue( + state, + generic, + "unsupported-generic-preparation", + "Creation preparation currently requires a closed export", + ); if (generic.acceptanceClause()) loweringIssue( state, @@ -1689,6 +1697,19 @@ const lowerPackage = ( // Resolve after all exports have been declared, so checks can follow bodies. for (const source of context.packageExport()) { const declaration = source.packageOperationExport() ?? source.packageFunctionExport(); + const preparation = declaration?.preparationClause(); + if (declaration && preparation && !declaration.typeParameters()) { + const entry = exports.find((entry) => entry.displayName === identifier(declaration.identifier())); + const port = entry?.dependencyPorts.find((port) => port.displayName === identifier(preparation.identifier())); + if (!entry || port?.requirement.kind !== "creation") + loweringIssue( + state, + preparation, + "invalid-creation-preparation", + "Preparation must name a creation port of this export", + ); + else entry.preparation = { port: port.id, key: stringValue(preparation.stringLiteral()) }; + } const clause = declaration?.acceptanceClause(); if (!declaration || !clause || declaration.typeParameters()) continue; const entry = exports.find((entry) => entry.displayName === identifier(declaration.identifier())); diff --git a/src/capability-model/generics.ts b/src/capability-model/generics.ts index 9be1e74..907b319 100644 --- a/src/capability-model/generics.ts +++ b/src/capability-model/generics.ts @@ -16,6 +16,7 @@ export type ValueTypeExpression = | Extract | { kind: "parameter"; parameterId: string } | { kind: "record"; fields: Record } + | { kind: "variant"; id: string; cases: Record } | { kind: "list" | "optional" | "change"; value: ValueTypeExpression } | { kind: "object-ref"; expectation: ObjectTypeExpression } | { kind: "alias"; definitionId: string; arguments: TypeArgumentExpression[] }; @@ -195,6 +196,8 @@ export const isStorableType = ( return false; case "record": return Object.values(value.fields).every((field) => visit(field, depth + 1)); + case "variant": + return Object.values(value.cases).every((entry) => visit(entry.value, depth + 1)); } }; return visit(type, 0); @@ -221,6 +224,14 @@ export const canonicalTypeArgument = (argument: ClosedTypeArgument): string => { return [value.kind, value.name]; case "message": return ["message", value.descriptorId]; + case "variant": + return [ + "variant", + value.id, + Object.keys(value.cases) + .sort() + .map((label) => [label, value.cases[label].id, type(value.cases[label].value, depth + 1)]), + ]; case "object-ref": return ["object-ref", target(value.expectation)]; case "change": @@ -323,6 +334,17 @@ export class TypeSubstitution { value(expression: ValueTypeExpression, path = "type", depth = 0): ValueType { this.budget.enter(path, depth); switch (expression.kind) { + case "variant": + return { + kind: "variant", + id: expression.id, + cases: Object.fromEntries( + Object.entries(expression.cases).map(([label, entry]) => [ + label, + { id: entry.id, value: this.value(entry.value, `${path}.${label}`, depth + 1) }, + ]), + ), + }; case "builtin": return { kind: "builtin", name: expression.name }; case "scalar": diff --git a/src/capability-model/types.ts b/src/capability-model/types.ts index 3b380f4..61d3e90 100644 --- a/src/capability-model/types.ts +++ b/src/capability-model/types.ts @@ -65,6 +65,7 @@ export type ValueType = | { kind: "scalar"; name: ScalarValueTypeName } | { kind: "message"; descriptorId: string } | { kind: "record"; fields: Record } + | { kind: "variant"; id: string; cases: Record } | { kind: "object-ref"; expectation: ObjectExpectation } | { kind: "optional"; value: ValueType } | { kind: "list"; value: ValueType } @@ -270,6 +271,8 @@ export interface DependencyPort { } interface PackageExportBase { + /** Returns this declared birth, with unchanged operation input as its initializer. */ + preparation?: { port: DependencyPortId; key: string }; /** Required authoritative snapshot export in this package. */ acceptanceExportId?: PackageExportId; execution?: ExecutionContract; diff --git a/src/capability-model/validation.ts b/src/capability-model/validation.ts index 0f59f4e..a93d16d 100644 --- a/src/capability-model/validation.ts +++ b/src/capability-model/validation.ts @@ -148,6 +148,11 @@ const requireText = (issues: CapabilityValidationIssue[], value: string, path: s const typeLabel = (type: ValueType): string => { switch (type.kind) { + case "variant": + return `variant:${type.id}{${Object.entries(type.cases) + .sort(([a], [b]) => a.localeCompare(b)) + .map(([label, entry]) => `${label}:${entry.id}:${typeLabel(entry.value)}`) + .join(";")}}`; case "builtin": case "scalar": return type.name; @@ -176,6 +181,19 @@ export const valueTypesEqual = (left: ValueType, right: ValueType): boolean => { return false; } switch (left.kind) { + case "variant": { + const other = right as typeof left; + return ( + left.id === other.id && + Object.keys(left.cases).length === Object.keys(other.cases).length && + Object.entries(left.cases).every( + ([label, entry]) => + Object.hasOwn(other.cases, label) && + entry.id === other.cases[label].id && + valueTypesEqual(entry.value, other.cases[label].value), + ) + ); + } case "builtin": case "scalar": return left.name === (right as typeof left).name; @@ -232,6 +250,20 @@ const validateValueType = ( indexes: Pick, ) => { switch (type.kind) { + case "variant": { + requireText(issues, type.id, `${path}.id`, "Variant identity"); + const entries = Object.entries(type.cases), + ids = new Set(); + if (!entries.length || entries.length > 256) issue(issues, "invalid-value-type", path, "Use 1–256 variant cases"); + for (const [label, entry] of entries) { + if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(label)) issue(issues, "invalid-value-type", path, "Invalid variant label"); + requireText(issues, entry.id, `${path}.${label}.id`, "Case identity"); + if (ids.has(entry.id)) issue(issues, "invalid-value-type", path, "Duplicate case identity"); + ids.add(entry.id); + validateValueType(issues, entry.value, `${path}.${label}`, indexes); + } + return; + } case "record": for (const [name, field] of Object.entries(type.fields)) { if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) @@ -569,6 +601,7 @@ const collectIdentityIndexes = ( if (member.kind === "value") { const queryValue = (type: ValueType): boolean => type.kind === "scalar" || + (type.kind === "variant" && isStorableType(type)) || ((type.kind === "optional" || type.kind === "list") && queryValue(type.value)) || (type.kind === "record" && Object.keys(type.fields).length > 0 && @@ -893,6 +926,7 @@ const validateAttachments = (issues: CapabilityValidationIssue[], indexes: Valid type.kind === "object-ref" || type.kind === "change" || (type.kind === "record" && Object.values(type.fields).some(containsRpcType)) || + (type.kind === "variant" && Object.values(type.cases).some((entry) => containsRpcType(entry.value))) || ((type.kind === "optional" || type.kind === "list") && containsRpcType(type.value)); if ( containsRpcType(attachment.valueType) || @@ -999,6 +1033,26 @@ const validatePackages = ( const exportPath = `${path}.exports[${exportIndex}]`; validateValueType(issues, entry.inputType, `${exportPath}.inputType`, indexes); validateValueType(issues, entry.outputType, `${exportPath}.outputType`, indexes); + if (entry.preparation) { + const port = entry.dependencyPorts.find((port) => port.id === entry.preparation!.port); + if ( + entry.execution?.kind !== "transaction" || + entry.kind === "constructor" || + (entry.kind === "operation" && entry.mode !== "call") || + !entry.preparation.key || + port?.requirement.kind !== "creation" || + !valueTypesEqual(port.requirement.inputType, entry.inputType) || + entry.outputType.kind !== "object-ref" || + (entry.outputType.expectation.kind === "atom" && + entry.outputType.expectation.atomId !== port.requirement.atomId) + ) + issue( + issues, + "invalid-dependency-binding", + exportPath, + "Prepared creation requires a transaction returning its declared creation, with matching captured input types and a fixed key", + ); + } if (entry.acceptanceExportId !== undefined) { const check = revision.exports.find((candidate) => candidate.id === entry.acceptanceExportId); if ( diff --git a/src/execution-world/kernel.ts b/src/execution-world/kernel.ts index 5e12355..de3b12d 100644 --- a/src/execution-world/kernel.ts +++ b/src/execution-world/kernel.ts @@ -9,10 +9,15 @@ import type { } from "../capability-model/types.js"; import { type ExecutionPlan, ExecutionPlanError, hexDigest } from "./plan.js"; import { portableValueSchema } from "../bindings/portable.js"; -function preparedInputPaths(type: ValueType, path: (string | null)[] = []): (string | null)[][] { +type PreparedStep = string | null | { case: string; id: string }; +function preparedInputPaths(type: ValueType, path: PreparedStep[] = []): PreparedStep[][] { if (type.kind === "change") return [path]; if (type.kind === "optional") return preparedInputPaths(type.value, path); if (type.kind === "list") return preparedInputPaths(type.value, [...path, null]); + if (type.kind === "variant") + return Object.entries(type.cases).flatMap(([label, entry]) => + preparedInputPaths(entry.value, [...path, { case: label, id: entry.id }]), + ); if (type.kind === "record") return Object.entries(type.fields).flatMap(([key, value]) => preparedInputPaths(value, [...path, key])); return []; @@ -210,6 +215,7 @@ export function compileKernelProgram(plan: ExecutionPlan): unknown { package: binding.packageRevisionId, export: binding.exportId, ports, + ...(entry.preparation ? { preparation: entry.preparation } : {}), ...(check ? { acceptance: { export: check.id, ports: compilePorts(check, binding.acceptanceDependencies ?? []) } } : {}), @@ -237,6 +243,7 @@ export function compileKernelProgram(plan: ExecutionPlan): unknown { revision: pkg.revisionId, exports: pkg.exports.map((entry) => ({ id: entry.id, + ...(entry.preparation ? { preparation: entry.preparation } : {}), ...(entry.acceptanceExportId ? { acceptance: entry.acceptanceExportId } : {}), effect: entry.execution?.kind ?? "remote", targets: entry.execution && entry.execution.kind !== "remote" ? entry.execution.targets : [], diff --git a/src/execution-world/plan.ts b/src/execution-world/plan.ts index 9f23f7e..2835420 100644 --- a/src/execution-world/plan.ts +++ b/src/execution-world/plan.ts @@ -142,6 +142,9 @@ export function resolvePlannedOperation( /** Bound argument/state codec subset. A parsed type alone does not mean a runtime implements it. */ function checkValue(type: ValueType, path: string, allowChange = false): void { switch (type.kind) { + case "variant": + for (const [label, entry] of Object.entries(type.cases)) checkValue(entry.value, `${path}.${label}`, allowChange); + return; case "scalar": case "object-ref": return; diff --git a/src/query/schema.ts b/src/query/schema.ts index c663e8a..a4a91e3 100644 --- a/src/query/schema.ts +++ b/src/query/schema.ts @@ -126,8 +126,29 @@ export function querySchema( ); return views[0]!.interfaceRevisionId; }; + const variants = new Map(); const scalar = (type: ValueType): GraphQLOutputType & GraphQLInputType => { if (type.kind === "optional") return scalar(type.value); + if (type.kind === "variant") { + const name = `QxVariant_${createHash("sha256").update(JSON.stringify(type)).digest("hex").slice(0, 16)}`; + let result = variants.get(name); + if (!result) { + result = new GraphQLScalarType({ + name, + description: "Whole checked Camino variant value. Branch selection and predicates are not supported.", + serialize: (value) => value, + parseValue() { + throw new QueryCompileError("QUERY_TYPE", "Variant query inputs are not supported"); + }, + parseLiteral() { + throw new QueryCompileError("QUERY_TYPE", "Variant query inputs are not supported"); + }, + }); + variants.set(name, result); + scalarTypes.set(name, type); + } + return result; + } if (type.kind !== "scalar") throw new QueryCompileError("QUERY_TYPE", "Only scalar/optional scalar query fields are supported"); return queryScalars[type.name]; diff --git a/test/emit-portable-reader.ts b/test/emit-portable-reader.ts index 6ba595a..89ed50f 100644 --- a/test/emit-portable-reader.ts +++ b/test/emit-portable-reader.ts @@ -154,3 +154,20 @@ await writeFile("dist/portable-reader/compound-crdt/kernel.json", JSON.stringify const { emitExecutionScaffold } = await import("./execution-scaffold-fixture.js"); const executionScaffold = await emitExecutionScaffold("dist/portable-reader/execution-scaffold/source"); await writeFile("dist/portable-reader/execution-scaffold/plan.json", JSON.stringify(executionScaffold)); + +// Native variant fixture shared by generated-type and browser editing qualification. +const { readFile } = await import("node:fs/promises"); +const { compileCapabilityResourceSource } = await import("../src/capability-language/index.js"); +const { portableValueSchema, tsType } = await import("../src/bindings/portable.js"); +const variantSource = compileCapabilityResourceSource(await readFile("test/fixtures/canvas-content.qx", "utf8"), { + source: { repository: "https://example.test/canvas-content.git", commit: "a".repeat(40) }, +}); +if (!variantSource.ok || variantSource.resource.kind !== "interface") throw Error("Invalid variant fixture"); +const entries = variantSource.resource.revision.members[0]; +if (entries.kind !== "value") throw Error("Expected entries value"); +await mkdir("dist/portable-reader/variants", { recursive: true }); +await writeFile("dist/portable-reader/variants/schema.json", JSON.stringify(portableValueSchema(entries.valueType))); +await writeFile( + "dist/portable-reader/variants/entries.ts", + "export type Entries = " + tsType(entries.valueType) + ";\n", +); diff --git a/test/fixtures/canvas-content.qx b/test/fixtures/canvas-content.qx new file mode 100644 index 0000000..f7774ea --- /dev/null +++ b/test/fixtures/canvas-content.qx @@ -0,0 +1,12 @@ +type Point = record { x:double; y:double; }; +type Entry = variant id "canvas:entry@1" { + paragraph id "canvas:paragraph" : record { text:string; }; + stroke id "canvas:stroke" : record { points:list; }; + image id "canvas:image" : record { asset:string; }; +}; +interface CanvasContent id "canvas" revision "canvas@1" { + queryable value entries id "entries" : list { + get id "entries:get" execution snapshot targets [browser,server]; + edit id "entries:edit" execution transaction targets [browser,server]; + } +} diff --git a/test/variants.test.ts b/test/variants.test.ts new file mode 100644 index 0000000..c1873b4 --- /dev/null +++ b/test/variants.test.ts @@ -0,0 +1,82 @@ +import { readFileSync } from "node:fs"; +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { compileCapabilityResourceSource } from "../src/capability-language/index.js"; +import { compileQuery } from "../src/query/compile.js"; +import { defaultQueryBudgets } from "../src/query/types.js"; +import { portableValueSchema, tsType } from "../src/bindings/portable.js"; +import { isStorableType, TypeSubstitution } from "../src/capability-model/index.js"; + +const source = { repository: "https://example.test/variants.git", commit: "a".repeat(40) }; +const declaration = readFileSync("test/fixtures/canvas-content.qx", "utf8"); +const result = compileCapabilityResourceSource(declaration, { source }); +assert.ok(result.ok, JSON.stringify(result.diagnostics)); +if (result.resource.kind !== "interface") throw Error("Expected interface"); +const iface = result.resource.revision; +const entries = iface.members[0]; +if (entries.kind !== "value") throw Error("Expected value"); + +test("native variant aliases lower into nominal cases with typed payloads", () => { + assert.equal(entries.valueType.kind, "list"); + assert.ok(isStorableType(entries.valueType)); + const schema = portableValueSchema(entries.valueType) as any; + assert.equal(schema.value.id, "canvas:entry@1"); + assert.equal(schema.value.cases.stroke.id, "canvas:stroke"); + assert.match(tsType(entries.valueType), /kind: "stroke"/); + assert.match(tsType(entries.valueType), /ReadonlyArray<.*"x": number/); + const substitution = new TypeSubstitution({ + arguments: new Map([["T", { kind: "value", type: { kind: "scalar", name: "string" } }]]), + applyInterface: () => { + throw Error("unused"); + }, + implementsInterface: () => false, + }); + assert.deepEqual( + substitution.value({ + kind: "variant", + id: "box", + cases: { some: { id: "box:some", value: { kind: "parameter", parameterId: "T" } } }, + }), + { kind: "variant", id: "box", cases: { some: { id: "box:some", value: { kind: "scalar", name: "string" } } } }, + ); +}); +test("variant query scalars keep their checked payload type and reject branch selection", async () => { + const query = { + id: "canvas-query", + displayName: "Canvas", + root: { kind: "object" as const, interface: iface.revisionId }, + document: "canvas.graphql", + operation: "Canvas", + fragments: [], + views: [], + allowances: [], + budgets: { ...defaultQueryBudgets }, + watch: true, + }; + const checked = await compileQuery(query, [iface], async () => `query Canvas { root { entries } }`); + assert.equal(checked.output.kind, "record"); + if (checked.output.kind !== "record") return; + const root = checked.output.fields.root; + assert.equal(root.kind, "record"); + if (root.kind !== "record") return; + assert.deepEqual(root.fields.entries, entries.valueType); + await assert.rejects(compileQuery(query, [iface], async () => `query Canvas { root { entries { kind value } } }`)); +}); +test("unknown and duplicate cases fail; reference payloads remain nonstorable", () => { + const duplicate = compileCapabilityResourceSource(declaration.replace('"canvas:image"', '"canvas:stroke"'), { + source, + }); + assert.equal(duplicate.ok, false); + assert.ok( + !isStorableType({ + kind: "variant", + id: "transport", + cases: { + ref: { + id: "ref", + value: { kind: "object-ref", expectation: { kind: "interface", interfaceRevisionId: iface.revisionId } }, + }, + }, + }), + ); +}); From 0ace71eae6fa60c130470bdc457882ed16215aed Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Mon, 28 Sep 2026 10:28:49 -0700 Subject: [PATCH 83/91] Generalize live field bindings and use them for Studio canvas gestures --- grammar/QuixosCapability.g4 | 3 +- .../generated/QuixosCapability.interp | 4 +- .../generated/QuixosCapability.tokens | 412 +++--- .../generated/QuixosCapabilityLexer.interp | 5 +- .../generated/QuixosCapabilityLexer.tokens | 412 +++--- .../generated/QuixosCapabilityLexer.ts | 1228 +++++++++-------- .../generated/QuixosCapabilityParser.ts | 1123 +++++++-------- src/capability-language/parser.ts | 2 + src/capability-model/generics.ts | 1 + src/capability-model/types.ts | 2 + src/capability-model/validation.ts | 45 + src/execution-world/client-contracts.ts | 26 +- test/client-contracts.test.ts | 89 ++ 13 files changed, 1766 insertions(+), 1586 deletions(-) diff --git a/grammar/QuixosCapability.g4 b/grammar/QuixosCapability.g4 index af6a61a..123a05f 100644 --- a/grammar/QuixosCapability.g4 +++ b/grammar/QuixosCapability.g4 @@ -106,7 +106,7 @@ operationMember ; valueMember - : queryReadContract? VALUE identifier ID stringLiteral COLON valueType + : queryReadContract? (VALUE | FIELD) identifier ID stringLiteral COLON valueType LBRACE valueMemberOperation* RBRACE ; @@ -568,6 +568,7 @@ INTERFACE: 'interface'; INTERFACES: 'interfaces'; PACKAGE: 'package'; VALUE: 'value'; +FIELD: 'field'; RELATION: 'relation'; OPERATION: 'operation'; FUNCTION: 'function'; diff --git a/src/capability-language/generated/QuixosCapability.interp b/src/capability-language/generated/QuixosCapability.interp index ed7cd9b..a49cddc 100644 --- a/src/capability-language/generated/QuixosCapability.interp +++ b/src/capability-language/generated/QuixosCapability.interp @@ -49,6 +49,7 @@ null 'interfaces' 'package' 'value' +'field' 'relation' 'operation' 'function' @@ -207,6 +208,7 @@ INTERFACE INTERFACES PACKAGE VALUE +FIELD RELATION OPERATION FUNCTION @@ -403,4 +405,4 @@ stringLiteral atn: -[4, 1, 155, 1441, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 183, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 188, 8, 1, 10, 1, 12, 1, 191, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 209, 8, 3, 10, 3, 12, 3, 212, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 224, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 236, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 256, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 264, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 269, 8, 10, 10, 10, 12, 10, 272, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 277, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 287, 8, 10, 10, 10, 12, 10, 290, 9, 10, 3, 10, 292, 8, 10, 1, 10, 1, 10, 5, 10, 296, 8, 10, 10, 10, 12, 10, 299, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 307, 8, 11, 10, 11, 12, 11, 310, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 318, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 326, 8, 12, 10, 12, 12, 12, 329, 9, 12, 3, 12, 331, 8, 12, 3, 12, 333, 8, 12, 1, 13, 1, 13, 3, 13, 337, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 343, 8, 14, 10, 14, 12, 14, 346, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 357, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 362, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 372, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 382, 8, 18, 1, 18, 1, 18, 1, 19, 3, 19, 387, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 402, 8, 19, 1, 19, 1, 19, 1, 19, 1, 20, 3, 20, 408, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 418, 8, 20, 10, 20, 12, 20, 421, 9, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 429, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 437, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 445, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 458, 8, 21, 1, 22, 3, 22, 461, 8, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 471, 8, 22, 1, 22, 1, 22, 3, 22, 475, 8, 22, 1, 22, 1, 22, 5, 22, 479, 8, 22, 10, 22, 12, 22, 482, 9, 22, 1, 22, 1, 22, 1, 23, 1, 23, 3, 23, 488, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 494, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 502, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 510, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 523, 8, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 530, 8, 25, 1, 25, 1, 25, 3, 25, 534, 8, 25, 1, 26, 5, 26, 537, 8, 26, 10, 26, 12, 26, 540, 9, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 550, 8, 26, 1, 26, 1, 26, 5, 26, 554, 8, 26, 10, 26, 12, 26, 557, 9, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 567, 8, 27, 1, 28, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 3, 30, 593, 8, 30, 1, 30, 1, 30, 3, 30, 597, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 603, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 5, 30, 612, 8, 30, 10, 30, 12, 30, 615, 9, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 623, 8, 30, 1, 30, 1, 30, 5, 30, 627, 8, 30, 10, 30, 12, 30, 630, 9, 30, 1, 30, 1, 30, 3, 30, 634, 8, 30, 3, 30, 636, 8, 30, 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, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 665, 8, 32, 10, 32, 12, 32, 668, 9, 32, 1, 32, 3, 32, 671, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 677, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 704, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 3, 34, 714, 8, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 725, 8, 34, 1, 34, 3, 34, 728, 8, 34, 1, 34, 1, 34, 1, 34, 3, 34, 733, 8, 34, 1, 34, 3, 34, 736, 8, 34, 1, 34, 3, 34, 739, 8, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 3, 35, 746, 8, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 755, 8, 35, 1, 35, 3, 35, 758, 8, 35, 1, 35, 3, 35, 761, 8, 35, 1, 35, 3, 35, 764, 8, 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, 38, 1, 38, 3, 38, 787, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 794, 8, 39, 10, 39, 12, 39, 797, 9, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 810, 8, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 5, 43, 829, 8, 43, 10, 43, 12, 43, 832, 9, 43, 3, 43, 834, 8, 43, 1, 43, 3, 43, 837, 8, 43, 1, 44, 1, 44, 1, 44, 5, 44, 842, 8, 44, 10, 44, 12, 44, 845, 9, 44, 1, 45, 1, 45, 1, 45, 5, 45, 850, 8, 45, 10, 45, 12, 45, 853, 9, 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, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 884, 8, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 896, 8, 46, 1, 46, 3, 46, 899, 8, 46, 1, 46, 1, 46, 3, 46, 903, 8, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 925, 8, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 939, 8, 46, 1, 47, 1, 47, 1, 47, 1, 47, 5, 47, 945, 8, 47, 10, 47, 12, 47, 948, 9, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 3, 50, 959, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 973, 8, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 983, 8, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 1001, 8, 54, 1, 54, 1, 54, 3, 54, 1005, 8, 54, 1, 54, 3, 54, 1008, 8, 54, 1, 54, 1, 54, 3, 54, 1012, 8, 54, 1, 54, 3, 54, 1015, 8, 54, 1, 54, 1, 54, 1, 55, 1, 55, 3, 55, 1021, 8, 55, 1, 55, 1, 55, 3, 55, 1025, 8, 55, 1, 55, 1, 55, 1, 55, 3, 55, 1030, 8, 55, 1, 55, 1, 55, 3, 55, 1034, 8, 55, 1, 55, 1, 55, 3, 55, 1038, 8, 55, 1, 55, 1, 55, 5, 55, 1042, 8, 55, 10, 55, 12, 55, 1045, 9, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 1058, 8, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 5, 59, 1071, 8, 59, 10, 59, 12, 59, 1074, 9, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1093, 8, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 5, 61, 1100, 8, 61, 10, 61, 12, 61, 1103, 9, 61, 1, 61, 1, 61, 1, 62, 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, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1134, 8, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1154, 8, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1174, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1184, 8, 67, 1, 67, 3, 67, 1187, 8, 67, 1, 67, 3, 67, 1190, 8, 67, 3, 67, 1192, 8, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 5, 71, 1204, 8, 71, 10, 71, 12, 71, 1207, 9, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1230, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1246, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1255, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1265, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 5, 72, 1276, 8, 72, 10, 72, 12, 72, 1279, 9, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1293, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1305, 8, 72, 1, 72, 1, 72, 3, 72, 1309, 8, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1318, 8, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 3, 74, 1336, 8, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 5, 74, 1358, 8, 74, 10, 74, 12, 74, 1361, 9, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 4, 74, 1369, 8, 74, 11, 74, 12, 74, 1370, 1, 74, 1, 74, 1, 74, 1, 74, 3, 74, 1377, 8, 74, 3, 74, 1379, 8, 74, 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, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 3, 79, 1405, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 5, 80, 1411, 8, 80, 10, 80, 12, 80, 1414, 9, 80, 3, 80, 1416, 8, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 5, 82, 1428, 8, 82, 10, 82, 12, 82, 1431, 9, 82, 3, 82, 1433, 8, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 0, 0, 85, 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, 0, 9, 2, 0, 17, 17, 35, 35, 1, 0, 13, 14, 1, 0, 103, 107, 3, 0, 1, 1, 98, 102, 104, 105, 3, 0, 1, 1, 98, 99, 104, 105, 2, 0, 100, 102, 104, 105, 1, 0, 123, 130, 1, 0, 110, 113, 10, 0, 1, 1, 4, 7, 10, 10, 12, 35, 42, 42, 47, 47, 76, 76, 96, 97, 108, 108, 151, 151, 1560, 0, 182, 1, 0, 0, 0, 2, 184, 1, 0, 0, 0, 4, 194, 1, 0, 0, 0, 6, 198, 1, 0, 0, 0, 8, 223, 1, 0, 0, 0, 10, 235, 1, 0, 0, 0, 12, 237, 1, 0, 0, 0, 14, 244, 1, 0, 0, 0, 16, 255, 1, 0, 0, 0, 18, 257, 1, 0, 0, 0, 20, 270, 1, 0, 0, 0, 22, 302, 1, 0, 0, 0, 24, 332, 1, 0, 0, 0, 26, 334, 1, 0, 0, 0, 28, 338, 1, 0, 0, 0, 30, 356, 1, 0, 0, 0, 32, 358, 1, 0, 0, 0, 34, 371, 1, 0, 0, 0, 36, 373, 1, 0, 0, 0, 38, 386, 1, 0, 0, 0, 40, 407, 1, 0, 0, 0, 42, 457, 1, 0, 0, 0, 44, 460, 1, 0, 0, 0, 46, 485, 1, 0, 0, 0, 48, 522, 1, 0, 0, 0, 50, 533, 1, 0, 0, 0, 52, 538, 1, 0, 0, 0, 54, 566, 1, 0, 0, 0, 56, 568, 1, 0, 0, 0, 58, 578, 1, 0, 0, 0, 60, 590, 1, 0, 0, 0, 62, 637, 1, 0, 0, 0, 64, 703, 1, 0, 0, 0, 66, 705, 1, 0, 0, 0, 68, 710, 1, 0, 0, 0, 70, 742, 1, 0, 0, 0, 72, 767, 1, 0, 0, 0, 74, 771, 1, 0, 0, 0, 76, 786, 1, 0, 0, 0, 78, 788, 1, 0, 0, 0, 80, 800, 1, 0, 0, 0, 82, 813, 1, 0, 0, 0, 84, 816, 1, 0, 0, 0, 86, 836, 1, 0, 0, 0, 88, 838, 1, 0, 0, 0, 90, 846, 1, 0, 0, 0, 92, 938, 1, 0, 0, 0, 94, 940, 1, 0, 0, 0, 96, 951, 1, 0, 0, 0, 98, 953, 1, 0, 0, 0, 100, 958, 1, 0, 0, 0, 102, 960, 1, 0, 0, 0, 104, 982, 1, 0, 0, 0, 106, 984, 1, 0, 0, 0, 108, 993, 1, 0, 0, 0, 110, 1018, 1, 0, 0, 0, 112, 1048, 1, 0, 0, 0, 114, 1057, 1, 0, 0, 0, 116, 1059, 1, 0, 0, 0, 118, 1067, 1, 0, 0, 0, 120, 1092, 1, 0, 0, 0, 122, 1094, 1, 0, 0, 0, 124, 1106, 1, 0, 0, 0, 126, 1113, 1, 0, 0, 0, 128, 1127, 1, 0, 0, 0, 130, 1137, 1, 0, 0, 0, 132, 1153, 1, 0, 0, 0, 134, 1191, 1, 0, 0, 0, 136, 1193, 1, 0, 0, 0, 138, 1196, 1, 0, 0, 0, 140, 1198, 1, 0, 0, 0, 142, 1200, 1, 0, 0, 0, 144, 1308, 1, 0, 0, 0, 146, 1310, 1, 0, 0, 0, 148, 1378, 1, 0, 0, 0, 150, 1380, 1, 0, 0, 0, 152, 1385, 1, 0, 0, 0, 154, 1392, 1, 0, 0, 0, 156, 1394, 1, 0, 0, 0, 158, 1404, 1, 0, 0, 0, 160, 1406, 1, 0, 0, 0, 162, 1419, 1, 0, 0, 0, 164, 1423, 1, 0, 0, 0, 166, 1436, 1, 0, 0, 0, 168, 1438, 1, 0, 0, 0, 170, 171, 3, 6, 3, 0, 171, 172, 5, 0, 0, 1, 172, 183, 1, 0, 0, 0, 173, 174, 3, 20, 10, 0, 174, 175, 5, 0, 0, 1, 175, 183, 1, 0, 0, 0, 176, 177, 3, 52, 26, 0, 177, 178, 5, 0, 0, 1, 178, 183, 1, 0, 0, 0, 179, 180, 3, 2, 1, 0, 180, 181, 5, 0, 0, 1, 181, 183, 1, 0, 0, 0, 182, 170, 1, 0, 0, 0, 182, 173, 1, 0, 0, 0, 182, 176, 1, 0, 0, 0, 182, 179, 1, 0, 0, 0, 183, 1, 1, 0, 0, 0, 184, 185, 5, 42, 0, 0, 185, 189, 5, 139, 0, 0, 186, 188, 3, 8, 4, 0, 187, 186, 1, 0, 0, 0, 188, 191, 1, 0, 0, 0, 189, 187, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, 192, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 192, 193, 5, 140, 0, 0, 193, 3, 1, 0, 0, 0, 194, 195, 5, 43, 0, 0, 195, 196, 3, 168, 84, 0, 196, 197, 5, 136, 0, 0, 197, 5, 1, 0, 0, 0, 198, 199, 5, 11, 0, 0, 199, 200, 3, 166, 83, 0, 200, 201, 5, 86, 0, 0, 201, 202, 3, 168, 84, 0, 202, 203, 5, 79, 0, 0, 203, 204, 3, 168, 84, 0, 204, 205, 5, 78, 0, 0, 205, 206, 3, 168, 84, 0, 206, 210, 5, 139, 0, 0, 207, 209, 3, 8, 4, 0, 208, 207, 1, 0, 0, 0, 209, 212, 1, 0, 0, 0, 210, 208, 1, 0, 0, 0, 210, 211, 1, 0, 0, 0, 211, 213, 1, 0, 0, 0, 212, 210, 1, 0, 0, 0, 213, 214, 5, 140, 0, 0, 214, 7, 1, 0, 0, 0, 215, 224, 3, 4, 2, 0, 216, 224, 3, 18, 9, 0, 217, 224, 3, 10, 5, 0, 218, 224, 3, 98, 49, 0, 219, 224, 3, 110, 55, 0, 220, 224, 3, 146, 73, 0, 221, 224, 3, 58, 29, 0, 222, 224, 3, 32, 16, 0, 223, 215, 1, 0, 0, 0, 223, 216, 1, 0, 0, 0, 223, 217, 1, 0, 0, 0, 223, 218, 1, 0, 0, 0, 223, 219, 1, 0, 0, 0, 223, 220, 1, 0, 0, 0, 223, 221, 1, 0, 0, 0, 223, 222, 1, 0, 0, 0, 224, 9, 1, 0, 0, 0, 225, 226, 5, 43, 0, 0, 226, 227, 5, 46, 0, 0, 227, 228, 3, 166, 83, 0, 228, 229, 5, 136, 0, 0, 229, 236, 1, 0, 0, 0, 230, 231, 5, 43, 0, 0, 231, 232, 5, 48, 0, 0, 232, 233, 3, 166, 83, 0, 233, 234, 5, 136, 0, 0, 234, 236, 1, 0, 0, 0, 235, 225, 1, 0, 0, 0, 235, 230, 1, 0, 0, 0, 236, 11, 1, 0, 0, 0, 237, 238, 5, 44, 0, 0, 238, 239, 5, 45, 0, 0, 239, 240, 3, 166, 83, 0, 240, 241, 5, 86, 0, 0, 241, 242, 3, 168, 84, 0, 242, 243, 5, 136, 0, 0, 243, 13, 1, 0, 0, 0, 244, 245, 5, 44, 0, 0, 245, 246, 5, 46, 0, 0, 246, 247, 3, 166, 83, 0, 247, 248, 5, 79, 0, 0, 248, 249, 3, 168, 84, 0, 249, 250, 5, 136, 0, 0, 250, 15, 1, 0, 0, 0, 251, 256, 3, 10, 5, 0, 252, 256, 3, 12, 6, 0, 253, 256, 3, 14, 7, 0, 254, 256, 3, 32, 16, 0, 255, 251, 1, 0, 0, 0, 255, 252, 1, 0, 0, 0, 255, 253, 1, 0, 0, 0, 255, 254, 1, 0, 0, 0, 256, 17, 1, 0, 0, 0, 257, 258, 5, 45, 0, 0, 258, 259, 3, 166, 83, 0, 259, 260, 5, 86, 0, 0, 260, 263, 3, 168, 84, 0, 261, 262, 5, 87, 0, 0, 262, 264, 3, 168, 84, 0, 263, 261, 1, 0, 0, 0, 263, 264, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 266, 5, 136, 0, 0, 266, 19, 1, 0, 0, 0, 267, 269, 3, 16, 8, 0, 268, 267, 1, 0, 0, 0, 269, 272, 1, 0, 0, 0, 270, 268, 1, 0, 0, 0, 270, 271, 1, 0, 0, 0, 271, 273, 1, 0, 0, 0, 272, 270, 1, 0, 0, 0, 273, 274, 5, 46, 0, 0, 274, 276, 3, 166, 83, 0, 275, 277, 3, 22, 11, 0, 276, 275, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 279, 5, 86, 0, 0, 279, 280, 3, 168, 84, 0, 280, 281, 5, 79, 0, 0, 281, 291, 3, 168, 84, 0, 282, 283, 5, 91, 0, 0, 283, 288, 3, 26, 13, 0, 284, 285, 5, 137, 0, 0, 285, 287, 3, 26, 13, 0, 286, 284, 1, 0, 0, 0, 287, 290, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 292, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 291, 282, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 293, 1, 0, 0, 0, 293, 297, 5, 139, 0, 0, 294, 296, 3, 34, 17, 0, 295, 294, 1, 0, 0, 0, 296, 299, 1, 0, 0, 0, 297, 295, 1, 0, 0, 0, 297, 298, 1, 0, 0, 0, 298, 300, 1, 0, 0, 0, 299, 297, 1, 0, 0, 0, 300, 301, 5, 140, 0, 0, 301, 21, 1, 0, 0, 0, 302, 303, 5, 145, 0, 0, 303, 308, 3, 24, 12, 0, 304, 305, 5, 137, 0, 0, 305, 307, 3, 24, 12, 0, 306, 304, 1, 0, 0, 0, 307, 310, 1, 0, 0, 0, 308, 306, 1, 0, 0, 0, 308, 309, 1, 0, 0, 0, 309, 311, 1, 0, 0, 0, 310, 308, 1, 0, 0, 0, 311, 312, 5, 146, 0, 0, 312, 23, 1, 0, 0, 0, 313, 314, 5, 49, 0, 0, 314, 317, 3, 166, 83, 0, 315, 316, 5, 135, 0, 0, 316, 318, 5, 39, 0, 0, 317, 315, 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 333, 1, 0, 0, 0, 319, 320, 5, 38, 0, 0, 320, 330, 3, 166, 83, 0, 321, 322, 5, 40, 0, 0, 322, 327, 3, 26, 13, 0, 323, 324, 5, 147, 0, 0, 324, 326, 3, 26, 13, 0, 325, 323, 1, 0, 0, 0, 326, 329, 1, 0, 0, 0, 327, 325, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 331, 1, 0, 0, 0, 329, 327, 1, 0, 0, 0, 330, 321, 1, 0, 0, 0, 330, 331, 1, 0, 0, 0, 331, 333, 1, 0, 0, 0, 332, 313, 1, 0, 0, 0, 332, 319, 1, 0, 0, 0, 333, 25, 1, 0, 0, 0, 334, 336, 3, 166, 83, 0, 335, 337, 3, 28, 14, 0, 336, 335, 1, 0, 0, 0, 336, 337, 1, 0, 0, 0, 337, 27, 1, 0, 0, 0, 338, 339, 5, 145, 0, 0, 339, 344, 3, 30, 15, 0, 340, 341, 5, 137, 0, 0, 341, 343, 3, 30, 15, 0, 342, 340, 1, 0, 0, 0, 343, 346, 1, 0, 0, 0, 344, 342, 1, 0, 0, 0, 344, 345, 1, 0, 0, 0, 345, 347, 1, 0, 0, 0, 346, 344, 1, 0, 0, 0, 347, 348, 5, 146, 0, 0, 348, 29, 1, 0, 0, 0, 349, 350, 5, 45, 0, 0, 350, 357, 3, 166, 83, 0, 351, 352, 5, 46, 0, 0, 352, 357, 3, 26, 13, 0, 353, 354, 5, 38, 0, 0, 354, 357, 3, 166, 83, 0, 355, 357, 3, 148, 74, 0, 356, 349, 1, 0, 0, 0, 356, 351, 1, 0, 0, 0, 356, 353, 1, 0, 0, 0, 356, 355, 1, 0, 0, 0, 357, 31, 1, 0, 0, 0, 358, 359, 5, 37, 0, 0, 359, 361, 3, 166, 83, 0, 360, 362, 3, 22, 11, 0, 361, 360, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 363, 1, 0, 0, 0, 363, 364, 5, 148, 0, 0, 364, 365, 3, 148, 74, 0, 365, 366, 5, 136, 0, 0, 366, 33, 1, 0, 0, 0, 367, 372, 3, 40, 20, 0, 368, 372, 3, 44, 22, 0, 369, 372, 3, 38, 19, 0, 370, 372, 3, 36, 18, 0, 371, 367, 1, 0, 0, 0, 371, 368, 1, 0, 0, 0, 371, 369, 1, 0, 0, 0, 371, 370, 1, 0, 0, 0, 372, 35, 1, 0, 0, 0, 373, 374, 5, 2, 0, 0, 374, 375, 3, 166, 83, 0, 375, 376, 5, 86, 0, 0, 376, 377, 3, 168, 84, 0, 377, 378, 5, 3, 0, 0, 378, 381, 3, 168, 84, 0, 379, 380, 5, 5, 0, 0, 380, 382, 3, 50, 25, 0, 381, 379, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 383, 1, 0, 0, 0, 383, 384, 5, 136, 0, 0, 384, 37, 1, 0, 0, 0, 385, 387, 5, 59, 0, 0, 386, 385, 1, 0, 0, 0, 386, 387, 1, 0, 0, 0, 387, 388, 1, 0, 0, 0, 388, 389, 5, 51, 0, 0, 389, 390, 3, 166, 83, 0, 390, 391, 5, 86, 0, 0, 391, 392, 3, 168, 84, 0, 392, 393, 5, 135, 0, 0, 393, 394, 3, 148, 74, 0, 394, 395, 5, 134, 0, 0, 395, 396, 3, 148, 74, 0, 396, 397, 5, 139, 0, 0, 397, 398, 5, 103, 0, 0, 398, 399, 5, 86, 0, 0, 399, 401, 3, 168, 84, 0, 400, 402, 3, 76, 38, 0, 401, 400, 1, 0, 0, 0, 401, 402, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 404, 5, 136, 0, 0, 404, 405, 5, 140, 0, 0, 405, 39, 1, 0, 0, 0, 406, 408, 3, 46, 23, 0, 407, 406, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 409, 1, 0, 0, 0, 409, 410, 5, 49, 0, 0, 410, 411, 3, 166, 83, 0, 411, 412, 5, 86, 0, 0, 412, 413, 3, 168, 84, 0, 413, 414, 5, 135, 0, 0, 414, 415, 3, 148, 74, 0, 415, 419, 5, 139, 0, 0, 416, 418, 3, 42, 21, 0, 417, 416, 1, 0, 0, 0, 418, 421, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 419, 1, 0, 0, 0, 422, 423, 5, 140, 0, 0, 423, 41, 1, 0, 0, 0, 424, 425, 5, 93, 0, 0, 425, 426, 5, 86, 0, 0, 426, 428, 3, 168, 84, 0, 427, 429, 3, 76, 38, 0, 428, 427, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 430, 1, 0, 0, 0, 430, 431, 5, 136, 0, 0, 431, 458, 1, 0, 0, 0, 432, 433, 5, 94, 0, 0, 433, 434, 5, 86, 0, 0, 434, 436, 3, 168, 84, 0, 435, 437, 3, 76, 38, 0, 436, 435, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 438, 1, 0, 0, 0, 438, 439, 5, 136, 0, 0, 439, 458, 1, 0, 0, 0, 440, 441, 5, 1, 0, 0, 441, 442, 5, 86, 0, 0, 442, 444, 3, 168, 84, 0, 443, 445, 3, 76, 38, 0, 444, 443, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 447, 5, 136, 0, 0, 447, 458, 1, 0, 0, 0, 448, 449, 5, 95, 0, 0, 449, 450, 5, 96, 0, 0, 450, 451, 5, 86, 0, 0, 451, 452, 3, 168, 84, 0, 452, 453, 5, 97, 0, 0, 453, 454, 5, 86, 0, 0, 454, 455, 3, 168, 84, 0, 455, 456, 5, 136, 0, 0, 456, 458, 1, 0, 0, 0, 457, 424, 1, 0, 0, 0, 457, 432, 1, 0, 0, 0, 457, 440, 1, 0, 0, 0, 457, 448, 1, 0, 0, 0, 458, 43, 1, 0, 0, 0, 459, 461, 3, 46, 23, 0, 460, 459, 1, 0, 0, 0, 460, 461, 1, 0, 0, 0, 461, 462, 1, 0, 0, 0, 462, 463, 5, 50, 0, 0, 463, 464, 3, 166, 83, 0, 464, 465, 5, 86, 0, 0, 465, 466, 3, 168, 84, 0, 466, 467, 5, 135, 0, 0, 467, 468, 3, 156, 78, 0, 468, 470, 3, 50, 25, 0, 469, 471, 5, 114, 0, 0, 470, 469, 1, 0, 0, 0, 470, 471, 1, 0, 0, 0, 471, 474, 1, 0, 0, 0, 472, 473, 5, 84, 0, 0, 473, 475, 3, 168, 84, 0, 474, 472, 1, 0, 0, 0, 474, 475, 1, 0, 0, 0, 475, 476, 1, 0, 0, 0, 476, 480, 5, 139, 0, 0, 477, 479, 3, 48, 24, 0, 478, 477, 1, 0, 0, 0, 479, 482, 1, 0, 0, 0, 480, 478, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 483, 1, 0, 0, 0, 482, 480, 1, 0, 0, 0, 483, 484, 5, 140, 0, 0, 484, 45, 1, 0, 0, 0, 485, 487, 5, 34, 0, 0, 486, 488, 7, 0, 0, 0, 487, 486, 1, 0, 0, 0, 487, 488, 1, 0, 0, 0, 488, 47, 1, 0, 0, 0, 489, 490, 5, 100, 0, 0, 490, 491, 5, 86, 0, 0, 491, 493, 3, 168, 84, 0, 492, 494, 3, 76, 38, 0, 493, 492, 1, 0, 0, 0, 493, 494, 1, 0, 0, 0, 494, 495, 1, 0, 0, 0, 495, 496, 5, 136, 0, 0, 496, 523, 1, 0, 0, 0, 497, 498, 5, 101, 0, 0, 498, 499, 5, 86, 0, 0, 499, 501, 3, 168, 84, 0, 500, 502, 3, 76, 38, 0, 501, 500, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 504, 5, 136, 0, 0, 504, 523, 1, 0, 0, 0, 505, 506, 5, 102, 0, 0, 506, 507, 5, 86, 0, 0, 507, 509, 3, 168, 84, 0, 508, 510, 3, 76, 38, 0, 509, 508, 1, 0, 0, 0, 509, 510, 1, 0, 0, 0, 510, 511, 1, 0, 0, 0, 511, 512, 5, 136, 0, 0, 512, 523, 1, 0, 0, 0, 513, 514, 5, 95, 0, 0, 514, 515, 5, 96, 0, 0, 515, 516, 5, 86, 0, 0, 516, 517, 3, 168, 84, 0, 517, 518, 5, 97, 0, 0, 518, 519, 5, 86, 0, 0, 519, 520, 3, 168, 84, 0, 520, 521, 5, 136, 0, 0, 521, 523, 1, 0, 0, 0, 522, 489, 1, 0, 0, 0, 522, 497, 1, 0, 0, 0, 522, 505, 1, 0, 0, 0, 522, 513, 1, 0, 0, 0, 523, 49, 1, 0, 0, 0, 524, 525, 5, 45, 0, 0, 525, 534, 3, 166, 83, 0, 526, 527, 5, 46, 0, 0, 527, 529, 3, 166, 83, 0, 528, 530, 3, 28, 14, 0, 529, 528, 1, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 534, 1, 0, 0, 0, 531, 532, 5, 38, 0, 0, 532, 534, 3, 166, 83, 0, 533, 524, 1, 0, 0, 0, 533, 526, 1, 0, 0, 0, 533, 531, 1, 0, 0, 0, 534, 51, 1, 0, 0, 0, 535, 537, 3, 16, 8, 0, 536, 535, 1, 0, 0, 0, 537, 540, 1, 0, 0, 0, 538, 536, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 541, 1, 0, 0, 0, 540, 538, 1, 0, 0, 0, 541, 542, 5, 48, 0, 0, 542, 543, 3, 166, 83, 0, 543, 544, 5, 86, 0, 0, 544, 545, 3, 168, 84, 0, 545, 546, 5, 79, 0, 0, 546, 549, 3, 168, 84, 0, 547, 548, 5, 80, 0, 0, 548, 550, 5, 149, 0, 0, 549, 547, 1, 0, 0, 0, 549, 550, 1, 0, 0, 0, 550, 551, 1, 0, 0, 0, 551, 555, 5, 139, 0, 0, 552, 554, 3, 54, 27, 0, 553, 552, 1, 0, 0, 0, 554, 557, 1, 0, 0, 0, 555, 553, 1, 0, 0, 0, 555, 556, 1, 0, 0, 0, 556, 558, 1, 0, 0, 0, 557, 555, 1, 0, 0, 0, 558, 559, 5, 140, 0, 0, 559, 53, 1, 0, 0, 0, 560, 567, 3, 68, 34, 0, 561, 567, 3, 70, 35, 0, 562, 567, 3, 80, 40, 0, 563, 567, 3, 60, 30, 0, 564, 567, 3, 62, 31, 0, 565, 567, 3, 56, 28, 0, 566, 560, 1, 0, 0, 0, 566, 561, 1, 0, 0, 0, 566, 562, 1, 0, 0, 0, 566, 563, 1, 0, 0, 0, 566, 564, 1, 0, 0, 0, 566, 565, 1, 0, 0, 0, 567, 55, 1, 0, 0, 0, 568, 569, 5, 2, 0, 0, 569, 570, 3, 166, 83, 0, 570, 571, 5, 86, 0, 0, 571, 572, 3, 168, 84, 0, 572, 573, 5, 40, 0, 0, 573, 574, 3, 26, 13, 0, 574, 575, 5, 138, 0, 0, 575, 576, 3, 166, 83, 0, 576, 577, 5, 136, 0, 0, 577, 57, 1, 0, 0, 0, 578, 579, 5, 4, 0, 0, 579, 580, 3, 166, 83, 0, 580, 581, 5, 86, 0, 0, 581, 582, 3, 168, 84, 0, 582, 583, 5, 6, 0, 0, 583, 584, 3, 26, 13, 0, 584, 585, 5, 67, 0, 0, 585, 586, 3, 166, 83, 0, 586, 587, 5, 138, 0, 0, 587, 588, 3, 166, 83, 0, 588, 589, 5, 136, 0, 0, 589, 59, 1, 0, 0, 0, 590, 592, 5, 24, 0, 0, 591, 593, 5, 42, 0, 0, 592, 591, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 596, 3, 166, 83, 0, 595, 597, 3, 22, 11, 0, 596, 595, 1, 0, 0, 0, 596, 597, 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 599, 5, 86, 0, 0, 599, 600, 3, 168, 84, 0, 600, 602, 5, 27, 0, 0, 601, 603, 5, 11, 0, 0, 602, 601, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 604, 1, 0, 0, 0, 604, 605, 3, 26, 13, 0, 605, 606, 5, 28, 0, 0, 606, 635, 3, 168, 84, 0, 607, 608, 5, 51, 0, 0, 608, 609, 3, 168, 84, 0, 609, 613, 5, 139, 0, 0, 610, 612, 3, 64, 32, 0, 611, 610, 1, 0, 0, 0, 612, 615, 1, 0, 0, 0, 613, 611, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 616, 1, 0, 0, 0, 615, 613, 1, 0, 0, 0, 616, 617, 5, 140, 0, 0, 617, 636, 1, 0, 0, 0, 618, 619, 5, 42, 0, 0, 619, 622, 3, 168, 84, 0, 620, 621, 5, 51, 0, 0, 621, 623, 3, 168, 84, 0, 622, 620, 1, 0, 0, 0, 622, 623, 1, 0, 0, 0, 623, 633, 1, 0, 0, 0, 624, 628, 5, 139, 0, 0, 625, 627, 3, 64, 32, 0, 626, 625, 1, 0, 0, 0, 627, 630, 1, 0, 0, 0, 628, 626, 1, 0, 0, 0, 628, 629, 1, 0, 0, 0, 629, 631, 1, 0, 0, 0, 630, 628, 1, 0, 0, 0, 631, 634, 5, 140, 0, 0, 632, 634, 5, 136, 0, 0, 633, 624, 1, 0, 0, 0, 633, 632, 1, 0, 0, 0, 634, 636, 1, 0, 0, 0, 635, 607, 1, 0, 0, 0, 635, 618, 1, 0, 0, 0, 636, 61, 1, 0, 0, 0, 637, 638, 5, 24, 0, 0, 638, 639, 3, 166, 83, 0, 639, 640, 5, 86, 0, 0, 640, 641, 3, 168, 84, 0, 641, 642, 5, 26, 0, 0, 642, 643, 3, 166, 83, 0, 643, 644, 3, 28, 14, 0, 644, 645, 5, 136, 0, 0, 645, 63, 1, 0, 0, 0, 646, 647, 5, 18, 0, 0, 647, 704, 5, 136, 0, 0, 648, 649, 5, 19, 0, 0, 649, 650, 5, 20, 0, 0, 650, 651, 3, 166, 83, 0, 651, 652, 5, 136, 0, 0, 652, 704, 1, 0, 0, 0, 653, 654, 5, 29, 0, 0, 654, 655, 3, 168, 84, 0, 655, 656, 5, 136, 0, 0, 656, 704, 1, 0, 0, 0, 657, 658, 5, 29, 0, 0, 658, 659, 3, 166, 83, 0, 659, 660, 5, 138, 0, 0, 660, 670, 3, 166, 83, 0, 661, 662, 5, 66, 0, 0, 662, 666, 5, 139, 0, 0, 663, 665, 3, 66, 33, 0, 664, 663, 1, 0, 0, 0, 665, 668, 1, 0, 0, 0, 666, 664, 1, 0, 0, 0, 666, 667, 1, 0, 0, 0, 667, 669, 1, 0, 0, 0, 668, 666, 1, 0, 0, 0, 669, 671, 5, 140, 0, 0, 670, 661, 1, 0, 0, 0, 670, 671, 1, 0, 0, 0, 671, 672, 1, 0, 0, 0, 672, 673, 5, 136, 0, 0, 673, 704, 1, 0, 0, 0, 674, 676, 5, 30, 0, 0, 675, 677, 5, 38, 0, 0, 676, 675, 1, 0, 0, 0, 676, 677, 1, 0, 0, 0, 677, 678, 1, 0, 0, 0, 678, 679, 3, 166, 83, 0, 679, 680, 5, 57, 0, 0, 680, 681, 3, 26, 13, 0, 681, 682, 5, 136, 0, 0, 682, 704, 1, 0, 0, 0, 683, 684, 5, 31, 0, 0, 684, 685, 3, 166, 83, 0, 685, 686, 5, 149, 0, 0, 686, 687, 5, 136, 0, 0, 687, 704, 1, 0, 0, 0, 688, 689, 5, 32, 0, 0, 689, 690, 3, 26, 13, 0, 690, 691, 5, 138, 0, 0, 691, 692, 3, 166, 83, 0, 692, 693, 3, 166, 83, 0, 693, 694, 3, 168, 84, 0, 694, 695, 5, 136, 0, 0, 695, 704, 1, 0, 0, 0, 696, 697, 5, 95, 0, 0, 697, 704, 5, 136, 0, 0, 698, 699, 5, 33, 0, 0, 699, 700, 5, 149, 0, 0, 700, 701, 3, 168, 84, 0, 701, 702, 5, 136, 0, 0, 702, 704, 1, 0, 0, 0, 703, 646, 1, 0, 0, 0, 703, 648, 1, 0, 0, 0, 703, 653, 1, 0, 0, 0, 703, 657, 1, 0, 0, 0, 703, 674, 1, 0, 0, 0, 703, 683, 1, 0, 0, 0, 703, 688, 1, 0, 0, 0, 703, 696, 1, 0, 0, 0, 703, 698, 1, 0, 0, 0, 704, 65, 1, 0, 0, 0, 705, 706, 3, 166, 83, 0, 706, 707, 5, 60, 0, 0, 707, 708, 3, 166, 83, 0, 708, 709, 5, 136, 0, 0, 709, 67, 1, 0, 0, 0, 710, 711, 5, 51, 0, 0, 711, 713, 3, 166, 83, 0, 712, 714, 3, 22, 11, 0, 713, 712, 1, 0, 0, 0, 713, 714, 1, 0, 0, 0, 714, 715, 1, 0, 0, 0, 715, 716, 5, 86, 0, 0, 716, 717, 3, 168, 84, 0, 717, 718, 5, 135, 0, 0, 718, 719, 3, 148, 74, 0, 719, 720, 5, 134, 0, 0, 720, 721, 3, 148, 74, 0, 721, 722, 5, 88, 0, 0, 722, 724, 3, 84, 42, 0, 723, 725, 3, 76, 38, 0, 724, 723, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 727, 1, 0, 0, 0, 726, 728, 3, 82, 41, 0, 727, 726, 1, 0, 0, 0, 727, 728, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 5, 90, 0, 0, 730, 732, 3, 86, 43, 0, 731, 733, 3, 90, 45, 0, 732, 731, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 735, 1, 0, 0, 0, 734, 736, 3, 74, 37, 0, 735, 734, 1, 0, 0, 0, 735, 736, 1, 0, 0, 0, 736, 738, 1, 0, 0, 0, 737, 739, 3, 72, 36, 0, 738, 737, 1, 0, 0, 0, 738, 739, 1, 0, 0, 0, 739, 740, 1, 0, 0, 0, 740, 741, 5, 136, 0, 0, 741, 69, 1, 0, 0, 0, 742, 743, 5, 52, 0, 0, 743, 745, 3, 166, 83, 0, 744, 746, 3, 22, 11, 0, 745, 744, 1, 0, 0, 0, 745, 746, 1, 0, 0, 0, 746, 747, 1, 0, 0, 0, 747, 748, 5, 86, 0, 0, 748, 749, 3, 168, 84, 0, 749, 750, 5, 135, 0, 0, 750, 751, 3, 148, 74, 0, 751, 752, 5, 134, 0, 0, 752, 754, 3, 148, 74, 0, 753, 755, 3, 76, 38, 0, 754, 753, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 757, 1, 0, 0, 0, 756, 758, 3, 90, 45, 0, 757, 756, 1, 0, 0, 0, 757, 758, 1, 0, 0, 0, 758, 760, 1, 0, 0, 0, 759, 761, 3, 74, 37, 0, 760, 759, 1, 0, 0, 0, 760, 761, 1, 0, 0, 0, 761, 763, 1, 0, 0, 0, 762, 764, 3, 72, 36, 0, 763, 762, 1, 0, 0, 0, 763, 764, 1, 0, 0, 0, 764, 765, 1, 0, 0, 0, 765, 766, 5, 136, 0, 0, 766, 71, 1, 0, 0, 0, 767, 768, 5, 68, 0, 0, 768, 769, 5, 67, 0, 0, 769, 770, 3, 166, 83, 0, 770, 73, 1, 0, 0, 0, 771, 772, 5, 9, 0, 0, 772, 773, 5, 7, 0, 0, 773, 774, 3, 166, 83, 0, 774, 775, 5, 67, 0, 0, 775, 776, 3, 168, 84, 0, 776, 75, 1, 0, 0, 0, 777, 778, 5, 12, 0, 0, 778, 787, 5, 15, 0, 0, 779, 780, 5, 12, 0, 0, 780, 781, 7, 1, 0, 0, 781, 782, 5, 16, 0, 0, 782, 783, 5, 141, 0, 0, 783, 784, 3, 88, 44, 0, 784, 785, 5, 142, 0, 0, 785, 787, 1, 0, 0, 0, 786, 777, 1, 0, 0, 0, 786, 779, 1, 0, 0, 0, 787, 77, 1, 0, 0, 0, 788, 789, 5, 67, 0, 0, 789, 790, 5, 141, 0, 0, 790, 795, 3, 130, 65, 0, 791, 792, 5, 137, 0, 0, 792, 794, 3, 130, 65, 0, 793, 791, 1, 0, 0, 0, 794, 797, 1, 0, 0, 0, 795, 793, 1, 0, 0, 0, 795, 796, 1, 0, 0, 0, 796, 798, 1, 0, 0, 0, 797, 795, 1, 0, 0, 0, 798, 799, 5, 142, 0, 0, 799, 79, 1, 0, 0, 0, 800, 801, 5, 53, 0, 0, 801, 802, 3, 166, 83, 0, 802, 803, 5, 86, 0, 0, 803, 804, 3, 168, 84, 0, 804, 805, 5, 54, 0, 0, 805, 806, 3, 166, 83, 0, 806, 807, 5, 135, 0, 0, 807, 809, 3, 148, 74, 0, 808, 810, 3, 90, 45, 0, 809, 808, 1, 0, 0, 0, 809, 810, 1, 0, 0, 0, 810, 811, 1, 0, 0, 0, 811, 812, 5, 136, 0, 0, 812, 81, 1, 0, 0, 0, 813, 814, 5, 89, 0, 0, 814, 815, 3, 148, 74, 0, 815, 83, 1, 0, 0, 0, 816, 817, 7, 2, 0, 0, 817, 85, 1, 0, 0, 0, 818, 837, 5, 92, 0, 0, 819, 820, 5, 45, 0, 0, 820, 837, 3, 166, 83, 0, 821, 822, 5, 38, 0, 0, 822, 837, 3, 166, 83, 0, 823, 824, 5, 47, 0, 0, 824, 833, 5, 141, 0, 0, 825, 830, 3, 26, 13, 0, 826, 827, 5, 137, 0, 0, 827, 829, 3, 26, 13, 0, 828, 826, 1, 0, 0, 0, 829, 832, 1, 0, 0, 0, 830, 828, 1, 0, 0, 0, 830, 831, 1, 0, 0, 0, 831, 834, 1, 0, 0, 0, 832, 830, 1, 0, 0, 0, 833, 825, 1, 0, 0, 0, 833, 834, 1, 0, 0, 0, 834, 835, 1, 0, 0, 0, 835, 837, 5, 142, 0, 0, 836, 818, 1, 0, 0, 0, 836, 819, 1, 0, 0, 0, 836, 821, 1, 0, 0, 0, 836, 823, 1, 0, 0, 0, 837, 87, 1, 0, 0, 0, 838, 843, 3, 166, 83, 0, 839, 840, 5, 137, 0, 0, 840, 842, 3, 166, 83, 0, 841, 839, 1, 0, 0, 0, 842, 845, 1, 0, 0, 0, 843, 841, 1, 0, 0, 0, 843, 844, 1, 0, 0, 0, 844, 89, 1, 0, 0, 0, 845, 843, 1, 0, 0, 0, 846, 847, 5, 91, 0, 0, 847, 851, 5, 139, 0, 0, 848, 850, 3, 92, 46, 0, 849, 848, 1, 0, 0, 0, 850, 853, 1, 0, 0, 0, 851, 849, 1, 0, 0, 0, 851, 852, 1, 0, 0, 0, 852, 854, 1, 0, 0, 0, 853, 851, 1, 0, 0, 0, 854, 855, 5, 140, 0, 0, 855, 91, 1, 0, 0, 0, 856, 857, 5, 25, 0, 0, 857, 858, 3, 166, 83, 0, 858, 859, 5, 86, 0, 0, 859, 860, 3, 168, 84, 0, 860, 861, 5, 141, 0, 0, 861, 862, 3, 88, 44, 0, 862, 863, 5, 142, 0, 0, 863, 864, 5, 136, 0, 0, 864, 939, 1, 0, 0, 0, 865, 866, 5, 63, 0, 0, 866, 867, 3, 166, 83, 0, 867, 868, 5, 86, 0, 0, 868, 869, 3, 168, 84, 0, 869, 870, 5, 135, 0, 0, 870, 871, 3, 148, 74, 0, 871, 872, 3, 94, 47, 0, 872, 873, 5, 136, 0, 0, 873, 939, 1, 0, 0, 0, 874, 875, 5, 64, 0, 0, 875, 876, 3, 166, 83, 0, 876, 877, 5, 86, 0, 0, 877, 878, 3, 168, 84, 0, 878, 879, 5, 135, 0, 0, 879, 880, 3, 156, 78, 0, 880, 883, 3, 50, 25, 0, 881, 882, 5, 84, 0, 0, 882, 884, 3, 168, 84, 0, 883, 881, 1, 0, 0, 0, 883, 884, 1, 0, 0, 0, 884, 885, 1, 0, 0, 0, 885, 886, 3, 94, 47, 0, 886, 887, 5, 136, 0, 0, 887, 939, 1, 0, 0, 0, 888, 889, 5, 46, 0, 0, 889, 890, 3, 166, 83, 0, 890, 891, 5, 86, 0, 0, 891, 892, 3, 168, 84, 0, 892, 893, 5, 135, 0, 0, 893, 895, 3, 166, 83, 0, 894, 896, 3, 28, 14, 0, 895, 894, 1, 0, 0, 0, 895, 896, 1, 0, 0, 0, 896, 898, 1, 0, 0, 0, 897, 899, 3, 78, 39, 0, 898, 897, 1, 0, 0, 0, 898, 899, 1, 0, 0, 0, 899, 902, 1, 0, 0, 0, 900, 901, 5, 20, 0, 0, 901, 903, 5, 55, 0, 0, 902, 900, 1, 0, 0, 0, 902, 903, 1, 0, 0, 0, 903, 904, 1, 0, 0, 0, 904, 905, 5, 136, 0, 0, 905, 939, 1, 0, 0, 0, 906, 907, 5, 7, 0, 0, 907, 908, 3, 166, 83, 0, 908, 909, 5, 86, 0, 0, 909, 910, 3, 168, 84, 0, 910, 911, 5, 135, 0, 0, 911, 912, 3, 166, 83, 0, 912, 913, 5, 55, 0, 0, 913, 914, 3, 148, 74, 0, 914, 915, 5, 136, 0, 0, 915, 939, 1, 0, 0, 0, 916, 917, 5, 53, 0, 0, 917, 918, 3, 166, 83, 0, 918, 919, 5, 86, 0, 0, 919, 920, 3, 168, 84, 0, 920, 921, 5, 135, 0, 0, 921, 924, 3, 166, 83, 0, 922, 923, 5, 55, 0, 0, 923, 925, 3, 148, 74, 0, 924, 922, 1, 0, 0, 0, 924, 925, 1, 0, 0, 0, 925, 926, 1, 0, 0, 0, 926, 927, 5, 136, 0, 0, 927, 939, 1, 0, 0, 0, 928, 929, 5, 24, 0, 0, 929, 930, 3, 166, 83, 0, 930, 931, 5, 86, 0, 0, 931, 932, 3, 168, 84, 0, 932, 933, 5, 135, 0, 0, 933, 934, 3, 166, 83, 0, 934, 935, 5, 138, 0, 0, 935, 936, 3, 166, 83, 0, 936, 937, 5, 136, 0, 0, 937, 939, 1, 0, 0, 0, 938, 856, 1, 0, 0, 0, 938, 865, 1, 0, 0, 0, 938, 874, 1, 0, 0, 0, 938, 888, 1, 0, 0, 0, 938, 906, 1, 0, 0, 0, 938, 916, 1, 0, 0, 0, 938, 928, 1, 0, 0, 0, 939, 93, 1, 0, 0, 0, 940, 941, 5, 141, 0, 0, 941, 946, 3, 96, 48, 0, 942, 943, 5, 137, 0, 0, 943, 945, 3, 96, 48, 0, 944, 942, 1, 0, 0, 0, 945, 948, 1, 0, 0, 0, 946, 944, 1, 0, 0, 0, 946, 947, 1, 0, 0, 0, 947, 949, 1, 0, 0, 0, 948, 946, 1, 0, 0, 0, 949, 950, 5, 142, 0, 0, 950, 95, 1, 0, 0, 0, 951, 952, 7, 3, 0, 0, 952, 97, 1, 0, 0, 0, 953, 954, 5, 62, 0, 0, 954, 955, 3, 100, 50, 0, 955, 99, 1, 0, 0, 0, 956, 959, 3, 102, 51, 0, 957, 959, 3, 106, 53, 0, 958, 956, 1, 0, 0, 0, 958, 957, 1, 0, 0, 0, 959, 101, 1, 0, 0, 0, 960, 961, 5, 63, 0, 0, 961, 962, 3, 166, 83, 0, 962, 963, 5, 86, 0, 0, 963, 964, 3, 168, 84, 0, 964, 965, 5, 73, 0, 0, 965, 966, 3, 166, 83, 0, 966, 967, 5, 135, 0, 0, 967, 968, 3, 148, 74, 0, 968, 969, 5, 74, 0, 0, 969, 972, 3, 104, 52, 0, 970, 971, 5, 75, 0, 0, 971, 973, 3, 158, 79, 0, 972, 970, 1, 0, 0, 0, 972, 973, 1, 0, 0, 0, 973, 974, 1, 0, 0, 0, 974, 975, 5, 136, 0, 0, 975, 103, 1, 0, 0, 0, 976, 983, 5, 108, 0, 0, 977, 978, 5, 109, 0, 0, 978, 979, 5, 143, 0, 0, 979, 980, 3, 148, 74, 0, 980, 981, 5, 144, 0, 0, 981, 983, 1, 0, 0, 0, 982, 976, 1, 0, 0, 0, 982, 977, 1, 0, 0, 0, 983, 105, 1, 0, 0, 0, 984, 985, 5, 64, 0, 0, 985, 986, 3, 166, 83, 0, 986, 987, 5, 86, 0, 0, 987, 988, 3, 168, 84, 0, 988, 989, 5, 139, 0, 0, 989, 990, 3, 108, 54, 0, 990, 991, 3, 108, 54, 0, 991, 992, 5, 140, 0, 0, 992, 107, 1, 0, 0, 0, 993, 994, 3, 50, 25, 0, 994, 995, 5, 65, 0, 0, 995, 996, 3, 166, 83, 0, 996, 997, 5, 86, 0, 0, 997, 998, 3, 168, 84, 0, 998, 1000, 3, 156, 78, 0, 999, 1001, 5, 114, 0, 0, 1000, 999, 1, 0, 0, 0, 1000, 1001, 1, 0, 0, 0, 1001, 1004, 1, 0, 0, 0, 1002, 1003, 5, 81, 0, 0, 1003, 1005, 3, 168, 84, 0, 1004, 1002, 1, 0, 0, 0, 1004, 1005, 1, 0, 0, 0, 1005, 1007, 1, 0, 0, 0, 1006, 1008, 5, 83, 0, 0, 1007, 1006, 1, 0, 0, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1011, 1, 0, 0, 0, 1009, 1010, 5, 84, 0, 0, 1010, 1012, 3, 168, 84, 0, 1011, 1009, 1, 0, 0, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1014, 1, 0, 0, 0, 1013, 1015, 5, 85, 0, 0, 1014, 1013, 1, 0, 0, 0, 1014, 1015, 1, 0, 0, 0, 1015, 1016, 1, 0, 0, 0, 1016, 1017, 5, 136, 0, 0, 1017, 109, 1, 0, 0, 0, 1018, 1020, 5, 56, 0, 0, 1019, 1021, 3, 22, 11, 0, 1020, 1019, 1, 0, 0, 0, 1020, 1021, 1, 0, 0, 0, 1021, 1022, 1, 0, 0, 0, 1022, 1024, 3, 166, 83, 0, 1023, 1025, 3, 112, 56, 0, 1024, 1023, 1, 0, 0, 0, 1024, 1025, 1, 0, 0, 0, 1025, 1026, 1, 0, 0, 0, 1026, 1027, 5, 57, 0, 0, 1027, 1029, 3, 166, 83, 0, 1028, 1030, 3, 28, 14, 0, 1029, 1028, 1, 0, 0, 0, 1029, 1030, 1, 0, 0, 0, 1030, 1033, 1, 0, 0, 0, 1031, 1032, 5, 86, 0, 0, 1032, 1034, 3, 168, 84, 0, 1033, 1031, 1, 0, 0, 0, 1033, 1034, 1, 0, 0, 0, 1034, 1037, 1, 0, 0, 0, 1035, 1036, 5, 80, 0, 0, 1036, 1038, 5, 149, 0, 0, 1037, 1035, 1, 0, 0, 0, 1037, 1038, 1, 0, 0, 0, 1038, 1039, 1, 0, 0, 0, 1039, 1043, 5, 139, 0, 0, 1040, 1042, 3, 114, 57, 0, 1041, 1040, 1, 0, 0, 0, 1042, 1045, 1, 0, 0, 0, 1043, 1041, 1, 0, 0, 0, 1043, 1044, 1, 0, 0, 0, 1044, 1046, 1, 0, 0, 0, 1045, 1043, 1, 0, 0, 0, 1046, 1047, 5, 140, 0, 0, 1047, 111, 1, 0, 0, 0, 1048, 1049, 3, 28, 14, 0, 1049, 113, 1, 0, 0, 0, 1050, 1051, 5, 61, 0, 0, 1051, 1058, 3, 100, 50, 0, 1052, 1058, 3, 128, 64, 0, 1053, 1058, 3, 124, 62, 0, 1054, 1058, 3, 118, 59, 0, 1055, 1058, 3, 126, 63, 0, 1056, 1058, 3, 116, 58, 0, 1057, 1050, 1, 0, 0, 0, 1057, 1052, 1, 0, 0, 0, 1057, 1053, 1, 0, 0, 0, 1057, 1054, 1, 0, 0, 0, 1057, 1055, 1, 0, 0, 0, 1057, 1056, 1, 0, 0, 0, 1058, 115, 1, 0, 0, 0, 1059, 1060, 5, 58, 0, 0, 1060, 1061, 3, 166, 83, 0, 1061, 1062, 5, 60, 0, 0, 1062, 1063, 3, 166, 83, 0, 1063, 1064, 5, 138, 0, 0, 1064, 1065, 3, 166, 83, 0, 1065, 1066, 5, 136, 0, 0, 1066, 117, 1, 0, 0, 0, 1067, 1068, 5, 10, 0, 0, 1068, 1072, 5, 139, 0, 0, 1069, 1071, 3, 120, 60, 0, 1070, 1069, 1, 0, 0, 0, 1071, 1074, 1, 0, 0, 0, 1072, 1070, 1, 0, 0, 0, 1072, 1073, 1, 0, 0, 0, 1073, 1075, 1, 0, 0, 0, 1074, 1072, 1, 0, 0, 0, 1075, 1076, 5, 140, 0, 0, 1076, 1077, 5, 136, 0, 0, 1077, 119, 1, 0, 0, 0, 1078, 1079, 3, 166, 83, 0, 1079, 1080, 5, 60, 0, 0, 1080, 1081, 5, 63, 0, 0, 1081, 1082, 3, 166, 83, 0, 1082, 1083, 5, 136, 0, 0, 1083, 1093, 1, 0, 0, 0, 1084, 1085, 3, 166, 83, 0, 1085, 1086, 5, 60, 0, 0, 1086, 1087, 5, 64, 0, 0, 1087, 1088, 3, 166, 83, 0, 1088, 1089, 5, 138, 0, 0, 1089, 1090, 3, 166, 83, 0, 1090, 1091, 5, 136, 0, 0, 1091, 1093, 1, 0, 0, 0, 1092, 1078, 1, 0, 0, 0, 1092, 1084, 1, 0, 0, 0, 1093, 121, 1, 0, 0, 0, 1094, 1095, 3, 26, 13, 0, 1095, 1096, 5, 20, 0, 0, 1096, 1101, 5, 55, 0, 0, 1097, 1098, 5, 138, 0, 0, 1098, 1100, 3, 166, 83, 0, 1099, 1097, 1, 0, 0, 0, 1100, 1103, 1, 0, 0, 0, 1101, 1099, 1, 0, 0, 0, 1101, 1102, 1, 0, 0, 0, 1102, 1104, 1, 0, 0, 0, 1103, 1101, 1, 0, 0, 0, 1104, 1105, 5, 136, 0, 0, 1105, 123, 1, 0, 0, 0, 1106, 1107, 5, 58, 0, 0, 1107, 1108, 3, 166, 83, 0, 1108, 1109, 5, 60, 0, 0, 1109, 1110, 5, 63, 0, 0, 1110, 1111, 3, 166, 83, 0, 1111, 1112, 5, 136, 0, 0, 1112, 125, 1, 0, 0, 0, 1113, 1114, 5, 70, 0, 0, 1114, 1115, 3, 166, 83, 0, 1115, 1116, 5, 71, 0, 0, 1116, 1117, 5, 72, 0, 0, 1117, 1118, 5, 67, 0, 0, 1118, 1119, 5, 53, 0, 0, 1119, 1120, 3, 166, 83, 0, 1120, 1121, 5, 69, 0, 0, 1121, 1122, 5, 64, 0, 0, 1122, 1123, 3, 166, 83, 0, 1123, 1124, 5, 138, 0, 0, 1124, 1125, 3, 166, 83, 0, 1125, 1126, 5, 136, 0, 0, 1126, 127, 1, 0, 0, 0, 1127, 1128, 5, 58, 0, 0, 1128, 1129, 3, 130, 65, 0, 1129, 1130, 5, 60, 0, 0, 1130, 1133, 3, 134, 67, 0, 1131, 1132, 5, 36, 0, 0, 1132, 1134, 3, 168, 84, 0, 1133, 1131, 1, 0, 0, 0, 1133, 1134, 1, 0, 0, 0, 1134, 1135, 1, 0, 0, 0, 1135, 1136, 5, 136, 0, 0, 1136, 129, 1, 0, 0, 0, 1137, 1138, 3, 166, 83, 0, 1138, 1139, 5, 138, 0, 0, 1139, 1140, 3, 132, 66, 0, 1140, 131, 1, 0, 0, 0, 1141, 1154, 3, 166, 83, 0, 1142, 1154, 5, 103, 0, 0, 1143, 1154, 5, 93, 0, 0, 1144, 1154, 5, 94, 0, 0, 1145, 1154, 5, 1, 0, 0, 1146, 1154, 5, 100, 0, 0, 1147, 1154, 5, 101, 0, 0, 1148, 1154, 5, 102, 0, 0, 1149, 1154, 5, 104, 0, 0, 1150, 1154, 5, 105, 0, 0, 1151, 1154, 5, 106, 0, 0, 1152, 1154, 5, 107, 0, 0, 1153, 1141, 1, 0, 0, 0, 1153, 1142, 1, 0, 0, 0, 1153, 1143, 1, 0, 0, 0, 1153, 1144, 1, 0, 0, 0, 1153, 1145, 1, 0, 0, 0, 1153, 1146, 1, 0, 0, 0, 1153, 1147, 1, 0, 0, 0, 1153, 1148, 1, 0, 0, 0, 1153, 1149, 1, 0, 0, 0, 1153, 1150, 1, 0, 0, 0, 1153, 1151, 1, 0, 0, 0, 1153, 1152, 1, 0, 0, 0, 1154, 133, 1, 0, 0, 0, 1155, 1156, 5, 82, 0, 0, 1156, 1157, 5, 138, 0, 0, 1157, 1192, 3, 166, 83, 0, 1158, 1159, 5, 63, 0, 0, 1159, 1160, 3, 166, 83, 0, 1160, 1161, 5, 138, 0, 0, 1161, 1162, 3, 138, 69, 0, 1162, 1192, 1, 0, 0, 0, 1163, 1164, 5, 64, 0, 0, 1164, 1165, 3, 166, 83, 0, 1165, 1166, 5, 138, 0, 0, 1166, 1167, 3, 166, 83, 0, 1167, 1168, 5, 138, 0, 0, 1168, 1169, 3, 140, 70, 0, 1169, 1192, 1, 0, 0, 0, 1170, 1171, 5, 46, 0, 0, 1171, 1173, 3, 166, 83, 0, 1172, 1174, 3, 28, 14, 0, 1173, 1172, 1, 0, 0, 0, 1173, 1174, 1, 0, 0, 0, 1174, 1175, 1, 0, 0, 0, 1175, 1176, 5, 138, 0, 0, 1176, 1177, 3, 130, 65, 0, 1177, 1192, 1, 0, 0, 0, 1178, 1179, 5, 48, 0, 0, 1179, 1180, 3, 166, 83, 0, 1180, 1181, 5, 138, 0, 0, 1181, 1183, 3, 166, 83, 0, 1182, 1184, 3, 28, 14, 0, 1183, 1182, 1, 0, 0, 0, 1183, 1184, 1, 0, 0, 0, 1184, 1186, 1, 0, 0, 0, 1185, 1187, 3, 142, 71, 0, 1186, 1185, 1, 0, 0, 0, 1186, 1187, 1, 0, 0, 0, 1187, 1189, 1, 0, 0, 0, 1188, 1190, 3, 136, 68, 0, 1189, 1188, 1, 0, 0, 0, 1189, 1190, 1, 0, 0, 0, 1190, 1192, 1, 0, 0, 0, 1191, 1155, 1, 0, 0, 0, 1191, 1158, 1, 0, 0, 0, 1191, 1163, 1, 0, 0, 0, 1191, 1170, 1, 0, 0, 0, 1191, 1178, 1, 0, 0, 0, 1192, 135, 1, 0, 0, 0, 1193, 1194, 5, 68, 0, 0, 1194, 1195, 3, 142, 71, 0, 1195, 137, 1, 0, 0, 0, 1196, 1197, 7, 4, 0, 0, 1197, 139, 1, 0, 0, 0, 1198, 1199, 7, 5, 0, 0, 1199, 141, 1, 0, 0, 0, 1200, 1201, 5, 66, 0, 0, 1201, 1205, 5, 139, 0, 0, 1202, 1204, 3, 144, 72, 0, 1203, 1202, 1, 0, 0, 0, 1204, 1207, 1, 0, 0, 0, 1205, 1203, 1, 0, 0, 0, 1205, 1206, 1, 0, 0, 0, 1206, 1208, 1, 0, 0, 0, 1207, 1205, 1, 0, 0, 0, 1208, 1209, 5, 140, 0, 0, 1209, 143, 1, 0, 0, 0, 1210, 1211, 3, 166, 83, 0, 1211, 1212, 5, 60, 0, 0, 1212, 1213, 5, 11, 0, 0, 1213, 1214, 5, 25, 0, 0, 1214, 1215, 5, 141, 0, 0, 1215, 1216, 3, 88, 44, 0, 1216, 1217, 5, 142, 0, 0, 1217, 1218, 5, 136, 0, 0, 1218, 1309, 1, 0, 0, 0, 1219, 1220, 3, 166, 83, 0, 1220, 1221, 5, 60, 0, 0, 1221, 1222, 5, 63, 0, 0, 1222, 1229, 3, 166, 83, 0, 1223, 1224, 5, 69, 0, 0, 1224, 1225, 5, 64, 0, 0, 1225, 1226, 3, 166, 83, 0, 1226, 1227, 5, 138, 0, 0, 1227, 1228, 3, 166, 83, 0, 1228, 1230, 1, 0, 0, 0, 1229, 1223, 1, 0, 0, 0, 1229, 1230, 1, 0, 0, 0, 1230, 1231, 1, 0, 0, 0, 1231, 1232, 5, 136, 0, 0, 1232, 1309, 1, 0, 0, 0, 1233, 1234, 3, 166, 83, 0, 1234, 1235, 5, 60, 0, 0, 1235, 1236, 5, 64, 0, 0, 1236, 1237, 3, 166, 83, 0, 1237, 1238, 5, 138, 0, 0, 1238, 1245, 3, 166, 83, 0, 1239, 1240, 5, 69, 0, 0, 1240, 1241, 5, 64, 0, 0, 1241, 1242, 3, 166, 83, 0, 1242, 1243, 5, 138, 0, 0, 1243, 1244, 3, 166, 83, 0, 1244, 1246, 1, 0, 0, 0, 1245, 1239, 1, 0, 0, 0, 1245, 1246, 1, 0, 0, 0, 1246, 1247, 1, 0, 0, 0, 1247, 1248, 5, 136, 0, 0, 1248, 1309, 1, 0, 0, 0, 1249, 1250, 3, 166, 83, 0, 1250, 1251, 5, 60, 0, 0, 1251, 1252, 5, 46, 0, 0, 1252, 1254, 3, 166, 83, 0, 1253, 1255, 3, 28, 14, 0, 1254, 1253, 1, 0, 0, 0, 1254, 1255, 1, 0, 0, 0, 1255, 1264, 1, 0, 0, 0, 1256, 1257, 5, 69, 0, 0, 1257, 1258, 5, 64, 0, 0, 1258, 1259, 3, 166, 83, 0, 1259, 1260, 5, 138, 0, 0, 1260, 1261, 3, 166, 83, 0, 1261, 1265, 1, 0, 0, 0, 1262, 1263, 5, 20, 0, 0, 1263, 1265, 5, 55, 0, 0, 1264, 1256, 1, 0, 0, 0, 1264, 1262, 1, 0, 0, 0, 1264, 1265, 1, 0, 0, 0, 1265, 1266, 1, 0, 0, 0, 1266, 1267, 5, 136, 0, 0, 1267, 1309, 1, 0, 0, 0, 1268, 1269, 3, 166, 83, 0, 1269, 1270, 5, 60, 0, 0, 1270, 1271, 5, 7, 0, 0, 1271, 1272, 3, 166, 83, 0, 1272, 1273, 5, 66, 0, 0, 1273, 1277, 5, 139, 0, 0, 1274, 1276, 3, 122, 61, 0, 1275, 1274, 1, 0, 0, 0, 1276, 1279, 1, 0, 0, 0, 1277, 1275, 1, 0, 0, 0, 1277, 1278, 1, 0, 0, 0, 1278, 1280, 1, 0, 0, 0, 1279, 1277, 1, 0, 0, 0, 1280, 1281, 5, 140, 0, 0, 1281, 1282, 5, 136, 0, 0, 1282, 1309, 1, 0, 0, 0, 1283, 1284, 3, 166, 83, 0, 1284, 1285, 5, 60, 0, 0, 1285, 1286, 5, 53, 0, 0, 1286, 1287, 3, 166, 83, 0, 1287, 1288, 5, 136, 0, 0, 1288, 1309, 1, 0, 0, 0, 1289, 1290, 3, 166, 83, 0, 1290, 1292, 5, 60, 0, 0, 1291, 1293, 5, 11, 0, 0, 1292, 1291, 1, 0, 0, 0, 1292, 1293, 1, 0, 0, 0, 1293, 1294, 1, 0, 0, 0, 1294, 1295, 5, 24, 0, 0, 1295, 1296, 3, 166, 83, 0, 1296, 1297, 5, 138, 0, 0, 1297, 1304, 3, 166, 83, 0, 1298, 1299, 5, 69, 0, 0, 1299, 1300, 5, 64, 0, 0, 1300, 1301, 3, 166, 83, 0, 1301, 1302, 5, 138, 0, 0, 1302, 1303, 3, 166, 83, 0, 1303, 1305, 1, 0, 0, 0, 1304, 1298, 1, 0, 0, 0, 1304, 1305, 1, 0, 0, 0, 1305, 1306, 1, 0, 0, 0, 1306, 1307, 5, 136, 0, 0, 1307, 1309, 1, 0, 0, 0, 1308, 1210, 1, 0, 0, 0, 1308, 1219, 1, 0, 0, 0, 1308, 1233, 1, 0, 0, 0, 1308, 1249, 1, 0, 0, 0, 1308, 1268, 1, 0, 0, 0, 1308, 1283, 1, 0, 0, 0, 1308, 1289, 1, 0, 0, 0, 1309, 145, 1, 0, 0, 0, 1310, 1311, 5, 53, 0, 0, 1311, 1312, 3, 166, 83, 0, 1312, 1313, 5, 60, 0, 0, 1313, 1314, 3, 166, 83, 0, 1314, 1315, 5, 138, 0, 0, 1315, 1317, 3, 166, 83, 0, 1316, 1318, 3, 142, 71, 0, 1317, 1316, 1, 0, 0, 0, 1317, 1318, 1, 0, 0, 0, 1318, 1319, 1, 0, 0, 0, 1319, 1320, 5, 136, 0, 0, 1320, 147, 1, 0, 0, 0, 1321, 1379, 3, 154, 77, 0, 1322, 1379, 5, 115, 0, 0, 1323, 1379, 5, 116, 0, 0, 1324, 1325, 5, 117, 0, 0, 1325, 1379, 3, 168, 84, 0, 1326, 1327, 5, 118, 0, 0, 1327, 1328, 5, 145, 0, 0, 1328, 1329, 3, 166, 83, 0, 1329, 1330, 5, 146, 0, 0, 1330, 1379, 1, 0, 0, 0, 1331, 1332, 5, 119, 0, 0, 1332, 1333, 5, 145, 0, 0, 1333, 1335, 3, 166, 83, 0, 1334, 1336, 3, 28, 14, 0, 1335, 1334, 1, 0, 0, 0, 1335, 1336, 1, 0, 0, 0, 1336, 1337, 1, 0, 0, 0, 1337, 1338, 5, 146, 0, 0, 1338, 1379, 1, 0, 0, 0, 1339, 1340, 5, 41, 0, 0, 1340, 1341, 5, 145, 0, 0, 1341, 1342, 3, 166, 83, 0, 1342, 1343, 5, 146, 0, 0, 1343, 1379, 1, 0, 0, 0, 1344, 1345, 5, 120, 0, 0, 1345, 1346, 5, 145, 0, 0, 1346, 1347, 3, 148, 74, 0, 1347, 1348, 5, 146, 0, 0, 1348, 1379, 1, 0, 0, 0, 1349, 1350, 5, 121, 0, 0, 1350, 1351, 5, 145, 0, 0, 1351, 1352, 3, 148, 74, 0, 1352, 1353, 5, 146, 0, 0, 1353, 1379, 1, 0, 0, 0, 1354, 1355, 5, 122, 0, 0, 1355, 1359, 5, 139, 0, 0, 1356, 1358, 3, 150, 75, 0, 1357, 1356, 1, 0, 0, 0, 1358, 1361, 1, 0, 0, 0, 1359, 1357, 1, 0, 0, 0, 1359, 1360, 1, 0, 0, 0, 1360, 1362, 1, 0, 0, 0, 1361, 1359, 1, 0, 0, 0, 1362, 1379, 5, 140, 0, 0, 1363, 1364, 5, 8, 0, 0, 1364, 1365, 5, 86, 0, 0, 1365, 1366, 3, 168, 84, 0, 1366, 1368, 5, 139, 0, 0, 1367, 1369, 3, 152, 76, 0, 1368, 1367, 1, 0, 0, 0, 1369, 1370, 1, 0, 0, 0, 1370, 1368, 1, 0, 0, 0, 1370, 1371, 1, 0, 0, 0, 1371, 1372, 1, 0, 0, 0, 1372, 1373, 5, 140, 0, 0, 1373, 1379, 1, 0, 0, 0, 1374, 1376, 3, 166, 83, 0, 1375, 1377, 3, 28, 14, 0, 1376, 1375, 1, 0, 0, 0, 1376, 1377, 1, 0, 0, 0, 1377, 1379, 1, 0, 0, 0, 1378, 1321, 1, 0, 0, 0, 1378, 1322, 1, 0, 0, 0, 1378, 1323, 1, 0, 0, 0, 1378, 1324, 1, 0, 0, 0, 1378, 1326, 1, 0, 0, 0, 1378, 1331, 1, 0, 0, 0, 1378, 1339, 1, 0, 0, 0, 1378, 1344, 1, 0, 0, 0, 1378, 1349, 1, 0, 0, 0, 1378, 1354, 1, 0, 0, 0, 1378, 1363, 1, 0, 0, 0, 1378, 1374, 1, 0, 0, 0, 1379, 149, 1, 0, 0, 0, 1380, 1381, 3, 166, 83, 0, 1381, 1382, 5, 135, 0, 0, 1382, 1383, 3, 148, 74, 0, 1383, 1384, 5, 136, 0, 0, 1384, 151, 1, 0, 0, 0, 1385, 1386, 3, 166, 83, 0, 1386, 1387, 5, 86, 0, 0, 1387, 1388, 3, 168, 84, 0, 1388, 1389, 5, 135, 0, 0, 1389, 1390, 3, 148, 74, 0, 1390, 1391, 5, 136, 0, 0, 1391, 153, 1, 0, 0, 0, 1392, 1393, 7, 6, 0, 0, 1393, 155, 1, 0, 0, 0, 1394, 1395, 7, 7, 0, 0, 1395, 157, 1, 0, 0, 0, 1396, 1405, 3, 168, 84, 0, 1397, 1405, 5, 149, 0, 0, 1398, 1405, 5, 150, 0, 0, 1399, 1405, 5, 131, 0, 0, 1400, 1405, 5, 132, 0, 0, 1401, 1405, 5, 133, 0, 0, 1402, 1405, 3, 160, 80, 0, 1403, 1405, 3, 164, 82, 0, 1404, 1396, 1, 0, 0, 0, 1404, 1397, 1, 0, 0, 0, 1404, 1398, 1, 0, 0, 0, 1404, 1399, 1, 0, 0, 0, 1404, 1400, 1, 0, 0, 0, 1404, 1401, 1, 0, 0, 0, 1404, 1402, 1, 0, 0, 0, 1404, 1403, 1, 0, 0, 0, 1405, 159, 1, 0, 0, 0, 1406, 1415, 5, 139, 0, 0, 1407, 1412, 3, 162, 81, 0, 1408, 1409, 5, 137, 0, 0, 1409, 1411, 3, 162, 81, 0, 1410, 1408, 1, 0, 0, 0, 1411, 1414, 1, 0, 0, 0, 1412, 1410, 1, 0, 0, 0, 1412, 1413, 1, 0, 0, 0, 1413, 1416, 1, 0, 0, 0, 1414, 1412, 1, 0, 0, 0, 1415, 1407, 1, 0, 0, 0, 1415, 1416, 1, 0, 0, 0, 1416, 1417, 1, 0, 0, 0, 1417, 1418, 5, 140, 0, 0, 1418, 161, 1, 0, 0, 0, 1419, 1420, 3, 168, 84, 0, 1420, 1421, 5, 135, 0, 0, 1421, 1422, 3, 158, 79, 0, 1422, 163, 1, 0, 0, 0, 1423, 1432, 5, 141, 0, 0, 1424, 1429, 3, 158, 79, 0, 1425, 1426, 5, 137, 0, 0, 1426, 1428, 3, 158, 79, 0, 1427, 1425, 1, 0, 0, 0, 1428, 1431, 1, 0, 0, 0, 1429, 1427, 1, 0, 0, 0, 1429, 1430, 1, 0, 0, 0, 1430, 1433, 1, 0, 0, 0, 1431, 1429, 1, 0, 0, 0, 1432, 1424, 1, 0, 0, 0, 1432, 1433, 1, 0, 0, 0, 1433, 1434, 1, 0, 0, 0, 1434, 1435, 5, 142, 0, 0, 1435, 165, 1, 0, 0, 0, 1436, 1437, 7, 8, 0, 0, 1437, 167, 1, 0, 0, 0, 1438, 1439, 5, 152, 0, 0, 1439, 169, 1, 0, 0, 0, 129, 182, 189, 210, 223, 235, 255, 263, 270, 276, 288, 291, 297, 308, 317, 327, 330, 332, 336, 344, 356, 361, 371, 381, 386, 401, 407, 419, 428, 436, 444, 457, 460, 470, 474, 480, 487, 493, 501, 509, 522, 529, 533, 538, 549, 555, 566, 592, 596, 602, 613, 622, 628, 633, 635, 666, 670, 676, 703, 713, 724, 727, 732, 735, 738, 745, 754, 757, 760, 763, 786, 795, 809, 830, 833, 836, 843, 851, 883, 895, 898, 902, 924, 938, 946, 958, 972, 982, 1000, 1004, 1007, 1011, 1014, 1020, 1024, 1029, 1033, 1037, 1043, 1057, 1072, 1092, 1101, 1133, 1153, 1173, 1183, 1186, 1189, 1191, 1205, 1229, 1245, 1254, 1264, 1277, 1292, 1304, 1308, 1317, 1335, 1359, 1370, 1376, 1378, 1404, 1412, 1415, 1429, 1432] \ No newline at end of file +[4, 1, 156, 1441, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 183, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 188, 8, 1, 10, 1, 12, 1, 191, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 209, 8, 3, 10, 3, 12, 3, 212, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 224, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 236, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 256, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 264, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 269, 8, 10, 10, 10, 12, 10, 272, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 277, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 287, 8, 10, 10, 10, 12, 10, 290, 9, 10, 3, 10, 292, 8, 10, 1, 10, 1, 10, 5, 10, 296, 8, 10, 10, 10, 12, 10, 299, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 307, 8, 11, 10, 11, 12, 11, 310, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 318, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 326, 8, 12, 10, 12, 12, 12, 329, 9, 12, 3, 12, 331, 8, 12, 3, 12, 333, 8, 12, 1, 13, 1, 13, 3, 13, 337, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 343, 8, 14, 10, 14, 12, 14, 346, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 357, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 362, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 372, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 382, 8, 18, 1, 18, 1, 18, 1, 19, 3, 19, 387, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 402, 8, 19, 1, 19, 1, 19, 1, 19, 1, 20, 3, 20, 408, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 418, 8, 20, 10, 20, 12, 20, 421, 9, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 429, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 437, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 445, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 458, 8, 21, 1, 22, 3, 22, 461, 8, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 471, 8, 22, 1, 22, 1, 22, 3, 22, 475, 8, 22, 1, 22, 1, 22, 5, 22, 479, 8, 22, 10, 22, 12, 22, 482, 9, 22, 1, 22, 1, 22, 1, 23, 1, 23, 3, 23, 488, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 494, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 502, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 510, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 523, 8, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 530, 8, 25, 1, 25, 1, 25, 3, 25, 534, 8, 25, 1, 26, 5, 26, 537, 8, 26, 10, 26, 12, 26, 540, 9, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 550, 8, 26, 1, 26, 1, 26, 5, 26, 554, 8, 26, 10, 26, 12, 26, 557, 9, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 567, 8, 27, 1, 28, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 3, 30, 593, 8, 30, 1, 30, 1, 30, 3, 30, 597, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 603, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 5, 30, 612, 8, 30, 10, 30, 12, 30, 615, 9, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 623, 8, 30, 1, 30, 1, 30, 5, 30, 627, 8, 30, 10, 30, 12, 30, 630, 9, 30, 1, 30, 1, 30, 3, 30, 634, 8, 30, 3, 30, 636, 8, 30, 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, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 665, 8, 32, 10, 32, 12, 32, 668, 9, 32, 1, 32, 3, 32, 671, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 677, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 704, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 3, 34, 714, 8, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 725, 8, 34, 1, 34, 3, 34, 728, 8, 34, 1, 34, 1, 34, 1, 34, 3, 34, 733, 8, 34, 1, 34, 3, 34, 736, 8, 34, 1, 34, 3, 34, 739, 8, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 3, 35, 746, 8, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 755, 8, 35, 1, 35, 3, 35, 758, 8, 35, 1, 35, 3, 35, 761, 8, 35, 1, 35, 3, 35, 764, 8, 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, 38, 1, 38, 3, 38, 787, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 794, 8, 39, 10, 39, 12, 39, 797, 9, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 810, 8, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 5, 43, 829, 8, 43, 10, 43, 12, 43, 832, 9, 43, 3, 43, 834, 8, 43, 1, 43, 3, 43, 837, 8, 43, 1, 44, 1, 44, 1, 44, 5, 44, 842, 8, 44, 10, 44, 12, 44, 845, 9, 44, 1, 45, 1, 45, 1, 45, 5, 45, 850, 8, 45, 10, 45, 12, 45, 853, 9, 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, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 884, 8, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 896, 8, 46, 1, 46, 3, 46, 899, 8, 46, 1, 46, 1, 46, 3, 46, 903, 8, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 925, 8, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 939, 8, 46, 1, 47, 1, 47, 1, 47, 1, 47, 5, 47, 945, 8, 47, 10, 47, 12, 47, 948, 9, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 3, 50, 959, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 973, 8, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 983, 8, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 1001, 8, 54, 1, 54, 1, 54, 3, 54, 1005, 8, 54, 1, 54, 3, 54, 1008, 8, 54, 1, 54, 1, 54, 3, 54, 1012, 8, 54, 1, 54, 3, 54, 1015, 8, 54, 1, 54, 1, 54, 1, 55, 1, 55, 3, 55, 1021, 8, 55, 1, 55, 1, 55, 3, 55, 1025, 8, 55, 1, 55, 1, 55, 1, 55, 3, 55, 1030, 8, 55, 1, 55, 1, 55, 3, 55, 1034, 8, 55, 1, 55, 1, 55, 3, 55, 1038, 8, 55, 1, 55, 1, 55, 5, 55, 1042, 8, 55, 10, 55, 12, 55, 1045, 9, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 1058, 8, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 5, 59, 1071, 8, 59, 10, 59, 12, 59, 1074, 9, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1093, 8, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 5, 61, 1100, 8, 61, 10, 61, 12, 61, 1103, 9, 61, 1, 61, 1, 61, 1, 62, 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, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1134, 8, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1154, 8, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1174, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1184, 8, 67, 1, 67, 3, 67, 1187, 8, 67, 1, 67, 3, 67, 1190, 8, 67, 3, 67, 1192, 8, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 5, 71, 1204, 8, 71, 10, 71, 12, 71, 1207, 9, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1230, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1246, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1255, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1265, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 5, 72, 1276, 8, 72, 10, 72, 12, 72, 1279, 9, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1293, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1305, 8, 72, 1, 72, 1, 72, 3, 72, 1309, 8, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1318, 8, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 3, 74, 1336, 8, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 5, 74, 1358, 8, 74, 10, 74, 12, 74, 1361, 9, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 4, 74, 1369, 8, 74, 11, 74, 12, 74, 1370, 1, 74, 1, 74, 1, 74, 1, 74, 3, 74, 1377, 8, 74, 3, 74, 1379, 8, 74, 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, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 3, 79, 1405, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 5, 80, 1411, 8, 80, 10, 80, 12, 80, 1414, 9, 80, 3, 80, 1416, 8, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 5, 82, 1428, 8, 82, 10, 82, 12, 82, 1431, 9, 82, 3, 82, 1433, 8, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 0, 0, 85, 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, 0, 10, 1, 0, 49, 50, 2, 0, 17, 17, 35, 35, 1, 0, 13, 14, 1, 0, 104, 108, 3, 0, 1, 1, 99, 103, 105, 106, 3, 0, 1, 1, 99, 100, 105, 106, 2, 0, 101, 103, 105, 106, 1, 0, 124, 131, 1, 0, 111, 114, 10, 0, 1, 1, 4, 7, 10, 10, 12, 35, 42, 42, 47, 47, 77, 77, 97, 98, 109, 109, 152, 152, 1560, 0, 182, 1, 0, 0, 0, 2, 184, 1, 0, 0, 0, 4, 194, 1, 0, 0, 0, 6, 198, 1, 0, 0, 0, 8, 223, 1, 0, 0, 0, 10, 235, 1, 0, 0, 0, 12, 237, 1, 0, 0, 0, 14, 244, 1, 0, 0, 0, 16, 255, 1, 0, 0, 0, 18, 257, 1, 0, 0, 0, 20, 270, 1, 0, 0, 0, 22, 302, 1, 0, 0, 0, 24, 332, 1, 0, 0, 0, 26, 334, 1, 0, 0, 0, 28, 338, 1, 0, 0, 0, 30, 356, 1, 0, 0, 0, 32, 358, 1, 0, 0, 0, 34, 371, 1, 0, 0, 0, 36, 373, 1, 0, 0, 0, 38, 386, 1, 0, 0, 0, 40, 407, 1, 0, 0, 0, 42, 457, 1, 0, 0, 0, 44, 460, 1, 0, 0, 0, 46, 485, 1, 0, 0, 0, 48, 522, 1, 0, 0, 0, 50, 533, 1, 0, 0, 0, 52, 538, 1, 0, 0, 0, 54, 566, 1, 0, 0, 0, 56, 568, 1, 0, 0, 0, 58, 578, 1, 0, 0, 0, 60, 590, 1, 0, 0, 0, 62, 637, 1, 0, 0, 0, 64, 703, 1, 0, 0, 0, 66, 705, 1, 0, 0, 0, 68, 710, 1, 0, 0, 0, 70, 742, 1, 0, 0, 0, 72, 767, 1, 0, 0, 0, 74, 771, 1, 0, 0, 0, 76, 786, 1, 0, 0, 0, 78, 788, 1, 0, 0, 0, 80, 800, 1, 0, 0, 0, 82, 813, 1, 0, 0, 0, 84, 816, 1, 0, 0, 0, 86, 836, 1, 0, 0, 0, 88, 838, 1, 0, 0, 0, 90, 846, 1, 0, 0, 0, 92, 938, 1, 0, 0, 0, 94, 940, 1, 0, 0, 0, 96, 951, 1, 0, 0, 0, 98, 953, 1, 0, 0, 0, 100, 958, 1, 0, 0, 0, 102, 960, 1, 0, 0, 0, 104, 982, 1, 0, 0, 0, 106, 984, 1, 0, 0, 0, 108, 993, 1, 0, 0, 0, 110, 1018, 1, 0, 0, 0, 112, 1048, 1, 0, 0, 0, 114, 1057, 1, 0, 0, 0, 116, 1059, 1, 0, 0, 0, 118, 1067, 1, 0, 0, 0, 120, 1092, 1, 0, 0, 0, 122, 1094, 1, 0, 0, 0, 124, 1106, 1, 0, 0, 0, 126, 1113, 1, 0, 0, 0, 128, 1127, 1, 0, 0, 0, 130, 1137, 1, 0, 0, 0, 132, 1153, 1, 0, 0, 0, 134, 1191, 1, 0, 0, 0, 136, 1193, 1, 0, 0, 0, 138, 1196, 1, 0, 0, 0, 140, 1198, 1, 0, 0, 0, 142, 1200, 1, 0, 0, 0, 144, 1308, 1, 0, 0, 0, 146, 1310, 1, 0, 0, 0, 148, 1378, 1, 0, 0, 0, 150, 1380, 1, 0, 0, 0, 152, 1385, 1, 0, 0, 0, 154, 1392, 1, 0, 0, 0, 156, 1394, 1, 0, 0, 0, 158, 1404, 1, 0, 0, 0, 160, 1406, 1, 0, 0, 0, 162, 1419, 1, 0, 0, 0, 164, 1423, 1, 0, 0, 0, 166, 1436, 1, 0, 0, 0, 168, 1438, 1, 0, 0, 0, 170, 171, 3, 6, 3, 0, 171, 172, 5, 0, 0, 1, 172, 183, 1, 0, 0, 0, 173, 174, 3, 20, 10, 0, 174, 175, 5, 0, 0, 1, 175, 183, 1, 0, 0, 0, 176, 177, 3, 52, 26, 0, 177, 178, 5, 0, 0, 1, 178, 183, 1, 0, 0, 0, 179, 180, 3, 2, 1, 0, 180, 181, 5, 0, 0, 1, 181, 183, 1, 0, 0, 0, 182, 170, 1, 0, 0, 0, 182, 173, 1, 0, 0, 0, 182, 176, 1, 0, 0, 0, 182, 179, 1, 0, 0, 0, 183, 1, 1, 0, 0, 0, 184, 185, 5, 42, 0, 0, 185, 189, 5, 140, 0, 0, 186, 188, 3, 8, 4, 0, 187, 186, 1, 0, 0, 0, 188, 191, 1, 0, 0, 0, 189, 187, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, 192, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 192, 193, 5, 141, 0, 0, 193, 3, 1, 0, 0, 0, 194, 195, 5, 43, 0, 0, 195, 196, 3, 168, 84, 0, 196, 197, 5, 137, 0, 0, 197, 5, 1, 0, 0, 0, 198, 199, 5, 11, 0, 0, 199, 200, 3, 166, 83, 0, 200, 201, 5, 87, 0, 0, 201, 202, 3, 168, 84, 0, 202, 203, 5, 80, 0, 0, 203, 204, 3, 168, 84, 0, 204, 205, 5, 79, 0, 0, 205, 206, 3, 168, 84, 0, 206, 210, 5, 140, 0, 0, 207, 209, 3, 8, 4, 0, 208, 207, 1, 0, 0, 0, 209, 212, 1, 0, 0, 0, 210, 208, 1, 0, 0, 0, 210, 211, 1, 0, 0, 0, 211, 213, 1, 0, 0, 0, 212, 210, 1, 0, 0, 0, 213, 214, 5, 141, 0, 0, 214, 7, 1, 0, 0, 0, 215, 224, 3, 4, 2, 0, 216, 224, 3, 18, 9, 0, 217, 224, 3, 10, 5, 0, 218, 224, 3, 98, 49, 0, 219, 224, 3, 110, 55, 0, 220, 224, 3, 146, 73, 0, 221, 224, 3, 58, 29, 0, 222, 224, 3, 32, 16, 0, 223, 215, 1, 0, 0, 0, 223, 216, 1, 0, 0, 0, 223, 217, 1, 0, 0, 0, 223, 218, 1, 0, 0, 0, 223, 219, 1, 0, 0, 0, 223, 220, 1, 0, 0, 0, 223, 221, 1, 0, 0, 0, 223, 222, 1, 0, 0, 0, 224, 9, 1, 0, 0, 0, 225, 226, 5, 43, 0, 0, 226, 227, 5, 46, 0, 0, 227, 228, 3, 166, 83, 0, 228, 229, 5, 137, 0, 0, 229, 236, 1, 0, 0, 0, 230, 231, 5, 43, 0, 0, 231, 232, 5, 48, 0, 0, 232, 233, 3, 166, 83, 0, 233, 234, 5, 137, 0, 0, 234, 236, 1, 0, 0, 0, 235, 225, 1, 0, 0, 0, 235, 230, 1, 0, 0, 0, 236, 11, 1, 0, 0, 0, 237, 238, 5, 44, 0, 0, 238, 239, 5, 45, 0, 0, 239, 240, 3, 166, 83, 0, 240, 241, 5, 87, 0, 0, 241, 242, 3, 168, 84, 0, 242, 243, 5, 137, 0, 0, 243, 13, 1, 0, 0, 0, 244, 245, 5, 44, 0, 0, 245, 246, 5, 46, 0, 0, 246, 247, 3, 166, 83, 0, 247, 248, 5, 80, 0, 0, 248, 249, 3, 168, 84, 0, 249, 250, 5, 137, 0, 0, 250, 15, 1, 0, 0, 0, 251, 256, 3, 10, 5, 0, 252, 256, 3, 12, 6, 0, 253, 256, 3, 14, 7, 0, 254, 256, 3, 32, 16, 0, 255, 251, 1, 0, 0, 0, 255, 252, 1, 0, 0, 0, 255, 253, 1, 0, 0, 0, 255, 254, 1, 0, 0, 0, 256, 17, 1, 0, 0, 0, 257, 258, 5, 45, 0, 0, 258, 259, 3, 166, 83, 0, 259, 260, 5, 87, 0, 0, 260, 263, 3, 168, 84, 0, 261, 262, 5, 88, 0, 0, 262, 264, 3, 168, 84, 0, 263, 261, 1, 0, 0, 0, 263, 264, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 266, 5, 137, 0, 0, 266, 19, 1, 0, 0, 0, 267, 269, 3, 16, 8, 0, 268, 267, 1, 0, 0, 0, 269, 272, 1, 0, 0, 0, 270, 268, 1, 0, 0, 0, 270, 271, 1, 0, 0, 0, 271, 273, 1, 0, 0, 0, 272, 270, 1, 0, 0, 0, 273, 274, 5, 46, 0, 0, 274, 276, 3, 166, 83, 0, 275, 277, 3, 22, 11, 0, 276, 275, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 279, 5, 87, 0, 0, 279, 280, 3, 168, 84, 0, 280, 281, 5, 80, 0, 0, 281, 291, 3, 168, 84, 0, 282, 283, 5, 92, 0, 0, 283, 288, 3, 26, 13, 0, 284, 285, 5, 138, 0, 0, 285, 287, 3, 26, 13, 0, 286, 284, 1, 0, 0, 0, 287, 290, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 292, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 291, 282, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 293, 1, 0, 0, 0, 293, 297, 5, 140, 0, 0, 294, 296, 3, 34, 17, 0, 295, 294, 1, 0, 0, 0, 296, 299, 1, 0, 0, 0, 297, 295, 1, 0, 0, 0, 297, 298, 1, 0, 0, 0, 298, 300, 1, 0, 0, 0, 299, 297, 1, 0, 0, 0, 300, 301, 5, 141, 0, 0, 301, 21, 1, 0, 0, 0, 302, 303, 5, 146, 0, 0, 303, 308, 3, 24, 12, 0, 304, 305, 5, 138, 0, 0, 305, 307, 3, 24, 12, 0, 306, 304, 1, 0, 0, 0, 307, 310, 1, 0, 0, 0, 308, 306, 1, 0, 0, 0, 308, 309, 1, 0, 0, 0, 309, 311, 1, 0, 0, 0, 310, 308, 1, 0, 0, 0, 311, 312, 5, 147, 0, 0, 312, 23, 1, 0, 0, 0, 313, 314, 5, 49, 0, 0, 314, 317, 3, 166, 83, 0, 315, 316, 5, 136, 0, 0, 316, 318, 5, 39, 0, 0, 317, 315, 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 333, 1, 0, 0, 0, 319, 320, 5, 38, 0, 0, 320, 330, 3, 166, 83, 0, 321, 322, 5, 40, 0, 0, 322, 327, 3, 26, 13, 0, 323, 324, 5, 148, 0, 0, 324, 326, 3, 26, 13, 0, 325, 323, 1, 0, 0, 0, 326, 329, 1, 0, 0, 0, 327, 325, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 331, 1, 0, 0, 0, 329, 327, 1, 0, 0, 0, 330, 321, 1, 0, 0, 0, 330, 331, 1, 0, 0, 0, 331, 333, 1, 0, 0, 0, 332, 313, 1, 0, 0, 0, 332, 319, 1, 0, 0, 0, 333, 25, 1, 0, 0, 0, 334, 336, 3, 166, 83, 0, 335, 337, 3, 28, 14, 0, 336, 335, 1, 0, 0, 0, 336, 337, 1, 0, 0, 0, 337, 27, 1, 0, 0, 0, 338, 339, 5, 146, 0, 0, 339, 344, 3, 30, 15, 0, 340, 341, 5, 138, 0, 0, 341, 343, 3, 30, 15, 0, 342, 340, 1, 0, 0, 0, 343, 346, 1, 0, 0, 0, 344, 342, 1, 0, 0, 0, 344, 345, 1, 0, 0, 0, 345, 347, 1, 0, 0, 0, 346, 344, 1, 0, 0, 0, 347, 348, 5, 147, 0, 0, 348, 29, 1, 0, 0, 0, 349, 350, 5, 45, 0, 0, 350, 357, 3, 166, 83, 0, 351, 352, 5, 46, 0, 0, 352, 357, 3, 26, 13, 0, 353, 354, 5, 38, 0, 0, 354, 357, 3, 166, 83, 0, 355, 357, 3, 148, 74, 0, 356, 349, 1, 0, 0, 0, 356, 351, 1, 0, 0, 0, 356, 353, 1, 0, 0, 0, 356, 355, 1, 0, 0, 0, 357, 31, 1, 0, 0, 0, 358, 359, 5, 37, 0, 0, 359, 361, 3, 166, 83, 0, 360, 362, 3, 22, 11, 0, 361, 360, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 363, 1, 0, 0, 0, 363, 364, 5, 149, 0, 0, 364, 365, 3, 148, 74, 0, 365, 366, 5, 137, 0, 0, 366, 33, 1, 0, 0, 0, 367, 372, 3, 40, 20, 0, 368, 372, 3, 44, 22, 0, 369, 372, 3, 38, 19, 0, 370, 372, 3, 36, 18, 0, 371, 367, 1, 0, 0, 0, 371, 368, 1, 0, 0, 0, 371, 369, 1, 0, 0, 0, 371, 370, 1, 0, 0, 0, 372, 35, 1, 0, 0, 0, 373, 374, 5, 2, 0, 0, 374, 375, 3, 166, 83, 0, 375, 376, 5, 87, 0, 0, 376, 377, 3, 168, 84, 0, 377, 378, 5, 3, 0, 0, 378, 381, 3, 168, 84, 0, 379, 380, 5, 5, 0, 0, 380, 382, 3, 50, 25, 0, 381, 379, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 383, 1, 0, 0, 0, 383, 384, 5, 137, 0, 0, 384, 37, 1, 0, 0, 0, 385, 387, 5, 60, 0, 0, 386, 385, 1, 0, 0, 0, 386, 387, 1, 0, 0, 0, 387, 388, 1, 0, 0, 0, 388, 389, 5, 52, 0, 0, 389, 390, 3, 166, 83, 0, 390, 391, 5, 87, 0, 0, 391, 392, 3, 168, 84, 0, 392, 393, 5, 136, 0, 0, 393, 394, 3, 148, 74, 0, 394, 395, 5, 135, 0, 0, 395, 396, 3, 148, 74, 0, 396, 397, 5, 140, 0, 0, 397, 398, 5, 104, 0, 0, 398, 399, 5, 87, 0, 0, 399, 401, 3, 168, 84, 0, 400, 402, 3, 76, 38, 0, 401, 400, 1, 0, 0, 0, 401, 402, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 404, 5, 137, 0, 0, 404, 405, 5, 141, 0, 0, 405, 39, 1, 0, 0, 0, 406, 408, 3, 46, 23, 0, 407, 406, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 409, 1, 0, 0, 0, 409, 410, 7, 0, 0, 0, 410, 411, 3, 166, 83, 0, 411, 412, 5, 87, 0, 0, 412, 413, 3, 168, 84, 0, 413, 414, 5, 136, 0, 0, 414, 415, 3, 148, 74, 0, 415, 419, 5, 140, 0, 0, 416, 418, 3, 42, 21, 0, 417, 416, 1, 0, 0, 0, 418, 421, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 419, 1, 0, 0, 0, 422, 423, 5, 141, 0, 0, 423, 41, 1, 0, 0, 0, 424, 425, 5, 94, 0, 0, 425, 426, 5, 87, 0, 0, 426, 428, 3, 168, 84, 0, 427, 429, 3, 76, 38, 0, 428, 427, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 430, 1, 0, 0, 0, 430, 431, 5, 137, 0, 0, 431, 458, 1, 0, 0, 0, 432, 433, 5, 95, 0, 0, 433, 434, 5, 87, 0, 0, 434, 436, 3, 168, 84, 0, 435, 437, 3, 76, 38, 0, 436, 435, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 438, 1, 0, 0, 0, 438, 439, 5, 137, 0, 0, 439, 458, 1, 0, 0, 0, 440, 441, 5, 1, 0, 0, 441, 442, 5, 87, 0, 0, 442, 444, 3, 168, 84, 0, 443, 445, 3, 76, 38, 0, 444, 443, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 447, 5, 137, 0, 0, 447, 458, 1, 0, 0, 0, 448, 449, 5, 96, 0, 0, 449, 450, 5, 97, 0, 0, 450, 451, 5, 87, 0, 0, 451, 452, 3, 168, 84, 0, 452, 453, 5, 98, 0, 0, 453, 454, 5, 87, 0, 0, 454, 455, 3, 168, 84, 0, 455, 456, 5, 137, 0, 0, 456, 458, 1, 0, 0, 0, 457, 424, 1, 0, 0, 0, 457, 432, 1, 0, 0, 0, 457, 440, 1, 0, 0, 0, 457, 448, 1, 0, 0, 0, 458, 43, 1, 0, 0, 0, 459, 461, 3, 46, 23, 0, 460, 459, 1, 0, 0, 0, 460, 461, 1, 0, 0, 0, 461, 462, 1, 0, 0, 0, 462, 463, 5, 51, 0, 0, 463, 464, 3, 166, 83, 0, 464, 465, 5, 87, 0, 0, 465, 466, 3, 168, 84, 0, 466, 467, 5, 136, 0, 0, 467, 468, 3, 156, 78, 0, 468, 470, 3, 50, 25, 0, 469, 471, 5, 115, 0, 0, 470, 469, 1, 0, 0, 0, 470, 471, 1, 0, 0, 0, 471, 474, 1, 0, 0, 0, 472, 473, 5, 85, 0, 0, 473, 475, 3, 168, 84, 0, 474, 472, 1, 0, 0, 0, 474, 475, 1, 0, 0, 0, 475, 476, 1, 0, 0, 0, 476, 480, 5, 140, 0, 0, 477, 479, 3, 48, 24, 0, 478, 477, 1, 0, 0, 0, 479, 482, 1, 0, 0, 0, 480, 478, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 483, 1, 0, 0, 0, 482, 480, 1, 0, 0, 0, 483, 484, 5, 141, 0, 0, 484, 45, 1, 0, 0, 0, 485, 487, 5, 34, 0, 0, 486, 488, 7, 1, 0, 0, 487, 486, 1, 0, 0, 0, 487, 488, 1, 0, 0, 0, 488, 47, 1, 0, 0, 0, 489, 490, 5, 101, 0, 0, 490, 491, 5, 87, 0, 0, 491, 493, 3, 168, 84, 0, 492, 494, 3, 76, 38, 0, 493, 492, 1, 0, 0, 0, 493, 494, 1, 0, 0, 0, 494, 495, 1, 0, 0, 0, 495, 496, 5, 137, 0, 0, 496, 523, 1, 0, 0, 0, 497, 498, 5, 102, 0, 0, 498, 499, 5, 87, 0, 0, 499, 501, 3, 168, 84, 0, 500, 502, 3, 76, 38, 0, 501, 500, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 504, 5, 137, 0, 0, 504, 523, 1, 0, 0, 0, 505, 506, 5, 103, 0, 0, 506, 507, 5, 87, 0, 0, 507, 509, 3, 168, 84, 0, 508, 510, 3, 76, 38, 0, 509, 508, 1, 0, 0, 0, 509, 510, 1, 0, 0, 0, 510, 511, 1, 0, 0, 0, 511, 512, 5, 137, 0, 0, 512, 523, 1, 0, 0, 0, 513, 514, 5, 96, 0, 0, 514, 515, 5, 97, 0, 0, 515, 516, 5, 87, 0, 0, 516, 517, 3, 168, 84, 0, 517, 518, 5, 98, 0, 0, 518, 519, 5, 87, 0, 0, 519, 520, 3, 168, 84, 0, 520, 521, 5, 137, 0, 0, 521, 523, 1, 0, 0, 0, 522, 489, 1, 0, 0, 0, 522, 497, 1, 0, 0, 0, 522, 505, 1, 0, 0, 0, 522, 513, 1, 0, 0, 0, 523, 49, 1, 0, 0, 0, 524, 525, 5, 45, 0, 0, 525, 534, 3, 166, 83, 0, 526, 527, 5, 46, 0, 0, 527, 529, 3, 166, 83, 0, 528, 530, 3, 28, 14, 0, 529, 528, 1, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 534, 1, 0, 0, 0, 531, 532, 5, 38, 0, 0, 532, 534, 3, 166, 83, 0, 533, 524, 1, 0, 0, 0, 533, 526, 1, 0, 0, 0, 533, 531, 1, 0, 0, 0, 534, 51, 1, 0, 0, 0, 535, 537, 3, 16, 8, 0, 536, 535, 1, 0, 0, 0, 537, 540, 1, 0, 0, 0, 538, 536, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 541, 1, 0, 0, 0, 540, 538, 1, 0, 0, 0, 541, 542, 5, 48, 0, 0, 542, 543, 3, 166, 83, 0, 543, 544, 5, 87, 0, 0, 544, 545, 3, 168, 84, 0, 545, 546, 5, 80, 0, 0, 546, 549, 3, 168, 84, 0, 547, 548, 5, 81, 0, 0, 548, 550, 5, 150, 0, 0, 549, 547, 1, 0, 0, 0, 549, 550, 1, 0, 0, 0, 550, 551, 1, 0, 0, 0, 551, 555, 5, 140, 0, 0, 552, 554, 3, 54, 27, 0, 553, 552, 1, 0, 0, 0, 554, 557, 1, 0, 0, 0, 555, 553, 1, 0, 0, 0, 555, 556, 1, 0, 0, 0, 556, 558, 1, 0, 0, 0, 557, 555, 1, 0, 0, 0, 558, 559, 5, 141, 0, 0, 559, 53, 1, 0, 0, 0, 560, 567, 3, 68, 34, 0, 561, 567, 3, 70, 35, 0, 562, 567, 3, 80, 40, 0, 563, 567, 3, 60, 30, 0, 564, 567, 3, 62, 31, 0, 565, 567, 3, 56, 28, 0, 566, 560, 1, 0, 0, 0, 566, 561, 1, 0, 0, 0, 566, 562, 1, 0, 0, 0, 566, 563, 1, 0, 0, 0, 566, 564, 1, 0, 0, 0, 566, 565, 1, 0, 0, 0, 567, 55, 1, 0, 0, 0, 568, 569, 5, 2, 0, 0, 569, 570, 3, 166, 83, 0, 570, 571, 5, 87, 0, 0, 571, 572, 3, 168, 84, 0, 572, 573, 5, 40, 0, 0, 573, 574, 3, 26, 13, 0, 574, 575, 5, 139, 0, 0, 575, 576, 3, 166, 83, 0, 576, 577, 5, 137, 0, 0, 577, 57, 1, 0, 0, 0, 578, 579, 5, 4, 0, 0, 579, 580, 3, 166, 83, 0, 580, 581, 5, 87, 0, 0, 581, 582, 3, 168, 84, 0, 582, 583, 5, 6, 0, 0, 583, 584, 3, 26, 13, 0, 584, 585, 5, 68, 0, 0, 585, 586, 3, 166, 83, 0, 586, 587, 5, 139, 0, 0, 587, 588, 3, 166, 83, 0, 588, 589, 5, 137, 0, 0, 589, 59, 1, 0, 0, 0, 590, 592, 5, 24, 0, 0, 591, 593, 5, 42, 0, 0, 592, 591, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 596, 3, 166, 83, 0, 595, 597, 3, 22, 11, 0, 596, 595, 1, 0, 0, 0, 596, 597, 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 599, 5, 87, 0, 0, 599, 600, 3, 168, 84, 0, 600, 602, 5, 27, 0, 0, 601, 603, 5, 11, 0, 0, 602, 601, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 604, 1, 0, 0, 0, 604, 605, 3, 26, 13, 0, 605, 606, 5, 28, 0, 0, 606, 635, 3, 168, 84, 0, 607, 608, 5, 52, 0, 0, 608, 609, 3, 168, 84, 0, 609, 613, 5, 140, 0, 0, 610, 612, 3, 64, 32, 0, 611, 610, 1, 0, 0, 0, 612, 615, 1, 0, 0, 0, 613, 611, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 616, 1, 0, 0, 0, 615, 613, 1, 0, 0, 0, 616, 617, 5, 141, 0, 0, 617, 636, 1, 0, 0, 0, 618, 619, 5, 42, 0, 0, 619, 622, 3, 168, 84, 0, 620, 621, 5, 52, 0, 0, 621, 623, 3, 168, 84, 0, 622, 620, 1, 0, 0, 0, 622, 623, 1, 0, 0, 0, 623, 633, 1, 0, 0, 0, 624, 628, 5, 140, 0, 0, 625, 627, 3, 64, 32, 0, 626, 625, 1, 0, 0, 0, 627, 630, 1, 0, 0, 0, 628, 626, 1, 0, 0, 0, 628, 629, 1, 0, 0, 0, 629, 631, 1, 0, 0, 0, 630, 628, 1, 0, 0, 0, 631, 634, 5, 141, 0, 0, 632, 634, 5, 137, 0, 0, 633, 624, 1, 0, 0, 0, 633, 632, 1, 0, 0, 0, 634, 636, 1, 0, 0, 0, 635, 607, 1, 0, 0, 0, 635, 618, 1, 0, 0, 0, 636, 61, 1, 0, 0, 0, 637, 638, 5, 24, 0, 0, 638, 639, 3, 166, 83, 0, 639, 640, 5, 87, 0, 0, 640, 641, 3, 168, 84, 0, 641, 642, 5, 26, 0, 0, 642, 643, 3, 166, 83, 0, 643, 644, 3, 28, 14, 0, 644, 645, 5, 137, 0, 0, 645, 63, 1, 0, 0, 0, 646, 647, 5, 18, 0, 0, 647, 704, 5, 137, 0, 0, 648, 649, 5, 19, 0, 0, 649, 650, 5, 20, 0, 0, 650, 651, 3, 166, 83, 0, 651, 652, 5, 137, 0, 0, 652, 704, 1, 0, 0, 0, 653, 654, 5, 29, 0, 0, 654, 655, 3, 168, 84, 0, 655, 656, 5, 137, 0, 0, 656, 704, 1, 0, 0, 0, 657, 658, 5, 29, 0, 0, 658, 659, 3, 166, 83, 0, 659, 660, 5, 139, 0, 0, 660, 670, 3, 166, 83, 0, 661, 662, 5, 67, 0, 0, 662, 666, 5, 140, 0, 0, 663, 665, 3, 66, 33, 0, 664, 663, 1, 0, 0, 0, 665, 668, 1, 0, 0, 0, 666, 664, 1, 0, 0, 0, 666, 667, 1, 0, 0, 0, 667, 669, 1, 0, 0, 0, 668, 666, 1, 0, 0, 0, 669, 671, 5, 141, 0, 0, 670, 661, 1, 0, 0, 0, 670, 671, 1, 0, 0, 0, 671, 672, 1, 0, 0, 0, 672, 673, 5, 137, 0, 0, 673, 704, 1, 0, 0, 0, 674, 676, 5, 30, 0, 0, 675, 677, 5, 38, 0, 0, 676, 675, 1, 0, 0, 0, 676, 677, 1, 0, 0, 0, 677, 678, 1, 0, 0, 0, 678, 679, 3, 166, 83, 0, 679, 680, 5, 58, 0, 0, 680, 681, 3, 26, 13, 0, 681, 682, 5, 137, 0, 0, 682, 704, 1, 0, 0, 0, 683, 684, 5, 31, 0, 0, 684, 685, 3, 166, 83, 0, 685, 686, 5, 150, 0, 0, 686, 687, 5, 137, 0, 0, 687, 704, 1, 0, 0, 0, 688, 689, 5, 32, 0, 0, 689, 690, 3, 26, 13, 0, 690, 691, 5, 139, 0, 0, 691, 692, 3, 166, 83, 0, 692, 693, 3, 166, 83, 0, 693, 694, 3, 168, 84, 0, 694, 695, 5, 137, 0, 0, 695, 704, 1, 0, 0, 0, 696, 697, 5, 96, 0, 0, 697, 704, 5, 137, 0, 0, 698, 699, 5, 33, 0, 0, 699, 700, 5, 150, 0, 0, 700, 701, 3, 168, 84, 0, 701, 702, 5, 137, 0, 0, 702, 704, 1, 0, 0, 0, 703, 646, 1, 0, 0, 0, 703, 648, 1, 0, 0, 0, 703, 653, 1, 0, 0, 0, 703, 657, 1, 0, 0, 0, 703, 674, 1, 0, 0, 0, 703, 683, 1, 0, 0, 0, 703, 688, 1, 0, 0, 0, 703, 696, 1, 0, 0, 0, 703, 698, 1, 0, 0, 0, 704, 65, 1, 0, 0, 0, 705, 706, 3, 166, 83, 0, 706, 707, 5, 61, 0, 0, 707, 708, 3, 166, 83, 0, 708, 709, 5, 137, 0, 0, 709, 67, 1, 0, 0, 0, 710, 711, 5, 52, 0, 0, 711, 713, 3, 166, 83, 0, 712, 714, 3, 22, 11, 0, 713, 712, 1, 0, 0, 0, 713, 714, 1, 0, 0, 0, 714, 715, 1, 0, 0, 0, 715, 716, 5, 87, 0, 0, 716, 717, 3, 168, 84, 0, 717, 718, 5, 136, 0, 0, 718, 719, 3, 148, 74, 0, 719, 720, 5, 135, 0, 0, 720, 721, 3, 148, 74, 0, 721, 722, 5, 89, 0, 0, 722, 724, 3, 84, 42, 0, 723, 725, 3, 76, 38, 0, 724, 723, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 727, 1, 0, 0, 0, 726, 728, 3, 82, 41, 0, 727, 726, 1, 0, 0, 0, 727, 728, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 5, 91, 0, 0, 730, 732, 3, 86, 43, 0, 731, 733, 3, 90, 45, 0, 732, 731, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 735, 1, 0, 0, 0, 734, 736, 3, 74, 37, 0, 735, 734, 1, 0, 0, 0, 735, 736, 1, 0, 0, 0, 736, 738, 1, 0, 0, 0, 737, 739, 3, 72, 36, 0, 738, 737, 1, 0, 0, 0, 738, 739, 1, 0, 0, 0, 739, 740, 1, 0, 0, 0, 740, 741, 5, 137, 0, 0, 741, 69, 1, 0, 0, 0, 742, 743, 5, 53, 0, 0, 743, 745, 3, 166, 83, 0, 744, 746, 3, 22, 11, 0, 745, 744, 1, 0, 0, 0, 745, 746, 1, 0, 0, 0, 746, 747, 1, 0, 0, 0, 747, 748, 5, 87, 0, 0, 748, 749, 3, 168, 84, 0, 749, 750, 5, 136, 0, 0, 750, 751, 3, 148, 74, 0, 751, 752, 5, 135, 0, 0, 752, 754, 3, 148, 74, 0, 753, 755, 3, 76, 38, 0, 754, 753, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 757, 1, 0, 0, 0, 756, 758, 3, 90, 45, 0, 757, 756, 1, 0, 0, 0, 757, 758, 1, 0, 0, 0, 758, 760, 1, 0, 0, 0, 759, 761, 3, 74, 37, 0, 760, 759, 1, 0, 0, 0, 760, 761, 1, 0, 0, 0, 761, 763, 1, 0, 0, 0, 762, 764, 3, 72, 36, 0, 763, 762, 1, 0, 0, 0, 763, 764, 1, 0, 0, 0, 764, 765, 1, 0, 0, 0, 765, 766, 5, 137, 0, 0, 766, 71, 1, 0, 0, 0, 767, 768, 5, 69, 0, 0, 768, 769, 5, 68, 0, 0, 769, 770, 3, 166, 83, 0, 770, 73, 1, 0, 0, 0, 771, 772, 5, 9, 0, 0, 772, 773, 5, 7, 0, 0, 773, 774, 3, 166, 83, 0, 774, 775, 5, 68, 0, 0, 775, 776, 3, 168, 84, 0, 776, 75, 1, 0, 0, 0, 777, 778, 5, 12, 0, 0, 778, 787, 5, 15, 0, 0, 779, 780, 5, 12, 0, 0, 780, 781, 7, 2, 0, 0, 781, 782, 5, 16, 0, 0, 782, 783, 5, 142, 0, 0, 783, 784, 3, 88, 44, 0, 784, 785, 5, 143, 0, 0, 785, 787, 1, 0, 0, 0, 786, 777, 1, 0, 0, 0, 786, 779, 1, 0, 0, 0, 787, 77, 1, 0, 0, 0, 788, 789, 5, 68, 0, 0, 789, 790, 5, 142, 0, 0, 790, 795, 3, 130, 65, 0, 791, 792, 5, 138, 0, 0, 792, 794, 3, 130, 65, 0, 793, 791, 1, 0, 0, 0, 794, 797, 1, 0, 0, 0, 795, 793, 1, 0, 0, 0, 795, 796, 1, 0, 0, 0, 796, 798, 1, 0, 0, 0, 797, 795, 1, 0, 0, 0, 798, 799, 5, 143, 0, 0, 799, 79, 1, 0, 0, 0, 800, 801, 5, 54, 0, 0, 801, 802, 3, 166, 83, 0, 802, 803, 5, 87, 0, 0, 803, 804, 3, 168, 84, 0, 804, 805, 5, 55, 0, 0, 805, 806, 3, 166, 83, 0, 806, 807, 5, 136, 0, 0, 807, 809, 3, 148, 74, 0, 808, 810, 3, 90, 45, 0, 809, 808, 1, 0, 0, 0, 809, 810, 1, 0, 0, 0, 810, 811, 1, 0, 0, 0, 811, 812, 5, 137, 0, 0, 812, 81, 1, 0, 0, 0, 813, 814, 5, 90, 0, 0, 814, 815, 3, 148, 74, 0, 815, 83, 1, 0, 0, 0, 816, 817, 7, 3, 0, 0, 817, 85, 1, 0, 0, 0, 818, 837, 5, 93, 0, 0, 819, 820, 5, 45, 0, 0, 820, 837, 3, 166, 83, 0, 821, 822, 5, 38, 0, 0, 822, 837, 3, 166, 83, 0, 823, 824, 5, 47, 0, 0, 824, 833, 5, 142, 0, 0, 825, 830, 3, 26, 13, 0, 826, 827, 5, 138, 0, 0, 827, 829, 3, 26, 13, 0, 828, 826, 1, 0, 0, 0, 829, 832, 1, 0, 0, 0, 830, 828, 1, 0, 0, 0, 830, 831, 1, 0, 0, 0, 831, 834, 1, 0, 0, 0, 832, 830, 1, 0, 0, 0, 833, 825, 1, 0, 0, 0, 833, 834, 1, 0, 0, 0, 834, 835, 1, 0, 0, 0, 835, 837, 5, 143, 0, 0, 836, 818, 1, 0, 0, 0, 836, 819, 1, 0, 0, 0, 836, 821, 1, 0, 0, 0, 836, 823, 1, 0, 0, 0, 837, 87, 1, 0, 0, 0, 838, 843, 3, 166, 83, 0, 839, 840, 5, 138, 0, 0, 840, 842, 3, 166, 83, 0, 841, 839, 1, 0, 0, 0, 842, 845, 1, 0, 0, 0, 843, 841, 1, 0, 0, 0, 843, 844, 1, 0, 0, 0, 844, 89, 1, 0, 0, 0, 845, 843, 1, 0, 0, 0, 846, 847, 5, 92, 0, 0, 847, 851, 5, 140, 0, 0, 848, 850, 3, 92, 46, 0, 849, 848, 1, 0, 0, 0, 850, 853, 1, 0, 0, 0, 851, 849, 1, 0, 0, 0, 851, 852, 1, 0, 0, 0, 852, 854, 1, 0, 0, 0, 853, 851, 1, 0, 0, 0, 854, 855, 5, 141, 0, 0, 855, 91, 1, 0, 0, 0, 856, 857, 5, 25, 0, 0, 857, 858, 3, 166, 83, 0, 858, 859, 5, 87, 0, 0, 859, 860, 3, 168, 84, 0, 860, 861, 5, 142, 0, 0, 861, 862, 3, 88, 44, 0, 862, 863, 5, 143, 0, 0, 863, 864, 5, 137, 0, 0, 864, 939, 1, 0, 0, 0, 865, 866, 5, 64, 0, 0, 866, 867, 3, 166, 83, 0, 867, 868, 5, 87, 0, 0, 868, 869, 3, 168, 84, 0, 869, 870, 5, 136, 0, 0, 870, 871, 3, 148, 74, 0, 871, 872, 3, 94, 47, 0, 872, 873, 5, 137, 0, 0, 873, 939, 1, 0, 0, 0, 874, 875, 5, 65, 0, 0, 875, 876, 3, 166, 83, 0, 876, 877, 5, 87, 0, 0, 877, 878, 3, 168, 84, 0, 878, 879, 5, 136, 0, 0, 879, 880, 3, 156, 78, 0, 880, 883, 3, 50, 25, 0, 881, 882, 5, 85, 0, 0, 882, 884, 3, 168, 84, 0, 883, 881, 1, 0, 0, 0, 883, 884, 1, 0, 0, 0, 884, 885, 1, 0, 0, 0, 885, 886, 3, 94, 47, 0, 886, 887, 5, 137, 0, 0, 887, 939, 1, 0, 0, 0, 888, 889, 5, 46, 0, 0, 889, 890, 3, 166, 83, 0, 890, 891, 5, 87, 0, 0, 891, 892, 3, 168, 84, 0, 892, 893, 5, 136, 0, 0, 893, 895, 3, 166, 83, 0, 894, 896, 3, 28, 14, 0, 895, 894, 1, 0, 0, 0, 895, 896, 1, 0, 0, 0, 896, 898, 1, 0, 0, 0, 897, 899, 3, 78, 39, 0, 898, 897, 1, 0, 0, 0, 898, 899, 1, 0, 0, 0, 899, 902, 1, 0, 0, 0, 900, 901, 5, 20, 0, 0, 901, 903, 5, 56, 0, 0, 902, 900, 1, 0, 0, 0, 902, 903, 1, 0, 0, 0, 903, 904, 1, 0, 0, 0, 904, 905, 5, 137, 0, 0, 905, 939, 1, 0, 0, 0, 906, 907, 5, 7, 0, 0, 907, 908, 3, 166, 83, 0, 908, 909, 5, 87, 0, 0, 909, 910, 3, 168, 84, 0, 910, 911, 5, 136, 0, 0, 911, 912, 3, 166, 83, 0, 912, 913, 5, 56, 0, 0, 913, 914, 3, 148, 74, 0, 914, 915, 5, 137, 0, 0, 915, 939, 1, 0, 0, 0, 916, 917, 5, 54, 0, 0, 917, 918, 3, 166, 83, 0, 918, 919, 5, 87, 0, 0, 919, 920, 3, 168, 84, 0, 920, 921, 5, 136, 0, 0, 921, 924, 3, 166, 83, 0, 922, 923, 5, 56, 0, 0, 923, 925, 3, 148, 74, 0, 924, 922, 1, 0, 0, 0, 924, 925, 1, 0, 0, 0, 925, 926, 1, 0, 0, 0, 926, 927, 5, 137, 0, 0, 927, 939, 1, 0, 0, 0, 928, 929, 5, 24, 0, 0, 929, 930, 3, 166, 83, 0, 930, 931, 5, 87, 0, 0, 931, 932, 3, 168, 84, 0, 932, 933, 5, 136, 0, 0, 933, 934, 3, 166, 83, 0, 934, 935, 5, 139, 0, 0, 935, 936, 3, 166, 83, 0, 936, 937, 5, 137, 0, 0, 937, 939, 1, 0, 0, 0, 938, 856, 1, 0, 0, 0, 938, 865, 1, 0, 0, 0, 938, 874, 1, 0, 0, 0, 938, 888, 1, 0, 0, 0, 938, 906, 1, 0, 0, 0, 938, 916, 1, 0, 0, 0, 938, 928, 1, 0, 0, 0, 939, 93, 1, 0, 0, 0, 940, 941, 5, 142, 0, 0, 941, 946, 3, 96, 48, 0, 942, 943, 5, 138, 0, 0, 943, 945, 3, 96, 48, 0, 944, 942, 1, 0, 0, 0, 945, 948, 1, 0, 0, 0, 946, 944, 1, 0, 0, 0, 946, 947, 1, 0, 0, 0, 947, 949, 1, 0, 0, 0, 948, 946, 1, 0, 0, 0, 949, 950, 5, 143, 0, 0, 950, 95, 1, 0, 0, 0, 951, 952, 7, 4, 0, 0, 952, 97, 1, 0, 0, 0, 953, 954, 5, 63, 0, 0, 954, 955, 3, 100, 50, 0, 955, 99, 1, 0, 0, 0, 956, 959, 3, 102, 51, 0, 957, 959, 3, 106, 53, 0, 958, 956, 1, 0, 0, 0, 958, 957, 1, 0, 0, 0, 959, 101, 1, 0, 0, 0, 960, 961, 5, 64, 0, 0, 961, 962, 3, 166, 83, 0, 962, 963, 5, 87, 0, 0, 963, 964, 3, 168, 84, 0, 964, 965, 5, 74, 0, 0, 965, 966, 3, 166, 83, 0, 966, 967, 5, 136, 0, 0, 967, 968, 3, 148, 74, 0, 968, 969, 5, 75, 0, 0, 969, 972, 3, 104, 52, 0, 970, 971, 5, 76, 0, 0, 971, 973, 3, 158, 79, 0, 972, 970, 1, 0, 0, 0, 972, 973, 1, 0, 0, 0, 973, 974, 1, 0, 0, 0, 974, 975, 5, 137, 0, 0, 975, 103, 1, 0, 0, 0, 976, 983, 5, 109, 0, 0, 977, 978, 5, 110, 0, 0, 978, 979, 5, 144, 0, 0, 979, 980, 3, 148, 74, 0, 980, 981, 5, 145, 0, 0, 981, 983, 1, 0, 0, 0, 982, 976, 1, 0, 0, 0, 982, 977, 1, 0, 0, 0, 983, 105, 1, 0, 0, 0, 984, 985, 5, 65, 0, 0, 985, 986, 3, 166, 83, 0, 986, 987, 5, 87, 0, 0, 987, 988, 3, 168, 84, 0, 988, 989, 5, 140, 0, 0, 989, 990, 3, 108, 54, 0, 990, 991, 3, 108, 54, 0, 991, 992, 5, 141, 0, 0, 992, 107, 1, 0, 0, 0, 993, 994, 3, 50, 25, 0, 994, 995, 5, 66, 0, 0, 995, 996, 3, 166, 83, 0, 996, 997, 5, 87, 0, 0, 997, 998, 3, 168, 84, 0, 998, 1000, 3, 156, 78, 0, 999, 1001, 5, 115, 0, 0, 1000, 999, 1, 0, 0, 0, 1000, 1001, 1, 0, 0, 0, 1001, 1004, 1, 0, 0, 0, 1002, 1003, 5, 82, 0, 0, 1003, 1005, 3, 168, 84, 0, 1004, 1002, 1, 0, 0, 0, 1004, 1005, 1, 0, 0, 0, 1005, 1007, 1, 0, 0, 0, 1006, 1008, 5, 84, 0, 0, 1007, 1006, 1, 0, 0, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1011, 1, 0, 0, 0, 1009, 1010, 5, 85, 0, 0, 1010, 1012, 3, 168, 84, 0, 1011, 1009, 1, 0, 0, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1014, 1, 0, 0, 0, 1013, 1015, 5, 86, 0, 0, 1014, 1013, 1, 0, 0, 0, 1014, 1015, 1, 0, 0, 0, 1015, 1016, 1, 0, 0, 0, 1016, 1017, 5, 137, 0, 0, 1017, 109, 1, 0, 0, 0, 1018, 1020, 5, 57, 0, 0, 1019, 1021, 3, 22, 11, 0, 1020, 1019, 1, 0, 0, 0, 1020, 1021, 1, 0, 0, 0, 1021, 1022, 1, 0, 0, 0, 1022, 1024, 3, 166, 83, 0, 1023, 1025, 3, 112, 56, 0, 1024, 1023, 1, 0, 0, 0, 1024, 1025, 1, 0, 0, 0, 1025, 1026, 1, 0, 0, 0, 1026, 1027, 5, 58, 0, 0, 1027, 1029, 3, 166, 83, 0, 1028, 1030, 3, 28, 14, 0, 1029, 1028, 1, 0, 0, 0, 1029, 1030, 1, 0, 0, 0, 1030, 1033, 1, 0, 0, 0, 1031, 1032, 5, 87, 0, 0, 1032, 1034, 3, 168, 84, 0, 1033, 1031, 1, 0, 0, 0, 1033, 1034, 1, 0, 0, 0, 1034, 1037, 1, 0, 0, 0, 1035, 1036, 5, 81, 0, 0, 1036, 1038, 5, 150, 0, 0, 1037, 1035, 1, 0, 0, 0, 1037, 1038, 1, 0, 0, 0, 1038, 1039, 1, 0, 0, 0, 1039, 1043, 5, 140, 0, 0, 1040, 1042, 3, 114, 57, 0, 1041, 1040, 1, 0, 0, 0, 1042, 1045, 1, 0, 0, 0, 1043, 1041, 1, 0, 0, 0, 1043, 1044, 1, 0, 0, 0, 1044, 1046, 1, 0, 0, 0, 1045, 1043, 1, 0, 0, 0, 1046, 1047, 5, 141, 0, 0, 1047, 111, 1, 0, 0, 0, 1048, 1049, 3, 28, 14, 0, 1049, 113, 1, 0, 0, 0, 1050, 1051, 5, 62, 0, 0, 1051, 1058, 3, 100, 50, 0, 1052, 1058, 3, 128, 64, 0, 1053, 1058, 3, 124, 62, 0, 1054, 1058, 3, 118, 59, 0, 1055, 1058, 3, 126, 63, 0, 1056, 1058, 3, 116, 58, 0, 1057, 1050, 1, 0, 0, 0, 1057, 1052, 1, 0, 0, 0, 1057, 1053, 1, 0, 0, 0, 1057, 1054, 1, 0, 0, 0, 1057, 1055, 1, 0, 0, 0, 1057, 1056, 1, 0, 0, 0, 1058, 115, 1, 0, 0, 0, 1059, 1060, 5, 59, 0, 0, 1060, 1061, 3, 166, 83, 0, 1061, 1062, 5, 61, 0, 0, 1062, 1063, 3, 166, 83, 0, 1063, 1064, 5, 139, 0, 0, 1064, 1065, 3, 166, 83, 0, 1065, 1066, 5, 137, 0, 0, 1066, 117, 1, 0, 0, 0, 1067, 1068, 5, 10, 0, 0, 1068, 1072, 5, 140, 0, 0, 1069, 1071, 3, 120, 60, 0, 1070, 1069, 1, 0, 0, 0, 1071, 1074, 1, 0, 0, 0, 1072, 1070, 1, 0, 0, 0, 1072, 1073, 1, 0, 0, 0, 1073, 1075, 1, 0, 0, 0, 1074, 1072, 1, 0, 0, 0, 1075, 1076, 5, 141, 0, 0, 1076, 1077, 5, 137, 0, 0, 1077, 119, 1, 0, 0, 0, 1078, 1079, 3, 166, 83, 0, 1079, 1080, 5, 61, 0, 0, 1080, 1081, 5, 64, 0, 0, 1081, 1082, 3, 166, 83, 0, 1082, 1083, 5, 137, 0, 0, 1083, 1093, 1, 0, 0, 0, 1084, 1085, 3, 166, 83, 0, 1085, 1086, 5, 61, 0, 0, 1086, 1087, 5, 65, 0, 0, 1087, 1088, 3, 166, 83, 0, 1088, 1089, 5, 139, 0, 0, 1089, 1090, 3, 166, 83, 0, 1090, 1091, 5, 137, 0, 0, 1091, 1093, 1, 0, 0, 0, 1092, 1078, 1, 0, 0, 0, 1092, 1084, 1, 0, 0, 0, 1093, 121, 1, 0, 0, 0, 1094, 1095, 3, 26, 13, 0, 1095, 1096, 5, 20, 0, 0, 1096, 1101, 5, 56, 0, 0, 1097, 1098, 5, 139, 0, 0, 1098, 1100, 3, 166, 83, 0, 1099, 1097, 1, 0, 0, 0, 1100, 1103, 1, 0, 0, 0, 1101, 1099, 1, 0, 0, 0, 1101, 1102, 1, 0, 0, 0, 1102, 1104, 1, 0, 0, 0, 1103, 1101, 1, 0, 0, 0, 1104, 1105, 5, 137, 0, 0, 1105, 123, 1, 0, 0, 0, 1106, 1107, 5, 59, 0, 0, 1107, 1108, 3, 166, 83, 0, 1108, 1109, 5, 61, 0, 0, 1109, 1110, 5, 64, 0, 0, 1110, 1111, 3, 166, 83, 0, 1111, 1112, 5, 137, 0, 0, 1112, 125, 1, 0, 0, 0, 1113, 1114, 5, 71, 0, 0, 1114, 1115, 3, 166, 83, 0, 1115, 1116, 5, 72, 0, 0, 1116, 1117, 5, 73, 0, 0, 1117, 1118, 5, 68, 0, 0, 1118, 1119, 5, 54, 0, 0, 1119, 1120, 3, 166, 83, 0, 1120, 1121, 5, 70, 0, 0, 1121, 1122, 5, 65, 0, 0, 1122, 1123, 3, 166, 83, 0, 1123, 1124, 5, 139, 0, 0, 1124, 1125, 3, 166, 83, 0, 1125, 1126, 5, 137, 0, 0, 1126, 127, 1, 0, 0, 0, 1127, 1128, 5, 59, 0, 0, 1128, 1129, 3, 130, 65, 0, 1129, 1130, 5, 61, 0, 0, 1130, 1133, 3, 134, 67, 0, 1131, 1132, 5, 36, 0, 0, 1132, 1134, 3, 168, 84, 0, 1133, 1131, 1, 0, 0, 0, 1133, 1134, 1, 0, 0, 0, 1134, 1135, 1, 0, 0, 0, 1135, 1136, 5, 137, 0, 0, 1136, 129, 1, 0, 0, 0, 1137, 1138, 3, 166, 83, 0, 1138, 1139, 5, 139, 0, 0, 1139, 1140, 3, 132, 66, 0, 1140, 131, 1, 0, 0, 0, 1141, 1154, 3, 166, 83, 0, 1142, 1154, 5, 104, 0, 0, 1143, 1154, 5, 94, 0, 0, 1144, 1154, 5, 95, 0, 0, 1145, 1154, 5, 1, 0, 0, 1146, 1154, 5, 101, 0, 0, 1147, 1154, 5, 102, 0, 0, 1148, 1154, 5, 103, 0, 0, 1149, 1154, 5, 105, 0, 0, 1150, 1154, 5, 106, 0, 0, 1151, 1154, 5, 107, 0, 0, 1152, 1154, 5, 108, 0, 0, 1153, 1141, 1, 0, 0, 0, 1153, 1142, 1, 0, 0, 0, 1153, 1143, 1, 0, 0, 0, 1153, 1144, 1, 0, 0, 0, 1153, 1145, 1, 0, 0, 0, 1153, 1146, 1, 0, 0, 0, 1153, 1147, 1, 0, 0, 0, 1153, 1148, 1, 0, 0, 0, 1153, 1149, 1, 0, 0, 0, 1153, 1150, 1, 0, 0, 0, 1153, 1151, 1, 0, 0, 0, 1153, 1152, 1, 0, 0, 0, 1154, 133, 1, 0, 0, 0, 1155, 1156, 5, 83, 0, 0, 1156, 1157, 5, 139, 0, 0, 1157, 1192, 3, 166, 83, 0, 1158, 1159, 5, 64, 0, 0, 1159, 1160, 3, 166, 83, 0, 1160, 1161, 5, 139, 0, 0, 1161, 1162, 3, 138, 69, 0, 1162, 1192, 1, 0, 0, 0, 1163, 1164, 5, 65, 0, 0, 1164, 1165, 3, 166, 83, 0, 1165, 1166, 5, 139, 0, 0, 1166, 1167, 3, 166, 83, 0, 1167, 1168, 5, 139, 0, 0, 1168, 1169, 3, 140, 70, 0, 1169, 1192, 1, 0, 0, 0, 1170, 1171, 5, 46, 0, 0, 1171, 1173, 3, 166, 83, 0, 1172, 1174, 3, 28, 14, 0, 1173, 1172, 1, 0, 0, 0, 1173, 1174, 1, 0, 0, 0, 1174, 1175, 1, 0, 0, 0, 1175, 1176, 5, 139, 0, 0, 1176, 1177, 3, 130, 65, 0, 1177, 1192, 1, 0, 0, 0, 1178, 1179, 5, 48, 0, 0, 1179, 1180, 3, 166, 83, 0, 1180, 1181, 5, 139, 0, 0, 1181, 1183, 3, 166, 83, 0, 1182, 1184, 3, 28, 14, 0, 1183, 1182, 1, 0, 0, 0, 1183, 1184, 1, 0, 0, 0, 1184, 1186, 1, 0, 0, 0, 1185, 1187, 3, 142, 71, 0, 1186, 1185, 1, 0, 0, 0, 1186, 1187, 1, 0, 0, 0, 1187, 1189, 1, 0, 0, 0, 1188, 1190, 3, 136, 68, 0, 1189, 1188, 1, 0, 0, 0, 1189, 1190, 1, 0, 0, 0, 1190, 1192, 1, 0, 0, 0, 1191, 1155, 1, 0, 0, 0, 1191, 1158, 1, 0, 0, 0, 1191, 1163, 1, 0, 0, 0, 1191, 1170, 1, 0, 0, 0, 1191, 1178, 1, 0, 0, 0, 1192, 135, 1, 0, 0, 0, 1193, 1194, 5, 69, 0, 0, 1194, 1195, 3, 142, 71, 0, 1195, 137, 1, 0, 0, 0, 1196, 1197, 7, 5, 0, 0, 1197, 139, 1, 0, 0, 0, 1198, 1199, 7, 6, 0, 0, 1199, 141, 1, 0, 0, 0, 1200, 1201, 5, 67, 0, 0, 1201, 1205, 5, 140, 0, 0, 1202, 1204, 3, 144, 72, 0, 1203, 1202, 1, 0, 0, 0, 1204, 1207, 1, 0, 0, 0, 1205, 1203, 1, 0, 0, 0, 1205, 1206, 1, 0, 0, 0, 1206, 1208, 1, 0, 0, 0, 1207, 1205, 1, 0, 0, 0, 1208, 1209, 5, 141, 0, 0, 1209, 143, 1, 0, 0, 0, 1210, 1211, 3, 166, 83, 0, 1211, 1212, 5, 61, 0, 0, 1212, 1213, 5, 11, 0, 0, 1213, 1214, 5, 25, 0, 0, 1214, 1215, 5, 142, 0, 0, 1215, 1216, 3, 88, 44, 0, 1216, 1217, 5, 143, 0, 0, 1217, 1218, 5, 137, 0, 0, 1218, 1309, 1, 0, 0, 0, 1219, 1220, 3, 166, 83, 0, 1220, 1221, 5, 61, 0, 0, 1221, 1222, 5, 64, 0, 0, 1222, 1229, 3, 166, 83, 0, 1223, 1224, 5, 70, 0, 0, 1224, 1225, 5, 65, 0, 0, 1225, 1226, 3, 166, 83, 0, 1226, 1227, 5, 139, 0, 0, 1227, 1228, 3, 166, 83, 0, 1228, 1230, 1, 0, 0, 0, 1229, 1223, 1, 0, 0, 0, 1229, 1230, 1, 0, 0, 0, 1230, 1231, 1, 0, 0, 0, 1231, 1232, 5, 137, 0, 0, 1232, 1309, 1, 0, 0, 0, 1233, 1234, 3, 166, 83, 0, 1234, 1235, 5, 61, 0, 0, 1235, 1236, 5, 65, 0, 0, 1236, 1237, 3, 166, 83, 0, 1237, 1238, 5, 139, 0, 0, 1238, 1245, 3, 166, 83, 0, 1239, 1240, 5, 70, 0, 0, 1240, 1241, 5, 65, 0, 0, 1241, 1242, 3, 166, 83, 0, 1242, 1243, 5, 139, 0, 0, 1243, 1244, 3, 166, 83, 0, 1244, 1246, 1, 0, 0, 0, 1245, 1239, 1, 0, 0, 0, 1245, 1246, 1, 0, 0, 0, 1246, 1247, 1, 0, 0, 0, 1247, 1248, 5, 137, 0, 0, 1248, 1309, 1, 0, 0, 0, 1249, 1250, 3, 166, 83, 0, 1250, 1251, 5, 61, 0, 0, 1251, 1252, 5, 46, 0, 0, 1252, 1254, 3, 166, 83, 0, 1253, 1255, 3, 28, 14, 0, 1254, 1253, 1, 0, 0, 0, 1254, 1255, 1, 0, 0, 0, 1255, 1264, 1, 0, 0, 0, 1256, 1257, 5, 70, 0, 0, 1257, 1258, 5, 65, 0, 0, 1258, 1259, 3, 166, 83, 0, 1259, 1260, 5, 139, 0, 0, 1260, 1261, 3, 166, 83, 0, 1261, 1265, 1, 0, 0, 0, 1262, 1263, 5, 20, 0, 0, 1263, 1265, 5, 56, 0, 0, 1264, 1256, 1, 0, 0, 0, 1264, 1262, 1, 0, 0, 0, 1264, 1265, 1, 0, 0, 0, 1265, 1266, 1, 0, 0, 0, 1266, 1267, 5, 137, 0, 0, 1267, 1309, 1, 0, 0, 0, 1268, 1269, 3, 166, 83, 0, 1269, 1270, 5, 61, 0, 0, 1270, 1271, 5, 7, 0, 0, 1271, 1272, 3, 166, 83, 0, 1272, 1273, 5, 67, 0, 0, 1273, 1277, 5, 140, 0, 0, 1274, 1276, 3, 122, 61, 0, 1275, 1274, 1, 0, 0, 0, 1276, 1279, 1, 0, 0, 0, 1277, 1275, 1, 0, 0, 0, 1277, 1278, 1, 0, 0, 0, 1278, 1280, 1, 0, 0, 0, 1279, 1277, 1, 0, 0, 0, 1280, 1281, 5, 141, 0, 0, 1281, 1282, 5, 137, 0, 0, 1282, 1309, 1, 0, 0, 0, 1283, 1284, 3, 166, 83, 0, 1284, 1285, 5, 61, 0, 0, 1285, 1286, 5, 54, 0, 0, 1286, 1287, 3, 166, 83, 0, 1287, 1288, 5, 137, 0, 0, 1288, 1309, 1, 0, 0, 0, 1289, 1290, 3, 166, 83, 0, 1290, 1292, 5, 61, 0, 0, 1291, 1293, 5, 11, 0, 0, 1292, 1291, 1, 0, 0, 0, 1292, 1293, 1, 0, 0, 0, 1293, 1294, 1, 0, 0, 0, 1294, 1295, 5, 24, 0, 0, 1295, 1296, 3, 166, 83, 0, 1296, 1297, 5, 139, 0, 0, 1297, 1304, 3, 166, 83, 0, 1298, 1299, 5, 70, 0, 0, 1299, 1300, 5, 65, 0, 0, 1300, 1301, 3, 166, 83, 0, 1301, 1302, 5, 139, 0, 0, 1302, 1303, 3, 166, 83, 0, 1303, 1305, 1, 0, 0, 0, 1304, 1298, 1, 0, 0, 0, 1304, 1305, 1, 0, 0, 0, 1305, 1306, 1, 0, 0, 0, 1306, 1307, 5, 137, 0, 0, 1307, 1309, 1, 0, 0, 0, 1308, 1210, 1, 0, 0, 0, 1308, 1219, 1, 0, 0, 0, 1308, 1233, 1, 0, 0, 0, 1308, 1249, 1, 0, 0, 0, 1308, 1268, 1, 0, 0, 0, 1308, 1283, 1, 0, 0, 0, 1308, 1289, 1, 0, 0, 0, 1309, 145, 1, 0, 0, 0, 1310, 1311, 5, 54, 0, 0, 1311, 1312, 3, 166, 83, 0, 1312, 1313, 5, 61, 0, 0, 1313, 1314, 3, 166, 83, 0, 1314, 1315, 5, 139, 0, 0, 1315, 1317, 3, 166, 83, 0, 1316, 1318, 3, 142, 71, 0, 1317, 1316, 1, 0, 0, 0, 1317, 1318, 1, 0, 0, 0, 1318, 1319, 1, 0, 0, 0, 1319, 1320, 5, 137, 0, 0, 1320, 147, 1, 0, 0, 0, 1321, 1379, 3, 154, 77, 0, 1322, 1379, 5, 116, 0, 0, 1323, 1379, 5, 117, 0, 0, 1324, 1325, 5, 118, 0, 0, 1325, 1379, 3, 168, 84, 0, 1326, 1327, 5, 119, 0, 0, 1327, 1328, 5, 146, 0, 0, 1328, 1329, 3, 166, 83, 0, 1329, 1330, 5, 147, 0, 0, 1330, 1379, 1, 0, 0, 0, 1331, 1332, 5, 120, 0, 0, 1332, 1333, 5, 146, 0, 0, 1333, 1335, 3, 166, 83, 0, 1334, 1336, 3, 28, 14, 0, 1335, 1334, 1, 0, 0, 0, 1335, 1336, 1, 0, 0, 0, 1336, 1337, 1, 0, 0, 0, 1337, 1338, 5, 147, 0, 0, 1338, 1379, 1, 0, 0, 0, 1339, 1340, 5, 41, 0, 0, 1340, 1341, 5, 146, 0, 0, 1341, 1342, 3, 166, 83, 0, 1342, 1343, 5, 147, 0, 0, 1343, 1379, 1, 0, 0, 0, 1344, 1345, 5, 121, 0, 0, 1345, 1346, 5, 146, 0, 0, 1346, 1347, 3, 148, 74, 0, 1347, 1348, 5, 147, 0, 0, 1348, 1379, 1, 0, 0, 0, 1349, 1350, 5, 122, 0, 0, 1350, 1351, 5, 146, 0, 0, 1351, 1352, 3, 148, 74, 0, 1352, 1353, 5, 147, 0, 0, 1353, 1379, 1, 0, 0, 0, 1354, 1355, 5, 123, 0, 0, 1355, 1359, 5, 140, 0, 0, 1356, 1358, 3, 150, 75, 0, 1357, 1356, 1, 0, 0, 0, 1358, 1361, 1, 0, 0, 0, 1359, 1357, 1, 0, 0, 0, 1359, 1360, 1, 0, 0, 0, 1360, 1362, 1, 0, 0, 0, 1361, 1359, 1, 0, 0, 0, 1362, 1379, 5, 141, 0, 0, 1363, 1364, 5, 8, 0, 0, 1364, 1365, 5, 87, 0, 0, 1365, 1366, 3, 168, 84, 0, 1366, 1368, 5, 140, 0, 0, 1367, 1369, 3, 152, 76, 0, 1368, 1367, 1, 0, 0, 0, 1369, 1370, 1, 0, 0, 0, 1370, 1368, 1, 0, 0, 0, 1370, 1371, 1, 0, 0, 0, 1371, 1372, 1, 0, 0, 0, 1372, 1373, 5, 141, 0, 0, 1373, 1379, 1, 0, 0, 0, 1374, 1376, 3, 166, 83, 0, 1375, 1377, 3, 28, 14, 0, 1376, 1375, 1, 0, 0, 0, 1376, 1377, 1, 0, 0, 0, 1377, 1379, 1, 0, 0, 0, 1378, 1321, 1, 0, 0, 0, 1378, 1322, 1, 0, 0, 0, 1378, 1323, 1, 0, 0, 0, 1378, 1324, 1, 0, 0, 0, 1378, 1326, 1, 0, 0, 0, 1378, 1331, 1, 0, 0, 0, 1378, 1339, 1, 0, 0, 0, 1378, 1344, 1, 0, 0, 0, 1378, 1349, 1, 0, 0, 0, 1378, 1354, 1, 0, 0, 0, 1378, 1363, 1, 0, 0, 0, 1378, 1374, 1, 0, 0, 0, 1379, 149, 1, 0, 0, 0, 1380, 1381, 3, 166, 83, 0, 1381, 1382, 5, 136, 0, 0, 1382, 1383, 3, 148, 74, 0, 1383, 1384, 5, 137, 0, 0, 1384, 151, 1, 0, 0, 0, 1385, 1386, 3, 166, 83, 0, 1386, 1387, 5, 87, 0, 0, 1387, 1388, 3, 168, 84, 0, 1388, 1389, 5, 136, 0, 0, 1389, 1390, 3, 148, 74, 0, 1390, 1391, 5, 137, 0, 0, 1391, 153, 1, 0, 0, 0, 1392, 1393, 7, 7, 0, 0, 1393, 155, 1, 0, 0, 0, 1394, 1395, 7, 8, 0, 0, 1395, 157, 1, 0, 0, 0, 1396, 1405, 3, 168, 84, 0, 1397, 1405, 5, 150, 0, 0, 1398, 1405, 5, 151, 0, 0, 1399, 1405, 5, 132, 0, 0, 1400, 1405, 5, 133, 0, 0, 1401, 1405, 5, 134, 0, 0, 1402, 1405, 3, 160, 80, 0, 1403, 1405, 3, 164, 82, 0, 1404, 1396, 1, 0, 0, 0, 1404, 1397, 1, 0, 0, 0, 1404, 1398, 1, 0, 0, 0, 1404, 1399, 1, 0, 0, 0, 1404, 1400, 1, 0, 0, 0, 1404, 1401, 1, 0, 0, 0, 1404, 1402, 1, 0, 0, 0, 1404, 1403, 1, 0, 0, 0, 1405, 159, 1, 0, 0, 0, 1406, 1415, 5, 140, 0, 0, 1407, 1412, 3, 162, 81, 0, 1408, 1409, 5, 138, 0, 0, 1409, 1411, 3, 162, 81, 0, 1410, 1408, 1, 0, 0, 0, 1411, 1414, 1, 0, 0, 0, 1412, 1410, 1, 0, 0, 0, 1412, 1413, 1, 0, 0, 0, 1413, 1416, 1, 0, 0, 0, 1414, 1412, 1, 0, 0, 0, 1415, 1407, 1, 0, 0, 0, 1415, 1416, 1, 0, 0, 0, 1416, 1417, 1, 0, 0, 0, 1417, 1418, 5, 141, 0, 0, 1418, 161, 1, 0, 0, 0, 1419, 1420, 3, 168, 84, 0, 1420, 1421, 5, 136, 0, 0, 1421, 1422, 3, 158, 79, 0, 1422, 163, 1, 0, 0, 0, 1423, 1432, 5, 142, 0, 0, 1424, 1429, 3, 158, 79, 0, 1425, 1426, 5, 138, 0, 0, 1426, 1428, 3, 158, 79, 0, 1427, 1425, 1, 0, 0, 0, 1428, 1431, 1, 0, 0, 0, 1429, 1427, 1, 0, 0, 0, 1429, 1430, 1, 0, 0, 0, 1430, 1433, 1, 0, 0, 0, 1431, 1429, 1, 0, 0, 0, 1432, 1424, 1, 0, 0, 0, 1432, 1433, 1, 0, 0, 0, 1433, 1434, 1, 0, 0, 0, 1434, 1435, 5, 143, 0, 0, 1435, 165, 1, 0, 0, 0, 1436, 1437, 7, 9, 0, 0, 1437, 167, 1, 0, 0, 0, 1438, 1439, 5, 153, 0, 0, 1439, 169, 1, 0, 0, 0, 129, 182, 189, 210, 223, 235, 255, 263, 270, 276, 288, 291, 297, 308, 317, 327, 330, 332, 336, 344, 356, 361, 371, 381, 386, 401, 407, 419, 428, 436, 444, 457, 460, 470, 474, 480, 487, 493, 501, 509, 522, 529, 533, 538, 549, 555, 566, 592, 596, 602, 613, 622, 628, 633, 635, 666, 670, 676, 703, 713, 724, 727, 732, 735, 738, 745, 754, 757, 760, 763, 786, 795, 809, 830, 833, 836, 843, 851, 883, 895, 898, 902, 924, 938, 946, 958, 972, 982, 1000, 1004, 1007, 1011, 1014, 1020, 1024, 1029, 1033, 1037, 1043, 1057, 1072, 1092, 1101, 1133, 1153, 1173, 1183, 1186, 1189, 1191, 1205, 1229, 1245, 1254, 1264, 1277, 1292, 1304, 1308, 1317, 1335, 1359, 1370, 1376, 1378, 1404, 1412, 1415, 1429, 1432] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapability.tokens b/src/capability-language/generated/QuixosCapability.tokens index 548a5b5..4a012c6 100644 --- a/src/capability-language/generated/QuixosCapability.tokens +++ b/src/capability-language/generated/QuixosCapability.tokens @@ -47,112 +47,113 @@ INTERFACE=46 INTERFACES=47 PACKAGE=48 VALUE=49 -RELATION=50 -OPERATION=51 -FUNCTION=52 -CONSTRUCTOR=53 -CONSTRUCTS=54 -INPUT=55 -CONFORM=56 -AS=57 -BIND=58 -STATIC=59 -TO=60 -PRIVATE=61 -SHARED=62 -STATE=63 -EDGE=64 -PROJECTION=65 -WITH=66 -USING=67 -ACCEPT=68 -VIA=69 -MATERIALIZE=70 -IF=71 -ABSENT=72 -ON=73 -POLICY=74 -DEFAULT=75 -SOURCE=76 -REPOSITORY=77 -COMMIT=78 -REVISION=79 -SEMANTIC_MAJOR=80 -ON_DELETE=81 -LIFECYCLE=82 -RETAIN_OTHER=83 -KEYED=84 -PUBLIC_TRAVERSAL=85 -ID=86 -DOC=87 -MODE=88 -EMITS=89 -RECEIVER=90 -REQUIRES=91 -ANY=92 -GET=93 -SET=94 -WATCH=95 -START=96 -STOP=97 -READ=98 -WRITE=99 -RESOLVE=100 -CONNECT=101 -DISCONNECT=102 -CALL=103 -WATCH_START=104 -WATCH_STOP=105 -SUBSCRIBE=106 -UNSUBSCRIBE=107 -REGISTER=108 -CRDT=109 -OPTIONAL_ONE=110 -EXACTLY_ONE=111 -MANY_UNIQUE=112 -MANY=113 -ORDERED=114 -UNIT=115 -WATCH_HANDLE=116 -MESSAGE=117 -ATOM_REF=118 -INTERFACE_REF=119 -OPTIONAL=120 -LIST=121 -RECORD=122 -BOOL=123 -BYTES=124 -DOUBLE=125 -INT32=126 -INT64=127 -STRING=128 -UINT32=129 -UINT64=130 -TRUE=131 -FALSE=132 -NULL=133 -ARROW=134 -COLON=135 -SEMI=136 -COMMA=137 -DOT=138 -LBRACE=139 -RBRACE=140 -LBRACK=141 -RBRACK=142 -LPAREN=143 -RPAREN=144 -LT=145 -GT=146 -AMP=147 -EQUAL=148 -INTEGER=149 -JSON_NUMBER=150 -IDENTIFIER=151 -STRING_LITERAL=152 -LINE_COMMENT=153 -BLOCK_COMMENT=154 -WS=155 +FIELD=50 +RELATION=51 +OPERATION=52 +FUNCTION=53 +CONSTRUCTOR=54 +CONSTRUCTS=55 +INPUT=56 +CONFORM=57 +AS=58 +BIND=59 +STATIC=60 +TO=61 +PRIVATE=62 +SHARED=63 +STATE=64 +EDGE=65 +PROJECTION=66 +WITH=67 +USING=68 +ACCEPT=69 +VIA=70 +MATERIALIZE=71 +IF=72 +ABSENT=73 +ON=74 +POLICY=75 +DEFAULT=76 +SOURCE=77 +REPOSITORY=78 +COMMIT=79 +REVISION=80 +SEMANTIC_MAJOR=81 +ON_DELETE=82 +LIFECYCLE=83 +RETAIN_OTHER=84 +KEYED=85 +PUBLIC_TRAVERSAL=86 +ID=87 +DOC=88 +MODE=89 +EMITS=90 +RECEIVER=91 +REQUIRES=92 +ANY=93 +GET=94 +SET=95 +WATCH=96 +START=97 +STOP=98 +READ=99 +WRITE=100 +RESOLVE=101 +CONNECT=102 +DISCONNECT=103 +CALL=104 +WATCH_START=105 +WATCH_STOP=106 +SUBSCRIBE=107 +UNSUBSCRIBE=108 +REGISTER=109 +CRDT=110 +OPTIONAL_ONE=111 +EXACTLY_ONE=112 +MANY_UNIQUE=113 +MANY=114 +ORDERED=115 +UNIT=116 +WATCH_HANDLE=117 +MESSAGE=118 +ATOM_REF=119 +INTERFACE_REF=120 +OPTIONAL=121 +LIST=122 +RECORD=123 +BOOL=124 +BYTES=125 +DOUBLE=126 +INT32=127 +INT64=128 +STRING=129 +UINT32=130 +UINT64=131 +TRUE=132 +FALSE=133 +NULL=134 +ARROW=135 +COLON=136 +SEMI=137 +COMMA=138 +DOT=139 +LBRACE=140 +RBRACE=141 +LBRACK=142 +RBRACK=143 +LPAREN=144 +RPAREN=145 +LT=146 +GT=147 +AMP=148 +EQUAL=149 +INTEGER=150 +JSON_NUMBER=151 +IDENTIFIER=152 +STRING_LITERAL=153 +LINE_COMMENT=154 +BLOCK_COMMENT=155 +WS=156 'edit'=1 'module'=2 'contract'=3 @@ -202,102 +203,103 @@ WS=155 'interfaces'=47 'package'=48 'value'=49 -'relation'=50 -'operation'=51 -'function'=52 -'constructor'=53 -'constructs'=54 -'input'=55 -'conform'=56 -'as'=57 -'bind'=58 -'static'=59 -'to'=60 -'private'=61 -'shared'=62 -'state'=63 -'edge'=64 -'projection'=65 -'with'=66 -'using'=67 -'accept'=68 -'via'=69 -'materialize'=70 -'if'=71 -'absent'=72 -'on'=73 -'policy'=74 -'default'=75 -'source'=76 -'repository'=77 -'commit'=78 -'revision'=79 -'semantic-major'=80 -'on-delete'=81 -'lifecycle'=82 -'retain-other'=83 -'keyed'=84 -'public-traversal'=85 -'id'=86 -'doc'=87 -'mode'=88 -'emits'=89 -'receiver'=90 -'requires'=91 -'any'=92 -'get'=93 -'set'=94 -'watch'=95 -'start'=96 -'stop'=97 -'read'=98 -'write'=99 -'resolve'=100 -'connect'=101 -'disconnect'=102 -'call'=103 -'watch-start'=104 -'watch-stop'=105 -'subscribe'=106 -'unsubscribe'=107 -'register'=108 -'crdt'=109 -'optional-one'=110 -'exactly-one'=111 -'many-unique'=112 -'many'=113 -'ordered'=114 -'unit'=115 -'watch-handle'=116 -'message'=117 -'atom-ref'=118 -'interface-ref'=119 -'optional'=120 -'list'=121 -'record'=122 -'bool'=123 -'bytes'=124 -'double'=125 -'int32'=126 -'int64'=127 -'string'=128 -'uint32'=129 -'uint64'=130 -'true'=131 -'false'=132 -'null'=133 -'->'=134 -':'=135 -';'=136 -','=137 -'.'=138 -'{'=139 -'}'=140 -'['=141 -']'=142 -'('=143 -')'=144 -'<'=145 -'>'=146 -'&'=147 -'='=148 +'field'=50 +'relation'=51 +'operation'=52 +'function'=53 +'constructor'=54 +'constructs'=55 +'input'=56 +'conform'=57 +'as'=58 +'bind'=59 +'static'=60 +'to'=61 +'private'=62 +'shared'=63 +'state'=64 +'edge'=65 +'projection'=66 +'with'=67 +'using'=68 +'accept'=69 +'via'=70 +'materialize'=71 +'if'=72 +'absent'=73 +'on'=74 +'policy'=75 +'default'=76 +'source'=77 +'repository'=78 +'commit'=79 +'revision'=80 +'semantic-major'=81 +'on-delete'=82 +'lifecycle'=83 +'retain-other'=84 +'keyed'=85 +'public-traversal'=86 +'id'=87 +'doc'=88 +'mode'=89 +'emits'=90 +'receiver'=91 +'requires'=92 +'any'=93 +'get'=94 +'set'=95 +'watch'=96 +'start'=97 +'stop'=98 +'read'=99 +'write'=100 +'resolve'=101 +'connect'=102 +'disconnect'=103 +'call'=104 +'watch-start'=105 +'watch-stop'=106 +'subscribe'=107 +'unsubscribe'=108 +'register'=109 +'crdt'=110 +'optional-one'=111 +'exactly-one'=112 +'many-unique'=113 +'many'=114 +'ordered'=115 +'unit'=116 +'watch-handle'=117 +'message'=118 +'atom-ref'=119 +'interface-ref'=120 +'optional'=121 +'list'=122 +'record'=123 +'bool'=124 +'bytes'=125 +'double'=126 +'int32'=127 +'int64'=128 +'string'=129 +'uint32'=130 +'uint64'=131 +'true'=132 +'false'=133 +'null'=134 +'->'=135 +':'=136 +';'=137 +','=138 +'.'=139 +'{'=140 +'}'=141 +'['=142 +']'=143 +'('=144 +')'=145 +'<'=146 +'>'=147 +'&'=148 +'='=149 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.interp b/src/capability-language/generated/QuixosCapabilityLexer.interp index 3354218..da71c4d 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.interp +++ b/src/capability-language/generated/QuixosCapabilityLexer.interp @@ -49,6 +49,7 @@ null 'interfaces' 'package' 'value' +'field' 'relation' 'operation' 'function' @@ -207,6 +208,7 @@ INTERFACE INTERFACES PACKAGE VALUE +FIELD RELATION OPERATION FUNCTION @@ -364,6 +366,7 @@ INTERFACE INTERFACES PACKAGE VALUE +FIELD RELATION OPERATION FUNCTION @@ -481,4 +484,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 155, 1490, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 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, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 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, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 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, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 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, 27, 1, 28, 1, 28, 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, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 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, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 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, 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, 45, 1, 46, 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, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 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, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 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, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 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, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 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, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 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, 67, 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, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 73, 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, 74, 1, 75, 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, 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, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 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, 80, 1, 80, 1, 80, 1, 81, 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, 82, 1, 82, 1, 82, 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, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 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, 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, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 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, 98, 1, 99, 1, 99, 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, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 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, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 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, 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, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 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, 144, 1, 144, 1, 145, 1, 145, 1, 146, 1, 146, 1, 147, 1, 147, 1, 148, 3, 148, 1391, 8, 148, 1, 148, 4, 148, 1394, 8, 148, 11, 148, 12, 148, 1395, 1, 149, 3, 149, 1399, 8, 149, 1, 149, 1, 149, 1, 149, 5, 149, 1404, 8, 149, 10, 149, 12, 149, 1407, 9, 149, 3, 149, 1409, 8, 149, 1, 149, 1, 149, 4, 149, 1413, 8, 149, 11, 149, 12, 149, 1414, 3, 149, 1417, 8, 149, 1, 149, 1, 149, 3, 149, 1421, 8, 149, 1, 149, 4, 149, 1424, 8, 149, 11, 149, 12, 149, 1425, 3, 149, 1428, 8, 149, 1, 150, 1, 150, 5, 150, 1432, 8, 150, 10, 150, 12, 150, 1435, 9, 150, 1, 151, 1, 151, 1, 151, 5, 151, 1440, 8, 151, 10, 151, 12, 151, 1443, 9, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 1, 152, 3, 152, 1455, 8, 152, 1, 153, 1, 153, 1, 154, 1, 154, 1, 154, 1, 154, 5, 154, 1463, 8, 154, 10, 154, 12, 154, 1466, 9, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 5, 155, 1474, 8, 155, 10, 155, 12, 155, 1477, 9, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 156, 4, 156, 1485, 8, 156, 11, 156, 12, 156, 1486, 1, 156, 1, 156, 1, 1475, 0, 157, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 143, 287, 144, 289, 145, 291, 146, 293, 147, 295, 148, 297, 149, 299, 150, 301, 151, 303, 152, 305, 0, 307, 0, 309, 153, 311, 154, 313, 155, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1504, 0, 1, 1, 0, 0, 0, 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, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 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, 309, 1, 0, 0, 0, 0, 311, 1, 0, 0, 0, 0, 313, 1, 0, 0, 0, 1, 315, 1, 0, 0, 0, 3, 320, 1, 0, 0, 0, 5, 327, 1, 0, 0, 0, 7, 336, 1, 0, 0, 0, 9, 349, 1, 0, 0, 0, 11, 357, 1, 0, 0, 0, 13, 361, 1, 0, 0, 0, 15, 370, 1, 0, 0, 0, 17, 378, 1, 0, 0, 0, 19, 387, 1, 0, 0, 0, 21, 398, 1, 0, 0, 0, 23, 408, 1, 0, 0, 0, 25, 418, 1, 0, 0, 0, 27, 427, 1, 0, 0, 0, 29, 439, 1, 0, 0, 0, 31, 446, 1, 0, 0, 0, 33, 454, 1, 0, 0, 0, 35, 463, 1, 0, 0, 0, 37, 471, 1, 0, 0, 0, 39, 477, 1, 0, 0, 0, 41, 482, 1, 0, 0, 0, 43, 495, 1, 0, 0, 0, 45, 505, 1, 0, 0, 0, 47, 517, 1, 0, 0, 0, 49, 523, 1, 0, 0, 0, 51, 534, 1, 0, 0, 0, 53, 545, 1, 0, 0, 0, 55, 550, 1, 0, 0, 0, 57, 559, 1, 0, 0, 0, 59, 569, 1, 0, 0, 0, 61, 574, 1, 0, 0, 0, 63, 578, 1, 0, 0, 0, 65, 584, 1, 0, 0, 0, 67, 589, 1, 0, 0, 0, 69, 599, 1, 0, 0, 0, 71, 603, 1, 0, 0, 0, 73, 616, 1, 0, 0, 0, 75, 621, 1, 0, 0, 0, 77, 628, 1, 0, 0, 0, 79, 637, 1, 0, 0, 0, 81, 648, 1, 0, 0, 0, 83, 652, 1, 0, 0, 0, 85, 661, 1, 0, 0, 0, 87, 668, 1, 0, 0, 0, 89, 677, 1, 0, 0, 0, 91, 682, 1, 0, 0, 0, 93, 692, 1, 0, 0, 0, 95, 703, 1, 0, 0, 0, 97, 711, 1, 0, 0, 0, 99, 717, 1, 0, 0, 0, 101, 726, 1, 0, 0, 0, 103, 736, 1, 0, 0, 0, 105, 745, 1, 0, 0, 0, 107, 757, 1, 0, 0, 0, 109, 768, 1, 0, 0, 0, 111, 774, 1, 0, 0, 0, 113, 782, 1, 0, 0, 0, 115, 785, 1, 0, 0, 0, 117, 790, 1, 0, 0, 0, 119, 797, 1, 0, 0, 0, 121, 800, 1, 0, 0, 0, 123, 808, 1, 0, 0, 0, 125, 815, 1, 0, 0, 0, 127, 821, 1, 0, 0, 0, 129, 826, 1, 0, 0, 0, 131, 837, 1, 0, 0, 0, 133, 842, 1, 0, 0, 0, 135, 848, 1, 0, 0, 0, 137, 855, 1, 0, 0, 0, 139, 859, 1, 0, 0, 0, 141, 871, 1, 0, 0, 0, 143, 874, 1, 0, 0, 0, 145, 881, 1, 0, 0, 0, 147, 884, 1, 0, 0, 0, 149, 891, 1, 0, 0, 0, 151, 899, 1, 0, 0, 0, 153, 906, 1, 0, 0, 0, 155, 917, 1, 0, 0, 0, 157, 924, 1, 0, 0, 0, 159, 933, 1, 0, 0, 0, 161, 948, 1, 0, 0, 0, 163, 958, 1, 0, 0, 0, 165, 968, 1, 0, 0, 0, 167, 981, 1, 0, 0, 0, 169, 987, 1, 0, 0, 0, 171, 1004, 1, 0, 0, 0, 173, 1007, 1, 0, 0, 0, 175, 1011, 1, 0, 0, 0, 177, 1016, 1, 0, 0, 0, 179, 1022, 1, 0, 0, 0, 181, 1031, 1, 0, 0, 0, 183, 1040, 1, 0, 0, 0, 185, 1044, 1, 0, 0, 0, 187, 1048, 1, 0, 0, 0, 189, 1052, 1, 0, 0, 0, 191, 1058, 1, 0, 0, 0, 193, 1064, 1, 0, 0, 0, 195, 1069, 1, 0, 0, 0, 197, 1074, 1, 0, 0, 0, 199, 1080, 1, 0, 0, 0, 201, 1088, 1, 0, 0, 0, 203, 1096, 1, 0, 0, 0, 205, 1107, 1, 0, 0, 0, 207, 1112, 1, 0, 0, 0, 209, 1124, 1, 0, 0, 0, 211, 1135, 1, 0, 0, 0, 213, 1145, 1, 0, 0, 0, 215, 1157, 1, 0, 0, 0, 217, 1166, 1, 0, 0, 0, 219, 1171, 1, 0, 0, 0, 221, 1184, 1, 0, 0, 0, 223, 1196, 1, 0, 0, 0, 225, 1208, 1, 0, 0, 0, 227, 1213, 1, 0, 0, 0, 229, 1221, 1, 0, 0, 0, 231, 1226, 1, 0, 0, 0, 233, 1239, 1, 0, 0, 0, 235, 1247, 1, 0, 0, 0, 237, 1256, 1, 0, 0, 0, 239, 1270, 1, 0, 0, 0, 241, 1279, 1, 0, 0, 0, 243, 1284, 1, 0, 0, 0, 245, 1291, 1, 0, 0, 0, 247, 1296, 1, 0, 0, 0, 249, 1302, 1, 0, 0, 0, 251, 1309, 1, 0, 0, 0, 253, 1315, 1, 0, 0, 0, 255, 1321, 1, 0, 0, 0, 257, 1328, 1, 0, 0, 0, 259, 1335, 1, 0, 0, 0, 261, 1342, 1, 0, 0, 0, 263, 1347, 1, 0, 0, 0, 265, 1353, 1, 0, 0, 0, 267, 1358, 1, 0, 0, 0, 269, 1361, 1, 0, 0, 0, 271, 1363, 1, 0, 0, 0, 273, 1365, 1, 0, 0, 0, 275, 1367, 1, 0, 0, 0, 277, 1369, 1, 0, 0, 0, 279, 1371, 1, 0, 0, 0, 281, 1373, 1, 0, 0, 0, 283, 1375, 1, 0, 0, 0, 285, 1377, 1, 0, 0, 0, 287, 1379, 1, 0, 0, 0, 289, 1381, 1, 0, 0, 0, 291, 1383, 1, 0, 0, 0, 293, 1385, 1, 0, 0, 0, 295, 1387, 1, 0, 0, 0, 297, 1390, 1, 0, 0, 0, 299, 1398, 1, 0, 0, 0, 301, 1429, 1, 0, 0, 0, 303, 1436, 1, 0, 0, 0, 305, 1446, 1, 0, 0, 0, 307, 1456, 1, 0, 0, 0, 309, 1458, 1, 0, 0, 0, 311, 1469, 1, 0, 0, 0, 313, 1484, 1, 0, 0, 0, 315, 316, 5, 101, 0, 0, 316, 317, 5, 100, 0, 0, 317, 318, 5, 105, 0, 0, 318, 319, 5, 116, 0, 0, 319, 2, 1, 0, 0, 0, 320, 321, 5, 109, 0, 0, 321, 322, 5, 111, 0, 0, 322, 323, 5, 100, 0, 0, 323, 324, 5, 117, 0, 0, 324, 325, 5, 108, 0, 0, 325, 326, 5, 101, 0, 0, 326, 4, 1, 0, 0, 0, 327, 328, 5, 99, 0, 0, 328, 329, 5, 111, 0, 0, 329, 330, 5, 110, 0, 0, 330, 331, 5, 116, 0, 0, 331, 332, 5, 114, 0, 0, 332, 333, 5, 97, 0, 0, 333, 334, 5, 99, 0, 0, 334, 335, 5, 116, 0, 0, 335, 6, 1, 0, 0, 0, 336, 337, 5, 112, 0, 0, 337, 338, 5, 114, 0, 0, 338, 339, 5, 101, 0, 0, 339, 340, 5, 115, 0, 0, 340, 341, 5, 101, 0, 0, 341, 342, 5, 110, 0, 0, 342, 343, 5, 116, 0, 0, 343, 344, 5, 97, 0, 0, 344, 345, 5, 116, 0, 0, 345, 346, 5, 105, 0, 0, 346, 347, 5, 111, 0, 0, 347, 348, 5, 110, 0, 0, 348, 8, 1, 0, 0, 0, 349, 350, 5, 115, 0, 0, 350, 351, 5, 117, 0, 0, 351, 352, 5, 98, 0, 0, 352, 353, 5, 106, 0, 0, 353, 354, 5, 101, 0, 0, 354, 355, 5, 99, 0, 0, 355, 356, 5, 116, 0, 0, 356, 10, 1, 0, 0, 0, 357, 358, 5, 102, 0, 0, 358, 359, 5, 111, 0, 0, 359, 360, 5, 114, 0, 0, 360, 12, 1, 0, 0, 0, 361, 362, 5, 99, 0, 0, 362, 363, 5, 114, 0, 0, 363, 364, 5, 101, 0, 0, 364, 365, 5, 97, 0, 0, 365, 366, 5, 116, 0, 0, 366, 367, 5, 105, 0, 0, 367, 368, 5, 111, 0, 0, 368, 369, 5, 110, 0, 0, 369, 14, 1, 0, 0, 0, 370, 371, 5, 118, 0, 0, 371, 372, 5, 97, 0, 0, 372, 373, 5, 114, 0, 0, 373, 374, 5, 105, 0, 0, 374, 375, 5, 97, 0, 0, 375, 376, 5, 110, 0, 0, 376, 377, 5, 116, 0, 0, 377, 16, 1, 0, 0, 0, 378, 379, 5, 112, 0, 0, 379, 380, 5, 114, 0, 0, 380, 381, 5, 101, 0, 0, 381, 382, 5, 112, 0, 0, 382, 383, 5, 97, 0, 0, 383, 384, 5, 114, 0, 0, 384, 385, 5, 101, 0, 0, 385, 386, 5, 115, 0, 0, 386, 18, 1, 0, 0, 0, 387, 388, 5, 105, 0, 0, 388, 389, 5, 110, 0, 0, 389, 390, 5, 105, 0, 0, 390, 391, 5, 116, 0, 0, 391, 392, 5, 105, 0, 0, 392, 393, 5, 97, 0, 0, 393, 394, 5, 108, 0, 0, 394, 395, 5, 105, 0, 0, 395, 396, 5, 122, 0, 0, 396, 397, 5, 101, 0, 0, 397, 20, 1, 0, 0, 0, 398, 399, 5, 119, 0, 0, 399, 400, 5, 111, 0, 0, 400, 401, 5, 114, 0, 0, 401, 402, 5, 107, 0, 0, 402, 403, 5, 115, 0, 0, 403, 404, 5, 112, 0, 0, 404, 405, 5, 97, 0, 0, 405, 406, 5, 99, 0, 0, 406, 407, 5, 101, 0, 0, 407, 22, 1, 0, 0, 0, 408, 409, 5, 101, 0, 0, 409, 410, 5, 120, 0, 0, 410, 411, 5, 101, 0, 0, 411, 412, 5, 99, 0, 0, 412, 413, 5, 117, 0, 0, 413, 414, 5, 116, 0, 0, 414, 415, 5, 105, 0, 0, 415, 416, 5, 111, 0, 0, 416, 417, 5, 110, 0, 0, 417, 24, 1, 0, 0, 0, 418, 419, 5, 115, 0, 0, 419, 420, 5, 110, 0, 0, 420, 421, 5, 97, 0, 0, 421, 422, 5, 112, 0, 0, 422, 423, 5, 115, 0, 0, 423, 424, 5, 104, 0, 0, 424, 425, 5, 111, 0, 0, 425, 426, 5, 116, 0, 0, 426, 26, 1, 0, 0, 0, 427, 428, 5, 116, 0, 0, 428, 429, 5, 114, 0, 0, 429, 430, 5, 97, 0, 0, 430, 431, 5, 110, 0, 0, 431, 432, 5, 115, 0, 0, 432, 433, 5, 97, 0, 0, 433, 434, 5, 99, 0, 0, 434, 435, 5, 116, 0, 0, 435, 436, 5, 105, 0, 0, 436, 437, 5, 111, 0, 0, 437, 438, 5, 110, 0, 0, 438, 28, 1, 0, 0, 0, 439, 440, 5, 114, 0, 0, 440, 441, 5, 101, 0, 0, 441, 442, 5, 109, 0, 0, 442, 443, 5, 111, 0, 0, 443, 444, 5, 116, 0, 0, 444, 445, 5, 101, 0, 0, 445, 30, 1, 0, 0, 0, 446, 447, 5, 116, 0, 0, 447, 448, 5, 97, 0, 0, 448, 449, 5, 114, 0, 0, 449, 450, 5, 103, 0, 0, 450, 451, 5, 101, 0, 0, 451, 452, 5, 116, 0, 0, 452, 453, 5, 115, 0, 0, 453, 32, 1, 0, 0, 0, 454, 455, 5, 112, 0, 0, 455, 456, 5, 111, 0, 0, 456, 457, 5, 114, 0, 0, 457, 458, 5, 116, 0, 0, 458, 459, 5, 97, 0, 0, 459, 460, 5, 98, 0, 0, 460, 461, 5, 108, 0, 0, 461, 462, 5, 101, 0, 0, 462, 34, 1, 0, 0, 0, 463, 464, 5, 114, 0, 0, 464, 465, 5, 101, 0, 0, 465, 466, 5, 112, 0, 0, 466, 467, 5, 108, 0, 0, 467, 468, 5, 105, 0, 0, 468, 469, 5, 99, 0, 0, 469, 470, 5, 97, 0, 0, 470, 36, 1, 0, 0, 0, 471, 472, 5, 108, 0, 0, 472, 473, 5, 111, 0, 0, 473, 474, 5, 99, 0, 0, 474, 475, 5, 97, 0, 0, 475, 476, 5, 108, 0, 0, 476, 38, 1, 0, 0, 0, 477, 478, 5, 102, 0, 0, 478, 479, 5, 114, 0, 0, 479, 480, 5, 111, 0, 0, 480, 481, 5, 109, 0, 0, 481, 40, 1, 0, 0, 0, 482, 483, 5, 114, 0, 0, 483, 484, 5, 101, 0, 0, 484, 485, 5, 115, 0, 0, 485, 486, 5, 117, 0, 0, 486, 487, 5, 108, 0, 0, 487, 488, 5, 116, 0, 0, 488, 489, 5, 45, 0, 0, 489, 490, 5, 98, 0, 0, 490, 491, 5, 121, 0, 0, 491, 492, 5, 116, 0, 0, 492, 493, 5, 101, 0, 0, 493, 494, 5, 115, 0, 0, 494, 42, 1, 0, 0, 0, 495, 496, 5, 114, 0, 0, 496, 497, 5, 112, 0, 0, 497, 498, 5, 99, 0, 0, 498, 499, 5, 45, 0, 0, 499, 500, 5, 99, 0, 0, 500, 501, 5, 97, 0, 0, 501, 502, 5, 108, 0, 0, 502, 503, 5, 108, 0, 0, 503, 504, 5, 115, 0, 0, 504, 44, 1, 0, 0, 0, 505, 506, 5, 100, 0, 0, 506, 507, 5, 101, 0, 0, 507, 508, 5, 97, 0, 0, 508, 509, 5, 100, 0, 0, 509, 510, 5, 108, 0, 0, 510, 511, 5, 105, 0, 0, 511, 512, 5, 110, 0, 0, 512, 513, 5, 101, 0, 0, 513, 514, 5, 45, 0, 0, 514, 515, 5, 109, 0, 0, 515, 516, 5, 115, 0, 0, 516, 46, 1, 0, 0, 0, 517, 518, 5, 113, 0, 0, 518, 519, 5, 117, 0, 0, 519, 520, 5, 101, 0, 0, 520, 521, 5, 114, 0, 0, 521, 522, 5, 121, 0, 0, 522, 48, 1, 0, 0, 0, 523, 524, 5, 114, 0, 0, 524, 525, 5, 101, 0, 0, 525, 526, 5, 102, 0, 0, 526, 527, 5, 108, 0, 0, 527, 528, 5, 101, 0, 0, 528, 529, 5, 99, 0, 0, 529, 530, 5, 116, 0, 0, 530, 531, 5, 105, 0, 0, 531, 532, 5, 111, 0, 0, 532, 533, 5, 110, 0, 0, 533, 50, 1, 0, 0, 0, 534, 535, 5, 115, 0, 0, 535, 536, 5, 112, 0, 0, 536, 537, 5, 101, 0, 0, 537, 538, 5, 99, 0, 0, 538, 539, 5, 105, 0, 0, 539, 540, 5, 97, 0, 0, 540, 541, 5, 108, 0, 0, 541, 542, 5, 105, 0, 0, 542, 543, 5, 122, 0, 0, 543, 544, 5, 101, 0, 0, 544, 52, 1, 0, 0, 0, 545, 546, 5, 114, 0, 0, 546, 547, 5, 111, 0, 0, 547, 548, 5, 111, 0, 0, 548, 549, 5, 116, 0, 0, 549, 54, 1, 0, 0, 0, 550, 551, 5, 100, 0, 0, 551, 552, 5, 111, 0, 0, 552, 553, 5, 99, 0, 0, 553, 554, 5, 117, 0, 0, 554, 555, 5, 109, 0, 0, 555, 556, 5, 101, 0, 0, 556, 557, 5, 110, 0, 0, 557, 558, 5, 116, 0, 0, 558, 56, 1, 0, 0, 0, 559, 560, 5, 102, 0, 0, 560, 561, 5, 114, 0, 0, 561, 562, 5, 97, 0, 0, 562, 563, 5, 103, 0, 0, 563, 564, 5, 109, 0, 0, 564, 565, 5, 101, 0, 0, 565, 566, 5, 110, 0, 0, 566, 567, 5, 116, 0, 0, 567, 568, 5, 115, 0, 0, 568, 58, 1, 0, 0, 0, 569, 570, 5, 118, 0, 0, 570, 571, 5, 105, 0, 0, 571, 572, 5, 101, 0, 0, 572, 573, 5, 119, 0, 0, 573, 60, 1, 0, 0, 0, 574, 575, 5, 109, 0, 0, 575, 576, 5, 97, 0, 0, 576, 577, 5, 120, 0, 0, 577, 62, 1, 0, 0, 0, 578, 579, 5, 97, 0, 0, 579, 580, 5, 108, 0, 0, 580, 581, 5, 108, 0, 0, 581, 582, 5, 111, 0, 0, 582, 583, 5, 119, 0, 0, 583, 64, 1, 0, 0, 0, 584, 585, 5, 112, 0, 0, 585, 586, 5, 111, 0, 0, 586, 587, 5, 108, 0, 0, 587, 588, 5, 108, 0, 0, 588, 66, 1, 0, 0, 0, 589, 590, 5, 113, 0, 0, 590, 591, 5, 117, 0, 0, 591, 592, 5, 101, 0, 0, 592, 593, 5, 114, 0, 0, 593, 594, 5, 121, 0, 0, 594, 595, 5, 97, 0, 0, 595, 596, 5, 98, 0, 0, 596, 597, 5, 108, 0, 0, 597, 598, 5, 101, 0, 0, 598, 68, 1, 0, 0, 0, 599, 600, 5, 114, 0, 0, 600, 601, 5, 112, 0, 0, 601, 602, 5, 99, 0, 0, 602, 70, 1, 0, 0, 0, 603, 604, 5, 113, 0, 0, 604, 605, 5, 117, 0, 0, 605, 606, 5, 101, 0, 0, 606, 607, 5, 114, 0, 0, 607, 608, 5, 121, 0, 0, 608, 609, 5, 45, 0, 0, 609, 610, 5, 114, 0, 0, 610, 611, 5, 101, 0, 0, 611, 612, 5, 97, 0, 0, 612, 613, 5, 115, 0, 0, 613, 614, 5, 111, 0, 0, 614, 615, 5, 110, 0, 0, 615, 72, 1, 0, 0, 0, 616, 617, 5, 116, 0, 0, 617, 618, 5, 121, 0, 0, 618, 619, 5, 112, 0, 0, 619, 620, 5, 101, 0, 0, 620, 74, 1, 0, 0, 0, 621, 622, 5, 111, 0, 0, 622, 623, 5, 98, 0, 0, 623, 624, 5, 106, 0, 0, 624, 625, 5, 101, 0, 0, 625, 626, 5, 99, 0, 0, 626, 627, 5, 116, 0, 0, 627, 76, 1, 0, 0, 0, 628, 629, 5, 115, 0, 0, 629, 630, 5, 116, 0, 0, 630, 631, 5, 111, 0, 0, 631, 632, 5, 114, 0, 0, 632, 633, 5, 97, 0, 0, 633, 634, 5, 98, 0, 0, 634, 635, 5, 108, 0, 0, 635, 636, 5, 101, 0, 0, 636, 78, 1, 0, 0, 0, 637, 638, 5, 105, 0, 0, 638, 639, 5, 109, 0, 0, 639, 640, 5, 112, 0, 0, 640, 641, 5, 108, 0, 0, 641, 642, 5, 101, 0, 0, 642, 643, 5, 109, 0, 0, 643, 644, 5, 101, 0, 0, 644, 645, 5, 110, 0, 0, 645, 646, 5, 116, 0, 0, 646, 647, 5, 115, 0, 0, 647, 80, 1, 0, 0, 0, 648, 649, 5, 114, 0, 0, 649, 650, 5, 101, 0, 0, 650, 651, 5, 102, 0, 0, 651, 82, 1, 0, 0, 0, 652, 653, 5, 102, 0, 0, 653, 654, 5, 114, 0, 0, 654, 655, 5, 97, 0, 0, 655, 656, 5, 103, 0, 0, 656, 657, 5, 109, 0, 0, 657, 658, 5, 101, 0, 0, 658, 659, 5, 110, 0, 0, 659, 660, 5, 116, 0, 0, 660, 84, 1, 0, 0, 0, 661, 662, 5, 105, 0, 0, 662, 663, 5, 109, 0, 0, 663, 664, 5, 112, 0, 0, 664, 665, 5, 111, 0, 0, 665, 666, 5, 114, 0, 0, 666, 667, 5, 116, 0, 0, 667, 86, 1, 0, 0, 0, 668, 669, 5, 101, 0, 0, 669, 670, 5, 120, 0, 0, 670, 671, 5, 116, 0, 0, 671, 672, 5, 101, 0, 0, 672, 673, 5, 114, 0, 0, 673, 674, 5, 110, 0, 0, 674, 675, 5, 97, 0, 0, 675, 676, 5, 108, 0, 0, 676, 88, 1, 0, 0, 0, 677, 678, 5, 97, 0, 0, 678, 679, 5, 116, 0, 0, 679, 680, 5, 111, 0, 0, 680, 681, 5, 109, 0, 0, 681, 90, 1, 0, 0, 0, 682, 683, 5, 105, 0, 0, 683, 684, 5, 110, 0, 0, 684, 685, 5, 116, 0, 0, 685, 686, 5, 101, 0, 0, 686, 687, 5, 114, 0, 0, 687, 688, 5, 102, 0, 0, 688, 689, 5, 97, 0, 0, 689, 690, 5, 99, 0, 0, 690, 691, 5, 101, 0, 0, 691, 92, 1, 0, 0, 0, 692, 693, 5, 105, 0, 0, 693, 694, 5, 110, 0, 0, 694, 695, 5, 116, 0, 0, 695, 696, 5, 101, 0, 0, 696, 697, 5, 114, 0, 0, 697, 698, 5, 102, 0, 0, 698, 699, 5, 97, 0, 0, 699, 700, 5, 99, 0, 0, 700, 701, 5, 101, 0, 0, 701, 702, 5, 115, 0, 0, 702, 94, 1, 0, 0, 0, 703, 704, 5, 112, 0, 0, 704, 705, 5, 97, 0, 0, 705, 706, 5, 99, 0, 0, 706, 707, 5, 107, 0, 0, 707, 708, 5, 97, 0, 0, 708, 709, 5, 103, 0, 0, 709, 710, 5, 101, 0, 0, 710, 96, 1, 0, 0, 0, 711, 712, 5, 118, 0, 0, 712, 713, 5, 97, 0, 0, 713, 714, 5, 108, 0, 0, 714, 715, 5, 117, 0, 0, 715, 716, 5, 101, 0, 0, 716, 98, 1, 0, 0, 0, 717, 718, 5, 114, 0, 0, 718, 719, 5, 101, 0, 0, 719, 720, 5, 108, 0, 0, 720, 721, 5, 97, 0, 0, 721, 722, 5, 116, 0, 0, 722, 723, 5, 105, 0, 0, 723, 724, 5, 111, 0, 0, 724, 725, 5, 110, 0, 0, 725, 100, 1, 0, 0, 0, 726, 727, 5, 111, 0, 0, 727, 728, 5, 112, 0, 0, 728, 729, 5, 101, 0, 0, 729, 730, 5, 114, 0, 0, 730, 731, 5, 97, 0, 0, 731, 732, 5, 116, 0, 0, 732, 733, 5, 105, 0, 0, 733, 734, 5, 111, 0, 0, 734, 735, 5, 110, 0, 0, 735, 102, 1, 0, 0, 0, 736, 737, 5, 102, 0, 0, 737, 738, 5, 117, 0, 0, 738, 739, 5, 110, 0, 0, 739, 740, 5, 99, 0, 0, 740, 741, 5, 116, 0, 0, 741, 742, 5, 105, 0, 0, 742, 743, 5, 111, 0, 0, 743, 744, 5, 110, 0, 0, 744, 104, 1, 0, 0, 0, 745, 746, 5, 99, 0, 0, 746, 747, 5, 111, 0, 0, 747, 748, 5, 110, 0, 0, 748, 749, 5, 115, 0, 0, 749, 750, 5, 116, 0, 0, 750, 751, 5, 114, 0, 0, 751, 752, 5, 117, 0, 0, 752, 753, 5, 99, 0, 0, 753, 754, 5, 116, 0, 0, 754, 755, 5, 111, 0, 0, 755, 756, 5, 114, 0, 0, 756, 106, 1, 0, 0, 0, 757, 758, 5, 99, 0, 0, 758, 759, 5, 111, 0, 0, 759, 760, 5, 110, 0, 0, 760, 761, 5, 115, 0, 0, 761, 762, 5, 116, 0, 0, 762, 763, 5, 114, 0, 0, 763, 764, 5, 117, 0, 0, 764, 765, 5, 99, 0, 0, 765, 766, 5, 116, 0, 0, 766, 767, 5, 115, 0, 0, 767, 108, 1, 0, 0, 0, 768, 769, 5, 105, 0, 0, 769, 770, 5, 110, 0, 0, 770, 771, 5, 112, 0, 0, 771, 772, 5, 117, 0, 0, 772, 773, 5, 116, 0, 0, 773, 110, 1, 0, 0, 0, 774, 775, 5, 99, 0, 0, 775, 776, 5, 111, 0, 0, 776, 777, 5, 110, 0, 0, 777, 778, 5, 102, 0, 0, 778, 779, 5, 111, 0, 0, 779, 780, 5, 114, 0, 0, 780, 781, 5, 109, 0, 0, 781, 112, 1, 0, 0, 0, 782, 783, 5, 97, 0, 0, 783, 784, 5, 115, 0, 0, 784, 114, 1, 0, 0, 0, 785, 786, 5, 98, 0, 0, 786, 787, 5, 105, 0, 0, 787, 788, 5, 110, 0, 0, 788, 789, 5, 100, 0, 0, 789, 116, 1, 0, 0, 0, 790, 791, 5, 115, 0, 0, 791, 792, 5, 116, 0, 0, 792, 793, 5, 97, 0, 0, 793, 794, 5, 116, 0, 0, 794, 795, 5, 105, 0, 0, 795, 796, 5, 99, 0, 0, 796, 118, 1, 0, 0, 0, 797, 798, 5, 116, 0, 0, 798, 799, 5, 111, 0, 0, 799, 120, 1, 0, 0, 0, 800, 801, 5, 112, 0, 0, 801, 802, 5, 114, 0, 0, 802, 803, 5, 105, 0, 0, 803, 804, 5, 118, 0, 0, 804, 805, 5, 97, 0, 0, 805, 806, 5, 116, 0, 0, 806, 807, 5, 101, 0, 0, 807, 122, 1, 0, 0, 0, 808, 809, 5, 115, 0, 0, 809, 810, 5, 104, 0, 0, 810, 811, 5, 97, 0, 0, 811, 812, 5, 114, 0, 0, 812, 813, 5, 101, 0, 0, 813, 814, 5, 100, 0, 0, 814, 124, 1, 0, 0, 0, 815, 816, 5, 115, 0, 0, 816, 817, 5, 116, 0, 0, 817, 818, 5, 97, 0, 0, 818, 819, 5, 116, 0, 0, 819, 820, 5, 101, 0, 0, 820, 126, 1, 0, 0, 0, 821, 822, 5, 101, 0, 0, 822, 823, 5, 100, 0, 0, 823, 824, 5, 103, 0, 0, 824, 825, 5, 101, 0, 0, 825, 128, 1, 0, 0, 0, 826, 827, 5, 112, 0, 0, 827, 828, 5, 114, 0, 0, 828, 829, 5, 111, 0, 0, 829, 830, 5, 106, 0, 0, 830, 831, 5, 101, 0, 0, 831, 832, 5, 99, 0, 0, 832, 833, 5, 116, 0, 0, 833, 834, 5, 105, 0, 0, 834, 835, 5, 111, 0, 0, 835, 836, 5, 110, 0, 0, 836, 130, 1, 0, 0, 0, 837, 838, 5, 119, 0, 0, 838, 839, 5, 105, 0, 0, 839, 840, 5, 116, 0, 0, 840, 841, 5, 104, 0, 0, 841, 132, 1, 0, 0, 0, 842, 843, 5, 117, 0, 0, 843, 844, 5, 115, 0, 0, 844, 845, 5, 105, 0, 0, 845, 846, 5, 110, 0, 0, 846, 847, 5, 103, 0, 0, 847, 134, 1, 0, 0, 0, 848, 849, 5, 97, 0, 0, 849, 850, 5, 99, 0, 0, 850, 851, 5, 99, 0, 0, 851, 852, 5, 101, 0, 0, 852, 853, 5, 112, 0, 0, 853, 854, 5, 116, 0, 0, 854, 136, 1, 0, 0, 0, 855, 856, 5, 118, 0, 0, 856, 857, 5, 105, 0, 0, 857, 858, 5, 97, 0, 0, 858, 138, 1, 0, 0, 0, 859, 860, 5, 109, 0, 0, 860, 861, 5, 97, 0, 0, 861, 862, 5, 116, 0, 0, 862, 863, 5, 101, 0, 0, 863, 864, 5, 114, 0, 0, 864, 865, 5, 105, 0, 0, 865, 866, 5, 97, 0, 0, 866, 867, 5, 108, 0, 0, 867, 868, 5, 105, 0, 0, 868, 869, 5, 122, 0, 0, 869, 870, 5, 101, 0, 0, 870, 140, 1, 0, 0, 0, 871, 872, 5, 105, 0, 0, 872, 873, 5, 102, 0, 0, 873, 142, 1, 0, 0, 0, 874, 875, 5, 97, 0, 0, 875, 876, 5, 98, 0, 0, 876, 877, 5, 115, 0, 0, 877, 878, 5, 101, 0, 0, 878, 879, 5, 110, 0, 0, 879, 880, 5, 116, 0, 0, 880, 144, 1, 0, 0, 0, 881, 882, 5, 111, 0, 0, 882, 883, 5, 110, 0, 0, 883, 146, 1, 0, 0, 0, 884, 885, 5, 112, 0, 0, 885, 886, 5, 111, 0, 0, 886, 887, 5, 108, 0, 0, 887, 888, 5, 105, 0, 0, 888, 889, 5, 99, 0, 0, 889, 890, 5, 121, 0, 0, 890, 148, 1, 0, 0, 0, 891, 892, 5, 100, 0, 0, 892, 893, 5, 101, 0, 0, 893, 894, 5, 102, 0, 0, 894, 895, 5, 97, 0, 0, 895, 896, 5, 117, 0, 0, 896, 897, 5, 108, 0, 0, 897, 898, 5, 116, 0, 0, 898, 150, 1, 0, 0, 0, 899, 900, 5, 115, 0, 0, 900, 901, 5, 111, 0, 0, 901, 902, 5, 117, 0, 0, 902, 903, 5, 114, 0, 0, 903, 904, 5, 99, 0, 0, 904, 905, 5, 101, 0, 0, 905, 152, 1, 0, 0, 0, 906, 907, 5, 114, 0, 0, 907, 908, 5, 101, 0, 0, 908, 909, 5, 112, 0, 0, 909, 910, 5, 111, 0, 0, 910, 911, 5, 115, 0, 0, 911, 912, 5, 105, 0, 0, 912, 913, 5, 116, 0, 0, 913, 914, 5, 111, 0, 0, 914, 915, 5, 114, 0, 0, 915, 916, 5, 121, 0, 0, 916, 154, 1, 0, 0, 0, 917, 918, 5, 99, 0, 0, 918, 919, 5, 111, 0, 0, 919, 920, 5, 109, 0, 0, 920, 921, 5, 109, 0, 0, 921, 922, 5, 105, 0, 0, 922, 923, 5, 116, 0, 0, 923, 156, 1, 0, 0, 0, 924, 925, 5, 114, 0, 0, 925, 926, 5, 101, 0, 0, 926, 927, 5, 118, 0, 0, 927, 928, 5, 105, 0, 0, 928, 929, 5, 115, 0, 0, 929, 930, 5, 105, 0, 0, 930, 931, 5, 111, 0, 0, 931, 932, 5, 110, 0, 0, 932, 158, 1, 0, 0, 0, 933, 934, 5, 115, 0, 0, 934, 935, 5, 101, 0, 0, 935, 936, 5, 109, 0, 0, 936, 937, 5, 97, 0, 0, 937, 938, 5, 110, 0, 0, 938, 939, 5, 116, 0, 0, 939, 940, 5, 105, 0, 0, 940, 941, 5, 99, 0, 0, 941, 942, 5, 45, 0, 0, 942, 943, 5, 109, 0, 0, 943, 944, 5, 97, 0, 0, 944, 945, 5, 106, 0, 0, 945, 946, 5, 111, 0, 0, 946, 947, 5, 114, 0, 0, 947, 160, 1, 0, 0, 0, 948, 949, 5, 111, 0, 0, 949, 950, 5, 110, 0, 0, 950, 951, 5, 45, 0, 0, 951, 952, 5, 100, 0, 0, 952, 953, 5, 101, 0, 0, 953, 954, 5, 108, 0, 0, 954, 955, 5, 101, 0, 0, 955, 956, 5, 116, 0, 0, 956, 957, 5, 101, 0, 0, 957, 162, 1, 0, 0, 0, 958, 959, 5, 108, 0, 0, 959, 960, 5, 105, 0, 0, 960, 961, 5, 102, 0, 0, 961, 962, 5, 101, 0, 0, 962, 963, 5, 99, 0, 0, 963, 964, 5, 121, 0, 0, 964, 965, 5, 99, 0, 0, 965, 966, 5, 108, 0, 0, 966, 967, 5, 101, 0, 0, 967, 164, 1, 0, 0, 0, 968, 969, 5, 114, 0, 0, 969, 970, 5, 101, 0, 0, 970, 971, 5, 116, 0, 0, 971, 972, 5, 97, 0, 0, 972, 973, 5, 105, 0, 0, 973, 974, 5, 110, 0, 0, 974, 975, 5, 45, 0, 0, 975, 976, 5, 111, 0, 0, 976, 977, 5, 116, 0, 0, 977, 978, 5, 104, 0, 0, 978, 979, 5, 101, 0, 0, 979, 980, 5, 114, 0, 0, 980, 166, 1, 0, 0, 0, 981, 982, 5, 107, 0, 0, 982, 983, 5, 101, 0, 0, 983, 984, 5, 121, 0, 0, 984, 985, 5, 101, 0, 0, 985, 986, 5, 100, 0, 0, 986, 168, 1, 0, 0, 0, 987, 988, 5, 112, 0, 0, 988, 989, 5, 117, 0, 0, 989, 990, 5, 98, 0, 0, 990, 991, 5, 108, 0, 0, 991, 992, 5, 105, 0, 0, 992, 993, 5, 99, 0, 0, 993, 994, 5, 45, 0, 0, 994, 995, 5, 116, 0, 0, 995, 996, 5, 114, 0, 0, 996, 997, 5, 97, 0, 0, 997, 998, 5, 118, 0, 0, 998, 999, 5, 101, 0, 0, 999, 1000, 5, 114, 0, 0, 1000, 1001, 5, 115, 0, 0, 1001, 1002, 5, 97, 0, 0, 1002, 1003, 5, 108, 0, 0, 1003, 170, 1, 0, 0, 0, 1004, 1005, 5, 105, 0, 0, 1005, 1006, 5, 100, 0, 0, 1006, 172, 1, 0, 0, 0, 1007, 1008, 5, 100, 0, 0, 1008, 1009, 5, 111, 0, 0, 1009, 1010, 5, 99, 0, 0, 1010, 174, 1, 0, 0, 0, 1011, 1012, 5, 109, 0, 0, 1012, 1013, 5, 111, 0, 0, 1013, 1014, 5, 100, 0, 0, 1014, 1015, 5, 101, 0, 0, 1015, 176, 1, 0, 0, 0, 1016, 1017, 5, 101, 0, 0, 1017, 1018, 5, 109, 0, 0, 1018, 1019, 5, 105, 0, 0, 1019, 1020, 5, 116, 0, 0, 1020, 1021, 5, 115, 0, 0, 1021, 178, 1, 0, 0, 0, 1022, 1023, 5, 114, 0, 0, 1023, 1024, 5, 101, 0, 0, 1024, 1025, 5, 99, 0, 0, 1025, 1026, 5, 101, 0, 0, 1026, 1027, 5, 105, 0, 0, 1027, 1028, 5, 118, 0, 0, 1028, 1029, 5, 101, 0, 0, 1029, 1030, 5, 114, 0, 0, 1030, 180, 1, 0, 0, 0, 1031, 1032, 5, 114, 0, 0, 1032, 1033, 5, 101, 0, 0, 1033, 1034, 5, 113, 0, 0, 1034, 1035, 5, 117, 0, 0, 1035, 1036, 5, 105, 0, 0, 1036, 1037, 5, 114, 0, 0, 1037, 1038, 5, 101, 0, 0, 1038, 1039, 5, 115, 0, 0, 1039, 182, 1, 0, 0, 0, 1040, 1041, 5, 97, 0, 0, 1041, 1042, 5, 110, 0, 0, 1042, 1043, 5, 121, 0, 0, 1043, 184, 1, 0, 0, 0, 1044, 1045, 5, 103, 0, 0, 1045, 1046, 5, 101, 0, 0, 1046, 1047, 5, 116, 0, 0, 1047, 186, 1, 0, 0, 0, 1048, 1049, 5, 115, 0, 0, 1049, 1050, 5, 101, 0, 0, 1050, 1051, 5, 116, 0, 0, 1051, 188, 1, 0, 0, 0, 1052, 1053, 5, 119, 0, 0, 1053, 1054, 5, 97, 0, 0, 1054, 1055, 5, 116, 0, 0, 1055, 1056, 5, 99, 0, 0, 1056, 1057, 5, 104, 0, 0, 1057, 190, 1, 0, 0, 0, 1058, 1059, 5, 115, 0, 0, 1059, 1060, 5, 116, 0, 0, 1060, 1061, 5, 97, 0, 0, 1061, 1062, 5, 114, 0, 0, 1062, 1063, 5, 116, 0, 0, 1063, 192, 1, 0, 0, 0, 1064, 1065, 5, 115, 0, 0, 1065, 1066, 5, 116, 0, 0, 1066, 1067, 5, 111, 0, 0, 1067, 1068, 5, 112, 0, 0, 1068, 194, 1, 0, 0, 0, 1069, 1070, 5, 114, 0, 0, 1070, 1071, 5, 101, 0, 0, 1071, 1072, 5, 97, 0, 0, 1072, 1073, 5, 100, 0, 0, 1073, 196, 1, 0, 0, 0, 1074, 1075, 5, 119, 0, 0, 1075, 1076, 5, 114, 0, 0, 1076, 1077, 5, 105, 0, 0, 1077, 1078, 5, 116, 0, 0, 1078, 1079, 5, 101, 0, 0, 1079, 198, 1, 0, 0, 0, 1080, 1081, 5, 114, 0, 0, 1081, 1082, 5, 101, 0, 0, 1082, 1083, 5, 115, 0, 0, 1083, 1084, 5, 111, 0, 0, 1084, 1085, 5, 108, 0, 0, 1085, 1086, 5, 118, 0, 0, 1086, 1087, 5, 101, 0, 0, 1087, 200, 1, 0, 0, 0, 1088, 1089, 5, 99, 0, 0, 1089, 1090, 5, 111, 0, 0, 1090, 1091, 5, 110, 0, 0, 1091, 1092, 5, 110, 0, 0, 1092, 1093, 5, 101, 0, 0, 1093, 1094, 5, 99, 0, 0, 1094, 1095, 5, 116, 0, 0, 1095, 202, 1, 0, 0, 0, 1096, 1097, 5, 100, 0, 0, 1097, 1098, 5, 105, 0, 0, 1098, 1099, 5, 115, 0, 0, 1099, 1100, 5, 99, 0, 0, 1100, 1101, 5, 111, 0, 0, 1101, 1102, 5, 110, 0, 0, 1102, 1103, 5, 110, 0, 0, 1103, 1104, 5, 101, 0, 0, 1104, 1105, 5, 99, 0, 0, 1105, 1106, 5, 116, 0, 0, 1106, 204, 1, 0, 0, 0, 1107, 1108, 5, 99, 0, 0, 1108, 1109, 5, 97, 0, 0, 1109, 1110, 5, 108, 0, 0, 1110, 1111, 5, 108, 0, 0, 1111, 206, 1, 0, 0, 0, 1112, 1113, 5, 119, 0, 0, 1113, 1114, 5, 97, 0, 0, 1114, 1115, 5, 116, 0, 0, 1115, 1116, 5, 99, 0, 0, 1116, 1117, 5, 104, 0, 0, 1117, 1118, 5, 45, 0, 0, 1118, 1119, 5, 115, 0, 0, 1119, 1120, 5, 116, 0, 0, 1120, 1121, 5, 97, 0, 0, 1121, 1122, 5, 114, 0, 0, 1122, 1123, 5, 116, 0, 0, 1123, 208, 1, 0, 0, 0, 1124, 1125, 5, 119, 0, 0, 1125, 1126, 5, 97, 0, 0, 1126, 1127, 5, 116, 0, 0, 1127, 1128, 5, 99, 0, 0, 1128, 1129, 5, 104, 0, 0, 1129, 1130, 5, 45, 0, 0, 1130, 1131, 5, 115, 0, 0, 1131, 1132, 5, 116, 0, 0, 1132, 1133, 5, 111, 0, 0, 1133, 1134, 5, 112, 0, 0, 1134, 210, 1, 0, 0, 0, 1135, 1136, 5, 115, 0, 0, 1136, 1137, 5, 117, 0, 0, 1137, 1138, 5, 98, 0, 0, 1138, 1139, 5, 115, 0, 0, 1139, 1140, 5, 99, 0, 0, 1140, 1141, 5, 114, 0, 0, 1141, 1142, 5, 105, 0, 0, 1142, 1143, 5, 98, 0, 0, 1143, 1144, 5, 101, 0, 0, 1144, 212, 1, 0, 0, 0, 1145, 1146, 5, 117, 0, 0, 1146, 1147, 5, 110, 0, 0, 1147, 1148, 5, 115, 0, 0, 1148, 1149, 5, 117, 0, 0, 1149, 1150, 5, 98, 0, 0, 1150, 1151, 5, 115, 0, 0, 1151, 1152, 5, 99, 0, 0, 1152, 1153, 5, 114, 0, 0, 1153, 1154, 5, 105, 0, 0, 1154, 1155, 5, 98, 0, 0, 1155, 1156, 5, 101, 0, 0, 1156, 214, 1, 0, 0, 0, 1157, 1158, 5, 114, 0, 0, 1158, 1159, 5, 101, 0, 0, 1159, 1160, 5, 103, 0, 0, 1160, 1161, 5, 105, 0, 0, 1161, 1162, 5, 115, 0, 0, 1162, 1163, 5, 116, 0, 0, 1163, 1164, 5, 101, 0, 0, 1164, 1165, 5, 114, 0, 0, 1165, 216, 1, 0, 0, 0, 1166, 1167, 5, 99, 0, 0, 1167, 1168, 5, 114, 0, 0, 1168, 1169, 5, 100, 0, 0, 1169, 1170, 5, 116, 0, 0, 1170, 218, 1, 0, 0, 0, 1171, 1172, 5, 111, 0, 0, 1172, 1173, 5, 112, 0, 0, 1173, 1174, 5, 116, 0, 0, 1174, 1175, 5, 105, 0, 0, 1175, 1176, 5, 111, 0, 0, 1176, 1177, 5, 110, 0, 0, 1177, 1178, 5, 97, 0, 0, 1178, 1179, 5, 108, 0, 0, 1179, 1180, 5, 45, 0, 0, 1180, 1181, 5, 111, 0, 0, 1181, 1182, 5, 110, 0, 0, 1182, 1183, 5, 101, 0, 0, 1183, 220, 1, 0, 0, 0, 1184, 1185, 5, 101, 0, 0, 1185, 1186, 5, 120, 0, 0, 1186, 1187, 5, 97, 0, 0, 1187, 1188, 5, 99, 0, 0, 1188, 1189, 5, 116, 0, 0, 1189, 1190, 5, 108, 0, 0, 1190, 1191, 5, 121, 0, 0, 1191, 1192, 5, 45, 0, 0, 1192, 1193, 5, 111, 0, 0, 1193, 1194, 5, 110, 0, 0, 1194, 1195, 5, 101, 0, 0, 1195, 222, 1, 0, 0, 0, 1196, 1197, 5, 109, 0, 0, 1197, 1198, 5, 97, 0, 0, 1198, 1199, 5, 110, 0, 0, 1199, 1200, 5, 121, 0, 0, 1200, 1201, 5, 45, 0, 0, 1201, 1202, 5, 117, 0, 0, 1202, 1203, 5, 110, 0, 0, 1203, 1204, 5, 105, 0, 0, 1204, 1205, 5, 113, 0, 0, 1205, 1206, 5, 117, 0, 0, 1206, 1207, 5, 101, 0, 0, 1207, 224, 1, 0, 0, 0, 1208, 1209, 5, 109, 0, 0, 1209, 1210, 5, 97, 0, 0, 1210, 1211, 5, 110, 0, 0, 1211, 1212, 5, 121, 0, 0, 1212, 226, 1, 0, 0, 0, 1213, 1214, 5, 111, 0, 0, 1214, 1215, 5, 114, 0, 0, 1215, 1216, 5, 100, 0, 0, 1216, 1217, 5, 101, 0, 0, 1217, 1218, 5, 114, 0, 0, 1218, 1219, 5, 101, 0, 0, 1219, 1220, 5, 100, 0, 0, 1220, 228, 1, 0, 0, 0, 1221, 1222, 5, 117, 0, 0, 1222, 1223, 5, 110, 0, 0, 1223, 1224, 5, 105, 0, 0, 1224, 1225, 5, 116, 0, 0, 1225, 230, 1, 0, 0, 0, 1226, 1227, 5, 119, 0, 0, 1227, 1228, 5, 97, 0, 0, 1228, 1229, 5, 116, 0, 0, 1229, 1230, 5, 99, 0, 0, 1230, 1231, 5, 104, 0, 0, 1231, 1232, 5, 45, 0, 0, 1232, 1233, 5, 104, 0, 0, 1233, 1234, 5, 97, 0, 0, 1234, 1235, 5, 110, 0, 0, 1235, 1236, 5, 100, 0, 0, 1236, 1237, 5, 108, 0, 0, 1237, 1238, 5, 101, 0, 0, 1238, 232, 1, 0, 0, 0, 1239, 1240, 5, 109, 0, 0, 1240, 1241, 5, 101, 0, 0, 1241, 1242, 5, 115, 0, 0, 1242, 1243, 5, 115, 0, 0, 1243, 1244, 5, 97, 0, 0, 1244, 1245, 5, 103, 0, 0, 1245, 1246, 5, 101, 0, 0, 1246, 234, 1, 0, 0, 0, 1247, 1248, 5, 97, 0, 0, 1248, 1249, 5, 116, 0, 0, 1249, 1250, 5, 111, 0, 0, 1250, 1251, 5, 109, 0, 0, 1251, 1252, 5, 45, 0, 0, 1252, 1253, 5, 114, 0, 0, 1253, 1254, 5, 101, 0, 0, 1254, 1255, 5, 102, 0, 0, 1255, 236, 1, 0, 0, 0, 1256, 1257, 5, 105, 0, 0, 1257, 1258, 5, 110, 0, 0, 1258, 1259, 5, 116, 0, 0, 1259, 1260, 5, 101, 0, 0, 1260, 1261, 5, 114, 0, 0, 1261, 1262, 5, 102, 0, 0, 1262, 1263, 5, 97, 0, 0, 1263, 1264, 5, 99, 0, 0, 1264, 1265, 5, 101, 0, 0, 1265, 1266, 5, 45, 0, 0, 1266, 1267, 5, 114, 0, 0, 1267, 1268, 5, 101, 0, 0, 1268, 1269, 5, 102, 0, 0, 1269, 238, 1, 0, 0, 0, 1270, 1271, 5, 111, 0, 0, 1271, 1272, 5, 112, 0, 0, 1272, 1273, 5, 116, 0, 0, 1273, 1274, 5, 105, 0, 0, 1274, 1275, 5, 111, 0, 0, 1275, 1276, 5, 110, 0, 0, 1276, 1277, 5, 97, 0, 0, 1277, 1278, 5, 108, 0, 0, 1278, 240, 1, 0, 0, 0, 1279, 1280, 5, 108, 0, 0, 1280, 1281, 5, 105, 0, 0, 1281, 1282, 5, 115, 0, 0, 1282, 1283, 5, 116, 0, 0, 1283, 242, 1, 0, 0, 0, 1284, 1285, 5, 114, 0, 0, 1285, 1286, 5, 101, 0, 0, 1286, 1287, 5, 99, 0, 0, 1287, 1288, 5, 111, 0, 0, 1288, 1289, 5, 114, 0, 0, 1289, 1290, 5, 100, 0, 0, 1290, 244, 1, 0, 0, 0, 1291, 1292, 5, 98, 0, 0, 1292, 1293, 5, 111, 0, 0, 1293, 1294, 5, 111, 0, 0, 1294, 1295, 5, 108, 0, 0, 1295, 246, 1, 0, 0, 0, 1296, 1297, 5, 98, 0, 0, 1297, 1298, 5, 121, 0, 0, 1298, 1299, 5, 116, 0, 0, 1299, 1300, 5, 101, 0, 0, 1300, 1301, 5, 115, 0, 0, 1301, 248, 1, 0, 0, 0, 1302, 1303, 5, 100, 0, 0, 1303, 1304, 5, 111, 0, 0, 1304, 1305, 5, 117, 0, 0, 1305, 1306, 5, 98, 0, 0, 1306, 1307, 5, 108, 0, 0, 1307, 1308, 5, 101, 0, 0, 1308, 250, 1, 0, 0, 0, 1309, 1310, 5, 105, 0, 0, 1310, 1311, 5, 110, 0, 0, 1311, 1312, 5, 116, 0, 0, 1312, 1313, 5, 51, 0, 0, 1313, 1314, 5, 50, 0, 0, 1314, 252, 1, 0, 0, 0, 1315, 1316, 5, 105, 0, 0, 1316, 1317, 5, 110, 0, 0, 1317, 1318, 5, 116, 0, 0, 1318, 1319, 5, 54, 0, 0, 1319, 1320, 5, 52, 0, 0, 1320, 254, 1, 0, 0, 0, 1321, 1322, 5, 115, 0, 0, 1322, 1323, 5, 116, 0, 0, 1323, 1324, 5, 114, 0, 0, 1324, 1325, 5, 105, 0, 0, 1325, 1326, 5, 110, 0, 0, 1326, 1327, 5, 103, 0, 0, 1327, 256, 1, 0, 0, 0, 1328, 1329, 5, 117, 0, 0, 1329, 1330, 5, 105, 0, 0, 1330, 1331, 5, 110, 0, 0, 1331, 1332, 5, 116, 0, 0, 1332, 1333, 5, 51, 0, 0, 1333, 1334, 5, 50, 0, 0, 1334, 258, 1, 0, 0, 0, 1335, 1336, 5, 117, 0, 0, 1336, 1337, 5, 105, 0, 0, 1337, 1338, 5, 110, 0, 0, 1338, 1339, 5, 116, 0, 0, 1339, 1340, 5, 54, 0, 0, 1340, 1341, 5, 52, 0, 0, 1341, 260, 1, 0, 0, 0, 1342, 1343, 5, 116, 0, 0, 1343, 1344, 5, 114, 0, 0, 1344, 1345, 5, 117, 0, 0, 1345, 1346, 5, 101, 0, 0, 1346, 262, 1, 0, 0, 0, 1347, 1348, 5, 102, 0, 0, 1348, 1349, 5, 97, 0, 0, 1349, 1350, 5, 108, 0, 0, 1350, 1351, 5, 115, 0, 0, 1351, 1352, 5, 101, 0, 0, 1352, 264, 1, 0, 0, 0, 1353, 1354, 5, 110, 0, 0, 1354, 1355, 5, 117, 0, 0, 1355, 1356, 5, 108, 0, 0, 1356, 1357, 5, 108, 0, 0, 1357, 266, 1, 0, 0, 0, 1358, 1359, 5, 45, 0, 0, 1359, 1360, 5, 62, 0, 0, 1360, 268, 1, 0, 0, 0, 1361, 1362, 5, 58, 0, 0, 1362, 270, 1, 0, 0, 0, 1363, 1364, 5, 59, 0, 0, 1364, 272, 1, 0, 0, 0, 1365, 1366, 5, 44, 0, 0, 1366, 274, 1, 0, 0, 0, 1367, 1368, 5, 46, 0, 0, 1368, 276, 1, 0, 0, 0, 1369, 1370, 5, 123, 0, 0, 1370, 278, 1, 0, 0, 0, 1371, 1372, 5, 125, 0, 0, 1372, 280, 1, 0, 0, 0, 1373, 1374, 5, 91, 0, 0, 1374, 282, 1, 0, 0, 0, 1375, 1376, 5, 93, 0, 0, 1376, 284, 1, 0, 0, 0, 1377, 1378, 5, 40, 0, 0, 1378, 286, 1, 0, 0, 0, 1379, 1380, 5, 41, 0, 0, 1380, 288, 1, 0, 0, 0, 1381, 1382, 5, 60, 0, 0, 1382, 290, 1, 0, 0, 0, 1383, 1384, 5, 62, 0, 0, 1384, 292, 1, 0, 0, 0, 1385, 1386, 5, 38, 0, 0, 1386, 294, 1, 0, 0, 0, 1387, 1388, 5, 61, 0, 0, 1388, 296, 1, 0, 0, 0, 1389, 1391, 5, 45, 0, 0, 1390, 1389, 1, 0, 0, 0, 1390, 1391, 1, 0, 0, 0, 1391, 1393, 1, 0, 0, 0, 1392, 1394, 7, 0, 0, 0, 1393, 1392, 1, 0, 0, 0, 1394, 1395, 1, 0, 0, 0, 1395, 1393, 1, 0, 0, 0, 1395, 1396, 1, 0, 0, 0, 1396, 298, 1, 0, 0, 0, 1397, 1399, 5, 45, 0, 0, 1398, 1397, 1, 0, 0, 0, 1398, 1399, 1, 0, 0, 0, 1399, 1408, 1, 0, 0, 0, 1400, 1409, 5, 48, 0, 0, 1401, 1405, 7, 1, 0, 0, 1402, 1404, 7, 0, 0, 0, 1403, 1402, 1, 0, 0, 0, 1404, 1407, 1, 0, 0, 0, 1405, 1403, 1, 0, 0, 0, 1405, 1406, 1, 0, 0, 0, 1406, 1409, 1, 0, 0, 0, 1407, 1405, 1, 0, 0, 0, 1408, 1400, 1, 0, 0, 0, 1408, 1401, 1, 0, 0, 0, 1409, 1416, 1, 0, 0, 0, 1410, 1412, 5, 46, 0, 0, 1411, 1413, 7, 0, 0, 0, 1412, 1411, 1, 0, 0, 0, 1413, 1414, 1, 0, 0, 0, 1414, 1412, 1, 0, 0, 0, 1414, 1415, 1, 0, 0, 0, 1415, 1417, 1, 0, 0, 0, 1416, 1410, 1, 0, 0, 0, 1416, 1417, 1, 0, 0, 0, 1417, 1427, 1, 0, 0, 0, 1418, 1420, 7, 2, 0, 0, 1419, 1421, 7, 3, 0, 0, 1420, 1419, 1, 0, 0, 0, 1420, 1421, 1, 0, 0, 0, 1421, 1423, 1, 0, 0, 0, 1422, 1424, 7, 0, 0, 0, 1423, 1422, 1, 0, 0, 0, 1424, 1425, 1, 0, 0, 0, 1425, 1423, 1, 0, 0, 0, 1425, 1426, 1, 0, 0, 0, 1426, 1428, 1, 0, 0, 0, 1427, 1418, 1, 0, 0, 0, 1427, 1428, 1, 0, 0, 0, 1428, 300, 1, 0, 0, 0, 1429, 1433, 7, 4, 0, 0, 1430, 1432, 7, 5, 0, 0, 1431, 1430, 1, 0, 0, 0, 1432, 1435, 1, 0, 0, 0, 1433, 1431, 1, 0, 0, 0, 1433, 1434, 1, 0, 0, 0, 1434, 302, 1, 0, 0, 0, 1435, 1433, 1, 0, 0, 0, 1436, 1441, 5, 34, 0, 0, 1437, 1440, 3, 305, 152, 0, 1438, 1440, 8, 6, 0, 0, 1439, 1437, 1, 0, 0, 0, 1439, 1438, 1, 0, 0, 0, 1440, 1443, 1, 0, 0, 0, 1441, 1439, 1, 0, 0, 0, 1441, 1442, 1, 0, 0, 0, 1442, 1444, 1, 0, 0, 0, 1443, 1441, 1, 0, 0, 0, 1444, 1445, 5, 34, 0, 0, 1445, 304, 1, 0, 0, 0, 1446, 1454, 5, 92, 0, 0, 1447, 1455, 7, 7, 0, 0, 1448, 1449, 5, 117, 0, 0, 1449, 1450, 3, 307, 153, 0, 1450, 1451, 3, 307, 153, 0, 1451, 1452, 3, 307, 153, 0, 1452, 1453, 3, 307, 153, 0, 1453, 1455, 1, 0, 0, 0, 1454, 1447, 1, 0, 0, 0, 1454, 1448, 1, 0, 0, 0, 1455, 306, 1, 0, 0, 0, 1456, 1457, 7, 8, 0, 0, 1457, 308, 1, 0, 0, 0, 1458, 1459, 5, 47, 0, 0, 1459, 1460, 5, 47, 0, 0, 1460, 1464, 1, 0, 0, 0, 1461, 1463, 8, 9, 0, 0, 1462, 1461, 1, 0, 0, 0, 1463, 1466, 1, 0, 0, 0, 1464, 1462, 1, 0, 0, 0, 1464, 1465, 1, 0, 0, 0, 1465, 1467, 1, 0, 0, 0, 1466, 1464, 1, 0, 0, 0, 1467, 1468, 6, 154, 0, 0, 1468, 310, 1, 0, 0, 0, 1469, 1470, 5, 47, 0, 0, 1470, 1471, 5, 42, 0, 0, 1471, 1475, 1, 0, 0, 0, 1472, 1474, 9, 0, 0, 0, 1473, 1472, 1, 0, 0, 0, 1474, 1477, 1, 0, 0, 0, 1475, 1476, 1, 0, 0, 0, 1475, 1473, 1, 0, 0, 0, 1476, 1478, 1, 0, 0, 0, 1477, 1475, 1, 0, 0, 0, 1478, 1479, 5, 42, 0, 0, 1479, 1480, 5, 47, 0, 0, 1480, 1481, 1, 0, 0, 0, 1481, 1482, 6, 155, 0, 0, 1482, 312, 1, 0, 0, 0, 1483, 1485, 7, 10, 0, 0, 1484, 1483, 1, 0, 0, 0, 1485, 1486, 1, 0, 0, 0, 1486, 1484, 1, 0, 0, 0, 1486, 1487, 1, 0, 0, 0, 1487, 1488, 1, 0, 0, 0, 1488, 1489, 6, 156, 0, 0, 1489, 314, 1, 0, 0, 0, 18, 0, 1390, 1395, 1398, 1405, 1408, 1414, 1416, 1420, 1425, 1427, 1433, 1439, 1441, 1454, 1464, 1475, 1486, 1, 0, 1, 0] \ No newline at end of file +[4, 0, 156, 1498, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 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, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 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, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 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, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 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, 27, 1, 28, 1, 28, 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, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 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, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 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, 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, 45, 1, 46, 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, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 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, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 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, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 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, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 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, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 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, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 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, 70, 1, 70, 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, 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, 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, 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, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 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, 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, 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, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 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, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 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, 100, 1, 100, 1, 101, 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, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 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, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 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, 144, 1, 144, 1, 145, 1, 145, 1, 146, 1, 146, 1, 147, 1, 147, 1, 148, 1, 148, 1, 149, 3, 149, 1399, 8, 149, 1, 149, 4, 149, 1402, 8, 149, 11, 149, 12, 149, 1403, 1, 150, 3, 150, 1407, 8, 150, 1, 150, 1, 150, 1, 150, 5, 150, 1412, 8, 150, 10, 150, 12, 150, 1415, 9, 150, 3, 150, 1417, 8, 150, 1, 150, 1, 150, 4, 150, 1421, 8, 150, 11, 150, 12, 150, 1422, 3, 150, 1425, 8, 150, 1, 150, 1, 150, 3, 150, 1429, 8, 150, 1, 150, 4, 150, 1432, 8, 150, 11, 150, 12, 150, 1433, 3, 150, 1436, 8, 150, 1, 151, 1, 151, 5, 151, 1440, 8, 151, 10, 151, 12, 151, 1443, 9, 151, 1, 152, 1, 152, 1, 152, 5, 152, 1448, 8, 152, 10, 152, 12, 152, 1451, 9, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 3, 153, 1463, 8, 153, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 5, 155, 1471, 8, 155, 10, 155, 12, 155, 1474, 9, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 5, 156, 1482, 8, 156, 10, 156, 12, 156, 1485, 9, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 4, 157, 1493, 8, 157, 11, 157, 12, 157, 1494, 1, 157, 1, 157, 1, 1483, 0, 158, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 143, 287, 144, 289, 145, 291, 146, 293, 147, 295, 148, 297, 149, 299, 150, 301, 151, 303, 152, 305, 153, 307, 0, 309, 0, 311, 154, 313, 155, 315, 156, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1512, 0, 1, 1, 0, 0, 0, 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, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 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, 311, 1, 0, 0, 0, 0, 313, 1, 0, 0, 0, 0, 315, 1, 0, 0, 0, 1, 317, 1, 0, 0, 0, 3, 322, 1, 0, 0, 0, 5, 329, 1, 0, 0, 0, 7, 338, 1, 0, 0, 0, 9, 351, 1, 0, 0, 0, 11, 359, 1, 0, 0, 0, 13, 363, 1, 0, 0, 0, 15, 372, 1, 0, 0, 0, 17, 380, 1, 0, 0, 0, 19, 389, 1, 0, 0, 0, 21, 400, 1, 0, 0, 0, 23, 410, 1, 0, 0, 0, 25, 420, 1, 0, 0, 0, 27, 429, 1, 0, 0, 0, 29, 441, 1, 0, 0, 0, 31, 448, 1, 0, 0, 0, 33, 456, 1, 0, 0, 0, 35, 465, 1, 0, 0, 0, 37, 473, 1, 0, 0, 0, 39, 479, 1, 0, 0, 0, 41, 484, 1, 0, 0, 0, 43, 497, 1, 0, 0, 0, 45, 507, 1, 0, 0, 0, 47, 519, 1, 0, 0, 0, 49, 525, 1, 0, 0, 0, 51, 536, 1, 0, 0, 0, 53, 547, 1, 0, 0, 0, 55, 552, 1, 0, 0, 0, 57, 561, 1, 0, 0, 0, 59, 571, 1, 0, 0, 0, 61, 576, 1, 0, 0, 0, 63, 580, 1, 0, 0, 0, 65, 586, 1, 0, 0, 0, 67, 591, 1, 0, 0, 0, 69, 601, 1, 0, 0, 0, 71, 605, 1, 0, 0, 0, 73, 618, 1, 0, 0, 0, 75, 623, 1, 0, 0, 0, 77, 630, 1, 0, 0, 0, 79, 639, 1, 0, 0, 0, 81, 650, 1, 0, 0, 0, 83, 654, 1, 0, 0, 0, 85, 663, 1, 0, 0, 0, 87, 670, 1, 0, 0, 0, 89, 679, 1, 0, 0, 0, 91, 684, 1, 0, 0, 0, 93, 694, 1, 0, 0, 0, 95, 705, 1, 0, 0, 0, 97, 713, 1, 0, 0, 0, 99, 719, 1, 0, 0, 0, 101, 725, 1, 0, 0, 0, 103, 734, 1, 0, 0, 0, 105, 744, 1, 0, 0, 0, 107, 753, 1, 0, 0, 0, 109, 765, 1, 0, 0, 0, 111, 776, 1, 0, 0, 0, 113, 782, 1, 0, 0, 0, 115, 790, 1, 0, 0, 0, 117, 793, 1, 0, 0, 0, 119, 798, 1, 0, 0, 0, 121, 805, 1, 0, 0, 0, 123, 808, 1, 0, 0, 0, 125, 816, 1, 0, 0, 0, 127, 823, 1, 0, 0, 0, 129, 829, 1, 0, 0, 0, 131, 834, 1, 0, 0, 0, 133, 845, 1, 0, 0, 0, 135, 850, 1, 0, 0, 0, 137, 856, 1, 0, 0, 0, 139, 863, 1, 0, 0, 0, 141, 867, 1, 0, 0, 0, 143, 879, 1, 0, 0, 0, 145, 882, 1, 0, 0, 0, 147, 889, 1, 0, 0, 0, 149, 892, 1, 0, 0, 0, 151, 899, 1, 0, 0, 0, 153, 907, 1, 0, 0, 0, 155, 914, 1, 0, 0, 0, 157, 925, 1, 0, 0, 0, 159, 932, 1, 0, 0, 0, 161, 941, 1, 0, 0, 0, 163, 956, 1, 0, 0, 0, 165, 966, 1, 0, 0, 0, 167, 976, 1, 0, 0, 0, 169, 989, 1, 0, 0, 0, 171, 995, 1, 0, 0, 0, 173, 1012, 1, 0, 0, 0, 175, 1015, 1, 0, 0, 0, 177, 1019, 1, 0, 0, 0, 179, 1024, 1, 0, 0, 0, 181, 1030, 1, 0, 0, 0, 183, 1039, 1, 0, 0, 0, 185, 1048, 1, 0, 0, 0, 187, 1052, 1, 0, 0, 0, 189, 1056, 1, 0, 0, 0, 191, 1060, 1, 0, 0, 0, 193, 1066, 1, 0, 0, 0, 195, 1072, 1, 0, 0, 0, 197, 1077, 1, 0, 0, 0, 199, 1082, 1, 0, 0, 0, 201, 1088, 1, 0, 0, 0, 203, 1096, 1, 0, 0, 0, 205, 1104, 1, 0, 0, 0, 207, 1115, 1, 0, 0, 0, 209, 1120, 1, 0, 0, 0, 211, 1132, 1, 0, 0, 0, 213, 1143, 1, 0, 0, 0, 215, 1153, 1, 0, 0, 0, 217, 1165, 1, 0, 0, 0, 219, 1174, 1, 0, 0, 0, 221, 1179, 1, 0, 0, 0, 223, 1192, 1, 0, 0, 0, 225, 1204, 1, 0, 0, 0, 227, 1216, 1, 0, 0, 0, 229, 1221, 1, 0, 0, 0, 231, 1229, 1, 0, 0, 0, 233, 1234, 1, 0, 0, 0, 235, 1247, 1, 0, 0, 0, 237, 1255, 1, 0, 0, 0, 239, 1264, 1, 0, 0, 0, 241, 1278, 1, 0, 0, 0, 243, 1287, 1, 0, 0, 0, 245, 1292, 1, 0, 0, 0, 247, 1299, 1, 0, 0, 0, 249, 1304, 1, 0, 0, 0, 251, 1310, 1, 0, 0, 0, 253, 1317, 1, 0, 0, 0, 255, 1323, 1, 0, 0, 0, 257, 1329, 1, 0, 0, 0, 259, 1336, 1, 0, 0, 0, 261, 1343, 1, 0, 0, 0, 263, 1350, 1, 0, 0, 0, 265, 1355, 1, 0, 0, 0, 267, 1361, 1, 0, 0, 0, 269, 1366, 1, 0, 0, 0, 271, 1369, 1, 0, 0, 0, 273, 1371, 1, 0, 0, 0, 275, 1373, 1, 0, 0, 0, 277, 1375, 1, 0, 0, 0, 279, 1377, 1, 0, 0, 0, 281, 1379, 1, 0, 0, 0, 283, 1381, 1, 0, 0, 0, 285, 1383, 1, 0, 0, 0, 287, 1385, 1, 0, 0, 0, 289, 1387, 1, 0, 0, 0, 291, 1389, 1, 0, 0, 0, 293, 1391, 1, 0, 0, 0, 295, 1393, 1, 0, 0, 0, 297, 1395, 1, 0, 0, 0, 299, 1398, 1, 0, 0, 0, 301, 1406, 1, 0, 0, 0, 303, 1437, 1, 0, 0, 0, 305, 1444, 1, 0, 0, 0, 307, 1454, 1, 0, 0, 0, 309, 1464, 1, 0, 0, 0, 311, 1466, 1, 0, 0, 0, 313, 1477, 1, 0, 0, 0, 315, 1492, 1, 0, 0, 0, 317, 318, 5, 101, 0, 0, 318, 319, 5, 100, 0, 0, 319, 320, 5, 105, 0, 0, 320, 321, 5, 116, 0, 0, 321, 2, 1, 0, 0, 0, 322, 323, 5, 109, 0, 0, 323, 324, 5, 111, 0, 0, 324, 325, 5, 100, 0, 0, 325, 326, 5, 117, 0, 0, 326, 327, 5, 108, 0, 0, 327, 328, 5, 101, 0, 0, 328, 4, 1, 0, 0, 0, 329, 330, 5, 99, 0, 0, 330, 331, 5, 111, 0, 0, 331, 332, 5, 110, 0, 0, 332, 333, 5, 116, 0, 0, 333, 334, 5, 114, 0, 0, 334, 335, 5, 97, 0, 0, 335, 336, 5, 99, 0, 0, 336, 337, 5, 116, 0, 0, 337, 6, 1, 0, 0, 0, 338, 339, 5, 112, 0, 0, 339, 340, 5, 114, 0, 0, 340, 341, 5, 101, 0, 0, 341, 342, 5, 115, 0, 0, 342, 343, 5, 101, 0, 0, 343, 344, 5, 110, 0, 0, 344, 345, 5, 116, 0, 0, 345, 346, 5, 97, 0, 0, 346, 347, 5, 116, 0, 0, 347, 348, 5, 105, 0, 0, 348, 349, 5, 111, 0, 0, 349, 350, 5, 110, 0, 0, 350, 8, 1, 0, 0, 0, 351, 352, 5, 115, 0, 0, 352, 353, 5, 117, 0, 0, 353, 354, 5, 98, 0, 0, 354, 355, 5, 106, 0, 0, 355, 356, 5, 101, 0, 0, 356, 357, 5, 99, 0, 0, 357, 358, 5, 116, 0, 0, 358, 10, 1, 0, 0, 0, 359, 360, 5, 102, 0, 0, 360, 361, 5, 111, 0, 0, 361, 362, 5, 114, 0, 0, 362, 12, 1, 0, 0, 0, 363, 364, 5, 99, 0, 0, 364, 365, 5, 114, 0, 0, 365, 366, 5, 101, 0, 0, 366, 367, 5, 97, 0, 0, 367, 368, 5, 116, 0, 0, 368, 369, 5, 105, 0, 0, 369, 370, 5, 111, 0, 0, 370, 371, 5, 110, 0, 0, 371, 14, 1, 0, 0, 0, 372, 373, 5, 118, 0, 0, 373, 374, 5, 97, 0, 0, 374, 375, 5, 114, 0, 0, 375, 376, 5, 105, 0, 0, 376, 377, 5, 97, 0, 0, 377, 378, 5, 110, 0, 0, 378, 379, 5, 116, 0, 0, 379, 16, 1, 0, 0, 0, 380, 381, 5, 112, 0, 0, 381, 382, 5, 114, 0, 0, 382, 383, 5, 101, 0, 0, 383, 384, 5, 112, 0, 0, 384, 385, 5, 97, 0, 0, 385, 386, 5, 114, 0, 0, 386, 387, 5, 101, 0, 0, 387, 388, 5, 115, 0, 0, 388, 18, 1, 0, 0, 0, 389, 390, 5, 105, 0, 0, 390, 391, 5, 110, 0, 0, 391, 392, 5, 105, 0, 0, 392, 393, 5, 116, 0, 0, 393, 394, 5, 105, 0, 0, 394, 395, 5, 97, 0, 0, 395, 396, 5, 108, 0, 0, 396, 397, 5, 105, 0, 0, 397, 398, 5, 122, 0, 0, 398, 399, 5, 101, 0, 0, 399, 20, 1, 0, 0, 0, 400, 401, 5, 119, 0, 0, 401, 402, 5, 111, 0, 0, 402, 403, 5, 114, 0, 0, 403, 404, 5, 107, 0, 0, 404, 405, 5, 115, 0, 0, 405, 406, 5, 112, 0, 0, 406, 407, 5, 97, 0, 0, 407, 408, 5, 99, 0, 0, 408, 409, 5, 101, 0, 0, 409, 22, 1, 0, 0, 0, 410, 411, 5, 101, 0, 0, 411, 412, 5, 120, 0, 0, 412, 413, 5, 101, 0, 0, 413, 414, 5, 99, 0, 0, 414, 415, 5, 117, 0, 0, 415, 416, 5, 116, 0, 0, 416, 417, 5, 105, 0, 0, 417, 418, 5, 111, 0, 0, 418, 419, 5, 110, 0, 0, 419, 24, 1, 0, 0, 0, 420, 421, 5, 115, 0, 0, 421, 422, 5, 110, 0, 0, 422, 423, 5, 97, 0, 0, 423, 424, 5, 112, 0, 0, 424, 425, 5, 115, 0, 0, 425, 426, 5, 104, 0, 0, 426, 427, 5, 111, 0, 0, 427, 428, 5, 116, 0, 0, 428, 26, 1, 0, 0, 0, 429, 430, 5, 116, 0, 0, 430, 431, 5, 114, 0, 0, 431, 432, 5, 97, 0, 0, 432, 433, 5, 110, 0, 0, 433, 434, 5, 115, 0, 0, 434, 435, 5, 97, 0, 0, 435, 436, 5, 99, 0, 0, 436, 437, 5, 116, 0, 0, 437, 438, 5, 105, 0, 0, 438, 439, 5, 111, 0, 0, 439, 440, 5, 110, 0, 0, 440, 28, 1, 0, 0, 0, 441, 442, 5, 114, 0, 0, 442, 443, 5, 101, 0, 0, 443, 444, 5, 109, 0, 0, 444, 445, 5, 111, 0, 0, 445, 446, 5, 116, 0, 0, 446, 447, 5, 101, 0, 0, 447, 30, 1, 0, 0, 0, 448, 449, 5, 116, 0, 0, 449, 450, 5, 97, 0, 0, 450, 451, 5, 114, 0, 0, 451, 452, 5, 103, 0, 0, 452, 453, 5, 101, 0, 0, 453, 454, 5, 116, 0, 0, 454, 455, 5, 115, 0, 0, 455, 32, 1, 0, 0, 0, 456, 457, 5, 112, 0, 0, 457, 458, 5, 111, 0, 0, 458, 459, 5, 114, 0, 0, 459, 460, 5, 116, 0, 0, 460, 461, 5, 97, 0, 0, 461, 462, 5, 98, 0, 0, 462, 463, 5, 108, 0, 0, 463, 464, 5, 101, 0, 0, 464, 34, 1, 0, 0, 0, 465, 466, 5, 114, 0, 0, 466, 467, 5, 101, 0, 0, 467, 468, 5, 112, 0, 0, 468, 469, 5, 108, 0, 0, 469, 470, 5, 105, 0, 0, 470, 471, 5, 99, 0, 0, 471, 472, 5, 97, 0, 0, 472, 36, 1, 0, 0, 0, 473, 474, 5, 108, 0, 0, 474, 475, 5, 111, 0, 0, 475, 476, 5, 99, 0, 0, 476, 477, 5, 97, 0, 0, 477, 478, 5, 108, 0, 0, 478, 38, 1, 0, 0, 0, 479, 480, 5, 102, 0, 0, 480, 481, 5, 114, 0, 0, 481, 482, 5, 111, 0, 0, 482, 483, 5, 109, 0, 0, 483, 40, 1, 0, 0, 0, 484, 485, 5, 114, 0, 0, 485, 486, 5, 101, 0, 0, 486, 487, 5, 115, 0, 0, 487, 488, 5, 117, 0, 0, 488, 489, 5, 108, 0, 0, 489, 490, 5, 116, 0, 0, 490, 491, 5, 45, 0, 0, 491, 492, 5, 98, 0, 0, 492, 493, 5, 121, 0, 0, 493, 494, 5, 116, 0, 0, 494, 495, 5, 101, 0, 0, 495, 496, 5, 115, 0, 0, 496, 42, 1, 0, 0, 0, 497, 498, 5, 114, 0, 0, 498, 499, 5, 112, 0, 0, 499, 500, 5, 99, 0, 0, 500, 501, 5, 45, 0, 0, 501, 502, 5, 99, 0, 0, 502, 503, 5, 97, 0, 0, 503, 504, 5, 108, 0, 0, 504, 505, 5, 108, 0, 0, 505, 506, 5, 115, 0, 0, 506, 44, 1, 0, 0, 0, 507, 508, 5, 100, 0, 0, 508, 509, 5, 101, 0, 0, 509, 510, 5, 97, 0, 0, 510, 511, 5, 100, 0, 0, 511, 512, 5, 108, 0, 0, 512, 513, 5, 105, 0, 0, 513, 514, 5, 110, 0, 0, 514, 515, 5, 101, 0, 0, 515, 516, 5, 45, 0, 0, 516, 517, 5, 109, 0, 0, 517, 518, 5, 115, 0, 0, 518, 46, 1, 0, 0, 0, 519, 520, 5, 113, 0, 0, 520, 521, 5, 117, 0, 0, 521, 522, 5, 101, 0, 0, 522, 523, 5, 114, 0, 0, 523, 524, 5, 121, 0, 0, 524, 48, 1, 0, 0, 0, 525, 526, 5, 114, 0, 0, 526, 527, 5, 101, 0, 0, 527, 528, 5, 102, 0, 0, 528, 529, 5, 108, 0, 0, 529, 530, 5, 101, 0, 0, 530, 531, 5, 99, 0, 0, 531, 532, 5, 116, 0, 0, 532, 533, 5, 105, 0, 0, 533, 534, 5, 111, 0, 0, 534, 535, 5, 110, 0, 0, 535, 50, 1, 0, 0, 0, 536, 537, 5, 115, 0, 0, 537, 538, 5, 112, 0, 0, 538, 539, 5, 101, 0, 0, 539, 540, 5, 99, 0, 0, 540, 541, 5, 105, 0, 0, 541, 542, 5, 97, 0, 0, 542, 543, 5, 108, 0, 0, 543, 544, 5, 105, 0, 0, 544, 545, 5, 122, 0, 0, 545, 546, 5, 101, 0, 0, 546, 52, 1, 0, 0, 0, 547, 548, 5, 114, 0, 0, 548, 549, 5, 111, 0, 0, 549, 550, 5, 111, 0, 0, 550, 551, 5, 116, 0, 0, 551, 54, 1, 0, 0, 0, 552, 553, 5, 100, 0, 0, 553, 554, 5, 111, 0, 0, 554, 555, 5, 99, 0, 0, 555, 556, 5, 117, 0, 0, 556, 557, 5, 109, 0, 0, 557, 558, 5, 101, 0, 0, 558, 559, 5, 110, 0, 0, 559, 560, 5, 116, 0, 0, 560, 56, 1, 0, 0, 0, 561, 562, 5, 102, 0, 0, 562, 563, 5, 114, 0, 0, 563, 564, 5, 97, 0, 0, 564, 565, 5, 103, 0, 0, 565, 566, 5, 109, 0, 0, 566, 567, 5, 101, 0, 0, 567, 568, 5, 110, 0, 0, 568, 569, 5, 116, 0, 0, 569, 570, 5, 115, 0, 0, 570, 58, 1, 0, 0, 0, 571, 572, 5, 118, 0, 0, 572, 573, 5, 105, 0, 0, 573, 574, 5, 101, 0, 0, 574, 575, 5, 119, 0, 0, 575, 60, 1, 0, 0, 0, 576, 577, 5, 109, 0, 0, 577, 578, 5, 97, 0, 0, 578, 579, 5, 120, 0, 0, 579, 62, 1, 0, 0, 0, 580, 581, 5, 97, 0, 0, 581, 582, 5, 108, 0, 0, 582, 583, 5, 108, 0, 0, 583, 584, 5, 111, 0, 0, 584, 585, 5, 119, 0, 0, 585, 64, 1, 0, 0, 0, 586, 587, 5, 112, 0, 0, 587, 588, 5, 111, 0, 0, 588, 589, 5, 108, 0, 0, 589, 590, 5, 108, 0, 0, 590, 66, 1, 0, 0, 0, 591, 592, 5, 113, 0, 0, 592, 593, 5, 117, 0, 0, 593, 594, 5, 101, 0, 0, 594, 595, 5, 114, 0, 0, 595, 596, 5, 121, 0, 0, 596, 597, 5, 97, 0, 0, 597, 598, 5, 98, 0, 0, 598, 599, 5, 108, 0, 0, 599, 600, 5, 101, 0, 0, 600, 68, 1, 0, 0, 0, 601, 602, 5, 114, 0, 0, 602, 603, 5, 112, 0, 0, 603, 604, 5, 99, 0, 0, 604, 70, 1, 0, 0, 0, 605, 606, 5, 113, 0, 0, 606, 607, 5, 117, 0, 0, 607, 608, 5, 101, 0, 0, 608, 609, 5, 114, 0, 0, 609, 610, 5, 121, 0, 0, 610, 611, 5, 45, 0, 0, 611, 612, 5, 114, 0, 0, 612, 613, 5, 101, 0, 0, 613, 614, 5, 97, 0, 0, 614, 615, 5, 115, 0, 0, 615, 616, 5, 111, 0, 0, 616, 617, 5, 110, 0, 0, 617, 72, 1, 0, 0, 0, 618, 619, 5, 116, 0, 0, 619, 620, 5, 121, 0, 0, 620, 621, 5, 112, 0, 0, 621, 622, 5, 101, 0, 0, 622, 74, 1, 0, 0, 0, 623, 624, 5, 111, 0, 0, 624, 625, 5, 98, 0, 0, 625, 626, 5, 106, 0, 0, 626, 627, 5, 101, 0, 0, 627, 628, 5, 99, 0, 0, 628, 629, 5, 116, 0, 0, 629, 76, 1, 0, 0, 0, 630, 631, 5, 115, 0, 0, 631, 632, 5, 116, 0, 0, 632, 633, 5, 111, 0, 0, 633, 634, 5, 114, 0, 0, 634, 635, 5, 97, 0, 0, 635, 636, 5, 98, 0, 0, 636, 637, 5, 108, 0, 0, 637, 638, 5, 101, 0, 0, 638, 78, 1, 0, 0, 0, 639, 640, 5, 105, 0, 0, 640, 641, 5, 109, 0, 0, 641, 642, 5, 112, 0, 0, 642, 643, 5, 108, 0, 0, 643, 644, 5, 101, 0, 0, 644, 645, 5, 109, 0, 0, 645, 646, 5, 101, 0, 0, 646, 647, 5, 110, 0, 0, 647, 648, 5, 116, 0, 0, 648, 649, 5, 115, 0, 0, 649, 80, 1, 0, 0, 0, 650, 651, 5, 114, 0, 0, 651, 652, 5, 101, 0, 0, 652, 653, 5, 102, 0, 0, 653, 82, 1, 0, 0, 0, 654, 655, 5, 102, 0, 0, 655, 656, 5, 114, 0, 0, 656, 657, 5, 97, 0, 0, 657, 658, 5, 103, 0, 0, 658, 659, 5, 109, 0, 0, 659, 660, 5, 101, 0, 0, 660, 661, 5, 110, 0, 0, 661, 662, 5, 116, 0, 0, 662, 84, 1, 0, 0, 0, 663, 664, 5, 105, 0, 0, 664, 665, 5, 109, 0, 0, 665, 666, 5, 112, 0, 0, 666, 667, 5, 111, 0, 0, 667, 668, 5, 114, 0, 0, 668, 669, 5, 116, 0, 0, 669, 86, 1, 0, 0, 0, 670, 671, 5, 101, 0, 0, 671, 672, 5, 120, 0, 0, 672, 673, 5, 116, 0, 0, 673, 674, 5, 101, 0, 0, 674, 675, 5, 114, 0, 0, 675, 676, 5, 110, 0, 0, 676, 677, 5, 97, 0, 0, 677, 678, 5, 108, 0, 0, 678, 88, 1, 0, 0, 0, 679, 680, 5, 97, 0, 0, 680, 681, 5, 116, 0, 0, 681, 682, 5, 111, 0, 0, 682, 683, 5, 109, 0, 0, 683, 90, 1, 0, 0, 0, 684, 685, 5, 105, 0, 0, 685, 686, 5, 110, 0, 0, 686, 687, 5, 116, 0, 0, 687, 688, 5, 101, 0, 0, 688, 689, 5, 114, 0, 0, 689, 690, 5, 102, 0, 0, 690, 691, 5, 97, 0, 0, 691, 692, 5, 99, 0, 0, 692, 693, 5, 101, 0, 0, 693, 92, 1, 0, 0, 0, 694, 695, 5, 105, 0, 0, 695, 696, 5, 110, 0, 0, 696, 697, 5, 116, 0, 0, 697, 698, 5, 101, 0, 0, 698, 699, 5, 114, 0, 0, 699, 700, 5, 102, 0, 0, 700, 701, 5, 97, 0, 0, 701, 702, 5, 99, 0, 0, 702, 703, 5, 101, 0, 0, 703, 704, 5, 115, 0, 0, 704, 94, 1, 0, 0, 0, 705, 706, 5, 112, 0, 0, 706, 707, 5, 97, 0, 0, 707, 708, 5, 99, 0, 0, 708, 709, 5, 107, 0, 0, 709, 710, 5, 97, 0, 0, 710, 711, 5, 103, 0, 0, 711, 712, 5, 101, 0, 0, 712, 96, 1, 0, 0, 0, 713, 714, 5, 118, 0, 0, 714, 715, 5, 97, 0, 0, 715, 716, 5, 108, 0, 0, 716, 717, 5, 117, 0, 0, 717, 718, 5, 101, 0, 0, 718, 98, 1, 0, 0, 0, 719, 720, 5, 102, 0, 0, 720, 721, 5, 105, 0, 0, 721, 722, 5, 101, 0, 0, 722, 723, 5, 108, 0, 0, 723, 724, 5, 100, 0, 0, 724, 100, 1, 0, 0, 0, 725, 726, 5, 114, 0, 0, 726, 727, 5, 101, 0, 0, 727, 728, 5, 108, 0, 0, 728, 729, 5, 97, 0, 0, 729, 730, 5, 116, 0, 0, 730, 731, 5, 105, 0, 0, 731, 732, 5, 111, 0, 0, 732, 733, 5, 110, 0, 0, 733, 102, 1, 0, 0, 0, 734, 735, 5, 111, 0, 0, 735, 736, 5, 112, 0, 0, 736, 737, 5, 101, 0, 0, 737, 738, 5, 114, 0, 0, 738, 739, 5, 97, 0, 0, 739, 740, 5, 116, 0, 0, 740, 741, 5, 105, 0, 0, 741, 742, 5, 111, 0, 0, 742, 743, 5, 110, 0, 0, 743, 104, 1, 0, 0, 0, 744, 745, 5, 102, 0, 0, 745, 746, 5, 117, 0, 0, 746, 747, 5, 110, 0, 0, 747, 748, 5, 99, 0, 0, 748, 749, 5, 116, 0, 0, 749, 750, 5, 105, 0, 0, 750, 751, 5, 111, 0, 0, 751, 752, 5, 110, 0, 0, 752, 106, 1, 0, 0, 0, 753, 754, 5, 99, 0, 0, 754, 755, 5, 111, 0, 0, 755, 756, 5, 110, 0, 0, 756, 757, 5, 115, 0, 0, 757, 758, 5, 116, 0, 0, 758, 759, 5, 114, 0, 0, 759, 760, 5, 117, 0, 0, 760, 761, 5, 99, 0, 0, 761, 762, 5, 116, 0, 0, 762, 763, 5, 111, 0, 0, 763, 764, 5, 114, 0, 0, 764, 108, 1, 0, 0, 0, 765, 766, 5, 99, 0, 0, 766, 767, 5, 111, 0, 0, 767, 768, 5, 110, 0, 0, 768, 769, 5, 115, 0, 0, 769, 770, 5, 116, 0, 0, 770, 771, 5, 114, 0, 0, 771, 772, 5, 117, 0, 0, 772, 773, 5, 99, 0, 0, 773, 774, 5, 116, 0, 0, 774, 775, 5, 115, 0, 0, 775, 110, 1, 0, 0, 0, 776, 777, 5, 105, 0, 0, 777, 778, 5, 110, 0, 0, 778, 779, 5, 112, 0, 0, 779, 780, 5, 117, 0, 0, 780, 781, 5, 116, 0, 0, 781, 112, 1, 0, 0, 0, 782, 783, 5, 99, 0, 0, 783, 784, 5, 111, 0, 0, 784, 785, 5, 110, 0, 0, 785, 786, 5, 102, 0, 0, 786, 787, 5, 111, 0, 0, 787, 788, 5, 114, 0, 0, 788, 789, 5, 109, 0, 0, 789, 114, 1, 0, 0, 0, 790, 791, 5, 97, 0, 0, 791, 792, 5, 115, 0, 0, 792, 116, 1, 0, 0, 0, 793, 794, 5, 98, 0, 0, 794, 795, 5, 105, 0, 0, 795, 796, 5, 110, 0, 0, 796, 797, 5, 100, 0, 0, 797, 118, 1, 0, 0, 0, 798, 799, 5, 115, 0, 0, 799, 800, 5, 116, 0, 0, 800, 801, 5, 97, 0, 0, 801, 802, 5, 116, 0, 0, 802, 803, 5, 105, 0, 0, 803, 804, 5, 99, 0, 0, 804, 120, 1, 0, 0, 0, 805, 806, 5, 116, 0, 0, 806, 807, 5, 111, 0, 0, 807, 122, 1, 0, 0, 0, 808, 809, 5, 112, 0, 0, 809, 810, 5, 114, 0, 0, 810, 811, 5, 105, 0, 0, 811, 812, 5, 118, 0, 0, 812, 813, 5, 97, 0, 0, 813, 814, 5, 116, 0, 0, 814, 815, 5, 101, 0, 0, 815, 124, 1, 0, 0, 0, 816, 817, 5, 115, 0, 0, 817, 818, 5, 104, 0, 0, 818, 819, 5, 97, 0, 0, 819, 820, 5, 114, 0, 0, 820, 821, 5, 101, 0, 0, 821, 822, 5, 100, 0, 0, 822, 126, 1, 0, 0, 0, 823, 824, 5, 115, 0, 0, 824, 825, 5, 116, 0, 0, 825, 826, 5, 97, 0, 0, 826, 827, 5, 116, 0, 0, 827, 828, 5, 101, 0, 0, 828, 128, 1, 0, 0, 0, 829, 830, 5, 101, 0, 0, 830, 831, 5, 100, 0, 0, 831, 832, 5, 103, 0, 0, 832, 833, 5, 101, 0, 0, 833, 130, 1, 0, 0, 0, 834, 835, 5, 112, 0, 0, 835, 836, 5, 114, 0, 0, 836, 837, 5, 111, 0, 0, 837, 838, 5, 106, 0, 0, 838, 839, 5, 101, 0, 0, 839, 840, 5, 99, 0, 0, 840, 841, 5, 116, 0, 0, 841, 842, 5, 105, 0, 0, 842, 843, 5, 111, 0, 0, 843, 844, 5, 110, 0, 0, 844, 132, 1, 0, 0, 0, 845, 846, 5, 119, 0, 0, 846, 847, 5, 105, 0, 0, 847, 848, 5, 116, 0, 0, 848, 849, 5, 104, 0, 0, 849, 134, 1, 0, 0, 0, 850, 851, 5, 117, 0, 0, 851, 852, 5, 115, 0, 0, 852, 853, 5, 105, 0, 0, 853, 854, 5, 110, 0, 0, 854, 855, 5, 103, 0, 0, 855, 136, 1, 0, 0, 0, 856, 857, 5, 97, 0, 0, 857, 858, 5, 99, 0, 0, 858, 859, 5, 99, 0, 0, 859, 860, 5, 101, 0, 0, 860, 861, 5, 112, 0, 0, 861, 862, 5, 116, 0, 0, 862, 138, 1, 0, 0, 0, 863, 864, 5, 118, 0, 0, 864, 865, 5, 105, 0, 0, 865, 866, 5, 97, 0, 0, 866, 140, 1, 0, 0, 0, 867, 868, 5, 109, 0, 0, 868, 869, 5, 97, 0, 0, 869, 870, 5, 116, 0, 0, 870, 871, 5, 101, 0, 0, 871, 872, 5, 114, 0, 0, 872, 873, 5, 105, 0, 0, 873, 874, 5, 97, 0, 0, 874, 875, 5, 108, 0, 0, 875, 876, 5, 105, 0, 0, 876, 877, 5, 122, 0, 0, 877, 878, 5, 101, 0, 0, 878, 142, 1, 0, 0, 0, 879, 880, 5, 105, 0, 0, 880, 881, 5, 102, 0, 0, 881, 144, 1, 0, 0, 0, 882, 883, 5, 97, 0, 0, 883, 884, 5, 98, 0, 0, 884, 885, 5, 115, 0, 0, 885, 886, 5, 101, 0, 0, 886, 887, 5, 110, 0, 0, 887, 888, 5, 116, 0, 0, 888, 146, 1, 0, 0, 0, 889, 890, 5, 111, 0, 0, 890, 891, 5, 110, 0, 0, 891, 148, 1, 0, 0, 0, 892, 893, 5, 112, 0, 0, 893, 894, 5, 111, 0, 0, 894, 895, 5, 108, 0, 0, 895, 896, 5, 105, 0, 0, 896, 897, 5, 99, 0, 0, 897, 898, 5, 121, 0, 0, 898, 150, 1, 0, 0, 0, 899, 900, 5, 100, 0, 0, 900, 901, 5, 101, 0, 0, 901, 902, 5, 102, 0, 0, 902, 903, 5, 97, 0, 0, 903, 904, 5, 117, 0, 0, 904, 905, 5, 108, 0, 0, 905, 906, 5, 116, 0, 0, 906, 152, 1, 0, 0, 0, 907, 908, 5, 115, 0, 0, 908, 909, 5, 111, 0, 0, 909, 910, 5, 117, 0, 0, 910, 911, 5, 114, 0, 0, 911, 912, 5, 99, 0, 0, 912, 913, 5, 101, 0, 0, 913, 154, 1, 0, 0, 0, 914, 915, 5, 114, 0, 0, 915, 916, 5, 101, 0, 0, 916, 917, 5, 112, 0, 0, 917, 918, 5, 111, 0, 0, 918, 919, 5, 115, 0, 0, 919, 920, 5, 105, 0, 0, 920, 921, 5, 116, 0, 0, 921, 922, 5, 111, 0, 0, 922, 923, 5, 114, 0, 0, 923, 924, 5, 121, 0, 0, 924, 156, 1, 0, 0, 0, 925, 926, 5, 99, 0, 0, 926, 927, 5, 111, 0, 0, 927, 928, 5, 109, 0, 0, 928, 929, 5, 109, 0, 0, 929, 930, 5, 105, 0, 0, 930, 931, 5, 116, 0, 0, 931, 158, 1, 0, 0, 0, 932, 933, 5, 114, 0, 0, 933, 934, 5, 101, 0, 0, 934, 935, 5, 118, 0, 0, 935, 936, 5, 105, 0, 0, 936, 937, 5, 115, 0, 0, 937, 938, 5, 105, 0, 0, 938, 939, 5, 111, 0, 0, 939, 940, 5, 110, 0, 0, 940, 160, 1, 0, 0, 0, 941, 942, 5, 115, 0, 0, 942, 943, 5, 101, 0, 0, 943, 944, 5, 109, 0, 0, 944, 945, 5, 97, 0, 0, 945, 946, 5, 110, 0, 0, 946, 947, 5, 116, 0, 0, 947, 948, 5, 105, 0, 0, 948, 949, 5, 99, 0, 0, 949, 950, 5, 45, 0, 0, 950, 951, 5, 109, 0, 0, 951, 952, 5, 97, 0, 0, 952, 953, 5, 106, 0, 0, 953, 954, 5, 111, 0, 0, 954, 955, 5, 114, 0, 0, 955, 162, 1, 0, 0, 0, 956, 957, 5, 111, 0, 0, 957, 958, 5, 110, 0, 0, 958, 959, 5, 45, 0, 0, 959, 960, 5, 100, 0, 0, 960, 961, 5, 101, 0, 0, 961, 962, 5, 108, 0, 0, 962, 963, 5, 101, 0, 0, 963, 964, 5, 116, 0, 0, 964, 965, 5, 101, 0, 0, 965, 164, 1, 0, 0, 0, 966, 967, 5, 108, 0, 0, 967, 968, 5, 105, 0, 0, 968, 969, 5, 102, 0, 0, 969, 970, 5, 101, 0, 0, 970, 971, 5, 99, 0, 0, 971, 972, 5, 121, 0, 0, 972, 973, 5, 99, 0, 0, 973, 974, 5, 108, 0, 0, 974, 975, 5, 101, 0, 0, 975, 166, 1, 0, 0, 0, 976, 977, 5, 114, 0, 0, 977, 978, 5, 101, 0, 0, 978, 979, 5, 116, 0, 0, 979, 980, 5, 97, 0, 0, 980, 981, 5, 105, 0, 0, 981, 982, 5, 110, 0, 0, 982, 983, 5, 45, 0, 0, 983, 984, 5, 111, 0, 0, 984, 985, 5, 116, 0, 0, 985, 986, 5, 104, 0, 0, 986, 987, 5, 101, 0, 0, 987, 988, 5, 114, 0, 0, 988, 168, 1, 0, 0, 0, 989, 990, 5, 107, 0, 0, 990, 991, 5, 101, 0, 0, 991, 992, 5, 121, 0, 0, 992, 993, 5, 101, 0, 0, 993, 994, 5, 100, 0, 0, 994, 170, 1, 0, 0, 0, 995, 996, 5, 112, 0, 0, 996, 997, 5, 117, 0, 0, 997, 998, 5, 98, 0, 0, 998, 999, 5, 108, 0, 0, 999, 1000, 5, 105, 0, 0, 1000, 1001, 5, 99, 0, 0, 1001, 1002, 5, 45, 0, 0, 1002, 1003, 5, 116, 0, 0, 1003, 1004, 5, 114, 0, 0, 1004, 1005, 5, 97, 0, 0, 1005, 1006, 5, 118, 0, 0, 1006, 1007, 5, 101, 0, 0, 1007, 1008, 5, 114, 0, 0, 1008, 1009, 5, 115, 0, 0, 1009, 1010, 5, 97, 0, 0, 1010, 1011, 5, 108, 0, 0, 1011, 172, 1, 0, 0, 0, 1012, 1013, 5, 105, 0, 0, 1013, 1014, 5, 100, 0, 0, 1014, 174, 1, 0, 0, 0, 1015, 1016, 5, 100, 0, 0, 1016, 1017, 5, 111, 0, 0, 1017, 1018, 5, 99, 0, 0, 1018, 176, 1, 0, 0, 0, 1019, 1020, 5, 109, 0, 0, 1020, 1021, 5, 111, 0, 0, 1021, 1022, 5, 100, 0, 0, 1022, 1023, 5, 101, 0, 0, 1023, 178, 1, 0, 0, 0, 1024, 1025, 5, 101, 0, 0, 1025, 1026, 5, 109, 0, 0, 1026, 1027, 5, 105, 0, 0, 1027, 1028, 5, 116, 0, 0, 1028, 1029, 5, 115, 0, 0, 1029, 180, 1, 0, 0, 0, 1030, 1031, 5, 114, 0, 0, 1031, 1032, 5, 101, 0, 0, 1032, 1033, 5, 99, 0, 0, 1033, 1034, 5, 101, 0, 0, 1034, 1035, 5, 105, 0, 0, 1035, 1036, 5, 118, 0, 0, 1036, 1037, 5, 101, 0, 0, 1037, 1038, 5, 114, 0, 0, 1038, 182, 1, 0, 0, 0, 1039, 1040, 5, 114, 0, 0, 1040, 1041, 5, 101, 0, 0, 1041, 1042, 5, 113, 0, 0, 1042, 1043, 5, 117, 0, 0, 1043, 1044, 5, 105, 0, 0, 1044, 1045, 5, 114, 0, 0, 1045, 1046, 5, 101, 0, 0, 1046, 1047, 5, 115, 0, 0, 1047, 184, 1, 0, 0, 0, 1048, 1049, 5, 97, 0, 0, 1049, 1050, 5, 110, 0, 0, 1050, 1051, 5, 121, 0, 0, 1051, 186, 1, 0, 0, 0, 1052, 1053, 5, 103, 0, 0, 1053, 1054, 5, 101, 0, 0, 1054, 1055, 5, 116, 0, 0, 1055, 188, 1, 0, 0, 0, 1056, 1057, 5, 115, 0, 0, 1057, 1058, 5, 101, 0, 0, 1058, 1059, 5, 116, 0, 0, 1059, 190, 1, 0, 0, 0, 1060, 1061, 5, 119, 0, 0, 1061, 1062, 5, 97, 0, 0, 1062, 1063, 5, 116, 0, 0, 1063, 1064, 5, 99, 0, 0, 1064, 1065, 5, 104, 0, 0, 1065, 192, 1, 0, 0, 0, 1066, 1067, 5, 115, 0, 0, 1067, 1068, 5, 116, 0, 0, 1068, 1069, 5, 97, 0, 0, 1069, 1070, 5, 114, 0, 0, 1070, 1071, 5, 116, 0, 0, 1071, 194, 1, 0, 0, 0, 1072, 1073, 5, 115, 0, 0, 1073, 1074, 5, 116, 0, 0, 1074, 1075, 5, 111, 0, 0, 1075, 1076, 5, 112, 0, 0, 1076, 196, 1, 0, 0, 0, 1077, 1078, 5, 114, 0, 0, 1078, 1079, 5, 101, 0, 0, 1079, 1080, 5, 97, 0, 0, 1080, 1081, 5, 100, 0, 0, 1081, 198, 1, 0, 0, 0, 1082, 1083, 5, 119, 0, 0, 1083, 1084, 5, 114, 0, 0, 1084, 1085, 5, 105, 0, 0, 1085, 1086, 5, 116, 0, 0, 1086, 1087, 5, 101, 0, 0, 1087, 200, 1, 0, 0, 0, 1088, 1089, 5, 114, 0, 0, 1089, 1090, 5, 101, 0, 0, 1090, 1091, 5, 115, 0, 0, 1091, 1092, 5, 111, 0, 0, 1092, 1093, 5, 108, 0, 0, 1093, 1094, 5, 118, 0, 0, 1094, 1095, 5, 101, 0, 0, 1095, 202, 1, 0, 0, 0, 1096, 1097, 5, 99, 0, 0, 1097, 1098, 5, 111, 0, 0, 1098, 1099, 5, 110, 0, 0, 1099, 1100, 5, 110, 0, 0, 1100, 1101, 5, 101, 0, 0, 1101, 1102, 5, 99, 0, 0, 1102, 1103, 5, 116, 0, 0, 1103, 204, 1, 0, 0, 0, 1104, 1105, 5, 100, 0, 0, 1105, 1106, 5, 105, 0, 0, 1106, 1107, 5, 115, 0, 0, 1107, 1108, 5, 99, 0, 0, 1108, 1109, 5, 111, 0, 0, 1109, 1110, 5, 110, 0, 0, 1110, 1111, 5, 110, 0, 0, 1111, 1112, 5, 101, 0, 0, 1112, 1113, 5, 99, 0, 0, 1113, 1114, 5, 116, 0, 0, 1114, 206, 1, 0, 0, 0, 1115, 1116, 5, 99, 0, 0, 1116, 1117, 5, 97, 0, 0, 1117, 1118, 5, 108, 0, 0, 1118, 1119, 5, 108, 0, 0, 1119, 208, 1, 0, 0, 0, 1120, 1121, 5, 119, 0, 0, 1121, 1122, 5, 97, 0, 0, 1122, 1123, 5, 116, 0, 0, 1123, 1124, 5, 99, 0, 0, 1124, 1125, 5, 104, 0, 0, 1125, 1126, 5, 45, 0, 0, 1126, 1127, 5, 115, 0, 0, 1127, 1128, 5, 116, 0, 0, 1128, 1129, 5, 97, 0, 0, 1129, 1130, 5, 114, 0, 0, 1130, 1131, 5, 116, 0, 0, 1131, 210, 1, 0, 0, 0, 1132, 1133, 5, 119, 0, 0, 1133, 1134, 5, 97, 0, 0, 1134, 1135, 5, 116, 0, 0, 1135, 1136, 5, 99, 0, 0, 1136, 1137, 5, 104, 0, 0, 1137, 1138, 5, 45, 0, 0, 1138, 1139, 5, 115, 0, 0, 1139, 1140, 5, 116, 0, 0, 1140, 1141, 5, 111, 0, 0, 1141, 1142, 5, 112, 0, 0, 1142, 212, 1, 0, 0, 0, 1143, 1144, 5, 115, 0, 0, 1144, 1145, 5, 117, 0, 0, 1145, 1146, 5, 98, 0, 0, 1146, 1147, 5, 115, 0, 0, 1147, 1148, 5, 99, 0, 0, 1148, 1149, 5, 114, 0, 0, 1149, 1150, 5, 105, 0, 0, 1150, 1151, 5, 98, 0, 0, 1151, 1152, 5, 101, 0, 0, 1152, 214, 1, 0, 0, 0, 1153, 1154, 5, 117, 0, 0, 1154, 1155, 5, 110, 0, 0, 1155, 1156, 5, 115, 0, 0, 1156, 1157, 5, 117, 0, 0, 1157, 1158, 5, 98, 0, 0, 1158, 1159, 5, 115, 0, 0, 1159, 1160, 5, 99, 0, 0, 1160, 1161, 5, 114, 0, 0, 1161, 1162, 5, 105, 0, 0, 1162, 1163, 5, 98, 0, 0, 1163, 1164, 5, 101, 0, 0, 1164, 216, 1, 0, 0, 0, 1165, 1166, 5, 114, 0, 0, 1166, 1167, 5, 101, 0, 0, 1167, 1168, 5, 103, 0, 0, 1168, 1169, 5, 105, 0, 0, 1169, 1170, 5, 115, 0, 0, 1170, 1171, 5, 116, 0, 0, 1171, 1172, 5, 101, 0, 0, 1172, 1173, 5, 114, 0, 0, 1173, 218, 1, 0, 0, 0, 1174, 1175, 5, 99, 0, 0, 1175, 1176, 5, 114, 0, 0, 1176, 1177, 5, 100, 0, 0, 1177, 1178, 5, 116, 0, 0, 1178, 220, 1, 0, 0, 0, 1179, 1180, 5, 111, 0, 0, 1180, 1181, 5, 112, 0, 0, 1181, 1182, 5, 116, 0, 0, 1182, 1183, 5, 105, 0, 0, 1183, 1184, 5, 111, 0, 0, 1184, 1185, 5, 110, 0, 0, 1185, 1186, 5, 97, 0, 0, 1186, 1187, 5, 108, 0, 0, 1187, 1188, 5, 45, 0, 0, 1188, 1189, 5, 111, 0, 0, 1189, 1190, 5, 110, 0, 0, 1190, 1191, 5, 101, 0, 0, 1191, 222, 1, 0, 0, 0, 1192, 1193, 5, 101, 0, 0, 1193, 1194, 5, 120, 0, 0, 1194, 1195, 5, 97, 0, 0, 1195, 1196, 5, 99, 0, 0, 1196, 1197, 5, 116, 0, 0, 1197, 1198, 5, 108, 0, 0, 1198, 1199, 5, 121, 0, 0, 1199, 1200, 5, 45, 0, 0, 1200, 1201, 5, 111, 0, 0, 1201, 1202, 5, 110, 0, 0, 1202, 1203, 5, 101, 0, 0, 1203, 224, 1, 0, 0, 0, 1204, 1205, 5, 109, 0, 0, 1205, 1206, 5, 97, 0, 0, 1206, 1207, 5, 110, 0, 0, 1207, 1208, 5, 121, 0, 0, 1208, 1209, 5, 45, 0, 0, 1209, 1210, 5, 117, 0, 0, 1210, 1211, 5, 110, 0, 0, 1211, 1212, 5, 105, 0, 0, 1212, 1213, 5, 113, 0, 0, 1213, 1214, 5, 117, 0, 0, 1214, 1215, 5, 101, 0, 0, 1215, 226, 1, 0, 0, 0, 1216, 1217, 5, 109, 0, 0, 1217, 1218, 5, 97, 0, 0, 1218, 1219, 5, 110, 0, 0, 1219, 1220, 5, 121, 0, 0, 1220, 228, 1, 0, 0, 0, 1221, 1222, 5, 111, 0, 0, 1222, 1223, 5, 114, 0, 0, 1223, 1224, 5, 100, 0, 0, 1224, 1225, 5, 101, 0, 0, 1225, 1226, 5, 114, 0, 0, 1226, 1227, 5, 101, 0, 0, 1227, 1228, 5, 100, 0, 0, 1228, 230, 1, 0, 0, 0, 1229, 1230, 5, 117, 0, 0, 1230, 1231, 5, 110, 0, 0, 1231, 1232, 5, 105, 0, 0, 1232, 1233, 5, 116, 0, 0, 1233, 232, 1, 0, 0, 0, 1234, 1235, 5, 119, 0, 0, 1235, 1236, 5, 97, 0, 0, 1236, 1237, 5, 116, 0, 0, 1237, 1238, 5, 99, 0, 0, 1238, 1239, 5, 104, 0, 0, 1239, 1240, 5, 45, 0, 0, 1240, 1241, 5, 104, 0, 0, 1241, 1242, 5, 97, 0, 0, 1242, 1243, 5, 110, 0, 0, 1243, 1244, 5, 100, 0, 0, 1244, 1245, 5, 108, 0, 0, 1245, 1246, 5, 101, 0, 0, 1246, 234, 1, 0, 0, 0, 1247, 1248, 5, 109, 0, 0, 1248, 1249, 5, 101, 0, 0, 1249, 1250, 5, 115, 0, 0, 1250, 1251, 5, 115, 0, 0, 1251, 1252, 5, 97, 0, 0, 1252, 1253, 5, 103, 0, 0, 1253, 1254, 5, 101, 0, 0, 1254, 236, 1, 0, 0, 0, 1255, 1256, 5, 97, 0, 0, 1256, 1257, 5, 116, 0, 0, 1257, 1258, 5, 111, 0, 0, 1258, 1259, 5, 109, 0, 0, 1259, 1260, 5, 45, 0, 0, 1260, 1261, 5, 114, 0, 0, 1261, 1262, 5, 101, 0, 0, 1262, 1263, 5, 102, 0, 0, 1263, 238, 1, 0, 0, 0, 1264, 1265, 5, 105, 0, 0, 1265, 1266, 5, 110, 0, 0, 1266, 1267, 5, 116, 0, 0, 1267, 1268, 5, 101, 0, 0, 1268, 1269, 5, 114, 0, 0, 1269, 1270, 5, 102, 0, 0, 1270, 1271, 5, 97, 0, 0, 1271, 1272, 5, 99, 0, 0, 1272, 1273, 5, 101, 0, 0, 1273, 1274, 5, 45, 0, 0, 1274, 1275, 5, 114, 0, 0, 1275, 1276, 5, 101, 0, 0, 1276, 1277, 5, 102, 0, 0, 1277, 240, 1, 0, 0, 0, 1278, 1279, 5, 111, 0, 0, 1279, 1280, 5, 112, 0, 0, 1280, 1281, 5, 116, 0, 0, 1281, 1282, 5, 105, 0, 0, 1282, 1283, 5, 111, 0, 0, 1283, 1284, 5, 110, 0, 0, 1284, 1285, 5, 97, 0, 0, 1285, 1286, 5, 108, 0, 0, 1286, 242, 1, 0, 0, 0, 1287, 1288, 5, 108, 0, 0, 1288, 1289, 5, 105, 0, 0, 1289, 1290, 5, 115, 0, 0, 1290, 1291, 5, 116, 0, 0, 1291, 244, 1, 0, 0, 0, 1292, 1293, 5, 114, 0, 0, 1293, 1294, 5, 101, 0, 0, 1294, 1295, 5, 99, 0, 0, 1295, 1296, 5, 111, 0, 0, 1296, 1297, 5, 114, 0, 0, 1297, 1298, 5, 100, 0, 0, 1298, 246, 1, 0, 0, 0, 1299, 1300, 5, 98, 0, 0, 1300, 1301, 5, 111, 0, 0, 1301, 1302, 5, 111, 0, 0, 1302, 1303, 5, 108, 0, 0, 1303, 248, 1, 0, 0, 0, 1304, 1305, 5, 98, 0, 0, 1305, 1306, 5, 121, 0, 0, 1306, 1307, 5, 116, 0, 0, 1307, 1308, 5, 101, 0, 0, 1308, 1309, 5, 115, 0, 0, 1309, 250, 1, 0, 0, 0, 1310, 1311, 5, 100, 0, 0, 1311, 1312, 5, 111, 0, 0, 1312, 1313, 5, 117, 0, 0, 1313, 1314, 5, 98, 0, 0, 1314, 1315, 5, 108, 0, 0, 1315, 1316, 5, 101, 0, 0, 1316, 252, 1, 0, 0, 0, 1317, 1318, 5, 105, 0, 0, 1318, 1319, 5, 110, 0, 0, 1319, 1320, 5, 116, 0, 0, 1320, 1321, 5, 51, 0, 0, 1321, 1322, 5, 50, 0, 0, 1322, 254, 1, 0, 0, 0, 1323, 1324, 5, 105, 0, 0, 1324, 1325, 5, 110, 0, 0, 1325, 1326, 5, 116, 0, 0, 1326, 1327, 5, 54, 0, 0, 1327, 1328, 5, 52, 0, 0, 1328, 256, 1, 0, 0, 0, 1329, 1330, 5, 115, 0, 0, 1330, 1331, 5, 116, 0, 0, 1331, 1332, 5, 114, 0, 0, 1332, 1333, 5, 105, 0, 0, 1333, 1334, 5, 110, 0, 0, 1334, 1335, 5, 103, 0, 0, 1335, 258, 1, 0, 0, 0, 1336, 1337, 5, 117, 0, 0, 1337, 1338, 5, 105, 0, 0, 1338, 1339, 5, 110, 0, 0, 1339, 1340, 5, 116, 0, 0, 1340, 1341, 5, 51, 0, 0, 1341, 1342, 5, 50, 0, 0, 1342, 260, 1, 0, 0, 0, 1343, 1344, 5, 117, 0, 0, 1344, 1345, 5, 105, 0, 0, 1345, 1346, 5, 110, 0, 0, 1346, 1347, 5, 116, 0, 0, 1347, 1348, 5, 54, 0, 0, 1348, 1349, 5, 52, 0, 0, 1349, 262, 1, 0, 0, 0, 1350, 1351, 5, 116, 0, 0, 1351, 1352, 5, 114, 0, 0, 1352, 1353, 5, 117, 0, 0, 1353, 1354, 5, 101, 0, 0, 1354, 264, 1, 0, 0, 0, 1355, 1356, 5, 102, 0, 0, 1356, 1357, 5, 97, 0, 0, 1357, 1358, 5, 108, 0, 0, 1358, 1359, 5, 115, 0, 0, 1359, 1360, 5, 101, 0, 0, 1360, 266, 1, 0, 0, 0, 1361, 1362, 5, 110, 0, 0, 1362, 1363, 5, 117, 0, 0, 1363, 1364, 5, 108, 0, 0, 1364, 1365, 5, 108, 0, 0, 1365, 268, 1, 0, 0, 0, 1366, 1367, 5, 45, 0, 0, 1367, 1368, 5, 62, 0, 0, 1368, 270, 1, 0, 0, 0, 1369, 1370, 5, 58, 0, 0, 1370, 272, 1, 0, 0, 0, 1371, 1372, 5, 59, 0, 0, 1372, 274, 1, 0, 0, 0, 1373, 1374, 5, 44, 0, 0, 1374, 276, 1, 0, 0, 0, 1375, 1376, 5, 46, 0, 0, 1376, 278, 1, 0, 0, 0, 1377, 1378, 5, 123, 0, 0, 1378, 280, 1, 0, 0, 0, 1379, 1380, 5, 125, 0, 0, 1380, 282, 1, 0, 0, 0, 1381, 1382, 5, 91, 0, 0, 1382, 284, 1, 0, 0, 0, 1383, 1384, 5, 93, 0, 0, 1384, 286, 1, 0, 0, 0, 1385, 1386, 5, 40, 0, 0, 1386, 288, 1, 0, 0, 0, 1387, 1388, 5, 41, 0, 0, 1388, 290, 1, 0, 0, 0, 1389, 1390, 5, 60, 0, 0, 1390, 292, 1, 0, 0, 0, 1391, 1392, 5, 62, 0, 0, 1392, 294, 1, 0, 0, 0, 1393, 1394, 5, 38, 0, 0, 1394, 296, 1, 0, 0, 0, 1395, 1396, 5, 61, 0, 0, 1396, 298, 1, 0, 0, 0, 1397, 1399, 5, 45, 0, 0, 1398, 1397, 1, 0, 0, 0, 1398, 1399, 1, 0, 0, 0, 1399, 1401, 1, 0, 0, 0, 1400, 1402, 7, 0, 0, 0, 1401, 1400, 1, 0, 0, 0, 1402, 1403, 1, 0, 0, 0, 1403, 1401, 1, 0, 0, 0, 1403, 1404, 1, 0, 0, 0, 1404, 300, 1, 0, 0, 0, 1405, 1407, 5, 45, 0, 0, 1406, 1405, 1, 0, 0, 0, 1406, 1407, 1, 0, 0, 0, 1407, 1416, 1, 0, 0, 0, 1408, 1417, 5, 48, 0, 0, 1409, 1413, 7, 1, 0, 0, 1410, 1412, 7, 0, 0, 0, 1411, 1410, 1, 0, 0, 0, 1412, 1415, 1, 0, 0, 0, 1413, 1411, 1, 0, 0, 0, 1413, 1414, 1, 0, 0, 0, 1414, 1417, 1, 0, 0, 0, 1415, 1413, 1, 0, 0, 0, 1416, 1408, 1, 0, 0, 0, 1416, 1409, 1, 0, 0, 0, 1417, 1424, 1, 0, 0, 0, 1418, 1420, 5, 46, 0, 0, 1419, 1421, 7, 0, 0, 0, 1420, 1419, 1, 0, 0, 0, 1421, 1422, 1, 0, 0, 0, 1422, 1420, 1, 0, 0, 0, 1422, 1423, 1, 0, 0, 0, 1423, 1425, 1, 0, 0, 0, 1424, 1418, 1, 0, 0, 0, 1424, 1425, 1, 0, 0, 0, 1425, 1435, 1, 0, 0, 0, 1426, 1428, 7, 2, 0, 0, 1427, 1429, 7, 3, 0, 0, 1428, 1427, 1, 0, 0, 0, 1428, 1429, 1, 0, 0, 0, 1429, 1431, 1, 0, 0, 0, 1430, 1432, 7, 0, 0, 0, 1431, 1430, 1, 0, 0, 0, 1432, 1433, 1, 0, 0, 0, 1433, 1431, 1, 0, 0, 0, 1433, 1434, 1, 0, 0, 0, 1434, 1436, 1, 0, 0, 0, 1435, 1426, 1, 0, 0, 0, 1435, 1436, 1, 0, 0, 0, 1436, 302, 1, 0, 0, 0, 1437, 1441, 7, 4, 0, 0, 1438, 1440, 7, 5, 0, 0, 1439, 1438, 1, 0, 0, 0, 1440, 1443, 1, 0, 0, 0, 1441, 1439, 1, 0, 0, 0, 1441, 1442, 1, 0, 0, 0, 1442, 304, 1, 0, 0, 0, 1443, 1441, 1, 0, 0, 0, 1444, 1449, 5, 34, 0, 0, 1445, 1448, 3, 307, 153, 0, 1446, 1448, 8, 6, 0, 0, 1447, 1445, 1, 0, 0, 0, 1447, 1446, 1, 0, 0, 0, 1448, 1451, 1, 0, 0, 0, 1449, 1447, 1, 0, 0, 0, 1449, 1450, 1, 0, 0, 0, 1450, 1452, 1, 0, 0, 0, 1451, 1449, 1, 0, 0, 0, 1452, 1453, 5, 34, 0, 0, 1453, 306, 1, 0, 0, 0, 1454, 1462, 5, 92, 0, 0, 1455, 1463, 7, 7, 0, 0, 1456, 1457, 5, 117, 0, 0, 1457, 1458, 3, 309, 154, 0, 1458, 1459, 3, 309, 154, 0, 1459, 1460, 3, 309, 154, 0, 1460, 1461, 3, 309, 154, 0, 1461, 1463, 1, 0, 0, 0, 1462, 1455, 1, 0, 0, 0, 1462, 1456, 1, 0, 0, 0, 1463, 308, 1, 0, 0, 0, 1464, 1465, 7, 8, 0, 0, 1465, 310, 1, 0, 0, 0, 1466, 1467, 5, 47, 0, 0, 1467, 1468, 5, 47, 0, 0, 1468, 1472, 1, 0, 0, 0, 1469, 1471, 8, 9, 0, 0, 1470, 1469, 1, 0, 0, 0, 1471, 1474, 1, 0, 0, 0, 1472, 1470, 1, 0, 0, 0, 1472, 1473, 1, 0, 0, 0, 1473, 1475, 1, 0, 0, 0, 1474, 1472, 1, 0, 0, 0, 1475, 1476, 6, 155, 0, 0, 1476, 312, 1, 0, 0, 0, 1477, 1478, 5, 47, 0, 0, 1478, 1479, 5, 42, 0, 0, 1479, 1483, 1, 0, 0, 0, 1480, 1482, 9, 0, 0, 0, 1481, 1480, 1, 0, 0, 0, 1482, 1485, 1, 0, 0, 0, 1483, 1484, 1, 0, 0, 0, 1483, 1481, 1, 0, 0, 0, 1484, 1486, 1, 0, 0, 0, 1485, 1483, 1, 0, 0, 0, 1486, 1487, 5, 42, 0, 0, 1487, 1488, 5, 47, 0, 0, 1488, 1489, 1, 0, 0, 0, 1489, 1490, 6, 156, 0, 0, 1490, 314, 1, 0, 0, 0, 1491, 1493, 7, 10, 0, 0, 1492, 1491, 1, 0, 0, 0, 1493, 1494, 1, 0, 0, 0, 1494, 1492, 1, 0, 0, 0, 1494, 1495, 1, 0, 0, 0, 1495, 1496, 1, 0, 0, 0, 1496, 1497, 6, 157, 0, 0, 1497, 316, 1, 0, 0, 0, 18, 0, 1398, 1403, 1406, 1413, 1416, 1422, 1424, 1428, 1433, 1435, 1441, 1447, 1449, 1462, 1472, 1483, 1494, 1, 0, 1, 0] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapabilityLexer.tokens b/src/capability-language/generated/QuixosCapabilityLexer.tokens index 548a5b5..4a012c6 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.tokens +++ b/src/capability-language/generated/QuixosCapabilityLexer.tokens @@ -47,112 +47,113 @@ INTERFACE=46 INTERFACES=47 PACKAGE=48 VALUE=49 -RELATION=50 -OPERATION=51 -FUNCTION=52 -CONSTRUCTOR=53 -CONSTRUCTS=54 -INPUT=55 -CONFORM=56 -AS=57 -BIND=58 -STATIC=59 -TO=60 -PRIVATE=61 -SHARED=62 -STATE=63 -EDGE=64 -PROJECTION=65 -WITH=66 -USING=67 -ACCEPT=68 -VIA=69 -MATERIALIZE=70 -IF=71 -ABSENT=72 -ON=73 -POLICY=74 -DEFAULT=75 -SOURCE=76 -REPOSITORY=77 -COMMIT=78 -REVISION=79 -SEMANTIC_MAJOR=80 -ON_DELETE=81 -LIFECYCLE=82 -RETAIN_OTHER=83 -KEYED=84 -PUBLIC_TRAVERSAL=85 -ID=86 -DOC=87 -MODE=88 -EMITS=89 -RECEIVER=90 -REQUIRES=91 -ANY=92 -GET=93 -SET=94 -WATCH=95 -START=96 -STOP=97 -READ=98 -WRITE=99 -RESOLVE=100 -CONNECT=101 -DISCONNECT=102 -CALL=103 -WATCH_START=104 -WATCH_STOP=105 -SUBSCRIBE=106 -UNSUBSCRIBE=107 -REGISTER=108 -CRDT=109 -OPTIONAL_ONE=110 -EXACTLY_ONE=111 -MANY_UNIQUE=112 -MANY=113 -ORDERED=114 -UNIT=115 -WATCH_HANDLE=116 -MESSAGE=117 -ATOM_REF=118 -INTERFACE_REF=119 -OPTIONAL=120 -LIST=121 -RECORD=122 -BOOL=123 -BYTES=124 -DOUBLE=125 -INT32=126 -INT64=127 -STRING=128 -UINT32=129 -UINT64=130 -TRUE=131 -FALSE=132 -NULL=133 -ARROW=134 -COLON=135 -SEMI=136 -COMMA=137 -DOT=138 -LBRACE=139 -RBRACE=140 -LBRACK=141 -RBRACK=142 -LPAREN=143 -RPAREN=144 -LT=145 -GT=146 -AMP=147 -EQUAL=148 -INTEGER=149 -JSON_NUMBER=150 -IDENTIFIER=151 -STRING_LITERAL=152 -LINE_COMMENT=153 -BLOCK_COMMENT=154 -WS=155 +FIELD=50 +RELATION=51 +OPERATION=52 +FUNCTION=53 +CONSTRUCTOR=54 +CONSTRUCTS=55 +INPUT=56 +CONFORM=57 +AS=58 +BIND=59 +STATIC=60 +TO=61 +PRIVATE=62 +SHARED=63 +STATE=64 +EDGE=65 +PROJECTION=66 +WITH=67 +USING=68 +ACCEPT=69 +VIA=70 +MATERIALIZE=71 +IF=72 +ABSENT=73 +ON=74 +POLICY=75 +DEFAULT=76 +SOURCE=77 +REPOSITORY=78 +COMMIT=79 +REVISION=80 +SEMANTIC_MAJOR=81 +ON_DELETE=82 +LIFECYCLE=83 +RETAIN_OTHER=84 +KEYED=85 +PUBLIC_TRAVERSAL=86 +ID=87 +DOC=88 +MODE=89 +EMITS=90 +RECEIVER=91 +REQUIRES=92 +ANY=93 +GET=94 +SET=95 +WATCH=96 +START=97 +STOP=98 +READ=99 +WRITE=100 +RESOLVE=101 +CONNECT=102 +DISCONNECT=103 +CALL=104 +WATCH_START=105 +WATCH_STOP=106 +SUBSCRIBE=107 +UNSUBSCRIBE=108 +REGISTER=109 +CRDT=110 +OPTIONAL_ONE=111 +EXACTLY_ONE=112 +MANY_UNIQUE=113 +MANY=114 +ORDERED=115 +UNIT=116 +WATCH_HANDLE=117 +MESSAGE=118 +ATOM_REF=119 +INTERFACE_REF=120 +OPTIONAL=121 +LIST=122 +RECORD=123 +BOOL=124 +BYTES=125 +DOUBLE=126 +INT32=127 +INT64=128 +STRING=129 +UINT32=130 +UINT64=131 +TRUE=132 +FALSE=133 +NULL=134 +ARROW=135 +COLON=136 +SEMI=137 +COMMA=138 +DOT=139 +LBRACE=140 +RBRACE=141 +LBRACK=142 +RBRACK=143 +LPAREN=144 +RPAREN=145 +LT=146 +GT=147 +AMP=148 +EQUAL=149 +INTEGER=150 +JSON_NUMBER=151 +IDENTIFIER=152 +STRING_LITERAL=153 +LINE_COMMENT=154 +BLOCK_COMMENT=155 +WS=156 'edit'=1 'module'=2 'contract'=3 @@ -202,102 +203,103 @@ WS=155 'interfaces'=47 'package'=48 'value'=49 -'relation'=50 -'operation'=51 -'function'=52 -'constructor'=53 -'constructs'=54 -'input'=55 -'conform'=56 -'as'=57 -'bind'=58 -'static'=59 -'to'=60 -'private'=61 -'shared'=62 -'state'=63 -'edge'=64 -'projection'=65 -'with'=66 -'using'=67 -'accept'=68 -'via'=69 -'materialize'=70 -'if'=71 -'absent'=72 -'on'=73 -'policy'=74 -'default'=75 -'source'=76 -'repository'=77 -'commit'=78 -'revision'=79 -'semantic-major'=80 -'on-delete'=81 -'lifecycle'=82 -'retain-other'=83 -'keyed'=84 -'public-traversal'=85 -'id'=86 -'doc'=87 -'mode'=88 -'emits'=89 -'receiver'=90 -'requires'=91 -'any'=92 -'get'=93 -'set'=94 -'watch'=95 -'start'=96 -'stop'=97 -'read'=98 -'write'=99 -'resolve'=100 -'connect'=101 -'disconnect'=102 -'call'=103 -'watch-start'=104 -'watch-stop'=105 -'subscribe'=106 -'unsubscribe'=107 -'register'=108 -'crdt'=109 -'optional-one'=110 -'exactly-one'=111 -'many-unique'=112 -'many'=113 -'ordered'=114 -'unit'=115 -'watch-handle'=116 -'message'=117 -'atom-ref'=118 -'interface-ref'=119 -'optional'=120 -'list'=121 -'record'=122 -'bool'=123 -'bytes'=124 -'double'=125 -'int32'=126 -'int64'=127 -'string'=128 -'uint32'=129 -'uint64'=130 -'true'=131 -'false'=132 -'null'=133 -'->'=134 -':'=135 -';'=136 -','=137 -'.'=138 -'{'=139 -'}'=140 -'['=141 -']'=142 -'('=143 -')'=144 -'<'=145 -'>'=146 -'&'=147 -'='=148 +'field'=50 +'relation'=51 +'operation'=52 +'function'=53 +'constructor'=54 +'constructs'=55 +'input'=56 +'conform'=57 +'as'=58 +'bind'=59 +'static'=60 +'to'=61 +'private'=62 +'shared'=63 +'state'=64 +'edge'=65 +'projection'=66 +'with'=67 +'using'=68 +'accept'=69 +'via'=70 +'materialize'=71 +'if'=72 +'absent'=73 +'on'=74 +'policy'=75 +'default'=76 +'source'=77 +'repository'=78 +'commit'=79 +'revision'=80 +'semantic-major'=81 +'on-delete'=82 +'lifecycle'=83 +'retain-other'=84 +'keyed'=85 +'public-traversal'=86 +'id'=87 +'doc'=88 +'mode'=89 +'emits'=90 +'receiver'=91 +'requires'=92 +'any'=93 +'get'=94 +'set'=95 +'watch'=96 +'start'=97 +'stop'=98 +'read'=99 +'write'=100 +'resolve'=101 +'connect'=102 +'disconnect'=103 +'call'=104 +'watch-start'=105 +'watch-stop'=106 +'subscribe'=107 +'unsubscribe'=108 +'register'=109 +'crdt'=110 +'optional-one'=111 +'exactly-one'=112 +'many-unique'=113 +'many'=114 +'ordered'=115 +'unit'=116 +'watch-handle'=117 +'message'=118 +'atom-ref'=119 +'interface-ref'=120 +'optional'=121 +'list'=122 +'record'=123 +'bool'=124 +'bytes'=125 +'double'=126 +'int32'=127 +'int64'=128 +'string'=129 +'uint32'=130 +'uint64'=131 +'true'=132 +'false'=133 +'null'=134 +'->'=135 +':'=136 +';'=137 +','=138 +'.'=139 +'{'=140 +'}'=141 +'['=142 +']'=143 +'('=144 +')'=145 +'<'=146 +'>'=147 +'&'=148 +'='=149 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.ts b/src/capability-language/generated/QuixosCapabilityLexer.ts index 0d9d2cd..0c5c6f3 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.ts +++ b/src/capability-language/generated/QuixosCapabilityLexer.ts @@ -53,112 +53,113 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public static readonly INTERFACES = 47; public static readonly PACKAGE = 48; public static readonly VALUE = 49; - public static readonly RELATION = 50; - public static readonly OPERATION = 51; - public static readonly FUNCTION = 52; - public static readonly CONSTRUCTOR = 53; - public static readonly CONSTRUCTS = 54; - public static readonly INPUT = 55; - public static readonly CONFORM = 56; - public static readonly AS = 57; - public static readonly BIND = 58; - public static readonly STATIC = 59; - public static readonly TO = 60; - public static readonly PRIVATE = 61; - public static readonly SHARED = 62; - public static readonly STATE = 63; - public static readonly EDGE = 64; - public static readonly PROJECTION = 65; - public static readonly WITH = 66; - public static readonly USING = 67; - public static readonly ACCEPT = 68; - public static readonly VIA = 69; - public static readonly MATERIALIZE = 70; - public static readonly IF = 71; - public static readonly ABSENT = 72; - public static readonly ON = 73; - public static readonly POLICY = 74; - public static readonly DEFAULT = 75; - public static readonly SOURCE = 76; - public static readonly REPOSITORY = 77; - public static readonly COMMIT = 78; - public static readonly REVISION = 79; - public static readonly SEMANTIC_MAJOR = 80; - public static readonly ON_DELETE = 81; - public static readonly LIFECYCLE = 82; - public static readonly RETAIN_OTHER = 83; - public static readonly KEYED = 84; - public static readonly PUBLIC_TRAVERSAL = 85; - public static readonly ID = 86; - public static readonly DOC = 87; - public static readonly MODE = 88; - public static readonly EMITS = 89; - public static readonly RECEIVER = 90; - public static readonly REQUIRES = 91; - public static readonly ANY = 92; - public static readonly GET = 93; - public static readonly SET = 94; - public static readonly WATCH = 95; - public static readonly START = 96; - public static readonly STOP = 97; - public static readonly READ = 98; - public static readonly WRITE = 99; - public static readonly RESOLVE = 100; - public static readonly CONNECT = 101; - public static readonly DISCONNECT = 102; - public static readonly CALL = 103; - public static readonly WATCH_START = 104; - public static readonly WATCH_STOP = 105; - public static readonly SUBSCRIBE = 106; - public static readonly UNSUBSCRIBE = 107; - public static readonly REGISTER = 108; - public static readonly CRDT = 109; - public static readonly OPTIONAL_ONE = 110; - public static readonly EXACTLY_ONE = 111; - public static readonly MANY_UNIQUE = 112; - public static readonly MANY = 113; - public static readonly ORDERED = 114; - public static readonly UNIT = 115; - public static readonly WATCH_HANDLE = 116; - public static readonly MESSAGE = 117; - public static readonly ATOM_REF = 118; - public static readonly INTERFACE_REF = 119; - public static readonly OPTIONAL = 120; - public static readonly LIST = 121; - public static readonly RECORD = 122; - public static readonly BOOL = 123; - public static readonly BYTES = 124; - public static readonly DOUBLE = 125; - public static readonly INT32 = 126; - public static readonly INT64 = 127; - public static readonly STRING = 128; - public static readonly UINT32 = 129; - public static readonly UINT64 = 130; - public static readonly TRUE = 131; - public static readonly FALSE = 132; - public static readonly NULL = 133; - public static readonly ARROW = 134; - public static readonly COLON = 135; - public static readonly SEMI = 136; - public static readonly COMMA = 137; - public static readonly DOT = 138; - public static readonly LBRACE = 139; - public static readonly RBRACE = 140; - public static readonly LBRACK = 141; - public static readonly RBRACK = 142; - public static readonly LPAREN = 143; - public static readonly RPAREN = 144; - public static readonly LT = 145; - public static readonly GT = 146; - public static readonly AMP = 147; - public static readonly EQUAL = 148; - public static readonly INTEGER = 149; - public static readonly JSON_NUMBER = 150; - public static readonly IDENTIFIER = 151; - public static readonly STRING_LITERAL = 152; - public static readonly LINE_COMMENT = 153; - public static readonly BLOCK_COMMENT = 154; - public static readonly WS = 155; + public static readonly FIELD = 50; + public static readonly RELATION = 51; + public static readonly OPERATION = 52; + public static readonly FUNCTION = 53; + public static readonly CONSTRUCTOR = 54; + public static readonly CONSTRUCTS = 55; + public static readonly INPUT = 56; + public static readonly CONFORM = 57; + public static readonly AS = 58; + public static readonly BIND = 59; + public static readonly STATIC = 60; + public static readonly TO = 61; + public static readonly PRIVATE = 62; + public static readonly SHARED = 63; + public static readonly STATE = 64; + public static readonly EDGE = 65; + public static readonly PROJECTION = 66; + public static readonly WITH = 67; + public static readonly USING = 68; + public static readonly ACCEPT = 69; + public static readonly VIA = 70; + public static readonly MATERIALIZE = 71; + public static readonly IF = 72; + public static readonly ABSENT = 73; + public static readonly ON = 74; + public static readonly POLICY = 75; + public static readonly DEFAULT = 76; + public static readonly SOURCE = 77; + public static readonly REPOSITORY = 78; + public static readonly COMMIT = 79; + public static readonly REVISION = 80; + public static readonly SEMANTIC_MAJOR = 81; + public static readonly ON_DELETE = 82; + public static readonly LIFECYCLE = 83; + public static readonly RETAIN_OTHER = 84; + public static readonly KEYED = 85; + public static readonly PUBLIC_TRAVERSAL = 86; + public static readonly ID = 87; + public static readonly DOC = 88; + public static readonly MODE = 89; + public static readonly EMITS = 90; + public static readonly RECEIVER = 91; + public static readonly REQUIRES = 92; + public static readonly ANY = 93; + public static readonly GET = 94; + public static readonly SET = 95; + public static readonly WATCH = 96; + public static readonly START = 97; + public static readonly STOP = 98; + public static readonly READ = 99; + public static readonly WRITE = 100; + public static readonly RESOLVE = 101; + public static readonly CONNECT = 102; + public static readonly DISCONNECT = 103; + public static readonly CALL = 104; + public static readonly WATCH_START = 105; + public static readonly WATCH_STOP = 106; + public static readonly SUBSCRIBE = 107; + public static readonly UNSUBSCRIBE = 108; + public static readonly REGISTER = 109; + public static readonly CRDT = 110; + public static readonly OPTIONAL_ONE = 111; + public static readonly EXACTLY_ONE = 112; + public static readonly MANY_UNIQUE = 113; + public static readonly MANY = 114; + public static readonly ORDERED = 115; + public static readonly UNIT = 116; + public static readonly WATCH_HANDLE = 117; + public static readonly MESSAGE = 118; + public static readonly ATOM_REF = 119; + public static readonly INTERFACE_REF = 120; + public static readonly OPTIONAL = 121; + public static readonly LIST = 122; + public static readonly RECORD = 123; + public static readonly BOOL = 124; + public static readonly BYTES = 125; + public static readonly DOUBLE = 126; + public static readonly INT32 = 127; + public static readonly INT64 = 128; + public static readonly STRING = 129; + public static readonly UINT32 = 130; + public static readonly UINT64 = 131; + public static readonly TRUE = 132; + public static readonly FALSE = 133; + public static readonly NULL = 134; + public static readonly ARROW = 135; + public static readonly COLON = 136; + public static readonly SEMI = 137; + public static readonly COMMA = 138; + public static readonly DOT = 139; + public static readonly LBRACE = 140; + public static readonly RBRACE = 141; + public static readonly LBRACK = 142; + public static readonly RBRACK = 143; + public static readonly LPAREN = 144; + public static readonly RPAREN = 145; + public static readonly LT = 146; + public static readonly GT = 147; + public static readonly AMP = 148; + public static readonly EQUAL = 149; + public static readonly INTEGER = 150; + public static readonly JSON_NUMBER = 151; + public static readonly IDENTIFIER = 152; + public static readonly STRING_LITERAL = 153; + public static readonly LINE_COMMENT = 154; + public static readonly BLOCK_COMMENT = 155; + public static readonly WS = 156; public static readonly channelNames = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" @@ -174,19 +175,19 @@ export class QuixosCapabilityLexer extends antlr.Lexer { "'poll'", "'queryable'", "'rpc'", "'query-reason'", "'type'", "'object'", "'storable'", "'implements'", "'ref'", "'fragment'", "'import'", "'external'", "'atom'", "'interface'", "'interfaces'", "'package'", - "'value'", "'relation'", "'operation'", "'function'", "'constructor'", - "'constructs'", "'input'", "'conform'", "'as'", "'bind'", "'static'", - "'to'", "'private'", "'shared'", "'state'", "'edge'", "'projection'", - "'with'", "'using'", "'accept'", "'via'", "'materialize'", "'if'", - "'absent'", "'on'", "'policy'", "'default'", "'source'", "'repository'", - "'commit'", "'revision'", "'semantic-major'", "'on-delete'", "'lifecycle'", - "'retain-other'", "'keyed'", "'public-traversal'", "'id'", "'doc'", - "'mode'", "'emits'", "'receiver'", "'requires'", "'any'", "'get'", - "'set'", "'watch'", "'start'", "'stop'", "'read'", "'write'", "'resolve'", - "'connect'", "'disconnect'", "'call'", "'watch-start'", "'watch-stop'", - "'subscribe'", "'unsubscribe'", "'register'", "'crdt'", "'optional-one'", - "'exactly-one'", "'many-unique'", "'many'", "'ordered'", "'unit'", - "'watch-handle'", "'message'", "'atom-ref'", "'interface-ref'", + "'value'", "'field'", "'relation'", "'operation'", "'function'", + "'constructor'", "'constructs'", "'input'", "'conform'", "'as'", + "'bind'", "'static'", "'to'", "'private'", "'shared'", "'state'", + "'edge'", "'projection'", "'with'", "'using'", "'accept'", "'via'", + "'materialize'", "'if'", "'absent'", "'on'", "'policy'", "'default'", + "'source'", "'repository'", "'commit'", "'revision'", "'semantic-major'", + "'on-delete'", "'lifecycle'", "'retain-other'", "'keyed'", "'public-traversal'", + "'id'", "'doc'", "'mode'", "'emits'", "'receiver'", "'requires'", + "'any'", "'get'", "'set'", "'watch'", "'start'", "'stop'", "'read'", + "'write'", "'resolve'", "'connect'", "'disconnect'", "'call'", "'watch-start'", + "'watch-stop'", "'subscribe'", "'unsubscribe'", "'register'", "'crdt'", + "'optional-one'", "'exactly-one'", "'many-unique'", "'many'", "'ordered'", + "'unit'", "'watch-handle'", "'message'", "'atom-ref'", "'interface-ref'", "'optional'", "'list'", "'record'", "'bool'", "'bytes'", "'double'", "'int32'", "'int64'", "'string'", "'uint32'", "'uint64'", "'true'", "'false'", "'null'", "'->'", "':'", "';'", "','", "'.'", "'{'", @@ -202,7 +203,7 @@ export class QuixosCapabilityLexer extends antlr.Lexer { "MAX", "ALLOW", "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", "OBJECT", "STORABLE", "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", - "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", + "FIELD", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", "USING", "ACCEPT", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", @@ -234,7 +235,7 @@ export class QuixosCapabilityLexer extends antlr.Lexer { "MAX", "ALLOW", "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", "OBJECT", "STORABLE", "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", - "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", + "FIELD", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", "USING", "ACCEPT", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", @@ -272,7 +273,7 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public get modeNames(): string[] { return QuixosCapabilityLexer.modeNames; } public static readonly _serializedATN: number[] = [ - 4,0,155,1490,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, + 4,0,156,1498,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, @@ -297,125 +298,126 @@ export class QuixosCapabilityLexer extends antlr.Lexer { 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,1,0,1,0,1,0,1,0, - 1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, - 1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4, - 1,4,1,4,1,4,1,4,1,4,1,4,1,5,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,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8, - 1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10, - 1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11, - 1,11,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12, - 1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13, - 1,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15, - 1,15,1,15,1,15,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,17, - 1,17,1,17,1,17,1,17,1,17,1,17,1,17,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,20,1,20,1,20,1,20, - 1,20,1,20,1,20,1,20,1,20,1,21,1,21,1,21,1,21,1,21,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,22,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24,1,24, - 1,24,1,24,1,24,1,24,1,24,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25, - 1,25,1,25,1,25,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,27,1,28,1,28,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,30,1,30,1,30,1,30,1,31,1,31,1,31, - 1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,33,1,33,1,33,1,33,1,33, - 1,33,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,35,1,35,1,35,1,35, - 1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,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,38,1,38,1,38,1,38,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39, - 1,39,1,39,1,40,1,40,1,40,1,40,1,41,1,41,1,41,1,41,1,41,1,41,1,41, - 1,41,1,41,1,42,1,42,1,42,1,42,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,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,45,1,46,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,48,1,48,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,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,50,1,50,1,51, - 1,51,1,51,1,51,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,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,53, - 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,55,1,56,1,56,1,56,1,57,1,57,1,57,1,57, - 1,57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,59,1,59,1,59,1,60,1,60, - 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,62,1,62,1,62,1,63,1,63,1,63,1,63,1,63,1,64,1,64, - 1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,65,1,65,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,67,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,69,1,69,1,70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71, - 1,71,1,72,1,72,1,72,1,73,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,74,1,75,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,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,78, - 1,78,1,79,1,79,1,79,1,79,1,79,1,79,1,79,1,79,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,80,1,80,1,80, - 1,81,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,82,1,82,1,82,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,84,1,84,1,84,1,84,1,84,1,84,1,84,1,85,1,85,1,85,1,86,1,86,1,86, - 1,86,1,87,1,87,1,87,1,87,1,87,1,88,1,88,1,88,1,88,1,88,1,88,1,89, - 1,89,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,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,95,1,95,1,95,1,95, - 1,95,1,95,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,98,1,99,1,99,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,100,1,100,1,101,1,101,1,101, - 1,101,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,1,103,1,103,1,104,1,104,1,104,1,104,1,104,1,104,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,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,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107, - 1,107,1,108,1,108,1,108,1,108,1,108,1,109,1,109,1,109,1,109,1,109, - 1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,110,1,110,1,110, - 1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,111,1,111, - 1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,112, - 1,112,1,112,1,112,1,112,1,113,1,113,1,113,1,113,1,113,1,113,1,113, - 1,113,1,114,1,114,1,114,1,114,1,114,1,115,1,115,1,115,1,115,1,115, - 1,115,1,115,1,115,1,115,1,115,1,115,1,115,1,115,1,116,1,116,1,116, - 1,116,1,116,1,116,1,116,1,116,1,117,1,117,1,117,1,117,1,117,1,117, + 2,153,7,153,2,154,7,154,2,155,7,155,2,156,7,156,2,157,7,157,1,0, + 1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2, + 1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3, + 1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,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,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8, + 1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9, + 1,9,1,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,1, + 11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1, + 12,1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1, + 13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,15,1,15,1, + 15,1,15,1,15,1,15,1,15,1,15,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1, + 16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17,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,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,21,1,21,1,21,1,21,1,21,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,22,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1, + 24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,25,1,25,1,25,1,25,1,25,1, + 25,1,25,1,25,1,25,1,25,1,25,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,27,1,28,1,28,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,30,1,30,1,30,1,30,1, + 31,1,31,1,31,1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,33,1,33,1, + 33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,35,1, + 35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,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,38,1,38,1,38,1,38,1,39,1,39,1,39,1,39,1,39,1,39,1, + 39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,41,1,41,1,41,1,41,1, + 41,1,41,1,41,1,41,1,41,1,42,1,42,1,42,1,42,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,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,45,1,46,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,48,1,48,1,48,1,48,1,48,1,48,1,49,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,50,1,51,1,51,1, + 51,1,51,1,51,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,52,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1, + 53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,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,56,1,56,1,56,1,56,1,56,1,56,1, + 56,1,56,1,57,1,57,1,57,1,58,1,58,1,58,1,58,1,58,1,59,1,59,1,59,1, + 59,1,59,1,59,1,59,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,61,1, + 61,1,61,1,62,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,64,1,64,1,64,1,64,1,64,1,65,1,65,1,65,1,65,1,65,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,68,1,68,1,68,1,68,1,68,1,68,1,68,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,70,1,70,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, + 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, + 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, + 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,79,1,79,1,80,1,80,1,80,1, + 80,1,80,1,80,1,80,1,80,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,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,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,85,1, + 85,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1, + 85,1,85,1,85,1,86,1,86,1,86,1,87,1,87,1,87,1,87,1,88,1,88,1,88,1, + 88,1,88,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,91,1,91,1,91,1,91,1, + 92,1,92,1,92,1,92,1,93,1,93,1,93,1,93,1,94,1,94,1,94,1,94,1,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,100,1,100,1,101,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,102,1,102,1,102,1,102,1,102,1,102,1,103,1,103,1,103,1,103,1,103, + 1,104,1,104,1,104,1,104,1,104,1,104,1,104,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, + 1,105,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106, + 1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107, + 1,107,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,109, + 1,109,1,109,1,109,1,109,1,110,1,110,1,110,1,110,1,110,1,110,1,110, + 1,110,1,110,1,110,1,110,1,110,1,110,1,111,1,111,1,111,1,111,1,111, + 1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,112,1,112,1,112,1,112, + 1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,113,1,113,1,113, + 1,113,1,113,1,114,1,114,1,114,1,114,1,114,1,114,1,114,1,114,1,115, + 1,115,1,115,1,115,1,115,1,116,1,116,1,116,1,116,1,116,1,116,1,116, + 1,116,1,116,1,116,1,116,1,116,1,116,1,117,1,117,1,117,1,117,1,117, 1,117,1,117,1,117,1,118,1,118,1,118,1,118,1,118,1,118,1,118,1,118, - 1,118,1,118,1,118,1,118,1,118,1,118,1,119,1,119,1,119,1,119,1,119, - 1,119,1,119,1,119,1,119,1,120,1,120,1,120,1,120,1,120,1,121,1,121, - 1,121,1,121,1,121,1,121,1,121,1,122,1,122,1,122,1,122,1,122,1,123, - 1,123,1,123,1,123,1,123,1,123,1,124,1,124,1,124,1,124,1,124,1,124, - 1,124,1,125,1,125,1,125,1,125,1,125,1,125,1,126,1,126,1,126,1,126, - 1,126,1,126,1,127,1,127,1,127,1,127,1,127,1,127,1,127,1,128,1,128, - 1,128,1,128,1,128,1,128,1,128,1,129,1,129,1,129,1,129,1,129,1,129, - 1,129,1,130,1,130,1,130,1,130,1,130,1,131,1,131,1,131,1,131,1,131, - 1,131,1,132,1,132,1,132,1,132,1,132,1,133,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,144,1,144,1,145,1,145, - 1,146,1,146,1,147,1,147,1,148,3,148,1391,8,148,1,148,4,148,1394, - 8,148,11,148,12,148,1395,1,149,3,149,1399,8,149,1,149,1,149,1,149, - 5,149,1404,8,149,10,149,12,149,1407,9,149,3,149,1409,8,149,1,149, - 1,149,4,149,1413,8,149,11,149,12,149,1414,3,149,1417,8,149,1,149, - 1,149,3,149,1421,8,149,1,149,4,149,1424,8,149,11,149,12,149,1425, - 3,149,1428,8,149,1,150,1,150,5,150,1432,8,150,10,150,12,150,1435, - 9,150,1,151,1,151,1,151,5,151,1440,8,151,10,151,12,151,1443,9,151, - 1,151,1,151,1,152,1,152,1,152,1,152,1,152,1,152,1,152,1,152,3,152, - 1455,8,152,1,153,1,153,1,154,1,154,1,154,1,154,5,154,1463,8,154, - 10,154,12,154,1466,9,154,1,154,1,154,1,155,1,155,1,155,1,155,5,155, - 1474,8,155,10,155,12,155,1477,9,155,1,155,1,155,1,155,1,155,1,155, - 1,156,4,156,1485,8,156,11,156,12,156,1486,1,156,1,156,1,1475,0,157, - 1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13, - 27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,47,24, - 49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,69,35, - 71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45,91,46, - 93,47,95,48,97,49,99,50,101,51,103,52,105,53,107,54,109,55,111,56, - 113,57,115,58,117,59,119,60,121,61,123,62,125,63,127,64,129,65,131, - 66,133,67,135,68,137,69,139,70,141,71,143,72,145,73,147,74,149,75, - 151,76,153,77,155,78,157,79,159,80,161,81,163,82,165,83,167,84,169, - 85,171,86,173,87,175,88,177,89,179,90,181,91,183,92,185,93,187,94, - 189,95,191,96,193,97,195,98,197,99,199,100,201,101,203,102,205,103, - 207,104,209,105,211,106,213,107,215,108,217,109,219,110,221,111, - 223,112,225,113,227,114,229,115,231,116,233,117,235,118,237,119, - 239,120,241,121,243,122,245,123,247,124,249,125,251,126,253,127, - 255,128,257,129,259,130,261,131,263,132,265,133,267,134,269,135, - 271,136,273,137,275,138,277,139,279,140,281,141,283,142,285,143, - 287,144,289,145,291,146,293,147,295,148,297,149,299,150,301,151, - 303,152,305,0,307,0,309,153,311,154,313,155,1,0,11,1,0,48,57,1,0, + 1,118,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119, + 1,119,1,119,1,119,1,119,1,120,1,120,1,120,1,120,1,120,1,120,1,120, + 1,120,1,120,1,121,1,121,1,121,1,121,1,121,1,122,1,122,1,122,1,122, + 1,122,1,122,1,122,1,123,1,123,1,123,1,123,1,123,1,124,1,124,1,124, + 1,124,1,124,1,124,1,125,1,125,1,125,1,125,1,125,1,125,1,125,1,126, + 1,126,1,126,1,126,1,126,1,126,1,127,1,127,1,127,1,127,1,127,1,127, + 1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,129,1,129,1,129,1,129, + 1,129,1,129,1,129,1,130,1,130,1,130,1,130,1,130,1,130,1,130,1,131, + 1,131,1,131,1,131,1,131,1,132,1,132,1,132,1,132,1,132,1,132,1,133, + 1,133,1,133,1,133,1,133,1,134,1,134,1,134,1,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,144,1,144,1,145,1,145,1,146,1,146,1,147,1,147, + 1,148,1,148,1,149,3,149,1399,8,149,1,149,4,149,1402,8,149,11,149, + 12,149,1403,1,150,3,150,1407,8,150,1,150,1,150,1,150,5,150,1412, + 8,150,10,150,12,150,1415,9,150,3,150,1417,8,150,1,150,1,150,4,150, + 1421,8,150,11,150,12,150,1422,3,150,1425,8,150,1,150,1,150,3,150, + 1429,8,150,1,150,4,150,1432,8,150,11,150,12,150,1433,3,150,1436, + 8,150,1,151,1,151,5,151,1440,8,151,10,151,12,151,1443,9,151,1,152, + 1,152,1,152,5,152,1448,8,152,10,152,12,152,1451,9,152,1,152,1,152, + 1,153,1,153,1,153,1,153,1,153,1,153,1,153,1,153,3,153,1463,8,153, + 1,154,1,154,1,155,1,155,1,155,1,155,5,155,1471,8,155,10,155,12,155, + 1474,9,155,1,155,1,155,1,156,1,156,1,156,1,156,5,156,1482,8,156, + 10,156,12,156,1485,9,156,1,156,1,156,1,156,1,156,1,156,1,157,4,157, + 1493,8,157,11,157,12,157,1494,1,157,1,157,1,1483,0,158,1,1,3,2,5, + 3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13,27,14,29,15, + 31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,47,24,49,25,51,26, + 53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,69,35,71,36,73,37, + 75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45,91,46,93,47,95,48, + 97,49,99,50,101,51,103,52,105,53,107,54,109,55,111,56,113,57,115, + 58,117,59,119,60,121,61,123,62,125,63,127,64,129,65,131,66,133,67, + 135,68,137,69,139,70,141,71,143,72,145,73,147,74,149,75,151,76,153, + 77,155,78,157,79,159,80,161,81,163,82,165,83,167,84,169,85,171,86, + 173,87,175,88,177,89,179,90,181,91,183,92,185,93,187,94,189,95,191, + 96,193,97,195,98,197,99,199,100,201,101,203,102,205,103,207,104, + 209,105,211,106,213,107,215,108,217,109,219,110,221,111,223,112, + 225,113,227,114,229,115,231,116,233,117,235,118,237,119,239,120, + 241,121,243,122,245,123,247,124,249,125,251,126,253,127,255,128, + 257,129,259,130,261,131,263,132,265,133,267,134,269,135,271,136, + 273,137,275,138,277,139,279,140,281,141,283,142,285,143,287,144, + 289,145,291,146,293,147,295,148,297,149,299,150,301,151,303,152, + 305,153,307,0,309,0,311,154,313,155,315,156,1,0,11,1,0,48,57,1,0, 49,57,2,0,69,69,101,101,2,0,43,43,45,45,3,0,65,90,95,95,97,122,4, 0,48,57,65,90,95,95,97,122,4,0,10,10,13,13,34,34,92,92,8,0,34,34, 47,47,92,92,98,98,102,102,110,110,114,114,116,116,3,0,48,57,65,70, - 97,102,2,0,10,10,13,13,3,0,9,10,13,13,32,32,1504,0,1,1,0,0,0,0,3, + 97,102,2,0,10,10,13,13,3,0,9,10,13,13,32,32,1512,0,1,1,0,0,0,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, @@ -447,381 +449,383 @@ export class QuixosCapabilityLexer extends antlr.Lexer { 269,1,0,0,0,0,271,1,0,0,0,0,273,1,0,0,0,0,275,1,0,0,0,0,277,1,0, 0,0,0,279,1,0,0,0,0,281,1,0,0,0,0,283,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,309,1, - 0,0,0,0,311,1,0,0,0,0,313,1,0,0,0,1,315,1,0,0,0,3,320,1,0,0,0,5, - 327,1,0,0,0,7,336,1,0,0,0,9,349,1,0,0,0,11,357,1,0,0,0,13,361,1, - 0,0,0,15,370,1,0,0,0,17,378,1,0,0,0,19,387,1,0,0,0,21,398,1,0,0, - 0,23,408,1,0,0,0,25,418,1,0,0,0,27,427,1,0,0,0,29,439,1,0,0,0,31, - 446,1,0,0,0,33,454,1,0,0,0,35,463,1,0,0,0,37,471,1,0,0,0,39,477, - 1,0,0,0,41,482,1,0,0,0,43,495,1,0,0,0,45,505,1,0,0,0,47,517,1,0, - 0,0,49,523,1,0,0,0,51,534,1,0,0,0,53,545,1,0,0,0,55,550,1,0,0,0, - 57,559,1,0,0,0,59,569,1,0,0,0,61,574,1,0,0,0,63,578,1,0,0,0,65,584, - 1,0,0,0,67,589,1,0,0,0,69,599,1,0,0,0,71,603,1,0,0,0,73,616,1,0, - 0,0,75,621,1,0,0,0,77,628,1,0,0,0,79,637,1,0,0,0,81,648,1,0,0,0, - 83,652,1,0,0,0,85,661,1,0,0,0,87,668,1,0,0,0,89,677,1,0,0,0,91,682, - 1,0,0,0,93,692,1,0,0,0,95,703,1,0,0,0,97,711,1,0,0,0,99,717,1,0, - 0,0,101,726,1,0,0,0,103,736,1,0,0,0,105,745,1,0,0,0,107,757,1,0, - 0,0,109,768,1,0,0,0,111,774,1,0,0,0,113,782,1,0,0,0,115,785,1,0, - 0,0,117,790,1,0,0,0,119,797,1,0,0,0,121,800,1,0,0,0,123,808,1,0, - 0,0,125,815,1,0,0,0,127,821,1,0,0,0,129,826,1,0,0,0,131,837,1,0, - 0,0,133,842,1,0,0,0,135,848,1,0,0,0,137,855,1,0,0,0,139,859,1,0, - 0,0,141,871,1,0,0,0,143,874,1,0,0,0,145,881,1,0,0,0,147,884,1,0, - 0,0,149,891,1,0,0,0,151,899,1,0,0,0,153,906,1,0,0,0,155,917,1,0, - 0,0,157,924,1,0,0,0,159,933,1,0,0,0,161,948,1,0,0,0,163,958,1,0, - 0,0,165,968,1,0,0,0,167,981,1,0,0,0,169,987,1,0,0,0,171,1004,1,0, - 0,0,173,1007,1,0,0,0,175,1011,1,0,0,0,177,1016,1,0,0,0,179,1022, - 1,0,0,0,181,1031,1,0,0,0,183,1040,1,0,0,0,185,1044,1,0,0,0,187,1048, - 1,0,0,0,189,1052,1,0,0,0,191,1058,1,0,0,0,193,1064,1,0,0,0,195,1069, - 1,0,0,0,197,1074,1,0,0,0,199,1080,1,0,0,0,201,1088,1,0,0,0,203,1096, - 1,0,0,0,205,1107,1,0,0,0,207,1112,1,0,0,0,209,1124,1,0,0,0,211,1135, - 1,0,0,0,213,1145,1,0,0,0,215,1157,1,0,0,0,217,1166,1,0,0,0,219,1171, - 1,0,0,0,221,1184,1,0,0,0,223,1196,1,0,0,0,225,1208,1,0,0,0,227,1213, - 1,0,0,0,229,1221,1,0,0,0,231,1226,1,0,0,0,233,1239,1,0,0,0,235,1247, - 1,0,0,0,237,1256,1,0,0,0,239,1270,1,0,0,0,241,1279,1,0,0,0,243,1284, - 1,0,0,0,245,1291,1,0,0,0,247,1296,1,0,0,0,249,1302,1,0,0,0,251,1309, - 1,0,0,0,253,1315,1,0,0,0,255,1321,1,0,0,0,257,1328,1,0,0,0,259,1335, - 1,0,0,0,261,1342,1,0,0,0,263,1347,1,0,0,0,265,1353,1,0,0,0,267,1358, - 1,0,0,0,269,1361,1,0,0,0,271,1363,1,0,0,0,273,1365,1,0,0,0,275,1367, - 1,0,0,0,277,1369,1,0,0,0,279,1371,1,0,0,0,281,1373,1,0,0,0,283,1375, - 1,0,0,0,285,1377,1,0,0,0,287,1379,1,0,0,0,289,1381,1,0,0,0,291,1383, - 1,0,0,0,293,1385,1,0,0,0,295,1387,1,0,0,0,297,1390,1,0,0,0,299,1398, - 1,0,0,0,301,1429,1,0,0,0,303,1436,1,0,0,0,305,1446,1,0,0,0,307,1456, - 1,0,0,0,309,1458,1,0,0,0,311,1469,1,0,0,0,313,1484,1,0,0,0,315,316, - 5,101,0,0,316,317,5,100,0,0,317,318,5,105,0,0,318,319,5,116,0,0, - 319,2,1,0,0,0,320,321,5,109,0,0,321,322,5,111,0,0,322,323,5,100, - 0,0,323,324,5,117,0,0,324,325,5,108,0,0,325,326,5,101,0,0,326,4, - 1,0,0,0,327,328,5,99,0,0,328,329,5,111,0,0,329,330,5,110,0,0,330, - 331,5,116,0,0,331,332,5,114,0,0,332,333,5,97,0,0,333,334,5,99,0, - 0,334,335,5,116,0,0,335,6,1,0,0,0,336,337,5,112,0,0,337,338,5,114, - 0,0,338,339,5,101,0,0,339,340,5,115,0,0,340,341,5,101,0,0,341,342, - 5,110,0,0,342,343,5,116,0,0,343,344,5,97,0,0,344,345,5,116,0,0,345, - 346,5,105,0,0,346,347,5,111,0,0,347,348,5,110,0,0,348,8,1,0,0,0, - 349,350,5,115,0,0,350,351,5,117,0,0,351,352,5,98,0,0,352,353,5,106, - 0,0,353,354,5,101,0,0,354,355,5,99,0,0,355,356,5,116,0,0,356,10, - 1,0,0,0,357,358,5,102,0,0,358,359,5,111,0,0,359,360,5,114,0,0,360, - 12,1,0,0,0,361,362,5,99,0,0,362,363,5,114,0,0,363,364,5,101,0,0, - 364,365,5,97,0,0,365,366,5,116,0,0,366,367,5,105,0,0,367,368,5,111, - 0,0,368,369,5,110,0,0,369,14,1,0,0,0,370,371,5,118,0,0,371,372,5, - 97,0,0,372,373,5,114,0,0,373,374,5,105,0,0,374,375,5,97,0,0,375, - 376,5,110,0,0,376,377,5,116,0,0,377,16,1,0,0,0,378,379,5,112,0,0, - 379,380,5,114,0,0,380,381,5,101,0,0,381,382,5,112,0,0,382,383,5, - 97,0,0,383,384,5,114,0,0,384,385,5,101,0,0,385,386,5,115,0,0,386, - 18,1,0,0,0,387,388,5,105,0,0,388,389,5,110,0,0,389,390,5,105,0,0, - 390,391,5,116,0,0,391,392,5,105,0,0,392,393,5,97,0,0,393,394,5,108, - 0,0,394,395,5,105,0,0,395,396,5,122,0,0,396,397,5,101,0,0,397,20, - 1,0,0,0,398,399,5,119,0,0,399,400,5,111,0,0,400,401,5,114,0,0,401, - 402,5,107,0,0,402,403,5,115,0,0,403,404,5,112,0,0,404,405,5,97,0, - 0,405,406,5,99,0,0,406,407,5,101,0,0,407,22,1,0,0,0,408,409,5,101, - 0,0,409,410,5,120,0,0,410,411,5,101,0,0,411,412,5,99,0,0,412,413, - 5,117,0,0,413,414,5,116,0,0,414,415,5,105,0,0,415,416,5,111,0,0, - 416,417,5,110,0,0,417,24,1,0,0,0,418,419,5,115,0,0,419,420,5,110, - 0,0,420,421,5,97,0,0,421,422,5,112,0,0,422,423,5,115,0,0,423,424, - 5,104,0,0,424,425,5,111,0,0,425,426,5,116,0,0,426,26,1,0,0,0,427, - 428,5,116,0,0,428,429,5,114,0,0,429,430,5,97,0,0,430,431,5,110,0, - 0,431,432,5,115,0,0,432,433,5,97,0,0,433,434,5,99,0,0,434,435,5, - 116,0,0,435,436,5,105,0,0,436,437,5,111,0,0,437,438,5,110,0,0,438, - 28,1,0,0,0,439,440,5,114,0,0,440,441,5,101,0,0,441,442,5,109,0,0, - 442,443,5,111,0,0,443,444,5,116,0,0,444,445,5,101,0,0,445,30,1,0, - 0,0,446,447,5,116,0,0,447,448,5,97,0,0,448,449,5,114,0,0,449,450, - 5,103,0,0,450,451,5,101,0,0,451,452,5,116,0,0,452,453,5,115,0,0, - 453,32,1,0,0,0,454,455,5,112,0,0,455,456,5,111,0,0,456,457,5,114, - 0,0,457,458,5,116,0,0,458,459,5,97,0,0,459,460,5,98,0,0,460,461, - 5,108,0,0,461,462,5,101,0,0,462,34,1,0,0,0,463,464,5,114,0,0,464, - 465,5,101,0,0,465,466,5,112,0,0,466,467,5,108,0,0,467,468,5,105, - 0,0,468,469,5,99,0,0,469,470,5,97,0,0,470,36,1,0,0,0,471,472,5,108, - 0,0,472,473,5,111,0,0,473,474,5,99,0,0,474,475,5,97,0,0,475,476, - 5,108,0,0,476,38,1,0,0,0,477,478,5,102,0,0,478,479,5,114,0,0,479, - 480,5,111,0,0,480,481,5,109,0,0,481,40,1,0,0,0,482,483,5,114,0,0, - 483,484,5,101,0,0,484,485,5,115,0,0,485,486,5,117,0,0,486,487,5, - 108,0,0,487,488,5,116,0,0,488,489,5,45,0,0,489,490,5,98,0,0,490, - 491,5,121,0,0,491,492,5,116,0,0,492,493,5,101,0,0,493,494,5,115, - 0,0,494,42,1,0,0,0,495,496,5,114,0,0,496,497,5,112,0,0,497,498,5, - 99,0,0,498,499,5,45,0,0,499,500,5,99,0,0,500,501,5,97,0,0,501,502, - 5,108,0,0,502,503,5,108,0,0,503,504,5,115,0,0,504,44,1,0,0,0,505, - 506,5,100,0,0,506,507,5,101,0,0,507,508,5,97,0,0,508,509,5,100,0, - 0,509,510,5,108,0,0,510,511,5,105,0,0,511,512,5,110,0,0,512,513, - 5,101,0,0,513,514,5,45,0,0,514,515,5,109,0,0,515,516,5,115,0,0,516, - 46,1,0,0,0,517,518,5,113,0,0,518,519,5,117,0,0,519,520,5,101,0,0, - 520,521,5,114,0,0,521,522,5,121,0,0,522,48,1,0,0,0,523,524,5,114, - 0,0,524,525,5,101,0,0,525,526,5,102,0,0,526,527,5,108,0,0,527,528, - 5,101,0,0,528,529,5,99,0,0,529,530,5,116,0,0,530,531,5,105,0,0,531, - 532,5,111,0,0,532,533,5,110,0,0,533,50,1,0,0,0,534,535,5,115,0,0, - 535,536,5,112,0,0,536,537,5,101,0,0,537,538,5,99,0,0,538,539,5,105, - 0,0,539,540,5,97,0,0,540,541,5,108,0,0,541,542,5,105,0,0,542,543, - 5,122,0,0,543,544,5,101,0,0,544,52,1,0,0,0,545,546,5,114,0,0,546, - 547,5,111,0,0,547,548,5,111,0,0,548,549,5,116,0,0,549,54,1,0,0,0, - 550,551,5,100,0,0,551,552,5,111,0,0,552,553,5,99,0,0,553,554,5,117, - 0,0,554,555,5,109,0,0,555,556,5,101,0,0,556,557,5,110,0,0,557,558, - 5,116,0,0,558,56,1,0,0,0,559,560,5,102,0,0,560,561,5,114,0,0,561, - 562,5,97,0,0,562,563,5,103,0,0,563,564,5,109,0,0,564,565,5,101,0, - 0,565,566,5,110,0,0,566,567,5,116,0,0,567,568,5,115,0,0,568,58,1, - 0,0,0,569,570,5,118,0,0,570,571,5,105,0,0,571,572,5,101,0,0,572, - 573,5,119,0,0,573,60,1,0,0,0,574,575,5,109,0,0,575,576,5,97,0,0, - 576,577,5,120,0,0,577,62,1,0,0,0,578,579,5,97,0,0,579,580,5,108, - 0,0,580,581,5,108,0,0,581,582,5,111,0,0,582,583,5,119,0,0,583,64, - 1,0,0,0,584,585,5,112,0,0,585,586,5,111,0,0,586,587,5,108,0,0,587, - 588,5,108,0,0,588,66,1,0,0,0,589,590,5,113,0,0,590,591,5,117,0,0, - 591,592,5,101,0,0,592,593,5,114,0,0,593,594,5,121,0,0,594,595,5, - 97,0,0,595,596,5,98,0,0,596,597,5,108,0,0,597,598,5,101,0,0,598, - 68,1,0,0,0,599,600,5,114,0,0,600,601,5,112,0,0,601,602,5,99,0,0, - 602,70,1,0,0,0,603,604,5,113,0,0,604,605,5,117,0,0,605,606,5,101, - 0,0,606,607,5,114,0,0,607,608,5,121,0,0,608,609,5,45,0,0,609,610, - 5,114,0,0,610,611,5,101,0,0,611,612,5,97,0,0,612,613,5,115,0,0,613, - 614,5,111,0,0,614,615,5,110,0,0,615,72,1,0,0,0,616,617,5,116,0,0, - 617,618,5,121,0,0,618,619,5,112,0,0,619,620,5,101,0,0,620,74,1,0, - 0,0,621,622,5,111,0,0,622,623,5,98,0,0,623,624,5,106,0,0,624,625, - 5,101,0,0,625,626,5,99,0,0,626,627,5,116,0,0,627,76,1,0,0,0,628, - 629,5,115,0,0,629,630,5,116,0,0,630,631,5,111,0,0,631,632,5,114, - 0,0,632,633,5,97,0,0,633,634,5,98,0,0,634,635,5,108,0,0,635,636, - 5,101,0,0,636,78,1,0,0,0,637,638,5,105,0,0,638,639,5,109,0,0,639, - 640,5,112,0,0,640,641,5,108,0,0,641,642,5,101,0,0,642,643,5,109, - 0,0,643,644,5,101,0,0,644,645,5,110,0,0,645,646,5,116,0,0,646,647, - 5,115,0,0,647,80,1,0,0,0,648,649,5,114,0,0,649,650,5,101,0,0,650, - 651,5,102,0,0,651,82,1,0,0,0,652,653,5,102,0,0,653,654,5,114,0,0, - 654,655,5,97,0,0,655,656,5,103,0,0,656,657,5,109,0,0,657,658,5,101, - 0,0,658,659,5,110,0,0,659,660,5,116,0,0,660,84,1,0,0,0,661,662,5, - 105,0,0,662,663,5,109,0,0,663,664,5,112,0,0,664,665,5,111,0,0,665, - 666,5,114,0,0,666,667,5,116,0,0,667,86,1,0,0,0,668,669,5,101,0,0, - 669,670,5,120,0,0,670,671,5,116,0,0,671,672,5,101,0,0,672,673,5, - 114,0,0,673,674,5,110,0,0,674,675,5,97,0,0,675,676,5,108,0,0,676, - 88,1,0,0,0,677,678,5,97,0,0,678,679,5,116,0,0,679,680,5,111,0,0, - 680,681,5,109,0,0,681,90,1,0,0,0,682,683,5,105,0,0,683,684,5,110, - 0,0,684,685,5,116,0,0,685,686,5,101,0,0,686,687,5,114,0,0,687,688, - 5,102,0,0,688,689,5,97,0,0,689,690,5,99,0,0,690,691,5,101,0,0,691, - 92,1,0,0,0,692,693,5,105,0,0,693,694,5,110,0,0,694,695,5,116,0,0, - 695,696,5,101,0,0,696,697,5,114,0,0,697,698,5,102,0,0,698,699,5, - 97,0,0,699,700,5,99,0,0,700,701,5,101,0,0,701,702,5,115,0,0,702, - 94,1,0,0,0,703,704,5,112,0,0,704,705,5,97,0,0,705,706,5,99,0,0,706, - 707,5,107,0,0,707,708,5,97,0,0,708,709,5,103,0,0,709,710,5,101,0, - 0,710,96,1,0,0,0,711,712,5,118,0,0,712,713,5,97,0,0,713,714,5,108, - 0,0,714,715,5,117,0,0,715,716,5,101,0,0,716,98,1,0,0,0,717,718,5, - 114,0,0,718,719,5,101,0,0,719,720,5,108,0,0,720,721,5,97,0,0,721, - 722,5,116,0,0,722,723,5,105,0,0,723,724,5,111,0,0,724,725,5,110, - 0,0,725,100,1,0,0,0,726,727,5,111,0,0,727,728,5,112,0,0,728,729, - 5,101,0,0,729,730,5,114,0,0,730,731,5,97,0,0,731,732,5,116,0,0,732, - 733,5,105,0,0,733,734,5,111,0,0,734,735,5,110,0,0,735,102,1,0,0, - 0,736,737,5,102,0,0,737,738,5,117,0,0,738,739,5,110,0,0,739,740, - 5,99,0,0,740,741,5,116,0,0,741,742,5,105,0,0,742,743,5,111,0,0,743, - 744,5,110,0,0,744,104,1,0,0,0,745,746,5,99,0,0,746,747,5,111,0,0, - 747,748,5,110,0,0,748,749,5,115,0,0,749,750,5,116,0,0,750,751,5, - 114,0,0,751,752,5,117,0,0,752,753,5,99,0,0,753,754,5,116,0,0,754, - 755,5,111,0,0,755,756,5,114,0,0,756,106,1,0,0,0,757,758,5,99,0,0, - 758,759,5,111,0,0,759,760,5,110,0,0,760,761,5,115,0,0,761,762,5, - 116,0,0,762,763,5,114,0,0,763,764,5,117,0,0,764,765,5,99,0,0,765, - 766,5,116,0,0,766,767,5,115,0,0,767,108,1,0,0,0,768,769,5,105,0, - 0,769,770,5,110,0,0,770,771,5,112,0,0,771,772,5,117,0,0,772,773, - 5,116,0,0,773,110,1,0,0,0,774,775,5,99,0,0,775,776,5,111,0,0,776, - 777,5,110,0,0,777,778,5,102,0,0,778,779,5,111,0,0,779,780,5,114, - 0,0,780,781,5,109,0,0,781,112,1,0,0,0,782,783,5,97,0,0,783,784,5, - 115,0,0,784,114,1,0,0,0,785,786,5,98,0,0,786,787,5,105,0,0,787,788, - 5,110,0,0,788,789,5,100,0,0,789,116,1,0,0,0,790,791,5,115,0,0,791, - 792,5,116,0,0,792,793,5,97,0,0,793,794,5,116,0,0,794,795,5,105,0, - 0,795,796,5,99,0,0,796,118,1,0,0,0,797,798,5,116,0,0,798,799,5,111, - 0,0,799,120,1,0,0,0,800,801,5,112,0,0,801,802,5,114,0,0,802,803, - 5,105,0,0,803,804,5,118,0,0,804,805,5,97,0,0,805,806,5,116,0,0,806, - 807,5,101,0,0,807,122,1,0,0,0,808,809,5,115,0,0,809,810,5,104,0, - 0,810,811,5,97,0,0,811,812,5,114,0,0,812,813,5,101,0,0,813,814,5, - 100,0,0,814,124,1,0,0,0,815,816,5,115,0,0,816,817,5,116,0,0,817, - 818,5,97,0,0,818,819,5,116,0,0,819,820,5,101,0,0,820,126,1,0,0,0, - 821,822,5,101,0,0,822,823,5,100,0,0,823,824,5,103,0,0,824,825,5, - 101,0,0,825,128,1,0,0,0,826,827,5,112,0,0,827,828,5,114,0,0,828, - 829,5,111,0,0,829,830,5,106,0,0,830,831,5,101,0,0,831,832,5,99,0, - 0,832,833,5,116,0,0,833,834,5,105,0,0,834,835,5,111,0,0,835,836, - 5,110,0,0,836,130,1,0,0,0,837,838,5,119,0,0,838,839,5,105,0,0,839, - 840,5,116,0,0,840,841,5,104,0,0,841,132,1,0,0,0,842,843,5,117,0, - 0,843,844,5,115,0,0,844,845,5,105,0,0,845,846,5,110,0,0,846,847, - 5,103,0,0,847,134,1,0,0,0,848,849,5,97,0,0,849,850,5,99,0,0,850, - 851,5,99,0,0,851,852,5,101,0,0,852,853,5,112,0,0,853,854,5,116,0, - 0,854,136,1,0,0,0,855,856,5,118,0,0,856,857,5,105,0,0,857,858,5, - 97,0,0,858,138,1,0,0,0,859,860,5,109,0,0,860,861,5,97,0,0,861,862, - 5,116,0,0,862,863,5,101,0,0,863,864,5,114,0,0,864,865,5,105,0,0, - 865,866,5,97,0,0,866,867,5,108,0,0,867,868,5,105,0,0,868,869,5,122, - 0,0,869,870,5,101,0,0,870,140,1,0,0,0,871,872,5,105,0,0,872,873, - 5,102,0,0,873,142,1,0,0,0,874,875,5,97,0,0,875,876,5,98,0,0,876, - 877,5,115,0,0,877,878,5,101,0,0,878,879,5,110,0,0,879,880,5,116, - 0,0,880,144,1,0,0,0,881,882,5,111,0,0,882,883,5,110,0,0,883,146, - 1,0,0,0,884,885,5,112,0,0,885,886,5,111,0,0,886,887,5,108,0,0,887, - 888,5,105,0,0,888,889,5,99,0,0,889,890,5,121,0,0,890,148,1,0,0,0, - 891,892,5,100,0,0,892,893,5,101,0,0,893,894,5,102,0,0,894,895,5, - 97,0,0,895,896,5,117,0,0,896,897,5,108,0,0,897,898,5,116,0,0,898, - 150,1,0,0,0,899,900,5,115,0,0,900,901,5,111,0,0,901,902,5,117,0, - 0,902,903,5,114,0,0,903,904,5,99,0,0,904,905,5,101,0,0,905,152,1, - 0,0,0,906,907,5,114,0,0,907,908,5,101,0,0,908,909,5,112,0,0,909, - 910,5,111,0,0,910,911,5,115,0,0,911,912,5,105,0,0,912,913,5,116, - 0,0,913,914,5,111,0,0,914,915,5,114,0,0,915,916,5,121,0,0,916,154, - 1,0,0,0,917,918,5,99,0,0,918,919,5,111,0,0,919,920,5,109,0,0,920, - 921,5,109,0,0,921,922,5,105,0,0,922,923,5,116,0,0,923,156,1,0,0, - 0,924,925,5,114,0,0,925,926,5,101,0,0,926,927,5,118,0,0,927,928, - 5,105,0,0,928,929,5,115,0,0,929,930,5,105,0,0,930,931,5,111,0,0, - 931,932,5,110,0,0,932,158,1,0,0,0,933,934,5,115,0,0,934,935,5,101, - 0,0,935,936,5,109,0,0,936,937,5,97,0,0,937,938,5,110,0,0,938,939, - 5,116,0,0,939,940,5,105,0,0,940,941,5,99,0,0,941,942,5,45,0,0,942, - 943,5,109,0,0,943,944,5,97,0,0,944,945,5,106,0,0,945,946,5,111,0, - 0,946,947,5,114,0,0,947,160,1,0,0,0,948,949,5,111,0,0,949,950,5, - 110,0,0,950,951,5,45,0,0,951,952,5,100,0,0,952,953,5,101,0,0,953, - 954,5,108,0,0,954,955,5,101,0,0,955,956,5,116,0,0,956,957,5,101, - 0,0,957,162,1,0,0,0,958,959,5,108,0,0,959,960,5,105,0,0,960,961, - 5,102,0,0,961,962,5,101,0,0,962,963,5,99,0,0,963,964,5,121,0,0,964, - 965,5,99,0,0,965,966,5,108,0,0,966,967,5,101,0,0,967,164,1,0,0,0, - 968,969,5,114,0,0,969,970,5,101,0,0,970,971,5,116,0,0,971,972,5, - 97,0,0,972,973,5,105,0,0,973,974,5,110,0,0,974,975,5,45,0,0,975, - 976,5,111,0,0,976,977,5,116,0,0,977,978,5,104,0,0,978,979,5,101, - 0,0,979,980,5,114,0,0,980,166,1,0,0,0,981,982,5,107,0,0,982,983, - 5,101,0,0,983,984,5,121,0,0,984,985,5,101,0,0,985,986,5,100,0,0, - 986,168,1,0,0,0,987,988,5,112,0,0,988,989,5,117,0,0,989,990,5,98, - 0,0,990,991,5,108,0,0,991,992,5,105,0,0,992,993,5,99,0,0,993,994, - 5,45,0,0,994,995,5,116,0,0,995,996,5,114,0,0,996,997,5,97,0,0,997, - 998,5,118,0,0,998,999,5,101,0,0,999,1000,5,114,0,0,1000,1001,5,115, - 0,0,1001,1002,5,97,0,0,1002,1003,5,108,0,0,1003,170,1,0,0,0,1004, - 1005,5,105,0,0,1005,1006,5,100,0,0,1006,172,1,0,0,0,1007,1008,5, - 100,0,0,1008,1009,5,111,0,0,1009,1010,5,99,0,0,1010,174,1,0,0,0, - 1011,1012,5,109,0,0,1012,1013,5,111,0,0,1013,1014,5,100,0,0,1014, - 1015,5,101,0,0,1015,176,1,0,0,0,1016,1017,5,101,0,0,1017,1018,5, - 109,0,0,1018,1019,5,105,0,0,1019,1020,5,116,0,0,1020,1021,5,115, - 0,0,1021,178,1,0,0,0,1022,1023,5,114,0,0,1023,1024,5,101,0,0,1024, - 1025,5,99,0,0,1025,1026,5,101,0,0,1026,1027,5,105,0,0,1027,1028, - 5,118,0,0,1028,1029,5,101,0,0,1029,1030,5,114,0,0,1030,180,1,0,0, - 0,1031,1032,5,114,0,0,1032,1033,5,101,0,0,1033,1034,5,113,0,0,1034, - 1035,5,117,0,0,1035,1036,5,105,0,0,1036,1037,5,114,0,0,1037,1038, - 5,101,0,0,1038,1039,5,115,0,0,1039,182,1,0,0,0,1040,1041,5,97,0, - 0,1041,1042,5,110,0,0,1042,1043,5,121,0,0,1043,184,1,0,0,0,1044, - 1045,5,103,0,0,1045,1046,5,101,0,0,1046,1047,5,116,0,0,1047,186, - 1,0,0,0,1048,1049,5,115,0,0,1049,1050,5,101,0,0,1050,1051,5,116, - 0,0,1051,188,1,0,0,0,1052,1053,5,119,0,0,1053,1054,5,97,0,0,1054, - 1055,5,116,0,0,1055,1056,5,99,0,0,1056,1057,5,104,0,0,1057,190,1, - 0,0,0,1058,1059,5,115,0,0,1059,1060,5,116,0,0,1060,1061,5,97,0,0, - 1061,1062,5,114,0,0,1062,1063,5,116,0,0,1063,192,1,0,0,0,1064,1065, - 5,115,0,0,1065,1066,5,116,0,0,1066,1067,5,111,0,0,1067,1068,5,112, - 0,0,1068,194,1,0,0,0,1069,1070,5,114,0,0,1070,1071,5,101,0,0,1071, - 1072,5,97,0,0,1072,1073,5,100,0,0,1073,196,1,0,0,0,1074,1075,5,119, - 0,0,1075,1076,5,114,0,0,1076,1077,5,105,0,0,1077,1078,5,116,0,0, - 1078,1079,5,101,0,0,1079,198,1,0,0,0,1080,1081,5,114,0,0,1081,1082, - 5,101,0,0,1082,1083,5,115,0,0,1083,1084,5,111,0,0,1084,1085,5,108, - 0,0,1085,1086,5,118,0,0,1086,1087,5,101,0,0,1087,200,1,0,0,0,1088, - 1089,5,99,0,0,1089,1090,5,111,0,0,1090,1091,5,110,0,0,1091,1092, - 5,110,0,0,1092,1093,5,101,0,0,1093,1094,5,99,0,0,1094,1095,5,116, - 0,0,1095,202,1,0,0,0,1096,1097,5,100,0,0,1097,1098,5,105,0,0,1098, - 1099,5,115,0,0,1099,1100,5,99,0,0,1100,1101,5,111,0,0,1101,1102, - 5,110,0,0,1102,1103,5,110,0,0,1103,1104,5,101,0,0,1104,1105,5,99, - 0,0,1105,1106,5,116,0,0,1106,204,1,0,0,0,1107,1108,5,99,0,0,1108, - 1109,5,97,0,0,1109,1110,5,108,0,0,1110,1111,5,108,0,0,1111,206,1, - 0,0,0,1112,1113,5,119,0,0,1113,1114,5,97,0,0,1114,1115,5,116,0,0, - 1115,1116,5,99,0,0,1116,1117,5,104,0,0,1117,1118,5,45,0,0,1118,1119, - 5,115,0,0,1119,1120,5,116,0,0,1120,1121,5,97,0,0,1121,1122,5,114, - 0,0,1122,1123,5,116,0,0,1123,208,1,0,0,0,1124,1125,5,119,0,0,1125, - 1126,5,97,0,0,1126,1127,5,116,0,0,1127,1128,5,99,0,0,1128,1129,5, - 104,0,0,1129,1130,5,45,0,0,1130,1131,5,115,0,0,1131,1132,5,116,0, - 0,1132,1133,5,111,0,0,1133,1134,5,112,0,0,1134,210,1,0,0,0,1135, - 1136,5,115,0,0,1136,1137,5,117,0,0,1137,1138,5,98,0,0,1138,1139, - 5,115,0,0,1139,1140,5,99,0,0,1140,1141,5,114,0,0,1141,1142,5,105, - 0,0,1142,1143,5,98,0,0,1143,1144,5,101,0,0,1144,212,1,0,0,0,1145, - 1146,5,117,0,0,1146,1147,5,110,0,0,1147,1148,5,115,0,0,1148,1149, - 5,117,0,0,1149,1150,5,98,0,0,1150,1151,5,115,0,0,1151,1152,5,99, - 0,0,1152,1153,5,114,0,0,1153,1154,5,105,0,0,1154,1155,5,98,0,0,1155, - 1156,5,101,0,0,1156,214,1,0,0,0,1157,1158,5,114,0,0,1158,1159,5, - 101,0,0,1159,1160,5,103,0,0,1160,1161,5,105,0,0,1161,1162,5,115, - 0,0,1162,1163,5,116,0,0,1163,1164,5,101,0,0,1164,1165,5,114,0,0, - 1165,216,1,0,0,0,1166,1167,5,99,0,0,1167,1168,5,114,0,0,1168,1169, - 5,100,0,0,1169,1170,5,116,0,0,1170,218,1,0,0,0,1171,1172,5,111,0, - 0,1172,1173,5,112,0,0,1173,1174,5,116,0,0,1174,1175,5,105,0,0,1175, - 1176,5,111,0,0,1176,1177,5,110,0,0,1177,1178,5,97,0,0,1178,1179, - 5,108,0,0,1179,1180,5,45,0,0,1180,1181,5,111,0,0,1181,1182,5,110, - 0,0,1182,1183,5,101,0,0,1183,220,1,0,0,0,1184,1185,5,101,0,0,1185, - 1186,5,120,0,0,1186,1187,5,97,0,0,1187,1188,5,99,0,0,1188,1189,5, - 116,0,0,1189,1190,5,108,0,0,1190,1191,5,121,0,0,1191,1192,5,45,0, - 0,1192,1193,5,111,0,0,1193,1194,5,110,0,0,1194,1195,5,101,0,0,1195, - 222,1,0,0,0,1196,1197,5,109,0,0,1197,1198,5,97,0,0,1198,1199,5,110, - 0,0,1199,1200,5,121,0,0,1200,1201,5,45,0,0,1201,1202,5,117,0,0,1202, - 1203,5,110,0,0,1203,1204,5,105,0,0,1204,1205,5,113,0,0,1205,1206, - 5,117,0,0,1206,1207,5,101,0,0,1207,224,1,0,0,0,1208,1209,5,109,0, - 0,1209,1210,5,97,0,0,1210,1211,5,110,0,0,1211,1212,5,121,0,0,1212, - 226,1,0,0,0,1213,1214,5,111,0,0,1214,1215,5,114,0,0,1215,1216,5, - 100,0,0,1216,1217,5,101,0,0,1217,1218,5,114,0,0,1218,1219,5,101, - 0,0,1219,1220,5,100,0,0,1220,228,1,0,0,0,1221,1222,5,117,0,0,1222, - 1223,5,110,0,0,1223,1224,5,105,0,0,1224,1225,5,116,0,0,1225,230, - 1,0,0,0,1226,1227,5,119,0,0,1227,1228,5,97,0,0,1228,1229,5,116,0, - 0,1229,1230,5,99,0,0,1230,1231,5,104,0,0,1231,1232,5,45,0,0,1232, - 1233,5,104,0,0,1233,1234,5,97,0,0,1234,1235,5,110,0,0,1235,1236, - 5,100,0,0,1236,1237,5,108,0,0,1237,1238,5,101,0,0,1238,232,1,0,0, - 0,1239,1240,5,109,0,0,1240,1241,5,101,0,0,1241,1242,5,115,0,0,1242, - 1243,5,115,0,0,1243,1244,5,97,0,0,1244,1245,5,103,0,0,1245,1246, - 5,101,0,0,1246,234,1,0,0,0,1247,1248,5,97,0,0,1248,1249,5,116,0, - 0,1249,1250,5,111,0,0,1250,1251,5,109,0,0,1251,1252,5,45,0,0,1252, - 1253,5,114,0,0,1253,1254,5,101,0,0,1254,1255,5,102,0,0,1255,236, - 1,0,0,0,1256,1257,5,105,0,0,1257,1258,5,110,0,0,1258,1259,5,116, - 0,0,1259,1260,5,101,0,0,1260,1261,5,114,0,0,1261,1262,5,102,0,0, - 1262,1263,5,97,0,0,1263,1264,5,99,0,0,1264,1265,5,101,0,0,1265,1266, - 5,45,0,0,1266,1267,5,114,0,0,1267,1268,5,101,0,0,1268,1269,5,102, - 0,0,1269,238,1,0,0,0,1270,1271,5,111,0,0,1271,1272,5,112,0,0,1272, - 1273,5,116,0,0,1273,1274,5,105,0,0,1274,1275,5,111,0,0,1275,1276, - 5,110,0,0,1276,1277,5,97,0,0,1277,1278,5,108,0,0,1278,240,1,0,0, - 0,1279,1280,5,108,0,0,1280,1281,5,105,0,0,1281,1282,5,115,0,0,1282, - 1283,5,116,0,0,1283,242,1,0,0,0,1284,1285,5,114,0,0,1285,1286,5, - 101,0,0,1286,1287,5,99,0,0,1287,1288,5,111,0,0,1288,1289,5,114,0, - 0,1289,1290,5,100,0,0,1290,244,1,0,0,0,1291,1292,5,98,0,0,1292,1293, - 5,111,0,0,1293,1294,5,111,0,0,1294,1295,5,108,0,0,1295,246,1,0,0, - 0,1296,1297,5,98,0,0,1297,1298,5,121,0,0,1298,1299,5,116,0,0,1299, - 1300,5,101,0,0,1300,1301,5,115,0,0,1301,248,1,0,0,0,1302,1303,5, - 100,0,0,1303,1304,5,111,0,0,1304,1305,5,117,0,0,1305,1306,5,98,0, - 0,1306,1307,5,108,0,0,1307,1308,5,101,0,0,1308,250,1,0,0,0,1309, - 1310,5,105,0,0,1310,1311,5,110,0,0,1311,1312,5,116,0,0,1312,1313, - 5,51,0,0,1313,1314,5,50,0,0,1314,252,1,0,0,0,1315,1316,5,105,0,0, - 1316,1317,5,110,0,0,1317,1318,5,116,0,0,1318,1319,5,54,0,0,1319, - 1320,5,52,0,0,1320,254,1,0,0,0,1321,1322,5,115,0,0,1322,1323,5,116, - 0,0,1323,1324,5,114,0,0,1324,1325,5,105,0,0,1325,1326,5,110,0,0, - 1326,1327,5,103,0,0,1327,256,1,0,0,0,1328,1329,5,117,0,0,1329,1330, - 5,105,0,0,1330,1331,5,110,0,0,1331,1332,5,116,0,0,1332,1333,5,51, - 0,0,1333,1334,5,50,0,0,1334,258,1,0,0,0,1335,1336,5,117,0,0,1336, - 1337,5,105,0,0,1337,1338,5,110,0,0,1338,1339,5,116,0,0,1339,1340, - 5,54,0,0,1340,1341,5,52,0,0,1341,260,1,0,0,0,1342,1343,5,116,0,0, - 1343,1344,5,114,0,0,1344,1345,5,117,0,0,1345,1346,5,101,0,0,1346, - 262,1,0,0,0,1347,1348,5,102,0,0,1348,1349,5,97,0,0,1349,1350,5,108, - 0,0,1350,1351,5,115,0,0,1351,1352,5,101,0,0,1352,264,1,0,0,0,1353, - 1354,5,110,0,0,1354,1355,5,117,0,0,1355,1356,5,108,0,0,1356,1357, - 5,108,0,0,1357,266,1,0,0,0,1358,1359,5,45,0,0,1359,1360,5,62,0,0, - 1360,268,1,0,0,0,1361,1362,5,58,0,0,1362,270,1,0,0,0,1363,1364,5, - 59,0,0,1364,272,1,0,0,0,1365,1366,5,44,0,0,1366,274,1,0,0,0,1367, - 1368,5,46,0,0,1368,276,1,0,0,0,1369,1370,5,123,0,0,1370,278,1,0, - 0,0,1371,1372,5,125,0,0,1372,280,1,0,0,0,1373,1374,5,91,0,0,1374, - 282,1,0,0,0,1375,1376,5,93,0,0,1376,284,1,0,0,0,1377,1378,5,40,0, - 0,1378,286,1,0,0,0,1379,1380,5,41,0,0,1380,288,1,0,0,0,1381,1382, - 5,60,0,0,1382,290,1,0,0,0,1383,1384,5,62,0,0,1384,292,1,0,0,0,1385, - 1386,5,38,0,0,1386,294,1,0,0,0,1387,1388,5,61,0,0,1388,296,1,0,0, - 0,1389,1391,5,45,0,0,1390,1389,1,0,0,0,1390,1391,1,0,0,0,1391,1393, - 1,0,0,0,1392,1394,7,0,0,0,1393,1392,1,0,0,0,1394,1395,1,0,0,0,1395, - 1393,1,0,0,0,1395,1396,1,0,0,0,1396,298,1,0,0,0,1397,1399,5,45,0, - 0,1398,1397,1,0,0,0,1398,1399,1,0,0,0,1399,1408,1,0,0,0,1400,1409, - 5,48,0,0,1401,1405,7,1,0,0,1402,1404,7,0,0,0,1403,1402,1,0,0,0,1404, - 1407,1,0,0,0,1405,1403,1,0,0,0,1405,1406,1,0,0,0,1406,1409,1,0,0, - 0,1407,1405,1,0,0,0,1408,1400,1,0,0,0,1408,1401,1,0,0,0,1409,1416, - 1,0,0,0,1410,1412,5,46,0,0,1411,1413,7,0,0,0,1412,1411,1,0,0,0,1413, - 1414,1,0,0,0,1414,1412,1,0,0,0,1414,1415,1,0,0,0,1415,1417,1,0,0, - 0,1416,1410,1,0,0,0,1416,1417,1,0,0,0,1417,1427,1,0,0,0,1418,1420, - 7,2,0,0,1419,1421,7,3,0,0,1420,1419,1,0,0,0,1420,1421,1,0,0,0,1421, - 1423,1,0,0,0,1422,1424,7,0,0,0,1423,1422,1,0,0,0,1424,1425,1,0,0, - 0,1425,1423,1,0,0,0,1425,1426,1,0,0,0,1426,1428,1,0,0,0,1427,1418, - 1,0,0,0,1427,1428,1,0,0,0,1428,300,1,0,0,0,1429,1433,7,4,0,0,1430, - 1432,7,5,0,0,1431,1430,1,0,0,0,1432,1435,1,0,0,0,1433,1431,1,0,0, - 0,1433,1434,1,0,0,0,1434,302,1,0,0,0,1435,1433,1,0,0,0,1436,1441, - 5,34,0,0,1437,1440,3,305,152,0,1438,1440,8,6,0,0,1439,1437,1,0,0, - 0,1439,1438,1,0,0,0,1440,1443,1,0,0,0,1441,1439,1,0,0,0,1441,1442, - 1,0,0,0,1442,1444,1,0,0,0,1443,1441,1,0,0,0,1444,1445,5,34,0,0,1445, - 304,1,0,0,0,1446,1454,5,92,0,0,1447,1455,7,7,0,0,1448,1449,5,117, - 0,0,1449,1450,3,307,153,0,1450,1451,3,307,153,0,1451,1452,3,307, - 153,0,1452,1453,3,307,153,0,1453,1455,1,0,0,0,1454,1447,1,0,0,0, - 1454,1448,1,0,0,0,1455,306,1,0,0,0,1456,1457,7,8,0,0,1457,308,1, - 0,0,0,1458,1459,5,47,0,0,1459,1460,5,47,0,0,1460,1464,1,0,0,0,1461, - 1463,8,9,0,0,1462,1461,1,0,0,0,1463,1466,1,0,0,0,1464,1462,1,0,0, - 0,1464,1465,1,0,0,0,1465,1467,1,0,0,0,1466,1464,1,0,0,0,1467,1468, - 6,154,0,0,1468,310,1,0,0,0,1469,1470,5,47,0,0,1470,1471,5,42,0,0, - 1471,1475,1,0,0,0,1472,1474,9,0,0,0,1473,1472,1,0,0,0,1474,1477, - 1,0,0,0,1475,1476,1,0,0,0,1475,1473,1,0,0,0,1476,1478,1,0,0,0,1477, - 1475,1,0,0,0,1478,1479,5,42,0,0,1479,1480,5,47,0,0,1480,1481,1,0, - 0,0,1481,1482,6,155,0,0,1482,312,1,0,0,0,1483,1485,7,10,0,0,1484, - 1483,1,0,0,0,1485,1486,1,0,0,0,1486,1484,1,0,0,0,1486,1487,1,0,0, - 0,1487,1488,1,0,0,0,1488,1489,6,156,0,0,1489,314,1,0,0,0,18,0,1390, - 1395,1398,1405,1408,1414,1416,1420,1425,1427,1433,1439,1441,1454, - 1464,1475,1486,1,0,1,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,311,1,0,0,0,0,313,1,0,0,0,0,315,1,0,0,0,1,317,1,0,0,0,3, + 322,1,0,0,0,5,329,1,0,0,0,7,338,1,0,0,0,9,351,1,0,0,0,11,359,1,0, + 0,0,13,363,1,0,0,0,15,372,1,0,0,0,17,380,1,0,0,0,19,389,1,0,0,0, + 21,400,1,0,0,0,23,410,1,0,0,0,25,420,1,0,0,0,27,429,1,0,0,0,29,441, + 1,0,0,0,31,448,1,0,0,0,33,456,1,0,0,0,35,465,1,0,0,0,37,473,1,0, + 0,0,39,479,1,0,0,0,41,484,1,0,0,0,43,497,1,0,0,0,45,507,1,0,0,0, + 47,519,1,0,0,0,49,525,1,0,0,0,51,536,1,0,0,0,53,547,1,0,0,0,55,552, + 1,0,0,0,57,561,1,0,0,0,59,571,1,0,0,0,61,576,1,0,0,0,63,580,1,0, + 0,0,65,586,1,0,0,0,67,591,1,0,0,0,69,601,1,0,0,0,71,605,1,0,0,0, + 73,618,1,0,0,0,75,623,1,0,0,0,77,630,1,0,0,0,79,639,1,0,0,0,81,650, + 1,0,0,0,83,654,1,0,0,0,85,663,1,0,0,0,87,670,1,0,0,0,89,679,1,0, + 0,0,91,684,1,0,0,0,93,694,1,0,0,0,95,705,1,0,0,0,97,713,1,0,0,0, + 99,719,1,0,0,0,101,725,1,0,0,0,103,734,1,0,0,0,105,744,1,0,0,0,107, + 753,1,0,0,0,109,765,1,0,0,0,111,776,1,0,0,0,113,782,1,0,0,0,115, + 790,1,0,0,0,117,793,1,0,0,0,119,798,1,0,0,0,121,805,1,0,0,0,123, + 808,1,0,0,0,125,816,1,0,0,0,127,823,1,0,0,0,129,829,1,0,0,0,131, + 834,1,0,0,0,133,845,1,0,0,0,135,850,1,0,0,0,137,856,1,0,0,0,139, + 863,1,0,0,0,141,867,1,0,0,0,143,879,1,0,0,0,145,882,1,0,0,0,147, + 889,1,0,0,0,149,892,1,0,0,0,151,899,1,0,0,0,153,907,1,0,0,0,155, + 914,1,0,0,0,157,925,1,0,0,0,159,932,1,0,0,0,161,941,1,0,0,0,163, + 956,1,0,0,0,165,966,1,0,0,0,167,976,1,0,0,0,169,989,1,0,0,0,171, + 995,1,0,0,0,173,1012,1,0,0,0,175,1015,1,0,0,0,177,1019,1,0,0,0,179, + 1024,1,0,0,0,181,1030,1,0,0,0,183,1039,1,0,0,0,185,1048,1,0,0,0, + 187,1052,1,0,0,0,189,1056,1,0,0,0,191,1060,1,0,0,0,193,1066,1,0, + 0,0,195,1072,1,0,0,0,197,1077,1,0,0,0,199,1082,1,0,0,0,201,1088, + 1,0,0,0,203,1096,1,0,0,0,205,1104,1,0,0,0,207,1115,1,0,0,0,209,1120, + 1,0,0,0,211,1132,1,0,0,0,213,1143,1,0,0,0,215,1153,1,0,0,0,217,1165, + 1,0,0,0,219,1174,1,0,0,0,221,1179,1,0,0,0,223,1192,1,0,0,0,225,1204, + 1,0,0,0,227,1216,1,0,0,0,229,1221,1,0,0,0,231,1229,1,0,0,0,233,1234, + 1,0,0,0,235,1247,1,0,0,0,237,1255,1,0,0,0,239,1264,1,0,0,0,241,1278, + 1,0,0,0,243,1287,1,0,0,0,245,1292,1,0,0,0,247,1299,1,0,0,0,249,1304, + 1,0,0,0,251,1310,1,0,0,0,253,1317,1,0,0,0,255,1323,1,0,0,0,257,1329, + 1,0,0,0,259,1336,1,0,0,0,261,1343,1,0,0,0,263,1350,1,0,0,0,265,1355, + 1,0,0,0,267,1361,1,0,0,0,269,1366,1,0,0,0,271,1369,1,0,0,0,273,1371, + 1,0,0,0,275,1373,1,0,0,0,277,1375,1,0,0,0,279,1377,1,0,0,0,281,1379, + 1,0,0,0,283,1381,1,0,0,0,285,1383,1,0,0,0,287,1385,1,0,0,0,289,1387, + 1,0,0,0,291,1389,1,0,0,0,293,1391,1,0,0,0,295,1393,1,0,0,0,297,1395, + 1,0,0,0,299,1398,1,0,0,0,301,1406,1,0,0,0,303,1437,1,0,0,0,305,1444, + 1,0,0,0,307,1454,1,0,0,0,309,1464,1,0,0,0,311,1466,1,0,0,0,313,1477, + 1,0,0,0,315,1492,1,0,0,0,317,318,5,101,0,0,318,319,5,100,0,0,319, + 320,5,105,0,0,320,321,5,116,0,0,321,2,1,0,0,0,322,323,5,109,0,0, + 323,324,5,111,0,0,324,325,5,100,0,0,325,326,5,117,0,0,326,327,5, + 108,0,0,327,328,5,101,0,0,328,4,1,0,0,0,329,330,5,99,0,0,330,331, + 5,111,0,0,331,332,5,110,0,0,332,333,5,116,0,0,333,334,5,114,0,0, + 334,335,5,97,0,0,335,336,5,99,0,0,336,337,5,116,0,0,337,6,1,0,0, + 0,338,339,5,112,0,0,339,340,5,114,0,0,340,341,5,101,0,0,341,342, + 5,115,0,0,342,343,5,101,0,0,343,344,5,110,0,0,344,345,5,116,0,0, + 345,346,5,97,0,0,346,347,5,116,0,0,347,348,5,105,0,0,348,349,5,111, + 0,0,349,350,5,110,0,0,350,8,1,0,0,0,351,352,5,115,0,0,352,353,5, + 117,0,0,353,354,5,98,0,0,354,355,5,106,0,0,355,356,5,101,0,0,356, + 357,5,99,0,0,357,358,5,116,0,0,358,10,1,0,0,0,359,360,5,102,0,0, + 360,361,5,111,0,0,361,362,5,114,0,0,362,12,1,0,0,0,363,364,5,99, + 0,0,364,365,5,114,0,0,365,366,5,101,0,0,366,367,5,97,0,0,367,368, + 5,116,0,0,368,369,5,105,0,0,369,370,5,111,0,0,370,371,5,110,0,0, + 371,14,1,0,0,0,372,373,5,118,0,0,373,374,5,97,0,0,374,375,5,114, + 0,0,375,376,5,105,0,0,376,377,5,97,0,0,377,378,5,110,0,0,378,379, + 5,116,0,0,379,16,1,0,0,0,380,381,5,112,0,0,381,382,5,114,0,0,382, + 383,5,101,0,0,383,384,5,112,0,0,384,385,5,97,0,0,385,386,5,114,0, + 0,386,387,5,101,0,0,387,388,5,115,0,0,388,18,1,0,0,0,389,390,5,105, + 0,0,390,391,5,110,0,0,391,392,5,105,0,0,392,393,5,116,0,0,393,394, + 5,105,0,0,394,395,5,97,0,0,395,396,5,108,0,0,396,397,5,105,0,0,397, + 398,5,122,0,0,398,399,5,101,0,0,399,20,1,0,0,0,400,401,5,119,0,0, + 401,402,5,111,0,0,402,403,5,114,0,0,403,404,5,107,0,0,404,405,5, + 115,0,0,405,406,5,112,0,0,406,407,5,97,0,0,407,408,5,99,0,0,408, + 409,5,101,0,0,409,22,1,0,0,0,410,411,5,101,0,0,411,412,5,120,0,0, + 412,413,5,101,0,0,413,414,5,99,0,0,414,415,5,117,0,0,415,416,5,116, + 0,0,416,417,5,105,0,0,417,418,5,111,0,0,418,419,5,110,0,0,419,24, + 1,0,0,0,420,421,5,115,0,0,421,422,5,110,0,0,422,423,5,97,0,0,423, + 424,5,112,0,0,424,425,5,115,0,0,425,426,5,104,0,0,426,427,5,111, + 0,0,427,428,5,116,0,0,428,26,1,0,0,0,429,430,5,116,0,0,430,431,5, + 114,0,0,431,432,5,97,0,0,432,433,5,110,0,0,433,434,5,115,0,0,434, + 435,5,97,0,0,435,436,5,99,0,0,436,437,5,116,0,0,437,438,5,105,0, + 0,438,439,5,111,0,0,439,440,5,110,0,0,440,28,1,0,0,0,441,442,5,114, + 0,0,442,443,5,101,0,0,443,444,5,109,0,0,444,445,5,111,0,0,445,446, + 5,116,0,0,446,447,5,101,0,0,447,30,1,0,0,0,448,449,5,116,0,0,449, + 450,5,97,0,0,450,451,5,114,0,0,451,452,5,103,0,0,452,453,5,101,0, + 0,453,454,5,116,0,0,454,455,5,115,0,0,455,32,1,0,0,0,456,457,5,112, + 0,0,457,458,5,111,0,0,458,459,5,114,0,0,459,460,5,116,0,0,460,461, + 5,97,0,0,461,462,5,98,0,0,462,463,5,108,0,0,463,464,5,101,0,0,464, + 34,1,0,0,0,465,466,5,114,0,0,466,467,5,101,0,0,467,468,5,112,0,0, + 468,469,5,108,0,0,469,470,5,105,0,0,470,471,5,99,0,0,471,472,5,97, + 0,0,472,36,1,0,0,0,473,474,5,108,0,0,474,475,5,111,0,0,475,476,5, + 99,0,0,476,477,5,97,0,0,477,478,5,108,0,0,478,38,1,0,0,0,479,480, + 5,102,0,0,480,481,5,114,0,0,481,482,5,111,0,0,482,483,5,109,0,0, + 483,40,1,0,0,0,484,485,5,114,0,0,485,486,5,101,0,0,486,487,5,115, + 0,0,487,488,5,117,0,0,488,489,5,108,0,0,489,490,5,116,0,0,490,491, + 5,45,0,0,491,492,5,98,0,0,492,493,5,121,0,0,493,494,5,116,0,0,494, + 495,5,101,0,0,495,496,5,115,0,0,496,42,1,0,0,0,497,498,5,114,0,0, + 498,499,5,112,0,0,499,500,5,99,0,0,500,501,5,45,0,0,501,502,5,99, + 0,0,502,503,5,97,0,0,503,504,5,108,0,0,504,505,5,108,0,0,505,506, + 5,115,0,0,506,44,1,0,0,0,507,508,5,100,0,0,508,509,5,101,0,0,509, + 510,5,97,0,0,510,511,5,100,0,0,511,512,5,108,0,0,512,513,5,105,0, + 0,513,514,5,110,0,0,514,515,5,101,0,0,515,516,5,45,0,0,516,517,5, + 109,0,0,517,518,5,115,0,0,518,46,1,0,0,0,519,520,5,113,0,0,520,521, + 5,117,0,0,521,522,5,101,0,0,522,523,5,114,0,0,523,524,5,121,0,0, + 524,48,1,0,0,0,525,526,5,114,0,0,526,527,5,101,0,0,527,528,5,102, + 0,0,528,529,5,108,0,0,529,530,5,101,0,0,530,531,5,99,0,0,531,532, + 5,116,0,0,532,533,5,105,0,0,533,534,5,111,0,0,534,535,5,110,0,0, + 535,50,1,0,0,0,536,537,5,115,0,0,537,538,5,112,0,0,538,539,5,101, + 0,0,539,540,5,99,0,0,540,541,5,105,0,0,541,542,5,97,0,0,542,543, + 5,108,0,0,543,544,5,105,0,0,544,545,5,122,0,0,545,546,5,101,0,0, + 546,52,1,0,0,0,547,548,5,114,0,0,548,549,5,111,0,0,549,550,5,111, + 0,0,550,551,5,116,0,0,551,54,1,0,0,0,552,553,5,100,0,0,553,554,5, + 111,0,0,554,555,5,99,0,0,555,556,5,117,0,0,556,557,5,109,0,0,557, + 558,5,101,0,0,558,559,5,110,0,0,559,560,5,116,0,0,560,56,1,0,0,0, + 561,562,5,102,0,0,562,563,5,114,0,0,563,564,5,97,0,0,564,565,5,103, + 0,0,565,566,5,109,0,0,566,567,5,101,0,0,567,568,5,110,0,0,568,569, + 5,116,0,0,569,570,5,115,0,0,570,58,1,0,0,0,571,572,5,118,0,0,572, + 573,5,105,0,0,573,574,5,101,0,0,574,575,5,119,0,0,575,60,1,0,0,0, + 576,577,5,109,0,0,577,578,5,97,0,0,578,579,5,120,0,0,579,62,1,0, + 0,0,580,581,5,97,0,0,581,582,5,108,0,0,582,583,5,108,0,0,583,584, + 5,111,0,0,584,585,5,119,0,0,585,64,1,0,0,0,586,587,5,112,0,0,587, + 588,5,111,0,0,588,589,5,108,0,0,589,590,5,108,0,0,590,66,1,0,0,0, + 591,592,5,113,0,0,592,593,5,117,0,0,593,594,5,101,0,0,594,595,5, + 114,0,0,595,596,5,121,0,0,596,597,5,97,0,0,597,598,5,98,0,0,598, + 599,5,108,0,0,599,600,5,101,0,0,600,68,1,0,0,0,601,602,5,114,0,0, + 602,603,5,112,0,0,603,604,5,99,0,0,604,70,1,0,0,0,605,606,5,113, + 0,0,606,607,5,117,0,0,607,608,5,101,0,0,608,609,5,114,0,0,609,610, + 5,121,0,0,610,611,5,45,0,0,611,612,5,114,0,0,612,613,5,101,0,0,613, + 614,5,97,0,0,614,615,5,115,0,0,615,616,5,111,0,0,616,617,5,110,0, + 0,617,72,1,0,0,0,618,619,5,116,0,0,619,620,5,121,0,0,620,621,5,112, + 0,0,621,622,5,101,0,0,622,74,1,0,0,0,623,624,5,111,0,0,624,625,5, + 98,0,0,625,626,5,106,0,0,626,627,5,101,0,0,627,628,5,99,0,0,628, + 629,5,116,0,0,629,76,1,0,0,0,630,631,5,115,0,0,631,632,5,116,0,0, + 632,633,5,111,0,0,633,634,5,114,0,0,634,635,5,97,0,0,635,636,5,98, + 0,0,636,637,5,108,0,0,637,638,5,101,0,0,638,78,1,0,0,0,639,640,5, + 105,0,0,640,641,5,109,0,0,641,642,5,112,0,0,642,643,5,108,0,0,643, + 644,5,101,0,0,644,645,5,109,0,0,645,646,5,101,0,0,646,647,5,110, + 0,0,647,648,5,116,0,0,648,649,5,115,0,0,649,80,1,0,0,0,650,651,5, + 114,0,0,651,652,5,101,0,0,652,653,5,102,0,0,653,82,1,0,0,0,654,655, + 5,102,0,0,655,656,5,114,0,0,656,657,5,97,0,0,657,658,5,103,0,0,658, + 659,5,109,0,0,659,660,5,101,0,0,660,661,5,110,0,0,661,662,5,116, + 0,0,662,84,1,0,0,0,663,664,5,105,0,0,664,665,5,109,0,0,665,666,5, + 112,0,0,666,667,5,111,0,0,667,668,5,114,0,0,668,669,5,116,0,0,669, + 86,1,0,0,0,670,671,5,101,0,0,671,672,5,120,0,0,672,673,5,116,0,0, + 673,674,5,101,0,0,674,675,5,114,0,0,675,676,5,110,0,0,676,677,5, + 97,0,0,677,678,5,108,0,0,678,88,1,0,0,0,679,680,5,97,0,0,680,681, + 5,116,0,0,681,682,5,111,0,0,682,683,5,109,0,0,683,90,1,0,0,0,684, + 685,5,105,0,0,685,686,5,110,0,0,686,687,5,116,0,0,687,688,5,101, + 0,0,688,689,5,114,0,0,689,690,5,102,0,0,690,691,5,97,0,0,691,692, + 5,99,0,0,692,693,5,101,0,0,693,92,1,0,0,0,694,695,5,105,0,0,695, + 696,5,110,0,0,696,697,5,116,0,0,697,698,5,101,0,0,698,699,5,114, + 0,0,699,700,5,102,0,0,700,701,5,97,0,0,701,702,5,99,0,0,702,703, + 5,101,0,0,703,704,5,115,0,0,704,94,1,0,0,0,705,706,5,112,0,0,706, + 707,5,97,0,0,707,708,5,99,0,0,708,709,5,107,0,0,709,710,5,97,0,0, + 710,711,5,103,0,0,711,712,5,101,0,0,712,96,1,0,0,0,713,714,5,118, + 0,0,714,715,5,97,0,0,715,716,5,108,0,0,716,717,5,117,0,0,717,718, + 5,101,0,0,718,98,1,0,0,0,719,720,5,102,0,0,720,721,5,105,0,0,721, + 722,5,101,0,0,722,723,5,108,0,0,723,724,5,100,0,0,724,100,1,0,0, + 0,725,726,5,114,0,0,726,727,5,101,0,0,727,728,5,108,0,0,728,729, + 5,97,0,0,729,730,5,116,0,0,730,731,5,105,0,0,731,732,5,111,0,0,732, + 733,5,110,0,0,733,102,1,0,0,0,734,735,5,111,0,0,735,736,5,112,0, + 0,736,737,5,101,0,0,737,738,5,114,0,0,738,739,5,97,0,0,739,740,5, + 116,0,0,740,741,5,105,0,0,741,742,5,111,0,0,742,743,5,110,0,0,743, + 104,1,0,0,0,744,745,5,102,0,0,745,746,5,117,0,0,746,747,5,110,0, + 0,747,748,5,99,0,0,748,749,5,116,0,0,749,750,5,105,0,0,750,751,5, + 111,0,0,751,752,5,110,0,0,752,106,1,0,0,0,753,754,5,99,0,0,754,755, + 5,111,0,0,755,756,5,110,0,0,756,757,5,115,0,0,757,758,5,116,0,0, + 758,759,5,114,0,0,759,760,5,117,0,0,760,761,5,99,0,0,761,762,5,116, + 0,0,762,763,5,111,0,0,763,764,5,114,0,0,764,108,1,0,0,0,765,766, + 5,99,0,0,766,767,5,111,0,0,767,768,5,110,0,0,768,769,5,115,0,0,769, + 770,5,116,0,0,770,771,5,114,0,0,771,772,5,117,0,0,772,773,5,99,0, + 0,773,774,5,116,0,0,774,775,5,115,0,0,775,110,1,0,0,0,776,777,5, + 105,0,0,777,778,5,110,0,0,778,779,5,112,0,0,779,780,5,117,0,0,780, + 781,5,116,0,0,781,112,1,0,0,0,782,783,5,99,0,0,783,784,5,111,0,0, + 784,785,5,110,0,0,785,786,5,102,0,0,786,787,5,111,0,0,787,788,5, + 114,0,0,788,789,5,109,0,0,789,114,1,0,0,0,790,791,5,97,0,0,791,792, + 5,115,0,0,792,116,1,0,0,0,793,794,5,98,0,0,794,795,5,105,0,0,795, + 796,5,110,0,0,796,797,5,100,0,0,797,118,1,0,0,0,798,799,5,115,0, + 0,799,800,5,116,0,0,800,801,5,97,0,0,801,802,5,116,0,0,802,803,5, + 105,0,0,803,804,5,99,0,0,804,120,1,0,0,0,805,806,5,116,0,0,806,807, + 5,111,0,0,807,122,1,0,0,0,808,809,5,112,0,0,809,810,5,114,0,0,810, + 811,5,105,0,0,811,812,5,118,0,0,812,813,5,97,0,0,813,814,5,116,0, + 0,814,815,5,101,0,0,815,124,1,0,0,0,816,817,5,115,0,0,817,818,5, + 104,0,0,818,819,5,97,0,0,819,820,5,114,0,0,820,821,5,101,0,0,821, + 822,5,100,0,0,822,126,1,0,0,0,823,824,5,115,0,0,824,825,5,116,0, + 0,825,826,5,97,0,0,826,827,5,116,0,0,827,828,5,101,0,0,828,128,1, + 0,0,0,829,830,5,101,0,0,830,831,5,100,0,0,831,832,5,103,0,0,832, + 833,5,101,0,0,833,130,1,0,0,0,834,835,5,112,0,0,835,836,5,114,0, + 0,836,837,5,111,0,0,837,838,5,106,0,0,838,839,5,101,0,0,839,840, + 5,99,0,0,840,841,5,116,0,0,841,842,5,105,0,0,842,843,5,111,0,0,843, + 844,5,110,0,0,844,132,1,0,0,0,845,846,5,119,0,0,846,847,5,105,0, + 0,847,848,5,116,0,0,848,849,5,104,0,0,849,134,1,0,0,0,850,851,5, + 117,0,0,851,852,5,115,0,0,852,853,5,105,0,0,853,854,5,110,0,0,854, + 855,5,103,0,0,855,136,1,0,0,0,856,857,5,97,0,0,857,858,5,99,0,0, + 858,859,5,99,0,0,859,860,5,101,0,0,860,861,5,112,0,0,861,862,5,116, + 0,0,862,138,1,0,0,0,863,864,5,118,0,0,864,865,5,105,0,0,865,866, + 5,97,0,0,866,140,1,0,0,0,867,868,5,109,0,0,868,869,5,97,0,0,869, + 870,5,116,0,0,870,871,5,101,0,0,871,872,5,114,0,0,872,873,5,105, + 0,0,873,874,5,97,0,0,874,875,5,108,0,0,875,876,5,105,0,0,876,877, + 5,122,0,0,877,878,5,101,0,0,878,142,1,0,0,0,879,880,5,105,0,0,880, + 881,5,102,0,0,881,144,1,0,0,0,882,883,5,97,0,0,883,884,5,98,0,0, + 884,885,5,115,0,0,885,886,5,101,0,0,886,887,5,110,0,0,887,888,5, + 116,0,0,888,146,1,0,0,0,889,890,5,111,0,0,890,891,5,110,0,0,891, + 148,1,0,0,0,892,893,5,112,0,0,893,894,5,111,0,0,894,895,5,108,0, + 0,895,896,5,105,0,0,896,897,5,99,0,0,897,898,5,121,0,0,898,150,1, + 0,0,0,899,900,5,100,0,0,900,901,5,101,0,0,901,902,5,102,0,0,902, + 903,5,97,0,0,903,904,5,117,0,0,904,905,5,108,0,0,905,906,5,116,0, + 0,906,152,1,0,0,0,907,908,5,115,0,0,908,909,5,111,0,0,909,910,5, + 117,0,0,910,911,5,114,0,0,911,912,5,99,0,0,912,913,5,101,0,0,913, + 154,1,0,0,0,914,915,5,114,0,0,915,916,5,101,0,0,916,917,5,112,0, + 0,917,918,5,111,0,0,918,919,5,115,0,0,919,920,5,105,0,0,920,921, + 5,116,0,0,921,922,5,111,0,0,922,923,5,114,0,0,923,924,5,121,0,0, + 924,156,1,0,0,0,925,926,5,99,0,0,926,927,5,111,0,0,927,928,5,109, + 0,0,928,929,5,109,0,0,929,930,5,105,0,0,930,931,5,116,0,0,931,158, + 1,0,0,0,932,933,5,114,0,0,933,934,5,101,0,0,934,935,5,118,0,0,935, + 936,5,105,0,0,936,937,5,115,0,0,937,938,5,105,0,0,938,939,5,111, + 0,0,939,940,5,110,0,0,940,160,1,0,0,0,941,942,5,115,0,0,942,943, + 5,101,0,0,943,944,5,109,0,0,944,945,5,97,0,0,945,946,5,110,0,0,946, + 947,5,116,0,0,947,948,5,105,0,0,948,949,5,99,0,0,949,950,5,45,0, + 0,950,951,5,109,0,0,951,952,5,97,0,0,952,953,5,106,0,0,953,954,5, + 111,0,0,954,955,5,114,0,0,955,162,1,0,0,0,956,957,5,111,0,0,957, + 958,5,110,0,0,958,959,5,45,0,0,959,960,5,100,0,0,960,961,5,101,0, + 0,961,962,5,108,0,0,962,963,5,101,0,0,963,964,5,116,0,0,964,965, + 5,101,0,0,965,164,1,0,0,0,966,967,5,108,0,0,967,968,5,105,0,0,968, + 969,5,102,0,0,969,970,5,101,0,0,970,971,5,99,0,0,971,972,5,121,0, + 0,972,973,5,99,0,0,973,974,5,108,0,0,974,975,5,101,0,0,975,166,1, + 0,0,0,976,977,5,114,0,0,977,978,5,101,0,0,978,979,5,116,0,0,979, + 980,5,97,0,0,980,981,5,105,0,0,981,982,5,110,0,0,982,983,5,45,0, + 0,983,984,5,111,0,0,984,985,5,116,0,0,985,986,5,104,0,0,986,987, + 5,101,0,0,987,988,5,114,0,0,988,168,1,0,0,0,989,990,5,107,0,0,990, + 991,5,101,0,0,991,992,5,121,0,0,992,993,5,101,0,0,993,994,5,100, + 0,0,994,170,1,0,0,0,995,996,5,112,0,0,996,997,5,117,0,0,997,998, + 5,98,0,0,998,999,5,108,0,0,999,1000,5,105,0,0,1000,1001,5,99,0,0, + 1001,1002,5,45,0,0,1002,1003,5,116,0,0,1003,1004,5,114,0,0,1004, + 1005,5,97,0,0,1005,1006,5,118,0,0,1006,1007,5,101,0,0,1007,1008, + 5,114,0,0,1008,1009,5,115,0,0,1009,1010,5,97,0,0,1010,1011,5,108, + 0,0,1011,172,1,0,0,0,1012,1013,5,105,0,0,1013,1014,5,100,0,0,1014, + 174,1,0,0,0,1015,1016,5,100,0,0,1016,1017,5,111,0,0,1017,1018,5, + 99,0,0,1018,176,1,0,0,0,1019,1020,5,109,0,0,1020,1021,5,111,0,0, + 1021,1022,5,100,0,0,1022,1023,5,101,0,0,1023,178,1,0,0,0,1024,1025, + 5,101,0,0,1025,1026,5,109,0,0,1026,1027,5,105,0,0,1027,1028,5,116, + 0,0,1028,1029,5,115,0,0,1029,180,1,0,0,0,1030,1031,5,114,0,0,1031, + 1032,5,101,0,0,1032,1033,5,99,0,0,1033,1034,5,101,0,0,1034,1035, + 5,105,0,0,1035,1036,5,118,0,0,1036,1037,5,101,0,0,1037,1038,5,114, + 0,0,1038,182,1,0,0,0,1039,1040,5,114,0,0,1040,1041,5,101,0,0,1041, + 1042,5,113,0,0,1042,1043,5,117,0,0,1043,1044,5,105,0,0,1044,1045, + 5,114,0,0,1045,1046,5,101,0,0,1046,1047,5,115,0,0,1047,184,1,0,0, + 0,1048,1049,5,97,0,0,1049,1050,5,110,0,0,1050,1051,5,121,0,0,1051, + 186,1,0,0,0,1052,1053,5,103,0,0,1053,1054,5,101,0,0,1054,1055,5, + 116,0,0,1055,188,1,0,0,0,1056,1057,5,115,0,0,1057,1058,5,101,0,0, + 1058,1059,5,116,0,0,1059,190,1,0,0,0,1060,1061,5,119,0,0,1061,1062, + 5,97,0,0,1062,1063,5,116,0,0,1063,1064,5,99,0,0,1064,1065,5,104, + 0,0,1065,192,1,0,0,0,1066,1067,5,115,0,0,1067,1068,5,116,0,0,1068, + 1069,5,97,0,0,1069,1070,5,114,0,0,1070,1071,5,116,0,0,1071,194,1, + 0,0,0,1072,1073,5,115,0,0,1073,1074,5,116,0,0,1074,1075,5,111,0, + 0,1075,1076,5,112,0,0,1076,196,1,0,0,0,1077,1078,5,114,0,0,1078, + 1079,5,101,0,0,1079,1080,5,97,0,0,1080,1081,5,100,0,0,1081,198,1, + 0,0,0,1082,1083,5,119,0,0,1083,1084,5,114,0,0,1084,1085,5,105,0, + 0,1085,1086,5,116,0,0,1086,1087,5,101,0,0,1087,200,1,0,0,0,1088, + 1089,5,114,0,0,1089,1090,5,101,0,0,1090,1091,5,115,0,0,1091,1092, + 5,111,0,0,1092,1093,5,108,0,0,1093,1094,5,118,0,0,1094,1095,5,101, + 0,0,1095,202,1,0,0,0,1096,1097,5,99,0,0,1097,1098,5,111,0,0,1098, + 1099,5,110,0,0,1099,1100,5,110,0,0,1100,1101,5,101,0,0,1101,1102, + 5,99,0,0,1102,1103,5,116,0,0,1103,204,1,0,0,0,1104,1105,5,100,0, + 0,1105,1106,5,105,0,0,1106,1107,5,115,0,0,1107,1108,5,99,0,0,1108, + 1109,5,111,0,0,1109,1110,5,110,0,0,1110,1111,5,110,0,0,1111,1112, + 5,101,0,0,1112,1113,5,99,0,0,1113,1114,5,116,0,0,1114,206,1,0,0, + 0,1115,1116,5,99,0,0,1116,1117,5,97,0,0,1117,1118,5,108,0,0,1118, + 1119,5,108,0,0,1119,208,1,0,0,0,1120,1121,5,119,0,0,1121,1122,5, + 97,0,0,1122,1123,5,116,0,0,1123,1124,5,99,0,0,1124,1125,5,104,0, + 0,1125,1126,5,45,0,0,1126,1127,5,115,0,0,1127,1128,5,116,0,0,1128, + 1129,5,97,0,0,1129,1130,5,114,0,0,1130,1131,5,116,0,0,1131,210,1, + 0,0,0,1132,1133,5,119,0,0,1133,1134,5,97,0,0,1134,1135,5,116,0,0, + 1135,1136,5,99,0,0,1136,1137,5,104,0,0,1137,1138,5,45,0,0,1138,1139, + 5,115,0,0,1139,1140,5,116,0,0,1140,1141,5,111,0,0,1141,1142,5,112, + 0,0,1142,212,1,0,0,0,1143,1144,5,115,0,0,1144,1145,5,117,0,0,1145, + 1146,5,98,0,0,1146,1147,5,115,0,0,1147,1148,5,99,0,0,1148,1149,5, + 114,0,0,1149,1150,5,105,0,0,1150,1151,5,98,0,0,1151,1152,5,101,0, + 0,1152,214,1,0,0,0,1153,1154,5,117,0,0,1154,1155,5,110,0,0,1155, + 1156,5,115,0,0,1156,1157,5,117,0,0,1157,1158,5,98,0,0,1158,1159, + 5,115,0,0,1159,1160,5,99,0,0,1160,1161,5,114,0,0,1161,1162,5,105, + 0,0,1162,1163,5,98,0,0,1163,1164,5,101,0,0,1164,216,1,0,0,0,1165, + 1166,5,114,0,0,1166,1167,5,101,0,0,1167,1168,5,103,0,0,1168,1169, + 5,105,0,0,1169,1170,5,115,0,0,1170,1171,5,116,0,0,1171,1172,5,101, + 0,0,1172,1173,5,114,0,0,1173,218,1,0,0,0,1174,1175,5,99,0,0,1175, + 1176,5,114,0,0,1176,1177,5,100,0,0,1177,1178,5,116,0,0,1178,220, + 1,0,0,0,1179,1180,5,111,0,0,1180,1181,5,112,0,0,1181,1182,5,116, + 0,0,1182,1183,5,105,0,0,1183,1184,5,111,0,0,1184,1185,5,110,0,0, + 1185,1186,5,97,0,0,1186,1187,5,108,0,0,1187,1188,5,45,0,0,1188,1189, + 5,111,0,0,1189,1190,5,110,0,0,1190,1191,5,101,0,0,1191,222,1,0,0, + 0,1192,1193,5,101,0,0,1193,1194,5,120,0,0,1194,1195,5,97,0,0,1195, + 1196,5,99,0,0,1196,1197,5,116,0,0,1197,1198,5,108,0,0,1198,1199, + 5,121,0,0,1199,1200,5,45,0,0,1200,1201,5,111,0,0,1201,1202,5,110, + 0,0,1202,1203,5,101,0,0,1203,224,1,0,0,0,1204,1205,5,109,0,0,1205, + 1206,5,97,0,0,1206,1207,5,110,0,0,1207,1208,5,121,0,0,1208,1209, + 5,45,0,0,1209,1210,5,117,0,0,1210,1211,5,110,0,0,1211,1212,5,105, + 0,0,1212,1213,5,113,0,0,1213,1214,5,117,0,0,1214,1215,5,101,0,0, + 1215,226,1,0,0,0,1216,1217,5,109,0,0,1217,1218,5,97,0,0,1218,1219, + 5,110,0,0,1219,1220,5,121,0,0,1220,228,1,0,0,0,1221,1222,5,111,0, + 0,1222,1223,5,114,0,0,1223,1224,5,100,0,0,1224,1225,5,101,0,0,1225, + 1226,5,114,0,0,1226,1227,5,101,0,0,1227,1228,5,100,0,0,1228,230, + 1,0,0,0,1229,1230,5,117,0,0,1230,1231,5,110,0,0,1231,1232,5,105, + 0,0,1232,1233,5,116,0,0,1233,232,1,0,0,0,1234,1235,5,119,0,0,1235, + 1236,5,97,0,0,1236,1237,5,116,0,0,1237,1238,5,99,0,0,1238,1239,5, + 104,0,0,1239,1240,5,45,0,0,1240,1241,5,104,0,0,1241,1242,5,97,0, + 0,1242,1243,5,110,0,0,1243,1244,5,100,0,0,1244,1245,5,108,0,0,1245, + 1246,5,101,0,0,1246,234,1,0,0,0,1247,1248,5,109,0,0,1248,1249,5, + 101,0,0,1249,1250,5,115,0,0,1250,1251,5,115,0,0,1251,1252,5,97,0, + 0,1252,1253,5,103,0,0,1253,1254,5,101,0,0,1254,236,1,0,0,0,1255, + 1256,5,97,0,0,1256,1257,5,116,0,0,1257,1258,5,111,0,0,1258,1259, + 5,109,0,0,1259,1260,5,45,0,0,1260,1261,5,114,0,0,1261,1262,5,101, + 0,0,1262,1263,5,102,0,0,1263,238,1,0,0,0,1264,1265,5,105,0,0,1265, + 1266,5,110,0,0,1266,1267,5,116,0,0,1267,1268,5,101,0,0,1268,1269, + 5,114,0,0,1269,1270,5,102,0,0,1270,1271,5,97,0,0,1271,1272,5,99, + 0,0,1272,1273,5,101,0,0,1273,1274,5,45,0,0,1274,1275,5,114,0,0,1275, + 1276,5,101,0,0,1276,1277,5,102,0,0,1277,240,1,0,0,0,1278,1279,5, + 111,0,0,1279,1280,5,112,0,0,1280,1281,5,116,0,0,1281,1282,5,105, + 0,0,1282,1283,5,111,0,0,1283,1284,5,110,0,0,1284,1285,5,97,0,0,1285, + 1286,5,108,0,0,1286,242,1,0,0,0,1287,1288,5,108,0,0,1288,1289,5, + 105,0,0,1289,1290,5,115,0,0,1290,1291,5,116,0,0,1291,244,1,0,0,0, + 1292,1293,5,114,0,0,1293,1294,5,101,0,0,1294,1295,5,99,0,0,1295, + 1296,5,111,0,0,1296,1297,5,114,0,0,1297,1298,5,100,0,0,1298,246, + 1,0,0,0,1299,1300,5,98,0,0,1300,1301,5,111,0,0,1301,1302,5,111,0, + 0,1302,1303,5,108,0,0,1303,248,1,0,0,0,1304,1305,5,98,0,0,1305,1306, + 5,121,0,0,1306,1307,5,116,0,0,1307,1308,5,101,0,0,1308,1309,5,115, + 0,0,1309,250,1,0,0,0,1310,1311,5,100,0,0,1311,1312,5,111,0,0,1312, + 1313,5,117,0,0,1313,1314,5,98,0,0,1314,1315,5,108,0,0,1315,1316, + 5,101,0,0,1316,252,1,0,0,0,1317,1318,5,105,0,0,1318,1319,5,110,0, + 0,1319,1320,5,116,0,0,1320,1321,5,51,0,0,1321,1322,5,50,0,0,1322, + 254,1,0,0,0,1323,1324,5,105,0,0,1324,1325,5,110,0,0,1325,1326,5, + 116,0,0,1326,1327,5,54,0,0,1327,1328,5,52,0,0,1328,256,1,0,0,0,1329, + 1330,5,115,0,0,1330,1331,5,116,0,0,1331,1332,5,114,0,0,1332,1333, + 5,105,0,0,1333,1334,5,110,0,0,1334,1335,5,103,0,0,1335,258,1,0,0, + 0,1336,1337,5,117,0,0,1337,1338,5,105,0,0,1338,1339,5,110,0,0,1339, + 1340,5,116,0,0,1340,1341,5,51,0,0,1341,1342,5,50,0,0,1342,260,1, + 0,0,0,1343,1344,5,117,0,0,1344,1345,5,105,0,0,1345,1346,5,110,0, + 0,1346,1347,5,116,0,0,1347,1348,5,54,0,0,1348,1349,5,52,0,0,1349, + 262,1,0,0,0,1350,1351,5,116,0,0,1351,1352,5,114,0,0,1352,1353,5, + 117,0,0,1353,1354,5,101,0,0,1354,264,1,0,0,0,1355,1356,5,102,0,0, + 1356,1357,5,97,0,0,1357,1358,5,108,0,0,1358,1359,5,115,0,0,1359, + 1360,5,101,0,0,1360,266,1,0,0,0,1361,1362,5,110,0,0,1362,1363,5, + 117,0,0,1363,1364,5,108,0,0,1364,1365,5,108,0,0,1365,268,1,0,0,0, + 1366,1367,5,45,0,0,1367,1368,5,62,0,0,1368,270,1,0,0,0,1369,1370, + 5,58,0,0,1370,272,1,0,0,0,1371,1372,5,59,0,0,1372,274,1,0,0,0,1373, + 1374,5,44,0,0,1374,276,1,0,0,0,1375,1376,5,46,0,0,1376,278,1,0,0, + 0,1377,1378,5,123,0,0,1378,280,1,0,0,0,1379,1380,5,125,0,0,1380, + 282,1,0,0,0,1381,1382,5,91,0,0,1382,284,1,0,0,0,1383,1384,5,93,0, + 0,1384,286,1,0,0,0,1385,1386,5,40,0,0,1386,288,1,0,0,0,1387,1388, + 5,41,0,0,1388,290,1,0,0,0,1389,1390,5,60,0,0,1390,292,1,0,0,0,1391, + 1392,5,62,0,0,1392,294,1,0,0,0,1393,1394,5,38,0,0,1394,296,1,0,0, + 0,1395,1396,5,61,0,0,1396,298,1,0,0,0,1397,1399,5,45,0,0,1398,1397, + 1,0,0,0,1398,1399,1,0,0,0,1399,1401,1,0,0,0,1400,1402,7,0,0,0,1401, + 1400,1,0,0,0,1402,1403,1,0,0,0,1403,1401,1,0,0,0,1403,1404,1,0,0, + 0,1404,300,1,0,0,0,1405,1407,5,45,0,0,1406,1405,1,0,0,0,1406,1407, + 1,0,0,0,1407,1416,1,0,0,0,1408,1417,5,48,0,0,1409,1413,7,1,0,0,1410, + 1412,7,0,0,0,1411,1410,1,0,0,0,1412,1415,1,0,0,0,1413,1411,1,0,0, + 0,1413,1414,1,0,0,0,1414,1417,1,0,0,0,1415,1413,1,0,0,0,1416,1408, + 1,0,0,0,1416,1409,1,0,0,0,1417,1424,1,0,0,0,1418,1420,5,46,0,0,1419, + 1421,7,0,0,0,1420,1419,1,0,0,0,1421,1422,1,0,0,0,1422,1420,1,0,0, + 0,1422,1423,1,0,0,0,1423,1425,1,0,0,0,1424,1418,1,0,0,0,1424,1425, + 1,0,0,0,1425,1435,1,0,0,0,1426,1428,7,2,0,0,1427,1429,7,3,0,0,1428, + 1427,1,0,0,0,1428,1429,1,0,0,0,1429,1431,1,0,0,0,1430,1432,7,0,0, + 0,1431,1430,1,0,0,0,1432,1433,1,0,0,0,1433,1431,1,0,0,0,1433,1434, + 1,0,0,0,1434,1436,1,0,0,0,1435,1426,1,0,0,0,1435,1436,1,0,0,0,1436, + 302,1,0,0,0,1437,1441,7,4,0,0,1438,1440,7,5,0,0,1439,1438,1,0,0, + 0,1440,1443,1,0,0,0,1441,1439,1,0,0,0,1441,1442,1,0,0,0,1442,304, + 1,0,0,0,1443,1441,1,0,0,0,1444,1449,5,34,0,0,1445,1448,3,307,153, + 0,1446,1448,8,6,0,0,1447,1445,1,0,0,0,1447,1446,1,0,0,0,1448,1451, + 1,0,0,0,1449,1447,1,0,0,0,1449,1450,1,0,0,0,1450,1452,1,0,0,0,1451, + 1449,1,0,0,0,1452,1453,5,34,0,0,1453,306,1,0,0,0,1454,1462,5,92, + 0,0,1455,1463,7,7,0,0,1456,1457,5,117,0,0,1457,1458,3,309,154,0, + 1458,1459,3,309,154,0,1459,1460,3,309,154,0,1460,1461,3,309,154, + 0,1461,1463,1,0,0,0,1462,1455,1,0,0,0,1462,1456,1,0,0,0,1463,308, + 1,0,0,0,1464,1465,7,8,0,0,1465,310,1,0,0,0,1466,1467,5,47,0,0,1467, + 1468,5,47,0,0,1468,1472,1,0,0,0,1469,1471,8,9,0,0,1470,1469,1,0, + 0,0,1471,1474,1,0,0,0,1472,1470,1,0,0,0,1472,1473,1,0,0,0,1473,1475, + 1,0,0,0,1474,1472,1,0,0,0,1475,1476,6,155,0,0,1476,312,1,0,0,0,1477, + 1478,5,47,0,0,1478,1479,5,42,0,0,1479,1483,1,0,0,0,1480,1482,9,0, + 0,0,1481,1480,1,0,0,0,1482,1485,1,0,0,0,1483,1484,1,0,0,0,1483,1481, + 1,0,0,0,1484,1486,1,0,0,0,1485,1483,1,0,0,0,1486,1487,5,42,0,0,1487, + 1488,5,47,0,0,1488,1489,1,0,0,0,1489,1490,6,156,0,0,1490,314,1,0, + 0,0,1491,1493,7,10,0,0,1492,1491,1,0,0,0,1493,1494,1,0,0,0,1494, + 1492,1,0,0,0,1494,1495,1,0,0,0,1495,1496,1,0,0,0,1496,1497,6,157, + 0,0,1497,316,1,0,0,0,18,0,1398,1403,1406,1413,1416,1422,1424,1428, + 1433,1435,1441,1447,1449,1462,1472,1483,1494,1,0,1,0 ]; private static __ATN: antlr.ATN; diff --git a/src/capability-language/generated/QuixosCapabilityParser.ts b/src/capability-language/generated/QuixosCapabilityParser.ts index 1a152ea..5287806 100644 --- a/src/capability-language/generated/QuixosCapabilityParser.ts +++ b/src/capability-language/generated/QuixosCapabilityParser.ts @@ -59,112 +59,113 @@ export class QuixosCapabilityParser extends antlr.Parser { public static readonly INTERFACES = 47; public static readonly PACKAGE = 48; public static readonly VALUE = 49; - public static readonly RELATION = 50; - public static readonly OPERATION = 51; - public static readonly FUNCTION = 52; - public static readonly CONSTRUCTOR = 53; - public static readonly CONSTRUCTS = 54; - public static readonly INPUT = 55; - public static readonly CONFORM = 56; - public static readonly AS = 57; - public static readonly BIND = 58; - public static readonly STATIC = 59; - public static readonly TO = 60; - public static readonly PRIVATE = 61; - public static readonly SHARED = 62; - public static readonly STATE = 63; - public static readonly EDGE = 64; - public static readonly PROJECTION = 65; - public static readonly WITH = 66; - public static readonly USING = 67; - public static readonly ACCEPT = 68; - public static readonly VIA = 69; - public static readonly MATERIALIZE = 70; - public static readonly IF = 71; - public static readonly ABSENT = 72; - public static readonly ON = 73; - public static readonly POLICY = 74; - public static readonly DEFAULT = 75; - public static readonly SOURCE = 76; - public static readonly REPOSITORY = 77; - public static readonly COMMIT = 78; - public static readonly REVISION = 79; - public static readonly SEMANTIC_MAJOR = 80; - public static readonly ON_DELETE = 81; - public static readonly LIFECYCLE = 82; - public static readonly RETAIN_OTHER = 83; - public static readonly KEYED = 84; - public static readonly PUBLIC_TRAVERSAL = 85; - public static readonly ID = 86; - public static readonly DOC = 87; - public static readonly MODE = 88; - public static readonly EMITS = 89; - public static readonly RECEIVER = 90; - public static readonly REQUIRES = 91; - public static readonly ANY = 92; - public static readonly GET = 93; - public static readonly SET = 94; - public static readonly WATCH = 95; - public static readonly START = 96; - public static readonly STOP = 97; - public static readonly READ = 98; - public static readonly WRITE = 99; - public static readonly RESOLVE = 100; - public static readonly CONNECT = 101; - public static readonly DISCONNECT = 102; - public static readonly CALL = 103; - public static readonly WATCH_START = 104; - public static readonly WATCH_STOP = 105; - public static readonly SUBSCRIBE = 106; - public static readonly UNSUBSCRIBE = 107; - public static readonly REGISTER = 108; - public static readonly CRDT = 109; - public static readonly OPTIONAL_ONE = 110; - public static readonly EXACTLY_ONE = 111; - public static readonly MANY_UNIQUE = 112; - public static readonly MANY = 113; - public static readonly ORDERED = 114; - public static readonly UNIT = 115; - public static readonly WATCH_HANDLE = 116; - public static readonly MESSAGE = 117; - public static readonly ATOM_REF = 118; - public static readonly INTERFACE_REF = 119; - public static readonly OPTIONAL = 120; - public static readonly LIST = 121; - public static readonly RECORD = 122; - public static readonly BOOL = 123; - public static readonly BYTES = 124; - public static readonly DOUBLE = 125; - public static readonly INT32 = 126; - public static readonly INT64 = 127; - public static readonly STRING = 128; - public static readonly UINT32 = 129; - public static readonly UINT64 = 130; - public static readonly TRUE = 131; - public static readonly FALSE = 132; - public static readonly NULL = 133; - public static readonly ARROW = 134; - public static readonly COLON = 135; - public static readonly SEMI = 136; - public static readonly COMMA = 137; - public static readonly DOT = 138; - public static readonly LBRACE = 139; - public static readonly RBRACE = 140; - public static readonly LBRACK = 141; - public static readonly RBRACK = 142; - public static readonly LPAREN = 143; - public static readonly RPAREN = 144; - public static readonly LT = 145; - public static readonly GT = 146; - public static readonly AMP = 147; - public static readonly EQUAL = 148; - public static readonly INTEGER = 149; - public static readonly JSON_NUMBER = 150; - public static readonly IDENTIFIER = 151; - public static readonly STRING_LITERAL = 152; - public static readonly LINE_COMMENT = 153; - public static readonly BLOCK_COMMENT = 154; - public static readonly WS = 155; + public static readonly FIELD = 50; + public static readonly RELATION = 51; + public static readonly OPERATION = 52; + public static readonly FUNCTION = 53; + public static readonly CONSTRUCTOR = 54; + public static readonly CONSTRUCTS = 55; + public static readonly INPUT = 56; + public static readonly CONFORM = 57; + public static readonly AS = 58; + public static readonly BIND = 59; + public static readonly STATIC = 60; + public static readonly TO = 61; + public static readonly PRIVATE = 62; + public static readonly SHARED = 63; + public static readonly STATE = 64; + public static readonly EDGE = 65; + public static readonly PROJECTION = 66; + public static readonly WITH = 67; + public static readonly USING = 68; + public static readonly ACCEPT = 69; + public static readonly VIA = 70; + public static readonly MATERIALIZE = 71; + public static readonly IF = 72; + public static readonly ABSENT = 73; + public static readonly ON = 74; + public static readonly POLICY = 75; + public static readonly DEFAULT = 76; + public static readonly SOURCE = 77; + public static readonly REPOSITORY = 78; + public static readonly COMMIT = 79; + public static readonly REVISION = 80; + public static readonly SEMANTIC_MAJOR = 81; + public static readonly ON_DELETE = 82; + public static readonly LIFECYCLE = 83; + public static readonly RETAIN_OTHER = 84; + public static readonly KEYED = 85; + public static readonly PUBLIC_TRAVERSAL = 86; + public static readonly ID = 87; + public static readonly DOC = 88; + public static readonly MODE = 89; + public static readonly EMITS = 90; + public static readonly RECEIVER = 91; + public static readonly REQUIRES = 92; + public static readonly ANY = 93; + public static readonly GET = 94; + public static readonly SET = 95; + public static readonly WATCH = 96; + public static readonly START = 97; + public static readonly STOP = 98; + public static readonly READ = 99; + public static readonly WRITE = 100; + public static readonly RESOLVE = 101; + public static readonly CONNECT = 102; + public static readonly DISCONNECT = 103; + public static readonly CALL = 104; + public static readonly WATCH_START = 105; + public static readonly WATCH_STOP = 106; + public static readonly SUBSCRIBE = 107; + public static readonly UNSUBSCRIBE = 108; + public static readonly REGISTER = 109; + public static readonly CRDT = 110; + public static readonly OPTIONAL_ONE = 111; + public static readonly EXACTLY_ONE = 112; + public static readonly MANY_UNIQUE = 113; + public static readonly MANY = 114; + public static readonly ORDERED = 115; + public static readonly UNIT = 116; + public static readonly WATCH_HANDLE = 117; + public static readonly MESSAGE = 118; + public static readonly ATOM_REF = 119; + public static readonly INTERFACE_REF = 120; + public static readonly OPTIONAL = 121; + public static readonly LIST = 122; + public static readonly RECORD = 123; + public static readonly BOOL = 124; + public static readonly BYTES = 125; + public static readonly DOUBLE = 126; + public static readonly INT32 = 127; + public static readonly INT64 = 128; + public static readonly STRING = 129; + public static readonly UINT32 = 130; + public static readonly UINT64 = 131; + public static readonly TRUE = 132; + public static readonly FALSE = 133; + public static readonly NULL = 134; + public static readonly ARROW = 135; + public static readonly COLON = 136; + public static readonly SEMI = 137; + public static readonly COMMA = 138; + public static readonly DOT = 139; + public static readonly LBRACE = 140; + public static readonly RBRACE = 141; + public static readonly LBRACK = 142; + public static readonly RBRACK = 143; + public static readonly LPAREN = 144; + public static readonly RPAREN = 145; + public static readonly LT = 146; + public static readonly GT = 147; + public static readonly AMP = 148; + public static readonly EQUAL = 149; + public static readonly INTEGER = 150; + public static readonly JSON_NUMBER = 151; + public static readonly IDENTIFIER = 152; + public static readonly STRING_LITERAL = 153; + public static readonly LINE_COMMENT = 154; + public static readonly BLOCK_COMMENT = 155; + public static readonly WS = 156; public static readonly RULE_document = 0; public static readonly RULE_fragmentDecl = 1; public static readonly RULE_sourceImportDecl = 2; @@ -261,19 +262,19 @@ export class QuixosCapabilityParser extends antlr.Parser { "'poll'", "'queryable'", "'rpc'", "'query-reason'", "'type'", "'object'", "'storable'", "'implements'", "'ref'", "'fragment'", "'import'", "'external'", "'atom'", "'interface'", "'interfaces'", "'package'", - "'value'", "'relation'", "'operation'", "'function'", "'constructor'", - "'constructs'", "'input'", "'conform'", "'as'", "'bind'", "'static'", - "'to'", "'private'", "'shared'", "'state'", "'edge'", "'projection'", - "'with'", "'using'", "'accept'", "'via'", "'materialize'", "'if'", - "'absent'", "'on'", "'policy'", "'default'", "'source'", "'repository'", - "'commit'", "'revision'", "'semantic-major'", "'on-delete'", "'lifecycle'", - "'retain-other'", "'keyed'", "'public-traversal'", "'id'", "'doc'", - "'mode'", "'emits'", "'receiver'", "'requires'", "'any'", "'get'", - "'set'", "'watch'", "'start'", "'stop'", "'read'", "'write'", "'resolve'", - "'connect'", "'disconnect'", "'call'", "'watch-start'", "'watch-stop'", - "'subscribe'", "'unsubscribe'", "'register'", "'crdt'", "'optional-one'", - "'exactly-one'", "'many-unique'", "'many'", "'ordered'", "'unit'", - "'watch-handle'", "'message'", "'atom-ref'", "'interface-ref'", + "'value'", "'field'", "'relation'", "'operation'", "'function'", + "'constructor'", "'constructs'", "'input'", "'conform'", "'as'", + "'bind'", "'static'", "'to'", "'private'", "'shared'", "'state'", + "'edge'", "'projection'", "'with'", "'using'", "'accept'", "'via'", + "'materialize'", "'if'", "'absent'", "'on'", "'policy'", "'default'", + "'source'", "'repository'", "'commit'", "'revision'", "'semantic-major'", + "'on-delete'", "'lifecycle'", "'retain-other'", "'keyed'", "'public-traversal'", + "'id'", "'doc'", "'mode'", "'emits'", "'receiver'", "'requires'", + "'any'", "'get'", "'set'", "'watch'", "'start'", "'stop'", "'read'", + "'write'", "'resolve'", "'connect'", "'disconnect'", "'call'", "'watch-start'", + "'watch-stop'", "'subscribe'", "'unsubscribe'", "'register'", "'crdt'", + "'optional-one'", "'exactly-one'", "'many-unique'", "'many'", "'ordered'", + "'unit'", "'watch-handle'", "'message'", "'atom-ref'", "'interface-ref'", "'optional'", "'list'", "'record'", "'bool'", "'bytes'", "'double'", "'int32'", "'int64'", "'string'", "'uint32'", "'uint64'", "'true'", "'false'", "'null'", "'->'", "':'", "';'", "','", "'.'", "'{'", @@ -289,7 +290,7 @@ export class QuixosCapabilityParser extends antlr.Parser { "MAX", "ALLOW", "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", "OBJECT", "STORABLE", "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", - "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", + "FIELD", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", "USING", "ACCEPT", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", @@ -418,7 +419,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 189; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 4 || ((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & 34144577) !== 0)) { + while (_la === 4 || ((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & 68288833) !== 0)) { { { this.state = 186; @@ -501,7 +502,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 210; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 4 || ((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & 34144577) !== 0)) { + while (_la === 4 || ((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & 68288833) !== 0)) { { { this.state = 207; @@ -789,7 +790,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 263; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 87) { + if (_la === 88) { { this.state = 261; this.match(QuixosCapabilityParser.DOC); @@ -843,7 +844,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 276; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 145) { + if (_la === 146) { { this.state = 275; this.typeParameters(); @@ -861,7 +862,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 291; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 91) { + if (_la === 92) { { this.state = 282; this.match(QuixosCapabilityParser.REQUIRES); @@ -870,7 +871,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 288; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 137) { + while (_la === 138) { { { this.state = 284; @@ -891,7 +892,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 297; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 2 || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & 33783809) !== 0)) { + while (_la === 2 || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & 67600385) !== 0)) { { { this.state = 294; @@ -933,7 +934,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 308; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 137) { + while (_la === 138) { { { this.state = 304; @@ -981,7 +982,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 317; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 135) { + if (_la === 136) { { this.state = 315; this.match(QuixosCapabilityParser.COLON); @@ -1011,7 +1012,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 327; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 147) { + while (_la === 148) { { { this.state = 323; @@ -1058,7 +1059,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 336; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 145) { + if (_la === 146) { { this.state = 335; this.typeArguments(); @@ -1094,7 +1095,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 344; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 137) { + while (_la === 138) { { { this.state = 340; @@ -1250,7 +1251,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 361; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 145) { + if (_la === 146) { { this.state = 360; this.typeParameters(); @@ -1386,7 +1387,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 386; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 59) { + if (_la === 60) { { this.state = 385; this.match(QuixosCapabilityParser.STATIC); @@ -1464,7 +1465,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } this.state = 409; - this.match(QuixosCapabilityParser.VALUE); + _la = this.tokenStream.LA(1); + if(!(_la === 49 || _la === 50)) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } this.state = 410; this.identifier(); this.state = 411; @@ -1480,7 +1488,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 419; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 1 || ((((_la - 93)) & ~0x1F) === 0 && ((1 << (_la - 93)) & 7) !== 0)) { + while (_la === 1 || ((((_la - 94)) & ~0x1F) === 0 && ((1 << (_la - 94)) & 7) !== 0)) { { { this.state = 416; @@ -1657,7 +1665,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 470; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 114) { + if (_la === 115) { { this.state = 469; this.match(QuixosCapabilityParser.ORDERED); @@ -1667,7 +1675,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 474; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 84) { + if (_la === 85) { { this.state = 472; this.match(QuixosCapabilityParser.KEYED); @@ -1681,7 +1689,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 480; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 95)) & ~0x1F) === 0 && ((1 << (_la - 95)) & 225) !== 0)) { + while (((((_la - 96)) & ~0x1F) === 0 && ((1 << (_la - 96)) & 225) !== 0)) { { { this.state = 477; @@ -1892,7 +1900,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 529; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 145) { + if (_la === 146) { { this.state = 528; this.typeArguments(); @@ -1963,7 +1971,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 549; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 80) { + if (_la === 81) { { this.state = 547; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); @@ -1977,7 +1985,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 555; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 2 || _la === 24 || ((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & 7) !== 0)) { + while (_la === 2 || _la === 24 || ((((_la - 52)) & ~0x1F) === 0 && ((1 << (_la - 52)) & 7) !== 0)) { { { this.state = 552; @@ -2175,7 +2183,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 596; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 145) { + if (_la === 146) { { this.state = 595; this.typeParameters(); @@ -2218,7 +2226,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 613; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 18)) & ~0x1F) === 0 && ((1 << (_la - 18)) & 63491) !== 0) || _la === 95) { + while (((((_la - 18)) & ~0x1F) === 0 && ((1 << (_la - 18)) & 63491) !== 0) || _la === 96) { { { this.state = 610; @@ -2242,7 +2250,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 622; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 51) { + if (_la === 52) { { this.state = 620; this.match(QuixosCapabilityParser.OPERATION); @@ -2261,7 +2269,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 628; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 18)) & ~0x1F) === 0 && ((1 << (_la - 18)) & 63491) !== 0) || _la === 95) { + while (((((_la - 18)) & ~0x1F) === 0 && ((1 << (_la - 18)) & 63491) !== 0) || _la === 96) { { { this.state = 625; @@ -2397,7 +2405,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 670; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 66) { + if (_la === 67) { { this.state = 661; this.match(QuixosCapabilityParser.WITH); @@ -2406,7 +2414,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 666; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 76)) & ~0x1F) === 0 && ((1 << (_la - 76)) & 3145729) !== 0) || _la === 108 || _la === 151) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 3145729) !== 0) || _la === 109 || _la === 152) { { { this.state = 663; @@ -2563,7 +2571,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 713; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 145) { + if (_la === 146) { { this.state = 712; this.typeParameters(); @@ -2599,7 +2607,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 727; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 89) { + if (_la === 90) { { this.state = 726; this.eventClause(); @@ -2613,7 +2621,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 732; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 91) { + if (_la === 92) { { this.state = 731; this.dependencyBlock(); @@ -2633,7 +2641,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 738; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 68) { + if (_la === 69) { { this.state = 737; this.acceptanceClause(); @@ -2671,7 +2679,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 745; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 145) { + if (_la === 146) { { this.state = 744; this.typeParameters(); @@ -2703,7 +2711,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 757; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 91) { + if (_la === 92) { { this.state = 756; this.dependencyBlock(); @@ -2723,7 +2731,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 763; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 68) { + if (_la === 69) { { this.state = 762; this.acceptanceClause(); @@ -2877,7 +2885,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 795; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 137) { + while (_la === 138) { { { this.state = 791; @@ -2933,7 +2941,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 809; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 91) { + if (_la === 92) { { this.state = 808; this.dependencyBlock(); @@ -2991,7 +2999,7 @@ export class QuixosCapabilityParser extends antlr.Parser { { this.state = 816; _la = this.tokenStream.LA(1); - if(!(((((_la - 103)) & ~0x1F) === 0 && ((1 << (_la - 103)) & 31) !== 0))) { + if(!(((((_la - 104)) & ~0x1F) === 0 && ((1 << (_la - 104)) & 31) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -3056,14 +3064,14 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 833; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 76)) & ~0x1F) === 0 && ((1 << (_la - 76)) & 3145729) !== 0) || _la === 108 || _la === 151) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 3145729) !== 0) || _la === 109 || _la === 152) { { this.state = 825; this.interfaceType(); this.state = 830; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 137) { + while (_la === 138) { { { this.state = 826; @@ -3112,7 +3120,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 843; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 137) { + while (_la === 138) { { { this.state = 839; @@ -3154,7 +3162,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 851; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 50331776) !== 0) || ((((_la - 46)) & ~0x1F) === 0 && ((1 << (_la - 46)) & 393345) !== 0)) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 50331776) !== 0) || ((((_la - 46)) & ~0x1F) === 0 && ((1 << (_la - 46)) & 786689) !== 0)) { { { this.state = 848; @@ -3252,7 +3260,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 883; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 84) { + if (_la === 85) { { this.state = 881; this.match(QuixosCapabilityParser.KEYED); @@ -3285,7 +3293,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 895; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 145) { + if (_la === 146) { { this.state = 894; this.typeArguments(); @@ -3295,7 +3303,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 898; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 67) { + if (_la === 68) { { this.state = 897; this.selectedOperations(); @@ -3359,7 +3367,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 924; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 55) { + if (_la === 56) { { this.state = 922; this.match(QuixosCapabilityParser.INPUT); @@ -3426,7 +3434,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 946; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 137) { + while (_la === 138) { { { this.state = 942; @@ -3465,7 +3473,7 @@ export class QuixosCapabilityParser extends antlr.Parser { { this.state = 951; _la = this.tokenStream.LA(1); - if(!(_la === 1 || ((((_la - 98)) & ~0x1F) === 0 && ((1 << (_la - 98)) & 223) !== 0))) { + if(!(_la === 1 || ((((_la - 99)) & ~0x1F) === 0 && ((1 << (_la - 99)) & 223) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -3580,7 +3588,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 972; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 75) { + if (_la === 76) { { this.state = 970; this.match(QuixosCapabilityParser.DEFAULT); @@ -3709,7 +3717,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1000; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 114) { + if (_la === 115) { { this.state = 999; this.match(QuixosCapabilityParser.ORDERED); @@ -3719,7 +3727,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1004; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 81) { + if (_la === 82) { { this.state = 1002; this.match(QuixosCapabilityParser.ON_DELETE); @@ -3731,7 +3739,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1007; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 83) { + if (_la === 84) { { this.state = 1006; this.match(QuixosCapabilityParser.RETAIN_OTHER); @@ -3741,7 +3749,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1011; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 84) { + if (_la === 85) { { this.state = 1009; this.match(QuixosCapabilityParser.KEYED); @@ -3753,7 +3761,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1014; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 85) { + if (_la === 86) { { this.state = 1013; this.match(QuixosCapabilityParser.PUBLIC_TRAVERSAL); @@ -3789,7 +3797,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1020; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 145) { + if (_la === 146) { { this.state = 1019; this.typeParameters(); @@ -3801,7 +3809,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1024; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 145) { + if (_la === 146) { { this.state = 1023; this.conformanceSourceArguments(); @@ -3815,7 +3823,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1029; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 145) { + if (_la === 146) { { this.state = 1028; this.typeArguments(); @@ -3825,7 +3833,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1033; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 86) { + if (_la === 87) { { this.state = 1031; this.match(QuixosCapabilityParser.ID); @@ -3837,7 +3845,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1037; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 80) { + if (_la === 81) { { this.state = 1035; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); @@ -3851,7 +3859,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1043; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 10 || ((((_la - 58)) & ~0x1F) === 0 && ((1 << (_la - 58)) & 4105) !== 0)) { + while (_la === 10 || ((((_la - 59)) & ~0x1F) === 0 && ((1 << (_la - 59)) & 4105) !== 0)) { { { this.state = 1040; @@ -4017,7 +4025,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1072; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 76)) & ~0x1F) === 0 && ((1 << (_la - 76)) & 3145729) !== 0) || _la === 108 || _la === 151) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 3145729) !== 0) || _la === 109 || _la === 152) { { { this.state = 1069; @@ -4119,7 +4127,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1101; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 138) { + while (_la === 139) { { { this.state = 1097; @@ -4465,7 +4473,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1173; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 145) { + if (_la === 146) { { this.state = 1172; this.typeArguments(); @@ -4492,7 +4500,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1183; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 145) { + if (_la === 146) { { this.state = 1182; this.typeArguments(); @@ -4502,7 +4510,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1186; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 66) { + if (_la === 67) { { this.state = 1185; this.dependencyBindingBlock(); @@ -4512,7 +4520,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1189; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 68) { + if (_la === 69) { { this.state = 1188; this.acceptanceBinding(); @@ -4572,7 +4580,7 @@ export class QuixosCapabilityParser extends antlr.Parser { { this.state = 1196; _la = this.tokenStream.LA(1); - if(!(_la === 1 || ((((_la - 98)) & ~0x1F) === 0 && ((1 << (_la - 98)) & 195) !== 0))) { + if(!(_la === 1 || ((((_la - 99)) & ~0x1F) === 0 && ((1 << (_la - 99)) & 195) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4603,7 +4611,7 @@ export class QuixosCapabilityParser extends antlr.Parser { { this.state = 1198; _la = this.tokenStream.LA(1); - if(!(((((_la - 100)) & ~0x1F) === 0 && ((1 << (_la - 100)) & 55) !== 0))) { + if(!(((((_la - 101)) & ~0x1F) === 0 && ((1 << (_la - 101)) & 55) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4639,7 +4647,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1205; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 76)) & ~0x1F) === 0 && ((1 << (_la - 76)) & 3145729) !== 0) || _la === 108 || _la === 151) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 3145729) !== 0) || _la === 109 || _la === 152) { { { this.state = 1202; @@ -4710,7 +4718,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1229; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 69) { + if (_la === 70) { { this.state = 1223; this.match(QuixosCapabilityParser.VIA); @@ -4747,7 +4755,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1245; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 69) { + if (_la === 70) { { this.state = 1239; this.match(QuixosCapabilityParser.VIA); @@ -4780,7 +4788,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1254; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 145) { + if (_la === 146) { { this.state = 1253; this.typeArguments(); @@ -4843,7 +4851,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1277; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 76)) & ~0x1F) === 0 && ((1 << (_la - 76)) & 3145729) !== 0) || _la === 108 || _la === 151) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 3145729) !== 0) || _la === 109 || _la === 152) { { { this.state = 1274; @@ -4903,7 +4911,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1304; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 69) { + if (_la === 70) { { this.state = 1298; this.match(QuixosCapabilityParser.VIA); @@ -4959,7 +4967,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1317; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 66) { + if (_la === 67) { { this.state = 1316; this.dependencyBindingBlock(); @@ -5053,7 +5061,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1335; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 145) { + if (_la === 146) { { this.state = 1334; this.typeArguments(); @@ -5113,7 +5121,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1359; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 76)) & ~0x1F) === 0 && ((1 << (_la - 76)) & 3145729) !== 0) || _la === 108 || _la === 151) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 3145729) !== 0) || _la === 109 || _la === 152) { { { this.state = 1356; @@ -5152,7 +5160,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1370; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - } while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 76)) & ~0x1F) === 0 && ((1 << (_la - 76)) & 3145729) !== 0) || _la === 108 || _la === 151); + } while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 3145729) !== 0) || _la === 109 || _la === 152); this.state = 1372; this.match(QuixosCapabilityParser.RBRACE); } @@ -5201,7 +5209,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1376; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 145) { + if (_la === 146) { { this.state = 1375; this.typeArguments(); @@ -5298,7 +5306,7 @@ export class QuixosCapabilityParser extends antlr.Parser { { this.state = 1392; _la = this.tokenStream.LA(1); - if(!(((((_la - 123)) & ~0x1F) === 0 && ((1 << (_la - 123)) & 255) !== 0))) { + if(!(((((_la - 124)) & ~0x1F) === 0 && ((1 << (_la - 124)) & 255) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -5329,7 +5337,7 @@ export class QuixosCapabilityParser extends antlr.Parser { { this.state = 1394; _la = this.tokenStream.LA(1); - if(!(((((_la - 110)) & ~0x1F) === 0 && ((1 << (_la - 110)) & 15) !== 0))) { + if(!(((((_la - 111)) & ~0x1F) === 0 && ((1 << (_la - 111)) & 15) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -5443,14 +5451,14 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1415; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 152) { + if (_la === 153) { { this.state = 1407; this.jsonMember(); this.state = 1412; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 137) { + while (_la === 138) { { { this.state = 1408; @@ -5522,14 +5530,14 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1432; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (((((_la - 131)) & ~0x1F) === 0 && ((1 << (_la - 131)) & 2884871) !== 0)) { + if (((((_la - 132)) & ~0x1F) === 0 && ((1 << (_la - 132)) & 2884871) !== 0)) { { this.state = 1424; this.jsonLiteral(); this.state = 1429; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 137) { + while (_la === 138) { { { this.state = 1425; @@ -5571,7 +5579,7 @@ export class QuixosCapabilityParser extends antlr.Parser { { this.state = 1436; _la = this.tokenStream.LA(1); - if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 76)) & ~0x1F) === 0 && ((1 << (_la - 76)) & 3145729) !== 0) || _la === 108 || _la === 151)) { + if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 3145729) !== 0) || _la === 109 || _la === 152)) { this.errorHandler.recoverInline(this); } else { @@ -5618,7 +5626,7 @@ export class QuixosCapabilityParser extends antlr.Parser { } public static readonly _serializedATN: number[] = [ - 4,1,155,1441,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,156,1441,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, @@ -5743,432 +5751,432 @@ export class QuixosCapabilityParser extends antlr.Parser { 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,0,9,2,0,17,17,35,35,1,0,13,14,1, - 0,103,107,3,0,1,1,98,102,104,105,3,0,1,1,98,99,104,105,2,0,100,102, - 104,105,1,0,123,130,1,0,110,113,10,0,1,1,4,7,10,10,12,35,42,42,47, - 47,76,76,96,97,108,108,151,151,1560,0,182,1,0,0,0,2,184,1,0,0,0, - 4,194,1,0,0,0,6,198,1,0,0,0,8,223,1,0,0,0,10,235,1,0,0,0,12,237, - 1,0,0,0,14,244,1,0,0,0,16,255,1,0,0,0,18,257,1,0,0,0,20,270,1,0, - 0,0,22,302,1,0,0,0,24,332,1,0,0,0,26,334,1,0,0,0,28,338,1,0,0,0, - 30,356,1,0,0,0,32,358,1,0,0,0,34,371,1,0,0,0,36,373,1,0,0,0,38,386, - 1,0,0,0,40,407,1,0,0,0,42,457,1,0,0,0,44,460,1,0,0,0,46,485,1,0, - 0,0,48,522,1,0,0,0,50,533,1,0,0,0,52,538,1,0,0,0,54,566,1,0,0,0, - 56,568,1,0,0,0,58,578,1,0,0,0,60,590,1,0,0,0,62,637,1,0,0,0,64,703, - 1,0,0,0,66,705,1,0,0,0,68,710,1,0,0,0,70,742,1,0,0,0,72,767,1,0, - 0,0,74,771,1,0,0,0,76,786,1,0,0,0,78,788,1,0,0,0,80,800,1,0,0,0, - 82,813,1,0,0,0,84,816,1,0,0,0,86,836,1,0,0,0,88,838,1,0,0,0,90,846, - 1,0,0,0,92,938,1,0,0,0,94,940,1,0,0,0,96,951,1,0,0,0,98,953,1,0, - 0,0,100,958,1,0,0,0,102,960,1,0,0,0,104,982,1,0,0,0,106,984,1,0, - 0,0,108,993,1,0,0,0,110,1018,1,0,0,0,112,1048,1,0,0,0,114,1057,1, - 0,0,0,116,1059,1,0,0,0,118,1067,1,0,0,0,120,1092,1,0,0,0,122,1094, - 1,0,0,0,124,1106,1,0,0,0,126,1113,1,0,0,0,128,1127,1,0,0,0,130,1137, - 1,0,0,0,132,1153,1,0,0,0,134,1191,1,0,0,0,136,1193,1,0,0,0,138,1196, - 1,0,0,0,140,1198,1,0,0,0,142,1200,1,0,0,0,144,1308,1,0,0,0,146,1310, - 1,0,0,0,148,1378,1,0,0,0,150,1380,1,0,0,0,152,1385,1,0,0,0,154,1392, - 1,0,0,0,156,1394,1,0,0,0,158,1404,1,0,0,0,160,1406,1,0,0,0,162,1419, - 1,0,0,0,164,1423,1,0,0,0,166,1436,1,0,0,0,168,1438,1,0,0,0,170,171, - 3,6,3,0,171,172,5,0,0,1,172,183,1,0,0,0,173,174,3,20,10,0,174,175, - 5,0,0,1,175,183,1,0,0,0,176,177,3,52,26,0,177,178,5,0,0,1,178,183, - 1,0,0,0,179,180,3,2,1,0,180,181,5,0,0,1,181,183,1,0,0,0,182,170, - 1,0,0,0,182,173,1,0,0,0,182,176,1,0,0,0,182,179,1,0,0,0,183,1,1, - 0,0,0,184,185,5,42,0,0,185,189,5,139,0,0,186,188,3,8,4,0,187,186, - 1,0,0,0,188,191,1,0,0,0,189,187,1,0,0,0,189,190,1,0,0,0,190,192, - 1,0,0,0,191,189,1,0,0,0,192,193,5,140,0,0,193,3,1,0,0,0,194,195, - 5,43,0,0,195,196,3,168,84,0,196,197,5,136,0,0,197,5,1,0,0,0,198, - 199,5,11,0,0,199,200,3,166,83,0,200,201,5,86,0,0,201,202,3,168,84, - 0,202,203,5,79,0,0,203,204,3,168,84,0,204,205,5,78,0,0,205,206,3, - 168,84,0,206,210,5,139,0,0,207,209,3,8,4,0,208,207,1,0,0,0,209,212, - 1,0,0,0,210,208,1,0,0,0,210,211,1,0,0,0,211,213,1,0,0,0,212,210, - 1,0,0,0,213,214,5,140,0,0,214,7,1,0,0,0,215,224,3,4,2,0,216,224, - 3,18,9,0,217,224,3,10,5,0,218,224,3,98,49,0,219,224,3,110,55,0,220, - 224,3,146,73,0,221,224,3,58,29,0,222,224,3,32,16,0,223,215,1,0,0, - 0,223,216,1,0,0,0,223,217,1,0,0,0,223,218,1,0,0,0,223,219,1,0,0, - 0,223,220,1,0,0,0,223,221,1,0,0,0,223,222,1,0,0,0,224,9,1,0,0,0, - 225,226,5,43,0,0,226,227,5,46,0,0,227,228,3,166,83,0,228,229,5,136, - 0,0,229,236,1,0,0,0,230,231,5,43,0,0,231,232,5,48,0,0,232,233,3, - 166,83,0,233,234,5,136,0,0,234,236,1,0,0,0,235,225,1,0,0,0,235,230, - 1,0,0,0,236,11,1,0,0,0,237,238,5,44,0,0,238,239,5,45,0,0,239,240, - 3,166,83,0,240,241,5,86,0,0,241,242,3,168,84,0,242,243,5,136,0,0, - 243,13,1,0,0,0,244,245,5,44,0,0,245,246,5,46,0,0,246,247,3,166,83, - 0,247,248,5,79,0,0,248,249,3,168,84,0,249,250,5,136,0,0,250,15,1, - 0,0,0,251,256,3,10,5,0,252,256,3,12,6,0,253,256,3,14,7,0,254,256, - 3,32,16,0,255,251,1,0,0,0,255,252,1,0,0,0,255,253,1,0,0,0,255,254, - 1,0,0,0,256,17,1,0,0,0,257,258,5,45,0,0,258,259,3,166,83,0,259,260, - 5,86,0,0,260,263,3,168,84,0,261,262,5,87,0,0,262,264,3,168,84,0, - 263,261,1,0,0,0,263,264,1,0,0,0,264,265,1,0,0,0,265,266,5,136,0, - 0,266,19,1,0,0,0,267,269,3,16,8,0,268,267,1,0,0,0,269,272,1,0,0, - 0,270,268,1,0,0,0,270,271,1,0,0,0,271,273,1,0,0,0,272,270,1,0,0, - 0,273,274,5,46,0,0,274,276,3,166,83,0,275,277,3,22,11,0,276,275, - 1,0,0,0,276,277,1,0,0,0,277,278,1,0,0,0,278,279,5,86,0,0,279,280, - 3,168,84,0,280,281,5,79,0,0,281,291,3,168,84,0,282,283,5,91,0,0, - 283,288,3,26,13,0,284,285,5,137,0,0,285,287,3,26,13,0,286,284,1, - 0,0,0,287,290,1,0,0,0,288,286,1,0,0,0,288,289,1,0,0,0,289,292,1, - 0,0,0,290,288,1,0,0,0,291,282,1,0,0,0,291,292,1,0,0,0,292,293,1, - 0,0,0,293,297,5,139,0,0,294,296,3,34,17,0,295,294,1,0,0,0,296,299, - 1,0,0,0,297,295,1,0,0,0,297,298,1,0,0,0,298,300,1,0,0,0,299,297, - 1,0,0,0,300,301,5,140,0,0,301,21,1,0,0,0,302,303,5,145,0,0,303,308, - 3,24,12,0,304,305,5,137,0,0,305,307,3,24,12,0,306,304,1,0,0,0,307, - 310,1,0,0,0,308,306,1,0,0,0,308,309,1,0,0,0,309,311,1,0,0,0,310, - 308,1,0,0,0,311,312,5,146,0,0,312,23,1,0,0,0,313,314,5,49,0,0,314, - 317,3,166,83,0,315,316,5,135,0,0,316,318,5,39,0,0,317,315,1,0,0, - 0,317,318,1,0,0,0,318,333,1,0,0,0,319,320,5,38,0,0,320,330,3,166, - 83,0,321,322,5,40,0,0,322,327,3,26,13,0,323,324,5,147,0,0,324,326, - 3,26,13,0,325,323,1,0,0,0,326,329,1,0,0,0,327,325,1,0,0,0,327,328, - 1,0,0,0,328,331,1,0,0,0,329,327,1,0,0,0,330,321,1,0,0,0,330,331, - 1,0,0,0,331,333,1,0,0,0,332,313,1,0,0,0,332,319,1,0,0,0,333,25,1, - 0,0,0,334,336,3,166,83,0,335,337,3,28,14,0,336,335,1,0,0,0,336,337, - 1,0,0,0,337,27,1,0,0,0,338,339,5,145,0,0,339,344,3,30,15,0,340,341, - 5,137,0,0,341,343,3,30,15,0,342,340,1,0,0,0,343,346,1,0,0,0,344, - 342,1,0,0,0,344,345,1,0,0,0,345,347,1,0,0,0,346,344,1,0,0,0,347, - 348,5,146,0,0,348,29,1,0,0,0,349,350,5,45,0,0,350,357,3,166,83,0, - 351,352,5,46,0,0,352,357,3,26,13,0,353,354,5,38,0,0,354,357,3,166, - 83,0,355,357,3,148,74,0,356,349,1,0,0,0,356,351,1,0,0,0,356,353, - 1,0,0,0,356,355,1,0,0,0,357,31,1,0,0,0,358,359,5,37,0,0,359,361, - 3,166,83,0,360,362,3,22,11,0,361,360,1,0,0,0,361,362,1,0,0,0,362, - 363,1,0,0,0,363,364,5,148,0,0,364,365,3,148,74,0,365,366,5,136,0, - 0,366,33,1,0,0,0,367,372,3,40,20,0,368,372,3,44,22,0,369,372,3,38, - 19,0,370,372,3,36,18,0,371,367,1,0,0,0,371,368,1,0,0,0,371,369,1, - 0,0,0,371,370,1,0,0,0,372,35,1,0,0,0,373,374,5,2,0,0,374,375,3,166, - 83,0,375,376,5,86,0,0,376,377,3,168,84,0,377,378,5,3,0,0,378,381, - 3,168,84,0,379,380,5,5,0,0,380,382,3,50,25,0,381,379,1,0,0,0,381, - 382,1,0,0,0,382,383,1,0,0,0,383,384,5,136,0,0,384,37,1,0,0,0,385, - 387,5,59,0,0,386,385,1,0,0,0,386,387,1,0,0,0,387,388,1,0,0,0,388, - 389,5,51,0,0,389,390,3,166,83,0,390,391,5,86,0,0,391,392,3,168,84, - 0,392,393,5,135,0,0,393,394,3,148,74,0,394,395,5,134,0,0,395,396, - 3,148,74,0,396,397,5,139,0,0,397,398,5,103,0,0,398,399,5,86,0,0, - 399,401,3,168,84,0,400,402,3,76,38,0,401,400,1,0,0,0,401,402,1,0, - 0,0,402,403,1,0,0,0,403,404,5,136,0,0,404,405,5,140,0,0,405,39,1, - 0,0,0,406,408,3,46,23,0,407,406,1,0,0,0,407,408,1,0,0,0,408,409, - 1,0,0,0,409,410,5,49,0,0,410,411,3,166,83,0,411,412,5,86,0,0,412, - 413,3,168,84,0,413,414,5,135,0,0,414,415,3,148,74,0,415,419,5,139, - 0,0,416,418,3,42,21,0,417,416,1,0,0,0,418,421,1,0,0,0,419,417,1, - 0,0,0,419,420,1,0,0,0,420,422,1,0,0,0,421,419,1,0,0,0,422,423,5, - 140,0,0,423,41,1,0,0,0,424,425,5,93,0,0,425,426,5,86,0,0,426,428, - 3,168,84,0,427,429,3,76,38,0,428,427,1,0,0,0,428,429,1,0,0,0,429, - 430,1,0,0,0,430,431,5,136,0,0,431,458,1,0,0,0,432,433,5,94,0,0,433, - 434,5,86,0,0,434,436,3,168,84,0,435,437,3,76,38,0,436,435,1,0,0, - 0,436,437,1,0,0,0,437,438,1,0,0,0,438,439,5,136,0,0,439,458,1,0, - 0,0,440,441,5,1,0,0,441,442,5,86,0,0,442,444,3,168,84,0,443,445, - 3,76,38,0,444,443,1,0,0,0,444,445,1,0,0,0,445,446,1,0,0,0,446,447, - 5,136,0,0,447,458,1,0,0,0,448,449,5,95,0,0,449,450,5,96,0,0,450, - 451,5,86,0,0,451,452,3,168,84,0,452,453,5,97,0,0,453,454,5,86,0, - 0,454,455,3,168,84,0,455,456,5,136,0,0,456,458,1,0,0,0,457,424,1, - 0,0,0,457,432,1,0,0,0,457,440,1,0,0,0,457,448,1,0,0,0,458,43,1,0, - 0,0,459,461,3,46,23,0,460,459,1,0,0,0,460,461,1,0,0,0,461,462,1, - 0,0,0,462,463,5,50,0,0,463,464,3,166,83,0,464,465,5,86,0,0,465,466, - 3,168,84,0,466,467,5,135,0,0,467,468,3,156,78,0,468,470,3,50,25, - 0,469,471,5,114,0,0,470,469,1,0,0,0,470,471,1,0,0,0,471,474,1,0, - 0,0,472,473,5,84,0,0,473,475,3,168,84,0,474,472,1,0,0,0,474,475, - 1,0,0,0,475,476,1,0,0,0,476,480,5,139,0,0,477,479,3,48,24,0,478, - 477,1,0,0,0,479,482,1,0,0,0,480,478,1,0,0,0,480,481,1,0,0,0,481, - 483,1,0,0,0,482,480,1,0,0,0,483,484,5,140,0,0,484,45,1,0,0,0,485, - 487,5,34,0,0,486,488,7,0,0,0,487,486,1,0,0,0,487,488,1,0,0,0,488, - 47,1,0,0,0,489,490,5,100,0,0,490,491,5,86,0,0,491,493,3,168,84,0, - 492,494,3,76,38,0,493,492,1,0,0,0,493,494,1,0,0,0,494,495,1,0,0, - 0,495,496,5,136,0,0,496,523,1,0,0,0,497,498,5,101,0,0,498,499,5, - 86,0,0,499,501,3,168,84,0,500,502,3,76,38,0,501,500,1,0,0,0,501, - 502,1,0,0,0,502,503,1,0,0,0,503,504,5,136,0,0,504,523,1,0,0,0,505, - 506,5,102,0,0,506,507,5,86,0,0,507,509,3,168,84,0,508,510,3,76,38, - 0,509,508,1,0,0,0,509,510,1,0,0,0,510,511,1,0,0,0,511,512,5,136, - 0,0,512,523,1,0,0,0,513,514,5,95,0,0,514,515,5,96,0,0,515,516,5, - 86,0,0,516,517,3,168,84,0,517,518,5,97,0,0,518,519,5,86,0,0,519, - 520,3,168,84,0,520,521,5,136,0,0,521,523,1,0,0,0,522,489,1,0,0,0, - 522,497,1,0,0,0,522,505,1,0,0,0,522,513,1,0,0,0,523,49,1,0,0,0,524, - 525,5,45,0,0,525,534,3,166,83,0,526,527,5,46,0,0,527,529,3,166,83, - 0,528,530,3,28,14,0,529,528,1,0,0,0,529,530,1,0,0,0,530,534,1,0, - 0,0,531,532,5,38,0,0,532,534,3,166,83,0,533,524,1,0,0,0,533,526, - 1,0,0,0,533,531,1,0,0,0,534,51,1,0,0,0,535,537,3,16,8,0,536,535, - 1,0,0,0,537,540,1,0,0,0,538,536,1,0,0,0,538,539,1,0,0,0,539,541, - 1,0,0,0,540,538,1,0,0,0,541,542,5,48,0,0,542,543,3,166,83,0,543, - 544,5,86,0,0,544,545,3,168,84,0,545,546,5,79,0,0,546,549,3,168,84, - 0,547,548,5,80,0,0,548,550,5,149,0,0,549,547,1,0,0,0,549,550,1,0, - 0,0,550,551,1,0,0,0,551,555,5,139,0,0,552,554,3,54,27,0,553,552, - 1,0,0,0,554,557,1,0,0,0,555,553,1,0,0,0,555,556,1,0,0,0,556,558, - 1,0,0,0,557,555,1,0,0,0,558,559,5,140,0,0,559,53,1,0,0,0,560,567, - 3,68,34,0,561,567,3,70,35,0,562,567,3,80,40,0,563,567,3,60,30,0, - 564,567,3,62,31,0,565,567,3,56,28,0,566,560,1,0,0,0,566,561,1,0, - 0,0,566,562,1,0,0,0,566,563,1,0,0,0,566,564,1,0,0,0,566,565,1,0, - 0,0,567,55,1,0,0,0,568,569,5,2,0,0,569,570,3,166,83,0,570,571,5, - 86,0,0,571,572,3,168,84,0,572,573,5,40,0,0,573,574,3,26,13,0,574, - 575,5,138,0,0,575,576,3,166,83,0,576,577,5,136,0,0,577,57,1,0,0, - 0,578,579,5,4,0,0,579,580,3,166,83,0,580,581,5,86,0,0,581,582,3, - 168,84,0,582,583,5,6,0,0,583,584,3,26,13,0,584,585,5,67,0,0,585, - 586,3,166,83,0,586,587,5,138,0,0,587,588,3,166,83,0,588,589,5,136, - 0,0,589,59,1,0,0,0,590,592,5,24,0,0,591,593,5,42,0,0,592,591,1,0, - 0,0,592,593,1,0,0,0,593,594,1,0,0,0,594,596,3,166,83,0,595,597,3, - 22,11,0,596,595,1,0,0,0,596,597,1,0,0,0,597,598,1,0,0,0,598,599, - 5,86,0,0,599,600,3,168,84,0,600,602,5,27,0,0,601,603,5,11,0,0,602, + 154,156,158,160,162,164,166,168,0,10,1,0,49,50,2,0,17,17,35,35,1, + 0,13,14,1,0,104,108,3,0,1,1,99,103,105,106,3,0,1,1,99,100,105,106, + 2,0,101,103,105,106,1,0,124,131,1,0,111,114,10,0,1,1,4,7,10,10,12, + 35,42,42,47,47,77,77,97,98,109,109,152,152,1560,0,182,1,0,0,0,2, + 184,1,0,0,0,4,194,1,0,0,0,6,198,1,0,0,0,8,223,1,0,0,0,10,235,1,0, + 0,0,12,237,1,0,0,0,14,244,1,0,0,0,16,255,1,0,0,0,18,257,1,0,0,0, + 20,270,1,0,0,0,22,302,1,0,0,0,24,332,1,0,0,0,26,334,1,0,0,0,28,338, + 1,0,0,0,30,356,1,0,0,0,32,358,1,0,0,0,34,371,1,0,0,0,36,373,1,0, + 0,0,38,386,1,0,0,0,40,407,1,0,0,0,42,457,1,0,0,0,44,460,1,0,0,0, + 46,485,1,0,0,0,48,522,1,0,0,0,50,533,1,0,0,0,52,538,1,0,0,0,54,566, + 1,0,0,0,56,568,1,0,0,0,58,578,1,0,0,0,60,590,1,0,0,0,62,637,1,0, + 0,0,64,703,1,0,0,0,66,705,1,0,0,0,68,710,1,0,0,0,70,742,1,0,0,0, + 72,767,1,0,0,0,74,771,1,0,0,0,76,786,1,0,0,0,78,788,1,0,0,0,80,800, + 1,0,0,0,82,813,1,0,0,0,84,816,1,0,0,0,86,836,1,0,0,0,88,838,1,0, + 0,0,90,846,1,0,0,0,92,938,1,0,0,0,94,940,1,0,0,0,96,951,1,0,0,0, + 98,953,1,0,0,0,100,958,1,0,0,0,102,960,1,0,0,0,104,982,1,0,0,0,106, + 984,1,0,0,0,108,993,1,0,0,0,110,1018,1,0,0,0,112,1048,1,0,0,0,114, + 1057,1,0,0,0,116,1059,1,0,0,0,118,1067,1,0,0,0,120,1092,1,0,0,0, + 122,1094,1,0,0,0,124,1106,1,0,0,0,126,1113,1,0,0,0,128,1127,1,0, + 0,0,130,1137,1,0,0,0,132,1153,1,0,0,0,134,1191,1,0,0,0,136,1193, + 1,0,0,0,138,1196,1,0,0,0,140,1198,1,0,0,0,142,1200,1,0,0,0,144,1308, + 1,0,0,0,146,1310,1,0,0,0,148,1378,1,0,0,0,150,1380,1,0,0,0,152,1385, + 1,0,0,0,154,1392,1,0,0,0,156,1394,1,0,0,0,158,1404,1,0,0,0,160,1406, + 1,0,0,0,162,1419,1,0,0,0,164,1423,1,0,0,0,166,1436,1,0,0,0,168,1438, + 1,0,0,0,170,171,3,6,3,0,171,172,5,0,0,1,172,183,1,0,0,0,173,174, + 3,20,10,0,174,175,5,0,0,1,175,183,1,0,0,0,176,177,3,52,26,0,177, + 178,5,0,0,1,178,183,1,0,0,0,179,180,3,2,1,0,180,181,5,0,0,1,181, + 183,1,0,0,0,182,170,1,0,0,0,182,173,1,0,0,0,182,176,1,0,0,0,182, + 179,1,0,0,0,183,1,1,0,0,0,184,185,5,42,0,0,185,189,5,140,0,0,186, + 188,3,8,4,0,187,186,1,0,0,0,188,191,1,0,0,0,189,187,1,0,0,0,189, + 190,1,0,0,0,190,192,1,0,0,0,191,189,1,0,0,0,192,193,5,141,0,0,193, + 3,1,0,0,0,194,195,5,43,0,0,195,196,3,168,84,0,196,197,5,137,0,0, + 197,5,1,0,0,0,198,199,5,11,0,0,199,200,3,166,83,0,200,201,5,87,0, + 0,201,202,3,168,84,0,202,203,5,80,0,0,203,204,3,168,84,0,204,205, + 5,79,0,0,205,206,3,168,84,0,206,210,5,140,0,0,207,209,3,8,4,0,208, + 207,1,0,0,0,209,212,1,0,0,0,210,208,1,0,0,0,210,211,1,0,0,0,211, + 213,1,0,0,0,212,210,1,0,0,0,213,214,5,141,0,0,214,7,1,0,0,0,215, + 224,3,4,2,0,216,224,3,18,9,0,217,224,3,10,5,0,218,224,3,98,49,0, + 219,224,3,110,55,0,220,224,3,146,73,0,221,224,3,58,29,0,222,224, + 3,32,16,0,223,215,1,0,0,0,223,216,1,0,0,0,223,217,1,0,0,0,223,218, + 1,0,0,0,223,219,1,0,0,0,223,220,1,0,0,0,223,221,1,0,0,0,223,222, + 1,0,0,0,224,9,1,0,0,0,225,226,5,43,0,0,226,227,5,46,0,0,227,228, + 3,166,83,0,228,229,5,137,0,0,229,236,1,0,0,0,230,231,5,43,0,0,231, + 232,5,48,0,0,232,233,3,166,83,0,233,234,5,137,0,0,234,236,1,0,0, + 0,235,225,1,0,0,0,235,230,1,0,0,0,236,11,1,0,0,0,237,238,5,44,0, + 0,238,239,5,45,0,0,239,240,3,166,83,0,240,241,5,87,0,0,241,242,3, + 168,84,0,242,243,5,137,0,0,243,13,1,0,0,0,244,245,5,44,0,0,245,246, + 5,46,0,0,246,247,3,166,83,0,247,248,5,80,0,0,248,249,3,168,84,0, + 249,250,5,137,0,0,250,15,1,0,0,0,251,256,3,10,5,0,252,256,3,12,6, + 0,253,256,3,14,7,0,254,256,3,32,16,0,255,251,1,0,0,0,255,252,1,0, + 0,0,255,253,1,0,0,0,255,254,1,0,0,0,256,17,1,0,0,0,257,258,5,45, + 0,0,258,259,3,166,83,0,259,260,5,87,0,0,260,263,3,168,84,0,261,262, + 5,88,0,0,262,264,3,168,84,0,263,261,1,0,0,0,263,264,1,0,0,0,264, + 265,1,0,0,0,265,266,5,137,0,0,266,19,1,0,0,0,267,269,3,16,8,0,268, + 267,1,0,0,0,269,272,1,0,0,0,270,268,1,0,0,0,270,271,1,0,0,0,271, + 273,1,0,0,0,272,270,1,0,0,0,273,274,5,46,0,0,274,276,3,166,83,0, + 275,277,3,22,11,0,276,275,1,0,0,0,276,277,1,0,0,0,277,278,1,0,0, + 0,278,279,5,87,0,0,279,280,3,168,84,0,280,281,5,80,0,0,281,291,3, + 168,84,0,282,283,5,92,0,0,283,288,3,26,13,0,284,285,5,138,0,0,285, + 287,3,26,13,0,286,284,1,0,0,0,287,290,1,0,0,0,288,286,1,0,0,0,288, + 289,1,0,0,0,289,292,1,0,0,0,290,288,1,0,0,0,291,282,1,0,0,0,291, + 292,1,0,0,0,292,293,1,0,0,0,293,297,5,140,0,0,294,296,3,34,17,0, + 295,294,1,0,0,0,296,299,1,0,0,0,297,295,1,0,0,0,297,298,1,0,0,0, + 298,300,1,0,0,0,299,297,1,0,0,0,300,301,5,141,0,0,301,21,1,0,0,0, + 302,303,5,146,0,0,303,308,3,24,12,0,304,305,5,138,0,0,305,307,3, + 24,12,0,306,304,1,0,0,0,307,310,1,0,0,0,308,306,1,0,0,0,308,309, + 1,0,0,0,309,311,1,0,0,0,310,308,1,0,0,0,311,312,5,147,0,0,312,23, + 1,0,0,0,313,314,5,49,0,0,314,317,3,166,83,0,315,316,5,136,0,0,316, + 318,5,39,0,0,317,315,1,0,0,0,317,318,1,0,0,0,318,333,1,0,0,0,319, + 320,5,38,0,0,320,330,3,166,83,0,321,322,5,40,0,0,322,327,3,26,13, + 0,323,324,5,148,0,0,324,326,3,26,13,0,325,323,1,0,0,0,326,329,1, + 0,0,0,327,325,1,0,0,0,327,328,1,0,0,0,328,331,1,0,0,0,329,327,1, + 0,0,0,330,321,1,0,0,0,330,331,1,0,0,0,331,333,1,0,0,0,332,313,1, + 0,0,0,332,319,1,0,0,0,333,25,1,0,0,0,334,336,3,166,83,0,335,337, + 3,28,14,0,336,335,1,0,0,0,336,337,1,0,0,0,337,27,1,0,0,0,338,339, + 5,146,0,0,339,344,3,30,15,0,340,341,5,138,0,0,341,343,3,30,15,0, + 342,340,1,0,0,0,343,346,1,0,0,0,344,342,1,0,0,0,344,345,1,0,0,0, + 345,347,1,0,0,0,346,344,1,0,0,0,347,348,5,147,0,0,348,29,1,0,0,0, + 349,350,5,45,0,0,350,357,3,166,83,0,351,352,5,46,0,0,352,357,3,26, + 13,0,353,354,5,38,0,0,354,357,3,166,83,0,355,357,3,148,74,0,356, + 349,1,0,0,0,356,351,1,0,0,0,356,353,1,0,0,0,356,355,1,0,0,0,357, + 31,1,0,0,0,358,359,5,37,0,0,359,361,3,166,83,0,360,362,3,22,11,0, + 361,360,1,0,0,0,361,362,1,0,0,0,362,363,1,0,0,0,363,364,5,149,0, + 0,364,365,3,148,74,0,365,366,5,137,0,0,366,33,1,0,0,0,367,372,3, + 40,20,0,368,372,3,44,22,0,369,372,3,38,19,0,370,372,3,36,18,0,371, + 367,1,0,0,0,371,368,1,0,0,0,371,369,1,0,0,0,371,370,1,0,0,0,372, + 35,1,0,0,0,373,374,5,2,0,0,374,375,3,166,83,0,375,376,5,87,0,0,376, + 377,3,168,84,0,377,378,5,3,0,0,378,381,3,168,84,0,379,380,5,5,0, + 0,380,382,3,50,25,0,381,379,1,0,0,0,381,382,1,0,0,0,382,383,1,0, + 0,0,383,384,5,137,0,0,384,37,1,0,0,0,385,387,5,60,0,0,386,385,1, + 0,0,0,386,387,1,0,0,0,387,388,1,0,0,0,388,389,5,52,0,0,389,390,3, + 166,83,0,390,391,5,87,0,0,391,392,3,168,84,0,392,393,5,136,0,0,393, + 394,3,148,74,0,394,395,5,135,0,0,395,396,3,148,74,0,396,397,5,140, + 0,0,397,398,5,104,0,0,398,399,5,87,0,0,399,401,3,168,84,0,400,402, + 3,76,38,0,401,400,1,0,0,0,401,402,1,0,0,0,402,403,1,0,0,0,403,404, + 5,137,0,0,404,405,5,141,0,0,405,39,1,0,0,0,406,408,3,46,23,0,407, + 406,1,0,0,0,407,408,1,0,0,0,408,409,1,0,0,0,409,410,7,0,0,0,410, + 411,3,166,83,0,411,412,5,87,0,0,412,413,3,168,84,0,413,414,5,136, + 0,0,414,415,3,148,74,0,415,419,5,140,0,0,416,418,3,42,21,0,417,416, + 1,0,0,0,418,421,1,0,0,0,419,417,1,0,0,0,419,420,1,0,0,0,420,422, + 1,0,0,0,421,419,1,0,0,0,422,423,5,141,0,0,423,41,1,0,0,0,424,425, + 5,94,0,0,425,426,5,87,0,0,426,428,3,168,84,0,427,429,3,76,38,0,428, + 427,1,0,0,0,428,429,1,0,0,0,429,430,1,0,0,0,430,431,5,137,0,0,431, + 458,1,0,0,0,432,433,5,95,0,0,433,434,5,87,0,0,434,436,3,168,84,0, + 435,437,3,76,38,0,436,435,1,0,0,0,436,437,1,0,0,0,437,438,1,0,0, + 0,438,439,5,137,0,0,439,458,1,0,0,0,440,441,5,1,0,0,441,442,5,87, + 0,0,442,444,3,168,84,0,443,445,3,76,38,0,444,443,1,0,0,0,444,445, + 1,0,0,0,445,446,1,0,0,0,446,447,5,137,0,0,447,458,1,0,0,0,448,449, + 5,96,0,0,449,450,5,97,0,0,450,451,5,87,0,0,451,452,3,168,84,0,452, + 453,5,98,0,0,453,454,5,87,0,0,454,455,3,168,84,0,455,456,5,137,0, + 0,456,458,1,0,0,0,457,424,1,0,0,0,457,432,1,0,0,0,457,440,1,0,0, + 0,457,448,1,0,0,0,458,43,1,0,0,0,459,461,3,46,23,0,460,459,1,0,0, + 0,460,461,1,0,0,0,461,462,1,0,0,0,462,463,5,51,0,0,463,464,3,166, + 83,0,464,465,5,87,0,0,465,466,3,168,84,0,466,467,5,136,0,0,467,468, + 3,156,78,0,468,470,3,50,25,0,469,471,5,115,0,0,470,469,1,0,0,0,470, + 471,1,0,0,0,471,474,1,0,0,0,472,473,5,85,0,0,473,475,3,168,84,0, + 474,472,1,0,0,0,474,475,1,0,0,0,475,476,1,0,0,0,476,480,5,140,0, + 0,477,479,3,48,24,0,478,477,1,0,0,0,479,482,1,0,0,0,480,478,1,0, + 0,0,480,481,1,0,0,0,481,483,1,0,0,0,482,480,1,0,0,0,483,484,5,141, + 0,0,484,45,1,0,0,0,485,487,5,34,0,0,486,488,7,1,0,0,487,486,1,0, + 0,0,487,488,1,0,0,0,488,47,1,0,0,0,489,490,5,101,0,0,490,491,5,87, + 0,0,491,493,3,168,84,0,492,494,3,76,38,0,493,492,1,0,0,0,493,494, + 1,0,0,0,494,495,1,0,0,0,495,496,5,137,0,0,496,523,1,0,0,0,497,498, + 5,102,0,0,498,499,5,87,0,0,499,501,3,168,84,0,500,502,3,76,38,0, + 501,500,1,0,0,0,501,502,1,0,0,0,502,503,1,0,0,0,503,504,5,137,0, + 0,504,523,1,0,0,0,505,506,5,103,0,0,506,507,5,87,0,0,507,509,3,168, + 84,0,508,510,3,76,38,0,509,508,1,0,0,0,509,510,1,0,0,0,510,511,1, + 0,0,0,511,512,5,137,0,0,512,523,1,0,0,0,513,514,5,96,0,0,514,515, + 5,97,0,0,515,516,5,87,0,0,516,517,3,168,84,0,517,518,5,98,0,0,518, + 519,5,87,0,0,519,520,3,168,84,0,520,521,5,137,0,0,521,523,1,0,0, + 0,522,489,1,0,0,0,522,497,1,0,0,0,522,505,1,0,0,0,522,513,1,0,0, + 0,523,49,1,0,0,0,524,525,5,45,0,0,525,534,3,166,83,0,526,527,5,46, + 0,0,527,529,3,166,83,0,528,530,3,28,14,0,529,528,1,0,0,0,529,530, + 1,0,0,0,530,534,1,0,0,0,531,532,5,38,0,0,532,534,3,166,83,0,533, + 524,1,0,0,0,533,526,1,0,0,0,533,531,1,0,0,0,534,51,1,0,0,0,535,537, + 3,16,8,0,536,535,1,0,0,0,537,540,1,0,0,0,538,536,1,0,0,0,538,539, + 1,0,0,0,539,541,1,0,0,0,540,538,1,0,0,0,541,542,5,48,0,0,542,543, + 3,166,83,0,543,544,5,87,0,0,544,545,3,168,84,0,545,546,5,80,0,0, + 546,549,3,168,84,0,547,548,5,81,0,0,548,550,5,150,0,0,549,547,1, + 0,0,0,549,550,1,0,0,0,550,551,1,0,0,0,551,555,5,140,0,0,552,554, + 3,54,27,0,553,552,1,0,0,0,554,557,1,0,0,0,555,553,1,0,0,0,555,556, + 1,0,0,0,556,558,1,0,0,0,557,555,1,0,0,0,558,559,5,141,0,0,559,53, + 1,0,0,0,560,567,3,68,34,0,561,567,3,70,35,0,562,567,3,80,40,0,563, + 567,3,60,30,0,564,567,3,62,31,0,565,567,3,56,28,0,566,560,1,0,0, + 0,566,561,1,0,0,0,566,562,1,0,0,0,566,563,1,0,0,0,566,564,1,0,0, + 0,566,565,1,0,0,0,567,55,1,0,0,0,568,569,5,2,0,0,569,570,3,166,83, + 0,570,571,5,87,0,0,571,572,3,168,84,0,572,573,5,40,0,0,573,574,3, + 26,13,0,574,575,5,139,0,0,575,576,3,166,83,0,576,577,5,137,0,0,577, + 57,1,0,0,0,578,579,5,4,0,0,579,580,3,166,83,0,580,581,5,87,0,0,581, + 582,3,168,84,0,582,583,5,6,0,0,583,584,3,26,13,0,584,585,5,68,0, + 0,585,586,3,166,83,0,586,587,5,139,0,0,587,588,3,166,83,0,588,589, + 5,137,0,0,589,59,1,0,0,0,590,592,5,24,0,0,591,593,5,42,0,0,592,591, + 1,0,0,0,592,593,1,0,0,0,593,594,1,0,0,0,594,596,3,166,83,0,595,597, + 3,22,11,0,596,595,1,0,0,0,596,597,1,0,0,0,597,598,1,0,0,0,598,599, + 5,87,0,0,599,600,3,168,84,0,600,602,5,27,0,0,601,603,5,11,0,0,602, 601,1,0,0,0,602,603,1,0,0,0,603,604,1,0,0,0,604,605,3,26,13,0,605, - 606,5,28,0,0,606,635,3,168,84,0,607,608,5,51,0,0,608,609,3,168,84, - 0,609,613,5,139,0,0,610,612,3,64,32,0,611,610,1,0,0,0,612,615,1, + 606,5,28,0,0,606,635,3,168,84,0,607,608,5,52,0,0,608,609,3,168,84, + 0,609,613,5,140,0,0,610,612,3,64,32,0,611,610,1,0,0,0,612,615,1, 0,0,0,613,611,1,0,0,0,613,614,1,0,0,0,614,616,1,0,0,0,615,613,1, - 0,0,0,616,617,5,140,0,0,617,636,1,0,0,0,618,619,5,42,0,0,619,622, - 3,168,84,0,620,621,5,51,0,0,621,623,3,168,84,0,622,620,1,0,0,0,622, - 623,1,0,0,0,623,633,1,0,0,0,624,628,5,139,0,0,625,627,3,64,32,0, + 0,0,0,616,617,5,141,0,0,617,636,1,0,0,0,618,619,5,42,0,0,619,622, + 3,168,84,0,620,621,5,52,0,0,621,623,3,168,84,0,622,620,1,0,0,0,622, + 623,1,0,0,0,623,633,1,0,0,0,624,628,5,140,0,0,625,627,3,64,32,0, 626,625,1,0,0,0,627,630,1,0,0,0,628,626,1,0,0,0,628,629,1,0,0,0, - 629,631,1,0,0,0,630,628,1,0,0,0,631,634,5,140,0,0,632,634,5,136, + 629,631,1,0,0,0,630,628,1,0,0,0,631,634,5,141,0,0,632,634,5,137, 0,0,633,624,1,0,0,0,633,632,1,0,0,0,634,636,1,0,0,0,635,607,1,0, 0,0,635,618,1,0,0,0,636,61,1,0,0,0,637,638,5,24,0,0,638,639,3,166, - 83,0,639,640,5,86,0,0,640,641,3,168,84,0,641,642,5,26,0,0,642,643, - 3,166,83,0,643,644,3,28,14,0,644,645,5,136,0,0,645,63,1,0,0,0,646, - 647,5,18,0,0,647,704,5,136,0,0,648,649,5,19,0,0,649,650,5,20,0,0, - 650,651,3,166,83,0,651,652,5,136,0,0,652,704,1,0,0,0,653,654,5,29, - 0,0,654,655,3,168,84,0,655,656,5,136,0,0,656,704,1,0,0,0,657,658, - 5,29,0,0,658,659,3,166,83,0,659,660,5,138,0,0,660,670,3,166,83,0, - 661,662,5,66,0,0,662,666,5,139,0,0,663,665,3,66,33,0,664,663,1,0, + 83,0,639,640,5,87,0,0,640,641,3,168,84,0,641,642,5,26,0,0,642,643, + 3,166,83,0,643,644,3,28,14,0,644,645,5,137,0,0,645,63,1,0,0,0,646, + 647,5,18,0,0,647,704,5,137,0,0,648,649,5,19,0,0,649,650,5,20,0,0, + 650,651,3,166,83,0,651,652,5,137,0,0,652,704,1,0,0,0,653,654,5,29, + 0,0,654,655,3,168,84,0,655,656,5,137,0,0,656,704,1,0,0,0,657,658, + 5,29,0,0,658,659,3,166,83,0,659,660,5,139,0,0,660,670,3,166,83,0, + 661,662,5,67,0,0,662,666,5,140,0,0,663,665,3,66,33,0,664,663,1,0, 0,0,665,668,1,0,0,0,666,664,1,0,0,0,666,667,1,0,0,0,667,669,1,0, - 0,0,668,666,1,0,0,0,669,671,5,140,0,0,670,661,1,0,0,0,670,671,1, - 0,0,0,671,672,1,0,0,0,672,673,5,136,0,0,673,704,1,0,0,0,674,676, + 0,0,668,666,1,0,0,0,669,671,5,141,0,0,670,661,1,0,0,0,670,671,1, + 0,0,0,671,672,1,0,0,0,672,673,5,137,0,0,673,704,1,0,0,0,674,676, 5,30,0,0,675,677,5,38,0,0,676,675,1,0,0,0,676,677,1,0,0,0,677,678, - 1,0,0,0,678,679,3,166,83,0,679,680,5,57,0,0,680,681,3,26,13,0,681, - 682,5,136,0,0,682,704,1,0,0,0,683,684,5,31,0,0,684,685,3,166,83, - 0,685,686,5,149,0,0,686,687,5,136,0,0,687,704,1,0,0,0,688,689,5, - 32,0,0,689,690,3,26,13,0,690,691,5,138,0,0,691,692,3,166,83,0,692, - 693,3,166,83,0,693,694,3,168,84,0,694,695,5,136,0,0,695,704,1,0, - 0,0,696,697,5,95,0,0,697,704,5,136,0,0,698,699,5,33,0,0,699,700, - 5,149,0,0,700,701,3,168,84,0,701,702,5,136,0,0,702,704,1,0,0,0,703, + 1,0,0,0,678,679,3,166,83,0,679,680,5,58,0,0,680,681,3,26,13,0,681, + 682,5,137,0,0,682,704,1,0,0,0,683,684,5,31,0,0,684,685,3,166,83, + 0,685,686,5,150,0,0,686,687,5,137,0,0,687,704,1,0,0,0,688,689,5, + 32,0,0,689,690,3,26,13,0,690,691,5,139,0,0,691,692,3,166,83,0,692, + 693,3,166,83,0,693,694,3,168,84,0,694,695,5,137,0,0,695,704,1,0, + 0,0,696,697,5,96,0,0,697,704,5,137,0,0,698,699,5,33,0,0,699,700, + 5,150,0,0,700,701,3,168,84,0,701,702,5,137,0,0,702,704,1,0,0,0,703, 646,1,0,0,0,703,648,1,0,0,0,703,653,1,0,0,0,703,657,1,0,0,0,703, 674,1,0,0,0,703,683,1,0,0,0,703,688,1,0,0,0,703,696,1,0,0,0,703, - 698,1,0,0,0,704,65,1,0,0,0,705,706,3,166,83,0,706,707,5,60,0,0,707, - 708,3,166,83,0,708,709,5,136,0,0,709,67,1,0,0,0,710,711,5,51,0,0, + 698,1,0,0,0,704,65,1,0,0,0,705,706,3,166,83,0,706,707,5,61,0,0,707, + 708,3,166,83,0,708,709,5,137,0,0,709,67,1,0,0,0,710,711,5,52,0,0, 711,713,3,166,83,0,712,714,3,22,11,0,713,712,1,0,0,0,713,714,1,0, - 0,0,714,715,1,0,0,0,715,716,5,86,0,0,716,717,3,168,84,0,717,718, - 5,135,0,0,718,719,3,148,74,0,719,720,5,134,0,0,720,721,3,148,74, - 0,721,722,5,88,0,0,722,724,3,84,42,0,723,725,3,76,38,0,724,723,1, + 0,0,714,715,1,0,0,0,715,716,5,87,0,0,716,717,3,168,84,0,717,718, + 5,136,0,0,718,719,3,148,74,0,719,720,5,135,0,0,720,721,3,148,74, + 0,721,722,5,89,0,0,722,724,3,84,42,0,723,725,3,76,38,0,724,723,1, 0,0,0,724,725,1,0,0,0,725,727,1,0,0,0,726,728,3,82,41,0,727,726, - 1,0,0,0,727,728,1,0,0,0,728,729,1,0,0,0,729,730,5,90,0,0,730,732, + 1,0,0,0,727,728,1,0,0,0,728,729,1,0,0,0,729,730,5,91,0,0,730,732, 3,86,43,0,731,733,3,90,45,0,732,731,1,0,0,0,732,733,1,0,0,0,733, 735,1,0,0,0,734,736,3,74,37,0,735,734,1,0,0,0,735,736,1,0,0,0,736, 738,1,0,0,0,737,739,3,72,36,0,738,737,1,0,0,0,738,739,1,0,0,0,739, - 740,1,0,0,0,740,741,5,136,0,0,741,69,1,0,0,0,742,743,5,52,0,0,743, + 740,1,0,0,0,740,741,5,137,0,0,741,69,1,0,0,0,742,743,5,53,0,0,743, 745,3,166,83,0,744,746,3,22,11,0,745,744,1,0,0,0,745,746,1,0,0,0, - 746,747,1,0,0,0,747,748,5,86,0,0,748,749,3,168,84,0,749,750,5,135, - 0,0,750,751,3,148,74,0,751,752,5,134,0,0,752,754,3,148,74,0,753, + 746,747,1,0,0,0,747,748,5,87,0,0,748,749,3,168,84,0,749,750,5,136, + 0,0,750,751,3,148,74,0,751,752,5,135,0,0,752,754,3,148,74,0,753, 755,3,76,38,0,754,753,1,0,0,0,754,755,1,0,0,0,755,757,1,0,0,0,756, 758,3,90,45,0,757,756,1,0,0,0,757,758,1,0,0,0,758,760,1,0,0,0,759, 761,3,74,37,0,760,759,1,0,0,0,760,761,1,0,0,0,761,763,1,0,0,0,762, 764,3,72,36,0,763,762,1,0,0,0,763,764,1,0,0,0,764,765,1,0,0,0,765, - 766,5,136,0,0,766,71,1,0,0,0,767,768,5,68,0,0,768,769,5,67,0,0,769, + 766,5,137,0,0,766,71,1,0,0,0,767,768,5,69,0,0,768,769,5,68,0,0,769, 770,3,166,83,0,770,73,1,0,0,0,771,772,5,9,0,0,772,773,5,7,0,0,773, - 774,3,166,83,0,774,775,5,67,0,0,775,776,3,168,84,0,776,75,1,0,0, - 0,777,778,5,12,0,0,778,787,5,15,0,0,779,780,5,12,0,0,780,781,7,1, - 0,0,781,782,5,16,0,0,782,783,5,141,0,0,783,784,3,88,44,0,784,785, - 5,142,0,0,785,787,1,0,0,0,786,777,1,0,0,0,786,779,1,0,0,0,787,77, - 1,0,0,0,788,789,5,67,0,0,789,790,5,141,0,0,790,795,3,130,65,0,791, - 792,5,137,0,0,792,794,3,130,65,0,793,791,1,0,0,0,794,797,1,0,0,0, + 774,3,166,83,0,774,775,5,68,0,0,775,776,3,168,84,0,776,75,1,0,0, + 0,777,778,5,12,0,0,778,787,5,15,0,0,779,780,5,12,0,0,780,781,7,2, + 0,0,781,782,5,16,0,0,782,783,5,142,0,0,783,784,3,88,44,0,784,785, + 5,143,0,0,785,787,1,0,0,0,786,777,1,0,0,0,786,779,1,0,0,0,787,77, + 1,0,0,0,788,789,5,68,0,0,789,790,5,142,0,0,790,795,3,130,65,0,791, + 792,5,138,0,0,792,794,3,130,65,0,793,791,1,0,0,0,794,797,1,0,0,0, 795,793,1,0,0,0,795,796,1,0,0,0,796,798,1,0,0,0,797,795,1,0,0,0, - 798,799,5,142,0,0,799,79,1,0,0,0,800,801,5,53,0,0,801,802,3,166, - 83,0,802,803,5,86,0,0,803,804,3,168,84,0,804,805,5,54,0,0,805,806, - 3,166,83,0,806,807,5,135,0,0,807,809,3,148,74,0,808,810,3,90,45, - 0,809,808,1,0,0,0,809,810,1,0,0,0,810,811,1,0,0,0,811,812,5,136, - 0,0,812,81,1,0,0,0,813,814,5,89,0,0,814,815,3,148,74,0,815,83,1, - 0,0,0,816,817,7,2,0,0,817,85,1,0,0,0,818,837,5,92,0,0,819,820,5, + 798,799,5,143,0,0,799,79,1,0,0,0,800,801,5,54,0,0,801,802,3,166, + 83,0,802,803,5,87,0,0,803,804,3,168,84,0,804,805,5,55,0,0,805,806, + 3,166,83,0,806,807,5,136,0,0,807,809,3,148,74,0,808,810,3,90,45, + 0,809,808,1,0,0,0,809,810,1,0,0,0,810,811,1,0,0,0,811,812,5,137, + 0,0,812,81,1,0,0,0,813,814,5,90,0,0,814,815,3,148,74,0,815,83,1, + 0,0,0,816,817,7,3,0,0,817,85,1,0,0,0,818,837,5,93,0,0,819,820,5, 45,0,0,820,837,3,166,83,0,821,822,5,38,0,0,822,837,3,166,83,0,823, - 824,5,47,0,0,824,833,5,141,0,0,825,830,3,26,13,0,826,827,5,137,0, + 824,5,47,0,0,824,833,5,142,0,0,825,830,3,26,13,0,826,827,5,138,0, 0,827,829,3,26,13,0,828,826,1,0,0,0,829,832,1,0,0,0,830,828,1,0, 0,0,830,831,1,0,0,0,831,834,1,0,0,0,832,830,1,0,0,0,833,825,1,0, - 0,0,833,834,1,0,0,0,834,835,1,0,0,0,835,837,5,142,0,0,836,818,1, + 0,0,833,834,1,0,0,0,834,835,1,0,0,0,835,837,5,143,0,0,836,818,1, 0,0,0,836,819,1,0,0,0,836,821,1,0,0,0,836,823,1,0,0,0,837,87,1,0, - 0,0,838,843,3,166,83,0,839,840,5,137,0,0,840,842,3,166,83,0,841, + 0,0,838,843,3,166,83,0,839,840,5,138,0,0,840,842,3,166,83,0,841, 839,1,0,0,0,842,845,1,0,0,0,843,841,1,0,0,0,843,844,1,0,0,0,844, - 89,1,0,0,0,845,843,1,0,0,0,846,847,5,91,0,0,847,851,5,139,0,0,848, + 89,1,0,0,0,845,843,1,0,0,0,846,847,5,92,0,0,847,851,5,140,0,0,848, 850,3,92,46,0,849,848,1,0,0,0,850,853,1,0,0,0,851,849,1,0,0,0,851, - 852,1,0,0,0,852,854,1,0,0,0,853,851,1,0,0,0,854,855,5,140,0,0,855, - 91,1,0,0,0,856,857,5,25,0,0,857,858,3,166,83,0,858,859,5,86,0,0, - 859,860,3,168,84,0,860,861,5,141,0,0,861,862,3,88,44,0,862,863,5, - 142,0,0,863,864,5,136,0,0,864,939,1,0,0,0,865,866,5,63,0,0,866,867, - 3,166,83,0,867,868,5,86,0,0,868,869,3,168,84,0,869,870,5,135,0,0, - 870,871,3,148,74,0,871,872,3,94,47,0,872,873,5,136,0,0,873,939,1, - 0,0,0,874,875,5,64,0,0,875,876,3,166,83,0,876,877,5,86,0,0,877,878, - 3,168,84,0,878,879,5,135,0,0,879,880,3,156,78,0,880,883,3,50,25, - 0,881,882,5,84,0,0,882,884,3,168,84,0,883,881,1,0,0,0,883,884,1, - 0,0,0,884,885,1,0,0,0,885,886,3,94,47,0,886,887,5,136,0,0,887,939, - 1,0,0,0,888,889,5,46,0,0,889,890,3,166,83,0,890,891,5,86,0,0,891, - 892,3,168,84,0,892,893,5,135,0,0,893,895,3,166,83,0,894,896,3,28, + 852,1,0,0,0,852,854,1,0,0,0,853,851,1,0,0,0,854,855,5,141,0,0,855, + 91,1,0,0,0,856,857,5,25,0,0,857,858,3,166,83,0,858,859,5,87,0,0, + 859,860,3,168,84,0,860,861,5,142,0,0,861,862,3,88,44,0,862,863,5, + 143,0,0,863,864,5,137,0,0,864,939,1,0,0,0,865,866,5,64,0,0,866,867, + 3,166,83,0,867,868,5,87,0,0,868,869,3,168,84,0,869,870,5,136,0,0, + 870,871,3,148,74,0,871,872,3,94,47,0,872,873,5,137,0,0,873,939,1, + 0,0,0,874,875,5,65,0,0,875,876,3,166,83,0,876,877,5,87,0,0,877,878, + 3,168,84,0,878,879,5,136,0,0,879,880,3,156,78,0,880,883,3,50,25, + 0,881,882,5,85,0,0,882,884,3,168,84,0,883,881,1,0,0,0,883,884,1, + 0,0,0,884,885,1,0,0,0,885,886,3,94,47,0,886,887,5,137,0,0,887,939, + 1,0,0,0,888,889,5,46,0,0,889,890,3,166,83,0,890,891,5,87,0,0,891, + 892,3,168,84,0,892,893,5,136,0,0,893,895,3,166,83,0,894,896,3,28, 14,0,895,894,1,0,0,0,895,896,1,0,0,0,896,898,1,0,0,0,897,899,3,78, 39,0,898,897,1,0,0,0,898,899,1,0,0,0,899,902,1,0,0,0,900,901,5,20, - 0,0,901,903,5,55,0,0,902,900,1,0,0,0,902,903,1,0,0,0,903,904,1,0, - 0,0,904,905,5,136,0,0,905,939,1,0,0,0,906,907,5,7,0,0,907,908,3, - 166,83,0,908,909,5,86,0,0,909,910,3,168,84,0,910,911,5,135,0,0,911, - 912,3,166,83,0,912,913,5,55,0,0,913,914,3,148,74,0,914,915,5,136, - 0,0,915,939,1,0,0,0,916,917,5,53,0,0,917,918,3,166,83,0,918,919, - 5,86,0,0,919,920,3,168,84,0,920,921,5,135,0,0,921,924,3,166,83,0, - 922,923,5,55,0,0,923,925,3,148,74,0,924,922,1,0,0,0,924,925,1,0, - 0,0,925,926,1,0,0,0,926,927,5,136,0,0,927,939,1,0,0,0,928,929,5, - 24,0,0,929,930,3,166,83,0,930,931,5,86,0,0,931,932,3,168,84,0,932, - 933,5,135,0,0,933,934,3,166,83,0,934,935,5,138,0,0,935,936,3,166, - 83,0,936,937,5,136,0,0,937,939,1,0,0,0,938,856,1,0,0,0,938,865,1, + 0,0,901,903,5,56,0,0,902,900,1,0,0,0,902,903,1,0,0,0,903,904,1,0, + 0,0,904,905,5,137,0,0,905,939,1,0,0,0,906,907,5,7,0,0,907,908,3, + 166,83,0,908,909,5,87,0,0,909,910,3,168,84,0,910,911,5,136,0,0,911, + 912,3,166,83,0,912,913,5,56,0,0,913,914,3,148,74,0,914,915,5,137, + 0,0,915,939,1,0,0,0,916,917,5,54,0,0,917,918,3,166,83,0,918,919, + 5,87,0,0,919,920,3,168,84,0,920,921,5,136,0,0,921,924,3,166,83,0, + 922,923,5,56,0,0,923,925,3,148,74,0,924,922,1,0,0,0,924,925,1,0, + 0,0,925,926,1,0,0,0,926,927,5,137,0,0,927,939,1,0,0,0,928,929,5, + 24,0,0,929,930,3,166,83,0,930,931,5,87,0,0,931,932,3,168,84,0,932, + 933,5,136,0,0,933,934,3,166,83,0,934,935,5,139,0,0,935,936,3,166, + 83,0,936,937,5,137,0,0,937,939,1,0,0,0,938,856,1,0,0,0,938,865,1, 0,0,0,938,874,1,0,0,0,938,888,1,0,0,0,938,906,1,0,0,0,938,916,1, - 0,0,0,938,928,1,0,0,0,939,93,1,0,0,0,940,941,5,141,0,0,941,946,3, - 96,48,0,942,943,5,137,0,0,943,945,3,96,48,0,944,942,1,0,0,0,945, + 0,0,0,938,928,1,0,0,0,939,93,1,0,0,0,940,941,5,142,0,0,941,946,3, + 96,48,0,942,943,5,138,0,0,943,945,3,96,48,0,944,942,1,0,0,0,945, 948,1,0,0,0,946,944,1,0,0,0,946,947,1,0,0,0,947,949,1,0,0,0,948, - 946,1,0,0,0,949,950,5,142,0,0,950,95,1,0,0,0,951,952,7,3,0,0,952, - 97,1,0,0,0,953,954,5,62,0,0,954,955,3,100,50,0,955,99,1,0,0,0,956, + 946,1,0,0,0,949,950,5,143,0,0,950,95,1,0,0,0,951,952,7,4,0,0,952, + 97,1,0,0,0,953,954,5,63,0,0,954,955,3,100,50,0,955,99,1,0,0,0,956, 959,3,102,51,0,957,959,3,106,53,0,958,956,1,0,0,0,958,957,1,0,0, - 0,959,101,1,0,0,0,960,961,5,63,0,0,961,962,3,166,83,0,962,963,5, - 86,0,0,963,964,3,168,84,0,964,965,5,73,0,0,965,966,3,166,83,0,966, - 967,5,135,0,0,967,968,3,148,74,0,968,969,5,74,0,0,969,972,3,104, - 52,0,970,971,5,75,0,0,971,973,3,158,79,0,972,970,1,0,0,0,972,973, - 1,0,0,0,973,974,1,0,0,0,974,975,5,136,0,0,975,103,1,0,0,0,976,983, - 5,108,0,0,977,978,5,109,0,0,978,979,5,143,0,0,979,980,3,148,74,0, - 980,981,5,144,0,0,981,983,1,0,0,0,982,976,1,0,0,0,982,977,1,0,0, - 0,983,105,1,0,0,0,984,985,5,64,0,0,985,986,3,166,83,0,986,987,5, - 86,0,0,987,988,3,168,84,0,988,989,5,139,0,0,989,990,3,108,54,0,990, - 991,3,108,54,0,991,992,5,140,0,0,992,107,1,0,0,0,993,994,3,50,25, - 0,994,995,5,65,0,0,995,996,3,166,83,0,996,997,5,86,0,0,997,998,3, - 168,84,0,998,1000,3,156,78,0,999,1001,5,114,0,0,1000,999,1,0,0,0, - 1000,1001,1,0,0,0,1001,1004,1,0,0,0,1002,1003,5,81,0,0,1003,1005, + 0,959,101,1,0,0,0,960,961,5,64,0,0,961,962,3,166,83,0,962,963,5, + 87,0,0,963,964,3,168,84,0,964,965,5,74,0,0,965,966,3,166,83,0,966, + 967,5,136,0,0,967,968,3,148,74,0,968,969,5,75,0,0,969,972,3,104, + 52,0,970,971,5,76,0,0,971,973,3,158,79,0,972,970,1,0,0,0,972,973, + 1,0,0,0,973,974,1,0,0,0,974,975,5,137,0,0,975,103,1,0,0,0,976,983, + 5,109,0,0,977,978,5,110,0,0,978,979,5,144,0,0,979,980,3,148,74,0, + 980,981,5,145,0,0,981,983,1,0,0,0,982,976,1,0,0,0,982,977,1,0,0, + 0,983,105,1,0,0,0,984,985,5,65,0,0,985,986,3,166,83,0,986,987,5, + 87,0,0,987,988,3,168,84,0,988,989,5,140,0,0,989,990,3,108,54,0,990, + 991,3,108,54,0,991,992,5,141,0,0,992,107,1,0,0,0,993,994,3,50,25, + 0,994,995,5,66,0,0,995,996,3,166,83,0,996,997,5,87,0,0,997,998,3, + 168,84,0,998,1000,3,156,78,0,999,1001,5,115,0,0,1000,999,1,0,0,0, + 1000,1001,1,0,0,0,1001,1004,1,0,0,0,1002,1003,5,82,0,0,1003,1005, 3,168,84,0,1004,1002,1,0,0,0,1004,1005,1,0,0,0,1005,1007,1,0,0,0, - 1006,1008,5,83,0,0,1007,1006,1,0,0,0,1007,1008,1,0,0,0,1008,1011, - 1,0,0,0,1009,1010,5,84,0,0,1010,1012,3,168,84,0,1011,1009,1,0,0, - 0,1011,1012,1,0,0,0,1012,1014,1,0,0,0,1013,1015,5,85,0,0,1014,1013, - 1,0,0,0,1014,1015,1,0,0,0,1015,1016,1,0,0,0,1016,1017,5,136,0,0, - 1017,109,1,0,0,0,1018,1020,5,56,0,0,1019,1021,3,22,11,0,1020,1019, + 1006,1008,5,84,0,0,1007,1006,1,0,0,0,1007,1008,1,0,0,0,1008,1011, + 1,0,0,0,1009,1010,5,85,0,0,1010,1012,3,168,84,0,1011,1009,1,0,0, + 0,1011,1012,1,0,0,0,1012,1014,1,0,0,0,1013,1015,5,86,0,0,1014,1013, + 1,0,0,0,1014,1015,1,0,0,0,1015,1016,1,0,0,0,1016,1017,5,137,0,0, + 1017,109,1,0,0,0,1018,1020,5,57,0,0,1019,1021,3,22,11,0,1020,1019, 1,0,0,0,1020,1021,1,0,0,0,1021,1022,1,0,0,0,1022,1024,3,166,83,0, 1023,1025,3,112,56,0,1024,1023,1,0,0,0,1024,1025,1,0,0,0,1025,1026, - 1,0,0,0,1026,1027,5,57,0,0,1027,1029,3,166,83,0,1028,1030,3,28,14, + 1,0,0,0,1026,1027,5,58,0,0,1027,1029,3,166,83,0,1028,1030,3,28,14, 0,1029,1028,1,0,0,0,1029,1030,1,0,0,0,1030,1033,1,0,0,0,1031,1032, - 5,86,0,0,1032,1034,3,168,84,0,1033,1031,1,0,0,0,1033,1034,1,0,0, - 0,1034,1037,1,0,0,0,1035,1036,5,80,0,0,1036,1038,5,149,0,0,1037, - 1035,1,0,0,0,1037,1038,1,0,0,0,1038,1039,1,0,0,0,1039,1043,5,139, + 5,87,0,0,1032,1034,3,168,84,0,1033,1031,1,0,0,0,1033,1034,1,0,0, + 0,1034,1037,1,0,0,0,1035,1036,5,81,0,0,1036,1038,5,150,0,0,1037, + 1035,1,0,0,0,1037,1038,1,0,0,0,1038,1039,1,0,0,0,1039,1043,5,140, 0,0,1040,1042,3,114,57,0,1041,1040,1,0,0,0,1042,1045,1,0,0,0,1043, 1041,1,0,0,0,1043,1044,1,0,0,0,1044,1046,1,0,0,0,1045,1043,1,0,0, - 0,1046,1047,5,140,0,0,1047,111,1,0,0,0,1048,1049,3,28,14,0,1049, - 113,1,0,0,0,1050,1051,5,61,0,0,1051,1058,3,100,50,0,1052,1058,3, + 0,1046,1047,5,141,0,0,1047,111,1,0,0,0,1048,1049,3,28,14,0,1049, + 113,1,0,0,0,1050,1051,5,62,0,0,1051,1058,3,100,50,0,1052,1058,3, 128,64,0,1053,1058,3,124,62,0,1054,1058,3,118,59,0,1055,1058,3,126, 63,0,1056,1058,3,116,58,0,1057,1050,1,0,0,0,1057,1052,1,0,0,0,1057, 1053,1,0,0,0,1057,1054,1,0,0,0,1057,1055,1,0,0,0,1057,1056,1,0,0, - 0,1058,115,1,0,0,0,1059,1060,5,58,0,0,1060,1061,3,166,83,0,1061, - 1062,5,60,0,0,1062,1063,3,166,83,0,1063,1064,5,138,0,0,1064,1065, - 3,166,83,0,1065,1066,5,136,0,0,1066,117,1,0,0,0,1067,1068,5,10,0, - 0,1068,1072,5,139,0,0,1069,1071,3,120,60,0,1070,1069,1,0,0,0,1071, + 0,1058,115,1,0,0,0,1059,1060,5,59,0,0,1060,1061,3,166,83,0,1061, + 1062,5,61,0,0,1062,1063,3,166,83,0,1063,1064,5,139,0,0,1064,1065, + 3,166,83,0,1065,1066,5,137,0,0,1066,117,1,0,0,0,1067,1068,5,10,0, + 0,1068,1072,5,140,0,0,1069,1071,3,120,60,0,1070,1069,1,0,0,0,1071, 1074,1,0,0,0,1072,1070,1,0,0,0,1072,1073,1,0,0,0,1073,1075,1,0,0, - 0,1074,1072,1,0,0,0,1075,1076,5,140,0,0,1076,1077,5,136,0,0,1077, - 119,1,0,0,0,1078,1079,3,166,83,0,1079,1080,5,60,0,0,1080,1081,5, - 63,0,0,1081,1082,3,166,83,0,1082,1083,5,136,0,0,1083,1093,1,0,0, - 0,1084,1085,3,166,83,0,1085,1086,5,60,0,0,1086,1087,5,64,0,0,1087, - 1088,3,166,83,0,1088,1089,5,138,0,0,1089,1090,3,166,83,0,1090,1091, - 5,136,0,0,1091,1093,1,0,0,0,1092,1078,1,0,0,0,1092,1084,1,0,0,0, + 0,1074,1072,1,0,0,0,1075,1076,5,141,0,0,1076,1077,5,137,0,0,1077, + 119,1,0,0,0,1078,1079,3,166,83,0,1079,1080,5,61,0,0,1080,1081,5, + 64,0,0,1081,1082,3,166,83,0,1082,1083,5,137,0,0,1083,1093,1,0,0, + 0,1084,1085,3,166,83,0,1085,1086,5,61,0,0,1086,1087,5,65,0,0,1087, + 1088,3,166,83,0,1088,1089,5,139,0,0,1089,1090,3,166,83,0,1090,1091, + 5,137,0,0,1091,1093,1,0,0,0,1092,1078,1,0,0,0,1092,1084,1,0,0,0, 1093,121,1,0,0,0,1094,1095,3,26,13,0,1095,1096,5,20,0,0,1096,1101, - 5,55,0,0,1097,1098,5,138,0,0,1098,1100,3,166,83,0,1099,1097,1,0, + 5,56,0,0,1097,1098,5,139,0,0,1098,1100,3,166,83,0,1099,1097,1,0, 0,0,1100,1103,1,0,0,0,1101,1099,1,0,0,0,1101,1102,1,0,0,0,1102,1104, - 1,0,0,0,1103,1101,1,0,0,0,1104,1105,5,136,0,0,1105,123,1,0,0,0,1106, - 1107,5,58,0,0,1107,1108,3,166,83,0,1108,1109,5,60,0,0,1109,1110, - 5,63,0,0,1110,1111,3,166,83,0,1111,1112,5,136,0,0,1112,125,1,0,0, - 0,1113,1114,5,70,0,0,1114,1115,3,166,83,0,1115,1116,5,71,0,0,1116, - 1117,5,72,0,0,1117,1118,5,67,0,0,1118,1119,5,53,0,0,1119,1120,3, - 166,83,0,1120,1121,5,69,0,0,1121,1122,5,64,0,0,1122,1123,3,166,83, - 0,1123,1124,5,138,0,0,1124,1125,3,166,83,0,1125,1126,5,136,0,0,1126, - 127,1,0,0,0,1127,1128,5,58,0,0,1128,1129,3,130,65,0,1129,1130,5, - 60,0,0,1130,1133,3,134,67,0,1131,1132,5,36,0,0,1132,1134,3,168,84, + 1,0,0,0,1103,1101,1,0,0,0,1104,1105,5,137,0,0,1105,123,1,0,0,0,1106, + 1107,5,59,0,0,1107,1108,3,166,83,0,1108,1109,5,61,0,0,1109,1110, + 5,64,0,0,1110,1111,3,166,83,0,1111,1112,5,137,0,0,1112,125,1,0,0, + 0,1113,1114,5,71,0,0,1114,1115,3,166,83,0,1115,1116,5,72,0,0,1116, + 1117,5,73,0,0,1117,1118,5,68,0,0,1118,1119,5,54,0,0,1119,1120,3, + 166,83,0,1120,1121,5,70,0,0,1121,1122,5,65,0,0,1122,1123,3,166,83, + 0,1123,1124,5,139,0,0,1124,1125,3,166,83,0,1125,1126,5,137,0,0,1126, + 127,1,0,0,0,1127,1128,5,59,0,0,1128,1129,3,130,65,0,1129,1130,5, + 61,0,0,1130,1133,3,134,67,0,1131,1132,5,36,0,0,1132,1134,3,168,84, 0,1133,1131,1,0,0,0,1133,1134,1,0,0,0,1134,1135,1,0,0,0,1135,1136, - 5,136,0,0,1136,129,1,0,0,0,1137,1138,3,166,83,0,1138,1139,5,138, + 5,137,0,0,1136,129,1,0,0,0,1137,1138,3,166,83,0,1138,1139,5,139, 0,0,1139,1140,3,132,66,0,1140,131,1,0,0,0,1141,1154,3,166,83,0,1142, - 1154,5,103,0,0,1143,1154,5,93,0,0,1144,1154,5,94,0,0,1145,1154,5, - 1,0,0,1146,1154,5,100,0,0,1147,1154,5,101,0,0,1148,1154,5,102,0, - 0,1149,1154,5,104,0,0,1150,1154,5,105,0,0,1151,1154,5,106,0,0,1152, - 1154,5,107,0,0,1153,1141,1,0,0,0,1153,1142,1,0,0,0,1153,1143,1,0, + 1154,5,104,0,0,1143,1154,5,94,0,0,1144,1154,5,95,0,0,1145,1154,5, + 1,0,0,1146,1154,5,101,0,0,1147,1154,5,102,0,0,1148,1154,5,103,0, + 0,1149,1154,5,105,0,0,1150,1154,5,106,0,0,1151,1154,5,107,0,0,1152, + 1154,5,108,0,0,1153,1141,1,0,0,0,1153,1142,1,0,0,0,1153,1143,1,0, 0,0,1153,1144,1,0,0,0,1153,1145,1,0,0,0,1153,1146,1,0,0,0,1153,1147, 1,0,0,0,1153,1148,1,0,0,0,1153,1149,1,0,0,0,1153,1150,1,0,0,0,1153, - 1151,1,0,0,0,1153,1152,1,0,0,0,1154,133,1,0,0,0,1155,1156,5,82,0, - 0,1156,1157,5,138,0,0,1157,1192,3,166,83,0,1158,1159,5,63,0,0,1159, - 1160,3,166,83,0,1160,1161,5,138,0,0,1161,1162,3,138,69,0,1162,1192, - 1,0,0,0,1163,1164,5,64,0,0,1164,1165,3,166,83,0,1165,1166,5,138, - 0,0,1166,1167,3,166,83,0,1167,1168,5,138,0,0,1168,1169,3,140,70, + 1151,1,0,0,0,1153,1152,1,0,0,0,1154,133,1,0,0,0,1155,1156,5,83,0, + 0,1156,1157,5,139,0,0,1157,1192,3,166,83,0,1158,1159,5,64,0,0,1159, + 1160,3,166,83,0,1160,1161,5,139,0,0,1161,1162,3,138,69,0,1162,1192, + 1,0,0,0,1163,1164,5,65,0,0,1164,1165,3,166,83,0,1165,1166,5,139, + 0,0,1166,1167,3,166,83,0,1167,1168,5,139,0,0,1168,1169,3,140,70, 0,1169,1192,1,0,0,0,1170,1171,5,46,0,0,1171,1173,3,166,83,0,1172, 1174,3,28,14,0,1173,1172,1,0,0,0,1173,1174,1,0,0,0,1174,1175,1,0, - 0,0,1175,1176,5,138,0,0,1176,1177,3,130,65,0,1177,1192,1,0,0,0,1178, - 1179,5,48,0,0,1179,1180,3,166,83,0,1180,1181,5,138,0,0,1181,1183, + 0,0,1175,1176,5,139,0,0,1176,1177,3,130,65,0,1177,1192,1,0,0,0,1178, + 1179,5,48,0,0,1179,1180,3,166,83,0,1180,1181,5,139,0,0,1181,1183, 3,166,83,0,1182,1184,3,28,14,0,1183,1182,1,0,0,0,1183,1184,1,0,0, 0,1184,1186,1,0,0,0,1185,1187,3,142,71,0,1186,1185,1,0,0,0,1186, 1187,1,0,0,0,1187,1189,1,0,0,0,1188,1190,3,136,68,0,1189,1188,1, 0,0,0,1189,1190,1,0,0,0,1190,1192,1,0,0,0,1191,1155,1,0,0,0,1191, 1158,1,0,0,0,1191,1163,1,0,0,0,1191,1170,1,0,0,0,1191,1178,1,0,0, - 0,1192,135,1,0,0,0,1193,1194,5,68,0,0,1194,1195,3,142,71,0,1195, - 137,1,0,0,0,1196,1197,7,4,0,0,1197,139,1,0,0,0,1198,1199,7,5,0,0, - 1199,141,1,0,0,0,1200,1201,5,66,0,0,1201,1205,5,139,0,0,1202,1204, + 0,1192,135,1,0,0,0,1193,1194,5,69,0,0,1194,1195,3,142,71,0,1195, + 137,1,0,0,0,1196,1197,7,5,0,0,1197,139,1,0,0,0,1198,1199,7,6,0,0, + 1199,141,1,0,0,0,1200,1201,5,67,0,0,1201,1205,5,140,0,0,1202,1204, 3,144,72,0,1203,1202,1,0,0,0,1204,1207,1,0,0,0,1205,1203,1,0,0,0, 1205,1206,1,0,0,0,1206,1208,1,0,0,0,1207,1205,1,0,0,0,1208,1209, - 5,140,0,0,1209,143,1,0,0,0,1210,1211,3,166,83,0,1211,1212,5,60,0, - 0,1212,1213,5,11,0,0,1213,1214,5,25,0,0,1214,1215,5,141,0,0,1215, - 1216,3,88,44,0,1216,1217,5,142,0,0,1217,1218,5,136,0,0,1218,1309, - 1,0,0,0,1219,1220,3,166,83,0,1220,1221,5,60,0,0,1221,1222,5,63,0, - 0,1222,1229,3,166,83,0,1223,1224,5,69,0,0,1224,1225,5,64,0,0,1225, - 1226,3,166,83,0,1226,1227,5,138,0,0,1227,1228,3,166,83,0,1228,1230, + 5,141,0,0,1209,143,1,0,0,0,1210,1211,3,166,83,0,1211,1212,5,61,0, + 0,1212,1213,5,11,0,0,1213,1214,5,25,0,0,1214,1215,5,142,0,0,1215, + 1216,3,88,44,0,1216,1217,5,143,0,0,1217,1218,5,137,0,0,1218,1309, + 1,0,0,0,1219,1220,3,166,83,0,1220,1221,5,61,0,0,1221,1222,5,64,0, + 0,1222,1229,3,166,83,0,1223,1224,5,70,0,0,1224,1225,5,65,0,0,1225, + 1226,3,166,83,0,1226,1227,5,139,0,0,1227,1228,3,166,83,0,1228,1230, 1,0,0,0,1229,1223,1,0,0,0,1229,1230,1,0,0,0,1230,1231,1,0,0,0,1231, - 1232,5,136,0,0,1232,1309,1,0,0,0,1233,1234,3,166,83,0,1234,1235, - 5,60,0,0,1235,1236,5,64,0,0,1236,1237,3,166,83,0,1237,1238,5,138, - 0,0,1238,1245,3,166,83,0,1239,1240,5,69,0,0,1240,1241,5,64,0,0,1241, - 1242,3,166,83,0,1242,1243,5,138,0,0,1243,1244,3,166,83,0,1244,1246, + 1232,5,137,0,0,1232,1309,1,0,0,0,1233,1234,3,166,83,0,1234,1235, + 5,61,0,0,1235,1236,5,65,0,0,1236,1237,3,166,83,0,1237,1238,5,139, + 0,0,1238,1245,3,166,83,0,1239,1240,5,70,0,0,1240,1241,5,65,0,0,1241, + 1242,3,166,83,0,1242,1243,5,139,0,0,1243,1244,3,166,83,0,1244,1246, 1,0,0,0,1245,1239,1,0,0,0,1245,1246,1,0,0,0,1246,1247,1,0,0,0,1247, - 1248,5,136,0,0,1248,1309,1,0,0,0,1249,1250,3,166,83,0,1250,1251, - 5,60,0,0,1251,1252,5,46,0,0,1252,1254,3,166,83,0,1253,1255,3,28, + 1248,5,137,0,0,1248,1309,1,0,0,0,1249,1250,3,166,83,0,1250,1251, + 5,61,0,0,1251,1252,5,46,0,0,1252,1254,3,166,83,0,1253,1255,3,28, 14,0,1254,1253,1,0,0,0,1254,1255,1,0,0,0,1255,1264,1,0,0,0,1256, - 1257,5,69,0,0,1257,1258,5,64,0,0,1258,1259,3,166,83,0,1259,1260, - 5,138,0,0,1260,1261,3,166,83,0,1261,1265,1,0,0,0,1262,1263,5,20, - 0,0,1263,1265,5,55,0,0,1264,1256,1,0,0,0,1264,1262,1,0,0,0,1264, - 1265,1,0,0,0,1265,1266,1,0,0,0,1266,1267,5,136,0,0,1267,1309,1,0, - 0,0,1268,1269,3,166,83,0,1269,1270,5,60,0,0,1270,1271,5,7,0,0,1271, - 1272,3,166,83,0,1272,1273,5,66,0,0,1273,1277,5,139,0,0,1274,1276, + 1257,5,70,0,0,1257,1258,5,65,0,0,1258,1259,3,166,83,0,1259,1260, + 5,139,0,0,1260,1261,3,166,83,0,1261,1265,1,0,0,0,1262,1263,5,20, + 0,0,1263,1265,5,56,0,0,1264,1256,1,0,0,0,1264,1262,1,0,0,0,1264, + 1265,1,0,0,0,1265,1266,1,0,0,0,1266,1267,5,137,0,0,1267,1309,1,0, + 0,0,1268,1269,3,166,83,0,1269,1270,5,61,0,0,1270,1271,5,7,0,0,1271, + 1272,3,166,83,0,1272,1273,5,67,0,0,1273,1277,5,140,0,0,1274,1276, 3,122,61,0,1275,1274,1,0,0,0,1276,1279,1,0,0,0,1277,1275,1,0,0,0, 1277,1278,1,0,0,0,1278,1280,1,0,0,0,1279,1277,1,0,0,0,1280,1281, - 5,140,0,0,1281,1282,5,136,0,0,1282,1309,1,0,0,0,1283,1284,3,166, - 83,0,1284,1285,5,60,0,0,1285,1286,5,53,0,0,1286,1287,3,166,83,0, - 1287,1288,5,136,0,0,1288,1309,1,0,0,0,1289,1290,3,166,83,0,1290, - 1292,5,60,0,0,1291,1293,5,11,0,0,1292,1291,1,0,0,0,1292,1293,1,0, + 5,141,0,0,1281,1282,5,137,0,0,1282,1309,1,0,0,0,1283,1284,3,166, + 83,0,1284,1285,5,61,0,0,1285,1286,5,54,0,0,1286,1287,3,166,83,0, + 1287,1288,5,137,0,0,1288,1309,1,0,0,0,1289,1290,3,166,83,0,1290, + 1292,5,61,0,0,1291,1293,5,11,0,0,1292,1291,1,0,0,0,1292,1293,1,0, 0,0,1293,1294,1,0,0,0,1294,1295,5,24,0,0,1295,1296,3,166,83,0,1296, - 1297,5,138,0,0,1297,1304,3,166,83,0,1298,1299,5,69,0,0,1299,1300, - 5,64,0,0,1300,1301,3,166,83,0,1301,1302,5,138,0,0,1302,1303,3,166, + 1297,5,139,0,0,1297,1304,3,166,83,0,1298,1299,5,70,0,0,1299,1300, + 5,65,0,0,1300,1301,3,166,83,0,1301,1302,5,139,0,0,1302,1303,3,166, 83,0,1303,1305,1,0,0,0,1304,1298,1,0,0,0,1304,1305,1,0,0,0,1305, - 1306,1,0,0,0,1306,1307,5,136,0,0,1307,1309,1,0,0,0,1308,1210,1,0, + 1306,1,0,0,0,1306,1307,5,137,0,0,1307,1309,1,0,0,0,1308,1210,1,0, 0,0,1308,1219,1,0,0,0,1308,1233,1,0,0,0,1308,1249,1,0,0,0,1308,1268, 1,0,0,0,1308,1283,1,0,0,0,1308,1289,1,0,0,0,1309,145,1,0,0,0,1310, - 1311,5,53,0,0,1311,1312,3,166,83,0,1312,1313,5,60,0,0,1313,1314, - 3,166,83,0,1314,1315,5,138,0,0,1315,1317,3,166,83,0,1316,1318,3, + 1311,5,54,0,0,1311,1312,3,166,83,0,1312,1313,5,61,0,0,1313,1314, + 3,166,83,0,1314,1315,5,139,0,0,1315,1317,3,166,83,0,1316,1318,3, 142,71,0,1317,1316,1,0,0,0,1317,1318,1,0,0,0,1318,1319,1,0,0,0,1319, - 1320,5,136,0,0,1320,147,1,0,0,0,1321,1379,3,154,77,0,1322,1379,5, - 115,0,0,1323,1379,5,116,0,0,1324,1325,5,117,0,0,1325,1379,3,168, - 84,0,1326,1327,5,118,0,0,1327,1328,5,145,0,0,1328,1329,3,166,83, - 0,1329,1330,5,146,0,0,1330,1379,1,0,0,0,1331,1332,5,119,0,0,1332, - 1333,5,145,0,0,1333,1335,3,166,83,0,1334,1336,3,28,14,0,1335,1334, - 1,0,0,0,1335,1336,1,0,0,0,1336,1337,1,0,0,0,1337,1338,5,146,0,0, - 1338,1379,1,0,0,0,1339,1340,5,41,0,0,1340,1341,5,145,0,0,1341,1342, - 3,166,83,0,1342,1343,5,146,0,0,1343,1379,1,0,0,0,1344,1345,5,120, - 0,0,1345,1346,5,145,0,0,1346,1347,3,148,74,0,1347,1348,5,146,0,0, - 1348,1379,1,0,0,0,1349,1350,5,121,0,0,1350,1351,5,145,0,0,1351,1352, - 3,148,74,0,1352,1353,5,146,0,0,1353,1379,1,0,0,0,1354,1355,5,122, - 0,0,1355,1359,5,139,0,0,1356,1358,3,150,75,0,1357,1356,1,0,0,0,1358, + 1320,5,137,0,0,1320,147,1,0,0,0,1321,1379,3,154,77,0,1322,1379,5, + 116,0,0,1323,1379,5,117,0,0,1324,1325,5,118,0,0,1325,1379,3,168, + 84,0,1326,1327,5,119,0,0,1327,1328,5,146,0,0,1328,1329,3,166,83, + 0,1329,1330,5,147,0,0,1330,1379,1,0,0,0,1331,1332,5,120,0,0,1332, + 1333,5,146,0,0,1333,1335,3,166,83,0,1334,1336,3,28,14,0,1335,1334, + 1,0,0,0,1335,1336,1,0,0,0,1336,1337,1,0,0,0,1337,1338,5,147,0,0, + 1338,1379,1,0,0,0,1339,1340,5,41,0,0,1340,1341,5,146,0,0,1341,1342, + 3,166,83,0,1342,1343,5,147,0,0,1343,1379,1,0,0,0,1344,1345,5,121, + 0,0,1345,1346,5,146,0,0,1346,1347,3,148,74,0,1347,1348,5,147,0,0, + 1348,1379,1,0,0,0,1349,1350,5,122,0,0,1350,1351,5,146,0,0,1351,1352, + 3,148,74,0,1352,1353,5,147,0,0,1353,1379,1,0,0,0,1354,1355,5,123, + 0,0,1355,1359,5,140,0,0,1356,1358,3,150,75,0,1357,1356,1,0,0,0,1358, 1361,1,0,0,0,1359,1357,1,0,0,0,1359,1360,1,0,0,0,1360,1362,1,0,0, - 0,1361,1359,1,0,0,0,1362,1379,5,140,0,0,1363,1364,5,8,0,0,1364,1365, - 5,86,0,0,1365,1366,3,168,84,0,1366,1368,5,139,0,0,1367,1369,3,152, + 0,1361,1359,1,0,0,0,1362,1379,5,141,0,0,1363,1364,5,8,0,0,1364,1365, + 5,87,0,0,1365,1366,3,168,84,0,1366,1368,5,140,0,0,1367,1369,3,152, 76,0,1368,1367,1,0,0,0,1369,1370,1,0,0,0,1370,1368,1,0,0,0,1370, - 1371,1,0,0,0,1371,1372,1,0,0,0,1372,1373,5,140,0,0,1373,1379,1,0, + 1371,1,0,0,0,1371,1372,1,0,0,0,1372,1373,5,141,0,0,1373,1379,1,0, 0,0,1374,1376,3,166,83,0,1375,1377,3,28,14,0,1376,1375,1,0,0,0,1376, 1377,1,0,0,0,1377,1379,1,0,0,0,1378,1321,1,0,0,0,1378,1322,1,0,0, 0,1378,1323,1,0,0,0,1378,1324,1,0,0,0,1378,1326,1,0,0,0,1378,1331, 1,0,0,0,1378,1339,1,0,0,0,1378,1344,1,0,0,0,1378,1349,1,0,0,0,1378, 1354,1,0,0,0,1378,1363,1,0,0,0,1378,1374,1,0,0,0,1379,149,1,0,0, - 0,1380,1381,3,166,83,0,1381,1382,5,135,0,0,1382,1383,3,148,74,0, - 1383,1384,5,136,0,0,1384,151,1,0,0,0,1385,1386,3,166,83,0,1386,1387, - 5,86,0,0,1387,1388,3,168,84,0,1388,1389,5,135,0,0,1389,1390,3,148, - 74,0,1390,1391,5,136,0,0,1391,153,1,0,0,0,1392,1393,7,6,0,0,1393, - 155,1,0,0,0,1394,1395,7,7,0,0,1395,157,1,0,0,0,1396,1405,3,168,84, - 0,1397,1405,5,149,0,0,1398,1405,5,150,0,0,1399,1405,5,131,0,0,1400, - 1405,5,132,0,0,1401,1405,5,133,0,0,1402,1405,3,160,80,0,1403,1405, + 0,1380,1381,3,166,83,0,1381,1382,5,136,0,0,1382,1383,3,148,74,0, + 1383,1384,5,137,0,0,1384,151,1,0,0,0,1385,1386,3,166,83,0,1386,1387, + 5,87,0,0,1387,1388,3,168,84,0,1388,1389,5,136,0,0,1389,1390,3,148, + 74,0,1390,1391,5,137,0,0,1391,153,1,0,0,0,1392,1393,7,7,0,0,1393, + 155,1,0,0,0,1394,1395,7,8,0,0,1395,157,1,0,0,0,1396,1405,3,168,84, + 0,1397,1405,5,150,0,0,1398,1405,5,151,0,0,1399,1405,5,132,0,0,1400, + 1405,5,133,0,0,1401,1405,5,134,0,0,1402,1405,3,160,80,0,1403,1405, 3,164,82,0,1404,1396,1,0,0,0,1404,1397,1,0,0,0,1404,1398,1,0,0,0, 1404,1399,1,0,0,0,1404,1400,1,0,0,0,1404,1401,1,0,0,0,1404,1402, - 1,0,0,0,1404,1403,1,0,0,0,1405,159,1,0,0,0,1406,1415,5,139,0,0,1407, - 1412,3,162,81,0,1408,1409,5,137,0,0,1409,1411,3,162,81,0,1410,1408, + 1,0,0,0,1404,1403,1,0,0,0,1405,159,1,0,0,0,1406,1415,5,140,0,0,1407, + 1412,3,162,81,0,1408,1409,5,138,0,0,1409,1411,3,162,81,0,1410,1408, 1,0,0,0,1411,1414,1,0,0,0,1412,1410,1,0,0,0,1412,1413,1,0,0,0,1413, 1416,1,0,0,0,1414,1412,1,0,0,0,1415,1407,1,0,0,0,1415,1416,1,0,0, - 0,1416,1417,1,0,0,0,1417,1418,5,140,0,0,1418,161,1,0,0,0,1419,1420, - 3,168,84,0,1420,1421,5,135,0,0,1421,1422,3,158,79,0,1422,163,1,0, - 0,0,1423,1432,5,141,0,0,1424,1429,3,158,79,0,1425,1426,5,137,0,0, + 0,1416,1417,1,0,0,0,1417,1418,5,141,0,0,1418,161,1,0,0,0,1419,1420, + 3,168,84,0,1420,1421,5,136,0,0,1421,1422,3,158,79,0,1422,163,1,0, + 0,0,1423,1432,5,142,0,0,1424,1429,3,158,79,0,1425,1426,5,138,0,0, 1426,1428,3,158,79,0,1427,1425,1,0,0,0,1428,1431,1,0,0,0,1429,1427, 1,0,0,0,1429,1430,1,0,0,0,1430,1433,1,0,0,0,1431,1429,1,0,0,0,1432, - 1424,1,0,0,0,1432,1433,1,0,0,0,1433,1434,1,0,0,0,1434,1435,5,142, - 0,0,1435,165,1,0,0,0,1436,1437,7,8,0,0,1437,167,1,0,0,0,1438,1439, - 5,152,0,0,1439,169,1,0,0,0,129,182,189,210,223,235,255,263,270,276, + 1424,1,0,0,0,1432,1433,1,0,0,0,1433,1434,1,0,0,0,1434,1435,5,143, + 0,0,1435,165,1,0,0,0,1436,1437,7,9,0,0,1437,167,1,0,0,0,1438,1439, + 5,153,0,0,1439,169,1,0,0,0,129,182,189,210,223,235,255,263,270,276, 288,291,297,308,317,327,330,332,336,344,356,361,371,381,386,401, 407,419,428,436,444,457,460,470,474,480,487,493,501,509,522,529, 533,538,549,555,566,592,596,602,613,622,628,633,635,666,670,676, @@ -7029,9 +7037,6 @@ export class ValueMemberContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); } - public VALUE(): antlr.TerminalNode { - return this.getToken(QuixosCapabilityParser.VALUE, 0)!; - } public identifier(): IdentifierContext { return this.getRuleContext(0, IdentifierContext)!; } @@ -7053,6 +7058,12 @@ export class ValueMemberContext extends antlr.ParserRuleContext { public RBRACE(): antlr.TerminalNode { return this.getToken(QuixosCapabilityParser.RBRACE, 0)!; } + public VALUE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.VALUE, 0); + } + public FIELD(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.FIELD, 0); + } public queryReadContract(): QueryReadContractContext | null { return this.getRuleContext(0, QueryReadContractContext); } diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index d243077..5734516 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -529,6 +529,7 @@ const lowerValueMember = (state: LoweringState, context: ValueMemberContext): In } return { kind: "value", + ...(context.FIELD() ? { nativeField: true as const } : {}), ...(context.queryReadContract() ? { queryRead: { @@ -794,6 +795,7 @@ const lowerInterfaceTemplate = ( const type = types.expression(value.valueType()); return { kind: "value", + ...(value.FIELD() ? { nativeField: true as const } : {}), ...(value.queryReadContract() ? { queryRead: { diff --git a/src/capability-model/generics.ts b/src/capability-model/generics.ts index 907b319..b0dae59 100644 --- a/src/capability-model/generics.ts +++ b/src/capability-model/generics.ts @@ -98,6 +98,7 @@ export const instantiateInterface = ( return { ...common, kind: "value", + ...(member.nativeField ? { nativeField: true as const } : {}), ...(member.queryRead ? { queryRead: { ...member.queryRead } } : {}), valueType: substitution.value(member.valueType, member.displayName), }; diff --git a/src/capability-model/types.ts b/src/capability-model/types.ts index 61d3e90..6d38feb 100644 --- a/src/capability-model/types.ts +++ b/src/capability-model/types.ts @@ -132,6 +132,8 @@ interface InterfaceMemberBase { export interface ValueInterfaceMember extends InterfaceMemberBase { kind: "value"; + /** Every operation resolves directly to the same native state slot. */ + nativeField?: true; queryRead?: QueryReadContract; valueType: Type; } diff --git a/src/capability-model/validation.ts b/src/capability-model/validation.ts index a93d16d..d86b3f3 100644 --- a/src/capability-model/validation.ts +++ b/src/capability-model/validation.ts @@ -615,6 +615,23 @@ const collectIdentityIndexes = ( ); } } + if (member.kind === "value" && member.nativeField) { + const names = member.operations.map((o) => o.displayName); + if ( + !isStorableType(member.valueType) || + !names.includes("get") || + names.some((n) => !["get", "set", "edit"].includes(n)) || + (names.includes("set") && names.includes("edit")) + ) + issue( + issues, + "invalid-state-binding", + memberPath, + "Fields require a storable value, a native getter and at most one setter or editor", + ); + if (member.queryRead && member.queryRead.execution !== "native") + issue(issues, "invalid-query-contract", memberPath, "Fields cannot have package-backed query reads"); + } requireText(issues, member.id, `${memberPath}.id`, "Member ID"); requireText(issues, member.displayName, `${memberPath}.displayName`, "Member name"); if (memberIds.has(member.id)) { @@ -1758,6 +1775,34 @@ const validateConformances = ( } } else binding = entry.binding; const member = operationEntry.member; + if (member.kind === "value" && member.nativeField) { + const primitive = { get: "read", set: "write", edit: "edit" }[operation.displayName]; + const getter = member.operations.find((o) => o.displayName === "get"); + let read: Binding | undefined; + try { + if (getter) + read = resolveForwardedBinding( + workspace, + conformance.atomId, + conformance.interfaceRevisionId, + getter.id, + ).binding; + } catch {} + if ( + binding.kind !== "state" || + binding.primitive !== primitive || + read?.kind !== "state" || + read.primitive !== "read" || + read.slotId !== binding.slotId + ) + issue( + issues, + "invalid-state-binding", + bindingPath, + "Field operations must resolve to the same native state slot", + ); + } + if ( member.kind === "value" && operation.displayName === "edit" && diff --git a/src/execution-world/client-contracts.ts b/src/execution-world/client-contracts.ts index 6977abe..e13fe97 100644 --- a/src/execution-world/client-contracts.ts +++ b/src/execution-world/client-contracts.ts @@ -17,6 +17,7 @@ export interface PublicOperationContract { execution: ExecutionContract; input: unknown; output: unknown; + fieldPolicy?: "register" | "crdt"; } export function publicOperationContract( iface: InterfaceRevision, @@ -29,7 +30,20 @@ export function publicOperationContract( "Expected a closed interface call operation", ); const execution = operation.execution ?? { kind: "remote" }; + const member = iface.members.find((m) => m.operations.includes(operation))!; + const fieldPolicy = + member.kind === "value" && + operation.scope !== "class" && + execution.kind === "transaction" && + execution.targets.includes("browser") + ? operation.displayName === "edit" + ? "crdt" + : member.nativeField && operation.displayName === "set" + ? "register" + : undefined + : undefined; return { + ...(fieldPolicy ? { fieldPolicy } : {}), interface: iface.revisionId, operation: operation.id, scope: operation.scope ?? "object", @@ -116,15 +130,17 @@ export function generateInterfaceClientBindings( } const operations = member.operations .filter((op) => op.mode === "call") - .map( - (op) => - `${JSON.stringify(op.displayName)}: defineInterfaceOperation<${tsType(op.inputType)}, ${tsType(op.outputType)}, ${JSON.stringify(publicOperationContract(iface, op).execution)}>(${JSON.stringify(publicOperationContract(iface, op))})`, - ); + .map((op) => { + const contract = publicOperationContract(iface, op); + return contract.fieldPolicy && member.kind === "value" + ? `${JSON.stringify(op.displayName)}: defineFieldOperation<${tsType(member.valueType)}, ${JSON.stringify(contract.fieldPolicy)}, ${JSON.stringify(contract.execution)}>(${JSON.stringify(contract)})` + : `${JSON.stringify(op.displayName)}: defineInterfaceOperation<${tsType(op.inputType)}, ${tsType(op.outputType)}, ${JSON.stringify(contract.execution)}>(${JSON.stringify(contract)})`; + }); return `${JSON.stringify(member.displayName)}: {${operations.join(",\n")}}`; }); return `${JSON.stringify(alias)}: {${members.join(",\n")}}`; }); - return `// Generated from imported interface contracts. Regenerate; do not edit.\nimport { defineModuleMember, defineInterfaceOperation, type PreparedChange, type ManagedReference } from ${JSON.stringify(runtimeModule)};\nexport const interfaces = {${entries.join(",\n")}} as const;\n`; + return `// Generated from imported interface contracts. Regenerate; do not edit.\nimport { defineModuleMember, defineInterfaceOperation, defineFieldOperation, type PreparedChange, type ManagedReference } from ${JSON.stringify(runtimeModule)};\nexport const interfaces = {${entries.join(",\n")}} as const;\n`; } export function generatePackageQueryClientBindings( diff --git a/test/client-contracts.test.ts b/test/client-contracts.test.ts index 2af458b..6925f40 100644 --- a/test/client-contracts.test.ts +++ b/test/client-contracts.test.ts @@ -22,6 +22,95 @@ const parsed = compileCapabilityResourceSource( assert.ok(parsed.ok && parsed.resource.kind === "interface", JSON.stringify(parsed.diagnostics)); const iface = parsed.resource.revision; const environment = { interfaces: new Map([["Data", iface]]), interfaceClosure: [iface] }; +test("native fields certify one storage slot; only browser writes get live descriptors", () => { + const parsed = compileCapabilityResourceSource( + `interface Fields id "fields" revision "fields@1" { + queryable field position id "position" : string { + get id "position:get" execution snapshot targets [browser, server]; + set id "position:set" execution transaction targets [browser, server]; + } + field remote id "remote" : string { + get id "remote:get"; + set id "remote:set"; + } + value arbitrary id "arbitrary" : string { + get id "arbitrary:get" execution snapshot targets [browser,server]; + set id "arbitrary:set" execution transaction targets [browser, server]; + } + value text id "text" : string { + get id "text:get"; + edit id "text:edit" execution transaction targets [browser, server]; + } + }`, + { source }, + ); + assert.ok(parsed.ok && parsed.resource.kind === "interface", JSON.stringify(parsed.diagnostics)); + const revision = parsed.resource.revision; + const generated = generateInterfaceClientBindings({ Fields: revision }); + assert.match(generated, /defineFieldOperation d.message.includes("same native state slot")), + JSON.stringify(bad.diagnostics), + ); + const forwarded = workspace + .replace("bind position.get to state First.read", "bind position.get to interface Fields.arbitrary.get") + .replace("bind position.set to state First.write", "bind position.set to interface Fields.arbitrary.set"); + const goodForward = compileCapabilitySource(forwarded, "workspace.qx", env); + assert.ok(goodForward.ok, JSON.stringify(goodForward.diagnostics)); + const pkg = compileCapabilityResourceSource( + `package Setter id "setter" revision "setter@1" { + operation replaceValue id "write" : string -> unit mode call execution transaction targets [browser,server] receiver any; + }`, + { source }, + ); + assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); + const badForward = compileCapabilitySource( + forwarded + .replace("import interface Fields;", "import interface Fields; import package Setter;") + .replace("bind arbitrary.set to state Second.write", "bind arbitrary.set to package Setter.replaceValue"), + "workspace.qx", + { ...env, packages: new Map([["Setter", pkg.resource.revision]]) }, + ); + assert.equal(badForward.ok, false); + assert.ok( + badForward.diagnostics.some((d) => d.message.includes("same native state slot")), + JSON.stringify(badForward.diagnostics), + ); +}); const compile = async () => { const pkg = compileCapabilityResourceSource( `import interface Data; package Views id "views" revision "views@1" { From 1e72713ae288631e165aaddf5b65a2e08e649a7e Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Mon, 28 Sep 2026 17:20:35 -0700 Subject: [PATCH 84/91] Implement durable typed journals, subscriptions, and Reader document connections Add checked native journal/subscription bindings, managed-reference retention, bounded history and backpressure, atomic delivery receipts, and fenced hosting. Preserve source publication prediction and replica reconciliation; subscription attachment, controls, and delivery remain authoritative in this initial version. Connect independent manual/Gutenberg document producers to Reader bookshelves through typed adapters. Add connection inspection, shared provider selection, authoring documentation, and restart/rejection/fan-out integration coverage. Verified compiler suite (287 passed, two existing skips), Nix runtime and PostgreSQL qualification, five example assemblies, headless Reader integration, Chromium Reader integration, resource pins, formatting, and lint. No pinned workspace runtime was deployed. --- grammar/QuixosCapability.g4 | 10 + src/bindings/portable.ts | 2 +- .../generated/QuixosCapability.interp | 6 +- .../generated/QuixosCapability.tokens | 282 +-- .../generated/QuixosCapabilityLexer.interp | 8 +- .../generated/QuixosCapabilityLexer.tokens | 282 +-- .../generated/QuixosCapabilityLexer.ts | 1281 +++++----- .../generated/QuixosCapabilityParser.ts | 2176 +++++++++-------- src/capability-language/parser.ts | 84 +- src/capability-model/evolution.ts | 4 + src/capability-model/execution.ts | 25 +- src/capability-model/initialization.ts | 15 +- src/capability-model/journals.ts | 131 + src/capability-model/types.ts | 16 +- src/capability-model/validation.ts | 177 +- src/execution-world/kernel.ts | 107 +- src/execution-world/plan.ts | 46 +- src/query/link.ts | 5 + src/query/proto.ts | 5 +- test/execution-contracts.test.ts | 10 +- test/execution-world.test.ts | 23 + test/fixtures/events/event-handler.qx | 5 + test/fixtures/events/event-stream-record.qx | 3 + test/fixtures/events/event-stream.qx | 13 + .../events/event-subscription-record.qx | 2 + test/fixtures/events/event-subscription.qx | 18 + test/fixtures/events/rules.qx | 21 + test/generics.test.ts | 29 + test/journals.test.ts | 186 ++ test/reference-dependencies.test.ts | 10 +- 30 files changed, 2949 insertions(+), 2033 deletions(-) create mode 100644 src/capability-model/journals.ts create mode 100644 test/fixtures/events/event-handler.qx create mode 100644 test/fixtures/events/event-stream-record.qx create mode 100644 test/fixtures/events/event-stream.qx create mode 100644 test/fixtures/events/event-subscription-record.qx create mode 100644 test/fixtures/events/event-subscription.qx create mode 100644 test/fixtures/events/rules.qx create mode 100644 test/journals.test.ts diff --git a/grammar/QuixosCapability.g4 b/grammar/QuixosCapability.g4 index 123a05f..2bc6431 100644 --- a/grammar/QuixosCapability.g4 +++ b/grammar/QuixosCapability.g4 @@ -288,6 +288,8 @@ stateDecl storagePolicy : REGISTER | CRDT LPAREN valueType RPAREN + | JOURNAL jsonObject + | SUBSCRIPTION LPAREN valueType RPAREN ; edgeDecl @@ -367,6 +369,8 @@ operationName operationProvider : LIFECYCLE DOT identifier + | JOURNAL identifier DOT identifier + | SUBSCRIPTION identifier DOT identifier | STATE identifier DOT statePrimitive | EDGE identifier DOT identifier DOT edgePrimitive | INTERFACE identifier typeArguments? DOT memberOperationRef @@ -512,6 +516,10 @@ identifier | DEADLINE_MS | PRESENTATION | SUBJECT + | MESSAGE + | JOURNAL + | SUBSCRIPTION + | CONNECT | FOR ; @@ -602,6 +610,8 @@ REVISION: 'revision'; SEMANTIC_MAJOR: 'semantic-major'; ON_DELETE: 'on-delete'; LIFECYCLE: 'lifecycle'; +JOURNAL: 'journal'; +SUBSCRIPTION: 'subscription'; RETAIN_OTHER: 'retain-other'; KEYED: 'keyed'; PUBLIC_TRAVERSAL: 'public-traversal'; diff --git a/src/bindings/portable.ts b/src/bindings/portable.ts index aeb24c6..7efc839 100644 --- a/src/bindings/portable.ts +++ b/src/bindings/portable.ts @@ -203,7 +203,7 @@ function methods( .map(({ member, op }) => { const execution: ExecutionContract = op.execution ?? { kind: "remote" }; if ( - (execution.kind === "remote" ? !remote : !execution.targets.includes(target)) || + (execution.kind === "remote" && !remote) || op.mode !== "call" || (op.scope === "class" && (remote || req.receiver === "input")) ) diff --git a/src/capability-language/generated/QuixosCapability.interp b/src/capability-language/generated/QuixosCapability.interp index a49cddc..c08298f 100644 --- a/src/capability-language/generated/QuixosCapability.interp +++ b/src/capability-language/generated/QuixosCapability.interp @@ -83,6 +83,8 @@ null 'semantic-major' 'on-delete' 'lifecycle' +'journal' +'subscription' 'retain-other' 'keyed' 'public-traversal' @@ -242,6 +244,8 @@ REVISION SEMANTIC_MAJOR ON_DELETE LIFECYCLE +JOURNAL +SUBSCRIPTION RETAIN_OTHER KEYED PUBLIC_TRAVERSAL @@ -405,4 +409,4 @@ stringLiteral atn: -[4, 1, 156, 1441, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 183, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 188, 8, 1, 10, 1, 12, 1, 191, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 209, 8, 3, 10, 3, 12, 3, 212, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 224, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 236, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 256, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 264, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 269, 8, 10, 10, 10, 12, 10, 272, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 277, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 287, 8, 10, 10, 10, 12, 10, 290, 9, 10, 3, 10, 292, 8, 10, 1, 10, 1, 10, 5, 10, 296, 8, 10, 10, 10, 12, 10, 299, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 307, 8, 11, 10, 11, 12, 11, 310, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 318, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 326, 8, 12, 10, 12, 12, 12, 329, 9, 12, 3, 12, 331, 8, 12, 3, 12, 333, 8, 12, 1, 13, 1, 13, 3, 13, 337, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 343, 8, 14, 10, 14, 12, 14, 346, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 357, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 362, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 372, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 382, 8, 18, 1, 18, 1, 18, 1, 19, 3, 19, 387, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 402, 8, 19, 1, 19, 1, 19, 1, 19, 1, 20, 3, 20, 408, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 418, 8, 20, 10, 20, 12, 20, 421, 9, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 429, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 437, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 445, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 458, 8, 21, 1, 22, 3, 22, 461, 8, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 471, 8, 22, 1, 22, 1, 22, 3, 22, 475, 8, 22, 1, 22, 1, 22, 5, 22, 479, 8, 22, 10, 22, 12, 22, 482, 9, 22, 1, 22, 1, 22, 1, 23, 1, 23, 3, 23, 488, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 494, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 502, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 510, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 523, 8, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 530, 8, 25, 1, 25, 1, 25, 3, 25, 534, 8, 25, 1, 26, 5, 26, 537, 8, 26, 10, 26, 12, 26, 540, 9, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 550, 8, 26, 1, 26, 1, 26, 5, 26, 554, 8, 26, 10, 26, 12, 26, 557, 9, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 567, 8, 27, 1, 28, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 3, 30, 593, 8, 30, 1, 30, 1, 30, 3, 30, 597, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 603, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 5, 30, 612, 8, 30, 10, 30, 12, 30, 615, 9, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 623, 8, 30, 1, 30, 1, 30, 5, 30, 627, 8, 30, 10, 30, 12, 30, 630, 9, 30, 1, 30, 1, 30, 3, 30, 634, 8, 30, 3, 30, 636, 8, 30, 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, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 665, 8, 32, 10, 32, 12, 32, 668, 9, 32, 1, 32, 3, 32, 671, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 677, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 704, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 3, 34, 714, 8, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 725, 8, 34, 1, 34, 3, 34, 728, 8, 34, 1, 34, 1, 34, 1, 34, 3, 34, 733, 8, 34, 1, 34, 3, 34, 736, 8, 34, 1, 34, 3, 34, 739, 8, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 3, 35, 746, 8, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 755, 8, 35, 1, 35, 3, 35, 758, 8, 35, 1, 35, 3, 35, 761, 8, 35, 1, 35, 3, 35, 764, 8, 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, 38, 1, 38, 3, 38, 787, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 794, 8, 39, 10, 39, 12, 39, 797, 9, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 810, 8, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 5, 43, 829, 8, 43, 10, 43, 12, 43, 832, 9, 43, 3, 43, 834, 8, 43, 1, 43, 3, 43, 837, 8, 43, 1, 44, 1, 44, 1, 44, 5, 44, 842, 8, 44, 10, 44, 12, 44, 845, 9, 44, 1, 45, 1, 45, 1, 45, 5, 45, 850, 8, 45, 10, 45, 12, 45, 853, 9, 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, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 884, 8, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 896, 8, 46, 1, 46, 3, 46, 899, 8, 46, 1, 46, 1, 46, 3, 46, 903, 8, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 925, 8, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 939, 8, 46, 1, 47, 1, 47, 1, 47, 1, 47, 5, 47, 945, 8, 47, 10, 47, 12, 47, 948, 9, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 3, 50, 959, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 973, 8, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 983, 8, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 1001, 8, 54, 1, 54, 1, 54, 3, 54, 1005, 8, 54, 1, 54, 3, 54, 1008, 8, 54, 1, 54, 1, 54, 3, 54, 1012, 8, 54, 1, 54, 3, 54, 1015, 8, 54, 1, 54, 1, 54, 1, 55, 1, 55, 3, 55, 1021, 8, 55, 1, 55, 1, 55, 3, 55, 1025, 8, 55, 1, 55, 1, 55, 1, 55, 3, 55, 1030, 8, 55, 1, 55, 1, 55, 3, 55, 1034, 8, 55, 1, 55, 1, 55, 3, 55, 1038, 8, 55, 1, 55, 1, 55, 5, 55, 1042, 8, 55, 10, 55, 12, 55, 1045, 9, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 1058, 8, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 5, 59, 1071, 8, 59, 10, 59, 12, 59, 1074, 9, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1093, 8, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 5, 61, 1100, 8, 61, 10, 61, 12, 61, 1103, 9, 61, 1, 61, 1, 61, 1, 62, 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, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1134, 8, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1154, 8, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1174, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1184, 8, 67, 1, 67, 3, 67, 1187, 8, 67, 1, 67, 3, 67, 1190, 8, 67, 3, 67, 1192, 8, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 5, 71, 1204, 8, 71, 10, 71, 12, 71, 1207, 9, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1230, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1246, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1255, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1265, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 5, 72, 1276, 8, 72, 10, 72, 12, 72, 1279, 9, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1293, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1305, 8, 72, 1, 72, 1, 72, 3, 72, 1309, 8, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1318, 8, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 3, 74, 1336, 8, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 5, 74, 1358, 8, 74, 10, 74, 12, 74, 1361, 9, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 4, 74, 1369, 8, 74, 11, 74, 12, 74, 1370, 1, 74, 1, 74, 1, 74, 1, 74, 3, 74, 1377, 8, 74, 3, 74, 1379, 8, 74, 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, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 3, 79, 1405, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 5, 80, 1411, 8, 80, 10, 80, 12, 80, 1414, 9, 80, 3, 80, 1416, 8, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 5, 82, 1428, 8, 82, 10, 82, 12, 82, 1431, 9, 82, 3, 82, 1433, 8, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 0, 0, 85, 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, 0, 10, 1, 0, 49, 50, 2, 0, 17, 17, 35, 35, 1, 0, 13, 14, 1, 0, 104, 108, 3, 0, 1, 1, 99, 103, 105, 106, 3, 0, 1, 1, 99, 100, 105, 106, 2, 0, 101, 103, 105, 106, 1, 0, 124, 131, 1, 0, 111, 114, 10, 0, 1, 1, 4, 7, 10, 10, 12, 35, 42, 42, 47, 47, 77, 77, 97, 98, 109, 109, 152, 152, 1560, 0, 182, 1, 0, 0, 0, 2, 184, 1, 0, 0, 0, 4, 194, 1, 0, 0, 0, 6, 198, 1, 0, 0, 0, 8, 223, 1, 0, 0, 0, 10, 235, 1, 0, 0, 0, 12, 237, 1, 0, 0, 0, 14, 244, 1, 0, 0, 0, 16, 255, 1, 0, 0, 0, 18, 257, 1, 0, 0, 0, 20, 270, 1, 0, 0, 0, 22, 302, 1, 0, 0, 0, 24, 332, 1, 0, 0, 0, 26, 334, 1, 0, 0, 0, 28, 338, 1, 0, 0, 0, 30, 356, 1, 0, 0, 0, 32, 358, 1, 0, 0, 0, 34, 371, 1, 0, 0, 0, 36, 373, 1, 0, 0, 0, 38, 386, 1, 0, 0, 0, 40, 407, 1, 0, 0, 0, 42, 457, 1, 0, 0, 0, 44, 460, 1, 0, 0, 0, 46, 485, 1, 0, 0, 0, 48, 522, 1, 0, 0, 0, 50, 533, 1, 0, 0, 0, 52, 538, 1, 0, 0, 0, 54, 566, 1, 0, 0, 0, 56, 568, 1, 0, 0, 0, 58, 578, 1, 0, 0, 0, 60, 590, 1, 0, 0, 0, 62, 637, 1, 0, 0, 0, 64, 703, 1, 0, 0, 0, 66, 705, 1, 0, 0, 0, 68, 710, 1, 0, 0, 0, 70, 742, 1, 0, 0, 0, 72, 767, 1, 0, 0, 0, 74, 771, 1, 0, 0, 0, 76, 786, 1, 0, 0, 0, 78, 788, 1, 0, 0, 0, 80, 800, 1, 0, 0, 0, 82, 813, 1, 0, 0, 0, 84, 816, 1, 0, 0, 0, 86, 836, 1, 0, 0, 0, 88, 838, 1, 0, 0, 0, 90, 846, 1, 0, 0, 0, 92, 938, 1, 0, 0, 0, 94, 940, 1, 0, 0, 0, 96, 951, 1, 0, 0, 0, 98, 953, 1, 0, 0, 0, 100, 958, 1, 0, 0, 0, 102, 960, 1, 0, 0, 0, 104, 982, 1, 0, 0, 0, 106, 984, 1, 0, 0, 0, 108, 993, 1, 0, 0, 0, 110, 1018, 1, 0, 0, 0, 112, 1048, 1, 0, 0, 0, 114, 1057, 1, 0, 0, 0, 116, 1059, 1, 0, 0, 0, 118, 1067, 1, 0, 0, 0, 120, 1092, 1, 0, 0, 0, 122, 1094, 1, 0, 0, 0, 124, 1106, 1, 0, 0, 0, 126, 1113, 1, 0, 0, 0, 128, 1127, 1, 0, 0, 0, 130, 1137, 1, 0, 0, 0, 132, 1153, 1, 0, 0, 0, 134, 1191, 1, 0, 0, 0, 136, 1193, 1, 0, 0, 0, 138, 1196, 1, 0, 0, 0, 140, 1198, 1, 0, 0, 0, 142, 1200, 1, 0, 0, 0, 144, 1308, 1, 0, 0, 0, 146, 1310, 1, 0, 0, 0, 148, 1378, 1, 0, 0, 0, 150, 1380, 1, 0, 0, 0, 152, 1385, 1, 0, 0, 0, 154, 1392, 1, 0, 0, 0, 156, 1394, 1, 0, 0, 0, 158, 1404, 1, 0, 0, 0, 160, 1406, 1, 0, 0, 0, 162, 1419, 1, 0, 0, 0, 164, 1423, 1, 0, 0, 0, 166, 1436, 1, 0, 0, 0, 168, 1438, 1, 0, 0, 0, 170, 171, 3, 6, 3, 0, 171, 172, 5, 0, 0, 1, 172, 183, 1, 0, 0, 0, 173, 174, 3, 20, 10, 0, 174, 175, 5, 0, 0, 1, 175, 183, 1, 0, 0, 0, 176, 177, 3, 52, 26, 0, 177, 178, 5, 0, 0, 1, 178, 183, 1, 0, 0, 0, 179, 180, 3, 2, 1, 0, 180, 181, 5, 0, 0, 1, 181, 183, 1, 0, 0, 0, 182, 170, 1, 0, 0, 0, 182, 173, 1, 0, 0, 0, 182, 176, 1, 0, 0, 0, 182, 179, 1, 0, 0, 0, 183, 1, 1, 0, 0, 0, 184, 185, 5, 42, 0, 0, 185, 189, 5, 140, 0, 0, 186, 188, 3, 8, 4, 0, 187, 186, 1, 0, 0, 0, 188, 191, 1, 0, 0, 0, 189, 187, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, 192, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 192, 193, 5, 141, 0, 0, 193, 3, 1, 0, 0, 0, 194, 195, 5, 43, 0, 0, 195, 196, 3, 168, 84, 0, 196, 197, 5, 137, 0, 0, 197, 5, 1, 0, 0, 0, 198, 199, 5, 11, 0, 0, 199, 200, 3, 166, 83, 0, 200, 201, 5, 87, 0, 0, 201, 202, 3, 168, 84, 0, 202, 203, 5, 80, 0, 0, 203, 204, 3, 168, 84, 0, 204, 205, 5, 79, 0, 0, 205, 206, 3, 168, 84, 0, 206, 210, 5, 140, 0, 0, 207, 209, 3, 8, 4, 0, 208, 207, 1, 0, 0, 0, 209, 212, 1, 0, 0, 0, 210, 208, 1, 0, 0, 0, 210, 211, 1, 0, 0, 0, 211, 213, 1, 0, 0, 0, 212, 210, 1, 0, 0, 0, 213, 214, 5, 141, 0, 0, 214, 7, 1, 0, 0, 0, 215, 224, 3, 4, 2, 0, 216, 224, 3, 18, 9, 0, 217, 224, 3, 10, 5, 0, 218, 224, 3, 98, 49, 0, 219, 224, 3, 110, 55, 0, 220, 224, 3, 146, 73, 0, 221, 224, 3, 58, 29, 0, 222, 224, 3, 32, 16, 0, 223, 215, 1, 0, 0, 0, 223, 216, 1, 0, 0, 0, 223, 217, 1, 0, 0, 0, 223, 218, 1, 0, 0, 0, 223, 219, 1, 0, 0, 0, 223, 220, 1, 0, 0, 0, 223, 221, 1, 0, 0, 0, 223, 222, 1, 0, 0, 0, 224, 9, 1, 0, 0, 0, 225, 226, 5, 43, 0, 0, 226, 227, 5, 46, 0, 0, 227, 228, 3, 166, 83, 0, 228, 229, 5, 137, 0, 0, 229, 236, 1, 0, 0, 0, 230, 231, 5, 43, 0, 0, 231, 232, 5, 48, 0, 0, 232, 233, 3, 166, 83, 0, 233, 234, 5, 137, 0, 0, 234, 236, 1, 0, 0, 0, 235, 225, 1, 0, 0, 0, 235, 230, 1, 0, 0, 0, 236, 11, 1, 0, 0, 0, 237, 238, 5, 44, 0, 0, 238, 239, 5, 45, 0, 0, 239, 240, 3, 166, 83, 0, 240, 241, 5, 87, 0, 0, 241, 242, 3, 168, 84, 0, 242, 243, 5, 137, 0, 0, 243, 13, 1, 0, 0, 0, 244, 245, 5, 44, 0, 0, 245, 246, 5, 46, 0, 0, 246, 247, 3, 166, 83, 0, 247, 248, 5, 80, 0, 0, 248, 249, 3, 168, 84, 0, 249, 250, 5, 137, 0, 0, 250, 15, 1, 0, 0, 0, 251, 256, 3, 10, 5, 0, 252, 256, 3, 12, 6, 0, 253, 256, 3, 14, 7, 0, 254, 256, 3, 32, 16, 0, 255, 251, 1, 0, 0, 0, 255, 252, 1, 0, 0, 0, 255, 253, 1, 0, 0, 0, 255, 254, 1, 0, 0, 0, 256, 17, 1, 0, 0, 0, 257, 258, 5, 45, 0, 0, 258, 259, 3, 166, 83, 0, 259, 260, 5, 87, 0, 0, 260, 263, 3, 168, 84, 0, 261, 262, 5, 88, 0, 0, 262, 264, 3, 168, 84, 0, 263, 261, 1, 0, 0, 0, 263, 264, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 266, 5, 137, 0, 0, 266, 19, 1, 0, 0, 0, 267, 269, 3, 16, 8, 0, 268, 267, 1, 0, 0, 0, 269, 272, 1, 0, 0, 0, 270, 268, 1, 0, 0, 0, 270, 271, 1, 0, 0, 0, 271, 273, 1, 0, 0, 0, 272, 270, 1, 0, 0, 0, 273, 274, 5, 46, 0, 0, 274, 276, 3, 166, 83, 0, 275, 277, 3, 22, 11, 0, 276, 275, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 279, 5, 87, 0, 0, 279, 280, 3, 168, 84, 0, 280, 281, 5, 80, 0, 0, 281, 291, 3, 168, 84, 0, 282, 283, 5, 92, 0, 0, 283, 288, 3, 26, 13, 0, 284, 285, 5, 138, 0, 0, 285, 287, 3, 26, 13, 0, 286, 284, 1, 0, 0, 0, 287, 290, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 292, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 291, 282, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 293, 1, 0, 0, 0, 293, 297, 5, 140, 0, 0, 294, 296, 3, 34, 17, 0, 295, 294, 1, 0, 0, 0, 296, 299, 1, 0, 0, 0, 297, 295, 1, 0, 0, 0, 297, 298, 1, 0, 0, 0, 298, 300, 1, 0, 0, 0, 299, 297, 1, 0, 0, 0, 300, 301, 5, 141, 0, 0, 301, 21, 1, 0, 0, 0, 302, 303, 5, 146, 0, 0, 303, 308, 3, 24, 12, 0, 304, 305, 5, 138, 0, 0, 305, 307, 3, 24, 12, 0, 306, 304, 1, 0, 0, 0, 307, 310, 1, 0, 0, 0, 308, 306, 1, 0, 0, 0, 308, 309, 1, 0, 0, 0, 309, 311, 1, 0, 0, 0, 310, 308, 1, 0, 0, 0, 311, 312, 5, 147, 0, 0, 312, 23, 1, 0, 0, 0, 313, 314, 5, 49, 0, 0, 314, 317, 3, 166, 83, 0, 315, 316, 5, 136, 0, 0, 316, 318, 5, 39, 0, 0, 317, 315, 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 333, 1, 0, 0, 0, 319, 320, 5, 38, 0, 0, 320, 330, 3, 166, 83, 0, 321, 322, 5, 40, 0, 0, 322, 327, 3, 26, 13, 0, 323, 324, 5, 148, 0, 0, 324, 326, 3, 26, 13, 0, 325, 323, 1, 0, 0, 0, 326, 329, 1, 0, 0, 0, 327, 325, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 331, 1, 0, 0, 0, 329, 327, 1, 0, 0, 0, 330, 321, 1, 0, 0, 0, 330, 331, 1, 0, 0, 0, 331, 333, 1, 0, 0, 0, 332, 313, 1, 0, 0, 0, 332, 319, 1, 0, 0, 0, 333, 25, 1, 0, 0, 0, 334, 336, 3, 166, 83, 0, 335, 337, 3, 28, 14, 0, 336, 335, 1, 0, 0, 0, 336, 337, 1, 0, 0, 0, 337, 27, 1, 0, 0, 0, 338, 339, 5, 146, 0, 0, 339, 344, 3, 30, 15, 0, 340, 341, 5, 138, 0, 0, 341, 343, 3, 30, 15, 0, 342, 340, 1, 0, 0, 0, 343, 346, 1, 0, 0, 0, 344, 342, 1, 0, 0, 0, 344, 345, 1, 0, 0, 0, 345, 347, 1, 0, 0, 0, 346, 344, 1, 0, 0, 0, 347, 348, 5, 147, 0, 0, 348, 29, 1, 0, 0, 0, 349, 350, 5, 45, 0, 0, 350, 357, 3, 166, 83, 0, 351, 352, 5, 46, 0, 0, 352, 357, 3, 26, 13, 0, 353, 354, 5, 38, 0, 0, 354, 357, 3, 166, 83, 0, 355, 357, 3, 148, 74, 0, 356, 349, 1, 0, 0, 0, 356, 351, 1, 0, 0, 0, 356, 353, 1, 0, 0, 0, 356, 355, 1, 0, 0, 0, 357, 31, 1, 0, 0, 0, 358, 359, 5, 37, 0, 0, 359, 361, 3, 166, 83, 0, 360, 362, 3, 22, 11, 0, 361, 360, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 363, 1, 0, 0, 0, 363, 364, 5, 149, 0, 0, 364, 365, 3, 148, 74, 0, 365, 366, 5, 137, 0, 0, 366, 33, 1, 0, 0, 0, 367, 372, 3, 40, 20, 0, 368, 372, 3, 44, 22, 0, 369, 372, 3, 38, 19, 0, 370, 372, 3, 36, 18, 0, 371, 367, 1, 0, 0, 0, 371, 368, 1, 0, 0, 0, 371, 369, 1, 0, 0, 0, 371, 370, 1, 0, 0, 0, 372, 35, 1, 0, 0, 0, 373, 374, 5, 2, 0, 0, 374, 375, 3, 166, 83, 0, 375, 376, 5, 87, 0, 0, 376, 377, 3, 168, 84, 0, 377, 378, 5, 3, 0, 0, 378, 381, 3, 168, 84, 0, 379, 380, 5, 5, 0, 0, 380, 382, 3, 50, 25, 0, 381, 379, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 383, 1, 0, 0, 0, 383, 384, 5, 137, 0, 0, 384, 37, 1, 0, 0, 0, 385, 387, 5, 60, 0, 0, 386, 385, 1, 0, 0, 0, 386, 387, 1, 0, 0, 0, 387, 388, 1, 0, 0, 0, 388, 389, 5, 52, 0, 0, 389, 390, 3, 166, 83, 0, 390, 391, 5, 87, 0, 0, 391, 392, 3, 168, 84, 0, 392, 393, 5, 136, 0, 0, 393, 394, 3, 148, 74, 0, 394, 395, 5, 135, 0, 0, 395, 396, 3, 148, 74, 0, 396, 397, 5, 140, 0, 0, 397, 398, 5, 104, 0, 0, 398, 399, 5, 87, 0, 0, 399, 401, 3, 168, 84, 0, 400, 402, 3, 76, 38, 0, 401, 400, 1, 0, 0, 0, 401, 402, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 404, 5, 137, 0, 0, 404, 405, 5, 141, 0, 0, 405, 39, 1, 0, 0, 0, 406, 408, 3, 46, 23, 0, 407, 406, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 409, 1, 0, 0, 0, 409, 410, 7, 0, 0, 0, 410, 411, 3, 166, 83, 0, 411, 412, 5, 87, 0, 0, 412, 413, 3, 168, 84, 0, 413, 414, 5, 136, 0, 0, 414, 415, 3, 148, 74, 0, 415, 419, 5, 140, 0, 0, 416, 418, 3, 42, 21, 0, 417, 416, 1, 0, 0, 0, 418, 421, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 419, 1, 0, 0, 0, 422, 423, 5, 141, 0, 0, 423, 41, 1, 0, 0, 0, 424, 425, 5, 94, 0, 0, 425, 426, 5, 87, 0, 0, 426, 428, 3, 168, 84, 0, 427, 429, 3, 76, 38, 0, 428, 427, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 430, 1, 0, 0, 0, 430, 431, 5, 137, 0, 0, 431, 458, 1, 0, 0, 0, 432, 433, 5, 95, 0, 0, 433, 434, 5, 87, 0, 0, 434, 436, 3, 168, 84, 0, 435, 437, 3, 76, 38, 0, 436, 435, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 438, 1, 0, 0, 0, 438, 439, 5, 137, 0, 0, 439, 458, 1, 0, 0, 0, 440, 441, 5, 1, 0, 0, 441, 442, 5, 87, 0, 0, 442, 444, 3, 168, 84, 0, 443, 445, 3, 76, 38, 0, 444, 443, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 447, 5, 137, 0, 0, 447, 458, 1, 0, 0, 0, 448, 449, 5, 96, 0, 0, 449, 450, 5, 97, 0, 0, 450, 451, 5, 87, 0, 0, 451, 452, 3, 168, 84, 0, 452, 453, 5, 98, 0, 0, 453, 454, 5, 87, 0, 0, 454, 455, 3, 168, 84, 0, 455, 456, 5, 137, 0, 0, 456, 458, 1, 0, 0, 0, 457, 424, 1, 0, 0, 0, 457, 432, 1, 0, 0, 0, 457, 440, 1, 0, 0, 0, 457, 448, 1, 0, 0, 0, 458, 43, 1, 0, 0, 0, 459, 461, 3, 46, 23, 0, 460, 459, 1, 0, 0, 0, 460, 461, 1, 0, 0, 0, 461, 462, 1, 0, 0, 0, 462, 463, 5, 51, 0, 0, 463, 464, 3, 166, 83, 0, 464, 465, 5, 87, 0, 0, 465, 466, 3, 168, 84, 0, 466, 467, 5, 136, 0, 0, 467, 468, 3, 156, 78, 0, 468, 470, 3, 50, 25, 0, 469, 471, 5, 115, 0, 0, 470, 469, 1, 0, 0, 0, 470, 471, 1, 0, 0, 0, 471, 474, 1, 0, 0, 0, 472, 473, 5, 85, 0, 0, 473, 475, 3, 168, 84, 0, 474, 472, 1, 0, 0, 0, 474, 475, 1, 0, 0, 0, 475, 476, 1, 0, 0, 0, 476, 480, 5, 140, 0, 0, 477, 479, 3, 48, 24, 0, 478, 477, 1, 0, 0, 0, 479, 482, 1, 0, 0, 0, 480, 478, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 483, 1, 0, 0, 0, 482, 480, 1, 0, 0, 0, 483, 484, 5, 141, 0, 0, 484, 45, 1, 0, 0, 0, 485, 487, 5, 34, 0, 0, 486, 488, 7, 1, 0, 0, 487, 486, 1, 0, 0, 0, 487, 488, 1, 0, 0, 0, 488, 47, 1, 0, 0, 0, 489, 490, 5, 101, 0, 0, 490, 491, 5, 87, 0, 0, 491, 493, 3, 168, 84, 0, 492, 494, 3, 76, 38, 0, 493, 492, 1, 0, 0, 0, 493, 494, 1, 0, 0, 0, 494, 495, 1, 0, 0, 0, 495, 496, 5, 137, 0, 0, 496, 523, 1, 0, 0, 0, 497, 498, 5, 102, 0, 0, 498, 499, 5, 87, 0, 0, 499, 501, 3, 168, 84, 0, 500, 502, 3, 76, 38, 0, 501, 500, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 504, 5, 137, 0, 0, 504, 523, 1, 0, 0, 0, 505, 506, 5, 103, 0, 0, 506, 507, 5, 87, 0, 0, 507, 509, 3, 168, 84, 0, 508, 510, 3, 76, 38, 0, 509, 508, 1, 0, 0, 0, 509, 510, 1, 0, 0, 0, 510, 511, 1, 0, 0, 0, 511, 512, 5, 137, 0, 0, 512, 523, 1, 0, 0, 0, 513, 514, 5, 96, 0, 0, 514, 515, 5, 97, 0, 0, 515, 516, 5, 87, 0, 0, 516, 517, 3, 168, 84, 0, 517, 518, 5, 98, 0, 0, 518, 519, 5, 87, 0, 0, 519, 520, 3, 168, 84, 0, 520, 521, 5, 137, 0, 0, 521, 523, 1, 0, 0, 0, 522, 489, 1, 0, 0, 0, 522, 497, 1, 0, 0, 0, 522, 505, 1, 0, 0, 0, 522, 513, 1, 0, 0, 0, 523, 49, 1, 0, 0, 0, 524, 525, 5, 45, 0, 0, 525, 534, 3, 166, 83, 0, 526, 527, 5, 46, 0, 0, 527, 529, 3, 166, 83, 0, 528, 530, 3, 28, 14, 0, 529, 528, 1, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 534, 1, 0, 0, 0, 531, 532, 5, 38, 0, 0, 532, 534, 3, 166, 83, 0, 533, 524, 1, 0, 0, 0, 533, 526, 1, 0, 0, 0, 533, 531, 1, 0, 0, 0, 534, 51, 1, 0, 0, 0, 535, 537, 3, 16, 8, 0, 536, 535, 1, 0, 0, 0, 537, 540, 1, 0, 0, 0, 538, 536, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 541, 1, 0, 0, 0, 540, 538, 1, 0, 0, 0, 541, 542, 5, 48, 0, 0, 542, 543, 3, 166, 83, 0, 543, 544, 5, 87, 0, 0, 544, 545, 3, 168, 84, 0, 545, 546, 5, 80, 0, 0, 546, 549, 3, 168, 84, 0, 547, 548, 5, 81, 0, 0, 548, 550, 5, 150, 0, 0, 549, 547, 1, 0, 0, 0, 549, 550, 1, 0, 0, 0, 550, 551, 1, 0, 0, 0, 551, 555, 5, 140, 0, 0, 552, 554, 3, 54, 27, 0, 553, 552, 1, 0, 0, 0, 554, 557, 1, 0, 0, 0, 555, 553, 1, 0, 0, 0, 555, 556, 1, 0, 0, 0, 556, 558, 1, 0, 0, 0, 557, 555, 1, 0, 0, 0, 558, 559, 5, 141, 0, 0, 559, 53, 1, 0, 0, 0, 560, 567, 3, 68, 34, 0, 561, 567, 3, 70, 35, 0, 562, 567, 3, 80, 40, 0, 563, 567, 3, 60, 30, 0, 564, 567, 3, 62, 31, 0, 565, 567, 3, 56, 28, 0, 566, 560, 1, 0, 0, 0, 566, 561, 1, 0, 0, 0, 566, 562, 1, 0, 0, 0, 566, 563, 1, 0, 0, 0, 566, 564, 1, 0, 0, 0, 566, 565, 1, 0, 0, 0, 567, 55, 1, 0, 0, 0, 568, 569, 5, 2, 0, 0, 569, 570, 3, 166, 83, 0, 570, 571, 5, 87, 0, 0, 571, 572, 3, 168, 84, 0, 572, 573, 5, 40, 0, 0, 573, 574, 3, 26, 13, 0, 574, 575, 5, 139, 0, 0, 575, 576, 3, 166, 83, 0, 576, 577, 5, 137, 0, 0, 577, 57, 1, 0, 0, 0, 578, 579, 5, 4, 0, 0, 579, 580, 3, 166, 83, 0, 580, 581, 5, 87, 0, 0, 581, 582, 3, 168, 84, 0, 582, 583, 5, 6, 0, 0, 583, 584, 3, 26, 13, 0, 584, 585, 5, 68, 0, 0, 585, 586, 3, 166, 83, 0, 586, 587, 5, 139, 0, 0, 587, 588, 3, 166, 83, 0, 588, 589, 5, 137, 0, 0, 589, 59, 1, 0, 0, 0, 590, 592, 5, 24, 0, 0, 591, 593, 5, 42, 0, 0, 592, 591, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 596, 3, 166, 83, 0, 595, 597, 3, 22, 11, 0, 596, 595, 1, 0, 0, 0, 596, 597, 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 599, 5, 87, 0, 0, 599, 600, 3, 168, 84, 0, 600, 602, 5, 27, 0, 0, 601, 603, 5, 11, 0, 0, 602, 601, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 604, 1, 0, 0, 0, 604, 605, 3, 26, 13, 0, 605, 606, 5, 28, 0, 0, 606, 635, 3, 168, 84, 0, 607, 608, 5, 52, 0, 0, 608, 609, 3, 168, 84, 0, 609, 613, 5, 140, 0, 0, 610, 612, 3, 64, 32, 0, 611, 610, 1, 0, 0, 0, 612, 615, 1, 0, 0, 0, 613, 611, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 616, 1, 0, 0, 0, 615, 613, 1, 0, 0, 0, 616, 617, 5, 141, 0, 0, 617, 636, 1, 0, 0, 0, 618, 619, 5, 42, 0, 0, 619, 622, 3, 168, 84, 0, 620, 621, 5, 52, 0, 0, 621, 623, 3, 168, 84, 0, 622, 620, 1, 0, 0, 0, 622, 623, 1, 0, 0, 0, 623, 633, 1, 0, 0, 0, 624, 628, 5, 140, 0, 0, 625, 627, 3, 64, 32, 0, 626, 625, 1, 0, 0, 0, 627, 630, 1, 0, 0, 0, 628, 626, 1, 0, 0, 0, 628, 629, 1, 0, 0, 0, 629, 631, 1, 0, 0, 0, 630, 628, 1, 0, 0, 0, 631, 634, 5, 141, 0, 0, 632, 634, 5, 137, 0, 0, 633, 624, 1, 0, 0, 0, 633, 632, 1, 0, 0, 0, 634, 636, 1, 0, 0, 0, 635, 607, 1, 0, 0, 0, 635, 618, 1, 0, 0, 0, 636, 61, 1, 0, 0, 0, 637, 638, 5, 24, 0, 0, 638, 639, 3, 166, 83, 0, 639, 640, 5, 87, 0, 0, 640, 641, 3, 168, 84, 0, 641, 642, 5, 26, 0, 0, 642, 643, 3, 166, 83, 0, 643, 644, 3, 28, 14, 0, 644, 645, 5, 137, 0, 0, 645, 63, 1, 0, 0, 0, 646, 647, 5, 18, 0, 0, 647, 704, 5, 137, 0, 0, 648, 649, 5, 19, 0, 0, 649, 650, 5, 20, 0, 0, 650, 651, 3, 166, 83, 0, 651, 652, 5, 137, 0, 0, 652, 704, 1, 0, 0, 0, 653, 654, 5, 29, 0, 0, 654, 655, 3, 168, 84, 0, 655, 656, 5, 137, 0, 0, 656, 704, 1, 0, 0, 0, 657, 658, 5, 29, 0, 0, 658, 659, 3, 166, 83, 0, 659, 660, 5, 139, 0, 0, 660, 670, 3, 166, 83, 0, 661, 662, 5, 67, 0, 0, 662, 666, 5, 140, 0, 0, 663, 665, 3, 66, 33, 0, 664, 663, 1, 0, 0, 0, 665, 668, 1, 0, 0, 0, 666, 664, 1, 0, 0, 0, 666, 667, 1, 0, 0, 0, 667, 669, 1, 0, 0, 0, 668, 666, 1, 0, 0, 0, 669, 671, 5, 141, 0, 0, 670, 661, 1, 0, 0, 0, 670, 671, 1, 0, 0, 0, 671, 672, 1, 0, 0, 0, 672, 673, 5, 137, 0, 0, 673, 704, 1, 0, 0, 0, 674, 676, 5, 30, 0, 0, 675, 677, 5, 38, 0, 0, 676, 675, 1, 0, 0, 0, 676, 677, 1, 0, 0, 0, 677, 678, 1, 0, 0, 0, 678, 679, 3, 166, 83, 0, 679, 680, 5, 58, 0, 0, 680, 681, 3, 26, 13, 0, 681, 682, 5, 137, 0, 0, 682, 704, 1, 0, 0, 0, 683, 684, 5, 31, 0, 0, 684, 685, 3, 166, 83, 0, 685, 686, 5, 150, 0, 0, 686, 687, 5, 137, 0, 0, 687, 704, 1, 0, 0, 0, 688, 689, 5, 32, 0, 0, 689, 690, 3, 26, 13, 0, 690, 691, 5, 139, 0, 0, 691, 692, 3, 166, 83, 0, 692, 693, 3, 166, 83, 0, 693, 694, 3, 168, 84, 0, 694, 695, 5, 137, 0, 0, 695, 704, 1, 0, 0, 0, 696, 697, 5, 96, 0, 0, 697, 704, 5, 137, 0, 0, 698, 699, 5, 33, 0, 0, 699, 700, 5, 150, 0, 0, 700, 701, 3, 168, 84, 0, 701, 702, 5, 137, 0, 0, 702, 704, 1, 0, 0, 0, 703, 646, 1, 0, 0, 0, 703, 648, 1, 0, 0, 0, 703, 653, 1, 0, 0, 0, 703, 657, 1, 0, 0, 0, 703, 674, 1, 0, 0, 0, 703, 683, 1, 0, 0, 0, 703, 688, 1, 0, 0, 0, 703, 696, 1, 0, 0, 0, 703, 698, 1, 0, 0, 0, 704, 65, 1, 0, 0, 0, 705, 706, 3, 166, 83, 0, 706, 707, 5, 61, 0, 0, 707, 708, 3, 166, 83, 0, 708, 709, 5, 137, 0, 0, 709, 67, 1, 0, 0, 0, 710, 711, 5, 52, 0, 0, 711, 713, 3, 166, 83, 0, 712, 714, 3, 22, 11, 0, 713, 712, 1, 0, 0, 0, 713, 714, 1, 0, 0, 0, 714, 715, 1, 0, 0, 0, 715, 716, 5, 87, 0, 0, 716, 717, 3, 168, 84, 0, 717, 718, 5, 136, 0, 0, 718, 719, 3, 148, 74, 0, 719, 720, 5, 135, 0, 0, 720, 721, 3, 148, 74, 0, 721, 722, 5, 89, 0, 0, 722, 724, 3, 84, 42, 0, 723, 725, 3, 76, 38, 0, 724, 723, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 727, 1, 0, 0, 0, 726, 728, 3, 82, 41, 0, 727, 726, 1, 0, 0, 0, 727, 728, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 5, 91, 0, 0, 730, 732, 3, 86, 43, 0, 731, 733, 3, 90, 45, 0, 732, 731, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 735, 1, 0, 0, 0, 734, 736, 3, 74, 37, 0, 735, 734, 1, 0, 0, 0, 735, 736, 1, 0, 0, 0, 736, 738, 1, 0, 0, 0, 737, 739, 3, 72, 36, 0, 738, 737, 1, 0, 0, 0, 738, 739, 1, 0, 0, 0, 739, 740, 1, 0, 0, 0, 740, 741, 5, 137, 0, 0, 741, 69, 1, 0, 0, 0, 742, 743, 5, 53, 0, 0, 743, 745, 3, 166, 83, 0, 744, 746, 3, 22, 11, 0, 745, 744, 1, 0, 0, 0, 745, 746, 1, 0, 0, 0, 746, 747, 1, 0, 0, 0, 747, 748, 5, 87, 0, 0, 748, 749, 3, 168, 84, 0, 749, 750, 5, 136, 0, 0, 750, 751, 3, 148, 74, 0, 751, 752, 5, 135, 0, 0, 752, 754, 3, 148, 74, 0, 753, 755, 3, 76, 38, 0, 754, 753, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 757, 1, 0, 0, 0, 756, 758, 3, 90, 45, 0, 757, 756, 1, 0, 0, 0, 757, 758, 1, 0, 0, 0, 758, 760, 1, 0, 0, 0, 759, 761, 3, 74, 37, 0, 760, 759, 1, 0, 0, 0, 760, 761, 1, 0, 0, 0, 761, 763, 1, 0, 0, 0, 762, 764, 3, 72, 36, 0, 763, 762, 1, 0, 0, 0, 763, 764, 1, 0, 0, 0, 764, 765, 1, 0, 0, 0, 765, 766, 5, 137, 0, 0, 766, 71, 1, 0, 0, 0, 767, 768, 5, 69, 0, 0, 768, 769, 5, 68, 0, 0, 769, 770, 3, 166, 83, 0, 770, 73, 1, 0, 0, 0, 771, 772, 5, 9, 0, 0, 772, 773, 5, 7, 0, 0, 773, 774, 3, 166, 83, 0, 774, 775, 5, 68, 0, 0, 775, 776, 3, 168, 84, 0, 776, 75, 1, 0, 0, 0, 777, 778, 5, 12, 0, 0, 778, 787, 5, 15, 0, 0, 779, 780, 5, 12, 0, 0, 780, 781, 7, 2, 0, 0, 781, 782, 5, 16, 0, 0, 782, 783, 5, 142, 0, 0, 783, 784, 3, 88, 44, 0, 784, 785, 5, 143, 0, 0, 785, 787, 1, 0, 0, 0, 786, 777, 1, 0, 0, 0, 786, 779, 1, 0, 0, 0, 787, 77, 1, 0, 0, 0, 788, 789, 5, 68, 0, 0, 789, 790, 5, 142, 0, 0, 790, 795, 3, 130, 65, 0, 791, 792, 5, 138, 0, 0, 792, 794, 3, 130, 65, 0, 793, 791, 1, 0, 0, 0, 794, 797, 1, 0, 0, 0, 795, 793, 1, 0, 0, 0, 795, 796, 1, 0, 0, 0, 796, 798, 1, 0, 0, 0, 797, 795, 1, 0, 0, 0, 798, 799, 5, 143, 0, 0, 799, 79, 1, 0, 0, 0, 800, 801, 5, 54, 0, 0, 801, 802, 3, 166, 83, 0, 802, 803, 5, 87, 0, 0, 803, 804, 3, 168, 84, 0, 804, 805, 5, 55, 0, 0, 805, 806, 3, 166, 83, 0, 806, 807, 5, 136, 0, 0, 807, 809, 3, 148, 74, 0, 808, 810, 3, 90, 45, 0, 809, 808, 1, 0, 0, 0, 809, 810, 1, 0, 0, 0, 810, 811, 1, 0, 0, 0, 811, 812, 5, 137, 0, 0, 812, 81, 1, 0, 0, 0, 813, 814, 5, 90, 0, 0, 814, 815, 3, 148, 74, 0, 815, 83, 1, 0, 0, 0, 816, 817, 7, 3, 0, 0, 817, 85, 1, 0, 0, 0, 818, 837, 5, 93, 0, 0, 819, 820, 5, 45, 0, 0, 820, 837, 3, 166, 83, 0, 821, 822, 5, 38, 0, 0, 822, 837, 3, 166, 83, 0, 823, 824, 5, 47, 0, 0, 824, 833, 5, 142, 0, 0, 825, 830, 3, 26, 13, 0, 826, 827, 5, 138, 0, 0, 827, 829, 3, 26, 13, 0, 828, 826, 1, 0, 0, 0, 829, 832, 1, 0, 0, 0, 830, 828, 1, 0, 0, 0, 830, 831, 1, 0, 0, 0, 831, 834, 1, 0, 0, 0, 832, 830, 1, 0, 0, 0, 833, 825, 1, 0, 0, 0, 833, 834, 1, 0, 0, 0, 834, 835, 1, 0, 0, 0, 835, 837, 5, 143, 0, 0, 836, 818, 1, 0, 0, 0, 836, 819, 1, 0, 0, 0, 836, 821, 1, 0, 0, 0, 836, 823, 1, 0, 0, 0, 837, 87, 1, 0, 0, 0, 838, 843, 3, 166, 83, 0, 839, 840, 5, 138, 0, 0, 840, 842, 3, 166, 83, 0, 841, 839, 1, 0, 0, 0, 842, 845, 1, 0, 0, 0, 843, 841, 1, 0, 0, 0, 843, 844, 1, 0, 0, 0, 844, 89, 1, 0, 0, 0, 845, 843, 1, 0, 0, 0, 846, 847, 5, 92, 0, 0, 847, 851, 5, 140, 0, 0, 848, 850, 3, 92, 46, 0, 849, 848, 1, 0, 0, 0, 850, 853, 1, 0, 0, 0, 851, 849, 1, 0, 0, 0, 851, 852, 1, 0, 0, 0, 852, 854, 1, 0, 0, 0, 853, 851, 1, 0, 0, 0, 854, 855, 5, 141, 0, 0, 855, 91, 1, 0, 0, 0, 856, 857, 5, 25, 0, 0, 857, 858, 3, 166, 83, 0, 858, 859, 5, 87, 0, 0, 859, 860, 3, 168, 84, 0, 860, 861, 5, 142, 0, 0, 861, 862, 3, 88, 44, 0, 862, 863, 5, 143, 0, 0, 863, 864, 5, 137, 0, 0, 864, 939, 1, 0, 0, 0, 865, 866, 5, 64, 0, 0, 866, 867, 3, 166, 83, 0, 867, 868, 5, 87, 0, 0, 868, 869, 3, 168, 84, 0, 869, 870, 5, 136, 0, 0, 870, 871, 3, 148, 74, 0, 871, 872, 3, 94, 47, 0, 872, 873, 5, 137, 0, 0, 873, 939, 1, 0, 0, 0, 874, 875, 5, 65, 0, 0, 875, 876, 3, 166, 83, 0, 876, 877, 5, 87, 0, 0, 877, 878, 3, 168, 84, 0, 878, 879, 5, 136, 0, 0, 879, 880, 3, 156, 78, 0, 880, 883, 3, 50, 25, 0, 881, 882, 5, 85, 0, 0, 882, 884, 3, 168, 84, 0, 883, 881, 1, 0, 0, 0, 883, 884, 1, 0, 0, 0, 884, 885, 1, 0, 0, 0, 885, 886, 3, 94, 47, 0, 886, 887, 5, 137, 0, 0, 887, 939, 1, 0, 0, 0, 888, 889, 5, 46, 0, 0, 889, 890, 3, 166, 83, 0, 890, 891, 5, 87, 0, 0, 891, 892, 3, 168, 84, 0, 892, 893, 5, 136, 0, 0, 893, 895, 3, 166, 83, 0, 894, 896, 3, 28, 14, 0, 895, 894, 1, 0, 0, 0, 895, 896, 1, 0, 0, 0, 896, 898, 1, 0, 0, 0, 897, 899, 3, 78, 39, 0, 898, 897, 1, 0, 0, 0, 898, 899, 1, 0, 0, 0, 899, 902, 1, 0, 0, 0, 900, 901, 5, 20, 0, 0, 901, 903, 5, 56, 0, 0, 902, 900, 1, 0, 0, 0, 902, 903, 1, 0, 0, 0, 903, 904, 1, 0, 0, 0, 904, 905, 5, 137, 0, 0, 905, 939, 1, 0, 0, 0, 906, 907, 5, 7, 0, 0, 907, 908, 3, 166, 83, 0, 908, 909, 5, 87, 0, 0, 909, 910, 3, 168, 84, 0, 910, 911, 5, 136, 0, 0, 911, 912, 3, 166, 83, 0, 912, 913, 5, 56, 0, 0, 913, 914, 3, 148, 74, 0, 914, 915, 5, 137, 0, 0, 915, 939, 1, 0, 0, 0, 916, 917, 5, 54, 0, 0, 917, 918, 3, 166, 83, 0, 918, 919, 5, 87, 0, 0, 919, 920, 3, 168, 84, 0, 920, 921, 5, 136, 0, 0, 921, 924, 3, 166, 83, 0, 922, 923, 5, 56, 0, 0, 923, 925, 3, 148, 74, 0, 924, 922, 1, 0, 0, 0, 924, 925, 1, 0, 0, 0, 925, 926, 1, 0, 0, 0, 926, 927, 5, 137, 0, 0, 927, 939, 1, 0, 0, 0, 928, 929, 5, 24, 0, 0, 929, 930, 3, 166, 83, 0, 930, 931, 5, 87, 0, 0, 931, 932, 3, 168, 84, 0, 932, 933, 5, 136, 0, 0, 933, 934, 3, 166, 83, 0, 934, 935, 5, 139, 0, 0, 935, 936, 3, 166, 83, 0, 936, 937, 5, 137, 0, 0, 937, 939, 1, 0, 0, 0, 938, 856, 1, 0, 0, 0, 938, 865, 1, 0, 0, 0, 938, 874, 1, 0, 0, 0, 938, 888, 1, 0, 0, 0, 938, 906, 1, 0, 0, 0, 938, 916, 1, 0, 0, 0, 938, 928, 1, 0, 0, 0, 939, 93, 1, 0, 0, 0, 940, 941, 5, 142, 0, 0, 941, 946, 3, 96, 48, 0, 942, 943, 5, 138, 0, 0, 943, 945, 3, 96, 48, 0, 944, 942, 1, 0, 0, 0, 945, 948, 1, 0, 0, 0, 946, 944, 1, 0, 0, 0, 946, 947, 1, 0, 0, 0, 947, 949, 1, 0, 0, 0, 948, 946, 1, 0, 0, 0, 949, 950, 5, 143, 0, 0, 950, 95, 1, 0, 0, 0, 951, 952, 7, 4, 0, 0, 952, 97, 1, 0, 0, 0, 953, 954, 5, 63, 0, 0, 954, 955, 3, 100, 50, 0, 955, 99, 1, 0, 0, 0, 956, 959, 3, 102, 51, 0, 957, 959, 3, 106, 53, 0, 958, 956, 1, 0, 0, 0, 958, 957, 1, 0, 0, 0, 959, 101, 1, 0, 0, 0, 960, 961, 5, 64, 0, 0, 961, 962, 3, 166, 83, 0, 962, 963, 5, 87, 0, 0, 963, 964, 3, 168, 84, 0, 964, 965, 5, 74, 0, 0, 965, 966, 3, 166, 83, 0, 966, 967, 5, 136, 0, 0, 967, 968, 3, 148, 74, 0, 968, 969, 5, 75, 0, 0, 969, 972, 3, 104, 52, 0, 970, 971, 5, 76, 0, 0, 971, 973, 3, 158, 79, 0, 972, 970, 1, 0, 0, 0, 972, 973, 1, 0, 0, 0, 973, 974, 1, 0, 0, 0, 974, 975, 5, 137, 0, 0, 975, 103, 1, 0, 0, 0, 976, 983, 5, 109, 0, 0, 977, 978, 5, 110, 0, 0, 978, 979, 5, 144, 0, 0, 979, 980, 3, 148, 74, 0, 980, 981, 5, 145, 0, 0, 981, 983, 1, 0, 0, 0, 982, 976, 1, 0, 0, 0, 982, 977, 1, 0, 0, 0, 983, 105, 1, 0, 0, 0, 984, 985, 5, 65, 0, 0, 985, 986, 3, 166, 83, 0, 986, 987, 5, 87, 0, 0, 987, 988, 3, 168, 84, 0, 988, 989, 5, 140, 0, 0, 989, 990, 3, 108, 54, 0, 990, 991, 3, 108, 54, 0, 991, 992, 5, 141, 0, 0, 992, 107, 1, 0, 0, 0, 993, 994, 3, 50, 25, 0, 994, 995, 5, 66, 0, 0, 995, 996, 3, 166, 83, 0, 996, 997, 5, 87, 0, 0, 997, 998, 3, 168, 84, 0, 998, 1000, 3, 156, 78, 0, 999, 1001, 5, 115, 0, 0, 1000, 999, 1, 0, 0, 0, 1000, 1001, 1, 0, 0, 0, 1001, 1004, 1, 0, 0, 0, 1002, 1003, 5, 82, 0, 0, 1003, 1005, 3, 168, 84, 0, 1004, 1002, 1, 0, 0, 0, 1004, 1005, 1, 0, 0, 0, 1005, 1007, 1, 0, 0, 0, 1006, 1008, 5, 84, 0, 0, 1007, 1006, 1, 0, 0, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1011, 1, 0, 0, 0, 1009, 1010, 5, 85, 0, 0, 1010, 1012, 3, 168, 84, 0, 1011, 1009, 1, 0, 0, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1014, 1, 0, 0, 0, 1013, 1015, 5, 86, 0, 0, 1014, 1013, 1, 0, 0, 0, 1014, 1015, 1, 0, 0, 0, 1015, 1016, 1, 0, 0, 0, 1016, 1017, 5, 137, 0, 0, 1017, 109, 1, 0, 0, 0, 1018, 1020, 5, 57, 0, 0, 1019, 1021, 3, 22, 11, 0, 1020, 1019, 1, 0, 0, 0, 1020, 1021, 1, 0, 0, 0, 1021, 1022, 1, 0, 0, 0, 1022, 1024, 3, 166, 83, 0, 1023, 1025, 3, 112, 56, 0, 1024, 1023, 1, 0, 0, 0, 1024, 1025, 1, 0, 0, 0, 1025, 1026, 1, 0, 0, 0, 1026, 1027, 5, 58, 0, 0, 1027, 1029, 3, 166, 83, 0, 1028, 1030, 3, 28, 14, 0, 1029, 1028, 1, 0, 0, 0, 1029, 1030, 1, 0, 0, 0, 1030, 1033, 1, 0, 0, 0, 1031, 1032, 5, 87, 0, 0, 1032, 1034, 3, 168, 84, 0, 1033, 1031, 1, 0, 0, 0, 1033, 1034, 1, 0, 0, 0, 1034, 1037, 1, 0, 0, 0, 1035, 1036, 5, 81, 0, 0, 1036, 1038, 5, 150, 0, 0, 1037, 1035, 1, 0, 0, 0, 1037, 1038, 1, 0, 0, 0, 1038, 1039, 1, 0, 0, 0, 1039, 1043, 5, 140, 0, 0, 1040, 1042, 3, 114, 57, 0, 1041, 1040, 1, 0, 0, 0, 1042, 1045, 1, 0, 0, 0, 1043, 1041, 1, 0, 0, 0, 1043, 1044, 1, 0, 0, 0, 1044, 1046, 1, 0, 0, 0, 1045, 1043, 1, 0, 0, 0, 1046, 1047, 5, 141, 0, 0, 1047, 111, 1, 0, 0, 0, 1048, 1049, 3, 28, 14, 0, 1049, 113, 1, 0, 0, 0, 1050, 1051, 5, 62, 0, 0, 1051, 1058, 3, 100, 50, 0, 1052, 1058, 3, 128, 64, 0, 1053, 1058, 3, 124, 62, 0, 1054, 1058, 3, 118, 59, 0, 1055, 1058, 3, 126, 63, 0, 1056, 1058, 3, 116, 58, 0, 1057, 1050, 1, 0, 0, 0, 1057, 1052, 1, 0, 0, 0, 1057, 1053, 1, 0, 0, 0, 1057, 1054, 1, 0, 0, 0, 1057, 1055, 1, 0, 0, 0, 1057, 1056, 1, 0, 0, 0, 1058, 115, 1, 0, 0, 0, 1059, 1060, 5, 59, 0, 0, 1060, 1061, 3, 166, 83, 0, 1061, 1062, 5, 61, 0, 0, 1062, 1063, 3, 166, 83, 0, 1063, 1064, 5, 139, 0, 0, 1064, 1065, 3, 166, 83, 0, 1065, 1066, 5, 137, 0, 0, 1066, 117, 1, 0, 0, 0, 1067, 1068, 5, 10, 0, 0, 1068, 1072, 5, 140, 0, 0, 1069, 1071, 3, 120, 60, 0, 1070, 1069, 1, 0, 0, 0, 1071, 1074, 1, 0, 0, 0, 1072, 1070, 1, 0, 0, 0, 1072, 1073, 1, 0, 0, 0, 1073, 1075, 1, 0, 0, 0, 1074, 1072, 1, 0, 0, 0, 1075, 1076, 5, 141, 0, 0, 1076, 1077, 5, 137, 0, 0, 1077, 119, 1, 0, 0, 0, 1078, 1079, 3, 166, 83, 0, 1079, 1080, 5, 61, 0, 0, 1080, 1081, 5, 64, 0, 0, 1081, 1082, 3, 166, 83, 0, 1082, 1083, 5, 137, 0, 0, 1083, 1093, 1, 0, 0, 0, 1084, 1085, 3, 166, 83, 0, 1085, 1086, 5, 61, 0, 0, 1086, 1087, 5, 65, 0, 0, 1087, 1088, 3, 166, 83, 0, 1088, 1089, 5, 139, 0, 0, 1089, 1090, 3, 166, 83, 0, 1090, 1091, 5, 137, 0, 0, 1091, 1093, 1, 0, 0, 0, 1092, 1078, 1, 0, 0, 0, 1092, 1084, 1, 0, 0, 0, 1093, 121, 1, 0, 0, 0, 1094, 1095, 3, 26, 13, 0, 1095, 1096, 5, 20, 0, 0, 1096, 1101, 5, 56, 0, 0, 1097, 1098, 5, 139, 0, 0, 1098, 1100, 3, 166, 83, 0, 1099, 1097, 1, 0, 0, 0, 1100, 1103, 1, 0, 0, 0, 1101, 1099, 1, 0, 0, 0, 1101, 1102, 1, 0, 0, 0, 1102, 1104, 1, 0, 0, 0, 1103, 1101, 1, 0, 0, 0, 1104, 1105, 5, 137, 0, 0, 1105, 123, 1, 0, 0, 0, 1106, 1107, 5, 59, 0, 0, 1107, 1108, 3, 166, 83, 0, 1108, 1109, 5, 61, 0, 0, 1109, 1110, 5, 64, 0, 0, 1110, 1111, 3, 166, 83, 0, 1111, 1112, 5, 137, 0, 0, 1112, 125, 1, 0, 0, 0, 1113, 1114, 5, 71, 0, 0, 1114, 1115, 3, 166, 83, 0, 1115, 1116, 5, 72, 0, 0, 1116, 1117, 5, 73, 0, 0, 1117, 1118, 5, 68, 0, 0, 1118, 1119, 5, 54, 0, 0, 1119, 1120, 3, 166, 83, 0, 1120, 1121, 5, 70, 0, 0, 1121, 1122, 5, 65, 0, 0, 1122, 1123, 3, 166, 83, 0, 1123, 1124, 5, 139, 0, 0, 1124, 1125, 3, 166, 83, 0, 1125, 1126, 5, 137, 0, 0, 1126, 127, 1, 0, 0, 0, 1127, 1128, 5, 59, 0, 0, 1128, 1129, 3, 130, 65, 0, 1129, 1130, 5, 61, 0, 0, 1130, 1133, 3, 134, 67, 0, 1131, 1132, 5, 36, 0, 0, 1132, 1134, 3, 168, 84, 0, 1133, 1131, 1, 0, 0, 0, 1133, 1134, 1, 0, 0, 0, 1134, 1135, 1, 0, 0, 0, 1135, 1136, 5, 137, 0, 0, 1136, 129, 1, 0, 0, 0, 1137, 1138, 3, 166, 83, 0, 1138, 1139, 5, 139, 0, 0, 1139, 1140, 3, 132, 66, 0, 1140, 131, 1, 0, 0, 0, 1141, 1154, 3, 166, 83, 0, 1142, 1154, 5, 104, 0, 0, 1143, 1154, 5, 94, 0, 0, 1144, 1154, 5, 95, 0, 0, 1145, 1154, 5, 1, 0, 0, 1146, 1154, 5, 101, 0, 0, 1147, 1154, 5, 102, 0, 0, 1148, 1154, 5, 103, 0, 0, 1149, 1154, 5, 105, 0, 0, 1150, 1154, 5, 106, 0, 0, 1151, 1154, 5, 107, 0, 0, 1152, 1154, 5, 108, 0, 0, 1153, 1141, 1, 0, 0, 0, 1153, 1142, 1, 0, 0, 0, 1153, 1143, 1, 0, 0, 0, 1153, 1144, 1, 0, 0, 0, 1153, 1145, 1, 0, 0, 0, 1153, 1146, 1, 0, 0, 0, 1153, 1147, 1, 0, 0, 0, 1153, 1148, 1, 0, 0, 0, 1153, 1149, 1, 0, 0, 0, 1153, 1150, 1, 0, 0, 0, 1153, 1151, 1, 0, 0, 0, 1153, 1152, 1, 0, 0, 0, 1154, 133, 1, 0, 0, 0, 1155, 1156, 5, 83, 0, 0, 1156, 1157, 5, 139, 0, 0, 1157, 1192, 3, 166, 83, 0, 1158, 1159, 5, 64, 0, 0, 1159, 1160, 3, 166, 83, 0, 1160, 1161, 5, 139, 0, 0, 1161, 1162, 3, 138, 69, 0, 1162, 1192, 1, 0, 0, 0, 1163, 1164, 5, 65, 0, 0, 1164, 1165, 3, 166, 83, 0, 1165, 1166, 5, 139, 0, 0, 1166, 1167, 3, 166, 83, 0, 1167, 1168, 5, 139, 0, 0, 1168, 1169, 3, 140, 70, 0, 1169, 1192, 1, 0, 0, 0, 1170, 1171, 5, 46, 0, 0, 1171, 1173, 3, 166, 83, 0, 1172, 1174, 3, 28, 14, 0, 1173, 1172, 1, 0, 0, 0, 1173, 1174, 1, 0, 0, 0, 1174, 1175, 1, 0, 0, 0, 1175, 1176, 5, 139, 0, 0, 1176, 1177, 3, 130, 65, 0, 1177, 1192, 1, 0, 0, 0, 1178, 1179, 5, 48, 0, 0, 1179, 1180, 3, 166, 83, 0, 1180, 1181, 5, 139, 0, 0, 1181, 1183, 3, 166, 83, 0, 1182, 1184, 3, 28, 14, 0, 1183, 1182, 1, 0, 0, 0, 1183, 1184, 1, 0, 0, 0, 1184, 1186, 1, 0, 0, 0, 1185, 1187, 3, 142, 71, 0, 1186, 1185, 1, 0, 0, 0, 1186, 1187, 1, 0, 0, 0, 1187, 1189, 1, 0, 0, 0, 1188, 1190, 3, 136, 68, 0, 1189, 1188, 1, 0, 0, 0, 1189, 1190, 1, 0, 0, 0, 1190, 1192, 1, 0, 0, 0, 1191, 1155, 1, 0, 0, 0, 1191, 1158, 1, 0, 0, 0, 1191, 1163, 1, 0, 0, 0, 1191, 1170, 1, 0, 0, 0, 1191, 1178, 1, 0, 0, 0, 1192, 135, 1, 0, 0, 0, 1193, 1194, 5, 69, 0, 0, 1194, 1195, 3, 142, 71, 0, 1195, 137, 1, 0, 0, 0, 1196, 1197, 7, 5, 0, 0, 1197, 139, 1, 0, 0, 0, 1198, 1199, 7, 6, 0, 0, 1199, 141, 1, 0, 0, 0, 1200, 1201, 5, 67, 0, 0, 1201, 1205, 5, 140, 0, 0, 1202, 1204, 3, 144, 72, 0, 1203, 1202, 1, 0, 0, 0, 1204, 1207, 1, 0, 0, 0, 1205, 1203, 1, 0, 0, 0, 1205, 1206, 1, 0, 0, 0, 1206, 1208, 1, 0, 0, 0, 1207, 1205, 1, 0, 0, 0, 1208, 1209, 5, 141, 0, 0, 1209, 143, 1, 0, 0, 0, 1210, 1211, 3, 166, 83, 0, 1211, 1212, 5, 61, 0, 0, 1212, 1213, 5, 11, 0, 0, 1213, 1214, 5, 25, 0, 0, 1214, 1215, 5, 142, 0, 0, 1215, 1216, 3, 88, 44, 0, 1216, 1217, 5, 143, 0, 0, 1217, 1218, 5, 137, 0, 0, 1218, 1309, 1, 0, 0, 0, 1219, 1220, 3, 166, 83, 0, 1220, 1221, 5, 61, 0, 0, 1221, 1222, 5, 64, 0, 0, 1222, 1229, 3, 166, 83, 0, 1223, 1224, 5, 70, 0, 0, 1224, 1225, 5, 65, 0, 0, 1225, 1226, 3, 166, 83, 0, 1226, 1227, 5, 139, 0, 0, 1227, 1228, 3, 166, 83, 0, 1228, 1230, 1, 0, 0, 0, 1229, 1223, 1, 0, 0, 0, 1229, 1230, 1, 0, 0, 0, 1230, 1231, 1, 0, 0, 0, 1231, 1232, 5, 137, 0, 0, 1232, 1309, 1, 0, 0, 0, 1233, 1234, 3, 166, 83, 0, 1234, 1235, 5, 61, 0, 0, 1235, 1236, 5, 65, 0, 0, 1236, 1237, 3, 166, 83, 0, 1237, 1238, 5, 139, 0, 0, 1238, 1245, 3, 166, 83, 0, 1239, 1240, 5, 70, 0, 0, 1240, 1241, 5, 65, 0, 0, 1241, 1242, 3, 166, 83, 0, 1242, 1243, 5, 139, 0, 0, 1243, 1244, 3, 166, 83, 0, 1244, 1246, 1, 0, 0, 0, 1245, 1239, 1, 0, 0, 0, 1245, 1246, 1, 0, 0, 0, 1246, 1247, 1, 0, 0, 0, 1247, 1248, 5, 137, 0, 0, 1248, 1309, 1, 0, 0, 0, 1249, 1250, 3, 166, 83, 0, 1250, 1251, 5, 61, 0, 0, 1251, 1252, 5, 46, 0, 0, 1252, 1254, 3, 166, 83, 0, 1253, 1255, 3, 28, 14, 0, 1254, 1253, 1, 0, 0, 0, 1254, 1255, 1, 0, 0, 0, 1255, 1264, 1, 0, 0, 0, 1256, 1257, 5, 70, 0, 0, 1257, 1258, 5, 65, 0, 0, 1258, 1259, 3, 166, 83, 0, 1259, 1260, 5, 139, 0, 0, 1260, 1261, 3, 166, 83, 0, 1261, 1265, 1, 0, 0, 0, 1262, 1263, 5, 20, 0, 0, 1263, 1265, 5, 56, 0, 0, 1264, 1256, 1, 0, 0, 0, 1264, 1262, 1, 0, 0, 0, 1264, 1265, 1, 0, 0, 0, 1265, 1266, 1, 0, 0, 0, 1266, 1267, 5, 137, 0, 0, 1267, 1309, 1, 0, 0, 0, 1268, 1269, 3, 166, 83, 0, 1269, 1270, 5, 61, 0, 0, 1270, 1271, 5, 7, 0, 0, 1271, 1272, 3, 166, 83, 0, 1272, 1273, 5, 67, 0, 0, 1273, 1277, 5, 140, 0, 0, 1274, 1276, 3, 122, 61, 0, 1275, 1274, 1, 0, 0, 0, 1276, 1279, 1, 0, 0, 0, 1277, 1275, 1, 0, 0, 0, 1277, 1278, 1, 0, 0, 0, 1278, 1280, 1, 0, 0, 0, 1279, 1277, 1, 0, 0, 0, 1280, 1281, 5, 141, 0, 0, 1281, 1282, 5, 137, 0, 0, 1282, 1309, 1, 0, 0, 0, 1283, 1284, 3, 166, 83, 0, 1284, 1285, 5, 61, 0, 0, 1285, 1286, 5, 54, 0, 0, 1286, 1287, 3, 166, 83, 0, 1287, 1288, 5, 137, 0, 0, 1288, 1309, 1, 0, 0, 0, 1289, 1290, 3, 166, 83, 0, 1290, 1292, 5, 61, 0, 0, 1291, 1293, 5, 11, 0, 0, 1292, 1291, 1, 0, 0, 0, 1292, 1293, 1, 0, 0, 0, 1293, 1294, 1, 0, 0, 0, 1294, 1295, 5, 24, 0, 0, 1295, 1296, 3, 166, 83, 0, 1296, 1297, 5, 139, 0, 0, 1297, 1304, 3, 166, 83, 0, 1298, 1299, 5, 70, 0, 0, 1299, 1300, 5, 65, 0, 0, 1300, 1301, 3, 166, 83, 0, 1301, 1302, 5, 139, 0, 0, 1302, 1303, 3, 166, 83, 0, 1303, 1305, 1, 0, 0, 0, 1304, 1298, 1, 0, 0, 0, 1304, 1305, 1, 0, 0, 0, 1305, 1306, 1, 0, 0, 0, 1306, 1307, 5, 137, 0, 0, 1307, 1309, 1, 0, 0, 0, 1308, 1210, 1, 0, 0, 0, 1308, 1219, 1, 0, 0, 0, 1308, 1233, 1, 0, 0, 0, 1308, 1249, 1, 0, 0, 0, 1308, 1268, 1, 0, 0, 0, 1308, 1283, 1, 0, 0, 0, 1308, 1289, 1, 0, 0, 0, 1309, 145, 1, 0, 0, 0, 1310, 1311, 5, 54, 0, 0, 1311, 1312, 3, 166, 83, 0, 1312, 1313, 5, 61, 0, 0, 1313, 1314, 3, 166, 83, 0, 1314, 1315, 5, 139, 0, 0, 1315, 1317, 3, 166, 83, 0, 1316, 1318, 3, 142, 71, 0, 1317, 1316, 1, 0, 0, 0, 1317, 1318, 1, 0, 0, 0, 1318, 1319, 1, 0, 0, 0, 1319, 1320, 5, 137, 0, 0, 1320, 147, 1, 0, 0, 0, 1321, 1379, 3, 154, 77, 0, 1322, 1379, 5, 116, 0, 0, 1323, 1379, 5, 117, 0, 0, 1324, 1325, 5, 118, 0, 0, 1325, 1379, 3, 168, 84, 0, 1326, 1327, 5, 119, 0, 0, 1327, 1328, 5, 146, 0, 0, 1328, 1329, 3, 166, 83, 0, 1329, 1330, 5, 147, 0, 0, 1330, 1379, 1, 0, 0, 0, 1331, 1332, 5, 120, 0, 0, 1332, 1333, 5, 146, 0, 0, 1333, 1335, 3, 166, 83, 0, 1334, 1336, 3, 28, 14, 0, 1335, 1334, 1, 0, 0, 0, 1335, 1336, 1, 0, 0, 0, 1336, 1337, 1, 0, 0, 0, 1337, 1338, 5, 147, 0, 0, 1338, 1379, 1, 0, 0, 0, 1339, 1340, 5, 41, 0, 0, 1340, 1341, 5, 146, 0, 0, 1341, 1342, 3, 166, 83, 0, 1342, 1343, 5, 147, 0, 0, 1343, 1379, 1, 0, 0, 0, 1344, 1345, 5, 121, 0, 0, 1345, 1346, 5, 146, 0, 0, 1346, 1347, 3, 148, 74, 0, 1347, 1348, 5, 147, 0, 0, 1348, 1379, 1, 0, 0, 0, 1349, 1350, 5, 122, 0, 0, 1350, 1351, 5, 146, 0, 0, 1351, 1352, 3, 148, 74, 0, 1352, 1353, 5, 147, 0, 0, 1353, 1379, 1, 0, 0, 0, 1354, 1355, 5, 123, 0, 0, 1355, 1359, 5, 140, 0, 0, 1356, 1358, 3, 150, 75, 0, 1357, 1356, 1, 0, 0, 0, 1358, 1361, 1, 0, 0, 0, 1359, 1357, 1, 0, 0, 0, 1359, 1360, 1, 0, 0, 0, 1360, 1362, 1, 0, 0, 0, 1361, 1359, 1, 0, 0, 0, 1362, 1379, 5, 141, 0, 0, 1363, 1364, 5, 8, 0, 0, 1364, 1365, 5, 87, 0, 0, 1365, 1366, 3, 168, 84, 0, 1366, 1368, 5, 140, 0, 0, 1367, 1369, 3, 152, 76, 0, 1368, 1367, 1, 0, 0, 0, 1369, 1370, 1, 0, 0, 0, 1370, 1368, 1, 0, 0, 0, 1370, 1371, 1, 0, 0, 0, 1371, 1372, 1, 0, 0, 0, 1372, 1373, 5, 141, 0, 0, 1373, 1379, 1, 0, 0, 0, 1374, 1376, 3, 166, 83, 0, 1375, 1377, 3, 28, 14, 0, 1376, 1375, 1, 0, 0, 0, 1376, 1377, 1, 0, 0, 0, 1377, 1379, 1, 0, 0, 0, 1378, 1321, 1, 0, 0, 0, 1378, 1322, 1, 0, 0, 0, 1378, 1323, 1, 0, 0, 0, 1378, 1324, 1, 0, 0, 0, 1378, 1326, 1, 0, 0, 0, 1378, 1331, 1, 0, 0, 0, 1378, 1339, 1, 0, 0, 0, 1378, 1344, 1, 0, 0, 0, 1378, 1349, 1, 0, 0, 0, 1378, 1354, 1, 0, 0, 0, 1378, 1363, 1, 0, 0, 0, 1378, 1374, 1, 0, 0, 0, 1379, 149, 1, 0, 0, 0, 1380, 1381, 3, 166, 83, 0, 1381, 1382, 5, 136, 0, 0, 1382, 1383, 3, 148, 74, 0, 1383, 1384, 5, 137, 0, 0, 1384, 151, 1, 0, 0, 0, 1385, 1386, 3, 166, 83, 0, 1386, 1387, 5, 87, 0, 0, 1387, 1388, 3, 168, 84, 0, 1388, 1389, 5, 136, 0, 0, 1389, 1390, 3, 148, 74, 0, 1390, 1391, 5, 137, 0, 0, 1391, 153, 1, 0, 0, 0, 1392, 1393, 7, 7, 0, 0, 1393, 155, 1, 0, 0, 0, 1394, 1395, 7, 8, 0, 0, 1395, 157, 1, 0, 0, 0, 1396, 1405, 3, 168, 84, 0, 1397, 1405, 5, 150, 0, 0, 1398, 1405, 5, 151, 0, 0, 1399, 1405, 5, 132, 0, 0, 1400, 1405, 5, 133, 0, 0, 1401, 1405, 5, 134, 0, 0, 1402, 1405, 3, 160, 80, 0, 1403, 1405, 3, 164, 82, 0, 1404, 1396, 1, 0, 0, 0, 1404, 1397, 1, 0, 0, 0, 1404, 1398, 1, 0, 0, 0, 1404, 1399, 1, 0, 0, 0, 1404, 1400, 1, 0, 0, 0, 1404, 1401, 1, 0, 0, 0, 1404, 1402, 1, 0, 0, 0, 1404, 1403, 1, 0, 0, 0, 1405, 159, 1, 0, 0, 0, 1406, 1415, 5, 140, 0, 0, 1407, 1412, 3, 162, 81, 0, 1408, 1409, 5, 138, 0, 0, 1409, 1411, 3, 162, 81, 0, 1410, 1408, 1, 0, 0, 0, 1411, 1414, 1, 0, 0, 0, 1412, 1410, 1, 0, 0, 0, 1412, 1413, 1, 0, 0, 0, 1413, 1416, 1, 0, 0, 0, 1414, 1412, 1, 0, 0, 0, 1415, 1407, 1, 0, 0, 0, 1415, 1416, 1, 0, 0, 0, 1416, 1417, 1, 0, 0, 0, 1417, 1418, 5, 141, 0, 0, 1418, 161, 1, 0, 0, 0, 1419, 1420, 3, 168, 84, 0, 1420, 1421, 5, 136, 0, 0, 1421, 1422, 3, 158, 79, 0, 1422, 163, 1, 0, 0, 0, 1423, 1432, 5, 142, 0, 0, 1424, 1429, 3, 158, 79, 0, 1425, 1426, 5, 138, 0, 0, 1426, 1428, 3, 158, 79, 0, 1427, 1425, 1, 0, 0, 0, 1428, 1431, 1, 0, 0, 0, 1429, 1427, 1, 0, 0, 0, 1429, 1430, 1, 0, 0, 0, 1430, 1433, 1, 0, 0, 0, 1431, 1429, 1, 0, 0, 0, 1432, 1424, 1, 0, 0, 0, 1432, 1433, 1, 0, 0, 0, 1433, 1434, 1, 0, 0, 0, 1434, 1435, 5, 143, 0, 0, 1435, 165, 1, 0, 0, 0, 1436, 1437, 7, 9, 0, 0, 1437, 167, 1, 0, 0, 0, 1438, 1439, 5, 153, 0, 0, 1439, 169, 1, 0, 0, 0, 129, 182, 189, 210, 223, 235, 255, 263, 270, 276, 288, 291, 297, 308, 317, 327, 330, 332, 336, 344, 356, 361, 371, 381, 386, 401, 407, 419, 428, 436, 444, 457, 460, 470, 474, 480, 487, 493, 501, 509, 522, 529, 533, 538, 549, 555, 566, 592, 596, 602, 613, 622, 628, 633, 635, 666, 670, 676, 703, 713, 724, 727, 732, 735, 738, 745, 754, 757, 760, 763, 786, 795, 809, 830, 833, 836, 843, 851, 883, 895, 898, 902, 924, 938, 946, 958, 972, 982, 1000, 1004, 1007, 1011, 1014, 1020, 1024, 1029, 1033, 1037, 1043, 1057, 1072, 1092, 1101, 1133, 1153, 1173, 1183, 1186, 1189, 1191, 1205, 1229, 1245, 1254, 1264, 1277, 1292, 1304, 1308, 1317, 1335, 1359, 1370, 1376, 1378, 1404, 1412, 1415, 1429, 1432] \ No newline at end of file +[4, 1, 158, 1458, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 183, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 188, 8, 1, 10, 1, 12, 1, 191, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 209, 8, 3, 10, 3, 12, 3, 212, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 224, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 236, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 256, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 264, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 269, 8, 10, 10, 10, 12, 10, 272, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 277, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 287, 8, 10, 10, 10, 12, 10, 290, 9, 10, 3, 10, 292, 8, 10, 1, 10, 1, 10, 5, 10, 296, 8, 10, 10, 10, 12, 10, 299, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 307, 8, 11, 10, 11, 12, 11, 310, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 318, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 326, 8, 12, 10, 12, 12, 12, 329, 9, 12, 3, 12, 331, 8, 12, 3, 12, 333, 8, 12, 1, 13, 1, 13, 3, 13, 337, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 343, 8, 14, 10, 14, 12, 14, 346, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 357, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 362, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 372, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 382, 8, 18, 1, 18, 1, 18, 1, 19, 3, 19, 387, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 402, 8, 19, 1, 19, 1, 19, 1, 19, 1, 20, 3, 20, 408, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 418, 8, 20, 10, 20, 12, 20, 421, 9, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 429, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 437, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 445, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 458, 8, 21, 1, 22, 3, 22, 461, 8, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 471, 8, 22, 1, 22, 1, 22, 3, 22, 475, 8, 22, 1, 22, 1, 22, 5, 22, 479, 8, 22, 10, 22, 12, 22, 482, 9, 22, 1, 22, 1, 22, 1, 23, 1, 23, 3, 23, 488, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 494, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 502, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 510, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 523, 8, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 530, 8, 25, 1, 25, 1, 25, 3, 25, 534, 8, 25, 1, 26, 5, 26, 537, 8, 26, 10, 26, 12, 26, 540, 9, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 550, 8, 26, 1, 26, 1, 26, 5, 26, 554, 8, 26, 10, 26, 12, 26, 557, 9, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 567, 8, 27, 1, 28, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 3, 30, 593, 8, 30, 1, 30, 1, 30, 3, 30, 597, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 603, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 5, 30, 612, 8, 30, 10, 30, 12, 30, 615, 9, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 623, 8, 30, 1, 30, 1, 30, 5, 30, 627, 8, 30, 10, 30, 12, 30, 630, 9, 30, 1, 30, 1, 30, 3, 30, 634, 8, 30, 3, 30, 636, 8, 30, 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, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 665, 8, 32, 10, 32, 12, 32, 668, 9, 32, 1, 32, 3, 32, 671, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 677, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 704, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 3, 34, 714, 8, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 725, 8, 34, 1, 34, 3, 34, 728, 8, 34, 1, 34, 1, 34, 1, 34, 3, 34, 733, 8, 34, 1, 34, 3, 34, 736, 8, 34, 1, 34, 3, 34, 739, 8, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 3, 35, 746, 8, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 755, 8, 35, 1, 35, 3, 35, 758, 8, 35, 1, 35, 3, 35, 761, 8, 35, 1, 35, 3, 35, 764, 8, 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, 38, 1, 38, 3, 38, 787, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 794, 8, 39, 10, 39, 12, 39, 797, 9, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 810, 8, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 5, 43, 829, 8, 43, 10, 43, 12, 43, 832, 9, 43, 3, 43, 834, 8, 43, 1, 43, 3, 43, 837, 8, 43, 1, 44, 1, 44, 1, 44, 5, 44, 842, 8, 44, 10, 44, 12, 44, 845, 9, 44, 1, 45, 1, 45, 1, 45, 5, 45, 850, 8, 45, 10, 45, 12, 45, 853, 9, 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, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 884, 8, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 896, 8, 46, 1, 46, 3, 46, 899, 8, 46, 1, 46, 1, 46, 3, 46, 903, 8, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 925, 8, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 939, 8, 46, 1, 47, 1, 47, 1, 47, 1, 47, 5, 47, 945, 8, 47, 10, 47, 12, 47, 948, 9, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 3, 50, 959, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 973, 8, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 990, 8, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 1008, 8, 54, 1, 54, 1, 54, 3, 54, 1012, 8, 54, 1, 54, 3, 54, 1015, 8, 54, 1, 54, 1, 54, 3, 54, 1019, 8, 54, 1, 54, 3, 54, 1022, 8, 54, 1, 54, 1, 54, 1, 55, 1, 55, 3, 55, 1028, 8, 55, 1, 55, 1, 55, 3, 55, 1032, 8, 55, 1, 55, 1, 55, 1, 55, 3, 55, 1037, 8, 55, 1, 55, 1, 55, 3, 55, 1041, 8, 55, 1, 55, 1, 55, 3, 55, 1045, 8, 55, 1, 55, 1, 55, 5, 55, 1049, 8, 55, 10, 55, 12, 55, 1052, 9, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 1065, 8, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 5, 59, 1078, 8, 59, 10, 59, 12, 59, 1081, 9, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1100, 8, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 5, 61, 1107, 8, 61, 10, 61, 12, 61, 1110, 9, 61, 1, 61, 1, 61, 1, 62, 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, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1141, 8, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1161, 8, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1191, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1201, 8, 67, 1, 67, 3, 67, 1204, 8, 67, 1, 67, 3, 67, 1207, 8, 67, 3, 67, 1209, 8, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 5, 71, 1221, 8, 71, 10, 71, 12, 71, 1224, 9, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1247, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1263, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1272, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1282, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 5, 72, 1293, 8, 72, 10, 72, 12, 72, 1296, 9, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1310, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1322, 8, 72, 1, 72, 1, 72, 3, 72, 1326, 8, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1335, 8, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 3, 74, 1353, 8, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 5, 74, 1375, 8, 74, 10, 74, 12, 74, 1378, 9, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 4, 74, 1386, 8, 74, 11, 74, 12, 74, 1387, 1, 74, 1, 74, 1, 74, 1, 74, 3, 74, 1394, 8, 74, 3, 74, 1396, 8, 74, 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, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 3, 79, 1422, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 5, 80, 1428, 8, 80, 10, 80, 12, 80, 1431, 9, 80, 3, 80, 1433, 8, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 5, 82, 1445, 8, 82, 10, 82, 12, 82, 1448, 9, 82, 3, 82, 1450, 8, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 0, 0, 85, 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, 0, 10, 1, 0, 49, 50, 2, 0, 17, 17, 35, 35, 1, 0, 13, 14, 1, 0, 106, 110, 3, 0, 1, 1, 101, 105, 107, 108, 3, 0, 1, 1, 101, 102, 107, 108, 2, 0, 103, 105, 107, 108, 1, 0, 126, 133, 1, 0, 113, 116, 13, 0, 1, 1, 4, 7, 10, 10, 12, 35, 42, 42, 47, 47, 77, 77, 84, 85, 99, 100, 104, 104, 111, 111, 120, 120, 154, 154, 1581, 0, 182, 1, 0, 0, 0, 2, 184, 1, 0, 0, 0, 4, 194, 1, 0, 0, 0, 6, 198, 1, 0, 0, 0, 8, 223, 1, 0, 0, 0, 10, 235, 1, 0, 0, 0, 12, 237, 1, 0, 0, 0, 14, 244, 1, 0, 0, 0, 16, 255, 1, 0, 0, 0, 18, 257, 1, 0, 0, 0, 20, 270, 1, 0, 0, 0, 22, 302, 1, 0, 0, 0, 24, 332, 1, 0, 0, 0, 26, 334, 1, 0, 0, 0, 28, 338, 1, 0, 0, 0, 30, 356, 1, 0, 0, 0, 32, 358, 1, 0, 0, 0, 34, 371, 1, 0, 0, 0, 36, 373, 1, 0, 0, 0, 38, 386, 1, 0, 0, 0, 40, 407, 1, 0, 0, 0, 42, 457, 1, 0, 0, 0, 44, 460, 1, 0, 0, 0, 46, 485, 1, 0, 0, 0, 48, 522, 1, 0, 0, 0, 50, 533, 1, 0, 0, 0, 52, 538, 1, 0, 0, 0, 54, 566, 1, 0, 0, 0, 56, 568, 1, 0, 0, 0, 58, 578, 1, 0, 0, 0, 60, 590, 1, 0, 0, 0, 62, 637, 1, 0, 0, 0, 64, 703, 1, 0, 0, 0, 66, 705, 1, 0, 0, 0, 68, 710, 1, 0, 0, 0, 70, 742, 1, 0, 0, 0, 72, 767, 1, 0, 0, 0, 74, 771, 1, 0, 0, 0, 76, 786, 1, 0, 0, 0, 78, 788, 1, 0, 0, 0, 80, 800, 1, 0, 0, 0, 82, 813, 1, 0, 0, 0, 84, 816, 1, 0, 0, 0, 86, 836, 1, 0, 0, 0, 88, 838, 1, 0, 0, 0, 90, 846, 1, 0, 0, 0, 92, 938, 1, 0, 0, 0, 94, 940, 1, 0, 0, 0, 96, 951, 1, 0, 0, 0, 98, 953, 1, 0, 0, 0, 100, 958, 1, 0, 0, 0, 102, 960, 1, 0, 0, 0, 104, 989, 1, 0, 0, 0, 106, 991, 1, 0, 0, 0, 108, 1000, 1, 0, 0, 0, 110, 1025, 1, 0, 0, 0, 112, 1055, 1, 0, 0, 0, 114, 1064, 1, 0, 0, 0, 116, 1066, 1, 0, 0, 0, 118, 1074, 1, 0, 0, 0, 120, 1099, 1, 0, 0, 0, 122, 1101, 1, 0, 0, 0, 124, 1113, 1, 0, 0, 0, 126, 1120, 1, 0, 0, 0, 128, 1134, 1, 0, 0, 0, 130, 1144, 1, 0, 0, 0, 132, 1160, 1, 0, 0, 0, 134, 1208, 1, 0, 0, 0, 136, 1210, 1, 0, 0, 0, 138, 1213, 1, 0, 0, 0, 140, 1215, 1, 0, 0, 0, 142, 1217, 1, 0, 0, 0, 144, 1325, 1, 0, 0, 0, 146, 1327, 1, 0, 0, 0, 148, 1395, 1, 0, 0, 0, 150, 1397, 1, 0, 0, 0, 152, 1402, 1, 0, 0, 0, 154, 1409, 1, 0, 0, 0, 156, 1411, 1, 0, 0, 0, 158, 1421, 1, 0, 0, 0, 160, 1423, 1, 0, 0, 0, 162, 1436, 1, 0, 0, 0, 164, 1440, 1, 0, 0, 0, 166, 1453, 1, 0, 0, 0, 168, 1455, 1, 0, 0, 0, 170, 171, 3, 6, 3, 0, 171, 172, 5, 0, 0, 1, 172, 183, 1, 0, 0, 0, 173, 174, 3, 20, 10, 0, 174, 175, 5, 0, 0, 1, 175, 183, 1, 0, 0, 0, 176, 177, 3, 52, 26, 0, 177, 178, 5, 0, 0, 1, 178, 183, 1, 0, 0, 0, 179, 180, 3, 2, 1, 0, 180, 181, 5, 0, 0, 1, 181, 183, 1, 0, 0, 0, 182, 170, 1, 0, 0, 0, 182, 173, 1, 0, 0, 0, 182, 176, 1, 0, 0, 0, 182, 179, 1, 0, 0, 0, 183, 1, 1, 0, 0, 0, 184, 185, 5, 42, 0, 0, 185, 189, 5, 142, 0, 0, 186, 188, 3, 8, 4, 0, 187, 186, 1, 0, 0, 0, 188, 191, 1, 0, 0, 0, 189, 187, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, 192, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 192, 193, 5, 143, 0, 0, 193, 3, 1, 0, 0, 0, 194, 195, 5, 43, 0, 0, 195, 196, 3, 168, 84, 0, 196, 197, 5, 139, 0, 0, 197, 5, 1, 0, 0, 0, 198, 199, 5, 11, 0, 0, 199, 200, 3, 166, 83, 0, 200, 201, 5, 89, 0, 0, 201, 202, 3, 168, 84, 0, 202, 203, 5, 80, 0, 0, 203, 204, 3, 168, 84, 0, 204, 205, 5, 79, 0, 0, 205, 206, 3, 168, 84, 0, 206, 210, 5, 142, 0, 0, 207, 209, 3, 8, 4, 0, 208, 207, 1, 0, 0, 0, 209, 212, 1, 0, 0, 0, 210, 208, 1, 0, 0, 0, 210, 211, 1, 0, 0, 0, 211, 213, 1, 0, 0, 0, 212, 210, 1, 0, 0, 0, 213, 214, 5, 143, 0, 0, 214, 7, 1, 0, 0, 0, 215, 224, 3, 4, 2, 0, 216, 224, 3, 18, 9, 0, 217, 224, 3, 10, 5, 0, 218, 224, 3, 98, 49, 0, 219, 224, 3, 110, 55, 0, 220, 224, 3, 146, 73, 0, 221, 224, 3, 58, 29, 0, 222, 224, 3, 32, 16, 0, 223, 215, 1, 0, 0, 0, 223, 216, 1, 0, 0, 0, 223, 217, 1, 0, 0, 0, 223, 218, 1, 0, 0, 0, 223, 219, 1, 0, 0, 0, 223, 220, 1, 0, 0, 0, 223, 221, 1, 0, 0, 0, 223, 222, 1, 0, 0, 0, 224, 9, 1, 0, 0, 0, 225, 226, 5, 43, 0, 0, 226, 227, 5, 46, 0, 0, 227, 228, 3, 166, 83, 0, 228, 229, 5, 139, 0, 0, 229, 236, 1, 0, 0, 0, 230, 231, 5, 43, 0, 0, 231, 232, 5, 48, 0, 0, 232, 233, 3, 166, 83, 0, 233, 234, 5, 139, 0, 0, 234, 236, 1, 0, 0, 0, 235, 225, 1, 0, 0, 0, 235, 230, 1, 0, 0, 0, 236, 11, 1, 0, 0, 0, 237, 238, 5, 44, 0, 0, 238, 239, 5, 45, 0, 0, 239, 240, 3, 166, 83, 0, 240, 241, 5, 89, 0, 0, 241, 242, 3, 168, 84, 0, 242, 243, 5, 139, 0, 0, 243, 13, 1, 0, 0, 0, 244, 245, 5, 44, 0, 0, 245, 246, 5, 46, 0, 0, 246, 247, 3, 166, 83, 0, 247, 248, 5, 80, 0, 0, 248, 249, 3, 168, 84, 0, 249, 250, 5, 139, 0, 0, 250, 15, 1, 0, 0, 0, 251, 256, 3, 10, 5, 0, 252, 256, 3, 12, 6, 0, 253, 256, 3, 14, 7, 0, 254, 256, 3, 32, 16, 0, 255, 251, 1, 0, 0, 0, 255, 252, 1, 0, 0, 0, 255, 253, 1, 0, 0, 0, 255, 254, 1, 0, 0, 0, 256, 17, 1, 0, 0, 0, 257, 258, 5, 45, 0, 0, 258, 259, 3, 166, 83, 0, 259, 260, 5, 89, 0, 0, 260, 263, 3, 168, 84, 0, 261, 262, 5, 90, 0, 0, 262, 264, 3, 168, 84, 0, 263, 261, 1, 0, 0, 0, 263, 264, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 266, 5, 139, 0, 0, 266, 19, 1, 0, 0, 0, 267, 269, 3, 16, 8, 0, 268, 267, 1, 0, 0, 0, 269, 272, 1, 0, 0, 0, 270, 268, 1, 0, 0, 0, 270, 271, 1, 0, 0, 0, 271, 273, 1, 0, 0, 0, 272, 270, 1, 0, 0, 0, 273, 274, 5, 46, 0, 0, 274, 276, 3, 166, 83, 0, 275, 277, 3, 22, 11, 0, 276, 275, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 279, 5, 89, 0, 0, 279, 280, 3, 168, 84, 0, 280, 281, 5, 80, 0, 0, 281, 291, 3, 168, 84, 0, 282, 283, 5, 94, 0, 0, 283, 288, 3, 26, 13, 0, 284, 285, 5, 140, 0, 0, 285, 287, 3, 26, 13, 0, 286, 284, 1, 0, 0, 0, 287, 290, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 292, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 291, 282, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 293, 1, 0, 0, 0, 293, 297, 5, 142, 0, 0, 294, 296, 3, 34, 17, 0, 295, 294, 1, 0, 0, 0, 296, 299, 1, 0, 0, 0, 297, 295, 1, 0, 0, 0, 297, 298, 1, 0, 0, 0, 298, 300, 1, 0, 0, 0, 299, 297, 1, 0, 0, 0, 300, 301, 5, 143, 0, 0, 301, 21, 1, 0, 0, 0, 302, 303, 5, 148, 0, 0, 303, 308, 3, 24, 12, 0, 304, 305, 5, 140, 0, 0, 305, 307, 3, 24, 12, 0, 306, 304, 1, 0, 0, 0, 307, 310, 1, 0, 0, 0, 308, 306, 1, 0, 0, 0, 308, 309, 1, 0, 0, 0, 309, 311, 1, 0, 0, 0, 310, 308, 1, 0, 0, 0, 311, 312, 5, 149, 0, 0, 312, 23, 1, 0, 0, 0, 313, 314, 5, 49, 0, 0, 314, 317, 3, 166, 83, 0, 315, 316, 5, 138, 0, 0, 316, 318, 5, 39, 0, 0, 317, 315, 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 333, 1, 0, 0, 0, 319, 320, 5, 38, 0, 0, 320, 330, 3, 166, 83, 0, 321, 322, 5, 40, 0, 0, 322, 327, 3, 26, 13, 0, 323, 324, 5, 150, 0, 0, 324, 326, 3, 26, 13, 0, 325, 323, 1, 0, 0, 0, 326, 329, 1, 0, 0, 0, 327, 325, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 331, 1, 0, 0, 0, 329, 327, 1, 0, 0, 0, 330, 321, 1, 0, 0, 0, 330, 331, 1, 0, 0, 0, 331, 333, 1, 0, 0, 0, 332, 313, 1, 0, 0, 0, 332, 319, 1, 0, 0, 0, 333, 25, 1, 0, 0, 0, 334, 336, 3, 166, 83, 0, 335, 337, 3, 28, 14, 0, 336, 335, 1, 0, 0, 0, 336, 337, 1, 0, 0, 0, 337, 27, 1, 0, 0, 0, 338, 339, 5, 148, 0, 0, 339, 344, 3, 30, 15, 0, 340, 341, 5, 140, 0, 0, 341, 343, 3, 30, 15, 0, 342, 340, 1, 0, 0, 0, 343, 346, 1, 0, 0, 0, 344, 342, 1, 0, 0, 0, 344, 345, 1, 0, 0, 0, 345, 347, 1, 0, 0, 0, 346, 344, 1, 0, 0, 0, 347, 348, 5, 149, 0, 0, 348, 29, 1, 0, 0, 0, 349, 350, 5, 45, 0, 0, 350, 357, 3, 166, 83, 0, 351, 352, 5, 46, 0, 0, 352, 357, 3, 26, 13, 0, 353, 354, 5, 38, 0, 0, 354, 357, 3, 166, 83, 0, 355, 357, 3, 148, 74, 0, 356, 349, 1, 0, 0, 0, 356, 351, 1, 0, 0, 0, 356, 353, 1, 0, 0, 0, 356, 355, 1, 0, 0, 0, 357, 31, 1, 0, 0, 0, 358, 359, 5, 37, 0, 0, 359, 361, 3, 166, 83, 0, 360, 362, 3, 22, 11, 0, 361, 360, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 363, 1, 0, 0, 0, 363, 364, 5, 151, 0, 0, 364, 365, 3, 148, 74, 0, 365, 366, 5, 139, 0, 0, 366, 33, 1, 0, 0, 0, 367, 372, 3, 40, 20, 0, 368, 372, 3, 44, 22, 0, 369, 372, 3, 38, 19, 0, 370, 372, 3, 36, 18, 0, 371, 367, 1, 0, 0, 0, 371, 368, 1, 0, 0, 0, 371, 369, 1, 0, 0, 0, 371, 370, 1, 0, 0, 0, 372, 35, 1, 0, 0, 0, 373, 374, 5, 2, 0, 0, 374, 375, 3, 166, 83, 0, 375, 376, 5, 89, 0, 0, 376, 377, 3, 168, 84, 0, 377, 378, 5, 3, 0, 0, 378, 381, 3, 168, 84, 0, 379, 380, 5, 5, 0, 0, 380, 382, 3, 50, 25, 0, 381, 379, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 383, 1, 0, 0, 0, 383, 384, 5, 139, 0, 0, 384, 37, 1, 0, 0, 0, 385, 387, 5, 60, 0, 0, 386, 385, 1, 0, 0, 0, 386, 387, 1, 0, 0, 0, 387, 388, 1, 0, 0, 0, 388, 389, 5, 52, 0, 0, 389, 390, 3, 166, 83, 0, 390, 391, 5, 89, 0, 0, 391, 392, 3, 168, 84, 0, 392, 393, 5, 138, 0, 0, 393, 394, 3, 148, 74, 0, 394, 395, 5, 137, 0, 0, 395, 396, 3, 148, 74, 0, 396, 397, 5, 142, 0, 0, 397, 398, 5, 106, 0, 0, 398, 399, 5, 89, 0, 0, 399, 401, 3, 168, 84, 0, 400, 402, 3, 76, 38, 0, 401, 400, 1, 0, 0, 0, 401, 402, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 404, 5, 139, 0, 0, 404, 405, 5, 143, 0, 0, 405, 39, 1, 0, 0, 0, 406, 408, 3, 46, 23, 0, 407, 406, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 409, 1, 0, 0, 0, 409, 410, 7, 0, 0, 0, 410, 411, 3, 166, 83, 0, 411, 412, 5, 89, 0, 0, 412, 413, 3, 168, 84, 0, 413, 414, 5, 138, 0, 0, 414, 415, 3, 148, 74, 0, 415, 419, 5, 142, 0, 0, 416, 418, 3, 42, 21, 0, 417, 416, 1, 0, 0, 0, 418, 421, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 419, 1, 0, 0, 0, 422, 423, 5, 143, 0, 0, 423, 41, 1, 0, 0, 0, 424, 425, 5, 96, 0, 0, 425, 426, 5, 89, 0, 0, 426, 428, 3, 168, 84, 0, 427, 429, 3, 76, 38, 0, 428, 427, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 430, 1, 0, 0, 0, 430, 431, 5, 139, 0, 0, 431, 458, 1, 0, 0, 0, 432, 433, 5, 97, 0, 0, 433, 434, 5, 89, 0, 0, 434, 436, 3, 168, 84, 0, 435, 437, 3, 76, 38, 0, 436, 435, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 438, 1, 0, 0, 0, 438, 439, 5, 139, 0, 0, 439, 458, 1, 0, 0, 0, 440, 441, 5, 1, 0, 0, 441, 442, 5, 89, 0, 0, 442, 444, 3, 168, 84, 0, 443, 445, 3, 76, 38, 0, 444, 443, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 447, 5, 139, 0, 0, 447, 458, 1, 0, 0, 0, 448, 449, 5, 98, 0, 0, 449, 450, 5, 99, 0, 0, 450, 451, 5, 89, 0, 0, 451, 452, 3, 168, 84, 0, 452, 453, 5, 100, 0, 0, 453, 454, 5, 89, 0, 0, 454, 455, 3, 168, 84, 0, 455, 456, 5, 139, 0, 0, 456, 458, 1, 0, 0, 0, 457, 424, 1, 0, 0, 0, 457, 432, 1, 0, 0, 0, 457, 440, 1, 0, 0, 0, 457, 448, 1, 0, 0, 0, 458, 43, 1, 0, 0, 0, 459, 461, 3, 46, 23, 0, 460, 459, 1, 0, 0, 0, 460, 461, 1, 0, 0, 0, 461, 462, 1, 0, 0, 0, 462, 463, 5, 51, 0, 0, 463, 464, 3, 166, 83, 0, 464, 465, 5, 89, 0, 0, 465, 466, 3, 168, 84, 0, 466, 467, 5, 138, 0, 0, 467, 468, 3, 156, 78, 0, 468, 470, 3, 50, 25, 0, 469, 471, 5, 117, 0, 0, 470, 469, 1, 0, 0, 0, 470, 471, 1, 0, 0, 0, 471, 474, 1, 0, 0, 0, 472, 473, 5, 87, 0, 0, 473, 475, 3, 168, 84, 0, 474, 472, 1, 0, 0, 0, 474, 475, 1, 0, 0, 0, 475, 476, 1, 0, 0, 0, 476, 480, 5, 142, 0, 0, 477, 479, 3, 48, 24, 0, 478, 477, 1, 0, 0, 0, 479, 482, 1, 0, 0, 0, 480, 478, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 483, 1, 0, 0, 0, 482, 480, 1, 0, 0, 0, 483, 484, 5, 143, 0, 0, 484, 45, 1, 0, 0, 0, 485, 487, 5, 34, 0, 0, 486, 488, 7, 1, 0, 0, 487, 486, 1, 0, 0, 0, 487, 488, 1, 0, 0, 0, 488, 47, 1, 0, 0, 0, 489, 490, 5, 103, 0, 0, 490, 491, 5, 89, 0, 0, 491, 493, 3, 168, 84, 0, 492, 494, 3, 76, 38, 0, 493, 492, 1, 0, 0, 0, 493, 494, 1, 0, 0, 0, 494, 495, 1, 0, 0, 0, 495, 496, 5, 139, 0, 0, 496, 523, 1, 0, 0, 0, 497, 498, 5, 104, 0, 0, 498, 499, 5, 89, 0, 0, 499, 501, 3, 168, 84, 0, 500, 502, 3, 76, 38, 0, 501, 500, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 504, 5, 139, 0, 0, 504, 523, 1, 0, 0, 0, 505, 506, 5, 105, 0, 0, 506, 507, 5, 89, 0, 0, 507, 509, 3, 168, 84, 0, 508, 510, 3, 76, 38, 0, 509, 508, 1, 0, 0, 0, 509, 510, 1, 0, 0, 0, 510, 511, 1, 0, 0, 0, 511, 512, 5, 139, 0, 0, 512, 523, 1, 0, 0, 0, 513, 514, 5, 98, 0, 0, 514, 515, 5, 99, 0, 0, 515, 516, 5, 89, 0, 0, 516, 517, 3, 168, 84, 0, 517, 518, 5, 100, 0, 0, 518, 519, 5, 89, 0, 0, 519, 520, 3, 168, 84, 0, 520, 521, 5, 139, 0, 0, 521, 523, 1, 0, 0, 0, 522, 489, 1, 0, 0, 0, 522, 497, 1, 0, 0, 0, 522, 505, 1, 0, 0, 0, 522, 513, 1, 0, 0, 0, 523, 49, 1, 0, 0, 0, 524, 525, 5, 45, 0, 0, 525, 534, 3, 166, 83, 0, 526, 527, 5, 46, 0, 0, 527, 529, 3, 166, 83, 0, 528, 530, 3, 28, 14, 0, 529, 528, 1, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 534, 1, 0, 0, 0, 531, 532, 5, 38, 0, 0, 532, 534, 3, 166, 83, 0, 533, 524, 1, 0, 0, 0, 533, 526, 1, 0, 0, 0, 533, 531, 1, 0, 0, 0, 534, 51, 1, 0, 0, 0, 535, 537, 3, 16, 8, 0, 536, 535, 1, 0, 0, 0, 537, 540, 1, 0, 0, 0, 538, 536, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 541, 1, 0, 0, 0, 540, 538, 1, 0, 0, 0, 541, 542, 5, 48, 0, 0, 542, 543, 3, 166, 83, 0, 543, 544, 5, 89, 0, 0, 544, 545, 3, 168, 84, 0, 545, 546, 5, 80, 0, 0, 546, 549, 3, 168, 84, 0, 547, 548, 5, 81, 0, 0, 548, 550, 5, 152, 0, 0, 549, 547, 1, 0, 0, 0, 549, 550, 1, 0, 0, 0, 550, 551, 1, 0, 0, 0, 551, 555, 5, 142, 0, 0, 552, 554, 3, 54, 27, 0, 553, 552, 1, 0, 0, 0, 554, 557, 1, 0, 0, 0, 555, 553, 1, 0, 0, 0, 555, 556, 1, 0, 0, 0, 556, 558, 1, 0, 0, 0, 557, 555, 1, 0, 0, 0, 558, 559, 5, 143, 0, 0, 559, 53, 1, 0, 0, 0, 560, 567, 3, 68, 34, 0, 561, 567, 3, 70, 35, 0, 562, 567, 3, 80, 40, 0, 563, 567, 3, 60, 30, 0, 564, 567, 3, 62, 31, 0, 565, 567, 3, 56, 28, 0, 566, 560, 1, 0, 0, 0, 566, 561, 1, 0, 0, 0, 566, 562, 1, 0, 0, 0, 566, 563, 1, 0, 0, 0, 566, 564, 1, 0, 0, 0, 566, 565, 1, 0, 0, 0, 567, 55, 1, 0, 0, 0, 568, 569, 5, 2, 0, 0, 569, 570, 3, 166, 83, 0, 570, 571, 5, 89, 0, 0, 571, 572, 3, 168, 84, 0, 572, 573, 5, 40, 0, 0, 573, 574, 3, 26, 13, 0, 574, 575, 5, 141, 0, 0, 575, 576, 3, 166, 83, 0, 576, 577, 5, 139, 0, 0, 577, 57, 1, 0, 0, 0, 578, 579, 5, 4, 0, 0, 579, 580, 3, 166, 83, 0, 580, 581, 5, 89, 0, 0, 581, 582, 3, 168, 84, 0, 582, 583, 5, 6, 0, 0, 583, 584, 3, 26, 13, 0, 584, 585, 5, 68, 0, 0, 585, 586, 3, 166, 83, 0, 586, 587, 5, 141, 0, 0, 587, 588, 3, 166, 83, 0, 588, 589, 5, 139, 0, 0, 589, 59, 1, 0, 0, 0, 590, 592, 5, 24, 0, 0, 591, 593, 5, 42, 0, 0, 592, 591, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 596, 3, 166, 83, 0, 595, 597, 3, 22, 11, 0, 596, 595, 1, 0, 0, 0, 596, 597, 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 599, 5, 89, 0, 0, 599, 600, 3, 168, 84, 0, 600, 602, 5, 27, 0, 0, 601, 603, 5, 11, 0, 0, 602, 601, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 604, 1, 0, 0, 0, 604, 605, 3, 26, 13, 0, 605, 606, 5, 28, 0, 0, 606, 635, 3, 168, 84, 0, 607, 608, 5, 52, 0, 0, 608, 609, 3, 168, 84, 0, 609, 613, 5, 142, 0, 0, 610, 612, 3, 64, 32, 0, 611, 610, 1, 0, 0, 0, 612, 615, 1, 0, 0, 0, 613, 611, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 616, 1, 0, 0, 0, 615, 613, 1, 0, 0, 0, 616, 617, 5, 143, 0, 0, 617, 636, 1, 0, 0, 0, 618, 619, 5, 42, 0, 0, 619, 622, 3, 168, 84, 0, 620, 621, 5, 52, 0, 0, 621, 623, 3, 168, 84, 0, 622, 620, 1, 0, 0, 0, 622, 623, 1, 0, 0, 0, 623, 633, 1, 0, 0, 0, 624, 628, 5, 142, 0, 0, 625, 627, 3, 64, 32, 0, 626, 625, 1, 0, 0, 0, 627, 630, 1, 0, 0, 0, 628, 626, 1, 0, 0, 0, 628, 629, 1, 0, 0, 0, 629, 631, 1, 0, 0, 0, 630, 628, 1, 0, 0, 0, 631, 634, 5, 143, 0, 0, 632, 634, 5, 139, 0, 0, 633, 624, 1, 0, 0, 0, 633, 632, 1, 0, 0, 0, 634, 636, 1, 0, 0, 0, 635, 607, 1, 0, 0, 0, 635, 618, 1, 0, 0, 0, 636, 61, 1, 0, 0, 0, 637, 638, 5, 24, 0, 0, 638, 639, 3, 166, 83, 0, 639, 640, 5, 89, 0, 0, 640, 641, 3, 168, 84, 0, 641, 642, 5, 26, 0, 0, 642, 643, 3, 166, 83, 0, 643, 644, 3, 28, 14, 0, 644, 645, 5, 139, 0, 0, 645, 63, 1, 0, 0, 0, 646, 647, 5, 18, 0, 0, 647, 704, 5, 139, 0, 0, 648, 649, 5, 19, 0, 0, 649, 650, 5, 20, 0, 0, 650, 651, 3, 166, 83, 0, 651, 652, 5, 139, 0, 0, 652, 704, 1, 0, 0, 0, 653, 654, 5, 29, 0, 0, 654, 655, 3, 168, 84, 0, 655, 656, 5, 139, 0, 0, 656, 704, 1, 0, 0, 0, 657, 658, 5, 29, 0, 0, 658, 659, 3, 166, 83, 0, 659, 660, 5, 141, 0, 0, 660, 670, 3, 166, 83, 0, 661, 662, 5, 67, 0, 0, 662, 666, 5, 142, 0, 0, 663, 665, 3, 66, 33, 0, 664, 663, 1, 0, 0, 0, 665, 668, 1, 0, 0, 0, 666, 664, 1, 0, 0, 0, 666, 667, 1, 0, 0, 0, 667, 669, 1, 0, 0, 0, 668, 666, 1, 0, 0, 0, 669, 671, 5, 143, 0, 0, 670, 661, 1, 0, 0, 0, 670, 671, 1, 0, 0, 0, 671, 672, 1, 0, 0, 0, 672, 673, 5, 139, 0, 0, 673, 704, 1, 0, 0, 0, 674, 676, 5, 30, 0, 0, 675, 677, 5, 38, 0, 0, 676, 675, 1, 0, 0, 0, 676, 677, 1, 0, 0, 0, 677, 678, 1, 0, 0, 0, 678, 679, 3, 166, 83, 0, 679, 680, 5, 58, 0, 0, 680, 681, 3, 26, 13, 0, 681, 682, 5, 139, 0, 0, 682, 704, 1, 0, 0, 0, 683, 684, 5, 31, 0, 0, 684, 685, 3, 166, 83, 0, 685, 686, 5, 152, 0, 0, 686, 687, 5, 139, 0, 0, 687, 704, 1, 0, 0, 0, 688, 689, 5, 32, 0, 0, 689, 690, 3, 26, 13, 0, 690, 691, 5, 141, 0, 0, 691, 692, 3, 166, 83, 0, 692, 693, 3, 166, 83, 0, 693, 694, 3, 168, 84, 0, 694, 695, 5, 139, 0, 0, 695, 704, 1, 0, 0, 0, 696, 697, 5, 98, 0, 0, 697, 704, 5, 139, 0, 0, 698, 699, 5, 33, 0, 0, 699, 700, 5, 152, 0, 0, 700, 701, 3, 168, 84, 0, 701, 702, 5, 139, 0, 0, 702, 704, 1, 0, 0, 0, 703, 646, 1, 0, 0, 0, 703, 648, 1, 0, 0, 0, 703, 653, 1, 0, 0, 0, 703, 657, 1, 0, 0, 0, 703, 674, 1, 0, 0, 0, 703, 683, 1, 0, 0, 0, 703, 688, 1, 0, 0, 0, 703, 696, 1, 0, 0, 0, 703, 698, 1, 0, 0, 0, 704, 65, 1, 0, 0, 0, 705, 706, 3, 166, 83, 0, 706, 707, 5, 61, 0, 0, 707, 708, 3, 166, 83, 0, 708, 709, 5, 139, 0, 0, 709, 67, 1, 0, 0, 0, 710, 711, 5, 52, 0, 0, 711, 713, 3, 166, 83, 0, 712, 714, 3, 22, 11, 0, 713, 712, 1, 0, 0, 0, 713, 714, 1, 0, 0, 0, 714, 715, 1, 0, 0, 0, 715, 716, 5, 89, 0, 0, 716, 717, 3, 168, 84, 0, 717, 718, 5, 138, 0, 0, 718, 719, 3, 148, 74, 0, 719, 720, 5, 137, 0, 0, 720, 721, 3, 148, 74, 0, 721, 722, 5, 91, 0, 0, 722, 724, 3, 84, 42, 0, 723, 725, 3, 76, 38, 0, 724, 723, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 727, 1, 0, 0, 0, 726, 728, 3, 82, 41, 0, 727, 726, 1, 0, 0, 0, 727, 728, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 5, 93, 0, 0, 730, 732, 3, 86, 43, 0, 731, 733, 3, 90, 45, 0, 732, 731, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 735, 1, 0, 0, 0, 734, 736, 3, 74, 37, 0, 735, 734, 1, 0, 0, 0, 735, 736, 1, 0, 0, 0, 736, 738, 1, 0, 0, 0, 737, 739, 3, 72, 36, 0, 738, 737, 1, 0, 0, 0, 738, 739, 1, 0, 0, 0, 739, 740, 1, 0, 0, 0, 740, 741, 5, 139, 0, 0, 741, 69, 1, 0, 0, 0, 742, 743, 5, 53, 0, 0, 743, 745, 3, 166, 83, 0, 744, 746, 3, 22, 11, 0, 745, 744, 1, 0, 0, 0, 745, 746, 1, 0, 0, 0, 746, 747, 1, 0, 0, 0, 747, 748, 5, 89, 0, 0, 748, 749, 3, 168, 84, 0, 749, 750, 5, 138, 0, 0, 750, 751, 3, 148, 74, 0, 751, 752, 5, 137, 0, 0, 752, 754, 3, 148, 74, 0, 753, 755, 3, 76, 38, 0, 754, 753, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 757, 1, 0, 0, 0, 756, 758, 3, 90, 45, 0, 757, 756, 1, 0, 0, 0, 757, 758, 1, 0, 0, 0, 758, 760, 1, 0, 0, 0, 759, 761, 3, 74, 37, 0, 760, 759, 1, 0, 0, 0, 760, 761, 1, 0, 0, 0, 761, 763, 1, 0, 0, 0, 762, 764, 3, 72, 36, 0, 763, 762, 1, 0, 0, 0, 763, 764, 1, 0, 0, 0, 764, 765, 1, 0, 0, 0, 765, 766, 5, 139, 0, 0, 766, 71, 1, 0, 0, 0, 767, 768, 5, 69, 0, 0, 768, 769, 5, 68, 0, 0, 769, 770, 3, 166, 83, 0, 770, 73, 1, 0, 0, 0, 771, 772, 5, 9, 0, 0, 772, 773, 5, 7, 0, 0, 773, 774, 3, 166, 83, 0, 774, 775, 5, 68, 0, 0, 775, 776, 3, 168, 84, 0, 776, 75, 1, 0, 0, 0, 777, 778, 5, 12, 0, 0, 778, 787, 5, 15, 0, 0, 779, 780, 5, 12, 0, 0, 780, 781, 7, 2, 0, 0, 781, 782, 5, 16, 0, 0, 782, 783, 5, 144, 0, 0, 783, 784, 3, 88, 44, 0, 784, 785, 5, 145, 0, 0, 785, 787, 1, 0, 0, 0, 786, 777, 1, 0, 0, 0, 786, 779, 1, 0, 0, 0, 787, 77, 1, 0, 0, 0, 788, 789, 5, 68, 0, 0, 789, 790, 5, 144, 0, 0, 790, 795, 3, 130, 65, 0, 791, 792, 5, 140, 0, 0, 792, 794, 3, 130, 65, 0, 793, 791, 1, 0, 0, 0, 794, 797, 1, 0, 0, 0, 795, 793, 1, 0, 0, 0, 795, 796, 1, 0, 0, 0, 796, 798, 1, 0, 0, 0, 797, 795, 1, 0, 0, 0, 798, 799, 5, 145, 0, 0, 799, 79, 1, 0, 0, 0, 800, 801, 5, 54, 0, 0, 801, 802, 3, 166, 83, 0, 802, 803, 5, 89, 0, 0, 803, 804, 3, 168, 84, 0, 804, 805, 5, 55, 0, 0, 805, 806, 3, 166, 83, 0, 806, 807, 5, 138, 0, 0, 807, 809, 3, 148, 74, 0, 808, 810, 3, 90, 45, 0, 809, 808, 1, 0, 0, 0, 809, 810, 1, 0, 0, 0, 810, 811, 1, 0, 0, 0, 811, 812, 5, 139, 0, 0, 812, 81, 1, 0, 0, 0, 813, 814, 5, 92, 0, 0, 814, 815, 3, 148, 74, 0, 815, 83, 1, 0, 0, 0, 816, 817, 7, 3, 0, 0, 817, 85, 1, 0, 0, 0, 818, 837, 5, 95, 0, 0, 819, 820, 5, 45, 0, 0, 820, 837, 3, 166, 83, 0, 821, 822, 5, 38, 0, 0, 822, 837, 3, 166, 83, 0, 823, 824, 5, 47, 0, 0, 824, 833, 5, 144, 0, 0, 825, 830, 3, 26, 13, 0, 826, 827, 5, 140, 0, 0, 827, 829, 3, 26, 13, 0, 828, 826, 1, 0, 0, 0, 829, 832, 1, 0, 0, 0, 830, 828, 1, 0, 0, 0, 830, 831, 1, 0, 0, 0, 831, 834, 1, 0, 0, 0, 832, 830, 1, 0, 0, 0, 833, 825, 1, 0, 0, 0, 833, 834, 1, 0, 0, 0, 834, 835, 1, 0, 0, 0, 835, 837, 5, 145, 0, 0, 836, 818, 1, 0, 0, 0, 836, 819, 1, 0, 0, 0, 836, 821, 1, 0, 0, 0, 836, 823, 1, 0, 0, 0, 837, 87, 1, 0, 0, 0, 838, 843, 3, 166, 83, 0, 839, 840, 5, 140, 0, 0, 840, 842, 3, 166, 83, 0, 841, 839, 1, 0, 0, 0, 842, 845, 1, 0, 0, 0, 843, 841, 1, 0, 0, 0, 843, 844, 1, 0, 0, 0, 844, 89, 1, 0, 0, 0, 845, 843, 1, 0, 0, 0, 846, 847, 5, 94, 0, 0, 847, 851, 5, 142, 0, 0, 848, 850, 3, 92, 46, 0, 849, 848, 1, 0, 0, 0, 850, 853, 1, 0, 0, 0, 851, 849, 1, 0, 0, 0, 851, 852, 1, 0, 0, 0, 852, 854, 1, 0, 0, 0, 853, 851, 1, 0, 0, 0, 854, 855, 5, 143, 0, 0, 855, 91, 1, 0, 0, 0, 856, 857, 5, 25, 0, 0, 857, 858, 3, 166, 83, 0, 858, 859, 5, 89, 0, 0, 859, 860, 3, 168, 84, 0, 860, 861, 5, 144, 0, 0, 861, 862, 3, 88, 44, 0, 862, 863, 5, 145, 0, 0, 863, 864, 5, 139, 0, 0, 864, 939, 1, 0, 0, 0, 865, 866, 5, 64, 0, 0, 866, 867, 3, 166, 83, 0, 867, 868, 5, 89, 0, 0, 868, 869, 3, 168, 84, 0, 869, 870, 5, 138, 0, 0, 870, 871, 3, 148, 74, 0, 871, 872, 3, 94, 47, 0, 872, 873, 5, 139, 0, 0, 873, 939, 1, 0, 0, 0, 874, 875, 5, 65, 0, 0, 875, 876, 3, 166, 83, 0, 876, 877, 5, 89, 0, 0, 877, 878, 3, 168, 84, 0, 878, 879, 5, 138, 0, 0, 879, 880, 3, 156, 78, 0, 880, 883, 3, 50, 25, 0, 881, 882, 5, 87, 0, 0, 882, 884, 3, 168, 84, 0, 883, 881, 1, 0, 0, 0, 883, 884, 1, 0, 0, 0, 884, 885, 1, 0, 0, 0, 885, 886, 3, 94, 47, 0, 886, 887, 5, 139, 0, 0, 887, 939, 1, 0, 0, 0, 888, 889, 5, 46, 0, 0, 889, 890, 3, 166, 83, 0, 890, 891, 5, 89, 0, 0, 891, 892, 3, 168, 84, 0, 892, 893, 5, 138, 0, 0, 893, 895, 3, 166, 83, 0, 894, 896, 3, 28, 14, 0, 895, 894, 1, 0, 0, 0, 895, 896, 1, 0, 0, 0, 896, 898, 1, 0, 0, 0, 897, 899, 3, 78, 39, 0, 898, 897, 1, 0, 0, 0, 898, 899, 1, 0, 0, 0, 899, 902, 1, 0, 0, 0, 900, 901, 5, 20, 0, 0, 901, 903, 5, 56, 0, 0, 902, 900, 1, 0, 0, 0, 902, 903, 1, 0, 0, 0, 903, 904, 1, 0, 0, 0, 904, 905, 5, 139, 0, 0, 905, 939, 1, 0, 0, 0, 906, 907, 5, 7, 0, 0, 907, 908, 3, 166, 83, 0, 908, 909, 5, 89, 0, 0, 909, 910, 3, 168, 84, 0, 910, 911, 5, 138, 0, 0, 911, 912, 3, 166, 83, 0, 912, 913, 5, 56, 0, 0, 913, 914, 3, 148, 74, 0, 914, 915, 5, 139, 0, 0, 915, 939, 1, 0, 0, 0, 916, 917, 5, 54, 0, 0, 917, 918, 3, 166, 83, 0, 918, 919, 5, 89, 0, 0, 919, 920, 3, 168, 84, 0, 920, 921, 5, 138, 0, 0, 921, 924, 3, 166, 83, 0, 922, 923, 5, 56, 0, 0, 923, 925, 3, 148, 74, 0, 924, 922, 1, 0, 0, 0, 924, 925, 1, 0, 0, 0, 925, 926, 1, 0, 0, 0, 926, 927, 5, 139, 0, 0, 927, 939, 1, 0, 0, 0, 928, 929, 5, 24, 0, 0, 929, 930, 3, 166, 83, 0, 930, 931, 5, 89, 0, 0, 931, 932, 3, 168, 84, 0, 932, 933, 5, 138, 0, 0, 933, 934, 3, 166, 83, 0, 934, 935, 5, 141, 0, 0, 935, 936, 3, 166, 83, 0, 936, 937, 5, 139, 0, 0, 937, 939, 1, 0, 0, 0, 938, 856, 1, 0, 0, 0, 938, 865, 1, 0, 0, 0, 938, 874, 1, 0, 0, 0, 938, 888, 1, 0, 0, 0, 938, 906, 1, 0, 0, 0, 938, 916, 1, 0, 0, 0, 938, 928, 1, 0, 0, 0, 939, 93, 1, 0, 0, 0, 940, 941, 5, 144, 0, 0, 941, 946, 3, 96, 48, 0, 942, 943, 5, 140, 0, 0, 943, 945, 3, 96, 48, 0, 944, 942, 1, 0, 0, 0, 945, 948, 1, 0, 0, 0, 946, 944, 1, 0, 0, 0, 946, 947, 1, 0, 0, 0, 947, 949, 1, 0, 0, 0, 948, 946, 1, 0, 0, 0, 949, 950, 5, 145, 0, 0, 950, 95, 1, 0, 0, 0, 951, 952, 7, 4, 0, 0, 952, 97, 1, 0, 0, 0, 953, 954, 5, 63, 0, 0, 954, 955, 3, 100, 50, 0, 955, 99, 1, 0, 0, 0, 956, 959, 3, 102, 51, 0, 957, 959, 3, 106, 53, 0, 958, 956, 1, 0, 0, 0, 958, 957, 1, 0, 0, 0, 959, 101, 1, 0, 0, 0, 960, 961, 5, 64, 0, 0, 961, 962, 3, 166, 83, 0, 962, 963, 5, 89, 0, 0, 963, 964, 3, 168, 84, 0, 964, 965, 5, 74, 0, 0, 965, 966, 3, 166, 83, 0, 966, 967, 5, 138, 0, 0, 967, 968, 3, 148, 74, 0, 968, 969, 5, 75, 0, 0, 969, 972, 3, 104, 52, 0, 970, 971, 5, 76, 0, 0, 971, 973, 3, 158, 79, 0, 972, 970, 1, 0, 0, 0, 972, 973, 1, 0, 0, 0, 973, 974, 1, 0, 0, 0, 974, 975, 5, 139, 0, 0, 975, 103, 1, 0, 0, 0, 976, 990, 5, 111, 0, 0, 977, 978, 5, 112, 0, 0, 978, 979, 5, 146, 0, 0, 979, 980, 3, 148, 74, 0, 980, 981, 5, 147, 0, 0, 981, 990, 1, 0, 0, 0, 982, 983, 5, 84, 0, 0, 983, 990, 3, 160, 80, 0, 984, 985, 5, 85, 0, 0, 985, 986, 5, 146, 0, 0, 986, 987, 3, 148, 74, 0, 987, 988, 5, 147, 0, 0, 988, 990, 1, 0, 0, 0, 989, 976, 1, 0, 0, 0, 989, 977, 1, 0, 0, 0, 989, 982, 1, 0, 0, 0, 989, 984, 1, 0, 0, 0, 990, 105, 1, 0, 0, 0, 991, 992, 5, 65, 0, 0, 992, 993, 3, 166, 83, 0, 993, 994, 5, 89, 0, 0, 994, 995, 3, 168, 84, 0, 995, 996, 5, 142, 0, 0, 996, 997, 3, 108, 54, 0, 997, 998, 3, 108, 54, 0, 998, 999, 5, 143, 0, 0, 999, 107, 1, 0, 0, 0, 1000, 1001, 3, 50, 25, 0, 1001, 1002, 5, 66, 0, 0, 1002, 1003, 3, 166, 83, 0, 1003, 1004, 5, 89, 0, 0, 1004, 1005, 3, 168, 84, 0, 1005, 1007, 3, 156, 78, 0, 1006, 1008, 5, 117, 0, 0, 1007, 1006, 1, 0, 0, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1011, 1, 0, 0, 0, 1009, 1010, 5, 82, 0, 0, 1010, 1012, 3, 168, 84, 0, 1011, 1009, 1, 0, 0, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1014, 1, 0, 0, 0, 1013, 1015, 5, 86, 0, 0, 1014, 1013, 1, 0, 0, 0, 1014, 1015, 1, 0, 0, 0, 1015, 1018, 1, 0, 0, 0, 1016, 1017, 5, 87, 0, 0, 1017, 1019, 3, 168, 84, 0, 1018, 1016, 1, 0, 0, 0, 1018, 1019, 1, 0, 0, 0, 1019, 1021, 1, 0, 0, 0, 1020, 1022, 5, 88, 0, 0, 1021, 1020, 1, 0, 0, 0, 1021, 1022, 1, 0, 0, 0, 1022, 1023, 1, 0, 0, 0, 1023, 1024, 5, 139, 0, 0, 1024, 109, 1, 0, 0, 0, 1025, 1027, 5, 57, 0, 0, 1026, 1028, 3, 22, 11, 0, 1027, 1026, 1, 0, 0, 0, 1027, 1028, 1, 0, 0, 0, 1028, 1029, 1, 0, 0, 0, 1029, 1031, 3, 166, 83, 0, 1030, 1032, 3, 112, 56, 0, 1031, 1030, 1, 0, 0, 0, 1031, 1032, 1, 0, 0, 0, 1032, 1033, 1, 0, 0, 0, 1033, 1034, 5, 58, 0, 0, 1034, 1036, 3, 166, 83, 0, 1035, 1037, 3, 28, 14, 0, 1036, 1035, 1, 0, 0, 0, 1036, 1037, 1, 0, 0, 0, 1037, 1040, 1, 0, 0, 0, 1038, 1039, 5, 89, 0, 0, 1039, 1041, 3, 168, 84, 0, 1040, 1038, 1, 0, 0, 0, 1040, 1041, 1, 0, 0, 0, 1041, 1044, 1, 0, 0, 0, 1042, 1043, 5, 81, 0, 0, 1043, 1045, 5, 152, 0, 0, 1044, 1042, 1, 0, 0, 0, 1044, 1045, 1, 0, 0, 0, 1045, 1046, 1, 0, 0, 0, 1046, 1050, 5, 142, 0, 0, 1047, 1049, 3, 114, 57, 0, 1048, 1047, 1, 0, 0, 0, 1049, 1052, 1, 0, 0, 0, 1050, 1048, 1, 0, 0, 0, 1050, 1051, 1, 0, 0, 0, 1051, 1053, 1, 0, 0, 0, 1052, 1050, 1, 0, 0, 0, 1053, 1054, 5, 143, 0, 0, 1054, 111, 1, 0, 0, 0, 1055, 1056, 3, 28, 14, 0, 1056, 113, 1, 0, 0, 0, 1057, 1058, 5, 62, 0, 0, 1058, 1065, 3, 100, 50, 0, 1059, 1065, 3, 128, 64, 0, 1060, 1065, 3, 124, 62, 0, 1061, 1065, 3, 118, 59, 0, 1062, 1065, 3, 126, 63, 0, 1063, 1065, 3, 116, 58, 0, 1064, 1057, 1, 0, 0, 0, 1064, 1059, 1, 0, 0, 0, 1064, 1060, 1, 0, 0, 0, 1064, 1061, 1, 0, 0, 0, 1064, 1062, 1, 0, 0, 0, 1064, 1063, 1, 0, 0, 0, 1065, 115, 1, 0, 0, 0, 1066, 1067, 5, 59, 0, 0, 1067, 1068, 3, 166, 83, 0, 1068, 1069, 5, 61, 0, 0, 1069, 1070, 3, 166, 83, 0, 1070, 1071, 5, 141, 0, 0, 1071, 1072, 3, 166, 83, 0, 1072, 1073, 5, 139, 0, 0, 1073, 117, 1, 0, 0, 0, 1074, 1075, 5, 10, 0, 0, 1075, 1079, 5, 142, 0, 0, 1076, 1078, 3, 120, 60, 0, 1077, 1076, 1, 0, 0, 0, 1078, 1081, 1, 0, 0, 0, 1079, 1077, 1, 0, 0, 0, 1079, 1080, 1, 0, 0, 0, 1080, 1082, 1, 0, 0, 0, 1081, 1079, 1, 0, 0, 0, 1082, 1083, 5, 143, 0, 0, 1083, 1084, 5, 139, 0, 0, 1084, 119, 1, 0, 0, 0, 1085, 1086, 3, 166, 83, 0, 1086, 1087, 5, 61, 0, 0, 1087, 1088, 5, 64, 0, 0, 1088, 1089, 3, 166, 83, 0, 1089, 1090, 5, 139, 0, 0, 1090, 1100, 1, 0, 0, 0, 1091, 1092, 3, 166, 83, 0, 1092, 1093, 5, 61, 0, 0, 1093, 1094, 5, 65, 0, 0, 1094, 1095, 3, 166, 83, 0, 1095, 1096, 5, 141, 0, 0, 1096, 1097, 3, 166, 83, 0, 1097, 1098, 5, 139, 0, 0, 1098, 1100, 1, 0, 0, 0, 1099, 1085, 1, 0, 0, 0, 1099, 1091, 1, 0, 0, 0, 1100, 121, 1, 0, 0, 0, 1101, 1102, 3, 26, 13, 0, 1102, 1103, 5, 20, 0, 0, 1103, 1108, 5, 56, 0, 0, 1104, 1105, 5, 141, 0, 0, 1105, 1107, 3, 166, 83, 0, 1106, 1104, 1, 0, 0, 0, 1107, 1110, 1, 0, 0, 0, 1108, 1106, 1, 0, 0, 0, 1108, 1109, 1, 0, 0, 0, 1109, 1111, 1, 0, 0, 0, 1110, 1108, 1, 0, 0, 0, 1111, 1112, 5, 139, 0, 0, 1112, 123, 1, 0, 0, 0, 1113, 1114, 5, 59, 0, 0, 1114, 1115, 3, 166, 83, 0, 1115, 1116, 5, 61, 0, 0, 1116, 1117, 5, 64, 0, 0, 1117, 1118, 3, 166, 83, 0, 1118, 1119, 5, 139, 0, 0, 1119, 125, 1, 0, 0, 0, 1120, 1121, 5, 71, 0, 0, 1121, 1122, 3, 166, 83, 0, 1122, 1123, 5, 72, 0, 0, 1123, 1124, 5, 73, 0, 0, 1124, 1125, 5, 68, 0, 0, 1125, 1126, 5, 54, 0, 0, 1126, 1127, 3, 166, 83, 0, 1127, 1128, 5, 70, 0, 0, 1128, 1129, 5, 65, 0, 0, 1129, 1130, 3, 166, 83, 0, 1130, 1131, 5, 141, 0, 0, 1131, 1132, 3, 166, 83, 0, 1132, 1133, 5, 139, 0, 0, 1133, 127, 1, 0, 0, 0, 1134, 1135, 5, 59, 0, 0, 1135, 1136, 3, 130, 65, 0, 1136, 1137, 5, 61, 0, 0, 1137, 1140, 3, 134, 67, 0, 1138, 1139, 5, 36, 0, 0, 1139, 1141, 3, 168, 84, 0, 1140, 1138, 1, 0, 0, 0, 1140, 1141, 1, 0, 0, 0, 1141, 1142, 1, 0, 0, 0, 1142, 1143, 5, 139, 0, 0, 1143, 129, 1, 0, 0, 0, 1144, 1145, 3, 166, 83, 0, 1145, 1146, 5, 141, 0, 0, 1146, 1147, 3, 132, 66, 0, 1147, 131, 1, 0, 0, 0, 1148, 1161, 3, 166, 83, 0, 1149, 1161, 5, 106, 0, 0, 1150, 1161, 5, 96, 0, 0, 1151, 1161, 5, 97, 0, 0, 1152, 1161, 5, 1, 0, 0, 1153, 1161, 5, 103, 0, 0, 1154, 1161, 5, 104, 0, 0, 1155, 1161, 5, 105, 0, 0, 1156, 1161, 5, 107, 0, 0, 1157, 1161, 5, 108, 0, 0, 1158, 1161, 5, 109, 0, 0, 1159, 1161, 5, 110, 0, 0, 1160, 1148, 1, 0, 0, 0, 1160, 1149, 1, 0, 0, 0, 1160, 1150, 1, 0, 0, 0, 1160, 1151, 1, 0, 0, 0, 1160, 1152, 1, 0, 0, 0, 1160, 1153, 1, 0, 0, 0, 1160, 1154, 1, 0, 0, 0, 1160, 1155, 1, 0, 0, 0, 1160, 1156, 1, 0, 0, 0, 1160, 1157, 1, 0, 0, 0, 1160, 1158, 1, 0, 0, 0, 1160, 1159, 1, 0, 0, 0, 1161, 133, 1, 0, 0, 0, 1162, 1163, 5, 83, 0, 0, 1163, 1164, 5, 141, 0, 0, 1164, 1209, 3, 166, 83, 0, 1165, 1166, 5, 84, 0, 0, 1166, 1167, 3, 166, 83, 0, 1167, 1168, 5, 141, 0, 0, 1168, 1169, 3, 166, 83, 0, 1169, 1209, 1, 0, 0, 0, 1170, 1171, 5, 85, 0, 0, 1171, 1172, 3, 166, 83, 0, 1172, 1173, 5, 141, 0, 0, 1173, 1174, 3, 166, 83, 0, 1174, 1209, 1, 0, 0, 0, 1175, 1176, 5, 64, 0, 0, 1176, 1177, 3, 166, 83, 0, 1177, 1178, 5, 141, 0, 0, 1178, 1179, 3, 138, 69, 0, 1179, 1209, 1, 0, 0, 0, 1180, 1181, 5, 65, 0, 0, 1181, 1182, 3, 166, 83, 0, 1182, 1183, 5, 141, 0, 0, 1183, 1184, 3, 166, 83, 0, 1184, 1185, 5, 141, 0, 0, 1185, 1186, 3, 140, 70, 0, 1186, 1209, 1, 0, 0, 0, 1187, 1188, 5, 46, 0, 0, 1188, 1190, 3, 166, 83, 0, 1189, 1191, 3, 28, 14, 0, 1190, 1189, 1, 0, 0, 0, 1190, 1191, 1, 0, 0, 0, 1191, 1192, 1, 0, 0, 0, 1192, 1193, 5, 141, 0, 0, 1193, 1194, 3, 130, 65, 0, 1194, 1209, 1, 0, 0, 0, 1195, 1196, 5, 48, 0, 0, 1196, 1197, 3, 166, 83, 0, 1197, 1198, 5, 141, 0, 0, 1198, 1200, 3, 166, 83, 0, 1199, 1201, 3, 28, 14, 0, 1200, 1199, 1, 0, 0, 0, 1200, 1201, 1, 0, 0, 0, 1201, 1203, 1, 0, 0, 0, 1202, 1204, 3, 142, 71, 0, 1203, 1202, 1, 0, 0, 0, 1203, 1204, 1, 0, 0, 0, 1204, 1206, 1, 0, 0, 0, 1205, 1207, 3, 136, 68, 0, 1206, 1205, 1, 0, 0, 0, 1206, 1207, 1, 0, 0, 0, 1207, 1209, 1, 0, 0, 0, 1208, 1162, 1, 0, 0, 0, 1208, 1165, 1, 0, 0, 0, 1208, 1170, 1, 0, 0, 0, 1208, 1175, 1, 0, 0, 0, 1208, 1180, 1, 0, 0, 0, 1208, 1187, 1, 0, 0, 0, 1208, 1195, 1, 0, 0, 0, 1209, 135, 1, 0, 0, 0, 1210, 1211, 5, 69, 0, 0, 1211, 1212, 3, 142, 71, 0, 1212, 137, 1, 0, 0, 0, 1213, 1214, 7, 5, 0, 0, 1214, 139, 1, 0, 0, 0, 1215, 1216, 7, 6, 0, 0, 1216, 141, 1, 0, 0, 0, 1217, 1218, 5, 67, 0, 0, 1218, 1222, 5, 142, 0, 0, 1219, 1221, 3, 144, 72, 0, 1220, 1219, 1, 0, 0, 0, 1221, 1224, 1, 0, 0, 0, 1222, 1220, 1, 0, 0, 0, 1222, 1223, 1, 0, 0, 0, 1223, 1225, 1, 0, 0, 0, 1224, 1222, 1, 0, 0, 0, 1225, 1226, 5, 143, 0, 0, 1226, 143, 1, 0, 0, 0, 1227, 1228, 3, 166, 83, 0, 1228, 1229, 5, 61, 0, 0, 1229, 1230, 5, 11, 0, 0, 1230, 1231, 5, 25, 0, 0, 1231, 1232, 5, 144, 0, 0, 1232, 1233, 3, 88, 44, 0, 1233, 1234, 5, 145, 0, 0, 1234, 1235, 5, 139, 0, 0, 1235, 1326, 1, 0, 0, 0, 1236, 1237, 3, 166, 83, 0, 1237, 1238, 5, 61, 0, 0, 1238, 1239, 5, 64, 0, 0, 1239, 1246, 3, 166, 83, 0, 1240, 1241, 5, 70, 0, 0, 1241, 1242, 5, 65, 0, 0, 1242, 1243, 3, 166, 83, 0, 1243, 1244, 5, 141, 0, 0, 1244, 1245, 3, 166, 83, 0, 1245, 1247, 1, 0, 0, 0, 1246, 1240, 1, 0, 0, 0, 1246, 1247, 1, 0, 0, 0, 1247, 1248, 1, 0, 0, 0, 1248, 1249, 5, 139, 0, 0, 1249, 1326, 1, 0, 0, 0, 1250, 1251, 3, 166, 83, 0, 1251, 1252, 5, 61, 0, 0, 1252, 1253, 5, 65, 0, 0, 1253, 1254, 3, 166, 83, 0, 1254, 1255, 5, 141, 0, 0, 1255, 1262, 3, 166, 83, 0, 1256, 1257, 5, 70, 0, 0, 1257, 1258, 5, 65, 0, 0, 1258, 1259, 3, 166, 83, 0, 1259, 1260, 5, 141, 0, 0, 1260, 1261, 3, 166, 83, 0, 1261, 1263, 1, 0, 0, 0, 1262, 1256, 1, 0, 0, 0, 1262, 1263, 1, 0, 0, 0, 1263, 1264, 1, 0, 0, 0, 1264, 1265, 5, 139, 0, 0, 1265, 1326, 1, 0, 0, 0, 1266, 1267, 3, 166, 83, 0, 1267, 1268, 5, 61, 0, 0, 1268, 1269, 5, 46, 0, 0, 1269, 1271, 3, 166, 83, 0, 1270, 1272, 3, 28, 14, 0, 1271, 1270, 1, 0, 0, 0, 1271, 1272, 1, 0, 0, 0, 1272, 1281, 1, 0, 0, 0, 1273, 1274, 5, 70, 0, 0, 1274, 1275, 5, 65, 0, 0, 1275, 1276, 3, 166, 83, 0, 1276, 1277, 5, 141, 0, 0, 1277, 1278, 3, 166, 83, 0, 1278, 1282, 1, 0, 0, 0, 1279, 1280, 5, 20, 0, 0, 1280, 1282, 5, 56, 0, 0, 1281, 1273, 1, 0, 0, 0, 1281, 1279, 1, 0, 0, 0, 1281, 1282, 1, 0, 0, 0, 1282, 1283, 1, 0, 0, 0, 1283, 1284, 5, 139, 0, 0, 1284, 1326, 1, 0, 0, 0, 1285, 1286, 3, 166, 83, 0, 1286, 1287, 5, 61, 0, 0, 1287, 1288, 5, 7, 0, 0, 1288, 1289, 3, 166, 83, 0, 1289, 1290, 5, 67, 0, 0, 1290, 1294, 5, 142, 0, 0, 1291, 1293, 3, 122, 61, 0, 1292, 1291, 1, 0, 0, 0, 1293, 1296, 1, 0, 0, 0, 1294, 1292, 1, 0, 0, 0, 1294, 1295, 1, 0, 0, 0, 1295, 1297, 1, 0, 0, 0, 1296, 1294, 1, 0, 0, 0, 1297, 1298, 5, 143, 0, 0, 1298, 1299, 5, 139, 0, 0, 1299, 1326, 1, 0, 0, 0, 1300, 1301, 3, 166, 83, 0, 1301, 1302, 5, 61, 0, 0, 1302, 1303, 5, 54, 0, 0, 1303, 1304, 3, 166, 83, 0, 1304, 1305, 5, 139, 0, 0, 1305, 1326, 1, 0, 0, 0, 1306, 1307, 3, 166, 83, 0, 1307, 1309, 5, 61, 0, 0, 1308, 1310, 5, 11, 0, 0, 1309, 1308, 1, 0, 0, 0, 1309, 1310, 1, 0, 0, 0, 1310, 1311, 1, 0, 0, 0, 1311, 1312, 5, 24, 0, 0, 1312, 1313, 3, 166, 83, 0, 1313, 1314, 5, 141, 0, 0, 1314, 1321, 3, 166, 83, 0, 1315, 1316, 5, 70, 0, 0, 1316, 1317, 5, 65, 0, 0, 1317, 1318, 3, 166, 83, 0, 1318, 1319, 5, 141, 0, 0, 1319, 1320, 3, 166, 83, 0, 1320, 1322, 1, 0, 0, 0, 1321, 1315, 1, 0, 0, 0, 1321, 1322, 1, 0, 0, 0, 1322, 1323, 1, 0, 0, 0, 1323, 1324, 5, 139, 0, 0, 1324, 1326, 1, 0, 0, 0, 1325, 1227, 1, 0, 0, 0, 1325, 1236, 1, 0, 0, 0, 1325, 1250, 1, 0, 0, 0, 1325, 1266, 1, 0, 0, 0, 1325, 1285, 1, 0, 0, 0, 1325, 1300, 1, 0, 0, 0, 1325, 1306, 1, 0, 0, 0, 1326, 145, 1, 0, 0, 0, 1327, 1328, 5, 54, 0, 0, 1328, 1329, 3, 166, 83, 0, 1329, 1330, 5, 61, 0, 0, 1330, 1331, 3, 166, 83, 0, 1331, 1332, 5, 141, 0, 0, 1332, 1334, 3, 166, 83, 0, 1333, 1335, 3, 142, 71, 0, 1334, 1333, 1, 0, 0, 0, 1334, 1335, 1, 0, 0, 0, 1335, 1336, 1, 0, 0, 0, 1336, 1337, 5, 139, 0, 0, 1337, 147, 1, 0, 0, 0, 1338, 1396, 3, 154, 77, 0, 1339, 1396, 5, 118, 0, 0, 1340, 1396, 5, 119, 0, 0, 1341, 1342, 5, 120, 0, 0, 1342, 1396, 3, 168, 84, 0, 1343, 1344, 5, 121, 0, 0, 1344, 1345, 5, 148, 0, 0, 1345, 1346, 3, 166, 83, 0, 1346, 1347, 5, 149, 0, 0, 1347, 1396, 1, 0, 0, 0, 1348, 1349, 5, 122, 0, 0, 1349, 1350, 5, 148, 0, 0, 1350, 1352, 3, 166, 83, 0, 1351, 1353, 3, 28, 14, 0, 1352, 1351, 1, 0, 0, 0, 1352, 1353, 1, 0, 0, 0, 1353, 1354, 1, 0, 0, 0, 1354, 1355, 5, 149, 0, 0, 1355, 1396, 1, 0, 0, 0, 1356, 1357, 5, 41, 0, 0, 1357, 1358, 5, 148, 0, 0, 1358, 1359, 3, 166, 83, 0, 1359, 1360, 5, 149, 0, 0, 1360, 1396, 1, 0, 0, 0, 1361, 1362, 5, 123, 0, 0, 1362, 1363, 5, 148, 0, 0, 1363, 1364, 3, 148, 74, 0, 1364, 1365, 5, 149, 0, 0, 1365, 1396, 1, 0, 0, 0, 1366, 1367, 5, 124, 0, 0, 1367, 1368, 5, 148, 0, 0, 1368, 1369, 3, 148, 74, 0, 1369, 1370, 5, 149, 0, 0, 1370, 1396, 1, 0, 0, 0, 1371, 1372, 5, 125, 0, 0, 1372, 1376, 5, 142, 0, 0, 1373, 1375, 3, 150, 75, 0, 1374, 1373, 1, 0, 0, 0, 1375, 1378, 1, 0, 0, 0, 1376, 1374, 1, 0, 0, 0, 1376, 1377, 1, 0, 0, 0, 1377, 1379, 1, 0, 0, 0, 1378, 1376, 1, 0, 0, 0, 1379, 1396, 5, 143, 0, 0, 1380, 1381, 5, 8, 0, 0, 1381, 1382, 5, 89, 0, 0, 1382, 1383, 3, 168, 84, 0, 1383, 1385, 5, 142, 0, 0, 1384, 1386, 3, 152, 76, 0, 1385, 1384, 1, 0, 0, 0, 1386, 1387, 1, 0, 0, 0, 1387, 1385, 1, 0, 0, 0, 1387, 1388, 1, 0, 0, 0, 1388, 1389, 1, 0, 0, 0, 1389, 1390, 5, 143, 0, 0, 1390, 1396, 1, 0, 0, 0, 1391, 1393, 3, 166, 83, 0, 1392, 1394, 3, 28, 14, 0, 1393, 1392, 1, 0, 0, 0, 1393, 1394, 1, 0, 0, 0, 1394, 1396, 1, 0, 0, 0, 1395, 1338, 1, 0, 0, 0, 1395, 1339, 1, 0, 0, 0, 1395, 1340, 1, 0, 0, 0, 1395, 1341, 1, 0, 0, 0, 1395, 1343, 1, 0, 0, 0, 1395, 1348, 1, 0, 0, 0, 1395, 1356, 1, 0, 0, 0, 1395, 1361, 1, 0, 0, 0, 1395, 1366, 1, 0, 0, 0, 1395, 1371, 1, 0, 0, 0, 1395, 1380, 1, 0, 0, 0, 1395, 1391, 1, 0, 0, 0, 1396, 149, 1, 0, 0, 0, 1397, 1398, 3, 166, 83, 0, 1398, 1399, 5, 138, 0, 0, 1399, 1400, 3, 148, 74, 0, 1400, 1401, 5, 139, 0, 0, 1401, 151, 1, 0, 0, 0, 1402, 1403, 3, 166, 83, 0, 1403, 1404, 5, 89, 0, 0, 1404, 1405, 3, 168, 84, 0, 1405, 1406, 5, 138, 0, 0, 1406, 1407, 3, 148, 74, 0, 1407, 1408, 5, 139, 0, 0, 1408, 153, 1, 0, 0, 0, 1409, 1410, 7, 7, 0, 0, 1410, 155, 1, 0, 0, 0, 1411, 1412, 7, 8, 0, 0, 1412, 157, 1, 0, 0, 0, 1413, 1422, 3, 168, 84, 0, 1414, 1422, 5, 152, 0, 0, 1415, 1422, 5, 153, 0, 0, 1416, 1422, 5, 134, 0, 0, 1417, 1422, 5, 135, 0, 0, 1418, 1422, 5, 136, 0, 0, 1419, 1422, 3, 160, 80, 0, 1420, 1422, 3, 164, 82, 0, 1421, 1413, 1, 0, 0, 0, 1421, 1414, 1, 0, 0, 0, 1421, 1415, 1, 0, 0, 0, 1421, 1416, 1, 0, 0, 0, 1421, 1417, 1, 0, 0, 0, 1421, 1418, 1, 0, 0, 0, 1421, 1419, 1, 0, 0, 0, 1421, 1420, 1, 0, 0, 0, 1422, 159, 1, 0, 0, 0, 1423, 1432, 5, 142, 0, 0, 1424, 1429, 3, 162, 81, 0, 1425, 1426, 5, 140, 0, 0, 1426, 1428, 3, 162, 81, 0, 1427, 1425, 1, 0, 0, 0, 1428, 1431, 1, 0, 0, 0, 1429, 1427, 1, 0, 0, 0, 1429, 1430, 1, 0, 0, 0, 1430, 1433, 1, 0, 0, 0, 1431, 1429, 1, 0, 0, 0, 1432, 1424, 1, 0, 0, 0, 1432, 1433, 1, 0, 0, 0, 1433, 1434, 1, 0, 0, 0, 1434, 1435, 5, 143, 0, 0, 1435, 161, 1, 0, 0, 0, 1436, 1437, 3, 168, 84, 0, 1437, 1438, 5, 138, 0, 0, 1438, 1439, 3, 158, 79, 0, 1439, 163, 1, 0, 0, 0, 1440, 1449, 5, 144, 0, 0, 1441, 1446, 3, 158, 79, 0, 1442, 1443, 5, 140, 0, 0, 1443, 1445, 3, 158, 79, 0, 1444, 1442, 1, 0, 0, 0, 1445, 1448, 1, 0, 0, 0, 1446, 1444, 1, 0, 0, 0, 1446, 1447, 1, 0, 0, 0, 1447, 1450, 1, 0, 0, 0, 1448, 1446, 1, 0, 0, 0, 1449, 1441, 1, 0, 0, 0, 1449, 1450, 1, 0, 0, 0, 1450, 1451, 1, 0, 0, 0, 1451, 1452, 5, 145, 0, 0, 1452, 165, 1, 0, 0, 0, 1453, 1454, 7, 9, 0, 0, 1454, 167, 1, 0, 0, 0, 1455, 1456, 5, 155, 0, 0, 1456, 169, 1, 0, 0, 0, 129, 182, 189, 210, 223, 235, 255, 263, 270, 276, 288, 291, 297, 308, 317, 327, 330, 332, 336, 344, 356, 361, 371, 381, 386, 401, 407, 419, 428, 436, 444, 457, 460, 470, 474, 480, 487, 493, 501, 509, 522, 529, 533, 538, 549, 555, 566, 592, 596, 602, 613, 622, 628, 633, 635, 666, 670, 676, 703, 713, 724, 727, 732, 735, 738, 745, 754, 757, 760, 763, 786, 795, 809, 830, 833, 836, 843, 851, 883, 895, 898, 902, 924, 938, 946, 958, 972, 989, 1007, 1011, 1014, 1018, 1021, 1027, 1031, 1036, 1040, 1044, 1050, 1064, 1079, 1099, 1108, 1140, 1160, 1190, 1200, 1203, 1206, 1208, 1222, 1246, 1262, 1271, 1281, 1294, 1309, 1321, 1325, 1334, 1352, 1376, 1387, 1393, 1395, 1421, 1429, 1432, 1446, 1449] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapability.tokens b/src/capability-language/generated/QuixosCapability.tokens index 4a012c6..737fc4d 100644 --- a/src/capability-language/generated/QuixosCapability.tokens +++ b/src/capability-language/generated/QuixosCapability.tokens @@ -81,79 +81,81 @@ REVISION=80 SEMANTIC_MAJOR=81 ON_DELETE=82 LIFECYCLE=83 -RETAIN_OTHER=84 -KEYED=85 -PUBLIC_TRAVERSAL=86 -ID=87 -DOC=88 -MODE=89 -EMITS=90 -RECEIVER=91 -REQUIRES=92 -ANY=93 -GET=94 -SET=95 -WATCH=96 -START=97 -STOP=98 -READ=99 -WRITE=100 -RESOLVE=101 -CONNECT=102 -DISCONNECT=103 -CALL=104 -WATCH_START=105 -WATCH_STOP=106 -SUBSCRIBE=107 -UNSUBSCRIBE=108 -REGISTER=109 -CRDT=110 -OPTIONAL_ONE=111 -EXACTLY_ONE=112 -MANY_UNIQUE=113 -MANY=114 -ORDERED=115 -UNIT=116 -WATCH_HANDLE=117 -MESSAGE=118 -ATOM_REF=119 -INTERFACE_REF=120 -OPTIONAL=121 -LIST=122 -RECORD=123 -BOOL=124 -BYTES=125 -DOUBLE=126 -INT32=127 -INT64=128 -STRING=129 -UINT32=130 -UINT64=131 -TRUE=132 -FALSE=133 -NULL=134 -ARROW=135 -COLON=136 -SEMI=137 -COMMA=138 -DOT=139 -LBRACE=140 -RBRACE=141 -LBRACK=142 -RBRACK=143 -LPAREN=144 -RPAREN=145 -LT=146 -GT=147 -AMP=148 -EQUAL=149 -INTEGER=150 -JSON_NUMBER=151 -IDENTIFIER=152 -STRING_LITERAL=153 -LINE_COMMENT=154 -BLOCK_COMMENT=155 -WS=156 +JOURNAL=84 +SUBSCRIPTION=85 +RETAIN_OTHER=86 +KEYED=87 +PUBLIC_TRAVERSAL=88 +ID=89 +DOC=90 +MODE=91 +EMITS=92 +RECEIVER=93 +REQUIRES=94 +ANY=95 +GET=96 +SET=97 +WATCH=98 +START=99 +STOP=100 +READ=101 +WRITE=102 +RESOLVE=103 +CONNECT=104 +DISCONNECT=105 +CALL=106 +WATCH_START=107 +WATCH_STOP=108 +SUBSCRIBE=109 +UNSUBSCRIBE=110 +REGISTER=111 +CRDT=112 +OPTIONAL_ONE=113 +EXACTLY_ONE=114 +MANY_UNIQUE=115 +MANY=116 +ORDERED=117 +UNIT=118 +WATCH_HANDLE=119 +MESSAGE=120 +ATOM_REF=121 +INTERFACE_REF=122 +OPTIONAL=123 +LIST=124 +RECORD=125 +BOOL=126 +BYTES=127 +DOUBLE=128 +INT32=129 +INT64=130 +STRING=131 +UINT32=132 +UINT64=133 +TRUE=134 +FALSE=135 +NULL=136 +ARROW=137 +COLON=138 +SEMI=139 +COMMA=140 +DOT=141 +LBRACE=142 +RBRACE=143 +LBRACK=144 +RBRACK=145 +LPAREN=146 +RPAREN=147 +LT=148 +GT=149 +AMP=150 +EQUAL=151 +INTEGER=152 +JSON_NUMBER=153 +IDENTIFIER=154 +STRING_LITERAL=155 +LINE_COMMENT=156 +BLOCK_COMMENT=157 +WS=158 'edit'=1 'module'=2 'contract'=3 @@ -237,69 +239,71 @@ WS=156 'semantic-major'=81 'on-delete'=82 'lifecycle'=83 -'retain-other'=84 -'keyed'=85 -'public-traversal'=86 -'id'=87 -'doc'=88 -'mode'=89 -'emits'=90 -'receiver'=91 -'requires'=92 -'any'=93 -'get'=94 -'set'=95 -'watch'=96 -'start'=97 -'stop'=98 -'read'=99 -'write'=100 -'resolve'=101 -'connect'=102 -'disconnect'=103 -'call'=104 -'watch-start'=105 -'watch-stop'=106 -'subscribe'=107 -'unsubscribe'=108 -'register'=109 -'crdt'=110 -'optional-one'=111 -'exactly-one'=112 -'many-unique'=113 -'many'=114 -'ordered'=115 -'unit'=116 -'watch-handle'=117 -'message'=118 -'atom-ref'=119 -'interface-ref'=120 -'optional'=121 -'list'=122 -'record'=123 -'bool'=124 -'bytes'=125 -'double'=126 -'int32'=127 -'int64'=128 -'string'=129 -'uint32'=130 -'uint64'=131 -'true'=132 -'false'=133 -'null'=134 -'->'=135 -':'=136 -';'=137 -','=138 -'.'=139 -'{'=140 -'}'=141 -'['=142 -']'=143 -'('=144 -')'=145 -'<'=146 -'>'=147 -'&'=148 -'='=149 +'journal'=84 +'subscription'=85 +'retain-other'=86 +'keyed'=87 +'public-traversal'=88 +'id'=89 +'doc'=90 +'mode'=91 +'emits'=92 +'receiver'=93 +'requires'=94 +'any'=95 +'get'=96 +'set'=97 +'watch'=98 +'start'=99 +'stop'=100 +'read'=101 +'write'=102 +'resolve'=103 +'connect'=104 +'disconnect'=105 +'call'=106 +'watch-start'=107 +'watch-stop'=108 +'subscribe'=109 +'unsubscribe'=110 +'register'=111 +'crdt'=112 +'optional-one'=113 +'exactly-one'=114 +'many-unique'=115 +'many'=116 +'ordered'=117 +'unit'=118 +'watch-handle'=119 +'message'=120 +'atom-ref'=121 +'interface-ref'=122 +'optional'=123 +'list'=124 +'record'=125 +'bool'=126 +'bytes'=127 +'double'=128 +'int32'=129 +'int64'=130 +'string'=131 +'uint32'=132 +'uint64'=133 +'true'=134 +'false'=135 +'null'=136 +'->'=137 +':'=138 +';'=139 +','=140 +'.'=141 +'{'=142 +'}'=143 +'['=144 +']'=145 +'('=146 +')'=147 +'<'=148 +'>'=149 +'&'=150 +'='=151 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.interp b/src/capability-language/generated/QuixosCapabilityLexer.interp index da71c4d..53aba18 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.interp +++ b/src/capability-language/generated/QuixosCapabilityLexer.interp @@ -83,6 +83,8 @@ null 'semantic-major' 'on-delete' 'lifecycle' +'journal' +'subscription' 'retain-other' 'keyed' 'public-traversal' @@ -242,6 +244,8 @@ REVISION SEMANTIC_MAJOR ON_DELETE LIFECYCLE +JOURNAL +SUBSCRIPTION RETAIN_OTHER KEYED PUBLIC_TRAVERSAL @@ -400,6 +404,8 @@ REVISION SEMANTIC_MAJOR ON_DELETE LIFECYCLE +JOURNAL +SUBSCRIPTION RETAIN_OTHER KEYED PUBLIC_TRAVERSAL @@ -484,4 +490,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 156, 1498, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 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, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 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, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 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, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 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, 27, 1, 28, 1, 28, 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, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 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, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 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, 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, 45, 1, 46, 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, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 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, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 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, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 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, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 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, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 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, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 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, 70, 1, 70, 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, 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, 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, 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, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 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, 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, 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, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 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, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 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, 100, 1, 100, 1, 101, 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, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 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, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 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, 144, 1, 144, 1, 145, 1, 145, 1, 146, 1, 146, 1, 147, 1, 147, 1, 148, 1, 148, 1, 149, 3, 149, 1399, 8, 149, 1, 149, 4, 149, 1402, 8, 149, 11, 149, 12, 149, 1403, 1, 150, 3, 150, 1407, 8, 150, 1, 150, 1, 150, 1, 150, 5, 150, 1412, 8, 150, 10, 150, 12, 150, 1415, 9, 150, 3, 150, 1417, 8, 150, 1, 150, 1, 150, 4, 150, 1421, 8, 150, 11, 150, 12, 150, 1422, 3, 150, 1425, 8, 150, 1, 150, 1, 150, 3, 150, 1429, 8, 150, 1, 150, 4, 150, 1432, 8, 150, 11, 150, 12, 150, 1433, 3, 150, 1436, 8, 150, 1, 151, 1, 151, 5, 151, 1440, 8, 151, 10, 151, 12, 151, 1443, 9, 151, 1, 152, 1, 152, 1, 152, 5, 152, 1448, 8, 152, 10, 152, 12, 152, 1451, 9, 152, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 1, 153, 3, 153, 1463, 8, 153, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 5, 155, 1471, 8, 155, 10, 155, 12, 155, 1474, 9, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 5, 156, 1482, 8, 156, 10, 156, 12, 156, 1485, 9, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 157, 4, 157, 1493, 8, 157, 11, 157, 12, 157, 1494, 1, 157, 1, 157, 1, 1483, 0, 158, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 143, 287, 144, 289, 145, 291, 146, 293, 147, 295, 148, 297, 149, 299, 150, 301, 151, 303, 152, 305, 153, 307, 0, 309, 0, 311, 154, 313, 155, 315, 156, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1512, 0, 1, 1, 0, 0, 0, 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, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 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, 311, 1, 0, 0, 0, 0, 313, 1, 0, 0, 0, 0, 315, 1, 0, 0, 0, 1, 317, 1, 0, 0, 0, 3, 322, 1, 0, 0, 0, 5, 329, 1, 0, 0, 0, 7, 338, 1, 0, 0, 0, 9, 351, 1, 0, 0, 0, 11, 359, 1, 0, 0, 0, 13, 363, 1, 0, 0, 0, 15, 372, 1, 0, 0, 0, 17, 380, 1, 0, 0, 0, 19, 389, 1, 0, 0, 0, 21, 400, 1, 0, 0, 0, 23, 410, 1, 0, 0, 0, 25, 420, 1, 0, 0, 0, 27, 429, 1, 0, 0, 0, 29, 441, 1, 0, 0, 0, 31, 448, 1, 0, 0, 0, 33, 456, 1, 0, 0, 0, 35, 465, 1, 0, 0, 0, 37, 473, 1, 0, 0, 0, 39, 479, 1, 0, 0, 0, 41, 484, 1, 0, 0, 0, 43, 497, 1, 0, 0, 0, 45, 507, 1, 0, 0, 0, 47, 519, 1, 0, 0, 0, 49, 525, 1, 0, 0, 0, 51, 536, 1, 0, 0, 0, 53, 547, 1, 0, 0, 0, 55, 552, 1, 0, 0, 0, 57, 561, 1, 0, 0, 0, 59, 571, 1, 0, 0, 0, 61, 576, 1, 0, 0, 0, 63, 580, 1, 0, 0, 0, 65, 586, 1, 0, 0, 0, 67, 591, 1, 0, 0, 0, 69, 601, 1, 0, 0, 0, 71, 605, 1, 0, 0, 0, 73, 618, 1, 0, 0, 0, 75, 623, 1, 0, 0, 0, 77, 630, 1, 0, 0, 0, 79, 639, 1, 0, 0, 0, 81, 650, 1, 0, 0, 0, 83, 654, 1, 0, 0, 0, 85, 663, 1, 0, 0, 0, 87, 670, 1, 0, 0, 0, 89, 679, 1, 0, 0, 0, 91, 684, 1, 0, 0, 0, 93, 694, 1, 0, 0, 0, 95, 705, 1, 0, 0, 0, 97, 713, 1, 0, 0, 0, 99, 719, 1, 0, 0, 0, 101, 725, 1, 0, 0, 0, 103, 734, 1, 0, 0, 0, 105, 744, 1, 0, 0, 0, 107, 753, 1, 0, 0, 0, 109, 765, 1, 0, 0, 0, 111, 776, 1, 0, 0, 0, 113, 782, 1, 0, 0, 0, 115, 790, 1, 0, 0, 0, 117, 793, 1, 0, 0, 0, 119, 798, 1, 0, 0, 0, 121, 805, 1, 0, 0, 0, 123, 808, 1, 0, 0, 0, 125, 816, 1, 0, 0, 0, 127, 823, 1, 0, 0, 0, 129, 829, 1, 0, 0, 0, 131, 834, 1, 0, 0, 0, 133, 845, 1, 0, 0, 0, 135, 850, 1, 0, 0, 0, 137, 856, 1, 0, 0, 0, 139, 863, 1, 0, 0, 0, 141, 867, 1, 0, 0, 0, 143, 879, 1, 0, 0, 0, 145, 882, 1, 0, 0, 0, 147, 889, 1, 0, 0, 0, 149, 892, 1, 0, 0, 0, 151, 899, 1, 0, 0, 0, 153, 907, 1, 0, 0, 0, 155, 914, 1, 0, 0, 0, 157, 925, 1, 0, 0, 0, 159, 932, 1, 0, 0, 0, 161, 941, 1, 0, 0, 0, 163, 956, 1, 0, 0, 0, 165, 966, 1, 0, 0, 0, 167, 976, 1, 0, 0, 0, 169, 989, 1, 0, 0, 0, 171, 995, 1, 0, 0, 0, 173, 1012, 1, 0, 0, 0, 175, 1015, 1, 0, 0, 0, 177, 1019, 1, 0, 0, 0, 179, 1024, 1, 0, 0, 0, 181, 1030, 1, 0, 0, 0, 183, 1039, 1, 0, 0, 0, 185, 1048, 1, 0, 0, 0, 187, 1052, 1, 0, 0, 0, 189, 1056, 1, 0, 0, 0, 191, 1060, 1, 0, 0, 0, 193, 1066, 1, 0, 0, 0, 195, 1072, 1, 0, 0, 0, 197, 1077, 1, 0, 0, 0, 199, 1082, 1, 0, 0, 0, 201, 1088, 1, 0, 0, 0, 203, 1096, 1, 0, 0, 0, 205, 1104, 1, 0, 0, 0, 207, 1115, 1, 0, 0, 0, 209, 1120, 1, 0, 0, 0, 211, 1132, 1, 0, 0, 0, 213, 1143, 1, 0, 0, 0, 215, 1153, 1, 0, 0, 0, 217, 1165, 1, 0, 0, 0, 219, 1174, 1, 0, 0, 0, 221, 1179, 1, 0, 0, 0, 223, 1192, 1, 0, 0, 0, 225, 1204, 1, 0, 0, 0, 227, 1216, 1, 0, 0, 0, 229, 1221, 1, 0, 0, 0, 231, 1229, 1, 0, 0, 0, 233, 1234, 1, 0, 0, 0, 235, 1247, 1, 0, 0, 0, 237, 1255, 1, 0, 0, 0, 239, 1264, 1, 0, 0, 0, 241, 1278, 1, 0, 0, 0, 243, 1287, 1, 0, 0, 0, 245, 1292, 1, 0, 0, 0, 247, 1299, 1, 0, 0, 0, 249, 1304, 1, 0, 0, 0, 251, 1310, 1, 0, 0, 0, 253, 1317, 1, 0, 0, 0, 255, 1323, 1, 0, 0, 0, 257, 1329, 1, 0, 0, 0, 259, 1336, 1, 0, 0, 0, 261, 1343, 1, 0, 0, 0, 263, 1350, 1, 0, 0, 0, 265, 1355, 1, 0, 0, 0, 267, 1361, 1, 0, 0, 0, 269, 1366, 1, 0, 0, 0, 271, 1369, 1, 0, 0, 0, 273, 1371, 1, 0, 0, 0, 275, 1373, 1, 0, 0, 0, 277, 1375, 1, 0, 0, 0, 279, 1377, 1, 0, 0, 0, 281, 1379, 1, 0, 0, 0, 283, 1381, 1, 0, 0, 0, 285, 1383, 1, 0, 0, 0, 287, 1385, 1, 0, 0, 0, 289, 1387, 1, 0, 0, 0, 291, 1389, 1, 0, 0, 0, 293, 1391, 1, 0, 0, 0, 295, 1393, 1, 0, 0, 0, 297, 1395, 1, 0, 0, 0, 299, 1398, 1, 0, 0, 0, 301, 1406, 1, 0, 0, 0, 303, 1437, 1, 0, 0, 0, 305, 1444, 1, 0, 0, 0, 307, 1454, 1, 0, 0, 0, 309, 1464, 1, 0, 0, 0, 311, 1466, 1, 0, 0, 0, 313, 1477, 1, 0, 0, 0, 315, 1492, 1, 0, 0, 0, 317, 318, 5, 101, 0, 0, 318, 319, 5, 100, 0, 0, 319, 320, 5, 105, 0, 0, 320, 321, 5, 116, 0, 0, 321, 2, 1, 0, 0, 0, 322, 323, 5, 109, 0, 0, 323, 324, 5, 111, 0, 0, 324, 325, 5, 100, 0, 0, 325, 326, 5, 117, 0, 0, 326, 327, 5, 108, 0, 0, 327, 328, 5, 101, 0, 0, 328, 4, 1, 0, 0, 0, 329, 330, 5, 99, 0, 0, 330, 331, 5, 111, 0, 0, 331, 332, 5, 110, 0, 0, 332, 333, 5, 116, 0, 0, 333, 334, 5, 114, 0, 0, 334, 335, 5, 97, 0, 0, 335, 336, 5, 99, 0, 0, 336, 337, 5, 116, 0, 0, 337, 6, 1, 0, 0, 0, 338, 339, 5, 112, 0, 0, 339, 340, 5, 114, 0, 0, 340, 341, 5, 101, 0, 0, 341, 342, 5, 115, 0, 0, 342, 343, 5, 101, 0, 0, 343, 344, 5, 110, 0, 0, 344, 345, 5, 116, 0, 0, 345, 346, 5, 97, 0, 0, 346, 347, 5, 116, 0, 0, 347, 348, 5, 105, 0, 0, 348, 349, 5, 111, 0, 0, 349, 350, 5, 110, 0, 0, 350, 8, 1, 0, 0, 0, 351, 352, 5, 115, 0, 0, 352, 353, 5, 117, 0, 0, 353, 354, 5, 98, 0, 0, 354, 355, 5, 106, 0, 0, 355, 356, 5, 101, 0, 0, 356, 357, 5, 99, 0, 0, 357, 358, 5, 116, 0, 0, 358, 10, 1, 0, 0, 0, 359, 360, 5, 102, 0, 0, 360, 361, 5, 111, 0, 0, 361, 362, 5, 114, 0, 0, 362, 12, 1, 0, 0, 0, 363, 364, 5, 99, 0, 0, 364, 365, 5, 114, 0, 0, 365, 366, 5, 101, 0, 0, 366, 367, 5, 97, 0, 0, 367, 368, 5, 116, 0, 0, 368, 369, 5, 105, 0, 0, 369, 370, 5, 111, 0, 0, 370, 371, 5, 110, 0, 0, 371, 14, 1, 0, 0, 0, 372, 373, 5, 118, 0, 0, 373, 374, 5, 97, 0, 0, 374, 375, 5, 114, 0, 0, 375, 376, 5, 105, 0, 0, 376, 377, 5, 97, 0, 0, 377, 378, 5, 110, 0, 0, 378, 379, 5, 116, 0, 0, 379, 16, 1, 0, 0, 0, 380, 381, 5, 112, 0, 0, 381, 382, 5, 114, 0, 0, 382, 383, 5, 101, 0, 0, 383, 384, 5, 112, 0, 0, 384, 385, 5, 97, 0, 0, 385, 386, 5, 114, 0, 0, 386, 387, 5, 101, 0, 0, 387, 388, 5, 115, 0, 0, 388, 18, 1, 0, 0, 0, 389, 390, 5, 105, 0, 0, 390, 391, 5, 110, 0, 0, 391, 392, 5, 105, 0, 0, 392, 393, 5, 116, 0, 0, 393, 394, 5, 105, 0, 0, 394, 395, 5, 97, 0, 0, 395, 396, 5, 108, 0, 0, 396, 397, 5, 105, 0, 0, 397, 398, 5, 122, 0, 0, 398, 399, 5, 101, 0, 0, 399, 20, 1, 0, 0, 0, 400, 401, 5, 119, 0, 0, 401, 402, 5, 111, 0, 0, 402, 403, 5, 114, 0, 0, 403, 404, 5, 107, 0, 0, 404, 405, 5, 115, 0, 0, 405, 406, 5, 112, 0, 0, 406, 407, 5, 97, 0, 0, 407, 408, 5, 99, 0, 0, 408, 409, 5, 101, 0, 0, 409, 22, 1, 0, 0, 0, 410, 411, 5, 101, 0, 0, 411, 412, 5, 120, 0, 0, 412, 413, 5, 101, 0, 0, 413, 414, 5, 99, 0, 0, 414, 415, 5, 117, 0, 0, 415, 416, 5, 116, 0, 0, 416, 417, 5, 105, 0, 0, 417, 418, 5, 111, 0, 0, 418, 419, 5, 110, 0, 0, 419, 24, 1, 0, 0, 0, 420, 421, 5, 115, 0, 0, 421, 422, 5, 110, 0, 0, 422, 423, 5, 97, 0, 0, 423, 424, 5, 112, 0, 0, 424, 425, 5, 115, 0, 0, 425, 426, 5, 104, 0, 0, 426, 427, 5, 111, 0, 0, 427, 428, 5, 116, 0, 0, 428, 26, 1, 0, 0, 0, 429, 430, 5, 116, 0, 0, 430, 431, 5, 114, 0, 0, 431, 432, 5, 97, 0, 0, 432, 433, 5, 110, 0, 0, 433, 434, 5, 115, 0, 0, 434, 435, 5, 97, 0, 0, 435, 436, 5, 99, 0, 0, 436, 437, 5, 116, 0, 0, 437, 438, 5, 105, 0, 0, 438, 439, 5, 111, 0, 0, 439, 440, 5, 110, 0, 0, 440, 28, 1, 0, 0, 0, 441, 442, 5, 114, 0, 0, 442, 443, 5, 101, 0, 0, 443, 444, 5, 109, 0, 0, 444, 445, 5, 111, 0, 0, 445, 446, 5, 116, 0, 0, 446, 447, 5, 101, 0, 0, 447, 30, 1, 0, 0, 0, 448, 449, 5, 116, 0, 0, 449, 450, 5, 97, 0, 0, 450, 451, 5, 114, 0, 0, 451, 452, 5, 103, 0, 0, 452, 453, 5, 101, 0, 0, 453, 454, 5, 116, 0, 0, 454, 455, 5, 115, 0, 0, 455, 32, 1, 0, 0, 0, 456, 457, 5, 112, 0, 0, 457, 458, 5, 111, 0, 0, 458, 459, 5, 114, 0, 0, 459, 460, 5, 116, 0, 0, 460, 461, 5, 97, 0, 0, 461, 462, 5, 98, 0, 0, 462, 463, 5, 108, 0, 0, 463, 464, 5, 101, 0, 0, 464, 34, 1, 0, 0, 0, 465, 466, 5, 114, 0, 0, 466, 467, 5, 101, 0, 0, 467, 468, 5, 112, 0, 0, 468, 469, 5, 108, 0, 0, 469, 470, 5, 105, 0, 0, 470, 471, 5, 99, 0, 0, 471, 472, 5, 97, 0, 0, 472, 36, 1, 0, 0, 0, 473, 474, 5, 108, 0, 0, 474, 475, 5, 111, 0, 0, 475, 476, 5, 99, 0, 0, 476, 477, 5, 97, 0, 0, 477, 478, 5, 108, 0, 0, 478, 38, 1, 0, 0, 0, 479, 480, 5, 102, 0, 0, 480, 481, 5, 114, 0, 0, 481, 482, 5, 111, 0, 0, 482, 483, 5, 109, 0, 0, 483, 40, 1, 0, 0, 0, 484, 485, 5, 114, 0, 0, 485, 486, 5, 101, 0, 0, 486, 487, 5, 115, 0, 0, 487, 488, 5, 117, 0, 0, 488, 489, 5, 108, 0, 0, 489, 490, 5, 116, 0, 0, 490, 491, 5, 45, 0, 0, 491, 492, 5, 98, 0, 0, 492, 493, 5, 121, 0, 0, 493, 494, 5, 116, 0, 0, 494, 495, 5, 101, 0, 0, 495, 496, 5, 115, 0, 0, 496, 42, 1, 0, 0, 0, 497, 498, 5, 114, 0, 0, 498, 499, 5, 112, 0, 0, 499, 500, 5, 99, 0, 0, 500, 501, 5, 45, 0, 0, 501, 502, 5, 99, 0, 0, 502, 503, 5, 97, 0, 0, 503, 504, 5, 108, 0, 0, 504, 505, 5, 108, 0, 0, 505, 506, 5, 115, 0, 0, 506, 44, 1, 0, 0, 0, 507, 508, 5, 100, 0, 0, 508, 509, 5, 101, 0, 0, 509, 510, 5, 97, 0, 0, 510, 511, 5, 100, 0, 0, 511, 512, 5, 108, 0, 0, 512, 513, 5, 105, 0, 0, 513, 514, 5, 110, 0, 0, 514, 515, 5, 101, 0, 0, 515, 516, 5, 45, 0, 0, 516, 517, 5, 109, 0, 0, 517, 518, 5, 115, 0, 0, 518, 46, 1, 0, 0, 0, 519, 520, 5, 113, 0, 0, 520, 521, 5, 117, 0, 0, 521, 522, 5, 101, 0, 0, 522, 523, 5, 114, 0, 0, 523, 524, 5, 121, 0, 0, 524, 48, 1, 0, 0, 0, 525, 526, 5, 114, 0, 0, 526, 527, 5, 101, 0, 0, 527, 528, 5, 102, 0, 0, 528, 529, 5, 108, 0, 0, 529, 530, 5, 101, 0, 0, 530, 531, 5, 99, 0, 0, 531, 532, 5, 116, 0, 0, 532, 533, 5, 105, 0, 0, 533, 534, 5, 111, 0, 0, 534, 535, 5, 110, 0, 0, 535, 50, 1, 0, 0, 0, 536, 537, 5, 115, 0, 0, 537, 538, 5, 112, 0, 0, 538, 539, 5, 101, 0, 0, 539, 540, 5, 99, 0, 0, 540, 541, 5, 105, 0, 0, 541, 542, 5, 97, 0, 0, 542, 543, 5, 108, 0, 0, 543, 544, 5, 105, 0, 0, 544, 545, 5, 122, 0, 0, 545, 546, 5, 101, 0, 0, 546, 52, 1, 0, 0, 0, 547, 548, 5, 114, 0, 0, 548, 549, 5, 111, 0, 0, 549, 550, 5, 111, 0, 0, 550, 551, 5, 116, 0, 0, 551, 54, 1, 0, 0, 0, 552, 553, 5, 100, 0, 0, 553, 554, 5, 111, 0, 0, 554, 555, 5, 99, 0, 0, 555, 556, 5, 117, 0, 0, 556, 557, 5, 109, 0, 0, 557, 558, 5, 101, 0, 0, 558, 559, 5, 110, 0, 0, 559, 560, 5, 116, 0, 0, 560, 56, 1, 0, 0, 0, 561, 562, 5, 102, 0, 0, 562, 563, 5, 114, 0, 0, 563, 564, 5, 97, 0, 0, 564, 565, 5, 103, 0, 0, 565, 566, 5, 109, 0, 0, 566, 567, 5, 101, 0, 0, 567, 568, 5, 110, 0, 0, 568, 569, 5, 116, 0, 0, 569, 570, 5, 115, 0, 0, 570, 58, 1, 0, 0, 0, 571, 572, 5, 118, 0, 0, 572, 573, 5, 105, 0, 0, 573, 574, 5, 101, 0, 0, 574, 575, 5, 119, 0, 0, 575, 60, 1, 0, 0, 0, 576, 577, 5, 109, 0, 0, 577, 578, 5, 97, 0, 0, 578, 579, 5, 120, 0, 0, 579, 62, 1, 0, 0, 0, 580, 581, 5, 97, 0, 0, 581, 582, 5, 108, 0, 0, 582, 583, 5, 108, 0, 0, 583, 584, 5, 111, 0, 0, 584, 585, 5, 119, 0, 0, 585, 64, 1, 0, 0, 0, 586, 587, 5, 112, 0, 0, 587, 588, 5, 111, 0, 0, 588, 589, 5, 108, 0, 0, 589, 590, 5, 108, 0, 0, 590, 66, 1, 0, 0, 0, 591, 592, 5, 113, 0, 0, 592, 593, 5, 117, 0, 0, 593, 594, 5, 101, 0, 0, 594, 595, 5, 114, 0, 0, 595, 596, 5, 121, 0, 0, 596, 597, 5, 97, 0, 0, 597, 598, 5, 98, 0, 0, 598, 599, 5, 108, 0, 0, 599, 600, 5, 101, 0, 0, 600, 68, 1, 0, 0, 0, 601, 602, 5, 114, 0, 0, 602, 603, 5, 112, 0, 0, 603, 604, 5, 99, 0, 0, 604, 70, 1, 0, 0, 0, 605, 606, 5, 113, 0, 0, 606, 607, 5, 117, 0, 0, 607, 608, 5, 101, 0, 0, 608, 609, 5, 114, 0, 0, 609, 610, 5, 121, 0, 0, 610, 611, 5, 45, 0, 0, 611, 612, 5, 114, 0, 0, 612, 613, 5, 101, 0, 0, 613, 614, 5, 97, 0, 0, 614, 615, 5, 115, 0, 0, 615, 616, 5, 111, 0, 0, 616, 617, 5, 110, 0, 0, 617, 72, 1, 0, 0, 0, 618, 619, 5, 116, 0, 0, 619, 620, 5, 121, 0, 0, 620, 621, 5, 112, 0, 0, 621, 622, 5, 101, 0, 0, 622, 74, 1, 0, 0, 0, 623, 624, 5, 111, 0, 0, 624, 625, 5, 98, 0, 0, 625, 626, 5, 106, 0, 0, 626, 627, 5, 101, 0, 0, 627, 628, 5, 99, 0, 0, 628, 629, 5, 116, 0, 0, 629, 76, 1, 0, 0, 0, 630, 631, 5, 115, 0, 0, 631, 632, 5, 116, 0, 0, 632, 633, 5, 111, 0, 0, 633, 634, 5, 114, 0, 0, 634, 635, 5, 97, 0, 0, 635, 636, 5, 98, 0, 0, 636, 637, 5, 108, 0, 0, 637, 638, 5, 101, 0, 0, 638, 78, 1, 0, 0, 0, 639, 640, 5, 105, 0, 0, 640, 641, 5, 109, 0, 0, 641, 642, 5, 112, 0, 0, 642, 643, 5, 108, 0, 0, 643, 644, 5, 101, 0, 0, 644, 645, 5, 109, 0, 0, 645, 646, 5, 101, 0, 0, 646, 647, 5, 110, 0, 0, 647, 648, 5, 116, 0, 0, 648, 649, 5, 115, 0, 0, 649, 80, 1, 0, 0, 0, 650, 651, 5, 114, 0, 0, 651, 652, 5, 101, 0, 0, 652, 653, 5, 102, 0, 0, 653, 82, 1, 0, 0, 0, 654, 655, 5, 102, 0, 0, 655, 656, 5, 114, 0, 0, 656, 657, 5, 97, 0, 0, 657, 658, 5, 103, 0, 0, 658, 659, 5, 109, 0, 0, 659, 660, 5, 101, 0, 0, 660, 661, 5, 110, 0, 0, 661, 662, 5, 116, 0, 0, 662, 84, 1, 0, 0, 0, 663, 664, 5, 105, 0, 0, 664, 665, 5, 109, 0, 0, 665, 666, 5, 112, 0, 0, 666, 667, 5, 111, 0, 0, 667, 668, 5, 114, 0, 0, 668, 669, 5, 116, 0, 0, 669, 86, 1, 0, 0, 0, 670, 671, 5, 101, 0, 0, 671, 672, 5, 120, 0, 0, 672, 673, 5, 116, 0, 0, 673, 674, 5, 101, 0, 0, 674, 675, 5, 114, 0, 0, 675, 676, 5, 110, 0, 0, 676, 677, 5, 97, 0, 0, 677, 678, 5, 108, 0, 0, 678, 88, 1, 0, 0, 0, 679, 680, 5, 97, 0, 0, 680, 681, 5, 116, 0, 0, 681, 682, 5, 111, 0, 0, 682, 683, 5, 109, 0, 0, 683, 90, 1, 0, 0, 0, 684, 685, 5, 105, 0, 0, 685, 686, 5, 110, 0, 0, 686, 687, 5, 116, 0, 0, 687, 688, 5, 101, 0, 0, 688, 689, 5, 114, 0, 0, 689, 690, 5, 102, 0, 0, 690, 691, 5, 97, 0, 0, 691, 692, 5, 99, 0, 0, 692, 693, 5, 101, 0, 0, 693, 92, 1, 0, 0, 0, 694, 695, 5, 105, 0, 0, 695, 696, 5, 110, 0, 0, 696, 697, 5, 116, 0, 0, 697, 698, 5, 101, 0, 0, 698, 699, 5, 114, 0, 0, 699, 700, 5, 102, 0, 0, 700, 701, 5, 97, 0, 0, 701, 702, 5, 99, 0, 0, 702, 703, 5, 101, 0, 0, 703, 704, 5, 115, 0, 0, 704, 94, 1, 0, 0, 0, 705, 706, 5, 112, 0, 0, 706, 707, 5, 97, 0, 0, 707, 708, 5, 99, 0, 0, 708, 709, 5, 107, 0, 0, 709, 710, 5, 97, 0, 0, 710, 711, 5, 103, 0, 0, 711, 712, 5, 101, 0, 0, 712, 96, 1, 0, 0, 0, 713, 714, 5, 118, 0, 0, 714, 715, 5, 97, 0, 0, 715, 716, 5, 108, 0, 0, 716, 717, 5, 117, 0, 0, 717, 718, 5, 101, 0, 0, 718, 98, 1, 0, 0, 0, 719, 720, 5, 102, 0, 0, 720, 721, 5, 105, 0, 0, 721, 722, 5, 101, 0, 0, 722, 723, 5, 108, 0, 0, 723, 724, 5, 100, 0, 0, 724, 100, 1, 0, 0, 0, 725, 726, 5, 114, 0, 0, 726, 727, 5, 101, 0, 0, 727, 728, 5, 108, 0, 0, 728, 729, 5, 97, 0, 0, 729, 730, 5, 116, 0, 0, 730, 731, 5, 105, 0, 0, 731, 732, 5, 111, 0, 0, 732, 733, 5, 110, 0, 0, 733, 102, 1, 0, 0, 0, 734, 735, 5, 111, 0, 0, 735, 736, 5, 112, 0, 0, 736, 737, 5, 101, 0, 0, 737, 738, 5, 114, 0, 0, 738, 739, 5, 97, 0, 0, 739, 740, 5, 116, 0, 0, 740, 741, 5, 105, 0, 0, 741, 742, 5, 111, 0, 0, 742, 743, 5, 110, 0, 0, 743, 104, 1, 0, 0, 0, 744, 745, 5, 102, 0, 0, 745, 746, 5, 117, 0, 0, 746, 747, 5, 110, 0, 0, 747, 748, 5, 99, 0, 0, 748, 749, 5, 116, 0, 0, 749, 750, 5, 105, 0, 0, 750, 751, 5, 111, 0, 0, 751, 752, 5, 110, 0, 0, 752, 106, 1, 0, 0, 0, 753, 754, 5, 99, 0, 0, 754, 755, 5, 111, 0, 0, 755, 756, 5, 110, 0, 0, 756, 757, 5, 115, 0, 0, 757, 758, 5, 116, 0, 0, 758, 759, 5, 114, 0, 0, 759, 760, 5, 117, 0, 0, 760, 761, 5, 99, 0, 0, 761, 762, 5, 116, 0, 0, 762, 763, 5, 111, 0, 0, 763, 764, 5, 114, 0, 0, 764, 108, 1, 0, 0, 0, 765, 766, 5, 99, 0, 0, 766, 767, 5, 111, 0, 0, 767, 768, 5, 110, 0, 0, 768, 769, 5, 115, 0, 0, 769, 770, 5, 116, 0, 0, 770, 771, 5, 114, 0, 0, 771, 772, 5, 117, 0, 0, 772, 773, 5, 99, 0, 0, 773, 774, 5, 116, 0, 0, 774, 775, 5, 115, 0, 0, 775, 110, 1, 0, 0, 0, 776, 777, 5, 105, 0, 0, 777, 778, 5, 110, 0, 0, 778, 779, 5, 112, 0, 0, 779, 780, 5, 117, 0, 0, 780, 781, 5, 116, 0, 0, 781, 112, 1, 0, 0, 0, 782, 783, 5, 99, 0, 0, 783, 784, 5, 111, 0, 0, 784, 785, 5, 110, 0, 0, 785, 786, 5, 102, 0, 0, 786, 787, 5, 111, 0, 0, 787, 788, 5, 114, 0, 0, 788, 789, 5, 109, 0, 0, 789, 114, 1, 0, 0, 0, 790, 791, 5, 97, 0, 0, 791, 792, 5, 115, 0, 0, 792, 116, 1, 0, 0, 0, 793, 794, 5, 98, 0, 0, 794, 795, 5, 105, 0, 0, 795, 796, 5, 110, 0, 0, 796, 797, 5, 100, 0, 0, 797, 118, 1, 0, 0, 0, 798, 799, 5, 115, 0, 0, 799, 800, 5, 116, 0, 0, 800, 801, 5, 97, 0, 0, 801, 802, 5, 116, 0, 0, 802, 803, 5, 105, 0, 0, 803, 804, 5, 99, 0, 0, 804, 120, 1, 0, 0, 0, 805, 806, 5, 116, 0, 0, 806, 807, 5, 111, 0, 0, 807, 122, 1, 0, 0, 0, 808, 809, 5, 112, 0, 0, 809, 810, 5, 114, 0, 0, 810, 811, 5, 105, 0, 0, 811, 812, 5, 118, 0, 0, 812, 813, 5, 97, 0, 0, 813, 814, 5, 116, 0, 0, 814, 815, 5, 101, 0, 0, 815, 124, 1, 0, 0, 0, 816, 817, 5, 115, 0, 0, 817, 818, 5, 104, 0, 0, 818, 819, 5, 97, 0, 0, 819, 820, 5, 114, 0, 0, 820, 821, 5, 101, 0, 0, 821, 822, 5, 100, 0, 0, 822, 126, 1, 0, 0, 0, 823, 824, 5, 115, 0, 0, 824, 825, 5, 116, 0, 0, 825, 826, 5, 97, 0, 0, 826, 827, 5, 116, 0, 0, 827, 828, 5, 101, 0, 0, 828, 128, 1, 0, 0, 0, 829, 830, 5, 101, 0, 0, 830, 831, 5, 100, 0, 0, 831, 832, 5, 103, 0, 0, 832, 833, 5, 101, 0, 0, 833, 130, 1, 0, 0, 0, 834, 835, 5, 112, 0, 0, 835, 836, 5, 114, 0, 0, 836, 837, 5, 111, 0, 0, 837, 838, 5, 106, 0, 0, 838, 839, 5, 101, 0, 0, 839, 840, 5, 99, 0, 0, 840, 841, 5, 116, 0, 0, 841, 842, 5, 105, 0, 0, 842, 843, 5, 111, 0, 0, 843, 844, 5, 110, 0, 0, 844, 132, 1, 0, 0, 0, 845, 846, 5, 119, 0, 0, 846, 847, 5, 105, 0, 0, 847, 848, 5, 116, 0, 0, 848, 849, 5, 104, 0, 0, 849, 134, 1, 0, 0, 0, 850, 851, 5, 117, 0, 0, 851, 852, 5, 115, 0, 0, 852, 853, 5, 105, 0, 0, 853, 854, 5, 110, 0, 0, 854, 855, 5, 103, 0, 0, 855, 136, 1, 0, 0, 0, 856, 857, 5, 97, 0, 0, 857, 858, 5, 99, 0, 0, 858, 859, 5, 99, 0, 0, 859, 860, 5, 101, 0, 0, 860, 861, 5, 112, 0, 0, 861, 862, 5, 116, 0, 0, 862, 138, 1, 0, 0, 0, 863, 864, 5, 118, 0, 0, 864, 865, 5, 105, 0, 0, 865, 866, 5, 97, 0, 0, 866, 140, 1, 0, 0, 0, 867, 868, 5, 109, 0, 0, 868, 869, 5, 97, 0, 0, 869, 870, 5, 116, 0, 0, 870, 871, 5, 101, 0, 0, 871, 872, 5, 114, 0, 0, 872, 873, 5, 105, 0, 0, 873, 874, 5, 97, 0, 0, 874, 875, 5, 108, 0, 0, 875, 876, 5, 105, 0, 0, 876, 877, 5, 122, 0, 0, 877, 878, 5, 101, 0, 0, 878, 142, 1, 0, 0, 0, 879, 880, 5, 105, 0, 0, 880, 881, 5, 102, 0, 0, 881, 144, 1, 0, 0, 0, 882, 883, 5, 97, 0, 0, 883, 884, 5, 98, 0, 0, 884, 885, 5, 115, 0, 0, 885, 886, 5, 101, 0, 0, 886, 887, 5, 110, 0, 0, 887, 888, 5, 116, 0, 0, 888, 146, 1, 0, 0, 0, 889, 890, 5, 111, 0, 0, 890, 891, 5, 110, 0, 0, 891, 148, 1, 0, 0, 0, 892, 893, 5, 112, 0, 0, 893, 894, 5, 111, 0, 0, 894, 895, 5, 108, 0, 0, 895, 896, 5, 105, 0, 0, 896, 897, 5, 99, 0, 0, 897, 898, 5, 121, 0, 0, 898, 150, 1, 0, 0, 0, 899, 900, 5, 100, 0, 0, 900, 901, 5, 101, 0, 0, 901, 902, 5, 102, 0, 0, 902, 903, 5, 97, 0, 0, 903, 904, 5, 117, 0, 0, 904, 905, 5, 108, 0, 0, 905, 906, 5, 116, 0, 0, 906, 152, 1, 0, 0, 0, 907, 908, 5, 115, 0, 0, 908, 909, 5, 111, 0, 0, 909, 910, 5, 117, 0, 0, 910, 911, 5, 114, 0, 0, 911, 912, 5, 99, 0, 0, 912, 913, 5, 101, 0, 0, 913, 154, 1, 0, 0, 0, 914, 915, 5, 114, 0, 0, 915, 916, 5, 101, 0, 0, 916, 917, 5, 112, 0, 0, 917, 918, 5, 111, 0, 0, 918, 919, 5, 115, 0, 0, 919, 920, 5, 105, 0, 0, 920, 921, 5, 116, 0, 0, 921, 922, 5, 111, 0, 0, 922, 923, 5, 114, 0, 0, 923, 924, 5, 121, 0, 0, 924, 156, 1, 0, 0, 0, 925, 926, 5, 99, 0, 0, 926, 927, 5, 111, 0, 0, 927, 928, 5, 109, 0, 0, 928, 929, 5, 109, 0, 0, 929, 930, 5, 105, 0, 0, 930, 931, 5, 116, 0, 0, 931, 158, 1, 0, 0, 0, 932, 933, 5, 114, 0, 0, 933, 934, 5, 101, 0, 0, 934, 935, 5, 118, 0, 0, 935, 936, 5, 105, 0, 0, 936, 937, 5, 115, 0, 0, 937, 938, 5, 105, 0, 0, 938, 939, 5, 111, 0, 0, 939, 940, 5, 110, 0, 0, 940, 160, 1, 0, 0, 0, 941, 942, 5, 115, 0, 0, 942, 943, 5, 101, 0, 0, 943, 944, 5, 109, 0, 0, 944, 945, 5, 97, 0, 0, 945, 946, 5, 110, 0, 0, 946, 947, 5, 116, 0, 0, 947, 948, 5, 105, 0, 0, 948, 949, 5, 99, 0, 0, 949, 950, 5, 45, 0, 0, 950, 951, 5, 109, 0, 0, 951, 952, 5, 97, 0, 0, 952, 953, 5, 106, 0, 0, 953, 954, 5, 111, 0, 0, 954, 955, 5, 114, 0, 0, 955, 162, 1, 0, 0, 0, 956, 957, 5, 111, 0, 0, 957, 958, 5, 110, 0, 0, 958, 959, 5, 45, 0, 0, 959, 960, 5, 100, 0, 0, 960, 961, 5, 101, 0, 0, 961, 962, 5, 108, 0, 0, 962, 963, 5, 101, 0, 0, 963, 964, 5, 116, 0, 0, 964, 965, 5, 101, 0, 0, 965, 164, 1, 0, 0, 0, 966, 967, 5, 108, 0, 0, 967, 968, 5, 105, 0, 0, 968, 969, 5, 102, 0, 0, 969, 970, 5, 101, 0, 0, 970, 971, 5, 99, 0, 0, 971, 972, 5, 121, 0, 0, 972, 973, 5, 99, 0, 0, 973, 974, 5, 108, 0, 0, 974, 975, 5, 101, 0, 0, 975, 166, 1, 0, 0, 0, 976, 977, 5, 114, 0, 0, 977, 978, 5, 101, 0, 0, 978, 979, 5, 116, 0, 0, 979, 980, 5, 97, 0, 0, 980, 981, 5, 105, 0, 0, 981, 982, 5, 110, 0, 0, 982, 983, 5, 45, 0, 0, 983, 984, 5, 111, 0, 0, 984, 985, 5, 116, 0, 0, 985, 986, 5, 104, 0, 0, 986, 987, 5, 101, 0, 0, 987, 988, 5, 114, 0, 0, 988, 168, 1, 0, 0, 0, 989, 990, 5, 107, 0, 0, 990, 991, 5, 101, 0, 0, 991, 992, 5, 121, 0, 0, 992, 993, 5, 101, 0, 0, 993, 994, 5, 100, 0, 0, 994, 170, 1, 0, 0, 0, 995, 996, 5, 112, 0, 0, 996, 997, 5, 117, 0, 0, 997, 998, 5, 98, 0, 0, 998, 999, 5, 108, 0, 0, 999, 1000, 5, 105, 0, 0, 1000, 1001, 5, 99, 0, 0, 1001, 1002, 5, 45, 0, 0, 1002, 1003, 5, 116, 0, 0, 1003, 1004, 5, 114, 0, 0, 1004, 1005, 5, 97, 0, 0, 1005, 1006, 5, 118, 0, 0, 1006, 1007, 5, 101, 0, 0, 1007, 1008, 5, 114, 0, 0, 1008, 1009, 5, 115, 0, 0, 1009, 1010, 5, 97, 0, 0, 1010, 1011, 5, 108, 0, 0, 1011, 172, 1, 0, 0, 0, 1012, 1013, 5, 105, 0, 0, 1013, 1014, 5, 100, 0, 0, 1014, 174, 1, 0, 0, 0, 1015, 1016, 5, 100, 0, 0, 1016, 1017, 5, 111, 0, 0, 1017, 1018, 5, 99, 0, 0, 1018, 176, 1, 0, 0, 0, 1019, 1020, 5, 109, 0, 0, 1020, 1021, 5, 111, 0, 0, 1021, 1022, 5, 100, 0, 0, 1022, 1023, 5, 101, 0, 0, 1023, 178, 1, 0, 0, 0, 1024, 1025, 5, 101, 0, 0, 1025, 1026, 5, 109, 0, 0, 1026, 1027, 5, 105, 0, 0, 1027, 1028, 5, 116, 0, 0, 1028, 1029, 5, 115, 0, 0, 1029, 180, 1, 0, 0, 0, 1030, 1031, 5, 114, 0, 0, 1031, 1032, 5, 101, 0, 0, 1032, 1033, 5, 99, 0, 0, 1033, 1034, 5, 101, 0, 0, 1034, 1035, 5, 105, 0, 0, 1035, 1036, 5, 118, 0, 0, 1036, 1037, 5, 101, 0, 0, 1037, 1038, 5, 114, 0, 0, 1038, 182, 1, 0, 0, 0, 1039, 1040, 5, 114, 0, 0, 1040, 1041, 5, 101, 0, 0, 1041, 1042, 5, 113, 0, 0, 1042, 1043, 5, 117, 0, 0, 1043, 1044, 5, 105, 0, 0, 1044, 1045, 5, 114, 0, 0, 1045, 1046, 5, 101, 0, 0, 1046, 1047, 5, 115, 0, 0, 1047, 184, 1, 0, 0, 0, 1048, 1049, 5, 97, 0, 0, 1049, 1050, 5, 110, 0, 0, 1050, 1051, 5, 121, 0, 0, 1051, 186, 1, 0, 0, 0, 1052, 1053, 5, 103, 0, 0, 1053, 1054, 5, 101, 0, 0, 1054, 1055, 5, 116, 0, 0, 1055, 188, 1, 0, 0, 0, 1056, 1057, 5, 115, 0, 0, 1057, 1058, 5, 101, 0, 0, 1058, 1059, 5, 116, 0, 0, 1059, 190, 1, 0, 0, 0, 1060, 1061, 5, 119, 0, 0, 1061, 1062, 5, 97, 0, 0, 1062, 1063, 5, 116, 0, 0, 1063, 1064, 5, 99, 0, 0, 1064, 1065, 5, 104, 0, 0, 1065, 192, 1, 0, 0, 0, 1066, 1067, 5, 115, 0, 0, 1067, 1068, 5, 116, 0, 0, 1068, 1069, 5, 97, 0, 0, 1069, 1070, 5, 114, 0, 0, 1070, 1071, 5, 116, 0, 0, 1071, 194, 1, 0, 0, 0, 1072, 1073, 5, 115, 0, 0, 1073, 1074, 5, 116, 0, 0, 1074, 1075, 5, 111, 0, 0, 1075, 1076, 5, 112, 0, 0, 1076, 196, 1, 0, 0, 0, 1077, 1078, 5, 114, 0, 0, 1078, 1079, 5, 101, 0, 0, 1079, 1080, 5, 97, 0, 0, 1080, 1081, 5, 100, 0, 0, 1081, 198, 1, 0, 0, 0, 1082, 1083, 5, 119, 0, 0, 1083, 1084, 5, 114, 0, 0, 1084, 1085, 5, 105, 0, 0, 1085, 1086, 5, 116, 0, 0, 1086, 1087, 5, 101, 0, 0, 1087, 200, 1, 0, 0, 0, 1088, 1089, 5, 114, 0, 0, 1089, 1090, 5, 101, 0, 0, 1090, 1091, 5, 115, 0, 0, 1091, 1092, 5, 111, 0, 0, 1092, 1093, 5, 108, 0, 0, 1093, 1094, 5, 118, 0, 0, 1094, 1095, 5, 101, 0, 0, 1095, 202, 1, 0, 0, 0, 1096, 1097, 5, 99, 0, 0, 1097, 1098, 5, 111, 0, 0, 1098, 1099, 5, 110, 0, 0, 1099, 1100, 5, 110, 0, 0, 1100, 1101, 5, 101, 0, 0, 1101, 1102, 5, 99, 0, 0, 1102, 1103, 5, 116, 0, 0, 1103, 204, 1, 0, 0, 0, 1104, 1105, 5, 100, 0, 0, 1105, 1106, 5, 105, 0, 0, 1106, 1107, 5, 115, 0, 0, 1107, 1108, 5, 99, 0, 0, 1108, 1109, 5, 111, 0, 0, 1109, 1110, 5, 110, 0, 0, 1110, 1111, 5, 110, 0, 0, 1111, 1112, 5, 101, 0, 0, 1112, 1113, 5, 99, 0, 0, 1113, 1114, 5, 116, 0, 0, 1114, 206, 1, 0, 0, 0, 1115, 1116, 5, 99, 0, 0, 1116, 1117, 5, 97, 0, 0, 1117, 1118, 5, 108, 0, 0, 1118, 1119, 5, 108, 0, 0, 1119, 208, 1, 0, 0, 0, 1120, 1121, 5, 119, 0, 0, 1121, 1122, 5, 97, 0, 0, 1122, 1123, 5, 116, 0, 0, 1123, 1124, 5, 99, 0, 0, 1124, 1125, 5, 104, 0, 0, 1125, 1126, 5, 45, 0, 0, 1126, 1127, 5, 115, 0, 0, 1127, 1128, 5, 116, 0, 0, 1128, 1129, 5, 97, 0, 0, 1129, 1130, 5, 114, 0, 0, 1130, 1131, 5, 116, 0, 0, 1131, 210, 1, 0, 0, 0, 1132, 1133, 5, 119, 0, 0, 1133, 1134, 5, 97, 0, 0, 1134, 1135, 5, 116, 0, 0, 1135, 1136, 5, 99, 0, 0, 1136, 1137, 5, 104, 0, 0, 1137, 1138, 5, 45, 0, 0, 1138, 1139, 5, 115, 0, 0, 1139, 1140, 5, 116, 0, 0, 1140, 1141, 5, 111, 0, 0, 1141, 1142, 5, 112, 0, 0, 1142, 212, 1, 0, 0, 0, 1143, 1144, 5, 115, 0, 0, 1144, 1145, 5, 117, 0, 0, 1145, 1146, 5, 98, 0, 0, 1146, 1147, 5, 115, 0, 0, 1147, 1148, 5, 99, 0, 0, 1148, 1149, 5, 114, 0, 0, 1149, 1150, 5, 105, 0, 0, 1150, 1151, 5, 98, 0, 0, 1151, 1152, 5, 101, 0, 0, 1152, 214, 1, 0, 0, 0, 1153, 1154, 5, 117, 0, 0, 1154, 1155, 5, 110, 0, 0, 1155, 1156, 5, 115, 0, 0, 1156, 1157, 5, 117, 0, 0, 1157, 1158, 5, 98, 0, 0, 1158, 1159, 5, 115, 0, 0, 1159, 1160, 5, 99, 0, 0, 1160, 1161, 5, 114, 0, 0, 1161, 1162, 5, 105, 0, 0, 1162, 1163, 5, 98, 0, 0, 1163, 1164, 5, 101, 0, 0, 1164, 216, 1, 0, 0, 0, 1165, 1166, 5, 114, 0, 0, 1166, 1167, 5, 101, 0, 0, 1167, 1168, 5, 103, 0, 0, 1168, 1169, 5, 105, 0, 0, 1169, 1170, 5, 115, 0, 0, 1170, 1171, 5, 116, 0, 0, 1171, 1172, 5, 101, 0, 0, 1172, 1173, 5, 114, 0, 0, 1173, 218, 1, 0, 0, 0, 1174, 1175, 5, 99, 0, 0, 1175, 1176, 5, 114, 0, 0, 1176, 1177, 5, 100, 0, 0, 1177, 1178, 5, 116, 0, 0, 1178, 220, 1, 0, 0, 0, 1179, 1180, 5, 111, 0, 0, 1180, 1181, 5, 112, 0, 0, 1181, 1182, 5, 116, 0, 0, 1182, 1183, 5, 105, 0, 0, 1183, 1184, 5, 111, 0, 0, 1184, 1185, 5, 110, 0, 0, 1185, 1186, 5, 97, 0, 0, 1186, 1187, 5, 108, 0, 0, 1187, 1188, 5, 45, 0, 0, 1188, 1189, 5, 111, 0, 0, 1189, 1190, 5, 110, 0, 0, 1190, 1191, 5, 101, 0, 0, 1191, 222, 1, 0, 0, 0, 1192, 1193, 5, 101, 0, 0, 1193, 1194, 5, 120, 0, 0, 1194, 1195, 5, 97, 0, 0, 1195, 1196, 5, 99, 0, 0, 1196, 1197, 5, 116, 0, 0, 1197, 1198, 5, 108, 0, 0, 1198, 1199, 5, 121, 0, 0, 1199, 1200, 5, 45, 0, 0, 1200, 1201, 5, 111, 0, 0, 1201, 1202, 5, 110, 0, 0, 1202, 1203, 5, 101, 0, 0, 1203, 224, 1, 0, 0, 0, 1204, 1205, 5, 109, 0, 0, 1205, 1206, 5, 97, 0, 0, 1206, 1207, 5, 110, 0, 0, 1207, 1208, 5, 121, 0, 0, 1208, 1209, 5, 45, 0, 0, 1209, 1210, 5, 117, 0, 0, 1210, 1211, 5, 110, 0, 0, 1211, 1212, 5, 105, 0, 0, 1212, 1213, 5, 113, 0, 0, 1213, 1214, 5, 117, 0, 0, 1214, 1215, 5, 101, 0, 0, 1215, 226, 1, 0, 0, 0, 1216, 1217, 5, 109, 0, 0, 1217, 1218, 5, 97, 0, 0, 1218, 1219, 5, 110, 0, 0, 1219, 1220, 5, 121, 0, 0, 1220, 228, 1, 0, 0, 0, 1221, 1222, 5, 111, 0, 0, 1222, 1223, 5, 114, 0, 0, 1223, 1224, 5, 100, 0, 0, 1224, 1225, 5, 101, 0, 0, 1225, 1226, 5, 114, 0, 0, 1226, 1227, 5, 101, 0, 0, 1227, 1228, 5, 100, 0, 0, 1228, 230, 1, 0, 0, 0, 1229, 1230, 5, 117, 0, 0, 1230, 1231, 5, 110, 0, 0, 1231, 1232, 5, 105, 0, 0, 1232, 1233, 5, 116, 0, 0, 1233, 232, 1, 0, 0, 0, 1234, 1235, 5, 119, 0, 0, 1235, 1236, 5, 97, 0, 0, 1236, 1237, 5, 116, 0, 0, 1237, 1238, 5, 99, 0, 0, 1238, 1239, 5, 104, 0, 0, 1239, 1240, 5, 45, 0, 0, 1240, 1241, 5, 104, 0, 0, 1241, 1242, 5, 97, 0, 0, 1242, 1243, 5, 110, 0, 0, 1243, 1244, 5, 100, 0, 0, 1244, 1245, 5, 108, 0, 0, 1245, 1246, 5, 101, 0, 0, 1246, 234, 1, 0, 0, 0, 1247, 1248, 5, 109, 0, 0, 1248, 1249, 5, 101, 0, 0, 1249, 1250, 5, 115, 0, 0, 1250, 1251, 5, 115, 0, 0, 1251, 1252, 5, 97, 0, 0, 1252, 1253, 5, 103, 0, 0, 1253, 1254, 5, 101, 0, 0, 1254, 236, 1, 0, 0, 0, 1255, 1256, 5, 97, 0, 0, 1256, 1257, 5, 116, 0, 0, 1257, 1258, 5, 111, 0, 0, 1258, 1259, 5, 109, 0, 0, 1259, 1260, 5, 45, 0, 0, 1260, 1261, 5, 114, 0, 0, 1261, 1262, 5, 101, 0, 0, 1262, 1263, 5, 102, 0, 0, 1263, 238, 1, 0, 0, 0, 1264, 1265, 5, 105, 0, 0, 1265, 1266, 5, 110, 0, 0, 1266, 1267, 5, 116, 0, 0, 1267, 1268, 5, 101, 0, 0, 1268, 1269, 5, 114, 0, 0, 1269, 1270, 5, 102, 0, 0, 1270, 1271, 5, 97, 0, 0, 1271, 1272, 5, 99, 0, 0, 1272, 1273, 5, 101, 0, 0, 1273, 1274, 5, 45, 0, 0, 1274, 1275, 5, 114, 0, 0, 1275, 1276, 5, 101, 0, 0, 1276, 1277, 5, 102, 0, 0, 1277, 240, 1, 0, 0, 0, 1278, 1279, 5, 111, 0, 0, 1279, 1280, 5, 112, 0, 0, 1280, 1281, 5, 116, 0, 0, 1281, 1282, 5, 105, 0, 0, 1282, 1283, 5, 111, 0, 0, 1283, 1284, 5, 110, 0, 0, 1284, 1285, 5, 97, 0, 0, 1285, 1286, 5, 108, 0, 0, 1286, 242, 1, 0, 0, 0, 1287, 1288, 5, 108, 0, 0, 1288, 1289, 5, 105, 0, 0, 1289, 1290, 5, 115, 0, 0, 1290, 1291, 5, 116, 0, 0, 1291, 244, 1, 0, 0, 0, 1292, 1293, 5, 114, 0, 0, 1293, 1294, 5, 101, 0, 0, 1294, 1295, 5, 99, 0, 0, 1295, 1296, 5, 111, 0, 0, 1296, 1297, 5, 114, 0, 0, 1297, 1298, 5, 100, 0, 0, 1298, 246, 1, 0, 0, 0, 1299, 1300, 5, 98, 0, 0, 1300, 1301, 5, 111, 0, 0, 1301, 1302, 5, 111, 0, 0, 1302, 1303, 5, 108, 0, 0, 1303, 248, 1, 0, 0, 0, 1304, 1305, 5, 98, 0, 0, 1305, 1306, 5, 121, 0, 0, 1306, 1307, 5, 116, 0, 0, 1307, 1308, 5, 101, 0, 0, 1308, 1309, 5, 115, 0, 0, 1309, 250, 1, 0, 0, 0, 1310, 1311, 5, 100, 0, 0, 1311, 1312, 5, 111, 0, 0, 1312, 1313, 5, 117, 0, 0, 1313, 1314, 5, 98, 0, 0, 1314, 1315, 5, 108, 0, 0, 1315, 1316, 5, 101, 0, 0, 1316, 252, 1, 0, 0, 0, 1317, 1318, 5, 105, 0, 0, 1318, 1319, 5, 110, 0, 0, 1319, 1320, 5, 116, 0, 0, 1320, 1321, 5, 51, 0, 0, 1321, 1322, 5, 50, 0, 0, 1322, 254, 1, 0, 0, 0, 1323, 1324, 5, 105, 0, 0, 1324, 1325, 5, 110, 0, 0, 1325, 1326, 5, 116, 0, 0, 1326, 1327, 5, 54, 0, 0, 1327, 1328, 5, 52, 0, 0, 1328, 256, 1, 0, 0, 0, 1329, 1330, 5, 115, 0, 0, 1330, 1331, 5, 116, 0, 0, 1331, 1332, 5, 114, 0, 0, 1332, 1333, 5, 105, 0, 0, 1333, 1334, 5, 110, 0, 0, 1334, 1335, 5, 103, 0, 0, 1335, 258, 1, 0, 0, 0, 1336, 1337, 5, 117, 0, 0, 1337, 1338, 5, 105, 0, 0, 1338, 1339, 5, 110, 0, 0, 1339, 1340, 5, 116, 0, 0, 1340, 1341, 5, 51, 0, 0, 1341, 1342, 5, 50, 0, 0, 1342, 260, 1, 0, 0, 0, 1343, 1344, 5, 117, 0, 0, 1344, 1345, 5, 105, 0, 0, 1345, 1346, 5, 110, 0, 0, 1346, 1347, 5, 116, 0, 0, 1347, 1348, 5, 54, 0, 0, 1348, 1349, 5, 52, 0, 0, 1349, 262, 1, 0, 0, 0, 1350, 1351, 5, 116, 0, 0, 1351, 1352, 5, 114, 0, 0, 1352, 1353, 5, 117, 0, 0, 1353, 1354, 5, 101, 0, 0, 1354, 264, 1, 0, 0, 0, 1355, 1356, 5, 102, 0, 0, 1356, 1357, 5, 97, 0, 0, 1357, 1358, 5, 108, 0, 0, 1358, 1359, 5, 115, 0, 0, 1359, 1360, 5, 101, 0, 0, 1360, 266, 1, 0, 0, 0, 1361, 1362, 5, 110, 0, 0, 1362, 1363, 5, 117, 0, 0, 1363, 1364, 5, 108, 0, 0, 1364, 1365, 5, 108, 0, 0, 1365, 268, 1, 0, 0, 0, 1366, 1367, 5, 45, 0, 0, 1367, 1368, 5, 62, 0, 0, 1368, 270, 1, 0, 0, 0, 1369, 1370, 5, 58, 0, 0, 1370, 272, 1, 0, 0, 0, 1371, 1372, 5, 59, 0, 0, 1372, 274, 1, 0, 0, 0, 1373, 1374, 5, 44, 0, 0, 1374, 276, 1, 0, 0, 0, 1375, 1376, 5, 46, 0, 0, 1376, 278, 1, 0, 0, 0, 1377, 1378, 5, 123, 0, 0, 1378, 280, 1, 0, 0, 0, 1379, 1380, 5, 125, 0, 0, 1380, 282, 1, 0, 0, 0, 1381, 1382, 5, 91, 0, 0, 1382, 284, 1, 0, 0, 0, 1383, 1384, 5, 93, 0, 0, 1384, 286, 1, 0, 0, 0, 1385, 1386, 5, 40, 0, 0, 1386, 288, 1, 0, 0, 0, 1387, 1388, 5, 41, 0, 0, 1388, 290, 1, 0, 0, 0, 1389, 1390, 5, 60, 0, 0, 1390, 292, 1, 0, 0, 0, 1391, 1392, 5, 62, 0, 0, 1392, 294, 1, 0, 0, 0, 1393, 1394, 5, 38, 0, 0, 1394, 296, 1, 0, 0, 0, 1395, 1396, 5, 61, 0, 0, 1396, 298, 1, 0, 0, 0, 1397, 1399, 5, 45, 0, 0, 1398, 1397, 1, 0, 0, 0, 1398, 1399, 1, 0, 0, 0, 1399, 1401, 1, 0, 0, 0, 1400, 1402, 7, 0, 0, 0, 1401, 1400, 1, 0, 0, 0, 1402, 1403, 1, 0, 0, 0, 1403, 1401, 1, 0, 0, 0, 1403, 1404, 1, 0, 0, 0, 1404, 300, 1, 0, 0, 0, 1405, 1407, 5, 45, 0, 0, 1406, 1405, 1, 0, 0, 0, 1406, 1407, 1, 0, 0, 0, 1407, 1416, 1, 0, 0, 0, 1408, 1417, 5, 48, 0, 0, 1409, 1413, 7, 1, 0, 0, 1410, 1412, 7, 0, 0, 0, 1411, 1410, 1, 0, 0, 0, 1412, 1415, 1, 0, 0, 0, 1413, 1411, 1, 0, 0, 0, 1413, 1414, 1, 0, 0, 0, 1414, 1417, 1, 0, 0, 0, 1415, 1413, 1, 0, 0, 0, 1416, 1408, 1, 0, 0, 0, 1416, 1409, 1, 0, 0, 0, 1417, 1424, 1, 0, 0, 0, 1418, 1420, 5, 46, 0, 0, 1419, 1421, 7, 0, 0, 0, 1420, 1419, 1, 0, 0, 0, 1421, 1422, 1, 0, 0, 0, 1422, 1420, 1, 0, 0, 0, 1422, 1423, 1, 0, 0, 0, 1423, 1425, 1, 0, 0, 0, 1424, 1418, 1, 0, 0, 0, 1424, 1425, 1, 0, 0, 0, 1425, 1435, 1, 0, 0, 0, 1426, 1428, 7, 2, 0, 0, 1427, 1429, 7, 3, 0, 0, 1428, 1427, 1, 0, 0, 0, 1428, 1429, 1, 0, 0, 0, 1429, 1431, 1, 0, 0, 0, 1430, 1432, 7, 0, 0, 0, 1431, 1430, 1, 0, 0, 0, 1432, 1433, 1, 0, 0, 0, 1433, 1431, 1, 0, 0, 0, 1433, 1434, 1, 0, 0, 0, 1434, 1436, 1, 0, 0, 0, 1435, 1426, 1, 0, 0, 0, 1435, 1436, 1, 0, 0, 0, 1436, 302, 1, 0, 0, 0, 1437, 1441, 7, 4, 0, 0, 1438, 1440, 7, 5, 0, 0, 1439, 1438, 1, 0, 0, 0, 1440, 1443, 1, 0, 0, 0, 1441, 1439, 1, 0, 0, 0, 1441, 1442, 1, 0, 0, 0, 1442, 304, 1, 0, 0, 0, 1443, 1441, 1, 0, 0, 0, 1444, 1449, 5, 34, 0, 0, 1445, 1448, 3, 307, 153, 0, 1446, 1448, 8, 6, 0, 0, 1447, 1445, 1, 0, 0, 0, 1447, 1446, 1, 0, 0, 0, 1448, 1451, 1, 0, 0, 0, 1449, 1447, 1, 0, 0, 0, 1449, 1450, 1, 0, 0, 0, 1450, 1452, 1, 0, 0, 0, 1451, 1449, 1, 0, 0, 0, 1452, 1453, 5, 34, 0, 0, 1453, 306, 1, 0, 0, 0, 1454, 1462, 5, 92, 0, 0, 1455, 1463, 7, 7, 0, 0, 1456, 1457, 5, 117, 0, 0, 1457, 1458, 3, 309, 154, 0, 1458, 1459, 3, 309, 154, 0, 1459, 1460, 3, 309, 154, 0, 1460, 1461, 3, 309, 154, 0, 1461, 1463, 1, 0, 0, 0, 1462, 1455, 1, 0, 0, 0, 1462, 1456, 1, 0, 0, 0, 1463, 308, 1, 0, 0, 0, 1464, 1465, 7, 8, 0, 0, 1465, 310, 1, 0, 0, 0, 1466, 1467, 5, 47, 0, 0, 1467, 1468, 5, 47, 0, 0, 1468, 1472, 1, 0, 0, 0, 1469, 1471, 8, 9, 0, 0, 1470, 1469, 1, 0, 0, 0, 1471, 1474, 1, 0, 0, 0, 1472, 1470, 1, 0, 0, 0, 1472, 1473, 1, 0, 0, 0, 1473, 1475, 1, 0, 0, 0, 1474, 1472, 1, 0, 0, 0, 1475, 1476, 6, 155, 0, 0, 1476, 312, 1, 0, 0, 0, 1477, 1478, 5, 47, 0, 0, 1478, 1479, 5, 42, 0, 0, 1479, 1483, 1, 0, 0, 0, 1480, 1482, 9, 0, 0, 0, 1481, 1480, 1, 0, 0, 0, 1482, 1485, 1, 0, 0, 0, 1483, 1484, 1, 0, 0, 0, 1483, 1481, 1, 0, 0, 0, 1484, 1486, 1, 0, 0, 0, 1485, 1483, 1, 0, 0, 0, 1486, 1487, 5, 42, 0, 0, 1487, 1488, 5, 47, 0, 0, 1488, 1489, 1, 0, 0, 0, 1489, 1490, 6, 156, 0, 0, 1490, 314, 1, 0, 0, 0, 1491, 1493, 7, 10, 0, 0, 1492, 1491, 1, 0, 0, 0, 1493, 1494, 1, 0, 0, 0, 1494, 1492, 1, 0, 0, 0, 1494, 1495, 1, 0, 0, 0, 1495, 1496, 1, 0, 0, 0, 1496, 1497, 6, 157, 0, 0, 1497, 316, 1, 0, 0, 0, 18, 0, 1398, 1403, 1406, 1413, 1416, 1422, 1424, 1428, 1433, 1435, 1441, 1447, 1449, 1462, 1472, 1483, 1494, 1, 0, 1, 0] \ No newline at end of file +[4, 0, 158, 1523, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 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, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 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, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 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, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 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, 27, 1, 28, 1, 28, 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, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 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, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 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, 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, 45, 1, 46, 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, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 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, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 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, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 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, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 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, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 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, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 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, 70, 1, 70, 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, 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, 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, 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, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 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, 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, 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, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 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, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 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, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 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, 102, 1, 102, 1, 103, 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, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 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, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 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, 144, 1, 144, 1, 145, 1, 145, 1, 146, 1, 146, 1, 147, 1, 147, 1, 148, 1, 148, 1, 149, 1, 149, 1, 150, 1, 150, 1, 151, 3, 151, 1424, 8, 151, 1, 151, 4, 151, 1427, 8, 151, 11, 151, 12, 151, 1428, 1, 152, 3, 152, 1432, 8, 152, 1, 152, 1, 152, 1, 152, 5, 152, 1437, 8, 152, 10, 152, 12, 152, 1440, 9, 152, 3, 152, 1442, 8, 152, 1, 152, 1, 152, 4, 152, 1446, 8, 152, 11, 152, 12, 152, 1447, 3, 152, 1450, 8, 152, 1, 152, 1, 152, 3, 152, 1454, 8, 152, 1, 152, 4, 152, 1457, 8, 152, 11, 152, 12, 152, 1458, 3, 152, 1461, 8, 152, 1, 153, 1, 153, 5, 153, 1465, 8, 153, 10, 153, 12, 153, 1468, 9, 153, 1, 154, 1, 154, 1, 154, 5, 154, 1473, 8, 154, 10, 154, 12, 154, 1476, 9, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 3, 155, 1488, 8, 155, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 5, 157, 1496, 8, 157, 10, 157, 12, 157, 1499, 9, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 5, 158, 1507, 8, 158, 10, 158, 12, 158, 1510, 9, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 4, 159, 1518, 8, 159, 11, 159, 12, 159, 1519, 1, 159, 1, 159, 1, 1508, 0, 160, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 143, 287, 144, 289, 145, 291, 146, 293, 147, 295, 148, 297, 149, 299, 150, 301, 151, 303, 152, 305, 153, 307, 154, 309, 155, 311, 0, 313, 0, 315, 156, 317, 157, 319, 158, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1537, 0, 1, 1, 0, 0, 0, 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, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 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, 315, 1, 0, 0, 0, 0, 317, 1, 0, 0, 0, 0, 319, 1, 0, 0, 0, 1, 321, 1, 0, 0, 0, 3, 326, 1, 0, 0, 0, 5, 333, 1, 0, 0, 0, 7, 342, 1, 0, 0, 0, 9, 355, 1, 0, 0, 0, 11, 363, 1, 0, 0, 0, 13, 367, 1, 0, 0, 0, 15, 376, 1, 0, 0, 0, 17, 384, 1, 0, 0, 0, 19, 393, 1, 0, 0, 0, 21, 404, 1, 0, 0, 0, 23, 414, 1, 0, 0, 0, 25, 424, 1, 0, 0, 0, 27, 433, 1, 0, 0, 0, 29, 445, 1, 0, 0, 0, 31, 452, 1, 0, 0, 0, 33, 460, 1, 0, 0, 0, 35, 469, 1, 0, 0, 0, 37, 477, 1, 0, 0, 0, 39, 483, 1, 0, 0, 0, 41, 488, 1, 0, 0, 0, 43, 501, 1, 0, 0, 0, 45, 511, 1, 0, 0, 0, 47, 523, 1, 0, 0, 0, 49, 529, 1, 0, 0, 0, 51, 540, 1, 0, 0, 0, 53, 551, 1, 0, 0, 0, 55, 556, 1, 0, 0, 0, 57, 565, 1, 0, 0, 0, 59, 575, 1, 0, 0, 0, 61, 580, 1, 0, 0, 0, 63, 584, 1, 0, 0, 0, 65, 590, 1, 0, 0, 0, 67, 595, 1, 0, 0, 0, 69, 605, 1, 0, 0, 0, 71, 609, 1, 0, 0, 0, 73, 622, 1, 0, 0, 0, 75, 627, 1, 0, 0, 0, 77, 634, 1, 0, 0, 0, 79, 643, 1, 0, 0, 0, 81, 654, 1, 0, 0, 0, 83, 658, 1, 0, 0, 0, 85, 667, 1, 0, 0, 0, 87, 674, 1, 0, 0, 0, 89, 683, 1, 0, 0, 0, 91, 688, 1, 0, 0, 0, 93, 698, 1, 0, 0, 0, 95, 709, 1, 0, 0, 0, 97, 717, 1, 0, 0, 0, 99, 723, 1, 0, 0, 0, 101, 729, 1, 0, 0, 0, 103, 738, 1, 0, 0, 0, 105, 748, 1, 0, 0, 0, 107, 757, 1, 0, 0, 0, 109, 769, 1, 0, 0, 0, 111, 780, 1, 0, 0, 0, 113, 786, 1, 0, 0, 0, 115, 794, 1, 0, 0, 0, 117, 797, 1, 0, 0, 0, 119, 802, 1, 0, 0, 0, 121, 809, 1, 0, 0, 0, 123, 812, 1, 0, 0, 0, 125, 820, 1, 0, 0, 0, 127, 827, 1, 0, 0, 0, 129, 833, 1, 0, 0, 0, 131, 838, 1, 0, 0, 0, 133, 849, 1, 0, 0, 0, 135, 854, 1, 0, 0, 0, 137, 860, 1, 0, 0, 0, 139, 867, 1, 0, 0, 0, 141, 871, 1, 0, 0, 0, 143, 883, 1, 0, 0, 0, 145, 886, 1, 0, 0, 0, 147, 893, 1, 0, 0, 0, 149, 896, 1, 0, 0, 0, 151, 903, 1, 0, 0, 0, 153, 911, 1, 0, 0, 0, 155, 918, 1, 0, 0, 0, 157, 929, 1, 0, 0, 0, 159, 936, 1, 0, 0, 0, 161, 945, 1, 0, 0, 0, 163, 960, 1, 0, 0, 0, 165, 970, 1, 0, 0, 0, 167, 980, 1, 0, 0, 0, 169, 988, 1, 0, 0, 0, 171, 1001, 1, 0, 0, 0, 173, 1014, 1, 0, 0, 0, 175, 1020, 1, 0, 0, 0, 177, 1037, 1, 0, 0, 0, 179, 1040, 1, 0, 0, 0, 181, 1044, 1, 0, 0, 0, 183, 1049, 1, 0, 0, 0, 185, 1055, 1, 0, 0, 0, 187, 1064, 1, 0, 0, 0, 189, 1073, 1, 0, 0, 0, 191, 1077, 1, 0, 0, 0, 193, 1081, 1, 0, 0, 0, 195, 1085, 1, 0, 0, 0, 197, 1091, 1, 0, 0, 0, 199, 1097, 1, 0, 0, 0, 201, 1102, 1, 0, 0, 0, 203, 1107, 1, 0, 0, 0, 205, 1113, 1, 0, 0, 0, 207, 1121, 1, 0, 0, 0, 209, 1129, 1, 0, 0, 0, 211, 1140, 1, 0, 0, 0, 213, 1145, 1, 0, 0, 0, 215, 1157, 1, 0, 0, 0, 217, 1168, 1, 0, 0, 0, 219, 1178, 1, 0, 0, 0, 221, 1190, 1, 0, 0, 0, 223, 1199, 1, 0, 0, 0, 225, 1204, 1, 0, 0, 0, 227, 1217, 1, 0, 0, 0, 229, 1229, 1, 0, 0, 0, 231, 1241, 1, 0, 0, 0, 233, 1246, 1, 0, 0, 0, 235, 1254, 1, 0, 0, 0, 237, 1259, 1, 0, 0, 0, 239, 1272, 1, 0, 0, 0, 241, 1280, 1, 0, 0, 0, 243, 1289, 1, 0, 0, 0, 245, 1303, 1, 0, 0, 0, 247, 1312, 1, 0, 0, 0, 249, 1317, 1, 0, 0, 0, 251, 1324, 1, 0, 0, 0, 253, 1329, 1, 0, 0, 0, 255, 1335, 1, 0, 0, 0, 257, 1342, 1, 0, 0, 0, 259, 1348, 1, 0, 0, 0, 261, 1354, 1, 0, 0, 0, 263, 1361, 1, 0, 0, 0, 265, 1368, 1, 0, 0, 0, 267, 1375, 1, 0, 0, 0, 269, 1380, 1, 0, 0, 0, 271, 1386, 1, 0, 0, 0, 273, 1391, 1, 0, 0, 0, 275, 1394, 1, 0, 0, 0, 277, 1396, 1, 0, 0, 0, 279, 1398, 1, 0, 0, 0, 281, 1400, 1, 0, 0, 0, 283, 1402, 1, 0, 0, 0, 285, 1404, 1, 0, 0, 0, 287, 1406, 1, 0, 0, 0, 289, 1408, 1, 0, 0, 0, 291, 1410, 1, 0, 0, 0, 293, 1412, 1, 0, 0, 0, 295, 1414, 1, 0, 0, 0, 297, 1416, 1, 0, 0, 0, 299, 1418, 1, 0, 0, 0, 301, 1420, 1, 0, 0, 0, 303, 1423, 1, 0, 0, 0, 305, 1431, 1, 0, 0, 0, 307, 1462, 1, 0, 0, 0, 309, 1469, 1, 0, 0, 0, 311, 1479, 1, 0, 0, 0, 313, 1489, 1, 0, 0, 0, 315, 1491, 1, 0, 0, 0, 317, 1502, 1, 0, 0, 0, 319, 1517, 1, 0, 0, 0, 321, 322, 5, 101, 0, 0, 322, 323, 5, 100, 0, 0, 323, 324, 5, 105, 0, 0, 324, 325, 5, 116, 0, 0, 325, 2, 1, 0, 0, 0, 326, 327, 5, 109, 0, 0, 327, 328, 5, 111, 0, 0, 328, 329, 5, 100, 0, 0, 329, 330, 5, 117, 0, 0, 330, 331, 5, 108, 0, 0, 331, 332, 5, 101, 0, 0, 332, 4, 1, 0, 0, 0, 333, 334, 5, 99, 0, 0, 334, 335, 5, 111, 0, 0, 335, 336, 5, 110, 0, 0, 336, 337, 5, 116, 0, 0, 337, 338, 5, 114, 0, 0, 338, 339, 5, 97, 0, 0, 339, 340, 5, 99, 0, 0, 340, 341, 5, 116, 0, 0, 341, 6, 1, 0, 0, 0, 342, 343, 5, 112, 0, 0, 343, 344, 5, 114, 0, 0, 344, 345, 5, 101, 0, 0, 345, 346, 5, 115, 0, 0, 346, 347, 5, 101, 0, 0, 347, 348, 5, 110, 0, 0, 348, 349, 5, 116, 0, 0, 349, 350, 5, 97, 0, 0, 350, 351, 5, 116, 0, 0, 351, 352, 5, 105, 0, 0, 352, 353, 5, 111, 0, 0, 353, 354, 5, 110, 0, 0, 354, 8, 1, 0, 0, 0, 355, 356, 5, 115, 0, 0, 356, 357, 5, 117, 0, 0, 357, 358, 5, 98, 0, 0, 358, 359, 5, 106, 0, 0, 359, 360, 5, 101, 0, 0, 360, 361, 5, 99, 0, 0, 361, 362, 5, 116, 0, 0, 362, 10, 1, 0, 0, 0, 363, 364, 5, 102, 0, 0, 364, 365, 5, 111, 0, 0, 365, 366, 5, 114, 0, 0, 366, 12, 1, 0, 0, 0, 367, 368, 5, 99, 0, 0, 368, 369, 5, 114, 0, 0, 369, 370, 5, 101, 0, 0, 370, 371, 5, 97, 0, 0, 371, 372, 5, 116, 0, 0, 372, 373, 5, 105, 0, 0, 373, 374, 5, 111, 0, 0, 374, 375, 5, 110, 0, 0, 375, 14, 1, 0, 0, 0, 376, 377, 5, 118, 0, 0, 377, 378, 5, 97, 0, 0, 378, 379, 5, 114, 0, 0, 379, 380, 5, 105, 0, 0, 380, 381, 5, 97, 0, 0, 381, 382, 5, 110, 0, 0, 382, 383, 5, 116, 0, 0, 383, 16, 1, 0, 0, 0, 384, 385, 5, 112, 0, 0, 385, 386, 5, 114, 0, 0, 386, 387, 5, 101, 0, 0, 387, 388, 5, 112, 0, 0, 388, 389, 5, 97, 0, 0, 389, 390, 5, 114, 0, 0, 390, 391, 5, 101, 0, 0, 391, 392, 5, 115, 0, 0, 392, 18, 1, 0, 0, 0, 393, 394, 5, 105, 0, 0, 394, 395, 5, 110, 0, 0, 395, 396, 5, 105, 0, 0, 396, 397, 5, 116, 0, 0, 397, 398, 5, 105, 0, 0, 398, 399, 5, 97, 0, 0, 399, 400, 5, 108, 0, 0, 400, 401, 5, 105, 0, 0, 401, 402, 5, 122, 0, 0, 402, 403, 5, 101, 0, 0, 403, 20, 1, 0, 0, 0, 404, 405, 5, 119, 0, 0, 405, 406, 5, 111, 0, 0, 406, 407, 5, 114, 0, 0, 407, 408, 5, 107, 0, 0, 408, 409, 5, 115, 0, 0, 409, 410, 5, 112, 0, 0, 410, 411, 5, 97, 0, 0, 411, 412, 5, 99, 0, 0, 412, 413, 5, 101, 0, 0, 413, 22, 1, 0, 0, 0, 414, 415, 5, 101, 0, 0, 415, 416, 5, 120, 0, 0, 416, 417, 5, 101, 0, 0, 417, 418, 5, 99, 0, 0, 418, 419, 5, 117, 0, 0, 419, 420, 5, 116, 0, 0, 420, 421, 5, 105, 0, 0, 421, 422, 5, 111, 0, 0, 422, 423, 5, 110, 0, 0, 423, 24, 1, 0, 0, 0, 424, 425, 5, 115, 0, 0, 425, 426, 5, 110, 0, 0, 426, 427, 5, 97, 0, 0, 427, 428, 5, 112, 0, 0, 428, 429, 5, 115, 0, 0, 429, 430, 5, 104, 0, 0, 430, 431, 5, 111, 0, 0, 431, 432, 5, 116, 0, 0, 432, 26, 1, 0, 0, 0, 433, 434, 5, 116, 0, 0, 434, 435, 5, 114, 0, 0, 435, 436, 5, 97, 0, 0, 436, 437, 5, 110, 0, 0, 437, 438, 5, 115, 0, 0, 438, 439, 5, 97, 0, 0, 439, 440, 5, 99, 0, 0, 440, 441, 5, 116, 0, 0, 441, 442, 5, 105, 0, 0, 442, 443, 5, 111, 0, 0, 443, 444, 5, 110, 0, 0, 444, 28, 1, 0, 0, 0, 445, 446, 5, 114, 0, 0, 446, 447, 5, 101, 0, 0, 447, 448, 5, 109, 0, 0, 448, 449, 5, 111, 0, 0, 449, 450, 5, 116, 0, 0, 450, 451, 5, 101, 0, 0, 451, 30, 1, 0, 0, 0, 452, 453, 5, 116, 0, 0, 453, 454, 5, 97, 0, 0, 454, 455, 5, 114, 0, 0, 455, 456, 5, 103, 0, 0, 456, 457, 5, 101, 0, 0, 457, 458, 5, 116, 0, 0, 458, 459, 5, 115, 0, 0, 459, 32, 1, 0, 0, 0, 460, 461, 5, 112, 0, 0, 461, 462, 5, 111, 0, 0, 462, 463, 5, 114, 0, 0, 463, 464, 5, 116, 0, 0, 464, 465, 5, 97, 0, 0, 465, 466, 5, 98, 0, 0, 466, 467, 5, 108, 0, 0, 467, 468, 5, 101, 0, 0, 468, 34, 1, 0, 0, 0, 469, 470, 5, 114, 0, 0, 470, 471, 5, 101, 0, 0, 471, 472, 5, 112, 0, 0, 472, 473, 5, 108, 0, 0, 473, 474, 5, 105, 0, 0, 474, 475, 5, 99, 0, 0, 475, 476, 5, 97, 0, 0, 476, 36, 1, 0, 0, 0, 477, 478, 5, 108, 0, 0, 478, 479, 5, 111, 0, 0, 479, 480, 5, 99, 0, 0, 480, 481, 5, 97, 0, 0, 481, 482, 5, 108, 0, 0, 482, 38, 1, 0, 0, 0, 483, 484, 5, 102, 0, 0, 484, 485, 5, 114, 0, 0, 485, 486, 5, 111, 0, 0, 486, 487, 5, 109, 0, 0, 487, 40, 1, 0, 0, 0, 488, 489, 5, 114, 0, 0, 489, 490, 5, 101, 0, 0, 490, 491, 5, 115, 0, 0, 491, 492, 5, 117, 0, 0, 492, 493, 5, 108, 0, 0, 493, 494, 5, 116, 0, 0, 494, 495, 5, 45, 0, 0, 495, 496, 5, 98, 0, 0, 496, 497, 5, 121, 0, 0, 497, 498, 5, 116, 0, 0, 498, 499, 5, 101, 0, 0, 499, 500, 5, 115, 0, 0, 500, 42, 1, 0, 0, 0, 501, 502, 5, 114, 0, 0, 502, 503, 5, 112, 0, 0, 503, 504, 5, 99, 0, 0, 504, 505, 5, 45, 0, 0, 505, 506, 5, 99, 0, 0, 506, 507, 5, 97, 0, 0, 507, 508, 5, 108, 0, 0, 508, 509, 5, 108, 0, 0, 509, 510, 5, 115, 0, 0, 510, 44, 1, 0, 0, 0, 511, 512, 5, 100, 0, 0, 512, 513, 5, 101, 0, 0, 513, 514, 5, 97, 0, 0, 514, 515, 5, 100, 0, 0, 515, 516, 5, 108, 0, 0, 516, 517, 5, 105, 0, 0, 517, 518, 5, 110, 0, 0, 518, 519, 5, 101, 0, 0, 519, 520, 5, 45, 0, 0, 520, 521, 5, 109, 0, 0, 521, 522, 5, 115, 0, 0, 522, 46, 1, 0, 0, 0, 523, 524, 5, 113, 0, 0, 524, 525, 5, 117, 0, 0, 525, 526, 5, 101, 0, 0, 526, 527, 5, 114, 0, 0, 527, 528, 5, 121, 0, 0, 528, 48, 1, 0, 0, 0, 529, 530, 5, 114, 0, 0, 530, 531, 5, 101, 0, 0, 531, 532, 5, 102, 0, 0, 532, 533, 5, 108, 0, 0, 533, 534, 5, 101, 0, 0, 534, 535, 5, 99, 0, 0, 535, 536, 5, 116, 0, 0, 536, 537, 5, 105, 0, 0, 537, 538, 5, 111, 0, 0, 538, 539, 5, 110, 0, 0, 539, 50, 1, 0, 0, 0, 540, 541, 5, 115, 0, 0, 541, 542, 5, 112, 0, 0, 542, 543, 5, 101, 0, 0, 543, 544, 5, 99, 0, 0, 544, 545, 5, 105, 0, 0, 545, 546, 5, 97, 0, 0, 546, 547, 5, 108, 0, 0, 547, 548, 5, 105, 0, 0, 548, 549, 5, 122, 0, 0, 549, 550, 5, 101, 0, 0, 550, 52, 1, 0, 0, 0, 551, 552, 5, 114, 0, 0, 552, 553, 5, 111, 0, 0, 553, 554, 5, 111, 0, 0, 554, 555, 5, 116, 0, 0, 555, 54, 1, 0, 0, 0, 556, 557, 5, 100, 0, 0, 557, 558, 5, 111, 0, 0, 558, 559, 5, 99, 0, 0, 559, 560, 5, 117, 0, 0, 560, 561, 5, 109, 0, 0, 561, 562, 5, 101, 0, 0, 562, 563, 5, 110, 0, 0, 563, 564, 5, 116, 0, 0, 564, 56, 1, 0, 0, 0, 565, 566, 5, 102, 0, 0, 566, 567, 5, 114, 0, 0, 567, 568, 5, 97, 0, 0, 568, 569, 5, 103, 0, 0, 569, 570, 5, 109, 0, 0, 570, 571, 5, 101, 0, 0, 571, 572, 5, 110, 0, 0, 572, 573, 5, 116, 0, 0, 573, 574, 5, 115, 0, 0, 574, 58, 1, 0, 0, 0, 575, 576, 5, 118, 0, 0, 576, 577, 5, 105, 0, 0, 577, 578, 5, 101, 0, 0, 578, 579, 5, 119, 0, 0, 579, 60, 1, 0, 0, 0, 580, 581, 5, 109, 0, 0, 581, 582, 5, 97, 0, 0, 582, 583, 5, 120, 0, 0, 583, 62, 1, 0, 0, 0, 584, 585, 5, 97, 0, 0, 585, 586, 5, 108, 0, 0, 586, 587, 5, 108, 0, 0, 587, 588, 5, 111, 0, 0, 588, 589, 5, 119, 0, 0, 589, 64, 1, 0, 0, 0, 590, 591, 5, 112, 0, 0, 591, 592, 5, 111, 0, 0, 592, 593, 5, 108, 0, 0, 593, 594, 5, 108, 0, 0, 594, 66, 1, 0, 0, 0, 595, 596, 5, 113, 0, 0, 596, 597, 5, 117, 0, 0, 597, 598, 5, 101, 0, 0, 598, 599, 5, 114, 0, 0, 599, 600, 5, 121, 0, 0, 600, 601, 5, 97, 0, 0, 601, 602, 5, 98, 0, 0, 602, 603, 5, 108, 0, 0, 603, 604, 5, 101, 0, 0, 604, 68, 1, 0, 0, 0, 605, 606, 5, 114, 0, 0, 606, 607, 5, 112, 0, 0, 607, 608, 5, 99, 0, 0, 608, 70, 1, 0, 0, 0, 609, 610, 5, 113, 0, 0, 610, 611, 5, 117, 0, 0, 611, 612, 5, 101, 0, 0, 612, 613, 5, 114, 0, 0, 613, 614, 5, 121, 0, 0, 614, 615, 5, 45, 0, 0, 615, 616, 5, 114, 0, 0, 616, 617, 5, 101, 0, 0, 617, 618, 5, 97, 0, 0, 618, 619, 5, 115, 0, 0, 619, 620, 5, 111, 0, 0, 620, 621, 5, 110, 0, 0, 621, 72, 1, 0, 0, 0, 622, 623, 5, 116, 0, 0, 623, 624, 5, 121, 0, 0, 624, 625, 5, 112, 0, 0, 625, 626, 5, 101, 0, 0, 626, 74, 1, 0, 0, 0, 627, 628, 5, 111, 0, 0, 628, 629, 5, 98, 0, 0, 629, 630, 5, 106, 0, 0, 630, 631, 5, 101, 0, 0, 631, 632, 5, 99, 0, 0, 632, 633, 5, 116, 0, 0, 633, 76, 1, 0, 0, 0, 634, 635, 5, 115, 0, 0, 635, 636, 5, 116, 0, 0, 636, 637, 5, 111, 0, 0, 637, 638, 5, 114, 0, 0, 638, 639, 5, 97, 0, 0, 639, 640, 5, 98, 0, 0, 640, 641, 5, 108, 0, 0, 641, 642, 5, 101, 0, 0, 642, 78, 1, 0, 0, 0, 643, 644, 5, 105, 0, 0, 644, 645, 5, 109, 0, 0, 645, 646, 5, 112, 0, 0, 646, 647, 5, 108, 0, 0, 647, 648, 5, 101, 0, 0, 648, 649, 5, 109, 0, 0, 649, 650, 5, 101, 0, 0, 650, 651, 5, 110, 0, 0, 651, 652, 5, 116, 0, 0, 652, 653, 5, 115, 0, 0, 653, 80, 1, 0, 0, 0, 654, 655, 5, 114, 0, 0, 655, 656, 5, 101, 0, 0, 656, 657, 5, 102, 0, 0, 657, 82, 1, 0, 0, 0, 658, 659, 5, 102, 0, 0, 659, 660, 5, 114, 0, 0, 660, 661, 5, 97, 0, 0, 661, 662, 5, 103, 0, 0, 662, 663, 5, 109, 0, 0, 663, 664, 5, 101, 0, 0, 664, 665, 5, 110, 0, 0, 665, 666, 5, 116, 0, 0, 666, 84, 1, 0, 0, 0, 667, 668, 5, 105, 0, 0, 668, 669, 5, 109, 0, 0, 669, 670, 5, 112, 0, 0, 670, 671, 5, 111, 0, 0, 671, 672, 5, 114, 0, 0, 672, 673, 5, 116, 0, 0, 673, 86, 1, 0, 0, 0, 674, 675, 5, 101, 0, 0, 675, 676, 5, 120, 0, 0, 676, 677, 5, 116, 0, 0, 677, 678, 5, 101, 0, 0, 678, 679, 5, 114, 0, 0, 679, 680, 5, 110, 0, 0, 680, 681, 5, 97, 0, 0, 681, 682, 5, 108, 0, 0, 682, 88, 1, 0, 0, 0, 683, 684, 5, 97, 0, 0, 684, 685, 5, 116, 0, 0, 685, 686, 5, 111, 0, 0, 686, 687, 5, 109, 0, 0, 687, 90, 1, 0, 0, 0, 688, 689, 5, 105, 0, 0, 689, 690, 5, 110, 0, 0, 690, 691, 5, 116, 0, 0, 691, 692, 5, 101, 0, 0, 692, 693, 5, 114, 0, 0, 693, 694, 5, 102, 0, 0, 694, 695, 5, 97, 0, 0, 695, 696, 5, 99, 0, 0, 696, 697, 5, 101, 0, 0, 697, 92, 1, 0, 0, 0, 698, 699, 5, 105, 0, 0, 699, 700, 5, 110, 0, 0, 700, 701, 5, 116, 0, 0, 701, 702, 5, 101, 0, 0, 702, 703, 5, 114, 0, 0, 703, 704, 5, 102, 0, 0, 704, 705, 5, 97, 0, 0, 705, 706, 5, 99, 0, 0, 706, 707, 5, 101, 0, 0, 707, 708, 5, 115, 0, 0, 708, 94, 1, 0, 0, 0, 709, 710, 5, 112, 0, 0, 710, 711, 5, 97, 0, 0, 711, 712, 5, 99, 0, 0, 712, 713, 5, 107, 0, 0, 713, 714, 5, 97, 0, 0, 714, 715, 5, 103, 0, 0, 715, 716, 5, 101, 0, 0, 716, 96, 1, 0, 0, 0, 717, 718, 5, 118, 0, 0, 718, 719, 5, 97, 0, 0, 719, 720, 5, 108, 0, 0, 720, 721, 5, 117, 0, 0, 721, 722, 5, 101, 0, 0, 722, 98, 1, 0, 0, 0, 723, 724, 5, 102, 0, 0, 724, 725, 5, 105, 0, 0, 725, 726, 5, 101, 0, 0, 726, 727, 5, 108, 0, 0, 727, 728, 5, 100, 0, 0, 728, 100, 1, 0, 0, 0, 729, 730, 5, 114, 0, 0, 730, 731, 5, 101, 0, 0, 731, 732, 5, 108, 0, 0, 732, 733, 5, 97, 0, 0, 733, 734, 5, 116, 0, 0, 734, 735, 5, 105, 0, 0, 735, 736, 5, 111, 0, 0, 736, 737, 5, 110, 0, 0, 737, 102, 1, 0, 0, 0, 738, 739, 5, 111, 0, 0, 739, 740, 5, 112, 0, 0, 740, 741, 5, 101, 0, 0, 741, 742, 5, 114, 0, 0, 742, 743, 5, 97, 0, 0, 743, 744, 5, 116, 0, 0, 744, 745, 5, 105, 0, 0, 745, 746, 5, 111, 0, 0, 746, 747, 5, 110, 0, 0, 747, 104, 1, 0, 0, 0, 748, 749, 5, 102, 0, 0, 749, 750, 5, 117, 0, 0, 750, 751, 5, 110, 0, 0, 751, 752, 5, 99, 0, 0, 752, 753, 5, 116, 0, 0, 753, 754, 5, 105, 0, 0, 754, 755, 5, 111, 0, 0, 755, 756, 5, 110, 0, 0, 756, 106, 1, 0, 0, 0, 757, 758, 5, 99, 0, 0, 758, 759, 5, 111, 0, 0, 759, 760, 5, 110, 0, 0, 760, 761, 5, 115, 0, 0, 761, 762, 5, 116, 0, 0, 762, 763, 5, 114, 0, 0, 763, 764, 5, 117, 0, 0, 764, 765, 5, 99, 0, 0, 765, 766, 5, 116, 0, 0, 766, 767, 5, 111, 0, 0, 767, 768, 5, 114, 0, 0, 768, 108, 1, 0, 0, 0, 769, 770, 5, 99, 0, 0, 770, 771, 5, 111, 0, 0, 771, 772, 5, 110, 0, 0, 772, 773, 5, 115, 0, 0, 773, 774, 5, 116, 0, 0, 774, 775, 5, 114, 0, 0, 775, 776, 5, 117, 0, 0, 776, 777, 5, 99, 0, 0, 777, 778, 5, 116, 0, 0, 778, 779, 5, 115, 0, 0, 779, 110, 1, 0, 0, 0, 780, 781, 5, 105, 0, 0, 781, 782, 5, 110, 0, 0, 782, 783, 5, 112, 0, 0, 783, 784, 5, 117, 0, 0, 784, 785, 5, 116, 0, 0, 785, 112, 1, 0, 0, 0, 786, 787, 5, 99, 0, 0, 787, 788, 5, 111, 0, 0, 788, 789, 5, 110, 0, 0, 789, 790, 5, 102, 0, 0, 790, 791, 5, 111, 0, 0, 791, 792, 5, 114, 0, 0, 792, 793, 5, 109, 0, 0, 793, 114, 1, 0, 0, 0, 794, 795, 5, 97, 0, 0, 795, 796, 5, 115, 0, 0, 796, 116, 1, 0, 0, 0, 797, 798, 5, 98, 0, 0, 798, 799, 5, 105, 0, 0, 799, 800, 5, 110, 0, 0, 800, 801, 5, 100, 0, 0, 801, 118, 1, 0, 0, 0, 802, 803, 5, 115, 0, 0, 803, 804, 5, 116, 0, 0, 804, 805, 5, 97, 0, 0, 805, 806, 5, 116, 0, 0, 806, 807, 5, 105, 0, 0, 807, 808, 5, 99, 0, 0, 808, 120, 1, 0, 0, 0, 809, 810, 5, 116, 0, 0, 810, 811, 5, 111, 0, 0, 811, 122, 1, 0, 0, 0, 812, 813, 5, 112, 0, 0, 813, 814, 5, 114, 0, 0, 814, 815, 5, 105, 0, 0, 815, 816, 5, 118, 0, 0, 816, 817, 5, 97, 0, 0, 817, 818, 5, 116, 0, 0, 818, 819, 5, 101, 0, 0, 819, 124, 1, 0, 0, 0, 820, 821, 5, 115, 0, 0, 821, 822, 5, 104, 0, 0, 822, 823, 5, 97, 0, 0, 823, 824, 5, 114, 0, 0, 824, 825, 5, 101, 0, 0, 825, 826, 5, 100, 0, 0, 826, 126, 1, 0, 0, 0, 827, 828, 5, 115, 0, 0, 828, 829, 5, 116, 0, 0, 829, 830, 5, 97, 0, 0, 830, 831, 5, 116, 0, 0, 831, 832, 5, 101, 0, 0, 832, 128, 1, 0, 0, 0, 833, 834, 5, 101, 0, 0, 834, 835, 5, 100, 0, 0, 835, 836, 5, 103, 0, 0, 836, 837, 5, 101, 0, 0, 837, 130, 1, 0, 0, 0, 838, 839, 5, 112, 0, 0, 839, 840, 5, 114, 0, 0, 840, 841, 5, 111, 0, 0, 841, 842, 5, 106, 0, 0, 842, 843, 5, 101, 0, 0, 843, 844, 5, 99, 0, 0, 844, 845, 5, 116, 0, 0, 845, 846, 5, 105, 0, 0, 846, 847, 5, 111, 0, 0, 847, 848, 5, 110, 0, 0, 848, 132, 1, 0, 0, 0, 849, 850, 5, 119, 0, 0, 850, 851, 5, 105, 0, 0, 851, 852, 5, 116, 0, 0, 852, 853, 5, 104, 0, 0, 853, 134, 1, 0, 0, 0, 854, 855, 5, 117, 0, 0, 855, 856, 5, 115, 0, 0, 856, 857, 5, 105, 0, 0, 857, 858, 5, 110, 0, 0, 858, 859, 5, 103, 0, 0, 859, 136, 1, 0, 0, 0, 860, 861, 5, 97, 0, 0, 861, 862, 5, 99, 0, 0, 862, 863, 5, 99, 0, 0, 863, 864, 5, 101, 0, 0, 864, 865, 5, 112, 0, 0, 865, 866, 5, 116, 0, 0, 866, 138, 1, 0, 0, 0, 867, 868, 5, 118, 0, 0, 868, 869, 5, 105, 0, 0, 869, 870, 5, 97, 0, 0, 870, 140, 1, 0, 0, 0, 871, 872, 5, 109, 0, 0, 872, 873, 5, 97, 0, 0, 873, 874, 5, 116, 0, 0, 874, 875, 5, 101, 0, 0, 875, 876, 5, 114, 0, 0, 876, 877, 5, 105, 0, 0, 877, 878, 5, 97, 0, 0, 878, 879, 5, 108, 0, 0, 879, 880, 5, 105, 0, 0, 880, 881, 5, 122, 0, 0, 881, 882, 5, 101, 0, 0, 882, 142, 1, 0, 0, 0, 883, 884, 5, 105, 0, 0, 884, 885, 5, 102, 0, 0, 885, 144, 1, 0, 0, 0, 886, 887, 5, 97, 0, 0, 887, 888, 5, 98, 0, 0, 888, 889, 5, 115, 0, 0, 889, 890, 5, 101, 0, 0, 890, 891, 5, 110, 0, 0, 891, 892, 5, 116, 0, 0, 892, 146, 1, 0, 0, 0, 893, 894, 5, 111, 0, 0, 894, 895, 5, 110, 0, 0, 895, 148, 1, 0, 0, 0, 896, 897, 5, 112, 0, 0, 897, 898, 5, 111, 0, 0, 898, 899, 5, 108, 0, 0, 899, 900, 5, 105, 0, 0, 900, 901, 5, 99, 0, 0, 901, 902, 5, 121, 0, 0, 902, 150, 1, 0, 0, 0, 903, 904, 5, 100, 0, 0, 904, 905, 5, 101, 0, 0, 905, 906, 5, 102, 0, 0, 906, 907, 5, 97, 0, 0, 907, 908, 5, 117, 0, 0, 908, 909, 5, 108, 0, 0, 909, 910, 5, 116, 0, 0, 910, 152, 1, 0, 0, 0, 911, 912, 5, 115, 0, 0, 912, 913, 5, 111, 0, 0, 913, 914, 5, 117, 0, 0, 914, 915, 5, 114, 0, 0, 915, 916, 5, 99, 0, 0, 916, 917, 5, 101, 0, 0, 917, 154, 1, 0, 0, 0, 918, 919, 5, 114, 0, 0, 919, 920, 5, 101, 0, 0, 920, 921, 5, 112, 0, 0, 921, 922, 5, 111, 0, 0, 922, 923, 5, 115, 0, 0, 923, 924, 5, 105, 0, 0, 924, 925, 5, 116, 0, 0, 925, 926, 5, 111, 0, 0, 926, 927, 5, 114, 0, 0, 927, 928, 5, 121, 0, 0, 928, 156, 1, 0, 0, 0, 929, 930, 5, 99, 0, 0, 930, 931, 5, 111, 0, 0, 931, 932, 5, 109, 0, 0, 932, 933, 5, 109, 0, 0, 933, 934, 5, 105, 0, 0, 934, 935, 5, 116, 0, 0, 935, 158, 1, 0, 0, 0, 936, 937, 5, 114, 0, 0, 937, 938, 5, 101, 0, 0, 938, 939, 5, 118, 0, 0, 939, 940, 5, 105, 0, 0, 940, 941, 5, 115, 0, 0, 941, 942, 5, 105, 0, 0, 942, 943, 5, 111, 0, 0, 943, 944, 5, 110, 0, 0, 944, 160, 1, 0, 0, 0, 945, 946, 5, 115, 0, 0, 946, 947, 5, 101, 0, 0, 947, 948, 5, 109, 0, 0, 948, 949, 5, 97, 0, 0, 949, 950, 5, 110, 0, 0, 950, 951, 5, 116, 0, 0, 951, 952, 5, 105, 0, 0, 952, 953, 5, 99, 0, 0, 953, 954, 5, 45, 0, 0, 954, 955, 5, 109, 0, 0, 955, 956, 5, 97, 0, 0, 956, 957, 5, 106, 0, 0, 957, 958, 5, 111, 0, 0, 958, 959, 5, 114, 0, 0, 959, 162, 1, 0, 0, 0, 960, 961, 5, 111, 0, 0, 961, 962, 5, 110, 0, 0, 962, 963, 5, 45, 0, 0, 963, 964, 5, 100, 0, 0, 964, 965, 5, 101, 0, 0, 965, 966, 5, 108, 0, 0, 966, 967, 5, 101, 0, 0, 967, 968, 5, 116, 0, 0, 968, 969, 5, 101, 0, 0, 969, 164, 1, 0, 0, 0, 970, 971, 5, 108, 0, 0, 971, 972, 5, 105, 0, 0, 972, 973, 5, 102, 0, 0, 973, 974, 5, 101, 0, 0, 974, 975, 5, 99, 0, 0, 975, 976, 5, 121, 0, 0, 976, 977, 5, 99, 0, 0, 977, 978, 5, 108, 0, 0, 978, 979, 5, 101, 0, 0, 979, 166, 1, 0, 0, 0, 980, 981, 5, 106, 0, 0, 981, 982, 5, 111, 0, 0, 982, 983, 5, 117, 0, 0, 983, 984, 5, 114, 0, 0, 984, 985, 5, 110, 0, 0, 985, 986, 5, 97, 0, 0, 986, 987, 5, 108, 0, 0, 987, 168, 1, 0, 0, 0, 988, 989, 5, 115, 0, 0, 989, 990, 5, 117, 0, 0, 990, 991, 5, 98, 0, 0, 991, 992, 5, 115, 0, 0, 992, 993, 5, 99, 0, 0, 993, 994, 5, 114, 0, 0, 994, 995, 5, 105, 0, 0, 995, 996, 5, 112, 0, 0, 996, 997, 5, 116, 0, 0, 997, 998, 5, 105, 0, 0, 998, 999, 5, 111, 0, 0, 999, 1000, 5, 110, 0, 0, 1000, 170, 1, 0, 0, 0, 1001, 1002, 5, 114, 0, 0, 1002, 1003, 5, 101, 0, 0, 1003, 1004, 5, 116, 0, 0, 1004, 1005, 5, 97, 0, 0, 1005, 1006, 5, 105, 0, 0, 1006, 1007, 5, 110, 0, 0, 1007, 1008, 5, 45, 0, 0, 1008, 1009, 5, 111, 0, 0, 1009, 1010, 5, 116, 0, 0, 1010, 1011, 5, 104, 0, 0, 1011, 1012, 5, 101, 0, 0, 1012, 1013, 5, 114, 0, 0, 1013, 172, 1, 0, 0, 0, 1014, 1015, 5, 107, 0, 0, 1015, 1016, 5, 101, 0, 0, 1016, 1017, 5, 121, 0, 0, 1017, 1018, 5, 101, 0, 0, 1018, 1019, 5, 100, 0, 0, 1019, 174, 1, 0, 0, 0, 1020, 1021, 5, 112, 0, 0, 1021, 1022, 5, 117, 0, 0, 1022, 1023, 5, 98, 0, 0, 1023, 1024, 5, 108, 0, 0, 1024, 1025, 5, 105, 0, 0, 1025, 1026, 5, 99, 0, 0, 1026, 1027, 5, 45, 0, 0, 1027, 1028, 5, 116, 0, 0, 1028, 1029, 5, 114, 0, 0, 1029, 1030, 5, 97, 0, 0, 1030, 1031, 5, 118, 0, 0, 1031, 1032, 5, 101, 0, 0, 1032, 1033, 5, 114, 0, 0, 1033, 1034, 5, 115, 0, 0, 1034, 1035, 5, 97, 0, 0, 1035, 1036, 5, 108, 0, 0, 1036, 176, 1, 0, 0, 0, 1037, 1038, 5, 105, 0, 0, 1038, 1039, 5, 100, 0, 0, 1039, 178, 1, 0, 0, 0, 1040, 1041, 5, 100, 0, 0, 1041, 1042, 5, 111, 0, 0, 1042, 1043, 5, 99, 0, 0, 1043, 180, 1, 0, 0, 0, 1044, 1045, 5, 109, 0, 0, 1045, 1046, 5, 111, 0, 0, 1046, 1047, 5, 100, 0, 0, 1047, 1048, 5, 101, 0, 0, 1048, 182, 1, 0, 0, 0, 1049, 1050, 5, 101, 0, 0, 1050, 1051, 5, 109, 0, 0, 1051, 1052, 5, 105, 0, 0, 1052, 1053, 5, 116, 0, 0, 1053, 1054, 5, 115, 0, 0, 1054, 184, 1, 0, 0, 0, 1055, 1056, 5, 114, 0, 0, 1056, 1057, 5, 101, 0, 0, 1057, 1058, 5, 99, 0, 0, 1058, 1059, 5, 101, 0, 0, 1059, 1060, 5, 105, 0, 0, 1060, 1061, 5, 118, 0, 0, 1061, 1062, 5, 101, 0, 0, 1062, 1063, 5, 114, 0, 0, 1063, 186, 1, 0, 0, 0, 1064, 1065, 5, 114, 0, 0, 1065, 1066, 5, 101, 0, 0, 1066, 1067, 5, 113, 0, 0, 1067, 1068, 5, 117, 0, 0, 1068, 1069, 5, 105, 0, 0, 1069, 1070, 5, 114, 0, 0, 1070, 1071, 5, 101, 0, 0, 1071, 1072, 5, 115, 0, 0, 1072, 188, 1, 0, 0, 0, 1073, 1074, 5, 97, 0, 0, 1074, 1075, 5, 110, 0, 0, 1075, 1076, 5, 121, 0, 0, 1076, 190, 1, 0, 0, 0, 1077, 1078, 5, 103, 0, 0, 1078, 1079, 5, 101, 0, 0, 1079, 1080, 5, 116, 0, 0, 1080, 192, 1, 0, 0, 0, 1081, 1082, 5, 115, 0, 0, 1082, 1083, 5, 101, 0, 0, 1083, 1084, 5, 116, 0, 0, 1084, 194, 1, 0, 0, 0, 1085, 1086, 5, 119, 0, 0, 1086, 1087, 5, 97, 0, 0, 1087, 1088, 5, 116, 0, 0, 1088, 1089, 5, 99, 0, 0, 1089, 1090, 5, 104, 0, 0, 1090, 196, 1, 0, 0, 0, 1091, 1092, 5, 115, 0, 0, 1092, 1093, 5, 116, 0, 0, 1093, 1094, 5, 97, 0, 0, 1094, 1095, 5, 114, 0, 0, 1095, 1096, 5, 116, 0, 0, 1096, 198, 1, 0, 0, 0, 1097, 1098, 5, 115, 0, 0, 1098, 1099, 5, 116, 0, 0, 1099, 1100, 5, 111, 0, 0, 1100, 1101, 5, 112, 0, 0, 1101, 200, 1, 0, 0, 0, 1102, 1103, 5, 114, 0, 0, 1103, 1104, 5, 101, 0, 0, 1104, 1105, 5, 97, 0, 0, 1105, 1106, 5, 100, 0, 0, 1106, 202, 1, 0, 0, 0, 1107, 1108, 5, 119, 0, 0, 1108, 1109, 5, 114, 0, 0, 1109, 1110, 5, 105, 0, 0, 1110, 1111, 5, 116, 0, 0, 1111, 1112, 5, 101, 0, 0, 1112, 204, 1, 0, 0, 0, 1113, 1114, 5, 114, 0, 0, 1114, 1115, 5, 101, 0, 0, 1115, 1116, 5, 115, 0, 0, 1116, 1117, 5, 111, 0, 0, 1117, 1118, 5, 108, 0, 0, 1118, 1119, 5, 118, 0, 0, 1119, 1120, 5, 101, 0, 0, 1120, 206, 1, 0, 0, 0, 1121, 1122, 5, 99, 0, 0, 1122, 1123, 5, 111, 0, 0, 1123, 1124, 5, 110, 0, 0, 1124, 1125, 5, 110, 0, 0, 1125, 1126, 5, 101, 0, 0, 1126, 1127, 5, 99, 0, 0, 1127, 1128, 5, 116, 0, 0, 1128, 208, 1, 0, 0, 0, 1129, 1130, 5, 100, 0, 0, 1130, 1131, 5, 105, 0, 0, 1131, 1132, 5, 115, 0, 0, 1132, 1133, 5, 99, 0, 0, 1133, 1134, 5, 111, 0, 0, 1134, 1135, 5, 110, 0, 0, 1135, 1136, 5, 110, 0, 0, 1136, 1137, 5, 101, 0, 0, 1137, 1138, 5, 99, 0, 0, 1138, 1139, 5, 116, 0, 0, 1139, 210, 1, 0, 0, 0, 1140, 1141, 5, 99, 0, 0, 1141, 1142, 5, 97, 0, 0, 1142, 1143, 5, 108, 0, 0, 1143, 1144, 5, 108, 0, 0, 1144, 212, 1, 0, 0, 0, 1145, 1146, 5, 119, 0, 0, 1146, 1147, 5, 97, 0, 0, 1147, 1148, 5, 116, 0, 0, 1148, 1149, 5, 99, 0, 0, 1149, 1150, 5, 104, 0, 0, 1150, 1151, 5, 45, 0, 0, 1151, 1152, 5, 115, 0, 0, 1152, 1153, 5, 116, 0, 0, 1153, 1154, 5, 97, 0, 0, 1154, 1155, 5, 114, 0, 0, 1155, 1156, 5, 116, 0, 0, 1156, 214, 1, 0, 0, 0, 1157, 1158, 5, 119, 0, 0, 1158, 1159, 5, 97, 0, 0, 1159, 1160, 5, 116, 0, 0, 1160, 1161, 5, 99, 0, 0, 1161, 1162, 5, 104, 0, 0, 1162, 1163, 5, 45, 0, 0, 1163, 1164, 5, 115, 0, 0, 1164, 1165, 5, 116, 0, 0, 1165, 1166, 5, 111, 0, 0, 1166, 1167, 5, 112, 0, 0, 1167, 216, 1, 0, 0, 0, 1168, 1169, 5, 115, 0, 0, 1169, 1170, 5, 117, 0, 0, 1170, 1171, 5, 98, 0, 0, 1171, 1172, 5, 115, 0, 0, 1172, 1173, 5, 99, 0, 0, 1173, 1174, 5, 114, 0, 0, 1174, 1175, 5, 105, 0, 0, 1175, 1176, 5, 98, 0, 0, 1176, 1177, 5, 101, 0, 0, 1177, 218, 1, 0, 0, 0, 1178, 1179, 5, 117, 0, 0, 1179, 1180, 5, 110, 0, 0, 1180, 1181, 5, 115, 0, 0, 1181, 1182, 5, 117, 0, 0, 1182, 1183, 5, 98, 0, 0, 1183, 1184, 5, 115, 0, 0, 1184, 1185, 5, 99, 0, 0, 1185, 1186, 5, 114, 0, 0, 1186, 1187, 5, 105, 0, 0, 1187, 1188, 5, 98, 0, 0, 1188, 1189, 5, 101, 0, 0, 1189, 220, 1, 0, 0, 0, 1190, 1191, 5, 114, 0, 0, 1191, 1192, 5, 101, 0, 0, 1192, 1193, 5, 103, 0, 0, 1193, 1194, 5, 105, 0, 0, 1194, 1195, 5, 115, 0, 0, 1195, 1196, 5, 116, 0, 0, 1196, 1197, 5, 101, 0, 0, 1197, 1198, 5, 114, 0, 0, 1198, 222, 1, 0, 0, 0, 1199, 1200, 5, 99, 0, 0, 1200, 1201, 5, 114, 0, 0, 1201, 1202, 5, 100, 0, 0, 1202, 1203, 5, 116, 0, 0, 1203, 224, 1, 0, 0, 0, 1204, 1205, 5, 111, 0, 0, 1205, 1206, 5, 112, 0, 0, 1206, 1207, 5, 116, 0, 0, 1207, 1208, 5, 105, 0, 0, 1208, 1209, 5, 111, 0, 0, 1209, 1210, 5, 110, 0, 0, 1210, 1211, 5, 97, 0, 0, 1211, 1212, 5, 108, 0, 0, 1212, 1213, 5, 45, 0, 0, 1213, 1214, 5, 111, 0, 0, 1214, 1215, 5, 110, 0, 0, 1215, 1216, 5, 101, 0, 0, 1216, 226, 1, 0, 0, 0, 1217, 1218, 5, 101, 0, 0, 1218, 1219, 5, 120, 0, 0, 1219, 1220, 5, 97, 0, 0, 1220, 1221, 5, 99, 0, 0, 1221, 1222, 5, 116, 0, 0, 1222, 1223, 5, 108, 0, 0, 1223, 1224, 5, 121, 0, 0, 1224, 1225, 5, 45, 0, 0, 1225, 1226, 5, 111, 0, 0, 1226, 1227, 5, 110, 0, 0, 1227, 1228, 5, 101, 0, 0, 1228, 228, 1, 0, 0, 0, 1229, 1230, 5, 109, 0, 0, 1230, 1231, 5, 97, 0, 0, 1231, 1232, 5, 110, 0, 0, 1232, 1233, 5, 121, 0, 0, 1233, 1234, 5, 45, 0, 0, 1234, 1235, 5, 117, 0, 0, 1235, 1236, 5, 110, 0, 0, 1236, 1237, 5, 105, 0, 0, 1237, 1238, 5, 113, 0, 0, 1238, 1239, 5, 117, 0, 0, 1239, 1240, 5, 101, 0, 0, 1240, 230, 1, 0, 0, 0, 1241, 1242, 5, 109, 0, 0, 1242, 1243, 5, 97, 0, 0, 1243, 1244, 5, 110, 0, 0, 1244, 1245, 5, 121, 0, 0, 1245, 232, 1, 0, 0, 0, 1246, 1247, 5, 111, 0, 0, 1247, 1248, 5, 114, 0, 0, 1248, 1249, 5, 100, 0, 0, 1249, 1250, 5, 101, 0, 0, 1250, 1251, 5, 114, 0, 0, 1251, 1252, 5, 101, 0, 0, 1252, 1253, 5, 100, 0, 0, 1253, 234, 1, 0, 0, 0, 1254, 1255, 5, 117, 0, 0, 1255, 1256, 5, 110, 0, 0, 1256, 1257, 5, 105, 0, 0, 1257, 1258, 5, 116, 0, 0, 1258, 236, 1, 0, 0, 0, 1259, 1260, 5, 119, 0, 0, 1260, 1261, 5, 97, 0, 0, 1261, 1262, 5, 116, 0, 0, 1262, 1263, 5, 99, 0, 0, 1263, 1264, 5, 104, 0, 0, 1264, 1265, 5, 45, 0, 0, 1265, 1266, 5, 104, 0, 0, 1266, 1267, 5, 97, 0, 0, 1267, 1268, 5, 110, 0, 0, 1268, 1269, 5, 100, 0, 0, 1269, 1270, 5, 108, 0, 0, 1270, 1271, 5, 101, 0, 0, 1271, 238, 1, 0, 0, 0, 1272, 1273, 5, 109, 0, 0, 1273, 1274, 5, 101, 0, 0, 1274, 1275, 5, 115, 0, 0, 1275, 1276, 5, 115, 0, 0, 1276, 1277, 5, 97, 0, 0, 1277, 1278, 5, 103, 0, 0, 1278, 1279, 5, 101, 0, 0, 1279, 240, 1, 0, 0, 0, 1280, 1281, 5, 97, 0, 0, 1281, 1282, 5, 116, 0, 0, 1282, 1283, 5, 111, 0, 0, 1283, 1284, 5, 109, 0, 0, 1284, 1285, 5, 45, 0, 0, 1285, 1286, 5, 114, 0, 0, 1286, 1287, 5, 101, 0, 0, 1287, 1288, 5, 102, 0, 0, 1288, 242, 1, 0, 0, 0, 1289, 1290, 5, 105, 0, 0, 1290, 1291, 5, 110, 0, 0, 1291, 1292, 5, 116, 0, 0, 1292, 1293, 5, 101, 0, 0, 1293, 1294, 5, 114, 0, 0, 1294, 1295, 5, 102, 0, 0, 1295, 1296, 5, 97, 0, 0, 1296, 1297, 5, 99, 0, 0, 1297, 1298, 5, 101, 0, 0, 1298, 1299, 5, 45, 0, 0, 1299, 1300, 5, 114, 0, 0, 1300, 1301, 5, 101, 0, 0, 1301, 1302, 5, 102, 0, 0, 1302, 244, 1, 0, 0, 0, 1303, 1304, 5, 111, 0, 0, 1304, 1305, 5, 112, 0, 0, 1305, 1306, 5, 116, 0, 0, 1306, 1307, 5, 105, 0, 0, 1307, 1308, 5, 111, 0, 0, 1308, 1309, 5, 110, 0, 0, 1309, 1310, 5, 97, 0, 0, 1310, 1311, 5, 108, 0, 0, 1311, 246, 1, 0, 0, 0, 1312, 1313, 5, 108, 0, 0, 1313, 1314, 5, 105, 0, 0, 1314, 1315, 5, 115, 0, 0, 1315, 1316, 5, 116, 0, 0, 1316, 248, 1, 0, 0, 0, 1317, 1318, 5, 114, 0, 0, 1318, 1319, 5, 101, 0, 0, 1319, 1320, 5, 99, 0, 0, 1320, 1321, 5, 111, 0, 0, 1321, 1322, 5, 114, 0, 0, 1322, 1323, 5, 100, 0, 0, 1323, 250, 1, 0, 0, 0, 1324, 1325, 5, 98, 0, 0, 1325, 1326, 5, 111, 0, 0, 1326, 1327, 5, 111, 0, 0, 1327, 1328, 5, 108, 0, 0, 1328, 252, 1, 0, 0, 0, 1329, 1330, 5, 98, 0, 0, 1330, 1331, 5, 121, 0, 0, 1331, 1332, 5, 116, 0, 0, 1332, 1333, 5, 101, 0, 0, 1333, 1334, 5, 115, 0, 0, 1334, 254, 1, 0, 0, 0, 1335, 1336, 5, 100, 0, 0, 1336, 1337, 5, 111, 0, 0, 1337, 1338, 5, 117, 0, 0, 1338, 1339, 5, 98, 0, 0, 1339, 1340, 5, 108, 0, 0, 1340, 1341, 5, 101, 0, 0, 1341, 256, 1, 0, 0, 0, 1342, 1343, 5, 105, 0, 0, 1343, 1344, 5, 110, 0, 0, 1344, 1345, 5, 116, 0, 0, 1345, 1346, 5, 51, 0, 0, 1346, 1347, 5, 50, 0, 0, 1347, 258, 1, 0, 0, 0, 1348, 1349, 5, 105, 0, 0, 1349, 1350, 5, 110, 0, 0, 1350, 1351, 5, 116, 0, 0, 1351, 1352, 5, 54, 0, 0, 1352, 1353, 5, 52, 0, 0, 1353, 260, 1, 0, 0, 0, 1354, 1355, 5, 115, 0, 0, 1355, 1356, 5, 116, 0, 0, 1356, 1357, 5, 114, 0, 0, 1357, 1358, 5, 105, 0, 0, 1358, 1359, 5, 110, 0, 0, 1359, 1360, 5, 103, 0, 0, 1360, 262, 1, 0, 0, 0, 1361, 1362, 5, 117, 0, 0, 1362, 1363, 5, 105, 0, 0, 1363, 1364, 5, 110, 0, 0, 1364, 1365, 5, 116, 0, 0, 1365, 1366, 5, 51, 0, 0, 1366, 1367, 5, 50, 0, 0, 1367, 264, 1, 0, 0, 0, 1368, 1369, 5, 117, 0, 0, 1369, 1370, 5, 105, 0, 0, 1370, 1371, 5, 110, 0, 0, 1371, 1372, 5, 116, 0, 0, 1372, 1373, 5, 54, 0, 0, 1373, 1374, 5, 52, 0, 0, 1374, 266, 1, 0, 0, 0, 1375, 1376, 5, 116, 0, 0, 1376, 1377, 5, 114, 0, 0, 1377, 1378, 5, 117, 0, 0, 1378, 1379, 5, 101, 0, 0, 1379, 268, 1, 0, 0, 0, 1380, 1381, 5, 102, 0, 0, 1381, 1382, 5, 97, 0, 0, 1382, 1383, 5, 108, 0, 0, 1383, 1384, 5, 115, 0, 0, 1384, 1385, 5, 101, 0, 0, 1385, 270, 1, 0, 0, 0, 1386, 1387, 5, 110, 0, 0, 1387, 1388, 5, 117, 0, 0, 1388, 1389, 5, 108, 0, 0, 1389, 1390, 5, 108, 0, 0, 1390, 272, 1, 0, 0, 0, 1391, 1392, 5, 45, 0, 0, 1392, 1393, 5, 62, 0, 0, 1393, 274, 1, 0, 0, 0, 1394, 1395, 5, 58, 0, 0, 1395, 276, 1, 0, 0, 0, 1396, 1397, 5, 59, 0, 0, 1397, 278, 1, 0, 0, 0, 1398, 1399, 5, 44, 0, 0, 1399, 280, 1, 0, 0, 0, 1400, 1401, 5, 46, 0, 0, 1401, 282, 1, 0, 0, 0, 1402, 1403, 5, 123, 0, 0, 1403, 284, 1, 0, 0, 0, 1404, 1405, 5, 125, 0, 0, 1405, 286, 1, 0, 0, 0, 1406, 1407, 5, 91, 0, 0, 1407, 288, 1, 0, 0, 0, 1408, 1409, 5, 93, 0, 0, 1409, 290, 1, 0, 0, 0, 1410, 1411, 5, 40, 0, 0, 1411, 292, 1, 0, 0, 0, 1412, 1413, 5, 41, 0, 0, 1413, 294, 1, 0, 0, 0, 1414, 1415, 5, 60, 0, 0, 1415, 296, 1, 0, 0, 0, 1416, 1417, 5, 62, 0, 0, 1417, 298, 1, 0, 0, 0, 1418, 1419, 5, 38, 0, 0, 1419, 300, 1, 0, 0, 0, 1420, 1421, 5, 61, 0, 0, 1421, 302, 1, 0, 0, 0, 1422, 1424, 5, 45, 0, 0, 1423, 1422, 1, 0, 0, 0, 1423, 1424, 1, 0, 0, 0, 1424, 1426, 1, 0, 0, 0, 1425, 1427, 7, 0, 0, 0, 1426, 1425, 1, 0, 0, 0, 1427, 1428, 1, 0, 0, 0, 1428, 1426, 1, 0, 0, 0, 1428, 1429, 1, 0, 0, 0, 1429, 304, 1, 0, 0, 0, 1430, 1432, 5, 45, 0, 0, 1431, 1430, 1, 0, 0, 0, 1431, 1432, 1, 0, 0, 0, 1432, 1441, 1, 0, 0, 0, 1433, 1442, 5, 48, 0, 0, 1434, 1438, 7, 1, 0, 0, 1435, 1437, 7, 0, 0, 0, 1436, 1435, 1, 0, 0, 0, 1437, 1440, 1, 0, 0, 0, 1438, 1436, 1, 0, 0, 0, 1438, 1439, 1, 0, 0, 0, 1439, 1442, 1, 0, 0, 0, 1440, 1438, 1, 0, 0, 0, 1441, 1433, 1, 0, 0, 0, 1441, 1434, 1, 0, 0, 0, 1442, 1449, 1, 0, 0, 0, 1443, 1445, 5, 46, 0, 0, 1444, 1446, 7, 0, 0, 0, 1445, 1444, 1, 0, 0, 0, 1446, 1447, 1, 0, 0, 0, 1447, 1445, 1, 0, 0, 0, 1447, 1448, 1, 0, 0, 0, 1448, 1450, 1, 0, 0, 0, 1449, 1443, 1, 0, 0, 0, 1449, 1450, 1, 0, 0, 0, 1450, 1460, 1, 0, 0, 0, 1451, 1453, 7, 2, 0, 0, 1452, 1454, 7, 3, 0, 0, 1453, 1452, 1, 0, 0, 0, 1453, 1454, 1, 0, 0, 0, 1454, 1456, 1, 0, 0, 0, 1455, 1457, 7, 0, 0, 0, 1456, 1455, 1, 0, 0, 0, 1457, 1458, 1, 0, 0, 0, 1458, 1456, 1, 0, 0, 0, 1458, 1459, 1, 0, 0, 0, 1459, 1461, 1, 0, 0, 0, 1460, 1451, 1, 0, 0, 0, 1460, 1461, 1, 0, 0, 0, 1461, 306, 1, 0, 0, 0, 1462, 1466, 7, 4, 0, 0, 1463, 1465, 7, 5, 0, 0, 1464, 1463, 1, 0, 0, 0, 1465, 1468, 1, 0, 0, 0, 1466, 1464, 1, 0, 0, 0, 1466, 1467, 1, 0, 0, 0, 1467, 308, 1, 0, 0, 0, 1468, 1466, 1, 0, 0, 0, 1469, 1474, 5, 34, 0, 0, 1470, 1473, 3, 311, 155, 0, 1471, 1473, 8, 6, 0, 0, 1472, 1470, 1, 0, 0, 0, 1472, 1471, 1, 0, 0, 0, 1473, 1476, 1, 0, 0, 0, 1474, 1472, 1, 0, 0, 0, 1474, 1475, 1, 0, 0, 0, 1475, 1477, 1, 0, 0, 0, 1476, 1474, 1, 0, 0, 0, 1477, 1478, 5, 34, 0, 0, 1478, 310, 1, 0, 0, 0, 1479, 1487, 5, 92, 0, 0, 1480, 1488, 7, 7, 0, 0, 1481, 1482, 5, 117, 0, 0, 1482, 1483, 3, 313, 156, 0, 1483, 1484, 3, 313, 156, 0, 1484, 1485, 3, 313, 156, 0, 1485, 1486, 3, 313, 156, 0, 1486, 1488, 1, 0, 0, 0, 1487, 1480, 1, 0, 0, 0, 1487, 1481, 1, 0, 0, 0, 1488, 312, 1, 0, 0, 0, 1489, 1490, 7, 8, 0, 0, 1490, 314, 1, 0, 0, 0, 1491, 1492, 5, 47, 0, 0, 1492, 1493, 5, 47, 0, 0, 1493, 1497, 1, 0, 0, 0, 1494, 1496, 8, 9, 0, 0, 1495, 1494, 1, 0, 0, 0, 1496, 1499, 1, 0, 0, 0, 1497, 1495, 1, 0, 0, 0, 1497, 1498, 1, 0, 0, 0, 1498, 1500, 1, 0, 0, 0, 1499, 1497, 1, 0, 0, 0, 1500, 1501, 6, 157, 0, 0, 1501, 316, 1, 0, 0, 0, 1502, 1503, 5, 47, 0, 0, 1503, 1504, 5, 42, 0, 0, 1504, 1508, 1, 0, 0, 0, 1505, 1507, 9, 0, 0, 0, 1506, 1505, 1, 0, 0, 0, 1507, 1510, 1, 0, 0, 0, 1508, 1509, 1, 0, 0, 0, 1508, 1506, 1, 0, 0, 0, 1509, 1511, 1, 0, 0, 0, 1510, 1508, 1, 0, 0, 0, 1511, 1512, 5, 42, 0, 0, 1512, 1513, 5, 47, 0, 0, 1513, 1514, 1, 0, 0, 0, 1514, 1515, 6, 158, 0, 0, 1515, 318, 1, 0, 0, 0, 1516, 1518, 7, 10, 0, 0, 1517, 1516, 1, 0, 0, 0, 1518, 1519, 1, 0, 0, 0, 1519, 1517, 1, 0, 0, 0, 1519, 1520, 1, 0, 0, 0, 1520, 1521, 1, 0, 0, 0, 1521, 1522, 6, 159, 0, 0, 1522, 320, 1, 0, 0, 0, 18, 0, 1423, 1428, 1431, 1438, 1441, 1447, 1449, 1453, 1458, 1460, 1466, 1472, 1474, 1487, 1497, 1508, 1519, 1, 0, 1, 0] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapabilityLexer.tokens b/src/capability-language/generated/QuixosCapabilityLexer.tokens index 4a012c6..737fc4d 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.tokens +++ b/src/capability-language/generated/QuixosCapabilityLexer.tokens @@ -81,79 +81,81 @@ REVISION=80 SEMANTIC_MAJOR=81 ON_DELETE=82 LIFECYCLE=83 -RETAIN_OTHER=84 -KEYED=85 -PUBLIC_TRAVERSAL=86 -ID=87 -DOC=88 -MODE=89 -EMITS=90 -RECEIVER=91 -REQUIRES=92 -ANY=93 -GET=94 -SET=95 -WATCH=96 -START=97 -STOP=98 -READ=99 -WRITE=100 -RESOLVE=101 -CONNECT=102 -DISCONNECT=103 -CALL=104 -WATCH_START=105 -WATCH_STOP=106 -SUBSCRIBE=107 -UNSUBSCRIBE=108 -REGISTER=109 -CRDT=110 -OPTIONAL_ONE=111 -EXACTLY_ONE=112 -MANY_UNIQUE=113 -MANY=114 -ORDERED=115 -UNIT=116 -WATCH_HANDLE=117 -MESSAGE=118 -ATOM_REF=119 -INTERFACE_REF=120 -OPTIONAL=121 -LIST=122 -RECORD=123 -BOOL=124 -BYTES=125 -DOUBLE=126 -INT32=127 -INT64=128 -STRING=129 -UINT32=130 -UINT64=131 -TRUE=132 -FALSE=133 -NULL=134 -ARROW=135 -COLON=136 -SEMI=137 -COMMA=138 -DOT=139 -LBRACE=140 -RBRACE=141 -LBRACK=142 -RBRACK=143 -LPAREN=144 -RPAREN=145 -LT=146 -GT=147 -AMP=148 -EQUAL=149 -INTEGER=150 -JSON_NUMBER=151 -IDENTIFIER=152 -STRING_LITERAL=153 -LINE_COMMENT=154 -BLOCK_COMMENT=155 -WS=156 +JOURNAL=84 +SUBSCRIPTION=85 +RETAIN_OTHER=86 +KEYED=87 +PUBLIC_TRAVERSAL=88 +ID=89 +DOC=90 +MODE=91 +EMITS=92 +RECEIVER=93 +REQUIRES=94 +ANY=95 +GET=96 +SET=97 +WATCH=98 +START=99 +STOP=100 +READ=101 +WRITE=102 +RESOLVE=103 +CONNECT=104 +DISCONNECT=105 +CALL=106 +WATCH_START=107 +WATCH_STOP=108 +SUBSCRIBE=109 +UNSUBSCRIBE=110 +REGISTER=111 +CRDT=112 +OPTIONAL_ONE=113 +EXACTLY_ONE=114 +MANY_UNIQUE=115 +MANY=116 +ORDERED=117 +UNIT=118 +WATCH_HANDLE=119 +MESSAGE=120 +ATOM_REF=121 +INTERFACE_REF=122 +OPTIONAL=123 +LIST=124 +RECORD=125 +BOOL=126 +BYTES=127 +DOUBLE=128 +INT32=129 +INT64=130 +STRING=131 +UINT32=132 +UINT64=133 +TRUE=134 +FALSE=135 +NULL=136 +ARROW=137 +COLON=138 +SEMI=139 +COMMA=140 +DOT=141 +LBRACE=142 +RBRACE=143 +LBRACK=144 +RBRACK=145 +LPAREN=146 +RPAREN=147 +LT=148 +GT=149 +AMP=150 +EQUAL=151 +INTEGER=152 +JSON_NUMBER=153 +IDENTIFIER=154 +STRING_LITERAL=155 +LINE_COMMENT=156 +BLOCK_COMMENT=157 +WS=158 'edit'=1 'module'=2 'contract'=3 @@ -237,69 +239,71 @@ WS=156 'semantic-major'=81 'on-delete'=82 'lifecycle'=83 -'retain-other'=84 -'keyed'=85 -'public-traversal'=86 -'id'=87 -'doc'=88 -'mode'=89 -'emits'=90 -'receiver'=91 -'requires'=92 -'any'=93 -'get'=94 -'set'=95 -'watch'=96 -'start'=97 -'stop'=98 -'read'=99 -'write'=100 -'resolve'=101 -'connect'=102 -'disconnect'=103 -'call'=104 -'watch-start'=105 -'watch-stop'=106 -'subscribe'=107 -'unsubscribe'=108 -'register'=109 -'crdt'=110 -'optional-one'=111 -'exactly-one'=112 -'many-unique'=113 -'many'=114 -'ordered'=115 -'unit'=116 -'watch-handle'=117 -'message'=118 -'atom-ref'=119 -'interface-ref'=120 -'optional'=121 -'list'=122 -'record'=123 -'bool'=124 -'bytes'=125 -'double'=126 -'int32'=127 -'int64'=128 -'string'=129 -'uint32'=130 -'uint64'=131 -'true'=132 -'false'=133 -'null'=134 -'->'=135 -':'=136 -';'=137 -','=138 -'.'=139 -'{'=140 -'}'=141 -'['=142 -']'=143 -'('=144 -')'=145 -'<'=146 -'>'=147 -'&'=148 -'='=149 +'journal'=84 +'subscription'=85 +'retain-other'=86 +'keyed'=87 +'public-traversal'=88 +'id'=89 +'doc'=90 +'mode'=91 +'emits'=92 +'receiver'=93 +'requires'=94 +'any'=95 +'get'=96 +'set'=97 +'watch'=98 +'start'=99 +'stop'=100 +'read'=101 +'write'=102 +'resolve'=103 +'connect'=104 +'disconnect'=105 +'call'=106 +'watch-start'=107 +'watch-stop'=108 +'subscribe'=109 +'unsubscribe'=110 +'register'=111 +'crdt'=112 +'optional-one'=113 +'exactly-one'=114 +'many-unique'=115 +'many'=116 +'ordered'=117 +'unit'=118 +'watch-handle'=119 +'message'=120 +'atom-ref'=121 +'interface-ref'=122 +'optional'=123 +'list'=124 +'record'=125 +'bool'=126 +'bytes'=127 +'double'=128 +'int32'=129 +'int64'=130 +'string'=131 +'uint32'=132 +'uint64'=133 +'true'=134 +'false'=135 +'null'=136 +'->'=137 +':'=138 +';'=139 +','=140 +'.'=141 +'{'=142 +'}'=143 +'['=144 +']'=145 +'('=146 +')'=147 +'<'=148 +'>'=149 +'&'=150 +'='=151 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.ts b/src/capability-language/generated/QuixosCapabilityLexer.ts index 0c5c6f3..55141a5 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.ts +++ b/src/capability-language/generated/QuixosCapabilityLexer.ts @@ -87,79 +87,81 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public static readonly SEMANTIC_MAJOR = 81; public static readonly ON_DELETE = 82; public static readonly LIFECYCLE = 83; - public static readonly RETAIN_OTHER = 84; - public static readonly KEYED = 85; - public static readonly PUBLIC_TRAVERSAL = 86; - public static readonly ID = 87; - public static readonly DOC = 88; - public static readonly MODE = 89; - public static readonly EMITS = 90; - public static readonly RECEIVER = 91; - public static readonly REQUIRES = 92; - public static readonly ANY = 93; - public static readonly GET = 94; - public static readonly SET = 95; - public static readonly WATCH = 96; - public static readonly START = 97; - public static readonly STOP = 98; - public static readonly READ = 99; - public static readonly WRITE = 100; - public static readonly RESOLVE = 101; - public static readonly CONNECT = 102; - public static readonly DISCONNECT = 103; - public static readonly CALL = 104; - public static readonly WATCH_START = 105; - public static readonly WATCH_STOP = 106; - public static readonly SUBSCRIBE = 107; - public static readonly UNSUBSCRIBE = 108; - public static readonly REGISTER = 109; - public static readonly CRDT = 110; - public static readonly OPTIONAL_ONE = 111; - public static readonly EXACTLY_ONE = 112; - public static readonly MANY_UNIQUE = 113; - public static readonly MANY = 114; - public static readonly ORDERED = 115; - public static readonly UNIT = 116; - public static readonly WATCH_HANDLE = 117; - public static readonly MESSAGE = 118; - public static readonly ATOM_REF = 119; - public static readonly INTERFACE_REF = 120; - public static readonly OPTIONAL = 121; - public static readonly LIST = 122; - public static readonly RECORD = 123; - public static readonly BOOL = 124; - public static readonly BYTES = 125; - public static readonly DOUBLE = 126; - public static readonly INT32 = 127; - public static readonly INT64 = 128; - public static readonly STRING = 129; - public static readonly UINT32 = 130; - public static readonly UINT64 = 131; - public static readonly TRUE = 132; - public static readonly FALSE = 133; - public static readonly NULL = 134; - public static readonly ARROW = 135; - public static readonly COLON = 136; - public static readonly SEMI = 137; - public static readonly COMMA = 138; - public static readonly DOT = 139; - public static readonly LBRACE = 140; - public static readonly RBRACE = 141; - public static readonly LBRACK = 142; - public static readonly RBRACK = 143; - public static readonly LPAREN = 144; - public static readonly RPAREN = 145; - public static readonly LT = 146; - public static readonly GT = 147; - public static readonly AMP = 148; - public static readonly EQUAL = 149; - public static readonly INTEGER = 150; - public static readonly JSON_NUMBER = 151; - public static readonly IDENTIFIER = 152; - public static readonly STRING_LITERAL = 153; - public static readonly LINE_COMMENT = 154; - public static readonly BLOCK_COMMENT = 155; - public static readonly WS = 156; + public static readonly JOURNAL = 84; + public static readonly SUBSCRIPTION = 85; + public static readonly RETAIN_OTHER = 86; + public static readonly KEYED = 87; + public static readonly PUBLIC_TRAVERSAL = 88; + public static readonly ID = 89; + public static readonly DOC = 90; + public static readonly MODE = 91; + public static readonly EMITS = 92; + public static readonly RECEIVER = 93; + public static readonly REQUIRES = 94; + public static readonly ANY = 95; + public static readonly GET = 96; + public static readonly SET = 97; + public static readonly WATCH = 98; + public static readonly START = 99; + public static readonly STOP = 100; + public static readonly READ = 101; + public static readonly WRITE = 102; + public static readonly RESOLVE = 103; + public static readonly CONNECT = 104; + public static readonly DISCONNECT = 105; + public static readonly CALL = 106; + public static readonly WATCH_START = 107; + public static readonly WATCH_STOP = 108; + public static readonly SUBSCRIBE = 109; + public static readonly UNSUBSCRIBE = 110; + public static readonly REGISTER = 111; + public static readonly CRDT = 112; + public static readonly OPTIONAL_ONE = 113; + public static readonly EXACTLY_ONE = 114; + public static readonly MANY_UNIQUE = 115; + public static readonly MANY = 116; + public static readonly ORDERED = 117; + public static readonly UNIT = 118; + public static readonly WATCH_HANDLE = 119; + public static readonly MESSAGE = 120; + public static readonly ATOM_REF = 121; + public static readonly INTERFACE_REF = 122; + public static readonly OPTIONAL = 123; + public static readonly LIST = 124; + public static readonly RECORD = 125; + public static readonly BOOL = 126; + public static readonly BYTES = 127; + public static readonly DOUBLE = 128; + public static readonly INT32 = 129; + public static readonly INT64 = 130; + public static readonly STRING = 131; + public static readonly UINT32 = 132; + public static readonly UINT64 = 133; + public static readonly TRUE = 134; + public static readonly FALSE = 135; + public static readonly NULL = 136; + public static readonly ARROW = 137; + public static readonly COLON = 138; + public static readonly SEMI = 139; + public static readonly COMMA = 140; + public static readonly DOT = 141; + public static readonly LBRACE = 142; + public static readonly RBRACE = 143; + public static readonly LBRACK = 144; + public static readonly RBRACK = 145; + public static readonly LPAREN = 146; + public static readonly RPAREN = 147; + public static readonly LT = 148; + public static readonly GT = 149; + public static readonly AMP = 150; + public static readonly EQUAL = 151; + public static readonly INTEGER = 152; + public static readonly JSON_NUMBER = 153; + public static readonly IDENTIFIER = 154; + public static readonly STRING_LITERAL = 155; + public static readonly LINE_COMMENT = 156; + public static readonly BLOCK_COMMENT = 157; + public static readonly WS = 158; public static readonly channelNames = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" @@ -181,17 +183,18 @@ export class QuixosCapabilityLexer extends antlr.Lexer { "'edge'", "'projection'", "'with'", "'using'", "'accept'", "'via'", "'materialize'", "'if'", "'absent'", "'on'", "'policy'", "'default'", "'source'", "'repository'", "'commit'", "'revision'", "'semantic-major'", - "'on-delete'", "'lifecycle'", "'retain-other'", "'keyed'", "'public-traversal'", - "'id'", "'doc'", "'mode'", "'emits'", "'receiver'", "'requires'", - "'any'", "'get'", "'set'", "'watch'", "'start'", "'stop'", "'read'", - "'write'", "'resolve'", "'connect'", "'disconnect'", "'call'", "'watch-start'", - "'watch-stop'", "'subscribe'", "'unsubscribe'", "'register'", "'crdt'", - "'optional-one'", "'exactly-one'", "'many-unique'", "'many'", "'ordered'", - "'unit'", "'watch-handle'", "'message'", "'atom-ref'", "'interface-ref'", - "'optional'", "'list'", "'record'", "'bool'", "'bytes'", "'double'", - "'int32'", "'int64'", "'string'", "'uint32'", "'uint64'", "'true'", - "'false'", "'null'", "'->'", "':'", "';'", "','", "'.'", "'{'", - "'}'", "'['", "']'", "'('", "')'", "'<'", "'>'", "'&'", "'='" + "'on-delete'", "'lifecycle'", "'journal'", "'subscription'", "'retain-other'", + "'keyed'", "'public-traversal'", "'id'", "'doc'", "'mode'", "'emits'", + "'receiver'", "'requires'", "'any'", "'get'", "'set'", "'watch'", + "'start'", "'stop'", "'read'", "'write'", "'resolve'", "'connect'", + "'disconnect'", "'call'", "'watch-start'", "'watch-stop'", "'subscribe'", + "'unsubscribe'", "'register'", "'crdt'", "'optional-one'", "'exactly-one'", + "'many-unique'", "'many'", "'ordered'", "'unit'", "'watch-handle'", + "'message'", "'atom-ref'", "'interface-ref'", "'optional'", "'list'", + "'record'", "'bool'", "'bytes'", "'double'", "'int32'", "'int64'", + "'string'", "'uint32'", "'uint64'", "'true'", "'false'", "'null'", + "'->'", "':'", "';'", "','", "'.'", "'{'", "'}'", "'['", "']'", + "'('", "')'", "'<'", "'>'", "'&'", "'='" ]; public static readonly symbolicNames = [ @@ -208,18 +211,18 @@ export class QuixosCapabilityLexer extends antlr.Lexer { "STATE", "EDGE", "PROJECTION", "WITH", "USING", "ACCEPT", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", - "LIFECYCLE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", - "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", - "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", - "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", - "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", - "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", - "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", "BOOL", - "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", - "TRUE", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", - "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", - "GT", "AMP", "EQUAL", "INTEGER", "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", - "LINE_COMMENT", "BLOCK_COMMENT", "WS" + "LIFECYCLE", "JOURNAL", "SUBSCRIPTION", "RETAIN_OTHER", "KEYED", + "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", + "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", "WRITE", + "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", + "SUBSCRIBE", "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", + "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", + "MESSAGE", "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", + "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", + "UINT64", "TRUE", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", + "DOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", + "LT", "GT", "AMP", "EQUAL", "INTEGER", "JSON_NUMBER", "IDENTIFIER", + "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", "WS" ]; public static readonly modeNames = [ @@ -240,18 +243,19 @@ export class QuixosCapabilityLexer extends antlr.Lexer { "STATE", "EDGE", "PROJECTION", "WITH", "USING", "ACCEPT", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", - "LIFECYCLE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", - "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", - "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", - "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", - "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", - "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", - "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", "BOOL", - "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", - "TRUE", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", - "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", - "GT", "AMP", "EQUAL", "INTEGER", "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", - "ESC", "HEX", "LINE_COMMENT", "BLOCK_COMMENT", "WS", + "LIFECYCLE", "JOURNAL", "SUBSCRIPTION", "RETAIN_OTHER", "KEYED", + "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", + "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", "WRITE", + "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", + "SUBSCRIBE", "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", + "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", + "MESSAGE", "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", + "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", + "UINT64", "TRUE", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", + "DOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", + "LT", "GT", "AMP", "EQUAL", "INTEGER", "JSON_NUMBER", "IDENTIFIER", + "STRING_LITERAL", "ESC", "HEX", "LINE_COMMENT", "BLOCK_COMMENT", + "WS", ]; @@ -273,7 +277,7 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public get modeNames(): string[] { return QuixosCapabilityLexer.modeNames; } public static readonly _serializedATN: number[] = [ - 4,0,156,1498,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, + 4,0,158,1523,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, @@ -298,534 +302,543 @@ export class QuixosCapabilityLexer extends antlr.Lexer { 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,1,0, - 1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2, - 1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3, - 1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,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,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8, - 1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9, - 1,9,1,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,1, - 11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1, - 12,1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1, - 13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,15,1,15,1, - 15,1,15,1,15,1,15,1,15,1,15,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1, - 16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17,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,20,1, - 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,21,1,21,1,21,1,21,1,21,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,22,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1, - 24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,25,1,25,1,25,1,25,1,25,1, - 25,1,25,1,25,1,25,1,25,1,25,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,27,1,28,1,28,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,30,1,30,1,30,1,30,1, - 31,1,31,1,31,1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,33,1,33,1, - 33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,35,1, - 35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,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,38,1,38,1,38,1,38,1,39,1,39,1,39,1,39,1,39,1,39,1, - 39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,41,1,41,1,41,1,41,1, - 41,1,41,1,41,1,41,1,41,1,42,1,42,1,42,1,42,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,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,45,1,46,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,48,1,48,1,48,1,48,1,48,1,48,1,49,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,50,1,51,1,51,1, - 51,1,51,1,51,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,52,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1, - 53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,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,56,1,56,1,56,1,56,1,56,1,56,1, - 56,1,56,1,57,1,57,1,57,1,58,1,58,1,58,1,58,1,58,1,59,1,59,1,59,1, - 59,1,59,1,59,1,59,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,61,1, - 61,1,61,1,62,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,64,1,64,1,64,1,64,1,64,1,65,1,65,1,65,1,65,1,65,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,68,1,68,1,68,1,68,1,68,1,68,1,68,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,70,1,70,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, - 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, - 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, - 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,79,1,79,1,80,1,80,1,80,1, - 80,1,80,1,80,1,80,1,80,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,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,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,85,1, - 85,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1, - 85,1,85,1,85,1,86,1,86,1,86,1,87,1,87,1,87,1,87,1,88,1,88,1,88,1, - 88,1,88,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,91,1,91,1,91,1,91,1, - 92,1,92,1,92,1,92,1,93,1,93,1,93,1,93,1,94,1,94,1,94,1,94,1,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,100,1,100,1,101,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,102,1,102,1,102,1,102,1,102,1,102,1,103,1,103,1,103,1,103,1,103, - 1,104,1,104,1,104,1,104,1,104,1,104,1,104,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, + 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,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1, + 3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,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,7,1,7,1,7,1,7,1, + 7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1, + 9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10, + 1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11, + 1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13, + 1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14, + 1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,16,1,16,1,16, + 1,16,1,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17, + 1,17,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,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,21, + 1,21,1,21,1,21,1,21,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,22,1,23,1,23,1,23,1,23,1,23, + 1,23,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,25, + 1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,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,27,1,28,1,28, + 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,30,1,30,1,30,1,30,1,31,1,31,1,31,1,31,1,31,1,31,1,32,1,32,1,32, + 1,32,1,32,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,34, + 1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35, + 1,35,1,35,1,35,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,38,1,38,1,38,1,38,1,39,1,39, + 1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40, + 1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,42,1,42,1,42,1,42, + 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,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,45,1,46,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,48,1,48,1,48,1,48,1,48,1,48, + 1,49,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,50,1,51,1,51,1,51,1,51,1,51,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,52,1,53,1,53,1,53,1,53,1,53, + 1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,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,56,1,56, + 1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,58,1,58,1,58,1,58, + 1,58,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,61,1,61, + 1,61,1,61,1,61,1,61,1,61,1,61,1,62,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,64,1,64,1,64,1,64,1,64,1,65,1,65, + 1,65,1,65,1,65,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,68,1,68,1,68,1,68,1,68,1,68, + 1,68,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,70,1,70,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,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,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,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,79, + 1,79,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,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,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,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,84,1,84,1,84,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,85, + 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,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87, + 1,87,1,87,1,88,1,88,1,88,1,89,1,89,1,89,1,89,1,90,1,90,1,90,1,90, + 1,90,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,93,1,93,1,93,1,93,1,94, + 1,94,1,94,1,94,1,95,1,95,1,95,1,95,1,96,1,96,1,96,1,96,1,97,1,97, + 1,97,1,97,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,102,1,102,1,103, + 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,104,1,104,1,104,1,104,1,104,1,104,1,105,1,105,1,105,1,105, 1,105,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106, - 1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107, - 1,107,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,109, - 1,109,1,109,1,109,1,109,1,110,1,110,1,110,1,110,1,110,1,110,1,110, - 1,110,1,110,1,110,1,110,1,110,1,110,1,111,1,111,1,111,1,111,1,111, - 1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,112,1,112,1,112,1,112, - 1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,113,1,113,1,113, - 1,113,1,113,1,114,1,114,1,114,1,114,1,114,1,114,1,114,1,114,1,115, - 1,115,1,115,1,115,1,115,1,116,1,116,1,116,1,116,1,116,1,116,1,116, - 1,116,1,116,1,116,1,116,1,116,1,116,1,117,1,117,1,117,1,117,1,117, - 1,117,1,117,1,117,1,118,1,118,1,118,1,118,1,118,1,118,1,118,1,118, - 1,118,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119, + 1,106,1,106,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107, + 1,107,1,107,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108, + 1,108,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109, + 1,109,1,109,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110, + 1,111,1,111,1,111,1,111,1,111,1,112,1,112,1,112,1,112,1,112,1,112, + 1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,113,1,113,1,113,1,113, + 1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,114,1,114,1,114, + 1,114,1,114,1,114,1,114,1,114,1,114,1,114,1,114,1,114,1,115,1,115, + 1,115,1,115,1,115,1,116,1,116,1,116,1,116,1,116,1,116,1,116,1,116, + 1,117,1,117,1,117,1,117,1,117,1,118,1,118,1,118,1,118,1,118,1,118, + 1,118,1,118,1,118,1,118,1,118,1,118,1,118,1,119,1,119,1,119,1,119, 1,119,1,119,1,119,1,119,1,120,1,120,1,120,1,120,1,120,1,120,1,120, - 1,120,1,120,1,121,1,121,1,121,1,121,1,121,1,122,1,122,1,122,1,122, + 1,120,1,120,1,121,1,121,1,121,1,121,1,121,1,121,1,121,1,121,1,121, + 1,121,1,121,1,121,1,121,1,121,1,122,1,122,1,122,1,122,1,122,1,122, 1,122,1,122,1,122,1,123,1,123,1,123,1,123,1,123,1,124,1,124,1,124, - 1,124,1,124,1,124,1,125,1,125,1,125,1,125,1,125,1,125,1,125,1,126, - 1,126,1,126,1,126,1,126,1,126,1,127,1,127,1,127,1,127,1,127,1,127, - 1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,129,1,129,1,129,1,129, - 1,129,1,129,1,129,1,130,1,130,1,130,1,130,1,130,1,130,1,130,1,131, - 1,131,1,131,1,131,1,131,1,132,1,132,1,132,1,132,1,132,1,132,1,133, - 1,133,1,133,1,133,1,133,1,134,1,134,1,134,1,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,144,1,144,1,145,1,145,1,146,1,146,1,147,1,147, - 1,148,1,148,1,149,3,149,1399,8,149,1,149,4,149,1402,8,149,11,149, - 12,149,1403,1,150,3,150,1407,8,150,1,150,1,150,1,150,5,150,1412, - 8,150,10,150,12,150,1415,9,150,3,150,1417,8,150,1,150,1,150,4,150, - 1421,8,150,11,150,12,150,1422,3,150,1425,8,150,1,150,1,150,3,150, - 1429,8,150,1,150,4,150,1432,8,150,11,150,12,150,1433,3,150,1436, - 8,150,1,151,1,151,5,151,1440,8,151,10,151,12,151,1443,9,151,1,152, - 1,152,1,152,5,152,1448,8,152,10,152,12,152,1451,9,152,1,152,1,152, - 1,153,1,153,1,153,1,153,1,153,1,153,1,153,1,153,3,153,1463,8,153, - 1,154,1,154,1,155,1,155,1,155,1,155,5,155,1471,8,155,10,155,12,155, - 1474,9,155,1,155,1,155,1,156,1,156,1,156,1,156,5,156,1482,8,156, - 10,156,12,156,1485,9,156,1,156,1,156,1,156,1,156,1,156,1,157,4,157, - 1493,8,157,11,157,12,157,1494,1,157,1,157,1,1483,0,158,1,1,3,2,5, - 3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13,27,14,29,15, - 31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,47,24,49,25,51,26, - 53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,69,35,71,36,73,37, - 75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45,91,46,93,47,95,48, - 97,49,99,50,101,51,103,52,105,53,107,54,109,55,111,56,113,57,115, - 58,117,59,119,60,121,61,123,62,125,63,127,64,129,65,131,66,133,67, - 135,68,137,69,139,70,141,71,143,72,145,73,147,74,149,75,151,76,153, - 77,155,78,157,79,159,80,161,81,163,82,165,83,167,84,169,85,171,86, - 173,87,175,88,177,89,179,90,181,91,183,92,185,93,187,94,189,95,191, - 96,193,97,195,98,197,99,199,100,201,101,203,102,205,103,207,104, - 209,105,211,106,213,107,215,108,217,109,219,110,221,111,223,112, - 225,113,227,114,229,115,231,116,233,117,235,118,237,119,239,120, - 241,121,243,122,245,123,247,124,249,125,251,126,253,127,255,128, - 257,129,259,130,261,131,263,132,265,133,267,134,269,135,271,136, - 273,137,275,138,277,139,279,140,281,141,283,142,285,143,287,144, - 289,145,291,146,293,147,295,148,297,149,299,150,301,151,303,152, - 305,153,307,0,309,0,311,154,313,155,315,156,1,0,11,1,0,48,57,1,0, - 49,57,2,0,69,69,101,101,2,0,43,43,45,45,3,0,65,90,95,95,97,122,4, - 0,48,57,65,90,95,95,97,122,4,0,10,10,13,13,34,34,92,92,8,0,34,34, - 47,47,92,92,98,98,102,102,110,110,114,114,116,116,3,0,48,57,65,70, - 97,102,2,0,10,10,13,13,3,0,9,10,13,13,32,32,1512,0,1,1,0,0,0,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,229,1,0,0,0,0,231,1,0, - 0,0,0,233,1,0,0,0,0,235,1,0,0,0,0,237,1,0,0,0,0,239,1,0,0,0,0,241, - 1,0,0,0,0,243,1,0,0,0,0,245,1,0,0,0,0,247,1,0,0,0,0,249,1,0,0,0, - 0,251,1,0,0,0,0,253,1,0,0,0,0,255,1,0,0,0,0,257,1,0,0,0,0,259,1, - 0,0,0,0,261,1,0,0,0,0,263,1,0,0,0,0,265,1,0,0,0,0,267,1,0,0,0,0, - 269,1,0,0,0,0,271,1,0,0,0,0,273,1,0,0,0,0,275,1,0,0,0,0,277,1,0, - 0,0,0,279,1,0,0,0,0,281,1,0,0,0,0,283,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,311,1,0,0,0,0,313,1,0,0,0,0,315,1,0,0,0,1,317,1,0,0,0,3, - 322,1,0,0,0,5,329,1,0,0,0,7,338,1,0,0,0,9,351,1,0,0,0,11,359,1,0, - 0,0,13,363,1,0,0,0,15,372,1,0,0,0,17,380,1,0,0,0,19,389,1,0,0,0, - 21,400,1,0,0,0,23,410,1,0,0,0,25,420,1,0,0,0,27,429,1,0,0,0,29,441, - 1,0,0,0,31,448,1,0,0,0,33,456,1,0,0,0,35,465,1,0,0,0,37,473,1,0, - 0,0,39,479,1,0,0,0,41,484,1,0,0,0,43,497,1,0,0,0,45,507,1,0,0,0, - 47,519,1,0,0,0,49,525,1,0,0,0,51,536,1,0,0,0,53,547,1,0,0,0,55,552, - 1,0,0,0,57,561,1,0,0,0,59,571,1,0,0,0,61,576,1,0,0,0,63,580,1,0, - 0,0,65,586,1,0,0,0,67,591,1,0,0,0,69,601,1,0,0,0,71,605,1,0,0,0, - 73,618,1,0,0,0,75,623,1,0,0,0,77,630,1,0,0,0,79,639,1,0,0,0,81,650, - 1,0,0,0,83,654,1,0,0,0,85,663,1,0,0,0,87,670,1,0,0,0,89,679,1,0, - 0,0,91,684,1,0,0,0,93,694,1,0,0,0,95,705,1,0,0,0,97,713,1,0,0,0, - 99,719,1,0,0,0,101,725,1,0,0,0,103,734,1,0,0,0,105,744,1,0,0,0,107, - 753,1,0,0,0,109,765,1,0,0,0,111,776,1,0,0,0,113,782,1,0,0,0,115, - 790,1,0,0,0,117,793,1,0,0,0,119,798,1,0,0,0,121,805,1,0,0,0,123, - 808,1,0,0,0,125,816,1,0,0,0,127,823,1,0,0,0,129,829,1,0,0,0,131, - 834,1,0,0,0,133,845,1,0,0,0,135,850,1,0,0,0,137,856,1,0,0,0,139, - 863,1,0,0,0,141,867,1,0,0,0,143,879,1,0,0,0,145,882,1,0,0,0,147, - 889,1,0,0,0,149,892,1,0,0,0,151,899,1,0,0,0,153,907,1,0,0,0,155, - 914,1,0,0,0,157,925,1,0,0,0,159,932,1,0,0,0,161,941,1,0,0,0,163, - 956,1,0,0,0,165,966,1,0,0,0,167,976,1,0,0,0,169,989,1,0,0,0,171, - 995,1,0,0,0,173,1012,1,0,0,0,175,1015,1,0,0,0,177,1019,1,0,0,0,179, - 1024,1,0,0,0,181,1030,1,0,0,0,183,1039,1,0,0,0,185,1048,1,0,0,0, - 187,1052,1,0,0,0,189,1056,1,0,0,0,191,1060,1,0,0,0,193,1066,1,0, - 0,0,195,1072,1,0,0,0,197,1077,1,0,0,0,199,1082,1,0,0,0,201,1088, - 1,0,0,0,203,1096,1,0,0,0,205,1104,1,0,0,0,207,1115,1,0,0,0,209,1120, - 1,0,0,0,211,1132,1,0,0,0,213,1143,1,0,0,0,215,1153,1,0,0,0,217,1165, - 1,0,0,0,219,1174,1,0,0,0,221,1179,1,0,0,0,223,1192,1,0,0,0,225,1204, - 1,0,0,0,227,1216,1,0,0,0,229,1221,1,0,0,0,231,1229,1,0,0,0,233,1234, - 1,0,0,0,235,1247,1,0,0,0,237,1255,1,0,0,0,239,1264,1,0,0,0,241,1278, - 1,0,0,0,243,1287,1,0,0,0,245,1292,1,0,0,0,247,1299,1,0,0,0,249,1304, - 1,0,0,0,251,1310,1,0,0,0,253,1317,1,0,0,0,255,1323,1,0,0,0,257,1329, - 1,0,0,0,259,1336,1,0,0,0,261,1343,1,0,0,0,263,1350,1,0,0,0,265,1355, - 1,0,0,0,267,1361,1,0,0,0,269,1366,1,0,0,0,271,1369,1,0,0,0,273,1371, - 1,0,0,0,275,1373,1,0,0,0,277,1375,1,0,0,0,279,1377,1,0,0,0,281,1379, - 1,0,0,0,283,1381,1,0,0,0,285,1383,1,0,0,0,287,1385,1,0,0,0,289,1387, - 1,0,0,0,291,1389,1,0,0,0,293,1391,1,0,0,0,295,1393,1,0,0,0,297,1395, - 1,0,0,0,299,1398,1,0,0,0,301,1406,1,0,0,0,303,1437,1,0,0,0,305,1444, - 1,0,0,0,307,1454,1,0,0,0,309,1464,1,0,0,0,311,1466,1,0,0,0,313,1477, - 1,0,0,0,315,1492,1,0,0,0,317,318,5,101,0,0,318,319,5,100,0,0,319, - 320,5,105,0,0,320,321,5,116,0,0,321,2,1,0,0,0,322,323,5,109,0,0, - 323,324,5,111,0,0,324,325,5,100,0,0,325,326,5,117,0,0,326,327,5, - 108,0,0,327,328,5,101,0,0,328,4,1,0,0,0,329,330,5,99,0,0,330,331, - 5,111,0,0,331,332,5,110,0,0,332,333,5,116,0,0,333,334,5,114,0,0, - 334,335,5,97,0,0,335,336,5,99,0,0,336,337,5,116,0,0,337,6,1,0,0, - 0,338,339,5,112,0,0,339,340,5,114,0,0,340,341,5,101,0,0,341,342, - 5,115,0,0,342,343,5,101,0,0,343,344,5,110,0,0,344,345,5,116,0,0, - 345,346,5,97,0,0,346,347,5,116,0,0,347,348,5,105,0,0,348,349,5,111, - 0,0,349,350,5,110,0,0,350,8,1,0,0,0,351,352,5,115,0,0,352,353,5, - 117,0,0,353,354,5,98,0,0,354,355,5,106,0,0,355,356,5,101,0,0,356, - 357,5,99,0,0,357,358,5,116,0,0,358,10,1,0,0,0,359,360,5,102,0,0, - 360,361,5,111,0,0,361,362,5,114,0,0,362,12,1,0,0,0,363,364,5,99, - 0,0,364,365,5,114,0,0,365,366,5,101,0,0,366,367,5,97,0,0,367,368, - 5,116,0,0,368,369,5,105,0,0,369,370,5,111,0,0,370,371,5,110,0,0, - 371,14,1,0,0,0,372,373,5,118,0,0,373,374,5,97,0,0,374,375,5,114, - 0,0,375,376,5,105,0,0,376,377,5,97,0,0,377,378,5,110,0,0,378,379, - 5,116,0,0,379,16,1,0,0,0,380,381,5,112,0,0,381,382,5,114,0,0,382, - 383,5,101,0,0,383,384,5,112,0,0,384,385,5,97,0,0,385,386,5,114,0, - 0,386,387,5,101,0,0,387,388,5,115,0,0,388,18,1,0,0,0,389,390,5,105, - 0,0,390,391,5,110,0,0,391,392,5,105,0,0,392,393,5,116,0,0,393,394, - 5,105,0,0,394,395,5,97,0,0,395,396,5,108,0,0,396,397,5,105,0,0,397, - 398,5,122,0,0,398,399,5,101,0,0,399,20,1,0,0,0,400,401,5,119,0,0, - 401,402,5,111,0,0,402,403,5,114,0,0,403,404,5,107,0,0,404,405,5, - 115,0,0,405,406,5,112,0,0,406,407,5,97,0,0,407,408,5,99,0,0,408, - 409,5,101,0,0,409,22,1,0,0,0,410,411,5,101,0,0,411,412,5,120,0,0, - 412,413,5,101,0,0,413,414,5,99,0,0,414,415,5,117,0,0,415,416,5,116, - 0,0,416,417,5,105,0,0,417,418,5,111,0,0,418,419,5,110,0,0,419,24, - 1,0,0,0,420,421,5,115,0,0,421,422,5,110,0,0,422,423,5,97,0,0,423, - 424,5,112,0,0,424,425,5,115,0,0,425,426,5,104,0,0,426,427,5,111, - 0,0,427,428,5,116,0,0,428,26,1,0,0,0,429,430,5,116,0,0,430,431,5, - 114,0,0,431,432,5,97,0,0,432,433,5,110,0,0,433,434,5,115,0,0,434, - 435,5,97,0,0,435,436,5,99,0,0,436,437,5,116,0,0,437,438,5,105,0, - 0,438,439,5,111,0,0,439,440,5,110,0,0,440,28,1,0,0,0,441,442,5,114, - 0,0,442,443,5,101,0,0,443,444,5,109,0,0,444,445,5,111,0,0,445,446, - 5,116,0,0,446,447,5,101,0,0,447,30,1,0,0,0,448,449,5,116,0,0,449, - 450,5,97,0,0,450,451,5,114,0,0,451,452,5,103,0,0,452,453,5,101,0, - 0,453,454,5,116,0,0,454,455,5,115,0,0,455,32,1,0,0,0,456,457,5,112, - 0,0,457,458,5,111,0,0,458,459,5,114,0,0,459,460,5,116,0,0,460,461, - 5,97,0,0,461,462,5,98,0,0,462,463,5,108,0,0,463,464,5,101,0,0,464, - 34,1,0,0,0,465,466,5,114,0,0,466,467,5,101,0,0,467,468,5,112,0,0, - 468,469,5,108,0,0,469,470,5,105,0,0,470,471,5,99,0,0,471,472,5,97, - 0,0,472,36,1,0,0,0,473,474,5,108,0,0,474,475,5,111,0,0,475,476,5, - 99,0,0,476,477,5,97,0,0,477,478,5,108,0,0,478,38,1,0,0,0,479,480, - 5,102,0,0,480,481,5,114,0,0,481,482,5,111,0,0,482,483,5,109,0,0, - 483,40,1,0,0,0,484,485,5,114,0,0,485,486,5,101,0,0,486,487,5,115, - 0,0,487,488,5,117,0,0,488,489,5,108,0,0,489,490,5,116,0,0,490,491, - 5,45,0,0,491,492,5,98,0,0,492,493,5,121,0,0,493,494,5,116,0,0,494, - 495,5,101,0,0,495,496,5,115,0,0,496,42,1,0,0,0,497,498,5,114,0,0, - 498,499,5,112,0,0,499,500,5,99,0,0,500,501,5,45,0,0,501,502,5,99, - 0,0,502,503,5,97,0,0,503,504,5,108,0,0,504,505,5,108,0,0,505,506, - 5,115,0,0,506,44,1,0,0,0,507,508,5,100,0,0,508,509,5,101,0,0,509, - 510,5,97,0,0,510,511,5,100,0,0,511,512,5,108,0,0,512,513,5,105,0, - 0,513,514,5,110,0,0,514,515,5,101,0,0,515,516,5,45,0,0,516,517,5, - 109,0,0,517,518,5,115,0,0,518,46,1,0,0,0,519,520,5,113,0,0,520,521, - 5,117,0,0,521,522,5,101,0,0,522,523,5,114,0,0,523,524,5,121,0,0, - 524,48,1,0,0,0,525,526,5,114,0,0,526,527,5,101,0,0,527,528,5,102, - 0,0,528,529,5,108,0,0,529,530,5,101,0,0,530,531,5,99,0,0,531,532, - 5,116,0,0,532,533,5,105,0,0,533,534,5,111,0,0,534,535,5,110,0,0, - 535,50,1,0,0,0,536,537,5,115,0,0,537,538,5,112,0,0,538,539,5,101, - 0,0,539,540,5,99,0,0,540,541,5,105,0,0,541,542,5,97,0,0,542,543, - 5,108,0,0,543,544,5,105,0,0,544,545,5,122,0,0,545,546,5,101,0,0, - 546,52,1,0,0,0,547,548,5,114,0,0,548,549,5,111,0,0,549,550,5,111, - 0,0,550,551,5,116,0,0,551,54,1,0,0,0,552,553,5,100,0,0,553,554,5, - 111,0,0,554,555,5,99,0,0,555,556,5,117,0,0,556,557,5,109,0,0,557, - 558,5,101,0,0,558,559,5,110,0,0,559,560,5,116,0,0,560,56,1,0,0,0, - 561,562,5,102,0,0,562,563,5,114,0,0,563,564,5,97,0,0,564,565,5,103, - 0,0,565,566,5,109,0,0,566,567,5,101,0,0,567,568,5,110,0,0,568,569, - 5,116,0,0,569,570,5,115,0,0,570,58,1,0,0,0,571,572,5,118,0,0,572, - 573,5,105,0,0,573,574,5,101,0,0,574,575,5,119,0,0,575,60,1,0,0,0, - 576,577,5,109,0,0,577,578,5,97,0,0,578,579,5,120,0,0,579,62,1,0, - 0,0,580,581,5,97,0,0,581,582,5,108,0,0,582,583,5,108,0,0,583,584, - 5,111,0,0,584,585,5,119,0,0,585,64,1,0,0,0,586,587,5,112,0,0,587, - 588,5,111,0,0,588,589,5,108,0,0,589,590,5,108,0,0,590,66,1,0,0,0, - 591,592,5,113,0,0,592,593,5,117,0,0,593,594,5,101,0,0,594,595,5, - 114,0,0,595,596,5,121,0,0,596,597,5,97,0,0,597,598,5,98,0,0,598, - 599,5,108,0,0,599,600,5,101,0,0,600,68,1,0,0,0,601,602,5,114,0,0, - 602,603,5,112,0,0,603,604,5,99,0,0,604,70,1,0,0,0,605,606,5,113, - 0,0,606,607,5,117,0,0,607,608,5,101,0,0,608,609,5,114,0,0,609,610, - 5,121,0,0,610,611,5,45,0,0,611,612,5,114,0,0,612,613,5,101,0,0,613, - 614,5,97,0,0,614,615,5,115,0,0,615,616,5,111,0,0,616,617,5,110,0, - 0,617,72,1,0,0,0,618,619,5,116,0,0,619,620,5,121,0,0,620,621,5,112, - 0,0,621,622,5,101,0,0,622,74,1,0,0,0,623,624,5,111,0,0,624,625,5, - 98,0,0,625,626,5,106,0,0,626,627,5,101,0,0,627,628,5,99,0,0,628, - 629,5,116,0,0,629,76,1,0,0,0,630,631,5,115,0,0,631,632,5,116,0,0, - 632,633,5,111,0,0,633,634,5,114,0,0,634,635,5,97,0,0,635,636,5,98, - 0,0,636,637,5,108,0,0,637,638,5,101,0,0,638,78,1,0,0,0,639,640,5, - 105,0,0,640,641,5,109,0,0,641,642,5,112,0,0,642,643,5,108,0,0,643, - 644,5,101,0,0,644,645,5,109,0,0,645,646,5,101,0,0,646,647,5,110, - 0,0,647,648,5,116,0,0,648,649,5,115,0,0,649,80,1,0,0,0,650,651,5, - 114,0,0,651,652,5,101,0,0,652,653,5,102,0,0,653,82,1,0,0,0,654,655, - 5,102,0,0,655,656,5,114,0,0,656,657,5,97,0,0,657,658,5,103,0,0,658, - 659,5,109,0,0,659,660,5,101,0,0,660,661,5,110,0,0,661,662,5,116, - 0,0,662,84,1,0,0,0,663,664,5,105,0,0,664,665,5,109,0,0,665,666,5, - 112,0,0,666,667,5,111,0,0,667,668,5,114,0,0,668,669,5,116,0,0,669, - 86,1,0,0,0,670,671,5,101,0,0,671,672,5,120,0,0,672,673,5,116,0,0, - 673,674,5,101,0,0,674,675,5,114,0,0,675,676,5,110,0,0,676,677,5, - 97,0,0,677,678,5,108,0,0,678,88,1,0,0,0,679,680,5,97,0,0,680,681, - 5,116,0,0,681,682,5,111,0,0,682,683,5,109,0,0,683,90,1,0,0,0,684, - 685,5,105,0,0,685,686,5,110,0,0,686,687,5,116,0,0,687,688,5,101, - 0,0,688,689,5,114,0,0,689,690,5,102,0,0,690,691,5,97,0,0,691,692, - 5,99,0,0,692,693,5,101,0,0,693,92,1,0,0,0,694,695,5,105,0,0,695, - 696,5,110,0,0,696,697,5,116,0,0,697,698,5,101,0,0,698,699,5,114, - 0,0,699,700,5,102,0,0,700,701,5,97,0,0,701,702,5,99,0,0,702,703, - 5,101,0,0,703,704,5,115,0,0,704,94,1,0,0,0,705,706,5,112,0,0,706, - 707,5,97,0,0,707,708,5,99,0,0,708,709,5,107,0,0,709,710,5,97,0,0, - 710,711,5,103,0,0,711,712,5,101,0,0,712,96,1,0,0,0,713,714,5,118, - 0,0,714,715,5,97,0,0,715,716,5,108,0,0,716,717,5,117,0,0,717,718, - 5,101,0,0,718,98,1,0,0,0,719,720,5,102,0,0,720,721,5,105,0,0,721, - 722,5,101,0,0,722,723,5,108,0,0,723,724,5,100,0,0,724,100,1,0,0, - 0,725,726,5,114,0,0,726,727,5,101,0,0,727,728,5,108,0,0,728,729, - 5,97,0,0,729,730,5,116,0,0,730,731,5,105,0,0,731,732,5,111,0,0,732, - 733,5,110,0,0,733,102,1,0,0,0,734,735,5,111,0,0,735,736,5,112,0, - 0,736,737,5,101,0,0,737,738,5,114,0,0,738,739,5,97,0,0,739,740,5, - 116,0,0,740,741,5,105,0,0,741,742,5,111,0,0,742,743,5,110,0,0,743, - 104,1,0,0,0,744,745,5,102,0,0,745,746,5,117,0,0,746,747,5,110,0, - 0,747,748,5,99,0,0,748,749,5,116,0,0,749,750,5,105,0,0,750,751,5, - 111,0,0,751,752,5,110,0,0,752,106,1,0,0,0,753,754,5,99,0,0,754,755, - 5,111,0,0,755,756,5,110,0,0,756,757,5,115,0,0,757,758,5,116,0,0, - 758,759,5,114,0,0,759,760,5,117,0,0,760,761,5,99,0,0,761,762,5,116, - 0,0,762,763,5,111,0,0,763,764,5,114,0,0,764,108,1,0,0,0,765,766, - 5,99,0,0,766,767,5,111,0,0,767,768,5,110,0,0,768,769,5,115,0,0,769, - 770,5,116,0,0,770,771,5,114,0,0,771,772,5,117,0,0,772,773,5,99,0, - 0,773,774,5,116,0,0,774,775,5,115,0,0,775,110,1,0,0,0,776,777,5, - 105,0,0,777,778,5,110,0,0,778,779,5,112,0,0,779,780,5,117,0,0,780, - 781,5,116,0,0,781,112,1,0,0,0,782,783,5,99,0,0,783,784,5,111,0,0, - 784,785,5,110,0,0,785,786,5,102,0,0,786,787,5,111,0,0,787,788,5, - 114,0,0,788,789,5,109,0,0,789,114,1,0,0,0,790,791,5,97,0,0,791,792, - 5,115,0,0,792,116,1,0,0,0,793,794,5,98,0,0,794,795,5,105,0,0,795, - 796,5,110,0,0,796,797,5,100,0,0,797,118,1,0,0,0,798,799,5,115,0, - 0,799,800,5,116,0,0,800,801,5,97,0,0,801,802,5,116,0,0,802,803,5, - 105,0,0,803,804,5,99,0,0,804,120,1,0,0,0,805,806,5,116,0,0,806,807, - 5,111,0,0,807,122,1,0,0,0,808,809,5,112,0,0,809,810,5,114,0,0,810, - 811,5,105,0,0,811,812,5,118,0,0,812,813,5,97,0,0,813,814,5,116,0, - 0,814,815,5,101,0,0,815,124,1,0,0,0,816,817,5,115,0,0,817,818,5, - 104,0,0,818,819,5,97,0,0,819,820,5,114,0,0,820,821,5,101,0,0,821, - 822,5,100,0,0,822,126,1,0,0,0,823,824,5,115,0,0,824,825,5,116,0, - 0,825,826,5,97,0,0,826,827,5,116,0,0,827,828,5,101,0,0,828,128,1, - 0,0,0,829,830,5,101,0,0,830,831,5,100,0,0,831,832,5,103,0,0,832, - 833,5,101,0,0,833,130,1,0,0,0,834,835,5,112,0,0,835,836,5,114,0, - 0,836,837,5,111,0,0,837,838,5,106,0,0,838,839,5,101,0,0,839,840, - 5,99,0,0,840,841,5,116,0,0,841,842,5,105,0,0,842,843,5,111,0,0,843, - 844,5,110,0,0,844,132,1,0,0,0,845,846,5,119,0,0,846,847,5,105,0, - 0,847,848,5,116,0,0,848,849,5,104,0,0,849,134,1,0,0,0,850,851,5, - 117,0,0,851,852,5,115,0,0,852,853,5,105,0,0,853,854,5,110,0,0,854, - 855,5,103,0,0,855,136,1,0,0,0,856,857,5,97,0,0,857,858,5,99,0,0, - 858,859,5,99,0,0,859,860,5,101,0,0,860,861,5,112,0,0,861,862,5,116, - 0,0,862,138,1,0,0,0,863,864,5,118,0,0,864,865,5,105,0,0,865,866, - 5,97,0,0,866,140,1,0,0,0,867,868,5,109,0,0,868,869,5,97,0,0,869, - 870,5,116,0,0,870,871,5,101,0,0,871,872,5,114,0,0,872,873,5,105, - 0,0,873,874,5,97,0,0,874,875,5,108,0,0,875,876,5,105,0,0,876,877, - 5,122,0,0,877,878,5,101,0,0,878,142,1,0,0,0,879,880,5,105,0,0,880, - 881,5,102,0,0,881,144,1,0,0,0,882,883,5,97,0,0,883,884,5,98,0,0, - 884,885,5,115,0,0,885,886,5,101,0,0,886,887,5,110,0,0,887,888,5, - 116,0,0,888,146,1,0,0,0,889,890,5,111,0,0,890,891,5,110,0,0,891, - 148,1,0,0,0,892,893,5,112,0,0,893,894,5,111,0,0,894,895,5,108,0, - 0,895,896,5,105,0,0,896,897,5,99,0,0,897,898,5,121,0,0,898,150,1, - 0,0,0,899,900,5,100,0,0,900,901,5,101,0,0,901,902,5,102,0,0,902, - 903,5,97,0,0,903,904,5,117,0,0,904,905,5,108,0,0,905,906,5,116,0, - 0,906,152,1,0,0,0,907,908,5,115,0,0,908,909,5,111,0,0,909,910,5, - 117,0,0,910,911,5,114,0,0,911,912,5,99,0,0,912,913,5,101,0,0,913, - 154,1,0,0,0,914,915,5,114,0,0,915,916,5,101,0,0,916,917,5,112,0, - 0,917,918,5,111,0,0,918,919,5,115,0,0,919,920,5,105,0,0,920,921, - 5,116,0,0,921,922,5,111,0,0,922,923,5,114,0,0,923,924,5,121,0,0, - 924,156,1,0,0,0,925,926,5,99,0,0,926,927,5,111,0,0,927,928,5,109, - 0,0,928,929,5,109,0,0,929,930,5,105,0,0,930,931,5,116,0,0,931,158, - 1,0,0,0,932,933,5,114,0,0,933,934,5,101,0,0,934,935,5,118,0,0,935, - 936,5,105,0,0,936,937,5,115,0,0,937,938,5,105,0,0,938,939,5,111, - 0,0,939,940,5,110,0,0,940,160,1,0,0,0,941,942,5,115,0,0,942,943, - 5,101,0,0,943,944,5,109,0,0,944,945,5,97,0,0,945,946,5,110,0,0,946, - 947,5,116,0,0,947,948,5,105,0,0,948,949,5,99,0,0,949,950,5,45,0, - 0,950,951,5,109,0,0,951,952,5,97,0,0,952,953,5,106,0,0,953,954,5, - 111,0,0,954,955,5,114,0,0,955,162,1,0,0,0,956,957,5,111,0,0,957, - 958,5,110,0,0,958,959,5,45,0,0,959,960,5,100,0,0,960,961,5,101,0, - 0,961,962,5,108,0,0,962,963,5,101,0,0,963,964,5,116,0,0,964,965, - 5,101,0,0,965,164,1,0,0,0,966,967,5,108,0,0,967,968,5,105,0,0,968, - 969,5,102,0,0,969,970,5,101,0,0,970,971,5,99,0,0,971,972,5,121,0, - 0,972,973,5,99,0,0,973,974,5,108,0,0,974,975,5,101,0,0,975,166,1, - 0,0,0,976,977,5,114,0,0,977,978,5,101,0,0,978,979,5,116,0,0,979, - 980,5,97,0,0,980,981,5,105,0,0,981,982,5,110,0,0,982,983,5,45,0, - 0,983,984,5,111,0,0,984,985,5,116,0,0,985,986,5,104,0,0,986,987, - 5,101,0,0,987,988,5,114,0,0,988,168,1,0,0,0,989,990,5,107,0,0,990, - 991,5,101,0,0,991,992,5,121,0,0,992,993,5,101,0,0,993,994,5,100, - 0,0,994,170,1,0,0,0,995,996,5,112,0,0,996,997,5,117,0,0,997,998, - 5,98,0,0,998,999,5,108,0,0,999,1000,5,105,0,0,1000,1001,5,99,0,0, - 1001,1002,5,45,0,0,1002,1003,5,116,0,0,1003,1004,5,114,0,0,1004, - 1005,5,97,0,0,1005,1006,5,118,0,0,1006,1007,5,101,0,0,1007,1008, - 5,114,0,0,1008,1009,5,115,0,0,1009,1010,5,97,0,0,1010,1011,5,108, - 0,0,1011,172,1,0,0,0,1012,1013,5,105,0,0,1013,1014,5,100,0,0,1014, - 174,1,0,0,0,1015,1016,5,100,0,0,1016,1017,5,111,0,0,1017,1018,5, - 99,0,0,1018,176,1,0,0,0,1019,1020,5,109,0,0,1020,1021,5,111,0,0, - 1021,1022,5,100,0,0,1022,1023,5,101,0,0,1023,178,1,0,0,0,1024,1025, - 5,101,0,0,1025,1026,5,109,0,0,1026,1027,5,105,0,0,1027,1028,5,116, - 0,0,1028,1029,5,115,0,0,1029,180,1,0,0,0,1030,1031,5,114,0,0,1031, - 1032,5,101,0,0,1032,1033,5,99,0,0,1033,1034,5,101,0,0,1034,1035, - 5,105,0,0,1035,1036,5,118,0,0,1036,1037,5,101,0,0,1037,1038,5,114, - 0,0,1038,182,1,0,0,0,1039,1040,5,114,0,0,1040,1041,5,101,0,0,1041, - 1042,5,113,0,0,1042,1043,5,117,0,0,1043,1044,5,105,0,0,1044,1045, - 5,114,0,0,1045,1046,5,101,0,0,1046,1047,5,115,0,0,1047,184,1,0,0, - 0,1048,1049,5,97,0,0,1049,1050,5,110,0,0,1050,1051,5,121,0,0,1051, - 186,1,0,0,0,1052,1053,5,103,0,0,1053,1054,5,101,0,0,1054,1055,5, - 116,0,0,1055,188,1,0,0,0,1056,1057,5,115,0,0,1057,1058,5,101,0,0, - 1058,1059,5,116,0,0,1059,190,1,0,0,0,1060,1061,5,119,0,0,1061,1062, - 5,97,0,0,1062,1063,5,116,0,0,1063,1064,5,99,0,0,1064,1065,5,104, - 0,0,1065,192,1,0,0,0,1066,1067,5,115,0,0,1067,1068,5,116,0,0,1068, - 1069,5,97,0,0,1069,1070,5,114,0,0,1070,1071,5,116,0,0,1071,194,1, - 0,0,0,1072,1073,5,115,0,0,1073,1074,5,116,0,0,1074,1075,5,111,0, - 0,1075,1076,5,112,0,0,1076,196,1,0,0,0,1077,1078,5,114,0,0,1078, - 1079,5,101,0,0,1079,1080,5,97,0,0,1080,1081,5,100,0,0,1081,198,1, - 0,0,0,1082,1083,5,119,0,0,1083,1084,5,114,0,0,1084,1085,5,105,0, - 0,1085,1086,5,116,0,0,1086,1087,5,101,0,0,1087,200,1,0,0,0,1088, - 1089,5,114,0,0,1089,1090,5,101,0,0,1090,1091,5,115,0,0,1091,1092, - 5,111,0,0,1092,1093,5,108,0,0,1093,1094,5,118,0,0,1094,1095,5,101, - 0,0,1095,202,1,0,0,0,1096,1097,5,99,0,0,1097,1098,5,111,0,0,1098, - 1099,5,110,0,0,1099,1100,5,110,0,0,1100,1101,5,101,0,0,1101,1102, - 5,99,0,0,1102,1103,5,116,0,0,1103,204,1,0,0,0,1104,1105,5,100,0, - 0,1105,1106,5,105,0,0,1106,1107,5,115,0,0,1107,1108,5,99,0,0,1108, - 1109,5,111,0,0,1109,1110,5,110,0,0,1110,1111,5,110,0,0,1111,1112, - 5,101,0,0,1112,1113,5,99,0,0,1113,1114,5,116,0,0,1114,206,1,0,0, - 0,1115,1116,5,99,0,0,1116,1117,5,97,0,0,1117,1118,5,108,0,0,1118, - 1119,5,108,0,0,1119,208,1,0,0,0,1120,1121,5,119,0,0,1121,1122,5, - 97,0,0,1122,1123,5,116,0,0,1123,1124,5,99,0,0,1124,1125,5,104,0, - 0,1125,1126,5,45,0,0,1126,1127,5,115,0,0,1127,1128,5,116,0,0,1128, - 1129,5,97,0,0,1129,1130,5,114,0,0,1130,1131,5,116,0,0,1131,210,1, - 0,0,0,1132,1133,5,119,0,0,1133,1134,5,97,0,0,1134,1135,5,116,0,0, - 1135,1136,5,99,0,0,1136,1137,5,104,0,0,1137,1138,5,45,0,0,1138,1139, - 5,115,0,0,1139,1140,5,116,0,0,1140,1141,5,111,0,0,1141,1142,5,112, - 0,0,1142,212,1,0,0,0,1143,1144,5,115,0,0,1144,1145,5,117,0,0,1145, - 1146,5,98,0,0,1146,1147,5,115,0,0,1147,1148,5,99,0,0,1148,1149,5, - 114,0,0,1149,1150,5,105,0,0,1150,1151,5,98,0,0,1151,1152,5,101,0, - 0,1152,214,1,0,0,0,1153,1154,5,117,0,0,1154,1155,5,110,0,0,1155, - 1156,5,115,0,0,1156,1157,5,117,0,0,1157,1158,5,98,0,0,1158,1159, - 5,115,0,0,1159,1160,5,99,0,0,1160,1161,5,114,0,0,1161,1162,5,105, - 0,0,1162,1163,5,98,0,0,1163,1164,5,101,0,0,1164,216,1,0,0,0,1165, - 1166,5,114,0,0,1166,1167,5,101,0,0,1167,1168,5,103,0,0,1168,1169, - 5,105,0,0,1169,1170,5,115,0,0,1170,1171,5,116,0,0,1171,1172,5,101, - 0,0,1172,1173,5,114,0,0,1173,218,1,0,0,0,1174,1175,5,99,0,0,1175, - 1176,5,114,0,0,1176,1177,5,100,0,0,1177,1178,5,116,0,0,1178,220, - 1,0,0,0,1179,1180,5,111,0,0,1180,1181,5,112,0,0,1181,1182,5,116, - 0,0,1182,1183,5,105,0,0,1183,1184,5,111,0,0,1184,1185,5,110,0,0, - 1185,1186,5,97,0,0,1186,1187,5,108,0,0,1187,1188,5,45,0,0,1188,1189, - 5,111,0,0,1189,1190,5,110,0,0,1190,1191,5,101,0,0,1191,222,1,0,0, - 0,1192,1193,5,101,0,0,1193,1194,5,120,0,0,1194,1195,5,97,0,0,1195, - 1196,5,99,0,0,1196,1197,5,116,0,0,1197,1198,5,108,0,0,1198,1199, - 5,121,0,0,1199,1200,5,45,0,0,1200,1201,5,111,0,0,1201,1202,5,110, - 0,0,1202,1203,5,101,0,0,1203,224,1,0,0,0,1204,1205,5,109,0,0,1205, - 1206,5,97,0,0,1206,1207,5,110,0,0,1207,1208,5,121,0,0,1208,1209, - 5,45,0,0,1209,1210,5,117,0,0,1210,1211,5,110,0,0,1211,1212,5,105, - 0,0,1212,1213,5,113,0,0,1213,1214,5,117,0,0,1214,1215,5,101,0,0, - 1215,226,1,0,0,0,1216,1217,5,109,0,0,1217,1218,5,97,0,0,1218,1219, - 5,110,0,0,1219,1220,5,121,0,0,1220,228,1,0,0,0,1221,1222,5,111,0, - 0,1222,1223,5,114,0,0,1223,1224,5,100,0,0,1224,1225,5,101,0,0,1225, - 1226,5,114,0,0,1226,1227,5,101,0,0,1227,1228,5,100,0,0,1228,230, - 1,0,0,0,1229,1230,5,117,0,0,1230,1231,5,110,0,0,1231,1232,5,105, - 0,0,1232,1233,5,116,0,0,1233,232,1,0,0,0,1234,1235,5,119,0,0,1235, - 1236,5,97,0,0,1236,1237,5,116,0,0,1237,1238,5,99,0,0,1238,1239,5, - 104,0,0,1239,1240,5,45,0,0,1240,1241,5,104,0,0,1241,1242,5,97,0, - 0,1242,1243,5,110,0,0,1243,1244,5,100,0,0,1244,1245,5,108,0,0,1245, - 1246,5,101,0,0,1246,234,1,0,0,0,1247,1248,5,109,0,0,1248,1249,5, - 101,0,0,1249,1250,5,115,0,0,1250,1251,5,115,0,0,1251,1252,5,97,0, - 0,1252,1253,5,103,0,0,1253,1254,5,101,0,0,1254,236,1,0,0,0,1255, - 1256,5,97,0,0,1256,1257,5,116,0,0,1257,1258,5,111,0,0,1258,1259, - 5,109,0,0,1259,1260,5,45,0,0,1260,1261,5,114,0,0,1261,1262,5,101, - 0,0,1262,1263,5,102,0,0,1263,238,1,0,0,0,1264,1265,5,105,0,0,1265, - 1266,5,110,0,0,1266,1267,5,116,0,0,1267,1268,5,101,0,0,1268,1269, - 5,114,0,0,1269,1270,5,102,0,0,1270,1271,5,97,0,0,1271,1272,5,99, - 0,0,1272,1273,5,101,0,0,1273,1274,5,45,0,0,1274,1275,5,114,0,0,1275, - 1276,5,101,0,0,1276,1277,5,102,0,0,1277,240,1,0,0,0,1278,1279,5, - 111,0,0,1279,1280,5,112,0,0,1280,1281,5,116,0,0,1281,1282,5,105, - 0,0,1282,1283,5,111,0,0,1283,1284,5,110,0,0,1284,1285,5,97,0,0,1285, - 1286,5,108,0,0,1286,242,1,0,0,0,1287,1288,5,108,0,0,1288,1289,5, - 105,0,0,1289,1290,5,115,0,0,1290,1291,5,116,0,0,1291,244,1,0,0,0, - 1292,1293,5,114,0,0,1293,1294,5,101,0,0,1294,1295,5,99,0,0,1295, - 1296,5,111,0,0,1296,1297,5,114,0,0,1297,1298,5,100,0,0,1298,246, - 1,0,0,0,1299,1300,5,98,0,0,1300,1301,5,111,0,0,1301,1302,5,111,0, - 0,1302,1303,5,108,0,0,1303,248,1,0,0,0,1304,1305,5,98,0,0,1305,1306, - 5,121,0,0,1306,1307,5,116,0,0,1307,1308,5,101,0,0,1308,1309,5,115, - 0,0,1309,250,1,0,0,0,1310,1311,5,100,0,0,1311,1312,5,111,0,0,1312, - 1313,5,117,0,0,1313,1314,5,98,0,0,1314,1315,5,108,0,0,1315,1316, - 5,101,0,0,1316,252,1,0,0,0,1317,1318,5,105,0,0,1318,1319,5,110,0, - 0,1319,1320,5,116,0,0,1320,1321,5,51,0,0,1321,1322,5,50,0,0,1322, - 254,1,0,0,0,1323,1324,5,105,0,0,1324,1325,5,110,0,0,1325,1326,5, - 116,0,0,1326,1327,5,54,0,0,1327,1328,5,52,0,0,1328,256,1,0,0,0,1329, - 1330,5,115,0,0,1330,1331,5,116,0,0,1331,1332,5,114,0,0,1332,1333, - 5,105,0,0,1333,1334,5,110,0,0,1334,1335,5,103,0,0,1335,258,1,0,0, - 0,1336,1337,5,117,0,0,1337,1338,5,105,0,0,1338,1339,5,110,0,0,1339, - 1340,5,116,0,0,1340,1341,5,51,0,0,1341,1342,5,50,0,0,1342,260,1, - 0,0,0,1343,1344,5,117,0,0,1344,1345,5,105,0,0,1345,1346,5,110,0, - 0,1346,1347,5,116,0,0,1347,1348,5,54,0,0,1348,1349,5,52,0,0,1349, - 262,1,0,0,0,1350,1351,5,116,0,0,1351,1352,5,114,0,0,1352,1353,5, - 117,0,0,1353,1354,5,101,0,0,1354,264,1,0,0,0,1355,1356,5,102,0,0, - 1356,1357,5,97,0,0,1357,1358,5,108,0,0,1358,1359,5,115,0,0,1359, - 1360,5,101,0,0,1360,266,1,0,0,0,1361,1362,5,110,0,0,1362,1363,5, - 117,0,0,1363,1364,5,108,0,0,1364,1365,5,108,0,0,1365,268,1,0,0,0, - 1366,1367,5,45,0,0,1367,1368,5,62,0,0,1368,270,1,0,0,0,1369,1370, - 5,58,0,0,1370,272,1,0,0,0,1371,1372,5,59,0,0,1372,274,1,0,0,0,1373, - 1374,5,44,0,0,1374,276,1,0,0,0,1375,1376,5,46,0,0,1376,278,1,0,0, - 0,1377,1378,5,123,0,0,1378,280,1,0,0,0,1379,1380,5,125,0,0,1380, - 282,1,0,0,0,1381,1382,5,91,0,0,1382,284,1,0,0,0,1383,1384,5,93,0, - 0,1384,286,1,0,0,0,1385,1386,5,40,0,0,1386,288,1,0,0,0,1387,1388, - 5,41,0,0,1388,290,1,0,0,0,1389,1390,5,60,0,0,1390,292,1,0,0,0,1391, - 1392,5,62,0,0,1392,294,1,0,0,0,1393,1394,5,38,0,0,1394,296,1,0,0, - 0,1395,1396,5,61,0,0,1396,298,1,0,0,0,1397,1399,5,45,0,0,1398,1397, - 1,0,0,0,1398,1399,1,0,0,0,1399,1401,1,0,0,0,1400,1402,7,0,0,0,1401, - 1400,1,0,0,0,1402,1403,1,0,0,0,1403,1401,1,0,0,0,1403,1404,1,0,0, - 0,1404,300,1,0,0,0,1405,1407,5,45,0,0,1406,1405,1,0,0,0,1406,1407, - 1,0,0,0,1407,1416,1,0,0,0,1408,1417,5,48,0,0,1409,1413,7,1,0,0,1410, - 1412,7,0,0,0,1411,1410,1,0,0,0,1412,1415,1,0,0,0,1413,1411,1,0,0, - 0,1413,1414,1,0,0,0,1414,1417,1,0,0,0,1415,1413,1,0,0,0,1416,1408, - 1,0,0,0,1416,1409,1,0,0,0,1417,1424,1,0,0,0,1418,1420,5,46,0,0,1419, - 1421,7,0,0,0,1420,1419,1,0,0,0,1421,1422,1,0,0,0,1422,1420,1,0,0, - 0,1422,1423,1,0,0,0,1423,1425,1,0,0,0,1424,1418,1,0,0,0,1424,1425, - 1,0,0,0,1425,1435,1,0,0,0,1426,1428,7,2,0,0,1427,1429,7,3,0,0,1428, - 1427,1,0,0,0,1428,1429,1,0,0,0,1429,1431,1,0,0,0,1430,1432,7,0,0, - 0,1431,1430,1,0,0,0,1432,1433,1,0,0,0,1433,1431,1,0,0,0,1433,1434, - 1,0,0,0,1434,1436,1,0,0,0,1435,1426,1,0,0,0,1435,1436,1,0,0,0,1436, - 302,1,0,0,0,1437,1441,7,4,0,0,1438,1440,7,5,0,0,1439,1438,1,0,0, - 0,1440,1443,1,0,0,0,1441,1439,1,0,0,0,1441,1442,1,0,0,0,1442,304, - 1,0,0,0,1443,1441,1,0,0,0,1444,1449,5,34,0,0,1445,1448,3,307,153, - 0,1446,1448,8,6,0,0,1447,1445,1,0,0,0,1447,1446,1,0,0,0,1448,1451, - 1,0,0,0,1449,1447,1,0,0,0,1449,1450,1,0,0,0,1450,1452,1,0,0,0,1451, - 1449,1,0,0,0,1452,1453,5,34,0,0,1453,306,1,0,0,0,1454,1462,5,92, - 0,0,1455,1463,7,7,0,0,1456,1457,5,117,0,0,1457,1458,3,309,154,0, - 1458,1459,3,309,154,0,1459,1460,3,309,154,0,1460,1461,3,309,154, - 0,1461,1463,1,0,0,0,1462,1455,1,0,0,0,1462,1456,1,0,0,0,1463,308, - 1,0,0,0,1464,1465,7,8,0,0,1465,310,1,0,0,0,1466,1467,5,47,0,0,1467, - 1468,5,47,0,0,1468,1472,1,0,0,0,1469,1471,8,9,0,0,1470,1469,1,0, - 0,0,1471,1474,1,0,0,0,1472,1470,1,0,0,0,1472,1473,1,0,0,0,1473,1475, - 1,0,0,0,1474,1472,1,0,0,0,1475,1476,6,155,0,0,1476,312,1,0,0,0,1477, - 1478,5,47,0,0,1478,1479,5,42,0,0,1479,1483,1,0,0,0,1480,1482,9,0, - 0,0,1481,1480,1,0,0,0,1482,1485,1,0,0,0,1483,1484,1,0,0,0,1483,1481, - 1,0,0,0,1484,1486,1,0,0,0,1485,1483,1,0,0,0,1486,1487,5,42,0,0,1487, - 1488,5,47,0,0,1488,1489,1,0,0,0,1489,1490,6,156,0,0,1490,314,1,0, - 0,0,1491,1493,7,10,0,0,1492,1491,1,0,0,0,1493,1494,1,0,0,0,1494, - 1492,1,0,0,0,1494,1495,1,0,0,0,1495,1496,1,0,0,0,1496,1497,6,157, - 0,0,1497,316,1,0,0,0,18,0,1398,1403,1406,1413,1416,1422,1424,1428, - 1433,1435,1441,1447,1449,1462,1472,1483,1494,1,0,1,0 + 1,124,1,124,1,124,1,124,1,125,1,125,1,125,1,125,1,125,1,126,1,126, + 1,126,1,126,1,126,1,126,1,127,1,127,1,127,1,127,1,127,1,127,1,127, + 1,128,1,128,1,128,1,128,1,128,1,128,1,129,1,129,1,129,1,129,1,129, + 1,129,1,130,1,130,1,130,1,130,1,130,1,130,1,130,1,131,1,131,1,131, + 1,131,1,131,1,131,1,131,1,132,1,132,1,132,1,132,1,132,1,132,1,132, + 1,133,1,133,1,133,1,133,1,133,1,134,1,134,1,134,1,134,1,134,1,134, + 1,135,1,135,1,135,1,135,1,135,1,136,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,144,1,144,1,145,1,145,1,146,1,146,1,147,1,147,1,148,1,148,1,149, + 1,149,1,150,1,150,1,151,3,151,1424,8,151,1,151,4,151,1427,8,151, + 11,151,12,151,1428,1,152,3,152,1432,8,152,1,152,1,152,1,152,5,152, + 1437,8,152,10,152,12,152,1440,9,152,3,152,1442,8,152,1,152,1,152, + 4,152,1446,8,152,11,152,12,152,1447,3,152,1450,8,152,1,152,1,152, + 3,152,1454,8,152,1,152,4,152,1457,8,152,11,152,12,152,1458,3,152, + 1461,8,152,1,153,1,153,5,153,1465,8,153,10,153,12,153,1468,9,153, + 1,154,1,154,1,154,5,154,1473,8,154,10,154,12,154,1476,9,154,1,154, + 1,154,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,3,155,1488, + 8,155,1,156,1,156,1,157,1,157,1,157,1,157,5,157,1496,8,157,10,157, + 12,157,1499,9,157,1,157,1,157,1,158,1,158,1,158,1,158,5,158,1507, + 8,158,10,158,12,158,1510,9,158,1,158,1,158,1,158,1,158,1,158,1,159, + 4,159,1518,8,159,11,159,12,159,1519,1,159,1,159,1,1508,0,160,1,1, + 3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13,27,14, + 29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,47,24,49,25, + 51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,69,35,71,36, + 73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45,91,46,93,47, + 95,48,97,49,99,50,101,51,103,52,105,53,107,54,109,55,111,56,113, + 57,115,58,117,59,119,60,121,61,123,62,125,63,127,64,129,65,131,66, + 133,67,135,68,137,69,139,70,141,71,143,72,145,73,147,74,149,75,151, + 76,153,77,155,78,157,79,159,80,161,81,163,82,165,83,167,84,169,85, + 171,86,173,87,175,88,177,89,179,90,181,91,183,92,185,93,187,94,189, + 95,191,96,193,97,195,98,197,99,199,100,201,101,203,102,205,103,207, + 104,209,105,211,106,213,107,215,108,217,109,219,110,221,111,223, + 112,225,113,227,114,229,115,231,116,233,117,235,118,237,119,239, + 120,241,121,243,122,245,123,247,124,249,125,251,126,253,127,255, + 128,257,129,259,130,261,131,263,132,265,133,267,134,269,135,271, + 136,273,137,275,138,277,139,279,140,281,141,283,142,285,143,287, + 144,289,145,291,146,293,147,295,148,297,149,299,150,301,151,303, + 152,305,153,307,154,309,155,311,0,313,0,315,156,317,157,319,158, + 1,0,11,1,0,48,57,1,0,49,57,2,0,69,69,101,101,2,0,43,43,45,45,3,0, + 65,90,95,95,97,122,4,0,48,57,65,90,95,95,97,122,4,0,10,10,13,13, + 34,34,92,92,8,0,34,34,47,47,92,92,98,98,102,102,110,110,114,114, + 116,116,3,0,48,57,65,70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32, + 32,1537,0,1,1,0,0,0,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, + 229,1,0,0,0,0,231,1,0,0,0,0,233,1,0,0,0,0,235,1,0,0,0,0,237,1,0, + 0,0,0,239,1,0,0,0,0,241,1,0,0,0,0,243,1,0,0,0,0,245,1,0,0,0,0,247, + 1,0,0,0,0,249,1,0,0,0,0,251,1,0,0,0,0,253,1,0,0,0,0,255,1,0,0,0, + 0,257,1,0,0,0,0,259,1,0,0,0,0,261,1,0,0,0,0,263,1,0,0,0,0,265,1, + 0,0,0,0,267,1,0,0,0,0,269,1,0,0,0,0,271,1,0,0,0,0,273,1,0,0,0,0, + 275,1,0,0,0,0,277,1,0,0,0,0,279,1,0,0,0,0,281,1,0,0,0,0,283,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,315,1, + 0,0,0,0,317,1,0,0,0,0,319,1,0,0,0,1,321,1,0,0,0,3,326,1,0,0,0,5, + 333,1,0,0,0,7,342,1,0,0,0,9,355,1,0,0,0,11,363,1,0,0,0,13,367,1, + 0,0,0,15,376,1,0,0,0,17,384,1,0,0,0,19,393,1,0,0,0,21,404,1,0,0, + 0,23,414,1,0,0,0,25,424,1,0,0,0,27,433,1,0,0,0,29,445,1,0,0,0,31, + 452,1,0,0,0,33,460,1,0,0,0,35,469,1,0,0,0,37,477,1,0,0,0,39,483, + 1,0,0,0,41,488,1,0,0,0,43,501,1,0,0,0,45,511,1,0,0,0,47,523,1,0, + 0,0,49,529,1,0,0,0,51,540,1,0,0,0,53,551,1,0,0,0,55,556,1,0,0,0, + 57,565,1,0,0,0,59,575,1,0,0,0,61,580,1,0,0,0,63,584,1,0,0,0,65,590, + 1,0,0,0,67,595,1,0,0,0,69,605,1,0,0,0,71,609,1,0,0,0,73,622,1,0, + 0,0,75,627,1,0,0,0,77,634,1,0,0,0,79,643,1,0,0,0,81,654,1,0,0,0, + 83,658,1,0,0,0,85,667,1,0,0,0,87,674,1,0,0,0,89,683,1,0,0,0,91,688, + 1,0,0,0,93,698,1,0,0,0,95,709,1,0,0,0,97,717,1,0,0,0,99,723,1,0, + 0,0,101,729,1,0,0,0,103,738,1,0,0,0,105,748,1,0,0,0,107,757,1,0, + 0,0,109,769,1,0,0,0,111,780,1,0,0,0,113,786,1,0,0,0,115,794,1,0, + 0,0,117,797,1,0,0,0,119,802,1,0,0,0,121,809,1,0,0,0,123,812,1,0, + 0,0,125,820,1,0,0,0,127,827,1,0,0,0,129,833,1,0,0,0,131,838,1,0, + 0,0,133,849,1,0,0,0,135,854,1,0,0,0,137,860,1,0,0,0,139,867,1,0, + 0,0,141,871,1,0,0,0,143,883,1,0,0,0,145,886,1,0,0,0,147,893,1,0, + 0,0,149,896,1,0,0,0,151,903,1,0,0,0,153,911,1,0,0,0,155,918,1,0, + 0,0,157,929,1,0,0,0,159,936,1,0,0,0,161,945,1,0,0,0,163,960,1,0, + 0,0,165,970,1,0,0,0,167,980,1,0,0,0,169,988,1,0,0,0,171,1001,1,0, + 0,0,173,1014,1,0,0,0,175,1020,1,0,0,0,177,1037,1,0,0,0,179,1040, + 1,0,0,0,181,1044,1,0,0,0,183,1049,1,0,0,0,185,1055,1,0,0,0,187,1064, + 1,0,0,0,189,1073,1,0,0,0,191,1077,1,0,0,0,193,1081,1,0,0,0,195,1085, + 1,0,0,0,197,1091,1,0,0,0,199,1097,1,0,0,0,201,1102,1,0,0,0,203,1107, + 1,0,0,0,205,1113,1,0,0,0,207,1121,1,0,0,0,209,1129,1,0,0,0,211,1140, + 1,0,0,0,213,1145,1,0,0,0,215,1157,1,0,0,0,217,1168,1,0,0,0,219,1178, + 1,0,0,0,221,1190,1,0,0,0,223,1199,1,0,0,0,225,1204,1,0,0,0,227,1217, + 1,0,0,0,229,1229,1,0,0,0,231,1241,1,0,0,0,233,1246,1,0,0,0,235,1254, + 1,0,0,0,237,1259,1,0,0,0,239,1272,1,0,0,0,241,1280,1,0,0,0,243,1289, + 1,0,0,0,245,1303,1,0,0,0,247,1312,1,0,0,0,249,1317,1,0,0,0,251,1324, + 1,0,0,0,253,1329,1,0,0,0,255,1335,1,0,0,0,257,1342,1,0,0,0,259,1348, + 1,0,0,0,261,1354,1,0,0,0,263,1361,1,0,0,0,265,1368,1,0,0,0,267,1375, + 1,0,0,0,269,1380,1,0,0,0,271,1386,1,0,0,0,273,1391,1,0,0,0,275,1394, + 1,0,0,0,277,1396,1,0,0,0,279,1398,1,0,0,0,281,1400,1,0,0,0,283,1402, + 1,0,0,0,285,1404,1,0,0,0,287,1406,1,0,0,0,289,1408,1,0,0,0,291,1410, + 1,0,0,0,293,1412,1,0,0,0,295,1414,1,0,0,0,297,1416,1,0,0,0,299,1418, + 1,0,0,0,301,1420,1,0,0,0,303,1423,1,0,0,0,305,1431,1,0,0,0,307,1462, + 1,0,0,0,309,1469,1,0,0,0,311,1479,1,0,0,0,313,1489,1,0,0,0,315,1491, + 1,0,0,0,317,1502,1,0,0,0,319,1517,1,0,0,0,321,322,5,101,0,0,322, + 323,5,100,0,0,323,324,5,105,0,0,324,325,5,116,0,0,325,2,1,0,0,0, + 326,327,5,109,0,0,327,328,5,111,0,0,328,329,5,100,0,0,329,330,5, + 117,0,0,330,331,5,108,0,0,331,332,5,101,0,0,332,4,1,0,0,0,333,334, + 5,99,0,0,334,335,5,111,0,0,335,336,5,110,0,0,336,337,5,116,0,0,337, + 338,5,114,0,0,338,339,5,97,0,0,339,340,5,99,0,0,340,341,5,116,0, + 0,341,6,1,0,0,0,342,343,5,112,0,0,343,344,5,114,0,0,344,345,5,101, + 0,0,345,346,5,115,0,0,346,347,5,101,0,0,347,348,5,110,0,0,348,349, + 5,116,0,0,349,350,5,97,0,0,350,351,5,116,0,0,351,352,5,105,0,0,352, + 353,5,111,0,0,353,354,5,110,0,0,354,8,1,0,0,0,355,356,5,115,0,0, + 356,357,5,117,0,0,357,358,5,98,0,0,358,359,5,106,0,0,359,360,5,101, + 0,0,360,361,5,99,0,0,361,362,5,116,0,0,362,10,1,0,0,0,363,364,5, + 102,0,0,364,365,5,111,0,0,365,366,5,114,0,0,366,12,1,0,0,0,367,368, + 5,99,0,0,368,369,5,114,0,0,369,370,5,101,0,0,370,371,5,97,0,0,371, + 372,5,116,0,0,372,373,5,105,0,0,373,374,5,111,0,0,374,375,5,110, + 0,0,375,14,1,0,0,0,376,377,5,118,0,0,377,378,5,97,0,0,378,379,5, + 114,0,0,379,380,5,105,0,0,380,381,5,97,0,0,381,382,5,110,0,0,382, + 383,5,116,0,0,383,16,1,0,0,0,384,385,5,112,0,0,385,386,5,114,0,0, + 386,387,5,101,0,0,387,388,5,112,0,0,388,389,5,97,0,0,389,390,5,114, + 0,0,390,391,5,101,0,0,391,392,5,115,0,0,392,18,1,0,0,0,393,394,5, + 105,0,0,394,395,5,110,0,0,395,396,5,105,0,0,396,397,5,116,0,0,397, + 398,5,105,0,0,398,399,5,97,0,0,399,400,5,108,0,0,400,401,5,105,0, + 0,401,402,5,122,0,0,402,403,5,101,0,0,403,20,1,0,0,0,404,405,5,119, + 0,0,405,406,5,111,0,0,406,407,5,114,0,0,407,408,5,107,0,0,408,409, + 5,115,0,0,409,410,5,112,0,0,410,411,5,97,0,0,411,412,5,99,0,0,412, + 413,5,101,0,0,413,22,1,0,0,0,414,415,5,101,0,0,415,416,5,120,0,0, + 416,417,5,101,0,0,417,418,5,99,0,0,418,419,5,117,0,0,419,420,5,116, + 0,0,420,421,5,105,0,0,421,422,5,111,0,0,422,423,5,110,0,0,423,24, + 1,0,0,0,424,425,5,115,0,0,425,426,5,110,0,0,426,427,5,97,0,0,427, + 428,5,112,0,0,428,429,5,115,0,0,429,430,5,104,0,0,430,431,5,111, + 0,0,431,432,5,116,0,0,432,26,1,0,0,0,433,434,5,116,0,0,434,435,5, + 114,0,0,435,436,5,97,0,0,436,437,5,110,0,0,437,438,5,115,0,0,438, + 439,5,97,0,0,439,440,5,99,0,0,440,441,5,116,0,0,441,442,5,105,0, + 0,442,443,5,111,0,0,443,444,5,110,0,0,444,28,1,0,0,0,445,446,5,114, + 0,0,446,447,5,101,0,0,447,448,5,109,0,0,448,449,5,111,0,0,449,450, + 5,116,0,0,450,451,5,101,0,0,451,30,1,0,0,0,452,453,5,116,0,0,453, + 454,5,97,0,0,454,455,5,114,0,0,455,456,5,103,0,0,456,457,5,101,0, + 0,457,458,5,116,0,0,458,459,5,115,0,0,459,32,1,0,0,0,460,461,5,112, + 0,0,461,462,5,111,0,0,462,463,5,114,0,0,463,464,5,116,0,0,464,465, + 5,97,0,0,465,466,5,98,0,0,466,467,5,108,0,0,467,468,5,101,0,0,468, + 34,1,0,0,0,469,470,5,114,0,0,470,471,5,101,0,0,471,472,5,112,0,0, + 472,473,5,108,0,0,473,474,5,105,0,0,474,475,5,99,0,0,475,476,5,97, + 0,0,476,36,1,0,0,0,477,478,5,108,0,0,478,479,5,111,0,0,479,480,5, + 99,0,0,480,481,5,97,0,0,481,482,5,108,0,0,482,38,1,0,0,0,483,484, + 5,102,0,0,484,485,5,114,0,0,485,486,5,111,0,0,486,487,5,109,0,0, + 487,40,1,0,0,0,488,489,5,114,0,0,489,490,5,101,0,0,490,491,5,115, + 0,0,491,492,5,117,0,0,492,493,5,108,0,0,493,494,5,116,0,0,494,495, + 5,45,0,0,495,496,5,98,0,0,496,497,5,121,0,0,497,498,5,116,0,0,498, + 499,5,101,0,0,499,500,5,115,0,0,500,42,1,0,0,0,501,502,5,114,0,0, + 502,503,5,112,0,0,503,504,5,99,0,0,504,505,5,45,0,0,505,506,5,99, + 0,0,506,507,5,97,0,0,507,508,5,108,0,0,508,509,5,108,0,0,509,510, + 5,115,0,0,510,44,1,0,0,0,511,512,5,100,0,0,512,513,5,101,0,0,513, + 514,5,97,0,0,514,515,5,100,0,0,515,516,5,108,0,0,516,517,5,105,0, + 0,517,518,5,110,0,0,518,519,5,101,0,0,519,520,5,45,0,0,520,521,5, + 109,0,0,521,522,5,115,0,0,522,46,1,0,0,0,523,524,5,113,0,0,524,525, + 5,117,0,0,525,526,5,101,0,0,526,527,5,114,0,0,527,528,5,121,0,0, + 528,48,1,0,0,0,529,530,5,114,0,0,530,531,5,101,0,0,531,532,5,102, + 0,0,532,533,5,108,0,0,533,534,5,101,0,0,534,535,5,99,0,0,535,536, + 5,116,0,0,536,537,5,105,0,0,537,538,5,111,0,0,538,539,5,110,0,0, + 539,50,1,0,0,0,540,541,5,115,0,0,541,542,5,112,0,0,542,543,5,101, + 0,0,543,544,5,99,0,0,544,545,5,105,0,0,545,546,5,97,0,0,546,547, + 5,108,0,0,547,548,5,105,0,0,548,549,5,122,0,0,549,550,5,101,0,0, + 550,52,1,0,0,0,551,552,5,114,0,0,552,553,5,111,0,0,553,554,5,111, + 0,0,554,555,5,116,0,0,555,54,1,0,0,0,556,557,5,100,0,0,557,558,5, + 111,0,0,558,559,5,99,0,0,559,560,5,117,0,0,560,561,5,109,0,0,561, + 562,5,101,0,0,562,563,5,110,0,0,563,564,5,116,0,0,564,56,1,0,0,0, + 565,566,5,102,0,0,566,567,5,114,0,0,567,568,5,97,0,0,568,569,5,103, + 0,0,569,570,5,109,0,0,570,571,5,101,0,0,571,572,5,110,0,0,572,573, + 5,116,0,0,573,574,5,115,0,0,574,58,1,0,0,0,575,576,5,118,0,0,576, + 577,5,105,0,0,577,578,5,101,0,0,578,579,5,119,0,0,579,60,1,0,0,0, + 580,581,5,109,0,0,581,582,5,97,0,0,582,583,5,120,0,0,583,62,1,0, + 0,0,584,585,5,97,0,0,585,586,5,108,0,0,586,587,5,108,0,0,587,588, + 5,111,0,0,588,589,5,119,0,0,589,64,1,0,0,0,590,591,5,112,0,0,591, + 592,5,111,0,0,592,593,5,108,0,0,593,594,5,108,0,0,594,66,1,0,0,0, + 595,596,5,113,0,0,596,597,5,117,0,0,597,598,5,101,0,0,598,599,5, + 114,0,0,599,600,5,121,0,0,600,601,5,97,0,0,601,602,5,98,0,0,602, + 603,5,108,0,0,603,604,5,101,0,0,604,68,1,0,0,0,605,606,5,114,0,0, + 606,607,5,112,0,0,607,608,5,99,0,0,608,70,1,0,0,0,609,610,5,113, + 0,0,610,611,5,117,0,0,611,612,5,101,0,0,612,613,5,114,0,0,613,614, + 5,121,0,0,614,615,5,45,0,0,615,616,5,114,0,0,616,617,5,101,0,0,617, + 618,5,97,0,0,618,619,5,115,0,0,619,620,5,111,0,0,620,621,5,110,0, + 0,621,72,1,0,0,0,622,623,5,116,0,0,623,624,5,121,0,0,624,625,5,112, + 0,0,625,626,5,101,0,0,626,74,1,0,0,0,627,628,5,111,0,0,628,629,5, + 98,0,0,629,630,5,106,0,0,630,631,5,101,0,0,631,632,5,99,0,0,632, + 633,5,116,0,0,633,76,1,0,0,0,634,635,5,115,0,0,635,636,5,116,0,0, + 636,637,5,111,0,0,637,638,5,114,0,0,638,639,5,97,0,0,639,640,5,98, + 0,0,640,641,5,108,0,0,641,642,5,101,0,0,642,78,1,0,0,0,643,644,5, + 105,0,0,644,645,5,109,0,0,645,646,5,112,0,0,646,647,5,108,0,0,647, + 648,5,101,0,0,648,649,5,109,0,0,649,650,5,101,0,0,650,651,5,110, + 0,0,651,652,5,116,0,0,652,653,5,115,0,0,653,80,1,0,0,0,654,655,5, + 114,0,0,655,656,5,101,0,0,656,657,5,102,0,0,657,82,1,0,0,0,658,659, + 5,102,0,0,659,660,5,114,0,0,660,661,5,97,0,0,661,662,5,103,0,0,662, + 663,5,109,0,0,663,664,5,101,0,0,664,665,5,110,0,0,665,666,5,116, + 0,0,666,84,1,0,0,0,667,668,5,105,0,0,668,669,5,109,0,0,669,670,5, + 112,0,0,670,671,5,111,0,0,671,672,5,114,0,0,672,673,5,116,0,0,673, + 86,1,0,0,0,674,675,5,101,0,0,675,676,5,120,0,0,676,677,5,116,0,0, + 677,678,5,101,0,0,678,679,5,114,0,0,679,680,5,110,0,0,680,681,5, + 97,0,0,681,682,5,108,0,0,682,88,1,0,0,0,683,684,5,97,0,0,684,685, + 5,116,0,0,685,686,5,111,0,0,686,687,5,109,0,0,687,90,1,0,0,0,688, + 689,5,105,0,0,689,690,5,110,0,0,690,691,5,116,0,0,691,692,5,101, + 0,0,692,693,5,114,0,0,693,694,5,102,0,0,694,695,5,97,0,0,695,696, + 5,99,0,0,696,697,5,101,0,0,697,92,1,0,0,0,698,699,5,105,0,0,699, + 700,5,110,0,0,700,701,5,116,0,0,701,702,5,101,0,0,702,703,5,114, + 0,0,703,704,5,102,0,0,704,705,5,97,0,0,705,706,5,99,0,0,706,707, + 5,101,0,0,707,708,5,115,0,0,708,94,1,0,0,0,709,710,5,112,0,0,710, + 711,5,97,0,0,711,712,5,99,0,0,712,713,5,107,0,0,713,714,5,97,0,0, + 714,715,5,103,0,0,715,716,5,101,0,0,716,96,1,0,0,0,717,718,5,118, + 0,0,718,719,5,97,0,0,719,720,5,108,0,0,720,721,5,117,0,0,721,722, + 5,101,0,0,722,98,1,0,0,0,723,724,5,102,0,0,724,725,5,105,0,0,725, + 726,5,101,0,0,726,727,5,108,0,0,727,728,5,100,0,0,728,100,1,0,0, + 0,729,730,5,114,0,0,730,731,5,101,0,0,731,732,5,108,0,0,732,733, + 5,97,0,0,733,734,5,116,0,0,734,735,5,105,0,0,735,736,5,111,0,0,736, + 737,5,110,0,0,737,102,1,0,0,0,738,739,5,111,0,0,739,740,5,112,0, + 0,740,741,5,101,0,0,741,742,5,114,0,0,742,743,5,97,0,0,743,744,5, + 116,0,0,744,745,5,105,0,0,745,746,5,111,0,0,746,747,5,110,0,0,747, + 104,1,0,0,0,748,749,5,102,0,0,749,750,5,117,0,0,750,751,5,110,0, + 0,751,752,5,99,0,0,752,753,5,116,0,0,753,754,5,105,0,0,754,755,5, + 111,0,0,755,756,5,110,0,0,756,106,1,0,0,0,757,758,5,99,0,0,758,759, + 5,111,0,0,759,760,5,110,0,0,760,761,5,115,0,0,761,762,5,116,0,0, + 762,763,5,114,0,0,763,764,5,117,0,0,764,765,5,99,0,0,765,766,5,116, + 0,0,766,767,5,111,0,0,767,768,5,114,0,0,768,108,1,0,0,0,769,770, + 5,99,0,0,770,771,5,111,0,0,771,772,5,110,0,0,772,773,5,115,0,0,773, + 774,5,116,0,0,774,775,5,114,0,0,775,776,5,117,0,0,776,777,5,99,0, + 0,777,778,5,116,0,0,778,779,5,115,0,0,779,110,1,0,0,0,780,781,5, + 105,0,0,781,782,5,110,0,0,782,783,5,112,0,0,783,784,5,117,0,0,784, + 785,5,116,0,0,785,112,1,0,0,0,786,787,5,99,0,0,787,788,5,111,0,0, + 788,789,5,110,0,0,789,790,5,102,0,0,790,791,5,111,0,0,791,792,5, + 114,0,0,792,793,5,109,0,0,793,114,1,0,0,0,794,795,5,97,0,0,795,796, + 5,115,0,0,796,116,1,0,0,0,797,798,5,98,0,0,798,799,5,105,0,0,799, + 800,5,110,0,0,800,801,5,100,0,0,801,118,1,0,0,0,802,803,5,115,0, + 0,803,804,5,116,0,0,804,805,5,97,0,0,805,806,5,116,0,0,806,807,5, + 105,0,0,807,808,5,99,0,0,808,120,1,0,0,0,809,810,5,116,0,0,810,811, + 5,111,0,0,811,122,1,0,0,0,812,813,5,112,0,0,813,814,5,114,0,0,814, + 815,5,105,0,0,815,816,5,118,0,0,816,817,5,97,0,0,817,818,5,116,0, + 0,818,819,5,101,0,0,819,124,1,0,0,0,820,821,5,115,0,0,821,822,5, + 104,0,0,822,823,5,97,0,0,823,824,5,114,0,0,824,825,5,101,0,0,825, + 826,5,100,0,0,826,126,1,0,0,0,827,828,5,115,0,0,828,829,5,116,0, + 0,829,830,5,97,0,0,830,831,5,116,0,0,831,832,5,101,0,0,832,128,1, + 0,0,0,833,834,5,101,0,0,834,835,5,100,0,0,835,836,5,103,0,0,836, + 837,5,101,0,0,837,130,1,0,0,0,838,839,5,112,0,0,839,840,5,114,0, + 0,840,841,5,111,0,0,841,842,5,106,0,0,842,843,5,101,0,0,843,844, + 5,99,0,0,844,845,5,116,0,0,845,846,5,105,0,0,846,847,5,111,0,0,847, + 848,5,110,0,0,848,132,1,0,0,0,849,850,5,119,0,0,850,851,5,105,0, + 0,851,852,5,116,0,0,852,853,5,104,0,0,853,134,1,0,0,0,854,855,5, + 117,0,0,855,856,5,115,0,0,856,857,5,105,0,0,857,858,5,110,0,0,858, + 859,5,103,0,0,859,136,1,0,0,0,860,861,5,97,0,0,861,862,5,99,0,0, + 862,863,5,99,0,0,863,864,5,101,0,0,864,865,5,112,0,0,865,866,5,116, + 0,0,866,138,1,0,0,0,867,868,5,118,0,0,868,869,5,105,0,0,869,870, + 5,97,0,0,870,140,1,0,0,0,871,872,5,109,0,0,872,873,5,97,0,0,873, + 874,5,116,0,0,874,875,5,101,0,0,875,876,5,114,0,0,876,877,5,105, + 0,0,877,878,5,97,0,0,878,879,5,108,0,0,879,880,5,105,0,0,880,881, + 5,122,0,0,881,882,5,101,0,0,882,142,1,0,0,0,883,884,5,105,0,0,884, + 885,5,102,0,0,885,144,1,0,0,0,886,887,5,97,0,0,887,888,5,98,0,0, + 888,889,5,115,0,0,889,890,5,101,0,0,890,891,5,110,0,0,891,892,5, + 116,0,0,892,146,1,0,0,0,893,894,5,111,0,0,894,895,5,110,0,0,895, + 148,1,0,0,0,896,897,5,112,0,0,897,898,5,111,0,0,898,899,5,108,0, + 0,899,900,5,105,0,0,900,901,5,99,0,0,901,902,5,121,0,0,902,150,1, + 0,0,0,903,904,5,100,0,0,904,905,5,101,0,0,905,906,5,102,0,0,906, + 907,5,97,0,0,907,908,5,117,0,0,908,909,5,108,0,0,909,910,5,116,0, + 0,910,152,1,0,0,0,911,912,5,115,0,0,912,913,5,111,0,0,913,914,5, + 117,0,0,914,915,5,114,0,0,915,916,5,99,0,0,916,917,5,101,0,0,917, + 154,1,0,0,0,918,919,5,114,0,0,919,920,5,101,0,0,920,921,5,112,0, + 0,921,922,5,111,0,0,922,923,5,115,0,0,923,924,5,105,0,0,924,925, + 5,116,0,0,925,926,5,111,0,0,926,927,5,114,0,0,927,928,5,121,0,0, + 928,156,1,0,0,0,929,930,5,99,0,0,930,931,5,111,0,0,931,932,5,109, + 0,0,932,933,5,109,0,0,933,934,5,105,0,0,934,935,5,116,0,0,935,158, + 1,0,0,0,936,937,5,114,0,0,937,938,5,101,0,0,938,939,5,118,0,0,939, + 940,5,105,0,0,940,941,5,115,0,0,941,942,5,105,0,0,942,943,5,111, + 0,0,943,944,5,110,0,0,944,160,1,0,0,0,945,946,5,115,0,0,946,947, + 5,101,0,0,947,948,5,109,0,0,948,949,5,97,0,0,949,950,5,110,0,0,950, + 951,5,116,0,0,951,952,5,105,0,0,952,953,5,99,0,0,953,954,5,45,0, + 0,954,955,5,109,0,0,955,956,5,97,0,0,956,957,5,106,0,0,957,958,5, + 111,0,0,958,959,5,114,0,0,959,162,1,0,0,0,960,961,5,111,0,0,961, + 962,5,110,0,0,962,963,5,45,0,0,963,964,5,100,0,0,964,965,5,101,0, + 0,965,966,5,108,0,0,966,967,5,101,0,0,967,968,5,116,0,0,968,969, + 5,101,0,0,969,164,1,0,0,0,970,971,5,108,0,0,971,972,5,105,0,0,972, + 973,5,102,0,0,973,974,5,101,0,0,974,975,5,99,0,0,975,976,5,121,0, + 0,976,977,5,99,0,0,977,978,5,108,0,0,978,979,5,101,0,0,979,166,1, + 0,0,0,980,981,5,106,0,0,981,982,5,111,0,0,982,983,5,117,0,0,983, + 984,5,114,0,0,984,985,5,110,0,0,985,986,5,97,0,0,986,987,5,108,0, + 0,987,168,1,0,0,0,988,989,5,115,0,0,989,990,5,117,0,0,990,991,5, + 98,0,0,991,992,5,115,0,0,992,993,5,99,0,0,993,994,5,114,0,0,994, + 995,5,105,0,0,995,996,5,112,0,0,996,997,5,116,0,0,997,998,5,105, + 0,0,998,999,5,111,0,0,999,1000,5,110,0,0,1000,170,1,0,0,0,1001,1002, + 5,114,0,0,1002,1003,5,101,0,0,1003,1004,5,116,0,0,1004,1005,5,97, + 0,0,1005,1006,5,105,0,0,1006,1007,5,110,0,0,1007,1008,5,45,0,0,1008, + 1009,5,111,0,0,1009,1010,5,116,0,0,1010,1011,5,104,0,0,1011,1012, + 5,101,0,0,1012,1013,5,114,0,0,1013,172,1,0,0,0,1014,1015,5,107,0, + 0,1015,1016,5,101,0,0,1016,1017,5,121,0,0,1017,1018,5,101,0,0,1018, + 1019,5,100,0,0,1019,174,1,0,0,0,1020,1021,5,112,0,0,1021,1022,5, + 117,0,0,1022,1023,5,98,0,0,1023,1024,5,108,0,0,1024,1025,5,105,0, + 0,1025,1026,5,99,0,0,1026,1027,5,45,0,0,1027,1028,5,116,0,0,1028, + 1029,5,114,0,0,1029,1030,5,97,0,0,1030,1031,5,118,0,0,1031,1032, + 5,101,0,0,1032,1033,5,114,0,0,1033,1034,5,115,0,0,1034,1035,5,97, + 0,0,1035,1036,5,108,0,0,1036,176,1,0,0,0,1037,1038,5,105,0,0,1038, + 1039,5,100,0,0,1039,178,1,0,0,0,1040,1041,5,100,0,0,1041,1042,5, + 111,0,0,1042,1043,5,99,0,0,1043,180,1,0,0,0,1044,1045,5,109,0,0, + 1045,1046,5,111,0,0,1046,1047,5,100,0,0,1047,1048,5,101,0,0,1048, + 182,1,0,0,0,1049,1050,5,101,0,0,1050,1051,5,109,0,0,1051,1052,5, + 105,0,0,1052,1053,5,116,0,0,1053,1054,5,115,0,0,1054,184,1,0,0,0, + 1055,1056,5,114,0,0,1056,1057,5,101,0,0,1057,1058,5,99,0,0,1058, + 1059,5,101,0,0,1059,1060,5,105,0,0,1060,1061,5,118,0,0,1061,1062, + 5,101,0,0,1062,1063,5,114,0,0,1063,186,1,0,0,0,1064,1065,5,114,0, + 0,1065,1066,5,101,0,0,1066,1067,5,113,0,0,1067,1068,5,117,0,0,1068, + 1069,5,105,0,0,1069,1070,5,114,0,0,1070,1071,5,101,0,0,1071,1072, + 5,115,0,0,1072,188,1,0,0,0,1073,1074,5,97,0,0,1074,1075,5,110,0, + 0,1075,1076,5,121,0,0,1076,190,1,0,0,0,1077,1078,5,103,0,0,1078, + 1079,5,101,0,0,1079,1080,5,116,0,0,1080,192,1,0,0,0,1081,1082,5, + 115,0,0,1082,1083,5,101,0,0,1083,1084,5,116,0,0,1084,194,1,0,0,0, + 1085,1086,5,119,0,0,1086,1087,5,97,0,0,1087,1088,5,116,0,0,1088, + 1089,5,99,0,0,1089,1090,5,104,0,0,1090,196,1,0,0,0,1091,1092,5,115, + 0,0,1092,1093,5,116,0,0,1093,1094,5,97,0,0,1094,1095,5,114,0,0,1095, + 1096,5,116,0,0,1096,198,1,0,0,0,1097,1098,5,115,0,0,1098,1099,5, + 116,0,0,1099,1100,5,111,0,0,1100,1101,5,112,0,0,1101,200,1,0,0,0, + 1102,1103,5,114,0,0,1103,1104,5,101,0,0,1104,1105,5,97,0,0,1105, + 1106,5,100,0,0,1106,202,1,0,0,0,1107,1108,5,119,0,0,1108,1109,5, + 114,0,0,1109,1110,5,105,0,0,1110,1111,5,116,0,0,1111,1112,5,101, + 0,0,1112,204,1,0,0,0,1113,1114,5,114,0,0,1114,1115,5,101,0,0,1115, + 1116,5,115,0,0,1116,1117,5,111,0,0,1117,1118,5,108,0,0,1118,1119, + 5,118,0,0,1119,1120,5,101,0,0,1120,206,1,0,0,0,1121,1122,5,99,0, + 0,1122,1123,5,111,0,0,1123,1124,5,110,0,0,1124,1125,5,110,0,0,1125, + 1126,5,101,0,0,1126,1127,5,99,0,0,1127,1128,5,116,0,0,1128,208,1, + 0,0,0,1129,1130,5,100,0,0,1130,1131,5,105,0,0,1131,1132,5,115,0, + 0,1132,1133,5,99,0,0,1133,1134,5,111,0,0,1134,1135,5,110,0,0,1135, + 1136,5,110,0,0,1136,1137,5,101,0,0,1137,1138,5,99,0,0,1138,1139, + 5,116,0,0,1139,210,1,0,0,0,1140,1141,5,99,0,0,1141,1142,5,97,0,0, + 1142,1143,5,108,0,0,1143,1144,5,108,0,0,1144,212,1,0,0,0,1145,1146, + 5,119,0,0,1146,1147,5,97,0,0,1147,1148,5,116,0,0,1148,1149,5,99, + 0,0,1149,1150,5,104,0,0,1150,1151,5,45,0,0,1151,1152,5,115,0,0,1152, + 1153,5,116,0,0,1153,1154,5,97,0,0,1154,1155,5,114,0,0,1155,1156, + 5,116,0,0,1156,214,1,0,0,0,1157,1158,5,119,0,0,1158,1159,5,97,0, + 0,1159,1160,5,116,0,0,1160,1161,5,99,0,0,1161,1162,5,104,0,0,1162, + 1163,5,45,0,0,1163,1164,5,115,0,0,1164,1165,5,116,0,0,1165,1166, + 5,111,0,0,1166,1167,5,112,0,0,1167,216,1,0,0,0,1168,1169,5,115,0, + 0,1169,1170,5,117,0,0,1170,1171,5,98,0,0,1171,1172,5,115,0,0,1172, + 1173,5,99,0,0,1173,1174,5,114,0,0,1174,1175,5,105,0,0,1175,1176, + 5,98,0,0,1176,1177,5,101,0,0,1177,218,1,0,0,0,1178,1179,5,117,0, + 0,1179,1180,5,110,0,0,1180,1181,5,115,0,0,1181,1182,5,117,0,0,1182, + 1183,5,98,0,0,1183,1184,5,115,0,0,1184,1185,5,99,0,0,1185,1186,5, + 114,0,0,1186,1187,5,105,0,0,1187,1188,5,98,0,0,1188,1189,5,101,0, + 0,1189,220,1,0,0,0,1190,1191,5,114,0,0,1191,1192,5,101,0,0,1192, + 1193,5,103,0,0,1193,1194,5,105,0,0,1194,1195,5,115,0,0,1195,1196, + 5,116,0,0,1196,1197,5,101,0,0,1197,1198,5,114,0,0,1198,222,1,0,0, + 0,1199,1200,5,99,0,0,1200,1201,5,114,0,0,1201,1202,5,100,0,0,1202, + 1203,5,116,0,0,1203,224,1,0,0,0,1204,1205,5,111,0,0,1205,1206,5, + 112,0,0,1206,1207,5,116,0,0,1207,1208,5,105,0,0,1208,1209,5,111, + 0,0,1209,1210,5,110,0,0,1210,1211,5,97,0,0,1211,1212,5,108,0,0,1212, + 1213,5,45,0,0,1213,1214,5,111,0,0,1214,1215,5,110,0,0,1215,1216, + 5,101,0,0,1216,226,1,0,0,0,1217,1218,5,101,0,0,1218,1219,5,120,0, + 0,1219,1220,5,97,0,0,1220,1221,5,99,0,0,1221,1222,5,116,0,0,1222, + 1223,5,108,0,0,1223,1224,5,121,0,0,1224,1225,5,45,0,0,1225,1226, + 5,111,0,0,1226,1227,5,110,0,0,1227,1228,5,101,0,0,1228,228,1,0,0, + 0,1229,1230,5,109,0,0,1230,1231,5,97,0,0,1231,1232,5,110,0,0,1232, + 1233,5,121,0,0,1233,1234,5,45,0,0,1234,1235,5,117,0,0,1235,1236, + 5,110,0,0,1236,1237,5,105,0,0,1237,1238,5,113,0,0,1238,1239,5,117, + 0,0,1239,1240,5,101,0,0,1240,230,1,0,0,0,1241,1242,5,109,0,0,1242, + 1243,5,97,0,0,1243,1244,5,110,0,0,1244,1245,5,121,0,0,1245,232,1, + 0,0,0,1246,1247,5,111,0,0,1247,1248,5,114,0,0,1248,1249,5,100,0, + 0,1249,1250,5,101,0,0,1250,1251,5,114,0,0,1251,1252,5,101,0,0,1252, + 1253,5,100,0,0,1253,234,1,0,0,0,1254,1255,5,117,0,0,1255,1256,5, + 110,0,0,1256,1257,5,105,0,0,1257,1258,5,116,0,0,1258,236,1,0,0,0, + 1259,1260,5,119,0,0,1260,1261,5,97,0,0,1261,1262,5,116,0,0,1262, + 1263,5,99,0,0,1263,1264,5,104,0,0,1264,1265,5,45,0,0,1265,1266,5, + 104,0,0,1266,1267,5,97,0,0,1267,1268,5,110,0,0,1268,1269,5,100,0, + 0,1269,1270,5,108,0,0,1270,1271,5,101,0,0,1271,238,1,0,0,0,1272, + 1273,5,109,0,0,1273,1274,5,101,0,0,1274,1275,5,115,0,0,1275,1276, + 5,115,0,0,1276,1277,5,97,0,0,1277,1278,5,103,0,0,1278,1279,5,101, + 0,0,1279,240,1,0,0,0,1280,1281,5,97,0,0,1281,1282,5,116,0,0,1282, + 1283,5,111,0,0,1283,1284,5,109,0,0,1284,1285,5,45,0,0,1285,1286, + 5,114,0,0,1286,1287,5,101,0,0,1287,1288,5,102,0,0,1288,242,1,0,0, + 0,1289,1290,5,105,0,0,1290,1291,5,110,0,0,1291,1292,5,116,0,0,1292, + 1293,5,101,0,0,1293,1294,5,114,0,0,1294,1295,5,102,0,0,1295,1296, + 5,97,0,0,1296,1297,5,99,0,0,1297,1298,5,101,0,0,1298,1299,5,45,0, + 0,1299,1300,5,114,0,0,1300,1301,5,101,0,0,1301,1302,5,102,0,0,1302, + 244,1,0,0,0,1303,1304,5,111,0,0,1304,1305,5,112,0,0,1305,1306,5, + 116,0,0,1306,1307,5,105,0,0,1307,1308,5,111,0,0,1308,1309,5,110, + 0,0,1309,1310,5,97,0,0,1310,1311,5,108,0,0,1311,246,1,0,0,0,1312, + 1313,5,108,0,0,1313,1314,5,105,0,0,1314,1315,5,115,0,0,1315,1316, + 5,116,0,0,1316,248,1,0,0,0,1317,1318,5,114,0,0,1318,1319,5,101,0, + 0,1319,1320,5,99,0,0,1320,1321,5,111,0,0,1321,1322,5,114,0,0,1322, + 1323,5,100,0,0,1323,250,1,0,0,0,1324,1325,5,98,0,0,1325,1326,5,111, + 0,0,1326,1327,5,111,0,0,1327,1328,5,108,0,0,1328,252,1,0,0,0,1329, + 1330,5,98,0,0,1330,1331,5,121,0,0,1331,1332,5,116,0,0,1332,1333, + 5,101,0,0,1333,1334,5,115,0,0,1334,254,1,0,0,0,1335,1336,5,100,0, + 0,1336,1337,5,111,0,0,1337,1338,5,117,0,0,1338,1339,5,98,0,0,1339, + 1340,5,108,0,0,1340,1341,5,101,0,0,1341,256,1,0,0,0,1342,1343,5, + 105,0,0,1343,1344,5,110,0,0,1344,1345,5,116,0,0,1345,1346,5,51,0, + 0,1346,1347,5,50,0,0,1347,258,1,0,0,0,1348,1349,5,105,0,0,1349,1350, + 5,110,0,0,1350,1351,5,116,0,0,1351,1352,5,54,0,0,1352,1353,5,52, + 0,0,1353,260,1,0,0,0,1354,1355,5,115,0,0,1355,1356,5,116,0,0,1356, + 1357,5,114,0,0,1357,1358,5,105,0,0,1358,1359,5,110,0,0,1359,1360, + 5,103,0,0,1360,262,1,0,0,0,1361,1362,5,117,0,0,1362,1363,5,105,0, + 0,1363,1364,5,110,0,0,1364,1365,5,116,0,0,1365,1366,5,51,0,0,1366, + 1367,5,50,0,0,1367,264,1,0,0,0,1368,1369,5,117,0,0,1369,1370,5,105, + 0,0,1370,1371,5,110,0,0,1371,1372,5,116,0,0,1372,1373,5,54,0,0,1373, + 1374,5,52,0,0,1374,266,1,0,0,0,1375,1376,5,116,0,0,1376,1377,5,114, + 0,0,1377,1378,5,117,0,0,1378,1379,5,101,0,0,1379,268,1,0,0,0,1380, + 1381,5,102,0,0,1381,1382,5,97,0,0,1382,1383,5,108,0,0,1383,1384, + 5,115,0,0,1384,1385,5,101,0,0,1385,270,1,0,0,0,1386,1387,5,110,0, + 0,1387,1388,5,117,0,0,1388,1389,5,108,0,0,1389,1390,5,108,0,0,1390, + 272,1,0,0,0,1391,1392,5,45,0,0,1392,1393,5,62,0,0,1393,274,1,0,0, + 0,1394,1395,5,58,0,0,1395,276,1,0,0,0,1396,1397,5,59,0,0,1397,278, + 1,0,0,0,1398,1399,5,44,0,0,1399,280,1,0,0,0,1400,1401,5,46,0,0,1401, + 282,1,0,0,0,1402,1403,5,123,0,0,1403,284,1,0,0,0,1404,1405,5,125, + 0,0,1405,286,1,0,0,0,1406,1407,5,91,0,0,1407,288,1,0,0,0,1408,1409, + 5,93,0,0,1409,290,1,0,0,0,1410,1411,5,40,0,0,1411,292,1,0,0,0,1412, + 1413,5,41,0,0,1413,294,1,0,0,0,1414,1415,5,60,0,0,1415,296,1,0,0, + 0,1416,1417,5,62,0,0,1417,298,1,0,0,0,1418,1419,5,38,0,0,1419,300, + 1,0,0,0,1420,1421,5,61,0,0,1421,302,1,0,0,0,1422,1424,5,45,0,0,1423, + 1422,1,0,0,0,1423,1424,1,0,0,0,1424,1426,1,0,0,0,1425,1427,7,0,0, + 0,1426,1425,1,0,0,0,1427,1428,1,0,0,0,1428,1426,1,0,0,0,1428,1429, + 1,0,0,0,1429,304,1,0,0,0,1430,1432,5,45,0,0,1431,1430,1,0,0,0,1431, + 1432,1,0,0,0,1432,1441,1,0,0,0,1433,1442,5,48,0,0,1434,1438,7,1, + 0,0,1435,1437,7,0,0,0,1436,1435,1,0,0,0,1437,1440,1,0,0,0,1438,1436, + 1,0,0,0,1438,1439,1,0,0,0,1439,1442,1,0,0,0,1440,1438,1,0,0,0,1441, + 1433,1,0,0,0,1441,1434,1,0,0,0,1442,1449,1,0,0,0,1443,1445,5,46, + 0,0,1444,1446,7,0,0,0,1445,1444,1,0,0,0,1446,1447,1,0,0,0,1447,1445, + 1,0,0,0,1447,1448,1,0,0,0,1448,1450,1,0,0,0,1449,1443,1,0,0,0,1449, + 1450,1,0,0,0,1450,1460,1,0,0,0,1451,1453,7,2,0,0,1452,1454,7,3,0, + 0,1453,1452,1,0,0,0,1453,1454,1,0,0,0,1454,1456,1,0,0,0,1455,1457, + 7,0,0,0,1456,1455,1,0,0,0,1457,1458,1,0,0,0,1458,1456,1,0,0,0,1458, + 1459,1,0,0,0,1459,1461,1,0,0,0,1460,1451,1,0,0,0,1460,1461,1,0,0, + 0,1461,306,1,0,0,0,1462,1466,7,4,0,0,1463,1465,7,5,0,0,1464,1463, + 1,0,0,0,1465,1468,1,0,0,0,1466,1464,1,0,0,0,1466,1467,1,0,0,0,1467, + 308,1,0,0,0,1468,1466,1,0,0,0,1469,1474,5,34,0,0,1470,1473,3,311, + 155,0,1471,1473,8,6,0,0,1472,1470,1,0,0,0,1472,1471,1,0,0,0,1473, + 1476,1,0,0,0,1474,1472,1,0,0,0,1474,1475,1,0,0,0,1475,1477,1,0,0, + 0,1476,1474,1,0,0,0,1477,1478,5,34,0,0,1478,310,1,0,0,0,1479,1487, + 5,92,0,0,1480,1488,7,7,0,0,1481,1482,5,117,0,0,1482,1483,3,313,156, + 0,1483,1484,3,313,156,0,1484,1485,3,313,156,0,1485,1486,3,313,156, + 0,1486,1488,1,0,0,0,1487,1480,1,0,0,0,1487,1481,1,0,0,0,1488,312, + 1,0,0,0,1489,1490,7,8,0,0,1490,314,1,0,0,0,1491,1492,5,47,0,0,1492, + 1493,5,47,0,0,1493,1497,1,0,0,0,1494,1496,8,9,0,0,1495,1494,1,0, + 0,0,1496,1499,1,0,0,0,1497,1495,1,0,0,0,1497,1498,1,0,0,0,1498,1500, + 1,0,0,0,1499,1497,1,0,0,0,1500,1501,6,157,0,0,1501,316,1,0,0,0,1502, + 1503,5,47,0,0,1503,1504,5,42,0,0,1504,1508,1,0,0,0,1505,1507,9,0, + 0,0,1506,1505,1,0,0,0,1507,1510,1,0,0,0,1508,1509,1,0,0,0,1508,1506, + 1,0,0,0,1509,1511,1,0,0,0,1510,1508,1,0,0,0,1511,1512,5,42,0,0,1512, + 1513,5,47,0,0,1513,1514,1,0,0,0,1514,1515,6,158,0,0,1515,318,1,0, + 0,0,1516,1518,7,10,0,0,1517,1516,1,0,0,0,1518,1519,1,0,0,0,1519, + 1517,1,0,0,0,1519,1520,1,0,0,0,1520,1521,1,0,0,0,1521,1522,6,159, + 0,0,1522,320,1,0,0,0,18,0,1423,1428,1431,1438,1441,1447,1449,1453, + 1458,1460,1466,1472,1474,1487,1497,1508,1519,1,0,1,0 ]; private static __ATN: antlr.ATN; diff --git a/src/capability-language/generated/QuixosCapabilityParser.ts b/src/capability-language/generated/QuixosCapabilityParser.ts index 5287806..bb234d3 100644 --- a/src/capability-language/generated/QuixosCapabilityParser.ts +++ b/src/capability-language/generated/QuixosCapabilityParser.ts @@ -93,79 +93,81 @@ export class QuixosCapabilityParser extends antlr.Parser { public static readonly SEMANTIC_MAJOR = 81; public static readonly ON_DELETE = 82; public static readonly LIFECYCLE = 83; - public static readonly RETAIN_OTHER = 84; - public static readonly KEYED = 85; - public static readonly PUBLIC_TRAVERSAL = 86; - public static readonly ID = 87; - public static readonly DOC = 88; - public static readonly MODE = 89; - public static readonly EMITS = 90; - public static readonly RECEIVER = 91; - public static readonly REQUIRES = 92; - public static readonly ANY = 93; - public static readonly GET = 94; - public static readonly SET = 95; - public static readonly WATCH = 96; - public static readonly START = 97; - public static readonly STOP = 98; - public static readonly READ = 99; - public static readonly WRITE = 100; - public static readonly RESOLVE = 101; - public static readonly CONNECT = 102; - public static readonly DISCONNECT = 103; - public static readonly CALL = 104; - public static readonly WATCH_START = 105; - public static readonly WATCH_STOP = 106; - public static readonly SUBSCRIBE = 107; - public static readonly UNSUBSCRIBE = 108; - public static readonly REGISTER = 109; - public static readonly CRDT = 110; - public static readonly OPTIONAL_ONE = 111; - public static readonly EXACTLY_ONE = 112; - public static readonly MANY_UNIQUE = 113; - public static readonly MANY = 114; - public static readonly ORDERED = 115; - public static readonly UNIT = 116; - public static readonly WATCH_HANDLE = 117; - public static readonly MESSAGE = 118; - public static readonly ATOM_REF = 119; - public static readonly INTERFACE_REF = 120; - public static readonly OPTIONAL = 121; - public static readonly LIST = 122; - public static readonly RECORD = 123; - public static readonly BOOL = 124; - public static readonly BYTES = 125; - public static readonly DOUBLE = 126; - public static readonly INT32 = 127; - public static readonly INT64 = 128; - public static readonly STRING = 129; - public static readonly UINT32 = 130; - public static readonly UINT64 = 131; - public static readonly TRUE = 132; - public static readonly FALSE = 133; - public static readonly NULL = 134; - public static readonly ARROW = 135; - public static readonly COLON = 136; - public static readonly SEMI = 137; - public static readonly COMMA = 138; - public static readonly DOT = 139; - public static readonly LBRACE = 140; - public static readonly RBRACE = 141; - public static readonly LBRACK = 142; - public static readonly RBRACK = 143; - public static readonly LPAREN = 144; - public static readonly RPAREN = 145; - public static readonly LT = 146; - public static readonly GT = 147; - public static readonly AMP = 148; - public static readonly EQUAL = 149; - public static readonly INTEGER = 150; - public static readonly JSON_NUMBER = 151; - public static readonly IDENTIFIER = 152; - public static readonly STRING_LITERAL = 153; - public static readonly LINE_COMMENT = 154; - public static readonly BLOCK_COMMENT = 155; - public static readonly WS = 156; + public static readonly JOURNAL = 84; + public static readonly SUBSCRIPTION = 85; + public static readonly RETAIN_OTHER = 86; + public static readonly KEYED = 87; + public static readonly PUBLIC_TRAVERSAL = 88; + public static readonly ID = 89; + public static readonly DOC = 90; + public static readonly MODE = 91; + public static readonly EMITS = 92; + public static readonly RECEIVER = 93; + public static readonly REQUIRES = 94; + public static readonly ANY = 95; + public static readonly GET = 96; + public static readonly SET = 97; + public static readonly WATCH = 98; + public static readonly START = 99; + public static readonly STOP = 100; + public static readonly READ = 101; + public static readonly WRITE = 102; + public static readonly RESOLVE = 103; + public static readonly CONNECT = 104; + public static readonly DISCONNECT = 105; + public static readonly CALL = 106; + public static readonly WATCH_START = 107; + public static readonly WATCH_STOP = 108; + public static readonly SUBSCRIBE = 109; + public static readonly UNSUBSCRIBE = 110; + public static readonly REGISTER = 111; + public static readonly CRDT = 112; + public static readonly OPTIONAL_ONE = 113; + public static readonly EXACTLY_ONE = 114; + public static readonly MANY_UNIQUE = 115; + public static readonly MANY = 116; + public static readonly ORDERED = 117; + public static readonly UNIT = 118; + public static readonly WATCH_HANDLE = 119; + public static readonly MESSAGE = 120; + public static readonly ATOM_REF = 121; + public static readonly INTERFACE_REF = 122; + public static readonly OPTIONAL = 123; + public static readonly LIST = 124; + public static readonly RECORD = 125; + public static readonly BOOL = 126; + public static readonly BYTES = 127; + public static readonly DOUBLE = 128; + public static readonly INT32 = 129; + public static readonly INT64 = 130; + public static readonly STRING = 131; + public static readonly UINT32 = 132; + public static readonly UINT64 = 133; + public static readonly TRUE = 134; + public static readonly FALSE = 135; + public static readonly NULL = 136; + public static readonly ARROW = 137; + public static readonly COLON = 138; + public static readonly SEMI = 139; + public static readonly COMMA = 140; + public static readonly DOT = 141; + public static readonly LBRACE = 142; + public static readonly RBRACE = 143; + public static readonly LBRACK = 144; + public static readonly RBRACK = 145; + public static readonly LPAREN = 146; + public static readonly RPAREN = 147; + public static readonly LT = 148; + public static readonly GT = 149; + public static readonly AMP = 150; + public static readonly EQUAL = 151; + public static readonly INTEGER = 152; + public static readonly JSON_NUMBER = 153; + public static readonly IDENTIFIER = 154; + public static readonly STRING_LITERAL = 155; + public static readonly LINE_COMMENT = 156; + public static readonly BLOCK_COMMENT = 157; + public static readonly WS = 158; public static readonly RULE_document = 0; public static readonly RULE_fragmentDecl = 1; public static readonly RULE_sourceImportDecl = 2; @@ -268,17 +270,18 @@ export class QuixosCapabilityParser extends antlr.Parser { "'edge'", "'projection'", "'with'", "'using'", "'accept'", "'via'", "'materialize'", "'if'", "'absent'", "'on'", "'policy'", "'default'", "'source'", "'repository'", "'commit'", "'revision'", "'semantic-major'", - "'on-delete'", "'lifecycle'", "'retain-other'", "'keyed'", "'public-traversal'", - "'id'", "'doc'", "'mode'", "'emits'", "'receiver'", "'requires'", - "'any'", "'get'", "'set'", "'watch'", "'start'", "'stop'", "'read'", - "'write'", "'resolve'", "'connect'", "'disconnect'", "'call'", "'watch-start'", - "'watch-stop'", "'subscribe'", "'unsubscribe'", "'register'", "'crdt'", - "'optional-one'", "'exactly-one'", "'many-unique'", "'many'", "'ordered'", - "'unit'", "'watch-handle'", "'message'", "'atom-ref'", "'interface-ref'", - "'optional'", "'list'", "'record'", "'bool'", "'bytes'", "'double'", - "'int32'", "'int64'", "'string'", "'uint32'", "'uint64'", "'true'", - "'false'", "'null'", "'->'", "':'", "';'", "','", "'.'", "'{'", - "'}'", "'['", "']'", "'('", "')'", "'<'", "'>'", "'&'", "'='" + "'on-delete'", "'lifecycle'", "'journal'", "'subscription'", "'retain-other'", + "'keyed'", "'public-traversal'", "'id'", "'doc'", "'mode'", "'emits'", + "'receiver'", "'requires'", "'any'", "'get'", "'set'", "'watch'", + "'start'", "'stop'", "'read'", "'write'", "'resolve'", "'connect'", + "'disconnect'", "'call'", "'watch-start'", "'watch-stop'", "'subscribe'", + "'unsubscribe'", "'register'", "'crdt'", "'optional-one'", "'exactly-one'", + "'many-unique'", "'many'", "'ordered'", "'unit'", "'watch-handle'", + "'message'", "'atom-ref'", "'interface-ref'", "'optional'", "'list'", + "'record'", "'bool'", "'bytes'", "'double'", "'int32'", "'int64'", + "'string'", "'uint32'", "'uint64'", "'true'", "'false'", "'null'", + "'->'", "':'", "';'", "','", "'.'", "'{'", "'}'", "'['", "']'", + "'('", "')'", "'<'", "'>'", "'&'", "'='" ]; public static readonly symbolicNames = [ @@ -295,18 +298,18 @@ export class QuixosCapabilityParser extends antlr.Parser { "STATE", "EDGE", "PROJECTION", "WITH", "USING", "ACCEPT", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", - "LIFECYCLE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", - "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", - "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", - "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", - "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", - "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", - "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", "BOOL", - "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", - "TRUE", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", - "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", - "GT", "AMP", "EQUAL", "INTEGER", "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", - "LINE_COMMENT", "BLOCK_COMMENT", "WS" + "LIFECYCLE", "JOURNAL", "SUBSCRIPTION", "RETAIN_OTHER", "KEYED", + "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", + "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", "WRITE", + "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", + "SUBSCRIBE", "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", + "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", + "MESSAGE", "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", + "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", + "UINT64", "TRUE", "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", + "DOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", + "LT", "GT", "AMP", "EQUAL", "INTEGER", "JSON_NUMBER", "IDENTIFIER", + "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", "WS" ]; public static readonly ruleNames = [ "document", "fragmentDecl", "sourceImportDecl", "workspaceDecl", @@ -790,7 +793,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 263; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 88) { + if (_la === 90) { { this.state = 261; this.match(QuixosCapabilityParser.DOC); @@ -844,7 +847,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 276; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 146) { + if (_la === 148) { { this.state = 275; this.typeParameters(); @@ -862,7 +865,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 291; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 92) { + if (_la === 94) { { this.state = 282; this.match(QuixosCapabilityParser.REQUIRES); @@ -871,7 +874,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 288; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 138) { + while (_la === 140) { { { this.state = 284; @@ -934,7 +937,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 308; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 138) { + while (_la === 140) { { { this.state = 304; @@ -982,7 +985,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 317; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 136) { + if (_la === 138) { { this.state = 315; this.match(QuixosCapabilityParser.COLON); @@ -1012,7 +1015,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 327; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 148) { + while (_la === 150) { { { this.state = 323; @@ -1059,7 +1062,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 336; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 146) { + if (_la === 148) { { this.state = 335; this.typeArguments(); @@ -1095,7 +1098,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 344; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 138) { + while (_la === 140) { { { this.state = 340; @@ -1194,8 +1197,11 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.FRAGMENT: case QuixosCapabilityParser.INTERFACES: case QuixosCapabilityParser.SOURCE: + case QuixosCapabilityParser.JOURNAL: + case QuixosCapabilityParser.SUBSCRIPTION: case QuixosCapabilityParser.START: case QuixosCapabilityParser.STOP: + case QuixosCapabilityParser.CONNECT: case QuixosCapabilityParser.REGISTER: case QuixosCapabilityParser.UNIT: case QuixosCapabilityParser.WATCH_HANDLE: @@ -1251,7 +1257,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 361; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 146) { + if (_la === 148) { { this.state = 360; this.typeParameters(); @@ -1488,7 +1494,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 419; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 1 || ((((_la - 94)) & ~0x1F) === 0 && ((1 << (_la - 94)) & 7) !== 0)) { + while (_la === 1 || ((((_la - 96)) & ~0x1F) === 0 && ((1 << (_la - 96)) & 7) !== 0)) { { { this.state = 416; @@ -1665,7 +1671,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 470; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 115) { + if (_la === 117) { { this.state = 469; this.match(QuixosCapabilityParser.ORDERED); @@ -1675,7 +1681,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 474; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 85) { + if (_la === 87) { { this.state = 472; this.match(QuixosCapabilityParser.KEYED); @@ -1689,7 +1695,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 480; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 96)) & ~0x1F) === 0 && ((1 << (_la - 96)) & 225) !== 0)) { + while (((((_la - 98)) & ~0x1F) === 0 && ((1 << (_la - 98)) & 225) !== 0)) { { { this.state = 477; @@ -1900,7 +1906,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 529; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 146) { + if (_la === 148) { { this.state = 528; this.typeArguments(); @@ -2183,7 +2189,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 596; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 146) { + if (_la === 148) { { this.state = 595; this.typeParameters(); @@ -2226,7 +2232,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 613; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 18)) & ~0x1F) === 0 && ((1 << (_la - 18)) & 63491) !== 0) || _la === 96) { + while (((((_la - 18)) & ~0x1F) === 0 && ((1 << (_la - 18)) & 63491) !== 0) || _la === 98) { { { this.state = 610; @@ -2269,7 +2275,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 628; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 18)) & ~0x1F) === 0 && ((1 << (_la - 18)) & 63491) !== 0) || _la === 96) { + while (((((_la - 18)) & ~0x1F) === 0 && ((1 << (_la - 18)) & 63491) !== 0) || _la === 98) { { { this.state = 625; @@ -2414,7 +2420,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 666; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 3145729) !== 0) || _la === 109 || _la === 152) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 146801025) !== 0) || _la === 111 || _la === 120 || _la === 154) { { { this.state = 663; @@ -2571,7 +2577,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 713; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 146) { + if (_la === 148) { { this.state = 712; this.typeParameters(); @@ -2607,7 +2613,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 727; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 90) { + if (_la === 92) { { this.state = 726; this.eventClause(); @@ -2621,7 +2627,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 732; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 92) { + if (_la === 94) { { this.state = 731; this.dependencyBlock(); @@ -2679,7 +2685,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 745; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 146) { + if (_la === 148) { { this.state = 744; this.typeParameters(); @@ -2711,7 +2717,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 757; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 92) { + if (_la === 94) { { this.state = 756; this.dependencyBlock(); @@ -2885,7 +2891,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 795; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 138) { + while (_la === 140) { { { this.state = 791; @@ -2941,7 +2947,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 809; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 92) { + if (_la === 94) { { this.state = 808; this.dependencyBlock(); @@ -2999,7 +3005,7 @@ export class QuixosCapabilityParser extends antlr.Parser { { this.state = 816; _la = this.tokenStream.LA(1); - if(!(((((_la - 104)) & ~0x1F) === 0 && ((1 << (_la - 104)) & 31) !== 0))) { + if(!(((((_la - 106)) & ~0x1F) === 0 && ((1 << (_la - 106)) & 31) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -3064,14 +3070,14 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 833; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 3145729) !== 0) || _la === 109 || _la === 152) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 146801025) !== 0) || _la === 111 || _la === 120 || _la === 154) { { this.state = 825; this.interfaceType(); this.state = 830; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 138) { + while (_la === 140) { { { this.state = 826; @@ -3120,7 +3126,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 843; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 138) { + while (_la === 140) { { { this.state = 839; @@ -3260,7 +3266,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 883; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 85) { + if (_la === 87) { { this.state = 881; this.match(QuixosCapabilityParser.KEYED); @@ -3293,7 +3299,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 895; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 146) { + if (_la === 148) { { this.state = 894; this.typeArguments(); @@ -3434,7 +3440,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 946; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 138) { + while (_la === 140) { { { this.state = 942; @@ -3473,7 +3479,7 @@ export class QuixosCapabilityParser extends antlr.Parser { { this.state = 951; _la = this.tokenStream.LA(1); - if(!(_la === 1 || ((((_la - 99)) & ~0x1F) === 0 && ((1 << (_la - 99)) & 223) !== 0))) { + if(!(_la === 1 || ((((_la - 101)) & ~0x1F) === 0 && ((1 << (_la - 101)) & 223) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -3618,7 +3624,7 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new StoragePolicyContext(this.context, this.state); this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_storagePolicy); try { - this.state = 982; + this.state = 989; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REGISTER: @@ -3641,6 +3647,28 @@ export class QuixosCapabilityParser extends antlr.Parser { this.match(QuixosCapabilityParser.RPAREN); } break; + case QuixosCapabilityParser.JOURNAL: + this.enterOuterAlt(localContext, 3); + { + this.state = 982; + this.match(QuixosCapabilityParser.JOURNAL); + this.state = 983; + this.jsonObject(); + } + break; + case QuixosCapabilityParser.SUBSCRIPTION: + this.enterOuterAlt(localContext, 4); + { + this.state = 984; + this.match(QuixosCapabilityParser.SUBSCRIPTION); + this.state = 985; + this.match(QuixosCapabilityParser.LPAREN); + this.state = 986; + this.valueType(); + this.state = 987; + this.match(QuixosCapabilityParser.RPAREN); + } + break; default: throw new antlr.NoViableAltException(this); } @@ -3664,21 +3692,21 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 984; - this.match(QuixosCapabilityParser.EDGE); - this.state = 985; - this.identifier(); - this.state = 986; - this.match(QuixosCapabilityParser.ID); - this.state = 987; - this.stringLiteral(); - this.state = 988; - this.match(QuixosCapabilityParser.LBRACE); - this.state = 989; - this.edgeEndpoint(); - this.state = 990; - this.edgeEndpoint(); this.state = 991; + this.match(QuixosCapabilityParser.EDGE); + this.state = 992; + this.identifier(); + this.state = 993; + this.match(QuixosCapabilityParser.ID); + this.state = 994; + this.stringLiteral(); + this.state = 995; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 996; + this.edgeEndpoint(); + this.state = 997; + this.edgeEndpoint(); + this.state = 998; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3702,57 +3730,35 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 993; - this.targetConstraint(); - this.state = 994; - this.match(QuixosCapabilityParser.PROJECTION); - this.state = 995; - this.identifier(); - this.state = 996; - this.match(QuixosCapabilityParser.ID); - this.state = 997; - this.stringLiteral(); - this.state = 998; - this.cardinality(); this.state = 1000; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 115) { - { - this.state = 999; - this.match(QuixosCapabilityParser.ORDERED); - } - } - + this.targetConstraint(); + this.state = 1001; + this.match(QuixosCapabilityParser.PROJECTION); + this.state = 1002; + this.identifier(); + this.state = 1003; + this.match(QuixosCapabilityParser.ID); this.state = 1004; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 82) { - { - this.state = 1002; - this.match(QuixosCapabilityParser.ON_DELETE); - this.state = 1003; - this.stringLiteral(); - } - } - + this.stringLiteral(); + this.state = 1005; + this.cardinality(); this.state = 1007; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 84) { + if (_la === 117) { { this.state = 1006; - this.match(QuixosCapabilityParser.RETAIN_OTHER); + this.match(QuixosCapabilityParser.ORDERED); } } this.state = 1011; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 85) { + if (_la === 82) { { this.state = 1009; - this.match(QuixosCapabilityParser.KEYED); + this.match(QuixosCapabilityParser.ON_DELETE); this.state = 1010; this.stringLiteral(); } @@ -3764,11 +3770,33 @@ export class QuixosCapabilityParser extends antlr.Parser { if (_la === 86) { { this.state = 1013; + this.match(QuixosCapabilityParser.RETAIN_OTHER); + } + } + + this.state = 1018; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 87) { + { + this.state = 1016; + this.match(QuixosCapabilityParser.KEYED); + this.state = 1017; + this.stringLiteral(); + } + } + + this.state = 1021; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 88) { + { + this.state = 1020; this.match(QuixosCapabilityParser.PUBLIC_TRAVERSAL); } } - this.state = 1016; + this.state = 1023; this.match(QuixosCapabilityParser.SEMI); } } @@ -3792,85 +3820,85 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1018; + this.state = 1025; this.match(QuixosCapabilityParser.CONFORM); - this.state = 1020; + this.state = 1027; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 146) { + if (_la === 148) { { - this.state = 1019; + this.state = 1026; this.typeParameters(); } } - this.state = 1022; + this.state = 1029; this.identifier(); - this.state = 1024; + this.state = 1031; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 146) { + if (_la === 148) { { - this.state = 1023; + this.state = 1030; this.conformanceSourceArguments(); } } - this.state = 1026; + this.state = 1033; this.match(QuixosCapabilityParser.AS); - this.state = 1027; + this.state = 1034; this.identifier(); - this.state = 1029; + this.state = 1036; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 146) { + if (_la === 148) { { - this.state = 1028; + this.state = 1035; this.typeArguments(); } } - this.state = 1033; + this.state = 1040; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 87) { + if (_la === 89) { { - this.state = 1031; + this.state = 1038; this.match(QuixosCapabilityParser.ID); - this.state = 1032; + this.state = 1039; this.stringLiteral(); } } - this.state = 1037; + this.state = 1044; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 81) { { - this.state = 1035; + this.state = 1042; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); - this.state = 1036; + this.state = 1043; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 1039; + this.state = 1046; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1043; + this.state = 1050; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while (_la === 10 || ((((_la - 59)) & ~0x1F) === 0 && ((1 << (_la - 59)) & 4105) !== 0)) { { { - this.state = 1040; + this.state = 1047; this.conformanceItem(); } } - this.state = 1045; + this.state = 1052; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1046; + this.state = 1053; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3893,7 +3921,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1048; + this.state = 1055; this.typeArguments(); } } @@ -3914,50 +3942,50 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ConformanceItemContext(this.context, this.state); this.enterRule(localContext, 114, QuixosCapabilityParser.RULE_conformanceItem); try { - this.state = 1057; + this.state = 1064; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 98, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1050; + this.state = 1057; this.match(QuixosCapabilityParser.PRIVATE); - this.state = 1051; + this.state = 1058; this.attachmentDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1052; + this.state = 1059; this.operationBindingDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1053; + this.state = 1060; this.stateFieldBindingDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1054; + this.state = 1061; this.initializationDecl(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1055; + this.state = 1062; this.relationshipMaterializationDecl(); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1056; + this.state = 1063; this.moduleBindingDecl(); } break; @@ -3982,19 +4010,19 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1059; + this.state = 1066; this.match(QuixosCapabilityParser.BIND); - this.state = 1060; + this.state = 1067; this.identifier(); - this.state = 1061; + this.state = 1068; this.match(QuixosCapabilityParser.TO); - this.state = 1062; + this.state = 1069; this.identifier(); - this.state = 1063; + this.state = 1070; this.match(QuixosCapabilityParser.DOT); - this.state = 1064; + this.state = 1071; this.identifier(); - this.state = 1065; + this.state = 1072; this.match(QuixosCapabilityParser.SEMI); } } @@ -4018,27 +4046,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1067; + this.state = 1074; this.match(QuixosCapabilityParser.INITIALIZE); - this.state = 1068; + this.state = 1075; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1072; + this.state = 1079; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 3145729) !== 0) || _la === 109 || _la === 152) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 146801025) !== 0) || _la === 111 || _la === 120 || _la === 154) { { { - this.state = 1069; + this.state = 1076; this.initializationField(); } } - this.state = 1074; + this.state = 1081; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1075; + this.state = 1082; this.match(QuixosCapabilityParser.RBRACE); - this.state = 1076; + this.state = 1083; this.match(QuixosCapabilityParser.SEMI); } } @@ -4059,40 +4087,40 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new InitializationFieldContext(this.context, this.state); this.enterRule(localContext, 120, QuixosCapabilityParser.RULE_initializationField); try { - this.state = 1092; + this.state = 1099; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 100, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1078; + this.state = 1085; this.identifier(); - this.state = 1079; + this.state = 1086; this.match(QuixosCapabilityParser.TO); - this.state = 1080; + this.state = 1087; this.match(QuixosCapabilityParser.STATE); - this.state = 1081; + this.state = 1088; this.identifier(); - this.state = 1082; + this.state = 1089; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1084; + this.state = 1091; this.identifier(); - this.state = 1085; + this.state = 1092; this.match(QuixosCapabilityParser.TO); - this.state = 1086; + this.state = 1093; this.match(QuixosCapabilityParser.EDGE); - this.state = 1087; + this.state = 1094; this.identifier(); - this.state = 1088; + this.state = 1095; this.match(QuixosCapabilityParser.DOT); - this.state = 1089; + this.state = 1096; this.identifier(); - this.state = 1090; + this.state = 1097; this.match(QuixosCapabilityParser.SEMI); } break; @@ -4118,29 +4146,29 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1094; - this.interfaceType(); - this.state = 1095; - this.match(QuixosCapabilityParser.FROM); - this.state = 1096; - this.match(QuixosCapabilityParser.INPUT); this.state = 1101; + this.interfaceType(); + this.state = 1102; + this.match(QuixosCapabilityParser.FROM); + this.state = 1103; + this.match(QuixosCapabilityParser.INPUT); + this.state = 1108; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 139) { + while (_la === 141) { { { - this.state = 1097; + this.state = 1104; this.match(QuixosCapabilityParser.DOT); - this.state = 1098; + this.state = 1105; this.identifier(); } } - this.state = 1103; + this.state = 1110; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1104; + this.state = 1111; this.match(QuixosCapabilityParser.SEMI); } } @@ -4163,17 +4191,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1106; + this.state = 1113; this.match(QuixosCapabilityParser.BIND); - this.state = 1107; + this.state = 1114; this.identifier(); - this.state = 1108; + this.state = 1115; this.match(QuixosCapabilityParser.TO); - this.state = 1109; + this.state = 1116; this.match(QuixosCapabilityParser.STATE); - this.state = 1110; + this.state = 1117; this.identifier(); - this.state = 1111; + this.state = 1118; this.match(QuixosCapabilityParser.SEMI); } } @@ -4196,31 +4224,31 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1113; - this.match(QuixosCapabilityParser.MATERIALIZE); - this.state = 1114; - this.identifier(); - this.state = 1115; - this.match(QuixosCapabilityParser.IF); - this.state = 1116; - this.match(QuixosCapabilityParser.ABSENT); - this.state = 1117; - this.match(QuixosCapabilityParser.USING); - this.state = 1118; - this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1119; - this.identifier(); this.state = 1120; - this.match(QuixosCapabilityParser.VIA); + this.match(QuixosCapabilityParser.MATERIALIZE); this.state = 1121; - this.match(QuixosCapabilityParser.EDGE); + this.identifier(); this.state = 1122; - this.identifier(); + this.match(QuixosCapabilityParser.IF); this.state = 1123; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.ABSENT); this.state = 1124; - this.identifier(); + this.match(QuixosCapabilityParser.USING); this.state = 1125; + this.match(QuixosCapabilityParser.CONSTRUCTOR); + this.state = 1126; + this.identifier(); + this.state = 1127; + this.match(QuixosCapabilityParser.VIA); + this.state = 1128; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1129; + this.identifier(); + this.state = 1130; + this.match(QuixosCapabilityParser.DOT); + this.state = 1131; + this.identifier(); + this.state = 1132; this.match(QuixosCapabilityParser.SEMI); } } @@ -4244,27 +4272,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1127; + this.state = 1134; this.match(QuixosCapabilityParser.BIND); - this.state = 1128; + this.state = 1135; this.memberOperationRef(); - this.state = 1129; + this.state = 1136; this.match(QuixosCapabilityParser.TO); - this.state = 1130; + this.state = 1137; this.operationProvider(); - this.state = 1133; + this.state = 1140; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 36) { { - this.state = 1131; + this.state = 1138; this.match(QuixosCapabilityParser.QUERY_REASON); - this.state = 1132; + this.state = 1139; this.stringLiteral(); } } - this.state = 1135; + this.state = 1142; this.match(QuixosCapabilityParser.SEMI); } } @@ -4287,11 +4315,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1137; + this.state = 1144; this.identifier(); - this.state = 1138; + this.state = 1145; this.match(QuixosCapabilityParser.DOT); - this.state = 1139; + this.state = 1146; this.operationName(); } } @@ -4312,90 +4340,90 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new OperationNameContext(this.context, this.state); this.enterRule(localContext, 132, QuixosCapabilityParser.RULE_operationName); try { - this.state = 1153; + this.state = 1160; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 103, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1141; + this.state = 1148; this.identifier(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1142; + this.state = 1149; this.match(QuixosCapabilityParser.CALL); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1143; + this.state = 1150; this.match(QuixosCapabilityParser.GET); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1144; + this.state = 1151; this.match(QuixosCapabilityParser.SET); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1145; + this.state = 1152; this.match(QuixosCapabilityParser.EDIT); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1146; + this.state = 1153; this.match(QuixosCapabilityParser.RESOLVE); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 1147; + this.state = 1154; this.match(QuixosCapabilityParser.CONNECT); } break; case 8: this.enterOuterAlt(localContext, 8); { - this.state = 1148; + this.state = 1155; this.match(QuixosCapabilityParser.DISCONNECT); } break; case 9: this.enterOuterAlt(localContext, 9); { - this.state = 1149; + this.state = 1156; this.match(QuixosCapabilityParser.WATCH_START); } break; case 10: this.enterOuterAlt(localContext, 10); { - this.state = 1150; + this.state = 1157; this.match(QuixosCapabilityParser.WATCH_STOP); } break; case 11: this.enterOuterAlt(localContext, 11); { - this.state = 1151; + this.state = 1158; this.match(QuixosCapabilityParser.SUBSCRIBE); } break; case 12: this.enterOuterAlt(localContext, 12); { - this.state = 1152; + this.state = 1159; this.match(QuixosCapabilityParser.UNSUBSCRIBE); } break; @@ -4419,110 +4447,136 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 134, QuixosCapabilityParser.RULE_operationProvider); let _la: number; try { - this.state = 1191; + this.state = 1208; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.LIFECYCLE: this.enterOuterAlt(localContext, 1); { - this.state = 1155; + this.state = 1162; this.match(QuixosCapabilityParser.LIFECYCLE); - this.state = 1156; - this.match(QuixosCapabilityParser.DOT); - this.state = 1157; - this.identifier(); - } - break; - case QuixosCapabilityParser.STATE: - this.enterOuterAlt(localContext, 2); - { - this.state = 1158; - this.match(QuixosCapabilityParser.STATE); - this.state = 1159; - this.identifier(); - this.state = 1160; - this.match(QuixosCapabilityParser.DOT); - this.state = 1161; - this.statePrimitive(); - } - break; - case QuixosCapabilityParser.EDGE: - this.enterOuterAlt(localContext, 3); - { this.state = 1163; - this.match(QuixosCapabilityParser.EDGE); + this.match(QuixosCapabilityParser.DOT); this.state = 1164; this.identifier(); + } + break; + case QuixosCapabilityParser.JOURNAL: + this.enterOuterAlt(localContext, 2); + { this.state = 1165; - this.match(QuixosCapabilityParser.DOT); + this.match(QuixosCapabilityParser.JOURNAL); this.state = 1166; this.identifier(); this.state = 1167; this.match(QuixosCapabilityParser.DOT); this.state = 1168; + this.identifier(); + } + break; + case QuixosCapabilityParser.SUBSCRIPTION: + this.enterOuterAlt(localContext, 3); + { + this.state = 1170; + this.match(QuixosCapabilityParser.SUBSCRIPTION); + this.state = 1171; + this.identifier(); + this.state = 1172; + this.match(QuixosCapabilityParser.DOT); + this.state = 1173; + this.identifier(); + } + break; + case QuixosCapabilityParser.STATE: + this.enterOuterAlt(localContext, 4); + { + this.state = 1175; + this.match(QuixosCapabilityParser.STATE); + this.state = 1176; + this.identifier(); + this.state = 1177; + this.match(QuixosCapabilityParser.DOT); + this.state = 1178; + this.statePrimitive(); + } + break; + case QuixosCapabilityParser.EDGE: + this.enterOuterAlt(localContext, 5); + { + this.state = 1180; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1181; + this.identifier(); + this.state = 1182; + this.match(QuixosCapabilityParser.DOT); + this.state = 1183; + this.identifier(); + this.state = 1184; + this.match(QuixosCapabilityParser.DOT); + this.state = 1185; this.edgePrimitive(); } break; case QuixosCapabilityParser.INTERFACE: - this.enterOuterAlt(localContext, 4); + this.enterOuterAlt(localContext, 6); { - this.state = 1170; + this.state = 1187; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 1171; + this.state = 1188; this.identifier(); - this.state = 1173; + this.state = 1190; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 146) { + if (_la === 148) { { - this.state = 1172; + this.state = 1189; this.typeArguments(); } } - this.state = 1175; + this.state = 1192; this.match(QuixosCapabilityParser.DOT); - this.state = 1176; + this.state = 1193; this.memberOperationRef(); } break; case QuixosCapabilityParser.PACKAGE: - this.enterOuterAlt(localContext, 5); + this.enterOuterAlt(localContext, 7); { - this.state = 1178; + this.state = 1195; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 1179; + this.state = 1196; this.identifier(); - this.state = 1180; + this.state = 1197; this.match(QuixosCapabilityParser.DOT); - this.state = 1181; + this.state = 1198; this.identifier(); - this.state = 1183; + this.state = 1200; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 146) { + if (_la === 148) { { - this.state = 1182; + this.state = 1199; this.typeArguments(); } } - this.state = 1186; + this.state = 1203; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 67) { { - this.state = 1185; + this.state = 1202; this.dependencyBindingBlock(); } } - this.state = 1189; + this.state = 1206; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 69) { { - this.state = 1188; + this.state = 1205; this.acceptanceBinding(); } } @@ -4552,9 +4606,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1193; + this.state = 1210; this.match(QuixosCapabilityParser.ACCEPT); - this.state = 1194; + this.state = 1211; this.dependencyBindingBlock(); } } @@ -4578,9 +4632,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1196; + this.state = 1213; _la = this.tokenStream.LA(1); - if(!(_la === 1 || ((((_la - 99)) & ~0x1F) === 0 && ((1 << (_la - 99)) & 195) !== 0))) { + if(!(_la === 1 || ((((_la - 101)) & ~0x1F) === 0 && ((1 << (_la - 101)) & 195) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4609,9 +4663,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1198; + this.state = 1215; _la = this.tokenStream.LA(1); - if(!(((((_la - 101)) & ~0x1F) === 0 && ((1 << (_la - 101)) & 55) !== 0))) { + if(!(((((_la - 103)) & ~0x1F) === 0 && ((1 << (_la - 103)) & 55) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4640,25 +4694,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1200; + this.state = 1217; this.match(QuixosCapabilityParser.WITH); - this.state = 1201; + this.state = 1218; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1205; + this.state = 1222; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 3145729) !== 0) || _la === 109 || _la === 152) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 146801025) !== 0) || _la === 111 || _la === 120 || _la === 154) { { { - this.state = 1202; + this.state = 1219; this.dependencyBinding(); } } - this.state = 1207; + this.state = 1224; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1208; + this.state = 1225; this.match(QuixosCapabilityParser.RBRACE); } } @@ -4680,126 +4734,82 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 144, QuixosCapabilityParser.RULE_dependencyBinding); let _la: number; try { - this.state = 1308; + this.state = 1325; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 117, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1210; + this.state = 1227; this.identifier(); - this.state = 1211; + this.state = 1228; this.match(QuixosCapabilityParser.TO); - this.state = 1212; + this.state = 1229; this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 1213; + this.state = 1230; this.match(QuixosCapabilityParser.REFLECTION); - this.state = 1214; + this.state = 1231; this.match(QuixosCapabilityParser.LBRACK); - this.state = 1215; + this.state = 1232; this.identifierList(); - this.state = 1216; + this.state = 1233; this.match(QuixosCapabilityParser.RBRACK); - this.state = 1217; + this.state = 1234; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1219; + this.state = 1236; this.identifier(); - this.state = 1220; + this.state = 1237; this.match(QuixosCapabilityParser.TO); - this.state = 1221; + this.state = 1238; this.match(QuixosCapabilityParser.STATE); - this.state = 1222; + this.state = 1239; this.identifier(); - this.state = 1229; + this.state = 1246; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 70) { { - this.state = 1223; + this.state = 1240; this.match(QuixosCapabilityParser.VIA); - this.state = 1224; + this.state = 1241; this.match(QuixosCapabilityParser.EDGE); - this.state = 1225; + this.state = 1242; this.identifier(); - this.state = 1226; + this.state = 1243; this.match(QuixosCapabilityParser.DOT); - this.state = 1227; + this.state = 1244; this.identifier(); } } - this.state = 1231; + this.state = 1248; this.match(QuixosCapabilityParser.SEMI); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1233; + this.state = 1250; this.identifier(); - this.state = 1234; + this.state = 1251; this.match(QuixosCapabilityParser.TO); - this.state = 1235; + this.state = 1252; this.match(QuixosCapabilityParser.EDGE); - this.state = 1236; + this.state = 1253; this.identifier(); - this.state = 1237; + this.state = 1254; this.match(QuixosCapabilityParser.DOT); - this.state = 1238; + this.state = 1255; this.identifier(); - this.state = 1245; + this.state = 1262; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 70) { - { - this.state = 1239; - this.match(QuixosCapabilityParser.VIA); - this.state = 1240; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1241; - this.identifier(); - this.state = 1242; - this.match(QuixosCapabilityParser.DOT); - this.state = 1243; - this.identifier(); - } - } - - this.state = 1247; - this.match(QuixosCapabilityParser.SEMI); - } - break; - case 4: - this.enterOuterAlt(localContext, 4); - { - this.state = 1249; - this.identifier(); - this.state = 1250; - this.match(QuixosCapabilityParser.TO); - this.state = 1251; - this.match(QuixosCapabilityParser.INTERFACE); - this.state = 1252; - this.identifier(); - this.state = 1254; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 146) { - { - this.state = 1253; - this.typeArguments(); - } - } - - this.state = 1264; - this.errorHandler.sync(this); - switch (this.tokenStream.LA(1)) { - case QuixosCapabilityParser.VIA: - { { this.state = 1256; this.match(QuixosCapabilityParser.VIA); @@ -4812,14 +4822,58 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 1260; this.identifier(); } + } + + this.state = 1264; + this.match(QuixosCapabilityParser.SEMI); + } + break; + case 4: + this.enterOuterAlt(localContext, 4); + { + this.state = 1266; + this.identifier(); + this.state = 1267; + this.match(QuixosCapabilityParser.TO); + this.state = 1268; + this.match(QuixosCapabilityParser.INTERFACE); + this.state = 1269; + this.identifier(); + this.state = 1271; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 148) { + { + this.state = 1270; + this.typeArguments(); + } + } + + this.state = 1281; + this.errorHandler.sync(this); + switch (this.tokenStream.LA(1)) { + case QuixosCapabilityParser.VIA: + { + { + this.state = 1273; + this.match(QuixosCapabilityParser.VIA); + this.state = 1274; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1275; + this.identifier(); + this.state = 1276; + this.match(QuixosCapabilityParser.DOT); + this.state = 1277; + this.identifier(); + } } break; case QuixosCapabilityParser.FROM: { { - this.state = 1262; + this.state = 1279; this.match(QuixosCapabilityParser.FROM); - this.state = 1263; + this.state = 1280; this.match(QuixosCapabilityParser.INPUT); } } @@ -4829,104 +4883,104 @@ export class QuixosCapabilityParser extends antlr.Parser { default: break; } - this.state = 1266; + this.state = 1283; this.match(QuixosCapabilityParser.SEMI); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1268; + this.state = 1285; this.identifier(); - this.state = 1269; + this.state = 1286; this.match(QuixosCapabilityParser.TO); - this.state = 1270; + this.state = 1287; this.match(QuixosCapabilityParser.CREATION); - this.state = 1271; + this.state = 1288; this.identifier(); - this.state = 1272; + this.state = 1289; this.match(QuixosCapabilityParser.WITH); - this.state = 1273; + this.state = 1290; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1277; + this.state = 1294; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 3145729) !== 0) || _la === 109 || _la === 152) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 146801025) !== 0) || _la === 111 || _la === 120 || _la === 154) { { { - this.state = 1274; + this.state = 1291; this.creationOwnerMapping(); } } - this.state = 1279; + this.state = 1296; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1280; + this.state = 1297; this.match(QuixosCapabilityParser.RBRACE); - this.state = 1281; + this.state = 1298; this.match(QuixosCapabilityParser.SEMI); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1283; + this.state = 1300; this.identifier(); - this.state = 1284; + this.state = 1301; this.match(QuixosCapabilityParser.TO); - this.state = 1285; + this.state = 1302; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1286; + this.state = 1303; this.identifier(); - this.state = 1287; + this.state = 1304; this.match(QuixosCapabilityParser.SEMI); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 1289; + this.state = 1306; this.identifier(); - this.state = 1290; + this.state = 1307; this.match(QuixosCapabilityParser.TO); - this.state = 1292; + this.state = 1309; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 11) { { - this.state = 1291; + this.state = 1308; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 1294; + this.state = 1311; this.match(QuixosCapabilityParser.QUERY); - this.state = 1295; + this.state = 1312; this.identifier(); - this.state = 1296; + this.state = 1313; this.match(QuixosCapabilityParser.DOT); - this.state = 1297; + this.state = 1314; this.identifier(); - this.state = 1304; + this.state = 1321; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 70) { { - this.state = 1298; + this.state = 1315; this.match(QuixosCapabilityParser.VIA); - this.state = 1299; + this.state = 1316; this.match(QuixosCapabilityParser.EDGE); - this.state = 1300; + this.state = 1317; this.identifier(); - this.state = 1301; + this.state = 1318; this.match(QuixosCapabilityParser.DOT); - this.state = 1302; + this.state = 1319; this.identifier(); } } - this.state = 1306; + this.state = 1323; this.match(QuixosCapabilityParser.SEMI); } break; @@ -4952,29 +5006,29 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1310; + this.state = 1327; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1311; + this.state = 1328; this.identifier(); - this.state = 1312; + this.state = 1329; this.match(QuixosCapabilityParser.TO); - this.state = 1313; + this.state = 1330; this.identifier(); - this.state = 1314; + this.state = 1331; this.match(QuixosCapabilityParser.DOT); - this.state = 1315; + this.state = 1332; this.identifier(); - this.state = 1317; + this.state = 1334; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 67) { { - this.state = 1316; + this.state = 1333; this.dependencyBindingBlock(); } } - this.state = 1319; + this.state = 1336; this.match(QuixosCapabilityParser.SEMI); } } @@ -4996,230 +5050,185 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 148, QuixosCapabilityParser.RULE_valueType); let _la: number; try { - this.state = 1378; + this.state = 1395; this.errorHandler.sync(this); - switch (this.tokenStream.LA(1)) { - case QuixosCapabilityParser.BOOL: - case QuixosCapabilityParser.BYTES: - case QuixosCapabilityParser.DOUBLE: - case QuixosCapabilityParser.INT32: - case QuixosCapabilityParser.INT64: - case QuixosCapabilityParser.STRING: - case QuixosCapabilityParser.UINT32: - case QuixosCapabilityParser.UINT64: + switch (this.interpreter.adaptivePredict(this.tokenStream, 123, this.context) ) { + case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1321; + this.state = 1338; this.scalarType(); } break; - case QuixosCapabilityParser.UNIT: + case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1322; + this.state = 1339; this.match(QuixosCapabilityParser.UNIT); } break; - case QuixosCapabilityParser.WATCH_HANDLE: + case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1323; + this.state = 1340; this.match(QuixosCapabilityParser.WATCH_HANDLE); } break; - case QuixosCapabilityParser.MESSAGE: + case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1324; + this.state = 1341; this.match(QuixosCapabilityParser.MESSAGE); - this.state = 1325; + this.state = 1342; this.stringLiteral(); } break; - case QuixosCapabilityParser.ATOM_REF: + case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1326; + this.state = 1343; this.match(QuixosCapabilityParser.ATOM_REF); - this.state = 1327; + this.state = 1344; this.match(QuixosCapabilityParser.LT); - this.state = 1328; + this.state = 1345; this.identifier(); - this.state = 1329; + this.state = 1346; this.match(QuixosCapabilityParser.GT); } break; - case QuixosCapabilityParser.INTERFACE_REF: + case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1331; + this.state = 1348; this.match(QuixosCapabilityParser.INTERFACE_REF); - this.state = 1332; + this.state = 1349; this.match(QuixosCapabilityParser.LT); - this.state = 1333; + this.state = 1350; this.identifier(); - this.state = 1335; + this.state = 1352; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 146) { + if (_la === 148) { { - this.state = 1334; + this.state = 1351; this.typeArguments(); } } - this.state = 1337; + this.state = 1354; this.match(QuixosCapabilityParser.GT); } break; - case QuixosCapabilityParser.REF: + case 7: this.enterOuterAlt(localContext, 7); { - this.state = 1339; + this.state = 1356; this.match(QuixosCapabilityParser.REF); - this.state = 1340; + this.state = 1357; this.match(QuixosCapabilityParser.LT); - this.state = 1341; + this.state = 1358; this.identifier(); - this.state = 1342; + this.state = 1359; this.match(QuixosCapabilityParser.GT); } break; - case QuixosCapabilityParser.OPTIONAL: + case 8: this.enterOuterAlt(localContext, 8); { - this.state = 1344; + this.state = 1361; this.match(QuixosCapabilityParser.OPTIONAL); - this.state = 1345; + this.state = 1362; this.match(QuixosCapabilityParser.LT); - this.state = 1346; + this.state = 1363; this.valueType(); - this.state = 1347; + this.state = 1364; this.match(QuixosCapabilityParser.GT); } break; - case QuixosCapabilityParser.LIST: + case 9: this.enterOuterAlt(localContext, 9); { - this.state = 1349; + this.state = 1366; this.match(QuixosCapabilityParser.LIST); - this.state = 1350; + this.state = 1367; this.match(QuixosCapabilityParser.LT); - this.state = 1351; + this.state = 1368; this.valueType(); - this.state = 1352; + this.state = 1369; this.match(QuixosCapabilityParser.GT); } break; - case QuixosCapabilityParser.RECORD: + case 10: this.enterOuterAlt(localContext, 10); { - this.state = 1354; + this.state = 1371; this.match(QuixosCapabilityParser.RECORD); - this.state = 1355; + this.state = 1372; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1359; + this.state = 1376; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 3145729) !== 0) || _la === 109 || _la === 152) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 146801025) !== 0) || _la === 111 || _la === 120 || _la === 154) { { { - this.state = 1356; + this.state = 1373; this.recordField(); } } - this.state = 1361; + this.state = 1378; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1362; + this.state = 1379; this.match(QuixosCapabilityParser.RBRACE); } break; - case QuixosCapabilityParser.VARIANT: + case 11: this.enterOuterAlt(localContext, 11); { - this.state = 1363; + this.state = 1380; this.match(QuixosCapabilityParser.VARIANT); - this.state = 1364; + this.state = 1381; this.match(QuixosCapabilityParser.ID); - this.state = 1365; + this.state = 1382; this.stringLiteral(); - this.state = 1366; + this.state = 1383; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1368; + this.state = 1385; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); do { { { - this.state = 1367; + this.state = 1384; this.variantCase(); } } - this.state = 1370; + this.state = 1387; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - } while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 3145729) !== 0) || _la === 109 || _la === 152); - this.state = 1372; + } while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 146801025) !== 0) || _la === 111 || _la === 120 || _la === 154); + this.state = 1389; this.match(QuixosCapabilityParser.RBRACE); } break; - case QuixosCapabilityParser.EDIT: - case QuixosCapabilityParser.PRESENTATION: - case QuixosCapabilityParser.SUBJECT: - case QuixosCapabilityParser.FOR: - case QuixosCapabilityParser.CREATION: - case QuixosCapabilityParser.INITIALIZE: - case QuixosCapabilityParser.EXECUTION: - case QuixosCapabilityParser.SNAPSHOT: - case QuixosCapabilityParser.TRANSACTION: - case QuixosCapabilityParser.REMOTE: - case QuixosCapabilityParser.TARGETS: - case QuixosCapabilityParser.PORTABLE: - case QuixosCapabilityParser.REPLICA: - case QuixosCapabilityParser.LOCAL: - case QuixosCapabilityParser.FROM: - case QuixosCapabilityParser.RESULT_BYTES: - case QuixosCapabilityParser.RPC_CALLS: - case QuixosCapabilityParser.DEADLINE_MS: - case QuixosCapabilityParser.QUERY: - case QuixosCapabilityParser.REFLECTION: - case QuixosCapabilityParser.SPECIALIZE: - case QuixosCapabilityParser.ROOT: - case QuixosCapabilityParser.DOCUMENT: - case QuixosCapabilityParser.FRAGMENTS: - case QuixosCapabilityParser.VIEW: - case QuixosCapabilityParser.MAX: - case QuixosCapabilityParser.ALLOW: - case QuixosCapabilityParser.POLL: - case QuixosCapabilityParser.QUERYABLE: - case QuixosCapabilityParser.RPC: - case QuixosCapabilityParser.FRAGMENT: - case QuixosCapabilityParser.INTERFACES: - case QuixosCapabilityParser.SOURCE: - case QuixosCapabilityParser.START: - case QuixosCapabilityParser.STOP: - case QuixosCapabilityParser.REGISTER: - case QuixosCapabilityParser.IDENTIFIER: + case 12: this.enterOuterAlt(localContext, 12); { - this.state = 1374; + this.state = 1391; this.identifier(); - this.state = 1376; + this.state = 1393; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 146) { + if (_la === 148) { { - this.state = 1375; + this.state = 1392; this.typeArguments(); } } } break; - default: - throw new antlr.NoViableAltException(this); } } catch (re) { @@ -5241,13 +5250,13 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1380; + this.state = 1397; this.identifier(); - this.state = 1381; + this.state = 1398; this.match(QuixosCapabilityParser.COLON); - this.state = 1382; + this.state = 1399; this.valueType(); - this.state = 1383; + this.state = 1400; this.match(QuixosCapabilityParser.SEMI); } } @@ -5270,17 +5279,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1385; + this.state = 1402; this.identifier(); - this.state = 1386; + this.state = 1403; this.match(QuixosCapabilityParser.ID); - this.state = 1387; + this.state = 1404; this.stringLiteral(); - this.state = 1388; + this.state = 1405; this.match(QuixosCapabilityParser.COLON); - this.state = 1389; + this.state = 1406; this.valueType(); - this.state = 1390; + this.state = 1407; this.match(QuixosCapabilityParser.SEMI); } } @@ -5304,9 +5313,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1392; + this.state = 1409; _la = this.tokenStream.LA(1); - if(!(((((_la - 124)) & ~0x1F) === 0 && ((1 << (_la - 124)) & 255) !== 0))) { + if(!(((((_la - 126)) & ~0x1F) === 0 && ((1 << (_la - 126)) & 255) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -5335,9 +5344,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1394; + this.state = 1411; _la = this.tokenStream.LA(1); - if(!(((((_la - 111)) & ~0x1F) === 0 && ((1 << (_la - 111)) & 15) !== 0))) { + if(!(((((_la - 113)) & ~0x1F) === 0 && ((1 << (_la - 113)) & 15) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -5363,62 +5372,62 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new JsonLiteralContext(this.context, this.state); this.enterRule(localContext, 158, QuixosCapabilityParser.RULE_jsonLiteral); try { - this.state = 1404; + this.state = 1421; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STRING_LITERAL: this.enterOuterAlt(localContext, 1); { - this.state = 1396; + this.state = 1413; this.stringLiteral(); } break; case QuixosCapabilityParser.INTEGER: this.enterOuterAlt(localContext, 2); { - this.state = 1397; + this.state = 1414; this.match(QuixosCapabilityParser.INTEGER); } break; case QuixosCapabilityParser.JSON_NUMBER: this.enterOuterAlt(localContext, 3); { - this.state = 1398; + this.state = 1415; this.match(QuixosCapabilityParser.JSON_NUMBER); } break; case QuixosCapabilityParser.TRUE: this.enterOuterAlt(localContext, 4); { - this.state = 1399; + this.state = 1416; this.match(QuixosCapabilityParser.TRUE); } break; case QuixosCapabilityParser.FALSE: this.enterOuterAlt(localContext, 5); { - this.state = 1400; + this.state = 1417; this.match(QuixosCapabilityParser.FALSE); } break; case QuixosCapabilityParser.NULL: this.enterOuterAlt(localContext, 6); { - this.state = 1401; + this.state = 1418; this.match(QuixosCapabilityParser.NULL); } break; case QuixosCapabilityParser.LBRACE: this.enterOuterAlt(localContext, 7); { - this.state = 1402; + this.state = 1419; this.jsonObject(); } break; case QuixosCapabilityParser.LBRACK: this.enterOuterAlt(localContext, 8); { - this.state = 1403; + this.state = 1420; this.jsonArray(); } break; @@ -5446,35 +5455,35 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1406; + this.state = 1423; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1415; + this.state = 1432; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 153) { + if (_la === 155) { { - this.state = 1407; + this.state = 1424; this.jsonMember(); - this.state = 1412; + this.state = 1429; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 138) { + while (_la === 140) { { { - this.state = 1408; + this.state = 1425; this.match(QuixosCapabilityParser.COMMA); - this.state = 1409; + this.state = 1426; this.jsonMember(); } } - this.state = 1414; + this.state = 1431; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1417; + this.state = 1434; this.match(QuixosCapabilityParser.RBRACE); } } @@ -5497,11 +5506,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1419; + this.state = 1436; this.stringLiteral(); - this.state = 1420; + this.state = 1437; this.match(QuixosCapabilityParser.COLON); - this.state = 1421; + this.state = 1438; this.jsonLiteral(); } } @@ -5525,35 +5534,35 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1423; + this.state = 1440; this.match(QuixosCapabilityParser.LBRACK); - this.state = 1432; + this.state = 1449; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (((((_la - 132)) & ~0x1F) === 0 && ((1 << (_la - 132)) & 2884871) !== 0)) { + if (((((_la - 134)) & ~0x1F) === 0 && ((1 << (_la - 134)) & 2884871) !== 0)) { { - this.state = 1424; + this.state = 1441; this.jsonLiteral(); - this.state = 1429; + this.state = 1446; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 138) { + while (_la === 140) { { { - this.state = 1425; + this.state = 1442; this.match(QuixosCapabilityParser.COMMA); - this.state = 1426; + this.state = 1443; this.jsonLiteral(); } } - this.state = 1431; + this.state = 1448; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1434; + this.state = 1451; this.match(QuixosCapabilityParser.RBRACK); } } @@ -5577,9 +5586,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1436; + this.state = 1453; _la = this.tokenStream.LA(1); - if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 3145729) !== 0) || _la === 109 || _la === 152)) { + if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 146801025) !== 0) || _la === 111 || _la === 120 || _la === 154)) { this.errorHandler.recoverInline(this); } else { @@ -5607,7 +5616,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 1438; + this.state = 1455; this.match(QuixosCapabilityParser.STRING_LITERAL); } } @@ -5626,7 +5635,7 @@ export class QuixosCapabilityParser extends antlr.Parser { } public static readonly _serializedATN: number[] = [ - 4,1,156,1441,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,158,1458,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, @@ -5707,485 +5716,493 @@ export class QuixosCapabilityParser extends antlr.Parser { 47,1,47,1,47,1,47,5,47,945,8,47,10,47,12,47,948,9,47,1,47,1,47,1, 48,1,48,1,49,1,49,1,49,1,50,1,50,3,50,959,8,50,1,51,1,51,1,51,1, 51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,3,51,973,8,51,1,51,1, - 51,1,52,1,52,1,52,1,52,1,52,1,52,3,52,983,8,52,1,53,1,53,1,53,1, - 53,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,54,1,54,3, - 54,1001,8,54,1,54,1,54,3,54,1005,8,54,1,54,3,54,1008,8,54,1,54,1, - 54,3,54,1012,8,54,1,54,3,54,1015,8,54,1,54,1,54,1,55,1,55,3,55,1021, - 8,55,1,55,1,55,3,55,1025,8,55,1,55,1,55,1,55,3,55,1030,8,55,1,55, - 1,55,3,55,1034,8,55,1,55,1,55,3,55,1038,8,55,1,55,1,55,5,55,1042, - 8,55,10,55,12,55,1045,9,55,1,55,1,55,1,56,1,56,1,57,1,57,1,57,1, - 57,1,57,1,57,1,57,3,57,1058,8,57,1,58,1,58,1,58,1,58,1,58,1,58,1, - 58,1,58,1,59,1,59,1,59,5,59,1071,8,59,10,59,12,59,1074,9,59,1,59, - 1,59,1,59,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60, - 1,60,1,60,1,60,3,60,1093,8,60,1,61,1,61,1,61,1,61,1,61,5,61,1100, - 8,61,10,61,12,61,1103,9,61,1,61,1,61,1,62,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,63,1,63,1,63,1,63,1, - 63,1,63,1,63,1,64,1,64,1,64,1,64,1,64,1,64,3,64,1134,8,64,1,64,1, - 64,1,65,1,65,1,65,1,65,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1, - 66,1,66,1,66,1,66,3,66,1154,8,66,1,67,1,67,1,67,1,67,1,67,1,67,1, - 67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,3,67,1174, - 8,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,3,67,1184,8,67,1,67, - 3,67,1187,8,67,1,67,3,67,1190,8,67,3,67,1192,8,67,1,68,1,68,1,68, - 1,69,1,69,1,70,1,70,1,71,1,71,1,71,5,71,1204,8,71,10,71,12,71,1207, - 9,71,1,71,1,71,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72, - 1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,3,72,1230,8,72,1,72, - 1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72, - 3,72,1246,8,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,3,72,1255,8,72, - 1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,3,72,1265,8,72,1,72,1,72, - 1,72,1,72,1,72,1,72,1,72,1,72,1,72,5,72,1276,8,72,10,72,12,72,1279, - 9,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72, - 3,72,1293,8,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72, - 3,72,1305,8,72,1,72,1,72,3,72,1309,8,72,1,73,1,73,1,73,1,73,1,73, - 1,73,1,73,3,73,1318,8,73,1,73,1,73,1,74,1,74,1,74,1,74,1,74,1,74, - 1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,3,74,1336,8,74,1,74,1,74, - 1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74, - 1,74,1,74,1,74,1,74,1,74,5,74,1358,8,74,10,74,12,74,1361,9,74,1, - 74,1,74,1,74,1,74,1,74,1,74,4,74,1369,8,74,11,74,12,74,1370,1,74, - 1,74,1,74,1,74,3,74,1377,8,74,3,74,1379,8,74,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,78,1,78,1,79, - 1,79,1,79,1,79,1,79,1,79,1,79,1,79,3,79,1405,8,79,1,80,1,80,1,80, - 1,80,5,80,1411,8,80,10,80,12,80,1414,9,80,3,80,1416,8,80,1,80,1, - 80,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,5,82,1428,8,82,10,82, - 12,82,1431,9,82,3,82,1433,8,82,1,82,1,82,1,83,1,83,1,84,1,84,1,84, - 0,0,85,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,0,10,1,0,49,50,2,0,17,17,35,35,1, - 0,13,14,1,0,104,108,3,0,1,1,99,103,105,106,3,0,1,1,99,100,105,106, - 2,0,101,103,105,106,1,0,124,131,1,0,111,114,10,0,1,1,4,7,10,10,12, - 35,42,42,47,47,77,77,97,98,109,109,152,152,1560,0,182,1,0,0,0,2, - 184,1,0,0,0,4,194,1,0,0,0,6,198,1,0,0,0,8,223,1,0,0,0,10,235,1,0, - 0,0,12,237,1,0,0,0,14,244,1,0,0,0,16,255,1,0,0,0,18,257,1,0,0,0, - 20,270,1,0,0,0,22,302,1,0,0,0,24,332,1,0,0,0,26,334,1,0,0,0,28,338, - 1,0,0,0,30,356,1,0,0,0,32,358,1,0,0,0,34,371,1,0,0,0,36,373,1,0, - 0,0,38,386,1,0,0,0,40,407,1,0,0,0,42,457,1,0,0,0,44,460,1,0,0,0, - 46,485,1,0,0,0,48,522,1,0,0,0,50,533,1,0,0,0,52,538,1,0,0,0,54,566, - 1,0,0,0,56,568,1,0,0,0,58,578,1,0,0,0,60,590,1,0,0,0,62,637,1,0, - 0,0,64,703,1,0,0,0,66,705,1,0,0,0,68,710,1,0,0,0,70,742,1,0,0,0, - 72,767,1,0,0,0,74,771,1,0,0,0,76,786,1,0,0,0,78,788,1,0,0,0,80,800, - 1,0,0,0,82,813,1,0,0,0,84,816,1,0,0,0,86,836,1,0,0,0,88,838,1,0, - 0,0,90,846,1,0,0,0,92,938,1,0,0,0,94,940,1,0,0,0,96,951,1,0,0,0, - 98,953,1,0,0,0,100,958,1,0,0,0,102,960,1,0,0,0,104,982,1,0,0,0,106, - 984,1,0,0,0,108,993,1,0,0,0,110,1018,1,0,0,0,112,1048,1,0,0,0,114, - 1057,1,0,0,0,116,1059,1,0,0,0,118,1067,1,0,0,0,120,1092,1,0,0,0, - 122,1094,1,0,0,0,124,1106,1,0,0,0,126,1113,1,0,0,0,128,1127,1,0, - 0,0,130,1137,1,0,0,0,132,1153,1,0,0,0,134,1191,1,0,0,0,136,1193, - 1,0,0,0,138,1196,1,0,0,0,140,1198,1,0,0,0,142,1200,1,0,0,0,144,1308, - 1,0,0,0,146,1310,1,0,0,0,148,1378,1,0,0,0,150,1380,1,0,0,0,152,1385, - 1,0,0,0,154,1392,1,0,0,0,156,1394,1,0,0,0,158,1404,1,0,0,0,160,1406, - 1,0,0,0,162,1419,1,0,0,0,164,1423,1,0,0,0,166,1436,1,0,0,0,168,1438, - 1,0,0,0,170,171,3,6,3,0,171,172,5,0,0,1,172,183,1,0,0,0,173,174, - 3,20,10,0,174,175,5,0,0,1,175,183,1,0,0,0,176,177,3,52,26,0,177, - 178,5,0,0,1,178,183,1,0,0,0,179,180,3,2,1,0,180,181,5,0,0,1,181, - 183,1,0,0,0,182,170,1,0,0,0,182,173,1,0,0,0,182,176,1,0,0,0,182, - 179,1,0,0,0,183,1,1,0,0,0,184,185,5,42,0,0,185,189,5,140,0,0,186, - 188,3,8,4,0,187,186,1,0,0,0,188,191,1,0,0,0,189,187,1,0,0,0,189, - 190,1,0,0,0,190,192,1,0,0,0,191,189,1,0,0,0,192,193,5,141,0,0,193, - 3,1,0,0,0,194,195,5,43,0,0,195,196,3,168,84,0,196,197,5,137,0,0, - 197,5,1,0,0,0,198,199,5,11,0,0,199,200,3,166,83,0,200,201,5,87,0, - 0,201,202,3,168,84,0,202,203,5,80,0,0,203,204,3,168,84,0,204,205, - 5,79,0,0,205,206,3,168,84,0,206,210,5,140,0,0,207,209,3,8,4,0,208, - 207,1,0,0,0,209,212,1,0,0,0,210,208,1,0,0,0,210,211,1,0,0,0,211, - 213,1,0,0,0,212,210,1,0,0,0,213,214,5,141,0,0,214,7,1,0,0,0,215, - 224,3,4,2,0,216,224,3,18,9,0,217,224,3,10,5,0,218,224,3,98,49,0, - 219,224,3,110,55,0,220,224,3,146,73,0,221,224,3,58,29,0,222,224, - 3,32,16,0,223,215,1,0,0,0,223,216,1,0,0,0,223,217,1,0,0,0,223,218, - 1,0,0,0,223,219,1,0,0,0,223,220,1,0,0,0,223,221,1,0,0,0,223,222, - 1,0,0,0,224,9,1,0,0,0,225,226,5,43,0,0,226,227,5,46,0,0,227,228, - 3,166,83,0,228,229,5,137,0,0,229,236,1,0,0,0,230,231,5,43,0,0,231, - 232,5,48,0,0,232,233,3,166,83,0,233,234,5,137,0,0,234,236,1,0,0, - 0,235,225,1,0,0,0,235,230,1,0,0,0,236,11,1,0,0,0,237,238,5,44,0, - 0,238,239,5,45,0,0,239,240,3,166,83,0,240,241,5,87,0,0,241,242,3, - 168,84,0,242,243,5,137,0,0,243,13,1,0,0,0,244,245,5,44,0,0,245,246, - 5,46,0,0,246,247,3,166,83,0,247,248,5,80,0,0,248,249,3,168,84,0, - 249,250,5,137,0,0,250,15,1,0,0,0,251,256,3,10,5,0,252,256,3,12,6, - 0,253,256,3,14,7,0,254,256,3,32,16,0,255,251,1,0,0,0,255,252,1,0, - 0,0,255,253,1,0,0,0,255,254,1,0,0,0,256,17,1,0,0,0,257,258,5,45, - 0,0,258,259,3,166,83,0,259,260,5,87,0,0,260,263,3,168,84,0,261,262, - 5,88,0,0,262,264,3,168,84,0,263,261,1,0,0,0,263,264,1,0,0,0,264, - 265,1,0,0,0,265,266,5,137,0,0,266,19,1,0,0,0,267,269,3,16,8,0,268, - 267,1,0,0,0,269,272,1,0,0,0,270,268,1,0,0,0,270,271,1,0,0,0,271, - 273,1,0,0,0,272,270,1,0,0,0,273,274,5,46,0,0,274,276,3,166,83,0, - 275,277,3,22,11,0,276,275,1,0,0,0,276,277,1,0,0,0,277,278,1,0,0, - 0,278,279,5,87,0,0,279,280,3,168,84,0,280,281,5,80,0,0,281,291,3, - 168,84,0,282,283,5,92,0,0,283,288,3,26,13,0,284,285,5,138,0,0,285, - 287,3,26,13,0,286,284,1,0,0,0,287,290,1,0,0,0,288,286,1,0,0,0,288, - 289,1,0,0,0,289,292,1,0,0,0,290,288,1,0,0,0,291,282,1,0,0,0,291, - 292,1,0,0,0,292,293,1,0,0,0,293,297,5,140,0,0,294,296,3,34,17,0, - 295,294,1,0,0,0,296,299,1,0,0,0,297,295,1,0,0,0,297,298,1,0,0,0, - 298,300,1,0,0,0,299,297,1,0,0,0,300,301,5,141,0,0,301,21,1,0,0,0, - 302,303,5,146,0,0,303,308,3,24,12,0,304,305,5,138,0,0,305,307,3, - 24,12,0,306,304,1,0,0,0,307,310,1,0,0,0,308,306,1,0,0,0,308,309, - 1,0,0,0,309,311,1,0,0,0,310,308,1,0,0,0,311,312,5,147,0,0,312,23, - 1,0,0,0,313,314,5,49,0,0,314,317,3,166,83,0,315,316,5,136,0,0,316, - 318,5,39,0,0,317,315,1,0,0,0,317,318,1,0,0,0,318,333,1,0,0,0,319, - 320,5,38,0,0,320,330,3,166,83,0,321,322,5,40,0,0,322,327,3,26,13, - 0,323,324,5,148,0,0,324,326,3,26,13,0,325,323,1,0,0,0,326,329,1, - 0,0,0,327,325,1,0,0,0,327,328,1,0,0,0,328,331,1,0,0,0,329,327,1, - 0,0,0,330,321,1,0,0,0,330,331,1,0,0,0,331,333,1,0,0,0,332,313,1, - 0,0,0,332,319,1,0,0,0,333,25,1,0,0,0,334,336,3,166,83,0,335,337, - 3,28,14,0,336,335,1,0,0,0,336,337,1,0,0,0,337,27,1,0,0,0,338,339, - 5,146,0,0,339,344,3,30,15,0,340,341,5,138,0,0,341,343,3,30,15,0, - 342,340,1,0,0,0,343,346,1,0,0,0,344,342,1,0,0,0,344,345,1,0,0,0, - 345,347,1,0,0,0,346,344,1,0,0,0,347,348,5,147,0,0,348,29,1,0,0,0, - 349,350,5,45,0,0,350,357,3,166,83,0,351,352,5,46,0,0,352,357,3,26, - 13,0,353,354,5,38,0,0,354,357,3,166,83,0,355,357,3,148,74,0,356, - 349,1,0,0,0,356,351,1,0,0,0,356,353,1,0,0,0,356,355,1,0,0,0,357, - 31,1,0,0,0,358,359,5,37,0,0,359,361,3,166,83,0,360,362,3,22,11,0, - 361,360,1,0,0,0,361,362,1,0,0,0,362,363,1,0,0,0,363,364,5,149,0, - 0,364,365,3,148,74,0,365,366,5,137,0,0,366,33,1,0,0,0,367,372,3, - 40,20,0,368,372,3,44,22,0,369,372,3,38,19,0,370,372,3,36,18,0,371, - 367,1,0,0,0,371,368,1,0,0,0,371,369,1,0,0,0,371,370,1,0,0,0,372, - 35,1,0,0,0,373,374,5,2,0,0,374,375,3,166,83,0,375,376,5,87,0,0,376, - 377,3,168,84,0,377,378,5,3,0,0,378,381,3,168,84,0,379,380,5,5,0, - 0,380,382,3,50,25,0,381,379,1,0,0,0,381,382,1,0,0,0,382,383,1,0, - 0,0,383,384,5,137,0,0,384,37,1,0,0,0,385,387,5,60,0,0,386,385,1, - 0,0,0,386,387,1,0,0,0,387,388,1,0,0,0,388,389,5,52,0,0,389,390,3, - 166,83,0,390,391,5,87,0,0,391,392,3,168,84,0,392,393,5,136,0,0,393, - 394,3,148,74,0,394,395,5,135,0,0,395,396,3,148,74,0,396,397,5,140, - 0,0,397,398,5,104,0,0,398,399,5,87,0,0,399,401,3,168,84,0,400,402, - 3,76,38,0,401,400,1,0,0,0,401,402,1,0,0,0,402,403,1,0,0,0,403,404, - 5,137,0,0,404,405,5,141,0,0,405,39,1,0,0,0,406,408,3,46,23,0,407, - 406,1,0,0,0,407,408,1,0,0,0,408,409,1,0,0,0,409,410,7,0,0,0,410, - 411,3,166,83,0,411,412,5,87,0,0,412,413,3,168,84,0,413,414,5,136, - 0,0,414,415,3,148,74,0,415,419,5,140,0,0,416,418,3,42,21,0,417,416, - 1,0,0,0,418,421,1,0,0,0,419,417,1,0,0,0,419,420,1,0,0,0,420,422, - 1,0,0,0,421,419,1,0,0,0,422,423,5,141,0,0,423,41,1,0,0,0,424,425, - 5,94,0,0,425,426,5,87,0,0,426,428,3,168,84,0,427,429,3,76,38,0,428, - 427,1,0,0,0,428,429,1,0,0,0,429,430,1,0,0,0,430,431,5,137,0,0,431, - 458,1,0,0,0,432,433,5,95,0,0,433,434,5,87,0,0,434,436,3,168,84,0, - 435,437,3,76,38,0,436,435,1,0,0,0,436,437,1,0,0,0,437,438,1,0,0, - 0,438,439,5,137,0,0,439,458,1,0,0,0,440,441,5,1,0,0,441,442,5,87, - 0,0,442,444,3,168,84,0,443,445,3,76,38,0,444,443,1,0,0,0,444,445, - 1,0,0,0,445,446,1,0,0,0,446,447,5,137,0,0,447,458,1,0,0,0,448,449, - 5,96,0,0,449,450,5,97,0,0,450,451,5,87,0,0,451,452,3,168,84,0,452, - 453,5,98,0,0,453,454,5,87,0,0,454,455,3,168,84,0,455,456,5,137,0, - 0,456,458,1,0,0,0,457,424,1,0,0,0,457,432,1,0,0,0,457,440,1,0,0, - 0,457,448,1,0,0,0,458,43,1,0,0,0,459,461,3,46,23,0,460,459,1,0,0, - 0,460,461,1,0,0,0,461,462,1,0,0,0,462,463,5,51,0,0,463,464,3,166, - 83,0,464,465,5,87,0,0,465,466,3,168,84,0,466,467,5,136,0,0,467,468, - 3,156,78,0,468,470,3,50,25,0,469,471,5,115,0,0,470,469,1,0,0,0,470, - 471,1,0,0,0,471,474,1,0,0,0,472,473,5,85,0,0,473,475,3,168,84,0, - 474,472,1,0,0,0,474,475,1,0,0,0,475,476,1,0,0,0,476,480,5,140,0, - 0,477,479,3,48,24,0,478,477,1,0,0,0,479,482,1,0,0,0,480,478,1,0, - 0,0,480,481,1,0,0,0,481,483,1,0,0,0,482,480,1,0,0,0,483,484,5,141, - 0,0,484,45,1,0,0,0,485,487,5,34,0,0,486,488,7,1,0,0,487,486,1,0, - 0,0,487,488,1,0,0,0,488,47,1,0,0,0,489,490,5,101,0,0,490,491,5,87, - 0,0,491,493,3,168,84,0,492,494,3,76,38,0,493,492,1,0,0,0,493,494, - 1,0,0,0,494,495,1,0,0,0,495,496,5,137,0,0,496,523,1,0,0,0,497,498, - 5,102,0,0,498,499,5,87,0,0,499,501,3,168,84,0,500,502,3,76,38,0, - 501,500,1,0,0,0,501,502,1,0,0,0,502,503,1,0,0,0,503,504,5,137,0, - 0,504,523,1,0,0,0,505,506,5,103,0,0,506,507,5,87,0,0,507,509,3,168, - 84,0,508,510,3,76,38,0,509,508,1,0,0,0,509,510,1,0,0,0,510,511,1, - 0,0,0,511,512,5,137,0,0,512,523,1,0,0,0,513,514,5,96,0,0,514,515, - 5,97,0,0,515,516,5,87,0,0,516,517,3,168,84,0,517,518,5,98,0,0,518, - 519,5,87,0,0,519,520,3,168,84,0,520,521,5,137,0,0,521,523,1,0,0, - 0,522,489,1,0,0,0,522,497,1,0,0,0,522,505,1,0,0,0,522,513,1,0,0, - 0,523,49,1,0,0,0,524,525,5,45,0,0,525,534,3,166,83,0,526,527,5,46, - 0,0,527,529,3,166,83,0,528,530,3,28,14,0,529,528,1,0,0,0,529,530, - 1,0,0,0,530,534,1,0,0,0,531,532,5,38,0,0,532,534,3,166,83,0,533, - 524,1,0,0,0,533,526,1,0,0,0,533,531,1,0,0,0,534,51,1,0,0,0,535,537, - 3,16,8,0,536,535,1,0,0,0,537,540,1,0,0,0,538,536,1,0,0,0,538,539, - 1,0,0,0,539,541,1,0,0,0,540,538,1,0,0,0,541,542,5,48,0,0,542,543, - 3,166,83,0,543,544,5,87,0,0,544,545,3,168,84,0,545,546,5,80,0,0, - 546,549,3,168,84,0,547,548,5,81,0,0,548,550,5,150,0,0,549,547,1, - 0,0,0,549,550,1,0,0,0,550,551,1,0,0,0,551,555,5,140,0,0,552,554, - 3,54,27,0,553,552,1,0,0,0,554,557,1,0,0,0,555,553,1,0,0,0,555,556, - 1,0,0,0,556,558,1,0,0,0,557,555,1,0,0,0,558,559,5,141,0,0,559,53, - 1,0,0,0,560,567,3,68,34,0,561,567,3,70,35,0,562,567,3,80,40,0,563, - 567,3,60,30,0,564,567,3,62,31,0,565,567,3,56,28,0,566,560,1,0,0, - 0,566,561,1,0,0,0,566,562,1,0,0,0,566,563,1,0,0,0,566,564,1,0,0, - 0,566,565,1,0,0,0,567,55,1,0,0,0,568,569,5,2,0,0,569,570,3,166,83, - 0,570,571,5,87,0,0,571,572,3,168,84,0,572,573,5,40,0,0,573,574,3, - 26,13,0,574,575,5,139,0,0,575,576,3,166,83,0,576,577,5,137,0,0,577, - 57,1,0,0,0,578,579,5,4,0,0,579,580,3,166,83,0,580,581,5,87,0,0,581, - 582,3,168,84,0,582,583,5,6,0,0,583,584,3,26,13,0,584,585,5,68,0, - 0,585,586,3,166,83,0,586,587,5,139,0,0,587,588,3,166,83,0,588,589, - 5,137,0,0,589,59,1,0,0,0,590,592,5,24,0,0,591,593,5,42,0,0,592,591, - 1,0,0,0,592,593,1,0,0,0,593,594,1,0,0,0,594,596,3,166,83,0,595,597, - 3,22,11,0,596,595,1,0,0,0,596,597,1,0,0,0,597,598,1,0,0,0,598,599, - 5,87,0,0,599,600,3,168,84,0,600,602,5,27,0,0,601,603,5,11,0,0,602, + 51,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1, + 52,3,52,990,8,52,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1, + 54,1,54,1,54,1,54,1,54,1,54,1,54,3,54,1008,8,54,1,54,1,54,3,54,1012, + 8,54,1,54,3,54,1015,8,54,1,54,1,54,3,54,1019,8,54,1,54,3,54,1022, + 8,54,1,54,1,54,1,55,1,55,3,55,1028,8,55,1,55,1,55,3,55,1032,8,55, + 1,55,1,55,1,55,3,55,1037,8,55,1,55,1,55,3,55,1041,8,55,1,55,1,55, + 3,55,1045,8,55,1,55,1,55,5,55,1049,8,55,10,55,12,55,1052,9,55,1, + 55,1,55,1,56,1,56,1,57,1,57,1,57,1,57,1,57,1,57,1,57,3,57,1065,8, + 57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,59,1,59,1,59,5,59,1078, + 8,59,10,59,12,59,1081,9,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60,1, + 60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,3,60,1100,8,60,1, + 61,1,61,1,61,1,61,1,61,5,61,1107,8,61,10,61,12,61,1110,9,61,1,61, + 1,61,1,62,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,63,1,63,1,63,1,63,1,63,1,63,1,63,1,64,1,64,1,64,1,64, + 1,64,1,64,3,64,1141,8,64,1,64,1,64,1,65,1,65,1,65,1,65,1,66,1,66, + 1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,3,66,1161,8,66, + 1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67, + 1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67, + 1,67,1,67,3,67,1191,8,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67, + 3,67,1201,8,67,1,67,3,67,1204,8,67,1,67,3,67,1207,8,67,3,67,1209, + 8,67,1,68,1,68,1,68,1,69,1,69,1,70,1,70,1,71,1,71,1,71,5,71,1221, + 8,71,10,71,12,71,1224,9,71,1,71,1,71,1,72,1,72,1,72,1,72,1,72,1, + 72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1, + 72,3,72,1247,8,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1, + 72,1,72,1,72,1,72,1,72,3,72,1263,8,72,1,72,1,72,1,72,1,72,1,72,1, + 72,1,72,3,72,1272,8,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,3, + 72,1282,8,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,5,72,1293, + 8,72,10,72,12,72,1296,9,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1, + 72,1,72,1,72,1,72,1,72,3,72,1310,8,72,1,72,1,72,1,72,1,72,1,72,1, + 72,1,72,1,72,1,72,1,72,3,72,1322,8,72,1,72,1,72,3,72,1326,8,72,1, + 73,1,73,1,73,1,73,1,73,1,73,1,73,3,73,1335,8,73,1,73,1,73,1,74,1, + 74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,3, + 74,1353,8,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1, + 74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,5,74,1375,8,74,10, + 74,12,74,1378,9,74,1,74,1,74,1,74,1,74,1,74,1,74,4,74,1386,8,74, + 11,74,12,74,1387,1,74,1,74,1,74,1,74,3,74,1394,8,74,3,74,1396,8, + 74,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,78,1,78,1,79,1,79,1,79,1,79,1,79,1,79,1,79,1,79,3,79,1422, + 8,79,1,80,1,80,1,80,1,80,5,80,1428,8,80,10,80,12,80,1431,9,80,3, + 80,1433,8,80,1,80,1,80,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,5, + 82,1445,8,82,10,82,12,82,1448,9,82,3,82,1450,8,82,1,82,1,82,1,83, + 1,83,1,84,1,84,1,84,0,0,85,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,0,10,1,0,49, + 50,2,0,17,17,35,35,1,0,13,14,1,0,106,110,3,0,1,1,101,105,107,108, + 3,0,1,1,101,102,107,108,2,0,103,105,107,108,1,0,126,133,1,0,113, + 116,13,0,1,1,4,7,10,10,12,35,42,42,47,47,77,77,84,85,99,100,104, + 104,111,111,120,120,154,154,1581,0,182,1,0,0,0,2,184,1,0,0,0,4,194, + 1,0,0,0,6,198,1,0,0,0,8,223,1,0,0,0,10,235,1,0,0,0,12,237,1,0,0, + 0,14,244,1,0,0,0,16,255,1,0,0,0,18,257,1,0,0,0,20,270,1,0,0,0,22, + 302,1,0,0,0,24,332,1,0,0,0,26,334,1,0,0,0,28,338,1,0,0,0,30,356, + 1,0,0,0,32,358,1,0,0,0,34,371,1,0,0,0,36,373,1,0,0,0,38,386,1,0, + 0,0,40,407,1,0,0,0,42,457,1,0,0,0,44,460,1,0,0,0,46,485,1,0,0,0, + 48,522,1,0,0,0,50,533,1,0,0,0,52,538,1,0,0,0,54,566,1,0,0,0,56,568, + 1,0,0,0,58,578,1,0,0,0,60,590,1,0,0,0,62,637,1,0,0,0,64,703,1,0, + 0,0,66,705,1,0,0,0,68,710,1,0,0,0,70,742,1,0,0,0,72,767,1,0,0,0, + 74,771,1,0,0,0,76,786,1,0,0,0,78,788,1,0,0,0,80,800,1,0,0,0,82,813, + 1,0,0,0,84,816,1,0,0,0,86,836,1,0,0,0,88,838,1,0,0,0,90,846,1,0, + 0,0,92,938,1,0,0,0,94,940,1,0,0,0,96,951,1,0,0,0,98,953,1,0,0,0, + 100,958,1,0,0,0,102,960,1,0,0,0,104,989,1,0,0,0,106,991,1,0,0,0, + 108,1000,1,0,0,0,110,1025,1,0,0,0,112,1055,1,0,0,0,114,1064,1,0, + 0,0,116,1066,1,0,0,0,118,1074,1,0,0,0,120,1099,1,0,0,0,122,1101, + 1,0,0,0,124,1113,1,0,0,0,126,1120,1,0,0,0,128,1134,1,0,0,0,130,1144, + 1,0,0,0,132,1160,1,0,0,0,134,1208,1,0,0,0,136,1210,1,0,0,0,138,1213, + 1,0,0,0,140,1215,1,0,0,0,142,1217,1,0,0,0,144,1325,1,0,0,0,146,1327, + 1,0,0,0,148,1395,1,0,0,0,150,1397,1,0,0,0,152,1402,1,0,0,0,154,1409, + 1,0,0,0,156,1411,1,0,0,0,158,1421,1,0,0,0,160,1423,1,0,0,0,162,1436, + 1,0,0,0,164,1440,1,0,0,0,166,1453,1,0,0,0,168,1455,1,0,0,0,170,171, + 3,6,3,0,171,172,5,0,0,1,172,183,1,0,0,0,173,174,3,20,10,0,174,175, + 5,0,0,1,175,183,1,0,0,0,176,177,3,52,26,0,177,178,5,0,0,1,178,183, + 1,0,0,0,179,180,3,2,1,0,180,181,5,0,0,1,181,183,1,0,0,0,182,170, + 1,0,0,0,182,173,1,0,0,0,182,176,1,0,0,0,182,179,1,0,0,0,183,1,1, + 0,0,0,184,185,5,42,0,0,185,189,5,142,0,0,186,188,3,8,4,0,187,186, + 1,0,0,0,188,191,1,0,0,0,189,187,1,0,0,0,189,190,1,0,0,0,190,192, + 1,0,0,0,191,189,1,0,0,0,192,193,5,143,0,0,193,3,1,0,0,0,194,195, + 5,43,0,0,195,196,3,168,84,0,196,197,5,139,0,0,197,5,1,0,0,0,198, + 199,5,11,0,0,199,200,3,166,83,0,200,201,5,89,0,0,201,202,3,168,84, + 0,202,203,5,80,0,0,203,204,3,168,84,0,204,205,5,79,0,0,205,206,3, + 168,84,0,206,210,5,142,0,0,207,209,3,8,4,0,208,207,1,0,0,0,209,212, + 1,0,0,0,210,208,1,0,0,0,210,211,1,0,0,0,211,213,1,0,0,0,212,210, + 1,0,0,0,213,214,5,143,0,0,214,7,1,0,0,0,215,224,3,4,2,0,216,224, + 3,18,9,0,217,224,3,10,5,0,218,224,3,98,49,0,219,224,3,110,55,0,220, + 224,3,146,73,0,221,224,3,58,29,0,222,224,3,32,16,0,223,215,1,0,0, + 0,223,216,1,0,0,0,223,217,1,0,0,0,223,218,1,0,0,0,223,219,1,0,0, + 0,223,220,1,0,0,0,223,221,1,0,0,0,223,222,1,0,0,0,224,9,1,0,0,0, + 225,226,5,43,0,0,226,227,5,46,0,0,227,228,3,166,83,0,228,229,5,139, + 0,0,229,236,1,0,0,0,230,231,5,43,0,0,231,232,5,48,0,0,232,233,3, + 166,83,0,233,234,5,139,0,0,234,236,1,0,0,0,235,225,1,0,0,0,235,230, + 1,0,0,0,236,11,1,0,0,0,237,238,5,44,0,0,238,239,5,45,0,0,239,240, + 3,166,83,0,240,241,5,89,0,0,241,242,3,168,84,0,242,243,5,139,0,0, + 243,13,1,0,0,0,244,245,5,44,0,0,245,246,5,46,0,0,246,247,3,166,83, + 0,247,248,5,80,0,0,248,249,3,168,84,0,249,250,5,139,0,0,250,15,1, + 0,0,0,251,256,3,10,5,0,252,256,3,12,6,0,253,256,3,14,7,0,254,256, + 3,32,16,0,255,251,1,0,0,0,255,252,1,0,0,0,255,253,1,0,0,0,255,254, + 1,0,0,0,256,17,1,0,0,0,257,258,5,45,0,0,258,259,3,166,83,0,259,260, + 5,89,0,0,260,263,3,168,84,0,261,262,5,90,0,0,262,264,3,168,84,0, + 263,261,1,0,0,0,263,264,1,0,0,0,264,265,1,0,0,0,265,266,5,139,0, + 0,266,19,1,0,0,0,267,269,3,16,8,0,268,267,1,0,0,0,269,272,1,0,0, + 0,270,268,1,0,0,0,270,271,1,0,0,0,271,273,1,0,0,0,272,270,1,0,0, + 0,273,274,5,46,0,0,274,276,3,166,83,0,275,277,3,22,11,0,276,275, + 1,0,0,0,276,277,1,0,0,0,277,278,1,0,0,0,278,279,5,89,0,0,279,280, + 3,168,84,0,280,281,5,80,0,0,281,291,3,168,84,0,282,283,5,94,0,0, + 283,288,3,26,13,0,284,285,5,140,0,0,285,287,3,26,13,0,286,284,1, + 0,0,0,287,290,1,0,0,0,288,286,1,0,0,0,288,289,1,0,0,0,289,292,1, + 0,0,0,290,288,1,0,0,0,291,282,1,0,0,0,291,292,1,0,0,0,292,293,1, + 0,0,0,293,297,5,142,0,0,294,296,3,34,17,0,295,294,1,0,0,0,296,299, + 1,0,0,0,297,295,1,0,0,0,297,298,1,0,0,0,298,300,1,0,0,0,299,297, + 1,0,0,0,300,301,5,143,0,0,301,21,1,0,0,0,302,303,5,148,0,0,303,308, + 3,24,12,0,304,305,5,140,0,0,305,307,3,24,12,0,306,304,1,0,0,0,307, + 310,1,0,0,0,308,306,1,0,0,0,308,309,1,0,0,0,309,311,1,0,0,0,310, + 308,1,0,0,0,311,312,5,149,0,0,312,23,1,0,0,0,313,314,5,49,0,0,314, + 317,3,166,83,0,315,316,5,138,0,0,316,318,5,39,0,0,317,315,1,0,0, + 0,317,318,1,0,0,0,318,333,1,0,0,0,319,320,5,38,0,0,320,330,3,166, + 83,0,321,322,5,40,0,0,322,327,3,26,13,0,323,324,5,150,0,0,324,326, + 3,26,13,0,325,323,1,0,0,0,326,329,1,0,0,0,327,325,1,0,0,0,327,328, + 1,0,0,0,328,331,1,0,0,0,329,327,1,0,0,0,330,321,1,0,0,0,330,331, + 1,0,0,0,331,333,1,0,0,0,332,313,1,0,0,0,332,319,1,0,0,0,333,25,1, + 0,0,0,334,336,3,166,83,0,335,337,3,28,14,0,336,335,1,0,0,0,336,337, + 1,0,0,0,337,27,1,0,0,0,338,339,5,148,0,0,339,344,3,30,15,0,340,341, + 5,140,0,0,341,343,3,30,15,0,342,340,1,0,0,0,343,346,1,0,0,0,344, + 342,1,0,0,0,344,345,1,0,0,0,345,347,1,0,0,0,346,344,1,0,0,0,347, + 348,5,149,0,0,348,29,1,0,0,0,349,350,5,45,0,0,350,357,3,166,83,0, + 351,352,5,46,0,0,352,357,3,26,13,0,353,354,5,38,0,0,354,357,3,166, + 83,0,355,357,3,148,74,0,356,349,1,0,0,0,356,351,1,0,0,0,356,353, + 1,0,0,0,356,355,1,0,0,0,357,31,1,0,0,0,358,359,5,37,0,0,359,361, + 3,166,83,0,360,362,3,22,11,0,361,360,1,0,0,0,361,362,1,0,0,0,362, + 363,1,0,0,0,363,364,5,151,0,0,364,365,3,148,74,0,365,366,5,139,0, + 0,366,33,1,0,0,0,367,372,3,40,20,0,368,372,3,44,22,0,369,372,3,38, + 19,0,370,372,3,36,18,0,371,367,1,0,0,0,371,368,1,0,0,0,371,369,1, + 0,0,0,371,370,1,0,0,0,372,35,1,0,0,0,373,374,5,2,0,0,374,375,3,166, + 83,0,375,376,5,89,0,0,376,377,3,168,84,0,377,378,5,3,0,0,378,381, + 3,168,84,0,379,380,5,5,0,0,380,382,3,50,25,0,381,379,1,0,0,0,381, + 382,1,0,0,0,382,383,1,0,0,0,383,384,5,139,0,0,384,37,1,0,0,0,385, + 387,5,60,0,0,386,385,1,0,0,0,386,387,1,0,0,0,387,388,1,0,0,0,388, + 389,5,52,0,0,389,390,3,166,83,0,390,391,5,89,0,0,391,392,3,168,84, + 0,392,393,5,138,0,0,393,394,3,148,74,0,394,395,5,137,0,0,395,396, + 3,148,74,0,396,397,5,142,0,0,397,398,5,106,0,0,398,399,5,89,0,0, + 399,401,3,168,84,0,400,402,3,76,38,0,401,400,1,0,0,0,401,402,1,0, + 0,0,402,403,1,0,0,0,403,404,5,139,0,0,404,405,5,143,0,0,405,39,1, + 0,0,0,406,408,3,46,23,0,407,406,1,0,0,0,407,408,1,0,0,0,408,409, + 1,0,0,0,409,410,7,0,0,0,410,411,3,166,83,0,411,412,5,89,0,0,412, + 413,3,168,84,0,413,414,5,138,0,0,414,415,3,148,74,0,415,419,5,142, + 0,0,416,418,3,42,21,0,417,416,1,0,0,0,418,421,1,0,0,0,419,417,1, + 0,0,0,419,420,1,0,0,0,420,422,1,0,0,0,421,419,1,0,0,0,422,423,5, + 143,0,0,423,41,1,0,0,0,424,425,5,96,0,0,425,426,5,89,0,0,426,428, + 3,168,84,0,427,429,3,76,38,0,428,427,1,0,0,0,428,429,1,0,0,0,429, + 430,1,0,0,0,430,431,5,139,0,0,431,458,1,0,0,0,432,433,5,97,0,0,433, + 434,5,89,0,0,434,436,3,168,84,0,435,437,3,76,38,0,436,435,1,0,0, + 0,436,437,1,0,0,0,437,438,1,0,0,0,438,439,5,139,0,0,439,458,1,0, + 0,0,440,441,5,1,0,0,441,442,5,89,0,0,442,444,3,168,84,0,443,445, + 3,76,38,0,444,443,1,0,0,0,444,445,1,0,0,0,445,446,1,0,0,0,446,447, + 5,139,0,0,447,458,1,0,0,0,448,449,5,98,0,0,449,450,5,99,0,0,450, + 451,5,89,0,0,451,452,3,168,84,0,452,453,5,100,0,0,453,454,5,89,0, + 0,454,455,3,168,84,0,455,456,5,139,0,0,456,458,1,0,0,0,457,424,1, + 0,0,0,457,432,1,0,0,0,457,440,1,0,0,0,457,448,1,0,0,0,458,43,1,0, + 0,0,459,461,3,46,23,0,460,459,1,0,0,0,460,461,1,0,0,0,461,462,1, + 0,0,0,462,463,5,51,0,0,463,464,3,166,83,0,464,465,5,89,0,0,465,466, + 3,168,84,0,466,467,5,138,0,0,467,468,3,156,78,0,468,470,3,50,25, + 0,469,471,5,117,0,0,470,469,1,0,0,0,470,471,1,0,0,0,471,474,1,0, + 0,0,472,473,5,87,0,0,473,475,3,168,84,0,474,472,1,0,0,0,474,475, + 1,0,0,0,475,476,1,0,0,0,476,480,5,142,0,0,477,479,3,48,24,0,478, + 477,1,0,0,0,479,482,1,0,0,0,480,478,1,0,0,0,480,481,1,0,0,0,481, + 483,1,0,0,0,482,480,1,0,0,0,483,484,5,143,0,0,484,45,1,0,0,0,485, + 487,5,34,0,0,486,488,7,1,0,0,487,486,1,0,0,0,487,488,1,0,0,0,488, + 47,1,0,0,0,489,490,5,103,0,0,490,491,5,89,0,0,491,493,3,168,84,0, + 492,494,3,76,38,0,493,492,1,0,0,0,493,494,1,0,0,0,494,495,1,0,0, + 0,495,496,5,139,0,0,496,523,1,0,0,0,497,498,5,104,0,0,498,499,5, + 89,0,0,499,501,3,168,84,0,500,502,3,76,38,0,501,500,1,0,0,0,501, + 502,1,0,0,0,502,503,1,0,0,0,503,504,5,139,0,0,504,523,1,0,0,0,505, + 506,5,105,0,0,506,507,5,89,0,0,507,509,3,168,84,0,508,510,3,76,38, + 0,509,508,1,0,0,0,509,510,1,0,0,0,510,511,1,0,0,0,511,512,5,139, + 0,0,512,523,1,0,0,0,513,514,5,98,0,0,514,515,5,99,0,0,515,516,5, + 89,0,0,516,517,3,168,84,0,517,518,5,100,0,0,518,519,5,89,0,0,519, + 520,3,168,84,0,520,521,5,139,0,0,521,523,1,0,0,0,522,489,1,0,0,0, + 522,497,1,0,0,0,522,505,1,0,0,0,522,513,1,0,0,0,523,49,1,0,0,0,524, + 525,5,45,0,0,525,534,3,166,83,0,526,527,5,46,0,0,527,529,3,166,83, + 0,528,530,3,28,14,0,529,528,1,0,0,0,529,530,1,0,0,0,530,534,1,0, + 0,0,531,532,5,38,0,0,532,534,3,166,83,0,533,524,1,0,0,0,533,526, + 1,0,0,0,533,531,1,0,0,0,534,51,1,0,0,0,535,537,3,16,8,0,536,535, + 1,0,0,0,537,540,1,0,0,0,538,536,1,0,0,0,538,539,1,0,0,0,539,541, + 1,0,0,0,540,538,1,0,0,0,541,542,5,48,0,0,542,543,3,166,83,0,543, + 544,5,89,0,0,544,545,3,168,84,0,545,546,5,80,0,0,546,549,3,168,84, + 0,547,548,5,81,0,0,548,550,5,152,0,0,549,547,1,0,0,0,549,550,1,0, + 0,0,550,551,1,0,0,0,551,555,5,142,0,0,552,554,3,54,27,0,553,552, + 1,0,0,0,554,557,1,0,0,0,555,553,1,0,0,0,555,556,1,0,0,0,556,558, + 1,0,0,0,557,555,1,0,0,0,558,559,5,143,0,0,559,53,1,0,0,0,560,567, + 3,68,34,0,561,567,3,70,35,0,562,567,3,80,40,0,563,567,3,60,30,0, + 564,567,3,62,31,0,565,567,3,56,28,0,566,560,1,0,0,0,566,561,1,0, + 0,0,566,562,1,0,0,0,566,563,1,0,0,0,566,564,1,0,0,0,566,565,1,0, + 0,0,567,55,1,0,0,0,568,569,5,2,0,0,569,570,3,166,83,0,570,571,5, + 89,0,0,571,572,3,168,84,0,572,573,5,40,0,0,573,574,3,26,13,0,574, + 575,5,141,0,0,575,576,3,166,83,0,576,577,5,139,0,0,577,57,1,0,0, + 0,578,579,5,4,0,0,579,580,3,166,83,0,580,581,5,89,0,0,581,582,3, + 168,84,0,582,583,5,6,0,0,583,584,3,26,13,0,584,585,5,68,0,0,585, + 586,3,166,83,0,586,587,5,141,0,0,587,588,3,166,83,0,588,589,5,139, + 0,0,589,59,1,0,0,0,590,592,5,24,0,0,591,593,5,42,0,0,592,591,1,0, + 0,0,592,593,1,0,0,0,593,594,1,0,0,0,594,596,3,166,83,0,595,597,3, + 22,11,0,596,595,1,0,0,0,596,597,1,0,0,0,597,598,1,0,0,0,598,599, + 5,89,0,0,599,600,3,168,84,0,600,602,5,27,0,0,601,603,5,11,0,0,602, 601,1,0,0,0,602,603,1,0,0,0,603,604,1,0,0,0,604,605,3,26,13,0,605, 606,5,28,0,0,606,635,3,168,84,0,607,608,5,52,0,0,608,609,3,168,84, - 0,609,613,5,140,0,0,610,612,3,64,32,0,611,610,1,0,0,0,612,615,1, + 0,609,613,5,142,0,0,610,612,3,64,32,0,611,610,1,0,0,0,612,615,1, 0,0,0,613,611,1,0,0,0,613,614,1,0,0,0,614,616,1,0,0,0,615,613,1, - 0,0,0,616,617,5,141,0,0,617,636,1,0,0,0,618,619,5,42,0,0,619,622, + 0,0,0,616,617,5,143,0,0,617,636,1,0,0,0,618,619,5,42,0,0,619,622, 3,168,84,0,620,621,5,52,0,0,621,623,3,168,84,0,622,620,1,0,0,0,622, - 623,1,0,0,0,623,633,1,0,0,0,624,628,5,140,0,0,625,627,3,64,32,0, + 623,1,0,0,0,623,633,1,0,0,0,624,628,5,142,0,0,625,627,3,64,32,0, 626,625,1,0,0,0,627,630,1,0,0,0,628,626,1,0,0,0,628,629,1,0,0,0, - 629,631,1,0,0,0,630,628,1,0,0,0,631,634,5,141,0,0,632,634,5,137, + 629,631,1,0,0,0,630,628,1,0,0,0,631,634,5,143,0,0,632,634,5,139, 0,0,633,624,1,0,0,0,633,632,1,0,0,0,634,636,1,0,0,0,635,607,1,0, 0,0,635,618,1,0,0,0,636,61,1,0,0,0,637,638,5,24,0,0,638,639,3,166, - 83,0,639,640,5,87,0,0,640,641,3,168,84,0,641,642,5,26,0,0,642,643, - 3,166,83,0,643,644,3,28,14,0,644,645,5,137,0,0,645,63,1,0,0,0,646, - 647,5,18,0,0,647,704,5,137,0,0,648,649,5,19,0,0,649,650,5,20,0,0, - 650,651,3,166,83,0,651,652,5,137,0,0,652,704,1,0,0,0,653,654,5,29, - 0,0,654,655,3,168,84,0,655,656,5,137,0,0,656,704,1,0,0,0,657,658, - 5,29,0,0,658,659,3,166,83,0,659,660,5,139,0,0,660,670,3,166,83,0, - 661,662,5,67,0,0,662,666,5,140,0,0,663,665,3,66,33,0,664,663,1,0, + 83,0,639,640,5,89,0,0,640,641,3,168,84,0,641,642,5,26,0,0,642,643, + 3,166,83,0,643,644,3,28,14,0,644,645,5,139,0,0,645,63,1,0,0,0,646, + 647,5,18,0,0,647,704,5,139,0,0,648,649,5,19,0,0,649,650,5,20,0,0, + 650,651,3,166,83,0,651,652,5,139,0,0,652,704,1,0,0,0,653,654,5,29, + 0,0,654,655,3,168,84,0,655,656,5,139,0,0,656,704,1,0,0,0,657,658, + 5,29,0,0,658,659,3,166,83,0,659,660,5,141,0,0,660,670,3,166,83,0, + 661,662,5,67,0,0,662,666,5,142,0,0,663,665,3,66,33,0,664,663,1,0, 0,0,665,668,1,0,0,0,666,664,1,0,0,0,666,667,1,0,0,0,667,669,1,0, - 0,0,668,666,1,0,0,0,669,671,5,141,0,0,670,661,1,0,0,0,670,671,1, - 0,0,0,671,672,1,0,0,0,672,673,5,137,0,0,673,704,1,0,0,0,674,676, + 0,0,668,666,1,0,0,0,669,671,5,143,0,0,670,661,1,0,0,0,670,671,1, + 0,0,0,671,672,1,0,0,0,672,673,5,139,0,0,673,704,1,0,0,0,674,676, 5,30,0,0,675,677,5,38,0,0,676,675,1,0,0,0,676,677,1,0,0,0,677,678, 1,0,0,0,678,679,3,166,83,0,679,680,5,58,0,0,680,681,3,26,13,0,681, - 682,5,137,0,0,682,704,1,0,0,0,683,684,5,31,0,0,684,685,3,166,83, - 0,685,686,5,150,0,0,686,687,5,137,0,0,687,704,1,0,0,0,688,689,5, - 32,0,0,689,690,3,26,13,0,690,691,5,139,0,0,691,692,3,166,83,0,692, - 693,3,166,83,0,693,694,3,168,84,0,694,695,5,137,0,0,695,704,1,0, - 0,0,696,697,5,96,0,0,697,704,5,137,0,0,698,699,5,33,0,0,699,700, - 5,150,0,0,700,701,3,168,84,0,701,702,5,137,0,0,702,704,1,0,0,0,703, + 682,5,139,0,0,682,704,1,0,0,0,683,684,5,31,0,0,684,685,3,166,83, + 0,685,686,5,152,0,0,686,687,5,139,0,0,687,704,1,0,0,0,688,689,5, + 32,0,0,689,690,3,26,13,0,690,691,5,141,0,0,691,692,3,166,83,0,692, + 693,3,166,83,0,693,694,3,168,84,0,694,695,5,139,0,0,695,704,1,0, + 0,0,696,697,5,98,0,0,697,704,5,139,0,0,698,699,5,33,0,0,699,700, + 5,152,0,0,700,701,3,168,84,0,701,702,5,139,0,0,702,704,1,0,0,0,703, 646,1,0,0,0,703,648,1,0,0,0,703,653,1,0,0,0,703,657,1,0,0,0,703, 674,1,0,0,0,703,683,1,0,0,0,703,688,1,0,0,0,703,696,1,0,0,0,703, 698,1,0,0,0,704,65,1,0,0,0,705,706,3,166,83,0,706,707,5,61,0,0,707, - 708,3,166,83,0,708,709,5,137,0,0,709,67,1,0,0,0,710,711,5,52,0,0, + 708,3,166,83,0,708,709,5,139,0,0,709,67,1,0,0,0,710,711,5,52,0,0, 711,713,3,166,83,0,712,714,3,22,11,0,713,712,1,0,0,0,713,714,1,0, - 0,0,714,715,1,0,0,0,715,716,5,87,0,0,716,717,3,168,84,0,717,718, - 5,136,0,0,718,719,3,148,74,0,719,720,5,135,0,0,720,721,3,148,74, - 0,721,722,5,89,0,0,722,724,3,84,42,0,723,725,3,76,38,0,724,723,1, + 0,0,714,715,1,0,0,0,715,716,5,89,0,0,716,717,3,168,84,0,717,718, + 5,138,0,0,718,719,3,148,74,0,719,720,5,137,0,0,720,721,3,148,74, + 0,721,722,5,91,0,0,722,724,3,84,42,0,723,725,3,76,38,0,724,723,1, 0,0,0,724,725,1,0,0,0,725,727,1,0,0,0,726,728,3,82,41,0,727,726, - 1,0,0,0,727,728,1,0,0,0,728,729,1,0,0,0,729,730,5,91,0,0,730,732, + 1,0,0,0,727,728,1,0,0,0,728,729,1,0,0,0,729,730,5,93,0,0,730,732, 3,86,43,0,731,733,3,90,45,0,732,731,1,0,0,0,732,733,1,0,0,0,733, 735,1,0,0,0,734,736,3,74,37,0,735,734,1,0,0,0,735,736,1,0,0,0,736, 738,1,0,0,0,737,739,3,72,36,0,738,737,1,0,0,0,738,739,1,0,0,0,739, - 740,1,0,0,0,740,741,5,137,0,0,741,69,1,0,0,0,742,743,5,53,0,0,743, + 740,1,0,0,0,740,741,5,139,0,0,741,69,1,0,0,0,742,743,5,53,0,0,743, 745,3,166,83,0,744,746,3,22,11,0,745,744,1,0,0,0,745,746,1,0,0,0, - 746,747,1,0,0,0,747,748,5,87,0,0,748,749,3,168,84,0,749,750,5,136, - 0,0,750,751,3,148,74,0,751,752,5,135,0,0,752,754,3,148,74,0,753, + 746,747,1,0,0,0,747,748,5,89,0,0,748,749,3,168,84,0,749,750,5,138, + 0,0,750,751,3,148,74,0,751,752,5,137,0,0,752,754,3,148,74,0,753, 755,3,76,38,0,754,753,1,0,0,0,754,755,1,0,0,0,755,757,1,0,0,0,756, 758,3,90,45,0,757,756,1,0,0,0,757,758,1,0,0,0,758,760,1,0,0,0,759, 761,3,74,37,0,760,759,1,0,0,0,760,761,1,0,0,0,761,763,1,0,0,0,762, 764,3,72,36,0,763,762,1,0,0,0,763,764,1,0,0,0,764,765,1,0,0,0,765, - 766,5,137,0,0,766,71,1,0,0,0,767,768,5,69,0,0,768,769,5,68,0,0,769, + 766,5,139,0,0,766,71,1,0,0,0,767,768,5,69,0,0,768,769,5,68,0,0,769, 770,3,166,83,0,770,73,1,0,0,0,771,772,5,9,0,0,772,773,5,7,0,0,773, 774,3,166,83,0,774,775,5,68,0,0,775,776,3,168,84,0,776,75,1,0,0, 0,777,778,5,12,0,0,778,787,5,15,0,0,779,780,5,12,0,0,780,781,7,2, - 0,0,781,782,5,16,0,0,782,783,5,142,0,0,783,784,3,88,44,0,784,785, - 5,143,0,0,785,787,1,0,0,0,786,777,1,0,0,0,786,779,1,0,0,0,787,77, - 1,0,0,0,788,789,5,68,0,0,789,790,5,142,0,0,790,795,3,130,65,0,791, - 792,5,138,0,0,792,794,3,130,65,0,793,791,1,0,0,0,794,797,1,0,0,0, + 0,0,781,782,5,16,0,0,782,783,5,144,0,0,783,784,3,88,44,0,784,785, + 5,145,0,0,785,787,1,0,0,0,786,777,1,0,0,0,786,779,1,0,0,0,787,77, + 1,0,0,0,788,789,5,68,0,0,789,790,5,144,0,0,790,795,3,130,65,0,791, + 792,5,140,0,0,792,794,3,130,65,0,793,791,1,0,0,0,794,797,1,0,0,0, 795,793,1,0,0,0,795,796,1,0,0,0,796,798,1,0,0,0,797,795,1,0,0,0, - 798,799,5,143,0,0,799,79,1,0,0,0,800,801,5,54,0,0,801,802,3,166, - 83,0,802,803,5,87,0,0,803,804,3,168,84,0,804,805,5,55,0,0,805,806, - 3,166,83,0,806,807,5,136,0,0,807,809,3,148,74,0,808,810,3,90,45, - 0,809,808,1,0,0,0,809,810,1,0,0,0,810,811,1,0,0,0,811,812,5,137, - 0,0,812,81,1,0,0,0,813,814,5,90,0,0,814,815,3,148,74,0,815,83,1, - 0,0,0,816,817,7,3,0,0,817,85,1,0,0,0,818,837,5,93,0,0,819,820,5, + 798,799,5,145,0,0,799,79,1,0,0,0,800,801,5,54,0,0,801,802,3,166, + 83,0,802,803,5,89,0,0,803,804,3,168,84,0,804,805,5,55,0,0,805,806, + 3,166,83,0,806,807,5,138,0,0,807,809,3,148,74,0,808,810,3,90,45, + 0,809,808,1,0,0,0,809,810,1,0,0,0,810,811,1,0,0,0,811,812,5,139, + 0,0,812,81,1,0,0,0,813,814,5,92,0,0,814,815,3,148,74,0,815,83,1, + 0,0,0,816,817,7,3,0,0,817,85,1,0,0,0,818,837,5,95,0,0,819,820,5, 45,0,0,820,837,3,166,83,0,821,822,5,38,0,0,822,837,3,166,83,0,823, - 824,5,47,0,0,824,833,5,142,0,0,825,830,3,26,13,0,826,827,5,138,0, + 824,5,47,0,0,824,833,5,144,0,0,825,830,3,26,13,0,826,827,5,140,0, 0,827,829,3,26,13,0,828,826,1,0,0,0,829,832,1,0,0,0,830,828,1,0, 0,0,830,831,1,0,0,0,831,834,1,0,0,0,832,830,1,0,0,0,833,825,1,0, - 0,0,833,834,1,0,0,0,834,835,1,0,0,0,835,837,5,143,0,0,836,818,1, + 0,0,833,834,1,0,0,0,834,835,1,0,0,0,835,837,5,145,0,0,836,818,1, 0,0,0,836,819,1,0,0,0,836,821,1,0,0,0,836,823,1,0,0,0,837,87,1,0, - 0,0,838,843,3,166,83,0,839,840,5,138,0,0,840,842,3,166,83,0,841, + 0,0,838,843,3,166,83,0,839,840,5,140,0,0,840,842,3,166,83,0,841, 839,1,0,0,0,842,845,1,0,0,0,843,841,1,0,0,0,843,844,1,0,0,0,844, - 89,1,0,0,0,845,843,1,0,0,0,846,847,5,92,0,0,847,851,5,140,0,0,848, + 89,1,0,0,0,845,843,1,0,0,0,846,847,5,94,0,0,847,851,5,142,0,0,848, 850,3,92,46,0,849,848,1,0,0,0,850,853,1,0,0,0,851,849,1,0,0,0,851, - 852,1,0,0,0,852,854,1,0,0,0,853,851,1,0,0,0,854,855,5,141,0,0,855, - 91,1,0,0,0,856,857,5,25,0,0,857,858,3,166,83,0,858,859,5,87,0,0, - 859,860,3,168,84,0,860,861,5,142,0,0,861,862,3,88,44,0,862,863,5, - 143,0,0,863,864,5,137,0,0,864,939,1,0,0,0,865,866,5,64,0,0,866,867, - 3,166,83,0,867,868,5,87,0,0,868,869,3,168,84,0,869,870,5,136,0,0, - 870,871,3,148,74,0,871,872,3,94,47,0,872,873,5,137,0,0,873,939,1, - 0,0,0,874,875,5,65,0,0,875,876,3,166,83,0,876,877,5,87,0,0,877,878, - 3,168,84,0,878,879,5,136,0,0,879,880,3,156,78,0,880,883,3,50,25, - 0,881,882,5,85,0,0,882,884,3,168,84,0,883,881,1,0,0,0,883,884,1, - 0,0,0,884,885,1,0,0,0,885,886,3,94,47,0,886,887,5,137,0,0,887,939, - 1,0,0,0,888,889,5,46,0,0,889,890,3,166,83,0,890,891,5,87,0,0,891, - 892,3,168,84,0,892,893,5,136,0,0,893,895,3,166,83,0,894,896,3,28, + 852,1,0,0,0,852,854,1,0,0,0,853,851,1,0,0,0,854,855,5,143,0,0,855, + 91,1,0,0,0,856,857,5,25,0,0,857,858,3,166,83,0,858,859,5,89,0,0, + 859,860,3,168,84,0,860,861,5,144,0,0,861,862,3,88,44,0,862,863,5, + 145,0,0,863,864,5,139,0,0,864,939,1,0,0,0,865,866,5,64,0,0,866,867, + 3,166,83,0,867,868,5,89,0,0,868,869,3,168,84,0,869,870,5,138,0,0, + 870,871,3,148,74,0,871,872,3,94,47,0,872,873,5,139,0,0,873,939,1, + 0,0,0,874,875,5,65,0,0,875,876,3,166,83,0,876,877,5,89,0,0,877,878, + 3,168,84,0,878,879,5,138,0,0,879,880,3,156,78,0,880,883,3,50,25, + 0,881,882,5,87,0,0,882,884,3,168,84,0,883,881,1,0,0,0,883,884,1, + 0,0,0,884,885,1,0,0,0,885,886,3,94,47,0,886,887,5,139,0,0,887,939, + 1,0,0,0,888,889,5,46,0,0,889,890,3,166,83,0,890,891,5,89,0,0,891, + 892,3,168,84,0,892,893,5,138,0,0,893,895,3,166,83,0,894,896,3,28, 14,0,895,894,1,0,0,0,895,896,1,0,0,0,896,898,1,0,0,0,897,899,3,78, 39,0,898,897,1,0,0,0,898,899,1,0,0,0,899,902,1,0,0,0,900,901,5,20, 0,0,901,903,5,56,0,0,902,900,1,0,0,0,902,903,1,0,0,0,903,904,1,0, - 0,0,904,905,5,137,0,0,905,939,1,0,0,0,906,907,5,7,0,0,907,908,3, - 166,83,0,908,909,5,87,0,0,909,910,3,168,84,0,910,911,5,136,0,0,911, - 912,3,166,83,0,912,913,5,56,0,0,913,914,3,148,74,0,914,915,5,137, + 0,0,904,905,5,139,0,0,905,939,1,0,0,0,906,907,5,7,0,0,907,908,3, + 166,83,0,908,909,5,89,0,0,909,910,3,168,84,0,910,911,5,138,0,0,911, + 912,3,166,83,0,912,913,5,56,0,0,913,914,3,148,74,0,914,915,5,139, 0,0,915,939,1,0,0,0,916,917,5,54,0,0,917,918,3,166,83,0,918,919, - 5,87,0,0,919,920,3,168,84,0,920,921,5,136,0,0,921,924,3,166,83,0, + 5,89,0,0,919,920,3,168,84,0,920,921,5,138,0,0,921,924,3,166,83,0, 922,923,5,56,0,0,923,925,3,148,74,0,924,922,1,0,0,0,924,925,1,0, - 0,0,925,926,1,0,0,0,926,927,5,137,0,0,927,939,1,0,0,0,928,929,5, - 24,0,0,929,930,3,166,83,0,930,931,5,87,0,0,931,932,3,168,84,0,932, - 933,5,136,0,0,933,934,3,166,83,0,934,935,5,139,0,0,935,936,3,166, - 83,0,936,937,5,137,0,0,937,939,1,0,0,0,938,856,1,0,0,0,938,865,1, + 0,0,925,926,1,0,0,0,926,927,5,139,0,0,927,939,1,0,0,0,928,929,5, + 24,0,0,929,930,3,166,83,0,930,931,5,89,0,0,931,932,3,168,84,0,932, + 933,5,138,0,0,933,934,3,166,83,0,934,935,5,141,0,0,935,936,3,166, + 83,0,936,937,5,139,0,0,937,939,1,0,0,0,938,856,1,0,0,0,938,865,1, 0,0,0,938,874,1,0,0,0,938,888,1,0,0,0,938,906,1,0,0,0,938,916,1, - 0,0,0,938,928,1,0,0,0,939,93,1,0,0,0,940,941,5,142,0,0,941,946,3, - 96,48,0,942,943,5,138,0,0,943,945,3,96,48,0,944,942,1,0,0,0,945, + 0,0,0,938,928,1,0,0,0,939,93,1,0,0,0,940,941,5,144,0,0,941,946,3, + 96,48,0,942,943,5,140,0,0,943,945,3,96,48,0,944,942,1,0,0,0,945, 948,1,0,0,0,946,944,1,0,0,0,946,947,1,0,0,0,947,949,1,0,0,0,948, - 946,1,0,0,0,949,950,5,143,0,0,950,95,1,0,0,0,951,952,7,4,0,0,952, + 946,1,0,0,0,949,950,5,145,0,0,950,95,1,0,0,0,951,952,7,4,0,0,952, 97,1,0,0,0,953,954,5,63,0,0,954,955,3,100,50,0,955,99,1,0,0,0,956, 959,3,102,51,0,957,959,3,106,53,0,958,956,1,0,0,0,958,957,1,0,0, 0,959,101,1,0,0,0,960,961,5,64,0,0,961,962,3,166,83,0,962,963,5, - 87,0,0,963,964,3,168,84,0,964,965,5,74,0,0,965,966,3,166,83,0,966, - 967,5,136,0,0,967,968,3,148,74,0,968,969,5,75,0,0,969,972,3,104, + 89,0,0,963,964,3,168,84,0,964,965,5,74,0,0,965,966,3,166,83,0,966, + 967,5,138,0,0,967,968,3,148,74,0,968,969,5,75,0,0,969,972,3,104, 52,0,970,971,5,76,0,0,971,973,3,158,79,0,972,970,1,0,0,0,972,973, - 1,0,0,0,973,974,1,0,0,0,974,975,5,137,0,0,975,103,1,0,0,0,976,983, - 5,109,0,0,977,978,5,110,0,0,978,979,5,144,0,0,979,980,3,148,74,0, - 980,981,5,145,0,0,981,983,1,0,0,0,982,976,1,0,0,0,982,977,1,0,0, - 0,983,105,1,0,0,0,984,985,5,65,0,0,985,986,3,166,83,0,986,987,5, - 87,0,0,987,988,3,168,84,0,988,989,5,140,0,0,989,990,3,108,54,0,990, - 991,3,108,54,0,991,992,5,141,0,0,992,107,1,0,0,0,993,994,3,50,25, - 0,994,995,5,66,0,0,995,996,3,166,83,0,996,997,5,87,0,0,997,998,3, - 168,84,0,998,1000,3,156,78,0,999,1001,5,115,0,0,1000,999,1,0,0,0, - 1000,1001,1,0,0,0,1001,1004,1,0,0,0,1002,1003,5,82,0,0,1003,1005, - 3,168,84,0,1004,1002,1,0,0,0,1004,1005,1,0,0,0,1005,1007,1,0,0,0, - 1006,1008,5,84,0,0,1007,1006,1,0,0,0,1007,1008,1,0,0,0,1008,1011, - 1,0,0,0,1009,1010,5,85,0,0,1010,1012,3,168,84,0,1011,1009,1,0,0, - 0,1011,1012,1,0,0,0,1012,1014,1,0,0,0,1013,1015,5,86,0,0,1014,1013, - 1,0,0,0,1014,1015,1,0,0,0,1015,1016,1,0,0,0,1016,1017,5,137,0,0, - 1017,109,1,0,0,0,1018,1020,5,57,0,0,1019,1021,3,22,11,0,1020,1019, - 1,0,0,0,1020,1021,1,0,0,0,1021,1022,1,0,0,0,1022,1024,3,166,83,0, - 1023,1025,3,112,56,0,1024,1023,1,0,0,0,1024,1025,1,0,0,0,1025,1026, - 1,0,0,0,1026,1027,5,58,0,0,1027,1029,3,166,83,0,1028,1030,3,28,14, - 0,1029,1028,1,0,0,0,1029,1030,1,0,0,0,1030,1033,1,0,0,0,1031,1032, - 5,87,0,0,1032,1034,3,168,84,0,1033,1031,1,0,0,0,1033,1034,1,0,0, - 0,1034,1037,1,0,0,0,1035,1036,5,81,0,0,1036,1038,5,150,0,0,1037, - 1035,1,0,0,0,1037,1038,1,0,0,0,1038,1039,1,0,0,0,1039,1043,5,140, - 0,0,1040,1042,3,114,57,0,1041,1040,1,0,0,0,1042,1045,1,0,0,0,1043, - 1041,1,0,0,0,1043,1044,1,0,0,0,1044,1046,1,0,0,0,1045,1043,1,0,0, - 0,1046,1047,5,141,0,0,1047,111,1,0,0,0,1048,1049,3,28,14,0,1049, - 113,1,0,0,0,1050,1051,5,62,0,0,1051,1058,3,100,50,0,1052,1058,3, - 128,64,0,1053,1058,3,124,62,0,1054,1058,3,118,59,0,1055,1058,3,126, - 63,0,1056,1058,3,116,58,0,1057,1050,1,0,0,0,1057,1052,1,0,0,0,1057, - 1053,1,0,0,0,1057,1054,1,0,0,0,1057,1055,1,0,0,0,1057,1056,1,0,0, - 0,1058,115,1,0,0,0,1059,1060,5,59,0,0,1060,1061,3,166,83,0,1061, - 1062,5,61,0,0,1062,1063,3,166,83,0,1063,1064,5,139,0,0,1064,1065, - 3,166,83,0,1065,1066,5,137,0,0,1066,117,1,0,0,0,1067,1068,5,10,0, - 0,1068,1072,5,140,0,0,1069,1071,3,120,60,0,1070,1069,1,0,0,0,1071, - 1074,1,0,0,0,1072,1070,1,0,0,0,1072,1073,1,0,0,0,1073,1075,1,0,0, - 0,1074,1072,1,0,0,0,1075,1076,5,141,0,0,1076,1077,5,137,0,0,1077, - 119,1,0,0,0,1078,1079,3,166,83,0,1079,1080,5,61,0,0,1080,1081,5, - 64,0,0,1081,1082,3,166,83,0,1082,1083,5,137,0,0,1083,1093,1,0,0, - 0,1084,1085,3,166,83,0,1085,1086,5,61,0,0,1086,1087,5,65,0,0,1087, - 1088,3,166,83,0,1088,1089,5,139,0,0,1089,1090,3,166,83,0,1090,1091, - 5,137,0,0,1091,1093,1,0,0,0,1092,1078,1,0,0,0,1092,1084,1,0,0,0, - 1093,121,1,0,0,0,1094,1095,3,26,13,0,1095,1096,5,20,0,0,1096,1101, - 5,56,0,0,1097,1098,5,139,0,0,1098,1100,3,166,83,0,1099,1097,1,0, - 0,0,1100,1103,1,0,0,0,1101,1099,1,0,0,0,1101,1102,1,0,0,0,1102,1104, - 1,0,0,0,1103,1101,1,0,0,0,1104,1105,5,137,0,0,1105,123,1,0,0,0,1106, - 1107,5,59,0,0,1107,1108,3,166,83,0,1108,1109,5,61,0,0,1109,1110, - 5,64,0,0,1110,1111,3,166,83,0,1111,1112,5,137,0,0,1112,125,1,0,0, - 0,1113,1114,5,71,0,0,1114,1115,3,166,83,0,1115,1116,5,72,0,0,1116, - 1117,5,73,0,0,1117,1118,5,68,0,0,1118,1119,5,54,0,0,1119,1120,3, - 166,83,0,1120,1121,5,70,0,0,1121,1122,5,65,0,0,1122,1123,3,166,83, - 0,1123,1124,5,139,0,0,1124,1125,3,166,83,0,1125,1126,5,137,0,0,1126, - 127,1,0,0,0,1127,1128,5,59,0,0,1128,1129,3,130,65,0,1129,1130,5, - 61,0,0,1130,1133,3,134,67,0,1131,1132,5,36,0,0,1132,1134,3,168,84, - 0,1133,1131,1,0,0,0,1133,1134,1,0,0,0,1134,1135,1,0,0,0,1135,1136, - 5,137,0,0,1136,129,1,0,0,0,1137,1138,3,166,83,0,1138,1139,5,139, - 0,0,1139,1140,3,132,66,0,1140,131,1,0,0,0,1141,1154,3,166,83,0,1142, - 1154,5,104,0,0,1143,1154,5,94,0,0,1144,1154,5,95,0,0,1145,1154,5, - 1,0,0,1146,1154,5,101,0,0,1147,1154,5,102,0,0,1148,1154,5,103,0, - 0,1149,1154,5,105,0,0,1150,1154,5,106,0,0,1151,1154,5,107,0,0,1152, - 1154,5,108,0,0,1153,1141,1,0,0,0,1153,1142,1,0,0,0,1153,1143,1,0, - 0,0,1153,1144,1,0,0,0,1153,1145,1,0,0,0,1153,1146,1,0,0,0,1153,1147, - 1,0,0,0,1153,1148,1,0,0,0,1153,1149,1,0,0,0,1153,1150,1,0,0,0,1153, - 1151,1,0,0,0,1153,1152,1,0,0,0,1154,133,1,0,0,0,1155,1156,5,83,0, - 0,1156,1157,5,139,0,0,1157,1192,3,166,83,0,1158,1159,5,64,0,0,1159, - 1160,3,166,83,0,1160,1161,5,139,0,0,1161,1162,3,138,69,0,1162,1192, - 1,0,0,0,1163,1164,5,65,0,0,1164,1165,3,166,83,0,1165,1166,5,139, - 0,0,1166,1167,3,166,83,0,1167,1168,5,139,0,0,1168,1169,3,140,70, - 0,1169,1192,1,0,0,0,1170,1171,5,46,0,0,1171,1173,3,166,83,0,1172, - 1174,3,28,14,0,1173,1172,1,0,0,0,1173,1174,1,0,0,0,1174,1175,1,0, - 0,0,1175,1176,5,139,0,0,1176,1177,3,130,65,0,1177,1192,1,0,0,0,1178, - 1179,5,48,0,0,1179,1180,3,166,83,0,1180,1181,5,139,0,0,1181,1183, - 3,166,83,0,1182,1184,3,28,14,0,1183,1182,1,0,0,0,1183,1184,1,0,0, - 0,1184,1186,1,0,0,0,1185,1187,3,142,71,0,1186,1185,1,0,0,0,1186, - 1187,1,0,0,0,1187,1189,1,0,0,0,1188,1190,3,136,68,0,1189,1188,1, - 0,0,0,1189,1190,1,0,0,0,1190,1192,1,0,0,0,1191,1155,1,0,0,0,1191, - 1158,1,0,0,0,1191,1163,1,0,0,0,1191,1170,1,0,0,0,1191,1178,1,0,0, - 0,1192,135,1,0,0,0,1193,1194,5,69,0,0,1194,1195,3,142,71,0,1195, - 137,1,0,0,0,1196,1197,7,5,0,0,1197,139,1,0,0,0,1198,1199,7,6,0,0, - 1199,141,1,0,0,0,1200,1201,5,67,0,0,1201,1205,5,140,0,0,1202,1204, - 3,144,72,0,1203,1202,1,0,0,0,1204,1207,1,0,0,0,1205,1203,1,0,0,0, - 1205,1206,1,0,0,0,1206,1208,1,0,0,0,1207,1205,1,0,0,0,1208,1209, - 5,141,0,0,1209,143,1,0,0,0,1210,1211,3,166,83,0,1211,1212,5,61,0, - 0,1212,1213,5,11,0,0,1213,1214,5,25,0,0,1214,1215,5,142,0,0,1215, - 1216,3,88,44,0,1216,1217,5,143,0,0,1217,1218,5,137,0,0,1218,1309, - 1,0,0,0,1219,1220,3,166,83,0,1220,1221,5,61,0,0,1221,1222,5,64,0, - 0,1222,1229,3,166,83,0,1223,1224,5,70,0,0,1224,1225,5,65,0,0,1225, - 1226,3,166,83,0,1226,1227,5,139,0,0,1227,1228,3,166,83,0,1228,1230, - 1,0,0,0,1229,1223,1,0,0,0,1229,1230,1,0,0,0,1230,1231,1,0,0,0,1231, - 1232,5,137,0,0,1232,1309,1,0,0,0,1233,1234,3,166,83,0,1234,1235, - 5,61,0,0,1235,1236,5,65,0,0,1236,1237,3,166,83,0,1237,1238,5,139, - 0,0,1238,1245,3,166,83,0,1239,1240,5,70,0,0,1240,1241,5,65,0,0,1241, - 1242,3,166,83,0,1242,1243,5,139,0,0,1243,1244,3,166,83,0,1244,1246, - 1,0,0,0,1245,1239,1,0,0,0,1245,1246,1,0,0,0,1246,1247,1,0,0,0,1247, - 1248,5,137,0,0,1248,1309,1,0,0,0,1249,1250,3,166,83,0,1250,1251, - 5,61,0,0,1251,1252,5,46,0,0,1252,1254,3,166,83,0,1253,1255,3,28, - 14,0,1254,1253,1,0,0,0,1254,1255,1,0,0,0,1255,1264,1,0,0,0,1256, - 1257,5,70,0,0,1257,1258,5,65,0,0,1258,1259,3,166,83,0,1259,1260, - 5,139,0,0,1260,1261,3,166,83,0,1261,1265,1,0,0,0,1262,1263,5,20, - 0,0,1263,1265,5,56,0,0,1264,1256,1,0,0,0,1264,1262,1,0,0,0,1264, - 1265,1,0,0,0,1265,1266,1,0,0,0,1266,1267,5,137,0,0,1267,1309,1,0, - 0,0,1268,1269,3,166,83,0,1269,1270,5,61,0,0,1270,1271,5,7,0,0,1271, - 1272,3,166,83,0,1272,1273,5,67,0,0,1273,1277,5,140,0,0,1274,1276, - 3,122,61,0,1275,1274,1,0,0,0,1276,1279,1,0,0,0,1277,1275,1,0,0,0, - 1277,1278,1,0,0,0,1278,1280,1,0,0,0,1279,1277,1,0,0,0,1280,1281, - 5,141,0,0,1281,1282,5,137,0,0,1282,1309,1,0,0,0,1283,1284,3,166, - 83,0,1284,1285,5,61,0,0,1285,1286,5,54,0,0,1286,1287,3,166,83,0, - 1287,1288,5,137,0,0,1288,1309,1,0,0,0,1289,1290,3,166,83,0,1290, - 1292,5,61,0,0,1291,1293,5,11,0,0,1292,1291,1,0,0,0,1292,1293,1,0, - 0,0,1293,1294,1,0,0,0,1294,1295,5,24,0,0,1295,1296,3,166,83,0,1296, - 1297,5,139,0,0,1297,1304,3,166,83,0,1298,1299,5,70,0,0,1299,1300, - 5,65,0,0,1300,1301,3,166,83,0,1301,1302,5,139,0,0,1302,1303,3,166, - 83,0,1303,1305,1,0,0,0,1304,1298,1,0,0,0,1304,1305,1,0,0,0,1305, - 1306,1,0,0,0,1306,1307,5,137,0,0,1307,1309,1,0,0,0,1308,1210,1,0, - 0,0,1308,1219,1,0,0,0,1308,1233,1,0,0,0,1308,1249,1,0,0,0,1308,1268, - 1,0,0,0,1308,1283,1,0,0,0,1308,1289,1,0,0,0,1309,145,1,0,0,0,1310, - 1311,5,54,0,0,1311,1312,3,166,83,0,1312,1313,5,61,0,0,1313,1314, - 3,166,83,0,1314,1315,5,139,0,0,1315,1317,3,166,83,0,1316,1318,3, - 142,71,0,1317,1316,1,0,0,0,1317,1318,1,0,0,0,1318,1319,1,0,0,0,1319, - 1320,5,137,0,0,1320,147,1,0,0,0,1321,1379,3,154,77,0,1322,1379,5, - 116,0,0,1323,1379,5,117,0,0,1324,1325,5,118,0,0,1325,1379,3,168, - 84,0,1326,1327,5,119,0,0,1327,1328,5,146,0,0,1328,1329,3,166,83, - 0,1329,1330,5,147,0,0,1330,1379,1,0,0,0,1331,1332,5,120,0,0,1332, - 1333,5,146,0,0,1333,1335,3,166,83,0,1334,1336,3,28,14,0,1335,1334, - 1,0,0,0,1335,1336,1,0,0,0,1336,1337,1,0,0,0,1337,1338,5,147,0,0, - 1338,1379,1,0,0,0,1339,1340,5,41,0,0,1340,1341,5,146,0,0,1341,1342, - 3,166,83,0,1342,1343,5,147,0,0,1343,1379,1,0,0,0,1344,1345,5,121, - 0,0,1345,1346,5,146,0,0,1346,1347,3,148,74,0,1347,1348,5,147,0,0, - 1348,1379,1,0,0,0,1349,1350,5,122,0,0,1350,1351,5,146,0,0,1351,1352, - 3,148,74,0,1352,1353,5,147,0,0,1353,1379,1,0,0,0,1354,1355,5,123, - 0,0,1355,1359,5,140,0,0,1356,1358,3,150,75,0,1357,1356,1,0,0,0,1358, - 1361,1,0,0,0,1359,1357,1,0,0,0,1359,1360,1,0,0,0,1360,1362,1,0,0, - 0,1361,1359,1,0,0,0,1362,1379,5,141,0,0,1363,1364,5,8,0,0,1364,1365, - 5,87,0,0,1365,1366,3,168,84,0,1366,1368,5,140,0,0,1367,1369,3,152, - 76,0,1368,1367,1,0,0,0,1369,1370,1,0,0,0,1370,1368,1,0,0,0,1370, - 1371,1,0,0,0,1371,1372,1,0,0,0,1372,1373,5,141,0,0,1373,1379,1,0, - 0,0,1374,1376,3,166,83,0,1375,1377,3,28,14,0,1376,1375,1,0,0,0,1376, - 1377,1,0,0,0,1377,1379,1,0,0,0,1378,1321,1,0,0,0,1378,1322,1,0,0, - 0,1378,1323,1,0,0,0,1378,1324,1,0,0,0,1378,1326,1,0,0,0,1378,1331, - 1,0,0,0,1378,1339,1,0,0,0,1378,1344,1,0,0,0,1378,1349,1,0,0,0,1378, - 1354,1,0,0,0,1378,1363,1,0,0,0,1378,1374,1,0,0,0,1379,149,1,0,0, - 0,1380,1381,3,166,83,0,1381,1382,5,136,0,0,1382,1383,3,148,74,0, - 1383,1384,5,137,0,0,1384,151,1,0,0,0,1385,1386,3,166,83,0,1386,1387, - 5,87,0,0,1387,1388,3,168,84,0,1388,1389,5,136,0,0,1389,1390,3,148, - 74,0,1390,1391,5,137,0,0,1391,153,1,0,0,0,1392,1393,7,7,0,0,1393, - 155,1,0,0,0,1394,1395,7,8,0,0,1395,157,1,0,0,0,1396,1405,3,168,84, - 0,1397,1405,5,150,0,0,1398,1405,5,151,0,0,1399,1405,5,132,0,0,1400, - 1405,5,133,0,0,1401,1405,5,134,0,0,1402,1405,3,160,80,0,1403,1405, - 3,164,82,0,1404,1396,1,0,0,0,1404,1397,1,0,0,0,1404,1398,1,0,0,0, - 1404,1399,1,0,0,0,1404,1400,1,0,0,0,1404,1401,1,0,0,0,1404,1402, - 1,0,0,0,1404,1403,1,0,0,0,1405,159,1,0,0,0,1406,1415,5,140,0,0,1407, - 1412,3,162,81,0,1408,1409,5,138,0,0,1409,1411,3,162,81,0,1410,1408, - 1,0,0,0,1411,1414,1,0,0,0,1412,1410,1,0,0,0,1412,1413,1,0,0,0,1413, - 1416,1,0,0,0,1414,1412,1,0,0,0,1415,1407,1,0,0,0,1415,1416,1,0,0, - 0,1416,1417,1,0,0,0,1417,1418,5,141,0,0,1418,161,1,0,0,0,1419,1420, - 3,168,84,0,1420,1421,5,136,0,0,1421,1422,3,158,79,0,1422,163,1,0, - 0,0,1423,1432,5,142,0,0,1424,1429,3,158,79,0,1425,1426,5,138,0,0, - 1426,1428,3,158,79,0,1427,1425,1,0,0,0,1428,1431,1,0,0,0,1429,1427, - 1,0,0,0,1429,1430,1,0,0,0,1430,1433,1,0,0,0,1431,1429,1,0,0,0,1432, - 1424,1,0,0,0,1432,1433,1,0,0,0,1433,1434,1,0,0,0,1434,1435,5,143, - 0,0,1435,165,1,0,0,0,1436,1437,7,9,0,0,1437,167,1,0,0,0,1438,1439, - 5,153,0,0,1439,169,1,0,0,0,129,182,189,210,223,235,255,263,270,276, + 1,0,0,0,973,974,1,0,0,0,974,975,5,139,0,0,975,103,1,0,0,0,976,990, + 5,111,0,0,977,978,5,112,0,0,978,979,5,146,0,0,979,980,3,148,74,0, + 980,981,5,147,0,0,981,990,1,0,0,0,982,983,5,84,0,0,983,990,3,160, + 80,0,984,985,5,85,0,0,985,986,5,146,0,0,986,987,3,148,74,0,987,988, + 5,147,0,0,988,990,1,0,0,0,989,976,1,0,0,0,989,977,1,0,0,0,989,982, + 1,0,0,0,989,984,1,0,0,0,990,105,1,0,0,0,991,992,5,65,0,0,992,993, + 3,166,83,0,993,994,5,89,0,0,994,995,3,168,84,0,995,996,5,142,0,0, + 996,997,3,108,54,0,997,998,3,108,54,0,998,999,5,143,0,0,999,107, + 1,0,0,0,1000,1001,3,50,25,0,1001,1002,5,66,0,0,1002,1003,3,166,83, + 0,1003,1004,5,89,0,0,1004,1005,3,168,84,0,1005,1007,3,156,78,0,1006, + 1008,5,117,0,0,1007,1006,1,0,0,0,1007,1008,1,0,0,0,1008,1011,1,0, + 0,0,1009,1010,5,82,0,0,1010,1012,3,168,84,0,1011,1009,1,0,0,0,1011, + 1012,1,0,0,0,1012,1014,1,0,0,0,1013,1015,5,86,0,0,1014,1013,1,0, + 0,0,1014,1015,1,0,0,0,1015,1018,1,0,0,0,1016,1017,5,87,0,0,1017, + 1019,3,168,84,0,1018,1016,1,0,0,0,1018,1019,1,0,0,0,1019,1021,1, + 0,0,0,1020,1022,5,88,0,0,1021,1020,1,0,0,0,1021,1022,1,0,0,0,1022, + 1023,1,0,0,0,1023,1024,5,139,0,0,1024,109,1,0,0,0,1025,1027,5,57, + 0,0,1026,1028,3,22,11,0,1027,1026,1,0,0,0,1027,1028,1,0,0,0,1028, + 1029,1,0,0,0,1029,1031,3,166,83,0,1030,1032,3,112,56,0,1031,1030, + 1,0,0,0,1031,1032,1,0,0,0,1032,1033,1,0,0,0,1033,1034,5,58,0,0,1034, + 1036,3,166,83,0,1035,1037,3,28,14,0,1036,1035,1,0,0,0,1036,1037, + 1,0,0,0,1037,1040,1,0,0,0,1038,1039,5,89,0,0,1039,1041,3,168,84, + 0,1040,1038,1,0,0,0,1040,1041,1,0,0,0,1041,1044,1,0,0,0,1042,1043, + 5,81,0,0,1043,1045,5,152,0,0,1044,1042,1,0,0,0,1044,1045,1,0,0,0, + 1045,1046,1,0,0,0,1046,1050,5,142,0,0,1047,1049,3,114,57,0,1048, + 1047,1,0,0,0,1049,1052,1,0,0,0,1050,1048,1,0,0,0,1050,1051,1,0,0, + 0,1051,1053,1,0,0,0,1052,1050,1,0,0,0,1053,1054,5,143,0,0,1054,111, + 1,0,0,0,1055,1056,3,28,14,0,1056,113,1,0,0,0,1057,1058,5,62,0,0, + 1058,1065,3,100,50,0,1059,1065,3,128,64,0,1060,1065,3,124,62,0,1061, + 1065,3,118,59,0,1062,1065,3,126,63,0,1063,1065,3,116,58,0,1064,1057, + 1,0,0,0,1064,1059,1,0,0,0,1064,1060,1,0,0,0,1064,1061,1,0,0,0,1064, + 1062,1,0,0,0,1064,1063,1,0,0,0,1065,115,1,0,0,0,1066,1067,5,59,0, + 0,1067,1068,3,166,83,0,1068,1069,5,61,0,0,1069,1070,3,166,83,0,1070, + 1071,5,141,0,0,1071,1072,3,166,83,0,1072,1073,5,139,0,0,1073,117, + 1,0,0,0,1074,1075,5,10,0,0,1075,1079,5,142,0,0,1076,1078,3,120,60, + 0,1077,1076,1,0,0,0,1078,1081,1,0,0,0,1079,1077,1,0,0,0,1079,1080, + 1,0,0,0,1080,1082,1,0,0,0,1081,1079,1,0,0,0,1082,1083,5,143,0,0, + 1083,1084,5,139,0,0,1084,119,1,0,0,0,1085,1086,3,166,83,0,1086,1087, + 5,61,0,0,1087,1088,5,64,0,0,1088,1089,3,166,83,0,1089,1090,5,139, + 0,0,1090,1100,1,0,0,0,1091,1092,3,166,83,0,1092,1093,5,61,0,0,1093, + 1094,5,65,0,0,1094,1095,3,166,83,0,1095,1096,5,141,0,0,1096,1097, + 3,166,83,0,1097,1098,5,139,0,0,1098,1100,1,0,0,0,1099,1085,1,0,0, + 0,1099,1091,1,0,0,0,1100,121,1,0,0,0,1101,1102,3,26,13,0,1102,1103, + 5,20,0,0,1103,1108,5,56,0,0,1104,1105,5,141,0,0,1105,1107,3,166, + 83,0,1106,1104,1,0,0,0,1107,1110,1,0,0,0,1108,1106,1,0,0,0,1108, + 1109,1,0,0,0,1109,1111,1,0,0,0,1110,1108,1,0,0,0,1111,1112,5,139, + 0,0,1112,123,1,0,0,0,1113,1114,5,59,0,0,1114,1115,3,166,83,0,1115, + 1116,5,61,0,0,1116,1117,5,64,0,0,1117,1118,3,166,83,0,1118,1119, + 5,139,0,0,1119,125,1,0,0,0,1120,1121,5,71,0,0,1121,1122,3,166,83, + 0,1122,1123,5,72,0,0,1123,1124,5,73,0,0,1124,1125,5,68,0,0,1125, + 1126,5,54,0,0,1126,1127,3,166,83,0,1127,1128,5,70,0,0,1128,1129, + 5,65,0,0,1129,1130,3,166,83,0,1130,1131,5,141,0,0,1131,1132,3,166, + 83,0,1132,1133,5,139,0,0,1133,127,1,0,0,0,1134,1135,5,59,0,0,1135, + 1136,3,130,65,0,1136,1137,5,61,0,0,1137,1140,3,134,67,0,1138,1139, + 5,36,0,0,1139,1141,3,168,84,0,1140,1138,1,0,0,0,1140,1141,1,0,0, + 0,1141,1142,1,0,0,0,1142,1143,5,139,0,0,1143,129,1,0,0,0,1144,1145, + 3,166,83,0,1145,1146,5,141,0,0,1146,1147,3,132,66,0,1147,131,1,0, + 0,0,1148,1161,3,166,83,0,1149,1161,5,106,0,0,1150,1161,5,96,0,0, + 1151,1161,5,97,0,0,1152,1161,5,1,0,0,1153,1161,5,103,0,0,1154,1161, + 5,104,0,0,1155,1161,5,105,0,0,1156,1161,5,107,0,0,1157,1161,5,108, + 0,0,1158,1161,5,109,0,0,1159,1161,5,110,0,0,1160,1148,1,0,0,0,1160, + 1149,1,0,0,0,1160,1150,1,0,0,0,1160,1151,1,0,0,0,1160,1152,1,0,0, + 0,1160,1153,1,0,0,0,1160,1154,1,0,0,0,1160,1155,1,0,0,0,1160,1156, + 1,0,0,0,1160,1157,1,0,0,0,1160,1158,1,0,0,0,1160,1159,1,0,0,0,1161, + 133,1,0,0,0,1162,1163,5,83,0,0,1163,1164,5,141,0,0,1164,1209,3,166, + 83,0,1165,1166,5,84,0,0,1166,1167,3,166,83,0,1167,1168,5,141,0,0, + 1168,1169,3,166,83,0,1169,1209,1,0,0,0,1170,1171,5,85,0,0,1171,1172, + 3,166,83,0,1172,1173,5,141,0,0,1173,1174,3,166,83,0,1174,1209,1, + 0,0,0,1175,1176,5,64,0,0,1176,1177,3,166,83,0,1177,1178,5,141,0, + 0,1178,1179,3,138,69,0,1179,1209,1,0,0,0,1180,1181,5,65,0,0,1181, + 1182,3,166,83,0,1182,1183,5,141,0,0,1183,1184,3,166,83,0,1184,1185, + 5,141,0,0,1185,1186,3,140,70,0,1186,1209,1,0,0,0,1187,1188,5,46, + 0,0,1188,1190,3,166,83,0,1189,1191,3,28,14,0,1190,1189,1,0,0,0,1190, + 1191,1,0,0,0,1191,1192,1,0,0,0,1192,1193,5,141,0,0,1193,1194,3,130, + 65,0,1194,1209,1,0,0,0,1195,1196,5,48,0,0,1196,1197,3,166,83,0,1197, + 1198,5,141,0,0,1198,1200,3,166,83,0,1199,1201,3,28,14,0,1200,1199, + 1,0,0,0,1200,1201,1,0,0,0,1201,1203,1,0,0,0,1202,1204,3,142,71,0, + 1203,1202,1,0,0,0,1203,1204,1,0,0,0,1204,1206,1,0,0,0,1205,1207, + 3,136,68,0,1206,1205,1,0,0,0,1206,1207,1,0,0,0,1207,1209,1,0,0,0, + 1208,1162,1,0,0,0,1208,1165,1,0,0,0,1208,1170,1,0,0,0,1208,1175, + 1,0,0,0,1208,1180,1,0,0,0,1208,1187,1,0,0,0,1208,1195,1,0,0,0,1209, + 135,1,0,0,0,1210,1211,5,69,0,0,1211,1212,3,142,71,0,1212,137,1,0, + 0,0,1213,1214,7,5,0,0,1214,139,1,0,0,0,1215,1216,7,6,0,0,1216,141, + 1,0,0,0,1217,1218,5,67,0,0,1218,1222,5,142,0,0,1219,1221,3,144,72, + 0,1220,1219,1,0,0,0,1221,1224,1,0,0,0,1222,1220,1,0,0,0,1222,1223, + 1,0,0,0,1223,1225,1,0,0,0,1224,1222,1,0,0,0,1225,1226,5,143,0,0, + 1226,143,1,0,0,0,1227,1228,3,166,83,0,1228,1229,5,61,0,0,1229,1230, + 5,11,0,0,1230,1231,5,25,0,0,1231,1232,5,144,0,0,1232,1233,3,88,44, + 0,1233,1234,5,145,0,0,1234,1235,5,139,0,0,1235,1326,1,0,0,0,1236, + 1237,3,166,83,0,1237,1238,5,61,0,0,1238,1239,5,64,0,0,1239,1246, + 3,166,83,0,1240,1241,5,70,0,0,1241,1242,5,65,0,0,1242,1243,3,166, + 83,0,1243,1244,5,141,0,0,1244,1245,3,166,83,0,1245,1247,1,0,0,0, + 1246,1240,1,0,0,0,1246,1247,1,0,0,0,1247,1248,1,0,0,0,1248,1249, + 5,139,0,0,1249,1326,1,0,0,0,1250,1251,3,166,83,0,1251,1252,5,61, + 0,0,1252,1253,5,65,0,0,1253,1254,3,166,83,0,1254,1255,5,141,0,0, + 1255,1262,3,166,83,0,1256,1257,5,70,0,0,1257,1258,5,65,0,0,1258, + 1259,3,166,83,0,1259,1260,5,141,0,0,1260,1261,3,166,83,0,1261,1263, + 1,0,0,0,1262,1256,1,0,0,0,1262,1263,1,0,0,0,1263,1264,1,0,0,0,1264, + 1265,5,139,0,0,1265,1326,1,0,0,0,1266,1267,3,166,83,0,1267,1268, + 5,61,0,0,1268,1269,5,46,0,0,1269,1271,3,166,83,0,1270,1272,3,28, + 14,0,1271,1270,1,0,0,0,1271,1272,1,0,0,0,1272,1281,1,0,0,0,1273, + 1274,5,70,0,0,1274,1275,5,65,0,0,1275,1276,3,166,83,0,1276,1277, + 5,141,0,0,1277,1278,3,166,83,0,1278,1282,1,0,0,0,1279,1280,5,20, + 0,0,1280,1282,5,56,0,0,1281,1273,1,0,0,0,1281,1279,1,0,0,0,1281, + 1282,1,0,0,0,1282,1283,1,0,0,0,1283,1284,5,139,0,0,1284,1326,1,0, + 0,0,1285,1286,3,166,83,0,1286,1287,5,61,0,0,1287,1288,5,7,0,0,1288, + 1289,3,166,83,0,1289,1290,5,67,0,0,1290,1294,5,142,0,0,1291,1293, + 3,122,61,0,1292,1291,1,0,0,0,1293,1296,1,0,0,0,1294,1292,1,0,0,0, + 1294,1295,1,0,0,0,1295,1297,1,0,0,0,1296,1294,1,0,0,0,1297,1298, + 5,143,0,0,1298,1299,5,139,0,0,1299,1326,1,0,0,0,1300,1301,3,166, + 83,0,1301,1302,5,61,0,0,1302,1303,5,54,0,0,1303,1304,3,166,83,0, + 1304,1305,5,139,0,0,1305,1326,1,0,0,0,1306,1307,3,166,83,0,1307, + 1309,5,61,0,0,1308,1310,5,11,0,0,1309,1308,1,0,0,0,1309,1310,1,0, + 0,0,1310,1311,1,0,0,0,1311,1312,5,24,0,0,1312,1313,3,166,83,0,1313, + 1314,5,141,0,0,1314,1321,3,166,83,0,1315,1316,5,70,0,0,1316,1317, + 5,65,0,0,1317,1318,3,166,83,0,1318,1319,5,141,0,0,1319,1320,3,166, + 83,0,1320,1322,1,0,0,0,1321,1315,1,0,0,0,1321,1322,1,0,0,0,1322, + 1323,1,0,0,0,1323,1324,5,139,0,0,1324,1326,1,0,0,0,1325,1227,1,0, + 0,0,1325,1236,1,0,0,0,1325,1250,1,0,0,0,1325,1266,1,0,0,0,1325,1285, + 1,0,0,0,1325,1300,1,0,0,0,1325,1306,1,0,0,0,1326,145,1,0,0,0,1327, + 1328,5,54,0,0,1328,1329,3,166,83,0,1329,1330,5,61,0,0,1330,1331, + 3,166,83,0,1331,1332,5,141,0,0,1332,1334,3,166,83,0,1333,1335,3, + 142,71,0,1334,1333,1,0,0,0,1334,1335,1,0,0,0,1335,1336,1,0,0,0,1336, + 1337,5,139,0,0,1337,147,1,0,0,0,1338,1396,3,154,77,0,1339,1396,5, + 118,0,0,1340,1396,5,119,0,0,1341,1342,5,120,0,0,1342,1396,3,168, + 84,0,1343,1344,5,121,0,0,1344,1345,5,148,0,0,1345,1346,3,166,83, + 0,1346,1347,5,149,0,0,1347,1396,1,0,0,0,1348,1349,5,122,0,0,1349, + 1350,5,148,0,0,1350,1352,3,166,83,0,1351,1353,3,28,14,0,1352,1351, + 1,0,0,0,1352,1353,1,0,0,0,1353,1354,1,0,0,0,1354,1355,5,149,0,0, + 1355,1396,1,0,0,0,1356,1357,5,41,0,0,1357,1358,5,148,0,0,1358,1359, + 3,166,83,0,1359,1360,5,149,0,0,1360,1396,1,0,0,0,1361,1362,5,123, + 0,0,1362,1363,5,148,0,0,1363,1364,3,148,74,0,1364,1365,5,149,0,0, + 1365,1396,1,0,0,0,1366,1367,5,124,0,0,1367,1368,5,148,0,0,1368,1369, + 3,148,74,0,1369,1370,5,149,0,0,1370,1396,1,0,0,0,1371,1372,5,125, + 0,0,1372,1376,5,142,0,0,1373,1375,3,150,75,0,1374,1373,1,0,0,0,1375, + 1378,1,0,0,0,1376,1374,1,0,0,0,1376,1377,1,0,0,0,1377,1379,1,0,0, + 0,1378,1376,1,0,0,0,1379,1396,5,143,0,0,1380,1381,5,8,0,0,1381,1382, + 5,89,0,0,1382,1383,3,168,84,0,1383,1385,5,142,0,0,1384,1386,3,152, + 76,0,1385,1384,1,0,0,0,1386,1387,1,0,0,0,1387,1385,1,0,0,0,1387, + 1388,1,0,0,0,1388,1389,1,0,0,0,1389,1390,5,143,0,0,1390,1396,1,0, + 0,0,1391,1393,3,166,83,0,1392,1394,3,28,14,0,1393,1392,1,0,0,0,1393, + 1394,1,0,0,0,1394,1396,1,0,0,0,1395,1338,1,0,0,0,1395,1339,1,0,0, + 0,1395,1340,1,0,0,0,1395,1341,1,0,0,0,1395,1343,1,0,0,0,1395,1348, + 1,0,0,0,1395,1356,1,0,0,0,1395,1361,1,0,0,0,1395,1366,1,0,0,0,1395, + 1371,1,0,0,0,1395,1380,1,0,0,0,1395,1391,1,0,0,0,1396,149,1,0,0, + 0,1397,1398,3,166,83,0,1398,1399,5,138,0,0,1399,1400,3,148,74,0, + 1400,1401,5,139,0,0,1401,151,1,0,0,0,1402,1403,3,166,83,0,1403,1404, + 5,89,0,0,1404,1405,3,168,84,0,1405,1406,5,138,0,0,1406,1407,3,148, + 74,0,1407,1408,5,139,0,0,1408,153,1,0,0,0,1409,1410,7,7,0,0,1410, + 155,1,0,0,0,1411,1412,7,8,0,0,1412,157,1,0,0,0,1413,1422,3,168,84, + 0,1414,1422,5,152,0,0,1415,1422,5,153,0,0,1416,1422,5,134,0,0,1417, + 1422,5,135,0,0,1418,1422,5,136,0,0,1419,1422,3,160,80,0,1420,1422, + 3,164,82,0,1421,1413,1,0,0,0,1421,1414,1,0,0,0,1421,1415,1,0,0,0, + 1421,1416,1,0,0,0,1421,1417,1,0,0,0,1421,1418,1,0,0,0,1421,1419, + 1,0,0,0,1421,1420,1,0,0,0,1422,159,1,0,0,0,1423,1432,5,142,0,0,1424, + 1429,3,162,81,0,1425,1426,5,140,0,0,1426,1428,3,162,81,0,1427,1425, + 1,0,0,0,1428,1431,1,0,0,0,1429,1427,1,0,0,0,1429,1430,1,0,0,0,1430, + 1433,1,0,0,0,1431,1429,1,0,0,0,1432,1424,1,0,0,0,1432,1433,1,0,0, + 0,1433,1434,1,0,0,0,1434,1435,5,143,0,0,1435,161,1,0,0,0,1436,1437, + 3,168,84,0,1437,1438,5,138,0,0,1438,1439,3,158,79,0,1439,163,1,0, + 0,0,1440,1449,5,144,0,0,1441,1446,3,158,79,0,1442,1443,5,140,0,0, + 1443,1445,3,158,79,0,1444,1442,1,0,0,0,1445,1448,1,0,0,0,1446,1444, + 1,0,0,0,1446,1447,1,0,0,0,1447,1450,1,0,0,0,1448,1446,1,0,0,0,1449, + 1441,1,0,0,0,1449,1450,1,0,0,0,1450,1451,1,0,0,0,1451,1452,5,145, + 0,0,1452,165,1,0,0,0,1453,1454,7,9,0,0,1454,167,1,0,0,0,1455,1456, + 5,155,0,0,1456,169,1,0,0,0,129,182,189,210,223,235,255,263,270,276, 288,291,297,308,317,327,330,332,336,344,356,361,371,381,386,401, 407,419,428,436,444,457,460,470,474,480,487,493,501,509,522,529, 533,538,549,555,566,592,596,602,613,622,628,633,635,666,670,676, 703,713,724,727,732,735,738,745,754,757,760,763,786,795,809,830, - 833,836,843,851,883,895,898,902,924,938,946,958,972,982,1000,1004, - 1007,1011,1014,1020,1024,1029,1033,1037,1043,1057,1072,1092,1101, - 1133,1153,1173,1183,1186,1189,1191,1205,1229,1245,1254,1264,1277, - 1292,1304,1308,1317,1335,1359,1370,1376,1378,1404,1412,1415,1429, - 1432 + 833,836,843,851,883,895,898,902,924,938,946,958,972,989,1007,1011, + 1014,1018,1021,1027,1031,1036,1040,1044,1050,1064,1079,1099,1108, + 1140,1160,1190,1200,1203,1206,1208,1222,1246,1262,1271,1281,1294, + 1309,1321,1325,1334,1352,1376,1387,1393,1395,1421,1429,1432,1446, + 1449 ]; private static __ATN: antlr.ATN; @@ -8604,6 +8621,15 @@ export class StoragePolicyContext extends antlr.ParserRuleContext { public RPAREN(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.RPAREN, 0); } + public JOURNAL(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.JOURNAL, 0); + } + public jsonObject(): JsonObjectContext | null { + return this.getRuleContext(0, JsonObjectContext); + } + public SUBSCRIPTION(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.SUBSCRIPTION, 0); + } public override get ruleIndex(): number { return QuixosCapabilityParser.RULE_storagePolicy; } @@ -9243,6 +9269,12 @@ export class OperationProviderContext extends antlr.ParserRuleContext { return this.getRuleContext(i, IdentifierContext); } + public JOURNAL(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.JOURNAL, 0); + } + public SUBSCRIPTION(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.SUBSCRIPTION, 0); + } public STATE(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.STATE, 0); } @@ -10049,6 +10081,18 @@ export class IdentifierContext extends antlr.ParserRuleContext { public SUBJECT(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.SUBJECT, 0); } + public MESSAGE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.MESSAGE, 0); + } + public JOURNAL(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.JOURNAL, 0); + } + public SUBSCRIPTION(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.SUBSCRIPTION, 0); + } + public CONNECT(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.CONNECT, 0); + } public FOR(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.FOR, 0); } diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index 5734516..1d04fcf 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -1789,10 +1789,14 @@ const lowerState = (state: LoweringState, context: StateDeclContext): StateSlotD valueType: lowerValueType(state, context.valueType()), storagePolicy: policy.REGISTER() ? { kind: "register" } - : { - kind: "crdt-document", - updateType: lowerValueType(state, policy.valueType()), - }, + : policy.JOURNAL() + ? { kind: "journal", limits: JSON.parse(text(policy.jsonObject())) } + : policy.SUBSCRIPTION() + ? { kind: "subscription", payload: lowerValueType(state, policy.valueType()) } + : { + kind: "crdt-document", + updateType: lowerValueType(state, policy.valueType()), + }, defaultValue, }; }; @@ -2239,9 +2243,9 @@ const lowerConformanceRule = (state: LoweringState, context: ConformanceDeclCont ); } } - } else if (provider.STATE() || provider.EDGE()) { + } else if (provider.STATE() || provider.JOURNAL() || provider.SUBSCRIPTION() || provider.EDGE()) { const name = identifier(provider.identifier(0)); - const expected = provider.STATE() ? "state" : "edge"; + const expected = provider.STATE() || provider.JOURNAL() || provider.SUBSCRIPTION() ? "state" : "edge"; // Concrete attachments are registered before rules, so unused rules can // also check public traversal without waiting for an application. if (provider.EDGE() && !privateStorage.has(name)) { @@ -2435,6 +2439,74 @@ const lowerConformanceBody = ( return []; } const provider = bindingContext.operationProvider(); + if (provider.SUBSCRIPTION()) { + const attachment = requireSymbol( + state, + state.attachments, + identifier(provider.identifier(0)), + provider, + "attachment", + ); + const primitive = identifier(provider.identifier(1)); + if ( + !attachment || + attachment.attachment.kind !== "state" || + attachment.attachment.storagePolicy.kind !== "subscription" || + !["attach", "status", "pause", "resume", "retire"].includes(primitive) + ) { + loweringIssue( + state, + provider, + "invalid-subscription-binding", + "Expected native subscription storage and a public subscription primitive", + ); + return []; + } + return [ + { + operationId, + binding: { + kind: "subscription", + slotId: attachment.attachment.id, + primitive: primitive as "attach" | "status" | "pause" | "resume" | "retire", + }, + }, + ]; + } + if (provider.JOURNAL()) { + const attachment = requireSymbol( + state, + state.attachments, + identifier(provider.identifier(0)), + provider, + "attachment", + ); + const primitive = identifier(provider.identifier(1)); + if ( + !attachment || + attachment.attachment.kind !== "state" || + attachment.attachment.storagePolicy.kind !== "journal" || + !["publish", "readPage", "head"].includes(primitive) + ) { + loweringIssue( + state, + provider, + "invalid-journal-binding", + "Expected a native journal and publish, readPage or head", + ); + return []; + } + return [ + { + operationId, + binding: { + kind: "journal", + slotId: attachment.attachment.id, + primitive: primitive as "publish" | "readPage" | "head", + }, + }, + ]; + } if (provider.LIFECYCLE()) { if (identifier(provider.identifier(0)) !== "delete") { loweringIssue(state, provider, "invalid-lifecycle-binding", "Only lifecycle.delete is supported"); diff --git a/src/capability-model/evolution.ts b/src/capability-model/evolution.ts index e3503c5..96d18b1 100644 --- a/src/capability-model/evolution.ts +++ b/src/capability-model/evolution.ts @@ -196,6 +196,10 @@ export const runtimeContracts = (workspace: WorkspaceRevision): RuntimeContract[ }; const binding = (parent: GraphNode, value: Binding, atomId: string, context: unknown) => { if (value.kind === "lifecycle") return; + if (value.kind === "journal" || value.kind === "subscription") { + dependency(parent, { kind: "state", slotId: value.slotId }, atomId); + return; + } if (value.kind !== "package") { dependency(parent, value, atomId); return; diff --git a/src/capability-model/execution.ts b/src/capability-model/execution.ts index 0fc0dd9..957ad63 100644 --- a/src/capability-model/execution.ts +++ b/src/capability-model/execution.ts @@ -25,6 +25,7 @@ export function validateExecutionContracts(workspace: WorkspaceRevision): Capabi requested: ExecutionContract | undefined, provided: ExecutionContract | undefined, path: string, + requireTargets = true, ) => { if (!requested || requested.kind === "remote") return; if (!provided || provided.kind === "remote") { @@ -33,8 +34,9 @@ export function validateExecutionContracts(workspace: WorkspaceRevision): Capabi } if (requested.kind === "snapshot" && provided.kind !== "snapshot") fail(path, "Snapshot execution cannot perform a transaction"); - for (const target of requested.targets ?? []) - if (!provided.targets?.includes(target)) fail(path, `Dependency does not provide execution target ${target}`); + if (requireTargets) + for (const target of requested.targets ?? []) + if (!provided.targets?.includes(target)) fail(path, `Dependency does not provide execution target ${target}`); }; for (const revision of workspace.interfaceImports) for (const member of revision.template?.members ?? revision.members) { @@ -82,7 +84,10 @@ export function validateExecutionContracts(workspace: WorkspaceRevision): Capabi if (entry.execution && entry.execution.kind !== "remote") { if (!selected) fail(portPath, "Portable interface ports must select their required operations"); for (const id of selected ?? []) - if (contract) supports(entry.execution, operations(id, contract)?.execution, portPath); + // Package targets describe available code. Required public target + // guarantees are checked over the installed operation closure; + // an optional implementation target must not strengthen a dependency. + if (contract) supports(entry.execution, operations(id, contract)?.execution, portPath, false); } } if (!entry.execution || entry.execution.kind === "remote") continue; @@ -150,6 +155,20 @@ export function validateExecutionContracts(workspace: WorkspaceRevision): Capabi continue; } if (!operation.execution || operation.execution.kind === "remote") continue; + if (binding.kind === "journal") { + const expected = binding.primitive === "publish" ? "transaction" : "snapshot"; + if (operation.execution.kind !== expected) fail(path, "Native journal operation requires the matching effect"); + continue; + } + if (binding.kind === "subscription") { + const expected = binding.primitive === "status" ? "snapshot" : "transaction"; + if ( + operation.execution.kind !== expected || + (binding.primitive !== "status" && operation.execution.targets.some((target) => target !== "server")) + ) + fail(path, "Subscription controls require authoritative execution; status is a portable snapshot"); + continue; + } if (binding.kind === "package") { const provider = packages.get(binding.packageRevisionId)?.exports.find((e) => e.id === binding.exportId); supports(operation.execution, provider?.execution, path); diff --git a/src/capability-model/initialization.ts b/src/capability-model/initialization.ts index 1206066..e1e57de 100644 --- a/src/capability-model/initialization.ts +++ b/src/capability-model/initialization.ts @@ -24,7 +24,13 @@ export function validateInitialization(workspace: WorkspaceRevision): Capability fail(ownerKey(owner), `Initialization input ${field.input} must name an attachment owned by this conformance`); return; } - if (attachment.kind === "state") return attachment.valueType; + if (attachment.kind === "state") { + if (["journal", "subscription"].includes(attachment.storagePolicy.kind)) { + fail(ownerKey(owner), "Native journals start empty and cannot be seeded as state"); + return; + } + return attachment.valueType; + } if (binding.kind !== "edge") return; const index = attachment.endpoints.findIndex((e) => e.projectionId === binding.projectionId); const endpoint = attachment.endpoints[index]; @@ -102,7 +108,12 @@ export function validateInitialization(workspace: WorkspaceRevision): Capability ...workspace.conformances.flatMap((o) => o.privateAttachments), ].filter((a) => a.kind === "state" && a.attachedTo === binding.atomId); for (const state of states) - if (state.kind === "state" && state.defaultValue === undefined && !initialized.has(state.id)) + if ( + state.kind === "state" && + !["journal", "subscription"].includes(state.storagePolicy.kind) && + state.defaultValue === undefined && + !initialized.has(state.id) + ) fail(portPath, `Required state ${state.id} has no default or declared seed mapping`); } }; diff --git a/src/capability-model/journals.ts b/src/capability-model/journals.ts new file mode 100644 index 0000000..a9d355b --- /dev/null +++ b/src/capability-model/journals.ts @@ -0,0 +1,131 @@ +import { + valueType, + type JournalPrimitive, + type InterfaceOperation, + type InterfaceRevision, + type ObjectExpectation, + type OperationId, + type ValueType, +} from "./types.js"; +import { valueTypesEqual } from "./validation.js"; + +export const subscriptionStatusType: ValueType = { + kind: "record", + fields: { + status: valueType.string, + generation: valueType.uint64, + cursor: valueType.uint64, + failure: { + kind: "optional", + value: { + kind: "record", + fields: { publication: valueType.string, code: valueType.string, message: valueType.string }, + }, + }, + }, +}; + +/** Native subscription configuration is selected by the checked attach contract. + * No library/interface ID or handler method name is reserved by Camino. */ +export function subscriptionContract( + payload: ValueType, + parameters: ValueType, + attach: InterfaceOperation, + interfaces: readonly InterfaceRevision[], +): { source: ObjectExpectation; handler: ObjectExpectation; operation: OperationId } { + const fail = (message: string): never => { + throw new Error(message); + }; + if ( + attach.mode !== "call" || + attach.scope === "class" || + !valueTypesEqual(attach.outputType, valueType.unit) || + attach.inputType.kind !== "record" + ) + return fail("Subscription attachment must be an object call returning unit"); + const fields = attach.inputType.fields; + if ( + Object.keys(fields).sort().join(",") !== "handler,parameters,source,start" || + fields.source?.kind !== "object-ref" || + fields.handler?.kind !== "object-ref" || + fields.handler.expectation.kind !== "interface" || + !valueTypesEqual(fields.parameters!, parameters) + ) + return fail("Attachment needs typed source/handler references, matching parameters, and a start policy"); + const start = fields.start; + if ( + start?.kind !== "variant" || + Object.keys(start.cases).sort().join(",") !== "afterCursor,future,retained" || + !valueTypesEqual(start.cases.future!.value, valueType.unit) || + !valueTypesEqual(start.cases.retained!.value, valueType.unit) || + !valueTypesEqual(start.cases.afterCursor!.value, valueType.string) + ) + return fail("Subscription start requires future:unit, retained:unit and afterCursor:string variant cases"); + const handler = fields.handler.expectation; + const expected: ValueType = { kind: "record", fields: { event: payload, parameters } }; + const candidates = + interfaces + .find((iface) => iface.revisionId === handler.interfaceRevisionId) + ?.members.flatMap((member) => member.operations) + .filter( + (operation) => + operation.mode === "call" && + operation.scope !== "class" && + operation.execution?.kind === "transaction" && + operation.execution.targets.includes("server") && + valueTypesEqual(operation.inputType, expected) && + valueTypesEqual(operation.outputType, valueType.unit), + ) ?? []; + if (candidates.length !== 1) + return fail("Handler interface must select one unambiguous server transaction from {event, parameters} to unit"); + return { source: fields.source.expectation, handler, operation: candidates[0]!.id }; +} + +/** Journals persist checked values, including managed references. They cannot + * persist process handles, opaque messages or edit commands. */ +export function journalPayloadType(type: ValueType): boolean { + switch (type.kind) { + case "scalar": + case "object-ref": + return true; + case "builtin": + return type.name === "unit"; + case "list": + case "optional": + return journalPayloadType(type.value); + case "record": + return Object.values(type.fields).every(journalPayloadType); + case "variant": + return Object.values(type.cases).every((entry) => journalPayloadType(entry.value)); + default: + return false; + } +} +export function journalPrimitiveSignature( + payload: ValueType, + primitive: JournalPrimitive, +): Pick { + const optional = (value: ValueType): ValueType => ({ kind: "optional", value }); + if (primitive === "publish") + return { + mode: "call", + inputType: payload, + outputType: { kind: "record", fields: { publication: valueType.string } }, + }; + if (primitive === "head") return { mode: "call", inputType: valueType.unit, outputType: optional(valueType.uint64) }; + return { + mode: "call", + inputType: { kind: "record", fields: { after: optional(valueType.string), limit: valueType.uint32 } }, + outputType: { + kind: "record", + fields: { + entries: { + kind: "list", + value: { kind: "record", fields: { publication: valueType.string, position: valueType.uint64, payload } }, + }, + next: optional(valueType.string), + asOfHead: optional(valueType.uint64), + }, + }, + }; +} diff --git a/src/capability-model/types.ts b/src/capability-model/types.ts index 6d38feb..6487587 100644 --- a/src/capability-model/types.ts +++ b/src/capability-model/types.ts @@ -196,7 +196,19 @@ export interface InterfaceRevision { argumentRequirements?: { target: ObjectExpectation; required: InterfaceRevisionId }[]; } -export type StoragePolicy = { kind: "register" } | { kind: "crdt-document"; updateType: ValueType }; +export interface JournalStorageLimits { + maxEntries: number; + maxBytes: number; + maxPublicationBytes: number; + maxProtectedSubscriptions: number; +} +export type StoragePolicy = + | { kind: "register" } + | { kind: "crdt-document"; updateType: ValueType } + | { kind: "journal"; limits: JournalStorageLimits } + | { kind: "subscription"; payload: ValueType }; +export type JournalPrimitive = "publish" | "readPage" | "head"; +export type SubscriptionPrimitive = "attach" | "status" | "pause" | "resume" | "retire"; export interface StateSlotDefinition { kind: "state"; @@ -417,6 +429,8 @@ export interface RelationshipMaterialization { } export type Binding = + | { kind: "journal"; slotId: SlotId; primitive: JournalPrimitive } + | { kind: "subscription"; slotId: SlotId; primitive: SubscriptionPrimitive } | { kind: "lifecycle"; primitive: "delete" } | { kind: "interface"; diff --git a/src/capability-model/validation.ts b/src/capability-model/validation.ts index d86b3f3..518dff0 100644 --- a/src/capability-model/validation.ts +++ b/src/capability-model/validation.ts @@ -1,4 +1,10 @@ import { isStorableType } from "./generics.js"; +import { + journalPayloadType, + journalPrimitiveSignature, + subscriptionContract, + subscriptionStatusType, +} from "./journals.js"; import { validateInitialization } from "./initialization.js"; import { validatePresentations } from "./presentations.js"; import { validateModules } from "./modules.js"; @@ -511,15 +517,32 @@ const atomSatisfiesConstraint = ( ? constraint.atomId === atomId : conformances.has(conformanceKey(atomId, constraint.interfaceRevisionId)); +const interfaceImplies = ( + indexes: ValidationIndexes, + actual: InterfaceRevisionId, + required: InterfaceRevisionId, + visited = new Set(), +): boolean => { + if (actual === required) return true; + if (visited.has(actual)) return false; + visited.add(actual); + return (indexes.interfaces.get(actual)?.revision.requiredInterfaces ?? []).some((entry) => + interfaceImplies(indexes, entry, required, visited), + ); +}; + const constraintSatisfiesConstraint = ( actual: EdgeEndpointConstraint, required: EdgeEndpointConstraint, - conformances: ReadonlyMap, + indexes: ValidationIndexes, ) => constraintsEqual(actual, required) || (actual.kind === "atom" && required.kind === "interface" && - atomSatisfiesConstraint(actual.atomId, required, conformances)); + atomSatisfiesConstraint(actual.atomId, required, indexes.conformances)) || + (actual.kind === "interface" && + required.kind === "interface" && + interfaceImplies(indexes, actual.interfaceRevisionId, required.interfaceRevisionId)); const canAccessAttachment = ( owner: AttachmentOwner, @@ -858,24 +881,12 @@ const validateInterfaces = ( issues: CapabilityValidationIssue[], indexes: ValidationIndexes, ) => { - const implies = ( - actual: InterfaceRevisionId, - required: InterfaceRevisionId, - visited = new Set(), - ): boolean => { - if (actual === required) return true; - if (visited.has(actual)) return false; - visited.add(actual); - return (indexes.interfaces.get(actual)?.revision.requiredInterfaces ?? []).some((entry) => - implies(entry, required, visited), - ); - }; for (const [packageIndex, pkg] of workspace.packageImports.entries()) { for (const obligation of pkg.argumentRequirements ?? []) { const satisfied = obligation.target.kind === "atom" ? indexes.conformances.has(conformanceKey(obligation.target.atomId, obligation.required)) - : implies(obligation.target.interfaceRevisionId, obligation.required); + : interfaceImplies(indexes, obligation.target.interfaceRevisionId, obligation.required); if (!satisfied) issue( issues, @@ -890,7 +901,7 @@ const validateInterfaces = ( for (const required of revision.requiredInterfaces ?? []) { if (!indexes.interfaces.has(required)) issue(issues, "unresolved-reference", path, `Unknown prerequisite interface ${required}`); - else if (implies(required, revision.revisionId)) + else if (interfaceImplies(indexes, required, revision.revisionId)) issue( issues, "cyclic-conformance-requirement", @@ -902,7 +913,7 @@ const validateInterfaces = ( const satisfied = obligation.target.kind === "atom" ? indexes.conformances.has(conformanceKey(obligation.target.atomId, obligation.required)) - : implies(obligation.target.interfaceRevisionId, obligation.required); + : interfaceImplies(indexes, obligation.target.interfaceRevisionId, obligation.required); if (!satisfied) issue(issues, "unsatisfied-interface", path, `Generic argument does not implement ${obligation.required}`); } @@ -946,7 +957,8 @@ const validateAttachments = (issues: CapabilityValidationIssue[], indexes: Valid (type.kind === "variant" && Object.values(type.cases).some((entry) => containsRpcType(entry.value))) || ((type.kind === "optional" || type.kind === "list") && containsRpcType(type.value)); if ( - containsRpcType(attachment.valueType) || + (!["journal", "subscription"].includes(attachment.storagePolicy.kind) && + containsRpcType(attachment.valueType)) || (attachment.storagePolicy.kind === "crdt-document" && containsRpcType(attachment.storagePolicy.updateType)) ) { issue( @@ -959,6 +971,43 @@ const validateAttachments = (issues: CapabilityValidationIssue[], indexes: Valid if (attachment.storagePolicy.kind === "crdt-document") { validateValueType(issues, attachment.storagePolicy.updateType, `${path}.storagePolicy.updateType`, indexes); } + if (attachment.storagePolicy.kind === "journal") { + if (!journalPayloadType(attachment.valueType) || attachment.defaultValue !== undefined) + issue(issues, "invalid-attachment", path, "Journals require finite typed payloads and start empty"); + const limits = attachment.storagePolicy.limits; + const ceilings = { + maxEntries: 10000, + maxBytes: 1048576, + maxPublicationBytes: 262144, + maxProtectedSubscriptions: 256, + }; + if ( + !limits || + Object.keys(limits).length !== 4 || + Object.entries(ceilings).some( + ([key, ceiling]) => + !Number.isSafeInteger(limits[key as keyof typeof limits]) || + limits[key as keyof typeof limits] < 1 || + limits[key as keyof typeof limits] > ceiling, + ) || + limits.maxPublicationBytes > limits.maxBytes + ) + issue(issues, "invalid-attachment", path, "Invalid bounded journal limits"); + } + if (attachment.storagePolicy.kind === "subscription") { + validateValueType(issues, attachment.storagePolicy.payload, `${path}.storagePolicy.payload`, indexes); + if ( + !journalPayloadType(attachment.valueType) || + !journalPayloadType(attachment.storagePolicy.payload) || + attachment.defaultValue !== undefined + ) + issue( + issues, + "invalid-attachment", + path, + "Subscriptions require finite typed payloads/parameters and start unattached", + ); + } if (owner.kind === "conformance") { if (attachment.attachedTo !== owner.atomId) { issue( @@ -1413,6 +1462,13 @@ const validateBoundDependencies = ( break; } validateAttachmentAccess(issues, attachment, params.conformance, `${path}.binding.slotId`); + if (["journal", "subscription"].includes(attachment.attachment.storagePolicy.kind)) + issue( + issues, + "invalid-dependency-binding", + path, + "Journal storage requires checked journal interface calls, not ordinary state ports", + ); const traversal = stateBinding.via ? validateTraversal( issues, @@ -1519,11 +1575,7 @@ const validateBoundDependencies = ( ); } if ( - !constraintSatisfiesConstraint( - projection.target.constraint, - requirement.target, - params.indexes.conformances, - ) || + !constraintSatisfiesConstraint(projection.target.constraint, requirement.target, params.indexes) || requirement.cardinality !== projection.endpoint.cardinality || requirement.keyType !== projection.endpoint.keyType ) { @@ -1822,7 +1874,9 @@ const validateConformances = ( ) { const native = member.kind === "value" - ? binding.kind === "state" && binding.primitive === "read" + ? (binding.kind === "state" && binding.primitive === "read") || + (binding.kind === "journal" && binding.primitive === "head") || + (binding.kind === "subscription" && binding.primitive === "status") : binding.kind === "edge" && binding.primitive === "resolve"; if (!native && (member.queryRead.execution === "native" || binding.kind !== "package")) issue( @@ -1878,6 +1932,67 @@ const validateConformances = ( ); continue; } + if (binding.kind === "journal") { + const attachment = findAttachment(indexes, "state", binding.slotId); + if ( + !attachment || + attachment.attachment.kind !== "state" || + attachment.attachment.storagePolicy.kind !== "journal" + ) { + issue(issues, "invalid-state-binding", bindingPath, "Expected native journal storage"); + continue; + } + validateAttachmentAccess(issues, attachment, conformance, bindingPath); + if ( + attachment.attachment.attachedTo !== conformance.atomId || + !["publish", "readPage", "head"].includes(binding.primitive) || + !signaturesMatch(operation, journalPrimitiveSignature(attachment.attachment.valueType, binding.primitive)) + ) + issue( + issues, + "invalid-state-binding", + bindingPath, + "Journal primitive does not match this object operation's signature", + ); + continue; + } + if (binding.kind === "subscription") { + const attachment = findAttachment(indexes, "state", binding.slotId); + if ( + !attachment || + attachment.attachment.kind !== "state" || + attachment.attachment.storagePolicy.kind !== "subscription" + ) { + issue(issues, "invalid-state-binding", bindingPath, "Expected native subscription storage"); + continue; + } + validateAttachmentAccess(issues, attachment, conformance, bindingPath); + const slot = attachment.attachment; + if (slot.storagePolicy.kind !== "subscription") continue; + if (slot.attachedTo !== conformance.atomId) + issue(issues, "invalid-state-binding", bindingPath, "Subscription belongs to another atom"); + if (binding.primitive === "attach") { + try { + subscriptionContract( + slot.storagePolicy.payload, + slot.valueType, + operation, + [...indexes.interfaces.values()].map((value) => value.revision), + ); + } catch (error) { + issue(issues, "invalid-state-binding", bindingPath, String(error)); + } + } else if ( + !["status", "pause", "resume", "retire"].includes(binding.primitive) || + !signaturesMatch(operation, { + mode: "call", + inputType: valueType.unit, + outputType: binding.primitive === "status" ? subscriptionStatusType : valueType.unit, + }) + ) + issue(issues, "invalid-state-binding", bindingPath, "Subscription primitive signature mismatch"); + continue; + } if (binding.kind === "state") { const attachment = findAttachment(indexes, "state", binding.slotId); if (!attachment || attachment.attachment.kind !== "state") { @@ -1890,6 +2005,8 @@ const validateConformances = ( continue; } validateAttachmentAccess(issues, attachment, conformance, `${bindingPath}.binding.slotId`); + if (["journal", "subscription"].includes(attachment.attachment.storagePolicy.kind)) + issue(issues, "invalid-state-binding", bindingPath, "Use native journal primitives, not state access"); if (attachment.attachment.attachedTo !== conformance.atomId) { issue( issues, @@ -1990,11 +2107,7 @@ const validateConformances = ( "Edge primitives may only implement relationship members", ); } else if ( - !constraintSatisfiesConstraint( - projection.target.constraint, - operationEntry.member.target, - indexes.conformances, - ) || + !constraintSatisfiesConstraint(projection.target.constraint, operationEntry.member.target, indexes) || operationEntry.member.cardinality !== projection.endpoint.cardinality || (operationEntry.member.keyType !== undefined && operationEntry.member.keyType !== projection.endpoint.keyType) ) { @@ -2002,7 +2115,7 @@ const validateConformances = ( issues, "invalid-edge-binding", `${bindingPath}.binding`, - "Edge projection target or cardinality does not match relationship member", + `Edge projection target or cardinality does not match ${conformance.atomId}/${conformance.interfaceRevisionId}/${operationEntry.member.displayName}`, ); } if (!signaturesMatch(operation, expected)) { @@ -2531,7 +2644,7 @@ export const resolveOperationPlan = ( attachment: owned as OwnedAttachment & { attachment: EdgeDefinition }, }; } - if (binding.kind === "lifecycle") return undefined; // Old runtime has no lifecycle provider. + if (binding.kind === "lifecycle" || binding.kind === "journal" || binding.kind === "subscription") return undefined; // These native providers require the current kernel. const packageRevision = plan.packages.get(binding.packageRevisionId); const packageExport = packageRevision?.exports.find( (entry): entry is PackageOperationExport | PackageFunctionExport => @@ -2679,7 +2792,7 @@ export const computeCapabilityClosure = ( queued.push({ atomId: root.atomId, interfaceRevisionId: member.subject.interfaceRevisionId }); } for (const binding of conformance.operationBindings.values()) { - if (binding.kind === "state") { + if (binding.kind === "state" || binding.kind === "journal" || binding.kind === "subscription") { attachments.add(binding.slotId); } else if (binding.kind === "edge") { attachments.add(binding.edgeTypeId); diff --git a/src/execution-world/kernel.ts b/src/execution-world/kernel.ts index de3b12d..47d9ff5 100644 --- a/src/execution-world/kernel.ts +++ b/src/execution-world/kernel.ts @@ -9,6 +9,7 @@ import type { } from "../capability-model/types.js"; import { type ExecutionPlan, ExecutionPlanError, hexDigest } from "./plan.js"; import { portableValueSchema } from "../bindings/portable.js"; +import { subscriptionContract } from "../capability-model/journals.js"; type PreparedStep = string | null | { case: string; id: string }; function preparedInputPaths(type: ValueType, path: PreparedStep[] = []): PreparedStep[][] { if (type.kind === "change") return [path]; @@ -73,10 +74,105 @@ export function compileKernelProgram(plan: ExecutionPlan): unknown { if (!shape) throw new ExecutionPlanError("UNSUPPORTED_STORAGE_CODEC", storage.id, "Unsupported canonical value type"); ownerBySlot.set(storage.id, owner.id); + const pinsFor = (payload: ValueType) => { + const expectations = new Map(); + const walk = (type: ValueType): void => { + if (type.kind === "object-ref") { + const expectation = { + kind: type.expectation.kind, + id: type.expectation.kind === "atom" ? type.expectation.atomId : type.expectation.interfaceRevisionId, + }; + expectations.set(JSON.stringify(expectation), expectation); + } else if (type.kind === "list" || type.kind === "optional") walk(type.value); + else if (type.kind === "record") Object.values(type.fields).forEach(walk); + else if (type.kind === "variant") Object.values(type.cases).forEach((entry) => walk(entry.value)); + }; + walk(payload); + const pins = [...expectations.values()].map((expectation) => { + const id = `journal-pin:${hexDigest([storage.id, expectation])}`; + const projection = `${id}:source`; + edges.push({ + id, + owner: owner.id, + a: { + projection, + constraint: { kind: "atom", id: owner.atom }, + cardinality: "many", + keyType: "string", + onDelete: "detach", + }, + b: { projection: `${id}:target`, constraint: expectation, cardinality: "many", onDelete: "restrict" }, + }); + return { edge: id, projection }; + }); + return pins; + }; + let journal: unknown, subscription: unknown; + if (storage.storagePolicy.kind === "journal") { + journal = { limits: storage.storagePolicy.limits, pins: pinsFor(storage.valueType) }; + } + if (storage.storagePolicy.kind === "subscription") { + const bindings = plan.definition.operations.filter( + (operation) => + operation.atomId === owner.atom && + operation.binding.kind === "subscription" && + operation.binding.slotId === storage.id && + operation.binding.primitive === "attach", + ); + if (bindings.length !== 1) + throw new ExecutionPlanError( + "SUBSCRIPTION_ATTACHMENT_REQUIRED", + storage.id, + "Native subscription storage requires one checked attachment operation", + ); + const binding = bindings[0]!; + const operation = workspace.interfaceImports + .find((iface) => iface.revisionId === binding.interfaceRevisionId)! + .members.flatMap((member) => member.operations) + .find((operation) => operation.id === binding.operationId)!; + const contract = subscriptionContract( + storage.storagePolicy.payload, + storage.valueType, + operation, + workspace.interfaceImports, + ); + const expectation = (value: typeof contract.source) => ({ + kind: value.kind, + id: value.kind === "atom" ? value.atomId : value.interfaceRevisionId, + }); + const source = expectation(contract.source), + handler = expectation(contract.handler); + const configuration: ValueType = { + kind: "record", + fields: { + source: { kind: "object-ref", expectation: contract.source }, + handler: { kind: "object-ref", expectation: contract.handler }, + parameters: storage.valueType, + }, + }; + const edge = `subscription-active:${hexDigest(storage.id)}`, + projection = `${edge}:subscription`; + edges.push({ + id: edge, + owner: owner.id, + a: { projection, constraint: { kind: "atom", id: owner.atom }, cardinality: "many", onDelete: "restrict" }, + b: { projection: `${edge}:stream`, constraint: source, cardinality: "many", onDelete: "restrict" }, + }); + subscription = { + payload: schema(storage.storagePolicy.payload), + source, + handler, + operation: contract.operation, + pins: pinsFor(configuration), + active: { edge, projection }, + }; + } slots.push({ id: storage.id, schema: shape, - policy: storage.storagePolicy.kind === "register" ? "register" : "crdt", + policy: storage.storagePolicy.kind === "crdt-document" ? "crdt" : storage.storagePolicy.kind, + ...(journal ? { journal } : {}), + ...(subscription ? { subscription } : {}), ...(Object.hasOwn(storage, "defaultValue") ? { defaultLiteral: storage.defaultValue } : {}), }); } else lowerEdge(storage, owner.id); @@ -109,6 +205,13 @@ export function compileKernelProgram(plan: ExecutionPlan): unknown { let target: unknown; let unsupported: string | null = null; if (binding.kind === "lifecycle") target = { kind: "lifecycle", primitive: binding.primitive }; + else if (binding.kind === "journal" || binding.kind === "subscription") + target = { + kind: binding.kind, + owner: slotOwner(binding.slotId), + slot: binding.slotId, + primitive: binding.primitive, + }; else if (binding.kind === "state") target = { kind: "state", owner: slotOwner(binding.slotId), slot: binding.slotId, primitive: binding.primitive }; else if (binding.kind === "edge") @@ -231,7 +334,7 @@ export function compileKernelProgram(plan: ExecutionPlan): unknown { operation: operation.operationId, scope: operation.scope, effect: operation.execution.kind, - targets: operation.execution.kind === "remote" ? [] : operation.execution.targets, + targets: operation.availableTargets, input, ...(inputChanges.length ? { inputChanges } : {}), output, diff --git a/src/execution-world/plan.ts b/src/execution-world/plan.ts index 2835420..c74c0b2 100644 --- a/src/execution-world/plan.ts +++ b/src/execution-world/plan.ts @@ -45,6 +45,8 @@ export interface PlannedOperation { operationId: string; scope: "object" | "class"; execution: ExecutionContract; + /** Installed implementation closure; the public execution contract above remains required. */ + availableTargets: string[]; input: ValueType; output: ValueType; /** Concrete target after public forwarding. Never chosen by a runtime caller. */ @@ -240,6 +242,7 @@ export function compileExecutionPlan(input: WorkspaceRevision): ExecutionPlan { operationId: operation, scope: publicContract.scope === "class" ? "class" : "object", execution: publicContract.execution ?? { kind: "remote" }, + availableTargets: [], input: publicContract.inputType, output: publicContract.outputType, binding, @@ -251,7 +254,8 @@ export function compileExecutionPlan(input: WorkspaceRevision): ExecutionPlan { checkValue(planned.input, `${key}/input`, true); checkValue(planned.output, `${key}/output`, true); } - if (binding.kind === "state") planned.dependencies.push({ kind: "state", slot: binding.slotId }); + if (binding.kind === "state" || binding.kind === "journal" || binding.kind === "subscription") + planned.dependencies.push({ kind: "state", slot: binding.slotId }); else if (binding.kind === "edge") planned.dependencies.push({ kind: "edge", edge: binding.edgeTypeId, projection: binding.projectionId }); else if (binding.kind === "package") { @@ -338,6 +342,46 @@ export function compileExecutionPlan(input: WorkspaceRevision): ExecutionPlan { }; walk(root.key, [root.key]); } + // Additional implementation targets are opportunities, not new public requirements. + // Start with provider support and remove targets until the complete installed + // dependency closure agrees. This also handles recursive call graphs without + // mistaking an unfinished DFS for proof of availability. + for (const node of operationMap.values()) { + if (node.execution.kind === "remote") continue; + const binding = node.binding; + const provider = + binding.kind === "package" + ? packages.get(binding.packageRevisionId)!.exports.find((entry) => entry.id === binding.exportId)!.execution + : binding.kind === "lifecycle" || (binding.kind === "subscription" && binding.primitive !== "status") + ? { kind: "transaction" as const, targets: ["server" as const] } + : { kind: node.execution.kind, targets: ["browser" as const, "server" as const] }; + if (provider && provider.kind !== "remote") node.availableTargets = [...provider.targets].sort(); + } + let targetsChanged = true; + while (targetsChanged) { + targetsChanged = false; + for (const node of operationMap.values()) { + const available = node.availableTargets.filter((target) => + node.dependencies.every((dependency) => { + if (dependency.kind === "operation") + return operationMap.get(dependency.operation)!.availableTargets.includes(target); + if (dependency.kind === "query") { + const query = queryMap.get(dependency.query)!; + return ( + node.execution.kind === "snapshot" && + query.checked.declaration.placement?.kind === "local" && + queryOperations(query).every((key) => operationMap.get(key)!.availableTargets.includes(target)) + ); + } + return true; + }), + ); + if (available.length !== node.availableTargets.length) { + node.availableTargets = available; + targetsChanged = true; + } + } + } const plannedQueries: PlannedQuery[] = queries.map((query) => ({ id: queryKey(query.packageRevisionId, query.checked.declaration.id), query, diff --git a/src/query/link.ts b/src/query/link.ts index fa81959..9731000 100644 --- a/src/query/link.ts +++ b/src/query/link.ts @@ -98,6 +98,11 @@ export function linkQueries(workspace: WorkspaceRevision): LinkedQuery[] { `Package query field ${effect.memberId} needs query-reason`, ); } else if (binding.kind === "state" && binding.primitive === "read") needed.add(binding.slotId); + else if ( + (binding.kind === "journal" && binding.primitive === "head") || + (binding.kind === "subscription" && binding.primitive === "status") + ) + needed.add(binding.slotId); else if (binding.kind === "edge" && binding.primitive === "resolve") needed.add(binding.edgeTypeId); else throw new QueryCompileError( diff --git a/src/query/proto.ts b/src/query/proto.ts index 7c0d255..4fc895f 100644 --- a/src/query/proto.ts +++ b/src/query/proto.ts @@ -116,7 +116,10 @@ export const queryRuntimePlan = (linked: LinkedQuery, workspace: WorkspaceRevisi "many-unique": Cardinality.MANY_UNIQUE, }[member.cardinality] : undefined, - slotId: field.binding.kind === "state" ? field.binding.slotId : "", + slotId: + ["state", "journal", "subscription"].includes(field.binding.kind) && "slotId" in field.binding + ? field.binding.slotId + : "", edgeTypeId: field.binding.kind === "edge" ? field.binding.edgeTypeId : "", projectionId: field.binding.kind === "edge" ? field.binding.projectionId : "", rpc: field.binding.kind === "package", diff --git a/test/execution-contracts.test.ts b/test/execution-contracts.test.ts index a80e263..cc187ef 100644 --- a/test/execution-contracts.test.ts +++ b/test/execution-contracts.test.ts @@ -51,10 +51,9 @@ test("portable contracts preserve exact selected operations and targets", () => }); }); -test("portable dependency diagnostics reject remote defaults, missing targets, and broad acquisition", () => { +test("portable dependency diagnostics reject remote defaults and broad acquisition", () => { for (const [selection, execution, message] of [ ["using [refresh.call]", "snapshot targets [browser]", "remote-only"], - ["using [label.get]", "snapshot targets [arduino]", "arduino"], ["", "snapshot targets [browser]", "select"], ["using [label.get, label.get]", "snapshot targets [browser]", "duplicates"], ["using [label.set]", "snapshot targets [browser]", "Unknown"], @@ -65,6 +64,13 @@ test("portable dependency diagnostics reject remote defaults, missing targets, a } }); +test("package code targets may exceed a dependency's public minimum", () => { + const result = program("using [label.get]", "snapshot targets [arduino]"); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + // A workspace still has to provide the full installed closure before an + // operation can promise this target; package code alone is insufficient. +}); + test("portable query getters and target declarations are checked", () => { assert.equal(data("remote").ok, false); assert.equal(data("transaction targets [browser]").ok, false); diff --git a/test/execution-world.test.ts b/test/execution-world.test.ts index 9fe4eaf..3605d70 100644 --- a/test/execution-world.test.ts +++ b/test/execution-world.test.ts @@ -16,11 +16,34 @@ import { } from "../src/execution-world/index.js"; import { buildArtifactFixture as buildFixture } from "./artifact-fixture.js"; +import { compileKernelProgram } from "../src/execution-world/kernel.js"; const resign = (implementation: ArtifactImplementation) => { const { contentDigest, ...body } = implementation; implementation.contentDigest = implementationDigest(body); }; +test("installed targets can exceed the public requirement without changing that contract", async () => { + const workspace = await loadReaderWorkspace((name, text) => + name === "DocumentFactory.qx" ? text.replaceAll("targets [browser, server]", "targets [server]") : text, + ); + const plan = compileExecutionPlan(workspace); + const factory = plan.definition.operations.find( + (op) => op.binding.kind === "package" && op.binding.exportId === "reader:create-document", + )!; + assert.deepEqual(factory.execution, { kind: "transaction", targets: ["server"] }); + assert.deepEqual(factory.availableTargets, ["browser", "server"]); + const kernel = compileKernelProgram(plan) as { operations: { key: string; targets: string[] }[] }; + assert.deepEqual(kernel.operations.find((op) => op.key === factory.key)!.targets, ["browser", "server"]); + + const provider = workspace.packageImports + .flatMap((pkg) => pkg.exports) + .find((entry) => entry.id === "reader:create-document")!; + provider.execution = { kind: "transaction", targets: ["server"] }; + const authoritative = compileExecutionPlan(workspace).definition.operations.find((op) => op.key === factory.key)!; + assert.deepEqual(authoritative.availableTargets, ["server"]); + assert.deepEqual(authoritative.execution, factory.execution); +}); + test("reader execution plan closes selector storage and traversed interface dependencies", async () => { const workspace = await loadReaderWorkspace(); const plan = compileExecutionPlan(workspace); diff --git a/test/fixtures/events/event-handler.qx b/test/fixtures/events/event-handler.qx new file mode 100644 index 0000000..0d45e86 --- /dev/null +++ b/test/fixtures/events/event-handler.qx @@ -0,0 +1,5 @@ +interface EventHandler id "interface:org.quixos.events:handler" revision "interface:org.quixos.events:handler@1" { + operation handle id "events:handle" : record {event:Payload;parameters:Parameters;} -> unit { + call id "events:handle:call" execution transaction targets [server]; + } +} diff --git a/test/fixtures/events/event-stream-record.qx b/test/fixtures/events/event-stream-record.qx new file mode 100644 index 0000000..f7ef49e --- /dev/null +++ b/test/fixtures/events/event-stream-record.qx @@ -0,0 +1,3 @@ +import interface EventStream; +// Opt into the standard workspace journal conformance rule. +interface EventStreamRecord id "interface:org.quixos.events:stream-record" revision "interface:org.quixos.events:stream-record@1" requires EventStream {} diff --git a/test/fixtures/events/event-stream.qx b/test/fixtures/events/event-stream.qx new file mode 100644 index 0000000..f9c4717 --- /dev/null +++ b/test/fixtures/events/event-stream.qx @@ -0,0 +1,13 @@ +// Required server support; a checked installed implementation may additionally predict locally. +interface EventStream id "interface:org.quixos.events:stream" revision "interface:org.quixos.events:stream@1" { + operation publish id "events:publish" : Payload -> record {publication:string;} { + call id "events:publish:call" execution transaction targets [server]; + } + queryable value head id "events:head" : optional { + get id "events:head:get" execution snapshot targets [server]; + } + operation readPage id "events:read-page" : record {after:optional;limit:uint32;} + -> record {entries:list;next:optional;asOfHead:optional;} { + call id "events:read-page:call" execution snapshot targets [server]; + } +} diff --git a/test/fixtures/events/event-subscription-record.qx b/test/fixtures/events/event-subscription-record.qx new file mode 100644 index 0000000..d0dce83 --- /dev/null +++ b/test/fixtures/events/event-subscription-record.qx @@ -0,0 +1,2 @@ +import interface EventSubscription; +interface EventSubscriptionRecord id "interface:org.quixos.events:subscription-record" revision "interface:org.quixos.events:subscription-record@1" requires EventSubscription {} diff --git a/test/fixtures/events/event-subscription.qx b/test/fixtures/events/event-subscription.qx new file mode 100644 index 0000000..bce2c65 --- /dev/null +++ b/test/fixtures/events/event-subscription.qx @@ -0,0 +1,18 @@ +import interface EventStream; +import interface EventHandler; +type StartPosition = variant id "org.quixos.events:start@1" { + future id "events:start:future" : unit; + retained id "events:start:retained" : unit; + afterCursor id "events:start:after" : string; +}; +interface EventSubscription id "interface:org.quixos.events:subscription" revision "interface:org.quixos.events:subscription@1" { + operation attach id "events:attach" : record {source:interface-ref>;handler:interface-ref>;parameters:Parameters;start:StartPosition;} -> unit { + call id "events:attach:call" execution transaction targets [server]; + } + queryable value status id "events:status" : record {status:string;generation:uint64;cursor:uint64;failure:optional;} { + get id "events:status:get" execution snapshot targets [server]; + } + operation pause id "events:pause" : unit -> unit {call id "events:pause:call" execution transaction targets [server];} + operation resume id "events:resume" : unit -> unit {call id "events:resume:call" execution transaction targets [server];} + operation retire id "events:retire" : unit -> unit {call id "events:retire:call" execution transaction targets [server];} +} diff --git a/test/fixtures/events/rules.qx b/test/fixtures/events/rules.qx new file mode 100644 index 0000000..df1f9a1 --- /dev/null +++ b/test/fixtures/events/rules.qx @@ -0,0 +1,21 @@ +fragment { + import interface EventStream; + import interface EventHandler; + import interface EventSubscription; + import interface EventStreamRecord; + import interface EventSubscriptionRecord; + conform EventStreamRecord as EventStream id "events:standard-stream" { + private state Entries id "events:entries" on Self : Payload policy journal {"maxEntries":128,"maxBytes":1048576,"maxPublicationBytes":262144,"maxProtectedSubscriptions":32}; + bind publish.call to journal Entries.publish; + bind head.get to journal Entries.head; + bind readPage.call to journal Entries.readPage; + } + conform EventSubscriptionRecord as EventSubscription id "events:standard-subscription" { + private state Delivery id "events:delivery" on Self : Parameters policy subscription(Payload); + bind attach.call to subscription Delivery.attach; + bind status.get to subscription Delivery.status; + bind pause.call to subscription Delivery.pause; + bind resume.call to subscription Delivery.resume; + bind retire.call to subscription Delivery.retire; + } +} diff --git a/test/generics.test.ts b/test/generics.test.ts index 6eadb45..038a47f 100644 --- a/test/generics.test.ts +++ b/test/generics.test.ts @@ -603,3 +603,32 @@ test("prerequisites require explicit conformances and remain in the capability c applied.application!.arguments = [{ kind: "value", type: valueType.int64 }]; assert.equal(compileWorkspaceRevision(forged).ok, false); }); + +test("edge read targets honor declared interface prerequisites without inferring unrelated conformances", () => { + const interfaces = new Map(); + for (const text of [ + 'interface Base id "base" revision "base@1" {}', + 'import interface Base; interface Detailed id "detailed" revision "detailed@1" requires Base {}', + 'import interface Base; interface Holder id "holder" revision "holder@1" {queryable relation item id "item" : optional-one interface Base {resolve id "item:resolve" execution snapshot targets [browser,server];}}', + ]) { + const parsed = compileCapabilityResourceSource(text, { source, environment: { interfaces } }); + assert.ok(parsed.ok, JSON.stringify(parsed.diagnostics)); + if (parsed.resource.kind !== "interface") throw Error("interface expected"); + interfaces.set(parsed.resource.revision.displayName, parsed.resource.revision); + } + const assembly = `workspace W id "w" revision "w@1" commit "${source.commit}" { + import interface Base;import interface Detailed;import interface Holder; + atom Item id "item";atom Box id "box"; + conform Item as Base id "item-base" {} conform Item as Detailed id "item-detailed" {} + conform Box as Holder id "box-holder" { + private edge ItemEdge id "items" {atom Self projection item id "item" optional-one;interface Detailed projection holders id "holders" many;} + bind item.resolve to edge ItemEdge.item.resolve; + } + }`; + const valid = compileCapabilitySource(assembly, "workspace.qx", { interfaces }); + assert.ok(valid.ok, JSON.stringify(valid.diagnostics)); + const unrelated = new Map(interfaces); + unrelated.set("Detailed", { ...interfaces.get("Detailed"), requiredInterfaces: [] }); + const invalid = compileCapabilitySource(assembly, "workspace.qx", { interfaces: unrelated }); + assert.equal(invalid.ok, false, "installed co-occurrence alone is not proof of a declared interface implication"); +}); diff --git a/test/journals.test.ts b/test/journals.test.ts new file mode 100644 index 0000000..ac475dc --- /dev/null +++ b/test/journals.test.ts @@ -0,0 +1,186 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/parser.js"; +import { formatQx } from "../src/capability-language/source.js"; +import { compileExecutionPlan, compileKernelProgram } from "../src/execution-world/index.js"; +import type { InterfaceRevision } from "../src/capability-model/types.js"; +import { readFileSync } from "node:fs"; + +const source = { repository: "https://example.test/journals", commit: "a".repeat(40) }; + +test("standard event contracts instantiate generic native conformance rules", () => { + const interfaces = new Map(); + for (const [name, slug] of [ + ["EventStream", "event-stream"], + ["EventHandler", "event-handler"], + ["EventSubscription", "event-subscription"], + ["EventStreamRecord", "event-stream-record"], + ["EventSubscriptionRecord", "event-subscription-record"], + ]) { + const text = readFileSync(new URL(`../../test/fixtures/events/${slug}.qx`, import.meta.url), "utf8"); + const result = compileCapabilityResourceSource(text, { + source, + environment: { interfaces, interfaceClosure: [...interfaces.values()] }, + }); + assert.ok(result.ok && result.resource.kind === "interface", JSON.stringify(result.diagnostics)); + interfaces.set(name!, result.resource.revision); + } + const rules = readFileSync(new URL("../../test/fixtures/events/rules.qx", import.meta.url), "utf8") + .replace(/^fragment\s*\{/, "") + .replace(/}\s*$/, ""); + const result = compileCapabilitySource( + `workspace Events id "events" revision "events@1" commit "${source.commit}" { + ${rules} + atom TextStream id "text-stream"; + conform TextStream as EventStreamRecord id "text-marker" {} + atom TextSubscription id "text-subscription"; + conform TextSubscription as EventSubscriptionRecord id "text-subscription-marker" {} + atom NumberStream id "number-stream"; + conform NumberStream as EventStreamRecord id "number-marker" {} + }`, + "events.qx", + { interfaces, interfaceClosure: [...interfaces.values()] }, + ); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const kernel = compileKernelProgram(compileExecutionPlan(result.workspace)) as { + model: { owners: { slots: { policy: string }[] }[] }; + }; + assert.equal( + kernel.model.owners.flatMap((owner) => owner.slots).filter((slot) => slot.policy === "journal").length, + 2, + ); + assert.equal( + kernel.model.owners.flatMap((owner) => owner.slots).filter((slot) => slot.policy === "subscription").length, + 1, + ); +}); +const contract = `external atom Document id "document"; +type Event = record { document: atom-ref; title: string; }; +interface Stream id "stream" revision "stream@1" { + operation publish id "publish" : Event -> record { publication: string; } { + call id "publish:call" execution transaction targets [server]; + } + queryable value head id "head" : optional { get id "head:get" execution snapshot targets [server]; } + operation readPage id "page" : record { after: optional; limit: uint32; } + -> record { entries: list; next: optional; asOfHead: optional; } { + call id "page:call" execution snapshot targets [server]; + } +}`; +const assembly = `workspace Journals id "journals" revision "journals@1" commit "${source.commit}" { + import interface Stream; + atom Document id "document"; + atom Journal id "journal-object"; + conform Journal as Stream id "journal-owner" { + private state Entries id "entries" on Journal : record { document: atom-ref; title: string; } + policy journal { "maxEntries": 32, "maxBytes": 65536, "maxPublicationBytes": 8192, "maxProtectedSubscriptions": 8 }; + bind publish.call to journal Entries.publish; + bind head.get to journal Entries.head; + bind readPage.call to journal Entries.readPage; + } +}`; +function compile(text = assembly, iface = contract) { + const resource = compileCapabilityResourceSource(iface, { source }); + assert.ok(resource.ok && resource.resource.kind === "interface", JSON.stringify(resource.diagnostics)); + return compileCapabilitySource(formatQx(text), "journal.qx", { + interfaces: new Map([["Stream", resource.resource.revision]]), + }); +} +test("journal bindings typecheck and lower managed reference pins", () => { + const result = compile(); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const kernel = compileKernelProgram(compileExecutionPlan(result.workspace)) as { + model: { edges: unknown[]; owners: { slots: { policy: string; journal: { pins: unknown[] } }[] }[] }; + operations: { binding: { kind: string; primitive: string } }[]; + }; + assert.equal(kernel.model.owners[0]!.slots[0]!.policy, "journal"); + assert.equal(kernel.model.owners[0]!.slots[0]!.journal.pins.length, 1); + assert.equal(kernel.model.edges.length, 1); + assert.deepEqual(kernel.operations.map((op) => op.binding.primitive).sort(), ["head", "publish", "readPage"]); + assert.ok(kernel.operations.every((op) => op.binding.kind === "journal")); +}); +test("journal declarations reject state access, bad bounds, seeding and signature substitution", () => { + for (const [ws, iface] of [ + [assembly.replace("journal Entries.head", "state Entries.read"), contract], + [assembly.replace('"maxEntries": 32', '"maxEntries": 0'), contract], + [assembly.replace("bind publish.call", "initialize { seed to state Entries; }; bind publish.call"), contract], + [assembly, contract.replace("publication: string", "publication: uint32")], + [assembly, contract.replace("execution transaction", "execution snapshot")], + ]) { + const result = compile(ws, iface); + assert.equal(result.ok, false, `${ws}\n${iface}`); + } +}); + +test("subscription storage infers its typed handler and retains configuration references", () => { + const interfaces = new Map(); + const resource = (name: string, text: string) => { + const result = compileCapabilityResourceSource(text, { + source, + environment: { interfaces, interfaceClosure: [...interfaces.values()] }, + }); + assert.ok(result.ok && result.resource.kind === "interface", JSON.stringify(result.diagnostics)); + interfaces.set(name, result.resource.revision); + }; + resource("Stream", contract); + resource( + "Receiver", + `external atom Document id "document"; +interface Receiver id "receiver" revision "receiver@1" { + operation receive id "receive" : record { event: record { document: atom-ref; title: string; }; parameters: string; } -> unit { + call id "receive:call" execution transaction targets [server]; + } +}`, + ); + resource( + "Subscription", + `external atom Document id "document"; +import interface Stream; +import interface Receiver; +type Start = variant id "start" { future id "future" : unit; retained id "retained" : unit; afterCursor id "after" : string; }; +interface Subscription id "subscription" revision "subscription@1" { + operation attach id "attach" : record { source: interface-ref; handler: interface-ref; parameters: string; start: Start; } -> unit { + call id "attach:call" execution transaction targets [server]; + } + queryable value status id "status" : record { status: string; generation: uint64; cursor: uint64; failure: optional; } { + get id "status:get" execution snapshot targets [server]; + } + operation retire id "retire" : unit -> unit { call id "retire:call" execution transaction targets [server]; } +}`, + ); + const ws = assembly + .replace( + "import interface Stream;", + "import interface Stream; import interface Receiver; import interface Subscription;", + ) + .replace( + /\n}$/, + ` + atom Delivery id "delivery"; + conform Delivery as Subscription id "delivery-owner" { + private state DeliveryState id "delivery-state" on Delivery : string policy subscription(record { document: atom-ref; title: string; }); + bind attach.call to subscription DeliveryState.attach; + bind status.get to subscription DeliveryState.status; + bind retire.call to subscription DeliveryState.retire; + } +}`, + ); + const result = compileCapabilitySource(formatQx(ws), "subscriptions.qx", { + interfaces, + interfaceClosure: [...interfaces.values()], + }); + assert.ok(result.ok, JSON.stringify(result.diagnostics)); + const kernel = compileKernelProgram(compileExecutionPlan(result.workspace)) as { + model: { + owners: { slots: { policy: string; subscription?: { operation: string; pins: unknown[]; active: unknown } }[] }[]; + }; + }; + const slot = kernel.model.owners.flatMap((owner) => owner.slots).find((slot) => slot.policy === "subscription")!; + assert.equal(slot.subscription!.operation, "receive:call"); + assert.equal(slot.subscription!.pins.length, 2); + assert.ok(slot.subscription!.active); + const bad = compileCapabilitySource(ws.replace("on Delivery : string", "on Delivery : uint32"), "bad.qx", { + interfaces, + interfaceClosure: [...interfaces.values()], + }); + assert.equal(bad.ok, false, "remembered parameter type must agree with attachment and handler"); +}); diff --git a/test/reference-dependencies.test.ts b/test/reference-dependencies.test.ts index e8f3531..179cde8 100644 --- a/test/reference-dependencies.test.ts +++ b/test/reference-dependencies.test.ts @@ -82,9 +82,15 @@ test("closed generic specialization preserves reference-selected interface ports ); }); -test("portable input-selected reads require the dependency's declared target support", () => { +test("portable input-selected reads use installed support beyond the public minimum", () => { const portable = pkg.replaceAll("targets [server]", "targets [browser, server]"); - assert.equal(compile(portable).ok, false); + const optional = compile(portable); + assert.ok(optional.ok, JSON.stringify(optional.diagnostics)); + const plan = compileExecutionPlan(optional.workspace); + assert.deepEqual(plan.definition.operations.find((op) => op.operationId === "peek:call")!.availableTargets, [ + "browser", + "server", + ]); const result = compile(portable, workspace, iface.replaceAll("targets [server]", "targets [browser, server]")); assert.ok(result.ok, JSON.stringify(result.diagnostics)); }); From e9c15fe40f8d0517f6b6c2ac854567ff5110def0 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Mon, 28 Sep 2026 20:29:21 -0700 Subject: [PATCH 85/91] Make local graph execution optional across composed packages --- grammar/QuixosCapability.g4 | 8 +- src/bindings/portable-client-cli.ts | 2 +- src/bindings/portable-client.ts | 2 +- src/capability-language/execution-scaffold.ts | 17 +- .../generated/QuixosCapability.interp | 5 +- .../generated/QuixosCapability.tokens | 444 +- .../generated/QuixosCapabilityLexer.interp | 5 +- .../generated/QuixosCapabilityLexer.tokens | 444 +- .../generated/QuixosCapabilityLexer.ts | 1287 +++--- .../generated/QuixosCapabilityParser.ts | 4079 +++++++++-------- .../generated/QuixosCapabilityVisitor.ts | 7 + src/capability-language/parser.ts | 76 +- src/capability-model/execution.ts | 9 +- src/execution-world/client-contracts.ts | 5 +- src/execution-world/files.ts | 6 +- src/execution-world/index.ts | 1 + src/execution-world/inspection.ts | 4 +- src/execution-world/installation.ts | 6 +- src/execution-world/native-backends.ts | 21 + src/execution-world/plan.ts | 33 +- src/execution-world/receipts.ts | 5 +- src/query/compile.ts | 4 +- test/acceptance-fixture.ts | 7 +- test/acceptance-hooks.test.ts | 8 +- test/artifact-files.test.ts | 4 +- test/artifact-fixture.ts | 4 +- test/capability-assembly.test.ts | 2 +- test/client-contracts.test.ts | 17 +- test/component-scaffold.test.ts | 2 +- test/compound-crdt.test.ts | 7 +- test/conformance-rules.test.ts | 6 +- test/crdt-edit-contracts.test.ts | 6 +- test/creation-contracts.test.ts | 20 +- test/emit-managed.ts | 30 +- test/emit-portable-reader.ts | 18 +- test/execution-contracts.test.ts | 62 +- test/execution-groups.test.ts | 2 +- test/execution-scaffold-fixture.ts | 2 +- test/execution-world.test.ts | 69 +- test/fixtures/async-objects/DocumentData.qx | 12 +- test/fixtures/canvas-content.qx | 4 +- .../fixtures/collections/CollectionRuntime.qx | 7 +- test/fixtures/collections/NodeData.qx | 16 +- test/fixtures/compound-crdt/EditRuntime.qx | 5 +- test/fixtures/compound-crdt/NoteData.qx | 14 +- test/fixtures/controller-device/Device.qx | 14 +- .../controller-device/DeviceController.qx | 4 +- test/fixtures/controller-device/Driver.qx | 5 +- test/fixtures/events/event-handler.qx | 2 +- test/fixtures/events/event-stream.qx | 6 +- test/fixtures/events/event-subscription.qx | 10 +- .../local-first-composite/CommentFactory.qx | 2 +- .../local-first-composite/CommentRuntime.qx | 3 +- .../local-first-composite/DocumentFactory.qx | 2 +- .../local-first-composite/DocumentLabel.qx | 2 +- .../local-first-composite/DocumentMetadata.qx | 2 +- .../local-first-composite/ReaderRuntime.qx | 9 +- .../local-first-reader/CommentData.qx | 4 +- .../local-first-reader/DocumentActions.qx | 2 +- .../local-first-reader/DocumentData.qx | 8 +- .../local-first-reader/DocumentFactory.qx | 2 +- .../local-first-reader/HighlightData.qx | 10 +- .../local-first-reader/ReaderRuntime.qx | 9 +- .../presentation-mount/DocumentNavigation.qx | 4 +- .../presentation-mount/PresentationMount.qx | 8 +- .../presentation-mount/PresentationRuntime.qx | 11 +- .../presentation-mount/PresentationState.qx | 6 +- .../presentation-mount/PresentationStates.qx | 4 +- .../presentation-mount/ReaderNavigation.qx | 4 +- .../presentation-mount/StateFactory.qx | 2 +- test/fixtures/recurring-task/Task.qx | 10 +- test/fixtures/recurring-task/TaskRuntime.qx | 3 +- test/fixtures/tree/TreeData.qx | 6 +- test/fixtures/tree/TreeRuntime.qx | 3 +- test/generics.test.ts | 2 +- test/journals.test.ts | 14 +- test/keyed-relationships.test.ts | 13 +- test/lifecycle.test.ts | 9 +- test/local-first-reader.test.ts | 23 +- test/portable-bindings.test.ts | 41 +- test/portable-generic-fixture.ts | 7 +- test/prepared-presentations.test.ts | 4 +- test/query-compiler.test.ts | 10 +- test/query-fragments.test.ts | 2 +- test/query-structured.test.ts | 4 +- test/reference-dependencies.test.ts | 17 +- test/scaffold-recipes.test.ts | 6 +- 87 files changed, 3703 insertions(+), 3400 deletions(-) create mode 100644 src/execution-world/native-backends.ts diff --git a/grammar/QuixosCapability.g4 b/grammar/QuixosCapability.g4 index 2bc6431..b16081f 100644 --- a/grammar/QuixosCapability.g4 +++ b/grammar/QuixosCapability.g4 @@ -44,10 +44,15 @@ externalInterfaceDecl : EXTERNAL INTERFACE identifier REVISION stringLiteral SEMI ; +symbolDecl + : SYMBOL identifier ID stringLiteral SEMI + ; + resourcePreamble : resourceImportDecl | externalAtomDecl | externalInterfaceDecl + | symbolDecl | typeAliasDecl ; @@ -207,7 +212,7 @@ preparationClause executionClause : EXECUTION REMOTE - | EXECUTION (SNAPSHOT | TRANSACTION) TARGETS LBRACK identifierList RBRACK + | EXECUTION (SNAPSHOT | TRANSACTION) (TARGETS LBRACK identifierList RBRACK)? ; selectedOperations @@ -571,6 +576,7 @@ REF: 'ref'; FRAGMENT: 'fragment'; IMPORT: 'import'; EXTERNAL: 'external'; +SYMBOL: 'symbol'; ATOM: 'atom'; INTERFACE: 'interface'; INTERFACES: 'interfaces'; diff --git a/src/bindings/portable-client-cli.ts b/src/bindings/portable-client-cli.ts index 904a7d7..57ae321 100644 --- a/src/bindings/portable-client-cli.ts +++ b/src/bindings/portable-client-cli.ts @@ -2,7 +2,7 @@ import { readFile, writeFile } from "node:fs/promises"; import { generatePortableClientBindings } from "./portable-client.js"; async function main() { - const [plan, output, target = "browser", ...rest] = process.argv.slice(2); + const [plan, output, target = "target:org.quixos.execution.javascript@1", ...rest] = process.argv.slice(2); if (!plan || !output || rest.length) throw Error("usage: quixos-codegen-client EXECUTION_PLAN.json OUTPUT.ts [TARGET]"); await writeFile(output, generatePortableClientBindings(JSON.parse(await readFile(plan, "utf8")), { target })); diff --git a/src/bindings/portable-client.ts b/src/bindings/portable-client.ts index e2c8bc7..121040d 100644 --- a/src/bindings/portable-client.ts +++ b/src/bindings/portable-client.ts @@ -17,7 +17,7 @@ export function generatePortableClientBindings( unavailable: { key: string; reason: string }[] = []; const seen = new Set(); for (const operation of plan.definition.operations) { - if (operation.execution.kind === "remote" || !operation.execution.targets.includes(options.target)) { + if (operation.execution.kind === "remote" || !operation.availableTargets.includes(options.target)) { unavailable.push({ key: operation.key, reason: "OPERATION_NOT_PORTABLE" }); continue; } diff --git a/src/capability-language/execution-scaffold.ts b/src/capability-language/execution-scaffold.ts index 05025ae..45dd196 100644 --- a/src/capability-language/execution-scaffold.ts +++ b/src/capability-language/execution-scaffold.ts @@ -5,6 +5,7 @@ import type { StructuralRequest } from "./structural-plan.js"; import { parseQx, walkSyntax } from "./source.js"; import { addImplementation } from "./implementation-edit.js"; import { formatQuixosLock } from "../resource-lock/index.js"; +import { javascriptTarget } from "../execution-world/native-backends.js"; const json = (value: unknown) => JSON.stringify(value, null, 2) + "\n"; const q = (value: string) => JSON.stringify(value); const nixString = (value: string) => q(value).replaceAll("${", "\\${"); @@ -31,7 +32,10 @@ export async function executionScaffold( const create = (file: string, content: string) => files.push({ file: prefix + file, create: content }); if (command === "package") { if (!spec.tools || !spec.revision) throw new Error("Execution package requires exact tool sources and a revision"); - create("package.qx", `package ${spec.name} id ${q(spec.id)} revision ${q(spec.revision)} {\n}\n`); + create( + "package.qx", + `symbol JavaScript id ${q(javascriptTarget)};\npackage ${spec.name} id ${q(spec.id)} revision ${q(spec.revision)} {\n}\n`, + ); create( "quixos.lock", formatQuixosLock({ formatVersion: 1, quixos: { resolver: "git", ...spec.tools.quixos }, resources: [] }), @@ -90,7 +94,7 @@ in camino.assembleCaminoPackage { pkgs.lib.optional (portable != []) (camino.mkCaminoTypeScriptPackage { inherit pkgs context dependencies; src = ./.; entry = "src/server.ts"; entries.browser = "src/browser.ts"; - targets = pkgs.lib.unique (pkgs.lib.concatMap (entry: entry.execution.targets) portable); + targets = pkgs.lib.unique (map (target: if target == "target:org.quixos.execution.javascript@1" then "browser" else if target == "server" then "server" else throw "Unsupported TypeScript backend target") (pkgs.lib.concatMap (entry: entry.execution.targets) portable)); }) ++ pkgs.lib.optional (remote != []) (camino.mkCaminoTypeScriptService { inherit pkgs context dependencies; src = ./.; entry = "src/remote.ts"; }) ++ pkgs.lib.optional (modules != {}) (camino.mkCaminoReactPackage { @@ -134,15 +138,16 @@ in camino.assembleCaminoPackage { .filter((token) => !token.trivia && token.start >= execution.start && token.end <= execution.end) .map((token) => token.text); const remote = tokens[1] === "remote"; - const targets = remote + const declaredTargets = remote ? ["remote"] : [...walkSyntax(execution)].filter((node) => node.kind === "identifier").map(text); + const targets = declaredTargets.length ? declaredTargets : ["server"]; if ( !targets.length || new Set(targets).size !== targets.length || - targets.some((target) => !(remote ? ["remote"] : ["browser", "server"]).includes(target)) + targets.some((target) => !(remote ? ["remote"] : ["JavaScript", "server"]).includes(target)) ) - throw new Error("Execution scaffold supports browser/server portable targets and remote service handlers"); + throw new Error("This TypeScript scaffold supports the JavaScript target, server, and remote service handlers"); const authored = await fs.readFile(path.join(root, prefix, "package.qx"), "utf8"); const syntax = parseQx(authored); const packageNode = syntax.root.children.find((node) => node.kind === "packageResourceDecl"); @@ -174,7 +179,7 @@ in camino.assembleCaminoPackage { `import type { ${remote ? "Remote" : "Portable"}Implementation } from "../gen/${remote ? "remote" : "qx"}.js";\nexport const handler: ${remote ? "Remote" : "Portable"}Implementation[${q(spec.name)}] = async (_context) => { throw new Error(${q("Implement " + spec.name)}); };\n`, ); for (const target of targets) { - const file = prefix + `src/${target}.ts`; + const file = prefix + `src/${target === "JavaScript" ? "browser" : target}.ts`; const before = await fs.readFile(path.join(root, file), "utf8"); files.push({ file, diff --git a/src/capability-language/generated/QuixosCapability.interp b/src/capability-language/generated/QuixosCapability.interp index c08298f..6bdd1e3 100644 --- a/src/capability-language/generated/QuixosCapability.interp +++ b/src/capability-language/generated/QuixosCapability.interp @@ -44,6 +44,7 @@ null 'fragment' 'import' 'external' +'symbol' 'atom' 'interface' 'interfaces' @@ -205,6 +206,7 @@ REF FRAGMENT IMPORT EXTERNAL +SYMBOL ATOM INTERFACE INTERFACES @@ -329,6 +331,7 @@ workspaceItem resourceImportDecl externalAtomDecl externalInterfaceDecl +symbolDecl resourcePreamble atomDecl interfaceResourceDecl @@ -409,4 +412,4 @@ stringLiteral atn: -[4, 1, 158, 1458, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 183, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 188, 8, 1, 10, 1, 12, 1, 191, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 209, 8, 3, 10, 3, 12, 3, 212, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 224, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 236, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 256, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 264, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 269, 8, 10, 10, 10, 12, 10, 272, 9, 10, 1, 10, 1, 10, 1, 10, 3, 10, 277, 8, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 287, 8, 10, 10, 10, 12, 10, 290, 9, 10, 3, 10, 292, 8, 10, 1, 10, 1, 10, 5, 10, 296, 8, 10, 10, 10, 12, 10, 299, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 307, 8, 11, 10, 11, 12, 11, 310, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 318, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 326, 8, 12, 10, 12, 12, 12, 329, 9, 12, 3, 12, 331, 8, 12, 3, 12, 333, 8, 12, 1, 13, 1, 13, 3, 13, 337, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 5, 14, 343, 8, 14, 10, 14, 12, 14, 346, 9, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 357, 8, 15, 1, 16, 1, 16, 1, 16, 3, 16, 362, 8, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 372, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 382, 8, 18, 1, 18, 1, 18, 1, 19, 3, 19, 387, 8, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 402, 8, 19, 1, 19, 1, 19, 1, 19, 1, 20, 3, 20, 408, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 418, 8, 20, 10, 20, 12, 20, 421, 9, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 429, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 437, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 445, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 458, 8, 21, 1, 22, 3, 22, 461, 8, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 471, 8, 22, 1, 22, 1, 22, 3, 22, 475, 8, 22, 1, 22, 1, 22, 5, 22, 479, 8, 22, 10, 22, 12, 22, 482, 9, 22, 1, 22, 1, 22, 1, 23, 1, 23, 3, 23, 488, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 494, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 502, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 510, 8, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 523, 8, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 530, 8, 25, 1, 25, 1, 25, 3, 25, 534, 8, 25, 1, 26, 5, 26, 537, 8, 26, 10, 26, 12, 26, 540, 9, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 550, 8, 26, 1, 26, 1, 26, 5, 26, 554, 8, 26, 10, 26, 12, 26, 557, 9, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 567, 8, 27, 1, 28, 1, 28, 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, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 3, 30, 593, 8, 30, 1, 30, 1, 30, 3, 30, 597, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 603, 8, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 5, 30, 612, 8, 30, 10, 30, 12, 30, 615, 9, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 623, 8, 30, 1, 30, 1, 30, 5, 30, 627, 8, 30, 10, 30, 12, 30, 630, 9, 30, 1, 30, 1, 30, 3, 30, 634, 8, 30, 3, 30, 636, 8, 30, 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, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 665, 8, 32, 10, 32, 12, 32, 668, 9, 32, 1, 32, 3, 32, 671, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 677, 8, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 704, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 3, 34, 714, 8, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 725, 8, 34, 1, 34, 3, 34, 728, 8, 34, 1, 34, 1, 34, 1, 34, 3, 34, 733, 8, 34, 1, 34, 3, 34, 736, 8, 34, 1, 34, 3, 34, 739, 8, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 3, 35, 746, 8, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 755, 8, 35, 1, 35, 3, 35, 758, 8, 35, 1, 35, 3, 35, 761, 8, 35, 1, 35, 3, 35, 764, 8, 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, 38, 1, 38, 3, 38, 787, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 794, 8, 39, 10, 39, 12, 39, 797, 9, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 810, 8, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 5, 43, 829, 8, 43, 10, 43, 12, 43, 832, 9, 43, 3, 43, 834, 8, 43, 1, 43, 3, 43, 837, 8, 43, 1, 44, 1, 44, 1, 44, 5, 44, 842, 8, 44, 10, 44, 12, 44, 845, 9, 44, 1, 45, 1, 45, 1, 45, 5, 45, 850, 8, 45, 10, 45, 12, 45, 853, 9, 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, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 884, 8, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 896, 8, 46, 1, 46, 3, 46, 899, 8, 46, 1, 46, 1, 46, 3, 46, 903, 8, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 925, 8, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 939, 8, 46, 1, 47, 1, 47, 1, 47, 1, 47, 5, 47, 945, 8, 47, 10, 47, 12, 47, 948, 9, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 3, 50, 959, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 3, 51, 973, 8, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 990, 8, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 1008, 8, 54, 1, 54, 1, 54, 3, 54, 1012, 8, 54, 1, 54, 3, 54, 1015, 8, 54, 1, 54, 1, 54, 3, 54, 1019, 8, 54, 1, 54, 3, 54, 1022, 8, 54, 1, 54, 1, 54, 1, 55, 1, 55, 3, 55, 1028, 8, 55, 1, 55, 1, 55, 3, 55, 1032, 8, 55, 1, 55, 1, 55, 1, 55, 3, 55, 1037, 8, 55, 1, 55, 1, 55, 3, 55, 1041, 8, 55, 1, 55, 1, 55, 3, 55, 1045, 8, 55, 1, 55, 1, 55, 5, 55, 1049, 8, 55, 10, 55, 12, 55, 1052, 9, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 1065, 8, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 5, 59, 1078, 8, 59, 10, 59, 12, 59, 1081, 9, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1100, 8, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 5, 61, 1107, 8, 61, 10, 61, 12, 61, 1110, 9, 61, 1, 61, 1, 61, 1, 62, 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, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1141, 8, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1161, 8, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1191, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1201, 8, 67, 1, 67, 3, 67, 1204, 8, 67, 1, 67, 3, 67, 1207, 8, 67, 3, 67, 1209, 8, 67, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 5, 71, 1221, 8, 71, 10, 71, 12, 71, 1224, 9, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1247, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1263, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1272, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1282, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 5, 72, 1293, 8, 72, 10, 72, 12, 72, 1296, 9, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1310, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1322, 8, 72, 1, 72, 1, 72, 3, 72, 1326, 8, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1335, 8, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 3, 74, 1353, 8, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 5, 74, 1375, 8, 74, 10, 74, 12, 74, 1378, 9, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 4, 74, 1386, 8, 74, 11, 74, 12, 74, 1387, 1, 74, 1, 74, 1, 74, 1, 74, 3, 74, 1394, 8, 74, 3, 74, 1396, 8, 74, 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, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 3, 79, 1422, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 5, 80, 1428, 8, 80, 10, 80, 12, 80, 1431, 9, 80, 3, 80, 1433, 8, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 5, 82, 1445, 8, 82, 10, 82, 12, 82, 1448, 9, 82, 3, 82, 1450, 8, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 0, 0, 85, 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, 0, 10, 1, 0, 49, 50, 2, 0, 17, 17, 35, 35, 1, 0, 13, 14, 1, 0, 106, 110, 3, 0, 1, 1, 101, 105, 107, 108, 3, 0, 1, 1, 101, 102, 107, 108, 2, 0, 103, 105, 107, 108, 1, 0, 126, 133, 1, 0, 113, 116, 13, 0, 1, 1, 4, 7, 10, 10, 12, 35, 42, 42, 47, 47, 77, 77, 84, 85, 99, 100, 104, 104, 111, 111, 120, 120, 154, 154, 1581, 0, 182, 1, 0, 0, 0, 2, 184, 1, 0, 0, 0, 4, 194, 1, 0, 0, 0, 6, 198, 1, 0, 0, 0, 8, 223, 1, 0, 0, 0, 10, 235, 1, 0, 0, 0, 12, 237, 1, 0, 0, 0, 14, 244, 1, 0, 0, 0, 16, 255, 1, 0, 0, 0, 18, 257, 1, 0, 0, 0, 20, 270, 1, 0, 0, 0, 22, 302, 1, 0, 0, 0, 24, 332, 1, 0, 0, 0, 26, 334, 1, 0, 0, 0, 28, 338, 1, 0, 0, 0, 30, 356, 1, 0, 0, 0, 32, 358, 1, 0, 0, 0, 34, 371, 1, 0, 0, 0, 36, 373, 1, 0, 0, 0, 38, 386, 1, 0, 0, 0, 40, 407, 1, 0, 0, 0, 42, 457, 1, 0, 0, 0, 44, 460, 1, 0, 0, 0, 46, 485, 1, 0, 0, 0, 48, 522, 1, 0, 0, 0, 50, 533, 1, 0, 0, 0, 52, 538, 1, 0, 0, 0, 54, 566, 1, 0, 0, 0, 56, 568, 1, 0, 0, 0, 58, 578, 1, 0, 0, 0, 60, 590, 1, 0, 0, 0, 62, 637, 1, 0, 0, 0, 64, 703, 1, 0, 0, 0, 66, 705, 1, 0, 0, 0, 68, 710, 1, 0, 0, 0, 70, 742, 1, 0, 0, 0, 72, 767, 1, 0, 0, 0, 74, 771, 1, 0, 0, 0, 76, 786, 1, 0, 0, 0, 78, 788, 1, 0, 0, 0, 80, 800, 1, 0, 0, 0, 82, 813, 1, 0, 0, 0, 84, 816, 1, 0, 0, 0, 86, 836, 1, 0, 0, 0, 88, 838, 1, 0, 0, 0, 90, 846, 1, 0, 0, 0, 92, 938, 1, 0, 0, 0, 94, 940, 1, 0, 0, 0, 96, 951, 1, 0, 0, 0, 98, 953, 1, 0, 0, 0, 100, 958, 1, 0, 0, 0, 102, 960, 1, 0, 0, 0, 104, 989, 1, 0, 0, 0, 106, 991, 1, 0, 0, 0, 108, 1000, 1, 0, 0, 0, 110, 1025, 1, 0, 0, 0, 112, 1055, 1, 0, 0, 0, 114, 1064, 1, 0, 0, 0, 116, 1066, 1, 0, 0, 0, 118, 1074, 1, 0, 0, 0, 120, 1099, 1, 0, 0, 0, 122, 1101, 1, 0, 0, 0, 124, 1113, 1, 0, 0, 0, 126, 1120, 1, 0, 0, 0, 128, 1134, 1, 0, 0, 0, 130, 1144, 1, 0, 0, 0, 132, 1160, 1, 0, 0, 0, 134, 1208, 1, 0, 0, 0, 136, 1210, 1, 0, 0, 0, 138, 1213, 1, 0, 0, 0, 140, 1215, 1, 0, 0, 0, 142, 1217, 1, 0, 0, 0, 144, 1325, 1, 0, 0, 0, 146, 1327, 1, 0, 0, 0, 148, 1395, 1, 0, 0, 0, 150, 1397, 1, 0, 0, 0, 152, 1402, 1, 0, 0, 0, 154, 1409, 1, 0, 0, 0, 156, 1411, 1, 0, 0, 0, 158, 1421, 1, 0, 0, 0, 160, 1423, 1, 0, 0, 0, 162, 1436, 1, 0, 0, 0, 164, 1440, 1, 0, 0, 0, 166, 1453, 1, 0, 0, 0, 168, 1455, 1, 0, 0, 0, 170, 171, 3, 6, 3, 0, 171, 172, 5, 0, 0, 1, 172, 183, 1, 0, 0, 0, 173, 174, 3, 20, 10, 0, 174, 175, 5, 0, 0, 1, 175, 183, 1, 0, 0, 0, 176, 177, 3, 52, 26, 0, 177, 178, 5, 0, 0, 1, 178, 183, 1, 0, 0, 0, 179, 180, 3, 2, 1, 0, 180, 181, 5, 0, 0, 1, 181, 183, 1, 0, 0, 0, 182, 170, 1, 0, 0, 0, 182, 173, 1, 0, 0, 0, 182, 176, 1, 0, 0, 0, 182, 179, 1, 0, 0, 0, 183, 1, 1, 0, 0, 0, 184, 185, 5, 42, 0, 0, 185, 189, 5, 142, 0, 0, 186, 188, 3, 8, 4, 0, 187, 186, 1, 0, 0, 0, 188, 191, 1, 0, 0, 0, 189, 187, 1, 0, 0, 0, 189, 190, 1, 0, 0, 0, 190, 192, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 192, 193, 5, 143, 0, 0, 193, 3, 1, 0, 0, 0, 194, 195, 5, 43, 0, 0, 195, 196, 3, 168, 84, 0, 196, 197, 5, 139, 0, 0, 197, 5, 1, 0, 0, 0, 198, 199, 5, 11, 0, 0, 199, 200, 3, 166, 83, 0, 200, 201, 5, 89, 0, 0, 201, 202, 3, 168, 84, 0, 202, 203, 5, 80, 0, 0, 203, 204, 3, 168, 84, 0, 204, 205, 5, 79, 0, 0, 205, 206, 3, 168, 84, 0, 206, 210, 5, 142, 0, 0, 207, 209, 3, 8, 4, 0, 208, 207, 1, 0, 0, 0, 209, 212, 1, 0, 0, 0, 210, 208, 1, 0, 0, 0, 210, 211, 1, 0, 0, 0, 211, 213, 1, 0, 0, 0, 212, 210, 1, 0, 0, 0, 213, 214, 5, 143, 0, 0, 214, 7, 1, 0, 0, 0, 215, 224, 3, 4, 2, 0, 216, 224, 3, 18, 9, 0, 217, 224, 3, 10, 5, 0, 218, 224, 3, 98, 49, 0, 219, 224, 3, 110, 55, 0, 220, 224, 3, 146, 73, 0, 221, 224, 3, 58, 29, 0, 222, 224, 3, 32, 16, 0, 223, 215, 1, 0, 0, 0, 223, 216, 1, 0, 0, 0, 223, 217, 1, 0, 0, 0, 223, 218, 1, 0, 0, 0, 223, 219, 1, 0, 0, 0, 223, 220, 1, 0, 0, 0, 223, 221, 1, 0, 0, 0, 223, 222, 1, 0, 0, 0, 224, 9, 1, 0, 0, 0, 225, 226, 5, 43, 0, 0, 226, 227, 5, 46, 0, 0, 227, 228, 3, 166, 83, 0, 228, 229, 5, 139, 0, 0, 229, 236, 1, 0, 0, 0, 230, 231, 5, 43, 0, 0, 231, 232, 5, 48, 0, 0, 232, 233, 3, 166, 83, 0, 233, 234, 5, 139, 0, 0, 234, 236, 1, 0, 0, 0, 235, 225, 1, 0, 0, 0, 235, 230, 1, 0, 0, 0, 236, 11, 1, 0, 0, 0, 237, 238, 5, 44, 0, 0, 238, 239, 5, 45, 0, 0, 239, 240, 3, 166, 83, 0, 240, 241, 5, 89, 0, 0, 241, 242, 3, 168, 84, 0, 242, 243, 5, 139, 0, 0, 243, 13, 1, 0, 0, 0, 244, 245, 5, 44, 0, 0, 245, 246, 5, 46, 0, 0, 246, 247, 3, 166, 83, 0, 247, 248, 5, 80, 0, 0, 248, 249, 3, 168, 84, 0, 249, 250, 5, 139, 0, 0, 250, 15, 1, 0, 0, 0, 251, 256, 3, 10, 5, 0, 252, 256, 3, 12, 6, 0, 253, 256, 3, 14, 7, 0, 254, 256, 3, 32, 16, 0, 255, 251, 1, 0, 0, 0, 255, 252, 1, 0, 0, 0, 255, 253, 1, 0, 0, 0, 255, 254, 1, 0, 0, 0, 256, 17, 1, 0, 0, 0, 257, 258, 5, 45, 0, 0, 258, 259, 3, 166, 83, 0, 259, 260, 5, 89, 0, 0, 260, 263, 3, 168, 84, 0, 261, 262, 5, 90, 0, 0, 262, 264, 3, 168, 84, 0, 263, 261, 1, 0, 0, 0, 263, 264, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 266, 5, 139, 0, 0, 266, 19, 1, 0, 0, 0, 267, 269, 3, 16, 8, 0, 268, 267, 1, 0, 0, 0, 269, 272, 1, 0, 0, 0, 270, 268, 1, 0, 0, 0, 270, 271, 1, 0, 0, 0, 271, 273, 1, 0, 0, 0, 272, 270, 1, 0, 0, 0, 273, 274, 5, 46, 0, 0, 274, 276, 3, 166, 83, 0, 275, 277, 3, 22, 11, 0, 276, 275, 1, 0, 0, 0, 276, 277, 1, 0, 0, 0, 277, 278, 1, 0, 0, 0, 278, 279, 5, 89, 0, 0, 279, 280, 3, 168, 84, 0, 280, 281, 5, 80, 0, 0, 281, 291, 3, 168, 84, 0, 282, 283, 5, 94, 0, 0, 283, 288, 3, 26, 13, 0, 284, 285, 5, 140, 0, 0, 285, 287, 3, 26, 13, 0, 286, 284, 1, 0, 0, 0, 287, 290, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 292, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 291, 282, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 293, 1, 0, 0, 0, 293, 297, 5, 142, 0, 0, 294, 296, 3, 34, 17, 0, 295, 294, 1, 0, 0, 0, 296, 299, 1, 0, 0, 0, 297, 295, 1, 0, 0, 0, 297, 298, 1, 0, 0, 0, 298, 300, 1, 0, 0, 0, 299, 297, 1, 0, 0, 0, 300, 301, 5, 143, 0, 0, 301, 21, 1, 0, 0, 0, 302, 303, 5, 148, 0, 0, 303, 308, 3, 24, 12, 0, 304, 305, 5, 140, 0, 0, 305, 307, 3, 24, 12, 0, 306, 304, 1, 0, 0, 0, 307, 310, 1, 0, 0, 0, 308, 306, 1, 0, 0, 0, 308, 309, 1, 0, 0, 0, 309, 311, 1, 0, 0, 0, 310, 308, 1, 0, 0, 0, 311, 312, 5, 149, 0, 0, 312, 23, 1, 0, 0, 0, 313, 314, 5, 49, 0, 0, 314, 317, 3, 166, 83, 0, 315, 316, 5, 138, 0, 0, 316, 318, 5, 39, 0, 0, 317, 315, 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 333, 1, 0, 0, 0, 319, 320, 5, 38, 0, 0, 320, 330, 3, 166, 83, 0, 321, 322, 5, 40, 0, 0, 322, 327, 3, 26, 13, 0, 323, 324, 5, 150, 0, 0, 324, 326, 3, 26, 13, 0, 325, 323, 1, 0, 0, 0, 326, 329, 1, 0, 0, 0, 327, 325, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 331, 1, 0, 0, 0, 329, 327, 1, 0, 0, 0, 330, 321, 1, 0, 0, 0, 330, 331, 1, 0, 0, 0, 331, 333, 1, 0, 0, 0, 332, 313, 1, 0, 0, 0, 332, 319, 1, 0, 0, 0, 333, 25, 1, 0, 0, 0, 334, 336, 3, 166, 83, 0, 335, 337, 3, 28, 14, 0, 336, 335, 1, 0, 0, 0, 336, 337, 1, 0, 0, 0, 337, 27, 1, 0, 0, 0, 338, 339, 5, 148, 0, 0, 339, 344, 3, 30, 15, 0, 340, 341, 5, 140, 0, 0, 341, 343, 3, 30, 15, 0, 342, 340, 1, 0, 0, 0, 343, 346, 1, 0, 0, 0, 344, 342, 1, 0, 0, 0, 344, 345, 1, 0, 0, 0, 345, 347, 1, 0, 0, 0, 346, 344, 1, 0, 0, 0, 347, 348, 5, 149, 0, 0, 348, 29, 1, 0, 0, 0, 349, 350, 5, 45, 0, 0, 350, 357, 3, 166, 83, 0, 351, 352, 5, 46, 0, 0, 352, 357, 3, 26, 13, 0, 353, 354, 5, 38, 0, 0, 354, 357, 3, 166, 83, 0, 355, 357, 3, 148, 74, 0, 356, 349, 1, 0, 0, 0, 356, 351, 1, 0, 0, 0, 356, 353, 1, 0, 0, 0, 356, 355, 1, 0, 0, 0, 357, 31, 1, 0, 0, 0, 358, 359, 5, 37, 0, 0, 359, 361, 3, 166, 83, 0, 360, 362, 3, 22, 11, 0, 361, 360, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 363, 1, 0, 0, 0, 363, 364, 5, 151, 0, 0, 364, 365, 3, 148, 74, 0, 365, 366, 5, 139, 0, 0, 366, 33, 1, 0, 0, 0, 367, 372, 3, 40, 20, 0, 368, 372, 3, 44, 22, 0, 369, 372, 3, 38, 19, 0, 370, 372, 3, 36, 18, 0, 371, 367, 1, 0, 0, 0, 371, 368, 1, 0, 0, 0, 371, 369, 1, 0, 0, 0, 371, 370, 1, 0, 0, 0, 372, 35, 1, 0, 0, 0, 373, 374, 5, 2, 0, 0, 374, 375, 3, 166, 83, 0, 375, 376, 5, 89, 0, 0, 376, 377, 3, 168, 84, 0, 377, 378, 5, 3, 0, 0, 378, 381, 3, 168, 84, 0, 379, 380, 5, 5, 0, 0, 380, 382, 3, 50, 25, 0, 381, 379, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 383, 1, 0, 0, 0, 383, 384, 5, 139, 0, 0, 384, 37, 1, 0, 0, 0, 385, 387, 5, 60, 0, 0, 386, 385, 1, 0, 0, 0, 386, 387, 1, 0, 0, 0, 387, 388, 1, 0, 0, 0, 388, 389, 5, 52, 0, 0, 389, 390, 3, 166, 83, 0, 390, 391, 5, 89, 0, 0, 391, 392, 3, 168, 84, 0, 392, 393, 5, 138, 0, 0, 393, 394, 3, 148, 74, 0, 394, 395, 5, 137, 0, 0, 395, 396, 3, 148, 74, 0, 396, 397, 5, 142, 0, 0, 397, 398, 5, 106, 0, 0, 398, 399, 5, 89, 0, 0, 399, 401, 3, 168, 84, 0, 400, 402, 3, 76, 38, 0, 401, 400, 1, 0, 0, 0, 401, 402, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 404, 5, 139, 0, 0, 404, 405, 5, 143, 0, 0, 405, 39, 1, 0, 0, 0, 406, 408, 3, 46, 23, 0, 407, 406, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 409, 1, 0, 0, 0, 409, 410, 7, 0, 0, 0, 410, 411, 3, 166, 83, 0, 411, 412, 5, 89, 0, 0, 412, 413, 3, 168, 84, 0, 413, 414, 5, 138, 0, 0, 414, 415, 3, 148, 74, 0, 415, 419, 5, 142, 0, 0, 416, 418, 3, 42, 21, 0, 417, 416, 1, 0, 0, 0, 418, 421, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 419, 1, 0, 0, 0, 422, 423, 5, 143, 0, 0, 423, 41, 1, 0, 0, 0, 424, 425, 5, 96, 0, 0, 425, 426, 5, 89, 0, 0, 426, 428, 3, 168, 84, 0, 427, 429, 3, 76, 38, 0, 428, 427, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 430, 1, 0, 0, 0, 430, 431, 5, 139, 0, 0, 431, 458, 1, 0, 0, 0, 432, 433, 5, 97, 0, 0, 433, 434, 5, 89, 0, 0, 434, 436, 3, 168, 84, 0, 435, 437, 3, 76, 38, 0, 436, 435, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 438, 1, 0, 0, 0, 438, 439, 5, 139, 0, 0, 439, 458, 1, 0, 0, 0, 440, 441, 5, 1, 0, 0, 441, 442, 5, 89, 0, 0, 442, 444, 3, 168, 84, 0, 443, 445, 3, 76, 38, 0, 444, 443, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 447, 5, 139, 0, 0, 447, 458, 1, 0, 0, 0, 448, 449, 5, 98, 0, 0, 449, 450, 5, 99, 0, 0, 450, 451, 5, 89, 0, 0, 451, 452, 3, 168, 84, 0, 452, 453, 5, 100, 0, 0, 453, 454, 5, 89, 0, 0, 454, 455, 3, 168, 84, 0, 455, 456, 5, 139, 0, 0, 456, 458, 1, 0, 0, 0, 457, 424, 1, 0, 0, 0, 457, 432, 1, 0, 0, 0, 457, 440, 1, 0, 0, 0, 457, 448, 1, 0, 0, 0, 458, 43, 1, 0, 0, 0, 459, 461, 3, 46, 23, 0, 460, 459, 1, 0, 0, 0, 460, 461, 1, 0, 0, 0, 461, 462, 1, 0, 0, 0, 462, 463, 5, 51, 0, 0, 463, 464, 3, 166, 83, 0, 464, 465, 5, 89, 0, 0, 465, 466, 3, 168, 84, 0, 466, 467, 5, 138, 0, 0, 467, 468, 3, 156, 78, 0, 468, 470, 3, 50, 25, 0, 469, 471, 5, 117, 0, 0, 470, 469, 1, 0, 0, 0, 470, 471, 1, 0, 0, 0, 471, 474, 1, 0, 0, 0, 472, 473, 5, 87, 0, 0, 473, 475, 3, 168, 84, 0, 474, 472, 1, 0, 0, 0, 474, 475, 1, 0, 0, 0, 475, 476, 1, 0, 0, 0, 476, 480, 5, 142, 0, 0, 477, 479, 3, 48, 24, 0, 478, 477, 1, 0, 0, 0, 479, 482, 1, 0, 0, 0, 480, 478, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 483, 1, 0, 0, 0, 482, 480, 1, 0, 0, 0, 483, 484, 5, 143, 0, 0, 484, 45, 1, 0, 0, 0, 485, 487, 5, 34, 0, 0, 486, 488, 7, 1, 0, 0, 487, 486, 1, 0, 0, 0, 487, 488, 1, 0, 0, 0, 488, 47, 1, 0, 0, 0, 489, 490, 5, 103, 0, 0, 490, 491, 5, 89, 0, 0, 491, 493, 3, 168, 84, 0, 492, 494, 3, 76, 38, 0, 493, 492, 1, 0, 0, 0, 493, 494, 1, 0, 0, 0, 494, 495, 1, 0, 0, 0, 495, 496, 5, 139, 0, 0, 496, 523, 1, 0, 0, 0, 497, 498, 5, 104, 0, 0, 498, 499, 5, 89, 0, 0, 499, 501, 3, 168, 84, 0, 500, 502, 3, 76, 38, 0, 501, 500, 1, 0, 0, 0, 501, 502, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 504, 5, 139, 0, 0, 504, 523, 1, 0, 0, 0, 505, 506, 5, 105, 0, 0, 506, 507, 5, 89, 0, 0, 507, 509, 3, 168, 84, 0, 508, 510, 3, 76, 38, 0, 509, 508, 1, 0, 0, 0, 509, 510, 1, 0, 0, 0, 510, 511, 1, 0, 0, 0, 511, 512, 5, 139, 0, 0, 512, 523, 1, 0, 0, 0, 513, 514, 5, 98, 0, 0, 514, 515, 5, 99, 0, 0, 515, 516, 5, 89, 0, 0, 516, 517, 3, 168, 84, 0, 517, 518, 5, 100, 0, 0, 518, 519, 5, 89, 0, 0, 519, 520, 3, 168, 84, 0, 520, 521, 5, 139, 0, 0, 521, 523, 1, 0, 0, 0, 522, 489, 1, 0, 0, 0, 522, 497, 1, 0, 0, 0, 522, 505, 1, 0, 0, 0, 522, 513, 1, 0, 0, 0, 523, 49, 1, 0, 0, 0, 524, 525, 5, 45, 0, 0, 525, 534, 3, 166, 83, 0, 526, 527, 5, 46, 0, 0, 527, 529, 3, 166, 83, 0, 528, 530, 3, 28, 14, 0, 529, 528, 1, 0, 0, 0, 529, 530, 1, 0, 0, 0, 530, 534, 1, 0, 0, 0, 531, 532, 5, 38, 0, 0, 532, 534, 3, 166, 83, 0, 533, 524, 1, 0, 0, 0, 533, 526, 1, 0, 0, 0, 533, 531, 1, 0, 0, 0, 534, 51, 1, 0, 0, 0, 535, 537, 3, 16, 8, 0, 536, 535, 1, 0, 0, 0, 537, 540, 1, 0, 0, 0, 538, 536, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 541, 1, 0, 0, 0, 540, 538, 1, 0, 0, 0, 541, 542, 5, 48, 0, 0, 542, 543, 3, 166, 83, 0, 543, 544, 5, 89, 0, 0, 544, 545, 3, 168, 84, 0, 545, 546, 5, 80, 0, 0, 546, 549, 3, 168, 84, 0, 547, 548, 5, 81, 0, 0, 548, 550, 5, 152, 0, 0, 549, 547, 1, 0, 0, 0, 549, 550, 1, 0, 0, 0, 550, 551, 1, 0, 0, 0, 551, 555, 5, 142, 0, 0, 552, 554, 3, 54, 27, 0, 553, 552, 1, 0, 0, 0, 554, 557, 1, 0, 0, 0, 555, 553, 1, 0, 0, 0, 555, 556, 1, 0, 0, 0, 556, 558, 1, 0, 0, 0, 557, 555, 1, 0, 0, 0, 558, 559, 5, 143, 0, 0, 559, 53, 1, 0, 0, 0, 560, 567, 3, 68, 34, 0, 561, 567, 3, 70, 35, 0, 562, 567, 3, 80, 40, 0, 563, 567, 3, 60, 30, 0, 564, 567, 3, 62, 31, 0, 565, 567, 3, 56, 28, 0, 566, 560, 1, 0, 0, 0, 566, 561, 1, 0, 0, 0, 566, 562, 1, 0, 0, 0, 566, 563, 1, 0, 0, 0, 566, 564, 1, 0, 0, 0, 566, 565, 1, 0, 0, 0, 567, 55, 1, 0, 0, 0, 568, 569, 5, 2, 0, 0, 569, 570, 3, 166, 83, 0, 570, 571, 5, 89, 0, 0, 571, 572, 3, 168, 84, 0, 572, 573, 5, 40, 0, 0, 573, 574, 3, 26, 13, 0, 574, 575, 5, 141, 0, 0, 575, 576, 3, 166, 83, 0, 576, 577, 5, 139, 0, 0, 577, 57, 1, 0, 0, 0, 578, 579, 5, 4, 0, 0, 579, 580, 3, 166, 83, 0, 580, 581, 5, 89, 0, 0, 581, 582, 3, 168, 84, 0, 582, 583, 5, 6, 0, 0, 583, 584, 3, 26, 13, 0, 584, 585, 5, 68, 0, 0, 585, 586, 3, 166, 83, 0, 586, 587, 5, 141, 0, 0, 587, 588, 3, 166, 83, 0, 588, 589, 5, 139, 0, 0, 589, 59, 1, 0, 0, 0, 590, 592, 5, 24, 0, 0, 591, 593, 5, 42, 0, 0, 592, 591, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 596, 3, 166, 83, 0, 595, 597, 3, 22, 11, 0, 596, 595, 1, 0, 0, 0, 596, 597, 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 599, 5, 89, 0, 0, 599, 600, 3, 168, 84, 0, 600, 602, 5, 27, 0, 0, 601, 603, 5, 11, 0, 0, 602, 601, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 604, 1, 0, 0, 0, 604, 605, 3, 26, 13, 0, 605, 606, 5, 28, 0, 0, 606, 635, 3, 168, 84, 0, 607, 608, 5, 52, 0, 0, 608, 609, 3, 168, 84, 0, 609, 613, 5, 142, 0, 0, 610, 612, 3, 64, 32, 0, 611, 610, 1, 0, 0, 0, 612, 615, 1, 0, 0, 0, 613, 611, 1, 0, 0, 0, 613, 614, 1, 0, 0, 0, 614, 616, 1, 0, 0, 0, 615, 613, 1, 0, 0, 0, 616, 617, 5, 143, 0, 0, 617, 636, 1, 0, 0, 0, 618, 619, 5, 42, 0, 0, 619, 622, 3, 168, 84, 0, 620, 621, 5, 52, 0, 0, 621, 623, 3, 168, 84, 0, 622, 620, 1, 0, 0, 0, 622, 623, 1, 0, 0, 0, 623, 633, 1, 0, 0, 0, 624, 628, 5, 142, 0, 0, 625, 627, 3, 64, 32, 0, 626, 625, 1, 0, 0, 0, 627, 630, 1, 0, 0, 0, 628, 626, 1, 0, 0, 0, 628, 629, 1, 0, 0, 0, 629, 631, 1, 0, 0, 0, 630, 628, 1, 0, 0, 0, 631, 634, 5, 143, 0, 0, 632, 634, 5, 139, 0, 0, 633, 624, 1, 0, 0, 0, 633, 632, 1, 0, 0, 0, 634, 636, 1, 0, 0, 0, 635, 607, 1, 0, 0, 0, 635, 618, 1, 0, 0, 0, 636, 61, 1, 0, 0, 0, 637, 638, 5, 24, 0, 0, 638, 639, 3, 166, 83, 0, 639, 640, 5, 89, 0, 0, 640, 641, 3, 168, 84, 0, 641, 642, 5, 26, 0, 0, 642, 643, 3, 166, 83, 0, 643, 644, 3, 28, 14, 0, 644, 645, 5, 139, 0, 0, 645, 63, 1, 0, 0, 0, 646, 647, 5, 18, 0, 0, 647, 704, 5, 139, 0, 0, 648, 649, 5, 19, 0, 0, 649, 650, 5, 20, 0, 0, 650, 651, 3, 166, 83, 0, 651, 652, 5, 139, 0, 0, 652, 704, 1, 0, 0, 0, 653, 654, 5, 29, 0, 0, 654, 655, 3, 168, 84, 0, 655, 656, 5, 139, 0, 0, 656, 704, 1, 0, 0, 0, 657, 658, 5, 29, 0, 0, 658, 659, 3, 166, 83, 0, 659, 660, 5, 141, 0, 0, 660, 670, 3, 166, 83, 0, 661, 662, 5, 67, 0, 0, 662, 666, 5, 142, 0, 0, 663, 665, 3, 66, 33, 0, 664, 663, 1, 0, 0, 0, 665, 668, 1, 0, 0, 0, 666, 664, 1, 0, 0, 0, 666, 667, 1, 0, 0, 0, 667, 669, 1, 0, 0, 0, 668, 666, 1, 0, 0, 0, 669, 671, 5, 143, 0, 0, 670, 661, 1, 0, 0, 0, 670, 671, 1, 0, 0, 0, 671, 672, 1, 0, 0, 0, 672, 673, 5, 139, 0, 0, 673, 704, 1, 0, 0, 0, 674, 676, 5, 30, 0, 0, 675, 677, 5, 38, 0, 0, 676, 675, 1, 0, 0, 0, 676, 677, 1, 0, 0, 0, 677, 678, 1, 0, 0, 0, 678, 679, 3, 166, 83, 0, 679, 680, 5, 58, 0, 0, 680, 681, 3, 26, 13, 0, 681, 682, 5, 139, 0, 0, 682, 704, 1, 0, 0, 0, 683, 684, 5, 31, 0, 0, 684, 685, 3, 166, 83, 0, 685, 686, 5, 152, 0, 0, 686, 687, 5, 139, 0, 0, 687, 704, 1, 0, 0, 0, 688, 689, 5, 32, 0, 0, 689, 690, 3, 26, 13, 0, 690, 691, 5, 141, 0, 0, 691, 692, 3, 166, 83, 0, 692, 693, 3, 166, 83, 0, 693, 694, 3, 168, 84, 0, 694, 695, 5, 139, 0, 0, 695, 704, 1, 0, 0, 0, 696, 697, 5, 98, 0, 0, 697, 704, 5, 139, 0, 0, 698, 699, 5, 33, 0, 0, 699, 700, 5, 152, 0, 0, 700, 701, 3, 168, 84, 0, 701, 702, 5, 139, 0, 0, 702, 704, 1, 0, 0, 0, 703, 646, 1, 0, 0, 0, 703, 648, 1, 0, 0, 0, 703, 653, 1, 0, 0, 0, 703, 657, 1, 0, 0, 0, 703, 674, 1, 0, 0, 0, 703, 683, 1, 0, 0, 0, 703, 688, 1, 0, 0, 0, 703, 696, 1, 0, 0, 0, 703, 698, 1, 0, 0, 0, 704, 65, 1, 0, 0, 0, 705, 706, 3, 166, 83, 0, 706, 707, 5, 61, 0, 0, 707, 708, 3, 166, 83, 0, 708, 709, 5, 139, 0, 0, 709, 67, 1, 0, 0, 0, 710, 711, 5, 52, 0, 0, 711, 713, 3, 166, 83, 0, 712, 714, 3, 22, 11, 0, 713, 712, 1, 0, 0, 0, 713, 714, 1, 0, 0, 0, 714, 715, 1, 0, 0, 0, 715, 716, 5, 89, 0, 0, 716, 717, 3, 168, 84, 0, 717, 718, 5, 138, 0, 0, 718, 719, 3, 148, 74, 0, 719, 720, 5, 137, 0, 0, 720, 721, 3, 148, 74, 0, 721, 722, 5, 91, 0, 0, 722, 724, 3, 84, 42, 0, 723, 725, 3, 76, 38, 0, 724, 723, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 727, 1, 0, 0, 0, 726, 728, 3, 82, 41, 0, 727, 726, 1, 0, 0, 0, 727, 728, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 5, 93, 0, 0, 730, 732, 3, 86, 43, 0, 731, 733, 3, 90, 45, 0, 732, 731, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 735, 1, 0, 0, 0, 734, 736, 3, 74, 37, 0, 735, 734, 1, 0, 0, 0, 735, 736, 1, 0, 0, 0, 736, 738, 1, 0, 0, 0, 737, 739, 3, 72, 36, 0, 738, 737, 1, 0, 0, 0, 738, 739, 1, 0, 0, 0, 739, 740, 1, 0, 0, 0, 740, 741, 5, 139, 0, 0, 741, 69, 1, 0, 0, 0, 742, 743, 5, 53, 0, 0, 743, 745, 3, 166, 83, 0, 744, 746, 3, 22, 11, 0, 745, 744, 1, 0, 0, 0, 745, 746, 1, 0, 0, 0, 746, 747, 1, 0, 0, 0, 747, 748, 5, 89, 0, 0, 748, 749, 3, 168, 84, 0, 749, 750, 5, 138, 0, 0, 750, 751, 3, 148, 74, 0, 751, 752, 5, 137, 0, 0, 752, 754, 3, 148, 74, 0, 753, 755, 3, 76, 38, 0, 754, 753, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 757, 1, 0, 0, 0, 756, 758, 3, 90, 45, 0, 757, 756, 1, 0, 0, 0, 757, 758, 1, 0, 0, 0, 758, 760, 1, 0, 0, 0, 759, 761, 3, 74, 37, 0, 760, 759, 1, 0, 0, 0, 760, 761, 1, 0, 0, 0, 761, 763, 1, 0, 0, 0, 762, 764, 3, 72, 36, 0, 763, 762, 1, 0, 0, 0, 763, 764, 1, 0, 0, 0, 764, 765, 1, 0, 0, 0, 765, 766, 5, 139, 0, 0, 766, 71, 1, 0, 0, 0, 767, 768, 5, 69, 0, 0, 768, 769, 5, 68, 0, 0, 769, 770, 3, 166, 83, 0, 770, 73, 1, 0, 0, 0, 771, 772, 5, 9, 0, 0, 772, 773, 5, 7, 0, 0, 773, 774, 3, 166, 83, 0, 774, 775, 5, 68, 0, 0, 775, 776, 3, 168, 84, 0, 776, 75, 1, 0, 0, 0, 777, 778, 5, 12, 0, 0, 778, 787, 5, 15, 0, 0, 779, 780, 5, 12, 0, 0, 780, 781, 7, 2, 0, 0, 781, 782, 5, 16, 0, 0, 782, 783, 5, 144, 0, 0, 783, 784, 3, 88, 44, 0, 784, 785, 5, 145, 0, 0, 785, 787, 1, 0, 0, 0, 786, 777, 1, 0, 0, 0, 786, 779, 1, 0, 0, 0, 787, 77, 1, 0, 0, 0, 788, 789, 5, 68, 0, 0, 789, 790, 5, 144, 0, 0, 790, 795, 3, 130, 65, 0, 791, 792, 5, 140, 0, 0, 792, 794, 3, 130, 65, 0, 793, 791, 1, 0, 0, 0, 794, 797, 1, 0, 0, 0, 795, 793, 1, 0, 0, 0, 795, 796, 1, 0, 0, 0, 796, 798, 1, 0, 0, 0, 797, 795, 1, 0, 0, 0, 798, 799, 5, 145, 0, 0, 799, 79, 1, 0, 0, 0, 800, 801, 5, 54, 0, 0, 801, 802, 3, 166, 83, 0, 802, 803, 5, 89, 0, 0, 803, 804, 3, 168, 84, 0, 804, 805, 5, 55, 0, 0, 805, 806, 3, 166, 83, 0, 806, 807, 5, 138, 0, 0, 807, 809, 3, 148, 74, 0, 808, 810, 3, 90, 45, 0, 809, 808, 1, 0, 0, 0, 809, 810, 1, 0, 0, 0, 810, 811, 1, 0, 0, 0, 811, 812, 5, 139, 0, 0, 812, 81, 1, 0, 0, 0, 813, 814, 5, 92, 0, 0, 814, 815, 3, 148, 74, 0, 815, 83, 1, 0, 0, 0, 816, 817, 7, 3, 0, 0, 817, 85, 1, 0, 0, 0, 818, 837, 5, 95, 0, 0, 819, 820, 5, 45, 0, 0, 820, 837, 3, 166, 83, 0, 821, 822, 5, 38, 0, 0, 822, 837, 3, 166, 83, 0, 823, 824, 5, 47, 0, 0, 824, 833, 5, 144, 0, 0, 825, 830, 3, 26, 13, 0, 826, 827, 5, 140, 0, 0, 827, 829, 3, 26, 13, 0, 828, 826, 1, 0, 0, 0, 829, 832, 1, 0, 0, 0, 830, 828, 1, 0, 0, 0, 830, 831, 1, 0, 0, 0, 831, 834, 1, 0, 0, 0, 832, 830, 1, 0, 0, 0, 833, 825, 1, 0, 0, 0, 833, 834, 1, 0, 0, 0, 834, 835, 1, 0, 0, 0, 835, 837, 5, 145, 0, 0, 836, 818, 1, 0, 0, 0, 836, 819, 1, 0, 0, 0, 836, 821, 1, 0, 0, 0, 836, 823, 1, 0, 0, 0, 837, 87, 1, 0, 0, 0, 838, 843, 3, 166, 83, 0, 839, 840, 5, 140, 0, 0, 840, 842, 3, 166, 83, 0, 841, 839, 1, 0, 0, 0, 842, 845, 1, 0, 0, 0, 843, 841, 1, 0, 0, 0, 843, 844, 1, 0, 0, 0, 844, 89, 1, 0, 0, 0, 845, 843, 1, 0, 0, 0, 846, 847, 5, 94, 0, 0, 847, 851, 5, 142, 0, 0, 848, 850, 3, 92, 46, 0, 849, 848, 1, 0, 0, 0, 850, 853, 1, 0, 0, 0, 851, 849, 1, 0, 0, 0, 851, 852, 1, 0, 0, 0, 852, 854, 1, 0, 0, 0, 853, 851, 1, 0, 0, 0, 854, 855, 5, 143, 0, 0, 855, 91, 1, 0, 0, 0, 856, 857, 5, 25, 0, 0, 857, 858, 3, 166, 83, 0, 858, 859, 5, 89, 0, 0, 859, 860, 3, 168, 84, 0, 860, 861, 5, 144, 0, 0, 861, 862, 3, 88, 44, 0, 862, 863, 5, 145, 0, 0, 863, 864, 5, 139, 0, 0, 864, 939, 1, 0, 0, 0, 865, 866, 5, 64, 0, 0, 866, 867, 3, 166, 83, 0, 867, 868, 5, 89, 0, 0, 868, 869, 3, 168, 84, 0, 869, 870, 5, 138, 0, 0, 870, 871, 3, 148, 74, 0, 871, 872, 3, 94, 47, 0, 872, 873, 5, 139, 0, 0, 873, 939, 1, 0, 0, 0, 874, 875, 5, 65, 0, 0, 875, 876, 3, 166, 83, 0, 876, 877, 5, 89, 0, 0, 877, 878, 3, 168, 84, 0, 878, 879, 5, 138, 0, 0, 879, 880, 3, 156, 78, 0, 880, 883, 3, 50, 25, 0, 881, 882, 5, 87, 0, 0, 882, 884, 3, 168, 84, 0, 883, 881, 1, 0, 0, 0, 883, 884, 1, 0, 0, 0, 884, 885, 1, 0, 0, 0, 885, 886, 3, 94, 47, 0, 886, 887, 5, 139, 0, 0, 887, 939, 1, 0, 0, 0, 888, 889, 5, 46, 0, 0, 889, 890, 3, 166, 83, 0, 890, 891, 5, 89, 0, 0, 891, 892, 3, 168, 84, 0, 892, 893, 5, 138, 0, 0, 893, 895, 3, 166, 83, 0, 894, 896, 3, 28, 14, 0, 895, 894, 1, 0, 0, 0, 895, 896, 1, 0, 0, 0, 896, 898, 1, 0, 0, 0, 897, 899, 3, 78, 39, 0, 898, 897, 1, 0, 0, 0, 898, 899, 1, 0, 0, 0, 899, 902, 1, 0, 0, 0, 900, 901, 5, 20, 0, 0, 901, 903, 5, 56, 0, 0, 902, 900, 1, 0, 0, 0, 902, 903, 1, 0, 0, 0, 903, 904, 1, 0, 0, 0, 904, 905, 5, 139, 0, 0, 905, 939, 1, 0, 0, 0, 906, 907, 5, 7, 0, 0, 907, 908, 3, 166, 83, 0, 908, 909, 5, 89, 0, 0, 909, 910, 3, 168, 84, 0, 910, 911, 5, 138, 0, 0, 911, 912, 3, 166, 83, 0, 912, 913, 5, 56, 0, 0, 913, 914, 3, 148, 74, 0, 914, 915, 5, 139, 0, 0, 915, 939, 1, 0, 0, 0, 916, 917, 5, 54, 0, 0, 917, 918, 3, 166, 83, 0, 918, 919, 5, 89, 0, 0, 919, 920, 3, 168, 84, 0, 920, 921, 5, 138, 0, 0, 921, 924, 3, 166, 83, 0, 922, 923, 5, 56, 0, 0, 923, 925, 3, 148, 74, 0, 924, 922, 1, 0, 0, 0, 924, 925, 1, 0, 0, 0, 925, 926, 1, 0, 0, 0, 926, 927, 5, 139, 0, 0, 927, 939, 1, 0, 0, 0, 928, 929, 5, 24, 0, 0, 929, 930, 3, 166, 83, 0, 930, 931, 5, 89, 0, 0, 931, 932, 3, 168, 84, 0, 932, 933, 5, 138, 0, 0, 933, 934, 3, 166, 83, 0, 934, 935, 5, 141, 0, 0, 935, 936, 3, 166, 83, 0, 936, 937, 5, 139, 0, 0, 937, 939, 1, 0, 0, 0, 938, 856, 1, 0, 0, 0, 938, 865, 1, 0, 0, 0, 938, 874, 1, 0, 0, 0, 938, 888, 1, 0, 0, 0, 938, 906, 1, 0, 0, 0, 938, 916, 1, 0, 0, 0, 938, 928, 1, 0, 0, 0, 939, 93, 1, 0, 0, 0, 940, 941, 5, 144, 0, 0, 941, 946, 3, 96, 48, 0, 942, 943, 5, 140, 0, 0, 943, 945, 3, 96, 48, 0, 944, 942, 1, 0, 0, 0, 945, 948, 1, 0, 0, 0, 946, 944, 1, 0, 0, 0, 946, 947, 1, 0, 0, 0, 947, 949, 1, 0, 0, 0, 948, 946, 1, 0, 0, 0, 949, 950, 5, 145, 0, 0, 950, 95, 1, 0, 0, 0, 951, 952, 7, 4, 0, 0, 952, 97, 1, 0, 0, 0, 953, 954, 5, 63, 0, 0, 954, 955, 3, 100, 50, 0, 955, 99, 1, 0, 0, 0, 956, 959, 3, 102, 51, 0, 957, 959, 3, 106, 53, 0, 958, 956, 1, 0, 0, 0, 958, 957, 1, 0, 0, 0, 959, 101, 1, 0, 0, 0, 960, 961, 5, 64, 0, 0, 961, 962, 3, 166, 83, 0, 962, 963, 5, 89, 0, 0, 963, 964, 3, 168, 84, 0, 964, 965, 5, 74, 0, 0, 965, 966, 3, 166, 83, 0, 966, 967, 5, 138, 0, 0, 967, 968, 3, 148, 74, 0, 968, 969, 5, 75, 0, 0, 969, 972, 3, 104, 52, 0, 970, 971, 5, 76, 0, 0, 971, 973, 3, 158, 79, 0, 972, 970, 1, 0, 0, 0, 972, 973, 1, 0, 0, 0, 973, 974, 1, 0, 0, 0, 974, 975, 5, 139, 0, 0, 975, 103, 1, 0, 0, 0, 976, 990, 5, 111, 0, 0, 977, 978, 5, 112, 0, 0, 978, 979, 5, 146, 0, 0, 979, 980, 3, 148, 74, 0, 980, 981, 5, 147, 0, 0, 981, 990, 1, 0, 0, 0, 982, 983, 5, 84, 0, 0, 983, 990, 3, 160, 80, 0, 984, 985, 5, 85, 0, 0, 985, 986, 5, 146, 0, 0, 986, 987, 3, 148, 74, 0, 987, 988, 5, 147, 0, 0, 988, 990, 1, 0, 0, 0, 989, 976, 1, 0, 0, 0, 989, 977, 1, 0, 0, 0, 989, 982, 1, 0, 0, 0, 989, 984, 1, 0, 0, 0, 990, 105, 1, 0, 0, 0, 991, 992, 5, 65, 0, 0, 992, 993, 3, 166, 83, 0, 993, 994, 5, 89, 0, 0, 994, 995, 3, 168, 84, 0, 995, 996, 5, 142, 0, 0, 996, 997, 3, 108, 54, 0, 997, 998, 3, 108, 54, 0, 998, 999, 5, 143, 0, 0, 999, 107, 1, 0, 0, 0, 1000, 1001, 3, 50, 25, 0, 1001, 1002, 5, 66, 0, 0, 1002, 1003, 3, 166, 83, 0, 1003, 1004, 5, 89, 0, 0, 1004, 1005, 3, 168, 84, 0, 1005, 1007, 3, 156, 78, 0, 1006, 1008, 5, 117, 0, 0, 1007, 1006, 1, 0, 0, 0, 1007, 1008, 1, 0, 0, 0, 1008, 1011, 1, 0, 0, 0, 1009, 1010, 5, 82, 0, 0, 1010, 1012, 3, 168, 84, 0, 1011, 1009, 1, 0, 0, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1014, 1, 0, 0, 0, 1013, 1015, 5, 86, 0, 0, 1014, 1013, 1, 0, 0, 0, 1014, 1015, 1, 0, 0, 0, 1015, 1018, 1, 0, 0, 0, 1016, 1017, 5, 87, 0, 0, 1017, 1019, 3, 168, 84, 0, 1018, 1016, 1, 0, 0, 0, 1018, 1019, 1, 0, 0, 0, 1019, 1021, 1, 0, 0, 0, 1020, 1022, 5, 88, 0, 0, 1021, 1020, 1, 0, 0, 0, 1021, 1022, 1, 0, 0, 0, 1022, 1023, 1, 0, 0, 0, 1023, 1024, 5, 139, 0, 0, 1024, 109, 1, 0, 0, 0, 1025, 1027, 5, 57, 0, 0, 1026, 1028, 3, 22, 11, 0, 1027, 1026, 1, 0, 0, 0, 1027, 1028, 1, 0, 0, 0, 1028, 1029, 1, 0, 0, 0, 1029, 1031, 3, 166, 83, 0, 1030, 1032, 3, 112, 56, 0, 1031, 1030, 1, 0, 0, 0, 1031, 1032, 1, 0, 0, 0, 1032, 1033, 1, 0, 0, 0, 1033, 1034, 5, 58, 0, 0, 1034, 1036, 3, 166, 83, 0, 1035, 1037, 3, 28, 14, 0, 1036, 1035, 1, 0, 0, 0, 1036, 1037, 1, 0, 0, 0, 1037, 1040, 1, 0, 0, 0, 1038, 1039, 5, 89, 0, 0, 1039, 1041, 3, 168, 84, 0, 1040, 1038, 1, 0, 0, 0, 1040, 1041, 1, 0, 0, 0, 1041, 1044, 1, 0, 0, 0, 1042, 1043, 5, 81, 0, 0, 1043, 1045, 5, 152, 0, 0, 1044, 1042, 1, 0, 0, 0, 1044, 1045, 1, 0, 0, 0, 1045, 1046, 1, 0, 0, 0, 1046, 1050, 5, 142, 0, 0, 1047, 1049, 3, 114, 57, 0, 1048, 1047, 1, 0, 0, 0, 1049, 1052, 1, 0, 0, 0, 1050, 1048, 1, 0, 0, 0, 1050, 1051, 1, 0, 0, 0, 1051, 1053, 1, 0, 0, 0, 1052, 1050, 1, 0, 0, 0, 1053, 1054, 5, 143, 0, 0, 1054, 111, 1, 0, 0, 0, 1055, 1056, 3, 28, 14, 0, 1056, 113, 1, 0, 0, 0, 1057, 1058, 5, 62, 0, 0, 1058, 1065, 3, 100, 50, 0, 1059, 1065, 3, 128, 64, 0, 1060, 1065, 3, 124, 62, 0, 1061, 1065, 3, 118, 59, 0, 1062, 1065, 3, 126, 63, 0, 1063, 1065, 3, 116, 58, 0, 1064, 1057, 1, 0, 0, 0, 1064, 1059, 1, 0, 0, 0, 1064, 1060, 1, 0, 0, 0, 1064, 1061, 1, 0, 0, 0, 1064, 1062, 1, 0, 0, 0, 1064, 1063, 1, 0, 0, 0, 1065, 115, 1, 0, 0, 0, 1066, 1067, 5, 59, 0, 0, 1067, 1068, 3, 166, 83, 0, 1068, 1069, 5, 61, 0, 0, 1069, 1070, 3, 166, 83, 0, 1070, 1071, 5, 141, 0, 0, 1071, 1072, 3, 166, 83, 0, 1072, 1073, 5, 139, 0, 0, 1073, 117, 1, 0, 0, 0, 1074, 1075, 5, 10, 0, 0, 1075, 1079, 5, 142, 0, 0, 1076, 1078, 3, 120, 60, 0, 1077, 1076, 1, 0, 0, 0, 1078, 1081, 1, 0, 0, 0, 1079, 1077, 1, 0, 0, 0, 1079, 1080, 1, 0, 0, 0, 1080, 1082, 1, 0, 0, 0, 1081, 1079, 1, 0, 0, 0, 1082, 1083, 5, 143, 0, 0, 1083, 1084, 5, 139, 0, 0, 1084, 119, 1, 0, 0, 0, 1085, 1086, 3, 166, 83, 0, 1086, 1087, 5, 61, 0, 0, 1087, 1088, 5, 64, 0, 0, 1088, 1089, 3, 166, 83, 0, 1089, 1090, 5, 139, 0, 0, 1090, 1100, 1, 0, 0, 0, 1091, 1092, 3, 166, 83, 0, 1092, 1093, 5, 61, 0, 0, 1093, 1094, 5, 65, 0, 0, 1094, 1095, 3, 166, 83, 0, 1095, 1096, 5, 141, 0, 0, 1096, 1097, 3, 166, 83, 0, 1097, 1098, 5, 139, 0, 0, 1098, 1100, 1, 0, 0, 0, 1099, 1085, 1, 0, 0, 0, 1099, 1091, 1, 0, 0, 0, 1100, 121, 1, 0, 0, 0, 1101, 1102, 3, 26, 13, 0, 1102, 1103, 5, 20, 0, 0, 1103, 1108, 5, 56, 0, 0, 1104, 1105, 5, 141, 0, 0, 1105, 1107, 3, 166, 83, 0, 1106, 1104, 1, 0, 0, 0, 1107, 1110, 1, 0, 0, 0, 1108, 1106, 1, 0, 0, 0, 1108, 1109, 1, 0, 0, 0, 1109, 1111, 1, 0, 0, 0, 1110, 1108, 1, 0, 0, 0, 1111, 1112, 5, 139, 0, 0, 1112, 123, 1, 0, 0, 0, 1113, 1114, 5, 59, 0, 0, 1114, 1115, 3, 166, 83, 0, 1115, 1116, 5, 61, 0, 0, 1116, 1117, 5, 64, 0, 0, 1117, 1118, 3, 166, 83, 0, 1118, 1119, 5, 139, 0, 0, 1119, 125, 1, 0, 0, 0, 1120, 1121, 5, 71, 0, 0, 1121, 1122, 3, 166, 83, 0, 1122, 1123, 5, 72, 0, 0, 1123, 1124, 5, 73, 0, 0, 1124, 1125, 5, 68, 0, 0, 1125, 1126, 5, 54, 0, 0, 1126, 1127, 3, 166, 83, 0, 1127, 1128, 5, 70, 0, 0, 1128, 1129, 5, 65, 0, 0, 1129, 1130, 3, 166, 83, 0, 1130, 1131, 5, 141, 0, 0, 1131, 1132, 3, 166, 83, 0, 1132, 1133, 5, 139, 0, 0, 1133, 127, 1, 0, 0, 0, 1134, 1135, 5, 59, 0, 0, 1135, 1136, 3, 130, 65, 0, 1136, 1137, 5, 61, 0, 0, 1137, 1140, 3, 134, 67, 0, 1138, 1139, 5, 36, 0, 0, 1139, 1141, 3, 168, 84, 0, 1140, 1138, 1, 0, 0, 0, 1140, 1141, 1, 0, 0, 0, 1141, 1142, 1, 0, 0, 0, 1142, 1143, 5, 139, 0, 0, 1143, 129, 1, 0, 0, 0, 1144, 1145, 3, 166, 83, 0, 1145, 1146, 5, 141, 0, 0, 1146, 1147, 3, 132, 66, 0, 1147, 131, 1, 0, 0, 0, 1148, 1161, 3, 166, 83, 0, 1149, 1161, 5, 106, 0, 0, 1150, 1161, 5, 96, 0, 0, 1151, 1161, 5, 97, 0, 0, 1152, 1161, 5, 1, 0, 0, 1153, 1161, 5, 103, 0, 0, 1154, 1161, 5, 104, 0, 0, 1155, 1161, 5, 105, 0, 0, 1156, 1161, 5, 107, 0, 0, 1157, 1161, 5, 108, 0, 0, 1158, 1161, 5, 109, 0, 0, 1159, 1161, 5, 110, 0, 0, 1160, 1148, 1, 0, 0, 0, 1160, 1149, 1, 0, 0, 0, 1160, 1150, 1, 0, 0, 0, 1160, 1151, 1, 0, 0, 0, 1160, 1152, 1, 0, 0, 0, 1160, 1153, 1, 0, 0, 0, 1160, 1154, 1, 0, 0, 0, 1160, 1155, 1, 0, 0, 0, 1160, 1156, 1, 0, 0, 0, 1160, 1157, 1, 0, 0, 0, 1160, 1158, 1, 0, 0, 0, 1160, 1159, 1, 0, 0, 0, 1161, 133, 1, 0, 0, 0, 1162, 1163, 5, 83, 0, 0, 1163, 1164, 5, 141, 0, 0, 1164, 1209, 3, 166, 83, 0, 1165, 1166, 5, 84, 0, 0, 1166, 1167, 3, 166, 83, 0, 1167, 1168, 5, 141, 0, 0, 1168, 1169, 3, 166, 83, 0, 1169, 1209, 1, 0, 0, 0, 1170, 1171, 5, 85, 0, 0, 1171, 1172, 3, 166, 83, 0, 1172, 1173, 5, 141, 0, 0, 1173, 1174, 3, 166, 83, 0, 1174, 1209, 1, 0, 0, 0, 1175, 1176, 5, 64, 0, 0, 1176, 1177, 3, 166, 83, 0, 1177, 1178, 5, 141, 0, 0, 1178, 1179, 3, 138, 69, 0, 1179, 1209, 1, 0, 0, 0, 1180, 1181, 5, 65, 0, 0, 1181, 1182, 3, 166, 83, 0, 1182, 1183, 5, 141, 0, 0, 1183, 1184, 3, 166, 83, 0, 1184, 1185, 5, 141, 0, 0, 1185, 1186, 3, 140, 70, 0, 1186, 1209, 1, 0, 0, 0, 1187, 1188, 5, 46, 0, 0, 1188, 1190, 3, 166, 83, 0, 1189, 1191, 3, 28, 14, 0, 1190, 1189, 1, 0, 0, 0, 1190, 1191, 1, 0, 0, 0, 1191, 1192, 1, 0, 0, 0, 1192, 1193, 5, 141, 0, 0, 1193, 1194, 3, 130, 65, 0, 1194, 1209, 1, 0, 0, 0, 1195, 1196, 5, 48, 0, 0, 1196, 1197, 3, 166, 83, 0, 1197, 1198, 5, 141, 0, 0, 1198, 1200, 3, 166, 83, 0, 1199, 1201, 3, 28, 14, 0, 1200, 1199, 1, 0, 0, 0, 1200, 1201, 1, 0, 0, 0, 1201, 1203, 1, 0, 0, 0, 1202, 1204, 3, 142, 71, 0, 1203, 1202, 1, 0, 0, 0, 1203, 1204, 1, 0, 0, 0, 1204, 1206, 1, 0, 0, 0, 1205, 1207, 3, 136, 68, 0, 1206, 1205, 1, 0, 0, 0, 1206, 1207, 1, 0, 0, 0, 1207, 1209, 1, 0, 0, 0, 1208, 1162, 1, 0, 0, 0, 1208, 1165, 1, 0, 0, 0, 1208, 1170, 1, 0, 0, 0, 1208, 1175, 1, 0, 0, 0, 1208, 1180, 1, 0, 0, 0, 1208, 1187, 1, 0, 0, 0, 1208, 1195, 1, 0, 0, 0, 1209, 135, 1, 0, 0, 0, 1210, 1211, 5, 69, 0, 0, 1211, 1212, 3, 142, 71, 0, 1212, 137, 1, 0, 0, 0, 1213, 1214, 7, 5, 0, 0, 1214, 139, 1, 0, 0, 0, 1215, 1216, 7, 6, 0, 0, 1216, 141, 1, 0, 0, 0, 1217, 1218, 5, 67, 0, 0, 1218, 1222, 5, 142, 0, 0, 1219, 1221, 3, 144, 72, 0, 1220, 1219, 1, 0, 0, 0, 1221, 1224, 1, 0, 0, 0, 1222, 1220, 1, 0, 0, 0, 1222, 1223, 1, 0, 0, 0, 1223, 1225, 1, 0, 0, 0, 1224, 1222, 1, 0, 0, 0, 1225, 1226, 5, 143, 0, 0, 1226, 143, 1, 0, 0, 0, 1227, 1228, 3, 166, 83, 0, 1228, 1229, 5, 61, 0, 0, 1229, 1230, 5, 11, 0, 0, 1230, 1231, 5, 25, 0, 0, 1231, 1232, 5, 144, 0, 0, 1232, 1233, 3, 88, 44, 0, 1233, 1234, 5, 145, 0, 0, 1234, 1235, 5, 139, 0, 0, 1235, 1326, 1, 0, 0, 0, 1236, 1237, 3, 166, 83, 0, 1237, 1238, 5, 61, 0, 0, 1238, 1239, 5, 64, 0, 0, 1239, 1246, 3, 166, 83, 0, 1240, 1241, 5, 70, 0, 0, 1241, 1242, 5, 65, 0, 0, 1242, 1243, 3, 166, 83, 0, 1243, 1244, 5, 141, 0, 0, 1244, 1245, 3, 166, 83, 0, 1245, 1247, 1, 0, 0, 0, 1246, 1240, 1, 0, 0, 0, 1246, 1247, 1, 0, 0, 0, 1247, 1248, 1, 0, 0, 0, 1248, 1249, 5, 139, 0, 0, 1249, 1326, 1, 0, 0, 0, 1250, 1251, 3, 166, 83, 0, 1251, 1252, 5, 61, 0, 0, 1252, 1253, 5, 65, 0, 0, 1253, 1254, 3, 166, 83, 0, 1254, 1255, 5, 141, 0, 0, 1255, 1262, 3, 166, 83, 0, 1256, 1257, 5, 70, 0, 0, 1257, 1258, 5, 65, 0, 0, 1258, 1259, 3, 166, 83, 0, 1259, 1260, 5, 141, 0, 0, 1260, 1261, 3, 166, 83, 0, 1261, 1263, 1, 0, 0, 0, 1262, 1256, 1, 0, 0, 0, 1262, 1263, 1, 0, 0, 0, 1263, 1264, 1, 0, 0, 0, 1264, 1265, 5, 139, 0, 0, 1265, 1326, 1, 0, 0, 0, 1266, 1267, 3, 166, 83, 0, 1267, 1268, 5, 61, 0, 0, 1268, 1269, 5, 46, 0, 0, 1269, 1271, 3, 166, 83, 0, 1270, 1272, 3, 28, 14, 0, 1271, 1270, 1, 0, 0, 0, 1271, 1272, 1, 0, 0, 0, 1272, 1281, 1, 0, 0, 0, 1273, 1274, 5, 70, 0, 0, 1274, 1275, 5, 65, 0, 0, 1275, 1276, 3, 166, 83, 0, 1276, 1277, 5, 141, 0, 0, 1277, 1278, 3, 166, 83, 0, 1278, 1282, 1, 0, 0, 0, 1279, 1280, 5, 20, 0, 0, 1280, 1282, 5, 56, 0, 0, 1281, 1273, 1, 0, 0, 0, 1281, 1279, 1, 0, 0, 0, 1281, 1282, 1, 0, 0, 0, 1282, 1283, 1, 0, 0, 0, 1283, 1284, 5, 139, 0, 0, 1284, 1326, 1, 0, 0, 0, 1285, 1286, 3, 166, 83, 0, 1286, 1287, 5, 61, 0, 0, 1287, 1288, 5, 7, 0, 0, 1288, 1289, 3, 166, 83, 0, 1289, 1290, 5, 67, 0, 0, 1290, 1294, 5, 142, 0, 0, 1291, 1293, 3, 122, 61, 0, 1292, 1291, 1, 0, 0, 0, 1293, 1296, 1, 0, 0, 0, 1294, 1292, 1, 0, 0, 0, 1294, 1295, 1, 0, 0, 0, 1295, 1297, 1, 0, 0, 0, 1296, 1294, 1, 0, 0, 0, 1297, 1298, 5, 143, 0, 0, 1298, 1299, 5, 139, 0, 0, 1299, 1326, 1, 0, 0, 0, 1300, 1301, 3, 166, 83, 0, 1301, 1302, 5, 61, 0, 0, 1302, 1303, 5, 54, 0, 0, 1303, 1304, 3, 166, 83, 0, 1304, 1305, 5, 139, 0, 0, 1305, 1326, 1, 0, 0, 0, 1306, 1307, 3, 166, 83, 0, 1307, 1309, 5, 61, 0, 0, 1308, 1310, 5, 11, 0, 0, 1309, 1308, 1, 0, 0, 0, 1309, 1310, 1, 0, 0, 0, 1310, 1311, 1, 0, 0, 0, 1311, 1312, 5, 24, 0, 0, 1312, 1313, 3, 166, 83, 0, 1313, 1314, 5, 141, 0, 0, 1314, 1321, 3, 166, 83, 0, 1315, 1316, 5, 70, 0, 0, 1316, 1317, 5, 65, 0, 0, 1317, 1318, 3, 166, 83, 0, 1318, 1319, 5, 141, 0, 0, 1319, 1320, 3, 166, 83, 0, 1320, 1322, 1, 0, 0, 0, 1321, 1315, 1, 0, 0, 0, 1321, 1322, 1, 0, 0, 0, 1322, 1323, 1, 0, 0, 0, 1323, 1324, 5, 139, 0, 0, 1324, 1326, 1, 0, 0, 0, 1325, 1227, 1, 0, 0, 0, 1325, 1236, 1, 0, 0, 0, 1325, 1250, 1, 0, 0, 0, 1325, 1266, 1, 0, 0, 0, 1325, 1285, 1, 0, 0, 0, 1325, 1300, 1, 0, 0, 0, 1325, 1306, 1, 0, 0, 0, 1326, 145, 1, 0, 0, 0, 1327, 1328, 5, 54, 0, 0, 1328, 1329, 3, 166, 83, 0, 1329, 1330, 5, 61, 0, 0, 1330, 1331, 3, 166, 83, 0, 1331, 1332, 5, 141, 0, 0, 1332, 1334, 3, 166, 83, 0, 1333, 1335, 3, 142, 71, 0, 1334, 1333, 1, 0, 0, 0, 1334, 1335, 1, 0, 0, 0, 1335, 1336, 1, 0, 0, 0, 1336, 1337, 5, 139, 0, 0, 1337, 147, 1, 0, 0, 0, 1338, 1396, 3, 154, 77, 0, 1339, 1396, 5, 118, 0, 0, 1340, 1396, 5, 119, 0, 0, 1341, 1342, 5, 120, 0, 0, 1342, 1396, 3, 168, 84, 0, 1343, 1344, 5, 121, 0, 0, 1344, 1345, 5, 148, 0, 0, 1345, 1346, 3, 166, 83, 0, 1346, 1347, 5, 149, 0, 0, 1347, 1396, 1, 0, 0, 0, 1348, 1349, 5, 122, 0, 0, 1349, 1350, 5, 148, 0, 0, 1350, 1352, 3, 166, 83, 0, 1351, 1353, 3, 28, 14, 0, 1352, 1351, 1, 0, 0, 0, 1352, 1353, 1, 0, 0, 0, 1353, 1354, 1, 0, 0, 0, 1354, 1355, 5, 149, 0, 0, 1355, 1396, 1, 0, 0, 0, 1356, 1357, 5, 41, 0, 0, 1357, 1358, 5, 148, 0, 0, 1358, 1359, 3, 166, 83, 0, 1359, 1360, 5, 149, 0, 0, 1360, 1396, 1, 0, 0, 0, 1361, 1362, 5, 123, 0, 0, 1362, 1363, 5, 148, 0, 0, 1363, 1364, 3, 148, 74, 0, 1364, 1365, 5, 149, 0, 0, 1365, 1396, 1, 0, 0, 0, 1366, 1367, 5, 124, 0, 0, 1367, 1368, 5, 148, 0, 0, 1368, 1369, 3, 148, 74, 0, 1369, 1370, 5, 149, 0, 0, 1370, 1396, 1, 0, 0, 0, 1371, 1372, 5, 125, 0, 0, 1372, 1376, 5, 142, 0, 0, 1373, 1375, 3, 150, 75, 0, 1374, 1373, 1, 0, 0, 0, 1375, 1378, 1, 0, 0, 0, 1376, 1374, 1, 0, 0, 0, 1376, 1377, 1, 0, 0, 0, 1377, 1379, 1, 0, 0, 0, 1378, 1376, 1, 0, 0, 0, 1379, 1396, 5, 143, 0, 0, 1380, 1381, 5, 8, 0, 0, 1381, 1382, 5, 89, 0, 0, 1382, 1383, 3, 168, 84, 0, 1383, 1385, 5, 142, 0, 0, 1384, 1386, 3, 152, 76, 0, 1385, 1384, 1, 0, 0, 0, 1386, 1387, 1, 0, 0, 0, 1387, 1385, 1, 0, 0, 0, 1387, 1388, 1, 0, 0, 0, 1388, 1389, 1, 0, 0, 0, 1389, 1390, 5, 143, 0, 0, 1390, 1396, 1, 0, 0, 0, 1391, 1393, 3, 166, 83, 0, 1392, 1394, 3, 28, 14, 0, 1393, 1392, 1, 0, 0, 0, 1393, 1394, 1, 0, 0, 0, 1394, 1396, 1, 0, 0, 0, 1395, 1338, 1, 0, 0, 0, 1395, 1339, 1, 0, 0, 0, 1395, 1340, 1, 0, 0, 0, 1395, 1341, 1, 0, 0, 0, 1395, 1343, 1, 0, 0, 0, 1395, 1348, 1, 0, 0, 0, 1395, 1356, 1, 0, 0, 0, 1395, 1361, 1, 0, 0, 0, 1395, 1366, 1, 0, 0, 0, 1395, 1371, 1, 0, 0, 0, 1395, 1380, 1, 0, 0, 0, 1395, 1391, 1, 0, 0, 0, 1396, 149, 1, 0, 0, 0, 1397, 1398, 3, 166, 83, 0, 1398, 1399, 5, 138, 0, 0, 1399, 1400, 3, 148, 74, 0, 1400, 1401, 5, 139, 0, 0, 1401, 151, 1, 0, 0, 0, 1402, 1403, 3, 166, 83, 0, 1403, 1404, 5, 89, 0, 0, 1404, 1405, 3, 168, 84, 0, 1405, 1406, 5, 138, 0, 0, 1406, 1407, 3, 148, 74, 0, 1407, 1408, 5, 139, 0, 0, 1408, 153, 1, 0, 0, 0, 1409, 1410, 7, 7, 0, 0, 1410, 155, 1, 0, 0, 0, 1411, 1412, 7, 8, 0, 0, 1412, 157, 1, 0, 0, 0, 1413, 1422, 3, 168, 84, 0, 1414, 1422, 5, 152, 0, 0, 1415, 1422, 5, 153, 0, 0, 1416, 1422, 5, 134, 0, 0, 1417, 1422, 5, 135, 0, 0, 1418, 1422, 5, 136, 0, 0, 1419, 1422, 3, 160, 80, 0, 1420, 1422, 3, 164, 82, 0, 1421, 1413, 1, 0, 0, 0, 1421, 1414, 1, 0, 0, 0, 1421, 1415, 1, 0, 0, 0, 1421, 1416, 1, 0, 0, 0, 1421, 1417, 1, 0, 0, 0, 1421, 1418, 1, 0, 0, 0, 1421, 1419, 1, 0, 0, 0, 1421, 1420, 1, 0, 0, 0, 1422, 159, 1, 0, 0, 0, 1423, 1432, 5, 142, 0, 0, 1424, 1429, 3, 162, 81, 0, 1425, 1426, 5, 140, 0, 0, 1426, 1428, 3, 162, 81, 0, 1427, 1425, 1, 0, 0, 0, 1428, 1431, 1, 0, 0, 0, 1429, 1427, 1, 0, 0, 0, 1429, 1430, 1, 0, 0, 0, 1430, 1433, 1, 0, 0, 0, 1431, 1429, 1, 0, 0, 0, 1432, 1424, 1, 0, 0, 0, 1432, 1433, 1, 0, 0, 0, 1433, 1434, 1, 0, 0, 0, 1434, 1435, 5, 143, 0, 0, 1435, 161, 1, 0, 0, 0, 1436, 1437, 3, 168, 84, 0, 1437, 1438, 5, 138, 0, 0, 1438, 1439, 3, 158, 79, 0, 1439, 163, 1, 0, 0, 0, 1440, 1449, 5, 144, 0, 0, 1441, 1446, 3, 158, 79, 0, 1442, 1443, 5, 140, 0, 0, 1443, 1445, 3, 158, 79, 0, 1444, 1442, 1, 0, 0, 0, 1445, 1448, 1, 0, 0, 0, 1446, 1444, 1, 0, 0, 0, 1446, 1447, 1, 0, 0, 0, 1447, 1450, 1, 0, 0, 0, 1448, 1446, 1, 0, 0, 0, 1449, 1441, 1, 0, 0, 0, 1449, 1450, 1, 0, 0, 0, 1450, 1451, 1, 0, 0, 0, 1451, 1452, 5, 145, 0, 0, 1452, 165, 1, 0, 0, 0, 1453, 1454, 7, 9, 0, 0, 1454, 167, 1, 0, 0, 0, 1455, 1456, 5, 155, 0, 0, 1456, 169, 1, 0, 0, 0, 129, 182, 189, 210, 223, 235, 255, 263, 270, 276, 288, 291, 297, 308, 317, 327, 330, 332, 336, 344, 356, 361, 371, 381, 386, 401, 407, 419, 428, 436, 444, 457, 460, 470, 474, 480, 487, 493, 501, 509, 522, 529, 533, 538, 549, 555, 566, 592, 596, 602, 613, 622, 628, 633, 635, 666, 670, 676, 703, 713, 724, 727, 732, 735, 738, 745, 754, 757, 760, 763, 786, 795, 809, 830, 833, 836, 843, 851, 883, 895, 898, 902, 924, 938, 946, 958, 972, 989, 1007, 1011, 1014, 1018, 1021, 1027, 1031, 1036, 1040, 1044, 1050, 1064, 1079, 1099, 1108, 1140, 1160, 1190, 1200, 1203, 1206, 1208, 1222, 1246, 1262, 1271, 1281, 1294, 1309, 1321, 1325, 1334, 1352, 1376, 1387, 1393, 1395, 1421, 1429, 1432, 1446, 1449] \ No newline at end of file +[4, 1, 159, 1469, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 185, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 190, 8, 1, 10, 1, 12, 1, 193, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 211, 8, 3, 10, 3, 12, 3, 214, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 226, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 238, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 265, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 273, 8, 10, 1, 10, 1, 10, 1, 11, 5, 11, 278, 8, 11, 10, 11, 12, 11, 281, 9, 11, 1, 11, 1, 11, 1, 11, 3, 11, 286, 8, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 296, 8, 11, 10, 11, 12, 11, 299, 9, 11, 3, 11, 301, 8, 11, 1, 11, 1, 11, 5, 11, 305, 8, 11, 10, 11, 12, 11, 308, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 316, 8, 12, 10, 12, 12, 12, 319, 9, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 327, 8, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 5, 13, 335, 8, 13, 10, 13, 12, 13, 338, 9, 13, 3, 13, 340, 8, 13, 3, 13, 342, 8, 13, 1, 14, 1, 14, 3, 14, 346, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 5, 15, 352, 8, 15, 10, 15, 12, 15, 355, 9, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 366, 8, 16, 1, 17, 1, 17, 1, 17, 3, 17, 371, 8, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 381, 8, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 391, 8, 19, 1, 19, 1, 19, 1, 20, 3, 20, 396, 8, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 411, 8, 20, 1, 20, 1, 20, 1, 20, 1, 21, 3, 21, 417, 8, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 427, 8, 21, 10, 21, 12, 21, 430, 9, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 438, 8, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 446, 8, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 454, 8, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 467, 8, 22, 1, 23, 3, 23, 470, 8, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 480, 8, 23, 1, 23, 1, 23, 3, 23, 484, 8, 23, 1, 23, 1, 23, 5, 23, 488, 8, 23, 10, 23, 12, 23, 491, 9, 23, 1, 23, 1, 23, 1, 24, 1, 24, 3, 24, 497, 8, 24, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 503, 8, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 511, 8, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 519, 8, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 532, 8, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 539, 8, 26, 1, 26, 1, 26, 3, 26, 543, 8, 26, 1, 27, 5, 27, 546, 8, 27, 10, 27, 12, 27, 549, 9, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 559, 8, 27, 1, 27, 1, 27, 5, 27, 563, 8, 27, 10, 27, 12, 27, 566, 9, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 576, 8, 28, 1, 29, 1, 29, 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, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 3, 31, 602, 8, 31, 1, 31, 1, 31, 3, 31, 606, 8, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 612, 8, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 5, 31, 621, 8, 31, 10, 31, 12, 31, 624, 9, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 632, 8, 31, 1, 31, 1, 31, 5, 31, 636, 8, 31, 10, 31, 12, 31, 639, 9, 31, 1, 31, 1, 31, 3, 31, 643, 8, 31, 3, 31, 645, 8, 31, 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, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 5, 33, 674, 8, 33, 10, 33, 12, 33, 677, 9, 33, 1, 33, 3, 33, 680, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 686, 8, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 713, 8, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 3, 35, 723, 8, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 3, 35, 734, 8, 35, 1, 35, 3, 35, 737, 8, 35, 1, 35, 1, 35, 1, 35, 3, 35, 742, 8, 35, 1, 35, 3, 35, 745, 8, 35, 1, 35, 3, 35, 748, 8, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 3, 36, 755, 8, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 764, 8, 36, 1, 36, 3, 36, 767, 8, 36, 1, 36, 3, 36, 770, 8, 36, 1, 36, 3, 36, 773, 8, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 796, 8, 39, 3, 39, 798, 8, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 5, 40, 805, 8, 40, 10, 40, 12, 40, 808, 9, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 821, 8, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 5, 44, 840, 8, 44, 10, 44, 12, 44, 843, 9, 44, 3, 44, 845, 8, 44, 1, 44, 3, 44, 848, 8, 44, 1, 45, 1, 45, 1, 45, 5, 45, 853, 8, 45, 10, 45, 12, 45, 856, 9, 45, 1, 46, 1, 46, 1, 46, 5, 46, 861, 8, 46, 10, 46, 12, 46, 864, 9, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 895, 8, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 907, 8, 47, 1, 47, 3, 47, 910, 8, 47, 1, 47, 1, 47, 3, 47, 914, 8, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 936, 8, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 950, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 5, 48, 956, 8, 48, 10, 48, 12, 48, 959, 9, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 3, 51, 970, 8, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 984, 8, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 1001, 8, 53, 1, 54, 1, 54, 1, 54, 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, 3, 55, 1019, 8, 55, 1, 55, 1, 55, 3, 55, 1023, 8, 55, 1, 55, 3, 55, 1026, 8, 55, 1, 55, 1, 55, 3, 55, 1030, 8, 55, 1, 55, 3, 55, 1033, 8, 55, 1, 55, 1, 55, 1, 56, 1, 56, 3, 56, 1039, 8, 56, 1, 56, 1, 56, 3, 56, 1043, 8, 56, 1, 56, 1, 56, 1, 56, 3, 56, 1048, 8, 56, 1, 56, 1, 56, 3, 56, 1052, 8, 56, 1, 56, 1, 56, 3, 56, 1056, 8, 56, 1, 56, 1, 56, 5, 56, 1060, 8, 56, 10, 56, 12, 56, 1063, 9, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 1076, 8, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 5, 60, 1089, 8, 60, 10, 60, 12, 60, 1092, 9, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 1111, 8, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 5, 62, 1118, 8, 62, 10, 62, 12, 62, 1121, 9, 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, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1152, 8, 65, 1, 65, 1, 65, 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, 67, 1, 67, 3, 67, 1172, 8, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 3, 68, 1202, 8, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 3, 68, 1212, 8, 68, 1, 68, 3, 68, 1215, 8, 68, 1, 68, 3, 68, 1218, 8, 68, 3, 68, 1220, 8, 68, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 5, 72, 1232, 8, 72, 10, 72, 12, 72, 1235, 9, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1258, 8, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1274, 8, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1283, 8, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1293, 8, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 5, 73, 1304, 8, 73, 10, 73, 12, 73, 1307, 9, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1321, 8, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1333, 8, 73, 1, 73, 1, 73, 3, 73, 1337, 8, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 3, 74, 1346, 8, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 3, 75, 1364, 8, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 5, 75, 1386, 8, 75, 10, 75, 12, 75, 1389, 9, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 4, 75, 1397, 8, 75, 11, 75, 12, 75, 1398, 1, 75, 1, 75, 1, 75, 1, 75, 3, 75, 1405, 8, 75, 3, 75, 1407, 8, 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, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 3, 80, 1433, 8, 80, 1, 81, 1, 81, 1, 81, 1, 81, 5, 81, 1439, 8, 81, 10, 81, 12, 81, 1442, 9, 81, 3, 81, 1444, 8, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 5, 83, 1456, 8, 83, 10, 83, 12, 83, 1459, 9, 83, 3, 83, 1461, 8, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 0, 0, 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, 10, 1, 0, 50, 51, 2, 0, 17, 17, 35, 35, 1, 0, 13, 14, 1, 0, 107, 111, 3, 0, 1, 1, 102, 106, 108, 109, 3, 0, 1, 1, 102, 103, 108, 109, 2, 0, 104, 106, 108, 109, 1, 0, 127, 134, 1, 0, 114, 117, 13, 0, 1, 1, 4, 7, 10, 10, 12, 35, 42, 42, 48, 48, 78, 78, 85, 86, 100, 101, 105, 105, 112, 112, 121, 121, 155, 155, 1593, 0, 184, 1, 0, 0, 0, 2, 186, 1, 0, 0, 0, 4, 196, 1, 0, 0, 0, 6, 200, 1, 0, 0, 0, 8, 225, 1, 0, 0, 0, 10, 237, 1, 0, 0, 0, 12, 239, 1, 0, 0, 0, 14, 246, 1, 0, 0, 0, 16, 253, 1, 0, 0, 0, 18, 264, 1, 0, 0, 0, 20, 266, 1, 0, 0, 0, 22, 279, 1, 0, 0, 0, 24, 311, 1, 0, 0, 0, 26, 341, 1, 0, 0, 0, 28, 343, 1, 0, 0, 0, 30, 347, 1, 0, 0, 0, 32, 365, 1, 0, 0, 0, 34, 367, 1, 0, 0, 0, 36, 380, 1, 0, 0, 0, 38, 382, 1, 0, 0, 0, 40, 395, 1, 0, 0, 0, 42, 416, 1, 0, 0, 0, 44, 466, 1, 0, 0, 0, 46, 469, 1, 0, 0, 0, 48, 494, 1, 0, 0, 0, 50, 531, 1, 0, 0, 0, 52, 542, 1, 0, 0, 0, 54, 547, 1, 0, 0, 0, 56, 575, 1, 0, 0, 0, 58, 577, 1, 0, 0, 0, 60, 587, 1, 0, 0, 0, 62, 599, 1, 0, 0, 0, 64, 646, 1, 0, 0, 0, 66, 712, 1, 0, 0, 0, 68, 714, 1, 0, 0, 0, 70, 719, 1, 0, 0, 0, 72, 751, 1, 0, 0, 0, 74, 776, 1, 0, 0, 0, 76, 780, 1, 0, 0, 0, 78, 797, 1, 0, 0, 0, 80, 799, 1, 0, 0, 0, 82, 811, 1, 0, 0, 0, 84, 824, 1, 0, 0, 0, 86, 827, 1, 0, 0, 0, 88, 847, 1, 0, 0, 0, 90, 849, 1, 0, 0, 0, 92, 857, 1, 0, 0, 0, 94, 949, 1, 0, 0, 0, 96, 951, 1, 0, 0, 0, 98, 962, 1, 0, 0, 0, 100, 964, 1, 0, 0, 0, 102, 969, 1, 0, 0, 0, 104, 971, 1, 0, 0, 0, 106, 1000, 1, 0, 0, 0, 108, 1002, 1, 0, 0, 0, 110, 1011, 1, 0, 0, 0, 112, 1036, 1, 0, 0, 0, 114, 1066, 1, 0, 0, 0, 116, 1075, 1, 0, 0, 0, 118, 1077, 1, 0, 0, 0, 120, 1085, 1, 0, 0, 0, 122, 1110, 1, 0, 0, 0, 124, 1112, 1, 0, 0, 0, 126, 1124, 1, 0, 0, 0, 128, 1131, 1, 0, 0, 0, 130, 1145, 1, 0, 0, 0, 132, 1155, 1, 0, 0, 0, 134, 1171, 1, 0, 0, 0, 136, 1219, 1, 0, 0, 0, 138, 1221, 1, 0, 0, 0, 140, 1224, 1, 0, 0, 0, 142, 1226, 1, 0, 0, 0, 144, 1228, 1, 0, 0, 0, 146, 1336, 1, 0, 0, 0, 148, 1338, 1, 0, 0, 0, 150, 1406, 1, 0, 0, 0, 152, 1408, 1, 0, 0, 0, 154, 1413, 1, 0, 0, 0, 156, 1420, 1, 0, 0, 0, 158, 1422, 1, 0, 0, 0, 160, 1432, 1, 0, 0, 0, 162, 1434, 1, 0, 0, 0, 164, 1447, 1, 0, 0, 0, 166, 1451, 1, 0, 0, 0, 168, 1464, 1, 0, 0, 0, 170, 1466, 1, 0, 0, 0, 172, 173, 3, 6, 3, 0, 173, 174, 5, 0, 0, 1, 174, 185, 1, 0, 0, 0, 175, 176, 3, 22, 11, 0, 176, 177, 5, 0, 0, 1, 177, 185, 1, 0, 0, 0, 178, 179, 3, 54, 27, 0, 179, 180, 5, 0, 0, 1, 180, 185, 1, 0, 0, 0, 181, 182, 3, 2, 1, 0, 182, 183, 5, 0, 0, 1, 183, 185, 1, 0, 0, 0, 184, 172, 1, 0, 0, 0, 184, 175, 1, 0, 0, 0, 184, 178, 1, 0, 0, 0, 184, 181, 1, 0, 0, 0, 185, 1, 1, 0, 0, 0, 186, 187, 5, 42, 0, 0, 187, 191, 5, 143, 0, 0, 188, 190, 3, 8, 4, 0, 189, 188, 1, 0, 0, 0, 190, 193, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 191, 192, 1, 0, 0, 0, 192, 194, 1, 0, 0, 0, 193, 191, 1, 0, 0, 0, 194, 195, 5, 144, 0, 0, 195, 3, 1, 0, 0, 0, 196, 197, 5, 43, 0, 0, 197, 198, 3, 170, 85, 0, 198, 199, 5, 140, 0, 0, 199, 5, 1, 0, 0, 0, 200, 201, 5, 11, 0, 0, 201, 202, 3, 168, 84, 0, 202, 203, 5, 90, 0, 0, 203, 204, 3, 170, 85, 0, 204, 205, 5, 81, 0, 0, 205, 206, 3, 170, 85, 0, 206, 207, 5, 80, 0, 0, 207, 208, 3, 170, 85, 0, 208, 212, 5, 143, 0, 0, 209, 211, 3, 8, 4, 0, 210, 209, 1, 0, 0, 0, 211, 214, 1, 0, 0, 0, 212, 210, 1, 0, 0, 0, 212, 213, 1, 0, 0, 0, 213, 215, 1, 0, 0, 0, 214, 212, 1, 0, 0, 0, 215, 216, 5, 144, 0, 0, 216, 7, 1, 0, 0, 0, 217, 226, 3, 4, 2, 0, 218, 226, 3, 20, 10, 0, 219, 226, 3, 10, 5, 0, 220, 226, 3, 100, 50, 0, 221, 226, 3, 112, 56, 0, 222, 226, 3, 148, 74, 0, 223, 226, 3, 60, 30, 0, 224, 226, 3, 34, 17, 0, 225, 217, 1, 0, 0, 0, 225, 218, 1, 0, 0, 0, 225, 219, 1, 0, 0, 0, 225, 220, 1, 0, 0, 0, 225, 221, 1, 0, 0, 0, 225, 222, 1, 0, 0, 0, 225, 223, 1, 0, 0, 0, 225, 224, 1, 0, 0, 0, 226, 9, 1, 0, 0, 0, 227, 228, 5, 43, 0, 0, 228, 229, 5, 47, 0, 0, 229, 230, 3, 168, 84, 0, 230, 231, 5, 140, 0, 0, 231, 238, 1, 0, 0, 0, 232, 233, 5, 43, 0, 0, 233, 234, 5, 49, 0, 0, 234, 235, 3, 168, 84, 0, 235, 236, 5, 140, 0, 0, 236, 238, 1, 0, 0, 0, 237, 227, 1, 0, 0, 0, 237, 232, 1, 0, 0, 0, 238, 11, 1, 0, 0, 0, 239, 240, 5, 44, 0, 0, 240, 241, 5, 46, 0, 0, 241, 242, 3, 168, 84, 0, 242, 243, 5, 90, 0, 0, 243, 244, 3, 170, 85, 0, 244, 245, 5, 140, 0, 0, 245, 13, 1, 0, 0, 0, 246, 247, 5, 44, 0, 0, 247, 248, 5, 47, 0, 0, 248, 249, 3, 168, 84, 0, 249, 250, 5, 81, 0, 0, 250, 251, 3, 170, 85, 0, 251, 252, 5, 140, 0, 0, 252, 15, 1, 0, 0, 0, 253, 254, 5, 45, 0, 0, 254, 255, 3, 168, 84, 0, 255, 256, 5, 90, 0, 0, 256, 257, 3, 170, 85, 0, 257, 258, 5, 140, 0, 0, 258, 17, 1, 0, 0, 0, 259, 265, 3, 10, 5, 0, 260, 265, 3, 12, 6, 0, 261, 265, 3, 14, 7, 0, 262, 265, 3, 16, 8, 0, 263, 265, 3, 34, 17, 0, 264, 259, 1, 0, 0, 0, 264, 260, 1, 0, 0, 0, 264, 261, 1, 0, 0, 0, 264, 262, 1, 0, 0, 0, 264, 263, 1, 0, 0, 0, 265, 19, 1, 0, 0, 0, 266, 267, 5, 46, 0, 0, 267, 268, 3, 168, 84, 0, 268, 269, 5, 90, 0, 0, 269, 272, 3, 170, 85, 0, 270, 271, 5, 91, 0, 0, 271, 273, 3, 170, 85, 0, 272, 270, 1, 0, 0, 0, 272, 273, 1, 0, 0, 0, 273, 274, 1, 0, 0, 0, 274, 275, 5, 140, 0, 0, 275, 21, 1, 0, 0, 0, 276, 278, 3, 18, 9, 0, 277, 276, 1, 0, 0, 0, 278, 281, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 279, 280, 1, 0, 0, 0, 280, 282, 1, 0, 0, 0, 281, 279, 1, 0, 0, 0, 282, 283, 5, 47, 0, 0, 283, 285, 3, 168, 84, 0, 284, 286, 3, 24, 12, 0, 285, 284, 1, 0, 0, 0, 285, 286, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 288, 5, 90, 0, 0, 288, 289, 3, 170, 85, 0, 289, 290, 5, 81, 0, 0, 290, 300, 3, 170, 85, 0, 291, 292, 5, 95, 0, 0, 292, 297, 3, 28, 14, 0, 293, 294, 5, 141, 0, 0, 294, 296, 3, 28, 14, 0, 295, 293, 1, 0, 0, 0, 296, 299, 1, 0, 0, 0, 297, 295, 1, 0, 0, 0, 297, 298, 1, 0, 0, 0, 298, 301, 1, 0, 0, 0, 299, 297, 1, 0, 0, 0, 300, 291, 1, 0, 0, 0, 300, 301, 1, 0, 0, 0, 301, 302, 1, 0, 0, 0, 302, 306, 5, 143, 0, 0, 303, 305, 3, 36, 18, 0, 304, 303, 1, 0, 0, 0, 305, 308, 1, 0, 0, 0, 306, 304, 1, 0, 0, 0, 306, 307, 1, 0, 0, 0, 307, 309, 1, 0, 0, 0, 308, 306, 1, 0, 0, 0, 309, 310, 5, 144, 0, 0, 310, 23, 1, 0, 0, 0, 311, 312, 5, 149, 0, 0, 312, 317, 3, 26, 13, 0, 313, 314, 5, 141, 0, 0, 314, 316, 3, 26, 13, 0, 315, 313, 1, 0, 0, 0, 316, 319, 1, 0, 0, 0, 317, 315, 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 320, 1, 0, 0, 0, 319, 317, 1, 0, 0, 0, 320, 321, 5, 150, 0, 0, 321, 25, 1, 0, 0, 0, 322, 323, 5, 50, 0, 0, 323, 326, 3, 168, 84, 0, 324, 325, 5, 139, 0, 0, 325, 327, 5, 39, 0, 0, 326, 324, 1, 0, 0, 0, 326, 327, 1, 0, 0, 0, 327, 342, 1, 0, 0, 0, 328, 329, 5, 38, 0, 0, 329, 339, 3, 168, 84, 0, 330, 331, 5, 40, 0, 0, 331, 336, 3, 28, 14, 0, 332, 333, 5, 151, 0, 0, 333, 335, 3, 28, 14, 0, 334, 332, 1, 0, 0, 0, 335, 338, 1, 0, 0, 0, 336, 334, 1, 0, 0, 0, 336, 337, 1, 0, 0, 0, 337, 340, 1, 0, 0, 0, 338, 336, 1, 0, 0, 0, 339, 330, 1, 0, 0, 0, 339, 340, 1, 0, 0, 0, 340, 342, 1, 0, 0, 0, 341, 322, 1, 0, 0, 0, 341, 328, 1, 0, 0, 0, 342, 27, 1, 0, 0, 0, 343, 345, 3, 168, 84, 0, 344, 346, 3, 30, 15, 0, 345, 344, 1, 0, 0, 0, 345, 346, 1, 0, 0, 0, 346, 29, 1, 0, 0, 0, 347, 348, 5, 149, 0, 0, 348, 353, 3, 32, 16, 0, 349, 350, 5, 141, 0, 0, 350, 352, 3, 32, 16, 0, 351, 349, 1, 0, 0, 0, 352, 355, 1, 0, 0, 0, 353, 351, 1, 0, 0, 0, 353, 354, 1, 0, 0, 0, 354, 356, 1, 0, 0, 0, 355, 353, 1, 0, 0, 0, 356, 357, 5, 150, 0, 0, 357, 31, 1, 0, 0, 0, 358, 359, 5, 46, 0, 0, 359, 366, 3, 168, 84, 0, 360, 361, 5, 47, 0, 0, 361, 366, 3, 28, 14, 0, 362, 363, 5, 38, 0, 0, 363, 366, 3, 168, 84, 0, 364, 366, 3, 150, 75, 0, 365, 358, 1, 0, 0, 0, 365, 360, 1, 0, 0, 0, 365, 362, 1, 0, 0, 0, 365, 364, 1, 0, 0, 0, 366, 33, 1, 0, 0, 0, 367, 368, 5, 37, 0, 0, 368, 370, 3, 168, 84, 0, 369, 371, 3, 24, 12, 0, 370, 369, 1, 0, 0, 0, 370, 371, 1, 0, 0, 0, 371, 372, 1, 0, 0, 0, 372, 373, 5, 152, 0, 0, 373, 374, 3, 150, 75, 0, 374, 375, 5, 140, 0, 0, 375, 35, 1, 0, 0, 0, 376, 381, 3, 42, 21, 0, 377, 381, 3, 46, 23, 0, 378, 381, 3, 40, 20, 0, 379, 381, 3, 38, 19, 0, 380, 376, 1, 0, 0, 0, 380, 377, 1, 0, 0, 0, 380, 378, 1, 0, 0, 0, 380, 379, 1, 0, 0, 0, 381, 37, 1, 0, 0, 0, 382, 383, 5, 2, 0, 0, 383, 384, 3, 168, 84, 0, 384, 385, 5, 90, 0, 0, 385, 386, 3, 170, 85, 0, 386, 387, 5, 3, 0, 0, 387, 390, 3, 170, 85, 0, 388, 389, 5, 5, 0, 0, 389, 391, 3, 52, 26, 0, 390, 388, 1, 0, 0, 0, 390, 391, 1, 0, 0, 0, 391, 392, 1, 0, 0, 0, 392, 393, 5, 140, 0, 0, 393, 39, 1, 0, 0, 0, 394, 396, 5, 61, 0, 0, 395, 394, 1, 0, 0, 0, 395, 396, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 398, 5, 53, 0, 0, 398, 399, 3, 168, 84, 0, 399, 400, 5, 90, 0, 0, 400, 401, 3, 170, 85, 0, 401, 402, 5, 139, 0, 0, 402, 403, 3, 150, 75, 0, 403, 404, 5, 138, 0, 0, 404, 405, 3, 150, 75, 0, 405, 406, 5, 143, 0, 0, 406, 407, 5, 107, 0, 0, 407, 408, 5, 90, 0, 0, 408, 410, 3, 170, 85, 0, 409, 411, 3, 78, 39, 0, 410, 409, 1, 0, 0, 0, 410, 411, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 413, 5, 140, 0, 0, 413, 414, 5, 144, 0, 0, 414, 41, 1, 0, 0, 0, 415, 417, 3, 48, 24, 0, 416, 415, 1, 0, 0, 0, 416, 417, 1, 0, 0, 0, 417, 418, 1, 0, 0, 0, 418, 419, 7, 0, 0, 0, 419, 420, 3, 168, 84, 0, 420, 421, 5, 90, 0, 0, 421, 422, 3, 170, 85, 0, 422, 423, 5, 139, 0, 0, 423, 424, 3, 150, 75, 0, 424, 428, 5, 143, 0, 0, 425, 427, 3, 44, 22, 0, 426, 425, 1, 0, 0, 0, 427, 430, 1, 0, 0, 0, 428, 426, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 431, 1, 0, 0, 0, 430, 428, 1, 0, 0, 0, 431, 432, 5, 144, 0, 0, 432, 43, 1, 0, 0, 0, 433, 434, 5, 97, 0, 0, 434, 435, 5, 90, 0, 0, 435, 437, 3, 170, 85, 0, 436, 438, 3, 78, 39, 0, 437, 436, 1, 0, 0, 0, 437, 438, 1, 0, 0, 0, 438, 439, 1, 0, 0, 0, 439, 440, 5, 140, 0, 0, 440, 467, 1, 0, 0, 0, 441, 442, 5, 98, 0, 0, 442, 443, 5, 90, 0, 0, 443, 445, 3, 170, 85, 0, 444, 446, 3, 78, 39, 0, 445, 444, 1, 0, 0, 0, 445, 446, 1, 0, 0, 0, 446, 447, 1, 0, 0, 0, 447, 448, 5, 140, 0, 0, 448, 467, 1, 0, 0, 0, 449, 450, 5, 1, 0, 0, 450, 451, 5, 90, 0, 0, 451, 453, 3, 170, 85, 0, 452, 454, 3, 78, 39, 0, 453, 452, 1, 0, 0, 0, 453, 454, 1, 0, 0, 0, 454, 455, 1, 0, 0, 0, 455, 456, 5, 140, 0, 0, 456, 467, 1, 0, 0, 0, 457, 458, 5, 99, 0, 0, 458, 459, 5, 100, 0, 0, 459, 460, 5, 90, 0, 0, 460, 461, 3, 170, 85, 0, 461, 462, 5, 101, 0, 0, 462, 463, 5, 90, 0, 0, 463, 464, 3, 170, 85, 0, 464, 465, 5, 140, 0, 0, 465, 467, 1, 0, 0, 0, 466, 433, 1, 0, 0, 0, 466, 441, 1, 0, 0, 0, 466, 449, 1, 0, 0, 0, 466, 457, 1, 0, 0, 0, 467, 45, 1, 0, 0, 0, 468, 470, 3, 48, 24, 0, 469, 468, 1, 0, 0, 0, 469, 470, 1, 0, 0, 0, 470, 471, 1, 0, 0, 0, 471, 472, 5, 52, 0, 0, 472, 473, 3, 168, 84, 0, 473, 474, 5, 90, 0, 0, 474, 475, 3, 170, 85, 0, 475, 476, 5, 139, 0, 0, 476, 477, 3, 158, 79, 0, 477, 479, 3, 52, 26, 0, 478, 480, 5, 118, 0, 0, 479, 478, 1, 0, 0, 0, 479, 480, 1, 0, 0, 0, 480, 483, 1, 0, 0, 0, 481, 482, 5, 88, 0, 0, 482, 484, 3, 170, 85, 0, 483, 481, 1, 0, 0, 0, 483, 484, 1, 0, 0, 0, 484, 485, 1, 0, 0, 0, 485, 489, 5, 143, 0, 0, 486, 488, 3, 50, 25, 0, 487, 486, 1, 0, 0, 0, 488, 491, 1, 0, 0, 0, 489, 487, 1, 0, 0, 0, 489, 490, 1, 0, 0, 0, 490, 492, 1, 0, 0, 0, 491, 489, 1, 0, 0, 0, 492, 493, 5, 144, 0, 0, 493, 47, 1, 0, 0, 0, 494, 496, 5, 34, 0, 0, 495, 497, 7, 1, 0, 0, 496, 495, 1, 0, 0, 0, 496, 497, 1, 0, 0, 0, 497, 49, 1, 0, 0, 0, 498, 499, 5, 104, 0, 0, 499, 500, 5, 90, 0, 0, 500, 502, 3, 170, 85, 0, 501, 503, 3, 78, 39, 0, 502, 501, 1, 0, 0, 0, 502, 503, 1, 0, 0, 0, 503, 504, 1, 0, 0, 0, 504, 505, 5, 140, 0, 0, 505, 532, 1, 0, 0, 0, 506, 507, 5, 105, 0, 0, 507, 508, 5, 90, 0, 0, 508, 510, 3, 170, 85, 0, 509, 511, 3, 78, 39, 0, 510, 509, 1, 0, 0, 0, 510, 511, 1, 0, 0, 0, 511, 512, 1, 0, 0, 0, 512, 513, 5, 140, 0, 0, 513, 532, 1, 0, 0, 0, 514, 515, 5, 106, 0, 0, 515, 516, 5, 90, 0, 0, 516, 518, 3, 170, 85, 0, 517, 519, 3, 78, 39, 0, 518, 517, 1, 0, 0, 0, 518, 519, 1, 0, 0, 0, 519, 520, 1, 0, 0, 0, 520, 521, 5, 140, 0, 0, 521, 532, 1, 0, 0, 0, 522, 523, 5, 99, 0, 0, 523, 524, 5, 100, 0, 0, 524, 525, 5, 90, 0, 0, 525, 526, 3, 170, 85, 0, 526, 527, 5, 101, 0, 0, 527, 528, 5, 90, 0, 0, 528, 529, 3, 170, 85, 0, 529, 530, 5, 140, 0, 0, 530, 532, 1, 0, 0, 0, 531, 498, 1, 0, 0, 0, 531, 506, 1, 0, 0, 0, 531, 514, 1, 0, 0, 0, 531, 522, 1, 0, 0, 0, 532, 51, 1, 0, 0, 0, 533, 534, 5, 46, 0, 0, 534, 543, 3, 168, 84, 0, 535, 536, 5, 47, 0, 0, 536, 538, 3, 168, 84, 0, 537, 539, 3, 30, 15, 0, 538, 537, 1, 0, 0, 0, 538, 539, 1, 0, 0, 0, 539, 543, 1, 0, 0, 0, 540, 541, 5, 38, 0, 0, 541, 543, 3, 168, 84, 0, 542, 533, 1, 0, 0, 0, 542, 535, 1, 0, 0, 0, 542, 540, 1, 0, 0, 0, 543, 53, 1, 0, 0, 0, 544, 546, 3, 18, 9, 0, 545, 544, 1, 0, 0, 0, 546, 549, 1, 0, 0, 0, 547, 545, 1, 0, 0, 0, 547, 548, 1, 0, 0, 0, 548, 550, 1, 0, 0, 0, 549, 547, 1, 0, 0, 0, 550, 551, 5, 49, 0, 0, 551, 552, 3, 168, 84, 0, 552, 553, 5, 90, 0, 0, 553, 554, 3, 170, 85, 0, 554, 555, 5, 81, 0, 0, 555, 558, 3, 170, 85, 0, 556, 557, 5, 82, 0, 0, 557, 559, 5, 153, 0, 0, 558, 556, 1, 0, 0, 0, 558, 559, 1, 0, 0, 0, 559, 560, 1, 0, 0, 0, 560, 564, 5, 143, 0, 0, 561, 563, 3, 56, 28, 0, 562, 561, 1, 0, 0, 0, 563, 566, 1, 0, 0, 0, 564, 562, 1, 0, 0, 0, 564, 565, 1, 0, 0, 0, 565, 567, 1, 0, 0, 0, 566, 564, 1, 0, 0, 0, 567, 568, 5, 144, 0, 0, 568, 55, 1, 0, 0, 0, 569, 576, 3, 70, 35, 0, 570, 576, 3, 72, 36, 0, 571, 576, 3, 82, 41, 0, 572, 576, 3, 62, 31, 0, 573, 576, 3, 64, 32, 0, 574, 576, 3, 58, 29, 0, 575, 569, 1, 0, 0, 0, 575, 570, 1, 0, 0, 0, 575, 571, 1, 0, 0, 0, 575, 572, 1, 0, 0, 0, 575, 573, 1, 0, 0, 0, 575, 574, 1, 0, 0, 0, 576, 57, 1, 0, 0, 0, 577, 578, 5, 2, 0, 0, 578, 579, 3, 168, 84, 0, 579, 580, 5, 90, 0, 0, 580, 581, 3, 170, 85, 0, 581, 582, 5, 40, 0, 0, 582, 583, 3, 28, 14, 0, 583, 584, 5, 142, 0, 0, 584, 585, 3, 168, 84, 0, 585, 586, 5, 140, 0, 0, 586, 59, 1, 0, 0, 0, 587, 588, 5, 4, 0, 0, 588, 589, 3, 168, 84, 0, 589, 590, 5, 90, 0, 0, 590, 591, 3, 170, 85, 0, 591, 592, 5, 6, 0, 0, 592, 593, 3, 28, 14, 0, 593, 594, 5, 69, 0, 0, 594, 595, 3, 168, 84, 0, 595, 596, 5, 142, 0, 0, 596, 597, 3, 168, 84, 0, 597, 598, 5, 140, 0, 0, 598, 61, 1, 0, 0, 0, 599, 601, 5, 24, 0, 0, 600, 602, 5, 42, 0, 0, 601, 600, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 603, 1, 0, 0, 0, 603, 605, 3, 168, 84, 0, 604, 606, 3, 24, 12, 0, 605, 604, 1, 0, 0, 0, 605, 606, 1, 0, 0, 0, 606, 607, 1, 0, 0, 0, 607, 608, 5, 90, 0, 0, 608, 609, 3, 170, 85, 0, 609, 611, 5, 27, 0, 0, 610, 612, 5, 11, 0, 0, 611, 610, 1, 0, 0, 0, 611, 612, 1, 0, 0, 0, 612, 613, 1, 0, 0, 0, 613, 614, 3, 28, 14, 0, 614, 615, 5, 28, 0, 0, 615, 644, 3, 170, 85, 0, 616, 617, 5, 53, 0, 0, 617, 618, 3, 170, 85, 0, 618, 622, 5, 143, 0, 0, 619, 621, 3, 66, 33, 0, 620, 619, 1, 0, 0, 0, 621, 624, 1, 0, 0, 0, 622, 620, 1, 0, 0, 0, 622, 623, 1, 0, 0, 0, 623, 625, 1, 0, 0, 0, 624, 622, 1, 0, 0, 0, 625, 626, 5, 144, 0, 0, 626, 645, 1, 0, 0, 0, 627, 628, 5, 42, 0, 0, 628, 631, 3, 170, 85, 0, 629, 630, 5, 53, 0, 0, 630, 632, 3, 170, 85, 0, 631, 629, 1, 0, 0, 0, 631, 632, 1, 0, 0, 0, 632, 642, 1, 0, 0, 0, 633, 637, 5, 143, 0, 0, 634, 636, 3, 66, 33, 0, 635, 634, 1, 0, 0, 0, 636, 639, 1, 0, 0, 0, 637, 635, 1, 0, 0, 0, 637, 638, 1, 0, 0, 0, 638, 640, 1, 0, 0, 0, 639, 637, 1, 0, 0, 0, 640, 643, 5, 144, 0, 0, 641, 643, 5, 140, 0, 0, 642, 633, 1, 0, 0, 0, 642, 641, 1, 0, 0, 0, 643, 645, 1, 0, 0, 0, 644, 616, 1, 0, 0, 0, 644, 627, 1, 0, 0, 0, 645, 63, 1, 0, 0, 0, 646, 647, 5, 24, 0, 0, 647, 648, 3, 168, 84, 0, 648, 649, 5, 90, 0, 0, 649, 650, 3, 170, 85, 0, 650, 651, 5, 26, 0, 0, 651, 652, 3, 168, 84, 0, 652, 653, 3, 30, 15, 0, 653, 654, 5, 140, 0, 0, 654, 65, 1, 0, 0, 0, 655, 656, 5, 18, 0, 0, 656, 713, 5, 140, 0, 0, 657, 658, 5, 19, 0, 0, 658, 659, 5, 20, 0, 0, 659, 660, 3, 168, 84, 0, 660, 661, 5, 140, 0, 0, 661, 713, 1, 0, 0, 0, 662, 663, 5, 29, 0, 0, 663, 664, 3, 170, 85, 0, 664, 665, 5, 140, 0, 0, 665, 713, 1, 0, 0, 0, 666, 667, 5, 29, 0, 0, 667, 668, 3, 168, 84, 0, 668, 669, 5, 142, 0, 0, 669, 679, 3, 168, 84, 0, 670, 671, 5, 68, 0, 0, 671, 675, 5, 143, 0, 0, 672, 674, 3, 68, 34, 0, 673, 672, 1, 0, 0, 0, 674, 677, 1, 0, 0, 0, 675, 673, 1, 0, 0, 0, 675, 676, 1, 0, 0, 0, 676, 678, 1, 0, 0, 0, 677, 675, 1, 0, 0, 0, 678, 680, 5, 144, 0, 0, 679, 670, 1, 0, 0, 0, 679, 680, 1, 0, 0, 0, 680, 681, 1, 0, 0, 0, 681, 682, 5, 140, 0, 0, 682, 713, 1, 0, 0, 0, 683, 685, 5, 30, 0, 0, 684, 686, 5, 38, 0, 0, 685, 684, 1, 0, 0, 0, 685, 686, 1, 0, 0, 0, 686, 687, 1, 0, 0, 0, 687, 688, 3, 168, 84, 0, 688, 689, 5, 59, 0, 0, 689, 690, 3, 28, 14, 0, 690, 691, 5, 140, 0, 0, 691, 713, 1, 0, 0, 0, 692, 693, 5, 31, 0, 0, 693, 694, 3, 168, 84, 0, 694, 695, 5, 153, 0, 0, 695, 696, 5, 140, 0, 0, 696, 713, 1, 0, 0, 0, 697, 698, 5, 32, 0, 0, 698, 699, 3, 28, 14, 0, 699, 700, 5, 142, 0, 0, 700, 701, 3, 168, 84, 0, 701, 702, 3, 168, 84, 0, 702, 703, 3, 170, 85, 0, 703, 704, 5, 140, 0, 0, 704, 713, 1, 0, 0, 0, 705, 706, 5, 99, 0, 0, 706, 713, 5, 140, 0, 0, 707, 708, 5, 33, 0, 0, 708, 709, 5, 153, 0, 0, 709, 710, 3, 170, 85, 0, 710, 711, 5, 140, 0, 0, 711, 713, 1, 0, 0, 0, 712, 655, 1, 0, 0, 0, 712, 657, 1, 0, 0, 0, 712, 662, 1, 0, 0, 0, 712, 666, 1, 0, 0, 0, 712, 683, 1, 0, 0, 0, 712, 692, 1, 0, 0, 0, 712, 697, 1, 0, 0, 0, 712, 705, 1, 0, 0, 0, 712, 707, 1, 0, 0, 0, 713, 67, 1, 0, 0, 0, 714, 715, 3, 168, 84, 0, 715, 716, 5, 62, 0, 0, 716, 717, 3, 168, 84, 0, 717, 718, 5, 140, 0, 0, 718, 69, 1, 0, 0, 0, 719, 720, 5, 53, 0, 0, 720, 722, 3, 168, 84, 0, 721, 723, 3, 24, 12, 0, 722, 721, 1, 0, 0, 0, 722, 723, 1, 0, 0, 0, 723, 724, 1, 0, 0, 0, 724, 725, 5, 90, 0, 0, 725, 726, 3, 170, 85, 0, 726, 727, 5, 139, 0, 0, 727, 728, 3, 150, 75, 0, 728, 729, 5, 138, 0, 0, 729, 730, 3, 150, 75, 0, 730, 731, 5, 92, 0, 0, 731, 733, 3, 86, 43, 0, 732, 734, 3, 78, 39, 0, 733, 732, 1, 0, 0, 0, 733, 734, 1, 0, 0, 0, 734, 736, 1, 0, 0, 0, 735, 737, 3, 84, 42, 0, 736, 735, 1, 0, 0, 0, 736, 737, 1, 0, 0, 0, 737, 738, 1, 0, 0, 0, 738, 739, 5, 94, 0, 0, 739, 741, 3, 88, 44, 0, 740, 742, 3, 92, 46, 0, 741, 740, 1, 0, 0, 0, 741, 742, 1, 0, 0, 0, 742, 744, 1, 0, 0, 0, 743, 745, 3, 76, 38, 0, 744, 743, 1, 0, 0, 0, 744, 745, 1, 0, 0, 0, 745, 747, 1, 0, 0, 0, 746, 748, 3, 74, 37, 0, 747, 746, 1, 0, 0, 0, 747, 748, 1, 0, 0, 0, 748, 749, 1, 0, 0, 0, 749, 750, 5, 140, 0, 0, 750, 71, 1, 0, 0, 0, 751, 752, 5, 54, 0, 0, 752, 754, 3, 168, 84, 0, 753, 755, 3, 24, 12, 0, 754, 753, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 756, 1, 0, 0, 0, 756, 757, 5, 90, 0, 0, 757, 758, 3, 170, 85, 0, 758, 759, 5, 139, 0, 0, 759, 760, 3, 150, 75, 0, 760, 761, 5, 138, 0, 0, 761, 763, 3, 150, 75, 0, 762, 764, 3, 78, 39, 0, 763, 762, 1, 0, 0, 0, 763, 764, 1, 0, 0, 0, 764, 766, 1, 0, 0, 0, 765, 767, 3, 92, 46, 0, 766, 765, 1, 0, 0, 0, 766, 767, 1, 0, 0, 0, 767, 769, 1, 0, 0, 0, 768, 770, 3, 76, 38, 0, 769, 768, 1, 0, 0, 0, 769, 770, 1, 0, 0, 0, 770, 772, 1, 0, 0, 0, 771, 773, 3, 74, 37, 0, 772, 771, 1, 0, 0, 0, 772, 773, 1, 0, 0, 0, 773, 774, 1, 0, 0, 0, 774, 775, 5, 140, 0, 0, 775, 73, 1, 0, 0, 0, 776, 777, 5, 70, 0, 0, 777, 778, 5, 69, 0, 0, 778, 779, 3, 168, 84, 0, 779, 75, 1, 0, 0, 0, 780, 781, 5, 9, 0, 0, 781, 782, 5, 7, 0, 0, 782, 783, 3, 168, 84, 0, 783, 784, 5, 69, 0, 0, 784, 785, 3, 170, 85, 0, 785, 77, 1, 0, 0, 0, 786, 787, 5, 12, 0, 0, 787, 798, 5, 15, 0, 0, 788, 789, 5, 12, 0, 0, 789, 795, 7, 2, 0, 0, 790, 791, 5, 16, 0, 0, 791, 792, 5, 145, 0, 0, 792, 793, 3, 90, 45, 0, 793, 794, 5, 146, 0, 0, 794, 796, 1, 0, 0, 0, 795, 790, 1, 0, 0, 0, 795, 796, 1, 0, 0, 0, 796, 798, 1, 0, 0, 0, 797, 786, 1, 0, 0, 0, 797, 788, 1, 0, 0, 0, 798, 79, 1, 0, 0, 0, 799, 800, 5, 69, 0, 0, 800, 801, 5, 145, 0, 0, 801, 806, 3, 132, 66, 0, 802, 803, 5, 141, 0, 0, 803, 805, 3, 132, 66, 0, 804, 802, 1, 0, 0, 0, 805, 808, 1, 0, 0, 0, 806, 804, 1, 0, 0, 0, 806, 807, 1, 0, 0, 0, 807, 809, 1, 0, 0, 0, 808, 806, 1, 0, 0, 0, 809, 810, 5, 146, 0, 0, 810, 81, 1, 0, 0, 0, 811, 812, 5, 55, 0, 0, 812, 813, 3, 168, 84, 0, 813, 814, 5, 90, 0, 0, 814, 815, 3, 170, 85, 0, 815, 816, 5, 56, 0, 0, 816, 817, 3, 168, 84, 0, 817, 818, 5, 139, 0, 0, 818, 820, 3, 150, 75, 0, 819, 821, 3, 92, 46, 0, 820, 819, 1, 0, 0, 0, 820, 821, 1, 0, 0, 0, 821, 822, 1, 0, 0, 0, 822, 823, 5, 140, 0, 0, 823, 83, 1, 0, 0, 0, 824, 825, 5, 93, 0, 0, 825, 826, 3, 150, 75, 0, 826, 85, 1, 0, 0, 0, 827, 828, 7, 3, 0, 0, 828, 87, 1, 0, 0, 0, 829, 848, 5, 96, 0, 0, 830, 831, 5, 46, 0, 0, 831, 848, 3, 168, 84, 0, 832, 833, 5, 38, 0, 0, 833, 848, 3, 168, 84, 0, 834, 835, 5, 48, 0, 0, 835, 844, 5, 145, 0, 0, 836, 841, 3, 28, 14, 0, 837, 838, 5, 141, 0, 0, 838, 840, 3, 28, 14, 0, 839, 837, 1, 0, 0, 0, 840, 843, 1, 0, 0, 0, 841, 839, 1, 0, 0, 0, 841, 842, 1, 0, 0, 0, 842, 845, 1, 0, 0, 0, 843, 841, 1, 0, 0, 0, 844, 836, 1, 0, 0, 0, 844, 845, 1, 0, 0, 0, 845, 846, 1, 0, 0, 0, 846, 848, 5, 146, 0, 0, 847, 829, 1, 0, 0, 0, 847, 830, 1, 0, 0, 0, 847, 832, 1, 0, 0, 0, 847, 834, 1, 0, 0, 0, 848, 89, 1, 0, 0, 0, 849, 854, 3, 168, 84, 0, 850, 851, 5, 141, 0, 0, 851, 853, 3, 168, 84, 0, 852, 850, 1, 0, 0, 0, 853, 856, 1, 0, 0, 0, 854, 852, 1, 0, 0, 0, 854, 855, 1, 0, 0, 0, 855, 91, 1, 0, 0, 0, 856, 854, 1, 0, 0, 0, 857, 858, 5, 95, 0, 0, 858, 862, 5, 143, 0, 0, 859, 861, 3, 94, 47, 0, 860, 859, 1, 0, 0, 0, 861, 864, 1, 0, 0, 0, 862, 860, 1, 0, 0, 0, 862, 863, 1, 0, 0, 0, 863, 865, 1, 0, 0, 0, 864, 862, 1, 0, 0, 0, 865, 866, 5, 144, 0, 0, 866, 93, 1, 0, 0, 0, 867, 868, 5, 25, 0, 0, 868, 869, 3, 168, 84, 0, 869, 870, 5, 90, 0, 0, 870, 871, 3, 170, 85, 0, 871, 872, 5, 145, 0, 0, 872, 873, 3, 90, 45, 0, 873, 874, 5, 146, 0, 0, 874, 875, 5, 140, 0, 0, 875, 950, 1, 0, 0, 0, 876, 877, 5, 65, 0, 0, 877, 878, 3, 168, 84, 0, 878, 879, 5, 90, 0, 0, 879, 880, 3, 170, 85, 0, 880, 881, 5, 139, 0, 0, 881, 882, 3, 150, 75, 0, 882, 883, 3, 96, 48, 0, 883, 884, 5, 140, 0, 0, 884, 950, 1, 0, 0, 0, 885, 886, 5, 66, 0, 0, 886, 887, 3, 168, 84, 0, 887, 888, 5, 90, 0, 0, 888, 889, 3, 170, 85, 0, 889, 890, 5, 139, 0, 0, 890, 891, 3, 158, 79, 0, 891, 894, 3, 52, 26, 0, 892, 893, 5, 88, 0, 0, 893, 895, 3, 170, 85, 0, 894, 892, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 896, 1, 0, 0, 0, 896, 897, 3, 96, 48, 0, 897, 898, 5, 140, 0, 0, 898, 950, 1, 0, 0, 0, 899, 900, 5, 47, 0, 0, 900, 901, 3, 168, 84, 0, 901, 902, 5, 90, 0, 0, 902, 903, 3, 170, 85, 0, 903, 904, 5, 139, 0, 0, 904, 906, 3, 168, 84, 0, 905, 907, 3, 30, 15, 0, 906, 905, 1, 0, 0, 0, 906, 907, 1, 0, 0, 0, 907, 909, 1, 0, 0, 0, 908, 910, 3, 80, 40, 0, 909, 908, 1, 0, 0, 0, 909, 910, 1, 0, 0, 0, 910, 913, 1, 0, 0, 0, 911, 912, 5, 20, 0, 0, 912, 914, 5, 57, 0, 0, 913, 911, 1, 0, 0, 0, 913, 914, 1, 0, 0, 0, 914, 915, 1, 0, 0, 0, 915, 916, 5, 140, 0, 0, 916, 950, 1, 0, 0, 0, 917, 918, 5, 7, 0, 0, 918, 919, 3, 168, 84, 0, 919, 920, 5, 90, 0, 0, 920, 921, 3, 170, 85, 0, 921, 922, 5, 139, 0, 0, 922, 923, 3, 168, 84, 0, 923, 924, 5, 57, 0, 0, 924, 925, 3, 150, 75, 0, 925, 926, 5, 140, 0, 0, 926, 950, 1, 0, 0, 0, 927, 928, 5, 55, 0, 0, 928, 929, 3, 168, 84, 0, 929, 930, 5, 90, 0, 0, 930, 931, 3, 170, 85, 0, 931, 932, 5, 139, 0, 0, 932, 935, 3, 168, 84, 0, 933, 934, 5, 57, 0, 0, 934, 936, 3, 150, 75, 0, 935, 933, 1, 0, 0, 0, 935, 936, 1, 0, 0, 0, 936, 937, 1, 0, 0, 0, 937, 938, 5, 140, 0, 0, 938, 950, 1, 0, 0, 0, 939, 940, 5, 24, 0, 0, 940, 941, 3, 168, 84, 0, 941, 942, 5, 90, 0, 0, 942, 943, 3, 170, 85, 0, 943, 944, 5, 139, 0, 0, 944, 945, 3, 168, 84, 0, 945, 946, 5, 142, 0, 0, 946, 947, 3, 168, 84, 0, 947, 948, 5, 140, 0, 0, 948, 950, 1, 0, 0, 0, 949, 867, 1, 0, 0, 0, 949, 876, 1, 0, 0, 0, 949, 885, 1, 0, 0, 0, 949, 899, 1, 0, 0, 0, 949, 917, 1, 0, 0, 0, 949, 927, 1, 0, 0, 0, 949, 939, 1, 0, 0, 0, 950, 95, 1, 0, 0, 0, 951, 952, 5, 145, 0, 0, 952, 957, 3, 98, 49, 0, 953, 954, 5, 141, 0, 0, 954, 956, 3, 98, 49, 0, 955, 953, 1, 0, 0, 0, 956, 959, 1, 0, 0, 0, 957, 955, 1, 0, 0, 0, 957, 958, 1, 0, 0, 0, 958, 960, 1, 0, 0, 0, 959, 957, 1, 0, 0, 0, 960, 961, 5, 146, 0, 0, 961, 97, 1, 0, 0, 0, 962, 963, 7, 4, 0, 0, 963, 99, 1, 0, 0, 0, 964, 965, 5, 64, 0, 0, 965, 966, 3, 102, 51, 0, 966, 101, 1, 0, 0, 0, 967, 970, 3, 104, 52, 0, 968, 970, 3, 108, 54, 0, 969, 967, 1, 0, 0, 0, 969, 968, 1, 0, 0, 0, 970, 103, 1, 0, 0, 0, 971, 972, 5, 65, 0, 0, 972, 973, 3, 168, 84, 0, 973, 974, 5, 90, 0, 0, 974, 975, 3, 170, 85, 0, 975, 976, 5, 75, 0, 0, 976, 977, 3, 168, 84, 0, 977, 978, 5, 139, 0, 0, 978, 979, 3, 150, 75, 0, 979, 980, 5, 76, 0, 0, 980, 983, 3, 106, 53, 0, 981, 982, 5, 77, 0, 0, 982, 984, 3, 160, 80, 0, 983, 981, 1, 0, 0, 0, 983, 984, 1, 0, 0, 0, 984, 985, 1, 0, 0, 0, 985, 986, 5, 140, 0, 0, 986, 105, 1, 0, 0, 0, 987, 1001, 5, 112, 0, 0, 988, 989, 5, 113, 0, 0, 989, 990, 5, 147, 0, 0, 990, 991, 3, 150, 75, 0, 991, 992, 5, 148, 0, 0, 992, 1001, 1, 0, 0, 0, 993, 994, 5, 85, 0, 0, 994, 1001, 3, 162, 81, 0, 995, 996, 5, 86, 0, 0, 996, 997, 5, 147, 0, 0, 997, 998, 3, 150, 75, 0, 998, 999, 5, 148, 0, 0, 999, 1001, 1, 0, 0, 0, 1000, 987, 1, 0, 0, 0, 1000, 988, 1, 0, 0, 0, 1000, 993, 1, 0, 0, 0, 1000, 995, 1, 0, 0, 0, 1001, 107, 1, 0, 0, 0, 1002, 1003, 5, 66, 0, 0, 1003, 1004, 3, 168, 84, 0, 1004, 1005, 5, 90, 0, 0, 1005, 1006, 3, 170, 85, 0, 1006, 1007, 5, 143, 0, 0, 1007, 1008, 3, 110, 55, 0, 1008, 1009, 3, 110, 55, 0, 1009, 1010, 5, 144, 0, 0, 1010, 109, 1, 0, 0, 0, 1011, 1012, 3, 52, 26, 0, 1012, 1013, 5, 67, 0, 0, 1013, 1014, 3, 168, 84, 0, 1014, 1015, 5, 90, 0, 0, 1015, 1016, 3, 170, 85, 0, 1016, 1018, 3, 158, 79, 0, 1017, 1019, 5, 118, 0, 0, 1018, 1017, 1, 0, 0, 0, 1018, 1019, 1, 0, 0, 0, 1019, 1022, 1, 0, 0, 0, 1020, 1021, 5, 83, 0, 0, 1021, 1023, 3, 170, 85, 0, 1022, 1020, 1, 0, 0, 0, 1022, 1023, 1, 0, 0, 0, 1023, 1025, 1, 0, 0, 0, 1024, 1026, 5, 87, 0, 0, 1025, 1024, 1, 0, 0, 0, 1025, 1026, 1, 0, 0, 0, 1026, 1029, 1, 0, 0, 0, 1027, 1028, 5, 88, 0, 0, 1028, 1030, 3, 170, 85, 0, 1029, 1027, 1, 0, 0, 0, 1029, 1030, 1, 0, 0, 0, 1030, 1032, 1, 0, 0, 0, 1031, 1033, 5, 89, 0, 0, 1032, 1031, 1, 0, 0, 0, 1032, 1033, 1, 0, 0, 0, 1033, 1034, 1, 0, 0, 0, 1034, 1035, 5, 140, 0, 0, 1035, 111, 1, 0, 0, 0, 1036, 1038, 5, 58, 0, 0, 1037, 1039, 3, 24, 12, 0, 1038, 1037, 1, 0, 0, 0, 1038, 1039, 1, 0, 0, 0, 1039, 1040, 1, 0, 0, 0, 1040, 1042, 3, 168, 84, 0, 1041, 1043, 3, 114, 57, 0, 1042, 1041, 1, 0, 0, 0, 1042, 1043, 1, 0, 0, 0, 1043, 1044, 1, 0, 0, 0, 1044, 1045, 5, 59, 0, 0, 1045, 1047, 3, 168, 84, 0, 1046, 1048, 3, 30, 15, 0, 1047, 1046, 1, 0, 0, 0, 1047, 1048, 1, 0, 0, 0, 1048, 1051, 1, 0, 0, 0, 1049, 1050, 5, 90, 0, 0, 1050, 1052, 3, 170, 85, 0, 1051, 1049, 1, 0, 0, 0, 1051, 1052, 1, 0, 0, 0, 1052, 1055, 1, 0, 0, 0, 1053, 1054, 5, 82, 0, 0, 1054, 1056, 5, 153, 0, 0, 1055, 1053, 1, 0, 0, 0, 1055, 1056, 1, 0, 0, 0, 1056, 1057, 1, 0, 0, 0, 1057, 1061, 5, 143, 0, 0, 1058, 1060, 3, 116, 58, 0, 1059, 1058, 1, 0, 0, 0, 1060, 1063, 1, 0, 0, 0, 1061, 1059, 1, 0, 0, 0, 1061, 1062, 1, 0, 0, 0, 1062, 1064, 1, 0, 0, 0, 1063, 1061, 1, 0, 0, 0, 1064, 1065, 5, 144, 0, 0, 1065, 113, 1, 0, 0, 0, 1066, 1067, 3, 30, 15, 0, 1067, 115, 1, 0, 0, 0, 1068, 1069, 5, 63, 0, 0, 1069, 1076, 3, 102, 51, 0, 1070, 1076, 3, 130, 65, 0, 1071, 1076, 3, 126, 63, 0, 1072, 1076, 3, 120, 60, 0, 1073, 1076, 3, 128, 64, 0, 1074, 1076, 3, 118, 59, 0, 1075, 1068, 1, 0, 0, 0, 1075, 1070, 1, 0, 0, 0, 1075, 1071, 1, 0, 0, 0, 1075, 1072, 1, 0, 0, 0, 1075, 1073, 1, 0, 0, 0, 1075, 1074, 1, 0, 0, 0, 1076, 117, 1, 0, 0, 0, 1077, 1078, 5, 60, 0, 0, 1078, 1079, 3, 168, 84, 0, 1079, 1080, 5, 62, 0, 0, 1080, 1081, 3, 168, 84, 0, 1081, 1082, 5, 142, 0, 0, 1082, 1083, 3, 168, 84, 0, 1083, 1084, 5, 140, 0, 0, 1084, 119, 1, 0, 0, 0, 1085, 1086, 5, 10, 0, 0, 1086, 1090, 5, 143, 0, 0, 1087, 1089, 3, 122, 61, 0, 1088, 1087, 1, 0, 0, 0, 1089, 1092, 1, 0, 0, 0, 1090, 1088, 1, 0, 0, 0, 1090, 1091, 1, 0, 0, 0, 1091, 1093, 1, 0, 0, 0, 1092, 1090, 1, 0, 0, 0, 1093, 1094, 5, 144, 0, 0, 1094, 1095, 5, 140, 0, 0, 1095, 121, 1, 0, 0, 0, 1096, 1097, 3, 168, 84, 0, 1097, 1098, 5, 62, 0, 0, 1098, 1099, 5, 65, 0, 0, 1099, 1100, 3, 168, 84, 0, 1100, 1101, 5, 140, 0, 0, 1101, 1111, 1, 0, 0, 0, 1102, 1103, 3, 168, 84, 0, 1103, 1104, 5, 62, 0, 0, 1104, 1105, 5, 66, 0, 0, 1105, 1106, 3, 168, 84, 0, 1106, 1107, 5, 142, 0, 0, 1107, 1108, 3, 168, 84, 0, 1108, 1109, 5, 140, 0, 0, 1109, 1111, 1, 0, 0, 0, 1110, 1096, 1, 0, 0, 0, 1110, 1102, 1, 0, 0, 0, 1111, 123, 1, 0, 0, 0, 1112, 1113, 3, 28, 14, 0, 1113, 1114, 5, 20, 0, 0, 1114, 1119, 5, 57, 0, 0, 1115, 1116, 5, 142, 0, 0, 1116, 1118, 3, 168, 84, 0, 1117, 1115, 1, 0, 0, 0, 1118, 1121, 1, 0, 0, 0, 1119, 1117, 1, 0, 0, 0, 1119, 1120, 1, 0, 0, 0, 1120, 1122, 1, 0, 0, 0, 1121, 1119, 1, 0, 0, 0, 1122, 1123, 5, 140, 0, 0, 1123, 125, 1, 0, 0, 0, 1124, 1125, 5, 60, 0, 0, 1125, 1126, 3, 168, 84, 0, 1126, 1127, 5, 62, 0, 0, 1127, 1128, 5, 65, 0, 0, 1128, 1129, 3, 168, 84, 0, 1129, 1130, 5, 140, 0, 0, 1130, 127, 1, 0, 0, 0, 1131, 1132, 5, 72, 0, 0, 1132, 1133, 3, 168, 84, 0, 1133, 1134, 5, 73, 0, 0, 1134, 1135, 5, 74, 0, 0, 1135, 1136, 5, 69, 0, 0, 1136, 1137, 5, 55, 0, 0, 1137, 1138, 3, 168, 84, 0, 1138, 1139, 5, 71, 0, 0, 1139, 1140, 5, 66, 0, 0, 1140, 1141, 3, 168, 84, 0, 1141, 1142, 5, 142, 0, 0, 1142, 1143, 3, 168, 84, 0, 1143, 1144, 5, 140, 0, 0, 1144, 129, 1, 0, 0, 0, 1145, 1146, 5, 60, 0, 0, 1146, 1147, 3, 132, 66, 0, 1147, 1148, 5, 62, 0, 0, 1148, 1151, 3, 136, 68, 0, 1149, 1150, 5, 36, 0, 0, 1150, 1152, 3, 170, 85, 0, 1151, 1149, 1, 0, 0, 0, 1151, 1152, 1, 0, 0, 0, 1152, 1153, 1, 0, 0, 0, 1153, 1154, 5, 140, 0, 0, 1154, 131, 1, 0, 0, 0, 1155, 1156, 3, 168, 84, 0, 1156, 1157, 5, 142, 0, 0, 1157, 1158, 3, 134, 67, 0, 1158, 133, 1, 0, 0, 0, 1159, 1172, 3, 168, 84, 0, 1160, 1172, 5, 107, 0, 0, 1161, 1172, 5, 97, 0, 0, 1162, 1172, 5, 98, 0, 0, 1163, 1172, 5, 1, 0, 0, 1164, 1172, 5, 104, 0, 0, 1165, 1172, 5, 105, 0, 0, 1166, 1172, 5, 106, 0, 0, 1167, 1172, 5, 108, 0, 0, 1168, 1172, 5, 109, 0, 0, 1169, 1172, 5, 110, 0, 0, 1170, 1172, 5, 111, 0, 0, 1171, 1159, 1, 0, 0, 0, 1171, 1160, 1, 0, 0, 0, 1171, 1161, 1, 0, 0, 0, 1171, 1162, 1, 0, 0, 0, 1171, 1163, 1, 0, 0, 0, 1171, 1164, 1, 0, 0, 0, 1171, 1165, 1, 0, 0, 0, 1171, 1166, 1, 0, 0, 0, 1171, 1167, 1, 0, 0, 0, 1171, 1168, 1, 0, 0, 0, 1171, 1169, 1, 0, 0, 0, 1171, 1170, 1, 0, 0, 0, 1172, 135, 1, 0, 0, 0, 1173, 1174, 5, 84, 0, 0, 1174, 1175, 5, 142, 0, 0, 1175, 1220, 3, 168, 84, 0, 1176, 1177, 5, 85, 0, 0, 1177, 1178, 3, 168, 84, 0, 1178, 1179, 5, 142, 0, 0, 1179, 1180, 3, 168, 84, 0, 1180, 1220, 1, 0, 0, 0, 1181, 1182, 5, 86, 0, 0, 1182, 1183, 3, 168, 84, 0, 1183, 1184, 5, 142, 0, 0, 1184, 1185, 3, 168, 84, 0, 1185, 1220, 1, 0, 0, 0, 1186, 1187, 5, 65, 0, 0, 1187, 1188, 3, 168, 84, 0, 1188, 1189, 5, 142, 0, 0, 1189, 1190, 3, 140, 70, 0, 1190, 1220, 1, 0, 0, 0, 1191, 1192, 5, 66, 0, 0, 1192, 1193, 3, 168, 84, 0, 1193, 1194, 5, 142, 0, 0, 1194, 1195, 3, 168, 84, 0, 1195, 1196, 5, 142, 0, 0, 1196, 1197, 3, 142, 71, 0, 1197, 1220, 1, 0, 0, 0, 1198, 1199, 5, 47, 0, 0, 1199, 1201, 3, 168, 84, 0, 1200, 1202, 3, 30, 15, 0, 1201, 1200, 1, 0, 0, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1203, 1, 0, 0, 0, 1203, 1204, 5, 142, 0, 0, 1204, 1205, 3, 132, 66, 0, 1205, 1220, 1, 0, 0, 0, 1206, 1207, 5, 49, 0, 0, 1207, 1208, 3, 168, 84, 0, 1208, 1209, 5, 142, 0, 0, 1209, 1211, 3, 168, 84, 0, 1210, 1212, 3, 30, 15, 0, 1211, 1210, 1, 0, 0, 0, 1211, 1212, 1, 0, 0, 0, 1212, 1214, 1, 0, 0, 0, 1213, 1215, 3, 144, 72, 0, 1214, 1213, 1, 0, 0, 0, 1214, 1215, 1, 0, 0, 0, 1215, 1217, 1, 0, 0, 0, 1216, 1218, 3, 138, 69, 0, 1217, 1216, 1, 0, 0, 0, 1217, 1218, 1, 0, 0, 0, 1218, 1220, 1, 0, 0, 0, 1219, 1173, 1, 0, 0, 0, 1219, 1176, 1, 0, 0, 0, 1219, 1181, 1, 0, 0, 0, 1219, 1186, 1, 0, 0, 0, 1219, 1191, 1, 0, 0, 0, 1219, 1198, 1, 0, 0, 0, 1219, 1206, 1, 0, 0, 0, 1220, 137, 1, 0, 0, 0, 1221, 1222, 5, 70, 0, 0, 1222, 1223, 3, 144, 72, 0, 1223, 139, 1, 0, 0, 0, 1224, 1225, 7, 5, 0, 0, 1225, 141, 1, 0, 0, 0, 1226, 1227, 7, 6, 0, 0, 1227, 143, 1, 0, 0, 0, 1228, 1229, 5, 68, 0, 0, 1229, 1233, 5, 143, 0, 0, 1230, 1232, 3, 146, 73, 0, 1231, 1230, 1, 0, 0, 0, 1232, 1235, 1, 0, 0, 0, 1233, 1231, 1, 0, 0, 0, 1233, 1234, 1, 0, 0, 0, 1234, 1236, 1, 0, 0, 0, 1235, 1233, 1, 0, 0, 0, 1236, 1237, 5, 144, 0, 0, 1237, 145, 1, 0, 0, 0, 1238, 1239, 3, 168, 84, 0, 1239, 1240, 5, 62, 0, 0, 1240, 1241, 5, 11, 0, 0, 1241, 1242, 5, 25, 0, 0, 1242, 1243, 5, 145, 0, 0, 1243, 1244, 3, 90, 45, 0, 1244, 1245, 5, 146, 0, 0, 1245, 1246, 5, 140, 0, 0, 1246, 1337, 1, 0, 0, 0, 1247, 1248, 3, 168, 84, 0, 1248, 1249, 5, 62, 0, 0, 1249, 1250, 5, 65, 0, 0, 1250, 1257, 3, 168, 84, 0, 1251, 1252, 5, 71, 0, 0, 1252, 1253, 5, 66, 0, 0, 1253, 1254, 3, 168, 84, 0, 1254, 1255, 5, 142, 0, 0, 1255, 1256, 3, 168, 84, 0, 1256, 1258, 1, 0, 0, 0, 1257, 1251, 1, 0, 0, 0, 1257, 1258, 1, 0, 0, 0, 1258, 1259, 1, 0, 0, 0, 1259, 1260, 5, 140, 0, 0, 1260, 1337, 1, 0, 0, 0, 1261, 1262, 3, 168, 84, 0, 1262, 1263, 5, 62, 0, 0, 1263, 1264, 5, 66, 0, 0, 1264, 1265, 3, 168, 84, 0, 1265, 1266, 5, 142, 0, 0, 1266, 1273, 3, 168, 84, 0, 1267, 1268, 5, 71, 0, 0, 1268, 1269, 5, 66, 0, 0, 1269, 1270, 3, 168, 84, 0, 1270, 1271, 5, 142, 0, 0, 1271, 1272, 3, 168, 84, 0, 1272, 1274, 1, 0, 0, 0, 1273, 1267, 1, 0, 0, 0, 1273, 1274, 1, 0, 0, 0, 1274, 1275, 1, 0, 0, 0, 1275, 1276, 5, 140, 0, 0, 1276, 1337, 1, 0, 0, 0, 1277, 1278, 3, 168, 84, 0, 1278, 1279, 5, 62, 0, 0, 1279, 1280, 5, 47, 0, 0, 1280, 1282, 3, 168, 84, 0, 1281, 1283, 3, 30, 15, 0, 1282, 1281, 1, 0, 0, 0, 1282, 1283, 1, 0, 0, 0, 1283, 1292, 1, 0, 0, 0, 1284, 1285, 5, 71, 0, 0, 1285, 1286, 5, 66, 0, 0, 1286, 1287, 3, 168, 84, 0, 1287, 1288, 5, 142, 0, 0, 1288, 1289, 3, 168, 84, 0, 1289, 1293, 1, 0, 0, 0, 1290, 1291, 5, 20, 0, 0, 1291, 1293, 5, 57, 0, 0, 1292, 1284, 1, 0, 0, 0, 1292, 1290, 1, 0, 0, 0, 1292, 1293, 1, 0, 0, 0, 1293, 1294, 1, 0, 0, 0, 1294, 1295, 5, 140, 0, 0, 1295, 1337, 1, 0, 0, 0, 1296, 1297, 3, 168, 84, 0, 1297, 1298, 5, 62, 0, 0, 1298, 1299, 5, 7, 0, 0, 1299, 1300, 3, 168, 84, 0, 1300, 1301, 5, 68, 0, 0, 1301, 1305, 5, 143, 0, 0, 1302, 1304, 3, 124, 62, 0, 1303, 1302, 1, 0, 0, 0, 1304, 1307, 1, 0, 0, 0, 1305, 1303, 1, 0, 0, 0, 1305, 1306, 1, 0, 0, 0, 1306, 1308, 1, 0, 0, 0, 1307, 1305, 1, 0, 0, 0, 1308, 1309, 5, 144, 0, 0, 1309, 1310, 5, 140, 0, 0, 1310, 1337, 1, 0, 0, 0, 1311, 1312, 3, 168, 84, 0, 1312, 1313, 5, 62, 0, 0, 1313, 1314, 5, 55, 0, 0, 1314, 1315, 3, 168, 84, 0, 1315, 1316, 5, 140, 0, 0, 1316, 1337, 1, 0, 0, 0, 1317, 1318, 3, 168, 84, 0, 1318, 1320, 5, 62, 0, 0, 1319, 1321, 5, 11, 0, 0, 1320, 1319, 1, 0, 0, 0, 1320, 1321, 1, 0, 0, 0, 1321, 1322, 1, 0, 0, 0, 1322, 1323, 5, 24, 0, 0, 1323, 1324, 3, 168, 84, 0, 1324, 1325, 5, 142, 0, 0, 1325, 1332, 3, 168, 84, 0, 1326, 1327, 5, 71, 0, 0, 1327, 1328, 5, 66, 0, 0, 1328, 1329, 3, 168, 84, 0, 1329, 1330, 5, 142, 0, 0, 1330, 1331, 3, 168, 84, 0, 1331, 1333, 1, 0, 0, 0, 1332, 1326, 1, 0, 0, 0, 1332, 1333, 1, 0, 0, 0, 1333, 1334, 1, 0, 0, 0, 1334, 1335, 5, 140, 0, 0, 1335, 1337, 1, 0, 0, 0, 1336, 1238, 1, 0, 0, 0, 1336, 1247, 1, 0, 0, 0, 1336, 1261, 1, 0, 0, 0, 1336, 1277, 1, 0, 0, 0, 1336, 1296, 1, 0, 0, 0, 1336, 1311, 1, 0, 0, 0, 1336, 1317, 1, 0, 0, 0, 1337, 147, 1, 0, 0, 0, 1338, 1339, 5, 55, 0, 0, 1339, 1340, 3, 168, 84, 0, 1340, 1341, 5, 62, 0, 0, 1341, 1342, 3, 168, 84, 0, 1342, 1343, 5, 142, 0, 0, 1343, 1345, 3, 168, 84, 0, 1344, 1346, 3, 144, 72, 0, 1345, 1344, 1, 0, 0, 0, 1345, 1346, 1, 0, 0, 0, 1346, 1347, 1, 0, 0, 0, 1347, 1348, 5, 140, 0, 0, 1348, 149, 1, 0, 0, 0, 1349, 1407, 3, 156, 78, 0, 1350, 1407, 5, 119, 0, 0, 1351, 1407, 5, 120, 0, 0, 1352, 1353, 5, 121, 0, 0, 1353, 1407, 3, 170, 85, 0, 1354, 1355, 5, 122, 0, 0, 1355, 1356, 5, 149, 0, 0, 1356, 1357, 3, 168, 84, 0, 1357, 1358, 5, 150, 0, 0, 1358, 1407, 1, 0, 0, 0, 1359, 1360, 5, 123, 0, 0, 1360, 1361, 5, 149, 0, 0, 1361, 1363, 3, 168, 84, 0, 1362, 1364, 3, 30, 15, 0, 1363, 1362, 1, 0, 0, 0, 1363, 1364, 1, 0, 0, 0, 1364, 1365, 1, 0, 0, 0, 1365, 1366, 5, 150, 0, 0, 1366, 1407, 1, 0, 0, 0, 1367, 1368, 5, 41, 0, 0, 1368, 1369, 5, 149, 0, 0, 1369, 1370, 3, 168, 84, 0, 1370, 1371, 5, 150, 0, 0, 1371, 1407, 1, 0, 0, 0, 1372, 1373, 5, 124, 0, 0, 1373, 1374, 5, 149, 0, 0, 1374, 1375, 3, 150, 75, 0, 1375, 1376, 5, 150, 0, 0, 1376, 1407, 1, 0, 0, 0, 1377, 1378, 5, 125, 0, 0, 1378, 1379, 5, 149, 0, 0, 1379, 1380, 3, 150, 75, 0, 1380, 1381, 5, 150, 0, 0, 1381, 1407, 1, 0, 0, 0, 1382, 1383, 5, 126, 0, 0, 1383, 1387, 5, 143, 0, 0, 1384, 1386, 3, 152, 76, 0, 1385, 1384, 1, 0, 0, 0, 1386, 1389, 1, 0, 0, 0, 1387, 1385, 1, 0, 0, 0, 1387, 1388, 1, 0, 0, 0, 1388, 1390, 1, 0, 0, 0, 1389, 1387, 1, 0, 0, 0, 1390, 1407, 5, 144, 0, 0, 1391, 1392, 5, 8, 0, 0, 1392, 1393, 5, 90, 0, 0, 1393, 1394, 3, 170, 85, 0, 1394, 1396, 5, 143, 0, 0, 1395, 1397, 3, 154, 77, 0, 1396, 1395, 1, 0, 0, 0, 1397, 1398, 1, 0, 0, 0, 1398, 1396, 1, 0, 0, 0, 1398, 1399, 1, 0, 0, 0, 1399, 1400, 1, 0, 0, 0, 1400, 1401, 5, 144, 0, 0, 1401, 1407, 1, 0, 0, 0, 1402, 1404, 3, 168, 84, 0, 1403, 1405, 3, 30, 15, 0, 1404, 1403, 1, 0, 0, 0, 1404, 1405, 1, 0, 0, 0, 1405, 1407, 1, 0, 0, 0, 1406, 1349, 1, 0, 0, 0, 1406, 1350, 1, 0, 0, 0, 1406, 1351, 1, 0, 0, 0, 1406, 1352, 1, 0, 0, 0, 1406, 1354, 1, 0, 0, 0, 1406, 1359, 1, 0, 0, 0, 1406, 1367, 1, 0, 0, 0, 1406, 1372, 1, 0, 0, 0, 1406, 1377, 1, 0, 0, 0, 1406, 1382, 1, 0, 0, 0, 1406, 1391, 1, 0, 0, 0, 1406, 1402, 1, 0, 0, 0, 1407, 151, 1, 0, 0, 0, 1408, 1409, 3, 168, 84, 0, 1409, 1410, 5, 139, 0, 0, 1410, 1411, 3, 150, 75, 0, 1411, 1412, 5, 140, 0, 0, 1412, 153, 1, 0, 0, 0, 1413, 1414, 3, 168, 84, 0, 1414, 1415, 5, 90, 0, 0, 1415, 1416, 3, 170, 85, 0, 1416, 1417, 5, 139, 0, 0, 1417, 1418, 3, 150, 75, 0, 1418, 1419, 5, 140, 0, 0, 1419, 155, 1, 0, 0, 0, 1420, 1421, 7, 7, 0, 0, 1421, 157, 1, 0, 0, 0, 1422, 1423, 7, 8, 0, 0, 1423, 159, 1, 0, 0, 0, 1424, 1433, 3, 170, 85, 0, 1425, 1433, 5, 153, 0, 0, 1426, 1433, 5, 154, 0, 0, 1427, 1433, 5, 135, 0, 0, 1428, 1433, 5, 136, 0, 0, 1429, 1433, 5, 137, 0, 0, 1430, 1433, 3, 162, 81, 0, 1431, 1433, 3, 166, 83, 0, 1432, 1424, 1, 0, 0, 0, 1432, 1425, 1, 0, 0, 0, 1432, 1426, 1, 0, 0, 0, 1432, 1427, 1, 0, 0, 0, 1432, 1428, 1, 0, 0, 0, 1432, 1429, 1, 0, 0, 0, 1432, 1430, 1, 0, 0, 0, 1432, 1431, 1, 0, 0, 0, 1433, 161, 1, 0, 0, 0, 1434, 1443, 5, 143, 0, 0, 1435, 1440, 3, 164, 82, 0, 1436, 1437, 5, 141, 0, 0, 1437, 1439, 3, 164, 82, 0, 1438, 1436, 1, 0, 0, 0, 1439, 1442, 1, 0, 0, 0, 1440, 1438, 1, 0, 0, 0, 1440, 1441, 1, 0, 0, 0, 1441, 1444, 1, 0, 0, 0, 1442, 1440, 1, 0, 0, 0, 1443, 1435, 1, 0, 0, 0, 1443, 1444, 1, 0, 0, 0, 1444, 1445, 1, 0, 0, 0, 1445, 1446, 5, 144, 0, 0, 1446, 163, 1, 0, 0, 0, 1447, 1448, 3, 170, 85, 0, 1448, 1449, 5, 139, 0, 0, 1449, 1450, 3, 160, 80, 0, 1450, 165, 1, 0, 0, 0, 1451, 1460, 5, 145, 0, 0, 1452, 1457, 3, 160, 80, 0, 1453, 1454, 5, 141, 0, 0, 1454, 1456, 3, 160, 80, 0, 1455, 1453, 1, 0, 0, 0, 1456, 1459, 1, 0, 0, 0, 1457, 1455, 1, 0, 0, 0, 1457, 1458, 1, 0, 0, 0, 1458, 1461, 1, 0, 0, 0, 1459, 1457, 1, 0, 0, 0, 1460, 1452, 1, 0, 0, 0, 1460, 1461, 1, 0, 0, 0, 1461, 1462, 1, 0, 0, 0, 1462, 1463, 5, 146, 0, 0, 1463, 167, 1, 0, 0, 0, 1464, 1465, 7, 9, 0, 0, 1465, 169, 1, 0, 0, 0, 1466, 1467, 5, 156, 0, 0, 1467, 171, 1, 0, 0, 0, 130, 184, 191, 212, 225, 237, 264, 272, 279, 285, 297, 300, 306, 317, 326, 336, 339, 341, 345, 353, 365, 370, 380, 390, 395, 410, 416, 428, 437, 445, 453, 466, 469, 479, 483, 489, 496, 502, 510, 518, 531, 538, 542, 547, 558, 564, 575, 601, 605, 611, 622, 631, 637, 642, 644, 675, 679, 685, 712, 722, 733, 736, 741, 744, 747, 754, 763, 766, 769, 772, 795, 797, 806, 820, 841, 844, 847, 854, 862, 894, 906, 909, 913, 935, 949, 957, 969, 983, 1000, 1018, 1022, 1025, 1029, 1032, 1038, 1042, 1047, 1051, 1055, 1061, 1075, 1090, 1110, 1119, 1151, 1171, 1201, 1211, 1214, 1217, 1219, 1233, 1257, 1273, 1282, 1292, 1305, 1320, 1332, 1336, 1345, 1363, 1387, 1398, 1404, 1406, 1432, 1440, 1443, 1457, 1460] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapability.tokens b/src/capability-language/generated/QuixosCapability.tokens index 737fc4d..ec69fb8 100644 --- a/src/capability-language/generated/QuixosCapability.tokens +++ b/src/capability-language/generated/QuixosCapability.tokens @@ -42,120 +42,121 @@ REF=41 FRAGMENT=42 IMPORT=43 EXTERNAL=44 -ATOM=45 -INTERFACE=46 -INTERFACES=47 -PACKAGE=48 -VALUE=49 -FIELD=50 -RELATION=51 -OPERATION=52 -FUNCTION=53 -CONSTRUCTOR=54 -CONSTRUCTS=55 -INPUT=56 -CONFORM=57 -AS=58 -BIND=59 -STATIC=60 -TO=61 -PRIVATE=62 -SHARED=63 -STATE=64 -EDGE=65 -PROJECTION=66 -WITH=67 -USING=68 -ACCEPT=69 -VIA=70 -MATERIALIZE=71 -IF=72 -ABSENT=73 -ON=74 -POLICY=75 -DEFAULT=76 -SOURCE=77 -REPOSITORY=78 -COMMIT=79 -REVISION=80 -SEMANTIC_MAJOR=81 -ON_DELETE=82 -LIFECYCLE=83 -JOURNAL=84 -SUBSCRIPTION=85 -RETAIN_OTHER=86 -KEYED=87 -PUBLIC_TRAVERSAL=88 -ID=89 -DOC=90 -MODE=91 -EMITS=92 -RECEIVER=93 -REQUIRES=94 -ANY=95 -GET=96 -SET=97 -WATCH=98 -START=99 -STOP=100 -READ=101 -WRITE=102 -RESOLVE=103 -CONNECT=104 -DISCONNECT=105 -CALL=106 -WATCH_START=107 -WATCH_STOP=108 -SUBSCRIBE=109 -UNSUBSCRIBE=110 -REGISTER=111 -CRDT=112 -OPTIONAL_ONE=113 -EXACTLY_ONE=114 -MANY_UNIQUE=115 -MANY=116 -ORDERED=117 -UNIT=118 -WATCH_HANDLE=119 -MESSAGE=120 -ATOM_REF=121 -INTERFACE_REF=122 -OPTIONAL=123 -LIST=124 -RECORD=125 -BOOL=126 -BYTES=127 -DOUBLE=128 -INT32=129 -INT64=130 -STRING=131 -UINT32=132 -UINT64=133 -TRUE=134 -FALSE=135 -NULL=136 -ARROW=137 -COLON=138 -SEMI=139 -COMMA=140 -DOT=141 -LBRACE=142 -RBRACE=143 -LBRACK=144 -RBRACK=145 -LPAREN=146 -RPAREN=147 -LT=148 -GT=149 -AMP=150 -EQUAL=151 -INTEGER=152 -JSON_NUMBER=153 -IDENTIFIER=154 -STRING_LITERAL=155 -LINE_COMMENT=156 -BLOCK_COMMENT=157 -WS=158 +SYMBOL=45 +ATOM=46 +INTERFACE=47 +INTERFACES=48 +PACKAGE=49 +VALUE=50 +FIELD=51 +RELATION=52 +OPERATION=53 +FUNCTION=54 +CONSTRUCTOR=55 +CONSTRUCTS=56 +INPUT=57 +CONFORM=58 +AS=59 +BIND=60 +STATIC=61 +TO=62 +PRIVATE=63 +SHARED=64 +STATE=65 +EDGE=66 +PROJECTION=67 +WITH=68 +USING=69 +ACCEPT=70 +VIA=71 +MATERIALIZE=72 +IF=73 +ABSENT=74 +ON=75 +POLICY=76 +DEFAULT=77 +SOURCE=78 +REPOSITORY=79 +COMMIT=80 +REVISION=81 +SEMANTIC_MAJOR=82 +ON_DELETE=83 +LIFECYCLE=84 +JOURNAL=85 +SUBSCRIPTION=86 +RETAIN_OTHER=87 +KEYED=88 +PUBLIC_TRAVERSAL=89 +ID=90 +DOC=91 +MODE=92 +EMITS=93 +RECEIVER=94 +REQUIRES=95 +ANY=96 +GET=97 +SET=98 +WATCH=99 +START=100 +STOP=101 +READ=102 +WRITE=103 +RESOLVE=104 +CONNECT=105 +DISCONNECT=106 +CALL=107 +WATCH_START=108 +WATCH_STOP=109 +SUBSCRIBE=110 +UNSUBSCRIBE=111 +REGISTER=112 +CRDT=113 +OPTIONAL_ONE=114 +EXACTLY_ONE=115 +MANY_UNIQUE=116 +MANY=117 +ORDERED=118 +UNIT=119 +WATCH_HANDLE=120 +MESSAGE=121 +ATOM_REF=122 +INTERFACE_REF=123 +OPTIONAL=124 +LIST=125 +RECORD=126 +BOOL=127 +BYTES=128 +DOUBLE=129 +INT32=130 +INT64=131 +STRING=132 +UINT32=133 +UINT64=134 +TRUE=135 +FALSE=136 +NULL=137 +ARROW=138 +COLON=139 +SEMI=140 +COMMA=141 +DOT=142 +LBRACE=143 +RBRACE=144 +LBRACK=145 +RBRACK=146 +LPAREN=147 +RPAREN=148 +LT=149 +GT=150 +AMP=151 +EQUAL=152 +INTEGER=153 +JSON_NUMBER=154 +IDENTIFIER=155 +STRING_LITERAL=156 +LINE_COMMENT=157 +BLOCK_COMMENT=158 +WS=159 'edit'=1 'module'=2 'contract'=3 @@ -200,110 +201,111 @@ WS=158 'fragment'=42 'import'=43 'external'=44 -'atom'=45 -'interface'=46 -'interfaces'=47 -'package'=48 -'value'=49 -'field'=50 -'relation'=51 -'operation'=52 -'function'=53 -'constructor'=54 -'constructs'=55 -'input'=56 -'conform'=57 -'as'=58 -'bind'=59 -'static'=60 -'to'=61 -'private'=62 -'shared'=63 -'state'=64 -'edge'=65 -'projection'=66 -'with'=67 -'using'=68 -'accept'=69 -'via'=70 -'materialize'=71 -'if'=72 -'absent'=73 -'on'=74 -'policy'=75 -'default'=76 -'source'=77 -'repository'=78 -'commit'=79 -'revision'=80 -'semantic-major'=81 -'on-delete'=82 -'lifecycle'=83 -'journal'=84 -'subscription'=85 -'retain-other'=86 -'keyed'=87 -'public-traversal'=88 -'id'=89 -'doc'=90 -'mode'=91 -'emits'=92 -'receiver'=93 -'requires'=94 -'any'=95 -'get'=96 -'set'=97 -'watch'=98 -'start'=99 -'stop'=100 -'read'=101 -'write'=102 -'resolve'=103 -'connect'=104 -'disconnect'=105 -'call'=106 -'watch-start'=107 -'watch-stop'=108 -'subscribe'=109 -'unsubscribe'=110 -'register'=111 -'crdt'=112 -'optional-one'=113 -'exactly-one'=114 -'many-unique'=115 -'many'=116 -'ordered'=117 -'unit'=118 -'watch-handle'=119 -'message'=120 -'atom-ref'=121 -'interface-ref'=122 -'optional'=123 -'list'=124 -'record'=125 -'bool'=126 -'bytes'=127 -'double'=128 -'int32'=129 -'int64'=130 -'string'=131 -'uint32'=132 -'uint64'=133 -'true'=134 -'false'=135 -'null'=136 -'->'=137 -':'=138 -';'=139 -','=140 -'.'=141 -'{'=142 -'}'=143 -'['=144 -']'=145 -'('=146 -')'=147 -'<'=148 -'>'=149 -'&'=150 -'='=151 +'symbol'=45 +'atom'=46 +'interface'=47 +'interfaces'=48 +'package'=49 +'value'=50 +'field'=51 +'relation'=52 +'operation'=53 +'function'=54 +'constructor'=55 +'constructs'=56 +'input'=57 +'conform'=58 +'as'=59 +'bind'=60 +'static'=61 +'to'=62 +'private'=63 +'shared'=64 +'state'=65 +'edge'=66 +'projection'=67 +'with'=68 +'using'=69 +'accept'=70 +'via'=71 +'materialize'=72 +'if'=73 +'absent'=74 +'on'=75 +'policy'=76 +'default'=77 +'source'=78 +'repository'=79 +'commit'=80 +'revision'=81 +'semantic-major'=82 +'on-delete'=83 +'lifecycle'=84 +'journal'=85 +'subscription'=86 +'retain-other'=87 +'keyed'=88 +'public-traversal'=89 +'id'=90 +'doc'=91 +'mode'=92 +'emits'=93 +'receiver'=94 +'requires'=95 +'any'=96 +'get'=97 +'set'=98 +'watch'=99 +'start'=100 +'stop'=101 +'read'=102 +'write'=103 +'resolve'=104 +'connect'=105 +'disconnect'=106 +'call'=107 +'watch-start'=108 +'watch-stop'=109 +'subscribe'=110 +'unsubscribe'=111 +'register'=112 +'crdt'=113 +'optional-one'=114 +'exactly-one'=115 +'many-unique'=116 +'many'=117 +'ordered'=118 +'unit'=119 +'watch-handle'=120 +'message'=121 +'atom-ref'=122 +'interface-ref'=123 +'optional'=124 +'list'=125 +'record'=126 +'bool'=127 +'bytes'=128 +'double'=129 +'int32'=130 +'int64'=131 +'string'=132 +'uint32'=133 +'uint64'=134 +'true'=135 +'false'=136 +'null'=137 +'->'=138 +':'=139 +';'=140 +','=141 +'.'=142 +'{'=143 +'}'=144 +'['=145 +']'=146 +'('=147 +')'=148 +'<'=149 +'>'=150 +'&'=151 +'='=152 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.interp b/src/capability-language/generated/QuixosCapabilityLexer.interp index 53aba18..25cf672 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.interp +++ b/src/capability-language/generated/QuixosCapabilityLexer.interp @@ -44,6 +44,7 @@ null 'fragment' 'import' 'external' +'symbol' 'atom' 'interface' 'interfaces' @@ -205,6 +206,7 @@ REF FRAGMENT IMPORT EXTERNAL +SYMBOL ATOM INTERFACE INTERFACES @@ -365,6 +367,7 @@ REF FRAGMENT IMPORT EXTERNAL +SYMBOL ATOM INTERFACE INTERFACES @@ -490,4 +493,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 158, 1523, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 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, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 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, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 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, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 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, 27, 1, 28, 1, 28, 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, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 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, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 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, 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, 45, 1, 46, 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, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 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, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 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, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 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, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 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, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 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, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 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, 70, 1, 70, 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, 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, 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, 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, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 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, 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, 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, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 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, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 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, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 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, 102, 1, 102, 1, 103, 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, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 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, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 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, 144, 1, 144, 1, 145, 1, 145, 1, 146, 1, 146, 1, 147, 1, 147, 1, 148, 1, 148, 1, 149, 1, 149, 1, 150, 1, 150, 1, 151, 3, 151, 1424, 8, 151, 1, 151, 4, 151, 1427, 8, 151, 11, 151, 12, 151, 1428, 1, 152, 3, 152, 1432, 8, 152, 1, 152, 1, 152, 1, 152, 5, 152, 1437, 8, 152, 10, 152, 12, 152, 1440, 9, 152, 3, 152, 1442, 8, 152, 1, 152, 1, 152, 4, 152, 1446, 8, 152, 11, 152, 12, 152, 1447, 3, 152, 1450, 8, 152, 1, 152, 1, 152, 3, 152, 1454, 8, 152, 1, 152, 4, 152, 1457, 8, 152, 11, 152, 12, 152, 1458, 3, 152, 1461, 8, 152, 1, 153, 1, 153, 5, 153, 1465, 8, 153, 10, 153, 12, 153, 1468, 9, 153, 1, 154, 1, 154, 1, 154, 5, 154, 1473, 8, 154, 10, 154, 12, 154, 1476, 9, 154, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 1, 155, 3, 155, 1488, 8, 155, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 5, 157, 1496, 8, 157, 10, 157, 12, 157, 1499, 9, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 5, 158, 1507, 8, 158, 10, 158, 12, 158, 1510, 9, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 4, 159, 1518, 8, 159, 11, 159, 12, 159, 1519, 1, 159, 1, 159, 1, 1508, 0, 160, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 143, 287, 144, 289, 145, 291, 146, 293, 147, 295, 148, 297, 149, 299, 150, 301, 151, 303, 152, 305, 153, 307, 154, 309, 155, 311, 0, 313, 0, 315, 156, 317, 157, 319, 158, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1537, 0, 1, 1, 0, 0, 0, 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, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 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, 315, 1, 0, 0, 0, 0, 317, 1, 0, 0, 0, 0, 319, 1, 0, 0, 0, 1, 321, 1, 0, 0, 0, 3, 326, 1, 0, 0, 0, 5, 333, 1, 0, 0, 0, 7, 342, 1, 0, 0, 0, 9, 355, 1, 0, 0, 0, 11, 363, 1, 0, 0, 0, 13, 367, 1, 0, 0, 0, 15, 376, 1, 0, 0, 0, 17, 384, 1, 0, 0, 0, 19, 393, 1, 0, 0, 0, 21, 404, 1, 0, 0, 0, 23, 414, 1, 0, 0, 0, 25, 424, 1, 0, 0, 0, 27, 433, 1, 0, 0, 0, 29, 445, 1, 0, 0, 0, 31, 452, 1, 0, 0, 0, 33, 460, 1, 0, 0, 0, 35, 469, 1, 0, 0, 0, 37, 477, 1, 0, 0, 0, 39, 483, 1, 0, 0, 0, 41, 488, 1, 0, 0, 0, 43, 501, 1, 0, 0, 0, 45, 511, 1, 0, 0, 0, 47, 523, 1, 0, 0, 0, 49, 529, 1, 0, 0, 0, 51, 540, 1, 0, 0, 0, 53, 551, 1, 0, 0, 0, 55, 556, 1, 0, 0, 0, 57, 565, 1, 0, 0, 0, 59, 575, 1, 0, 0, 0, 61, 580, 1, 0, 0, 0, 63, 584, 1, 0, 0, 0, 65, 590, 1, 0, 0, 0, 67, 595, 1, 0, 0, 0, 69, 605, 1, 0, 0, 0, 71, 609, 1, 0, 0, 0, 73, 622, 1, 0, 0, 0, 75, 627, 1, 0, 0, 0, 77, 634, 1, 0, 0, 0, 79, 643, 1, 0, 0, 0, 81, 654, 1, 0, 0, 0, 83, 658, 1, 0, 0, 0, 85, 667, 1, 0, 0, 0, 87, 674, 1, 0, 0, 0, 89, 683, 1, 0, 0, 0, 91, 688, 1, 0, 0, 0, 93, 698, 1, 0, 0, 0, 95, 709, 1, 0, 0, 0, 97, 717, 1, 0, 0, 0, 99, 723, 1, 0, 0, 0, 101, 729, 1, 0, 0, 0, 103, 738, 1, 0, 0, 0, 105, 748, 1, 0, 0, 0, 107, 757, 1, 0, 0, 0, 109, 769, 1, 0, 0, 0, 111, 780, 1, 0, 0, 0, 113, 786, 1, 0, 0, 0, 115, 794, 1, 0, 0, 0, 117, 797, 1, 0, 0, 0, 119, 802, 1, 0, 0, 0, 121, 809, 1, 0, 0, 0, 123, 812, 1, 0, 0, 0, 125, 820, 1, 0, 0, 0, 127, 827, 1, 0, 0, 0, 129, 833, 1, 0, 0, 0, 131, 838, 1, 0, 0, 0, 133, 849, 1, 0, 0, 0, 135, 854, 1, 0, 0, 0, 137, 860, 1, 0, 0, 0, 139, 867, 1, 0, 0, 0, 141, 871, 1, 0, 0, 0, 143, 883, 1, 0, 0, 0, 145, 886, 1, 0, 0, 0, 147, 893, 1, 0, 0, 0, 149, 896, 1, 0, 0, 0, 151, 903, 1, 0, 0, 0, 153, 911, 1, 0, 0, 0, 155, 918, 1, 0, 0, 0, 157, 929, 1, 0, 0, 0, 159, 936, 1, 0, 0, 0, 161, 945, 1, 0, 0, 0, 163, 960, 1, 0, 0, 0, 165, 970, 1, 0, 0, 0, 167, 980, 1, 0, 0, 0, 169, 988, 1, 0, 0, 0, 171, 1001, 1, 0, 0, 0, 173, 1014, 1, 0, 0, 0, 175, 1020, 1, 0, 0, 0, 177, 1037, 1, 0, 0, 0, 179, 1040, 1, 0, 0, 0, 181, 1044, 1, 0, 0, 0, 183, 1049, 1, 0, 0, 0, 185, 1055, 1, 0, 0, 0, 187, 1064, 1, 0, 0, 0, 189, 1073, 1, 0, 0, 0, 191, 1077, 1, 0, 0, 0, 193, 1081, 1, 0, 0, 0, 195, 1085, 1, 0, 0, 0, 197, 1091, 1, 0, 0, 0, 199, 1097, 1, 0, 0, 0, 201, 1102, 1, 0, 0, 0, 203, 1107, 1, 0, 0, 0, 205, 1113, 1, 0, 0, 0, 207, 1121, 1, 0, 0, 0, 209, 1129, 1, 0, 0, 0, 211, 1140, 1, 0, 0, 0, 213, 1145, 1, 0, 0, 0, 215, 1157, 1, 0, 0, 0, 217, 1168, 1, 0, 0, 0, 219, 1178, 1, 0, 0, 0, 221, 1190, 1, 0, 0, 0, 223, 1199, 1, 0, 0, 0, 225, 1204, 1, 0, 0, 0, 227, 1217, 1, 0, 0, 0, 229, 1229, 1, 0, 0, 0, 231, 1241, 1, 0, 0, 0, 233, 1246, 1, 0, 0, 0, 235, 1254, 1, 0, 0, 0, 237, 1259, 1, 0, 0, 0, 239, 1272, 1, 0, 0, 0, 241, 1280, 1, 0, 0, 0, 243, 1289, 1, 0, 0, 0, 245, 1303, 1, 0, 0, 0, 247, 1312, 1, 0, 0, 0, 249, 1317, 1, 0, 0, 0, 251, 1324, 1, 0, 0, 0, 253, 1329, 1, 0, 0, 0, 255, 1335, 1, 0, 0, 0, 257, 1342, 1, 0, 0, 0, 259, 1348, 1, 0, 0, 0, 261, 1354, 1, 0, 0, 0, 263, 1361, 1, 0, 0, 0, 265, 1368, 1, 0, 0, 0, 267, 1375, 1, 0, 0, 0, 269, 1380, 1, 0, 0, 0, 271, 1386, 1, 0, 0, 0, 273, 1391, 1, 0, 0, 0, 275, 1394, 1, 0, 0, 0, 277, 1396, 1, 0, 0, 0, 279, 1398, 1, 0, 0, 0, 281, 1400, 1, 0, 0, 0, 283, 1402, 1, 0, 0, 0, 285, 1404, 1, 0, 0, 0, 287, 1406, 1, 0, 0, 0, 289, 1408, 1, 0, 0, 0, 291, 1410, 1, 0, 0, 0, 293, 1412, 1, 0, 0, 0, 295, 1414, 1, 0, 0, 0, 297, 1416, 1, 0, 0, 0, 299, 1418, 1, 0, 0, 0, 301, 1420, 1, 0, 0, 0, 303, 1423, 1, 0, 0, 0, 305, 1431, 1, 0, 0, 0, 307, 1462, 1, 0, 0, 0, 309, 1469, 1, 0, 0, 0, 311, 1479, 1, 0, 0, 0, 313, 1489, 1, 0, 0, 0, 315, 1491, 1, 0, 0, 0, 317, 1502, 1, 0, 0, 0, 319, 1517, 1, 0, 0, 0, 321, 322, 5, 101, 0, 0, 322, 323, 5, 100, 0, 0, 323, 324, 5, 105, 0, 0, 324, 325, 5, 116, 0, 0, 325, 2, 1, 0, 0, 0, 326, 327, 5, 109, 0, 0, 327, 328, 5, 111, 0, 0, 328, 329, 5, 100, 0, 0, 329, 330, 5, 117, 0, 0, 330, 331, 5, 108, 0, 0, 331, 332, 5, 101, 0, 0, 332, 4, 1, 0, 0, 0, 333, 334, 5, 99, 0, 0, 334, 335, 5, 111, 0, 0, 335, 336, 5, 110, 0, 0, 336, 337, 5, 116, 0, 0, 337, 338, 5, 114, 0, 0, 338, 339, 5, 97, 0, 0, 339, 340, 5, 99, 0, 0, 340, 341, 5, 116, 0, 0, 341, 6, 1, 0, 0, 0, 342, 343, 5, 112, 0, 0, 343, 344, 5, 114, 0, 0, 344, 345, 5, 101, 0, 0, 345, 346, 5, 115, 0, 0, 346, 347, 5, 101, 0, 0, 347, 348, 5, 110, 0, 0, 348, 349, 5, 116, 0, 0, 349, 350, 5, 97, 0, 0, 350, 351, 5, 116, 0, 0, 351, 352, 5, 105, 0, 0, 352, 353, 5, 111, 0, 0, 353, 354, 5, 110, 0, 0, 354, 8, 1, 0, 0, 0, 355, 356, 5, 115, 0, 0, 356, 357, 5, 117, 0, 0, 357, 358, 5, 98, 0, 0, 358, 359, 5, 106, 0, 0, 359, 360, 5, 101, 0, 0, 360, 361, 5, 99, 0, 0, 361, 362, 5, 116, 0, 0, 362, 10, 1, 0, 0, 0, 363, 364, 5, 102, 0, 0, 364, 365, 5, 111, 0, 0, 365, 366, 5, 114, 0, 0, 366, 12, 1, 0, 0, 0, 367, 368, 5, 99, 0, 0, 368, 369, 5, 114, 0, 0, 369, 370, 5, 101, 0, 0, 370, 371, 5, 97, 0, 0, 371, 372, 5, 116, 0, 0, 372, 373, 5, 105, 0, 0, 373, 374, 5, 111, 0, 0, 374, 375, 5, 110, 0, 0, 375, 14, 1, 0, 0, 0, 376, 377, 5, 118, 0, 0, 377, 378, 5, 97, 0, 0, 378, 379, 5, 114, 0, 0, 379, 380, 5, 105, 0, 0, 380, 381, 5, 97, 0, 0, 381, 382, 5, 110, 0, 0, 382, 383, 5, 116, 0, 0, 383, 16, 1, 0, 0, 0, 384, 385, 5, 112, 0, 0, 385, 386, 5, 114, 0, 0, 386, 387, 5, 101, 0, 0, 387, 388, 5, 112, 0, 0, 388, 389, 5, 97, 0, 0, 389, 390, 5, 114, 0, 0, 390, 391, 5, 101, 0, 0, 391, 392, 5, 115, 0, 0, 392, 18, 1, 0, 0, 0, 393, 394, 5, 105, 0, 0, 394, 395, 5, 110, 0, 0, 395, 396, 5, 105, 0, 0, 396, 397, 5, 116, 0, 0, 397, 398, 5, 105, 0, 0, 398, 399, 5, 97, 0, 0, 399, 400, 5, 108, 0, 0, 400, 401, 5, 105, 0, 0, 401, 402, 5, 122, 0, 0, 402, 403, 5, 101, 0, 0, 403, 20, 1, 0, 0, 0, 404, 405, 5, 119, 0, 0, 405, 406, 5, 111, 0, 0, 406, 407, 5, 114, 0, 0, 407, 408, 5, 107, 0, 0, 408, 409, 5, 115, 0, 0, 409, 410, 5, 112, 0, 0, 410, 411, 5, 97, 0, 0, 411, 412, 5, 99, 0, 0, 412, 413, 5, 101, 0, 0, 413, 22, 1, 0, 0, 0, 414, 415, 5, 101, 0, 0, 415, 416, 5, 120, 0, 0, 416, 417, 5, 101, 0, 0, 417, 418, 5, 99, 0, 0, 418, 419, 5, 117, 0, 0, 419, 420, 5, 116, 0, 0, 420, 421, 5, 105, 0, 0, 421, 422, 5, 111, 0, 0, 422, 423, 5, 110, 0, 0, 423, 24, 1, 0, 0, 0, 424, 425, 5, 115, 0, 0, 425, 426, 5, 110, 0, 0, 426, 427, 5, 97, 0, 0, 427, 428, 5, 112, 0, 0, 428, 429, 5, 115, 0, 0, 429, 430, 5, 104, 0, 0, 430, 431, 5, 111, 0, 0, 431, 432, 5, 116, 0, 0, 432, 26, 1, 0, 0, 0, 433, 434, 5, 116, 0, 0, 434, 435, 5, 114, 0, 0, 435, 436, 5, 97, 0, 0, 436, 437, 5, 110, 0, 0, 437, 438, 5, 115, 0, 0, 438, 439, 5, 97, 0, 0, 439, 440, 5, 99, 0, 0, 440, 441, 5, 116, 0, 0, 441, 442, 5, 105, 0, 0, 442, 443, 5, 111, 0, 0, 443, 444, 5, 110, 0, 0, 444, 28, 1, 0, 0, 0, 445, 446, 5, 114, 0, 0, 446, 447, 5, 101, 0, 0, 447, 448, 5, 109, 0, 0, 448, 449, 5, 111, 0, 0, 449, 450, 5, 116, 0, 0, 450, 451, 5, 101, 0, 0, 451, 30, 1, 0, 0, 0, 452, 453, 5, 116, 0, 0, 453, 454, 5, 97, 0, 0, 454, 455, 5, 114, 0, 0, 455, 456, 5, 103, 0, 0, 456, 457, 5, 101, 0, 0, 457, 458, 5, 116, 0, 0, 458, 459, 5, 115, 0, 0, 459, 32, 1, 0, 0, 0, 460, 461, 5, 112, 0, 0, 461, 462, 5, 111, 0, 0, 462, 463, 5, 114, 0, 0, 463, 464, 5, 116, 0, 0, 464, 465, 5, 97, 0, 0, 465, 466, 5, 98, 0, 0, 466, 467, 5, 108, 0, 0, 467, 468, 5, 101, 0, 0, 468, 34, 1, 0, 0, 0, 469, 470, 5, 114, 0, 0, 470, 471, 5, 101, 0, 0, 471, 472, 5, 112, 0, 0, 472, 473, 5, 108, 0, 0, 473, 474, 5, 105, 0, 0, 474, 475, 5, 99, 0, 0, 475, 476, 5, 97, 0, 0, 476, 36, 1, 0, 0, 0, 477, 478, 5, 108, 0, 0, 478, 479, 5, 111, 0, 0, 479, 480, 5, 99, 0, 0, 480, 481, 5, 97, 0, 0, 481, 482, 5, 108, 0, 0, 482, 38, 1, 0, 0, 0, 483, 484, 5, 102, 0, 0, 484, 485, 5, 114, 0, 0, 485, 486, 5, 111, 0, 0, 486, 487, 5, 109, 0, 0, 487, 40, 1, 0, 0, 0, 488, 489, 5, 114, 0, 0, 489, 490, 5, 101, 0, 0, 490, 491, 5, 115, 0, 0, 491, 492, 5, 117, 0, 0, 492, 493, 5, 108, 0, 0, 493, 494, 5, 116, 0, 0, 494, 495, 5, 45, 0, 0, 495, 496, 5, 98, 0, 0, 496, 497, 5, 121, 0, 0, 497, 498, 5, 116, 0, 0, 498, 499, 5, 101, 0, 0, 499, 500, 5, 115, 0, 0, 500, 42, 1, 0, 0, 0, 501, 502, 5, 114, 0, 0, 502, 503, 5, 112, 0, 0, 503, 504, 5, 99, 0, 0, 504, 505, 5, 45, 0, 0, 505, 506, 5, 99, 0, 0, 506, 507, 5, 97, 0, 0, 507, 508, 5, 108, 0, 0, 508, 509, 5, 108, 0, 0, 509, 510, 5, 115, 0, 0, 510, 44, 1, 0, 0, 0, 511, 512, 5, 100, 0, 0, 512, 513, 5, 101, 0, 0, 513, 514, 5, 97, 0, 0, 514, 515, 5, 100, 0, 0, 515, 516, 5, 108, 0, 0, 516, 517, 5, 105, 0, 0, 517, 518, 5, 110, 0, 0, 518, 519, 5, 101, 0, 0, 519, 520, 5, 45, 0, 0, 520, 521, 5, 109, 0, 0, 521, 522, 5, 115, 0, 0, 522, 46, 1, 0, 0, 0, 523, 524, 5, 113, 0, 0, 524, 525, 5, 117, 0, 0, 525, 526, 5, 101, 0, 0, 526, 527, 5, 114, 0, 0, 527, 528, 5, 121, 0, 0, 528, 48, 1, 0, 0, 0, 529, 530, 5, 114, 0, 0, 530, 531, 5, 101, 0, 0, 531, 532, 5, 102, 0, 0, 532, 533, 5, 108, 0, 0, 533, 534, 5, 101, 0, 0, 534, 535, 5, 99, 0, 0, 535, 536, 5, 116, 0, 0, 536, 537, 5, 105, 0, 0, 537, 538, 5, 111, 0, 0, 538, 539, 5, 110, 0, 0, 539, 50, 1, 0, 0, 0, 540, 541, 5, 115, 0, 0, 541, 542, 5, 112, 0, 0, 542, 543, 5, 101, 0, 0, 543, 544, 5, 99, 0, 0, 544, 545, 5, 105, 0, 0, 545, 546, 5, 97, 0, 0, 546, 547, 5, 108, 0, 0, 547, 548, 5, 105, 0, 0, 548, 549, 5, 122, 0, 0, 549, 550, 5, 101, 0, 0, 550, 52, 1, 0, 0, 0, 551, 552, 5, 114, 0, 0, 552, 553, 5, 111, 0, 0, 553, 554, 5, 111, 0, 0, 554, 555, 5, 116, 0, 0, 555, 54, 1, 0, 0, 0, 556, 557, 5, 100, 0, 0, 557, 558, 5, 111, 0, 0, 558, 559, 5, 99, 0, 0, 559, 560, 5, 117, 0, 0, 560, 561, 5, 109, 0, 0, 561, 562, 5, 101, 0, 0, 562, 563, 5, 110, 0, 0, 563, 564, 5, 116, 0, 0, 564, 56, 1, 0, 0, 0, 565, 566, 5, 102, 0, 0, 566, 567, 5, 114, 0, 0, 567, 568, 5, 97, 0, 0, 568, 569, 5, 103, 0, 0, 569, 570, 5, 109, 0, 0, 570, 571, 5, 101, 0, 0, 571, 572, 5, 110, 0, 0, 572, 573, 5, 116, 0, 0, 573, 574, 5, 115, 0, 0, 574, 58, 1, 0, 0, 0, 575, 576, 5, 118, 0, 0, 576, 577, 5, 105, 0, 0, 577, 578, 5, 101, 0, 0, 578, 579, 5, 119, 0, 0, 579, 60, 1, 0, 0, 0, 580, 581, 5, 109, 0, 0, 581, 582, 5, 97, 0, 0, 582, 583, 5, 120, 0, 0, 583, 62, 1, 0, 0, 0, 584, 585, 5, 97, 0, 0, 585, 586, 5, 108, 0, 0, 586, 587, 5, 108, 0, 0, 587, 588, 5, 111, 0, 0, 588, 589, 5, 119, 0, 0, 589, 64, 1, 0, 0, 0, 590, 591, 5, 112, 0, 0, 591, 592, 5, 111, 0, 0, 592, 593, 5, 108, 0, 0, 593, 594, 5, 108, 0, 0, 594, 66, 1, 0, 0, 0, 595, 596, 5, 113, 0, 0, 596, 597, 5, 117, 0, 0, 597, 598, 5, 101, 0, 0, 598, 599, 5, 114, 0, 0, 599, 600, 5, 121, 0, 0, 600, 601, 5, 97, 0, 0, 601, 602, 5, 98, 0, 0, 602, 603, 5, 108, 0, 0, 603, 604, 5, 101, 0, 0, 604, 68, 1, 0, 0, 0, 605, 606, 5, 114, 0, 0, 606, 607, 5, 112, 0, 0, 607, 608, 5, 99, 0, 0, 608, 70, 1, 0, 0, 0, 609, 610, 5, 113, 0, 0, 610, 611, 5, 117, 0, 0, 611, 612, 5, 101, 0, 0, 612, 613, 5, 114, 0, 0, 613, 614, 5, 121, 0, 0, 614, 615, 5, 45, 0, 0, 615, 616, 5, 114, 0, 0, 616, 617, 5, 101, 0, 0, 617, 618, 5, 97, 0, 0, 618, 619, 5, 115, 0, 0, 619, 620, 5, 111, 0, 0, 620, 621, 5, 110, 0, 0, 621, 72, 1, 0, 0, 0, 622, 623, 5, 116, 0, 0, 623, 624, 5, 121, 0, 0, 624, 625, 5, 112, 0, 0, 625, 626, 5, 101, 0, 0, 626, 74, 1, 0, 0, 0, 627, 628, 5, 111, 0, 0, 628, 629, 5, 98, 0, 0, 629, 630, 5, 106, 0, 0, 630, 631, 5, 101, 0, 0, 631, 632, 5, 99, 0, 0, 632, 633, 5, 116, 0, 0, 633, 76, 1, 0, 0, 0, 634, 635, 5, 115, 0, 0, 635, 636, 5, 116, 0, 0, 636, 637, 5, 111, 0, 0, 637, 638, 5, 114, 0, 0, 638, 639, 5, 97, 0, 0, 639, 640, 5, 98, 0, 0, 640, 641, 5, 108, 0, 0, 641, 642, 5, 101, 0, 0, 642, 78, 1, 0, 0, 0, 643, 644, 5, 105, 0, 0, 644, 645, 5, 109, 0, 0, 645, 646, 5, 112, 0, 0, 646, 647, 5, 108, 0, 0, 647, 648, 5, 101, 0, 0, 648, 649, 5, 109, 0, 0, 649, 650, 5, 101, 0, 0, 650, 651, 5, 110, 0, 0, 651, 652, 5, 116, 0, 0, 652, 653, 5, 115, 0, 0, 653, 80, 1, 0, 0, 0, 654, 655, 5, 114, 0, 0, 655, 656, 5, 101, 0, 0, 656, 657, 5, 102, 0, 0, 657, 82, 1, 0, 0, 0, 658, 659, 5, 102, 0, 0, 659, 660, 5, 114, 0, 0, 660, 661, 5, 97, 0, 0, 661, 662, 5, 103, 0, 0, 662, 663, 5, 109, 0, 0, 663, 664, 5, 101, 0, 0, 664, 665, 5, 110, 0, 0, 665, 666, 5, 116, 0, 0, 666, 84, 1, 0, 0, 0, 667, 668, 5, 105, 0, 0, 668, 669, 5, 109, 0, 0, 669, 670, 5, 112, 0, 0, 670, 671, 5, 111, 0, 0, 671, 672, 5, 114, 0, 0, 672, 673, 5, 116, 0, 0, 673, 86, 1, 0, 0, 0, 674, 675, 5, 101, 0, 0, 675, 676, 5, 120, 0, 0, 676, 677, 5, 116, 0, 0, 677, 678, 5, 101, 0, 0, 678, 679, 5, 114, 0, 0, 679, 680, 5, 110, 0, 0, 680, 681, 5, 97, 0, 0, 681, 682, 5, 108, 0, 0, 682, 88, 1, 0, 0, 0, 683, 684, 5, 97, 0, 0, 684, 685, 5, 116, 0, 0, 685, 686, 5, 111, 0, 0, 686, 687, 5, 109, 0, 0, 687, 90, 1, 0, 0, 0, 688, 689, 5, 105, 0, 0, 689, 690, 5, 110, 0, 0, 690, 691, 5, 116, 0, 0, 691, 692, 5, 101, 0, 0, 692, 693, 5, 114, 0, 0, 693, 694, 5, 102, 0, 0, 694, 695, 5, 97, 0, 0, 695, 696, 5, 99, 0, 0, 696, 697, 5, 101, 0, 0, 697, 92, 1, 0, 0, 0, 698, 699, 5, 105, 0, 0, 699, 700, 5, 110, 0, 0, 700, 701, 5, 116, 0, 0, 701, 702, 5, 101, 0, 0, 702, 703, 5, 114, 0, 0, 703, 704, 5, 102, 0, 0, 704, 705, 5, 97, 0, 0, 705, 706, 5, 99, 0, 0, 706, 707, 5, 101, 0, 0, 707, 708, 5, 115, 0, 0, 708, 94, 1, 0, 0, 0, 709, 710, 5, 112, 0, 0, 710, 711, 5, 97, 0, 0, 711, 712, 5, 99, 0, 0, 712, 713, 5, 107, 0, 0, 713, 714, 5, 97, 0, 0, 714, 715, 5, 103, 0, 0, 715, 716, 5, 101, 0, 0, 716, 96, 1, 0, 0, 0, 717, 718, 5, 118, 0, 0, 718, 719, 5, 97, 0, 0, 719, 720, 5, 108, 0, 0, 720, 721, 5, 117, 0, 0, 721, 722, 5, 101, 0, 0, 722, 98, 1, 0, 0, 0, 723, 724, 5, 102, 0, 0, 724, 725, 5, 105, 0, 0, 725, 726, 5, 101, 0, 0, 726, 727, 5, 108, 0, 0, 727, 728, 5, 100, 0, 0, 728, 100, 1, 0, 0, 0, 729, 730, 5, 114, 0, 0, 730, 731, 5, 101, 0, 0, 731, 732, 5, 108, 0, 0, 732, 733, 5, 97, 0, 0, 733, 734, 5, 116, 0, 0, 734, 735, 5, 105, 0, 0, 735, 736, 5, 111, 0, 0, 736, 737, 5, 110, 0, 0, 737, 102, 1, 0, 0, 0, 738, 739, 5, 111, 0, 0, 739, 740, 5, 112, 0, 0, 740, 741, 5, 101, 0, 0, 741, 742, 5, 114, 0, 0, 742, 743, 5, 97, 0, 0, 743, 744, 5, 116, 0, 0, 744, 745, 5, 105, 0, 0, 745, 746, 5, 111, 0, 0, 746, 747, 5, 110, 0, 0, 747, 104, 1, 0, 0, 0, 748, 749, 5, 102, 0, 0, 749, 750, 5, 117, 0, 0, 750, 751, 5, 110, 0, 0, 751, 752, 5, 99, 0, 0, 752, 753, 5, 116, 0, 0, 753, 754, 5, 105, 0, 0, 754, 755, 5, 111, 0, 0, 755, 756, 5, 110, 0, 0, 756, 106, 1, 0, 0, 0, 757, 758, 5, 99, 0, 0, 758, 759, 5, 111, 0, 0, 759, 760, 5, 110, 0, 0, 760, 761, 5, 115, 0, 0, 761, 762, 5, 116, 0, 0, 762, 763, 5, 114, 0, 0, 763, 764, 5, 117, 0, 0, 764, 765, 5, 99, 0, 0, 765, 766, 5, 116, 0, 0, 766, 767, 5, 111, 0, 0, 767, 768, 5, 114, 0, 0, 768, 108, 1, 0, 0, 0, 769, 770, 5, 99, 0, 0, 770, 771, 5, 111, 0, 0, 771, 772, 5, 110, 0, 0, 772, 773, 5, 115, 0, 0, 773, 774, 5, 116, 0, 0, 774, 775, 5, 114, 0, 0, 775, 776, 5, 117, 0, 0, 776, 777, 5, 99, 0, 0, 777, 778, 5, 116, 0, 0, 778, 779, 5, 115, 0, 0, 779, 110, 1, 0, 0, 0, 780, 781, 5, 105, 0, 0, 781, 782, 5, 110, 0, 0, 782, 783, 5, 112, 0, 0, 783, 784, 5, 117, 0, 0, 784, 785, 5, 116, 0, 0, 785, 112, 1, 0, 0, 0, 786, 787, 5, 99, 0, 0, 787, 788, 5, 111, 0, 0, 788, 789, 5, 110, 0, 0, 789, 790, 5, 102, 0, 0, 790, 791, 5, 111, 0, 0, 791, 792, 5, 114, 0, 0, 792, 793, 5, 109, 0, 0, 793, 114, 1, 0, 0, 0, 794, 795, 5, 97, 0, 0, 795, 796, 5, 115, 0, 0, 796, 116, 1, 0, 0, 0, 797, 798, 5, 98, 0, 0, 798, 799, 5, 105, 0, 0, 799, 800, 5, 110, 0, 0, 800, 801, 5, 100, 0, 0, 801, 118, 1, 0, 0, 0, 802, 803, 5, 115, 0, 0, 803, 804, 5, 116, 0, 0, 804, 805, 5, 97, 0, 0, 805, 806, 5, 116, 0, 0, 806, 807, 5, 105, 0, 0, 807, 808, 5, 99, 0, 0, 808, 120, 1, 0, 0, 0, 809, 810, 5, 116, 0, 0, 810, 811, 5, 111, 0, 0, 811, 122, 1, 0, 0, 0, 812, 813, 5, 112, 0, 0, 813, 814, 5, 114, 0, 0, 814, 815, 5, 105, 0, 0, 815, 816, 5, 118, 0, 0, 816, 817, 5, 97, 0, 0, 817, 818, 5, 116, 0, 0, 818, 819, 5, 101, 0, 0, 819, 124, 1, 0, 0, 0, 820, 821, 5, 115, 0, 0, 821, 822, 5, 104, 0, 0, 822, 823, 5, 97, 0, 0, 823, 824, 5, 114, 0, 0, 824, 825, 5, 101, 0, 0, 825, 826, 5, 100, 0, 0, 826, 126, 1, 0, 0, 0, 827, 828, 5, 115, 0, 0, 828, 829, 5, 116, 0, 0, 829, 830, 5, 97, 0, 0, 830, 831, 5, 116, 0, 0, 831, 832, 5, 101, 0, 0, 832, 128, 1, 0, 0, 0, 833, 834, 5, 101, 0, 0, 834, 835, 5, 100, 0, 0, 835, 836, 5, 103, 0, 0, 836, 837, 5, 101, 0, 0, 837, 130, 1, 0, 0, 0, 838, 839, 5, 112, 0, 0, 839, 840, 5, 114, 0, 0, 840, 841, 5, 111, 0, 0, 841, 842, 5, 106, 0, 0, 842, 843, 5, 101, 0, 0, 843, 844, 5, 99, 0, 0, 844, 845, 5, 116, 0, 0, 845, 846, 5, 105, 0, 0, 846, 847, 5, 111, 0, 0, 847, 848, 5, 110, 0, 0, 848, 132, 1, 0, 0, 0, 849, 850, 5, 119, 0, 0, 850, 851, 5, 105, 0, 0, 851, 852, 5, 116, 0, 0, 852, 853, 5, 104, 0, 0, 853, 134, 1, 0, 0, 0, 854, 855, 5, 117, 0, 0, 855, 856, 5, 115, 0, 0, 856, 857, 5, 105, 0, 0, 857, 858, 5, 110, 0, 0, 858, 859, 5, 103, 0, 0, 859, 136, 1, 0, 0, 0, 860, 861, 5, 97, 0, 0, 861, 862, 5, 99, 0, 0, 862, 863, 5, 99, 0, 0, 863, 864, 5, 101, 0, 0, 864, 865, 5, 112, 0, 0, 865, 866, 5, 116, 0, 0, 866, 138, 1, 0, 0, 0, 867, 868, 5, 118, 0, 0, 868, 869, 5, 105, 0, 0, 869, 870, 5, 97, 0, 0, 870, 140, 1, 0, 0, 0, 871, 872, 5, 109, 0, 0, 872, 873, 5, 97, 0, 0, 873, 874, 5, 116, 0, 0, 874, 875, 5, 101, 0, 0, 875, 876, 5, 114, 0, 0, 876, 877, 5, 105, 0, 0, 877, 878, 5, 97, 0, 0, 878, 879, 5, 108, 0, 0, 879, 880, 5, 105, 0, 0, 880, 881, 5, 122, 0, 0, 881, 882, 5, 101, 0, 0, 882, 142, 1, 0, 0, 0, 883, 884, 5, 105, 0, 0, 884, 885, 5, 102, 0, 0, 885, 144, 1, 0, 0, 0, 886, 887, 5, 97, 0, 0, 887, 888, 5, 98, 0, 0, 888, 889, 5, 115, 0, 0, 889, 890, 5, 101, 0, 0, 890, 891, 5, 110, 0, 0, 891, 892, 5, 116, 0, 0, 892, 146, 1, 0, 0, 0, 893, 894, 5, 111, 0, 0, 894, 895, 5, 110, 0, 0, 895, 148, 1, 0, 0, 0, 896, 897, 5, 112, 0, 0, 897, 898, 5, 111, 0, 0, 898, 899, 5, 108, 0, 0, 899, 900, 5, 105, 0, 0, 900, 901, 5, 99, 0, 0, 901, 902, 5, 121, 0, 0, 902, 150, 1, 0, 0, 0, 903, 904, 5, 100, 0, 0, 904, 905, 5, 101, 0, 0, 905, 906, 5, 102, 0, 0, 906, 907, 5, 97, 0, 0, 907, 908, 5, 117, 0, 0, 908, 909, 5, 108, 0, 0, 909, 910, 5, 116, 0, 0, 910, 152, 1, 0, 0, 0, 911, 912, 5, 115, 0, 0, 912, 913, 5, 111, 0, 0, 913, 914, 5, 117, 0, 0, 914, 915, 5, 114, 0, 0, 915, 916, 5, 99, 0, 0, 916, 917, 5, 101, 0, 0, 917, 154, 1, 0, 0, 0, 918, 919, 5, 114, 0, 0, 919, 920, 5, 101, 0, 0, 920, 921, 5, 112, 0, 0, 921, 922, 5, 111, 0, 0, 922, 923, 5, 115, 0, 0, 923, 924, 5, 105, 0, 0, 924, 925, 5, 116, 0, 0, 925, 926, 5, 111, 0, 0, 926, 927, 5, 114, 0, 0, 927, 928, 5, 121, 0, 0, 928, 156, 1, 0, 0, 0, 929, 930, 5, 99, 0, 0, 930, 931, 5, 111, 0, 0, 931, 932, 5, 109, 0, 0, 932, 933, 5, 109, 0, 0, 933, 934, 5, 105, 0, 0, 934, 935, 5, 116, 0, 0, 935, 158, 1, 0, 0, 0, 936, 937, 5, 114, 0, 0, 937, 938, 5, 101, 0, 0, 938, 939, 5, 118, 0, 0, 939, 940, 5, 105, 0, 0, 940, 941, 5, 115, 0, 0, 941, 942, 5, 105, 0, 0, 942, 943, 5, 111, 0, 0, 943, 944, 5, 110, 0, 0, 944, 160, 1, 0, 0, 0, 945, 946, 5, 115, 0, 0, 946, 947, 5, 101, 0, 0, 947, 948, 5, 109, 0, 0, 948, 949, 5, 97, 0, 0, 949, 950, 5, 110, 0, 0, 950, 951, 5, 116, 0, 0, 951, 952, 5, 105, 0, 0, 952, 953, 5, 99, 0, 0, 953, 954, 5, 45, 0, 0, 954, 955, 5, 109, 0, 0, 955, 956, 5, 97, 0, 0, 956, 957, 5, 106, 0, 0, 957, 958, 5, 111, 0, 0, 958, 959, 5, 114, 0, 0, 959, 162, 1, 0, 0, 0, 960, 961, 5, 111, 0, 0, 961, 962, 5, 110, 0, 0, 962, 963, 5, 45, 0, 0, 963, 964, 5, 100, 0, 0, 964, 965, 5, 101, 0, 0, 965, 966, 5, 108, 0, 0, 966, 967, 5, 101, 0, 0, 967, 968, 5, 116, 0, 0, 968, 969, 5, 101, 0, 0, 969, 164, 1, 0, 0, 0, 970, 971, 5, 108, 0, 0, 971, 972, 5, 105, 0, 0, 972, 973, 5, 102, 0, 0, 973, 974, 5, 101, 0, 0, 974, 975, 5, 99, 0, 0, 975, 976, 5, 121, 0, 0, 976, 977, 5, 99, 0, 0, 977, 978, 5, 108, 0, 0, 978, 979, 5, 101, 0, 0, 979, 166, 1, 0, 0, 0, 980, 981, 5, 106, 0, 0, 981, 982, 5, 111, 0, 0, 982, 983, 5, 117, 0, 0, 983, 984, 5, 114, 0, 0, 984, 985, 5, 110, 0, 0, 985, 986, 5, 97, 0, 0, 986, 987, 5, 108, 0, 0, 987, 168, 1, 0, 0, 0, 988, 989, 5, 115, 0, 0, 989, 990, 5, 117, 0, 0, 990, 991, 5, 98, 0, 0, 991, 992, 5, 115, 0, 0, 992, 993, 5, 99, 0, 0, 993, 994, 5, 114, 0, 0, 994, 995, 5, 105, 0, 0, 995, 996, 5, 112, 0, 0, 996, 997, 5, 116, 0, 0, 997, 998, 5, 105, 0, 0, 998, 999, 5, 111, 0, 0, 999, 1000, 5, 110, 0, 0, 1000, 170, 1, 0, 0, 0, 1001, 1002, 5, 114, 0, 0, 1002, 1003, 5, 101, 0, 0, 1003, 1004, 5, 116, 0, 0, 1004, 1005, 5, 97, 0, 0, 1005, 1006, 5, 105, 0, 0, 1006, 1007, 5, 110, 0, 0, 1007, 1008, 5, 45, 0, 0, 1008, 1009, 5, 111, 0, 0, 1009, 1010, 5, 116, 0, 0, 1010, 1011, 5, 104, 0, 0, 1011, 1012, 5, 101, 0, 0, 1012, 1013, 5, 114, 0, 0, 1013, 172, 1, 0, 0, 0, 1014, 1015, 5, 107, 0, 0, 1015, 1016, 5, 101, 0, 0, 1016, 1017, 5, 121, 0, 0, 1017, 1018, 5, 101, 0, 0, 1018, 1019, 5, 100, 0, 0, 1019, 174, 1, 0, 0, 0, 1020, 1021, 5, 112, 0, 0, 1021, 1022, 5, 117, 0, 0, 1022, 1023, 5, 98, 0, 0, 1023, 1024, 5, 108, 0, 0, 1024, 1025, 5, 105, 0, 0, 1025, 1026, 5, 99, 0, 0, 1026, 1027, 5, 45, 0, 0, 1027, 1028, 5, 116, 0, 0, 1028, 1029, 5, 114, 0, 0, 1029, 1030, 5, 97, 0, 0, 1030, 1031, 5, 118, 0, 0, 1031, 1032, 5, 101, 0, 0, 1032, 1033, 5, 114, 0, 0, 1033, 1034, 5, 115, 0, 0, 1034, 1035, 5, 97, 0, 0, 1035, 1036, 5, 108, 0, 0, 1036, 176, 1, 0, 0, 0, 1037, 1038, 5, 105, 0, 0, 1038, 1039, 5, 100, 0, 0, 1039, 178, 1, 0, 0, 0, 1040, 1041, 5, 100, 0, 0, 1041, 1042, 5, 111, 0, 0, 1042, 1043, 5, 99, 0, 0, 1043, 180, 1, 0, 0, 0, 1044, 1045, 5, 109, 0, 0, 1045, 1046, 5, 111, 0, 0, 1046, 1047, 5, 100, 0, 0, 1047, 1048, 5, 101, 0, 0, 1048, 182, 1, 0, 0, 0, 1049, 1050, 5, 101, 0, 0, 1050, 1051, 5, 109, 0, 0, 1051, 1052, 5, 105, 0, 0, 1052, 1053, 5, 116, 0, 0, 1053, 1054, 5, 115, 0, 0, 1054, 184, 1, 0, 0, 0, 1055, 1056, 5, 114, 0, 0, 1056, 1057, 5, 101, 0, 0, 1057, 1058, 5, 99, 0, 0, 1058, 1059, 5, 101, 0, 0, 1059, 1060, 5, 105, 0, 0, 1060, 1061, 5, 118, 0, 0, 1061, 1062, 5, 101, 0, 0, 1062, 1063, 5, 114, 0, 0, 1063, 186, 1, 0, 0, 0, 1064, 1065, 5, 114, 0, 0, 1065, 1066, 5, 101, 0, 0, 1066, 1067, 5, 113, 0, 0, 1067, 1068, 5, 117, 0, 0, 1068, 1069, 5, 105, 0, 0, 1069, 1070, 5, 114, 0, 0, 1070, 1071, 5, 101, 0, 0, 1071, 1072, 5, 115, 0, 0, 1072, 188, 1, 0, 0, 0, 1073, 1074, 5, 97, 0, 0, 1074, 1075, 5, 110, 0, 0, 1075, 1076, 5, 121, 0, 0, 1076, 190, 1, 0, 0, 0, 1077, 1078, 5, 103, 0, 0, 1078, 1079, 5, 101, 0, 0, 1079, 1080, 5, 116, 0, 0, 1080, 192, 1, 0, 0, 0, 1081, 1082, 5, 115, 0, 0, 1082, 1083, 5, 101, 0, 0, 1083, 1084, 5, 116, 0, 0, 1084, 194, 1, 0, 0, 0, 1085, 1086, 5, 119, 0, 0, 1086, 1087, 5, 97, 0, 0, 1087, 1088, 5, 116, 0, 0, 1088, 1089, 5, 99, 0, 0, 1089, 1090, 5, 104, 0, 0, 1090, 196, 1, 0, 0, 0, 1091, 1092, 5, 115, 0, 0, 1092, 1093, 5, 116, 0, 0, 1093, 1094, 5, 97, 0, 0, 1094, 1095, 5, 114, 0, 0, 1095, 1096, 5, 116, 0, 0, 1096, 198, 1, 0, 0, 0, 1097, 1098, 5, 115, 0, 0, 1098, 1099, 5, 116, 0, 0, 1099, 1100, 5, 111, 0, 0, 1100, 1101, 5, 112, 0, 0, 1101, 200, 1, 0, 0, 0, 1102, 1103, 5, 114, 0, 0, 1103, 1104, 5, 101, 0, 0, 1104, 1105, 5, 97, 0, 0, 1105, 1106, 5, 100, 0, 0, 1106, 202, 1, 0, 0, 0, 1107, 1108, 5, 119, 0, 0, 1108, 1109, 5, 114, 0, 0, 1109, 1110, 5, 105, 0, 0, 1110, 1111, 5, 116, 0, 0, 1111, 1112, 5, 101, 0, 0, 1112, 204, 1, 0, 0, 0, 1113, 1114, 5, 114, 0, 0, 1114, 1115, 5, 101, 0, 0, 1115, 1116, 5, 115, 0, 0, 1116, 1117, 5, 111, 0, 0, 1117, 1118, 5, 108, 0, 0, 1118, 1119, 5, 118, 0, 0, 1119, 1120, 5, 101, 0, 0, 1120, 206, 1, 0, 0, 0, 1121, 1122, 5, 99, 0, 0, 1122, 1123, 5, 111, 0, 0, 1123, 1124, 5, 110, 0, 0, 1124, 1125, 5, 110, 0, 0, 1125, 1126, 5, 101, 0, 0, 1126, 1127, 5, 99, 0, 0, 1127, 1128, 5, 116, 0, 0, 1128, 208, 1, 0, 0, 0, 1129, 1130, 5, 100, 0, 0, 1130, 1131, 5, 105, 0, 0, 1131, 1132, 5, 115, 0, 0, 1132, 1133, 5, 99, 0, 0, 1133, 1134, 5, 111, 0, 0, 1134, 1135, 5, 110, 0, 0, 1135, 1136, 5, 110, 0, 0, 1136, 1137, 5, 101, 0, 0, 1137, 1138, 5, 99, 0, 0, 1138, 1139, 5, 116, 0, 0, 1139, 210, 1, 0, 0, 0, 1140, 1141, 5, 99, 0, 0, 1141, 1142, 5, 97, 0, 0, 1142, 1143, 5, 108, 0, 0, 1143, 1144, 5, 108, 0, 0, 1144, 212, 1, 0, 0, 0, 1145, 1146, 5, 119, 0, 0, 1146, 1147, 5, 97, 0, 0, 1147, 1148, 5, 116, 0, 0, 1148, 1149, 5, 99, 0, 0, 1149, 1150, 5, 104, 0, 0, 1150, 1151, 5, 45, 0, 0, 1151, 1152, 5, 115, 0, 0, 1152, 1153, 5, 116, 0, 0, 1153, 1154, 5, 97, 0, 0, 1154, 1155, 5, 114, 0, 0, 1155, 1156, 5, 116, 0, 0, 1156, 214, 1, 0, 0, 0, 1157, 1158, 5, 119, 0, 0, 1158, 1159, 5, 97, 0, 0, 1159, 1160, 5, 116, 0, 0, 1160, 1161, 5, 99, 0, 0, 1161, 1162, 5, 104, 0, 0, 1162, 1163, 5, 45, 0, 0, 1163, 1164, 5, 115, 0, 0, 1164, 1165, 5, 116, 0, 0, 1165, 1166, 5, 111, 0, 0, 1166, 1167, 5, 112, 0, 0, 1167, 216, 1, 0, 0, 0, 1168, 1169, 5, 115, 0, 0, 1169, 1170, 5, 117, 0, 0, 1170, 1171, 5, 98, 0, 0, 1171, 1172, 5, 115, 0, 0, 1172, 1173, 5, 99, 0, 0, 1173, 1174, 5, 114, 0, 0, 1174, 1175, 5, 105, 0, 0, 1175, 1176, 5, 98, 0, 0, 1176, 1177, 5, 101, 0, 0, 1177, 218, 1, 0, 0, 0, 1178, 1179, 5, 117, 0, 0, 1179, 1180, 5, 110, 0, 0, 1180, 1181, 5, 115, 0, 0, 1181, 1182, 5, 117, 0, 0, 1182, 1183, 5, 98, 0, 0, 1183, 1184, 5, 115, 0, 0, 1184, 1185, 5, 99, 0, 0, 1185, 1186, 5, 114, 0, 0, 1186, 1187, 5, 105, 0, 0, 1187, 1188, 5, 98, 0, 0, 1188, 1189, 5, 101, 0, 0, 1189, 220, 1, 0, 0, 0, 1190, 1191, 5, 114, 0, 0, 1191, 1192, 5, 101, 0, 0, 1192, 1193, 5, 103, 0, 0, 1193, 1194, 5, 105, 0, 0, 1194, 1195, 5, 115, 0, 0, 1195, 1196, 5, 116, 0, 0, 1196, 1197, 5, 101, 0, 0, 1197, 1198, 5, 114, 0, 0, 1198, 222, 1, 0, 0, 0, 1199, 1200, 5, 99, 0, 0, 1200, 1201, 5, 114, 0, 0, 1201, 1202, 5, 100, 0, 0, 1202, 1203, 5, 116, 0, 0, 1203, 224, 1, 0, 0, 0, 1204, 1205, 5, 111, 0, 0, 1205, 1206, 5, 112, 0, 0, 1206, 1207, 5, 116, 0, 0, 1207, 1208, 5, 105, 0, 0, 1208, 1209, 5, 111, 0, 0, 1209, 1210, 5, 110, 0, 0, 1210, 1211, 5, 97, 0, 0, 1211, 1212, 5, 108, 0, 0, 1212, 1213, 5, 45, 0, 0, 1213, 1214, 5, 111, 0, 0, 1214, 1215, 5, 110, 0, 0, 1215, 1216, 5, 101, 0, 0, 1216, 226, 1, 0, 0, 0, 1217, 1218, 5, 101, 0, 0, 1218, 1219, 5, 120, 0, 0, 1219, 1220, 5, 97, 0, 0, 1220, 1221, 5, 99, 0, 0, 1221, 1222, 5, 116, 0, 0, 1222, 1223, 5, 108, 0, 0, 1223, 1224, 5, 121, 0, 0, 1224, 1225, 5, 45, 0, 0, 1225, 1226, 5, 111, 0, 0, 1226, 1227, 5, 110, 0, 0, 1227, 1228, 5, 101, 0, 0, 1228, 228, 1, 0, 0, 0, 1229, 1230, 5, 109, 0, 0, 1230, 1231, 5, 97, 0, 0, 1231, 1232, 5, 110, 0, 0, 1232, 1233, 5, 121, 0, 0, 1233, 1234, 5, 45, 0, 0, 1234, 1235, 5, 117, 0, 0, 1235, 1236, 5, 110, 0, 0, 1236, 1237, 5, 105, 0, 0, 1237, 1238, 5, 113, 0, 0, 1238, 1239, 5, 117, 0, 0, 1239, 1240, 5, 101, 0, 0, 1240, 230, 1, 0, 0, 0, 1241, 1242, 5, 109, 0, 0, 1242, 1243, 5, 97, 0, 0, 1243, 1244, 5, 110, 0, 0, 1244, 1245, 5, 121, 0, 0, 1245, 232, 1, 0, 0, 0, 1246, 1247, 5, 111, 0, 0, 1247, 1248, 5, 114, 0, 0, 1248, 1249, 5, 100, 0, 0, 1249, 1250, 5, 101, 0, 0, 1250, 1251, 5, 114, 0, 0, 1251, 1252, 5, 101, 0, 0, 1252, 1253, 5, 100, 0, 0, 1253, 234, 1, 0, 0, 0, 1254, 1255, 5, 117, 0, 0, 1255, 1256, 5, 110, 0, 0, 1256, 1257, 5, 105, 0, 0, 1257, 1258, 5, 116, 0, 0, 1258, 236, 1, 0, 0, 0, 1259, 1260, 5, 119, 0, 0, 1260, 1261, 5, 97, 0, 0, 1261, 1262, 5, 116, 0, 0, 1262, 1263, 5, 99, 0, 0, 1263, 1264, 5, 104, 0, 0, 1264, 1265, 5, 45, 0, 0, 1265, 1266, 5, 104, 0, 0, 1266, 1267, 5, 97, 0, 0, 1267, 1268, 5, 110, 0, 0, 1268, 1269, 5, 100, 0, 0, 1269, 1270, 5, 108, 0, 0, 1270, 1271, 5, 101, 0, 0, 1271, 238, 1, 0, 0, 0, 1272, 1273, 5, 109, 0, 0, 1273, 1274, 5, 101, 0, 0, 1274, 1275, 5, 115, 0, 0, 1275, 1276, 5, 115, 0, 0, 1276, 1277, 5, 97, 0, 0, 1277, 1278, 5, 103, 0, 0, 1278, 1279, 5, 101, 0, 0, 1279, 240, 1, 0, 0, 0, 1280, 1281, 5, 97, 0, 0, 1281, 1282, 5, 116, 0, 0, 1282, 1283, 5, 111, 0, 0, 1283, 1284, 5, 109, 0, 0, 1284, 1285, 5, 45, 0, 0, 1285, 1286, 5, 114, 0, 0, 1286, 1287, 5, 101, 0, 0, 1287, 1288, 5, 102, 0, 0, 1288, 242, 1, 0, 0, 0, 1289, 1290, 5, 105, 0, 0, 1290, 1291, 5, 110, 0, 0, 1291, 1292, 5, 116, 0, 0, 1292, 1293, 5, 101, 0, 0, 1293, 1294, 5, 114, 0, 0, 1294, 1295, 5, 102, 0, 0, 1295, 1296, 5, 97, 0, 0, 1296, 1297, 5, 99, 0, 0, 1297, 1298, 5, 101, 0, 0, 1298, 1299, 5, 45, 0, 0, 1299, 1300, 5, 114, 0, 0, 1300, 1301, 5, 101, 0, 0, 1301, 1302, 5, 102, 0, 0, 1302, 244, 1, 0, 0, 0, 1303, 1304, 5, 111, 0, 0, 1304, 1305, 5, 112, 0, 0, 1305, 1306, 5, 116, 0, 0, 1306, 1307, 5, 105, 0, 0, 1307, 1308, 5, 111, 0, 0, 1308, 1309, 5, 110, 0, 0, 1309, 1310, 5, 97, 0, 0, 1310, 1311, 5, 108, 0, 0, 1311, 246, 1, 0, 0, 0, 1312, 1313, 5, 108, 0, 0, 1313, 1314, 5, 105, 0, 0, 1314, 1315, 5, 115, 0, 0, 1315, 1316, 5, 116, 0, 0, 1316, 248, 1, 0, 0, 0, 1317, 1318, 5, 114, 0, 0, 1318, 1319, 5, 101, 0, 0, 1319, 1320, 5, 99, 0, 0, 1320, 1321, 5, 111, 0, 0, 1321, 1322, 5, 114, 0, 0, 1322, 1323, 5, 100, 0, 0, 1323, 250, 1, 0, 0, 0, 1324, 1325, 5, 98, 0, 0, 1325, 1326, 5, 111, 0, 0, 1326, 1327, 5, 111, 0, 0, 1327, 1328, 5, 108, 0, 0, 1328, 252, 1, 0, 0, 0, 1329, 1330, 5, 98, 0, 0, 1330, 1331, 5, 121, 0, 0, 1331, 1332, 5, 116, 0, 0, 1332, 1333, 5, 101, 0, 0, 1333, 1334, 5, 115, 0, 0, 1334, 254, 1, 0, 0, 0, 1335, 1336, 5, 100, 0, 0, 1336, 1337, 5, 111, 0, 0, 1337, 1338, 5, 117, 0, 0, 1338, 1339, 5, 98, 0, 0, 1339, 1340, 5, 108, 0, 0, 1340, 1341, 5, 101, 0, 0, 1341, 256, 1, 0, 0, 0, 1342, 1343, 5, 105, 0, 0, 1343, 1344, 5, 110, 0, 0, 1344, 1345, 5, 116, 0, 0, 1345, 1346, 5, 51, 0, 0, 1346, 1347, 5, 50, 0, 0, 1347, 258, 1, 0, 0, 0, 1348, 1349, 5, 105, 0, 0, 1349, 1350, 5, 110, 0, 0, 1350, 1351, 5, 116, 0, 0, 1351, 1352, 5, 54, 0, 0, 1352, 1353, 5, 52, 0, 0, 1353, 260, 1, 0, 0, 0, 1354, 1355, 5, 115, 0, 0, 1355, 1356, 5, 116, 0, 0, 1356, 1357, 5, 114, 0, 0, 1357, 1358, 5, 105, 0, 0, 1358, 1359, 5, 110, 0, 0, 1359, 1360, 5, 103, 0, 0, 1360, 262, 1, 0, 0, 0, 1361, 1362, 5, 117, 0, 0, 1362, 1363, 5, 105, 0, 0, 1363, 1364, 5, 110, 0, 0, 1364, 1365, 5, 116, 0, 0, 1365, 1366, 5, 51, 0, 0, 1366, 1367, 5, 50, 0, 0, 1367, 264, 1, 0, 0, 0, 1368, 1369, 5, 117, 0, 0, 1369, 1370, 5, 105, 0, 0, 1370, 1371, 5, 110, 0, 0, 1371, 1372, 5, 116, 0, 0, 1372, 1373, 5, 54, 0, 0, 1373, 1374, 5, 52, 0, 0, 1374, 266, 1, 0, 0, 0, 1375, 1376, 5, 116, 0, 0, 1376, 1377, 5, 114, 0, 0, 1377, 1378, 5, 117, 0, 0, 1378, 1379, 5, 101, 0, 0, 1379, 268, 1, 0, 0, 0, 1380, 1381, 5, 102, 0, 0, 1381, 1382, 5, 97, 0, 0, 1382, 1383, 5, 108, 0, 0, 1383, 1384, 5, 115, 0, 0, 1384, 1385, 5, 101, 0, 0, 1385, 270, 1, 0, 0, 0, 1386, 1387, 5, 110, 0, 0, 1387, 1388, 5, 117, 0, 0, 1388, 1389, 5, 108, 0, 0, 1389, 1390, 5, 108, 0, 0, 1390, 272, 1, 0, 0, 0, 1391, 1392, 5, 45, 0, 0, 1392, 1393, 5, 62, 0, 0, 1393, 274, 1, 0, 0, 0, 1394, 1395, 5, 58, 0, 0, 1395, 276, 1, 0, 0, 0, 1396, 1397, 5, 59, 0, 0, 1397, 278, 1, 0, 0, 0, 1398, 1399, 5, 44, 0, 0, 1399, 280, 1, 0, 0, 0, 1400, 1401, 5, 46, 0, 0, 1401, 282, 1, 0, 0, 0, 1402, 1403, 5, 123, 0, 0, 1403, 284, 1, 0, 0, 0, 1404, 1405, 5, 125, 0, 0, 1405, 286, 1, 0, 0, 0, 1406, 1407, 5, 91, 0, 0, 1407, 288, 1, 0, 0, 0, 1408, 1409, 5, 93, 0, 0, 1409, 290, 1, 0, 0, 0, 1410, 1411, 5, 40, 0, 0, 1411, 292, 1, 0, 0, 0, 1412, 1413, 5, 41, 0, 0, 1413, 294, 1, 0, 0, 0, 1414, 1415, 5, 60, 0, 0, 1415, 296, 1, 0, 0, 0, 1416, 1417, 5, 62, 0, 0, 1417, 298, 1, 0, 0, 0, 1418, 1419, 5, 38, 0, 0, 1419, 300, 1, 0, 0, 0, 1420, 1421, 5, 61, 0, 0, 1421, 302, 1, 0, 0, 0, 1422, 1424, 5, 45, 0, 0, 1423, 1422, 1, 0, 0, 0, 1423, 1424, 1, 0, 0, 0, 1424, 1426, 1, 0, 0, 0, 1425, 1427, 7, 0, 0, 0, 1426, 1425, 1, 0, 0, 0, 1427, 1428, 1, 0, 0, 0, 1428, 1426, 1, 0, 0, 0, 1428, 1429, 1, 0, 0, 0, 1429, 304, 1, 0, 0, 0, 1430, 1432, 5, 45, 0, 0, 1431, 1430, 1, 0, 0, 0, 1431, 1432, 1, 0, 0, 0, 1432, 1441, 1, 0, 0, 0, 1433, 1442, 5, 48, 0, 0, 1434, 1438, 7, 1, 0, 0, 1435, 1437, 7, 0, 0, 0, 1436, 1435, 1, 0, 0, 0, 1437, 1440, 1, 0, 0, 0, 1438, 1436, 1, 0, 0, 0, 1438, 1439, 1, 0, 0, 0, 1439, 1442, 1, 0, 0, 0, 1440, 1438, 1, 0, 0, 0, 1441, 1433, 1, 0, 0, 0, 1441, 1434, 1, 0, 0, 0, 1442, 1449, 1, 0, 0, 0, 1443, 1445, 5, 46, 0, 0, 1444, 1446, 7, 0, 0, 0, 1445, 1444, 1, 0, 0, 0, 1446, 1447, 1, 0, 0, 0, 1447, 1445, 1, 0, 0, 0, 1447, 1448, 1, 0, 0, 0, 1448, 1450, 1, 0, 0, 0, 1449, 1443, 1, 0, 0, 0, 1449, 1450, 1, 0, 0, 0, 1450, 1460, 1, 0, 0, 0, 1451, 1453, 7, 2, 0, 0, 1452, 1454, 7, 3, 0, 0, 1453, 1452, 1, 0, 0, 0, 1453, 1454, 1, 0, 0, 0, 1454, 1456, 1, 0, 0, 0, 1455, 1457, 7, 0, 0, 0, 1456, 1455, 1, 0, 0, 0, 1457, 1458, 1, 0, 0, 0, 1458, 1456, 1, 0, 0, 0, 1458, 1459, 1, 0, 0, 0, 1459, 1461, 1, 0, 0, 0, 1460, 1451, 1, 0, 0, 0, 1460, 1461, 1, 0, 0, 0, 1461, 306, 1, 0, 0, 0, 1462, 1466, 7, 4, 0, 0, 1463, 1465, 7, 5, 0, 0, 1464, 1463, 1, 0, 0, 0, 1465, 1468, 1, 0, 0, 0, 1466, 1464, 1, 0, 0, 0, 1466, 1467, 1, 0, 0, 0, 1467, 308, 1, 0, 0, 0, 1468, 1466, 1, 0, 0, 0, 1469, 1474, 5, 34, 0, 0, 1470, 1473, 3, 311, 155, 0, 1471, 1473, 8, 6, 0, 0, 1472, 1470, 1, 0, 0, 0, 1472, 1471, 1, 0, 0, 0, 1473, 1476, 1, 0, 0, 0, 1474, 1472, 1, 0, 0, 0, 1474, 1475, 1, 0, 0, 0, 1475, 1477, 1, 0, 0, 0, 1476, 1474, 1, 0, 0, 0, 1477, 1478, 5, 34, 0, 0, 1478, 310, 1, 0, 0, 0, 1479, 1487, 5, 92, 0, 0, 1480, 1488, 7, 7, 0, 0, 1481, 1482, 5, 117, 0, 0, 1482, 1483, 3, 313, 156, 0, 1483, 1484, 3, 313, 156, 0, 1484, 1485, 3, 313, 156, 0, 1485, 1486, 3, 313, 156, 0, 1486, 1488, 1, 0, 0, 0, 1487, 1480, 1, 0, 0, 0, 1487, 1481, 1, 0, 0, 0, 1488, 312, 1, 0, 0, 0, 1489, 1490, 7, 8, 0, 0, 1490, 314, 1, 0, 0, 0, 1491, 1492, 5, 47, 0, 0, 1492, 1493, 5, 47, 0, 0, 1493, 1497, 1, 0, 0, 0, 1494, 1496, 8, 9, 0, 0, 1495, 1494, 1, 0, 0, 0, 1496, 1499, 1, 0, 0, 0, 1497, 1495, 1, 0, 0, 0, 1497, 1498, 1, 0, 0, 0, 1498, 1500, 1, 0, 0, 0, 1499, 1497, 1, 0, 0, 0, 1500, 1501, 6, 157, 0, 0, 1501, 316, 1, 0, 0, 0, 1502, 1503, 5, 47, 0, 0, 1503, 1504, 5, 42, 0, 0, 1504, 1508, 1, 0, 0, 0, 1505, 1507, 9, 0, 0, 0, 1506, 1505, 1, 0, 0, 0, 1507, 1510, 1, 0, 0, 0, 1508, 1509, 1, 0, 0, 0, 1508, 1506, 1, 0, 0, 0, 1509, 1511, 1, 0, 0, 0, 1510, 1508, 1, 0, 0, 0, 1511, 1512, 5, 42, 0, 0, 1512, 1513, 5, 47, 0, 0, 1513, 1514, 1, 0, 0, 0, 1514, 1515, 6, 158, 0, 0, 1515, 318, 1, 0, 0, 0, 1516, 1518, 7, 10, 0, 0, 1517, 1516, 1, 0, 0, 0, 1518, 1519, 1, 0, 0, 0, 1519, 1517, 1, 0, 0, 0, 1519, 1520, 1, 0, 0, 0, 1520, 1521, 1, 0, 0, 0, 1521, 1522, 6, 159, 0, 0, 1522, 320, 1, 0, 0, 0, 18, 0, 1423, 1428, 1431, 1438, 1441, 1447, 1449, 1453, 1458, 1460, 1466, 1472, 1474, 1487, 1497, 1508, 1519, 1, 0, 1, 0] \ No newline at end of file +[4, 0, 159, 1532, 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, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 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, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 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, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 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, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 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, 27, 1, 28, 1, 28, 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, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 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, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 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, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 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, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 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, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 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, 1, 55, 1, 55, 1, 55, 1, 55, 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, 57, 1, 57, 1, 57, 1, 57, 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, 60, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 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, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 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, 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, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 75, 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, 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, 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, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 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, 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, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 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, 86, 1, 86, 1, 86, 1, 87, 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, 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, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 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, 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, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 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, 103, 1, 104, 1, 104, 1, 104, 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, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 115, 1, 116, 1, 116, 1, 116, 1, 116, 1, 116, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 117, 1, 118, 1, 118, 1, 118, 1, 118, 1, 118, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 119, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 120, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 121, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 122, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 123, 1, 124, 1, 124, 1, 124, 1, 124, 1, 124, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 125, 1, 126, 1, 126, 1, 126, 1, 126, 1, 126, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 127, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 128, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 129, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 130, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 131, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 132, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 133, 1, 134, 1, 134, 1, 134, 1, 134, 1, 134, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 135, 1, 136, 1, 136, 1, 136, 1, 136, 1, 136, 1, 137, 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, 144, 1, 144, 1, 145, 1, 145, 1, 146, 1, 146, 1, 147, 1, 147, 1, 148, 1, 148, 1, 149, 1, 149, 1, 150, 1, 150, 1, 151, 1, 151, 1, 152, 3, 152, 1433, 8, 152, 1, 152, 4, 152, 1436, 8, 152, 11, 152, 12, 152, 1437, 1, 153, 3, 153, 1441, 8, 153, 1, 153, 1, 153, 1, 153, 5, 153, 1446, 8, 153, 10, 153, 12, 153, 1449, 9, 153, 3, 153, 1451, 8, 153, 1, 153, 1, 153, 4, 153, 1455, 8, 153, 11, 153, 12, 153, 1456, 3, 153, 1459, 8, 153, 1, 153, 1, 153, 3, 153, 1463, 8, 153, 1, 153, 4, 153, 1466, 8, 153, 11, 153, 12, 153, 1467, 3, 153, 1470, 8, 153, 1, 154, 1, 154, 5, 154, 1474, 8, 154, 10, 154, 12, 154, 1477, 9, 154, 1, 155, 1, 155, 1, 155, 5, 155, 1482, 8, 155, 10, 155, 12, 155, 1485, 9, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 1, 156, 3, 156, 1497, 8, 156, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 5, 158, 1505, 8, 158, 10, 158, 12, 158, 1508, 9, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 5, 159, 1516, 8, 159, 10, 159, 12, 159, 1519, 9, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 4, 160, 1527, 8, 160, 11, 160, 12, 160, 1528, 1, 160, 1, 160, 1, 1517, 0, 161, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 233, 117, 235, 118, 237, 119, 239, 120, 241, 121, 243, 122, 245, 123, 247, 124, 249, 125, 251, 126, 253, 127, 255, 128, 257, 129, 259, 130, 261, 131, 263, 132, 265, 133, 267, 134, 269, 135, 271, 136, 273, 137, 275, 138, 277, 139, 279, 140, 281, 141, 283, 142, 285, 143, 287, 144, 289, 145, 291, 146, 293, 147, 295, 148, 297, 149, 299, 150, 301, 151, 303, 152, 305, 153, 307, 154, 309, 155, 311, 156, 313, 0, 315, 0, 317, 157, 319, 158, 321, 159, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1546, 0, 1, 1, 0, 0, 0, 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, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 0, 233, 1, 0, 0, 0, 0, 235, 1, 0, 0, 0, 0, 237, 1, 0, 0, 0, 0, 239, 1, 0, 0, 0, 0, 241, 1, 0, 0, 0, 0, 243, 1, 0, 0, 0, 0, 245, 1, 0, 0, 0, 0, 247, 1, 0, 0, 0, 0, 249, 1, 0, 0, 0, 0, 251, 1, 0, 0, 0, 0, 253, 1, 0, 0, 0, 0, 255, 1, 0, 0, 0, 0, 257, 1, 0, 0, 0, 0, 259, 1, 0, 0, 0, 0, 261, 1, 0, 0, 0, 0, 263, 1, 0, 0, 0, 0, 265, 1, 0, 0, 0, 0, 267, 1, 0, 0, 0, 0, 269, 1, 0, 0, 0, 0, 271, 1, 0, 0, 0, 0, 273, 1, 0, 0, 0, 0, 275, 1, 0, 0, 0, 0, 277, 1, 0, 0, 0, 0, 279, 1, 0, 0, 0, 0, 281, 1, 0, 0, 0, 0, 283, 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, 317, 1, 0, 0, 0, 0, 319, 1, 0, 0, 0, 0, 321, 1, 0, 0, 0, 1, 323, 1, 0, 0, 0, 3, 328, 1, 0, 0, 0, 5, 335, 1, 0, 0, 0, 7, 344, 1, 0, 0, 0, 9, 357, 1, 0, 0, 0, 11, 365, 1, 0, 0, 0, 13, 369, 1, 0, 0, 0, 15, 378, 1, 0, 0, 0, 17, 386, 1, 0, 0, 0, 19, 395, 1, 0, 0, 0, 21, 406, 1, 0, 0, 0, 23, 416, 1, 0, 0, 0, 25, 426, 1, 0, 0, 0, 27, 435, 1, 0, 0, 0, 29, 447, 1, 0, 0, 0, 31, 454, 1, 0, 0, 0, 33, 462, 1, 0, 0, 0, 35, 471, 1, 0, 0, 0, 37, 479, 1, 0, 0, 0, 39, 485, 1, 0, 0, 0, 41, 490, 1, 0, 0, 0, 43, 503, 1, 0, 0, 0, 45, 513, 1, 0, 0, 0, 47, 525, 1, 0, 0, 0, 49, 531, 1, 0, 0, 0, 51, 542, 1, 0, 0, 0, 53, 553, 1, 0, 0, 0, 55, 558, 1, 0, 0, 0, 57, 567, 1, 0, 0, 0, 59, 577, 1, 0, 0, 0, 61, 582, 1, 0, 0, 0, 63, 586, 1, 0, 0, 0, 65, 592, 1, 0, 0, 0, 67, 597, 1, 0, 0, 0, 69, 607, 1, 0, 0, 0, 71, 611, 1, 0, 0, 0, 73, 624, 1, 0, 0, 0, 75, 629, 1, 0, 0, 0, 77, 636, 1, 0, 0, 0, 79, 645, 1, 0, 0, 0, 81, 656, 1, 0, 0, 0, 83, 660, 1, 0, 0, 0, 85, 669, 1, 0, 0, 0, 87, 676, 1, 0, 0, 0, 89, 685, 1, 0, 0, 0, 91, 692, 1, 0, 0, 0, 93, 697, 1, 0, 0, 0, 95, 707, 1, 0, 0, 0, 97, 718, 1, 0, 0, 0, 99, 726, 1, 0, 0, 0, 101, 732, 1, 0, 0, 0, 103, 738, 1, 0, 0, 0, 105, 747, 1, 0, 0, 0, 107, 757, 1, 0, 0, 0, 109, 766, 1, 0, 0, 0, 111, 778, 1, 0, 0, 0, 113, 789, 1, 0, 0, 0, 115, 795, 1, 0, 0, 0, 117, 803, 1, 0, 0, 0, 119, 806, 1, 0, 0, 0, 121, 811, 1, 0, 0, 0, 123, 818, 1, 0, 0, 0, 125, 821, 1, 0, 0, 0, 127, 829, 1, 0, 0, 0, 129, 836, 1, 0, 0, 0, 131, 842, 1, 0, 0, 0, 133, 847, 1, 0, 0, 0, 135, 858, 1, 0, 0, 0, 137, 863, 1, 0, 0, 0, 139, 869, 1, 0, 0, 0, 141, 876, 1, 0, 0, 0, 143, 880, 1, 0, 0, 0, 145, 892, 1, 0, 0, 0, 147, 895, 1, 0, 0, 0, 149, 902, 1, 0, 0, 0, 151, 905, 1, 0, 0, 0, 153, 912, 1, 0, 0, 0, 155, 920, 1, 0, 0, 0, 157, 927, 1, 0, 0, 0, 159, 938, 1, 0, 0, 0, 161, 945, 1, 0, 0, 0, 163, 954, 1, 0, 0, 0, 165, 969, 1, 0, 0, 0, 167, 979, 1, 0, 0, 0, 169, 989, 1, 0, 0, 0, 171, 997, 1, 0, 0, 0, 173, 1010, 1, 0, 0, 0, 175, 1023, 1, 0, 0, 0, 177, 1029, 1, 0, 0, 0, 179, 1046, 1, 0, 0, 0, 181, 1049, 1, 0, 0, 0, 183, 1053, 1, 0, 0, 0, 185, 1058, 1, 0, 0, 0, 187, 1064, 1, 0, 0, 0, 189, 1073, 1, 0, 0, 0, 191, 1082, 1, 0, 0, 0, 193, 1086, 1, 0, 0, 0, 195, 1090, 1, 0, 0, 0, 197, 1094, 1, 0, 0, 0, 199, 1100, 1, 0, 0, 0, 201, 1106, 1, 0, 0, 0, 203, 1111, 1, 0, 0, 0, 205, 1116, 1, 0, 0, 0, 207, 1122, 1, 0, 0, 0, 209, 1130, 1, 0, 0, 0, 211, 1138, 1, 0, 0, 0, 213, 1149, 1, 0, 0, 0, 215, 1154, 1, 0, 0, 0, 217, 1166, 1, 0, 0, 0, 219, 1177, 1, 0, 0, 0, 221, 1187, 1, 0, 0, 0, 223, 1199, 1, 0, 0, 0, 225, 1208, 1, 0, 0, 0, 227, 1213, 1, 0, 0, 0, 229, 1226, 1, 0, 0, 0, 231, 1238, 1, 0, 0, 0, 233, 1250, 1, 0, 0, 0, 235, 1255, 1, 0, 0, 0, 237, 1263, 1, 0, 0, 0, 239, 1268, 1, 0, 0, 0, 241, 1281, 1, 0, 0, 0, 243, 1289, 1, 0, 0, 0, 245, 1298, 1, 0, 0, 0, 247, 1312, 1, 0, 0, 0, 249, 1321, 1, 0, 0, 0, 251, 1326, 1, 0, 0, 0, 253, 1333, 1, 0, 0, 0, 255, 1338, 1, 0, 0, 0, 257, 1344, 1, 0, 0, 0, 259, 1351, 1, 0, 0, 0, 261, 1357, 1, 0, 0, 0, 263, 1363, 1, 0, 0, 0, 265, 1370, 1, 0, 0, 0, 267, 1377, 1, 0, 0, 0, 269, 1384, 1, 0, 0, 0, 271, 1389, 1, 0, 0, 0, 273, 1395, 1, 0, 0, 0, 275, 1400, 1, 0, 0, 0, 277, 1403, 1, 0, 0, 0, 279, 1405, 1, 0, 0, 0, 281, 1407, 1, 0, 0, 0, 283, 1409, 1, 0, 0, 0, 285, 1411, 1, 0, 0, 0, 287, 1413, 1, 0, 0, 0, 289, 1415, 1, 0, 0, 0, 291, 1417, 1, 0, 0, 0, 293, 1419, 1, 0, 0, 0, 295, 1421, 1, 0, 0, 0, 297, 1423, 1, 0, 0, 0, 299, 1425, 1, 0, 0, 0, 301, 1427, 1, 0, 0, 0, 303, 1429, 1, 0, 0, 0, 305, 1432, 1, 0, 0, 0, 307, 1440, 1, 0, 0, 0, 309, 1471, 1, 0, 0, 0, 311, 1478, 1, 0, 0, 0, 313, 1488, 1, 0, 0, 0, 315, 1498, 1, 0, 0, 0, 317, 1500, 1, 0, 0, 0, 319, 1511, 1, 0, 0, 0, 321, 1526, 1, 0, 0, 0, 323, 324, 5, 101, 0, 0, 324, 325, 5, 100, 0, 0, 325, 326, 5, 105, 0, 0, 326, 327, 5, 116, 0, 0, 327, 2, 1, 0, 0, 0, 328, 329, 5, 109, 0, 0, 329, 330, 5, 111, 0, 0, 330, 331, 5, 100, 0, 0, 331, 332, 5, 117, 0, 0, 332, 333, 5, 108, 0, 0, 333, 334, 5, 101, 0, 0, 334, 4, 1, 0, 0, 0, 335, 336, 5, 99, 0, 0, 336, 337, 5, 111, 0, 0, 337, 338, 5, 110, 0, 0, 338, 339, 5, 116, 0, 0, 339, 340, 5, 114, 0, 0, 340, 341, 5, 97, 0, 0, 341, 342, 5, 99, 0, 0, 342, 343, 5, 116, 0, 0, 343, 6, 1, 0, 0, 0, 344, 345, 5, 112, 0, 0, 345, 346, 5, 114, 0, 0, 346, 347, 5, 101, 0, 0, 347, 348, 5, 115, 0, 0, 348, 349, 5, 101, 0, 0, 349, 350, 5, 110, 0, 0, 350, 351, 5, 116, 0, 0, 351, 352, 5, 97, 0, 0, 352, 353, 5, 116, 0, 0, 353, 354, 5, 105, 0, 0, 354, 355, 5, 111, 0, 0, 355, 356, 5, 110, 0, 0, 356, 8, 1, 0, 0, 0, 357, 358, 5, 115, 0, 0, 358, 359, 5, 117, 0, 0, 359, 360, 5, 98, 0, 0, 360, 361, 5, 106, 0, 0, 361, 362, 5, 101, 0, 0, 362, 363, 5, 99, 0, 0, 363, 364, 5, 116, 0, 0, 364, 10, 1, 0, 0, 0, 365, 366, 5, 102, 0, 0, 366, 367, 5, 111, 0, 0, 367, 368, 5, 114, 0, 0, 368, 12, 1, 0, 0, 0, 369, 370, 5, 99, 0, 0, 370, 371, 5, 114, 0, 0, 371, 372, 5, 101, 0, 0, 372, 373, 5, 97, 0, 0, 373, 374, 5, 116, 0, 0, 374, 375, 5, 105, 0, 0, 375, 376, 5, 111, 0, 0, 376, 377, 5, 110, 0, 0, 377, 14, 1, 0, 0, 0, 378, 379, 5, 118, 0, 0, 379, 380, 5, 97, 0, 0, 380, 381, 5, 114, 0, 0, 381, 382, 5, 105, 0, 0, 382, 383, 5, 97, 0, 0, 383, 384, 5, 110, 0, 0, 384, 385, 5, 116, 0, 0, 385, 16, 1, 0, 0, 0, 386, 387, 5, 112, 0, 0, 387, 388, 5, 114, 0, 0, 388, 389, 5, 101, 0, 0, 389, 390, 5, 112, 0, 0, 390, 391, 5, 97, 0, 0, 391, 392, 5, 114, 0, 0, 392, 393, 5, 101, 0, 0, 393, 394, 5, 115, 0, 0, 394, 18, 1, 0, 0, 0, 395, 396, 5, 105, 0, 0, 396, 397, 5, 110, 0, 0, 397, 398, 5, 105, 0, 0, 398, 399, 5, 116, 0, 0, 399, 400, 5, 105, 0, 0, 400, 401, 5, 97, 0, 0, 401, 402, 5, 108, 0, 0, 402, 403, 5, 105, 0, 0, 403, 404, 5, 122, 0, 0, 404, 405, 5, 101, 0, 0, 405, 20, 1, 0, 0, 0, 406, 407, 5, 119, 0, 0, 407, 408, 5, 111, 0, 0, 408, 409, 5, 114, 0, 0, 409, 410, 5, 107, 0, 0, 410, 411, 5, 115, 0, 0, 411, 412, 5, 112, 0, 0, 412, 413, 5, 97, 0, 0, 413, 414, 5, 99, 0, 0, 414, 415, 5, 101, 0, 0, 415, 22, 1, 0, 0, 0, 416, 417, 5, 101, 0, 0, 417, 418, 5, 120, 0, 0, 418, 419, 5, 101, 0, 0, 419, 420, 5, 99, 0, 0, 420, 421, 5, 117, 0, 0, 421, 422, 5, 116, 0, 0, 422, 423, 5, 105, 0, 0, 423, 424, 5, 111, 0, 0, 424, 425, 5, 110, 0, 0, 425, 24, 1, 0, 0, 0, 426, 427, 5, 115, 0, 0, 427, 428, 5, 110, 0, 0, 428, 429, 5, 97, 0, 0, 429, 430, 5, 112, 0, 0, 430, 431, 5, 115, 0, 0, 431, 432, 5, 104, 0, 0, 432, 433, 5, 111, 0, 0, 433, 434, 5, 116, 0, 0, 434, 26, 1, 0, 0, 0, 435, 436, 5, 116, 0, 0, 436, 437, 5, 114, 0, 0, 437, 438, 5, 97, 0, 0, 438, 439, 5, 110, 0, 0, 439, 440, 5, 115, 0, 0, 440, 441, 5, 97, 0, 0, 441, 442, 5, 99, 0, 0, 442, 443, 5, 116, 0, 0, 443, 444, 5, 105, 0, 0, 444, 445, 5, 111, 0, 0, 445, 446, 5, 110, 0, 0, 446, 28, 1, 0, 0, 0, 447, 448, 5, 114, 0, 0, 448, 449, 5, 101, 0, 0, 449, 450, 5, 109, 0, 0, 450, 451, 5, 111, 0, 0, 451, 452, 5, 116, 0, 0, 452, 453, 5, 101, 0, 0, 453, 30, 1, 0, 0, 0, 454, 455, 5, 116, 0, 0, 455, 456, 5, 97, 0, 0, 456, 457, 5, 114, 0, 0, 457, 458, 5, 103, 0, 0, 458, 459, 5, 101, 0, 0, 459, 460, 5, 116, 0, 0, 460, 461, 5, 115, 0, 0, 461, 32, 1, 0, 0, 0, 462, 463, 5, 112, 0, 0, 463, 464, 5, 111, 0, 0, 464, 465, 5, 114, 0, 0, 465, 466, 5, 116, 0, 0, 466, 467, 5, 97, 0, 0, 467, 468, 5, 98, 0, 0, 468, 469, 5, 108, 0, 0, 469, 470, 5, 101, 0, 0, 470, 34, 1, 0, 0, 0, 471, 472, 5, 114, 0, 0, 472, 473, 5, 101, 0, 0, 473, 474, 5, 112, 0, 0, 474, 475, 5, 108, 0, 0, 475, 476, 5, 105, 0, 0, 476, 477, 5, 99, 0, 0, 477, 478, 5, 97, 0, 0, 478, 36, 1, 0, 0, 0, 479, 480, 5, 108, 0, 0, 480, 481, 5, 111, 0, 0, 481, 482, 5, 99, 0, 0, 482, 483, 5, 97, 0, 0, 483, 484, 5, 108, 0, 0, 484, 38, 1, 0, 0, 0, 485, 486, 5, 102, 0, 0, 486, 487, 5, 114, 0, 0, 487, 488, 5, 111, 0, 0, 488, 489, 5, 109, 0, 0, 489, 40, 1, 0, 0, 0, 490, 491, 5, 114, 0, 0, 491, 492, 5, 101, 0, 0, 492, 493, 5, 115, 0, 0, 493, 494, 5, 117, 0, 0, 494, 495, 5, 108, 0, 0, 495, 496, 5, 116, 0, 0, 496, 497, 5, 45, 0, 0, 497, 498, 5, 98, 0, 0, 498, 499, 5, 121, 0, 0, 499, 500, 5, 116, 0, 0, 500, 501, 5, 101, 0, 0, 501, 502, 5, 115, 0, 0, 502, 42, 1, 0, 0, 0, 503, 504, 5, 114, 0, 0, 504, 505, 5, 112, 0, 0, 505, 506, 5, 99, 0, 0, 506, 507, 5, 45, 0, 0, 507, 508, 5, 99, 0, 0, 508, 509, 5, 97, 0, 0, 509, 510, 5, 108, 0, 0, 510, 511, 5, 108, 0, 0, 511, 512, 5, 115, 0, 0, 512, 44, 1, 0, 0, 0, 513, 514, 5, 100, 0, 0, 514, 515, 5, 101, 0, 0, 515, 516, 5, 97, 0, 0, 516, 517, 5, 100, 0, 0, 517, 518, 5, 108, 0, 0, 518, 519, 5, 105, 0, 0, 519, 520, 5, 110, 0, 0, 520, 521, 5, 101, 0, 0, 521, 522, 5, 45, 0, 0, 522, 523, 5, 109, 0, 0, 523, 524, 5, 115, 0, 0, 524, 46, 1, 0, 0, 0, 525, 526, 5, 113, 0, 0, 526, 527, 5, 117, 0, 0, 527, 528, 5, 101, 0, 0, 528, 529, 5, 114, 0, 0, 529, 530, 5, 121, 0, 0, 530, 48, 1, 0, 0, 0, 531, 532, 5, 114, 0, 0, 532, 533, 5, 101, 0, 0, 533, 534, 5, 102, 0, 0, 534, 535, 5, 108, 0, 0, 535, 536, 5, 101, 0, 0, 536, 537, 5, 99, 0, 0, 537, 538, 5, 116, 0, 0, 538, 539, 5, 105, 0, 0, 539, 540, 5, 111, 0, 0, 540, 541, 5, 110, 0, 0, 541, 50, 1, 0, 0, 0, 542, 543, 5, 115, 0, 0, 543, 544, 5, 112, 0, 0, 544, 545, 5, 101, 0, 0, 545, 546, 5, 99, 0, 0, 546, 547, 5, 105, 0, 0, 547, 548, 5, 97, 0, 0, 548, 549, 5, 108, 0, 0, 549, 550, 5, 105, 0, 0, 550, 551, 5, 122, 0, 0, 551, 552, 5, 101, 0, 0, 552, 52, 1, 0, 0, 0, 553, 554, 5, 114, 0, 0, 554, 555, 5, 111, 0, 0, 555, 556, 5, 111, 0, 0, 556, 557, 5, 116, 0, 0, 557, 54, 1, 0, 0, 0, 558, 559, 5, 100, 0, 0, 559, 560, 5, 111, 0, 0, 560, 561, 5, 99, 0, 0, 561, 562, 5, 117, 0, 0, 562, 563, 5, 109, 0, 0, 563, 564, 5, 101, 0, 0, 564, 565, 5, 110, 0, 0, 565, 566, 5, 116, 0, 0, 566, 56, 1, 0, 0, 0, 567, 568, 5, 102, 0, 0, 568, 569, 5, 114, 0, 0, 569, 570, 5, 97, 0, 0, 570, 571, 5, 103, 0, 0, 571, 572, 5, 109, 0, 0, 572, 573, 5, 101, 0, 0, 573, 574, 5, 110, 0, 0, 574, 575, 5, 116, 0, 0, 575, 576, 5, 115, 0, 0, 576, 58, 1, 0, 0, 0, 577, 578, 5, 118, 0, 0, 578, 579, 5, 105, 0, 0, 579, 580, 5, 101, 0, 0, 580, 581, 5, 119, 0, 0, 581, 60, 1, 0, 0, 0, 582, 583, 5, 109, 0, 0, 583, 584, 5, 97, 0, 0, 584, 585, 5, 120, 0, 0, 585, 62, 1, 0, 0, 0, 586, 587, 5, 97, 0, 0, 587, 588, 5, 108, 0, 0, 588, 589, 5, 108, 0, 0, 589, 590, 5, 111, 0, 0, 590, 591, 5, 119, 0, 0, 591, 64, 1, 0, 0, 0, 592, 593, 5, 112, 0, 0, 593, 594, 5, 111, 0, 0, 594, 595, 5, 108, 0, 0, 595, 596, 5, 108, 0, 0, 596, 66, 1, 0, 0, 0, 597, 598, 5, 113, 0, 0, 598, 599, 5, 117, 0, 0, 599, 600, 5, 101, 0, 0, 600, 601, 5, 114, 0, 0, 601, 602, 5, 121, 0, 0, 602, 603, 5, 97, 0, 0, 603, 604, 5, 98, 0, 0, 604, 605, 5, 108, 0, 0, 605, 606, 5, 101, 0, 0, 606, 68, 1, 0, 0, 0, 607, 608, 5, 114, 0, 0, 608, 609, 5, 112, 0, 0, 609, 610, 5, 99, 0, 0, 610, 70, 1, 0, 0, 0, 611, 612, 5, 113, 0, 0, 612, 613, 5, 117, 0, 0, 613, 614, 5, 101, 0, 0, 614, 615, 5, 114, 0, 0, 615, 616, 5, 121, 0, 0, 616, 617, 5, 45, 0, 0, 617, 618, 5, 114, 0, 0, 618, 619, 5, 101, 0, 0, 619, 620, 5, 97, 0, 0, 620, 621, 5, 115, 0, 0, 621, 622, 5, 111, 0, 0, 622, 623, 5, 110, 0, 0, 623, 72, 1, 0, 0, 0, 624, 625, 5, 116, 0, 0, 625, 626, 5, 121, 0, 0, 626, 627, 5, 112, 0, 0, 627, 628, 5, 101, 0, 0, 628, 74, 1, 0, 0, 0, 629, 630, 5, 111, 0, 0, 630, 631, 5, 98, 0, 0, 631, 632, 5, 106, 0, 0, 632, 633, 5, 101, 0, 0, 633, 634, 5, 99, 0, 0, 634, 635, 5, 116, 0, 0, 635, 76, 1, 0, 0, 0, 636, 637, 5, 115, 0, 0, 637, 638, 5, 116, 0, 0, 638, 639, 5, 111, 0, 0, 639, 640, 5, 114, 0, 0, 640, 641, 5, 97, 0, 0, 641, 642, 5, 98, 0, 0, 642, 643, 5, 108, 0, 0, 643, 644, 5, 101, 0, 0, 644, 78, 1, 0, 0, 0, 645, 646, 5, 105, 0, 0, 646, 647, 5, 109, 0, 0, 647, 648, 5, 112, 0, 0, 648, 649, 5, 108, 0, 0, 649, 650, 5, 101, 0, 0, 650, 651, 5, 109, 0, 0, 651, 652, 5, 101, 0, 0, 652, 653, 5, 110, 0, 0, 653, 654, 5, 116, 0, 0, 654, 655, 5, 115, 0, 0, 655, 80, 1, 0, 0, 0, 656, 657, 5, 114, 0, 0, 657, 658, 5, 101, 0, 0, 658, 659, 5, 102, 0, 0, 659, 82, 1, 0, 0, 0, 660, 661, 5, 102, 0, 0, 661, 662, 5, 114, 0, 0, 662, 663, 5, 97, 0, 0, 663, 664, 5, 103, 0, 0, 664, 665, 5, 109, 0, 0, 665, 666, 5, 101, 0, 0, 666, 667, 5, 110, 0, 0, 667, 668, 5, 116, 0, 0, 668, 84, 1, 0, 0, 0, 669, 670, 5, 105, 0, 0, 670, 671, 5, 109, 0, 0, 671, 672, 5, 112, 0, 0, 672, 673, 5, 111, 0, 0, 673, 674, 5, 114, 0, 0, 674, 675, 5, 116, 0, 0, 675, 86, 1, 0, 0, 0, 676, 677, 5, 101, 0, 0, 677, 678, 5, 120, 0, 0, 678, 679, 5, 116, 0, 0, 679, 680, 5, 101, 0, 0, 680, 681, 5, 114, 0, 0, 681, 682, 5, 110, 0, 0, 682, 683, 5, 97, 0, 0, 683, 684, 5, 108, 0, 0, 684, 88, 1, 0, 0, 0, 685, 686, 5, 115, 0, 0, 686, 687, 5, 121, 0, 0, 687, 688, 5, 109, 0, 0, 688, 689, 5, 98, 0, 0, 689, 690, 5, 111, 0, 0, 690, 691, 5, 108, 0, 0, 691, 90, 1, 0, 0, 0, 692, 693, 5, 97, 0, 0, 693, 694, 5, 116, 0, 0, 694, 695, 5, 111, 0, 0, 695, 696, 5, 109, 0, 0, 696, 92, 1, 0, 0, 0, 697, 698, 5, 105, 0, 0, 698, 699, 5, 110, 0, 0, 699, 700, 5, 116, 0, 0, 700, 701, 5, 101, 0, 0, 701, 702, 5, 114, 0, 0, 702, 703, 5, 102, 0, 0, 703, 704, 5, 97, 0, 0, 704, 705, 5, 99, 0, 0, 705, 706, 5, 101, 0, 0, 706, 94, 1, 0, 0, 0, 707, 708, 5, 105, 0, 0, 708, 709, 5, 110, 0, 0, 709, 710, 5, 116, 0, 0, 710, 711, 5, 101, 0, 0, 711, 712, 5, 114, 0, 0, 712, 713, 5, 102, 0, 0, 713, 714, 5, 97, 0, 0, 714, 715, 5, 99, 0, 0, 715, 716, 5, 101, 0, 0, 716, 717, 5, 115, 0, 0, 717, 96, 1, 0, 0, 0, 718, 719, 5, 112, 0, 0, 719, 720, 5, 97, 0, 0, 720, 721, 5, 99, 0, 0, 721, 722, 5, 107, 0, 0, 722, 723, 5, 97, 0, 0, 723, 724, 5, 103, 0, 0, 724, 725, 5, 101, 0, 0, 725, 98, 1, 0, 0, 0, 726, 727, 5, 118, 0, 0, 727, 728, 5, 97, 0, 0, 728, 729, 5, 108, 0, 0, 729, 730, 5, 117, 0, 0, 730, 731, 5, 101, 0, 0, 731, 100, 1, 0, 0, 0, 732, 733, 5, 102, 0, 0, 733, 734, 5, 105, 0, 0, 734, 735, 5, 101, 0, 0, 735, 736, 5, 108, 0, 0, 736, 737, 5, 100, 0, 0, 737, 102, 1, 0, 0, 0, 738, 739, 5, 114, 0, 0, 739, 740, 5, 101, 0, 0, 740, 741, 5, 108, 0, 0, 741, 742, 5, 97, 0, 0, 742, 743, 5, 116, 0, 0, 743, 744, 5, 105, 0, 0, 744, 745, 5, 111, 0, 0, 745, 746, 5, 110, 0, 0, 746, 104, 1, 0, 0, 0, 747, 748, 5, 111, 0, 0, 748, 749, 5, 112, 0, 0, 749, 750, 5, 101, 0, 0, 750, 751, 5, 114, 0, 0, 751, 752, 5, 97, 0, 0, 752, 753, 5, 116, 0, 0, 753, 754, 5, 105, 0, 0, 754, 755, 5, 111, 0, 0, 755, 756, 5, 110, 0, 0, 756, 106, 1, 0, 0, 0, 757, 758, 5, 102, 0, 0, 758, 759, 5, 117, 0, 0, 759, 760, 5, 110, 0, 0, 760, 761, 5, 99, 0, 0, 761, 762, 5, 116, 0, 0, 762, 763, 5, 105, 0, 0, 763, 764, 5, 111, 0, 0, 764, 765, 5, 110, 0, 0, 765, 108, 1, 0, 0, 0, 766, 767, 5, 99, 0, 0, 767, 768, 5, 111, 0, 0, 768, 769, 5, 110, 0, 0, 769, 770, 5, 115, 0, 0, 770, 771, 5, 116, 0, 0, 771, 772, 5, 114, 0, 0, 772, 773, 5, 117, 0, 0, 773, 774, 5, 99, 0, 0, 774, 775, 5, 116, 0, 0, 775, 776, 5, 111, 0, 0, 776, 777, 5, 114, 0, 0, 777, 110, 1, 0, 0, 0, 778, 779, 5, 99, 0, 0, 779, 780, 5, 111, 0, 0, 780, 781, 5, 110, 0, 0, 781, 782, 5, 115, 0, 0, 782, 783, 5, 116, 0, 0, 783, 784, 5, 114, 0, 0, 784, 785, 5, 117, 0, 0, 785, 786, 5, 99, 0, 0, 786, 787, 5, 116, 0, 0, 787, 788, 5, 115, 0, 0, 788, 112, 1, 0, 0, 0, 789, 790, 5, 105, 0, 0, 790, 791, 5, 110, 0, 0, 791, 792, 5, 112, 0, 0, 792, 793, 5, 117, 0, 0, 793, 794, 5, 116, 0, 0, 794, 114, 1, 0, 0, 0, 795, 796, 5, 99, 0, 0, 796, 797, 5, 111, 0, 0, 797, 798, 5, 110, 0, 0, 798, 799, 5, 102, 0, 0, 799, 800, 5, 111, 0, 0, 800, 801, 5, 114, 0, 0, 801, 802, 5, 109, 0, 0, 802, 116, 1, 0, 0, 0, 803, 804, 5, 97, 0, 0, 804, 805, 5, 115, 0, 0, 805, 118, 1, 0, 0, 0, 806, 807, 5, 98, 0, 0, 807, 808, 5, 105, 0, 0, 808, 809, 5, 110, 0, 0, 809, 810, 5, 100, 0, 0, 810, 120, 1, 0, 0, 0, 811, 812, 5, 115, 0, 0, 812, 813, 5, 116, 0, 0, 813, 814, 5, 97, 0, 0, 814, 815, 5, 116, 0, 0, 815, 816, 5, 105, 0, 0, 816, 817, 5, 99, 0, 0, 817, 122, 1, 0, 0, 0, 818, 819, 5, 116, 0, 0, 819, 820, 5, 111, 0, 0, 820, 124, 1, 0, 0, 0, 821, 822, 5, 112, 0, 0, 822, 823, 5, 114, 0, 0, 823, 824, 5, 105, 0, 0, 824, 825, 5, 118, 0, 0, 825, 826, 5, 97, 0, 0, 826, 827, 5, 116, 0, 0, 827, 828, 5, 101, 0, 0, 828, 126, 1, 0, 0, 0, 829, 830, 5, 115, 0, 0, 830, 831, 5, 104, 0, 0, 831, 832, 5, 97, 0, 0, 832, 833, 5, 114, 0, 0, 833, 834, 5, 101, 0, 0, 834, 835, 5, 100, 0, 0, 835, 128, 1, 0, 0, 0, 836, 837, 5, 115, 0, 0, 837, 838, 5, 116, 0, 0, 838, 839, 5, 97, 0, 0, 839, 840, 5, 116, 0, 0, 840, 841, 5, 101, 0, 0, 841, 130, 1, 0, 0, 0, 842, 843, 5, 101, 0, 0, 843, 844, 5, 100, 0, 0, 844, 845, 5, 103, 0, 0, 845, 846, 5, 101, 0, 0, 846, 132, 1, 0, 0, 0, 847, 848, 5, 112, 0, 0, 848, 849, 5, 114, 0, 0, 849, 850, 5, 111, 0, 0, 850, 851, 5, 106, 0, 0, 851, 852, 5, 101, 0, 0, 852, 853, 5, 99, 0, 0, 853, 854, 5, 116, 0, 0, 854, 855, 5, 105, 0, 0, 855, 856, 5, 111, 0, 0, 856, 857, 5, 110, 0, 0, 857, 134, 1, 0, 0, 0, 858, 859, 5, 119, 0, 0, 859, 860, 5, 105, 0, 0, 860, 861, 5, 116, 0, 0, 861, 862, 5, 104, 0, 0, 862, 136, 1, 0, 0, 0, 863, 864, 5, 117, 0, 0, 864, 865, 5, 115, 0, 0, 865, 866, 5, 105, 0, 0, 866, 867, 5, 110, 0, 0, 867, 868, 5, 103, 0, 0, 868, 138, 1, 0, 0, 0, 869, 870, 5, 97, 0, 0, 870, 871, 5, 99, 0, 0, 871, 872, 5, 99, 0, 0, 872, 873, 5, 101, 0, 0, 873, 874, 5, 112, 0, 0, 874, 875, 5, 116, 0, 0, 875, 140, 1, 0, 0, 0, 876, 877, 5, 118, 0, 0, 877, 878, 5, 105, 0, 0, 878, 879, 5, 97, 0, 0, 879, 142, 1, 0, 0, 0, 880, 881, 5, 109, 0, 0, 881, 882, 5, 97, 0, 0, 882, 883, 5, 116, 0, 0, 883, 884, 5, 101, 0, 0, 884, 885, 5, 114, 0, 0, 885, 886, 5, 105, 0, 0, 886, 887, 5, 97, 0, 0, 887, 888, 5, 108, 0, 0, 888, 889, 5, 105, 0, 0, 889, 890, 5, 122, 0, 0, 890, 891, 5, 101, 0, 0, 891, 144, 1, 0, 0, 0, 892, 893, 5, 105, 0, 0, 893, 894, 5, 102, 0, 0, 894, 146, 1, 0, 0, 0, 895, 896, 5, 97, 0, 0, 896, 897, 5, 98, 0, 0, 897, 898, 5, 115, 0, 0, 898, 899, 5, 101, 0, 0, 899, 900, 5, 110, 0, 0, 900, 901, 5, 116, 0, 0, 901, 148, 1, 0, 0, 0, 902, 903, 5, 111, 0, 0, 903, 904, 5, 110, 0, 0, 904, 150, 1, 0, 0, 0, 905, 906, 5, 112, 0, 0, 906, 907, 5, 111, 0, 0, 907, 908, 5, 108, 0, 0, 908, 909, 5, 105, 0, 0, 909, 910, 5, 99, 0, 0, 910, 911, 5, 121, 0, 0, 911, 152, 1, 0, 0, 0, 912, 913, 5, 100, 0, 0, 913, 914, 5, 101, 0, 0, 914, 915, 5, 102, 0, 0, 915, 916, 5, 97, 0, 0, 916, 917, 5, 117, 0, 0, 917, 918, 5, 108, 0, 0, 918, 919, 5, 116, 0, 0, 919, 154, 1, 0, 0, 0, 920, 921, 5, 115, 0, 0, 921, 922, 5, 111, 0, 0, 922, 923, 5, 117, 0, 0, 923, 924, 5, 114, 0, 0, 924, 925, 5, 99, 0, 0, 925, 926, 5, 101, 0, 0, 926, 156, 1, 0, 0, 0, 927, 928, 5, 114, 0, 0, 928, 929, 5, 101, 0, 0, 929, 930, 5, 112, 0, 0, 930, 931, 5, 111, 0, 0, 931, 932, 5, 115, 0, 0, 932, 933, 5, 105, 0, 0, 933, 934, 5, 116, 0, 0, 934, 935, 5, 111, 0, 0, 935, 936, 5, 114, 0, 0, 936, 937, 5, 121, 0, 0, 937, 158, 1, 0, 0, 0, 938, 939, 5, 99, 0, 0, 939, 940, 5, 111, 0, 0, 940, 941, 5, 109, 0, 0, 941, 942, 5, 109, 0, 0, 942, 943, 5, 105, 0, 0, 943, 944, 5, 116, 0, 0, 944, 160, 1, 0, 0, 0, 945, 946, 5, 114, 0, 0, 946, 947, 5, 101, 0, 0, 947, 948, 5, 118, 0, 0, 948, 949, 5, 105, 0, 0, 949, 950, 5, 115, 0, 0, 950, 951, 5, 105, 0, 0, 951, 952, 5, 111, 0, 0, 952, 953, 5, 110, 0, 0, 953, 162, 1, 0, 0, 0, 954, 955, 5, 115, 0, 0, 955, 956, 5, 101, 0, 0, 956, 957, 5, 109, 0, 0, 957, 958, 5, 97, 0, 0, 958, 959, 5, 110, 0, 0, 959, 960, 5, 116, 0, 0, 960, 961, 5, 105, 0, 0, 961, 962, 5, 99, 0, 0, 962, 963, 5, 45, 0, 0, 963, 964, 5, 109, 0, 0, 964, 965, 5, 97, 0, 0, 965, 966, 5, 106, 0, 0, 966, 967, 5, 111, 0, 0, 967, 968, 5, 114, 0, 0, 968, 164, 1, 0, 0, 0, 969, 970, 5, 111, 0, 0, 970, 971, 5, 110, 0, 0, 971, 972, 5, 45, 0, 0, 972, 973, 5, 100, 0, 0, 973, 974, 5, 101, 0, 0, 974, 975, 5, 108, 0, 0, 975, 976, 5, 101, 0, 0, 976, 977, 5, 116, 0, 0, 977, 978, 5, 101, 0, 0, 978, 166, 1, 0, 0, 0, 979, 980, 5, 108, 0, 0, 980, 981, 5, 105, 0, 0, 981, 982, 5, 102, 0, 0, 982, 983, 5, 101, 0, 0, 983, 984, 5, 99, 0, 0, 984, 985, 5, 121, 0, 0, 985, 986, 5, 99, 0, 0, 986, 987, 5, 108, 0, 0, 987, 988, 5, 101, 0, 0, 988, 168, 1, 0, 0, 0, 989, 990, 5, 106, 0, 0, 990, 991, 5, 111, 0, 0, 991, 992, 5, 117, 0, 0, 992, 993, 5, 114, 0, 0, 993, 994, 5, 110, 0, 0, 994, 995, 5, 97, 0, 0, 995, 996, 5, 108, 0, 0, 996, 170, 1, 0, 0, 0, 997, 998, 5, 115, 0, 0, 998, 999, 5, 117, 0, 0, 999, 1000, 5, 98, 0, 0, 1000, 1001, 5, 115, 0, 0, 1001, 1002, 5, 99, 0, 0, 1002, 1003, 5, 114, 0, 0, 1003, 1004, 5, 105, 0, 0, 1004, 1005, 5, 112, 0, 0, 1005, 1006, 5, 116, 0, 0, 1006, 1007, 5, 105, 0, 0, 1007, 1008, 5, 111, 0, 0, 1008, 1009, 5, 110, 0, 0, 1009, 172, 1, 0, 0, 0, 1010, 1011, 5, 114, 0, 0, 1011, 1012, 5, 101, 0, 0, 1012, 1013, 5, 116, 0, 0, 1013, 1014, 5, 97, 0, 0, 1014, 1015, 5, 105, 0, 0, 1015, 1016, 5, 110, 0, 0, 1016, 1017, 5, 45, 0, 0, 1017, 1018, 5, 111, 0, 0, 1018, 1019, 5, 116, 0, 0, 1019, 1020, 5, 104, 0, 0, 1020, 1021, 5, 101, 0, 0, 1021, 1022, 5, 114, 0, 0, 1022, 174, 1, 0, 0, 0, 1023, 1024, 5, 107, 0, 0, 1024, 1025, 5, 101, 0, 0, 1025, 1026, 5, 121, 0, 0, 1026, 1027, 5, 101, 0, 0, 1027, 1028, 5, 100, 0, 0, 1028, 176, 1, 0, 0, 0, 1029, 1030, 5, 112, 0, 0, 1030, 1031, 5, 117, 0, 0, 1031, 1032, 5, 98, 0, 0, 1032, 1033, 5, 108, 0, 0, 1033, 1034, 5, 105, 0, 0, 1034, 1035, 5, 99, 0, 0, 1035, 1036, 5, 45, 0, 0, 1036, 1037, 5, 116, 0, 0, 1037, 1038, 5, 114, 0, 0, 1038, 1039, 5, 97, 0, 0, 1039, 1040, 5, 118, 0, 0, 1040, 1041, 5, 101, 0, 0, 1041, 1042, 5, 114, 0, 0, 1042, 1043, 5, 115, 0, 0, 1043, 1044, 5, 97, 0, 0, 1044, 1045, 5, 108, 0, 0, 1045, 178, 1, 0, 0, 0, 1046, 1047, 5, 105, 0, 0, 1047, 1048, 5, 100, 0, 0, 1048, 180, 1, 0, 0, 0, 1049, 1050, 5, 100, 0, 0, 1050, 1051, 5, 111, 0, 0, 1051, 1052, 5, 99, 0, 0, 1052, 182, 1, 0, 0, 0, 1053, 1054, 5, 109, 0, 0, 1054, 1055, 5, 111, 0, 0, 1055, 1056, 5, 100, 0, 0, 1056, 1057, 5, 101, 0, 0, 1057, 184, 1, 0, 0, 0, 1058, 1059, 5, 101, 0, 0, 1059, 1060, 5, 109, 0, 0, 1060, 1061, 5, 105, 0, 0, 1061, 1062, 5, 116, 0, 0, 1062, 1063, 5, 115, 0, 0, 1063, 186, 1, 0, 0, 0, 1064, 1065, 5, 114, 0, 0, 1065, 1066, 5, 101, 0, 0, 1066, 1067, 5, 99, 0, 0, 1067, 1068, 5, 101, 0, 0, 1068, 1069, 5, 105, 0, 0, 1069, 1070, 5, 118, 0, 0, 1070, 1071, 5, 101, 0, 0, 1071, 1072, 5, 114, 0, 0, 1072, 188, 1, 0, 0, 0, 1073, 1074, 5, 114, 0, 0, 1074, 1075, 5, 101, 0, 0, 1075, 1076, 5, 113, 0, 0, 1076, 1077, 5, 117, 0, 0, 1077, 1078, 5, 105, 0, 0, 1078, 1079, 5, 114, 0, 0, 1079, 1080, 5, 101, 0, 0, 1080, 1081, 5, 115, 0, 0, 1081, 190, 1, 0, 0, 0, 1082, 1083, 5, 97, 0, 0, 1083, 1084, 5, 110, 0, 0, 1084, 1085, 5, 121, 0, 0, 1085, 192, 1, 0, 0, 0, 1086, 1087, 5, 103, 0, 0, 1087, 1088, 5, 101, 0, 0, 1088, 1089, 5, 116, 0, 0, 1089, 194, 1, 0, 0, 0, 1090, 1091, 5, 115, 0, 0, 1091, 1092, 5, 101, 0, 0, 1092, 1093, 5, 116, 0, 0, 1093, 196, 1, 0, 0, 0, 1094, 1095, 5, 119, 0, 0, 1095, 1096, 5, 97, 0, 0, 1096, 1097, 5, 116, 0, 0, 1097, 1098, 5, 99, 0, 0, 1098, 1099, 5, 104, 0, 0, 1099, 198, 1, 0, 0, 0, 1100, 1101, 5, 115, 0, 0, 1101, 1102, 5, 116, 0, 0, 1102, 1103, 5, 97, 0, 0, 1103, 1104, 5, 114, 0, 0, 1104, 1105, 5, 116, 0, 0, 1105, 200, 1, 0, 0, 0, 1106, 1107, 5, 115, 0, 0, 1107, 1108, 5, 116, 0, 0, 1108, 1109, 5, 111, 0, 0, 1109, 1110, 5, 112, 0, 0, 1110, 202, 1, 0, 0, 0, 1111, 1112, 5, 114, 0, 0, 1112, 1113, 5, 101, 0, 0, 1113, 1114, 5, 97, 0, 0, 1114, 1115, 5, 100, 0, 0, 1115, 204, 1, 0, 0, 0, 1116, 1117, 5, 119, 0, 0, 1117, 1118, 5, 114, 0, 0, 1118, 1119, 5, 105, 0, 0, 1119, 1120, 5, 116, 0, 0, 1120, 1121, 5, 101, 0, 0, 1121, 206, 1, 0, 0, 0, 1122, 1123, 5, 114, 0, 0, 1123, 1124, 5, 101, 0, 0, 1124, 1125, 5, 115, 0, 0, 1125, 1126, 5, 111, 0, 0, 1126, 1127, 5, 108, 0, 0, 1127, 1128, 5, 118, 0, 0, 1128, 1129, 5, 101, 0, 0, 1129, 208, 1, 0, 0, 0, 1130, 1131, 5, 99, 0, 0, 1131, 1132, 5, 111, 0, 0, 1132, 1133, 5, 110, 0, 0, 1133, 1134, 5, 110, 0, 0, 1134, 1135, 5, 101, 0, 0, 1135, 1136, 5, 99, 0, 0, 1136, 1137, 5, 116, 0, 0, 1137, 210, 1, 0, 0, 0, 1138, 1139, 5, 100, 0, 0, 1139, 1140, 5, 105, 0, 0, 1140, 1141, 5, 115, 0, 0, 1141, 1142, 5, 99, 0, 0, 1142, 1143, 5, 111, 0, 0, 1143, 1144, 5, 110, 0, 0, 1144, 1145, 5, 110, 0, 0, 1145, 1146, 5, 101, 0, 0, 1146, 1147, 5, 99, 0, 0, 1147, 1148, 5, 116, 0, 0, 1148, 212, 1, 0, 0, 0, 1149, 1150, 5, 99, 0, 0, 1150, 1151, 5, 97, 0, 0, 1151, 1152, 5, 108, 0, 0, 1152, 1153, 5, 108, 0, 0, 1153, 214, 1, 0, 0, 0, 1154, 1155, 5, 119, 0, 0, 1155, 1156, 5, 97, 0, 0, 1156, 1157, 5, 116, 0, 0, 1157, 1158, 5, 99, 0, 0, 1158, 1159, 5, 104, 0, 0, 1159, 1160, 5, 45, 0, 0, 1160, 1161, 5, 115, 0, 0, 1161, 1162, 5, 116, 0, 0, 1162, 1163, 5, 97, 0, 0, 1163, 1164, 5, 114, 0, 0, 1164, 1165, 5, 116, 0, 0, 1165, 216, 1, 0, 0, 0, 1166, 1167, 5, 119, 0, 0, 1167, 1168, 5, 97, 0, 0, 1168, 1169, 5, 116, 0, 0, 1169, 1170, 5, 99, 0, 0, 1170, 1171, 5, 104, 0, 0, 1171, 1172, 5, 45, 0, 0, 1172, 1173, 5, 115, 0, 0, 1173, 1174, 5, 116, 0, 0, 1174, 1175, 5, 111, 0, 0, 1175, 1176, 5, 112, 0, 0, 1176, 218, 1, 0, 0, 0, 1177, 1178, 5, 115, 0, 0, 1178, 1179, 5, 117, 0, 0, 1179, 1180, 5, 98, 0, 0, 1180, 1181, 5, 115, 0, 0, 1181, 1182, 5, 99, 0, 0, 1182, 1183, 5, 114, 0, 0, 1183, 1184, 5, 105, 0, 0, 1184, 1185, 5, 98, 0, 0, 1185, 1186, 5, 101, 0, 0, 1186, 220, 1, 0, 0, 0, 1187, 1188, 5, 117, 0, 0, 1188, 1189, 5, 110, 0, 0, 1189, 1190, 5, 115, 0, 0, 1190, 1191, 5, 117, 0, 0, 1191, 1192, 5, 98, 0, 0, 1192, 1193, 5, 115, 0, 0, 1193, 1194, 5, 99, 0, 0, 1194, 1195, 5, 114, 0, 0, 1195, 1196, 5, 105, 0, 0, 1196, 1197, 5, 98, 0, 0, 1197, 1198, 5, 101, 0, 0, 1198, 222, 1, 0, 0, 0, 1199, 1200, 5, 114, 0, 0, 1200, 1201, 5, 101, 0, 0, 1201, 1202, 5, 103, 0, 0, 1202, 1203, 5, 105, 0, 0, 1203, 1204, 5, 115, 0, 0, 1204, 1205, 5, 116, 0, 0, 1205, 1206, 5, 101, 0, 0, 1206, 1207, 5, 114, 0, 0, 1207, 224, 1, 0, 0, 0, 1208, 1209, 5, 99, 0, 0, 1209, 1210, 5, 114, 0, 0, 1210, 1211, 5, 100, 0, 0, 1211, 1212, 5, 116, 0, 0, 1212, 226, 1, 0, 0, 0, 1213, 1214, 5, 111, 0, 0, 1214, 1215, 5, 112, 0, 0, 1215, 1216, 5, 116, 0, 0, 1216, 1217, 5, 105, 0, 0, 1217, 1218, 5, 111, 0, 0, 1218, 1219, 5, 110, 0, 0, 1219, 1220, 5, 97, 0, 0, 1220, 1221, 5, 108, 0, 0, 1221, 1222, 5, 45, 0, 0, 1222, 1223, 5, 111, 0, 0, 1223, 1224, 5, 110, 0, 0, 1224, 1225, 5, 101, 0, 0, 1225, 228, 1, 0, 0, 0, 1226, 1227, 5, 101, 0, 0, 1227, 1228, 5, 120, 0, 0, 1228, 1229, 5, 97, 0, 0, 1229, 1230, 5, 99, 0, 0, 1230, 1231, 5, 116, 0, 0, 1231, 1232, 5, 108, 0, 0, 1232, 1233, 5, 121, 0, 0, 1233, 1234, 5, 45, 0, 0, 1234, 1235, 5, 111, 0, 0, 1235, 1236, 5, 110, 0, 0, 1236, 1237, 5, 101, 0, 0, 1237, 230, 1, 0, 0, 0, 1238, 1239, 5, 109, 0, 0, 1239, 1240, 5, 97, 0, 0, 1240, 1241, 5, 110, 0, 0, 1241, 1242, 5, 121, 0, 0, 1242, 1243, 5, 45, 0, 0, 1243, 1244, 5, 117, 0, 0, 1244, 1245, 5, 110, 0, 0, 1245, 1246, 5, 105, 0, 0, 1246, 1247, 5, 113, 0, 0, 1247, 1248, 5, 117, 0, 0, 1248, 1249, 5, 101, 0, 0, 1249, 232, 1, 0, 0, 0, 1250, 1251, 5, 109, 0, 0, 1251, 1252, 5, 97, 0, 0, 1252, 1253, 5, 110, 0, 0, 1253, 1254, 5, 121, 0, 0, 1254, 234, 1, 0, 0, 0, 1255, 1256, 5, 111, 0, 0, 1256, 1257, 5, 114, 0, 0, 1257, 1258, 5, 100, 0, 0, 1258, 1259, 5, 101, 0, 0, 1259, 1260, 5, 114, 0, 0, 1260, 1261, 5, 101, 0, 0, 1261, 1262, 5, 100, 0, 0, 1262, 236, 1, 0, 0, 0, 1263, 1264, 5, 117, 0, 0, 1264, 1265, 5, 110, 0, 0, 1265, 1266, 5, 105, 0, 0, 1266, 1267, 5, 116, 0, 0, 1267, 238, 1, 0, 0, 0, 1268, 1269, 5, 119, 0, 0, 1269, 1270, 5, 97, 0, 0, 1270, 1271, 5, 116, 0, 0, 1271, 1272, 5, 99, 0, 0, 1272, 1273, 5, 104, 0, 0, 1273, 1274, 5, 45, 0, 0, 1274, 1275, 5, 104, 0, 0, 1275, 1276, 5, 97, 0, 0, 1276, 1277, 5, 110, 0, 0, 1277, 1278, 5, 100, 0, 0, 1278, 1279, 5, 108, 0, 0, 1279, 1280, 5, 101, 0, 0, 1280, 240, 1, 0, 0, 0, 1281, 1282, 5, 109, 0, 0, 1282, 1283, 5, 101, 0, 0, 1283, 1284, 5, 115, 0, 0, 1284, 1285, 5, 115, 0, 0, 1285, 1286, 5, 97, 0, 0, 1286, 1287, 5, 103, 0, 0, 1287, 1288, 5, 101, 0, 0, 1288, 242, 1, 0, 0, 0, 1289, 1290, 5, 97, 0, 0, 1290, 1291, 5, 116, 0, 0, 1291, 1292, 5, 111, 0, 0, 1292, 1293, 5, 109, 0, 0, 1293, 1294, 5, 45, 0, 0, 1294, 1295, 5, 114, 0, 0, 1295, 1296, 5, 101, 0, 0, 1296, 1297, 5, 102, 0, 0, 1297, 244, 1, 0, 0, 0, 1298, 1299, 5, 105, 0, 0, 1299, 1300, 5, 110, 0, 0, 1300, 1301, 5, 116, 0, 0, 1301, 1302, 5, 101, 0, 0, 1302, 1303, 5, 114, 0, 0, 1303, 1304, 5, 102, 0, 0, 1304, 1305, 5, 97, 0, 0, 1305, 1306, 5, 99, 0, 0, 1306, 1307, 5, 101, 0, 0, 1307, 1308, 5, 45, 0, 0, 1308, 1309, 5, 114, 0, 0, 1309, 1310, 5, 101, 0, 0, 1310, 1311, 5, 102, 0, 0, 1311, 246, 1, 0, 0, 0, 1312, 1313, 5, 111, 0, 0, 1313, 1314, 5, 112, 0, 0, 1314, 1315, 5, 116, 0, 0, 1315, 1316, 5, 105, 0, 0, 1316, 1317, 5, 111, 0, 0, 1317, 1318, 5, 110, 0, 0, 1318, 1319, 5, 97, 0, 0, 1319, 1320, 5, 108, 0, 0, 1320, 248, 1, 0, 0, 0, 1321, 1322, 5, 108, 0, 0, 1322, 1323, 5, 105, 0, 0, 1323, 1324, 5, 115, 0, 0, 1324, 1325, 5, 116, 0, 0, 1325, 250, 1, 0, 0, 0, 1326, 1327, 5, 114, 0, 0, 1327, 1328, 5, 101, 0, 0, 1328, 1329, 5, 99, 0, 0, 1329, 1330, 5, 111, 0, 0, 1330, 1331, 5, 114, 0, 0, 1331, 1332, 5, 100, 0, 0, 1332, 252, 1, 0, 0, 0, 1333, 1334, 5, 98, 0, 0, 1334, 1335, 5, 111, 0, 0, 1335, 1336, 5, 111, 0, 0, 1336, 1337, 5, 108, 0, 0, 1337, 254, 1, 0, 0, 0, 1338, 1339, 5, 98, 0, 0, 1339, 1340, 5, 121, 0, 0, 1340, 1341, 5, 116, 0, 0, 1341, 1342, 5, 101, 0, 0, 1342, 1343, 5, 115, 0, 0, 1343, 256, 1, 0, 0, 0, 1344, 1345, 5, 100, 0, 0, 1345, 1346, 5, 111, 0, 0, 1346, 1347, 5, 117, 0, 0, 1347, 1348, 5, 98, 0, 0, 1348, 1349, 5, 108, 0, 0, 1349, 1350, 5, 101, 0, 0, 1350, 258, 1, 0, 0, 0, 1351, 1352, 5, 105, 0, 0, 1352, 1353, 5, 110, 0, 0, 1353, 1354, 5, 116, 0, 0, 1354, 1355, 5, 51, 0, 0, 1355, 1356, 5, 50, 0, 0, 1356, 260, 1, 0, 0, 0, 1357, 1358, 5, 105, 0, 0, 1358, 1359, 5, 110, 0, 0, 1359, 1360, 5, 116, 0, 0, 1360, 1361, 5, 54, 0, 0, 1361, 1362, 5, 52, 0, 0, 1362, 262, 1, 0, 0, 0, 1363, 1364, 5, 115, 0, 0, 1364, 1365, 5, 116, 0, 0, 1365, 1366, 5, 114, 0, 0, 1366, 1367, 5, 105, 0, 0, 1367, 1368, 5, 110, 0, 0, 1368, 1369, 5, 103, 0, 0, 1369, 264, 1, 0, 0, 0, 1370, 1371, 5, 117, 0, 0, 1371, 1372, 5, 105, 0, 0, 1372, 1373, 5, 110, 0, 0, 1373, 1374, 5, 116, 0, 0, 1374, 1375, 5, 51, 0, 0, 1375, 1376, 5, 50, 0, 0, 1376, 266, 1, 0, 0, 0, 1377, 1378, 5, 117, 0, 0, 1378, 1379, 5, 105, 0, 0, 1379, 1380, 5, 110, 0, 0, 1380, 1381, 5, 116, 0, 0, 1381, 1382, 5, 54, 0, 0, 1382, 1383, 5, 52, 0, 0, 1383, 268, 1, 0, 0, 0, 1384, 1385, 5, 116, 0, 0, 1385, 1386, 5, 114, 0, 0, 1386, 1387, 5, 117, 0, 0, 1387, 1388, 5, 101, 0, 0, 1388, 270, 1, 0, 0, 0, 1389, 1390, 5, 102, 0, 0, 1390, 1391, 5, 97, 0, 0, 1391, 1392, 5, 108, 0, 0, 1392, 1393, 5, 115, 0, 0, 1393, 1394, 5, 101, 0, 0, 1394, 272, 1, 0, 0, 0, 1395, 1396, 5, 110, 0, 0, 1396, 1397, 5, 117, 0, 0, 1397, 1398, 5, 108, 0, 0, 1398, 1399, 5, 108, 0, 0, 1399, 274, 1, 0, 0, 0, 1400, 1401, 5, 45, 0, 0, 1401, 1402, 5, 62, 0, 0, 1402, 276, 1, 0, 0, 0, 1403, 1404, 5, 58, 0, 0, 1404, 278, 1, 0, 0, 0, 1405, 1406, 5, 59, 0, 0, 1406, 280, 1, 0, 0, 0, 1407, 1408, 5, 44, 0, 0, 1408, 282, 1, 0, 0, 0, 1409, 1410, 5, 46, 0, 0, 1410, 284, 1, 0, 0, 0, 1411, 1412, 5, 123, 0, 0, 1412, 286, 1, 0, 0, 0, 1413, 1414, 5, 125, 0, 0, 1414, 288, 1, 0, 0, 0, 1415, 1416, 5, 91, 0, 0, 1416, 290, 1, 0, 0, 0, 1417, 1418, 5, 93, 0, 0, 1418, 292, 1, 0, 0, 0, 1419, 1420, 5, 40, 0, 0, 1420, 294, 1, 0, 0, 0, 1421, 1422, 5, 41, 0, 0, 1422, 296, 1, 0, 0, 0, 1423, 1424, 5, 60, 0, 0, 1424, 298, 1, 0, 0, 0, 1425, 1426, 5, 62, 0, 0, 1426, 300, 1, 0, 0, 0, 1427, 1428, 5, 38, 0, 0, 1428, 302, 1, 0, 0, 0, 1429, 1430, 5, 61, 0, 0, 1430, 304, 1, 0, 0, 0, 1431, 1433, 5, 45, 0, 0, 1432, 1431, 1, 0, 0, 0, 1432, 1433, 1, 0, 0, 0, 1433, 1435, 1, 0, 0, 0, 1434, 1436, 7, 0, 0, 0, 1435, 1434, 1, 0, 0, 0, 1436, 1437, 1, 0, 0, 0, 1437, 1435, 1, 0, 0, 0, 1437, 1438, 1, 0, 0, 0, 1438, 306, 1, 0, 0, 0, 1439, 1441, 5, 45, 0, 0, 1440, 1439, 1, 0, 0, 0, 1440, 1441, 1, 0, 0, 0, 1441, 1450, 1, 0, 0, 0, 1442, 1451, 5, 48, 0, 0, 1443, 1447, 7, 1, 0, 0, 1444, 1446, 7, 0, 0, 0, 1445, 1444, 1, 0, 0, 0, 1446, 1449, 1, 0, 0, 0, 1447, 1445, 1, 0, 0, 0, 1447, 1448, 1, 0, 0, 0, 1448, 1451, 1, 0, 0, 0, 1449, 1447, 1, 0, 0, 0, 1450, 1442, 1, 0, 0, 0, 1450, 1443, 1, 0, 0, 0, 1451, 1458, 1, 0, 0, 0, 1452, 1454, 5, 46, 0, 0, 1453, 1455, 7, 0, 0, 0, 1454, 1453, 1, 0, 0, 0, 1455, 1456, 1, 0, 0, 0, 1456, 1454, 1, 0, 0, 0, 1456, 1457, 1, 0, 0, 0, 1457, 1459, 1, 0, 0, 0, 1458, 1452, 1, 0, 0, 0, 1458, 1459, 1, 0, 0, 0, 1459, 1469, 1, 0, 0, 0, 1460, 1462, 7, 2, 0, 0, 1461, 1463, 7, 3, 0, 0, 1462, 1461, 1, 0, 0, 0, 1462, 1463, 1, 0, 0, 0, 1463, 1465, 1, 0, 0, 0, 1464, 1466, 7, 0, 0, 0, 1465, 1464, 1, 0, 0, 0, 1466, 1467, 1, 0, 0, 0, 1467, 1465, 1, 0, 0, 0, 1467, 1468, 1, 0, 0, 0, 1468, 1470, 1, 0, 0, 0, 1469, 1460, 1, 0, 0, 0, 1469, 1470, 1, 0, 0, 0, 1470, 308, 1, 0, 0, 0, 1471, 1475, 7, 4, 0, 0, 1472, 1474, 7, 5, 0, 0, 1473, 1472, 1, 0, 0, 0, 1474, 1477, 1, 0, 0, 0, 1475, 1473, 1, 0, 0, 0, 1475, 1476, 1, 0, 0, 0, 1476, 310, 1, 0, 0, 0, 1477, 1475, 1, 0, 0, 0, 1478, 1483, 5, 34, 0, 0, 1479, 1482, 3, 313, 156, 0, 1480, 1482, 8, 6, 0, 0, 1481, 1479, 1, 0, 0, 0, 1481, 1480, 1, 0, 0, 0, 1482, 1485, 1, 0, 0, 0, 1483, 1481, 1, 0, 0, 0, 1483, 1484, 1, 0, 0, 0, 1484, 1486, 1, 0, 0, 0, 1485, 1483, 1, 0, 0, 0, 1486, 1487, 5, 34, 0, 0, 1487, 312, 1, 0, 0, 0, 1488, 1496, 5, 92, 0, 0, 1489, 1497, 7, 7, 0, 0, 1490, 1491, 5, 117, 0, 0, 1491, 1492, 3, 315, 157, 0, 1492, 1493, 3, 315, 157, 0, 1493, 1494, 3, 315, 157, 0, 1494, 1495, 3, 315, 157, 0, 1495, 1497, 1, 0, 0, 0, 1496, 1489, 1, 0, 0, 0, 1496, 1490, 1, 0, 0, 0, 1497, 314, 1, 0, 0, 0, 1498, 1499, 7, 8, 0, 0, 1499, 316, 1, 0, 0, 0, 1500, 1501, 5, 47, 0, 0, 1501, 1502, 5, 47, 0, 0, 1502, 1506, 1, 0, 0, 0, 1503, 1505, 8, 9, 0, 0, 1504, 1503, 1, 0, 0, 0, 1505, 1508, 1, 0, 0, 0, 1506, 1504, 1, 0, 0, 0, 1506, 1507, 1, 0, 0, 0, 1507, 1509, 1, 0, 0, 0, 1508, 1506, 1, 0, 0, 0, 1509, 1510, 6, 158, 0, 0, 1510, 318, 1, 0, 0, 0, 1511, 1512, 5, 47, 0, 0, 1512, 1513, 5, 42, 0, 0, 1513, 1517, 1, 0, 0, 0, 1514, 1516, 9, 0, 0, 0, 1515, 1514, 1, 0, 0, 0, 1516, 1519, 1, 0, 0, 0, 1517, 1518, 1, 0, 0, 0, 1517, 1515, 1, 0, 0, 0, 1518, 1520, 1, 0, 0, 0, 1519, 1517, 1, 0, 0, 0, 1520, 1521, 5, 42, 0, 0, 1521, 1522, 5, 47, 0, 0, 1522, 1523, 1, 0, 0, 0, 1523, 1524, 6, 159, 0, 0, 1524, 320, 1, 0, 0, 0, 1525, 1527, 7, 10, 0, 0, 1526, 1525, 1, 0, 0, 0, 1527, 1528, 1, 0, 0, 0, 1528, 1526, 1, 0, 0, 0, 1528, 1529, 1, 0, 0, 0, 1529, 1530, 1, 0, 0, 0, 1530, 1531, 6, 160, 0, 0, 1531, 322, 1, 0, 0, 0, 18, 0, 1432, 1437, 1440, 1447, 1450, 1456, 1458, 1462, 1467, 1469, 1475, 1481, 1483, 1496, 1506, 1517, 1528, 1, 0, 1, 0] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapabilityLexer.tokens b/src/capability-language/generated/QuixosCapabilityLexer.tokens index 737fc4d..ec69fb8 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.tokens +++ b/src/capability-language/generated/QuixosCapabilityLexer.tokens @@ -42,120 +42,121 @@ REF=41 FRAGMENT=42 IMPORT=43 EXTERNAL=44 -ATOM=45 -INTERFACE=46 -INTERFACES=47 -PACKAGE=48 -VALUE=49 -FIELD=50 -RELATION=51 -OPERATION=52 -FUNCTION=53 -CONSTRUCTOR=54 -CONSTRUCTS=55 -INPUT=56 -CONFORM=57 -AS=58 -BIND=59 -STATIC=60 -TO=61 -PRIVATE=62 -SHARED=63 -STATE=64 -EDGE=65 -PROJECTION=66 -WITH=67 -USING=68 -ACCEPT=69 -VIA=70 -MATERIALIZE=71 -IF=72 -ABSENT=73 -ON=74 -POLICY=75 -DEFAULT=76 -SOURCE=77 -REPOSITORY=78 -COMMIT=79 -REVISION=80 -SEMANTIC_MAJOR=81 -ON_DELETE=82 -LIFECYCLE=83 -JOURNAL=84 -SUBSCRIPTION=85 -RETAIN_OTHER=86 -KEYED=87 -PUBLIC_TRAVERSAL=88 -ID=89 -DOC=90 -MODE=91 -EMITS=92 -RECEIVER=93 -REQUIRES=94 -ANY=95 -GET=96 -SET=97 -WATCH=98 -START=99 -STOP=100 -READ=101 -WRITE=102 -RESOLVE=103 -CONNECT=104 -DISCONNECT=105 -CALL=106 -WATCH_START=107 -WATCH_STOP=108 -SUBSCRIBE=109 -UNSUBSCRIBE=110 -REGISTER=111 -CRDT=112 -OPTIONAL_ONE=113 -EXACTLY_ONE=114 -MANY_UNIQUE=115 -MANY=116 -ORDERED=117 -UNIT=118 -WATCH_HANDLE=119 -MESSAGE=120 -ATOM_REF=121 -INTERFACE_REF=122 -OPTIONAL=123 -LIST=124 -RECORD=125 -BOOL=126 -BYTES=127 -DOUBLE=128 -INT32=129 -INT64=130 -STRING=131 -UINT32=132 -UINT64=133 -TRUE=134 -FALSE=135 -NULL=136 -ARROW=137 -COLON=138 -SEMI=139 -COMMA=140 -DOT=141 -LBRACE=142 -RBRACE=143 -LBRACK=144 -RBRACK=145 -LPAREN=146 -RPAREN=147 -LT=148 -GT=149 -AMP=150 -EQUAL=151 -INTEGER=152 -JSON_NUMBER=153 -IDENTIFIER=154 -STRING_LITERAL=155 -LINE_COMMENT=156 -BLOCK_COMMENT=157 -WS=158 +SYMBOL=45 +ATOM=46 +INTERFACE=47 +INTERFACES=48 +PACKAGE=49 +VALUE=50 +FIELD=51 +RELATION=52 +OPERATION=53 +FUNCTION=54 +CONSTRUCTOR=55 +CONSTRUCTS=56 +INPUT=57 +CONFORM=58 +AS=59 +BIND=60 +STATIC=61 +TO=62 +PRIVATE=63 +SHARED=64 +STATE=65 +EDGE=66 +PROJECTION=67 +WITH=68 +USING=69 +ACCEPT=70 +VIA=71 +MATERIALIZE=72 +IF=73 +ABSENT=74 +ON=75 +POLICY=76 +DEFAULT=77 +SOURCE=78 +REPOSITORY=79 +COMMIT=80 +REVISION=81 +SEMANTIC_MAJOR=82 +ON_DELETE=83 +LIFECYCLE=84 +JOURNAL=85 +SUBSCRIPTION=86 +RETAIN_OTHER=87 +KEYED=88 +PUBLIC_TRAVERSAL=89 +ID=90 +DOC=91 +MODE=92 +EMITS=93 +RECEIVER=94 +REQUIRES=95 +ANY=96 +GET=97 +SET=98 +WATCH=99 +START=100 +STOP=101 +READ=102 +WRITE=103 +RESOLVE=104 +CONNECT=105 +DISCONNECT=106 +CALL=107 +WATCH_START=108 +WATCH_STOP=109 +SUBSCRIBE=110 +UNSUBSCRIBE=111 +REGISTER=112 +CRDT=113 +OPTIONAL_ONE=114 +EXACTLY_ONE=115 +MANY_UNIQUE=116 +MANY=117 +ORDERED=118 +UNIT=119 +WATCH_HANDLE=120 +MESSAGE=121 +ATOM_REF=122 +INTERFACE_REF=123 +OPTIONAL=124 +LIST=125 +RECORD=126 +BOOL=127 +BYTES=128 +DOUBLE=129 +INT32=130 +INT64=131 +STRING=132 +UINT32=133 +UINT64=134 +TRUE=135 +FALSE=136 +NULL=137 +ARROW=138 +COLON=139 +SEMI=140 +COMMA=141 +DOT=142 +LBRACE=143 +RBRACE=144 +LBRACK=145 +RBRACK=146 +LPAREN=147 +RPAREN=148 +LT=149 +GT=150 +AMP=151 +EQUAL=152 +INTEGER=153 +JSON_NUMBER=154 +IDENTIFIER=155 +STRING_LITERAL=156 +LINE_COMMENT=157 +BLOCK_COMMENT=158 +WS=159 'edit'=1 'module'=2 'contract'=3 @@ -200,110 +201,111 @@ WS=158 'fragment'=42 'import'=43 'external'=44 -'atom'=45 -'interface'=46 -'interfaces'=47 -'package'=48 -'value'=49 -'field'=50 -'relation'=51 -'operation'=52 -'function'=53 -'constructor'=54 -'constructs'=55 -'input'=56 -'conform'=57 -'as'=58 -'bind'=59 -'static'=60 -'to'=61 -'private'=62 -'shared'=63 -'state'=64 -'edge'=65 -'projection'=66 -'with'=67 -'using'=68 -'accept'=69 -'via'=70 -'materialize'=71 -'if'=72 -'absent'=73 -'on'=74 -'policy'=75 -'default'=76 -'source'=77 -'repository'=78 -'commit'=79 -'revision'=80 -'semantic-major'=81 -'on-delete'=82 -'lifecycle'=83 -'journal'=84 -'subscription'=85 -'retain-other'=86 -'keyed'=87 -'public-traversal'=88 -'id'=89 -'doc'=90 -'mode'=91 -'emits'=92 -'receiver'=93 -'requires'=94 -'any'=95 -'get'=96 -'set'=97 -'watch'=98 -'start'=99 -'stop'=100 -'read'=101 -'write'=102 -'resolve'=103 -'connect'=104 -'disconnect'=105 -'call'=106 -'watch-start'=107 -'watch-stop'=108 -'subscribe'=109 -'unsubscribe'=110 -'register'=111 -'crdt'=112 -'optional-one'=113 -'exactly-one'=114 -'many-unique'=115 -'many'=116 -'ordered'=117 -'unit'=118 -'watch-handle'=119 -'message'=120 -'atom-ref'=121 -'interface-ref'=122 -'optional'=123 -'list'=124 -'record'=125 -'bool'=126 -'bytes'=127 -'double'=128 -'int32'=129 -'int64'=130 -'string'=131 -'uint32'=132 -'uint64'=133 -'true'=134 -'false'=135 -'null'=136 -'->'=137 -':'=138 -';'=139 -','=140 -'.'=141 -'{'=142 -'}'=143 -'['=144 -']'=145 -'('=146 -')'=147 -'<'=148 -'>'=149 -'&'=150 -'='=151 +'symbol'=45 +'atom'=46 +'interface'=47 +'interfaces'=48 +'package'=49 +'value'=50 +'field'=51 +'relation'=52 +'operation'=53 +'function'=54 +'constructor'=55 +'constructs'=56 +'input'=57 +'conform'=58 +'as'=59 +'bind'=60 +'static'=61 +'to'=62 +'private'=63 +'shared'=64 +'state'=65 +'edge'=66 +'projection'=67 +'with'=68 +'using'=69 +'accept'=70 +'via'=71 +'materialize'=72 +'if'=73 +'absent'=74 +'on'=75 +'policy'=76 +'default'=77 +'source'=78 +'repository'=79 +'commit'=80 +'revision'=81 +'semantic-major'=82 +'on-delete'=83 +'lifecycle'=84 +'journal'=85 +'subscription'=86 +'retain-other'=87 +'keyed'=88 +'public-traversal'=89 +'id'=90 +'doc'=91 +'mode'=92 +'emits'=93 +'receiver'=94 +'requires'=95 +'any'=96 +'get'=97 +'set'=98 +'watch'=99 +'start'=100 +'stop'=101 +'read'=102 +'write'=103 +'resolve'=104 +'connect'=105 +'disconnect'=106 +'call'=107 +'watch-start'=108 +'watch-stop'=109 +'subscribe'=110 +'unsubscribe'=111 +'register'=112 +'crdt'=113 +'optional-one'=114 +'exactly-one'=115 +'many-unique'=116 +'many'=117 +'ordered'=118 +'unit'=119 +'watch-handle'=120 +'message'=121 +'atom-ref'=122 +'interface-ref'=123 +'optional'=124 +'list'=125 +'record'=126 +'bool'=127 +'bytes'=128 +'double'=129 +'int32'=130 +'int64'=131 +'string'=132 +'uint32'=133 +'uint64'=134 +'true'=135 +'false'=136 +'null'=137 +'->'=138 +':'=139 +';'=140 +','=141 +'.'=142 +'{'=143 +'}'=144 +'['=145 +']'=146 +'('=147 +')'=148 +'<'=149 +'>'=150 +'&'=151 +'='=152 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.ts b/src/capability-language/generated/QuixosCapabilityLexer.ts index 55141a5..78ceca0 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.ts +++ b/src/capability-language/generated/QuixosCapabilityLexer.ts @@ -48,120 +48,121 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public static readonly FRAGMENT = 42; public static readonly IMPORT = 43; public static readonly EXTERNAL = 44; - public static readonly ATOM = 45; - public static readonly INTERFACE = 46; - public static readonly INTERFACES = 47; - public static readonly PACKAGE = 48; - public static readonly VALUE = 49; - public static readonly FIELD = 50; - public static readonly RELATION = 51; - public static readonly OPERATION = 52; - public static readonly FUNCTION = 53; - public static readonly CONSTRUCTOR = 54; - public static readonly CONSTRUCTS = 55; - public static readonly INPUT = 56; - public static readonly CONFORM = 57; - public static readonly AS = 58; - public static readonly BIND = 59; - public static readonly STATIC = 60; - public static readonly TO = 61; - public static readonly PRIVATE = 62; - public static readonly SHARED = 63; - public static readonly STATE = 64; - public static readonly EDGE = 65; - public static readonly PROJECTION = 66; - public static readonly WITH = 67; - public static readonly USING = 68; - public static readonly ACCEPT = 69; - public static readonly VIA = 70; - public static readonly MATERIALIZE = 71; - public static readonly IF = 72; - public static readonly ABSENT = 73; - public static readonly ON = 74; - public static readonly POLICY = 75; - public static readonly DEFAULT = 76; - public static readonly SOURCE = 77; - public static readonly REPOSITORY = 78; - public static readonly COMMIT = 79; - public static readonly REVISION = 80; - public static readonly SEMANTIC_MAJOR = 81; - public static readonly ON_DELETE = 82; - public static readonly LIFECYCLE = 83; - public static readonly JOURNAL = 84; - public static readonly SUBSCRIPTION = 85; - public static readonly RETAIN_OTHER = 86; - public static readonly KEYED = 87; - public static readonly PUBLIC_TRAVERSAL = 88; - public static readonly ID = 89; - public static readonly DOC = 90; - public static readonly MODE = 91; - public static readonly EMITS = 92; - public static readonly RECEIVER = 93; - public static readonly REQUIRES = 94; - public static readonly ANY = 95; - public static readonly GET = 96; - public static readonly SET = 97; - public static readonly WATCH = 98; - public static readonly START = 99; - public static readonly STOP = 100; - public static readonly READ = 101; - public static readonly WRITE = 102; - public static readonly RESOLVE = 103; - public static readonly CONNECT = 104; - public static readonly DISCONNECT = 105; - public static readonly CALL = 106; - public static readonly WATCH_START = 107; - public static readonly WATCH_STOP = 108; - public static readonly SUBSCRIBE = 109; - public static readonly UNSUBSCRIBE = 110; - public static readonly REGISTER = 111; - public static readonly CRDT = 112; - public static readonly OPTIONAL_ONE = 113; - public static readonly EXACTLY_ONE = 114; - public static readonly MANY_UNIQUE = 115; - public static readonly MANY = 116; - public static readonly ORDERED = 117; - public static readonly UNIT = 118; - public static readonly WATCH_HANDLE = 119; - public static readonly MESSAGE = 120; - public static readonly ATOM_REF = 121; - public static readonly INTERFACE_REF = 122; - public static readonly OPTIONAL = 123; - public static readonly LIST = 124; - public static readonly RECORD = 125; - public static readonly BOOL = 126; - public static readonly BYTES = 127; - public static readonly DOUBLE = 128; - public static readonly INT32 = 129; - public static readonly INT64 = 130; - public static readonly STRING = 131; - public static readonly UINT32 = 132; - public static readonly UINT64 = 133; - public static readonly TRUE = 134; - public static readonly FALSE = 135; - public static readonly NULL = 136; - public static readonly ARROW = 137; - public static readonly COLON = 138; - public static readonly SEMI = 139; - public static readonly COMMA = 140; - public static readonly DOT = 141; - public static readonly LBRACE = 142; - public static readonly RBRACE = 143; - public static readonly LBRACK = 144; - public static readonly RBRACK = 145; - public static readonly LPAREN = 146; - public static readonly RPAREN = 147; - public static readonly LT = 148; - public static readonly GT = 149; - public static readonly AMP = 150; - public static readonly EQUAL = 151; - public static readonly INTEGER = 152; - public static readonly JSON_NUMBER = 153; - public static readonly IDENTIFIER = 154; - public static readonly STRING_LITERAL = 155; - public static readonly LINE_COMMENT = 156; - public static readonly BLOCK_COMMENT = 157; - public static readonly WS = 158; + public static readonly SYMBOL = 45; + public static readonly ATOM = 46; + public static readonly INTERFACE = 47; + public static readonly INTERFACES = 48; + public static readonly PACKAGE = 49; + public static readonly VALUE = 50; + public static readonly FIELD = 51; + public static readonly RELATION = 52; + public static readonly OPERATION = 53; + public static readonly FUNCTION = 54; + public static readonly CONSTRUCTOR = 55; + public static readonly CONSTRUCTS = 56; + public static readonly INPUT = 57; + public static readonly CONFORM = 58; + public static readonly AS = 59; + public static readonly BIND = 60; + public static readonly STATIC = 61; + public static readonly TO = 62; + public static readonly PRIVATE = 63; + public static readonly SHARED = 64; + public static readonly STATE = 65; + public static readonly EDGE = 66; + public static readonly PROJECTION = 67; + public static readonly WITH = 68; + public static readonly USING = 69; + public static readonly ACCEPT = 70; + public static readonly VIA = 71; + public static readonly MATERIALIZE = 72; + public static readonly IF = 73; + public static readonly ABSENT = 74; + public static readonly ON = 75; + public static readonly POLICY = 76; + public static readonly DEFAULT = 77; + public static readonly SOURCE = 78; + public static readonly REPOSITORY = 79; + public static readonly COMMIT = 80; + public static readonly REVISION = 81; + public static readonly SEMANTIC_MAJOR = 82; + public static readonly ON_DELETE = 83; + public static readonly LIFECYCLE = 84; + public static readonly JOURNAL = 85; + public static readonly SUBSCRIPTION = 86; + public static readonly RETAIN_OTHER = 87; + public static readonly KEYED = 88; + public static readonly PUBLIC_TRAVERSAL = 89; + public static readonly ID = 90; + public static readonly DOC = 91; + public static readonly MODE = 92; + public static readonly EMITS = 93; + public static readonly RECEIVER = 94; + public static readonly REQUIRES = 95; + public static readonly ANY = 96; + public static readonly GET = 97; + public static readonly SET = 98; + public static readonly WATCH = 99; + public static readonly START = 100; + public static readonly STOP = 101; + public static readonly READ = 102; + public static readonly WRITE = 103; + public static readonly RESOLVE = 104; + public static readonly CONNECT = 105; + public static readonly DISCONNECT = 106; + public static readonly CALL = 107; + public static readonly WATCH_START = 108; + public static readonly WATCH_STOP = 109; + public static readonly SUBSCRIBE = 110; + public static readonly UNSUBSCRIBE = 111; + public static readonly REGISTER = 112; + public static readonly CRDT = 113; + public static readonly OPTIONAL_ONE = 114; + public static readonly EXACTLY_ONE = 115; + public static readonly MANY_UNIQUE = 116; + public static readonly MANY = 117; + public static readonly ORDERED = 118; + public static readonly UNIT = 119; + public static readonly WATCH_HANDLE = 120; + public static readonly MESSAGE = 121; + public static readonly ATOM_REF = 122; + public static readonly INTERFACE_REF = 123; + public static readonly OPTIONAL = 124; + public static readonly LIST = 125; + public static readonly RECORD = 126; + public static readonly BOOL = 127; + public static readonly BYTES = 128; + public static readonly DOUBLE = 129; + public static readonly INT32 = 130; + public static readonly INT64 = 131; + public static readonly STRING = 132; + public static readonly UINT32 = 133; + public static readonly UINT64 = 134; + public static readonly TRUE = 135; + public static readonly FALSE = 136; + public static readonly NULL = 137; + public static readonly ARROW = 138; + public static readonly COLON = 139; + public static readonly SEMI = 140; + public static readonly COMMA = 141; + public static readonly DOT = 142; + public static readonly LBRACE = 143; + public static readonly RBRACE = 144; + public static readonly LBRACK = 145; + public static readonly RBRACK = 146; + public static readonly LPAREN = 147; + public static readonly RPAREN = 148; + public static readonly LT = 149; + public static readonly GT = 150; + public static readonly AMP = 151; + public static readonly EQUAL = 152; + public static readonly INTEGER = 153; + public static readonly JSON_NUMBER = 154; + public static readonly IDENTIFIER = 155; + public static readonly STRING_LITERAL = 156; + public static readonly LINE_COMMENT = 157; + public static readonly BLOCK_COMMENT = 158; + public static readonly WS = 159; public static readonly channelNames = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" @@ -176,10 +177,10 @@ export class QuixosCapabilityLexer extends antlr.Lexer { "'root'", "'document'", "'fragments'", "'view'", "'max'", "'allow'", "'poll'", "'queryable'", "'rpc'", "'query-reason'", "'type'", "'object'", "'storable'", "'implements'", "'ref'", "'fragment'", "'import'", - "'external'", "'atom'", "'interface'", "'interfaces'", "'package'", - "'value'", "'field'", "'relation'", "'operation'", "'function'", - "'constructor'", "'constructs'", "'input'", "'conform'", "'as'", - "'bind'", "'static'", "'to'", "'private'", "'shared'", "'state'", + "'external'", "'symbol'", "'atom'", "'interface'", "'interfaces'", + "'package'", "'value'", "'field'", "'relation'", "'operation'", + "'function'", "'constructor'", "'constructs'", "'input'", "'conform'", + "'as'", "'bind'", "'static'", "'to'", "'private'", "'shared'", "'state'", "'edge'", "'projection'", "'with'", "'using'", "'accept'", "'via'", "'materialize'", "'if'", "'absent'", "'on'", "'policy'", "'default'", "'source'", "'repository'", "'commit'", "'revision'", "'semantic-major'", @@ -205,17 +206,17 @@ export class QuixosCapabilityLexer extends antlr.Lexer { "REFLECTION", "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", "MAX", "ALLOW", "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", "OBJECT", "STORABLE", "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", - "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", - "FIELD", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", - "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", "PRIVATE", "SHARED", - "STATE", "EDGE", "PROJECTION", "WITH", "USING", "ACCEPT", "VIA", - "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", - "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", - "LIFECYCLE", "JOURNAL", "SUBSCRIPTION", "RETAIN_OTHER", "KEYED", - "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", - "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", "WRITE", - "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", - "SUBSCRIBE", "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", + "EXTERNAL", "SYMBOL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", + "VALUE", "FIELD", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", + "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", + "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", "USING", + "ACCEPT", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", + "DEFAULT", "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", + "ON_DELETE", "LIFECYCLE", "JOURNAL", "SUBSCRIPTION", "RETAIN_OTHER", + "KEYED", "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", "EMITS", "RECEIVER", + "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", + "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", + "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", @@ -237,17 +238,17 @@ export class QuixosCapabilityLexer extends antlr.Lexer { "REFLECTION", "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", "MAX", "ALLOW", "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", "OBJECT", "STORABLE", "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", - "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", - "FIELD", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", - "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", "PRIVATE", "SHARED", - "STATE", "EDGE", "PROJECTION", "WITH", "USING", "ACCEPT", "VIA", - "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", - "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", - "LIFECYCLE", "JOURNAL", "SUBSCRIPTION", "RETAIN_OTHER", "KEYED", - "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", - "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", "WRITE", - "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", - "SUBSCRIBE", "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", + "EXTERNAL", "SYMBOL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", + "VALUE", "FIELD", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", + "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", + "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", "USING", + "ACCEPT", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", + "DEFAULT", "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", + "ON_DELETE", "LIFECYCLE", "JOURNAL", "SUBSCRIPTION", "RETAIN_OTHER", + "KEYED", "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", "EMITS", "RECEIVER", + "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", + "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", + "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", @@ -277,7 +278,7 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public get modeNames(): string[] { return QuixosCapabilityLexer.modeNames; } public static readonly _serializedATN: number[] = [ - 4,0,158,1523,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, + 4,0,159,1532,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, @@ -303,128 +304,129 @@ export class QuixosCapabilityLexer extends antlr.Lexer { 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,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1, - 1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1, - 3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,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,7,1,7,1,7,1,7,1, - 7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1, - 9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10, - 1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11, - 1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13, - 1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14, - 1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,16,1,16,1,16, - 1,16,1,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17, - 1,17,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,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,21, - 1,21,1,21,1,21,1,21,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,22,1,23,1,23,1,23,1,23,1,23, - 1,23,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,25, - 1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,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,27,1,28,1,28, - 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,30,1,30,1,30,1,30,1,31,1,31,1,31,1,31,1,31,1,31,1,32,1,32,1,32, - 1,32,1,32,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,34, - 1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35, - 1,35,1,35,1,35,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,38,1,38,1,38,1,38,1,39,1,39, - 1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40, - 1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,42,1,42,1,42,1,42, - 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,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,45,1,46,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,48,1,48,1,48,1,48,1,48,1,48, - 1,49,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,50,1,51,1,51,1,51,1,51,1,51,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,52,1,53,1,53,1,53,1,53,1,53, - 1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,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,56,1,56, - 1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,58,1,58,1,58,1,58, - 1,58,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,61,1,61, - 1,61,1,61,1,61,1,61,1,61,1,61,1,62,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,64,1,64,1,64,1,64,1,64,1,65,1,65, - 1,65,1,65,1,65,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,68,1,68,1,68,1,68,1,68,1,68, - 1,68,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,70,1,70,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,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,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,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,79, - 1,79,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,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,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,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,84,1,84,1,84,1,85,1,85,1,85,1,85,1,85,1,85,1,85,1,85, - 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,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87,1,87, - 1,87,1,87,1,88,1,88,1,88,1,89,1,89,1,89,1,89,1,90,1,90,1,90,1,90, - 1,90,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,93,1,93,1,93,1,93,1,94, - 1,94,1,94,1,94,1,95,1,95,1,95,1,95,1,96,1,96,1,96,1,96,1,97,1,97, - 1,97,1,97,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,102,1,102,1,103, - 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,104,1,104,1,104,1,104,1,104,1,104,1,105,1,105,1,105,1,105, - 1,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,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107, - 1,107,1,107,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108, - 1,108,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109, - 1,109,1,109,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110, - 1,111,1,111,1,111,1,111,1,111,1,112,1,112,1,112,1,112,1,112,1,112, - 1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,113,1,113,1,113,1,113, - 1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,114,1,114,1,114, - 1,114,1,114,1,114,1,114,1,114,1,114,1,114,1,114,1,114,1,115,1,115, - 1,115,1,115,1,115,1,116,1,116,1,116,1,116,1,116,1,116,1,116,1,116, - 1,117,1,117,1,117,1,117,1,117,1,118,1,118,1,118,1,118,1,118,1,118, - 1,118,1,118,1,118,1,118,1,118,1,118,1,118,1,119,1,119,1,119,1,119, - 1,119,1,119,1,119,1,119,1,120,1,120,1,120,1,120,1,120,1,120,1,120, + 7,158,2,159,7,159,2,160,7,160,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1, + 3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1, + 4,1,4,1,5,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,7,1, + 7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1, + 9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1, + 10,1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1, + 11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1, + 13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1, + 14,1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1, + 16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1, + 17,1,17,1,17,1,17,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,20,1,20,1,20,1,20,1,20,1,20,1,20,1, + 20,1,20,1,21,1,21,1,21,1,21,1,21,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,22,1,23,1,23,1, + 23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1, + 24,1,24,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,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, + 27,1,28,1,28,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,30,1,30,1,30,1,30,1,31,1,31,1,31,1,31,1,31,1,31,1, + 32,1,32,1,32,1,32,1,32,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1, + 33,1,33,1,34,1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1, + 35,1,35,1,35,1,35,1,35,1,35,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,38,1,38,1,38,1, + 38,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,40,1, + 40,1,40,1,40,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,42,1, + 42,1,42,1,42,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,44,1,44,1,44,1,44,1,44,1,44,1,44,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,47,1,47,1,48,1,48,1,48,1,48,1, + 48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,49,1,50,1,50,1,50,1, + 50,1,50,1,50,1,51,1,51,1,51,1,51,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,52,1,52,1,53,1,53,1,53,1,53,1, + 53,1,53,1,53,1,53,1,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,1,55,1,55,1,55,1,55,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,57,1, + 57,1,57,1,57,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,60,1,61,1,61,1,61,1,62,1,62,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, + 64,1,64,1,64,1,65,1,65,1,65,1,65,1,65,1,66,1,66,1,66,1,66,1,66,1, + 66,1,66,1,66,1,66,1,66,1,66,1,67,1,67,1,67,1,67,1,67,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,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,71,1,71,1, + 71,1,72,1,72,1,72,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,74,1,74,1, + 74,1,75,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,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,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,80,1,80,1,81,1,81,1, + 81,1,81,1,81,1,81,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,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,85,1,85,1,85,1,85,1,85,1,85,1,85,1,85,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,86,1, + 86,1,86,1,87,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,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,92,1,92,1, + 92,1,92,1,92,1,92,1,93,1,93,1,93,1,93,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,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,99,1,100,1,100,1,100,1,100,1,100,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,103,1,104,1,104,1,104, + 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,1,105,1,106,1,106,1,106,1,106,1,106,1,107, + 1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107, + 1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108,1,108, + 1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,109,1,110, + 1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110, + 1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,111,1,112,1,112, + 1,112,1,112,1,112,1,113,1,113,1,113,1,113,1,113,1,113,1,113,1,113, + 1,113,1,113,1,113,1,113,1,113,1,114,1,114,1,114,1,114,1,114,1,114, + 1,114,1,114,1,114,1,114,1,114,1,114,1,115,1,115,1,115,1,115,1,115, + 1,115,1,115,1,115,1,115,1,115,1,115,1,115,1,116,1,116,1,116,1,116, + 1,116,1,117,1,117,1,117,1,117,1,117,1,117,1,117,1,117,1,118,1,118, + 1,118,1,118,1,118,1,119,1,119,1,119,1,119,1,119,1,119,1,119,1,119, + 1,119,1,119,1,119,1,119,1,119,1,120,1,120,1,120,1,120,1,120,1,120, 1,120,1,120,1,121,1,121,1,121,1,121,1,121,1,121,1,121,1,121,1,121, - 1,121,1,121,1,121,1,121,1,121,1,122,1,122,1,122,1,122,1,122,1,122, - 1,122,1,122,1,122,1,123,1,123,1,123,1,123,1,123,1,124,1,124,1,124, - 1,124,1,124,1,124,1,124,1,125,1,125,1,125,1,125,1,125,1,126,1,126, - 1,126,1,126,1,126,1,126,1,127,1,127,1,127,1,127,1,127,1,127,1,127, - 1,128,1,128,1,128,1,128,1,128,1,128,1,129,1,129,1,129,1,129,1,129, - 1,129,1,130,1,130,1,130,1,130,1,130,1,130,1,130,1,131,1,131,1,131, - 1,131,1,131,1,131,1,131,1,132,1,132,1,132,1,132,1,132,1,132,1,132, - 1,133,1,133,1,133,1,133,1,133,1,134,1,134,1,134,1,134,1,134,1,134, - 1,135,1,135,1,135,1,135,1,135,1,136,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,144,1,144,1,145,1,145,1,146,1,146,1,147,1,147,1,148,1,148,1,149, - 1,149,1,150,1,150,1,151,3,151,1424,8,151,1,151,4,151,1427,8,151, - 11,151,12,151,1428,1,152,3,152,1432,8,152,1,152,1,152,1,152,5,152, - 1437,8,152,10,152,12,152,1440,9,152,3,152,1442,8,152,1,152,1,152, - 4,152,1446,8,152,11,152,12,152,1447,3,152,1450,8,152,1,152,1,152, - 3,152,1454,8,152,1,152,4,152,1457,8,152,11,152,12,152,1458,3,152, - 1461,8,152,1,153,1,153,5,153,1465,8,153,10,153,12,153,1468,9,153, - 1,154,1,154,1,154,5,154,1473,8,154,10,154,12,154,1476,9,154,1,154, - 1,154,1,155,1,155,1,155,1,155,1,155,1,155,1,155,1,155,3,155,1488, - 8,155,1,156,1,156,1,157,1,157,1,157,1,157,5,157,1496,8,157,10,157, - 12,157,1499,9,157,1,157,1,157,1,158,1,158,1,158,1,158,5,158,1507, - 8,158,10,158,12,158,1510,9,158,1,158,1,158,1,158,1,158,1,158,1,159, - 4,159,1518,8,159,11,159,12,159,1519,1,159,1,159,1,1508,0,160,1,1, - 3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13,27,14, - 29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,47,24,49,25, - 51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,69,35,71,36, - 73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45,91,46,93,47, - 95,48,97,49,99,50,101,51,103,52,105,53,107,54,109,55,111,56,113, - 57,115,58,117,59,119,60,121,61,123,62,125,63,127,64,129,65,131,66, - 133,67,135,68,137,69,139,70,141,71,143,72,145,73,147,74,149,75,151, - 76,153,77,155,78,157,79,159,80,161,81,163,82,165,83,167,84,169,85, - 171,86,173,87,175,88,177,89,179,90,181,91,183,92,185,93,187,94,189, - 95,191,96,193,97,195,98,197,99,199,100,201,101,203,102,205,103,207, - 104,209,105,211,106,213,107,215,108,217,109,219,110,221,111,223, - 112,225,113,227,114,229,115,231,116,233,117,235,118,237,119,239, - 120,241,121,243,122,245,123,247,124,249,125,251,126,253,127,255, - 128,257,129,259,130,261,131,263,132,265,133,267,134,269,135,271, - 136,273,137,275,138,277,139,279,140,281,141,283,142,285,143,287, - 144,289,145,291,146,293,147,295,148,297,149,299,150,301,151,303, - 152,305,153,307,154,309,155,311,0,313,0,315,156,317,157,319,158, + 1,122,1,122,1,122,1,122,1,122,1,122,1,122,1,122,1,122,1,122,1,122, + 1,122,1,122,1,122,1,123,1,123,1,123,1,123,1,123,1,123,1,123,1,123, + 1,123,1,124,1,124,1,124,1,124,1,124,1,125,1,125,1,125,1,125,1,125, + 1,125,1,125,1,126,1,126,1,126,1,126,1,126,1,127,1,127,1,127,1,127, + 1,127,1,127,1,128,1,128,1,128,1,128,1,128,1,128,1,128,1,129,1,129, + 1,129,1,129,1,129,1,129,1,130,1,130,1,130,1,130,1,130,1,130,1,131, + 1,131,1,131,1,131,1,131,1,131,1,131,1,132,1,132,1,132,1,132,1,132, + 1,132,1,132,1,133,1,133,1,133,1,133,1,133,1,133,1,133,1,134,1,134, + 1,134,1,134,1,134,1,135,1,135,1,135,1,135,1,135,1,135,1,136,1,136, + 1,136,1,136,1,136,1,137,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,144,1,144,1,145,1,145, + 1,146,1,146,1,147,1,147,1,148,1,148,1,149,1,149,1,150,1,150,1,151, + 1,151,1,152,3,152,1433,8,152,1,152,4,152,1436,8,152,11,152,12,152, + 1437,1,153,3,153,1441,8,153,1,153,1,153,1,153,5,153,1446,8,153,10, + 153,12,153,1449,9,153,3,153,1451,8,153,1,153,1,153,4,153,1455,8, + 153,11,153,12,153,1456,3,153,1459,8,153,1,153,1,153,3,153,1463,8, + 153,1,153,4,153,1466,8,153,11,153,12,153,1467,3,153,1470,8,153,1, + 154,1,154,5,154,1474,8,154,10,154,12,154,1477,9,154,1,155,1,155, + 1,155,5,155,1482,8,155,10,155,12,155,1485,9,155,1,155,1,155,1,156, + 1,156,1,156,1,156,1,156,1,156,1,156,1,156,3,156,1497,8,156,1,157, + 1,157,1,158,1,158,1,158,1,158,5,158,1505,8,158,10,158,12,158,1508, + 9,158,1,158,1,158,1,159,1,159,1,159,1,159,5,159,1516,8,159,10,159, + 12,159,1519,9,159,1,159,1,159,1,159,1,159,1,159,1,160,4,160,1527, + 8,160,11,160,12,160,1528,1,160,1,160,1,1517,0,161,1,1,3,2,5,3,7, + 4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13,27,14,29,15,31, + 16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,47,24,49,25,51,26,53, + 27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,69,35,71,36,73,37,75, + 38,77,39,79,40,81,41,83,42,85,43,87,44,89,45,91,46,93,47,95,48,97, + 49,99,50,101,51,103,52,105,53,107,54,109,55,111,56,113,57,115,58, + 117,59,119,60,121,61,123,62,125,63,127,64,129,65,131,66,133,67,135, + 68,137,69,139,70,141,71,143,72,145,73,147,74,149,75,151,76,153,77, + 155,78,157,79,159,80,161,81,163,82,165,83,167,84,169,85,171,86,173, + 87,175,88,177,89,179,90,181,91,183,92,185,93,187,94,189,95,191,96, + 193,97,195,98,197,99,199,100,201,101,203,102,205,103,207,104,209, + 105,211,106,213,107,215,108,217,109,219,110,221,111,223,112,225, + 113,227,114,229,115,231,116,233,117,235,118,237,119,239,120,241, + 121,243,122,245,123,247,124,249,125,251,126,253,127,255,128,257, + 129,259,130,261,131,263,132,265,133,267,134,269,135,271,136,273, + 137,275,138,277,139,279,140,281,141,283,142,285,143,287,144,289, + 145,291,146,293,147,295,148,297,149,299,150,301,151,303,152,305, + 153,307,154,309,155,311,156,313,0,315,0,317,157,319,158,321,159, 1,0,11,1,0,48,57,1,0,49,57,2,0,69,69,101,101,2,0,43,43,45,45,3,0, 65,90,95,95,97,122,4,0,48,57,65,90,95,95,97,122,4,0,10,10,13,13, 34,34,92,92,8,0,34,34,47,47,92,92,98,98,102,102,110,110,114,114, 116,116,3,0,48,57,65,70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32, - 32,1537,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0, + 32,1546,0,1,1,0,0,0,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, @@ -456,389 +458,392 @@ export class QuixosCapabilityLexer extends antlr.Lexer { 275,1,0,0,0,0,277,1,0,0,0,0,279,1,0,0,0,0,281,1,0,0,0,0,283,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,315,1, - 0,0,0,0,317,1,0,0,0,0,319,1,0,0,0,1,321,1,0,0,0,3,326,1,0,0,0,5, - 333,1,0,0,0,7,342,1,0,0,0,9,355,1,0,0,0,11,363,1,0,0,0,13,367,1, - 0,0,0,15,376,1,0,0,0,17,384,1,0,0,0,19,393,1,0,0,0,21,404,1,0,0, - 0,23,414,1,0,0,0,25,424,1,0,0,0,27,433,1,0,0,0,29,445,1,0,0,0,31, - 452,1,0,0,0,33,460,1,0,0,0,35,469,1,0,0,0,37,477,1,0,0,0,39,483, - 1,0,0,0,41,488,1,0,0,0,43,501,1,0,0,0,45,511,1,0,0,0,47,523,1,0, - 0,0,49,529,1,0,0,0,51,540,1,0,0,0,53,551,1,0,0,0,55,556,1,0,0,0, - 57,565,1,0,0,0,59,575,1,0,0,0,61,580,1,0,0,0,63,584,1,0,0,0,65,590, - 1,0,0,0,67,595,1,0,0,0,69,605,1,0,0,0,71,609,1,0,0,0,73,622,1,0, - 0,0,75,627,1,0,0,0,77,634,1,0,0,0,79,643,1,0,0,0,81,654,1,0,0,0, - 83,658,1,0,0,0,85,667,1,0,0,0,87,674,1,0,0,0,89,683,1,0,0,0,91,688, - 1,0,0,0,93,698,1,0,0,0,95,709,1,0,0,0,97,717,1,0,0,0,99,723,1,0, - 0,0,101,729,1,0,0,0,103,738,1,0,0,0,105,748,1,0,0,0,107,757,1,0, - 0,0,109,769,1,0,0,0,111,780,1,0,0,0,113,786,1,0,0,0,115,794,1,0, - 0,0,117,797,1,0,0,0,119,802,1,0,0,0,121,809,1,0,0,0,123,812,1,0, - 0,0,125,820,1,0,0,0,127,827,1,0,0,0,129,833,1,0,0,0,131,838,1,0, - 0,0,133,849,1,0,0,0,135,854,1,0,0,0,137,860,1,0,0,0,139,867,1,0, - 0,0,141,871,1,0,0,0,143,883,1,0,0,0,145,886,1,0,0,0,147,893,1,0, - 0,0,149,896,1,0,0,0,151,903,1,0,0,0,153,911,1,0,0,0,155,918,1,0, - 0,0,157,929,1,0,0,0,159,936,1,0,0,0,161,945,1,0,0,0,163,960,1,0, - 0,0,165,970,1,0,0,0,167,980,1,0,0,0,169,988,1,0,0,0,171,1001,1,0, - 0,0,173,1014,1,0,0,0,175,1020,1,0,0,0,177,1037,1,0,0,0,179,1040, - 1,0,0,0,181,1044,1,0,0,0,183,1049,1,0,0,0,185,1055,1,0,0,0,187,1064, - 1,0,0,0,189,1073,1,0,0,0,191,1077,1,0,0,0,193,1081,1,0,0,0,195,1085, - 1,0,0,0,197,1091,1,0,0,0,199,1097,1,0,0,0,201,1102,1,0,0,0,203,1107, - 1,0,0,0,205,1113,1,0,0,0,207,1121,1,0,0,0,209,1129,1,0,0,0,211,1140, - 1,0,0,0,213,1145,1,0,0,0,215,1157,1,0,0,0,217,1168,1,0,0,0,219,1178, - 1,0,0,0,221,1190,1,0,0,0,223,1199,1,0,0,0,225,1204,1,0,0,0,227,1217, - 1,0,0,0,229,1229,1,0,0,0,231,1241,1,0,0,0,233,1246,1,0,0,0,235,1254, - 1,0,0,0,237,1259,1,0,0,0,239,1272,1,0,0,0,241,1280,1,0,0,0,243,1289, - 1,0,0,0,245,1303,1,0,0,0,247,1312,1,0,0,0,249,1317,1,0,0,0,251,1324, - 1,0,0,0,253,1329,1,0,0,0,255,1335,1,0,0,0,257,1342,1,0,0,0,259,1348, - 1,0,0,0,261,1354,1,0,0,0,263,1361,1,0,0,0,265,1368,1,0,0,0,267,1375, - 1,0,0,0,269,1380,1,0,0,0,271,1386,1,0,0,0,273,1391,1,0,0,0,275,1394, - 1,0,0,0,277,1396,1,0,0,0,279,1398,1,0,0,0,281,1400,1,0,0,0,283,1402, - 1,0,0,0,285,1404,1,0,0,0,287,1406,1,0,0,0,289,1408,1,0,0,0,291,1410, - 1,0,0,0,293,1412,1,0,0,0,295,1414,1,0,0,0,297,1416,1,0,0,0,299,1418, - 1,0,0,0,301,1420,1,0,0,0,303,1423,1,0,0,0,305,1431,1,0,0,0,307,1462, - 1,0,0,0,309,1469,1,0,0,0,311,1479,1,0,0,0,313,1489,1,0,0,0,315,1491, - 1,0,0,0,317,1502,1,0,0,0,319,1517,1,0,0,0,321,322,5,101,0,0,322, - 323,5,100,0,0,323,324,5,105,0,0,324,325,5,116,0,0,325,2,1,0,0,0, - 326,327,5,109,0,0,327,328,5,111,0,0,328,329,5,100,0,0,329,330,5, - 117,0,0,330,331,5,108,0,0,331,332,5,101,0,0,332,4,1,0,0,0,333,334, - 5,99,0,0,334,335,5,111,0,0,335,336,5,110,0,0,336,337,5,116,0,0,337, - 338,5,114,0,0,338,339,5,97,0,0,339,340,5,99,0,0,340,341,5,116,0, - 0,341,6,1,0,0,0,342,343,5,112,0,0,343,344,5,114,0,0,344,345,5,101, - 0,0,345,346,5,115,0,0,346,347,5,101,0,0,347,348,5,110,0,0,348,349, - 5,116,0,0,349,350,5,97,0,0,350,351,5,116,0,0,351,352,5,105,0,0,352, - 353,5,111,0,0,353,354,5,110,0,0,354,8,1,0,0,0,355,356,5,115,0,0, - 356,357,5,117,0,0,357,358,5,98,0,0,358,359,5,106,0,0,359,360,5,101, - 0,0,360,361,5,99,0,0,361,362,5,116,0,0,362,10,1,0,0,0,363,364,5, - 102,0,0,364,365,5,111,0,0,365,366,5,114,0,0,366,12,1,0,0,0,367,368, - 5,99,0,0,368,369,5,114,0,0,369,370,5,101,0,0,370,371,5,97,0,0,371, - 372,5,116,0,0,372,373,5,105,0,0,373,374,5,111,0,0,374,375,5,110, - 0,0,375,14,1,0,0,0,376,377,5,118,0,0,377,378,5,97,0,0,378,379,5, - 114,0,0,379,380,5,105,0,0,380,381,5,97,0,0,381,382,5,110,0,0,382, - 383,5,116,0,0,383,16,1,0,0,0,384,385,5,112,0,0,385,386,5,114,0,0, - 386,387,5,101,0,0,387,388,5,112,0,0,388,389,5,97,0,0,389,390,5,114, - 0,0,390,391,5,101,0,0,391,392,5,115,0,0,392,18,1,0,0,0,393,394,5, - 105,0,0,394,395,5,110,0,0,395,396,5,105,0,0,396,397,5,116,0,0,397, - 398,5,105,0,0,398,399,5,97,0,0,399,400,5,108,0,0,400,401,5,105,0, - 0,401,402,5,122,0,0,402,403,5,101,0,0,403,20,1,0,0,0,404,405,5,119, - 0,0,405,406,5,111,0,0,406,407,5,114,0,0,407,408,5,107,0,0,408,409, - 5,115,0,0,409,410,5,112,0,0,410,411,5,97,0,0,411,412,5,99,0,0,412, - 413,5,101,0,0,413,22,1,0,0,0,414,415,5,101,0,0,415,416,5,120,0,0, - 416,417,5,101,0,0,417,418,5,99,0,0,418,419,5,117,0,0,419,420,5,116, - 0,0,420,421,5,105,0,0,421,422,5,111,0,0,422,423,5,110,0,0,423,24, - 1,0,0,0,424,425,5,115,0,0,425,426,5,110,0,0,426,427,5,97,0,0,427, - 428,5,112,0,0,428,429,5,115,0,0,429,430,5,104,0,0,430,431,5,111, - 0,0,431,432,5,116,0,0,432,26,1,0,0,0,433,434,5,116,0,0,434,435,5, - 114,0,0,435,436,5,97,0,0,436,437,5,110,0,0,437,438,5,115,0,0,438, - 439,5,97,0,0,439,440,5,99,0,0,440,441,5,116,0,0,441,442,5,105,0, - 0,442,443,5,111,0,0,443,444,5,110,0,0,444,28,1,0,0,0,445,446,5,114, - 0,0,446,447,5,101,0,0,447,448,5,109,0,0,448,449,5,111,0,0,449,450, - 5,116,0,0,450,451,5,101,0,0,451,30,1,0,0,0,452,453,5,116,0,0,453, - 454,5,97,0,0,454,455,5,114,0,0,455,456,5,103,0,0,456,457,5,101,0, - 0,457,458,5,116,0,0,458,459,5,115,0,0,459,32,1,0,0,0,460,461,5,112, - 0,0,461,462,5,111,0,0,462,463,5,114,0,0,463,464,5,116,0,0,464,465, - 5,97,0,0,465,466,5,98,0,0,466,467,5,108,0,0,467,468,5,101,0,0,468, - 34,1,0,0,0,469,470,5,114,0,0,470,471,5,101,0,0,471,472,5,112,0,0, - 472,473,5,108,0,0,473,474,5,105,0,0,474,475,5,99,0,0,475,476,5,97, - 0,0,476,36,1,0,0,0,477,478,5,108,0,0,478,479,5,111,0,0,479,480,5, - 99,0,0,480,481,5,97,0,0,481,482,5,108,0,0,482,38,1,0,0,0,483,484, - 5,102,0,0,484,485,5,114,0,0,485,486,5,111,0,0,486,487,5,109,0,0, - 487,40,1,0,0,0,488,489,5,114,0,0,489,490,5,101,0,0,490,491,5,115, - 0,0,491,492,5,117,0,0,492,493,5,108,0,0,493,494,5,116,0,0,494,495, - 5,45,0,0,495,496,5,98,0,0,496,497,5,121,0,0,497,498,5,116,0,0,498, - 499,5,101,0,0,499,500,5,115,0,0,500,42,1,0,0,0,501,502,5,114,0,0, - 502,503,5,112,0,0,503,504,5,99,0,0,504,505,5,45,0,0,505,506,5,99, - 0,0,506,507,5,97,0,0,507,508,5,108,0,0,508,509,5,108,0,0,509,510, - 5,115,0,0,510,44,1,0,0,0,511,512,5,100,0,0,512,513,5,101,0,0,513, - 514,5,97,0,0,514,515,5,100,0,0,515,516,5,108,0,0,516,517,5,105,0, - 0,517,518,5,110,0,0,518,519,5,101,0,0,519,520,5,45,0,0,520,521,5, - 109,0,0,521,522,5,115,0,0,522,46,1,0,0,0,523,524,5,113,0,0,524,525, - 5,117,0,0,525,526,5,101,0,0,526,527,5,114,0,0,527,528,5,121,0,0, - 528,48,1,0,0,0,529,530,5,114,0,0,530,531,5,101,0,0,531,532,5,102, - 0,0,532,533,5,108,0,0,533,534,5,101,0,0,534,535,5,99,0,0,535,536, - 5,116,0,0,536,537,5,105,0,0,537,538,5,111,0,0,538,539,5,110,0,0, - 539,50,1,0,0,0,540,541,5,115,0,0,541,542,5,112,0,0,542,543,5,101, - 0,0,543,544,5,99,0,0,544,545,5,105,0,0,545,546,5,97,0,0,546,547, - 5,108,0,0,547,548,5,105,0,0,548,549,5,122,0,0,549,550,5,101,0,0, - 550,52,1,0,0,0,551,552,5,114,0,0,552,553,5,111,0,0,553,554,5,111, - 0,0,554,555,5,116,0,0,555,54,1,0,0,0,556,557,5,100,0,0,557,558,5, - 111,0,0,558,559,5,99,0,0,559,560,5,117,0,0,560,561,5,109,0,0,561, - 562,5,101,0,0,562,563,5,110,0,0,563,564,5,116,0,0,564,56,1,0,0,0, - 565,566,5,102,0,0,566,567,5,114,0,0,567,568,5,97,0,0,568,569,5,103, - 0,0,569,570,5,109,0,0,570,571,5,101,0,0,571,572,5,110,0,0,572,573, - 5,116,0,0,573,574,5,115,0,0,574,58,1,0,0,0,575,576,5,118,0,0,576, - 577,5,105,0,0,577,578,5,101,0,0,578,579,5,119,0,0,579,60,1,0,0,0, - 580,581,5,109,0,0,581,582,5,97,0,0,582,583,5,120,0,0,583,62,1,0, - 0,0,584,585,5,97,0,0,585,586,5,108,0,0,586,587,5,108,0,0,587,588, - 5,111,0,0,588,589,5,119,0,0,589,64,1,0,0,0,590,591,5,112,0,0,591, - 592,5,111,0,0,592,593,5,108,0,0,593,594,5,108,0,0,594,66,1,0,0,0, - 595,596,5,113,0,0,596,597,5,117,0,0,597,598,5,101,0,0,598,599,5, - 114,0,0,599,600,5,121,0,0,600,601,5,97,0,0,601,602,5,98,0,0,602, - 603,5,108,0,0,603,604,5,101,0,0,604,68,1,0,0,0,605,606,5,114,0,0, - 606,607,5,112,0,0,607,608,5,99,0,0,608,70,1,0,0,0,609,610,5,113, - 0,0,610,611,5,117,0,0,611,612,5,101,0,0,612,613,5,114,0,0,613,614, - 5,121,0,0,614,615,5,45,0,0,615,616,5,114,0,0,616,617,5,101,0,0,617, - 618,5,97,0,0,618,619,5,115,0,0,619,620,5,111,0,0,620,621,5,110,0, - 0,621,72,1,0,0,0,622,623,5,116,0,0,623,624,5,121,0,0,624,625,5,112, - 0,0,625,626,5,101,0,0,626,74,1,0,0,0,627,628,5,111,0,0,628,629,5, - 98,0,0,629,630,5,106,0,0,630,631,5,101,0,0,631,632,5,99,0,0,632, - 633,5,116,0,0,633,76,1,0,0,0,634,635,5,115,0,0,635,636,5,116,0,0, - 636,637,5,111,0,0,637,638,5,114,0,0,638,639,5,97,0,0,639,640,5,98, - 0,0,640,641,5,108,0,0,641,642,5,101,0,0,642,78,1,0,0,0,643,644,5, - 105,0,0,644,645,5,109,0,0,645,646,5,112,0,0,646,647,5,108,0,0,647, - 648,5,101,0,0,648,649,5,109,0,0,649,650,5,101,0,0,650,651,5,110, - 0,0,651,652,5,116,0,0,652,653,5,115,0,0,653,80,1,0,0,0,654,655,5, - 114,0,0,655,656,5,101,0,0,656,657,5,102,0,0,657,82,1,0,0,0,658,659, - 5,102,0,0,659,660,5,114,0,0,660,661,5,97,0,0,661,662,5,103,0,0,662, - 663,5,109,0,0,663,664,5,101,0,0,664,665,5,110,0,0,665,666,5,116, - 0,0,666,84,1,0,0,0,667,668,5,105,0,0,668,669,5,109,0,0,669,670,5, - 112,0,0,670,671,5,111,0,0,671,672,5,114,0,0,672,673,5,116,0,0,673, - 86,1,0,0,0,674,675,5,101,0,0,675,676,5,120,0,0,676,677,5,116,0,0, - 677,678,5,101,0,0,678,679,5,114,0,0,679,680,5,110,0,0,680,681,5, - 97,0,0,681,682,5,108,0,0,682,88,1,0,0,0,683,684,5,97,0,0,684,685, - 5,116,0,0,685,686,5,111,0,0,686,687,5,109,0,0,687,90,1,0,0,0,688, - 689,5,105,0,0,689,690,5,110,0,0,690,691,5,116,0,0,691,692,5,101, - 0,0,692,693,5,114,0,0,693,694,5,102,0,0,694,695,5,97,0,0,695,696, - 5,99,0,0,696,697,5,101,0,0,697,92,1,0,0,0,698,699,5,105,0,0,699, - 700,5,110,0,0,700,701,5,116,0,0,701,702,5,101,0,0,702,703,5,114, - 0,0,703,704,5,102,0,0,704,705,5,97,0,0,705,706,5,99,0,0,706,707, - 5,101,0,0,707,708,5,115,0,0,708,94,1,0,0,0,709,710,5,112,0,0,710, - 711,5,97,0,0,711,712,5,99,0,0,712,713,5,107,0,0,713,714,5,97,0,0, - 714,715,5,103,0,0,715,716,5,101,0,0,716,96,1,0,0,0,717,718,5,118, - 0,0,718,719,5,97,0,0,719,720,5,108,0,0,720,721,5,117,0,0,721,722, - 5,101,0,0,722,98,1,0,0,0,723,724,5,102,0,0,724,725,5,105,0,0,725, - 726,5,101,0,0,726,727,5,108,0,0,727,728,5,100,0,0,728,100,1,0,0, - 0,729,730,5,114,0,0,730,731,5,101,0,0,731,732,5,108,0,0,732,733, - 5,97,0,0,733,734,5,116,0,0,734,735,5,105,0,0,735,736,5,111,0,0,736, - 737,5,110,0,0,737,102,1,0,0,0,738,739,5,111,0,0,739,740,5,112,0, - 0,740,741,5,101,0,0,741,742,5,114,0,0,742,743,5,97,0,0,743,744,5, - 116,0,0,744,745,5,105,0,0,745,746,5,111,0,0,746,747,5,110,0,0,747, - 104,1,0,0,0,748,749,5,102,0,0,749,750,5,117,0,0,750,751,5,110,0, - 0,751,752,5,99,0,0,752,753,5,116,0,0,753,754,5,105,0,0,754,755,5, - 111,0,0,755,756,5,110,0,0,756,106,1,0,0,0,757,758,5,99,0,0,758,759, - 5,111,0,0,759,760,5,110,0,0,760,761,5,115,0,0,761,762,5,116,0,0, - 762,763,5,114,0,0,763,764,5,117,0,0,764,765,5,99,0,0,765,766,5,116, - 0,0,766,767,5,111,0,0,767,768,5,114,0,0,768,108,1,0,0,0,769,770, - 5,99,0,0,770,771,5,111,0,0,771,772,5,110,0,0,772,773,5,115,0,0,773, - 774,5,116,0,0,774,775,5,114,0,0,775,776,5,117,0,0,776,777,5,99,0, - 0,777,778,5,116,0,0,778,779,5,115,0,0,779,110,1,0,0,0,780,781,5, - 105,0,0,781,782,5,110,0,0,782,783,5,112,0,0,783,784,5,117,0,0,784, - 785,5,116,0,0,785,112,1,0,0,0,786,787,5,99,0,0,787,788,5,111,0,0, - 788,789,5,110,0,0,789,790,5,102,0,0,790,791,5,111,0,0,791,792,5, - 114,0,0,792,793,5,109,0,0,793,114,1,0,0,0,794,795,5,97,0,0,795,796, - 5,115,0,0,796,116,1,0,0,0,797,798,5,98,0,0,798,799,5,105,0,0,799, - 800,5,110,0,0,800,801,5,100,0,0,801,118,1,0,0,0,802,803,5,115,0, - 0,803,804,5,116,0,0,804,805,5,97,0,0,805,806,5,116,0,0,806,807,5, - 105,0,0,807,808,5,99,0,0,808,120,1,0,0,0,809,810,5,116,0,0,810,811, - 5,111,0,0,811,122,1,0,0,0,812,813,5,112,0,0,813,814,5,114,0,0,814, - 815,5,105,0,0,815,816,5,118,0,0,816,817,5,97,0,0,817,818,5,116,0, - 0,818,819,5,101,0,0,819,124,1,0,0,0,820,821,5,115,0,0,821,822,5, - 104,0,0,822,823,5,97,0,0,823,824,5,114,0,0,824,825,5,101,0,0,825, - 826,5,100,0,0,826,126,1,0,0,0,827,828,5,115,0,0,828,829,5,116,0, - 0,829,830,5,97,0,0,830,831,5,116,0,0,831,832,5,101,0,0,832,128,1, - 0,0,0,833,834,5,101,0,0,834,835,5,100,0,0,835,836,5,103,0,0,836, - 837,5,101,0,0,837,130,1,0,0,0,838,839,5,112,0,0,839,840,5,114,0, - 0,840,841,5,111,0,0,841,842,5,106,0,0,842,843,5,101,0,0,843,844, - 5,99,0,0,844,845,5,116,0,0,845,846,5,105,0,0,846,847,5,111,0,0,847, - 848,5,110,0,0,848,132,1,0,0,0,849,850,5,119,0,0,850,851,5,105,0, - 0,851,852,5,116,0,0,852,853,5,104,0,0,853,134,1,0,0,0,854,855,5, - 117,0,0,855,856,5,115,0,0,856,857,5,105,0,0,857,858,5,110,0,0,858, - 859,5,103,0,0,859,136,1,0,0,0,860,861,5,97,0,0,861,862,5,99,0,0, - 862,863,5,99,0,0,863,864,5,101,0,0,864,865,5,112,0,0,865,866,5,116, - 0,0,866,138,1,0,0,0,867,868,5,118,0,0,868,869,5,105,0,0,869,870, - 5,97,0,0,870,140,1,0,0,0,871,872,5,109,0,0,872,873,5,97,0,0,873, - 874,5,116,0,0,874,875,5,101,0,0,875,876,5,114,0,0,876,877,5,105, - 0,0,877,878,5,97,0,0,878,879,5,108,0,0,879,880,5,105,0,0,880,881, - 5,122,0,0,881,882,5,101,0,0,882,142,1,0,0,0,883,884,5,105,0,0,884, - 885,5,102,0,0,885,144,1,0,0,0,886,887,5,97,0,0,887,888,5,98,0,0, - 888,889,5,115,0,0,889,890,5,101,0,0,890,891,5,110,0,0,891,892,5, - 116,0,0,892,146,1,0,0,0,893,894,5,111,0,0,894,895,5,110,0,0,895, - 148,1,0,0,0,896,897,5,112,0,0,897,898,5,111,0,0,898,899,5,108,0, - 0,899,900,5,105,0,0,900,901,5,99,0,0,901,902,5,121,0,0,902,150,1, - 0,0,0,903,904,5,100,0,0,904,905,5,101,0,0,905,906,5,102,0,0,906, - 907,5,97,0,0,907,908,5,117,0,0,908,909,5,108,0,0,909,910,5,116,0, - 0,910,152,1,0,0,0,911,912,5,115,0,0,912,913,5,111,0,0,913,914,5, - 117,0,0,914,915,5,114,0,0,915,916,5,99,0,0,916,917,5,101,0,0,917, - 154,1,0,0,0,918,919,5,114,0,0,919,920,5,101,0,0,920,921,5,112,0, - 0,921,922,5,111,0,0,922,923,5,115,0,0,923,924,5,105,0,0,924,925, - 5,116,0,0,925,926,5,111,0,0,926,927,5,114,0,0,927,928,5,121,0,0, - 928,156,1,0,0,0,929,930,5,99,0,0,930,931,5,111,0,0,931,932,5,109, - 0,0,932,933,5,109,0,0,933,934,5,105,0,0,934,935,5,116,0,0,935,158, - 1,0,0,0,936,937,5,114,0,0,937,938,5,101,0,0,938,939,5,118,0,0,939, - 940,5,105,0,0,940,941,5,115,0,0,941,942,5,105,0,0,942,943,5,111, - 0,0,943,944,5,110,0,0,944,160,1,0,0,0,945,946,5,115,0,0,946,947, - 5,101,0,0,947,948,5,109,0,0,948,949,5,97,0,0,949,950,5,110,0,0,950, - 951,5,116,0,0,951,952,5,105,0,0,952,953,5,99,0,0,953,954,5,45,0, - 0,954,955,5,109,0,0,955,956,5,97,0,0,956,957,5,106,0,0,957,958,5, - 111,0,0,958,959,5,114,0,0,959,162,1,0,0,0,960,961,5,111,0,0,961, - 962,5,110,0,0,962,963,5,45,0,0,963,964,5,100,0,0,964,965,5,101,0, - 0,965,966,5,108,0,0,966,967,5,101,0,0,967,968,5,116,0,0,968,969, - 5,101,0,0,969,164,1,0,0,0,970,971,5,108,0,0,971,972,5,105,0,0,972, - 973,5,102,0,0,973,974,5,101,0,0,974,975,5,99,0,0,975,976,5,121,0, - 0,976,977,5,99,0,0,977,978,5,108,0,0,978,979,5,101,0,0,979,166,1, - 0,0,0,980,981,5,106,0,0,981,982,5,111,0,0,982,983,5,117,0,0,983, - 984,5,114,0,0,984,985,5,110,0,0,985,986,5,97,0,0,986,987,5,108,0, - 0,987,168,1,0,0,0,988,989,5,115,0,0,989,990,5,117,0,0,990,991,5, - 98,0,0,991,992,5,115,0,0,992,993,5,99,0,0,993,994,5,114,0,0,994, - 995,5,105,0,0,995,996,5,112,0,0,996,997,5,116,0,0,997,998,5,105, - 0,0,998,999,5,111,0,0,999,1000,5,110,0,0,1000,170,1,0,0,0,1001,1002, - 5,114,0,0,1002,1003,5,101,0,0,1003,1004,5,116,0,0,1004,1005,5,97, - 0,0,1005,1006,5,105,0,0,1006,1007,5,110,0,0,1007,1008,5,45,0,0,1008, - 1009,5,111,0,0,1009,1010,5,116,0,0,1010,1011,5,104,0,0,1011,1012, - 5,101,0,0,1012,1013,5,114,0,0,1013,172,1,0,0,0,1014,1015,5,107,0, - 0,1015,1016,5,101,0,0,1016,1017,5,121,0,0,1017,1018,5,101,0,0,1018, - 1019,5,100,0,0,1019,174,1,0,0,0,1020,1021,5,112,0,0,1021,1022,5, - 117,0,0,1022,1023,5,98,0,0,1023,1024,5,108,0,0,1024,1025,5,105,0, - 0,1025,1026,5,99,0,0,1026,1027,5,45,0,0,1027,1028,5,116,0,0,1028, - 1029,5,114,0,0,1029,1030,5,97,0,0,1030,1031,5,118,0,0,1031,1032, - 5,101,0,0,1032,1033,5,114,0,0,1033,1034,5,115,0,0,1034,1035,5,97, - 0,0,1035,1036,5,108,0,0,1036,176,1,0,0,0,1037,1038,5,105,0,0,1038, - 1039,5,100,0,0,1039,178,1,0,0,0,1040,1041,5,100,0,0,1041,1042,5, - 111,0,0,1042,1043,5,99,0,0,1043,180,1,0,0,0,1044,1045,5,109,0,0, - 1045,1046,5,111,0,0,1046,1047,5,100,0,0,1047,1048,5,101,0,0,1048, - 182,1,0,0,0,1049,1050,5,101,0,0,1050,1051,5,109,0,0,1051,1052,5, - 105,0,0,1052,1053,5,116,0,0,1053,1054,5,115,0,0,1054,184,1,0,0,0, - 1055,1056,5,114,0,0,1056,1057,5,101,0,0,1057,1058,5,99,0,0,1058, - 1059,5,101,0,0,1059,1060,5,105,0,0,1060,1061,5,118,0,0,1061,1062, - 5,101,0,0,1062,1063,5,114,0,0,1063,186,1,0,0,0,1064,1065,5,114,0, - 0,1065,1066,5,101,0,0,1066,1067,5,113,0,0,1067,1068,5,117,0,0,1068, - 1069,5,105,0,0,1069,1070,5,114,0,0,1070,1071,5,101,0,0,1071,1072, - 5,115,0,0,1072,188,1,0,0,0,1073,1074,5,97,0,0,1074,1075,5,110,0, - 0,1075,1076,5,121,0,0,1076,190,1,0,0,0,1077,1078,5,103,0,0,1078, - 1079,5,101,0,0,1079,1080,5,116,0,0,1080,192,1,0,0,0,1081,1082,5, - 115,0,0,1082,1083,5,101,0,0,1083,1084,5,116,0,0,1084,194,1,0,0,0, - 1085,1086,5,119,0,0,1086,1087,5,97,0,0,1087,1088,5,116,0,0,1088, - 1089,5,99,0,0,1089,1090,5,104,0,0,1090,196,1,0,0,0,1091,1092,5,115, - 0,0,1092,1093,5,116,0,0,1093,1094,5,97,0,0,1094,1095,5,114,0,0,1095, - 1096,5,116,0,0,1096,198,1,0,0,0,1097,1098,5,115,0,0,1098,1099,5, - 116,0,0,1099,1100,5,111,0,0,1100,1101,5,112,0,0,1101,200,1,0,0,0, - 1102,1103,5,114,0,0,1103,1104,5,101,0,0,1104,1105,5,97,0,0,1105, - 1106,5,100,0,0,1106,202,1,0,0,0,1107,1108,5,119,0,0,1108,1109,5, - 114,0,0,1109,1110,5,105,0,0,1110,1111,5,116,0,0,1111,1112,5,101, - 0,0,1112,204,1,0,0,0,1113,1114,5,114,0,0,1114,1115,5,101,0,0,1115, - 1116,5,115,0,0,1116,1117,5,111,0,0,1117,1118,5,108,0,0,1118,1119, - 5,118,0,0,1119,1120,5,101,0,0,1120,206,1,0,0,0,1121,1122,5,99,0, - 0,1122,1123,5,111,0,0,1123,1124,5,110,0,0,1124,1125,5,110,0,0,1125, - 1126,5,101,0,0,1126,1127,5,99,0,0,1127,1128,5,116,0,0,1128,208,1, - 0,0,0,1129,1130,5,100,0,0,1130,1131,5,105,0,0,1131,1132,5,115,0, - 0,1132,1133,5,99,0,0,1133,1134,5,111,0,0,1134,1135,5,110,0,0,1135, - 1136,5,110,0,0,1136,1137,5,101,0,0,1137,1138,5,99,0,0,1138,1139, - 5,116,0,0,1139,210,1,0,0,0,1140,1141,5,99,0,0,1141,1142,5,97,0,0, - 1142,1143,5,108,0,0,1143,1144,5,108,0,0,1144,212,1,0,0,0,1145,1146, - 5,119,0,0,1146,1147,5,97,0,0,1147,1148,5,116,0,0,1148,1149,5,99, - 0,0,1149,1150,5,104,0,0,1150,1151,5,45,0,0,1151,1152,5,115,0,0,1152, - 1153,5,116,0,0,1153,1154,5,97,0,0,1154,1155,5,114,0,0,1155,1156, - 5,116,0,0,1156,214,1,0,0,0,1157,1158,5,119,0,0,1158,1159,5,97,0, - 0,1159,1160,5,116,0,0,1160,1161,5,99,0,0,1161,1162,5,104,0,0,1162, - 1163,5,45,0,0,1163,1164,5,115,0,0,1164,1165,5,116,0,0,1165,1166, - 5,111,0,0,1166,1167,5,112,0,0,1167,216,1,0,0,0,1168,1169,5,115,0, - 0,1169,1170,5,117,0,0,1170,1171,5,98,0,0,1171,1172,5,115,0,0,1172, - 1173,5,99,0,0,1173,1174,5,114,0,0,1174,1175,5,105,0,0,1175,1176, - 5,98,0,0,1176,1177,5,101,0,0,1177,218,1,0,0,0,1178,1179,5,117,0, - 0,1179,1180,5,110,0,0,1180,1181,5,115,0,0,1181,1182,5,117,0,0,1182, - 1183,5,98,0,0,1183,1184,5,115,0,0,1184,1185,5,99,0,0,1185,1186,5, - 114,0,0,1186,1187,5,105,0,0,1187,1188,5,98,0,0,1188,1189,5,101,0, - 0,1189,220,1,0,0,0,1190,1191,5,114,0,0,1191,1192,5,101,0,0,1192, - 1193,5,103,0,0,1193,1194,5,105,0,0,1194,1195,5,115,0,0,1195,1196, - 5,116,0,0,1196,1197,5,101,0,0,1197,1198,5,114,0,0,1198,222,1,0,0, - 0,1199,1200,5,99,0,0,1200,1201,5,114,0,0,1201,1202,5,100,0,0,1202, - 1203,5,116,0,0,1203,224,1,0,0,0,1204,1205,5,111,0,0,1205,1206,5, - 112,0,0,1206,1207,5,116,0,0,1207,1208,5,105,0,0,1208,1209,5,111, - 0,0,1209,1210,5,110,0,0,1210,1211,5,97,0,0,1211,1212,5,108,0,0,1212, - 1213,5,45,0,0,1213,1214,5,111,0,0,1214,1215,5,110,0,0,1215,1216, - 5,101,0,0,1216,226,1,0,0,0,1217,1218,5,101,0,0,1218,1219,5,120,0, - 0,1219,1220,5,97,0,0,1220,1221,5,99,0,0,1221,1222,5,116,0,0,1222, - 1223,5,108,0,0,1223,1224,5,121,0,0,1224,1225,5,45,0,0,1225,1226, - 5,111,0,0,1226,1227,5,110,0,0,1227,1228,5,101,0,0,1228,228,1,0,0, - 0,1229,1230,5,109,0,0,1230,1231,5,97,0,0,1231,1232,5,110,0,0,1232, - 1233,5,121,0,0,1233,1234,5,45,0,0,1234,1235,5,117,0,0,1235,1236, - 5,110,0,0,1236,1237,5,105,0,0,1237,1238,5,113,0,0,1238,1239,5,117, - 0,0,1239,1240,5,101,0,0,1240,230,1,0,0,0,1241,1242,5,109,0,0,1242, - 1243,5,97,0,0,1243,1244,5,110,0,0,1244,1245,5,121,0,0,1245,232,1, - 0,0,0,1246,1247,5,111,0,0,1247,1248,5,114,0,0,1248,1249,5,100,0, - 0,1249,1250,5,101,0,0,1250,1251,5,114,0,0,1251,1252,5,101,0,0,1252, - 1253,5,100,0,0,1253,234,1,0,0,0,1254,1255,5,117,0,0,1255,1256,5, - 110,0,0,1256,1257,5,105,0,0,1257,1258,5,116,0,0,1258,236,1,0,0,0, - 1259,1260,5,119,0,0,1260,1261,5,97,0,0,1261,1262,5,116,0,0,1262, - 1263,5,99,0,0,1263,1264,5,104,0,0,1264,1265,5,45,0,0,1265,1266,5, - 104,0,0,1266,1267,5,97,0,0,1267,1268,5,110,0,0,1268,1269,5,100,0, - 0,1269,1270,5,108,0,0,1270,1271,5,101,0,0,1271,238,1,0,0,0,1272, - 1273,5,109,0,0,1273,1274,5,101,0,0,1274,1275,5,115,0,0,1275,1276, - 5,115,0,0,1276,1277,5,97,0,0,1277,1278,5,103,0,0,1278,1279,5,101, - 0,0,1279,240,1,0,0,0,1280,1281,5,97,0,0,1281,1282,5,116,0,0,1282, - 1283,5,111,0,0,1283,1284,5,109,0,0,1284,1285,5,45,0,0,1285,1286, - 5,114,0,0,1286,1287,5,101,0,0,1287,1288,5,102,0,0,1288,242,1,0,0, - 0,1289,1290,5,105,0,0,1290,1291,5,110,0,0,1291,1292,5,116,0,0,1292, - 1293,5,101,0,0,1293,1294,5,114,0,0,1294,1295,5,102,0,0,1295,1296, - 5,97,0,0,1296,1297,5,99,0,0,1297,1298,5,101,0,0,1298,1299,5,45,0, - 0,1299,1300,5,114,0,0,1300,1301,5,101,0,0,1301,1302,5,102,0,0,1302, - 244,1,0,0,0,1303,1304,5,111,0,0,1304,1305,5,112,0,0,1305,1306,5, - 116,0,0,1306,1307,5,105,0,0,1307,1308,5,111,0,0,1308,1309,5,110, - 0,0,1309,1310,5,97,0,0,1310,1311,5,108,0,0,1311,246,1,0,0,0,1312, - 1313,5,108,0,0,1313,1314,5,105,0,0,1314,1315,5,115,0,0,1315,1316, - 5,116,0,0,1316,248,1,0,0,0,1317,1318,5,114,0,0,1318,1319,5,101,0, - 0,1319,1320,5,99,0,0,1320,1321,5,111,0,0,1321,1322,5,114,0,0,1322, - 1323,5,100,0,0,1323,250,1,0,0,0,1324,1325,5,98,0,0,1325,1326,5,111, - 0,0,1326,1327,5,111,0,0,1327,1328,5,108,0,0,1328,252,1,0,0,0,1329, - 1330,5,98,0,0,1330,1331,5,121,0,0,1331,1332,5,116,0,0,1332,1333, - 5,101,0,0,1333,1334,5,115,0,0,1334,254,1,0,0,0,1335,1336,5,100,0, - 0,1336,1337,5,111,0,0,1337,1338,5,117,0,0,1338,1339,5,98,0,0,1339, - 1340,5,108,0,0,1340,1341,5,101,0,0,1341,256,1,0,0,0,1342,1343,5, - 105,0,0,1343,1344,5,110,0,0,1344,1345,5,116,0,0,1345,1346,5,51,0, - 0,1346,1347,5,50,0,0,1347,258,1,0,0,0,1348,1349,5,105,0,0,1349,1350, - 5,110,0,0,1350,1351,5,116,0,0,1351,1352,5,54,0,0,1352,1353,5,52, - 0,0,1353,260,1,0,0,0,1354,1355,5,115,0,0,1355,1356,5,116,0,0,1356, - 1357,5,114,0,0,1357,1358,5,105,0,0,1358,1359,5,110,0,0,1359,1360, - 5,103,0,0,1360,262,1,0,0,0,1361,1362,5,117,0,0,1362,1363,5,105,0, - 0,1363,1364,5,110,0,0,1364,1365,5,116,0,0,1365,1366,5,51,0,0,1366, - 1367,5,50,0,0,1367,264,1,0,0,0,1368,1369,5,117,0,0,1369,1370,5,105, - 0,0,1370,1371,5,110,0,0,1371,1372,5,116,0,0,1372,1373,5,54,0,0,1373, - 1374,5,52,0,0,1374,266,1,0,0,0,1375,1376,5,116,0,0,1376,1377,5,114, - 0,0,1377,1378,5,117,0,0,1378,1379,5,101,0,0,1379,268,1,0,0,0,1380, - 1381,5,102,0,0,1381,1382,5,97,0,0,1382,1383,5,108,0,0,1383,1384, - 5,115,0,0,1384,1385,5,101,0,0,1385,270,1,0,0,0,1386,1387,5,110,0, - 0,1387,1388,5,117,0,0,1388,1389,5,108,0,0,1389,1390,5,108,0,0,1390, - 272,1,0,0,0,1391,1392,5,45,0,0,1392,1393,5,62,0,0,1393,274,1,0,0, - 0,1394,1395,5,58,0,0,1395,276,1,0,0,0,1396,1397,5,59,0,0,1397,278, - 1,0,0,0,1398,1399,5,44,0,0,1399,280,1,0,0,0,1400,1401,5,46,0,0,1401, - 282,1,0,0,0,1402,1403,5,123,0,0,1403,284,1,0,0,0,1404,1405,5,125, - 0,0,1405,286,1,0,0,0,1406,1407,5,91,0,0,1407,288,1,0,0,0,1408,1409, - 5,93,0,0,1409,290,1,0,0,0,1410,1411,5,40,0,0,1411,292,1,0,0,0,1412, - 1413,5,41,0,0,1413,294,1,0,0,0,1414,1415,5,60,0,0,1415,296,1,0,0, - 0,1416,1417,5,62,0,0,1417,298,1,0,0,0,1418,1419,5,38,0,0,1419,300, - 1,0,0,0,1420,1421,5,61,0,0,1421,302,1,0,0,0,1422,1424,5,45,0,0,1423, - 1422,1,0,0,0,1423,1424,1,0,0,0,1424,1426,1,0,0,0,1425,1427,7,0,0, - 0,1426,1425,1,0,0,0,1427,1428,1,0,0,0,1428,1426,1,0,0,0,1428,1429, - 1,0,0,0,1429,304,1,0,0,0,1430,1432,5,45,0,0,1431,1430,1,0,0,0,1431, - 1432,1,0,0,0,1432,1441,1,0,0,0,1433,1442,5,48,0,0,1434,1438,7,1, - 0,0,1435,1437,7,0,0,0,1436,1435,1,0,0,0,1437,1440,1,0,0,0,1438,1436, - 1,0,0,0,1438,1439,1,0,0,0,1439,1442,1,0,0,0,1440,1438,1,0,0,0,1441, - 1433,1,0,0,0,1441,1434,1,0,0,0,1442,1449,1,0,0,0,1443,1445,5,46, - 0,0,1444,1446,7,0,0,0,1445,1444,1,0,0,0,1446,1447,1,0,0,0,1447,1445, - 1,0,0,0,1447,1448,1,0,0,0,1448,1450,1,0,0,0,1449,1443,1,0,0,0,1449, - 1450,1,0,0,0,1450,1460,1,0,0,0,1451,1453,7,2,0,0,1452,1454,7,3,0, - 0,1453,1452,1,0,0,0,1453,1454,1,0,0,0,1454,1456,1,0,0,0,1455,1457, - 7,0,0,0,1456,1455,1,0,0,0,1457,1458,1,0,0,0,1458,1456,1,0,0,0,1458, - 1459,1,0,0,0,1459,1461,1,0,0,0,1460,1451,1,0,0,0,1460,1461,1,0,0, - 0,1461,306,1,0,0,0,1462,1466,7,4,0,0,1463,1465,7,5,0,0,1464,1463, - 1,0,0,0,1465,1468,1,0,0,0,1466,1464,1,0,0,0,1466,1467,1,0,0,0,1467, - 308,1,0,0,0,1468,1466,1,0,0,0,1469,1474,5,34,0,0,1470,1473,3,311, - 155,0,1471,1473,8,6,0,0,1472,1470,1,0,0,0,1472,1471,1,0,0,0,1473, - 1476,1,0,0,0,1474,1472,1,0,0,0,1474,1475,1,0,0,0,1475,1477,1,0,0, - 0,1476,1474,1,0,0,0,1477,1478,5,34,0,0,1478,310,1,0,0,0,1479,1487, - 5,92,0,0,1480,1488,7,7,0,0,1481,1482,5,117,0,0,1482,1483,3,313,156, - 0,1483,1484,3,313,156,0,1484,1485,3,313,156,0,1485,1486,3,313,156, - 0,1486,1488,1,0,0,0,1487,1480,1,0,0,0,1487,1481,1,0,0,0,1488,312, - 1,0,0,0,1489,1490,7,8,0,0,1490,314,1,0,0,0,1491,1492,5,47,0,0,1492, - 1493,5,47,0,0,1493,1497,1,0,0,0,1494,1496,8,9,0,0,1495,1494,1,0, - 0,0,1496,1499,1,0,0,0,1497,1495,1,0,0,0,1497,1498,1,0,0,0,1498,1500, - 1,0,0,0,1499,1497,1,0,0,0,1500,1501,6,157,0,0,1501,316,1,0,0,0,1502, - 1503,5,47,0,0,1503,1504,5,42,0,0,1504,1508,1,0,0,0,1505,1507,9,0, - 0,0,1506,1505,1,0,0,0,1507,1510,1,0,0,0,1508,1509,1,0,0,0,1508,1506, - 1,0,0,0,1509,1511,1,0,0,0,1510,1508,1,0,0,0,1511,1512,5,42,0,0,1512, - 1513,5,47,0,0,1513,1514,1,0,0,0,1514,1515,6,158,0,0,1515,318,1,0, - 0,0,1516,1518,7,10,0,0,1517,1516,1,0,0,0,1518,1519,1,0,0,0,1519, - 1517,1,0,0,0,1519,1520,1,0,0,0,1520,1521,1,0,0,0,1521,1522,6,159, - 0,0,1522,320,1,0,0,0,18,0,1423,1428,1431,1438,1441,1447,1449,1453, - 1458,1460,1466,1472,1474,1487,1497,1508,1519,1,0,1,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,317,1,0,0,0,0,319,1,0,0,0,0,321,1,0,0,0,1,323,1,0,0,0,3, + 328,1,0,0,0,5,335,1,0,0,0,7,344,1,0,0,0,9,357,1,0,0,0,11,365,1,0, + 0,0,13,369,1,0,0,0,15,378,1,0,0,0,17,386,1,0,0,0,19,395,1,0,0,0, + 21,406,1,0,0,0,23,416,1,0,0,0,25,426,1,0,0,0,27,435,1,0,0,0,29,447, + 1,0,0,0,31,454,1,0,0,0,33,462,1,0,0,0,35,471,1,0,0,0,37,479,1,0, + 0,0,39,485,1,0,0,0,41,490,1,0,0,0,43,503,1,0,0,0,45,513,1,0,0,0, + 47,525,1,0,0,0,49,531,1,0,0,0,51,542,1,0,0,0,53,553,1,0,0,0,55,558, + 1,0,0,0,57,567,1,0,0,0,59,577,1,0,0,0,61,582,1,0,0,0,63,586,1,0, + 0,0,65,592,1,0,0,0,67,597,1,0,0,0,69,607,1,0,0,0,71,611,1,0,0,0, + 73,624,1,0,0,0,75,629,1,0,0,0,77,636,1,0,0,0,79,645,1,0,0,0,81,656, + 1,0,0,0,83,660,1,0,0,0,85,669,1,0,0,0,87,676,1,0,0,0,89,685,1,0, + 0,0,91,692,1,0,0,0,93,697,1,0,0,0,95,707,1,0,0,0,97,718,1,0,0,0, + 99,726,1,0,0,0,101,732,1,0,0,0,103,738,1,0,0,0,105,747,1,0,0,0,107, + 757,1,0,0,0,109,766,1,0,0,0,111,778,1,0,0,0,113,789,1,0,0,0,115, + 795,1,0,0,0,117,803,1,0,0,0,119,806,1,0,0,0,121,811,1,0,0,0,123, + 818,1,0,0,0,125,821,1,0,0,0,127,829,1,0,0,0,129,836,1,0,0,0,131, + 842,1,0,0,0,133,847,1,0,0,0,135,858,1,0,0,0,137,863,1,0,0,0,139, + 869,1,0,0,0,141,876,1,0,0,0,143,880,1,0,0,0,145,892,1,0,0,0,147, + 895,1,0,0,0,149,902,1,0,0,0,151,905,1,0,0,0,153,912,1,0,0,0,155, + 920,1,0,0,0,157,927,1,0,0,0,159,938,1,0,0,0,161,945,1,0,0,0,163, + 954,1,0,0,0,165,969,1,0,0,0,167,979,1,0,0,0,169,989,1,0,0,0,171, + 997,1,0,0,0,173,1010,1,0,0,0,175,1023,1,0,0,0,177,1029,1,0,0,0,179, + 1046,1,0,0,0,181,1049,1,0,0,0,183,1053,1,0,0,0,185,1058,1,0,0,0, + 187,1064,1,0,0,0,189,1073,1,0,0,0,191,1082,1,0,0,0,193,1086,1,0, + 0,0,195,1090,1,0,0,0,197,1094,1,0,0,0,199,1100,1,0,0,0,201,1106, + 1,0,0,0,203,1111,1,0,0,0,205,1116,1,0,0,0,207,1122,1,0,0,0,209,1130, + 1,0,0,0,211,1138,1,0,0,0,213,1149,1,0,0,0,215,1154,1,0,0,0,217,1166, + 1,0,0,0,219,1177,1,0,0,0,221,1187,1,0,0,0,223,1199,1,0,0,0,225,1208, + 1,0,0,0,227,1213,1,0,0,0,229,1226,1,0,0,0,231,1238,1,0,0,0,233,1250, + 1,0,0,0,235,1255,1,0,0,0,237,1263,1,0,0,0,239,1268,1,0,0,0,241,1281, + 1,0,0,0,243,1289,1,0,0,0,245,1298,1,0,0,0,247,1312,1,0,0,0,249,1321, + 1,0,0,0,251,1326,1,0,0,0,253,1333,1,0,0,0,255,1338,1,0,0,0,257,1344, + 1,0,0,0,259,1351,1,0,0,0,261,1357,1,0,0,0,263,1363,1,0,0,0,265,1370, + 1,0,0,0,267,1377,1,0,0,0,269,1384,1,0,0,0,271,1389,1,0,0,0,273,1395, + 1,0,0,0,275,1400,1,0,0,0,277,1403,1,0,0,0,279,1405,1,0,0,0,281,1407, + 1,0,0,0,283,1409,1,0,0,0,285,1411,1,0,0,0,287,1413,1,0,0,0,289,1415, + 1,0,0,0,291,1417,1,0,0,0,293,1419,1,0,0,0,295,1421,1,0,0,0,297,1423, + 1,0,0,0,299,1425,1,0,0,0,301,1427,1,0,0,0,303,1429,1,0,0,0,305,1432, + 1,0,0,0,307,1440,1,0,0,0,309,1471,1,0,0,0,311,1478,1,0,0,0,313,1488, + 1,0,0,0,315,1498,1,0,0,0,317,1500,1,0,0,0,319,1511,1,0,0,0,321,1526, + 1,0,0,0,323,324,5,101,0,0,324,325,5,100,0,0,325,326,5,105,0,0,326, + 327,5,116,0,0,327,2,1,0,0,0,328,329,5,109,0,0,329,330,5,111,0,0, + 330,331,5,100,0,0,331,332,5,117,0,0,332,333,5,108,0,0,333,334,5, + 101,0,0,334,4,1,0,0,0,335,336,5,99,0,0,336,337,5,111,0,0,337,338, + 5,110,0,0,338,339,5,116,0,0,339,340,5,114,0,0,340,341,5,97,0,0,341, + 342,5,99,0,0,342,343,5,116,0,0,343,6,1,0,0,0,344,345,5,112,0,0,345, + 346,5,114,0,0,346,347,5,101,0,0,347,348,5,115,0,0,348,349,5,101, + 0,0,349,350,5,110,0,0,350,351,5,116,0,0,351,352,5,97,0,0,352,353, + 5,116,0,0,353,354,5,105,0,0,354,355,5,111,0,0,355,356,5,110,0,0, + 356,8,1,0,0,0,357,358,5,115,0,0,358,359,5,117,0,0,359,360,5,98,0, + 0,360,361,5,106,0,0,361,362,5,101,0,0,362,363,5,99,0,0,363,364,5, + 116,0,0,364,10,1,0,0,0,365,366,5,102,0,0,366,367,5,111,0,0,367,368, + 5,114,0,0,368,12,1,0,0,0,369,370,5,99,0,0,370,371,5,114,0,0,371, + 372,5,101,0,0,372,373,5,97,0,0,373,374,5,116,0,0,374,375,5,105,0, + 0,375,376,5,111,0,0,376,377,5,110,0,0,377,14,1,0,0,0,378,379,5,118, + 0,0,379,380,5,97,0,0,380,381,5,114,0,0,381,382,5,105,0,0,382,383, + 5,97,0,0,383,384,5,110,0,0,384,385,5,116,0,0,385,16,1,0,0,0,386, + 387,5,112,0,0,387,388,5,114,0,0,388,389,5,101,0,0,389,390,5,112, + 0,0,390,391,5,97,0,0,391,392,5,114,0,0,392,393,5,101,0,0,393,394, + 5,115,0,0,394,18,1,0,0,0,395,396,5,105,0,0,396,397,5,110,0,0,397, + 398,5,105,0,0,398,399,5,116,0,0,399,400,5,105,0,0,400,401,5,97,0, + 0,401,402,5,108,0,0,402,403,5,105,0,0,403,404,5,122,0,0,404,405, + 5,101,0,0,405,20,1,0,0,0,406,407,5,119,0,0,407,408,5,111,0,0,408, + 409,5,114,0,0,409,410,5,107,0,0,410,411,5,115,0,0,411,412,5,112, + 0,0,412,413,5,97,0,0,413,414,5,99,0,0,414,415,5,101,0,0,415,22,1, + 0,0,0,416,417,5,101,0,0,417,418,5,120,0,0,418,419,5,101,0,0,419, + 420,5,99,0,0,420,421,5,117,0,0,421,422,5,116,0,0,422,423,5,105,0, + 0,423,424,5,111,0,0,424,425,5,110,0,0,425,24,1,0,0,0,426,427,5,115, + 0,0,427,428,5,110,0,0,428,429,5,97,0,0,429,430,5,112,0,0,430,431, + 5,115,0,0,431,432,5,104,0,0,432,433,5,111,0,0,433,434,5,116,0,0, + 434,26,1,0,0,0,435,436,5,116,0,0,436,437,5,114,0,0,437,438,5,97, + 0,0,438,439,5,110,0,0,439,440,5,115,0,0,440,441,5,97,0,0,441,442, + 5,99,0,0,442,443,5,116,0,0,443,444,5,105,0,0,444,445,5,111,0,0,445, + 446,5,110,0,0,446,28,1,0,0,0,447,448,5,114,0,0,448,449,5,101,0,0, + 449,450,5,109,0,0,450,451,5,111,0,0,451,452,5,116,0,0,452,453,5, + 101,0,0,453,30,1,0,0,0,454,455,5,116,0,0,455,456,5,97,0,0,456,457, + 5,114,0,0,457,458,5,103,0,0,458,459,5,101,0,0,459,460,5,116,0,0, + 460,461,5,115,0,0,461,32,1,0,0,0,462,463,5,112,0,0,463,464,5,111, + 0,0,464,465,5,114,0,0,465,466,5,116,0,0,466,467,5,97,0,0,467,468, + 5,98,0,0,468,469,5,108,0,0,469,470,5,101,0,0,470,34,1,0,0,0,471, + 472,5,114,0,0,472,473,5,101,0,0,473,474,5,112,0,0,474,475,5,108, + 0,0,475,476,5,105,0,0,476,477,5,99,0,0,477,478,5,97,0,0,478,36,1, + 0,0,0,479,480,5,108,0,0,480,481,5,111,0,0,481,482,5,99,0,0,482,483, + 5,97,0,0,483,484,5,108,0,0,484,38,1,0,0,0,485,486,5,102,0,0,486, + 487,5,114,0,0,487,488,5,111,0,0,488,489,5,109,0,0,489,40,1,0,0,0, + 490,491,5,114,0,0,491,492,5,101,0,0,492,493,5,115,0,0,493,494,5, + 117,0,0,494,495,5,108,0,0,495,496,5,116,0,0,496,497,5,45,0,0,497, + 498,5,98,0,0,498,499,5,121,0,0,499,500,5,116,0,0,500,501,5,101,0, + 0,501,502,5,115,0,0,502,42,1,0,0,0,503,504,5,114,0,0,504,505,5,112, + 0,0,505,506,5,99,0,0,506,507,5,45,0,0,507,508,5,99,0,0,508,509,5, + 97,0,0,509,510,5,108,0,0,510,511,5,108,0,0,511,512,5,115,0,0,512, + 44,1,0,0,0,513,514,5,100,0,0,514,515,5,101,0,0,515,516,5,97,0,0, + 516,517,5,100,0,0,517,518,5,108,0,0,518,519,5,105,0,0,519,520,5, + 110,0,0,520,521,5,101,0,0,521,522,5,45,0,0,522,523,5,109,0,0,523, + 524,5,115,0,0,524,46,1,0,0,0,525,526,5,113,0,0,526,527,5,117,0,0, + 527,528,5,101,0,0,528,529,5,114,0,0,529,530,5,121,0,0,530,48,1,0, + 0,0,531,532,5,114,0,0,532,533,5,101,0,0,533,534,5,102,0,0,534,535, + 5,108,0,0,535,536,5,101,0,0,536,537,5,99,0,0,537,538,5,116,0,0,538, + 539,5,105,0,0,539,540,5,111,0,0,540,541,5,110,0,0,541,50,1,0,0,0, + 542,543,5,115,0,0,543,544,5,112,0,0,544,545,5,101,0,0,545,546,5, + 99,0,0,546,547,5,105,0,0,547,548,5,97,0,0,548,549,5,108,0,0,549, + 550,5,105,0,0,550,551,5,122,0,0,551,552,5,101,0,0,552,52,1,0,0,0, + 553,554,5,114,0,0,554,555,5,111,0,0,555,556,5,111,0,0,556,557,5, + 116,0,0,557,54,1,0,0,0,558,559,5,100,0,0,559,560,5,111,0,0,560,561, + 5,99,0,0,561,562,5,117,0,0,562,563,5,109,0,0,563,564,5,101,0,0,564, + 565,5,110,0,0,565,566,5,116,0,0,566,56,1,0,0,0,567,568,5,102,0,0, + 568,569,5,114,0,0,569,570,5,97,0,0,570,571,5,103,0,0,571,572,5,109, + 0,0,572,573,5,101,0,0,573,574,5,110,0,0,574,575,5,116,0,0,575,576, + 5,115,0,0,576,58,1,0,0,0,577,578,5,118,0,0,578,579,5,105,0,0,579, + 580,5,101,0,0,580,581,5,119,0,0,581,60,1,0,0,0,582,583,5,109,0,0, + 583,584,5,97,0,0,584,585,5,120,0,0,585,62,1,0,0,0,586,587,5,97,0, + 0,587,588,5,108,0,0,588,589,5,108,0,0,589,590,5,111,0,0,590,591, + 5,119,0,0,591,64,1,0,0,0,592,593,5,112,0,0,593,594,5,111,0,0,594, + 595,5,108,0,0,595,596,5,108,0,0,596,66,1,0,0,0,597,598,5,113,0,0, + 598,599,5,117,0,0,599,600,5,101,0,0,600,601,5,114,0,0,601,602,5, + 121,0,0,602,603,5,97,0,0,603,604,5,98,0,0,604,605,5,108,0,0,605, + 606,5,101,0,0,606,68,1,0,0,0,607,608,5,114,0,0,608,609,5,112,0,0, + 609,610,5,99,0,0,610,70,1,0,0,0,611,612,5,113,0,0,612,613,5,117, + 0,0,613,614,5,101,0,0,614,615,5,114,0,0,615,616,5,121,0,0,616,617, + 5,45,0,0,617,618,5,114,0,0,618,619,5,101,0,0,619,620,5,97,0,0,620, + 621,5,115,0,0,621,622,5,111,0,0,622,623,5,110,0,0,623,72,1,0,0,0, + 624,625,5,116,0,0,625,626,5,121,0,0,626,627,5,112,0,0,627,628,5, + 101,0,0,628,74,1,0,0,0,629,630,5,111,0,0,630,631,5,98,0,0,631,632, + 5,106,0,0,632,633,5,101,0,0,633,634,5,99,0,0,634,635,5,116,0,0,635, + 76,1,0,0,0,636,637,5,115,0,0,637,638,5,116,0,0,638,639,5,111,0,0, + 639,640,5,114,0,0,640,641,5,97,0,0,641,642,5,98,0,0,642,643,5,108, + 0,0,643,644,5,101,0,0,644,78,1,0,0,0,645,646,5,105,0,0,646,647,5, + 109,0,0,647,648,5,112,0,0,648,649,5,108,0,0,649,650,5,101,0,0,650, + 651,5,109,0,0,651,652,5,101,0,0,652,653,5,110,0,0,653,654,5,116, + 0,0,654,655,5,115,0,0,655,80,1,0,0,0,656,657,5,114,0,0,657,658,5, + 101,0,0,658,659,5,102,0,0,659,82,1,0,0,0,660,661,5,102,0,0,661,662, + 5,114,0,0,662,663,5,97,0,0,663,664,5,103,0,0,664,665,5,109,0,0,665, + 666,5,101,0,0,666,667,5,110,0,0,667,668,5,116,0,0,668,84,1,0,0,0, + 669,670,5,105,0,0,670,671,5,109,0,0,671,672,5,112,0,0,672,673,5, + 111,0,0,673,674,5,114,0,0,674,675,5,116,0,0,675,86,1,0,0,0,676,677, + 5,101,0,0,677,678,5,120,0,0,678,679,5,116,0,0,679,680,5,101,0,0, + 680,681,5,114,0,0,681,682,5,110,0,0,682,683,5,97,0,0,683,684,5,108, + 0,0,684,88,1,0,0,0,685,686,5,115,0,0,686,687,5,121,0,0,687,688,5, + 109,0,0,688,689,5,98,0,0,689,690,5,111,0,0,690,691,5,108,0,0,691, + 90,1,0,0,0,692,693,5,97,0,0,693,694,5,116,0,0,694,695,5,111,0,0, + 695,696,5,109,0,0,696,92,1,0,0,0,697,698,5,105,0,0,698,699,5,110, + 0,0,699,700,5,116,0,0,700,701,5,101,0,0,701,702,5,114,0,0,702,703, + 5,102,0,0,703,704,5,97,0,0,704,705,5,99,0,0,705,706,5,101,0,0,706, + 94,1,0,0,0,707,708,5,105,0,0,708,709,5,110,0,0,709,710,5,116,0,0, + 710,711,5,101,0,0,711,712,5,114,0,0,712,713,5,102,0,0,713,714,5, + 97,0,0,714,715,5,99,0,0,715,716,5,101,0,0,716,717,5,115,0,0,717, + 96,1,0,0,0,718,719,5,112,0,0,719,720,5,97,0,0,720,721,5,99,0,0,721, + 722,5,107,0,0,722,723,5,97,0,0,723,724,5,103,0,0,724,725,5,101,0, + 0,725,98,1,0,0,0,726,727,5,118,0,0,727,728,5,97,0,0,728,729,5,108, + 0,0,729,730,5,117,0,0,730,731,5,101,0,0,731,100,1,0,0,0,732,733, + 5,102,0,0,733,734,5,105,0,0,734,735,5,101,0,0,735,736,5,108,0,0, + 736,737,5,100,0,0,737,102,1,0,0,0,738,739,5,114,0,0,739,740,5,101, + 0,0,740,741,5,108,0,0,741,742,5,97,0,0,742,743,5,116,0,0,743,744, + 5,105,0,0,744,745,5,111,0,0,745,746,5,110,0,0,746,104,1,0,0,0,747, + 748,5,111,0,0,748,749,5,112,0,0,749,750,5,101,0,0,750,751,5,114, + 0,0,751,752,5,97,0,0,752,753,5,116,0,0,753,754,5,105,0,0,754,755, + 5,111,0,0,755,756,5,110,0,0,756,106,1,0,0,0,757,758,5,102,0,0,758, + 759,5,117,0,0,759,760,5,110,0,0,760,761,5,99,0,0,761,762,5,116,0, + 0,762,763,5,105,0,0,763,764,5,111,0,0,764,765,5,110,0,0,765,108, + 1,0,0,0,766,767,5,99,0,0,767,768,5,111,0,0,768,769,5,110,0,0,769, + 770,5,115,0,0,770,771,5,116,0,0,771,772,5,114,0,0,772,773,5,117, + 0,0,773,774,5,99,0,0,774,775,5,116,0,0,775,776,5,111,0,0,776,777, + 5,114,0,0,777,110,1,0,0,0,778,779,5,99,0,0,779,780,5,111,0,0,780, + 781,5,110,0,0,781,782,5,115,0,0,782,783,5,116,0,0,783,784,5,114, + 0,0,784,785,5,117,0,0,785,786,5,99,0,0,786,787,5,116,0,0,787,788, + 5,115,0,0,788,112,1,0,0,0,789,790,5,105,0,0,790,791,5,110,0,0,791, + 792,5,112,0,0,792,793,5,117,0,0,793,794,5,116,0,0,794,114,1,0,0, + 0,795,796,5,99,0,0,796,797,5,111,0,0,797,798,5,110,0,0,798,799,5, + 102,0,0,799,800,5,111,0,0,800,801,5,114,0,0,801,802,5,109,0,0,802, + 116,1,0,0,0,803,804,5,97,0,0,804,805,5,115,0,0,805,118,1,0,0,0,806, + 807,5,98,0,0,807,808,5,105,0,0,808,809,5,110,0,0,809,810,5,100,0, + 0,810,120,1,0,0,0,811,812,5,115,0,0,812,813,5,116,0,0,813,814,5, + 97,0,0,814,815,5,116,0,0,815,816,5,105,0,0,816,817,5,99,0,0,817, + 122,1,0,0,0,818,819,5,116,0,0,819,820,5,111,0,0,820,124,1,0,0,0, + 821,822,5,112,0,0,822,823,5,114,0,0,823,824,5,105,0,0,824,825,5, + 118,0,0,825,826,5,97,0,0,826,827,5,116,0,0,827,828,5,101,0,0,828, + 126,1,0,0,0,829,830,5,115,0,0,830,831,5,104,0,0,831,832,5,97,0,0, + 832,833,5,114,0,0,833,834,5,101,0,0,834,835,5,100,0,0,835,128,1, + 0,0,0,836,837,5,115,0,0,837,838,5,116,0,0,838,839,5,97,0,0,839,840, + 5,116,0,0,840,841,5,101,0,0,841,130,1,0,0,0,842,843,5,101,0,0,843, + 844,5,100,0,0,844,845,5,103,0,0,845,846,5,101,0,0,846,132,1,0,0, + 0,847,848,5,112,0,0,848,849,5,114,0,0,849,850,5,111,0,0,850,851, + 5,106,0,0,851,852,5,101,0,0,852,853,5,99,0,0,853,854,5,116,0,0,854, + 855,5,105,0,0,855,856,5,111,0,0,856,857,5,110,0,0,857,134,1,0,0, + 0,858,859,5,119,0,0,859,860,5,105,0,0,860,861,5,116,0,0,861,862, + 5,104,0,0,862,136,1,0,0,0,863,864,5,117,0,0,864,865,5,115,0,0,865, + 866,5,105,0,0,866,867,5,110,0,0,867,868,5,103,0,0,868,138,1,0,0, + 0,869,870,5,97,0,0,870,871,5,99,0,0,871,872,5,99,0,0,872,873,5,101, + 0,0,873,874,5,112,0,0,874,875,5,116,0,0,875,140,1,0,0,0,876,877, + 5,118,0,0,877,878,5,105,0,0,878,879,5,97,0,0,879,142,1,0,0,0,880, + 881,5,109,0,0,881,882,5,97,0,0,882,883,5,116,0,0,883,884,5,101,0, + 0,884,885,5,114,0,0,885,886,5,105,0,0,886,887,5,97,0,0,887,888,5, + 108,0,0,888,889,5,105,0,0,889,890,5,122,0,0,890,891,5,101,0,0,891, + 144,1,0,0,0,892,893,5,105,0,0,893,894,5,102,0,0,894,146,1,0,0,0, + 895,896,5,97,0,0,896,897,5,98,0,0,897,898,5,115,0,0,898,899,5,101, + 0,0,899,900,5,110,0,0,900,901,5,116,0,0,901,148,1,0,0,0,902,903, + 5,111,0,0,903,904,5,110,0,0,904,150,1,0,0,0,905,906,5,112,0,0,906, + 907,5,111,0,0,907,908,5,108,0,0,908,909,5,105,0,0,909,910,5,99,0, + 0,910,911,5,121,0,0,911,152,1,0,0,0,912,913,5,100,0,0,913,914,5, + 101,0,0,914,915,5,102,0,0,915,916,5,97,0,0,916,917,5,117,0,0,917, + 918,5,108,0,0,918,919,5,116,0,0,919,154,1,0,0,0,920,921,5,115,0, + 0,921,922,5,111,0,0,922,923,5,117,0,0,923,924,5,114,0,0,924,925, + 5,99,0,0,925,926,5,101,0,0,926,156,1,0,0,0,927,928,5,114,0,0,928, + 929,5,101,0,0,929,930,5,112,0,0,930,931,5,111,0,0,931,932,5,115, + 0,0,932,933,5,105,0,0,933,934,5,116,0,0,934,935,5,111,0,0,935,936, + 5,114,0,0,936,937,5,121,0,0,937,158,1,0,0,0,938,939,5,99,0,0,939, + 940,5,111,0,0,940,941,5,109,0,0,941,942,5,109,0,0,942,943,5,105, + 0,0,943,944,5,116,0,0,944,160,1,0,0,0,945,946,5,114,0,0,946,947, + 5,101,0,0,947,948,5,118,0,0,948,949,5,105,0,0,949,950,5,115,0,0, + 950,951,5,105,0,0,951,952,5,111,0,0,952,953,5,110,0,0,953,162,1, + 0,0,0,954,955,5,115,0,0,955,956,5,101,0,0,956,957,5,109,0,0,957, + 958,5,97,0,0,958,959,5,110,0,0,959,960,5,116,0,0,960,961,5,105,0, + 0,961,962,5,99,0,0,962,963,5,45,0,0,963,964,5,109,0,0,964,965,5, + 97,0,0,965,966,5,106,0,0,966,967,5,111,0,0,967,968,5,114,0,0,968, + 164,1,0,0,0,969,970,5,111,0,0,970,971,5,110,0,0,971,972,5,45,0,0, + 972,973,5,100,0,0,973,974,5,101,0,0,974,975,5,108,0,0,975,976,5, + 101,0,0,976,977,5,116,0,0,977,978,5,101,0,0,978,166,1,0,0,0,979, + 980,5,108,0,0,980,981,5,105,0,0,981,982,5,102,0,0,982,983,5,101, + 0,0,983,984,5,99,0,0,984,985,5,121,0,0,985,986,5,99,0,0,986,987, + 5,108,0,0,987,988,5,101,0,0,988,168,1,0,0,0,989,990,5,106,0,0,990, + 991,5,111,0,0,991,992,5,117,0,0,992,993,5,114,0,0,993,994,5,110, + 0,0,994,995,5,97,0,0,995,996,5,108,0,0,996,170,1,0,0,0,997,998,5, + 115,0,0,998,999,5,117,0,0,999,1000,5,98,0,0,1000,1001,5,115,0,0, + 1001,1002,5,99,0,0,1002,1003,5,114,0,0,1003,1004,5,105,0,0,1004, + 1005,5,112,0,0,1005,1006,5,116,0,0,1006,1007,5,105,0,0,1007,1008, + 5,111,0,0,1008,1009,5,110,0,0,1009,172,1,0,0,0,1010,1011,5,114,0, + 0,1011,1012,5,101,0,0,1012,1013,5,116,0,0,1013,1014,5,97,0,0,1014, + 1015,5,105,0,0,1015,1016,5,110,0,0,1016,1017,5,45,0,0,1017,1018, + 5,111,0,0,1018,1019,5,116,0,0,1019,1020,5,104,0,0,1020,1021,5,101, + 0,0,1021,1022,5,114,0,0,1022,174,1,0,0,0,1023,1024,5,107,0,0,1024, + 1025,5,101,0,0,1025,1026,5,121,0,0,1026,1027,5,101,0,0,1027,1028, + 5,100,0,0,1028,176,1,0,0,0,1029,1030,5,112,0,0,1030,1031,5,117,0, + 0,1031,1032,5,98,0,0,1032,1033,5,108,0,0,1033,1034,5,105,0,0,1034, + 1035,5,99,0,0,1035,1036,5,45,0,0,1036,1037,5,116,0,0,1037,1038,5, + 114,0,0,1038,1039,5,97,0,0,1039,1040,5,118,0,0,1040,1041,5,101,0, + 0,1041,1042,5,114,0,0,1042,1043,5,115,0,0,1043,1044,5,97,0,0,1044, + 1045,5,108,0,0,1045,178,1,0,0,0,1046,1047,5,105,0,0,1047,1048,5, + 100,0,0,1048,180,1,0,0,0,1049,1050,5,100,0,0,1050,1051,5,111,0,0, + 1051,1052,5,99,0,0,1052,182,1,0,0,0,1053,1054,5,109,0,0,1054,1055, + 5,111,0,0,1055,1056,5,100,0,0,1056,1057,5,101,0,0,1057,184,1,0,0, + 0,1058,1059,5,101,0,0,1059,1060,5,109,0,0,1060,1061,5,105,0,0,1061, + 1062,5,116,0,0,1062,1063,5,115,0,0,1063,186,1,0,0,0,1064,1065,5, + 114,0,0,1065,1066,5,101,0,0,1066,1067,5,99,0,0,1067,1068,5,101,0, + 0,1068,1069,5,105,0,0,1069,1070,5,118,0,0,1070,1071,5,101,0,0,1071, + 1072,5,114,0,0,1072,188,1,0,0,0,1073,1074,5,114,0,0,1074,1075,5, + 101,0,0,1075,1076,5,113,0,0,1076,1077,5,117,0,0,1077,1078,5,105, + 0,0,1078,1079,5,114,0,0,1079,1080,5,101,0,0,1080,1081,5,115,0,0, + 1081,190,1,0,0,0,1082,1083,5,97,0,0,1083,1084,5,110,0,0,1084,1085, + 5,121,0,0,1085,192,1,0,0,0,1086,1087,5,103,0,0,1087,1088,5,101,0, + 0,1088,1089,5,116,0,0,1089,194,1,0,0,0,1090,1091,5,115,0,0,1091, + 1092,5,101,0,0,1092,1093,5,116,0,0,1093,196,1,0,0,0,1094,1095,5, + 119,0,0,1095,1096,5,97,0,0,1096,1097,5,116,0,0,1097,1098,5,99,0, + 0,1098,1099,5,104,0,0,1099,198,1,0,0,0,1100,1101,5,115,0,0,1101, + 1102,5,116,0,0,1102,1103,5,97,0,0,1103,1104,5,114,0,0,1104,1105, + 5,116,0,0,1105,200,1,0,0,0,1106,1107,5,115,0,0,1107,1108,5,116,0, + 0,1108,1109,5,111,0,0,1109,1110,5,112,0,0,1110,202,1,0,0,0,1111, + 1112,5,114,0,0,1112,1113,5,101,0,0,1113,1114,5,97,0,0,1114,1115, + 5,100,0,0,1115,204,1,0,0,0,1116,1117,5,119,0,0,1117,1118,5,114,0, + 0,1118,1119,5,105,0,0,1119,1120,5,116,0,0,1120,1121,5,101,0,0,1121, + 206,1,0,0,0,1122,1123,5,114,0,0,1123,1124,5,101,0,0,1124,1125,5, + 115,0,0,1125,1126,5,111,0,0,1126,1127,5,108,0,0,1127,1128,5,118, + 0,0,1128,1129,5,101,0,0,1129,208,1,0,0,0,1130,1131,5,99,0,0,1131, + 1132,5,111,0,0,1132,1133,5,110,0,0,1133,1134,5,110,0,0,1134,1135, + 5,101,0,0,1135,1136,5,99,0,0,1136,1137,5,116,0,0,1137,210,1,0,0, + 0,1138,1139,5,100,0,0,1139,1140,5,105,0,0,1140,1141,5,115,0,0,1141, + 1142,5,99,0,0,1142,1143,5,111,0,0,1143,1144,5,110,0,0,1144,1145, + 5,110,0,0,1145,1146,5,101,0,0,1146,1147,5,99,0,0,1147,1148,5,116, + 0,0,1148,212,1,0,0,0,1149,1150,5,99,0,0,1150,1151,5,97,0,0,1151, + 1152,5,108,0,0,1152,1153,5,108,0,0,1153,214,1,0,0,0,1154,1155,5, + 119,0,0,1155,1156,5,97,0,0,1156,1157,5,116,0,0,1157,1158,5,99,0, + 0,1158,1159,5,104,0,0,1159,1160,5,45,0,0,1160,1161,5,115,0,0,1161, + 1162,5,116,0,0,1162,1163,5,97,0,0,1163,1164,5,114,0,0,1164,1165, + 5,116,0,0,1165,216,1,0,0,0,1166,1167,5,119,0,0,1167,1168,5,97,0, + 0,1168,1169,5,116,0,0,1169,1170,5,99,0,0,1170,1171,5,104,0,0,1171, + 1172,5,45,0,0,1172,1173,5,115,0,0,1173,1174,5,116,0,0,1174,1175, + 5,111,0,0,1175,1176,5,112,0,0,1176,218,1,0,0,0,1177,1178,5,115,0, + 0,1178,1179,5,117,0,0,1179,1180,5,98,0,0,1180,1181,5,115,0,0,1181, + 1182,5,99,0,0,1182,1183,5,114,0,0,1183,1184,5,105,0,0,1184,1185, + 5,98,0,0,1185,1186,5,101,0,0,1186,220,1,0,0,0,1187,1188,5,117,0, + 0,1188,1189,5,110,0,0,1189,1190,5,115,0,0,1190,1191,5,117,0,0,1191, + 1192,5,98,0,0,1192,1193,5,115,0,0,1193,1194,5,99,0,0,1194,1195,5, + 114,0,0,1195,1196,5,105,0,0,1196,1197,5,98,0,0,1197,1198,5,101,0, + 0,1198,222,1,0,0,0,1199,1200,5,114,0,0,1200,1201,5,101,0,0,1201, + 1202,5,103,0,0,1202,1203,5,105,0,0,1203,1204,5,115,0,0,1204,1205, + 5,116,0,0,1205,1206,5,101,0,0,1206,1207,5,114,0,0,1207,224,1,0,0, + 0,1208,1209,5,99,0,0,1209,1210,5,114,0,0,1210,1211,5,100,0,0,1211, + 1212,5,116,0,0,1212,226,1,0,0,0,1213,1214,5,111,0,0,1214,1215,5, + 112,0,0,1215,1216,5,116,0,0,1216,1217,5,105,0,0,1217,1218,5,111, + 0,0,1218,1219,5,110,0,0,1219,1220,5,97,0,0,1220,1221,5,108,0,0,1221, + 1222,5,45,0,0,1222,1223,5,111,0,0,1223,1224,5,110,0,0,1224,1225, + 5,101,0,0,1225,228,1,0,0,0,1226,1227,5,101,0,0,1227,1228,5,120,0, + 0,1228,1229,5,97,0,0,1229,1230,5,99,0,0,1230,1231,5,116,0,0,1231, + 1232,5,108,0,0,1232,1233,5,121,0,0,1233,1234,5,45,0,0,1234,1235, + 5,111,0,0,1235,1236,5,110,0,0,1236,1237,5,101,0,0,1237,230,1,0,0, + 0,1238,1239,5,109,0,0,1239,1240,5,97,0,0,1240,1241,5,110,0,0,1241, + 1242,5,121,0,0,1242,1243,5,45,0,0,1243,1244,5,117,0,0,1244,1245, + 5,110,0,0,1245,1246,5,105,0,0,1246,1247,5,113,0,0,1247,1248,5,117, + 0,0,1248,1249,5,101,0,0,1249,232,1,0,0,0,1250,1251,5,109,0,0,1251, + 1252,5,97,0,0,1252,1253,5,110,0,0,1253,1254,5,121,0,0,1254,234,1, + 0,0,0,1255,1256,5,111,0,0,1256,1257,5,114,0,0,1257,1258,5,100,0, + 0,1258,1259,5,101,0,0,1259,1260,5,114,0,0,1260,1261,5,101,0,0,1261, + 1262,5,100,0,0,1262,236,1,0,0,0,1263,1264,5,117,0,0,1264,1265,5, + 110,0,0,1265,1266,5,105,0,0,1266,1267,5,116,0,0,1267,238,1,0,0,0, + 1268,1269,5,119,0,0,1269,1270,5,97,0,0,1270,1271,5,116,0,0,1271, + 1272,5,99,0,0,1272,1273,5,104,0,0,1273,1274,5,45,0,0,1274,1275,5, + 104,0,0,1275,1276,5,97,0,0,1276,1277,5,110,0,0,1277,1278,5,100,0, + 0,1278,1279,5,108,0,0,1279,1280,5,101,0,0,1280,240,1,0,0,0,1281, + 1282,5,109,0,0,1282,1283,5,101,0,0,1283,1284,5,115,0,0,1284,1285, + 5,115,0,0,1285,1286,5,97,0,0,1286,1287,5,103,0,0,1287,1288,5,101, + 0,0,1288,242,1,0,0,0,1289,1290,5,97,0,0,1290,1291,5,116,0,0,1291, + 1292,5,111,0,0,1292,1293,5,109,0,0,1293,1294,5,45,0,0,1294,1295, + 5,114,0,0,1295,1296,5,101,0,0,1296,1297,5,102,0,0,1297,244,1,0,0, + 0,1298,1299,5,105,0,0,1299,1300,5,110,0,0,1300,1301,5,116,0,0,1301, + 1302,5,101,0,0,1302,1303,5,114,0,0,1303,1304,5,102,0,0,1304,1305, + 5,97,0,0,1305,1306,5,99,0,0,1306,1307,5,101,0,0,1307,1308,5,45,0, + 0,1308,1309,5,114,0,0,1309,1310,5,101,0,0,1310,1311,5,102,0,0,1311, + 246,1,0,0,0,1312,1313,5,111,0,0,1313,1314,5,112,0,0,1314,1315,5, + 116,0,0,1315,1316,5,105,0,0,1316,1317,5,111,0,0,1317,1318,5,110, + 0,0,1318,1319,5,97,0,0,1319,1320,5,108,0,0,1320,248,1,0,0,0,1321, + 1322,5,108,0,0,1322,1323,5,105,0,0,1323,1324,5,115,0,0,1324,1325, + 5,116,0,0,1325,250,1,0,0,0,1326,1327,5,114,0,0,1327,1328,5,101,0, + 0,1328,1329,5,99,0,0,1329,1330,5,111,0,0,1330,1331,5,114,0,0,1331, + 1332,5,100,0,0,1332,252,1,0,0,0,1333,1334,5,98,0,0,1334,1335,5,111, + 0,0,1335,1336,5,111,0,0,1336,1337,5,108,0,0,1337,254,1,0,0,0,1338, + 1339,5,98,0,0,1339,1340,5,121,0,0,1340,1341,5,116,0,0,1341,1342, + 5,101,0,0,1342,1343,5,115,0,0,1343,256,1,0,0,0,1344,1345,5,100,0, + 0,1345,1346,5,111,0,0,1346,1347,5,117,0,0,1347,1348,5,98,0,0,1348, + 1349,5,108,0,0,1349,1350,5,101,0,0,1350,258,1,0,0,0,1351,1352,5, + 105,0,0,1352,1353,5,110,0,0,1353,1354,5,116,0,0,1354,1355,5,51,0, + 0,1355,1356,5,50,0,0,1356,260,1,0,0,0,1357,1358,5,105,0,0,1358,1359, + 5,110,0,0,1359,1360,5,116,0,0,1360,1361,5,54,0,0,1361,1362,5,52, + 0,0,1362,262,1,0,0,0,1363,1364,5,115,0,0,1364,1365,5,116,0,0,1365, + 1366,5,114,0,0,1366,1367,5,105,0,0,1367,1368,5,110,0,0,1368,1369, + 5,103,0,0,1369,264,1,0,0,0,1370,1371,5,117,0,0,1371,1372,5,105,0, + 0,1372,1373,5,110,0,0,1373,1374,5,116,0,0,1374,1375,5,51,0,0,1375, + 1376,5,50,0,0,1376,266,1,0,0,0,1377,1378,5,117,0,0,1378,1379,5,105, + 0,0,1379,1380,5,110,0,0,1380,1381,5,116,0,0,1381,1382,5,54,0,0,1382, + 1383,5,52,0,0,1383,268,1,0,0,0,1384,1385,5,116,0,0,1385,1386,5,114, + 0,0,1386,1387,5,117,0,0,1387,1388,5,101,0,0,1388,270,1,0,0,0,1389, + 1390,5,102,0,0,1390,1391,5,97,0,0,1391,1392,5,108,0,0,1392,1393, + 5,115,0,0,1393,1394,5,101,0,0,1394,272,1,0,0,0,1395,1396,5,110,0, + 0,1396,1397,5,117,0,0,1397,1398,5,108,0,0,1398,1399,5,108,0,0,1399, + 274,1,0,0,0,1400,1401,5,45,0,0,1401,1402,5,62,0,0,1402,276,1,0,0, + 0,1403,1404,5,58,0,0,1404,278,1,0,0,0,1405,1406,5,59,0,0,1406,280, + 1,0,0,0,1407,1408,5,44,0,0,1408,282,1,0,0,0,1409,1410,5,46,0,0,1410, + 284,1,0,0,0,1411,1412,5,123,0,0,1412,286,1,0,0,0,1413,1414,5,125, + 0,0,1414,288,1,0,0,0,1415,1416,5,91,0,0,1416,290,1,0,0,0,1417,1418, + 5,93,0,0,1418,292,1,0,0,0,1419,1420,5,40,0,0,1420,294,1,0,0,0,1421, + 1422,5,41,0,0,1422,296,1,0,0,0,1423,1424,5,60,0,0,1424,298,1,0,0, + 0,1425,1426,5,62,0,0,1426,300,1,0,0,0,1427,1428,5,38,0,0,1428,302, + 1,0,0,0,1429,1430,5,61,0,0,1430,304,1,0,0,0,1431,1433,5,45,0,0,1432, + 1431,1,0,0,0,1432,1433,1,0,0,0,1433,1435,1,0,0,0,1434,1436,7,0,0, + 0,1435,1434,1,0,0,0,1436,1437,1,0,0,0,1437,1435,1,0,0,0,1437,1438, + 1,0,0,0,1438,306,1,0,0,0,1439,1441,5,45,0,0,1440,1439,1,0,0,0,1440, + 1441,1,0,0,0,1441,1450,1,0,0,0,1442,1451,5,48,0,0,1443,1447,7,1, + 0,0,1444,1446,7,0,0,0,1445,1444,1,0,0,0,1446,1449,1,0,0,0,1447,1445, + 1,0,0,0,1447,1448,1,0,0,0,1448,1451,1,0,0,0,1449,1447,1,0,0,0,1450, + 1442,1,0,0,0,1450,1443,1,0,0,0,1451,1458,1,0,0,0,1452,1454,5,46, + 0,0,1453,1455,7,0,0,0,1454,1453,1,0,0,0,1455,1456,1,0,0,0,1456,1454, + 1,0,0,0,1456,1457,1,0,0,0,1457,1459,1,0,0,0,1458,1452,1,0,0,0,1458, + 1459,1,0,0,0,1459,1469,1,0,0,0,1460,1462,7,2,0,0,1461,1463,7,3,0, + 0,1462,1461,1,0,0,0,1462,1463,1,0,0,0,1463,1465,1,0,0,0,1464,1466, + 7,0,0,0,1465,1464,1,0,0,0,1466,1467,1,0,0,0,1467,1465,1,0,0,0,1467, + 1468,1,0,0,0,1468,1470,1,0,0,0,1469,1460,1,0,0,0,1469,1470,1,0,0, + 0,1470,308,1,0,0,0,1471,1475,7,4,0,0,1472,1474,7,5,0,0,1473,1472, + 1,0,0,0,1474,1477,1,0,0,0,1475,1473,1,0,0,0,1475,1476,1,0,0,0,1476, + 310,1,0,0,0,1477,1475,1,0,0,0,1478,1483,5,34,0,0,1479,1482,3,313, + 156,0,1480,1482,8,6,0,0,1481,1479,1,0,0,0,1481,1480,1,0,0,0,1482, + 1485,1,0,0,0,1483,1481,1,0,0,0,1483,1484,1,0,0,0,1484,1486,1,0,0, + 0,1485,1483,1,0,0,0,1486,1487,5,34,0,0,1487,312,1,0,0,0,1488,1496, + 5,92,0,0,1489,1497,7,7,0,0,1490,1491,5,117,0,0,1491,1492,3,315,157, + 0,1492,1493,3,315,157,0,1493,1494,3,315,157,0,1494,1495,3,315,157, + 0,1495,1497,1,0,0,0,1496,1489,1,0,0,0,1496,1490,1,0,0,0,1497,314, + 1,0,0,0,1498,1499,7,8,0,0,1499,316,1,0,0,0,1500,1501,5,47,0,0,1501, + 1502,5,47,0,0,1502,1506,1,0,0,0,1503,1505,8,9,0,0,1504,1503,1,0, + 0,0,1505,1508,1,0,0,0,1506,1504,1,0,0,0,1506,1507,1,0,0,0,1507,1509, + 1,0,0,0,1508,1506,1,0,0,0,1509,1510,6,158,0,0,1510,318,1,0,0,0,1511, + 1512,5,47,0,0,1512,1513,5,42,0,0,1513,1517,1,0,0,0,1514,1516,9,0, + 0,0,1515,1514,1,0,0,0,1516,1519,1,0,0,0,1517,1518,1,0,0,0,1517,1515, + 1,0,0,0,1518,1520,1,0,0,0,1519,1517,1,0,0,0,1520,1521,5,42,0,0,1521, + 1522,5,47,0,0,1522,1523,1,0,0,0,1523,1524,6,159,0,0,1524,320,1,0, + 0,0,1525,1527,7,10,0,0,1526,1525,1,0,0,0,1527,1528,1,0,0,0,1528, + 1526,1,0,0,0,1528,1529,1,0,0,0,1529,1530,1,0,0,0,1530,1531,6,160, + 0,0,1531,322,1,0,0,0,18,0,1432,1437,1440,1447,1450,1456,1458,1462, + 1467,1469,1475,1481,1483,1496,1506,1517,1528,1,0,1,0 ]; private static __ATN: antlr.ATN; diff --git a/src/capability-language/generated/QuixosCapabilityParser.ts b/src/capability-language/generated/QuixosCapabilityParser.ts index bb234d3..04d09e9 100644 --- a/src/capability-language/generated/QuixosCapabilityParser.ts +++ b/src/capability-language/generated/QuixosCapabilityParser.ts @@ -54,120 +54,121 @@ export class QuixosCapabilityParser extends antlr.Parser { public static readonly FRAGMENT = 42; public static readonly IMPORT = 43; public static readonly EXTERNAL = 44; - public static readonly ATOM = 45; - public static readonly INTERFACE = 46; - public static readonly INTERFACES = 47; - public static readonly PACKAGE = 48; - public static readonly VALUE = 49; - public static readonly FIELD = 50; - public static readonly RELATION = 51; - public static readonly OPERATION = 52; - public static readonly FUNCTION = 53; - public static readonly CONSTRUCTOR = 54; - public static readonly CONSTRUCTS = 55; - public static readonly INPUT = 56; - public static readonly CONFORM = 57; - public static readonly AS = 58; - public static readonly BIND = 59; - public static readonly STATIC = 60; - public static readonly TO = 61; - public static readonly PRIVATE = 62; - public static readonly SHARED = 63; - public static readonly STATE = 64; - public static readonly EDGE = 65; - public static readonly PROJECTION = 66; - public static readonly WITH = 67; - public static readonly USING = 68; - public static readonly ACCEPT = 69; - public static readonly VIA = 70; - public static readonly MATERIALIZE = 71; - public static readonly IF = 72; - public static readonly ABSENT = 73; - public static readonly ON = 74; - public static readonly POLICY = 75; - public static readonly DEFAULT = 76; - public static readonly SOURCE = 77; - public static readonly REPOSITORY = 78; - public static readonly COMMIT = 79; - public static readonly REVISION = 80; - public static readonly SEMANTIC_MAJOR = 81; - public static readonly ON_DELETE = 82; - public static readonly LIFECYCLE = 83; - public static readonly JOURNAL = 84; - public static readonly SUBSCRIPTION = 85; - public static readonly RETAIN_OTHER = 86; - public static readonly KEYED = 87; - public static readonly PUBLIC_TRAVERSAL = 88; - public static readonly ID = 89; - public static readonly DOC = 90; - public static readonly MODE = 91; - public static readonly EMITS = 92; - public static readonly RECEIVER = 93; - public static readonly REQUIRES = 94; - public static readonly ANY = 95; - public static readonly GET = 96; - public static readonly SET = 97; - public static readonly WATCH = 98; - public static readonly START = 99; - public static readonly STOP = 100; - public static readonly READ = 101; - public static readonly WRITE = 102; - public static readonly RESOLVE = 103; - public static readonly CONNECT = 104; - public static readonly DISCONNECT = 105; - public static readonly CALL = 106; - public static readonly WATCH_START = 107; - public static readonly WATCH_STOP = 108; - public static readonly SUBSCRIBE = 109; - public static readonly UNSUBSCRIBE = 110; - public static readonly REGISTER = 111; - public static readonly CRDT = 112; - public static readonly OPTIONAL_ONE = 113; - public static readonly EXACTLY_ONE = 114; - public static readonly MANY_UNIQUE = 115; - public static readonly MANY = 116; - public static readonly ORDERED = 117; - public static readonly UNIT = 118; - public static readonly WATCH_HANDLE = 119; - public static readonly MESSAGE = 120; - public static readonly ATOM_REF = 121; - public static readonly INTERFACE_REF = 122; - public static readonly OPTIONAL = 123; - public static readonly LIST = 124; - public static readonly RECORD = 125; - public static readonly BOOL = 126; - public static readonly BYTES = 127; - public static readonly DOUBLE = 128; - public static readonly INT32 = 129; - public static readonly INT64 = 130; - public static readonly STRING = 131; - public static readonly UINT32 = 132; - public static readonly UINT64 = 133; - public static readonly TRUE = 134; - public static readonly FALSE = 135; - public static readonly NULL = 136; - public static readonly ARROW = 137; - public static readonly COLON = 138; - public static readonly SEMI = 139; - public static readonly COMMA = 140; - public static readonly DOT = 141; - public static readonly LBRACE = 142; - public static readonly RBRACE = 143; - public static readonly LBRACK = 144; - public static readonly RBRACK = 145; - public static readonly LPAREN = 146; - public static readonly RPAREN = 147; - public static readonly LT = 148; - public static readonly GT = 149; - public static readonly AMP = 150; - public static readonly EQUAL = 151; - public static readonly INTEGER = 152; - public static readonly JSON_NUMBER = 153; - public static readonly IDENTIFIER = 154; - public static readonly STRING_LITERAL = 155; - public static readonly LINE_COMMENT = 156; - public static readonly BLOCK_COMMENT = 157; - public static readonly WS = 158; + public static readonly SYMBOL = 45; + public static readonly ATOM = 46; + public static readonly INTERFACE = 47; + public static readonly INTERFACES = 48; + public static readonly PACKAGE = 49; + public static readonly VALUE = 50; + public static readonly FIELD = 51; + public static readonly RELATION = 52; + public static readonly OPERATION = 53; + public static readonly FUNCTION = 54; + public static readonly CONSTRUCTOR = 55; + public static readonly CONSTRUCTS = 56; + public static readonly INPUT = 57; + public static readonly CONFORM = 58; + public static readonly AS = 59; + public static readonly BIND = 60; + public static readonly STATIC = 61; + public static readonly TO = 62; + public static readonly PRIVATE = 63; + public static readonly SHARED = 64; + public static readonly STATE = 65; + public static readonly EDGE = 66; + public static readonly PROJECTION = 67; + public static readonly WITH = 68; + public static readonly USING = 69; + public static readonly ACCEPT = 70; + public static readonly VIA = 71; + public static readonly MATERIALIZE = 72; + public static readonly IF = 73; + public static readonly ABSENT = 74; + public static readonly ON = 75; + public static readonly POLICY = 76; + public static readonly DEFAULT = 77; + public static readonly SOURCE = 78; + public static readonly REPOSITORY = 79; + public static readonly COMMIT = 80; + public static readonly REVISION = 81; + public static readonly SEMANTIC_MAJOR = 82; + public static readonly ON_DELETE = 83; + public static readonly LIFECYCLE = 84; + public static readonly JOURNAL = 85; + public static readonly SUBSCRIPTION = 86; + public static readonly RETAIN_OTHER = 87; + public static readonly KEYED = 88; + public static readonly PUBLIC_TRAVERSAL = 89; + public static readonly ID = 90; + public static readonly DOC = 91; + public static readonly MODE = 92; + public static readonly EMITS = 93; + public static readonly RECEIVER = 94; + public static readonly REQUIRES = 95; + public static readonly ANY = 96; + public static readonly GET = 97; + public static readonly SET = 98; + public static readonly WATCH = 99; + public static readonly START = 100; + public static readonly STOP = 101; + public static readonly READ = 102; + public static readonly WRITE = 103; + public static readonly RESOLVE = 104; + public static readonly CONNECT = 105; + public static readonly DISCONNECT = 106; + public static readonly CALL = 107; + public static readonly WATCH_START = 108; + public static readonly WATCH_STOP = 109; + public static readonly SUBSCRIBE = 110; + public static readonly UNSUBSCRIBE = 111; + public static readonly REGISTER = 112; + public static readonly CRDT = 113; + public static readonly OPTIONAL_ONE = 114; + public static readonly EXACTLY_ONE = 115; + public static readonly MANY_UNIQUE = 116; + public static readonly MANY = 117; + public static readonly ORDERED = 118; + public static readonly UNIT = 119; + public static readonly WATCH_HANDLE = 120; + public static readonly MESSAGE = 121; + public static readonly ATOM_REF = 122; + public static readonly INTERFACE_REF = 123; + public static readonly OPTIONAL = 124; + public static readonly LIST = 125; + public static readonly RECORD = 126; + public static readonly BOOL = 127; + public static readonly BYTES = 128; + public static readonly DOUBLE = 129; + public static readonly INT32 = 130; + public static readonly INT64 = 131; + public static readonly STRING = 132; + public static readonly UINT32 = 133; + public static readonly UINT64 = 134; + public static readonly TRUE = 135; + public static readonly FALSE = 136; + public static readonly NULL = 137; + public static readonly ARROW = 138; + public static readonly COLON = 139; + public static readonly SEMI = 140; + public static readonly COMMA = 141; + public static readonly DOT = 142; + public static readonly LBRACE = 143; + public static readonly RBRACE = 144; + public static readonly LBRACK = 145; + public static readonly RBRACK = 146; + public static readonly LPAREN = 147; + public static readonly RPAREN = 148; + public static readonly LT = 149; + public static readonly GT = 150; + public static readonly AMP = 151; + public static readonly EQUAL = 152; + public static readonly INTEGER = 153; + public static readonly JSON_NUMBER = 154; + public static readonly IDENTIFIER = 155; + public static readonly STRING_LITERAL = 156; + public static readonly LINE_COMMENT = 157; + public static readonly BLOCK_COMMENT = 158; + public static readonly WS = 159; public static readonly RULE_document = 0; public static readonly RULE_fragmentDecl = 1; public static readonly RULE_sourceImportDecl = 2; @@ -176,83 +177,84 @@ export class QuixosCapabilityParser extends antlr.Parser { public static readonly RULE_resourceImportDecl = 5; public static readonly RULE_externalAtomDecl = 6; public static readonly RULE_externalInterfaceDecl = 7; - public static readonly RULE_resourcePreamble = 8; - public static readonly RULE_atomDecl = 9; - public static readonly RULE_interfaceResourceDecl = 10; - public static readonly RULE_typeParameters = 11; - public static readonly RULE_typeParameter = 12; - public static readonly RULE_interfaceType = 13; - public static readonly RULE_typeArguments = 14; - public static readonly RULE_typeArgument = 15; - public static readonly RULE_typeAliasDecl = 16; - public static readonly RULE_interfaceMember = 17; - public static readonly RULE_moduleMember = 18; - public static readonly RULE_operationMember = 19; - public static readonly RULE_valueMember = 20; - public static readonly RULE_valueMemberOperation = 21; - public static readonly RULE_relationshipMember = 22; - public static readonly RULE_queryReadContract = 23; - public static readonly RULE_relationshipOperation = 24; - public static readonly RULE_targetConstraint = 25; - public static readonly RULE_packageResourceDecl = 26; - public static readonly RULE_packageExport = 27; - public static readonly RULE_moduleExport = 28; - public static readonly RULE_presentationDecl = 29; - public static readonly RULE_packageQuery = 30; - public static readonly RULE_packageQuerySpecialization = 31; - public static readonly RULE_queryClause = 32; - public static readonly RULE_fragmentVariable = 33; - public static readonly RULE_packageOperationExport = 34; - public static readonly RULE_packageFunctionExport = 35; - public static readonly RULE_acceptanceClause = 36; - public static readonly RULE_preparationClause = 37; - public static readonly RULE_executionClause = 38; - public static readonly RULE_selectedOperations = 39; - public static readonly RULE_packageConstructorExport = 40; - public static readonly RULE_eventClause = 41; - public static readonly RULE_operationMode = 42; - public static readonly RULE_receiverRequirement = 43; - public static readonly RULE_identifierList = 44; - public static readonly RULE_dependencyBlock = 45; - public static readonly RULE_dependencyPort = 46; - public static readonly RULE_primitiveList = 47; - public static readonly RULE_primitive = 48; - public static readonly RULE_sharedAttachmentDecl = 49; - public static readonly RULE_attachmentDecl = 50; - public static readonly RULE_stateDecl = 51; - public static readonly RULE_storagePolicy = 52; - public static readonly RULE_edgeDecl = 53; - public static readonly RULE_edgeEndpoint = 54; - public static readonly RULE_conformanceDecl = 55; - public static readonly RULE_conformanceSourceArguments = 56; - public static readonly RULE_conformanceItem = 57; - public static readonly RULE_moduleBindingDecl = 58; - public static readonly RULE_initializationDecl = 59; - public static readonly RULE_initializationField = 60; - public static readonly RULE_creationOwnerMapping = 61; - public static readonly RULE_stateFieldBindingDecl = 62; - public static readonly RULE_relationshipMaterializationDecl = 63; - public static readonly RULE_operationBindingDecl = 64; - public static readonly RULE_memberOperationRef = 65; - public static readonly RULE_operationName = 66; - public static readonly RULE_operationProvider = 67; - public static readonly RULE_acceptanceBinding = 68; - public static readonly RULE_statePrimitive = 69; - public static readonly RULE_edgePrimitive = 70; - public static readonly RULE_dependencyBindingBlock = 71; - public static readonly RULE_dependencyBinding = 72; - public static readonly RULE_constructorBindingDecl = 73; - public static readonly RULE_valueType = 74; - public static readonly RULE_recordField = 75; - public static readonly RULE_variantCase = 76; - public static readonly RULE_scalarType = 77; - public static readonly RULE_cardinality = 78; - public static readonly RULE_jsonLiteral = 79; - public static readonly RULE_jsonObject = 80; - public static readonly RULE_jsonMember = 81; - public static readonly RULE_jsonArray = 82; - public static readonly RULE_identifier = 83; - public static readonly RULE_stringLiteral = 84; + public static readonly RULE_symbolDecl = 8; + public static readonly RULE_resourcePreamble = 9; + public static readonly RULE_atomDecl = 10; + public static readonly RULE_interfaceResourceDecl = 11; + public static readonly RULE_typeParameters = 12; + public static readonly RULE_typeParameter = 13; + public static readonly RULE_interfaceType = 14; + public static readonly RULE_typeArguments = 15; + public static readonly RULE_typeArgument = 16; + public static readonly RULE_typeAliasDecl = 17; + public static readonly RULE_interfaceMember = 18; + public static readonly RULE_moduleMember = 19; + public static readonly RULE_operationMember = 20; + public static readonly RULE_valueMember = 21; + public static readonly RULE_valueMemberOperation = 22; + public static readonly RULE_relationshipMember = 23; + public static readonly RULE_queryReadContract = 24; + public static readonly RULE_relationshipOperation = 25; + public static readonly RULE_targetConstraint = 26; + public static readonly RULE_packageResourceDecl = 27; + public static readonly RULE_packageExport = 28; + public static readonly RULE_moduleExport = 29; + public static readonly RULE_presentationDecl = 30; + public static readonly RULE_packageQuery = 31; + public static readonly RULE_packageQuerySpecialization = 32; + public static readonly RULE_queryClause = 33; + public static readonly RULE_fragmentVariable = 34; + public static readonly RULE_packageOperationExport = 35; + public static readonly RULE_packageFunctionExport = 36; + public static readonly RULE_acceptanceClause = 37; + public static readonly RULE_preparationClause = 38; + public static readonly RULE_executionClause = 39; + public static readonly RULE_selectedOperations = 40; + public static readonly RULE_packageConstructorExport = 41; + public static readonly RULE_eventClause = 42; + public static readonly RULE_operationMode = 43; + public static readonly RULE_receiverRequirement = 44; + public static readonly RULE_identifierList = 45; + public static readonly RULE_dependencyBlock = 46; + public static readonly RULE_dependencyPort = 47; + public static readonly RULE_primitiveList = 48; + public static readonly RULE_primitive = 49; + public static readonly RULE_sharedAttachmentDecl = 50; + public static readonly RULE_attachmentDecl = 51; + public static readonly RULE_stateDecl = 52; + public static readonly RULE_storagePolicy = 53; + public static readonly RULE_edgeDecl = 54; + public static readonly RULE_edgeEndpoint = 55; + public static readonly RULE_conformanceDecl = 56; + public static readonly RULE_conformanceSourceArguments = 57; + public static readonly RULE_conformanceItem = 58; + public static readonly RULE_moduleBindingDecl = 59; + public static readonly RULE_initializationDecl = 60; + public static readonly RULE_initializationField = 61; + public static readonly RULE_creationOwnerMapping = 62; + public static readonly RULE_stateFieldBindingDecl = 63; + public static readonly RULE_relationshipMaterializationDecl = 64; + public static readonly RULE_operationBindingDecl = 65; + public static readonly RULE_memberOperationRef = 66; + public static readonly RULE_operationName = 67; + public static readonly RULE_operationProvider = 68; + public static readonly RULE_acceptanceBinding = 69; + public static readonly RULE_statePrimitive = 70; + public static readonly RULE_edgePrimitive = 71; + public static readonly RULE_dependencyBindingBlock = 72; + public static readonly RULE_dependencyBinding = 73; + public static readonly RULE_constructorBindingDecl = 74; + public static readonly RULE_valueType = 75; + public static readonly RULE_recordField = 76; + public static readonly RULE_variantCase = 77; + public static readonly RULE_scalarType = 78; + public static readonly RULE_cardinality = 79; + public static readonly RULE_jsonLiteral = 80; + public static readonly RULE_jsonObject = 81; + public static readonly RULE_jsonMember = 82; + public static readonly RULE_jsonArray = 83; + public static readonly RULE_identifier = 84; + public static readonly RULE_stringLiteral = 85; public static readonly literalNames = [ null, "'edit'", "'module'", "'contract'", "'presentation'", "'subject'", @@ -263,10 +265,10 @@ export class QuixosCapabilityParser extends antlr.Parser { "'root'", "'document'", "'fragments'", "'view'", "'max'", "'allow'", "'poll'", "'queryable'", "'rpc'", "'query-reason'", "'type'", "'object'", "'storable'", "'implements'", "'ref'", "'fragment'", "'import'", - "'external'", "'atom'", "'interface'", "'interfaces'", "'package'", - "'value'", "'field'", "'relation'", "'operation'", "'function'", - "'constructor'", "'constructs'", "'input'", "'conform'", "'as'", - "'bind'", "'static'", "'to'", "'private'", "'shared'", "'state'", + "'external'", "'symbol'", "'atom'", "'interface'", "'interfaces'", + "'package'", "'value'", "'field'", "'relation'", "'operation'", + "'function'", "'constructor'", "'constructs'", "'input'", "'conform'", + "'as'", "'bind'", "'static'", "'to'", "'private'", "'shared'", "'state'", "'edge'", "'projection'", "'with'", "'using'", "'accept'", "'via'", "'materialize'", "'if'", "'absent'", "'on'", "'policy'", "'default'", "'source'", "'repository'", "'commit'", "'revision'", "'semantic-major'", @@ -292,17 +294,17 @@ export class QuixosCapabilityParser extends antlr.Parser { "REFLECTION", "SPECIALIZE", "ROOT", "DOCUMENT", "FRAGMENTS", "VIEW", "MAX", "ALLOW", "POLL", "QUERYABLE", "RPC", "QUERY_REASON", "TYPE", "OBJECT", "STORABLE", "IMPLEMENTS", "REF", "FRAGMENT", "IMPORT", - "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", - "FIELD", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", - "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", "PRIVATE", "SHARED", - "STATE", "EDGE", "PROJECTION", "WITH", "USING", "ACCEPT", "VIA", - "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", - "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", "ON_DELETE", - "LIFECYCLE", "JOURNAL", "SUBSCRIPTION", "RETAIN_OTHER", "KEYED", - "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", - "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", "WRITE", - "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", - "SUBSCRIBE", "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", + "EXTERNAL", "SYMBOL", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", + "VALUE", "FIELD", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", + "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "STATIC", "TO", + "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", "USING", + "ACCEPT", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", + "DEFAULT", "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", + "ON_DELETE", "LIFECYCLE", "JOURNAL", "SUBSCRIPTION", "RETAIN_OTHER", + "KEYED", "PUBLIC_TRAVERSAL", "ID", "DOC", "MODE", "EMITS", "RECEIVER", + "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", + "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", + "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "RECORD", "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", "STRING", "UINT32", @@ -314,13 +316,13 @@ export class QuixosCapabilityParser extends antlr.Parser { public static readonly ruleNames = [ "document", "fragmentDecl", "sourceImportDecl", "workspaceDecl", "workspaceItem", "resourceImportDecl", "externalAtomDecl", "externalInterfaceDecl", - "resourcePreamble", "atomDecl", "interfaceResourceDecl", "typeParameters", - "typeParameter", "interfaceType", "typeArguments", "typeArgument", - "typeAliasDecl", "interfaceMember", "moduleMember", "operationMember", - "valueMember", "valueMemberOperation", "relationshipMember", "queryReadContract", - "relationshipOperation", "targetConstraint", "packageResourceDecl", - "packageExport", "moduleExport", "presentationDecl", "packageQuery", - "packageQuerySpecialization", "queryClause", "fragmentVariable", + "symbolDecl", "resourcePreamble", "atomDecl", "interfaceResourceDecl", + "typeParameters", "typeParameter", "interfaceType", "typeArguments", + "typeArgument", "typeAliasDecl", "interfaceMember", "moduleMember", + "operationMember", "valueMember", "valueMemberOperation", "relationshipMember", + "queryReadContract", "relationshipOperation", "targetConstraint", + "packageResourceDecl", "packageExport", "moduleExport", "presentationDecl", + "packageQuery", "packageQuerySpecialization", "queryClause", "fragmentVariable", "packageOperationExport", "packageFunctionExport", "acceptanceClause", "preparationClause", "executionClause", "selectedOperations", "packageConstructorExport", "eventClause", "operationMode", "receiverRequirement", "identifierList", @@ -354,42 +356,42 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new DocumentContext(this.context, this.state); this.enterRule(localContext, 0, QuixosCapabilityParser.RULE_document); try { - this.state = 182; + this.state = 184; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 0, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 170; + this.state = 172; this.workspaceDecl(); - this.state = 171; + this.state = 173; this.match(QuixosCapabilityParser.EOF); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 173; + this.state = 175; this.interfaceResourceDecl(); - this.state = 174; + this.state = 176; this.match(QuixosCapabilityParser.EOF); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 176; + this.state = 178; this.packageResourceDecl(); - this.state = 177; + this.state = 179; this.match(QuixosCapabilityParser.EOF); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 179; + this.state = 181; this.fragmentDecl(); - this.state = 180; + this.state = 182; this.match(QuixosCapabilityParser.EOF); } break; @@ -415,25 +417,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 184; + this.state = 186; this.match(QuixosCapabilityParser.FRAGMENT); - this.state = 185; + this.state = 187; this.match(QuixosCapabilityParser.LBRACE); - this.state = 189; + this.state = 191; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 4 || ((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & 68288833) !== 0)) { + while (_la === 4 || ((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & 136577601) !== 0)) { { { - this.state = 186; + this.state = 188; this.workspaceItem(); } } - this.state = 191; + this.state = 193; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 192; + this.state = 194; this.match(QuixosCapabilityParser.RBRACE); } } @@ -456,11 +458,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 194; - this.match(QuixosCapabilityParser.IMPORT); - this.state = 195; - this.stringLiteral(); this.state = 196; + this.match(QuixosCapabilityParser.IMPORT); + this.state = 197; + this.stringLiteral(); + this.state = 198; this.match(QuixosCapabilityParser.SEMI); } } @@ -484,39 +486,39 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 198; - this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 199; - this.identifier(); this.state = 200; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.WORKSPACE); this.state = 201; - this.stringLiteral(); + this.identifier(); this.state = 202; - this.match(QuixosCapabilityParser.REVISION); + this.match(QuixosCapabilityParser.ID); this.state = 203; this.stringLiteral(); this.state = 204; - this.match(QuixosCapabilityParser.COMMIT); + this.match(QuixosCapabilityParser.REVISION); this.state = 205; this.stringLiteral(); this.state = 206; + this.match(QuixosCapabilityParser.COMMIT); + this.state = 207; + this.stringLiteral(); + this.state = 208; this.match(QuixosCapabilityParser.LBRACE); - this.state = 210; + this.state = 212; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 4 || ((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & 68288833) !== 0)) { + while (_la === 4 || ((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & 136577601) !== 0)) { { { - this.state = 207; + this.state = 209; this.workspaceItem(); } } - this.state = 212; + this.state = 214; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 213; + this.state = 215; this.match(QuixosCapabilityParser.RBRACE); } } @@ -537,62 +539,62 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new WorkspaceItemContext(this.context, this.state); this.enterRule(localContext, 8, QuixosCapabilityParser.RULE_workspaceItem); try { - this.state = 223; + this.state = 225; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 3, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 215; + this.state = 217; this.sourceImportDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 216; + this.state = 218; this.atomDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 217; + this.state = 219; this.resourceImportDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 218; + this.state = 220; this.sharedAttachmentDecl(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 219; + this.state = 221; this.conformanceDecl(); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 220; + this.state = 222; this.constructorBindingDecl(); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 221; + this.state = 223; this.presentationDecl(); } break; case 8: this.enterOuterAlt(localContext, 8); { - this.state = 222; + this.state = 224; this.typeAliasDecl(); } break; @@ -615,32 +617,32 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ResourceImportDeclContext(this.context, this.state); this.enterRule(localContext, 10, QuixosCapabilityParser.RULE_resourceImportDecl); try { - this.state = 235; + this.state = 237; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 4, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 225; - this.match(QuixosCapabilityParser.IMPORT); - this.state = 226; - this.match(QuixosCapabilityParser.INTERFACE); this.state = 227; - this.identifier(); + this.match(QuixosCapabilityParser.IMPORT); this.state = 228; + this.match(QuixosCapabilityParser.INTERFACE); + this.state = 229; + this.identifier(); + this.state = 230; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 230; - this.match(QuixosCapabilityParser.IMPORT); - this.state = 231; - this.match(QuixosCapabilityParser.PACKAGE); this.state = 232; - this.identifier(); + this.match(QuixosCapabilityParser.IMPORT); this.state = 233; + this.match(QuixosCapabilityParser.PACKAGE); + this.state = 234; + this.identifier(); + this.state = 235; this.match(QuixosCapabilityParser.SEMI); } break; @@ -665,17 +667,17 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 237; - this.match(QuixosCapabilityParser.EXTERNAL); - this.state = 238; - this.match(QuixosCapabilityParser.ATOM); this.state = 239; - this.identifier(); + this.match(QuixosCapabilityParser.EXTERNAL); this.state = 240; - this.match(QuixosCapabilityParser.ID); + this.match(QuixosCapabilityParser.ATOM); this.state = 241; - this.stringLiteral(); + this.identifier(); this.state = 242; + this.match(QuixosCapabilityParser.ID); + this.state = 243; + this.stringLiteral(); + this.state = 244; this.match(QuixosCapabilityParser.SEMI); } } @@ -698,17 +700,48 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 244; - this.match(QuixosCapabilityParser.EXTERNAL); - this.state = 245; - this.match(QuixosCapabilityParser.INTERFACE); this.state = 246; - this.identifier(); + this.match(QuixosCapabilityParser.EXTERNAL); this.state = 247; - this.match(QuixosCapabilityParser.REVISION); + this.match(QuixosCapabilityParser.INTERFACE); this.state = 248; - this.stringLiteral(); + this.identifier(); this.state = 249; + this.match(QuixosCapabilityParser.REVISION); + this.state = 250; + this.stringLiteral(); + this.state = 251; + this.match(QuixosCapabilityParser.SEMI); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public symbolDecl(): SymbolDeclContext { + let localContext = new SymbolDeclContext(this.context, this.state); + this.enterRule(localContext, 16, QuixosCapabilityParser.RULE_symbolDecl); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 253; + this.match(QuixosCapabilityParser.SYMBOL); + this.state = 254; + this.identifier(); + this.state = 255; + this.match(QuixosCapabilityParser.ID); + this.state = 256; + this.stringLiteral(); + this.state = 257; this.match(QuixosCapabilityParser.SEMI); } } @@ -727,36 +760,43 @@ export class QuixosCapabilityParser extends antlr.Parser { } public resourcePreamble(): ResourcePreambleContext { let localContext = new ResourcePreambleContext(this.context, this.state); - this.enterRule(localContext, 16, QuixosCapabilityParser.RULE_resourcePreamble); + this.enterRule(localContext, 18, QuixosCapabilityParser.RULE_resourcePreamble); try { - this.state = 255; + this.state = 264; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 5, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 251; + this.state = 259; this.resourceImportDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 252; + this.state = 260; this.externalAtomDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 253; + this.state = 261; this.externalInterfaceDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 254; + this.state = 262; + this.symbolDecl(); + } + break; + case 5: + this.enterOuterAlt(localContext, 5); + { + this.state = 263; this.typeAliasDecl(); } break; @@ -777,32 +817,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public atomDecl(): AtomDeclContext { let localContext = new AtomDeclContext(this.context, this.state); - this.enterRule(localContext, 18, QuixosCapabilityParser.RULE_atomDecl); + this.enterRule(localContext, 20, QuixosCapabilityParser.RULE_atomDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 257; + this.state = 266; this.match(QuixosCapabilityParser.ATOM); - this.state = 258; + this.state = 267; this.identifier(); - this.state = 259; + this.state = 268; this.match(QuixosCapabilityParser.ID); - this.state = 260; + this.state = 269; this.stringLiteral(); - this.state = 263; + this.state = 272; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 90) { + if (_la === 91) { { - this.state = 261; + this.state = 270; this.match(QuixosCapabilityParser.DOC); - this.state = 262; + this.state = 271; this.stringLiteral(); } } - this.state = 265; + this.state = 274; this.match(QuixosCapabilityParser.SEMI); } } @@ -821,92 +861,92 @@ export class QuixosCapabilityParser extends antlr.Parser { } public interfaceResourceDecl(): InterfaceResourceDeclContext { let localContext = new InterfaceResourceDeclContext(this.context, this.state); - this.enterRule(localContext, 20, QuixosCapabilityParser.RULE_interfaceResourceDecl); + this.enterRule(localContext, 22, QuixosCapabilityParser.RULE_interfaceResourceDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 270; + this.state = 279; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & 193) !== 0)) { + while (((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & 449) !== 0)) { { { - this.state = 267; + this.state = 276; this.resourcePreamble(); } } - this.state = 272; + this.state = 281; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 273; + this.state = 282; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 274; + this.state = 283; this.identifier(); - this.state = 276; + this.state = 285; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 148) { + if (_la === 149) { { - this.state = 275; + this.state = 284; this.typeParameters(); } } - this.state = 278; + this.state = 287; this.match(QuixosCapabilityParser.ID); - this.state = 279; + this.state = 288; this.stringLiteral(); - this.state = 280; + this.state = 289; this.match(QuixosCapabilityParser.REVISION); - this.state = 281; + this.state = 290; this.stringLiteral(); - this.state = 291; + this.state = 300; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 94) { + if (_la === 95) { { - this.state = 282; + this.state = 291; this.match(QuixosCapabilityParser.REQUIRES); - this.state = 283; + this.state = 292; this.interfaceType(); - this.state = 288; + this.state = 297; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 140) { + while (_la === 141) { { { - this.state = 284; + this.state = 293; this.match(QuixosCapabilityParser.COMMA); - this.state = 285; + this.state = 294; this.interfaceType(); } } - this.state = 290; + this.state = 299; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 293; + this.state = 302; this.match(QuixosCapabilityParser.LBRACE); - this.state = 297; + this.state = 306; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 2 || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & 67600385) !== 0)) { + while (_la === 2 || ((((_la - 34)) & ~0x1F) === 0 && ((1 << (_la - 34)) & 135200769) !== 0)) { { { - this.state = 294; + this.state = 303; this.interfaceMember(); } } - this.state = 299; + this.state = 308; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 300; + this.state = 309; this.match(QuixosCapabilityParser.RBRACE); } } @@ -925,32 +965,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public typeParameters(): TypeParametersContext { let localContext = new TypeParametersContext(this.context, this.state); - this.enterRule(localContext, 22, QuixosCapabilityParser.RULE_typeParameters); + this.enterRule(localContext, 24, QuixosCapabilityParser.RULE_typeParameters); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 302; + this.state = 311; this.match(QuixosCapabilityParser.LT); - this.state = 303; + this.state = 312; this.typeParameter(); - this.state = 308; + this.state = 317; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 140) { + while (_la === 141) { { { - this.state = 304; + this.state = 313; this.match(QuixosCapabilityParser.COMMA); - this.state = 305; + this.state = 314; this.typeParameter(); } } - this.state = 310; + this.state = 319; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 311; + this.state = 320; this.match(QuixosCapabilityParser.GT); } } @@ -969,27 +1009,27 @@ export class QuixosCapabilityParser extends antlr.Parser { } public typeParameter(): TypeParameterContext { let localContext = new TypeParameterContext(this.context, this.state); - this.enterRule(localContext, 24, QuixosCapabilityParser.RULE_typeParameter); + this.enterRule(localContext, 26, QuixosCapabilityParser.RULE_typeParameter); let _la: number; try { - this.state = 332; + this.state = 341; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.VALUE: this.enterOuterAlt(localContext, 1); { - this.state = 313; + this.state = 322; this.match(QuixosCapabilityParser.VALUE); - this.state = 314; + this.state = 323; this.identifier(); - this.state = 317; + this.state = 326; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 138) { + if (_la === 139) { { - this.state = 315; + this.state = 324; this.match(QuixosCapabilityParser.COLON); - this.state = 316; + this.state = 325; this.match(QuixosCapabilityParser.STORABLE); } } @@ -999,32 +1039,32 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 2); { - this.state = 319; + this.state = 328; this.match(QuixosCapabilityParser.OBJECT); - this.state = 320; + this.state = 329; this.identifier(); - this.state = 330; + this.state = 339; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 40) { { - this.state = 321; + this.state = 330; this.match(QuixosCapabilityParser.IMPLEMENTS); - this.state = 322; + this.state = 331; this.interfaceType(); - this.state = 327; + this.state = 336; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 150) { + while (_la === 151) { { { - this.state = 323; + this.state = 332; this.match(QuixosCapabilityParser.AMP); - this.state = 324; + this.state = 333; this.interfaceType(); } } - this.state = 329; + this.state = 338; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } @@ -1052,19 +1092,19 @@ export class QuixosCapabilityParser extends antlr.Parser { } public interfaceType(): InterfaceTypeContext { let localContext = new InterfaceTypeContext(this.context, this.state); - this.enterRule(localContext, 26, QuixosCapabilityParser.RULE_interfaceType); + this.enterRule(localContext, 28, QuixosCapabilityParser.RULE_interfaceType); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 334; + this.state = 343; this.identifier(); - this.state = 336; + this.state = 345; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 148) { + if (_la === 149) { { - this.state = 335; + this.state = 344; this.typeArguments(); } } @@ -1086,32 +1126,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public typeArguments(): TypeArgumentsContext { let localContext = new TypeArgumentsContext(this.context, this.state); - this.enterRule(localContext, 28, QuixosCapabilityParser.RULE_typeArguments); + this.enterRule(localContext, 30, QuixosCapabilityParser.RULE_typeArguments); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 338; + this.state = 347; this.match(QuixosCapabilityParser.LT); - this.state = 339; + this.state = 348; this.typeArgument(); - this.state = 344; + this.state = 353; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 140) { + while (_la === 141) { { { - this.state = 340; + this.state = 349; this.match(QuixosCapabilityParser.COMMA); - this.state = 341; + this.state = 350; this.typeArgument(); } } - this.state = 346; + this.state = 355; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 347; + this.state = 356; this.match(QuixosCapabilityParser.GT); } } @@ -1130,35 +1170,35 @@ export class QuixosCapabilityParser extends antlr.Parser { } public typeArgument(): TypeArgumentContext { let localContext = new TypeArgumentContext(this.context, this.state); - this.enterRule(localContext, 30, QuixosCapabilityParser.RULE_typeArgument); + this.enterRule(localContext, 32, QuixosCapabilityParser.RULE_typeArgument); try { - this.state = 356; + this.state = 365; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 1); { - this.state = 349; + this.state = 358; this.match(QuixosCapabilityParser.ATOM); - this.state = 350; + this.state = 359; this.identifier(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 2); { - this.state = 351; + this.state = 360; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 352; + this.state = 361; this.interfaceType(); } break; case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 353; + this.state = 362; this.match(QuixosCapabilityParser.OBJECT); - this.state = 354; + this.state = 363; this.identifier(); } break; @@ -1222,7 +1262,7 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 4); { - this.state = 355; + this.state = 364; this.valueType(); } break; @@ -1245,30 +1285,30 @@ export class QuixosCapabilityParser extends antlr.Parser { } public typeAliasDecl(): TypeAliasDeclContext { let localContext = new TypeAliasDeclContext(this.context, this.state); - this.enterRule(localContext, 32, QuixosCapabilityParser.RULE_typeAliasDecl); + this.enterRule(localContext, 34, QuixosCapabilityParser.RULE_typeAliasDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 358; + this.state = 367; this.match(QuixosCapabilityParser.TYPE); - this.state = 359; + this.state = 368; this.identifier(); - this.state = 361; + this.state = 370; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 148) { + if (_la === 149) { { - this.state = 360; + this.state = 369; this.typeParameters(); } } - this.state = 363; + this.state = 372; this.match(QuixosCapabilityParser.EQUAL); - this.state = 364; + this.state = 373; this.valueType(); - this.state = 365; + this.state = 374; this.match(QuixosCapabilityParser.SEMI); } } @@ -1287,36 +1327,36 @@ export class QuixosCapabilityParser extends antlr.Parser { } public interfaceMember(): InterfaceMemberContext { let localContext = new InterfaceMemberContext(this.context, this.state); - this.enterRule(localContext, 34, QuixosCapabilityParser.RULE_interfaceMember); + this.enterRule(localContext, 36, QuixosCapabilityParser.RULE_interfaceMember); try { - this.state = 371; + this.state = 380; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 21, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 367; + this.state = 376; this.valueMember(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 368; + this.state = 377; this.relationshipMember(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 369; + this.state = 378; this.operationMember(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 370; + this.state = 379; this.moduleMember(); } break; @@ -1337,36 +1377,36 @@ export class QuixosCapabilityParser extends antlr.Parser { } public moduleMember(): ModuleMemberContext { let localContext = new ModuleMemberContext(this.context, this.state); - this.enterRule(localContext, 36, QuixosCapabilityParser.RULE_moduleMember); + this.enterRule(localContext, 38, QuixosCapabilityParser.RULE_moduleMember); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 373; + this.state = 382; this.match(QuixosCapabilityParser.MODULE); - this.state = 374; + this.state = 383; this.identifier(); - this.state = 375; + this.state = 384; this.match(QuixosCapabilityParser.ID); - this.state = 376; + this.state = 385; this.stringLiteral(); - this.state = 377; + this.state = 386; this.match(QuixosCapabilityParser.CONTRACT); - this.state = 378; + this.state = 387; this.stringLiteral(); - this.state = 381; + this.state = 390; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 5) { { - this.state = 379; + this.state = 388; this.match(QuixosCapabilityParser.SUBJECT); - this.state = 380; + this.state = 389; this.targetConstraint(); } } - this.state = 383; + this.state = 392; this.match(QuixosCapabilityParser.SEMI); } } @@ -1385,58 +1425,58 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationMember(): OperationMemberContext { let localContext = new OperationMemberContext(this.context, this.state); - this.enterRule(localContext, 38, QuixosCapabilityParser.RULE_operationMember); + this.enterRule(localContext, 40, QuixosCapabilityParser.RULE_operationMember); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 386; + this.state = 395; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 60) { + if (_la === 61) { { - this.state = 385; + this.state = 394; this.match(QuixosCapabilityParser.STATIC); } } - this.state = 388; - this.match(QuixosCapabilityParser.OPERATION); - this.state = 389; - this.identifier(); - this.state = 390; - this.match(QuixosCapabilityParser.ID); - this.state = 391; - this.stringLiteral(); - this.state = 392; - this.match(QuixosCapabilityParser.COLON); - this.state = 393; - this.valueType(); - this.state = 394; - this.match(QuixosCapabilityParser.ARROW); - this.state = 395; - this.valueType(); - this.state = 396; - this.match(QuixosCapabilityParser.LBRACE); this.state = 397; - this.match(QuixosCapabilityParser.CALL); + this.match(QuixosCapabilityParser.OPERATION); this.state = 398; - this.match(QuixosCapabilityParser.ID); + this.identifier(); this.state = 399; + this.match(QuixosCapabilityParser.ID); + this.state = 400; this.stringLiteral(); this.state = 401; + this.match(QuixosCapabilityParser.COLON); + this.state = 402; + this.valueType(); + this.state = 403; + this.match(QuixosCapabilityParser.ARROW); + this.state = 404; + this.valueType(); + this.state = 405; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 406; + this.match(QuixosCapabilityParser.CALL); + this.state = 407; + this.match(QuixosCapabilityParser.ID); + this.state = 408; + this.stringLiteral(); + this.state = 410; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 12) { { - this.state = 400; + this.state = 409; this.executionClause(); } } - this.state = 403; + this.state = 412; this.match(QuixosCapabilityParser.SEMI); - this.state = 404; + this.state = 413; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1455,57 +1495,57 @@ export class QuixosCapabilityParser extends antlr.Parser { } public valueMember(): ValueMemberContext { let localContext = new ValueMemberContext(this.context, this.state); - this.enterRule(localContext, 40, QuixosCapabilityParser.RULE_valueMember); + this.enterRule(localContext, 42, QuixosCapabilityParser.RULE_valueMember); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 407; + this.state = 416; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 34) { { - this.state = 406; + this.state = 415; this.queryReadContract(); } } - this.state = 409; + this.state = 418; _la = this.tokenStream.LA(1); - if(!(_la === 49 || _la === 50)) { + if(!(_la === 50 || _la === 51)) { this.errorHandler.recoverInline(this); } else { this.errorHandler.reportMatch(this); this.consume(); } - this.state = 410; - this.identifier(); - this.state = 411; - this.match(QuixosCapabilityParser.ID); - this.state = 412; - this.stringLiteral(); - this.state = 413; - this.match(QuixosCapabilityParser.COLON); - this.state = 414; - this.valueType(); - this.state = 415; - this.match(QuixosCapabilityParser.LBRACE); this.state = 419; + this.identifier(); + this.state = 420; + this.match(QuixosCapabilityParser.ID); + this.state = 421; + this.stringLiteral(); + this.state = 422; + this.match(QuixosCapabilityParser.COLON); + this.state = 423; + this.valueType(); + this.state = 424; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 428; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 1 || ((((_la - 96)) & ~0x1F) === 0 && ((1 << (_la - 96)) & 7) !== 0)) { + while (_la === 1 || ((((_la - 97)) & ~0x1F) === 0 && ((1 << (_la - 97)) & 7) !== 0)) { { { - this.state = 416; + this.state = 425; this.valueMemberOperation(); } } - this.state = 421; + this.state = 430; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 422; + this.state = 431; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1524,99 +1564,99 @@ export class QuixosCapabilityParser extends antlr.Parser { } public valueMemberOperation(): ValueMemberOperationContext { let localContext = new ValueMemberOperationContext(this.context, this.state); - this.enterRule(localContext, 42, QuixosCapabilityParser.RULE_valueMemberOperation); + this.enterRule(localContext, 44, QuixosCapabilityParser.RULE_valueMemberOperation); let _la: number; try { - this.state = 457; + this.state = 466; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.GET: this.enterOuterAlt(localContext, 1); { - this.state = 424; + this.state = 433; this.match(QuixosCapabilityParser.GET); - this.state = 425; + this.state = 434; this.match(QuixosCapabilityParser.ID); - this.state = 426; + this.state = 435; this.stringLiteral(); - this.state = 428; + this.state = 437; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 12) { { - this.state = 427; + this.state = 436; this.executionClause(); } } - this.state = 430; + this.state = 439; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.SET: this.enterOuterAlt(localContext, 2); { - this.state = 432; + this.state = 441; this.match(QuixosCapabilityParser.SET); - this.state = 433; + this.state = 442; this.match(QuixosCapabilityParser.ID); - this.state = 434; + this.state = 443; this.stringLiteral(); - this.state = 436; + this.state = 445; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 12) { { - this.state = 435; + this.state = 444; this.executionClause(); } } - this.state = 438; + this.state = 447; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.EDIT: this.enterOuterAlt(localContext, 3); { - this.state = 440; + this.state = 449; this.match(QuixosCapabilityParser.EDIT); - this.state = 441; + this.state = 450; this.match(QuixosCapabilityParser.ID); - this.state = 442; + this.state = 451; this.stringLiteral(); - this.state = 444; + this.state = 453; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 12) { { - this.state = 443; + this.state = 452; this.executionClause(); } } - this.state = 446; + this.state = 455; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 4); { - this.state = 448; + this.state = 457; this.match(QuixosCapabilityParser.WATCH); - this.state = 449; + this.state = 458; this.match(QuixosCapabilityParser.START); - this.state = 450; + this.state = 459; this.match(QuixosCapabilityParser.ID); - this.state = 451; + this.state = 460; this.stringLiteral(); - this.state = 452; + this.state = 461; this.match(QuixosCapabilityParser.STOP); - this.state = 453; + this.state = 462; this.match(QuixosCapabilityParser.ID); - this.state = 454; + this.state = 463; this.stringLiteral(); - this.state = 455; + this.state = 464; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1639,74 +1679,74 @@ export class QuixosCapabilityParser extends antlr.Parser { } public relationshipMember(): RelationshipMemberContext { let localContext = new RelationshipMemberContext(this.context, this.state); - this.enterRule(localContext, 44, QuixosCapabilityParser.RULE_relationshipMember); + this.enterRule(localContext, 46, QuixosCapabilityParser.RULE_relationshipMember); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 460; + this.state = 469; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 34) { { - this.state = 459; + this.state = 468; this.queryReadContract(); } } - this.state = 462; + this.state = 471; this.match(QuixosCapabilityParser.RELATION); - this.state = 463; + this.state = 472; this.identifier(); - this.state = 464; + this.state = 473; this.match(QuixosCapabilityParser.ID); - this.state = 465; + this.state = 474; this.stringLiteral(); - this.state = 466; + this.state = 475; this.match(QuixosCapabilityParser.COLON); - this.state = 467; + this.state = 476; this.cardinality(); - this.state = 468; + this.state = 477; this.targetConstraint(); - this.state = 470; + this.state = 479; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 117) { + if (_la === 118) { { - this.state = 469; + this.state = 478; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 474; + this.state = 483; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 87) { + if (_la === 88) { { - this.state = 472; + this.state = 481; this.match(QuixosCapabilityParser.KEYED); - this.state = 473; + this.state = 482; this.stringLiteral(); } } - this.state = 476; + this.state = 485; this.match(QuixosCapabilityParser.LBRACE); - this.state = 480; + this.state = 489; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 98)) & ~0x1F) === 0 && ((1 << (_la - 98)) & 225) !== 0)) { + while (((((_la - 99)) & ~0x1F) === 0 && ((1 << (_la - 99)) & 225) !== 0)) { { { - this.state = 477; + this.state = 486; this.relationshipOperation(); } } - this.state = 482; + this.state = 491; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 483; + this.state = 492; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1725,19 +1765,19 @@ export class QuixosCapabilityParser extends antlr.Parser { } public queryReadContract(): QueryReadContractContext { let localContext = new QueryReadContractContext(this.context, this.state); - this.enterRule(localContext, 46, QuixosCapabilityParser.RULE_queryReadContract); + this.enterRule(localContext, 48, QuixosCapabilityParser.RULE_queryReadContract); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 485; + this.state = 494; this.match(QuixosCapabilityParser.QUERYABLE); - this.state = 487; + this.state = 496; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 17 || _la === 35) { { - this.state = 486; + this.state = 495; _la = this.tokenStream.LA(1); if(!(_la === 17 || _la === 35)) { this.errorHandler.recoverInline(this); @@ -1766,99 +1806,99 @@ export class QuixosCapabilityParser extends antlr.Parser { } public relationshipOperation(): RelationshipOperationContext { let localContext = new RelationshipOperationContext(this.context, this.state); - this.enterRule(localContext, 48, QuixosCapabilityParser.RULE_relationshipOperation); + this.enterRule(localContext, 50, QuixosCapabilityParser.RULE_relationshipOperation); let _la: number; try { - this.state = 522; + this.state = 531; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.RESOLVE: this.enterOuterAlt(localContext, 1); { - this.state = 489; + this.state = 498; this.match(QuixosCapabilityParser.RESOLVE); - this.state = 490; + this.state = 499; this.match(QuixosCapabilityParser.ID); - this.state = 491; + this.state = 500; this.stringLiteral(); - this.state = 493; + this.state = 502; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 12) { { - this.state = 492; + this.state = 501; this.executionClause(); } } - this.state = 495; + this.state = 504; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONNECT: this.enterOuterAlt(localContext, 2); { - this.state = 497; + this.state = 506; this.match(QuixosCapabilityParser.CONNECT); - this.state = 498; + this.state = 507; this.match(QuixosCapabilityParser.ID); - this.state = 499; + this.state = 508; this.stringLiteral(); - this.state = 501; + this.state = 510; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 12) { { - this.state = 500; + this.state = 509; this.executionClause(); } } - this.state = 503; + this.state = 512; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.DISCONNECT: this.enterOuterAlt(localContext, 3); { - this.state = 505; + this.state = 514; this.match(QuixosCapabilityParser.DISCONNECT); - this.state = 506; + this.state = 515; this.match(QuixosCapabilityParser.ID); - this.state = 507; + this.state = 516; this.stringLiteral(); - this.state = 509; + this.state = 518; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 12) { { - this.state = 508; + this.state = 517; this.executionClause(); } } - this.state = 511; + this.state = 520; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 4); { - this.state = 513; + this.state = 522; this.match(QuixosCapabilityParser.WATCH); - this.state = 514; + this.state = 523; this.match(QuixosCapabilityParser.START); - this.state = 515; + this.state = 524; this.match(QuixosCapabilityParser.ID); - this.state = 516; + this.state = 525; this.stringLiteral(); - this.state = 517; + this.state = 526; this.match(QuixosCapabilityParser.STOP); - this.state = 518; + this.state = 527; this.match(QuixosCapabilityParser.ID); - this.state = 519; + this.state = 528; this.stringLiteral(); - this.state = 520; + this.state = 529; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1881,34 +1921,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public targetConstraint(): TargetConstraintContext { let localContext = new TargetConstraintContext(this.context, this.state); - this.enterRule(localContext, 50, QuixosCapabilityParser.RULE_targetConstraint); + this.enterRule(localContext, 52, QuixosCapabilityParser.RULE_targetConstraint); let _la: number; try { - this.state = 533; + this.state = 542; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 1); { - this.state = 524; + this.state = 533; this.match(QuixosCapabilityParser.ATOM); - this.state = 525; + this.state = 534; this.identifier(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 2); { - this.state = 526; + this.state = 535; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 527; + this.state = 536; this.identifier(); - this.state = 529; + this.state = 538; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 148) { + if (_la === 149) { { - this.state = 528; + this.state = 537; this.typeArguments(); } } @@ -1918,9 +1958,9 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 531; + this.state = 540; this.match(QuixosCapabilityParser.OBJECT); - this.state = 532; + this.state = 541; this.identifier(); } break; @@ -1943,66 +1983,66 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageResourceDecl(): PackageResourceDeclContext { let localContext = new PackageResourceDeclContext(this.context, this.state); - this.enterRule(localContext, 52, QuixosCapabilityParser.RULE_packageResourceDecl); + this.enterRule(localContext, 54, QuixosCapabilityParser.RULE_packageResourceDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 538; + this.state = 547; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & 193) !== 0)) { + while (((((_la - 37)) & ~0x1F) === 0 && ((1 << (_la - 37)) & 449) !== 0)) { { { - this.state = 535; + this.state = 544; this.resourcePreamble(); } } - this.state = 540; + this.state = 549; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 541; + this.state = 550; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 542; + this.state = 551; this.identifier(); - this.state = 543; + this.state = 552; this.match(QuixosCapabilityParser.ID); - this.state = 544; + this.state = 553; this.stringLiteral(); - this.state = 545; + this.state = 554; this.match(QuixosCapabilityParser.REVISION); - this.state = 546; + this.state = 555; this.stringLiteral(); - this.state = 549; + this.state = 558; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 81) { + if (_la === 82) { { - this.state = 547; + this.state = 556; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); - this.state = 548; + this.state = 557; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 551; + this.state = 560; this.match(QuixosCapabilityParser.LBRACE); - this.state = 555; + this.state = 564; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 2 || _la === 24 || ((((_la - 52)) & ~0x1F) === 0 && ((1 << (_la - 52)) & 7) !== 0)) { + while (_la === 2 || _la === 24 || ((((_la - 53)) & ~0x1F) === 0 && ((1 << (_la - 53)) & 7) !== 0)) { { { - this.state = 552; + this.state = 561; this.packageExport(); } } - this.state = 557; + this.state = 566; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 558; + this.state = 567; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2021,50 +2061,50 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageExport(): PackageExportContext { let localContext = new PackageExportContext(this.context, this.state); - this.enterRule(localContext, 54, QuixosCapabilityParser.RULE_packageExport); + this.enterRule(localContext, 56, QuixosCapabilityParser.RULE_packageExport); try { - this.state = 566; + this.state = 575; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 45, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 560; + this.state = 569; this.packageOperationExport(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 561; + this.state = 570; this.packageFunctionExport(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 562; + this.state = 571; this.packageConstructorExport(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 563; + this.state = 572; this.packageQuery(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 564; + this.state = 573; this.packageQuerySpecialization(); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 565; + this.state = 574; this.moduleExport(); } break; @@ -2085,27 +2125,27 @@ export class QuixosCapabilityParser extends antlr.Parser { } public moduleExport(): ModuleExportContext { let localContext = new ModuleExportContext(this.context, this.state); - this.enterRule(localContext, 56, QuixosCapabilityParser.RULE_moduleExport); + this.enterRule(localContext, 58, QuixosCapabilityParser.RULE_moduleExport); try { this.enterOuterAlt(localContext, 1); { - this.state = 568; + this.state = 577; this.match(QuixosCapabilityParser.MODULE); - this.state = 569; + this.state = 578; this.identifier(); - this.state = 570; + this.state = 579; this.match(QuixosCapabilityParser.ID); - this.state = 571; + this.state = 580; this.stringLiteral(); - this.state = 572; + this.state = 581; this.match(QuixosCapabilityParser.IMPLEMENTS); - this.state = 573; + this.state = 582; this.interfaceType(); - this.state = 574; + this.state = 583; this.match(QuixosCapabilityParser.DOT); - this.state = 575; + this.state = 584; this.identifier(); - this.state = 576; + this.state = 585; this.match(QuixosCapabilityParser.SEMI); } } @@ -2124,31 +2164,31 @@ export class QuixosCapabilityParser extends antlr.Parser { } public presentationDecl(): PresentationDeclContext { let localContext = new PresentationDeclContext(this.context, this.state); - this.enterRule(localContext, 58, QuixosCapabilityParser.RULE_presentationDecl); + this.enterRule(localContext, 60, QuixosCapabilityParser.RULE_presentationDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 578; - this.match(QuixosCapabilityParser.PRESENTATION); - this.state = 579; - this.identifier(); - this.state = 580; - this.match(QuixosCapabilityParser.ID); - this.state = 581; - this.stringLiteral(); - this.state = 582; - this.match(QuixosCapabilityParser.FOR); - this.state = 583; - this.interfaceType(); - this.state = 584; - this.match(QuixosCapabilityParser.USING); - this.state = 585; - this.identifier(); - this.state = 586; - this.match(QuixosCapabilityParser.DOT); this.state = 587; - this.identifier(); + this.match(QuixosCapabilityParser.PRESENTATION); this.state = 588; + this.identifier(); + this.state = 589; + this.match(QuixosCapabilityParser.ID); + this.state = 590; + this.stringLiteral(); + this.state = 591; + this.match(QuixosCapabilityParser.FOR); + this.state = 592; + this.interfaceType(); + this.state = 593; + this.match(QuixosCapabilityParser.USING); + this.state = 594; + this.identifier(); + this.state = 595; + this.match(QuixosCapabilityParser.DOT); + this.state = 596; + this.identifier(); + this.state = 597; this.match(QuixosCapabilityParser.SEMI); } } @@ -2167,132 +2207,132 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageQuery(): PackageQueryContext { let localContext = new PackageQueryContext(this.context, this.state); - this.enterRule(localContext, 60, QuixosCapabilityParser.RULE_packageQuery); + this.enterRule(localContext, 62, QuixosCapabilityParser.RULE_packageQuery); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 590; + this.state = 599; this.match(QuixosCapabilityParser.QUERY); - this.state = 592; + this.state = 601; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 46, this.context) ) { case 1: { - this.state = 591; + this.state = 600; this.match(QuixosCapabilityParser.FRAGMENT); } break; } - this.state = 594; + this.state = 603; this.identifier(); - this.state = 596; + this.state = 605; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 148) { + if (_la === 149) { { - this.state = 595; + this.state = 604; this.typeParameters(); } } - this.state = 598; + this.state = 607; this.match(QuixosCapabilityParser.ID); - this.state = 599; + this.state = 608; this.stringLiteral(); - this.state = 600; + this.state = 609; this.match(QuixosCapabilityParser.ROOT); - this.state = 602; + this.state = 611; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 11) { { - this.state = 601; + this.state = 610; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 604; + this.state = 613; this.interfaceType(); - this.state = 605; + this.state = 614; this.match(QuixosCapabilityParser.DOCUMENT); - this.state = 606; + this.state = 615; this.stringLiteral(); - this.state = 635; + this.state = 644; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.OPERATION: { - this.state = 607; + this.state = 616; this.match(QuixosCapabilityParser.OPERATION); - this.state = 608; + this.state = 617; this.stringLiteral(); - this.state = 609; + this.state = 618; this.match(QuixosCapabilityParser.LBRACE); - this.state = 613; + this.state = 622; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 18)) & ~0x1F) === 0 && ((1 << (_la - 18)) & 63491) !== 0) || _la === 98) { + while (((((_la - 18)) & ~0x1F) === 0 && ((1 << (_la - 18)) & 63491) !== 0) || _la === 99) { { { - this.state = 610; + this.state = 619; this.queryClause(); } } - this.state = 615; + this.state = 624; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 616; + this.state = 625; this.match(QuixosCapabilityParser.RBRACE); } break; case QuixosCapabilityParser.FRAGMENT: { - this.state = 618; + this.state = 627; this.match(QuixosCapabilityParser.FRAGMENT); - this.state = 619; + this.state = 628; this.stringLiteral(); - this.state = 622; + this.state = 631; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 52) { + if (_la === 53) { { - this.state = 620; + this.state = 629; this.match(QuixosCapabilityParser.OPERATION); - this.state = 621; + this.state = 630; this.stringLiteral(); } } - this.state = 633; + this.state = 642; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.LBRACE: { - this.state = 624; + this.state = 633; this.match(QuixosCapabilityParser.LBRACE); - this.state = 628; + this.state = 637; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 18)) & ~0x1F) === 0 && ((1 << (_la - 18)) & 63491) !== 0) || _la === 98) { + while (((((_la - 18)) & ~0x1F) === 0 && ((1 << (_la - 18)) & 63491) !== 0) || _la === 99) { { { - this.state = 625; + this.state = 634; this.queryClause(); } } - this.state = 630; + this.state = 639; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 631; + this.state = 640; this.match(QuixosCapabilityParser.RBRACE); } break; case QuixosCapabilityParser.SEMI: { - this.state = 632; + this.state = 641; this.match(QuixosCapabilityParser.SEMI); } break; @@ -2321,25 +2361,25 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageQuerySpecialization(): PackageQuerySpecializationContext { let localContext = new PackageQuerySpecializationContext(this.context, this.state); - this.enterRule(localContext, 62, QuixosCapabilityParser.RULE_packageQuerySpecialization); + this.enterRule(localContext, 64, QuixosCapabilityParser.RULE_packageQuerySpecialization); try { this.enterOuterAlt(localContext, 1); { - this.state = 637; + this.state = 646; this.match(QuixosCapabilityParser.QUERY); - this.state = 638; + this.state = 647; this.identifier(); - this.state = 639; + this.state = 648; this.match(QuixosCapabilityParser.ID); - this.state = 640; + this.state = 649; this.stringLiteral(); - this.state = 641; + this.state = 650; this.match(QuixosCapabilityParser.SPECIALIZE); - this.state = 642; + this.state = 651; this.identifier(); - this.state = 643; + this.state = 652; this.typeArguments(); - this.state = 644; + this.state = 653; this.match(QuixosCapabilityParser.SEMI); } } @@ -2358,164 +2398,164 @@ export class QuixosCapabilityParser extends antlr.Parser { } public queryClause(): QueryClauseContext { let localContext = new QueryClauseContext(this.context, this.state); - this.enterRule(localContext, 64, QuixosCapabilityParser.RULE_queryClause); + this.enterRule(localContext, 66, QuixosCapabilityParser.RULE_queryClause); let _la: number; try { - this.state = 703; + this.state = 712; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 57, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 646; + this.state = 655; this.match(QuixosCapabilityParser.REPLICA); - this.state = 647; + this.state = 656; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 648; + this.state = 657; this.match(QuixosCapabilityParser.LOCAL); - this.state = 649; + this.state = 658; this.match(QuixosCapabilityParser.FROM); - this.state = 650; + this.state = 659; this.identifier(); - this.state = 651; + this.state = 660; this.match(QuixosCapabilityParser.SEMI); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 653; + this.state = 662; this.match(QuixosCapabilityParser.FRAGMENTS); - this.state = 654; + this.state = 663; this.stringLiteral(); - this.state = 655; + this.state = 664; this.match(QuixosCapabilityParser.SEMI); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 657; + this.state = 666; this.match(QuixosCapabilityParser.FRAGMENTS); - this.state = 658; + this.state = 667; this.identifier(); - this.state = 659; + this.state = 668; this.match(QuixosCapabilityParser.DOT); - this.state = 660; + this.state = 669; this.identifier(); - this.state = 670; + this.state = 679; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 67) { + if (_la === 68) { { - this.state = 661; + this.state = 670; this.match(QuixosCapabilityParser.WITH); - this.state = 662; + this.state = 671; this.match(QuixosCapabilityParser.LBRACE); - this.state = 666; + this.state = 675; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 146801025) !== 0) || _la === 111 || _la === 120 || _la === 154) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 66575) !== 0) || ((((_la - 78)) & ~0x1F) === 0 && ((1 << (_la - 78)) & 146801025) !== 0) || _la === 112 || _la === 121 || _la === 155) { { { - this.state = 663; + this.state = 672; this.fragmentVariable(); } } - this.state = 668; + this.state = 677; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 669; + this.state = 678; this.match(QuixosCapabilityParser.RBRACE); } } - this.state = 672; + this.state = 681; this.match(QuixosCapabilityParser.SEMI); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 674; + this.state = 683; this.match(QuixosCapabilityParser.VIEW); - this.state = 676; + this.state = 685; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 38) { { - this.state = 675; + this.state = 684; this.match(QuixosCapabilityParser.OBJECT); } } - this.state = 678; + this.state = 687; this.identifier(); - this.state = 679; + this.state = 688; this.match(QuixosCapabilityParser.AS); - this.state = 680; + this.state = 689; this.interfaceType(); - this.state = 681; + this.state = 690; this.match(QuixosCapabilityParser.SEMI); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 683; + this.state = 692; this.match(QuixosCapabilityParser.MAX); - this.state = 684; + this.state = 693; this.identifier(); - this.state = 685; + this.state = 694; this.match(QuixosCapabilityParser.INTEGER); - this.state = 686; + this.state = 695; this.match(QuixosCapabilityParser.SEMI); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 688; + this.state = 697; this.match(QuixosCapabilityParser.ALLOW); - this.state = 689; + this.state = 698; this.interfaceType(); - this.state = 690; + this.state = 699; this.match(QuixosCapabilityParser.DOT); - this.state = 691; + this.state = 700; this.identifier(); - this.state = 692; + this.state = 701; this.identifier(); - this.state = 693; + this.state = 702; this.stringLiteral(); - this.state = 694; + this.state = 703; this.match(QuixosCapabilityParser.SEMI); } break; case 8: this.enterOuterAlt(localContext, 8); { - this.state = 696; + this.state = 705; this.match(QuixosCapabilityParser.WATCH); - this.state = 697; + this.state = 706; this.match(QuixosCapabilityParser.SEMI); } break; case 9: this.enterOuterAlt(localContext, 9); { - this.state = 698; + this.state = 707; this.match(QuixosCapabilityParser.POLL); - this.state = 699; + this.state = 708; this.match(QuixosCapabilityParser.INTEGER); - this.state = 700; + this.state = 709; this.stringLiteral(); - this.state = 701; + this.state = 710; this.match(QuixosCapabilityParser.SEMI); } break; @@ -2536,17 +2576,17 @@ export class QuixosCapabilityParser extends antlr.Parser { } public fragmentVariable(): FragmentVariableContext { let localContext = new FragmentVariableContext(this.context, this.state); - this.enterRule(localContext, 66, QuixosCapabilityParser.RULE_fragmentVariable); + this.enterRule(localContext, 68, QuixosCapabilityParser.RULE_fragmentVariable); try { this.enterOuterAlt(localContext, 1); { - this.state = 705; + this.state = 714; this.identifier(); - this.state = 706; + this.state = 715; this.match(QuixosCapabilityParser.TO); - this.state = 707; + this.state = 716; this.identifier(); - this.state = 708; + this.state = 717; this.match(QuixosCapabilityParser.SEMI); } } @@ -2565,96 +2605,96 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageOperationExport(): PackageOperationExportContext { let localContext = new PackageOperationExportContext(this.context, this.state); - this.enterRule(localContext, 68, QuixosCapabilityParser.RULE_packageOperationExport); + this.enterRule(localContext, 70, QuixosCapabilityParser.RULE_packageOperationExport); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 710; + this.state = 719; this.match(QuixosCapabilityParser.OPERATION); - this.state = 711; + this.state = 720; this.identifier(); - this.state = 713; + this.state = 722; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 148) { + if (_la === 149) { { - this.state = 712; + this.state = 721; this.typeParameters(); } } - this.state = 715; - this.match(QuixosCapabilityParser.ID); - this.state = 716; - this.stringLiteral(); - this.state = 717; - this.match(QuixosCapabilityParser.COLON); - this.state = 718; - this.valueType(); - this.state = 719; - this.match(QuixosCapabilityParser.ARROW); - this.state = 720; - this.valueType(); - this.state = 721; - this.match(QuixosCapabilityParser.MODE); - this.state = 722; - this.operationMode(); this.state = 724; + this.match(QuixosCapabilityParser.ID); + this.state = 725; + this.stringLiteral(); + this.state = 726; + this.match(QuixosCapabilityParser.COLON); + this.state = 727; + this.valueType(); + this.state = 728; + this.match(QuixosCapabilityParser.ARROW); + this.state = 729; + this.valueType(); + this.state = 730; + this.match(QuixosCapabilityParser.MODE); + this.state = 731; + this.operationMode(); + this.state = 733; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 12) { { - this.state = 723; + this.state = 732; this.executionClause(); } } - this.state = 727; + this.state = 736; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 92) { + if (_la === 93) { { - this.state = 726; + this.state = 735; this.eventClause(); } } - this.state = 729; + this.state = 738; this.match(QuixosCapabilityParser.RECEIVER); - this.state = 730; + this.state = 739; this.receiverRequirement(); - this.state = 732; + this.state = 741; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 94) { + if (_la === 95) { { - this.state = 731; + this.state = 740; this.dependencyBlock(); } } - this.state = 735; + this.state = 744; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 9) { { - this.state = 734; + this.state = 743; this.preparationClause(); } } - this.state = 738; + this.state = 747; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 69) { + if (_la === 70) { { - this.state = 737; + this.state = 746; this.acceptanceClause(); } } - this.state = 740; + this.state = 749; this.match(QuixosCapabilityParser.SEMI); } } @@ -2673,78 +2713,78 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageFunctionExport(): PackageFunctionExportContext { let localContext = new PackageFunctionExportContext(this.context, this.state); - this.enterRule(localContext, 70, QuixosCapabilityParser.RULE_packageFunctionExport); + this.enterRule(localContext, 72, QuixosCapabilityParser.RULE_packageFunctionExport); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 742; + this.state = 751; this.match(QuixosCapabilityParser.FUNCTION); - this.state = 743; + this.state = 752; this.identifier(); - this.state = 745; + this.state = 754; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 148) { + if (_la === 149) { { - this.state = 744; + this.state = 753; this.typeParameters(); } } - this.state = 747; + this.state = 756; this.match(QuixosCapabilityParser.ID); - this.state = 748; + this.state = 757; this.stringLiteral(); - this.state = 749; + this.state = 758; this.match(QuixosCapabilityParser.COLON); - this.state = 750; + this.state = 759; this.valueType(); - this.state = 751; + this.state = 760; this.match(QuixosCapabilityParser.ARROW); - this.state = 752; + this.state = 761; this.valueType(); - this.state = 754; + this.state = 763; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 12) { { - this.state = 753; + this.state = 762; this.executionClause(); } } - this.state = 757; + this.state = 766; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 94) { + if (_la === 95) { { - this.state = 756; + this.state = 765; this.dependencyBlock(); } } - this.state = 760; + this.state = 769; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 9) { { - this.state = 759; + this.state = 768; this.preparationClause(); } } - this.state = 763; + this.state = 772; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 69) { + if (_la === 70) { { - this.state = 762; + this.state = 771; this.acceptanceClause(); } } - this.state = 765; + this.state = 774; this.match(QuixosCapabilityParser.SEMI); } } @@ -2763,15 +2803,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public acceptanceClause(): AcceptanceClauseContext { let localContext = new AcceptanceClauseContext(this.context, this.state); - this.enterRule(localContext, 72, QuixosCapabilityParser.RULE_acceptanceClause); + this.enterRule(localContext, 74, QuixosCapabilityParser.RULE_acceptanceClause); try { this.enterOuterAlt(localContext, 1); { - this.state = 767; + this.state = 776; this.match(QuixosCapabilityParser.ACCEPT); - this.state = 768; + this.state = 777; this.match(QuixosCapabilityParser.USING); - this.state = 769; + this.state = 778; this.identifier(); } } @@ -2790,19 +2830,19 @@ export class QuixosCapabilityParser extends antlr.Parser { } public preparationClause(): PreparationClauseContext { let localContext = new PreparationClauseContext(this.context, this.state); - this.enterRule(localContext, 74, QuixosCapabilityParser.RULE_preparationClause); + this.enterRule(localContext, 76, QuixosCapabilityParser.RULE_preparationClause); try { this.enterOuterAlt(localContext, 1); { - this.state = 771; + this.state = 780; this.match(QuixosCapabilityParser.PREPARES); - this.state = 772; + this.state = 781; this.match(QuixosCapabilityParser.CREATION); - this.state = 773; + this.state = 782; this.identifier(); - this.state = 774; + this.state = 783; this.match(QuixosCapabilityParser.USING); - this.state = 775; + this.state = 784; this.stringLiteral(); } } @@ -2821,27 +2861,27 @@ export class QuixosCapabilityParser extends antlr.Parser { } public executionClause(): ExecutionClauseContext { let localContext = new ExecutionClauseContext(this.context, this.state); - this.enterRule(localContext, 76, QuixosCapabilityParser.RULE_executionClause); + this.enterRule(localContext, 78, QuixosCapabilityParser.RULE_executionClause); let _la: number; try { - this.state = 786; + this.state = 797; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 69, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 70, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 777; + this.state = 786; this.match(QuixosCapabilityParser.EXECUTION); - this.state = 778; + this.state = 787; this.match(QuixosCapabilityParser.REMOTE); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 779; + this.state = 788; this.match(QuixosCapabilityParser.EXECUTION); - this.state = 780; + this.state = 789; _la = this.tokenStream.LA(1); if(!(_la === 13 || _la === 14)) { this.errorHandler.recoverInline(this); @@ -2850,14 +2890,22 @@ export class QuixosCapabilityParser extends antlr.Parser { this.errorHandler.reportMatch(this); this.consume(); } - this.state = 781; - this.match(QuixosCapabilityParser.TARGETS); - this.state = 782; - this.match(QuixosCapabilityParser.LBRACK); - this.state = 783; - this.identifierList(); - this.state = 784; - this.match(QuixosCapabilityParser.RBRACK); + this.state = 795; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 16) { + { + this.state = 790; + this.match(QuixosCapabilityParser.TARGETS); + this.state = 791; + this.match(QuixosCapabilityParser.LBRACK); + this.state = 792; + this.identifierList(); + this.state = 793; + this.match(QuixosCapabilityParser.RBRACK); + } + } + } break; } @@ -2877,34 +2925,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public selectedOperations(): SelectedOperationsContext { let localContext = new SelectedOperationsContext(this.context, this.state); - this.enterRule(localContext, 78, QuixosCapabilityParser.RULE_selectedOperations); + this.enterRule(localContext, 80, QuixosCapabilityParser.RULE_selectedOperations); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 788; + this.state = 799; this.match(QuixosCapabilityParser.USING); - this.state = 789; + this.state = 800; this.match(QuixosCapabilityParser.LBRACK); - this.state = 790; + this.state = 801; this.memberOperationRef(); - this.state = 795; + this.state = 806; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 140) { + while (_la === 141) { { { - this.state = 791; + this.state = 802; this.match(QuixosCapabilityParser.COMMA); - this.state = 792; + this.state = 803; this.memberOperationRef(); } } - this.state = 797; + this.state = 808; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 798; + this.state = 809; this.match(QuixosCapabilityParser.RBRACK); } } @@ -2923,38 +2971,38 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageConstructorExport(): PackageConstructorExportContext { let localContext = new PackageConstructorExportContext(this.context, this.state); - this.enterRule(localContext, 80, QuixosCapabilityParser.RULE_packageConstructorExport); + this.enterRule(localContext, 82, QuixosCapabilityParser.RULE_packageConstructorExport); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 800; + this.state = 811; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 801; + this.state = 812; this.identifier(); - this.state = 802; + this.state = 813; this.match(QuixosCapabilityParser.ID); - this.state = 803; + this.state = 814; this.stringLiteral(); - this.state = 804; + this.state = 815; this.match(QuixosCapabilityParser.CONSTRUCTS); - this.state = 805; + this.state = 816; this.identifier(); - this.state = 806; + this.state = 817; this.match(QuixosCapabilityParser.COLON); - this.state = 807; + this.state = 818; this.valueType(); - this.state = 809; + this.state = 820; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 94) { + if (_la === 95) { { - this.state = 808; + this.state = 819; this.dependencyBlock(); } } - this.state = 811; + this.state = 822; this.match(QuixosCapabilityParser.SEMI); } } @@ -2973,13 +3021,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public eventClause(): EventClauseContext { let localContext = new EventClauseContext(this.context, this.state); - this.enterRule(localContext, 82, QuixosCapabilityParser.RULE_eventClause); + this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_eventClause); try { this.enterOuterAlt(localContext, 1); { - this.state = 813; + this.state = 824; this.match(QuixosCapabilityParser.EMITS); - this.state = 814; + this.state = 825; this.valueType(); } } @@ -2998,14 +3046,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationMode(): OperationModeContext { let localContext = new OperationModeContext(this.context, this.state); - this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_operationMode); + this.enterRule(localContext, 86, QuixosCapabilityParser.RULE_operationMode); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 816; + this.state = 827; _la = this.tokenStream.LA(1); - if(!(((((_la - 106)) & ~0x1F) === 0 && ((1 << (_la - 106)) & 31) !== 0))) { + if(!(((((_la - 107)) & ~0x1F) === 0 && ((1 << (_la - 107)) & 31) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -3029,71 +3077,71 @@ export class QuixosCapabilityParser extends antlr.Parser { } public receiverRequirement(): ReceiverRequirementContext { let localContext = new ReceiverRequirementContext(this.context, this.state); - this.enterRule(localContext, 86, QuixosCapabilityParser.RULE_receiverRequirement); + this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_receiverRequirement); let _la: number; try { - this.state = 836; + this.state = 847; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ANY: this.enterOuterAlt(localContext, 1); { - this.state = 818; + this.state = 829; this.match(QuixosCapabilityParser.ANY); } break; case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 2); { - this.state = 819; + this.state = 830; this.match(QuixosCapabilityParser.ATOM); - this.state = 820; + this.state = 831; this.identifier(); } break; case QuixosCapabilityParser.OBJECT: this.enterOuterAlt(localContext, 3); { - this.state = 821; + this.state = 832; this.match(QuixosCapabilityParser.OBJECT); - this.state = 822; + this.state = 833; this.identifier(); } break; case QuixosCapabilityParser.INTERFACES: this.enterOuterAlt(localContext, 4); { - this.state = 823; + this.state = 834; this.match(QuixosCapabilityParser.INTERFACES); - this.state = 824; + this.state = 835; this.match(QuixosCapabilityParser.LBRACK); - this.state = 833; + this.state = 844; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 146801025) !== 0) || _la === 111 || _la === 120 || _la === 154) { + if ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 66575) !== 0) || ((((_la - 78)) & ~0x1F) === 0 && ((1 << (_la - 78)) & 146801025) !== 0) || _la === 112 || _la === 121 || _la === 155) { { - this.state = 825; + this.state = 836; this.interfaceType(); - this.state = 830; + this.state = 841; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 140) { + while (_la === 141) { { { - this.state = 826; + this.state = 837; this.match(QuixosCapabilityParser.COMMA); - this.state = 827; + this.state = 838; this.interfaceType(); } } - this.state = 832; + this.state = 843; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 835; + this.state = 846; this.match(QuixosCapabilityParser.RBRACK); } break; @@ -3116,26 +3164,26 @@ export class QuixosCapabilityParser extends antlr.Parser { } public identifierList(): IdentifierListContext { let localContext = new IdentifierListContext(this.context, this.state); - this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_identifierList); + this.enterRule(localContext, 90, QuixosCapabilityParser.RULE_identifierList); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 838; + this.state = 849; this.identifier(); - this.state = 843; + this.state = 854; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 140) { + while (_la === 141) { { { - this.state = 839; + this.state = 850; this.match(QuixosCapabilityParser.COMMA); - this.state = 840; + this.state = 851; this.identifier(); } } - this.state = 845; + this.state = 856; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } @@ -3156,30 +3204,30 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBlock(): DependencyBlockContext { let localContext = new DependencyBlockContext(this.context, this.state); - this.enterRule(localContext, 90, QuixosCapabilityParser.RULE_dependencyBlock); + this.enterRule(localContext, 92, QuixosCapabilityParser.RULE_dependencyBlock); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 846; + this.state = 857; this.match(QuixosCapabilityParser.REQUIRES); - this.state = 847; + this.state = 858; this.match(QuixosCapabilityParser.LBRACE); - this.state = 851; + this.state = 862; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 50331776) !== 0) || ((((_la - 46)) & ~0x1F) === 0 && ((1 << (_la - 46)) & 786689) !== 0)) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 50331776) !== 0) || ((((_la - 47)) & ~0x1F) === 0 && ((1 << (_la - 47)) & 786689) !== 0)) { { { - this.state = 848; + this.state = 859; this.dependencyPort(); } } - this.state = 853; + this.state = 864; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 854; + this.state = 865; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3198,214 +3246,214 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyPort(): DependencyPortContext { let localContext = new DependencyPortContext(this.context, this.state); - this.enterRule(localContext, 92, QuixosCapabilityParser.RULE_dependencyPort); + this.enterRule(localContext, 94, QuixosCapabilityParser.RULE_dependencyPort); let _la: number; try { - this.state = 938; + this.state = 949; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REFLECTION: this.enterOuterAlt(localContext, 1); { - this.state = 856; + this.state = 867; this.match(QuixosCapabilityParser.REFLECTION); - this.state = 857; + this.state = 868; this.identifier(); - this.state = 858; + this.state = 869; this.match(QuixosCapabilityParser.ID); - this.state = 859; + this.state = 870; this.stringLiteral(); - this.state = 860; + this.state = 871; this.match(QuixosCapabilityParser.LBRACK); - this.state = 861; + this.state = 872; this.identifierList(); - this.state = 862; + this.state = 873; this.match(QuixosCapabilityParser.RBRACK); - this.state = 863; + this.state = 874; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 2); { - this.state = 865; + this.state = 876; this.match(QuixosCapabilityParser.STATE); - this.state = 866; + this.state = 877; this.identifier(); - this.state = 867; + this.state = 878; this.match(QuixosCapabilityParser.ID); - this.state = 868; + this.state = 879; this.stringLiteral(); - this.state = 869; + this.state = 880; this.match(QuixosCapabilityParser.COLON); - this.state = 870; + this.state = 881; this.valueType(); - this.state = 871; + this.state = 882; this.primitiveList(); - this.state = 872; + this.state = 883; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 3); { - this.state = 874; + this.state = 885; this.match(QuixosCapabilityParser.EDGE); - this.state = 875; + this.state = 886; this.identifier(); - this.state = 876; + this.state = 887; this.match(QuixosCapabilityParser.ID); - this.state = 877; + this.state = 888; this.stringLiteral(); - this.state = 878; + this.state = 889; this.match(QuixosCapabilityParser.COLON); - this.state = 879; + this.state = 890; this.cardinality(); - this.state = 880; + this.state = 891; this.targetConstraint(); - this.state = 883; + this.state = 894; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 87) { + if (_la === 88) { { - this.state = 881; + this.state = 892; this.match(QuixosCapabilityParser.KEYED); - this.state = 882; + this.state = 893; this.stringLiteral(); } } - this.state = 885; + this.state = 896; this.primitiveList(); - this.state = 886; + this.state = 897; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 4); { - this.state = 888; + this.state = 899; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 889; + this.state = 900; this.identifier(); - this.state = 890; + this.state = 901; this.match(QuixosCapabilityParser.ID); - this.state = 891; + this.state = 902; this.stringLiteral(); - this.state = 892; + this.state = 903; this.match(QuixosCapabilityParser.COLON); - this.state = 893; + this.state = 904; this.identifier(); - this.state = 895; + this.state = 906; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 148) { + if (_la === 149) { { - this.state = 894; + this.state = 905; this.typeArguments(); } } - this.state = 898; + this.state = 909; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 68) { + if (_la === 69) { { - this.state = 897; + this.state = 908; this.selectedOperations(); } } - this.state = 902; + this.state = 913; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 20) { { - this.state = 900; + this.state = 911; this.match(QuixosCapabilityParser.FROM); - this.state = 901; + this.state = 912; this.match(QuixosCapabilityParser.INPUT); } } - this.state = 904; + this.state = 915; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CREATION: this.enterOuterAlt(localContext, 5); { - this.state = 906; + this.state = 917; this.match(QuixosCapabilityParser.CREATION); - this.state = 907; + this.state = 918; this.identifier(); - this.state = 908; + this.state = 919; this.match(QuixosCapabilityParser.ID); - this.state = 909; + this.state = 920; this.stringLiteral(); - this.state = 910; + this.state = 921; this.match(QuixosCapabilityParser.COLON); - this.state = 911; + this.state = 922; this.identifier(); - this.state = 912; + this.state = 923; this.match(QuixosCapabilityParser.INPUT); - this.state = 913; + this.state = 924; this.valueType(); - this.state = 914; + this.state = 925; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONSTRUCTOR: this.enterOuterAlt(localContext, 6); { - this.state = 916; + this.state = 927; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 917; + this.state = 928; this.identifier(); - this.state = 918; + this.state = 929; this.match(QuixosCapabilityParser.ID); - this.state = 919; + this.state = 930; this.stringLiteral(); - this.state = 920; + this.state = 931; this.match(QuixosCapabilityParser.COLON); - this.state = 921; + this.state = 932; this.identifier(); - this.state = 924; + this.state = 935; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 56) { + if (_la === 57) { { - this.state = 922; + this.state = 933; this.match(QuixosCapabilityParser.INPUT); - this.state = 923; + this.state = 934; this.valueType(); } } - this.state = 926; + this.state = 937; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.QUERY: this.enterOuterAlt(localContext, 7); { - this.state = 928; + this.state = 939; this.match(QuixosCapabilityParser.QUERY); - this.state = 929; + this.state = 940; this.identifier(); - this.state = 930; + this.state = 941; this.match(QuixosCapabilityParser.ID); - this.state = 931; + this.state = 942; this.stringLiteral(); - this.state = 932; + this.state = 943; this.match(QuixosCapabilityParser.COLON); - this.state = 933; + this.state = 944; this.identifier(); - this.state = 934; + this.state = 945; this.match(QuixosCapabilityParser.DOT); - this.state = 935; + this.state = 946; this.identifier(); - this.state = 936; + this.state = 947; this.match(QuixosCapabilityParser.SEMI); } break; @@ -3428,32 +3476,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public primitiveList(): PrimitiveListContext { let localContext = new PrimitiveListContext(this.context, this.state); - this.enterRule(localContext, 94, QuixosCapabilityParser.RULE_primitiveList); + this.enterRule(localContext, 96, QuixosCapabilityParser.RULE_primitiveList); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 940; + this.state = 951; this.match(QuixosCapabilityParser.LBRACK); - this.state = 941; + this.state = 952; this.primitive(); - this.state = 946; + this.state = 957; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 140) { + while (_la === 141) { { { - this.state = 942; + this.state = 953; this.match(QuixosCapabilityParser.COMMA); - this.state = 943; + this.state = 954; this.primitive(); } } - this.state = 948; + this.state = 959; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 949; + this.state = 960; this.match(QuixosCapabilityParser.RBRACK); } } @@ -3472,14 +3520,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public primitive(): PrimitiveContext { let localContext = new PrimitiveContext(this.context, this.state); - this.enterRule(localContext, 96, QuixosCapabilityParser.RULE_primitive); + this.enterRule(localContext, 98, QuixosCapabilityParser.RULE_primitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 951; + this.state = 962; _la = this.tokenStream.LA(1); - if(!(_la === 1 || ((((_la - 101)) & ~0x1F) === 0 && ((1 << (_la - 101)) & 223) !== 0))) { + if(!(_la === 1 || ((((_la - 102)) & ~0x1F) === 0 && ((1 << (_la - 102)) & 223) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -3503,13 +3551,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public sharedAttachmentDecl(): SharedAttachmentDeclContext { let localContext = new SharedAttachmentDeclContext(this.context, this.state); - this.enterRule(localContext, 98, QuixosCapabilityParser.RULE_sharedAttachmentDecl); + this.enterRule(localContext, 100, QuixosCapabilityParser.RULE_sharedAttachmentDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 953; + this.state = 964; this.match(QuixosCapabilityParser.SHARED); - this.state = 954; + this.state = 965; this.attachmentDecl(); } } @@ -3528,22 +3576,22 @@ export class QuixosCapabilityParser extends antlr.Parser { } public attachmentDecl(): AttachmentDeclContext { let localContext = new AttachmentDeclContext(this.context, this.state); - this.enterRule(localContext, 100, QuixosCapabilityParser.RULE_attachmentDecl); + this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_attachmentDecl); try { - this.state = 958; + this.state = 969; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 956; + this.state = 967; this.stateDecl(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 957; + this.state = 968; this.edgeDecl(); } break; @@ -3566,44 +3614,44 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stateDecl(): StateDeclContext { let localContext = new StateDeclContext(this.context, this.state); - this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_stateDecl); + this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_stateDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 960; + this.state = 971; this.match(QuixosCapabilityParser.STATE); - this.state = 961; - this.identifier(); - this.state = 962; - this.match(QuixosCapabilityParser.ID); - this.state = 963; - this.stringLiteral(); - this.state = 964; - this.match(QuixosCapabilityParser.ON); - this.state = 965; - this.identifier(); - this.state = 966; - this.match(QuixosCapabilityParser.COLON); - this.state = 967; - this.valueType(); - this.state = 968; - this.match(QuixosCapabilityParser.POLICY); - this.state = 969; - this.storagePolicy(); this.state = 972; + this.identifier(); + this.state = 973; + this.match(QuixosCapabilityParser.ID); + this.state = 974; + this.stringLiteral(); + this.state = 975; + this.match(QuixosCapabilityParser.ON); + this.state = 976; + this.identifier(); + this.state = 977; + this.match(QuixosCapabilityParser.COLON); + this.state = 978; + this.valueType(); + this.state = 979; + this.match(QuixosCapabilityParser.POLICY); + this.state = 980; + this.storagePolicy(); + this.state = 983; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 76) { + if (_la === 77) { { - this.state = 970; + this.state = 981; this.match(QuixosCapabilityParser.DEFAULT); - this.state = 971; + this.state = 982; this.jsonLiteral(); } } - this.state = 974; + this.state = 985; this.match(QuixosCapabilityParser.SEMI); } } @@ -3622,50 +3670,50 @@ export class QuixosCapabilityParser extends antlr.Parser { } public storagePolicy(): StoragePolicyContext { let localContext = new StoragePolicyContext(this.context, this.state); - this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_storagePolicy); + this.enterRule(localContext, 106, QuixosCapabilityParser.RULE_storagePolicy); try { - this.state = 989; + this.state = 1000; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.REGISTER: this.enterOuterAlt(localContext, 1); { - this.state = 976; + this.state = 987; this.match(QuixosCapabilityParser.REGISTER); } break; case QuixosCapabilityParser.CRDT: this.enterOuterAlt(localContext, 2); { - this.state = 977; + this.state = 988; this.match(QuixosCapabilityParser.CRDT); - this.state = 978; + this.state = 989; this.match(QuixosCapabilityParser.LPAREN); - this.state = 979; + this.state = 990; this.valueType(); - this.state = 980; + this.state = 991; this.match(QuixosCapabilityParser.RPAREN); } break; case QuixosCapabilityParser.JOURNAL: this.enterOuterAlt(localContext, 3); { - this.state = 982; + this.state = 993; this.match(QuixosCapabilityParser.JOURNAL); - this.state = 983; + this.state = 994; this.jsonObject(); } break; case QuixosCapabilityParser.SUBSCRIPTION: this.enterOuterAlt(localContext, 4); { - this.state = 984; + this.state = 995; this.match(QuixosCapabilityParser.SUBSCRIPTION); - this.state = 985; + this.state = 996; this.match(QuixosCapabilityParser.LPAREN); - this.state = 986; + this.state = 997; this.valueType(); - this.state = 987; + this.state = 998; this.match(QuixosCapabilityParser.RPAREN); } break; @@ -3688,25 +3736,25 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgeDecl(): EdgeDeclContext { let localContext = new EdgeDeclContext(this.context, this.state); - this.enterRule(localContext, 106, QuixosCapabilityParser.RULE_edgeDecl); + this.enterRule(localContext, 108, QuixosCapabilityParser.RULE_edgeDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 991; + this.state = 1002; this.match(QuixosCapabilityParser.EDGE); - this.state = 992; + this.state = 1003; this.identifier(); - this.state = 993; + this.state = 1004; this.match(QuixosCapabilityParser.ID); - this.state = 994; + this.state = 1005; this.stringLiteral(); - this.state = 995; + this.state = 1006; this.match(QuixosCapabilityParser.LBRACE); - this.state = 996; + this.state = 1007; this.edgeEndpoint(); - this.state = 997; + this.state = 1008; this.edgeEndpoint(); - this.state = 998; + this.state = 1009; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3725,78 +3773,78 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgeEndpoint(): EdgeEndpointContext { let localContext = new EdgeEndpointContext(this.context, this.state); - this.enterRule(localContext, 108, QuixosCapabilityParser.RULE_edgeEndpoint); + this.enterRule(localContext, 110, QuixosCapabilityParser.RULE_edgeEndpoint); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1000; + this.state = 1011; this.targetConstraint(); - this.state = 1001; + this.state = 1012; this.match(QuixosCapabilityParser.PROJECTION); - this.state = 1002; + this.state = 1013; this.identifier(); - this.state = 1003; + this.state = 1014; this.match(QuixosCapabilityParser.ID); - this.state = 1004; + this.state = 1015; this.stringLiteral(); - this.state = 1005; + this.state = 1016; this.cardinality(); - this.state = 1007; + this.state = 1018; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 117) { + if (_la === 118) { { - this.state = 1006; + this.state = 1017; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 1011; + this.state = 1022; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 82) { + if (_la === 83) { { - this.state = 1009; + this.state = 1020; this.match(QuixosCapabilityParser.ON_DELETE); - this.state = 1010; + this.state = 1021; this.stringLiteral(); } } - this.state = 1014; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 86) { - { - this.state = 1013; - this.match(QuixosCapabilityParser.RETAIN_OTHER); - } - } - - this.state = 1018; + this.state = 1025; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 87) { { - this.state = 1016; - this.match(QuixosCapabilityParser.KEYED); - this.state = 1017; - this.stringLiteral(); + this.state = 1024; + this.match(QuixosCapabilityParser.RETAIN_OTHER); } } - this.state = 1021; + this.state = 1029; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 88) { { - this.state = 1020; + this.state = 1027; + this.match(QuixosCapabilityParser.KEYED); + this.state = 1028; + this.stringLiteral(); + } + } + + this.state = 1032; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 89) { + { + this.state = 1031; this.match(QuixosCapabilityParser.PUBLIC_TRAVERSAL); } } - this.state = 1023; + this.state = 1034; this.match(QuixosCapabilityParser.SEMI); } } @@ -3815,90 +3863,90 @@ export class QuixosCapabilityParser extends antlr.Parser { } public conformanceDecl(): ConformanceDeclContext { let localContext = new ConformanceDeclContext(this.context, this.state); - this.enterRule(localContext, 110, QuixosCapabilityParser.RULE_conformanceDecl); + this.enterRule(localContext, 112, QuixosCapabilityParser.RULE_conformanceDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1025; + this.state = 1036; this.match(QuixosCapabilityParser.CONFORM); - this.state = 1027; + this.state = 1038; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 148) { + if (_la === 149) { { - this.state = 1026; + this.state = 1037; this.typeParameters(); } } - this.state = 1029; + this.state = 1040; this.identifier(); - this.state = 1031; + this.state = 1042; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 148) { + if (_la === 149) { { - this.state = 1030; + this.state = 1041; this.conformanceSourceArguments(); } } - this.state = 1033; + this.state = 1044; this.match(QuixosCapabilityParser.AS); - this.state = 1034; + this.state = 1045; this.identifier(); - this.state = 1036; + this.state = 1047; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 148) { + if (_la === 149) { { - this.state = 1035; + this.state = 1046; this.typeArguments(); } } - this.state = 1040; + this.state = 1051; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 89) { + if (_la === 90) { { - this.state = 1038; + this.state = 1049; this.match(QuixosCapabilityParser.ID); - this.state = 1039; + this.state = 1050; this.stringLiteral(); } } - this.state = 1044; + this.state = 1055; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 81) { + if (_la === 82) { { - this.state = 1042; + this.state = 1053; this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); - this.state = 1043; + this.state = 1054; this.match(QuixosCapabilityParser.INTEGER); } } - this.state = 1046; + this.state = 1057; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1050; + this.state = 1061; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 10 || ((((_la - 59)) & ~0x1F) === 0 && ((1 << (_la - 59)) & 4105) !== 0)) { + while (_la === 10 || ((((_la - 60)) & ~0x1F) === 0 && ((1 << (_la - 60)) & 4105) !== 0)) { { { - this.state = 1047; + this.state = 1058; this.conformanceItem(); } } - this.state = 1052; + this.state = 1063; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1053; + this.state = 1064; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3917,11 +3965,11 @@ export class QuixosCapabilityParser extends antlr.Parser { } public conformanceSourceArguments(): ConformanceSourceArgumentsContext { let localContext = new ConformanceSourceArgumentsContext(this.context, this.state); - this.enterRule(localContext, 112, QuixosCapabilityParser.RULE_conformanceSourceArguments); + this.enterRule(localContext, 114, QuixosCapabilityParser.RULE_conformanceSourceArguments); try { this.enterOuterAlt(localContext, 1); { - this.state = 1055; + this.state = 1066; this.typeArguments(); } } @@ -3940,52 +3988,52 @@ export class QuixosCapabilityParser extends antlr.Parser { } public conformanceItem(): ConformanceItemContext { let localContext = new ConformanceItemContext(this.context, this.state); - this.enterRule(localContext, 114, QuixosCapabilityParser.RULE_conformanceItem); + this.enterRule(localContext, 116, QuixosCapabilityParser.RULE_conformanceItem); try { - this.state = 1064; + this.state = 1075; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 98, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 99, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1057; + this.state = 1068; this.match(QuixosCapabilityParser.PRIVATE); - this.state = 1058; + this.state = 1069; this.attachmentDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1059; + this.state = 1070; this.operationBindingDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1060; + this.state = 1071; this.stateFieldBindingDecl(); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1061; + this.state = 1072; this.initializationDecl(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1062; + this.state = 1073; this.relationshipMaterializationDecl(); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1063; + this.state = 1074; this.moduleBindingDecl(); } break; @@ -4006,23 +4054,23 @@ export class QuixosCapabilityParser extends antlr.Parser { } public moduleBindingDecl(): ModuleBindingDeclContext { let localContext = new ModuleBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 116, QuixosCapabilityParser.RULE_moduleBindingDecl); + this.enterRule(localContext, 118, QuixosCapabilityParser.RULE_moduleBindingDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 1066; + this.state = 1077; this.match(QuixosCapabilityParser.BIND); - this.state = 1067; + this.state = 1078; this.identifier(); - this.state = 1068; + this.state = 1079; this.match(QuixosCapabilityParser.TO); - this.state = 1069; + this.state = 1080; this.identifier(); - this.state = 1070; + this.state = 1081; this.match(QuixosCapabilityParser.DOT); - this.state = 1071; + this.state = 1082; this.identifier(); - this.state = 1072; + this.state = 1083; this.match(QuixosCapabilityParser.SEMI); } } @@ -4041,32 +4089,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public initializationDecl(): InitializationDeclContext { let localContext = new InitializationDeclContext(this.context, this.state); - this.enterRule(localContext, 118, QuixosCapabilityParser.RULE_initializationDecl); + this.enterRule(localContext, 120, QuixosCapabilityParser.RULE_initializationDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1074; + this.state = 1085; this.match(QuixosCapabilityParser.INITIALIZE); - this.state = 1075; + this.state = 1086; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1079; + this.state = 1090; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 146801025) !== 0) || _la === 111 || _la === 120 || _la === 154) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 66575) !== 0) || ((((_la - 78)) & ~0x1F) === 0 && ((1 << (_la - 78)) & 146801025) !== 0) || _la === 112 || _la === 121 || _la === 155) { { { - this.state = 1076; + this.state = 1087; this.initializationField(); } } - this.state = 1081; + this.state = 1092; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1082; + this.state = 1093; this.match(QuixosCapabilityParser.RBRACE); - this.state = 1083; + this.state = 1094; this.match(QuixosCapabilityParser.SEMI); } } @@ -4085,42 +4133,42 @@ export class QuixosCapabilityParser extends antlr.Parser { } public initializationField(): InitializationFieldContext { let localContext = new InitializationFieldContext(this.context, this.state); - this.enterRule(localContext, 120, QuixosCapabilityParser.RULE_initializationField); + this.enterRule(localContext, 122, QuixosCapabilityParser.RULE_initializationField); try { - this.state = 1099; + this.state = 1110; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 100, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 101, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1085; + this.state = 1096; this.identifier(); - this.state = 1086; + this.state = 1097; this.match(QuixosCapabilityParser.TO); - this.state = 1087; + this.state = 1098; this.match(QuixosCapabilityParser.STATE); - this.state = 1088; + this.state = 1099; this.identifier(); - this.state = 1089; + this.state = 1100; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1091; + this.state = 1102; this.identifier(); - this.state = 1092; + this.state = 1103; this.match(QuixosCapabilityParser.TO); - this.state = 1093; + this.state = 1104; this.match(QuixosCapabilityParser.EDGE); - this.state = 1094; + this.state = 1105; this.identifier(); - this.state = 1095; + this.state = 1106; this.match(QuixosCapabilityParser.DOT); - this.state = 1096; + this.state = 1107; this.identifier(); - this.state = 1097; + this.state = 1108; this.match(QuixosCapabilityParser.SEMI); } break; @@ -4141,34 +4189,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public creationOwnerMapping(): CreationOwnerMappingContext { let localContext = new CreationOwnerMappingContext(this.context, this.state); - this.enterRule(localContext, 122, QuixosCapabilityParser.RULE_creationOwnerMapping); + this.enterRule(localContext, 124, QuixosCapabilityParser.RULE_creationOwnerMapping); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1101; + this.state = 1112; this.interfaceType(); - this.state = 1102; + this.state = 1113; this.match(QuixosCapabilityParser.FROM); - this.state = 1103; + this.state = 1114; this.match(QuixosCapabilityParser.INPUT); - this.state = 1108; + this.state = 1119; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 141) { + while (_la === 142) { { { - this.state = 1104; + this.state = 1115; this.match(QuixosCapabilityParser.DOT); - this.state = 1105; + this.state = 1116; this.identifier(); } } - this.state = 1110; + this.state = 1121; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1111; + this.state = 1122; this.match(QuixosCapabilityParser.SEMI); } } @@ -4187,21 +4235,21 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stateFieldBindingDecl(): StateFieldBindingDeclContext { let localContext = new StateFieldBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 124, QuixosCapabilityParser.RULE_stateFieldBindingDecl); + this.enterRule(localContext, 126, QuixosCapabilityParser.RULE_stateFieldBindingDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 1113; + this.state = 1124; this.match(QuixosCapabilityParser.BIND); - this.state = 1114; + this.state = 1125; this.identifier(); - this.state = 1115; + this.state = 1126; this.match(QuixosCapabilityParser.TO); - this.state = 1116; + this.state = 1127; this.match(QuixosCapabilityParser.STATE); - this.state = 1117; + this.state = 1128; this.identifier(); - this.state = 1118; + this.state = 1129; this.match(QuixosCapabilityParser.SEMI); } } @@ -4220,35 +4268,35 @@ export class QuixosCapabilityParser extends antlr.Parser { } public relationshipMaterializationDecl(): RelationshipMaterializationDeclContext { let localContext = new RelationshipMaterializationDeclContext(this.context, this.state); - this.enterRule(localContext, 126, QuixosCapabilityParser.RULE_relationshipMaterializationDecl); + this.enterRule(localContext, 128, QuixosCapabilityParser.RULE_relationshipMaterializationDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 1120; - this.match(QuixosCapabilityParser.MATERIALIZE); - this.state = 1121; - this.identifier(); - this.state = 1122; - this.match(QuixosCapabilityParser.IF); - this.state = 1123; - this.match(QuixosCapabilityParser.ABSENT); - this.state = 1124; - this.match(QuixosCapabilityParser.USING); - this.state = 1125; - this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1126; - this.identifier(); - this.state = 1127; - this.match(QuixosCapabilityParser.VIA); - this.state = 1128; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1129; - this.identifier(); - this.state = 1130; - this.match(QuixosCapabilityParser.DOT); this.state = 1131; - this.identifier(); + this.match(QuixosCapabilityParser.MATERIALIZE); this.state = 1132; + this.identifier(); + this.state = 1133; + this.match(QuixosCapabilityParser.IF); + this.state = 1134; + this.match(QuixosCapabilityParser.ABSENT); + this.state = 1135; + this.match(QuixosCapabilityParser.USING); + this.state = 1136; + this.match(QuixosCapabilityParser.CONSTRUCTOR); + this.state = 1137; + this.identifier(); + this.state = 1138; + this.match(QuixosCapabilityParser.VIA); + this.state = 1139; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1140; + this.identifier(); + this.state = 1141; + this.match(QuixosCapabilityParser.DOT); + this.state = 1142; + this.identifier(); + this.state = 1143; this.match(QuixosCapabilityParser.SEMI); } } @@ -4267,32 +4315,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationBindingDecl(): OperationBindingDeclContext { let localContext = new OperationBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 128, QuixosCapabilityParser.RULE_operationBindingDecl); + this.enterRule(localContext, 130, QuixosCapabilityParser.RULE_operationBindingDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1134; + this.state = 1145; this.match(QuixosCapabilityParser.BIND); - this.state = 1135; + this.state = 1146; this.memberOperationRef(); - this.state = 1136; + this.state = 1147; this.match(QuixosCapabilityParser.TO); - this.state = 1137; + this.state = 1148; this.operationProvider(); - this.state = 1140; + this.state = 1151; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 36) { { - this.state = 1138; + this.state = 1149; this.match(QuixosCapabilityParser.QUERY_REASON); - this.state = 1139; + this.state = 1150; this.stringLiteral(); } } - this.state = 1142; + this.state = 1153; this.match(QuixosCapabilityParser.SEMI); } } @@ -4311,15 +4359,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public memberOperationRef(): MemberOperationRefContext { let localContext = new MemberOperationRefContext(this.context, this.state); - this.enterRule(localContext, 130, QuixosCapabilityParser.RULE_memberOperationRef); + this.enterRule(localContext, 132, QuixosCapabilityParser.RULE_memberOperationRef); try { this.enterOuterAlt(localContext, 1); { - this.state = 1144; + this.state = 1155; this.identifier(); - this.state = 1145; + this.state = 1156; this.match(QuixosCapabilityParser.DOT); - this.state = 1146; + this.state = 1157; this.operationName(); } } @@ -4338,92 +4386,92 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationName(): OperationNameContext { let localContext = new OperationNameContext(this.context, this.state); - this.enterRule(localContext, 132, QuixosCapabilityParser.RULE_operationName); + this.enterRule(localContext, 134, QuixosCapabilityParser.RULE_operationName); try { - this.state = 1160; + this.state = 1171; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 103, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 104, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1148; + this.state = 1159; this.identifier(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1149; + this.state = 1160; this.match(QuixosCapabilityParser.CALL); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1150; + this.state = 1161; this.match(QuixosCapabilityParser.GET); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1151; + this.state = 1162; this.match(QuixosCapabilityParser.SET); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1152; + this.state = 1163; this.match(QuixosCapabilityParser.EDIT); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1153; + this.state = 1164; this.match(QuixosCapabilityParser.RESOLVE); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 1154; + this.state = 1165; this.match(QuixosCapabilityParser.CONNECT); } break; case 8: this.enterOuterAlt(localContext, 8); { - this.state = 1155; + this.state = 1166; this.match(QuixosCapabilityParser.DISCONNECT); } break; case 9: this.enterOuterAlt(localContext, 9); { - this.state = 1156; + this.state = 1167; this.match(QuixosCapabilityParser.WATCH_START); } break; case 10: this.enterOuterAlt(localContext, 10); { - this.state = 1157; + this.state = 1168; this.match(QuixosCapabilityParser.WATCH_STOP); } break; case 11: this.enterOuterAlt(localContext, 11); { - this.state = 1158; + this.state = 1169; this.match(QuixosCapabilityParser.SUBSCRIBE); } break; case 12: this.enterOuterAlt(localContext, 12); { - this.state = 1159; + this.state = 1170; this.match(QuixosCapabilityParser.UNSUBSCRIBE); } break; @@ -4444,139 +4492,139 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationProvider(): OperationProviderContext { let localContext = new OperationProviderContext(this.context, this.state); - this.enterRule(localContext, 134, QuixosCapabilityParser.RULE_operationProvider); + this.enterRule(localContext, 136, QuixosCapabilityParser.RULE_operationProvider); let _la: number; try { - this.state = 1208; + this.state = 1219; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.LIFECYCLE: this.enterOuterAlt(localContext, 1); { - this.state = 1162; + this.state = 1173; this.match(QuixosCapabilityParser.LIFECYCLE); - this.state = 1163; + this.state = 1174; this.match(QuixosCapabilityParser.DOT); - this.state = 1164; + this.state = 1175; this.identifier(); } break; case QuixosCapabilityParser.JOURNAL: this.enterOuterAlt(localContext, 2); { - this.state = 1165; + this.state = 1176; this.match(QuixosCapabilityParser.JOURNAL); - this.state = 1166; + this.state = 1177; this.identifier(); - this.state = 1167; + this.state = 1178; this.match(QuixosCapabilityParser.DOT); - this.state = 1168; + this.state = 1179; this.identifier(); } break; case QuixosCapabilityParser.SUBSCRIPTION: this.enterOuterAlt(localContext, 3); { - this.state = 1170; + this.state = 1181; this.match(QuixosCapabilityParser.SUBSCRIPTION); - this.state = 1171; + this.state = 1182; this.identifier(); - this.state = 1172; + this.state = 1183; this.match(QuixosCapabilityParser.DOT); - this.state = 1173; + this.state = 1184; this.identifier(); } break; case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 4); { - this.state = 1175; + this.state = 1186; this.match(QuixosCapabilityParser.STATE); - this.state = 1176; + this.state = 1187; this.identifier(); - this.state = 1177; + this.state = 1188; this.match(QuixosCapabilityParser.DOT); - this.state = 1178; + this.state = 1189; this.statePrimitive(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 5); { - this.state = 1180; + this.state = 1191; this.match(QuixosCapabilityParser.EDGE); - this.state = 1181; + this.state = 1192; this.identifier(); - this.state = 1182; + this.state = 1193; this.match(QuixosCapabilityParser.DOT); - this.state = 1183; + this.state = 1194; this.identifier(); - this.state = 1184; + this.state = 1195; this.match(QuixosCapabilityParser.DOT); - this.state = 1185; + this.state = 1196; this.edgePrimitive(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 6); { - this.state = 1187; + this.state = 1198; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 1188; + this.state = 1199; this.identifier(); - this.state = 1190; + this.state = 1201; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 148) { + if (_la === 149) { { - this.state = 1189; + this.state = 1200; this.typeArguments(); } } - this.state = 1192; + this.state = 1203; this.match(QuixosCapabilityParser.DOT); - this.state = 1193; + this.state = 1204; this.memberOperationRef(); } break; case QuixosCapabilityParser.PACKAGE: this.enterOuterAlt(localContext, 7); { - this.state = 1195; + this.state = 1206; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 1196; + this.state = 1207; this.identifier(); - this.state = 1197; + this.state = 1208; this.match(QuixosCapabilityParser.DOT); - this.state = 1198; + this.state = 1209; this.identifier(); - this.state = 1200; + this.state = 1211; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 148) { + if (_la === 149) { { - this.state = 1199; + this.state = 1210; this.typeArguments(); } } - this.state = 1203; + this.state = 1214; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 67) { + if (_la === 68) { { - this.state = 1202; + this.state = 1213; this.dependencyBindingBlock(); } } - this.state = 1206; + this.state = 1217; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 69) { + if (_la === 70) { { - this.state = 1205; + this.state = 1216; this.acceptanceBinding(); } } @@ -4602,13 +4650,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public acceptanceBinding(): AcceptanceBindingContext { let localContext = new AcceptanceBindingContext(this.context, this.state); - this.enterRule(localContext, 136, QuixosCapabilityParser.RULE_acceptanceBinding); + this.enterRule(localContext, 138, QuixosCapabilityParser.RULE_acceptanceBinding); try { this.enterOuterAlt(localContext, 1); { - this.state = 1210; + this.state = 1221; this.match(QuixosCapabilityParser.ACCEPT); - this.state = 1211; + this.state = 1222; this.dependencyBindingBlock(); } } @@ -4627,14 +4675,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public statePrimitive(): StatePrimitiveContext { let localContext = new StatePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 138, QuixosCapabilityParser.RULE_statePrimitive); + this.enterRule(localContext, 140, QuixosCapabilityParser.RULE_statePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1213; + this.state = 1224; _la = this.tokenStream.LA(1); - if(!(_la === 1 || ((((_la - 101)) & ~0x1F) === 0 && ((1 << (_la - 101)) & 195) !== 0))) { + if(!(_la === 1 || ((((_la - 102)) & ~0x1F) === 0 && ((1 << (_la - 102)) & 195) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4658,14 +4706,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgePrimitive(): EdgePrimitiveContext { let localContext = new EdgePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 140, QuixosCapabilityParser.RULE_edgePrimitive); + this.enterRule(localContext, 142, QuixosCapabilityParser.RULE_edgePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1215; + this.state = 1226; _la = this.tokenStream.LA(1); - if(!(((((_la - 103)) & ~0x1F) === 0 && ((1 << (_la - 103)) & 55) !== 0))) { + if(!(((((_la - 104)) & ~0x1F) === 0 && ((1 << (_la - 104)) & 55) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -4689,30 +4737,30 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBindingBlock(): DependencyBindingBlockContext { let localContext = new DependencyBindingBlockContext(this.context, this.state); - this.enterRule(localContext, 142, QuixosCapabilityParser.RULE_dependencyBindingBlock); + this.enterRule(localContext, 144, QuixosCapabilityParser.RULE_dependencyBindingBlock); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1217; + this.state = 1228; this.match(QuixosCapabilityParser.WITH); - this.state = 1218; + this.state = 1229; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1222; + this.state = 1233; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 146801025) !== 0) || _la === 111 || _la === 120 || _la === 154) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 66575) !== 0) || ((((_la - 78)) & ~0x1F) === 0 && ((1 << (_la - 78)) & 146801025) !== 0) || _la === 112 || _la === 121 || _la === 155) { { { - this.state = 1219; + this.state = 1230; this.dependencyBinding(); } } - this.state = 1224; + this.state = 1235; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1225; + this.state = 1236; this.match(QuixosCapabilityParser.RBRACE); } } @@ -4731,139 +4779,139 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBinding(): DependencyBindingContext { let localContext = new DependencyBindingContext(this.context, this.state); - this.enterRule(localContext, 144, QuixosCapabilityParser.RULE_dependencyBinding); + this.enterRule(localContext, 146, QuixosCapabilityParser.RULE_dependencyBinding); let _la: number; try { - this.state = 1325; + this.state = 1336; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 117, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 118, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1227; + this.state = 1238; this.identifier(); - this.state = 1228; + this.state = 1239; this.match(QuixosCapabilityParser.TO); - this.state = 1229; + this.state = 1240; this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 1230; + this.state = 1241; this.match(QuixosCapabilityParser.REFLECTION); - this.state = 1231; + this.state = 1242; this.match(QuixosCapabilityParser.LBRACK); - this.state = 1232; + this.state = 1243; this.identifierList(); - this.state = 1233; + this.state = 1244; this.match(QuixosCapabilityParser.RBRACK); - this.state = 1234; + this.state = 1245; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1236; + this.state = 1247; this.identifier(); - this.state = 1237; + this.state = 1248; this.match(QuixosCapabilityParser.TO); - this.state = 1238; + this.state = 1249; this.match(QuixosCapabilityParser.STATE); - this.state = 1239; + this.state = 1250; this.identifier(); - this.state = 1246; + this.state = 1257; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 70) { + if (_la === 71) { { - this.state = 1240; + this.state = 1251; this.match(QuixosCapabilityParser.VIA); - this.state = 1241; + this.state = 1252; this.match(QuixosCapabilityParser.EDGE); - this.state = 1242; + this.state = 1253; this.identifier(); - this.state = 1243; + this.state = 1254; this.match(QuixosCapabilityParser.DOT); - this.state = 1244; + this.state = 1255; this.identifier(); } } - this.state = 1248; + this.state = 1259; this.match(QuixosCapabilityParser.SEMI); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1250; - this.identifier(); - this.state = 1251; - this.match(QuixosCapabilityParser.TO); - this.state = 1252; - this.match(QuixosCapabilityParser.EDGE); - this.state = 1253; - this.identifier(); - this.state = 1254; - this.match(QuixosCapabilityParser.DOT); - this.state = 1255; + this.state = 1261; this.identifier(); this.state = 1262; + this.match(QuixosCapabilityParser.TO); + this.state = 1263; + this.match(QuixosCapabilityParser.EDGE); + this.state = 1264; + this.identifier(); + this.state = 1265; + this.match(QuixosCapabilityParser.DOT); + this.state = 1266; + this.identifier(); + this.state = 1273; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 70) { + if (_la === 71) { { - this.state = 1256; + this.state = 1267; this.match(QuixosCapabilityParser.VIA); - this.state = 1257; + this.state = 1268; this.match(QuixosCapabilityParser.EDGE); - this.state = 1258; + this.state = 1269; this.identifier(); - this.state = 1259; + this.state = 1270; this.match(QuixosCapabilityParser.DOT); - this.state = 1260; + this.state = 1271; this.identifier(); } } - this.state = 1264; + this.state = 1275; this.match(QuixosCapabilityParser.SEMI); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1266; + this.state = 1277; this.identifier(); - this.state = 1267; + this.state = 1278; this.match(QuixosCapabilityParser.TO); - this.state = 1268; + this.state = 1279; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 1269; + this.state = 1280; this.identifier(); - this.state = 1271; + this.state = 1282; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 148) { + if (_la === 149) { { - this.state = 1270; + this.state = 1281; this.typeArguments(); } } - this.state = 1281; + this.state = 1292; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.VIA: { { - this.state = 1273; + this.state = 1284; this.match(QuixosCapabilityParser.VIA); - this.state = 1274; + this.state = 1285; this.match(QuixosCapabilityParser.EDGE); - this.state = 1275; + this.state = 1286; this.identifier(); - this.state = 1276; + this.state = 1287; this.match(QuixosCapabilityParser.DOT); - this.state = 1277; + this.state = 1288; this.identifier(); } } @@ -4871,9 +4919,9 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.FROM: { { - this.state = 1279; + this.state = 1290; this.match(QuixosCapabilityParser.FROM); - this.state = 1280; + this.state = 1291; this.match(QuixosCapabilityParser.INPUT); } } @@ -4883,104 +4931,104 @@ export class QuixosCapabilityParser extends antlr.Parser { default: break; } - this.state = 1283; + this.state = 1294; this.match(QuixosCapabilityParser.SEMI); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1285; + this.state = 1296; this.identifier(); - this.state = 1286; + this.state = 1297; this.match(QuixosCapabilityParser.TO); - this.state = 1287; + this.state = 1298; this.match(QuixosCapabilityParser.CREATION); - this.state = 1288; + this.state = 1299; this.identifier(); - this.state = 1289; + this.state = 1300; this.match(QuixosCapabilityParser.WITH); - this.state = 1290; + this.state = 1301; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1294; + this.state = 1305; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 146801025) !== 0) || _la === 111 || _la === 120 || _la === 154) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 66575) !== 0) || ((((_la - 78)) & ~0x1F) === 0 && ((1 << (_la - 78)) & 146801025) !== 0) || _la === 112 || _la === 121 || _la === 155) { { { - this.state = 1291; + this.state = 1302; this.creationOwnerMapping(); } } - this.state = 1296; + this.state = 1307; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1297; + this.state = 1308; this.match(QuixosCapabilityParser.RBRACE); - this.state = 1298; + this.state = 1309; this.match(QuixosCapabilityParser.SEMI); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1300; + this.state = 1311; this.identifier(); - this.state = 1301; + this.state = 1312; this.match(QuixosCapabilityParser.TO); - this.state = 1302; + this.state = 1313; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1303; + this.state = 1314; this.identifier(); - this.state = 1304; + this.state = 1315; this.match(QuixosCapabilityParser.SEMI); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 1306; + this.state = 1317; this.identifier(); - this.state = 1307; + this.state = 1318; this.match(QuixosCapabilityParser.TO); - this.state = 1309; + this.state = 1320; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 11) { { - this.state = 1308; + this.state = 1319; this.match(QuixosCapabilityParser.WORKSPACE); } } - this.state = 1311; + this.state = 1322; this.match(QuixosCapabilityParser.QUERY); - this.state = 1312; + this.state = 1323; this.identifier(); - this.state = 1313; + this.state = 1324; this.match(QuixosCapabilityParser.DOT); - this.state = 1314; + this.state = 1325; this.identifier(); - this.state = 1321; + this.state = 1332; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 70) { + if (_la === 71) { { - this.state = 1315; + this.state = 1326; this.match(QuixosCapabilityParser.VIA); - this.state = 1316; + this.state = 1327; this.match(QuixosCapabilityParser.EDGE); - this.state = 1317; + this.state = 1328; this.identifier(); - this.state = 1318; + this.state = 1329; this.match(QuixosCapabilityParser.DOT); - this.state = 1319; + this.state = 1330; this.identifier(); } } - this.state = 1323; + this.state = 1334; this.match(QuixosCapabilityParser.SEMI); } break; @@ -5001,34 +5049,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public constructorBindingDecl(): ConstructorBindingDeclContext { let localContext = new ConstructorBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 146, QuixosCapabilityParser.RULE_constructorBindingDecl); + this.enterRule(localContext, 148, QuixosCapabilityParser.RULE_constructorBindingDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1327; + this.state = 1338; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 1328; + this.state = 1339; this.identifier(); - this.state = 1329; + this.state = 1340; this.match(QuixosCapabilityParser.TO); - this.state = 1330; + this.state = 1341; this.identifier(); - this.state = 1331; + this.state = 1342; this.match(QuixosCapabilityParser.DOT); - this.state = 1332; + this.state = 1343; this.identifier(); - this.state = 1334; + this.state = 1345; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 67) { + if (_la === 68) { { - this.state = 1333; + this.state = 1344; this.dependencyBindingBlock(); } } - this.state = 1336; + this.state = 1347; this.match(QuixosCapabilityParser.SEMI); } } @@ -5047,182 +5095,182 @@ export class QuixosCapabilityParser extends antlr.Parser { } public valueType(): ValueTypeContext { let localContext = new ValueTypeContext(this.context, this.state); - this.enterRule(localContext, 148, QuixosCapabilityParser.RULE_valueType); + this.enterRule(localContext, 150, QuixosCapabilityParser.RULE_valueType); let _la: number; try { - this.state = 1395; + this.state = 1406; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 123, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 124, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 1338; + this.state = 1349; this.scalarType(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 1339; + this.state = 1350; this.match(QuixosCapabilityParser.UNIT); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 1340; + this.state = 1351; this.match(QuixosCapabilityParser.WATCH_HANDLE); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 1341; + this.state = 1352; this.match(QuixosCapabilityParser.MESSAGE); - this.state = 1342; + this.state = 1353; this.stringLiteral(); } break; case 5: this.enterOuterAlt(localContext, 5); { - this.state = 1343; + this.state = 1354; this.match(QuixosCapabilityParser.ATOM_REF); - this.state = 1344; + this.state = 1355; this.match(QuixosCapabilityParser.LT); - this.state = 1345; + this.state = 1356; this.identifier(); - this.state = 1346; + this.state = 1357; this.match(QuixosCapabilityParser.GT); } break; case 6: this.enterOuterAlt(localContext, 6); { - this.state = 1348; + this.state = 1359; this.match(QuixosCapabilityParser.INTERFACE_REF); - this.state = 1349; + this.state = 1360; this.match(QuixosCapabilityParser.LT); - this.state = 1350; + this.state = 1361; this.identifier(); - this.state = 1352; + this.state = 1363; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 148) { + if (_la === 149) { { - this.state = 1351; + this.state = 1362; this.typeArguments(); } } - this.state = 1354; + this.state = 1365; this.match(QuixosCapabilityParser.GT); } break; case 7: this.enterOuterAlt(localContext, 7); { - this.state = 1356; + this.state = 1367; this.match(QuixosCapabilityParser.REF); - this.state = 1357; + this.state = 1368; this.match(QuixosCapabilityParser.LT); - this.state = 1358; + this.state = 1369; this.identifier(); - this.state = 1359; + this.state = 1370; this.match(QuixosCapabilityParser.GT); } break; case 8: this.enterOuterAlt(localContext, 8); { - this.state = 1361; + this.state = 1372; this.match(QuixosCapabilityParser.OPTIONAL); - this.state = 1362; + this.state = 1373; this.match(QuixosCapabilityParser.LT); - this.state = 1363; + this.state = 1374; this.valueType(); - this.state = 1364; + this.state = 1375; this.match(QuixosCapabilityParser.GT); } break; case 9: this.enterOuterAlt(localContext, 9); { - this.state = 1366; + this.state = 1377; this.match(QuixosCapabilityParser.LIST); - this.state = 1367; + this.state = 1378; this.match(QuixosCapabilityParser.LT); - this.state = 1368; + this.state = 1379; this.valueType(); - this.state = 1369; + this.state = 1380; this.match(QuixosCapabilityParser.GT); } break; case 10: this.enterOuterAlt(localContext, 10); { - this.state = 1371; + this.state = 1382; this.match(QuixosCapabilityParser.RECORD); - this.state = 1372; + this.state = 1383; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1376; + this.state = 1387; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 146801025) !== 0) || _la === 111 || _la === 120 || _la === 154) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 66575) !== 0) || ((((_la - 78)) & ~0x1F) === 0 && ((1 << (_la - 78)) & 146801025) !== 0) || _la === 112 || _la === 121 || _la === 155) { { { - this.state = 1373; + this.state = 1384; this.recordField(); } } - this.state = 1378; + this.state = 1389; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 1379; + this.state = 1390; this.match(QuixosCapabilityParser.RBRACE); } break; case 11: this.enterOuterAlt(localContext, 11); { - this.state = 1380; + this.state = 1391; this.match(QuixosCapabilityParser.VARIANT); - this.state = 1381; + this.state = 1392; this.match(QuixosCapabilityParser.ID); - this.state = 1382; + this.state = 1393; this.stringLiteral(); - this.state = 1383; + this.state = 1394; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1385; + this.state = 1396; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); do { { { - this.state = 1384; + this.state = 1395; this.variantCase(); } } - this.state = 1387; + this.state = 1398; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - } while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 146801025) !== 0) || _la === 111 || _la === 120 || _la === 154); - this.state = 1389; + } while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 66575) !== 0) || ((((_la - 78)) & ~0x1F) === 0 && ((1 << (_la - 78)) & 146801025) !== 0) || _la === 112 || _la === 121 || _la === 155); + this.state = 1400; this.match(QuixosCapabilityParser.RBRACE); } break; case 12: this.enterOuterAlt(localContext, 12); { - this.state = 1391; + this.state = 1402; this.identifier(); - this.state = 1393; + this.state = 1404; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 148) { + if (_la === 149) { { - this.state = 1392; + this.state = 1403; this.typeArguments(); } } @@ -5246,17 +5294,17 @@ export class QuixosCapabilityParser extends antlr.Parser { } public recordField(): RecordFieldContext { let localContext = new RecordFieldContext(this.context, this.state); - this.enterRule(localContext, 150, QuixosCapabilityParser.RULE_recordField); + this.enterRule(localContext, 152, QuixosCapabilityParser.RULE_recordField); try { this.enterOuterAlt(localContext, 1); { - this.state = 1397; + this.state = 1408; this.identifier(); - this.state = 1398; + this.state = 1409; this.match(QuixosCapabilityParser.COLON); - this.state = 1399; + this.state = 1410; this.valueType(); - this.state = 1400; + this.state = 1411; this.match(QuixosCapabilityParser.SEMI); } } @@ -5275,21 +5323,21 @@ export class QuixosCapabilityParser extends antlr.Parser { } public variantCase(): VariantCaseContext { let localContext = new VariantCaseContext(this.context, this.state); - this.enterRule(localContext, 152, QuixosCapabilityParser.RULE_variantCase); + this.enterRule(localContext, 154, QuixosCapabilityParser.RULE_variantCase); try { this.enterOuterAlt(localContext, 1); { - this.state = 1402; + this.state = 1413; this.identifier(); - this.state = 1403; + this.state = 1414; this.match(QuixosCapabilityParser.ID); - this.state = 1404; + this.state = 1415; this.stringLiteral(); - this.state = 1405; + this.state = 1416; this.match(QuixosCapabilityParser.COLON); - this.state = 1406; + this.state = 1417; this.valueType(); - this.state = 1407; + this.state = 1418; this.match(QuixosCapabilityParser.SEMI); } } @@ -5308,14 +5356,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public scalarType(): ScalarTypeContext { let localContext = new ScalarTypeContext(this.context, this.state); - this.enterRule(localContext, 154, QuixosCapabilityParser.RULE_scalarType); + this.enterRule(localContext, 156, QuixosCapabilityParser.RULE_scalarType); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1409; + this.state = 1420; _la = this.tokenStream.LA(1); - if(!(((((_la - 126)) & ~0x1F) === 0 && ((1 << (_la - 126)) & 255) !== 0))) { + if(!(((((_la - 127)) & ~0x1F) === 0 && ((1 << (_la - 127)) & 255) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -5339,14 +5387,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public cardinality(): CardinalityContext { let localContext = new CardinalityContext(this.context, this.state); - this.enterRule(localContext, 156, QuixosCapabilityParser.RULE_cardinality); + this.enterRule(localContext, 158, QuixosCapabilityParser.RULE_cardinality); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1411; + this.state = 1422; _la = this.tokenStream.LA(1); - if(!(((((_la - 113)) & ~0x1F) === 0 && ((1 << (_la - 113)) & 15) !== 0))) { + if(!(((((_la - 114)) & ~0x1F) === 0 && ((1 << (_la - 114)) & 15) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -5370,64 +5418,64 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonLiteral(): JsonLiteralContext { let localContext = new JsonLiteralContext(this.context, this.state); - this.enterRule(localContext, 158, QuixosCapabilityParser.RULE_jsonLiteral); + this.enterRule(localContext, 160, QuixosCapabilityParser.RULE_jsonLiteral); try { - this.state = 1421; + this.state = 1432; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STRING_LITERAL: this.enterOuterAlt(localContext, 1); { - this.state = 1413; + this.state = 1424; this.stringLiteral(); } break; case QuixosCapabilityParser.INTEGER: this.enterOuterAlt(localContext, 2); { - this.state = 1414; + this.state = 1425; this.match(QuixosCapabilityParser.INTEGER); } break; case QuixosCapabilityParser.JSON_NUMBER: this.enterOuterAlt(localContext, 3); { - this.state = 1415; + this.state = 1426; this.match(QuixosCapabilityParser.JSON_NUMBER); } break; case QuixosCapabilityParser.TRUE: this.enterOuterAlt(localContext, 4); { - this.state = 1416; + this.state = 1427; this.match(QuixosCapabilityParser.TRUE); } break; case QuixosCapabilityParser.FALSE: this.enterOuterAlt(localContext, 5); { - this.state = 1417; + this.state = 1428; this.match(QuixosCapabilityParser.FALSE); } break; case QuixosCapabilityParser.NULL: this.enterOuterAlt(localContext, 6); { - this.state = 1418; + this.state = 1429; this.match(QuixosCapabilityParser.NULL); } break; case QuixosCapabilityParser.LBRACE: this.enterOuterAlt(localContext, 7); { - this.state = 1419; + this.state = 1430; this.jsonObject(); } break; case QuixosCapabilityParser.LBRACK: this.enterOuterAlt(localContext, 8); { - this.state = 1420; + this.state = 1431; this.jsonArray(); } break; @@ -5450,40 +5498,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonObject(): JsonObjectContext { let localContext = new JsonObjectContext(this.context, this.state); - this.enterRule(localContext, 160, QuixosCapabilityParser.RULE_jsonObject); + this.enterRule(localContext, 162, QuixosCapabilityParser.RULE_jsonObject); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1423; + this.state = 1434; this.match(QuixosCapabilityParser.LBRACE); - this.state = 1432; + this.state = 1443; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 155) { + if (_la === 156) { { - this.state = 1424; + this.state = 1435; this.jsonMember(); - this.state = 1429; + this.state = 1440; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 140) { + while (_la === 141) { { { - this.state = 1425; + this.state = 1436; this.match(QuixosCapabilityParser.COMMA); - this.state = 1426; + this.state = 1437; this.jsonMember(); } } - this.state = 1431; + this.state = 1442; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1434; + this.state = 1445; this.match(QuixosCapabilityParser.RBRACE); } } @@ -5502,15 +5550,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonMember(): JsonMemberContext { let localContext = new JsonMemberContext(this.context, this.state); - this.enterRule(localContext, 162, QuixosCapabilityParser.RULE_jsonMember); + this.enterRule(localContext, 164, QuixosCapabilityParser.RULE_jsonMember); try { this.enterOuterAlt(localContext, 1); { - this.state = 1436; + this.state = 1447; this.stringLiteral(); - this.state = 1437; + this.state = 1448; this.match(QuixosCapabilityParser.COLON); - this.state = 1438; + this.state = 1449; this.jsonLiteral(); } } @@ -5529,40 +5577,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonArray(): JsonArrayContext { let localContext = new JsonArrayContext(this.context, this.state); - this.enterRule(localContext, 164, QuixosCapabilityParser.RULE_jsonArray); + this.enterRule(localContext, 166, QuixosCapabilityParser.RULE_jsonArray); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1440; + this.state = 1451; this.match(QuixosCapabilityParser.LBRACK); - this.state = 1449; + this.state = 1460; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (((((_la - 134)) & ~0x1F) === 0 && ((1 << (_la - 134)) & 2884871) !== 0)) { + if (((((_la - 135)) & ~0x1F) === 0 && ((1 << (_la - 135)) & 2884871) !== 0)) { { - this.state = 1441; + this.state = 1452; this.jsonLiteral(); - this.state = 1446; + this.state = 1457; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 140) { + while (_la === 141) { { { - this.state = 1442; + this.state = 1453; this.match(QuixosCapabilityParser.COMMA); - this.state = 1443; + this.state = 1454; this.jsonLiteral(); } } - this.state = 1448; + this.state = 1459; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 1451; + this.state = 1462; this.match(QuixosCapabilityParser.RBRACK); } } @@ -5581,14 +5629,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public identifier(): IdentifierContext { let localContext = new IdentifierContext(this.context, this.state); - this.enterRule(localContext, 166, QuixosCapabilityParser.RULE_identifier); + this.enterRule(localContext, 168, QuixosCapabilityParser.RULE_identifier); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 1453; + this.state = 1464; _la = this.tokenStream.LA(1); - if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 33807) !== 0) || ((((_la - 77)) & ~0x1F) === 0 && ((1 << (_la - 77)) & 146801025) !== 0) || _la === 111 || _la === 120 || _la === 154)) { + if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 4294964466) !== 0) || ((((_la - 32)) & ~0x1F) === 0 && ((1 << (_la - 32)) & 66575) !== 0) || ((((_la - 78)) & ~0x1F) === 0 && ((1 << (_la - 78)) & 146801025) !== 0) || _la === 112 || _la === 121 || _la === 155)) { this.errorHandler.recoverInline(this); } else { @@ -5612,11 +5660,11 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stringLiteral(): StringLiteralContext { let localContext = new StringLiteralContext(this.context, this.state); - this.enterRule(localContext, 168, QuixosCapabilityParser.RULE_stringLiteral); + this.enterRule(localContext, 170, QuixosCapabilityParser.RULE_stringLiteral); try { this.enterOuterAlt(localContext, 1); { - this.state = 1455; + this.state = 1466; this.match(QuixosCapabilityParser.STRING_LITERAL); } } @@ -5635,7 +5683,7 @@ export class QuixosCapabilityParser extends antlr.Parser { } public static readonly _serializedATN: number[] = [ - 4,1,158,1458,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,159,1469,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, @@ -5647,562 +5695,566 @@ export class QuixosCapabilityParser extends antlr.Parser { 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,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,183,8,0,1,1,1, - 1,1,1,5,1,188,8,1,10,1,12,1,191,9,1,1,1,1,1,1,2,1,2,1,2,1,2,1,3, - 1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,5,3,209,8,3,10,3,12,3,212,9, - 3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,3,4,224,8,4,1,5,1,5,1, - 5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,3,5,236,8,5,1,6,1,6,1,6,1,6,1,6,1, - 6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,3,8,256,8,8,1, - 9,1,9,1,9,1,9,1,9,1,9,3,9,264,8,9,1,9,1,9,1,10,5,10,269,8,10,10, - 10,12,10,272,9,10,1,10,1,10,1,10,3,10,277,8,10,1,10,1,10,1,10,1, - 10,1,10,1,10,1,10,1,10,5,10,287,8,10,10,10,12,10,290,9,10,3,10,292, - 8,10,1,10,1,10,5,10,296,8,10,10,10,12,10,299,9,10,1,10,1,10,1,11, - 1,11,1,11,1,11,5,11,307,8,11,10,11,12,11,310,9,11,1,11,1,11,1,12, - 1,12,1,12,1,12,3,12,318,8,12,1,12,1,12,1,12,1,12,1,12,1,12,5,12, - 326,8,12,10,12,12,12,329,9,12,3,12,331,8,12,3,12,333,8,12,1,13,1, - 13,3,13,337,8,13,1,14,1,14,1,14,1,14,5,14,343,8,14,10,14,12,14,346, - 9,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,3,15,357,8,15, - 1,16,1,16,1,16,3,16,362,8,16,1,16,1,16,1,16,1,16,1,17,1,17,1,17, - 1,17,3,17,372,8,17,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,3,18, - 382,8,18,1,18,1,18,1,19,3,19,387,8,19,1,19,1,19,1,19,1,19,1,19,1, - 19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,3,19,402,8,19,1,19,1,19,1, - 19,1,20,3,20,408,8,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,5, - 20,418,8,20,10,20,12,20,421,9,20,1,20,1,20,1,21,1,21,1,21,1,21,3, - 21,429,8,21,1,21,1,21,1,21,1,21,1,21,1,21,3,21,437,8,21,1,21,1,21, - 1,21,1,21,1,21,1,21,3,21,445,8,21,1,21,1,21,1,21,1,21,1,21,1,21, - 1,21,1,21,1,21,1,21,1,21,3,21,458,8,21,1,22,3,22,461,8,22,1,22,1, - 22,1,22,1,22,1,22,1,22,1,22,1,22,3,22,471,8,22,1,22,1,22,3,22,475, - 8,22,1,22,1,22,5,22,479,8,22,10,22,12,22,482,9,22,1,22,1,22,1,23, - 1,23,3,23,488,8,23,1,24,1,24,1,24,1,24,3,24,494,8,24,1,24,1,24,1, - 24,1,24,1,24,1,24,3,24,502,8,24,1,24,1,24,1,24,1,24,1,24,1,24,3, - 24,510,8,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1,24,1, - 24,3,24,523,8,24,1,25,1,25,1,25,1,25,1,25,3,25,530,8,25,1,25,1,25, - 3,25,534,8,25,1,26,5,26,537,8,26,10,26,12,26,540,9,26,1,26,1,26, - 1,26,1,26,1,26,1,26,1,26,1,26,3,26,550,8,26,1,26,1,26,5,26,554,8, - 26,10,26,12,26,557,9,26,1,26,1,26,1,27,1,27,1,27,1,27,1,27,1,27, - 3,27,567,8,27,1,28,1,28,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,29,1,29,1,29,1,29,1,29,1,29,1,30, - 1,30,3,30,593,8,30,1,30,1,30,3,30,597,8,30,1,30,1,30,1,30,1,30,3, - 30,603,8,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,5,30,612,8,30,10, - 30,12,30,615,9,30,1,30,1,30,1,30,1,30,1,30,1,30,3,30,623,8,30,1, - 30,1,30,5,30,627,8,30,10,30,12,30,630,9,30,1,30,1,30,3,30,634,8, - 30,3,30,636,8,30,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,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1, - 32,1,32,1,32,1,32,1,32,5,32,665,8,32,10,32,12,32,668,9,32,1,32,3, - 32,671,8,32,1,32,1,32,1,32,1,32,3,32,677,8,32,1,32,1,32,1,32,1,32, - 1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32, - 1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,3,32,704,8,32,1,33,1,33, - 1,33,1,33,1,33,1,34,1,34,1,34,3,34,714,8,34,1,34,1,34,1,34,1,34, - 1,34,1,34,1,34,1,34,1,34,3,34,725,8,34,1,34,3,34,728,8,34,1,34,1, - 34,1,34,3,34,733,8,34,1,34,3,34,736,8,34,1,34,3,34,739,8,34,1,34, - 1,34,1,35,1,35,1,35,3,35,746,8,35,1,35,1,35,1,35,1,35,1,35,1,35, - 1,35,3,35,755,8,35,1,35,3,35,758,8,35,1,35,3,35,761,8,35,1,35,3, - 35,764,8,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,38,1,38,3,38,787,8, - 38,1,39,1,39,1,39,1,39,1,39,5,39,794,8,39,10,39,12,39,797,9,39,1, - 39,1,39,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,3,40,810,8, - 40,1,40,1,40,1,41,1,41,1,41,1,42,1,42,1,43,1,43,1,43,1,43,1,43,1, - 43,1,43,1,43,1,43,1,43,5,43,829,8,43,10,43,12,43,832,9,43,3,43,834, - 8,43,1,43,3,43,837,8,43,1,44,1,44,1,44,5,44,842,8,44,10,44,12,44, - 845,9,44,1,45,1,45,1,45,5,45,850,8,45,10,45,12,45,853,9,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,46,1,46, - 1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46, - 1,46,1,46,3,46,884,8,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46, - 1,46,1,46,3,46,896,8,46,1,46,3,46,899,8,46,1,46,1,46,3,46,903,8, - 46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1, - 46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,3,46,925,8,46,1,46,1,46,1, - 46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,3,46,939,8,46,1, - 47,1,47,1,47,1,47,5,47,945,8,47,10,47,12,47,948,9,47,1,47,1,47,1, - 48,1,48,1,49,1,49,1,49,1,50,1,50,3,50,959,8,50,1,51,1,51,1,51,1, - 51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,3,51,973,8,51,1,51,1, - 51,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1, - 52,3,52,990,8,52,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1, - 54,1,54,1,54,1,54,1,54,1,54,1,54,3,54,1008,8,54,1,54,1,54,3,54,1012, - 8,54,1,54,3,54,1015,8,54,1,54,1,54,3,54,1019,8,54,1,54,3,54,1022, - 8,54,1,54,1,54,1,55,1,55,3,55,1028,8,55,1,55,1,55,3,55,1032,8,55, - 1,55,1,55,1,55,3,55,1037,8,55,1,55,1,55,3,55,1041,8,55,1,55,1,55, - 3,55,1045,8,55,1,55,1,55,5,55,1049,8,55,10,55,12,55,1052,9,55,1, - 55,1,55,1,56,1,56,1,57,1,57,1,57,1,57,1,57,1,57,1,57,3,57,1065,8, - 57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,59,1,59,1,59,5,59,1078, - 8,59,10,59,12,59,1081,9,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60,1, - 60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,3,60,1100,8,60,1, - 61,1,61,1,61,1,61,1,61,5,61,1107,8,61,10,61,12,61,1110,9,61,1,61, - 1,61,1,62,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,63,1,63,1,63,1,63,1,63,1,63,1,63,1,64,1,64,1,64,1,64, - 1,64,1,64,3,64,1141,8,64,1,64,1,64,1,65,1,65,1,65,1,65,1,66,1,66, - 1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,3,66,1161,8,66, - 1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67, - 1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67, - 1,67,1,67,3,67,1191,8,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67, - 3,67,1201,8,67,1,67,3,67,1204,8,67,1,67,3,67,1207,8,67,3,67,1209, - 8,67,1,68,1,68,1,68,1,69,1,69,1,70,1,70,1,71,1,71,1,71,5,71,1221, - 8,71,10,71,12,71,1224,9,71,1,71,1,71,1,72,1,72,1,72,1,72,1,72,1, - 72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1, - 72,3,72,1247,8,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1, - 72,1,72,1,72,1,72,1,72,3,72,1263,8,72,1,72,1,72,1,72,1,72,1,72,1, - 72,1,72,3,72,1272,8,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,3, - 72,1282,8,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,5,72,1293, - 8,72,10,72,12,72,1296,9,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1, - 72,1,72,1,72,1,72,1,72,3,72,1310,8,72,1,72,1,72,1,72,1,72,1,72,1, - 72,1,72,1,72,1,72,1,72,3,72,1322,8,72,1,72,1,72,3,72,1326,8,72,1, - 73,1,73,1,73,1,73,1,73,1,73,1,73,3,73,1335,8,73,1,73,1,73,1,74,1, - 74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,3, - 74,1353,8,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1, - 74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,74,5,74,1375,8,74,10, - 74,12,74,1378,9,74,1,74,1,74,1,74,1,74,1,74,1,74,4,74,1386,8,74, - 11,74,12,74,1387,1,74,1,74,1,74,1,74,3,74,1394,8,74,3,74,1396,8, - 74,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,78,1,78,1,79,1,79,1,79,1,79,1,79,1,79,1,79,1,79,3,79,1422, - 8,79,1,80,1,80,1,80,1,80,5,80,1428,8,80,10,80,12,80,1431,9,80,3, - 80,1433,8,80,1,80,1,80,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,5, - 82,1445,8,82,10,82,12,82,1448,9,82,3,82,1450,8,82,1,82,1,82,1,83, - 1,83,1,84,1,84,1,84,0,0,85,0,2,4,6,8,10,12,14,16,18,20,22,24,26, + 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,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,185, + 8,0,1,1,1,1,1,1,5,1,190,8,1,10,1,12,1,193,9,1,1,1,1,1,1,2,1,2,1, + 2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,5,3,211,8,3,10,3,12, + 3,214,9,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,3,4,226,8,4,1, + 5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,3,5,238,8,5,1,6,1,6,1,6,1, + 6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1, + 8,1,9,1,9,1,9,1,9,1,9,3,9,265,8,9,1,10,1,10,1,10,1,10,1,10,1,10, + 3,10,273,8,10,1,10,1,10,1,11,5,11,278,8,11,10,11,12,11,281,9,11, + 1,11,1,11,1,11,3,11,286,8,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11, + 1,11,5,11,296,8,11,10,11,12,11,299,9,11,3,11,301,8,11,1,11,1,11, + 5,11,305,8,11,10,11,12,11,308,9,11,1,11,1,11,1,12,1,12,1,12,1,12, + 5,12,316,8,12,10,12,12,12,319,9,12,1,12,1,12,1,13,1,13,1,13,1,13, + 3,13,327,8,13,1,13,1,13,1,13,1,13,1,13,1,13,5,13,335,8,13,10,13, + 12,13,338,9,13,3,13,340,8,13,3,13,342,8,13,1,14,1,14,3,14,346,8, + 14,1,15,1,15,1,15,1,15,5,15,352,8,15,10,15,12,15,355,9,15,1,15,1, + 15,1,16,1,16,1,16,1,16,1,16,1,16,1,16,3,16,366,8,16,1,17,1,17,1, + 17,3,17,371,8,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,18,3,18,381, + 8,18,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,3,19,391,8,19,1,19, + 1,19,1,20,3,20,396,8,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20, + 1,20,1,20,1,20,1,20,1,20,3,20,411,8,20,1,20,1,20,1,20,1,21,3,21, + 417,8,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,5,21,427,8,21,10, + 21,12,21,430,9,21,1,21,1,21,1,22,1,22,1,22,1,22,3,22,438,8,22,1, + 22,1,22,1,22,1,22,1,22,1,22,3,22,446,8,22,1,22,1,22,1,22,1,22,1, + 22,1,22,3,22,454,8,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1, + 22,1,22,1,22,3,22,467,8,22,1,23,3,23,470,8,23,1,23,1,23,1,23,1,23, + 1,23,1,23,1,23,1,23,3,23,480,8,23,1,23,1,23,3,23,484,8,23,1,23,1, + 23,5,23,488,8,23,10,23,12,23,491,9,23,1,23,1,23,1,24,1,24,3,24,497, + 8,24,1,25,1,25,1,25,1,25,3,25,503,8,25,1,25,1,25,1,25,1,25,1,25, + 1,25,3,25,511,8,25,1,25,1,25,1,25,1,25,1,25,1,25,3,25,519,8,25,1, + 25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,3,25,532,8, + 25,1,26,1,26,1,26,1,26,1,26,3,26,539,8,26,1,26,1,26,3,26,543,8,26, + 1,27,5,27,546,8,27,10,27,12,27,549,9,27,1,27,1,27,1,27,1,27,1,27, + 1,27,1,27,1,27,3,27,559,8,27,1,27,1,27,5,27,563,8,27,10,27,12,27, + 566,9,27,1,27,1,27,1,28,1,28,1,28,1,28,1,28,1,28,3,28,576,8,28,1, + 29,1,29,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,30,1,30,1,30,1,30,1,30,1,30,1,31,1,31,3,31,602,8, + 31,1,31,1,31,3,31,606,8,31,1,31,1,31,1,31,1,31,3,31,612,8,31,1,31, + 1,31,1,31,1,31,1,31,1,31,1,31,5,31,621,8,31,10,31,12,31,624,9,31, + 1,31,1,31,1,31,1,31,1,31,1,31,3,31,632,8,31,1,31,1,31,5,31,636,8, + 31,10,31,12,31,639,9,31,1,31,1,31,3,31,643,8,31,3,31,645,8,31,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, + 33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1, + 33,5,33,674,8,33,10,33,12,33,677,9,33,1,33,3,33,680,8,33,1,33,1, + 33,1,33,1,33,3,33,686,8,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1, + 33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1, + 33,1,33,1,33,1,33,1,33,3,33,713,8,33,1,34,1,34,1,34,1,34,1,34,1, + 35,1,35,1,35,3,35,723,8,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1, + 35,1,35,3,35,734,8,35,1,35,3,35,737,8,35,1,35,1,35,1,35,3,35,742, + 8,35,1,35,3,35,745,8,35,1,35,3,35,748,8,35,1,35,1,35,1,36,1,36,1, + 36,3,36,755,8,36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,3,36,764,8,36, + 1,36,3,36,767,8,36,1,36,3,36,770,8,36,1,36,3,36,773,8,36,1,36,1, + 36,1,37,1,37,1,37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,1,39,1,39,1, + 39,1,39,1,39,1,39,1,39,1,39,1,39,3,39,796,8,39,3,39,798,8,39,1,40, + 1,40,1,40,1,40,1,40,5,40,805,8,40,10,40,12,40,808,9,40,1,40,1,40, + 1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,3,41,821,8,41,1,41, + 1,41,1,42,1,42,1,42,1,43,1,43,1,44,1,44,1,44,1,44,1,44,1,44,1,44, + 1,44,1,44,1,44,5,44,840,8,44,10,44,12,44,843,9,44,3,44,845,8,44, + 1,44,3,44,848,8,44,1,45,1,45,1,45,5,45,853,8,45,10,45,12,45,856, + 9,45,1,46,1,46,1,46,5,46,861,8,46,10,46,12,46,864,9,46,1,46,1,46, + 1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47, + 1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47, + 1,47,3,47,895,8,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47, + 1,47,3,47,907,8,47,1,47,3,47,910,8,47,1,47,1,47,3,47,914,8,47,1, + 47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1, + 47,1,47,1,47,1,47,1,47,1,47,1,47,3,47,936,8,47,1,47,1,47,1,47,1, + 47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,3,47,950,8,47,1,48,1, + 48,1,48,1,48,5,48,956,8,48,10,48,12,48,959,9,48,1,48,1,48,1,49,1, + 49,1,50,1,50,1,50,1,51,1,51,3,51,970,8,51,1,52,1,52,1,52,1,52,1, + 52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,3,52,984,8,52,1,52,1,52,1, + 53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,3, + 53,1001,8,53,1,54,1,54,1,54,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,3,55,1019,8,55,1,55,1,55,3,55,1023,8, + 55,1,55,3,55,1026,8,55,1,55,1,55,3,55,1030,8,55,1,55,3,55,1033,8, + 55,1,55,1,55,1,56,1,56,3,56,1039,8,56,1,56,1,56,3,56,1043,8,56,1, + 56,1,56,1,56,3,56,1048,8,56,1,56,1,56,3,56,1052,8,56,1,56,1,56,3, + 56,1056,8,56,1,56,1,56,5,56,1060,8,56,10,56,12,56,1063,9,56,1,56, + 1,56,1,57,1,57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,1076,8,58, + 1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60,5,60,1089, + 8,60,10,60,12,60,1092,9,60,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1, + 61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,3,61,1111,8,61,1, + 62,1,62,1,62,1,62,1,62,5,62,1118,8,62,10,62,12,62,1121,9,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,64,1,64, + 1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,65,1,65,1,65,1,65, + 1,65,1,65,3,65,1152,8,65,1,65,1,65,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,67,1,67,3,67,1172,8,67, + 1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68, + 1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68, + 1,68,1,68,3,68,1202,8,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68, + 3,68,1212,8,68,1,68,3,68,1215,8,68,1,68,3,68,1218,8,68,3,68,1220, + 8,68,1,69,1,69,1,69,1,70,1,70,1,71,1,71,1,72,1,72,1,72,5,72,1232, + 8,72,10,72,12,72,1235,9,72,1,72,1,72,1,73,1,73,1,73,1,73,1,73,1, + 73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1, + 73,3,73,1258,8,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1, + 73,1,73,1,73,1,73,1,73,3,73,1274,8,73,1,73,1,73,1,73,1,73,1,73,1, + 73,1,73,3,73,1283,8,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,3, + 73,1293,8,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,5,73,1304, + 8,73,10,73,12,73,1307,9,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1, + 73,1,73,1,73,1,73,1,73,3,73,1321,8,73,1,73,1,73,1,73,1,73,1,73,1, + 73,1,73,1,73,1,73,1,73,3,73,1333,8,73,1,73,1,73,3,73,1337,8,73,1, + 74,1,74,1,74,1,74,1,74,1,74,1,74,3,74,1346,8,74,1,74,1,74,1,75,1, + 75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,3, + 75,1364,8,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1, + 75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75,5,75,1386,8,75,10, + 75,12,75,1389,9,75,1,75,1,75,1,75,1,75,1,75,1,75,4,75,1397,8,75, + 11,75,12,75,1398,1,75,1,75,1,75,1,75,3,75,1405,8,75,3,75,1407,8, + 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,79,1,79,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,80,3,80,1433, + 8,80,1,81,1,81,1,81,1,81,5,81,1439,8,81,10,81,12,81,1442,9,81,3, + 81,1444,8,81,1,81,1,81,1,82,1,82,1,82,1,82,1,83,1,83,1,83,1,83,5, + 83,1456,8,83,10,83,12,83,1459,9,83,3,83,1461,8,83,1,83,1,83,1,84, + 1,84,1,85,1,85,1,85,0,0,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,0,10,1,0,49, - 50,2,0,17,17,35,35,1,0,13,14,1,0,106,110,3,0,1,1,101,105,107,108, - 3,0,1,1,101,102,107,108,2,0,103,105,107,108,1,0,126,133,1,0,113, - 116,13,0,1,1,4,7,10,10,12,35,42,42,47,47,77,77,84,85,99,100,104, - 104,111,111,120,120,154,154,1581,0,182,1,0,0,0,2,184,1,0,0,0,4,194, - 1,0,0,0,6,198,1,0,0,0,8,223,1,0,0,0,10,235,1,0,0,0,12,237,1,0,0, - 0,14,244,1,0,0,0,16,255,1,0,0,0,18,257,1,0,0,0,20,270,1,0,0,0,22, - 302,1,0,0,0,24,332,1,0,0,0,26,334,1,0,0,0,28,338,1,0,0,0,30,356, - 1,0,0,0,32,358,1,0,0,0,34,371,1,0,0,0,36,373,1,0,0,0,38,386,1,0, - 0,0,40,407,1,0,0,0,42,457,1,0,0,0,44,460,1,0,0,0,46,485,1,0,0,0, - 48,522,1,0,0,0,50,533,1,0,0,0,52,538,1,0,0,0,54,566,1,0,0,0,56,568, - 1,0,0,0,58,578,1,0,0,0,60,590,1,0,0,0,62,637,1,0,0,0,64,703,1,0, - 0,0,66,705,1,0,0,0,68,710,1,0,0,0,70,742,1,0,0,0,72,767,1,0,0,0, - 74,771,1,0,0,0,76,786,1,0,0,0,78,788,1,0,0,0,80,800,1,0,0,0,82,813, - 1,0,0,0,84,816,1,0,0,0,86,836,1,0,0,0,88,838,1,0,0,0,90,846,1,0, - 0,0,92,938,1,0,0,0,94,940,1,0,0,0,96,951,1,0,0,0,98,953,1,0,0,0, - 100,958,1,0,0,0,102,960,1,0,0,0,104,989,1,0,0,0,106,991,1,0,0,0, - 108,1000,1,0,0,0,110,1025,1,0,0,0,112,1055,1,0,0,0,114,1064,1,0, - 0,0,116,1066,1,0,0,0,118,1074,1,0,0,0,120,1099,1,0,0,0,122,1101, - 1,0,0,0,124,1113,1,0,0,0,126,1120,1,0,0,0,128,1134,1,0,0,0,130,1144, - 1,0,0,0,132,1160,1,0,0,0,134,1208,1,0,0,0,136,1210,1,0,0,0,138,1213, - 1,0,0,0,140,1215,1,0,0,0,142,1217,1,0,0,0,144,1325,1,0,0,0,146,1327, - 1,0,0,0,148,1395,1,0,0,0,150,1397,1,0,0,0,152,1402,1,0,0,0,154,1409, - 1,0,0,0,156,1411,1,0,0,0,158,1421,1,0,0,0,160,1423,1,0,0,0,162,1436, - 1,0,0,0,164,1440,1,0,0,0,166,1453,1,0,0,0,168,1455,1,0,0,0,170,171, - 3,6,3,0,171,172,5,0,0,1,172,183,1,0,0,0,173,174,3,20,10,0,174,175, - 5,0,0,1,175,183,1,0,0,0,176,177,3,52,26,0,177,178,5,0,0,1,178,183, - 1,0,0,0,179,180,3,2,1,0,180,181,5,0,0,1,181,183,1,0,0,0,182,170, - 1,0,0,0,182,173,1,0,0,0,182,176,1,0,0,0,182,179,1,0,0,0,183,1,1, - 0,0,0,184,185,5,42,0,0,185,189,5,142,0,0,186,188,3,8,4,0,187,186, - 1,0,0,0,188,191,1,0,0,0,189,187,1,0,0,0,189,190,1,0,0,0,190,192, - 1,0,0,0,191,189,1,0,0,0,192,193,5,143,0,0,193,3,1,0,0,0,194,195, - 5,43,0,0,195,196,3,168,84,0,196,197,5,139,0,0,197,5,1,0,0,0,198, - 199,5,11,0,0,199,200,3,166,83,0,200,201,5,89,0,0,201,202,3,168,84, - 0,202,203,5,80,0,0,203,204,3,168,84,0,204,205,5,79,0,0,205,206,3, - 168,84,0,206,210,5,142,0,0,207,209,3,8,4,0,208,207,1,0,0,0,209,212, - 1,0,0,0,210,208,1,0,0,0,210,211,1,0,0,0,211,213,1,0,0,0,212,210, - 1,0,0,0,213,214,5,143,0,0,214,7,1,0,0,0,215,224,3,4,2,0,216,224, - 3,18,9,0,217,224,3,10,5,0,218,224,3,98,49,0,219,224,3,110,55,0,220, - 224,3,146,73,0,221,224,3,58,29,0,222,224,3,32,16,0,223,215,1,0,0, - 0,223,216,1,0,0,0,223,217,1,0,0,0,223,218,1,0,0,0,223,219,1,0,0, - 0,223,220,1,0,0,0,223,221,1,0,0,0,223,222,1,0,0,0,224,9,1,0,0,0, - 225,226,5,43,0,0,226,227,5,46,0,0,227,228,3,166,83,0,228,229,5,139, - 0,0,229,236,1,0,0,0,230,231,5,43,0,0,231,232,5,48,0,0,232,233,3, - 166,83,0,233,234,5,139,0,0,234,236,1,0,0,0,235,225,1,0,0,0,235,230, - 1,0,0,0,236,11,1,0,0,0,237,238,5,44,0,0,238,239,5,45,0,0,239,240, - 3,166,83,0,240,241,5,89,0,0,241,242,3,168,84,0,242,243,5,139,0,0, - 243,13,1,0,0,0,244,245,5,44,0,0,245,246,5,46,0,0,246,247,3,166,83, - 0,247,248,5,80,0,0,248,249,3,168,84,0,249,250,5,139,0,0,250,15,1, - 0,0,0,251,256,3,10,5,0,252,256,3,12,6,0,253,256,3,14,7,0,254,256, - 3,32,16,0,255,251,1,0,0,0,255,252,1,0,0,0,255,253,1,0,0,0,255,254, - 1,0,0,0,256,17,1,0,0,0,257,258,5,45,0,0,258,259,3,166,83,0,259,260, - 5,89,0,0,260,263,3,168,84,0,261,262,5,90,0,0,262,264,3,168,84,0, - 263,261,1,0,0,0,263,264,1,0,0,0,264,265,1,0,0,0,265,266,5,139,0, - 0,266,19,1,0,0,0,267,269,3,16,8,0,268,267,1,0,0,0,269,272,1,0,0, - 0,270,268,1,0,0,0,270,271,1,0,0,0,271,273,1,0,0,0,272,270,1,0,0, - 0,273,274,5,46,0,0,274,276,3,166,83,0,275,277,3,22,11,0,276,275, - 1,0,0,0,276,277,1,0,0,0,277,278,1,0,0,0,278,279,5,89,0,0,279,280, - 3,168,84,0,280,281,5,80,0,0,281,291,3,168,84,0,282,283,5,94,0,0, - 283,288,3,26,13,0,284,285,5,140,0,0,285,287,3,26,13,0,286,284,1, - 0,0,0,287,290,1,0,0,0,288,286,1,0,0,0,288,289,1,0,0,0,289,292,1, - 0,0,0,290,288,1,0,0,0,291,282,1,0,0,0,291,292,1,0,0,0,292,293,1, - 0,0,0,293,297,5,142,0,0,294,296,3,34,17,0,295,294,1,0,0,0,296,299, - 1,0,0,0,297,295,1,0,0,0,297,298,1,0,0,0,298,300,1,0,0,0,299,297, - 1,0,0,0,300,301,5,143,0,0,301,21,1,0,0,0,302,303,5,148,0,0,303,308, - 3,24,12,0,304,305,5,140,0,0,305,307,3,24,12,0,306,304,1,0,0,0,307, - 310,1,0,0,0,308,306,1,0,0,0,308,309,1,0,0,0,309,311,1,0,0,0,310, - 308,1,0,0,0,311,312,5,149,0,0,312,23,1,0,0,0,313,314,5,49,0,0,314, - 317,3,166,83,0,315,316,5,138,0,0,316,318,5,39,0,0,317,315,1,0,0, - 0,317,318,1,0,0,0,318,333,1,0,0,0,319,320,5,38,0,0,320,330,3,166, - 83,0,321,322,5,40,0,0,322,327,3,26,13,0,323,324,5,150,0,0,324,326, - 3,26,13,0,325,323,1,0,0,0,326,329,1,0,0,0,327,325,1,0,0,0,327,328, - 1,0,0,0,328,331,1,0,0,0,329,327,1,0,0,0,330,321,1,0,0,0,330,331, - 1,0,0,0,331,333,1,0,0,0,332,313,1,0,0,0,332,319,1,0,0,0,333,25,1, - 0,0,0,334,336,3,166,83,0,335,337,3,28,14,0,336,335,1,0,0,0,336,337, - 1,0,0,0,337,27,1,0,0,0,338,339,5,148,0,0,339,344,3,30,15,0,340,341, - 5,140,0,0,341,343,3,30,15,0,342,340,1,0,0,0,343,346,1,0,0,0,344, - 342,1,0,0,0,344,345,1,0,0,0,345,347,1,0,0,0,346,344,1,0,0,0,347, - 348,5,149,0,0,348,29,1,0,0,0,349,350,5,45,0,0,350,357,3,166,83,0, - 351,352,5,46,0,0,352,357,3,26,13,0,353,354,5,38,0,0,354,357,3,166, - 83,0,355,357,3,148,74,0,356,349,1,0,0,0,356,351,1,0,0,0,356,353, - 1,0,0,0,356,355,1,0,0,0,357,31,1,0,0,0,358,359,5,37,0,0,359,361, - 3,166,83,0,360,362,3,22,11,0,361,360,1,0,0,0,361,362,1,0,0,0,362, - 363,1,0,0,0,363,364,5,151,0,0,364,365,3,148,74,0,365,366,5,139,0, - 0,366,33,1,0,0,0,367,372,3,40,20,0,368,372,3,44,22,0,369,372,3,38, - 19,0,370,372,3,36,18,0,371,367,1,0,0,0,371,368,1,0,0,0,371,369,1, - 0,0,0,371,370,1,0,0,0,372,35,1,0,0,0,373,374,5,2,0,0,374,375,3,166, - 83,0,375,376,5,89,0,0,376,377,3,168,84,0,377,378,5,3,0,0,378,381, - 3,168,84,0,379,380,5,5,0,0,380,382,3,50,25,0,381,379,1,0,0,0,381, - 382,1,0,0,0,382,383,1,0,0,0,383,384,5,139,0,0,384,37,1,0,0,0,385, - 387,5,60,0,0,386,385,1,0,0,0,386,387,1,0,0,0,387,388,1,0,0,0,388, - 389,5,52,0,0,389,390,3,166,83,0,390,391,5,89,0,0,391,392,3,168,84, - 0,392,393,5,138,0,0,393,394,3,148,74,0,394,395,5,137,0,0,395,396, - 3,148,74,0,396,397,5,142,0,0,397,398,5,106,0,0,398,399,5,89,0,0, - 399,401,3,168,84,0,400,402,3,76,38,0,401,400,1,0,0,0,401,402,1,0, - 0,0,402,403,1,0,0,0,403,404,5,139,0,0,404,405,5,143,0,0,405,39,1, - 0,0,0,406,408,3,46,23,0,407,406,1,0,0,0,407,408,1,0,0,0,408,409, - 1,0,0,0,409,410,7,0,0,0,410,411,3,166,83,0,411,412,5,89,0,0,412, - 413,3,168,84,0,413,414,5,138,0,0,414,415,3,148,74,0,415,419,5,142, - 0,0,416,418,3,42,21,0,417,416,1,0,0,0,418,421,1,0,0,0,419,417,1, - 0,0,0,419,420,1,0,0,0,420,422,1,0,0,0,421,419,1,0,0,0,422,423,5, - 143,0,0,423,41,1,0,0,0,424,425,5,96,0,0,425,426,5,89,0,0,426,428, - 3,168,84,0,427,429,3,76,38,0,428,427,1,0,0,0,428,429,1,0,0,0,429, - 430,1,0,0,0,430,431,5,139,0,0,431,458,1,0,0,0,432,433,5,97,0,0,433, - 434,5,89,0,0,434,436,3,168,84,0,435,437,3,76,38,0,436,435,1,0,0, - 0,436,437,1,0,0,0,437,438,1,0,0,0,438,439,5,139,0,0,439,458,1,0, - 0,0,440,441,5,1,0,0,441,442,5,89,0,0,442,444,3,168,84,0,443,445, - 3,76,38,0,444,443,1,0,0,0,444,445,1,0,0,0,445,446,1,0,0,0,446,447, - 5,139,0,0,447,458,1,0,0,0,448,449,5,98,0,0,449,450,5,99,0,0,450, - 451,5,89,0,0,451,452,3,168,84,0,452,453,5,100,0,0,453,454,5,89,0, - 0,454,455,3,168,84,0,455,456,5,139,0,0,456,458,1,0,0,0,457,424,1, - 0,0,0,457,432,1,0,0,0,457,440,1,0,0,0,457,448,1,0,0,0,458,43,1,0, - 0,0,459,461,3,46,23,0,460,459,1,0,0,0,460,461,1,0,0,0,461,462,1, - 0,0,0,462,463,5,51,0,0,463,464,3,166,83,0,464,465,5,89,0,0,465,466, - 3,168,84,0,466,467,5,138,0,0,467,468,3,156,78,0,468,470,3,50,25, - 0,469,471,5,117,0,0,470,469,1,0,0,0,470,471,1,0,0,0,471,474,1,0, - 0,0,472,473,5,87,0,0,473,475,3,168,84,0,474,472,1,0,0,0,474,475, - 1,0,0,0,475,476,1,0,0,0,476,480,5,142,0,0,477,479,3,48,24,0,478, - 477,1,0,0,0,479,482,1,0,0,0,480,478,1,0,0,0,480,481,1,0,0,0,481, - 483,1,0,0,0,482,480,1,0,0,0,483,484,5,143,0,0,484,45,1,0,0,0,485, - 487,5,34,0,0,486,488,7,1,0,0,487,486,1,0,0,0,487,488,1,0,0,0,488, - 47,1,0,0,0,489,490,5,103,0,0,490,491,5,89,0,0,491,493,3,168,84,0, - 492,494,3,76,38,0,493,492,1,0,0,0,493,494,1,0,0,0,494,495,1,0,0, - 0,495,496,5,139,0,0,496,523,1,0,0,0,497,498,5,104,0,0,498,499,5, - 89,0,0,499,501,3,168,84,0,500,502,3,76,38,0,501,500,1,0,0,0,501, - 502,1,0,0,0,502,503,1,0,0,0,503,504,5,139,0,0,504,523,1,0,0,0,505, - 506,5,105,0,0,506,507,5,89,0,0,507,509,3,168,84,0,508,510,3,76,38, - 0,509,508,1,0,0,0,509,510,1,0,0,0,510,511,1,0,0,0,511,512,5,139, - 0,0,512,523,1,0,0,0,513,514,5,98,0,0,514,515,5,99,0,0,515,516,5, - 89,0,0,516,517,3,168,84,0,517,518,5,100,0,0,518,519,5,89,0,0,519, - 520,3,168,84,0,520,521,5,139,0,0,521,523,1,0,0,0,522,489,1,0,0,0, - 522,497,1,0,0,0,522,505,1,0,0,0,522,513,1,0,0,0,523,49,1,0,0,0,524, - 525,5,45,0,0,525,534,3,166,83,0,526,527,5,46,0,0,527,529,3,166,83, - 0,528,530,3,28,14,0,529,528,1,0,0,0,529,530,1,0,0,0,530,534,1,0, - 0,0,531,532,5,38,0,0,532,534,3,166,83,0,533,524,1,0,0,0,533,526, - 1,0,0,0,533,531,1,0,0,0,534,51,1,0,0,0,535,537,3,16,8,0,536,535, - 1,0,0,0,537,540,1,0,0,0,538,536,1,0,0,0,538,539,1,0,0,0,539,541, - 1,0,0,0,540,538,1,0,0,0,541,542,5,48,0,0,542,543,3,166,83,0,543, - 544,5,89,0,0,544,545,3,168,84,0,545,546,5,80,0,0,546,549,3,168,84, - 0,547,548,5,81,0,0,548,550,5,152,0,0,549,547,1,0,0,0,549,550,1,0, - 0,0,550,551,1,0,0,0,551,555,5,142,0,0,552,554,3,54,27,0,553,552, - 1,0,0,0,554,557,1,0,0,0,555,553,1,0,0,0,555,556,1,0,0,0,556,558, - 1,0,0,0,557,555,1,0,0,0,558,559,5,143,0,0,559,53,1,0,0,0,560,567, - 3,68,34,0,561,567,3,70,35,0,562,567,3,80,40,0,563,567,3,60,30,0, - 564,567,3,62,31,0,565,567,3,56,28,0,566,560,1,0,0,0,566,561,1,0, - 0,0,566,562,1,0,0,0,566,563,1,0,0,0,566,564,1,0,0,0,566,565,1,0, - 0,0,567,55,1,0,0,0,568,569,5,2,0,0,569,570,3,166,83,0,570,571,5, - 89,0,0,571,572,3,168,84,0,572,573,5,40,0,0,573,574,3,26,13,0,574, - 575,5,141,0,0,575,576,3,166,83,0,576,577,5,139,0,0,577,57,1,0,0, - 0,578,579,5,4,0,0,579,580,3,166,83,0,580,581,5,89,0,0,581,582,3, - 168,84,0,582,583,5,6,0,0,583,584,3,26,13,0,584,585,5,68,0,0,585, - 586,3,166,83,0,586,587,5,141,0,0,587,588,3,166,83,0,588,589,5,139, - 0,0,589,59,1,0,0,0,590,592,5,24,0,0,591,593,5,42,0,0,592,591,1,0, - 0,0,592,593,1,0,0,0,593,594,1,0,0,0,594,596,3,166,83,0,595,597,3, - 22,11,0,596,595,1,0,0,0,596,597,1,0,0,0,597,598,1,0,0,0,598,599, - 5,89,0,0,599,600,3,168,84,0,600,602,5,27,0,0,601,603,5,11,0,0,602, - 601,1,0,0,0,602,603,1,0,0,0,603,604,1,0,0,0,604,605,3,26,13,0,605, - 606,5,28,0,0,606,635,3,168,84,0,607,608,5,52,0,0,608,609,3,168,84, - 0,609,613,5,142,0,0,610,612,3,64,32,0,611,610,1,0,0,0,612,615,1, - 0,0,0,613,611,1,0,0,0,613,614,1,0,0,0,614,616,1,0,0,0,615,613,1, - 0,0,0,616,617,5,143,0,0,617,636,1,0,0,0,618,619,5,42,0,0,619,622, - 3,168,84,0,620,621,5,52,0,0,621,623,3,168,84,0,622,620,1,0,0,0,622, - 623,1,0,0,0,623,633,1,0,0,0,624,628,5,142,0,0,625,627,3,64,32,0, - 626,625,1,0,0,0,627,630,1,0,0,0,628,626,1,0,0,0,628,629,1,0,0,0, - 629,631,1,0,0,0,630,628,1,0,0,0,631,634,5,143,0,0,632,634,5,139, - 0,0,633,624,1,0,0,0,633,632,1,0,0,0,634,636,1,0,0,0,635,607,1,0, - 0,0,635,618,1,0,0,0,636,61,1,0,0,0,637,638,5,24,0,0,638,639,3,166, - 83,0,639,640,5,89,0,0,640,641,3,168,84,0,641,642,5,26,0,0,642,643, - 3,166,83,0,643,644,3,28,14,0,644,645,5,139,0,0,645,63,1,0,0,0,646, - 647,5,18,0,0,647,704,5,139,0,0,648,649,5,19,0,0,649,650,5,20,0,0, - 650,651,3,166,83,0,651,652,5,139,0,0,652,704,1,0,0,0,653,654,5,29, - 0,0,654,655,3,168,84,0,655,656,5,139,0,0,656,704,1,0,0,0,657,658, - 5,29,0,0,658,659,3,166,83,0,659,660,5,141,0,0,660,670,3,166,83,0, - 661,662,5,67,0,0,662,666,5,142,0,0,663,665,3,66,33,0,664,663,1,0, - 0,0,665,668,1,0,0,0,666,664,1,0,0,0,666,667,1,0,0,0,667,669,1,0, - 0,0,668,666,1,0,0,0,669,671,5,143,0,0,670,661,1,0,0,0,670,671,1, - 0,0,0,671,672,1,0,0,0,672,673,5,139,0,0,673,704,1,0,0,0,674,676, - 5,30,0,0,675,677,5,38,0,0,676,675,1,0,0,0,676,677,1,0,0,0,677,678, - 1,0,0,0,678,679,3,166,83,0,679,680,5,58,0,0,680,681,3,26,13,0,681, - 682,5,139,0,0,682,704,1,0,0,0,683,684,5,31,0,0,684,685,3,166,83, - 0,685,686,5,152,0,0,686,687,5,139,0,0,687,704,1,0,0,0,688,689,5, - 32,0,0,689,690,3,26,13,0,690,691,5,141,0,0,691,692,3,166,83,0,692, - 693,3,166,83,0,693,694,3,168,84,0,694,695,5,139,0,0,695,704,1,0, - 0,0,696,697,5,98,0,0,697,704,5,139,0,0,698,699,5,33,0,0,699,700, - 5,152,0,0,700,701,3,168,84,0,701,702,5,139,0,0,702,704,1,0,0,0,703, - 646,1,0,0,0,703,648,1,0,0,0,703,653,1,0,0,0,703,657,1,0,0,0,703, - 674,1,0,0,0,703,683,1,0,0,0,703,688,1,0,0,0,703,696,1,0,0,0,703, - 698,1,0,0,0,704,65,1,0,0,0,705,706,3,166,83,0,706,707,5,61,0,0,707, - 708,3,166,83,0,708,709,5,139,0,0,709,67,1,0,0,0,710,711,5,52,0,0, - 711,713,3,166,83,0,712,714,3,22,11,0,713,712,1,0,0,0,713,714,1,0, - 0,0,714,715,1,0,0,0,715,716,5,89,0,0,716,717,3,168,84,0,717,718, - 5,138,0,0,718,719,3,148,74,0,719,720,5,137,0,0,720,721,3,148,74, - 0,721,722,5,91,0,0,722,724,3,84,42,0,723,725,3,76,38,0,724,723,1, - 0,0,0,724,725,1,0,0,0,725,727,1,0,0,0,726,728,3,82,41,0,727,726, - 1,0,0,0,727,728,1,0,0,0,728,729,1,0,0,0,729,730,5,93,0,0,730,732, - 3,86,43,0,731,733,3,90,45,0,732,731,1,0,0,0,732,733,1,0,0,0,733, - 735,1,0,0,0,734,736,3,74,37,0,735,734,1,0,0,0,735,736,1,0,0,0,736, - 738,1,0,0,0,737,739,3,72,36,0,738,737,1,0,0,0,738,739,1,0,0,0,739, - 740,1,0,0,0,740,741,5,139,0,0,741,69,1,0,0,0,742,743,5,53,0,0,743, - 745,3,166,83,0,744,746,3,22,11,0,745,744,1,0,0,0,745,746,1,0,0,0, - 746,747,1,0,0,0,747,748,5,89,0,0,748,749,3,168,84,0,749,750,5,138, - 0,0,750,751,3,148,74,0,751,752,5,137,0,0,752,754,3,148,74,0,753, - 755,3,76,38,0,754,753,1,0,0,0,754,755,1,0,0,0,755,757,1,0,0,0,756, - 758,3,90,45,0,757,756,1,0,0,0,757,758,1,0,0,0,758,760,1,0,0,0,759, - 761,3,74,37,0,760,759,1,0,0,0,760,761,1,0,0,0,761,763,1,0,0,0,762, - 764,3,72,36,0,763,762,1,0,0,0,763,764,1,0,0,0,764,765,1,0,0,0,765, - 766,5,139,0,0,766,71,1,0,0,0,767,768,5,69,0,0,768,769,5,68,0,0,769, - 770,3,166,83,0,770,73,1,0,0,0,771,772,5,9,0,0,772,773,5,7,0,0,773, - 774,3,166,83,0,774,775,5,68,0,0,775,776,3,168,84,0,776,75,1,0,0, - 0,777,778,5,12,0,0,778,787,5,15,0,0,779,780,5,12,0,0,780,781,7,2, - 0,0,781,782,5,16,0,0,782,783,5,144,0,0,783,784,3,88,44,0,784,785, - 5,145,0,0,785,787,1,0,0,0,786,777,1,0,0,0,786,779,1,0,0,0,787,77, - 1,0,0,0,788,789,5,68,0,0,789,790,5,144,0,0,790,795,3,130,65,0,791, - 792,5,140,0,0,792,794,3,130,65,0,793,791,1,0,0,0,794,797,1,0,0,0, - 795,793,1,0,0,0,795,796,1,0,0,0,796,798,1,0,0,0,797,795,1,0,0,0, - 798,799,5,145,0,0,799,79,1,0,0,0,800,801,5,54,0,0,801,802,3,166, - 83,0,802,803,5,89,0,0,803,804,3,168,84,0,804,805,5,55,0,0,805,806, - 3,166,83,0,806,807,5,138,0,0,807,809,3,148,74,0,808,810,3,90,45, - 0,809,808,1,0,0,0,809,810,1,0,0,0,810,811,1,0,0,0,811,812,5,139, - 0,0,812,81,1,0,0,0,813,814,5,92,0,0,814,815,3,148,74,0,815,83,1, - 0,0,0,816,817,7,3,0,0,817,85,1,0,0,0,818,837,5,95,0,0,819,820,5, - 45,0,0,820,837,3,166,83,0,821,822,5,38,0,0,822,837,3,166,83,0,823, - 824,5,47,0,0,824,833,5,144,0,0,825,830,3,26,13,0,826,827,5,140,0, - 0,827,829,3,26,13,0,828,826,1,0,0,0,829,832,1,0,0,0,830,828,1,0, - 0,0,830,831,1,0,0,0,831,834,1,0,0,0,832,830,1,0,0,0,833,825,1,0, - 0,0,833,834,1,0,0,0,834,835,1,0,0,0,835,837,5,145,0,0,836,818,1, - 0,0,0,836,819,1,0,0,0,836,821,1,0,0,0,836,823,1,0,0,0,837,87,1,0, - 0,0,838,843,3,166,83,0,839,840,5,140,0,0,840,842,3,166,83,0,841, - 839,1,0,0,0,842,845,1,0,0,0,843,841,1,0,0,0,843,844,1,0,0,0,844, - 89,1,0,0,0,845,843,1,0,0,0,846,847,5,94,0,0,847,851,5,142,0,0,848, - 850,3,92,46,0,849,848,1,0,0,0,850,853,1,0,0,0,851,849,1,0,0,0,851, - 852,1,0,0,0,852,854,1,0,0,0,853,851,1,0,0,0,854,855,5,143,0,0,855, - 91,1,0,0,0,856,857,5,25,0,0,857,858,3,166,83,0,858,859,5,89,0,0, - 859,860,3,168,84,0,860,861,5,144,0,0,861,862,3,88,44,0,862,863,5, - 145,0,0,863,864,5,139,0,0,864,939,1,0,0,0,865,866,5,64,0,0,866,867, - 3,166,83,0,867,868,5,89,0,0,868,869,3,168,84,0,869,870,5,138,0,0, - 870,871,3,148,74,0,871,872,3,94,47,0,872,873,5,139,0,0,873,939,1, - 0,0,0,874,875,5,65,0,0,875,876,3,166,83,0,876,877,5,89,0,0,877,878, - 3,168,84,0,878,879,5,138,0,0,879,880,3,156,78,0,880,883,3,50,25, - 0,881,882,5,87,0,0,882,884,3,168,84,0,883,881,1,0,0,0,883,884,1, - 0,0,0,884,885,1,0,0,0,885,886,3,94,47,0,886,887,5,139,0,0,887,939, - 1,0,0,0,888,889,5,46,0,0,889,890,3,166,83,0,890,891,5,89,0,0,891, - 892,3,168,84,0,892,893,5,138,0,0,893,895,3,166,83,0,894,896,3,28, - 14,0,895,894,1,0,0,0,895,896,1,0,0,0,896,898,1,0,0,0,897,899,3,78, - 39,0,898,897,1,0,0,0,898,899,1,0,0,0,899,902,1,0,0,0,900,901,5,20, - 0,0,901,903,5,56,0,0,902,900,1,0,0,0,902,903,1,0,0,0,903,904,1,0, - 0,0,904,905,5,139,0,0,905,939,1,0,0,0,906,907,5,7,0,0,907,908,3, - 166,83,0,908,909,5,89,0,0,909,910,3,168,84,0,910,911,5,138,0,0,911, - 912,3,166,83,0,912,913,5,56,0,0,913,914,3,148,74,0,914,915,5,139, - 0,0,915,939,1,0,0,0,916,917,5,54,0,0,917,918,3,166,83,0,918,919, - 5,89,0,0,919,920,3,168,84,0,920,921,5,138,0,0,921,924,3,166,83,0, - 922,923,5,56,0,0,923,925,3,148,74,0,924,922,1,0,0,0,924,925,1,0, - 0,0,925,926,1,0,0,0,926,927,5,139,0,0,927,939,1,0,0,0,928,929,5, - 24,0,0,929,930,3,166,83,0,930,931,5,89,0,0,931,932,3,168,84,0,932, - 933,5,138,0,0,933,934,3,166,83,0,934,935,5,141,0,0,935,936,3,166, - 83,0,936,937,5,139,0,0,937,939,1,0,0,0,938,856,1,0,0,0,938,865,1, - 0,0,0,938,874,1,0,0,0,938,888,1,0,0,0,938,906,1,0,0,0,938,916,1, - 0,0,0,938,928,1,0,0,0,939,93,1,0,0,0,940,941,5,144,0,0,941,946,3, - 96,48,0,942,943,5,140,0,0,943,945,3,96,48,0,944,942,1,0,0,0,945, - 948,1,0,0,0,946,944,1,0,0,0,946,947,1,0,0,0,947,949,1,0,0,0,948, - 946,1,0,0,0,949,950,5,145,0,0,950,95,1,0,0,0,951,952,7,4,0,0,952, - 97,1,0,0,0,953,954,5,63,0,0,954,955,3,100,50,0,955,99,1,0,0,0,956, - 959,3,102,51,0,957,959,3,106,53,0,958,956,1,0,0,0,958,957,1,0,0, - 0,959,101,1,0,0,0,960,961,5,64,0,0,961,962,3,166,83,0,962,963,5, - 89,0,0,963,964,3,168,84,0,964,965,5,74,0,0,965,966,3,166,83,0,966, - 967,5,138,0,0,967,968,3,148,74,0,968,969,5,75,0,0,969,972,3,104, - 52,0,970,971,5,76,0,0,971,973,3,158,79,0,972,970,1,0,0,0,972,973, - 1,0,0,0,973,974,1,0,0,0,974,975,5,139,0,0,975,103,1,0,0,0,976,990, - 5,111,0,0,977,978,5,112,0,0,978,979,5,146,0,0,979,980,3,148,74,0, - 980,981,5,147,0,0,981,990,1,0,0,0,982,983,5,84,0,0,983,990,3,160, - 80,0,984,985,5,85,0,0,985,986,5,146,0,0,986,987,3,148,74,0,987,988, - 5,147,0,0,988,990,1,0,0,0,989,976,1,0,0,0,989,977,1,0,0,0,989,982, - 1,0,0,0,989,984,1,0,0,0,990,105,1,0,0,0,991,992,5,65,0,0,992,993, - 3,166,83,0,993,994,5,89,0,0,994,995,3,168,84,0,995,996,5,142,0,0, - 996,997,3,108,54,0,997,998,3,108,54,0,998,999,5,143,0,0,999,107, - 1,0,0,0,1000,1001,3,50,25,0,1001,1002,5,66,0,0,1002,1003,3,166,83, - 0,1003,1004,5,89,0,0,1004,1005,3,168,84,0,1005,1007,3,156,78,0,1006, - 1008,5,117,0,0,1007,1006,1,0,0,0,1007,1008,1,0,0,0,1008,1011,1,0, - 0,0,1009,1010,5,82,0,0,1010,1012,3,168,84,0,1011,1009,1,0,0,0,1011, - 1012,1,0,0,0,1012,1014,1,0,0,0,1013,1015,5,86,0,0,1014,1013,1,0, - 0,0,1014,1015,1,0,0,0,1015,1018,1,0,0,0,1016,1017,5,87,0,0,1017, - 1019,3,168,84,0,1018,1016,1,0,0,0,1018,1019,1,0,0,0,1019,1021,1, - 0,0,0,1020,1022,5,88,0,0,1021,1020,1,0,0,0,1021,1022,1,0,0,0,1022, - 1023,1,0,0,0,1023,1024,5,139,0,0,1024,109,1,0,0,0,1025,1027,5,57, - 0,0,1026,1028,3,22,11,0,1027,1026,1,0,0,0,1027,1028,1,0,0,0,1028, - 1029,1,0,0,0,1029,1031,3,166,83,0,1030,1032,3,112,56,0,1031,1030, - 1,0,0,0,1031,1032,1,0,0,0,1032,1033,1,0,0,0,1033,1034,5,58,0,0,1034, - 1036,3,166,83,0,1035,1037,3,28,14,0,1036,1035,1,0,0,0,1036,1037, - 1,0,0,0,1037,1040,1,0,0,0,1038,1039,5,89,0,0,1039,1041,3,168,84, - 0,1040,1038,1,0,0,0,1040,1041,1,0,0,0,1041,1044,1,0,0,0,1042,1043, - 5,81,0,0,1043,1045,5,152,0,0,1044,1042,1,0,0,0,1044,1045,1,0,0,0, - 1045,1046,1,0,0,0,1046,1050,5,142,0,0,1047,1049,3,114,57,0,1048, - 1047,1,0,0,0,1049,1052,1,0,0,0,1050,1048,1,0,0,0,1050,1051,1,0,0, - 0,1051,1053,1,0,0,0,1052,1050,1,0,0,0,1053,1054,5,143,0,0,1054,111, - 1,0,0,0,1055,1056,3,28,14,0,1056,113,1,0,0,0,1057,1058,5,62,0,0, - 1058,1065,3,100,50,0,1059,1065,3,128,64,0,1060,1065,3,124,62,0,1061, - 1065,3,118,59,0,1062,1065,3,126,63,0,1063,1065,3,116,58,0,1064,1057, - 1,0,0,0,1064,1059,1,0,0,0,1064,1060,1,0,0,0,1064,1061,1,0,0,0,1064, - 1062,1,0,0,0,1064,1063,1,0,0,0,1065,115,1,0,0,0,1066,1067,5,59,0, - 0,1067,1068,3,166,83,0,1068,1069,5,61,0,0,1069,1070,3,166,83,0,1070, - 1071,5,141,0,0,1071,1072,3,166,83,0,1072,1073,5,139,0,0,1073,117, - 1,0,0,0,1074,1075,5,10,0,0,1075,1079,5,142,0,0,1076,1078,3,120,60, - 0,1077,1076,1,0,0,0,1078,1081,1,0,0,0,1079,1077,1,0,0,0,1079,1080, - 1,0,0,0,1080,1082,1,0,0,0,1081,1079,1,0,0,0,1082,1083,5,143,0,0, - 1083,1084,5,139,0,0,1084,119,1,0,0,0,1085,1086,3,166,83,0,1086,1087, - 5,61,0,0,1087,1088,5,64,0,0,1088,1089,3,166,83,0,1089,1090,5,139, - 0,0,1090,1100,1,0,0,0,1091,1092,3,166,83,0,1092,1093,5,61,0,0,1093, - 1094,5,65,0,0,1094,1095,3,166,83,0,1095,1096,5,141,0,0,1096,1097, - 3,166,83,0,1097,1098,5,139,0,0,1098,1100,1,0,0,0,1099,1085,1,0,0, - 0,1099,1091,1,0,0,0,1100,121,1,0,0,0,1101,1102,3,26,13,0,1102,1103, - 5,20,0,0,1103,1108,5,56,0,0,1104,1105,5,141,0,0,1105,1107,3,166, - 83,0,1106,1104,1,0,0,0,1107,1110,1,0,0,0,1108,1106,1,0,0,0,1108, - 1109,1,0,0,0,1109,1111,1,0,0,0,1110,1108,1,0,0,0,1111,1112,5,139, - 0,0,1112,123,1,0,0,0,1113,1114,5,59,0,0,1114,1115,3,166,83,0,1115, - 1116,5,61,0,0,1116,1117,5,64,0,0,1117,1118,3,166,83,0,1118,1119, - 5,139,0,0,1119,125,1,0,0,0,1120,1121,5,71,0,0,1121,1122,3,166,83, - 0,1122,1123,5,72,0,0,1123,1124,5,73,0,0,1124,1125,5,68,0,0,1125, - 1126,5,54,0,0,1126,1127,3,166,83,0,1127,1128,5,70,0,0,1128,1129, - 5,65,0,0,1129,1130,3,166,83,0,1130,1131,5,141,0,0,1131,1132,3,166, - 83,0,1132,1133,5,139,0,0,1133,127,1,0,0,0,1134,1135,5,59,0,0,1135, - 1136,3,130,65,0,1136,1137,5,61,0,0,1137,1140,3,134,67,0,1138,1139, - 5,36,0,0,1139,1141,3,168,84,0,1140,1138,1,0,0,0,1140,1141,1,0,0, - 0,1141,1142,1,0,0,0,1142,1143,5,139,0,0,1143,129,1,0,0,0,1144,1145, - 3,166,83,0,1145,1146,5,141,0,0,1146,1147,3,132,66,0,1147,131,1,0, - 0,0,1148,1161,3,166,83,0,1149,1161,5,106,0,0,1150,1161,5,96,0,0, - 1151,1161,5,97,0,0,1152,1161,5,1,0,0,1153,1161,5,103,0,0,1154,1161, - 5,104,0,0,1155,1161,5,105,0,0,1156,1161,5,107,0,0,1157,1161,5,108, - 0,0,1158,1161,5,109,0,0,1159,1161,5,110,0,0,1160,1148,1,0,0,0,1160, - 1149,1,0,0,0,1160,1150,1,0,0,0,1160,1151,1,0,0,0,1160,1152,1,0,0, - 0,1160,1153,1,0,0,0,1160,1154,1,0,0,0,1160,1155,1,0,0,0,1160,1156, - 1,0,0,0,1160,1157,1,0,0,0,1160,1158,1,0,0,0,1160,1159,1,0,0,0,1161, - 133,1,0,0,0,1162,1163,5,83,0,0,1163,1164,5,141,0,0,1164,1209,3,166, - 83,0,1165,1166,5,84,0,0,1166,1167,3,166,83,0,1167,1168,5,141,0,0, - 1168,1169,3,166,83,0,1169,1209,1,0,0,0,1170,1171,5,85,0,0,1171,1172, - 3,166,83,0,1172,1173,5,141,0,0,1173,1174,3,166,83,0,1174,1209,1, - 0,0,0,1175,1176,5,64,0,0,1176,1177,3,166,83,0,1177,1178,5,141,0, - 0,1178,1179,3,138,69,0,1179,1209,1,0,0,0,1180,1181,5,65,0,0,1181, - 1182,3,166,83,0,1182,1183,5,141,0,0,1183,1184,3,166,83,0,1184,1185, - 5,141,0,0,1185,1186,3,140,70,0,1186,1209,1,0,0,0,1187,1188,5,46, - 0,0,1188,1190,3,166,83,0,1189,1191,3,28,14,0,1190,1189,1,0,0,0,1190, - 1191,1,0,0,0,1191,1192,1,0,0,0,1192,1193,5,141,0,0,1193,1194,3,130, - 65,0,1194,1209,1,0,0,0,1195,1196,5,48,0,0,1196,1197,3,166,83,0,1197, - 1198,5,141,0,0,1198,1200,3,166,83,0,1199,1201,3,28,14,0,1200,1199, - 1,0,0,0,1200,1201,1,0,0,0,1201,1203,1,0,0,0,1202,1204,3,142,71,0, - 1203,1202,1,0,0,0,1203,1204,1,0,0,0,1204,1206,1,0,0,0,1205,1207, - 3,136,68,0,1206,1205,1,0,0,0,1206,1207,1,0,0,0,1207,1209,1,0,0,0, - 1208,1162,1,0,0,0,1208,1165,1,0,0,0,1208,1170,1,0,0,0,1208,1175, - 1,0,0,0,1208,1180,1,0,0,0,1208,1187,1,0,0,0,1208,1195,1,0,0,0,1209, - 135,1,0,0,0,1210,1211,5,69,0,0,1211,1212,3,142,71,0,1212,137,1,0, - 0,0,1213,1214,7,5,0,0,1214,139,1,0,0,0,1215,1216,7,6,0,0,1216,141, - 1,0,0,0,1217,1218,5,67,0,0,1218,1222,5,142,0,0,1219,1221,3,144,72, - 0,1220,1219,1,0,0,0,1221,1224,1,0,0,0,1222,1220,1,0,0,0,1222,1223, - 1,0,0,0,1223,1225,1,0,0,0,1224,1222,1,0,0,0,1225,1226,5,143,0,0, - 1226,143,1,0,0,0,1227,1228,3,166,83,0,1228,1229,5,61,0,0,1229,1230, - 5,11,0,0,1230,1231,5,25,0,0,1231,1232,5,144,0,0,1232,1233,3,88,44, - 0,1233,1234,5,145,0,0,1234,1235,5,139,0,0,1235,1326,1,0,0,0,1236, - 1237,3,166,83,0,1237,1238,5,61,0,0,1238,1239,5,64,0,0,1239,1246, - 3,166,83,0,1240,1241,5,70,0,0,1241,1242,5,65,0,0,1242,1243,3,166, - 83,0,1243,1244,5,141,0,0,1244,1245,3,166,83,0,1245,1247,1,0,0,0, - 1246,1240,1,0,0,0,1246,1247,1,0,0,0,1247,1248,1,0,0,0,1248,1249, - 5,139,0,0,1249,1326,1,0,0,0,1250,1251,3,166,83,0,1251,1252,5,61, - 0,0,1252,1253,5,65,0,0,1253,1254,3,166,83,0,1254,1255,5,141,0,0, - 1255,1262,3,166,83,0,1256,1257,5,70,0,0,1257,1258,5,65,0,0,1258, - 1259,3,166,83,0,1259,1260,5,141,0,0,1260,1261,3,166,83,0,1261,1263, - 1,0,0,0,1262,1256,1,0,0,0,1262,1263,1,0,0,0,1263,1264,1,0,0,0,1264, - 1265,5,139,0,0,1265,1326,1,0,0,0,1266,1267,3,166,83,0,1267,1268, - 5,61,0,0,1268,1269,5,46,0,0,1269,1271,3,166,83,0,1270,1272,3,28, - 14,0,1271,1270,1,0,0,0,1271,1272,1,0,0,0,1272,1281,1,0,0,0,1273, - 1274,5,70,0,0,1274,1275,5,65,0,0,1275,1276,3,166,83,0,1276,1277, - 5,141,0,0,1277,1278,3,166,83,0,1278,1282,1,0,0,0,1279,1280,5,20, - 0,0,1280,1282,5,56,0,0,1281,1273,1,0,0,0,1281,1279,1,0,0,0,1281, - 1282,1,0,0,0,1282,1283,1,0,0,0,1283,1284,5,139,0,0,1284,1326,1,0, - 0,0,1285,1286,3,166,83,0,1286,1287,5,61,0,0,1287,1288,5,7,0,0,1288, - 1289,3,166,83,0,1289,1290,5,67,0,0,1290,1294,5,142,0,0,1291,1293, - 3,122,61,0,1292,1291,1,0,0,0,1293,1296,1,0,0,0,1294,1292,1,0,0,0, - 1294,1295,1,0,0,0,1295,1297,1,0,0,0,1296,1294,1,0,0,0,1297,1298, - 5,143,0,0,1298,1299,5,139,0,0,1299,1326,1,0,0,0,1300,1301,3,166, - 83,0,1301,1302,5,61,0,0,1302,1303,5,54,0,0,1303,1304,3,166,83,0, - 1304,1305,5,139,0,0,1305,1326,1,0,0,0,1306,1307,3,166,83,0,1307, - 1309,5,61,0,0,1308,1310,5,11,0,0,1309,1308,1,0,0,0,1309,1310,1,0, - 0,0,1310,1311,1,0,0,0,1311,1312,5,24,0,0,1312,1313,3,166,83,0,1313, - 1314,5,141,0,0,1314,1321,3,166,83,0,1315,1316,5,70,0,0,1316,1317, - 5,65,0,0,1317,1318,3,166,83,0,1318,1319,5,141,0,0,1319,1320,3,166, - 83,0,1320,1322,1,0,0,0,1321,1315,1,0,0,0,1321,1322,1,0,0,0,1322, - 1323,1,0,0,0,1323,1324,5,139,0,0,1324,1326,1,0,0,0,1325,1227,1,0, - 0,0,1325,1236,1,0,0,0,1325,1250,1,0,0,0,1325,1266,1,0,0,0,1325,1285, - 1,0,0,0,1325,1300,1,0,0,0,1325,1306,1,0,0,0,1326,145,1,0,0,0,1327, - 1328,5,54,0,0,1328,1329,3,166,83,0,1329,1330,5,61,0,0,1330,1331, - 3,166,83,0,1331,1332,5,141,0,0,1332,1334,3,166,83,0,1333,1335,3, - 142,71,0,1334,1333,1,0,0,0,1334,1335,1,0,0,0,1335,1336,1,0,0,0,1336, - 1337,5,139,0,0,1337,147,1,0,0,0,1338,1396,3,154,77,0,1339,1396,5, - 118,0,0,1340,1396,5,119,0,0,1341,1342,5,120,0,0,1342,1396,3,168, - 84,0,1343,1344,5,121,0,0,1344,1345,5,148,0,0,1345,1346,3,166,83, - 0,1346,1347,5,149,0,0,1347,1396,1,0,0,0,1348,1349,5,122,0,0,1349, - 1350,5,148,0,0,1350,1352,3,166,83,0,1351,1353,3,28,14,0,1352,1351, - 1,0,0,0,1352,1353,1,0,0,0,1353,1354,1,0,0,0,1354,1355,5,149,0,0, - 1355,1396,1,0,0,0,1356,1357,5,41,0,0,1357,1358,5,148,0,0,1358,1359, - 3,166,83,0,1359,1360,5,149,0,0,1360,1396,1,0,0,0,1361,1362,5,123, - 0,0,1362,1363,5,148,0,0,1363,1364,3,148,74,0,1364,1365,5,149,0,0, - 1365,1396,1,0,0,0,1366,1367,5,124,0,0,1367,1368,5,148,0,0,1368,1369, - 3,148,74,0,1369,1370,5,149,0,0,1370,1396,1,0,0,0,1371,1372,5,125, - 0,0,1372,1376,5,142,0,0,1373,1375,3,150,75,0,1374,1373,1,0,0,0,1375, - 1378,1,0,0,0,1376,1374,1,0,0,0,1376,1377,1,0,0,0,1377,1379,1,0,0, - 0,1378,1376,1,0,0,0,1379,1396,5,143,0,0,1380,1381,5,8,0,0,1381,1382, - 5,89,0,0,1382,1383,3,168,84,0,1383,1385,5,142,0,0,1384,1386,3,152, - 76,0,1385,1384,1,0,0,0,1386,1387,1,0,0,0,1387,1385,1,0,0,0,1387, - 1388,1,0,0,0,1388,1389,1,0,0,0,1389,1390,5,143,0,0,1390,1396,1,0, - 0,0,1391,1393,3,166,83,0,1392,1394,3,28,14,0,1393,1392,1,0,0,0,1393, - 1394,1,0,0,0,1394,1396,1,0,0,0,1395,1338,1,0,0,0,1395,1339,1,0,0, - 0,1395,1340,1,0,0,0,1395,1341,1,0,0,0,1395,1343,1,0,0,0,1395,1348, - 1,0,0,0,1395,1356,1,0,0,0,1395,1361,1,0,0,0,1395,1366,1,0,0,0,1395, - 1371,1,0,0,0,1395,1380,1,0,0,0,1395,1391,1,0,0,0,1396,149,1,0,0, - 0,1397,1398,3,166,83,0,1398,1399,5,138,0,0,1399,1400,3,148,74,0, - 1400,1401,5,139,0,0,1401,151,1,0,0,0,1402,1403,3,166,83,0,1403,1404, - 5,89,0,0,1404,1405,3,168,84,0,1405,1406,5,138,0,0,1406,1407,3,148, - 74,0,1407,1408,5,139,0,0,1408,153,1,0,0,0,1409,1410,7,7,0,0,1410, - 155,1,0,0,0,1411,1412,7,8,0,0,1412,157,1,0,0,0,1413,1422,3,168,84, - 0,1414,1422,5,152,0,0,1415,1422,5,153,0,0,1416,1422,5,134,0,0,1417, - 1422,5,135,0,0,1418,1422,5,136,0,0,1419,1422,3,160,80,0,1420,1422, - 3,164,82,0,1421,1413,1,0,0,0,1421,1414,1,0,0,0,1421,1415,1,0,0,0, - 1421,1416,1,0,0,0,1421,1417,1,0,0,0,1421,1418,1,0,0,0,1421,1419, - 1,0,0,0,1421,1420,1,0,0,0,1422,159,1,0,0,0,1423,1432,5,142,0,0,1424, - 1429,3,162,81,0,1425,1426,5,140,0,0,1426,1428,3,162,81,0,1427,1425, - 1,0,0,0,1428,1431,1,0,0,0,1429,1427,1,0,0,0,1429,1430,1,0,0,0,1430, - 1433,1,0,0,0,1431,1429,1,0,0,0,1432,1424,1,0,0,0,1432,1433,1,0,0, - 0,1433,1434,1,0,0,0,1434,1435,5,143,0,0,1435,161,1,0,0,0,1436,1437, - 3,168,84,0,1437,1438,5,138,0,0,1438,1439,3,158,79,0,1439,163,1,0, - 0,0,1440,1449,5,144,0,0,1441,1446,3,158,79,0,1442,1443,5,140,0,0, - 1443,1445,3,158,79,0,1444,1442,1,0,0,0,1445,1448,1,0,0,0,1446,1444, - 1,0,0,0,1446,1447,1,0,0,0,1447,1450,1,0,0,0,1448,1446,1,0,0,0,1449, - 1441,1,0,0,0,1449,1450,1,0,0,0,1450,1451,1,0,0,0,1451,1452,5,145, - 0,0,1452,165,1,0,0,0,1453,1454,7,9,0,0,1454,167,1,0,0,0,1455,1456, - 5,155,0,0,1456,169,1,0,0,0,129,182,189,210,223,235,255,263,270,276, - 288,291,297,308,317,327,330,332,336,344,356,361,371,381,386,401, - 407,419,428,436,444,457,460,470,474,480,487,493,501,509,522,529, - 533,538,549,555,566,592,596,602,613,622,628,633,635,666,670,676, - 703,713,724,727,732,735,738,745,754,757,760,763,786,795,809,830, - 833,836,843,851,883,895,898,902,924,938,946,958,972,989,1007,1011, - 1014,1018,1021,1027,1031,1036,1040,1044,1050,1064,1079,1099,1108, - 1140,1160,1190,1200,1203,1206,1208,1222,1246,1262,1271,1281,1294, - 1309,1321,1325,1334,1352,1376,1387,1393,1395,1421,1429,1432,1446, - 1449 + 144,146,148,150,152,154,156,158,160,162,164,166,168,170,0,10,1,0, + 50,51,2,0,17,17,35,35,1,0,13,14,1,0,107,111,3,0,1,1,102,106,108, + 109,3,0,1,1,102,103,108,109,2,0,104,106,108,109,1,0,127,134,1,0, + 114,117,13,0,1,1,4,7,10,10,12,35,42,42,48,48,78,78,85,86,100,101, + 105,105,112,112,121,121,155,155,1593,0,184,1,0,0,0,2,186,1,0,0,0, + 4,196,1,0,0,0,6,200,1,0,0,0,8,225,1,0,0,0,10,237,1,0,0,0,12,239, + 1,0,0,0,14,246,1,0,0,0,16,253,1,0,0,0,18,264,1,0,0,0,20,266,1,0, + 0,0,22,279,1,0,0,0,24,311,1,0,0,0,26,341,1,0,0,0,28,343,1,0,0,0, + 30,347,1,0,0,0,32,365,1,0,0,0,34,367,1,0,0,0,36,380,1,0,0,0,38,382, + 1,0,0,0,40,395,1,0,0,0,42,416,1,0,0,0,44,466,1,0,0,0,46,469,1,0, + 0,0,48,494,1,0,0,0,50,531,1,0,0,0,52,542,1,0,0,0,54,547,1,0,0,0, + 56,575,1,0,0,0,58,577,1,0,0,0,60,587,1,0,0,0,62,599,1,0,0,0,64,646, + 1,0,0,0,66,712,1,0,0,0,68,714,1,0,0,0,70,719,1,0,0,0,72,751,1,0, + 0,0,74,776,1,0,0,0,76,780,1,0,0,0,78,797,1,0,0,0,80,799,1,0,0,0, + 82,811,1,0,0,0,84,824,1,0,0,0,86,827,1,0,0,0,88,847,1,0,0,0,90,849, + 1,0,0,0,92,857,1,0,0,0,94,949,1,0,0,0,96,951,1,0,0,0,98,962,1,0, + 0,0,100,964,1,0,0,0,102,969,1,0,0,0,104,971,1,0,0,0,106,1000,1,0, + 0,0,108,1002,1,0,0,0,110,1011,1,0,0,0,112,1036,1,0,0,0,114,1066, + 1,0,0,0,116,1075,1,0,0,0,118,1077,1,0,0,0,120,1085,1,0,0,0,122,1110, + 1,0,0,0,124,1112,1,0,0,0,126,1124,1,0,0,0,128,1131,1,0,0,0,130,1145, + 1,0,0,0,132,1155,1,0,0,0,134,1171,1,0,0,0,136,1219,1,0,0,0,138,1221, + 1,0,0,0,140,1224,1,0,0,0,142,1226,1,0,0,0,144,1228,1,0,0,0,146,1336, + 1,0,0,0,148,1338,1,0,0,0,150,1406,1,0,0,0,152,1408,1,0,0,0,154,1413, + 1,0,0,0,156,1420,1,0,0,0,158,1422,1,0,0,0,160,1432,1,0,0,0,162,1434, + 1,0,0,0,164,1447,1,0,0,0,166,1451,1,0,0,0,168,1464,1,0,0,0,170,1466, + 1,0,0,0,172,173,3,6,3,0,173,174,5,0,0,1,174,185,1,0,0,0,175,176, + 3,22,11,0,176,177,5,0,0,1,177,185,1,0,0,0,178,179,3,54,27,0,179, + 180,5,0,0,1,180,185,1,0,0,0,181,182,3,2,1,0,182,183,5,0,0,1,183, + 185,1,0,0,0,184,172,1,0,0,0,184,175,1,0,0,0,184,178,1,0,0,0,184, + 181,1,0,0,0,185,1,1,0,0,0,186,187,5,42,0,0,187,191,5,143,0,0,188, + 190,3,8,4,0,189,188,1,0,0,0,190,193,1,0,0,0,191,189,1,0,0,0,191, + 192,1,0,0,0,192,194,1,0,0,0,193,191,1,0,0,0,194,195,5,144,0,0,195, + 3,1,0,0,0,196,197,5,43,0,0,197,198,3,170,85,0,198,199,5,140,0,0, + 199,5,1,0,0,0,200,201,5,11,0,0,201,202,3,168,84,0,202,203,5,90,0, + 0,203,204,3,170,85,0,204,205,5,81,0,0,205,206,3,170,85,0,206,207, + 5,80,0,0,207,208,3,170,85,0,208,212,5,143,0,0,209,211,3,8,4,0,210, + 209,1,0,0,0,211,214,1,0,0,0,212,210,1,0,0,0,212,213,1,0,0,0,213, + 215,1,0,0,0,214,212,1,0,0,0,215,216,5,144,0,0,216,7,1,0,0,0,217, + 226,3,4,2,0,218,226,3,20,10,0,219,226,3,10,5,0,220,226,3,100,50, + 0,221,226,3,112,56,0,222,226,3,148,74,0,223,226,3,60,30,0,224,226, + 3,34,17,0,225,217,1,0,0,0,225,218,1,0,0,0,225,219,1,0,0,0,225,220, + 1,0,0,0,225,221,1,0,0,0,225,222,1,0,0,0,225,223,1,0,0,0,225,224, + 1,0,0,0,226,9,1,0,0,0,227,228,5,43,0,0,228,229,5,47,0,0,229,230, + 3,168,84,0,230,231,5,140,0,0,231,238,1,0,0,0,232,233,5,43,0,0,233, + 234,5,49,0,0,234,235,3,168,84,0,235,236,5,140,0,0,236,238,1,0,0, + 0,237,227,1,0,0,0,237,232,1,0,0,0,238,11,1,0,0,0,239,240,5,44,0, + 0,240,241,5,46,0,0,241,242,3,168,84,0,242,243,5,90,0,0,243,244,3, + 170,85,0,244,245,5,140,0,0,245,13,1,0,0,0,246,247,5,44,0,0,247,248, + 5,47,0,0,248,249,3,168,84,0,249,250,5,81,0,0,250,251,3,170,85,0, + 251,252,5,140,0,0,252,15,1,0,0,0,253,254,5,45,0,0,254,255,3,168, + 84,0,255,256,5,90,0,0,256,257,3,170,85,0,257,258,5,140,0,0,258,17, + 1,0,0,0,259,265,3,10,5,0,260,265,3,12,6,0,261,265,3,14,7,0,262,265, + 3,16,8,0,263,265,3,34,17,0,264,259,1,0,0,0,264,260,1,0,0,0,264,261, + 1,0,0,0,264,262,1,0,0,0,264,263,1,0,0,0,265,19,1,0,0,0,266,267,5, + 46,0,0,267,268,3,168,84,0,268,269,5,90,0,0,269,272,3,170,85,0,270, + 271,5,91,0,0,271,273,3,170,85,0,272,270,1,0,0,0,272,273,1,0,0,0, + 273,274,1,0,0,0,274,275,5,140,0,0,275,21,1,0,0,0,276,278,3,18,9, + 0,277,276,1,0,0,0,278,281,1,0,0,0,279,277,1,0,0,0,279,280,1,0,0, + 0,280,282,1,0,0,0,281,279,1,0,0,0,282,283,5,47,0,0,283,285,3,168, + 84,0,284,286,3,24,12,0,285,284,1,0,0,0,285,286,1,0,0,0,286,287,1, + 0,0,0,287,288,5,90,0,0,288,289,3,170,85,0,289,290,5,81,0,0,290,300, + 3,170,85,0,291,292,5,95,0,0,292,297,3,28,14,0,293,294,5,141,0,0, + 294,296,3,28,14,0,295,293,1,0,0,0,296,299,1,0,0,0,297,295,1,0,0, + 0,297,298,1,0,0,0,298,301,1,0,0,0,299,297,1,0,0,0,300,291,1,0,0, + 0,300,301,1,0,0,0,301,302,1,0,0,0,302,306,5,143,0,0,303,305,3,36, + 18,0,304,303,1,0,0,0,305,308,1,0,0,0,306,304,1,0,0,0,306,307,1,0, + 0,0,307,309,1,0,0,0,308,306,1,0,0,0,309,310,5,144,0,0,310,23,1,0, + 0,0,311,312,5,149,0,0,312,317,3,26,13,0,313,314,5,141,0,0,314,316, + 3,26,13,0,315,313,1,0,0,0,316,319,1,0,0,0,317,315,1,0,0,0,317,318, + 1,0,0,0,318,320,1,0,0,0,319,317,1,0,0,0,320,321,5,150,0,0,321,25, + 1,0,0,0,322,323,5,50,0,0,323,326,3,168,84,0,324,325,5,139,0,0,325, + 327,5,39,0,0,326,324,1,0,0,0,326,327,1,0,0,0,327,342,1,0,0,0,328, + 329,5,38,0,0,329,339,3,168,84,0,330,331,5,40,0,0,331,336,3,28,14, + 0,332,333,5,151,0,0,333,335,3,28,14,0,334,332,1,0,0,0,335,338,1, + 0,0,0,336,334,1,0,0,0,336,337,1,0,0,0,337,340,1,0,0,0,338,336,1, + 0,0,0,339,330,1,0,0,0,339,340,1,0,0,0,340,342,1,0,0,0,341,322,1, + 0,0,0,341,328,1,0,0,0,342,27,1,0,0,0,343,345,3,168,84,0,344,346, + 3,30,15,0,345,344,1,0,0,0,345,346,1,0,0,0,346,29,1,0,0,0,347,348, + 5,149,0,0,348,353,3,32,16,0,349,350,5,141,0,0,350,352,3,32,16,0, + 351,349,1,0,0,0,352,355,1,0,0,0,353,351,1,0,0,0,353,354,1,0,0,0, + 354,356,1,0,0,0,355,353,1,0,0,0,356,357,5,150,0,0,357,31,1,0,0,0, + 358,359,5,46,0,0,359,366,3,168,84,0,360,361,5,47,0,0,361,366,3,28, + 14,0,362,363,5,38,0,0,363,366,3,168,84,0,364,366,3,150,75,0,365, + 358,1,0,0,0,365,360,1,0,0,0,365,362,1,0,0,0,365,364,1,0,0,0,366, + 33,1,0,0,0,367,368,5,37,0,0,368,370,3,168,84,0,369,371,3,24,12,0, + 370,369,1,0,0,0,370,371,1,0,0,0,371,372,1,0,0,0,372,373,5,152,0, + 0,373,374,3,150,75,0,374,375,5,140,0,0,375,35,1,0,0,0,376,381,3, + 42,21,0,377,381,3,46,23,0,378,381,3,40,20,0,379,381,3,38,19,0,380, + 376,1,0,0,0,380,377,1,0,0,0,380,378,1,0,0,0,380,379,1,0,0,0,381, + 37,1,0,0,0,382,383,5,2,0,0,383,384,3,168,84,0,384,385,5,90,0,0,385, + 386,3,170,85,0,386,387,5,3,0,0,387,390,3,170,85,0,388,389,5,5,0, + 0,389,391,3,52,26,0,390,388,1,0,0,0,390,391,1,0,0,0,391,392,1,0, + 0,0,392,393,5,140,0,0,393,39,1,0,0,0,394,396,5,61,0,0,395,394,1, + 0,0,0,395,396,1,0,0,0,396,397,1,0,0,0,397,398,5,53,0,0,398,399,3, + 168,84,0,399,400,5,90,0,0,400,401,3,170,85,0,401,402,5,139,0,0,402, + 403,3,150,75,0,403,404,5,138,0,0,404,405,3,150,75,0,405,406,5,143, + 0,0,406,407,5,107,0,0,407,408,5,90,0,0,408,410,3,170,85,0,409,411, + 3,78,39,0,410,409,1,0,0,0,410,411,1,0,0,0,411,412,1,0,0,0,412,413, + 5,140,0,0,413,414,5,144,0,0,414,41,1,0,0,0,415,417,3,48,24,0,416, + 415,1,0,0,0,416,417,1,0,0,0,417,418,1,0,0,0,418,419,7,0,0,0,419, + 420,3,168,84,0,420,421,5,90,0,0,421,422,3,170,85,0,422,423,5,139, + 0,0,423,424,3,150,75,0,424,428,5,143,0,0,425,427,3,44,22,0,426,425, + 1,0,0,0,427,430,1,0,0,0,428,426,1,0,0,0,428,429,1,0,0,0,429,431, + 1,0,0,0,430,428,1,0,0,0,431,432,5,144,0,0,432,43,1,0,0,0,433,434, + 5,97,0,0,434,435,5,90,0,0,435,437,3,170,85,0,436,438,3,78,39,0,437, + 436,1,0,0,0,437,438,1,0,0,0,438,439,1,0,0,0,439,440,5,140,0,0,440, + 467,1,0,0,0,441,442,5,98,0,0,442,443,5,90,0,0,443,445,3,170,85,0, + 444,446,3,78,39,0,445,444,1,0,0,0,445,446,1,0,0,0,446,447,1,0,0, + 0,447,448,5,140,0,0,448,467,1,0,0,0,449,450,5,1,0,0,450,451,5,90, + 0,0,451,453,3,170,85,0,452,454,3,78,39,0,453,452,1,0,0,0,453,454, + 1,0,0,0,454,455,1,0,0,0,455,456,5,140,0,0,456,467,1,0,0,0,457,458, + 5,99,0,0,458,459,5,100,0,0,459,460,5,90,0,0,460,461,3,170,85,0,461, + 462,5,101,0,0,462,463,5,90,0,0,463,464,3,170,85,0,464,465,5,140, + 0,0,465,467,1,0,0,0,466,433,1,0,0,0,466,441,1,0,0,0,466,449,1,0, + 0,0,466,457,1,0,0,0,467,45,1,0,0,0,468,470,3,48,24,0,469,468,1,0, + 0,0,469,470,1,0,0,0,470,471,1,0,0,0,471,472,5,52,0,0,472,473,3,168, + 84,0,473,474,5,90,0,0,474,475,3,170,85,0,475,476,5,139,0,0,476,477, + 3,158,79,0,477,479,3,52,26,0,478,480,5,118,0,0,479,478,1,0,0,0,479, + 480,1,0,0,0,480,483,1,0,0,0,481,482,5,88,0,0,482,484,3,170,85,0, + 483,481,1,0,0,0,483,484,1,0,0,0,484,485,1,0,0,0,485,489,5,143,0, + 0,486,488,3,50,25,0,487,486,1,0,0,0,488,491,1,0,0,0,489,487,1,0, + 0,0,489,490,1,0,0,0,490,492,1,0,0,0,491,489,1,0,0,0,492,493,5,144, + 0,0,493,47,1,0,0,0,494,496,5,34,0,0,495,497,7,1,0,0,496,495,1,0, + 0,0,496,497,1,0,0,0,497,49,1,0,0,0,498,499,5,104,0,0,499,500,5,90, + 0,0,500,502,3,170,85,0,501,503,3,78,39,0,502,501,1,0,0,0,502,503, + 1,0,0,0,503,504,1,0,0,0,504,505,5,140,0,0,505,532,1,0,0,0,506,507, + 5,105,0,0,507,508,5,90,0,0,508,510,3,170,85,0,509,511,3,78,39,0, + 510,509,1,0,0,0,510,511,1,0,0,0,511,512,1,0,0,0,512,513,5,140,0, + 0,513,532,1,0,0,0,514,515,5,106,0,0,515,516,5,90,0,0,516,518,3,170, + 85,0,517,519,3,78,39,0,518,517,1,0,0,0,518,519,1,0,0,0,519,520,1, + 0,0,0,520,521,5,140,0,0,521,532,1,0,0,0,522,523,5,99,0,0,523,524, + 5,100,0,0,524,525,5,90,0,0,525,526,3,170,85,0,526,527,5,101,0,0, + 527,528,5,90,0,0,528,529,3,170,85,0,529,530,5,140,0,0,530,532,1, + 0,0,0,531,498,1,0,0,0,531,506,1,0,0,0,531,514,1,0,0,0,531,522,1, + 0,0,0,532,51,1,0,0,0,533,534,5,46,0,0,534,543,3,168,84,0,535,536, + 5,47,0,0,536,538,3,168,84,0,537,539,3,30,15,0,538,537,1,0,0,0,538, + 539,1,0,0,0,539,543,1,0,0,0,540,541,5,38,0,0,541,543,3,168,84,0, + 542,533,1,0,0,0,542,535,1,0,0,0,542,540,1,0,0,0,543,53,1,0,0,0,544, + 546,3,18,9,0,545,544,1,0,0,0,546,549,1,0,0,0,547,545,1,0,0,0,547, + 548,1,0,0,0,548,550,1,0,0,0,549,547,1,0,0,0,550,551,5,49,0,0,551, + 552,3,168,84,0,552,553,5,90,0,0,553,554,3,170,85,0,554,555,5,81, + 0,0,555,558,3,170,85,0,556,557,5,82,0,0,557,559,5,153,0,0,558,556, + 1,0,0,0,558,559,1,0,0,0,559,560,1,0,0,0,560,564,5,143,0,0,561,563, + 3,56,28,0,562,561,1,0,0,0,563,566,1,0,0,0,564,562,1,0,0,0,564,565, + 1,0,0,0,565,567,1,0,0,0,566,564,1,0,0,0,567,568,5,144,0,0,568,55, + 1,0,0,0,569,576,3,70,35,0,570,576,3,72,36,0,571,576,3,82,41,0,572, + 576,3,62,31,0,573,576,3,64,32,0,574,576,3,58,29,0,575,569,1,0,0, + 0,575,570,1,0,0,0,575,571,1,0,0,0,575,572,1,0,0,0,575,573,1,0,0, + 0,575,574,1,0,0,0,576,57,1,0,0,0,577,578,5,2,0,0,578,579,3,168,84, + 0,579,580,5,90,0,0,580,581,3,170,85,0,581,582,5,40,0,0,582,583,3, + 28,14,0,583,584,5,142,0,0,584,585,3,168,84,0,585,586,5,140,0,0,586, + 59,1,0,0,0,587,588,5,4,0,0,588,589,3,168,84,0,589,590,5,90,0,0,590, + 591,3,170,85,0,591,592,5,6,0,0,592,593,3,28,14,0,593,594,5,69,0, + 0,594,595,3,168,84,0,595,596,5,142,0,0,596,597,3,168,84,0,597,598, + 5,140,0,0,598,61,1,0,0,0,599,601,5,24,0,0,600,602,5,42,0,0,601,600, + 1,0,0,0,601,602,1,0,0,0,602,603,1,0,0,0,603,605,3,168,84,0,604,606, + 3,24,12,0,605,604,1,0,0,0,605,606,1,0,0,0,606,607,1,0,0,0,607,608, + 5,90,0,0,608,609,3,170,85,0,609,611,5,27,0,0,610,612,5,11,0,0,611, + 610,1,0,0,0,611,612,1,0,0,0,612,613,1,0,0,0,613,614,3,28,14,0,614, + 615,5,28,0,0,615,644,3,170,85,0,616,617,5,53,0,0,617,618,3,170,85, + 0,618,622,5,143,0,0,619,621,3,66,33,0,620,619,1,0,0,0,621,624,1, + 0,0,0,622,620,1,0,0,0,622,623,1,0,0,0,623,625,1,0,0,0,624,622,1, + 0,0,0,625,626,5,144,0,0,626,645,1,0,0,0,627,628,5,42,0,0,628,631, + 3,170,85,0,629,630,5,53,0,0,630,632,3,170,85,0,631,629,1,0,0,0,631, + 632,1,0,0,0,632,642,1,0,0,0,633,637,5,143,0,0,634,636,3,66,33,0, + 635,634,1,0,0,0,636,639,1,0,0,0,637,635,1,0,0,0,637,638,1,0,0,0, + 638,640,1,0,0,0,639,637,1,0,0,0,640,643,5,144,0,0,641,643,5,140, + 0,0,642,633,1,0,0,0,642,641,1,0,0,0,643,645,1,0,0,0,644,616,1,0, + 0,0,644,627,1,0,0,0,645,63,1,0,0,0,646,647,5,24,0,0,647,648,3,168, + 84,0,648,649,5,90,0,0,649,650,3,170,85,0,650,651,5,26,0,0,651,652, + 3,168,84,0,652,653,3,30,15,0,653,654,5,140,0,0,654,65,1,0,0,0,655, + 656,5,18,0,0,656,713,5,140,0,0,657,658,5,19,0,0,658,659,5,20,0,0, + 659,660,3,168,84,0,660,661,5,140,0,0,661,713,1,0,0,0,662,663,5,29, + 0,0,663,664,3,170,85,0,664,665,5,140,0,0,665,713,1,0,0,0,666,667, + 5,29,0,0,667,668,3,168,84,0,668,669,5,142,0,0,669,679,3,168,84,0, + 670,671,5,68,0,0,671,675,5,143,0,0,672,674,3,68,34,0,673,672,1,0, + 0,0,674,677,1,0,0,0,675,673,1,0,0,0,675,676,1,0,0,0,676,678,1,0, + 0,0,677,675,1,0,0,0,678,680,5,144,0,0,679,670,1,0,0,0,679,680,1, + 0,0,0,680,681,1,0,0,0,681,682,5,140,0,0,682,713,1,0,0,0,683,685, + 5,30,0,0,684,686,5,38,0,0,685,684,1,0,0,0,685,686,1,0,0,0,686,687, + 1,0,0,0,687,688,3,168,84,0,688,689,5,59,0,0,689,690,3,28,14,0,690, + 691,5,140,0,0,691,713,1,0,0,0,692,693,5,31,0,0,693,694,3,168,84, + 0,694,695,5,153,0,0,695,696,5,140,0,0,696,713,1,0,0,0,697,698,5, + 32,0,0,698,699,3,28,14,0,699,700,5,142,0,0,700,701,3,168,84,0,701, + 702,3,168,84,0,702,703,3,170,85,0,703,704,5,140,0,0,704,713,1,0, + 0,0,705,706,5,99,0,0,706,713,5,140,0,0,707,708,5,33,0,0,708,709, + 5,153,0,0,709,710,3,170,85,0,710,711,5,140,0,0,711,713,1,0,0,0,712, + 655,1,0,0,0,712,657,1,0,0,0,712,662,1,0,0,0,712,666,1,0,0,0,712, + 683,1,0,0,0,712,692,1,0,0,0,712,697,1,0,0,0,712,705,1,0,0,0,712, + 707,1,0,0,0,713,67,1,0,0,0,714,715,3,168,84,0,715,716,5,62,0,0,716, + 717,3,168,84,0,717,718,5,140,0,0,718,69,1,0,0,0,719,720,5,53,0,0, + 720,722,3,168,84,0,721,723,3,24,12,0,722,721,1,0,0,0,722,723,1,0, + 0,0,723,724,1,0,0,0,724,725,5,90,0,0,725,726,3,170,85,0,726,727, + 5,139,0,0,727,728,3,150,75,0,728,729,5,138,0,0,729,730,3,150,75, + 0,730,731,5,92,0,0,731,733,3,86,43,0,732,734,3,78,39,0,733,732,1, + 0,0,0,733,734,1,0,0,0,734,736,1,0,0,0,735,737,3,84,42,0,736,735, + 1,0,0,0,736,737,1,0,0,0,737,738,1,0,0,0,738,739,5,94,0,0,739,741, + 3,88,44,0,740,742,3,92,46,0,741,740,1,0,0,0,741,742,1,0,0,0,742, + 744,1,0,0,0,743,745,3,76,38,0,744,743,1,0,0,0,744,745,1,0,0,0,745, + 747,1,0,0,0,746,748,3,74,37,0,747,746,1,0,0,0,747,748,1,0,0,0,748, + 749,1,0,0,0,749,750,5,140,0,0,750,71,1,0,0,0,751,752,5,54,0,0,752, + 754,3,168,84,0,753,755,3,24,12,0,754,753,1,0,0,0,754,755,1,0,0,0, + 755,756,1,0,0,0,756,757,5,90,0,0,757,758,3,170,85,0,758,759,5,139, + 0,0,759,760,3,150,75,0,760,761,5,138,0,0,761,763,3,150,75,0,762, + 764,3,78,39,0,763,762,1,0,0,0,763,764,1,0,0,0,764,766,1,0,0,0,765, + 767,3,92,46,0,766,765,1,0,0,0,766,767,1,0,0,0,767,769,1,0,0,0,768, + 770,3,76,38,0,769,768,1,0,0,0,769,770,1,0,0,0,770,772,1,0,0,0,771, + 773,3,74,37,0,772,771,1,0,0,0,772,773,1,0,0,0,773,774,1,0,0,0,774, + 775,5,140,0,0,775,73,1,0,0,0,776,777,5,70,0,0,777,778,5,69,0,0,778, + 779,3,168,84,0,779,75,1,0,0,0,780,781,5,9,0,0,781,782,5,7,0,0,782, + 783,3,168,84,0,783,784,5,69,0,0,784,785,3,170,85,0,785,77,1,0,0, + 0,786,787,5,12,0,0,787,798,5,15,0,0,788,789,5,12,0,0,789,795,7,2, + 0,0,790,791,5,16,0,0,791,792,5,145,0,0,792,793,3,90,45,0,793,794, + 5,146,0,0,794,796,1,0,0,0,795,790,1,0,0,0,795,796,1,0,0,0,796,798, + 1,0,0,0,797,786,1,0,0,0,797,788,1,0,0,0,798,79,1,0,0,0,799,800,5, + 69,0,0,800,801,5,145,0,0,801,806,3,132,66,0,802,803,5,141,0,0,803, + 805,3,132,66,0,804,802,1,0,0,0,805,808,1,0,0,0,806,804,1,0,0,0,806, + 807,1,0,0,0,807,809,1,0,0,0,808,806,1,0,0,0,809,810,5,146,0,0,810, + 81,1,0,0,0,811,812,5,55,0,0,812,813,3,168,84,0,813,814,5,90,0,0, + 814,815,3,170,85,0,815,816,5,56,0,0,816,817,3,168,84,0,817,818,5, + 139,0,0,818,820,3,150,75,0,819,821,3,92,46,0,820,819,1,0,0,0,820, + 821,1,0,0,0,821,822,1,0,0,0,822,823,5,140,0,0,823,83,1,0,0,0,824, + 825,5,93,0,0,825,826,3,150,75,0,826,85,1,0,0,0,827,828,7,3,0,0,828, + 87,1,0,0,0,829,848,5,96,0,0,830,831,5,46,0,0,831,848,3,168,84,0, + 832,833,5,38,0,0,833,848,3,168,84,0,834,835,5,48,0,0,835,844,5,145, + 0,0,836,841,3,28,14,0,837,838,5,141,0,0,838,840,3,28,14,0,839,837, + 1,0,0,0,840,843,1,0,0,0,841,839,1,0,0,0,841,842,1,0,0,0,842,845, + 1,0,0,0,843,841,1,0,0,0,844,836,1,0,0,0,844,845,1,0,0,0,845,846, + 1,0,0,0,846,848,5,146,0,0,847,829,1,0,0,0,847,830,1,0,0,0,847,832, + 1,0,0,0,847,834,1,0,0,0,848,89,1,0,0,0,849,854,3,168,84,0,850,851, + 5,141,0,0,851,853,3,168,84,0,852,850,1,0,0,0,853,856,1,0,0,0,854, + 852,1,0,0,0,854,855,1,0,0,0,855,91,1,0,0,0,856,854,1,0,0,0,857,858, + 5,95,0,0,858,862,5,143,0,0,859,861,3,94,47,0,860,859,1,0,0,0,861, + 864,1,0,0,0,862,860,1,0,0,0,862,863,1,0,0,0,863,865,1,0,0,0,864, + 862,1,0,0,0,865,866,5,144,0,0,866,93,1,0,0,0,867,868,5,25,0,0,868, + 869,3,168,84,0,869,870,5,90,0,0,870,871,3,170,85,0,871,872,5,145, + 0,0,872,873,3,90,45,0,873,874,5,146,0,0,874,875,5,140,0,0,875,950, + 1,0,0,0,876,877,5,65,0,0,877,878,3,168,84,0,878,879,5,90,0,0,879, + 880,3,170,85,0,880,881,5,139,0,0,881,882,3,150,75,0,882,883,3,96, + 48,0,883,884,5,140,0,0,884,950,1,0,0,0,885,886,5,66,0,0,886,887, + 3,168,84,0,887,888,5,90,0,0,888,889,3,170,85,0,889,890,5,139,0,0, + 890,891,3,158,79,0,891,894,3,52,26,0,892,893,5,88,0,0,893,895,3, + 170,85,0,894,892,1,0,0,0,894,895,1,0,0,0,895,896,1,0,0,0,896,897, + 3,96,48,0,897,898,5,140,0,0,898,950,1,0,0,0,899,900,5,47,0,0,900, + 901,3,168,84,0,901,902,5,90,0,0,902,903,3,170,85,0,903,904,5,139, + 0,0,904,906,3,168,84,0,905,907,3,30,15,0,906,905,1,0,0,0,906,907, + 1,0,0,0,907,909,1,0,0,0,908,910,3,80,40,0,909,908,1,0,0,0,909,910, + 1,0,0,0,910,913,1,0,0,0,911,912,5,20,0,0,912,914,5,57,0,0,913,911, + 1,0,0,0,913,914,1,0,0,0,914,915,1,0,0,0,915,916,5,140,0,0,916,950, + 1,0,0,0,917,918,5,7,0,0,918,919,3,168,84,0,919,920,5,90,0,0,920, + 921,3,170,85,0,921,922,5,139,0,0,922,923,3,168,84,0,923,924,5,57, + 0,0,924,925,3,150,75,0,925,926,5,140,0,0,926,950,1,0,0,0,927,928, + 5,55,0,0,928,929,3,168,84,0,929,930,5,90,0,0,930,931,3,170,85,0, + 931,932,5,139,0,0,932,935,3,168,84,0,933,934,5,57,0,0,934,936,3, + 150,75,0,935,933,1,0,0,0,935,936,1,0,0,0,936,937,1,0,0,0,937,938, + 5,140,0,0,938,950,1,0,0,0,939,940,5,24,0,0,940,941,3,168,84,0,941, + 942,5,90,0,0,942,943,3,170,85,0,943,944,5,139,0,0,944,945,3,168, + 84,0,945,946,5,142,0,0,946,947,3,168,84,0,947,948,5,140,0,0,948, + 950,1,0,0,0,949,867,1,0,0,0,949,876,1,0,0,0,949,885,1,0,0,0,949, + 899,1,0,0,0,949,917,1,0,0,0,949,927,1,0,0,0,949,939,1,0,0,0,950, + 95,1,0,0,0,951,952,5,145,0,0,952,957,3,98,49,0,953,954,5,141,0,0, + 954,956,3,98,49,0,955,953,1,0,0,0,956,959,1,0,0,0,957,955,1,0,0, + 0,957,958,1,0,0,0,958,960,1,0,0,0,959,957,1,0,0,0,960,961,5,146, + 0,0,961,97,1,0,0,0,962,963,7,4,0,0,963,99,1,0,0,0,964,965,5,64,0, + 0,965,966,3,102,51,0,966,101,1,0,0,0,967,970,3,104,52,0,968,970, + 3,108,54,0,969,967,1,0,0,0,969,968,1,0,0,0,970,103,1,0,0,0,971,972, + 5,65,0,0,972,973,3,168,84,0,973,974,5,90,0,0,974,975,3,170,85,0, + 975,976,5,75,0,0,976,977,3,168,84,0,977,978,5,139,0,0,978,979,3, + 150,75,0,979,980,5,76,0,0,980,983,3,106,53,0,981,982,5,77,0,0,982, + 984,3,160,80,0,983,981,1,0,0,0,983,984,1,0,0,0,984,985,1,0,0,0,985, + 986,5,140,0,0,986,105,1,0,0,0,987,1001,5,112,0,0,988,989,5,113,0, + 0,989,990,5,147,0,0,990,991,3,150,75,0,991,992,5,148,0,0,992,1001, + 1,0,0,0,993,994,5,85,0,0,994,1001,3,162,81,0,995,996,5,86,0,0,996, + 997,5,147,0,0,997,998,3,150,75,0,998,999,5,148,0,0,999,1001,1,0, + 0,0,1000,987,1,0,0,0,1000,988,1,0,0,0,1000,993,1,0,0,0,1000,995, + 1,0,0,0,1001,107,1,0,0,0,1002,1003,5,66,0,0,1003,1004,3,168,84,0, + 1004,1005,5,90,0,0,1005,1006,3,170,85,0,1006,1007,5,143,0,0,1007, + 1008,3,110,55,0,1008,1009,3,110,55,0,1009,1010,5,144,0,0,1010,109, + 1,0,0,0,1011,1012,3,52,26,0,1012,1013,5,67,0,0,1013,1014,3,168,84, + 0,1014,1015,5,90,0,0,1015,1016,3,170,85,0,1016,1018,3,158,79,0,1017, + 1019,5,118,0,0,1018,1017,1,0,0,0,1018,1019,1,0,0,0,1019,1022,1,0, + 0,0,1020,1021,5,83,0,0,1021,1023,3,170,85,0,1022,1020,1,0,0,0,1022, + 1023,1,0,0,0,1023,1025,1,0,0,0,1024,1026,5,87,0,0,1025,1024,1,0, + 0,0,1025,1026,1,0,0,0,1026,1029,1,0,0,0,1027,1028,5,88,0,0,1028, + 1030,3,170,85,0,1029,1027,1,0,0,0,1029,1030,1,0,0,0,1030,1032,1, + 0,0,0,1031,1033,5,89,0,0,1032,1031,1,0,0,0,1032,1033,1,0,0,0,1033, + 1034,1,0,0,0,1034,1035,5,140,0,0,1035,111,1,0,0,0,1036,1038,5,58, + 0,0,1037,1039,3,24,12,0,1038,1037,1,0,0,0,1038,1039,1,0,0,0,1039, + 1040,1,0,0,0,1040,1042,3,168,84,0,1041,1043,3,114,57,0,1042,1041, + 1,0,0,0,1042,1043,1,0,0,0,1043,1044,1,0,0,0,1044,1045,5,59,0,0,1045, + 1047,3,168,84,0,1046,1048,3,30,15,0,1047,1046,1,0,0,0,1047,1048, + 1,0,0,0,1048,1051,1,0,0,0,1049,1050,5,90,0,0,1050,1052,3,170,85, + 0,1051,1049,1,0,0,0,1051,1052,1,0,0,0,1052,1055,1,0,0,0,1053,1054, + 5,82,0,0,1054,1056,5,153,0,0,1055,1053,1,0,0,0,1055,1056,1,0,0,0, + 1056,1057,1,0,0,0,1057,1061,5,143,0,0,1058,1060,3,116,58,0,1059, + 1058,1,0,0,0,1060,1063,1,0,0,0,1061,1059,1,0,0,0,1061,1062,1,0,0, + 0,1062,1064,1,0,0,0,1063,1061,1,0,0,0,1064,1065,5,144,0,0,1065,113, + 1,0,0,0,1066,1067,3,30,15,0,1067,115,1,0,0,0,1068,1069,5,63,0,0, + 1069,1076,3,102,51,0,1070,1076,3,130,65,0,1071,1076,3,126,63,0,1072, + 1076,3,120,60,0,1073,1076,3,128,64,0,1074,1076,3,118,59,0,1075,1068, + 1,0,0,0,1075,1070,1,0,0,0,1075,1071,1,0,0,0,1075,1072,1,0,0,0,1075, + 1073,1,0,0,0,1075,1074,1,0,0,0,1076,117,1,0,0,0,1077,1078,5,60,0, + 0,1078,1079,3,168,84,0,1079,1080,5,62,0,0,1080,1081,3,168,84,0,1081, + 1082,5,142,0,0,1082,1083,3,168,84,0,1083,1084,5,140,0,0,1084,119, + 1,0,0,0,1085,1086,5,10,0,0,1086,1090,5,143,0,0,1087,1089,3,122,61, + 0,1088,1087,1,0,0,0,1089,1092,1,0,0,0,1090,1088,1,0,0,0,1090,1091, + 1,0,0,0,1091,1093,1,0,0,0,1092,1090,1,0,0,0,1093,1094,5,144,0,0, + 1094,1095,5,140,0,0,1095,121,1,0,0,0,1096,1097,3,168,84,0,1097,1098, + 5,62,0,0,1098,1099,5,65,0,0,1099,1100,3,168,84,0,1100,1101,5,140, + 0,0,1101,1111,1,0,0,0,1102,1103,3,168,84,0,1103,1104,5,62,0,0,1104, + 1105,5,66,0,0,1105,1106,3,168,84,0,1106,1107,5,142,0,0,1107,1108, + 3,168,84,0,1108,1109,5,140,0,0,1109,1111,1,0,0,0,1110,1096,1,0,0, + 0,1110,1102,1,0,0,0,1111,123,1,0,0,0,1112,1113,3,28,14,0,1113,1114, + 5,20,0,0,1114,1119,5,57,0,0,1115,1116,5,142,0,0,1116,1118,3,168, + 84,0,1117,1115,1,0,0,0,1118,1121,1,0,0,0,1119,1117,1,0,0,0,1119, + 1120,1,0,0,0,1120,1122,1,0,0,0,1121,1119,1,0,0,0,1122,1123,5,140, + 0,0,1123,125,1,0,0,0,1124,1125,5,60,0,0,1125,1126,3,168,84,0,1126, + 1127,5,62,0,0,1127,1128,5,65,0,0,1128,1129,3,168,84,0,1129,1130, + 5,140,0,0,1130,127,1,0,0,0,1131,1132,5,72,0,0,1132,1133,3,168,84, + 0,1133,1134,5,73,0,0,1134,1135,5,74,0,0,1135,1136,5,69,0,0,1136, + 1137,5,55,0,0,1137,1138,3,168,84,0,1138,1139,5,71,0,0,1139,1140, + 5,66,0,0,1140,1141,3,168,84,0,1141,1142,5,142,0,0,1142,1143,3,168, + 84,0,1143,1144,5,140,0,0,1144,129,1,0,0,0,1145,1146,5,60,0,0,1146, + 1147,3,132,66,0,1147,1148,5,62,0,0,1148,1151,3,136,68,0,1149,1150, + 5,36,0,0,1150,1152,3,170,85,0,1151,1149,1,0,0,0,1151,1152,1,0,0, + 0,1152,1153,1,0,0,0,1153,1154,5,140,0,0,1154,131,1,0,0,0,1155,1156, + 3,168,84,0,1156,1157,5,142,0,0,1157,1158,3,134,67,0,1158,133,1,0, + 0,0,1159,1172,3,168,84,0,1160,1172,5,107,0,0,1161,1172,5,97,0,0, + 1162,1172,5,98,0,0,1163,1172,5,1,0,0,1164,1172,5,104,0,0,1165,1172, + 5,105,0,0,1166,1172,5,106,0,0,1167,1172,5,108,0,0,1168,1172,5,109, + 0,0,1169,1172,5,110,0,0,1170,1172,5,111,0,0,1171,1159,1,0,0,0,1171, + 1160,1,0,0,0,1171,1161,1,0,0,0,1171,1162,1,0,0,0,1171,1163,1,0,0, + 0,1171,1164,1,0,0,0,1171,1165,1,0,0,0,1171,1166,1,0,0,0,1171,1167, + 1,0,0,0,1171,1168,1,0,0,0,1171,1169,1,0,0,0,1171,1170,1,0,0,0,1172, + 135,1,0,0,0,1173,1174,5,84,0,0,1174,1175,5,142,0,0,1175,1220,3,168, + 84,0,1176,1177,5,85,0,0,1177,1178,3,168,84,0,1178,1179,5,142,0,0, + 1179,1180,3,168,84,0,1180,1220,1,0,0,0,1181,1182,5,86,0,0,1182,1183, + 3,168,84,0,1183,1184,5,142,0,0,1184,1185,3,168,84,0,1185,1220,1, + 0,0,0,1186,1187,5,65,0,0,1187,1188,3,168,84,0,1188,1189,5,142,0, + 0,1189,1190,3,140,70,0,1190,1220,1,0,0,0,1191,1192,5,66,0,0,1192, + 1193,3,168,84,0,1193,1194,5,142,0,0,1194,1195,3,168,84,0,1195,1196, + 5,142,0,0,1196,1197,3,142,71,0,1197,1220,1,0,0,0,1198,1199,5,47, + 0,0,1199,1201,3,168,84,0,1200,1202,3,30,15,0,1201,1200,1,0,0,0,1201, + 1202,1,0,0,0,1202,1203,1,0,0,0,1203,1204,5,142,0,0,1204,1205,3,132, + 66,0,1205,1220,1,0,0,0,1206,1207,5,49,0,0,1207,1208,3,168,84,0,1208, + 1209,5,142,0,0,1209,1211,3,168,84,0,1210,1212,3,30,15,0,1211,1210, + 1,0,0,0,1211,1212,1,0,0,0,1212,1214,1,0,0,0,1213,1215,3,144,72,0, + 1214,1213,1,0,0,0,1214,1215,1,0,0,0,1215,1217,1,0,0,0,1216,1218, + 3,138,69,0,1217,1216,1,0,0,0,1217,1218,1,0,0,0,1218,1220,1,0,0,0, + 1219,1173,1,0,0,0,1219,1176,1,0,0,0,1219,1181,1,0,0,0,1219,1186, + 1,0,0,0,1219,1191,1,0,0,0,1219,1198,1,0,0,0,1219,1206,1,0,0,0,1220, + 137,1,0,0,0,1221,1222,5,70,0,0,1222,1223,3,144,72,0,1223,139,1,0, + 0,0,1224,1225,7,5,0,0,1225,141,1,0,0,0,1226,1227,7,6,0,0,1227,143, + 1,0,0,0,1228,1229,5,68,0,0,1229,1233,5,143,0,0,1230,1232,3,146,73, + 0,1231,1230,1,0,0,0,1232,1235,1,0,0,0,1233,1231,1,0,0,0,1233,1234, + 1,0,0,0,1234,1236,1,0,0,0,1235,1233,1,0,0,0,1236,1237,5,144,0,0, + 1237,145,1,0,0,0,1238,1239,3,168,84,0,1239,1240,5,62,0,0,1240,1241, + 5,11,0,0,1241,1242,5,25,0,0,1242,1243,5,145,0,0,1243,1244,3,90,45, + 0,1244,1245,5,146,0,0,1245,1246,5,140,0,0,1246,1337,1,0,0,0,1247, + 1248,3,168,84,0,1248,1249,5,62,0,0,1249,1250,5,65,0,0,1250,1257, + 3,168,84,0,1251,1252,5,71,0,0,1252,1253,5,66,0,0,1253,1254,3,168, + 84,0,1254,1255,5,142,0,0,1255,1256,3,168,84,0,1256,1258,1,0,0,0, + 1257,1251,1,0,0,0,1257,1258,1,0,0,0,1258,1259,1,0,0,0,1259,1260, + 5,140,0,0,1260,1337,1,0,0,0,1261,1262,3,168,84,0,1262,1263,5,62, + 0,0,1263,1264,5,66,0,0,1264,1265,3,168,84,0,1265,1266,5,142,0,0, + 1266,1273,3,168,84,0,1267,1268,5,71,0,0,1268,1269,5,66,0,0,1269, + 1270,3,168,84,0,1270,1271,5,142,0,0,1271,1272,3,168,84,0,1272,1274, + 1,0,0,0,1273,1267,1,0,0,0,1273,1274,1,0,0,0,1274,1275,1,0,0,0,1275, + 1276,5,140,0,0,1276,1337,1,0,0,0,1277,1278,3,168,84,0,1278,1279, + 5,62,0,0,1279,1280,5,47,0,0,1280,1282,3,168,84,0,1281,1283,3,30, + 15,0,1282,1281,1,0,0,0,1282,1283,1,0,0,0,1283,1292,1,0,0,0,1284, + 1285,5,71,0,0,1285,1286,5,66,0,0,1286,1287,3,168,84,0,1287,1288, + 5,142,0,0,1288,1289,3,168,84,0,1289,1293,1,0,0,0,1290,1291,5,20, + 0,0,1291,1293,5,57,0,0,1292,1284,1,0,0,0,1292,1290,1,0,0,0,1292, + 1293,1,0,0,0,1293,1294,1,0,0,0,1294,1295,5,140,0,0,1295,1337,1,0, + 0,0,1296,1297,3,168,84,0,1297,1298,5,62,0,0,1298,1299,5,7,0,0,1299, + 1300,3,168,84,0,1300,1301,5,68,0,0,1301,1305,5,143,0,0,1302,1304, + 3,124,62,0,1303,1302,1,0,0,0,1304,1307,1,0,0,0,1305,1303,1,0,0,0, + 1305,1306,1,0,0,0,1306,1308,1,0,0,0,1307,1305,1,0,0,0,1308,1309, + 5,144,0,0,1309,1310,5,140,0,0,1310,1337,1,0,0,0,1311,1312,3,168, + 84,0,1312,1313,5,62,0,0,1313,1314,5,55,0,0,1314,1315,3,168,84,0, + 1315,1316,5,140,0,0,1316,1337,1,0,0,0,1317,1318,3,168,84,0,1318, + 1320,5,62,0,0,1319,1321,5,11,0,0,1320,1319,1,0,0,0,1320,1321,1,0, + 0,0,1321,1322,1,0,0,0,1322,1323,5,24,0,0,1323,1324,3,168,84,0,1324, + 1325,5,142,0,0,1325,1332,3,168,84,0,1326,1327,5,71,0,0,1327,1328, + 5,66,0,0,1328,1329,3,168,84,0,1329,1330,5,142,0,0,1330,1331,3,168, + 84,0,1331,1333,1,0,0,0,1332,1326,1,0,0,0,1332,1333,1,0,0,0,1333, + 1334,1,0,0,0,1334,1335,5,140,0,0,1335,1337,1,0,0,0,1336,1238,1,0, + 0,0,1336,1247,1,0,0,0,1336,1261,1,0,0,0,1336,1277,1,0,0,0,1336,1296, + 1,0,0,0,1336,1311,1,0,0,0,1336,1317,1,0,0,0,1337,147,1,0,0,0,1338, + 1339,5,55,0,0,1339,1340,3,168,84,0,1340,1341,5,62,0,0,1341,1342, + 3,168,84,0,1342,1343,5,142,0,0,1343,1345,3,168,84,0,1344,1346,3, + 144,72,0,1345,1344,1,0,0,0,1345,1346,1,0,0,0,1346,1347,1,0,0,0,1347, + 1348,5,140,0,0,1348,149,1,0,0,0,1349,1407,3,156,78,0,1350,1407,5, + 119,0,0,1351,1407,5,120,0,0,1352,1353,5,121,0,0,1353,1407,3,170, + 85,0,1354,1355,5,122,0,0,1355,1356,5,149,0,0,1356,1357,3,168,84, + 0,1357,1358,5,150,0,0,1358,1407,1,0,0,0,1359,1360,5,123,0,0,1360, + 1361,5,149,0,0,1361,1363,3,168,84,0,1362,1364,3,30,15,0,1363,1362, + 1,0,0,0,1363,1364,1,0,0,0,1364,1365,1,0,0,0,1365,1366,5,150,0,0, + 1366,1407,1,0,0,0,1367,1368,5,41,0,0,1368,1369,5,149,0,0,1369,1370, + 3,168,84,0,1370,1371,5,150,0,0,1371,1407,1,0,0,0,1372,1373,5,124, + 0,0,1373,1374,5,149,0,0,1374,1375,3,150,75,0,1375,1376,5,150,0,0, + 1376,1407,1,0,0,0,1377,1378,5,125,0,0,1378,1379,5,149,0,0,1379,1380, + 3,150,75,0,1380,1381,5,150,0,0,1381,1407,1,0,0,0,1382,1383,5,126, + 0,0,1383,1387,5,143,0,0,1384,1386,3,152,76,0,1385,1384,1,0,0,0,1386, + 1389,1,0,0,0,1387,1385,1,0,0,0,1387,1388,1,0,0,0,1388,1390,1,0,0, + 0,1389,1387,1,0,0,0,1390,1407,5,144,0,0,1391,1392,5,8,0,0,1392,1393, + 5,90,0,0,1393,1394,3,170,85,0,1394,1396,5,143,0,0,1395,1397,3,154, + 77,0,1396,1395,1,0,0,0,1397,1398,1,0,0,0,1398,1396,1,0,0,0,1398, + 1399,1,0,0,0,1399,1400,1,0,0,0,1400,1401,5,144,0,0,1401,1407,1,0, + 0,0,1402,1404,3,168,84,0,1403,1405,3,30,15,0,1404,1403,1,0,0,0,1404, + 1405,1,0,0,0,1405,1407,1,0,0,0,1406,1349,1,0,0,0,1406,1350,1,0,0, + 0,1406,1351,1,0,0,0,1406,1352,1,0,0,0,1406,1354,1,0,0,0,1406,1359, + 1,0,0,0,1406,1367,1,0,0,0,1406,1372,1,0,0,0,1406,1377,1,0,0,0,1406, + 1382,1,0,0,0,1406,1391,1,0,0,0,1406,1402,1,0,0,0,1407,151,1,0,0, + 0,1408,1409,3,168,84,0,1409,1410,5,139,0,0,1410,1411,3,150,75,0, + 1411,1412,5,140,0,0,1412,153,1,0,0,0,1413,1414,3,168,84,0,1414,1415, + 5,90,0,0,1415,1416,3,170,85,0,1416,1417,5,139,0,0,1417,1418,3,150, + 75,0,1418,1419,5,140,0,0,1419,155,1,0,0,0,1420,1421,7,7,0,0,1421, + 157,1,0,0,0,1422,1423,7,8,0,0,1423,159,1,0,0,0,1424,1433,3,170,85, + 0,1425,1433,5,153,0,0,1426,1433,5,154,0,0,1427,1433,5,135,0,0,1428, + 1433,5,136,0,0,1429,1433,5,137,0,0,1430,1433,3,162,81,0,1431,1433, + 3,166,83,0,1432,1424,1,0,0,0,1432,1425,1,0,0,0,1432,1426,1,0,0,0, + 1432,1427,1,0,0,0,1432,1428,1,0,0,0,1432,1429,1,0,0,0,1432,1430, + 1,0,0,0,1432,1431,1,0,0,0,1433,161,1,0,0,0,1434,1443,5,143,0,0,1435, + 1440,3,164,82,0,1436,1437,5,141,0,0,1437,1439,3,164,82,0,1438,1436, + 1,0,0,0,1439,1442,1,0,0,0,1440,1438,1,0,0,0,1440,1441,1,0,0,0,1441, + 1444,1,0,0,0,1442,1440,1,0,0,0,1443,1435,1,0,0,0,1443,1444,1,0,0, + 0,1444,1445,1,0,0,0,1445,1446,5,144,0,0,1446,163,1,0,0,0,1447,1448, + 3,170,85,0,1448,1449,5,139,0,0,1449,1450,3,160,80,0,1450,165,1,0, + 0,0,1451,1460,5,145,0,0,1452,1457,3,160,80,0,1453,1454,5,141,0,0, + 1454,1456,3,160,80,0,1455,1453,1,0,0,0,1456,1459,1,0,0,0,1457,1455, + 1,0,0,0,1457,1458,1,0,0,0,1458,1461,1,0,0,0,1459,1457,1,0,0,0,1460, + 1452,1,0,0,0,1460,1461,1,0,0,0,1461,1462,1,0,0,0,1462,1463,5,146, + 0,0,1463,167,1,0,0,0,1464,1465,7,9,0,0,1465,169,1,0,0,0,1466,1467, + 5,156,0,0,1467,171,1,0,0,0,130,184,191,212,225,237,264,272,279,285, + 297,300,306,317,326,336,339,341,345,353,365,370,380,390,395,410, + 416,428,437,445,453,466,469,479,483,489,496,502,510,518,531,538, + 542,547,558,564,575,601,605,611,622,631,637,642,644,675,679,685, + 712,722,733,736,741,744,747,754,763,766,769,772,795,797,806,820, + 841,844,847,854,862,894,906,909,913,935,949,957,969,983,1000,1018, + 1022,1025,1029,1032,1038,1042,1047,1051,1055,1061,1075,1090,1110, + 1119,1151,1171,1201,1211,1214,1217,1219,1233,1257,1273,1282,1292, + 1305,1320,1332,1336,1345,1363,1387,1398,1404,1406,1432,1440,1443, + 1457,1460 ]; private static __ATN: antlr.ATN; @@ -6516,6 +6568,38 @@ export class ExternalInterfaceDeclContext extends antlr.ParserRuleContext { } +export class SymbolDeclContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public SYMBOL(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.SYMBOL, 0)!; + } + public identifier(): IdentifierContext { + return this.getRuleContext(0, IdentifierContext)!; + } + public ID(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.ID, 0)!; + } + public stringLiteral(): StringLiteralContext { + return this.getRuleContext(0, StringLiteralContext)!; + } + public SEMI(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.SEMI, 0)!; + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_symbolDecl; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitSymbolDecl) { + return visitor.visitSymbolDecl(this); + } else { + return visitor.visitChildren(this); + } + } +} + + export class ResourcePreambleContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); @@ -6529,6 +6613,9 @@ export class ResourcePreambleContext extends antlr.ParserRuleContext { public externalInterfaceDecl(): ExternalInterfaceDeclContext | null { return this.getRuleContext(0, ExternalInterfaceDeclContext); } + public symbolDecl(): SymbolDeclContext | null { + return this.getRuleContext(0, SymbolDeclContext); + } public typeAliasDecl(): TypeAliasDeclContext | null { return this.getRuleContext(0, TypeAliasDeclContext); } @@ -8005,6 +8092,12 @@ export class ExecutionClauseContext extends antlr.ParserRuleContext { public REMOTE(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.REMOTE, 0); } + public SNAPSHOT(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.SNAPSHOT, 0); + } + public TRANSACTION(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.TRANSACTION, 0); + } public TARGETS(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.TARGETS, 0); } @@ -8017,12 +8110,6 @@ export class ExecutionClauseContext extends antlr.ParserRuleContext { public RBRACK(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.RBRACK, 0); } - public SNAPSHOT(): antlr.TerminalNode | null { - return this.getToken(QuixosCapabilityParser.SNAPSHOT, 0); - } - public TRANSACTION(): antlr.TerminalNode | null { - return this.getToken(QuixosCapabilityParser.TRANSACTION, 0); - } public override get ruleIndex(): number { return QuixosCapabilityParser.RULE_executionClause; } diff --git a/src/capability-language/generated/QuixosCapabilityVisitor.ts b/src/capability-language/generated/QuixosCapabilityVisitor.ts index d55d575..6d51e99 100644 --- a/src/capability-language/generated/QuixosCapabilityVisitor.ts +++ b/src/capability-language/generated/QuixosCapabilityVisitor.ts @@ -10,6 +10,7 @@ import { WorkspaceItemContext } from "./QuixosCapabilityParser.js"; import { ResourceImportDeclContext } from "./QuixosCapabilityParser.js"; import { ExternalAtomDeclContext } from "./QuixosCapabilityParser.js"; import { ExternalInterfaceDeclContext } from "./QuixosCapabilityParser.js"; +import { SymbolDeclContext } from "./QuixosCapabilityParser.js"; import { ResourcePreambleContext } from "./QuixosCapabilityParser.js"; import { AtomDeclContext } from "./QuixosCapabilityParser.js"; import { InterfaceResourceDeclContext } from "./QuixosCapabilityParser.js"; @@ -145,6 +146,12 @@ export class QuixosCapabilityVisitor extends AbstractParseTreeVisitor Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.symbolDecl`. + * @param ctx the parse tree + * @return the visitor result + */ + visitSymbolDecl?: (ctx: SymbolDeclContext) => Result; /** * Visit a parse tree produced by `QuixosCapabilityParser.resourcePreamble`. * @param ctx the parse tree diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index 1d04fcf..13d7caa 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -205,6 +205,7 @@ interface LoweringState { fileName: string; diagnostics: CapabilitySourceDiagnostic[]; atoms: Map; + symbols: Map; interfaces: Map; packages: Map; attachments: Map; @@ -387,14 +388,33 @@ const lowerSelectedOperations = ( return { operations }; }; -const lowerExecution = (context: ExecutionClauseContext | null): { execution?: ExecutionContract } => { +const lowerExecution = ( + state: LoweringState, + context: ExecutionClauseContext | null, + implementation = false, +): { execution?: ExecutionContract } => { if (!context) return {}; + if (!implementation && context.identifierList()) + loweringIssue( + state, + context, + "interface-execution-targets", + "Interfaces declare effects; execution targets belong to package implementations", + ); + const targets = context + .identifierList() + ?.identifier() + .map((node) => { + const name = identifier(node); + if (name === "server") return name; + return requireSymbol(state, state.symbols, name, node, "nominal execution target") ?? `unresolved:${name}`; + }) ?? ["server"]; return { execution: context.REMOTE() ? { kind: "remote" } : { kind: context.SNAPSHOT() ? "snapshot" : "transaction", - targets: context.identifierList()!.identifier().map(identifier), + targets: implementation ? targets : ["server"], }, }; }; @@ -508,17 +528,17 @@ const lowerValueMember = (state: LoweringState, context: ValueMemberContext): In if (operation.GET()) { operations.push({ ...valueOperation("get", capabilityId.operation(stringValue(operation.stringLiteral(0))), memberValueType), - ...lowerExecution(operation.executionClause()), + ...lowerExecution(state, operation.executionClause()), }); } else if (operation.EDIT()) { operations.push({ ...valueOperation("edit", capabilityId.operation(stringValue(operation.stringLiteral(0))), memberValueType), - ...lowerExecution(operation.executionClause()), + ...lowerExecution(state, operation.executionClause()), }); } else if (operation.SET()) { operations.push({ ...valueOperation("set", capabilityId.operation(stringValue(operation.stringLiteral(0))), memberValueType), - ...lowerExecution(operation.executionClause()), + ...lowerExecution(state, operation.executionClause()), }); } else { operations.push( @@ -611,7 +631,7 @@ const lowerRelationshipMember = ( ); } if (operation.executionClause()) - Object.assign(operations[operations.length - 1]!, lowerExecution(operation.executionClause())); + Object.assign(operations[operations.length - 1]!, lowerExecution(state, operation.executionClause())); } return { kind: "relationship", @@ -653,7 +673,7 @@ const lowerOperationMember = (state: LoweringState, context: OperationMemberCont outputType, mode: "call", ...(context.STATIC() ? { scope: "class" as const } : {}), - ...lowerExecution(context.executionClause()), + ...lowerExecution(state, context.executionClause()), }, ], }; @@ -814,18 +834,24 @@ const lowerInterfaceTemplate = ( const id = capabilityId.operation(stringValue(operation.stringLiteral(0))); if (operation.GET()) return [ - { ...signature("get", id, valueType.unit, type), ...lowerExecution(operation.executionClause()) }, + { + ...signature("get", id, valueType.unit, type), + ...lowerExecution(state, operation.executionClause()), + }, ]; if (operation.EDIT()) return [ { ...signature("edit", id, { kind: "change", value: type }, valueType.unit), - ...lowerExecution(operation.executionClause()), + ...lowerExecution(state, operation.executionClause()), }, ]; if (operation.SET()) return [ - { ...signature("set", id, type, valueType.unit), ...lowerExecution(operation.executionClause()) }, + { + ...signature("set", id, type, valueType.unit), + ...lowerExecution(state, operation.executionClause()), + }, ]; return [ signature("watch-start", id, valueType.unit, valueType.watchHandle, "watch-start", type), @@ -859,7 +885,7 @@ const lowerInterfaceTemplate = ( outputType, ), ...(operation.STATIC() ? { scope: "class" as const } : {}), - ...lowerExecution(operation.executionClause()), + ...lowerExecution(state, operation.executionClause()), }, ], }; @@ -907,7 +933,10 @@ const lowerInterfaceTemplate = ( const id = capabilityId.operation(stringValue(operation.stringLiteral(0))); if (operation.RESOLVE()) return [ - { ...signature("resolve", id, valueType.unit, resolved), ...lowerExecution(operation.executionClause()) }, + { + ...signature("resolve", id, valueType.unit, resolved), + ...lowerExecution(state, operation.executionClause()), + }, ]; if (operation.CONNECT() || operation.DISCONNECT()) return [ @@ -918,7 +947,7 @@ const lowerInterfaceTemplate = ( operation.CONNECT() ? keyedTarget : targetType, valueType.unit, ), - ...lowerExecution(operation.executionClause()), + ...lowerExecution(state, operation.executionClause()), }, ]; return [ @@ -1196,7 +1225,7 @@ const lowerPackageOperation = ( inputType: lowerValueType(state, context.valueType(0)), outputType: lowerValueType(state, context.valueType(1)), mode: text(context.operationMode()) as InterfaceOperationMode, - ...lowerExecution(context.executionClause()), + ...lowerExecution(state, context.executionClause(), true), eventType: event ? lowerValueType(state, event.valueType()) : undefined, receiverRequirement: lowerReceiver(state, context.receiverRequirement()), dependencyPorts: ports, @@ -1213,7 +1242,7 @@ const lowerPackageFunction = ( const alias = identifier(context.identifier()); const entry: PackageExport = { kind: "function", - ...lowerExecution(context.executionClause()), + ...lowerExecution(state, context.executionClause(), true), id: capabilityId.packageExport(stringValue(context.stringLiteral())), displayName: alias, inputType: lowerValueType(state, context.valueType(0)), @@ -1355,7 +1384,7 @@ const lowerGenericPackageExport = ( displayName: identifier(context.identifier()), parameters, kind: operation ? "operation" : "function", - ...lowerExecution(context.executionClause()), + ...lowerExecution(state, context.executionClause(), true), inputType: state.types.expression(context.valueType(0)!), outputType: state.types.expression(context.valueType(1)!), dependencyPorts, @@ -3092,6 +3121,7 @@ const newLoweringState = (fileName: string, diagnostics: CapabilitySourceDiagnos atoms, types: new GenericSourceTypes(atoms), interfaces: new Map(), + symbols: new Map(), packages: new Map(), attachments: new Map(), }; @@ -3240,6 +3270,20 @@ const compileCapabilityResourceSourceInternal = ( const externalAtoms = externalAtomsFrom(state, preamble.atoms); const imports = registerImports(state, preamble.imports, environment); const externalInterfaces = externalInterfacesFrom(state, preamble.interfaces); + for (const declaration of (interfaceContext ?? packageContext)! + .resourcePreamble() + .flatMap((entry) => entry.symbolDecl() ?? [])) { + const name = identifier(declaration.identifier()); + const identity = stringValue(declaration.stringLiteral()); + if (name === "server" || identity === "server" || !identity.trim()) + loweringIssue( + state, + declaration, + "invalid-symbol", + "Nominal symbols require a nonempty identity distinct from the server executor", + ); + declareSymbol(state, state.symbols, name, identity, declaration, "symbol"); + } state.types.declareAliases(preamble.aliases); let resource: CapabilityResource; diff --git a/src/capability-model/execution.ts b/src/capability-model/execution.ts index 957ad63..55db3da 100644 --- a/src/capability-model/execution.ts +++ b/src/capability-model/execution.ts @@ -25,7 +25,6 @@ export function validateExecutionContracts(workspace: WorkspaceRevision): Capabi requested: ExecutionContract | undefined, provided: ExecutionContract | undefined, path: string, - requireTargets = true, ) => { if (!requested || requested.kind === "remote") return; if (!provided || provided.kind === "remote") { @@ -34,9 +33,6 @@ export function validateExecutionContracts(workspace: WorkspaceRevision): Capabi } if (requested.kind === "snapshot" && provided.kind !== "snapshot") fail(path, "Snapshot execution cannot perform a transaction"); - if (requireTargets) - for (const target of requested.targets ?? []) - if (!provided.targets?.includes(target)) fail(path, `Dependency does not provide execution target ${target}`); }; for (const revision of workspace.interfaceImports) for (const member of revision.template?.members ?? revision.members) { @@ -84,10 +80,7 @@ export function validateExecutionContracts(workspace: WorkspaceRevision): Capabi if (entry.execution && entry.execution.kind !== "remote") { if (!selected) fail(portPath, "Portable interface ports must select their required operations"); for (const id of selected ?? []) - // Package targets describe available code. Required public target - // guarantees are checked over the installed operation closure; - // an optional implementation target must not strengthen a dependency. - if (contract) supports(entry.execution, operations(id, contract)?.execution, portPath, false); + if (contract) supports(entry.execution, operations(id, contract)?.execution, portPath); } } if (!entry.execution || entry.execution.kind === "remote") continue; diff --git a/src/execution-world/client-contracts.ts b/src/execution-world/client-contracts.ts index e13fe97..b9740c8 100644 --- a/src/execution-world/client-contracts.ts +++ b/src/execution-world/client-contracts.ts @@ -32,10 +32,7 @@ export function publicOperationContract( const execution = operation.execution ?? { kind: "remote" }; const member = iface.members.find((m) => m.operations.includes(operation))!; const fieldPolicy = - member.kind === "value" && - operation.scope !== "class" && - execution.kind === "transaction" && - execution.targets.includes("browser") + member.kind === "value" && operation.scope !== "class" && execution.kind === "transaction" ? operation.displayName === "edit" ? "crdt" : member.nativeField && operation.displayName === "set" diff --git a/src/execution-world/files.ts b/src/execution-world/files.ts index 601b8f1..f5b627a 100644 --- a/src/execution-world/files.ts +++ b/src/execution-world/files.ts @@ -117,7 +117,11 @@ export class BrowserArtifactGateway { const entries: BrowserArtifact[] = []; for (const manifest of loaded.manifests) for (const implementation of manifest.implementations) { - if (implementation.target !== "browser" || implementation.compatibility !== "quixos-js-module-v1") continue; + if ( + implementation.target !== "target:org.quixos.execution.javascript@1" || + implementation.compatibility !== "quixos-js-module-v1" + ) + continue; const prefix = `/__quixos/artifacts/${loaded.digest}/${implementation.contentDigest}/`; for (const file of implementation.files) { if (!/^[a-zA-Z0-9.+-]+\/[a-zA-Z0-9.+-]+$/.test(file.mediaType)) fail(file.path, "Invalid asset MIME type"); diff --git a/src/execution-world/index.ts b/src/execution-world/index.ts index dd25a52..b3aa839 100644 --- a/src/execution-world/index.ts +++ b/src/execution-world/index.ts @@ -1,4 +1,5 @@ export * from "./plan.js"; +export * from "./native-backends.js"; export * from "./artifacts.js"; export * from "./ports.js"; export * from "./files.js"; diff --git a/src/execution-world/inspection.ts b/src/execution-world/inspection.ts index 88a28b2..1155b51 100644 --- a/src/execution-world/inspection.ts +++ b/src/execution-world/inspection.ts @@ -81,7 +81,9 @@ export function compileInspectionTemplates(plan: ExecutionPlan) { ), ); if (providers.some((op) => !op || op.unsupported || !["snapshot", "remote"].includes(op.effect))) continue; - const portable = providers.every((op) => op!.effect === "snapshot" && op!.targets.includes("browser")); + const portable = providers.every( + (op) => op!.effect === "snapshot" && op!.targets.includes("target:org.quixos.execution.javascript@1"), + ); if (lane === "local" && !portable) continue; const key = "m" + index, flag = "s" + index; diff --git a/src/execution-world/installation.ts b/src/execution-world/installation.ts index 4787af7..61be4dc 100644 --- a/src/execution-world/installation.ts +++ b/src/execution-world/installation.ts @@ -250,7 +250,9 @@ function assembleExecutionInstallation( }) : undefined; const browserExports = exports.filter( - (entry) => entry.execution.kind !== "remote" && entry.execution.targets.includes("browser"), + (entry) => + entry.execution.kind !== "remote" && + entry.execution.targets.includes("target:org.quixos.execution.javascript@1"), ); if (!browserExports.length) { if (selection.browser) fail(revision, "Package has no browser exports to select"); @@ -259,7 +261,7 @@ function assembleExecutionInstallation( } const browser = selectArtifactImplementation(manifest, { ...selection.browser, - target: "browser", + target: "target:org.quixos.execution.javascript@1", compatibility: "quixos-js-module-v1", exports: browserExports.map((entry) => entry.id), }); diff --git a/src/execution-world/native-backends.ts b/src/execution-world/native-backends.ts new file mode 100644 index 0000000..eb42914 --- /dev/null +++ b/src/execution-world/native-backends.ts @@ -0,0 +1,21 @@ +import type { Binding } from "../capability-model/types.js"; + +/** Nominal library identity. Backends implement primitives; target names carry no + * built-in semantics in the graph planner. The JS backend is installed by the + * current toolchain, alongside the authoritative server executor. */ +export const javascriptTarget = "target:org.quixos.execution.javascript@1"; +export interface NativeExecutionBackend { + readonly target: string; + readonly supports: (binding: Exclude) => boolean; +} +export const standardNativeBackends: readonly NativeExecutionBackend[] = [ + { target: "server", supports: () => true }, + { + target: javascriptTarget, + supports: (binding) => + binding.kind === "state" || + binding.kind === "edge" || + binding.kind === "journal" || + (binding.kind === "subscription" && binding.primitive === "status"), + }, +]; diff --git a/src/execution-world/plan.ts b/src/execution-world/plan.ts index c74c0b2..3a47547 100644 --- a/src/execution-world/plan.ts +++ b/src/execution-world/plan.ts @@ -1,3 +1,4 @@ +import { standardNativeBackends, type NativeExecutionBackend } from "./native-backends.js"; import type { WorkspaceRevision, ExecutionContract, @@ -45,7 +46,7 @@ export interface PlannedOperation { operationId: string; scope: "object" | "class"; execution: ExecutionContract; - /** Installed implementation closure; the public execution contract above remains required. */ + /** Targets available for this complete installed implementation/dependency closure. */ availableTargets: string[]; input: ValueType; output: ValueType; @@ -171,7 +172,10 @@ function checkValue(type: ValueType, path: string, allowChange = false): void { } /** Compile declarations into a closed dispatch/dependency graph before artifact selection. */ -export function compileExecutionPlan(input: WorkspaceRevision): ExecutionPlan { +export function compileExecutionPlan( + input: WorkspaceRevision, + backends: readonly NativeExecutionBackend[] = standardNativeBackends, +): ExecutionPlan { const workspace = structuredClone(input); const issues = validateWorkspaceRevision(workspace); if (issues.length) @@ -311,13 +315,6 @@ export function compileExecutionPlan(input: WorkspaceRevision): ExecutionPlan { path.join(" -> "), "Execution effect is not allowed by the root contract", ); - for (const target of requested.targets) - if (!node.execution.targets.includes(target)) - throw new ExecutionPlanError( - "MISSING_EXECUTION_TARGET", - path.join(" -> "), - `Dependency does not provide ${target}`, - ); for (const dependency of node.dependencies) { if (dependency.kind === "operation") walk(dependency.operation, [...path, dependency.port, dependency.operation]); @@ -352,9 +349,10 @@ export function compileExecutionPlan(input: WorkspaceRevision): ExecutionPlan { const provider = binding.kind === "package" ? packages.get(binding.packageRevisionId)!.exports.find((entry) => entry.id === binding.exportId)!.execution - : binding.kind === "lifecycle" || (binding.kind === "subscription" && binding.primitive !== "status") - ? { kind: "transaction" as const, targets: ["server" as const] } - : { kind: node.execution.kind, targets: ["browser" as const, "server" as const] }; + : { + kind: node.execution.kind, + targets: backends.filter((backend) => backend.supports(binding)).map((backend) => backend.target), + }; if (provider && provider.kind !== "remote") node.availableTargets = [...provider.targets].sort(); } let targetsChanged = true; @@ -382,6 +380,13 @@ export function compileExecutionPlan(input: WorkspaceRevision): ExecutionPlan { } } } + for (const node of operationMap.values()) + if (node.execution.kind !== "remote" && !node.availableTargets.includes("server")) + throw new ExecutionPlanError( + "MISSING_SERVER_IMPLEMENTATION", + node.key, + "Every graph operation requires an authoritative implementation across its dependency closure", + ); const plannedQueries: PlannedQuery[] = queries.map((query) => ({ id: queryKey(query.packageRevisionId, query.checked.declaration.id), query, @@ -515,11 +520,11 @@ export function compileExecutionPlan(input: WorkspaceRevision): ExecutionPlan { source.admittedOperations.push(...query.operations); for (const operation of query.operations) { const node = operationMap.get(operation)!; - if (node.execution.kind !== "snapshot" || !node.execution.targets.includes("browser")) + if (node.execution.kind !== "snapshot" || !node.availableTargets.some((target) => target !== "server")) throw new ExecutionPlanError( "NONPORTABLE_QUERY_FIELD", `${query.id}/${operation}`, - "Local query getter must provide browser snapshot execution", + "Local query getter needs an installed local snapshot implementation", ); } } diff --git a/src/execution-world/receipts.ts b/src/execution-world/receipts.ts index 689c6af..a69def6 100644 --- a/src/execution-world/receipts.ts +++ b/src/execution-world/receipts.ts @@ -15,6 +15,8 @@ export interface ArtifactReceipt { generated: { target: string; path: string; digest: string; bytes: number }[]; } const hashBytes = (bytes: Uint8Array) => createHash("sha256").update(bytes).digest("hex"); +/** Nominal identities never become filesystem paths. */ +export const generatedBindingPath = (target: string) => `share/quixos/generated/target-${hexDigest(target)}.ts`; /** Deterministic expected receipt. A trusted build must also typecheck and bundle these exact sources. * This is consistency evidence inside a trusted Nix build path, not remote build attestation. */ export function expectedArtifactReceipt( @@ -56,8 +58,7 @@ export function expectedArtifactReceipt( .sort(); const sources = new Map(); const generated = targets.map((target) => { - if (!/^[a-zA-Z0-9_-]+$/.test(target)) throw new Error("Unsupported generated target filename"); - const path = `share/quixos/generated/${target}.ts`; + const path = generatedBindingPath(target); const bytes = new TextEncoder().encode( generatePortableTypeScriptBindings(plan.definition.bindingSchema, pkg.revision, { target }), ); diff --git a/src/query/compile.ts b/src/query/compile.ts index 1a38c24..68a9728 100644 --- a/src/query/compile.ts +++ b/src/query/compile.ts @@ -250,10 +250,10 @@ export async function compileQuery( const getter = member.operations.find( (operation) => operation.displayName === (member.kind === "value" ? "get" : "resolve"), ); - if (getter?.execution?.kind !== "snapshot" || !getter.execution.targets.includes("browser")) + if (getter?.execution?.kind !== "snapshot") fail( "QUERY_LOCAL_DEPENDENCY", - `Local query requires a browser snapshot getter for ${contract.displayName}.${name}; split the remote field or move the query to the server`, + `Local query requires a graph snapshot getter for ${contract.displayName}.${name}; split the remote field or move the query to the server`, node, ); if (member.queryRead.execution === "rpc-permitted") diff --git a/test/acceptance-fixture.ts b/test/acceptance-fixture.ts index 8d904fb..e9dc4f8 100644 --- a/test/acceptance-fixture.ts +++ b/test/acceptance-fixture.ts @@ -2,12 +2,13 @@ import assert from "node:assert/strict"; import { compileCapabilityResourceSource, compileCapabilitySource } from "../src/capability-language/parser.js"; const contract = `interface Limit id "limit" revision "limit@1" { operation change id "change" : int32 -> unit { - call id "change:call" execution transaction targets [browser, server]; + call id "change:call" execution transaction; } }`; -export const runtime = `external atom Item id "item"; +export const runtime = `symbol JavaScript id "target:org.quixos.execution.javascript@1"; +external atom Item id "item"; package Runtime id "runtime" revision "runtime@1" { - operation change id "runtime:change" : int32 -> unit mode call execution transaction targets [browser, server] + operation change id "runtime:change" : int32 -> unit mode call execution transaction targets [JavaScript, server] receiver atom Item requires { state level id "write:value" : int32 [write]; } accept using check; operation check id "runtime:check" : int32 -> unit mode call execution snapshot targets [server] receiver atom Item requires { diff --git a/test/acceptance-hooks.test.ts b/test/acceptance-hooks.test.ts index 9ceac90..444e32b 100644 --- a/test/acceptance-hooks.test.ts +++ b/test/acceptance-hooks.test.ts @@ -28,9 +28,9 @@ test("acceptance syntax retains separate final-state ports through formatting, p ]); assert.equal(kernel.packages[0]!.exports.find((e) => e.id === "runtime:change")!.acceptance, "runtime:check"); assert.ok( - !generatePortableTypeScriptBindings(plan.definition.bindingSchema, "runtime@1", { target: "browser" }).includes( - '"runtime:check"', - ), + !generatePortableTypeScriptBindings(plan.definition.bindingSchema, "runtime@1", { + target: "target:org.quixos.execution.javascript@1", + }).includes('"runtime:check"'), ); assert.ok( generatePortableTypeScriptBindings(plan.definition.bindingSchema, "runtime@1", { target: "server" }).includes( @@ -43,7 +43,7 @@ test("acceptance syntax retains separate final-state ports through formatting, p test("acceptance declarations reject wrong effects/signatures and missing or mutable ports", () => { for (const [pkg, ws] of [ [runtime.replace("snapshot targets [server]", "transaction targets [server]"), workspace], - [runtime.replace("snapshot targets [server]", "snapshot targets [browser, server]"), workspace], + [runtime.replace("snapshot targets [server]", "snapshot targets [JavaScript, server]"), workspace], [ runtime.replace('check id "runtime:check" : int32 -> unit', 'check id "runtime:check" : string -> unit'), workspace, diff --git a/test/artifact-files.test.ts b/test/artifact-files.test.ts index a8cf42c..f6cf5b9 100644 --- a/test/artifact-files.test.ts +++ b/test/artifact-files.test.ts @@ -46,7 +46,9 @@ test("gateway serves only declared browser assets with correct Wasm MIME and con const plan = compileExecutionPlan(await loadReaderWorkspace()), fixture = buildArtifactFixture(plan); const wasm = new Uint8Array([0, 97, 115, 109, 1, 0, 0, 0]); - const browser = fixture.manifest.implementations.find((i) => i.target === "browser")!; + const browser = fixture.manifest.implementations.find( + (i) => i.target === "target:org.quixos.execution.javascript@1", + )!; browser.files.push({ path: "portable/browser/assets/café.wasm", bytes: wasm.length, diff --git a/test/artifact-fixture.ts b/test/artifact-fixture.ts index 7e7b6e5..1c28f16 100644 --- a/test/artifact-fixture.ts +++ b/test/artifact-fixture.ts @@ -13,7 +13,7 @@ export const buildArtifactFixture = (plan: ExecutionPlan, revision = plan.defini target: string, compatibility: ArtifactImplementation["compatibility"], ): ArtifactImplementation => { - const path = compatibility === "quixos-service-v1" ? "bin/service" : `portable/${target}/module.mjs`; + const path = compatibility === "quixos-service-v1" ? "bin/service" : `portable/${id}/module.mjs`; const value = { id, target, @@ -44,7 +44,7 @@ export const buildArtifactFixture = (plan: ExecutionPlan, revision = plan.defini implementations: [ implementation("service", "server", "quixos-service-v1"), implementation("server", "server", "quixos-js-module-v1"), - implementation("browser", "browser", "quixos-js-module-v1"), + implementation("browser", "target:org.quixos.execution.javascript@1", "quixos-js-module-v1"), ], }; return { manifest, bytes, read: async () => bytes }; diff --git a/test/capability-assembly.test.ts b/test/capability-assembly.test.ts index 94dad83..c147e19 100644 --- a/test/capability-assembly.test.ts +++ b/test/capability-assembly.test.ts @@ -229,7 +229,7 @@ test("resource-owned fragment imports compile through the locked package closure await writeFile(path.join(dirs.item!, "quixos.lock"), lock()); await writeFile( path.join(dirs.item!, "interface.qx"), - `interface Item id "item" revision "item@1" {queryable value title id "title" : string {get id "title:get" execution snapshot targets [browser,server];}}`, + `interface Item id "item" revision "item@1" {queryable value title id "title" : string {get id "title:get" execution snapshot;}}`, ); await writeFile(path.join(dirs.rows!, "quixos.lock"), lock(dependency("interface", "Item"))); await writeFile( diff --git a/test/client-contracts.test.ts b/test/client-contracts.test.ts index 6925f40..26394ac 100644 --- a/test/client-contracts.test.ts +++ b/test/client-contracts.test.ts @@ -14,7 +14,7 @@ import { parseControllerCatalog, validateControllers } from "../src/capability-m const source = { repository: "https://example.test/contracts.git", commit: "a".repeat(40) }; const parsed = compileCapabilityResourceSource( `interface Data id "data" revision "data@1" { - queryable portable value label id "label" : string { get id "label:get" execution snapshot targets [browser, server]; } + queryable portable value label id "label" : string { get id "label:get" execution snapshot; } operation publish id "publish" : string -> unit { call id "publish:call"; } }`, { source }, @@ -26,20 +26,20 @@ test("native fields certify one storage slot; only browser writes get live descr const parsed = compileCapabilityResourceSource( `interface Fields id "fields" revision "fields@1" { queryable field position id "position" : string { - get id "position:get" execution snapshot targets [browser, server]; - set id "position:set" execution transaction targets [browser, server]; + get id "position:get" execution snapshot; + set id "position:set" execution transaction; } field remote id "remote" : string { get id "remote:get"; set id "remote:set"; } value arbitrary id "arbitrary" : string { - get id "arbitrary:get" execution snapshot targets [browser,server]; - set id "arbitrary:set" execution transaction targets [browser, server]; + get id "arbitrary:get" execution snapshot; + set id "arbitrary:set" execution transaction; } value text id "text" : string { get id "text:get"; - edit id "text:edit" execution transaction targets [browser, server]; + edit id "text:edit" execution transaction; } }`, { source }, @@ -92,8 +92,9 @@ test("native fields certify one storage slot; only browser writes get live descr const goodForward = compileCapabilitySource(forwarded, "workspace.qx", env); assert.ok(goodForward.ok, JSON.stringify(goodForward.diagnostics)); const pkg = compileCapabilityResourceSource( - `package Setter id "setter" revision "setter@1" { - operation replaceValue id "write" : string -> unit mode call execution transaction targets [browser,server] receiver any; + `symbol JavaScript id "target:org.quixos.execution.javascript@1"; +package Setter id "setter" revision "setter@1" { + operation replaceValue id "write" : string -> unit mode call execution transaction targets [JavaScript,server] receiver any; }`, { source }, ); diff --git a/test/component-scaffold.test.ts b/test/component-scaffold.test.ts index a4d9578..9cf9615 100644 --- a/test/component-scaffold.test.ts +++ b/test/component-scaffold.test.ts @@ -52,7 +52,7 @@ test("checked component scaffolding composes with execution handlers without rep await apply("function", { name: "echo", id: "echo", - declaration: 'function echo id "echo" : string -> string execution snapshot targets [browser,server];', + declaration: 'function echo id "echo" : string -> string execution snapshot targets [JavaScript,server];', }); await apply("component", { name: "Details", diff --git a/test/compound-crdt.test.ts b/test/compound-crdt.test.ts index 4f773b6..d6bf3f4 100644 --- a/test/compound-crdt.test.ts +++ b/test/compound-crdt.test.ts @@ -24,7 +24,7 @@ test("compound captured changes survive planning, transport lowering and typed e ]); assert.deepEqual(paths.find((op) => op.operation === "compound:content:edit")!.inputChanges, [[]]); const code = generatePortableTypeScriptBindings(plan.definition.bindingSchema, "compound:runtime@1", { - target: "browser", + target: "target:org.quixos.execution.javascript@1", }); assert.ok(code.includes("PreparedChange<")); assert.ok(code.includes('"edit"')); @@ -33,8 +33,9 @@ test("compound captured changes survive planning, transport lowering and typed e test("prepared changes require one storable materialized type", () => { for (const shape of ["change", "change", "change>", "change>"]) { const result = compileCapabilityResourceSource( - `external atom N id "n"; package P id "p" revision "p@1" { - function f id "f" : ${shape} -> unit execution transaction targets [browser, server]; + `symbol JavaScript id "target:org.quixos.execution.javascript@1"; +external atom N id "n"; package P id "p" revision "p@1" { + function f id "f" : ${shape} -> unit execution transaction targets [JavaScript, server]; }`, { source }, ); diff --git a/test/conformance-rules.test.ts b/test/conformance-rules.test.ts index dd87d88..46a6d9d 100644 --- a/test/conformance-rules.test.ts +++ b/test/conformance-rules.test.ts @@ -192,9 +192,9 @@ test("rule private edges substitute Self and captured endpoints with stable proj test("rule creation ports close captured atom parameters and retain initialization checking", () => { const compile = fixture([ - 'interface Factory id "factory" revision "factory@1" {operation create id "create" : unit -> ref {call id "call" execution transaction targets [browser,server];}}', + 'interface Factory id "factory" revision "factory@1" {operation create id "create" : unit -> ref {call id "call" execution transaction;}}', 'interface Creates id "creates" revision "creates@1" {}', - 'package Runtime id "runtime" revision "runtime@1" {operation create id "create" : unit -> ref mode call execution transaction targets [browser,server] receiver any requires {creation result id "result" : T input unit;};}', + 'symbol JavaScript id "target:org.quixos.execution.javascript@1";\npackage Runtime id "runtime" revision "runtime@1" {operation create id "create" : unit -> ref mode call execution transaction targets [JavaScript,server] receiver any requires {creation result id "result" : T input unit;};}', ]); const rule = `conform Creates as Factory id "factory-rule" { bind create.call to package Runtime.create with {result to creation T with {};}; @@ -324,7 +324,7 @@ test("rule inverse reads retain the concrete conformance ownership checks", () = const compile = fixture([ 'interface Parent id "parent" revision "parent@1" {}', 'interface Child id "child" revision "child@1" {}', - 'import interface Parent; interface Owned id "owned" revision "owned@1" {queryable relation parent id "parent-ref" : optional-one interface Parent {resolve id "parent-read" execution snapshot targets [browser,server];}}', + 'import interface Parent; interface Owned id "owned" revision "owned@1" {queryable relation parent id "parent-ref" : optional-one interface Parent {resolve id "parent-read" execution snapshot;}}', ]); const source = ` atom P id "p"; atom C id "c"; diff --git a/test/crdt-edit-contracts.test.ts b/test/crdt-edit-contracts.test.ts index 14ef54a..5daf7d6 100644 --- a/test/crdt-edit-contracts.test.ts +++ b/test/crdt-edit-contracts.test.ts @@ -6,8 +6,8 @@ const content = "record { text:string; tags:list; }"; const iface = compileCapabilityResourceSource( `interface Comment id "comment" revision "comment@1" { value content id "content" : ${content} { - get id "content:get" execution snapshot targets [browser, server]; - edit id "content:edit" execution transaction targets [browser, server]; + get id "content:get" execution snapshot; + edit id "content:edit" execution transaction; } }`, { source }, @@ -68,7 +68,7 @@ test("authored prepared changes retain their materialized type as transport valu test("generic edit retains its materialized type through specialization", () => { const generic = compileCapabilityResourceSource( `interface Cell id "cell" revision "cell@1" { - value content id "content" : T { get id "get"; edit id "edit" execution transaction targets [browser, server]; } + value content id "content" : T { get id "get"; edit id "edit" execution transaction; } }`, { source }, ); diff --git a/test/creation-contracts.test.ts b/test/creation-contracts.test.ts index 5373722..e6d1219 100644 --- a/test/creation-contracts.test.ts +++ b/test/creation-contracts.test.ts @@ -14,23 +14,24 @@ const iface = (text: string): InterfaceRevision => { return result.resource.revision; }; const data = iface(`interface Data id "data" revision "data@1" { - value title id "title" : string { get id "title:get" execution snapshot targets [browser, server]; } + value title id "title" : string { get id "title:get" execution snapshot; } }`); const tagged = iface(`interface Tagged id "tagged" revision "tagged@1" { - value tags id "tags" : list { get id "tags:get" execution snapshot targets [browser, server]; } + value tags id "tags" : list { get id "tags:get" execution snapshot; } }`); const factory = iface(`external atom Note id "note"; interface Factory id "factory" revision "factory@1" { - static operation create id "create" : ${seed} -> atom-ref { call id "create:call" execution transaction targets [browser, server]; } - static operation importNote id "import" : ${seed} -> atom-ref { call id "import:call" execution transaction targets [browser, server]; } + static operation create id "create" : ${seed} -> atom-ref { call id "create:call" execution transaction; } + static operation importNote id "import" : ${seed} -> atom-ref { call id "import:call" execution transaction; } }`); const runtime = compileCapabilityResourceSource( - `external atom Note id "note"; + `symbol JavaScript id "target:org.quixos.execution.javascript@1"; +external atom Note id "note"; package Runtime id "runtime" revision "runtime@1" { - function createNote id "create-note" : ${seed} -> atom-ref execution transaction targets [browser, server] requires { + function createNote id "create-note" : ${seed} -> atom-ref execution transaction targets [JavaScript, server] requires { creation note id "new-note" : Note input ${seed}; }; - function importNote id "import-note" : ${seed} -> atom-ref execution transaction targets [browser, server] requires { + function importNote id "import-note" : ${seed} -> atom-ref execution transaction targets [JavaScript, server] requires { creation note id "new-note" : Note input ${seed}; }; }`, @@ -137,9 +138,10 @@ test("defaults supply unmapped state and seeds cannot invoke an undeclared owner test("creation ports cannot be used in snapshot execution", () => { const result = compileCapabilityResourceSource( - `external atom Note id "note"; + `symbol JavaScript id "target:org.quixos.execution.javascript@1"; +external atom Note id "note"; package P id "p" revision "p@1" { - function createNote id "create" : unit -> atom-ref execution snapshot targets [browser, server] requires { + function createNote id "create" : unit -> atom-ref execution snapshot targets [JavaScript, server] requires { creation note id "note" : Note input record { title:string; }; }; }`, diff --git a/test/emit-managed.ts b/test/emit-managed.ts index cbb255f..731551f 100644 --- a/test/emit-managed.ts +++ b/test/emit-managed.ts @@ -15,7 +15,7 @@ const factory = compileCapabilityResourceSource( `external atom Entry id "atom:entry"; interface EntryFactory id "interface:entry-factory" revision "interface:entry-factory@1" { static operation create id "entry:create" : unit -> atom-ref { - call id "entry:create:call" execution transaction targets [server]; + call id "entry:create:call" execution transaction; } }`, { source }, @@ -23,12 +23,12 @@ interface EntryFactory id "interface:entry-factory" revision "interface:entry-fa assert.ok(factory.ok && factory.resource.kind === "interface", JSON.stringify(factory.diagnostics)); const data = compileCapabilityResourceSource( `interface Data id "interface:data" revision "interface:data@1" { - queryable value body id "body" : string { get id "body:get" execution snapshot targets [browser, server]; edit id "body:edit" execution transaction targets [browser, server]; } - queryable value notes id "notes" : string { get id "notes:get" execution snapshot targets [browser, server]; edit id "notes:edit" execution transaction targets [browser, server]; } - operation revise id "revise" : record {body:change; notes:change; reject:bool;} -> unit {call id "revise:call" execution transaction targets [browser, server];} + queryable value body id "body" : string { get id "body:get" execution snapshot; edit id "body:edit" execution transaction; } + queryable value notes id "notes" : string { get id "notes:get" execution snapshot; edit id "notes:edit" execution transaction; } + operation revise id "revise" : record {body:change; notes:change; reject:bool;} -> unit {call id "revise:call" execution transaction;} queryable value label id "label" : string { - get id "label:get" execution snapshot targets [browser, server]; - set id "label:set" execution transaction targets [browser, server]; + get id "label:get" execution snapshot; + set id "label:set" execution transaction; } }`, { source }, @@ -36,8 +36,8 @@ const data = compileCapabilityResourceSource( const constructors = compileCapabilityResourceSource( `external atom Entry id "atom:entry"; external atom Independent id "atom:independent"; interface Factories id "interface:factories" revision "interface:factories@1" { - static operation createOne id "create-one" : string -> atom-ref { call id "create-one:call" execution transaction targets [browser, server]; } - static operation createTwo id "create-two" : unit -> atom-ref { call id "create-two:call" execution transaction targets [browser, server]; } + static operation createOne id "create-one" : string -> atom-ref { call id "create-one:call" execution transaction; } + static operation createTwo id "create-two" : unit -> atom-ref { call id "create-two:call" execution transaction; } }`, { source }, ); @@ -70,7 +70,8 @@ for (const variant of ["base", "added", "gateway", "gateway-next", "session"]) { gateway = session || variant.startsWith("gateway"), commit = { base: "a", added: "b", gateway: "c", "gateway-next": "d", session: "e" }[variant]!.repeat(40); const pkg = compileCapabilityResourceSource( - `${gateway ? 'external atom Entry id "atom:entry";' : ""} + `symbol JavaScript id "target:org.quixos.execution.javascript@1"; +${gateway ? 'external atom Entry id "atom:entry";' : ""} ${session ? 'external atom Independent id "atom:independent"; import interface Data; import interface View;' : ""} package Owner id "package:owner" revision "package:owner@1" { function identity id "identity" : int32 -> record { pid: int32; child: int32; } execution remote; @@ -78,9 +79,9 @@ package Owner id "package:owner" revision "package:owner@1" { ${ session ? `module Editor id "component:owner-editor" implements View.render; - function createOne id "create-one" : string -> atom-ref execution transaction targets [browser, server] requires { creation entry id "one:birth" : Entry input unit; }; - function createTwo id "create-two" : unit -> atom-ref execution transaction targets [browser, server] requires { creation entry id "two:birth" : Independent input unit; }; - operation revise id "revise" : record {body:change; notes:change; reject:bool;} -> unit mode call execution transaction targets [browser, server] receiver any requires { + function createOne id "create-one" : string -> atom-ref execution transaction targets [JavaScript, server] requires { creation entry id "one:birth" : Entry input unit; }; + function createTwo id "create-two" : unit -> atom-ref execution transaction targets [JavaScript, server] requires { creation entry id "two:birth" : Independent input unit; }; + operation revise id "revise" : record {body:change; notes:change; reject:bool;} -> unit mode call execution transaction targets [JavaScript, server] receiver any requires { state body id "revise:body" : string [edit]; state notes id "revise:notes" : string [edit]; }; query Inputs id "inputs" root workspace Data document "inputs.graphql" operation "Inputs" { replica; } @@ -202,9 +203,10 @@ await import("./emit-controllers.js"); // Standalone public builder roots must work without opting into the other modes. for (const kind of ["portable", "service"]) { const pkg = compileCapabilityResourceSource( - `package Owner id "package:owner" revision "package:owner@1" { + `symbol JavaScript id "target:org.quixos.execution.javascript@1"; +package Owner id "package:owner" revision "package:owner@1" { function identity id "identity" : int32 -> record {pid:int32;child:int32;} - execution ${kind === "portable" ? "snapshot targets [browser,server]" : "remote"}; + execution ${kind === "portable" ? "snapshot targets [JavaScript,server]" : "remote"}; }`, { source }, ); diff --git a/test/emit-portable-reader.ts b/test/emit-portable-reader.ts index 89ed50f..d3d548f 100644 --- a/test/emit-portable-reader.ts +++ b/test/emit-portable-reader.ts @@ -7,17 +7,21 @@ import { compileExecutionPlan } from "../src/execution-world/plan.js"; import { generatePortableTypeScriptBindings } from "../src/bindings/portable.js"; import { generatePortableClientBindings } from "../src/bindings/portable-client.js"; import { loadCompositeWorkspace } from "./composite-fixture.js"; +import { javascriptTarget } from "../src/execution-world/native-backends.js"; +const executionTarget = (lane: string) => (lane === "browser" ? javascriptTarget : lane); const plan = compileExecutionPlan(await loadReaderWorkspace()); await mkdir("dist/portable-reader", { recursive: true }); for (const target of ["browser", "server"]) await writeFile( `dist/portable-reader/${target}.ts`, - generatePortableTypeScriptBindings(plan.definition.bindingSchema, "package:reader-runtime@1", { target }), + generatePortableTypeScriptBindings(plan.definition.bindingSchema, "package:reader-runtime@1", { + target: executionTarget(target), + }), ); await writeFile("dist/portable-reader/plan.json", JSON.stringify(plan)); await writeFile("dist/portable-reader/kernel.json", JSON.stringify(compileKernelProgram(plan))); await writeFile("dist/portable-reader/queries.json", JSON.stringify(compileQueryProgram(plan))); -await writeFile("dist/portable-reader/client.ts", generatePortableClientBindings(plan, { target: "browser" })); +await writeFile("dist/portable-reader/client.ts", generatePortableClientBindings(plan, { target: javascriptTarget })); const serviceWorkspace = structuredClone(plan.definition.workspace); serviceWorkspace.atoms = []; serviceWorkspace.conformances = []; @@ -49,7 +53,9 @@ for (const target of ["browser", "server"]) ] as const) await writeFile( `dist/portable-reader/composite/${name}-${target}.ts`, - generatePortableTypeScriptBindings(composite.definition.bindingSchema, revision, { target }), + generatePortableTypeScriptBindings(composite.definition.bindingSchema, revision, { + target: executionTarget(target), + }), ); const { portableGenericPlan } = await import("./portable-generic-fixture.js"); @@ -59,7 +65,9 @@ await mkdir("dist/portable-reader/generic", { recursive: true }); for (const target of ["browser", "server"]) { await writeFile( `dist/portable-reader/generic/${target}.ts`, - generatePortableTypeScriptBindings(generic.definition.bindingSchema, genericPackage.revisionId, { target }), + generatePortableTypeScriptBindings(generic.definition.bindingSchema, genericPackage.revisionId, { + target: executionTarget(target), + }), ); } const stringEntry = genericPackage.exports.find((e) => e.inputType.kind === "scalar")!; @@ -141,7 +149,7 @@ await writeFile( await writeFile( "dist/portable-reader/presentation-mount/browser.ts", generatePortableTypeScriptBindings(presentationMount.definition.bindingSchema, "presentation-runtime@1", { - target: "browser", + target: javascriptTarget, }), ); diff --git a/test/execution-contracts.test.ts b/test/execution-contracts.test.ts index cc187ef..8346690 100644 --- a/test/execution-contracts.test.ts +++ b/test/execution-contracts.test.ts @@ -3,7 +3,7 @@ import { test } from "node:test"; import { compileCapabilityResourceSource } from "../src/capability-language/index.js"; const source = { repository: "https://example.test/execution.git", commit: "a".repeat(40) }; -const data = (execution = "snapshot targets [browser, server]") => +const data = (execution = "snapshot") => compileCapabilityResourceSource( ` interface Data id "interface:data" revision "interface:data@1" { @@ -14,13 +14,14 @@ interface Data id "interface:data" revision "interface:data@1" { }`, { source }, ); -const program = (selection: string, execution = "snapshot targets [browser, server]") => { +const program = (selection: string, execution = "snapshot targets [JavaScript, server]") => { const contract = data(); assert.ok(contract.ok, JSON.stringify(contract.diagnostics)); assert.equal(contract.resource.kind, "interface"); if (contract.resource.kind !== "interface") throw new Error("Expected interface"); return compileCapabilityResourceSource( - ` + `symbol JavaScript id "target:org.quixos.execution.javascript@1"; + import interface Data; package Reader id "package:reader" revision "package:reader@1" { function label id "export:label" : unit -> string execution ${execution} requires { @@ -43,7 +44,10 @@ test("portable contracts preserve exact selected operations and targets", () => assert.equal(result.resource.kind, "package"); if (result.resource.kind !== "package") return; const entry = result.resource.revision.exports[0]!; - assert.deepEqual(entry.execution, { kind: "snapshot", targets: ["browser", "server"] }); + assert.deepEqual(entry.execution, { + kind: "snapshot", + targets: ["target:org.quixos.execution.javascript@1", "server"], + }); assert.deepEqual(entry.dependencyPorts[0]!.requirement, { kind: "interface", interfaceRevisionId: "interface:data@1", @@ -53,10 +57,10 @@ test("portable contracts preserve exact selected operations and targets", () => test("portable dependency diagnostics reject remote defaults and broad acquisition", () => { for (const [selection, execution, message] of [ - ["using [refresh.call]", "snapshot targets [browser]", "remote-only"], - ["", "snapshot targets [browser]", "select"], - ["using [label.get, label.get]", "snapshot targets [browser]", "duplicates"], - ["using [label.set]", "snapshot targets [browser]", "Unknown"], + ["using [refresh.call]", "snapshot targets [JavaScript, server]", "remote-only"], + ["", "snapshot targets [JavaScript, server]", "select"], + ["using [label.get, label.get]", "snapshot targets [JavaScript, server]", "duplicates"], + ["using [label.set]", "snapshot targets [JavaScript, server]", "Unknown"], ]) { const result = program(selection!, execution); assert.equal(result.ok, false); @@ -64,11 +68,26 @@ test("portable dependency diagnostics reject remote defaults and broad acquisiti } }); -test("package code targets may exceed a dependency's public minimum", () => { +test("execution targets must resolve nominal declarations", () => { const result = program("using [label.get]", "snapshot targets [arduino]"); - assert.ok(result.ok, JSON.stringify(result.diagnostics)); - // A workspace still has to provide the full installed closure before an - // operation can promise this target; package code alone is insufficient. + assert.equal(result.ok, false); + assert.match(JSON.stringify(result.diagnostics), /Unknown nominal execution target arduino/); +}); + +test("nominal targets are identified by symbols rather than platform spellings or interfaces", () => { + const compile = (alias: string, identity: string) => + compileCapabilityResourceSource( + `symbol ${alias} id "${identity}"; package P id "p" revision "p@1" { function f id "f" : unit -> unit execution transaction targets [${alias},server]; }`, + { source }, + ); + const device = compile("ESP32", "target:example.device@1"); + const renamed = compile("MyController", "target:example.device@1"); + assert.ok(device.ok && device.resource.kind === "package"); + assert.ok(renamed.ok && renamed.resource.kind === "package"); + assert.deepEqual(device.resource.revision.exports[0]!.execution, renamed.resource.revision.exports[0]!.execution); + assert.deepEqual(device.resource.externalInterfaces, [], "A target identity has no interface definition dependency"); + assert.equal(compile("server", "target:example.device@1").ok, false); + assert.equal(compile("Alias", "server").ok, false); }); test("portable query getters and target declarations are checked", () => { @@ -80,9 +99,10 @@ test("portable query getters and target declarations are checked", () => { test("snapshot exports reject mutable state ports but transactions admit them", () => { const compile = (effect: string) => compileCapabilityResourceSource( - ` + `symbol JavaScript id "target:org.quixos.execution.javascript@1"; + package Reader id "package:reader" revision "package:reader@1" { - function update id "export:update" : string -> unit execution ${effect} targets [browser, server] requires { + function update id "export:update" : string -> unit execution ${effect} targets [JavaScript, server] requires { state storage id "port:value" : string [read, write]; }; }`, @@ -137,7 +157,7 @@ package Reader id "package:reader" revision "package:reader@1" { delete remote.members[0]!.operations[0]!.execution; await assert.rejects( compileQuery(local, [remote], async () => document("Presentation", "availableObjects")), - /browser snapshot getter/, + /graph snapshot getter/, ); const { capabilityId } = await import("../src/capability-model/index.js"); const linked = linkQueries({ @@ -200,15 +220,16 @@ test("generic selected ports preserve operation identities and execution through const { specializePackageExport, capabilityId } = await import("../src/capability-model/index.js"); const iface = compileCapabilityResourceSource( `interface Cell id "cell" revision "cell@1" { - value content id "content" : T { get id "content:get" execution snapshot targets [browser, server]; } + value content id "content" : T { get id "content:get" execution snapshot; } }`, { source }, ); assert.ok(iface.ok && iface.resource.kind === "interface", JSON.stringify(iface.diagnostics)); const pkg = compileCapabilityResourceSource( - `import interface Cell; + `symbol JavaScript id "target:org.quixos.execution.javascript@1"; +import interface Cell; package P id "p" revision "p@1" { - function load id "read" : unit -> T execution snapshot targets [browser, server] requires { + function load id "read" : unit -> T execution snapshot targets [JavaScript, server] requires { interface cell id "cell" : Cell using [content.get]; }; }`, @@ -236,7 +257,10 @@ test("generic selected ports preserve operation identities and execution through implementsInterface: () => false, }, ); - assert.deepEqual(specialized.execution, { kind: "snapshot", targets: ["browser", "server"] }); + assert.deepEqual(specialized.execution, { + kind: "snapshot", + targets: ["target:org.quixos.execution.javascript@1", "server"], + }); assert.deepEqual(specialized.dependencyPorts[0]!.requirement.kind, "interface"); const requirement = specialized.dependencyPorts[0]!.requirement; if (requirement.kind === "interface") diff --git a/test/execution-groups.test.ts b/test/execution-groups.test.ts index 264c427..22cc215 100644 --- a/test/execution-groups.test.ts +++ b/test/execution-groups.test.ts @@ -88,7 +88,7 @@ test("outbound provider changes invalidate consumers while caller changes preser mode: "call", inputType: { kind: "builtin", name: "unit" }, outputType: { kind: "scalar", name: "string" }, - execution: { kind: "snapshot", targets: ["browser", "server"] }, + execution: { kind: "snapshot", targets: ["target:org.quixos.execution.javascript@1", "server"] }, receiverRequirement: { kind: "exact-atom", atomId: id.atom("atom:reader:document") }, dependencyPorts: [ { diff --git a/test/execution-scaffold-fixture.ts b/test/execution-scaffold-fixture.ts index a28b8e6..a108ccc 100644 --- a/test/execution-scaffold-fixture.ts +++ b/test/execution-scaffold-fixture.ts @@ -24,7 +24,7 @@ export async function emitExecutionScaffold(root: string) { tools: { quixos: source, protocol: source, helpers: source, sdk: source }, }); for (const [name, execution] of [ - ["echo", "snapshot targets [browser, server]"], + ["echo", "snapshot targets [JavaScript, server]"], ["serverEcho", "snapshot targets [server]"], ["remoteEcho", "remote"], ]) { diff --git a/test/execution-world.test.ts b/test/execution-world.test.ts index 3605d70..072d13a 100644 --- a/test/execution-world.test.ts +++ b/test/execution-world.test.ts @@ -17,23 +17,63 @@ import { import { buildArtifactFixture as buildFixture } from "./artifact-fixture.js"; import { compileKernelProgram } from "../src/execution-world/kernel.js"; +import { loadCompositeWorkspace } from "./composite-fixture.js"; +import { standardNativeBackends } from "../src/execution-world/native-backends.js"; + +test("optional targets close over calls into another package", async () => { + const workspace = await loadCompositeWorkspace(); + const before = compileExecutionPlan(workspace).definition.operations.find( + (op) => op.operationId === "document:annotate:call", + )!; + assert.ok(before, "fixture exposes the composed add-highlight operation"); + assert.equal(before.availableTargets.length, 2); + workspace.packageImports.find((pkg) => pkg.revisionId === "package:comment-runtime@1")!.exports[0]!.execution = { + kind: "transaction", + targets: ["server"], + }; + const after = compileExecutionPlan(workspace).definition.operations.find((op) => op.key === before.key)!; + assert.deepEqual(after.availableTargets, ["server"]); + assert.deepEqual(after.execution, before.execution); +}); + +test("native support can be supplied for a nominal device target without platform syntax", async () => { + const workspace = await loadReaderWorkspace(); + const target = "interface:example.esp32@1"; + for (const pkg of workspace.packageImports) + for (const entry of pkg.exports) { + if (entry.execution && entry.execution.kind !== "remote") entry.execution.targets.push(target); + } + const plan = compileExecutionPlan(workspace, [ + ...standardNativeBackends, + { target, supports: (binding) => binding.kind === "state" || binding.kind === "edge" }, + ]); + assert.ok( + plan.definition.operations + .filter((op) => op.binding.kind === "state") + .every((op) => op.availableTargets.includes(target)), + ); + assert.ok( + plan.definition.operations.some((op) => op.binding.kind === "package" && op.availableTargets.includes(target)), + ); +}); const resign = (implementation: ArtifactImplementation) => { const { contentDigest, ...body } = implementation; implementation.contentDigest = implementationDigest(body); }; -test("installed targets can exceed the public requirement without changing that contract", async () => { - const workspace = await loadReaderWorkspace((name, text) => - name === "DocumentFactory.qx" ? text.replaceAll("targets [browser, server]", "targets [server]") : text, - ); +test("installed targets are implementation properties; authoritative fallback preserves the interface", async () => { + const workspace = await loadReaderWorkspace(); const plan = compileExecutionPlan(workspace); const factory = plan.definition.operations.find( (op) => op.binding.kind === "package" && op.binding.exportId === "reader:create-document", )!; assert.deepEqual(factory.execution, { kind: "transaction", targets: ["server"] }); - assert.deepEqual(factory.availableTargets, ["browser", "server"]); + assert.deepEqual(factory.availableTargets, ["server", "target:org.quixos.execution.javascript@1"]); const kernel = compileKernelProgram(plan) as { operations: { key: string; targets: string[] }[] }; - assert.deepEqual(kernel.operations.find((op) => op.key === factory.key)!.targets, ["browser", "server"]); + assert.deepEqual(kernel.operations.find((op) => op.key === factory.key)!.targets, [ + "server", + "target:org.quixos.execution.javascript@1", + ]); const provider = workspace.packageImports .flatMap((pkg) => pkg.exports) @@ -102,8 +142,8 @@ test("artifact closure checks bytes, exact source/schema, ABI, exports and targe (m.versions as unknown as Record).value = "v2"; }, /Incompatible runtime codecs/); await negative((m) => { - m.implementations = m.implementations.filter((i) => i.target !== "browser"); - }, /Missing browser implementation/); + m.implementations = m.implementations.filter((i) => i.target !== "target:org.quixos.execution.javascript@1"); + }, /Missing target:org.quixos.execution.javascript@1 implementation/); await negative((m) => { m.implementations = m.implementations.filter((i) => i.compatibility !== "quixos-service-v1"); }, /Missing service fallback/); @@ -211,7 +251,7 @@ test("closed generic applications retain distinct identities and codec shapes", const source = { repository: "https://example.test/generic.git", commit: "a".repeat(40) }; const definition = compileCapabilityResourceSource( `interface Cell id "cell" revision "cell@1" { - value content id "value" : V { get id "get" execution snapshot targets [browser, server]; } + value content id "value" : V { get id "get" execution snapshot; } }`, { source }, ); @@ -269,11 +309,10 @@ test("query dependencies propagate target requirements through selected getters" binding: { kind: "query", packageRevisionId: pkg.revisionId, queryId: query.id, scope: "workspace" }, }); compileExecutionPlan(workspace); - const field = workspace.interfaceImports - .find((i) => i.displayName === "HighlightData")! - .members.find((m) => m.displayName === "color")!; - field.operations.find((o) => o.displayName === "get")!.execution = { kind: "snapshot", targets: ["browser"] }; - assert.throws(() => compileExecutionPlan(workspace), /MISSING_EXECUTION_TARGET.*test:selector-query.*server/); + // Package artifact support is checked over the composed graph; an interface + // declaration cannot manufacture an authoritative implementation. + entry.execution = { kind: "snapshot", targets: ["target:org.quixos.execution.javascript@1"] }; + assert.throws(() => compileExecutionPlan(workspace), /MISSING_SERVER_IMPLEMENTATION/); }); test("implementation selection is explicit, target checked and independent of manifest order", async () => { @@ -281,7 +320,7 @@ test("implementation selection is explicit, target checked and independent of ma const plan = compileExecutionPlan(await loadReaderWorkspace()); const { manifest, read } = buildFixture(plan); const selection = { - target: "browser", + target: "target:org.quixos.execution.javascript@1", compatibility: "quixos-js-module-v1" as const, exports: [manifest.implementations[0]!.exports[0]!], }; diff --git a/test/fixtures/async-objects/DocumentData.qx b/test/fixtures/async-objects/DocumentData.qx index 85e0aac..2427bcf 100644 --- a/test/fixtures/async-objects/DocumentData.qx +++ b/test/fixtures/async-objects/DocumentData.qx @@ -1,17 +1,17 @@ type Summary = record { text: string; basedOn: string; }; interface DocumentData id "async:document-data" revision "async:document-data@1" { queryable value content id "async:content" : string { - get id "async:content:get" execution snapshot targets [browser, server]; + get id "async:content:get" execution snapshot; } queryable value summary id "async:summary" : Summary { - get id "async:summary:get" execution snapshot targets [browser, server]; - set id "async:summary:set" execution transaction targets [browser, server]; + get id "async:summary:get" execution snapshot; + set id "async:summary:set" execution transaction; } queryable value pendingJob id "async:pending-job" : optional { - get id "async:pending-job:get" execution snapshot targets [server]; - set id "async:pending-job:set" execution transaction targets [server]; + get id "async:pending-job:get" execution snapshot; + set id "async:pending-job:set" execution transaction; } operation recordSummary id "async:record-summary" : record { operationId: string; summary: Summary; } -> unit { - call id "async:record-summary:call" execution transaction targets [server]; + call id "async:record-summary:call" execution transaction; } } diff --git a/test/fixtures/canvas-content.qx b/test/fixtures/canvas-content.qx index f7774ea..8d4f4cc 100644 --- a/test/fixtures/canvas-content.qx +++ b/test/fixtures/canvas-content.qx @@ -6,7 +6,7 @@ type Entry = variant id "canvas:entry@1" { }; interface CanvasContent id "canvas" revision "canvas@1" { queryable value entries id "entries" : list { - get id "entries:get" execution snapshot targets [browser,server]; - edit id "entries:edit" execution transaction targets [browser,server]; + get id "entries:get" execution snapshot; + edit id "entries:edit" execution transaction; } } diff --git a/test/fixtures/collections/CollectionRuntime.qx b/test/fixtures/collections/CollectionRuntime.qx index 160601b..fae5c92 100644 --- a/test/fixtures/collections/CollectionRuntime.qx +++ b/test/fixtures/collections/CollectionRuntime.qx @@ -1,17 +1,18 @@ +symbol JavaScript id "target:org.quixos.execution.javascript@1"; type Replacement = record { expected: list; targets: list>; }; type Seed = record { label: string; }; external atom Node id "collection:node"; package CollectionRuntime id "collection:runtime" revision "collection:runtime@1" { operation version id "collection:runtime:version" : unit -> list - mode call execution snapshot targets [browser, server] receiver atom Node requires { + mode call execution snapshot targets [JavaScript, server] receiver atom Node requires { edge items id "collection:version:items" : many atom Node [resolve]; }; operation replace id "collection:runtime:replace" : Replacement -> unit - mode call execution transaction targets [browser, server] receiver atom Node requires { + mode call execution transaction targets [JavaScript, server] receiver atom Node requires { edge items id "collection:replace:items" : many atom Node [resolve, connect, disconnect]; }; operation ensure id "collection:runtime:ensure" : unit -> atom-ref - mode call execution transaction targets [browser, server] receiver atom Node requires { + mode call execution transaction targets [JavaScript, server] receiver atom Node requires { edge detail id "collection:ensure:detail" : optional-one atom Node [resolve, connect]; creation node id "collection:ensure:node" : Node input Seed; }; diff --git a/test/fixtures/collections/NodeData.qx b/test/fixtures/collections/NodeData.qx index 21eb3ce..ed90dd5 100644 --- a/test/fixtures/collections/NodeData.qx +++ b/test/fixtures/collections/NodeData.qx @@ -2,25 +2,25 @@ type Replacement = record { expected: list; targets: list external atom Node id "collection:node"; interface NodeData id "collection:data" revision "collection:data@1" { queryable portable value version id "collection:version" : list { - get id "collection:version:get" execution snapshot targets [browser, server]; + get id "collection:version:get" execution snapshot; } operation replace id "collection:replace" : Replacement -> unit { - call id "collection:replace:call" execution transaction targets [browser, server]; + call id "collection:replace:call" execution transaction; } operation ensure id "collection:ensure" : unit -> atom-ref { - call id "collection:ensure:call" execution transaction targets [browser, server]; + call id "collection:ensure:call" execution transaction; } queryable value label id "collection:label" : string { - get id "collection:label:get" execution snapshot targets [browser, server]; - set id "collection:label:set" execution transaction targets [browser, server]; + get id "collection:label:get" execution snapshot; + set id "collection:label:set" execution transaction; } queryable relation items id "collection:items" : many atom Node { - resolve id "collection:items:resolve" execution snapshot targets [browser, server]; + resolve id "collection:items:resolve" execution snapshot; } queryable relation containers id "collection:containers" : many atom Node { - resolve id "collection:containers:resolve" execution snapshot targets [browser, server]; + resolve id "collection:containers:resolve" execution snapshot; } queryable relation detail id "collection:detail" : optional-one atom Node { - resolve id "collection:detail:resolve" execution snapshot targets [browser, server]; + resolve id "collection:detail:resolve" execution snapshot; } } diff --git a/test/fixtures/compound-crdt/EditRuntime.qx b/test/fixtures/compound-crdt/EditRuntime.qx index be4f938..c6412ef 100644 --- a/test/fixtures/compound-crdt/EditRuntime.qx +++ b/test/fixtures/compound-crdt/EditRuntime.qx @@ -1,9 +1,10 @@ +symbol JavaScript id "target:org.quixos.execution.javascript@1"; external atom Note id "compound:note"; type Content = record { text: string; tags: list; }; type Edit = record { change: change; resolved: bool; }; package EditRuntime id "compound:runtime" revision "compound:runtime@1" { operation batch id "compound:runtime:batch" : record { edits: list; } -> unit - mode call execution transaction targets [browser, server] receiver atom Note requires { + mode call execution transaction targets [JavaScript, server] receiver atom Note requires { state content id "compound:batch:content" : Content [edit]; state resolved id "compound:batch:resolved" : bool [write]; } accept using checkBatch; @@ -12,7 +13,7 @@ package EditRuntime id "compound:runtime" revision "compound:runtime@1" { state allowed id "compound:batch:allowed" : bool [read]; }; operation update id "compound:runtime:update" : Edit -> unit - mode call execution transaction targets [browser, server] receiver atom Note requires { + mode call execution transaction targets [JavaScript, server] receiver atom Note requires { state content id "compound:edit:content" : Content [edit]; state resolved id "compound:edit:resolved" : bool [write]; } accept using check; diff --git a/test/fixtures/compound-crdt/NoteData.qx b/test/fixtures/compound-crdt/NoteData.qx index f0e30e1..a452ad0 100644 --- a/test/fixtures/compound-crdt/NoteData.qx +++ b/test/fixtures/compound-crdt/NoteData.qx @@ -2,20 +2,20 @@ type Content = record { text: string; tags: list; }; type Edit = record { change: change; resolved: bool; }; interface NoteData id "compound:data" revision "compound:data@1" { operation batch id "compound:batch" : record { edits: list; } -> unit { - call id "compound:batch:call" execution transaction targets [browser, server]; + call id "compound:batch:call" execution transaction; } operation update id "compound:update" : Edit -> unit { - call id "compound:update:call" execution transaction targets [browser, server]; + call id "compound:update:call" execution transaction; } queryable value content id "compound:content" : Content { - get id "compound:content:get" execution snapshot targets [browser, server]; - edit id "compound:content:edit" execution transaction targets [browser, server]; + get id "compound:content:get" execution snapshot; + edit id "compound:content:edit" execution transaction; } queryable value resolved id "compound:resolved" : bool { - get id "compound:resolved:get" execution snapshot targets [browser, server]; + get id "compound:resolved:get" execution snapshot; } queryable value title id "compound:title" : string { - get id "compound:title:get" execution snapshot targets [browser, server]; - set id "compound:title:set" execution transaction targets [browser, server]; + get id "compound:title:get" execution snapshot; + set id "compound:title:set" execution transaction; } } diff --git a/test/fixtures/controller-device/Device.qx b/test/fixtures/controller-device/Device.qx index 2bd1c77..3f86662 100644 --- a/test/fixtures/controller-device/Device.qx +++ b/test/fixtures/controller-device/Device.qx @@ -1,11 +1,11 @@ external atom Display id "device:display"; type Request=record {url:string;text:string;version:int32;}; interface Device id "device" revision "device@1" { - static operation create id "device:create" : string -> atom-ref {call id "device:create:call" execution transaction targets [browser,server];} - queryable value enabled id "device:enabled" : bool {get id "device:enabled:get" execution snapshot targets [browser,server];set id "device:enabled:set" execution transaction targets [browser,server];} - queryable value requested id "device:requested" : Request {get id "device:requested:get" execution snapshot targets [browser,server];} - queryable value observed id "device:observed" : optional {get id "device:observed:get" execution snapshot targets [browser,server];} - operation requestText id "device:request" : string -> unit {call id "device:request:call" execution transaction targets [browser,server];} - operation recordObservation id "device:record" : Request -> unit {call id "device:record:call" execution transaction targets [server];} - operation remove id "device:remove" : unit -> unit {call id "device:remove:call" execution transaction targets [server];} + static operation create id "device:create" : string -> atom-ref {call id "device:create:call" execution transaction;} + queryable value enabled id "device:enabled" : bool {get id "device:enabled:get" execution snapshot;set id "device:enabled:set" execution transaction;} + queryable value requested id "device:requested" : Request {get id "device:requested:get" execution snapshot;} + queryable value observed id "device:observed" : optional {get id "device:observed:get" execution snapshot;} + operation requestText id "device:request" : string -> unit {call id "device:request:call" execution transaction;} + operation recordObservation id "device:record" : Request -> unit {call id "device:record:call" execution transaction;} + operation remove id "device:remove" : unit -> unit {call id "device:remove:call" execution transaction;} } diff --git a/test/fixtures/controller-device/DeviceController.qx b/test/fixtures/controller-device/DeviceController.qx index 8ee3cb5..999536b 100644 --- a/test/fixtures/controller-device/DeviceController.qx +++ b/test/fixtures/controller-device/DeviceController.qx @@ -1,6 +1,6 @@ type Request=record {url:string;text:string;version:int32;}; interface DeviceController id "device-controller" revision "device-controller@1" { - queryable portable value enabled id "controller:enabled" : bool {get id "controller:enabled:get" execution snapshot targets [server];} - operation snapshot id "device:snapshot" : unit -> optional {call id "device:snapshot:call" execution snapshot targets [server];} + queryable portable value enabled id "controller:enabled" : bool {get id "controller:enabled:get" execution snapshot;} + operation snapshot id "device:snapshot" : unit -> optional {call id "device:snapshot:call" execution snapshot;} operation apply id "device:apply" : optional -> unit {call id "device:apply:call" execution remote;} } diff --git a/test/fixtures/controller-device/Driver.qx b/test/fixtures/controller-device/Driver.qx index 575c284..00ffb9b 100644 --- a/test/fixtures/controller-device/Driver.qx +++ b/test/fixtures/controller-device/Driver.qx @@ -1,10 +1,11 @@ +symbol JavaScript id "target:org.quixos.execution.javascript@1"; import interface Device; import interface DeviceController; external atom Display id "device:display"; type Request=record {url:string;text:string;version:int32;}; package Driver id "driver" revision "driver@1" { - function create id "driver:create" : string -> atom-ref execution transaction targets [browser,server] requires {creation device id "device" : Display input record {enabled:bool;requested:Request;observed:optional;};}; - operation request id "driver:request" : string -> unit mode call execution transaction targets [browser,server] receiver any requires {state requested id "requested" : Request [read,write];}; + function create id "driver:create" : string -> atom-ref execution transaction targets [JavaScript,server] requires {creation device id "device" : Display input record {enabled:bool;requested:Request;observed:optional;};}; + operation request id "driver:request" : string -> unit mode call execution transaction targets [JavaScript,server] receiver any requires {state requested id "requested" : Request [read,write];}; operation snapshot id "driver:snapshot" : unit -> optional mode call execution snapshot targets [server] receiver any requires {interface data id "data" : Device using [enabled.get,requested.get,observed.get];}; operation recordObservation id "driver:record" : Request -> unit mode call execution transaction targets [server] receiver any requires {state requested id "requested" : Request [read];state observed id "observed" : optional [write];}; operation apply id "driver:apply" : optional -> unit mode call execution remote receiver any requires {interface device id "device" : Device using [recordObservation.call];}; diff --git a/test/fixtures/events/event-handler.qx b/test/fixtures/events/event-handler.qx index 0d45e86..ce7bc44 100644 --- a/test/fixtures/events/event-handler.qx +++ b/test/fixtures/events/event-handler.qx @@ -1,5 +1,5 @@ interface EventHandler id "interface:org.quixos.events:handler" revision "interface:org.quixos.events:handler@1" { operation handle id "events:handle" : record {event:Payload;parameters:Parameters;} -> unit { - call id "events:handle:call" execution transaction targets [server]; + call id "events:handle:call" execution transaction; } } diff --git a/test/fixtures/events/event-stream.qx b/test/fixtures/events/event-stream.qx index f9c4717..0607317 100644 --- a/test/fixtures/events/event-stream.qx +++ b/test/fixtures/events/event-stream.qx @@ -1,13 +1,13 @@ // Required server support; a checked installed implementation may additionally predict locally. interface EventStream id "interface:org.quixos.events:stream" revision "interface:org.quixos.events:stream@1" { operation publish id "events:publish" : Payload -> record {publication:string;} { - call id "events:publish:call" execution transaction targets [server]; + call id "events:publish:call" execution transaction; } queryable value head id "events:head" : optional { - get id "events:head:get" execution snapshot targets [server]; + get id "events:head:get" execution snapshot; } operation readPage id "events:read-page" : record {after:optional;limit:uint32;} -> record {entries:list;next:optional;asOfHead:optional;} { - call id "events:read-page:call" execution snapshot targets [server]; + call id "events:read-page:call" execution snapshot; } } diff --git a/test/fixtures/events/event-subscription.qx b/test/fixtures/events/event-subscription.qx index bce2c65..66426aa 100644 --- a/test/fixtures/events/event-subscription.qx +++ b/test/fixtures/events/event-subscription.qx @@ -7,12 +7,12 @@ type StartPosition = variant id "org.quixos.events:start@1" { }; interface EventSubscription id "interface:org.quixos.events:subscription" revision "interface:org.quixos.events:subscription@1" { operation attach id "events:attach" : record {source:interface-ref>;handler:interface-ref>;parameters:Parameters;start:StartPosition;} -> unit { - call id "events:attach:call" execution transaction targets [server]; + call id "events:attach:call" execution transaction; } queryable value status id "events:status" : record {status:string;generation:uint64;cursor:uint64;failure:optional;} { - get id "events:status:get" execution snapshot targets [server]; + get id "events:status:get" execution snapshot; } - operation pause id "events:pause" : unit -> unit {call id "events:pause:call" execution transaction targets [server];} - operation resume id "events:resume" : unit -> unit {call id "events:resume:call" execution transaction targets [server];} - operation retire id "events:retire" : unit -> unit {call id "events:retire:call" execution transaction targets [server];} + operation pause id "events:pause" : unit -> unit {call id "events:pause:call" execution transaction;} + operation resume id "events:resume" : unit -> unit {call id "events:resume:call" execution transaction;} + operation retire id "events:retire" : unit -> unit {call id "events:retire:call" execution transaction;} } diff --git a/test/fixtures/local-first-composite/CommentFactory.qx b/test/fixtures/local-first-composite/CommentFactory.qx index 12edd77..a6ebf2c 100644 --- a/test/fixtures/local-first-composite/CommentFactory.qx +++ b/test/fixtures/local-first-composite/CommentFactory.qx @@ -2,6 +2,6 @@ external atom Comment id "atom:reader:comment"; interface CommentFactory id "interface:reader:comment-factory" revision "interface:reader:comment-factory@1" { operation prepareComment id "document:prepare-comment" : bool -> atom-ref { - call id "document:prepare-comment:call" execution transaction targets [browser, server]; + call id "document:prepare-comment:call" execution transaction; } } diff --git a/test/fixtures/local-first-composite/CommentRuntime.qx b/test/fixtures/local-first-composite/CommentRuntime.qx index 3f12bf7..6096d59 100644 --- a/test/fixtures/local-first-composite/CommentRuntime.qx +++ b/test/fixtures/local-first-composite/CommentRuntime.qx @@ -1,10 +1,11 @@ +symbol JavaScript id "target:org.quixos.execution.javascript@1"; external atom Document id "atom:reader:document"; external atom Comment id "atom:reader:comment"; import interface CommentData; type CommentSeed = record { content: record { text: string; tags: list; }; }; package CommentRuntime id "package:comment-runtime" revision "package:comment-runtime@1" { operation prepareComment id "comment:prepare" - : bool -> atom-ref mode call execution transaction targets [browser, server] + : bool -> atom-ref mode call execution transaction targets [JavaScript, server] receiver atom Document requires { creation comment id "comment:prepare:comment" : Comment input CommentSeed; }; diff --git a/test/fixtures/local-first-composite/DocumentFactory.qx b/test/fixtures/local-first-composite/DocumentFactory.qx index f5e700c..165bbaa 100644 --- a/test/fixtures/local-first-composite/DocumentFactory.qx +++ b/test/fixtures/local-first-composite/DocumentFactory.qx @@ -20,6 +20,6 @@ interface DocumentFactory id "interface:reader:document-factory" revision "interface:reader:document-factory@1" { static operation create id "document:create" : DocumentSeed -> atom-ref { call id "document:create:call" - execution transaction targets [browser, server]; + execution transaction; } } diff --git a/test/fixtures/local-first-composite/DocumentLabel.qx b/test/fixtures/local-first-composite/DocumentLabel.qx index dc1649a..63fa6c3 100644 --- a/test/fixtures/local-first-composite/DocumentLabel.qx +++ b/test/fixtures/local-first-composite/DocumentLabel.qx @@ -1,6 +1,6 @@ interface DocumentLabel id "interface:reader:document-label" revision "interface:reader:document-label@1" { queryable value title id "document:view-title" : string { - get id "document:view-title:get" execution snapshot targets [browser, server]; + get id "document:view-title:get" execution snapshot; } } diff --git a/test/fixtures/local-first-composite/DocumentMetadata.qx b/test/fixtures/local-first-composite/DocumentMetadata.qx index fe1f648..b09b21c 100644 --- a/test/fixtures/local-first-composite/DocumentMetadata.qx +++ b/test/fixtures/local-first-composite/DocumentMetadata.qx @@ -1,6 +1,6 @@ interface DocumentMetadata id "interface:reader:document-metadata" revision "interface:reader:document-metadata@1" { queryable value label id "document:label" : string { - get id "document:label:get" execution snapshot targets [browser, server]; + get id "document:label:get" execution snapshot; } } diff --git a/test/fixtures/local-first-composite/ReaderRuntime.qx b/test/fixtures/local-first-composite/ReaderRuntime.qx index 5b6fce9..b0a1de7 100644 --- a/test/fixtures/local-first-composite/ReaderRuntime.qx +++ b/test/fixtures/local-first-composite/ReaderRuntime.qx @@ -1,3 +1,4 @@ +symbol JavaScript id "target:org.quixos.execution.javascript@1"; // Shared record definitions, repeated explicitly in independently locked resources. external atom Document id "atom:reader:document"; external atom Highlight id "atom:reader:highlight"; @@ -30,7 +31,7 @@ package ReaderRuntime id "package:reader-runtime" revision "package:reader-runtime@1" { operation addHighlight id "reader:add-highlight" : SourceRange -> atom-ref - mode call execution transaction targets [browser, server] + mode call execution transaction targets [JavaScript, server] receiver atom Document requires { interface document id "reader:add:document" : DocumentData using [sourceRevision.get, content.get, highlights.connect]; @@ -39,7 +40,7 @@ revision "package:reader-runtime@1" { }; operation excerpt id "reader:excerpt" : unit -> string - mode call execution snapshot targets [browser, server] + mode call execution snapshot targets [JavaScript, server] receiver atom Highlight requires { state range id "reader:excerpt:range" : SourceRange [read]; interface document id "reader:excerpt:document" : DocumentData @@ -49,11 +50,11 @@ revision "package:reader-runtime@1" { // A receiverless function needs no synthetic service object. function validateRange id "reader:validate-range" : record { range: SourceRange; content: string; } -> bool - execution snapshot targets [browser, server]; + execution snapshot targets [JavaScript, server]; function createDocument id "reader:create-document" : DocumentSeed -> atom-ref - execution transaction targets [browser, server] requires { + execution transaction targets [JavaScript, server] requires { creation document id "reader:create:document" : Document input DocumentSeed; }; query ReplicaInputs id "reader:replica-inputs" root DocumentData diff --git a/test/fixtures/local-first-reader/CommentData.qx b/test/fixtures/local-first-reader/CommentData.qx index 8bfebb8..2dba67a 100644 --- a/test/fixtures/local-first-reader/CommentData.qx +++ b/test/fixtures/local-first-reader/CommentData.qx @@ -20,8 +20,8 @@ interface CommentData id "interface:reader:comment-data" revision "interface:reader:comment-data@1" { queryable value content id "comment:content" : CommentContent { get id "comment:content:get" - execution snapshot targets [browser, server]; + execution snapshot; edit id "comment:content:edit" - execution transaction targets [browser, server]; + execution transaction; } } diff --git a/test/fixtures/local-first-reader/DocumentActions.qx b/test/fixtures/local-first-reader/DocumentActions.qx index ae18ac1..f42bfb5 100644 --- a/test/fixtures/local-first-reader/DocumentActions.qx +++ b/test/fixtures/local-first-reader/DocumentActions.qx @@ -20,6 +20,6 @@ interface DocumentActions id "interface:reader:document-actions" revision "interface:reader:document-actions@1" { operation annotate id "document:annotate" : SourceRange -> atom-ref { call id "document:annotate:call" - execution transaction targets [browser, server]; + execution transaction; } } diff --git a/test/fixtures/local-first-reader/DocumentData.qx b/test/fixtures/local-first-reader/DocumentData.qx index 7526ba5..c17412c 100644 --- a/test/fixtures/local-first-reader/DocumentData.qx +++ b/test/fixtures/local-first-reader/DocumentData.qx @@ -20,17 +20,17 @@ interface DocumentData id "interface:reader:document-data" revision "interface:reader:document-data@1" { queryable value sourceRevision id "document:source-revision" : string { get id "document:source-revision:get" - execution snapshot targets [browser, server]; + execution snapshot; } queryable value content id "document:content" : string { get id "document:content:get" - execution snapshot targets [browser, server]; + execution snapshot; } queryable relation highlights id "document:highlights" : many-unique atom Highlight { resolve id "document:highlights:resolve" - execution snapshot targets [browser, server]; + execution snapshot; connect id "document:highlights:connect" - execution transaction targets [browser, server]; + execution transaction; } } diff --git a/test/fixtures/local-first-reader/DocumentFactory.qx b/test/fixtures/local-first-reader/DocumentFactory.qx index e8bdbd3..953ebfb 100644 --- a/test/fixtures/local-first-reader/DocumentFactory.qx +++ b/test/fixtures/local-first-reader/DocumentFactory.qx @@ -20,6 +20,6 @@ interface DocumentFactory id "interface:reader:document-factory" revision "interface:reader:document-factory@1" { static operation create id "document:create" : DocumentSeed -> atom-ref { call id "document:create:call" - execution transaction targets [browser, server]; + execution transaction; } } diff --git a/test/fixtures/local-first-reader/HighlightData.qx b/test/fixtures/local-first-reader/HighlightData.qx index 035f501..c0923ba 100644 --- a/test/fixtures/local-first-reader/HighlightData.qx +++ b/test/fixtures/local-first-reader/HighlightData.qx @@ -20,20 +20,20 @@ interface HighlightData id "interface:reader:highlight-data" revision "interface:reader:highlight-data@1" { queryable value range id "highlight:range" : SourceRange { get id "highlight:range:get" - execution snapshot targets [browser, server]; + execution snapshot; } queryable value color id "highlight:color" : string { get id "highlight:color:get" - execution snapshot targets [browser, server]; + execution snapshot; set id "highlight:color:set" - execution transaction targets [browser, server]; + execution transaction; } queryable portable value excerpt id "highlight:excerpt" : string { get id "highlight:excerpt:get" - execution snapshot targets [browser, server]; + execution snapshot; } queryable relation comments id "highlight:comments" : many-unique atom Comment { resolve id "highlight:comments:resolve" - execution snapshot targets [browser, server]; + execution snapshot; } } diff --git a/test/fixtures/local-first-reader/ReaderRuntime.qx b/test/fixtures/local-first-reader/ReaderRuntime.qx index 7f86b54..55ddbf7 100644 --- a/test/fixtures/local-first-reader/ReaderRuntime.qx +++ b/test/fixtures/local-first-reader/ReaderRuntime.qx @@ -1,3 +1,4 @@ +symbol JavaScript id "target:org.quixos.execution.javascript@1"; // Shared record definitions, repeated explicitly in independently locked resources. external atom Document id "atom:reader:document"; external atom Highlight id "atom:reader:highlight"; @@ -29,7 +30,7 @@ package ReaderRuntime id "package:reader-runtime" revision "package:reader-runtime@1" { operation addHighlight id "reader:add-highlight" : SourceRange -> atom-ref - mode call execution transaction targets [browser, server] + mode call execution transaction targets [JavaScript, server] receiver atom Document requires { interface document id "reader:add:document" : DocumentData using [sourceRevision.get, content.get, highlights.connect]; @@ -38,7 +39,7 @@ revision "package:reader-runtime@1" { }; operation excerpt id "reader:excerpt" : unit -> string - mode call execution snapshot targets [browser, server] + mode call execution snapshot targets [JavaScript, server] receiver atom Highlight requires { state range id "reader:excerpt:range" : SourceRange [read]; interface document id "reader:excerpt:document" : DocumentData @@ -48,11 +49,11 @@ revision "package:reader-runtime@1" { // A receiverless function needs no synthetic service object. function validateRange id "reader:validate-range" : record { range: SourceRange; content: string; } -> bool - execution snapshot targets [browser, server]; + execution snapshot targets [JavaScript, server]; function createDocument id "reader:create-document" : DocumentSeed -> atom-ref - execution transaction targets [browser, server] requires { + execution transaction targets [JavaScript, server] requires { creation document id "reader:create:document" : Document input DocumentSeed; }; query ReplicaInputs id "reader:replica-inputs" root DocumentData diff --git a/test/fixtures/presentation-mount/DocumentNavigation.qx b/test/fixtures/presentation-mount/DocumentNavigation.qx index a0e7da7..6570e07 100644 --- a/test/fixtures/presentation-mount/DocumentNavigation.qx +++ b/test/fixtures/presentation-mount/DocumentNavigation.qx @@ -1,7 +1,7 @@ import interface PresentationState; interface DocumentNavigation id "document-navigation" revision "document-navigation@1" requires PresentationState { queryable value compact id "document-navigation:compact" : bool { - get id "document-navigation:compact:get" execution snapshot targets [browser,server]; - set id "document-navigation:compact:set" execution transaction targets [browser,server]; + get id "document-navigation:compact:get" execution snapshot; + set id "document-navigation:compact:set" execution transaction; } } diff --git a/test/fixtures/presentation-mount/PresentationMount.qx b/test/fixtures/presentation-mount/PresentationMount.qx index a74a683..29df943 100644 --- a/test/fixtures/presentation-mount/PresentationMount.qx +++ b/test/fixtures/presentation-mount/PresentationMount.qx @@ -1,15 +1,15 @@ import interface PresentationState; interface PresentationMount id "presentation-mount" revision "presentation-mount@1" { static operation create id "presentation-mount:create" : unit -> interface-ref { - call id "presentation-mount:create:call" execution transaction targets [browser,server]; + call id "presentation-mount:create:call" execution transaction; } queryable relation members id "presentation-mount:members" : many-unique interface PresentationState { - resolve id "presentation-mount:members:resolve" execution snapshot targets [browser,server]; + resolve id "presentation-mount:members:resolve" execution snapshot; } queryable relation root id "presentation-mount:root" : optional-one interface PresentationState { - resolve id "presentation-mount:root:resolve" execution snapshot targets [browser,server]; + resolve id "presentation-mount:root:resolve" execution snapshot; } operation attach id "presentation-mount:attach" : interface-ref -> unit { - call id "presentation-mount:attach:call" execution transaction targets [browser,server]; + call id "presentation-mount:attach:call" execution transaction; } } diff --git a/test/fixtures/presentation-mount/PresentationRuntime.qx b/test/fixtures/presentation-mount/PresentationRuntime.qx index d00e076..bef78f5 100644 --- a/test/fixtures/presentation-mount/PresentationRuntime.qx +++ b/test/fixtures/presentation-mount/PresentationRuntime.qx @@ -1,3 +1,4 @@ +symbol JavaScript id "target:org.quixos.execution.javascript@1"; import interface PresentationStates; import interface ReaderNavigation; external atom ReaderNavigationRecord id "reader-navigation-record"; @@ -6,24 +7,24 @@ import interface PresentationMount; import interface StateFactory; external atom PresentationMountRecord id "presentation-mount-record"; package PresentationRuntime id "presentation-runtime" revision "presentation-runtime@1" { - function createReaderState id "presentation-runtime:create-reader-state" : record {occurrence:string;parent:optional>;} -> interface-ref execution transaction targets [browser,server] requires { + function createReaderState id "presentation-runtime:create-reader-state" : record {occurrence:string;parent:optional>;} -> interface-ref execution transaction targets [JavaScript,server] requires { creation navigation id "navigation" : ReaderNavigationRecord input record {occurrence:string;parent:optional>;}; }; - function createPresentationMount id "presentation-runtime:create" : unit -> interface-ref execution transaction targets [browser,server] requires { + function createPresentationMount id "presentation-runtime:create" : unit -> interface-ref execution transaction targets [JavaScript,server] requires { creation presentationMount id "presentationMount" : PresentationMountRecord input unit; }; - operation attach id "presentation-runtime:attach" : interface-ref -> unit mode call execution transaction targets [browser,server] receiver any requires { + operation attach id "presentation-runtime:attach" : interface-ref -> unit mode call execution transaction targets [JavaScript,server] receiver any requires { edge members id "members" : many-unique interface PresentationState [resolve,connect]; edge root id "root" : optional-one interface PresentationState [resolve,connect]; interface metadata id "state" : PresentationState using [presentationMount.resolve,parent.resolve] from input; }; - operation ensure id "presentation-runtime:ensure" : record {presentationMount:interface-ref;occurrence:string;parent:optional>;} -> ref mode call execution transaction targets [browser,server] receiver any requires { + operation ensure id "presentation-runtime:ensure" : record {presentationMount:interface-ref;occurrence:string;parent:optional>;} -> ref mode call execution transaction targets [JavaScript,server] receiver any requires { edge states id "states" : many-unique object Navigation keyed "string" [resolve,connect]; interface metadata id "state" : PresentationState using [occurrence.get,presentationMount.resolve,parent.resolve] from input; interface presentationMount id "presentationMount" : PresentationMount using [attach.call] from input; interface factory id "factory" : StateFactory using [create.call]; }; - function createState id "presentation-runtime:create-state" : record {occurrence:string;parent:optional>;} -> ref execution transaction targets [browser,server] requires { + function createState id "presentation-runtime:create-state" : record {occurrence:string;parent:optional>;} -> ref execution transaction targets [JavaScript,server] requires { creation navigation id "navigation" : Navigation input record {occurrence:string;parent:optional>;}; }; query ReaderStateInputs id "reader-state:inputs" root PresentationStates document "queries/reader-inputs.graphql" operation "ReaderState" { replica; view ReaderNavigationRecord as ReaderNavigation; max rows 100; } diff --git a/test/fixtures/presentation-mount/PresentationState.qx b/test/fixtures/presentation-mount/PresentationState.qx index ac2f30f..f112431 100644 --- a/test/fixtures/presentation-mount/PresentationState.qx +++ b/test/fixtures/presentation-mount/PresentationState.qx @@ -1,12 +1,12 @@ external interface PresentationMount revision "presentation-mount@1"; interface PresentationState id "presentation-state" revision "presentation-state@1" { queryable value occurrence id "state:occurrence" : string { - get id "state:occurrence:get" execution snapshot targets [browser,server]; + get id "state:occurrence:get" execution snapshot; } queryable relation presentationMount id "state:presentation-mount" : optional-one interface PresentationMount { - resolve id "state:presentation-mount:resolve" execution snapshot targets [browser,server]; + resolve id "state:presentation-mount:resolve" execution snapshot; } queryable relation parent id "state:parent" : optional-one interface PresentationState { - resolve id "state:parent:resolve" execution snapshot targets [browser,server]; + resolve id "state:parent:resolve" execution snapshot; } } diff --git a/test/fixtures/presentation-mount/PresentationStates.qx b/test/fixtures/presentation-mount/PresentationStates.qx index a5153af..2bf312a 100644 --- a/test/fixtures/presentation-mount/PresentationStates.qx +++ b/test/fixtures/presentation-mount/PresentationStates.qx @@ -2,9 +2,9 @@ import interface PresentationState; import interface PresentationMount; interface PresentationStates id "presentation-states" revision "presentation-states@1" { queryable relation states id "presentation-states:states" : many-unique object Navigation keyed "string" { - resolve id "presentation-states:states:resolve" execution snapshot targets [browser,server]; + resolve id "presentation-states:states:resolve" execution snapshot; } operation ensure id "presentation-states:ensure" : record {presentationMount:interface-ref;occurrence:string;parent:optional>;} -> ref { - call id "presentation-states:ensure:call" execution transaction targets [browser,server]; + call id "presentation-states:ensure:call" execution transaction; } } diff --git a/test/fixtures/presentation-mount/ReaderNavigation.qx b/test/fixtures/presentation-mount/ReaderNavigation.qx index e255880..1e36a11 100644 --- a/test/fixtures/presentation-mount/ReaderNavigation.qx +++ b/test/fixtures/presentation-mount/ReaderNavigation.qx @@ -1,7 +1,7 @@ import interface PresentationState; interface ReaderNavigation id "reader-navigation" revision "reader-navigation@1" requires PresentationState { queryable value page id "reader-navigation:mode" : string { - get id "reader-navigation:mode:get" execution snapshot targets [browser,server]; - set id "reader-navigation:mode:set" execution transaction targets [browser,server]; + get id "reader-navigation:mode:get" execution snapshot; + set id "reader-navigation:mode:set" execution transaction; } } diff --git a/test/fixtures/presentation-mount/StateFactory.qx b/test/fixtures/presentation-mount/StateFactory.qx index c764532..1b87bb2 100644 --- a/test/fixtures/presentation-mount/StateFactory.qx +++ b/test/fixtures/presentation-mount/StateFactory.qx @@ -1,6 +1,6 @@ import interface PresentationState; interface StateFactory id "state-factory" revision "state-factory@1" { static operation create id "state-factory:create" : record {occurrence:string;parent:optional>;} -> ref { - call id "state-factory:create:call" execution transaction targets [browser,server]; + call id "state-factory:create:call" execution transaction; } } diff --git a/test/fixtures/recurring-task/Task.qx b/test/fixtures/recurring-task/Task.qx index 95ed1f0..f5f5c4f 100644 --- a/test/fixtures/recurring-task/Task.qx +++ b/test/fixtures/recurring-task/Task.qx @@ -1,15 +1,15 @@ interface Task id "recurring:task-data" revision "recurring:task-data@1" { queryable value occurrence id "recurring:occurrence" : uint64 { - get id "recurring:occurrence:get" execution snapshot targets [browser, server]; + get id "recurring:occurrence:get" execution snapshot; } queryable value due id "recurring:due" : int64 { - get id "recurring:due:get" execution snapshot targets [browser, server]; + get id "recurring:due:get" execution snapshot; } queryable value title id "recurring:title" : string { - get id "recurring:title:get" execution snapshot targets [browser, server]; - set id "recurring:title:set" execution transaction targets [browser, server]; + get id "recurring:title:get" execution snapshot; + set id "recurring:title:set" execution transaction; } operation complete id "recurring:complete" : uint64 -> unit { - call id "recurring:complete:call" execution transaction targets [browser, server]; + call id "recurring:complete:call" execution transaction; } } diff --git a/test/fixtures/recurring-task/TaskRuntime.qx b/test/fixtures/recurring-task/TaskRuntime.qx index 85b280c..ead34a5 100644 --- a/test/fixtures/recurring-task/TaskRuntime.qx +++ b/test/fixtures/recurring-task/TaskRuntime.qx @@ -1,7 +1,8 @@ +symbol JavaScript id "target:org.quixos.execution.javascript@1"; external atom TaskObject id "recurring:task"; package TaskRuntime id "recurring:runtime" revision "recurring:runtime@1" { operation complete id "recurring:runtime:complete" : uint64 -> unit - mode call execution transaction targets [browser, server] receiver atom TaskObject requires { + mode call execution transaction targets [JavaScript, server] receiver atom TaskObject requires { state occurrence id "recurring:port:occurrence" : uint64 [read, write]; state due id "recurring:port:due" : int64 [read, write]; }; diff --git a/test/fixtures/tree/TreeData.qx b/test/fixtures/tree/TreeData.qx index 701ad50..e696935 100644 --- a/test/fixtures/tree/TreeData.qx +++ b/test/fixtures/tree/TreeData.qx @@ -1,11 +1,11 @@ interface TreeData id "tree:data" revision "tree:data@1" { operation reparent id "tree:reparent" : optional> -> unit { - call id "tree:reparent:call" execution transaction targets [browser, server]; + call id "tree:reparent:call" execution transaction; } queryable relation parent id "tree:parent" : optional-one interface TreeData { - resolve id "tree:parent:resolve" execution snapshot targets [browser, server]; + resolve id "tree:parent:resolve" execution snapshot; } queryable relation children id "tree:children" : many interface TreeData { - resolve id "tree:children:resolve" execution snapshot targets [browser, server]; + resolve id "tree:children:resolve" execution snapshot; } } diff --git a/test/fixtures/tree/TreeRuntime.qx b/test/fixtures/tree/TreeRuntime.qx index 0e2a489..81b9fb3 100644 --- a/test/fixtures/tree/TreeRuntime.qx +++ b/test/fixtures/tree/TreeRuntime.qx @@ -1,8 +1,9 @@ +symbol JavaScript id "target:org.quixos.execution.javascript@1"; external atom Node id "tree:node"; import interface TreeData; package TreeRuntime id "tree:runtime" revision "tree:runtime@1" { operation reparent id "tree:runtime:reparent" : optional> -> unit - mode call execution transaction targets [browser, server] receiver atom Node requires { + mode call execution transaction targets [JavaScript, server] receiver atom Node requires { edge parent id "tree:move:parent" : optional-one interface TreeData [resolve, connect, disconnect]; } accept using check; operation check id "tree:runtime:check" : optional> -> unit diff --git a/test/generics.test.ts b/test/generics.test.ts index 038a47f..03e3049 100644 --- a/test/generics.test.ts +++ b/test/generics.test.ts @@ -609,7 +609,7 @@ test("edge read targets honor declared interface prerequisites without inferring for (const text of [ 'interface Base id "base" revision "base@1" {}', 'import interface Base; interface Detailed id "detailed" revision "detailed@1" requires Base {}', - 'import interface Base; interface Holder id "holder" revision "holder@1" {queryable relation item id "item" : optional-one interface Base {resolve id "item:resolve" execution snapshot targets [browser,server];}}', + 'import interface Base; interface Holder id "holder" revision "holder@1" {queryable relation item id "item" : optional-one interface Base {resolve id "item:resolve" execution snapshot;}}', ]) { const parsed = compileCapabilityResourceSource(text, { source, environment: { interfaces } }); assert.ok(parsed.ok, JSON.stringify(parsed.diagnostics)); diff --git a/test/journals.test.ts b/test/journals.test.ts index ac475dc..f5151ec 100644 --- a/test/journals.test.ts +++ b/test/journals.test.ts @@ -58,12 +58,12 @@ const contract = `external atom Document id "document"; type Event = record { document: atom-ref; title: string; }; interface Stream id "stream" revision "stream@1" { operation publish id "publish" : Event -> record { publication: string; } { - call id "publish:call" execution transaction targets [server]; + call id "publish:call" execution transaction; } - queryable value head id "head" : optional { get id "head:get" execution snapshot targets [server]; } + queryable value head id "head" : optional { get id "head:get" execution snapshot; } operation readPage id "page" : record { after: optional; limit: uint32; } -> record { entries: list; next: optional; asOfHead: optional; } { - call id "page:call" execution snapshot targets [server]; + call id "page:call" execution snapshot; } }`; const assembly = `workspace Journals id "journals" revision "journals@1" commit "${source.commit}" { @@ -127,7 +127,7 @@ test("subscription storage infers its typed handler and retains configuration re `external atom Document id "document"; interface Receiver id "receiver" revision "receiver@1" { operation receive id "receive" : record { event: record { document: atom-ref; title: string; }; parameters: string; } -> unit { - call id "receive:call" execution transaction targets [server]; + call id "receive:call" execution transaction; } }`, ); @@ -139,12 +139,12 @@ import interface Receiver; type Start = variant id "start" { future id "future" : unit; retained id "retained" : unit; afterCursor id "after" : string; }; interface Subscription id "subscription" revision "subscription@1" { operation attach id "attach" : record { source: interface-ref; handler: interface-ref; parameters: string; start: Start; } -> unit { - call id "attach:call" execution transaction targets [server]; + call id "attach:call" execution transaction; } queryable value status id "status" : record { status: string; generation: uint64; cursor: uint64; failure: optional; } { - get id "status:get" execution snapshot targets [server]; + get id "status:get" execution snapshot; } - operation retire id "retire" : unit -> unit { call id "retire:call" execution transaction targets [server]; } + operation retire id "retire" : unit -> unit { call id "retire:call" execution transaction; } }`, ); const ws = assembly diff --git a/test/keyed-relationships.test.ts b/test/keyed-relationships.test.ts index 079bf67..e196bb7 100644 --- a/test/keyed-relationships.test.ts +++ b/test/keyed-relationships.test.ts @@ -12,19 +12,20 @@ const source = { repository: "https://example.test/keyed.git", commit: "a".repea const iface = compileCapabilityResourceSource( `interface Index id "index" revision "index@1" { queryable relation entries id "entries" : many object Item keyed "string" { - resolve id "resolve" execution snapshot targets [browser,server]; - connect id "connect" execution transaction targets [browser,server]; + resolve id "resolve" execution snapshot; + connect id "connect" execution transaction; } operation add id "add" : record {mapKey:string;target:ref;} -> unit { - call id "add-call" execution transaction targets [browser,server]; + call id "add-call" execution transaction; } }`, { source }, ); assert.ok(iface.ok && iface.resource.kind === "interface", JSON.stringify(iface.diagnostics)); const pkg = compileCapabilityResourceSource( - `package Runtime id "runtime" revision "runtime@1" { - operation add id "add" : record {mapKey:string;target:ref;} -> unit mode call execution transaction targets [browser,server] receiver any requires { + `symbol JavaScript id "target:org.quixos.execution.javascript@1"; +package Runtime id "runtime" revision "runtime@1" { + operation add id "add" : record {mapKey:string;target:ref;} -> unit mode call execution transaction targets [JavaScript,server] receiver any requires { edge entries id "entries" : many object Item keyed "string" [resolve,connect]; }; }`, @@ -61,7 +62,7 @@ test("generic keyed relationships and portable ports have matching checked shape const plan = compileExecutionPlan(result.workspace); assert.doesNotThrow(() => compileKernelProgram(plan)); const bindings = generatePortableTypeScriptBindings(plan.definition.bindingSchema, "runtime@1", { - target: "browser", + target: "target:org.quixos.execution.javascript@1", }); assert.match(bindings, /readonly "mapKey": string/); assert.match(bindings, /readonly "connect": \(input: \{ readonly "mapKey": string;/); diff --git a/test/lifecycle.test.ts b/test/lifecycle.test.ts index c05e4a6..6e6cd03 100644 --- a/test/lifecycle.test.ts +++ b/test/lifecycle.test.ts @@ -5,7 +5,7 @@ import { formatQx } from "../src/capability-language/source.js"; import { compileExecutionPlan, compileKernelProgram } from "../src/execution-world/index.js"; const contract = `interface Item id "item" revision "item@1" { operation remove id "remove" : unit -> unit { - call id "remove:call" execution transaction targets [server]; + call id "remove:call" execution transaction; } }`; const workspace = `workspace Lifecycle id "workspace:lifecycle" revision "workspace:lifecycle@1" commit "${"a".repeat(40)}" { @@ -45,10 +45,9 @@ test("lifecycle binding and endpoint policies survive formatting and kernel comp }); test("deletion rejects browser, snapshot, remote, class, payload and unknown primitive promises", () => { for (const [iface, ws] of [ - [contract.replace("targets [server]", "targets [browser, server]"), workspace], - [contract.replace("transaction targets", "snapshot targets"), workspace], - [contract.replace("execution transaction targets [server]", "execution remote"), workspace], - [contract.replace("execution transaction targets [server]", ""), workspace], + [contract.replace("execution transaction", "execution snapshot"), workspace], + [contract.replace("execution transaction", "execution remote"), workspace], + [contract.replace("execution transaction", ""), workspace], [contract.replace("operation remove", "static operation remove"), workspace], [contract.replace("unit -> unit", "string -> unit"), workspace], [contract.replace("unit -> unit", "unit -> string"), workspace], diff --git a/test/local-first-reader.test.ts b/test/local-first-reader.test.ts index 65beb16..5bde486 100644 --- a/test/local-first-reader.test.ts +++ b/test/local-first-reader.test.ts @@ -2,6 +2,7 @@ import assert from "node:assert/strict"; import { test } from "node:test"; import { compileQuery } from "../src/query/compile.js"; import { linkQueries } from "../src/query/link.js"; +import { compileExecutionPlan } from "../src/execution-world/plan.js"; import { loadReaderWorkspace as load, readReaderFixture as read } from "./reader-fixture.js"; test("complete reader contracts compose factories, portable selectors, CRDT edits, and bounded query scopes", async () => { const workspace = await load(); @@ -23,15 +24,19 @@ test("complete reader contracts compose factories, portable selectors, CRDT edit ); }); -test("reader composition reports the dependency that weakens a portable promise", async () => { - await assert.rejects( - load((name, text) => - name === "ReaderRuntime.qx" - ? text.replace(/(operation excerpt[\s\S]*?targets )\[browser, server\]/, "$1[server]") - : text, - ), - /does not provide execution target browser/, +test("ordinary operations allow server fallback; explicitly local projections require local code", async () => { + const serverExcerpt = await load((name, text) => + name === "ReaderRuntime.qx" + ? text.replace(/(operation excerpt[\s\S]*?targets )\[JavaScript, server\]/, "$1[server]") + : text, ); + assert.throws(() => compileExecutionPlan(serverExcerpt), /NONPORTABLE_QUERY_FIELD/); + for (const pkg of serverExcerpt.packageImports) + pkg.queries = pkg.queries?.filter((q) => q.placement?.kind !== "local"); + const fallback = compileExecutionPlan(serverExcerpt).definition.operations.find( + (op) => op.operationId === "highlight:excerpt:get", + )!; + assert.deepEqual(fallback.availableTargets, ["server"]); await assert.rejects( load((name, text) => name === "ReaderRuntime.qx" @@ -56,6 +61,6 @@ test("a field can remain server-queryable while failing local query placement", await compileQuery(admission, workspace.interfaceImports, read); await assert.rejects( compileQuery(local, workspace.interfaceImports, read), - /browser snapshot getter for HighlightData.color/, + /graph snapshot getter for HighlightData.color/, ); }); diff --git a/test/portable-bindings.test.ts b/test/portable-bindings.test.ts index e7b7ed8..688c3bd 100644 --- a/test/portable-bindings.test.ts +++ b/test/portable-bindings.test.ts @@ -22,7 +22,9 @@ test("service bindings depend on their consumed contract, not workspace or sourc test("reader portable bindings have selected facets, creation inputs and stable keyed calls", async () => { const schema = compileExecutionPlan(await loadReaderWorkspace()).definition.bindingSchema; - const source = generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", { target: "browser" }); + const source = generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", { + target: "target:org.quixos.execution.javascript@1", + }); assert.match(source, /readonly "sourceRevision.get": \(\) => Promise/); assert.match( source, @@ -32,22 +34,30 @@ test("reader portable bindings have selected facets, creation inputs and stable assert.match(source, /readonly "create":/); assert.match(source, /readonly "comments": ReadonlyArray/); assert.doesNotMatch(source, /"highlights.resolve"|context\.conform|objectId|"live"/); - assert.equal(source, generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", { target: "browser" })); + assert.equal( + source, + generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", { + target: "target:org.quixos.execution.javascript@1", + }), + ); const server = generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", { target: "server" }); - assert.equal(source.replace('target = "browser"', 'target = "server"'), server); + assert.equal(source.replace('target = "target:org.quixos.execution.javascript@1"', 'target = "server"'), server); }); test("generation rejects remote dependencies, wrong effects and unsupported shapes explicitly", async () => { const schema = compileExecutionPlan(await loadReaderWorkspace()).definition.bindingSchema; - const generate = () => generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", { target: "browser" }); + const generate = () => + generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", { + target: "target:org.quixos.execution.javascript@1", + }); const entry = schema.packages[0]!.exports.find((e) => e.displayName === "addHighlight")!; - entry.execution = { kind: "snapshot", targets: ["browser"] }; + entry.execution = { kind: "snapshot", targets: ["target:org.quixos.execution.javascript@1"] }; assert.throws(generate, /Snapshot context cannot expose mutation ports/); - entry.execution = { kind: "transaction", targets: ["browser"] }; + entry.execution = { kind: "transaction", targets: ["target:org.quixos.execution.javascript@1"] }; const iface = schema.interfaces.find((i) => i.revisionId === "interface:reader:document-data@1")!; const getter = iface.members[0]!.operations[0]!; getter.execution = { kind: "remote" }; - assert.throws(generate, /not an object call available in portable target browser/); + assert.throws(generate, /not an object call available in portable target target:org.quixos.execution.javascript@1/); getter.execution = { kind: "snapshot", targets: ["browser", "server"] }; entry.dependencyPorts[0]!.requirement = { kind: "reflection", selectors: ["active"] }; assert.throws(generate, /Only checked presentation metadata is portable/); @@ -59,7 +69,9 @@ test("closed generic portable handlers have distinct concrete codecs and no univ const schema = plan.definition.bindingSchema; const pkg = schema.packages[0]!; assert.equal(pkg.exports.length, 2); - const generated = generatePortableTypeScriptBindings(schema, pkg.revisionId, { target: "browser" }); + const generated = generatePortableTypeScriptBindings(schema, pkg.revisionId, { + target: "target:org.quixos.execution.javascript@1", + }); assert.match(generated, /readonly input: string/); assert.match(generated, /readonly input: ReadonlyArray/); for (const entry of pkg.exports) { @@ -69,7 +81,7 @@ test("closed generic portable handlers have distinct concrete codecs and no univ } assert.notEqual(pkg.exports[0]!.displayName, pkg.exports[1]!.displayName); assert.equal( - generated.replace('target = "browser"', 'target = "server"'), + generated.replace('target = "target:org.quixos.execution.javascript@1"', 'target = "server"'), generatePortableTypeScriptBindings(schema, pkg.revisionId, { target: "server" }), ); }); @@ -90,7 +102,10 @@ test("a portable subset of a mixed interface excludes remote dependencies", asyn displayName: "remote", operations: [operation], }); - const generate = () => generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", { target: "browser" }); + const generate = () => + generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", { + target: "target:org.quixos.execution.javascript@1", + }); assert.doesNotMatch(generate(), /readonly "remote.get"/); selected.operations!.push(operation.id); assert.throws(generate, /select a portable subset/); @@ -99,7 +114,7 @@ test("a portable subset of a mixed interface excludes remote dependencies", asyn test("server projection descriptors are distinct from canonical inputs and have result decoders", async () => { const { generatePortableClientBindings } = await import("../src/bindings/portable-client.js"); const plan = compileExecutionPlan(await loadReaderWorkspace()); - const source = generatePortableClientBindings(plan, { target: "browser" }); + const source = generatePortableClientBindings(plan, { target: "target:org.quixos.execution.javascript@1" }); const projections = source.slice( source.indexOf("export const serverProjections"), source.indexOf("export const results"), @@ -127,7 +142,9 @@ test("static interface ports keep unit arguments explicit for generic factory co op.inputType = { kind: "builtin", name: "unit" }; port.requirement.operations = [op.id]; delete port.requirement.receiver; - const generated = generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", { target: "browser" }); + const generated = generatePortableTypeScriptBindings(schema, "package:reader-runtime@1", { + target: "target:org.quixos.execution.javascript@1", + }); assert.match(generated, /"explicitInput": true/); assert.match(generated, /input: null/); }); diff --git a/test/portable-generic-fixture.ts b/test/portable-generic-fixture.ts index e358515..090b91c 100644 --- a/test/portable-generic-fixture.ts +++ b/test/portable-generic-fixture.ts @@ -9,17 +9,18 @@ export function portableGenericPlan() { ` interface Echo id "echo-interface" revision "echo-interface@2" { operation echo id "echo-member" : T -> T { - call id "echo-call" execution snapshot targets [browser, server]; + call id "echo-call" execution snapshot; } }`, { source }, ); assert.ok(iface.ok && iface.resource.kind === "interface", JSON.stringify(iface.diagnostics)); const pkg = compileCapabilityResourceSource( - ` + `symbol JavaScript id "target:org.quixos.execution.javascript@1"; + package Generic id "generic" revision "generic@3" { operation echo id "echo" : T -> T mode call - execution snapshot targets [browser, server] receiver any; + execution snapshot targets [JavaScript, server] receiver any; }`, { source: { ...source, commit: "b".repeat(40) } }, ); diff --git a/test/prepared-presentations.test.ts b/test/prepared-presentations.test.ts index d9afea5..5895fbb 100644 --- a/test/prepared-presentations.test.ts +++ b/test/prepared-presentations.test.ts @@ -24,8 +24,8 @@ async function fixture(replacement = "First", change?: (artifact: ReactPreparati return result.resource; }; for (const text of [ - 'interface Row id "row" revision "row@1" { queryable value title id "title" : string {get id "title:get" execution snapshot targets [browser, server];} queryable value detail id "detail" : string {get id "detail:get" execution snapshot targets [browser, server];} }', - 'import interface Row; interface Library id "library" revision "library@1" { queryable relation selected id "selected" : optional-one interface Row {resolve id "selected:get" execution snapshot targets [browser, server];} }', + 'interface Row id "row" revision "row@1" { queryable value title id "title" : string {get id "title:get" execution snapshot;} queryable value detail id "detail" : string {get id "detail:get" execution snapshot;} }', + 'import interface Row; interface Library id "library" revision "library@1" { queryable relation selected id "selected" : optional-one interface Row {resolve id "selected:get" execution snapshot;} }', 'import interface Row; interface RowRole id "row-role" revision "row-role@1" { module render id "row-render" contract "org.quixos.react.subject-only/1" subject interface Row; }', 'import interface Library; interface LibraryRole id "library-role" revision "library-role@1" { module render id "library-render" contract "org.quixos.react.subject-only/1" subject interface Library; }', ]) { diff --git a/test/query-compiler.test.ts b/test/query-compiler.test.ts index 649d15b..f4e1cb5 100644 --- a/test/query-compiler.test.ts +++ b/test/query-compiler.test.ts @@ -437,17 +437,17 @@ test("React tooling generates checked owner queries from imported closed navigat const state = iface( `import interface PresentationMount; import interface Subject; interface PresentationState id "state" revision "state@1" { - queryable value occurrence id "occurrence" : string {get id "occurrence:get" execution snapshot targets [browser,server];} - queryable relation presentationMount id "mount" : optional-one interface PresentationMount {resolve id "mount:resolve" execution snapshot targets [browser,server];} - queryable relation parent id "parent" : optional-one interface PresentationState {resolve id "parent:resolve" execution snapshot targets [browser,server];} - queryable relation source id "source" : exactly-one interface Subject {resolve id "source:resolve" execution snapshot targets [browser,server];} + queryable value occurrence id "occurrence" : string {get id "occurrence:get" execution snapshot;} + queryable relation presentationMount id "mount" : optional-one interface PresentationMount {resolve id "mount:resolve" execution snapshot;} + queryable relation parent id "parent" : optional-one interface PresentationState {resolve id "parent:resolve" execution snapshot;} + queryable relation source id "source" : exactly-one interface Subject {resolve id "source:resolve" execution snapshot;} }`, [mount, subject], ); const navigation = iface( `import interface PresentationState; interface Navigation id "navigation" revision "navigation@1" requires PresentationState { - queryable value custom id "custom" : T {get id "custom:get" execution snapshot targets [browser,server];} + queryable value custom id "custom" : T {get id "custom:get" execution snapshot;} }`, [mount, subject, state], ); diff --git a/test/query-fragments.test.ts b/test/query-fragments.test.ts index c4e38a2..6345401 100644 --- a/test/query-fragments.test.ts +++ b/test/query-fragments.test.ts @@ -6,7 +6,7 @@ import type { PackageRevision } from "../src/capability-model/types.js"; const source = { repository: "https://example.test/fragments", commit: "a".repeat(40) }; const compiled = compileCapabilityResourceSource( `interface Item id "item" revision "item@1" { - queryable value title id "title" : string {get id "title:get" execution snapshot targets [browser,server];} + queryable value title id "title" : string {get id "title:get" execution snapshot;} queryable rpc value remote id "remote" : string {get id "remote:get";} }`, { source }, diff --git a/test/query-structured.test.ts b/test/query-structured.test.ts index a53c735..e8856bd 100644 --- a/test/query-structured.test.ts +++ b/test/query-structured.test.ts @@ -7,8 +7,8 @@ import { defaultQueryBudgets, type QueryDeclaration } from "../src/query/types.j const source = { repository: "https://example.test/structured.git", commit: "a".repeat(40) }; const result = compileCapabilityResourceSource( `interface Highlight id "highlight" revision "highlight@1" { - queryable value range id "range" : record { sourceRevision:string; start:int32; end:int32; } { get id "range:get" execution snapshot targets [browser, server]; } - queryable value content id "content" : record { text:string; tags:list; metadata:optional; } { get id "content:get" execution snapshot targets [browser, server]; } + queryable value range id "range" : record { sourceRevision:string; start:int32; end:int32; } { get id "range:get" execution snapshot; } + queryable value content id "content" : record { text:string; tags:list; metadata:optional; } { get id "content:get" execution snapshot; } }`, { source }, ); diff --git a/test/reference-dependencies.test.ts b/test/reference-dependencies.test.ts index 179cde8..dd4c5c9 100644 --- a/test/reference-dependencies.test.ts +++ b/test/reference-dependencies.test.ts @@ -6,10 +6,11 @@ import { generatePortableTypeScriptBindings } from "../src/bindings/portable.js" import { formatQx } from "../src/capability-language/source.js"; const source = { repository: "https://example.test/reference.git", commit: "a".repeat(40) }; const iface = `interface Data id "data" revision "data@1" { - value content id "content" : string { get id "content:get" execution snapshot targets [server]; } - operation peek id "peek" : interface-ref -> string { call id "peek:call" execution snapshot targets [server]; } + value content id "content" : string { get id "content:get" execution snapshot; } + operation peek id "peek" : interface-ref -> string { call id "peek:call" execution snapshot; } }`; -const pkg = `external atom Item id "item"; +const pkg = `symbol JavaScript id "target:org.quixos.execution.javascript@1"; +external atom Item id "item"; import interface Data; package Runtime id "runtime" revision "runtime@1" { operation peek id "runtime:peek" : interface-ref -> string mode call execution snapshot targets [server] @@ -83,15 +84,15 @@ test("closed generic specialization preserves reference-selected interface ports }); test("portable input-selected reads use installed support beyond the public minimum", () => { - const portable = pkg.replaceAll("targets [server]", "targets [browser, server]"); + const portable = pkg.replaceAll("targets [server]", "targets [JavaScript, server]"); const optional = compile(portable); assert.ok(optional.ok, JSON.stringify(optional.diagnostics)); const plan = compileExecutionPlan(optional.workspace); assert.deepEqual(plan.definition.operations.find((op) => op.operationId === "peek:call")!.availableTargets, [ - "browser", "server", + "target:org.quixos.execution.javascript@1", ]); - const result = compile(portable, workspace, iface.replaceAll("targets [server]", "targets [browser, server]")); + const result = compile(portable, workspace, iface); assert.ok(result.ok, JSON.stringify(result.diagnostics)); }); @@ -102,8 +103,8 @@ test("input-selected transactions compose only within a compatible transaction c const txPackage = pkg.replace("execution snapshot targets [server]", "execution transaction targets [server]"); // Use an operation for the selected write; value getters themselves must remain snapshots. const contract = txInterface.replace( - 'value content id "content" : string { get id "content:get" execution transaction targets [server]; }', - 'operation update id "content" : unit -> string { call id "content:get" execution transaction targets [server]; }', + 'value content id "content" : string { get id "content:get" execution transaction; }', + 'operation update id "content" : unit -> string { call id "content:get" execution transaction; }', ); const implementation = txPackage.replace("using [content.get]", "using [update.call]"); const model = workspace.replace( diff --git a/test/scaffold-recipes.test.ts b/test/scaffold-recipes.test.ts index 7406b0c..5755afc 100644 --- a/test/scaffold-recipes.test.ts +++ b/test/scaffold-recipes.test.ts @@ -35,7 +35,7 @@ test("execution scaffolds route typed handlers by declared effect and target wit id: "export:" + name, declaration: `function ${name} id "export:${name}" : unit -> unit execution ${execution};`, }); - await add("both", "transaction targets [browser, server]"); + await add("both", "transaction targets [JavaScript, server]"); await add("serverOnly", "snapshot targets [server]"); await add("asyncWork", "remote"); const read = (file: string) => fs.readFile(path.join(root, file), "utf8"); @@ -48,8 +48,8 @@ test("execution scaffolds route typed handlers by declared effect and target wit assert.match(await read("src/impl/both.ts"), /PortableImplementation/); assert.match(await read("flake.nix"), /checkedArtifacts/); assert.match(await read("flake.nix"), /entries.browser/); - await assert.rejects(add("both", "transaction targets [browser, server]"), /unique/); - await assert.rejects(add("invalid", "snapshot targets [remote]"), /browser\/server/); + await assert.rejects(add("both", "transaction targets [JavaScript, server]"), /unique/); + await assert.rejects(add("invalid", "snapshot targets [remote]"), /TypeScript scaffold supports/); await assert.rejects(apply("function", { name: "missing", id: "export:missing" }), /explicit execution/); await assert.rejects(apply("migration", { name: "migration", id: "export:migration" }), /retired/); }); From b95cd149c6b46adc1281c895ae9b5bb5b588ab25 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Mon, 28 Sep 2026 21:05:55 -0700 Subject: [PATCH 86/91] Correct Reader producer completion and prepare only the active source Route durable completion to the initiating PresentationMount, guarded against stale navigation and unrelated fan-out. Publish Gutenberg passages directly, preserve unfinished manual drafts, and open completed documents in the main reader pane. Prepare the selected provider and explicitly opened inspector only. Consolidate Studio factory contracts so optional execution placement is determined by implementations. Support typed stateful presentation props and local-module role selection in the React build layer. Update integration, browser, portal, and authoring documentation. --- nix/checked-candidate.nix | 1 + src/react-build/declarations.ts | 17 ++++++++++++++++- test/prepared-presentations.test.ts | 13 +++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/nix/checked-candidate.nix b/nix/checked-candidate.nix index 8fc6be4..9533963 100644 --- a/nix/checked-candidate.nix +++ b/nix/checked-candidate.nix @@ -165,6 +165,7 @@ let interface = "${compile dependency}/candidate.json"; generator = protocol; typescript = runtimePackages.camino-replica-core.dependencies; + reactSdk = runtimePackages.camino-react; dependencies = buildDependencies dependency; }) ] diff --git a/src/react-build/declarations.ts b/src/react-build/declarations.ts index 72635ae..2a7c042 100644 --- a/src/react-build/declarations.ts +++ b/src/react-build/declarations.ts @@ -101,13 +101,28 @@ export function presentationDeclarations( if (!child.name || names.has(child.name) || !child.slot || !child.root) throw Error(`${name}: child requires a unique name, slot and root`); names.add(child.name); + // A local module identifies a closed role, including its generic arguments. + // This avoids inventing an import alias for a generic application solely + // to select that role in the React preparation manifest. + let role: ReactChildDeclaration["role"]; + if (child.role) { + const authored = object(child.role, `${name}.${child.name} role`); + if (typeof authored.module === "string") { + const target = pkg.modules?.find((entry) => entry.displayName === authored.module); + if (!target || Object.keys(authored).length !== 1) + throw Error(`${name}.${child.name}: expected a local module role`); + role = { interface: target.interfaceRevisionId, member: target.memberId }; + } else { + role = { ...child.role, interface: imported(child.role.interface) }; + } + } if (child.each && child.with) throw Error(`${name}.${child.name}: cannot combine each and with`); if (child.each && (!Number.isSafeInteger(child.each.limit) || child.each.limit < 1)) throw Error(`${name}.${child.name}: finite positive collection limit required`); return { ...child, subject: imported(child.subject), - ...(child.role ? { role: { ...child.role, interface: imported(child.role.interface) } } : {}), + ...(role ? { role } : {}), }; }); artifact.modules.push({ module: module.id, composition, children: parsed }); diff --git a/test/prepared-presentations.test.ts b/test/prepared-presentations.test.ts index 5895fbb..d456f7a 100644 --- a/test/prepared-presentations.test.ts +++ b/test/prepared-presentations.test.ts @@ -121,6 +121,19 @@ async function fixture(replacement = "First", change?: (artifact: ReactPreparati return { workspace: workspace.workspace, pkg: workspace.workspace.packageImports[0]!, authored, interfaces }; } +test("a local module names its checked role without a synthetic import alias", async () => { + const { pkg, authored, interfaces } = await fixture(); + const source = structuredClone(authored) as any; + source.modules.LibraryCard.children[0].role = { module: "First" }; + const declared = presentationDeclarations(JSON.stringify(source), pkg, [...interfaces.values()]); + assert.deepEqual(declared.artifact.modules[0]!.children[0]!.role, { interface: "row-role@1", member: "row-render" }); + source.modules.LibraryCard.children[0].role = { module: "Missing" }; + assert.throws( + () => presentationDeclarations(JSON.stringify(source), pkg, [...interfaces.values()]), + /local module role/, + ); +}); + test("workspace expands distinct providers' private inputs without parent field declarations", async () => { const { pkg } = await fixture(); const parent = pkg.checkedQueries!.find((query) => query.declaration.id === "react:input:library-card:data")!; From e8d19d2bb7ce00acd75e9a7e6a4570ad81c4dcbc Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Wed, 30 Sep 2026 22:03:17 -0700 Subject: [PATCH 87/91] Build Camino packages from explicit contract inputs Project source-free capability contracts and keep exact source provenance in package assembly. Reuse compiled groups across unrelated graph and dependency implementation edits. Keep React public inputs separate from workspace query lowering and retain explicit type-companion dependencies. Allow independent execution-package checks, scope resource compilation to declared dependencies, and memoize source closure traversal. Document generic-specialization limits and measured Reader rebuild behavior. Verified protocol, artifact, package, React, and managed activation checks; retained-Git independent/workspace artifact equality and incompatible type dependency rejection; nix fmt -- --check and lint. One-off Reader measurements recompiled 1 of 13 groups for a child edit and 0 for a workspace QX default edit. --- flake.nix | 3 + nix/check-package.mjs | 41 +++ nix/checked-artifacts.nix | 30 ++- nix/checked-candidate.nix | 236 +++++++++++------- nix/package-context.mjs | 15 ++ nix/package-context.nix | 30 +++ src/bindings/index.ts | 8 + src/bindings/portable.ts | 10 +- src/capability-language/execution-scaffold.ts | 7 +- src/capability-language/structural-plan.ts | 4 +- src/capability-language/workspace-cli.ts | 15 +- src/execution-world/artifacts.ts | 58 +++-- src/execution-world/build-contract.ts | 224 +++++++++++++++++ src/execution-world/client-contracts.ts | 37 ++- src/execution-world/index.ts | 2 + src/execution-world/plan.ts | 63 +---- src/execution-world/receipts.ts | 65 +++-- src/react-build/declarations.ts | 4 + src/react-build/expansion.ts | 2 + src/react-build/package-queries.ts | 4 + src/react-build/workspace.ts | 1 + test/build-contract.test.ts | 78 ++++++ test/emit-managed.ts | 16 ++ 23 files changed, 726 insertions(+), 227 deletions(-) create mode 100644 nix/check-package.mjs create mode 100644 nix/package-context.mjs create mode 100644 nix/package-context.nix create mode 100644 src/execution-world/build-contract.ts create mode 100644 test/build-contract.test.ts diff --git a/flake.nix b/flake.nix index efac4b1..54daab3 100644 --- a/flake.nix +++ b/flake.nix @@ -80,6 +80,9 @@ mkdir -p "$out" install -Dm644 nix/checked-package.nix "$out/share/checked-package.nix" install -Dm644 nix/checked-artifacts.nix "$out/share/checked-artifacts.nix" + install -Dm644 nix/package-context.nix "$out/share/package-context.nix" + install -Dm644 nix/package-context.mjs "$out/share/package-context.mjs" + install -Dm644 nix/check-package.mjs "$out/share/check-package.mjs" install -Dm644 nix/check-execution.mjs "$out/share/check-execution.mjs" substitute nix/checked-candidate.nix "$out/share/checked-candidate.nix" \ --replace-fail '@nixpkgs@' '${pkgs.path}' diff --git a/nix/check-package.mjs b/nix/check-package.mjs new file mode 100644 index 0000000..efeb326 --- /dev/null +++ b/nix/check-package.mjs @@ -0,0 +1,41 @@ +// An independent package check witnesses its contract and bytes, without +// inventing a workspace or granting installation/activation authority. +import { readFile, writeFile } from "node:fs/promises"; +import { createHash } from "node:crypto"; +import { pathToFileURL } from "node:url"; +import { join } from "node:path"; +const [compilerPath, schemaPath, checksPath, output] = process.argv.slice(2); +const compiler = await import(pathToFileURL(compilerPath)); +const schema = JSON.parse(await readFile(schemaPath, "utf8")); +const checks = JSON.parse(await readFile(checksPath, "utf8")); +const generator = createHash("sha256") + .update(await readFile(compilerPath)) + .digest("hex"); +const evidence = []; +for (const check of checks) { + const pkg = schema.packages.find((pkg) => pkg.revisionId === check.packageRevisionId); + if (!pkg) throw Error("Unknown checked package"); + const contract = compiler.packageBuildContract(schema, pkg.revisionId); + const sourceDigest = compiler.hexDigest({ revision: pkg.revisionId, source: pkg.source }); + const manifest = compiler.parsePackageArtifacts( + JSON.parse(await readFile(join(check.artifactPath, "share/quixos/package-artifacts.json"), "utf8")), + ); + compiler.checkPackageCoverage( + { ...contract.definition.package, bindingDigest: contract.digest, sourceDigest }, + manifest, + ); + const receipt = JSON.parse(await readFile(join(check.artifactPath, "share/quixos/build-receipt.json"), "utf8")); + const expected = compiler.expectedPackageReceipt(contract, manifest, sourceDigest, generator); + if (compiler.hexDigest(receipt) !== compiler.hexDigest(expected.receipt)) + throw Error("Invalid package build receipt"); + const read = await compiler.artifactFileReader({ [pkg.revisionId]: check.artifactPath }); + await compiler.checkArtifactFiles(manifest, read); + for (const [file, bytes] of expected.sources) + if (!Buffer.from(bytes).equals(await read(pkg.revisionId, file, bytes.length))) + throw Error("Modified generated binding " + file); + evidence.push({ ...check, contract: contract.digest, sourceDigest, receipt }); +} +await writeFile( + join(output, "package-checks.json"), + JSON.stringify({ codec: "camino-package-checks-v1", generator, packages: evidence }), +); diff --git a/nix/checked-artifacts.nix b/nix/checked-artifacts.nix index 0505663..cc7d7c1 100644 --- a/nix/checked-artifacts.nix +++ b/nix/checked-artifacts.nix @@ -24,18 +24,26 @@ let package = builtins.getFlake ( "path:" + builtins.unsafeDiscardStringContext (toString packageSource) ); + pkgs = import package.inputs.nixpkgs { inherit system; }; + buildContext = import ./package-context.nix { + inherit pkgs packageRevisionId; + protocol = builtins.storePath generator; + plan = builtins.path { + path = /. + plan; + name = "candidate-execution-plan.json"; + }; + }; checked = package.quixosPackages.${system}.checkedArtifacts or (throw "Package ${packageRevisionId} lacks checkedArtifacts for the portable execution world."); in -checked { - inherit packageRevisionId; - plan = builtins.path { - path = /. + plan; - name = "candidate-execution-plan.json"; - }; - generator = builtins.storePath generator; - core = builtins.storePath core; - sharedRuntime = builtins.storePath sharedRuntime; - typescript = builtins.storePath typescript; -} +checked ( + buildContext + // { + inherit packageRevisionId; + generator = builtins.storePath generator; + core = builtins.storePath core; + sharedRuntime = builtins.storePath sharedRuntime; + typescript = builtins.storePath typescript; + } +) diff --git a/nix/checked-candidate.nix b/nix/checked-candidate.nix index 9533963..2cebdd7 100644 --- a/nix/checked-candidate.nix +++ b/nix/checked-candidate.nix @@ -20,26 +20,45 @@ let ref = "refs/tags/quixos-reachability/${source.commit}"; shallow = true; }; - load = - ancestors: source: - if builtins.elem (sourceKey source) ancestors then - throw "Source dependency cycle at ${sourceKey source}" - else if builtins.length ancestors >= 100 then - throw "Source dependency depth exceeds 100" - else - let - directory = fetch source; - lockFile = pkgs.runCommand "qx-source-lock.json" { } '' - ${protocol}/bin/quixos-lock-check ${directory}/quixos.lock > "$out" - ''; - lock = builtins.fromJSON (builtins.readFile lockFile); + # Memoize by exact source identity. A diamond-shaped dependency graph must + # not recursively evaluate every path through the same imported subtree. + loadSource = + source: + let + directory = fetch source; + lockFile = pkgs.runCommand "qx-source-lock.json" { } '' + ${protocol}/bin/quixos-lock-check ${directory}/quixos.lock > "$out" + ''; + lock = builtins.fromJSON (builtins.readFile lockFile); + in + source // { inherit directory lock; }; + sourceEntry = source: { + key = sourceKey source; + value = loadSource source; + }; + sourceGraph = builtins.genericClosure { + startSet = [ (sourceEntry { inherit kind repository commit; }) ]; + operator = + entry: + map ( + resource: sourceEntry (resource.source // { inherit (resource) kind; }) + ) entry.value.lock.resources; + }; + nodeTable = builtins.listToAttrs ( + map (entry: { + name = entry.key; + value = entry.value // { children = map ( - entry: - load (ancestors ++ [ (sourceKey source) ]) (entry.source // { inherit (entry) kind binding; }) - ) lock.resources; - in - source // { inherit directory children lock; }; - root = load [ ] { inherit kind repository commit; }; + resource: + nodeTable.${sourceKey (resource.source // { inherit (resource) kind; })} + // { + inherit (resource) binding; + } + ) entry.value.lock.resources; + }; + }) sourceGraph + ); + root = nodeTable.${sourceKey { inherit kind repository commit; }}; configuration = if builtins.pathExists (root.directory + "/quixos.check.json") then builtins.fromJSON (builtins.readFile (root.directory + "/quixos.check.json")) @@ -50,54 +69,61 @@ let "git+${root.lock.quixos.repository}?rev=${root.lock.quixos.commit}&ref=refs/tags/quixos-reachability/${root.lock.quixos.commit}" ); runtimePackages = runtime.packages.${system}; - flatten = node: [ node ] ++ pkgs.lib.concatMap flatten node.children; - capabilityFlatten = - node: - if node.kind == "build" then - [ ] - else - [ node ] ++ pkgs.lib.concatMap capabilityFlatten node.children; - nodes = builtins.attrValues ( - builtins.listToAttrs ( - map (node: { - name = sourceKey node; - value = node; - }) (flatten root) - ) - ); + resourceClosure = + includeBuild: node: + map (entry: entry.value) ( + builtins.genericClosure { + startSet = pkgs.lib.optional (includeBuild || node.kind != "build") { + key = sourceKey node; + value = node; + }; + operator = + entry: + map (child: { + key = sourceKey child; + value = child; + }) (builtins.filter (child: includeBuild || child.kind != "build") entry.value.children); + } + ); + capabilityFlatten = resourceClosure false; # Frontends are an explicit build choice. The capability assembler itself # neither discovers React contracts nor loads executable package code. - queryFrontends = pkgs.lib.unique ( - pkgs.lib.concatMap ( - node: - let - config = node.directory + "/quixos.check.json"; - in - if builtins.pathExists config then - (builtins.fromJSON (builtins.readFile config)).queryFrontends or [ ] - else - [ ] - ) (capabilityFlatten root) - ); + queryFrontends = + node: + pkgs.lib.unique ( + pkgs.lib.concatMap ( + node: + let + config = node.directory + "/quixos.check.json"; + in + if builtins.pathExists config then + (builtins.fromJSON (builtins.readFile config)).queryFrontends or [ ] + else + [ ] + ) (capabilityFlatten node) + ); queryGeneratorFlags = - if queryFrontends == [ ] then + node: + if queryFrontends node == [ ] then "" - else if queryFrontends == [ "react" ] then + else if queryFrontends node == [ "react" ] then "--query-generator ${protocol}/libexec/quixos-protocol/react-query-generator.mjs" else - throw "Unsupported query frontend selection: ${builtins.toJSON queryFrontends}"; - snapshots = pkgs.writeText "qx-nix-source-graph.json" ( - builtins.toJSON { - resources = map (node: { - inherit (node) - kind - repository - commit - directory - ; - }) (builtins.filter (node: node.kind != "workspace") nodes); - } - ); + throw "Unsupported query frontend selection: ${builtins.toJSON (queryFrontends node)}"; + snapshots = + node: + pkgs.writeText "qx-nix-source-graph.json" ( + builtins.toJSON { + resources = map (node: { + inherit (node) + kind + repository + commit + directory + ; + }) (builtins.filter (entry: entry.kind != "workspace") (resourceClosure true node)); + } + ); compile = node: pkgs.runCommand "qx-${node.kind}-contract" { } '' @@ -106,19 +132,22 @@ let if node.kind == "workspace" then '' ${protocol}/bin/quixos-workspace-compile --root ${node.directory} \ - ${queryGeneratorFlags} \ + ${queryGeneratorFlags node} \ --source-root-commit ${pkgs.lib.escapeShellArg node.commit} \ - --checkout-root "$TMPDIR/checkouts" --snapshot-map ${snapshots} \ + --checkout-root "$TMPDIR/checkouts" --snapshot-map ${snapshots node} \ --graph-out "$out/graph.json" --schemas-out "$out/package-schemas.json" \ - ${pkgs.lib.optionalString execution ''--execution-plan-out "$out/execution-plan.json"''} > "$out/candidate.json" + ${ + pkgs.lib.optionalString (execution && kind == "workspace") + ''--execution-plan-out "$out/execution-plan.json" --build-contexts-out "$out/build-contexts.json"'' + } > "$out/candidate.json" '' else '' ${protocol}/bin/quixos-resource-compile --root ${node.directory} \ - ${queryGeneratorFlags} \ + ${queryGeneratorFlags node} \ --kind ${node.kind} --repository ${pkgs.lib.escapeShellArg node.repository} \ --commit ${pkgs.lib.escapeShellArg node.commit} \ - --checkout-root "$TMPDIR/checkouts" --snapshot-map ${snapshots} --snapshot-only true \ + --checkout-root "$TMPDIR/checkouts" --snapshot-map ${snapshots node} --snapshot-only true \ --graph-out "$out/graph.json" --schema-out "$out/bindings.json" > "$out/candidate.json" '' } @@ -137,7 +166,7 @@ let }) (builtins.filter (dependency: dependency.kind == "build") node.children) ); reactContracts = - node: + node: moduleInterfaces: let interfaces = builtins.attrValues ( builtins.listToAttrs ( @@ -159,6 +188,17 @@ let in if build == null then [ ] + else if + !(builtins.any ( + entry: + let + resource = builtins.fromJSON (builtins.readFile "${compile dependency}/candidate.json"); + in + entry.revisionId == resource.revision.revisionId + || (entry.definitionId or null) == resource.revision.revisionId + ) moduleInterfaces) + then + [ ] else [ (build { @@ -174,15 +214,26 @@ let node: let compiled = compile node; - candidate = builtins.fromJSON (builtins.readFile "${compiled}/candidate.json"); - componentEntries = - if execution then - (pkgs.lib.findFirst ( - entry: entry.revision == candidate.revision.revisionId - ) { } (builtins.fromJSON (builtins.readFile "${contract}/execution-plan.json")).definition.packages) - .components or [ ] + candidate = + if execution && kind == "workspace" then + { + revision = + pkgs.lib.findFirst + (pkg: pkg.source.repository == node.repository && pkg.source.commit == node.commit) + (throw "Source package missing from workspace compilation: ${node.repository}") + (builtins.fromJSON (builtins.readFile "${contract}/execution-plan.json")) + .definition.bindingSchema.packages; + } else - [ ]; + builtins.fromJSON (builtins.readFile "${compiled}/candidate.json"); + buildContext = import ./package-context.nix { + inherit pkgs protocol; + contexts = if kind == "workspace" then "${contract}/build-contexts.json" else null; + plan = "${compiled}/bindings.json"; + packageRevisionId = candidate.revision.revisionId; + }; + buildContract = builtins.fromJSON (builtins.readFile buildContext.buildContract); + componentEntries = if execution then buildContract.definition.package.components or [ ] else [ ]; package = builtins.getFlake ( "git+${node.repository}?rev=${node.commit}&ref=refs/tags/quixos-reachability/${node.commit}" ); @@ -195,8 +246,8 @@ let or (throw "Package ${node.repository} lacks checkedServer; use the supported package scaffold."); artifact = checked ( if execution then - { - plan = "${contract}/execution-plan.json"; + buildContext + // { generator = protocol; core = runtimePackages.camino-replica-core; sharedRuntime = runtimePackages.camino-shared-runtime; @@ -208,7 +259,7 @@ let react = { sdk = runtimePackages.camino-react; runtime = runtimePackages.camino-react-runtime; - contracts = reactContracts node; + contracts = reactContracts node buildContract.definition.moduleInterfaces; }; } else @@ -236,16 +287,18 @@ let [ ] else map checkPackage ( - builtins.filter (node: node.kind == "package") ( - builtins.attrValues ( - builtins.listToAttrs ( - map (node: { - name = sourceKey node; - value = node; - }) (capabilityFlatten root) + builtins.filter + (node: node.kind == "package" && (kind == "workspace" || sourceKey node == sourceKey root)) + ( + builtins.attrValues ( + builtins.listToAttrs ( + map (node: { + name = sourceKey node; + value = node; + }) (capabilityFlatten root) + ) ) ) - ) ); manifest = pkgs.writeText "qx-candidate-checks.json" (builtins.toJSON checks); bindingOptions = pkgs.writeText "qx-typescript-options.json" ( @@ -254,8 +307,6 @@ let ) ); in -assert pkgs.lib.assertMsg (!execution || kind == "workspace") - "Execution packages must be checked in their complete workspace; run qx-workspace check from the workspace root."; pkgs.runCommand (if contractOnly then "qx-contract" else "qx-checked-candidate") { } '' mkdir -p "$out" cp ${ @@ -264,7 +315,7 @@ pkgs.runCommand (if contractOnly then "qx-contract" else "qx-checked-candidate") cp ${contract}/candidate.json "$out/candidate.json" cp ${contract}/graph.json "$out/graph.json" cp ${manifest} "$out/checks.json" - ${pkgs.lib.optionalString execution '' + ${pkgs.lib.optionalString (execution && kind == "workspace") '' ${ if builtins.pathExists "${root.directory}/quixos.entry.json" then '' @@ -291,7 +342,12 @@ pkgs.runCommand (if contractOnly then "qx-contract" else "qx-checked-candidate") ${pkgs.lib.optionalString ( kind != "workspace" ) ''cp ${contract}/bindings.json "$out/bindings.json"''} - ${pkgs.lib.optionalString (kind == "package") '' + ${pkgs.lib.optionalString (execution && kind == "package" && !contractOnly) '' + ${pkgs.nodejs_24}/bin/node ${./check-package.mjs} \ + ${protocol}/libexec/quixos-protocol/execution-world.mjs ${contract}/bindings.json \ + "$out/checks.json" "$out" + ''} + ${pkgs.lib.optionalString (kind == "package" && !execution) '' ${protocol}/bin/quixos-codegen-ts ${contract}/bindings.json \ ${pkgs.lib.escapeShellArg (builtins.fromJSON (builtins.readFile "${contract}/candidate.json")).revision.revisionId} \ "$out/bindings.ts" ${bindingOptions} diff --git a/nix/package-context.mjs b/nix/package-context.mjs new file mode 100644 index 0000000..20ba028 --- /dev/null +++ b/nix/package-context.mjs @@ -0,0 +1,15 @@ +import fs from "node:fs/promises"; +import { pathToFileURL } from "node:url"; +const compiler = await import(pathToFileURL(process.argv[2])); +const input = JSON.parse(await fs.readFile(process.argv[3], "utf8")); +const revision = process.argv[4]; +const schema = input.definition?.bindingSchema ?? input; +if (input.definition && compiler.hexDigest(input.definition) !== input.digest) throw Error("Invalid execution plan"); +const pkg = schema.packages.find((entry) => entry.revisionId === revision); +if (!pkg) throw Error("Unknown build package " + revision); +process.stdout.write( + JSON.stringify({ + contract: compiler.packageBuildContract(schema, revision), + sourceDigest: compiler.hexDigest({ revision, source: pkg.source }), + }), +); diff --git a/nix/package-context.nix b/nix/package-context.nix new file mode 100644 index 0000000..7317379 --- /dev/null +++ b/nix/package-context.nix @@ -0,0 +1,30 @@ +# Workspace composition may reevaluate this projection after any graph edit. +# Only the canonical, source-free value becomes a package compilation input. +{ + pkgs, + protocol, + plan ? null, + contexts ? null, + packageRevisionId, +}: +let + projected = pkgs.runCommand "camino-package-context.json" { } '' + ${pkgs.nodejs_24}/bin/node ${./package-context.mjs} \ + ${protocol}/libexec/quixos-protocol/execution-world.mjs ${plan} \ + ${pkgs.lib.escapeShellArg packageRevisionId} > "$out" + ''; + context = + if contexts == null then + builtins.fromJSON (builtins.readFile projected) + else + (builtins.fromJSON (builtins.readFile contexts)).${packageRevisionId}; +in +{ + # This is typed semantic data (nominal IDs, types and generated source), never + # Nix artifact paths. Remove the projection derivation's string context, not + # any code/toolchain dependency. Those are separate explicit helper arguments. + buildContract = builtins.toFile "camino-package-contract.json" ( + builtins.unsafeDiscardStringContext (builtins.toJSON context.contract) + ); + sourceDigest = builtins.unsafeDiscardStringContext context.sourceDigest; +} diff --git a/src/bindings/index.ts b/src/bindings/index.ts index e65b3c0..23b4a6d 100644 --- a/src/bindings/index.ts +++ b/src/bindings/index.ts @@ -9,6 +9,14 @@ import type { CompiledCapabilityResourceRepository } from "../capability-languag import { genericImplementationType } from "./generics.js"; import { capabilityId } from "../capability-model/types.js"; +/** Source-free package compilation inputs. Nominal references do not import + * implementations or concrete workspace conformances. */ +export type BindingContractSchema = { + format: "quixos-bindings"; + version: 1; + interfaces: Omit[]; + packages: Pick[]; +}; /** Portable generator input. New backends consume this instead of the parser or TS runtime. */ export type BindingSchema = { format: "quixos-bindings"; diff --git a/src/bindings/portable.ts b/src/bindings/portable.ts index 7efc839..fbaff4c 100644 --- a/src/bindings/portable.ts +++ b/src/bindings/portable.ts @@ -1,5 +1,5 @@ import { portableReflectionType } from "../execution-world/reflection.js"; -import type { BindingSchema } from "./index.js"; +import type { BindingContractSchema } from "./index.js"; import type { ValueType, ObjectExpectation, @@ -121,7 +121,7 @@ interface Method { explicitInput?: boolean; } function methods( - schema: BindingSchema, + schema: BindingContractSchema, entry: PackageExport, port: DependencyPort, target: string, @@ -247,21 +247,21 @@ export interface PortableBindingOptions { } /** Generate one target's handlers. The same source signatures are used in browser/server builds. */ export function generatePortableTypeScriptBindings( - schema: BindingSchema, + schema: BindingContractSchema, revision: string, options: PortableBindingOptions, ): string { return generateBindings(schema, revision, options, false); } export function generateRemoteTypeScriptBindings( - schema: BindingSchema, + schema: BindingContractSchema, revision: string, options: { runtimeModule?: string } = {}, ): string { return generateBindings(schema, revision, { ...options, target: "server" }, true); } function generateBindings( - schema: BindingSchema, + schema: BindingContractSchema, revision: string, options: PortableBindingOptions, remote: boolean, diff --git a/src/capability-language/execution-scaffold.ts b/src/capability-language/execution-scaffold.ts index 45dd196..e690ac8 100644 --- a/src/capability-language/execution-scaffold.ts +++ b/src/capability-language/execution-scaffold.ts @@ -80,9 +80,8 @@ export async function executionScaffold( devShells.default = (import (helpers + "/quixos-package-helpers.nix")).mkCaminoYarnShell { inherit pkgs; }; quixosPackages.checkedArtifacts = context: let - plan = builtins.fromJSON (builtins.readFile context.plan); - package = pkgs.lib.findFirst (entry: entry.revision == context.packageRevisionId) - (throw "Package missing from checked plan") plan.definition.packages; + contract = builtins.fromJSON (builtins.readFile context.buildContract); + package = contract.definition.package; portable = builtins.filter (entry: entry.execution.kind != "remote") package.exports; remote = builtins.filter (entry: entry.execution.kind == "remote") package.exports; modules = import ./components.nix; @@ -107,7 +106,7 @@ in camino.assembleCaminoPackage { ); create( "README.md", - `# ${spec.name}\n\nThis execution package exports checked browser/server modules and a process service.\nUse scaffold function with an explicit execution contract to add a typed handler.\nSnapshot/transaction targets choose browser.ts and/or server.ts; remote handlers\nuse remote.ts. Shared helpers are ordinary imports. Generated bindings are build\noutputs, not authored source. The coordinator supplies the checked workspace plan\nand runtime dependencies to checkedArtifacts.\n\nRun qx-workspace check from the workspace root to compile exact source and build\nchecked artifacts. Activate the resulting report separately through the workspace\nhost. A source-only structural check is not runtime qualification.\n`, + `# ${spec.name}\n\nThis execution package exports checked browser/server modules and a process service.\nUse scaffold function with an explicit execution contract to add a typed handler.\nSnapshot/transaction targets choose browser.ts and/or server.ts; remote handlers\nuse remote.ts. Shared helpers are ordinary imports. Generated bindings are build\noutputs, not authored source. The Nix composition supplies the canonical package contract\nand explicit runtime dependencies to checkedArtifacts.\n\nRun qx-workspace check from this package to build it independently, or from a\nworkspace to also check installed bindings. Activate the resulting report separately through the workspace\nhost. A source-only structural check is not runtime qualification.\n`, ); } else if (command === "function") { if (!spec.declaration) diff --git a/src/capability-language/structural-plan.ts b/src/capability-language/structural-plan.ts index fe5cfae..6b03c5f 100644 --- a/src/capability-language/structural-plan.ts +++ b/src/capability-language/structural-plan.ts @@ -168,8 +168,8 @@ export const planStructure = async (rootPath: string, request: StructuralRequest }); if (compiled.resource.kind === "package") { const configuration = JSON.parse(await fs.readFile(path.join(resourceRoot, "quixos.check.json"), "utf8")); - // Execution bindings require the complete workspace plan and are owned - // by checkedArtifacts, not a package-only structural preview. + // Execution bindings are immutable build outputs owned by checkedArtifacts, + // not source edits produced by a structural preview. const artifacts = configuration.backend === "execution" ? [] diff --git a/src/capability-language/workspace-cli.ts b/src/capability-language/workspace-cli.ts index ffe57e4..18b2ec5 100644 --- a/src/capability-language/workspace-cli.ts +++ b/src/capability-language/workspace-cli.ts @@ -5,7 +5,7 @@ import process from "node:process"; import { compileWorkspaceRepository } from "./assembly.js"; import { createGitCapabilityResolver } from "./git-resolver.js"; import { loadQueryGenerator } from "./query-generator.js"; -import { compileExecutionPlan } from "../execution-world/index.js"; +import { compileExecutionPlan, packageBuildContexts } from "../execution-world/index.js"; import { bindingSchema, specializeBindingSchema } from "../bindings/index.js"; import { planEvolution, @@ -17,7 +17,7 @@ import { const usage = `usage: quixos-workspace-compile --root DIRECTORY --checkout-root DIRECTORY [--snapshot-map PATH] [--graph-out PATH] [--workspace-id ID] [--workspace-revision-id ID] [--source-root-commit GIT_REV] [--baseline PLAN_JSON] [--evolution-out PATH] - [--reviews REVIEW_JSON] [--schemas-out PATH] [--execution-plan-out PATH] + [--reviews REVIEW_JSON] [--schemas-out PATH] [--execution-plan-out PATH] [--build-contexts-out PATH] [--query-generator BUILD_MODULE_PATH] Resolves a workspace's recursive resource-lock graph, clones every exact @@ -41,6 +41,7 @@ const parseArgs = (args: string[]) => { graphOut: values.get("--graph-out"), schemasOut: values.get("--schemas-out"), executionPlanOut: values.get("--execution-plan-out"), + buildContextsOut: values.get("--build-contexts-out"), snapshotMap: values.get("--snapshot-map"), workspaceId: values.get("--workspace-id"), workspaceRevisionId: values.get("--workspace-revision-id"), @@ -108,11 +109,11 @@ const main = async () => { ); } const candidate = { ...assembled.workspace, executionContracts: runtimeContracts(assembled.workspace) }; - if (options.executionPlanOut) { - await writeFile( - options.executionPlanOut, - `${JSON.stringify(compileExecutionPlan(assembled.workspace), null, 2)}\n`, - ); + if (options.executionPlanOut || options.buildContextsOut) { + const plan = compileExecutionPlan(assembled.workspace); + if (options.executionPlanOut) await writeFile(options.executionPlanOut, `${JSON.stringify(plan, null, 2)}\n`); + if (options.buildContextsOut) + await writeFile(options.buildContextsOut, JSON.stringify(packageBuildContexts(plan.definition.bindingSchema))); } if (options.schemasOut) { const schemas: Record = {}; diff --git a/src/execution-world/artifacts.ts b/src/execution-world/artifacts.ts index 9a99f21..e5fbcea 100644 --- a/src/execution-world/artifacts.ts +++ b/src/execution-world/artifacts.ts @@ -20,15 +20,19 @@ export interface ArtifactImplementation { files: ArtifactFile[]; contentDigest: string; } -export interface PackageArtifacts { +export interface ArtifactGroup { schemaVersion: 1; packageRevisionId: string; bindingDigest: string; - sourceDigest: string; versions: ExecutionPlan["definition"]["versions"]; implementations: ArtifactImplementation[]; components?: ComponentArtifact[]; } +/** Installation evidence binds a reusable group to the selected exact source. + * Compilation receipts never claim that a cache hit was built at a new pin. */ +export interface PackageArtifacts extends ArtifactGroup { + sourceDigest: string; +} export const componentSharedModules = [ "react", "react-dom", @@ -199,11 +203,11 @@ function parseComponent(value: unknown, index: number): ComponentArtifact { if (componentArtifactDigest(body) !== contentDigest) fail(path, "Component metadata digest mismatch"); return component; } -export function parsePackageArtifacts(value: unknown): PackageArtifacts { +export function parseArtifactGroup(value: unknown): ArtifactGroup { const record = object(value, "manifest"); keys( record, - ["schemaVersion", "packageRevisionId", "bindingDigest", "sourceDigest", "versions", "implementations"], + ["schemaVersion", "packageRevisionId", "bindingDigest", "versions", "implementations"], ["components"], "manifest", ); @@ -266,13 +270,19 @@ export function parsePackageArtifacts(value: unknown): PackageArtifacts { schemaVersion: 1, packageRevisionId: text(record.packageRevisionId, "packageRevisionId"), bindingDigest: digest(record.bindingDigest, "bindingDigest"), - sourceDigest: digest(record.sourceDigest, "sourceDigest"), versions: versions as unknown as PackageArtifacts["versions"], implementations, ...(components ? { components } : {}), }; } -function checkCoverage(expected: PlanPackage, manifest: PackageArtifacts): void { +export function parsePackageArtifacts(value: unknown): PackageArtifacts { + const { sourceDigest, ...group } = object(value, "manifest"); + return { ...parseArtifactGroup(group), sourceDigest: digest(sourceDigest, "sourceDigest") }; +} +export function checkPackageCoverage( + expected: Pick, + manifest: PackageArtifacts, +): void { for (const module of expected.modules ?? []) if (!expected.components?.some((component) => component.id === module.id)) fail(module.id, `No artifact consumer for module contract ${module.contract} and its subject`); @@ -315,6 +325,21 @@ function checkCoverage(expected: PlanPackage, manifest: PackageArtifacts): void } } export type ArtifactReader = (packageRevisionId: string, path: string, maxBytes: number) => Promise; +/** Shared by standalone package checks and complete world installation. */ +export async function checkArtifactFiles(manifest: ArtifactGroup, read: ArtifactReader): Promise { + const files = new Map(); + for (const artifact of [...manifest.implementations, ...(manifest.components ?? [])]) + for (const file of artifact.files) { + const existing = files.get(file.path); + if (existing && canonicalJson(existing) !== canonicalJson(file)) fail(file.path, "Conflicting file descriptors"); + files.set(file.path, file); + } + for (const file of files.values()) { + const bytes = await read(manifest.packageRevisionId, file.path, file.bytes); + if (bytes.byteLength !== file.bytes || createHash("sha256").update(bytes).digest("hex") !== file.digest) + fail(file.path, "Artifact bytes do not match the checked content digest"); + } +} /** Caller supplies a reader confined to the resolved immutable package output, including symlink checks. */ export async function checkExecutionWorld( plan: ExecutionPlan, @@ -335,17 +360,11 @@ export async function checkExecutionWorld( const manifest = manifests.find((m) => m.packageRevisionId === expected.revision) ?? fail(expected.revision, "Missing package artifact"); - checkCoverage(expected, manifest); + checkPackageCoverage(expected, manifest); if (canonicalJson(manifest.versions) !== canonicalJson(plan.definition.versions)) fail(expected.revision, "Incompatible runtime codecs"); - const files = new Map(); + await checkArtifactFiles(manifest, read); for (const implementation of manifest.implementations) { - for (const file of implementation.files) { - const existing = files.get(file.path); - if (existing && canonicalJson(existing) !== canonicalJson(file)) - fail(file.path, "Conflicting file descriptors"); - files.set(file.path, file); - } artifacts.push({ binding: JSON.stringify([expected.revision, implementation.id]), target: implementation.target, @@ -353,23 +372,12 @@ export async function checkExecutionWorld( }); } for (const component of manifest.components ?? []) { - for (const file of component.files) { - const existing = files.get(file.path); - if (existing && canonicalJson(existing) !== canonicalJson(file)) - fail(file.path, "Conflicting file descriptors"); - files.set(file.path, file); - } artifacts.push({ binding: JSON.stringify([expected.revision, "component", component.id]), target: "browser-renderer", digest: component.contentDigest, }); } - for (const file of files.values()) { - const bytes = await read(expected.revision, file.path, file.bytes); - if (bytes.byteLength !== file.bytes || createHash("sha256").update(bytes).digest("hex") !== file.digest) - fail(file.path, "Artifact bytes do not match the checked content digest"); - } } return { codec: "camino-world-v1", diff --git a/src/execution-world/build-contract.ts b/src/execution-world/build-contract.ts new file mode 100644 index 0000000..a656e7f --- /dev/null +++ b/src/execution-world/build-contract.ts @@ -0,0 +1,224 @@ +import type { BindingSchema, BindingContractSchema } from "../bindings/index.js"; +import type { InterfaceRevision, PackageRevision } from "../capability-model/types.js"; +import { canonicalJson } from "../capability-model/evolution.js"; +import { moduleContract } from "../capability-model/modules.js"; +import { generatePackageComponentBindings, publicQueryContract, type PublicQueryContract } from "./client-contracts.js"; +import { moduleTypeContext } from "./module-contracts.js"; +import { executionVersions, hexDigest, ExecutionPlanError, type PlanPackage } from "./plan.js"; +import { preparationArtifact, type ReactPreparationArtifact } from "../react-build/declarations.js"; + +/** Inputs to compilation, independent of source pins and installed providers. + * Declared ports select interface contracts; the React consumer projects its + * imported interfaces, public queries and module inputs. Ordinary code + * and richer language type companions remain separate, explicit Nix inputs. */ +export interface PackageBuildContract { + definition: { + codec: "camino-package-build-v1"; + package: Omit; + versions: typeof executionVersions; + bindings: BindingContractSchema; + queries: PublicQueryContract[]; + component?: string; + moduleInterfaces: { revisionId: string; definitionId?: string; members: string[] }[]; + diagnostics: string[]; + }; + digest: string; +} + +const normalize = (value: T): T => JSON.parse(canonicalJson(value)) as T; +const indexSchema = (schema: BindingSchema) => ({ + interfaces: new Map( + [...schema.interfaces, ...(schema.interfaceTemplates ?? [])].map((entry) => [entry.revisionId, entry]), + ), + packages: new Map(schema.packages.map((entry) => [entry.revisionId, entry])), +}); +export function packageBuildContexts( + schema: BindingSchema, +): Record { + const index = indexSchema(schema); + return Object.fromEntries( + schema.packages.map((pkg) => [ + pkg.revisionId, + { + contract: projectPackageContract(schema, pkg.revisionId, index), + sourceDigest: hexDigest({ revision: pkg.revisionId, source: pkg.source }), + }, + ]), + ); +} +export function packageBuildContract(schema: BindingSchema, revision: string): PackageBuildContract { + return projectPackageContract(schema, revision, indexSchema(schema)); +} +function projectPackageContract( + schema: BindingSchema, + revision: string, + index: ReturnType, +): PackageBuildContract { + const declared = index.packages.get(revision); + if (!declared) throw new ExecutionPlanError("UNKNOWN_BUILD_PACKAGE", revision, "Missing package declaration"); + const pkg = normalize(declared); + const interfaces = (ids: Iterable) => + [...ids].map((id) => { + const iface = index.interfaces.get(id); + if (!iface) throw new ExecutionPlanError("UNKNOWN_BUILD_INTERFACE", id, "Missing declared interface"); + return normalize(iface); + }); + const modules = [...(pkg.modules ?? [])] + .sort((a, b) => a.id.localeCompare(b.id)) + .map((module) => { + const contract = moduleContract(interfaces([module.interfaceRevisionId]), module); + if (!contract) throw new ExecutionPlanError("UNKNOWN_MODULE_CONTRACT", module.id, "Missing module contract"); + return { + ...module, + contract: contract.contract, + ...(contract.subject ? { subject: contract.subject } : {}), + ...moduleTypeContext(index.interfaces.get(module.interfaceRevisionId)!), + }; + }); + const components = modules.flatMap((module) => + ["org.quixos.react.component/1", "org.quixos.react.component/2", "org.quixos.react.subject-only/1"].includes( + module.contract, + ) && module.subject?.kind === "interface" + ? [ + { + id: module.id, + displayName: module.displayName, + subject: module.subject.interfaceRevisionId, + runtime: "react" as const, + }, + ] + : [], + ); + const shape: PackageBuildContract["definition"]["package"] = { + revision, + exports: [...pkg.exports] + .sort((a, b) => a.id.localeCompare(b.id)) + .map((entry) => ({ id: entry.id, execution: entry.execution ?? { kind: "remote" } })), + ...(modules.length ? { modules } : {}), + ...(components.length ? { components } : {}), + ...(pkg.controllers?.length ? { controllers: [...pkg.controllers].sort((a, b) => a.id.localeCompare(b.id)) } : {}), + }; + const portInterfaces = new Set( + pkg.exports.flatMap((entry) => + entry.dependencyPorts.flatMap((port) => + port.requirement.kind === "interface" ? [port.requirement.interfaceRevisionId] : [], + ), + ), + ); + const bindings: BindingContractSchema = { + format: "quixos-bindings", + version: 1, + packages: [ + { + revisionId: pkg.revisionId, + exports: [...pkg.exports].sort((a, b) => a.id.localeCompare(b.id)), + ...(pkg.genericExports ? { genericExports: pkg.genericExports } : {}), + }, + ], + interfaces: interfaces(portInterfaces) + .map(({ source, ...contract }) => contract) + .sort((a, b) => a.revisionId.localeCompare(b.revisionId)), + }; + const preparation = pkg.buildArtifacts?.[preparationArtifact] as ReactPreparationArtifact | undefined; + const diagnostics = components.flatMap((component) => { + const input = preparation?.modules.find((entry) => entry.module === component.id); + return input && pkg.queryCompositions?.some((entry) => entry.id === input.composition) + ? [] + : [`${component.id}: declare checked inputs in quixos.react.json`]; + }); + // Only interfaces whose modules are exposed by these bindings need language + // type companions. Reference types themselves do not recursively import the + // referenced object's implementation or its conformance inventory. + const used = new Set(Object.values(pkg.clientInterfaces ?? {})); + for (const module of modules) used.add(module.interfaceRevisionId); + for (const component of components) used.add(component.subject); + for (const entry of preparation?.modules ?? []) + for (const child of entry.children) if (child.role) used.add(child.role.interface); + const moduleInterfaces = interfaces(used) + .flatMap((iface: InterfaceRevision) => { + const members = iface.members + .filter((member) => member.kind === "module") + .map((member) => member.id) + .sort(); + return members.length + ? [ + { + revisionId: iface.revisionId, + ...(iface.application ? { definitionId: iface.application.definitionId } : {}), + members, + }, + ] + : []; + }) + .sort((a, b) => a.revisionId.localeCompare(b.revisionId)); + for (const module of modules) + for (const argument of index.interfaces.get(module.interfaceRevisionId)?.application?.arguments ?? []) + if (argument.kind === "object" && argument.target.kind === "interface") + used.add(argument.target.interfaceRevisionId); + const providers = new Set(Object.values(pkg.clientPackages ?? {})); + for (const query of pkg.queries ?? []) + for (const imported of query.importedFragments ?? []) providers.add(imported.packageRevisionId); + providers.delete(pkg.revisionId); + const componentSchema: BindingSchema = { + format: "quixos-bindings", + version: 1, + interfaces: interfaces(used), + packages: [ + pkg, + ...[...providers].map((id) => { + const provider = index.packages.get(id); + if (!provider) throw new ExecutionPlanError("UNKNOWN_BUILD_PROVIDER", id, "Missing declared package provider"); + return normalize(provider); + }), + ], + }; + const definition: PackageBuildContract["definition"] = { + codec: "camino-package-build-v1", + package: shape, + versions: { ...executionVersions }, + bindings, + queries: [ + ...new Map( + pkg.exports.flatMap((entry) => + entry.dependencyPorts.flatMap((port) => { + if (port.requirement.kind !== "query") return []; + const requirement = port.requirement; + const provider = index.packages.get(requirement.packageRevisionId); + if (!provider) + throw new ExecutionPlanError( + "UNKNOWN_QUERY_PROVIDER", + requirement.packageRevisionId, + "Missing declared query provider", + ); + return [ + [ + JSON.stringify([requirement.packageRevisionId, requirement.queryId]), + publicQueryContract(provider, requirement.queryId), + ] as const, + ]; + }), + ), + ).entries(), + ] + .sort(([a], [b]) => a.localeCompare(b)) + .map(([, query]) => query), + ...(components.length && !diagnostics.length + ? { component: generatePackageComponentBindings(componentSchema, shape) } + : {}), + moduleInterfaces, + diagnostics, + }; + const normalized = JSON.parse(canonicalJson(definition)) as typeof definition; + return { definition: normalized, digest: hexDigest(normalized) }; +} + +export function checkPackageBuildContract(contract: PackageBuildContract): void { + if (contract.definition.codec !== "camino-package-build-v1" || hexDigest(contract.definition) !== contract.digest) + throw new ExecutionPlanError("INVALID_BUILD_CONTRACT", contract.digest, "Package contract digest mismatch"); + if (contract.definition.diagnostics.length) + throw new ExecutionPlanError( + "INCOMPLETE_BUILD_CONTRACT", + contract.definition.package.revision, + contract.definition.diagnostics.join("; "), + ); +} diff --git a/src/execution-world/client-contracts.ts b/src/execution-world/client-contracts.ts index b9740c8..a258e4e 100644 --- a/src/execution-world/client-contracts.ts +++ b/src/execution-world/client-contracts.ts @@ -7,6 +7,9 @@ import type { import { canonicalJson } from "../capability-model/evolution.js"; import { portableValueSchema, tsType } from "../bindings/portable.js"; import { type ExecutionPlan, resolvePlannedOperation, hexDigest, ExecutionPlanError } from "./plan.js"; +import type { BindingSchema } from "../bindings/index.js"; +import type { PackageBuildContract } from "./build-contract.js"; +import { preparationArtifact, type ReactPreparationArtifact } from "../react-build/declarations.js"; import { moduleTypeContext } from "./module-contracts.js"; /** Public shape only: no slot inventory, implementation binding, or workspace identity. */ @@ -145,6 +148,13 @@ export function generatePackageQueryClientBindings( runtimeModule = "@quixos/camino-replica-core", packages: readonly PackageRevision[] = [pkg], ): string { + const internal = + (pkg.buildArtifacts?.[preparationArtifact] as ReactPreparationArtifact | undefined)?.internalQueries ?? []; + pkg = { + ...pkg, + queries: pkg.queries?.filter((query) => !internal.includes(query.id)), + checkedQueries: pkg.checkedQueries?.filter((query) => !internal.includes(query.declaration.id)), + }; const queries = (pkg.checkedQueries ?? []) .filter((query) => !query.declaration.fragment) .map( @@ -206,12 +216,21 @@ export function generatePackageQueryClientBindings( /** Receipt-covered bindings expose the package's imports, component subjects and * declared queries, never the workspace's complete atom/interface inventory. */ export function generateComponentClientBindings(plan: ExecutionPlan, packageRevision: string): string { - const pkg = plan.definition.workspace.packageImports.find((pkg) => pkg.revisionId === packageRevision); - const components = plan.definition.packages.find((pkg) => pkg.revision === packageRevision)?.components; - const modules = plan.definition.packages.find((pkg) => pkg.revision === packageRevision)?.modules ?? []; + const shape = plan.definition.packages.find((pkg) => pkg.revision === packageRevision); + if (!shape) throw new ExecutionPlanError("NO_COMPONENT_CONTRACT", packageRevision, "Unknown package"); + return generatePackageComponentBindings(plan.definition.bindingSchema, shape); +} +export function generatePackageComponentBindings( + schema: BindingSchema, + shape: PackageBuildContract["definition"]["package"], +): string { + const packageRevision = shape.revision; + const pkg = schema.packages.find((pkg) => pkg.revisionId === packageRevision); + const components = shape.components; + const modules = shape.modules ?? []; if (!pkg || !components?.length) throw new ExecutionPlanError("NO_COMPONENT_CONTRACT", packageRevision, "Package declares no component entries"); - const byId = new Map(plan.definition.workspace.interfaceImports.map((iface) => [iface.revisionId as string, iface])); + const byId = new Map(schema.interfaces.map((iface) => [iface.revisionId as string, iface])); const find = (id: string) => { const contract = byId.get(id); if (!contract || contract.template) @@ -254,11 +273,7 @@ export function generateComponentClientBindings(plan: ExecutionPlan, packageRevi .filter((line) => !line.startsWith("import ")) .join("\n") .replace("export const interfaces =", "export const subjects ="); - const queries = generatePackageQueryClientBindings( - pkg, - "@quixos/camino-react", - plan.definition.workspace.packageImports, - ) + const queries = generatePackageQueryClientBindings(pkg, "@quixos/camino-react", schema.packages) .split("\n") .filter((line) => !line.startsWith("import ")) .join("\n"); @@ -270,7 +285,7 @@ export function generateComponentClientBindings(plan: ExecutionPlan, packageRevi queries + `\nexport const providers = {${Object.entries(pkg.clientPackages ?? {}) .map(([alias, id]) => { - const imported = plan.definition.workspace.packageImports.find((entry) => entry.revisionId === id); + const imported = schema.packages.find((entry) => entry.revisionId === id); if (!imported) throw new ExecutionPlanError("UNINSTALLED_PACKAGE", id, "Missing imported module provider"); return `${JSON.stringify(alias)}:{${(imported.modules ?? []).map((module) => `${JSON.stringify(module.displayName)}:${JSON.stringify({ packageRevision: id, id: module.id })}`).join(",")}}`; }) @@ -304,7 +319,7 @@ export function generateComponentClientBindings(plan: ExecutionPlan, packageRevi const handle = `PresentationHandle<${JSON.stringify(child.subject)}, ${extra}>`; return `readonly ${JSON.stringify(child.name)}: ${child.each ? `readonly ${handle}[]` : child.with || child.when ? `${handle} | null` : handle}`; }); - const input = `${tsType(composition.output)} & {readonly children: {${children.join(";")}}}`; + const input = `${tsType(preparation.input ?? composition.output)} & {readonly children: {${children.join(";")}}}`; return `${JSON.stringify(component.displayName)}: ComponentType & ExtraModuleProps<${JSON.stringify(key)}>>;`; }) .join("\n") + diff --git a/src/execution-world/index.ts b/src/execution-world/index.ts index b3aa839..e393d65 100644 --- a/src/execution-world/index.ts +++ b/src/execution-world/index.ts @@ -22,3 +22,5 @@ export { reviewSemanticMajors } from "../capability-model/evolution.js"; export * from "./public-reflection.js"; export * from "./graph-execution.js"; + +export * from "./build-contract.js"; diff --git a/src/execution-world/plan.ts b/src/execution-world/plan.ts index 3a47547..da65c4c 100644 --- a/src/execution-world/plan.ts +++ b/src/execution-world/plan.ts @@ -11,13 +11,12 @@ import type { OperationId, } from "../capability-model/types.js"; import { validateWorkspaceRevision } from "../capability-model/validation.js"; -import { moduleContract } from "../capability-model/modules.js"; import { canonicalJson, contentDigest } from "../capability-model/evolution.js"; import { resolveForwardedBinding } from "../capability-model/forwarding.js"; import { linkQueries, type LinkedQuery } from "../query/link.js"; import { type BindingSchema } from "../bindings/index.js"; import { unsupportedQueryOperator } from "./query-operators.js"; -import { moduleTypeContext } from "./module-contracts.js"; +import { packageBuildContexts } from "./build-contract.js"; export class ExecutionPlanError extends Error { constructor( @@ -78,30 +77,6 @@ export interface PlanPackage { exports: { id: string; execution: ExecutionContract }[]; } -/** React consumes these module contracts; other contracts remain metadata until - * an artifact consumer exists. This does not make modules callable operations. */ -function componentDeclarations(workspace: WorkspaceRevision, pkg: WorkspaceRevision["packageImports"][number]) { - return [ - ...(pkg.modules ?? []).flatMap((module) => { - const contract = moduleContract(workspace.interfaceImports, module)!; - if ( - !["org.quixos.react.component/1", "org.quixos.react.component/2", "org.quixos.react.subject-only/1"].includes( - contract.contract, - ) || - contract.subject?.kind !== "interface" - ) - return []; - return [ - { - id: module.id, - displayName: module.displayName, - subject: contract.subject.interfaceRevisionId, - runtime: "react" as const, - }, - ]; - }), - ]; -} export interface ExecutionPlanDefinition { presentations?: NonNullable; codec: "camino-execution-plan-v1"; @@ -543,37 +518,21 @@ export function compileExecutionPlan( packages: sorted(workspace.packageImports, (p) => p.revisionId), }; const normalizedSchema = JSON.parse(canonicalJson(schema)) as BindingSchema; + const buildContexts = packageBuildContexts(normalizedSchema); const definition: ExecutionPlanDefinition = { codec: "camino-execution-plan-v1", workspace, bindingSchema: normalizedSchema, ...(workspace.presentations?.length ? { presentations: sorted(workspace.presentations, (p) => p.id) } : {}), - packages: sorted(workspace.packageImports, (p) => p.revisionId).map((p) => ({ - revision: p.revisionId, - source: p.source, - sourceDigest: hexDigest({ revision: p.revisionId, source: p.source }), - bindingDigest: hexDigest(normalizedSchema), - ...(p.modules?.length - ? { - modules: sorted(p.modules, (module) => module.id).map((module) => { - const contract = moduleContract(workspace.interfaceImports, module)!; - return { - ...module, - contract: contract.contract, - ...(contract.subject ? { subject: contract.subject } : {}), - ...moduleTypeContext( - workspace.interfaceImports.find((iface) => iface.revisionId === module.interfaceRevisionId)!, - ), - }; - }), - } - : {}), - ...(p.controllers?.length ? { controllers: sorted(p.controllers, (controller) => controller.id) } : {}), - ...(componentDeclarations(workspace, p).length - ? { components: sorted(componentDeclarations(workspace, p), (component) => component.id) } - : {}), - exports: sorted(p.exports, (e) => e.id).map((e) => ({ id: e.id, execution: e.execution ?? { kind: "remote" } })), - })), + packages: sorted(workspace.packageImports, (p) => p.revisionId).map((p) => { + const contract = buildContexts[p.revisionId]!.contract; + return { + ...contract.definition.package, + source: p.source, + sourceDigest: hexDigest({ revision: p.revisionId, source: p.source }), + bindingDigest: contract.digest, + }; + }), owners: sorted(workspace.conformances, (c) => c.id ?? "").map((c) => { if (!c.id) throw new ExecutionPlanError( diff --git a/src/execution-world/receipts.ts b/src/execution-world/receipts.ts index a69def6..27f76d5 100644 --- a/src/execution-world/receipts.ts +++ b/src/execution-world/receipts.ts @@ -1,19 +1,23 @@ import { createHash } from "node:crypto"; import { generatePortableTypeScriptBindings, generateRemoteTypeScriptBindings } from "../bindings/portable.js"; import { type ExecutionPlan, ExecutionPlanError, hexDigest } from "./plan.js"; -import { type ArtifactReader, type PackageArtifacts } from "./artifacts.js"; +import { type ArtifactReader, type PackageArtifacts, type ArtifactGroup } from "./artifacts.js"; import { loadArtifactWorld, type LoadedArtifactWorld } from "./files.js"; -import { generateComponentClientBindings, componentAssetDeclarations } from "./client-contracts.js"; +import { componentAssetDeclarations } from "./client-contracts.js"; -export interface ArtifactReceipt { +import { checkPackageBuildContract, packageBuildContract, type PackageBuildContract } from "./build-contract.js"; + +export interface GroupReceipt { schemaVersion: 1; packageRevisionId: string; bindingDigest: string; - sourceDigest: string; manifestDigest: string; generatorDigest: string; generated: { target: string; path: string; digest: string; bytes: number }[]; } +export interface ArtifactReceipt extends GroupReceipt { + sourceDigest: string; +} const hashBytes = (bytes: Uint8Array) => createHash("sha256").update(bytes).digest("hex"); /** Nominal identities never become filesystem paths. */ export const generatedBindingPath = (target: string) => `share/quixos/generated/target-${hexDigest(target)}.ts`; @@ -24,20 +28,42 @@ export function expectedArtifactReceipt( manifest: PackageArtifacts, generatorDigest: string, ): { receipt: ArtifactReceipt; sources: Map } { - if (!/^[0-9a-f]{64}$/.test(generatorDigest)) throw new Error("Invalid trusted generator digest"); const pkg = plan.definition.packages.find((p) => p.revision === manifest.packageRevisionId); - const schemaPackage = plan.definition.bindingSchema.packages.find((p) => p.revisionId === manifest.packageRevisionId); + if (!pkg || manifest.sourceDigest !== pkg.sourceDigest) + throw new ExecutionPlanError("INVALID_RECEIPT", manifest.packageRevisionId, "Receipt package/source mismatch"); + return expectedPackageReceipt( + packageBuildContract(plan.definition.bindingSchema, pkg.revision), + manifest, + pkg.sourceDigest, + generatorDigest, + ); +} +export function expectedPackageReceipt( + contract: PackageBuildContract, + manifest: PackageArtifacts, + sourceDigest: string, + generatorDigest: string, +): { receipt: ArtifactReceipt; sources: Map } { + if (manifest.sourceDigest !== sourceDigest) + throw new ExecutionPlanError("INVALID_RECEIPT", manifest.packageRevisionId, "Receipt source mismatch"); + const result = expectedGroupReceipt(contract, manifest, generatorDigest); + return { ...result, receipt: { ...result.receipt, sourceDigest } }; +} +export function expectedGroupReceipt( + contract: PackageBuildContract, + manifest: ArtifactGroup, + generatorDigest: string, +): { receipt: GroupReceipt; sources: Map } { + checkPackageBuildContract(contract); + if (!/^[0-9a-f]{64}$/.test(generatorDigest)) throw new Error("Invalid trusted generator digest"); + const pkg = contract.definition.package; + const schemaPackage = contract.definition.bindings.packages.find((p) => p.revisionId === pkg.revision)!; if ( - !pkg || - !schemaPackage || - manifest.bindingDigest !== pkg.bindingDigest || - manifest.sourceDigest !== pkg.sourceDigest + manifest.packageRevisionId !== pkg.revision || + manifest.bindingDigest !== contract.digest || + hexDigest(manifest.versions) !== hexDigest(contract.definition.versions) ) - throw new ExecutionPlanError( - "INVALID_RECEIPT", - manifest.packageRevisionId, - "Receipt package/schema/source mismatch", - ); + throw new ExecutionPlanError("INVALID_RECEIPT", manifest.packageRevisionId, "Receipt package/contract mismatch"); // A process service may implement transactions in any language. Only the // checked JS module path promises generated TypeScript adapter evidence. const available = new Set( @@ -60,14 +86,14 @@ export function expectedArtifactReceipt( const generated = targets.map((target) => { const path = generatedBindingPath(target); const bytes = new TextEncoder().encode( - generatePortableTypeScriptBindings(plan.definition.bindingSchema, pkg.revision, { target }), + generatePortableTypeScriptBindings(contract.definition.bindings, pkg.revision, { target }), ); sources.set(path, bytes); return { target, path, digest: hashBytes(bytes), bytes: bytes.length }; }); if (manifest.components?.length) { for (const [path, source] of [ - ["share/quixos/generated/client.ts", generateComponentClientBindings(plan, pkg.revision)], + ["share/quixos/generated/client.ts", contract.definition.component!], ["share/quixos/generated/component-assets.d.ts", componentAssetDeclarations()], ] as const) { const bytes = new TextEncoder().encode(source); @@ -88,7 +114,7 @@ export function expectedArtifactReceipt( ) { const path = "share/quixos/generated/remote.ts"; const bytes = new TextEncoder().encode( - generateRemoteTypeScriptBindings(plan.definition.bindingSchema, pkg.revision), + generateRemoteTypeScriptBindings(contract.definition.bindings, pkg.revision), ); sources.set(path, bytes); generated.push({ target: "server", path, digest: hashBytes(bytes), bytes: bytes.length }); @@ -97,8 +123,7 @@ export function expectedArtifactReceipt( receipt: { schemaVersion: 1, packageRevisionId: pkg.revision, - bindingDigest: pkg.bindingDigest, - sourceDigest: pkg.sourceDigest, + bindingDigest: contract.digest, manifestDigest: hexDigest(manifest), generatorDigest, generated, diff --git a/src/react-build/declarations.ts b/src/react-build/declarations.ts index 2a7c042..429d5f4 100644 --- a/src/react-build/declarations.ts +++ b/src/react-build/declarations.ts @@ -17,9 +17,13 @@ export interface ReactChildDeclaration { export interface ReactModulePreparation { module: string; composition: string; + /** Public input type before workspace query lowering adds private projections. */ + input?: ValueType; children: ReactChildDeclaration[]; } export interface ReactPreparationArtifact { + /** Frontend queries belong to installed preparation, not the authored client API. */ + internalQueries?: string[]; modules: ReactModulePreparation[]; } diff --git a/src/react-build/expansion.ts b/src/react-build/expansion.ts index 177d8ba..4776f4c 100644 --- a/src/react-build/expansion.ts +++ b/src/react-build/expansion.ts @@ -61,6 +61,8 @@ export async function expandPresentationQueries(workspace: WorkspaceRevision): P allowances.push(allowance); } declaration = { ...declaration, views: [...views.values()], allowances }; + const artifact = pkg.buildArtifacts?.[preparationArtifact] as ReactPreparationArtifact | undefined; + if (artifact) artifact.internalQueries = [...new Set([...(artifact.internalQueries ?? []), declaration.id])].sort(); const checked = await compileQuery(declaration, workspace.interfaceImports, async () => document, resolver); pkg.queries = [...(pkg.queries ?? []).filter((entry) => entry.id !== declaration.id), declaration]; pkg.checkedQueries = [ diff --git a/src/react-build/package-queries.ts b/src/react-build/package-queries.ts index 3442230..b9dd3f6 100644 --- a/src/react-build/package-queries.ts +++ b/src/react-build/package-queries.ts @@ -20,6 +20,10 @@ export const generatePackageQueries: PackageQueryGenerator = async (input) => { const declarations = reactModules.length ? presentationDeclarations(await input.readSource("quixos.react.json"), pkg, input.interfaces) : undefined; + if (declarations) + declarations.artifact.internalQueries = (pkg.queries ?? []) + .filter((query) => !before.has(query.id)) + .map((query) => query.id); return { queries: (pkg.queries ?? []).filter((query) => !before.has(query.id)), documents, diff --git a/src/react-build/workspace.ts b/src/react-build/workspace.ts index f0baba0..a413d57 100644 --- a/src/react-build/workspace.ts +++ b/src/react-build/workspace.ts @@ -24,6 +24,7 @@ export async function completeWorkspace(workspace: WorkspaceRevision): Promise entry.id === parent.preparation.composition); if (!composition || composition.output.kind !== "record") throw Error(`Missing checked inputs for ${parent.module.displayName}`); + parent.preparation.input = structuredClone(composition.output); const outputs = new Map(Object.entries(composition.output.fields)); const dependencies: string[] = []; const children = parent.preparation.children.map((child) => { diff --git a/test/build-contract.test.ts b/test/build-contract.test.ts new file mode 100644 index 0000000..4dd9b22 --- /dev/null +++ b/test/build-contract.test.ts @@ -0,0 +1,78 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { compileCapabilityResourceSource } from "../src/capability-language/index.js"; +import { packageBuildContract } from "../src/execution-world/build-contract.js"; +import { generatePortableTypeScriptBindings } from "../src/bindings/portable.js"; +import type { BindingSchema } from "../src/bindings/index.js"; +import type { InterfaceRevision } from "../src/capability-model/types.js"; + +function fixture() { + const source = { repository: "https://example.test/source", commit: "1".repeat(40) }; + const interfaces = new Map(); + for (const name of ["Value", "Unrelated"]) { + const result = compileCapabilityResourceSource( + `interface ${name} id "${name}" revision "${name}@1" { + value text id "text" : string { get id "text:get" execution snapshot; } + }`, + { source }, + ); + assert.ok(result.ok && result.resource.kind === "interface", JSON.stringify(result.diagnostics)); + interfaces.set(name, result.resource.revision); + } + const result = compileCapabilityResourceSource( + `import interface Value; + package Adapter id "adapter" revision "adapter@1" { + operation fetchText id "read" : unit -> string mode call execution snapshot targets [server] + receiver any requires { interface data id "value" : Value using [text.get]; }; + }`, + { source, environment: { interfaces, interfaceClosure: [...interfaces.values()] } }, + ); + assert.ok(result.ok && result.resource.kind === "package", JSON.stringify(result.diagnostics)); + return { + format: "quixos-bindings", + version: 1, + interfaces: [...interfaces.values()], + packages: [result.resource.revision], + } satisfies BindingSchema; +} + +test("package builds ignore exact pins and unrelated declarations, and preserve generated port types", () => { + const schema = fixture(); + const original = packageBuildContract(schema, "adapter@1"); + const changed = structuredClone(schema); + changed.interfaces.forEach((iface) => { + iface.source.commit = "2".repeat(40); + }); + changed.packages[0]!.source.commit = "3".repeat(40); + changed.interfaces.find((iface) => iface.displayName === "Unrelated")!.members = []; + assert.deepEqual(packageBuildContract(changed, "adapter@1"), original); + assert.equal(JSON.stringify(original).includes("https://example.test/source"), false); + assert.equal( + generatePortableTypeScriptBindings(original.definition.bindings, "adapter@1", { target: "server" }), + generatePortableTypeScriptBindings(schema, "adapter@1", { target: "server" }), + ); +}); + +test("changing a consumed interface or an owned port contract invalidates the build", () => { + const schema = fixture(); + const original = packageBuildContract(schema, "adapter@1"); + const changed = structuredClone(schema); + changed.interfaces[0]!.members[0]!.operations[0]!.outputType = { kind: "scalar", name: "bool" }; + assert.notEqual(packageBuildContract(changed, "adapter@1").digest, original.digest); + const own = structuredClone(schema); + own.packages[0]!.exports[0]!.outputType = { kind: "scalar", name: "bool" }; + assert.notEqual(packageBuildContract(own, "adapter@1").digest, original.digest); +}); + +test("a nominal reference does not import the referenced interface's entire dependency graph", () => { + const schema = fixture(); + schema.packages[0]!.exports[0]!.inputType = { + kind: "object-ref", + expectation: { kind: "interface", interfaceRevisionId: schema.interfaces[1]!.revisionId }, + }; + const original = packageBuildContract(schema, "adapter@1"); + schema.interfaces[1]!.members = []; + assert.deepEqual(packageBuildContract(schema, "adapter@1"), original); + schema.packages[0]!.exports[0]!.inputType = { kind: "scalar", name: "string" }; + assert.notEqual(packageBuildContract(schema, "adapter@1").digest, original.digest); +}); diff --git a/test/emit-managed.ts b/test/emit-managed.ts index 731551f..95ef2c7 100644 --- a/test/emit-managed.ts +++ b/test/emit-managed.ts @@ -10,6 +10,9 @@ import { generatePackageQueryClientBindings, } from "../src/execution-world/client-contracts.js"; import { compileQueryProgram } from "../src/execution-world/queries.js"; +import { presentationDeclarations, preparationArtifact } from "../src/react-build/declarations.js"; +import { compileQueryComposition } from "../src/query/composition.js"; +import type { PackageRevision } from "../src/capability-model/types.js"; const source = { repository: "https://example.test/device-owner.git", commit: "a".repeat(40) }; const factory = compileCapabilityResourceSource( `external atom Entry id "atom:entry"; @@ -51,6 +54,17 @@ const view = compileCapabilityResourceSource( ); assert.ok(view.ok && view.resource.kind === "interface", JSON.stringify(view.diagnostics)); const viewInterface = view.resource.revision; +function declareInputs(pkg: PackageRevision) { + const declarations = presentationDeclarations( + JSON.stringify({ + modules: Object.fromEntries((pkg.modules ?? []).map((module) => [module.displayName, { inputs: [] }])), + }), + pkg, + [dataInterface, viewInterface], + ); + pkg.buildArtifacts = { [preparationArtifact]: declarations.artifact }; + pkg.queryCompositions = declarations.compositions.map((entry) => compileQueryComposition(entry, new Map())); +} const ui = compileCapabilityResourceSource( 'import interface Data; import interface View; package UI id "package:ui" revision "package:ui@1" { module Card id "component:card" implements View.render; }', { @@ -65,6 +79,7 @@ const ui = compileCapabilityResourceSource( }, ); assert.ok(ui.ok && ui.resource.kind === "package", JSON.stringify(ui.diagnostics)); +declareInputs(ui.resource.revision); for (const variant of ["base", "added", "gateway", "gateway-next", "session"]) { const session = variant === "session", gateway = session || variant.startsWith("gateway"), @@ -107,6 +122,7 @@ package Owner id "package:owner" revision "package:owner@1" { }, ); assert.ok(pkg.ok && pkg.resource.kind === "package", JSON.stringify(pkg.diagnostics)); + if (session) declareInputs(pkg.resource.revision); if (session) pkg.resource.revision.checkedQueries = await Promise.all( pkg.resource.revision.queries!.map((query) => From 7c1830bcd5ecf89ae61e7e1a3599368a20f585c5 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Thu, 1 Oct 2026 01:37:46 -0700 Subject: [PATCH 88/91] Instrument and improve incremental workspace checks Profile source capture, Nix evaluation/realization, resource/query checking, and implementation builds without putting timings into immutable outputs. Keep modular repositories; bound independent capture work, snapshot jj once per observation, and retain final concurrent-edit and Git completeness checks. Compose exact resource/closure/frontend/toolchain checks as memoized Nix derivations. Preserve whole-workspace validation and the full compiler path when no checked dependency is supplied. Share canonical Nixpkgs by content, index workspace build contexts once, and narrow lock/driver/compiler inputs with conservative complete-source fallback. Batch React witness checks only when distinct source closures cannot share ambient declarations; otherwise run the original independent TypeScript checks. Seed local authoring toolchains with exact canonical fetch identities when they match the selected inputs; retain store-path inputs for overrides. Add generic correctness checks rather than permanent Reader timing/content fixtures. Verify actual Reader edits and rejection/recovery in a private workbench, preserving the original user's workbench and runtime. Query checking currently caches at resource/closure boundaries, not individual query semantic dependency boundaries. Template helper pins and reproducible fixture snapshots follow in a separate publication change. --- flake.nix | 4 +- nix/checked-candidate.nix | 74 +++++- nix/lock-source.nix | 16 ++ nix/lock-source.test.nix | 42 ++++ nix/package-context.nix | 5 +- src/capability-language/assembly.ts | 58 ++++- src/capability-language/authoring-check.ts | 5 +- src/capability-language/authoring-converge.ts | 215 ++++++++++++------ src/capability-language/checked-build.ts | 117 ++++++---- src/capability-language/checked-resources.ts | 40 ++++ src/capability-language/execution-scaffold.ts | 1 + src/capability-language/profile.ts | 5 + src/capability-language/resource-cli.ts | 6 +- src/capability-language/workspace-cli.ts | 12 +- test/capability-assembly.test.ts | 68 +++++- 15 files changed, 527 insertions(+), 141 deletions(-) create mode 100644 nix/lock-source.nix create mode 100644 nix/lock-source.test.nix create mode 100644 src/capability-language/checked-resources.ts create mode 100644 src/capability-language/profile.ts diff --git a/flake.nix b/flake.nix index 54daab3..80677c9 100644 --- a/flake.nix +++ b/flake.nix @@ -81,11 +81,13 @@ install -Dm644 nix/checked-package.nix "$out/share/checked-package.nix" install -Dm644 nix/checked-artifacts.nix "$out/share/checked-artifacts.nix" install -Dm644 nix/package-context.nix "$out/share/package-context.nix" + install -Dm644 nix/lock-source.nix "$out/share/lock-source.nix" install -Dm644 nix/package-context.mjs "$out/share/package-context.mjs" install -Dm644 nix/check-package.mjs "$out/share/check-package.mjs" install -Dm644 nix/check-execution.mjs "$out/share/check-execution.mjs" substitute nix/checked-candidate.nix "$out/share/checked-candidate.nix" \ - --replace-fail '@nixpkgs@' '${pkgs.path}' + --replace-fail '@nixpkgs@' '${pkgs.path}' \ + --replace-fail '@nixpkgsNarHash@' '${nixpkgs.narHash}' cp --reflink=auto --recursive grammar "$out/grammar" cp --reflink=auto --recursive proto "$out/proto" cp --reflink=auto --recursive dist "$out/dist" diff --git a/nix/checked-candidate.nix b/nix/checked-candidate.nix index 2cebdd7..d657ca0 100644 --- a/nix/checked-candidate.nix +++ b/nix/checked-candidate.nix @@ -9,7 +9,11 @@ system ? builtins.currentSystem, }: let - pkgs = import (/. + "@nixpkgs@") { inherit system; }; + pkgs = import (/. + "@nixpkgs@") { + inherit system; + config = { }; + overlays = [ ]; + }; protocol = builtins.storePath generator; sourceKey = source: "${source.kind}:${source.repository}@${source.commit}"; fetch = @@ -26,8 +30,9 @@ let source: let directory = fetch source; + lockSource = import ./lock-source.nix { source = directory; }; lockFile = pkgs.runCommand "qx-source-lock.json" { } '' - ${protocol}/bin/quixos-lock-check ${directory}/quixos.lock > "$out" + ${protocol}/bin/quixos-lock-check ${lockSource}/quixos.lock > "$out" ''; lock = builtins.fromJSON (builtins.readFile lockFile); in @@ -124,15 +129,40 @@ let }) (builtins.filter (entry: entry.kind != "workspace") (resourceClosure true node)); } ); - compile = + # Each resource is checked once per exact source/closure/frontend/toolchain. + # Composition imports these compiler outputs; authoring receipts are never + # build inputs. Missing entries in ordinary CLI use take the full check path. + compiledNodes = builtins.mapAttrs (_: node: compileNode node) nodeTable; + compile = node: compiledNodes.${sourceKey node}; + checkedResources = node: - pkgs.runCommand "qx-${node.kind}-contract" { } '' + pkgs.writeText "qx-checked-resources.json" ( + builtins.toJSON ( + map + (dependency: { + inherit (dependency) kind repository commit; + artifact = compile dependency; + }) + ( + builtins.filter ( + dependency: + dependency.kind != "workspace" + && dependency.kind != "build" + && sourceKey dependency != sourceKey node + ) (resourceClosure true node) + ) + ) + ); + compileNode = + node: + pkgs.runCommand "qx-${node.kind}-contract" { QUIXOS_TRACE_PROFILE = "1"; } '' mkdir -p "$out" ${ if node.kind == "workspace" then '' ${protocol}/bin/quixos-workspace-compile --root ${node.directory} \ - ${queryGeneratorFlags node} \ + ${queryGeneratorFlags root} \ + --checked-resources ${checkedResources node} \ --source-root-commit ${pkgs.lib.escapeShellArg node.commit} \ --checkout-root "$TMPDIR/checkouts" --snapshot-map ${snapshots node} \ --graph-out "$out/graph.json" --schemas-out "$out/package-schemas.json" \ @@ -144,7 +174,8 @@ let else '' ${protocol}/bin/quixos-resource-compile --root ${node.directory} \ - ${queryGeneratorFlags node} \ + ${queryGeneratorFlags root} \ + --checked-resources ${checkedResources node} \ --kind ${node.kind} --repository ${pkgs.lib.escapeShellArg node.repository} \ --commit ${pkgs.lib.escapeShellArg node.commit} \ --checkout-root "$TMPDIR/checkouts" --snapshot-map ${snapshots node} --snapshot-only true \ @@ -153,6 +184,18 @@ let } ''; contract = compile root; + # Parse shared workspace outputs once. Repeating fromJSON in every package + # makes composition quadratic in package count and in the serialized world. + workspacePackages = builtins.listToAttrs ( + map + (pkg: { + name = sourceKey (pkg.source // { kind = "package"; }); + value = pkg; + }) + (builtins.fromJSON (builtins.readFile "${contract}/execution-plan.json")) + .definition.bindingSchema.packages + ); + workspaceContexts = builtins.fromJSON (builtins.readFile "${contract}/build-contexts.json"); buildDependencies = node: builtins.listToAttrs ( @@ -218,17 +261,19 @@ let if execution && kind == "workspace" then { revision = - pkgs.lib.findFirst - (pkg: pkg.source.repository == node.repository && pkg.source.commit == node.commit) - (throw "Source package missing from workspace compilation: ${node.repository}") - (builtins.fromJSON (builtins.readFile "${contract}/execution-plan.json")) - .definition.bindingSchema.packages; + workspacePackages.${sourceKey node} + or (throw "Source package missing from workspace compilation: ${node.repository}"); } else builtins.fromJSON (builtins.readFile "${compiled}/candidate.json"); buildContext = import ./package-context.nix { inherit pkgs protocol; contexts = if kind == "workspace" then "${contract}/build-contexts.json" else null; + contextData = + if execution && kind == "workspace" then + workspaceContexts.${candidate.revision.revisionId} + else + null; plan = "${compiled}/bindings.json"; packageRevisionId = candidate.revision.revisionId; }; @@ -254,6 +299,11 @@ let typescript = runtimePackages.camino-replica-core.dependencies; packageRevisionId = candidate.revision.revisionId; dependencies = buildDependencies node; + buildEnvironment = { + inherit pkgs system; + nixpkgsSource = toString pkgs.path; + narHash = "@nixpkgsNarHash@"; + }; } // pkgs.lib.optionalAttrs (componentEntries != [ ]) { react = { @@ -310,7 +360,7 @@ in pkgs.runCommand (if contractOnly then "qx-contract" else "qx-checked-candidate") { } '' mkdir -p "$out" cp ${ - pkgs.writeText "qx-candidate-source.json" (builtins.toJSON { inherit repository commit kind; }) + builtins.toFile "qx-candidate-source.json" (builtins.toJSON { inherit repository commit kind; }) } "$out/source.json" cp ${contract}/candidate.json "$out/candidate.json" cp ${contract}/graph.json "$out/graph.json" diff --git a/nix/lock-source.nix b/nix/lock-source.nix new file mode 100644 index 0000000..bceef63 --- /dev/null +++ b/nix/lock-source.nix @@ -0,0 +1,16 @@ +# Lock parsing only reads this one file when no import token can occur. A +# conservative substring probe also sends comments/URLs containing "import" +# through the complete-source path. Fragment names may have any extension. +{ source }: +let + regular = ((builtins.readDir source)."quixos.lock" or null) == "regular"; + text = if regular then builtins.readFile (source + "/quixos.lock") else "import"; +in +if builtins.replaceStrings [ "import" ] [ "" ] text != text then + source +else + builtins.path { + path = source; + name = "qx-lock-source"; + filter = filename: _: filename == toString source || filename == "${source}/quixos.lock"; + } diff --git a/nix/lock-source.test.nix b/nix/lock-source.test.nix new file mode 100644 index 0000000..c1669f4 --- /dev/null +++ b/nix/lock-source.test.nix @@ -0,0 +1,42 @@ +{ pkgs, protocol }: +let + base = ''quixos-lock version 1 { quixos source { repository "https://example.test/quixos.git"; commit "1111111111111111111111111111111111111111"; } }''; + fixture = + extra: lock: + pkgs.runCommand "qx-lock-source-fixture" { } '' + mkdir -p "$out/nested" + printf '%s' ${pkgs.lib.escapeShellArg lock} > "$out/quixos.lock" + printf '%s' ${pkgs.lib.escapeShellArg extra} > "$out/implementation.ts" + printf '%s' 'quixos-lock fragment version 1 {}' > "$out/nested/dependencies.txt" + ''; + first = fixture "first implementation" base; + edited = fixture "edited implementation" base; + changed = fixture "first implementation" ( + builtins.replaceStrings + [ "1111111111111111111111111111111111111111" ] + [ "2222222222222222222222222222222222222222" ] + base + ); + fragments = fixture "first implementation" ( + builtins.replaceStrings [ "quixos source" ] [ ''import "nested/dependencies.txt"; quixos source'' ] + base + ); + conservative = fixture "first implementation" (base + "\n// import in a comment\n"); + slice = source: import ./lock-source.nix { inherit source; }; + parse = + source: + pkgs.runCommand "qx-source-lock.json" { } '' + ${protocol}/bin/quixos-lock-check ${slice source}/quixos.lock > "$out" + ''; +in +assert slice first == slice edited; +assert (parse first).drvPath == (parse edited).drvPath; +assert slice first != slice changed; +pkgs.runCommand "qx-lock-source-check" { } '' + ${protocol}/bin/quixos-lock-check ${slice first}/quixos.lock > first.json + ${protocol}/bin/quixos-lock-check ${slice edited}/quixos.lock > edited.json + cmp first.json edited.json + ${protocol}/bin/quixos-lock-check ${slice conservative}/quixos.lock > comment.json + cmp first.json comment.json + ${protocol}/bin/quixos-lock-check ${slice fragments}/quixos.lock > "$out" +'' diff --git a/nix/package-context.nix b/nix/package-context.nix index 7317379..ef20489 100644 --- a/nix/package-context.nix +++ b/nix/package-context.nix @@ -5,6 +5,7 @@ protocol, plan ? null, contexts ? null, + contextData ? null, packageRevisionId, }: let @@ -14,7 +15,9 @@ let ${pkgs.lib.escapeShellArg packageRevisionId} > "$out" ''; context = - if contexts == null then + if contextData != null then + contextData + else if contexts == null then builtins.fromJSON (builtins.readFile projected) else (builtins.fromJSON (builtins.readFile contexts)).${packageRevisionId}; diff --git a/src/capability-language/assembly.ts b/src/capability-language/assembly.ts index 332bca0..6236e1d 100644 --- a/src/capability-language/assembly.ts +++ b/src/capability-language/assembly.ts @@ -1,5 +1,6 @@ import { readFile, realpath } from "node:fs/promises"; import path from "node:path"; +import { profile } from "./profile.js"; import { loadQxSources, resolveQxSources } from "./source-loader.js"; import { compileQuery, compileRepositoryQuery } from "../query/compile.js"; import type { QueryDeclaration } from "../query/types.js"; @@ -43,6 +44,15 @@ export type CapabilityRepositoryResolver = ( kind: LockedResource["kind"], ) => Promise; +/** Already checked outputs of this compiler, composed by the Nix build DAG. + * Source capture/check reports never grant this authority. */ +export type CheckedResourceResolver = ( + kind: LockedResource["kind"], + source: GitSource, + lock: QuixosRepositoryLock, + dependencies: ReadonlyMap, +) => Promise; + /** An explicitly selected build frontend supplies ordinary query sources. The * assembler never chooses a frontend by inspecting an interface/contract ID. * Generated sources go through the same query and imported-fragment checks. */ @@ -221,7 +231,12 @@ const createResourceGraphResolver = ( quixosCommit: string, resolveResource: CapabilityRepositoryResolver, generateQueries?: PackageQueryGenerator, + checkedResource?: CheckedResourceResolver, ) => { + const graphStarted = performance.now(); + let checkedResources = 0, + reusedResources = 0, + checkedQueries = 0; const resolved = new Map>(); const active: string[] = []; @@ -275,6 +290,30 @@ const createResourceGraphResolver = ( }; } const dependencyClosure = resourceClosure(directPairs.map(([, node]) => node)); + const dependencies = new Map( + directPairs.map(([dependency, node]) => [bindingKey(dependency.kind, dependency.binding), node]), + ); + const checked = await checkedResource?.(locked.kind, locked.source, lockResult.lock, dependencies); + if (checked) { + if ( + checked.kind !== locked.kind || + checked.revision.source.repository !== locked.source.repository || + checked.revision.source.commit !== locked.source.commit + ) + throw new Error("Checked resource identity mismatch"); + assertImportsMatchLock("Checked resource", checked.imports, lockResult.lock.resources); + reusedResources++; + return { + key, + kind: locked.kind, + source: locked.source, + directory: snapshot.directory, + lock: lockResult.lock, + resource: structuredClone(checked), + dependencies, + }; + } + const checkStarted = performance.now(); const environment = environmentFor(directPairs, dependencyClosure); const manifestName = locked.kind === "interface" ? "interface.qx" : "package.qx"; const manifestPath = path.join(snapshot.directory, manifestName); @@ -399,6 +438,15 @@ const createResourceGraphResolver = ( compiled.resource.revision.migrationCatalog = catalog; } } + checkedResources++; + const queries = + compiled.resource.kind === "package" ? (compiled.resource.revision.checkedQueries?.length ?? 0) : 0; + checkedQueries += queries; + profile("resource-check", checkStarted, { + kind: locked.kind, + resource: compiled.resource.revision.displayName, + queries, + }); return { key, kind: locked.kind, @@ -420,7 +468,11 @@ const createResourceGraphResolver = ( return { visit, - nodes: async () => await Promise.all(resolved.values()), + nodes: async () => { + const nodes = await Promise.all(resolved.values()); + profile("resource-graph", graphStarted, { checkedResources, reusedResources, checkedQueries }); + return nodes; + }, }; }; @@ -430,6 +482,7 @@ export const compileCapabilityResourceRepository = async (options: { source: GitSource; resolveResource: CapabilityRepositoryResolver; generateQueries?: PackageQueryGenerator; + checkedResource?: CheckedResourceResolver; }): Promise => { const lockResult = await loadQuixosLock(path.join(options.rootDirectory, "quixos.lock")); if (!lockResult.ok) { @@ -439,6 +492,7 @@ export const compileCapabilityResourceRepository = async (options: { lockResult.lock.quixos.commit, options.resolveResource, options.generateQueries, + options.checkedResource, ); const root = await resolver.visit( { @@ -466,6 +520,7 @@ export const compileWorkspaceRepository = async (options: { /** An editor's proposed source snapshot; locks and dependency revisions remain exact. */ readSource?: (name: string) => Promise; generateQueries?: PackageQueryGenerator; + checkedResource?: CheckedResourceResolver; }): Promise => { const rootLockResult = await loadQuixosLock(path.join(options.rootDirectory, "quixos.lock")); if (!rootLockResult.ok) { @@ -476,6 +531,7 @@ export const compileWorkspaceRepository = async (options: { rootLock.quixos.commit, options.resolveResource, options.generateQueries, + options.checkedResource, ); const directPairs: Array<[LockedResource, ResolvedCapabilityResource]> = []; diff --git a/src/capability-language/authoring-check.ts b/src/capability-language/authoring-check.ts index 5f65355..b378075 100644 --- a/src/capability-language/authoring-check.ts +++ b/src/capability-language/authoring-check.ts @@ -64,7 +64,7 @@ export async function checkAuthoring( // Repository-scoped agents can check separate immutable candidates in parallel. const capture = promisify(callback)("quixos-qx", ["converge", context.workbench, directory], { maxBuffer: 4 * 1024 * 1024, - env: { ...process.env, QUIXOS_JJ_NO_CHECKPOINT: "1", QUIXOS_TRACE_CAPTURE: "1" }, + env: { ...process.env, QUIXOS_JJ_NO_CHECKPOINT: "1", QUIXOS_TRACE_CAPTURE: "1", QUIXOS_TRACE_PROFILE: "1" }, }); console.error(`Capture details: ${path.join(output, "capture.log")}`); capture.child.stderr?.on("data", (chunk) => appendFileSync(path.join(output, "capture.log"), chunk)); @@ -94,6 +94,9 @@ export async function checkAuthoring( resource.kind, path.join(output, "nix.log"), options.contractOnly, + (phase, ms) => { + timings[phase] = ms; + }, ); } finally { timings.immutableCheckMs = Math.round(performance.now() - buildStarted); diff --git a/src/capability-language/authoring-converge.ts b/src/capability-language/authoring-converge.ts index c410152..cba7d94 100644 --- a/src/capability-language/authoring-converge.ts +++ b/src/capability-language/authoring-converge.ts @@ -5,6 +5,7 @@ import { promisify } from "node:util"; import { randomUUID } from "node:crypto"; import { authoringContext } from "./authoring-context.js"; import { snapshotCommit } from "./checked-build.js"; +import { profile } from "./profile.js"; import { loadQuixosLock, parseQuixosLockDocument, @@ -14,6 +15,42 @@ import { } from "../resource-lock/index.js"; const execFile = promisify(callback); +// Bound independent repository operations. One visit owns each repository; +// all visits finish before the final concurrent-edit validation pass. +const concurrency = 4; +async function mapConcurrent(values: readonly T[], action: (value: T) => Promise): Promise { + const results = new Array(values.length); + let next = 0; + await Promise.all( + Array.from({ length: Math.min(concurrency, values.length) }, async () => { + while (next < values.length) { + const index = next++; + results[index] = await action(values[index]); + } + }), + ); + return results; +} +const limiter = () => { + let running = 0; + const waiting: Array<() => void> = []; + return async (action: () => Promise): Promise => { + await new Promise((resolve) => { + if (running < concurrency) { + running++; + resolve(); + } else waiting.push(resolve); + }); + try { + return await action(); + } finally { + const next = waiting.shift(); + if (next) next(); + else running--; + } + }; +}; + const command = async (cwd: string, executable: string, args: string[]) => { const start = performance.now(); // Do not log arguments: transports may contain credentials. Source identities @@ -44,13 +81,14 @@ export type AuthoringBlocker = { * worklist grants typechecking, semantic review or activation approval. * Caller serializes coordinators; package authors may still be editing. */ export async function convergeAuthoring(start: string, target = "root") { + const started = performance.now(); const context = await authoringContext(start); const graphFile = path.join(context.workbench, ".quixos/resource-graph.json"); const graphBefore = await readFile(graphFile, "utf8"); const blockers: AuthoringBlocker[] = []; const nodes = new Map(); const selected = new Map(); - for (const entry of context.resources) { + const inventory = await mapConcurrent(context.resources, async (entry) => { const root = path.join(context.workbench, entry.directory); let repository = entry.source?.repository; try { @@ -64,6 +102,9 @@ export async function convergeAuthoring(start: string, target = "root") { blockers.push({ directory: entry.directory, phase: "source", message: String(error).slice(0, 2000) }); if (!repository) throw error; // The root has no separate registered source. } + return { ...entry, repository }; + }); + for (const { repository, ...entry } of inventory) { const key = identity(entry.kind, repository); if (selected.has(key)) throw new Error(`More than one editable checkout for ${repository}`); selected.set(key, entry.directory); @@ -73,7 +114,7 @@ export async function convergeAuthoring(start: string, target = "root") { dependencies: [], }); } - for (const node of nodes.values()) { + await mapConcurrent([...nodes.values()], async (node) => { try { const lock = await loadQuixosLock(path.join(context.workbench, node.directory, "quixos.lock")); if (!lock.ok) throw new Error(lock.diagnostics.map((d) => `${d.fileName}: ${d.message}`).join("\n")); @@ -88,97 +129,122 @@ export async function convergeAuthoring(start: string, target = "root") { } catch (error) { blockers.push({ directory: node.directory, phase: "resolution", message: String(error) }); } - } - const complete = new Map(), - active = new Set(); - const visited = new Set(); - if (!nodes.has(target)) throw new Error(`Not a registered repository: ${target}`); - const visit = async (directory: string): Promise => { - visited.add(directory); - if (complete.has(directory)) return true; - if (blockers.some((entry) => entry.directory === directory)) return false; - if (active.has(directory)) { + }); + // Detect cycles before starting concurrent futures: two roots awaiting each + // other must fail clearly rather than deadlocking on their cached promises. + const scanned = new Set(); + const detectCycles = (directory: string, parents: string[] = []) => { + if (parents.includes(directory)) { blockers.push({ directory, phase: "dependency", - message: `Source dependency cycle: ${[...active, directory].join(" -> ")}`, + message: `Source dependency cycle: ${[...parents, directory].join(" -> ")}`, }); - return false; + return; } - active.add(directory); - const node = nodes.get(directory)!; - for (const dependency of node.dependencies) - if (!(await visit(dependency))) { - blockers.push({ directory, phase: "dependency", message: `Waiting for ${dependency}` }); - active.delete(directory); + if (scanned.has(directory)) return; + for (const dependency of nodes.get(directory)!.dependencies) detectCycles(dependency, [...parents, directory]); + scanned.add(directory); + }; + for (const directory of nodes.keys()) detectCycles(directory); + const complete = new Map(); + const pending = new Map>(); + const capture = limiter(); + const visited = new Set(); + if (!nodes.has(target)) throw new Error(`Not a registered repository: ${target}`); + const visit = (directory: string): Promise => { + visited.add(directory); + const existing = pending.get(directory); + if (existing) return existing; + const result = (async () => { + if (blockers.some((entry) => entry.directory === directory)) return false; + const node = nodes.get(directory)!; + const ready = await Promise.all(node.dependencies.map(visit)); + const unavailable = node.dependencies.find((_, index) => !ready[index]); + if (unavailable) { + blockers.push({ directory, phase: "dependency", message: `Waiting for ${unavailable}` }); return false; } - const root = path.join(context.workbench, directory); - let phase: AuthoringBlocker["phase"] = "source"; - try { - const lock = await loadQuixosLock(path.join(root, "quixos.lock")); - if (!lock.ok) throw new Error("Lock changed during convergence; retry after joining writers"); - for (const file of lock.lock.sourceFiles ?? ["quixos.lock"]) { - const filename = path.join(root, file), - before = await readFile(filename, "utf8"); - const parsed = parseQuixosLockDocument(before, file); - if (!parsed.ok) throw new Error(`Invalid lock ${file}`); - let changed = false; - for (const dependency of parsed.document.resources) { - const target = selected.get(identity(dependency.kind, dependency.source.repository)); - const source = target ? complete.get(target) : undefined; - if (target && !source) - throw new Error(`Dependencies changed during convergence (${dependency.binding}); join writers and retry`); - if (source && source.commit !== dependency.source.commit) { - dependency.source = source; - changed = true; + return await capture(async () => { + const root = path.join(context.workbench, directory); + let phase: AuthoringBlocker["phase"] = "source"; + try { + const lock = await loadQuixosLock(path.join(root, "quixos.lock")); + if (!lock.ok) throw new Error("Lock changed during convergence; retry after joining writers"); + for (const file of lock.lock.sourceFiles ?? ["quixos.lock"]) { + const filename = path.join(root, file), + before = await readFile(filename, "utf8"); + const parsed = parseQuixosLockDocument(before, file); + if (!parsed.ok) throw new Error(`Invalid lock ${file}`); + let changed = false; + for (const dependency of parsed.document.resources) { + const target = selected.get(identity(dependency.kind, dependency.source.repository)); + const source = target ? complete.get(target) : undefined; + if (target && !source) + throw new Error( + `Dependencies changed during convergence (${dependency.binding}); join writers and retry`, + ); + if (source && source.commit !== dependency.source.commit) { + dependency.source = source; + changed = true; + } + } + if (changed) { + const temporary = `${filename}.${randomUUID()}.tmp`; + try { + await writeFile(temporary, formatQuixosLockDocument(parsed.document), { flag: "wx" }); + if ((await readFile(filename, "utf8")) !== before) + throw new Error(`Concurrent edit to ${file}; retry after joining writers`); + await rename(temporary, filename); + } finally { + await rm(temporary, { force: true }); + } + } } - } - if (changed) { - const temporary = `${filename}.${randomUUID()}.tmp`; - try { - await writeFile(temporary, formatQuixosLockDocument(parsed.document), { flag: "wx" }); - if ((await readFile(filename, "utf8")) !== before) - throw new Error(`Concurrent edit to ${file}; retry after joining writers`); - await rename(temporary, filename); - } finally { - await rm(temporary, { force: true }); + const snapshotStarted = performance.now(); + const commit = await snapshotCommit(root); + if (process.env.QUIXOS_TRACE_CAPTURE === "1") + console.error( + `[${new Date().toISOString()}] Capture: ${directory} snapshot: ${Math.round(performance.now() - snapshotStarted)}ms`, + ); + phase = "publication"; + const ref = retentionTagForCommit(commit); + const remote = await command(root, "git", ["ls-remote", "--refs", node.source.repository, ref]); + if (remote && remote.split(/\s+/)[0] !== commit) + throw new Error(`Conflicting immutable retention ref ${ref}`); + if (!remote) { + await command(root, "git", ["push", node.source.repository, `${commit}:${ref}`]); + if ( + (await command(root, "git", ["ls-remote", "--refs", node.source.repository, ref])).split(/\s+/)[0] !== + commit + ) + throw new Error("Published source retention was not observed"); } + complete.set(directory, { ...node.source, commit }); + } catch (error) { + blockers.push({ directory, phase, message: String(error).slice(0, 4000) }); } - } - const snapshotStarted = performance.now(); - const commit = await snapshotCommit(root); - if (process.env.QUIXOS_TRACE_CAPTURE === "1") - console.error( - `[${new Date().toISOString()}] Capture: ${directory} snapshot: ${Math.round(performance.now() - snapshotStarted)}ms`, - ); - phase = "publication"; - const ref = retentionTagForCommit(commit); - const remote = await command(root, "git", ["ls-remote", "--refs", node.source.repository, ref]); - if (remote && remote.split(/\s+/)[0] !== commit) throw new Error(`Conflicting immutable retention ref ${ref}`); - if (!remote) await command(root, "git", ["push", node.source.repository, `${commit}:${ref}`]); - if ((await command(root, "git", ["ls-remote", "--refs", node.source.repository, ref])).split(/\s+/)[0] !== commit) - throw new Error("Published source retention was not observed"); - complete.set(directory, { ...node.source, commit }); - } catch (error) { - blockers.push({ directory, phase, message: String(error).slice(0, 4000) }); - } - active.delete(directory); - return complete.has(directory); + return complete.has(directory); + }); + })(); + pending.set(directory, result); + return result; }; // Include newly created, not-yet-imported resources, then the root. - if (target === "root") for (const directory of [...nodes.keys()].filter((d) => d !== "root")) await visit(directory); + if (target === "root") await Promise.all([...nodes.keys()].filter((d) => d !== "root").map(visit)); await visit(target); for (let index = blockers.length - 1; index >= 0; index--) if (!visited.has(blockers[index].directory)) blockers.splice(index, 1); - for (const [directory, source] of complete) { + const recheckStarted = performance.now(); + await mapConcurrent([...complete], async ([directory, source]) => { try { if ((await snapshotCommit(path.join(context.workbench, directory))) !== source.commit) throw new Error("Source advanced while converging; join writers and retry"); } catch (error) { blockers.push({ directory, phase: "concurrent-edit", message: String(error) }); } - } + }); + profile("capture-recheck", recheckStarted, { repositories: complete.size }); // Persist successful selections even if another repository is still broken. // Recovery must not depend on all parents succeeding in the same invocation. const graph = JSON.parse(graphBefore); @@ -238,11 +304,14 @@ export async function convergeAuthoring(start: string, target = "root") { await rm(temporary, { force: true }); } } + profile("capture", started, { repositories: nodes.size, snapshots: complete.size * 2, target }); return { workbench: context.workbench, converged: blockers.length === 0, candidate: blockers.length ? null : (complete.get(target) ?? null), - retained: [...complete].map(([directory, source]) => ({ directory, source })), + retained: [...complete] + .sort(([left], [right]) => left.localeCompare(right)) + .map(([directory, source]) => ({ directory, source })), worklist: blockers, verificationEvidence: false, activated: false, diff --git a/src/capability-language/checked-build.ts b/src/capability-language/checked-build.ts index ee04814..7e2e7fd 100644 --- a/src/capability-language/checked-build.ts +++ b/src/capability-language/checked-build.ts @@ -13,13 +13,14 @@ export const checkerIdentity = () => export async function snapshotCommit(root: string): Promise { const run = async (...args: string[]) => (await execFile("jj", args, { cwd: root, env: environment() })).stdout.trim(); - await run("status"); - // jj resolve --list exits 1 on a clean revision. Query structured revision - // metadata instead of depending on diagnostic wording or swallowing errors. - if ((await run("--ignore-working-copy", "log", "--no-graph", "-r", "@", "-T", "conflict")) !== "false") - throw new Error("Resolve source conflicts before verification"); - const commit = await run("--ignore-working-copy", "log", "--no-graph", "-r", "@", "-T", "commit_id"); - if (!/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(commit)) throw new Error("Verification requires an exact jj commit"); + // A single normal log snapshots the working copy and observes both values + // from that exact revision. Separate status/log processes add no evidence. + const [conflict, commit] = (await run("log", "--no-graph", "-r", "@", "-T", 'conflict ++ "\\n" ++ commit_id')).split( + "\n", + ); + if (conflict !== "false") throw new Error("Resolve source conflicts before verification"); + if (!commit || !/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(commit)) + throw new Error("Verification requires an exact jj commit"); await execFile("git", ["diff", "--exit-code", "--no-ext-diff", "--no-textconv", commit, "--"], { cwd: root, env: environment(), @@ -110,6 +111,7 @@ export async function buildImmutableCandidate( kind: "workspace" | "interface" | "package" | "build", logFile: string, contractOnly = false, + observe?: (phase: "nixEvaluationMs" | "nixBuildMs", ms: number) => void, ): Promise { if (!/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(source.commit)) throw new Error("An immutable candidate requires an exact commit"); @@ -126,16 +128,52 @@ export async function buildImmutableCandidate( log.once("open", () => resolve()); log.once("error", reject); }); - return await new Promise((resolve, reject) => { - let output = "", - tail = "", - failure: Error | undefined; - const child = spawn( - "nix", - [ - "build", - "--impure", - "--file", + const run = async (executable: string, args: string[]) => + await new Promise((resolve, reject) => { + let output = "", + tail = "", + failure: Error | undefined; + const child = spawn(executable, args, { env: environment(), stdio: ["ignore", "pipe", "pipe"] }); + const failedLog = (error: Error) => { + failure = error; + child.kill(); + }; + log.on("error", failedLog); + child.stdout.on("data", (chunk) => { + output += chunk; + }); + child.stderr.on("data", (chunk) => { + log.write(chunk); + tail = (tail + String(chunk)).slice(-6000); + }); + child.on("error", (error) => { + failure = error; + }); + child.on("close", (code) => { + log.off("error", failedLog); + if (failure) reject(failure); + else if (code !== 0) reject(new Error(`Candidate Nix check failed (${code}). Full log: ${logFile}\n${tail}`)); + else resolve(output.trim()); + }); + }); + const timed = async (phase: "nixEvaluationMs" | "nixBuildMs", action: () => Promise) => { + const started = performance.now(); + try { + return await action(); + } finally { + observe?.(phase, Math.round(performance.now() - started)); + } + }; + let gcDirectory: string | undefined; + try { + // Evaluation includes import-from-derivation builds (locks and contracts). + // Build the resulting derivation directly, without evaluating the DAG twice. + // Keep the derivation alive across the two processes, including concurrent + // GC. This temporary root is removed on success and on verification failure. + gcDirectory = await fs.mkdtemp(path.join(path.dirname(logFile), ".gc-root-")); + const gcRoot = path.join(gcDirectory, "candidate"); + const derivation = await timed("nixEvaluationMs", async () => { + await run("nix-instantiate", [ builder, "--argstr", "repository", @@ -152,33 +190,22 @@ export async function buildImmutableCandidate( "--arg", "contractOnly", contractOnly ? "true" : "false", - "--no-link", - "--print-out-paths", - "-L", - ], - { env: environment(), stdio: ["ignore", "pipe", "pipe"] }, + "--add-root", + gcRoot, + "--indirect", + ]); + return await fs.readlink(gcRoot); + }); + if (!/^\/nix\/store\/[a-z0-9]{32}-[^\s/]+\.drv$/.test(derivation)) + throw new Error("Nix returned an invalid candidate derivation"); + const artifact = await timed("nixBuildMs", () => + run("nix", ["build", derivation + "^*", "--no-link", "--print-out-paths", "-L"]), ); - log.on("error", (error) => { - failure = error; - child.kill(); - }); - child.stdout.on("data", (chunk) => { - output += chunk; - }); - child.stderr.on("data", (chunk) => { - log.write(chunk); - tail = (tail + String(chunk)).slice(-6000); - }); - child.on("error", (error) => { - failure = error; - }); - child.on("close", (code) => - log.end(() => { - if (failure) reject(failure); - else if (code !== 0 || !/^\/nix\/store\/[a-z0-9]{32}-[^\s/]+$/.test(output.trim())) - reject(new Error(`Candidate Nix check failed (${code}). Full log: ${logFile}\n${tail}`)); - else resolve(output.trim()); - }), - ); - }); + if (!/^\/nix\/store\/[a-z0-9]{32}-[^\s/]+$/.test(artifact)) + throw new Error("Nix returned an invalid candidate artifact"); + return artifact; + } finally { + await new Promise((resolve) => log.end(resolve)); + if (gcDirectory) await fs.rm(gcDirectory, { recursive: true, force: true }); + } } diff --git a/src/capability-language/checked-resources.ts b/src/capability-language/checked-resources.ts new file mode 100644 index 0000000..1d258fa --- /dev/null +++ b/src/capability-language/checked-resources.ts @@ -0,0 +1,40 @@ +import { readFile } from "node:fs/promises"; +import type { CheckedResourceResolver } from "./assembly.js"; +import type { CapabilityResource } from "./parser.js"; + +/** Internal compiler inputs produced by checked-candidate.nix, not authoring + * receipts. The Nix composition owns their derivations and exact toolchain. + * Ordinary compiler callers omit this map and run all checks directly. */ +export async function loadCheckedResources(filename?: string): Promise { + if (!filename) return undefined; + const entries = JSON.parse(await readFile(filename, "utf8")) as Array<{ + kind: string; + repository: string; + commit: string; + artifact: string; + }>; + const resources = new Map(); + for (const entry of entries) { + const key = `${entry.kind}\0${entry.repository}\0${entry.commit}`; + if (resources.has(key)) throw new Error("Repeated checked resource input"); + if (!/^\/nix\/store\/[^/]+$/.test(entry.artifact)) + throw new Error("Checked resources must be immutable Nix outputs"); + resources.set(key, entry.artifact); + } + return async (kind, source, lock, dependencies) => { + const artifact = resources.get(`${kind}\0${source.repository}\0${source.commit}`); + if (!artifact) return undefined; + const graph = JSON.parse(await readFile(`${artifact}/graph.json`, "utf8")); + const expected = [...dependencies].map(([binding, node]) => ({ binding, resourceKey: node.key })); + if ( + graph.quixos.commit !== lock.quixos.commit || + graph.quixos.repository !== lock.quixos.repository || + graph.root.kind !== kind || + graph.root.source.repository !== source.repository || + graph.root.source.commit !== source.commit || + JSON.stringify(graph.root.dependencies) !== JSON.stringify(expected) + ) + throw new Error("Checked resource input does not match its locked dependency graph"); + return JSON.parse(await readFile(`${artifact}/candidate.json`, "utf8")) as CapabilityResource; + }; +} diff --git a/src/capability-language/execution-scaffold.ts b/src/capability-language/execution-scaffold.ts index e690ac8..226154e 100644 --- a/src/capability-language/execution-scaffold.ts +++ b/src/capability-language/execution-scaffold.ts @@ -80,6 +80,7 @@ export async function executionScaffold( devShells.default = (import (helpers + "/quixos-package-helpers.nix")).mkCaminoYarnShell { inherit pkgs; }; quixosPackages.checkedArtifacts = context: let + pkgs = camino.packageSet { inherit nixpkgs system context; }; contract = builtins.fromJSON (builtins.readFile context.buildContract); package = contract.definition.package; portable = builtins.filter (entry: entry.execution.kind != "remote") package.exports; diff --git a/src/capability-language/profile.ts b/src/capability-language/profile.ts new file mode 100644 index 0000000..5ff6c79 --- /dev/null +++ b/src/capability-language/profile.ts @@ -0,0 +1,5 @@ +/** Observations belong in logs, never in content-addressed compiler outputs. */ +export const profile = (phase: string, started: number, details: Record = {}) => { + if (process.env.QUIXOS_TRACE_PROFILE === "1") + console.error(`[qx-profile] ${JSON.stringify({ phase, ms: Math.round(performance.now() - started), ...details })}`); +}; diff --git a/src/capability-language/resource-cli.ts b/src/capability-language/resource-cli.ts index 836419a..4f40494 100644 --- a/src/capability-language/resource-cli.ts +++ b/src/capability-language/resource-cli.ts @@ -6,11 +6,12 @@ import { bindingSchema } from "../bindings/index.js"; import { compileCapabilityResourceRepository, type ResolvedCapabilityResource } from "./assembly.js"; import { createGitCapabilityResolver } from "./git-resolver.js"; import { loadQueryGenerator } from "./query-generator.js"; +import { loadCheckedResources } from "./checked-resources.js"; const usage = `usage: quixos-resource-compile --root DIRECTORY --kind interface|package|build --repository URL --commit GIT_REV --checkout-root DIRECTORY [--snapshot-map PATH] [--snapshot-only true] [--graph-out PATH] [--schema-out PATH] - [--query-generator BUILD_MODULE_PATH] + [--query-generator BUILD_MODULE_PATH] [--checked-resources NIX_MAP] Resolves a standalone resource's recursive dependency-lock graph, validates its interface.qx or package.qx manifest, and emits the checked resource as JSON.`; @@ -33,6 +34,7 @@ const parseArgs = (args: string[]) => { "--graph-out", "--schema-out", "--query-generator", + "--checked-resources", ].includes(key) || values.has(key) ) @@ -69,6 +71,7 @@ const parseArgs = (args: string[]) => { graphOut: values.get("--graph-out"), schemaOut: values.get("--schema-out"), queryGenerator: values.get("--query-generator"), + checkedResources: values.get("--checked-resources"), } as const; }; @@ -111,6 +114,7 @@ const main = async () => { }, resolveResource, generateQueries: await loadQueryGenerator(options.queryGenerator), + checkedResource: await loadCheckedResources(options.checkedResources), }); if (options.graphOut) { await writeFile( diff --git a/src/capability-language/workspace-cli.ts b/src/capability-language/workspace-cli.ts index 18b2ec5..1159d8c 100644 --- a/src/capability-language/workspace-cli.ts +++ b/src/capability-language/workspace-cli.ts @@ -5,6 +5,8 @@ import process from "node:process"; import { compileWorkspaceRepository } from "./assembly.js"; import { createGitCapabilityResolver } from "./git-resolver.js"; import { loadQueryGenerator } from "./query-generator.js"; +import { loadCheckedResources } from "./checked-resources.js"; +import { profile } from "./profile.js"; import { compileExecutionPlan, packageBuildContexts } from "../execution-world/index.js"; import { bindingSchema, specializeBindingSchema } from "../bindings/index.js"; import { @@ -18,7 +20,7 @@ const usage = `usage: quixos-workspace-compile --root DIRECTORY --checkout-root [--snapshot-map PATH] [--graph-out PATH] [--workspace-id ID] [--workspace-revision-id ID] [--source-root-commit GIT_REV] [--baseline PLAN_JSON] [--evolution-out PATH] [--reviews REVIEW_JSON] [--schemas-out PATH] [--execution-plan-out PATH] [--build-contexts-out PATH] - [--query-generator BUILD_MODULE_PATH] + [--query-generator BUILD_MODULE_PATH] [--checked-resources NIX_MAP] Resolves a workspace's recursive resource-lock graph, clones every exact resource revision, validates standalone interface/package manifests, and emits @@ -50,6 +52,7 @@ const parseArgs = (args: string[]) => { evolutionOut: values.get("--evolution-out"), reviews: values.get("--reviews"), queryGenerator: values.get("--query-generator"), + checkedResources: values.get("--checked-resources"), }; }; @@ -63,6 +66,7 @@ const main = async () => { checkoutRoot: options.checkoutRoot, snapshotMap: options.snapshotMap, }); + const assemblyStarted = performance.now(); const assembled = await compileWorkspaceRepository({ rootDirectory: options.rootDirectory, workspaceId: options.workspaceId, @@ -70,7 +74,9 @@ const main = async () => { sourceRootCommit: options.sourceRootCommit, resolveResource, generateQueries: await loadQueryGenerator(options.queryGenerator), + checkedResource: await loadCheckedResources(options.checkedResources), }); + profile("workspace-assembly", assemblyStarted, { resources: assembled.resources.length }); if (options.graphOut) { await writeFile( @@ -110,12 +116,15 @@ const main = async () => { } const candidate = { ...assembled.workspace, executionContracts: runtimeContracts(assembled.workspace) }; if (options.executionPlanOut || options.buildContextsOut) { + const executionStarted = performance.now(); const plan = compileExecutionPlan(assembled.workspace); if (options.executionPlanOut) await writeFile(options.executionPlanOut, `${JSON.stringify(plan, null, 2)}\n`); if (options.buildContextsOut) await writeFile(options.buildContextsOut, JSON.stringify(packageBuildContexts(plan.definition.bindingSchema))); + profile("execution-plan-and-contexts", executionStarted); } if (options.schemasOut) { + const schemasStarted = performance.now(); const schemas: Record = {}; for (const node of assembled.capabilityResources.filter((entry) => entry.kind === "package")) { const closure = new Map(); @@ -133,6 +142,7 @@ const main = async () => { ); } await writeFile(options.schemasOut, JSON.stringify(schemas)); + profile("package-schemas", schemasStarted); } if (options.evolutionOut) { const baseline = options.baseline diff --git a/test/capability-assembly.test.ts b/test/capability-assembly.test.ts index c147e19..33a16b1 100644 --- a/test/capability-assembly.test.ts +++ b/test/capability-assembly.test.ts @@ -107,6 +107,35 @@ package Runtime id "package:runtime" revision "package:runtime@1" { assert.equal(resource.resource.kind, "package"); assert.equal(resource.resources.length, 2); assert.equal(resource.directResources.size, 1); + + const checked = new Map(result.resources.map((node) => [node.key, node.resource])); + let generated = 0; + const reused = await compileWorkspaceRepository({ + rootDirectory: root, + resolveResource: async (source, kind) => ({ + directory: directories.get(`${kind}\0${source.repository}\0${source.commit}`)!, + }), + checkedResource: async (kind, source) => { + const value = checked.get(`${kind}\0${source.repository}\0${source.commit}`); + return value?.kind === "build" ? undefined : value; + }, + generateQueries: async () => { + generated++; + return { queries: [], documents: new Map() }; + }, + }); + assert.deepEqual(reused, result, "Nix-composed resource checks preserve full assembly results"); + assert.equal(generated, 0, "unchanged checked packages do not run their query frontend again"); + await assert.rejects( + compileWorkspaceRepository({ + rootDirectory: root, + resolveResource: async (source, kind) => ({ + directory: directories.get(`${kind}\0${source.repository}\0${source.commit}`)!, + }), + checkedResource: async () => (resource.resource.kind === "build" ? undefined : resource.resource), + }), + /Checked resource identity mismatch/, + ); }); test("resource repositories cannot own workspace Quixos selection policy", async (context) => { @@ -249,19 +278,48 @@ test("resource-owned fragment imports compile through the locked package closure }`, ); await writeFile(path.join(dirs.screen!, "screen.graphql"), "query Screen {root {...Row}}"); - const result = await compileCapabilityResourceRepository({ + const options = { rootDirectory: dirs.screen!, - kind: "package", - source: { resolver: "git", repository: "https://example.test/screen.git", commit: packageCommit }, - resolveResource: async (source) => { + kind: "package" as const, + source: { resolver: "git" as const, repository: "https://example.test/screen.git", commit: packageCommit }, + resolveResource: async (source: { repository: string }) => { const name = new URL(source.repository).pathname.slice(1, -4); assert.ok(dirs[name], name); return { directory: dirs[name]! }; }, - }); + }; + const result = await compileCapabilityResourceRepository(options); assert.equal(result.resource.kind, "package"); if (result.resource.kind !== "package") throw Error("expected package"); const view = result.resource.revision.checkedQueries!.find((q) => q.declaration.id === "view")!; assert.equal(view.selection[0]!.selection[0]!.fragmentSpread?.package, "rows@1"); assert.equal(result.resources.length, 3); + const checked = new Map(result.resources.map((node) => [node.key, node.resource])); + let generated = 0; + const reused = await compileCapabilityResourceRepository({ + ...options, + checkedResource: async (kind, source) => { + if (source.repository === options.source.repository) return undefined; + const resource = checked.get(`${kind}\0${source.repository}\0${source.commit}`); + return resource?.kind === "build" ? undefined : resource; + }, + generateQueries: async () => { + generated++; + return { queries: [], documents: new Map() }; + }, + }); + assert.deepEqual(reused, result, "cached imported fragments and full checking produce identical contracts"); + assert.equal(generated, 1, "only the uncached package checks its queries"); + await writeFile(path.join(dirs.screen!, "screen.graphql"), "query Screen {root {unknownField}}"); + await assert.rejects( + compileCapabilityResourceRepository({ + ...options, + source: { ...options.source, commit: "5".repeat(40) }, + checkedResource: async (kind, source) => { + const resource = checked.get(`${kind}\0${source.repository}\0${source.commit}`); + return resource?.kind === "build" ? undefined : resource; + }, + }), + /unknownField/, + ); }); From bd423060590b1424f8d81c0f04863a40c784a301 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Thu, 1 Oct 2026 09:21:57 -0700 Subject: [PATCH 89/91] Fix Studio query contracts for authored workspaces Keep query definition identity scoped to interfaces present in the generated query schema. Exclude retention provenance from both interface revisions and generic applications while preserving nominal identities, closed arguments, operation contracts, documents, budgets and fragment dependencies. Advance the query semantics version so prior compiler outputs cannot share the new identity. Add a generic compiler regression covering unrelated imports, retained generic sources and invalidation when an observed getter changes. This fixes Studio's CLIENT_QUERY_MISMATCH when template contracts become editable local repositories. Validation: protocol tests (296 total, 293 passed, 3 existing skips); nix fmt, monorepo lint, final formatting check and diff check; camino-dev/qx-workspace builds. All 17 Studio query descriptors match a rebuilt copy of the user's workspace. Headless fresh-workspace canvas/library/Reader/reload check passes. Repair the existing local qx-reader workbench through its ordinary check and activation path, updating only its pinned protocol/checker CLI. Retain the original toolchain GC root and record checker provenance. Source commit, runtime and template pins, and database are preserved. Verify the selected candidate is ready at epoch 2 and its canvas loads through the corrected Studio bundle without creating application objects. Stop the independent smoke-test services. --- src/query/compile.ts | 19 ++++++++++++---- test/query-compiler.test.ts | 44 +++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/src/query/compile.ts b/src/query/compile.ts index 68a9728..d9e0d49 100644 --- a/src/query/compile.ts +++ b/src/query/compile.ts @@ -634,15 +634,26 @@ export async function compileQuery( const definitionDigest = createHash("sha256") .update( canonicalJson({ - semantics: 5, + semantics: 6, declaration, normalized, fragmentContracts: Object.fromEntries(fragmentContracts), // Source provenance belongs to the checked installation. Identical public // contracts keep their query identity when retained in another repository. - // Closed generic identity remains explicit in revisionId/application. - interfaces: [...generated.byName.values()] - .map(({ source: _source, ...contract }) => contract) + // Closed generic identity remains explicit in revisionId/application; + // its template's retention source is provenance too. byName also holds + // names probed while discovering nominal projections, so only include + // interfaces actually present in the generated query schema. + interfaces: Object.values(generated.schema.getTypeMap()) + .filter(isObjectType) + .flatMap((type) => { + const revision = generated.byName.get(type.name); + if (!revision) return []; + const { source: _source, application, ...contract } = revision; + if (!application) return [contract]; + const { source: _templateSource, ...identity } = application; + return [{ ...contract, application: identity }]; + }) .sort((a, b) => (a.revisionId < b.revisionId ? -1 : a.revisionId > b.revisionId ? 1 : 0)), }), ) diff --git a/test/query-compiler.test.ts b/test/query-compiler.test.ts index f4e1cb5..6ccac88 100644 --- a/test/query-compiler.test.ts +++ b/test/query-compiler.test.ts @@ -36,6 +36,50 @@ interface Tasks id "tasks" revision "tasks@1" { [facts], ); +test("query identity ignores unrelated imports and generic retention provenance", async () => { + const generic = iface(`interface Box id "box" revision "box@1" { + queryable relation item id "box:item" : optional-one object Item {resolve id "box:item:resolve";} + }`); + const compiled = compileCapabilityResourceSource( + `import interface Box; import interface TaskFacts; + package Queries id "queries" revision "queries@1" { + query Row id "row" root Box document "row.graphql" operation "Row" {replica;max rows 10;} + }`, + { + source, + environment: { + interfaces: new Map([ + ["Box", generic], + ["TaskFacts", facts], + ]), + interfaceClosure: [generic, facts], + }, + }, + ); + assert.ok(compiled.ok, JSON.stringify(compiled.diagnostics)); + if (compiled.resource.kind !== "package") throw new Error("package required"); + const declaration = compiled.resource.revision.queries![0]!; + const closed = compiled.resource.specializations![0]!; + const read = async () => "query Row {root {item {title}}}"; + const before = await compileQuery(declaration, [facts, closed], read); + const retained = structuredClone(closed); + retained.source = { repository: "https://local.test/box.git", commit: "b".repeat(40) }; + retained.application!.source = retained.source; + const unrelated = iface(`interface Unrelated id "unrelated" revision "unrelated@1" { + queryable value label id "label" : string {get id "label:get";} + }`); + assert.equal( + (await compileQuery(declaration, [unrelated, generic, retained, facts], read)).definitionDigest, + before.definitionDigest, + ); + const changed = structuredClone(facts); + changed.members[0]!.operations[0]!.id = "changed:title:get" as (typeof changed.members)[0]["operations"][0]["id"]; + assert.notEqual( + (await compileQuery(declaration, [changed, retained], read)).definitionDigest, + before.definitionDigest, + ); +}); + test("generic query templates check declared bounds before closed specialization", async () => { const generic = iface( `import interface TaskFacts; From ef9a4e067a992127a4d1fa16a0923ac63641a68d Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Thu, 1 Oct 2026 11:28:57 -0700 Subject: [PATCH 90/91] Expose workspace data to the agent and curate its authoring guides Check named public GraphQL documents against the serving installation using the existing compiler, linker and authorized snapshot interpreter. Keep listObjects as a convenience over workspace-root queries, with no separate filter language. Bound compilation/results, cache by content and serving plan, and fence cutovers. Share graph discovery and reads between qx-workspace graph and the gardener's workspace_graph tool. Local authoring shells discover the live endpoint through the private control socket; configured public mounts also support direct clients. Fix pending paginated inspections to wait for their confirmed window, and retain semantic integration assertions instead of locking a server ticket's shape. Replace the long prompt with a 384-word entry point and five focused guides. Build immutable bundles with profiles, deep links, source hashes and word/link checks. Keep the docs-maintenance process and feedback outside agent guidance. Running agents use current guides while authored source and checker pins remain. Validation: nix fmt; nix fmt -- --check; nix run .#lint; existing CLI checks; protocol/client/coordinator build tests; complete Studio integration; 13 agent unit tests. A real GPT-6.1 Sol medium/priority turn summarized two synthetic saved comments and a document draft in 27.7s without source changes or cutover. Live reads also succeeded after an ordinary check/activation in the retained fixture. --- src/execution-world/index.ts | 1 + src/execution-world/queries.ts | 84 ++++++++++++++------------- src/execution-world/query-document.ts | 77 ++++++++++++++++++++++++ src/query/compile.ts | 3 +- src/query/link.ts | 18 +++++- src/query/types.ts | 3 +- 6 files changed, 142 insertions(+), 44 deletions(-) create mode 100644 src/execution-world/query-document.ts diff --git a/src/execution-world/index.ts b/src/execution-world/index.ts index e393d65..1f1af96 100644 --- a/src/execution-world/index.ts +++ b/src/execution-world/index.ts @@ -14,6 +14,7 @@ export { generatePortableTypeScriptBindings, generateRemoteTypeScriptBindings } export * from "./kernel.js"; export * from "./projections.js"; export * from "./queries.js"; +export * from "./query-document.js"; export { generatePortableClientBindings } from "../bindings/portable-client.js"; export * from "./candidate.js"; diff --git a/src/execution-world/queries.ts b/src/execution-world/queries.ts index 8ddf438..26cb3c3 100644 --- a/src/execution-world/queries.ts +++ b/src/execution-world/queries.ts @@ -25,7 +25,6 @@ const lowerTypes = (value: unknown): unknown => export function compileQueryProgram(plan: ExecutionPlan): unknown { if (hexDigest(plan.definition) !== plan.digest) throw new ExecutionPlanError("INVALID_PLAN", "queries", "Plan digest mismatch"); - const interfaces = plan.definition.workspace.interfaceImports; const allQueries = new Map(plan.definition.queries.map(({ id, query }) => [id, query.checked])); const compositions = plan.definition.workspace.packageImports.flatMap((pkg) => (pkg.queryCompositions ?? []).map((composition) => { @@ -62,45 +61,50 @@ export function compileQueryProgram(plan: ExecutionPlan): unknown { ...(compositions.length ? { compositions } : {}), queries: [ ...compileInspectionTemplates(plan).queries, - ...plan.definition.queries.map(({ id, query, admittedOperations }) => { - const checked = query.checked; - return { - id, - ...(checked.declaration.fragment && !checked.declaration.fragment.admission - ? { - fragment: { - package: query.packageRevisionId, - id: checked.declaration.id, - digest: checked.definitionDigest, - }, - } - : {}), - placement: checked.declaration.placement?.kind ?? "remote", - source: - checked.declaration.placement?.kind === "local" - ? JSON.stringify([query.packageRevisionId, checked.declaration.placement.sourceQueryId]) - : null, - root: checked.declaration.root, - atoms: query.rootAtoms, - variables: portableValueSchema(checked.variables), - defaults: checked.variableDefaults, - selection: lowerTypes(checked.selection), - budgets: checked.declaration.budgets, - fields: query.fields.map((field) => { - const member = interfaces - .find((i) => i.revisionId === field.interfaceRevisionId)! - .members.find((m) => m.id === field.memberId)!; - return { - atom: field.atomId, - interface: field.interfaceRevisionId, - member: field.memberId, - name: member.displayName, - operation: JSON.stringify([field.atomId, field.interfaceRevisionId, field.getter]), - }; - }), - admittedOperations, - }; - }), + ...plan.definition.queries.map((entry) => queryProgramEntry(plan, entry)), ], }; } + +export function queryProgramEntry(plan: ExecutionPlan, entry: import("./plan.js").PlannedQuery) { + const { id, query, admittedOperations } = entry; + const interfaces = plan.definition.workspace.interfaceImports; + + const checked = query.checked; + return { + id, + ...(checked.declaration.fragment && !checked.declaration.fragment.admission + ? { + fragment: { + package: query.packageRevisionId, + id: checked.declaration.id, + digest: checked.definitionDigest, + }, + } + : {}), + placement: checked.declaration.placement?.kind ?? "remote", + source: + checked.declaration.placement?.kind === "local" + ? JSON.stringify([query.packageRevisionId, checked.declaration.placement.sourceQueryId]) + : null, + root: checked.declaration.root, + atoms: query.rootAtoms, + variables: portableValueSchema(checked.variables), + defaults: checked.variableDefaults, + selection: lowerTypes(checked.selection), + budgets: checked.declaration.budgets, + fields: query.fields.map((field) => { + const member = interfaces + .find((i) => i.revisionId === field.interfaceRevisionId)! + .members.find((m) => m.id === field.memberId)!; + return { + atom: field.atomId, + interface: field.interfaceRevisionId, + member: field.memberId, + name: member.displayName, + operation: JSON.stringify([field.atomId, field.interfaceRevisionId, field.getter]), + }; + }), + admittedOperations, + }; +} diff --git a/src/execution-world/query-document.ts b/src/execution-world/query-document.ts new file mode 100644 index 0000000..08509d1 --- /dev/null +++ b/src/execution-world/query-document.ts @@ -0,0 +1,77 @@ +import { compileQuery } from "../query/compile.js"; +import { linkQueries } from "../query/link.js"; +import { capabilityId } from "../capability-model/types.js"; +import { portableValueSchema } from "../bindings/portable.js"; +import { hexDigest, type ExecutionPlan, type PlannedQuery } from "./plan.js"; +import { compileKernelProgram } from "./kernel.js"; +import { queryProgramEntry } from "./queries.js"; +import { unsupportedQueryOperator } from "./query-operators.js"; + +export interface QueryDocument { + readonly interface: string; + readonly document: string; + readonly operation: string; + readonly objectRoot: boolean; +} +/** Runtime query documents use the same language, nominal contracts, linking + * and interpreter as packaged queries. They introduce no resources or code. */ +export async function compilePublicQuery(plan: ExecutionPlan, request: QueryDocument) { + if (hexDigest(plan.definition) !== plan.digest) throw Error("INVALID_PLAN"); + if ( + typeof request.document !== "string" || + Buffer.byteLength(request.document) > 32768 || + typeof request.operation !== "string" || + !/^[A-Za-z_][A-Za-z0-9_]{0,127}$/.test(request.operation) || + typeof request.interface !== "string" || + request.interface.length > 2048 + ) + throw Error("QUERY_DOCUMENT_LIMIT"); + const id = "public-query:" + hexDigest(request); + const checked = await compileQuery( + { + id, + displayName: request.operation, + root: { + kind: request.objectRoot ? "object" : "workspace-interface", + interface: capabilityId.interfaceRevision(request.interface), + }, + document: "request.graphql", + operation: request.operation, + fragments: [], + views: [], + allowances: [], + watch: false, + budgets: { + rows: 512, + depth: 8, + resultBytes: 256 * 1024, + candidates: 10000, + rpcCalls: 128, + concurrency: 8, + deadlineMs: 10000, + }, + }, + plan.definition.workspace.interfaceImports, + async () => request.document, + ); + const unsupported = unsupportedQueryOperator(checked); + if (unsupported) throw Error(`QUERY_OPERATOR_UNSUPPORTED: ${unsupported}`); + const linked = linkQueries(plan.definition.workspace, [ + { packageRevisionId: "org.quixos.public-query/1", checked }, + ]).find((q) => q.checked === checked)!; + const kernel = compileKernelProgram(plan) as { + operations: { key: string; effect: string; unsupported: string | null; binding: { kind: string } }[]; + }; + for (const field of linked.fields) { + const key = JSON.stringify([field.atomId, field.interfaceRevisionId, field.getter]); + const operation = kernel.operations.find((op) => op.key === key); + const member = plan.definition.workspace.interfaceImports + .find((i) => i.revisionId === field.interfaceRevisionId)! + .members.find((m) => m.id === field.memberId)!; + if (!operation || operation.unsupported || operation.effect !== "snapshot") + throw Error("QUERY_DOCUMENT_REQUIRES_SNAPSHOT: use an installed query for remote-effect enrichment"); + if (member.kind === "relationship" && operation.binding.kind !== "edge") throw Error("QUERY_NON_NATIVE_RELATION"); + } + const entry: PlannedQuery = { id, query: linked, operations: [], admittedOperations: [] }; + return { id, program: queryProgramEntry(plan, entry), output: portableValueSchema(checked.output) }; +} diff --git a/src/query/compile.ts b/src/query/compile.ts index d9e0d49..6711e72 100644 --- a/src/query/compile.ts +++ b/src/query/compile.ts @@ -66,7 +66,8 @@ const fail = (code: string, message: string, node?: ASTNode): never => { ); }; -/** Only immutable repository sources call this. Runtime requests never compile documents. */ +/** Shared checker for authored queries and bounded public query documents. + * Runtime execution receives its checked IR, never an unchecked document. */ export async function compileQuery( declaration: QueryDeclaration, interfaces: readonly InterfaceRevision[], diff --git a/src/query/link.ts b/src/query/link.ts index 9731000..f6684ca 100644 --- a/src/query/link.ts +++ b/src/query/link.ts @@ -32,14 +32,28 @@ export interface LinkedQuery { } /** Link every possible implementation, including atoms absent from today's data. */ -export function linkQueries(workspace: WorkspaceRevision): LinkedQuery[] { +export function linkQueries( + workspace: WorkspaceRevision, + additional: readonly { + packageRevisionId: string; + checked: CheckedQuery; + }[] = [], +): LinkedQuery[] { const interfaces = new Map(workspace.interfaceImports.map((entry) => [entry.revisionId, entry])); const attachments = [ ...workspace.sharedAttachments, ...workspace.conformances.flatMap((entry) => entry.privateAttachments), ]; const linked: LinkedQuery[] = []; - for (const pkg of workspace.packageImports) + for (const pkg of [ + ...workspace.packageImports, + ...additional.map(({ packageRevisionId, checked }) => ({ + revisionId: packageRevisionId, + displayName: "Public query", + queries: [checked.declaration], + checkedQueries: [checked], + })), + ]) for (const declaration of pkg.queries ?? []) { const checked = pkg.checkedQueries?.find((query) => query.declaration.id === declaration.id); if (!checked || JSON.stringify(checked.declaration) !== JSON.stringify(declaration)) diff --git a/src/query/types.ts b/src/query/types.ts index 2afa27e..cfa096c 100644 --- a/src/query/types.ts +++ b/src/query/types.ts @@ -97,7 +97,8 @@ export interface CheckedQuery { fragmentContracts?: Record>; declaration: QueryDeclaration; definitionDigest: string; - /** Fixed, validated document: never supplied by runtime callers. */ + /** Fixed, validated document. Execution always uses checked IR; public runtime + * documents pass through this same checker before they are executed. */ document: string; schema: string; variables: ValueType; From 61edac68a8cbb20805c74cd7406ad20687ffbfed Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Thu, 1 Oct 2026 19:46:44 -0700 Subject: [PATCH 91/91] Expose checked graph transactions, Agent CLI and bounded evaluation --- src/execution-world/query-document.ts | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/execution-world/query-document.ts b/src/execution-world/query-document.ts index 08509d1..a897ab8 100644 --- a/src/execution-world/query-document.ts +++ b/src/execution-world/query-document.ts @@ -12,6 +12,7 @@ export interface QueryDocument { readonly document: string; readonly operation: string; readonly objectRoot: boolean; + readonly views?: readonly { readonly atom: string; readonly interface: string }[]; } /** Runtime query documents use the same language, nominal contracts, linking * and interpreter as packaged queries. They introduce no resources or code. */ @@ -27,6 +28,21 @@ export async function compilePublicQuery(plan: ExecutionPlan, request: QueryDocu ) throw Error("QUERY_DOCUMENT_LIMIT"); const id = "public-query:" + hexDigest(request); + const views = request.views ?? []; + if (!Array.isArray(views) || views.length > 16 || new Set(views.map((v) => v.atom)).size !== views.length) + throw Error("QUERY_VIEW_LIMIT"); + for (const view of views) { + if ( + !view || + Object.keys(view).sort().join(",") !== "atom,interface" || + typeof view.atom !== "string" || + typeof view.interface !== "string" || + view.atom.length > 2048 || + view.interface.length > 2048 || + !plan.definition.workspace.interfaceImports.some((i) => i.revisionId === view.interface) + ) + throw Error("QUERY_VIEW_INVALID"); + } const checked = await compileQuery( { id, @@ -38,7 +54,10 @@ export async function compilePublicQuery(plan: ExecutionPlan, request: QueryDocu document: "request.graphql", operation: request.operation, fragments: [], - views: [], + views: views.map((view) => ({ + atomId: capabilityId.atom(view.atom), + interfaceRevisionId: capabilityId.interfaceRevision(view.interface), + })), allowances: [], watch: false, budgets: {